ImageMagickを使ってCLIで複数画像からGIFアニメーションを作成する

前回のEmacsのレイアウトをtmux風に変更するrotate.elで、スクリーンショットをGIFアニメーションに変換した時、ImageMagickのconvertコマンドが手軽で簡単だったのでメモ。

  convert -delay 100 *.png output.gif

-delayの値は1が10ms、100だと1000msで1秒の感覚で画像が切り替わります。後は適当にスクリーンショット撮ってconvertで変換すれば手軽にGIFアニメーションを作成出来ます。

ImageMagickはもっともっと強力な画像加工が出来るんですがそれはまたの機会に ;)

Emacsのレイアウトをtmux風に変更するrotate.el

Emacsの画面分割に関して、これまではid:shiba_yu36さんのemacsのwindow幅に合わせて、分割数を変えるを便利に使わせてもらっていました。ですが、コードを書いている時には等分以外にも結構頻繁にレイアウトを変更することが多いと思います。

画面のレイアウト管理系ではid:kiwanamiさんのe2wmが高機能で良さそうな感じでしたが、こまめにwindowを1つにしたり分割したりしているのでもう少し軽い感じのものを探していました。

理想はtmuxのペインのプリセットのレイアウトがぐるぐるまわるような奴が欲しかったのですが見当たらなかったため簡単な物を作成しました。

rotate.el

daic-h/emacs-rotate

機能はプリセットで用意されているレイアウトを現在分割しているwindowの数に合わせて切替えるrotate-layoutと、レイアウトはそのまま中のbufferだけをグルグル回すrotate-windowです。プリセットの種類はtmuxと同じ、

  • even-horizontal
  • even-vertical
  • main-horizontal
  • main-vertical
  • tiled

の5種類で、rotate-layoutという関数を実行するたびに上から順番にlayoutが切り替わります。自分は下記の様に設定してます。

  (require 'rotate)
  (global-set-key (kbd "C-t") 'rotate-layout)
  (global-set-key (kbd "M-t") 'rotate-window)

これで、C-tを押すと順番にレイアウトが切り替わっていき、M-tでレイアウトの中のバッファーが順番にまわります。単体ではしっくり来なかった、分割したwindowを黄金比で拡大してくれるroman/golden-ratio.elと合わせて使うと意外と良い感じかもしれない。

動作の様子

rotate-window

rotate-layout、2 window

rotate-layout、4 window

rotate-layout、9 window

OSX「VNC使用者が画面を操作することを許可」をCLIからオン

MacbookAirの充電ができない日が最近続き、ついに昨日全く充電できなくなりました。

普段は会社のiMacに接続する必要がある場合は会社のSSHゲートウェイにトンネルを貼ってあとは画面共有で接続していたんですが、 Air使えなくても画面共有ってVNCならWindowsのVNCクライアントからでも接続できるからいいやと思っていたら、

画面共有以外のVNCクライアントから接続する場合はこの「VNC使用者が画面を操作することを許可」ってのをオンにしていないとダメらしい・・・

さすがにこれをオンにするために休日会社に行くのは本末転倒なので、SSHで接続することはできるのでCLIでオンにする方法をググってたらやっぱりありました。

  sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -access -on -clientopts -setvnclegacy -vnclegacy yes -clientopts -setvncpw -vncpw mypasswd -restart -agent -privs -all

この kickstart ってやつで色々操作できるみたいです。ちなみにオフにするには

  sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -deactivate -configure -access -off

ちなみにMacBookAirは今日渋谷のジーニアスバーいったらアップルケアなかったけど無償でアダプタくれました! : )

osx

社内勉強会でGitについて発表しました

 

Gitについて今までわりと適当に把握してたけどいい整理になった。 特にmergeの際の動きでブランチやコミットオブジェクトについて前よりは理解できたと思う。

後、今回初めてKeynote使ってみたけどかなり使いやすかったので満足。

 

 

たった200行で作れるテトリス Ruby編

200行テトリス

ソースコードはGithubから。

daic-h/tetris-rb 行数は200行ピッタリ。偶然()

イテレータの部分等でfor文で配列アクセスなんかやってられないので微妙に違いますが、 だいたい元ネタの機能や実装方法なんかそのまま移してあります。

Continue reading...

MongoDBのローカル用Sharding環境をRubyで構築する

Post thumbnail

MongoDBのSharding環境ををローカルで作る必要があったので、3カ月ぶり位にRubyを書いてみた。

ruby_mongo_sharding.rb — Gist

Continue reading...

転職しました。

沖縄高専を卒業して2年間お世話になったドリーム・アーツ沖縄(旧インデックス沖縄)を4月末で退社し、Nubee Tokyoに転職しました。

ドリーム・アーツ沖縄では新卒で採用して頂きRuby(Rails)での、沖縄では非常に貴重な仕事をさせてもらいました。3年目でこれからという時に心苦しいのですが、東京で挑戦してみたい気持ちが強くなり、今回転職することを決断しました。

新しい職場ではソーシャルゲーム系の開発に従事することになりますが、六本木・渋谷周辺やその他のRuby系・ソーシャルゲーム系の勉強会には積極的に顔を出していきたいと思いますのでどうぞよろしくオネシャス!

Continue reading...

SchemeとRubyで再帰プロセスと反復プロセス

たまたま見つけた記事、関数型言語の勉強にSICPを読もう - (7) 1章 - 反復をマスターしたいけど・・・が面白そうなのでやってみた。

取り敢えず factorial から。

再帰プロセス

(define (factorial n)
  (if (= 0 n)
      1
      (* n (factorial (- n 1)))))

反復プロセス

(define (f n)
  (define (f-iter a n)
    (if (= n 0) a
        (fa-iter (* a n) (- n 1))))
  (fa-iter 1 n))

または

(define (factorial n)
  (iter 1 1 n))

(define (iter product counter max-count)
  (if (> counter max-count)
      product
      (iter (* counter product)
            (+ counter 1)
            max-count)))

反復の場合、カウントを上げていく場合と下げていく場合の2種類で書くことができた。個人的には上がっていくほうが感覚的には分かりやすいが、スッキリ書くなら下がっていく方なのでちょっともどかしい。

次に1からnまでの数を足し合わせる場合。

再帰プロセス

(define (sum n)
  (cond ((= n 0) 0)
        (else (+ n (sum-r (- n 1))))))

反復プロセス

(define (sum n)
  (define (sum-iter a n)
    (if (= n 0) a
        (sum-iter (+ a n) (- n 1))))
  (sum-iter 0 n))

反復プロセス(カウントUPver.)

(define (sum-2 n)
  (define (sum-2-iter a count max)
    (if (> count max) a
        (sum-2-iter (+ a count) (+ count 1) max)))
  (sum-2-iter 0 1 n))

ここまではそんなに難しくない。次の問題はたしかにちょっと難しかった。

(define (f n)
  (if (< n 3)
      n
      (+ (f (- n 1))
         (* 2 (f (- n 2)))
         (* 3 (f (- n 3))))))

取り敢えずこれを反復プロセスで書けばいいようだ。コツとしては(- n x)の分を引数で渡してあげる事で関数を膨張させずにすむのだがそこまで気づくのに手間取ってしまった。

反復プロセス

(define (f n)
 (f-iter 2 1 0 n))

(define (f-iter a b c n)
 (cond ((= n 0) c)
       ((= n 1) b)
       ((= n 2) a)
       (else (f-iter (+ a (* 2 b) (* 3 c)) a b (- n 1)))))

これをカウントUPにしていくのは骨が折れそうだったので断念。

次に、順番が逆になってしまったが小飼さんからの問題。fibonacciを反復で書けばいいみたいだ。

再帰プロセス

(define (fib n)
  (cond
   ((= n 1) 1)
   ((= n 2) 1)
   (else (+ (fib (- n 1))
            (fib (- n 2))
            ))))  

反復プロセス

(define (fib-i n)
  (fib-iter 1 1 n))

(define (fib-iter a b n)
  (cond ((= n 1) b)
        ((= n 2) a)
        (else (fib-iter (+ a b) a (- n 1)))))  

反復プロセス(カウントUPver.)

(define (fib-i-2 n)
  (fib-iter-2 1 1 0 n))

(define (fib-iter-2 a b count max)
  (if (> count max) a
      (cond ((or (= count 1) (= count 2))
             (fib-iter-2 1 1 (+ count 1) max))
            (else
             (fib-iter-2 (+ a b) a (+ count 1) max)))))  

とまあ、問題は全部でこんな感じ。普段使わない頭のを使ったような気がする。

最後にRubyプログラマらしくRubyで解いて終わりにしよう。(全部は面倒くさいのでfibonacciだけ :p)

# -*- coding: utf-8 -*-
#再帰プロセス
def fib n
  n <= 2 ? 1 : fib(n - 1) + fib(n - 2)
end

#反復プロセス1
def fib_i n
  fib_iter(1, 1, n)
end

def fib_iter(a, b, n)
  case n
  when 1 then b
  when 2 then a
  else
    fib_iter (a + b), a, (n - 1)
  end
end

#反復プロセス2
def fib_i_2 n
  fib_iter_2(1, 1, 0, n)
end

def fib_iter_2 a, b, count, max
  return a if count > max

  case count
  when 1, 2
    fib_iter_2(1, 1, (count += 1), max)
  else
    fib_iter_2((a + b), a, (count += 1), max)
  end
end

puts "再帰プロセス:", fib(10)
puts "反復プロセス1:", fib_i(10)
puts "反復プロセス2:", fib_i_2(10)

GithubでWatchしているリポジトリをもう少し分かりやすく見たいと思ってるあなたへ

Post thumbnail

Githubの「Watched Repositories」ってついつい追加して、気がつけば100とか普通に超えちゃいますよね。

デフォルトのUIだとなかなか見返すこともなく「あれ、なんだろうこれ」みたいな事が多かったり、リポジトリwatchしようと思ったら昔既にwatchしてたなんてことが多かったので、少しだけWatched Repositoriesを分かりやすく表示できるサイトを作りました。

OctoWatcher

Continue reading...

MacのHomebrewで1.6系のSVNをインストールする

日本語ファイルに対応させるために新しくビルドしようと思ったけど、なんか1.6と1.7で互換性があるだの無いだのよく情報が分からなかったので取り敢えずhomebrewの中での1.6系最後のバージョンでインストールする。: p

  • ubversion-deps-1.6.17.tar.bz2
  • brew install  https://raw.github.com/mxcl/homebrew/6e2d550cf4961129a790bfb0973f8e88704f439d/Library/Formula/subversion.rb --unicode-path
    

    こういう時githubって便利ですよね ; )