// fib.js
function fib(n) {
  if (n == 0 || n == 1) return n;
  return fib(n - 1) + fib(n - 2);
}
$ npm install js2coffee -g
$ js2coffee fib.js > fib.coffee
// fib.coffee
fib = (n) ->
  if n == 0 or n == 1
    return n
  fib(n - 1) + fib(n - 2)

「(既存プロジェクトのjsを変換して)ふー・・・」

「弊社もcoffee導入しました(キリッ」

  • nave = rvm
  • node.js = ruby(ex:mri-ruby)
  • npm = rubygems

nave

$ git clone git://github.com/isaacs/nave.git ~/.nave
$ cd ~/.nave
$ ./nave.sh install stable

ここで普通は~/.zshrcとかにnave.sh use stableとか書けとありますが、設定したshellをもう一段階開くのが何か嫌だ。(確かにVirtual Environment for Nodeって感じではあるが)

Terminal — zsh — 80×24

キモス。

% env | grep NODE
NODE_PATH=/Users/komagata/.nave/installed/0.4.8/lib/node
% env | grep NAVE
NAVEVERSION=0.4.8
NAVE=0.4.8
NAVELVL=1
NAVE_DIR=/Users/komagata/.nave
NAVE_ROOT=/Users/komagata/.nave/installed
NAVE_SRC=/Users/komagata/.nave/src

それっぽい環境変数+PATHを手動で.zshrc設定に手動で設定することにした。

export PATH=~/.nave/installed/0.4.8/bin:$PATH
export NODE_PATH=/Users/komagata/.nave/installed/0.4.8/lib/node
export NAVEVERSION=0.4.8
export NAVE=0.4.8
export NAVELVL=1
export NAVE_DIR=/Users/komagata/.nave
export NAVE_ROOT=/Users/komagata/.nave/installed
export NAVE_SRC=/Users/komagata/.nave/src

npm

$ curl http://npmjs.org/install.sh | sh

インストールは楽。

1.0.0から?は普通にnpm installするとcurrent directoryのnode_module以下に入る。この名前も嫌だなあ。そうするとライブラリはプロジェクト毎のnode_moduleに入り、普段使いのコマンドとして使えない。その場合は-g(global)オプションを付けてinstallすればいいらしい。

$ npm install coffee-script -g

これでcoffeeコマンドが使えるようになりました。

しかし、これだとrequire出来なくなっちゃうのでnpm link fooでglobalな場所に入ったライブラリからcurrentのnode_moduleへシンボリックリンクを貼る必要がある。これはsucksでございます。

動きの早い界隈なので暫くしたらもっと便利になるかもしれません。

vim-coffee-script

Bundle 'kchmck/vim-coffee-script'

vundlerを使ってる場合は上記を.vimrcに追加して:BundleInstall。また、autocmdでファイル保存と同時にcompileするようにしてもいいけど、railsとかだとディレクトリ違うのでウザイかも。

:CoffeeMakeでコンパイル。

Terminal — vim — 80×24

:'<,'>CoffeeCompile
console.log('foo');

visual選択してcompileなんてシャレオツなことも。

# Gemfile:
gem 'barista'
gem 'therubyracer-heroku'
$ rails g barista:install

coffeeをrailsに提供するからバリスタってか?heroku上ではコンパイルするためのjs実装が無いのでエラーが出る(ローカルではnodejsを使ってます)。therubyracerはv8のrubyバインディング。therubyracer-herokuはそれをherokuで動かすためのもの(何やってるのかはわからない。見てない)。

jpgのグリッチをもうちょっと。

こちらのpythonのコードをrubyで書いて幾つかのパターンを作ってみた。

#!/usr/bin/env ruby

require 'rubygems'
require 'mini_magick'
require 'base64'

path = ARGV.first
img = MiniMagick::Image.open(path)
txt = Base64.encode64(open(path, 'rb') {|f| f.read }).gsub(/\n/, '')
num = img[:width] * img[:height] / 10000

(1..32).each do |i|
  glitched_txt = txt.split(//).map do |c|
    if c == '0' and rand(num) == 0
      rand(9).to_s
    else
      c
    end
  end.join
  open("glitched-#{i}.jpg", 'wb') {|f| f.write(Base64.decode64(glitched_txt)) }
end

glitch

glitched-16

こっちの方が怖くていいな。

参照:サケグリッチ

夜、寝る前に布団のなかで、

(画像グリッチってデジタルなホラー表現に使えるんじゃね?)

と唐突に思い、布団から飛び起きてこちらを参考にいろんなパターンを生成するコードを書いてみた。

# glitch.rb
(1..9).each do |i|
  (1..9).each do |h|
    `cat bell.jpg | sed 's/#{i}/#{h}/g' > bell-#{i}-#{h}.jpg` unless i == h
  end
end

元の画像はこれ。

昼-寺

沢山できてる。

jpg

jpgとgifを試してみたんですが、単なる文字置換なのでフォーマットの性質がモロにでて面白い。jpgの場合はカオス過ぎてもうちょっと別のパターンを使った方が良さそう。

gif

gifの場合は何色が何個続くかってだけなので不気味感はちょっと少なめ。jpgとgifでそれぞれ怖そうなのは下記の2つぐらいかなあ。

bell-8-6

bell-7-8

参照:hysysk:blog: today's glitch 3

cofeescriptを使ってみました。気になっていたのは親クラスのコンストラクタを呼ぶ方法(のスマートな書き方)。

以前は、JavaScript Good Partsに載っていたnewやprototypeを使わない方法でやっていたんですが、coffeeのextendsはどういうコードを吐くんだろう?

// foo.coffee
class Foo
  constructor: (name) ->       
    console.log name           

class Bar extends Foo          
  constructor: ->
    super 'unk'
// foo.js
var Bar, Foo;
var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { 
  for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } 
  function ctor() { this.constructor = child; } 
  ctor.prototype = parent.prototype;
  child.prototype = new ctor;
  child.__super__ = parent.prototype;
  return child;
};
Foo = (function() { 
  function Foo(name) { 
    console.log(name);
  } 
  return Foo;
})();
Bar = (function() { 
  __extends(Bar, Foo);
  function Bar() { 
    Bar.__super__.constructor.call(this, 'unk');
  } 
  return Bar;
})();

オブジェクト指向で書けるライブラリによくあるextends関数を作ってそれを使ってるだけでした。まあ、そりゃそうか。

coffee自体は綺麗だし、SASS/SCSSみたいに最初のうちは吐かれたjsを確認しながらになるけど、段々js見る頻度が減ってきてるので殆ど見ないで行けるようになれば使えるなーと思いました。

sqlite3-rubyをインストールしたら(tapsの依存で入る)見覚えのあるマークが。

Terminal — zsh — 80×24

これ、Twitterで聞いたらハートを横にしたマークなんですね。(屁的なものかと思ってた)

「sqlite3-rubyはsqlite3に変わったYO!」ってだけの警告文なのに誰が書いたのか分かるのって凄い個性ですね・・・。

authorを見に行ってみる。

sqlite3-ruby | RubyGems.org | your community gem host

やっぱりアンタか・・・。

フォーマットはhtml。epubもpdfもメンドイ。というか単なるWebサイトであって欲しい。ユーザー登録が必要なWebサイトで、サインインしていれば買った本のページが見れる。

僕にとってテキストを一番読み易いのはスマホ + 横書き + 無限縦スクロール(要はWebでよくある奴)なのでスマホでいい塩梅のレイアウトにして欲しい。(はてなダイアリーのスマホ版Webぐらいで十分読み易い)

著作権やライセンス表示はしっかりいれるが、システムで縛らず、無茶した奴をタイーホするぐらいにして欲しい。

縦書きやレイアウトにこだわりたい本は印刷物を同じページから買えるようにする。

懸念点

  1. 無法者やそもそも著作権に頓着しない外人への対応。
  2. 所有感がないこと。(僕は気にならないが)

PayPal Express Checkout, Subscriptionsに行ってきました。

発表の内容については@mochizさんがまとめられています。

Ninjava/PayPal Express Checkout, Subscriptions - Tokyo PayPal Develope... - mochiz blog」 

結論からいって僕は凄く面白かったです。発表の内容も参考になったし(RecurringPaymentが10秒ぐらいPendingになるとか)、何よりいつもの勉強会やイベントなどと違うカオス感が斬新でした。それに、どんなイベントでも一回目っていうのは濃い人が集まるもので、大体面白いものなんですよね。

僕は普段、どういうイベントなのか想像が付く場合は、「後でスライドみればいいかな?」と思って行かないことが多いんですが、今回はイベントの立ち上げ方から実際のイベント、飲み会と予想できない/はじめてのことだらけで楽しかったです。

発表は半分が日本語、半分が英語で、会場は日本語通じる率90%、英語通じる率70%みたいな感じでカオス。僕も英語の部分は20%ぐらいしかわかりませんでしたw。

でも技術に関しては共通なのでなんとかなるもんで、適当に酔っ払いました。

こういうイベントを@mreinschさんがまた企画しているのでまた行ってみたいと思います。

ttfのwebfontをWebFont Loaderで読み込む時に"fontがapplication/octet-streamになってるぞ"みたいなnoticeが出る。

ローカル(WEBrick)では出てなかったので気付かなかったがHeroku(nginx + thin)では出てる。

キモイので自前のnginxがあるサーバーにfontを移して/etc/nginx/mime.typesに下記を追加。

application/x-font-ttf    ttf;

ブラウザのDeveloper ToolsのNetworkでcontent-typeが楽に確認できて便利。

怖話