isuconの予選で失格してきた

牡蠣途中

運営の方々、楽しいイベントをありがとうございました!!
kuraチームのid:karupanerura, id:masasuz ありがとうございました!

isucon中にやったこと

サマリーテーブルを使って、ログインの成否を判定するようにした

https://github.com/karupanerura/isucon2014-elimination/commit/b81dcd38b7201c838ab49501a0a91984b13361b4 https://github.com/karupanerura/isucon2014-elimination/commit/2daf40a936fc541841cc50fcb2c408fee7530444

サマリーテーブルを使って、集計を出すようにした

https://github.com/karupanerura/isucon2014-elimination/commit/f4bd9e12c1d17ef1dab601b745c82daed134e504

  • 紆余曲折があり、本戦中にちゃんとやり切れなかった。

  • 競技終了直前に気づいた不具合

https://github.com/karupanerura/isucon2014-elimination/commit/f4bd9e12c1d17ef1dab601b745c82daed134e504#diff-4f430011a6a953bf6b408bc9906c5478L171

push @user_ids => $row->{login};


$row->{login}...


_人人人人人人人人人_
> idじゃない!! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

TODO

userデータをオンメモリーにした

https://github.com/karupanerura/isucon2014-elimination/commit/2ee1d266ea6f076556e578f17ed6bf4c6b8c60b1

TODO

slack

https://github.com/karupanerura/isucon2014-elimination/issues/5

捗った

TODO

slides.comを使ってみた

App::revealupで作成したslideを公開する時、 今までgithub.ioを使っていたのですが、 reveal.jsで紹介されているslides.comを使ってみました。

Slides – Create and share presentations online

結論

markdownを作ってスライド作るワークフローはほとんど(後述)変えずに
簡単にスライドが用意できて、さらに以下のようなメリットがあったので、
個人的にはもっとslides.com 使いたいなーと思いました!

(スライドの内容はともかく)試しに作成した結果

元々はこんな感じ。-> slide / github

メリット

ヘルプ一覧にはもっと他の機能についての紹介が
簡潔に書いてあって、わかりやすい!
Knowledge Base – Customer Feedback for Slides

やること

markdownで作ったスライドを、slides.comにあげる為にやることは、
大きく一つだけ。

markdownから適当なHTMLファイルを用意してimportするだけ。
importについてはコチラを参照

importするHTMLの用意

  • App::revealupで立ち上げたスライド(0.0.0.0:5000を想定)を、Chrome経由で保存(Cmd+S)*1
  • 画像のパスを絶対パスに変えてあげる
  • data-markdown="" 属性を消す

雑だけど、つまりこんな感じ

Cmd+S
vim 0.0.0.0.html
:%s;./0.0.0.0_files;https://dl.dropboxusercontent.com/u/XXX/img/YYY;gc
:%s;data-markdown="";;g
:cat % | pbcopy
# -> slides.comの編集画面からimport

これを自動化できればもっと楽そう。*2

まとめ

slides.comを使えば、markdownでスライド作るワークフローは殆ど変えずに、
プレゼン面、ソーシャルメディアの面で多くのメリットが得られて、幸せ!

*1:外部ファイルのmarkdownをhtml tagに展開した物が欲しいのでこんなことやってる。展開済みのhtmlを用意できればなんでもいい。展開するときに、画像パスとdata-markdown属性だけ気をつける

*2:slides.comがmarkdownのimportに対応すればもっと楽ではある、、

#gotandapm たのしんできた

Gotanda.pm #2
飲んだり発表したり話を聞いたり飲んだりしてきました1
主催のid:karupaneruraありがとうございました!!!!!

isucon楽しい!!!!ので参加すると良いって気持ちで発表してきました><

gotandapm スライドとmarkdown

コード多めにしてしまったので見づらかった方すいません><

gotandapmはまた12月の開催されるそうで楽しみです!!!

ほんとにあったスキーマの話「ソーシャルゲーム」と題して、YAPCのトーク応募してみた

YAPC::Asiaのトークの応募数が尋常じゃないので、駆け込みブログです><
(YAPC終わった後に、yet another yapcをするしかないんじゃないか?!)

http://yapcasia.org/2014/talk/show/ce6e777e-fb91-11e3-b7e8-e4a96aeab6a4

アプリケーション層でも、コードの規模感が少し大きくなった、
「続・初めてのPerl」くらいなレベル感な話になれば、、いいな、、と思っています。

以下はなんとなく話せればと思う事の断片。

Hello Android

いまさら、、あんどろいどにはろーわーるどしました(え

備忘録です。 MyFirstAppを作成するところまでは手順通りだった。それだけなのにつかれる事態になってしまった><

ant debugでまずはまった

まず、ant がないと怒られる。次で解決

brew update
brew install ant

build.xmlがなくて、buildできない

android update project --name MyFirstApp --target android-19 --path ~/android/workspace/MyFirstApp

apkを端末にインストールできなくてはまった

error: device offline

  • adb devicesしてもでてこない。端末外して、次をしてから、接続し直して解決。
adb kill-server
adb start-server

error: more than one device and emulator

  • 端末を指定して解決
% adb devices
List of devices attached
emulator-5554   offline
XXX      device
% adb -s XXX  install bin/MyFirstApp-debug.apk

とりあえず、はろーあんどろいど

isucon に負けて悔しいので、問題を速く解決するためのパターンを考えてみた

isucon決勝からもうだいぶ日が経ってしまいました、、その間、負けて、id:karupanerura先生に、げきおこされる夢も見ました。

振り返ります。

isuconでスコアを残しているチームは技術力もさることながら、 問題解決能力が高いと思うのです。もの凄く。

近づくにはどうすればいいんだろうと、頭の整理のために、 自分が普段感じている問題解決のパターンを書いてみました。 特にisuconの反省なので、与えられた問題を良い感じに速くするための解決方法寄りだと思います。

パターン


  • 処理*1しない
  • 処理したらメモしておく
  • 処理の下準備をする
  • 処理をまとめる
  • 処理を少なくする

  • 処理を外にお願いする
  • 必要な分だけ、処理する
  • 処理を得意な人にお願いする
  • 処理関係者を減らす

  • 処理するヒトを増やす
  • 処理できるヒトを良くする

  • 仕様を仕様を削る

「isucon知識足りなくて、負けたわー、じゃー、ほげほげ勉強しよう!」っていうんじゃ、 思考停止だと思っています。

また知らない技術領域が出て来ても、 どうにかこうにか対応できるようになりたいなーと思った感じです (知識不足は、ちゃんと補完しなきゃですが、、)

箇条書きで終わりもアレなので、 良い例かは分からないですが、パッと思いつく例を書いてみます。

処理しない

一番、大事なことだと思います。処理しないで、済むなら、処理しない。 やらないですむなら、やらない。

1 + 1

たたきこみ

処理したらメモしておく

今回のisucon決勝なら、画像投稿時、ないし、初回呼び出し時などで、キャッシュをするなど。

どこでキャッシュするか、いつキャッシュするか、メモしたものをどう更新するかは色々ですが、やったことは、またやりたくないというのは(領域が許せば)良い。

処理の下準備をする

indexや、辞書作りなどの学習

処理をまとめる

都度の処理呼び出しコストを減らす。 描画処理を減らすために、DOMに書き出さないなど。

処理を少なくする

処理を無くせはしないけど、少なくすることはできるっていうのはある。 処理内容が減れば、大小あれど、一応嬉しい。

# あるある
$dbh->query() for 1..100

ここから、ちょっと、トレードオフが大きくなりそうな、パターン。

処理を外にお願いする

処理が完了するまで、次の処理が出来ないのはもったいない なので、他の人にお願いしたくなったりすることもある

必要な分だけ処理する

重い処理の割には、意外と使われなくて、事前準備してなくて構わないというのはあるなと。 そしたら、必要になったときに、処理すればよい。

処理を得意な人にお願いする

言語レベルか、機械レベルか、ソフトウェアか、、など。 これで良さそうな判断ができるかどうかは知識量に凄い左右されると思っている。

それでも得意な人にお願いしたいというのは変わらないはず。 使いこなせる武器が多いのは、視点が高くなる。

処理関係者を減らす

全てを一番ベストな人にお願いしても、1000箇所で処理が行われるとしたら、 その処理の受け渡しのコストが目につくかもしれない。

処理するヒトを増やす

  • 1人でやるより、2人で処理出来る方が捗ることもある。
  • スケールアウト

処理できるヒトを良くする

  • スケールアップ

仕様を削る

  • その仕様、、、、その仕様、、い、、るかも、、いや、いら、らないかも、、 っていうのは、バッサバッサ切れればいいね。
  • 難しい処理の方がお金になったりすることもあるから、難しいね。でも無駄なのもあるよね。
  • エンジニアから、一歩踏み出すのも、問題解決する為の一つの手段。

最後に

id:karupanerura先生、id:masasuz先生、牡蠣鍋打ち上げしましょう> <

KAYACさん、LINEさん、isuconありがとうございました!!!!!

*1:仕事に置き換えても面白いかも?

TypeScriptさわるぞー #TODO

jsを大きな規模でもちゃんと動くようにしたいと、のたまったので、 偉い人たちが作ったaltjsを勉強させてもらいます ref http://kfly8.hatenablog.com/entry/2013/11/16/005340

#発火村 中、id:gfx 先生におすすめしてもらったTypeScriptを見てみます><

ぱっと見: # TODO

  • jsのsuperset
  • 見た目はほとんど一緒
  • I/Fに型を添えて分かりやすくしている

導入

% npm install -g typescript
% cat > hello.ts
function hello(s: string) {
  return 'hello ' + s;
}
console.log(hello('typescript'));
^D
% tsc hello.ts
% node hello.ts

grunt-typescrpt

npm install grunt-typescript
https://github.com/kfly8/ts-sample

TypeScriptのドキュメントのメモ

Types

// primitive type. ( number, boolean, string, void, null and undefined and user defined enum types)
function hello(str: string) {
    return 'hello' + str;
}

// function type
function hoge(callback: (result: string) => any ) {
    ...
}

hoge(function(result: string) {
    ...
});

// object type

// * object type literal ( ObjectType,ArrayType,FunctionType and ConstructorType  )
var aaa: () => {
    x: number; y: number;
};

// * object type interface // PerlのMouseTypeみたい
interface Friend {
    name: string;
    birthday?: string; # optional field
}

function add(friend: Friend) {
    var name = friend.name;
}

add({ name: 'taro' });
add({ birthday: '20130101' }); # error, name required
add({ name: 'hanako', birthday: '20130201' });


// Structial Subtypes

interface Point {
    x: number;
    y: nubmer;
}

function getX(p: Point) {
}

Class CPoint {
    x: number;
    y: number;
    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

getX(new CPoint(0,0)); // ok!!
getX({ x: 1, y: 2: z: 3); // ok!! Extra fields ok
getX({ x: 1 ); // ng!! supplied parameter's not Point

Class && Module

class Animal { 
    constructor(public age: number) {
    }
    addAge(amount: number) { 
        this.age += amount; 
        return this.age; 
    } 
}
var Animal = (function () { 
    function Animal() { 
        this.age = 0; 
    } 
    Animal.prototype.addAge = function(amount) { 
        this.age += amount; 
        return this.age; 
    }; 
    return Animal; 
})(); 
module Hoge { 
    var s = "hello"; 
    export function f() { 
        return s; 
    } 
} 

Hoge.f(); 
Hoge.s; // Error, s is not exported // variable 's' is private
var Hoge; 
(function(exports) { 
    var s = "hello"; 
    function f() { 
        return s; 
    } 
    exports.f = f; 
})(Hoge||(Hoge={})); 

declare

declare var document; 
document.title = "Hello"; 

外部モジュール

# File main.ts: 
import log = require("log"); 
log.message("hello"); 

# File log.ts: 
export function message(s: string) { 
    console.log(s); 
} 
# point.ts
export = Point; 
class Point { 
    constructor(public x: number, public y: number) { } 
    static origin = new Point(0, 0); 
} 

# use
import Pt = require("point"); 
var p1 = new Pt(10, 20); 
var p2 = Pt.origin; 

温泉発火村なう

#発火村 !!!!!!!!!!!