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
.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だと
- /etc/my.cnf
- DATA_DIR/my.cnf
- ~/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` から読み取るのは
- [mysqld_multi]のディレクティブ
- [mysqld{N}] の{N}のリスト
- start_mysqlds()内でdefaults_for_group(`[mysqld{N}]のリスト`)が実行される
- `--defaults-file` の中からそれぞれの番号のディレクティブが読み込られる
- 各`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)
- DropBox
- https://www.dropbox.com/downloading からDLしてそのまま実行
- 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