It's raining cats and dogs.

無駄なことなんてないはず

Vagrantでインストールしたboxファイルの行方

Vagrantを使って環境を作っていたんだけど、そういえばvirtualboxのboxファイルをインストールするときに

$ vagrant box add centos6.3 https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box

というようにboxファイルをインストールするんだけど、このboxファイル(イメージファイル?)ってどこにインストールされるんだろうとおもってディレクトリを漁っていたら、~/.vagrant.d/配下にインストールされていた

$ tree ~/.vagrant.d
/Users/tadasy/.vagrant.d
├── boxes
│   ├── centos6.3
│   │   └── virtualbox
│   │       ├── Vagrantfile
│   │       ├── box-disk1.vmdk
│   │       ├── box.ovf
│   │       └── metadata.json
│   └── scientificlinux-6
│       ├── Vagrantfile
│       ├── box-disk1.vmdk
│       └── box.ovf
├── data
├── gems
├── insecure_private_key
├── rgloader
│   └── loader.rb
├── setup_version
└── tmp
    ├── box1363317853
    ├── box1363317977
    └── box1363317982

~/.vagrant.d/boxes/centos6.3/virtualbox/box-disk1.vmdk

どうやらこれっぽいですね。

変更した複数のphpファイルのシンタックスチェック

複数のPHPファイルに対して、いろいろ修正を加えたんだけど、とりあえずシンタックスチェックくらいは一気にやりたかったのでshellでまるっとチェックした。
対象はsubversionで管理されているので、変更したファイル(M)のファイルだけチェックした。

$ cd target_dir
$ for i in `svn st | awk '$1 == "M"{print $2}'`; do php -l $i; done

なんてことはないメモ

SQLのreplace関数が便利

とあるカラムの文字列を一括して置換したいときはreplace関数が便利。

たとえば、hoge_tableのcol1に入っている文字列の'foo'を'bar'に置換したいときは

update hoge_table set col1 = replace(col1, 'foo', 'bar');

とすると一括で更新できる。
調べるとOracle,MySQL,Postgresql,SQLiteで使えるようだ。SQL99に準拠しているかは調べてない。
ただ、oracleでしか試してないけど、検索文字にマッチしないレコードも、データはかわらないけどupdateされるっぽい。
なので、where句で対象を絞るなりしないと全行ロックかかってしまう気がするので、更新処理などは気にしたほうがよさそうです。

ちなみに

OraclePostgresqlはREGEXP_REPLACEという関数があって、正規表現を使った置換ができるそうです。
http://www.shift-the-oracle.com/sql/functions/regexp_replace.html
http://www.postgresql.jp/document/8.3/html/functions-matching.html#FUNCTIONS-POSIX-REGEXP
Oracleは10gからだそうで。

さくらのVPSを借りて、真っ先に設定した内容まとめ

ついカッとなってさくらのVPSを借りたので、借りてすぐにやったことのメモ
ちなみにディストリビューションCentOS 6を選択しました。

rootのパスワード変更

契約時はrootしかアカウントがないので、とりあえずrootでログインし、rootのパスワードを変更しておく。sshで接続するときは登録時に発行されたIPアドレスで。

mac$ ssh -l root xxx.xxx.xxx.xxx
root$ passwd

作業用ユーザー作成

rootで作業とかマジ怖いので、取り急ぎ作業用のアカウントを作成し、パスワードも設定

root$ adduser myuser
root$ passwd myuser

sudoの設定

rootで作業しないようにとりあえずsudoの設定。以下を追記。

root$ visudo
...
myuser  ALL=(ALL)       ALL  # これを追記
...

ほんとはもう少しきちんと権限設定をした方がいいと思うけど、とりあえず良しとする。

sshdの設定変更

もろもろ変更したり追記したり

$ sudo vi /etc/ssh/sshd_config
...
# rootで直接sshで接続できないようにする
PermitRootLogin no

# sshのポート番号を変える(番号は内緒)
Port XXXXX

# パスワードなしでのログイン禁止
PermitEmptyPasswords no
...

ここで一旦sshdを再起動

$ sudo /etc/init.d/sshd restart

sshでのログインを公開鍵認証にする

セキュリティおよび利便性向上のため、sshは公開鍵認証にする

.sshディレクトリの作成

~/.ssh/authorized_keysに公開鍵を記述(追記)するので、.sshディレクトリを作っておく

$ mkdir ~/.ssh
# パーミッションは700で。
$ chmod 700 ~/.ssh
鍵を作る

僕はmacなのでmacのツールを使いました。鍵の置き場所を聞かれるので、テキトな箇所に作る。とりあえずmysakura_rsaを作る

mac$ ssh-keygen
Enter file in which to save the key (/Users/hoge/.ssh/id_rsa): /Users/hoge/.ssh/mysakura_rsa
できた公開鍵をVPS側にscpなどで持っていく
mac$ scp -P XXXXX ~/.ssh/mysakura_rsa.pub myuser@xxx.xxx.xxx.xxx:/home/myuser/.ssh/
公開鍵をauthorized_keysに設定する
$ cd ~/.ssh
$ cat mysakura_rsa.pub >> authorized_keys
# パーミッションは600
$ chmod 600 authorized_keys

sshdの編集

$ sudo vi /etc/ssh/sshd_config
...
# 鍵認証許可
PubkeyAuthentication yes

# 鍵のファイル
AuthorizedKeysFile      .ssh/authorized_keys

# パスワード認証を無効化
PasswordAuthentication no
...
sshd再起動
$ sudo /etc/init.d/sshd restart
確認

鍵無しでログインを試みる

$ ssh -l myuser -p XXXXX xxx.xxx.xxx.xxx
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
ついでに

作業用のmacの.ssh/configを設定しておく

mac$ vi ~/.ssh/config
Host mysakura
  HostName        xxx.xxx.xxx.xxx
  Port            XXXXX
  IdentityFile    ~/.ssh/mysakura_rsa
  User            myuser

なぜこれをしているかというとVPSにログインするときに

mac$ ssh mysakura

でログインできるから。alias切ればいいじゃんという話はあるけどscpしたりするときも

mac$ scp hoge.txt mysakura:~/

とか書けて便利なのです。

iptables

SSHの設定が終わったらiptablesの設定をして、とりあえず完了とする。

https://gist.github.com/tadasy/5099635

こんな感じのshellを作って実行しておしまい。
基本方針としては SSH, HTTP, HTTPS 以外のポートは閉じる くらい。
インターネッツの荒波に揉まれるので、必要なポート以外は閉じておく。

ここまでで初期設定はおわり。
あとは好きな言語をいれたり、ミドルウェアを入れたりぼちぼち進めていく。

おやすみなさい

PHPの参照渡しを探す

関数呼び出し時の&をつけた明示的な参照渡しは、PHP 5.3からは非推奨、5.4からは廃止になるということで5.4になる前に撲滅しておきたいですよね!

以前 id:MugeSo さんに教えてもらった技のメモ

プロジェクトのルートディレクトリとかで

$ find $(pwd) -type d -name '.svn' -prune -o -print| grep -E '\.(php|inc)$'|xargs grep '[(,]\s*&\s*\$'|grep -v -E '[ |\t]*function[ |\t]'

と打つとそれっぽい結果が返ってくる。

id:MugeSo さん助かります!

mysqlで全テーブルのカラム一覧を見たい

情弱メモ。
mysqlでテーブル一覧とかカラム一覧とかを見るときは

/* テーブル一覧 */
mysql> show tables;
/* カラム一覧 */
mysql> desc <table_name>;

みたいにやるんだけど、mysqlコマンドではなくて、sqlで確認したいときは

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| projectdb     | 
| test               | 
+--------------------+

で表示されるinformation_schemaというDBにいろんな情報が入ってるので、このDBを使うと良い。
information_schemaのテーブル一覧を見ると

mysql> use information_schema;
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema          |
+---------------------------------------+
| CHARACTER_SETS                        | 
| COLLATIONS                            | 
| COLLATION_CHARACTER_SET_APPLICABILITY | 
| COLUMNS                               | 
| COLUMN_PRIVILEGES                     | 
| ENGINES                               | 
| EVENTS                                | 
| FILES                                 | 
| GLOBAL_STATUS                         | 
| GLOBAL_VARIABLES                      | 
| KEY_COLUMN_USAGE                      | 
| PARAMETERS                            | 
| PARTITIONS                            | 
| PLUGINS                               | 
| PROCESSLIST                           | 
| PROFILING                             | 
| REFERENTIAL_CONSTRAINTS               | 
| ROUTINES                              | 
| SCHEMATA                              | 
| SCHEMA_PRIVILEGES                     | 
| SESSION_STATUS                        | 
| SESSION_VARIABLES                     | 
| STATISTICS                            | 
| TABLES                                | 
| TABLESPACES                           | 
| TABLE_CONSTRAINTS                     | 
| TABLE_PRIVILEGES                      | 
| TRIGGERS                              | 
| USER_PRIVILEGES                       | 
| VIEWS                                 | 
| INNODB_CMP_RESET                      | 
| INNODB_TRX                            | 
| INNODB_CMPMEM_RESET                   | 
| INNODB_LOCK_WAITS                     | 
| INNODB_CMPMEM                         | 
| INNODB_CMP                            | 
| INNODB_LOCKS                          | 
+---------------------------------------+

こんな感じのテーブル一覧があるので、TABLESとかCOLUMNSとかのテーブルを使って調べれば良い。
たとえば、「projectdb」というDBの全テーブルのカラム一覧を表示したいなら

mysql> desc COLUMNS;
+--------------------------+---------------------+------+-----+---------+-------+
| Field                    | Type                | Null | Key | Default | Extra |
+--------------------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG            | varchar(512)        | NO   |     |         |       | 
| TABLE_SCHEMA             | varchar(64)         | NO   |     |         |       | 
| TABLE_NAME               | varchar(64)         | NO   |     |         |       | 
| COLUMN_NAME              | varchar(64)         | NO   |     |         |       | 
| ORDINAL_POSITION         | bigint(21) unsigned | NO   |     | 0       |       | 
| COLUMN_DEFAULT           | longtext            | YES  |     | NULL    |       | 
| IS_NULLABLE              | varchar(3)          | NO   |     |         |       | 
| DATA_TYPE                | varchar(64)         | NO   |     |         |       | 
| CHARACTER_MAXIMUM_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       | 
| CHARACTER_OCTET_LENGTH   | bigint(21) unsigned | YES  |     | NULL    |       | 
| NUMERIC_PRECISION        | bigint(21) unsigned | YES  |     | NULL    |       | 
| NUMERIC_SCALE            | bigint(21) unsigned | YES  |     | NULL    |       | 
| CHARACTER_SET_NAME       | varchar(32)         | YES  |     | NULL    |       | 
| COLLATION_NAME           | varchar(32)         | YES  |     | NULL    |       | 
| COLUMN_TYPE              | longtext            | NO   |     | NULL    |       | 
| COLUMN_KEY               | varchar(3)          | NO   |     |         |       | 
| EXTRA                    | varchar(27)         | NO   |     |         |       | 
| PRIVILEGES               | varchar(80)         | NO   |     |         |       | 
| COLUMN_COMMENT           | varchar(1024)       | NO   |     |         |       | 
+--------------------------+---------------------+------+-----+---------+-------+

このあたりのテーブルを使って

select TABLE_NAME, COLUMN_NAME from COLUMNS where TABLE_SCHEMA = 'projectdb';

などとすればそれらしき情報が取得できるようです。

そういえば、はてな記法のシンタックスハイライトにmysqlというのがあってびっくりした。

androidのアイコン画像のサイズ

※下記の内容の認識が間違っていた。正しくは下の追記に書いた。

たまにはandroidの話。というかメモ。
androidのアイコン画像を置くときに

  • drawable-hdpi
  • drawable-ldpi
  • drawable-mdpi
  • drawable-xhdpi

あたりのディレクトリにそれぞれ画像を置くと解像度に適した画像を使ってくれるんだけど、それぞれどのサイズかよくわからんので、ググったら良い記事ありました。

http://yuki312.blogspot.jp/2012/02/blog-post.html

ldpiでは、3:4=x:100となり75px×75pxの画像をdrawable-ldpiに配置
mdpiでは、4:4=100:xとなり100px×100pxの画像をdrawable-mdpiに配置
hdpiでは、4:6=100:xとなり150px×150pxの画像をdrawable-hdpiに配置
xhdpiでは、4:8=100:xとなり200px×200pxの画像をdrawable-xhdpiに配置

とのこと。
たぶん覚えられないからメモメモ。

追記

上の内容は間違いがありました。記事をちゃんとみていない僕が悪いんですけど上の記事は100pxの画像をdpiにしたら何pxになるって話でアイコン画像とは関係ないみたいです。
というのを、今朝

http://blog.excite.co.jp/spdesign/19798730/

この記事をみてあれあれ?とおもって気がついた。
イコン画像のサイズはこの記事がくわしい。てへへ。