月別アーカイブ 9月 2019

村上 著者:村上

【Cordova】「cordova-plugin-socket-tcp」プラグインでサーバーとの接続が失敗する

原因は完全に私のミスですが、再発防止の意味も込めてまとめ。
先日投稿した「【Cordova】TCPプロトコルを介してサーバーと通信するためのプラグイン「cordova-plugin-socket-tcp」」という記事で紹介したプラグイン「cordova-plugin-socket-tcp」でサーバーとの接続が一定時間後に何故か切れてしまう時の対処法です。

GitHub のページはこちら。

GitHub – kitolog/sockets-for-cordova: Cordova plugin for socket network communication
https://github.com/kitolog/sockets-for-cordova

 

発生していた現象は、メソッド .open() を使って、指定したサーバーに接続した際、一定時間が経過すると、onErroronClose ハンドラが呼ばれるという物でした。
なお、その際のエラーは「Read timed out」でした。
また、後輩君のアドバイスで、数秒間隔でデータを送り続ければ途切れないのでは?とのアドバイスも頂きましたが、実装しても意味はなかったです…。

で、こちらの対処法ですが、プラグインを入れ直すことで解決できました…!
プラグインインストール時に、ドキュメントに記載されているコマンドではなく、下記のコマンドを実行してしまったことが原因でした。

cordova plugin add https://github.com/kitolog/sockets-for-cordova.git

正しいコマンドはこちら。

cordova plugin add cz.blocshop.socketsforcordova

以前、他のプラグインで上記のようにドット区切りのプラグインを指定したところ、インストールに失敗したので、GitHub のURLを指定したんですよね。
で、今回も失敗するかもしれないと考えて、最初から URL を指定したところ、バグに遭遇しました…。
謎のアレンジを効かせた私が悪いということでした。
プラグインを正しいコマンドで入れ直したところ、問題なく動作するようになりました。

 

以上、Cordova のプラグイン「cordova-plugin-socket-tcp」が正常に動作しない時の対処法でした。
参考になれば幸いです。
あと、私のように変な修正はしないようにしてください。

  • この記事いいね! (0)
takahashi 著者:takahashi

Cygwinのバージョンを確認する方法

Unixライクな環境をWindows上で再現できるCygwinですが、使用しているとインストール済みのCygwinのバージョンが知りたくなる時があります。

Cygwinはインストーラーがパッケージマネージャを兼ねているような感じになっているので、Cygwinのインストーラーからインストール済みバージョンを確認することは可能です。

しかし、インストーラーをインストール後に破棄してしまった場合で、再度インストーラーをダウンロードできないような状況では困ることがあります。

実はCygwinではパッケージマネージャだけでなく、Cygwinターミナル上からもバージョンを確認することができます。

下記のコマンドを実行します。

cygcheck -c cygwin

すると下記のような形でバージョンが出力されます。

$ cygcheck -c cygwin
Cygwin Package Information
Package              Version        Status
cygwin               2.10.0-1       OK

cygcheckコマンドはインストールされたcygwinパッケージのバージョンなどを表示することができるコマンドなのですが、Cygwin本体もCygwinのパッケージとして扱われているので、このコマンドで情報が確認できるようになっているようです。

Cygwinのバージョンのチェックが必要な場合は参考にしてみてください。

  • この記事いいね! (0)
著者:杉浦

【Windows10】起動時に高頻度でブルースクリーンになる問題の対処法の一つ

 結論として、対処法の一つは高速スタートアップを切ることでした。切り方は以下の通りです。

アドレス:コントロール パネル\ハードウェアとサウンド\電源オプション\システム設定
UIを使った移動経路:コントロールパネル->ハードウェアとサウンド->電源オプション->電源ボタンの動作を選択する
移動した場所にある「高速スタートアップを有効にする(推奨)」のチェックを外す。
※チェックを外す前に「現在利用可能ではない設定を変更します」のメッセージをクリックする必要がある場合があります。


 これをするとPCが健康になる場合があります。勝手な想像ですが、高速スタートアップをするべきでないPCスペックであるにも関わらず高速スタートアップをしようとしていたのでしょう。
 以下、解決までの道筋です。
 今回起きていた問題は題にある通り、起動時に高頻度でブルースクリーンになる、というものでした。今回の問題の厄介な点はブルースクリーン時に表示されるエラーコードが多様だった点にありました。例えば、SYSTEM_THREAD_EXCEPTION_NOT_HANDLED、MEMORY_MANAGEMENT、BAD_POOL_CALLERです。このためエラーコードをググってピンポイントな解決を見つけることができませんでした。起きているエラーについて詳しく調べることでGoogle先生の提案する解決策を絞り込めます。エラーについて詳しく調べるにはWindowsのログを追うことが一つのやり方です。
 Windowsのログはコンピュータの管理のイベントビューアーから見ることができます。ここからエラー、警告、重大といった問題の起きそうなイベントのログを見ます。今回ならばとりあえず終了時の問題か、起動時の問題かの二択が想像でき、どちらの問題か調べようとしました。このログを見る限り、起動時に問題が発火、大炎上しています。

 これの中を読んでググってとしていくと起きていることがエラーコードのみよりもずっと深くわかります。今回は起点が常に高速スタートアップの失敗で、まさにそれが原因でした。(下図の様に高速スタートアップの失敗がいつも起きていた。そこから派生していくイベントのどこかしらで決定的な破綻が発生。)
 

 後は”高速スタートアップ”でググって予測で出てきた”高速スタートアップ 無効”で提案されたやり方を適用して処置完了です。
 処置後の経過をざっくり見るには信頼性モニター(コントロール パネル\システムとセキュリティ\セキュリティとメンテナンス\信頼性モニター)が便利です。以下の様に起きたイベントからPCの状態を評価、表示してくれます。処置後は回復に向かっており、一度も起動時のブルースクリーンは起きていません。

  • この記事いいね! (1)
asaba 著者:asaba

【android】intentの戻り値には、帰ってきた値に合わせて細かく切り分けて対応する

intentで何かの処理をした結果は、コールバックであるonActivityResultの引数として

返ってきます。この中のrequestCodeとresultCodeの内容に合わせて処理を分けていくのですが、

例えばカメラで撮った画像を受け取りたい場合は下記のようにかきます。

 


if(requestCode == RESULT_CAMERA && resultCode == RESULT_OK)

 

左辺がカメラモードに入った状態、右辺がカメラが正常に終了した状態。

この条件が二つ合った場合のみ処理に入っていきます。

ギャラリーの場合も同じように

 

<pre>if(requestCode == REQUEST_GALLERY && resultCode == RESULT_OK)</pre>

 

と書いていきます。requestCodeの判定だけでは縛りが甘く、リクエストした

結果が得られない時があります。

 

例えば、カメラモードに入って何も撮影せずに戻ろうとした時。

上のカメラ撮影処理において、条件がrequestCode == RESULT_CAMERAのみ

だった場合、本来ならば戻る=resultCode==RESULT_CANCELと決まっているのですが

条件が一つだけなので、カメラ撮影が成功したと判断されその下の処理へと

走ってしまいます。すると当然Uriが存在しないので何もない状態のimageViewを

返してしまう羽目になるのです。

 

自分の場合は条件がrequestCode == RESULT_CAMERAのみで、更に関数にvoidが

ついているにも関わらず分岐の中でreturnを使った処理を付けてそのままにしておいた

ためカメラモードで戻るを押した際にimageviewが消失する事故が起きました。

(恥ずべき間違いとは言えない)

この沼にはまると結構な時間を取られてしまうので注意したいですね。

 

onActivityResultで結果を受け取る際はresultCodeの結果もチェックして

処理を書いていきましょう。

 

下記テンプレコード

<pre>@Override
protected void onActivityResult(int requestCode,
                                int resultCode, Intent intent) {
    
    if (requestCode == RESULT_CAMERA && resultCode == RESULT_OK) {
      //カメラの処理</pre>
<pre>      } else if(requestCode == REQUEST_GALLERY && resultCode == RESULT_OK){
   //ギャラリーの処理</pre>
<pre>        } else if(resultCode == RESULT_CANCELED){
    ※カメラ・ギャラリーモードがキャンセルされた時(重要)
        }
      }
    }
</pre>

 

 

  • この記事いいね! (0)
著者:杉浦

【Git】git-submoduleことはじめ

 Git自体のパッケージマネージャの様な機能としてgit-submoduleがあります。git-submoduleはgitコマンドの一つでgitを導入すれば勝手にくっついてきます。
 Git – git-submodule Documentation
 git submoduleはGitリポジトリの中にGitリポジトリをクローンする機能です。これを使えばバージョン固定や定期的なコピペから解放されます。ある一つのDocker設定を用いたり、開発プロジェクトで用いない言語のライブラリと連携したりする時に特に便利です。

 基本のコマンドは二つ覚えておけば大丈夫です。git submodule add [cloneする時とかのURL] [保存先ディレクトリ]でリポジトリを追加、git submodule updateでリポジトリをまとめて更新、この二つだけです。
 Gitリポジトリの中にGitリポジトリがあると言ってもいいくらいなのでGitコマンドの対応が大体用意されています。ブランチの切り替えで安定版、開発版の切り替えも楽々です。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】「Peripheral null not found」エラーの対処法

今日遭遇したエラーの対処法についてです。
記事でまとめるほどでもないかな…とも思ったのですが、念のため。

なお、こちらのエラーは Cordova のプラグイン「cordova-plugin-ble-central」の stopNotification() メソッド実行時に発生しました。
こちらのプラグインの GitHub のページは下記からご確認ください。

GitHub – don/cordova-plugin-ble-central: Bluetooth Low Energy (BLE) Central plugin for Apache Cordova (aka PhoneGap)
https://github.com/don/cordova-plugin-ble-central

 

さて、原因ですが、大体このエラーメッセージの次の行に詳細が書かれているので、こちらを確認します。
私の場合は、メソッドの引数に指定する device_idservice_uuidcharacteristic_uuid の値が正しく指定できていなかったために発生していました。
引数に指定する値の取得を修正し、正しい値を代入して実行したところ、問題なく動作しました。

なお、エラーメッセージを検索した際にヒットした記事はこちら。

Android BLE connection crashes after 15-25 seconds · Issue #129 · don/cordova-plugin-ble-central · GitHub
https://github.com/don/cordova-plugin-ble-central/issues/129#issuecomment-210252678

上記のリンク先の投稿にエラーメッセージのログが載っていますが、こちらでも2行目にエラーの詳細が表示されているのが分かるかと思います。

 

以上、「Peripheral null not found」エラーの対処法でした。
最初、エラーメッセージの意味が分からなかったので、とりあえず検索にかけてしまいましたが、エラーメッセージを冷静に読み直せば別に難しくもなんともなかったですね。
ご参考になれば幸いです。

  • この記事いいね! (0)
takahashi 著者:takahashi

風の強さなどをわかりやすく視覚的に表示してくれるWebサービス “Windy.com”

台風などが発生した際、自分の地域やこれから向かう場所がどういう状況なのか、またこれからどうなっていくのか、知りたくなることがあると思います。

最近、風の動きを超感覚的に見ることができるWebサービスを見つけたので、ご紹介したいと思います。

Windy.com

実際にサイトにアクセスしていただければ、白い粒子が地図上を飛び交っているのがわかるかと思います。

この粒子一つ一つの動きが風の流れであり、粒子が進む方向に、粒子の進む速さが早いほど強い風が吹いています。

左下に再生ボタンがありますが、こちらをクリックすると画面下部のプログレスバーが動いていき、現在時刻以降の、風の動きの予測を見ることができます。

内容としては日本で公開されている予測サービスとぱっと見差はないのですが、細かい風の流れを見ることができるため、例えば台風が来た際の自分の住んでいる地域への深刻度がどれぐらいなのかが、他サービスとくらべて実感しやすく、いろいろな判断材料にしやすいのではないかなと思いました。

ちなみにアプリもリリースされているので、スマートフォンからはこちらを利用すると便利そうです。

The app was not found in the store. 🙁

もうこれ以上台風はまったくもって御免ですが、まだもう少し台風シーズンが続きますので、こういったアプリを利用して、防災について考えてみるのもいいかもしれませんね。

  • この記事いいね! (0)
asaba 著者:asaba

【android】SharedPreferencedで保存した文字列とgridviewのpositionを照合する

SharedPreferencedは、アプリ開発において設定の保存・テキスト単体の読み出しの処理に

向いている便利なライブラリですが、gridviewと合わせることでpositionに合わせた

テキストを表示させることもできます。

まず最初に、ここではオブジェクトリテラルを使いたいのでputメソッドでkeyとvalueを

追加します。

 

sampleActivity↓

</pre>
<pre>Map<Integer, String> contents = new HashMap<Integer, String>();

</pre>
<pre>contents.put(0, "みかん");
contents.put(1, "りんご");
contents.put(2, "ぶどう");
contents.put(3, "すいか");
contents.put(4, "メロン");
contents.put(5, "マンゴー");
contents.put(6, "いちご");
contents.put(7, "パイナップル");
contents.put(8, "洋ナシ");
content = getSharedPreferences("content", MODE_PRIVATE);</pre>
<pre>

 

gridviewを押した時にcontentsに追加したvalueと比較をするので

onItemClickの中で処理をしていきます。

 

</pre>
<pre>//押した項目によって内容が変わる
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    System.out.println(position);
    SharedPreferences.Editor editor = content.edit();
    for(Map.Entry<Integer, String> entry : contents.entrySet()){
        System.out.println(entry.getKey() + ":" + entry.getValue());
       if(entry.getKey() == position){
           editor.putString("key", String.valueOf(entry.getValue()));
           editor.apply();
       }
    }
    Intent intent = new Intent(getApplication(), GetPictureActivity.class);
    startActivity( intent );
}</pre>
<pre>

 

新たにMap.entryでinteger・String型の配列を作ります。

4行目のforで先ほどvalueを入れたcontentsをentry配列に入れているのが分かります。

ここで一つずつgetKeyで得たキーの値と押された番号(int position)が合っているか

確認し、一致すればeditor.applyで保存をします。

値が合うまではずっと回り続けるので空の値が保存されましたーなんてことも

防ぐことができます。

 

次は、遷移先でさきほど取得したvalueの取り出し作業をします。

 

</pre>
<pre>TextView contentsText = findViewById(R.id.contents);
SharedPreferences data = getSharedPreferences("content", MODE_PRIVATE);
String state = data.getString("key", "" );
contentsText.setText(state);</pre>
<pre>

 

こちらでは従来のSharedPreferencesの取り出ししかしていないので特に説明は

しなくても大丈夫そう。

テキストだけ取得する場合はsqlliteで保存したりintentでいちいち手渡しする

必要もなさそうなのでこっちのがいいかなと思っています。

  • この記事いいね! (0)
著者:ym

Windows Update 1903 と KB4514359

昨晩帰り際に仕掛けておいた Windows Update 1903 が、次の日のお昼12:30に終わりました。なんちゅー遅いマシンだ。

その後も Windows Update が残っていたので再起動しましたが、KB4514359 が居座っています。

「更新の履歴」側には「インストールを完了するには再起動が必要です」と出ているけど、何度再起動しても状況は変わらず。まあ「履歴」側に出ているということで完了したと判断しよう。

とりあえず大型更新、無事終了。

  • この記事いいね! (0)
asaba 著者:asaba

【android・googlemap】緯度経度から住所を測定する方法

シンプルですが、画像に含まれた緯度経度を読み込んでテキストに表示する方法です。

 

</pre>
<pre>public void getAddress(double latitude,double longitute) {
    StringBuffer strAddr = new StringBuffer();
    Geocoder gcoder = new Geocoder(this, Locale.getDefault());
    try {
        List<Address> lstAddrs = gcoder.getFromLocation(latitude, longitute, 1);
        for (Address addr : lstAddrs) {
            int idx = addr.getMaxAddressLineIndex();
            for (int i = 0; i <= idx; i++) {
                strAddr.append(addr.getAddressLine(i));
                Log.v("addr", addr.getAddressLine(i));
            }
        }
        String newStr = strAddr.toString();
        String[] names = newStr.split(" ");
        dangerText.setText(names[1]);
        Toast.makeText(this, names[1], Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}</pre>
<pre>

緯度経度さえ用意できてれば簡単に実装することができます。

5行目のgcoder.getFromLocationで緯度経度が取れているか確認してみます。

ログでこんな感じで取れていれば取得成功です。


[Address[addressLines=[0:"日本、〒432-8002 静岡県浜松市中区富塚町1933−1 佐鳴湖パークタウンサウス 2F"]

中身を見てみると、0番目に国名・郵便番号・住所が入っているのがわかります。

今回取りたいものは0番目の情報なので、簡単なfor文で取り出していきます。

取得には成功しましたが、国名と郵便番号はいらないのでsplitで空白別に配列の中に

切り分けていきます。

0:”日本、〒432-8002と静岡県浜松市中区富塚町1933−1の間に空白が一つあるので

住所「静岡県浜松市中区富塚町1933−1」が入っているのは1番目になります。

これで取り出し・加工作業は終了。

格納場所が分かれば後はsetTextやtoastで好きなように扱うことができます。

 

  • この記事いいね! (0)