Hatena::ブログ(Diary)

130単位

2010-07-31

CakePHP1.3 モデルキャッシュビヘイビア

上の記事にてキャッシュビヘイビアのソースコードが公開されていて、下の記事にておすすめの使い方が解説されています。

が、CakePHP1.3ではうまく動作しませんでした。

動かない原因

<?php
Cache::write($cachekey, $ret, $expire);

CakePHPコアのCacheクラスのメソッド定義では「function write($key, $value, $config = null)」となっており、本来キャッシュコンフィグ名が入るところにキャッシュ有効期間を入れてしまっています。

改良版ソースコード

元のコードをベースに必要部分のみ改変させていただいてます。

<?php
class CacheBehavior extends ModelBehavior {
    var $enabled = true;

    function setup(&$model, $config = array()) {}
    /**
     * メソッドキャッシュ
     */
    function cacheMethod(&$model, $method, $args = array(), $expire = null, $config = null){
        $this->enabled = false;
        // キャッシュキー
        $cachekey = get_class($model) . '_' . $method . '_' . $expire . '_' . md5(serialize($args));

        $ret = Cache::read($cachekey);
        if(!empty($ret)){
            $this->enabled = true;
            return $ret;
        }
        $ret = call_user_func_array(array($model, $method), $args);
        $this->enabled = true;
        if (is_int($expire)) {
            Cache::set('duration', $expire);
        }
        Cache::write($cachekey, $ret, $config);
        // クリア用にモデル毎のキャッシュキーリストを作成
        $cacheListKey = get_class($model) . '_cacheMethodList';
        $list = Cache::read($cacheListKey);
        $list[$cachekey] = 1;
        Cache::write($cacheListKey, $list);
        return $ret;
    }
    /**
     * 再帰防止判定用
     */
    function cacheEnabled(&$model){
        return $this->enabled;
    }
    /**
     * キャッシュクリア
     */
    function cacheDelete(&$model){
        $cacheListKey = get_class($model) . '_cacheMethodList';
        $list = Cache::read($cacheListKey);
        if(empty($list)) return;
        foreach($list as $key => $tmp){
            Cache::delete($key);
        }
        Cache::delete($cacheListKey);
    }
    /**
     * 追加・変更・削除時にはキャッシュをクリア
     */
    function afterSave(&$model, $created) {
        $this->cacheDelete($model);
    }
    function afterDelete(&$model) {
        $this->cacheDelete($model);
    }
}
使い方

app/models/behaviors/以下に上記コードのcache.phpを配置

config/core.phpにてキャッシュを有効化(durationなどは必要に応じて設定)

<?php
Cache::config('default', array('engine' => 'File'));

モデルのfindメソッドに適用する場合

<?php
class XxxModel extends AppModel {
    var $actsAs = array('Cache');

    function find($type, $queryData = array()){
        $args = array($type, $queryData);
        if ($this->Behaviors->attached('Cache')) {
            if ($this->cacheEnabled()) {
                return $this->cacheMethod(__FUNCTION__, $args);
            }
        }
        $parent = get_parent_class($this);
        return call_user_func_array(array($parent, __FUNCTION__), $args);
    }
}

変更点解説

  • cacheMethodメソッドの$expireをオプション扱いの第三引数にした
    • $expireがなければデフォルトの有効期間を適用
    • 呼び出し側で有効期間を書く必要をなくした
  • $expire指定時はその有効期間を適用
    • Cacheクラスの仕様により1回write()後にデフォルトの有効期間にリセットされる
  • cacheMethodメソッドの第四引数として$configを持たせた
  • リクエスト内キャッシュ処理削除
    • あまり使わないかと思ったので

キャッシュキーに$expireを入れるかとかis_int($expire)で判定していいものかとか悩んだりしたのですが、何かお気づきの点などありましたらコメントいただけますと幸いです。

2010-07-28

DeNA流エンジニア主導ソーシャルアプリ開発秘話 #sac2010 メモ

DeNAエンジニア主導ソーシャルアプリ開発秘話 : ATND 
http://atnd.org/events/4857

Social Application Seminar on USTREAM
http://www.ustream.tv/channel/social-application-seminar

アジェンダ

内製ソーシャルアプリの開発について

体制
  • 基本的に2人チーム
  • エンジニア1人(システム全般)
  • 企画1人(その他業務)
なぜ少人数か
  • 個人の裁量を大きくする
    • 責任を持って取り組める
  • 考えながら作る
  • コミュニケーションを取りやすくする
  • 意思決定を早くする
    • 無駄な会議はしない
開発プロセス
  • スケジュール
    • 1タイトル3ヶ月が目安
  • エンジニア主導
    • 考えながら作り、作りながら考える
    • 作っては壊して、壊しては作る
    • 手を動かすことを優先し、ドキュメントは最低限
  • 作りながら考える?
    • 実装し始めてから見えてくる問題を発見できる
    • イメージではなく、実際のプレイ感覚をつかめる
    • フィードバックが具体的になる
  • イメージしていたものと出来上がったあとのものとのギャップが少なくなる
開発の注意点
  • シンプルさ
    • いろいろ考えながら作ると複雑になってくる
  • 定期的に立ち戻って整理する
    • リセットする
    • 最低限の機能に整理する
  • 特にゲーム性や操作性は重要
    • 伝えたい部分を明確にする
  • 最初の10分で面白さを伝える
内製ソーシャルアプリの開発環境
MobaSiF
  • とにかく「薄く」シンプル
  • 非常に高速
    • 必要なところはC言語で実装
    • 数十億PV/dayの実績
  • サービス指向
    • エンジニアの好みにカスタマイズがしやすい
    • サービスを早く作ることが目的
  • その他
  • MobaSiF Tips
  • Template::Toolkitも利用可能
    • View部分の置き換えによる実現可能
    • 絵文字処理はEncode::JP::Mobileを使うことも可能
  • Template処理部分のみをCPAN
内製ソーシャルアプリFlash Liteについて
  • 制約
  • 基本Flash Lite1.1で合わせる
    • 端末による出し分けを考慮する
    • 余裕があればFlash Lite2.0やFlash Lite3.0を使う手段もある
  • 容量が100KBまで(もっと少ない機種がある)
  • シンボルのネストは7段階まで
    • 素材製作時に出来る限り階層化しない
    • FirefoxのSimulatorでは表示されるので嵌りやすい
Flash Liteの利用
  • DeNAではming利用
  • メリット
  • デメリット
    • 既存のSWFファイルを扱いにくい
    • 特に画像周りの置換処理など
  • 独自改修によってデメリットを解消
    • Flash Lite用に改修
    • 既存SWFファイルのシンボル置換処理
開発についてフリートーク
  • オープンプラットフォームのWAFはPlack
  • DBMagazine 8月号ぜひ読んでください
リリース後の運用について
  • リリース直後から大量のトラフィック
  • 数日後に1億PV/dayを超えることもある
  • トラフィック増加に柔軟に対応できる負荷対策が重要
  • リリース時システム構成例
    • Fire Wall
    • Load Balancer
    • Web Server x3
    • Master DB (update insert delete select for update)
    • Backup DB (replication)
    • Slave DB x2 (replication, select)

負荷対策

  • 基本的にDB処理周りがボトルネック
  • 画像処理などでアプリケーション側がネックになることもあるが
  • 大抵の場合WebServerは台数を増やすことでスケールアウト可能
  • DB Masterの負荷が肝
負荷対策(事前)
  • アプリケーション実装時に最低限以下を行う
  • SQLを無駄に発行していないかチェック
    • ループの中で1件ずつSQLを発行しない
  • SQLのJOINは極力使わない
    • テーブル分割する際の弊害になる
  • EXPLAINによるSQLチェック
    • filesort, temporaryは厳禁
    • rowsが多すぎないか確認
  • 不要なindexが無いかチェック
    • 使っていないindexでも存在するだけで更新時に負荷になる
  • memcached対応(最低限)
監視について
負荷対策事例
  • データベースの分割
  • テーブル分割
    • テーブル単位でDBを分ける方法
    • ex)更新負荷の高いテーブルを別DBに移動する
  • Shard分割
    • テーブル内のIDごとにDBを分ける方法
    • ex)更新負荷が多すぎたり、容量が大きすぎるテーブルに対して分割する
  • キュー処理化
    • リアルタイム性が必要のない更新を別スレッドで行う
  • SSD導入
    • 負荷の高いスレーブサーバに導入
  • SSDの導入
    • 更新不可が高いマスタDBのスレーブなどに導入
    • I/O性能が格段に向上し、レプリケーション遅延などが解消
    • 実績として1万qps程度さばけている
運用についてフリートーク

まとめ

質疑応答

  • MobaSiFの利用事例
    • あんまりないかも
    • フジイさんは個人サービスで使ってる
  • ゲームチューニングに充てる時間
    • リリース直前の落としこむ部分が大変
    • グループにいるメンバーなど巻き込んでプレイして設計
    • 3ヶ月のうち実際の開発期間は1ヶ月くらい
  • 負荷試験
    • テーブル決まった段階で構造レビュー
    • リリース直前にabテスト
    • DeNAエンジニアは中のつくりをみればどれくらい耐えられるかわかる
    • クローズドベータでテスト
    • 実際に遊んでもらったデータでRRDToolsによる確認

シンプルな設計かつ、作りながら考えるというのには非常に共感しました。現状できているとはいえないですが目指したいところです。また企画1人エンジニア1人で進めるにはエンジニアが多くをカバーしないといけないはずで、それをするためにもActionScriptは覚えないとなーと強く思ったりしました。

懇親会にてフジイさんよりソーシャル性を盛り込む具体案などアドバイスいただきました。感謝です。

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


【関連記事】
Ruby on Railsによるソーシャルアプリ開発 #railssemi メモ - 130単位

2010-07-24

WordPress 投稿記事のスラッグを変更しても旧URLでアクセスできる仕組み

Q. 投稿記事のスラッグを変更したら旧URLでアクセスできる?

(ex.http://example.com/過去のスラッグ/ → http://example.com/new-slug/)

A. できます

ってのを調べてみました。(※ WordPress 3.0)

過去のスラッグを記録する仕組み

  • 投稿記事の編集完了時に動作
  • 編集後と編集前のスラッグを比較
  • 変更されていればメタ情報(隠しカスタムフィールド)として_wp_old_slugキーに編集前のスラッグを登録
アクションフック

wp-includes/default-filters.php

<?php
add_action( 'post_updated',      'wp_check_for_changed_slugs', 12, 3 );
アクション関数

wp-includes/post.php

<?php
function wp_check_for_changed_slugs($post_id, $post, $post_before) {
	// dont bother if it hasnt changed
	if ( $post->post_name == $post_before->post_name )
		return;

	// we're only concerned with published posts
	if ( $post->post_status != 'publish' || $post->post_type != 'post' )
		return;

	$old_slugs = (array) get_post_meta($post_id, '_wp_old_slug');

	// if we haven't added this old slug before, add it now
	if ( !in_array($post_before->post_name, $old_slugs) )
		add_post_meta($post_id, '_wp_old_slug', $post_before->post_name);

	// if the new slug was used previously, delete it from the list
	if ( in_array($post->post_name, $old_slugs) )
		delete_post_meta($post_id, '_wp_old_slug', $post->post_name);
}

過去のスラッグからリダイレクトする仕組み

  • 表示の際のテンプレート決定時に動作
  • 404かつリクエストされたURLにスラッグが認識された場合
  • メタ情報_wp_old_slug(過去のスラッグ)とリクエストされたスラッグが一致する記事を照会
  • 存在すればその記事のURLリダイレクト
アクションフック

wp-includes/default-filters.php

<?php
// Redirect Old Slugs
add_action( 'template_redirect', 'wp_old_slug_redirect'              );
アクション関数

wp-includes/query.php

<?php
function wp_old_slug_redirect() {
	global $wp_query;
	if ( is_404() && '' != $wp_query->query_vars['name'] ) :
		global $wpdb;

		$query = "SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND meta_key = '_wp_old_slug' AND meta_value='" . $wp_query->query_vars['name'] . "'";

		// if year, monthnum, or day have been specified, make our query more precise
		// just in case there are multiple identical _wp_old_slug values
		if ( '' != $wp_query->query_vars['year'] )
			$query .= " AND YEAR(post_date) = '{$wp_query->query_vars['year']}'";
		if ( '' != $wp_query->query_vars['monthnum'] )
			$query .= " AND MONTH(post_date) = '{$wp_query->query_vars['monthnum']}'";
		if ( '' != $wp_query->query_vars['day'] )
			$query .= " AND DAYOFMONTH(post_date) = '{$wp_query->query_vars['day']}'";

		$id = (int) $wpdb->get_var($query);

		if ( !$id )
			return;

		$link = get_permalink($id);

		if ( !$link )
			return;

		wp_redirect($link, '301'); // Permanent redirect
		exit;
	endif;
}

留意点

レアケースですが、別の投稿記事で過去のスラッグが同じものが存在した場合は、先に過去のスラッグが登録された記事のほうに優先してリダイレクトされます。

何にせよ余計な処理が入り込んでしまうので、基本的には一度公開されたURL(スラッグ)は変更しないほうがいいと思います。

関連リンク

パーマリンクの変更後、旧アドレスでもアクセスできるWordPressプラグイン | コリス 
http://coliss.com/articles/blog/wordpress/plugin/wordpress-plugin-permalink-edirect.html

カスタムフィールドに表示されないメタ情報の作り方  |  wpxtreme 
http://wpxtreme.jp/meta-key-and-value-hidden-on-custom-fields

2010-07-22

ソーシャルアプリ CakePHP調査メモ

mixiアプリ リリースまでの開発振り返り - 130単位

5月頭のこの記事でジャッジしておいて今さらっていうスピード感が情けないですが、調査してみたことをいったんまとめてみます。Cakeは素人なので間違っているかもしれません。※CakePHP1.3.2です。

DBスキーマ

ユーザーのキーの持ち方
  • 例:ユーザーが保持するアイテム
  • 多対多(hasAndBelongsToMany)
  • CakePHPでは中間テーブルに主キー以外を指定することは無理っぽい
    • foreignKeyで指定できるのはあくまで中間テーブルのカラム名にすぎないみたい
  • インクリメントのIDを主キーにしつつ別カラムのユーザー識別子*1を外部キーにはできない
対応策2種類
  • インクリメントのIDで関連付け
    • 規約に添える
    • ユーザーIDから関連テーブルを直接参照できない
    • 2種類のIDの取り扱いが難しいかもしれない
    • ユーザー退会→再度新規登録のとき、ユーザーのレコード削除でよい
  • プラットフォームのユーザーIDを主キー
    • AUTO INCREMENTなしで規約から少し外れる
    • IDが統一されてわかりやすい
    • ユーザー退会→再度新規登録のとき、全ての関連テーブルを削除しないといけない
    • OpenSocialの仕様ではユーザーIDが文字列もありえるので微妙かも

前者のパターンを採用しようとしてますが、ユーザーの友達のIDのキャッシュのさせ方とか悩ましいです。

ベンチマーク

フレームワークXdebug (Cumulative time)ab -n 100 -c 100 (Requests per second)
独自FW35ms136.61 [#/sec]
CakePHP295ms34.45 [#/sec]

やはりフレームワークはパフォーマンス落ちるんだなーという印象です。ただ開発効率や共有のしやすさも重要だと思いますので、うまく折り合いをつけていきたいです。

参考リンク

cakephp、パフォーマンスチューニングメモ » pblo 
http://playispeace.com/blog/534/cakephp_performance

*1:プラットフォームのユーザーID

2010-07-20

MySQL mysqldump+αでExcelで読めるCSV出力

MySQLからCSV出力したいって要件なんですが、Excelで読むには文字コードがShift-JISである必要があります。これを全てLinuxで行う手順です。

エクスポート手順

データベースの全テーブルをCSVエクスポート
mysqldump -u root -p --tab=/tmp --fields-terminated-by=, --fields-optionally-enclosed-by=\" --lines-terminated-by="\r\n" database
  • --tabは出力ファイルの保存先ディレクトリ
  • --fields-terminated-by はフィールド区切りの指定
  • --fields-optionally-enclosed-by は文字列の囲み指定
  • --lines-terminated-by は改行の指定
  • DB内の全テーブルに対し、拡張子.sqlのテーブル定義ファイルと拡張子.txtの中身はCSVファイルが出力される
ファイル拡張子変換
for file in *.txt; do mv $file ${file%.txt}.csv; done
文字コード変換
nkf -sLw --overwrite *.csv

参考リンク

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump ― データベースバックアッププログラム 
http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html

【 複数のファイルの拡張子を一括変更する 】 - Linuxコマンド逆引き大全:ITpro 
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231055/nkf文字コードを変換する - Linuxコマンド集:ITpro 
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230849/

文字コード変換コマンドnkfの使い方まとめ linux - Knowledge Database IT 
http://it.kndb.jp/entry/show/id/744

おまけ

以下ではうまくいきませんでした。

mysql -u root -p
SET NAMES SJIS;
USE database;
SELECT * INTO OUTFILE '/tmp/data.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "\r\n" FROM table;
  • 文字コードUTF-8CSVファイルが出力される
  • 「SET CHARACTER SET SJIS;」でもダメ
  • 「SET NAMES cp932;」でもダメ

サーバー文字コードが原因のような気がしますが、わかる方おしえてください><

*1:mysqldumpと重複するため無くても可

2010-07-17

6月分の読書記録

普段に増して技術書読んだ気がしますが、もっと読まないととも思います。

『モテキ』面白かったです。濃密な全四巻でした。始まったばかりのドラマも注目したいです。

『mixiアプリ開発&運用コンプリートブック 』は、出版済みのソーシャルアプリ関連3冊の中では一番読み応えがあったように思います。SAP数社の具体的な開発/運用事例が参考になります。

6月分読書データ

期間 : 2010年06月
読了数 : 15 冊
mixiアプリ開発&運用コンプリートブック -ユーザをつかむソーシャルアプリのつくり方!育て方!
★★★★☆ 読了日:2010年6月27日
主にPC向け。いくつかの実績あるアプリの具体的な設計/運用が参考になる。『うまレーシング』の素PHPRoRの移行事例が印象深い
WordPress ポケットリファレンス
アクシー株式会社 , 西本 達也 / 技術評論社 (2010-06-19)
★★★☆☆ 読了日:2010年6月26日
実現したいことで引けるページ構成。3.0には対応していないが一通り理解するのには良さげ
Software Design (ソフトウェア デザイン) 2010年 07月号 [雑誌]
★★★☆☆ 読了日:2010年6月20日
ソーシャルアプリ開発入門より「成長から成功体験へ、軸となる成長は多すぎないほうがいい」「memcache→DBから再構築できるデータ、TokyoTyrant→一時的だが多量のデータ」
PHPで作る携帯サイトデベロッパーズガイド
滝下 真玄 / 秀和システム (2009-12)
★★★☆☆ 読了日:2010年6月17日
CakePHPの一通りの説明と公開/管理サイトのサンプルコードが載っていてわかりやすい
ウェブ時代5つの定理
★★★★☆ 読了日:2010年6月13日
好きな人と働く、お互いの尊敬と共通の目標の認識、マネジメント重視でなく行動重視、ファクトベースの意思決定
投資信託主義    ――時間と資産の正しい法則 (角川oneテーマ21 C 146)
★★★☆☆ 読了日:2010年6月12日
「リターンのないリスクは、ない」「時間、労力、資力も含めて、まずは自分自身に投資をし、自分自身の成長を最大化できる状態にすることが重要」
バガボンド 33
井上 雄彦 / 講談社 (2010-05-27)
★★★☆☆ 読了日:2010年6月12日
音を絶った状態の描写が印象的
ONE PIECE (58)
尾田 栄一郎 / 集英社 (2010-06-04)
★★★★☆ 読了日:2010年6月12日
ルフィvsガープに高鳴った。開放されてからの急展開が意表すぎる
モテキ (4) (イブニングKC)
久保 ミツロウ / 講談社 (2010-05-21)
★★★★☆ 読了日:2010年6月7日
「誰かに必要とされなくても他人と関わっていく力を持ち始める事が大事」
モテキ(03)
久保 ミツロウ / 講談社 (2010-01-22)
★★★★☆ 読了日:2010年6月7日
「友達の延長線上に恋愛があるんじゃない 恋愛の動脈が切れてる保証があるから友達になれるんだ」
20歳のときに知っておきたかったこと スタンフォード大学集中講義
ティナ・シーリグ / 阪急コミュニケーションズ (2010-03-10)
★★★☆☆ 読了日:2010年6月6日
「自分に対する期待、周りからの期待を裏切ってルールを破る」「世の中のために勇気を持って『異質のこと』をする」
図解一目でわかる最適資産運用法 2011年度版―株、投信、債権、外貨…etcプロがやさしく教えるはじめの一歩
SBIグループ / 高橋書店 (2010-06-05)
★★★☆☆ 読了日:2010年6月6日
グローバル投資、環境分野に注目、外貨で運用する「外貨建てMMF
エビアンワンダーREACT 2
おがき ちか / 一迅社 (2006-12-25)
★★★★☆ 読了日:2010年6月5日
ラストへの構成読み応えあり。そして再読してみたいと思える
エビアンワンダーREACT 1
おがき ちか / 一迅社 (2004-12-25)
★★★★☆ 読了日:2010年6月5日
ハウリィの純粋さいいですね
本・雑誌
おがき ちか / 少年画報社 (2002-11-29)
★★★☆☆ 読了日:2010年6月4日
そういうオチですかー

メディアマーカー

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

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

2010-07-12

CakePHP1.3でSQLite3

つくったばかりのサービス*1を機能拡張しようと思い立ち、MySQLでもよかったのですがなんとなくSQLiteを使ってみたくなったのでした。

PHPモジュールの確認 (Windows開発環境)

2009年にダウンロードしたPleiades All In Oneパッケージ*2同梱のXAMPPでは「extension=php_pdo_sqlite.dll」がデフォルトコメントアウトされていました。

  • xampp/php/php.iniを編集
  • 以下3行が有効ならokと思う
extension=php_pdo.dll
extension=php_pdo_sqlite.dll
extension=php_sqlite.dll
  • phpinfo()で確認

f:id:deeeki:20100712002847j:image

CakePHPにSQLite3用DBOの導入

SQLite3でデータベース作成

Mac(OS 10.6)ではデフォルトで入っているみたいで、ターミナルからコマンド実行できました。Windowsでは公式サイト(SQLite Home Page)からダウンロード/インストールしてPATHを通せばいけるみたいです。

sqlite3 ./db.sqlite
sqlite>CREATE TABLE `Users` (`id` INTEGER NOT NULL PRIMARY KEY, `name` TEXT, `created`, TEXT, `modified`, TEXT);

CakePHPデータベース設定

app/config/database.phpを編集(※db.sqliteをapp/database/以下に置いた場合)

<?php
class DATABASE_CONFIG {
	var $default = array(
		'driver' => 'sqlite3',
		'persistent' => false,
		'host' => '',
		'login' => '',
		'password' => '',
		'database' => '../database/db.sqlite',
		'prefix' => '',
		'encoding' => 'UTF-8',
	);
}

利用準備

Model

app/models/user.php

<?php
class User extends AppModel {
	var $name = 'User';
	var $displayField = 'name';
}
Controller
<?php
var $uses = array('User');

これでControllerからfind()やらsave()やら使えます。

その他メモ

*1http://feed-gate.com/

*2:バージョンの確認方法がわかりません><

2010-07-11

フィード検索Webサービス FeedGateをつくってみた

自分がほしかったサービスを自分でつくってみました。

no title

f:id:deeeki:20100711005015j:image

入力したキーワードから、関連するフィード(RSS)を表示したりフィードリーダー登録を補助したりするサービスです。用途としては、何か特定のキーワードについて調べたいというときに使うことを想定しています。さらに最新情報をウォッチしたいってなったときには、リンクからフィードリーダーに簡単に登録することができます。

使い方

1. キーワードを入力して検索します

f:id:deeeki:20100711005014j:image


2. フィードを提供しているページへのリンクとそのフィードが表示されます

f:id:deeeki:20100711005013j:image

対応しているのは以下5種類です。


3. メインのリンクは各ページに飛びます

f:id:deeeki:20100711005012j:image

f:id:deeeki:20100711005010j:image

f:id:deeeki:20100711005009j:image


4. 「フィードURL」のリンクはフィードそのものです

f:id:deeeki:20100711005011j:image

Firefoxでの表示


5. 各フィードリーダーのバナーからフィードの登録ができます

f:id:deeeki:20100711005008j:image

f:id:deeeki:20100711005007j:image

対応しているのは以下3種類です。


以上、機能はシンプルなものです。

コード的にも全く難しいものではないのですが、勉強もかねてCakePHPでつくってみました。デザインに関してはなんというか勢いで突っ走ってしまいました。すいません。

使ってみていただけたら幸いです。

2010-07-10

Google Chrome開発版で拡張機能を同期

修理から戻ってきたMacbookで行ったついでの手順メモです(※Mac向け開発版 バージョン6.0.458.1 dev)。

f:id:deeeki:20100710193523j:image

キャプチャはMacですが、WindowsLinuxでも同様の手順で問題ないと思います。

拡張機能の中でUserScriptは同期されないため、各PC個別にインストールする必要があります。


【関連記事】
利用中のGoogle Chrome拡張機能 2010年7月 - 130単位

2010-07-04

利用中のGoogle Chrome拡張機能 2010年7月

f:id:deeeki:20100704224354j:image

no title

上記により、私用PC(Win/Mac)のChromeおよび会社PCのChromeと3つに分散してしまっていた拡張機能がめでたく同期できるようになりました(※ただしChromeを開発版にする必要あり)。というわけで取捨選択もかねて拡張機能の整理をしてみたので、以下そのメモです。

有効にした拡張機能

計12個

  • AutoPatchWork
    • 次ページ自動挿入
    • 最近実装された挿入時のエフェクトがいい感じです

無効にした拡張機能

計17個

  • AutoAutoPagerize
    • 次ページ自動挿入
    • AutoPatchWorkとの違いが把握できてないですが、好きなほうを入れるといいと思います
  • SmoothScroll
    • スクロールをスムーズに
    • 早く移動したいときなど場合によっては通常スクロールのほうが良かったりする
  • Taberareloo
    • Tumblrなどへのpostを便利に
    • 個人的にはあまり使わないので不要
  • VerticalTabs
    • 縦型タブ表示
    • 常に表示ならまだしもクリックが必要なのであまり使えない印象

おまけ:UserScript (Greasemonkey)

計4個

現状ではUserScriptsは自動同期されないようなので、手動で各PCにインストールする必要があるっぽいです。

2010-07-03

Macbook 初バックアップ

まだ購入半年にも満たないMacbookのモニタが調子悪いです。サポートセンターに電話したら「初期化すると解消されるかも」というアドバイス。修理は1年の保証期間内なら無料とのことですが、せっかくの機会なので初期化してみることに。んでその前に一応バックアップをということで、やったことのメモです。地味に苦戦しました。

で、いまココというわけです。初の初期化に進んでみたいと思います。

2010-07-01

2010年上半期 アクセスの多かった記事

2010/1/1〜2010/6/30のGoogle Analyticsによる集計結果です。

アクセス数TOP20

  1. デュアルディスプレイ 異なる壁紙を設定 (※NVIDIA) - 130単位
  2. Google 日本語入力に顔文字登録 - 130単位
  3. iPhone 3GS アドレス帳の移行 - 130単位
  4. iPhone 無料のTwitterクライアントを6種類試してみた - 130単位
  5. wmaからmp3へ変換するフリーソフト - 130単位
  6. PostgreSQL CSVファイルからのインポート - 130単位
  7. WM3300R購入&WiMAX利用開始 - 130単位
  8. Thunderbird3.0でLightningナイトリービルドを利用 - 130単位
  9. PHP ファイル名の文字列から拡張子を取得する - 130単位
  10. VMware Server 仮想マシンのコピー手順 - 130単位
  11. PostgreSQL COALESCEでNULLを空白に変換 - 130単位
  12. WindowsXP再インストール挑戦記 SP1→SP3編 - 130単位
  13. jQuery getJSON()でセレクトボックスの項目を動的生成 - 130単位
  14. Linux 固定IPの設定とポートの開放手順 - 130単位
  15. EASEUS Partition Managerを使ってみた - 130単位
  16. PHPExcel xlsファイルのデータを読み込む - 130単位
  17. iPhone 3GS 契約後にMy Softbankで変更手続き - 130単位
  18. widthとheightの読み方 - 130単位
  19. PHPExcel テンプレートを用いた書き込み&書式の設定 - 130単位
  20. Eclipse(PDT+Subversive)によるPHP開発環境構築 - 130単位

記事の比率は2008:2009(上):2009(下):2010で5:10:4:1でした。2010年に入ってから記事数自体が減りましたが、以前に比べ価値の低い記事しか書けていないといえるかもしれません。逆にいうと、過去のものであってもそれなりに評価されているであろう記事は高い結果で維持し続けるということでしょうか。

検索キーワードTOP10

検索キーワードのランキングです。リンク先はGoogle検索結果です。

  1. google:wm3300r
  2. google:デュアルディスプレイ 壁紙
  3. google:google 日本語入力 顔文字
  4. google:wma mp3 変換 フリーソフト 日本語
  5. google:デュアルモニタ 壁紙
  6. google:easeus partition manager
  7. google:php 拡張子 取得
  8. google:iphone アドレス帳
  9. google:width 読み方
  10. google:iphone アドレス帳 移行

WiMAXモバイルルーターの「WM3300R」が1位でした。購入検討の際のお役に立っていれば幸いです。


なお、2009年下半期からのセッション数は+6.31%、ページビュー数は+4.63%でした。それ以前に比べるとだいぶ鈍化してきてはいるのですが、右肩上がりで続けていけるよう更新していきたいと思います。


【関連記事】
2009年下半期 アクセスの多かった記事 - 130単位
2009年上半期 アクセスの多かった記事 - 130単位