それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby

rubyの正規表現でグローバルマッチ

JSとか書いてたら、グローバルマッチをついつい、次のように書いてしまう。 "aa aaa aaaaa".match( /a+/g ) ああ、シンタックスエラー ruby 書くんだったらこう書くっポイ! "aa aaa aaaaa".scan( /a+/ ) #=> ["aa", "aaa", "aaaaa"] ruby でマッチした結果…

SeleniumのWebDriver(chrome)からCookieを取りだしてHTTP::CookieにしたりCurlで再利用する

Selenium のWebDriverからCookieを取り出したら Seleniumで画像をだけを取り出して保存したり、ファイルを取り出すのは不便だよね。 だけど、直接Curlで叩くのもCookieの問題でもっと不便だよね。 そこでSeleniumのCookieをCurlで使える形式やNetscape形式で…

クラス・メソッドをインスタンス内から呼び出す

ruby でクラスに所属するメソッドを呼び出す。 クラスに所属するStaticなメソッドを呼び出したときに、クラス名を直接指定するのは不便だよね。 class A def self.do puts :do end def say A.do # クラス名が・・・ end end a = A.new a.say self で参照する…

クラスの特異メソッドにモジュールのメソッドを取り込む

モジュールのメソッドを、クラスの特異メソッドに取り込む module で定義した、メソッドやローカル変数を、クラスの特異メソッドに取り込む 次のようにすると実現できる。 module S1 def sample puts :sample end end class A class << self include S1 end …

pry のEchoをオフにする

コピペなどでエコーが邪魔なとき _pry_.config.print = proc {} irb の場合は conf.echo = false こうすれば、長いStringのスクロールで死ななくて済む 一時的にオフにして、元に戻すなら _pry_.config._print = _pry_.config.print _pry_.config.print = pr…

Seleniumで印刷(print preview)を経てPDFを保存する方法

Selenium + chromedriverで 印刷プレビューにアクセスするのが面倒くさい Chromeを webdriverでアクセスすると iframe で作られた、印刷プレビューにアクセスするのがとてもめんどくさい。(セキュリティ関連のアレコレの制限をdisableオプションで取っ払え…

rubyのLoggerでログを出力する方法

ruby のロガーについて調べておきました ruby ではログを出すときに Logger が便利です。 require 'logger' logger = Logger.new(STDOUT) 標準出力に出す場合は STDOUT($stdout) 、標準エラー出力に出す場合は STDERR($strerr) を指定する。 ログを出す logg…

ruby で先月の月末を求める

先月の月末を求めるには まず、月初の01日を作ります。 Date.parse(Date.today.strftime('%Y-%m-01')).to_s 今月の1日を作る方法を知ってると後はなんでも応用が効くよね。 次に−1日する (Date.parse(Date.today.strftime('%Y-%m-01'))-1).to_s 簡単でし…

selenium で parital text/ link_text を指定すれば楽ができる!!!!

selenium でリンクの指定が楽になった。 ドキュメントを読んでたら、良いものを見つけた 今までのやり方。 driver.find_element(:xpath, "//a[contains(./text(), 'ログイン')]") driver.find_element(:xpath, "//a[./text()='ログイン']") 今回知ったやり方…

rubyで実行中のユーザー名(id)を取得したい

ruby でスクリプトを実行したのは誰? スクリプトの実行ユーザーを知りたい。root以外で動かされるとパーミッションがあとで面倒なので、root 以外が起動しようとすると拒否したいってことが、わりとあるわけで。 実行ユーザーIDを知るには Process.euid #=>…

rubyのSequelをパパと使うサンプル(select/update/create/delete/unique/constrains)

DB にアクセスするなら Sequel が便利 データベースにアクセスしてデータを扱うには Sequel が便利。ActiveRecordもいいんだけどアレはめんどくさい。 SQLに極めて近い構造で余計なことはなにもなく便利でいい。 インストール gem install sequel DBに接続 D…

RMagick が入らない: gem install rmagick error:Mac OS X/brew に rmagickをインストールする決定版

RMagick を久しぶりに使おうとしたら・・・ インストール gem install rmagick はい、エラー。extconf.rb ってほんと良く詰まるわ 色々調べたら、Rmagick が imagemagick 7 に非対応だった。 brew unlink imagemagick brew install imagemagick@6 brew link …

ruby の ri でgemのドキュメントが見られない

mac OSX の ri がgems パッケージを見てくれない。 ri はgems ファイルを探してくれないので、ri は使えないものだと思ってた。 takuya@~$ ri Sequel Nothing known about Sequel takuya@~$ OSX バンドルの ri が見てくれないだけだった。 takuya@~$ which r…

ruby ri のドキュメントを一括削除・一括インストール

ri かわいいよ ri ri 便利だよ。gem のインストールが遅いからと ri doc を消すことを推奨するエントリ多いけど ri 便利だよ? ri があるものを全部インストール ri の documentation があるものを全部インストール gem rdoc --all --ri ri のrdoc を全部消…

macのrbenv でインストールにコケたのでメモ

rbenv でruby 2.3.3 を入れようとしたらエラーになった。 takuya@Desktop$ CC=/usr/bin/gcc CONFIGURE_OPTS="--with-readline-dir=/usr/local/opt/readline --with-openssl-dir=/usr/local/opt/openssl" rbenv install 2.3.3 Downloading ruby-2.3.3.tar.bz2…

zipruby でファイルを経由せずに変数内だけでzip ファイルを作る

zip ruby には buffer モードが有る。 zipruby をそのまま使うと、一時ファイルを作って出力先にzip を用意しなくちゃいけないので、tmpfile などと組み合わせる必要がるけど、変数だけでメモリ内部でぱぱっと作れないのか調べた。 ruby-zip-in-memory-sampl…

ruby の URI で日本語を含むURIに対応する。

日本語URIを扱うという戦い ruby のURIで日本語を含む文字列が扱えなくなったので、何とかしないといけないとアレコレ模索した。 >> URI.parse 'http://example.com/あああ' URI::InvalidURIError: URI must be ascii only "http://example.com/\u{3042}\u{3…

rubyの置換でコールバックを使う。

JavaScript の String#replace はコールバックが使えて便利。 置換でコールバックの関数使えると便利なんですよね。 > a.replace(/a/, function(e){ console.log(e); return ''}) a 'bc' > js のこの仕様が結構過ぎで多用しまくっててクセになってた ruby で…

ruby のURI.parse が日本語GET引数や日本語UTF-8のパスに対応しなくなった

対応しなくなったんですよ。マジで。 日本語を含むとエラー >> URI.parse 'http://example.com/あああ' URI::InvalidURIError: URI must be ascii only "http://example.com/\u{3042}\u{3042}\u{3042}" from /Users/takuya/.rbenv/versions/2.2.3/lib/ruby/2…

ruby の暗黙的文字列変換 toString 的なものをするには

ruby って to_s が自動的に呼ばれない。 たとえば、Hashと文字列を結合しようとした時 h = { name:'takuya' } str = 'this obj is ' + h puts str Hash を String にする方法がないからエラー takuya@~/Desktop$ ruby test.rb test.rb:5:in `+': no implicit…

binding.pry で止まるのを止める。ループを一気に抜けて強制終了!

binding.pry 便利すぎて書きまくったら地獄だった。 pry で binding.pry を使いまくるのですが、binding.pryをループ中で使うと大変なことになる。 loop { binding.pry } 抜けられない・・・ each/mapなどの loop 中でpry すると抜けらないのですが、これを…

PDFをページ数指定で高速に読み込む。

PDF 読み込み遅んだよ! PDFってなんでこんなに無駄にページ数多いの。ってなりなす。PDFをMagickで読み込んだら遅いのなんのって。 require 'Rmagick' name = 'out.pdf' im = Magick::Image.read(name) # めっちゃ遅い im.esize #=> 300 PDFが枚数多いとも…

SlideShareを自動ブラウジングしてJPGからPDFを取出す。

以前作ったSlideShareの保存スクリプトを改良した Prawn使ってたので、どうしてもA4サイズになっちゃって困ってたので、JPEGをそのままPDFにすることにした #!/usr/bin/env ruby # require 'rmagick' require 'mechanize' require 'open-uri' require 'pry' …

ruby imageMacick RMagick で 画像からPDFを作る

rmagick で PDFを作るのがちょっと手間だったのでメモ ruby の imagemagick 実装である rmagick が有ります。 RMagick を使えば、magick 関連が使えるbindings で重宝する。 無論、Rubyからmagickを使うには、convert/mogrifyのシェル呼び出しで済むのだ。 …

prinft %s は文字列の長さが指定できる!

知らなかった。%s は%s しか使えないんだと思ってました。 縦幅が綺麗に揃った文字列を出力するにはどうすればいいか、ずっと気になっててruby はruby で各種関数、php はphp で各種関数を使ってたけど、良く考えたら printf で出来ることに気付いた Dir.glo…

ruby で URL をパースしてGET引数をHashに展開する。(日本語URI対応)

GET引数をハッシュに変えたい 実は、頻繁にやるんだけど、毎回適当に行っていて、これといった方法を決めてなかったので、ちゃんと方法を決めることにする。 require 'uri' module URI class << self alias :_parse :parse def parse a, original=false retu…

File.rename でハマった。

File.rename はデバイスを超えてrename 出来ない。 File.rename を何気なく使っていました。 require 'fileutils' するのが面倒くさいという、それだけの理由で。 そして今日は見事にドハマリした。cron でエラーが出ているので追いかけてみたら。なんとrena…

Mac の文字化けする日本語の文字(濁点)を一括して文字コード変換する

Mac OSXの濁点・半濁点問題。 濁点をどう扱うか問題。Mac OSXの HFS がUTF-8で保存するんだけど、濁点と文字を別に保存する。 ぜっけい→ せ゛っけい とくべつれっしゃ→とくへ゛つれっしゃ のように保存する。正しいとか悪いとか別にどうでもいいんだ。コレは…

rubyのspawnで 起動したプロセスを、終了待ちしたり、強制終了したり、親プロセスと一緒に殺す

ruby から外部コマンドを起動する spawn ruby で外部コマンドを呼び出すときに spawn を使って管理してみた。 spawn の特徴とか。 だいぶ昔に導入されたこの機能については、次のスライドが良いみたい。https://staff.aist.go.jp/tanaka-akira/pub/spawn-200…

Kernel.exec の第2引数を使った、コマンド実行のサンプル

exec の引数について 1つだけなら、問題ない。 Kernel.exec("ls") 2つになると・・・ Kernel.exec("ls -lt ") ただし、これはシェル経由の呼び出し。 3つになると・・・ Kernel.exec("ls -lt /") これもシェル経由の呼び出し シェル経由ってのは、sh に引…