2016年8月24日水曜日

digest 作成備忘録

OpenSSL の SHA-256 を利用してダイジェスト文字列を作る備忘録です。
英数字を小文字にするのどうやるんだっけ?ってあたりから、激しくドレインしてます。
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm> // transform
#include <string>
#include <openssl/rsa.h>
#include <openssl/sha.h>
#include <boost/algorithm/hex.hpp>
#include <boost/algorithm/string/case_conv.hpp>

namespace {
  const char heading[] = "heading";
}


void show_usage() {
  std::cout << "make_digest [string]" << std::endl;
}

std::string digest( const char* str ) {
  unsigned char hash[SHA256_DIGEST_LENGTH];
  SHA256_CTX ctx;
  SHA256_Init(&ctx);
  SHA256_Update(&ctx, str, strlen(str));
  SHA256_Final(hash, &ctx);
  std::string result( (const char*)hash, SHA256_DIGEST_LENGTH );
  return result;

}

int main(int argc, char* argv[]) {

 if( argc != 2 ) {
  show_usage();
  return 1;
 }
 std::string charange( heading );
 charange += std::string( argv[1] );
 std::string hoge = digest( charange.c_str() );
 std::string digest;
 boost::algorithm::hex( hoge, std::back_inserter( digest ) );
 boost::algorithm::to_lower( digest );
 //std::transform( digest.begin(), digest.end(), digest.begin(), ::tolower );
 std::cout << digest << std::endl;

  return 0;
}

2016年8月13日土曜日

70-200レンズ

 Sigma 70 - 200 mm F2.8 を売ろうかと考えてます。
というのも、室蘭の夜景でブレないで撮れた試しもなく。マニュアルフォーカスしても、微妙にピントがズレる事も多く。オートフォーカスは遅くて、おまけにシャッターが下りなくてシャッターチャンスは無いに等しい。Merrill で撮影しても、撮れるシーンなんて、ほぼ限られる。このレンズで撮影して、やった!って思った写真は、考えてみても、ほぼゼロ。倍率も中途半端で、イマイチ。
 あと、予定外の出費が嵩んだのもあります。

2泊3日の弾丸キャンプ

 家族で2泊3日の東北に行ってきました。午前3時起床、午前4時出発、高速飛ばして函館北斗へ。そして新幹線に乗って盛岡まで。本当は新青森の予定だったのですが、日産レンタカーが予約を受付しておいて、車ありませんでした攻撃を食らったため変更でした。直前までレンタカーを探しまくっても見つからず。探しても探しても空車無し。タイムズレンタカーの厨川駅でやっとこさ予約。
 昼に盛楼閣で飯を食って、イザ恐山へ。いやーーーーー遠いですわ。ハードスケジュールに意識が飛びそうになりながら、矢立温泉でバンガローを借りる。朝活する体力もなく朝を迎えて、恐山へ。そして、十和田市現代美術館に。車返す事を考えたら、盛岡近辺でキャンプしないと…でも、星が綺麗なキャンプ場が良いな?と思って、種山高原星座の森へ向かうも、時間切れで八幡平から妻の神キャンプ場へ。本当は白神山地も寄りたかったんですが、時間的に全然無理でした。そして運転もハード。
 あんまり星が綺麗に見えなかったけど、流星群が凄くて、火球とかに大満足。ここではタイムラプスを撮って放置したけど、バッテリー切れで撮れてるのか撮れてないのか、さっぱりわかりません。11時ぐらいに早々に寝て、翌朝少しだけ朝活。と言っても、どこで撮影したものか?全然わかりません。ここら辺、意外に開けて見える場所が少ないのだ。
 そして、帰りの新幹線もあるのでレンタカー屋さんへ。電車に乗り遅れたら大変なので、レンタカー屋さんからダッシュ!滑り込みセーフで、あたふたしながら盛岡で焼き肉を食べて、新幹線&函館北斗から車だったのだ。
 写真は無い。

2016年7月26日火曜日

MinGW sqlcipher build 忘備録

まず、Mingw のインストール

MinGW(gcc) の Windows へのインストールと使い方 を参考にインストールします。

MSYSのシェルを起動するショートカットを作成します。
参照は C:\MINGW\msys\1.0\msys.bat です。

MSYSのシェルを起動します。

ライブラリの探し方は
$ mingw-get list | openssl
とします。

mingw-libopenssl を入れてみます。
$mingw-get install msys-libopenssl

SQLCipher をダウンロードして展開します。

$ configure

.... はい、エラーになります。

OpenSSL をダウンロードしてビルドします。

$ Configure --prefix=$PWD/dist no-idea no-mdc2 no-rc5 shared mingw
$ make depend && make && make install
です。

ようやく build に入ります。主にこちらを参考にしました。

sqlcipher と openssl のソースが home 下に作成されているとします。
$ configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -I../openssl-1.0.2h/dist/include 
        ../openssl-1.0.2h/dist/bin/libeay32.dll -L../openssl-1.0.2h/dist/lib -static-libgcc" DLFLAGS="-leay32"
make claen
make sqlite3.c
make
make dll

2016年7月21日木曜日

生産性の低いモバイル・アプリケーション開発


 近年、自分が感じているモバイル・アプリケーション開発に対する状況を書いてみよう。(自分はB2B系のシステム開発をしているので、コンシューマ向けの事業を行っている方面の方にはマッチしない考察である可能性があります)

 発売されているモバイル端末は多岐にわたる。iOS をはじめとする iPhone, iPad。Android をはじめとする Android 端末、タブレット端末、将来的には ウェアラブル端末。Windowsをはじめとする Windows Phone、Surface、得体のしれないタブレット端末類。どの端末をとってみても、これで開発しておけば安泰なんていう時代じゃなくなってます。少し前まであったAndroidタブレットは、現在生産しているのが数社に狭まり、今後、市場として成立するかどうかは全くの不透明。どの部分が明日には廃れていくか決め打ちするのもリスクが高すぎて選択できません。逆もまた然り。

 よって、全方位で製品を提供できる事が理想です。Microsoft社も、このように考えているようです。ひとつの解決策としては Xamarin があります。しかし、考えるに、Xamarin って生産性高いの?という疑問が付きまといます。HTML5も進化して、どんどんとネイティブ・アプリとブラウザ・アプリの差が縮まっているように感じています。札幌で行われたW3C会議のDeveloper Meetup に参加して思ったのは、Worker Service や Universal Payments など、野心的な開拓と提案で、この先も、どんどんと進化していく流れは続きそうだという事です。Google は Native の有用性と Browser の有用性は、それぞれにあり、どちらも必要性を認めていますが、両者の垣根は、だんだんと曖昧になってきていると考えているようです。

 ウェブは終わったと煽る記事もありますが、自分は、ウェブをベースにアプリを作成するのが幸せだと考えてます。もちろん Native コードじゃないと話にならない事もあります。アプリのパーツを考えた時、ウェブをベースとした作り方ができれば、生産性は高まります。レイアウトもコードも楽ですし、再利用できるコードも多いですし、なんならウェブ・アプリケーションとして提供するのもコストが少なくて済みます。調べてみると WebViewの出来は最悪みたいで、Android Kitkat 4.4 以上であれば ChromeViewが使えるようです。他には Crosswalk というものもあり、これなら Android と iOS、Windows Phone もプロジェクトがあるので使えそうです。

 ここから先の考え方は、現在無いように思う事項です。サーバーを端末内の node.js のようなもので代用できれば最高だと思いませんか?ポートを介して接続したりするので、モバイル端末等におけるセキュリィティの概念が必要でしょうが、VirtualHost的な考え方と認証を組み合わせれば大丈夫でしょう。サーバをローカルにするメリットは、まだあります。WebStorageで頑張らなくてもサーバサイドに機能を寄せる事ができます。フォッグ・コンピューティング的な考え方等を導入する場合でも、ローカル・サーバ・サイドの機能として隠蔽する事が可能なので幅が広がります。残念ながら Android に node.js を入れようと思ったら root化が必要そうではあります。変なサービス・アプリケーションを一生懸命開発するぐらいなら、ローカル・サーバ・サイドの機能として実装するのもアリだと思いませんか?

 こうやって、アプリケーション内を部分的にでもWebView的なもので置き換える事ができたら、グッと生産性が上がるんじゃないかな〜?どうでしょう?


 

2016年6月25日土曜日

macbook pro retina mid 2012 SSD 交換

macbook pro retina display MID 2012 モデルのSSD 256Gで使ってましたが、さすがにディスク容量が足りなくて、交換する事にしました。

mSATA 512G と ebay から macbook pro 用の mSATA Adapter の組み合わせです。
後に判明したのは、星型ドライバーが足りないという事で
macbook pro retina display MID 2012 をバラすのに必要な星形ドライバ
それと、SSD を外すのに必要な星形ドライバ を買いました。

交換し終えた後ですが、こんな感じ。






Timecapsule を持っていたので、楽観視してましたが、付け替えた SSD 512G を "Case Sensitive FS" でフォーマットしたら、ハマりました。
Case Sensitve FS とは、大文字小文字を区別するファイル・システムの事なんですが、こいつを選択すると、Timemachine が見えなくなります。この状況が理解できなくて、SSD 256G に戻したら、このSSDが交換作業で飛んじゃって、元のデータがどこにも無い状態で、焦りまくり。
なんとか、新しく mac os x をインストールして、ディスク・ユーティリティのFast AID で Timemachine を復元して、必要なファイルだけを Timemachine に入って取り出す事に成功しました。Timemachine からの復元は失敗する状況です。
Adobe Creative Cloud Photographer を契約しているので、Creative Cloud をインストールしようとしたところ、「Case Sensitive FS はサポートしていません」と怒られました。調べてみると、Case Sensitive FS をサポートしているアプリケーションは少ないとの事。
泣きながら、普通のファイル・システムで SSD 512G を初期化し直したら、なんて事もなく Timemachine から前回使用していた環境を復元できるじゃないですか!!!!!

いや、もう参りました。
という事で、2万円かけずに 256G から 512G の環境に移行する事ができました。
ディスク容量があるって、幸せです。

2016年6月16日木曜日

固定小数点クラス

ずっと昔64ビット長の固定小数点クラスがほしくて、書いたやつ。 今なら、8ビット長の固定小数点クラスなんですかねー。
#pragma once
/*!
 @file fixed_float.hpp
 @brief 固定精度浮動小数点クラス・ヘッダ
*/

#include <boost/assert.hpp>
#include <boost/operators.hpp>
#include <limits>


//! 64ビット長固定精度浮動小数点クラス
class fixed64 :
 private boost::addable<fixed64>,
 private boost::subtractable<fixed64>,
 private boost::multipliable<fixed64>,
 private boost::dividable<fixed64>,
 private boost::equivalent<fixed64>,
 private boost::partially_ordered<fixed64>
{
public:
 static const int exponent_ = 16; //!< 指数部長
private:
 int64_t value_; //!< 値
public:
 //! コンストラクタ
 inline fixed64() : value_() {}
 //! コンストラクタ
 inline explicit fixed64( 
  int64_t value //!< [in] 値
 ) : value_(value << exponent_) {
  BOOST_ASSERT( value <= (std::numeric_limits<int64_t>::max() >> exponent_) );
  BOOST_ASSERT( (std::numeric_limits<int64_t>::min() >> exponent_) <= value );
 }
 //! コンストラクタ
 inline explicit fixed64( 
  double value //!< [in] 値
// ) : value_(static_cast<int64_t>(value * (1LU << exponent_))) {
 ) : value_(static_cast<int64_t>(value * pow(2.0,exponent_))) { 
  //BOOST_ASSERT( value <= (static_cast<double>(std::numeric_limits<int64_t>::max() >> exponent_) );
  //BOOST_ASSERT( (static_cast<double>(std::numeric_limits<int64_t>::min()) >> exponent_) <= value );
 }
 //! コピーコンストラクタ
 inline fixed64( 
  const fixed64& value //!< [in] 値
 ) : value_(value.value_) {}

 //! オペレータ +=
 inline fixed64& operator += (const fixed64& rhs) {
  value_ += rhs.value_;
  return *this;
 }
 //! オペレータ -=
 inline fixed64& operator -= (const fixed64& rhs) {
  value_ -= rhs.value_;
  return *this;
 }

 //! オペレータ *=
 inline fixed64& operator *= (const fixed64& rhs) {
  value_ = static_cast<int64_t>( 
   (
    (
     ((static_cast<int64_t>(value_)) * (static_cast<int64_t>(rhs.value_)))
     // 切り上げを行う
     //& pow( 2.0, exponent_ - 1 )
    )
    >> exponent_
   )
  );
  return *this;
 }
 //! オペレータ /=
 inline fixed64& operator /= (const fixed64& rhs) {
  value_ = static_cast<int64_t>(
   (static_cast<int64_t>(value_) << exponent_) / static_cast<int64_t>(rhs.value_)
  );
  return *this;
 }
 //! オペレータ =
 inline fixed64& operator = (const fixed64& rhs) { value_ = rhs.value_; return *this; }
 //! オペレータ ==
 inline bool operator == (const fixed64& rhs) const { return value_ == rhs.value_; }
 //! オペレータ <
 inline bool operator < (const fixed64& rhs) const { return value_ < rhs.value_; }

 inline double get(){
  return static_cast<double>(value_ / pow(2.0, exponent_));
 }

 inline operator double() const 
  { 
    //return double(value_ * (1 >> exponent_)) ; 
  return double(value_ / pow(2.0, exponent_));
  //return double(value_ * (static_cast<int64_t>(1) >> exponent_)) ;
  } 
 //! オペレータ =
 inline fixed64& operator = (const double& rhs) {
  value_ = static_cast<int64_t>(rhs * pow(2.0, exponent_));
  return *this; 
 }
};