2013年12月20日金曜日

mac osx 環境変数 忘備録

関連ファイル /etc/profile /etc/bashrc ターミナルを開く毎に実行 ~/.bashrc ログイン時に実行 ~/.profile ~/.bash_profile 自分は、~/.profile に記述してるよ
##
# Cinder part
##
# export CINDER_HOME=/usr/local/src/cinder_0.8.2_mac

##
# Cuda SDK part
##
export PATH=/usr/local/cuda/bin:$PATH
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
export GPU_INCDIR="/Developer/GPU Computing/C/common/inc"
export C_INCLUDE_PATH=$GPU_INCDIR:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=$GPU_INCDIR:$CPLUS_INCLUDE_PATH

##
# Android NDK part
##
export ANDROID_NDK=/opt/android-ndk-r8d
export PATH=$ANDROID_NDK:$PATH
export ANDROID_TOOLCHAIN_CMAKE=$ANDROID_NDK/toolchains/android.toolchain.cmake

alias android-cmake='cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN '

##
# Your previous /Users/okimiyuki/.profile file was backed up as /Users/okimiyuki/.profile.macports-saved_2012-06-03_at_22:46:38
##

# MacPorts Installer addition on 2012-06-03_at_22:46:38: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.


2013年11月14日木曜日

postgresql から json

 php で postgresql からデータを取り出して JSON に加工して返すとか、めんどくさいなぁと思って調べてみました。社員に、どうやって実装してたん?て聞いたら、データ取り出して加工してたという事でした。うんうん、やっぱそうだよなー、面倒くせぇwwwwて思ってたんですが、ラッキーな事に、version 9.2 から row_to_json という関数がサポートされたようです。 まずは、データ準備
create table hoge (id integer primary key, name text);
insert into hoge (id,name) values (1, 'fuga');
insert into hoge (id,name) values (2, 'moge');
ほんで、取り出し
select array_to_json( array_agg( row_to_json(foo) ) )
  from (select id, name from hoge) foo;
結果
[{"id":1,"name":"fuga"},{"id":2,"name":"moge"}]
いやー、素晴らしいですね! 参考:Faster JSON Generation with PostgreSQL

2013年10月31日木曜日

CakePHP データ型による input 項目の決定方法

CakePHPのバージョンが 1.x の時も調べたような気がするのだけども、忘れたので備忘録として 2.x の仕組みをさぐる。 正直、ここら辺の実装の仕方は、気に入らない部分なんですよね。 まず、label タグと、input タグが混ざってコード中に隠蔽されていて、デザインの介在する余地が無い。1.x 時よりは、だいぶ良くなっている気がするけど、それでもダーティで、とてもDRYの原則に沿った修正ができるような代物ではない。改造しようと思ったら、ここら辺の仕組みを、ほぼ書き直ししないといけない。もしくは個別に何度も同じ作業を手作業で繰り返しながら個別に指定するかだ。
FormHelper::input( $field, $options );
で呼び出される $options は、テンプレート・ベースでは、通常 null だ。
その場合、FormHelper::_magicOptions($options) により、デフォルトのオプションが構築される。
そして、ここで input タグが text なのか select なのか checkbox なのか・・・と決定されるのである。
やるなら、_magicOptions をラップした public な magicOptions 関数を作成して、テンプレートの Form::input 呼びだし直前で options を取得し、その options の値を元に、デザインを細かく変更できるようにリファクタリングが、一番の近道だろうか?
  protected function _magicOptions($options) {
    $modelKey = $this->model();
    $fieldKey = $this->field();
    $options['type'] = 'text';
    if (isset($options['options'])) {
      $options['type'] = 'select';
    } elseif (in_array($fieldKey, array('psword', 'passwd', 'password'))) {
      $options['type'] = 'password';
    } elseif (in_array($fieldKey, array('tel', 'telephone', 'phone'))) {
      $options['type'] = 'tel';
    } elseif ($fieldKey === 'email') {
      $options['type'] = 'email';
    } elseif (isset($options['checked'])) {
      $options['type'] = 'checkbox';
    } elseif ($fieldDef = $this->_introspectModel($modelKey, 'fields', $fieldKey)) {
      $type = $fieldDef['type'];
      $primaryKey = $this->fieldset[$modelKey]['key'];
      $map = array(
        'string' => 'text', 'datetime' => 'datetime',
        'boolean' => 'checkbox', 'timestamp' => 'datetime',
        'text' => 'textarea', 'time' => 'time',
        'date' => 'date', 'float' => 'number',
        'integer' => 'number'
      );

      if (isset($this->map[$type])) {
        $options['type'] = $this->map[$type];
      } elseif (isset($map[$type])) {
        $options['type'] = $map[$type];
      }
      if ($fieldKey == $primaryKey) {
        $options['type'] = 'hidden';
      }
      if (
        $options['type'] === 'number' &&
        $type === 'float' &&
        !isset($options['step'])
      ) {
        $options['step'] = 'any';
      }
    }

    if (preg_match('/_id$/', $fieldKey) && $options['type'] !== 'hidden') {
      $options['type'] = 'select';
    }

    if ($modelKey === $fieldKey) {
      $options['type'] = 'select';
      if (!isset($options['multiple'])) {
        $options['multiple'] = 'multiple';
      }
    }
    if (in_array($options['type'], array('text', 'number'))) {
      $options = $this->_optionsOptions($options);
    }
    if ($options['type'] === 'select' && array_key_exists('step', $options)) {
      unset($options['step']);
    }
    $options = $this->_maxLength($options);
    return $options;
  }

2013年10月29日火曜日

BitCasaが本気出してきた?

 バージョン 1.3 build 1248 まではグタグタで、まともにアップデート終了もできないので、手動で バージョン 1.3 build 1249 をダウンロードしてきてインストールしたんですわ。 そしたらですよ?全てにおいて天と地ほどの差が出るぐらいキビキビと動くようになりました。反応速度も速い。これだったら、全然使えるレベルですね。自分のネットワーク環境はADSL-12Mの帯域しかないので、かなり、しんどいと思うんですよ。  正直、このペースだと半年ぐらいは BitCasa 使わずに寝かせたままかなぁ?と思ってたんですけど、BitCasaを人に勧められるレベルに到達しちゃったんじゃないですかね? スタート・アップの反射神経は、凄いものがありますね! 2013/11/3 追記:mac 版は、まだ Finder がハングするバグがあって、もう一声ですかね。相変わらず ps ax | grep Bitcasa と kill -9 xxxx は必須です。どうも、フロント部分がハングしているっぽいです。

久しぶりにCakePHPを見てディスりたくなったのでディスる i18n


CakePHP 2.4.1 を使う事になりました。 template エンジンは smarty だよね?ふむふむ・・・ふむふむ・・・あー、CakePHPとsmarty を混合して使うのは、しんどそうだからやめておこう。

 それじゃ、Locale のあたりでも・・・。ほむほむ cake.pot ファイルとか、綺麗に分かれて作成されてて、これは感心感心と思ったのもつかの間の事。誰か日本語の cake.po 公開してないの???
どれどれ・・・ふむふむ・・・おおーっ・・・おおぇえええ?
ひとつも無い、誰も CakePHPを使ってないようです。はぁあああ?

 どれどれ、default.po でも見ますかね・・・
msgid "The Hoge has been saved."
msgstr ""

msgid "The Hoge could not be saved. Please, try again."
msgstr ""

msgid "The Hoge has been deleted."
msgstr ""

msgid "The Hoge could not be deleted. Please, try again."
msgstr ""

msgid "New Hoge"
msgstr ""

msgid "Edit Hoge"
msgstr ""

msgid "The Fuge has been saved."
msgstr ""

msgid "The Fuge could not be saved. Please, try again."
msgstr ""

msgid "The Fuge has been deleted."
msgstr ""

msgid "The Fuge could not be deleted. Please, try again."
msgstr ""

msgid "New Fuge"
msgstr ""

msgid "Edit Fuge"
msgstr ""

...以下延々と続く
 馬鹿なの?DRYの原則もクソもないでしょコレ?以下のように置き換え可能でしょうが?
msgid "The %s has been saved."
msgstr ""

msgid "The %s could not be saved. Please, try again."
msgstr ""

msgid "The %s has been deleted."
msgstr ""

msgid "The %s could not be deleted. Please, try again."
msgstr ""

msgid "New %s"
msgstr ""

msgid "Edit %s"
msgstr ""
 という事で直しましたさ。template /cake/lib/Cake/Console/Templates/default/views/index.ctp こんな感じで・・・けど、もう bake した後で、結構手を入れてるみたいなんで後の祭りみたいです(ToT)
<?php
/**
 *
 * PHP 5
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @package       Cake.Console.Templates.default.views
 * @since         CakePHP(tm) v 1.2.0.5234
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */
?>
<div class="<?php echo $pluralVar; ?> index">
 <h2><?php echo "<?php echo __('{$pluralHumanName}'); ?>"; ?></h2>
 <table cellpadding="0" cellspacing="0">
 <tr>
 <?php foreach ($fields as $field): ?>
  <th><?php echo "<?php echo \$this->Paginator->sort('{$field}'); ?>"; ?></th>
 <?php endforeach; ?>
  <th class="actions"><?php echo "<?php echo __('Actions'); ?>"; ?></th>
 </tr>
 <?php
 echo "<?php foreach (\${$pluralVar} as \${$singularVar}): ?>\n";
 echo "\t<tr>\n";
  foreach ($fields as $field) {
   $isKey = false;
   if (!empty($associations['belongsTo'])) {
    foreach ($associations['belongsTo'] as $alias => $details) {
     if ($field === $details['foreignKey']) {
      $isKey = true;
      echo "\t\t<td>\n\t\t\t<?php echo \$this->Html->link(\${$singularVar}['{$alias}']['{$details['displayField']}'], array('controller' => '{$details['controller']}', 'action' => 'view', \${$singularVar}['{$alias}']['{$details['primaryKey']}'])); ?>\n\t\t</td>\n";
      break;
     }
    }
   }
   if ($isKey !== true) {
    echo "\t\t<td><?php echo h(\${$singularVar}['{$modelClass}']['{$field}']); ?>&nbsp;</td>\n";
   }
  }

  echo "\t\t<td class=\"actions\">\n";
  echo "\t\t\t<?php echo \$this->Html->link(__('View'), array('action' => 'view', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?>\n";
  echo "\t\t\t<?php echo \$this->Html->link(__('Edit'), array('action' => 'edit', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?>\n";
  echo "\t\t\t<?php echo \$this->Form->postLink(__('Delete'), array('action' => 'delete', \${$singularVar}['{$modelClass}']['{$primaryKey}']), null, __('Are you sure you want to delete # %s?', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?>\n";
  echo "\t\t</td>\n";
 echo "\t</tr>\n";

 echo "<?php endforeach; ?>\n";
 ?>
 </table>
 <p>
 <?php echo "<?php
 echo \$this->Paginator->counter(array(
 'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
 ));
 ?>"; ?>
 </p>
 <div class="paging">
 <?php
  echo "<?php\n";
  echo "\t\techo \$this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));\n";
  echo "\t\techo \$this->Paginator->numbers(array('separator' => ''));\n";
  echo "\t\techo \$this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));\n";
  echo "\t?>\n";
 ?>
 </div>
</div>
<div class="actions">
 <h3><?php echo "<?php echo __('Actions'); ?>"; ?></h3>
 <ul>
  <li><?php echo "<?php echo \$this->Html->link(__('New %s',__('" . $singularHumanName . "')), array('action' => 'add')); ?>"; ?></li>
<?php
 $done = array();
 foreach ($associations as $type => $data) {
  foreach ($data as $alias => $details) {
   if ($details['controller'] != $this->name && !in_array($details['controller'], $done)) {
    echo "\t\t<li><?php echo \$this->Html->link(__('List %s',__('" . Inflector::humanize($details['controller']) . "')), array('controller' => '{$details['controller']}', 'action' => 'index')); ?> </li>\n";
    echo "\t\t<li><?php echo \$this->Html->link(__('New %s',__('" . Inflector::humanize(Inflector::underscore($alias)) . "')), array('controller' => '{$details['controller']}', 'action' => 'add')); ?> </li>\n";
    $done[] = $details['controller'];
   }
  }
 }
?>
 </ul>
</div>
あ、肝心の cake.po ですが、そもそも template がドメインを意識して書かれてない\(^o^)/オワタ

2013年10月28日月曜日

近況などを

 まぁ、もう完全に写真にはまってますね。はまりすぎてて怖いぐらいです。SD-1 Merrill だいぶ価格が下がってきててグラッと来ますね。ちょい前までは、このカメラが良いなぁと思ってたんですけど、ちょっと撮影テンポが悪いのが気になりますよね。というか、ブラケット撮影にはまりすぎてて、撮影スタイルが自分に合わないんじゃないかという懸念材料があります。

 NEX-5Rを使い倒したおかげで、色々とわかってきまして、まずブラケット撮影がリモートでもできないと駄目ですし、5枚ブラケットぐらい出来て欲しいし、露出の値をEXIFに記録しておいて欲しいんですよ。この辺がNEX-5Rでは満たせないので、そろそろNEX-5Rは卒業かなぁと考えてます。

 次に、ファインダー要らないだろうとか思ってたんですけど、やっぱりファインダーが欲しいです。ファインダー無しでピント合わせるのは、無理ゲーに近いです。NEX-5RがiPad からRAW撮影できるんだったら、まだ我慢できたかもしれませんけど、小さいモニターだけでは、雰囲気でピントをあわせるしかなく、撮影した後もピントが合ってるのかどうか、さっぱりわかりませんわ。

 Google+ で「美瑛の青い池」のmac の壁紙で有名な Kent Shiraishi さんが、色々と写真(カメラ)にまつわる事を発信して、教えてくださるので、その影響もあって、自分自身の色彩感覚が鋭敏になってきていると感じてます。そうするとカメラのホワイトバランスの性能とかも気になってくるんですよ。

 最近出た中だと、K-3 がめちゃくちゃ気になります。HDRer がこぞって PENTAXを使っているだけあって、ブラケット撮影に関しては文句無しです。最近、フランジバックの短いカメラは緑被りしやすいのかなぁ?とか、センサーサイズを大きくしてカメラを無理にコンパクトにすると、周辺光量が落ちるなど、あちこちに皺寄せが来るという事がわかってきまして、そういう意味からもK-3は良いカメラだなぁって感じてます。フルサイズのカメラも欲しいんですけど、フルサイズに見合うレンズを揃えるとなると、非常に金がかかりそうなんで、自分は、APS-C サイズでいいかなぁ?と考えてるのもあります。K-3は14bit 階調なんで、ダイナミックレンジも広そうなんですよね。センサーサイズの割には解像度も高いので文句なしです。

 EOS-6D も ISO感度上げてもめちゃくちゃ綺麗で、クラクラするレベルなんです。ただ、作例を見てて思ったのは、あっさりしているかなぁ?というのが気になりました。考えてみたんですけど、ノイズキャンセリングで高周波成分が、ちょっとカットされているのかも知れない(直感で根拠ありません)という部分で、自分の中でひっかかってます。
 
 と、まぁ、こんな感じです。仕事の方は、マネジメントの比重が大きくなっても、プログラミングおよび周辺知識において、他との差が圧倒的すぎて、代替が効かないようです。

2013年10月17日木曜日

Bitcasa を使ってみた

 たまには、なんか書いとかないとね。

 はい、BitCasa を試しもせずに年間契約しました。ばんばん撮影している写真のバックアップ用途として使えればいいかなぁ?というのが動機です。その野心的なサービスに興味があったので、半分応援の気持ちもありました。

 正直、アプリケーションの作りがいまいちです。まず、コピーできたのかどうかがわかりません。mac だと、しょっちゅうエラーでデーモンが止まります。
 $ ps aux | grep Bitcasa
 $ kill -9 xxxx

 これが日課です。Finder がハングしたように止まりまくるので恐ろしく作業効率が落ちます。このデーモンを開発したやつを小一時間問い詰めてやりたい気分です。非同期通信で淡々と負荷をかけずに、バックアップ・タスクをこなしてくれるだけで良いんです。

 TimeCapsule との相性も悪い。ディスクのマウントが外れるもんだから、ここのファイルをバックアップするのは、まず無理です。なので macbook 本体側のディスクにコピーしてから、Bitcasa でファイル転送するのですが、成功したのか失敗したのか皆目わからない。確認しようと Bitcasa 側のフォルダーを見に行くと、ディレクトリ一つをトラバースするのに5分ぐらいかかる。そして、続きのファイルを地道にコピーするんです。おかげで、バックアップ作業が全然進みません。

 ディスクのミラーリング、これは、なかなか安定して動きます。ところが、そんな機能別に欲しくないんです。

  mac 版に比べて、Windows 版は安定している印象があります。けど、動作が重たいですよね。やっぱり、このサービス・アプリケーションを書いたやつを小一時間問い詰めてやりたい気分です。 どうやったら、こんな糞重たいアプリケーションを書けるのか?何かハッシュを計算してサーバ側と重複データが無いかどうかをクライアント・パソコン側で延々と計算してサービス・コストを下げているのでしょうか?こんな糞重たいアプリケーション、書こうと努力しても、なかなか書けるものではありませんので、興味は尽きません。

 自分がサービスする側だったら、ファイル・カタログを別にして、そのファイルの状態を保持するKVSパートと、ファイルが格納されているディスク・パートを分離して、タスクでファイルの相互転送ジョブ・サービスを構築しますね。この手のサービスにリアルタイム性を求めるやつなんて、そんないないと思います。リアルタイム性が必要なら、サービスにもっとお金を払うべきだと思います。

 半分、失敗したかな?と思いつつも、アーリーアダプターの立ち位置を楽しみたいと思いますw

2013年10月5日土曜日

android 画面表示時にIMEの起動を抑制する

忘備録
http://www.erhancetin.com.tr/2013/09/android-activity-ilk-acls-edittext.html
にあるように、android:windowSoftInputMode="stateHidden" を追加しておく
<activity  
       android:name="com.example.MainActivity"  
       android:label="@string/example_activity"  
       android:windowSoftInputMode="stateHidden">  
  </activity>  
# android sdk disable ime

2013年9月8日日曜日

Luminance HDR

  Google+ コミュニティHDR愛好会 - レッツ・ゴリゴリーにて、HDR素材提供 その7 「アッタ」from 駆け出しHDRer というイベントを開催してます。その関係で、Luminance HDR というフリーのHDRソフトを使って処理する方法を書きます。
画像をウィザードを使って読み込みます。それぞれ明るさが 2.0 ev、0.0 ev、-2.0 ev となっているので、修正します。

 次に画像のズレを補正します。イベントで提供している画像では、シャッターを押す時にブレてます。画面のように修正しました。(追記:前の画面で、Autoalign images のチェックボックスをオンにすると、位置合わせは自動で行ってくれるようです)


 同様に -2.0 ev の画像に対しても修正をかけます。


 Operator を Mantiuk '08 でやってみました。調整をしている段階では、「Result Size」を 1024 x 680 ぐらいにして、パラメータのレバーを動かして、「Tonemap」ボタンを押して反映させます。保存する時には、「Result size」を最大にしてから保存すると良いでしょう。



2013年8月29日木曜日

SQL Trigger ではまった

今回のバグは難解でした。Sybase SQL Anywhere のデータベースのバージョンをアップしたら、なんか、変なところでエラーになりました。

伝票 テーブル名 SLIP のレコード新規作成で insert 文を発行しているのですが、別の帳票を印刷すると、レコードの挿入に失敗してしまいます。
帳票のコード中で、現象を引き起こす部分を特定したところ、全く関係のない 日別伝票集計 テーブル名 DSLIP を SELECT * FROM DSLIP WHERE RDATE='2013/8/29'; という極めてシンプルなクエリーをオープンして、クローズするだけで発生していました。
訳がわからなくて、コンポーネントを別にしてみたり、接続をクローズしてオープンしてみたり、SELECT文末に FOR READ ONLY を加えてみたりしましたが、エラーは直りません。もうお手上げに近い感じですが、ふとトリガー?というキーワードが浮かびました。それでも原因がわからなくて、助っ人を頼んで原因を特定できました。
よくある事ですが、日別で伝票番号をシーケンシャルで発生させたいという要望から、DSLIP 中に伝票番号の最大値を持たせて SLIP の INSERT TRIGGER で伝票番号を発生させていました。
問題のトリガーは、こんな感じ
ALTER TRIGGER "insert_slip" before insert order 1
on "DBA".SLIP
referencing new as new_val
for each row
begin
  declare AINC smallint;
  declare thisDSlip cursor for select SCNT from DSLIP where RDATE=new_val.RDATE;
  -- %IF CURRENT REMOTE USER IS NULL THEN
  if new_val.SLIPCD is null then
    if not exists(select* from DSLIP where RDATE=new_val.RDATE) then
      insert into DSLIP(RDATE,LDATE) values(new_val.RDATE,TODAY(*))
    end if
    ;
    open thisDSlip;
    fetch first thisDSlip into AINC for update;
    set new_val.SLIPCD=AINC;
    update DSLIP set SCNT=AINC+1,LDATE=TODAY(*) where current of thisDSlip;
    close thisDSlip
  else
    if not exists(select* from DSLIP where RDATE=new_val.RDATE) then
      insert into DSLIP(RDATE,LDATE,SCNT) values(new_val.RDATE,TODAY(*),new_val.SLIPCD)
    end if
    ;
    open thisDSlip;
    fetch first thisDSlip into AINC for update;
    if AINC<new_val.SLIPCD then
      set AINC=new_val.SLIPCD;
      update DSLIP set SCNT=AINC+1,LDATE=TODAY(*) where current of thisDSlip
    end if
    ;
    close thisDSlip
  end if
  ;
  if(ISNULL(new_val.RENT,0)<>0) or(ISNULL(new_val.EMFLG,0)<>0) then
    set new_val.ACFLG=5
  end if
  -- %END IF;
end;

はい、cursor 宣言がまずくて
  declare thisDSlip cursor for select SCNT from DSLIP where RDATE=new_val.RDATE FOR UPDATE;
というように更新をかけるタイプのカーソルですよと、FOR UPDATE 句が必要でした。これが抜けていたために、データベースの状況により読み取り専用カーソルに対して更新をかけるという事態が発生し、エラーを引き押していたと。

2013年8月8日木曜日

「工場夜景・美の祭典」フォトコンテスト2013に応募しますた

「工場夜景・美の祭典」フォトコンテスト2013に応募しました。 3作品まで登録でき、2作品エントリーしました。
1作品目
2作品目
もう1作品、枠があるので、また撮影に行きたいと思います。
コンテストも視野に入れつつ、最初に大雨の中撮影してきたのが、こちらになります。ゴアテックスの雨合羽を着て自転車で移動してましたが、全身びしょ濡れになって、これ以上の撮影は無理!帰ろうと思ったら、大雨でJRが全面ストップw。帰れないけど、自転車での移動は、もう完全に無理。どうしよう?と悩んだ末、歩いて往復22km移動して撮りました。歩いてる途中も雨が激しく降ってきたり、トラックに水をぶっかけられたりして、精神的にも肉体的にも、かなり疲弊しました。いざ撮影してみると、三脚を使っているにもかかわらず、風が強くてブラケット撮影している明るい画像のシャッター速度が長すぎて、ブレブレの写真しか撮影できません。雨の中のレンズ交換では、ローパス・フィルターが汚れる可能性が高いので、やりたくなかったのですが、このままでは勝負にならないと思い、F値が低い単焦点レンズに交換する決意をしました。さすがに、こちらのレンズだとシャッター速度も短い!神経を研ぎ澄ませて、一番低いF値のコンディションでマニュアル・フォーカスで撮影しました。後から考えれば、シャッター速度も余裕があったので、F値を上げて(もう少し絞りを入れて)撮影すれば良かった。これらの写真ではパープル・フリンジが盛大に発生しています。それに、ISOを上げて捨て写真を撮りピントのレベルをチェックする余裕も欲しかったかなぁと。まぁ、パソコンで写真を確認するまで、どんな風に仕上がってるのか、カメラのモニターだけでは、わからないんですけどね(^^;






エントリーした写真は、リベンジで夕景を狙いに行ったものです。撮り終えて、白鳥大橋の反対側に自転車で移動しよう(東室蘭経由)と思ったら、自転車の後輪がパンクしてしまい、ゲームセットとなりました。予定では、この後、深夜の夜景を撮影して漫画喫茶で仮眠して、朝焼けを狙う予定だったのに…。そんなわけで、残り1作品も撮りに、リベンジしたいと考えております。

2013年8月1日木曜日

boost::spirit grammar 書くのが、めんどくなってきたのでテスト

はい、boost::spirit も コマンドによって、引数となる構文構造が異なってくると、いちいち grammar 作成するのも大変ですよね? てなわけで、ちまちま phrase_parse にかけながら、コードで処理を分岐しても良いんじゃないかと思い、実験くんしてみました。
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>

namespace qi = boost::spirit::qi;

int main() {
  std::string test = "put 123 aioue";
  
  auto i = test.begin();
  bool res = qi::phrase_parse( i, test.end(), qi::lit("put"), qi::ascii::space );
  std::cout << res << std::endl;
  std::string rest;
  rest.assign(i,test.end());
  std::cout << rest << std::endl;
  
  return 0;
}
出力は
1
123 aioue
いちおう 構文を qi::lit("get") に変えてみたところ
0
put 123 aioue
となりまして、ちまちまとパースしても行けそうですよね?
ちょっとしたものならば、こちらの方がササッと書けそうです。

2013年7月23日火曜日

カメラ・ローパス・フィルターの清掃

 カメラの話です。
 ずーっと、レンズの汚れだと思っていたら、ローパス・フィルタの汚れが原因だとわかりました。
 
 どれだけ写真を綺麗に撮っても、ポチポチポチと汚れが付くのは許容できません、このローパス・フィルターに汚れが付いた原因は、おそらく雨の日に外でレンズ交換したからだと思います。とにかく許容できないので、ローパス・フィルターの問題をなんとかしなくてはなりません。色々調べて、結局、ソニーのサービスセンターへカメラのクリーニングに出しました。
 で、戻ってきたカメラで写真を撮りましたが

やはり、ローパス・フィルタの汚れが気になります。
 職業柄、こういうのは許せないんだと思います。写真を撮る度に Segmentation Fault を起こしているようで、ひっかかってしょうがありません。Ruby on Rails をやっている時にしばしば参考にしたブログ「ザリガニが見ていた」さんの「ローパスフィルターとの格闘」を見て、プログラマーの資質なんだろうと納得しました。

 結論としては、自分の道具ぐらい自分で面倒をみようという事で決断し、「ニコンのローパスフィルター清掃講座に行ってみた」を参考に作業しました。その前にローパス・フィルターのクリーニングに関する情報が無くて「 Delkinセンサ・クリーナーセット」をAmazon から買いました。ところが、送られてきたのは、クリーニング液が空のボトルの中古品っぽいパッケージでした。品質に疑問ありまくりで、自腹で郵便のEXPACK500を払って返品しました。結果的には、「Basic Lens Cleaning Kit No.1」を購入する事になり、良かったと思います。これだけあれば、ローパス・フィルターの清掃も心置きなくできます。コストパフォーマンスも良い。

 清掃作業は、慣れるまでが大変でした。まず、「竹べら」は必須だと思います。ボンド用のヘラとか、レゴブロックのパーツにシルボン紙を巻きつけて作業してみましたが、ごつすぎるとダメでした。竹べらは、無印良品の竹の割り箸を削って作成しました。
 


 自分も作業がうまく行くまで30回ぐらいはやり直したと思います。非常にデリケートな作業で、拭きが甘いと、すぐに黒い斑点ができてしまいます。シルボン紙は、斜めにして巻きつける場所を微妙に変えながら、1枚につき6〜8箇所、1回巻きつけたら裏と表で2回ローパス・フィルターを拭きました。拭き終わったらF22にして Macbook Pro retina でメモ帳を起動して、それを背景に撮影します。最終的には、このぐらいで納得しました。

 少し乾いた状態で、もう一度チェックしたのがコレ。

 乾く間に埃が付着したのでしょう。もう一つのクリーニング兵器を取り出し、ぺったんこします。

 もう一度確認してみる事にしましょう。

 完璧ですね。満足です。
2013/8/4 追記: ローパス・フィルターの清掃のコツ、わかってきた。 多分、思っている以上にローパス・フィルターは全体的に汚れるという事。この汚れた状態で、無水エタノールで拭いても、汚れがミックスされて、乾きが遅い部分に汚れが溜まり、薄暗い斑点を形成してしまう。 なので、最初の2・3回は、たっぷり目に無水エタノールをつけて、ローパス・フィルター全体の汚れをクリーニングする事。その後、乾きの遅い部分が出ないように、少なめに無水エタノールをつけて、表面全体を仕上げていくと 
2013/8/11 追記: どうやらローパス・フィルターをレンズペンで拭いた強者がいるらしく、自分もローパス・フィルターをレンズペンで拭いてみました。ところが、レンズペンでは黒い斑点は取れませんでした。この事から、竹ベラにシルボン紙を巻きつけて拭き取りする時に、ローパス・フィルターに対して優しく拭くのではなく、竹べらの平面部分を強めに押さえるよう拭くのがいいのではないか?と思い、実践したところ、綺麗に拭き取る事ができました。ニコンの清掃のビデオのやり方は、全体の汚れをとる時しかやらず、仕上げの拭き方は、シルボン紙を巻いた竹べらで一方向に一回だけ強く拭いています(裏表の両面で1回づつしか拭きません)
2013/9/11 追記: EE-6310の使用を辞めました。理由は、白い粉っぽいものが残るからで、撮影した写真のクオリティに影響するのではないかと考えているからです。

2013年6月13日木曜日

boost::multiprecision 仮数部・指数部の取得

ドキュメントが足りてない感じで、理解するのに結構時間を要してしまったので備忘録。 長精度の整数型 cpp_int 、長精度の浮動小数点型 cpp_dec_float, 長精度の分数型 cpp_rational と大別して3タイプの型があり、精度指定ができるなど、それぞれのタイプも細かい設定ができるようになっています。そうすると、無数に型が作成可能な状態になり、爆発する型同士の組み合わせによる演算を、ひとつひとつ書いてたら大変な事になります。これを解決するために MPL を利用して型同士の種類で処理を分岐させています。 系統だって演算できるようにするための基本型が、number < BackendType, ExpressionTemplates > になり、BackendType が先の3タイプの型に相当します。 それぞれのタイプの型のメンバ関数にアクセスしたければ、number::backend() というメンバ関数をコールして、BackendType を取り出しアクセスする感じになります。 以下、サンプルです。
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>

using namespace boost::multiprecision;


int main() {
  number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> >  bi = 323456789012;
  number<cpp_dec_float<50> >  bf( "123456789012.3456" );

  std::cout << bi << std::endl;
  std::cout << bf << std::endl;

  bf = static_cast< number<cpp_dec_float<50> > >( bi );  
  
  std::cout << bf << std::endl;
  double   m;
  boost::int32_t  e;
  bf.backend().extract_parts(m,e);
  std::cout << "mantissa = " << m << ", exponent = " << e << std::endl;
  std::cout << "isint ? " << bf.backend().isint() << std::endl;
  return 0;
}

2013年6月7日金曜日

NEX-5R レビュー

 レビューと言っても、今まで、ちゃんとしたカメラ持ってなかったので、それから比べると「月とすっぽん」ぐらい違います。だから、比較となる対象が無いんです。カメラにはまってくると、APS-Cじゃなくてフルのカメラが欲しくなってきます。でも、このカメラ、ザックの上にポイと突っ込んで持ち歩けるし、軽いし、ものぐさな自分の性格に合っていて、手持ちでホイホイとブラケット撮影できるので気に入ってます。最初のうちは、カメラの使い方がわからなくて、シーン撮影を選択して喜んでました。でも、ちょっと慣れてくると、ここら辺は全く使っていません。というよりも、邪魔なのでメニューから消して欲しいぐらいです。こんな小細工しなくても十分に綺麗だと思ってます。おまかせオート機能も使っていません。ただし、1枚ものの撮影に、プレミアムおまかせオートを使用する事は多々あります。パノラマ撮影は、たまに使用します。状況に応じた計算をしやすいので、シャッタースピード優先と絞り優先のモードばかり使ってます。
 オートフォーカスですが、撮影してると微妙に違う部分にピントが合ってしまう事が多いので、DMFにて最終的なピント位置はマニュアル調整しています。自分は、風景写真が好きなので、オートフォーカスだけの打率で考えると、ピントが気に入らなくて捨てる写真が半分ぐらいはある感じです。フォーカスを自分で最終調整している関係上、フレキシブルスポットで、撮影する毎にモニタを押してターゲットの位置を変更してます。補助としてフォーカスされている部分を赤色に塗る機能はオンにしてます。撮影してる時は撮影だけに集中したいので、撮った写真が表示されると邪魔です。なので、撮影後の写真レビュー機能はオフにしてます。
 NEX-5Rを選んだ理由のうちのひとつは、Wifiでコントロールできるからで、色々とコントロールできるんじゃないかと楽観的に考えてました。そのために、中華PADも購入して、Root 取ってパケット・キャプチャもしました。Soap だったり、HTTP の Json だったりと、プロトコルに何を使ってるかぐらいまでは解析してみたんですが、RAWで保存してくれない作りっぽくて、ガッカリしてます。リモコンではブラケット撮影できないですし・・・。
 目下の不満は、リモコンでのブラケット撮影ができない部分でしょうか?AndroidにRAWデータを転送して表示しろなんて言いませんから、リモコンで5連とか7連のブラケット撮影モードが欲しいです〜(´;ω;`)。フォーカスは微調整を手でコントロールしているぐらいなので、強制オートフォーカスにされると使い物にならなくて困ります。

 まぁ、なんというか、すっかりHDRにはまって、± 2.0 ev のブラケット撮影を多用してます。そういう意味では、手振れ補正機能のオン・オフも簡単に変更できるようFnキーに割り当てられていると嬉しいかなぁ?














2013年6月6日木曜日

電子帝国時代

 久しぶりに、IT関連に関する雑感を書きます。  うちの会社ではGISを開発しているんですが、まぁ、いろいろと考えて、やってきても、帝国軍は全部根こそぎ持っていくんですわ。  今回、ESRI社のGISフォーラムに参加してきました。FOSS4Gとは対極にあるクローズドな会社だと思います。どこが凄いかというと、痒いところに手が届く、行き届いたサービスです。APPLEのデザイン力が素晴らしいのは周知の事実だと思いますが、ESRIのGISの機能は、柔軟かつ手数が少なく作業ができるようデザインされており、素晴らしいです。そんなESRI社の次なる動向を見て思ったのは、今まで隙間だと思っていた場所を埋め合わせるような新たな製品の投入。弱小企業が必死になって考えだしたビジネス領域を根こそぎ攫うかのような製品投入です。これだけじゃなく、ESRI社が強いのは、そのSIサポート体制と言えるかもしれません。市場開拓・育成・サポートまで一貫して行います。  Google Maps Engine 一般提供も視野に。Googleが B2B の細い分野まで侵食してくるとは思いませんでした。もうね、帝国軍レベルで隙間も注入されたら、どこにも余地ありませんわ。  今までのお客さんがいるので、簡単に辞められないですけど、もう会社たたんだ方が良いんじゃないかと思いますわ。うちの社員もSEのくせに GitHub ってなんですか?ってレベルだし、公開サイトにおいて、IE10やChrome でまともに動作しない状況について何の疑問も持たないセンスですしね。とうとうと、今 Chrome のシェアが一番でな、IEのバージョンも10の割合が増えてきてるんだよ、などと、アンテナベースの話からしなきゃならないとか、戦える気がしないですわ。  Apple が取り沙汰されるようになってから、Google も変わりましたよね?スペックや性能について、あまり語らなくなったと思いませんか?もちろん Google はオープンな企業で、特に隠し立てをしているという事は無いんですが・・・。  クリス・アンダーソンさんのFREEもどうなんでしょう?Makerでは、販売価格は製造原価の3倍で良いとか書いてるじゃないですか、労働コストの手間賃が含まれてるんですよ。なのに、ソフトウェアとコンテンツはFREEなんです。なんで、こうなってしまうのか?クラウドですよ。クラウドは便利ですが、胴元ビジネスなんです。ショバ代を徴収してテラ銭跳ねて、軌道に乗れば絶対に損しないビジネスなんです。ただし、ライバルに出し抜かれない限りは。みんな必死で進軍をやめるわけないですよね?電子帝国時代の到来です。  電子帝国時代に突入して若干空気が変わったと感じる事があります。ビジネス化するつもりのアイディアは口外せずに粛々と進めて、一挙に公開するとか、そんなんが増えてきているのかなぁと…。ま、特に根拠があるわけじゃないです。トップ・インタビューを読んでても、技術的・直接的な表現が減って、オブラートに包んだコンセプト的なものが増えてるような気がしてます。そういう意味じゃ、日本のメディアが日本の強みは、どこどこで、とか全部ノウハウに相当する部分を細かく分析して図表まで書いて披露するのは、へぇ~かもしれませんが、電子帝国時代にはマイナスなのかなぁと思う事もあります。トップの方も、技術的なノウハウに相当する暴露は控えて、テイストとか人間の感性に訴える部分に置き換えて表現した方が良いんじゃないでしょうか?  オープンソースもね。それで食ってくの辛いですよ。労働コストに対して「でも、お高いんでしょ?」の一言で片付けられてしまうような側面を持ってるんですよ。サラリーマン・タイプの人は、自分の職業で自分が働いた対価に対して経営層が、なんかお金に変えて賃金払ってくれるから、自分の労働コストに対しては厳しく文句言うくせに、他人の労働コストに対しては、平気で高いとか言うんですわ。君の給料は、どこからきてると思っているのか?もうちょっと、労働対価に関する価値観を教育していかないと、電子帝国時代は厳しい世界になるんじゃない?そんな風に感じてます。  あまり技術的な話を書くとね、帝国軍にサルベージされて持ってかれそうで嫌なんですけど。クラウドの次は、真の分散が来るんじゃないかと。そうでもしないと、胴元ビジネスの帝国主義は打破できないんじゃないかと。フォッグ・コンピューティングなる言葉があります。意味合いが若干異なりますが、自分も同じような事を考えていました。ジャンルは NoSQLに近いです。NoSQLの世界では、耐故障性能を上げるためにノード間でレプリケーションするやないですか?それって、見ず知らずのデータベース間でもスキーマが同じなら、データ交換が技術的には可能ですよね?て事はですよ?NFCとか使ってスレ違いざまにデータ交換できますよね?東北大震災の時に被災地のデータを人々がスレ違いざまにデータ交換して、自己組織化のようにデータが伝搬していく。クラウド無しでも行けると思いませんか?と、こんな事も考えてるんですが、自分とこではリソースをさく事態にならないと思うんで、面白いと思った人に託しますね。

2013年5月23日木曜日

android ndk と java から sqlite3 でアクセスするとどうなる?備忘録

 ndk からsqlite3 データベースを読みだしている状態で、android sdk の java が、データベース更新時に、時々例外を発生する事がある。どんなカラクリになっているのか気になって調べてみるとtwo connection to sqlite from java application and from ndkの情報が正確そうだ。Android SDK のJavaコードでは、1000mm sec 待っても応答が無ければ例外を送出する仕様であるらしい。言わせてもらえると、例外が発生するようなケースは、レアケースじゃね〜Ze。こんちくしょう。 自分の ndk でのレコードアクセスでは
#pragma once
#ifndef SQLITE_ACCESS_HPP
#define SQLITE_ACCESS_HPP

#include <sqlite3/sqlite3.h>
#include <functional>
#include <memory> // unique_ptr
#include <log.hpp>
#include <unistd.h>

namespace sio {

  template <class Container, class ReadOpe>
  bool read_rows(
    sqlite3*    db, 
    const char* sql, 
    Container&  container,
    ReadOpe     ope,
    const char* target_name
  ) {
    sqlite3_stmt* stmt = nullptr;
 int res = sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr );
 if( SQLITE_OK != res ) {
      __android_log_print(ANDROID_LOG_ERROR, target_name, "Fail to read rows: %d", res );
      return false;
 }
    std::unique_ptr<sqlite3_stmt,std::function<void(sqlite3_stmt*)> > stmt_holder( stmt, sqlite3_finalize );
 while(true) {
      while( res = sqlite3_step(stmt), SQLITE_BUSY == res ) { usleep(10); }
   switch( res ) {
   case SQLITE_ROW:  ope( stmt, container );  break;
   case SQLITE_DONE: return true;
      default:
        __android_log_print(ANDROID_LOG_ERROR, target_name, "Fail to get row: %d", res);
        return false;
   }
 }
  }

} // namespace sio

#endif // SQLITE_ACCESS_HPP
こんな感じで処理していて、他のプロセスやスレッドによって書き込みが阻害されている場合には、何mm sec スリープさせれば良いかわからないけど、とりあえず10mm sec 休ませる事にしているのだが、Android SDK は問答無用で1秒タイムアウト。 詰んだ\(^o^)/ まぁ、1秒にでもしとかないとデッドロック等のケースに対処できないから、しょうがないのかもしれない。  多分、例外が発生したら、もう一回同じ更新をJavaの方でかけに行くのが、いいのかなぁ?

2013年5月21日火曜日

HDRにはまってるのだ

 はい、HDR(High Dynamic Range)写真にはまってます。Photomatrix Pro を買いました。まぁ、色々とやってるんですが、大阪の実家の近くに「大阪芸術大学」なんてのがありまして、小学校の頃、よくここで遊んだんです。ここの建物、コンクリートむき出しの打ちっぱなしで、当時、奇天烈なデザインで印象深く、HDRやるなら是非ここをモチーフにしたいと思っていました。HDRの仕上げも、色々あると思いますが、自分は、どちらかというと頭の中の源風景を再現した自然な仕上がりが好きです。若干、カリッと仕上がっていると思いますが、コンクリートの黒ずんだ感じは、個々のパーツをよく観察すると、ほんとに、こんな風になってます。
 1枚目は、芸大正面口からの眺め

正面口から、先ほどの建物の方に向かって坂を登っていきます。


開けた所で特徴的な、この建物


その脇を当時としては変わった天窓付きの宙2階のようなスペースがあります。


こちらは、上の風景の反対側。庭園になりますが、昔はもう少し雑だったような気もします。


入り組んだ、コンクリート打ちっぱなしの建物があります。


コンサートのできる彫り込んだような庭のスペースもあるのですが、写真にパープル・フリンジが起こっていて、やむなく断念しました。まだまだ、新しい建物も面白いのですが、自分が小学生だった頃は、だいたい、ここら辺の建物までで、後は部活用のプレハブだったり、石膏を固めた彫刻模型のようなものが無造作に打ち捨てられていたりと、そんな感じでした。池があったスペースも、今では、だいぶ埋め立てられているようです。
写真の出来には満足してます。

2013年5月20日月曜日

android Intent で画像編集、備忘録

 android.net.Uri の作成の仕方によっては、「ファイルが見つかりません」と、つれなくあしらわれるので備忘録。 以下のようなやり方だと、ファイルを認識できない。
  public void editImage( String path, String filename ) {
    Uri imageUri = Uri.parse( path + "/" + filename );
    Intent launchEditor = new Intent();
    launchEditor.setAction(Intent.ACTION_EDIT);
    launchEditor.setDataAndType(imageUri, "image/jpeg");
    activity.startActivityForResult(launchEditor, 0);            
  }
 ちゃんと、File クラスを通じて生成する事
  public void editImage( String path, String filename ) {
    Uri imageUri = Uri.fromFile( new File( path, filename ) );
    Intent launchEditor = new Intent();
    launchEditor.setAction(Intent.ACTION_EDIT);
    launchEditor.setDataAndType(imageUri, "image/jpeg");
    activity.startActivityForResult(launchEditor, 0);            
  }
2014/09/09 追記:編集するアプリケーションによっては、ファイル名を勝手に書き換えて、新しいファイル名の取得方法が用意されていないという問題が発生する場合がある。これに対する処方箋は、見つかっていない。

2013年5月2日木曜日

室蘭散策街中編

 朝起きて、ホテルから昨夜の風景をパチリ、工場は眠らない。時間もあるので街中を散策する事に…

 東室蘭の高架橋から、いたるところから工場が望めます。

 工場の方から鉄パイプが!さすが室蘭
 テツプロさんにやってきました。





 ここで、テツプロさんをあとにし、近所のスーパー、その名も「ぷらっと・てついち」に。

 さすが鉄の街!アートな鉄の看板










 いやはや、なんともオシャレですね!
外には、こんな鉄のオブジェまであります!
 お昼には少し早かったのですが、カレーラーメンを食べました。
 大王ではなく、蘭たん亭さんです。
 地味に福神漬けが良かったです。
帰りは、時間の都合で、東室蘭駅までタクシーにのり登別へと移動しました。随所に鉄を生かしたモチーフがあり、味があります。