2011年12月1日木曜日

[CakePHP2.0]CakeEmailでテンプレートを使ってメール送信

まだCakePHPのことはあまり分かってないのですが、どうやら2.0からはCakeEmailというクラスを使ってメール送信できるようです。
CakePHPサイト参照(英語)

以前のバージョンではEmailComponentとかいうのがあったようですが、僕がCakePHPの1.1か1.2かどちらかを使った時はPHPMailerをVendorに入れてメール送信処理を書いていたように記憶しています。
というか、EmailComponentなんて存在を当時は知りませんでした(^^;

簡単そうなので、そのままコードをコピペしてちょちょいといじれば普通にできました。

今回の案件では、ViewのEmailテンプレートを利用してSMTPで送信するという流れでやってます。
メールの形式はtextにしてます。

まず、ベースのレイアウトを
View/Layouts/Emails/text/my_layout.ctp
に設定します。
会社名とか必ず書いておきたい内容を設定しておけばいいと思います。
$content_for_layoutにメールの内容が入るようです。

#ベースレイアウト(my_layout.ctp)

<?php echo $content_for_layout; ?>


会社名:〇〇株式会社
住所:〇〇市〇〇町
メールアドレス:info@example.com
URL:http://www.example.com/



そして、送信内容のテンプレートを
View/Emails/text/my_template.ctp
に設定します。
ここの変数は送信処理のviewVarsでセットします。

#テンプレート(my_template.ctp)

<?php echo $name; ?> 様

<?php echo $msg; ?>>





メール送信は以下のような感じ
最初の$configってのはSMTPを使う為の設定で、CakeEmailクラスをインスタンス化する時に引数で渡せばいいようです。
マニュアルではEmailConfigクラスに直接設定を書きこむ方法も書いてありますが、どっちでやるかは好みの問題です。

    // SMTP用設定
    $config = array (
        'host'      => 'smtp.example.com',
        'port'      => 587,
        'username'  => 'username',
        'password'  => 'password',
        'transport' => 'Smtp'
    );
    $subject = '件名';

    // テンプレートに送る変数
    $ary_vars = array (
        'name' => $this->data['Mail']['name'],
        'msg'    => 'ありがとうございました。';
    );

    // 送受信者設定
    $from_mail = 'info@example.com';
    $from_name = 'My Company';
    $to_mail = $this->data['Mail']['mail'];
    $to_name = $this->data['Mail']['name'];

    // 送信処理
    $email = new CakeEmail($config);
    $email
                ->template('my_template', 'my_layout')
                ->viewVars($ary_vars)
                ->emailFormat('text')
                ->from(array($from_mail => $from_name))
                ->to(array($to_mail => $to_name))
                ->subject($subject)
                ->send();


jQueryみたいに数珠つなぎな感じでできるようです。

ここの処理の流れは
  1. templateでテンプレートとレイアウト名を設定
  2. viewVarsでテンプレートに変数をセット
  3. emailFormatで'text'形式に設定(他に'html'、'both'があるらしい)
  4. fromで送信者を設定
  5. toで受信者を設定
  6. subjectで件名を設定
  7. sendで送信
という感じですね。

これを実行すると以下のようなメールが届くと思います。

◯◯ 様

ありがとうございました。


会社名:〇〇株式会社
住所:〇〇市〇〇町
メールアドレス:info@example.com
URL:http://www.example.com/


テンプレートを利用しない場合は、template関数とかviewVars関数は不要で、send関数の引数に送信内容を入れればいいようです。
まぁテンプレ使った方がコードがスッキリしますね。

2011年11月24日木曜日

Wordbookerでサムネイルを非表示に[Wordpress]

WordpressのプラグインWordbookerは、投稿した記事をfacebookと連動できるという素晴らしいプラグインです。

Wordpressの案件で利用したのですが、投稿するとfacebookのウォールには関係ない画像が載ってしまいました。
よくある「ページトップへ」って画像が必ずサムネイルになってしまうという状況だったのですが、これではカッコ悪いです。
サムネイルを非表示にしようということになりました。

Wordbookerはまだ設定画面が全部英語なので何かよく分からないけど、何だかサムネイルをオフにする設定がないようなので、プラグインのコードをちょっといじって無理やり非表示にしました。

Wordbookerプラグインのwordbooker.phpの中の


    $post_data = array(
        'media' => $images,
        'post_link' => $post_link,
        'post_link_share' => $post_link_share,
        'post_title' => $post_title,
        'post_excerpt' => $post_content,
        'post_attribute' => $post_attribute,
       # 'post_full_text' => $post->post_content,
        'post_id'=>$post->ID,
        'post_date'=>$post->post_date
        );


の箇所と


    $wordbooker_fb_post = array(
        'name' => $post_data['post_title'],
        'link' => $post_data['post_link'],
        'message'=> $post_data['post_attribute'],
        'description' => $post_data['post_excerpt'],
        'media' => json_encode($images)
    );


の箇所の 赤字にしてある部分'media'を '_media'にする等して別の名前にします。
これで画像が出なくなりました。

その代わり、画像を出したくても出せないのが難点ですね。
まぁこの案件ではテキスト情報の更新しかしないのでこれでOKなのです。
ちなみにWordbookerのバージョンは2.0.8でした。

2011年11月20日日曜日

[CakePHP2.0]複数サブドメインでモデルを共有する

サイトの設計上、管理画面と公開画面をサブドメインで分けることになりました。
とは言え、Vendorやモデルは共有したので、ちょっとCakePHPの設定をいじらないといけません。

ControllerとViewだけを切り分けて、他のファイルを共通化するというのが一番いいのかな?
フォルダ構成はこんな感じになりました。


root
├cake
│├app
│└cake
├www.example.com(公開用)
│└public_html
└admin.example.com(管理用)
 └public_html


各public_htmlフォルダのindex.phpで、「ROOT」と「APP_DIR」と「CAKE_CORE_INCLUDE_PATH」の定数を設定します。
今回の場合は以下のようになりました。


if (!defined('ROOT')) {
    define('ROOT', dirname(dirname(dirname(__FILE__))).DS.'cake');
}
if (!defined('APP_DIR')) {
    define('APP_DIR', 'app');
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
    define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__))).DS.'cake'.DS.'cake'.DS.'lib');
}


そして、ファイル管理をしやすくする為に root/cake/appのControllerとViewをフォルダで区切ります


app
├Controller
│├admin
│└www
└View
 ├admin
 └www


フォルダを区切るだけでは認識されないので、 app/Config/bootstrap.php に以下のコードを追記します。


App::build(array(
    'Controller' => array (
         ROOT.DS.APP_DIR.DS.'Controller'.DS.'admin'.DS,
         ROOT.DS.APP_DIR.DS.'Controller'.DS.'www'.DS
     ),
     'View' => array (
         ROOT.DS.APP_DIR.DS.'View'.DS.'admin'.DS,
         ROOT.DS.APP_DIR.DS.'View'.DS.'www'.DS
     )
));


これで、Modelを共有して複数のサブドメインから1つのCakePHPを参照することができます。

問題点は、フォルダで区切るから、同じ名前のコントローラー名をつけることができてしまうってことかな。
adminとwwwにPagesController.phpを作ってしまうとどちらか(多分adminの方)を読み込んで、片方は読まれません。
なので、この方法でやる場合はcontrollerの重複に気を付けないといけない感じです。

あと、app/routes.phpで調整してドメインごとにトップページのコントローラーを変える等の調整が必要です。
例えば、AdminPagesController.php をadmin.example.comのルートに設定する場合、


$host = explode('.', $_SERVER['HTTP_HOST']);
switch ($host[0]) {
    case 'admin':
        Router::connect('/', array('controller' => 'admin_pages', 'action' => 'display', 'home'));
        break;
    default:
        Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
        break;
}


こんな感じでいいんじゃないかな。
ルーティングしてしまえばURLは何とでもなるし、adminフォルダならファイル名の接頭語にadminを付けるとかして工夫した方が安全ですね。

2011年11月17日木曜日

[CakePHP2.0]モデルのprefixが複数あるテーブルを扱う時

ちょっとCakePHPのプログラムを書いてます。

smartyばっかりだったのでなかなかフレームワークには馴染めませんでしたが、慣れてしまうとsmartyより便利ですね。
コードの量が減った気がします。

さてさて、CakePHPではデータベースのprefixを指定して管理することができます。

prefixと言うと、日本語なら「接頭語」って感じですかね・・例えば、cake_items、cake_prices、cake_details・・・という感じで、頭に必ずついてる「cake_」がprefixになります。
この共通の接頭語を app/Config/database.php のDB設定欄 prefixの値で設定することで、prefixを省略してContrllerの名前を付けたりできるわけです。


public $default = array(
 'datasource' => 'Database/Mysql',
 'persistent' => false,
 'host' => 'localhost',
 'login' => 'login_id',
 'password' => 'login_pass',
 'database' => 'sample',
 'prefix' => 'cake_',
 'encoding' => 'utf8',
);


1つのデータベースでWordpressやCakePHPや何だかんだと複数のアプリを管理している場合に便利ですね。

ところが今回のデータベースは、CakePHP上で扱うデータベースだけど接頭語の種類が複数あるというタイプでした。
例えば、マスターテーブル、アプリ用テーブル、設定用テーブルと種類分けされていて、それぞれに接頭語があるという感じです。
例えば、mst_items、app_histories、st_applications・・といった感じですね。

この場合、prefixを指定せずに、modelの中で使用するテーブル名を設定してもいいと思います。


/**
 * app_historiesテーブル
 */
class History extends AppModel {
    public $name = 'History';
    public $useTable = 'app_histories';
}


でも、今回は、大半がアプリ用テーブルだったので、prefixには 'app_' を設定しています。
この場合、マスターテーブル等のモデルをどうするかと言うと、


/**
 * mst_itemsテーブル
 */
public MstItem extends AppModel {
    public $name = 'MstItem';
    public $tablePrefix = '';
}


として、$tabelPrefix を空白に設定してやるとOKです。
マスターテーブルと分かるように、あえてMstItemという名前にしてますが、Itemとして管理したい場合は、$tablePrefixをmst_にすればいいんじゃないかな。これはやってません。


public Item extends AppModel {
    public $name = 'Item';
    public $tablePrefix = 'mst_';
}


結構柔軟に何でも扱えますね。
バージョン1.2の頃に使ったことがあったけど、バージョン2系になってからは初のCakePHPです。
findAllとか動かなくなってるんですね。
今現在(2011/11/18)まだ2系のリファレンス本は出てないような感じなので、しばらくはネット中心で情報を集めていくしかなさそうです。

2011年11月6日日曜日

window.nameで止まる?[javascript]

基本Chromeで見てるので、IEはいつも後回しなんだけど、しょっちゅうIEで何か不具合があります・・

ポップアップでWindowを開くページがありました。
複数のリンクがあるけど、同じリンク先がいくつか現れる可能性もあります。

Windowをポップアップした状態で、また同じポップアップリンクを押してしまった場合、もうWindowは開かないという処理が必要です。

こんな時はwindowのnameプロパティを使って制御するわけですが、IEで見ると何故かwindow.nameを参照したところで止まってしまいます。


var win; // グローバル変数でWindowオブジェクトを管理

$('#elm').click(function() {
    var win_name = $('input[name="xx"]').val();
    if (win && win.name == win_name) {
        return false;
    }
    win = window.open('xx.html', win_name);
});


まぁザックリとこんな感じです。
これはChromeとかFirefoxでは動くけどIE9で見てたらif文のところで止まる場合があります。

止まる「場合がある」というのは、止まらない場合もあるということです。

window.openしたWindowを閉じてから、また別のリンクを開こうとした際に止まるようです。

1回目ポップアップを開いた時は、グローバル変数のwinは空なので、if文を抜けてwindow.openします。
そして、そのWindowを閉じてからもう一回ポップアップを開く時、winにはWindowオブジェクトが格納されているのですが、プロパティを参照できない状態という感じなんだと思います。

なので、Windowが閉じたかどうかをチェックしないといけなかったわけです。


var win; // グローバル変数でWindowオブジェクトを管理

$('#elm').click(function() {
    var win_name = $('input[name="xx"]').val();
    if (win && !win.closed && win.name == win_name) {
        return false;
    }
    win = window.open('xx.html', win_name);
});


こうして、window.closedプロパティを見れば無事思った動作になりました。
分かりにくかったのは、winにWindowオブジェクトが入ってるけど、もうWindowのプロパティがないという状態だったということですね。
多分Chromeとかだと、windowを閉じた時点でwin自体がnullになってるんでしょうか?
そこまでチェックはしてないけど、とりあえず解決できました。

2011年11月4日金曜日

ChromeでPOSTしたページのソース

以前に書いた記事で、Chromeを使っててPOSTした後のページのソースが見れないということを言ってたと思うのですが、「要素の検証」で見れました。

右クリックして「要素の検証」を開いて、「Resources」タブを選択すると見れました。
そればかりか、「Network」タブを開けばFirefoxのエクステンション「HttpLiveHeaders」と同じ情報も見れます。

Chromeかなり凄いです。
これがあればFireBug不要ですね。

あとはFireMobileSimulatorみたいなのがあればいいんですけど、3キャリアの絵文字まで表示できるのはまだ無さそうです。

Firefoxも更新を頻繁にするようになってからFireMobileSimulatorが更新されなくなったような・・
最近使ってないから知らないけど、バージョンアップでアドオンが使えなくなるのはちょっと残念な話です。

2011年10月29日土曜日

エックスサーバーのcronでphp5が動かない?

エックスサーバーを使ってcronを使おうとした時のこと。
最初は自分の開発環境と同じように書いてみました。
0分、30分、50分にcron.phpを実行するという感じです。cron.phpはphp5とします。

分:0,30,50
時:*
日:*
月:*
曜日:*
コマンド:php /home/ユーザーID/ドメイン/public_html/cron.php

当然というか予想通りと言うか・・動きません。
この手の設定は調べながらやった方が確実です。

そこで、ザックリと調べて得た答えが


/usr/bin/php5 /home/ユーザー名/ドメイン/public_html/cron.php


という書き方。
コマンドのphpはフルパスで指定するのは当然なのかな?開発環境ではパスを通してたので・・
エックスサーバーでphp5は使えるけど、cronの時はphp5を指定しないとphp4として動くとか何とかって話でした。

なるほど・・と思い早速修正。
それでも動かない・・・

途方にくれながら管理画面をカチカチと見ていて、サーバー管理画面トップの「サーバー情報」に入ると、「コマンドパス一覧」という項目があったので見てみることに。
それで解決しました。

php5 というコマンドはもう無くなっていて、php4、php、php5.2、php5.3という4パターンあることが判明。
phpコマンドを実行するとphp5.1で走るようです。
今回は5.3で実行することにしました。


/usr/bin/php5.3 /home/ユーザー名/ドメイン/public_html/cron.php


これでちゃんと動きました。
試用期間中は確認メールが届かないようなので、処理がちゃんと走ったかどうかは実行結果を見に行かないといけません。

2011年10月26日水曜日

ネットショップで商品を売れるようにしてって・・

楽天にショップを出してるけど商品がほとんど売れない・・そんな会社は多いと思います。

商品名やキャッチコピー、紹介文の最適化で改善される例もあると思います。
広告を打ってみたら変わる場合もあると思います。

でも、やっぱり売れないものは売れないですね。

「楽天じゃダメだから自社ショップを立ち上げたい」という人も中にはいます。
これが一番ダメな選択だと思います。
楽天でダメなら自社ショップはもっと厳しいです。

楽天で検索する人は、GoogleやYahooで検索する人よりも「買う気」のある人です。
楽天の検索結果に商品が載るということは、売れる可能性はGoogleなんかに引っかかるよりも高くなるはずです。

自社ショップになってしまうと、当然楽天の検索には載りませんし、検索サイトからのアクセスが中心になると思います。
でも、検索サイトってのは、「買う」よりも「調べる」という要素が強いので、売れる可能性は下がりますね。


今回は売れるようにしてくれと言われたけど、そんなことが簡単にできるなら自分で何か売ってます。
でも、商品を見もしないで「売れないものは売れないし諦めろ」とは言えないので、とりあえず調査をするわけです。

まずいくつかある商品の一個を検索してみると・・他社でも扱ってる商品でした。
しかもかなりの大手から小さな会社まで色々な場所で扱っています。
楽天の他店舗にもありましたし、Amazonにもありました。
これが売れるとは思えないですね。

他の商品も調べてみたけど、どれも同じような感じです。
これはECサイト向きの商品ではないということだと結論を出しました。

ECサイトで物を売りたいなら「オリジナル」か「他社より安い」ことが条件になるんじゃないかと思います。
適当な卸店から仕入れてコンビニや薬局と同じように売っているのではダメです。


ECサイトで成功するのって本当に難しいと思います。
よほど商品力か価格競争力がない限りやるもんじゃないです。

2011年10月24日月曜日

サブカテゴリ(小カテゴリ)の一覧を取得[Wordpress]

サブカテゴリの一覧が必要になったので、ちょっと関数を作ってみました。
親カテゴリの情報をカテゴリスラッグから取得するので、get_category_by_slugを使ってます。

function get_subcategories($slug) {
    $cat = get_category_by_slug($slug);
    $lists = get_terms("category", "child_of={$cat->term_id}");
    foreach ($lists as $list) {
        $cats[] = array (
            'slug' => $list->slug,
            'slug_name' => $list->name,
            'description' => $list->description,
            'count' => $list->count
        );
 }
 return $cats;
}

カテゴリの取得順序はプラグインのMy Category Order辺りを利用して、get_termsの箇所を以下のようにすればOKだと思います。

$lists = get_terms("category", "child_of={$cat->term_id}&orderby=order&order=ASC");


get_terms関数を知るまでは、wp_list_categoriesを使って、正規表現で抜き出したコードを書いてました(^^;
でもそれだとdescriptionが取得できないんですよね。
もうちょっと関数知らないと思わぬ無駄な処理をしてしまうことになりそうです。

2011年10月22日土曜日

get_the_categoryで親と子の取得順序[Wordpress]

あるWebの規約で、必ず親カテゴリと小カテゴリに一個ずつチェックをつけて記事を投稿するというのがありました。

元々は小カテゴリは不要で、親カテゴリの記事の一覧を作るだけのページだけど、もし万が一親カテゴリの記事が100件とかに増えてしまった場合、小カテゴリで区切って表示させようという意図があります。
なので、今回のコーディングでは小カテゴリは完全に無視して、親カテゴリだけを扱って、もし小カテゴリで分ける必要が出てくれば再コーディングするということです。

まぁこんなページで親カテゴリ名を取得しようとした時のこと。

while ($query->have_posts()) {
    $query->the_post();
     // カテゴリ取得
    $cat = get_the_category();
    $cat = $cat[0];
}
return $cat->name;

こんなコードを書いてみると、親カテゴリ名を返す場合と、小カテゴリ名を返す場合がありました。
get_the_categoryって関数は、カテゴリの親子関係順に配列を返してくれるわけではないようです。

これでは困るので以下のように書き換え

// カテゴリ取得
$cat = get_the_category();
// 親カテゴリを取得
foreach ($cat as $val) {
    if ($val->category_parent == 0) {
        $cat_parent = $val;
        break;
    }
}
return $cat_parent->name;


もしこれを小カテゴリ対応するとしたら

// カテゴリ取得
$cat = get_the_category();
// 親カテゴリを取得
foreach ($cat as $val) {
    if ($val->category_parent == 0) {
        $cat_parent = $val;
    } else {
        $cat_sub = $val;
    }
}

みたいにすれば1つの親カテゴリ、1つの子カテゴリなら対応できますね。

複数カテゴリに対応するには変数を配列にする等していけば何とかなるんじゃないかな。
今回はそこまで求められてないのでどうでもいいけど。

2011年10月20日木曜日

正常に表示されてるのに404エラー[Wordpress]

あるサイトの仕上げにHTML Validationチェックをかけていた時のこと。

ちゃんと画面は表示されているのに、Validation ServiceにURLを送信すると404エラーになるページがありました。

どのページも共通してWordpressのヘッダーをrequireしていたので、原因はWordpressしかないと考えました。


require_once 'blog/wp-blog-header.php';

do_something..


こんな感じでwp-blog-header.phpをrequireしていたので、まずはwp-blog-header.phpのソースをチェック。


if ( !isset($wp_did_header) ) {
    $wp_did_header = true;
    require_once( dirname(__FILE__) . '/wp-load.php' );
    wp();
    require_once( ABSPATH . WPINC . '/template-loader.php' );
}


こんなのが書いてあります。

行数が少ないので、一個ずつコメントアウトして動作チェックしてみると、wp() 関数をコメントアウトしたら404エラーが出なくなりました。
そして、template-loader.phpを読まなくても問題ないので、ここで必要なのは wp-load.phpだけということになります。

なので、wp-blog-header.phpのrequireをやめて、wp-load.phpを読み込むように変更しました。


require_once 'blog/wp-load.php';

do_something...


こうすることで404エラーは出なくなり、validationも無事通すことができました。

結局wp()関数が何をしているのかは検証してないけど、Wordpressの機能だけ使えたら問題ないので必要ないでしょう。


これって、画面が正常に表示されているだけに気づきにくい問題です。
もしWordpressを組み込んだサイトを作って、wp-blog-header.phpをrequireしている人がいたら、一度W3CのHTML Validation ServiceにURLを送ってみるとか、Chromeの「要素の検証」で「Network」を開いてチェックしてみるとかしてみた方がいいですね。

ちなみに今回のWordpressのバージョンは3.2系だったと思います。

2011年10月17日月曜日

PHPで0から始まる数値を扱う時の失敗

データベース上でZEROFILLしてあるカラムとか、sprintf('%02d', $number)とかでゼロ埋めしたような数値を扱うことがありました。
この時に0で始まる数値のことを考えずにコードを書くと不具合がでてしまうことがあります。

例えば以下のようなコード

$errors = array (01, 02, 08, 09);
foreach ($errors as $error_code) {
    switch ($error_code) {
        case 01:
            echo 1;
            break;
        case 02:
            echo 2;
            break;
        case 08:
            echo 8;
            break;
        case 09:
            echo 9;
            break;
      }
}

こんなコードを書くと、08の時にcase 08とcase 09を実行し、09の時も同じようにcase 08と09を実行します。

PHPだけじゃなくて他の言語でもそうだと思うけど、0から始まる数値は8進数として扱われます。
上記のコードの場合、0〜7までは動作するけど、8進数では8になると桁が繰り上がるので8以上の値は存在しません。
この時、08の時も09の時も0として扱われているので、 case 08 = case 09 = case 0ということになります。

なので、もし、$errorsの配列に'00'という値があれば、00が回って来た時にもcase 08と case 09を実行していることになります。

ゼロ埋めした数値は時々使うことがあるので、気を付けないといけませんなぁ。

2011年10月15日土曜日

while,for,foreachの中のswitchでcontinueすると・・

foreach文の中でswitchを使った時の失敗。
以下のようなコードを書きました。

foreach ($ary as $key=>$val) {
    switch ($key) {
        case 'aa':
            continue;
            break;

        default:
            break;
    }
    $val =  ......
    .......
}

思惑としては、$keyの値が'aa'だった時だけforeachの次のループに行きたい・・というものでした。
ところが、$keyが'aa'の時でもそのまま次へ行かずにforeach文を実行していました。

そういえばbreakで多重のループを抜ける時は break 2;とかしてたなと思って、continue 2; とすると思った動作になりました。

foreach ($ary as $key=>$val) {
    switch ($key) {
        case 'aa':
            // switchをbreakしてforeachにcontinueする
            continue 2;
            break;

        case 'bb':
            // break 2とするとswitchとforeachを飛ばせる
            break 2;

        default:
            break;
    }
    $val =  ......
    .......
}


C言語か何かで同じような処理を書いた時は、switch内でcontinueしておけば次のループに行けたような記憶があったので、PHPでも大丈夫だと思ってました。

PHPのswitch内でのcontinueはbreakと同じ動作をするような感じですね。
習慣的にswitch文では全部にbreakを付けてるけど、continueが書いてあればbreakは不要かな。

2011年10月13日木曜日

MySQLで時間(TIME)の足し算引き算

時間を保存するカラムを持ったテーブルがあります。
例えば、以下の時間割のテーブルを作ったとしましょう。


-- num 時限
-- subject 教科
-- start_time 開始時刻
CREATE TABLE time_tables (
    id int unsigned PRIMARY KEY auto_increment,
    num smallint unsigned NOT NULL,
    subject varchar(50) NOT NULL,
    start_time time NOT NULL
) CHARACTER SET utf8;


開始時刻10分前の情報が欲しい時、start_timeから10分を引けばいいんですけど、普通に引き算してもダメです。
TIMEDIFF関数を使って引き算することができます。


SELECT TIMEDIFF(start_time, '00:10:00') as before10min
  FROM time_tables;


逆に10分後の情報が欲しい時は、ADDTIME関数を使います。


SELECT ADDTIME(start_time, '00:10:00') as after10min
  FROM time_tables;


例えば時間を監視する処理が走っていて、ある時間の何分前になったら集計を行うとか、そんな時に使えそうですね。

2011年10月11日火曜日

スマホは欲しいけどホントに必要かよく考えてみる

正直iPhoneには今のところ興味がありません。
どちらかと言うとiPadの方が興味ありますね。

スマートフォンを持つならandroidかblackberryを選択すると思います。

いつでもどこでもネットができて、便利なアプリケーションが使えるというのがスマートフォンの良いところなのかな?
電車とかバスとか、移動中の暇つぶしとしては最適だと思うけど、本当に必要かというと疑問です。

通常の携帯でもパケットをフルに使ってた人にしてみれば差がないかもしれないけど、あまりパケットを使っていなかった人にしてみると、毎月5,000円くらいの通信費が上乗せされてくることになります。
年間で約60,000円、これを払ってまで得たい機能がスマホにあるのか・・それをまず考えないといけません。

2年契約が基本だと思うので、2年間で約120,000円の出費増が確定するわけです。
これなら普通の携帯で我慢して出費を他のものに回した方が良いような気もします。

スマホ持ってるけど、アプリとかネットするのは家の中がメイン・・という人なら、携帯は普通の携帯を持って、androidなりiPadなりのタブレット端末を一台持って無線LAN環境で使うのが一番良いんじゃないかな。
もっと通信費を安くしてほしいですね。

2011年10月10日月曜日

jQueryでconfirmした後のfadeOutが動かない時

例えば、ショップカート等で「削除」ボタンでカートから商品を消すような処理があります。
まず本当に削除していいか確認メッセージを出しますよね?

ということで、まずはjavascriptで

if (!confirm('削除OK?')) {
    return false;
}

みたいなのを書きました。

その後、ajaxで削除処理をして、画面上から選んだ商品をfadeOutするという処理をしたかったわけです。


$(this).fadeOut('slow', function() {
    $(this).remove();
});


これをやるとfadeOutのアニメーションをスキップして、パッと消えてしまうんです。
でも、fadeOutのコールバック関数内でfadeOutをやると、その部分はアニメーションしました。


$(this).fadeOut('slow', function() {
    $(this).remove();
    $('#something').fadeOut('slow');
});


何かfadeOutの前にワンクッション置けばいいのかと思って、fadeOutの前にdelay(0)を入れてみると正常に動作するようになりました。
大まかな流れは以下のような感じです。


if (!confirm('削除OK?')) {
    return false;
}
$.ajax({
    type:'get',
    url:'./del/',
    data:'item=xxx',
    success:function(data) {
        // delay(0)をfadeOutの間に入れる
        $('del_elm').delay(0).fadeOut('slow', function() {
            $(this).remove();
        });
    }
});


Chromeでしか確認してないけど、これで大丈夫なんじゃないかな?
もっとスマートな方法があれば教えて下さい。

2011年10月7日金曜日

smartyテンプレートで配列の文字列に変数を指定する

PHPはフレームワークがすっかり定着していますが、smartyもまだまだ捨てたもんじゃありません。
元々テンプレート的に使えるPHPなので、smartyは本末転倒だとか言われてますけどね・・。
でもフレームワークは規約に縛られてやりにくい場合もあったので、自分なりに作れるsmartyは使いやすいです。
smartyを使う場合は、一貫して「自分規約」を貫かないと面倒なことになるのかな。

さて前置きはこの程度で本題...

smartyのテンプレート内で配列を使った際に、連想配列のハッシュキーを

{$array.$hash1_$hash2}

みたいな感じでアンダースコアで2つの変数を繋げたい場合がありました。

そのまま書いてみるとエラーで画面が表示されません。

そこで色々やってみた結果、繋げたいハッシュキーをassignでcatするという方法にたどり着きました。

{assign var='hash' value=$hash1|cat:'_':$hash2}
{$array.$hash}

こうするとちゃんとハッシュキーとして認識されました。

cat関数はsmartyテンプレート内で文字列を繋げる時に使う関数で、 何個も繋げる時は $var1|cat:$var2:var3:var4 という感じでいけるようです。

今回は(_)アンダースコアと$hash2を$hash1に繋げただけなので、 $hash1|cat:'_':$hash2 となっています。

面倒といえば面倒だけど、やってしまえばそれまでです。

2011年4月22日金曜日

UMA-ISO2の使い方が分からなくて苦労した

UMA-ISO2はNTFSに対応と書いてあったから、てっきりそのままNTFSフォーマットすれば使えるもんだと思ってました。

ところが実際のところそうではありませんでした・・
もしかして初代UMA-ISOを買わされた??と思うような感じなんですけど、どうなんでしょうか??

普通の外付けHDDとしては認識するし、BDドライブとしても認識はするんですけど、ディスプレイにはUnsupported FSと表示されていました。
_isoフォルダにisoファイルを入れても何も表示されません。
ファイルシステムがサポートされてませんってことなのでおかしいなぁ・・と思って試しにexFATでフォーマットしてみるとNO ISOと表示されてisoをマウントできるようになりました。
(isoをマウントするには、HDD内に「_iso」フォルダを作って、その中にisoファイルを入れて、一度「ハードウェアを安全に取り外してメディアを取りだす」をしてUSBを抜いてからもう一度差します。)
その後、i-odd.comのDownloadからNTFS用の最新のファームを_isoフォルダに入れて、USBを抜き差ししてジョグダイアルでファームのisoを選択してジョグを押すとディスプレイにLoadingと表示されてファームが更新されます。

それをまたNTFSでフォーマットかければやっと使えるようになりました。

これって分からずに諦めた人けっこういるんじゃないかなぁ・・

2011年3月17日木曜日

ISOファイルをDVDドライブとしてマウントできる外付けHDDケース UMA-ISO2

過去にバッファローとIO-DATAから同じようなHDDが発売されていました。
IO-DATAの方はメチャクチャ高かったけど、バッファローの方はまぁまぁの値段だったので購入したかったんですけど、どこ見ても売り切れです。

同じようなものを探して見つけたのがUMA-ISOなんですけど、それも売り切れ・・と思ってもうちょっと探してみるとUMA-ISO2というのが出たという情報にたどり着きました。
UMA-ISO2はHDDではなくHDDケースということですが、1万円くらいしました。
でもこういうのが一個あると本当に便利なので迷わず購入しました。

送料無料! UMA-ISO2 光学ドライブエミュレーション機能搭載 2.5インチ HDDケース [NTFS対応]
UMA-ISO2

実はまだ使ってませんが、近々ネットブックを購入する予定なので、それのドライブとして使うことになります。
ネットブックはこれの予定。
ASUS Eee PC 1015PEM with Office wimax Black 10.1型ワイドTFTカラー液晶 非光沢 ネットブック ブラック EPC1015PEM-WIBK
EPC1015PEM-WIBK

今までドライブ無しのノートパソコンは絶対に候補に上がることはなかったんですけど、外付けHDDでISOをマウントできるってのなら色々と問題が解決します。
DVDドライブだけ持ち歩くのは面倒ですけどHDDなら持ち歩けます。
1TBのHDDは無理という情報があったんですけど、まぁ750GBならいけるようなので十分です。

ディスクを一度ISOにする手間があるので最初は面倒ですけど、取り込んでしまえばあとは楽なもんです。
まぁインストール作業なんてのは滅多にしないと思いますけどね・・
僕が使うアプリの大半はフリーウェアでネット上からダウンロードできるものばかりです。

そう思うと、このHDDの出番は少ないかも・・
まぁ外付けHDDとして使うし問題ないか・・

2011年3月4日金曜日

苦労して作ったフラッシュが・・

結構苦労して作ったフルフラッシュサイトが2つありました。
両方とも半年くらい使われてたようですが、もう違うやつに入れ替わってました・・
今はフラッシュではなくHTMLになっています。
まぁ納品してしまったものがその後どうなろうと関係ないんですけどね。

こんな時代にフルフラッシュなんか提案するディレクターに問題があります。
バカなディレクターの案に乗ってしまったクライアントにも責任はあるんですけどね。
でもクライアントはWebのことなんて何も知らないから、ディレクターの言うがままになりがちです。
クライアントは、高い買い物なんだから最低限の知識を持ってディレクターと話すべきだと思います。

フルフラッシュというと、クライアントにとってはただの自己満足で、制作会社から見ると金の種ですが、プログラマーにしてみると面倒で割りに合わない作業です。
ユーザーから見るとただただ面倒臭いサイトです。
得するのは制作会社だけで、それ意外はあんまり良いことがないんじゃないかな?

フラッシュって制作会社からすると値段を釣り上げる為だけの要素ってことがあります。
特に安い案件の依頼を請けた時に、フラッシュを提案して3万〜5万くらい上乗せするというようなことを時々聞きます。

まぁフラッシュが悪いとは言いませんが、劇的に何かが変わることはそうないでしょう。
ユーザーがじっと我慢して見てくれる時間はせいぜい3〜5秒です。
それ以上長いと面倒臭くなってそのサイトから出ていってしまうかもしれません。

今時はフラッシュみたいなことをJavascriptでやってしまうことが多いし、その方が管理しやすいと思います。

たった半年ほどでボツになったフルフラッシュは、バカなディレクターの要求を全て満たしましたが、修正に修正を重ねた結果、制作者の僕も全く読めないコードになってました(w
最初の案と最終的にできたものは全く違うものでした。

Web系のディレクターはプログラムとか全く知らないのかな?
デザインはできるかもしれないけど、あまりにも簡単にプログラムの仕様変更を要求してきます。
微々たる修正ではなく、方向性が変わってしまうくらいの修正を何度もやりました。
プログラムを知らない奴がプログラムの案件に関わったらダメですよね。

2011年3月1日火曜日

64bitパソコンでMSCommコンポーネントを動かすには?

Windows2000のOffice2000で動いていたプログラムがありました。

ExcelのVBAとMySQLをODBCで接続して使うレジのアプリです。
これは、僕がまだまだプログラムの「プ」くらいが分かり始めたころに作ったプログラムなので今見ると無駄だらけでした・・

DWB48MRSというキャッシュドロワとパソコンを繋いでいて、会計処理が終わると同時にドロワが開くというプログラムが書かれています。

今回、パソコンの買い替えに伴って今までWindows2000のOffice2000で動かしていたそのExcelのレジを64bitのWindows7、Office2010環境に移すことになりました。

バージョンが随分離れているので、不具合は絶対に避けられないと思っていましたが案の定です。

まずキャッシュドロワを動かすのにMSCommコンポーネントというコンポーネントを使っていましたが、これはVB6の頃のコンポーネントなので64bitでは動きません。

OSが64bitだったとしても、Officeが32bit版だったら何とか動かせたと思うんです。
でも多分そのパソコンのOfficeは64bit版でした。動かなかったので・・

MSCOMM32.OCXというファイルをダウンロードして、コマンドプロンプトを管理者権限で起動して「regsvr32 c:\windows\system32\MSCOMM32.OCX」とかやれば動くようなことを書いてあったのでやってみたんですけど、やっぱりVBAのフォーム編集画面にコンポーネントのアイコンが出ませんでした。

まぁ無理なものは仕方ないし、結構急ぎの要件だったので、32bitのパソコンで動かすことになりました。OSはVistaでOffice2007です。

とりあえず動いたんですけど、やっぱりバージョンの違いのせいか思ったように動かないことが多々あります。
もう一度調整しないといけません。

結果として、まだやってませんけど、仮想環境にWindows2000、Office2000の環境を構築してそっちで動かすのが一番確実かな・・という結論を出しています。

その方法を使えば、今後どんなにOSがバージョンアップしても、Win2000環境を保持することが可能ですし、バックアップも移行も簡単に行えて理想的だと考えています。

とりあえずVMWare PlayerかVirtualPC辺りで試してみようと思っています。
仮想化って古い環境をそのまま新しい環境上で使えるのでとても便利だと思います。
この件がうまく動けば今後もしばらく安泰です。

2011年2月25日金曜日

MySQL テーブルのIDにbigintはどうか

毎週1回必ず40万レコード追加するテーブルがあります。
データ型はintで十分です。
unsignedにして約40億レコード登録できる計算なので約1万日は使えます。
毎週1回の処理を1万回なので約2,500ヶ月・・200年くらいの計算ですね。

それまでそのシステムが動いてるとは思えないし、僕は間違いなくこの世にはいません。

そのテーブルはintで十分なテーブルだったんですが、あまりそういう計算をせずに作ったので、bigintでやってしまいました・・何となくデカいデータになりそうだと思ったので・・・
実際のところ、int unsignedで毎日40万レコード追加だったとしても20年以上いけます。
bigintをIDのauto_incrementで使う時なんて、ちっぽけなアプリを作ってるうちはなさそうですね。
Twitterみたいなのを作ったら必要かもしれないけど。

もう納品したし、問題なく動いているので別にいいんですけど、やっぱりこういうのはしっかりと計算してからやらないとダメですね。

VARCHARの文字数とかも結構適当にやってしまいます。
メールアドレスは300くらいとか住所は200とか、電話番号は20とか、ちょっと余裕があるくらいで調整してますが、これも実際どうなんでしょうか?
余裕は必要だけど、余りすぎても問題だと思います。

今回納品した制作物と関連する別のパートで、別の業者が手がけてたんですが、VARCHARでやるようなところを全部TEXT型で宣言してました・・
これもちょっと良くないんじゃないの?と思ったけど、問題なく動いているのでいいのかなぁ??

何かプログラマーって結構適当ですよね(^^;
僕も含めて、なんちゃってプログラマーが増えすぎたのかな?
本物のプログラマーならこんな適当な仕事しないでしょうね。

悪いのは厳しい納期だ!と自分に言い訳をして放置します(w
今回のはコメントもほとんど書いてないや・・もうどんなプログラム書いてたか分からん(--;

2011年2月22日火曜日

ASUSのU30Jc-QX075VSを買おうかな・・

今、次のパソコンをどうするか考えているところです。
Windowsにすることはもう確定しました。

たまたまソフマップに寄ることができたので、ちょっとパソコン見学してみたところ、ASUSのU30Jc-QX075VSが良さそうな感じでした。

Windowsのノートって、今までPentium Mの頃のMebiusしか使ったことがないんですよね。
それまではショップブランドのデスクトップが中心だったし、ノートをメインに使うようになったのもここ4、5年の間です。
今はMacBookだし、Windowsノートを買うのってホント久しぶりです。

ASUSのノートってどうなんだろう?
値段が安いのは嬉しいです。
でも、パソコンは長く使うものだから、値段で妥協した買い方は絶対にしたくないです。
例えば、安物のパーツを使って安いパソコンを作っているのなら、僕はもう5万払ってでも良いパーツを使ったパソコンにしたいと考えます。

まぁスペックだけで見るなら、かなり理想に近い感じです。
64bitでCPUがi5、液晶が13.3インチ、メモリはデフォが2Gだけど、増設して8Gにします。
仮想環境を作るからi7が本当は欲しいんですけどね・・。
まぁ13.3インチなのでそこは仕方ないのかな・・。

メモリが2Gしか入ってないことが逆に良いかもしれないですね。
大概のパソコンは2Gのメモリ2枚で4Gで売っています。
これを8Gにしようと思ったら2枚とも外して4Gのメモリ2枚買わないといけないんですよね。かなり無駄です。

本体が安いからSSDへの換装もちょっと視野に入れてるんですけど、まだ高いですね・・。
しばらくはHDDで様子見た方がいいのかな・・

2011年2月18日金曜日

MacからWindowsに乗り換え〜次は64bit機で仮想環境を

今年やっとMacに乗り換えたところですが、またWindowsに戻ることにします。

やっぱりテキスト処理の問題でMacはちょっと使いにくいことがあります。
エディタで使ってるmiが悪いのか、Macそのものが悪いのかは分かりませんが、3Mb程度のテキストファイルの正規表現置き換えなんかで固まってしまいます。

5,000行程度のログファイルを一旦クリアしようと全選択して削除した時も固まりました。
元々テキストファイルを扱うことが多いので、こんなことではダメなんです・・

と言ってもMacをやめるわけではありません。
次のMacはWindows上の仮想環境で動かします。

次のパソコンは仮想環境をもっと充実させたいので、64bit機にメモリ8G積んでVMWare Workstationを導入するつもりです。

母体となるOSはWindows7になると思います。できればProfessionalがいいかな。
母体は必要最小限のアプリだけをインストールして、仮想環境に開発環境を整えていきたいところです。

多分Web閲覧とか普段使いのOSは仮想環境のMacになるような気がします。

2011年2月15日火曜日

XERAでPHPのsystem関数を使ってmysqlのバックアップデータを復元

XREAに限らず、PHPがセーフモードで動いているサーバーがけっこう多いと思います。

MySQLのバックアップデータをWeb上で復元するという処理が必要だったので、PHPのsystem関数を使わないといけませんでしたが、system関数ってのはセーフモードでは動かないので、XREAの場合はCGI版のPHPで実行しないといけません。

まずは.htaccessを編集して、system関数を実行するphpファイルをCGIとして動かすようにします。

<Files ファイル名.php>
AddHandler application/x-httpd-phpcgi .php
</Files>

それでsystem関数でバックアップデータ復元のコマンドを指定するんだけど、ここで一回つまずいた・・

$command = "mysql -u ログインID -pパスワード データベース名 < /virtual/XREAのユーザー名/バックアップファイル";
system($command);

と書いて実行してみたけど、うまくいかない。
sh: mysql: command not found となってしまいます。

パスが通ってないのかな?と思ってSSHで同じコマンドを実行すると正常にバックアップを復元できました。
パスは通ってるのに・・と思ったけど、とりあえずsystem関数でmysqlのフルパスを指定してみました。

$command = "/usr/local/mysql/bin/mysql -u ログインID -pパスワード データベース名 < /virtual/XREAのユーザー名/バックアップファイル";
system($command);

こうするとうまくいきました。

phpMyAdminからだと、アップロード可能容量の制限で大容量のバックアップファイルを復元することができないと思うので、一度サーバーにFTPでバックアップファイルをアップしてからこの方法で復元するということもできますね。

2011年2月11日金曜日

XREAが重い、データベース消えた、FTP繋がらない

XREAは安いからよく使うんだけど、最近ちょっと使い物にならなくなってきた感があります。

まずFTPの接続が悪くなってきましたね。
僕が使う時間帯が丁度重い時間帯なだけかもしれませんけど。
大体深夜の1時くらいです。

繋がらなかったり、アップロード中に切断されたり、接続するのにやたら時間がかかったり。
まぁそこは安いサーバーだから我慢します。

ちょっと酷かったのが、データベースの消失です。
あるサイトでWordpressを使ってるんだけど、カテゴリを管理するテーブルが丸々消えたことがあります。
記事のテーブルじゃなくて良かった。

原因はXREA側なのかWordpress側なのかは不明です。
テーブルが消えた時の状況というと、アクセスした瞬間「データベースに繋がりません」と出て、すぐにリロードすると今度は画面は出たけど記事が出ない。
それでしばらく待っても記事が出ないから、DBを直接見てみたらカテゴリのテーブルが消えてたという感じです。
まぁXREAが原因でしょうね・・

そのサイトは遊びのサイトだから別に消えてもいいんだけど、もしそれが重要なサイトだったとしたら大変なことです。
重要なサイトはXREAで運営しない方がいいと思います。
データベースを使わないなら別に問題ないかもしれないですけどね。
ファイルが消えたことは今のところありません。

まぁ趣味と実験用のサーバーとしては便利だと思います。
本気で運営するWebなら、格安サーバーはやめてもうちょっと良いサーバーにした方がいいでしょうね。

2011年2月7日月曜日

MacではなくWindowsを使わなければいけない時

かなりMacかWindowsかで悩んでるんですけど、またWindowsに傾くことが起こりました。


100万行近い規則正しいデータ(CSVのような感じ)の置き換えないといけないという場面がありました。

Macのエディタはとりあえずmiを使っているので、まずはmiでそのファイルを開きました。

データが大きいからなんたらかんたら・・とメッセージが出たけど構わず開く。
開くのに少し時間がかかりました。

そして、正規表現で置き換えを実行・・・・・






固まりました。


それどころか、一度再起動しないと重くてどうしようもない感じでした。

ちょっと急いでたので、「また落ちたら・・」と思うとmiを使う気になれず、VMWare FusionでWindowsを起動しました。

Windowsで愛用しているサクラエディタを起動。
多少開くのに時間がかかったものの、プログレスバーで何となく進捗が分かるので安心でした。

そして、同じ正規表現の置き換えを実行。
これが速かった!

当然100万行近いデータなので数秒は待ちました。
ここでもまたプログレスバーが出てたので、安心して待てました。

Macは大きいファイルの扱いに弱いのか・・
よく分からないけど、とにかくサクラエディタは使いやすいです。

やっぱりWindowsが良いのかな・・

2011年2月4日金曜日

WindowsでもMacが動く・・

詳しい人にしてみれば当たり前なことかもしれないんですけど、こんな記事をみつけてしまいました。

http://www.lifehacker.jp/2010/07/100716virutalbox.html

Windows上でMacを動かすことができるということです。

Intel CPUのMacでWindowsを動かすのと違って動作の保障はないと思いますけど、ちょっと画面確認とかする程度なら十分だと思います。

この方法を使ってWindows上のMacでiPhoneアプリの勉強をしている人がいます。

やっとMacに慣れてきたところなんだけど、この記事を見てまたWindowsに戻ろうかと考えてしまいました。

やっぱりMacにはOfficeの問題があるので、WindowsベースでMacが動いてくれる方が仕事はやりやすいです。

普通に趣味として使うだけならMacの方が楽しくていいんだけど、趣味用と仕事用に1台ずつ買える程裕福じゃありません。

本気で次もMacを買おうと思ってたんだけど、今はかなり気持ちが揺れています。

元々Macを買った初期衝動はWindowsも動くし・・というのが大きかったです。
その理由はこの記事で崩れ去りました。

今はMacにも慣れて結構お気に入りです。
開発環境も自分なりに整えたし、Spacesをうまく使ってそれなりに快適にできています。
でもOffice関連で仕事では不便しています。

次どうしようか・・悩みます・・。
ぶっちゃけかなりWindowsに傾いてます。

2011年2月1日火曜日

MySQLでNOT INの代わりにNOT EXISTSを使うと速い

ちょっとした情報を取り出す時のクエリが30秒ほどかかったので、何とか改善できないものかと試行錯誤してみました。

2つのテーブルがあって、仮に

■顧客情報
t_client_info ( client_id, name, address)
■顧客履歴
t_client_history (id, client_id, visit_date)

とでもしましょう。

visit_dateはdate型ではなくてint型でYYYYMMDDの形式とします。
あとは見たまんまなのでテーブルの説明は省略ます。

2010年の元旦から1年以内に来店した顧客の住所と最終来店日を取得するというクエリです。
1年のうちに1回しか来なかった人は省くことにします。


SELECT i.client_id, name, address, MAX(visit_date) as vdate
FROM t_client_info AS i
LEFT JOIN t_client_history AS h
ON i.client_id = h.client_id
WHERE visit_date > 20100101
AND i.client_id NOT IN (
SELECT client_id
FROM t_client_history
WHERE visit_date > 20100101
GROUP BY client_id
HAVING COUNT(visit_date) = 1
)

GROUP BY i.client_id, name, address
ORDER BY vdate DESC


こんな感じでやってみると、30秒かかりました。
サブクエリ単体の実行速度はそんなに遅くなかったので、多分NOT INがダメなんだろうなと思って、NOT EXISTSを使ってみることに。


SELECT i.client_id, name, address, MAX(visit_date) as vdate
FROM t_client_info AS i
LEFT JOIN t_client_history AS h
ON i.client_id = h.client_id
WHERE visit_date > 20100101
AND NOT EXISTS (
SELECT client_id
FROM t_client_historr
WHERE visit_date > 20100101
AND i.client_id = client_id
GROUP BY client_id
HAVING COUNT(visit_date) = 1
)

GROUP BY i.client_id, name, address
ORDER BY vdate DESC


こんな感じになりました。
これで一瞬で表示されました。

NOT INの方が読みやすいんですけどね。
ここまで速度に差が出ると可読性なんてこだわってられません。

2011年1月28日金曜日

Chrome OSが気になる

「全てがWebアプリケーションとして動作する」というのが何か良いですね。
ネットに繋がってなくても動くんでしょうか?

ネットで調べて見つかる情報を見る限りでは、ネットブックが中心なイメージです。
でも、大きな端末から小さな端末まで幅広いインターフェースがあるようなことも書いてあるし、普通にデスクトップのOSとしても使えるということでしょう。

一度VMWare FusionでRC版を動かしてみたんですけど、速度的には良い感じがします。
起動は速いし動作も快適な気がします。
Webを開くと日本語が表示されなかったので調べてたら、面倒になってやめました・・。
じっくり使うほどの暇はないので、本当にただ起動させて触ってみただけです。

まぁどんな端末でも使えるのは当然のことです。
メインのOSとしての役割を果たせるかどうかが重要ですね。
メインはWindowsだけど、ネットブックはChrome OSみたいになるくらいなら、両方Windowsに統一した方が良さそうな気がします。

僕の場合はMacだから、またちょっと事情が違うけどね。
Macのネットブックってないですよね?
11インチのMacBook Airがその役割を果たすのかな?
でもネットブックで9万円はちょっと高いか・・

2011年1月25日火曜日

ChromeでPOSTしたページのソース表示ができない

結構面倒な仕様ですね。
要素の検証とかFirebugで見て何とかなることもあるけど、生のソースでないと分からないこともあります。

今のところPostしたページのソースを取りたい時はFirefoxとか他のブラウザでアクセスして取るしかなさそうです。

View Selection Source(https://chrome.google.com/extensions/detail/fbhgckgfljgjkkfngcoeajbgndkeoaaj)あたりのエクステンションを使っても良さそうだけど、OSXじゃ動かないってコメント書いてあるしなぁ・・

ChromeはまだFirefoxには及ばないなぁと思いますね。

マウスジェスチャーのエクステンションも入れてるけど、Firefoxほどキビキビと動かないし、FirefoxのLive HTTP Headers(https://addons.mozilla.org/ja/firefox/addon/3829/)とFire Mobile Simulator(http://firemobilesimulator.org/)は時々必要なアドオンなんですけど、Chromeにはそれに値するエクステンションがありません。
あったら教えて下さい。

「Chromeのエクステンション制作は基本的にWeb制作と同じだから簡単だ」みたいな記事を見たことがあります。
時間があればちょっとやってみたいな。

2011年1月21日金曜日

WindowsからMacに乗り換えて良かったか?

Macはまだ2年目です。
良い悪いを判断できるほどMacを使ってないけど、最近になってやっとWindows離れができてきました。
でも仕事ではどうしてもWindowsが必要なので、VMWare Fusionを入れて使ってます。

正直言うとMacは「安易な気持ちと勢い」で買いました。
「どうせWindowsも動くんだしMacが合わなかったとしてもWindows使えば・・」という考えと、特にMacで何ができるか分からないけど、「とにかく触ってみたい」というだけの気持ちでした。

こういう気持ちで買ってしまうと、結局慣れているWindowsしか使わないことになってしまうんですよね。
実際に最初の1年はほとんどWindowsしか使ってませんでした。
最初はBootCampでWindowsを使ってたから、余計にMacを起動する機会が減りましたね。
MacでWindowsを動かしたいなら、多少パフォーマンスが落ちてもVMWare FusionとかParallels Desktopを使わないと、どっちかに偏ってしまうと思います。
VMWare Fusionがオススメですね。

Mac で Windows を動かすなら VMware Fusion


Macは「仕事」ということを考えると不便な面が多々あるように思います。
Officeがネックですね。仕事と言えばWord、Excelはどこかで絡んできます。
僕はMacのOfficeを持ってないし使ったこともないので何とも言えないけど、やっぱりOfficeはWindowsという感じがします。
互換性はあると思うけど、VBAまでしっかり動くとは思えないですね。

今のところ、VMWareのWindowsからOfficeを利用しています。
でも、Officeの為だけにWindowsを起動するのは面倒だし、メモリも結構食われて全体のパフォーマンスが悪くなります。
MacとWindowsを両方開かないと仕事ができないのでは効率悪いですよね。
こうなると、「どちらかに統一した方が・・」と考えてしまいます。
かと言って、MacのOfficeを導入する気にはなりません。Office 2008はかなり評判悪かったみたいですしね。
この辺り、Macを購入するにあたってよく考えないといけない部分だと思います。

キーボードの配置で、CTRLボタンとか、かなキーの違いのせいで、Windowsパソコンを使う時にミスタッチが増えたかな・・
Windowsだと、CTRLボタンを小指で押せるけど、MacのCommandボタンは場所的に薬指になります。
慣れの問題かもしれないけど、薬指を取られると他のボタンが押しにくいんですよね。
僕の場合は用途によって小指で押したり親指で押したりを切り替えます。
当然ホームポジションは崩れますね・・

VMWare等でWindowsを動かすにはソフトを購入しないといけません。
Officeまで買うとなると4万円くらい必要です。
Macは初期投資額が結構かかるんですよね。
MacのAppStoreがオープンしたので、余計にソフトを購入する機会が増えるかもしれません。

あと、単純に使い勝手がWindowsと違うし、慣れるまではちょっと戸惑うかも。
タスクバーがないのがなかなか慣れなかったかな・・

僕がMacに乗り換えて最初に不便に思ったことと言えばこんな感じですね。


まぁ何だかんだとありつつも、多分僕が次に買うパソコンはMacになるでしょう。
初期投資額の4万円程度はMacとWindowsが両方使えるというメリットを考えると安いくらいだと考えます。

Macの良いところは、細かいことをどうこう言うよりも、使ってて「何か楽しい」というのが一番な気がします。
仕事のことを考えるならWindowsにしておけば無難だし、使い慣れてるんだけど、何故か次もMacを買おうと思っているんです。

インターネットするだけならWindowsと大差ないです。
フォントが滑らかなので、Windowsで見るよりもWebの見栄えが良いように感じると思います。
ブラウザも主要なものはMac版があるので問題ありません。
IEはもうないですけどね・・

開発環境的なことを言うと、やり方によってはWindowsよりも使いやすいかもしれません。
僕の場合、Spacesを使ってIDE(Eclipse)やブラウザ、資料のテキスト、PDFなんかを好みの画面に割り振って、切り替えながら使っています。


WindowsからMacへの乗り換えを検討しているなら、前にも書いたけど、「Officeをどうするか」・・が重要だと思います。
VBAでかなり作りこんだものを扱う機会が多いならWindowsが必須になると思います。

簡単なWordやExcelファイルなら、Googleドキュメントで開いてしまうというのも一つの手だと思います。


WindowsからMacへ乗り換えるのは結構大変でした。
ネットとメールくらいしかしないなら、どっちを使っても差はないと思うけど、僕の場合は開発環境の問題があったので、慣れたWindowsからなかなか離れられなかったです。
ほぼMac環境に移行できたのは、今年2011年に入ってからです。
実質2年間はMacを持ちながらほとんどWindowsで仕事してたということになります。

VMWare Fusionを導入した1年前くらいから徐々にMacを使うようになり、少しずつMacに慣れていき、やっと乗り換えできたという感じです。

単純にWindowsとMacが動くという理由だけで最初からMacには満足してたけど、開発環境が整った今、本当にMacを選んで良かったと思えるようになってきました。

今はもっとMacを快適に使う方法を模索しています。

2011年1月18日火曜日

Gmailで独自ドメインのメールを管理

Gmailにしてからというもの、メール管理がかなり楽になりました。

Google AppsというサービスのGmailなら、ちょっとドメイン側の設定すればGmailのメールサーバーを使って独自ドメインのメールを管理できますが、僕がやっているのはGoogle Appsではなく普通のGmailで独自ドメインメールを管理する方法です。

■独自ドメインメールの設定
まず、独自ドメインのメールはGmailに転送する設定にします。

■アカウントのインポート
Gmailへアクセスし、画面右上「設定」を選び、「アカウントのインポート」を選択。
そこの「名前」の項目から「別のアドレスからメッセージを送信」のボタンを押す。
そして、送信時に表示される名前を入力して、Gmailに転送している独自ドメインのメールアドレスを入力。
「Gmail経由で送信する」を選んで確認メールを送信。
すると、独自ドメインのメールに確認メールが届くので、送られてきたURLをクリック。
そうすると、Gmail送信時に送信メールアドレスを選択できるようになり、Gmailから独自ドメインのメールを利用できるような感じになります。

■返信時の設定
そして、もう一度Gmail設定の「アカウントのインポート」へ行き、「名前」項目の「メッセージの受信時」の項目を「メールを受信したアドレスから返信する」にチェック。
こうすることで、例えばGmailのアドレスで受けたメールの返信時にはGmailのアドレスで、独自ドメインのアドレスで受けたメールの返信は独自ドメインのメールで返信することができます。

「メール作成」の時のfrom項目がセレクトボックスになって、独自ドメインのメールアドレスを選択できるようになります。

メールを外部化できるメリットはかなり大きいです。
例えばパソコンが壊れてしまってもメールはGmailに行けばいつでも見れます。
外出先でもメールチェックができます。
携帯からでもチェックできます。

情報を手ぶらで持ち歩いているような感じです。
あとは、適切にラベルを振り分ければ、メールの管理がより楽になります。

■ラベル付け
Gmailの設定で、「フィルタ」へ行き、「新しいフィルタを作成」
Toの項目に独自ドメインのメールアドレスを入力し、一度「フィルタテスト」を実行。
独自ドメイン宛に送られたメールが表示されればOKです。
「次のステップ」へ行き、「ラベルを付ける」にチェック→「新しいラベル」で任意の名前のラベルを作り、「フィルタを作成」。

こうすると、独自ドメインに送信されたメールにはラベルが付くので仕分けが簡単にできます。

僕はHotmailと独自ドメインとGmailの3つをこれで管理しています。
他に、フィルタでFromの項目を編集して、仕事のメールを振り分けています。
例えば、「○○@myclient.jp」という仕事先があったとすると、Fromの項目に 「*@myclient.jp」と入力すれば、「*」の部分がinfoだろうとadminだろうと全て振り分けてくれます。
複数のドメインからのアドレスを一つのラベルにまとめる場合は、Fromの項目を「OR」で複数指定します。
「*@myclient.jp OR *@other-client.jp OR *@ignore.jp」というような感じですね。

もうWindows Live Mailなんて削除しました。
一応ThunderbirdでGmailを受信できるように設定してますが、2回くらいしか起動したことがありません。
ブラウザを起動すればiGoogleで最新メールのチェックができますし、Gmailのエクステンション(https://chrome.google.com/extensions/detail/mihcahmgecmbnbcchbopgniflfhgnkff)を入れているので、iGoogleを開かなくてもブラウザ上で確認できます。

この環境に慣れるともうメーラーなんて使えませんね。

2011年1月14日金曜日

Evernoteでメモを外部化

あんまり使わないだろうな・・と思ってたEvernoteですが、思った以上に強力なサービスでした。
ちょっとしたメモを残したり、写真や音声、PDFなんかもアップロードできるサービスです。

正直なところ、「メモを残す」という行為を日常やってなかったので、Evernoteという名前やサービスの概要を知っていても興味がなかったです。

Evernoteの使い始めの頃は、意識して使うように心がけました。
本屋さんでちょっと気になった内容の本があったら、忘れる前にEvernoteに題名を書いておいて、帰ってから調べてみるというような使い方です。
iPhoneを使っているので、Evernoteのアプリから簡単に同期がとれます。

プログラミング関係の本をよく見に行くんですが、この手の本は評判が重要です。
その場でAmazonの評価を見てもいいんですけど、こういう作業は家でじっくりとしたいので、書店ではメモを取るだけで十分です。

スナップショットなんかも同期できるんですが、さすがに書店でスナップショットを撮るのは問題なのでメモは手入力です。

こういうことをやってるうちに、Evernoteを使う癖がついてきました。
なんでもとりあえずメモです。
結構今までだと、気になったことでも家に帰る頃には忘れているなんてことがあったんですが、そういうのが減りましたね。

最近は、MacでapacheやPHPのバージョンアップ時にやったconfigureの内容とか、アプリの設定方法とか、ちょっとしたマニュアルにもなっています。

これもブラウザの拡張機能で使えます。
Firefox(https://addons.mozilla.org/ja/firefox/addon/8381/)
Chrome(https://chrome.google.com/extensions/detail/pioclpoplcdbaefihamjohnefbikjilc?hl=ja)
何かちょっと物足りないですけどね・・

2011年1月11日火曜日

Xmarks・・ブックマークを外部化する

ブックマークはOSの再インストールをする時についついバックアップを忘れてしまいがちな項目です。
それに、外出先で借りるパソコンには自分のブックマークが入っているはずもなく不便することがあります。
ということで、クラウドを利用してブックマークを外部で管理することにしました。

色々なブックマーク管理のサービスはありますが、まず最初に利用したのは我らがGoogleのブックマークです。
Firefoxのアドオンを利用して同期してたんですが、ちょっと使いにくい感があったので、色々調べてみてXmarks(http://www.xmarks.com/)というサービスを発見しました。
これもFirefoxのアドオン(https://addons.mozilla.org/ja/firefox/addon/2410/)で同期をとってやってみたんですが、Googleブックマークのアドオンより使いやすかったです。

ちなみに今のメインブラウザはChromeなので、Chromeのエクステンションを利用しています。(https://chrome.google.com/extensions/detail/ajpgkpeckebdhofmmjfgcjjiiejpodla?hl=ja)

クラウドの便利なところはやっぱりパソコンが変わっても同期をとって同じ環境を復元できるというところですね。
特に僕のように、ベースがMacだけどVMWare FusionでWindowsを使ってるような環境だと、両方のブックマークを同じに保てることって結構便利なんです。

できることならGoogleのサービスで統一したかったです。
一元化できるものは一元化したいですしね。

2011年1月7日金曜日

Fencesをアンインストールしたらフォルダが消えた

Fencesというフリーウェアを使ってました。
乱雑にアイコンが散らかったデスクトップを整頓するのに便利なソフトです。

まぁ便利だったんですけど、パソコンの起動速度や全体的なパフォーマンスが体感で悪くなったと感じるようになったので、アンインストールしました。

パフォーマンスの問題は僕のパソコン環境の問題なので、Fencesが悪いわけではないと思います。
できることならずっと使っていたかったソフトです。
僕のパソコン環境は、MacにVMWare Fusionを入れてWindows7を動かしているので、元々Windows自体のパフォーマンスも良くないです。
それなりのスペックのパソコンなら快適に動作するんだと思います。

本題のアンインストールの話ですが、アンインストール中に2回程ダイアログで何か確認メッセージが出ました。
あまり読まずにそのまま「はい」を選んでしまったせいか、デスクトップから一部のフォルダが消えてしまいました。

かなり重要なフォルダもあったので、一瞬青ざめてしまいました・・。
そこで、一度デスクトップ上で右クリックして、「並べ替え」を実行すると無事消えたフォルダが出てきました。
デスクトップの画面の外に飛ばされていただけだったようです。

ホント焦りました。

2011年1月4日火曜日

パソコン環境一新に伴って

2010年末にパソコン環境の見直しをした結果、クラウドを利用して外部で管理するものを増やしていこうということにしました。

クラウドなんてのはずっと前から言われてますけど、去年まではあんまり意識してませんでした。
変化が訪れたのは、Windows Live Mailで受信していたメールが突然全部壊れた時・・
色々やったけど復旧できず、ここで唯一残ったのはHotmailで受信していたメールのみ。
Webメールの良さを再認識しましたね。

これを切っ掛けにGmailを使うようになりました。
Hotmailが悪いわけではないんですが、独自ドメインのメールも全部Gmailで管理できるので乗り換えることにしました。
いわゆるなり済まし機能とでも言いましょうか、Gmailを使うけど、送信者情報は独自ドメインのメールアドレスにして、独自ドメインのメールアドレスに受信するとGmailに転送する設定です。
今はHotmailも含めて3つのメールアドレスをGmailだけで管理しています。

こんなことから情報の外部化・・クラウドを意識したパソコン環境を考えるようになりました。

Googleのサービスは検索とウェブマスターツールとAnalyticsくらいは以前から使ってたんですが、他にも色々便利なサービスがあります。当然Gmailもその一つです。
今、主に使うGoogleのサービスは、Gmailとドキュメントとカレンダー くらいです。

これらのサービスをiGoogleでまとめて表示させて、ブラウザのホームに設定したらかなり便利になりました。

今回はGoogleのサービスをもっと積極的に使っていこうと思いBloggerサービスを使ってみることにしてみました。
個人的で非公開なブログは持ってるんですが、こういうサービスを使ってみるのも面白そうです。
もうちょっと落ち着いたらブログデザインのカスタマイズなんかもやってみたいです。