ringはrubyでいえばrack。

(ns unk.core
  (:use ring.adapter.jetty))

(defn app [req]
  {:status 200
   :headers {"Content-Type" "text/plain"}
   :body "unk"})

(defn -main []
  (run-jetty app {:port 3000}))
$ lein run -m unk.core
2011-06-19 14:43:10.189:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2011-06-19 14:43:10.191:INFO::jetty-6.1.26
2011-06-19 14:43:10.265:INFO::Started SocketConnector@0.0.0.0:3000

http://localhost:3000/

OMG!

ring.util.responseを使えばもうちょっと楽に書ける。

(ns unk.core
  (:use ring.util.response
        ring.adapter.jetty))

(defn app [req]
  (response "unk"))

(defn -main []
  (run-jetty app {:port 3000}))

run-jettyの部分がserver依存なので切り離す必要があると思う。どうやるのが普通なんだろう?

clojars.orgを検索した感じだとring server(紛らわしい名前だな)としてadapterがあって使えるそうなのはjetty, mongrel2, httpcoreぐらい。

$ sudo apt-get install ethtool
$ sudo ethtool -K eth0 tso off

永続的に使いたい場合は/etc/network/interfaceの末尾に下記を追記。

post-up /sbin/ethtool -K eth0 tso off

参照:[001388]さくらのVPSで「Debian」を利用していますが、回線速度が遅くアクセスに時間がかかります。 | FAQ Search - さくらインターネット

  • leiningen = rubygems + bundler
  • clojars.org = rubygems.org
  • nailgun = SWANK
  • vimclojure = SLIME

Clojure + Leiningen

leiningen入れるとclojureも入る。

% curl -O https://raw.github.com/technomancy/leiningen/stable/bin/lein
% chmod +x lein
% lein repl
Using JLine for console I/O; install rlwrap for optimum experience.
REPL started; server listening on localhost:29973.

rlwrap入れたほうが良いと出るので入れる。

% brew install rlwrap
% lein repl
REPL started; server listening on localhost:58951.
user=> 1234
1234
user=> (+ 1 2)
3
user=> (exit)

うん。

VimClojure

vimの場合はVimClojureというのが定番ぽい。VimClojureはSyntax Highlightingとかだけでも使えるんだけど、NailgunというCLで言えばSWANK的なものへのインターフェースが同伴されていて、clojureファイルを開くと同時にNailgun Serverに接続することが出来る。

Nailgun ServerもClientも別個にインストールする必要がある。

% vi ~/.vimrc
Bundle 'VimClojure'
let vimclojure#WantNailgun = 1
let vimclojure#NailgunClient = "ng"
:BundleInstall

Nailgun Client

% brew install nailgun

ngコマンドが使えるようになる。(上記のNailgunClientで指定してるのがコレ)

Nailgun Server

% lein plugin install org.clojars.autre/lein-vimclojure 1.0.0

lein plugin install xxx versionはleinのプラグインをインストールするのであって、ライブラリを入れてる訳じゃない。両方共clojars.orgにホストされてるので混同しないようにする。(依存ライブラリはproject.cljに書いて後述するlein depsで入れる)

lein helpするとlein vimclojureというサブコマンドが増えてる。

helloworld

% lein new helloworld
% cd helloworld
% tree
.
├── README
├── classes
├── lib
├── project.clj
├── src
│   └── helloworld
│       └── core.clj
└── test
    └── helloworld
        └── test
            └── core.clj
% lein deps

project.cljに書かれてるライブラリ(clojure処理系自身を含む)を取ってきてlibに入れてくれる。

% lein vimclojure
NGServer started on 127.0.0.1, port 2113.
% vi src/helloworld/core.clj

Terminal — vim — 80×24

あとはreplが開いてSLIMEみたいに評価できる。

最近のpowはコンフリクトしない。完。

あなたの Web サイト

powはversion毎のディレクトリを作ってlatestなものにcurrentからsymlinkが張られるのでupdateも普通にインストールするだけでいい。

$ curl get.pow.cx | sh

さくらVPS 512のDebian Squeezeに入れた。(さくらVPS 512にSqueezeを入れる方法はこちら

apacheと古いphp5を削除

$ sudo apt-get remove --purge apache2* apache2.2* php5*
$ sudo apt-get autoremove

dotdeb

$ sudo vi /etc/apt/source.list
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
$ wget http://www.dotdeb.org/dotdeb.gpg
$ cat dotdeb.gpg | sudo apt-key add -
$ rm dotdeb.gpg

nginx

$ sudo apt-get install nginx
server {
        listen 80;
        server_name unk.fjord.jp;

        location / {
                root /var/www/unk.fjord.jp;
                index index.html index.php;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME /var/www/unk.fjord.jp$fastcgi_script_name;
        }
}

php5-fpm

$ sudo apt-get install php5-fpm

apc

$ sudo apt-get install php5-apc

mysql

$ sudo apt-get install mysql-client mysql-server php5-mysql

wordpress

(略)

速いし良い感じッス。

// 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