SearchViewを虫眼鏡アイコンタップ以外でも展開したい
やりたいこと
Androidで検索機能を実装するときに利用できるSearchViewというコンポーネントがあります
タップすると検索テキストが入力できて、決定するとリスナーが呼ばれる便利なやつです
SearchViewを何も設定せずに使うと👇のように虫眼鏡アイコンをタップしたときに検索テキストが入力できるようになります
appbarとかでSearchViewを使用する場合の挙動としてはこれでいいと思うのですが、自分は虫眼鏡アイコンより右側の領域をタップした場合もテキスト入力できるようにしたかったのでその方法を探しました
結果
結果は👇になります
方法
テキスト入力領域を展開するという処理を明示的に呼び出せば良いのですが、そういったわかり易い名前のメソッドはSearchViewにはありません
正確にはSearchView#onSearchClickedというメソッドがあるのですが、残念ながらpackage privateです
しかし、SearchView#setIconifiedというメソッドがあり、これがpublicメソッドです
public void setIconified(boolean iconify) { if (iconify) { onCloseClicked(); } else { onSearchClicked(); } }
ということでSearchViewのonClickListenerでsetIconifiedをfalseで呼び出してやると虫眼鏡以外のSearchViewの領域をタップしたときでも検索テキストが展開できます
以上
graphql-spring-boot サンプルコード
ディレクトリをブックマークするCLI
特定のディレクトリに移動してなにか作業を行うことってよくあると思います
最近同じディレクトリに移動してなにかしたいことが多くて、ただそのたびにディレクトリをcdして移動していくのがとてもめんどくさく感じてきました
なので、ブックマーク的にディレクトリの場所を保存、削除できてブックマークしたディレクトリに移動できるCLIを作りました
シェルスクリプトで書いてもよかったんですが、最近Goの勉強していてGoでCLI作りたい欲が高まっていてちょうどよかったのでGoを使いました
サブコマンドとかフラグとかの処理は結構楽に書けるのでいいですね
Goの書き方としてはまだまだまだまだだと自覚してるので極力直していきます
peco使いたくて結局Go内でコマンドを直接実行させてしまっているのがあれな感じなのでpeco的なGoライブラリがあればよかったんですが、見つからず断念
結局クロスプラットフォームで動かしたいという当初の目標のひとつは諦めてしまい、無念・・
精進します
CoordinatorLayoutでAppBarLayoutと連動してスクロールするWebView
AndroidのUIでツールバーとコンテンツ領域が連動してツールバーが広がったり縮まったりするやつありますよね
Mastering the Coordinator Layout · Saúl Molinero
あれはCoordinatorLayoutというLayoutを使って実装されているんですが、コンテンツ領域のViewとして使えるものが限られています
例えばRecyclerViewとかNestedScrollViewとか、NestedScrollingChildインタフェースを実装しているクラスとなら一緒に使えます
ただ今回WebViewを使いたかったんですがWebViewではNestedScrollingChildが実装されていないので素のままだとCoordinatorLayoutと一緒に使えません
これについては同じことで困っている人も何人かいるようで、調べてる最中にtwitterとかstackoverflowとかで見かけました
Android の WebView と CoordinatorLayout を組み合わせたいけどどうするのがええんや……。 (WebView が NestedScrollingChild インターフェイスを実装してないから困る。)
— Nobuoka Yu (@nobuoka) 2016年1月21日
NestedScrollingChildの実装が結構難しいんですよね。。
NestedScrollViewのなかに入れることもやってみたんですが、思った動きにならなかったので結局WebViewを継承したクラスにNestedScrollingChildを実装しました
実装の都合上AppBarLayout側でも処理が必要だったのでAppBarLayoutを継承したNestedWebViewAppBarLayoutも一緒に使う必要があります
正直AppBarLayoutにも手を加えているのがちょっと微妙な気もしています ふーむ
RecyclerViewとNestedScrollViewの実装を見ながら雰囲気で実装したので変なところも多々あるかもしれません
あとAnrdoidの書き方的に変な部分もあるかもしれません
どんなPRでももらえると泣いて喜びます
issueだけでも歓迎です
ミーティングのすゝめ
普段ウェブサービスのエンジニアとして働いており、新機能の追加や改善などでミーティングをする機会が度々あります
そのなかでもっとこうすれば良いミーティングができるのではと感じることがいくつかあったので夜中の勢いでスライドにしました
スライドを作ってから現時点まで半年くらい経過していたようですが、せっかくなので公開しようと思います
あくまで自分の観測範囲でのことなのであらゆる環境にあてはまることではないと思いますが、すこしでも良いミーティングが増えれば幸いです
Spring BootのJackson時刻設定まとめ
Spring Bootでオブジェクトをシリアライズするときにjava.util.Dateの変換を良きに計らってほしいときの設定
フォーマットとタイムゾーンの組み合わせで出力が変わってくるのでまとめてみた
下記のようなapplication.ymlに設定を書いていると想定
spring: jackson: dateFormat: yyyy-MM-dd'T'HH:mm:ss.SSS'Z' time-zone: Asia/Tokyo
dateFormatとtime-zoneの設定を変えていく
dateFormatが4パターンとtime-zoneが2パターンで計8パターンを試した
出力はすべて同時刻の値
dateFormat | time-zone | 出力 |
---|---|---|
yyyy-MM-dd'T'HH:mm:ss.SSSZ | Asia/Tokyo | 2015-03-23T02:07:34.000+0900 |
yyyy-MM-dd'T'HH:mm:ss.SSSZ | 設定なし | 2015-03-23T02:07:34.000+0000 |
yyyy-MM-dd'T'HH:mm:ss.SSS'Z' | Asia/Tokyo | 2015-03-23T11:07:34.000Z |
yyyy-MM-dd'T'HH:mm:ss.SSS'Z' | 設定なし | 2015-03-23T02:07:34.000Z |
com.fasterxml.jackson. databind.util.ISO8601DateFormat |
Asia/Tokyo | 2015-03-23T02:07:34Z |
com.fasterxml.jackson. databind.util.ISO8601DateFormat |
設定なし | 2015-03-23T02:07:34Z |
設定なし | Asia/Tokyo | 1427076454000 |
設定なし | 設定なし | 1427076454000 |
設定なしっていうのはdateFormato: とかの行ごと消してるの意味
最後にシングルクォートなしのZをつけるとtime-zoneによって時差分の値が出力される
シングルクォートありだと+0900のかわりに時差分も時刻の中に含まれて計算される
com.fasterxml.jackson.databind.util.ISO8601DateFormatのときもtime-zoneの設定したら時刻に時差が含まれて計算されるのかと思ったらこっちは時差がスルーされた。なんでや・・・
両方設定なしだとlongな値で返ってくる. 当たり前だけど時差とか関係ない表記だからtime-zone指定しても同じ値になる
以上!
サーバ・Gitブランチ管理ツールつくりました
最近プロジェクトの開発環境を徐々に変えていまして、いままでは複数の案件の変更をstagingブランチにまとめたうえで1台の動作確認用サーバにデプロイしていたんですが、やっぱり案件ごとに確認したいだろうということで案件の数だけサーバを用意してそれぞれに案件のブランチをデプロイする環境に移行しています。
しかし、こういう体制に移行しようという話が出た時からの懸案事項がありました。
つまり、どのサーバにどのブランチがデプロイされているのか混乱しないのかと
うっかり他の人が使っているサーバにデプロイしてしまっては、殴り合いが起きかねません。大変です。
これを解決するために、現在各サーバにデプロイされているブランチを一覧できるツール Pigeonholeをつくりました(真の目的はScalaの練習だったりするんですが)
このツールでは下の図のような表形式でサーバとブランチの対応関係を表示します
Pigeonholeのポイントはこの対応関係の登録方法です
PigeonholeではHTTPのPOSTリクエストを受け付ける口を持っていて、そこにJSON形式でホスト名とブランチ名の対応関係を投げることによって登録が行われます
これによって、CIでデプロイしたあとにPigeonholeにリクエストを投げることによって自動的に登録、更新を行うことができます
HTTPリクエストは以下のような感じ
curl -X POST -d Payloads={\"host\":\"${HOST_NAME}\"\,\"branch\":\"${BRANCH_NAME}\"} http://<Pigeionholeのホスト>:<ポート>/hook/deploy
今はプロジェクトで試験稼働中です