2019年10月20日日曜日

mac が catalina になったら、色々と終わってた

catalina になったら、動作しないアプリが山のようにあったので、整理した。
ショックだったのは、ScanSnap Manager が動かない事。
富士通のサポート情報によると S1500M は Catalina に対応しませんとの事。\(^o^)/オワタ
それと同時に Adobe Acrobat Pro も\(^o^)/オワタ

やっべー、ディスプレイのカラーマネジメントのソフト ColorMunki Photo も動かないじゃないか!!!と思ってると、ColorMunki Display | MacRumor に情報がポストされてた。

 それによると、ここのソフトをダウンロードして実行し、古い ColorMunki をアンインストールする。次に i1Studio で継続してサポートされるようになったので、こちらのソフトをインストールすべし!との事

 やってみたら、接続エラー1020 でダメだったのに、1日経ってやり直したら、測定できました。※接続エラーになる場合 i1Studioを強制終了させてから実行すると良いです。

 


2019年10月11日金曜日

geotiff の変換あれこれ忘備録

ウィンドウズのバッチでまとめて見ました。
Windows 10 がコマンドプロンプトの utf-8 に対応したため、chcp 65001 をしてコマンドを実行した方が、トラブルが少ないです。

geotiff ファイルから png ファイルに変換する(goetiff to png)

if "%1"=="" goto err
chcp 65001
GDAL_TRANSLATE -OF PNG -B 1 -B 2 -B 3 %1.tif %1.png
goto end
:err
echo param1 [basefilename]
:end


geotiff を分割する(divide geotiff)

if "%1"=="" goto err
chcp 65001
echo divide geotiff 5000x5000
mkdir %1
call gdal_retile -ps 5000 5000 -targetDir %1 %1.tif
:err
echo param1 [basefilename]
:end


png の色を変換する

if "%1"=="" goto err
chcp 65001
convert %1.png -fill "#FEFEFE" -opaque "#FFFFFF" %1_.png
convert %1_.png -fill "#010101" -opaque "#000000" %1_dst.png
:err
echo param1 [basefilename]
:end


png を分割する(divide png)

if "%1"=="" goto err
chcp 65001
echo divide png 5000x5000
convert %1.png -crop 5000x5000 +repage +adjoin %1\%1_%%02d.png
:err
echo param1 [basefilename]
:end


World Fileを出力する(export world file(*.tfw) from geotiff)

if "%1"=="" goto err
chcp 65001
for %%s in (*.tif) do listgeo -tfw %%s
:err
echo param1 [basefilename]
:end

2019年10月9日水曜日

sqlcipher 対応のWindows x64版 sqlite3.dll をビルドした忘備録

前回の忘備録から3年

x64 版の sqlcipher 対応 dll をビルドしてくださいと言われて、気分はもにょーん。

sqlcipher-4.2.0 をダウンロードしてきて、ActiveTcl の32bit版、バージョン古い方を入れて
C:\Work\sqlcipher-4.2.0> nmake -f makefile.msc SQLITE_HAS_CODEC=1 USE_CRT_DLL=1 PLATFORM=x64
ってやったら、
sqlite3.c(30924): error C2061: 構文エラー: 識別子 'CRITICAL_SECTION'
sqlite3.c(30931): error C2059: 構文エラー: '}'
sqlite3.c(30986): error C2079: 'winMutex_staticMutexes' が 未定義の struct 'sqlite3_mutex' で使用しています。
sqlite3.c(30999): fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
となって、ビルドできない。
Makefile.msc を追っていくと、ライブラリのパスが間違ってる、リンクオプションがメタメタ、その他諸々設定が反映されず、とにかくビルドできるような状況にもっていくのが大変そうだった。

そこで、nmake して生成された sqlite3.c sqlite3.h sqlite3ext.h sqlite3session.h から DLL をビルドした方が簡単な気がして試してみた。

空のDLLプロジェクトを作成

そして、sqlite3.c sqlite3.h sqlite3ext.h sqlite3session.h をプロジェクトに追加する。
プリプロセッサの定義として
SQLITE_API=__declspec(dllexport)
SQLITE_HAS_CODEC=1
を追加すればOKだ。 vcpkg を導入済みであれば、openssl もあっけなくリンクされてくる。
x64 は、stdcall 形式がなく cdecl 形式で、以下のようにエクスポートされている。

2019年10月8日火曜日

android ndk clang に変わってから、まじめに再構築してみた備忘録

Android ndk を 20.0 にして今まで動作してたコードをコンパイルしてたんですわ。
その時に、躓いた事を記録と…。

当時は APP_STL : stlport_shared と gnustl_static の2種類で、stlport にあるけど、gnustl にない。gnustl にあるけど、stlport にない。両方欲しいのだが詰んだwとか、苦労してましてん。そしたら、c++_shared と c++_static に変更されてました。
ビルドする時に、__atomic_inc とか使ってたんですけど、時代は std::atomic に変わってました。
いざ実行しようとすると、libc++_shared.so が無いとか言って、怒られる。
こいつ、どこにあんねん!(#^ω^)と怒ってたら、ドキュメントに記載されてました。

注: libc++ はシステム ライブラリではありません。libc++_shared.so を使用する場合は、APK 内に含める必要があります。Gradle を使用してアプリをビルドしている場合、この処理は自動的に行われます。

という訳で、ndk の sources/cxx_stl/llvm-libc++/libs/ 下からファイルを引っ張ってきて、apk にバンドルするようにしたら動作するようになりました。

だいたい動くようになったんですが、libtiff の部分で SIGSEGV 起こりまくり。きっと gcc から clang に変更されたので integer 系のサイズが変わったとかなんでしょう。stdint.h とかでカッチリとサイズ指定の integer 宣言してくれていればいいのですが…。
ブログを書いててよかったのは、サイズの違いでSIGSEGVと、苦しんでたんでのを思い出せた事でしょうか。

あわよくば、ndkもメンテできる体制に戻そうと思ったんですが、もうちょいかかりそうです。

2019年9月25日水曜日

遅まきながら Android の permission コードの実装をした。

 レガシーシステムの保守もあるので、なかなかAndroidの新しいpermissionの方法に移行できないでいました。
とあるアプリが、きっかけで、ようやく permission コードを実装する機会を得ました。

参考にしたのは、実行時のパーミッション リクエスト(Runtime Permission) 色々まとめ

たくさん権限が必要な場合、煩わしいので、こんなコードにしました。
import android.Manifest;
import android.content.pm.PackageManager;
// 古い場合
//import android.support.v4.app.ActivityCompat;
//import android.support.v4.content.ContextCompat;
//import android.support.v7.app.AppCompatActivity;
// 新しい場合
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AppCompatActivity;
//
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class FooActivity extends AppCompatActivity {

    public static final int REQUEST_CODE = 1001;
    private static final String [] needPermissions = new String[] {
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.CAMERA,
            Manifest.permission.INTERNET
    };

    /*!
      @brief 許可の得られていない権限を取得する
     */
    ArrayList getNeededPermissions() {
        ArrayList<String> result = new ArrayList<String>();
        for( String s: needPermissions ) {
            if (ContextCompat.checkSelfPermission(this, s) != PackageManager.PERMISSION_GRANTED) {
                result.add(s);
            }
        }
        return result;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_foo);
        ArrayList<String> permissions = getNeededPermissions();
        if( permissions.size() > 0) {
            // パーミッションの許可をリクエスト
            ActivityCompat.requestPermissions(this, permissions.toArray(new String[permissions.size()]), REQUEST_CODE);
        } else {
            // 許可が必要なコード
            processAny();
        }
    }

    // requestPermissionsのコールバック
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE:
                ArrayList<String> needed = getNeededPermissions();
                if( needed.size() > 0 ) {
                    // 必要な権限の許可が足りない
                    Toast.makeText(this, "本アプリを実行するための権限の許可が取れませんでした", Toast.LENGTH_LONG).show();
                    finish();
                } else {
                    // 必要な権限の許可がされた
                    processAny();
                }
                break;
            default:
                break;
        }
    }

    private void processAny() {
      // ...
    }
    
    // ...

}

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>