サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
パリ五輪
archive.aerial.st
OSX LionにはPostfixがインストールされているんだけど、これを使ってgmail経由で送信する際に一筋縄では行かなかったのでメモ。 まず /etc/postfix/main.cf に以下を追記して、gmailの587番ポートに接続するよう設定する。 relayhost = [smtp.gmail.com]:587 smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_tls_security_options = noanonymous smtp_sasl_mechanism_filter = plain smtp_tls_security_level = secure smtp_tls_CApath = /et
間違えてgit reset(–soft/–hard問わず)してしまった場合とか、取り消すのはいいんだけどコミットログは見たいとか思ったら、 git show ORIG_HEAD すれば良い。 ORIG_HEADはgit resetする直前のHEADの状態を指しているので、git diffで差分を見るといったこともできる。 git diff ORIG_HEAD 参考 「Gitを使いこなすための20のコマンド」のgit resetの項
ActiveRecord 3.1でMySQL2アダプタを使っている場合に、idカラム(プライマリキーのカラム)にBIGINT UNSIGNEDを使う方法。 まずCREATE TABLE時のidカラムの型を変更するために、ActiveRecordが読み込まれた直後、rakeタスク等でテーブルの作成が行われる前に次のように上書きする。 ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:primary_key] = \ "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY" あとは各マイグレーションファイルで、外部キー(*_idってやつ)のカラムの型にBIGINT UNSIGNEDを指定する。 t.column :user_id, "BIGIN
Auto Increment with MongoDBより、Mongoid/MongoDBでMySQLのauto incrementみたいなことをする方法。 連番を保持するためのCollectionを用意して、新しくDocumentを作る際にそれをfind_and_modifyで1増加させるという方法をとる。 find_and_modifyを使うので、MongoDBは1.3.0以上、Mongoidは2.2.0以上が必要になる。 まずは連番を保持するためのCollectionを用意する。 class Seq include Mongoid::Document field :collection, type: String field :seq, type: Integer end auto increment的なことがしたいCollectionではbefore_validateのタイミングで
MySQL 5.0.x 以下の例でcount(*)はcount(foo)と同じ。 全データ fooとbarの2カラムがあって、それらの値はいくつか重複している。 mysql> select * from hoges; +----+------+------+---------------------+---------------------+ | id | foo | bar | created_at | updated_at | +----+------+------+---------------------+---------------------+ | 1 | 1 | 11 | 2009-07-27 16:35:23 | 2009-07-27 16:35:23 | | 2 | 2 | 12 | 2009-07-27 16:35:23 | 2009-07-27 16:35:23
毎回Herokuを使ってみようと思うたびに手順を忘れるのでメモ。 アプリケーションの準備 hello_herokuというRailsアプリケーションを作ることにする。 Herokuの標準のDBがPostgreSQLなので今回もそれを指定する。 Test::UnitとPrototype.jsは要らないので-JTする。 $ rails -v #=> 3.0.9 $ rails new hello_heroku -JT -d postgresql $ cd hello_heroku いつもどおりgitリポジトリを作る $ git init $ git add . $ git commit -am "initial commit" 専用のRVM gemsetも作っておく。 $ rvm use 1.9.2@hello_heroku --create $ echo "rvm use 1.9.2@hell
今動いているサービスが (INTERNET)-[varnish]-[Starman/Catalyst] というような構成でvarnishでCSSや画像なんかの静的ファイルをキャッシュしているんだけど、 現状デプロイしたけどキャッシュが更新されなくて見えてる画像が新しくなってないよって現象がある。 一応varnishを再起動すればキャッシュはクリアされるけど、 一つのvarnishの下に複数のサービスがぶら下がっているので、 一つのサービスのデプロイのためにそれ以外の全てのサービスのキャッシュをクリアするのも大変微妙。 で、そういえば、先日Railsのimage_tagを真似て作ってみたMyApp::View::Plugin::Tsを使って画像のURLなどに更新時刻を付加すれば、 varnishがそこをみて新しくキャッシュしてくれるようになるんじゃないか?と思った。 そのためにはvarnis
第5回 MongoDB.jp 勉強会 in Tokyoに行ってきた! メモとかはまたのちほどアップするとして(そういえばRubyKaigi最終日のメモもアップできていない)、@yuki24 さんの発表で「ActiveRecordとMongoidは共存」できるという話を聞いて、ちょっと試してみた。 その過程で適当に作ったコードをgithubに上げておく。Todoを作成・更新した際にその内容をTodoLogに吐き出すというモノ。 mongoidのインストール これは普通に。 $ gem install bson_ext mongoid $ rails g mongoid:config Mongoidのモデルの作成 mongoidをインストールするとmodelジェネレータがmongoidのモデルファイルを生成してくれる。 $ rails g model todo_log title:string
今日も午後から参加してきた。@a_matsudaさん、@yharaさんの話が聞けなくて、寝坊してしまったことを激しく後悔している。 5 years know-how of RSpec driven Rails app. development. / @moro 最近のrspecやfixture-replacementを使ったテストの書き方のノウハウ。 fixture-replacementはFabricationを使ってるみたい。 寝坊して最後の5分しか見られなかったけど、早くもスライドやUstが公開されているのでそちらをチェックしよう。 shared_context fixtureはマスタ、fixture_replacementはリソース、beforeはイベントが向いてる 適宜使い分けるといい Rails3レシピブック買いました! Efficient JavaScript integra
午後から参加してきた。 とりあえず箇条書きのメモを載せておく。あとで感想を書こう。 Ruby を利用した大規模ウェブサービスの開発・運用 / @hotchpotch cookpadの中の話。extensionsがとても興味深かった。 この後のgithubとかもそうなんだけど、テスト=CIがもう当たり前なんだな、という感じがした。 1.8.7/2.3 varnish 30ms tofu solr 集合を扱う(Facet 重み付け検索(Boost Search 動的なフィールド追加(Dynamicfields 速度は変わらない、検索の柔軟性 空間検索できるらしい amebaの事例http://www.cyberagent.co.jp/news/press/2010/0708_2.html ベストに集中 シンプル キャッシュにのりやすい 非同期を活用 共通部分とユーザ固有とを分けることでキャッシ
「Ruby on Rails 3 アプリケーションプログラミング」のルーティングの項をパラパラとめくっていたら、scopeを使ってtwitterっぽくトップレベル(?)にユーザ名を持ってくるようなルーティングができることを知ったのでメモ。 概要 例えばroutes.rbには次のように記述したとする。 scope ':uid' do resources :todos end このとき次のようなURLでアクセスすると、USERNAMEの部分をparams[:uid]で受け取ることができる。 http://scope-routing-sample.dev/USERNAME/todos サンプルアプリを作ってみた 早速サンプルのTODOアプリを作ってgithubに上げてみた:scope-routing-sample 次の手順で動く、はず(bundler, rvm, pow, powderが導入済み
とりあえず動かしてみたのでメモ。 unicornを動かす まずはgemをインストール。 $ gem install unicorn unicornの処理を設定する $ cd <RAILS_ROOT> $ vi config/unicorn.rb <RAILS_ROOT>/config/unicorn.rbはこんな感じ(nginx + unicorn を試してみたからほぼそのまま拝借): # ワーカーの数 worker_processes 2 # ソケット経由で通信する listen File.expand_path('tmp/sockets/unicorn.sock', ENV['RAILS_ROOT']) # ログ stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT']) stdout_path File.exp
iPhoneアプリを開発する際にiPhone Dev Centerでやる作業がこまごまとして面倒くさいので、そのときに参考にしたサイトをまとめておく。 テスト端末の登録 アプリを実機で動かす を参照。 このときProvisioning Portalで作成したAppIDは申請フローの際に使い回す。 審査の申請フロー 全体の流れは 【iPhone】App Store申請用アプリをビルドする を参照するとよい。 審査をするアプリを作る際のDistributionというConfigurationの作り方は 目指せ!iPhoneアプリ開発エキスパート 第10回 App Storeでアプリを開 を参照。 申請の際、スクリーンショットの追加方法がちょっと分かりづらい。 Choose Fileボタンでファイルを追加していき、Upload Filesボタンで一気にアップロードする。 このとき優先度の低いもの
fields_for、accepts_nested_attributes_forを使って、has_manyな関連先をまとめてINSERTする方法。ソースはgithubに上げておいた。ちなみにRails 3.0.8。 Post has_many Tags through Taggingsというモデルがあったとする。 とりあえずscaffoldはこんな感じ。Taggingだけは画面が要らないのでmodelだけ。 $ rails g scaffold posts title:string text:text $ rails g scaffold tags name:string $ rails g model tagging post:references tag:references $ rake db:migrate コードの修正で重要なのは次の2点。 app/models/post.rb
geminaboxを使ってローカルにgemをホストしてみる。 (とりあえずでやってみただけなので、手順等にミスがあるかも) まずはサーバを立てる rvmとpowが入っている前提で。 ~/var/geminabox 以下を使うとする。 $ rvm use 1.8.7@geminabox --create $ gem install geminabox $ mkdir -p ~/var/geminabox/data $ echo "rvm use 1.8.7@geminabox" > ~/var/geminabox/.rvmrc $ echo 'require "rubygems" require "geminabox" Geminabox.data = "#{ENV['HOME']}/var/geminabox/data" run Geminabox ' > ~/var/geminabox/
MechanizeはNokogiriに依存しており、Nokogiriはlibxml2とlibxsltに依存している。 libxml2はhomebrewで提供されているのでそれを利用し、libxsltはソースから入れる。 $ brew install libxml2 # libxml2 v2.7.7 $ wget ftp://xmlsoft.org/libxml2/libxslt-1.1.26.tar.gz $ tar zxf libxslt-1.1.26.tar.gz $ cd libxslt-1.1.26 $ ./configure --prefix=/usr/local/Cellar/libxslt/1.1.26 --with-libxml-prefix=/usr/local/Cellar/libxml2/2.7.7 $ make $ make install $ gem instal
git-svnを使うことでsubversionのリポジトリをgitで操作できる。 チェックアウトしてからの作業の流れは次のような感じ。 svnリポジトリからgit-svnでチェックアウトしてきてgitのローカルリポジトリに変換 gitでローカルリポジトリに変更をコミット ローカルリポジトリにコミットされた内容をgit-svnでsvnリポジトリにコミット 以下、参考になるサイトを列挙してみる。 git-svnの使い方を覚えた はgit-svnのチュートリアル。 Git入門 ゼロから始めるGitドリルはgitそのもののチュートリアル。Git/Subversionコマンド対応表なんてものもある。 操作ミスなど困ったときにはGit初心者が絶対に覚えておくべきコマンドや git-svn駆け込み寺などが役立ちそう。 ただgitはsvnとは思想が全く違うので単純に対応はしないと思う。ブランチングのモデル
仕事でperlを触ることになったのでとりえずperlbrewとcpanmを入れてみた。 下準備 とりあえずホームディレクトリにbinを作ってパスに追加する。 $ mkdir -p ~/bin $ export PATH=$HOME/bin:$PATH # ~/.zshrc等にも追加 $ cd ~/bin perlbrewを入れる ホームディレクトリ以下で複数バージョンのperlを管理できる。/usr以下はあまり汚したくないので導入。 perlbrewはデフォルトだと~/.perlbrewに設定ファイルを、~/perl5以下にインストールしたperlを入れてくる。Finderをひらいてperl5が出てくるのも邪魔なので、ここではPERLBREW_ROOTを指定して~/.perlbrewに統一している。もしかしたら悪影響があるかもしれないけど、その時はやり直す。 $ curl -LO http
これは新卒準備カレンダー 2011春という企画に向けたエントリです。 このエントリでは「エンジニアをやるならこれはやっておいて損はないよ」ということを書いてみようと思います。 まだまだ社会人2年目のヒヨッ子なのでそれ以外にも大事なことはあるかと思いますが、 そこはほかの参加者の方々の記事を読んだり、 「プログラマが知るべき97のこと」を読んだりして 補完していただけたらと思います。 その前に、どんな人がこれを書いているのか @ikmと申します。 理系の大学院(非コンピュータ系)を卒業したのち、 現在は某社で携帯電話向けWebサービスの開発をやっています。新卒3年目です。 どちらかというと「プロマネになって大きなプロジェクトを動かしたい」というよりは 「技術力を高めて自分でなにか作っていきたい」人です。 プログラミングは高校生の頃から趣味でやってましたが、未だにへっぽこです。 スーパープログ
Ti.UI.SearchBarを使うとTi.UI.TableViewの絞り込みがとても簡単に実現できる。 たとえばuserの一覧を表示しているTableViewを、user.nameの値で絞り込みができるようにするには、 // SearchBarを作る var searchBar = Ti.UI.createSearchBar({ showCancel: false }); searchBar.addEventListener('change', function(e) { return e.value; }); searchBar.addEventListener('return', function(e) { searchBar.blur(); }); searchBar.addEventListener('cancel', function(e) { searchBar.blur()
ローカルのResources/users.jsonを読み込みたい場合、 // Ti.Filesystem.Fileを返す var file = Ti.Filesystem.getFile(Titanium.Filesystem.resourcesDirectory, 'users.json'); // Ti.Filesystem.File.read()はTi.Blobを返すのでtoString()して文字列に変換 var json = file.read().toString(); // 読み込めていればパースして処理をすすめる if (json && json.length > 0) { var users = JSON.parse(json); : }
Titanium Mobileにはconsole.logが無いらしい。ぐぐってみたらTi.API.info()を使えばいいみたい。 var console = { log: function(str) { return Ti.API.info(str); } }; Ti.API.info()を直で使うべきなのかもなぁ。
githubをうろうろしていたら「なるほど」と思ったコードを見つけたのでメモっておく。 get-twitter-oauth-token / bin / get-twitter-oauth-token (gistじゃないので残念ながら埋め込むことができない。コピペするのも微妙なのでリンクだけ提示しておく) これは@jugyoさん作のコマンドラインからTwitterのOAuthのアクセストークンと秘密鍵を取得するスクリプトで、openコマンドを使ってるあたり多分Mac専用なんだと思う(Linuxとかでもあるのかな?)。 なるほどなーと思ったのはStringを拡張しているcolorとaskという二つのメソッド。 colorはその名のとおり文字列に色をつけるもので、引数numにはANSIエスケープシーケンス(?)で指定できる色の番号を渡す(「bashのプロンプトに色をつける」などを参照。zshでも
jQuery mobileでselect要素を使うとbodyの後部に選択ダイアログ用のdiv要素を追加してそれっぽく表示してくれる(デモ)。 ただAjaxで動的にoption要素を生成するような場合だとjQuery mobileの初期化に行われるDOMツリーの書き換えのタイミングと合わなくて、意図したとおりにoption要素に追加したものがダイアログに表示されなかったりする。 こういうときはとりあえずselect要素にdata-native-menu="true"を追加すれば、ブラウザネイティブの選択ダイアログが使われるようになるので、動的にoptionを追加した場合にも追従できる。 <select name="fruit" data-native-menu="true"> <option>Apple</option> <option>Orange</option> <option>Ban
以前書いたモジュールの特異メソッドをincludeして使うと同じことが、ActiveSupport::Concernを使うことでもうちょっと綺麗に書ける。 module A extend ActiveSupport::Concern included do # Aがincludeされた際に、includeしたクラスのコンテキストで実行される end module InstanceMethods def instance_method_of_a p "instance_method_of_a" end end module ClassMethods def class_method_of_a p "class_method_of_a" end end end class B include A end こんなモジュールをとあるクラスBでincludeすることで、 InstansMethods
watchrで更新のあったファイルに対してrspecを実行する方法。 secondlifeさんの記事を読んで、取り急ぎやってみた。 $ gem install watchr $ gem install ruby-fsevent # Mac OSXの場合 $ gem install rev # Linux/*BSDの場合 $ cd (RAILSアプリのルートディレクトリ) $ vi spec.watchr watch('app/(.*)\.rb') { |md| system("ruby script/spec spec/#{md[1]}_spec.rb") } watch('spec/(.*)_spec\.rb') { |md| system("ruby script/spec #{md[0]}") } $ watchr spec.watchr autospecより汎用性があって便利かも。
さくらたんどっとびーず](http://sakuratan.biz/archives/3101)を読んだりして、node.jsをちょっと触ってみようかと思ったのでhomebrewでnode.jsとnpmを入れてみた。 やり方はnode.jsを試してみた « cyclogyを参照した。 $ brew install node.js npm $ export PATH=/usr/local/share/npm/bin:$PATH $ export NODE_PATH=/usr/local/lib/node 注意点としては、npmのパッケージをcurlで落としてくるときにプロキシにひっかかってた点。curlでプロキシ越しにやりとりするにはALL_PROXYを設定する。Homebrew behind a proxyを参照。 $ export http_proxy=http://my.proxy.c
以前の記事が恐ろしく分かりにくいので、軽くまとめ直す。 module A def instance_method_of_a puts "A#instance_method_of_a was called." end module ClassMethods # A::ClassMethodsで定義されたインスタンスメソッドは、 # Aをincludeしたクラスのクラスメソッドとして利用できる def class_method_of_a puts "A::ClassMethods.class_method_of_a was called. Not A.a_class_method!" end end def self.included(mod) # ModuleのインスタンスmodがAをincludeした際に呼び出され、 # A::ClassMethodsのインスタンスメソッドをmodに特異メ
昨年12/18に行われたRails勉強会@東京第58回に行ってきた。 テストの話 「テストの話」で大まかに扱われるけど、細かく見ると次の3つの話題が出てくる。 どうやってテストを書くか うまいテストの仕方・資産としての残し方 テストの文化の浸透のさせ方・継続の仕方 今回は@moroさんをファシリテータとして、「rspecでテストをどう書くか」と「RelishでRspecの新機能を見る」の2点を行った。 話題がバラバラになりがちなので、進行をされた@moroさんはすごいなと思っていたんだけど、ここらへんをうまくカバーできるやり方を見つけたいと思う今日この頃。 で、その時の結論をうけた上で今覚えてる限りの結論。 どうやってテストを書くか (いつか書く) うまいテストの仕方・資産としての残し方 今回は出なかったけど、捨てるテスト、残すテストの話、かなぁ。 開発時の内部実装まで含めた、細かい挙動確
次のページ
このページを最初にブックマークしてみませんか?
『archive.aerial.st』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く