IT + X

ITと何かのコラボレーションは時代を変えるかも

CSSグリッドを試してみる

ウェブページでレイアウトするときは、いままではdivでボックス作ってスタイルシートのfloatで並べるというのが一般的な方法でした。 (ちなみに、ウェブ黎明期はtableで全てレイアウトしていました。) しかし、最近はCSSグリッドなるものがあるというので使ってみたら、とても便利だったのでブログ記事にしました。

例として、以下のようなレイアウトをCSSグリッドで作ってみましょう。

f:id:anthony-g:20190308230422p:plain

HTMLは以下のようになります。

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Grid Test</title>

<meta name="viewport" content="width=device-width">
<link href="https://fonts.googleapis.com/css?family=Raleway" rel="stylesheet">

<link rel="stylesheet" href="style.css">
</head>

<body>
  <header>トップページ</header>
  <section>
    <div id="box1">ボックス1</div>
    <div id="box2">ボックス2</div>
    <div id="box3">ボックス3</div>
    <div id="box4">ボックス4</div>
  </section>
</body>
</html>

divボックスにそれぞれbox1,box2,box3とIDをつけておきます。

次に,CSSファイルは以下のようになります。

style.css

@charset "UTF-8";

/* 基本設定 */

* {
    margin: 0;
}

/* ページ全体の設定 */
body {
    display: grid;
    grid-template-columns: 20px 200px 20px;
    column-gap: 10px;
    grid-template-rows: 
        [head] 50px
        [r1] 200px;
    grid-row-gap: 20px;
    row-gap: 20px;
    font-family: sans-serif;
}

header {
    grid-row: head;
    grid-column: 2;
    justify-self: center;
    align-self: center;
    width: 100px;
    border: solid 1px black;
}

section {
    grid-row: r1;
    grid-column: 2;
    display: grid;
    grid-template-columns: 100px 100px;
    grid-template-rows:
       [sr1] 100px
       [sr2] 100px;
    row-gap: 10px;
    column-gap: 5px;
}

div {
    border: solid 1px black;
}

div#box1 {
    grid-row: sr1;
}

div#box2 {
    grid-row: sr1;
}
div#box3 {
    grid-row: sr2;
}
div#box4 {
    grid-row: sr2;
}

まず、bodyのところでdisplay: gridとしてCSSグリッドを使う指定をします。 次に、行方向のグリッドのレイアウトを以下のように定義します。

grid-template-columns: 20px 200px 20px;

これは以下のように両側に20pxの余白をつけて中央にコンテンツを200pxの幅で配置するレイアウトになります。

f:id:anthony-g:20190309113349p:plain

カラムの区切りは左から1,2,3...と番号がふられますので、これでコンテンツを表示する位置を指定します。 このページはsection部分が表示されるコンテンツですので、sectionのgrid-columnを2に指定します。

次に、列方向のレイアウトの指定を行います。 こちらも行と同じように以下のように設定します。

grid-template-rows: 
    [head] 50px
    [r1] 200px;
f:id:anthony-g:20190309114946p:plain

[head]とか[r1]というのが追加されていますが、これは列を番号ではなく名前で指定できるようにするための設定です。 headerで以下のように設定します。

header {
   grid-row: head;
...

表示コンテンツを含むsectionは、以下のように設定します。

section {
   grid-row: r1;
   ...

これで、大枠のレイアウトが完了です。 4つのdivはさらにsectionの中でグリッドを設定してレイアウトしています。

このようにグリッドを使えば、方眼紙の上でデザインするようにレイアウトすることができます。 floatを使うより直感的なので慣れればこちらのほうがデザインしやすいのはないでしょうか。

参考にした本

CSSグリッドで作る HTML5&CSS3 レッスンブック

CSSグリッドで作る HTML5&CSS3 レッスンブック

Firebase使ってみた

FirebaseはGoogleが提供するBaaSと呼ばれるクラウドサービスです。

firebase.google.com

これからは自分でサーバーを構築する時代でもないと思ったので、Firebaseを試してみました。

まずは、firebaseに登録してウェブアプリをデプロイするところまでやってみたのですが、ちょっとハマったところもあったのでまとめておきました。

 

まず、Google Cloud Platformに登録して 新しいプロジェクトを作成します。
作成方法についてはこちらを参照してください。

cloud.google.com

次に、GCP Cloud Shellを開きます。
これはブラウザからクラウドインスタンス上でシェルを使うためのものです。
GCPダッシュボードの右上のプロンプトマークをクリックします。

 

f:id:anthony-g:20190228202922p:plain

すると、下にシェルのターミナルが開きます。

f:id:anthony-g:20190228204726p:plain

サンプルウェブアプリのソースを以下のコマンドでダウンロードしておきます。


# git clone https://github.com/firebase/friendlychat-web

 

次にFirebase(https://firebase.google.com)のサイトにブラウザでアクセスして、プロジェクトを作成します。

f:id:anthony-g:20190301123150p:plain

 

プロジェクトを作成すると以下のようなページが表示されます。

f:id:anthony-g:20190301123331p:plain

 

Firebaseは以下のようなサービスで構成されています。

  • Authentication - 認証機能
  • Database - データベース機能
  • Storage - 静的コンテンツやファイルを保存する機能
  • Hosting - コンテンツの配信やデプロイ
  • Functions - クラウド関数

サンプルアプリを動かすためにAuthentication,Database,Storageを設定します。

左サイドメニューの「Database」をクリックしてRealtime Databaseの「データベースの作成」をクリックします。

f:id:anthony-g:20190301131242p:plain

 

「テストモード」を選択し、「データベースを作成」をクリックします。

f:id:anthony-g:20190301131512p:plain

 

データベース作成完了です。

f:id:anthony-g:20190301132719p:plain

 

次に、認証機能を設定します。
左メニューのAuthenticationをクリックし、「ログイン設定ボタン」をクリックします。

f:id:anthony-g:20190301162816p:plain

 

「ログイン方法」タブを選択した後、ログインプロバイダーとしてGoogleを選択し「有効にする」スライダーをオンにします。「プロジェクトの公開名」はFriendly Chatと入力します。

f:id:anthony-g:20190301165235p:plain

 

Google認証が有効になりました。

f:id:anthony-g:20190301171933p:plain

 

次に、Storageの設定を行います。

f:id:anthony-g:20190301172103p:plain

 

「スタートガイド」ボタンをクリックします。

f:id:anthony-g:20190301172227p:plain

 

「セキュリティルール」ダイアログのOKボタンをクリックします。

f:id:anthony-g:20190301173237p:plain

 

これでFirebase側の設定は完了です。

次に、サービスアカウントを作成します。
サービスアカウントとは、アプリケーションや仮想マシンに属する特別なGoogleアカウントです。GCPからFirebaseにアクセスするには事前に作成しておく必要があります。

GCPダッシュボードのメニュー「APIとサービス」- 「認証情報」をクリックします。

f:id:anthony-g:20190302181612p:plain

「認証情報」の「認証情報の作成」-「サービスアカウントキー」を選びます。

f:id:anthony-g:20190302184907p:plain

 

「サービスアカウント」メニューで「新しいサービスアカウント」を選択し、「役割」メニューは「Project」-「オーナー」を選択します。

f:id:anthony-g:20190302185440p:plain

アカウントが作成された後、暗号鍵が含まれたJSONファイルがダウンロードされますので、PCの適当なところに保存してください。

PC上のエディタでダウンロードしたJSONファイルを開いてテキストをコピーします。
次に、GCPコンソール上でvi等のエディターを開いてペーストしてファイル保存してください。(ファイルパス $HOME/friendly_chat_web/web/fbtest.json)
そして、GCPシェル上で保存したJSONファイルのパスを環境変数GOOGLE_APPLICATION_CREDENTIALSに以下のように設定します。

# export GOOGLE_APPLICATION_CREDENTIALS=$HOME/friendly_chat_web/web/fbtest.json

次に、アプリのディレクトリで以下のコマンドを実行します。

# cd friendly_chat_web/web
# firebase login --no-localhost

ブラウザでアクセスして認証するためのURLが表示されるので
表示されたURLにアクセスしてサービスアカウントのアクセスを許可してください。

そして、以下のコマンドをGCPシェルで実行してください。
# firebase init

f:id:anthony-g:20190302200746p:plain

ラジオボタンになっているところの「Database」と「Storage」に上下カーソルキーで移動しスペースキーでチェックを入れてリターンします。

f:id:anthony-g:20190302201152p:plain

Select a default Firebase project for this directory:で(don't setup a default project)を選びます。

f:id:anthony-g:20190302202129p:plain

その後、何回か聞かれますがリターンで問題ないです。

そして、アプリケーションのデプロイを行います。
# firebase deploy --project プロジェクトID

プロジェクトIDは、Firebaseのプロジェクトの設定で確認できます。

f:id:anthony-g:20190303211521p:plain

 

Hosting URLをブラウザでアクセスするとウェブアプリが動作していることを確認できます。

f:id:anthony-g:20190302204647p:plain

 

GCPとFirebaseの接続設定のところで結構はまりましたが、認証やデータベースをFirebaseに任せられるのはいいですね。
さらに色々いじってみたいと思います。

 

参考URL: 

www.topgate.co.jp

ジョブ理論 ー イノベーションを予測可能にする消費のメカニズム

 

ジョブ理論 イノベーションを予測可能にする消費のメカニズム (ビジネスリーダー1万人が選ぶベストビジネス書トップポイント大賞第2位!  ハーパーコリンズ・ノンフィクション)

ジョブ理論 イノベーションを予測可能にする消費のメカニズム (ビジネスリーダー1万人が選ぶベストビジネス書トップポイント大賞第2位! ハーパーコリンズ・ノンフィクション)

  • 作者: クレイトン M クリステンセン,タディホール,カレンディロン,デイビッド S ダンカン,依田光江
  • 出版社/メーカー: ハーパーコリンズ・ ジャパン
  • 発売日: 2017/08/01
  • メディア: 単行本
  • この商品を含むブログ (6件) を見る
 

 

今はものが売れない時代と言われています。

たしかに、生活の中でものはあふれていて、顧客が何を欲しがっているか見つけるのが難しくなっているのは事実です。

しかし、売れている商品やサービスは今でも存在しています。

trend.nikkeibp.co.jp

では、なぜこれらの商品は売れたのでしょうか?

 

「ジョブ理論」によれば、顧客がものを買うのは自分のジョブを片付けたいからといいます。
ジョブとは、特定の状況で人あるいは人の集まりが追求する進歩のことをいいます。

 

例として、朝のミルクシェイクのエピソードがあげられていました。
あるお店で朝にミルクシェイクがよく売れるようになったそうです。
そこで、お客さんに聞いたところ、朝に仕事先まで1~2時間ドライブするときに空腹と退屈な時間を解消するためだったということがわかりました。
でも、ドーナツだとボロボロこぼれて運転しながらだと食べにくいし、バナナだとすぐ食べ終わってしまうからだめだったのです。
ミルクシェイクを買うことによって、顧客の朝の生活に進歩をもたらしたのです。

 

顧客の本当のジョブを見つけるのは結構難しいと思います。
ミルクシェイクのケースも、まず朝に売れていることに関心をもつ人なんてめったにいないでしょう。
気がついたとしても、おいしいから売れてるんだろうくらいにしか普通は思えないでしょう。
大事なのは人に関心をもって、なぜあんな行動をするのかと疑問を解明しようとする姿勢なのだと思います

 

ミルクシェイクのケースは顧客がいたからわかりましたが、顧客がいない場合もあります。
サザンニューハンプシャー大学にはオンラインコースがあったのですが、リソースもあまり投入していない状況だったので業績はいまいちでした。
そこで、ジョブベースで考えてみたところ志望者のジョブを解決するようなサービスを提供していないことに気がつきます。
例えば、オンラインコースに申し込む人は社会人が多かったのに高校生を対象にした内容になっていたり、奨学金の申し込みも手続きが面倒だったりしてあきらめている人が多かったのです。
それを社会人向けの内容に変え、奨学金も簡単に申請できるようにしました。
入学後も学習のフォローをきめ細かくして、全米で有名な大学になっていきました。
このケースでは、表には現れていない生徒のジョブにフォーカスして解決するサービスを提供することが成功した理由だったのです。

 

ただ、ジョブを機能や利便性の面だけから見るのはまちがいです。
なぜなら、人は感情で判断する生き物だからです。

GMは、自社の車に搭載する車載システム向けにオンスターという情報サービスを提供しています。
オンスターはナビゲーションやリモート診断、ハンズフリー通話など様々な情報サービスから構成されています。
GMは、最初このサービスを高級車オーナーをターゲットにしましたが、エントリーレベルの車種でも売れているのを見て不思議に思いました。
顧客を調査したところ、ドライバーがエンジンランプがついているのを見て不安になったり、道に迷って困ったときの頼れるサービスを求めていたのです。
つまり、心の不安を取り除いてくれるサービスにニーズがあったのです
それを理解したGMは高機能を目指すのではなく、ドライバーの不安に対処するサービスを提供することに方向転換して成功しました。

いくら技術が発達しても相手にするのは人間です。
人間は合理的に判断することは意外と少なく、感情で判断することがとても多い生き物なのです。

今は何でもデータ化して定量的に分析することが正しいとされますが、定性的な情報のほうが重要なことが多いのです。
また、データに頼りすぎると相関関係があるというだけで因果関係に結びつけてしまうまちがいが起こりやすいのです。

昔、ソニーの社長の盛田さんがウォークマンを売り出す時、再生だけしかできない音楽プレーヤーなんか売れないと社内中から反対されたそうです。
マーケティングリサーチでもそういう結果が出てたかららしいですが、盛田さんは必ず売れるという確信を持っていたそうです。
私も昔ウォークマンを持ってましたが、実際に使ってる人でないと本当のよさは感じられない商品だなと思いました。
ウォークマンは、外で歩きながら音楽を楽しみたいというジョブを解消してくれる素晴らしい進歩だったのです。

どんな時代になっても人が片づけたいジョブがなくなることはありません。今の日本だと高齢化や少子化、産業の空洞化などでジョブが山積しています。それらのジョブを見つけて解決しようとすれば今でも売れる商品を開発することができるのではないでしょうか。
 

ソニー 盛田昭夫

ソニー 盛田昭夫

 

 

 

MacでESP-IDFをインストールして使ってみる

遅ればせながらESP32でいろいろ遊んでみようということで、MacBookProにESP-IDFをインストールして使ってみようとしたのですが、いろいろハマったので書いておきたいと思います。

 

ESP32ボードはUSBケーブルで接続できるこちらを使いました。

 

接続USBケーブルは、Mac側がUSB Type CでESP32側はマイクロBになっていますが意外に普通のお店では売っていません。変換アダプタもかったるいのでESP32接続専用に買っておきました。

 

まずは、MacにESP32接続用ドライバーをインストールします。

ドライバーはこちらからMac OS X用ドライバをダウンロードできます。

www.silabs.com

 

ただし、最近のMac OSはセキュリティが厳しくなっててApp Store以外のソフトウェアのインストールはブロックする仕様になっています。

インストーラー実行後、コントロールパネルの「セキュリティとプライバシー」で許可してやればインストールされます。

f:id:anthony-g:20190125170833p:plain

 

正しくインストールされるとデバイスファイル/dev/cu.SLAB_USBtoUARTが作られているはずです。

次に、ESP32ツールチェーンこちらからインストールします。

https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz

(2019年1月現在。最新のファイルはhttps://docs.espressif.com/projects/esp-idf/en/latest/get-started/macos-setup.htmlを参照ください。)

ちなみに、ツールチェーンとはコンパイラアーカイバなどコンパイルして実行ファイルやライブラリを作るためのコマンド群をいいます。

ホームディレクトリにespというディレクトリを作成し、そこにダウンロードしたファイルを解凍します。

# mkdir ~/esp
# cd ~/esp
# tar xzf xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz

 espディレクトリ下のxtensa-esp32-elf以下にツールチェーンが展開されます。

 

 次に、ESP-IDFをインストールします。

Githubからファイルをゲットします。

# git clone --recursive https://github.com/espressif/esp-idf.git

ESP-IDFは、サブモジュールもいくつか含まれているのでgit cloneで--recursiveオプションを指定することによってサブモジュールも合わせて取得します。

ESP-IDFに必要な環境変数を.bash_profileに追加します。

~/.bash_profile

export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH
export IDF_PATH=$HOME/esp/esp-idf

環境変数をシェルに反映させておきます。

# source ~/.bash_profile

次に、ESP-IDFに含まれているblinkというサンプルプロジェクトをビルドして実行してみます。このプロジェクトはLEDを点滅させるだけの簡単なプログラムです。

回路としては下の写真のように、LEDと抵抗を直列につないだシンプルなものです。ESP32側はGNDとGPIO23のピンに回路の両端をつないでいます。

 

f:id:anthony-g:20190126115335j:plain

 

 blinkプロジェクトファイルをコピーします。

# cp -r esp-idf/examples/getting-start/blink .
# cd blink
# ls
CMakeLists.txt   README.md   sdkconfig.defaults
Makefile             main

プロジェクトの設定を行います。

# make menuconfig

f:id:anthony-g:20190126130835p:plain

USBのデバイスファイルを設定します。

f:id:anthony-g:20190126130852p:plain

f:id:anthony-g:20190126130856p:plain

GPIO23から出力されるように設定します。

f:id:anthony-g:20190126135258p:plain

f:id:anthony-g:20190126135302p:plain

設定を終了後、プロジェクトをビルドしてESP32にプログラムをロードします。

# make flash

ビルド完了後、"Connecting..."というプロンプトが出たら、ESP32のBOOTボタン(USBコネクタ側に向かって右側のボタン)を押してください。

WindowsではBOOTボタン押しは必要なかったのですが、なぜMacではボタン押ししないとタイムアウトしてしまいました。ひょっとしたらボードがespressif純正でないのが理由かも。)

下のような感じの出力が出ればうまくロードされています。

f:id:anthony-g:20190126135908p:plain

 

いろいろハマりましたが、無事Lチカさせることができました。 


esp32 blink

IT+Xについて

仕事も少し落ち着いたので、久しぶりに技術ブログを再開しようかなとあたらしくはてなにブログを作ってみました。

内容としては、今私の興味のあるIT技術を中心に情報シェアできればいいかなと思っています。しかし、今やITはあらゆる分野でインフラとなっている技術ですので、技術的な面だけでなく、実際に使われているケースやこれから使われる可能性についても書いていけたらいいなと思っています。

いつまで続けられるかわからないですが、とりあえず書いていきたいと思います。