この記事は Crystal Advent Calendar 2015 の3日目の記事です。 昨日は、kfly8 さんによる Hello, Crystal でした。Crystal アプリケーションを Heroku にデプロイして動かすという内容で、自分も書いてある通りにやってみたんですが、buildpack もあるのでサクっと動かせて素敵でした!しかし、ここはリスペクトを込めて一言言っておくべきでしょう。「このぱくり記事め! (ごめんなさい)」 TL;DR Crystal の API リファレンスの Dash Docset を作りました。 使ってみたい方は ここ からダウンロードして、 を Dash に読み込んでください。 Dash Docset さて、タイトルにある通り、この記事では Crystal の Dash Docset を作ります。 Dash というのは OS X 用の API ドキュメントブラウザーで、もうこの時点で OS X ユーザーじゃなかったり Dash…

READ MORE >>



Rails アプリケーションの開発をするとき、頻繁にメソッドの定義内容や Gem のコードを参照することがあります。そこで、ソースコードタグ付けツールの GNU GLOBAL (gtags) を使ってその作業を少しでも楽に、快適にしたい、という話です。 タグ付けツールでは ctags が有名で、こっちは Ruby や Rails での利用例も結構見つかる (ほとんどは Emacs ではなく Vim ですが) のですが、GLOBAL は定義へのジャンプだけでなく、参照へのジャンプもできる点が優れています。ビルトインパーサーが対応している言語が少ないのが難点なのですが (Ruby も未対応)、プラグインパーサーとして先の ctags と Pygments を利用することで、多くの言語に対応させることが可能です。 やりたいこと 以下を実現するのが目的です。 アプリケーションコードで「定義」「参照」「シンボル」のタグジャンプを使えるようにする アプリケーションが利用している Gem のコードに対しても同様にタグジャンプの対象にする GLOBAL の gtags…

READ MORE >>



「Rails3レシピブック」を読んでいて、「 カウンタキャッシュ 」の設定方法が出てきた。 このように、モデルの関連において参照元で に というパラメータを与えると、そのモデルのコールバックで参照先のカウンター用カラム ( ) が自動的に増加/減少するというもの。 「Rails3レシピブック」では、上記の という書き方だけが紹介されていたけど、RailsGuides で該当箇所 ( 4.1.2.3 :counter_cache ) を参照したみたところ、(Rails 4 で追加されたのかもしれないけど) 以下のように指定することで、任意の参照先のカウンタ用カラム名を任意のものにすることもできるみたいだった。 「ほう、するとカウンタキャッシュはどうやって設定されてるんだろう?」と思ってコードを少し眺めてみたら、これがなかなか面白そうだったのでちゃんと読んでみることに。もしかしたら、最近 Ruby コードの Crystal 移植をやったりしてたので、こういう型が自由 (ハッシュの値が bool…

READ MORE >>



簡単な API サーバーを作る必要があったので、Elixir の WAF である Phoenix を使ってみました。API バージョンでスコープを分けた RESTful API 構成にしようとしたのですが、なんだか結構ハマってしまったので簡単な手順を残します。 と という2つのフィールドを持つ という単純なリソースを例とします。 アプリケーションの作成 タスクで新規の Phoenix アプリケーションを作成します。このとき、今回は REST API リソースを構築するので、アセットを管理するためのツールである は不要です。したがって オプションをつけて実行します。 これで、Phoenix アプリケーションの雛形が作成されるので、まずは出力された指示にしたがってデータベースの作成をします。 ただ、以下のエラーが出力されて、データベースの作成に失敗することがあります。 これは、Phoenix が利用する というロールが Postgres…

READ MORE >>



これからも Volt 推しでいきます。 「Volt を試してみたいけど、例やチュートリアルが少ない」という意見をしばしば聞きます。確かに、公式ドキュメントのチュートリアルはホントに触りだけで、モデルすらほとんど出てこない内容です。 そこで、モデル側の実装やユーザー機構にも少し触れることができる「 Volt を使って10分でリアルタイムチャットアプリケーションを作る 」というチュートリアルを公開します。「10分」というのはとりあえず何かこういうフレーズがあった方がキャッチーかな、と思って適当に付けただけなので、本当に10分でできる保証はどこにもないですすいません。 それと、「公開します」って言っても、実はこのチュートリアルは以下のスクリーンキャストの内容をほぼそのまま作っていますので、英語で全然 OK ってことなら、そっちを見てもらった方が動画なのでわかりやすいかもしれません。 Build a Realtime Chat App with Ruby and Volt 事前準備 このチュートリアルでは、事前に Volt と MongoDB をインストールしておく必要があります。Volt…

READ MORE >>



Rails の scaffold やらで作ってくれるビューに「Destroy」リンクありますよね。あれ、削除の確認のために JavaScript で のモーダルダイアログまで出してくれてなかなか親切なヤツなんですけど、せっかくだから見映えももうちょっといい感じにしたい。 ついでに、Github でリポジトリを消すときとかのように、誤って削除することがないようにユーザーに対して入力も求めたい。 自分で書こうとしたんですが、その前に探したらいいのがありました。探してよかった。 Data-Confirm Modal という gem でございます。 Data-Confirm Modal Data-Confirm Modal は Rails の jquery-ujs をフックして、表示されるモーダルダイアログを Bootstrap のやつと差し替えてくれるライブラリです。 Bootstrap を使うのでそれが制限と言えば制限ですが、簡っ単にダイアログをいい感じにできます。もちろん、やりたかった GitHub…

READ MORE >>



作っている Rails エンジンの設定を外からやりたくて、どうやるのがいいのかな?と調べてみました。要は、エンジンの挙動をコントロールするための変数なりをエンジンに用意しておいて、マウントする側の親アプリケーションから値を設定したいということですね。 RailsGuides に書いてある方法 RailsGuides のエンジンチュートリアル で紹介されているのは、エンジンのモジュールに を設定しておいて、親アプリからそのアクセサを介してモジュール変数 (モジュールのクラス変数というべき?) にその値を設定するという方法です。 lib/myengine.rb (エンジン側) config/initializers/myengine.rb…

READ MORE >>



Mac のシスログを読もうとしたら gzip で圧縮されてて、その内容を読みたかったときの話です。 最近の Linux だったら とか とかでそのまま を余裕で読めちゃうし、そもそも Mac で圧縮されたログファイルを読みたかったことが今まで一度もなかったようで困ってしまいました。 結論 、 を使う。以上。 ほんとに知りませんでした。今まで偉そうにしててどうもすみません。 なるほどなるほどー コマンド兄弟には、他にもこういう人たちがいるようです。 そして、 については、元々は Linux でも、 で圧縮された ファイルを読むために使う で圧縮された ファイルを読むために使う というように分かれていたようなのですが、現在は で も読めるようになっているのだそうです。ncompress パッケージがなくなって、gzip が compress のバックエンドに使われるようになって変わったのかな…まあ便利に使えるってことで、経緯なんてぶっちゃけ何でもいいんですけどね!

READ MORE >>



Heroku の推奨する Ruby Web サーバーが Puma に変更になったとのアナウンスがありました。 Puma is Now the Recommended Ruby Webserver もともと、何となく「1 Dyno で動かすなら Unicorn より Puma の方がいいんじゃないのかな?」とか思って Puma を好んでいました (ただ、ぶっちゃけロクに調べておらず、この考えはたぶん間違ってたと思う)。 が、Rails アプリが 1 つあって、その Web サーバーが Unicorn だったのでこの機会に変えました。 一応ここにその手順を書いておきますが、 Deploying Rails Applications with the Puma Web Server を読んだ方がずっと良いでしょう… Migrate from Unicorn to Puma Heroku の推奨する構成にしたがって変更するだけならあっという間です。 Gemfile に Puma を追加する に Puma を追加します。同時に、不要になる Unicorn…

READ MORE >>



ブログのようなアプリケーションを作ろうとしていて、フォームのテキストエリアをリッチテキストエディタ化するために tinymce-rails を使おうとしています。当然そこで入力した内容は HTML になるので、表示するときには などでエスケープされないようにしないといけません。 が、やっぱり raw html をそのまま出すのは怖いので の メソッド を使ってみることにしました。 メソッドはホワイトリスト方式で動作し、許可されているタグの要素や属性以外を削除します。デフォルトでも とかを掃除してくれたので、そのまま使ってもいいかと思ったんですが、許可するタグと要素を明示的に設定しました。 ヘルパーを呼び出すときに指定する ヘルパーを呼び出すときにはこんな感じで指定します。 アプリケーションのデフォルト設定として指定する にこんな感じで。 カスタム Scrubber なんかも定義できるみたいですが、とりあえず今は不要なのと、眠すぎるのでこれだけ。

READ MORE >>