Hatena::ブログ(Diary)

130単位

2010-05-31

WordPress 日付別アーカイブ一覧をカテゴリー指定可能にするプラグイン

特定カテゴリーの日付別アーカイブ一覧を作成できる既存のプラグインが以下です。

Archives for a category - WordPress plugin

しかし気になる点がいくつかあります。

  • 指定したカテゴリーのみの一覧表示
    • カテゴリーに対応していない(ただし複数指定することで可能)
  • URL正規化のredirect_canonical()を無効化する設定がある
    • 無効化せずにパーマリンク設定しているとうまく動かない
    • 無効化するとURL正規化がされない
  • 2009年3月以降更新されていない

というわけで作ってみました。だいたい仕組みは同じですが以下の点を改善したつもりです。

  • カテゴリーにも対応
  • 極力redirect_canonical()は無効化しない

http://deeeki.sitemix.jp/files/wordpress/archives_by_cat.zip (削除済み)

【追記】同階層のカテゴリーに複数チェックがあると記事数がうまく取得できません。あとで修正版Upします。

【追記】Upしました。 → WordPress 日付別アーカイブ一覧をカテゴリー指定可能にするプラグイン 修正編 - 130単位

コード

<?php
/**
 * カテゴリー指定によるアーカイブ
 */
Class ArchivesByCat
{
    public $cat;//カテゴリーを保持

    /**
     * コンストラクタ
     *  メソッドをフックに追加/削除します
     */
    public function __construct() {
        add_filter('getarchives_where', array($this, 'getarchives_where_by_cat'), 10, 2);
        add_filter('getarchives_join', array($this, 'getarchives_join_by_cat'), 10, 2);
        add_filter('year_link', array($this, 'add_cat_query'));
        add_filter('month_link', array($this, 'add_cat_query'));
        add_filter('day_link', array($this, 'add_cat_query'));

        if ($_REQUEST['cat']) {
            remove_filter('template_redirect', 'redirect_canonical');
        }
    }

    /**
     * wp_get_archives()の記事照会のWHERE句にカテゴリーの条件を加えて返します
     *
     * @param     string    $where    WHERE句
     * @param     array     $args     wp_get_archives()の引数をパースした配列
     * @return    string    WHERE句
     */
    public function getarchives_where_by_cat($where, $args) {
        if (!isset($args['cat'])) {
            $this->cat == null;
            return $where;
        }

        global $wpdb;

        //対象とするカテゴリーの抽出
        $q['cat'] = ''.urldecode($args['cat']).'';
        $q['cat'] = addslashes_gpc($q['cat']);
        $cat_array = preg_split('/[,\s]+/', $q['cat']);
        $q['cat'] = '';
        $req_cats = array();
        foreach ( (array) $cat_array as $cat ) {
            $cat = intval($cat);
            $req_cats[] = $cat;
            $in = ($cat > 0);
            $cat = abs($cat);
            if ( $in ) {
                $q['category__in'][] = $cat;
                $q['category__in'] = array_merge($q['category__in'], get_term_children($cat, 'category'));
            } else {
                $q['category__not_in'][] = $cat;
                $q['category__not_in'] = array_merge($q['category__not_in'], get_term_children($cat, 'category'));
            }
        }
        //リクエストするカテゴリーの文字列
        $this->cat = implode(',', $req_cats);;

        //含めるカテゴリー
        if ( !empty($q['category__in']) ) {
            $whichcat .= " AND abc_tt.taxonomy = 'category' ";
            $include_cats = "'" . implode("', '", $q['category__in']) . "'";
            $whichcat .= " AND abc_tt.term_id IN ($include_cats) ";
        }

        //除外するカテゴリー
        if ( !empty($q['category__not_in']) ) {
            $cat_string = "'" . implode("', '", $q['category__not_in']) . "'";
            $whichcat .= " AND $wpdb->posts.ID NOT IN ( SELECT abc_n_tr.object_id FROM $wpdb->term_relationships AS abc_n_tr INNER JOIN $wpdb->term_taxonomy AS abc_n_tt ON abc_n_tr.term_taxonomy_id = abc_n_tt.term_taxonomy_id WHERE abc_n_tt.taxonomy = 'category' AND abc_n_tt.term_id IN ($cat_string) )";
        }

        return $where . $whichcat;
    }

    /**
     * wp_get_archives()の記事照会のJOIN句に加えて返します
     *
     * @param     string    $join    JOIN句
     * @param     array     $args    wp_get_archives()の引数をパースした配列
     * @return    JOIN句
     */
    public function getarchives_join_by_cat($join, $args) {
        if (!isset($args['cat'])) {
            return $join;
        }

        global $wpdb;

        $join = " INNER JOIN $wpdb->term_relationships AS abc_tr ON ($wpdb->posts.ID = abc_tr.object_id) INNER JOIN $wpdb->term_taxonomy AS abc_tt ON (abc_tr.term_taxonomy_id = abc_tt.term_taxonomy_id) ";
        return $join;
    }

    /**
     * URLにカテゴリーのクエリパラメータを加えて返します
     *
     * @param     string    $url    URL
     * @return    string    URL
     */
    public function add_cat_query($url) {
        if (isset($this->cat)) {
            $url = add_query_arg('cat', $this->cat, $url);
        }
        return $url;
    }
}

$ArchivesByCat = new ArchivesByCat();

処理の流れ

利用準備
ウィジェットなどでの表示
リンククリック後の表示

作っておいて何ですが、catパラメータが付いてURLがきれいではなくなるので、よほどの理由がない限り使う必要はないかもです。あとPHP5でWordPressは新しめのバージョンじゃないと動かないと思います。

*1パラメータにより'year_link'または'day_link'

2010-05-30

ServersMan@VPS(CentOS 5.4) ユーザー作成とSSH初期設定

ServersMan@VPS仮想専用サーバーサービス:ユビキタスプロバイダ DTI 
http://dream.jp/vps/

利用開始まで

申し込み
2010/04/26 02:12
利用開始
2010/05/13 16:21

GW挟みましたが、申し込みから利用開始まで約9営業日でした。んで放置気味でしたがようやく触ることに。

参考リンク

yamakawa.us - VPSサーバ(CentOS 5.4)の初期設定3:SSHサーバログインを公開鍵認証方式に変更 
http://www.yamakawa.us/vpsserver/438.html

こちら非常に参考になりました(というかほぼコピーですが…><)。

SSHログイン

ssh root@xxx.xxx.xxx.xxx

ユーザー作成

useradd user
passwd user

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

rootユーザーへのスイッチ許可

vim /etc/group
wheel::10:root,user
  • wheelグループに追加

鍵作成

su user
ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/user/.ssh/id_rsa):

Created directory '/home/user/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/user/.ssh/id_rsa.

Your public key has been saved in /home/user/.ssh/id_rsa.pub.

鍵の準備

cd /home/user/.ssh/
mv id_rsa.pub authorized_keys
cat id_rsa
exit
  • 公開鍵をSSHの設定と同じ名前に変更
  • 秘密鍵の内容を確認(コピーなどしてメモっておく)
  • rootユーザーに戻る

ssh設定変更

vim /etc/ssh/sshd_config
PermitRootLogin no
AuthorizedKeysFile      .ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no
AllowUsers user

sshd再起動

/etc/init.d/sshd restart
exit

Stopping sshd: [ OK ]

Starting sshd: [ OK ]

  • 再起動したらいったんログアウト

管理用ユーザーでログイン

vim .ssh/serversman.key
chmod go-r .ssh/serversman.key
ssh -i .ssh/serversman.key user@xxx.xxx.xxx.xxx

留意点として、鍵認証にすると相当セキュアなのですが、万一ログインできなくなった場合の逃げ道(問い合わせ先等)を確認しておくこと、とインフラエンジニアさんに教わりました。ページが見つかりませんでした|:ユビキタスプロバイダ DTIによると、ID/パスワード忘れの問い合わせは対応しているものの、サーバ初期化は検討中みたいです。おそらく対応してくれると思われますが、この辺はトレードオフでもあるためどう判断するかでしょうかね。

関連リンク

調べていて見つけたので追記でご紹介。

誰得UNIX-Blog: ServerMan@VPSでのOpenSSH設定 
http://daretoku-unix.blogspot.com/2010/04/servermanvpsopenssh.html

誰得UNIX-Blog: ServersMan@VPSでのiptables設定(state版) 
http://daretoku-unix.blogspot.com/2010/05/serversmanvpsiptablesstate.html

ServersMan@VPS 開通後にやっておくこと - VPS - CentOS5 - ServersMan@VPS - てもぐ 
http://temog.info/archives/vps/serversmanvps-%E9%96%8B%E9%80%9A%E5%BE%8C%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%93%E3%81%A8.html

ServersMan@VPSCentOS 5で最初にする設定 | maeda.log 
http://maeda.farend.ne.jp/blog/2010/04/29/serversman-centos-initial-setup/

iptablesとsudoの設定はやっておいたほうがいいですね。


【関連記事】
さくらレンタルサーバ スタンダードとServersMan@VPS Entryプランの比較 - 130単位

2010-05-27

Ruby on Railsによるソーシャルアプリ開発 #railssemi メモ

Ruby on Railsによるソーシャルアプリ開発 〜twitter公式ハッシュタグ #railssemi : ATND 
http://atnd.org/events/4394

株式会社ミログ 山田さん

ソーシャルアプリ

特徴
  • インバイト(招待)やバイラルを利用した集客が容易
  • SNSでPC/モバイル両方への展開が可能
集客アプローチ
  • アプリ自体の面白さ、コンテンツの充実
    • バイラルにつなげる
  • ソーシャル性を中心にした設計

SNSの特徴

mixi
モバゲータウン
  • ゲーム性重視
  • インバイト効果とともに広告(TOPへの露出)による集客効果が高い
  • ロワイヤル系ゲームはDeNAには好まれない
    • やるなら何らかの工夫が必要
  • 収益手段が豊富
GREE

Railsでの開発

サーバインフラ

Amazon EC2

質疑応答

Railsの良さ
  • Rubyの拡張性が活きる
  • プラットフォームごとの処理にも柔軟に対応
  • フレームワーク自体に手が入れやすい
Railsのパフォーマンスに関して
  • 重いのは確か
  • それよりも開発速度を重視
  • 柔軟性があるため一回作ってみてからでも拡張が容易
  • サーバを増やしたり、キャッシュをうまく利用する

各プラットフォームの特徴や比較の話が聞けたのはためになりました。1アプリでの横展開をベースに、いかに効率良くプラットフォームに特化させるかが鍵であるように思います。

ミログさんはソーシャルアプリの事業部としては20名くらいいるそうで、フレームワーク(Rails)を利用して開発効率性を高めるのはごく自然な判断なのかなーという気がしました。懇親会で話を聞いたりなどして、よりフレームワーク使ってみたい気持ちが高まりました。

お菓子とジュースありがとうございました!

2010-05-26

CentOS5.4にcronインストールと設定

自分用メモです。

yumでのインストール確認

yum list installed | grep cron

crontabs.noarch 1.10-8 installed

cronインストール

yum install -y vixie-cron

(省略)

Installed:

vixie-cron.i386 4:4.1-77.el5_4.1

Complete!

crontabsとvixie-cronの関係性を以前聞いたことがあるのですが忘れてしまいました。

cron起動確認

/etc/init.d/crond status

crond は停止しています

cron起動

/etc/init.d/crond start

crond を起動中: [ OK ]

cronジョブ登録

crontab -e
0 * * * * /tmp/cron.sh

:wだけではダメで、:qしないと登録されないみたいです。

"/tmp/crontab.XXXXXKyJ3h" 2L, 100C written

crontab: installing new crontab


【関連記事】
hetemlで上級者モードのcron設定 - 130単位

2010-05-19

WordPress テーマ作成の参考記事まとめ

テーマの作成にフォーカスして記事を集めてみました。特に「おすすめ」としたリンク先を読んでいただくと、けっこうスムーズに理解が進むのではないかと思います。(※新たに記事見つけ次第、追記していきます)

テーマ作成手順

テーマの構成

※どちらも対象バージョン若干古め

ベースとするテーマ

Ustream

書籍

4839935416
WordPress 3 サイト構築スタイルブック

488337730X
PHPによるWordPressカスタマイズブック―3.x対応

2010-05-18

5月後半開催の気になる勉強会

IT勉強会カレンダーを見ていたら、(個人的に)興味ひかれる内容の勉強会が多数開催されていたので、ちょっとまとめてみることにしました。開催地はほぼ東京です。

5/22(土)

5/25(火)

5/26(水)

5/28(金)

5/29(土)


いくつか参加したいと思いますが、半分近くUstありとか良い時代ですねー。ありがたいものです。

IT 勉強会カレンダー 
https://www.google.com/calendar/embed?src=fvijvohm91uifvd9hratehf65k%40group.calendar.google.com

2010-05-15

#twitter515 (twitterの可能性と未来を真剣に考える。) メモ

#twitter515 : ATND 
http://atnd.org/events/4126

生で津田さんが見られるというのに惹かれてなんとなく参加登録して行ってきました。

会場はWiMAX使えませんでした。3GはつながったのでiPhoneハッシュタグ追いつつMacbookでメモ取ってました。完全ではなく大いに自分のフィルタがかかったメモになりますが、せっかくなので載せてみます。

※そらのさん(@ksorano)のUst録画あわせてどうぞ

twitterはビジネスに役立つか?

@pinahirano インフォテリア 平野さん

  • Twitterの背景はみかん星人
  • Twitterをやるのは楽しいから
    • 楽しいことをやっているときがアウトプットがよくなる
    • ニコニコしながら仕事した方が生産性が上がる
  • 上場企業の社長のTweet数ダントツ1位(約8000)
    • 2位は孫さんで最近伸ばしてきてる
  • 内容の割合は仕事2割、仕事以外8割
  • 連続したTweetはしないで、できるだけ140文字内で情報を発信
  • メールでもブログでもなく、Twitterでお礼するのが丁度いい
  • Twitterで新たなネットワーク、新しい世界の体感
    • 自分がやりたいことを実現できる速さ
    • Twitterのfollowと被followの関係は非対称
    • リアルな世界と似ているのが魅力的
  • 経営者こそはじめよう
    • 会社の顔
    • 責任を取れる
    • 思いを語る
    • 短いフレーズで伝える訓練
    • リスク
  • Twitterをやらないことがリスク
    • 速い動きができる
    • 社内も速いスピードでまわすことができる
    • Twitterをやっていないとスピードについていけなくなる
  • 時間がなくてもすきま時間にやればいい
  • 個人的につぶやきダイエットを実践
    • 毎日リアルな体重を載せており、実際に痩せた
    • 乗るだけでTwitterに投稿できる体重計がある
    • 見える化効用で継続が楽しくなる
  • 世界で一台緑のMacbook

アクシオンの今後について

@yumilcy アクシオン 大山さん

Twitter鼎談あらため5人談

@tsuda 津田さん

@kawazoetsutomu ハマコーツイッタープロデューサー 川添さん

@hkunimitsu gumi 国光さん

@mochihada 芸者東京エンターテインメント 田中さん

@fumy231 ゴーガ 小山さん(モデレータ兼任)

※以下敬称略です。発言内容間違ってたらすいません

あいさつ
  • 川淵:ハマコーのITをすべてプロデュース
  • 川淵:ハマコーさんはスケジュールとギャラの面で合わなかった
  • 国光:2007年ごろに打倒ツイッターミニブログ開発してた
  • 田中:1企業のサービス(Twitter)をみんなやってて、新しいものを作りたい人がでてきてない
    • それに代わるものを作りたい
Twitterどうですか?
  • 津田:未来はそんな考えてない
    • Twitterっぽいリアルタイムウェブを楽しんでる
    • すぐなくなるようなもんでもない
    • なくなったらなくなったで何かでてくるからそれを使う
  • 田中:Twitterがおっさん化してる
    • おっさんはDMでアポイントとろうとする
    • 急速に昔のメール化してる
    • 人ベースに情報を結びつけたようなサービスがでてくる第一歩がTwitter
    • 次おもろいもんどうやってつくれるか
    • メッシが点とったことをみんなと分かち合いたい
    • ニコ生はできるけどTwitterはできてない
    • でもニコ生もいまいち
    • 感情を共有できるようなものをつくりたい
Twitter自身がどうなるか
  • 川淵:政治家は使ったほうがいい
    • 政治家が使い出したらビラと一緒
  • 津田Twitterがおっさん化してるのではなくまったく逆
    • 2010年以降は世代的に上にも下にも広がってる
    • 芸能人が使い始めたのが原因のひとつ
    • 芸能人と簡単につながれるアメブロ的なノリ
    • ぼくらがTLで見てないところで10代や大学生も使ってる
    • コミュニケーションツールは友達がつかうもの
    • 感情の共有インフラTwitterである程度できてる
    • ラジオ番組実況とか、ラジオと相性がいい
    • ハッシュタグで視聴者同士が感情でつながれる
    • 基本DMしか見ない
    • 140文字で要件だけ書いてくれる
  • 田中:言いたいと思ったときに言語化するのがしんどい
  • 田中:メールだと自分を偽れる
    • 他の人の目にさらされてる状況でコミュニケーションとってる
    • オープンにアポとったりできるんで安心できる
  • 津田:オープンなアポの権化がそらのさん
    • 断りづらいし許しやすくもある
  • 国光:新しいから使ってるけど本質的にしんどいのでは?
  • 津田:単なるツールだったらここに180人集まらない
    • 人間の多面性をあらわす
    • 相談事があるときメールだと相手に時間的心理的要求を負担してる
    • Twitterだと独白でかまわない
  • 国光:実際にGoogle使う回数減ってる
    • Googleキーワードをわざわざ入れるアクションをさせる不完全なツール
    • TVなんかは受動的に情報が得られるツール
    • 昔はネットは能動的にやるもの
    • 本来能動的な人間はほとんどいない
    • ネットはアーキテクチャが不完全だったからGoogleみたいな検索があった
    • Twitterでもfollowするってやんないといけない
    • 受動的な方向にいくために進化の余地がある
  • 津田Twitterは今のままでいいのか進化してもいいのか
    • Twitterの大きな機能追加はリストと公式RTのみ
    • Twitter自体は今のままでもいいんじゃないの
    • わかりにくさも含めてなんとなく適当なルールで理解してるのでok
  • 田中:APIは戦略的にやってるというよりくじらをみせないようにやってる
    • めちゃめちゃおもしろいんだけど全然未完成
ハマコーTwitter
  • 川淵:なんで始めたか…年齢的に極端だから
車で使えるようになったらどんな世界があるか?
  • 津田:運転してるあいだはTL音声再生
  • 田中:Twitterで構築したfollowingとfollowerの関係性の移植について
    • スイッチングコスト低い
    • Facebookfoursquareは相互承認でめんどくさい
    • followのみで作って欲しい
Twitter以外のマイクロブログサービス
  • 同じ機能であればユーザー数が多いのが生き残るのでもう勝てない
  • 芸能人も人が多いところでやりたい
  • Twitterが不測の事態でつぶれたときのバックアップ扱い
  • Google BuzzGoogle Appに組み込まれると面白い
  • 社内Twitterのニーズが多い
  • Twitterとの違いといっても、パクリサービスなんで同じです

データで見るTwitter

@kansai_takako ユーザーローカル 閑歳さん

自己紹介
Twitterユーザー分析
  • 2010年1月〜5月でサンプル数143万ユーザー
    • 約150万程度アクティブユーザーがいる
  • StreamingAPIは15分の1くらいの確立でツイートを取得
  • ユーザー登録があった日
  • 地域のネットの利用度
    • ネットの利用度にくらべてどれだけTwitterが利用されてるか
    • 東京とその近郊、大阪京都沖縄が多い
    • 性別
      • 男性63
      • 女性37
  • 文化
    • RT腹筋ブーム
    • 告白RTの掲載許可は全滅orz
Twitterでサービス告知

LT:「mixiアプリをつくろう!OpenSocialで学ぶソーシャルアプリ」のご紹介

@rkanbe スパイスボックス 神部さん

感想

  • 平野さんの「Twitterをやらないことがリスク」というのはなるほどと思った
  • 津田さんの芯の通ったTwitterトークを生で見られたのに感動した
  • オープンで社会性が求められるためコミュニケーションが大人化してるというのが印象に残った
  • 140文字のシンプルさが生み出す力にあらためて気付かされた
  • 閑歳さんがサービスのはてブ数載せて発表してるのがかっこいいと思った
  • 地域ごとのTwitter利用度で九州が割と高かった
  • (地元の)愛知が割と低かったのが若干残念だったり
    • 一般的に保守的といわれてるし自身の肌感からもある種納得
  • イベント中に紹介されたサービスでは顔ツイ!とIS Paradeに興味持った
    • 早速やってみたりした
  • そらのさんのダダ漏れ力(落ちてすぐ復旧とか)すごいと思った
  • @yumilcyさん超面白かった
    • LTのつなぎで何度も会場わかせてた
  • アクシオンさん注目&応援したいです

というわけでTwitterについて新たな発見とかあったりして、参加してよかったです。ありがとうございました!

関連リンク

Togetter - まとめ「5/15 #twitter515 twitterの可能性と未来を真剣に考える(1/5)」 
http://togetter.com/li/21252

2010-05-14

TortoiseSVNで「!svn/vcc/default」とかって出るエラーの対処

ローカル環境で作業していたら、あるときからTortoiseSVNがエラーを吐くようになりました。キャプチャ取ってないので覚えてる限りですが以下のような感じ。【追記】他の人でも同じ現象が起きたのでコピーして差し替えました。【さらに追記】新調したルーターがどうも原因っぽいみたいです(そのチェック処理を外して様子をみています)。

コマンド: http://example.com/repository からチェックアウト、リビジョン HEAD, 再帰的, 外部を含む

エラー: REPORT (URL: '/repository/!svn/vcc/default'): Could not parse response status

エラー: line (http://example.com/)

終了!:

チェックアウトも更新もできなくなってしまいました。正確にいうと、tagsとbranchesの一部のディレクトリ以下で更新を試みると失敗してしまうのです。

で、ググってもあまり情報が出てきません。一番近い状況といえそうなのが以下の記事。

Akt One.  ≫ Blog Archive   ≫ SVN ERROR 
http://spring-aki.com/archives/2006/08/svnerror.html

原因特定

上記記事を参考に。

ということで、ローカル環境(あるいはTortoiseSVN)のみおかしいっぽいことが分かりました。

対処

半ば強引な感じですが。

で、無事正常に動くようになりました。

ついでに、これでうまくいくということは.svnOS環境に依存しないっぽいことが分かりました。間違っていたらスイマセン。


【関連記事】
Subversion Windows上で大量ファイルを扱う際のフリーズ回避法 - 130単位

2010-05-11

ゲームでのエピソードとそのクリア報酬の実装メモ

1:Nの親子関係にあるストーリー:エピソード、および報酬付与についてのメモです。

テーブル

stories(ストーリー)
カラム備考
idPKストーリーID
name ストーリー名
required_story_id 必要ストーリーID
episode_count エピソード数
story_episodes(エピソード)
カラム備考
idPKエピソードID
story_idFKストーリーID
name エピソード名
episode_no エピソード番号
reward_type 報酬種類
reward 報酬
user_stories(ユーザーストーリー)
カラム備考
idPKユーザーストーリーID
user_idFKユーザーID
story_idFKストーリーID
episode_progress エピソード攻略数
reward_progress 報酬取得数
clear_flag ストーリークリアフラグ

仕様

  • 複数のストーリー
  • 1ストーリーに複数のエピソード
  • 全エピソードをクリアしたらストーリークリア
  • ストーリーは順番に実行
  • エピソードは順番に実行
  • エピソードはクリアごとに報酬付与
  • エピソードはクリアしたら再実行不可

画面遷移

  1. ストーリー選択
  2. エピソード選択
  3. エピソード実行
    • 不正防止のためここでクリア判定
  4. エピソード結果
  5. (クリアしたら)エピソード報酬取得
  6. 1.か2.にユーザー任意で戻る
    • アイテム取得時は使用もできる

実装

  • ユーザーのクリア状態の記録
    • 1ストーリーに対しユーザーストーリーが1レコード
    • episode_progressにクリアしたエピソードのepisode_noを入れる
  • 初めてストーリー選択の際に初期化されたユーザーストーリーを1レコード挿入
  • ストーリーの逐次実行
    • ユーザーストーリーからclear_flagが1のストーリーIDを全て取得
    • 対象ストーリーのrequired_story_idが上記に含まれていれば実行可能
    • required_story_idが0なら無条件で実行可能
  • エピソードの逐次実行
    • episode_progressに+1した数値以下のエピソードを表示
    • episode_progressに+1した数値のepisode_noのエピソードを実行可能
  • 報酬
    • reward_typeでアイテムか通貨を判定
    • rewardはアイテムならアイテムID、通貨なら通貨の数量
  • 報酬の取得
    • エピソードクリア判定と報酬取得は別画面
    • reward_progressに報酬取得したエピソードのepisode_noを入れる
    • 誤操作による未取得防止
      • エピソード選択画面でepisode_progressとreward_progressを比較し、同じでなければ強制的に報酬取得画面へ
  • ストーリークリア判定
    • ストーリーのepisode_countとユーザーストーリーのepisode_progressが一致したらclear_flagを1にする

悩んだ点

  • ストーリーとエピソードを1テーブルに最初まとめようとしたけどやめた
  • エピソードクリア判定と報酬付与のタイミングをずらした
    • 画面構成的に、アイテム購入→使用と同じ処理フローにしたかったため
  • クリア状態の管理を1レコードでやるのは無茶だったかもしれない
    • とはいえストーリーとエピソードでそれぞれ関連テーブルができたりするのも嫌だった

どうでしょうかねえ。手作業でデータ定義するのにいろいろ気を配る必要がありますが、正しいデータであれば問題なく動くかと思います。あやしい点などありましたらご指摘お願いします。


【関連記事】
mixiアプリ リリースまでの開発振り返り - 130単位

2010-05-06

型番不明なグラフィックボードのドライバを探してみる

某日会社にて。グラフィックボードがどっかから出てきた&ディスプレイが余ったって状況になって、デュアルディスプレイにしました。が、グラフィックボードが裸だった上にろくに調べもせず装着してしまった後になって、ドライバがないことに気づきました。以下、ドライバを探してインストールするまでの記録です。


【関連記事】
デュアルディスプレイ挑戦記 装着編 - 130単位
デュアルディスプレイ挑戦記 完成編 - 130単位

2010-05-05

mixiアプリ リリースまでの開発振り返り

ここ1ヶ月ほど新規開発のmixiアプリにどっぷり浸かっていました。これから機能追加や改善のフェーズに入っていくわけですが、その前にいったんひとりで振り返ってみます。

やたら細かい話とかまだ試行錯誤段階の話とかでてくるのを最初にお断りしておきます。なので参考なったりはしないと思います、すいません。

プロジェクト概要

やったこと

仕様理解&詰め

  • 企画段階ではとにかく機能が多かった
  • 優先度を決めて必要なもの以外を削る作業

画面洗い出し

画像やデータやゲームロジックの用意のお願い

  • 企画のひとにデータの詳細まで考えてもらった
    • 自分の作業に支障がでないようになるべく先回りして伝えた
    • まずはひとまとまりのサンプルを作って、とか
  • テーブルのカラムに対応したCSVを作成してもらった

DB定義

  • 命名
    • Rails風複数形のテーブル名
    • マスタ系データとトランザクション系データの切り分け
    • ユーザー関連テーブルの名前に統一感がないのがいけてなかった
  • ユーザー関連テーブルにて関連付けるキー
    • ユーザーのテーブルでインクリメントされるIDか、リクエストで取得できるユーザーIDにするかで迷った
    • 今回はユーザーIDに統一した
    • 問い合わせに対し手動でメンテすることを考えると、ユーザーIDから引けるのはいいかもしれない
  • すべてのテーブルに削除フラグと作成日時と更新日時

開発:DB処理

開発:いろいろ

  • 環境設定ファイルを編集することでローカル環境で開発可能にした
  • モデルのインスタンス
  • 複雑なロジックはサービスクラスに切り出した
  • エラー画面の統一
    • 表示文言を渡すだけの簡単な関数を用意した
  • 定数定義
    • 最初はクラス化してconstでやっていた
    • 動的定義できないことを知ってあとからdefineにした

まとめの感想

  • スケジュール見積もりが甘かった
    • 普段から意識していないといけないととにかく反省
    • やったことない内容のプロジェクトでもある程度正確に見積もれるように
  • RedmineSubversionの説明と浸透に時間を要した
    • いちど社内勉強会的なのをやったほうがいいかもしれない
  • 独自フレームワーク作成で勉強にはなった
    • 実装はベストでは決してないしチームでの共有には当然時間がかかると思われる
    • 中途半端な車輪の再発明感はいなめない
  • であれば既成フレームワークでやるのがいいような気がする
    • RailsCakePHPでいいと思う
    • 規約がしっかりしている
      • 従うようにすればチームでコードの共有がしやすくなる
    • ググればある程度のノウハウが出てくる(と思う)
    • ソーシャルアプリ以外の開発でも使えるし応用できる

うーん、あまりまとまってないのでもっと個別にフォーカスするべきだったかなーと。次はCakePHPでやってみたいってことだけは確かです。

2010-05-04

自分語り2010

先日飲みながら話したら予想外に自分自身で発見があったりして、その翌日になんとなくメモしてみて途中で終わって寝かせていて、あらためて見てまあもったいないので晒してみようかと思った次第です*1

仕事でのコミュニケーションについて

  • 社内政治とか飲みュニケーションには興味がないというかできない
  • まずは与えられた仕事を覚えてできるようになって認めてもらう
    • これまでもそうやってきてそれでうまくいっていたと思う
  • 仕事上で必要な上司や同僚とのコミュニケーションは当然ながらする
    • そこで人見知りを意識したことはあまりない

ブログを書く理由

  • 最初は知人への近況報告のため
  • 違う人に同じ話をするのがめんどくさいから
  • 自分は世間一般とは趣向がずれてて会話ではそれを埋めるのがしんどいから
  • 好き勝手書いて興味があれば読んでもらえればよかった
  • 途中から仕事(マンガ喫茶→IT企業のバイト)のことを書くようになった
    • いろいろと新鮮だったからどんどん書けた
    • アウトプットして振り返ることで吸収力は上がったのかもしれない
  • ブログを書いていたらネットの中での外にも目がいくようになった
  • はてなブックマークとかまなめはうすとか見るようになった
  • エンジニアの書くブログに憧れを持った
  • はてなダイアリーで書くようになった
    • ど素人がプログラミング系のネタを書くのには最初はかなり勇気がいったように思う
  • で、現在も書いてるのはこれらの延長だったりする

転職した理由

  • いろいろありまして

東京にきた理由

  • エンジニアもIT系イベントも集まっていると感じたから
  • せっかくなら環境を大きく変えてみようと思ったから
  • 実家暮らしから抜けるいいチャンスと思ったから

東京生活

  • いろいろと効率化された気がする
  • 自分ですべてコントロールできるのがいい
  • 徒歩通勤にしたのは正解だったと思う

節約する理由

  • ある数値の目標のため
  • お金が相応以上に減ることにストレスを感じるから
  • 節約をある意味ゲームとして楽しんでいるのかもしれない

将来めざすもの

  • 漠然とは、まずはひとりの力のみで生活費を稼ぐのが目標
  • それが満たされたら好きなことがやれるようになると思う

*1:話した内容そのままでなくて補足や再構成してます

2010-05-03

4月分の読書記録

あまり読めませんでした。

『お金とつきあう7つの原則』は、これから資産運用してみたい人にも、すでにしていて知識を再確認したい人にも有用な本だと思います。

『まな板の上の鯉、正論を吐く』は、メルマガ購読していないので割と新鮮に読めました。

4月分読書データ

期間 : 2010年04月
読了数 : 7 冊
BIG tomorrow (ビッグ・トゥモロウ) 2010年 06月号 [雑誌]
青春出版社 (2010-04-24)
★★★☆☆ 読了日:2010年4月24日
「新しいことに挑戦したぶんだけ"引き出し"は必ず増える」by岡村さん
G戦場ヘヴンズドア 3 (IKKI COMICS)
日本橋 ヨヲコ / 小学館 (2003-09-30)
★★★★☆ 読了日:2010年4月22日
いろいろな点が線になった。少女ファイトともばっちりつながった
まな板の上の鯉、正論を吐く
堀江 貴文 / 洋泉社 (2010-04-06)
★★★★☆ 読了日:2010年4月18日
「無償の愛に甘えず、自分の能力で勝負。人間関係も常に開拓」「世の中は常に移り変わる、だから変化を恐れてはいけない」
私のマネ-黄金哲学
日経マネー / 日経BP出版センター (2010-04-09)
★★★☆☆ 読了日:2010年4月17日
「お金にこだわりすぎないほうがお金に恵まれる」「ビジネスのあらゆる過程を人任せにしない」「ときには意味なく友達におごってみる」
G戦場ヘヴンズドア 2 (IKKI COMICS)
日本橋 ヨヲコ / 小学館 (2003-03)
★★★☆☆ 読了日:2010年4月16日
深く複雑に。目を描かないことの効果を垣間見た
G戦場ヘヴンズドア 1 (IKKI COMICS)
日本橋 ヨヲコ / 小学館 (2003-03)
★★★☆☆ 読了日:2010年4月9日
少女ファイトより粗い感じだけど、似たもの同士を主役に据えた設定が面白い
お金とつきあう7つの原則
★★★★☆ 読了日:2010年4月4日
投資金額あたりのリスクを有利に低減できるのは投資対象の分散だけ」「怖いのは金融商品よりも『人間』」


メディアマーカー

3月分の読書記録 - 130単位

4月分の読書記録 - 130単位 (※一年前)