飴屋

開発日記/2014年の日記

2014/12/10

ちょっと前からGPGPUというものに興味を持って調べ物をしていたのですが、業務の一環として使えそうな場面があったので、NVIDIAのCUDAの開発環境を整えてみました。参考にした書籍には、環境の構築方法があれこれ書いてあったのですが、3年以上前の本だったので情報が古く、今はインストーラーでかなり手軽にインストールできるようになっていました。Windows環境ではC言語のコンパイラ(cl.exe)さえ持っていれば、あとは一式NVIDIAサイトからダウンロードできるみたいです。

いくらかGPUに計算をさせてみて感触が掴めたのですが、大量の計算をGPUで捌きやすい形でコーディングするという観念がまだうまくまとまっていません。やりたいことのルールはシンプルな二つの数式なんですが、数式の意味がわかっているだけでは、具体的な計算手順にまで落とし込めなくて、CUDAを触るより微分のおさらいをしている時間の方が長くなってしまっております。

2014/10/18

CSVファイルは時に扱うのに人を選ぶことがあるようで、Excelでテーブルデータを扱う場合は、Excel標準のデータ形式でファイルを保存して、それをWEBサイト上で読み込めるようにするのが望ましいとのお客さんのリクエストをいただきました。

かつての拡張子.xlsの形式ではその書式が有志によって解析されていたもののMicrosoftがOfficeシリーズをバージョンアップする度に書式のバージョンも更新され、正確な内容はベールに包まれていましたが、ドキュメントのオープン形式化が進む中でファイルの仕様が公開され、ついには標準化された.xlsx形式が発表されてもう7年以上経っているわけです。その後、ブラウザの進化とともにローカルファイルをWEBページ内で解析することもできるようになり、いつの間にかJavaScriptでExcelのファイルを読み込むこともできるようになっていたようです。

こちらからApacheライセンスで公開されている「js-xlsx」というライブラリを使わせてもらうことにしました。xlsxファイルを読み込んで操作して保存することもできちゃうそうです。これを使ってCSV形式のテキストに整形することにしました。

XLSX.utils.sheet_to_csvというメソッドを使うとやりたいことが簡単に達成できてしまいました。しかし、日付のセルがどうも思っていた形式になりません。どうも米国英語形式のフォーマットになってしまっているようです。ソースコードを眺めてみると、

var table_fmt = {
0: 'General',
1: '0',
2: '0.00',
3: '#,##0',
4: '#,##0.00',
9: '0%',
10: '0.00%',
11: '0.00E+00',
12: '# ?/?',
13: '# ??/??',
14: 'm/d/yy',
15: 'd-mmm-yy',
16: 'd-mmm',
17: 'mmm-yy',
18: 'h:mm AM/PM',
19: 'h:mm:ss AM/PM',
20: 'h:mm',
21: 'h:mm:ss',
22: 'm/d/yy h:mm',
37: '#,##0 ;(#,##0)',
38: '#,##0 ;[Red](#,##0)',
39: '#,##0.00;(#,##0.00)',
40: '#,##0.00;[Red](#,##0.00)',
45: 'mm:ss',
46: '[h]:mm:ss',
47: 'mmss.0',
48: '##0.0E+0',
49: '@',
56: '"上午/下午 "hh"時"mm"分"ss"秒 "',
65535: 'General'
};

こんな定義部分がありました。元々「ssf.js」という書式変換ライブラリだったのをそのまま流用しているように見受けられます。ちなみに自分が扱うデータは表中の14番「m/d/yy」を日本語版表記の「yyyy/m/d」に変更すれば意図するように変換されるようです。xlsxファイルを読み込む前にこの表の定義を変更してあげるか、変換時のオプションで定義を変更した表を渡してあげればよさそうなのですが、「ssf.js」だった部分が隠蔽されていて、外から影響を与えられるようにはみえなかったので、直接該当箇所のコードを書き換えることにしました。このライブラリが多言語対応するようになったらこの辺の書式の変更も簡単になるのかもしれません。

2014/8/27

PHPのバージョンアップによってもう一つサイト上の問題が発生していたことに気が付きましたInternal Server Errorを吐いて終了するページと正常に動作するページがあるので、原因を探ってみると、「ls2」というプラグインコマンドを使っているページにアクセスできなくなっているようでした。

どうもplugin/ls2.inc.phpファイル中で不適切な参照渡しをしようとしている箇所(69行目)があったようで、「&」を取り除いたら正常に動作するようになりました。

他にも問題がありそうだけど、チェックする時間がないので見つけ次第対処という消極的な方針になってしまいそう。

2014/7/12

仕事の都合でレンタルサーバーのPHPのバージョンを最近のものにアップデートしたときに、PukiWikiに問題が発生して500エラーが返ってくるようになっていたことに今日気づきました。一月以上このサイトが停止していたとは・・・。ちょっとプライベートでいろいろあってサイトのメンテナンスが不十分でした。

詳しい原因はPukiWikiのlib/func.phpで定義されている「hex2bin」関数が最新のPHPでは同名の組み込み関数が存在するので名前が衝突した結果、「この関数は上書きできません。」というエラーが発生していました。将来名前が衝突することを考えると関数の命名も気楽にできませんね。

  • lib/func.php
  • lib/auth.php

の中の関数が使われている部分と定義されている部分で、名前を別のものに変更することでこのエラーは収まりました。しかし、今度は日本語部分が表示されなくなるという別の問題が発生しました。こちらもPHPのバージョンアップによってhtmlspecialchars関数の挙動が変わったことが原因でした。標準の文字コードがutf-8になっているそうで、PukiWikiのEUC-JP版ではEUC-JPの日本語がうまく扱えていなかったようです。文字コードを「EUC-JP」と指定することで解決するとのことでしたが、後々のことを考えて、データをすべてutf-8に変換して、PukiWikiのutf-8版に入れ替えました。Pukiwikiのソースをいじっていたので換装はちょっと大変でした。

2014/1/13

久しぶりにやらかしてしまった反省メモ。

発端はTortoiseSVNのアイコンオーバーレイが表示されなくなったことでした。調べてみると、いくつか原因が考えられるらしく、まずアイコンの再設定を行ってみましたが変化なし。続いてWindowsのレジストリに登録できるアイコンオーバーレイの上限に達しているのかと思っていくつか不要なものを削除してみるもやはり変化なし。これはWindowsのアイコンキャッシュファイルが壊れたに違いないと思ってWindows8.1のアイコンキャッシュファイルを再作成する方法を検索して「リフレッシュ」という作業を行うといいよみたいな記事をみつけたので、何も考えずにWindowsのリフレッシュ操作を行ってしまいました。結果、Windowsがまっさらな状態になり、こちらは顔面が真っ蒼な状態になりました。昔と違ってWindowsは非常に安定して動作してくれていたため、OSの再インストールみたいな操作からは遠ざかっていて、最新のWindowsにOSを「リフレッシュ」する機能があったとは知りませんでした・・・。いろいろ面倒くさいことになりましたが、一日がかりでなんとかしました。(連休中の貴重な一日だったのに)

作業環境を復旧し、TortoiseSVNもインストールし直しましたが、しかし、肝心のアイコンオーバーレイは表示されないまま・・・そこで一つ気が付いたのですが、バージョン管理下にあるファイルを右クリックしてもTortoiseSVNのメニューが出てきません。これはもしや・・・。メニューの中に「SVN update working copy」の項目が発見され、この現象がTortoiseSVNのアップデートによってワーキングコピーの設定ファイルの形式が古かったことによって引き起こされていたことが判明しました。先ほどの項目をクリックして設定ファイルを更新したら無事にアイコンオーバーレイも復帰したのでした。いろいろと感覚が鈍っているなぁと思わされた年初の一コマでした。

2014/1/2

PukiWikiもさすがにスマホで読みやすいようにしないといけないなぁと思ったので、その作業メモ

/pukiwiki.ini.phpを編集する

$agentsにUserAgentのパターンを登録しておくと、UserAgent毎に設定を変更できるようなのでそれを利用することに。

// for smartphone
// Apple iPhone
array('pattern'=>'#iPhone#','profile'=>'smartphone'),
// Apple iPod touch
array('pattern'=>'#iPod#','profile'=>'smartphone'),
// Apple iPad
array('pattern'=>'#iPad#','profile'=>'smartphone'),
// 1.5+ Android
array('pattern'=>'#Android#','profile'=>'smartphone'),
// Pre 1.5 Android
array('pattern'=>'#dream#','profile'=>'smartphone'),
// 1.5+ Android
array('pattern'=>'#CUPCAKE#','profile'=>'smartphone'),

とりあえずどこかのUserAgentまとめサイトを参照して↑こんな設定を追加したけど、古いAndroidとかシェアがどの程度なのかわからないけど要らない気がしないでもない。WindowsPhoneとかについても考えた方がいいかもしれないし、Firefox OSとかいろいろ今後どうなるかわからないのでとりあえず追加する方法だけ覚えておこうと思いました。
patternにマッチするとprofileで指定した名前に設定ファイルが読み込まれるようです。

/smartphone.ini.phpを追加

/default.ini.phpをコピーしておけば間違いないだろうと思って、コピーした上で、スキンファイルを設定する箇所だけ修正しました。

define('SKIN_FILE', DATA_HOME . SKIN_DIR . 'smartphone.skin.php');

/skin/smartphone.skin.phpを追加

このファイルがスマホ用のテンプレートになるので、スマホ向けに最適化します。
デフォルトのテンプレートとそれほど変わらない場合はレスポンシブなCSSで対応するのでもいいような気が今更してきた次第です。

2014/1/1

あけましておめでとうございます。
年明けには「今年の目標」を毎年考えて、興味のある分野の知識を増やそうとしていますが、去年の目標は仕事に忙殺されて消化不良に終わってしまいました。今年は「絵作り」をテーマに活動を進めていこうと思う次第です。なにか成果を出したいです。

開発日記