Tatsuya Blog
msgbartop
ニートになりたいプログラマ
msgbarbottom

2010-07-22 23:05 [WordPress]zenbackを導入してみた

  • Share

はてなブックマークやTwitterと連携するブログがだいぶ増えてきました。

wordpressなど独自でカスタマイズする必要のあるブログの場合、プラグインなどを利用すれば可能かもしれませんが、連携に手間取ったりすることもあるかと思います。

そんな方にzenback

公式サイトからの引用ですが、zenbackとそのメリットについて載せておきます。

「zenback」とは?

  • その記事に関係する自分のブログ記事
  • その記事に関係する他のzenbackユーザーのブログ記事
  • その記事についての最新のTwitterのつぶやき
  • その記事についてのはてなブックマーク
  • その記事の最新のアクセス元(リファラ)

どういうメリットがあるの?

  • 昔書いた古い記事を、もっと多くの人に読んでほしい
  • せっかくブログを作ったので、読者を増やしたい
  • 他のブログの記事を紹介して、アクセスを流してあげたい
  • 自分のブログについての、Twitterやはてなブックマーク、他ブログからの反応を簡単に知りたい
  • 記事へのフィードバックは欲しいけど、荒れたくはない

関連リンクなどは記事を書いた本人も同じ趣向の人の記事を読めて非常に良いです。
関連記事などは、プラグインを使っても中途半端なものになったりといまいちだったりするので、どれくらいの精度なのか楽しみにしています。

wordpressの場合は、独自でテンプレートを編集することができるので、非常に楽です。

zenbackから取得したjavascriptコードをテーマのsingle.phpの下記の記事内容を出力している後に追記してあげるだけで表示されると思います。

< ?php the_content(); ?>

私は、2、3日前に申し込んで今日の夕方に提供開始メールが来たので今から申し込んでもそんなに時間はかからないと思うので、ちょっと使ってみたいという方はどうですか?

Tags:

2010-07-19 13:21 [CodeIgniter]CI_Profilerを拡張してCI_Session内容も出力してみた

  • Share

Controllerなどで下記のように記述するとデバッグ用に変数の内容などを出力してくれます。

$this->output->enable_profiler(true);

デフォルトだと、下記の情報が表示されるようです。

  • URI STRING
  • CLASS/METHOD
  • MEMORY USAGE
  • BENCHMARKS
  • GET DATA
  • POST DATA
  • QUERIES

今回は省略しますが、プロファイラ用のホックなんかを使っておくと便利です。

追記:2010-07-20
大したプログラムではないですけど、残しておきます。

system/application/hooks/XC_ProfilerHook.php

< ?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'));
	}
}
 
?>

で、設定ファイルに下記を追加します。

system/application/config/config.php

//プロファイラホックの有効化
$config['hook_enable_profiler'] = true;

さらに、hooks.phpに下記も追加します。

system/application/config/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の持つ、ユーザデータの内容も出力するようにしてみました。

system/application/libraries/XC_Profiler.php

< ?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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_session').'&nbsp;&nbsp;</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に定義されているので、独自で作成した言語ファイル内で読み込むようにします。

system/application/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:

2010-07-19 12:00 [CodeIgniter]CI_Sessionを拡張してPHP標準Sessionに対応してみた

  • Share

CodeIgniterが提供しているセッションクラスは、Cookieに全て保存するか、ユーザが追加したデータはデータベースに保存しておいて、キーはCookieに保存するかの2種類を選択することができます。

ただ、PHP標準のセッション機構を使うことには対応しておらず、どうしても利用したい場合は下記のようにベタで記述する必要があります。

session_start();
$_SESSION['hoge'] = 'foo';

上記でも基本的に動くとは思いますが、セッション機構を切り替える際のコストが高いので、コアクラスのCI_Sessionを拡張してPHP標準セッション機構も選択できるようにしてみました。

system/application/libraries/XC_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();
	}
}
?>

また、設定ファイルに下記を追加します。

system/application/config/config.php

// PHP標準セッションを利用するか
$config['sess_use_php_session'] = TRUE;

Tags:

2010-07-14 03:20 Ubuntu 10.04 LTS 64bitにVMware Server 2.0.2をインストールしてみた

  • Share

あの壷はいいものだ: 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: , , , , ,

2010-07-13 00:32 Happy Birthday 自分/Motorola CHARM

  • Share

出張先のホテルで一人寂しく今年も無駄に年を取って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:

2010-07-06 23:08 [CodeIgniter]CI_Languageをメッセージに外部から値を組み込めるように拡張してみた

  • Share

CodeIgniter標準の言語クラスでは、メッセージに変数などを埋め込める機能が存在しません。もしかすると誰かが既に作ってる可能性は限りなく高いですが、対した実装でもないので勢いで作っちゃいました。

やってることは簡単で、可変長引数を取得し、メッセージ内に組み込まれた置換対象文字である{0}や{1}を置換しているだけです。

CI_Languageと下位互換性は保っているので、置き換えてもそのまま動かすことも可能です。

system/application/helpers/xc_language_helper.php

< ?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;
	}
}
 
?>

system/application/libraries/XC_Language.php

< ?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:

2010-07-04 15:58 [CodeIgniter]Twigと連携してみた – その1

  • Share

PHPの軽量フレームワークである日本CodeIgniterユーザ会とDJangoやTilesのように継承機能を用いたPHPテンプレートエンジン「Twig – The flexible, fast, and secure template language for PHP」を簡単に連携させてみましたので設定を書きたいと思います。

ただ、CodeIgniterで作成したHelperなどをTwig内での使用までは検証できなかったのでまた時間がある時にでもやってみたいと思います。

下記で説明しているファイルはこちらのファイルに含まれています。
説明用にソースを一部編集していますので、異なる部分もあるのでご了承ください。

ci-twig-1.0.0.zip

※下記のソースは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

追加ファイル

application/libraries/Twig

http://www.twig-project.org/installationからダウンロードしたTwigのlibディレクトリ以下を格納する。

application/config/twig.php

< ?php if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['template_dir'] = APPPATH.'views';
$config['cache_dir'] = BASEPATH.'cache/twig';
?>

application/libraries/Twig.php

< ?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);
	}
}
?>

サンプル

application/controllers/

< ?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: ,

2010-07-02 12:00 [アクセスレポート]2010-06-01 〜 2010-06-30

  • Share

久しぶりの更新です。というか、ほとんど更新できていませんでした。

アクセスレポートの方はというと当然ではありますが、先月と比べるとかなり下がっています。
ただ、自分では半分程度まで落ちるんじゃないかと思っていたので意外と高い値で驚きました。

まだ人気記事ランキングが正常に出ていませんね。後でちょっとプログラムを見てみます。

一応、仕事が一旦落ち着いたので、ブログの更新感覚も増えるかと思います。今日はこれから以前に個人で引き受けた仕事の領収書と請求書を印刷するために秋葉原のネットカフェにでも行ってきます。請求書もそうですが、なんで判子が必要なんでしょうかね。判子なんて個人を特定出来る要素皆無なのに・・・。どうせ判子を見てその人が押したのかどうかなんて調査してないんだから、電子署名+PDFで良いんじゃないかと。そうすれば、切手代も必要ないしいちいちポストに入れに行く必要もない。

追記:2010-07-03
プログラムを修正しました。記事URLの形式をチェックする部分が以前のpost_idのまま判定していました。

基本情報

前回:2010-05-01 〜 2010-05-31

ビジター数: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:

2010-06-20 23:48 ThinkPad X201sを使ってみた

  • Share

先週末にやっと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: ,

2010-06-13 21:07 ロリポップが新構成サーバ移設でPHPエラー

  • Share

http://lolipop.jp/newsletter/2010/20100527/

何やらロリポップがサーバ移設を行なったのが原因なのか、以前作成したPHPの注文フォームが動かなくなったので修正して欲しいという依頼がありました。

挙動から言うと入力画面でセッションにあるクラスのインスタンスを格納して各画面で利用しているのですが、初期表示以降、画面を描画しようとするとセッション内に入れたはずのインスタンスがNULLになっていて落ちていました。

php.iniの設定がユーザの管理画面から行なえるようになったらしいので、その辺が怪しいんじゃないかと見てみるとsession.auto_start=1という設定が。

セッション処理関数(session)

クラス定義をロードする前にセッションが開始され、内部に保持していたクラスがうまくデシリアライズされないのが原因らしいです。

Tags: