omuriceman's blog

iOS / AWS / Firebase / JavaScript / Deep Learning を中心とした技術を面白く紹介します!

AWS Amplify Consoleの手動デプロイでAccessDeniedになった時の対処法 | zipファイルの圧縮に注意

以前ブログでも紹介しましたAWS Amplify Consoleですが、今まではGitプロバイダーを利用したデプロイしかありませんでした。

omuriceman.hatenablog.com

2019年7月より上記以外の様々なデプロイ方法がサポートされました。

f:id:omuriceman:20190728030119p:plain

aws.amazon.com

以下のようなデプロイ方法があります。

私はこれらの機能をブログで紹介するべく調査を行なっておりました。

しかし・・・

f:id:omuriceman:20190728005323p:plain

何度やってもzipファイルのアップロードがAccessDeniedされてしまう!という事態が発生。

色々と解決方法を模索していたのですが、zipファイルの圧縮方法に問題があることが判明しました。その原因についてブログにまとめていきたいと思います。

Macユーザー向けですが他のOS環境でも起こるかもしれません。

フォルダ構成について

今回デプロイを行うものはdistというフォルダの中にHTMLファイルとオムライスの画像が入っているだけのフォルダです。

dist
|--.DS_Store
|--index.html
|--omurice.png

無事にデプロイされると以下のような状態で表示されます。

f:id:omuriceman:20190728013526p:plain

zipファイルへの圧縮方法について

当初はGUIでフォルダの圧縮を行なっておりました。

f:id:omuriceman:20190728012127p:plain

残念ながらこのやり方だとうまくいきません。

次に私はAWS公式のリリースブログに書いてある圧縮方法を試してみることにしました。

aws.amazon.com

$ cd dist #build directory
$ zip -r dist.zip *

ターミナルでコマンドを実行してzipへの圧縮を行います。

この方法でデプロイすることに成功しましたGUI上で解凍すると同じファイルが展開されるのに、、、何故でしょう。

なぜデプロイに失敗したのか

上記の2つのzipファイルを比べてみることにしました。GUIで作成した方を「dist_gui.zip」、terminalで作成したzipファイルを「dist_terminal.zip」として比較してみることにしました。

同じファイルなのにzipのファイル中身が違う

まず同じファイルが入っているはずなのにファイルサイズに違いがありました。

$ ls -la
-rw-r--r--@  1 omuriceman staff  17112  7 27 22:12 dist_gui.zip
-rw-r--r--@  1 omuriceman staff  16228  7 27 22:12 dist_terminal.zip

次にファイルの情報について確認してみます。zipinfoコマンドを利用します。

$ zipinfo dist_gui.zip 

Zip file size: 17112 bytes, number of entries: 6
drwxr-xr-x  2.1 unx        0 bx stor 19-Jul-27 22:07 dist/
-rw-r--r--  2.1 unx      385 bX defN 19-Jul-27 21:56 dist/index.html
-rw-r--r--  2.1 unx    15702 bX defN 19-Jul-27 21:59 dist/omurice.png
drwxrwxr-x  2.1 unx        0 bx stor 19-Jul-27 22:12 __MACOSX/
drwxrwxr-x  2.1 unx        0 bx stor 19-Jul-27 22:12 __MACOSX/dist/
-rw-r--r--  2.1 unx      480 bX defN 19-Jul-27 21:59 __MACOSX/dist/._omurice.png
6 files, 16567 bytes uncompressed, 16246 bytes compressed:  1.9%
$ zipinfo dist_terminal.zip 

Zip file size: 16228 bytes, number of entries: 2
-rw-r--r--  3.0 unx      385 tx defN 19-Jul-27 21:56 index.html
-rw-r--r--  3.0 unx    15702 bx defN 19-Jul-27 21:59 omurice.png
2 files, 16087 bytes uncompressed, 15908 bytes compressed:  1.1%

ここで判明したことがあります。

  1. __MACOSXという謎のフォルダが出現
  2. その中にあるファイルが影響して容量が大きくなっている
  3. ファイルの階層情報に違いが出ている

ということです。

このファイルの階層情報を合わせることができればうまくデプロイできそうな予感がします。

他の圧縮方法で試してみる

ではGUI上でどうやったらうまく圧縮できるでしょうか。以下のスクリーンショットをご覧ください。

f:id:omuriceman:20190728022106p:plain

先ほどはフォルダに対して圧縮を行なっていましたが、今回はフォルダ内部のファイルを全選択して圧縮を行なっています。

この操作で圧縮されたファイル情報はどのようになるでしょうか。 dist_guifiles.zipという名前にして同じようにzipinfoで比較してみました。

$ zipinfo dist_guifiles.zip 

Zip file size: 16836 bytes, number of entries: 4
-rw-r--r--  2.1 unx      385 bX defN 19-Jul-27 21:56 index.html
-rw-r--r--  2.1 unx    15702 bX defN 19-Jul-27 21:59 omurice.png
drwxrwxr-x  2.1 unx        0 bx stor 19-Jul-27 22:25 __MACOSX/
-rw-r--r--  2.1 unx      480 bX defN 19-Jul-27 21:59 __MACOSX/._omurice.png
4 files, 16567 bytes uncompressed, 16246 bytes compressed:  1.9%

__MACOSXフォルダができあがるのはさておき、ファイルの階層情報は問題なさそうなのでドラッグアンドドロップでアップロードしてみることにします。

f:id:omuriceman:20190728024140g:plain

f:id:omuriceman:20190728022611p:plain

正常に表示されました!

まとめ

  • AWS Amplify Consoleに新しいデプロイ方法が追加された
  • GUIでフォルダを圧縮してzipファイルを作成するとデプロイに失敗する
  • オススメのzip化の流れは以下の通り

AWS Amplify Consoleに手動デプロイする際のzipファイルへの圧縮に関してはフォルダを圧縮する階層まで遷移して、

$ zip -r xxx.zip *

とするのが一番安全で簡単です。GUI上でやるのは面倒なのでやめましょう。

メモ

news.mynavi.jp

  • zipコマンドのオプション

www.atmarkit.co.jp

安西剛さんの1on1コーチング無料体験をうけて良い気づきを得られた話

先日、Twitterで安西さんという方がコーチング体験を募集しているツイートを見かけました。

正直なところをお伝えするとそれまで安西さんを存じ上げておりませんでした。DevLOVE Xなどでも発表をされている方ということは後から知りました。

面識のない方にコーチングを頼むのは不安では無いか? という風に思う人もいるかもしれませんが、自分がTwitter上でフォローしている方々もコーチングを受けていたので信頼できそう!と思ったのと、私自身先日まで面識のなかった方にブログメンタリングを受けてきていろんな経験を得られたので、今回も思い切って申し込んでみることにしました。

今回はコーチング体験の流れや感想などをブログに書いていきたいと思います。

当日までの流れ

申し込んでから当日のコーチングに入るまで日程が会わず2週間くらい先の日程になりました。

ありがたかったのはコーチングをやるためにオフィスまで来ていただけたことです。カフェなどでやることもあるそうですが、話す内容を振り返るとコーチング体験はオフィスでできてよかったです。

お会いしてからコーチング体験が始まるまで

はじめに少し驚いたのが部屋に入るなり安西さんは対面に座るのではなく私の隣に座りました。喋りやすい雰囲気を出すために工夫をされていると思います。ファシリテートがうまかったのもあると思いますが、より心を開いて話せたと思います。

安西さんの印象についてですが、お会いする前までは「コーチング」という言葉からすごい熱く話すイメージなのかなと思っていたのですが、良い意味で「軽い」印象を持ちました。

お互いに自己紹介を行ってから自分の話したい内容について進んでいきます。

自分の悩みについて解き明かしていく

詳細は割愛しますが、2つの悩みについて話をしようと思い事前のアンケートになどにも記載していました。当日は時間の都合や悩みの深刻度から1つ絞り深掘りをしていくことになりました。

安西さんから様々な問いかけを受けます。「悩みの深刻度はどちらが上か」「こういう捉え方だったらどう思うか」などなど。 その間自分なりに思考の整理をするわけですが、安西さんはひたすら私の回答を待っていました。 こちらについては、他にも安西さんのコーチングを受けられている方のブログでも記載されているのでそういう方針だと思います。

ky-yk-d.hatenablog.com

待つということは本当に難しいことです。私が逆の立場の場合、人と会話するときどうしても待てずに意見を言ってしまいます。

私が同じ立場になった時、意識して10分以上話を聞くという姿勢を大事にしたいと思います。

今後のアクションを具体的に決める

悩みを明確にしてからは今後の行動についていくつかの方向性から1つを絞ることに。

さらに今までやったことのない具体的なアクションを決めることになりました。 具体的なアクションについては、やってないことって何だろう?と思って悩んでいましたがアドバイスを受けて道が開けました。

またアクションについては行動を起こしやすいものになるようアドバイスをもらいました。

気づきや感想

  • 悩みの原因がはっきりして腑に落ちた
  • 意見を押し付けられることはなく自分主導で1on1が進んだ
  • 安西さんは常に傾聴に徹していて良いタイミングでアドバイスをする
  • 安西さんのスタンスの軽さが自分の悩みを軽くさせてくれた
  • 今まで自分が進んできた道に自信がもてた

安西さんの1on1の資料をこちらに掲載します。 私が体験した1on1も思い返すとどれも資料に記載のある原則にしたがって行われておりました。

まとめ

  • 安西剛さんのコーチング体験を受けた
  • コーチングの結果悩みや次のアクションが明らかになった
  • アドバイスを受けてもっと自分の視野を広げていこうと思う
  • まだ募集中のようなので悩んでいる方は相談してみるといい

www.tsuyok.work

また安西さんはconnpassでコーチング体験の勉強会なども行われているようです。 もう定員がいっぱいですが、キャンセル待ちもでるかもしれませんのでチェックしてみてはいかがでしょうか。

coaching.connpass.com

Facebookなどで使われているローディングの名称を知ってる? / 調べたらたくさんありすぎた話

結論からお伝えします。

  • Skeleton Screen
  • Skeleton Placeholder
  • Skeleton Loader
  • Content Loader
  • Content Placeholder
  • Placeholder

などと呼ばれています。多いですよね(^_^;)

特にSkeleton ScreenContent Loaderと呼んでいる場合が多いです。

どれのこと?

YouTube・Slack・Facebookなど最近のアプリで使われている、丸や長方形のグレーで表示している箇所のことです。

正式なテキストや画像が読み込まれる前のプレースホルダとして使用されています。

YouTube

f:id:omuriceman:20190707024531p:plain

Slack

f:id:omuriceman:20190707024114p:plain

Facebook

f:id:omuriceman:20190707025605j:plain:w300

他の事例に興味のあるかたはこちらの記事をご紹介いたします。

medium.com

最初に提唱した人は誰?

調査によると最初に提唱したのがこちらのブログの作者「Luke Wroblewski」らしいです。誕生は2013年9月のことです。

www.lukew.com

後にGoogleに買収されることになるPolarというアプリのデザインを通じて、 それまで主流だったプログレスインジケーター(スピナー)をやめ、読み込まれた場所から徐々に表示させていくUIの表現方法としてSkeleton Screenを提唱しております。

なので調査に間違いがなければSkeleton Screenと呼ぶのが良いのかもしれませんね。

Skeleton Screenのメリット

ユーザーの待ち時間を短く感じさせることが可能です。 また上記のプログレスインジケーターと比べると、Skeleton Screenはどこになんのコンテンツが表示されるかが推測しやすくなるため、 プログレスインジケーターに比べてコンテンツの表示までの待ち時間が減っている印象を持ちます。

環境ごとの実装例紹介

私が調べる限りアプリやWebのほぼ全てでライブラリが作られております。 Skeleton・Content Loader・Placeholderと呼ばれていたりしてなかなかカオスです。

  • React / Vue.jsでの実装

danilowoz.com

  • Webフレームワークでの事例

semantic-ui.com

  • CSSのみでの実装

tech.arc-one.jp

github.com

github.com

React Nativeで実装してみる

今回私はReact Nativeで実装することにしてみました。React Nativeでは人気のライブラリが2つ存在します。

github.com

www.npmjs.com

後者のライブラリは、前者のライブラリが「expo」という開発環境にしか対応をしていなかったため、 expo以外にも対応するために派生させたライブラリですので似たようなものです。

今回は後者の「react-native-content-loader」を使って実装してみたいと思います。

環境設定

$ npm install react-native-svg d3-interpolate --save
$ react-native link react-native-svg
$ npm install react-native-content-loader

XCodeでビルドする場合はlibRNSVG-tvOS.aの削除を忘れないようにしてください。

サンプルコード

ライブラリのインポートを最初に行ってください。

import ContentLoader from 'react-native-content-loader'
import {Circle, Rect} from 'react-native-svg'

サンプル通りに実装を進めます。

<ContentLoader height={300} duration={1000}>
    <Circle cx="30" cy="30" r="30"/>
    <Rect x="75" y="13" rx="4" ry="4" width="100" height="13"/>
    <Rect x="75" y="37" rx="4" ry="4" width="50" height="8"/>
    <Rect x="0" y="70" rx="5" ry="5" width="400" height="200"/>
</ContentLoader>

添付のような画面になればOKです。 ノッチ付き端末の場合SafeAreaViewなどの実装も忘れないようにしてください。

f:id:omuriceman:20190707052500g:plain

まとめ

  • 最近のアプリでコンテンツのローディング時に表示されるUIの名称について調べた
  • 最初にこのUIについて提唱しているブログではSkeleton Screenと呼んでいる
  • 他のUI表現より待ち時間のストレスが減っている気がする