投稿

2016の投稿を表示しています

C++ではコンテナを渡してはいけないらしい

経度のように周期的なデータが長さn配列xに格納されているとする。添字が0から始まるとして,x[n]はx[0],x[-1]はx[n-1]の値を返すようにしたい。[]の定義は後回しにして,今回は関数を書いてみる。
C++でtemplateを使っておけば,特定の型に依存しないようにするジェネリックプログラミングだと思っていた。しかしC由来の普通の配列には使えない。そもそもコンテナを渡したり,返したりすると,一般性や効率が損なわれるのでご法度とのこと。
反復子を渡すようにして,負でもコンテナのサイズより大きくても良い添字iでの値を返すジェネリックな関数を書いてみた。
https://gist.github.com/tenomoto/79f5fb60783d24dcb8bf7910da4052c6
ある値以上になる添字を返す関数は,次のように書いたらよさそうだ。
https://gist.github.com/tenomoto/17ff04f4a1445302bb19a439c8c2546b
反復子として,ベクトルはx.cbegin()とx.cend()があるが,valarrayにはないのでstd::begin(x)とstd::end(x)を使う。配列はポインタ演算xとx + n(nは配列の長さ)でよい。

WordPressを4.5.1にアップデート

wp-cliを使ってWordPressを更新した。
PHPの更新 先にプロバイダのコントロールパネルでPHPを7.0にしてみた。うまく動作しているようだ。相変わらずデフォルトは5.3のようだ。WordPressの推奨環境はPHP 5.6以上。古いPHPはセキュリティ上の懸念がある。WordPress日本語サイトに次の注意がある。
古い PHP や MySQL しか利用できないレガシーな環境でも、PHP 5.2.4 以上、かつ MySQL 5.0 以上であれば WordPress は動作しますが、公式サポートは終了しており、サイトがセキュリティの脆弱性にさらされる危険があります。 wp-cliのインストール 仕事で使っていて人にはやたらと勧めていたのだが,自分のサイトではまだインストールしていなかった。curlでSSLサイトへの接続でエラーが出たので,-kをつけている。
$ curl -O -k https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar wp-cli.pharに実行権限をつけて実行しようとすると,envコマンドがPHP 5.3のCGI版を起動しようとするので,エイリアスを使うことにした。
alias wp="/usr/local/bin/php70cli ${HOME}/local/libexec/wp-cli.phar" データベースのバックアップ WordPressをインストールしたディレクトリで次のコマンドを実行すると,*.sqlという拡張子のファイルができる。
$ wp db export WordPressをインストールしたディレクトリをバックアップした後,exportしたsqlは直接アクセスされたくないので削除した。ウェブサーバから見えないところに移動してもよい。
cronで自動化してもよいが,趣味のサイトなので手動でバックアップすることにする。
WordPressの更新$ wp core update --locale=ja プラグインの確認と更新 更新されたプラグインにはUが付いている。
$ wp plugin status $ wp plugin update プラグイン名(または--all)

何倍か格好よく

2倍は英語でdouble,3倍はtriple,4倍は? この言い方で1倍に対応するのは?
4倍のquadrupleくらいは覚えているが,その先はあやふやなのでメモ。調べていたらsimpleのsimは一つなので仲間だった。漢字は倍なのにラテン語はplusと言うのも面白い。2倍なら漢字は2を掛ける,ラテン語は2回足すと言うことだろうか。
日本語英語ラテン語1倍simplesimplus2倍doubleduplus3倍tripletriplus4倍quadruplequadruplus5倍quintuplequituplus6倍sextuplesextuplus7倍septupleseptuplus8倍octupleoctuplus9倍nonuplenonuplus10倍decupledecuplus100倍centuplecentuplus 困ったらnfoldと言えばよさそう。

C++でのファイルの読み込み

ファイルの入出力はプログラミング言語の本の比較的後ろの方に出てくるが,データを扱う場合データが読めないと始まらない。
Armadilloやmlpackを使ってみたいので,C++でテキストファイルやバイナリファイルを読んでみる。C++のストリームはバイトの列なのでいろいろな複雑なものを読み書きするのに使えるが,読みたいデータは複雑なものではなく同じ型のものが並んでいるだけだ。
テキストファイル 入力ストリーム(if stream)を開いて>>で読めるだけ読む。C++らしいところは,型をパラメタ化しているところ,動的配列std::vectorを使っているところ。
https://gist.github.com/tenomoto/75a8fabb09f010b30d65d4e9a2bcaa8f
バイナリファイル 直接アクセスの場合。ifsをバイナリモード(std::ios::binary)で開いた入力ストリームとする。数値予報モデルの名前ではない。ifs.read()を使って1文字(char)ずつデータを読む。エンディアンをひっくり返すには文字配列の後ろから読めば良い。
https://gist.github.com/tenomoto/2f4d422530397bb736525c9ce0fa5c0f

WordPress+bogoでサイトのタイトルとキャッチフレーズを多言語化

WordPressのプラグインbogoは,ややこしくせずにサイトを多言語化できる。サイトのタイトルとキャッチフレーズを多言語にするには,テーマを編集する必要がある。
子テーマの作成 編集したテーマをアップグレードすると,改変部分は消えてしまうので,子テーマを作成する。子テーマを作るには,wp-content/themesにディレクトリを作り,テーマに必須のstyle.cssを作成する。スタイルシートはスタイルシートヘッダで開始する。Templateに親テーマのText Domainを書く。子テーマで定義されたスタイルや関数は親テーマのものを上書きして用いられる。子テーマを作るだけなら,Text Domainは必須ではないが,関数から参照するのでText Domainを記述しておく。親テーマに-childをつけるのが慣例のようである。
https://gist.github.com/tenomoto/00a51401cfe1a96a612916264a863dbc#file-style-css
コードの記述function.phpに次のようなコードを記述する。タイトルとキャッチフレーズを表示する処理にフックするフィルタを定義して,翻訳を処理をするようにしている。ここで定義したtr_option_blognameとtr_option_blogdescriptionの二つ目の引数にstyle.cssに書いた子テーマのText Domainを記述する。さらに翻訳をするためのアクションを追加する。my_child_theme_setupの最初の引数は子テーマのText Domainで二つ目の引数は翻訳ファイルを置いたディレクトリ。ここではテーマの中にlanguagesを作り,その中に入れている。
https://gist.github.com/tenomoto/00a51401cfe1a96a612916264a863dbc#file-function-php
翻訳ファイルの準備 親テーマの翻訳ファイルをコピーし,子テーマのlanguagesに追加する。ja.poに以下を追加する。
https://gist.github.com/tenomoto/00a51401cfe1a96a612916264a863dbc#file-ja-po
PoeditをMacP…

ownCloudからダウンロードしたzipファイルの解凍

ownCloudは自前でファイル共有サーバを立てるためのサーバアプリケーション。フォルダをまとめてダウンロードしたところ,Macでzipの解凍ができない。
検索してみるとよく知られた問題のようである。ownCloudは大容量データをアーカイブするためにzip64を導入したが,Macのアーカイブユーティリティが対応していない。/usr/bin/unzipは古いバージョンだ。
$ /usr/bin/unzip --version caution: both -n and -o specified; ignoring -o UnZip 5.52 of 28 February 2005, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details. Info-ZIPのUnZipのページにはセキュリティ上の脆弱性が警告されている。新しいものを入れた方が良さそうだ。unzipとzipをMacPortsでインストールする。
$ sudo port -d install unzip zip MacPortsで入れたunzipで解凍しようとしたが,複数の部分(multi-part)からなるアーカイブだとする警告が出て解凍できない。
Archive: archive.zip warning [archive.zip]: zipfile claims to be last disk of a multi-part archive; attempting to process anyway, assuming all parts have been concatenated together in order. Expect "errors" and warnings...true multi-part support doesn't exist yet (coming soon). 実際は単一のファイルしかない。zipで修復する。
$ zip -F archive.zip --out archive1.zip 修復したファイルも解凍できない。
Arc…

iPadに接続したMagic Keyboardでかな入力

iPadでもMacと同じキーボードでかな入力をするために,Magic Keyboardを接続している。設定アプリの「一般 > ハードウェアキーボード > 日本語-かな」を 「U. S.」から「かな入力」できる。
Mac用の純正キーボードにはiOS用のキーはないが,JIS配列なら英数とかなを簡単に切り替えられるのが良い。
ところが,あるときからローマ字でしか入力ができなくなってしまった。検索したり,ディスカッションボードを見たりしたが,解決策が見つからずにしばらく放置していた。Apple Wireless Keyboardを接続しても,Bluetoothの設定では別に表示されるが,キーボードの設定ではハードウェアキーボードのメニューは一つなので個別に設定できるわけではない。キーボードの問題ではなく,OS側の問題のようだ。
設定アプリの「一般 > キーボード」をいじっているうちに,ハードウェアキーボードに表示される言語はキーボードに追加されているソフトウェアキーボードと連動していることが分った。ローマ字入力は使っていないので,「日本語–ローマ字」は,ハードウェアキーボードに表示されていなかった。
試しに「一般 > キーボード」で「日本語-ローマ字」を追加してみたところ,「日本語-かな」でかな入力ができるようになった。「一般 > キーボード」から「日本語-ローマ字」を削除しても,かな入力の動作には問題無い。

Yosemiteで論理ボリュームを削除

Mac Pro (Early 2008)に4つの6TBハードディスクが内蔵して使っている。OpenZFSを使っていたのだが,Yosemiteでは不安定な上に,以下を試したがSpotlightが有効にならない。
mdutil -i on ボリューム名zpool/zfs upgradedefaults write com.apple.desktopservices DSDontWriteNetworkStores false あきらめてRAID10を構成することにした。中身はバックアップのある壊れてもよいものだったので,ディスクを消去した。その結果,ディスクごとにCoreStorageの論理ボリューム(logical volume)が作成されてしまった。YosemiteでCoreStorageは既定のようである。
diskutil cs revertで解除できるとのことだが,diskutil cs listを見るとRevertible: Noとなっており戻すことはできない。
diskutil csには,マニュアルに記述されていないコマンドがある。このうちremoveDiskを試したところ,物理ボリュームに戻った。この際,初期化が行われ論理ボリュームにあったファイルは消えてしまった。
$ diskutil list $ diskutil eject disk番号 $ diskutil cs list $ sudo diskutil cs removeDisk 物理ボリュームのUUID

GiNaC

GiNaCは記号演算をするためのC++ライブラリ。数式処理システムの厳密な計算と浮動小数点数を用いた数値計算を融合したプログラムを書くことができる。OS X用には,MacPortsからインストールできる。
Tutorialを改変して,Legendre多項式を求めるプログラムを書いてみた。
https://gist.github.com/tenomoto/5579eae0b58b43f6ab54
ginshを用いると,他の数式処理システムのように対話形式でGiNaCの機能を使うことができる。
累乗は^でも**でもなくpow(x, n)を使う。ginshでは^が使える。