WordPress: マルチサイトのパーマリンク設定

WordPressをマルチサイトで新しく構築していたときのこと。
親サイトのメニューの設定 > パーマリンク設定でカテゴリーベースやタグベースの値を設定してもリンクが繋がらなかった。
個別ページへのリンクをクリックすると404となるのですが、管理ページ(/wp-admin/〜)は普通に表示されるので、.htaccessによるmod_rewriteは効いているようなのに、個別エントリーへのリンクとカテゴリーベースのリンクは404という状態。

パーマリンクの設定ではなく、
参加サイト>サイトネットワーク管理者>サイトのサイト一覧から親サイトを選び、
設定タブをクリックした時に表示される
・Permalink Structure
・Category Base
・Tag Base
を変更すると、それぞれ反映されました。

マルチサイトで運用すると親サイトのURLに/blogという文字がデフォルトで入ってしまうのですが、この方法で/blogを消すことも出来ます。

今回の設定内容の覚え書き:

Permalink Structure /%category%/%postname%
Category Base /category
Category Base /tag

参考:
親サイトのパーマリンクの「/blog」を消す方法[マルチサイト,WordPress]

Let’s Encryptの証明書がAndroidブラウザで信頼されなかった件

Let’s Encryptで作成したSSL証明書をサイトにインストールしてから、Androidのブラウザで確認したらアドレスバーに表示される鍵アイコンが赤色になってました。

結論から言うとApacheの設定が間違っていて、中間証明書の記述が漏れてました。

間違い:

SSLCertificateFile /etc/ssl/example.com/cert.pem
SSLCertificateKeyFile /etc/ssl/example.com/private.key.nopass

正解:

SSLCertificateFile /etc/ssl/example.com/cert.pem
SSLCertificateKeyFile /etc/ssl/example.com/private.key.nopass
SSLCertificateChainFile /etc/ssl/example.com/chain.pem

よくある質問 – Let’s Encrypt 総合ポータル

Let’s Encrypt の証明書はブラウザで信頼済みとして扱われますか?

端的に答えると「イエス」です。
詳しく述べると、Let’s Encrypt の中間証明書は、広く信頼されている米大手認証局(CA)である IdenTrust のルート証明書によってクロス署名されています。
これにより、IdenTrust のルート証明書からチェーンされている限り、Let’s Encrypt の証明書は「信頼された証明書」として扱われます。そのため、IdenTrust のルート証明書を信頼しているほぼ全てのプラットフォームでは、Let’s Encrypt の証明書は「信頼された証明書」となります。

というわけで、SSLCertificateChainFileを設定しましょうということですね。
ちなみにApacheのバージョンが2.4.8以降ならばSSLCertificateFileディレクティブにfullchain.pemを設定すればOKとのことです。
その場合はこういう記述になるはずです。

SSLCertificateFile /etc/ssl/example.com/fullchain.pem
SSLCertificateKeyFile /etc/ssl/example.com/private.key.nopass

ブラウザが証明書の検証結果をキャッシュしているようで、サーバの変更後すぐには確認できませんでしたが、10分くらい待って再確認するときちんと信頼られた証明書として確認できました。

Android 6 Marshmallow : Xperia Z3 compact のSDカード内部ストレージ化をやってみた

SDカードの内部ストレージ化で内部ストレージの容量を増やす

Amazonで購入したSDカードが届いたので、Android 6 Marshmallowの新機能を使ったSDカードの内部ストレージ化を試してみました。

私が購入したのはTranscendのmicroSDHCカード32GBです。

事前の情報収集で、いつくか不具合があるらしいことを知ったのでバックアップを作成してから変更に臨みました。

SDカードの内部ストレージ化について、主だった不具合として以下のような内容が伝えられていました。

・ストレージのサイズ表示がおかしい
・内部ストレージ<=>外部ストレージでアプリの移動ができない
・カメラアプリがクラッシュする

こちらはベータ版のときの情報も含むので、正式に配信された現在では改善されているかもしれません。
それに私のZ3 compactの内部ストレージ残量はもう限界です。
頼むから改善されててくれー!と祈りながらの作業でしたが、結果としては快適に使えています。

設定手順はこちらを参考させていただきました。
Android 6.0 MarshmallowなXperia Z5シリーズでSDカードを内部ストレージとして使用する方法

SDカードの容量全部を内部ストレージに割り当てると外部ストレージの容量がゼロになってしまい、
外部ストレージにデータを保存する設定になっているアプリで不具合が起きる懸念があります。

少なくとも今使っている外部ストレージの容量分は外部ストレージとして認識するようにしておいたほうが良さそうです。
私はパテーションを切るコマンドは半分を内部ストレージに、半分をSDカードとして使うように以下のコマンドを実行しました。

sm partition disk:179,96 private mixed 50

フォーマットが終わるとこのように内部ストレージとしてSDカードが認識されています。

Android SDカードを内部ストレージに割り当てる
Android SDカードを内部ストレージに割り当てる

アプリデータの移動について

バックアップしたSDカードの内容を新しいSDカードの外部ストレージ領域にコピーしたのですが、外部ストレージに保存していたアプリは使えなくなりました。ファイルをコピーしてもリンクが切れたままの状態となるようです。

使えなくなったアプリはアンインストール後再度インストールすれば、また使えるようになります。しかしデータは初期化されますので、データを引き継ぎたいアプリは予め内部ストレージ移動しておくのがよいでしょう。

アプリを内部ストレージ・外部に移動する方法 (Marshmallow)
1. 「設定」→「アプリ」から任意のアプリを選択する
2. 「ストレージ」をタップ
3. 「変更」ボタンをタップ
4. 内部ストレージか外部ストレージを選択
※「変更」ボタンは移動が可能なアプリにしか表示されません。

私の場合は内部ストレージの空きが少なくて、全てのアプリ内部ストレージに移動することができなかったので、ゲーム類はデータの引き継ぎ機能を利用してデータを維持しました。

ゲームの引き継ぎ機能を使ったデータ復元の手順
1. SDカードを交換する前にデータ引き継ぎ用のパスワードを発行する
2. SDカード交換後に使えなくなったゲームアプリをアンインストール
3. ゲームアプリを再インストール
4. 引き継ぎ用パスワードを使ってゲームのデータを復活させる

注意:この方法はパスワードが間違っているとデータを失うことになりますので注意してください。
手順1と4はアプリによって異なりますので、アプリのゲーム引き継ぎ方法を調べてください。
手順の2でゲームをアンインストールした後はバックアップを使ってもデータが戻らない場合がありますのでパスワードはスクショを取るなどして確実に保管してください。

可能な限りアプリを内部ストレージに移動しておくのが安全です。

Kohana 3.3.x で KOstacheを使う

注意:Kohana 3.3でPSR-0がサポートされたため、3.2ベースのモジュールは使えないものが多くなっています。
Kohana 3.3でKOstacheを使用する手順をまとめました、
※KOstacheはロジックレスなテンプレートエンジンです。KOstacheの詳細はこちら。

まず、Kohanaのモジュールディレクトリで KOstacheをcloneしてモジュールを取り込みます。

cd modules
git clone https://github.com/zombor/KOstache.git

PSR-0がサポートに対応したバージョンをチェックアウトします。

cd KOstache

mustasheを取ってきてKOstacheのvendorディレクトリにコピーします。

git clone https://github.com/bobthecow/mustache.php.git /tmp/mustache.php # とりあえず/tmpにチェックアウト
cp -R /tmp/mustache.php/* vendor/mustache/

グローバル版Xperia Z3 compactをMarshmallowにアップデート

やっと配信されたAndroid 6.0 Marshmallow

今日私のXperia Z3 compact(グローバル版)に「本体ソフトウェア更新」の通知が出ていました。

2〜3ヶ月前からZ3 compactにAndroid 6.0 (Marshmallow) のアップデートが配信されることは知らされていましたが、私の端末には今日やっと配信がきました。

Android 6.0の大きな更新内容として以下のようなものがあります。

  • アプリのアクセス制限をユーザが個別に選択できるようになる
  • ・バッテリーを長持ちさせるDozeモードの追加
  • ・標準の電話アプリで着信拒否が可能になる
  • ・指紋認証に対応
  • ・アプリのデータを自動でバックアップ
  • ・SDカードを内部ストレージとして使える

※個人的に重要と思う変更をピックアップしました。変更点はこちらが詳しいです。
Android | アンドロイド 6.0 Marshmallow

アップデートは来たけれど、端末が対応していない機能も

残念ながらXperia Z3 compactには指紋センサーが無いので指紋認証は使えません。

Z3 compactは内部ストレージが16GBしかなく、私の使い方では容量が足りなくなりつつあるので「SDカードを内部ストレージとして使える」機能は嬉しいです。

拡張可能なストレージ
フレキシブル ストレージ: Android 6.0 Marshmallow では、SD カードや外部ストレージ デバイスを、アプリやゲーム用の暗号化された拡張ストレージとして簡単に使用できるようになりました。

しかしこの機能が無効化されている端末は多くあり、Xperia Z5でも無効化されているようです。
SD card as internal storage removed from Marshmallow

調べたところ、設定からは操作できないもののSDカードを内部ストレージとして使うことは可能なようなのでこちらのサイトを参考にやってみようと思います。

Android 6.0 MarshmallowなXperia Z5シリーズでSDカードを内部ストレージとして使用する方法

アップデートをしたら更に内部ストレージの残り容量が厳しくなったので、早速試したいのですが、この機能を試すにはSDカードの初期化が必要になります。
それにいくつか不具合があるようです。

  • ストレージのサイズ表示がおかしい
  • 内部ストレージ<=>外部ストレージでアプリの移動ができない
  • カメラアプリがクラッシュする

サイズ表示が変になるくらいならいいのですが、カメラが使えなくなるのは嫌ですね。
「SDカードの内部ストレージ化」については、念のため新しいSDカードを買ってからをやってみようと思います。

アプリを「SDカードへデータ転送」できなくなる?

内部ストレージが少ない状態で使用していると頻繁に「SDカードへデータ転送」を行うことになりますが、アップデート後に「SDカードへデータ転送」をしてみるとアプリが移動できなくなっていました。

SDカードへデータ転送

写真や動画は移動できるけど、アプリは移動できなくなっている。

この状況で「SDカードの内部ストレージ化」が出来なかったら、困りますね。
喜んでMarshmallowへとアップデートしたのですが、軽率な判断だったかもしれません。

*追記: SDカードを購入したので試してみました。
Android 6 Marshmallow : Xperia Z3 compact のSDカード内部ストレージ化をやってみた

参考:
XperiaZ5でAdoptable Storageを使ってみた結果…

[TUTO] Enable Adoptable Storage on MM

VirtualBox : Runtime error opening ‘…’ for reading: -102 (File not found.). エラー

VirtualBoxを起動しようとしたらこんなエラーが出ていた。

Runtime error opening 'C:\Users\hoge\VirtualBox VMs\Ubuntu201207\Ubuntu201207.vbox' for reading: -102 (File not found.).
D:\tinderbox\win-4.2\src\VBox\Main\src-server\MachineImpl.cpp[725] (long __cdecl Machine::registeredInit(void)).
終了コード : 
E_FAIL (0x80004005)
コンポーネント: 
Machine
インターフェース: 
IMachine {22781af3-1c96-4126-9edf-67a020e0e858}

C:\Users\hoge\VirtualBox VMs\Ubuntu201207のディレクトリを見てみたら確かにUbuntu201207.vboxは無く、替りに以下2つのファイルが有った。

Ubuntu201207.vbox-prev
Ubuntu201207.vbox-tmp

とりあえず、両方バックアップを取ってUbuntu201207.vbox-prevの方をUbuntu201207.vboxにリネームしたら起動できるようになった。

PHP : 文字列をjavascript用にエスケープする

PHPで作成した文字列をjavascript上で使用したいときのエスケープ処理について。
ダブルクォーテーションやシングルクォーテーション、バックスラッシュ等をjavascript上で文字列として扱うにはエスケープが必要になる。
PHPのjson_encode関数は自動で文字列をjavascript用にエスケープしてくれるが、これは配列やオブジェクトにも使える関数で、前後に””が付いた形で出力される。
単に文字列として扱いたい場合前後のダブルクォーテーションは邪魔なのでそれを取り除いて返す関数を作成した。
最初のifはNULLを文字列の”null”で返さないようにするため。

function js_string($str){
    if(!$str) $str = '';
    $tmp = json_encode($str);
    preg_match('/^"(.*)"$/',$tmp,$m);
    return $m[1];
}

MySQL : CSVファイルのインポートでERROR 29 ,(Errcode: 13)が出るとき

CSVファイルのインポートで

ERROR 29 (HY000): File ‘xxx.csv’ not found (Errcode: 13)

のエラーが出るときのチェックポイント。

パーミッション

まず(Errcode: 13)は権限エラーなので、ファイルとその親ディレクトリの権限を確認する。
ファイルは644,ディレクトリは755なら問題ない。

コマンド

データをインポートするコマンドが

LOAD DATA LOCAL INFILE 'ファイル名' ...

になっているかを確認する。

LOAD DATA INFILE 'ファイル名' ...

ではだめ。

macOSX : haskell-platformをインストール

macOSXにhaskell-platformをインストールする。
homebrew で

brew install haskell-platform

プロンプトの”Prelude>”は場所を取るので~/.ghciに以下の設定を記述する

:set prompt "ghci>"

cabalでhlintを入れる。

cabal update
cabal install cabal-install # ここは新しいcabalがあるときだけ必要
cabal install happy
cabal install haskell-src-exts
cabal install hlint

emacsにhaskell-modeを入れる

wget http://projects.haskell.org/haskellmode-emacs/haskell-mode-2.8.0.tar.gz
tar zxfv haskell-mode-2.8.0.tar.gz
mv haskell-mode-2.8.0 /path/to/.emacs.d/elisp/

emacsにFlymakeを入れるために、PATHが通ったところにflycheck_haskell.plを作る。
以下のサイトのソースをコピペ。
http://www.emacswiki.org/cgi-bin/emacs/FlymakeHaskell

~/.emacs.d/init.elにhaskell-modeを読み込む記述を追加する
※以下のサイトからコピペ。1行目のload-pathだけ環境に合わせた。
http://d.hatena.ne.jp/nyaasan/20071216/p1
http://d.hatena.ne.jp/nushio/20071201

;; haskell
(add-to-list 'load-path (concat dropbox-emacs-dir "/elisp/haskell-mode"))
(require 'haskell-mode)
(require 'haskell-cabal)
(require 'flymake)
(defun flymake-haskell-init ()
  (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
         (local-dir   (file-name-directory buffer-file-name))
         (local-file  (file-relative-name
                       temp-file
                       local-dir)))
    (list "~/tool/sh/flycheck_haskell.pl" (list local-file local-dir))))

(push '(".+\\hs$" flymake-haskell-init) flymake-allowed-file-name-masks)
(push '(".+\\lhs$" flymake-haskell-init) flymake-allowed-file-name-masks)
(push
 '("^\\(\.+\.hs\\|\.lhs\\):\\([0-9]+\\):\\([0-9]+\\):\\(.+\\)"
   1 2 3 4) flymake-err-line-patterns)

(add-hook 'haskell-mode-hook
          '(lambda ()
             (if (not (null buffer-file-name)) (flymake-mode))
          ))
(add-to-list 'auto-mode-alist '("\\.hs$" . haskell-mode))

(global-set-key "\C-cd"
                'flymake-show-and-sit )
 
 (setq haskell-doc-idle-delay 0.1)
 
 (defun flymake-show-and-sit ()
  "Displays the error/warning for the current line in the minibuffer"
  (interactive)
  (progn
    (let* ( (line-no             (flymake-current-line-no) )
         (line-err-info-list  (nth 0 (flymake-find-err-info flymake-err-info line-no)))
         (count               (length line-err-info-list))
         )
    (while (> count 0)
      (when line-err-info-list
        (let* ((file       (flymake-ler-file (nth (1- count) line-err-info-list)))
               (full-file  (flymake-ler-full-file (nth (1- count) line-err-info-list)))
               (text (flymake-ler-text (nth (1- count) line-err-info-list)))
               (line       (flymake-ler-line (nth (1- count) line-err-info-list))))
          (message "[%s] %s" line text)
          )
        )
      (setq count (1- count)))))
  (sit-for 60.0)
  )
 
 ;; Auto enter flymake
 (add-hook 'haskell-mode-hook
          '(lambda ()
             (flymake-mode)))

第2回 関数型言語勉強会 大阪

第2回 関数型言語勉強会 大阪に参加しました。

@daiksy さん 乙女ゲーを支える技術

ペアプロはレビューを受けているのと同じ。2ヶ月で違和感無くScalaを使えるようになった。
既存のJavaライブラリを使える。ペアプロで保守性があがった。

仕事でペアプロできるの羨ましい。
案件によっては開発の難易度より保守のしやすさを優先した方がメリットがある場合もあることを覚えておく。

@kitora_naoki さん Java から Scala へ

ScalaはREPL(Read-eval-print loop)を備えていてお手軽。
パターンマッチが強力。switch文でいろんなパターンマッチが出来る(型パターン)。
学習リソースの紹介 
『Scalaスケーラブルプログラミング 第2版』

オンライン学習
https://www.coursera.org/course/progfun
Effective Scala(日本語訳)
http://twitter.github.com/effectivescala/index-ja.html

TypesafeのIDEにはREPL機能が付いている

REPLとインタープリタを混同していた。。。
_(アンダーバー)で省略するとscalaっぽいコードになる。顔文字プログラミング

@_likr さん PythonistaがOCamlを実用する方法

OcamlはC,C++とほぼ同等の処理能力をもつ。
OCamlに関数を追加するたびにCのプログラミングを追加 → ctypesで橋渡し
http://d.hatena.ne.jp/likr/20111017

@pocketberserker さん F#+Erlangで簡単なゲームを作ってみる(仮)

WebSharper Webフレームワーク。F#で書ける。Javascriptを生成できる
描画はcanvasで実装
Expert F#3.0 にWebSharperの情報あり
rebar・・・Erlangのビルドツール
http://d.hatena.ne.jp/otf/20111203/1322945280
自分にあった関数型言語をみつける
Javascriptは生成するもの

→自分にあった関数型言語をみつける。とりあえずHaskellもやってみないと決められない。

@aa7th さん Scalaの勉強はじめました(仮)

Scalaビギナーズ勉強会を開催予定です!日程未定、場所オオサカンスペース

コップ本はよい本だと思う。

@bleis さん F#についてのの発表 F#を説明に使った発表

better ○○ を脱却するために。
タプルの使い分け→関数内ならタプル、外部公開はレコード。フィールドがたくさんあるときもレコード。
F#のアクティブパターン、アクティブパターンに型を導入する。

型を使って使い方を間違えない関数を作るように心がける。「使う度」と「生成時のみ」の違いに気を使う。

@kakkun61 さん Haskell 入門書を読んだその後は

Haskell入門書を読んだ人が、次に何をするかの提案

H-99: Ninety-Nine Haskell Problems
http://www.haskell.org/haskellwiki/H-99:_Ninety-Nine_Haskell_Problems

APIを調べる
Hoogle
http://www.haskell.org/hoogle/
Hayoo!
http://holumbus.fh-wedel.de/hayoo/hayoo.html

Haskellの勉強会 in 明石。
http://connpass.com/event/1435/

@s_kozake さん 楽しい高階関数

map関数、filter関数、fold関数の説明
map関数の名前は”map over”から
foldlはリストの先頭から処理、foldlはリストの末尾から処理。
Haskell,Scalaそれぞれのfold関数実装について
foldRightはStackOverflowが起きる。RangeはReverseしてFoldLeftで回避している。

@mollifier javascriptと関数型言語

javascriptを関数型言語っぽく使って関数型言語を普及するべし

私の発表
pfffの拡張を通してOCamlを勉強したことについて発表させていただきました。
OCamlを勉強する過程で躓いたこと発見したことなど、沢山あったのですが5分という時間でお伝えするのは難しくて
その部分をかい摘むんだ結果あまり関数型と関係無い内容になってしまいました。
スライドは後日公開したいと思います。

アップしました(2012/11/26)
http://www.slideshare.net/rienakau/ocamlpfff

Togetter
第二回関数型言語勉強会 #fpstudy – Togetter