Logical Rabbit.

さくらのVPS

Ruby

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