火曜日, 11月 02, 2010

HerokuでSinatraを動かす

思うところあってSinatraを触ってみた。ついでにGitも動かしながら覚えている。

が、ここに書いてある通りにしても動かない。
ターミナルでheroku logsと打ち込んでエラーを読む。
==> dyno-2855633.log (crash) <==
/usr/ruby1.8.7/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- sinatra (LoadError)

Sinatraがない、とのこと。
同じ日にはまっている人がいらっしゃった
僕も何もしなくても最初から使えるようになっていると思ってました。

で、解決法はもうひとつあって、マニフェストファイルを作る。.gemsというファイルを同じ階層に作って
sinatra --version 1.1

と書いてpushするだけ。細かいことは公式ドキュメントに書いてある

最初のとこに書いておいて欲しい(check out the docsのリンク先がかつてそうだったのかも知れない。にしても直して下さい)。

土曜日, 10月 02, 2010

ArrayListについて認識を改めたところ

以前の投稿(build ribbons)で、
for文のところを単にかっこいい書き方としか認識してなかったんですけど、
配列の長さがループの途中で変わるので、ああいう風にしておかないとremoveで取り除かれた分の添字が詰まった結果、参照されないオブジェクトがでてきてしまってちらつきが起こってしまいます。

こういう場合。
試しにdraw()内のfor文の初期化式をint i=0、継続条件式をi<ripples.size()、再初期化式をi++にしてみると分かります。
リファレンスにも似たような例が書いてあって、Examples>Topics>Advanced Data>ArrayListClassでも確認できます。
[Ripple.pde]
class Ripple {
float x, y, w, speed;
float age;
int intensity;
color c;
float a;
boolean finished;

Ripple(float x, float y, int intensity, color c, float speed) {
this.x = x;
this.y = y;
this.intensity = intensity;
this.c = c;
this.speed = speed;
this.age = 0;
this.a = 255-255*(age-speed)/intensity;
this.finished = false;
}

void display() {
age += speed;
a = 255-255*(age-speed)/intensity;
if(a<=5) {
finished = true;
}
stroke(c, a);
ellipse(x, y, age, age);
}

boolean finished() {
return finished;
}
}

[drawRipple.pde]
Ripple r;
ArrayList ripples;
void setup() {
size(400, 400);
background(255);
noFill();
smooth();
ripples = new ArrayList();
for(int i=0; i < 100; i++) {
ripples.add(new Ripple(random(width), random(height), (int)random(20, 80), color(0), random(0.1, 0.4)));
}
}

void draw() {
background(255);
for (int i = ripples.size()-1; i >= 0; i--) {
Ripple ripple = (Ripple)ripples.get(i);
ripple.display();
if(ripple.finished()) {
ripples.remove(ripple);
}
}
}

火曜日, 9月 07, 2010

Photoshopで画像を統合して別名保存するJavaScript

FlattenAndSave.jsx
var d = activeDocument;
var fp = d.fullName.toString();
var f = new File(fp.split(".psd")[0]+"_fix.psd");
var out = d.duplicate();
out.flatten();
out.saveAs(f);

コーダーの人にPSDを渡す際にレイヤーを1つに統合しておくと効率が良いそうなので、書きました。
開いているPSDと同じ階層に"_fix"とついたPSDができます。
統合したあとうっかり保存して閉じてしまう心配もありません。
(編集中のデータには変更を加えず新しいドキュメントを複製し、そちらを統合するようにしました)
Windows, MacのCS3で動作確認済。
Adobe Photoshop CS3/プリセット/スクリプトフォルダ以下に入れておくとメニューから選べて便利。

ロールオーバー用のレイヤーを残したい場合はそれらを非表示にし、flatten()ではなくmergeVisibleLayers()を使うなど、用途に合わせて使い分けるといいと思います。レイヤーカンプで切り替えを作っておくと親切。もてます。