お腹.ヘッタ。

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

Haskell(再)入門0回目イントロダクション(環境構築)。

どうもこんにちは。結局セキュリティ記事じゃありません。Haskell(再)入門記事です。

全体で20回ぐらいに続けたいと思います。(こんな備忘録ブログだから誰も読まないだろうなぁ読んでる人いるのかなぁ。。。モチベ出すためにだれかつっこみとかコメください。。。。)
なおおそらく後半は明らかに間違えているとこなど、知らないから勉強のために書いてるなど付け焼刃感が出ると思います。

今年度中には書き終えたいですね。。。。

今回はイントロダクション。つまり僭越ながら0回目として始めましょう。大丈夫。配列だって0からだ。問題ない。
(うん。。。。?luaはから1だけど?なんのことだか。。。)


さてさて、まずは前書きとしてHaskellってなに?というところからいきましょう。

Haskellとはwikiの言葉を借りると

Haskell高階関数や静的多相型付け、定義可能な演算子、例外処理といった多くの言語で採用されている現代的な機能に加え、パターンマッチングやカリー化、リスト内包表記、ガードといった多くの特徴的な機能を持っている。また、遅延評価や再帰的な関数や代数的データ型もサポートしているほか、独自の概念として圏論のアイデアを利用し参照透過性を壊すことなく副作用のある操作(例えば 代入、入出力、配列など)を実現するモナドを含む。このような機能の組み合わせにより、手続き型プログラミング言語では記述が複雑になるような処理がしばしば簡潔になるばかりではなく、必要に応じて手続き型プログラミングを利用できる。

だそうです。

さて高階関数?静的多相?カリー化?美味しいの?となる方がほとんどでしょう。参照透過?ファッ!?圏論
もう入門としては敷居が高いですね。
記事書く私でさえ圏についてはよく知りません。


一応さっきの言葉の解説として
高階関数:
関数を引数にしたり、関数を戻り値としたりすること。
いわゆるクロージャなどですね。
ちなみに関数がファーストクラス(第1級)である関数型(HaskellやML)やSwift,JavaScriptといったプログラミング言語で実装されます。

静的多相型付け:
オブジェクト志向などポリモーフィズムという言葉で多くの方は聞いたことがあるのではないでしょうか。それのことです。
平たく言うと型システムの性質を表す言葉で、複数の型に属することを許すという性質を指します。
多様性という言葉が多く使われますね。ちなみに対義語はモノモーフィズム、単態性だそうです。

カリー化:
高階関数と一緒に覚えましょう。「複数の引数をとる関数を1変数関数に置き換えることをカリー化!。」
(つまり関数の引数を減らすことですね。)
参照透過:
 簡単にいうと必ず同じ結果になる完全性。ちなみにこれが理由でHaskellでは変数に再代入ができません。これを純粋関数型言語と呼んだりします。

圏論:
説明できないんで
東大 理学部情報科学科/大学院情報理工学系研究科|情報科学科NAVIgation
を読んで(面目無い)。Haskellモナドの根底にあるもの。



さて本題の環境を作るところから始めましょう。



HaskellコンパイラとしてはGHC(Glasgow Haskell Compiler)とHugsが有名です。
エディタのプラグインはどこのでも(atomとかVimとか)、どんな環境でも(OSを選ばない)つくれます。
簡単にやる方法はネット上にいっぱいあるので私の好きな環境を載せたいと思います。
状態としてはSublimeHaskellです。

1: Haskell Platform(処理系)をいれる。
Download Haskell Platform

2:SublimeText入れる
http://www.sublimetext.com/

3:SublimeTextの日本語化などパッケージコントロールをいれる
MacOSX - MacでSublime Text 3のインストールと日本語化メモ - Qiita

4:SublimeREPLをインストール
”Package Conreol:Install Package”を選択します

 SublimeREPLを選択します。
[Preferences]->[Package Settings]->[SublimeREPL]->[Settings - Default] の

>"default_extend_env": {},

に PASSをいれる。ここにはGHCi.があるディレクトリを指定。

5.FluentREPLのインストール
 Haskellソースを書いた後つかうもので、保存と同時にghciにロードするプラグインFluentREPLをインストールします。
 こいつはどうやらF#とかClojureにも対応してるとか。
 インストール方法は
https://github.com/zaneli/FluentREPL

英語だけどグーグル翻訳でみれば大丈夫でしょう。

6: 動作をみる
コードを書いたら保存。そうするとGHCがつかえるでしょう。

こんな感じでIDEができちゃいます。
記事に間違いがあれば連絡ください。
今回はここまで。次は実際にコードを書いていきますお楽しみに。

参考にすべきサイトmomocus.hatenablog.com
Setup Sublime Text as Haskell IDE

UnityforMACでOPENCVつかうとき引っかかったところについて

こんにちは。セキュリティではなくUnityですみません。。。

今回はUnityforMACでOpencv使うとき死んでたとこまとめです

入れるときはこれでやります。ほかにもこれを参考にしてやってた人いたんで探していてれてください。

http://warapuri.tumblr.com/post/70283352060/unityでopencvを動かしてみよう主にmac対応
warapuri.tumblr.com

さてエラーです。

DllNotFoundException: libcxcore.dylib

ふむふむ。上の記事にもあったんで軽い気持ちでいました。。。それが穴でした。。。。

上の記事通りの対策をします。うまく行きません。英語記事読みます。

http://answers.unity3d.com/questions/23615/how-to-make-unity-find-dylib-files.html

なかにこんな投稿がありました。
http://www.tedlindstrom.se/how-to-link-dylibs-into-unity3d/

ふむふむ。bundle作るのか。ふぁっ!?Cで呼ぶの!?エクステンションんん!???!?

諦めます(英語能力と記事の読みにくさに。)

上で見たことの視点で調べます。
なんでも秘密研究所 » unityでdylibが読み込めない問題
こんなのがありました。

環境によってはconfigファイルいじればいけるっぽいらしい
/Applications/Unity/Unity.app/Contents/Frameworks/Mono/etc/mono/config
にdllmapを定義する
(上の記事より引用)

ふむこれだ!!ってことで解決しました。
方法:
/Applications/Unity/Unity.app/Contents/Frameworks/Mono/etc/mono/configを開く。
そのなかにこれを入れるだけ。

<dllmap dll="libcxcore.dylib" target="/usr/local/lib" />


それでうごくはずです。。。すくなくてもビルドの時には動きます。確認ください。(てかビルドの時しかうごかねねええええ)


dllmapってなによの人は
DllMaps | Mono
これどうぞ。参考になります。

なにか間違いやいい方法があれば連絡ださい。

夏休みの宿題(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:さっき気がついたけど自分のとこに戻るコスト処理書き損ねた。