読者です 読者をやめる 読者になる 読者になる

PhpStormで選択箇所のインデントを揃える方法

PhpStormで記述済みの箇所のインデントを揃える(Emacsの『indent-resion』/vimの『==』)方法のメモ

範囲選択後

メニュー)
"Code" > "Auto-Indent Lines"

ショートカット)
Mac : control + option + "I"
Windows : Control + Alt + "I"

JobTrackerを起動しようとしたら『Does not contain a valid host:port authority: local』のエラー

yumでインストールしたhadoopで、JobTrackerを起動しようとしたところ、以下のエラーが発生。

2013-02-25 16:11:28,920 FATAL org.apache.hadoop.mapred.JobTracker: java.lang.IllegalArgumentException: Does not contain a valid host:port authority: local
	at org.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:162)
	at org.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:128)
	at org.apache.hadoop.mapred.JobTracker.getAddress(JobTracker.java:2560)
	at org.apache.hadoop.mapred.JobTracker.(JobTracker.java:2200)
	at org.apache.hadoop.mapred.JobTracker.(JobTracker.java:2192)
	at org.apache.hadoop.mapred.JobTracker.(JobTracker.java:2186)
	at org.apache.hadoop.mapred.JobTracker.startTracker(JobTracker.java:300)
	at org.apache.hadoop.mapred.JobTracker.startTracker(JobTracker.java:291)
	at org.apache.hadoop.mapred.JobTracker.main(JobTracker.java:4978)

参考にしてたサイトのHadoopのバージョン(0.1系)と、自分が試していたバージョン(1系)が違った為、設定する名前が違った模様。

mapred-site.xml

『mapreduce.jobtracker.address』を『mapred.job.tracker』に変更。

<configuration>
  <property>
    <name>mapreduce.jobtracker.address</name>
    <value>master:54311</value>
  </property>
  <property>
    <name>mapreduce.cluster.local.dir</name>
    <value>${hadoop.tmp.dir}/mapred</value>
  </property>
</configuration>

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>master:54311</value>
  </property>
  <property>
    <name>mapreduce.cluster.local.dir</name>
    <value>${hadoop.tmp.dir}/mapred</value>
  </property>
</configuration>

FuelPHPでMongoDBを使用する場合のサンプル

設定については下記URL参照。
http://fuelphp.jp/docs/1.5/classes/mongo/introduction.html

FuelPHPのMongoDBクラスを使用したデータ取得等のサンプル。

想定バージョン : FuelPHP 1.5

instance

<?php
$mongo = \Mongo_Db::instance();

get / get_one / get_where

データ取得系

<?php
// SELECT * FROM $collection_name WHERE type = 1;
$mongo->where(array('type' => 1));
$result1 = $mongo->get($collection_name);

// SELECT * FROM $collection_name WHERE type = 1 LIMIT 1;
$mongo->where(array('type' => 1));
$result2 = $mongo->get_one($collection_name);

// SELECT * FROM $collection_name WHERE type = 1 LIMIT $limit;
$result3 = $mongo->get_where($collection_name, where(array('type' => 1)), $limit);

get_cursor

結果を全て変数に格納するわけではなく、都度取得する形の為、データサイズを抑えられる。

<?php
$mongo->where(array('type' => 1));
$result = $mongo->get_cursor($collection_name)->skip(100)->limit(3);

var_dump($result->getNext()); // このタイミングで問い合わせが発生

// または

foreach ($result as $val) {
    var_dump($val); // このタイミングで問い合わせが発生
}

select

<?php
// SELECT name FROM $collection_name;
$mongo->select(array('name'));
$result = $mongo->get($collection_name);

// 上記とは逆に、nameを除外
$mongo->select(array(), array('name'));

WHERE条件

取得データの型とWHEREで指定する値の型が合っていないとひっかからない為注意

<?php
// SELECT * FROM $collection_name WHERE type = 1;
$mongo->where(array('type' => 1));
$result = $mongo->get($collection_name);

// WHERE type = 1 OR type = 2
$mongo->or_where(array('type' => 1))->or_where(array('type' => 2));

// WHERE type IN (1, 2)
$mongo->where_in('type', array(1, 2));

// typeに1,2,3が全て含まれるものが対象
$mongo->where_in_all('type', array(1, 2, 3));

// typeに1,2,3どの値も含まれないいないものが対象
$mongo->where_not_in('type', array(1, 2, 3));

// WHERE type > 5
$mongo->where_gt(array('type', 5));

// WHERE type >= 5
$mongo->where_gte(array('type', 5));

// WHERE type < 10;
$mongo->where_lt(array('type', 10));

// WHERE type <= 10
$mongo->where_lte(array('type', 10));

// WHERE type BETWEEN 5 AND 10;
$mongo->where_between('type', 5, 10);

// WHERE type > 5 AND type < 10;
$mongo->where_between_ne('type', 5, 10);

// WHERE type <> 1;
$mongo->where_ne('type', 1);

// WHERE name LIKE '%fran%';
$mongo->like('name', 'fran', 'im', true, true);

※likeの3番目の引数についてはmethod_likeを参照

count

<?php
// SELECT COUNT(*) FROM $collection_name;
$num = $mongo->count($collection_name);

insert / update / update_all / delete

更新系

<?php
/*
 * INSERT INTO $collection_name
 *   (name, surname, email)
 * VALUES
 *   ('John', 'Doe', 'dont.em@ilme.com');
 */
$insert_id = $mongo->insert($collection_name, array(
    'name' => 'John',
    'surname' => 'Doe',
    'email' => 'dont.em@ilme.com',
));

/*
 * UPDATE
 *   $collection_name
 * SET
 *   surname = 'Doe2'
 * WHERE
 *   name => 'John'
 * LIMIT 1;
 */
$bool = $mongo->where(array('name' => 'John'))->update($collection_name, array(
    'surname' => 'Doe2',
));

/*
 * UPDATE
 *   $collection_name
 * SET
 *   surname = 'Doe3'
 * WHERE
 *   name => 'John';
 */
$bool = $mongodb->where(array('name' => 'John'))->update_all($collection_name, array(
    'surname' => 'Doe3',
));

/*
 * DELETE FROM $collection_name WHERE name = 'John' LIMIT 1;
 */
$bool = $mongodb->where(array('name' => 'John'))->delete($collection_name);

/*
 * DELETE FROM $collection_name WHERE name = 'John';
 */
$bool = $mongodb->where(array('name' => 'John'))->delete_all($collection_name);

Macターミナルのプロンプトの色を変更

※2013/02/12追記
(要調査)下記設定を行った場合、ターミナルの横幅を超える文字列を入力すると表示がおかしくなるようです

コメントで頂きました。ありがとうございます!
制御文字列を \[ \] で囲むといけるようです。


Macのターミナルが
f:id:BTT:20130209230547p:plain
こんな感じや
f:id:BTT:20130209230558p:plain
こんな感じで、プロンプトとコマンドが同じ色で、若干見づらいので変更。

ターミナルで古いものを遡る時も、色付いてた方が見やすいしね。

初期状態

初期状態では以下が設定されているので、これをベースに色を付ける。

$ echo $PS1
PS1='\h:\W \u\$ '

※\h や \W 等の意味は下記URL参照
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/002cngprmpt.html

以下の表を参考に色を決定。

Regular Bold Underline Background
Black \e[0;30m \e[1;30m \e[4;30m \e[40m
Red \e[0;31m \e[1;31m \e[4;31m \e[41m
Green \e[0;32m \e[1;32m \e[4;32m \e[42m
Yellow \e[0;33m \e[1;33m \e[4;33m \e[43m
Blue \e[0;34m \e[1;34m \e[4;34m \e[44m
Purple \e[0;35m \e[1;35m \e[4;35m \e[45m
Cyan \e[0;36m \e[1;36m \e[4;36m \e[46m
White \e[0;37m \e[1;37m \e[4;37m \e[47m

Reset \e[0m

例)

  • Red --> \e[0;30m
  • Green Bold --> \e[1;32m

試しに

まずはターミナル上で色々試してみる。
環境変数PS1に対し、上記の色の設定を入れれば、それ以降が指定の色になるのだけれど、コマンドも同じ色になってしまう為、最後にリセットのコードを入れてやる。

例1
$ PS1='\e[0;31m\h:\W \u\$ \e[0m'

f:id:BTT:20130209233900p:plain

例2
$ PS1='\e[1;34m\h:\W \e[1;32m\u\$ \e[0m'

f:id:BTT:20130209234207p:plain

例3
$ PS1='\e[46m\h:\W \u\$\e[0m '

f:id:BTT:20130209234804p:plain

設定

色が決まれば、単純に『~/.bash_profile』に設定を追記すればOK。

...のはずなんだけど、Macのターミナルは初期で背景色が違うプロファイルが複数あり、どのプロファイルでターミナルを立ち上げても、同じPS1になり、かえって見づらくなってしまう。

そこでプロファイル毎の設定を行う。

『ターミナル > 環境設定 > 設定するプロファイル > シェル』 の『起動』に以下を設定。

  • 『コマンドを実行』にチェックを入れ、『PS1='(実際に設定する値)'; clear』を入力
  • 『シェル内で実行』にチェックを入れる

※ターミナルを立ち上げる度、コマンド履歴にPS1の設定が残ってしまうのが難点。

VMwarePlayerを使用したPHP開発環境の構築手順

Linux初心者向けに、VMwarePlayerを使用した開発環境の構築手順をレクチャーする機会があったので、メモとして書き残しておきます。

簡単に環境を用意したい場合、あらかじめserverを含んだイメージを使用するのが楽ですが、今回は勉強も兼ねてminimalのイメージを使用。(manすら入っていないという...)

1. VMware Playerインストール

VMware Playerが無いと始まらないので、下記URLよりVMware Playerをダウンロードしインストールします。個人利用であれば、無償で使用可能です。

http://www.vmware.com/jp/products/desktop_virtualization/player/overview.html

2. CentOSのイメージを入手

手っ取り早く、下記サイトからCentOSのイメージ(CentOS 6.0, minimal install)をダウンロードし解凍します。

http://www.thoughtpolice.co.uk/vmware/

知らない奴が作ったイメージなんか使えるかー!って人は、こういうサイトを参考にisoからインストールすればいいと思うよ。

VMware PlayerでCentOSをインストール | Yukun's Blog
簡単!CentOS仮想環境の作り方 (Windows編) | ブログ | 株式会社イー・エージェンシー

3. CentOS起動

VMware Playerで、先ほど入手したCentOSをいざ起動。

4. root用パスワード変更

CentOSが立ち上がったら、まずはrootでログインし、
この訳の分からない初期パスワード(thoughtpolice)を変更します。

# passwd
New password: {新規パスワード入力}
Retype new password: {新規パスワード入力}

5. キーボード変更

ダウンロードしたイメージは、初期が英語キーボードになっているので、
日本語キーボードに変更します。

# vi /etc/sysconfig/keyboard

    KEYTABLE="jp106"

6. タイムゾーン変更

タイムゾーンも初期でJSTになっていない為、要変更。

# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

7. ネットワーク設定

さらにはネットワークまで初期ではオンにならない為、設定します。
今回は固定のIPアドレスではなくDHCPで設定。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

    BOOTPROTO="dhcp"
    ONBOOT="yes"

# service network restart

問題なくIPアドレスが取得出来ているか確認。

# ifconfig

8. ユーザー作成

プライベートな開発環境とはいえ、常にrootで作業するわけにもいかないので、ユーザーを作成後、パスワード設定を行います。

# useradd {ユーザー名}
# passwd {ユーザー名}

※この時点のコピーなりスナップショットなりを取っておけば、環境が簡単に増やせたり、元に戻せたりするので楽

9. SSH接続

ここまでの設定が完了したら、SSHで接続出来る状態になっているはずです。

使い慣れたSSHクライアントを使用し、『7. ネットワーク設定』で確認したIPアドレスに対し、『8. ユーザー作成』で作成したユーザーでSSH接続を行います。

10. 各種インストール

yumを使用しApache, MySQL, PHPのインストールを行います。

10.1. Apache

# yum install httpd httpd-devel
# service httpd start

10.2. MySQL

# yum install mysql-server mysql-devel
# service mysqld start
# /usr/bin/mysql_secure_installation

10.3. PHP

用途に応じて必要なパッケージをインストール

# yum install php-cli php-common php-devel php-mysql php-xml php-mbstring

11. iptables設定

初期状態では80番ポートへのアクセスが、iptablesで弾かれていますので、アクセス出来るよう設定を変更します。

# vi /etc/sysconfig/iptables

    -A INPUT -p tcp --dport 80 -j ACCEPT

# service iptables restart

12. ページ表示

ここまで完了したら、PHPの動作確認を行います。

DocumentRoot配下に、以下のような適当なPHPファイルを配置し、他のマシンのブラウザから見えればOK!

# echo '<?php phpinfo() ?>' > /var/www/html/info.php

補足

他にも行った方がいいであろう設定

  • NTP設定
  • ユーザーの鍵登録
  • sudo設定

FuelPHPのMongoDBクラスで『_id』を条件にfindする

想定バージョン : FuelPHP 1.4

MongoDBのドキュメントは『_id』というユニークなキーを持っています。

http://www.mongodb.org/pages/viewpage.action?pageId=7831684

『_id』については、上記公式サイトに詳しい説明が載っていますが、
通常、下記のように、12バイトの値が自動割り振られます。

> db.hoge.insert({name:"test1"})
> db.hoge.find()
{ "_id" : ObjectId("50ebba320296f684bea7c51f"), "name" : "test1" }

割り振られるのが、オブジェクトID用の特別なBSONデータタイプの為、
検索時、値をそのまま渡してしまうと、何もひっかかりません。

// ひっかからない
> db.hoge.find({_id:"50ebba320296f684bea7c51f"})

// ひっかかる
> db.hoge.find({_id:ObjectId("50ebba320296f684bea7c51f")})
{ "_id" : ObjectId("50ebba320296f684bea7c51f"), "name" : "test1" }

これはFuelPHPのMongoDBクラスでも同じです。

<?php
...
    $mongo = \Mongo_Db::instance();
    print_r($mongo->get_where('hoge', array('_id' => '50ebba320296f684bea7c51f')));

    /* [結果]
     *   Array
     *   (
     *   )
     */

で、本題の『_id』をピンポイントで取得する方法ですが、
FuelPHPのMongoDBクラスには、これ用の関数が用意されていない為、
PECL mongoのMongoIdを使用します。

<?php
...
    $mongo = \Mongo_Db::instance();
    print_r($mongo->get_where('hoge', array('_id' => new \MongoId('50ebba320296f684bea7c51f'))));

    /* [結果]
     *   Array
     *   (
     *     [0] => Array
     *       (
     *         [_id] => MongoId Object
     *           (
     *             [$id] => 50ebba320296f684bea7c51f
     *           )
     *
     *         [name] => test1
     *       )
     *   )
     */

ちなみに、MongoDBクラスで取得した『_id』は、
以下のようにそのまま使用可能です。

<?php
...
    $mongo = \Mongo_Db::instance();
    $hoge_list = $mongo->get('hoge');
    foreach ($hoge_list as $hoge) {
        $mongo->where(array('_id' => $val['_id']))->update('hoge', array(
            'name' => 'test2'
        ));
    }

Redis各種コマンドの有効バージョン一覧

Redisの各種コマンドの使用可能バージョン一覧。
(※2012/12/30時点でのRedis最新バージョンは2.6.7)

コマンド一覧)
Command reference – Redis

string

コマンド 有効バージョン リンク
APPEND 2.0.0.
BITCOUNT 2.6.0.
BITOP 2.6.0.
DECR 1.0.0.
DECRBY 1.0.0.
GET 1.0.0.
GETBIT 2.2.0.
GETRANGE 2.4.0.
GETSET 1.0.0.
INCR 1.0.0.
INCRBY 1.0.0.
INCRBYFLOAT 2.6.0.
MGET 1.0.0.
MSET 1.0.1.
MSETNX 1.0.1.
PSETEX 2.6.0.
SET 1.0.0.
SETBIT 2.2.0.
SETEX 2.0.0.
SETNX 1.0.0.
SETRANGE 2.2.0.
STRLEN 2.2.0.

connection

コマンド 有効バージョン リンク
AUTH 1.0.0.
ECHO 1.0.0.
PING 1.0.0.
QUIT 1.0.0.
SELECT 1.0.0.

server

コマンド 有効バージョン リンク
BGREWRITEAOF 1.0.0.
BGSAVE 1.0.0.
CLIENT KILL 2.4.0.
CLIENT LIST 2.4.0.
CONFIG GET 2.0.0.
CONFIG SET 2.0.0.
CONFIG RESETSTAT 2.0.0.
DBSIZE 1.0.0.
DEBUG OBJECT 1.0.0.
DEBUG SEGFAULT 1.0.0.
FLUSHALL 1.0.0.
FLUSHDB 1.0.0.
INFO 1.0.0.
LASTSAVE 1.0.0.
MONITOR 1.0.0.
SAVE 1.0.0.
SHUTDOWN 1.0.0.
SLAVEOF 1.0.0.
SLOWLOG 2.2.12.
SYNC 1.0.0.
TIME 2.6.0.

list

コマンド 有効バージョン リンク
BLPOP 2.0.0.
BRPOP 2.0.0.
BRPOPLPUSH 2.2.0.
LINDEX 1.0.0.
LINSERT 2.2.0.
LLEN 1.0.0.
LPOP 1.0.0.
LPUSH 1.0.0.
LPUSHX 2.2.0.
LRANGE 1.0.0.
LREM 1.0.0.
LSET 1.0.0.
LTRIM 1.0.0.
RPOP 1.0.0.
RPOPLPUSH 1.2.0.
RPUSH 1.0.0.
RPUSHX 2.2.0.

generic

コマンド 有効バージョン リンク
DEL 1.0.0.
DUMP 2.6.0.
EXISTS 1.0.0.
EXPIRE 1.0.0.
EXPIREAT 1.2.0.
KEYS 1.0.0.
MIGRATE 2.6.0.
MOVE 1.0.0.
OBJECT 2.2.3.
PERSIST 2.2.0.
PEXPIRE 2.6.0.
PEXPIREAT 2.6.0.
PTTL 2.6.0.
RANDOMKEY 1.0.0.
RENAME 1.0.0.
RENAMENX 1.0.0.
RESTORE 2.6.0.
SORT 1.0.0.
TTL 1.0.0.
TYPE 1.0.0.

transactions

コマンド 有効バージョン リンク
DISCARD 2.0.0.
EXEC 1.2.0.
MULTI 1.2.0.
UNWATCH 2.2.0.
WATCH 2.2.0.

scripting

コマンド 有効バージョン リンク
EVAL 2.6.0.
EVALSHA 2.6.0.
SCRIPT EXISTS 2.6.0.
SCRIPT FLUSH 2.6.0.
SCRIPT KILL 2.6.0.
SCRIPT LOAD 2.6.0.

hash

コマンド 有効バージョン リンク
HDEL 2.0.0.
HEXISTS 2.0.0.
HGET 2.0.0.
HGETALL 2.0.0.
HINCRBY 2.0.0.
HINCRBYFLOAT 2.6.0.
HKEYS 2.0.0.
HLEN 2.0.0.
HMGET 2.0.0.
HMSET 2.0.0.
HSET 2.0.0.
HSETNX 2.0.0.
HVALS 2.0.0.

pubsub

コマンド 有効バージョン リンク
PSUBSCRIBE 2.0.0.
PUBLISH 2.0.0.
PUNSUBSCRIBE 2.0.0.
SUBSCRIBE 2.0.0.
UNSUBSCRIBE 2.0.0.

set

コマンド 有効バージョン リンク
SADD 1.0.0.
SCARD 1.0.0.
SDIFF 1.0.0.
SDIFFSTORE 1.0.0.
SINTER 1.0.0.
SINTERSTORE 1.0.0.
SISMEMBER 1.0.0.
SMEMBERS 1.0.0.
SMOVE 1.0.0.
SPOP 1.0.0.
SRANDMEMBER 1.0.0.
SREM 1.0.0.
SUNION 1.0.0.
SUNIONSTORE 1.0.0.

sorted_set

コマンド 有効バージョン リンク
ZADD 1.2.0.
ZCARD 1.2.0.
ZCOUNT 2.0.0.
ZINCRBY 1.2.0.
ZINTERSTORE 2.0.0.
ZRANGE 1.2.0.
ZRANGEBYSCORE 1.0.5.
ZRANK 2.0.0.
ZREM 1.2.0.
ZREMRANGEBYRANK 2.0.0.
ZREMRANGEBYSCORE 1.2.0.
ZREVRANGE 1.2.0.
ZREVRANGEBYSCORE 2.2.0.
ZREVRANK 2.0.0.
ZSCORE 1.2.0.
ZUNIONSTORE 2.0.0.