さくら共用サーバーに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で半角記号が名詞,サ変接続になるのを解決する
----------------------------------------------------
カテゴリー:mecab
新しいカラムを既存カラムの後ろに追加するサンプルコード
----------------------------------------------------
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
----------------------------------------------------
カテゴリー:mysql
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は終了させておく。起動してると元ファイルが削除できない。
以上。
カテゴリー: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するときに気をつけること。
うっかりミスを防ぐための自分用おぼえ書き。
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 テーブル名
------------------------------------------------
カテゴリー:mysql
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
-------------------------------------------------
カテゴリー:uwsc
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, PHP
重複したレコードのデータを取り出すには、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;
----------------------------------------------------
カテゴリー:mysql