2018年5月1日火曜日

[Tennis]東京都稲城市周辺の硬式テニスのガットを張ってくれるお店情報


-->

-->
購入ガット持ち込みガット最終確認日備考
カムイ若葉台店100030002018/5店頭に無いガットも注文すれば入手可能な場合あり(Yonexマルチセンス125を注文しました)
テニスサポートセンター(仙川店)2160?2018/5
ラケットショップフジ129612962018/5川崎駅周辺
持ち込みガットの場合張り上げまで時間がかかるときあり(2-3日)
テニスショップウェイ新百合ヶ丘??2018/5
ウィンザーテニスショップ聖蹟桜ヶ丘??2018/5
Let's Tennis School
Sports Authority86421602018/5
スポーツデポ ぐりーんうぉーく多摩店
フジスポーツ 本店(武蔵小杉)900?2018/5
ラック 溝ノ口店
税込み

-->-->-->-->-->-->

2018年2月11日日曜日

[Android]LINEアプリでOS設定のアプリ権限で「位置情報」をOFFにすると動作が遅い


いつからかAndroid上のLINEアプリケーションの動作がおかしくなりました。

例えば:

  1. ボタン部分を押しても押したことを一回無視される。
  2. IMEを有効にしてHOMEボタンを押してLINEを一度back groundに移動して、再度LINEを起動すると、IMEの表示→非表示まで時間がかかる。
その後手元の端末だけの問題と分かりlogcatでエラーが出ていないか調べてみました。

以下の通り、BLEの処理をしているけど、PERMISSIONが無いためexceptionが出ていました。

そこで、OS設定のアプリ権限でLINEの「位置情報」を「ON」に変更したところ改善しました。個人的には不要なパーミッションはOFFにしたいので、改善して欲しいところです。

環境
Android 8.1
LINE 8.1.1

問題発生時のlogcat


02-10 17:11:09.157 2124-2124/? I/GoogleInputMethod: onFinishInput() : Dummy InputConnection bound
02-10 17:11:09.157 2124-2124/? I/GoogleInputMethod: onStartInput() : Dummy InputConnection bound
02-10 17:11:09.161 883-944/? I/ActivityManager: Displayed jp.naver.line.android/.activity.chathistory.ChatHistoryActivity: +194ms (total +254ms)
02-10 17:11:09.185 2124-2124/? I/GoogleInputMethod: onFinishInput() : Dummy InputConnection bound
02-10 17:11:09.224 3181-3181/? V/View: dispatchProvideAutofillStructure(): not laid out, ignoring 0 children of 1073741840
02-10 17:11:09.224 3181-3181/? V/View: dispatchProvideAutofillStructure(): not laid out, ignoring 1 children of 1073741843
02-10 17:11:09.225 3181-3181/? V/View: dispatchProvideAutofillStructure(): not laid out, ignoring 0 children of 1073741853
02-10 17:11:09.225 3181-3181/? V/View: dispatchProvideAutofillStructure(): not laid out, ignoring 3 children of 1073741862
02-10 17:11:09.226 3181-3181/? V/View: dispatchProvideAutofillStructure(): not laid out, ignoring 4 children of 1073741874
02-10 17:11:09.226 3181-3181/? V/View: dispatchProvideAutofillStructure(): not laid out, ignoring 4 children of 1073741875
02-10 17:11:09.228 883-22436/? W/Binder: Outgoing transactions from this process must be FLAG_ONEWAY
                                         java.lang.Throwable
                                             at android.os.BinderProxy.transact(Binder.java:752)
                                             at android.app.assist.AssistStructure$ParcelTransferReader.fetchData(AssistStructure.java:407)
                                             at android.app.assist.AssistStructure$ParcelTransferReader.go(AssistStructure.java:343)
                                             at android.app.assist.AssistStructure.ensureData(AssistStructure.java:2100)
                                             at com.android.server.autofill.Session$1.send(Session.java:227)
                                             at com.android.server.am.ActivityManagerService.reportAssistContextExtras(ActivityManagerService.java:13272)
                                             at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2472)
                                             at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2919)
                                             at android.os.Binder.execTransact(Binder.java:697)
02-10 17:11:09.229 3181-3181/? I/AssistStructure: Flattened final assist data: 12784 bytes, containing 1 windows, 56 views
02-10 17:11:09.250 883-2370/? I/AssistStructure: Flattened final assist data: 12672 bytes, containing 1 windows, 56 views
02-10 17:11:09.463 698-698/? D/QCOM PowerHAL: LAUNCH HINT: OFF
02-10 17:11:09.799 3181-3219/? E/System: Ignoring attempt to set property "java.net.preferIPv6Addresses" to value "false".

2018年1月21日日曜日

[Google Assistant, IFTTT] Google Homeに話しかけてhttp://diet.dyndns.orgの体重グラフを自動Update


Google Home/Assistantに話しかけて体重グラフを自動で更新する方法

[2018/1/24] 体重にいわゆる半角全角が混ざっている場合にうまく半角に出来ない問題があります。近日修正予定です。
[2018/1/25] 半角全角が混ざるのではなく、61.2kgといったときに "6[半角スペース]1.2kg"という文字送られてきているのが問題でした。スペースを削除するようにしました。
[2018/2/18] IFTTTの返事文言を変更しました。
[2018/2/21]体重グラフのWebページがhttps化されたため。Google App Scriptを変更しました(http→https)。
[2018/3/16] Amazon Alexa用のskillを作成し、現在Amazonの審査中です。公開でき次第こちらにも記載します。また時間がとれればGoogle Assistant用のアプリも作成できればと思います(機能は本IFTTT版とほぼ同じです)
[2018/3/23] Amazon Alexa用skillとして、「体重グラフ」を公開しました。ご要望があれば、weight-graph at sanpei.org にメールください。Google Assistant用のアクション(アプリ)も作成予定です。
[2018/3/25] Google Assistant(Google Home)用のアクションとして「体重グラフ」をGoogleに公開申請しました。公開できましたらこちらに記載します。
[2018/3/27] Google Assistant(Google Home)用のアクションとして「体重グラフ」をGoogleに公開しました。そのため以下の内容は技術的な参考として引き続き掲載します。

各スキル・アクションのコードは以下のgithubで公開中です。

Amazon Alexa用skill code

Google Assistant用Action code



以下の設定の説明します。

1) IFTTTの設定
2) Google App Scriptの説明

1) IFTTTの設定


1-1) IFTTTの設定のポイント
1-1-1) IFの"Say a phrase with a text ingredient"の利用
当初は体重は数字なので"Say a phrase with a number"を使っていましたが、Google Assistantが体重部分をいわゆる全角で認識する場合があり、そうすると数字ではなく文字列になりました。そのため、現在は"Say a phrase with a text ingredient"を利用しています。
1-1-2) Languageは日本語(Japanese)に変更しています。

2) Google App Script

2-1) Google App ScriptはIFTTTと連携するGoogle DriveのGoogle Sheetで[Tools]->[Script editor...]で開いて入力ください(本例では、"IFTTT/sanpeiweight"の"Google Assistant Commands")

2-2) Google App Scriptの操作方法はこちらのYouTubeが参考になりました。
[Resources] -> [All your trigger]か以下のボタンからTrigger追加してください。

2-3) diet.dyndns.orgのユーザー名とパスワードは、Google Sheetのシート名[Auth]のB1セルにユーザー名、B2セルにパスワードを入力してください。

2-4) 簡単な各関数の説明
関数addDate:
A) IFTTTでThen "Add row to spreadsheet"でなぜか"Add row to spreadsheet"をしても正しくCreatedAtが入らないためGAS側でA列に日付を入れています。
B) Google Assistantが時々いわゆる全角文字で体重を認識するため全角を半角に変換しています。-->[2018/1/25] 全角ではなく、数字の途中に不要なスペースが入る場合がありその削除対応をしています。
C) updateDietの呼び出し

関数updateDiet:
A) Diet.dyndns.orgと通信しながら、現在の時刻で体重を記録します。


function addDate(e) { 
  var authSheetName = "Auth";
  var activeSheet = SpreadsheetApp.getActiveSheet();
  if (activeSheet.getName() != authSheetName) {
    var lr = activeSheet.getLastRow(); 
    var weight = activeSheet.getRange(lr,2).getValue().toString();
    weight = zenToHan(weight);
    activeSheet.getRange(lr, 2).setValue(weight);
    var CurrentDateString = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MMM d yyyy HH:mm:ss");
    activeSheet.getRange(lr, 1).setValue(CurrentDateString);
    
    updateDiet(weight, authSheetName);
  }
}

function updateDiet(weight, authSheetName) {
  var bk = SpreadsheetApp.getActiveSpreadsheet();
  var authSheet = bk.getSheetByName(authSheetName);
  var userId = authSheet.getRange(1,2).getValue().toString();
  var password = authSheet.getRange(2,2).getValue().toString();
  
  // 1. open login page
  var LOGIN_URL = "https://diet.dyndns.org/?cmd=login&user="+userId+"&password="+password
  var response = UrlFetchApp.fetch(LOGIN_URL, {'followRedirects': false, 'muteHttpExceptions': false});
  Utilities.sleep(1000);

  var headers = response.getAllHeaders();
  var cookies = [];
  if ( typeof headers['Set-Cookie'] !== 'undefined' ) {
    // Set-Cookieヘッダーが2つ以上の場合はheaders['Set-Cookie']の中身は配列
    cookies = typeof headers['Set-Cookie'] == 'string' ? [ headers['Set-Cookie'] ] : headers['Set-Cookie'];
    for (var i = 0; i < cookies.length; i++) {
      // Set-Cookieヘッダーからname=valueだけ取り出し、セミコロン以降の属性は除外する
      cookies[i] = cookies[i].split( ';' )[0];
    };
  }
  
  // 2. open redirect page
  REDIRECT_URL = "https://diet.dyndns.org/?cmd=user&";
  var options = {
    method : "POST",
    contentType: "application/x-www-form-urlencoded",
    headers: {
      Cookie: cookies.join(';')
    },
  };
  response = UrlFetchApp.fetch(REDIRECT_URL, options);
  Utilities.sleep(1000);
  
  // 3. set weight
  WRITE_URL = "https://diet.dyndns.org/";
  var date = new Date();
  var timeZone = Session.getScriptTimeZone();
  var year = Utilities.formatDate(date, timeZone, "y");
  var month = Utilities.formatDate(date, timeZone, "M");
  var day = Utilities.formatDate(date, timeZone, "d");
  var hour = Utilities.formatDate(date, timeZone, "H");
  weight = weight.toString();
  var options = {
    method : "POST",
    contentType: "application/x-www-form-urlencoded",
    headers: {
      Cookie: cookies.join(';')
    },
    payload : {
      year: year,
      month:month,
      day:day,
      hour:hour,
      weight:weight,
      comment:"",
      cmd:"user",
      mode:"input"
    }
  };
  response = UrlFetchApp.fetch(WRITE_URL, options);
}

function zenToHan(s) {
  s = s.replace(/[0-9.]/g, function(s) {
      return String.fromCharCode(s.charCodeAt(0) - 65248);
  });
  return s.replace(/ /g, "");
}


ちなみに、バックアップも兼ねて以下のようにGoogle SheetにもA列に日時、B列に体重が入ります。



2017年7月17日月曜日

[Ruby] first monkey patch(Mechanize::Form::SelectList )

This is my first monkey patch(for Mechanize::Form::SelectList)

This monkey patch is even if the SelectList is not multiple, we can clear selectitems by select_none(original code was set first.value when select_none).

class Mechanize::Form::SelectList < Mechanize::Form::MultiSelectList
  def value
    value = super
    if value.length > 0
      value.last
    elsif @options.length > 0
      # @options.first.value
      nil
    else
      nil
    end
  end
end

2017年4月13日木曜日

potatotips #39 (iOS/Android開発Tips共有会)2017年4月13日に参加レポート

potatotips #39 (iOS/Android開発Tips共有会)2017年4月13日に参加してきました。
Android ブログ枠で参加しましたので、レポートします。

会場の「株式会社サイバーエージェント」は部屋が横長でちょっと話しにくそうでした。

https://potatotips.connpass.com/event/51176/

プレゼンテーションが公開されたら適宜リンクしていきます。

2. すたーほしさん:「iOS が fastlane なら Android も fastlane に乗って

みては?」



 - iOSで継続的デリバリー --> fastlaneを使う
   - 人間がやっていたことを自動化できる。
 - gradleでできることは、fastlaneでできる
 - fastlaneはGoogleの仲間に入った
 - fastlaneは、lane で対応している。
    - 雰囲気はiOSと同じ感じで対応できる。
 - fastlaneのgradleに比較したメリット
    - iOSと同じ感じでlaneを作れる。
    - ...
 - fastlaneのデメリット
    - rubyなども必要

  - fastlaneの設定例も公開しているので参照してみてください(Android/iOS)

https://github.com/starhoshi/fastlane-example

4. しゃのんさん「Android Javaの既存プロダクトをKotlinで書き換えている話」

- Android JavaアプリをKotlin x DataBindingに移行中

- 今までのアプリの状況
  - WebView版リリース
  - Native Appは7割完成しかし古いlibraryなど使う
  - この機会にKotlinに行こう

- Binding
  - ButterKnife6を利用していた
  -  Butterknife8にしたけどいまいち

- 攻めの構成(Kotlin x Databindで行けた理由
  - まだリリースしていないプロダクトだったので心の余裕あり
  - ペアcodingなどを導入

- 現状
  - 7割方Kotlin移行済み


6. さとしゅんさん「AutoDisposeとRxLifeCycleの話」

- RxLifeCycleとは
  - 非同期処理に対してdisposeをすればキャンセルできる。
  - 課題、ストリーム定義とストリームキャンセル部分が**離れている**
  - composeでPAUSE時にどうするこうすると、Observable定義時にキャンセルをかける

- RxLifecycleは、takeUntilオペレータに依存している
  - そのためdisposableと違う挙動になる。
  - Single, Completable時にonErrorが呼ばれる。

- AutoDispose
  - RxLifecycleの困った点を解決
  - Disposeと同じ挙動になる[OK]
  - .to(new Observable....)
  - AutoDisposeの欠点
    - toオペレータはストリームチェインを破壊するので最後に各必要がある。

8. いまけいさん「Sending Simple Data to Other Apps」

- グリッドでのアプリリストの出し方。
  - 普通に作るとListになる。
  - Intent.createChooser(sendIntent,....)とする
- 使い分け方
  - Listの方法
    - 任意のアクションを別のアプリで行いたい
    - コンテンツを別のアプリで開きたい
  - Grid
    - 現在見ているコンテンツを共有したい

10. きーすよこまさん「What’s new in Android O WindowManager」

- WindowManagerでいっぱいdeprecated APIとなっている。
  - DroidKaigi2017で説明した部分がのきなみdeprecated
- Application Overlayが追加された(TYPE_APPLICATION_OVERLAY"
- 整理された感じ

関連書籍: Colorful Android

12. こばけいさん「俺たちが欲しかった下タブはコレジャナイ」

- 下タブ
  - サポートライブラリーの対応はいまいち
    - タブ6枚以上でクラッシュなどなど
  - 3rd party
    - Matrial Guideline準拠
    - タイトル常に表示可能
    - などなど使いやすい

    - BottomBar
      - GOOD
         - 実績多数
         - セットアップがXML
         - Tablet
      - BAD
         - FAB連携ない
         - バッジが数字しかない。

    - ahbottomnavigation
      - GOOD
         -FAB対応、バッジ文字列対応
      - BAD
         - XML未対応など..

   - BottomNavigation
      - GOOD
         - FAB対応
         - バッジ対応
      - BAD
         - XML未対応など..

  - お勧めは?
      - FABを使って、タブレット非対応
        - ahbottomnavigation
     -  それ以外BottomBar

     - SupportLibraryは使う意味ない...


14. まぎーぷーさん「Autofill Framework」

- Android Oから入ったAutofill Framework
- ユーザーさんは面倒な作業やタイプミスが防げる
- Android Oに最適化されます。
- Mobile側に設定が必要
  - Settings -> Apps & Notification....

- TextViewは特になにもしなくてもOK
- CustomView/GLSurfaceViewなど
  - 面倒な対応必要

- AutoFillService
  - 認証情報を提供する
  - 1 Password

- FillResponse
  - アプリ側に返ってくる情報
    ...
  - onProvideAutoFillStructure
  - onProvideAutoFillVirtualStructure
     などで、テキストフォームがある情報をAutoFillServiceに通知

  - エミュレータでもうまく動かない
    - エミュレータのバグがまだあるらしい

2017年4月9日日曜日

[FreeBSD] how to install eMMC from SD-Card

I wrote boot image after boot from SD-Card.

# dd if=FreeBSD-12.0-CURRENT-arm-armv6-BEAGLEBONE-20170323-r315864.img of=/dev/mmcsd1 bs=10240 conv=sync

related infomation

https://wiki.freebsd.org/FreeBSD/arm/BeagleBoneBlack

currently below messages were outputed at u-boot. Unfortunately I do not know how to fix this issue. But after some seconds(about 5-10s), it will boot automatically.

Card did not respond to voltage select!