hogepiyoエンジニアリング

トラブルシューティングからノウハウ、作ってみた系まで扱う情報系ブログ

SearchViewを虫眼鏡アイコンタップ以外でも展開したい

やりたいこと

Androidで検索機能を実装するときに利用できるSearchViewというコンポーネントがあります

タップすると検索テキストが入力できて、決定するとリスナーが呼ばれる便利なやつです

SearchViewを何も設定せずに使うと👇のように虫眼鏡アイコンをタップしたときに検索テキストが入力できるようになります

f:id:marshi:20180930020554g:plain

appbarとかでSearchViewを使用する場合の挙動としてはこれでいいと思うのですが、自分は虫眼鏡アイコンより右側の領域をタップした場合もテキスト入力できるようにしたかったのでその方法を探しました

結果

結果は👇になります

f:id:marshi:20180930021013g:plain

方法

テキスト入力領域を展開するという処理を明示的に呼び出せば良いのですが、そういったわかり易い名前のメソッドは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 サンプルコード

最近GraphQLについて調べているんですが、いろいろな言語でGraphQLサーバの実装があるらしいです

graphql.org

普段Springを使うことが多いので、数あるサーバ実装のなかでもgraphql-javaを使ったgraphql-spring-bootを試してみようと思います

github.com

今回はgraphql-java-toolsというライブラリも併用していきます

これによってGraphQLの各フィールドの取得処理をスキーマに対応したResolverを実装することで、GraphQLのレスポンスを構築することができます

github.com

実装したサンプルは以下です

github.com

細かい説明はリポジトリのREADMEに書いていこうと思います

ディレクトリをブックマークするCLI

特定のディレクトリに移動してなにか作業を行うことってよくあると思います

最近同じディレクトリに移動してなにかしたいことが多くて、ただそのたびにディレクトリをcdして移動していくのがとてもめんどくさく感じてきました

なので、ブックマーク的にディレクトリの場所を保存、削除できてブックマークしたディレクトリに移動できるCLIを作りました

github.com

シェルスクリプトで書いてもよかったんですが、最近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とかで見かけました

stackoverflow.com

NestedScrollingChildの実装が結構難しいんですよね。。

NestedScrollViewのなかに入れることもやってみたんですが、思った動きにならなかったので結局WebViewを継承したクラスにNestedScrollingChildを実装しました

github.com

実装の都合上AppBarLayout側でも処理が必要だったのでAppBarLayoutを継承したNestedWebViewAppBarLayoutも一緒に使う必要があります

正直AppBarLayoutにも手を加えているのがちょっと微妙な気もしています ふーむ

RecyclerViewとNestedScrollViewの実装を見ながら雰囲気で実装したので変なところも多々あるかもしれません

あとAnrdoidの書き方的に変な部分もあるかもしれません

どんなPRでももらえると泣いて喜びます

issueだけでも歓迎です

ミーティングのすゝめ

普段ウェブサービスのエンジニアとして働いており、新機能の追加や改善などでミーティングをする機会が度々あります

そのなかでもっとこうすれば良いミーティングができるのではと感じることがいくつかあったので夜中の勢いでスライドにしました

スライドを作ってから現時点まで半年くらい経過していたようですが、せっかくなので公開しようと思います

www.slideshare.net

あくまで自分の観測範囲でのことなのであらゆる環境にあてはまることではないと思いますが、すこしでも良いミーティングが増えれば幸いです

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の練習だったりするんですが)

github.com

このツールでは下の図のような表形式でサーバとブランチの対応関係を表示します


f:id:marshi:20150712005717p:plain

Pigeonholeのポイントはこの対応関係の登録方法です

PigeonholeではHTTPのPOSTリクエストを受け付ける口を持っていて、そこにJSON形式でホスト名とブランチ名の対応関係を投げることによって登録が行われます

これによって、CIでデプロイしたあとにPigeonholeにリクエストを投げることによって自動的に登録、更新を行うことができます

HTTPリクエストは以下のような感じ

curl -X POST -d Payloads={\"host\":\"${HOST_NAME}\"\,\"branch\":\"${BRANCH_NAME}\"} http://<Pigeionholeのホスト>:<ポート>/hook/deploy

今はプロジェクトで試験稼働中です