( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

tmuxでマウス(trackpad)でバッファをスクロールする

お役立ち情報です。



.tmux.confにこのように書くとよいそうです。

set-window-option -g mode-mouse on


iTerm2で、以下のようにxterm mouse reportingを有効にしておきます。

f:id:yuroyoro:20130930172828p:plain


さっそく設定。

yuroyoro/dotfiles https://github.com/yuroyoro/dotfiles/commit/4c6eb8520d878867fcf1a685991067d56ff84cb9

Rubyはいつも俺に新鮮な驚きを提供してくれる

こんなコードがあった。 blockの評価結果が偽だったらエラーにする、という意図だと。

def die!(&block)!
  yield || raise("error")
end

実行

irb(main):008:0> die! { true }
RuntimeError: error
	from (irb):6:in `die!'
	from (irb):8
	from /usr/local/var/rbenv/versions/1.9.3-p448/bin/irb:12:in `<main>'

irb(main):009:0> die! { false }
=> true

( ゚д゚) ?!


正しくはこうですね

def die!(&block)
  yield || raise("error")
end

syntax errorにはなりませんか。そうですか……。

gfspark: GrowthForecastのグラフをターミナルに表示する

というコマンドを作った。みんな大好きGrowthForecast!!


https://github.com/yuroyoro/gfspark/raw/master/images/gfspark_screenshot1.png
https://github.com/yuroyoro/gfspark/raw/master/images/gfspark_screenshot2.png

gfspark
yuroyoro/gfspark · GitHub

Installation

  $ gem install gfspark

Usage

以下の3つのいずれかの方法でグラフを指定してくれ。

gfspark "グラフのURL"
gfspark your_service/your_section/your_graph h --url=http://your.gf.com
gfspark your_service your_section your_graph h --url=http://your.gf.com


Complex Graphには対応してない。あと、内部でsttyコマンドを使ってるのであっWindows……


グラフが上手く表示されない場合は、`-n`オプションを試してみてくれ。例えば、フォントがRictyの場合はグラフのバーが詰まってしまうので、`-n`つけるといい感じになる。


っていうか、U+2580あたりがちゃんと表示されるフォントを使ってな。俺が愛用しているあずきフォントだとうまく表示されなくて( ;゚皿゚)ノシΣ フィンギィィーーッ!!!ってなるしそもそも何のために作ったんだよ。


オプションはこんな感じだ。この辺のオプションを毎回指定するのがタルい場合は、"~/.gfspark"ってYAMLファイルに書いておくとデフォルト値として使用されるぜ。

gfspark : Growth Forecast on Terminal

usage: gfspark <url|path|service_name> [section_name] [graph_name]

  Examples:
    gfspark http://your.gf.com/view_graph/your_service/your_section/your_graph?t=h
    gfspark your_service/your_section/your_graph h --url=http://your.gf.com/view_graph
    gfspark your_service your_section your_graph h --url=http://your.gf.com/view_graph

  Options:
        --url=VALUE                  Your GrowthForecast URL
    -u, --user=USER
    -p, --pass=PASS
    -t=VALUE                         Range of Graph
        --gmode=VALUE                graph mode: gauge or subtract (default is gauge)
        --from=VALUE                 Start date of graph (2011/12/08 12:10:00) required if t=c or sc
        --to=VALUE                   End date of graph (2011/12/08 12:10:00) required if t=c or sc
    -h, --height=VALUE               graph height (default 10
    -w, --width=VALUE                graph width (default is deteced from $COLUMNS)
    -c, --color=VALUE                Color of graph bar (black/red/green/yellow/blue/magenta/cyan/white)
    -n, --non-fullwidth-font         Show bar symbol as fullwidth
        --sslnoverify                don't verify SSL
        --sslcacert=v                SSL CA CERT
        --debug                      debug print

    -t option detail:
        y : Year (1day avg)
        m : Month (2hour avg)
        w : Week (30min avg)
       3d : 3 Days (5min avg)
      s3d : 3 Days (5min avg)
        d : Day (5min avg)
       sd : Day (1min avg)
       8h : 8 Hours (5min avg)
      s8h : 8 Hours (1min avg)
       4h : 4 Hours (5min avg)
      s4h : 4 Hours (1min avg)
        h : Hour (5min avg),
       sh : Hour (1min avg)
        n : Half Day (5min avg)
       sn : Half Day (1min avg)
        c : Custom (5min avg)
       sc : Custom (1min avg)

今後の開発予定

Haskellで書き直したいです。Pull Reqeustお待ちしていますだぜ。

社蓄度ロール(SHAチェック)

社蓄度

どれだけ勤めている会社(営利企業)に飼い慣らされてしまい自分の意思と良心を放棄し奴隷(家畜)と化しているかを指す。
この数値は労働基準法違反な事柄やブラック企業的事象に遭遇してしまうことで増加する。ただし、社蓄度ロール(SHAチェック)に成功すればその増加量は大幅に低減できる。


SHA値といわれているが、「社蓄度」が正しい。
社蓄度のスタート値は(100- POW(=Power,精神力)×5)。
最大社蓄度ポイントは「99-〈ブラック企業知識〉」で、〈ブラック企業〉についてよく知っているほど社蓄度の最大値は下がっていく。

SHAチェック

1d100(100面ダイス)で社蓄度以上を出す。成功すればだいたい社蓄度は増えない(増えることもある)。
SHAチェックは、超過勤務・休日出勤・理不尽なパワハラなどに直面した際に実施する。
社蓄度が増加するほど成功率は下がり、疑問を持たなくなっていく。

狂気

「一時的な狂気」と「不定の狂気」がある。


「一時的な狂気」は5ポイント以上の社蓄度を一度に獲得し、かつ〈アイデア〉ロール(別名:「怖い考えになってしまった」ロール)に成功したときに発生する。
〈アイデア〉ロールはINT(Inteligence,知性)×5で判定。頭がよいほど「真実」に気づき狂いやすいことになる。
失神する、金切り声をあげる、赤ん坊のようにヨダレを垂らしながらキーキー声をあげる、けいれんするなど。


「不定の狂気」は、社蓄度が100に達するか、1ゲーム時間内に現在の(100 - 社蓄度)の20%を超える社蓄度を獲得したときに発生する。
社蓄度が増えれば増えるほど発生しやすくなる。
一般的な不定の狂気には「緊張症・痴ほう症」「記憶喪失」「偏執症(パラノイア)」「恐怖症またはフェティッシュ」「強迫観念、中毒、けいれん発作」「誇大妄想」「精神分裂症」「犯罪性精神異常」「多重人格」などがある。

参考

Railsのログに出力されるパラメータやSQLを整形する

Railsのログに出力されるパラメータやSQLを整形してみた。開発中は便利かもしれない。
こんな感じになる。

http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuroyoro/20130412/20130412141437_original.png


詳細はこのコミットを参照。サンプルのアプリとしてRailsApps/rails3-bootstrap-devise-cancan · GitHubを使わせてもらった。

Apply pretty formating to logged sql/parameters · f734fb0 · yuroyoro/rails3-bootstrap-devise-cancan · GitHub


SQLの整形には、sonota/anbt-sql-formatter · GitHubを使った。
Parameterは、michaeldv/awesome_print · GitHubを利用してる。ap便利。


ActionController::LogSubscriberやActiveRecord::LogSubscriberでログ吐いてるメソッドをコピーしてきて猿パッチするしかうまいやりかたが思い付かなかったので、修羅の国の人もっといい方法あったら教えてください。

F.Y.I
Pretty Print SQL in Ruby - Stack Overflow

CLIでJSONの整形をする

curlとかで取ってきたJSONを整形して表示したかったのでググったらいい方法があったので。

unix - How to pretty-print JSON from the command line? - Stack Overflow


パイプで`python -mjson.tool`に渡すだけ。pythonすごい。

$ curl -s http://api.tumblr.com/v2/blog/david.tumblr.com/info\?api_key\=fuiKNFp9vQFvjLNvx4sUwti4Yb5yGutBN4Xh10LXZhhRKjWlV4 | python -mjson.tool
{
    "meta": {
        "msg": "OK",
        "status": 200
    },
    "response": {
        "blog": {
            "ask": true,
            "ask_anon": false,
            "description": "\u201cMr. Karp is tall and skinny, with unflinching blue eyes and a mop of brown hair. He speaks incredibly fast and in complete paragraphs.\u201d \u2013&nbsp;NY&nbsp;Observer",
            "name": "david",
            "posts": 4238,
            "share_likes": false,
            "title": "David\u2019s Log",
            "updated": 1364854166,
            "url": "http://www.davidslog.com/"
        }
    }
}


もっと便利なjqというものを教えてもらった。



f:id:yuroyoro:20130402190534p:plain

jq


jqは、jsonをparseしてsed/awk/grepみたいにfilterしたり加工したりできる。

jqだと、出力に色がついて幸せになれる。

f:id:yuroyoro:20130402190615p:plain

`| jq '.' -C | less -R`で、色つきでlessで閲覧できて意識アセンションする。

Rubyで関数合成とかしたいので lambda_driver.gem というのを作った

f:id:yuroyoro:20130327185507p:plain
LambdaDriver by yuroyoro

Rubyで、Procやlambdaで関数合成できるようにしたかったので、lambda_driver.gemというのを作った。
内容的にはこの辺で書いたヤツをgemにした感じ。


こんな風に、カッコよくコードが書ける。

require 'lambda_driver'

# [:foo, :bar, :baz].map{|s| s.to_s }.map{|s| s.upcase }
# [:foo, :bar, :baz].map(&:to_s).map(&:upcase)
[:foo, :bar, :baz].map(&:to_s >> :upcase ) # => ["FOO",  "BAR",  "BAZ"]

# [:foo, :hoge, :bar, :fuga].select{|s| s.to_s.length > 3} # => [:hoge, :fuga]
[:foo, :hoge, :bar, :fuga].select(&:to_s >> :length >> 3._(:<)) # => [:hoge, :fuga]


このgemは、個人的に「こういう風に書けたらいいな」という感覚に基づいているので、可読性とかは、アレだ、言わせんな。
演算子についても、すでに定義されているものは上書きしないようになってるので安全ですよ?


あと、名前の由来は≪虚弦斥力場生成システム≫です。

Proc/lambda/Symbol/Methodへの拡張

  • call
  • compose
  • with_args
  • flip
  • curry

Proc#

`Proc#<` は `Proc#call`へのaliasなので、Procの呼び出しは以下のように書ける。

  f = lambda{|x| x.to_s }
  f < :foo # => "foo"

Proc#+@

Proc/lambda/Symbol/Methodに単項演算子+を適用すると、to_procを呼び出す。

  +:to_s           # => #<Proc:0x007ff78aadaa78>
  +:to_s < :foo    # => "foo"

Proc#compose

関数合成は`Proc#compose`や`>>`, `<<` でできる。

`f.compose(g)`は、合成関数`lambda{|*args| f.call(g.call(*args)) }`を生成して返す。

  f = lambda{|x| x.to_s * 2 }
  g = lambda{|y| y.length }

  h = f.compose g  # => #<Proc:0x007ff78aa2ab2>
  h.(:hoge)        # => "44" ( == f.call(g.call(:hoge)) )


`Proc#compose`は`<<` にaliasされている

  f << g          # => f.compose(g)
  f << g < :hoge  # => "44" ( == f.call(g.call(:hoge)) )


`>>`は、Proc#compseをレシーバーを入れ替えて呼び出す。結果的に、`g.call(f.call(x))`になる

f >> g          # => g.compose(f)
f >> g < :hoge  # => "8" ( == g.call(f.call(:hoge)) )   

Proc#with_args

`Proc#with_args`は、2引数以降の引数を部分適用した関数を返す。

  f = lambda{|x, y, z| [x, y, z]}

  h = f.with_args(:a, :b)   # => #<Proc:0x007ff78a9c5ca0>
  h.(:c)                    # => [:c, :a, :b] ( == f.call(:c, :a, :b) )


`Proc#with_args`は`*`にaliasされている。

  f = lambda{|x, y| [x, y]}

  f * :foo          # => #<Proc:0x007ff78a987540> (== f.with_args(:foo) )
  f * :foo < :bar   # => [:bar,  :foo] ( == f.with_args(:foo).call(:bar) )

Proc#flip

第1引数と第2引数を入れかえた関数を返す。結果の関数はカリー化される。

  f = lambda{|x, y, z| [x, y, z]}

  h = f.flip                    # => #<Proc:0x007ff78a942fa>
  h.call(:a).call(:b).call(:c)  # => [:b, :a, :c] (== f.curry.call(:b).call(:a).call(:b))
  h < :a < :b < :c              # => [:b, :a, :c] (== f.curry.call(:b).call(:a).call(:b))


`Proc#flip`を呼び出すProcが可変長引数の場合は、明示的にarityを指定してfilpを呼び出す必要がある。
arityが0または1ならば、何もせずに自身を返す。

  p = Proc.new{|*args| args.inspect }

  p.arity                           # => -1
  p.flip(3).call(:a).(:b).(:c)      # => "[:b, :a, :c]"
  p.flip(4).call(:a).(:b).(:c).(:d) # => "[:b, :a, :c, :d]"


このメソッドは `~@` にaliaasされているので、Procに単項演算子`~`を適用することで呼び出すこともできる。
その際には、arityの指定はできない。

  ~f # =>             #<Proc:0x007ff78a8e22c> (== f.filp)
  ~f < :a < :b < :c   # => [:b, :a, :c] (== f.filp.call(:b).call(:a).call(:b))

Symbol extensions

  • to_method

Symbol#to_method

`Symbol#to_method`は、引数のオブジェクトに対してObject#methodを自身を引数に呼び出す関数を生成して返す。
単項演算子`-`にaliasされている。

  (-:index).call("foobarbaz")             # => #<Method: String#index>
  (-:index).call("foobarbaz").call("bar") # => 3 (== "foobarbaz".index(3) )

  -:index < "foobarbaz"         # => #<Method: String#index>
  -:index < "foobarbaz" < "bar" # => 3 (== "foobarbaz".index(3) )

Class extensions

`Class#instance_method`を `/`演算子で呼び出すことができる。これは、少しclojureを意識した。

  String / :index # => #<UnboundMethod: String#index>

UnboundMethod extensions

`UnboundMethod#bind`を `<`演算子で呼び出すことができる。上記の`Class#/`と組み合わせるとカッコよく書ける。

  String / :index                    # => #<UnboundMethod: String#index>
  String / :index < "foobarbaz"      # => #<Method: String#index>
  String / :index < "foobarbaz" < "bar"  # => 3 (== "foobarbaz".index(3) )

Object extensions

  • obj.revapply(|>)
  • obj._
  • obj.disjunction(f)

Object#revapply

`Object#revapply` は、自身を渡された関数に適用する。Scalazの`|>`な。
revapplyという名前の由来はOCamlから。

  f = lambda{|x| x * 2 }

  "foo".revapply(f) #  => "fooffoo" (== f.call("foo") )

Object#_

`Object#_`は、オブジェクトからMethodオブジェクトを簡単に取り出すためのショートカット。

"foobarbaz"._.index         # => #<Method: String#index>
"foobarbaz"._.index < "bar" # => 3 (== "foobarbaz".index("bar") )

2._(:>=)                    # => #<Method: Fixnum#>=>
[1, 2, 3].select(&2._(:>=)) # => [1, 2]( = [1, 2].select{|n| 2 >= n})

Object#disjunction

`Object#disjunction`は、引数の関数に自身を適用した結果がnilでなければそれを返し、nilだったらレシーバーオブジェクト自身を返す。

  f = lambda{|x| x % 2 == 0 ? nil : x * 2}

  2.disjunction(f) # => 2 (disjunction returns reciever object)
  3.disjunction(f) # => 6 (disjunction returns f(3) )