svnで結果をたくさん入れたかった

Ubuntu Serverのアップグレードを行ったんだけど、apacheのconfファイルが色々と変わってて、それに伴って/etc配下をsvnに入れてた分の更新作業を行った。

Ubuntu Serverは12.04から14.04にアップグレードしたんだけれど、一つ前の13.10からapacheのconfのルールなどがちょくちょくかわったみたいで更新作業が結構発生した。

また標準で(?)くっついてくるモジュールが減ったらしく、前のバージョンでは存在したmodsのconfとloadファイルが無くなっていた。

自分は利用するconfファイルをすべてsvn管理下においているんだけど、アップグレードでaptによって削除されてしまったファイルがいくつか。


shell> cd /etc/apache2/
shell> svn st
...(前略)...
? mods-available/authn_core.load
! mods-available/authn_default.load
? mods-available/authn_socache.load
? mods-available/authz_core.load
? mods-available/authz_dbd.load
! mods-available/authz_default.load
? mods-available/buffer.load
? mods-available/cache_disk.conf
? mods-available/cache_disk.load
? mods-available/cache_socache.load
! mods-available/cern_meta.load
? mods-available/data.load
? mods-available/dialup.load
...(後略)....

svn stしてみると出てくるファイルのうち、?は新規に追加されたファイル、!は削除されてしまったファイル。
これらのファイルをsvn del、svn addしてみる。
手動でひとつひとつ追加、削除するのは大変なのでsvn stからcutをつかってxargsにわたしてみる。
svn stの!とか?からファイル名までは空白8文字で、cutに行頭から9文字を削除するオプションがあるらしくてそれをつかう。

shell> svn st | grep ! | cut -c9- | xargs svn del
D authn_default.load
D authz_default.load
D cern_meta.load
D disk_cache.conf
D disk_cache.load
D ident.load
D imagemap.load
D mem_cache.conf
D mem_cache.load
D version.load
shell> svn st | grep \? | cut -c9- | xargs svn add
A cache_disk.load
A cache_socache.load
A data.load
A dialup.load
A echo.load
...(後略)...

</pre>

というわけでたくさんのファイルを一括して処理できました。

addの方ではハテナマークをエスケープするためにバックスラッシュを追加した。またファイル名の途中にハテナやビックリが入っていると引っかかりそうなので、行頭から(-e ‘^!’)を入れた方がいいかも。

WordPressの検索で検索結果が表示されなくて困った

WordPressの検索をいじっている最中に検索結果が出なくて困った。

pre_get_posts (にフックした関数)をいじっていたんだけれど、全然思ったような結果にならずに結構困っていた。

原因は色々あったんだけれど、二箇所で困ったのでメモしておく。

検索結果がでない、ということはSQLに問題がある。

なのでSQLの中身を確認してなぜ出ないかを検討することに。

以下のダンプをpre_get_postではなく、利用したいテンプレート側に記載。

$wp_query->requestは実行されたSQL文なんだけど、これはpre_get_postsの後に実行されたSQL文なので該当するテンプレートに記載しないと読み出せない。


<span style="line-height: 1.5;">var_dump($wp_query->request);</span>

まず一つはpost_typeが’post’にしかなっていない点。これはpre_get_postsの関数内で


$query->set('post_type', 'post');

を記載すること。これが実は結構やっかいで、他の条件文、例えばtax_queryなどと組み合わす際には無くても何とかなったりするので、条件文を組み立てている最中のデバッグと完成したカタチではpost_typeの指定が必要か不要か、結構迷うことになる。

post_typeに何も指定されていない場合に実際に中身を決定づけているのはwp-includes/query.phpのget_posts内でpost_type = ‘any’として処理していき、状況に応じていろんなのが入る。例えばattachmentとかpostなど。

このget_postsは結構大きなメソッドでこれまた結構読みづらいんだけど、詰まるたんびに読んでいればそのうち読めるようになるかも。

さて次いで検索結果がでない状況に当たったんだけど、これはSQL内に 0 = 1 なんていう文が。例えば下記のような感じに。


string(250) "SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND 0 = 1 AND wp_posts.post_type = 'custom_post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5"

where句の二つ目にばっちり0 = 1の条件が。おかげさまで検索結果はゼロに。

wp-includes/query.phpのget_postsを丁寧に調べていくと下記の部分で付け加えられていた。


// Taxonomies
 if ( !$this->is_singular ) {
 $this->parse_tax_query( $q );

$clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' );

$join .= $clauses['join'];
 $where .= $clauses['where'];
 }

ここのtax_query->get_sql() の部分。

今回このpre_get_postsではtax_queryを使用していなかったのでどうやらそれが原因らしい。

結果としては今回対象となるページが http://www.example.com/search/ なんていう検索用のURLだったんだけど、searchを普通のpostのcategoryとして見做していたようで、get_posts内の$this->tax_queryという$qを元に作られたタクソノミクエリでは


object(WP_Tax_Query)#9 (2) {
 ["queries"]=>
 array(1) {
 [0]=>
 array(5) {
 ["taxonomy"]=>
 string(8) "category"
 ["terms"]=>
 array(1) {
 [0]=>
 string(6) "search"
 }
 ["include_children"]=>
 bool(true)
 ["field"]=>
 string(4) "slug"
 ["operator"]=>
 string(2) "IN"
 }
 }
 ["relation"]=>
 string(3) "AND"
}

という状態に。

$qや$parsed_query、$wp_queryを調べてみると’category_name’に’search’が設定されていた。

これはパーマリンク設定で記事名を/%category%/%postname%/のようにしていたことで、最初のスラッシュからスラッシュの間をカテゴリ名として認識していたから、のようだ。

なのでpre_get_postsの中で


$query->set('category_name', '');

としてやることで不必要なtax_queryを省くことができた。

MacのAndroid Developer Toolsで実機デバッグをやってみた

MacのAndroid Developer Tools(adt)のEclipseで実機デバッグをやってみた。

やり方をググってみたんだけれど、なかなかうまく認識できなかったのでやり方をメモ。

使用している実機はKaihouというメーカーのkh-mid-700という中華パッド。通常だったらベンダから提供されるUSBドライバを使うんだけれど、マイナー機種だったのでググってみると汎用USBドライバを使えとのこと。

流れとしては

  1. 実機を接続
  2. 実機のベンダIDを調べて
  3. manifest.iniにベンダIDを記載
  4. android adb update を実行して ~/.android/adb_usb.ini にベンダIDを追記
  5. (上記の手順では ~/.android/adb_usb.ini にベンダIDが追記されないことがあるが、その際には手動で追記)
  6. adbサーバを再起動
  7. adb devicesで確認

という流れになる。

結構色々と大変なところがあるんだけれど、情報も増えてきているので状況は良くなっているかも。

2の実機のベンダIDの調べ方は何種類かある。一つはターミナルからsystem_profilerを使う方法。もう一つはGUIからUSBの情報を調べる方法。

system_profilerは元々macに入っているツールで、USBの一覧などを取得できるらしい。


shell> system_profiler SPUSBDataType
(中略)
KH-MID700:

Product ID: 0x0010
 Vendor ID: 0x2207 (Fuzhou Rockchip Electronics Co., Ltd.)
 Version: 2.22
 Serial Number: YRVVHROS0U
 Speed: Up to 480 Mb/sec
 Manufacturer: rockchip

(後略)

GUIから調べる場合にはFinderのアップルマークから

About This Mac > More Info > System Report

で出てくるウィンドウの
Hardware > USB

に同じ情報が載っているのでそこから Vender IDを取得。

このVendor IDは実機を認識するために何度も使って必ず必要になるのでメモメモ。

ついで実機用のmanifestを作成。このmanifestはadtのsdkディレクトリにあるadd-onに実機名でディレクトリをつくって manifest.ini を作成する。


shell> cd /Applications/adt/sdk/add-ons
shell> mkdir kh-mid700; cd kh-mid700
shell> vi manifest.ini

--- from here ---
name=kh-mid700
vendor=kaihou
description=kaihou mid700
api=10
<span style="line-height: 1.5;">revision=1
</span>usb-vendor=0x2207

--- for here ---

manifest.iniを記載したらこの情報をAndroid Developer Bridge(adb) に教えてあげる。これは android update adb を実行する事でできるんだけれど、うまくいかないことも多々ある。


shell> /Applications/adt/sdk/tools/android update adb

adb has been updated. You must restart adb with the following commands
 adb kill-server
 adb start-server

これを実行するとadbのサーバを再起動するように促される。

このandroid update adbを実行するとホームディレクトリにある‘ ~/.android/adb_usb.ini に追記されるはずなんだけれど、そうじゃないことも多々ある。確認を行って追記されていない場合、コメント文しかない場合には手動でVendor IDを追記してやるといい。


shell> more ~/.android/adb_usb.ini

# ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
# USE 'android update adb' TO GENERATE.
# 1 USB VENDOR ID PER LINE.

shell> echo "0x2207" >> ~/.android/adb_usb.ini

shell> more ~/.android/adb_usb.ini

# ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
# USE 'android update adb' TO GENERATE.
# 1 USB VENDOR ID PER LINE.
0x2207
shell> adb kill-server; adb start-server

で、最後に確認する。


shell> adb devices
List of devices attached
YRVVHROS0U device

 

いろいろとやり方が書いてあってわかりにくいのだけれど、ここまでたどり着ければオッケーみたい。

 

 

 

参考サイト

MacでAndroid端末が認識されない

Macにgalaxy S2をつなげたのに認識してくれなかった