さくら共用サーバーにcabochaをインストールする

さくら共用サーバーにcabochaをインストールした際の覚書。

cabochaのインストールや利用方法についてはこちら

前提として、mecab0.97が入っている。
インストール場所は、/home/username/local とする。

1.CRF++をインストールする

----------------------------------------------------
//ダウンロード。「https」だとエラーが出る。
wget http://crfpp.googlecode.com/files/CRF%2B%2B-0.58.tar.gz

tar xzvf CRF++-0.58.tar.gz //解凍

//「$HOME」が「~(チルダ)」だとエラーが出る。
./configure --prefix=$HOME/local

make install //インストール。
----------------------------------------------------

2.cabochaをインストールする

最新版であった「cabocha-0.67」をダウンロードした。
MeCab (0.993以降)が必要と記述されていたが、構わず進めた。

----------------------------------------------------
wget http://cabocha.googlecode.com/files/cabocha-0.67.tar.bz2
----------------------------------------------------

続けて、以下のコマンド。
----------------------------------------------------
tar xzvf cabocha-0.67.tar.bz2
cd cabocha-0.67
./configure --prefix=$HOME/local --with-charset=utf8 --enable-utf8-only LDFLAGS="-L$HOME/local/lib" CPPFLAGS="-I$HOME/local/include" --with-mecab-config=$HOME/local/bin/mecab-config
make
make install
----------------------------------------------------

すると、make installのところでエラー発生!

エラー内容
----------------------------------------------------
morph.cpp: In member function 'virtual bool CaboCha::MorphAnalyzer::parse(CaboCha::Tree*) const':
morph.cpp:197: error: 'mecab_lattice_new' was not declared in this scope
morph.cpp:203: error: 'MECAB_ALLOCATE_SENTENCE' was not declared in this scope
morph.cpp:203: error: 'mecab_lattice_add_request_type' was not declared in this scope
morph.cpp:207: error: 'mecab_lattice_set_sentence2' was not declared in this scope
morph.cpp:209: error: 'mecab_parse_lattice' was not declared in this scope
morph.cpp:211: error: 'mecab_lattice_strerror' was not declared in this scope
morph.cpp:214: error: 'mecab_lattice_get_bos_node' was not declared in this scope
morph.cpp: In static member function 'static void CaboCha::MorphAnalyzer::clearMeCabLattice(mecab_lattice_t*)':
morph.cpp:223: error: 'mecab_lattice_clear' was not declared in this scope
morph.cpp: In static member function 'static void CaboCha::MorphAnalyzer::deleteMeCabLattice(mecab_lattice_t*)':
morph.cpp:228: error: 'mecab_lattice_destroy' was not declared in this scope
*** [morph.lo] Error code 1

Stop in /home/username/local/cabocha-0.67/src.
*** [all-recursive] Error code 1

Stop in /home/username/local/cabocha-0.67.
*** [all] Error code 1

Stop in /home/username/local/cabocha-0.67.
%
----------------------------------------------------

エラー内容の詳細は不明だが、mecabとcabochaのバージョンが合ってないことがエラー原因と当たりをつけて、cabochaのバージョンを下げてリトライ。
(後日、新しい最新のmecab入りにcabocha-0.67を試みたところ、エラーも出ずインストールできた)

cabocha0.60のインストール
----------------------------------------------------
wget http://cabocha.googlecode.com/files/cabocha-0.60.tar.gz
tar xzvf cabocha-0.60.tar.gz
cd cabocha-0.60
./configure --prefix=$HOME/local --with-charset=utf8 --enable-utf8-only LDFLAGS="-L$HOME/local/lib" CPPFLAGS="-I$HOME/local/include" --with-mecab-config=$HOME/local/bin/mecab-config
(make) ← 実行コマンドを読み返したが抜けていた・・・
make install
----------------------------------------------------

あっさりインストールできた。

cabochaを実行
----------------------------------------------------
/home/username/local/bin/cabocha
----------------------------------------------------

※パスも通しておく。パスが通っているにもかかわらずcabochaが実行できない場合は、サーバーに再ログインする。

テキストファイルに書いたpythonスクリプトからcabochaをimportを試みるとエラーになる場合は、こちら

mecabをインストールしたら、これもやる。
----------------------------------------------------
mecabで半角記号が名詞,サ変接続になるのを解決する
----------------------------------------------------

新しいカラムを追加するmysqlクエリ

新しいカラムを既存カラムの後ろに追加するサンプルコード
----------------------------------------------------
ALTER TABLE テーブル名 ADD 追加するカラム名 定義
----------------------------------------------------
新しいカラムの場所指定がなければ、最後に追加される。

新しいカラムを既存カラムの先頭に追加するサンプルコード
----------------------------------------------------
ALTER TABLE テーブル名 ADD 追加するカラム名 定義 FIRST
----------------------------------------------------

既存カラムの後ろに新しいカラムを追加するサンプルコード
----------------------------------------------------
ALTER TABLE テーブル名 ADD 追加するカラム名 定義 AFTER カラム名
----------------------------------------------------

カラムの定義はこんな感じ
----------------------------------------------------
ALTER TABLE list ADD new_colunm text AFTER colunm1
----------------------------------------------------

カラムの定義その2
----------------------------------------------------
ALTER TABLE list ADD new_colunm varchar(20) AFTER colunm1
----------------------------------------------------

windows版mecabにutf-8のシステム辞書を追加する

windows版mecabにシステム辞書を追加する。(unix版はこちら
unicodeの文字も扱いたいので、辞書の文字コードはutf-8とする。

環境: windows 7 (64bit)

windows版のmecab(辞書の文字コードutf-8)が既にインストールされていることが前提。

1.utf-8で書かれた辞書を用意する

こちらのページの1~3を参考

2.インストール済みmecabの辞書をutf-8に保存し直す

windowsにインストールされたmecabの辞書データはsjisで保存されている(インストール時にutf-8を選んだとしても)。拡張子がCSVとdefのファイルが辞書データなのですべてutf-8に保存し直す。(ディレクトリ全体に対してutf-8変換してもいい) ←ダメだった

辞書CSVファイルのパス
---------------------------------------------
C:\Program Files (x86)\MeCab\dic\ipadic
---------------------------------------------

文字コード一括変換のために使用したソフト
KanjiTranslator
「UTF-8(BOM無し)」「改行=CR+LF」← この設定で行った

utf-8に変換したら、追加用の辞書も同じフォルダに放り込む

3.辞書をコンパイルし直す

mecab-dict-indexを実行するので、mecab-dict-index.exeのあるフォルダまでコマンドプロンプトで移動。

mecab-dict-indexの詳細。こちら

mecab-dict-index.exeはここにあった。
------------------------------------------
C:\Program Files (x86)\MeCab\bin
------------------------------------------

実行。
------------------------------------------
mecab-dict-index -d "C:\Program Files (x86)\MeCab\dic\ipadic" -f utf-8 -t utf-8
------------------------------------------
パスの途中の半角スペースが区切りと誤認されないようにパス全体をダブルクォートでくくる。

「アクセスできない」等のエラーが出たら、フォルダを右クリックしてアクセス権を与えておく。

成功すると、4つのファイルができる

ファイルができる場所
------------------------------------------
C:\Program Files (x86)\MeCab\bin
------------------------------------------

ファイル名
------------------------------------------
char.bin
sys.dic
unk.dic
matrix.bin
------------------------------------------

4.できたファイルを正しい場所に移動させる

移動場所。元あるファイルと置換となる。
------------------------------------------
C:\Program Files (x86)\MeCab\dic\ipadic
------------------------------------------

ファイル移動の際アクセス権限がないとエラーが出たら、フォルダに権限を与えて、一度デスクトップにコピーして、目的のフォルダへ移動。(フォルダからフォルダへの移動ができなかった)
mecabは終了させておく。起動してると元ファイルが削除できない。

以上。

秀丸エディタのキー割り当て一覧(デフォルト)

秀丸エディタのキー割り当て一覧。

行の選択がしたくて調べた。
行の選択は左トリプルクリック。

初期設定時のキー割り当て一覧
-----------------------------------------------
F1 = 秀丸エディタヘルプ
F3 = 下候補
F4 = (標準の動作:次の結果)
F5 = 単語をコピー
F6 = 分割ウィンドウ切り替え
F7 = 切り抜き
F8 = コピー
F9 = 貼り付け
F10 = タグジャンプ
F11 = アウトライン解析...
F12 = 行番号表示/非表示
左ダブルクリック = 単語選択(全部)
左トリプルクリック = 行の選択
右クリック = メニュー8:右ボタン
常駐秀丸エディタのダブルクリック = 新規作成
Shift+F1 = 記録開始/記録終了
Shift+F2 = 再生
Shift+F3 = 上候補
Shift+F4 = (標準の動作:前の結果)
Shift+F5 = 行をコピー
Shift+F6 = 選択開始
Shift+F7 = 追加切り抜き
Shift+F8 = 追加コピー
Shift+F9 = BOX貼り付け
Shift+F10 = メニュー8:右ボタン
Shift+Enter = 空行挿入
Ctrl+F1 = 外部ヘルプ
Ctrl+F4 = ファイルを閉じる
Ctrl+F6 = 次の秀丸エディタ
Ctrl+F10 = ダイレクトタグジャンプ
Ctrl+Enter = 行削除
Ctrl+Del = 単語削除(カーソルから後ろ)
Ctrl+Up = 高速上移動
Ctrl+Down = 高速下移動
Ctrl+Right = 単語右
Ctrl+Left = 単語左
Ctrl+A = すべてを選択
Ctrl+C = コピー
Ctrl+F = 検索...
Ctrl+G = 指定行...
Ctrl+H = バックスペース
Ctrl+I = タブ
Ctrl+J = 改行
Ctrl+K = 対応する括弧に移動
Ctrl+L = 最後に編集した所
Ctrl+M = 改行
Ctrl+N = 新規作成
Ctrl+O = 開く...
Ctrl+P = 印刷...
Ctrl+Q = メニュー3:Ctrl-Q
Ctrl+R = 置換...
Ctrl+S = 上書き保存
Ctrl+V = 貼り付け
Ctrl+X = 切り抜き
Ctrl+Y = やり直しのやり直し
Ctrl+Z = やり直し
Ctrl+[ = {に移動
Ctrl+] = }に移動
Ctrl+< = 単語左 Ctrl+> = 単語右
Shift+Ctrl+F1 = 外部ヘルプ2
Shift+Ctrl+F6 = 前の秀丸エディタ
Shift+Ctrl+F10 = バックタグジャンプ
Shift+Ctrl+F = 検索(上)...
Shift+Ctrl+N = 下の強調行
Shift+Ctrl+P = 上の強調行
Shift+Ctrl+< = 単語の先頭に移動 Shift+Ctrl+> = 単語の最後に移動
Alt+Bksp = (標準の動作:やり直し)
Alt+Enter = (標準の動作:単語補完)
Alt+Up = (標準の動作:前の折りたたみ可能行)
Alt+Down = (標準の動作:次の折りたたみ可能行)
Alt+Right = (標準の動作:展開)
Alt+Left = (標準の動作:折りたたみ)
Alt+[ = (標準の動作:部分編集)
Alt+] = (標準の動作:部分編集解除)
Alt+Shift+Bksp = (標準の動作:やり直しのやり直し)

メニュー1:ファイル
N|新規作成
O|開く...
S|上書き保存
C|ファイルを閉じる
B|別ファイルへの追加保存
L|閉じて開く...
P|ファイル名変更...
U|再読み込み
W|上書き禁止

メニュー2:C言語機能
P|上の強調行
N|下の強調行
--------------------
[|{に移動
]|}に移動
--------------------
C|アウトライン解析...
S|強調行の範囲選択
H|外部ヘルプ
T|タグジャンプ
D|ダイレクトタグジャンプ
B|バックタグジャンプ
G|tagsファイルの作成...

メニュー3:Ctrl-Q
S|行頭に移動
D|行末に移動
--------------------
R|ファイルの先頭
C|ファイルの最後
--------------------
E|画面の先頭
X|画面の最後
--------------------
F|検索...
A|置換...
--------------------
[|{に移動
]|}に移動

メニュー8:右ボタン
Z|やり直し
--------------------
V|貼り付け
A|すべてを選択

選択中右ボタン
X|切り抜き
X|コピー
X|貼り付け
--------------------
X|引用付きコピー
X|追加切り抜き
X|追加コピー
--------------------
X|削除
--------------------
X|TO UPPER CASE
X|to lower case
--------------------
X|ハンカクに変換
X|全角ひらがなに変換
X|全角カタカナに変換
--------------------
X|TAB -> 空白 変換
X|空白 -> TAB 変換
--------------------
X|インデント
X|逆インデント
-----------------------------------------------

ちなみにこの一覧は、「その他」-「キー割り当て」-「一覧表作成」で出力できる。

【mysql】CSVをload dataするときに気をつけること

mysqlにおいて、CSVをload dataするときに気をつけること。
うっかりミスを防ぐための自分用おぼえ書き。

1.CSVファイルの改行コードを必ず「LF(\n)」にする

「CR + LF」だと、行の区切りが正しく伝わらず、おかしなところでデータが分けられる。

また、データに改行を含まないときは、行の終わりを明示しておくとハマる可能性が減る。

----------------------------------
load data local infile "/home/username/www/text.csv" into table テーブル名 fields terminated by ',' enclosed by '"' lines terminated by '\n'
----------------------------------

2.NULLが怪しいと思ったら\Nに変えてみる

NULLは\Nで表すらしい。

3.Windows内のCSVファイルでもパスの区切りは「/」(スラッシュ)

通常Windowsのパスの区切りは\(バックスラッシュ)。
しかし、Windowsにインストールしたxamppのmysqlを利用する場合、CSVファイルのパス指定は「/」(スラッシュ)で行う。

コマンドプロンプトで指定
------------------------------------------------------
○ load data infile "C:/Users/username/Desktop/test.csv" into table ~
× load data infile "C:¥Users¥username¥Desktop¥test.csv" into table ~
------------------------------------------------------

MYSQLが遅かったとき、原因究明のため調べたこと

MYSQLが遅かったとき、原因究明のため調べたこと

ターミナルでMYSQLに接続して・・・

1.show processlistでQUERYの実行時間を調べる

2.innodb_thread_concurrencyを確認
InnoDB の処理を同時に実行できるスレッド数の上限値

コマンド
-------------------------------
show variables like '%thread%'
-------------------------------
上限なしの0なので問題なし

3.max_connectionsを確認
max_connectionsは同時接続数の最大値

コマンド
-------------------------------
show variables like '%conection%'
-------------------------------
151と出たので問題なし

4.mysqladminコマンドでMySQLサーバの状態を調べる

ディレクトリ移動(xamppの場合)
-------------------------------
C:\xampp\mysql\bin
-------------------------------

コマンド(パスワードなし)
-------------------------------
mysqladmin status
-------------------------------

コマンド(パスワードあり、xamppの場合)
-------------------------------
mysqladmin status -u ユーザー名 -p
-------------------------------

詳しく見る場合
-------------------------------
mysqladmin mysqladmin extended-status
-------------------------------

こちらを参考にした

エラーが出てることに気づいたので、
-------------------------------
lock wait timeout exceeded; try restarting transaction
-------------------------------

ロックの待ち時間を確認してみる。

コマンド
-------------------------------
show variables like '%timeout%'
-------------------------------

innodb_lock_wait_timeoutが50秒であることを確認。

この件は、テーブルにインデックスをつけることで問題は解決した。
こちら

ただの覚書でした。

【mysql】テーブルにインデックスを追加する方法

mysqlで、既存のテーブルにインデックスを追加する方法

------------------------------------------------
CREATE INDEX インデックス名 ON テーブル名(フィールド名);
------------------------------------------------

もしくは、
------------------------------------------------
ALTER TABLE テーブル名 ADD INDEX インデックス名(フィールド名);
------------------------------------------------

インデックス名は下記のように省略可。
------------------------------------------------
ALTER TABLE テーブル名 ADD INDEX (フィールド名);
------------------------------------------------
この場合、インデックスのフィールド名がそのままインデックス名となる。

TEXT型など一部の型にインデックスの追加を試みると、エラーになる場合がある。

エラーメッセージ
------------------------------------------------
BLOB/TEXT column 'text_field' used in key specification without a key length
------------------------------------------------

対処法。適当にキー長を明示する。
------------------------------------------------
ALTER TABLE テーブル名 ADD INDEX インデックス名(フィールド名(100));
------------------------------------------------

最後にインデックスできてるかを確認。

確認コマンド
------------------------------------------------
show index from テーブル名
------------------------------------------------

UWSCでウインドウを整列させる

UWSCでウインドウを整列させるサンプルコード

ウインドウを上下に並べる
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.TileHorizontally
-------------------------------------------------

ウインドウを左右に並べる
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.TileVertically
-------------------------------------------------

ウインドウを重ねる
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.CascadeWindows
-------------------------------------------------

ウインドウを最小化
-------------------------------------------------
objShell = CreateoleObj("Shell.Application")
objShell.MinimizeAll
-------------------------------------------------

【MYSQL+PHP】トランザクション処理のサンプルコード

MYSQL + PHPでトランザクションを行うための記述例

トランザクションのサンプルコード
///////////////////////////////////////////////////////////////
//通常は、自動コミットが有効になっているのでクエリ入力後、すぐにコミット(データベースの更新処理)が行われる。
//トランザクション処理を行うため「SET AUTOCOMMIT=0」で自動コミットを無効する。

mysql_query("SET AUTOCOMMIT = 0"); //オートコミットを無効にする
mysql_query("begin"); //トランザクション開始

//----この間に複数の処理を記述----------------------------------

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());

//----この間に複数の処理を記述 ここまで-------------------------


mysql_query("commit"); //ここで上記二つの処理が同時に実行される

///////////////////////////////////////////////////////////////

//commitがないので絶対にテーブルは更新されないサンプルコード
///////////////////////////////////////////////////////////////

mysql_query("SET AUTOCOMMIT = 0");
mysql_query("begin"); //トランザクション開始

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());

mysql_query("rollback"); //ロールバックなので実行されない

///////////////////////////////////////////////////////////////

※仮にロールバックがなくても、コミットせずに接続を閉じても、MySQLはそのトランザクションをロールバックするよう。

コミットとロールバックを細かく振り分けるなら、次のような記述ができる。

コミットとロールバックを振り分けるサンプルコード
///////////////////////////////////////////////////////////////

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理

$result = mysql_query($sql1);

if( $result === true ){

mysql_query("commit"); //確定
print "コミットしました";

}else{

mysql_query("rollback"); //巻き戻し
print "ロールバックしました";

}
///////////////////////////////////////////////////////////////

【mysql】重複したレコードのデータを取り出す

重複したレコードのデータを取り出すには、GROUP BY とHAVINGを使えばいい。

サンプルコード
----------------------------------------------------
SELECT カラム名 FROM テーブル名 GROUP BY カラム名 HAVING COUNT(*) >= 2;
----------------------------------------------------

HAVING句はグループ化が行われたデータに対して、条件を指定してデータの絞込みができる。サンプルコードでは、グループ化に指定したカラム名のうち、2つ以上あるものを取り出している。

※WHERE句とGROUP BY句を一緒に使った場合は、まずWHERE句よって条件に合うデータを抽出されて、その結果に対しGROUP BY句によってグループ化が行われる。HAVING句の場合と順序が逆なるということ。
※HAVEは捕まえる、選び取るの意。

複数のカラムが重複したレコードを取り出すサンプルコード
----------------------------------------------------
SELECT カラム名 FROM テーブル名 GROUP BY カラム名1,カラム名2 HAVING COUNT(*) >= 2;
----------------------------------------------------