[自分]2011の振り返り

Written by uechoco 12月 31
[自分]2011の振り返り はコメントを受け付けていません。
この記事を読む時間:442くらい

2011年の年初にも目標を立てていたんだよね;;って今更思い出す残念なうえちょこです。

とりあえず、カテゴリ別に目標を振り返ってみます。

ランニング

ランニングは2011年から具体的な数値目標を設定し、年間300km走る目標でした。5.77km/週という計算ですが、一時期ランニングをサボっていた時期もあり、月1で10kmしか走らない月もありました。結果的には135.43kmしか走っていません。たったの16回!!
これではいけないとも思っていまして、2012年の3月の板橋Cityマラソンに申し込んでいます。

筋トレ

こちらも2011年から具体的な数値目標を設定したものです。年間腹筋5200回、年間腕立て伏せ5200回が目標でした。毎週100回ずつのペースですね。実際にどのくらいしたのかはわかりません。続いていた時期もありました。感覚値で言えば、1500〜2000回の間だと思っています。やっぱり半分にも観たないですね。そもそも筋トレで何を目指していたのかも覚えていません。また、数値が記録されていないことも残念です。

読書

読書の目標は年15750ページという謎の設定でした。一冊200ページくらいの本を週1.5冊読むペースが目標でした。実際に読んだのは4000ページくらいだと思います。少ないですね。これには理由があります。言い訳とも言います。実際に生活をしていると、移動時間やカフェ、家勉などで使える時間が「読書or英語」となってしまっていました。今年は英語の勉強も結構やっていたので、その分読書の時間が減っていたようです。

英語

英語も今年から頑張っちゃおうぜー的な感じで、適当にTOEIC800点とか、週3時間の勉強とか、いろいろ言っていました。結果的には、英語をもう勉強していた7月末のTOEICでは630点とだいぶ点数が上がりましたが、それから仕事が忙しくなってサボった後の10月末のTOEICでは485点で、昔の英語の水準に戻ってしまいました。

エンジニア

エンジニアとして、2011年はHTML5とjQueryとSymfony2に詳しくなる年と決めていました。加えてLTの回数をこなすということでした。jQueryは今まで全然使っていなかったので、食わず嫌いな感じだったのですが、仕事でずっと使っていて、割りと慣れました。HTML5は全く触れていないです。Symfony2はLTだけでなく講師も行い、こちらの目標は達成しましたが、詳しくなるほど使い込むことはできませんでした。

お金

50万円位は貯金額を増やそうかと思いましたが、株で痛い目にあって、-100万円位です。残念すぎます。

人生

サードプレイスを持つという、漠然とした目標でしたが、リラックマ界隈のオフ会にでてリラックマ仲間が割りとできました。いつもTwitterでやり取りをして、イベントの時には会ったりもしました。思い描いていたサードプレイスとまでは行きませんが、努力もあまりしないでできたサードプレイスとしてはいい感じです。

総括

全体的に言えることは、目標が現実的ではなかったし、日々のアップデートを怠っていました。そもそも、なぜそれを目標にしたのか、それを目標にすることで、どういう自分になりたいのか?そういう視点での目標設定ではありませんでした。そういう視点がないからこそ、続かなかったのでしょう。

確かに、目標設定すら忘れて、もちろん達成できていないことは残念ではありますが、すこしずつ前に向かっている姿勢はありました。立ち止まっているわけではないけれど、ふらついて直進できていなかったという感じでしょうか。

2011年に読んだ本の中にGTDの本があり、その中に「高度の違う視点を持つ」ということについて解説がありました。人生レベル、3〜5年後レベル、1〜2年後レベル、責務レベル、現在のプロジェクトレベル、現在の行動レベルという6つの高度が定義してあり、隣接するレベルは互いに影響しあうという定義になっていました。このようななりたい自分への筋道がしっかりと示せていて、また自分に自信が持てている状態でないと、うまく行かないのかもしれません。自分を擁護するわけではないのですが、人は怠ける生き物ですし、予定は外的要因ですぐに変わってしまうものだからです。

また、2011年は目標設定というものを定めてみた最初の年でもあり、この2011年の結果を踏まえて2012年の目標設定を立ててみようかと思っています。

[php]WordPressでsshを利用した自動更新を行う(for Ubuntu)

Written by uechoco 12月 31
[php]WordPressでsshを利用した自動更新を行う(for Ubuntu) はコメントを受け付けていません。
この記事を読む時間:126くらい

WordPressにはFTPとFTPSを利用した自動更新をする仕組みがあるが、実はSSH経由での自動更新もサポートしているらしい。

FTP・SSH 定数 – wp-config.php の編集 – WordPress Codex 日本語版

マニュアルには、「pecl install ssh2」とやってphpのssh2ライブラリをインストールするように書いてあった。
私のWordPressの環境は、Ubuntu+nginx+php5-fpmという環境で、「sudo aptitude install libssh2-php」だけインストールして、php5-fpmをrestartしたら、WordPressの自動更新画面のオプションに「ssh2」が出現した。

なーんだ。標準でsshも対応してたのね。さっすがWordPress。

追伸(30分後):どう頑張っても自分の環境ではSSH接続ができなくて、困りました。結局、WordPressのフォルダを「sudo chwon www-data. blog/」としてnginxとphp5-fpmのユーザーの所有物にしてしまい、FS-METHOD=directとすることで、直接DLするモードを使いました。自分がサーバー管理者だったらこっちのほうが超速で自動更新できるからいいかもねw

[perl]scalar=$calar、array=@rray、hash=%演算?

Written by uechoco 12月 24
[perl]scalar=$calar、array=@rray、hash=%演算? はコメントを受け付けていません。
この記事を読む時間:216くらい

ふと、perlのスカラ変数、配列、ハッシュの記号について思ったのが、

  • scalar = $calar(ドル記号がSに似ている)
  • array=@array(アットマーク記号がaに似ている)
  • hash=%演算(ハッシュを求める代表的な演算は、%記号で余りを求める方法)

なんじゃないかなーっと。Perlなんて時々スクリプトを見る程度だけど、昔(8年前くらいに)CGIゲームとかyybbsとか弄ってたときは、それぞれの記号が何を示しているのか、理解してなかったよなーって懐かしむ。

モイッチョおまけに、配列の最後の添字を取得する$#arrっていう書き方もあった気がするけど、

  • $#arr = arrという変数の#(番号=ここでは添字)を$(スカラー値)で返す
  • $#arr = arrという変数の$#(添字番号)を返す

という感じで#が番号っていう意味を知っていれば、すんなり受け入れらるよなーって。

ついでに配列やハッシュが@や%記号で扱ったり$記号で扱ったりしてこんがらがっていた時代もあったけど、これも簡単で、その時点でのコンテキスト(文脈)でどう扱っているかを記号で表しているだけじゃないかと。

ちなみに、ここで書いたのは勝手な想像であって、どこかで調べたわけじゃなくて、もしかしたら間違っているかもしれません。(それでも覚えやすいからいいかなっとw)

プログラミング歴が遊びも含めて10年を超えてくると、いろいろな知識も増えてきて、昔分からなかったことをすんなり分かるようになったりしてきます。自分の成長を実感できた瞬間でしたw

 

P.S. (2012/01/02 13:40):

今、初めてのPerl 第5版(通称:リャマ本)を読んでいるのですが、p53の脚注に、「Larryは、それぞれ$calar(scalar)と@rray(array)だから、ドル記号とアットマークを選んだと主張しています。」ということが書いてあり、公式見解として正しいようです。

[amazon]4873114276[/amazon]

[processing]魔方陣とかSF円とか(Processing Advent Calendar 2011 – 20日目)

Written by uechoco 12月 20
[processing]魔方陣とかSF円とか(Processing Advent Calendar 2011 – 20日目) はコメントを受け付けていません。
この記事を読む時間:1954くらい

Processing Advent Calendar 2011の2回目の登場です。
20日目の担当ということで、最近Processingと疎遠でphpやらpythonやらと戯れている私は既にネタ切れですw

Processingは何かのプロダクトのプロトタイプを作ったり、自分が作りたいアニメーションを作ったりするのに向いていると言われています。
今回は私の趣味で、魔方陣とかSFちっくな円とか、そういうものを2種類公開いたします。

ミッドチルダ式魔方陣

[p5code]
/**
* ミッドチルダ式魔法陣 (元ネタ:魔法少女リリカルなのは)
*
* @title mugityax | 背景作成
* @link http://www.mugityax.com/weblog/2006/06/post_1.html
*
* @title ミッドチルダフォント置き場
* @link http://midfont.refy.net/
*/

float rot1, rot2;
PFont font1, font2;

void setup() {
size(400, 400);
colorMode(HSB, 100);
frameRate(30);
smooth();
background(0);

textAlign(CENTER, CENTER);

font1 = loadFont(“MID-CHILDA_Regular-30.vlw”);
font2 = loadFont(“MID-CHILDA_Regular-15.vlw”);
//font1 = createFont(“mid-childa_R.ttf”, 30, true);
//font2 = createFont(“mid-childa_R.ttf”, 15, true);

rot1 = rot2 = 0;
}

void draw() {
background(0);
pushMatrix();
{
noFill();
translate(width / 2, height / 2);
final float rl = 120 / sqrt(2); // 84.85281
final float ro = 149;

// 固定円
{
drawLightEllipse(0, 0, 180*2, 180*2); // 外周円-二重外円
drawLightEllipse(0, 0, 175*2, 175*2); // 外周円-二重外円
drawLightEllipse(0, 0, 120*2, 120*2); // 外周円-内円
drawLightEllipse(0, 0, rl*2, rl*2); // 内周方形内-外円
drawLightEllipse(0, 0, 60*2, 60*2); // 内周方形内-内円
}

// 外周小円・内周方形1
pushMatrix();
{
rotate(rot1);
// 外周小円
final float[] rm = {50, 45};
for (int i = 0; i < rm.length; i++) { drawLightEllipse(0, -ro, rm[i], rm[i]); drawLightEllipse(ro, 0, rm[i], rm[i]); drawLightEllipse(0, ro, rm[i], rm[i]); drawLightEllipse(-ro, 0, rm[i], rm[i]); } // 内周方形1 drawLightQuad(0,-120,120,0,0,120,-120,0); } popMatrix(); // 内周方形2 pushMatrix(); { rotate(rot2); drawLightQuad(-rl,-rl,rl,-rl,rl,rl,-rl,rl); } popMatrix(); final String[][] ot = { {"Y","S","T","D","U","X","K","j","L","z","D","K","F","A","M","B","Y","o","h","Z","O","T","U","V","i"}, {"J","Z","p","V","A","Y","F","r","j","s","v","W","T","h","G","S","c","H","X","K","k","o","d","B","u"}, {"b","F","M","r","g","R","V","y","N","B","A","x","q","C","T","p","E","L","K","a","w","j","k","J","P"}, {"H","a","G","d","W","S","n","M","X","s","E","x","A","o","Z","C","b","f","k","U","V","i","Y","B","D"}, {"E","y","t","H","L","o","Q","W","T","h","a","d","C","B","b","w","v","D","s","Y","z","e","R","n","S"}, {"K","B","f","T","k","R","e","d","w","z","S","m","D","J","P","F","j","o","n","r","u","x","g","v","b"}, {"z","G","q","e","u","w","W","a","U","X","i","r","A","Y","D","t","N","V","k","P","Q","p","g","E","K"}, {"b","v","d","B","g","z","D","h","j","Q","n","U","G","Z","q","u","F","r","T","X","a","m","W","t","Y"}, {"Z","K","U","T","e","A","G","c","X","i","Q","o","R","F","k","t","p","D","J","d","r","q","n","V","E"}, }; final int[][] a_set = { {14, 78, 4}, {102, 170, 4}, {192, 260, 4}, {282, 350, 4} }; // 外周文字 pushMatrix(); { rotate(rot1); fill(100); textFont(font1); for (int i = 0; i < 4; i++) { int c = 0; for (int a = a_set[i][0]; a < a_set[i][1]; a+=a_set[i][2]) { pushMatrix(); rotate(radians(a)); translate(ro, 0); rotate(HALF_PI); text(ot[i][c++], 0, 0); popMatrix(); } } } popMatrix(); // 内周文字 pushMatrix(); { rotate(rot2); fill(100); textFont(font2); for (int i = 0; i < 4; i++) { int c = 0; for (int a = a_set[i][0]; a < a_set[i][1]; a+=a_set[i][2]) { pushMatrix(); rotate(radians(a)); translate(70, 0); rotate(HALF_PI); text(ot[i][c++], 0, 0); popMatrix(); } } } popMatrix(); } popMatrix(); update(); } void update() { rot1 += 0.04; rot2 -= 0.04; } void drawLightEllipse(float a, float b, float c, float d) { strokeWeight(5); stroke(100, 100, 80, 40); ellipse(a, b, c, d); strokeWeight(3); stroke(95, 100, 80, 60); ellipse(a, b, c, d); strokeWeight(2); stroke(90, 100, 80, 80); ellipse(a, b, c, d); strokeWeight(1.5); stroke(100); ellipse(a, b, c, d); } void drawLightQuad(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { strokeWeight(5); stroke(100, 100, 80, 40); quad(x1, y1, x2, y2, x3, y3, x4, y4); strokeWeight(3); stroke(95, 100, 80, 60); quad(x1, y1, x2, y2, x3, y3, x4, y4); strokeWeight(2); stroke(90, 100, 80, 80); quad(x1, y1, x2, y2, x3, y3, x4, y4); strokeWeight(1.5); stroke(100); quad(x1, y1, x2, y2, x3, y3, x4, y4); } void mousePressed() { save("mid_tilde_magic_circle.jpg"); } [/p5code] まずは、魔方陣です。魔法少女リリカルなのはというアニメの中に出てくるミッドチルダ式魔方陣というものです。元ネタは全く知らないのですが、魔方陣的に描きやすかったので、参考にしました。専用のフォントも使用しています。プログラムは4つの構成要素になっていて、外周や内周の固定や回転する円、内周の正方形、外周円の文字、内周円の文字となっています。rotate()とmatrixを上手く使用して、座標軸を回転させることで描画する方式をとっています。仕組みさえわかってしまえば簡単にバリエーションが作成できます。

SF円

[p5code]
float cx, cy;
int ringCount = 0;
Ring[] rings = new Ring[1];

void setup() {
size(400, 400);
background(0);
noFill();
smooth();
strokeCap(SQUARE);
ellipseMode(RADIUS);

cx = width / 2;
cy = height / 2;

float pRadius = 20, pWeight = 2;
while (pRadius < 180) { Ring r = addRing(); r.setWeight(random(2, 25)); r.setPosition(cx, cy); r.setRadius(pRadius + (pWeight + r.weight) / 2 + 1); r.setRadians(random(TWO_PI)+PI/3, random(TWO_PI)+PI/3); r.setColor(#ffffff); r.setRot(random(-0.05, 0.05)); pRadius = r.r; pWeight = r.weight; } } void draw() { background(0); for (int i = 0; i < ringCount; ++i) { rings[i].draw(); rings[i].move(); } } Ring addRing() { if (rings.length == ringCount) { rings = (Ring[]) expand(rings); } Ring r = new Ring(); rings[ringCount++] = r; return r; } class Ring { float x, y, r; float weight; float startRad, endRad; float rot; color c; void draw() { stroke(c); strokeWeight(weight); arc(x, y, r, r, startRad, endRad); } void move() { startRad += rot; endRad += rot; if (startRad > TWO_PI && endRad > TWO_PI) {
startRad -= TWO_PI;
endRad -= TWO_PI;
}
}

void setPosition(float x, float y) {
this.x = x;
this.y = y;
}

void setRadius(float r) {
this.r = r;
}

void setRadians(float start, float end) {
this.startRad = start;
this.endRad = end;
}

void setWeight(float weight) {
this.weight = weight;
}

void setColor(color c) {
this.c = c;
}

void setRot(float rot) {
this.rot = rot;
}
}

void mousePressed() {
save(“sf_arc_ring_magic_circle.jpg”);
}
[/p5code]

正式に何といったらよいのかわかりませんが、SF映画とかのコンソール画面とかの後ろ側で無駄にかっこ良く回ってるアレですw プログラムの仕組みとしては、円弧(arc)を何十にも重ねてそれぞれ別々の弧の長さや回転速度を持たせているだけです。プログラム上の工夫としては、円弧の部分をRingというクラスにまとめ、draw()ループから呼び出すメソッドはRing.draw()やRing.move()に限定することで、draw()ループを見やすくしています。このように、似たような動作をするオブジェクトをクラスとして定義して、パラメータの違いによって動作を変え、描画や移動の時はdraw()やmove()などのメソッドを作成して呼ばせるような手法は、プログラムをすっきりとさせるし、動作の塊がオブジェクトとしてまとまっているので、大変見やすくなっています。

最後に

と、今回は2つの作品の紹介で終わりでちょっと物足りなかったかと思います。

私はCGクリエイターと言うよりはCGに興味があるプログラマーなので、自分が作りたいものが作れれば良いという考えではなく、「この作品を作るにはどういうプログラムにすると上手く書けるか」という視点でProcessingのコードを書くことが多いです。前回の伝統模様の記事でも、いろんな書き方で伝統模様を書いていたのをご覧になっているかと思います。私の目標としては”CG自体の美“の次くらいに”プログラムコードの美“を追求していきたいと思っています。

めちゃめちゃなコードでもその場限りで描ければ良しとする考えもあるのですが、数カ月後とか、1年後とかにProcessingのコードを見て、何やっているかわからないと困る場合もありますよね。その点、プログラムコードの美しさも最初から追求していれば、後から読んでも読みやすいプログラムなので、理解がしやすいかと思います。

とまぁ、作品紹介ついでに本職プログラマーならではのプログラミングの視点をご紹介してみました。

[Django]ChoiceFieldのchoicesに関数を指定したい

Written by uechoco 12月 14
[Django]ChoiceFieldのchoicesに関数を指定したい はコメントを受け付けていません。
この記事を読む時間:313くらい

Djangoのformで、ChoiceFieldのchoicesには固定のtupleを指定したり、ModelForm任せだったりすることがほとんどだったのですが、独自に加工した一覧を出したくて、choicesに関数を指定しようとしました。

ただ、素直に関数名をforms.ChoiceField(choices=func_name)と指定しただけだと、
‘function’ object is not iterable
と怒られてしまいました。

どうしたものかとググっていたら、見つけました

python – Lazy choices in Django form – Stack Overflow

djangoのlazyというユーティリティを使って関数を与える方法が書いてありました!

  1. from django.utils.functional import lazy
  2.  
  3.     forms.ChoiceField(choices=lazy(func_name, tuple)())

こんな感じですね。これは使える!

とか思ってたけど、やりたいことこれじゃないよ!あと1歩だった。
ModelFormにinstanceをセットして、そのinstanceの中身によって変動するchoicesって作れるのかな?(こっちが知りたかった

P.S.
結局やりたい事はModelChoiceFieldでした。知らなかった。querysetを適切に与えてやるためにFormの__init__()を上書きして必要なインスタンスを渡してあげています。だいたい以下のような感じ

  1. class HogeForm(forms.ModelForm):
  2.     foo = forms.ChoiceField(choices=())
  3.     bar = None
  4.  
  5.     class Meta:
  6.         model = Hoge
  7.         fields = ('foo', )
  8.  
  9.     def __init__(self, bar, *args, **kwargs):
  10.         super(HogeForm, self).__init__(*args, **kwargs)
  11.         self.bar = bar
  12.         self.fields['foo'] = forms.ModelChoiceField(queryset=Foo.objects.filter(bar=bar))
  13.  
  14.     def save(self, commit=False):
  15.         hoge = super(HogeForm, self).save(commit=False)
  16.         hoge.bar = self.bar
  17.         return hoge.save()