バックアップのこと

緊急地震速報が発表されるような地震が続いています。
大きめの地震が続くと、東日本大震災が起きたときの大失敗を思い出してしまいます。

Screenshot_20161124-062424

東日本大震災が発生したときは、15時少し前だったので普通に仕事をしていてパソコンも電源が入っている状態でした。
その状態で地震の衝撃をくらってしまったので、データを保管していたハードディスクが故障し、仕事で使っている一部データを喪失してしまいました。

もちろんバックアップを取っていたのですが、その取り方が主に「物理的なハードディスクの故障」に備えるための取り方───「2つのハードディスクが同時に壊れる可能性は低い。故障した場合は、正常に動いている方からデータを取り出せばよい」───で、災害のような事態に適しておらず、結果としてデータの喪失を招いてしまいました。

「地震を乗り切った!」と思ったハードディスクも、1週間ぐらい経ってから壊れ始める…
これが痛かったなぁ(;´д`)トホホ

貴重なデータを失う前に、バックアップを取ることをおすすめします!!

バックアップを取る時のヒントをいくつかご紹介。

  • 物理的に離れた場所に取る

全部のバックアップを一つの場所に置いてしまうと、地震や火災、水害といった災害が発生したとき、すべてのバックアップを失ってしまいます。
クラウドストレージ(Microsoftの『OneDrive』、Googleの『Google Drive』、Amazonの『Amazon Drive』、『Dropbox』など )を活用し、メインの保管場所と物理的に離れた場所にバックアップを置くようにすると、同時にデータを喪失することが防げます。

  • メディアの種類を複数にする

ハードディスクは安価に大容量を保管できますが、衝撃や温度湿度に弱いといった弱点もあります。
この弱点を補いあえる、SSD(Solid State Drive。半導体メモリを使った記憶装置)やほかのメディア(SDカードやUSBメモリ、DVDなどの光学メディア、磁気テープなど)を組み合わせてバックアップを取り、データの安全性を高めます。
たとえば、メインのバックアップにハードディスク、予備のバックアップとしてUSBメモリと組み合わせると、震災のようなハードディスクが壊れやすい事態に対しても、衝撃に強いUSBメモリからデータを取り出すことができる可能性が高まります。

  • 複数個のバックアップを取る

管理とメディアの費用を考えなければ、バックアップの本数は多ければ多いほど安全です。
ただ、予算・置き場所にも限界があるので、通常のデータは3つ程度、最重要データはそれ以上の本数のバックアップといった感じで準備すればよいと思います。
バックアップの取り方を少し工夫し、1日前、2日前、3日前…というように『世代管理』を行うようにすると、データを戻せるタイミングが増え、いざその時がきた時にどの時点までさかのぼるか選ぶことができるのでお勧めです(必要な費用も増えます)。

バックアップを取るときは、紛失や盗難に備えて『暗号化』などの対策を施しておくことも必要になります。

バックアップは、通常であれば使うことのないデータなのでそれを取る作業は非常に面倒に思えるのですが、一連の作業を自動で行ってくれるソフトウェアなどもあります。それらを用いて仕組みを作ってしまうと、自動化や習慣化を図ることができ、それほど手間に思わずバックアップを取ることができます。

災害だけでなく気温の低い冬期は、ハードディスクに負荷がかかり、寿命を縮めたり、故障を招いたりしやすくなる傾向があります。(低温時の動作、暖房による温度変化、温度変化にともなう結露が危ないようです。)

データの重要度や種類、量に応じて、必要なバックアップを取りましょう!

壊れたハードディスクからデータを救い出すことも不可能ではないのですが、完全な復旧復元は難しく、できたとしてもかなり高額な費用がかかります。
子供や家族の写真など二度と撮ることができないデータは、バックアップと紙に印刷することをおすすめします。

とりあえず、今回の地震をうけて、プログラマの私にとって最重要データであるソースコード一式のバックアップを、2つのハードディスク、1つのSSD、USBメモリ/SDカード(緊急時の持ち出し用)、そしてクラウドに取りました。
このデータを使うことがないといいなぁー

カテゴリー: 地震関連, 技術的なメモ, 日々 | タグ: , , | コメントする

地震が起きたときの通知

朝方、大きめの地震が起きました。
ガラケーからスマホに変えるとき、「緊急地震速報はどうなるんだろう?」と疑問に思っていたのですが、今回の地震発生時に端末ごとに違いがわかったのでまとめました。

  • Xperia Z5 Compact (Android 6.0 / NTT DoCoMo)の場合

Screenshot_20161122-064410

さすがドコモ!
ガラケーのときと同じように通知がされてきました。

通知領域に見慣れないアイコンがあったので、チェックしてみると…
『緊急省電力モード』への移行を促す画面が表示されました。

Screenshot_20161122-064504

『緊急省電力モード』へ移行する(有効にする)と、再起動がはじまります。

再起動後は、メニュー画面などが電力を消費しにくいシンプルな表示となり、使えるアプリも制約されるようです。

Screenshot_20161122-080328

東日本大震災のときは広範囲で停電が発生し、先がどうなるかわからないなか、バッテリーの節約をしていた記憶があります。
自動的に移行を促す通知がされるのは便利ですね。
(Xperia Z5 Compactの前に使っていたXperia ZL2にもこの機能が備わっていました。)

『緊急省電力モード』は、電源ボタンの長押しで表示されるメニュー、設定画面の「バッテリー」(Android 6.0)から切り替えることができます。

Screenshot_20161122-080541

「緊急省電力モード」をタップすると、モードを有効化をするためのダイアログが表示されます。

詳しくはソニーモバイルのwebサイト「災害などの緊急時にバッテリーを長持ちさせるには?』( http://www.sonymobile.co.jp/myxperia/howtoxperia/basic/function27.html )に詳しく書かれています。

製品のマニュアルもDoCoMoのwebサイトからダウンロードできます。

MVNO回線では緊急地震速報が通知されるのか?

  • iPhone SE (iOS 10.1.1 / UQ Mobile)の場合

緊急速報として通知がきました。
Yahoo!の防災速報のほうが早かったのはご愛敬ということで(^-^;

IMG_1459

  • KATANA 02 (Windows 10 Mobile / FREETEL)の場合

なにも通知がきていないようです。

wp_ss_20161122_0001

通知がこない!?Σ(゚д゚lll)

マイクロソフトのwebサイトで調べてみると『緊急通知』( https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn757560(v=vs.85).aspx )に記述がありました。

日本で販売されるデバイスでは、パートナーは、通信事業者のネットワークでサポートされている場合、Earthquake & Tsunami Warning System (ETWS) を有効にすることができます。

OSとして機能は実装されているけれど、端末と契約しているキャリア(通信事業者)が対応していないとダメなようです。

では、「キャリアでは通知サービスがあるのか?」とFREETELのwebサイト(『緊急地震速報に対応している端末はありますか。』)を調べてみると…

Q: 緊急地震速報に対応している端末はありますか。

A: 対応している端末はございません。
ご自身で緊急地震速報通知アプリなどをインストールしていただきご利用ください。

と書いてありました。

工エエェェ(´д`)ェェエエ工

Windows 10 Mobileユーザ、FREETLユーザの方は、いざというときに備えて、なんらかの対策を講じておいた方がよさそうです。

カテゴリー: 地震関連, 技術的なメモ, 日々 | タグ: , , , , | コメントする

ヤマト運輸 送り状発行ソフトB2 (Ver. 6)の引っ越し

パソコンの入れ替えにともない、ヤマト運輸の送り状発行ソフト『B2』 (Ver. 6.xx)を引っ越しした際のメモです。

B2は移行手順がややこしく、すぐにサポートセンターに連絡しろ的なメッセージが表示されてしまうB2ですが、手元にB2を使える環境(通常、現在使用中のパソコン)があれば以下の手順を踏むことでサポートセンターへの連絡なしに移行作業を行えます。
作業を開始する前に、ヤマト運輸の送り状発行ソフトを利用するためのユーザIDとパスワードを確認しておいた方がスムーズに作業を進められます。

古いパソコン(現在使用中のパソコン)での作業

  1. B2を起動します。
  2. メインメニューの「システム管理」ボタンを押します。
  3. システム管理メニューの「データバックアップ/リロード」ボタンを押します。
  4. 「バックアップ」ボタンを押します。
  5. バックアップのフォルダ指定ダイアログが表示されたら、バックアップファイルを保存する場所を指定します。
    (通常、USBメモリや外付けのハードディスクなどを指定します)
  6. フォルダ指定ダイアログのOKボタンを押すと、バックアップが開始されます。
    そのまま完了を待ちます。
  7. バックアップが完了したら、メインメニューまで戻ります。
  8. メインメニューの「再ダウンロード許可設定」を押します。
  9. 現在ログインしているユーザの情報や警告が表示されます。
  10. 「再ダウンロード」を押します。
  11. メインメニューに戻り、B2を終了します。

※データのバックアップについては、ヤマト運輸が提供するオンラインマニュアル「パソコンが壊れた時の為にデータをバックアップしたい」が参考になります。

新しいパソコンでの作業

  1. ヤマト運輸のB2のダウンロードサイト ( http://b2start.jp/b2pro/service?_T=aa01 )にアクセスします。
  2. 規約内容を読み、「規約に同意する」ボタンを押します。
  3. ユーザIDとパスワードを入力し、「確認」ボタンを押します。
  4. 「ダウンロード」ボタンを押すと、B2インストーラのダウンロードがはじまります。
  5. B2のインストーラを起動し、B2をインストールします。
    ※新しいパソコンがWindows 10の場合は、「ヤマト運輸 送り状発行ソフトB2 (Ver. 6)をWindows 10にインストールする方法」をご覧ください。
  6. B2を起動し、初回起動時に実行される「初期設定ウィザード」で必要な情報を設定します。
    「1日あたりの予定出荷個数」は利用状況に応じて、「プリンタ設定」は新しいパソコンのプリンタ環境に応じて設定します。
    「データ移行」については、「データ移行しない」グループの「新規インストール」をチェックします。
    「動作モード」と「データ保持期間」については、利用状況利用ポリシーにもとづいて設定します。
    ※ヤマト運輸が提供するオンラインマニュアル「初回起動時の設定について」が参考になります。
  7. B2が起動しメインメニューが表示されるのを待ちます。
    (B2の自動更新が実行される場合があります)
  8. メインメニューの「システム管理」ボタンを押します。
  9. システム管理メニューの「データバックアップ/リロード」ボタンを押します。
  10. 「リロード」ボタンを押します。
  11. リロード元のファイル指定ダイアログが表示されたら、古いパソコンでバックアップしたファイルを指定します。
  12. ファイル指定ダイアログの「開く」ボタンを押すと、確認ダイアログが表示され「はい」ボタンを押すと、リロードが開始されます。
    そのまま完了を待ちます。
  13. リロードが完了したら、B2を終了し、B2を再度立ち上げます。

※バックアップのリロードについては、ヤマト運輸が提供するオンラインマニュアル「バックアップしたデータをリロード(復元)したい」が参考になります。

何度かユーザIDがロックされた状態に遭遇し、今日もまたロック状態に突入…!?というところでB2のサポートセンターに電話をしたのですが、その際「いますぐ解除するか、それとも別のタイミングで作業を行いたいか?」と尋ねられ、別のタイミングで…と答えた結果、自分で移行をするための手順を教えてもらいました。

「古い環境でB2のロック状態を解除し新しい環境でB2にログインすると、古い環境のB2は使えなくなる」とされていますが、今日試した範囲だと、データの移行に失敗している箇所があった(外付けのHDDのファイルシステムに問題が起きた)ので古い環境に戻ったら、古い環境のB2でもログインできてしまったんですよね。
気のせいということにします(^-^;

カテゴリー: Windows, 技術的なメモ, 日々 | 1件のコメント

ヤマト運輸 送り状発行ソフトB2 (Ver. 6)をWindows 10にインストールする方法

ヤマト運輸の送り状発行ソフト『B2』 (Ver. 6.xx)をWindows 10にインストールした際のメモです。

※B2環境の移行を行いたい場合は、「ヤマト運輸 送り状発行ソフトB2 (Ver. 6)の引っ越し」をご覧ください。(サポートセンターに連絡することなく移行するための手順をまとめました。)

ヤマト運輸のwebサイトからダウンロードしたインストーラをWindows 10で実行すると、次のようなダイアログが表示され、その先の手順に進むことができません。
(B2 Ver. 7の場合、Windows 10を含むWindows 8/8.1以降のWindowsにインストールできるようです。)

image

以下の設定を行うことで、Windows 10にインストールすることができるようになります。

  1. ダウンロードしたB2のインストーラ(B2Setup.exe)を右クリックする。
  2. 右クリックメニューより「プロパティ」を選択し、ダイアログを開く。
  3. ダイアログの「互換性」タブを開く。
  4. 「互換モードでこのプログラムを実行する」をチェックする。image
  5. ドロップダウンリストより「Windows 7」を選択する。
  6. OKボタンを押し、ダイアログを閉じる。
  7. B2のインストーラをダブルクリックし、インストール実行。

途中、Windowsの互換性に関する警告が表示されますが、そのまま続行するとインストール自体は完了します。(B2に含まれるSQL Server 2005などが導入される時点で表示されるようです。)

インストール完了後、B2を起動すると、初回起動時の設定ウィザードが始まります。

カテゴリー: Windows, 技術的なメモ, 日々 | 1件のコメント

SONY SmartBand 2 SWR12で集めた心拍数データをJava APIで取得する

SONYのSmartBand 2 SWR12で収集した心拍数データを、APIを使って自分のプログラムに取り込む方法を実装してみました。

まず、SONYはウェアラブルデバイスで収集した情報をLifelogというアプリで簡単に見ることができるようになっています。
最近のSONYは仕様をオープンにする傾向があり、LifelogもLifelog APIというAPI経由で蓄積したデータに簡単にアクセスできるようになっています。

しかし、ここから先、「どうしてここまでやっているのに、これができないんだ!?」というソニー仕様の残念なところが顔を出してきます。

Lifelog APIから扱えるデータの種類は限定されます。
スマホのLifelogアプリで見えているデータのうち、ごくごく一部のデータしかLifelog APIでは扱うことができません。
極端に言えば、Lifelog APIから取れるデータは、「寝てるか起きているか程度しか取れない」と言っても差支えがないと思います。

残りはどこから持ってくれば良いのかというと、Google Fitを使えということらしいです。
Use SmartBand 2 sensor data for innovative Android and iOS applications』あたりを見ると、投げやり感が半端ないです。

Google Fitを使えばよいことはわかったのですが、SWR12で集めたデータをGoogle Fitから具体的にどのように持ってくれば良いのか、SonyにもGoogleにも十分な資料がないのですよね…。
ネット上の情報を検索しても、見つかるサンプルがAndroid専用のものだったり、端折って書かれているクラスのFQCNがわからなかったりと、一筋縄ではいかないようです。

実行前に準備するもの

  • SONY SmartBand2 SWR12
  • スマホ (今回はAndroid、Xperia Z5 Compactを使用)
  • スマホアプリ Lifelog / SmartBand2 (Android)
  • スマホアプリ Google Fit (Android)
  • Googleのアカウント
  • SWR12とスマホをペアリングし、Lifelogアプリからデータが閲覧できる状態まで設定します。

    Lifelogアプリから見られるようになっても、Google Fitにデータは送られていません。
    Google Fitでもデータが見られるようにするためには、SmartBand 2アプリの設定を行う必要があります。

    Screenshot_20161113-132549

     

    アプリの設定を開き、「Google Fit」をタップします。

    Screenshot_20161113-132556

    設定画面のスイッチをONに設定します。

    これで、Google Fitにもデータが送られるようになります。
    と言いたいところですが、実際にはバックグラウンドで勝手に送信されることなく、Google Fitのアプリを起動したタイミングでデータが送信されているっぽいです。

    この設定作業が、心拍数データを自前のプログラムで扱うための最大のキーポイントです!!

    Googleの設定

  • OAuth 2.0のクライアントID
  • Google Fit APIの有効化
  • Googleのサービスを使うための認証情報が必要になります。
    認証情報は、GoogleのAPI Consoleから作成でき、「OAuth クライアントID」形式で作成します。
    認証情報の作成に成功したら、クライアントIDとクライアントシークレットをJSON形式でダウンロードします。

    API ConsoleからAPIの有効化を行います。
    API Console左側から「ライブラリ」を選択するとAPI/サービスの一覧が表示されるので、「Fitness API」を選択(見つからない場合は検索すればOKです)。
    「▶有効にする」をクリックすれば、APIが有効化されます。

    プログラムの準備

    必要なライブラリは、以下の2つです。

  • API Client Library for Java (https://github.com/google/google-api-java-client)
  • Fitness Client Library for Java ( https://developers.google.com/api-client-library/java/apis/fitness/v1 )
  • ライブラリに同梱されている説明に基づきJava SEで実行するために必要なJARファイルのみを抽出して使用しています。

    実行環境は、Java SE 8u111/Windows 10 Pro 1607の組み合わせです。
    特に変わったこともしていないので、Java SE 8よりも前のバージョン、Windows以外のプラットフォームでも問題なく動くと思います。

    GoogleのAPI Consoleより取得しダウンロードしたJSON形式の認証情報をJavaのクラスパスから参照できる場所に配置し実行をします。
    ブラウザが起動しGoogleの認証が実行がはじまります。(一度許可を与えると認証情報がファイルに保存され、有効期間内は認証画面の表示なく実行されます)
    認証画面の「許可」ボタンを押すと、最近24時間分くらいの心拍数データの取得を試み、成功すると標準出力(コンソール)に値が一覧表示されます。

    必要なもの:

    Java SE Development Kit 8 あればEclipseなどのIDE環境

    ダウンロード:

    GoogleFitAPITest.zip

    ライセンス:

    NYSL

     

    
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.security.GeneralSecurityException;
    import java.time.OffsetDateTime;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.google.api.client.auth.oauth2.Credential;
    import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
    import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
    import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
    import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.client.util.DateTime;
    import com.google.api.client.util.store.FileDataStoreFactory;
    import com.google.api.services.fitness.Fitness;
    import com.google.api.services.fitness.Fitness.Users;
    import com.google.api.services.fitness.Fitness.Users.DataSources;
    import com.google.api.services.fitness.Fitness.Users.DataSources.Datasets;
    import com.google.api.services.fitness.FitnessScopes;
    import com.google.api.services.fitness.model.DataPoint;
    import com.google.api.services.fitness.model.DataSource;
    import com.google.api.services.fitness.model.ListDataSourcesResponse;
    import com.google.api.services.fitness.model.Value;
    
    /**
     * 	Google Fit APIで心拍データを取得するサンプルプログラム<br>
     * 
     *	<ul>
     * 		<li>SONY SmartBand 2 SWR12を用いて心拍データの取得を行うとする場合、
     * 		SmartBand 2アプリの設定でGoogleFitをONに設定すること。</li>
     * 
     * 		<li>Google API Consoleで認証情報(OAuth 2.0 クライアントID)の取得を行うこと。<br>
     * 			また、認証情報はJSON形式でダウンロードし、Javaの実行環境から見える適当な位置に配置すること。</li>
     * 
     * 		<li>Google API Manager/API ConsoleでFitness APIを有効化しておくこと。</li>
     *	</ul>
     * 
     * 	<dl>
     * 		<dt>必要なライブラリ:</dt>
     * 		<dd>API Client Library for Java	( https://github.com/google/google-api-java-client )</dd>
     * 		<dd>Fitness Client Library for Java ( https://developers.google.com/api-client-library/java/apis/fitness/v1 )</dd>
     *	</dl>
     *
     *	<br>
     * 	<dl>
     * 		<dt>Lisense:</dt>
     * 		<dd>This software is distributed under the license of NYSL.<br>
     * 			( http://www.kmonos.net/nysl/ )</dd>
     * 	</dl>
     * 
     * @author makoto
     *
     */
    public class GoogleFitAPITest {
    
    	/**
    	 * テストの実行
    	 * 
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		
    		try {
    			
    			GoogleFitAPITest test = new GoogleFitAPITest();
    			Credential credential = test.authorize();
    			test.build(credential);
    			
    			List<DataSource>sourceList = test.getDataSources();
    			List<DataSource>heartRateSourceList = test.filter(sourceList, HEART_RATE_BPM); 
    			
    			for (DataSource source:heartRateSourceList) {
    				
    				OffsetDateTime end = OffsetDateTime.now();
    				OffsetDateTime start = end.minusDays(1);
    				
    				test.showData(source.getDataStreamId(), start, end);
    			}
    			
    		} catch (IOException | GeneralSecurityException e) {
    			e.printStackTrace();
    		}
    
    	}
        
    	/**
    	 * Google Fitのパブリックデータタイプで定義された心拍数
    	 */
    	private static final String HEART_RATE_BPM = "com.google.heart_rate.bpm";
    	
    	/**
    	 * Google FitのユーザID
    	 */
    	private static final String USER_ID = "me";
    	
    	/**
    	 * スレッドセーフなHTTPトランスポート
    	 */
    	private HttpTransport httpTransport;
    	/**
    	 * JSONを扱うためのファクトリ
    	 */
    	private JsonFactory jsonFactory;
    	
    	/**
    	 * Google Fitサービスのインスタンス 
    	 */
    	private Fitness fitness;
    	
    	/**
    	 *	GoogleのOAuth 2.0認証情報の格納先<br>
    	 *	《メモ》
    	 *		OSユーザのホームディレクトリ直下にディレクトリ「sony_sbr12_auth」が作成される
    	 */
    	private File AUTH_STORE_PATH = new File(System.getProperty("user.home"), "sony_sbr12_auth");
    	
    	
    	
    	/**
    	 * コンストラクタ
    	 * 
    	 * @throws IOException
    	 * @throws GeneralSecurityException
    	 */
    	private GoogleFitAPITest() throws IOException, GeneralSecurityException {
    		
    		httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    		jsonFactory = JacksonFactory.getDefaultInstance();
    	}
    	
    	/**
    	 * OAuth 2.0認証の実行<br>
    	 * 
    	 * @return
    	 * @throws IOException
    	 * @throws GeneralSecurityException
    	 */
    	private Credential authorize() throws IOException, GeneralSecurityException {
    		
    		// Google API Consoleから取得したClient ID/Client Secretを読み込む
    		InputStream in = GoogleFitAPITest.class.getResourceAsStream("/client_id.json");
    		GoogleClientSecrets secrets = GoogleClientSecrets.load(jsonFactory, new InputStreamReader(in));
    		
    		// GoogleのOAuth 2.0認証用のFlowを生成
    		// 認証する権限は、Google Fitのすべての項目
    		// 認証した結果はファイルに保存
    		GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, secrets,
    				FitnessScopes.all())
    				.setDataStoreFactory(new FileDataStoreFactory(AUTH_STORE_PATH))
    				.build();
    		
    		// 認証を行っていない、または無効な場合、ブラウザが立ち上がり認証を求められる
    		//	《メモ》
    		//	非GUI環境では実行できないようだ
    		Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    		
    		return credential; 
    	}
    	
    	/**
    	 * Google Fitサービスのインスタンス生成
    	 * 
    	 * @param credential	OAuth 2.0認証情報
    	 * @throws IOException
    	 */
    	private void build(Credential credential) throws IOException {
    		
    		// 《メモ》
    		// 最低限のパラメータでもアクセスが可能
    		// 読み込みしか行っていないためか、Application Nameも不要だった
    		fitness = new Fitness.Builder(httpTransport, jsonFactory, credential)
    				.build();
    	}
    
    	/**
    	 * Google Fitに登録されているデータソースの取得
    	 * 
    	 * @return	
    	 * @throws IOException
    	 */
    	private List<DataSource> getDataSources() throws IOException {
    		
    		DataSources sources = fitness.users().dataSources();
    		Users.DataSources.List l = sources.list(USER_ID);
    		ListDataSourcesResponse list = l.execute();
    		
    		return list.getDataSource();
    		
    	}
    	
    	/**
    	 * データソースのコレクションから指定したデータタイプに一致するリストの抽出
    	 * 
    	 * @param sourceList	Google Fitから取得したデータソース
    	 * @param dataType	データタイプ名(例: com.google.heart_rate.bpm)
    	 * @return
    	 */
    	private List<DataSource>filter(List<DataSource>sourceList, String dataType) {
    		
    		List<DataSource>l = new ArrayList<>();
    		
    		for (DataSource source:sourceList) {
    			if (source.getDataType().getName().equals(dataType)) {
    				l.add(source);
    			}
    		}
    		
    		return l;
    	}
    	
    	/**
    	 * 	指定データソース・指定期間のデータを取得し、標準出力に表示する
    	 * 
    	 * @param dataSourceId	データソースID
    	 * @param start	開始日時
    	 * @param end	終了日時
    	 * @throws IOException
    	 */
    	private void showData(String dataSourceId, OffsetDateTime start, OffsetDateTime end) throws IOException {
    		
    		// 開始日時・終了日時をナノ秒表記に変換
    		String startText = String.valueOf(toNanos(start));
    		String endText = String.valueOf(toNanos(end));
    		// 開始日時・終了日時を組み合わせたものをデータセットIDとする
    		String datasetId = startText + "-" + endText;
    
    		System.out.println("<BOD:\t data-source-id[" + dataSourceId + "], dataset-id[" + datasetId + "]>");
    		
    		// Google Fitに問い合わせ
    		Datasets.Get cmd = fitness.users().dataSources().datasets().get(USER_ID, dataSourceId, datasetId);
    		com.google.api.services.fitness.model.Dataset dataset = cmd.execute();
    		
    		// 取得したデータを一覧表示
    		for (DataPoint dp:dataset.getPoint()) {
    			// ナノ秒をミリ秒に変換
    			DateTime dt = new DateTime(toMilliseconds(dp.getStartTimeNanos()));
    			// 有効なデータが存在しな場合は、ダミーデータを生成
    			Value v = (dp.getValue().size() == 0) ? new Value() : dp.getValue().get(0);
    			
    			System.out.println(dt + "=>" + v.getFpVal());
    		}
    		
    		System.out.println("<EOD:\t data-source-id[" + dataSourceId + "], dataset-id[" + datasetId + "]>");
    	}
    	
    	/**
    	 * 	OffsetDateTimeをナノ秒表現に変換
    	 * 
    	 * @param time
    	 * @return
    	 */
    	private static long toNanos(OffsetDateTime time) {
    		return (time.toEpochSecond() * 1000000000L) + time.getNano();
    	}
    	
    	/**
    	 * 	ナノ秒をミリ秒に変換
    	 * 
    	 * @param nanos
    	 * @return
    	 */
    	private static long toMilliseconds(long nanos) {
    		return nanos / 1000000L;
    	}
    }
    
    

     

    プログラムの実行結果

    image

     

    今回、心拍数データが取れるところまではできましたが、Lifelogアプリにはストレス状態などの情報も表示されています。
    アプリからみると過去分に遡及して見ることが可能なので、どこかにこれらのデータが格納されていることは間違いないと思います。
    次は、これらのデータをどうにかして取られないか試してみようと思います。

    カテゴリー: Java, コードスニペット, 技術的なメモ | タグ: , , , , , , , | コメントする

    Excelのアクティブプリンタをプログラムで設定する方法

    Excelのアクティブプリンタをプログラムで設定できるようにしようとしたときのメモです。

    最初は、どの環境でも「Microsoft XPS Document Writer」をアクティブプリンタに切り替えて処理を行えるようにしたかっただけなのですが、なにやら面倒なことになってしまい、途中で「INIファイルで設定をできるようにすればよかったかなー」と思ったものの、いちおう最後まで仕上げることができました。


    Windows 8/8.1以降のOSで、WMIを使いプリンタのポート名を取得しようとすると「PORTPROMPT:」と返ってきて、実際のポート名がわからないことがあります。

    WMI経由でプリンタ情報を表示するプログラム:

    ' This software is distributed under the license of NYSL.
    ' ( http://www.kmonos.net/nysl/ )
    
        Public Sub PrintPrinterInfo()
    
            ' WMIにプリンタ情報(Win32_Printer)を問い合わせる
            Dim mos = New System.Management.ManagementObjectSearcher("select * from Win32_Printer")
    
            ' 取得した結果を一覧表示する
            For Each mo As Management.ManagementObject In mos.Get
                Debug.Print(mo.Item("Name") & "=>" & mo.Item("PortName"))
            Next
    
            mos.Dispose()
    
        End Sub
    
    

    上記プログラムの実行結果:

    Send To OneNote 2013=>nul:
    Microsoft XPS Document Writer=>PORTPROMPT:
    Microsoft Print to PDF=>PORTPROMPT:
    Fax=>SHRFAX:
    

    「Microsoft XPS Document Writer」「Microsoft Print to PDF」のポート名が、「PORTPROMPT:」になっています。

    この情報をもとに「《プリンタ名》 on 《ポート名》」という形式を組み立て、たとえばExcel VBAのApplication.ActivePrinterプロパティに設定しようとすると、設定が反映されなかったり、エラーが発生したりして期待通りに動かないことがあります。
    (資料によってはポート名が省略できる旨が記載されているものもありますが、プリンタによってはポート名まで指定しないと設定が完了しないようです。)
    どうやら、Application.ActivePrinterプロパティでは、実際のポート名を設定しないとダメみたいです。

    そこで、実際のポート名を取得するルーチンを作ってみました。

    このルーチンを呼び出すと、プリンタ名とポート名をレジストリから取得しTupleに格納、Listに詰めて返します。

    レジストリからでプリンタ・ポート情報を取得するプログラム:

    ' This software is distributed under the license of NYSL
    ' ( http://www.kmonos.net/nysl/ )
    
        ''' 
        ''' 登録されているプリンタとポートの一覧を取得する
        ''' 
        ''' 最初の要素にプリンタの名前、2番目の要素にポートの名前を格納したTupleのリスト
        Public Function GetPrinterAndPortList() As List(Of Tuple(Of String, String))
    
            Dim l As New List(Of Tuple(Of String, String))
    
            ' HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devicesからプリンタとポートの一覧を取得
            Dim rkDevices As Microsoft.Win32.RegistryKey =
                Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devices", False)
    
            ' サブキーが見つからない場合、空のListを返し終了
            If rkDevices Is Nothing Then
                Return l
            End If
    
            ' 取得したサブキーから名前(プリンタ名)を順に走査し、レジストリ値を取得する
            For Each name In rkDevices.GetValueNames
                Dim value As String = rkDevices.GetValue(name)
                ' レジストリ値を区切り文字(",")で分割、2番目の要素がポート名
                Dim tokens = value.Split(",")
                ' タプルを作成し、リストに詰める
                l.Add(New Tuple(Of String, String)(name, tokens(1)))
            Next
    
            Return l
    
        End Function
    

    取得した情報から適当なプリンタ名とポート番号を組み合わせて、「《プリンタ名》 on 《ポート名》」形式に整形し、Application.ActivePrinterプロパティに設定したところ、期待した通りの動作をするようになりました。

    カテゴリー: Windows, コードスニペット, 技術的なメモ | タグ: , , , | コメントする

    コンピュータシステムの暦のこと

    天皇陛下の生前退位について議論がはじまりました。

    政府、平成30年譲位を視野…特例法を軸に検討(読売新聞) – Yahoo!ニュース

    政府は、現在の天皇陛下に限って退位を可能にするため、皇室典範の特例法制定を軸に検 – Yahoo!ニュース(読売新聞)

    出典: http://headlines.yahoo.co.jp/hl?a=20161017-00050157-yom-pol

    政府の方針は特例法での譲位を検討しているようですが、報道されている内容を見る限りでは「平成30年」に今上陛下が退位し皇太子殿下が即位する流れになりそうです。

    システム開発的には、皇太子殿下が即位をした日をもって発生すると見込まれる改元。─── 現在の『平成』という元号から新しい元号に変わることが、システムに影響を与える可能性がありそうだと危惧しています。

    日本のコンピュータシステムにおいて日付の扱いは少し特異で「西暦」と「和暦」の2つの暦を扱います。
    たとえば、データの入力や表記(印字)は「和暦」で、データの保管は「西暦」で、処理では必要に応じて「西暦で入力されたデータを和暦で表示する場合…」「和暦で入力されたデータを西暦で保管する場合…」といった変換処理を行っています。
    この処理を「和暦・西暦変換」や「和暦変換」(主に表記の変換)、「元号変換」(主に”年”の変換)と呼びます。

    改元が発生した場合、この変換処理が正しく行われるか確認を行う必要があります。
    また、不具合を発見した場合システムの修正作業を行う必要も生じます。

    和暦・西暦変換処理は、大きくわけて3つのパターンで実装されています。

    1. 元号マスタで変換をしている
      システムの中に「元号マスタ」と呼ばれる「この元号は何年何月何日から何年何月何日までである」といった定義を行っているシステムがあります。
      (「マスタ」 とは、「台帳」と呼ばれることもある、大元のデータを記したファイルまたはデータベースのことです。)

      たとえば、下表のような感じです。

      元号 開始日 終了日
      昭和 1926/12/25 1989/01/07
      平成 1989/01/08

      システムがこの方法で元号変換を行っている場合、改元の日が確定した段階で、現在の「平成」の終了日を設定し、元号マスタに新しいデータ(レコード)を追加するだけで改元対応が完了します。

      システムの機能として設定画面が用意されているか、あるいは技術者を呼んで設定を行う必要があるのかを確認しましょう。

    2. ライブラリで変換をしている
      プログラミング言語や開発環境が提供しているライブラリ(便利なプログラムの集合体)に含まれる変換ルーチンを利用し、処理を行っているシステムがあります。
      一般的に、そのライブラリを供給しているソフトウェアベンダ(開発・販売元)が、新しい元号に対応した修正版プログラムが提供されることが見込まれます。

      ただし、下記のような場合は注意が必要です。

      • ソフトウェアのサポート期間(契約)が終了している
      • ソフトウェアを開発したベンダ(メーカー)が倒産や合併などで存在しない

      古いWindows、あるいはAccessやExcelといったOfficeを、基盤またはシステムの一部として組み込んでいる場合、修正版のプログラムが提供される可能性はほとんどないと思われます。
      また、修正版プログラムが提供される場合でも、修正版の提供時期によっては自社のシステム・業務に影響が出る可能性があります。
      提供された修正版が自社のシステムに適合するか事前に確認を行っておく必要もあります。

      自社のシステムを構築した業者に、対応予定を確認をしましょう。

    3. 独自の変換ルーチン(プログラム)で変換をしている
      元号マスタやライブラリに依存せず、すべてを自前のプログラムで処理しているケースもあります。
      日付は、8桁の数値として見ることもできる(例: “2016/10/18” → 20161018)ので、単純な条件判定文の集合体で処理をすることも可能です。
      ライブラリが充実していなかった比較的古い時期に実装されたプログラムでは、 このような実装を行っているケースがあります。

      if (YYYYMMDD >= 19261225 && YYYYMMDD <= 19890107) {
      // 昭和の処理
      } else if (YYYYMMDD >= 19890108) {
      // 平成の処理
      } else {
      // 未知の元号なのでエラー処理
      }
      
      // 処理前提: 昭和より前のデータは入ってこない。入ってきたら破綻。
      if (YYYYMMDD <= 19890107) {
      // 昭和の処理
      } else {
      // 平成の処理
      }
      

      この場合、人によってプログラムの書き方がまちまちで、「元号ごとに日付の範囲をきちんと書く人」や「昭和とそれ以外で分けてしまう人」などがシステムの中でごちゃごちゃになって使われていることがよく見られます。
      また、システムの中でどのくらい独自の変換ルーチンを使用・依存している箇所が存在するのか、修正した場合どのような影響が発生するのか、すべて調査を行った上で修正を行う必要があります。

      「比較的古い時期に実装されたプログラム」と前述しましたが…
      実はコレ、割と最近書かれたJavaScriptでもときどき見かけます。「うちは去年作ったシステムだから関係ないな」とせず、一度確認されることをおすすめします。

      自社のシステムを構築した業者に、対応を相談しましょう。

    4. その他
      比較的最近構築されたシステムでは、入力・表記は和暦。データの格納は西暦というパターンがほとんどだと思います。
      しかし、まれに昭和期に構築されたシステムで、「昭和nn年」といった昭和形式でデータの格納をしているシステムがあります。
      このようなシステムの場合、既に平成対応(「nn-63」で昭和を平成に変換)が施されている可能性が高く、新しい元号にどのような修正を施せばよいのか、過去に蓄積されたデータ変換を行う必要があるのか、十分な調査と対策の検討を行う必要があります。
      平成30年に見込まれる改元を平成対応と同様の対応で乗り切った場合、「昭和100年問題」と呼ばれる問題をはらんでいる可能性が非常に高く、2025年時点でシステム上でデータの取り扱いができなくなる可能性があります。

      システムの再構築を含めた対応計画を立てる必要があります。

    いずれのパターンでも、事前に「改元が発生したときにどのような問題が起きるのか」調査を行い、必要な対策を講じておく必要があります。
    コンピュータのプログラムは自然治癒的に治る可能性はありませんし、環境の変化に合わせて自動的にプログラムが適合をしていく機能も備わっていないので、技術者が介入した対応は不可欠です。

    また、システムの修正作業は、簡単に短時間で終わるものではなく、調査・調査・調査・調査・修正・確認・確認・確認・確認・確認・確認…と、非常に時間がかかる作業です。
    2000年問題のときも同様の現象が起きましたが、これから先、改元の時期が確定していくにつれ、調査・対応作業の需要が急増し、技術者の確保が難しくなることが予想されます。
    パターン3とパターン4については、調査・修正量が多くなること、そのプログラム・技術を理解し修正できる技術者の確保が不可欠であることの2点から、特に対策に時間を要します。

    2000年問題のように「コンピュータシステムがある日突然まったく動かなくなる(可能性がある)」といった致命的な問題は起きにくいと思いますが、なんらかの影響・問題が起きてからの対応では遅いことも…。
    できるだけ早い時期から調査と対応の計画をおすすめします。

    RIALAB.では、「プログラマと連絡が取れなくなった」「開発した会社がなくなってしまった」システムの改造・改修なども承っております。詳しくは、サービス・製品をご覧ください。

    カテゴリー: RIALAB., システム開発, 日々, 製品/サービス | タグ: , , , | コメントする

    VB .NETでPULSENSE(PS-100)から心拍数データを取得する

    自分の死活確認を外部から行えるようにしたいと思い、ウェアラブルデバイスをいじり始めました。
    いじりはじめたデバイスのひとつが、エプソンの『PULSENSE』。
    ただ、PULSENSEのwebサイトの開発者向け情報を見ると「商品化を前提とした法人格を有する組織が守秘義務契約を結んだら情報提供をする」的なことが書いてあり、購買欲は一気にしぼんでしまいました。
    が、「Heart Rate Profileに準拠」とも書いてあり、デバイス自体は制御できそうです。
    インターネットで検索をしても「つながった」という情報があまり見つからない(Heart Rate Profile準拠のアプリでの接続事例が大半)のですが、イトーヨーカドーのネットショップで普及モデルのPS-100が非常に安く売っていたので、ダメもとで購入してみました。

    結論としては、PULSENSEから心拍数データが取得できました。

    無題

    今回は、Windows上でペアリングを行った状態で、データの取得のみを自前のプログラムで行っています。
    プログラムから自動的にペアリングが可能かどうかは今後の検証していく予定です。

    まず、必要なものから。

    • Windows 8.1以降のWindows
    • Visual Studio

    Visual Studioを起動し、適当なプロジェクト(Windowsフォームアプリケーションかコンソールアプリケーションあたりが良いと思います)を作成します。

    作成したプロジェクトを閉じて、プロジェクトが格納されている場所にある、拡張子が.vbprojのファイルをテキストエディタで開きます。

    開いたらTargetFrameworkVersionタグを検索して、その上あたりに以下の一行を追加します。

    <TargetPlatformVersion>8.1</TargetPlatformVersion>

    無題2

    追加したら、Visual Studioでプロジェクトを開きます。

    プロジェクトが開いたら、ソリューションエクスプローラで「参照」を右クリックし、メニューの「参照の追加」を選びます。

    参照マネージャが開いたら、左側のツリーリストから「Windows 8.1」-「コア」を選択します。
    一覧表示された「Windows」をチェックします。

    無題3

    続けて、参照ボタンを押し、アセンブリの参照を追加します。追加するのは以下の2つです。

    • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\Facades\System.Runtime.dll
    • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5.1\System.Runtime.WindowsRuntime.dll

    無題4

    (アセンブリの場所は環境に合わせて適宜調整してください。厳密には検証していませんが、バージョン番号は4.5.1以降ならば大丈夫そうな感じがします。)
    アセンブリの参照を追加をしたら、それぞれチェックを行い、OKボタンを押します。

    この時、「”Windows”への参照を追加できませんでした。コンポーネント’Windows’への参照は、プロジェクトに既に存在します。」といったエラーメッセージが表示されることがありますが、無視してしまっても大丈夫なようです。

    image

    また、アセンブリ参照が正しく追加されたはずのなのにソリューションエクスプローラを見るとSystem.Runtimeに警告マークが表示されていることがあります。
    その時は、再度アセンブリ参照の追加を行うと消えるようです。

    ここまででWinRT(Windows Runtime)のAPIを使用できる状態になりました。
    あとは下記のソースをモジュールとして追加するなどすれば心拍数データが取得できるようになります。

    ※注意
    PULSENSEからデータ取得ができるか否かを探るのが目的なため、
    heart rate measurementで定められたデータの解釈を端折っています。この点、ご注意ください。

    ' This software is distributed under the license of NYSL.
    ' ( http://www.kmonos.net/nysl/ )
    Imports System
    Imports System.Threading.Tasks
    Imports Windows.Foundation
    Imports Windows.Devices.Enumeration
    Imports Windows.Devices.Bluetooth
    
    ''' 
    ''' PULSENSE(PS-100)から心拍データを取得する
    ''' 
    Module Module1
    
        Sub Main()
            HeartRateMonitor()
        End Sub
    
        ''' 
        ''' PULSENSE(PS-100)の検索から心拍データを取得する準備まで
        ''' 
        Private Sub HeartRateMonitor()
    
            ' Heart Rateのデバイスを検索
            Dim devices As DeviceInformationCollection = System.WindowsRuntimeSystemExtensions.AsTask(
                DeviceInformation.FindAllAsync(
                    GenericAttributeProfile.GattDeviceService.GetDeviceSelectorFromUuid(
                        GenericAttributeProfile.GattServiceUuids.HeartRate))).GetAwaiter().GetResult()
    
            ' デバイスが見つからない場合は終了
            If devices.Count = 0 Then
                Console.WriteLine("デバイスなし")
                Exit Sub
            End If
    
            ' 見つかった最初のデバイスを使用
            Dim device = devices(0)
    
            ' サービスのインスタンス取得
            Dim service As GenericAttributeProfile.GattDeviceService = System.WindowsRuntimeSystemExtensions.AsTask(
                GenericAttributeProfile.GattDeviceService.FromIdAsync(device.Id)).GetAwaiter().GetResult()
    
            ' キャラクタリスティックでHeart Rate Measurementのインスタンスを取得
            Dim characteristic As GenericAttributeProfile.GattCharacteristic =
                service.GetCharacteristics(GenericAttributeProfile.GattCharacteristicUuids.HeartRateMeasurement)(0)
            ' キャラクタリスティックに対しイベントハンドラ設定
            AddHandler characteristic.ValueChanged, AddressOf GattValueChanged
    
            ' デバイスに対して通知設定を書き込む
            System.WindowsRuntimeSystemExtensions.AsTask(
                characteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GenericAttributeProfile.GattClientCharacteristicConfigurationDescriptorValue.Notify))
    
            ' 終了するまでループ
            While True
                System.Threading.Thread.Sleep(500)
            End While
    
        End Sub
    
        ''' 
        ''' PULSENSE(PS-100)から取得した心拍データ表示
        ''' 
        ''' 
        ''' 
        Private Sub GattValueChanged(sender As GenericAttributeProfile.GattCharacteristic, e As GenericAttributeProfile.GattValueChangedEventArgs)
    
            ' デバイスから取得したデータをバイトの配列に展開
            Dim bytes() As Byte
            bytes = New Byte(e.CharacteristicValue.Length - 1) {}
            Windows.Storage.Streams.DataReader.FromBuffer(e.CharacteristicValue).ReadBytes(bytes)
    
            ' 2番目の要素を表示
            ' (PS-100では2番目の要素で値が取得できてしまうので正規の処理を端折る)
            Console.WriteLine(e.Timestamp.ToString & vbTab & bytes(1))
        End Sub
    
    End Module
    
    
    

     

    C#を使った場合、async/awaitまわりがスマートに記述できると思います。
    MSDNなどで用いられているサンプルコードもほとんどC#での記述だったので、今回はVB .NETで書いてみました(^-^;

    当初はJavaで実装できないか調査を行ってみたのですが、JavaでBluetoothを扱うための仕様(JSR-82)はBLEに対応していませんでした。
    Intelが公開しているTinyBをJNI経由でアクセスできるようラップしたライブラリを使えば、JavaからBLEを扱うこともできそうなのですが、下位層で使用しているBlueZがLinux(とAndroid)にしか対応していないため、Javaでの実装を諦めました。

    カテゴリー: Windows, ソフトウェア, 技術的なメモ | タグ: , , , , , , | コメントする

    FileMaker Pro 15を購入しました。(製品はどこからダウンロードすればよいのか迷ったときに効くたったひとつの方法)

    ここのところ、やたらめったらメジャーバージョンアップしまくっている印象のFileMakerですが、今回のバージョンアップはどうしようか迷っていました。
    (だってめぼしい機能がないんだもの…)

    今回のバージョンアップでは、「PostgreSQLへの接続」という魅力的でインパクトのある目玉機能が備わっていて、気持ちはグラッときたのでしたのですが、ほかの作業をやりながらの状態で検証作業をする時間的な余裕もなく「誰かが評価してその情報がネットにあがってきたら考えよう…」と他人任せモードに転じ、悠長に構えていました。

    しかし、ここにきて時間的な余裕ができてしまい、なおかつヨドバシカメラの店頭からアップグレード版が消えているという事実を知り、猛烈に現物の確保とヨドバシポイントの確保がしたくなり、慌てて店頭で購入してきました。
    (2016年10月1日現在、まだ多くのヨドバシ店舗では店頭ディスプレイしていないものの店内在庫では持っているようです。店員さんにお願いすると奥から怪しげに持ってきてくれます。)

    奥から店員さんが出してきたものを見てビックリ!!
    とにかく箱が小さい!!!!
    どのくらい小さいかというとiPhone 5Sと比べて、ちょっと大きいかなぁーくらいのサイズです。

    FileMakerの箱

    箱のサイズからCDやDVDが入っていないことは明らかだったのですが、アップグレードとはいえ数万円するソフトです。
    「最近は光学ドライブを持たないパソコンも増えているし、Mac OS X Lionの事例もあるからUSBメモリかな?」と何かしらのモノが入っていることを期待していました。

    が!! 開けてビックリ!!!

    紙切れ一枚!!!

    「ご案内」みたいなダウンロードからインストールの手順までが書かれた手引きのようなモノは一切なく、本当に紙切れ一枚。

    ビックリです。
    FileMakerの箱の中身

    そして、一番困ったこと。

    ダウンロード先がわかりづらい。

    FileMakerは無償評価版が提供されています。
    今までの経験からすると、まずは無償版を落とす。別途入手したライセンスキーを登録したら無償評価版がそのまま製品版になるのかな?と期待して試してみたのですが…
    どうもそういう感じではない!!
    繰り返される「無効なライセンスキーが入力されました。」の文字。

    や…やっちまったかなぁ…
    ふーむ…と悩んでいると、

    見つけてしまったのです「2016年9月23日までの限定対象製品」の文字を。
    購入した日「2016年10月2日」
    もしかして… あ・う・と?

    2016年9月23日までの限定商品

    サポートへ泣きつくか…と思ったそのとき、気づいたのです。

    検索で上の方に出てくる製品のページと、印刷してある製品のページが異なると言うことを。

    製品のダウンロードページ
    FileMaker Pro 15 Advanced:
    http://www.filemaker.com/software/filemaker-pro-15-advanced
    FileMake Pro 15:
    http://www.filemaker.com/software/filemaker-pro-15
    紛らわしい商品の紹介ページ:
    FileMaker Pro 15 Advanced:
    http://www.filemaker.com/jp/products/filemaker-pro-advanced/
    FileMaker Pro 15:
    http://www.filemaker.com/jp/products/filemaker-pro/

    製品ダウンロードページのURLは最後に「/」をつけちゃうと辿り着けなくなってしまいます。商品の紹介ページはどうでも良いみたいです。

    URLを入力するとリダイレクトされ、国旗アイコンがならんだページに飛ばされます。
    国を選ぶとダウンロードページが表示されます。
    ページには、macOS版、Windows 64ビット版、Windows 32ビット版がならんで掲載されているので、必要なものをダウンロードすれば大丈夫そうです。

    「期間限定対象製品」と書いてありましたが、期間を過ぎた2016年10月2日でも無事インストールが完了しました。

     

    カテゴリー: Mac, Windows, ソフトウェア, 技術的なメモ, 日々 | タグ: , , , , | コメントする

    FileMaker Pro 15でPostgreSQLへの接続を試してみる(ESS)

    FileMaker Pro 15でPostgreSQLへの接続を試してみる(データのインポート)」の続きで、FileMaker Pro 15からESS(外部SQLデータソース)を使いPostgreSQLへ接続を行う動作の確認です。

    自分としては今回のバージョンアップの目玉機能は、ESSの接続先としてPostgreSQLが使えるようになったことです。
    この機能が使えるようになると、FileMakerが得意とするフォームレイアウトや帳票レイアウトはFileMaker で。データの管理はデータベース(PostgreSQL)で。といったことが可能になります。
    また、既存のシステムに影響を与えることなく、よく使う機能をiPhoneやiPadなどで閲覧・編集するといったことも可能になります。

     

    まず、PostgreSQLをFileMakerで 扱えるようにするためのActual ESS DriverというODBCのドライバを用意します。
    このODBCドライバはPostgreSQLの接続を行うものではなく、ODBC接続されたPostgreSQLをFileMakerから認識させるためのゲートウェイ/ブリッジ的なドライバのようです。

    actual technologies社のwebサイトから評価版がダウンロードできます。
     

    Actual Technologies社ESS Driver

     

    PostgreSQLのODBCドライバ、Actual ESS Adapterがインストールされている状態で、ODBC Managerを立ち上げます。

    登録済みのデータソース一覧が表示され、データのインポートで作成した「PGFM_TEST」が登録されているのが確認できます。
    今回は、このデータソースをFileMakerのESSとして扱えるように設定します。

    「追加」ボタンを押して、新規の接続を設定します。

    ESS Adapter追加前のODBC Manager

    ODBCドライバの選択画面が表示されます。
    「Actual ESS Adapter」を選択し、OKボタンを押します。

    ODBC Managerドライバ選択

    Actual ESSアダプタの設定ダイアログが開きます。
    「続行」ボタンを押して次に進めます。

    ESS Adapter設定

    新しく作成するデータソース名と、適合DSN(ESSが使用するPostgreSQLと直接接続しているデータソース)を入力します。

    今回は、新しく作成するデータソース名を「PGFM_ESS_TEST」、適合DSNを前回作成した「PGFM_TEST」とし、「続行」ボタンを押します。

    ESS Adapter設定

    追加の設定を行うダイアログが表示されますが、特に設定する項目はないので「続行」ボタンを押します。ESS Adapter設定

    設定した内容が一覧で表示されます。

    「テスト」ボタンを押すとPostgreSQLとの接続テストが行われ、「完了」ボタンを押すと設定内容が保存されます。

    ESS Adapter設定

     

    Actual ESS Adapterの設定を終えたら、FileMakerを起動します。

    適当なソリューションを作成し、外部データソースの設定を行います。

    外部データソースの設定は「ファイル」メニューの「管理」-「外部データソース」です。
    FileMaker外部データソース呼び出し

    外部データソースの管理画面を開くと、登録済みの外部データソース一覧が表示されます。
    新しいソリューションに追加したので、空の状態で表示されました。
    「新規」ボタンを押して、データソースを設定します。

    外部データソース管理

    外部データソースの編集ダイアログが表示されます。

    今回は、ODBCを接続するので、タイプは「ODBC」、DSNは先ほど設定した「PGFM_ESS_TEST」を設定します。
    必要に応じて、認証情報やテーブルのフィルタリングの設定を行います。 

     

     

    データソースの編集

    DSNの「指定」ボタンを押すとODBCデータソースの選択ダイアログが開きます。

    データソースの一覧の中から、「PGFM_ESS_TEST」を選択し、OKボタンを押します。

    ODBCデータソースの編集

    外部データソースの一覧に、選択した「PGFM_ESS_TEST」が追加されました。
    OKボタンを押してダイアログを閉じます。

    外部データソースの管理

     

    次に、外部データソースとして登録したデータベースをFileMaker上に取り込めるか確認を行います。

    「データベースの管理」を開き、リレーションシップタブを表示します。

    画面下部のアイコン群から、「テーブルの追加」をクリックし、テーブルの設定ダイアログを表示します。

    データベースの管理 リレーションシップ設定

    データソース「PGFM_ESS_TEST」にひもづく、データソース「PGFM_TEST」(PostgreSQLのデータベース)のテーブルが一覧で表示されます。

    一覧の中からリレーションシップの設定画面に追加するテーブルを選択し、OKボタンを押します。PostgreSQLのテーブルを選択

    リレーションシップの画面に追加されました。
    スクリーンショットでは、PostgreSQL上のcm_prefectureテーブル(都道府県名のテーブル)とcm_districtテーブル(地方名のテーブル)を選択し、FileMaker上でリレーションシップの設定を行った状態になります。
    ここまで設定してしまうと、扱っているテーブルがFileMaker上にあるのか、別なDBMS上にあるのか意識せずに扱えるようになります。

    テーブル追加後のリレーションシップ

    リレーションシップの設定を行ったPostgreSQL上のテーブルがFileMakerのテーブルと同じように扱えるか確認するため、適当なレイアウトを作成します。

    表示対象とするデータは、cm_prefectureテーブル(都道府県名)で、ひもづく地方名が表示されれば成功です。
    設定を簡単にするため、レイアウトは「表形式」で設定します。

    「表」を選択し、「完了」を押します。
     

    レイアウトを作成

     

    表示対象となる項目(フィールド)の選択を求められるので、親テーブル(cm_prefecture)から都道府県コード、都道府県名、地方IDを選択します。

     

    スクリーンショット 2016 10 03 2 15 22

    追加されました。

    ダイアログ下部のアイコン群から「フィールドを追加」ボタンを押します。

    レイアウトに表示する項目

    再度、表示対象となる項目(フィールド)の選択を求められるので、テーブルを「cm_district」に切り替え、cm_districtテーブル(地方名)から地方コード、地方名を選択します。
    子テーブルと表示する項目を選択

    追加されました。

    レイアウトに表示する項目

    表示対象の項目名を設定後、ブラウズモードに切り替えると…

    PostgreSQL上のデータが表示されました!!

    リレーションシップが表示されていることを確認

    FileMaker Pro 15がPostgreSQLと接続できることで、ますます活用方法が拡がりそうです!!

     

    今回の接続テストを行うためにFileMaker社のwebサイトを調べていると気になる記述が…

    接続可能なデータベースエンジンの一覧でPostgreSQLの項目で「9.4.4」と記述されています。
    しかし、今回テストで使用したPostgreSQLはそれよりも古いバージョン(8.4.0)でした。

    Actual ODBC Driver for Open Source Databasesか、Actual ESS Driverが対応していれば、FileMakerが公式サイトに掲載している以外のバージョンでも動きそうな気配がします。

     

    FileMake社の外部SQLデータソースの説明

    カテゴリー: Mac, Windows, 技術的なメモ | タグ: , , , | コメントする