はてなブックマークやTwitterと連携するブログがだいぶ増えてきました。
wordpressなど独自でカスタマイズする必要のあるブログの場合、プラグインなどを利用すれば可能かもしれませんが、連携に手間取ったりすることもあるかと思います。
そんな方にzenback。
公式サイトからの引用ですが、zenbackとそのメリットについて載せておきます。
- その記事に関係する自分のブログ記事
- その記事に関係する他のzenbackユーザーのブログ記事
- その記事についての最新のTwitterのつぶやき
- その記事についてのはてなブックマーク
- その記事の最新のアクセス元(リファラ)
- 昔書いた古い記事を、もっと多くの人に読んでほしい
- せっかくブログを作ったので、読者を増やしたい
- 他のブログの記事を紹介して、アクセスを流してあげたい
- 自分のブログについての、Twitterやはてなブックマーク、他ブログからの反応を簡単に知りたい
- 記事へのフィードバックは欲しいけど、荒れたくはない
関連リンクなどは記事を書いた本人も同じ趣向の人の記事を読めて非常に良いです。
関連記事などは、プラグインを使っても中途半端なものになったりといまいちだったりするので、どれくらいの精度なのか楽しみにしています。
wordpressの場合は、独自でテンプレートを編集することができるので、非常に楽です。
zenbackから取得したjavascriptコードをテーマのsingle.phpの下記の記事内容を出力している後に追記してあげるだけで表示されると思います。
< ?php the_content(); ?>
私は、2、3日前に申し込んで今日の夕方に提供開始メールが来たので今から申し込んでもそんなに時間はかからないと思うので、ちょっと使ってみたいという方はどうですか?
Tags: zenback
Controllerなどで下記のように記述するとデバッグ用に変数の内容などを出力してくれます。
$this->output->enable_profiler(true);
デフォルトだと、下記の情報が表示されるようです。
今回は省略しますが、プロファイラ用のホックなんかを使っておくと便利です。
追記:2010-07-20
大したプログラムではないですけど、残しておきます。
< ?php /** * プロファイラ用ホック * @author Tatsuya Fukata * */ class XC_ProfilerHook { /** CIインスタンス */ private $CI; /** * コンストラクタ */ public function __construct(){ $this->CI =& get_instance(); } public function enable_profiler() { $this->CI->output->enable_profiler($this->CI->config->item('hook_enable_profiler')); } } ?>
で、設定ファイルに下記を追加します。
//プロファイラホックの有効化 $config['hook_enable_profiler'] = true;
さらに、hooks.phpに下記も追加します。
//プロファイラ用ホック $hook['post_controller_constructor'][] = array( 'class' => 'XC_ProfilerHook', 'function' => 'enable_profiler', 'filename' => 'XC_ProfilerHook.php', 'filepath' => 'hooks', );
これで、ローカルや、開発環境ではプロファイラを有効にしておいて、テスト環境や本番で一括でプロファイラの設定を切り替えることができます。
で、本題のPHP標準のSession機構を使用するCI_Session拡張のコードです。
前回の記事でCI_Sessionの拡張について書いたついでにCI_Sessionの持つ、ユーザデータの内容も出力するようにしてみました。
< ?php /** * デフォルトのプロファイラ結果にCI_Sessionの持つ、ユーザデータを追加する * * @author Tatsuya Fukata * */ class XC_Profiler extends CI_Profiler { public function __construct() { parent::__construct(); } public function run() { $output = "<div id='codeigniter_profiler' style='clear:both;background-color:#fff;padding:10px;'>"; // XXX スーパクラスのprivateメソッドのため、個別定義 $output .= $this->_compile_uri_string(); $output .= $this->_compile_controller_info(); $output .= $this->_compile_memory_usage(); $output .= $this->_compile_benchmarks(); $output .= $this->_compile_get(); $output .= $this->_compile_post(); $output .= $this->_compile_queries(); $output .= $this->_compile_session(); $output .= ''; return $output; } /** * ユーザデータ情報を返す。 * @return String */ protected function _compile_session() { if (!isset($this->CI->session) || !is_subclass_of($this->CI->session, 'CI_Session')) { return ''; } $output = "\n\n"; $output .= '<fieldset style="border:1px solid #FF3535;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; $output .= "\n"; $output .= '<legend style="color:#FF3535;"> '.$this->CI->lang->line('profiler_session').' </legend>'; $output .= "\n"; $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n"; $session = $this->CI->session->all_userdata(); if (empty($session) || count($session)==0) { $output .= "<tr><td width='100%' style='color:#FF3535;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_session')."</td></tr>\n"; } else { foreach ($session as $key => $val) { $output .= "<tr><td width='100%' style='color:#FF3535;font-weight:normal;background-color:#eee;'>".$key.' => '.print_r($val, true)."</td></tr>\n"; } } $output .= "</table>\n"; $output .= "</fieldset>"; return $output; } } ?>
プロファイラ結果として使用する言語ファイルを作成します。
デフォルトのものは、system/language/english/profiler_lang.phpに定義されているので、独自で作成した言語ファイル内で読み込むようにします。
< ?php // 既存の言語ファイル @include_once(BASEPATH.'language/english/profiler_lang.php'); // 以下、独自追加分 $lang['profiler_session'] = 'SESSION'; $lang['profiler_no_session'] = 'No SESSION data exists'; /* End of file profiler_lang.php */ /* Location: ./system/language/english/profiler_lang.php */ ?>
Tags: CodeIgniter
CodeIgniterが提供しているセッションクラスは、Cookieに全て保存するか、ユーザが追加したデータはデータベースに保存しておいて、キーはCookieに保存するかの2種類を選択することができます。
ただ、PHP標準のセッション機構を使うことには対応しておらず、どうしても利用したい場合は下記のようにベタで記述する必要があります。
session_start(); $_SESSION['hoge'] = 'foo';
上記でも基本的に動くとは思いますが、セッション機構を切り替える際のコストが高いので、コアクラスのCI_Sessionを拡張してPHP標準セッション機構も選択できるようにしてみました。
< ?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * PHP標準Session機構を利用できる * * @author Tatsuya Fukata * */ class XC_Session extends CI_Session { /** PHP標準のSession機能を使用するか */ private $sess_use_php_session = false; /** 初期化時に読み込む設定ファイルのキー一覧 */ private static $INIT_CONFIG_KEYS = array( 'sess_use_php_session', 'sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key', ); /** * コンストラクタ * @param Array $params */ public function __construct($params = array()) { $this->CI =& get_instance(); foreach (self::$INIT_CONFIG_KEYS as $key) { $this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key); } if ($this->use_not_php_session()) { parent::__construct($params); } else { $this->initialize($params); } } /** * PHP標準Session利用時の初期化 * @param Array $params * @return void */ protected function initialize($params) { session_start(); // XXX スーパクラスのprivateメソッドのため、個別定義 // Set the "now" time. Can either be GMT or server time, based on the // config prefs. We use this to set the "last activity" time $this->now = $this->_get_time(); // Set the session length. If the session expiration is // set to zero we'll set the expiration two years from now. if ($this->sess_expiration == 0) { $this->sess_expiration = (60*60*24*365*2); } // セッションが既に存在すれば更新、未作成の場合はデフォルト値を作成する if (!$this->sess_read()) { $this->sess_create(); } else { $this->sess_update(); } /* * XXX スーパクラスのprivateメソッドのため、個別定義 * メソッド「_flashdata_sweep」「_flashdata_mark」「_sess_gc」は * CI_Sessionにプライベートメソッドを意識して定義されているため、 * 本来であれば、XC_Sessionで再定義したいところ。 */ // Delete 'old' flashdata (from last request) $this->_flashdata_sweep(); // Mark all new flashdata as old (data will be deleted before next request) $this->_flashdata_mark(); // Delete expired sessions if necessary $this->_sess_gc(); } /** * Override */ public function sess_read() { if ($this->use_not_php_session()) { return parent::sess_read(); } if (count($_SESSION) == 0) { return false; } // Is the session current? if (($_SESSION['last_activity'] + $this->sess_expiration) < $this->now) { $this->sess_destroy(); return FALSE; } // Does the IP Match? if ($this->sess_match_ip == TRUE AND $_SESSION['ip_address'] != $this->CI->input->ip_address()) { $this->sess_destroy(); return FALSE; } // Does the User Agent Match? if ($this->sess_match_useragent == TRUE AND trim($_SESSION['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50))) { $this->sess_destroy(); return FALSE; } $this->userdata = $_SESSION; return true; } /** * Override */ public function sess_create() { if ($this->use_not_php_session()) { parent::sess_create(); return; } // 初期データを設定 $_SESSION = array( 'session_id' => session_id(), 'ip_address' => $this->CI->input->ip_address(), 'user_agent' => substr($this->CI->input->user_agent(), 0, 50), 'last_activity' => $this->now ); $this->userdata = $_SESSION; $this->sess_write(); } /** * Override */ public function sess_write() { if ($this->use_not_php_session()) { parent::sess_write(); return; } $_SESSION = $this->userdata; } /** * Override */ public function sess_update() { if ($this->use_not_php_session()) { parent::sess_update(); return; } // We only update the session every five minutes by default if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) { return; } // 新しいセッションIDの生成し、設定 session_regenerate_id(true); $this->userdata['session_id'] = session_id(); $this->userdata['last_activity'] = $this->now; $this->sess_write(); } /** * Override */ public function sess_destroy() { if ($this->use_not_php_session()) { parent::sess_destroy(); return; } if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } $this->userdata = array(); $this->sess_write(); session_destroy(); } /** * PHP標準Sessionを利用するかを返す。 * @return bool */ protected function use_php_session() { return $this->sess_use_php_session === true; } /** * PHP標準Sessionを利用しないかを返す。 * @return bool */ protected function use_not_php_session() { return !$this->use_php_session(); } } ?>
また、設定ファイルに下記を追加します。
// PHP標準セッションを利用するか $config['sess_use_php_session'] = TRUE;
Tags: CodeIgniter
あの壷はいいものだ: Ubuntu Linux 10.04 にVMware Server 2.02をインストール → ド嵌った
上記のサイトを参考にUbuntu 10.04 LTS 64bitにVMware Server 2.0.2をインストールしてみました。
実は、サーバマシン以外にVMware Server 2をインストールするのは初めてでした。
Ubuntu 10.04 LTSにはFirefox 3.6.6がインストールされていたのですが、どうやらVMware Server 2.0.2とFirefox 3.6.6の相性が悪いらしく、リモートコンソールがタイムアウトしてしまい、一向に開きませんでした。
次世代ブラウザ Firefox – 旧バージョンのダウンロード
Firefox 3.5をダウンロードし、Firefox 3.5で再度vmware server 2のWEBコンソール画面へアクセスすれば正常にリモートコンソールを開くことができます。
これでローカルを汚さずに開発環境が構築できます。仮想環境って素晴らしい!
Tags: firefox, firefox 3.6.6, Ubuntu 10.04 LTS, vmware, vmware server 2, 仮想化
出張先のホテルで一人寂しく今年も無駄に年を取って24歳になりました。
本当は6月末で終わりのはずだったんですけど、7月末まで延びてしまい、8月の頭に福岡に戻る(予定)ことになりました。
先月、X201sを買ったばかりですけど、最近はストレスが溜まってきており、何か物欲で満たしたいところで、そろそろ今使っているBlackBerry Bold 9000をAndroidに変えようかと思っています。で、Droid 2にしようかと思っていて時々Motorolaのサイトを見ていたのですが、この間も何気なく見たところCHARMという機種がありました。
米T-Mobile、ストレート型Android端末「Motorola CHARM」 – ケータイ Watch
スペック的にはDroid Xなどに比べると劣りますが、BlackBerryのようなストレートタイプでQWERTYキーボードはかなり魅力的です。折りたたみ型やスライド型などを使ってきましたが、日常的に使う端末としてはやはりこの形状が一番使いやすいと思います。開いたり、スライドさせる必要がないため、メールなども使いたい時にすぐに使えます。
トラックパッドの代わりに本体の裏側にBackTrackというものが付いています。片手持ちの際はタッチパネルよりも重宝するんじゃないでしょうか。こういう一手間はかなり変態的なスペックになっていますね。
ただ、これはタッチパッドと競合してしまったりしないのだろうか?という個人的な悩みがあったりします。
何はともあれ、本命のDroid 2の発売が待ち遠しいです。
Introducing the Motorola CHARM with MOTOBLUR
BlackBerry OS 6のデモ
Tags: Motorola CHARM
CodeIgniter標準の言語クラスでは、メッセージに変数などを埋め込める機能が存在しません。もしかすると誰かが既に作ってる可能性は限りなく高いですが、対した実装でもないので勢いで作っちゃいました。
やってることは簡単で、可変長引数を取得し、メッセージ内に組み込まれた置換対象文字である{0}や{1}を置換しているだけです。
CI_Languageと下位互換性は保っているので、置き換えてもそのまま動かすことも可能です。
< ?php if (!defined('BASEPATH')) exit('No direct script access allowed'); if ( ! function_exists('lang')) { /** * 言語ファイルから対象のメッセージを取得する。 * * @param $line メッセージキー * @param $id * @param $args 置換値(可変長引数) */ function lang($line, $id = '') { $CI =& get_instance(); $line = $CI->lang->line($line); // 可変長引数以外の変数の個数 $define_arg_num = 2; // 置換引数指定の場合は、メッセージ内の置換対象文字列を置換する。 $num = func_num_args(); if ($num > $define_arg_num) { for ($i=0; $i< ($num-$define_arg_num); $i++) { $line = str_replace('{'.$i.'}', func_get_arg($define_arg_num+$i), $line); } } if ($id != '') { $line = '<label for="'.$id.'">'.$line.""; } return $line; } } ?>
< ?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class XC_Language extends CI_Language { public function __construct() { parent::__construct(); } /** * 言語ファイルからメッセージを取得し、置換対象文字列が指定されている場合は、置換後の文字列を返す。 * * @param $line メッセージキー * @param $args 置換値(可変長引数) */ function line($line = '') { $line = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line]; // 可変長引数以外の変数の個数 $define_arg_num = 1; // 置換引数指定の場合は、メッセージ内の置換対象文字列を置換する。 $num = func_num_args(); if ($num > $define_arg_num) { for ($i=0; $i< ($num-$define_arg_num); $i++) { $line = str_replace('{'.$i.'}', func_get_arg($define_arg_num+$i), $line); } } return $line; } } ?>
Tags: CodeIgniter
PHPの軽量フレームワークである日本CodeIgniterユーザ会とDJangoやTilesのように継承機能を用いたPHPテンプレートエンジン「Twig – The flexible, fast, and secure template language for PHP」を簡単に連携させてみましたので設定を書きたいと思います。
ただ、CodeIgniterで作成したHelperなどをTwig内での使用までは検証できなかったのでまた時間がある時にでもやってみたいと思います。
下記で説明しているファイルはこちらのファイルに含まれています。
説明用にソースを一部編集していますので、異なる部分もあるのでご了承ください。
※下記のソースはjamiepittock’s codeigniter-twig at master – GitHubを拝借して一部編集しています。
.
`-- system
|-- application
| |-- config
| | `-- twig.php // Twig用設定ファイル
| |-- controllers
| |-- errors
| |-- helpers
| |-- hooks
| |-- language
| |-- libraries
| | |-- Twig // Twigライブラリ
| | `-- Twig.php // Twigクラス
| |-- models
| `-- views
|-- cache
| `-- twig // Twig用キャッシュディレクトリ
|-- codeigniter
|-- database
| `-- drivers
|-- fonts
|-- helpers
|-- language
| `-- english
|-- libraries
|-- logs
|-- plugins
`-- scaffolding
|-- images
`-- views
http://www.twig-project.org/installationからダウンロードしたTwigのlibディレクトリ以下を格納する。
< ?php if (!defined('BASEPATH')) exit('No direct script access allowed'); $config['template_dir'] = APPPATH.'views'; $config['cache_dir'] = BASEPATH.'cache/twig'; ?>
< ?php if (!defined('BASEPATH')) {exit('No direct script access allowed');} class Twig { private $CI; private $_twig; private $_template_dir; private $cache_dir; /** * Constructor * */ function __construct() { $this->CI =& get_instance(); $this->CI->config->load('twig'); ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries/Twig'); require_once (string) "Autoloader" . EXT; log_message('debug', "Twig Autoloader Loaded"); Twig_Autoloader::register(); $this->_template_dir = $this->CI->config->item('template_dir'); $this->_cache_dir = $this->CI->config->item('cache_dir'); $loader = new Twig_Loader_Filesystem($this->_template_dir); $this->_twig = new Twig_Environment($loader, array( 'debug' => true, 'cache' => $this->_cache_dir, )); } public function view($template, $data = array()) { $template = $this->_twig->loadTemplate($template); echo $template->render($data); } } ?>
< ?php class Welcome extends Controller { function Welcome() { parent::Controller(); $this->load-library('twig'); } function index() { $data['name'] = 'Tatsuya'; $this->twig->view('welcome_message.php', $data); } } /* End of file welcome.php */ /* Location: ./system/application/controllers/welcome.php */ ?>
Tags: CodeIgniter, Twig
久しぶりの更新です。というか、ほとんど更新できていませんでした。
アクセスレポートの方はというと当然ではありますが、先月と比べるとかなり下がっています。
ただ、自分では半分程度まで落ちるんじゃないかと思っていたので意外と高い値で驚きました。
まだ人気記事ランキングが正常に出ていませんね。後でちょっとプログラムを見てみます。
一応、仕事が一旦落ち着いたので、ブログの更新感覚も増えるかと思います。今日はこれから以前に個人で引き受けた仕事の領収書と請求書を印刷するために秋葉原のネットカフェにでも行ってきます。請求書もそうですが、なんで判子が必要なんでしょうかね。判子なんて個人を特定出来る要素皆無なのに・・・。どうせ判子を見てその人が押したのかどうかなんて調査してないんだから、電子署名+PDFで良いんじゃないかと。そうすれば、切手代も必要ないしいちいちポストに入れに行く必要もない。
追記:2010-07-03
プログラムを修正しました。記事URLの形式をチェックする部分が以前のpost_idのまま判定していました。
ビジター数:4499(前回:5615)-19.88%
PV数:8083(前回:10394)-22.23%
平均PV数:1.8(前回:1.85)-2.94%
| 順位 | ページ | 今回 PV |
前回 PV |
増減 |
| 1 | 日本通信「b-mobile WiFi」と「b-mobile SIM」を購入検討中 | 402 | 897 |
-55.18%
|
| 2 | [BlackBerry]Bold 9000に公式版OS5.0をインストールしました | 334 | 455 |
-26.59%
|
| 3 | [ChromeExtensions]裏アゲサゲの動画を楽々ダウンロード「AsgDownloadHelper」 | 242 | 182 |
+32.97%
|
| 4 | VistaのC:\Windows肥大化を解消 | 230 | 21 |
+995.24%
|
| 5 | [WordPress]ServerMan@VPSでの高速化のためのチューニング | 179 | 81 |
+120.99%
|
| 6 | ThinkPad X201sを使ってみた | 150 | - | |
| 7 | ThinkPad X201s CTO 納期遅延 | 128 | 197 |
-35.03%
|
| 8 | Eclipseで頻繁に使用するキーボードショートカット一覧 – Java編 | 124 | 8 |
+1450.00%
|
| 9 | hetemlとServerMan@VPSでベンチマークを比較 | 122 | 158 |
-22.78%
|
| 10 | [BlackBerry]IM+ for SkypeのVOIPをWIFI環境下で試してみました | 108 | 163 |
-33.74%
|
| 順位 | キーワード | 今回 Ses |
前回 Ses |
増減 |
| 1 | b-mobile wifi | 120 | 351 |
-65.81%
|
| 2 | 裏アゲサゲ | 64 | 24 |
+166.67%
|
| 3 | x201s 納期 | 60 | 48 |
+25.00%
|
| 4 | thinkpad x201s | 58 | 82 |
-29.27%
|
| 5 | x201s | 45 | 117 |
-61.54%
|
| 6 | wordpress mysql チューニング | 38 | 9 |
+322.22%
|
| 7 | blackberry mixi | 31 | 1 |
+3000.00%
|
| 7 | serverman@vps | 31 | 15 |
+106.67%
|
| 9 | アゲサゲ | 30 | 41 |
-26.83%
|
| 10 | eclipse ショートカット | 26 | - |
| 順位 | ブラウザ | 今回 Ses |
前回 Ses |
増減 |
| 1 | Internet Explorer | 2006 | 2392 |
-16.14%
|
| 2 | Firefox | 1709 | 2137 |
-20.03%
|
| 3 | Chrome | 813 | 1191 |
-31.74%
|
| 4 | DoCoMo | 439 | 49 |
+795.92%
|
| 5 | Safari | 421 | 636 |
-33.81%
|
| 6 | UP.Browser | 195 | 111 |
+75.68%
|
| 7 | Opera | 145 | 162 |
-10.49%
|
| 8 | BlackBerry9000 | 79 | 49 |
+61.22%
|
| 9 | Opera Mini | 70 | 58 |
+20.69%
|
| 10 | Lunascape | 49 | 38 |
+28.95%
|
| 順位 | リファラ | 今回 Ses |
前回 Ses |
増減 |
| 1 | fukata.org | 81 | 33 |
+145.45%
|
| 2 | s.luna.tv | 30 | 18 |
+66.67%
|
| 3 | mixi.jp | 23 | - | |
| 4 | b.hatena.ne.jp | 13 | 3 |
+333.33%
|
| 4 | felica-net.com | 13 | 19 |
-31.58%
|
| 4 | google.co.jp | 13 | 30 |
-56.67%
|
| 4 | websearch.rakuten.co.jp | 13 | 13 |
+0.00%
|
| 8 | 326studio.net | 9 | 16 |
-43.75%
|
| 9 | news-flash.jp | 8 | 3 |
+166.67%
|
| 10 | search.goo.ne.jp | 7 | 20 |
-65.00%
|
Tags: アクセスレポート
先週末にやっとThinkPad X201sが届きました。というか、6月末まで我慢できずに福岡の実家に届いたのを出張先のホテルに送ってもらいました。
注文したスペックについてはこちらを参照してください。
CPUについてもそうなんですけど、一番大きく変わったのはなんと言っても解像度です。1024×768から1440×900なのでこの違いはかなり大きです。HootSuiteもFix HootSuiteを入れることで5カラムも表示できますし、Eclipseも3カラム表示しても全然余裕です。
X61を買った時は、当時の最新スペックで20万越えてたと思いますし、日本語キーボードしか選べなかったのを考えると今は本当に良い時代になりました。
OSの構成は、Windows7とUbuntu 10.04 LTSのデュアルブートにしました。ThinkPadの場合、工場出荷状態で既に3パーティション使用されているので、残り1つを拡張パーティションとし、そこにUbuntuをインストールします。Ubuntuのインストーラからでは基本、または論理パーティションしか作成できないため、UbuntuをCDから起動し、GPartedなどで論理パーティションを作成するとよいです。
ThinkPad X61 + Ubuntu 10.04 トラックポイントでスクロールできるようにする – ありの日記
ThinkPadのトラックポインタでのスクロールについてはこちらを参考にしました。
また、マウスの感度についてですが、/etc/rc.localに下記のように追記しました。これで、再起動後も設定が維持されます。自分はスピード、感度ともにMAXに設定しています。繊細なタッチは要求されますが、最小限の力でトラックポインタを扱うことが可能になります。
#trackpoint
echo 255 > /sys/devices/platform/i8042/serio1/speed
echo 255 > /sys/devices/platform/i8042/serio1/sensitivity
ThinkPadネタなので、ついでに書くと、出張先のオフィスで使うためにThinkPad USB トラックポイントキーボードを購入しました。
打鍵感覚はトラベルキーボードの方がThinkPadに似ていて好きなんですが、こちらはwinキーが付いているのでどちらも捨てがたいです。なんでトラベルキーボードにwinキーが付いていないのかよくわかりませんが。トラベルキーボードのUSBポートなんて必要ないからwinキーを付けて欲しいところ。
でも、USBトラックポイントキーボード良いですよ。値段もキーボードとマウスということを考えるとかなり安い部類に入ります。たしかに、東プレのRealforce、PFUのHHKB何かに比べれば打鍵感覚は安っぽいですが、コストパフォーマンスはかなり高いです。なにより、トラックポイントが使えるのは赤ポッチャーの私としてはかなり助かります。
福岡に戻ったら自宅でも使いたいと思います。
Tags: ThinkPad X201, トラックポイント
http://lolipop.jp/newsletter/2010/20100527/
何やらロリポップがサーバ移設を行なったのが原因なのか、以前作成したPHPの注文フォームが動かなくなったので修正して欲しいという依頼がありました。
挙動から言うと入力画面でセッションにあるクラスのインスタンスを格納して各画面で利用しているのですが、初期表示以降、画面を描画しようとするとセッション内に入れたはずのインスタンスがNULLになっていて落ちていました。
php.iniの設定がユーザの管理画面から行なえるようになったらしいので、その辺が怪しいんじゃないかと見てみるとsession.auto_start=1という設定が。
クラス定義をロードする前にセッションが開始され、内部に保持していたクラスがうまくデシリアライズされないのが原因らしいです。
Tags: ロリポップ