iOS開発を少しだけ

Android開発は数年経験があるが、iOSは全く経験がなかったので少しだけ齧った。swift本体や周辺のエコシステムも安定しつつあるので、時期としては良さそう。

cookpadの2016インターン用の資料を参考にしながらはてブリーダーを書いている。 cookpadインターン資料を参考にした理由は、比較的新しい事と、僕もAndroidサイドで関わっていて内容を把握しているからだ。 新しいことはとても大事で、iOSは古い記事を見てもswiftの文法が変わりすぎて全然動かない。iOS経験者なら問題ないかもしれないが初心者の場合はなかなか厳しい。インターンの資料もswift3.0ではないので、書き換えが必要な部分があるがXcodeが大体fixしてくれる。加えて資料を執筆しているslightairさんiOS開発で絶対的に信頼している。

また界隈の雰囲気を知るために、妄想iOSアプリ新規開発もとても面白い。

レポジトリは一応公開している Remee。 まだAPIのレスポンスをマッピングして適当なセルに貼っただけの進捗。徐々に整えていきたい。

続きを読む

楽びんを利用した

楽びん!という「24時間/20分以内に商品を届けてくれる」サービスを使ってみた
楽天が試験的に運営しているサービスで、現在は渋谷区・目黒区・港区・世田谷区内のみ利用可能とのこと。
【楽びん!】人気レストランのメニューや日用品を24時間、最短20分~でお届け!

続きを読む

これ以上CustomWebViewで消耗しないためのAndroid用ライブラリ

webviewに半年ほど消耗してるので、カッとなって書いた。

github.com

今まで十数回とWebViewを継承したクラスを作ってきました。
ネイティブアプリでも利用規約やライセンスの表示などは必ずと言っていいほどWebViewを利用します。

残念なことに、AndroidのWebViewはちょっと使いづらいです。
そこでWebView継承したカスタムWebViewを毎回用意するのですが、いつも同じこと書いてるので、少し抽象化して汎用的な便利WebViewをライブラリとして公開しました。

LxWebViewの特徴を簡単に紹介します。

続きを読む

androidの5系の新しいapi(+Rxjava)の調査も兼ねて、小さいはてブアプリ作った

見出し通りの内容ですが、Androidは5.0(Api Level 21)でマテリアルデザインが採用されたこともあって見た目に関わるapiが色々増えました

5系対応のサンプルコードはそこそこみてたんですが実際に触ってみないとわからないことも多いし、仕事にそろそろマテリアル対応とかもありそうなので 土日を使って小さなアプリを作りながら色々触れてみることにしました

今回調査したのは、

  • 左上のクルクルする矢印アイコンの実装方法
  • リップルエフェクト(波紋のように広がるエフェクト)の実装方法
  • サポートライブラリがどこまで対応してるか
  • RecyclerViewの実装方法

加えて、最近流行っているRxJavaも気になっていたので、[ネットワーク通信] -> [リストアダプターに流し組む]部分をRxJava(+Retrofit)で実装しました

クルクルする矢印アイコンの実装方法

クルクルする矢印のアイコンはサポートライブラリで提供されていて、
利用するにはappcompat-v7をいれます

compile 'com.android.support:appcompat-v7:21.+'

あとはこんな感じのテンプレコードを書けば動きます。

drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.start, R.string.stop);
drawerToggle.setDrawerIndicatorEnabled(true);
drawerLayout.setDrawerListener(drawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return drawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);
    }

ActionBarDrawerToggleってv4のサポートライブラリの方にもあって、それに気づかないと結構ハマります

リップルエフェクト(波紋のように広がるエフェクト)の実装方法

リップルエフェクトもデフォルトのものは、SDKが提供してくれていて、
エフェクトを掛けたいviewのbackgroundに指定します

android:background="?android:attr/selectableItemBackground"

実はもう一種類あって

android:background="?android:attr/selectableItemBackgroundBorderless"

こっちはviewを跨いだ波紋が広がるエフェクトになるっぽい? のですが、minSDKが21なのでLollipopにしか使えません。

RecyclerViewの実装方法

Adapterを作るのはListViewを同じ、RecyclerView.Adapterの実装は簡略化すると概ねこんな感じ、

public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.ViewHolder> {
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // viewをinflateしてViewHolderを作成する
        View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.cell_xxx, parent, false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    // getView相当の処理(view.setText() etc...)
    }
    @Override
    public int getItemViewType(int position) {
        return // viewTypeを返す;
    }
}

昔のAdapterの実装とほとんど変わんないのですが、新しい概念としてViewTypeというのが追加されてて
複数のviewをレンダリングするタイプのリストを作成したい場合はgetItemViewTypeをOverrideしてよしなに出来る
Activity側はこんな感じ

RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
entryAdapter = new EntryAdapter();
recyclerView.setAdapter(entryAdapter);
サポートライブラリがどこまで対応してるか

これは正直ちゃんと調べてないのでわからないですが、少なくとも上の3つはサポートライブラリで対応できました!!
(気になるの他に何かあったかな..)

RxJava

[ネットワーク通信] -> [リストアダプターに流し組む]はこんな感じに書ける
そこそこ複雑なリストの処理してるけど、とても完結でわかりやすく書ける
学習コスト低いのでコスパ的に考えるとかなりいい気がする 特にRetrofitがRxjava対応していてホント便利だった
使い方は、wikiサンプル見れば簡単な処理ならすぐ書けそう

        category.observable(app)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(() -> {
                // something..
                })
                .onErrorReturn(throwable -> {
                // something..
                })
                .map(entries -> {
                // something..
                })
                .flatMap(Observable::from)
                .groupBy(entry -> {
                // something..
                })
                .subscribe(observable -> {
                    if (observable.getKey() == EntryType.onlyTitle) {
                        observable.subscribe(entryAdapter::add);
                    } else if (observable.getKey() == EntryType.WithImage) {
                        observable
                                .buffer(2)
                                .filter(// something )
                                .subscribe(entryAdapter::add);
                    }
                });
今回作ったアプリ

5.0用のサンプルアプリ程度の気持ちで作ってたんですが、
やる気が続いたら継続的に開発するつもりです

(日記)久しぶりにイヤフォン買った

[結論]
XBA-H3最高すぎるから買った方がいい

昔からいわゆるオーディオオタクで,あれやこれやと色々イヤフォン買ってた

2008年あたりがピークで,当時は価格コムのヘッドフォン・イヤフォンページに常駐して, 情報を集めるのが日課になってた,その頃は学生でバイトもしてなかったのでそれこそ年に一回お年玉を使って高いイヤフォンを買うみたいな感じだったので本当にミスれないという気持ちだったのを覚えてる

今まで買ってきたイヤフォンは列挙すると

少しでも高級イヤフォンの世界に足を踏み込んだことがあればわかると思うんだけど,ほんとに沼にはまっていく感じで徐々に高いのが欲しくなってくる.4,5万の世界になってくるとヘッドフォン買ったほうがいい気もしてくるし,DAP(音楽プレイヤー)選びとかやポータブルアンプも揃えたくなってくる.そうなってくるといよいよ学生にとっては手を出せない価格帯になってくるので2-3年ほとんど高いイヤフォンとかは買わなくなった.

この春から働くようになったんだけど,職場は結構騒がしいので仕事中音楽聞いてる.たまたま僕の周りのエンジニアの方たちがイヤフォンとか詳しい人が多くて,いろいろ話してたらまたイヤフォン熱が高まってきていて,つい一昨日くらいにamazonで final audio designってところのPiano Forte Ⅱっていうのをポチった.

このイヤフォンは3000円くらいでとても良心的な価格なんだけど,めっちゃコスパ高くていい音がする.あと形状がカナル型なんだけどイヤーピースはなしっていう不思議なデザインを採用してて面白い.とはいっても価格相応な部分もあって,ジャンルを選ぶ感じでゴリゴリのライブ風イコライザーがかかっているように聞こえる曲もあったり,ck-9とか好きな人間からすると中音から高音にかけての解像度の低さが気になった(ミサワ顔)

そんな不満を抱えた状態で久しぶりに価格コム見てたら,SonyXBA-H3ってのを見つけた レビューとか見てるとどこもかなりいい評価してて,なんかどうしようなく欲しくなってさっき渋谷のビックカメラ行って衝動買いしてきた.

結論から言うとこの機種は本当に素晴らしかった
ダイナミックドライバ一つと2系統のBA(バランスド・アーマチュア)ドライバを備えた超豪華フラグシップモデルだけあって,音の分離が素晴らしくて,とても自然な感じになっている.想像していたよりかなり低音は強かったのでイコライザで多少調節してしまっているけど,音のバランスもかなり好みだった(ミサワ顔) しかもこの機種はコードが交換できるので断線してしまっても安心できるし,共通の規格に準拠はしてないらしいけどSHURE製のコードとかも刺さるらしい. 唯一難点をあげるなら本体がちょっとでかいかなーという気もするけどしょうがない気もする.だいぶ高い買い物だけどイヤフォンの沼をやっと抜けれたと思うとまあいいかなって思う

ちなみにヘッドフォンはUltimate Ears UE 6000 ってやつ使ってて,かなり好みが分かれそうな機種なんだけど高音が綺麗でオススメです.

次は小さいタイプのUSBアンプほしいなー