2013年10月21日月曜日
clang: error: linker command failed with exit code 1 (use -v to see invocation)と言われたら
2013年8月4日日曜日
sqlのdelete,updateによる事故(オペミス)を減らす
selectの履歴から組み立てる
select * from blog where title = 'my blog';
で結果を確認した後、上記のsqlを履歴から引っ張ってきて、
delete from blog where title = 'my blog';
に書き換える
さらに念のためにlimit句を付ける
delete from blog where title = 'my blog' limit 1;
safe-updatesオプションを付ける
whereやlimitが指定されてないと実行されない
document
起動時に指定か、my.cnfに書いておく。
緊急でないならスクリプトにする
手作業のオペミスが発生しないので確実。
それに同じオペレーションをもう一度する可能性は高い。
2013年7月28日日曜日
gitのhooksを活用する
gitフックについて
どのような種類のフックがあるかは、ここで確認コミット前にテストを実行
.git/hooks/pre-commitに好きなスクリプトを置いておくと実行されます。以下のコードでcommit時にproveが走るようになります。
#!/usr/bin/env perl
use strict;
use warnings;
chomp( my $project_dir = `git rev-parse --show-toplevel` );
system("prove", "-I${project_dir}/lib", "${project_dir}/t") == 0 or die 'Failed test';
gitのバージョンが古いためshow-toplevelオプションが無い場合は、
git-dirオプションで.gitディレクトリへのパスが取得できるので、そこから目的のパスを作るといいです。
コミット前にコードチェックorフィルター
my @modified_files = system('git diff-index --cached --name-only HEAD');で変更ファイル一覧が取れるので、あとはお好きにできますね。
gitでPATHの先頭に’/usr/libexec/git-core:/usr/bin:’が追加される
2013年7月16日火曜日
テストがどこにあるのかわからない対策
対策として、1クラス1テストファイルにしてライブラリと同じディレクトリ階層を作る、があります。
しかし面倒くさいですし、そのファイルにあることは分かっても、どのテストが自分の確認したいテストなのかが、すぐには分からないことがあります。
命名規則を決めてgrep
- メソッド名の完全な名前をsubtestに書く
- メソッド内の各種条件はsubtestをネスト
メリット
- 一意に検索できる
- 俺々カバレッジが作りやすい
テスト対象コード
package Hoge;
sub new {
....
}
sub search {
....
}
テストコード
use Test::More;
subtest 'Hoge::search' => sub {
subtest 'limit' => sub {
my $hoge_obj = Hoge->new;
my @res = $hoge_obj->search( limit => 20 );
is(scalar @res, 20);
};
subtest '....' => sub {
....
};
};
done_testing;
おれおれカバレッジ
この命名規則だとsubtestをオーバーライドすることでテストカバレッジが簡単に取れます。既存カバレッジモジュールで、あるメソッドのテストを実行したときに中で異なるメソッドを呼び出してるだけで、そのメソッドもカバレッジに追加されて、むーん、ってときに作ってました。
みんなどうやってるんだろう
この話をしたところRSpecぽいですねって言われた。Kyoto.pm 05に参加してきました
ツイッターアカウントは知ってるけど話したことはない、って人が多くて来てよかったなーと思いました。
いつも通り、全体的なことは他の人が書くだろー、ってことで自分の話をすると、
EPUB::Parserってモジュールを書いたので、それについて書いた動機と、それの設計などをざっくり言った感じです。
僕的にはコードの設計を教えて欲しいなって気持ちだったんですが、発表って形式でいきなり出しても難しい感じでした。
余談ですが、EPUB::Filterというモジュールも書こうとしてて、
EPUB::Parserのスクリプトが返す{ "title" : "タイトル" } ってjsonを書き換えて、Filterのスクリプトに食わすとEPUBの中身が書き変わるというものです。
けど、Filterって銘打つならHTML::Filterっぽくせにゃいかんのかなー、そこまでは、、、って感じです。
発表資料: EPUBのパーサーとビルダー
作成動機
- 電子書籍をweb上で作成、販売するサイトを運用
- 出版社から頂くデータがEPUB3化
- EPUB3仕様に完全対応した既存モジュールがない
- 都度アップデートする必要があるなら得意なPerl製モジュールでないとキツい
発表動機
- 設計やメソッド名について意見が欲しい
- パーサーの話が主
EPUB::Parser
github- サイトで提供しているインポート機能のために作成
- 現在EPUB3のみ対応
- インポート時に必要となるデータの整形を吸収(パスの書き換え等)
- XML::LibXMLを使用
- ドキュメント追加中
EPUB::Parser設計
- ファイル毎にクラス化しており、複数ファイルを参照する必要がある場合は責務を逸脱しないよう別の名前空間を用意(EPUB::Parser::ManagerとEPUB::Parser::Fileに分割)
- 単一ファイルの中にもmanifestやspineなど重要な役割をもつノードがあるのでそれぞれクラス化(EPUB::Parser::File::**::Context::**)
EPUB ├── Parser │ ├── File │ │ ├── Container.pm # META-INF/container.xml用クラス │ │ ├── Document.pm # 本文ファイル用 │ │ ├── Navi │ │ │ ├── Context │ │ │ │ └── Toc.pm │ │ │ └── Context.pm │ │ ├── Navi.pm │ │ ├── OPF │ │ │ ├── Context │ │ │ │ ├── Guide.pm │ │ │ │ ├── Manifest.pm │ │ │ │ ├── Metadata.pm │ │ │ │ └── Spine.pm │ │ │ └── Context.pm │ │ ├── OPF.pm │ │ ├── Parser #各ファイル用パーサー. xpathのネームスペース設定とコンテキスト切り替えを行う │ │ │ ├── Container.pm │ │ │ ├── Document.pm │ │ │ ├── Navi.pm │ │ │ └── OPF.pm │ │ └── Parser.pm # 各ファイル用パーサーの親で、find,singleメソッドを持っている │ ├── Manager │ │ └── Pages.pm │ └── Util │ ├── Archive.pm # zip内データをイテレータで返す │ ├── AttributePacker.pm # 任意の属性値を主キーとしたデータ構造を返す │ ├── Context.pm # EPUB::Parser::File::**::Contextの共通メソッドエクスポート用. │ │ # 安易にUtilに置いてしまった │ ├── EpubLoad.pm │ └── ShortcutMethod.pm # EPUB::Parserにメソッドエクスポート └── Parser.pm
- データ構造を作成するメソッド命名が難しい。ノードの任意の属性値を主キーとして、データ構造を返す処理など。
- テストはsubtest名に完全なメソッド名を書いてgrepで特定できるようにしている
- 面倒くさいと言われたのでショートカットメソッドを作った。$self->opf->metadata->titleが$self->titleに。しかしショートカットメソッドは作り出すとキリがなく、EPUB/Parser.pmが本質と関係ないコードで肥大化するので、EPUB/Parser/Util/ShortcutMethod.pmからエクスポートすることにした。
EPUB3::Builder(cpan化の予定無し)
github- 入力xhtmlのbody部をepub3用のテンプレートに流し込む
- メタデータ等の作成
- naviファイルは全ページ列挙してるだけ
- テストでxmlを比較するにはXML::Compareを使った
他
jsでグラフ生成をためしてみたいhttp://code.shutterstock.com/rickshaw/
2013年7月9日火曜日
proxy.pac on Mac
ローカルにpacファイル配信用サーバー立てる
#!/usr/bin/env python
import SimpleHTTPServer
import SocketServer
PORT = 8080
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
Handler.extensions_map['.pac'] = 'application/javascript'
httpd = SocketServer.TCPServer(("",PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()
を保存して、同ディレクトリにproxy.pacファイルを置いておく。
// ホスト名がhoge.comのときだけproxyする
function FindProxyForURL(url,host) {
if (dnsDomainIs(host, "hoge.com")) {
alert( 'proxy!: ' + url);
return "PROXY 127.0.0.1:5000";
}
else {
alert( 'direct: ' + url);
return "DIRECT";
}
}
で、サーバー起動.url はhttp://localhost:8080/proxy.pac と仮定。
Firefoxに設定
メニューから、環境設定->詳細->ネットワーク->接続設定自動プロキシ設定スクリプトURLを設定。
で終了。
pacファイルを更新したときにFirefox側も更新する方法は
自動プロキシ設定スクリプトURL横の再読み込みボタンを押す以外は今のところわからない
(面倒)
Firefoxでデバッグ
pacにalertを仕込んでおくと、エラーコンソールで確認できる。
メニューからツール->web開発->エラーコンソール
chromeに設定
chromeはosのほうの設定を読みにいくので、chromeの詳細設定で
ネットワーク項目のプロキシ設定の変更ボタンを押すと、osのネットワーク設定が開く。
(ここでボタンが押せない場合、chromeのproxy関係の拡張機能を無効にする)
自動プロキシ構成を有効にして、pacのurlを記入する。
pac更新後の反映は
chrome://net-internals/proxyservice#proxy
から可能。
chromeでデバッグ
よくわからない
2013年6月14日金曜日
perlのREPL近状
Perl5 で irb 相当のことをする方法、すなわち REPL をする方法
のようにデバッガを利用する方法や、Eval::WithLexicalsのtinyreplでレキシカル変数を保存する方法が紹介されているが、
Reply is awesome!
doyさんがRelyをリリース。
~/.replrcに設定を書くことで各種pluginが設定できる。
tokuhiromさんのブログのようにやったら、
$x = 3;
$x + 1; って書いても$x = 3が保存されてない。
Reply::Plugin::FancyPromptを入れたら同じ動作になった。表示もtokuhiromさんのブログのように0>ってナンバーが付いてますね。
コマンドライン上で^Pや^HになっちゃうのはReadLineプラグインだと上手く動かなかった。
とりあえずrlwrapを使っておく。
port install rlwrap
rlwrap reply
mac os用のreadlineだとまたしてもtokuhiromさんの
OSX ユーザーのために Term::ReadLine::EditLine をだした。
があるけれど、replyで動かないっぽい。
追記
デフォルトでpluginがいろいろ入るようになったみたい
2013年6月3日月曜日
Storyboardで定義したviewを再帰的に使用する
コードからStoryboardを取得すると、Storyboardで設定したsegueなどもそのまま利用できる
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewIdentifer"];
assetLibraryで保存処理時にエラー
複数のファイルを保存するとき、assetLibraryのアクセスが非同期なせいで落ちる。
他に方法があるのかもしれないが、再帰で処理。
- (void)save:(NSMutableArray *)images {
UIImage *img = [images lastObject];
if (img == nil) {
return;
}
if (self.assetLibrary == nil) {
NSLog(@"assetLibrary is nill");
return;
}
[self.assetLibrary writeImageToSavedPhotosAlbum:img.CGImage
metadata:nil
completionBlock:^(NSURL *assetURL, NSError *error) {
[images removeLastObject];
if ( [images count] == 0 ) {
// 完了メッセージ出したりとか
}
[self save:images];
}
];
}
iOS6で画面回転を抑制
以下のメソッドを定義すればいいが、全部に適用したかったので、UIViewControllerのカテゴリを作成して、pchでimport
- (BOOL)shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
2013年6月2日日曜日
TabBarとToolBarの入れ替え
TabBar非表示
ググって出てくるコードだと、タブバーを再表示させたときにボタンがクリックできなくなっていた。
自分の場合、最初の状態が広告をタブバー上部に座標を指定して表示させていたので、elseで再表示時に広告とタブバーが重なっていたようだ。
- (BOOL) hideTabBar {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.4];
for (UIView *view in self.view.subviews) {
// 広告はスキップ
if ( [view isKindOfClass:[NADView class]] ) {
continue;
}
CGRect _rect = view.frame;
if ( [view isKindOfClass:[UITabBar class]] ) {
_rect.origin.y = hiddenTabBar ? 431 : 480;
}
else {
_rect.size.height = hiddenTabBar ? 431 : 480;
}
[view setFrame:_rect];
}
[UIView commitAnimations];
hiddenTabBar = !hiddenTabBar;
return hiddenTabBar;
}
ToolBarと入れ替え
- (IBAction)toggleBar:(id)sender {
UITabBarController *tabBarController = self.tabBarController;
BOOL tabBarIsHidden = [tabBarController hideTabBar];
[self.navigationController setToolbarHidden:!tabBarIsHidden];
}
Storyboardでは微妙な操作が要求されるのかtabBarの上にtoolBarを置くことができなかったので、コード側で作成した。
// toolBarのボタン作成,配置
UIBarButtonItem *hogeBtn = [[UIBarButtonItem alloc] initWithTitle:@"HOGE"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(hoge:)
];
NSArray *items = [NSArray arrayWithObjects:hogeBtn,nil];
[self setToolbarItems:items];
2013年5月31日金曜日
MacにHTML::Tidyをインストール
目的
EPUBを作るライブラリを書いているのですが、そのテストを書く際に何も工夫しないと、取得したXHTMLと答え合わせ用のXHTMLでスペース1つでも違うとテストが転けてしまう。
これは面倒なので、両方とも整形してから比較するためにHTML::Tidy を使いたい。
問題
cpanm HTML::Tidy するとテストが失敗する。build.logを見てみるとtidyp.hがないとのこと。
解決
以下のサイトにあった
【PERL】HTML / XML の 整形には TIDY“P”?
このサイトではgithubから持ってきてmakeしていますが、自分は Alien::Tidyp を使いました。
cpanm Alien::Tidyp
cpanm HTML::Tidy
課題
ライブラリとして公開するときに、必要なときだけAlien::Tidyp入れるようにってできないかな。
2013年5月30日木曜日
perlで画像の種類を判定する
モジュール探し
できるだけ依存が少ないモジュールで作りたいなぁと思って探すとImage::Infoというモジュールがあったので使ってみました。yanchaで質問して、Image::JpegCheckというモジュールがあることを知りましたが、名前の通りjpegだけですので、今回の用途には使えず。
Image::InfoもImage::JpegCheckもやっていることはほぼ同じで、画像の一部だけ読み込んで判定しています。
コード
ファイル名に拡張子がある場合は拡張子を用いて判定しています。拡張子がなければ画像データから判定。
sub media_type {
my $image_path = shift;
require MIME::Types;
my ($type) = MIME::Types::by_suffix($image_path); #画像ファイル名から判定
unless ($type) {
require Image::Info;
my $img_info = Image::Info::image_type($image_path); #画像データの一部から判定
if ( $img_info->{error} ) {
die sprintf("Can't determine file type: %s", $img_info->{error});
}
$type = 'image/'.$img_info->{file_type};
}
lc($type);
}
2013年5月13日月曜日
ARC対応のReachabilityでネットワーク状況を確認する
(追記 公式がアップデートしてARCに対応している https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html)
次にBuild PhasesのLink Binary With LibrariesでSystemConfiguration.frameworkを追加。
あとはヘッダを読み込んだファイルで以下を記述したら完了。
コード引用元
Reachability *reachablity = [Reachability reachabilityForInternetConnection];
NetworkStatus status = [reachablity currentReachabilityStatus];
switch (status) {
case NotReachable:
NSLog(@"インターネット接続出来ません");
break;
case ReachableViaWWAN:
NSLog(@"3G接続中");
break;
case ReachableViaWiFi:
NSLog(@"WiFi接続中");
break;
default:
NSLog(@"??[%d]", status);
break;
}
追記
オフラインかどうか調べたいだけなのでマクロにした
#define isOffline \
([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == NotReachable ? YES : NO )
追記2
2.2にバージョンを上げたら、SystemConfiguration.frameworkを追加しないとコンパイルエラーになる。2013年5月7日火曜日
XPathQueryでHTML要素取得
XPathQuery
XMLのパーサを利用すると、不完全なHTMLのパースに失敗するので、
ここにあるlibxml2のラッパーを利用して、
XPathで要素を取得。
導入の仕方
ここ
一部変更したのはHeader Search Pathsに追加するのを/usr/include/libxml2にすること。
実装
PerformHTMLXPathQueryを使う。
NSURL *url = [NSURL URLWithString:@"http://google.com"];
NSURLRequest *request = [NSMutableURLRequest requestWithURL: url];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [
NSURLConnection sendSynchronousRequest: request
returningResponse: &response
error: &error
];
if(error) {
LOG(@"%@", error);
}
NSArray *imgs = PerformHTMLXPathQuery(data, @"//img");
for (NSDictionary *dic in imgs) {
for (NSDictionary *attr in [dic objectForKey:@"nodeAttributeArray"] ) {
NSString *attr_name = [attr objectForKey:@"attributeName"];
NSString *attr_value = [attr objectForKey:@"nodeContent"];
}
}
2013年4月28日日曜日
2013年4月23日火曜日
Perl入学式のサポーター?してきました
@__papix__ さんが各地で開催しているPerl入学式in東京に参加してきました。
第1回はubuntuとplenvの導入がメインでした。計6回で、twitteっぽいwebアプリを作るのが目標だそうです。
参加者はサポーター入れて30人前後かな?
基本のキから解説するので、
ちょっと本を読めば、ちょっとググれば解ること、、、なんだけど腰があがらない、きっかけがない、って人には良いんじゃないかなぁ、と思います。
(でも皆のハマりどころは、pathが設定できてなかったり、シェルの使い方だったり、rootでplenv入れたり、とperl関係ない周辺知識だったので、一人でやるにはしんどいかもですね。今回解決できてよかったですね!)
今回参加できなかった人用に補講があるかもなので、要チェック!
shibuya.lisp Meet Up #4
shibuya.lisp覚えてる範囲まとめ
- 今回はcommon lispが中心
- アカデミックな方が多かった?
- 素数夜曲
- import-from律儀に書くの面倒くさいから実行時に実際に使ってる関数だけimport-fromするようにする。
- 完璧にしようとするとやることはたくさんある
- SPDY対応
- TLSに対応したOpenSSLモジュールなかった。
- パッケージ管理はquicklisp
- swankは仕様が文書で無い。pidとかいろいろ送ってる変なプロトコルでemacsに特化してると思って良い。
- clojureはswank使わずにnrepl?
- llvm誰か早よ
- 普及のためにはOAuth2モジュールとかそういうモジュールも作らないと
- 衝突したときにデバッガに遷移するのイラっとする->emacsならpopwinでミニバッファに出すと随分マシ。
- GPU使ってもバスで詰まるから、まだ焦ってGPU使う時期でもない
- 毎月開催しようと思ったらラフな感じじゃないと続かない
- 土日にハッカソンする?
- ust
2013年3月31日日曜日
git-catch-up 書いた
何これ?
ローカルブランチをfork元(upstream)の更新に追いつかせるスクリプトです。
pull request用にローカルでブランチ切って作業してる間に、fork元が更新しちゃったYOって時用のショートカットスクリプトです。
「pull requestするまで」というエントリで書いた通りの、一連の手順を逐次実行するだけです。
使い方
githubから取得してください。
次に、git-coreディレクトリに配置します。(centOSなら/usr/libexec/git-core/)
git catch-up で実行されます。リモートリポジトリ名のデフォルトはupstreamになりますが、引数で変更できます。
git catch-up origin
コマンドは以下を実行するだけ
今のブランチがprotoだと仮定。
git stash
git checkout master
git pull upstream master
git checkout proto
git rebase master proto
git stash pop
感想
お手製感たっぷりだけど、自分としてはすごい楽になった。
2013年3月29日金曜日
undefでblessするとどうなるか
undefでblessすると、特にエラーにならずmainパッケージになります。
my $self = bless {} , undef;
warn ref $self ; #main
ってか、blessって
bless {};
でエラーにならないのか!
今日のPerl Beginnersで行ったライブコーディングで動かなかったのは、以下の$classがundefなせいでした。
sub new {
my $class; # shiftがない!
my $env = shift;
bless { env => $env }, $class;
}
2013年3月10日日曜日
Text::Xslateのエラー行数について
自分以外言ってる人を見たことがないのだけれど、なんか解決策あるのかな。
問題
macro,header,footerをテンプレートファイルに結合した状態での行数が報告されるので、
テンプレートの1行目で警告がでても、headerが3行あると4行目として報告される。
暫定対応
とりあえずmacro,headerの行数を数えて、その分引いてやろう。
マイナス値ならheaderかmacroに問題あるし、多ければfooterに問題がある。
んで、warn_handlerでメッセージ書き換え。
コード
pathは一つしか想定してないよ。
https://gist.github.com/tokubass/5129241
パースエラーには無力
die_handerを設定してもパースエラーは取れないので、Capture::Tiny 使うくらいしかないのかな。$SIG{__DIE__}でも取れるけど、ハマりそう。
2013年3月4日月曜日
pull requestするまで
1年前の放置下書き発掘
pull requestお作法
forkして、master以外からpull request
forkして、cloneして、ローカルにprotoブランチ作成
github上でforkする
git clone git://github.com/tokubass/yairc.git yancha
git checkout -b proto
作成したprotoブランチをリモートにpush
ショートカット用に名前をつける
git remote add tokubass git@github.com:tokubass/yairc.git
git remote -vでチェック
sshの設定をする
.ssh/configに、
Host github.com
User git
Hostname ssh.github.com
Port 443
IdentityFile ~/.ssh/id_dsa.github
pushしてprotoブランチ作成
git push tokubass proto
fork元の更新を自分のローカルmasterに反映
fork元リポジトリをupstreamという名前で登録
git remote add upstream git://github.com/hogeuser/hoge.git
git stash
git checkout master
git pull upstream master #間違えてprotoでやると面倒くさいことになった
git checkout proto
git rebase master proto
git stash pop # ここでコンフリクトしたら解決する
覚えられない
pull requestの度に下書き状態のこのエントリ読み返してた。
単純に順番に実行するだけのスクリプト書いたので、次エントリで。書いた
他
コミットをまとめる
git rebase -i HEAD~2
editorで、
pickup .....
fixup ......
とすると、pickupのほうにコミットがまとめられる。
rebaseを途中でやめるのは、git rebase --abort
ブランチ削除
git branch -d hoge
git push origin :hoge
2013年3月2日土曜日
webエンジニア2年振り返り
入社前
情報系の院を卒業後、F、H、N等で働く気にはなれず、2年弱、車の会社で働く。
とてもいい会社でしたが、やはり自分のやりたいこととは違うなと思うように、、、。
(院生時代に@masa_edw さんに、給料もらいながらプログラムできるとか最高だし、って言われたのがフラッシュバック)
将来は心配だけど、不景気でクビになったり病気して途中で辞めることになった場合、すごく後悔する。なぜかそれは確信めいたものがありました。
でも好き好き言うだけでプログラム書かない口だけ野郎の可能性もあるし、そんなことで今の安定した生活は捨てられない。
そこで勉強会に出てみたり、通勤時間で2ヶ月穴が開くくらいPerlベストプラクティス読んで、ブログにまとめたりしました。
ほんとはもっと長めにお試し期間を作ってたのだけど、我慢できずに転職活動開始。
転職活動
findjobでperlで検索。
画像でスーツが写ってる、パス。
1年でアプリ100本作ります!パス。
やっぱりブログやってる会社がいい。あとどうせやるならメッカ!東京さいくべ!
ライブドア? -> 経験者のみ。うぼぁー。
シーサーが未経験可!プログラム提出必須だったのも好印象。
社員のブログとツイッター監視開始w
結局他の会社の面接受ける前にシーサーに内定もらったので、他はお断りしました。
他の会社はECサイトが多かったイメージ。
Seesaaに入社
2011年2月末にseesaaにイン。
2011前半
入社してすぐにオープン直前のサービスにイン。え、社長が一人で作ったの。
webのことを知らないので社長にいろいろ聞きながら、そのまま現在までメインエンジニア。
printって書いてもエラーログに出ないぉ。というレベル。
半年でgit,perl,js,mysqlをそこそこ使える程度に学び、HTTP,WAFやテンプレートエンジンの概念を学ぶ。
ブログのインポートモジュール書くためにMTの仕様も読んだ。
2011後半
前述のサービスをやりつつ、メインサービスであるブログのリニューアルに関わる。
メイン人柱erとしてTTからxslateに書き換えてたけど、挫折。マクロがキツかった。(今は使える)
結局malaさん実装でオートエスケープできるようになったから、TTのままでいくことになった。
新規サービスではxslate使ってます。
このタイミングでpsgiも学ぶ。
他にも勉強になったことはあったけど割愛。
2012前半
フロント側が増えてきたので、本気でjsを学ぶ。有名どころのjs、jqueryオライリー本通勤時間に読破。
こっそりweb上で読書会やってて通りすがりの人に教えてもらったり。
2012後半
スマホアプリのAPI作成。nginx,MongoDBも学べたけど、初めての新規案件だったので実は知らなかった基礎知識が補完された。
これで持ってるサービスは2つ、で現在にいたる。機能追加とかやってます。
勉強会
勉強会は入社当時から平均月1で参加してると思う。
たしか@maka2_donzokoさん目当てでhachioji.pmに参加。そのまま居着く
perl beginnersにも定期的に参加して発表してます。
ISUCON2に参加して惨敗。ちなみに一番最初にブログ書いたけど載ってなかったぉ。
他
yancha
思いがけずここでAE、socket.ioが学べた。
iOSアプリ制作
アプリAPI作った関係でアプリ側も興味持ち始める。
ここ2ヶ月ほど通勤時間と土日でアップル公式マニュアルを読み漁る。大体作れるようになった。
今後
インフラ周りが弱い、弱いから強化は必須だけど、ここをメインにするつもりはない。
まとめたのを自分でみてしばらく考える。