「パスワードがわからない」「リセットディスクがない」状態のWindowsのパスワードを変更するときに使ったツールと手順

パスワードがわからずログインできないWindowsに、どうにかしてログインしなくてはならないときに試した手順です。

2012年秋ぐらいの情報なので、リンク切れがあったり、手順が使えなくなっている可能性もあります。
パソコンの中のデータだけを取り出したい場合は、対象となるパソコンのハードディスクを取り出し、外付けHDDとして使えるケースに入れ、別のパソコンからつないでコピーした方が簡単でリスクが少ないと思います。

ここで記載された内容を権限を持たないコンピュータに対して行った場合、法的な責任を問われる可能性があります。また、コンピュータに修復できない深刻なダメージを与える可能性があります。
実際の作業にあたっては細心の注意を払い、ご自身の責任においてお試し下さい。

用意するもの

  • ブランクCD
  • USBメモリ

使ったもの

  • ophcrack

設定済みのパスワードの自動解析するツール(フリー)
http://ophcrack.sourceforge.net/

  • Kon-Boot

Windowsのパスワード画面を回避するツール($18.99≒1500円)
http://www.thelead82.com/kon-boot/konbootWIN.html

  •  Offline NT password & Registry Editor

Windowsのパスワードをクリアしたり、編集したりするツールhttp://pogostick.net/~pnh/ntpasswd/

 手順

  1. ophcrackのサイトからISOをダウンロードCDに焼いて、Windowsが入ったPCでブート
  2. ophcrack解析失敗
    (日本語ユーザ名かつパスワードが辞書にないっぽい)
  3. Kon-Bootのサイトでツールを購入
  4. レジストするとファイルがダウンロードできるようになるので、ファイルをUSBメモリにインストール
  5. Kon-BootをインストールしたUSBメモリからPCをブートする
    (USBメモリのKon-Boot→Windows起動という流れ)
  6. Windowsのパスワード回避成功
  7. データをバックアップ
    (この状態では、パスワード変更やリセットディスクの作成は行えない)
  8. Offline NT password & Registry Editorのサイトからファイルをダウンロード、USBメモリにインストール
  9. USBメモリからPCをブート、黒い画面でコマンドを叩きパスワードをクリア失敗
    (日本語ユーザ名が原因?)
  10. Administratorをパスワードなしで有効化
  11. パソコンを再起動しWindowsを通常起動、Administratorでログイン
  12. 目的のユーザのパスワードを変更

Windowsにログインすることが目的の場合、無効化されている(隠しアカウントになっている)Administratorユーザを有効化し、Administratorユーザでログインし、ユーザ管理ツールから目的とするユーザのパスワードを変更すればよいので、 手順の3~6、10~12だけでよいかもしれません。

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

システムの保守について

コンピュータシステムについて、よくたずねられることに『保守』『保守契約』というものがあります。

システムは、「開発・構築をして、稼働し始めたら、おしまい」ということはなく、使いはじめたら日々問題なく安定して動かせるようにしていく必要があります。
この「問題なく安定して動かせるようにする」ことを『保守』、「保守を行います」という契約を『保守契約』と呼んでいます。

保守で行うこと

保守契約を結んだ場合、問題が起きたり問い合わせがあったときに即時対応できるよう、下記のようなことを行います。

  • 開発時に使用した資料や設計などドキュメントやプログラムソースコードの整理・管理
  • 開発・テストで必要になる環境の保持
  • システムを構成する製品のアップデートや業務上必要になる法制度の情報収集

これらは、いざというときに備える体制の準備です。

「システムを構成する製品のアップデートの情報収集」というのは重要な項目です。
近年はニュースなどで報道されているように、コンピュータやネットワークに対する不正な攻撃が日々とんでもなく発生しています。
構築時点では問題がないと判断されたソフトウェア製品も、稼働後になんらかのセキュリティ脆弱性が発見されることが多々あり、実際攻撃にも使用されています。
(参考事例: 『「PHPMailer」に重大な脆弱性、直ちにパッチ適用を』)
基本的に、システムの引き渡し後に発覚した脆弱性などの諸問題については、お客様の責任での対応・処置となります。
保守契約を結ぶことで、お客様に代わり構成する製品の脆弱性情報などを収集し、必要がある場合は、システムのアップデートなどを提案します。

必要に応じて下記のようなことを行います。

  • システムを構成するソフトウェアのアップデート前の事前検証
  • システムを構成するソフトウェアのアップデート
  • ハードウェアやネットワークのメンテナンス

中でも、「アップデート前の事前検証」というのは重要な項目です。
たとえば、多くのパソコンで使われているWindowsは、Windows 10になり従来のメジャーバージョンアップに匹敵するような大規模なアップデートが配信・適用されるようになりました。
事前検証なしでアップデートを適用してしまった場合、システムに重大な問題が生じ業務に支障をきたしてしまうことがあります。

私の経験では、2016年8月に配信されたWindows 10 Anniversary Update(以下、Anniversary Update)を適用した結果、Windowsのプリンタ管理方法に変更が生じて、それまで動いていたプログラムが動かなくなる現象が起きました。
帳票出力プログラムで帳票が出力できなくなるという致命的な問題でした。
経緯については、『Windows 10 Anniversary Update適用後にVB .NETで組まれたプログラムの動作が不安定になったら』にまとめました。

事前検証を行うことで、アップデート適用時のリスクをあらかじめ知ることができ、問題を回避できるようになります。

日常的な業務としては問い合わせ対応も行います。

  • 操作に関する問い合わせ
    「〇〇〇をしたいのだけれど手順はどうすればよいか」といった問い合わせです。
    お客様がシステムに慣れていくにつれ徐々に減っていきますが、年次処理などごくごくたまにしか使用しない機能を中心に割と頻繁に発生します。
  • 仕様に対する問い合わせ
    「これはできたかな?」「こうなるといいな!」といった問い合わせです。
    日常的にシステムを使っていただいていると常に発生する問い合わせで、システムの課題発見や機能改善につながります。
  • 調査
    「〇〇〇をしたら△△△になったんだけれど…」といった、システムを使っていて発生した事象に対する調査依頼などが該当します。
    調査の結果、なんらかの修正が必要になった場合、発生要因や納品後の経過時間などにより「瑕疵担保責任で対応」や「有償対応」にわかれますが、一般的に事象の発生原因の調査までは保守の範囲内で行います。

問い合わせや課題を管理し、お客様と開発者側で認識を共有することで、業務や要望の変化にシステムを適宜対応させることができるようになります。
(発生した事象が数年に一度あるかないかの例外中の例外なのか、頻度はそれほど高くはないがシステムとしても考慮すべき事象なのかを切り分け、改修の判断材料とするなど。)

保守契約を結んでいない場合はどうなるか

契約にもよりますが、納品・検収の一連の流れが完了した時点で、すべて忘れます。
(もちろん、瑕疵担保責任に備えた最小限の体制は敷きます(^-^;)

契約上問題がないのであれば、ソースコードなどデータ・ドキュメント類のバックアップなどは取りますが、契約によってはそれらをすべて返却または破棄することもあります。この場合は、作業をした人の記憶だけが頼りです。
また、開発で使用した開発環境などもハードディスク上から削除したり、クラウド上で作業を行った場合は契約解除したりしてしまいます。
保守が必要になったとき、「作ったところだから、なにかしらは知っているだろう」と思いたいところですが、あまり期待はできないと思います。

問題や問い合わせが発生した場合は、必要な資料やソースコードの取り寄せ、開発・検証環境の整備、仕様の確認、事象の調査…など、一連の作業を最初からやり直すので、対応完了までに多くの時間と費用が必要になります。

保守費について

一般的に、『保守費』はシステム構築にかかった費用から算出され、月額や年額などで保守業者へ支払います。
保守費の目安としては、構築費の10~25%程度が多く、15%前後が相場と言えると思います。

たとえば、350万円で構築したシステムの場合、年額で52.5万円程度(15%で計算)ならば、妥当と言える金額です。

ただ、保守費は契約内容により金額が大きく変動する部分です。
提示された金額を見て、「ん!?( ゚Д゚)  工工エエェェェェェェェ(゚Д゚)ェェェェェエエエ工工 」となった場合は、保守業者に保守の範囲と内容について確認をした方が良いと思います。

保守費は、「いざというときに備える体制の準備」に対しての費用と見ることができ、保険料や顧問料のような性質があります。
ですので、その月その年の中でなにも起きなかったとしても支払いの必要が生じます。

諸々の事情により「保守契約を結ばない」「保守契約を打ち切る」という選択をすることもあると思います。
この場合、保守が必要になった際に「スポット保守対応」として通常よりも割高な保守費を請求されることがあるので注意が必要です。
(会社によっては保守そのものを拒否されることもあるようです)

また、「構築時には保守契約を結ばなかったけれど、2年後に問題が生じ、やっぱり保守契約を結びたくなった」というケースもあるかと思います。
この場合、契約時点からの請求ではなく、構築時点に遡及して請求されることがあるので注意が必要です。
「構築時に保守契約を結んだものの途中契約を打ち切り、再度保守契約を結びたい」といったケースでも、打ち切った時点に遡って請求されることがあります。

保守契約を結べばシステムで起きる問題すべてに対応してもらえるのか?

「では、保守契約を結べばシステムで起きる問題すべてに対応してもらえるのか?」という疑問がわきますが、これはほとんどのケースで「NO」です。
保守契約を結んでいても、契約で定めた範囲を超える作業・負荷が生じた場合、別途費用が発生します。

たとえば、「月に3回までの問い合わせ、のべ20時間分まで対応」と定めてある場合、4回目以降の問い合わせや、1回目の調査でも20時間を超える作業が生じたときは、保守費とは別に費用が発生します。

「全部コミコミで面倒を見て!」と言いたくなるところですが、この場合、前述した構築費の10~25%で算出とはならず、過去の実績(類似するケースなど)や考えられるリスクなどから算出されると思います。
(技術者は起こりうる事象を多方面多角的に考え悲観的に見る傾向が強いので、それらすべてに対応するとしたら…と見積もり、おそらく高額になります(^-^; 逆に、著しく安すぎる金額が提示された場合は、起こりうるケースを過少に評価しすぎていて、実際に問題が起きたときに対応が取れないといったこともあるようです。)


『保守』について書きましたが、ぶっちゃけ『運用』と呼ばれる領域も含まれています。
定義的には、保守は問題が起きないように保持する業務、運用はシステムを安定して動かす業務とされていたはずです。
最近は、「運用」「保守」がセットになっていることが多く、どちらも「システムをうまいこと動かす」という目的は共通しているので、はっきりとわけずにモヤっとしたまま、ふたつまとめて「サポート」と呼んだりもします。
実際にどこまでを範囲とするのかは、契約次第といった感じでしょうか。

「保守契約を結んだ方がよいのか?」というのが一番の関心事だと思うのですが、私感では「いざというときに相談できる相手がいる」というのは大きなメリットだと思います。
システムを長く使い続けるためには日常的に課題を整理解決していく必要があり、円滑に課題を整理解決する手段として保守契約は有効な解なのではないかと思います。

カテゴリー: システム開発, 技術的なメモ, 日々 | タグ: , , , | コメントする

JimdoCafe 福島に参加してきました。

Jimdo』(ジンドゥー)というホームページ(webサイト)をめちゃくちゃ簡単に作成・公開できるツールがあります。

Jimdoの特長として、「無料で使える」「簡単に使える」というところがあげられるのですが、私は『JimdoCafe』(ジンドゥーカフェ)というJimdo/webのエキスパートから直接Jimdoやwebの使いこなし・相談を受けられる拠点が全国各地に存在している「ユーザの支援体制の手厚さ」が一番の特長なのではないかと思います。

今回は、その福島版『JimdoCafe 福島』にお邪魔してきました。

実のところ、Jimdoの存在は知っていたもののアカウントは未登録。
つまり、ユーザではない状態での参加。

そして、今回のお題は「脱!シロウトっぽさシリーズ 第2回 『Jimdoのレイアウトで流行のウェブサイトを作るコツ』

開催案内には、「どなたでも参加いただけます。ホームページを持っていない方でもご参加いただけます」と書いてありましたが、やっぱり現場に行くと「私… 第1回受けていません… というかJimdoのユーザでもないし… 大丈夫かな…」と不安マックスになるんですよね…。
そんな状態で臨んだのですが、講師の株式会社Gazi工房赤井さんの話し出すと一瞬で場が和み、まったりとした雰囲気で勉強会がはじまりました。
私の個人的な意見なのですが、セミナーや勉強会で「まったりとした雰囲気」ってとても大事だと思っています。
講師の方が話している内容が素晴らしくても場が緊張感漂う状態だと、まったく頭に入ってこないんですよね…(^-^;
JimdoCafe 福島では、講師の赤井さんの人柄が会場いっぱいにあふれ出ていて、とてもリラックスして話に集中できました。

さて、勉強会はスライドをもとに話を進めていきます。
このスライドがとても丁寧にわかりやすく作られていて、Jimdoがわからなくてもwebのつくり方を知らなくても、「ああ、なるほど。ああ、そういうの見たことあるある」とスコンと頭に入ってくる構成になっています。
随所にちりばめられた「あるある感」のおかげで自分の経験と照らし合わせながら話を聞くことができ、わかりやすいスライドとあいまって、あたかも以前からJimdoのユーザであったかのように、スムーズにJimdoで「できること」がわかりました。

すごいですねー、Jimdo!
無料で使えるのにクールなデザインが「テンプレート(ひな形)」として用意されているんですよ!
しかも、たくさん!!

そして、このテンプレートに載せたい写真を当て込み、必要な文章を入れ込んでいくだけで、webサイトが完成してしまいます!
webコンテンツ制作のための高価な専用ソフトのインストールも不要ですし、難解な呪文のようなHTMLやCSSなんて一切でてきません!!

勉強会では、テンプレートを構成する各パーツを使う場面などの説明があり、自分が表現したい内容にあわせて、パーツを配置することで簡単に今風の───
いや、「今、まさに流行っているデザイン」のwebサイトができることがわかりました。
用意されたテンプレートをそのまま使っても十二分にスタイリッシュな完成度のwebサイトになりますが、「スタイル」という色や文字サイズなどの細かい設定を調整する機能を使えば、さらに自分流のアレンジもできてしまうという…( ゚Д゚)

伝えたいことさえ決まっていれば…
専門知識ゼロでもまったくいけてしまう、そうJimdoならね!
と、思いました。

さらにJimdoCafe 福島では、Jimdoの効果的な使い方、Jimdoが得意なことだけでなく、苦手なこと、つくるときに「コツ」がいるところ、それを回避するための方法など、いろいろなノウハウも伝授してもらえ、「信用できるサービスだなー」と実感できました。
自分の仕事柄もあるのですが、なんでも「できます、できます」とうたうサービスは、ちょっと信用できないところが…(^-^;
Jimdoでは、「ユーザの声を取り込み、Jimdoのサービス開発者が機能を改善していくので積極的にリクエストをあげてほしい」と説明があったので、このあたりが導入数が増えているポイントなんだろうと納得しました。

繰り返しになってしまうのですが…
以前、Jimdoを見て「こんなものができたら、ウチの商売あがったりだ!!」と怒ったweb制作者の方がいるとかいないとか噂では聞いておりました。
今回、実際にJimdoのサービスを見て、Jimdoを使って作られたwebサイトの完成例を知ると、「こりゃぁ、危機感を持つweb制作者も多いだろうなー」と、納得しました。
だって、かっこいいテンプレートが用意されていて、コードを書くこともなく、画面上でパーツをポチっと選んで、マウスを使ってずるずるっと配置するだけで、webサイトが完成してしまうんですよ?
技術革新の恐ろしさを感じてしまいます。

Jimdoは、無料サービスの『JimdoFree』でもかなりのことができますが、上位有償サービスの『JimdoPro』や『JimdoBusiness』ではさらにその範囲が広げることができるのが良いですね!
また、自分で一通り作ったあと、「あとちょっとなんとかならないかなー」と思ったときに、プロのweb制作者に制作の依頼ができる体制が準備されていることがイイですね(自分がつくったwebサイトをプロが手直しするサービスに『Jimdoリメイク』と銘打っていることに優しさを感じます。)

ひと頃、「会いに行けるアイドル」というのが流行りましたが、JimdoCafeは、さながら「会いに行けるweb制作者」。
今回、JimdoCafeに参加してみて、「会って学んで一緒にwebサイトをつくっていきましょう!」というのが伝わってくるように感じました。

興奮冷めやらぬ状態で勢いだけで書いているので、くどい繰り返しもありますが、そこが自分が「おっ!」と思った部分です(^-^;

「自分のwebサイトを作ってみたいんだけれど…」「webサイトをもうちょっとカッコよくしたいんだけれど…」などなど、webの解説や改善でお悩みでしたら、ぜひお近くのJimdoCafeに足を運んでみてください。
福島・山形の方は、株式会社Gazi工房さんが開催されている『JimdoCafe 福島』『JimdoCafe 山形』を超絶おススメいたします!!

株式会社Gazi工房の原社長、赤井さん大変お世話になり、ありがとうございました。
帰宅後、速攻でJimdoのアカウントを作りました!

カテゴリー: 日々 | タグ: , | コメントする

オープンソースの在庫管理を公開しました

FileMakerを使ったシンプルな在庫管理を作成しました。
できることは3つ、「なにが・いつ・どこからはいったか」「なにが・いつ・どこへでていったか」「なにが・いまいくつあるか」だけです。

ライセンスは、NYSL(http://www.kmonos.net/nysl/)です。もちろん無料
NYSLでの配布となりますので、見た目の改良や機能の修正・追加などのカスタマイズはご自由に、再配布などもご自由にどうぞ。
(NYSLでの著作権表示がわからなかったのでメニュー画面にCopyright表示をしていますが、この部分もご自由に削除・修正いただけます)

追記: 2016/12/04 23:30 Windows版を追加しました。

在庫管理メニュー

ライセンス
NYSL(http://www.kmonos.net/nysl/)
配布物
  • zaikokanri.fmp12 (修正も可能なFileMakerファイル。FileMakerがあればMac/Windowsのどちらでも動きます。 900KB)
  • zaikokanri_runtime_mac.zip (Mac用ランタイム。FileMakerなしでも動きます。FileMaker Pro 15 Advancedで作成。64MB)
  • zaikokanri_runtime_windows.zip (Windows用ランタイム。FileMakerなしでも動きます。FileMaker Pro 14 Advancedで作成。58MB)

FileMaker Pro 15 Advancedで作成。
カスタマイズをおこなう場合は、FileMaker Pro 12以降のバージョンであれば開くことができると思います。

使い方
  • 取引先マスタ、品目カテゴリマスタ、品目マスタに必要なデータを登録します。
  • 在庫一覧画面から、入庫・出庫が発生した品目を選び、在庫詳細画面を表示します。
    在庫詳細画面から入庫または出庫の登録を行います。
    在庫一覧画面
    在庫詳細画面
  • 在庫一覧画面から在庫一覧表をプリンタまたはExcelに出力します。

RIALAB.では、より高機能の在庫管理システムの開発も承っております。
お問い合わせはフォームからお願いいたします。

カテゴリー: Mac, Windows, ソフトウェア, 技術的なメモ, 製品/サービス | タグ: , , , | コメントする

知らなかった!! FileMakerで表示単位を切り替える方法

FileMaker』を使うようになり画面やレポートのレイアウト機能を使っていると、表示単位が「cm」であることに違和感を覚えていました。

というのも、業務用のシステムを構築するときに『Microsoft Access』などWindows上の開発ツールを用いることが多いのですが、それらのツールでは表示単位が「ピクセル」「ドット」「twip」などの概念・呼び名があれど整数で表現され、「1ドット右に」「4ピクセルごとに表示」という感じで私にとってはわかりやすく扱いやすい表現でした。
対して、FileMakerでは小数で表されていて、私にとってはこれが直感的にはわかりにくく扱いづらい表現で、Trial and Error、下手な鉄砲も数打ちゃ当たる方式で調整をしていました。(紙帳票をベースに定規で測りながらレイアウトをするときはとてもやりやすいのだと思います。)
「面倒ならそのくらい調べろよ!」と自分にツッコミを入れたいいところですが、そこ無精者のなので…(^^;)

そして、今日の今日まで「そういうものだろう…」と、慣れるほうを選んできたのですが、今日、気づいてしまいました。

インスペクタの『位置』『サイズ』で単位が表示されている場所ををクリックすると、クリックするたびに表示単位が「cm」「pt」「in」と切り替わります。

スクリーンショット 2016 11 29 0 44 12

また、メニューバーの『表示』メニューから『定規』(ルーラー)にチェックを入れ、定規を表示した状態で定規の縦軸と横軸が交わる場所(画面の左上)に表示されている「cm」などの単位をクリックしても同じように切り替わります。

スクリーンショット 2016 11 29 0 46 34

スクリーンショット 2016 11 29 0 44 24

 

Windows上でAccessやVisual Studioを使って開発をしているいる人にはお馴染みの「グリッド」とその表示単位───グリッドサイズの設定は、FileMakerのインスペクタで『グリッド』を表示し、グリッド間隔とグリッドステップに適当な数値を設定すると格子の大きさが変わります。

スクリーンショット 2016 11 29 1 23 33

このことをFileMakerのオンラインマニュアルを調べてみると『定規とグリッドの使い方』( https://www.filemaker.com/help/15/fmp/ja/index.html#page/FMP_Help/rulers-and-grid.html ) にしっかり書いてありました。
どうやら、とんでもなく無駄な作業をしていたようです。

 

この設定をしてもFileMakerの『グリッドに沿わせる』『ガイドに沿わせる』などの吸着系機能をONにいると、部品の配置に『慣れ』が必要っぽいです。
とはいえ、表示単位を切り替えてポイントで操作を行えるようにすれば整数倍が使えるようになるので、インスペクタの『位置』『サイズ』へ直接値を設定すればWindowsチックに”それっぽい”レイアウトができそうです。

カテゴリー: システム開発, 技術的なメモ | タグ: , , | コメントする

バックアップのこと

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

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アプリにはストレス状態などの情報も表示されています。
    アプリからみると過去分に遡及して見ることが可能なので、どこかにこれらのデータが格納されていることは間違いないと思います。
    次は、これらのデータをどうにかして取られないか試してみようと思います。

    2017/05/25追記

    client_id.jsonの配置場所について問い合わせをいただきました。
    client_id.jsonは、下図のようにソースフォルダの直下に配置しています。

    hr_eclipse

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