お腹.ヘッタ。

関数型とかセキュリティとか勉強したい。進捗つらぽよ

夏休みの宿題(programmingかんけいあるよっ)swift2.0で書いた。

お疲れ様でございます。竹です。

夏休みも終盤。みなさん宿題は終わりましたか?進捗どうですか?
ちなみに僕は宿題最終日までやっちゃうダメマンです。

さてさて今回は宿題をしながら勉強してやった事を載せようと思います。

なにを作ったか?冷蔵庫帳なるものを作りました。

どんなもの?ただ賞味期限を設定すると通知してくれるIOSアプリです。ついでにレシート記録機能もあります。

私も宿題やりながら記事書いてるので説明雑なのはご理解ください。

さて面倒なんで
takehaya/Refrigerator-memo-book · GitHub
これみて遊んでください。

これで中身のソースでなにができるか。
とりあえず内訳から行こうと思います。
まず。sqliteとswift2.0が学べます。
細かく言うと

・カメラ機能の作り方。
・写真のプレビュー
・各種ライブラリの使い方。
SQLの構文。トランザクションなど

がつくれます。ソースは汚いんでわからないとこや間違えがあればご一報ください。
使用ライブラリ
#import "UIScrollView+EmptyDataSet.h"//よくテーブルビューがからのとき表示してくれる画像を使える。

#import "sqlite3.h"//sql

#import "FMDB.h"//sqlのラッパー

#import//プログレ


//(バインドのなかに#import "EAIntroView.h" こいつがあるけど実装してないからごめん消し忘れた)

こいつらです。とっても便利でした。
はいそれだけです。
いやでもね汗
2.0版で書くとそのままAPI書けないんですよ汗なんか知らないけどカメラのとこでコンビニエンスコンストラクタになってたり大域関数きえてたり。。。など。なかなか辛いものがありました。。。

かなり駆け足で雑な感じになりましたけど。なんとか記事書けました。。。
えっ?haskellはどうした?セキュリティは?
すみません。。。次の記事書くときは善処します。。。

ps:かなりソースが汚いです。よく人に見せれるなと言われてもおかしくありません。大変申し訳ないと思っています。どうしても8月には記事を一つ書きたかったのです。。。ちなみにどれくらい汚いかというと思いっきりコメントアウト残ってます(死)。ですのでわからない点があれば聞いてください。答えられる範囲で答えます。

socket.ioをSwiftでつかってみた。

どうも。あきらかにネタ無くて今やってること書いてます。
まぁとりあえず記事書きます。

 Q.socket.ioってなーに?
A.リアルタイム通信を簡単に可能にするwebソケットです。

 Q.なにいってかわかんないー簡単に使いたいよー!
 A.SIOSocketっていうMITライセンスのOSSラッパーがあるんで使おう。

はい。というわけでSIOSocketをつかったsocket.io今回は紹介しようと思います。
SIOSocketのGithub:MegaBits/SIOSocket · GitHubここをとりあえず見てみましょう。まず使うために

How to use

SIOSocket can be added as a CocodaPod, submodule, or standalone dependency to any iOS 7.0 (or greater) project.

pod 'SIOSocket', '~> 0.2.0'
then...

#import <SIOSocket/SIOSocket.h>

// ...
[SIOSocket socketWithHost: @"http://localhost:3000" response: ^(SIOSocket *socket) {
    self.socket = socket;
}];
or, in Swift...

// ...
SIOSocket.socketWithHost("http://localhost:3000") { (socket: SIOSocket) in
    self.socket = socket
}
A full demo can be found over at MegaBits/WorldPin

をみましょう。podってありますね?そうです。Cocoapods先生を使えということです。(ライブラリを簡単に取り扱うサービスのこと)まずはCocoapodsを入れましょう。入ってるひとは飛ばしてね。
まぁ入れ方はおそらくこの記事的にiOSデベロッパさん向けなのでOSXであると仮定してRubyが入ってるとしておきます。
まずはterminalを立ち上げ

$ sudo gem install cocoapods

とかきます。
そのあとにセットアップで

$ pod setup

これでcocoapodsの準備は完了です。
さて次は適当なiosのプロジェクトを作りましょう。
そしたらそのiosのプロジェクトの中で(もちろんterminalでアクセスしてね)

$ pod init

とうちこんだあと自分ののファイルにはPodfileというなぞファイルが入ってます。
それを開いたらおそらく

# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'

target 'ach_1' do


end

target 'ach_1Tests' do


end

みたいな感じになってると思います。そこに

# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'

target 'ach_1' do
pod 'SIOSocket', '~> 0.2.0'

end

target 'ach_1Tests' do
pod 'SIOSocket', '~> 0.2.0'

end

と記述してください。なにをやってるかも知りたいならググってしらべてね?(まぁimportするターゲット決めてるだけなんですが。)
その後

$ pod install

とそのpodfileのあるとこで打ち込んでください。
そうするとf:id:taketarou2:20150707225330p:plainこんな感じに白が多いソリューションファイル的なのができます。そこからxcodeを立ち上げてください。
そしたらswiftで使うためにバインドし無くてはなりません。ので。いわゆるBridging-Headerというやつ。qiita.comこれをみたほうが早いんで割愛します。これで準備は整いました。

さて使うぞと。
onは受信。
emitは送信
これだけ。くらいあんと。はこれだけぇ。。。*1
まぁこんなに時間かけたくないぜという人向けに

class ViewController: UIViewController ,UITableViewDelegate{

    var socket:SIOSocket! = nil


    override func viewDidLoad() {
        super.viewDidLoad()      
        
        SIOSocket.socketWithHost("http://なんか入れて/", response:  { (_socket: SIOSocket!) in
            self.socket=_socket
            //接続時に呼ばれる
            self.socket.onConnect = {()in
                print("connrct")
            }
            //再接続の時に呼ばれる
            self.socket.onReconnect = {(attements:Int) in
                  print("reconnrct")
            }
            //切断時に呼ばれる
            self.socket.onDisconnect = {() in
                print("disconnrcted")
            }
            //受信
            self.socket.on("イベント名", callback: {(data:[AnyObject]!) in
              
            })
    // 送信する。
         socket.emit("イベント名", args:[]as [AnyObject] )

        })
    
    }
   
   
}

というテンプレートを作っておきました。クソ便利です。これを貼り付けるだけで君もソケットマスターという黒魔術です。知識いりません笑

   //受信したい時
            self.socket.on("イベント名", callback: {(data:[AnyObject]!) in
    //なんか書く(JSONのパースとか⇩)
     let dic = data[0] as? NSDictionary
     var getdata = dic["キーの名前"]
 })
    // 送信するとき
        socket.emit("イベント名", args:[]as [AnyObject] )

受送信はこれを使い回す感じで。
もしクロージャ内でレイアウトの変更やtabelviewの更新の時は

 //スレッドの設定((UIKitのための
                let _q_global: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
                let q_main: dispatch_queue_t  = dispatch_get_main_queue();
//を外側に書いておいて(いわゆるフォアグランドのとき)
//そしてクロージャの中でレイアウト変更したいときは
                       dispatch_async(q_main, {
                              //処理みたいな感じ。
                                    })

こんな感じです。
えっ?わからない?いやこれでデータ投げるだけです。はい。調べてね☆

サーバー側はちょっと紹介できないですガ。。。。いつかNode.jsで書いたやつ出したいと思います。
かなり多くの情報がありますがかなり入門向けとしてはわかりやすいかと思います。

*1:サーバーはルームの概念とかnamespaceとかあって設計大変デスケド。。。

iOS swift segueの備忘録(一部にdelegateもあるけど気にしない)

久しぶりの更新です。
最近iOSのコードを書いててsegueでのUnwind Segueをソース上で動かせなくて困ったんで
備忘録として書いときます。(まぁ既出でしょうけど。。。)誰かの役に立てば幸いです。

*普通のソースで扱うsegue*

buttonに繋がないで画面コントローラーにつなぐ。identityを決める。そしたら以下のものを駆使するだけ。

//これ一行書くだけでで遷移する
 self.performSegueWithIdentifier("決めたidentity", sender: self)

* //ここで何かしらのことも((値渡しとか
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "決めたidentity") {
        //    let nextViewController: nextViewController = segue.destinationViewController as! nextViewController//ここに遷移先のインスタンスを作れるので、
      
    }

*exitをソースで動かしたい*

まずはstoryboardの上のexitにつける(ここまではみんなわかると思う。というかいっぱい記事あるし省略する。)その後Unwind Segueにidentity、タグずけをしておく。(わかると思うけどストーリーボード上でやるよーf:id:taketarou2:20150707220722p:plain)一番下のクリックしてやるんだぜ)

そしたもう簡単

 self.performSegueWithIdentifier("決めたidentityUnwind Segue", sender: self)

//ここで何かしらのこともできる
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "決めたidentityUnwind Segue") {
        //    let nextViewController: nextViewController = segue.destinationViewController as! nextViewController
      
    }

でできる

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "playscore") {
             let nextViewController: nextViewController = segue.destinationViewController as! nextViewController
            nextViewController.delegate = self
        }
        }

ちなみによく忘れるsegueとdelegateはこう。

巡回セールスマン問題

takehaya/Traveling-Salesman-Problem · GitHub
解きました。全列挙してます。ちなみに私はゲームで使えるようにベルってファイルでアイテム同士の距離を求めてpro...2で実際の動作を再帰で実装しました。

ps:さっき気がついたけど自分のとこに戻るコスト処理書き損ねた。