Vagrant で 別の仮想マシンが立ち上がった場合の修正方法

vagrant upしたら突如、新規の仮想マシンがインストールされてまっさらな状態になってしまい、仮想マシンを作りなおそうかと思ったのですが、解決方法が有りました。

vagrant up で立ち上がる仮想マシンの確認

idに仮想マシンのidが書いてある。

[VAGRANT_HOME]/.vagrant/machines/default/virtualbox/id

VirtualBoxの仮想マシンの確認

{}で囲まれた部分にidが書いてある。

$ VBoxManage list vms
"aaa_default_1415254938" {d861c386-21d2-4728-881d-293f71d24630}
"bbb_default_1416555723" {fe5a7078-bd38-4138-a48b-6fce2b32cf0c}

立ち上げたい仮想マシンのidを、vagrantのidに上書きして、vagrant upすれば無事、立ち上がりました。

WordPress コメント投稿に hook する filter

コメントの投稿に対して、何かしたい時、preprocess_commentをhookします。

例えば文字コードを変更したい場合

function preprocess_comment_conv( $commentdata ) {

  mb_convert_variables( 'UTF-8' , 'EUC-JP' , $commentdata );

  return $commentdata;
}
add_filter( 'preprocess_comment' , 'preprocess_comment_conv' ); 

$commentdata には、コメントや名前等がセットされてパラメーターとして受け取れます。

Source: Plugin API/Filter Reference/preprocess comment « WordPress Codex

BundleUpdate すると error で Update できない

:BundleUpdate

Unknown function: g:shellesc_cd 
...

Vundle を更新すると治るようなので、

$ cd ~/.vim/bundle/vundle/
$ git pull

vimproc_mac.so も再作成

$ cd ~/.vim/bundle/vimproc/
$ make
$ ls -la ~/.vim/bundle/vimproc/autoload/
total 352
drwxr-xr-x  11 suusuke  staff    374  8 13 17:02 .
drwxr-xr-x  20 suusuke  staff    680  8 13 16:56 ..
-rw-r--r--   1 suusuke  staff   4759 12  2  2012 fakepoll.h
-rw-r--r--   1 suusuke  staff  31621  8 13 16:56 proc.c
-rw-r--r--   1 suusuke  staff  33790  8 13 16:56 proc_w32.c
-rw-r--r--   1 suusuke  staff   3240  8 13 16:56 ptytty.c
-rw-r--r--   1 suusuke  staff    247  8 13 16:56 ptytty.h
drwxr-xr-x   7 suusuke  staff    238  8 13 16:56 vimproc
-rw-r--r--   1 suusuke  staff  47258  8 13 16:56 vimproc.vim
-rwxr-xr-x   1 suusuke  staff  28748  8 13 17:02 vimproc_mac.so
-rw-r--r--   1 suusuke  staff   8269  8 13 16:56 vimstack.c

無事、BundleUpdate できるようになりました。

Vagrant で VirtualBox のメモリ数を指定する

データ量の多いサイトだとパフォーマンスが悪くて、仕方がないので、
メモリ数を増やす。

変更前

デフォルトだと、589M割り当てられている。

[vagrant@vagrant-centos65 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:           589        545         44          0          5         41
-/+ buffers/cache:        497         91
Swap:         1224          7       1217

Vagrantfileにメモリ数を指定

  config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
     vb.memory = "2048"
  end

変更後

[vagrant@vagrant-centos65 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1877       1194        682          0          9        547
-/+ buffers/cache:        637       1240
Swap:         1224          0       1224

誤差があるが、あとで調べてみよう。

ついでにMySQLのバッファサイズも増やす

[mysqld]

innodb_buffer_pool_size=1024M
innodb_log_file_size=128M

CocoaPods で pod install ができない

久しぶりに、iOSアプリの開発を始めて見たら、CocoaPodsでライブラリーのインストールができない。

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:245:in `mkdir': Permission denied - /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-14/2.0.0/xcodeproj-0.16.1 (Errno::EACCES)
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:245:in `fu_mkdir'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:219:in `block (2 levels) in mkdir_p'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:217:in `reverse_each'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:217:in `block in mkdir_p'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:203:in `each'
....

パーミッションの問題なのかと思って、rootで実行してみたりしたけど、解決できず。
再インストールしたら、できるようになりました。

$ sudo gem uninstall cocoapods
$ sudo gem uninstall xcodeproj
$ sudo gem install xcodeproj
$ sudo gem install cocoapods

PostgreSQL で配列比較する SQL文

テーブルのテキストフィールドでカンマ区切りで、IDを管理するスキーマがあります。
そのテーブルのデータは履歴管理されていて、直前のデータと最新のデータで、カンマ区切りのフィールドが変わったかどうか、SQLで比較したいという事がありました。

しかも、カンマ区切りの順序はバラバラで一意ではないので、ID順に並べ替えて配列で比較する必要がありました。

具体的な例だと

予約履歴テーブルとオプションテーブルがあり、予約履歴テーブルは更新される毎にデータがinsertされ、
optionというフィールドに、オプションテーブルのIDをカンマ区切りで保持しているというケースです。

string_to_arrayでカンマ区切りを配列にする

まずは、optionフィールドをstring_to_arrayでint[]型に変換します。

string_to_array(option ',')::int[]

array_sort_uniqueでソート&ユニークにする

array_sort_unique という関数を定義して、重複する値を取り除き、ソートします。

CREATE OR REPLACE FUNCTION array_sort_unique (ANYARRAY) RETURNS ANYARRAY
LANGUAGE SQL
AS $body$
  SELECT ARRAY(
    SELECT DISTINCT $1[s.i]
    FROM generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
    ORDER BY 1
  );
$body$;
↓
SELECT array_sort_unique('{1,2,3,2,1}'::int[]);
 array_sort_unique 
-------------------
 {1,2,3}
(1 row)

COALESCEでnullをからの配列に置き換える

COALESCE(option, '{}'::int[])

全て合わせる

COALESCE(array_sort_unique(string_to_array(a.option, ',')::int[]), '{}'::int[]) = COALESCE(array_sort_unique(string_to_array(b.option, ',')::int[]), '{}'::int[])

そもそも、規則正しくoptionが保存されるという保証があればこのような手間は無かったのですが。。。

PHPで配列の行列を入れ替える

配列をテーブルレイアウト用に変えたりする時に、行列入れ替えたいなという事があります。
array_mapを使うと、foreachでループ処理しなくても、入れ替えることができます。


$before[] = array('0', 'aaa', '090-0000-0000');
$before[] = array('1', 'bbb', '090-1111-1111');
$before[] = array('2', 'ccc', '090-2222-2222');



$after = array_map(null, $before[0], before[1], before[2]);

CentOS が UNEXPECTED INCONSISTENCY で起動しない

Postgresにdumpをリストアしていたら途中でリストアに失敗して、CentOS再起動したらUNEXPECTED INCONSISTENCY;で起動しなくなりました。

/dev/VolGroup00/LogVol00: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
        (i.e., without -a or -p options )
                                                           [FAILED]

*** An error occurred during the file system check.
*** Dropping you to a shell; the system will reboot
*** when you leave the shell.
Give root password for maintenance
(or type Control-D for normal startup):

centos59_64_default_1390292917__Running_

rootでログインして、fsckを実行しろと表示されるので実行。

# fsck  -t  ext3  /dev/VolGroup00/LogVol00

centos59_64_default_1390292917__Running_2

修復はすぐ終わり、起動時にエラーは出なくなりました。

日付毎のログファイルを一週間毎にディレクトリにまとめる(bash)

ログファイルが日付毎に作成されてて大変な事になっていたので、一週間毎にディレクトリにまとめました。

ファイルのフォーマットは xxxxxxx_yyyy_mm_dd.log です。

#!/bin/bash
for file in *.log; do
    d="${file//xxxxxx_/}" # replace
    d="${d//.log/}"
    IFS='_'
    set -- $d
    echo "$d"
    weekday=`date -v$1y -v$2m -v$3d "+%w"`
    if [ "$weekday" = "1" ] 
    then
      echo "mkdir"
      dir=$d
      mkdir "$dir"
    fi
    mv "$file" "$dir/$file"
done

シェル書くことないから勉強になりました。
※ファイルは月曜日から始まっている前提です。