vim のインサートモードで行頭をトグルする

vim を使ってて、emacs みたいに C-a で行頭と空白以外の最初の文字を トグルしたかったので作ってみました。

function! ToggleBol()
    let col = virtcol('.')
    let cmd = (col == 1) ? '^' : '0'
    execute "normal! " . cmd
endfunction
inoremap <C-a> <C-o>:call ToggleBol()<CR>

コメントアウトする時とかに便利かも。

追記

Qiitaのコメント で教えてもらったやり方のがよさそうなので、こっちにも書いときます。

inoremap <expr> <C-a>
      \ search('^\s\s*\%#', 'bcn') ? "\<C-o>0" : "\<C-o>^"

search とか初めて知ったよ。

ubuntu に samba を入れる

もう少し簡単にファイル共有できないかと思い、 ubuntu に samba を入れてみました。

いつも通り、 apt-get を使います

$ sudo apt-get install samba

共有するディレクトリを作成し、 だれでも読み書きできるようにオーナー、権限を設定します。

$ sudo mkdir /var/samba
$ sudo chown nobody:nogroup /var/samba
$ sudo chmod 777 /var/samba

/etc/samba/smb.conf をエディタで開いて設定します。

[global]
workgroup = WORKGROUP

dos charset = CP932      # Windows 側の文字コード
unix charset = UTF-8     # Linux 側の文字コード

map to guest = Bad User  # Linux に存在しないユーザーでのアクセスはゲストとして扱う

[share]
path = /var/samba           # さっき作ったディレクトリ
writeable = yes             # 書き込み許可
force create mode = 0666    # ファイルを作った時の権限
force directory mode = 0777 # ディレクトリを作った時の権限
guest ok = yes              # ゲストアクセスを許可
guest only = yes

設定したら再帰動します。

sudo service smbd restart

これで接続できました。

ubuntu に Symfony2 をインストール

Symfony2 を ubuntu にインストールした時のメモ

まず、 Symfony を落としてきて展開

mkdir ~/temp
cd ~/temp
wget http://get.symfony.com/Symfony_Standard_Vendors_2.3.1.tgz
tar -zxvf Symfony_Standard_Vendors_2.3.1.tgz
sudo mv Symfony /var/www

http://hostname/symfony/web/app_dev.php にアクセス。 以下のエラーが出たので、 app_dev.php を修正します。

You are not allowed to access this file. Check app_dev.php for more information.

sudo vim /var/www/Symfony/web/app_dev.php

app_dev.php はローカルからのみ接続できるようになっています。 今回は開発用に他マシンからも接続するので、 以下の行をコメントアウトします。

 # if (isset($_SERVER['HTTP_CLIENT_IP'])
 #    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
 #    || !in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1'))
 # ) {
 #    header('HTTP/1.0 403 Forbidden');
 #    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
 # }

再びブラウザからhttp://hostname/symfony/web/app_dev.php にアクセス

RuntimeException: Unable to create the cache directory (/var/www/Symfony/app/cache/dev)

エラーが出たので権限を変更します

chmod 777 /var/www/Symfony/app/cache

さらにブラウザでチェックすると エラーが出たので権限を変更します。 UnexpectedValueException: The stream or file "/var/www/Symfony/app/logs/dev.log

chmod 777 /var/www/Symfony/app/logs

これで正しく表示できるようになりました。

ubuntu の Apache で Userdir を使えるようにする

デフォルトでは各ユーザの ~/public_html にアクセスできないようなので 設定を追加しました。

cd /etc/apache2/mods-enabled
sudo ln -s ../mods-available/userdir.conf userdir.conf
sudo ln -s ../mods-available/userdir.load userdir.load

apache を再起動します。

sudo service apache2 restart

public_html ディレクトリを作って 確認用の html をコピー。

mkdir ~/public_html
cd ~/public_html
cp /var/www/index.html .

ブラウザから http://<サーバ>/~<ユーザ名> にアクセスして 表示されれば OK です。

MySQL を外部接続できるようにする

前回で MySQL をインストールしましたが、 外部から接続するために設定が必要だったのでメモ。

まず、普通に接続しようとすると以下のエラーメッセージが出ました。

SQL Error (2003) Can't  connect to MySQL server

で、設定ファイルを編集します。

sudo vim /etc/mysql/my.cnf

↓この bind-address の行をコメントアウトします。

 # bind-address       = 127.0.0.1

編集したら再起動

sudo service mysql restart

で、外部から接続テストすると

sql error 1130 host is not allowed to connect to this mysql server

なエラーメッセージが。 まだ権限付与しないとダメらしいので コマンドラインから接続して設定します。

mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.168.%' IDENTIFIED BY 'root のパスワード' WITH GRANT OPTION;

これで他ホストから接続できました。

IP address 'XXX.XXX.XX.XX' could not be resolved: Name or service not known

ただ、以下のようなワーニングが出て気になったので設定した。 /etc/mysql/my.cnf に

skip-name-resolve

を追加したら OK でした。

PHP で簡易 Enum を実装する

php では java のように enum 型がないのですが、 やはり使いたい場合があります。

本格的に実装してもいいのですが、 そこまでするのも大げさだなぁ、という場合に リフレクションを使って簡単に実装する方法があります。

<?php
trait SimpleEnum
{
    public static function values()
    {
        $className = get_called_class();

        $refClass = new ReflectionClass($className);
        $values = $refClass->getConstants();

        return $values;
    }

    public static function valueOf($value, $notfound = null)
    {
        $values = self::values();
        if (!array_key_exists($value, $values)) return $notfound;
        return $values[$value];
    }
}

使い方

<?php
class TestEnum
{
    use SimpleEnum;

    const HOGE = 0;
    const FUGA = 1;
}

echo TestEnum::HOGE; // => 0
echo TestEnum::FUGA; // => 1

echo TestEnum::valueOf('FUGA'); // => 1
echo TestEnum::valueOf('UnDefined'); // => null
echo TestEnum::valueOf('UnDefined', 'undefined'); // => undefined

java みたく複数の値を定義したり、型検証できませんが、 ちょっと使う分にはこれでもいいかと。

trait を使ってますが、 class にして継承すれば 5.3 以下でも使えると思います。