rehashでmysqlのテーブル名を補完する

社内の勉強会やら仕事やらでmysqlコマンドラインで使っていて感じる違和感。

テーブル名が補完出来ていない...
気づくと非常にストレスに感じる...


テ ー ブ ル を 補 完 し た い !!


そんな衝動に駆られて調べてみる。

--auto-rehash

デフォルトでオンに設定されているみたい。
でも補完されないので。オフにしてやる。
--skip-auto-rehashでオフにすることが出来る。
マニュアルによると少し起動が早くなるそうな。

rehash

とはいえ、オンになっていても補完されなかったり、--skip-auto-rehashで補完をオフにしているときに補完したくなった場合は
rehashコマンドを実行してあげる。


しっかりtabで補完してくれるようになりましたー。
これで似たような名前が多いデータベースでも、長い名前のカラムでも入力しなくて済みます。


なんで補完してくれないかは気になるところですが、当座のストレスを解決することが出来たのでよしとします。

plugin memo2 - Vundleへ

今までプラグインインストール用のsh書いたりして対応して来たけど
http://vim-users.jp/2011/04/hack215/
を読んで移行してみた。

自分なりのメモとして。

submoduleで追加

.vimrcやら.zshrcやら.screenrcやらはgithubに突っ込んでいるのでsubmoduleでほげほげ

$ git submodule add http://github.com/gmarik/vundle.git

.vimディレクトリにシンボリックリンク追加

$ ln -s /path/to/vundle.git ~/.vim/

.vimrcの先頭を編集

set nocompatible
filetype off
set rtp+=~/.vim/vundle.git/
call vundle#rc()
************
ここにインストールするプラグイン名
************
filetype plugin indent on

vimでBundleInstallって打てば書かれているプラグインを入れてくれる。
プラグインの依存関係は解決してくれないので、必要なものは随時記述してあげる必要あり。
(tSkeletonのtlibとか)

で、以下追加。

Bundle 'Align'
Bundle 'EnhCommentify.vim'
Bundle 'surround.vim'
Bundle 'neocomplcache'
Bundle 'snipMate'
Bundle 'tlib'
Bundle 'tSkeleton'
Bundle 'nginx.vim'

このままvim起動するとtSkeletonに tskelDir がダメー!
ってエラー吐くので

$ mkdir ~/.vim/skeletons

で回避。

BundleInstallやらBundleCleanやらでよしなにやってくれるので非常に便利(´・ω・`)

mysqld_multiでcnfファイルを指定するとき

以前書いたこんな記事
mysqld_multi でMySQL複数起動 - こっそりmaroe

この時のMySQLの設定ファイルは /etc/my.cnf に記述していたので
この/etc/my.cnfファイルに全てのmysqld_multi用の設定を書けば

# 複数起動スタート[mysqld_multi]のディレクティブ
mysqld_multi start

# 稼働状況のレポート表示
mysqld_mutli report

# 複数起動停止[mysqld_multi]のディレクティブ
mysqld_multi stop

で問題ない。

色々なバージョンのMySQLをインストールしてcnfの場所、名前がばらばらしている場合

テスト環境などで色々なバージョンのMySQLを入れていて
こんなことになっていた。

maroekun $/bin/ls --color=auto  -F /etc/my*                                 [~]
my.cnf my5_0.cnf my5_5_6.cnf my_multi.cnf

で、MySQLだと

  1. /etc/my.cnf
  2. DATA_DIR/my.cnf
  3. ~/my.cnf

の順番で自動でコンフィグファイルが読み込まれて起動しようとする。
が、起動時に以下のコンフィグを指定することで任意のコンフィグファイルを参照してくれる
(必ずオプションの一つ目として指定してあげる)

  • --defaults-file=/path_to_cnf/file_name

なのでmysqld_multiの起動時に以下のようにしてあげる

mysqld_multi --defaults-file=/path_to_file/file_name start

がっ!!
がっ、しかし…

mysqld_multiから呼び出されるmysqld_safe達が指定したファイルを読み込んでくれない…!!
結局、上記の1,2,3の順番にmy.cnfを探しにいってしまう。
今回のmysqld_multi用に記述したファイルが意味を成さないorz

mysqld_multiを見に行ってみる。

  • mysqld_multi起動時に指定した `--defaults-file` から読み取るのは
    1. [mysqld_multi]のディレクティブ
    2. [mysqld{N}] の{N}のリスト
  • start_mysqlds()内でdefaults_for_group(`[mysqld{N}]のリスト`)が実行される
    1. `--defaults-file` の中からそれぞれの番号のディレクティブが読み込られる
    2. 各`mysqld_safe`実行時に読み込んだオプションが付与されて実行される

この状態でmysqld_multiから起動されるmysqld_safeの引数としては`--defaults-file`は無視される(捨てられる)

[mysqld1]
**server_id=1
**port=3307

だったら
**を読み込んで
`mysqld_safe --server_id=1 --port=3307 ....` として起動され、 /etc/my.cnf 上の`[mysqld]`設定を読み込んでしまう(重複しているコンフィグ内容は上書きされてしまう)。

なので、今回共通設定`[mysqld]`が記述されている`--defaults-file`を、mysqld_multiから起動されるmysqld_safeにも読み込ませたい場合は

[myqld] #共通設定
hogehoge
[mysqld1]
defaults-file=/path_to_cnf/file_name
server_id=1
port=3307
[mysqld2]
defaults-file=/path_to_cnf/file_name
...

のように各mysqldのオプションの一つ目に`defaults-file`を指定すると
`mysqld_safe --defaults-file=/path_to_cnf/file_name --server_id=1 --port=3307` として起動し、
自分自身の共通設定が記述されている`[mysqld]` も読み込まれるようになる。

か、 /etc/my.cnf 内に各 mysqld_safe の共通項目を設定されてれば各mysqld{N}に書かなくてもいいのかな??
(cnfファイルが2ヶ所に存在するので面倒くさいけど。)

ちゃんと my.cnf を管理せずずぼらインストールして遊んでいたからハマってしまったことでしたorz

ubuntu 開発環境構築メモ(java,php,ruby)

java + eclipse + androidSDK

java

ubuntu8.04 と違ってすんなり aptitude でいけなかったので。
ubuntu10.04 へのjavaインストールはid:Yoshiori様の以下の記事を参考にさせていただきました。

java -version
 java version "1.6.0_20"
 Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
 Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)
eclipse
wget "http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/R/eclipse-java-helios-linux-gtk.tar.gz&url=http://ftp.jaist.ac.jp/pub/eclipse/technology/epp/downloads/release/helios/R/eclipse-java-helios-linux-gtk.tar.gz&mirror_id=105"

tar zxvf eclipse-java-helios-linux-gtk.tar.gz
mv eclipse ~/trunk/app
androidSDK

androidSDKのDL

wget "http://dl.google.com/android/android-sdk_r06-linux_86.tgz" -O android-sdk_r06-linux_86.tgz
tar zxvf android-sdk_r06-linux_86.tgz

eclipse起動
[Help] - [Install New Software] のAddで、[work with]に(https://dl-ssl.google.com/android/eclipse/)を指定して、「Developer Tools」を選択
[Window] - [Preferencd] - [Android] でディレクトリを指定
[Android SDK Manager] でパッケージインストール
バイス情報登録して完了。

php

aptitudeで一撃

sudo aptitude install php5-cli
php -v
 PHP 5.3.2-1ubuntu4.2 with Suhosin-Patch (cli) (built: May 13 2010 20:01:00) 
 Copyright (c) 1997-2009 The PHP Group
 Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

ruby + rails

ruby1.9.1

aptitudeで一撃

sudo aptitude install ruby1.9.1
ruby1.9.1 -v 
 ruby 1.9.1p378 (2010-01-10 revision 26273) [i486-linux]
rubygems
sudo aptitude install rubygems1.9.1
gem1.9.1 -v
 1.3.5
rails
gem1.9.1 install rails

rails へのパスを通す

vi ~/.zshrc
  export PATH=/var/lib/gems/1.9.1/bin:${PATH}
rails -v
 Rails 2.3.8

WEBrick起動

rails sample
ruby1.9.1 sample/script/server

net/https (openssl)がないと怒られる。
libopenssl-ruby1.9.1 をインストール

sudo aptitude install libopenssl-ruby1.9.1

irb1.9.1
 irb(main):001:0> require 'openssl'
 => true

無事 localhost の3000番ポートで起動確認

plugin memo

使っている vim plugin のまとめ用メモとして。
(思い出すのが面倒くさいから…orz)

  • Align

整形用のplugin
http://www.vim.org/scripts/script.php?script_id=294

wget "http://www.vim.org/scripts/download_script.php?src_id=10110" -O Align.vba.gz
gunzip Align.vba.gz
vi Align.vba
:so %
  • EnhCommentify

コメントアウト用のplugin
http://www.vim.org/scripts/script.php?script_id=23

wget "http://www.vim.org/scripts/download_script.php?src_id=8319" -O enhCom.tar.gz
tar zxvf enhCom.tar.gz
cd EnhancedCommentify-2.3
cp -R . ~/.vim/
  • surround

vim のテキストオブジェクト強化(であってるのかな??)
http://www.vim.org/scripts/script.php?script_id=1697

wget "http://www.vim.org/scripts/download_script.php?src_id=12566" -O surround.zip
cp ./surrond.zip ~/.vim/
cd ~/.vim
unzip surrond.zip

タイトル通りスニペット機能を提供
http://www.vim.org/scripts/script.php?script_id=2540

wget "http://www.vim.org/scripts/download_script.php?src_id=11006" -O snipMate.zip
cp snipMate.zip ~/.vim
cd ~/.vim
unzip snipMate.zip
  • tSkeleton

ファイルタイプ毎のテンプレートを作成
http://www.vim.org/scripts/script.php?script_id=1160
先に依存のtlib
http://www.vim.org/scripts/script.php?script_id=1863

wget "http://www.vim.org/scripts/download_script.php?src_id=12751" -O tlib.vba
vi tlib.vba
:so %

wget "http://www.vim.org/scripts/download_script.php?src_id=11545" -O tSkeleton.vba.gz
gunzip tSkeleton.vba.gz
vi tSkeleton.vba
:so %
mkdir -p ~/.vim/skeletons/templates/perl
touch ~/.vim/skeletons/templates/perl/perl\ \#.pl 

http://www.vim.org/scripts/script.php?script_id=1879
入力補完

wget "http://www.vim.org/scripts/download_script.php?src_id=11894" -O vim-autocomplpop.zip
cp vim-autocomplpop.zip ~/.vim
cd ~/.vim
unzip vim-autocomplpop.zip

vimrcを開いて

let g:acp_completeOption = '.,w,b,u,t,k~//.vim/dict/perl.dict'

etc..etc...
辞書ファイル作ったり探したりとか作業は残ってるけどインストールはこれで完了〜。

番外編

こんなエラーがたまに出る。

E764: Option 'omnifunc' is not set
E118: Too many arguments for function: acp#meetsForCssOmni

at .vimrc

autocmd FileType python set omnifunc=pythoncomplete#Complete

こんな感じで書く。
share/vim/vim72/autoload/....
以下に入っている。

ubuntu をインストールしてしたことリスト

EeePC の安いモバイルPCを購入。
win7をメインOSとして稼働するのも心許ないのでubuntuインストール。
インストールソフトのメモメモ。

  • 日本語ファイル名を英語表記に戻す
LANG=C xdg-user-dirs-gtk-update
sudo aptitude install zsh
sudo usermod -s /bin/zsh [User]
sudo aptitude install vim
  • chrome
    • extension:SpeedDial | chromedBird | smoothScroll | GmailChecker | AutoPatchWork | delicious用(自前extension)
  • git
sudo aptitude install git-core
      • なんでそのまま'install git'じゃないんだろう…
git config --global user.name "hogehoge"
git config --global user.email fugafuga@foo.bar
git config -l
  • perlbrew
curl -LO http://xrl.us/perlbrew
chmod +x perlbrew
./perlbrew install
rm perlbrew
echo 'source /home/maroekun/perl5/perlbrew/etc/bashrc' >> ~/.zshrc
source ~/.zshrc
perlbrew init
perlbrew install perl-5.12.1
perlbrew switch perl-5.12.1
  • cpanm
git clone git://github.com/miyagawa/cpanminus.git
cd cpanminus
perl Makefile.PL
make install

普段使うのとかはこれでいいか。
perl書くにはこれで困らない…かな。

array_replace_recursive 機能をトレースしてみた

    • array_replace
    • array_replace_recursive

が php5.3.0 以上じゃないと使えないので機能をトレースしてみた。

ちなみに上の関数は第一引数で与えられた配列内の要素を第2引数以降与えられたもので、置換していく関数。
array_merge() とか array_merge_recursive() は先頭に詰めていってしまうので少し効果が違ってくる。

function trace_replace_recursive( $base = array() )
{
  $len_arg = func_num_args();

  if ( !is_array($base) ) return array();
  if ( $len_arg < 2 )     return $base;

  $args = func_get_args();
  for ($i = 1; $i < $len_arg; $i++) {
    $tmp_arg = $args[$i];
    if ( !is_array($tmp_arg) ) continue;
    foreach ( $tmp_arg as $k => $v ) {
      if( is_array($v) ){
        if( !isset( $base[$k] ) ) $base[$k] = array();
        $base[ $k ] = trace_replace_recursive($base[$k], $v);
      }
      else $base[$k] = $v;
    }
  }
  return $base;
}

$arr1[1][2]    = 5;
$arr2[2][2]    = 3;
$arr3[1][3]    = 2;
$arr4[1][4][1] = 4;

な配列をそれぞれ突っ込んでみた結果。

  • php5.3.2
array_replace_recursive(array(), $arr1, $arr2, $arr3, $arr4);

array(2) {
  [1]=>array(3) {
    [2]=>int(5)
    [3]=>int(2)
    [4]=>array(1) {
      [1]=>int(4)
    }
  }
  [2]=>array(1) {
    [2]=>int(3)
  }
}
  • php5.2.6
trace_replace_recursive(array(), $arr1, $arr2, $arr3, $arr4);

array(2) {
  [1]=>array(3) {
    [2]=>int(5)
    [3]=>int(2)
    [4]=>array(1) {
      [1]=>int(4)
    }
  }
  [2]=>array(1) {
    [2]=>int(3)
  }
}

ざっくり希望通り動作したー。
こういう関数がデフォで入ってるのはほんと便利だなぁ(´・ω・`)

・・・と、ふとphp.ne の array_replace_recursive の項目を見てたら・・・
すでに機能をトレースするコードがコメントにあるというねorz
これから見比べてみる。

http://www.php.net/manual/ja/function.array-replace-recursive.php
いい勉強になったとしておきますorz