この事実が明らかになったことで、大臣の約半数がセプクし、ヤンバナ・サシミ社は解体、国民の主要な栄養源でもあったハマチ粉末の供給システムが崩壊したことで、スシが食べられず餓死する人々が前年比三万パーセントをカウントした。
ナンシーは体の自由も効かず、踊り場で二人のニンジャに上下から挟まれた格好である。だが青黒の忍者はナンシーを一瞥しただけで、直ぐにコッカトリスへ向き直った。「ドーモ、はじめましてコッカトリス=サン。ニンジャスレイヤーです」二人のニンジャの間に緊張が走った。
「ドーモ、ニンジャスレイヤー=サン。コッカトリスです」コッカトリスの声には動揺が感じられた。「お前がどうしてここに」「通りすがりだ。だが貴様は殺す」ニンジャスレイヤーは無慈悲に言い放った。コッカトリスは首に巻いたヘビをほどき、やおらニンジャスレイヤーに投げつけた。「カメ!」
FJORD, LLCではローカルインターン(オフィスにきてやるヤツ)を3人募集しています。(@CheerDreamsさんが起業して卒業されて、@hrysdは普通に仕事してフリーランサーみたいになったので)
完全リモートからやるインターンも募集していますが、ローカルの場合はオフィスの席に限りがあるので、休学中の学生やニート、就職浪人中の方など、なるべく平日、多くの日数出来る方を歓迎します。
内容はこんな感じです。
- Webサービスを作りたい学生・社会人インターン募集 « FJORD, LLC(合同会社フィヨルド)
- Webサービスを作って起業したい学生・社会人インターンを募集します。 « FJORD, LLC(合同会社フィヨルド)
- リモートインターンシップ制度案 - komagata
別に起業目指す必要ないです。プログラミングを覚えた暁には全力で就職先を僕らも探すし、どうやったらナアナアでITベンチャーに就職するかを一緒に模索しますw。また、就職せずに自分でWebサービス作って食って行きたい人も歓迎です。
出来るようになることは大体下記の感じです。
小さい会社のツールスタック・開発フロー « FJORD, LLC(合同会社フィヨルド)
ちょっと古い資料なので、今はPivotalTrackerがFulcrumになってたり、本番デプロイするとLingrに通知来たり、Dumper.ioで自動バックアップ取ってたりとかそういう感じです。
申し込みは下記にあるフォームから応募していただけるとうれしいです。
完全リモートのネトゲ廃人枠、子育てママ枠なども考えていますのでどうぞよろしくおねがいします。
唯一ぬにの盾
今は亡きWiseknot社の同僚であった「三度の飯より四度の飯、Javascriptはもっと好きです。」でお馴染みの@kjirouが一ヶ月来てくれる事になった。
また、アリウープ様にお願いしていた件もCakePHP2実践入門の著者の一人でもある@kaz_29さんが参戦してくださることになった。
「もうついたのか!」「はやい!」「きた!盾きた!」「これで勝つる!」と大歓迎状態だった。哀れにも@komagataは盾の役目を果たせず死んでいた近くで素早くフラッシュ(略
軽く発生ポイント
俺「あのポイント関連の処理ってどこでやってるの?」
@kjirou「あー、あれは共通化されてないからどっちかは処理されてないんだけど、片方は"軽く発生ポイント"でやっ(略」
俺「軽く?・・・何?」
@kjirou「だからカルクハッセイポイントクラスで」
俺「あー、Calculation?ちょwwwww CalcHasseiPointかよwwww。英語日本語英語のクラス名をさも一般名詞みたいに日常会話に混ぜないでよwwww」
@kjirou「いやそんなんこのコードの中じゃ普通でしょ、それより酷いのがこっちの処(略」
Testing Testing Testing!
大量メール配信の部分もヤバイということで@kaz_29さんがSimpleTest(CakePHP1.3なのでPHPUnitじゃないところがまたダルいが)でテストを書き始めてくださった。
@kjirouも複雑怪奇な仕様と実装をGithub Wikiにまとめながらどんどんコードを書いてる。
@hrysdは先日仕込んだMailLoggerから容赦なくNotice, Warnningが飛んでくるのでそれを潰すのを担当。
盛り上がって来やがった。
強引なEnd To Endテスト
app/tests/helper.php:
<?php require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; class CakePHPSeleniumTestCase extends PHPUnit_Extensions_SeleniumTestCase { protected function assertNoError() { $html = $this->getHtmlSource(); $patterns = array( '/<b>Fatal Error<\/b> \(256\)/', '/<b>Warning<\/b> \(512\)/', '/<b>Notice<\/b> \(1024\)/' ); $result = 0; foreach ($patterns as $pattern) { $result += preg_match($pattern, $html); } $this->assertEquals($result, 0); } }
「とにかく普通に画面にエラーが出てる」
という問題を直すためにCakePHP1.3が出力するエラーを確かめるための強引なAssertionを作成。
app/tests/integrations/RegularOrdersTest.php:
<?php
require_once 'helper.php';
class RegularOrdersTest extends CakePHPSeleniumTestCase
{
protected function setUp()
{
$this->setBrowser('*firefox');
$this->setBrowserUrl('http://xxxxxxxxxx/');
}
public function testIndexTitle()
{
$this->open('/regular_orders');
$this->assertTitle('管理画面');
$this->assertNoError();
}
}
こんな感じで使う。
PHPUnitのソース追ってましたが、開発がかなり活発。APIとマイナーバージョンがどんどん変わってく。そんなに頑張るとハゲるぞセバスチャン。
まだJenkinsに怒られるけど来週には環境が整うはず。強引にCIに乗せようと思えば乗るもんだなあという感じ。
PHPMatsuri
PHPMatsuri2012行きます。基本、Hackathonだそうなのでレガシーに役立つ何かが作れればなーと思います。
イヤーパッドって言うんですね。僕はアメ耳なのでカナル型なんてありえないし、替えのイヤーパッドを必要とします。アメ耳派からするとカナル型なんて鼻に突っ込んでるのと同じですからね・・・。
先週の日曜日にデザイナーの為のgem作成勉強会をFJORDでやりました。
RubyGemsによるデザインの再利用 // Speaker Deck元々は@machdaさんが
「jsとかsassのmixinとかがgemになってると楽でいい。作り方教えて欲しい」
と言ってたので1人に教えるんだったら勉強会にしようと思いつきで10分ぐらいでATND建てたのでした。
デザイナーといってもみんなgitやterminal使えてrubyの環境つくれること前提って感じだったのでいきなりgem作成は厳しいかもですが、複雑化する長期プロジェクトではcssのgemによる構造化はほぼ必須かなって気がしました。
追加:
@kyokutyoさんが手順を公開されていました。
% defaults write com.apple.screencapture location ~/Pictures/screenshot
% killall SystemUIServer
あるべき初期データの姿が不明。今動いてるDBが全て。という場合にmigrationをはじめるのが難しい。また、複合主キーを使ってる場合はそもそもmigration出来ない。なので無理矢理afterでdumpファイルを読み込んで対応。
<?php
class xxxxxxxxxxxxxxxxx extends CakeMigration
{
public $description = '';
public $migration = array(
'up' => array(),
'down' => array(),
);
public function before($direction)
{
return true;
}
public function after($direction)
{
if ($direction == 'up') {
$config = $this->db->config;
`mysql -u{$config['login']} -p{$config['password']} {$config['database']} < db/20121010154033_create_initialize.sql`;
}
return true;
}
}
レガシーコード改善ガイドが届いたので読みました。とても勇気づけられたし、レガシー改善のコーディングテクニックがいろいろと参考になりました。
個人的にはコーディング以外の開発環境やツール、スクリプト言語ならではな部分も知りたかったのでレガシーコード改善ガイド風に思いついたのを書いていこうと思います。
このPHPのコードを追える気がしません
まずは深呼吸して、コードベースをeval, create_function, extractでgrepしましょう。意外と少ないでしょう?だったら大丈夫。findとgrepとviがあればいつかは何とかなります。
バージョン管理されてません
テスト環境みたいなのがあるはず(もしくは本番環境)なのでFTPとかSCPでそれを全部もってきてgithubに突っ込む。今後、開発はそこにコミットして、アップするときもそこからアップしてねと言う。
githubを借りる許可が出なかったらその辺のマシンにgitをreposを立てる。みんなでreposを使う合意が取れなかったら自分だけでもgitで管理する。githubの利点はpull requestとコードレビューがしやすい点。
ソフトウェア資産を失わないようにという話をすれば大抵聞き入れてくれるはず。
ステージング環境がありません
その辺のマシン、もしくはさくらVPS1Gを借りてreposにpushされたらそこにデプロイされるようにしよう。(capistranoとかで)
本番環境しかないのでテストにつかうまともな初期データがありません
おそらく本番環境のDBの状態=仕様になっているのでしょう。3桁に迫るテーブルがある場合、まっさらなスキーマから手で初期データを作っていると日が暮れてしまいます。本番のDBをdumpしてきてそれをベースにテストを実行しましょう。ボトムアップではなく、トップダウンで初期データを少しずつあるべき状態にしてきましょう。
中長期的な作業をする時間がありません
本業(デスマ)も「このくらいやってれば普通以上だろう」ぐらいやりつつ開いた時間でやろう。もしくは業務時間外でやりましょう。
頑張る気が起きません
ひどい状態なら怒られない範囲でブログに書けばネタになるし同僚や誰かが助けてくれるかもしれません。着実に改善していくところをRPGみたいに楽しもう。ナイトメアモードのゲームだと思えばやりがいがあります。
こんなこと書いてたけど普通にできた。(simpletestは必要)
% cake testsuite app all
知らんかった・・・。
ついでに、phpunitを使ったseleniumのテストも一緒にできるshell作った。
app/vendors/shells/tasks/integrations.php:
<?php
class IntegrationsTask extends Shell
{
public function startup() {}
public function execute()
{
$this->out(`phpunit app/tests/integrations`);
}
}
app/vendors/shells/test.php:
class TestShell extends Shell
{
public $tasks = array('Cases', 'Integrations');
public function startup() {}
public function main()
{
$arg = isset($this->args[0]) ? $this->args[0] : '';
switch ($arg) {
case 'cases':
$this->Cases->execute();
break;
case 'integrations':
$this->Integrations->execute();
break;
default:
$this->Cases->execute();
$this->Integrations->execute();
}
}
}
% cake test