タグ

ブックマーク / naoty.hatenablog.com (14)

  • vim も zsh も捨てた - AnyType

    プロジェクト移行期に入って暇な時間ができたので、開発環境をリフレッシュすることにした。vim や zsh の設定が少しずつ壊れてきていたのだった。 .vimrc や .zshrc を眺めてみると、かつて意識が高かった頃に施した設定が何のためのものだったのか忘れてしまっていた。別人が書いたスパゲティコードのようだった。 また vim や zsh の設定を検索して理解するべきなんだろうか。ここで覚えた知識はまたすぐに忘れてしまうんじゃないだろうか。設定が洗練されるほどに、それを更新する機会もまた少なくなってくる。設定が必要になるきっかけは忘れた頃にやってくるもんだ。 やり方を根的に見直す時期なのかもしれない。新しいツールもいまなら選択できる。 まず、vim から atom に移行した。git のコミットメッセージやちょっとしたファイルの修正ではまだ vim を使うものの、細かい設定が必要にな

    vim も zsh も捨てた - AnyType
    clavier
    clavier 2017/04/20
  • Swiftのオブジェクトグラフを生成する flock を作った - AnyType

    Swift で定義されたオブジェクト間の依存関係を可視化する flock というツールを作った。これによって、 Swift で書かれたコードベース全体を把握しやすくなったり、リファクタリング時に影響範囲を把握しやすくなる。 Usage Homebrew からインストールできる。 $ brew tap naoty/misc $ brew install flock flock は指定したディレクトリ(何も指定しなければカレントディレクトリ)以下の Swift のソースコードを解析して dot 形式のソースコードを出力する。これを Graphviz 等を用いて画像に出力して使う。 $ flock <directory> 試しに Alamofire で flock を試してみた。 横長になってしまうので、一部を切り取った。 コードの依存関係がハッキリと把握できるようになった。 How it wo

    Swiftのオブジェクトグラフを生成する flock を作った - AnyType
  • Xcodeのカラーパレットを作るコマンドをSwiftで書いた - AnyType

    clrというコマンドラインツールをSwiftで書いた。上のスクリーンキャストにあるようにXcodeで使うカラーパレットをターミナルから作成できる。 近年ではStoryboard(かつてはXib)がどんどん進化しているので、見た目に関する設定はコードじゃなくてStoryboardに任せたいなという気持ちがある。特に色については、コードでやろうと思うとUIColorのextensionをひとつひとつ書いていく感じになると思うけど、カラーパレットを自作する手もあるなということに最近気づいた。カラーパレットを使うと2、3回クリックするだけで色を指定できるから簡単だと思う。 技術的な解説をすると、自作したカラーパレットは実は$HOME/Library/Colors/以下に*.clrという拡張子で保存されていて、このファイルを共有すれば他の開発者とカラーパレットを共有できる。ただ、これをXcodeでポ

    Xcodeのカラーパレットを作るコマンドをSwiftで書いた - AnyType
  • 型消去を用いたSwiftによるリポジトリパターンの実装 - AnyType

    リポジトリパターンとは リポジトリはオブジェクトの参照を取得するのに必要なロジックをすべてカプセル化するためのパターンです。 Domain Driven Design Quickly 日語訳 iOSアプリ開発の文脈では、オブジェクトをWeb APIから取得するのかRealmから取得するのかといった関心ごとがある。リポジトリを実装することで次のようなメリットがあると思う。 どこからどのように取得するのかなどの関心ごとからドメインモデルを切り離せるため、ドメインモデルをクリアに保つことができる。(DDDの観点) テスト時にWeb APIやRealmにアクセスするリポジトリをメモリにアクセスするリポジトリに差し替えること(Dependency Injection)が可能になるため、テストデータを簡単に用意できたりテストのパフォーマンスを向上できるなど、テストしやすくなる。(テスタビリティの観点

    型消去を用いたSwiftによるリポジトリパターンの実装 - AnyType
  • FriendlyErrorType - AnyType

    新しいエラーハンドリング Swift 2でthrowを使ったエラーハンドリングが新たに導入された。従来のNSErrorを使ったエラーハンドリングの問題点は、メソッドにNSErrorポインタの代わりにnilを渡すことで無視できてしまうことだった。新たに導入されたエラーハンドリングでは、throwsキーワードが宣言されたメソッドを呼び出す際にdo-catch文で囲うことを強制される。throwで投げられるエラーはNSErrorではなくErrorTypeというprotocolを実装した値だ。Cocoaフレームワーク内のNSErrorを使っていたメソッドはthrowsを使うように置き換えられており、今後は独自のエラーを定義する場合はNSErrorではなくErrorTypeを使うのが望ましいと考えられる。しかし、ErrorTypeにも問題点はあり現実的な設計方針を検討する必要がある。 アプリ独自エラ

    FriendlyErrorType - AnyType
  • Timepieceを0.4.0にアップデートした - AnyType

    Timepieceを0.4.0にアップデートした。ぶっちゃけブログの記事にするくらいならちゃんとCHANGELOGにしろという話なんだけど、技術的な詳細も少し話したいのでブログの記事にした。軽微なバグの修正と以下の2点が今回の変更点だ。 タイムゾーンのサポート これがメインの変更になる。「サーバー側から受け取る時間のタイムゾーンとiOSアプリケーションのタイムゾーンが異なっており、それらを比較したい」みたいなissueをもらったので対応した。「こういう感じのインターフェイスはどう?」みたいなのを聞いてたら「Sweet!」だのと褒められたので、その気になって実装してしまった。けっこう大変だった。 iOSでは、NSDateオブジェクトそのものにタイムゾーンは存在しない。システムで設定されるタイムゾーンをNSCalendar経由で取得することになる。 NSCalendar.currentCale

    Timepieceを0.4.0にアップデートした - AnyType
  • activeadmin読んだ - AnyType

    activeadmin/activeadminを初めて使うことになったので、どういう仕組みになっているのか調べてみた。 TL;DR rails g active_admin:installを実行するとlib/generators/active_admin/install_generator.rbが実行され、ActiveAdmin.routes(self)がconfig/routes.rbに追加される。 app/admin/以下にあるResource定義ファイル内で実行されるActiveAdmin.registerでは、ActiveAdmin::Resourceインスタンスが生成され、動的にResourceごとのcontrollerが生成される。それらはすべてActiveAdmin::ResourceControllerを継承している。 config/routes.rbに追加されたActiv

    activeadmin読んだ - AnyType
  • ghqを読んだ - AnyType

    Goの勉強のため、普段からお世話になっているmotemen/ghqを読むことにした。なお、現在の僕のGoの知識はgotourを完走した程度だ。最初から現在のコミットを追いかけるのは骨が折れそうだったので、最初のコミットbad21c7df65ccefd74530d6fcc5f0707b63e0266から読むことにした。 Goのプログラムはmainパッケージのmain()から実行されるため、main.goのmain()から読む。 import { // ... "github.com/codegangsta/cli" } func main() { app := cli.NewApp() app.Name = "ghq" app.Usage = "Manage GitHub repository clones" app.Version = "0.1.0" app.Author = "motem

    ghqを読んだ - AnyType
  • `rails s`読んだ - AnyType

    rails sでRailsサーバーが起動するまでに何が起きているのかを紐解くことでRailsとは何なのかを理解していきたい。今回読んでいくソースコードのコミットは2d9b9fb5b5f6015e66d3ad5cb96bc1ba117fd626だ。 TL;DR bin/rails sがユーザーによって実行される。 Gemfileで管理されるrubygemをrequireする。 Rails::CommandsTasks#serverを実行する。 config/application.rbをrequireする。 Railsを構成する各rubygemのrailtieをrequireする。 各rubygemのinitializerが登録される。 config.ruが実行される。 登録されたinitializerが実行される。 RailsアプリケーションがRackアプリケーションとして起動する。 コマ

    `rails s`読んだ - AnyType
    clavier
    clavier 2015/01/11
    `rails s`読んだ - naoty.to_s
  • RailsのReloaderの仕組み - AnyType

    Resqueのworker上で実行されるコードが古いまま更新されないというような問題があって、意味もわからず書いたコードでなんとかその場を収めたんだけど、気持ち悪いのでRailsでいかにしてコードが更新されるのか調べてみることにした。 TL;DR 未定義の定数が参照されると、ActiveSupport::ModuleConstMissingによって拡張されたModule#const_missingが呼ばれる。命名規則に基いて定数名からファイル名が推測され、autoload_pathsに存在するファイルを見つける。そのファイルがロード済みであればそこで終了。ロード済みでなければKernel.loadでロードし、ロードされた定数は配列で管理される。 development環境では、Railsのmiddleware stackにActionDispatch::Reloaderというmiddlew

    RailsのReloaderの仕組み - AnyType
  • Web API: The Good Partsを読んだ - AnyType

    Web API: The Good Parts 作者: 水野貴明出版社/メーカー: オライリージャパン発売日: 2014/11/21メディア: 大型この商品を含むブログ (1件) を見る 業務ではiOSアプリとバックエンドの開発を両方担当しているので、APIの設計を何回かやってきた。しかし、自分なりのやり方でやってきた部分が多かったので、最近発売されたWeb API: The Good Partsを読んでちゃんとした設計について学ぶことにした。 得られた学びをメモとして残す。 HATEOAS HATEOAS(Hypermedia As The Engine Of Application State)という設計方法を初めて知った。HATEOASではまず、サーバー側はレスポンスに関連するエンドポイントを含め次にアクセスするAPIを簡単に辿れるようにする。クライアント側は最初のエンドポイント以

    Web API: The Good Partsを読んだ - AnyType
  • pod installしたらgit cloneしてくれるヤツ書いた - AnyType

    ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughtsを拝見して良さそうだったので、iOS開発にも持ち込むためCocoaPodsのプラグインを書いた。20行くらいしか書いてないし、ghqとの連携もまだ実装できてないけど、取り急ぎ。 naoty/cocoapods-src · GitHub 使い方 $ gem install cocoapods-src cocoapodsは入っている前提で、cocoapods-srcをインストールする。 $ pod install インストールすると、あとはpod installすれば勝手にpodsをgit cloneしてくれる。今のところ~/.cocoapods/src/に以下のような感じでダウンロードされる。 $ tree ~/.cocoapods/src -I .git -L 2 .cocoapods/

    pod installしたらgit cloneしてくれるヤツ書いた - AnyType
  • Alamofireを読んだ - AnyType

    Alamofireとは https://github.com/Alamofire/Alamofire Swiftで書かれたHTTP通信ライブラリ。 AFNetworkingの作者であるmatttさんの新作。 AFNetworkingをリプレースするものではなく、AFNetworkingはSwiftでも安定して動くのでそのまま使えるとのこと。(参考: http://nshipster.com/alamofire/の最後の方) ファイルはAlamofire.swiftだけで1000行に満たない。 使い方 Alamofire.request(.GET, "http://httpbin.org/get") .responseJSON { (request, response, JSON, error) in println(JSON) } Alamofire.request(.GET, "http

    Alamofireを読んだ - AnyType
  • PromiseKit/swiftを読んだ - AnyType

    PromiseKitとは http://promisekit.org/ iOSプログラミングで頻繁に出てくる非同期処理を簡単かつエレガントにするライブラリ。 JavaScriptとかでおなじみのPromiseパターンの実装と、各種CocoaフレームワークからPromiseを使うための拡張が含まれている。 Objective-C版とSwift版がある。 使い方 NSURLConnection.GET("http://placekitten.com/250/250").then{ (img:UIImage) in // ... return CLGeocoder.geocode(addressString:"Mount Rushmore") }.then { (placemark:CLPlacemark) in // ... return MKMapSnapshotter(options:op

    PromiseKit/swiftを読んだ - AnyType
  • 1