ぼろぼろ平原

困った

Rubyで大きいファイルを読み込む時に進捗を表示

f:id:tatzyr:20160713144219g:plain

ruby-progressbar というgemを使うとプログレスバーを表示できる。

ruby-progressbarのインストール

$ gem install ruby-progressbar

進捗を表示しつつファイルを読むプログラム

require "ruby-progressbar"

# ファイル名
filename = "sugoku_dekai_file.txt"

# ファイルサイズを取得しプログレスバーを作成
progressbar = ProgressBar.create(total: FileTest.size(filename))

# ファイルを開いて行ごとに処理
open(filename) do |f|
  f.each_line do |line|
    # lineに対してなにか処理
    foo(line)

    # プログレスバーを更新
    progressbar.progress = f.pos
  end
end

# 最後にプログレスバーを100%にする
progressbar.finish

ぼっちWikiに最適なGollum

GollumはデータベースにGitを使い、Markdownで書けるWiki

Gollumの特徴は以下の通り。

  • シンタックスハイライト数式に対応している
  • 様々な記法で書ける
  • gemコマンドで簡単にインストールできる
  • データベースとしてGitを使うのでMySQLなどが不要
  • RubySinatraで実装されている
  • Rubyでマクロを書いて拡張できる

Gollumのインストール

ICUという文字コード変換ライブラリに依存しているのでまずはそれをインストール。

# OS Xの場合
$ brew install icu4c

# Debian/Ubuntuの場合
$ sudo apt-get install libicu-dev

続いて、Gollum本体をインストール。

$ gem install github-markdown gollum

Gollumの起動

$ git init # 初回だけ
$ gollum --mathjax --config auth.rb --allow-uploads

認証の設定

ぼっちWikiなので、他人に内容を見られてしまっては困る。

Gollumは普通のSinatraアプリと同じように、認証をつけることができる。

たとえばこんな感じのauth.rbを作成するとBasic認証を追加できる。

module Precious
  class App < Sinatra::Base
    use Rack::Auth::Basic, "Restricted Area" do |username, password|
      [username, password] == ["foo", "bar"]
    end
  end
end

Basic認証&ファイルにパスワード直書きなので、盗聴やパスワード漏洩の可能性がある。あくまでも気休め。

他人の全ツイートをJSONで一括保存するコマンドを作った

Twitterには、自分の全ツイートアーカイブをダウンロードできる機能があるが、他人のツイートはダウンロードできない。

support.twitter.com

そこで、他人のツイートをダウンロードするalltweetsというコマンドを作った(もちろん自分のツイートもダウンロードできる)。

許可されていれば、非公開アカウントのツイートもダウンロードできる。

インストール

gemコマンドでインストールできる。Macの場合はsudoが必要。

$ gem install alltweets

使い方

結果は標準出力に表示されるのでいい感じにリダイレクトする。

$ alltweets tatzyr > tatzyr.json   # tatzyrのツイートをJSON形式でダウンロード

$ alltweets -r tatzyr > tatzyr-include-rts.json # tatzyrのツイートをリツイートも含めてJSON形式でダウンロード

github.com

RubyGemsとGitHubに公開したgemの名前を変更する

前提

  • gemをGitHubRubyGemsに公開したけど、あとから名前を変えたくなった
  • oldnameという名前のgemをnewnameという名前にしたい

oldname gem側の作業

以下のコードをoldname gemのどこかに書いて、deprecatedになることを伝える。

warn "[DEPRECATION] This gem has been renamed to `newname` and will no longer be supported. Please switch to `newname` as soon as possible."

さらに以下のコードをoldname.gemspecに追加すると、oldname gemのアップデート時にこのメッセージが出る。

spec.post_install_message = <<-MESSAGE
 ! The 'oldname' gem has been deprecated and has been replaced by 'newname'.
 ! See: https://rubygems.org/gems/newname
 ! And: https://github.com/YourID/newname
MESSAGE

最後にバージョンを1つ上げる。

lib/oldname/version.rb

module OldName
  VERSION = "0.1.1" # テキトーに0.0.1上げる
end

newname gem側の作業

newname.gemspecdescriptionsummaryに以下の文を追加しておくと親切。

Formerly known as 'oldname'.

Twitterのふぁぼを寿司にするChrome拡張作った

f:id:tatzyr:20151104190122p:plain:w640

Twitterのふぁぼがハートアイコンの「いいね」に変わった。

Twitterにハートが登場しました | Twitter Blogs

そういう事情なのでふぁぼを🍣にするChrome拡張を作ったらやたら「いいね」された。

ソースコードGitHubで公開したが、こっちは0 Starなのが大変厳しい。

github.com

GitHubのStarも🍣に置き換えるChrome拡張を作ったらStarを付けてもらえるだろうか。

iPhoneのカレンダーをGoogle Calendarに移行する方法

f:id:tatzyr:20151030202735p:plain:w171

iPhoneiPadのカレンダーをGoogleカレンダーに移行する方法。同期ではなく移行

iPhoneからAndroidにカレンダーを引っ越したいときや、Googleカレンダーと連携するアプリをiPhoneで使いたいならこの方法で移行するのがおすすめ。

手順

  1. iCloudカレンダー にサインイン

  2. サイドバーのアイコン > パブリックカレンダー をクリックし、カレンダーを共有する

    f:id:tatzyr:20151029133200p:plain:w289 f:id:tatzyr:20151029133210p:plain:w430

  3. 共有したカレンダーの URL をコピーし、ブラウザのアドレスフィールドに貼り付ける(まだreturnキーは押さない)

  4. webcalhttpに変更してからreturnキーを押す。すると、ICS ファイルがダウンロードされる

  5. パブリックカレンダーのチェックを外し、カレンダーの一般共有を停止する

  6. Google Calendarにログイン

  7. マイカレンダー > ▼ > 新しいカレンダー をクリックし同名のカレンダーを作成する

    f:id:tatzyr:20151030200437p:plain:w437

  8. 右上の設定アイコン > 設定 >「 カレンダー」タブ > カレンダーをインポートをクリックする

    f:id:tatzyr:20151029144652p:plain:w183 f:id:tatzyr:20151029144449p:plain:w464

  9. 「ファイルを選択」ボタンでダウンロードしたICSファイルを選択する

  10. 「カレンダー」セレクトボックスで、先ほど作成した同名のカレンダーを選択する

    f:id:tatzyr:20151030195238p:plain:w539

  11. インポートをクリック

これでiCloudカレンダーのGoogle Calendar移行は完了。

るびまRubyist Hotlinks - インタビュイーの好きなメソッド・嫌いなメソッド一覧

Rubyist Magazine(るびま)には、著名なRubyistにインタビューを行う「Rubyist Hotlinks」という企画があり、 「好きなメソッド、嫌いなメソッドはなんですか?」という質問をする。

その解答をまとめてRuby 2.2.0リファレンスマニュアルへのリンクをつけた。

Ruby 2.2.0では廃止されて存在しないメソッドや、レシーバが変わったメソッドがあるので全てはにリンクがついていない。例:Object#instance_evalBasicObject#instance_eval

No. インタビューイ 好きなメソッド 嫌いなメソッド
第1回 まつもとゆきひろさん Kernel.#eval Kernel.#eval
第2回 前田修吾さん Enumerable#collect String#gsub!
第3回 かずひこさん Object#=== Kernel.#eval
第4回 ただただしさん みんなだいたい好き String#scan
第5回 増井俊之さん Array#eachEnumerable#collect、yield 特になし
第6回第7回 江渡浩一郎さん BasicObject#method_missing、Enumerable 特になし
第8回 田中哲さん Regexp#to_s ブロック付きメソッドの中でのretry *1
第9回 中田伸悦さん yycompile *2 特になし
第10回 わたなべひろふみさん Kernel.#p Object#initializeMutex#synchronize
第11回第12回 後藤謙太郎さん Kernel.#p Object#inspect *3
第11回第12回 後藤裕蔵さん Enumerable#inject 特になし
第13回 関将俊さん Enumerable#inject 特になし
第14回 角谷信太郎さん Object#extendModule#const_get Test::Unit::Assertions#assert_equal *4
第15回 artonさん Object#send 自分の理解できないもの
第16回 essaさん Enumerable#collect 特になし
第17回 青木峰郎さん String#slice(regexp, n) *5 Enumerable#find_all
第18回 立石孝彰さん Enumerable#inject Kernel.#eval
第19回 伊尾木将之さん Array#eachString#next String#+
第20回 石塚圭樹さん Module#module_eval Array#nitems *6
第21回 原信一郎さん Enumerable#map Enumerable#inject
第22回 nariさん GC#enable GC#disable
第23回 yharaさん Enumerable 特になし
第24回 okkezさん Enumerable#map Kernel.#set_trace_func
第25回 加藤勇也さん BasicObject#instance_eval BasicObject#instance_eval
第26回 cuzicさん Module#class_eval Kernel.#p
第27回 小波秀雄さん Enumerable#map Kernel.#printf
第28回 Yuguiさん BasicObject#instance_eval Math.sin! *7
第29回 松田明さん 言及なし 言及なし
第30回 遠藤侑介さん Array#packString#unpack Module#define_method
第31回 樽家昌也さん Thread.new ObjectSpace
第32回 卜部昌平さん Enumerable#lazy 特になし
第33回第34回 大場光一郎さん do 特になし
第33回第34回 大場寧子さん Enumerable#map Object#nil?
第35回 島田浩二さん 言及なし 言及なし

*1:Ruby 1.9で廃止。今はbeginとendの中でのみ使える

*2:MRIの関数

*3:これをデバッグする作業が嫌い

*4:テスティングフレームワーク周りはゴタゴタしていたのでRuby 2.2.0のリファレンス・マニュアルにこのメソッドはない。参考: Rubyのテスティングフレームワークの歴史(2014年版) - ククログ(2014-11-06)

*5:引数も重要

*6:Ruby 1.9で廃止。nilではない要素の数を返す

*7:昔はあったらしいが発見できなかった。CMath.#sin!なら今でもある。