22時に寝ようと思って2時に寝る。

備忘録や日記を書いてます。きょうは早く寝よう。

MacbookAirを買った

MacbookAirを買いました。

―なぜ突然、Macbookを買ったのですか?

いや、別に突然じゃないんですけどね(笑)ずっと欲しかったんです、Macbook。 一年前から「Macbookほしい」とひとりごとのように言ってたような気もしますね。 今までは、LenovoIdeapad Yoga13っていうのを高校生の時から使ってて、愛着がすごいあって。 でも、なんかどこか物足りなさを感じてたんです。スペック的には必要十分なんですけど。 だけど、Yoga13には”何かが足りない”なと。

―”何か”とはいったい?

いや、実は自分でもよくわからないんですよ(笑) でも、使ってみて、Macbookには”それ”があったのは分かるんです。 しいて言えば、その何かの一つは”洗練されたデザイン”、でしょうか? はじめてMacbookにふれていじったとき、「継ぎ目なさすぎでしょ」って口にしてしまうくらい綺麗なボディで、感動しました。 あと、ボディがアルミなのですごい冷たいんです。最近、秋、というかもう初冬を感じる季節になりましたよね。熱伝導性が非常に優れているんだな、と。 ちなみにヤマト運輸で届いたのですが配送トラックがクール便だったみたいで、 ボディに手をかざしただけで曇ってて、冷えすぎでしょ、みたいな(笑) 匂いもなんだか新品のにおいがして、「お、シリコンバレーのにおいかな?」ってなりました。

Macbookの製造国は中国ですよね。

あ、そうなんですか。

―MacbookProではなくMacbookAirを買った理由はなんですか?

ちなみに僕は今回、MacbookAir 13.3/1.6GHz/8GB/128GB/USキーボード/Mid2015 モデルを買いました。 ProかAir、最後の最後まで迷ったんですよ。 たいていハイスペックで損することなんて、ないじゃないですか。 何よりRetinaディスプレイか、そうでないか、の違いがある。 13.3インチだとほとんど、重さも変わらないみたいですし。

でも、本当にそんなスペック必要かな?と考えた時…、必要ないかもなって。 今まで使っていたYoga13は特に重いとも感じないくらい軽快だったんですよね。 で、今回買ったMacbookAirのほうがYoga13より全体的にスペックが高くて。 もちろんOSなどいろいろ条件は違うのですが。

あと、自宅にそこそこのスペックの自作機があったので、重たい処理はそっちでカバーしようって考えました。

以上のことをトータルで考えたとき、薄くてちょっとでも軽く、バッテリー駆動時間が長いAirがいいかなと。さすがにメモリは4GBだと不安だったので8GBに変更しました。

SSDは128GBで足りるのですか?

それも、結構悩みました。これもYoga13の経験から考えました。ちなみにメモリを8GBにして、SSDを256GBに変更すると、ほぼProが買えてしまうくらい値段になります。 Yoga13は128GBのSSDだったのですが、定期的にボリュームの大きいファイル(普段参照しないもの)を他のHDDに移す、という作業を怠らなければ全く問題ないなと。 いまは無料でクラウドストレージも結構な容量利用できるし、これもうまく活用したいですね。

Macを実際に使い始めて何か気づいたこと、ありました?

トラックパッドがすごい。精度が良くて、ジェスチャーも便利なものが多くて最高です。 今までマウスも一緒に持ち運んでたんですが、Macbookならコーディングやブラウジング程度の作業であればマウスは全く必要ないですね。 あと、持ち運ぶといえばバッテリーの持ちがめちゃくちゃいいので、寝る前に充電しておけば一日の作業に十分耐えます。だからカバンにかさばる充電器を持ち運ぶ必要がないです。

元々、なんかスゴイ人(WEBデザイナーとかエンジニアの方や先輩など)がMacbook使ってる例を多く見てきてそれに影響を受けたり、開発環境として使いやすかったり、というのが購入動機にあったと思うんですが、実際に使うと思いの外快適な要素がたくさん詰まってるなあという印象で、購入動機になりうる良さも多くありました。

―そういえば、MacbookAir片手にスタバには行かれました?

お恥ずかしい話ですが、実は、スタバ自体にまだ一度も行ったことがないんですよね。 僕自身、田舎者ってのもありますが、あの店周辺に漂う小洒落た雰囲気がどうも苦手で(笑) あと、なんか注文の際に呪文唱えないといけないと聞いてるので、それにビビってしまってて。 でもMacbookAirを手に入れたことですし、行く権利は得たわけですよね。 一度は行ってみたいとは思います。

―ありがとうございました。

ありがとうございました。

※この記事はひとりごとによりお送りしました。

たまには日常的なブログを。

わかりやすい質問

ついこの前、こんな記事を書いた。

azunobu.hatenablog.com

内容は

  • CSSいじっててわからないことがあった
  • teratailで質問してみた
  • 分からないことを的確に伝えるのって難しい
  • 抽象的なテキストのみの説明よりも図などを用いると良さげ
  • どういう意識で質問すればいいのだろう
  • 解決後も誰かに役立つような質問を心がけるといいのでは
  • 丁寧な質問は自分の理解も深めることに繋がった

的な、内容だった気がする。

そして、このとき質問したものがteratailのFacebookで紹介されてて…。

"分かりやすい質問です!"

客観的にもわかりやすい質問になっていたようで、嬉しかったです。これからも意識していこうと思う。

最近やってること

最近は、WEB系の勉強をしています。10月中にも、とあるWEBサイトを公開することを目標に勢いでコーディングしています。(公開したら記事にしようと思います)

一人で作っているわけではなくて、大学の友人たちと一緒にチームを組んでやっています。

チームでやっていく上で、Githubの使い方を学んだりしています。ただ、みんなGit初心者なので当初はぐだぐだで、「ステージングエリアって何」「コミットって何」「プッシュって何」「プルリクって何」みたいな、そういうレベルでした。

ですが、この本のおかげでなんとかなりました。とても分かりやすいです。

WEB界隈で同シリーズのCSSの本がメロン本と呼ばれているみたいなので、個人的にこの本をブルーハワイ本と呼んでいます。(愛着がわきます)

Githubに入門する際は、ブルーハワイをオススメします。

ちょっと眠くなってきたので、寝ます。相変わらず、このブログのタイトルの通り22時に寝ようと思っても気づいたら2時になってしまう生活です。

早寝早起きの習慣をつけたいな…。

Issuesのラベルを管理(編集)する方法

最近、複数人Githubを使ってコードを共有していて、Issuesを活用し始めました。

Issuesとは「重要事項、(提起された)問題」という意味で、主に「こんなの作りたいんだけどどうかな?」とか、「ここの動作がブラウザによって動きません」などの提案やバグ対応、課題の共有に使えます。

Issuesにはlabelsというのがあり、issueごとに意味を持たせるラベルを貼り整理することで、ラベルごとに検索できたりします。ブログでいうと、カテゴリーやタグみたいなものです。

ちなみに以下の通り、デフォルトでラベルが用意されています。

labels

それぞれの意味については、

labels 意味
enhancement 機能追加。実装したらクローズ。
bug バグ。修正したらクローズ。
duplicate 他のイシューと重複している。重複先のイシューにリンクしてクローズ。
help wanted 助けが必要。解決したらクローズ。
invalid 間違い、勘違い、実現不可能。対応しない理由を書いてクローズ。
question 質問、議論。収束したらクローズ。
wontfix 分かっちゃいるけど対応しないバグ。対応しない理由を書いてクローズ。

githubのissueのlabel - jabropt.com

という感じです。ちなみに、ラベルは一つのissueに複数貼り付けることが可能です。

ラベルの管理方法

日本人なので、日本語にしたい。あと、ラベルを追加したい。

ラベルの管理の方法を調べましたが、1年前の記事を参考にするもmanage labelsできるところが変わったようで見つからない(issueの編集画面では管理できないっぽい)

Github helpで説明が見つかりました。

Creating and editing labels for issues and pull requests - User Documentation

どこにあるのかというと、以下のURLががラベルの管理画面です。

https://github.com/ユーザ名/指定リポジトリ/labels

https://i.gyazo.com/a95af1c45716c8110be9f552bc975500.png

編集できた

https://i.gyazo.com/31024cc0c44be69e2aa256cd95645e3a.png

これでIssue一覧で、そのissueの概要が直感的に把握しやすくなった。

闇とかはいつか「マジでこのバグは闇って感じだ」と思った時にバグラベルとの合わせ技で使います。

プログラミング特化型Q&Aサイトteratailを使ってみた

分からない

ついこの前、CSSのアニメーション関連で解決できないことがありました。

ぐぐっても分からないし、時間だけが過ぎていく…。こういうことは割とよくあるけどつらい。

「ええい、先輩に聞こう!teratailに質問だ!」と思い立って、質問してみた。

ちなみにこれまでteratailでは2、3質問ほどお世話になったことがある。

いずれも親切丁寧な回答やアドバイスをもらって解決することが出来た。今回もヒントだけでも!と質問した。

teratail.com

夜中に質問して、次の日の昼前に確認してみたらもう回答がついてた。回答が来るだけでもなんだか気持ちが楽になる。

頂いた回答を元にさらに自分で調べてみたりして…。肝心の問題も無事解決できました。

質問は分かりやすく

何がどう分からないのか、を説明するのって結構難しいです。僕の場合は、「いや…なんか、あれがこれで…」みたいな抽象的な表現を多用しがちなので気を付けて質問するようにしています。

なので今回はCSSアニメーションで「イケてない動作」の例をGIF画像にして貼り付けてみました。

あと、IEFireFoxは正常に動いていたので、「イケてる動作」のGIF画像も載せました。

回答がきてお礼してベストアンサー決定、で終わらせない心がけ

もし、今後自分と同じ問題に突っかった人がいて、ぐぐったらこの質問に行きついた…ということがあるかもしれない。意外とそれが数か月後の自分だったりします。

分からない→ググる→関連する解決済みQ&Aを見つけた→でもどうして解決に至ったのかいまいち分からない、ということが結構あります。質問者はその回答を元にどのように噛み砕いて理解して解決できたのか。そこを知りたい。

だから出来るだけ、どのように解決に至ったのか、を分かりやすく示してまとめておくみたいなひと手間を掛けると、なおいいんじゃないかと思います。自分は質問文に追記という形で解決の経緯を出来るだけ分かりやすく記録するようにしています。

これからも質問するときは、「解決の経緯の追記」を心がけていきたい。

実家に帰省してる話

8月上旬に夏休みが始まり、8月いっぱいはバイトやインターンで忙しめで「夏休みはやくきて」と文句垂れまくってましたが。

昨日から北海道の実家に帰省して、夏休みを満喫しています。

岩手県から北海道にアクセスする方法は、飛行機や列車、フェリーなどがありますが飛行機が一番早くて快適です。

夜行列車の急行はまなすで帰省を試みたことがあったけど寝台取れなくて普通席でケツが死んで以来乗ってないです。

深夜バスとは違うけど、水曜どうでしょうのミスターの「ケツの肉がとれる夢、見た」と同じような体験をしました。

そういう意味で、半年に一度の帰省毎に「移動、疲れるでしょ」と飛行機の交通費を出してくれる両親にいつも、

f:id:azuuun:20150901123619j:plain

してます。

実家の猫が大きくなってた

半年前に帰省した時

vine.co

今朝

vine.co

すごく胴長になってました。

相変わらず、犬と違って体が柔らかく、ついついもふりたくなります。あんまり触るとどっか行っちゃう感じが猫っぽい。

断然、犬派だったけど、今では犬も猫も好きになりました。

ちなみに、犬と猫は仲良く共存できるっぽいです。

f:id:azuuun:20150901121747j:plain

帰省中にやりたいこと

  • 大自然を感じられるところに行く
  • 地元の友達と会っていろいろ話したい
  • "圧倒的大都会札幌"で遊ぶ

とりあえず、こんな感じかな。楽しもう。

Cannot reload AVD list ~ というエラーが出た

Cannot reload AVD list

AndroidStudioで動作確認しようとappをRunしたときに、

Cannot reload AVD list: Error parsing YOUR_PATH/tools/lib/devices.xml

というメッセージが出てきて実行できなかった。

調べたら、StackOverFlowに解決策があって解決できました。

stackoverflow.com

解決手順

何やらandroid-tvのdecice.xmlが読み込めないというのが問題っぽいです。

まず、

C:\android-sdk-win\tools\lib

ここに置いてある「devices.xml」をコピー。

次に、エラーにandroid-tvのdevice.xmlが置いてあるディレクトリの場所が記載されているので、

C:\Users\YOUR_ACCOUNT\AppData\Local\Android\sdk\system-images\android-23\android-tv\armeabi-v7a

ここにペーストして、device.xmlを上書きする。

隠しフォルダが設定されている場合はAppDataは表示されないので、

Windows7でAppDataが見つからないときの対処法

これ見て表示設定にしてください。

AndroidStudioを再起動して、Run appしてみて下さい。

恐らく問題なくできるようになってるかと思います。

元々あった、device.xmlのファイルサイズが0KBだったので中身空だったのかななんて思ったり。

ひとまず解決できました。

ListViewを使ってみる

Android開発入門の勉強していて、どんどん新しい項目を学んでいくと、「わけわからん!」と理解が困難になるので項目ごとに頭の整理として備忘録を少しずつ書きまとめておこうと思います。

ListViewとは

Androidアプリ開発で設定画面等によく使用されるListView。配列やデータベースの情報を一覧表示できるので画面に項目を一覧表示するときなどに適している。

標準でスクロール機能が実装されているので、大量のデータを高速にスクロールできたりする優れもの。

ListViewは

  • ListView
  • ListAdapter

の2つのクラスから構成されている。

ListAdapterは、データの持ち主であり、そのデータをどのように表示するのか等の振る舞いを決める割と重要なクラスなのでListViewの実装はListAdapterに集約されているといっても良いくらい重要なもの。

ListViewを画面に設置する

activity_main.xmlを編集する。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              tools:context=".MainActivity">

    <ListView
        android:id="@+id/myListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</LinearLayout>

ざっくりとこんな感じ。

ListViewのルールとして、"幅と高さ"は必ず match_parent とすること。

match_parent としないと、内容に合わせてリストのサイズを毎回設定することとなるので動作が遅くなる場合がある。とりあえず、ListViewの幅と高さはmatch_parentと覚えておこう。

ListViewは、activity_main.xmlへの記述だけでは使用できないので、新たに"ListViewの中の行"のレイアウトも作る必要がある。

新規レイアウトを[layout]フォルダを右クリック、[New]→[Layout resource file]と操作して適当な名前のレイアウト、今回は「list_item.xml」として作成した。

list_item.xmlを編集する。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:padding="16dp"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
</TextView>

幅は親要素いっぱいに広げ、高さは可変とする。

ListViewにデータを表示する

ListViewにデータを表示するためには、

  • データを準備
  • Adapterを作成(いくつか種類がある中で今回はArrayAdapterを使用)
  • ListViewに表示

実際に記述していく。

MainActivity.javaを編集する。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView myListView = (ListView) findViewById(R.id.myListView);

        // データを準備
        ArrayList<String> items = new ArrayList<>();
        for(int i = 0; i < 30; i++) {
            items.add("items-" + i);
        }

        // Adapter - ArrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                R.layout.list_item,
                items
        );

        // ListViewに表示
        myListView.setAdapter(adapter);
    }


}

データの準備は、ArrayListをString型で用意。

データの中身は、for文で item-0 から item-29 までを生成する。

Adapterは、ArrayAdapterを使用するため、「 ArrayAdapter adapter = new ArrayAdapter」という感じに生成。

引数として今回は、

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
    this, // 第1引数:Context
    R.layout.list_item, // 第2引数:行のレイアウト指定
    items // 第3引数:データ
);

という感じに指定している。

ListViewの取得は、

「ListView myListView = (ListView) findViewById(R.id.myListView);」という風に、idを findViewByIdで取得し、ListView型にキャストして取得する。

最後に表示として、

「myListView.setAdapter(adapter);」として、adapterを渡して、ListViewにAdapterをセットする。

エミュレーターで表示を確認してみる

https://i.gyazo.com/b750b4c171dc798f04119828fdc8a7ec.gif

items-0 から items-29 まで表示されているのがわかる。

以上が、ListViewの基本的な表示方法となる。

表示するデータがない場合に「データがないよ」と表示する方法

データがなかった場合に別のビューを表示したいときがある。

activity_main.xml を編集する。

<TextView
        android:text="データがないよ"
        android:id="@+id/emptyView"
        android:padding="16dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

LinearLayout の中の ListView の下に追記する。

id は emptyView として、この id をsetEmptyView()メソッドに引数として渡してあげると、"データがない場合"にこのViewが表示されるようになる。

次にそのように動作するように、MainActivity.java を編集する。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView myListView = (ListView) findViewById(R.id.myListView);

        // データを準備
        ArrayList<String> items = new ArrayList<>();
        for(int i = 0; i < 30; i++) {
//            items.add("items-" + i);
        }

        // Adapter - ArrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                R.layout.list_item,
                items
        );

        // ListViewに表示
        myListView.setEmptyView(findViewById(R.id.emptyView));
        myListView.setAdapter(adapter);
    }

setEmptyView()メソッドに先ほど作った emptyViewを引数として渡したものをsetAdapterの前に追記した。また、データがない状態を再現するために、for文のデータを追加する部分をコメントアウトした。

実際に動作を確認してみる。

https://i.gyazo.com/ce54f465a7b8e6dba3920886c7bfab25.png

うまく データがない場合に emptyView を表示することができている。

左側にアイコン、右側に二行テキストを表示するいい感じのListViewレイアウトを作る方法

list_item.xml を編集する。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal"
              android:padding="16dp">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="16dp"
        android:src="@mipmap/ic_launcher"/>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Azunobu"
            android:textSize="17sp"/>

        <TextView
            android:id="@+id/comment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="僕の夏休みは9月から始まる予定です。"
            android:textSize="15sp"/>

    </LinearLayout>

</LinearLayout>

こんな感じにしてやるといい感じにレイアウトされる(適当)

アイコンは、AndroidStudioで既に用意されている ic_launcher を使用している。

LinearLayoutは全体として horizontal で左側にアイコン、右側にさらにLinearLayout(vertical)を設置し、この中身にTextViewを二つ(nameとcomment)設置している感じ。

Previewで見てみる。

https://i.gyazo.com/f9cdb802aac70881e847d2d16b855412.png

いい感じにレイアウトを作って表示できた。

Userクラスを作ってデータを準備する

ListViewにユーザ情報として複数ユーザのデータを表示したいので、Userクラスをまず作っていく。

list_item.xml を開いてさっき追記した中から

android:src="@mipmap/ic_launcher"
android:text="Azunobu"
android:text="僕の夏休みは9月から始まる予定です。"

これらはデータ表示確認用としていただけなので消しておく。

Userクラスを作っていく。

 public class User {
        private Bitmap icon;
        private String user;
        private String comment;

        public String getUser() {
            return user;
        }

        public void setUser(String user) {
            this.user = user;
        }

        public Bitmap getIcon() {
            return icon;
        }

        public void setIcon(Bitmap icon) {
            this.icon = icon;
        }
    }

これでUser情報を管理する。 メンバ変数にアクセスすためのゲッターとセッターはメンバ変数を用意したら、[Code]→[Generate]→[Getter and Setter]で一発で用意することができる。…こんなことできるんだと、感動した。

次に、Userデータの準備をする。

MainActivity.java を編集する。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView myListView = (ListView) findViewById(R.id.myListView);

        // データを準備
        ArrayList<User> users = new ArrayList<>();

        int[] icons = {
                R.mipmap.ic_launcher,
                R.mipmap.ic_launcher,
                R.mipmap.ic_launcher
        };

        String[] names = {
                "azunobu",
                "azuki",
                "kanon"
        };

        String[] comments = {
                "僕の夏休みは9月から始まる予定です。",
                "…。",
                "キャンキャン!!!ワンワン!!!"
        };

        for (int i = 0; i < icons.length; i++) {
            User user = new User();
            user.setIcon(BitmapFactory.decodeResource(
                    getResources(),
                    icons[i]
            ));
            user.setName(names[i]);
            user.setComment(comments[i]);
            users.add(user);
        }

        // Adapter - ArrayAdapter - UserAdapter
        UserAdapter adapter = new UserAdapter(this, 0, users);


        // ListViewに表示
        myListView.setEmptyView(findViewById(R.id.emptyView));
        myListView.setAdapter(adapter);
    }

    public class UserAdapter extends ArrayAdapter<User> {

        private LayoutInflater layoutInflater;
        public UserAdapter(Context c, int id, ArrayList<User> users) {
            super(c, id, users);
            this.layoutInflater = (LayoutInflater) c.getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE
            );
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = layoutInflater.inflate(
                        R.layout.list_item,
                        parent,
                        false
                );
            }

            User user = (User) getItem(position);

            ((ImageView) convertView.findViewById(R.id.icon))
                    .setImageBitmap(user.getIcon());
            ((TextView) convertView.findViewById(R.id.name))
                    .setText(user.getName());
            ((TextView) convertView.findViewById(R.id.comment))
                    .setText(user.getComment());

            return convertView;
        }
    }

    public class User {
       略
    }


}

ArrayListをUser型で宣言して、その中に icons, names, commentsで三つずつデータを入れて、それをfor文で一気に様式にそって入れてあげている。

次に、Adapterを用意する。 ArrayAdapterを継承したUserAdapterというクラスを新たに作った。 LayoutInflaterの部分は、「こういうもの」らしいので、その通り書いた。View作る機械なんだと、そう理解した。 getViewはViewに一つずつユーザ情報を追加していくメソッド。 なんとなく見ると、流れがわかる…(適当)

ListViewは100行表示するものがあると、一度に100行用意する…わけではなく、最初に画面に表示できる範囲にいくつかのViewが用意されていて、スクロールされると上に行って見えなくなったViewが下にきてリサイクルされる仕組みになっている。

で、if (convertView == null) では、もし convertView が null だった場合はリサイクルするものがそもそもないので、 layoutInflator を使って View を作っていく必要がある。様式に沿って引数を投げてViewを生成している。一つ目の引数は元となるViewのxmlのidを、二つ目の以降はよくわからない。親をとって、falseで良い、っぽい(適当)

次に、convertView に User のデータを set してあげて、それを返してあげる。 何番目の user を持ってくるかについては、 getItem()メソッドを使って指定。あとは、コードの通りuserの各要素がいい感じに convertView に反映されていく。

エミュレータで動作を確認してみる。

https://i.gyazo.com/1cae0f93c960617b3f49be40a5346b80.png

いい感じにViewが表示できた。

きょうはここまで…次はリストをタップしたときの動作を実装してみます。

全然理解が適当なところがあるので、その辺も徐々に理解できるようにしたい。

参考

dotinstall.com