サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
掃除・片付け
spitfire-tree.hatenadiary.org
Android アプリケーションで cookie を管理する際、デフォルトの動作はアプリとは非同期で揮発性のメモリに展開された値を最大数分(?)程度の遅れで不揮発な領域に書き込みに行くようです。 この辺り、過去のバージョンの情報などが錯綜していて分かりにくかったのですが、実装自体は記事執筆現在でも変化していない様子。 何がまずいのか 普通にアプリケーションを動作させている分には CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setCookie(url, val); などで揮発性メモリの値は書き換えられているのですが、例えば WebView からのログインを cookie で制御している場合。 session[:user_id] = user.id のような処理は実際には cookie に {
html から簡単に PDF が作れる便利なプラグインですが、割と面倒な行程が必要だったのでメモ。Rails 4.1 で確認しました。 インストール Gemfile で以下のように記述します。 gem 'wkhtmltopdf-binary' gem 'wicked_pdf' が、環境によってはこれでは動作しません。具体的に言うとコンソールで wkhtmltopdfと叩いてパスが通っていないなら動作しません。 この場合、自分で wkhtmltopdf をインストールした後 config/initializers に wicked_pdf.rb というファイルを作成し、環境にあわせて実行パスをフルパスで設定します。 WickedPdf.config = { :wkhtmltopdf => '/path/to/wkhtmltopdf' } 2014-09-25 追記 上記の設定では、追記現在の
Rails 4 では 404 系のエラー発生時にデフォルトで public/404.html を表示してくれるのですが、ヘッダーやフッターはエラーページでもそのまま利用したいケースなどでは自分で表示を制御する必要があります。 以下でその方法について記述します。 routes.rb の変更 まずは routes.rb を開いて、必ず一番下に次のようなルーティングを記述します。 get '*path', controller: 'application', action: 'render_404' Rails 3 系までは match を使えば良かったのですが Rails 4 からは match は廃止されているため、わざわざ POST でアクセスしてくるケースにまで対応する必要はないと判断して、とりあえず get で記述する事にしました。 コントローラー側の変更 ルーティングは定義したので、
表題の件について datepicker の導入を例に説明します。 まずは Gemfile を更新。 gem 'jauery-rails' この下に gem 'jauery-ui-rails' を追加します。終わったら bundle install をお忘れなく。 次に app/assets/javascripts/application.js を更新。 // require jquery // require jquery_ujs ここを次のように変更。 // require jquery // require jquery.ui.core // require jauery.ui.datepicker // require jquery_ujs なお、ここでは datepicker を使うのに必要なライブラリを読み込む場合はこれで完了ですが、他のライブラリもすべて読み込む場合は次のように
jQuery 1.9 を用いて textarea の現在のカーソル位置にテキストを挿入します。動作は IE 6 〜 9, Chrome, FireFox の最新版で確認。 function insertAtCaret(target, str) { var obj = $(target); obj.focus(); if(navigator.userAgent.match(/MSIE/)) { var r = document.selection.createRange(); r.text = str; r.select(); } else { var s = obj.val(); var p = obj.get(0).selectionStart; var np = p + str.length; obj.val(s.substr(0, p) + str + s.substr(p)); o
表題の通り Rails 3.2.X 系の request.remote_ip に入っている値について調べました。 最初に結論 リクエストヘッダを読み HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, REMOTE_ADDR の順にセットされていた値を取得してきます。 ソースコード http://api.rubyonrails.org/classes/ActionDispatch/RemoteIp/GetIp.html 上記 API にも記載されていますが calculate_ip が該当のメソッドです。 # File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 47 def calculate_ip client_ip = @env['HTTP_CLIENT_IP'] forwarded
表題の通り hoge テーブルの fuga 列にインデックスを作成しても CREATE INDEX hoge_fuga ON hoge(fuga); 条件に IS NULL を含む検索ではインデックスは利用されません。 SELECT * FROM hoge WHERE fuga IS NULL; 結果、上の SQL はレコード数が増えると低速になる可能性が高まります。 このような場合、部分インデックスを利用するとうまく動きます(PostgreSQL の場合 7.0.0 以降の対応です)。 CREATE INDEX hoge_fuga_null ON hoge(fuga) WHERE fuga IS NULL;
表題のとおりのサンプルプロジェクトを作成します。 まずはプロジェクトを新規作成します。 rails new sample_uploadscaffold でアップロード機能を作成、この辺はいつもどおり。 bundle exec rails g scaffold attachments title:string path:text何かと不便なのでルーティングを定義しておきます。 root 'attachments#index' 終わったらマイグレーションを通しましょう。 bundle exec rake db:create bundle exec rake db:migrate次に app/models/attachment.rb を編集し、ファイルがアップロードできるようにします。 class Attachment < ActiveRecord::Base attr_accessor :fi
あるテーブルのすべてのフラグを false にしたい時に、件数が多くなる事が予想されたので1000件ずつ処理しようと考え、次のようなコードを書きました。 while Hoge.where("flag IS true").count > 0 sql = "UPDATE hoge SET flag = false WHERE flag IS true LIMIT 1000" Hoge.connection.execute(sql) end 一見正しく動作しそうなのですが、このまま動かすと見事に無限ループになります。ログを確認すると次のような気になる箇所を発見。 CACHE (0.0ms) SELECT COUNT(*) FROM `hoge` WHERE (flag IS true)どうやら、最初の count で計算したレコード数をキャッシュして延々同じ比較を行ってしまっている様子。このよう
アプリケーション開発中に何らかの理由(主に Rails のバージョン更新)で bundle update を実行する際の注意点について。 アプリケーションサーバ(Webrick, Passenger, Unicorn 等)を起動した状態で bundle update を叩くと Gemfile.lock の更新が行われず、再起動時に以下のようなエラーになります。 Bundler could not find compatible versions for gem "activesupport": In snapshot (Gemfile.lock): activesupport (3.2.1) In Gemfile: rails (= 3.2.2) ruby depends on activesupport (= 3.2.2) ruby Running `bundle update` wil
タイトルの通り rvm でインストールした Ruby 1.9.3 で OpenSSL ライブラリを用いた時にエラーになりました。テストに使ったスクリプトは以下の通り。 require 'net/https' https = Net::HTTP.new('encrypted.google.com', 443) https.use_ssl = true https.verify_mode = OpenSSL::SSL::VERIFY_PEER https.request_get('/') 返ってくるエラーは次のような内容。 SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)回避策として ruby が参照して
三周遅れくらいの話題ですが、最近お仕事で扱うデータのサイズや件数が増えて来て困る事が多いので今後に備えて。 MongoDB のインストール Windows でも Mac でもバイナリが配布されているのでダウンロードして解凍するだけで動き Linux の場合も大体のパッケージ管理システムから導入可能です。ただし 32bit 環境はあまり推奨されないようです。 http://www.mongodb.org/downloads 今回は手元の Mac から動かすので、上記ダウンロードページから OS X 64-bit のものをダウンロードし、解凍します。解凍されたディレクトリにはライセンスに関するドキュメントに並んで bin というディレクトリが内包されており、そこに MongoDB のサーバにあたる mongod と、クライアントにあたる mongo のバイナリその他が入っています。 とりあえず
以下 Rails 3.2.2 について記述します。 scaffold 等で作られる削除のリンクは次のようになっていると思います。 <%= link_to 'Delete', users_path(@user), :method => :delete, :confirm => 'Are you sure?' %> これと同じコードを手で書いて使おうとしたのですが、なぜか正しく動作せず、少しはまってしまいました。結論から言うと、このコードが生成するリンクタグを動作させるには最低限 jquery.js と rails.js を読み込む必要があります(もちろん、それらの動作に対応したブラウザを使う必要もあります)。 そういうわけで、上記のコードを用いる時はレイアウト等で <%= javascript_include_tag "application" %> と記述するのを忘れないように気をつけてく
ストアドプロシージャにまつわる諸々は MySQL のマニュアル等をご参照のこと。ここでは SQL レベルのお話にとどめます。 MySQL 側でストアドプロシージャを用意する 今回はきわめて簡単な SELECT 文をストアドプロシージャとして定義します。 CREATE PROCEDURE sampleProc() SELECT * FROM posts; 正しい権限で実行していれば、ストアドプロシージャが作成されるはずです。 Rails 側からストアドプロシージャを呼び出す 呼び出しには find_by_sql を利用します。 posts = Post.find_by_sql("CALL sampleProc()") また ActiveRecord::Base.connection.execute を使う場合、事前にコネクションの情報を取得しておき、適宜 flush を行ってあげる必要があり
完全に自分用の備忘録。VirtualBox にインストールした CentOS5.6 に表題の環境を構築してサーバを動かすまで。 サーバのメモリは512Mでパーティションは40Gと、(記事執筆時では)一般的な低価格帯 VPS を意識したスペックに調整してあります。 また、すべての作業は su で root ユーザに昇格した上で行う前提になっているので sudo を使う場合適宜置き換えて下さい。 必要なパッケージのインストール 今後の作業に使うパッケージを yum からインストールしておきます。 yum install gcc gcc-c++ openssl* readline* ncurses* zlib* libxml* libjpeg* libpng* libxslt* libtool* MySQL のインストール これも yum からインストールします。 yum install mys
ActiveRecord には SSL によるデータベースアクセスをサポートする機能が付属しているので、それを使って通信を暗号化してみます。検証には VirtualBox にインストールした CentOS 5.6 を使用し、作業はすべて root ユーザで行いました。 前提 mysql と openssl は yum からインストールしており Rails アプリケーションを通常の方法で動作させる環境は整っているものとします。 証明書の作成 今回は動作の確認が目的なので、自己証明書を使ってテストします。証明書の作り方は以下のアドレスを参考にしました。 http://blog.livedoor.jp/burtman/archives/51962114.html 記事中で www.hoge.com となっている箇所を 192.168.1.156(テスト用仮想マシンのプライベートIP)に置き換えて
ApplicationController に以下のような認証用のメソッドを定義する事は、よくあると思います。 # coding: utf-8 class ApplicationController < ActionController::Base # 略 def current_user # ログイン中のユーザオブジェクトを返す end def logged_in? # ログイン状態を返す end # 略 end こうした機能のテストはどう行えばいいのか悩んでいましたが AnonymousController を利用するとうまく書けるようです。 # coding: utf-8 require 'spec_helper' describe ApplicationController, "認証" do controller do def index @user = User.create!(
表題の通り、なぜか Scaffold で作った date_select が動かなかったので。Can't convert Symbol into String だそうなので、エラーを追いかけるとどうやら config.i18n.default_locale = :ja とした時に date_select にきちんと値が渡らなくなる様子。該当する値を RAILS_ROOT/config/locales/ja.yml に追加。 ja: date: order: - :year - :month - :day これで動くには動く…のですが、月の値の表示が何やらおかしくなります。仕方ないので以下のように数字で表示するようオプションをつけてあげると、とりあえず回避できました。 <%= f.date_select :occured_on, :use_month_numbers => true %>
Ruby 1.9.2 + Rails 3.0.3 の環境で表題のエラーが発生。データベースからマルチバイト文字列を取得する事は出来るのですが、多言語対応のための config/locales/ja.yml やビューの日本語が読み取れない様子。エラーの原因をトレースしていくと、以下のファイルに突き当たりました。 /path/to/app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.0.3/lib/active_support/core_ext/string/output_safety.rb上のパスは bundle install --path vendor/bundle を指定してアプリケーション内に gem をインストールした場合の位置なので、環境に合わせて場所を調べてみて下さい。エラーが出ていた concat メソッドを書き換えます。 de
社内でテスト運用しているアプリを Rails 3.0 + PostgreSQL 9.0 + Unicorn + Nginx で動かそう!という話になって、とりあえず Unicorn 単体で Rails アプリを起動するところまでこぎつけたのですが、なぜか public 以下に置かれたファイルが 404 Not Found に。 なぜ?と思ってログを参照すると、どうやら静的ファイルも通常のルーティングで処理しようとしている様子。つまり stylesheets/application.css なら stylesheets コントローラの application というアクションを css 形式で呼んでいる、と。 これを回避するには Rails 側の設定で config/environments/production.rb に config.serve_static_assets = true
Ruby に標準でついている Benchmark モジュールを使ってベンチマークを取ります。 まず、環境によっては require が必要なのでチェックします。 require 'benchmark' ruby 1.8.7 の場合 false が返されますが、問題なくベンチマークを取る事ができます。次にベンチマークの使い方。 time = Benchmark.measure do # logic end puts time コメントの行に確認したいロジックを入れる事で、実行時間が確認できます。Ruby on Rails の script/console からでも実行時間を確認できるので、ログを追いかけたり開発環境を用意せずにメソッドの実行時間を確認してみたい時に便利だと思います。 なお puts で出力される値の意味を知りたいときはキャプションを確認します。 Benchmark::CAPT
Rails で静的コンテンツを置く場所は RAILS_ROOT/public 以下が一般的です。ですが、レイアウトは共有したいとか、そもそも公開された場所に置きたくないという場合は少し工夫する必要があります。 今回は html を任意に呼び出して表示するサンプルを載せてみます。静的なファイルは RAILS_ROOT/pages ディレクトリ以下に『名前.html』の形式で配置されているものとします。 実装 まずはコントローラを作成します。名前は pages_controller にします。 class PagesController < ApplicationController # レイアウト指定 application.html.erb を使うなら不要 layout 'some_layout' def show if params[:page] && File.exists?(path
例えば次のような scope を costs.rb に定義します。 class Cost < ActiveRecord::Base scope :next, lambda{|day| where(["occured_on > ?", day]).order("occured_on").first } end これはシンタックスエラーにはなりませんが、実行すると次のようなエラーになります。 NoMethodError: undefined method `includes_values' for # これは scope が ActiveRecord のオブジェクトを返さないといけないためで、first を使うと単体のモデルが返されてしまい、エラーになります。上のようなケースでは first を外に出してあげると問題なく動作するようです。 class Cost < ActiveRecord::
本題に入る前に、そもそも RJS とは何なのかを説明すると、本来 jQuery の $.ajax() などを使ってごりごり書かないといけなかった JavaScript による非同期通信をフレームワーク側で吸収して、通常の html ビューのレンダリングと同じ感覚で記述できるように用意されたものです。 この「通常の html ビューのレンダリングと同じ感覚」というところは重要なポイントです。コントローラ内にも RJS のメソッドは直接記述できるのですが、本家 Rails のガイドラインでは以下のように勧告しています。 Placing javascript updates in your controller may seem to streamline small updates, but it defeats the MVC orientation of Rails and will ma
びぼうろく。Mac OSX 10.5 上で Rails 3.0 と RSpec 2.0 を使ってテストをします。 インストール 利用する gem を RAILS_ROOT/Gemfile に記述します。 group :development, :test do gem 'rspec', '>=2.0.0.beta.20' gem 'autotest' gem 'rspec-rails', '>=2.0.0.beta.20' gem 'webrat' end ブラウザのシミュレーションには webrat と capybara が使えるようですが、本家サイトによると Note that Capybara matchers are not available in view or helper specs. との事なので一応 webrat を選択。 記述が終わったらインストールを行います。 bu
備忘録。Mac OSX 10.5 環境で Rails 3.0 を使って cucumber でテストを書きます。 インストール 主に下のリンクを参照しました。 http://d.hatena.ne.jp/yuunachan/20101004/1286161317 なお、私の環境(Mac OSX 10.5)では Nokogiri が libxml2 のバージョンが古すぎる!と警告を出してきますが、とりあえず動作に問題はなさそうなので今回は無視する事にします。さらに、元記事に従って capybara も採用する方向で話を進めます。 まずは RAILS_ROOT/Gemfile を編集します。データベースは postgres を使うので、そこもあわせて編集。ここは各自の環境にあわせて下さい。 # gem 'sqlite3-ruby', :require => 'sqlite3' gem 'pg'
UIScrollView のタッチイベントを取得するには UIScrollView のサブクラスを作って、タッチイベント関連のメソッドをオーバーライドします。大体の場合、フリックやピンチとは別でタッチイベントを取りたいと思うので、その方法を。 まずは UIScrollView のサブクラスを定義します。名前は MyScrollview とでも名付けます。次に、以下のように touchesEnded メソッドをオーバーライドします。 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) { [self.nextResponder touchesEnded: touches withEvent:event]; } [super touchesEnded: touches wit
はじめに epub とは iPhone をはじめとした各種デバイスで採用されている公開電子書籍フォーマットの事です。epub リーダを作る前に、いったい epub とは何なのかについて簡単に説明します。非常に乱暴にまとめると、「epub とは特定の形式に従った xhtml ファイルとマニフェストの集まりを zip 圧縮した後、拡張子を epub に変更したもの」だと言えます。そこでこの記事では、ファイルの解凍と読み込みの2段階に分けて解説していこうと思います。 ファイルの解凍 ファイルの解凍には、次のライブラリを利用させてもらいました。 http://code.google.com/p/ziparchive/ このライブラリを使うために、まずは iPhone 向けに用意された zlib のフレームワークを読み込む必要があります。XCode 左部の「グループとファイル」から「Framewor
某社の皆さんにも確認したのですが、やはり blog のサイドバーのような(公開されている)すべてのページに含まれる動的アイテムは partial や helper と before_filter などで用意するのが一般的なようです。以前存在した components という考え方は Rails 2.0 への移行時に非推奨になった様子。 個人的に helper や view にデータ操作を入れたくないので before_filter との合わせ技を採用。「表側」のコントローラに一枚専用のコントローラをかませます。 class PublicController < ActionController before_filter :setup_view_items def setup_view_items @categories = Category.find(:all) end end 表で使う
次のページ
このページを最初にブックマークしてみませんか?
『happy lie, happy life』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く