Hatena::ブログ(Diary)

130単位

2010-12-29

WordPress マルチサイト プログラムでデータ更新

マルチサイトの構成でブログが最初から10個以上とかある場合、全ブログの設定を変更してまわるのは面倒な作業です。そこで、プログラムで一気に設定変更する一例を載せてみます。

全ユーザーのデータ更新

<?php
require_once('wp-load.php');
require_once(ABSPATH . WPINC . '/registration.php');

$users = $wpdb->get_results("SELECT * FROM wp_users");
foreach ($users as $user) {
    //ユーザーのデータ取得
    $user = get_userdata($user->ID);

    //ニックネームと表示名変更
    $user->nickname = 'nickname';
    $user->display_name = 'display_name';

    //ユーザー基本情報更新
    wp_update_user(get_object_vars($user));

    //ユーザー付属情報更新
    update_user_meta($user->ID, 'meta_key', 'meta_value');
}

ブログのデータ更新

<?php
require_once('wp-load.php');

$sites = $wpdb->get_results("SELECT * FROM wp_blogs");
foreach ($sites as $site) {
    //対象のブログに切り替え
    switch_to_blog($site->blog_id);

    //最初の記事削除
    $wpdb->query("UPDATE {$wpdb->posts} SET post_status = 'trash' WHERE ID = 1");

    //管理者メールアドレス変更
    update_option('admin_email', 'mail@example.com');

    //カテゴリー追加
    wp_insert_term('add_category_name', 'category');

    //元のブログに戻す
    restore_current_blog();
}

上記をWordPressのルートに配置してアクセスするか実行すればokです。ユーザーやブログのIDをキーにした配列を用意しておいて、ループ内で使うといいと思います。設定が済んだらファイルは消しましょう。

※WordPress3.0.3で検証

4883377377
WordPress関数リファレンスガイド

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


【関連記事】
WordPress クイック編集で投稿ユーザーが変更されるのを防ぐ - 130単位
Wordpress Peter's Collaboration E-mailsをマルチサイトで動かす - 130単位
WordPress Ajaxで翻訳がうまくいかない原因と対処 - 130単位

2010-12-28

WordPress クイック編集で投稿ユーザーが変更されるのを防ぐ

マルチサイトで以下のような構成とします。

  • メインブログ
    • 特権管理者ユーザーのみ
  • サブブログ
    • 寄稿者ユーザーのみ
    • 特権管理者ユーザーは追加しない

この構成だと、以下のような問題が起きます。

  • 寄稿者がレビュー待ちで投稿
  • 特権管理者がクイック編集で記事のステータスを変更
  • 記事の投稿ユーザーが自動的に特権管理者に変更される
  • 寄稿者が編集できなくなる

ちなみに通常の編集では問題は起きません。

これを解決する方法のひとつは、サブブログにも特権管理者ユーザーを追加することです。しかしサブブログの数が多かったりすると手間ですし、ブログ追加の度にユーザーも追加しなければいけません。

そこでもうひとつの方法。記事一覧(のクイック編集)を出力している部分を変更します。

wp-admin/includes/template.php L933

<?php
//if ( $authors && count( $authors ) > 1 ) :
if ( $authors ) :

投稿できるユーザーが1人でもセレクトボックスを表示させるようにします。これでクイック編集で更新しても投稿ユーザーはそのままになります。

ただし本体のカスタマイズになるので注意が必要です。また検証はWordPress3.0.3ですが、3.1ではコードががらっと変わっているっぽいです。


4797360887
WordPressスーパーカスタマイズ 3.0対応 ポテンシャルを100%引き出すテクニック


【関連記事】
Wordpress Peter's Collaboration E-mailsをマルチサイトで動かす - 130単位
WordPress Ajaxで翻訳がうまくいかない原因と対処 - 130単位
WordPress 条件により翻訳テキスト切り替え - 130単位

2010-12-27

Wordpress Peter's Collaboration E-mailsをマルチサイトで動かす

WordPress › Peter's Collaboration E-mails « WordPress Plugins
http://wordpress.org/extend/plugins/peters-collaboration-e-mails/

投稿記事の承認ワークフローを可能にするプラグインです。具体的には、

  • レビュー待ちとして記事が投稿された
  • レビュー待ちの記事が公開された
  • レビュー待ちの記事が下書きに戻された

このような動作をしたときにユーザーへのメール通知が可能になります。プラグイン内の言語ファイルによりデフォルトで日本語に対応しています。

ただしマルチサイトに対応していないため、少しプラグインのコードをいじります。

ファイル編集

peters-collaboration-e-mails/peters_collaboration_emails.php L60-75

<?php
global $pce_db_group;
// Name of the database table that will hold group information and moderator rules
//$pce_db_group = $wpdb->prefix . 'collaboration';
$pce_db_group = 'wp_collaboration';

global $pce_db_collab;
// Name of the database table that will hold group - collaborator associations
//$pce_db_collab = $wpdb->prefix . 'collabwriters';
$pce_db_collab = 'wp_collabwriters';

global $pce_db_cats;
// Name of the database table that will hold category-specific moderators
// This table is no longer used, but defined here for upgrading and uninstalling purposes
//$pce_db_cats = $wpdb->prefix . 'collabcats';
$pce_db_cats = 'wp_collabcats';

global $pce_db_collabrules;
// Name of the database table that will hold post-type-specific moderators
//$pce_db_collabrules = $wpdb->prefix . 'collabrules';
$pce_db_collabrules = 'wp_collabrules';

プラグイン専用のテーブルが作成されるわけですが、常にメインブログのテーブルを対象にするように修正します。wp-config.phpの$table_prefixの値です。

マルチサイト対応

先の編集内容を踏まえ、"メインブログ"上にてプラグインを"ネットワークで有効化"します。これで全てのブログ承認ワークフローが利用できます。

※WordPress3.0.3、Peter's Collaboration E-mails1.5.0で検証


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

4839936072
基本からしっかりわかる WordPress 3カスタマイズブック (Web Designing Books)


【関連記事】
WordPress Ajaxで翻訳がうまくいかない原因と対処 - 130単位
WordPress 条件により翻訳テキスト切り替え - 130単位

2010-12-26

WordPress Ajaxで翻訳がうまくいかない原因と対処

現象

例えばダッシュボードの新規投稿画面で、ステータスを変更した際にボタンの表示内容が英語表記になる、みたいなことがあったりします。

f:id:deeeki:20101226171854j:image

JavaScriptのソースを確認すると以下のようになっており、翻訳が効いていません。

var postL10n = {
    tagsUsed: "Tags used on this post:",
    add: "Add",

WordPressインストール直後は、こうはなりません。おそらくは有効化したプラグインのうちどれかの影響である可能性が高いです。

原因

翻訳のための言語ファイルは、以下で読み込まれています。

wp-settings.php L241

<?php
load_default_textdomain();

WordPressにはSingletonJavaScriptの管理用クラスがあり、翻訳内容はその中で定義されています。

翻訳定義している部分

wp-includes/script-loader.php L49

<?php
function wp_default_scripts( &$scripts ) {
        //...
        $scripts->localize( 'post', 'postL10n', array(
            'tagsUsed' =>  __('Tags used on this post:'),
            'add' => esc_attr(__('Add')),
        //...
}
翻訳定義をフックしている部分

wp-includes/script-loader.php L743

<?php
add_action( 'wp_default_scripts', 'wp_default_scripts' );
フックを実行している部分

wp-includes/class.wp-scripts.php L34

<?php
class WP_Scripts extends WP_Dependencies {
    function __construct() {
        do_action_ref_array( 'wp_default_scripts', array(&$this) );
    }
}

つまり、WP_Scriptsがインスタンス化されるタイミングが鍵です。これがload_default_textdomain()より前に処理されてしまうと、翻訳されないままJavaScriptが出力されます。

ではインスタンス化がどこでされるかというと、おおむね下記の関数です。

  • wp-includes/functions.wp-scripts.php
    • wp_print_scripts()
    • wp_register_script()
    • wp_localize_script()
    • wp_deregister_script()
    • wp_enqueue_script()
    • wp_script_is()

よって、load_default_textdomain()よりも前に上記関数が呼ばれていると翻訳がうまくいかなくなります。

対処

自分の経験としては、プラグインの中で直でwp_enqueue_script()を呼んでいたものがありました。

<?php
wp_enqueue_script("jquery");

これを、load_default_textdomain()よりも後にするため、'init'にフックさせるように書き換えます。

<?php
add_action('init', create_function('', 'wp_enqueue_script("jquery");'));

これでload_default_textdomain()の後にWP_Scriptsがインスタンス化され、Ajaxでも翻訳されたテキストが有効になります。

var postL10n = {
    tagsUsed: "この投稿で使われるタグ:",
    add: "追加",

対処(非推奨)

導入プラグインが多かったり原因を探すのが面倒な場合は、以下のようにすると手っ取り早いです。ただしWordPress本体のカスタマイズになるので、アップデート時に注意が必要です。

wp-settings.php

<?php
// Load the l18n library.
require( ABSPATH . WPINC . '/l10n.php' );//このすぐ下にload_default_textdomain()を移動
load_default_textdomain();

※WordPress3.0.3で検証


4883377377
WordPress関数リファレンスガイド

B004F0LNP2
Web Designing (ウェブデザイニング) 2011年 01月号 [雑誌]


【関連記事】
WordPress 条件により翻訳テキスト切り替え - 130単位

2010-12-25

WordPress 条件により翻訳テキスト切り替え

やりたいこと

  • (特権)管理者のときだけ、テキストの表示「下書き」を「差し戻し」にする
  • 投稿者は「下書き」のまま

実現方法

  • プラグインをつくり、2通りある部分の言語ファイルを動的に読み込ませるようにする
  • 検証:WordPress 3.0.3 マルチサイト環境

ファイル構成

plugins/
└── myplugin/
    ├── admin-ja.mo
    └── myplugin.php

言語ファイル

admin-ja.po

msgid "Draft"
msgstr "差し戻し"

msgid "Save Draft"
msgstr "投稿者に差し戻し"
  • WordPress日本語版のja.poをコピーして別名保存
  • 必要な部分だけ残してテキスト編集
  • Poedit等でmoファイルを作成

プラグインのコード

<?php
add_action('plugins_loaded', 'load_admin_textdomain');
function load_admin_textdomain() {
    if (is_super_admin()) {
        load_textdomain('default', plugin_dir_path(__FILE__) . '/admin-ja.mo');
    }
}
  • 特権管理者であれば自前の言語ファイル読み込み
  • 'plugins_loaded'にフック
    • プラグイン読み込みとデフォルトの翻訳読み込みload_default_textdomain()の間で処理
    • load_textdomain()のみならプラグインに直接書いてもいい
    • is_super_admin()を使うためにwp-includes/pluggable.phpより後に処理
  • msgidが重複した場合は先に読み込まれたものが優先される模様
    • しっかりソース追えてないですが結果そうなってた
  • テーマのfunctions.phpではできないと思われる
    • functions.phpの読み込みはload_default_textdomain()より後にあるため

そんなわけで、wp-settings.phpの処理手順をしっかり把握してないと難しいカスタマイズでした。もっといい方法ありましたらご教示ください!

4797360887
WordPressスーパーカスタマイズ 3.0対応 ポテンシャルを100%引き出すテクニック

4839936072
基本からしっかりわかる WordPress 3カスタマイズブック (Web Designing Books)

2010-12-24

WiMAX WM3500Rへ乗り換えを検討

WM3300R購入&WiMAX利用開始 - 130単位

約1年前の引越しを機に始まった、WiMAX&WM3300Rでのインターネット生活。速度は全く問題なく、必要なときにはモバイルルーターとして持ち運びもできて、非常に快適でした。

そんな中、同じNECから先月発売されたばかりのWM3500Rに注目しています。

B004BVQUDK
日本電気 モバイルWiMAXルータ AtermWM3500R プラチナブラック PA-WM3500R(AT)B

WM3300Rよりも薄く、バッテリーが4倍の8時間持つとのこと。本体の色は白/黒/赤の3種類です。

キャンペーン

で調べてみたら、BIGLOBEのキャンペーンでの契約が最もお得なようでした。

新規契約で「BIGLOBE WiMAX Flat 年間パスポート」の場合が以下です。

端末代金
0円
初期登録費用
0円
月額費用
210円(初月) / 3,801円(2ヶ月目以降)
特典
WM3500R専用クレードル or モンハン3rd

MVNOは別契約だと普通に端末代で20000円近くになりますから、非常に魅力的な内容となっています。1年縛りはつきますが、現状契約しているWiMAX Flatと比較しても月々約600円お得になります。

乗り換えのタイミング

自分の場合はBIGLOBEからBIGLOBEになるのですが、その乗り換え手順について調べてみました。

  • 契約中のモバイル回線を解約しないと新たに契約できない
  • 解約は即日可能だが、日割り料金は適用されない
  • 解約後に新たに契約できるのは翌日以降

よって、

  • 月末に契約中の回線を解約する
  • 翌月月初にキャンペーンを利用して新規契約する

という手順が良さそうです。つなぎの期間はTry WiMAXで乗り切るという荒業もありかもしれません。

そんなわけで、この12月末で実行に移す確率はかなり高そうな感じです。(※ブログ等で不具合の報告もあったりするようですが、12月末のファームウェアアップデートで改善されるのを期待しています)

Twitterログ

【関連記事】
Try WiMAXを体験してみた - 130単位

2010-12-21

rsyncのモジュールとシンボリックリンクの注意点

稼動実績のある設定ファイルを流用しながら別環境を構築していて、rsyncで嵌ったのでメモ。

rsyncモジュールシンボリックリンクの挙動について理解していなかったのが原因なわけですが、試行錯誤した順に説明してみます。

モジュール

rsync -az remote_host::/full/path/to/src /tmp/dest

とかくと

ERROR: The remote path must start with a module name not a /

といわれる。最初この意味がよくわからず。

rsync -az remote_host:/full/path/to/src /tmp/dest

コロンを1つ抜いてみると

ssh: connect to host remote_host port 22: Connection timed out

SSHとして解釈されるようで、ポートが空いてないので不可。

#rsync option [転送元ホスト]:[:モジュール名][パス] [転送先パス]
rsync -az remote_host::module/path/to/src /tmp/dest

こういう意味だった。モジュール名は/etc/rsyncd.confで設定されたもの。

シンボリックリンク

モジュールを正しく記述して

rsync -az remote_host::module/path/to/src /tmp/dest

としてもうまくいかない。srcシンボリックリンク自体がコピーされてしまう。

rsync --rptgoDz remote_host::module/path/to/src /tmp/dest

シンボリックリンクに関する-lオプションを抜いてみると

skipping non-regular file "src"

といわれる。

根本的に間違っていて、

rsync -az remote_host::module/path/to/src/ /tmp/dest

転送元パスはスラッシュで終える必要があった。

わかったこと

参考リンク

2010-12-20

@deeekiのふぁぼり2010

上記にインスパイアされて、自分でもやってみました。

ふぁぼり30選

2010年1月-12月で約50あったのですが、そこからさらに絞ってみました。自分の使い方としてネタ的なTweetReTweetにまわしてしまうので、まじめなのが蓄積されてる感じになってます。

関連リンク

そのほかはこちらでみられます。


余談ですが、自分のふぁぼられを見返したらリンクの紹介ばかりでした>< 自分の言葉でふぁぼられるのを目標にしたいです。

2010-12-13

WordPressでWebサイト制作ふりかえり

環境と体制

  • 専用サーバー
  • 本番環境と開発環境が同居
  • 静的ページ中心で約40ページ
  • 投稿を動的表示データのストアとして利用
  • テーマのデザイン/コーディングはコーダーさん
  • 運用中の本番反映もコーダーさん
  • サーバー環境構築と機能開発は自分

ふりかえり

ページ作成
  • テンプレート割り当て
  • コンテンツ
  • ヘッダー
    • 不本意ながらもページ毎に記述
      • スタイルの関係でページ種別により上位のセレクタを可変にしたいため
    • body_class()でのレイアウト判別はせず
      • ページIDによる判別しかできないため可読性が低い
      • そもそもPHPを理解していないと扱いづらそう
    • 逆にファイルのみでtitle,description,keywordのメンテが可能に
  • サイドバー
    • sidebar-[name].phpでファイル作成
    • get_sidebar([name])でページ種別に合わせて読み込み
  • フッター
  • カスタムメニュー
    • 画像のメニューでもあったため利用せず
    • 頻繁にコンテンツが入れ替わるなら利用してもよいかも
  • 留意点
    • search,category,tag,authorというスラッグは1階層目には使えない
      • WordPressで予約されている文字列であるため
      • 1階層のみのページであれば問題ない
    • 別階層での同じページ名は使えない
      • 例えば/test/result/と/check/result/の同居は不可
      • サイト全体でスラッグがユニークである必要があるため
導入したプラグイン
  • Custom Field Gui Utility
    • カスタムフィールド拡張
  • Secure WordPress
  • WP Multibyte Patch
    • 日本語対応
  • オリジナル
    • リビジョン/自動投稿の制御、環境同期
試したプラグイン
  • W3 Total Cache
    • 確かに読み込み速くなりそう
    • 開発中に利用するとキャッシュが悪影響
    • 環境同期と相性わるい
    • 英語表記も重なって、システム慣れていないと利用難しい
  • CSV Importer
    • 複数ページの一括登録に有用
    • CSV読み込み箇所を日本語対応すれば使えなくはない

感想とまとめ

  • 動的生成コンテンツを含むならWordPressでサイト制作は悪くない選択
  • きれいなURLになるメリットもある
    • 設計時にスラッグの制約を考慮してURLの最下層はユニークにしておく
  • body_class()でIDでなくスラッグ出力してくれるといいと思う
  • 効率的に開発/運用するならPHPサーバーの知識は必須
    • それが難しい体制であればある程度の妥協も必要
    • 編集の対象をファイル中心にした判断はよかったかも
  • 環境同期プラグインは運用コストが下がったと思われるので作ってよかった

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

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


【関連記事】
WordPress サイト制作フロー 簡易まとめ - 130単位
条件付きでWordPressの環境同期できるプラグインを作ってみた - 130単位

2010-12-10

FacebookのニュースフィードをTwitterに投稿

Twitterに投稿したものをFacebookにも投稿、というのはよく見かけるんですが、その逆をやってみたいと思いました。しかしどうやら簡単ではないようで。

  • ググっても全然情報でてこないのでおそらく普通にはできない
  • ファンページの更新の連携ならできるらしい
  • クローズな空間からオープンな空間へなのでそもそも仕組み的に難しそう
  • ニュースフィードRSSはない
  • ニュースフィードJSONならある

というわけでまわりくどいですが、JSONからRSS作成してTwitterfeedで投稿する方法をとることにしました。

コード

<?php
require_once('XML/Serializer.php');

$statuses = json_decode(file_get_contents('http://graph.facebook.com/deeeki/feed'));

if (!$statuses) {
    exit;
}

foreach ($statuses->data as $status) {
    if (isset($status->application)) {
        continue;
    }

    $items[] = array(
        'title'       => $status->message,
        'link'        => 'http://www.facebook.com/deeeki/posts/' . array_pop(explode('_', $status->id)),
        'description' => $status->message,
        'pubDate'     => $datetime = date('D, d M Y H:i:s T', strtotime($status->created_time)),
    );
}

$options = array(
    'indent' => '  ',
    'linebreak' => "\n",
    'typeHints' => false,
    'addDecl' => true,
    'encoding' => 'UTF-8',
    'rootName' => 'rdf:RDF',
    'rootAttributes' => array('version' => '0.91'),
    'defaultTagName' => 'item',
);

$data['channel'] = array(
    'title' => 'deeeki\'s Facebook statuses',
    'link'  => 'http://www.facebook.com/deeeki',
    'items' => $items,
);

$serializer = new XML_Serializer($options);

if ($serializer->serialize($data)) {
    header('Content-type: text/xml');
    echo $serializer->getSerializedData();
}
  • JSONへアクセスするにはhttp://graph.facebook.com/[uid]/feed
  • 外部アプリによる投稿はスキップ
    • 外部アプリにて両方に投稿してる場合が多いので

f:id:deeeki:20101212004450j:image

あとは公開サーバーに置いて、RSSURLをTwitterfeedに読み込ませれば連携完了です。

twitterfeed.com : feed your blog to twitter
http://twitterfeed.com/ 

4774144371
パーフェクトPHP (PERFECT SERIES 3)

4478015147
Facebookをビジネスに使う本

【関連記事】
PHPでYouTube APIの利用とXMLからのデータ抽出 - 130単位

*1http://www.facebook.com/notifications.php

*2:1つ試したがうまく動かなかった

*3プライバシー設定が影響してると思われる

2010-12-06

パスワード管理をID Managerから1Passwordに乗り換えた

ID Manager

2年ほどこちらのソフトを利用してきました。

ID・パスワード管理ツール ID Manager
http://www.woodensoldier.info/soft/idm.htm 

f:id:deeeki:20101207015132j:image

1Password

有料ソフトではあるのですが、キャンペーンだかなにかで知人にプレゼントしてもらったのが使い始めたきっかけです。

1Password
http://agilewebsolutions.com/products/1Password 

Win

f:id:deeeki:20101207015131j:image

Mac

f:id:deeeki:20101207015130j:image

なんといってもWin/Mac/モバイルのマルチデバイス対応が大きな魅力です*1。あとビジュアルも良いです。

データの移行

  • ID Manager起動
  • ファイル > データのエクスポート > CSVファイルへの書き込み
  • 1Password(Win版)起動
  • File > Import でCSVファイル指定
  • カラムの対応を指定してOK

f:id:deeeki:20101207015129j:image

f:id:deeeki:20101207015128j:image

そんなわけでまだ使い始めではありますが、今後マルチデバイスで大いに活用できそうです。


【関連記事】
パスワード管理まとめ - 130単位

*1Windowsはβ版

2010-12-04

Mac OS XでLithiumとMongoDBを試してみた

Lithium: the most rad php framework
http://lithify.me/

最近いろいろ試してみてばかりですが、Lithium触ってみました。CakePHPから派生してPHP5.3に対応した次世代のフレームワークといわれていたりします。

試した環境

MongoDBインストール

no title

sudo port install mongodb
mkdir -p /data/db

MongoDB PHP拡張インストール

PECL :: Package :: mongo

sudo pecl install mongo-1.0.10
  • 12/4時点で最新stable(11/5リリース)の1.0.11を入れてはいけない
    • persistentがどうのこうの的な接続できない例外が発生する
      • 「pass in an identifying string to get a persistent connection」
    • 既にインストールしてしまったら sudo pecl uninstall mongo
    • 参考:no title
  • /etc/php.ini編集
extension=mongo.so

Lithiumセットアップ

no title

<VirtualHost *:80>
    ServerName lithium.local
    DocumentRoot "/path/to/lithium/app/webroot"
    <Directory "/path/to/lithium/app/webroot">
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !favicon.ico$
        RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </Directory>
</VirtualHost>
  • .htaccessもあるので<Directory>ディレクティブは下記でもよい
Options +FollowSymLinks
AllowOverride FileInfo #またはAll
  • hostsファイル編集
127.0.0.1 lithium.local
  • ブラウザでlithium.localが確認できる

Blogチュートリアル

no title

  • resouces以下を書き込み可に
sudo chmod -R 0777 /path/to/lithium/app/resources/

f:id:deeeki:20101205033842j:image

http://lithium.local/posts/

f:id:deeeki:20101205033841j:image

http://lithium.local/posts/add

f:id:deeeki:20101205033840j:image

感想

関連リンク

no title

*1Lithium独自ショートオープンタグが効かなくなる

2010-12-01

11月分の読書記録

マンガも含めて10冊いきました。

パーフェクトPHP』と『初めてのRuby』、偶然にもPHPRubyの似通った趣向の*1技術書を読んだことになりました。どちらも良書だと思います。

11月分読書データ

期間 : 2010年11月
読了数 : 10 冊
初めてのRuby
★★★★☆ 読了日:2010年11月28日
時折挟まれる主観的な解説が面白く、リラックスしなが学べた。ページ量も読みやすく丁度良い
ONE PIECE GREEN (ジャンプコミックス)
尾田 栄一郎 / 集英社 (2010-11-04)
★★★★☆ 読了日:2010年11月28日
よいまとめ。懐かしさとともに歴史を感じる
ドラゴンクエスト列伝 ロトの紋章 〜紋章を継ぐ者達へ〜 (11)
★★★☆☆ 読了日:2010年11月28日
もうすこしはやくすすんでほしい
君がオヤジになる前に
堀江 貴文 / 徳間書店 (2010-10-29)
★★★★☆ 読了日:2010年11月26日
「情報を所持するということは、未来を見ること」「専門の知識に、こういう考え方はどう?と提案できる、素人の発想があればいい」
15分あれば喫茶店に入りなさい。
齋藤 孝 / 幻冬舎 (2010-09)
★★★☆☆ 読了日:2010年11月26日
仕事の引き継ぎを喫茶店でやるのは面白いアイデア。要は時間をどう効率的に使うかという内容
パーフェクトPHP
小川 雄大 , 柄沢 聡太郎 / 技術評論社 (2010-11-12)
★★★★☆ 読了日:2010年11月26日
テーマ別に余すところなく深く解説。攻撃手法とその対策が網羅されたセキュリティの章が一番ためになった
お金は週末に殖やしなさい
★★★★☆ 読了日:2010年11月13日
「ホームカントリーバイアスを取り除く」「どこでも、いつでも暮らせる準備」
WordPress 3 サイト構築スタイルブック
エ・ビスコム・テック・ラボ / 毎日コミュニケーションズ (2010-09-11)
★★★★☆ 読了日:2010年11月12日
サイトの種類ごとのテーマ構築手順がわかりやすい。カスタムメニューやbody_class()の使い方など細かい部分にも詳しい
NARUTOナルト(53)(ジャンプコミックス)
岸本 斉史 / 集英社 (2010-11-04)
★★★★☆ 読了日:2010年11月9日
親子二代にわたる九尾との闘い見応えあり
ONE PIECE 60 (ジャンプコミックス)
尾田 栄一郎 / 集英社 (2010-11-04)
★★★★☆ 読了日:2010年11月5日
失ったものの回想から残ったものへの気づきの展開がよい。仲間との再会、各キャラの再登場に期待が高まる

メディアマーカー

10月分の読書記録 - 130単位 (一ヶ月前)

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

*1:対象読者的な意味で