memo.xight.org

日々のメモ

カテゴリ : Ruby

1ページ目 / 全2ページ

ruby build時に closure.c がコンパイルできない

Summary

GitHub Pages で利用する ruby 2.7.1 を arm64 でbuildしようとしたら、
closure.c のコンパイル時にエラーが発生。

compiling closure.c
closure.c:264:14: error: implicit declaration of function 'ffi_prep_closure' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
	result = ffi_prep_closure(pcl, cif, callback, (void *)self);
			 ^
1 error generated.
make[2]: *** [closure.o] Error 1
make[1]: *** [ext/fiddle/all] Error 2
make: *** [build-ext] Error 2

インストール

$ git clone https://github.com/postmodern/ruby-install.git
$ cd ruby-install
$ ./bin/ruby-install ruby 2.7.1 -c -- --with-arch=arm64 --prefix=$(rbenv root)/versions/2.7.1-arm64 CFLAGS=-DUSE_FFI_CLOSURE_ALLOC=1


Reference

Andre.Arko.net - 2020-06-30 - Building Ruby on arm64 macOS
https://andre.arko.net/2020/06/30/building-ruby-on-arm64-macos/

Apple Silicon + anyenv + rbenv + ruby2.7.2

Summary

rbenv + ruby-build で ruby をインストールすると arm64-apple が認識できない。

checking for ruby... $HOME/.anyenv/envs/rbenv/shims/ruby
tool/config.guess already exists
tool/config.sub already exists
checking build system type... Invalid configuration `arm64-apple-darwin20.2.0': machine `arm64-apple' not recognized
configure: error: /bin/sh tool/config.sub arm64-apple-darwin20.2.0 failed


tool/config.subにpatch をあててインストール ([2021-04-16] 追記)

timestamp='2019-06-30' のtool/config.sub を timestamp='2021-01-08' に変更するパッチをあてる
$ rbenv install --patch 2.7.2 <<(curl -sSL https://gist.githubusercontent.com/xight/2518f1c28d28a1925d80e786ae34b1c2/raw/5b52a565add497c7e311808da838160d05ee7cc4/config.sub.patch)


tool/config.sub を入れ替えて configure (ad hoc)

$ cd /var/folders/PATH/TO/ruby-build.YYYYMMDDhhmmss.xxxxx.XXXXXX/ruby-2.7.2/tool
$ mv config.sub config.sub.bak
$ wget https://raw.githubusercontent.com/gcc-mirror/gcc/master/config.sub
$ cd ..
$ ./configure --prefix=$(rbenv root)/versions/2.7.2-arm64
$ make
$ make install


確認

$ rbenv global 2.7.2-arm64
$ ruby --version
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [arm64-darwin20]
$ lipo -archs $(rbenv prefix)/bin/ruby
arm64


問題

x86_64 版を利用すると、
$GEM_HOME/*/*.bundleで x86 と arm64 で競合が起こる。

$GEM_HOME/gems/psych-3.2.1/lib/psych.bundle: mach-o, but wrong architecture


x86版の .bundle ファイル を退避してアップデート
$ mv $GEM_HOME/gem $GEM_HOME/gem-x86_64
$ gem update

bundler で nokogiri のインストール

Summary

bundle config --local build.nokogiri --use-system-libraries
bundle install --path vendor/bundle


macOS Mojave (10.14.2) + Ruby2.5.3 + Nokogiri1.8.5

bundle config --local build.nokogiri --use-system-libraries=true --with-xml2-include="$(xcrun --show-sdk-path)"/usr/include/libxml2
bundle install --path vendor/bundle


macOS Mojave (10.14.3 Beta) + Ruby2.6.0 + Nokogiri1.9.1

bundle config --local build.nokogiri --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
bundle install --path vendor/bundle


Reference

GitHub - sparklemotion/nokogiri - Issues #1801
https://github.com/sparklemotion/nokogiri/issues/1801

Mechanize でパースできないHTMLを強引に処理する

Summary

Mechanizeは、HTML (Content-Type: text/html) をパースする際にMechanize::Pageを利用する。
しかし、パースするHTMLがwell-formedではない場合、パースに失敗する。

Mechanize::Page で処理

require 'mechanize'

agent = Mechanize.new
agent.pluggable_parser['text/html'] = PlainFile
page = agent.get("http://example.com/")
p page


#<Mechanize::Page
 {url #<URI::HTTP http://ill-formed.com/>}
 {meta_refresh}
 {title "ill-formed.com"}
 {iframes}
 {frames}
 {links}
 {forms}>

Plain Textで処理

require 'mechanize'

class PlainFile < Mechanize::File; end

agent = Mechanize.new
agent.pluggable_parser['text/html'] = PlainFile
page = agent.get("http://example.com/")
p page


#<PlainFile:0x00007fb8d2077910
 @body=
  "<!doctype html>\n" +
  "<html>\n" +
  "<head>\n" +
  "    <title>ill-formed.com</title>\n" +
  "\n" +
  "    <meta charset=\"utf-8\" />\n" +
  "    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n" +
  "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n" +
  "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n" +
  "</head>\n" +
  "\n" +
  "<body>\n" +
  "<div>\n" +
  "    <h1>ill-formed.com</h1>\n" +
  "\t<p>This domain is established to be used for ill-formed HTML test. <!-- </p> -->\n" +
  "<!-- </div> -->\n" +
  "<!-- </body> -->\n" +
  "<!-- </html> -->\n",
 @code="200",
 @filename="index.html",
 @full_path=false,
 @response=
  {"server"=>"GitHub.com",
   "date"=>"Thu, 05 Oct 2017 14:55:52 GMT",
   "content-type"=>"text/html; charset=utf-8",
   "transfer-encoding"=>"chunked",
   "last-modified"=>"Thu, 05 Oct 2017 14:55:35 GMT",
   "access-control-allow-origin"=>"*",
   "expires"=>"Thu, 05 Oct 2017 15:05:52 GMT",
   "cache-control"=>"max-age=600",
   "content-encoding"=>"gzip",
   "x-github-request-id"=>"F5F8:1F5B:54E8B4B:7C0A75B:59D647F8"},
 @uri=#<URI::HTTP http://ill-formed.com/>>

gemの一括uninstall

Summary

gem uninstall -aIx $(gem list --no-versions | grep -v -E "bigdecimal|io-console|json|openssl|psych|rdoc")


fishの場合

gem uninstall -aIx (gem list --no-versions | grep -v -E "bigdecimal|io-console|json|openssl|psych|rdoc")


Reference

Qiita - hachi8833 - インストールされているgemを一括で削除する
http://qiita.com/hachi8833/items/e6b0380c3b6d5e115e36

RubyMine + IdeaVim

Summary

RubyMine を vim のキーバインドで使いたい。

$HOME/.ideavimrc

" clipboard sharing
set clipboard+=unnamed

RubyMine - [Preferences...] - [Keymap]

Plug-ins - IdeaVim - Scroll Half Page Down に Command+D
Plug-ins - IdeaVim - Scroll Half Page Up に Command+U
Plug-ins - IdeaVim - Redo に Ctrl+R

Reference

JetBrains - Plugins - IdeaVim
https://plugins.jetbrains.com/plugin/164-ideavim

Symbol not found _SSLv2_client_method

Summary

OS X Yosemiteにしてから、 Symbol not found: _SSLv2_client_method が発生。
Rubyをオプション付きでリビルドすれば良い。

$ brew install -f openssl
$ RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.3

確認

$ rbenv global 2.1.3
$ ruby -ropenssl -e 'p RUBY_VERSION, OpenSSL::OPENSSL_VERSION'
"2.1.3"
"OpenSSL 1.0.1i 6 Aug 2014"

Reference

teratail - 「gem install pg」を実行すると「Symbol not found: _SSLv2_client_method」エラーが出て先に進めません。
https://teratail.com/questions/2409

anyenv で rbenv の設定

Install

$ anyenv install rbenv
$ rbenv install X.X.X
(snip)
$ rbenv global X.X.X
$ rbenv rehash
$ rbenv exec gem install bundler

ローカルの Gemfile を利用する

$ vi Gemfile
$ bundle install --path vendor/bundle
$ bundle exec ruby example.rb

rbenv で gem を使った時に自動的に rbenv rehash

zshrc

function gem(){
	$RBENV_ROOT/shims/gem $*
	if [ "$1" = "install" ] || [ "$1" = "i" ] || [ "$1" = "uninstall" ] || [ "$1" = "uni" ]
	then
		rbenv rehash
		rehash
	fi
}

Reference

rbenv で gem を使った時に rbenv rehash しなくて良くする - sorry, uninuplemented:
http://rhysd.hatenablog.com/entry/20120226/1330265121

rbenv, pyenv, plenv, phpenv から anyenv への移行

*env を remove

$ brew list |grep env
plenv
pyenv
pyenv-virtualenv
rbenv
$ brew remove plenv
$ brew remove pyenv
$ brew remove pyenv-virutalenv
$ brew remove rbenv

anyenv インストール

$ git clone https://github.com/riywo/anyenv ~/.anyenv

zshrc

if [ -d $HOME/.anyenv ] ; then
	export PATH="$HOME/.anyenv/bin:$PATH"
	eval "$(anyenv init -)"

	for D in `ls $HOME/.anyenv/envs`
	do
		export PATH="$HOME/.anyenv/envs/$D/shims:$PATH"
	done
fi

シェル再読み込み

$ exec $SHELL -l

anyenv で *env をインストール

$ anyenv install plenv
$ anyenv install pyenv
$ anyenv install rbenv
$ anyenv install phpenv

anyenv-update

$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
$ anyenv update

anyenv-exec

$ mkdir -p $(anyenv root)/plugins
$ git clone git://github.com/aereal/anyenv-exec.git $(anyenv root)/plugins/anyenv-exe
$ anyenv --version

anyenv-git

$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-git.git $(anyenv root)/plugins/anyenv-git
$ anyenv git gc

Refence

GitHub - anyenv
https://github.com/riywo/anyenv

GitHub - anyenv-update
https://github.com/znz/anyenv-update

GitHub - anyenv-git
https://github.com/znz/anyenv-git

GitHub - anyenv-exec
https://github.com/aereal/anyenv-exec

OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:certificate verify failed

Summary

Net::HTTP で HTTPS 接続した際、エラーが発生

/path/to/net/http.rb:920:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

原因と対応

証明書が見つからないことが原因。
証明書をダウンロードして、証明書を明示的に指定すればよい

cert のディレクトリを確認

% ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_DIR'
/usr/local/etc/openssl/certs

cert のファイルを確認

% ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
/usr/local/etc/openssl/cert.pem

証明書をダウンロードして、証明書を明示的に指定

% wget http://curl.haxx.se/ca/cacert.pem

https = Net::HTTP.new('example.com', 443)
https.open_timeout = SYSTEM_TIMEOUT_SEC
https.read_timeout = SYSTEM_TIMEOUT_SEC
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5
https.ca_file = "./cacert.pem" # <= 追加


ad hocな対応

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE


Reference

Stack Overflow - ruby on rails - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
https://stackoverflow.com/questions/4528101/ssl-connect-returned-1-errno-0-state-sslv3-read-server-certificate-b-certificat

via

komiyakの通り道 - 2013-05-08 - エラー:OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
http://d.hatena.ne.jp/komiyak/20130508/1367993536

LESS - 変数・代入・ネストが使えるCSS生成ライブラリ

Summary

変数・代入・ネストが使えるCSS生成ライブラリ。
Ruby製。
gemでインストール可。

# gem install less


style.less にソースコードを書いて、ジェネレート。

$ lessc style.less


Reference

LESS - Leaner CSS
http://lesscss.org/

nagomu.me - 2010-02-13 - (今さらだけど) 「LESS - Leaner CSS」を試してみた
http://www.nagomu.me/archives/2010/nagomu100213.html

よろずや - 2009-06-22 - Rubyによる構造化CSSライブラリ「Less」
http://sst0001.blog117.fc2.com/blog-entry-93.html

コリス - 2009-06-17 - 変数などを使用してスタイルシートの記述ルールを拡張できる -LESS
http://coliss.com/articles/build-websites/operation/css/extension-to-css-less.html

jpmobile - 携帯電話特有の機能を Rails で利用するためのプラグイン

機能一覧

 * 携帯電話のキャリア判別
 * 端末位置情報の取得
 * 端末製造番号、契約者番号等の取得
 * IPアドレスの検証 (キャリアが公開しているIPアドレス帯域からのアクセスか判定)
 * セッションIDをフォーム/リンクに付与(Transit SID)

Reference

RubyForge - jpmobile
http://jpmobile.rubyforge.org/files/README.html

via

オレンジニュース - 2007-02-26
http://secure.ddo.jp/~kaku/tdiary/20070226.html#p11

VisualuRuby - RubyでGUIソフトウェア開発

Reference

VisualuRuby計画(仮称)
http://www.osk.3web.ne.jp/~nyasu/software/vrproject.html

SourceForge.jp - Project Info - FormDesigner for project VisualuRuby
http://sourceforge.jp/projects/fdvr/

FormDesigner for VisualuRuby
http://fdvr.sourceforge.jp/

via

MOONGIFT - FormDesigner for project VisualuRuby
http://oss.moongift.jp/intro/i-2410.html

MOONGIFT - FormDesigner for project VisualuRuby レビュー
http://oss.moongift.jp/review/i-2411.html

mouseHole - Ruby で スクリプト可能なプロキシサーバ

Reference

RedHanded - MouseHole 1.1 in Plain View
http://redhanded.hobix.com/inspect/mousehole11InPlainView.html

via

えとブログ(2006-02-14) - mouseHole: Rubyでスクリプト可能なプロキシサーバ
https://www.codeblog.org/blog/eto/20060214.html#p01
えとブログ(2006-02-10) - WEBrick でプロキシを作る
https://www.codeblog.org/blog/eto/20060210.html
オレンジニュース - 2006-02-15
http://secure.ddo.jp/%7Ekaku/tdiary/20060215.html#p18