2019年9月19日木曜日

boost::posix_time::ptime 無効かどうかチェックする is_not_a_date

日付に有効な値がセットされているかどうか、チェックする。
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

int main() {
  boost::posix_time::ptime pt;
  
  if( !pt.date().is_not_a_date() ) {
    std::cout << "TRUE" << std::endl;
  } else {
    std::cout << "FALSE" << std::endl;
  }
  std::cout << pt << std::endl;
  
  return 0;
}

2019年9月9日月曜日

Chromeがコネクション・タイムアウトする

Chrome が CONNECTION TIMEOUT で、ウェブに繋がらない現象が頻発する。
原因を探っていくと、"Cryptography Services" というサービスが、何かの拍子に悪さをするようだ。このサービスを再起動させれば、CONNECTION TIMEOUT が解消されるというので、やってみたら、解消された。

 CONNECTION TIMEOUT する毎にサービスの画面を出して、"Cryptography Services"を再起動させていたのだが、この現象が頻発するのでタスクスケジューラで自動実行させるようにした。


まずは、restart_crypto.bat を作成します。
net stop "Cryptographic Services"
net start "Cryptographic Services"
次に、restart_crypto.vbs を作成します。
set wsObject = CreateObject("Wscript.Shell")
wsObject.run "cmd /c restart_crypt.bat", vhide
そして、タスクスケジューラに登録します。
ブラウジングは、ログオンしている時なので、ログオン時、かつ、サービスを再起動させるので管理者権限が必要です。
ログオン時から、10分毎に実行させます。
wscript.exe から、restart_crypto.vbs を実行させます。

これで、だいぶ楽になりました。

2019年6月6日木曜日

Android Studio くんご乱心

Android の業務アプリで、ちょっと見てくれってお願いされて、Android Studio を起動したんですわ。そしたら、デバッグができない。
あー、また gradle 地獄か?と、うんざりしながら、Android Studio 一式をアップデートしたんですわ。
原因もわかりました。
null オブジェクトを trim() してたんで、飛んでたんです。
該当箇所のライブラリをビルドして、実行しても、直らない。
???
???
???
え?なんで?
ビルドしたライブラリを見たら、出来てないんですわ。
目を凝らすと、app-release.aar とかいうものと、app-debug.aar というものが生成されてたんですわ。
また、Android Studio くんがご乱心されたんですわ。
はいはい、aar をリンクするように書き換えれば良いんですよね?
ライブラリのビルドプロジェクト14個全部書き換えて、それを利用してるプロジェクトも全部書き換えるんですよね?
やりましたとも…

さて実行をば…
突然のduplicate class error!!!!

はい、解決方法は
  //implementation fileTree(dir: '../../Ref/Java', include: 'hoge.jar')
  compileOnly fileTree(dir: '../../Ref/Java', include: 'hoge.jar')
implementation を compileOnly に書き換えれば、これらの jar ファイルが aar に含まれなくなります。
毎回毎回やってられるかー!
  ( ⌒ ) 
   l | / 
  ∧_∧ 
⊂(#・д・) 
 /   ノ∪ 
 しー-J |l| 
         人ペシッ!! 
       __ 
       \  \ 
          ̄ ̄ 
2019/08/26 追記: gradle のアップグレードに中途半端に失敗する場合がありまして、「Could not get unknown property 'assembleDebug' 」と怒られる事態に陥る事があります。 その場合、下記のように assembleDebug を assemble に変更する事で回避できます。
task cleanDebugJar {
    def classes = new File('build/outputs/aar/app-debug.aar')
    if( classes.exists() ) {
        delete '../../Ref/Java/foo.aar'
    }
}

task generateDebugJar(type: Copy, dependsOn: [cleanDebugJar,assemble] ) {
    //from 'build/intermediates/bundles/debug/'
    from 'build/outputs/aar/'
    into '../../Ref/Java/'
    include('app-release.aar')
    rename('app-release.aar', 'foo.aar')
}

2019年5月21日火曜日

BOOST SPIRIT GUIDE

業務でこのライブラリ使ってまして、SJISからUNICODE化する時に、ここのパートの修正で死にそうになりました。その時に感じたのが、現状に見合った情報が少なくて、書いてある事が現状と合っているか取捨選択に時間がかかるという事。

せっかく突っ込んで調べたので、ノウハウをガイドという形で残そうと、boost::spirit のガイドを書き始めました。

自分では使っていない機能もあったりして、使ってない部分はコード書いて検証して書き進めたりしているので、そういう部分は、時間がかかったりもしてます。

一段落してきたので、ペース落として、ぼちぼちと書いてます。
https://oki-miyuki.github.io/boost_spirit_guide/

皆さんの参考になれば幸いです

2019年3月28日木曜日

今頃vcpkgの話

Visual Studio 2015 を導入しまして(過去のしがらみから、なかなかVC5から脱却できませんでした)、本格的に vcpkg を導入する事にしました。
なんせ、ライブラリのバックオーダーが多くて、迂闊に環境を変えてバグでも出そうもんなら罵られかねない状況なのもあり、やっと感はあります。
Visual Studio 2017 は、アップデートで勝手にライブラリが変わってしまうので、敬遠しました。
Visual Studio 2015 のインストールから、vcpkg でのビルドに至るまでに、いくらか躓いたので、その辺を書いておきます。

  • Visual Studio 2015のインストールでハマった。
  • コマンドプロンプトでハマった
  • プロキシでハマった
  • Debug|Releaseでハマった

Visual Studio 2015のインストールでハマった

Dドライブに Visual Studio 2015をインストールしました。結論から言うと、Dドライブにインストールしてもvcpkgは、ちゃんと動きます
当たり前の話ですが「Visual C++」要ります(まさかデフォルトで入らないと思いませんでした)。
「ユニバーサルWindowsアプリ開発ツール」要ります(無いとMSBuildが~って怒られます)。
「英語のVisual Studio 2015言語パック」ほぼ必須な zlib のビルドが無いと通りません。

コマンドプロンプトでハマった

開発者コマンドプロンプトを使って vcpkg をビルドしたら、vcpkg がビルドできませんでした。
いろんなプラットフォームを選択できるので、Windows PowerShell からコマンドを実行しましょう。

プロキシでハマった

そんなにハマったわけではありませんが、知らないと苦労すると思います。
プロキシを設定している人は、 コントロールパネルのシステム:システムの詳細にて、システムの環境変数に以下の環境変数を追加しましょう
set HTTP_PROXY=http://proxy-server:8080
set HTTPS_PROXY=http://proxy-server:8080
perl といった Unix 由来のツールが、こっそり環境変数を参照します。

Debug|Releaseでハマった

FAQによるとDebugかReleaseはターゲットの名前が完全一致で判定しているそうです。UnicodeRelease というターゲットを設定していると、ビルド時に、どっちかわからんと怒られました。
vcxproj ファイルをテキストエディタで開いて、以下の設定を加えました。
  <PropertyGroup>
    <VcpkgConfiguration Condition="'$(Configuration)' == 'UnicodeRelease'">Release</VcpkgConfiguration>
  </PropertyGroup> 

2018年12月8日土曜日

ubuntu で coredump が出ない

事の発端は、CentOS + PHP7.2 の環境で開発してたものをデモ用に流用して運用してたところから始まります。最初は、何の問題もなくちゃんと動作してたんですわ。yum update をしていて、途中から ERR_CONTENT_LENGTH_MISMATCH や ERR_INVALID_URL というの頻出するようになりまして、apache がアクセス不能になるという現象に悩まされはじめました。自分の作ってた php extension が悪いのかな?とか思って、色々と試してみたんですが、extension の module をロードしない状態でも、ERR_CONTENT_LENGTH_MISMATCH が起こるので、これはもう CentOS 固有の問題ではないかと考えはじめて、Ubuntu の環境で同じものを作ってみる決断を下しました。
まあ、自作の extension は CentOS + PHP7.2 で動作していたんですが、PHPもソースから入れようと、コンパイルしてみたら 自作 extension のコンパイルが通らなかったり…。もう一度、ソースを見直してみると、php5.x 系 php7.0 系 php7.1系 php7.2系 で構造もマクロも変わって互換性がほとんどない。この件に関しては後日、まとめようと考えております。

本題に入りまして、Ubuntu環境で動作させてみると、 ERR_CONTENT_LENGTH_MISMATCH が起きません。
が、Ubuntu 環境では、自作 php extension が SIGSEGV で落ちます。PHP_MINIT_FUNCTION のコードはログに記録されているのですが、何故か他の箇所のログが一切記録されないので、コアダンプを調べたいと思いました。
$ ulimit -c unlimted
を apache2 環境でするための機構があるらしいという事で、 /etc/default/apache2 というファイルに ulimit -c unlimited の1行を加えてみました。
 ulimit -c unlimited
コアダンプが出ない(#^ω^)ピキピキ

こんなの見つけた。
systemd時代に困らないためのlimits設定
(゚д゚)(。_。)(゚д゚)(。_。) ウンウン、そうだよねー怒り感じるよねー。
...
......
コアダンプが出ない...
  ( ⌒ )
   l | /
  ∧_∧
⊂(#・д・)
 /   ノ∪
 しー-J |l|
         人ペシッ!!
       __
       \  \
          ̄ ̄

見つけました。
Ubuntuでコアダンプが出力できないことがある
ふむふむ… /etc/default/apport を見てみると
# set this to 0 to disable apport, or to 1 to enable it
# you can temporarily override this with
# sudo service apport start force_start=1
enabled=1
なんで、enabled=0 に変更する。

やっと出ました。コアダンプ…。

あと、ログが出ない現象は、extension の MINIT 時には /var/log/php/error.log に出力されてるんですが、途中から /var/log/apache2/error.log に出力先が移動してました。
こんなん、わかるかーーーーー!
  ( ⌒ )
   l | /
  ∧_∧
⊂(#・д・)
 /   ノ∪
 しー-J |l|
         人ペシッ!!
       __
       \  \
          ̄ ̄

apache2 のコアダンプの設定は、[Linux] coreファイルについてに習い
/etc/systemd/system/apache2.service.d/override.conf
というファイルを作成して
[Service]
LimitCORE=infinity
と記述する事で落ち着きました

2018年8月22日水曜日

atlapp.h warning C4996: 'GetVersionExW': が古い形式として宣言されました。

WTL(Windows Template Library) を使用していて、ワーニングで怒られた。 以下のように修正を施す。
#if 1600 <= _MSC_VER
#include 
#endif

// Windows version helper
inline bool AtlIsOldWindows()
{
#if 1600 <= _MSC_VER
  return !IsWindowsVistaOrGreater();
#else
  OSVERSIONINFO ovi = { 0 };
  ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  BOOL bRet = ::GetVersionEx(&ovi);
  return (!bRet || !((ovi.dwMajorVersion >= 5) || (ovi.dwMajorVersion == 4 && ovi.dwMinorVersion >= 90)));
#endif
}

inline bool IsVista()
{
#if 1600 <= _MSC_VER
  return IsWindowsVistaOrGreater() && !IsWindows7OrGreater();
#else
  OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) };
  BOOL bRet = ::GetVersionEx(&ovi);
  return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6));
#endif
}
ただし、WindowsSDK が古いと、VersionHelpers.h が含まれていないので、注意が必要。