OmniAICreator/Qiita-1.07M huggingface dataset:
ABEJA Platformはなぜ産業構造を変革するのか？

## いま世界で何が起きているのか？


「全部変わる。」

ありとあらゆる「もの」と「こと」にIoT、ビッグデータ、AI、ロボティクスが当たり前に使われている世界を実現することが第四次産業革命です。CPS（サイバーフィジカルシステム）やDX（デジタルトランスフォーメーション）と言われることもあります。
多くの人が勘違いしているのは、一部のプロセスがAIに置き換わると考えているが、全く違います。ありとあらゆるところに自然にAIが入り込むのです。製造、物流など、これまでのITでは変化が少なかったリアルにおいても、すべてが変革し、バリューチェーン・サプライチェーンを破壊し、ステークホルダーが代わります。これは危機でもあり、大きなチャンスでもあります。

## AIで何をするのか？

「これまで出来なかったことで、できるようになると、１０００倍以上または１０００分の１のインパクトがあることを目指す。」

破壊的イノベーションの最初の適用先ビジネスモデルはほとんどが間違っています。最も重要なことは早く失敗することです。早く失敗することがAIを活用した革新的ビジネスモデルに近づく唯一の近道です。
現在のAIは、検索連動型広告が出る前のインターネットと同じ状況です。とにかく狂ったようにどんどん仮説をリリースしていく必要があります。
皆さん一緒に狂いましょう。

## ITと同じようにAIでもベンダーに騙されるのか日本企業。。
これまで、IT導入をベンダーに丸投げした多くの企業の皆様。お疲れ様でした。見事な失敗事例です。
さて、このITで起きた事象と同じようなことをAIでもやるおつもりですか？
多くの方々が誤解しているのは、AIがサブだと認識していることです。そうでは無くAIがコアなのです。どこの世界に魚屋さんで魚の目利きをアウトソースする人がいるでしょうか？
苦手だからという理由だけで、コアをアウトソースすることは全く意味が無いことです。それでも丸投げしたいという企業の皆様は今後数年にどうなっているのか。。
（そもそも世界を見渡して、ITをコアに据えていない企業はほぼありませんが。。。）

## 求められる人材像が変わる

「テクノプレナーになれ。くたばれ、技術オタク、エリートビジネスパーソン、マッドサイエンティスト。」

技術オタクは工作少年です。ただ技術をこねこねしているだけで全然社会に出ていかない。
そして、私が面白いと思っていることがあります。シリコンバレーでお会いした多くの天才的エンジニアで、技術オタクのような人が１人もいないという事実です。

エリートビジネスパーソンは時代遅れです。現代ではボトムアップ式にサイエンスで１００％考えたビジネス戦略はほぼ無価値です。というか、冷静に考えればわかるのですが、これだと一定に賢い人が考えたことはロジックとして同一化するため、全く同じものになります。
このあたりは、[こちら](https://newspicks.com/news/3448587/body/)をご覧ください。

マッドサイエンティストは世界を混沌に陥れました。20世紀は科学と技術が圧倒的に進歩した世紀です。では、実際にどうだったか。実に恥ずかしい結果です。。。そして、倫理観の無いビジネスモデルを作った多くの企業は例外なく大きな打撃を受けています。まさに効率が悪いのです。本質的に良いことをすることが重要なのです。

私はこの解がテクノプレナーにあると思っています。

「高度なテクノロジーを研究開発し、サステナビリティのあるビジネスモデルを構築することができ、リベラルアーツに基づいて社会実装する」


## ABEJA Platformを中心にしたAIの社会実装エコシステムが世界を変える

「ABEJA Platformという製品をテクノプレナーが使いこなすことで、最速の社会実装が実現し、結果的に産業構造が変革することで世界を変える。」

私たちが目指していることはまさにここです。
そして、具体的な事例として[SIX2019](https://six.abejainc.com/)を今年も開催します。

それでは、会場でお会いしましょう！

≪≪≪≪≪≪≪≪≪≪≪≪≪≪≪≪≪≪≪≪≪  ≫≫≫≫≫≫≫≫≫≫≫≫≫≫≫≫≫≫≫≫≫
ABEJA主催カンファレンス SIX2019 〜技が共創し、藝があつまる〜
参加お申し込み受付中！
https://eventregist.com/e/six2019
新卒１年目のヒヨっ子エンジニアが新しい技術を学ぶために心がけたこと

# はじめに
こんにちは。最近Dockerについて勉強し始めた新卒１年目のヒヨっ子エンジニアです。
新卒１年目ということで今年の4月からエンジニアとして仕事を始めたのですが、入社前までは技術系の話とかが苦手で、工業大学に入ったにも関わらず、課題は「見せて見せて」でターミナルなんて一人でロクに触れない状態でした。
そんな僕が社会人になって、新しい知識や言葉に埋もれている中、どうやって勉強をしたのかをつらつらと書いたものです。
今回僕はDockerを例に取って書いていますが、Dockerだけに限らず、今後新しい技術を学ぶ時の自分と照らし合わせて読んでいただけると幸いです。

# 本を読むだけではただのコミュ障
僕は今、QAチーム(いわゆるソフトウェアテストを主に行うチーム)に所属しています。
そのため、ちょっと複雑なDockerのコンテナ環境でテストを実行しています。
環境で使われているコンテナたちは、大きなネットワークの中にまとめて立ち上げられ、全てdocker-composeで管理されています。ちなみにコンテナの数は合計**10個**です。
研修でコンテナを１個立ち上げてワーイと喜んでいた僕にとっては全くもってちんぷんかんぷん(´⊙ω⊙`)
そもそも基礎がなっていないため、隣の先輩が何を言っているのかも分からないヤバイ状態です。

そこでまず基礎を固めるために本を読むことにしました。

当時読んだ本は [こちら](https://www.amazon.co.jp/Docker%E5%AE%9F%E6%88%A6%E6%B4%BB%E7%94%A8%E3%82%AC%E3%82%A4%E3%83%89-%E5%90%89%E5%B2%A1-%E6%81%92%E5%A4%AB/dp/4839959234) です。

この本を読んだことで
・コンテナを操作する基本的なコマンド
・自分でコンテナを作って実行してみる
・docker-composeで複数のコンテナを管理する
のような基礎的なことを抑えました。

しかし、**一人で本を読みながら勉強って、意外とツラいんです…**

途中で嫌になって本を窓から投げ出したって誰も怒らないし、超低いゴールを設定して明らかに成長してないだろ的な勉強量だとしても誰も咎めません。
3日坊主な僕は、本を読んでいるうちはなかなか勉強が続きませんでした…

基礎はちょこっと知っているけど別にその技術を使って何か出来るわけじゃない、周りの人が使っているのをただ遠目から見ているだけという状態を、僕は**コミュ障状態**と呼んでいます

Dockerくんのことは知っている、でも「一緒にネットワーク作ろうよ」とか言えない。
あぁコミュ障って感じですね。つらいつらい┐('～`；)┌

# 目指せ、コミュ障脱却
エンジニアって、やっぱり自分で作ったものが動いたりとか、それを誰かに見せてドヤることが一番のモチベーションだと思います✌︎('ω'✌︎ )
自分も、苦手なりに何か動くアウトプットを出せた時は死ぬほど嬉しいですし、それを誰かに見てもらいたい、もっと良いものを作りたいって思います(いつもここで頓挫するorz)
なのでやっぱり、**一旦本を置いてターミナルを叩いてみることにしました。**

ちなみに、僕がこの時やったのがコチラです。よければ見てください。
[超シンプルなDockerネットワークを作ってみた](https://qiita.com/meitonto/items/98d98ddfaf4a6ee77cfc)

# 知識を手段に

コミュ障を脱却して**知識**を**手段**にするには、もう一息です。
ここから更に自分でライブラリとか調べて隣の人をハッピーに出来るようなアウトプットを作れれば素敵ですよね。

更なる知識を蓄えるために、僕はチームリーダーにこう言いました。

**「環境周りの仕事をください！！！！！」**

元気よく言うのがポイントです。不安でも勢いがあれば何とかなります。
僕のチームのリーダーはめちゃ優しいので、次の日にはDockerくんと触れ合いながらテスト環境の整備を行なうことが出来ました。

業務で日々触ることによって

* 分からないことを先輩から聞くたびに知識のストックが出来る
* 知識を秒で活かせる
* アウトプットが出来れば秒でみんなに使ってもらう機会が来る
 
とまぁ、エンジニアのモチベが爆速で上がります｡･*･:≡(　ε:)

目に見える成果を手にした時、知識は自信に変わりました。
自信が持てると、もっと色んなことをやってみよう！！と色々調べ始めます。
その技術を技術を好きになった瞬間、それはもう手段になっていると思います。

僕は業務の中で色々Dockerを触り始めてから好きになりました。

# まとめ
* Dockerくんとの出会いは壮絶だった
* 何も分からなかったので、とりあえず本を読んでみた
* 本を読んだだけではただのコミュ障になったので、目に見える成果を作ってみた
* コミュ障を脱却すると、ようやく自分に自信がつく
* 自信を持ってその技術を好きになれれば、ウィニングラン─=≡Σ((( つ•̀ω•́)つ
【Mac】CSVファイルをExcelで開くと文字化けする

mac環境だと、出力したCSVファイルをExcelで開くと文字化けしたりします。
文字化けの解消方法を、備忘録として書いておきます。
#解決方法
Excelのエンコード種別に、CSVを合わせる。

・環境
macOS Mojave（Version 10.14.2）
Excel for Mac(Version 16.19)
##手順
###1.対象のCSVファイルをテキストエディットで開く
１：CSVファイルを右クリック
２：「このアプリケーションで開く」をクリック
３：「テキストエディット」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/323462/027e4132-dc6b-06fd-22b0-fc36f5b76c51.png)
###2.テキストエディットで複製する
１：mac画面上部のメニューバー → 「ファイル」をクリック
2：「複製」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/323462/e8fc03c4-e45a-762a-f51b-11262435c2b0.png)
###3.複製したファイルをShift JIS形式で保存する
mac画面上部のメニューバー → 「ファイル」をクリック → 「保存」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/323462/bb037007-f50a-1fab-19d2-f38064002e4f.png)
1：ファイル名の拡張子を.csvにする
2：保存時の「標準テキストのエンコーディング」の選択を「日本語（Shift JIS）」にする
3：「保存」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/323462/3c5d7a17-5600-4f5f-5527-e1d68f08a269.png)
###4.保存したファイルをエクセルで開く
文字化けせずに開ける！

#なぜ文字化けしたか
<b>「CSVファイルを出力する際のエンコーディング種別」が、「Excelが期待しているエンコーディング種別」と異なるため</b>です。

どうも、mac版のExcelは「エンコード種別Shift-JISがデフォルト」と考えているため、異なるエンコード種別のファイルだと文字化けしてしまいます。WindowsだとExcel内でエンコード種別を変えたりできるのですが、mac版ではできないようなので、このような手間がかかる手順になります。
AWS ECRにdocker-pushしたあと、aws-cliで手っ取り早くECSを更新する


開発用途にlatestタグにpushしているような場合で、
無停止などと頑張らなくても良ければ、一度taskを止めてしまってもよい。
（自動で新しいtask が作られ最新のimageに更新してくれる）


```zsh:ecs-stop-task.sh
#! /bin/sh -eu
export AWS_ACCESS_KEY_ID=AKIxxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_DEFAULT_REGION=ap-northeast-1

CLUSTER=xxxxxx-development

TASK=`aws ecs list-tasks --cluster ${CLUSTER} | jq -e '.taskArns[]'`
CMD="aws ecs stop-task --cluster ${CLUSTER} --task ${TASK}"
eval ${CMD} | jq -e '.task.desiredStatus'
```
DockerでLaravel開発がしたい!Laradock?そんなことよりBitnamiだ!~Laravel3分クッキング~

#Laravelってなんだよ
って人はこの記事みないと思うので割愛しますが、気になる人は[勝手に調べてください](https://readouble.com/laravel/5.7/ja)

---
***前置き長いので気になる人は[ここ](https://qiita.com/wannabe/items/cd16ff6d73406c0c8751#bitnamilaravel%E3%81%AE%E5%B0%8E%E5%85%A5)まで飛ばしてください***


つい先日からLaravel開発する機会があったのですが、環境を汚さないようにとDockerでコンテナ立ち上げて、その中でゴニョゴニョやっていこうかなと思ってみていたら[Laradock](https://laradock.io/)というものにたどり着きました。
**ふーん、便利じゃん**
早速ドキュメントに従ってやってみました。
gitクローンして！envファイルコピーして!docker立ち上げて!envファイル書き換えて!Let's Enjoy ! :) localhostにつないでね!
・
・
・
**404・・・? enjoyできないんだが!!!!**

#なぜLaradockでエンジョイ出来なかったのか
色々試しましたがどうも上手く行きません。
`php artisan serve`・・・ダメでした👎
nginxやapacheなど色々なサーバで試す・・もダメ
バーチャルホストの設定書き換えてみる・・・・・・・・ダメ
この辺りで疲れてきたことと、時間がかかってしまうので**とても不本意でしたが**諦めて自身でApacheコンテナとmysqlコンテナを立ち上げ、composerをダウンロードし、laravelをインストールして・・とすることにしました。

#bitnami/laravelとの出会い
自身でイチからサーバコンテナとsqlコンテナを立ち上げlaravelを入れて開発を開始し始めた辺りで、
「LaravelをDockerで使うなら便利なものがあるんだよ?」
と神の声が降ってきました。どうせLaradockだろう、と思いながら話を聞いてみましたが、どうやらbitnamiがイメージを提供しているらしい・・・
　　

　　
　


[あった。](https://hub.docker.com/r/bitnami/laravel)wordpressを使った開発作業してる時にお世話になったが・・Laravelでもお世話になるとは。
というか、超便利じゃん・・・
~~**なんだよLaradockって!!**~~いや確かに、もし使えたならLaradockも便利でしょう。検索してもそっちの方が多くヒットするからドキュメントも豊富だし。
でもbitnami/laravelの方が早いし楽じゃん!!!

**Laradockは15分で環境が構築出来ますがbitnami/laravelは2~3分で出来ます！！！！**

#bitnami/laravelの導入
とても簡単です。
専用のディレクトリ作って移動して
`mkdir bitnami; cd $_`
docker-composeファイルを~~gitからクローンして~~　**なんかgitからcloneとか説明しつつコマンドはcurlでした。当時何思って書いてたんでしょう?**
`curl -LO https://raw.githubusercontent.com/bitnami/bitnami-docker-laravel/master/docker-compose.yml`
起動
`docker-compose up -d`

え・・?これだけ?はいこれだけです
envファイルのコピーと書き換えは?Laradockみたいに時間かからないの?はい、そんな作業必要ありません。
開発はどこで?作ったディレクトリ、上記例だとbitnamiディレクトリ内にLaravelアプリケーションが展開されています。
てかyml自体軽量で大した事書いてない。gitコマンドをインストールするかと考えてる人いたら書けと言いたいレベル。

```yaml:docker-compose.yml
version: '2'
services:
  mariadb:
    image: 'bitnami/mariadb:latest'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=my_user
      - MARIADB_DATABASE=my_database
      - MARIADB_PASSWORD=my_password

  myapp:
    tty: true
    image: 'bitnami/laravel:latest'
    labels:
      kompose.service.type: nodeport
    environment:
      - DB_HOST=mariadb
      - DB_USERNAME=my_user
      - DB_DATABASE=my_database
      - DB_PASSWORD=my_password
    depends_on:
      - mariadb
    ports:
      - 3000:3000
    volumes:
      - ./:/app

```
　
　
　
ね?簡単でしょう?

え?localhostにつないでもエラーになる?ちゃんとポート設定はしましたか?初期状態だと3000ですよ
それでも繋がらない?初回起動時は多少時間がかかるので少し待ってみましょう

ね,簡単でしょう?
Ada言語 12日目 キーボード入力で整数の足し算

#はじめに
「GNAT Community 2018」を見つけてしまったので、当分Ubuntuから離れてWindowsでやっていこうと思います。
そして、今回はキーボード入力を活用して整数の足し算をやってみました。
整数型を範囲を超えた場合の処理はしていませんので、整数型に入らないとエラーが出ます。

#ソースと結果
```main.adb
with Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Text_IO;
use Ada.Integer_Text_IO;

procedure main is

   nyuuryoku1 : Integer := 0;
   nyuuryoku2 : Integer := 0;
   
begin

   Ada.Text_IO.Put_Line("X = ");
   Ada.Integer_Text_IO.Get(nyuuryoku1, 0);
   
   Ada.Text_IO.Put_Line("Y = ");
   Ada.Integer_Text_IO.Get(nyuuryoku2, 0);
   
   Ada.Text_IO.Put_Line("X + Y = ");
   Ada.Integer_Text_IO.Put(nyuuryoku1 + nyuuryoku2, 0);

end main;
```
`実行結果 : 足し算ができました。`

勉強不足で、`Integer_Text_IO`の`Put`や`Get`の、第二引数の意味が分かりませんが、0と1で試したところ、動作したので0にしました。

#最後に
現在のままだと、IDEで日本語入力ができないのでどうにかしたいと思います。

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
HPE iLOのライセンスキーがわからなくなったとき確認する方法

### 気をつけようライセンス管理！

HPEのサーバのリモート管理ツールであるiLOのライセンスキーですが、昔のバージョンではiLOのWeb画面から表示可能でした。
iLOのチップはマザーボードに搭載されており、交換をするとライセンスが消えるため、交換前にメモをしておいて、交換後に再投入の必要があります。

ML310e Gen8 v2が故障し、マザーボード交換の必要が出てきてしまいました。
こいつのライセンスのメモないけど、iLOまだ生きてるし救えるだろうと思っていたわい。
保守員の方から「最近のiLOはライセンスの一部しか表示できないので、どこかにメモありますか？」と言われて無事死亡。

サポートに問い合わせれば再発行してもらえるかもと助言を受け、問い合わせするものの購入時の書類などが必要と言われさらに2度目の死亡。
一応本体シリアルだけで駄目元でライセンス管理部署に確認してみるが、再発行されない可能性が高いと言われ3度目の死亡。

いろいろ調べたところ、インストールされているWindowsが起動するのであれば、以下手順でライセンス確認が行えるとわかり、一度交換してもらったマザーを仮組みで戻してもらって確認できました。
保守員の方ご迷惑お掛けしました・・・

### 確認方法

* 以下のようなXMLファイルを作成する。ここではilo.xmlとし、Cドライブ直下に置きました。

```xml:ilo.xml
<RIBCL VERSION="2.0">
<LOGIN USER_LOGIN="<ilo管理者ID>" PASSWORD="<ilo管理者パスワード>">
<RIB_INFO MODE="read">
<GET_ALL_LICENSES/>
</RIB_INFO>
</LOGIN>
</RIBCL>
```

* 管理者権限でコマンドプロンプトを開き、以下を実行

```plaintext
c:\Program Files\Hewlett Packard Enterprise\HPONCFG\hponcfg /f c:\ilo.xml /l c:\log.xml /v
または
c:\Program Files\HP\HPONCFG\hponcfg /f c:\ilo.xml /l c:\log.xml /v
```

* 「Script succeeded」と出てくればOK、上記log.xml内に以下のような感じでライセンスが表示される

```xml:log.xml
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
<GET_ALL_LICENSES>
    <LICENSE>
         <LICENSE_TYPE VALUE= "iLO 4 Essentials"/>
         <LICENSE_KEY VALUE= "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"/>
         <LICENSE_INSTALL_DATE VALUE= "Mon Mar  3 15:03:45 2014"/>
         <LICENSE_CLASS VALUE="FQL"/>
    </LICENSE>
</GET_ALL_LICENSES>
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
```

ちゃんとメモしておくのが一番だけど、表示できなくなって困っている人がいたら参考にしてください。
コマンドラインのGoogle Authenticatorのotpauthをパスワードマネージャに登録するときの注意点

# パスワードマネージャにGoogle Authenticatorの情報を登録する


## パスワードマネージャはQRコードを読み取って、OTPを表示できる。
パスワードマネージャは最近は高機能化されてきて、バーコードをスキャンしてワンタイムパスワードを表示できるような機能をもっているものも出てきています。

これで2要素認証といえるかどうか、という議論はあります。2 **段階** 認証ではありますが、OTPはパスワードマネージャが表示するものなので、マスターパスワードを入れれば表示が可能となってしまいます。この場合、目的は2要素認証なのですが、結果として利用側としては **1要素認証** になってしまいます。この点には注意が必要です。パスワードマネージャは指紋認証などの「パスワードではない」認証方法を利用すれば、これは **2要素認証** と言えるかもしれません。

## ubuntuに導入できるgoogle-authenticator

他方、ログインに2段階認証を導入する場合、google-authenticatorが一番手軽に導入できるものだと思うのですが、google-authenticatorをコマンドラインから起動しても、ターミナル上に表示されたQRコードは、少なくともデスクトップ版の1passwordバーコードスキャナでは大きすぎて読めませんでした。

とはいえ、QRの上部にはURLが書かれているのですが、このotpauthは **URLエンコードされている** ため、そのままコピーしてパスワードマネージャに登録すると、使えないotpauthとなってしまいます。（当然、このまま登録しても、誤ったothauthのため、ログインできなくなります）

**otpauth以下の部分は、そのままパスワードマネージャに登録するときにはURLデコードが必要** です。具体的には、以下の文字列を置換します。以下の3文字くらいしかないと思いますが、それ以外にもあれば、当然デコードが必要です。
（何カ所かありますから、全部デコードしてくださいね）

| 置換前 | 置換後 | 
|:-----:|:----:|
| %3F   | ? |
| %26   | & |
| %3D   | = |

## 簡単なスクリプトで置換してしまう。

ということで、非常に簡単ではありますが、スクリプトを書いてみました。なんということはなく、上記3種類を勝手に置換するだけです。

起動するときには、引数にgoogle-authenticatorから出力されているURLのうち、otpauth以降を与えるのですが、前後に[']を付けるようにしてください。
（味も素っ気もないスクリプトですが、手動置換だと忘れそうなので作ってみました）

使用方法：
`encode-otpauth.py 'otpauth://hogehoge%3Fhogehoge%26hogehoge%3D'`


```python:encode_otpauth.py
#!/usr/bin/python3
import sys
args = sys.argv

args[1] = args[1].replace("%3F", "?")
args[1] = args[1].replace("%26", "&")
args[1] = args[1].replace("%3D", "=")

print("input password manager below otpauth for 2FA")
print(args[1])
```

# 参考となったURL
google-authenticatorそのものの導入：https://orebibou.com/2016/07/ubuntu-16-04-lts%E3%81%A7google-authenticator%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AF%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Fss/

URLデコード（といいつつ、結果としてシンプルなコードにしてしまいましたが）：https://note.nkmk.me/python-urllib-parse-quote-unquote/

2要素認証と2段階認証：https://cryptomo.jp/2018/11/two-factor-authentication/
日本語を含む Keynote が slideshare にアップロードすると日本語が文字化けするのを直すワンライナー ver fish shell

# 前置き

こちらは [今すぐalias登録すべきワンライナー by ゆめみ①-2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yumemi01_one-liner02) の 25日目の記事です。メリークリスマス。

前日(24日)の記事は [こちら](https://www.nyarn.tech/entry/2018/12/24/232302)

# やること

* Slide Shareの文字化けが激しい。
* Speaker Deckに移行したいが今更感があるのでしばらく騙し騙し使って行きたい
* [こちら](https://abicky.net/2016/05/16/033103/)の最高のワンライナーを叩けば日本語でもアップロードできる
* **でもfishだと使えない**
* fishで使えるようにしたい

# ワンライナー

```shell
env LANG=C LC_ALL=C sed -i '' s'|/Registry (Adobe) /Ordering (Japan1) /Supplement [0-9]|/Registry(Adobe) /Ordering(Identity) /Supplement 0|g' /path/to/pdf
```

**fishで使えるようにしたぞ**

# 参考

https://abicky.net/2016/05/16/033103/
laravel form 絞り込み

絞り込みフォームを作ってみよう。

idは完全一致
title,body は全文検索
csrf_field()は使わない

# Nikki.php

```

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Nikki extends Model
{

    //これがないと idやtitle,body で検索できない
    protected $fillable = [
        'id','title','body'
    ];
}


```


# NikkiController.php


```

class NikkiController extends Controller
{


    public function show(Request $request)//フォーム送信される可能性がある場合はこのRequestってのは必須
    {

        $query = Nikki::query();

        //　フォームが送信されてきたら絞り込み
        if ($request->input()) {

            foreach ($request->only(['id']) as $key => $v) {
                if(!empty($v)) {
                    $query->where($key, $v);
                }
            }

            foreach ($request->only(['title','body']) as $key => $v) {
                if(!empty($v)){
                    $query->where($key,'like','%'.$v.'%');
                }
            }

        }

//        request all を入れることで条件を引き継ぎ
//1ページに2件表示するよ
        $nikkis = $query->paginate(2)->appends($request->all());

        return view('nikki.show', ['nikkis' => $nikkis]);
    }

```


# show.blade.php

```

{{-- どのレイアウトを使うか指定　layout.blade.php を使用 --}}
@extends('layout')

@section('content')

    <?php

            $id = '';
            if(!empty($_GET['id'])){
                $id = $_GET['id'];
            }

            $title = '';
            if(!empty($_GET['id'])){
                $title = $_GET['id'];
            }



    ?>
    


    <h2>検索</h2>

    <form action="/nikki/show/" method="GET">
    {{--{{ csrf_field() }}--}}
    <div>
        <label>ID</label><br>
        <input type='text' name='id' value="{{$id}}" />
    </div>

        <div>
            <label>TITLE</label><br>
            <input type='text' name='title' value="{{$title}}" />
        </div>


        <div>
        <input type='submit' />
    </div>
    </form>



    @if(Session::has('status'))
        メッセージ：{{ session('status') }}
    @endif



    <p><a href="/nikki/add/" class="btn btn-primary">新規追加</a></p>

@foreach ($nikkis as $v)
    <div class="card mb-2">
        <div class="card-body">
            <h4 class="card-title">{{ $v->id }} : {{ $v->title }}</h4>
            <h6 class="card-subtitle mb-2 text-muted">{{ $v->updated_at }}</h6>
            <p class="card-text">{{ $v->body }}</p>
            <a href="/nikki/add/{{ $v->id }}" class="card-link">修正</a>
            <a href="/nikki/del/{{ $v->id }}" class="card-link">削除</a>
        </div>
    </div>
@endforeach





    @if($nikkis->lastPage() > 1)

        @if($nikkis->previousPageUrl())
            <a href="{{ $nikkis->previousPageUrl() }}">前のページへ</a>
        @endif

        {{ $nikkis->currentPage() }} / {{ $nikkis->lastPage() }}

        @if($nikkis->nextPageUrl())
            <a href="{{ $nikkis->nextPageUrl() }}">次のページへ</a>
        @endif

    @endif





@endsection

```
12-25 SOUL

https://adventar.org/calendars/3353 の25日目エントリーです。

SOULは、ROLI社がまだ構想しかアナウンスしていないオーディオ開発言語およびそのフレームワークです。

https://soul-lang.org/

Audio Developers Conference 2018のキーノートで公開されたもので、今回のイベントの目玉といえるでしょう。キーノートはyoutubeで公開されています（SOULの話は15分目くらいから）。

https://www.youtube.com/watch?v=-GhleKNaPdk

SOULの特徴を列挙すると以下のようになります。

- APLとしてのSOULは、LLVMバイトコードを使用した独自フォーマットのバイナリにコンパイルされます（純粋bitcodeになるかどうかは不明）
- SOULのバイトコードはGPUにおけるシェーダーのような存在になり、「SOULをサポートするDSP」がより高速にサウンドを処理できる可能性があります
- SOULのバイトコードを生成できる機構を使えば、開発言語はC++に限らずJavaScriptであろうとC#であろうとJavaであろうと何でも良いです

類似の先行技術としては、同じくLLVMを利用してDSP用のバイナリを生成できるfaustが挙げられるでしょうか。ただfaustは多言語対応にはなっていません。[別のAdvent Calendar向けに書いたネタですが](http://atsushieno.hatenablog.com/entry/2018/12/01/000749)、Extemporeの作者が言語ランタイムとの相互運用をどう解決するか（intra-processかinter-processか）という観点でいろいろ分析していた多言語対応の枠組みにはおそらく入っておらず、単にSOULのコードジェネレーターが用意されることになると思います（そうしないとDSPチップに各種言語ランタイム環境が必要になるので）。

日本でも[GLSLで作曲](https://qiita.com/notargs/items/2ffe487cc6cb3844fc21
)という試みが見られますが、proof of conceptとしてはコレに近いのではないでしょうか。

いずれにせよ、SOULはまだプロジェクトの告知が出たばかりで、実体は何も出ていないので、今後のリリース待ちという状態です。
消してしまった zsh の .zsh_history の復元

# ヒストリファイルを消してしまった！
あるとき zsh で `rm ~/.zsh_history` とやってしまった時の対処方法。現在のセッションにおける `history` コマンドで出てくるコマンド履歴を用いて復元を試みたときのメモ。**セッションからログアウトしてしまうと使えない。**

## 復元対象
zsh で

```zsh
setopt extended_history
```

を設定している人向け。これで `history -i -D` とすれば

```zsh
39534  2018-12-25 13:55  3:34  vi
# ヒストリ番号 実行日付 実行時間 コマンド
```

と表示される。このとき .zsh_history の各行のフォーマットは以下のようになっている。

```zsh
: 1545713738:214;vi
#: (実行時刻 unix time):(実行時間[秒]);(コマンド列)
```

これを復活させたい。

# 復元するためのコマンド
`awk` などを使ってナイーブには以下のようにすれば元に戻せる。もっと効率良い方法はあるはず。

```zsh
$ history -i -D -t "%s" 1 > tempHistfile.txt
$ awk '{print ": " $2}' tempHistfile.txt | sed -e "s/ $//" > dates.txt
$ awk '{c="";for(i=4;i<=NF;i++) c=c $i" "; print c}' tempHistfile.txt > commands.txt
$ awk '{print $3}' tempHistfile.txt | awk -F ':' '{print $1*60+$2}' > time.txt
$ paste -d ':' dates.txt time.txt > joined.txt
$ paste -d ';' joined.txt commands.txt > .histfile
```

## 各行説明
```zsh
$ history -i -D -t "%s" 1 > tempHistfile.txt
```
`history`の結果を最初から最後まで出力する。デフォルトでは直近のいくつかしか出力しないが、引数に`1`を与えると全部出力する。`-i`は実行時間を出力する。`-D`は実行時刻を "YYYY-MM-DD mm:ss" 形式で出力するが、`-t "%s"` オプションを追加することで unix time で出力される。

```zsh
$ awk '{print ": " $2}' tempHistfile.txt | sed -e "s/ $//" > dates.txt
```
`awk` を使って実行時刻だけを抜き出す。最終的には行頭に ": " が欲しいので、一緒に出力しておく。また行末のスペースが邪魔なので消しておく。

```zsh
$ awk '{c="";for(i=4;i<=NF;i++) c=c $i" "; print c}' tempHistfile.txt > commands.txt
```
`awk` を使ってコマンド列を抜き出す。4 要素目以降だけを抜き出すようにする。

```zsh
$ awk '{print $3}' tempHistfile.txt | awk -F ':' '{print $1*60+$2}' > time.txt
```
`awk` を使って実行時間を抜き出す。実行時刻は "mm:ss" 形式になっているので、`awk -F ':'` を用いて ":" 区切りにし、第 1 要素を 60 倍したものに第 2 要素を足して秒単位に変換する。

```zsh
$ paste -d ':' dates.txt time.txt > joined.txt
$ paste -d ';' joined.txt commands.txt > .histfile
```
それぞれ ':' 区切りと ';' 区切りで連結する。

# 最後に
もっとシンプルな方法があったら教えてください。あと `rm` 使うときは気をつけよう。
VirtualBoxで共有フォルダを作成できなかったときの対処法

VirtualBoxで共有フォルダを作成するとき、いつもなんとなくでできていたが
今回はまってしまったのでメモ。


## 共有フォルダの作成方法
1. 適法な場所にフォルダを作成

```
$ cd workplace 
$ mkdir VM-shared
```



2.設定の共有フォルダから、VM-sharedを選択する
![スクリーンショット 2018-12-25 14.43.07.png](https://qiita-image-store.s3.amazonaws.com/0/179423/b93e67a4-056d-a35c-41da-997953a66b8f.png)



<br>

本来これで作成できるはずができなかった。

## Guest Additionsのダウンロード

共有フォルダを作成するにはGuest Addtionsのダウンロードが必要で
ダウンロードのために、空のドライブを作成する


1. 設定のストレージから空ドライブを作成する


![スクリーンショット 2018-12-25 14.43.29.png](https://qiita-image-store.s3.amazonaws.com/0/179423/32b004e4-3009-6262-8208-9bbcbe27eace.png)




2. 作成後、共有フォルダを作成したい仮想マシンを開く
3. 上部メニューバーのDeviceからGest Addition Imageを選択する
4. ThisPC (Computer)からVirtualBox Guest Addtionsを選択してインストールする。

![スクリーンショット 2018-12-25 14.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/179423/4f31a093-5f59-6fac-42ba-1201f14b7fa0.png)

空のドライブを作成しておくことで、どこにGuest Additionsをインストールすることができるようになる。

そのあとに、最初の方法で共有フォルダを作成すると、仮想マシン内に共有フォルダが出来上がっている。
Djangoのテストで"AssertionError: No templates used to render the response"が発生

# 環境
Django 2.1.1
Python 3.6.1

# やりたかったこと
DjangoのTestCaseのassertTemplateUsedメソッドで、レスポンスが特定のテンプレートを利用していることを確かめたかった。

```python:
class TestIndexView(TestCase):
    def test_get(self):
        response = self.client.get('/')
        self.assertTemplateUsed(response, 'application/index.html')
```

# 問題
テストを実行したところ、以下のエラーが発生した。

```python:
F
======================================================================
FAIL: test_get (application.tests.test_views.TestIndexView)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "project/application/tests/test_views.py", line 8, in test_get
    self.assertTemplateUsed(response, 'application/index.html')
  File ".pyenv/versions/3.6.1/lib/python3.6/site-packages/django/test/testcases.py", line 554, in assertTemplateUsed
    self.fail(msg_prefix + "No templates used to render the response")
AssertionError: No templates used to render the response
```

# 原因
settings.pyのSECURE_SSL_REDIRECTをTRUEにしていたため、HTTPからHTTPSにリダイレクトが発生し、ステータスコード301が返却されたことが原因ではないか？と考えた。

```python:
<HttpResponsePermanentRedirect status_code=301, "text/html; charset=utf-8", url="https://testserver/">
```

# 解決策
テスト時にはsettings.pyのSECURE_SSL_REDIRECTをFALSEにした。
[O] Fw: [REQUEST] Microsecond timestamps

2011年の冬、とある Org ユーザから届けられた機能追加のリクエスト、その和訳です。

====

どうやら、送信先の設定ミスで私のメールボックスだけに届いているみたいだから、転送するね。-- Christian

-----

親愛なるOrgerの皆様、

マイクロ秒をサポートするタイムスタンプを実装してくれませんか？

私は普段から、同じようなタスクリストを何度も作って、それをチェックしていることに気が付きました。そんな無駄を省いて、特に配送スケジュールを組むためには、Org Mode を使うのが良いだろうと思います。ところが、既存のタイムスタンプ機能では、私の場合はうまくいきません。

というのも、私の場合のよくあるユースケースでは、48時間以内に、25億のご家庭を訪問することになるので、それぞれのタスクをマイクロ秒の精度で調整できないと困るのです。

それから、我々の配送部門が、Org Modeを試験的にサポートしたことをお知らせします（そこで、ベータ試験の協力者を募集します！）

この試験運用の期間中は、メーリングリストに参加していて、いつもお子さんと一緒に過ごしている皆様全員にリポジトリのプッシュ権を付与する予定です。（お願いだからいい子にしていてね）

まずは次のリポジトリをクローンしてください。

git clone git://north.pole/littlehelpersrepo.git

そして、皆様の希望するアイテムを `wishlist.org` に気軽に追加してください。また、 `contacts.org` にある住所が最新かどうかも忘れずに確認してくださいね。最後に、変更をコミットしてプッシュしてください。

メリークリスマス、みんな。ホ、ホ、ホ。

サンタより

====

> I'm forwarding this to the list as it was sent only to my mailbox by mistake. -- Christian

> -----

>> Dear Orgers,

>> I would like to make a feature request for microsecond timestamps.

>> Since I often find myself making a list and checking it twice, I think the excellent Org mode would be a great way to schedule my deliveries. However, the existing timestamp functionality just won't cut it for me.

>> As my typical use case involves visiting over 2.5 billion homes in 48 hours, I need to be able to schedule each TODO to microsecond accuracy. Please consider developing this feature.

>> Meanwhile, I'm happy to announce experimental Org support in our orders department -- beta testers welcome! For the trial period we will give push access to everyone on the Org mailing list who's been a good little girl or boy all year. (So be good, for goodness sake!) Just do

>> git clone git://north.pole/littlehelpersrepo.git

>> Then simply add your items to wishlist.org, check that they're cross-referenced to an up-to-date address in contacts.org, commit your changes and push.

>> Merry Christmas, everybody! Ho ho ho!

>> Santa


Reference:
- https://www.mail-archive.com/emacs-orgmode@gnu.org/msg50111.html
Firestoreでドキュメントの作成/編集時刻をサーバ側に任せる方法

## はじめに

Firebaseの勉強がてらクイズの早押しボタンをVueとFirebaseで作ったんだけれども(クリスマス会のクイズ大会用)、ボタンを押した履歴のタイムスタンプ指定にクライアントの時刻を使いたくないなーと思っていたところ、探してみたらサーバ側に処理を任せる方法があったのでメモ。

## serverTimestampを使う

作成日なり更新日なりのフィールドに`new Date()`のかわりに`firebase.firestore.FieldValue.serverTimestamp()`を使えばOK。それだけ。

https://firebase.google.com/docs/reference/js/firebase.firestore.FieldValue#.serverTimestamp

## サンプル

### クライアント側で値設定(よろしくないやつ)

```javascript
const db = firebase.firestore()
db.settings({
  timestampsInSnapshots: true
})

db.collection('test').add({
  createdAt: new Date()
})
```

### サーバ側で値設定

```javascript
const db = firebase.firestore()
db.settings({
  timestampsInSnapshots: true
})

db.collection('test').add({
  createdAt: firebase.firestore.FieldValue.serverTimestamp()
})
```

最初は「Functionsでやらなきゃダメなのかなー」とか思ってたけど楽でよかった。
【2018年12月実施】 MySQLのデータインポート手順

#前提条件
ローカル環境(MAMP)で作成したWordPressサイトを本番環境（Linux）に移行しました。phpmyadminからエクスポートしたデータ(**.sql)を、MySQLにインポートするまでの手順を紹介します。

#MySQLのﾊﾞｰｼﾞｮﾝ
```
$ mysql --version
$ mysql Ver 14.14 Distrib 5.6.28, for Linux (x86_64) using EditLine wrapper
```

#MySQLコマンド
<今回設定するDB情報>
ユーザ名：test
パスワード：test
ホスト名：localhost
データベース：testdb
SQLデータ：swp.sql

##①MySQLにログイン
```
//$ mysql -u [user_name] -p

$ mysql -u root -p
```

##②ユーザの追加
```
//mysql > create user [user_name]@[host_name] IDENTIFIED BY ['password'];

mysql > create user test@localhost IDENTIFIED BY 'test';
```


##③データベースの追加
```
//mysql > create database [db_name];

mysql > create database testdb;
```

##④ユーザにDB権限付与
```
//mysql > grant [権限] on [password].[table] to [user_name]@[host_name] IDENTIFIED BY['password'];

mysql > grant all on test.* test@localhost IDENTIFIED BY 'test';
```

##⑤ MySQLデータのインポート
```
//$ mysql -u [user_name] -p [db_name] < /[sql_data]

$ mysql -u root -p testdb < /tmp/wp.sql
Enter password:
```
#⑥SQLデータが正常にインポートされたか？を確認
##⑥-① MySQLにログイン
```
//mysql -u [user_name] -p
mysql -u root -p
```
##⑥-② データベースを選択
```
//mysql > use [db_name];
mysql > use testdb;
```
##⑥-③ データベースのテーブルを表示
```
mysql > show tables; //一覧表示
mysql > show table status;　//詳細表示
```
#おわり
show tablesコマンドでインポートしたデータが表示されたら、インポート完了です。
mysqlのデータインポート手順はQiitaにいくつもありますが、検索で上位で出るのは3年以上前の記事が多かったので改めて作成しました。

#お願い
コマンドの間違いや内容の誤りがあれば、ご指摘ください。随時修正します。

#おまけ
##①よく出るエラー「ERROR 1064(42000)」
```
ERROR 1064(42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ‘*****‘ at line 1

//SQLの文法に誤りがあるときに表示される。
//文字列を「'(シングルコーテーション)」でくくらなかったり、コマンドの最後に;(セミコロン)を入れ忘れると出る。
```


##②参考サイト

「MySQLでユーザーを作成し、権限を設定する方法」
http://proengineer.internous.co.jp/content/columnfeature/6638

「MySQLのデータインポート・エクスポート」
https://qiita.com/rato303/items/2e614f23e5feee150ffc
php-master-changes 2018-12-24

今日は timelib の更新、browscap のバグ修正、ドキュメントの更新、__callStatic のバグ修正、interned string の破棄処理について 7.3 以降へ入っていた修正の 7.2 系へのバックポートがあった！

# 2018-12-24
## derickr: Upgrade timelib to 2018.01RC3
- https://github.com/php/php-src/commit/3e4a3d005a80d0ba0f87635d3ebccda7df137d0d
- [7.3~]
- ext/date で、timelib を 2018.01RC3 へ更新

## derickr: Update API use due to changes in timelib 2018.01RC3
- https://github.com/php/php-src/commit/a9a084c09292b239bfc6a1d3026ceb3733958555
- [7.3~]
- ext/date で、timelib の更新にあわせ tzi.tz->bit32.timecnt を tzi.tz->bit64.timecnt へ修正

## nikic: Fix invalid efree in browscap
- https://github.com/php/php-src/commit/64de5bc224584e1da08c5c2bdf76db72ccbaaaab
- [7.2~]
- browscap のコードで zend_string_release() を呼ぶべき箇所で efree() を呼んでいた問題の修正
- [#77338](https://bugs.php.net/bug.php?id=77338) を参照、`get_browser('')` がクラッシュしていた
- そもそも 7.3 でこのコードが実行されるのがおかしい、という PCRE 周りの問題が別にあるっぽいが、あまり見れてない

## dstogov: Added note about changes in class declaration opcodes
- https://github.com/php/php-src/commit/b95cd92b9d9edb0f6f9a4d67e657c0d00d866aee
- UPGRADING.INTERNALS へ、クラス宣言に関するオペコードの変更について追記
- [internals で言われてた奴](https://externals.io/message/103626)
- [8 月に修正入れてた](https://qiita.com/sj-i/items/cfe00f853522d1fc4201#dstogov-replace-zend_class_entry-traits-by-persistent-zend_class_entry-trait_names)あたりの話
- ZEND_ACC_LINKED は [9 月に別途入った奴](https://qiita.com/sj-i/items/951e46693d1af57adf2a#dstogov-replace-zend_acc_anon_bound-zend_acc_unresolved_parent-and-zend_acc_unresolved_interfaces-with-single-zend_acc_linked)

## dstogov: Fixed bug [#77339](https://bugs.php.net/bug.php?id=77339) (__callStatic may get incorrect arguments)
- https://github.com/php/php-src/commit/7e597f48e9fda982e930e4f617d2b2d98d8878a5
- [7.2~]
- __callStatic に誤った引数が渡される場合がある問題の修正

## dstogov: Backport later interned strings destruction.
- https://github.com/php/php-src/commit/5888fbde0d9687eda92f2bc8deb1e8c4ac171346
- [7.2~]
- zend_interned_strings_dtor() の呼び出しを zend_shutdown() から php_module_shutdown() へ移動する修正を 7.2 以降で適用
- 去年に [7.3 向けで入れてた奴](https://github.com/php/php-src/commit/974a8f8ad2a0ed923abb5c63cfc7d73e2c81e21f)の一部バックポートっぽいかな
[R]基本統計量の算出

#データセットの準備
```r
data = c(12, 3 ,5, 2, 6, 7, 9, 6, 4, 11)
```

#summaryを使ってざっくりと出してみる
```R
summary(data)
>  Min. 1st Qu.  Median    Mean   3rd Qu.  Max. 
   2.00    4.25    6.00    6.50    8.50   12.00 
```
自分の中でざっくりと見るのに楽な方法の一つ
###summary()関数の戻り値の意味

|summary()|意味|
|:-----------|:------------|
Min	|最小値
1st Qu	|第一四分位数
Median	|中央値
Mean	|平均値
3rd Qu	|第三四分位数
Max	|最大値

#平均値
```R
mean(data)
> 6.5
```

#中央値
```R
median(data)
> 6
```


#最頻値
Rでは最頻値を一発で算出するものはなさそうなので、table関数を使って算出したいと思います。
まずは単純にtable関数だけを使うとこんな感じ

```r
table(data)
>data
 2  3  4  5  6  7  9 11 12 
 1  1  1  1  2  1  1  1  1 
```

上がデータの値。下がその頻度を表しています。この程度のサンプルサイズであれば問題ないですが、大きくなると困るので最頻値を目視でなくて、きちんと算出してみましょう

```r
x <- table(data)
x[x == max(x)]
>6 
 2 
```

#不偏分散

```r
var(data)
> 10.94444
```

#不偏標準偏差
```r
sd(data)
>3.308239
```
Lexerを実装しよう(2)

#前置き
|バージョン|環境         |
|:-------:|:-----------:|
|jdk-10   |IntelliJ IDEA|
たぶん上の環境で動きます。

前の記事[Lexerを実装しよう(1)]
(https://qiita.com/mirror11akii/items/7fe6fd3143b9a1eb9683)
####補足
このシリーズは**私に共感してくれる人、new languageに興味を持っている人、チーム開発したいjavaプログラマさんとつながりたいと思って書いているもの**です。ほかの用途で利用・閲覧することはもちろんOKです。ですが、興味を持っていただけるととてもうれしいですし、コメントなどで何か教えてくださるととても助かります。

---
　Lexerを少しfunctionalにしたつもりです。Lexerのように入力と出力の個数が違いかつ出力数がわかっていないと扱いにくいと感じました。
##実装
```java:FLexer.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

public class FLexer {

    static Stack<String> stack = new Stack();

    //private static List<Character> brackets = Arrays.asList('(',')','{','}','[',']');
    private static List<Character> operators = Arrays.asList('=','+','-','*','/');

    public static FType getType(final Character c){
        if(Character.isLetter(c)) return FType.alphabet;
        else if(Character.isDigit(c)) return FType.digit;
        else if(Character.isWhitespace(c)) return FType.space;
        else if(operators.contains(c)) return FType.operator;
        //else if(brackets.contains(c)) return FType.brackets;
        return FType.other;
    }
    public static List<Character> toList(final char[] chars){
        List<Character> list = new ArrayList<>();
        for(Character aChar : chars){
            list.add(aChar);
        }
        return list;
    }
    public static void analyze(final Character aChar){
        if(stack.empty()){
            stack.push(Character.toString(aChar));
        }else{
            final String previous = stack.pop();
            if(getType(aChar) == getType(previous.charAt(0))){
                stack.push(previous + aChar);
            }else{
                stack.push(previous);
                stack.push(Character.toString(aChar));
            }
        }
    }
    public static void disp(){
        System.out.println(stack);
    }
}
```
```java:FType.java
public enum FType{
    alphabet,
    digit,
    space,
    operator,
    //bracket,
    other
}
```
##実装の説明
　「かっこ」はやはりめんどうなので実装していませんが、analyze()のif分岐を増やせば対応できると思います。

`public static List<Character> toList(...)`
ラムダ式を使いたかったので、リストに変換する関数を用意しました。
`public static void analyze(...)`
　前の要素を読むならスタックとか使えるんじゃないかと思ってスタックにしました。

###実行
```java:Main.java
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException{
        System.out.println("\n--EAM");
        char[] chars = EAM.use("lib\\test.txt", eam -> eam.read());
        for (char aChar : chars) {
            System.out.print(aChar);
        }
        System.out.println( "\n--FLexer");
        FLexer.toList(chars).stream()
                            .forEach(FLexer::analyze);
        FLexer.disp();
    }
}
```
```
--EAM
close()
a = 2 + 7 * 3
log a
--FLexer
[a,  , =,  , 2,  , +,  , 7,  , *,  , 3, 
, log,  , a]
```
こんな感じになれば成功です。分からないことがあれば質問してください。
Stackdriver Error Reporting for PHPをGCE上で使ってみる

こんにちは、 @mshibuya です。

GCE上で動いているPHPアプリケーションにおいて適切にエラーの収集・解決ができるようにStackdriver Error Reporting for PHPを導入しようとしているのですが、はまりどころがいくつかあったので共有します。。

なおこの記事は[オプトテクノロジーズアドベントカレンダー](https://qiita.com/advent-calendar/2018/opt-technologies)11日目の代打エントリーです…（←遅刻ではないという主張）。

# Stackdriver Error Reportingとは

GCPが提供するモニタリングシステムStackdriverの機能のひとつで、アプリケーションレベルのエラーや例外を一元管理しわかりやすくリアルタイム表示できるエラー通知ツールです。この手のツールではAirbrakeやSentryあたりが有名ですね。

公式サイトは[こちら](https://cloud.google.com/error-reporting/)。

# Stackdriver Error Reporting for PHP

この手のサービスのご多分にもれず、各種言語向けのSDKが用意されていて簡単にアプリケーションに統合できるようになっており、PHP版も存在します。が、[公式サイト](https://cloud.google.com/error-reporting/docs/setup/php?hl=ja)に記載のある通りベータ版のステータスであり(2018/12/24現在)、あんまりドキュメント等充実していません。。

# はまりポイント1：必要な権限に注意

ローカルで試そうとしていて、自分自身に `Error Reporting` → `エラー書き込み` の権限をつけ、エラーになるPHPコードを実行させるも一向にエラーとして検知されず…。

で、なんでかと思い[SDKのソースコード](https://github.com/googleapis/google-cloud-php-errorreporting)を追いかけて調べました。

結論、[こちら](https://cloud.google.com/error-reporting/docs/setup/compute-engine)に記載

> 次のいずれかの方法で、エラーを Google Compute Engine アプリケーションから Stackdriver Error Reporting に送信できます。
> 
> Stackdriver Logging にロギングする。すでに Stackdriver Logging を使用している場合、追加設定は不要です。フォーマット設定の要件について詳しくは、例外のロギングをご覧ください。
> 
> Stackdriver Error Reporting API を使用する。アプリケーションでは、REST API を使用して HTTP リクエストを送信したり、試験運用中のライブラリを複数の言語で使用したりできます。

のある通り通知経路は２パターンあるわけですが、

- 通知経路によって異なる権限が必要（Stackdriver Logging経由の場合は `Logging`　→　`ログ書き込み` 、Stackdriver Error Reporting API経由の場合は `Error Reporting`　→　`エラー書き込み`）
- **PHP SDKの場合、例外ハンドラにひっかけてエラー通知される時は必ずStackdriver Logging経由となる**。Error Reporting API経由で送られるのはアプリケーションから明示的に呼び出した場合のみ

ということで、ログ書き込みがないと書けないのでした。

えー、「Stackdriver Error Reportingを使うからエラー書き込みの権限があればいいよね！」って思うじゃないですか普通…。

# はまりポイント2：GCE上で使うときの罠

で、権限の謎は解けたものの、ローカルでやってもGCE上でやっても一向に出ず…。GAEで動いてる別アプリでは問題なく出てるので、条件を近づけようとしてあれこれ試して判明したことは

- **service名が空だとLoggingには流れるものの、Error Reportingに拾われない**

ということ。

https://github.com/googleapis/google-cloud-php-errorreporting/blob/caf7471b1a1cfe173f45cb466350ddc587481d84/src/Bootstrap.php#L130

でmetadata providerからserviceIdを取得しているわけですが、GAE上ではちゃんとサービス名が返るのに対しGCE上やローカルでは値が取れず、結果Error Reporting側に拾われないのでした…。

解決策としては、`vendor` ディレクトリの直上に `ErrorReportingBootstrap` の名前で

```
<?php
  use Google\Cloud\Logging\LoggingClient;
  return (new LoggingClient())->psrLogger('app-error', [
    'batchEnabled' => true,
    'debugOutput' => true,
    'batchOptions' => ['numWorkers' => 2],
    'metadataProvider' => new Google\Cloud\Core\Report\SimpleMetadataProvider(
      [], '', 'my-service'
    )
  ]);
```

のようなファイルを作っておくとOKです（　`my-service` のところは適切に名前を入れてあげてください）。こうすることで

https://github.com/googleapis/google-cloud-php-errorreporting/blob/caf7471b1a1cfe173f45cb466350ddc587481d84/src/prepend.php#L52

の処理がファイルを読んでくれて、ちゃんとservice名の入ったmetadata providerを持つloggerを使えるようになります。

# まとめ

Stackdriverはシステムに必要ないろんなモニタリングツールが揃っていて便利なのですが、もうちょっと親切さが増してくれるとより活用しやすいのになーといった感想です。

アプリケーションエラーの適切な収集・解決はシステムの安定稼働にとって重要なので、こういったツールを活用していい感じの運用体制を作っていけるとよいですねー :muscle:
Link > C++ Builder XE4 > FastReport > AG-TECH社のドキュメント > チュートリアル的なもの

```txt:動作環境
C++ Builder XE4
```

FastReport VCLのドキュメント。

TfrxChartViewの使用について調査中。

以下のサイトのものは入門者には分かりやすいかもしれない (チュートリアル的なもの)。
https://www.agtech.co.jp/products/fastreportvcl/HTML/index.html


### 関連

- [Link > FastReport VCL 5 User's Manual](https://qiita.com/7of9/items/8355a31b455cef63829b)
メモ：「３０日でできる！OS自作入門 」22日目

## C言語でアプリケーションを作ろう

1) OS を守ろう 5
- OS 側の API に悪いコード仕込まれたらしょうがないとのこと

2) バグの発見を手伝う
- スタックを守る
- INT 0x0c
- qemu 上は動作しない
- 対象の命令の行まで取り出せる
    - 例外時 CPU が自動でPUSHしてくれる EIP, CS, EFLAGS, ESP, SS など

3) アプリの強制終了
- 無限ループでCPU食ってるタスクとか
    - 無限ループもちゃんんとBreakできる、凄い

4) C言語で文字列表示１
- アセンブリでAPIを書く
- 6バイトの書き換えはもういらない


5) C言語で文字列表示２
- hrb ファイルにはデータ部分が生成されてなかった
- hrb ファイルの構成
    - 0x0000 - データセグメントの大きさ
    - 0x0004 - Hariという Identifier
    - 0x0008 - データセグメントの予備領域の大きさ
    - 0x000c - ESP 初期値、スタック領域になる
    - 0x0010 - データ部分の大きさ
    - 0x0014 - データ部分がどこから始まってるか
    - 0x0018 - 0xe9000000 (実行開始番地にJMP)
    - 0x001c - 実行開始番地
    - 0x0020 - malloc 領域開始アドレス
- hrb ファイルのへっだから情報を読取ることによってデータセグメントが入ってるファイルも実行出来るようになった

6) ウィンドウを出そう
- ウィンドウの大きさ、名前などを指定できる API

![スクリーンショット 2018-12-25 13.33.34.png](https://qiita-image-store.s3.amazonaws.com/0/109145/758f1252-c754-f639-155d-1c90dc7eb364.png)

7) ウィンドウに文字や四角を描こう
- ウィンドウに文字列書くAPIと四角を作るAPIを追加
- バグファイルの削除

![スクリーンショット 2018-12-25 13.39.04.png](https://qiita-image-store.s3.amazonaws.com/0/109145/3b237f39-1c3c-2b2e-473a-74b319de9c4a.png)

よさそう。
raspberry pi 3で3.5インチHDMI LCDディスプレイ

#概要

raspberry pi 3で3.5インチHDMI LCDディスプレイやってみた。

#写真

![CIMG2830.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/4188cb9b-5de4-6823-abef-1f18261d56ae.jpeg)

#方針

タッチスクリーンは、使わない。（USBマウス使う。）
キーボードは、使わない。（node-redで、プログラム起動するので。）
画面は、640*480　60hz

#設定

```
sudo nano /boot/config.txt

hdmi_group=2
hdmi_mode=4
```

以上。
Android 9 の UserAgent でバージョン表記に小数点以下がない

# 発生した問題

Android 9 端末（PIXELとか）で、公開済みサイトの表示不具合が発生していた。

# 原因

使用している UserAgent 判定ライブラリが問題だった。
Android 9 の UserAgent は小数点以下が省略されていて、バージョン判定の正規表現が正しくヒットしていなかったことが原因。

## 参考：AU技術情報

https://www.au.com/developer/android/kishu/ua/

Android 8 の場合、 `8.0.0` とかだったのに、 Android 9 の場合、 `9` のみ。

# 問題のコード

```javascript
    if(info.separator){
      let os = ua.split(info.separator).pop().split(' ').shift().replace(/_/g, '.').replace(/;/g, '');
      os = Number(os.match(/^\d*\.\d*/).shift()); // 小数点以下がある前提
      info.version = os;
    }
```

## 修正したコード

```diff
- os = Number(os.match(/^\d+\.\d+/).shift()); // 小数点がある前提
+ os = Number(os.match(/(^\d+\.\d+|\d)|^\d+/).shift()); // 小数点がない場合も含む
```

# まとめ

今回使用していた UserAgent 判定ライブラリの正規表現にも問題があるが、バージョン表記のルールを突然変えないでほしい。。。


# 参照情報

[Android 9: Exception on plugin load due to issue with UA parsing #1404](https://github.com/flowplayer/flowplayer/issues/1404)
[Swift] NavigationControllerを継承しながらコードで画面遷移をする（初心者向け）

# [Swift] NavigationControllerを継承しながらコードで画面遷移（初心者向け）

storyboardを使わずにコードで画面遷移するコードを書いて見ました。
今回は同じstoryboard上にある違う画面に遷移する時のコードを書きます。

``` swift:ViewController.swift
//同じstoryboard上にあることを宣言
let storyboard: UIStoryboard = self.storyboard!
        let second = storyboard.instantiateViewController(withIdentifier: "遷移したい画面のidentierを入れます")
        self.navigationController?.pushViewController(second, animated: true)
        
```
***
今回初めてキータに投稿して見たので、まだまだ勉強が必要だなと思いました。。。。
暖かくアドバイスしていただければ幸いです！
Slack絵文字は一斉登録できるらしい? GoogleChrome拡張で。

inspired [15,000個のカスタム絵文字を支える、Slack絵文字登録術 - Qiita](https://qiita.com/hartmann16325/items/0788b898fae529b1876d)

# Neutral Face Emoji Tools の使い方

MAc環境で実験。

# インストール

[Neutral Face Emoji Tools - Chrome ウェブストア](https://chrome.google.com/webstore/detail/neutral-face-emoji-tools/anchoacphlfbdomdlomnbbfhcmcdmjej)

# 試してみる


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8029c6c8-319e-8f8e-14f7-5818d69790c3.png)

# Chromeに追加したらSlackの絵文字ページにGooleChromeでアクセス

Slackの絵文字登録用URLの例


`https://example.slack.com/customize/emoji`

https://yuma-inaura.slack.com/customize/emoji



# ドラッグアンドドロップ!

Mac Finder から

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/68a346a2-d290-f2dc-7caa-5fa81bf5fbb7.png)

# このグレーのところにドラッグする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9f0255a6-5cd3-8cb2-fd03-f65c8c87f8ab.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/860f1f7a-7243-7341-c6bb-d389d110b98f.png)

# ファイル名は英語数字が無難？ 日本語も可

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/01bdfce2-0ea3-99c8-7ab8-fd768a082333.png)

# 確定ボタン不要

一瞬で追加されてた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/663dca8d-5e46-90e5-2927-821f89db2569.png)



# 何も出てこない?使えない?

そもそもカスタム絵文字登録数ゼロ個だと使えないっぽい、1個登録すると解決

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/66eac5d7-41dc-6515-527e-91a5e092da80.png)






---


Signed [絵文字yumainaura - Google Search](https://www.google.com/search?q=%E7%B5%B5%E6%96%87%E5%AD%97yumainaura&oq=%E7%B5%B5%E6%96%87%E5%AD%97yumainaura&aqs=chrome..69i57j69i59.2494j0j7&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Santa's on his way

Merry Christmas and Happy New Year to everyone.

This is just a bit of quick fun. I hope Santa brings you what you want this year! :santa::gift:

[Download .toe File](https://www.dropbox.com/s/janhbjzk2asiwc5/ChristmasEve.24.toe?dl=0)

This file was started from a [MUTEK.jp workshop](https://www.youtube.com/watch?v=r-XwzEzYhUU&list=PLSqkC3f_BStxHgR4X-EdKE13xKArIqIkJ) this year. Derivative has posted all the recordings of the workshop if you missed any of it.
#Instances
Uses 3D Noise TOP to generate position of the instances.
<img width="1061" alt="Screen Shot 2018-12-24 at 10.03.30 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/ea73fc99-e6a2-0f88-f3a4-41362f46b18c.png">
#Nose
Rudolph's nose is a separate red sphere, with a red light attached of course. Position driven by a Noise CHOP.
<img width="937" alt="Screen Shot 2018-12-24 at 10.06.56 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/d7d33727-cc83-7d22-0435-af8117416a3c.png">
The light is high output but set to falloff quickly.
<img width="458" alt="Screen Shot 2018-12-24 at 10.18.17 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/ecf1e9dc-de88-b1a9-0e57-a209aa002494.png">
There is also a little particle emitter attached to his nose, position also driven by same noise as above.
<img width="532" alt="Screen Shot 2018-12-24 at 10.07.22 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/5fd71d69-d7e1-df7b-3998-ae84c680c7d2.png">
#Rendering and Post
Separate Render Pass for the nose to add feedback. 
<img width="943" alt="Screen Shot 2018-12-24 at 10.13.01 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/6b0ba8b6-baf7-df55-6ace-8be3747624c8.png">
Composited with snow after feedback. Snow uses Depth TOP and Luma Blur TOP for some fake depth of field.
<img width="889" alt="Screen Shot 2018-12-24 at 10.14.32 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/b0bf0db7-adfd-9386-71a0-f9b6ed81dedf.png">
Add some fog for depth.
<img width="430" alt="Screen Shot 2018-12-24 at 10.17.28 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/e6e08224-5f4e-7360-28d7-e53612001687.png">
Added Barrel Blur from David Braun's githib
https://github.com/DBraun/TouchDesigner_Shared/blob/master/TOPs/barrel_blur.tox
<img width="749" alt="Screen Shot 2018-12-24 at 10.20.59 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/19a3b143-cfe2-f742-ac87-7f677a41a25b.png">
#Audio
Some looping jingle bells let you know Rudolph is around.
And Render Pick trigger for Santa.
Uses [vfs:/](https://docs.derivative.ca/Virtual_File_System) file system to make it easier dealing with external files.
<img width="728" alt="Screen Shot 2018-12-24 at 10.25.47 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/216420/1066e2a1-2739-96c6-3a5e-9a1ff6e52c39.png">
JetBrains IDEでLaravel使うときのPHPUnit設定あれこれ

JetBrains 製 IDE で Laravel を使う際に、PHPUnit の設定で躓きました。
なお、使っているのは IntelliJ IDEA （試用版）ですが、おそらく PhpStorm でも同じだと思います。

# 大前提
- Laradock でプロジェクト作成済み
- バージョン
    - Laravel
        - 5.7.19
    - PHP
        - 7.2.4

# テスト実行しても DB 接続できない
## 前提
- `php artisan migrate` でテーブル作成済み
- テーブルからデータ取得するモデル作成済み

## 事象
モデルをテストするコードを書いて、IDE から実行すると、以下のメッセージが出ました。

```
PDOException : SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name or service not known
```

ちなみに、`プロジェクト名/.env` は以下のように設定済みです。とくに問題はなさそうです。[^1]

[^1]: 普通は `mysql` なのでしょうが、普通でないことをしたくて `postgres` にしました。今思えば止めとけば良かった（苦笑）

```php:プロジェクト名/.env
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=shopping
DB_USERNAME=default
DB_PASSWORD=secret
```

ところが、コンテナの中に入って、`phpunit tests/` を実行してみると、問題なく動きました。
ここで IDE の設定を確認すると・・・
- Preference -> Language & Frameworks -> PHP -> CLI Interpreters

<img width="825" alt="スクリーンショット 2018-12-25 11.37.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/141299/44559bdb-1082-d9ee-bfe4-b5d176ffc853.png">

PHP のバージョンを認識しているので問題なさそうに見えますが、実は、ここで **Docker** を選択していることが原因でした。

これを以下のように **Docker Compose** を選択するように修正すると、IDE からも正常にテスト実行することができるようになりました。

<img width="826" alt="スクリーンショット 2018-12-25 11.43.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/141299/bec19ee1-d935-dfc6-9886-50abe663a797.png">


## 副作用？
上記設定を実行したところ、テスト実行するたびに、コンテナが終了するようになりました。

```
Time: 1.7 seconds, Memory: 14.00MB

OK (4 tests, 4 assertions)
laradock_shop_workspace_1 exited with code 0
Aborting on container exit...

Process finished with exit code 0
```

IDE からコンテナ起動しようとすると、一旦起動するものの、すぐに終了してしまうので、少し不便です。ターミナルで `docker-compose up -d nginx workspace` とすると正常に起動するので実害はないかもしれませんが・・・。

検索すると、[フォーラム](https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000062320-Docker-compose-PHPUnit-kill-my-container-after-running-the-test) で質問が上がっているのが見つかりました。どうやらテスト実行するたびにコンテナを起動して、コンテナ終了するのが現在の仕様だそうで 。回避策も載っているけど、どれも今ひとつな気が・・・。どなたか、いい方法ご存知でしたら、ご教示くださいませ。[^2]

[^2]: そもそも、おとなしくデフォルトの MySQL のままにしておけば問題ないのかもしれませんね。試してないから分かりませんが。

# テスト結果を色付けしたい
躓いたわけではないのですが、意外と忘れがちなのでメモしておきます。

## 前提
PHPUnit では、デフォルトでは色付け表示されません。しかし、``--colors`` オプションを付けることで色付けされるようになります。これと同じことを IDE でもやりたいと思いました。

## 設定方法
Laravel で作ったプロジェクトの中を見ると、PHPUnit の設定ファイル `phpunit.xml` があります。これを見ると、`colors="true"` とあり、色付け表示がすでに設定済みでした。

```xml:プロジェクト名/phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
```

ということで、IDE で `phpunit.xml` を読み込むように設定しました。
 - Preference -> Language & Frameworks -> PHP -> Test Frameworks
 - 「Default configuration file」に `phpunit.xml` のパスを設定します。

<img width="1039" alt="スクリーンショット 2018-12-25 12.03.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/141299/e4bb6977-b038-49aa-c731-ff7df03193d3.png">

# まとめ
IDE の設定って、めんどくさいですね...
Wordpress5 Gutenbergで画像を横並びに表示する

## 概要
カラム機能を利用し、Wordpress5.0(Bebo)付属のGutenbergエディタ上でコードを書かずに画像を横並びにする方法を紹介します。
※なお幅の狭い画面だとレスポンシブによっては縦並びになります。

## やり方
#### 1.ホーム画面から新規追加を選択すると以下の画面に移ります。

<img width="1615" alt="スクリーンショット 2018-12-25 12.06.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/bc6cae90-0f7e-f612-f8b8-80dec0e97769.png">

#### 2.＋ボタン（ブロック追加）→レイアウト要素→カラムを選択します。

<img width="1600" alt="スクリーンショット 2018-12-25 12.28.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/2ed39d89-28a3-894e-8685-36abe32cf8a6.png">

<img width="1613" alt="スクリーンショット 2018-12-25 12.07.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/ceed47d2-0fc0-5dd7-da34-66ef9015dd33.png">
<img width="1599" alt="スクリーンショット 2018-12-25 12.30.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/1b2b46b4-45dc-a6ad-4787-9f8cab5561bd.png">

#### 3.ブロックが横並びで利用できるようになりました。カラムで横に分割されたブロック内の＋ボタン→一般ブロック→画像を選択します。今回はダミー画像を貼り付けてみました。

<img width="1599" alt="スクリーンショット 2018-12-25 12.30.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/daa9bd1a-d3c1-d907-a3df-14c28647570c.png">

<img width="1597" alt="スクリーンショット 2018-12-25 12.31.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/93b8eb74-ce43-06c0-4414-1495009ee850.png">

<img width="1612" alt="スクリーンショット 2018-12-25 12.10.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/3dfe5b64-7d7c-5849-294e-f303af76572f.png">

#### 4.以上の操作を行いプレビューで見ると画像が横並びで表示されます。※この画面の幅なら横並びですが幅が小さくなると縦並びになります。
<img width="1198" alt="スクリーンショット 2018-12-25 12.14.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/283229/9e235ee2-dd3d-b9de-3b63-c22f73e8923d.png">