2017年1月23日月曜日

近況

ご無沙汰です。
あけましておめでとうございます。
本年もよろしくお願いします。

近況ですが、実は結婚しまして、神奈川に引っ越しました。

そんなですが、今後ともよろしくお願いします。

2015年10月25日日曜日

Macに新幹線のアナウンスを喋らせる。

気がついてみれば、ほぼ1年越しの投稿になります。
忙しさにかまけて、アウトプットするのをサボっていましたが、まあまたボチボチ更新していきたいと考えています。

最近、JXAというJavascriptでMacを動かす、AppleScriptの亜種みたいなものを覚えたので、何かに使えないかなーと思ったんですが、案外情報が少ないので、暇を見て色々試しつつ、勉強しています。

シェルでいいじゃんとか、そういう意見もあるかと思うんですが、shellScriptだとちょっと面倒な処理、例えばファイル名で判定して処理を変えるとか、出来ないわけじゃないけどちょっと面倒とか、そういうケースに対してサクッとできたらいいかも的な。あと、アプリケーションの対応次第なんですが、アプリケーション自体もJXAから弄れるらしいので、その辺で差異が存在理由なんじゃないかなと思います。

ドキュメント等を見ていると、Macのシステムの読み上げ音声で任意のテキストを喋らせる事が出来るようなので、一発目として試してみます。

最近、新幹線通勤になってしまったので、なんとなくうろ覚えの新幹線のアナウンスを喋らせることにしましょう。

まず、アプリケーション>ユーティリティ>スクリプトエディタを開きます。

 
function talkToMe(args){
 var app = Application.currentApplication(); // 現在のアプリケーションオブジェクトを取得する
 app.includeStandardAdditions = true; // 標準コマンドを使用可能にする
 app.say(args);
}

talkToMe("We will soon make breaf stop at ODAWARA.");
これで、スクリプトエディタで実行するととりあえず喋ります。 でもイントネーションがなんとなくおかしい。これ、システムの設定で、読み上げが日本語になっているのが原因です。なので、英語の読み上げ設定に変更します。
これで、それっぽく喋るようになりました。

JXAはシェルだと直接いじりにくいようなシステムに絡んだ設定項目なんかに対して正規の方法でアクセスできるみたいなので、何かうまい使い方がないか色々考えています。


2014年9月22日月曜日

Swiftでカメラアプリを作る。

最近、暇を見つけてはSwiftを勉強しています。
今日は半日くらいマルッと使えそうだったので、Swiftでカメラアプリなぞ作ってみました。

先人達のコードを参考にしつつ、XCode6.01のSwiftで書き直してあります。

コードはこちら。 Github

どーせ書き方が違うだけだろと思ってたんですが、全然そうでもなく、Obj-Cで書いたプログラムをそのまま書き直せば動くっていう感じでは無さそうです。
また、言語としての抽象度が上がっているので、逆に色々ハマりどころがあります。

以下ハマった所。
なかなかdeviceInputが取得出来なくて苦労しました。サンプルを持って来ると何故かnilが帰ってくるという。とりあえず、こんな感じに修正して動きました。


    var videoDevice:AVCaptureDevice?

~~~~~~~~~~~~~中略~~~~~~~~~~~~~~~~
        var error:NSError?
        videoDevice = CameraViewController.device(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
        let videoDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(videoDevice!, error: &error) as AVCaptureDeviceInput

~~~~~~~~~~~~~中略~~~~~~~~~~~~~~~~
    class func device(mediaType: NSString!, position: AVCaptureDevicePosition) -> AVCaptureDevice? {
        var devices = AVCaptureDevice.devicesWithMediaType(mediaType) as [AVCaptureDevice]
        
        if devices.isEmpty {
            return nil
        }
        
        var captureDevice = devices[0]
        for device in devices {
            if device.position == position {
                captureDevice = device
                break
            }
        }
        return captureDevice
    }


あとイメージをキャプチャして保存するのが結構ハマりました。


 
    func takePict(sender: AnyObject){

        var layer : AVCaptureVideoPreviewLayer = previewLayer! as AVCaptureVideoPreviewLayer
        
        self.stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = layer.connection.videoOrientation
        
        var error:NSError
        
        self.stillImageOutput?.captureStillImageAsynchronouslyFromConnection(self.stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo), completionHandler: {
            (imageDataSampleBuffer,error) -> Void in
            if ((imageDataSampleBuffer) != nil) {
                var imageData : NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                var image : UIImage = UIImage(data: imageData)
                ALAssetsLibrary().writeImageToSavedPhotosAlbum(image.CGImage, orientation: ALAssetOrientation.fromRaw(image.imageOrientation.toRaw())!, completionBlock: nil)
            }
        })

    }
一応こんな感じで何とか動いてます。(正直まだ良く分からない所が多い。)

なんというか、Obj-Cよりも難しいなと思うのは、書き方のパターンが色々ある所とXcodeがまだ自動補完とか完全で無い感じの所ですね。
構造体とかの使い方が特徴的らしいので、その辺りをマスターすればよりSwiftっぽい書き方になるんじゃないかなーと思います。

参考になれば幸いです。

2014年9月21日日曜日

ipython notebookとscikit-learn

だいぶご無沙汰です。
ここの所、iOSやったりAndroidやったり色々でした。
ちょっとアルゴリズムの検証として数値計算するニーズがありまして、Rでも覚えようかどうしようかなと思っていた所kzfmさんからipython notebookとscikit-learnがいいよと教えて貰ったので、早速インストールしてみました。
インストールはpythonのパッケージ管理ツールpipが動けば全然楽勝だったんですが、最初easy_install pipしても
DistributionNotFound: setuptools==0.6c12dev-r85381
とか言われて全然インストール出来ず。ググったら親切な外人が/usr/bin/local/以下のeasy_installが複数入ってる可能性があるから一個消せば動くよって教えてくれたので、解消しました。感謝!


で、pipが動く様になったら後は楽勝です。まずは、ipythonのインストールから。あ、環境はMac OSX marverikです。
$ sudo pip install ipython
としてから、
$ sudo pip install jinja2
$ sudo pip install tornado
$ sudo pip install pyzmq
として
$ ipython notebook
ってやると、おもむろにブラウザがこんな感じで立ち上がります。こりゃ便利そう。


んで、数値計算の方なんですが、scikit-learnを動かすにはnumpy,scipyが必要なので、こちらもpipでインストールしてから、
$ sudo pip install scikit-learn
でインストール完了です。どうも途中Xcodeのcommand line toolが必要みたいなんですが、既に入ってるので、問題ナッシンでした。

とりあえず、これで準備は完了なんですが、とりあえず色々触ってみたいと思います。

2014年7月10日木曜日

コードを書く上で、最近気をつけている事について

ここの所、思う所ありコーディングのスタイルを改善しようと思い立ってます。
7月は”コード美化月間”です。

という訳で、気をつけようと思っている事を列挙します。
・インデントの徹底
Pythonですと、普通に書いていれば割りとインデント合うのですが、obj-cはインデントキチンとしてないと後で非常に読み難いです。PHPも徹底すると可読性がグッと上がるので、特に気にして書いています。

・メソッドの機能コメント
メソッドの先頭に機能のコメントを英語で短く書く様にしました。こうする事で、Xcode6Betaで出る自動補完が効かない不具合を回避出来るってのが一番の理由ですが、副産物として考えが整理されるというメリットを発見しました。(英語苦手なだけに)
割と良いかもと思うので習慣化したいです。

・1行コメント
1行コメントで1行使うの辞めました。コードの末尾に書く事に徹底。すげースッキリ。

・"=>"とか"->"とか"="とかの扱い
例えばなんですが、
  
    public  $hasOne     =   array(
                    'hoge' =>  array(
                        'className'  =>  'UserInfomation',
                        'foreignKey'  =>  'user_id',
                        'conditions'  =>  'hoge',
                        'fields'  =>  'fuga',
                        'order'  =>  'hage',
                        'dependent'  =>  false
                    )
こんな感じの所を、こんな感じに直します。
  
    public  $hasOne     =   array(
                    'hoge' =>  array(
                         'className'  =>  'UserInfomation',
                        'foreignKey'  =>  'user_id',
                        'conditions'  =>  'hoge',
                            'fields'  =>  'fuga',
                             'order'  =>  'hage',
                         'dependent'  =>  false
                    )
ラインが揃って超スッキリ。後で読む気になります。
書き直している時に見直しが入るので、間違いも見つけやすいです。

あとは、リスト内包表記で複雑な書き方しないとか、SQL文も改行入れて読みやすくするとか、後で人が読んでも恥ずかしく無い様なコードを書く習慣付けをしています。
地味なんですが、レベルアップして行く為にも必要な事だってのが何となくわかって来たので。

まあ、成果物そのものよりも、多分心がけの問題なのかなとは思いますが、いい習慣だとは思うのでなるべく続けて行きたいなぁと思っております。

2014年7月6日日曜日

iOS開発向けのコマンドラインツール、Nomadが便利そう。

ナゾの背中痛で薄ら死にそうになってるんですが、久々のブログ更新です。

アプリ開発の方が色々と入り組んで来たので、色々省力化の手順を模索していました。

こんな本読んでみたりとか、(ちなみに結構いい本。オススメ)webで情報漁ってみたりとか、まだまだ色々模索中です。

そんな中で、やりたい事、必要そうな事が朧げに見えて来ました。
何をしたいかっていうと、
・似た様なアプリを複数リリースする為に、Assets(素材)やクラスをターゲット毎に切り替えたい。
=> ビルドターゲットの切り替えで、1つのプロジェクト内でバージョンの少しずつ異なるモノを別々に管理出来る。
=> 共通コードはそのままなので、アップデート時の事故が減る。
=>  それでも不安なので、テストを書く。
=>  ターゲットが増えると、手動でビルドしまくるのは非常に面倒だし時間も掛かる。
=>  CIツール導入検討、もしくはビルド用のシェルスクリプトを書く。

と言う訳で、CIツールを導入検討すると、オンラインで出来るCIサーバとか結構あるんですよね。しかも無償でBitbucket連携とか。
でもでも、それはwebに限った話。そもそもMacでないとiOSのCIサーバ立てられません。コンパイル出来ないからね。なんで、オンラインは無理。
そろそろ、開発用のPCもガタが来てるので、Mac miniを予備機で購入してCIサーバにあてようかと検討していたんですが、そこはちょっと保留。設定に時間取られるのがシンドイ状況なので、とりあえずもう少し時間が出来てから。
じゃあとりあえずビルド用のスクリプト書きますか、という流れです。

実はXcodeはコマンドラインツールは完備していて、シェルスクリプトでビルドからリリースまで一環して行う事が出来ます。ここにテストの工程を挟めば立派なCIの流れが実現可能です。
まずは、テストはXcode上で行って(そもそもまだ一部しか書いてない。)配布、リリース用は個別にスクリプトを書く事にしました。
つーても、コレが結構面倒です。何か楽にする方法無いのかなーと思ってたらありましたよ。こんなのが。

http://nomad-cli.com/

一言でいうと、普通に考えられるiOS開発用のコマンドライン操作を使いやすくまとめたツール郡です。機能別に都市名が付いてて、Cupertinoはアカウント管理関係。Dev Centerの操作とかが可能。HustonはPush通信のトークン周り。(コレ地味に有り難い。)
DubaiはPassBook発行関連。VenisはIn-App-Percheceの管理周辺。Shinzhenはアプリ配布やリリース関連と、イイカンジで揃ってます。
特に、Shinzhenはビルド完了時にTestFlightで配布とかを自動化出来たりします。
ただ現状やりたい事に完全にマッチするかといわれると問題があって、簡易な使い方を目指してるのでビルドターゲットの指定が出来ないです。
なので、ここはちゃんとXcodebuildでビルドスクリプト書くしか無いっぽい。残念。

とはいえ、結構使えそうなツール郡なので、活用してみますよー。

例えば:
Automator君でフォルダアクションを作成して、連携して走るshにコレ書いとけば、フォルダにipaファイル放り込めばテストフライトにアップロードとか簡単に出来る予感。


そんなお話でした。


2014年6月15日日曜日

ライブドアブログの自動投稿について

はい、ご無沙汰です。

ちょっと調べる必要がありライブドアブログの自動投稿をテストしてみて、あまり使えない事が判明したので、メモです。

自動投稿は指定のURLにAtomPubで整形した文書をリクエストするだけ。pythonなどでは普通にurllibとかurllib2なんかで対応可能。
こんな感じのURL
https://livedoor.blogcms.jp/atompub/(ここに自分のブログ)
ブログ設定でAPI Keyという項目があるので、ここで確認出来る。自動投稿をonにするとパスワードも発行されるので、メモっておく。

ブログの自動投稿プロトコルは、xmlrpcやらAtomPubやらあるみたいだけれども、それぞれ規格があるので詳細はそちらを参照されたし。

実際試してみた所、どうも投稿が上手く行く場合とそうでない場合がある。
どうやら以下の様な制限があるみたい。

  • 文字数制限(大量のテキストはダメっぽい。制限文字数は未検証)
  • 特定のタグを使用していると投稿出来ない(少なくともリンク付きAタグはダメだった。他未検証)
  • 仕様がコロコロ変わるっぽい。しかもドキュメントが無い。


自動投稿を認めているサービスとしては、まあ普通にあり得る内容。
まあ、中々使い難い仕様ではある。編集も出来る模様なので、長文でも数回に分けて投稿すればもしかしたら通るのかも知れない。けどリンク貼れない時点で、使い途としては相当制限される印象。
実際こういう使い方したいのであれば、自前のブログシステムをWordPressか何かで作ってそこに投げた方が、制限無くていいんじゃないかなという結論でした。

そんな感じ。