2015年8月16日日曜日

ナガシマリゾートの料金システム

ナガシマリゾートの料金システムについて、箇条書き
(2015/8/16時点でのデータ)


プールに入るにも、入場券を買う必要がある


<前売り券>

入場券
1600円、1000円(15:00〜)、800円(19:00〜)

入場+乗り放題
4500円、3200円(15:00〜)

入場+プール
3300円

入場+プール+乗り放題
5900円

温泉(これは入場は不要だが、入場していると割引がある)
700円(入場済みの人)
2100円、1500円(15:00〜)、1000円(19:00〜)

バス付きチケット(名古屋駅だとセットで割引がある)
少し下を参照してください


<入場後>

のりもの乗り放題のみ
3800円、2800円(15:00〜)

プールのみ
2600円


※2日券などはない
※障害者向けの割引は別である
※オフィシャルホテル利用者は別の割引がある(前売りを買ってはいけない)


<交通について>

*バス
桑名〜長島温泉   530円
名古屋〜長島温泉  1060円
名古屋〜長島温泉×2+温泉 3380円
名古屋〜長島温泉×2+乗り放題 6200円

※桑名駅往復とのセット販売はない

*JR
桑名〜名古屋   350円

つまり
桑名〜名古屋+名古屋〜長島温泉×2+温泉=3730円
>桑名〜長島温泉+温泉+長島温泉〜名古屋=3690円

詳しくは→http://www.meitetsu-bus.co.jp/express/nagashimaonsen/

花火の日は名古屋までのバスは早々に終了するが、桑名駅までのバスは最終便として22:05が増発される


<ホテルについて>

ナガシマリゾート周辺は何もない
ホテルは名古屋駅周辺か、桑名駅周辺

名古屋からはバスで50min
桑名からはバスで20min



2015年5月15日金曜日

Androidアプリの背景を透明に

Androidで画面が透過されたActivityを作るには、AndroidManifest中の、該当activityの設定に
android:theme="@android:style/Theme.Translucent"
または、
android:theme="@android:style/Theme.Translucent.NoTitleBar"
を追加します。

一瞬たりとも黒い画面になることなく、できます。

これ、すごい面白いことできそう

UIの必要ないActivityを作るのにも使えそうですし、普通にその上に文字とか書いても面白そう

参考:
http://www.adakoda.com/android/000265.html

2015年5月12日火曜日

AndroidのBitmap+Matrixの回転の中心は何処?

Android Studioでの開発は、クールではないですが、Android SDKに関するドキュメントはとても体系的にまとめられており、わかりやすいです。
で、それを読んだにも関わらずはまったこと。
Matrix matrix = new Matrix();
matrix.setRotate(45, bitmap.getWidth()/2,bitmap.getHeight()/2);
canvas.setMatrix(matrix);
canvas.drawBitmap(bitmap, width-bitmap.getWidth(), height-bitmap.getHeight(), null)
を実行した時、matrixがいつかけられるのかという話。

開発している時、ずっとmatrixをかけてから描画するものだと思い、回転の中心を画像の中心のつもりで値を設定していました。 それにも関わらず、回転しかさせていないのに何故か移動する! 不思議すぎて不思議すぎて悩んでいると、なんと描画してから回転のようで、回転の中心を画面全体の絶対座標にするとちゃんとできました・・・

これで解決!

2015年4月18日土曜日

FabricでTwitter with Swift(iPhone)

Fabricを使って、Twitterクライアントを作る方法(Swift)



いろいろフレームワークがしてくれて楽なのですが、まだまだ未完成のようで、あまり機能がありません・・・
また、公式ドキュメントも一部Objective-Cしかなく、頼りないです。

ただし、セルの高さの計算・アイコン画像の非同期受信などはすべて自動で行ってくれます。ログインボタンもとても簡単に実装することができます。


Qiitaー[iOS]FabricでTwitterクライアントを作った
このページがとてもわかり易いです。Fabricの適用方法などはこちらを参照してください。

このページのTwitterAPI.swiftを拡張して、サーチ・投稿・IDによるツイートの取得の関数を追加しました。

GitHub上に公開しています。
https://github.com/ha1fha1f/Lit_final/blob/master/TwitterAPI.swift

以下、上のAPIを用いたデータの保持・取得を行うクラスの例です。(2015/4/17現在)

import Foundation
import TwitterKit

class TweetDataModel :NSObject{
    
    var tweets:[TWTRTweet]
    
    // initialize
    override init() {
        self.tweets = []
    }
    
    func fetchTimeline(maxid:String?){
        TwitterAPI.getHomeTimeline({
            twttrs in
            
            println("fetch")
            
            if self.tweets.count == 0 {
                self.tweets = twttrs
            }else{
                let tmptweets:[TWTRTweet]
                
                if twttrs[0].tweetID > self.tweets.last?.tweetID {//新しいツイートがある
                    tmptweets = reverse(twttrs)
                }else{
                    //if twttrs.last?.tweetID < self.tweets[0].tweetID{//古いツイートがある
                    tmptweets=twttrs
                }
            
                for tweetCell in tmptweets {
                    if tweetCell.tweetID > self.tweets[0].tweetID {//新ツイートを上に追加
                        self.tweets.insert(tweetCell,atIndex: 0)
                    }else if tweetCell.tweetID < self.tweets.last?.tweetID {//古いツイートを下に追加
                        self.tweets.append(tweetCell)
                    }
                }
            }
            println("finish")

            //notificationを送る
            NSNotificationCenter.defaultCenter().postNotificationName("tweetLoaded", object: nil)
            
            },
            maxid: maxid,
            count: "40",
            error: {error in println(error.localizedDescription)})
    }
}
ご参考までに。
これは.Darkのテーマでの表示です!

セルのテーマカラーは二種類用意されています。.Darkと.Lightです。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! OriginalTweetTableViewCell
        
        println("\(indexPath.row)")
        
        if tweetData.tweets.count > indexPath.row {
            let tweet = tweetData.tweets[indexPath.row]
            cell.tag = indexPath.row
            cell.configureWithTweet(tweet)
            cell.tweetView.theme = .Dark
            cell.delegate = self
        }
        
        return cell
    }
のように、セルを返すときに、tweetView.themeを設定すればよいです。

僕の場合はTWTRTweetCellを継承したオリジナルのクラスを作ったのでやや異なりますが、設定方法などはだいたい同じです。
(https://github.com/ha1fha1f/Lit_final/blob/master/Litfinal/OriginalCell.swift)

雑になってしまいましたが、終わります

2015年4月17日金曜日

Swift(iPhone)での形態素解析〜NSLinguisticTagger〜

iPhoneにmecabのframeworkが搭載されているのは見えるが、公式のリファレンスがなく、使用することができない。

しかし、それ以外の(?)形態素解析を用いることができる。
iOS 5.1から搭載されているが、紹介記事が少ないので。

        var testString="iPhoneでも形態素解析を手軽に、だれでも行うことができます。ただし、日本語の場合、機能制限が多いです"
        let tagschemes = NSLinguisticTagger.availableTagSchemesForLanguage("ja")//取得するだけ
        let tagger = NSLinguisticTagger(tagSchemes: tagschemes,options: 0)//インスタンス作成
        let options: NSLinguisticTaggerOptions = .OmitWhitespace | .OmitPunctuation | .JoinNames
        tagger.string=testString//文字列をセット
        tagger.enumerateTagsInRange(NSMakeRange(0, (testString as NSString).length), scheme: NSLinguisticTagSchemeTokenType, options: options) {
            (tag, tokenRange, sentenceRange, _) in
            let token = (self.testString as NSString).substringWithRange(tokenRange)
            println("\(token): \(tag)")
        }
たったこれだけ。

NSLinguisticTagger.availableTagSchemesForLanguage で取得できるのは、使える機能のリストです。
日本語("ja")では[TokenType, Language, Script]
英語("en")では[TokenType,Language,Script,Lemma,LexicalClass,NameType,NameTypeOrLexicalClass]
が返ってきます。

一般的な形態素解析(品詞まで分解)はNSLinguisticTagSchemeLexicalClassです

日本語に対してできる最大限、NSLinguisticTagSchemeTokenTypeを行うと、文をトークンに分割したものを出力してくれます。"tag"は基本的に"Word"になっています。

何かに使えればいいな。

ただし、認識精度は非常に低いです。。。
token= 今日: Word
token= : Word
token= : Word
token= : Word
token= 天気: Word
token= です: Word
token= : Word
token= なんで: Word
token= : Word
token= : Word
token= : Word
token= 同じ: Word
token= 単語: Word
token= : Word
token= : Word
token= : Word
token= 認識: Word
token= : Word
token= : Word
token= ない: Word
token= : Word
token= じゃ: Word

mecabなら
今日はいい天気ですね
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
助詞,係助詞,*,*,*,*,は,ハ,ワ
いい 形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
助詞,終助詞,*,*,*,*,ね,ネ,ネ
EOS
なんで「いい」が同じ単語として認識されないんじゃ
なんで 副詞,一般,*,*,*,*,なんで,ナンデ,ナンデ
記号,括弧開,*,*,*,*,「,「,「
いい 形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
記号,括弧閉,*,*,*,*,」,」,」
助詞,格助詞,一般,*,*,*,が,ガ,ガ
同じ 連体詞,*,*,*,*,*,同じ,オナジ,オナジ
単語 名詞,一般,*,*,*,*,単語,タンゴ,タンゴ
として 助詞,格助詞,連語,*,*,*,として,トシテ,トシテ
認識 名詞,サ変接続,*,*,*,*,認識,ニンシキ,ニンシキ
動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
動詞,接尾,*,*,一段,未然形,れる,レ,レ
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
名詞,非自立,一般,*,*,*,ん,ン,ン
じゃ 助詞,副助詞,*,*,*,*,じゃ,ジャ,ジャ

EOS




参考URL:
http://nshipster.com/nslinguistictagger/
http://d.hatena.ne.jp/shu223/20130318/1363566717

2015年4月12日日曜日

Google Code Jam-Qualification Round 2015

昨日、行われていたので、とりあえず飛び入り参加しました!
Google Code Jam-Qualification Round 2015

ルール

  • 問題は全部で四問ある。4問それぞれにSmallデータセット、Largeデータセットの2つがあり、それぞれに配点がある。満点は100。
  • 同じ点数なら、最初に提出してからの時間+ペナルティ時間が短いほうの勝利。
  • 27時間の間にとくプログラムを作成する。
  • 各問題について、まずSmallのデータセットをダウンロードして、3分以内にそのデータセットに対する回答と、とくのに使ったプログラムを提出する。"InCorrect"に対しては4分のペナルティが課される。回答が"Rejected"(形式が違う)された場合は、再度提出できる。それ以外の場合、再提出はできない。
  • Smallのデータセットに対して"Correct"判定をもらうと、Largeのデータセットにチャレンジすることができる。チャンスは1回のみ、ダウンロードしてから8分以内に回答を提出できなければ"InCorrect"となる。ただし、8分の間は何度でも提出し直すことができるが、最後に提出したもののみ採点対象となる。得点は一時的に追加されるが、コンテスト終了後に採点される。
  • 20点以上獲得すればQualification Round突破

僕は、A-SL, B-SL, C-Sだけ解けました
C-Lも解けたのですが、対応に間に合わず、8分の間には提出できませんでした・・・

D問題、たまたま先日悩んで諦めた課題だったので、諦めました
代わりに(?)、こんなリンクを貼っておきます


以下、僕の回答です。

A問題:Standing Ovation

#coding:utf-8

fr=open("A-large.in","r")

output=""
ans=[]
casenum=0

count=0
for line in fr:
    if count==0:
        casenum=int(line)
    else:
        tmp=line.split()
        Smax=int(tmp[0])
        sumnum=0
        level=0
        tmpans=0
        for a in list(tmp[1]):
            number=int(a)
            lack=level-sumnum
            if lack <= 0:#ok
                sumnum=sumnum+number
            else:
                tmpans=tmpans+lack
                sumnum=sumnum+number+lack
            level=level+1
        ans.append(tmpans)
    count=count+1



for i in range(0,casenum):
    output=output+"Case #"+str(i+1)+": "+str(ans[i])+"\n"

fr.close()


fw=open("out.txt","w")
fw.write(output)
fw.close()




  • 前から順にシミュレーションして、足りない場合は不足としてカウントしました。

  • B問題:Infinite House of Pancakes

    #coding:utf-8
    
    #D人の客が、それぞれPi枚のパンケーキを持っている
    #他の客は何もない
    #一分に一枚食べる
    #specialtimeは誰も食べない、パンケーキ有りの客からその他の客へパンケーキが移る
    #できるだけ早くパンケーキをなくす
    
    
    #kに展開した時のかかる時間数
    simulate=lambda pan,k :sum([int((i-1)/k) for i in pan])+k
    
    fr=open("B-large.in","r")
    
    output=""
    ans=[]
    casenum=0
    
    count=0
    for line in fr:
        if count==0:
            casenum=int(line)
        else:
            if (count%2) == 0:#list
                tmpans=10000
                diners=list(map(int,line.split()))
                for i in range(1,max(diners)+1):
                    tmp=simulate(diners,i)
                    if tmpans>tmp:
                        tmpans=tmp
                ans.append(tmpans)
        count=count+1
    
    
    for i in range(0,casenum):
        output=output+"Case #"+str(i+1)+": "+str(ans[i])+"\n"
    
    fr.close()
    
    
    fw=open("out.txt","w")
    fw.write(output)
    fw.close()
    





  • まず気づかなければならないのは、できるだけ早く分散させておいたほうがいいこと。
  • kこづつに分散させるのに、どのkが最適かわからなかったので、各kに対して回数を計算し、最小のものを選択しました。これでも時間的には大丈夫です。

  • C問題:Dijkstra

    #coding:utf-8
    #四元数
    
    
    def multi(b,a):#a*b
        dic={"11":"1", "1i":"i", "1j":"j", "1k":"k","i1":"i", "ii":"-1","ij":"-k", "ik":"j","j1":"j", "ji":"k", "jj":"-1", "jk":"-i","k1":"k", "ki":"-j", "kj":"i", "kk":"-1"}
        sign=["","-"]
        signflag=0
        if a[0]=="-":
            signflag=signflag+1
            a=a[1]
        if b[0]=="-":
            signflag=signflag+1
            b=b[1]
        res=dic[a+b]
        if res[0]=="-":
            signflag=signflag+1
            res=res[1]
        return sign[signflag%2] + res
    
    def convert(tmpstring):
        tmpc=tmpstring[0]
        for c in tmpstring[1:]:
            tmpc=multi(tmpc,c)
        return tmpc
    
    def main():
        fr=open("C-large.in","r")
        output=""
        ans=[]
        casenum=0
        count=0
        for line in fr:
            if count==0:
                casenum=int(line)
            else:
                if (count%2) == 1:#繰り返し回数
                    repeatnum=int(line.split()[1])
                else:
                    print(len(ans))
                    tmpans=False
                    stringdata=line.replace("\n","")
                    rank=0
                    tmp="1"
                    converted=convert(stringdata)
                    for j in range(0,repeatnum):
                        #あとは残りがkであることを示すのみ
                        if rank == 2:
                            for fds in range(0,((repeatnum-j)%4)):
                                tmp=multi(tmp,converted)
                            break
                        #i,jすら見つからないのであきらめ
                        elif j>=9:
                           break
                        #とりまi,jを探しに行く
                        else:
                            for c in stringdata[0:]:
                                tmp=multi(tmp,c)
                                #ひとまずiを見つける、あればjを探す、
                                if rank==0:
                                    if tmp=="i":
                                        tmp="1"
                                        rank=1
                                elif rank==1:
                                    if tmp=="j":
                                        tmp="1"
                                        rank=2
    
                    if rank==2 and tmp=="k":
                        tmpans=True
    
                    if tmpans:
                        ans.append("YES")
                    else:
                        ans.append("NO")
            count=count+1
    
        for i in range(0,casenum):
            output=output+"Case #"+str(i+1)+": "+str(ans[i])+"\n"
    
        fr.close()
    
    
        fw=open("out.txt","w")
        fw.write(output)
        fw.close()
    
    main()
    • まず気づかなければならないのは、"1"と等価な部分は右に含めても左に含めてもいいこと。つまり、"ijk"と等価なら、"i111jk"と等価なとき、当然"i11jk"、"i1jk","ijk"と等価なので、左から順にiを見つけ、jを見つけ、残りがkであればよい。
    •  large突破のポイントはループ対策。1111もiiiiもkkkkもjjjjも、すべて"1"と等価。より、n回同じものをかける場合は、n%4回かけるだけでよい
    • Cython使おうとしましたがあまり変わりませんでした。

    以上です。

    2015年3月11日水曜日

    Node.jsをインストールしようとしたらmakeに失敗した+bleacon

    Node.jsをインストールしようと思い、調べてみると、nodebrewというのをつかってバージョン管理するといいらしい。というわけで、試してみました。

    brew install nodebrew
    
    

    次に

    nodebrew install latest
    
    

    これでいけるはずが、

    fetch: http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
    ######################################################################## 100.0%
    
      File "./configure", line 362
    
    
    
        '''
          ^
    
    
    
    エラーですね。進みません。

    試しに
    cd /.nodebrew/src/v0.12.0/node-v0.12.0
    make
    

    を実行するも、エラーばかり。

    ダメ元でconfigureを開いてみると、なんとpythonのコード!エラーのでている362行目を見に行く。

    print """〜〜〜〜〜""""
    

    なるほど。

    こういう部分すべてをprint("""〜〜""")になおしてもいけると思いますが、
    pyenv global 2.7.9
    にしてから

    nodebrew install latest
    
    
    を再度実行
    大量の文字が流れ、成功しました。

    後はパスを設定。

    cd
    vi .bashrc
    
    から
    export PATH="$HOME/.nodebrew/current/bin:$PATH"
    
    を最終行に追加して保存

    ターミナルを再起動して、
    node -v

    バージョンが表示されればOKです。

    npmコマンドも自動的に使えるようになっていますので、

    npm install bleacon
    

    みたいなこともできます。
    (このコマンドも、Python3でやるとエラーの山になります!Python2で実行してください!)

    nodebrewの詳しい使い方については→tavamy.blog-node.js 入れるなら nodebrew が超簡単

    2015年3月7日土曜日

    Pythonの再帰の深さの上限

    Pythonで再帰関数を使って、1000!を計算しようとすると、
    RuntimeError: maximum recursion depth exceeded in comparison
    
    こんなエラーが!
    再帰の深さに上限なんてあったのか・・・と調べてみると、デフォルトでは深さは1000までらしいです。
    python実行中に
    sys.getrecursionlimit()
    
    で取得できます。

    998!は計算出来ました。

    もっと使いたい場合は、コードに
    import sys
    sys.setrecursionlimit(10005)
    
    を追加しましょう! あくまで全体に対しての設定でなく、そのコードの実行に対しての設定です。これで10000!でも計算することができます。

    (Pythonはlongの範囲を越えるような大きな数の計算も自動的に行なってくれるので、楽です。)

    # coding: UTF-8
    
    import sys
    sys.setrecursionlimit(10005)
    
    def kai(n):
        if n==1: return 1
        return n*kai(n-1)
    
    num = 10000
    print(str(num) + "!=")
    print(kai(1,num))
    

    これを実行すると、
    10000!=
    28462596809170545189064132121198688901480514017027992307941799942744113400037644437729907867577847758158840621423175288300423399401535187390524211613827161748198241998275924182892597878981242531205946599625986706560161572036032397926328736717055741975962099479720346153698119897092611277500484198845410475544642442136573303076703628825803548967461117097369578603670191071512730587281041158640561281165385325968425825995584688146430425589836649317059251717204276597407446133400054194052462303436869154059404066227828248371512038322178644627183822923899638992827221879702459387693803094627332292570555459690027875282242544348021127559019169425429028916907219097083690539873747452483372899521802363282741217040268086769210451555840567172555372015852132829034279989818449313610640381489304499621599999359670892980190336998484404665419236258424947163178961192041233108268651071354516845540936033009607210346944377982349430780626069422302681885227592057029230843126188497606560742586279448827155956831533440534425446648416894580425709461673613187605234982286326452921529423479870603344290737158688499178932580691483168854251956006172372636323974420786924642956012306288720122652952964091508301336630982733806353972901506581822574295475894399765113865541208125788683704239208764484761569001264889271590706306409661628038784044485191643790807186112370622133415415065991843875961023926713276546986163657706626438638029848051952769536195259240930908614471907390768585755934786981720734372093104825475628567777694081564074962275254993384112809289637516990219870492405617531786346939798024619737079041868329931016554150742308393176878366923694849025999607729684293977427536263119825416681531891763234839190821000147178932184227805135181734921901146246875769835373441456013122615221391178759688367364087207937002992038279198038702372078039140312368997608152840306051116709484722224870389199993442071395836983063962232079115624044250808919914319837120445598344047556759489212101498152454543594285414390843564419984224855478532163624030098442855331829253154206551237079705816393460296247697010388742206441536626733715428700789122749340684336442889847100840641600093623935261248037975293343928764398316390312776450722479267851700826669598389526150759007349215197592659192708873202594066382118801988854748266048342256457705743973122259700671936061763513579529821794290797705327283267501488024443528681645026165662837546519006171873442260438919298506071515390031106684727360135816706437861756757439184376479658136100599638689552334648781746143243573224864326798481981458432703035895508420534788493364582482592033288089025782388233265770205248970937047210214248413342465268206806732314214483854074182139621846870108359582946965235632764870475718351616879235068366271743711915723361143070121120767608697851559721846485985918643641716850899625516820910793570231118518174775010804622585521314764897490660752877082897667514951009682329689732000622392888056658036140311285465929084078033974900664953205873164948093883816198658850827382468034897864757116679890423568018303504133875731972630897909435710687797301633918087868474943633533893373586906405848417828065196275826434429258058422212947649402948622670761832988229004072390403733168207417413251656688443079339447019208905620788387585342512820957359307018197708340163817638278562539516825426644614941044711579533262372815468794080423718587423026200264221822694188626212107297776657401018376182280136857586442185863011539843712299107010094061929413223202773193959467006713695377097897778118288242442920864816134179562017471831609687661043140497958198236445807368209404022211181530051433387076607063149616107771117448059552764348333385744040212757031851527298377435921878558552795591028664457917362007221858143309977294778923720717942857756271300923982397921957581197264742642878266682353915687857271620146192244266266708400765665625807109474398740110772811669918806268726626565583345665007890309050656074633078027158530817691223772813510584527326591626219647620571434880215630815259005343721141000303039242866457207328473481712034168186328968865048287367933398443971236735084527340196309427697652684170174990756947982757825835229994315633322107439131550124459005324702680312912392297979030417587823398622373535054642646913502503951009239286585108682088070662734733200354995720397086488066040929854607006339409885836349865466136727880748764700702458790118046518296111277090609016152022111461543158317669957060974618085359390400067892878548827850938637353703904049412684618991272871562655001270833039950257879931705431882752659225814948950746639976007316927310831735883056612614782997663188070063044632429112260691931278881566221591523270457695867512821990938942686601963904489718918597472925310322480210543841044325828472830584297804162405108110326914001900568784396341502696521048920272140232160234898588827371428695339681755106287470907473718188014223487248498558198439094651708364368994306189650243288353279667190184527620551085707626204244509623323204744707831190434499351442625501701771017379551124746159471731862701565571266295855125077711738338208419705893367323724453280456537178514960308802580284067847809414641838659226652806867978843250660537943046250287105104929347267471267499892634627358167146935060495110340755404658170393481046758485625967767959768299409334026387269378365320912287718077451152622642548771835461108886360843272806227776643097283879056728618036048633464893371439415250259459652501520959536157977135595794965729775650902694428088479761276664847003619648906043761934694270444070215317943583831051404915462608728486678750541674146731648999356381312866931427616863537305634586626957894568275065810235950814888778955073939365341937365700848318504475682215444067599203138077073539978036339267334549549296668759922530893898086430606532961793164029612492673080638031873912596151131890359351266480818568366770286537742390746582390910955517179770580797789289752490230737801753142680363914244720257728891784950078117889336629750436804214668197824272980697579391742229456683185815676816288797870624531246651727622758295493421483658868919299587402095696000243560305289829866386892076992834030549710266514322306125231915131843876903823706205399206933943716880466429711476743564486375026847698148853105354063328845062012173302630676481322931561043551941761050712449024873277273112091945865137493190965162497691657553812198566432207978666300398938660238607357858114394715872800893374165033792965832618436073133327526023605115524227228447251463863269369763762510196714380125691227784428426999440829152215904694437282498658085205186576292992775508833128672638418713277780874446643875352644733562441139447628780974650683952982108174967958836452273344694873793471790710064978236466016680572034297929207446822322848665839522211446859572858403863377278030227591530497865873919513650246274195899088374387331594287372029770620207120213038572175933211162413330422773742416353553587977065309647685886077301432778290328894795818404378858567772932094476778669357537460048142376741194182671636870481056911156215614357516290527351224350080604653668917458196549482608612260750293062761478813268955280736149022525819682815051033318132129659664958159030421238775645990973296728066683849166257949747922905361845563741034791430771561168650484292490281102992529678735298767829269040788778480262479222750735948405817439086251877946890045942060168605142772244486272469911146200149880662723538837809380628544384763053235070132028029488392008132135446450056134987017834271106158177289819290656498688081045562233703067254251277277330283498433595772575956224703707793387146593033088629699440318332665797514676502717346298883777397848218700718026741265997158728035440478432478674907127921672898523588486943546692255101337606377915164597254257116968477339951158998349081888281263984400505546210066988792614558214565319696909827253934515760408613476258778165867294410775358824162315779082538054746933540582469717674324523451498483027170396543887737637358191736582454273347490424262946011299881916563713847111849156915054768140411749801454265712394204425441028075806001388198650613759288539038922644322947990286482840099598675963580999112695367601527173086852756572147583507122298296529564917835071750835741362282545055620270969417476799259229774888627411314587676147531456895328093117052696486410187407673296986649236437382565475022816471926815559883196629848307776666840622314315884384910519058281816740764463033300119710293036455866594651869074475250837841987622990415911793682799760654186088721626654886492344391030923256910633775969739051781122764668486791736049404393703339351900609387268397299246478483727274770977466693599784857120156789000241947269220974984127323147401549980920381459821416481176357147801554231599667838534854486406936410556913531335231184053581348940938191821898694825383960989942822027599339635206217705343572073396250574216769465101608495601439303244304271576099527308684609204422226103154229984444802110098161333824827375218998738205315164927134498105950159974800571591912202154487748750103473246190633941303030892399411985006225902184164409988173214324422108554248620896250260604398180189026317781146617454999771440665232863846363847001655618153861098188111181734191305505024860345856755585637511729774299329074944236579668332700918367338977347901759248885660379952771540569083017311723894140326159612292912225191095948743805673381278538616491842786938417556898047100859868372033615175158097022566275200160956192229925401759878522038545913771783976389811198485803291048751666921195104514896677761598249468727420663437593207852618922687285527671324883267794152912839165407968344190239094803676688707838011367042753971396201424784935196735301444404037823526674437556740883025225745273806209980451233188102729012042997989005423126217968135237758041162511459175993279134176507292826762236897291960528289675223521425234217247841869317397460411877634604625637135309801590617736758715336803958559054827361876112151384673432884325090045645358186681905108731791346215730339540580987172013844377099279532797675531099381365840403556795731894141976511436325526270639743146526348120032720096755667701926242585057770617893798231096986788448546659527327061670308918277206432551919393673591346037757083193180845929565158875244597601729455720505595085929175506510115665075521635142318153548176884196032085050871496270494017684183980582594038182593986461260275954247433376226256287153916069025098985070798660621732200163593938611475394561406635675718526617031471453516753007499213865207768523824884600623735896608054951652406480547295869918694358811197833680141488078321213457152360124065922208508912956907835370576734671667863780908811283450395784812212101117250718383359083886187574661201317298217131072944737656265172310694884425498369514147383892477742320940207831200807235326288053906266018186050424938788677872495503255424284226596271050692646071767467502337805671893450110737377034119346113374033865364675136733661394731550211457104671161445253324850197901083431641989998414045044901130163759520675715567509485243580269104077637210998671624254795385312852889930956570729218673523216666097874989635362610529821472569482799996220825775840988458484250391189447608729685184983976367918242266571167166580157914500811657192200233759765317495922397884982814705506190689275625210462185661305800255607974609726715033327032310025274640428755556546883765838802543227403507431684278620637697054791726484378174446361520570933228587284315690756255569305558818822603590006739339952504379887470935079276181116276309771257983975996526612120317495882059435754883862282508401408885720583992400971219212548074097752974278775912566026443482713647231849125180866278708626116699989634812405803684794587364820124653663228889011636572270887757736152003450102268890189101673572058661410011723664762657835396364297819011647056170279631922332294228739309233330748258937626198997596530084135383241125899639629445129082802023225498936627506499530838925632246794695960669046906686292645006219740121782899872979704859021775060092893328957272392019589994471945147360850770400725717439318148461909406269545285030526341000565022226152309364882887122046454267700577148994335147162504252365173710266068647253458120186683273953682547456536553597546685788700056988360286686450740256993087483441094086086303707908295240576731684941855810482475304758923392801571302824106234999945932390521409856559565661346003396150515164758852742214732517999548977992849522746029855666700811871200856155016457400484170210303038996339253337466556817824410737409336919294104632307731994759826307383499600770372410446285414648704116273895649834555162165685114551383822047005483996671706246467566101291382048909121117229386244253158913066987462045587244806052829378148302622164542280421757760762365459828223070815503469404938317755053305094698999476119419231280721807216964378433313606760676965187138394338772485493689061845700572043696666465080734495814495966306246698679832872586300064215220210171813917325275173672262621454945468506006334692713838311715849753092643252486960220059099802663765386225463265168414963306369548086551101256757717890616694758344043486218485369591602172030456183497524162039926441331651884768606830642004858557924473340290142588876403712518642229016333691585063273727199596362912783344786218887871009533753551054688980236378263714926913289564339440899470121452134572117715657591451734895195016800621353927175419843876163543479806920886666227099512371706241924914282576453125769939735341673046864585181979668232015693792684926999983992413571941496882273704022820805171808003400480615261792013978945186295290558440703738300533552421153903385185829366779190610116306233673144419202893857201855569596330833615450290424822309297087124788002017383072060482680156675397593789931793515799958929562156307338416294599900276730832827716595064217966523190439250543226753731811755315476780739470338931185107297724318378972674957455778183345495942317353558291046967315391275975687281861691161083156337232639968881490543943261197182274996791176628553401860198315809629981791107208804992292016062059067271273599461871634945774995805337947187105456452579396024210259136415528398395201773012712514892051061708228008339985665786646920737114269682301770416324829479409558694699089379165191006305185352102345189798127619143061864362703081977124992751056732909481202057747100687703379708934229207183903744167503493818836342229284946790660285674293251642569044363473087656797056595677285291081242733154406580199802711579126254172797452862574865921933293805915239524735518887119860391319654287576290190503964083560246277534314409155642181729459941596061979622633242715863425977947348682074802021538734729707999753332987785531053820162169791880380753006334350766147737135939362651905222242528141084747045295688647757913502160922040348449149950778743107189655725492651282693489515795075486172341394610365176616750329948642244039659511882264981315925080185126386635308622223491094629059317829408195640484702456538305432056506924422671863255307640761872086780391711356363501269525091291020496042823232628996502758951052844368177415730941874894428065427561430975828127698124936993313028946670560414084308942231140912722238148470364341019630413630736771060038159590829746410114421358321042574358350220737173219745089035573187350445827238770728271406162997919629357224104477155051652535867544109395079218369015261138440382680054150924346511711436477899444553993653667727589565713987505542990824585609510036934663100673714708029927656933435500927189854050109917474979991554392031908961967615444686048175400695689471463928245383807010444181045506171305160584355817521032338465829201071030061124283407458607006060194830551364867021020364708470807422704371893706965688795617928713045224516842027402021966415605280335061293558739079393524404092584248380607177444609964035221891022961909032569042381374492494906892314330884224399631396391545854065286326468807581148748371408284176455226386313520264894016262494802388568231599102952620337126449279901938211134518446387544516391239377974190576649911764237637722282802318465738050121277809680315691477264910257503508758792248110223544524410872448565700755187132146592093548504552829170749596775404450779494836371756062326925757412813110241910373338080434325310884694831555729402265394972913817581338619457057799561808755951413644907613109617155928376585840036489374076822257523935988731081689667688287403837192827690431514106997678303819085690713091931340846019511147482766350724676534922040058626677632935516631939622498979912708004465982264899125226813124300528104995058595676527123591494442612554437618645029202881358582871789577224116380815161831603129728796987480139828621645629196153096358337313619724773332353025466571196902611237380629030242904275794549030022660847446513161741691916851746464945459696005330885252792083472495235473110674109099223541055506299687642153951249355986311346661725116890785633328935569150449485189113488301876365100638502565916433021928565596263914382895068324838727165616560111531517055222955765944972454788815532316417453267167978861141165355597588331979638070962998880767303616940317736448140427867784251232449974693421348217179595190698204602997172001174857303889719205597414742453011135869766256607770970225633261701108463784795555258504578058879440756064974127974530918418405207558526462208821483646754652237609210787539190454684852349759986044943322828073120679922402477507514105890774627334319091255451352225329275913842047384603056163154236552935312278389759446515787337343463172280001031380425481404022090580405056003860937403435068863081434683848900708938565050027569059678069404698435184535134141031615133683043714786642925389717165978629010728400758939700388317742648163725113277369926827709465342583596111881955092462062153978121197244762623771534452048069819082524943963962251113831177428978535825590832490480497516047104257569753442551515779815600370847230603484753977513688390404316017486248871339311818523029425425676202485688393970836748788453789172574145155917919035398535077200900594979352939459631213445503368260690059828717723533375221941915547303742062343262892968397015058892191112049249864792053410872349115430987182160055762209075732304626106597744947658346313025598636315029959672352476943975462530206788193304372284800209305354155640664838569378144603138697563459200233462606995955513484754147891180830329816421587452922952678937925647752029052675349356673744293182673374571642465407748267901046778759085408130531447176455869894169668940436489952465247443988349583871206296485413357553813419500498743813369062703973874586604296871595820715766599826607317005624465541763024501349159567288942619746144496908671655859782729228702723774835097362901019130417812735773037781804081589136005207315806941034305003184349342360269244733060013861119781774472669608928321052543116496033420102032603863672532889648333405862204843616575362001468405476649666473566979572953394809138263703324220930839366954980688240491622063147911494642042500022450413425558561937442905257252436320054487441524307305215070491020434076572476865095751174125413729531644521765577235348601821566833352520532830000108344008762266843817023235605645158256954177359197813649975559601912567744942717986360045847405209290089397315276024304951653864431388147876977541478757432610159879709758855625806766197973098472460769484821127948427976536607055051639104415022554420329721292033009353356687294595912327965886376486894188433640548494009574965791657687213927330153555097865114767947399690623184878377515462613823651665956337209345708208301840482797005728071432925727577436229587047361641609731817241594204270366066404089740245521530725227388637241859646455223673260411164598464020010216920823315155388821071527191267876531795071908204525100447821291318544054814494151867114207103693891129125012750853466337717749376016543454696390042711129829255096830420665725364279472200020835313883708781649957189717629338794854271276882652003766325924561614868744897471519366219275665852462114457407010675380427564184440834805203838265052601698584060084788422421887856927897751810442805474427229455167420335686460609977973124950433321425205053675790499520783597650415379001132579536040655172654879022173595444151139429231648950663177813039057462082449171921311864129633704661406456900178942356738775523130952785912774533241855442484484493664210731348819180640189222317302156645813473186449997905781662091469870718039388885781280740226363602294114354869871402143572055947730892808653678920201935102605361567924483276749476117858316071865710310842200560259545115191391309119544447844361032741876102338843391687589233423790859841968266525610628751237572318491474951945985728897934981791761822652480408237128109790772638864286067917082288575852703470839714561619926247844794692794996845945632382702297364173503430783194115698247820013290851202878474805860188960045901745974055630732714487679085288867978809970695240681006625611440014983413580889737246844064948857074167687916413224205373654067330186392497910915474785959163865597507090581175924899502214799250945635582514315814464060134283490422798357939659258985200763845646681640732681928346007767285876284900068874564639274964415904034033672337814491597032941787294155061054129515400159393851663929325677429557549480046658273579653990940233543644649376827272541873627547532976808190325336141086433084237771738995221536763095302045902438694632702895293994483013577589081214884558493819874505920914067209522469096263076941753340983698859363700314973728977996360018626500174929290087931189997822963712306642297996163582572600112288983647651418045975770042120833949364659647336464289044499325396227091907373705772051322815957863227591912786054297862953188615559804728160710864132803585400160055575686855791785977899197902656592621283007225351401525973569300729015392211116868504740402172174442051738000251361000494534119324331668344243125963098812396962202358858395587831685194833126653577353244379935683215269177042249034574534858913812582681366908929476809052635560638119661306063936938411817713545929884317232912236262458868394202889981693561169865429884776513118227662526739978808816010470651542335015671353744817086234314662531190291040152262927104099285072418843329007277794754111637552176563589316326636049381218401837512818884771168975479483767664084842753623074019542183217985496260666590347925816342392670947839907062923166535037285019751324813803837070894638925470887039085723581006130628646664710006104352115778926613432214655311411882596942926284522109026688414975763341554921135581254616558078273470115814006008345762133130389987843270653719956709570847385786092649188858378739239165554263577301292243641604062551736892335636568854365851646207821875741724364525814143487632761341752707376754922276287782264765154315341585713773522730335403376364204258034257264749686217823666951353410677378421131371131987373222891805275062812277716412494412401207125954319991746574745892582613712825555535080404143944557295994554635608487251339462936358940832098964801619583130429720964794128539388996265368928263807677168759588502216464582430940165009688797366157733560316836710386895228270941509545222744002735499253670214715994056544813842186380128799900820933576320736369405991424263718294000613741900579513096298545330748197802568301089672873802234820488862973130369689882640657904781562389778485365025691064231795736025330908763271784911189748432246868086340383964176127605788646574472284824932687443062551220506955168464669477183681911432873544815836350548146411099960143390595799766290646881295025039150923633011076070632863317393378149693380247580035052789782755750928604039420506342939327064636161031822879248152679306862749237275631852225654266008556849497720285909150930495425967473648331437236349555448901598668408362176913559656039519670425368863482369587129462524759031776813184977588276576740482558136502103649585505703259219957675334264223783723586058509403583977103476670644788640831109650302565215607464019652716999732373465237173456595514559493098166644006211599349133180135150528651842178828026343325934755850761168697709125580056185683710540856081249519403148064618719402577663285267019698387567561524696759028106864896869293315954352097687527137201616160931174250199709289684940034696242325688410665113304377412256176258658941236728171145526423894512631717834790276921171452887352955019336759218908006048633737786728180610254782570436788449503518925787499836694785908612975543084122677060954347612133717433156783790162012337237023338316414706428592185977610158232721997915062871868186750981665537745013020880333904353639770263363809098526494532628146558065546504823486429495390613257400496912888340518222933644476683855037967975809619983575807027759535968788226194659612223044549275600274955168583542582295336042834426318478068825395450746691877897765406038432512843812811316856204608617289408229658626174420766920297427930088129519854678713548623236610413216581279267151545961594352593456757445992307889205519540082316409719591250025455237503106735639748835542480449681383030671851931491335789202123605308199952020584503423499932150962634977812456658304680581824563524814625849331926195406884818446445248429486063016169476663242625231476322371109695369483824482316410396224507675405614287468267835723704895606990652792688455844512046654853378534026646645042339638488257719874953611300494215593735545211926186721478265416885604094928290056616883807637656690510740892510549165222968878676968631652514917701499900066637344546120262780701925698706225540928945194718778004306130021828287425867048748480826948573444778244078734102710824870269523830804910960482013901294024631244800159336670212658317677879752965963472576894326540435889267293950687860830626266263287392087327302547910099932113388977807814336728791448768373686467748528777737403547472871644217767820712964506270880978637928144071192505141148004907055608097229299792441471062852247029870699869227676341773513258602908903875707454368077876422385333700692089616351009233587303986543906071880952557553380364725895007306772122528078179471056481171378557451057691044322925429024149433588396093679321361696954251299731031032804436954501929843820842383121265825740594509426942777307124802176915781835720087170538773256017987133005505911377823841791640280841409623820847637393013930778428554545222367559824666250608754284876104145661362227642405914304455580856318180935230407793891614902116292400515074914068443203230365609954878620999194306564455332547135557365318516011700321550690787716752062881527885897149410320986984083048966524351030502444679931779147659103428949129054120361601695671222140806369405940304552186212879933092856231022418446365289097444640151986623183881962444822590783585914043686193019041458962693878907034982169868696934448086213990534591792826654304798207219634134755646525483143771156678459077797196510772468000293581546267646310224279007313631352522067062951125935874473134186492497282784796644585448962932905262058065248588707020879389134476083344653170939242408249328008915731319541348311820927752486880548733943315867562666122179355051190609992911379445634995627391898459029021713155706096267881673302940198464237390445098028030948975981259252055850973537436556825780313681902007151675693827281818824587541710721180806556448039122504537089422695358382192535075692834095639859265599740391316709290043996275976830375217503360879028295673068862263077729733533853682668734519035709709687322323738300494090123239274318759046526327095178406267264828893646896593219169521106361729757074376148061601331104911692271318609404145014842866423634716982892418180484365230538864559809839273836490685480823014267803143937440431807822678779494006206489151248952516543005634448375046751754207043313372486870633237561645232360481932024377596890914783372179553676992603235715185513391098402739063753280702313301755754269396202629423910945323537910125948964941812563672992967084250667599803456273455598559628512281414582556024841783305645240508450065988755987518601335860624932784487772006842296591945516539562982960591610046578907214842054861830418175604559815168088031783080261445994444677918012432146400983610678683412974872596729258786806223080115822026289014364459002301645823666709265571264559925790622304745235625575111770791512002789380975775468546121017307522799241407026308137792971909461413145802081087738121624539858769697371425881836152605069380926917712087321915005831977113322793572385071940612761291872572099404930250277748156614021327434743881966413330052634229082906400927944924808556131183440161804801357032507836323938921567643159620442612809700944107776130638909071294456394056601559246025454204771186140420155233371270501377121034570009578009389265329385720478576508777149663403003562380595757191609382171312222810465858388943507176431939973012661591423837170284400120399485880996231859472474858776584355077006934099220340378772192728370301380838144394114984971730766162961342059105014814283949700695951676939041557902856356911055547312684571497449635320554677940775184056667637222969090346128706829887104278761090090999160443821794511763620835379716161833124364431267855435550800507986124664397724135502128238026726719914989727248512981287283697489276420792868666970177259794407858155909332508554131299946581118527691652464790819119384233275897699573012098103009171001695718791616942270079528915191912521053891838538959315167400505723817401030621004380243011187977704252328073236575129609372456053680037516596164236147709330391224409752871732067976128120428026739256557305675931512645750047875756531854825821411574030473147492511910835615765732002546109686701890307648531373832912682481741181359032826625082549313211431478953352317043989053928534946642886074268371824902498092479487226633686823799580875637040808655649321905489637785549531167397935270799470452399153297534358690514105864096534514182896474439367182852711843560799285895978176543950113088848419163516673213692860830956744502801800373716458009168082972708715609185038654053436660045504985624687376022557041595800250174095361839287643458003670864954057941720085136357127163768323493134230703821274484501440529541695374381945459456533165140990993722722801019654652726227831512103467686166826131471843610025517863247950150022953695466317739589344131481485834694374523981159954666071205997794363440185078360899108948073419633939259318973940943110042116729120199722626609871927014024105805515315100109804996044147291039451030312664114726736839973315035036742741546992633165270432940675237449075056739508929674779115800864399992564817208847429250821546279856079127768611946086210349405535850134472190244543824521089284409498132717010673966471114931896789977661595488186193176900175027901783824624387873831483279500879026433992577026588005849778984624295660321276945810824348129690840972550671054732471317254997191901039553305847040728081693158626093886019147689944137673621432083607375131574376316754666479186753896571555100850626810005119827486807780592667765654100834778571024250133253391587384761024129794736751001163498977803745930025457609870671092153597115178252014281216647543034075128600240297038428615984289816602143429849088917359682192284469123035904329877231843309914187264674607558318725713138832356015809009594182530207799397648462597901883341793830920965841463574411985878296475850943053008148341821747826603773762252997703468752903517310792083220038080809212164346586817989810504274375385786789186350517717501606531826406928883250135919517178537687865881752366421534010961295763074762648070312757365787762352859057153932484576503944390496668087711899192498933896524852395536795827530614167131757915756386606004839994179548705868209201195154952031294562451315422506574858629161606523796643010172693950282294667489681746821163996794950294284013099235901278250437428192557634533217576162292751110598368271567229778620053722932314082887058749444060116236521627717558503013451471452765841864277071769968435499620257547431811994883385806759692359580622165832464092095350648357935817742903018315351290014321495518177456908388719320697769695657771754499149911431368950836160692539606469893374870942933219185601299108564470256257163505508620689240297589684714283678684735455533583477652536156578189996983068654671736445996343136468195427420490472433064675001442697508322369013083895492637066778406531328664886080129513771720847581157719491012345141774941482773580041432667332379617716965698582785832300505265883502247868050648201444570593197343382923860072601696510903258980909912837652275381493529845099414966933862815568031306981064525192703818515872648691762563239441425216118427769145067718411735714396681005615483952443154944864238384298900399826113322468963346522104692545137969276009719645338955332105584245640187448611050959111766828942711640054010503770420346052521318228045892998637903572350665108782350043349942391285236308896510989246641056331584171142885304143772286629832318970869030400301325951476774237516158840915838059151673504519131178193943428482922272304061422582078027829148070426761629302539228321084917759984200595105312164731818409493139800444072847325902609169730998153853939031280878823902948001579008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    
    が得られます。

    2015年3月4日水曜日

    初めてMacを購入したDeveloperがすること

    0. はじめに

    プログラミングの言語は色々あります。Macは、購入した時点でPHPやRuby, Perl, Pythonのコマンドは入っており、開発可能です。以下、C, C++, Objective-C, Python, PHPの開発について、環境の構築について書きます。
    ブラウザからダウンロードしても使えるのですが、あとあとバージョン管理とかでちょっと困ると思うので。
    5までは全員すべきことで、それ以降はOptionalです。

    1. Xcodeのインストール

    まずはXcodeをインストールしましょう。Appleで開発者登録をすると、ダウンロードできます。iPhone/Mac開発には必須のツールです。また、他の言語の開発にも使える統合開発環境(IDE)です。
    Xcode

    2. Command Line Tools for Xcode

    次にCommand Line Tools for Xcodeをインストールします。
    xcode-select --install
    
    もしくは
    Downloads for Apple Developers(要ログイン)
    からダウンロード&インストールします。

    ここまでで、C, C++, Objectice-C, Swift(Mac, iPhone)の開発環境は整っています。iPhoneはエミュレータもついてきます。
    iPhoneの実機で実行するためのiOS Developer Programについては
    はるふ's Innovation!!ーiOS Developer Programへの参加
    をご参照ください。

    3. Javaのインストール

    Homebrewをインストールしたいのですが、その前に、Javaを入れる必要がある?(どちらかわからない)

    Androidの開発にも必須です。

    java -version
    
    を実行したとき、インストールされていたらバージョンが、されていなければインストールするかきかれる(らしい)です。

    インストールされてないのに聞かれなければ、
    Oracle-JavaからJDKのMac OS Xをダウンロード&インストールします。

    参考→QiitaーMacでJDKのバージョンを切り替える

    4. Homebrewのインストール

    インストールパッケージ管理に利用します。色々ブラウザからダウンロードするとバージョン管理が大変だったり、./configure;make;でエラーがでたらどうしようもなかったりと、homebrewを使うと便利です。

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
    これを実行
    これにより、brewコマンドが使えるようになります
    まずは指示に従い、
    brew doctor
    
    特に問題なければ、完了です。

    基本のbrewコマンドは、

    Homebrewのアップデート&再ビルド
    brew update
    brew upgrade
    

    パッケージ名(formula)を検索
    brew search (キーワード)
    

    パッケージのインストール
    brew install (パッケージ名)

    パッケージのアンインストール
    brew remove wget

    インストールされたパッケージ一覧を表示
    brew list

    です。
    ※Homebrew派とMacPorts派といて、Homebrew派の方が多いイメージがあります。ただ、共に入れるのはよくないようです。

    参考→Qiitaーパッケージ管理システム Homebrew

    5. gitのインストール

    最近のプログラマはとりあえずみんあGitを使っています。

    brew install git
    これだけでOKです。
    gitの基本的なコマンドについては
    はるふ's Innovation!!: サルでも分かるgit入門がわからない

    6. お好みのエディタ

    vimやemacsといったgeekなエディタは標準搭載しています。 Xcodeでの開発ならXcodeで開発できます。
    その他で有名なのは、Sublime Text
    やAtom
    です。
    お好みに合わせて。
    ※Sublime Textは無料で”つかう”ことができるのは事実ですが、長期利用は、有料です。

    7. Pythonの開発

    Pythonのバージョン管理ツールとして、Pyenvがよく使われます。
    brew install pyenv
    でインストール。 その後、
    pyenv install -l
    でインストール可能なパッケージ一覧が表示されます。

    自然言語処理や科学計算などを行う場合は、anacondaをインストールすると、その他様々なモジュールを同時にインストールできて便利です。

    2.7.9や3.4.3、anaconda-2.1.0やanaconda3-2.1.0など、
    pyenv install 2.7.9
    みたいな感じで、一覧の時に表示された時の名前を使ってインストールします。

    Python 2.xとPython 3.xでわりと差があるので、どちらを使うかは、場合によります。そのため、anacondaもanaconda(2.x系)とanaconda3(3.x系)で分かれています。Pyenvを使っているなら、どっちもいれて、切り替えても問題無いです。
    参考→Python 2 と Python 3 のどちらを使って開発すべき?

    anacondaについて、詳細は以下のリンクをご参照ください
    参考→QiitaーMacでPython3系ベースの機械学習環境設定(Python2系との共存)

    以降は引数なしでpythonなら対話モードで、python (ファイル名.py)ならばそのファイルが実行されます。

    pythonのモジュールの追加は、pipから行います。
    はるふ's Innovation!!ーTweepy+Pythonによるユーザーストリーム〜pip, tweepyのインストールから〜(Mac)
    を参照してください。
    pip list
    でインストールしたモジュール一覧を見ることができます。

    Mecabを使う場合は、
    brew install mecab
    brew install mecab-ipadic
    でmecabを入れます。これでコマンドからmecabを使えるようになります。

    pythonから使えるようにするには、
    pip install mecab-python
    を実行します(python3なら右をpython3にする)
    これで、pythonからimport Mecabを実行できます。

    8. PHPの開発(Apache, FileZilla)

    PHPはサーバーで処理を実行し、するので、デバッグにはサーバーが必要ですが、いちいち送るのはとても面倒です。そのため、PC上に仮想的にサーバー環境を構築すると便利です。
    Apache(仮想のサーバー)はもともとインストールされています。
    sudo apachectl start
    により、Apacheを起動。startの部分をstop, restartにすると、停止, 再起動を行うことができます。起動している状態で、ブラウザに
    http://localhost
    を入力すると、
    It Works!
    が表示されます。表示されれば、起動しています。

    ApacheでPHPを有効にするには、httpd.confというファイルを編集する必要があります。
    vimエディタを用います。ちょっと扱いが難しいので、リンクをご参照ください→vimコマンド一覧

    sudo vi /private/etc/apache2/httpd.conf
    でvimが起動したら、i(挿入モードへ)
    #LoadModule php5_module libexec/apache2/libphp5.so
    を探して、先頭の#をとる
    そのご、EscまたはCtrl+C(コマンドモードへ)
    :wqを入力してEnter
    PHPのバージョン管理をする場合は→PHP利用のための設定

    以上で設定は完了です。

    http://localhostは
    /Library/WebServer/Documentsの中身を示します。つまり、ここのindex.htmlが読まれているので、ここに例えばsample.phpみたいなファイルを置いて、http://localhost/sample.php
    にアクセスすると、PHPのサーバーの実行結果を見ることができます。

    PHPのエディタには、僕はSublimeを使っています。

    サーバーをかりているとき、サーバーにファイル送るときは、FileZillaを用います。

    cakePHPはフレームワークの一つです。僕は使ったことがないので、調べてみてください。

    ※PHPで開発する際、いわゆるたとえば$が抜けている、のようなミスの時、何も表示されなくて困ります。そういう時はphpコマンドを実行すると、pythonの実行時みたいにエラー検出できます。

    9. Androidの開発

    Androidの開発は、これからの時代は、Eclipseではなく、Android Studioを使うべきです。(SDKは廃止予定とのことです)
    参考:第 3 回・新 IDE : Android Studio を使ってみよう!
    参考:【ADB】Java(JDK)とAndroid SDKを導入してADBコマンドを使えるようにする

    公式のエミュレータはとても重いので、変える必要があります。公式以外のエミュレータとしてGenymobileなどを使うのもひとつの手ですが、公式も、intelのHAXMを使うと、早くなります→参考:Android SDK の高速エミュレータ、使ってますか?

    Androidアプリのファイル構成は
    QiitaーHello worldで分解するAndroid Studioのプロジェクトの内容
    がわかりやすいです。

    10. Unityの開発

    インストールしましょう。


    以上がやったことのある開発環境の準備です!

    2015年3月3日火曜日

    はじめてのWebAPI〜基礎とSwiftでの実装〜

    APIとは、あるデータや機能を、他のプログラム(外部)から呼び出すためのインターフェースの仕様を示します。
    そのうち、Web上にあるプログラムを用いるものがWeb APIです。

    APIを用いることで、到底一人のプログラマには集められないようなデータを使えたり、機能を使えたりします。
    APIとしては本当に色々あり、TwitterAPIやHOT PEPPER API、Google Maps API、Yahoo!のAPIなど、各社が様々なAPIを提供しています。
    参考:ライブラリ・フレームワーク・APIの違い

    APIを使う側についての記事です。

    まず、身近な例として、普段見ているwebサイトについて。このブログの場合、
    アドレス”http://ha1f-blog.blogspot.jp/”を入力すると、そのアドレスにあるサーバーに対し、HTTPリクエスト(ページの要求)が送信されます。それに対し、サーバーが応答し、HTTPレスポンスとして、ページの内容や画像を返します。
    参考:IPアドレスとは
    参考:Webサイト高速化に必要なHTTPの仕組みを理解する


    そして、送られてくるデータは文字がずらずら並んだデータです。つまり、右クリックから「ページのソースを表示」をしたときに表示されるもの

    こんな感じで見れます。(このブログでの例、HTML形式で記述されています)
    これがこのブログの正体?です。このデータをブラウザが解析して、キレイに表示しています。

    大体見れたかと思いますが、ネットからデータを取ってくる際に、データを取ってくるのが第一の課題、取ってきたデータをどう処理するか(パース)が第二の課題になります。


    今回はRECRUIT Webサービスの一つ、HOT PEPPERのグルメサーチAPIを例に取ります。
    ここから利用規約を読んで、登録すると、APIキーを発行することができます。

    以降、keyは****************として表記しますが、自分で取得したキーを入れてください。

    <第一の課題>
    とりあえず
    http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=****************&format=json&lat=35.6800079345703&lng=139.768936157227
    をブラウザに入力してみると、

    こんな感じのデータが見れるかと思います。(今回はJSON形式のデータです)
    ブラウザを使うと、データを取ってくるのは簡単ですね。

    これをiPhone(Swift)で実現するには

    // use NSURLSession
            var url: NSURL = NSURL(string:"http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=****************&format=json&lat=35.6800079345703&lng=139.768936157227")!
            var myRequest = NSMutableURLRequest(URL:  url)
            myRequest.HTTPMethod = "GET" 
            var task = NSURLSession.sharedSession().dataTaskWithRequest(myRequest, completionHandler: { data, response, error in
                if (error == nil) {
                    //正常終了、レスポンスはdataに
                    println(NSString(data:data, encoding:NSUTF8StringEncoding))
                    }
                } else {
                    println(error)
                }
            })
            task.resume()
    

    このように記述します。

    NSURLSessionを用いています。

    NSURLConnectionは色々な通信を行うことができますが、http通信であれば、簡略化したクラスNSURLSessionを用いたほうが、楽に非同期通信を実現できます。
    ※非同期通信→並列処理。データを取ってくるのに時間がかかることが多いため、その分プログラムの動作を停止するのはもったいない。よって、バックグラウンドでも実行できるようにこの方式を使うことが多い。
    参考:非同期通信

    NSURL()によって文字で書かれたurlをurlの形式にエンコード

    HTTPリクエストの形式は"GET"(受信)と"POST"(送信)の2つがありますが、今回はデータをPOSTする必要はないので、"GET"にします。これをNSMutableURLRequestの.HTTPMethodメソッドによって、行います。

    そして、NSURLSession.sharedSession().dataTaskWithRequestによってタスクを生成し、task.resume()でそのタスクを開始しています。
    つまり、生成されたtaskの中の命令が、task.resume以降にバックグラウンドで実行され始めます。

    これで第一の課題終了です!と行きたいところですが、肝心のURL部分について説明していません。笑
    URLはAPIリファレンスを見ながら考えます。

    今回使ったURLは、
    http://webservice.recruit.co.jp/hotpepper/gourmet/v1/
    ?
    key=****************
    &
    format=json
    &
    lat=35.6800079345703
    &
    lng=139.768936157227
    と分解することができます。
    これで、JSON形式で緯度経度が(35.6800079345703, 139.768936157227)周辺の店データを取得できます。

    一つ目はアドレスで、?以降は引数のようなものになります。(引数名)=(内容)として、&でつないでいきます。どんな引数があるかは、リファレンスに示されています。

    まずリクルートのAPIを使う場合は、key=****************が必須です。
    formatは、標準はxmlとなっていますが、Swiftの場合はJSONのほうが扱いやすいので、JSONにしています。
    lat=?とlng=?で緯度経度を指定しています。
    他にも色々試してみましょう!

    日本語を入れたい場合は、
            let query: String = textinput.text
            let encodedQuery: String = query.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
            var urlstring = "http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=****************&format=json&name=\(encodedQuery)"
    こんな感じで、文字をエンコードしてから入れる必要があります。アドレスバーでよく見る%xx%xx%xxみたいな形式に変換されます。

    これで本当に第一の課題完了です!


    <第二の課題>
    上のプログラムで、「//正常終了、レスポンスはdataに」の部分に、正常にデータを取得できた時の命令を足していきましょう。

    まず取得したデータをそのまま見ると、(ブラウザの場合の画像参照)まあわけわからんぐらい長いデータが続いています。これをSwiftで解析するときには、SwiftyJSONが便利です。
    SwiftyJSONはGitHubに公開されているので、こちらから利用させて頂きます。ここから、Source/SwiftyJSON.swiftをダウンロードして、プロジェクトフォルダ内にいれ、Drag&Dropでプロジェクト内に入れておきます。
    これだけで使用準備は完了です。

    あとは正常終了時のコードとして、
                    let json = JSON(data: data)
                    for i in 0...9{
                        if let stringdata = json["results"]["shop"][i]["name"].string{
                            NSLog(stringdata)
                        }
                    }
    を追加します。これでshopの名前が10個、出力されます。

    一番上の行だけでJSONを解析してくれるので、あとはリファレンスを参照しながら、取り出したいデータを見ていきます。基本は[]の内部の値(辞書のキー)を変えるだけでOKです。(ブラウザで取得されたデータを見てもわかりやすいかもしれません)

    標準では10件の店データが取得されるので、i=0〜9のデータを見ています。

    web上の画像からUIImageを生成したい場合は、
                            let imgurl = NSURL(string: json["results"]["shop"][i]["logo_image"].string!)
                            var err: NSError?
                            var imageData :NSData = NSData(contentsOfURL: imgurl!,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)!;
                            var img = UIImage(data:imageData)!
    
    このようにします。

    第二の課題は、SwiftyJSONのお陰で、とても簡単に解決出来ましたね!

    本記事は以上です!

    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)
    

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

    2015年1月21日水曜日

    文字のエンコードについて〜Python with Xcode 6 補足〜

    先日の記事

    Xcode 6でPythonの開発を行う(Mac)

    の補足です。

    文字エンコードについて。
    ソースのエンコード、システムのエンコード、ファイル入出力のエンコードなどそれぞれありますが、たぶん、こんがらがらないためには、統一しておくのが一番かと思います。もちろん合わせなきゃいけない場面もあるでしょうが、自分で使う分には統一が一番ですよね!?
    Defaultは基本的にPython 3系では標準がUnicode形式になりましたが、Python2.x系ではUS-ASCIIになっており、日本語を入力できなかったり非常に不便ですので、変更方法などご紹介します。プログラムで処理することもできますが、コーディングしやすくなります。

    以下、Python2.x系に向けた記事です。

    <ソースコードのエンコード>
    Pythonでソースコードを書くときは、基本的に、1行目でエンコード形式を指定します。ASCIIでは、たとえコメントにでも日本語を入力したとき、そのままの設定ではエラーになってしまいます。

    僕の場合は、Xcodeの標準に合わせ、
    # coding: UTF-8
    にしました。Xcode側からも、右側のText Encodingから変更などできます。
    (vim形式、emacs形式など、表記法にも複数あるようです。大文字・小文字は区別されません。)
    これで、日本語も記述できるようになります。

    ただ、例えば文字列の長さを取得したいとき、len(u'日本語')=3ですが、len('日本語')は3ではありません。こういう点ではやはりunicodeが便利で、Python3系が羨ましくなります。また、どの文字コードがいいのかわかりません・・・

    <システムのエンコード>
    次に、デフォルトのエンコードについて。デフォルトでは、入出力もUS-ASCIIになっており、不便です。よって、これをUTF-8に書き換えたいところです。(ただ、設定の書き換えなので自己責任で!)

    方法は、sitecustomize.pyというファイルを作り、
    import sys
    sys.setdefaultencoding("utf-8")
    
    を入力して保存。
    Macintosh HD->ライブラリ->Python->2.7->site-packages->にファイルをコピーすれば完了です。
    確認は、Pythonを対話モードで起動して、
    import sys
    sys.getdefaultencoding()
    
    を実行すれば、defaultencodingを表示させることができます。utf-8になっていれば設定完了です。

    <ファイル入出力のエンコード>
    今回僕が躓いたのは、Excelで適当に出力したCSVファイルをMac上でのPythonで動かそうとした時です。CSVファイルは、表などを特定の文字で区切って保存する形式です。Pythonの標準モジュールCSVを使うと、簡単に読み込めます

    まず、プレビューで見ても、日本語に対し、文字化けが発生しました。これは、そのCSVファイルをテキストディットで開き、何もしないまま保存すると、なおります。
    見るだけならこれで十分ですが、これでは文字エンコードが何かわからなくて、プログラムで読むにはこまります。

    そこで、文字コード統一のメリットを活かして、文字化けしなくなったファイルをNumbersで開き、ファイル→書き出す→CSVから、テキストエンコーディングを「Unicode (UTF-8)」を選択し、書き出します。
    これで、そのまま読めるようになります。



    以上書いたのは、とても基本的なことですが、プログラム(encode, decode)で処理するよりも外部で処理したほうが簡単で、コーディングがとてもしやすくなりますよ!

    リストの中の文字列を表示する方法など、こちらで紹介されています→japaneseCharset

    2015年1月20日火曜日

    高校以前の開発について

    高校の頃のブログから作り替えたため、このブログには、高校以前の開発についての記述がありません。

    Cube LEDやサイリウム、電光掲示板の制作&制御や、ロボカップジュニアについて、余裕があれば、有益なものについては再投稿したいとも思っています。

    2015年1月17日土曜日

    Yorufukurouで画像を投稿する



    MacのTwitterクライアントとして有名なYorufukurou、使いやすいのに、全然更新されていなくて、最近では画像の投稿すらできなくなって、困っていました。

    そこで調べていると、なんとサービスを自ら作っている方が・・・!

    Twitpic API to twitter media upload gateway(beta)

    です。

    設定方法などは、作った方がリンク先で説明されています。注意点も書かれていますので、よく読んでから利用しましょう!

    こういうサービスを作れるようになりたい……

    2015年1月15日木曜日

    Xcode 6でPythonの開発を行う(Mac)



    Swiftを書いてから、統合環境Xcodeでの開発に慣れてしまい、vimやemacsが使えなくなりました・・・


    PythonもXcodeで開発するための方法を示します。ただし、Pythonのインストールについては省略します

    Pythonはインタープリター型の言語であるので、プログラムを逐次翻訳していきます。つまり、ほかの言語でいうコンパイルの操作が不要であることを意識しながら作業を進めましょう。

    satomacoto - 「Xcode 4でPythonの開発環境を整える」
    を参考にしました。
    画像を多く使い、わかりやすく解説してくださっています。

    pyファイルを実行するときには、
    $ python (ファイルパス).py
    を実行します

    つまり、Xcodeのビルドボタンを押した時にこのコマンドが実行されるようにすればよいです

    ファイルの作成は不要なtargetを削除して、Schemeの設定をしっかりすれば、Command Line ToolでもEmptyでもなんでもいいです。不安な方は上のリンクから参照してください。

    ここでは、Xcode4と6とで見た目が違う、Schemeの設定について書きます
    (僕の場合、プロジェクト名をpythontest、ファイル名はsource.pyにしました)


    上のメニューのProduct→Scheme→Edit SchemeからRunタブのInfoタブをひらき、設定を画像のようにします。
    "Executable"は"Other"を選択し、⇧⌘G (shift + command + g)で¥usr¥bin¥を入力して移動し、pythonを選択します。
    それと、"Debug Executable"のチェックを外します。

    終われば、Argumentsタブに移動します



    "Arguments Passed On Launch"の"+"から
    $(SOURCE_ROOT)/実行したいファイル名.py
    を入力します。これがつまりコマンドライン引数になります。別の場所に.pyをおいている場合はそちらを指定します。

    以上でSchemeの設定は完了です!



    あとはコードとして、

    print "hello world!"

    とでもかいて、実行してみましょう!




    ちゃんと実行できました!!

    ※2015/1/19追記
    標準入力が動作しないことがわかりました。原因究明中です。

    ※2015/1/21追記
    文字エンコードについて補足しました。コーディングしやすくなる方法です。
    →<http://ha1f-blog.blogspot.jp/2015/01/python-with-xcode-6.html>
    標準入出力については変化がありません。