2015年2月26日木曜日

サルでも分かるgit入門がわからない

有名サイト、サルでも分かるGit入門

これ、なんか微妙にわかりにくい!というわけで、まとめます!

Xcodeについてと、コマンドについて!絡めながら行きます。Xcodeのgitは直感的で楽ですが、エラーに対処しにくいので、2つあったほうがいいかと思います。

git cloneとかはおいといて、とりあえず、pushすることを考えて、pushできるように、書きます。内容的には不十分ですが、とりあえずpushできるようになることを目標に・・・


<用語説明>
リポジトリ=履歴を管理する、プロジェクトのうち変化する部分

ブランチ=枝。とりあえずmasterしか考えなくてよい!mergeとかはおいておこう!

ワークツリー=ローカルでの作業ファイル全体

ローカルリポジトリ=PCにあるリポジトリ
リモートリポジトリ=サーバー上にあるリポジトリ。GitHubが有名。

コミット=コメントとともに、インデックスに追加されたファイルの変更履歴を保存します。(ここまではローカルで実行できる)

インデックス=gitの監視下したいファイル群

プッシュ=リモートリポジトリに今までのコミットをすべて送信すること(同期みたいな)
プル=リモートリポジトリからコミット内容をダウンロードすること

<gitの目的>
まず、ファイルの変更履歴を管理できます。どこを書き換えて動かなくなったのか、みたいなことを調べることができます。

また、複数人で同じプロジェクトについて作業するのに使います。

ローカルリポジトリは適宜コミットし、いざというときにプッシュします。プッシュすると、ローカルで溜まっていたコミット履歴が一気にリモートリポジトリへ送られます。

最近はそれだけでなく、自分の能力のアピールにも、つまり、今までどんなプログラムを書いてきたかの紹介に使われていることが多い気がします。

とりあえず、リモートにファイルを置くときの大まかな流れは、
空のリモートリポジトリ作成する
ローカルでリポジトリ作成する→リモートリポジトリを登録する。
→ファイルをインデックスに追加→コミット→↓→プッシュ→↓
↑←←←←←←←←←←←←←←←←←←←←←←←←←←←←

です!


<ローカルでのGitリポジトリ〜Xcodeを絡めながら〜>
gitリポジトリを作成するコマンドは、
git init
です。
Xcode 6以降で新規プロジェクトを作成し、ファイルの保存場所を指定するとき、"Create git repository on MyMac"にチェックを入れておくと、自動的にgitのrepositoryを作成してくれます。


次に、XcodeのSource Control→Commitを押した時の画面について!
git add file.swift
これでfile.swiftというファイルがインデックスに登録されます。つまり、次のCommitからは、gitの監視下に含まれるようになります。複数ファイルを追加したい場合、
git add file.swift file2.swift file3.swift
のようにかけます。これはXcodeでいうチェックを入れる操作に当たります。
そして
git commit
これでコミット!変更履歴がgit repositoryに保存されます。

git add -u
git commit
上のコマンドは、直前のコミットから変更があったファイルをaddする命令です。コミットに必要なファイルが追加されていない場合、こればかり実行していればよいです。

Xcodeでも、ここまではCommitボタン押すだけなので、難なくクリアできます。

※Commitの時に、必ずメッセージを添える必要があります。Xcodeでれば、下のボックスに入れます。コマンドからの時は、vimが起動するので、iでinsertモードに→適当に入力→Escでコマンドモード→:wq(保存して終了のコマンド)を入力してEnter、これでOKです。

補足
git rm file.swift
ファイルを削除するとき、普通に削除だけすると、gitの監視下に置かれたファイルがないという状況になり、よくないです。そこで、git rmコマンドが存在します。これを使うと、rmoveすることができます。後ろに--cachedオプションをつけると、ファイルを残したまま、インデックスからのみ削除することができます。
git mvコマンドも同様に使うことができます。



<Remoteにも拡張しよう>
まずは、GitHubのアカウントを取りましょう!特に苦労せず取れます!

リモートリポジトリを作成するときは、GitHubのサイト上で作成します。
作成した後は、何もさわらないでおきます。SSHの方のURLをコピーしておきます。

これに対して、
git remote add origin git@github.com:***/*****.git
を実行します。後ろの部分は先ほどコピーしたURLを使います。
これで、remoteリポジトリとして上のアドレスに示されるリポジトリが登録されます。
Xcodeの場合は、Source Control→(ファイル名)-master→Configure (ファイル名)
からRemotesを選び、左下の+ボタンから追加する操作に当たります。
ここでのoriginは名前なので、なんでもいいです。

git remote
これでリモートリポジトリに登録されたものの一覧を取得できます。Xcodeの先ほどのRemotesの画面と同様です。

最後は
git pull origin master
でプッシュ

エラーがなければ、Gitのページを見に行ってみましょう!ファイルが入ってれば成功です!

※先にリポジトリを編集していると、pushの時にこういうエラーが出ます。
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:***/****.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

もしくは、
Working copy out of date.
(別の方法/人からのプッシュがあったために、競合が発生している状態です)

この場合、競合を解決する必要があります。そのため、まずプル。そしてマージ(プログラムを合わせる)
git pull origin master
を実行します。これで、リモートリポジトリoriginのmasterブランチをプルできます。
競合のあった場合は、慎重にマージしましょう。自分一人しか変更してない場合は、たいてい気にしなくて大丈夫です
その後pushすれば問題なく成功するかと思います。

画像がなすぎるのであとで追加します・・・

少しはわかるでしょうか・・・

ちなみに、僕のGitHubのアカウントです。
https://github.com/ha1fha1f
大したコード上げてないというか、混沌としていますが、もっと整理して、たまにはコード上げたいと思っています
(APIキーなどをいちいち消したファイルをつくるのが億劫で、上げないことが多い……)

2015年2月24日火曜日

だれでもできる!テーマCSS編集(Wordpress)

だれでもできる!と書きましたが、先に注意点。

間違えたらサイトに接続できなくなります

なので、バックアップを取るなどして、対策をしてから編集しましょう。style.cssは弄る前に、バックアップをとっておきます。

ここでは、CSSの知識がない状態でもテーマの見栄えとか印象とかを変える方法について説明します。具体的には、配色フォントです。

Wordpressのメニューの外観>テーマの編集、をクリックすると、テーマのstyle.cssをいじることができます。

style.cssはキャッシュに保存されていることが多いので、編集した後にサイトを読み込むときは、ブラウザのキャッシュを削除してから再接続しないと反映されません。

<配色について>

配色、たぶんテーマはいい感じのカラー配分にはしてあります。なので、個人的には、明るさを変えずに色相だけ変えればいいんじゃないかな?と思います。
その場合、
RGBとHSV・HSBの相互変換ツール
が便利です。

もっとこだわる場合、

ノンデザイナーこそ押さえておきたい! 配色・レイアウトの基礎が学べる7個の厳選スライド

で紹介されているスライドを読むと参考になるかとおもいます。

さて、CSSでカラーが指定されてる部分は、#FFFであったり、#1d1d1dであったりする部分です。(カラーコード)

まず、色一覧を書き出します。ブラウザのCtrl + Fで"#"を入力し、検索して次、次、と押していき、知らない値が出たらメモっていきます。
おそらく、同じ色指定がいくつも出てきて、最終的に5色ぐらいになるんじゃないかな?と思います。この内、#FFFや#FFFFFFは白色、#000は黒色を示します。

基本的には、それぞれの色を任意の色に置き換えていく作業になります。色ごとに、検索して置き換え、検索して置き換えを繰り返すと、配色を変えることができます。


<フォントについて>

フォントは、font-family:という項目で指定されています。これも同様に検索して、後ろの""で囲まれた部分を変更していきます。

これもそれぞれ置き換えれば良いです。全部同じフォントにするならそれはそれで楽ですね。

以上です。

2015年2月14日土曜日

Tweepy+Pythonによるユーザーストリーム〜pip, tweepyのインストールから〜(Mac)

Tweepy+PythonによるTwitterのStream

REST APIStreaming APIがあります。
REST APIは取得回数に制限があり、リアルタイムに更新するような動作はできません。そこで、Streaming APIを用いると、The WorldやYorufukurouみたいに、制限をあまりきにすることもなくリアルタイムにツイートを取得できます。

REST APIについては、
Qiitaー「Python で Twitter API にアクセス」
こちらのサイトがとてもわかり易いです。
ツイートの投稿検索タイムライン取得などの操作ができます。

以下、Streaming APIについて。

まず、インストールから。
Tweepyを入れようとしたら、
ImportError: No module named pip.req
と言われ、何のことかと思えば、pipを入れてないからですね

ターミナルで
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
これでpipがインストールできます。
こちらを参考にしました)

よって、
easy_install tweepy
これが実行できるようになり、tweepyがインストールできます
sudo pip install tweepy
でもよいです。

そしてtweepyでの開発へ。
を参考にしました。特にデータの表示部分、日本時間への変換、エラー対処です。

Public Streamingのコマンドは
が参考にになります

*ユーザーストリーム
# coding: utf-8
#はるふ's innovation!
import tweepy
from datetime import timedelta

CK = ''                             # Consumer Key
CS = ''         # Consumer Secret
AT = '' # Access Token
AS = ''         # Accesss Token Secert

class Listener(tweepy.StreamListener):
    def on_status(self, status):
        status.created_at += timedelta(hours=9)#世界標準時から日本時間に
        
        print('------------------------------')
        print(status.text)
        print(u"{name}({screen}) {created} via {src}\n".format(
                                                               name=status.author.name, screen=status.author.screen_name,
                                                               created=status.created_at, src=status.source))
        return True
    
    def on_error(self, status_code):
        print('Got an error with status code: ' + str(status_code))
        return True
    
    def on_timeout(self):
        print('Timeout...')
        return True

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

listener = Listener()
stream = tweepy.Stream(auth, listener)
stream.userstream()

表示部分はめじろさんのコードほとんどそのままです…
return Trueをすると、timeoutが発生しても終了しなくなります

* 検索ワードをストリームで流す(Public Streaming)
stream.filter(track=['検索ワード'])
最後のstream.userstream()をこれに書き換えるだけです

ただし、こちらを参照してください。
Kimux.Netー「[Python]twitterのstreaming APIは日本語によるフィルタリングが未対応。」
調べたところ、完全に未対応というわけではありませんが、単語がスペースなどで独立している場合は検索可能なようです。よって、ハッシュタグや英単語は検索できそうですが、日本語の文章の内部の検索は無理そうです(REST APIを使うしか・・・)

同じ部分を、
stream.sample()
とすると、全世界のツイートの断片が拾われ続けます。すごいスピードで流れて、ある意味楽しいです


ちなみに、ストリームを終了するときはControl + Cで割り込みを発生させると終了させることができます(正しいかどうかはわからない)


2015年2月13日金曜日

PHPでのTwitterOAuth

PHPでのTwitterOAuthについて、ネットを見ていると変な記事ばかりなので、少しまとめます。(もしかしたら仕様が変わっただけかもしれません)


ここでは、Consumer Key(API Key), Consumer Secret, Access Token, Access Token Secretの取得方法については、省略します。

Twitterを使ったアプリケーションを作るときにさけて通れないのが、OAuth認証です。この部分について、PHP用にライブラリを作った方がいます。

それをGitHubにアップロードされているので、
GitHub - abraham/twitteroauth
こちらを利用させていただきます。右端のDownload-zipからダウンロードできます。

これがまるでTwitter APIそのものであるかのような説明がなされているブログが散見されますが、OAuth認証はTwitter以外でも使われている認証方法であり、OAuth認証の部分とTwitter APIとのあたりをabrahamさんがライブラリ化して、出来上がったのがこれです。

GitHubの中身をよく見ると、ドキュメントをここで公開されているので、概ねこの方法に従った方法を、簡単に説明します。

まずsample.phpと同じフォルダに、"autoload.php"および"src"フォルダを中身ごと、保存しておきます。
そして、"sample.php"の中身は
  <?php
//はるふ's innovation!
  require_once(dirname(__FILE__)."/autoload.php");
  use Abraham\TwitterOAuth\TwitterOAuth;

  $consumer_key = "";// Consumer keyの値
  $consumer_secret = "";// Consumer secretの値
  $access_token = "";// Access Tokenの値
  $access_token_secret = "";// Access Token Secretの値

  // OAuthオブジェクト生成
  $twiter = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);

  $user = '_ha1f';

  $tweets = $twitter->get('statuses/user_timeline', array('screen_name' => $user));

  foreach ($tweets as $i => $tweet) {
    echo "$i: $tweet->text" . PHP_EOL;
  }
こうします。もちろん、4つのキーはすべて値を入れておいてください。(文字列として)

require_once(dirname(__FILE__)."/autoload.php");
で同じフォルダにある"autoload.php"をrequireしています。

これで僕のTLが表示されるかと思います。一部ファイルのみをコピーしてOAuth部分だけ利用する方法が紹介されているブログもありますが、おそらくこれが作者の意向にあった使い方かと思います。

ちなみにget関数に渡しているURLは、URLから前の部分
"https://api.twitter.com/1.1/"と、最後の".json"を省いたものです。
つまり、検索結果をgetしたいときには、
$timeline = $twitter->get('search/tweets', array('count' => '100', 'lang' => 'ja', 'q' => 'はるふ exclude:replies exclude:retweets'));
$tweets = $timeline->statuses;
とすればよいです。

Apacheの設定で失敗した時


Webアプリケーションを開発するときなど、ローカルで実行できる環境があれば、毎回サーバーに送る必要なくデバッグできて、編集→デバッグのサイクルが早くなり、効率がいいです。

Macであれば標準搭載のApache 2を使うことが多いかと思いますが、設定に失敗した時、とてもつらいです。よくわからぬままhttpd.confなどを編集すると、戻らなくなって、何もできなくなってしまいます。そうなった時の対処法(初期化の仕方)について。

まず、Apacheのの設定ファイルは、/private/etc/apache2/に格納されています。

よって、ターミナルから、
cd /private/etc/apache2/
ls
で中身を見ると、おそらくhttpd.confがあるかと思います。また、extra(フォルダ)もあるかと思います。

で、実は、これらにはバックアップファイルが用意されています。originalフォルダの中身を見てみると、httpd.confとextra(フォルダ)が存在します。この中身を必要に応じてコピーしましょう。すなわち、(上のコマンドの実行後、)
sudo cp original/httpd.conf httpd.conf
他のファイルについても同様です。書き換えたと思うファイルをoriginalの中身のファイルで書き換えましょう。(originalの内部を荒らしたら終わりです) 最後は
sudo apachectl restart
でApacheを再起動

これで設定書き換える前の状態に戻り、ブラウザでhttp://localhostをみると、It Works!が表示されるかと思います。

検索用↓
httpd: Syntax error on line 58 of /private/etc/apache2/httpd.conf: Cannot load libexec/apache2/mod_authn_default.so into server: dlopen(/usr/libexec/apache2/mod_authn_default.so, 10): image not found
com.apple.xpc.launchd[1]: (org.apache.httpd[670]) Service exited with abnormal code: 1

2015年2月12日木曜日

文字列の分割(.split())について

PythonやSwiftでの文字列操作ですごく便利なのが
.split()
です。

引数を省略した場合は' '(スペース)で区切られるかと思います。しかし、web上のファイルは'\t'(タブ)で区切られていることが多いです。CSVファイルであれば','で読みます。

ここで、複数の種類の文字で分割するにはどうすればよいか。

解決法は、2つあります。ひとつは正規表現(reモジュール)を使うこと、もうひとつは、文字列を先に.replace()しておくことです。分割しようと思ってる部分なので、問題はないはずです。

正規表現は便利ですが、忙しい時などは、後者の方法のほうが手軽に書けます。前者のドキュメントはどこにでもあるので、後者について書きます。

つまり、文字列変数stringをタブ、スペース、コンマの全てで区切りたいときは、
string.replace('\t',' ')
string.replace(',',' ')
list = string.split()
こうすればできます

非常に簡単なので、よく使います・・・

2015年2月9日月曜日

階乗、組み合わせ、順列、絶対値

プログラムでの階乗、組み合わせ、順列の求め方について。 階上はそのままですが、組み合わせや順列は公式通りに階乗から計算しようとすると、計算途中にオーバーフローする可能性が高くなり、あまり好ましくないです。そのため、漸化式を用いて記述することが多いです。以下Cでのサンプルコード。
long kai(int n){//nの階乗
    long p=1;
    int i;
    for(i=2;i<=n;i++){
        p=p*i;
    }
    return p;
}

long pof(int n, int r){//nのr乗
    int i;
    long p=1;
    
    for (i=0 ; i < r ; i++){
        p=p*n;
    }
    return p;
}

long combi(int n, int r){//nCr
    int i;
    long p=1;
    
    for (i=1;i <= r;i++){
        p=p*(n-i+1)/i;
    }
    return p;
}

long perm(int n, int r){//nPr
    int i;
    long p=1;
    
    for (i=1;i<=r;i++){
        p=p*(n-i+1);
    }
    return p;
}
再帰関数を使っても実装できるかもしれませんが、こちらのほうがわかりやすいので。これより高速なコードは存在しますが、簡単なのを書きました。

べき乗については、繰り返し2乗法というアルゴリズムが存在します。nのr乗を、n, nの2乗, 4乗, 8乗, ……に分解して高速化する方法です。



ところで、絶対値について、絶対値を求める関数absは標準で用意されています。 普通人間が絶対値を計算したいとき、ifで場合分けして〜というコードを書きそうですが、実は、2進数のビット演算のみで、三行で構成されています。高速にできている… Cなどの言語はコンパイル作業によって最適化されます。DebugをReleaseにすると更に最適化されます。 アーキテクチャまで考えられたプログラムを書けるようになりたい・・・

2015年2月8日日曜日

Pythonの文字列の切り出し(スライス)について

Pythonにおいては、
string = 'abcdef'
print string[0:2]
のようにすると、0,1文字目(ab)を切り出す事ができます。よく使うのはこの形ですが、3つ目の引数(?)を指定することができます。

string[i:j:k]
であるとき、
iは読み出し開始位置(含む)、
jは読み出し終了位置(含まない)、
kはステップ
を意味します。

ステップを負の数にすると、逆順の文字を作ることができます。また、iやjを負数にすると、右から何文字目かを表すことができます。
よって、読み出されるのは i, i+k, i+2k, i+3k, …(< or > j)ということになります。 

また、各パラメータ省略することができます。(string[::]ならそのまま)
 iを省略した場合は、左端(if ステップ>0)or右端(if ステップ<0)、左端の次(if ステップ<0)

string = 'abcdef'
print string[::]#そのまま(abcdef)
print string[::-1]#逆順(fedcba)
print string[:4]#左端から4文字目まで(abcd)
print string[-3::-1]#右端から3文字目から左端まで逆順(dcba)

あるプログラムの問題をといてる時にこんがらがったのでまとめました・・・