やるきなし

2016/05/03 05:48 / WordPress Twenty Sixteen wp_nav_menu

Twenty Twelve とか Twenty Thirteen ぐらいだと,Menu を手動で作成していない状態だと,自動で Menu を生成してくれたような気がするのだが,Twenty Sixteen だと上手くいかない.結局うまく行かないという話なのだが,以下調べた内容.

Twenty Twelve だと wp_nav_menu() location が1箇所,Twenty Sixteenは2箇所.

[wp-content/themes/twentytwelve/functions.php]
register_nav_menu( 'primary', __( 'Primary Menu', 'twentytwelve' ) );

[wp-content/themes/twentysixteen/functions.php]
register_nav_menus( array(
    'primary' => __( 'Primary Menu', 'twentysixteen' ),
    'social'  => __( 'Social Links Menu', 'twentysixteen' ),
) );

適当に以下をすれば(子テーマの function.php に書いておく) Twenty Sixteen の wp_nav_menu() location を1つ(primary)のみにできて, wp-admin/nav-menus.php を開いた時でメニューが存在しない場合に $one_theme_location_no_menus がアサートされて,自動でメニューのテンプレートが作成される(保存はされない).でもこれは比較的どうでもいい.

function remove_social() {
    unregister_nav_menu( 'social' );
}
add_action( 'after_setup_theme', 'remove_social' , 20);

header.phpから呼ばれるwp_nav_menu() (nav-menu-template.php) でメニューを表示するのだが,メニューを作っていない状態だとfallback_cbのwp_page_menu() (post-template.php)が呼び出される.これがメニューを自動で作る部分で,以下のファイルを開いてみたりすると確認できる(wp_nav_menu を wp_page_menu に置き換えたりしてみる).

[test.php]
<?php
require_once( dirname(__FILE__) . '/wp-load.php' );
wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) );

メニューを作っていない状態だとやはり Twenty Sixteen ではメニューが表示されない.これは header.php で if ( has_nav_menu( 'primary' ) ) という条件付で wp_nav_menu() が呼び出されるから.ということで,header.php を修正して無理やり wp_nav_menu() を呼び出してみると,メニューは自動で生成されるが,手動で作成したメニューと体裁が異なる(右側に縦積みになってしまう).

手動で作ったメニュー(通常のメニュー)の場合 <div class="menu-menu-1-container"> として生成されるが, wp_page_menu() が生成するのは <div class="nav-menu"> で,これで見た目が違ってくるらしい.あまりthemeをいじりたくないので,仕方なく手動でメニューを生成することにして,項目が多くなってきたらなにがしかpluginを導入するしかなさげ.

2016/05/02 11:01 / WordPress Link Manager

いつも Link Manager を Enable するやりかたを忘れるので備忘メモ.

WordPress (現在 Version 4.5.1) だが,以前は Link Manager なるものが存在してこれでリンク一覧を管理できたのだが,Version 3.5 以降はこの機能が Off になっている.

で,これを Enable する(だけの)Plug-in が Link Manager.中身は以下のみ.

add_filter( 'pre_option_link_manager_enabled', '__return_true' );

ちなみに link list を sort するには「評価 (rating)」を使うと比較的自由に 並び替えができる(なにで sort するかは Widgets の設定の箇所で行う).ただし rating の値は 0 から 10 まで.

2016/04/01 11:44 / lftp 4.7.0

lftpだが,4.6.4から4.7.0でいろいろ変わったらしくmirrorに躓く.

まず以下のようにEPSVコマンド(RFC 2428)を発行してしまい,私が使っているサーバでは以下のような感じでコケる.

---> EPSV
<--- 501 EPSV: Not owner
---- Switching passive mode off
---> LIST -a
---> ABOR
---- Closing aborted data socket
---- Closing control socket

ftp:prefer-epsv trueがdefaultになったらしく,EPSVではなくPASVを使うようにするには,以下の設定が必要.

set ftp:prefer-epsv false

あと,どうもmirrorコマンドを実行した際に一部ファイルでタイムスタンプが「適切に」取れない気配があって,最新版になっているのに無駄にファイルを転送してしまう.サーバとの相性もあるのかもしれないが.これはMLSDコマンドをdefaultで使うようになったかららしい.これを元の挙動,つまり4.6.4のdefaultに戻すには以下の設定をする.

set ftp:use-mlsd false

これでMLSDのかわりに,LIST -aして各ファイル/ディレクトリに対してMDTMでタイムスタンプを取得するようになる.もちろんmirror速度は落ちる.MLSDもMDTMもRFC 3659のコマンドなのだが,なにやら実装がいろいろあるらしい.

以上,該当するchangelogは以下のような感じになっている.

[/usr/share/doc/lftp/changelog.gz]
Version 4.7.0 - 2016-03-28
(snip)
* ftp: prefer EPSV by default.
* ftp: enable MLSD by default (when supported).
(snip)

2016/04/01 09:21 / Android Studio (Java) on Debian GNU/Linux sid

Android Studioの Install メモ.基本的には android-studio-ide-141.2456560-linux.zip を拾ってきて,bin/studio.sh を起動するだけなのだが,JDKがopenjdk-8-jdkだと Oracle の JDK にした方が Performance が出る云々言われる.ということで,Oracle JDK の install からスタート.

https://wiki.debian.org/JavaPackageを参照しつつ Oracle JDK の .deb file を作成,dpkg -i する.jdk-8u77-linux-x64.tar.gz を事前にダウンロードしておいて,以下をする.

% sudo aptitude install java-package
% make-jpkg jdk-8u77-linux-x64.tar.gz
% sudo dpkg -i oracle-java8-jdk_8u77_amd64.deb

このままだと Android Studio が Oracle JDK を見付けてくれないので,.zshrc 等に以下を書いておく.

export JAVA_HOME=/usr/lib/jvm/oracle-java8-jdk-amd64

2016/03/31 10:24 / snmpd (5.7.3+dfsg-1.1), adduser: Please enter a username matching the regular expression configured (Debian-snmp user)

snmpdのupgradeで以下のように失敗する.

Setting up snmpd (5.7.3+dfsg-1.1) ...
adduser: Please enter a username matching the regular expression configured
via the NAME_REGEX configuration variable.  Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.
dpkg: error processing package snmpd (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 snmpd
E: Sub-process /usr/bin/dpkg returned an error code (1)
Setting up snmpd (5.7.3+dfsg-1.1) ...
adduser: Please enter a username matching the regular expression configured
via the NAME_REGEX configuration variable.  Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.
dpkg: error processing package snmpd (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 snmpd

sudo /var/lib/dpkg/info/snmpd.postinst configure で追ってみると,実際のadduser commandは以下のようなもので,これ自体には一見問題なさげなのだが,

adduser --quiet --system --group --home /var/lib/snmp --disabled-password --disabled-login --shell /bin/false Debian-snmp

/etc/adduser.conf にある NAME_REGEX という変数で username に対して制限をかけているらしく Default では NAME_REGEX="^[a-z][-a-z0-9_]*\$" となっている模様.ということで Debian-snmp はこれにマッチしないのでコケている様子.同様に Debian- が prefix になっている username としては,手元の計算機では既に Debian-gdm というのがあって,/var/lib/dpkg/info/gdm3.postinst ではadduserを--force-badname option 付きで呼んでいる.ということで/var/lib/dpkg/info/snmpd.postinstのadduserの箇所に--force-badname optionを追加して解決.

ちなみに,これより前のバージョンでは snmp の pseudo user は snmp.

なおこの問題は既にhttps://bugs.debian.org/cgi-bin/bugreport.cgi?bug=819531のように解決されているらしく,5.7.3+dfsg-1.2 で直る見込み(使っているミラーサイトにはまだ来ていない).