ActionScriptを使わないFlash勉強会で話してきた

珍しく、タイトルを聞いた瞬間参加して喋りたくなった勉強会
ActionScriptを使わないFlash勉強会 #1

レベル感とネタかぶりが怖くて、AVMとかTagに関する内容はほとんどさけてネタに走りすぎたかな


参考資料は

http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/index.html

  • Wallaby

http://labs.adobe.com/technologies/wallaby/

  • gordon

https://github.com/tobeytailor/gordon

  • smokescreen

https://github.com/cesmoak/smokescreen


普段はあまり共有する人がいなかったりする内容を存分に楽しめて終止面白かったなー
120%万人受けしないし、今後も女子が参加することは未来永劫内と思うけど、SWFの寿命があるうちにもう一度開催して欲しいな

@yoyaさんの分かりやすさと@niwauuさんのまめフラスコの衝撃の後でハードル上がりすぎて、小便ちびりそうだったのはナイショ

PS. 初SlideShareは余白を取るのに挫折した

githubで公開してるのを一時的に非公開でpushしたい

ちょっと色々あって、githubで公開しているものを修正してすごいもの(?)を作ってるんだけど、まだ諸事情で公開できないので、git pushをずっとしてないプロジェクトがあります。

で、たまたま別件でgithubのUIをつかって仕事関係のプロジェクトも管理したくなって(本当に使いやすいよね!)、privateリポジトリを作るために課金ユーザーになったんです。
そしたら、無性にまだpushしてないプロジェクトを1台のmacbookでしか管理していないことにとてつもない恐怖心を感じて(諸事情でしばらくバックアップも取ってません。。。)、非公開リポジトリで一時的に管理したくなったのでしたよって長い前置きです。


最初は自分のプロジェクトをforkしてprivate設定にしちゃったり、ブランチだけprivateにすれば良いかなと思ったんだけどどうやらできなそう。

そこでこんな感じにしたら簡単だった。


1. githubで新しいprivateリポジトリを作る。
今回はpriv-みたいにした

2. リモートリポジトリを追加

$ git remote add private git@github.com:ken39arg/priv-.git

3. プッシュ

$ git push -u private master


ま、多分当たり前すぎるんだろうけど、ググっても初歩的すぎるのか全然いいのが無かったから結構困った。

再び公開する時はまたoriginに戻してpushすればよさげ

$ git push origine master


svnで困ってなかったけど、git使い始めたら便利だね。

人生損してた

うんこ

昨年の目標を見たらちゃんと元日にかいてたんだなーと気づいた今日この頃。
全力は個人的には出したつもりだけど120%出せたかといえば、もっと出せたんだろうな〜と思う。
結果として仕事の目標は達成できなかったです。

さて、元旦じゃなくなってしまいましたが、目標を残すのはいいことだなーとつくづく思うので、今年も目標を書き残しておきます。


仕事の目標は「一発当てる」です。

もう、当てるまでは走り続けるしかないなあと、去年も一昨年も苦しかったですが、3度目の正直という言葉もあるので、性懲りもなくあてに行きます。

本当は1年半くらいを見越した野望があるのですが、さすがにこう外していると当てるまでは次に進めないので当ててから考えます。

いや、言いたい。
いや、いわない。。。


プライベートはというと、正月休みも土日も全返上してやった最初の仕事がこけてしまい失意の中で自分の自信
を取り戻すためのある目標を立てました。

成功するために肉体的自信を取り戻すためのの5ヵ年計画

2010年---やせる→成功体験から仕事も成功
2011年---オープンウォータースイミングレース出場&腹筋を割る→みなぎる自信→仕事で大成功
2012年---根性系レース(マラソンorトライアスロン)完走→仕事も充実→モテる
2013年---もはやオーラすら出ているが翌年の目標のスタートラインに立つために仕事を死ぬ気でがんばり成功
2014年---ガチアイアンマンレース参戦&完走→もはやレジェンド→不安は一切無いポジティブマンへ

昨年の計画は「やせる」です。
これは見事に達成することが出来ました。
今年は次の元旦までに腹を割ります。

仕事も、きっと今年への布石になっていると思います。


ちなみに、もう一つヤビツ峠を50分以内で上るというとてつもない目標も立てておきます。
55ならいけると思います。
あえて50以下を目指します!!


あと去年立ててた飲むという目標は今年はありませんが、出来るだけ多くの人に合おうと思います。

sfDoctrineMasterSlavePluginを使う時のTips

Symfonyアドベントカレンダー2010には忙しすぎて参加していません(ごめんなさいx2)
Doctrine on symfony1.4でマスタースレーブ | やぐにっきに、ちょっと補足しておくと喜ぶ人がいる気がしますので書いてみます。

その前に

symfonyの情報を沢山提供してくださっている皆様、いつも大変お世話になっております。
ありがとうございます。
来年もどうぞよろしくお願いいたします。

来年こそは心を入れ替えて、僕もお役に立てるといいなと思います。

sfDoctrineMasterSlavePluginについて

さて記事にあるように、symfony1.x + Doctrine1.xなサービスでデータベースをmaster-slave構成で冗長化する場合、sfDoctrineMasterSlavePluginを使うというのはとても良い選択だと思います。

sfDoctrineMasterSlavePluginの素晴らしいと思う点は主にこんな所でしょうか?

  • 複数のslave複数のmasterに対応
  • 導入が容易
  • Queryがmasterに向いているのかslaveに向いているのかlogを見れば一目で分かる

本当に素晴らしいですね。
でも、局所的にバッドノウハウ的なTIPSは必要です。

補足説明させていただきたいのは、明示的にMasterからSELECTする方法についてです。

明示的にMasterからSelectするシチュエーション

記事にもあるようにsfDoctrineMasterSlavePluginは黙っていれば、参照系はmaster、更新系はslaveに振り分けてくれます。
さらにtransactionの中では参照系でもmasterを使ってくれます。

しかし、サービスによってはtransactionの外でもmasterから参照したい時というのはあります。
例えば下記のような状況が考えられます。

1. table lockが多発するためtransactionをあえて使わない
僕の場合、そこそこアクセスのあるソーシャルアプリでは緩い実装をするため、ユーザーが喜ぶ処理から悲しむ処理に向かってTableに更新をかけ、最低限不整合がおこらないレベルでトランザクションをあえて使いません。

2. ユーザーのスコア表示などわずかな遅延も許されない情報を参照したい
MasterSlaveの遅延はありきで考えています。

明示的にMasterからSELECTする方法

前置きがとっても長くなりましたが、Masterを参照するために僕はこのような方法を使っています。

1. Doctrine_Tableを継承したmyDoctrineTableを作る
2. *Table の継承元をmyDoctrineTableに全て変更する。
3. Masterを参照したい時にcreateQuery()の代わりにcreateMasterQuery()を使う

myDoctrineTable

<?php

class myDoctrineTable extends Doctrine_Table
{
    public function insert(array $fields)
    {
        return $this->getMasterConnection()->insert($this, $fields);
    }

    public function update(array $fields, array $identifier)
    {
        return $this->getMasterConnection()->update($this, $fields, $identifier);
    }

    public function delete($identifier)
    {
        return $this->getMasterConnection()->delete($this, $identifier);
    }

    public function replace(array $fields, array $keys)
    {
        return $this->getMasterConnection()->replace($this, $fields, $keys);
    }

    public function getMasterConnection()
    {
      return ProjectConfiguration::getActive()->getMasterConnection($this->getConnection());
    }

    public function getSlaveConnection()
    {
      return ProjectConfiguration::getActive()->getSlaveConnection($this->getConnection());
    }

    public function createMasterQuery($alias = '')
    {
        if ( ! empty($alias)) {
            $alias = ' ' . trim($alias);
        }

        return Doctrine_Query::create($this->getMasterConnection(), 'Doctrine_Query')
            ->from($this->getComponentName() . $alias);
    }
}

その他のメソッドはおまけです。


Doctrineはとても便利ですが、メモリを食い過ぎることと、処理が複雑すぎるという欠点があります。
メモリを食い過ぎるとスワップが発生しやすくなりますし、処理が複雑すぎると泥臭い改造が出来なくなります。

ORMを選択する時は、初期開発コストと運用コストを天秤にかけてじっくりと選択することをおすすめします。

これからはDoctrine2かもしれませんが、相変らずメモリは食うみたいですので開発前には慎重に検討した方が良いかもしれません。

クロージャー

create_functionをつかっちまった。
クソやろーとか言ってごめんなさいごめんなさい。

こんな風に引数渡せるのね。

<?php
class myDoctrineCollection extends Doctrine_Collection
{
    public function sortBy($column, $order = 'asc')
    {
        $sortOrder = (strtolower($order) == 'desc') ? -1 : 1;
        usort($this->data,  function ($a, $b) use ($column, $sortOrder) {
            return strcmp($a->{$column}, $b->{$column}) * $sortOrder;
        });
        return $this;
    }
}

use++

ちなみにこれはsymfony1.4のDoctrineで、Doctrine_Collectionでソートをするための拡張