サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
2024年ランキング
ikm.hatenablog.jp
Ruby 3.2 から libyaml や libffi などのソースコードがバンドルされなくなった*1らしく、その影響で次のようなエラーが出た。どうやら libyaml が見つからないらしい。 $ rbenv install --verbose 3.2.0 (snip) yaml.h not found (snip) psych: Could not be configured. It will not be installed. Check ext/psych/mkmf.log for more details. *** Fix the problems, then remove these directories and try again if you want. Generating RDoc documentation /private/var/folders/jr/yc04b
OS のバージョンによって変わっているかもしれない。 :memo: Sonoma 以降に対応した記事を書いた。 確認ダイアログのボタンを Tab キーで選択できるようにする Preferences -> Keyboard -> Shortcuts -> Use keyboard navigation to move focus between controls スクロールバーを常に表示する System Preferences -> General 自動補正をだいたい無効化する System Preferences -> Keyboard -> Text 同一アプリケーション内のウィンドウを Option+Tab で切り替える System Preferences -> Keyboard -> Shortcuts -> Keyboard Terminal.app のタブを Ctrl+Tab
lestrrat-go/server-starterというホットデプロイしてくれるものがある。 github.com これをAlpine LinuxなDockerコンテナ上で使おうとしたら下記のようなエラーが出た。 standard_init_linux.go:190: exec user process caused "no such file or directory" 結論から書くと、原因は依存ライブラリがdynamic linkされた実行ファイルを使っているのが原因だった。どうやらReleasesに置かれている実行ファイルはlibcなどが環境にある前提のものらしく、Alpine Linuxにはそのようなものはないので上記のようなエラーが出てしまっていた。 というわけでgolangで書いたアプリケーションのstatic link化を参考に手元でstatic linkしたものをビルドし
ActionView::Helpers::FormBuilder#check_boxに書かれている内容。 checkboxのチェックがオフの状態だとブラウザはその値を送信しないため、そのままcheckboxがオフになったことをサーバに伝えることができない。 そこでRailsのcheck_boxメソッドは <input name="post[validated]" type="hidden" value="0" /> <input checked="checked" type="checkbox" id="post_validated" name="post[validated]" value="1" /> のようにhiddenのあとに続けてcheckboxを生成する。 ブラウザは上から順次パラメータを送信していき、Railsはそれを順に解釈していく。そのときオフの状態では上にあるhidde
$ brew install libxml2 libxslt libiconv $ gem install nokogiri -- --use-system-libraries bundlerでインストールするときのためにも設定しておく。 $ bundle config build.nokogiri --use-system-libraries なお前提として、公式サイトのインストール方法の"Other OS X tips"にあるように rubyが最新のclangでビルドされていてgccでの依存に無い状態で gemのネイティブ拡張もおなじようにclangでコンパイルされるようになっている ことが必要になる模様。 なのでアップグレードしてrbenvの環境をそのまま引き継いだ場合などでコンパイラがgccだったりする場合は、export CC=clangなどしてrubyをビルドしなおしてからno
パイプを繋げたときの返り値は最後のコマンドの返り値になる。 例えば stat = system "a | b |c" としたとき、途中でaやbがエラーになっても返り値statはfalseにならずcの返り値であるtrueになる。 cがエラーに成った時にはfalseになる。*1 これだとパイプの途中でエラーが起きた場合に捕捉できない。 そういうときはbashの-o pipefailオプションを使う。*2 これを指定するとパイプの途中でエラーが起こった時にはそのときの返り値が、なにも起きなければ最後のcの返り値が全体の返り値が返ってくるようになる。 さらに-eを付けておくことでエラーが起きたタイミングで終了するようになる。 stat = system %{bash -e -o pipefail -c "a | b | c"} 参考 Get exit status of process that'
How to Install SafariStand on El Capitanから勝手に抜粋。 1 Macを再起動し、「ジャーン!」となったらCommand+Rをあるていど押し続けてリカバリモードで起動する 一度押しただけでは切り替わらなかった タイミングの判定がわりと細かい 2 メニューからTerminal.appを起動する 3 次のようにコマンドを叩いてSIPを無効にする bash3.2# csrutil disable 4 再起動する(rebootでも、メニューからのRestartでもOK) 5 SIMBLのサイトからSIMBL-0.9.9.zipを落としてきて解凍する 6 Terminal.app等で次のようにコマンドを叩いてSIMBLを手動でインストールする $ cd /path/to/SIMBL-0.9.9 # zipを解凍してできたディレクトリに移動する $ sudo in
よく忘れるので。細かい話は他の記事にお任せして、テンプレートからファイルを作れるところまで。 0. こんなのを作りたいとかんがえる 抽象クラスFigureのサブクラスをapp/modelsに作るようなジェネレータがほしい。 クラス名は引数で指定したい こんな感じで使うイメージ: $ rails g figure triangle --color blue 1. ジェネレータをジェネレートする $ rails g generator figure これでlib/generators/figure以下に USAGE : 使い方を記述するテキストファイル figure_generator.rb : 生成処理を実装するファイル templates/ : テンプレートファイルを置くディレクトリ が作られる。 2. 作り方を記述する USAGEファイルに0.のようなことを記述する。 3. 生成処理を記
MySQLでレプリケーションする際にCHANGE MASTER TOで設定したパスワードは、データディレクトリ下のmaster.infoファイルに書かれている。
プライベートなバケットなんだけど、特定のURLを知ってる人だけがダウンロードするのを許可したいというときに使うやつ。 aws-sdk-rubyのv1だとAWS::S3Object#url_forで生成できたらしいんだけど、v2ではやり方が変わってるとのことなので試しにv2でやってみた。というかこれのコピペ。 # Gemfile gem "aws-sdk", "~> 2" # irbとか require "aws-sdk" s3 = Aws::S3::Client.new signer = Aws::S3::Presigner.new(client: s3) url = signer.presigned_url(:get_object, bucket: "my-private-bucket", key: "path/to/file.txt") デフォルトだと15分。presigned_url
管理画面にTwitter Bootstrapを使ってボタンっぽいリンクを作っていると、 link_to t(:new), new_user_path, class: "btn btn-success" みたいなコードがビューにあふれてきてつらい。 なので、 new_link_to User としたら同じリンクを生成するようなヘルパを作る*1。 module LinksHelper def new_link_to(model, &block) model = model.class unless model.is_a?(Class) options = polymorphic_path(model, action: :new) html_options = { class: "btn btn-success" } link_to t(:new), options, html_options,
例えばモデル的にGraph has_many Entityだけど、GraphはActiveRecordを使う一方でEntityには素のオブジェクトを使いたい場合。データストアが異なるとか。 class Graph < ActiveRecord::Base after_save :save_entities def entities @entities ||= [] # TODO: entitiesを読み込む end def entities_attributes=(attributes) # attributes = { "0" => { "name" => "foo", "body" => "bar" }, ... } @entities = attributes.map do |i, (attrs)| Entity.new(attrs) end end private def save
新版暗号技術入門 秘密の国のアリス 作者: 結城浩出版社/メーカー: ソフトバンククリエイティブ発売日: 2008/11/22メディア: 単行本購入: 46人 クリック: 720回この商品を含むブログ (81件) を見る すごくわかりやすいし面白い。 共通鍵暗号 事前に共有しておいた秘密鍵を使って暗号化・復号化する方式 今のところAES-256-CBCが安全 AES(やDES)は固定長のブロックを暗号化するための技術 ブロック暗号という ストリーム暗号 CBCやCTRは自由長のバイト列をブロックに分割してブロック暗号に渡す方法。モード CBCは前ブロックの結果(最初は初期化ベクトル)を対象のブロックにXORしてから暗号化する 並列処理はできない 最後のブロックはそれ以前の全てのブロックの影響を受けるので、最後のブロックだけ切り取ってMACに使うことができる CTRはnonceをもとに作った
ポリシージェネレータをいじったり手でいじったりして、特定のタグを持つインスタンスの起動、停止ができるカスタムポリシーを作った。 // ※ 実際はJSONなのでコメントは記入できません { "Version": "2012-10-17", "Statement": [ // EC2のインスタンスに対する状態の取得を許可する // これも↓のAllowStopStartのように対象をタグで絞り込もうとしたら動いてくれなかったので、全サーバに対して許可した { "Sid": "AllowDescribe", "Effect": "Allow", "Action": [ "ec2:Describe*" ], "Resource": [ "*" ] }, // key=Foo,value=Barタグを持つインスタンスに対して起動と停止を許可する { "Sid": "AllowStopStart",
以前Open3.popen3で外部コマンドの出力を随時受け取って表示するということをやったけど、それでは不便な場面が出てきた。 というのも、例えばgrepでマッチした部分を色付けしたものを得ようとしてもOpen3.popen3で受け取ることはできない。これはgrepが出力先がttyのときだけ色付けするようになっているのに対して、Open3.popen3のやりとりにttyが使われていないことが原因らしい。((出力先のIOがttyかどうかはrubyだとIO#tty?で調べられる。)) 正直ttyってなんなのかわからないけど、とりあえずPTY.spawnを使うと擬似ttyをruby上に作ったうえで外部コマンドとやりとりできるとのことがわかったのでやってみた。 require "pty" PTY.spawn("long-long-command") do |r, w, pid| # rはコマンドの
手元でRoute53のレコードを管理したいんだけど、Roadworkerを使ってRoutefileがPull Requestでマージされたときに自動で行われるようになれば、コメント付きの履歴がとれつつ実際の状態とリポジトリ上のファイルとの一貫性がとれていいのかなと思ってやってみた。 必要なもの CircleCIのアカウント Travis CIでも同様のことはできると思う。ただ今回プライベートリポジトリを扱いたかったので、無料で1枠使えるCircleCIで試してみた。 Route53のfull access権限のあるIAMユーザのAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEY RoadworkerのRoutefile 現在の状態をroadworker -e -o RoutefileコマンドでRoutefileに書きだす 前述のRoute53の鍵を~/.aws/
Rubyで外部コマンドを実行する手段はいろいろあるけど、そのほとんどは実行し終わったときにまとめて標準出力等を得ることになる。時間がかかるコマンドを実行しつつその出力を随時受け取りたい場合にはOpen3.popen3を使う。 require "open3" Open3.popen3("long-long-command") do |stdin, stdout, stderr, wait_thr| stdin.close_write # 標準入力を閉じる。 begin # 標準出力、標準エラーの出力があるまで延々と待ち、随時1行ずつ書き出す loop do IO.select([stdout, stderr]).flatten.compact.each do |io| io.each do |line| next if line.nil? || line.empty? puts line e
新しく届いたMacの環境を構築しようとししたら無くなってた → Remove curl-ca-bundle by jacknagel · Pull Request #28658 · Homebrew/homebrew · GitHub 代わりにopensslパッケージが証明書を入れるようになったので、そっちを使うようにした。 export SSL_CERT_FILE=$(brew --prefix)/etc/openssl/cert.pem
bundlerでbinstubしたrailsコマンドやrakeコマンドを使っていると、次のような警告がbin/rails cしたときなどに表示される: Looks like your app's ./bin/rails is a stub that was generated by Bundler. In Rails 4, your app's bin/ directory contains executables that are versioned like any other source code, rather than stubs that are generated on demand. Here's how to upgrade: bundle config --delete bin # Turn off Bundler's stub generator rake rail
http://rubygems.org/gems/capistrano-pending Capistrano 2で使えていたdeploy:pendingというコミットの差分ログを表示するレシピが3になってから使えなくなっていたので、同じ動作をするものを作った。 Capistranoは3.2.0以上が必要。このバージョンからrevision.logだけでなく、各リリースディレクトリにREVISIONファイルを作ってくれるようになったので、このファイルを見てローカルで比較してる。 今のところgitにのみ対応してる。他SCMへの対応PRお待ちしております。 https://github.com/a2ikm/capistrano-pending
ActiveDecoratorと組み合わせてJbuilderのpartial!を使ったら、次のようにnil?というキーで空のハッシュができていた。 { "nil?": {}, // .jbuilderに書いた通りのキー } これは、partial!したときに裏で呼ばれるrenderメソッドの:localsオプションにjsonオブジェクト(JbuilterTemplateのインスタンスで、BasicObjectを継承したもの)が渡されており、これに対してActiveDecorator::Decorator#decorateによってメソッドを生やそうとした際にnil?が呼ばれていたのが原因だった。 回避策としては、JbuilderTemplateオブジェクトに対してdecorateする必要はほとんどないので、その場合はメソッドを生やそうとせずにすぐにdecorateを抜けてしまえばいい。 mo
OS X 10.9 Mavericksに上げてからrails-erdが動かなくなった。エラーも出さずにハングアップする。 対処方法はGitHubのissueに上がってた。一度dot形式で出力してから変換したところ動いた: rake erd filetype=dot dot -Tpdf erd.dot > erd.pdf Generation hangs はー、Qiita::Team便利だわー。
複数の関連を跨いでaccepts_nested_attributes_forを使う場合の話。 たとえば Organization has_many Groups Group has_many Employees というモデルに対して、1度にまとめてこれらのレコードを作成したい場合には次のようにする。 まずはクラスの定義: class Organization has_many :groups, inverse_of: :organization accepts_nested_attributes_for :groups # attributes: # name:string end class Group belongs_to :organization, inverse_of: :groups has_many :employees, inverse_of: :group accepts
rakeタスクでつまれてるミドルウェアを確認する。 $ rake middleware use ActionDispatch::Static use Rack::Lock use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007fed13d07bb0> use Rack::Runtime use Rack::MethodOverride use ActionDispatch::RequestId use Rails::Rack::Logger use ActionDispatch::ShowExceptions use ActionDispatch::DebugExceptions use ActionDispatch::RemoteIp use ActionDispatch::Reloader use Actio
capistrano-ec2_taggedというgemを作った。まだrubygems.orgには上げていない。 これはCapistranoで指定タグのEC2インスタンスにデプロイのようなことをやるためのもので、次のようにして使う: # Gemfile gem "capistrano-ec2_tagged", require: false, github: "a2ikm/capistrano-ec2_tagged" # Capfile require "capistrano/ec2_tagged" # deploy.rb set :access_key_id, "ACCESS KEY ID" set :secret_access_key, "SECRET ACCESS KEY" set :region, "ap-northeast-1" # production.rb role :app,
ActionView::Helpers::FormBuilder#form_for(record, options = {}, &block)では:asオプションを指定することで各種フィールドのname属性に付けられるprefixを指定できる。 たとえば@person = Person.newに対して、デフォルトだと = form_for @person do |f| = f.text_field :name とすれば、 <form> <input type="text" name="person[name]" value="" /> </form> みたいなフォームが生成され、このpersonはインスタンスのクラス名から決定されている。 このperson[name]のpersonの部分を指定するには次のように:asオプションを指定すればよい。つまり、 = form_for @person
それまでDATEやDATETIMEによるパーティショニングではTO_DAYS()関数を使って数値に変換する必要があったけど、MySQL 5.5からはRANGE COLUMNSを使うことによって日付や時刻をそのまま書けるようになった。 DATETIMEだとこんな感じ。DATEも同様。 /* パーティショニングに使うカラムを主キーに入れる必要があるのは相変わらず */ ALTER TABLE events DROP PRIMARY KEY, ADD PRIMARY KEY(id, created_at); /* RANGEではなくRANGE COLUMNS、パーティショニングするカラムの比較値もそのまま */ ALTER TABLE events PARTITION BY RANGE COLUMNS(created_at) ( PARTITION p201303 VALUES LESS THA
rails_adminをインストールした状態でrakeタスクを実行すると [RailsAdmin] RailsAdmin initialization disabled by default. Pass SKIP_RAILS_ADMIN_INITIALIZER=false if you need it. というログが標準出力に出力される*1。 何度も表示されるのも煩わしいし、rakeタスクをcronで回していて標準出力をログにとっているので、次のようにRakefileで明示的にSKIP_RAILS_ADMIN_INITIALIZERを設定して出力しないようにした。 --- a/Rakefile +++ b/Rakefile @@ -3,4 +3,6 @@ require File.expand_path('../config/application', __FILE__) +ENV["SK
~/Library/LaunchAgents/homebrew.mxcl.mysql.plistのKeepAliveがtrueになっていると、mysqlのプロセスが止まった時点でlaunchctlが頑張って起動しなおそうとする。 このため、mysqlを手動で再起動しようとmysql.server restartを叩くと、この機能と衝突してしまってうまくいかない。stop/startもだいたいダメ。とはいえ再起動のたびにplistをunload/loadするのも面倒くさい(今までこれをやってた)。 じゃあどうするのかというと、KeepAliveをfalseにする。 $ diff -u ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist{.org,} --- ~/Library/LaunchAgents/homebrew.mxcl.mysql.pl
次のページ
このページを最初にブックマークしてみませんか?
『There's an echo in my head』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く