Logical Rabbit.

さくらのVPS

Ruby

ActiveAdminのCSS/JavaScriptがアプリケーション全体に波及して邪魔な時の対処パターン

ActiveAdminを導入するときの定型パターンなのに毎回忘れるのでメモ。ていうか、これいい加減ActiveAdmin側で何かしてくれないかな(←Pull request送れや)

  1. app/assets/stylesheets/admin.css を app/assets/stylesheets/admin/admin.css 等のようにして下層ディレクトリへ隔離 (app/assets/javascripts も同様)
  2. app/assets/stylesheets/application.css 内の require_tree .require_directory . に変更
    • これにより app/assets/stylesheets のサブディレクトリを読み込まなくなるので app/assets/stylesheets/admin が隔離されるが、副作用として app/assets/stylesheets/hoehoe-func のような機能ごとのサブディレクトリ運用もできなくなるので、必要ならば適宜 require_directory hoehoe-func を追記する必要がある
  3. config/initializer/active_admin.rb の == Register Stylesheets & Javascripts の項に以下を追記

    config.clear_stylesheets!
    config.register_stylesheet 'admin/active_admin.css'
    config.clear_javascripts!
    config.register_javascript 'admin/active_admin.js'
    
    1. config.clear_stylesheets! ... 念のため、他の箇所で読み込まれたスタイルシート情報を破棄
    2. config.register_stylesheet 'admin/active_admin.css' ... app/assets/stylesheets/admin/active_admin.css を読み込むよう設定
    3. (javascripts 側も同様の処理)

Rubyコードでパスワードを簡易生成したいとき。

ググってみると、大抵以下のようなコードが多数見つかる。

ruby -e 'p [*1..9, *"a".."z", *"A".."Z"].sample(8).join'

これ、

ruby -e 'p [*"!".."z"].sample(8).join'

でいいんぢゃねぇです? 文字コード的に半角スペース, "!" , …数字…大文字アルファベット…小文字アルファベット、と続くので。まあパスワードに半角スペース入れると入力が厄介なことになりそうだからその次の "!" から始めるとして。

あ、でも " とか ' とか ` あたりもパスワードに含めると扱いがアレ気になりそうだから、

ruby -e 'p [*"!".."z"].reject {|c| %w"\" '"'"' \`".include? c }.sample(8).join'

くらいで、どうですかね?

ruby-2.1.7 の make test で TestException#test_machine_stackoverflow_by_define_method が出たときの対処。

TestException#test_machine_stackoverflow_by_define_method でググって見つけた issue の修正内容を適用してみたら改善できたのでメモ。

ruby 2.1.7 で見つかって ruby 2.2.0 で対策されていたので、今出ているruby 2.1.7パッケージには反映されていない、と言うことなんだろう、多分。

問題のissueは Bug #9739 。以下は修正個所の転記(何かの拍子に原典が消えてしまうと困るので)。

diff --git a/configure.in b/configure.in
index f52e0ba..078f9ba 100644
--- a/configure.in
+++ b/configure.in
@@ -2782,7 +2782,7 @@ if test "$with_dln_a_out" != yes; then
            rb_cv_dlopen=yes],
    [cygwin*|mingw*], [
            : ${LDSHARED='$(CC) -shared $(if $(filter-out -g -g0,$(debugflags)),,-s)'}
-           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
+           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x01200000,--enable-auto-import"
            DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
            : ${LIBPATHENV=""}
            rb_cv_dlopen=yes],

修正後、念のため make clean ; ./configure ; make までやったら make check でエラーが無くなった。

mattr_accessor が欲しいときは。

active_support/core_ext/module/attribute_accessors.rb をrequire。ちぃ覚えた。

Moduleを拡張しているのでrequireすればクラスに導入されますね。効果としてはクラスとインスタンス、両方のアクセサとして共通に使えるアクセサが定義できるようです。

ActiveRecord::Base.loggerを流用しようとして存在に気づいた。

gem 'activerecord' した環境で試してみると、以下のような感じ。

$ bundle exec ruby -e '
require "active_support/core_ext/module/attribute_accessors"
require "logger"

class TestClassA
  mattr_accessor :logger
end

TestClassA.logger = Logger.new( STDERR )

TestClassA.logger.info( "Message from class method." )
TestClassA.new.logger.info( "Message from instance method." )

puts "Class method logger; #{TestClassA.logger}"
puts "Instance method logger; #{TestClassA.new.logger}"
'
I, [2015-05-15T12:04:17.514556 #30503]  INFO -- : Message from class method.
I, [2015-05-15T12:04:17.514671 #30503]  INFO -- : Message from instance method.
Class method logger; #<Logger:0x007f12f269f198>
Instance method logger; #<Logger:0x007f12f269f198>

確かにクラスメソッドでアクセスしてもインスタンスメソッドでアクセスしても、同じオブジェクトが入ってる。

参考: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb

ruby コンパイル+XML関連開発に必要なライブラリ

CentOSでRubyをソースコンパイルするときに、いつも事前インストールしているライブラリ群です。個人的にXMLを扱う開発が多いので、XML関連のライブラリも一緒に入れています。

このままコピペして yum install すればまとめて導入できるはず。

openssl openssl-devel readline readline-devel ncurses ncurses-devel gdbm gdbm-devel libffi libffi-devel zlib zlib-devel bison mysql mysql-devel mysql-server sqlite-devel libxml2 libxml2-devel libxslt libxslt-devel libyaml libyaml-devel

[2016.06.04 追記]

Ruby 2.2.1ビルド時にlibffi-develが無くて怒られたので追記しました。

さらにCentOS 7用に mysql を mariadb に変更。

openssl openssl-devel readline readline-devel ncurses ncurses-devel gdbm gdbm-devel libffi libffi-devel zlib zlib-devel bison mariadb mariadb-devel mariadb-server sqlite-devel libxml2 libxml2-devel libxslt libxslt-devel libyaml libyaml-devel