みかづきブログ その3

本ブログは更新を終了しました。通算140万ユーザーの方に観覧頂くことができました。長い間、ありがとうございました。

👆

引越し先はこちらです!

個人的にはまったReactでHTMLと違う書き方をしなければならない箇所まとめ(class属性、style属性、scriptタグ、chrset) 👍

ドメインを取ってから3年間、ずーっと工事中だったポートフォリオサイトですが、
ついに本日公開できる状態になりました。

デザイン、サーバサイド、フロントすべてやりきりましたが、その反動でPC版は鋭意制作中となっております。

また、平日は仕事、休日は育児という感じなので、隙間隙間で進めて、かれこれ半年かかってしまいました。
時間がかかってしまったことの原因としては、デザイン、サーバサイドが専門外で勉強しながら進めたこと、
そして何より、普通に実装が終わりそうなタイミングで、思いつきでReactの採用を決めたことです。

  • ReactをつかうならReduxをつかいたい。
  • Reactをつかうなら、webpackをつかいたい。
  • webpackをつかうならPostCSSをつかいたい。
  • Reactをつかうなら、サーバサイドでレンダリングしたい。よし。Expressをつかおう。
  • Expressをつかうならサーバを借りよう。せっかくだからNginxにしてみよう。OSはなんとなくUbuntuにしてみよう。

と、連鎖的に勉強しなければならないものが増えていき、さらにSCSSで書いた部分が完全に移植できなかったり、
JavaScriptをほぼ1から書き直したり、と、あれこれしているうちに時間がかかってしまったんですが、その分学びも大きいものになりました。
(でも、完成したコードを親切なサーバサイドエンジニアに見てもらったところ、サーバサイドレンダリングのやりかたが根本的に違うと教えてもらいました。直さなければ!)

なので、しばらくはここでの学びを忘れないうちにメモしていこうと思います。
まずは、一番時間を引き伸ばしたであろうReactから。


個人的にはまったReactでHTMLと違う書き方をしなければならない箇所

ReactはJavaScript内にHTMLを書くことのできるすごいやつなのですが、一部普通のHTMLと書き方が異なる点があります。
僕はノリでReactを採用したので、なかなかはまりました。何処かで誰かの役に立つことを祈りながらまとめておきます。

class属性

誤)

<div class="box"></div>

正)

<div className="box"></div>

classが予約後なのでエラーが吐かれます。
classNameと書きましょう。これは基本ですね。


style属性

誤)

<div style="background: red;"></div>

正)

<div style={{background: "red"}}></div>

オブジェクトを渡しましょう。
{}内にはJavaScriptが記述できます。{}内にオブフェクトを渡しているので{{}}という形になっているのです。


scriptタグ

誤)

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA', 'auto');
  ga('send', 'pageview');
</script>

正)

<script dangerouslySetInnerHTML={(() => {
            return {
              __html: `(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');ga('create','UA','auto');ga('send','pageview');`
            };
          })()} />

アナリティクスとか、Facebookとか、Twitterのscriptを埋め込む時、
普通に埋め込むと{}とかがエスケープされてしまうので、dangerouslySetInnerHTMLをつかいました。
dangerouslySetInnerHTMLを知らなかった頃は、わざわざ外部ファイルにしようとしていました。


charset

誤)

<meta charset="UTF-8" />

正)

<meta charSet="UTF-8" />

これ、最後まで気づきませんでした。
キャメルケースにしておかないとレンダリングされません。
サイトが文字化けしたので気づきました。


以上です。どこかで誰かの参考になったらうれしいです。

ウェバイス(ウェブ+デバイス)をつくろう! 😎

先日、「エンタープライズIoTLT #8 ヘルスケアIoTLT」で発表させていただいた資料を若干調整して公開してみました。

b2b-ch.infomart.co.jp

発表資料

IoTほど大袈裟ではないのですが、ウェブ+デバイスでインターネットに繋がるデバイスをつくる方法を紹介しています。
お手軽なので、簡単なモックなら量産できます。

Twitterでも一部公開しているのでぜひともご覧ください!(ウェバイス以外もありますが)

twitter.com

いままでつくったウェバイスまとめ

サプライズ・ウィンドウ


サプライズ・ウィンドウ


サプライズ・ウィンドウ

ガラケーにプラ板をくっつけることによって、車の窓の外を走る忍者を再現したウェバイスです。
僕がウェバイスを思いつくきっかけになった思い出の一品です。

黄金チャーハン


光り輝く黄金チャーハン

クロッシュの中にスマホを入れて、開いた時(傾いたとき)に音と光でチャーハンを盛り上げるウェバイスです。

合コンさしすせそボタン


合コンさしすせそボタン from 高橋奈々 on Vimeo.

ボタンの付いた箱の中に、ワイヤレスキーボードとiPhoneが入っていて、
ボタンを押す ⇒ ボタンがキーボードを押す ⇒ ウェブページで検知 ⇒ 音が出る というピタゴラスイッチ的なウェバイスです。
こちらは実装のみを担当しております。

スマート絵馬


スマート絵馬

絵馬の中にスマホを入れて、遠くの人でも願いごとを投稿できるようにしたウェバイスです。

マットマックス 4DX


マットマックス 4DX

マットの下に、PC、センサ、Arduino、振動子といろいろ入れ込んだウェバイスです。
振動で踏み心地が変化します。
ハプティクスはムービーではなにも伝わらないであろうと思い、Facebookによく流れてくる動画広告を参考に映像をつくりました。



いかがでしょう。普通にデバイスをつくるよりも高速につくれるので体験の検証とかにはおすすめです。




ツイッターやってます!

CSSでiPhone本体の素材をつくる その2

kimizuka.hatenablog.com

以前、CSSでiPhone5をつくったことがありましたが、
流石に古くなってきたので、iPhone7につくりかえてみました。

以前のコードと比べると、要素数が少なくなっていて成長を感じますね。
(before、after、box-shadowをつかうようになりました)
左右のボタンを1つの要素にしてbox-shadowで増やそうかとも思ったのですが、微妙に角丸にしたかったのでサイレントスイッチを削りました。
ものすごく頑張れば再現できた気もしますが、シンプルさを重視した結果です。


DEMO

See the Pen iPhone7 by kimmy (@kimmy) on CodePen.


HTML

<div id="body">
  <div class="camera"></div>
  <div class="speaker"></div>
  <div class="screen"></div>
  <div class="home"></div>
</div>

SCSS

* {
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -webkit-backface-visibility: hidden;
}

body {
  background: #aaa;
}

#body {
  position: absolute;
  top: 0; bottom: 0;
  left: 0; right: 0;
  margin: auto;
  border: solid 3px #6a6a6a;
  border-radius: 56px;
  width: 419px; height: 861px;
  background: #080808;
  transform: scale(.6);

  .camera {
    position: absolute;
    top: 44px; left: 155px;
    margin: 0 0 0 -7px;
    border: solid 3px #6a6a6a;
    border-radius: 50%;
    width: 6px; height: 6px;
    background: #1a1a1a;
  }

  .speaker {
    position: absolute;
    top: 44px; left: 50%;
    margin: 0 0 0 -34px;
    border: solid 3px #6a6a6a;
    border-radius: 10px;
    width: 60px; height: 5px;
    background: #1a1a1a;
  }

  .screen {
    position: absolute;
    top: 0; bottom: 0;
    left: 0; right: 0;
    margin: auto;
    width: 375px; height: 667px;
    background: rgba(255, 255, 255, .1);
  }

  .home {
    position: absolute;
    bottom: 18px;
    left: 0; right: 0;
    margin: auto;
    border: solid 3px #6a6a6a;
    border-radius: 50%;
    width: 60px; height: 60px;
    background: #080808;
  }
  
  &:before {
    display: block;
    position: absolute;
    top: 180px;
    left: -6px;
    border-radius: 5px 0 0 5px;
    width: 6px; height: 50px;
    content: "";
    background: #2b2b2b;
    box-shadow: 0 70px 0 #2b2b2b;
  }

  &:after {
    display: block;
    margin: 180px 0 0 419px;
    border-radius: 0 5px 5px 0;
    width: 6px; height: 50px;
    content: "";
    background: #2b2b2b;
  }
}