任意のイベントを受付け、発火できるオブジェクト

2010年03月30日
区分
javascript
報告者:
komagata

komagataです。

canvasでウロウロするシリーズも少しコードが汚くなって来たのでリファクタリングしました。

iPhone シミュレータ

canvasでウロウロする4

コンストラクタの継承が出来なかったのをJavaScript: The Good Partsに載っていた関数型の継承を使って書き直しました。

また、同じく同書に載っている、任意のオブジェクトに任意のイベントを受付け、発火できる機能を追加する、とても便利なeventuality関数を使うように書き換えました。

var eventuality = function(that) {
  var registry = {}

  that.fire = function(event) {
    var array, func, handler,
        type = typeof event === 'string' ? event : event.type

    if (registry.hasOwnProperty(type)) {
      array = registry[type]
      for (var i = 0; i < array.length; i++) {
        handler = array[i]
        func = handler.method
        if (typeof func === 'string') {
          func = this[func]
        }
        func.apply(this, handler.parameters || [event])
      }
    }
    return this
  }

  that.on = function(type, method, parameters) {
    var handler = {method: method, parameters: parameters}
    if (registry,hasOwnProperty(type)) {
      registry[type].push(handler)
    } else {
      registry[type] = [handler]
    }
    return this
  }

  return that
}

eventuality関数はonとfireの二つのメソッドを持ちます。onで任意の名前のイベントを登録し、fireで発火します。

eventuality関数を継承したオブジェクトは全て同機能を持つのでenterframeイベントを持ったspriteオブジェクトなどがとても簡単につくれるようになりました。

var sprite = function(img_src, x, y, width, height) {
  var that = eventuality()
  that.img = new Image
  that.img.src = img_src
 
  that.on('enterframe', function(){
    that.game.context.drawImage(
      that.img,
      that.x,
      that.y,
      that.width,
      that.height
    )
  })
 
  return that
}

こんな感じで好き勝手なイベントが作れるのが便利です。

コード:4 at master from komagata's canvas-prowler - GitHub

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

プレゼンハムで直線を書く関数

2010年03月23日
区分
javascript
報告者:
komagata

komagataです。

以前のプログラムで使った、javascriptでプレゼンハムアルゴリズムを使って2点間を結ぶ直線の座標を求める関数を単体で使えるように切り出してみました。

#!/usr/bin/env js

/**
 * Build line's path by Bresenham algorithm
 *
 * @arguments Array src - line source coordinate. (Ex: [12, 32])
 * @arguments Array dest - line destination coordinate. (Ex: [41, 55])
 * @return Array - builded path array. (Ex: [[12, 32], ... [41, 55]])
 */
var build_path = function(src, dest) {
  var next_x = src[0],
      next_y = src[1],
      delta_x = dest[0] - src[0],
      delta_y = dest[1] - src[1],
      step_x,
      step_y,
      step = 0,
      fraction = 0,
      path = []

  if (delta_x < 0) {
    step_x = -1
  } else {
    step_x = 1
  }
  if (delta_y < 0) {
    step_y = -1
  } else {
    step_y = 1
  }

  delta_x = Math.abs(delta_x * 2)
  delta_y = Math.abs(delta_y * 2)

  path[step] = [next_x, next_y]
  step++

  if (delta_x > delta_y) {
    fraction = delta_y - delta_x / 2
    while (next_x != dest[0]) {
      if (fraction >= 0) {
        next_y += step_y
        fraction -= delta_x
      }
      next_x += step_x
      fraction += delta_y
      path[step] = [next_x, next_y]
      step++
    }
  } else {
    fraction = delta_x - delta_y / 2
    while (next_y != dest[1]) {
      if (fraction >= 0) {
        next_x += step_x
        fraction -= delta_y
      }
      next_y += step_y
      fraction += delta_x
      path[step] = [next_x, next_y]
      step++
    }
  }
  return path
}

// print path
var way = build_path([152, 152], [162, 136])
for (var i = 0; i < way.length; i++) {
  print(way[i])
}
152,152
153,151
153,150
154,149
155,148
155,147
156,146
156,145
157,144
158,143
158,142
159,141
160,140
160,139
161,138
161,137
162,136

座標には配列を使っています。この辺の基本的な機能はWebGLとかでまとまって実装されればいいなと思います。

glpngをmacで使う

2010年03月17日
区分
OpenGL
報告者:
komagata

飲み屋での一杯目は「水」。komagataです。

canvas上の何も無いも同然なグラフィックAPI上でアプリを書いてきましたが、WebGLというOpenGL ESベースのAPIの実装が始まってるそうなのでまずはOpenGLの勉強を始めました。

デスクトップアプリケーションのGUIツールキット部分はWebとは関係無い(=canvasみたいな感じになるはずな)ので、GLUT(The OpenGL Utility Toolkit)を使って行きます。

とりあえずpngを簡単に読み込みたかったのでglpngというライブラリを使おうとしたのですが、各地でリンク切れ。前世紀にメンテが終わってるっぽい雰囲気ですが、下記(OpenBSDのリポジトリ)に有りました。

ftp://ftp.usa.openbsd.org/pub/OpenBSD/distfiles/glpng-1.45/glpng.zip

どうせWebのためにやるのでOS依存部分で苦労したくないんですが、Macでコンパイルするのに少し修正する必要がありました。

% diff glpng.c glpng.c.org
28,29c28,29
< #include <GLUT/glut.h>
< #include "GL/glpng.h"
---
> #include <GL/glpng.h>
> #include <GL/gl.h>

付属のMakefile.LINUXでmakeすれば静的ライブラリ(libglpng.a)が出来ます。(Makefile.SGIってファイルも付いてるのが古さを感じます)

pngInfoとpngBind関数が使えるようになるので簡単にpngファイルが簡単にテクスチャとして貼れました。

#include <stdio.h>
#include <GLUT/glut.h>
#include "glpng.h"

GLuint texture;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(0, 0, 0);
        glBindTexture(GL_TEXTURE_2D, texture);
    glPopMatrix();
  
    glBegin(GL_QUADS);
        glTexCoord2d(0.0, 1.0);
        glVertex2d(-1, -1);
        glTexCoord2d(1.0, 1.0);
        glVertex2d(1, -1);
        glTexCoord2d(1.0, 0.0);
        glVertex2d(1, 1);
        glTexCoord2d(0.0, 0.0);
        glVertex2d(-1, 1);
    glEnd();
    glFlush();
} 

void init()
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glColor3d(1.0, 1.0, 1.0);
    glEnable(GL_TEXTURE_2D);
  
    pngInfo info;
    texture = pngBind("tree.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);
} 
  
int main(int argc, char** argv)
{ 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(100, 100);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("hunter");
    glutDisplayFunc(display);
    init();
    glutMainLoop();
} 

Macのframeworkという仕組みがイマイチわかってないんですが、下記でコンパイルできました。</p>

% cc -framework GLUT -framework OpenGL -o game game.c libglpng.a

tree

ソース:10 at master from komagata's glut - GitHub

衝突判定でウロウロする

2010年03月09日
区分
canvas
報告者:
komagata

身に覚えの無い商品がAmazonから送られてくる。komagataです。

canvasでウロウロするものに衝突判定を追加してみました。

(今回はAndroidエミュレーターで機種はNexus Oneで動作させてみましたが、webkitなのでiPhone用から何の変更も無しに動いたのは楽でした。)

5554:nexus_one

http://komagata.org/canvas-prowler/3/

(iPhoneやAndroidでアクセスしてみて下さい)

自分で作る前に、文系プログラマー的にはゲームプログラムはどういう実装をすればいいのかを言葉で知りたかったので実装のイメージ的なところを以前のモノと合わせて言葉で説明したいと思います。

移動方法の実装イメージ:

まず、キャラクターの描画はフレーム毎に定期的に(30fpsとかで)描画します。描画はキャラクタの現在持っている座標に単に描画するだけです。

それとは別にクリックイベントをトリガーとしてプレイヤーキャラクターとクリック地点をプレゼンハムアルゴリズムで直線を引き(実際には描画しない)、その直線の座標を配列としてプレイヤーキャラクターの移動のためのバッファ(キュー)に格納します。

キャラクターはクリックイベントには感知せず、1フレーム毎に自分の移動バッファに座標があれば一つづつ消費しながら自分の座標を変更していき、バッファに無ければ何もしません。

クリックイベント時には移動バッファが残っていても空にした上で新しい経路を設定するのでクリックした瞬間に進路を変更します。

衝突判定:

何かが有る度に、それぞれのオブジェクト(プレイヤー、背景、障害物など)を全て走査、それぞれのオブジェクトが持つプレイヤーフラグ、障害物フラグを見て処理します。(これは関係無いオブジェクトも毎回走査することになるのでとてもヘボイやり方でした。イベント毎にイベントリスナーを登録するように次は変更したいです。)

プレイヤーキャラクターの移動バッファの次の移動場所が障害物フラグを持つオブジェクトと衝突している場合に移動を中止して以降の移動バッファもクリアします。

シンプルなドット絵を対象にしているので四角形と四角形の衝突を判定するのはとても楽です。

少しハマったのは、衝突した時点で移動バッファをクリアするのではなく、衝突する一歩前で次の移動地点を見てバッファをクリアしなければならないというところです。

衝突した時点でバッファをクリアすると、見た目上は分かり辛いですが、一歩分障害物にめり込んでいるので障害物に接触した瞬間動けなくなります。

この変な動きも面白かったですが、プログラムを見直して、なるほどなあと思いました。

次回もこれに新しい要素を付け加えたいと思います。

canvasでウロウロする(2)

2010年03月03日
区分
canvas
報告者:
komagata

火曜日担当なのに間に合わずに水曜日にアップしている2010生まれてこなかった方が良かった男オブザイヤー候補、komagataです。

canvasでウロウロするのをiPhoneにフィットするように修正しました。

canvas prowler2

http://komagata.org/canvas-prowler/2/

解像度がファミコンは224x256に対してiphoneは320x480なので細かいですね。

ソース:2 at master from komagata's canvas-prowler - GitHub

プレゼンハムでウロウロする

2010年02月23日
区分
canvas
報告者:
komagata

komagataです。

前回は矢印キーでウロウロしたのでマウスクリックでウロウロするものを作りました。

canvas

http://komagata.org/canvas-prowler/1/

直線や曲線を整数で高速に描画するプレゼンハムアルゴリズムでクリック地点までの経路を計算して近付きます。

グラフィックのプログラミングは間違えても変な動きをしたりして面白いですね!

犯罪的なコミットエンドランを簡単に防ぐ

2010年02月16日
区分
テスティング
報告者:
komagata

komagataです。

犯罪的な戦術 - p0t

上記の様な戦術を簡単に防ぐ方法を考えてみました。

リポジトリがsubversionなのでpost-commitのhookを使ってテストを実行し、失敗していたら嫌なメールを送るという方法です。

対象のリポジトリ内のhookファイルに(大抵は/var/lib/svn/#{repost}/post-commit)を以下の様にします。

#!/usr/bin/env ruby

repos, rev = ARGV[0], ARGV[1]
author = `svnlook author #{repos}`
cmd = "cd /var/www/staging/ossuary/current && rake db:migrate:reset && script/spec spec -f progress"
unless system(cmd)
  `mail -s '[ossuary] #{author} made a commit-and-run in r#{rev}' error@actindi.net`
end

[ossuary] komagata made a commit-and-run in rev256 - komagata@gmail.com - Gmail

「komagataはリビジョン256でコミットエンドランを決めた。」

(´・ω・`)・・・。

CanvasとWebSocketsでみんなでウロウロする

2010年02月09日
区分
javascript
報告者:
komagata

火曜日担当のkomagataです。

Metasploitは一回お休みさせていただいてJavascriptのお話しです。

仕事は主にwebプログラミングなので身も蓋も無い言い方をすると「DBに入れたり出したり」しかしてません。

「もう文字列処理はうんざりなんだよ!」

というのは嘘ですが、たまには動きのある見栄えのするグラフィックとかアニメーションとかプログラムしてみたいと思い、HTML5で使えるようになるらしい、グラフィック機能のcanvasと双方向同期通信のWebSocketsを使ってキャラクターがウロウロするだけのプログラムを作ってみました。

WebSocketsを実装しているのは現状Google Chrome 4以降だけなので、動作してる雰囲気を伝えるために動画にしてみました。

最近のChromeには実装されているので下記のように簡単にサーバーに接続することができます。

ws = new WebSocket("ws://localhost:8080/")
ws.onopen = function() { console.log('open') }
ws.onclose = function() { console.log('close') }
ws.onmessage = function(evt) { ws.send('Hello!') }

CometなどよりとてもシンプルでたちまちWebSocketsが好きになりました!

Ajaxのように非同期に小さなメッセージをちょこちょこ飛ばすのではなく、1ユーザーに対して1本ガッシリしたラインを繋ぎ、双方向にドカドカ通信するイメージでしょうか。

真っ先にネットゲーム的なものでの利用方法が思い付きますが、これが標準的なブラウザで使えるようになれば、他の新しい使い方で出てきて斬新なUIが生まれれば良いなと思います。

とりあえず現状を下記のURLで動かしています。chromeやsafariのnightlyでは動くみたいです。(windows, mac, linuxどれでも動くことは確認しました。)

http://verdana.komagata.org/prowler/

ソースは下記です。

komagata's prowler at master - GitHub

Metasploit3で脆弱性を検証する(1)

2010年02月02日
区分
セキュリティ
報告者:
komagata

Penetration Testing | The Metasploit Project

火曜日担当のkomagataです。

Gumblerウィルスが猛威を振るっているので流行に乗ってセキュリティネタです。

脆弱性検証(というか実際に脆弱性を突くので悪用厳禁)ツールのMetasploit3をMacで使ってみました。

Macportsのはrb-railsやrb-rackが普通のgemとぶつかって入りません。(port editで依存性を外せば入りましたが気持ち悪いです。)

なので、svnのtrunkを持ってきました。

% svn co https://www.metasploit.com/svn/framework3/trunk metasploit

今回checkoutしたのはrevision8340でした。

% cd metasploit
% ./msfconsole
/Users/komagata/code/metasploit/lib/msf/core/exploit/mixins.rb:46:in `require': /Users/komagata/code/metasploit/lib/msf/core/exploit/capture.rb:358: syntax error, unexpected ')', expecting kEND (SyntaxError)
/Users/komagata/code/metasploit/lib/msf/core/exploit/capture.rb:375: syntax error, unexpected $end, expecting kEND
        from /Users/komagata/code/metasploit/lib/msf/core/exploit/mixins.rb:46
        from /Users/komagata/code/metasploit/lib/msf/core/exploit.rb:216:in `require'
        from /Users/komagata/code/metasploit/lib/msf/core/exploit.rb:216
        from /Users/komagata/code/metasploit/lib/msf/core.rb:52:in `require'
        from /Users/komagata/code/metasploit/lib/msf/core.rb:52
        from /Users/komagata/code/metasploit/lib/msf/ui/console/driver.rb:1:in `require'
        from /Users/komagata/code/metasploit/lib/msf/ui/console/driver.rb:1
        from /Users/komagata/code/metasploit/lib/msf/ui/console.rb:10:in `require'
        from /Users/komagata/code/metasploit/lib/msf/ui/console.rb:10
        from /Users/komagata/code/metasploit/lib/msf/ui.rb:10:in `require'
        from /Users/komagata/code/metasploit/lib/msf/ui.rb:10
        from ./msfconsole:16:in `require'
        from ./msfconsole:16

ところがcoreで読み込んでるファイルがsyntax error。ほぼ全てのコマンドが動きません。

「これは良いコミットエンドラン・・・(ゴクリ)」

% svn diff
Index: lib/msf/core/exploit/capture.rb
===================================================================
--- lib/msf/core/exploit/capture.rb     (revision 8340)
+++ lib/msf/core/exploit/capture.rb     (working copy)
@@ -355,7 +355,7 @@
                rescue RuntimeError => e
                        @pcaprub_error = e
                        print_status("Cannot stat device: #{@pcaprub_error}")
-                       raise RuntimeError, "Pcaprub error: #{@pcaprub_error}")
+                       raise RuntimeError, "Pcaprub error: #{@pcaprub_error}"
                end
                return my_net
        end

取り敢えずこれで動きますのでお急ぎの方は是非。

% ./msfconsole

                |                    |      _) |   
 __ `__ \   _ \ __|  _` |  __| __ \  |  _ \  | __| 
 |   |   |  __/ |   (   |\__ \ |   | | (   | | |   
_|  _|  _|\___|\__|\__,_|____/ .__/ _|\___/ _|\__| 
                              _|                   


       =[ metasploit v3.3.4-dev [core:3.3 api:1.0]
+ -- --=[ 176 exploits - 30 auxiliary
+ -- --=[ 104 payloads - 17 encoders - 5 nops
       =[ svn r8340 updated today (2010.02.01)

msf >

metasploitはversion3からperlからrubyになったらしく、僕にとっては読みやすくて嬉しいです。でもWebインターフェースがRailsなのは少しアグレッシヴですね。

次回は実際に脆弱性を突いてみようと思います。

Lispに興味がない・・・だと・・・?

2010年01月27日
区分
lisp
報告者:
komagata

興味のある言語にLispと書いておいたら面接で爆笑された

面接官「Lisp・・・ふははっ!Lisp!」

面接官「Lispやってるんですか?wwwww」

俺「(唖然)は、はい・・まだS式を理解したぐらいですが。。」

面接官「Lisp・・・ニヤニヤ」

Hunchentootで動いてるこのブログを見て弊社に面接に来た方がCommon Lispに興味なかったらメンバー全員がっかりしますね・・・。

Real (World) Git

2010年01月26日
区分
git
報告者:
komagata

火曜日担当のkomagataです。

gitよく分からないのでどういう風に使ってるのかデモってくれと言われたので実際に仕事のコードにコミットしてみました。

実録!git!

アクトインディでは「子供とのお出かけ先を探すサイト」いこーよhttp://iko-yo.net)というサイトを運営しています。 リポジトリはデザイナーさんがDreamweaverCodaのsvnクライアントを使うのでSubversionです。

svnの最新リビジョンだけを持ってくる。(全部持ってくると死ぬほど時間がかかる。)

% git svn clone -r HEAD https://svn.actindi.net/svn/oyaiku/trunk/outing outing --username=komagata

Redmineのチケットを見る。 予め仕込んでおいた簡単そうなチケットを発見。(redmineではイシューというみたいです)

いこーよ - 新機能 #3487: cityモデルのテストを書く - Redmine(タスク管理)

チケットに対応したブランチを作る。

% git branch issue3487

作業ブランチを切り替える。

% git checkout issue3487

(git branch foo; git checkout fooはgit checkout -b fooと同じ)

ブランチ確認。

% git branch
  master
* issue3487

shouldaスタイルのマクロが使いたいのでremarkableを入れる。

# config/environment.rb
Rails::Initializer.run do |config|
  config.gem 'remarkable_rails', :lib => false
end
# spec/spec_helper.rb
require 'spec/rails' # ここの下に書く
require 'remarkable_rails'
% sudo rake gems:install
% rake gems:unpack
% rake gems:refresh_spec

一旦、コミット。

% git add vendor vendor/gems/remarkable_rails-3.1.12
% git commit -a -m'added remarkable'

app/model/city.rbのテストを作る。

# app/model/city.rb
class City < ActiveRecord::Base
  belongs_to :prefecture

  validates_presence_of :name, :reading, :roman
  validates_length_of :name, :within => 1..40
  validates_length_of :reading, :within => 1..40
  validates_length_of :roman, :within => 1..40
  validates_uniqueness_of :roman
end
# spec/models/city_spec.rb
require 'spec_helper'

describe City do
  fixtures :cities

  should_belong_to :prefecture
  should_validate_presence_of :name
  should_validate_presence_of :reading
  should_validate_presence_of :roman
  should_validate_length_of :name, :within => 1..40
  should_validate_length_of :reading, :within => 1..40
  should_validate_length_of :roman, :within => 1..40
  should_validate_uniqueness_of :roman
end

テスト実行(ホントは全部のテストを実行する)

% ./script/spec spec/models/city_spec.rb

City
- should belong to prefecture
- should require name to be set
- should require reading to be set
- should require roman to be set
- should ensure length of name is within 1..40 characters
- should ensure length of reading is within 1..40 characters
- should ensure length of roman is within 1..40 characters
- should require unique values for roman

Finished in 0.770165 seconds

8 examples, 0 failures

コミット

% git add spec/models/city_spec.rb
% git ci -a -m'added city_spec. fixed #3487'

masterに移る。

% git checkout master

最新版を持ってくる

% git svn rebase

issue3487をマージする

% git merge issue3487

svnにコミット。

% git svn dcommit

完了。

その他の便利機能</3>

いっこ前のコミットなかったことにする

% git reset HEAD^

昔のコミットを修正したい

% git log --oneline
c5524b2 * removed foo * removed remarkable
460bfa1 [デザイン] TOPページ「外へおでかけ」の変更 (refs #3490) * 谷さん修正分
9b819fd * add city_spec * add remarkable * add foo
695b1eb [システム] [mobile] /facilities/:id のレイアウト変更。 (refs #2899) * いらないhrを削除。
% git rebase -i 695b1eb

エディタが立ち上がるので修正したいリビジョンのpickをeditに変更して終了する。

pick 9b819fd * add city_spec * add remarkable * add foo
pick 460bfa1 [デザイン] TOPページ「外へおでかけ」の変更 (refs #3490) * 谷さん修正分
edit c5524b2 * removed foo * removed remarkable</pre>

指定したリビジョンの状態に戻るので好きにaddしたり編集したりする。

% git commit --amend
% git rebase --continue

修正完了

複数の適当なコミットを一つにまとめたい

% git log --oneline
68fb234 add text2 in foo
5cd81d6 add text in foo
43fdcb7 add foo
fb91711 removed old paperclip
aa21e65 fixed
% git rebase -i fb91711
pick 43fdcb7 add foo
pick 5cd81d6 add text in foo
pick 68fb234 add text2 in foo

次のリビジョンとまとめたいリビジョンの先頭をpickからsquashに変える。

pick 43fdcb7 add foo
squash 5cd81d6 add text in foo
squash 68fb234 add text2 in foo

コミットメッセージをいれて終了。

みなさんおっしゃってますが、やはり、svnからgitにして嬉しいのはbranchの作成やcommitが気軽できるところですね。一つの作業をやってる途中に別の優先タスクが入った場合も、現在のbranchをほっぽってすぐにそちらのタスクに移れるのは精神的にもとても楽です。

適当にfixed, fixedなどとコミットしていっても後で綺麗にまとめられるところもいいですね。

gitは他にもいろいろ出来るみたいですが、今のところリアルにこんな感じで使っています。便利な使い方があれば教えて頂けると嬉しいです。

テストを通らないリリースを止めるライブラリ

2010年01月19日
区分
ruby
報告者:
komagata

昼にキリンフリーを飲むと機嫌が良くなる火曜日担当のkomagataです。

rspecのテストが通らないとデプロイを止めてしまうcapistranoのレシピのgemを作りました。

showstopper 0.1.0

ShowStopper is capistrano recipe that stop deploy when rspec is red.

インストール

$ sudo gem install showstopper -s http://gemcutter.org

Capfileの中で読み込むだけで設定完了です。

$ vi Capfile
(...)
require 'showstopper'

これでrspecが通ってないのに誰かがデプロイしようとすると・・・

% cap deploy
(...)
  * == Currently executing `deploy'
    triggering before callbacks for `deploy'
  * == Currently executing `deploy:spec'
    rspec test failed

showstopperがデプロイを中止してしまいます!

これを投入していい加減なテストのあるプロジェクトを恐怖のどん底に陥れてやりましょう!

Webプログラマーチュートリアル

2010年01月12日
区分
プログラミング
報告者:
komagata

ニコ生はじめました。komagataです。

新しくtaharaさんをメンバーに加えて、毎日持ち回りでこのブログを更新していくことになりました。

火曜日:komagata
水曜日:masudaさん
木曜日:chibaさん
金曜日:taharaさん

このような曜日担当で更新してきます。忘れていたら罵倒してください・・・。

ほとんどtaharaさんが書いてくれたのですが、Webプログラマーチュートリアルを作りました。

web-programmer-tutorial - Project Hosting on Google Code

何らかのプログラム経験さえあれば、これをみて自習するだけで業務するのに必要なスキルが習得できるように、ゴールと参考URL・書籍の一覧を用意しました。

入社した最初の一ヶ月を研修期間としてこれをやることにしました。(やりながらメニュー自体も改善する)

これならば自宅を警備しながらスキルを付けることが出来るのではないかと期待しております。

OJTのみになってしまっているのを改善したいITベンチャーの方や自宅警備員の方でこれを使ってわからないところがあれば全力で支援いたします。

AquesTalk Rubyバインディング

2009年09月26日
区分
プログラムプレゼンテーション
報告者:
komagata

komagataです。

“プログラムプレゼンテーション”でAquesTalkのRubyバインディングを作りました。(Windowsのみ)

win32-aques_talk - AquesTalk rubyバインディング - p0t

AquesTalkのrubyバインディング作りました。

komagata’s win32-aques_talk at master – GitHub

AquesTalkはwindows版dllのみが組み込んで配布することもOKとなっているのでwindows版をRubyから手軽に使いたいと思って作りました。RubyバインディングといってもC言語拡張ではなく、ruby-ffi(Foreign Function Interface)を使っています。

豊富なCのライブラリをRubyからサッと使いたいと思ってruby-ffiを使ってみました。ヘッダが必要で無く、動的ライブラリを直接実行するのが面白かったです。また、Windows上で、opensshやgitがいつも通り使えるのがちょっと意外でした。(rubyのgitバインディングはうまく動かないけど)

継続インテグレーションコマンド

2009年09月25日
区分
プログラムプレゼンテーション
報告者:
komagata

komagataです。

“プログラムプレゼンテーション”で継続的インテグレーションコマンドを作って発表しました。

saimaa - 今すぐ始められる継続的インテグレーション - p0t

継続的インテグレーションについては、CIサーバー(Continuous Integration Server)というやつが沢山あって非常に機能も豊富です。僕の仕事には少々大げさな気がしたのと、

「cronでsvn up && rakeじゃ駄目なのかしら?」

などと思ったのでそれをちょっとだけサポートするコマンドを作ってみました。

komagata’s saimaa at master – GitHub

アクトインディではcapistranoのデプロイコマンドにrspecとcucumberのフックが掛けてあるのでテストが通らなければデプロイはできません。ですが、コミットはできるのでテスト通らないコードがコミットされるとすぐにこの仕組みでメールが飛んでくるのでなかなか便利です。

これを作って感じたのは、rubygemsとgithubはクロスプラットフォームのCUIプログラム(コマンド)を作る環境として素晴らしいなということです。(全開と似たようなこと言ってますが)

rubygemsはインストールするとPATHが通ってるところに実行できる場所にコマンドをコピーしてくれるんですよね。jewelerでgithubへのアップも簡単です。

Talkedbun - 日本語テキストトゥースピーチサーバー

2009年09月25日
区分
プログラムプレゼンテーション
報告者:
komagata

komagataです。

アクトインディでは週一回、エンジニアが持ち回りで、「動いて、ダウロードできるプログラム」を公開・発表するという“プログラムプレゼンテーション”(まあ単なるプレゼンです)をやることにしました。

第一回はShu MASUDAさんでしたのでそちらはお任せするとして、僕は2回目にやりました。

Talkedbun - 日本語テキストトゥースピーチサーバー - p0t

URLにひらがなを指定すると、そのひらがなの音声がmp3で得られるwebサーバーを作りました。

komagata’s talkedbun at master – GitHub

日本語のURLからそのまま音声が取れたら面白いかなと思って作りました。作っていて一番勉強になったのは、RubyはRubygems, Rack, Sinatraなど、クロスプラットフォームでのマイクロウェイブアプリケーションを作る環境が素晴らしく整っているなということでした。RailsがWebrickをローカルに立ち上げて開発するというスタイルを作ったので自然とWebサーバーの実装、WAFの実装、周辺ツールなどの選択肢がたくさんあります。

ついでにhaml, sassも使ってみましたが、HTMLのインデントやCSSの重複した記述が病的に気になる僕にはぴったりのアホなツールでとても気に入りました。

(ジェバンニマチダさんが30分でやってくれました)

非常に重要なアプリケーションの導入

2009年03月09日
区分
自由
報告者:
komagata

komagataです。
先週末からchiba2009さんがエンジニアとして入ってくれました。
chibaさんは一番得意な言語がCommon Lispという素敵な方です。
ぜひ社内のシステムのそこここにCommon Lispを忍ばせてほしいです。
そのchibaさんに今日、とても重要なアプリケーション教えてもらいました。
それはvrmsです。

  % apt-cache search vrms
vrms - virtual Richard M. Stallman

早速インストールして実行してみました。

  % vrms
                Non-free packages installed on dev

gdb-doc                   The GNU Debugger Documentation

  1 non-free packages, 0.2% of 503 installed packages.

まずい!
というかなんでgdbのドキュメントがnon-freeなんでしょうか。

  % sudo apt-get remove --purge gdb-doc
% vrms
No non-free packages installed on dev!  rms would be proud.

これで安心。rmsもお喜びのようです。

sakuraba引退記念

2009年03月05日
区分
卒業
報告者:
komagata

komagataです。
最初から予定されていたことですが、2月末で、中米の荒くれ者ことsakurabaがアルバイトを完了しました。
沖縄料理屋で送別会をやって、プレゼントを贈りました。
sakurabaはMac信者なのでMighty Mouseでも送ればちょっとうれしいのは目に見えていたので、一人おでんセットをプレゼントしました。(しかもMighty Mouseより無意味に高い)
sakurabaは僕とmachidaさんに向かってとびっきりの呪いの言葉を吐きました。
sakurabaはアルバイトできてから、RailsもLinuxのサーバー構築も自分でどんどん覚えてしまって、一人でできるようになってしまいました。
いまでは僕が、「もっとテスト書いたほうがいいですよ」と怒られる始末。
ボリビアにでも旅立ってしまうのかもしれませんが、これからのsakurabaの活躍を陰ながら応援しています。

ベンチャーでのおすすめアンチウィルスソフト

2009年02月25日
区分
システム管理
報告者:
komagata

komagataです。
以前、はじめてベンチャーのシステム管理を担当したときは、張り切っていて、サーバー集中管理型のアンチウィルスソフトの見積もりを取ったりしていたんですが、今回は、「フリーでいいの無いかな?」という、ゆるふわ系です。
人数が10人程度なのでディレクトリサービスとか、そこまでやらなくてもいいかなと思っています。(以前は10人未満の会社でActive Directoryを使ってましたが、もう設定とか思い出せません)個人ではアンチウィルスソフトは AVG を使っていて、非常に気に入っていたんですが、商用利用は有料なのでGPLの ClamWin を試してみました。
日本語化パッチも公開されていて、定義ファイルのダウンロードやスキャンのスケジュール設定も簡単にでき、予想以上に「使える!」といった感じでした。
会社でも導入を進めて行きたいと思います。

オフィスの引越し(プロバイダー編)

2009年02月25日
区分
システム管理
報告者:
komagata

komagataです。
五反田から五反田へオフィス引越しました。
システム管理者にとっては何かと大変なオフィスの引越しですが、僕は担当することになったばかりなので全体を把握する丁度良い機会になりました。
予告通り、プロバイダーはインターリンクの固定IP8個にしました。
社内にクリティカルなサーバは無いんですが、IPも振り直しです。
/etc/network/intarfaces を変更して安心してたら、Apacheの443番ポートのバーチャルホストの設定のところに固定IPを書いていたのを忘れてました・・・。

それと、インターリンクはOP25Bしていることを忘れていて、


(25番で大丈夫でした。)
「そういやRedmineのチケット関連のメールが来てないな・・・」
などと思っていました。
慌ててPostfixをSubmissionポートを使う設定に変えました。

会社で25番を絶対使いたい場合は別のプロバイダをお考えください。


参照: Postfix – Submissionポートで通信 – p0t

1人体制での死活監視

2009年02月22日
区分
システム管理
報告者:
komagata

一定規模以上のWebサイトを運営しているエンジニアの方、業務時間外の障害対応ってどういう風にやっていますか? ルールとか体制とかを中心に教えてほしいです。 ちなみに.. – 人力検索はてな

ちなみにぼくの会社では、監視ツールや自作監視スクリプトでアラートをエンジニア社員全員に送って、誰かが対応することになっています。(たまに誰も対応やレスをしなくて上司に怒られます) これはぼくら社員にとって正直ストレスになるので、なにかよいルールや体制を上司に提案したいなと考えています。

はてなでこういう質問がありました。たしかに大きいところではストレスになりますよね。 うちは「一定規模以上のWebサイトを運営してい」ないので特にストレスは感じないです。(アラート受ける人も2人しかいないし・・・)
Montasticという無料でWebのステータスをチェックしてアラートを送ってくれるサービスを使っています。
これだとHTTPしかチェックしてくれないのでライブドアのDATAHOTEL PATROLというやつも試してみたいところです。
それとRailsのExceptionNotifierプラグインのみです。
社内に監視システムを構築するとその監視システム自体の維持が大変なのでやってません。
品質とのトレードオフだと思いますが、基本的に、
「人員1人体制想定でどこまで品質を高められるか」
という方向でがんばってみたいと思います。

迫る引越し

2009年02月21日
区分
システム管理
報告者:
komagata

komagataです。
何で今急いでブログを作ったかというと、会社が明日引越しだからです。
明日かよ!とお思いかもしれませんが、時は無常にも過ぎ去り、明日です。
まずは、引越し先に電話回線(FAX)・Bフレッツ回線・プロバイダを用意しました。
お客様のサービスのようなクリティカルなものは社内に無いので、自社サービスがひとつ乗っかっているサーバー1台だけを先に人力(チャリと人手)で運んで繋いできました。(昨日)
それ以外は止めても大丈夫なので荷造りして引越し屋さんにまかせます。
自分のブログで ITベンチャー勝ち組セット などというエントリーを書きましたが、その通りの INTERLINKの固定IP8個のやつ を契約しました。
カードがあればその場で使えるようになるのは助かりますね。
引越し先はBフレッツのマンションタイプが元々あったのでVDSLモデムが届きました。
無線LANルータは COREGA CG-WLBARGPXW を買いました。
おいおい、こんなので大丈夫か?と思うかもしれませんが、このルーター使ったことあるので大丈夫なんじゃないかなと楽観的に考えています。
固定IPを使うにはルータにUnnumbered IPという機能が必須だそうで、買うときに気をつけたいポイントです。
使ったことあるルータなので、特に問題無く、無線LANと固定IPでサーバ一個(Debian etch)設定できました。
/etc/network/interfaces を新しいIPに変えて、DNSを変更しただけです。
無線LANはWPA2, AESでパスワードかけましたが、アクセスポイント自体を隠す設定にするかどうかちょっと悩んで隠さないことにしました。(エンジニアでない人はクライアントの設定で混乱するかと思いまして・・・) これはどっちがいいでしょうか。みなさんどうしてますか?
引越し後の通常社員初出社は明後日で、引越し屋さんが運び込むのは明日です。
明日中に全クライアント向けの配線や設定を済ませてこようと思います。

ブログはじめました

2009年02月21日
区分
システム管理
報告者:
komagata

はじめまして。komagataと申します。
先日、アクトインディ株式会社のシステムの担当になったのでこのブログを作ってみました。
小さくてくだらない作業までこのブログに書いていこうと思うので、「ベンチャーのシステム担当あるある」
みたいな感じで見ていただければ・・・なとと考えています。
現状、僕とアルバイトのsakurabaの二人でネットワークと開発(要するにパソコン関係全部)を担当しています。
僕自身、ネットワークの知識がイマイチなところもあり、「そこはこうすべきだろう、常識的に考えて・・・」
などというところがあれば教えていただきたいな、という面もあります。
なにはともあれ、よろしくお願いします。

技師部隊からの
お知らせ

【求人】エンジニア募集しています。

本頁の来客数
八十七万千百七十六名以上(計測停止中)

メンバー一覧

アクトインディ技師部隊員名簿

アクトインディ技師部元隊員

アクトインディへ

カテゴリー

アクトインディ

aaaa