OmniAICreator/Qiita-1.07M huggingface dataset:
MS TechSummit 2018に参加した感想・覚え書き

# Microsoft TechSummit 2018
* 日付… 2018/11/5～7
* 場所… ザ・プリンス パークタワー東京
* https://www.microsoft.com/ja-jp/events/techsummit/2018/

# 全体の感想

* その取り組みが顧客にとって価値があるのかという目線を忘れないことが大事
* コンテナ、FaaS、DevOps、マイクロサービスなどの技術・手法は、サービスの価値を顧客に早く届けるための仕組みとして考え、要素にとらわれないようにしたい

# 気になったテクノロジ等に対する覚え書き
* Durable Function
    * Azure Functionの拡張機能。FaaSのピタゴラスイッチ問題に対する解決策になる
    * バッチ処理には積極的に活用したい
    * Getting Startedがセッション中に公開された（そのうち公式ドキュメントになるらしい）
        * Durable Functions Getting Started - Node.js  
        https://qiita.com/TsuyoshiUshio@github/items/7c1071b1160aac14d28c
        * Durable Functions Getting Started - C#  
        https://qiita.com/TsuyoshiUshio@github/items/2372f3f9ed8e1f9c81ee

* AKS + ACIによるバースト処理対応
    * AKS（Azure Kubernetes Service）で構築されているクラスタでは対応できないようなバーストの発生に対して、一時的にACI（Azure Container Instance）をワーカーノードとして利用し、そちらで処理を行わせるもの。
        * イメージとしてはAWSのEKS+Fargateに近い感じ
        * ACIは利用時間xメモリに対する課金なので、バーストした分だけの料金ですむためコストメリットが高い
        * この仕組みはvirtual-kubeletとしてAzureに依存しない形で仕様化されている

* BERT
    * Googleが出した自然言語処理に対する学習手法
    * 対象言語に依存しない
    * 今までのディープラーニングは、画像認識の方向にはかなりの強さがあったが、自然言語処理になるといまいちな部分があったが、それに対するブレイクスルーになる可能性。

* CosmosDBのパフォーマンスTips
    * パーティションキーの設計が最大のキーポイント
    * パーティションキー毎にひとつの論理パーティションが割り当てられ、ひとつの論理パーティションは必ずひとつの物理パーティションに割り当てられる。（物理パーティション上には複数の論理パーティションが割り当てられる可能性あり）
    * RUは物理パーティション毎に確保される。RUを増やすと物理パーティションが増える可能性あり
        * RUを一気に大きくする（100,000RU→1,000,000RU）と、物理パーティションが増える（＝データのコピーが発生する）ため、時間がかかる場合がある
    * 物理パーティションは最大10GB

* Azure DevOps
    * CI/CDや自動テストを行ってくれるツール
        * いろいろな言語＋フレームワークの組み合わせで、ビルド・リリースタスク等のテンプレートが用意されており、簡単に扱える。
    * Jenkinsさんと戦うぐらいなら、こっちにしたほうが効率が良さそう

* Visual Studio App Center
    * モバイルアプリ（iOS/Android/UWP他）に対するCI/CDツールやプッシュ通知、ログ収集、監視等のMBaaS機能を統合したもの
        * テスターの端末にβ版アプリを配信とか実機テストをクラウド上で実行とか、クラッシュログの収集とか、自力でやろうとすると大変なものが簡単に実現できる。
    * ソースコードへの影響は数行のコード追加のみ
vagrant up が遅い問題を解決した方法【KUSANAGI for Vagrant】

# 概要
- [KUSANAGI for Vagrant](https://kusanagi.tokyo/cloud/kusanagi-for-vagrant/) マニュアルを参考に Vagrant と VirtualBox で KUSANAGI の開発環境の構築中に発生した問題の解決方法です
- vagrant up 後 `==> default: Machine booted and ready!` で小一時間止まりました
- 原因はゲスト OS から名前解決に失敗していることでした
- Vagrantfile の `config.vm.provider :virtualbox do |vb| ~ end` 内に `vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]` を追記したりパソコンを再起動したりしたところ解決しました

# 環境
- MacBook Pro (Retina, 15-inch, Mid 2015)
- macOS Mojave
- Vagrant 2.2.0
- VirtualBox 5.2.20

# Vagrantfile

- `config.vm.synced_folder` は変更して欲しいんですが、コピペで動作するかもしれません

```
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  config.vm.network "forwarded_port", guest: 22, host: 12222, id: "ssh"

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  config.vm.synced_folder "/Users/username/kusanagi/repository/wp-content", "/home/kusanagi/FQDN/DocumentRoot/wp-content",
    owner: "httpd", group: "www"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  config.vm.provider "virtualbox" do |vb|
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      vb.gui = false
      vb.memory = "2048"
  end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end
```

## 当該問題を解決した記述
```
  config.vm.provider "virtualbox" do |vb|
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      vb.gui = false
      vb.memory = "2048"
  end
```
「東ロボくん」 新井紀子を真っ向から批判する

東ロボくんプロジェクト （AIで東大の入学試験に合格するプロジェクト ）[1]について、グーグルが最近公開した最新の言語処理モデルBERT [2]を引き合いに出して批判する動き[3]がある。以前にも新井先生を批判する動き[4]があったので、本当に大変だなと思う。しかし、彼女のやったこと、特に、AIは東大に合格できないと決めつけて東ロボを中止したことは、人工知能(AI)の研究の一端を担う私から見て、間違った判断だったと思う。東大に合格できないと言う結論が間違っていると言っているのではない。その点については私も現時点ではわからない。ただ、技術の限界が見えた時点で中止した判断が間違いだったといっているのだ。もし彼女がプロジェクトを正しい方向に導いていれば、AI研究における日本のプレゼンスを大きく上げることができたのではないか、とさえ思う。

まず、日本は、AI研究において、アメリカと中国に比べてかなり遅れている。これはトップ会議[5]に通る論文数から明らかだ。そして、東ロボからトップ会議に出た論文は残念ながら少ない。だが、一通り、最新のAI技術を応用した（つまり、２０１６年に限界が見えたと中止した）あたりで、課題を整理し、地道に研究続けて、きちんと論文をまとめていれば、もっと増やせたのではないかと思う。つまり、私の思う新井先生の失敗は、適切に研究を続け、科学的な論文を発表する機会を失ったことである。

そもそも、研究というのは壁にぶつかってからが本当の始まりである。そして、大半の場合、壁を突破、つまり、課題を解く方法を創り出すことが研究的な貢献であり、論文になる。ただし、その研究分野の最新手法を駆使しても解けない場合、問題提起をすることで研究分野に貢献し、論文にすることもできる。

これを鑑みるに、新井教授は、２０１６年に限界が見えた時、後者をするべきだったと思う。ところが、あろうことか、日本の高校生の読解力を養う教育がなってないと主張し、社会に問題を提起するという、極めて政治的な方向に進んでしまった。残念ながら、それはもはやAIの研究開発ではない。

どのような方向が可能だったか。そして失った研究成果とは何か。これについて、BERTが話題になった経緯を説明し、その上で、実際にその後出版された論文を引き合いに出して、もし新井教授が研究を正しく続けていれば同じようなものを出せたのではないか、と主張したい。

まずはBERTの登場の経緯について。最近のNLPの傾向として、言語の深い知識や本当の意味の理解はあまり考えずに、大量のデータを用いてニューラルネットにより表現を獲得する、というのがある。Word2vecなどはその先駆けである。面白いのは、そういったデータドリブンな手法が、知識ベースや従来の言語に根ざした手法をはるかに凌駕するという点である。BERTはそういった手法の最新版と言える。では、今までの手法より優れていることをどうのように示すのか。それは、研究コミュニティで認められたデータセットで、しかるべきタスクで、評価指標が従来よりも上がったことを示すのである。その点において、BERTは、GLUE[6]、SQuAD [7]、SWAG[8]といった様々なデータセットにおいて、最新の性能（state-of-the-art と業界では言う）を達成した。


この事情を鑑みるに、まず東ロボから、研究業界でよく使われるデータセットを出すことができなかったのか。新井先生曰く、たとえば英語の問題で、最新のディープラーニングを駆使しても、常識的な意味理解や推論ができないために限界があると論じる[11]。では、そのような問題ばかりを集めたデータセットを構築し、研究コミュニティに問題提起をする論文を書き、ついでにコンペティションも開催すればよかったのではなかろうか。state-of-the-artな手法を駆使しても解けないデータセットとなれば、かなりいいベンチマークとして定着したのではないだろうか。事実、ワシントン大から図などの視覚情報と自然文の言語処理、そして時には常識を駆使しないと解けないようなデータセット論文が去年のCVPR(視覚に関するAIに特化したトップ会議)に出ている[12]。皮肉なことに、中学生に理科のテキストの理解を試す問題として作られている。東ロボはこの高校生版をやっていたことを考えると、もっと早い段階でこのような論文を出せたのではないか。ところが、現実は、東ロボの試験データが公開されたのはごく最近（2018年後半）のことである。遅すぎる。そして、お粗末にも、論文どころか現時点では英語のページもない。

さらに欲を言うと、データ・ドリブンな、新井先生の言ういまの人工知能を限界まで突き詰めた手法を極めていたら、BERTのような論文も出すことができたのではないか。本当に意味を理解したとは言えなくても、既存のベンチマークで最新の性能を出せば論文は通る。BERTがそうだ。そうすることで、何がデータドリブンに解けて、何が解けないのかがはっきりする。それもAI研究への立派な貢献である。

もちろん、東ロボプロジェクトから全く論文が出なかったわけではない。例えば、早い段階で、人工知能のトップ会議の一つであるAAAIに論文が通っている[9]し、最近もその延長のACL論文が出ている[10]。それが、高校生の読解力がどうこう言い出した後から、なくなってしまった。そして、他の国に先を越されて論文を出されてしまった。もちろん、高校生の読解力向上という社会的な課題に取り組むこと自体が、全く意味の無いものとは思っていない。多額の税金を投入して研究を行った以上、そういった社会貢献の仕方も一理ある。しかし、新井教授が2016年に別の方向に導いていたら、もっと純粋なAI研究の成果が、そして、もっとたくさんのトップ会議論文が、出ていたのではないかと思うと残念でならない。


参考資料
[1] https://21robot.org
[2] https://arxiv.org/abs/1810.04805
[3] https://togetter.com/li/1285134
[4] https://mywarstory.tokyo/corruption-of-academia/
[5] http://www.kamishima.net/archive/MLDMAImap.pdf
[6] https://arxiv.org/abs/1804.07461
[7] https://arxiv.org/abs/1606.05250
[8] https://arxiv.org/abs/1808.05326
[9] https://www.aaai.org/ocs/index.php/AAAI/AAAI14/paper/view/8524
[10] http://www.aclweb.org/anthology/P17-1195
[11] http://college.nikkei.co.jp/article/92863510.html
[12] http://ai2-website.s3.amazonaws.com/publications/CVPR17_TQA.pdf
Ubuntuのバージョンを18.04にしたらdockerコマンドが通らなくなった話

個人のメモ書きです。ドのつく初心者なので変なところがあったらご指摘願います。

# Ubuntuのバージョンを18.04にしたらdockerコマンドが通らなくなった


会社のPCをUbuntu18.04にしたらproxyの設定云々でdockerコマンドが通らなくなった。

```python:/ets/systemed/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://example%40hoge.com:${HTTP_PROXY_PASS}@proxysrv:port/"
```
HTTP_PROXY_USERにメールアドレスを使用(example%40hoge.com)しています。


理由はわからないですがURLエンコードの必要がなくなったのか、HTTP_PROXY_USERの設定部分=`example%40hoge.com`を`example@hoge.com`にすることで解決。

```python:/ets/systemed/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://example@hoge.com:${HTTP_PROXY_PASS}@proxysrv:port/"
```
ピッチやトークの話し方

最近のエンジニアって、イベントや勉強会で話す機会が増えてますよね。

個人的に、練習方法をまとめてみました。

# まずは練習を録画しよう

録画端末はスマホで十分です。
見るのはある程度ちゃんとした環境が欲しいので、PCやタブレットのモニタをお薦めします。

# 事前準備

## 大事な発表なら、内容の原稿はちゃんと作ろう

特に準備できるピッチなら、完全しゃべり原稿を作るくらいのノリで。
練習を積み重ねる間にも、原稿のアップデートは怠らないように。

# 話し方の技術

## 語尾や細かい単語(副詞や助詞、助動詞、接続語)の発音を丁寧に

こういったところが甘いと、聞き取りにくくなります。

## 声が低めの方は、心持ち声の音程を上げてみてください

出所はビジヴォの秋竹朋子さんが色々な講演会とかで話されているネタです。
人によって話しやすい音程は違うので彼女ほど「この音程で！」ってところは気をつけなくていいと思うのですが、少し声の音程を上げてゆっくり話すだけで、トークの雰囲気が大きく変わります。

## 早口すぎるなら、ピッチの話す分量を減らす

少しくらいゆっくりめでないと、多分うまく伝わりません。
UnityARImageAnchorが動作しない件について一時的な回避策 "UnityARImageAnchor" does not work. 

# "UnityARImageAnchor" does not work. <br>UnityARImageAnchorが動作しない件について一時的な回避策（解決策？） (Unity Arkit 1.5 exampleが動かない)
unity のARKit をcloneしてきて、exampleを動かしたら動かなかった。Xcodeのエラーログを見たら、下記の様なエラーが出てきた。

```
2018-11-08 09:24:35.177115+0900 ar[911:185114] [Session] Session (0x107b30e60): did fail with error: Error Domain=com.apple.arkit.error Code=300 "Invalid reference image." UserInfo={NSLocalizedFailureReason=One or more reference images have an invalid size: unitywhiteonblack, unitylogoreferenceimage, NSLocalizedRecoverySuggestion=Make sure that all reference images are greater than 100 pixels and have a positive physical size in meters., ARErrorItems=(
    unitywhiteonblack,
    unitylogoreferenceimage
), NSLocalizedDescription=Invalid reference image.}
```

# solution 
下記のファイルをpngからjpgに変換すれば解決します。

- UnityARImageAnchor/ReferenceImages/unitylogowhiteonblack.png  
- UnityARImageAnchor/ReferenceImages/unitylogoblackonwhite.png  
<img width="792" alt="Screen Shot 2018-11-08 at 10.29.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/195504/4db159b9-ea34-05e9-781c-114e1ac41eda.png">
VPNを使わずに、逆SSHポートフォワードを使って自宅のマシンをRDPで外から操作する (Webサービスにも応用可能)

いろいろあってVPNクライアントを使えない環境で、インターネット経由で自宅のマシンにRDPで接続したいということになりました。
TeamViewerとかChromeRDとかもありますけど､RDPです｡

そこで、VPSとラズベリーパイを使って、VPNを使わずに、自宅のポート解放もせずにある程度セキュアな方法で実現したいと思います。
(ちなみにラズパイを使わずにやる方法もありますが､今回は目的がRDPですので、自宅機に一切手を加えることなく実現でき､再起動にも容易に対応できるのでラズパイでやります｡もちろんラズパイじゃなくてもいいです｡ (Webサービス公開だけならむしろPC本体でやったほうが良い))

# 環境(やりたいこと)
･ VPS(のようにグローバルIPが振られているマシン)が一個ある
･ 自宅はポート開放したくない
･ 家にラズパイなりなんなりのそういう機器がある

つまりこういうことです｡
![環境.png](https://qiita-image-store.s3.amazonaws.com/0/300863/0c984256-e3ad-fa6e-d2ff-92c1584bd12f.png)

これをどう構築するかを簡単にまとめると、
- 自宅→VPSまでのリバースポートフォワードを張る(これで一旦外部からいきなりRDPできるようになる)
- セキュリティ保護のため一旦その待受ポートをVPS側でufwを使って塞ぐ
- 接続時にはクライアントもVPSに対してポートフォワードを張ってから使う(ufwで塞いでいても内部的なアクセスは対応できるため)
という感じで、全部で2つのSSHセッションを使うことになります。

(2021/1/29追記: 色々と分かりづらかったり足りなかったところがあったので修正しました。)

# 1. VPS側の設定をする
まずはSSHのポートフォワード自体ができるようにします。
GatewayPortsをyesにしてあげます。

```config:/etc/ssh/sshd_config
#GatewayPorts no
GatewayPorts yes
```

そしてsshdの再起動をします。

```bash
$ sudo service sshd restart
```

次に、ufwを導入します。
詳しくは https://qiita.com/_takeuchi_/items/2a1ee9b53c6a863bf844 こちらを御覧ください。
とりあえずざっくり書くと、

```bash
$ sudo apt install ufw
$ sudo ufw allow sshに使っているポート番号
$ sudo ufw allow その他Webサーバーなど開放しなきゃいけないポート番号
$ sudo ufw enable
```
を叩いけおけば大丈夫です。
このとき、RDPでこの後リバースポートフォワードを張るときに使うポート番号はallowしないでください。リバースポートフォワードを張った段階で一応直接アクセスができることになるため、安全のために直接アクセスを防ぎます。


# 2. ラズパイからVPSにSSH接続をする
自宅→VPSへの線を張ります。

通常のSSHコマンドに､｢-N -R 任意のポート番号:自宅マシンのIP:3389｣を付属させます｡

任意のポート番号は、外部からアクセスするときに使いたいポート番号になります。
`外部からアクセスしたいポート番号:ポートフォワードしたいマシンのIP:そのポート番号`
という感じですね。今回の場合はRDPをしたいので、13389番として外部からアクセスしながら、最終的には自宅マシンの3389番に飛ばします。なので、

```
ssh -R 13389:<自宅マシンのIPアドレス>:3389 <ユーザー名>@<VPSのアドレス> 
```

となります。ちなみに`-N`をつけるとSSHがバックグラウンドで動いてくれます。ずっと動かしたいとき便利ですね。

(なお、これを応用すると、自宅のマシンで立ててる80番のWebサーバーに、VPS経由で一時的に外部からアクセスできるようになったりします。二段ルーターだったり、ポート開放ができないときに便利ですね。もちろんVPS側でufwでのポート開放は必要ですが。
ssh ~~~~ -R 8080:localhost:80とかをすれば、自宅マシンの80番へ、VPSのアドレス:8080でアクセスできるようになります。)

# 3. クライアントからVPSにSSH接続する
先程ufwで13389番への直接アクセスを塞いでしまった(安全のため)ので、アクセスできるようにポートフォワード経由で13389番につなぎます。
通常のSSHポートフォワードを使います。これまでの例だと、通常のSSHコマンドに､｢-L 任意のポート番号:localhost:13389｣を付属させることになります。

以下の例だと、「サーバーのlocalhostの13389番を、クライアントの50000番にポートフォワードする」(クライアントのlocalhost:50000につなぐとVPS側の13389番にいく)という設定になります。


```
ssh <ユーザー名>@<VPSのアドレス> -L 50000:localhost:13389
```

(先程から13389や50000などでていますが、自宅→VPSの際の3389以外は何でも大丈夫です)

# 4. RDPでつなぐ

アドレスは、先程の例だと50000番を使っているのでlocalhost:50000となります。
これだけで繋がります｡


# まとめ
つまりこういうことをしたわけです
![Connected.png](https://qiita-image-store.s3.amazonaws.com/0/300863/ca3d49b4-41b1-818b-7220-f55ed1a01026.png)

接続経路だけを文字で書くと、

`クライアント:50000`→(SSH)→`VPS:13389`→(SSH)→`自宅マシン:3389`
となります。

このシステムを構築することで､SHARPのNetWalkerみたいにVPNつなぐのにも一苦労みたいな端末でも､簡単にポート開放せずにRDPで自宅マシンを操作することが出来ます｡また、先程も書きましたがVPNを組まなくても外部から自宅のサーバーへのアクセス環境を作ることができます。
(管理者権限がなかったりしてVPNを繋げることは出来ないけどSSHはできるという環境でも使えますね｡)

参考URL:
http://toshtone.hatenablog.jp/entry/2018/03/21/232245
pyenv + Python3.7 + openCV の環境を構築する【macOS High Sierra】

割と多い種類の記事だとは思うんですが、適当にやっても上手くいかなかったので後世のために書き残し。
`"ImportError:No module named cv2"`で困ってる人も必見。
他の記事のまんまやったらエラーになるんだけど！！！って言う~~google先生と絶交してしまった~~人もちょっと見てって欲しいです。

#環境
- macOS High Sierra 10.13.6
- homebrew 導入済み
 

#はじめにすること
macにはデフォルトでPython2がついてきています。
僕は昔、このPythonを使って大学の課題をやっていたんです。
そこにnumpyなどのモジュールを追加していました。それが原因でエラーを引き起こしてしまったみたいなのでとりあえず削除します。
ここは環境によりけりなので、___「俺は初めてPython使うんだぜ！」って人___と、「エラーでたら消すわ」って人は無視して次の "pyenvのインストール" に進んでください。

削除しますと言いましたが、macOSのセキュリティ機能のせいで削除できないので、設定を変更します。
__[MacでOperation not permittedが出た時の対処法](https://qiita.com/mym/items/90bf9f0a6417bd785bb0)__
こちらを参考にして、ファイルを移動できるようにしてください。
~~sudoでできるやろ〜〜って思ったら出来なかったよ…ママ…~~

できたらnumpyを探しに行きましょう。バージョンが複数ある場合は全部探します。

```
$ cd /System/Library/Frameworks/Python.framework/Versions/<version>/Extras/lib/python/
$ ls | grep numpy
```
結果が表示されたらそれらを削除します。

```
$ rm -r <ファイル名>
```
削除できたら、以下のディレクトリでも同様に探して削除します。

```
$ cd /Library/Python/<version>/site-packages/
$ ls | grep numpy
$ rm -r <ファイル名>
```

#pyenvのインストール
ではお待ちかね、pyenvをインストールします。

```
$ brew install pyenv
```
~/.bash_profile にパスを通します。

```
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```
#Pythonをインストール
```
$ pyenv install python3.7.1
$ pyenv global 3.7.1
$ python --version
　Python 3.7.1
```
バージョンはお好みで選んでください。僕は3.7.1にしました。
pyenvを使う事で複数のバージョンのPythonを使い分ける事ができます。めっちゃ便利。今日まで知らんかった。

```
$ pyenv global <version> #全体に適用
$ pyenv local <version> #今いるディレクトリのみ適用
```

#openCVをインストール
```
$ brew install opencv --with-python3
```
他の記事では、このコマンドの前に`$　brew tap homebrew/science`をやってね。とか書いてありましたが、そもそもhomebrew/scienceが廃止されてしまったので動きません。
代わりに`$ brew tap brewsci/science`をする必要があるみたい。
今はopenCVがhomebrewの公式に置いてあるらしいのでやらなくて良いみたいです。
もし失敗したらやってみてください。

#pyenvへのリンク
では、pyenvからopenCVを使うためにリンクを貼ります。

```
$ ln -s /usr/local/Cellar/opencv/3.4.3/lib/python3.7/site-packages/cv2.cpython-37m-darwin.so .pyenv/versions/3.7.1/lib/python3.7/site-packages/
```
openCVがインストールされた場所は`🍺  /usr/local/Cellar/opencv/3.4.3`のように表示されているはずです。
もし違ったらそれに応じて変えてください。

#numpyのインストール
```
$ pip3 install numpy
```
もし、「pipのバージョンが古いよー」なんて言われた時は`pip3 install --upgrade pip`で更新してください。

#動作確認
```
$ python
Python 3.7.1 (default, Nov  7 2018, 11:41:00) 
[Clang 10.0.0 (clang-1000.11.45.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
 '3.4.3'
```
これでopenCVを使うことができるようになりました！！

#参考サイト
[macOS Sierra に pyenv + python3.5 + OpenCV3 をインストール - Qiita](https://qiita.com/okaxaki/items/d9bb1efdb4360985eff8)
[TensowFlowをセットアップしてハマったのでメモ - Qiita](https://qiita.com/LyricalMaestro0/items/fe5baa162978cb3f7030)
[【Mac】brewだけでOpenCV3+Python3(venv)の環境を構築する | from umentu import stupid](https://www.blog.umentu.work/%E3%80%90mac%E3%80%91brew%E3%81%A0%E3%81%91%E3%81%A7opencv3python3venv%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/)
[OpenCV3+Python3をMacOS HighSierraで 始めよう #初学者 #python3 #OpenCV](https://blog.firstfournotes.com/tech/opencv_python_start/)


#おまけ
QiitaDeckすごいのでみんな使って。
[Qiita版TweetDeck！？カラム形式でQiita記事をウォッチできるサービス「QiitaDeck」をリリースしました！ - Qiita](https://qiita.com/kazu1496/items/7ce5043f9128c9ab55f4)
現在進行形で進化中だよ！！どんどん使いやすくなっていくみたい。
【Rails】I18nでview毎にlocaleを設定する方法

##一部のviewだけに英語を適応させたい。

```ruby
I18n.locale = :en
```

I18nでlocaleを設定して一部のviewだけ英語に適応させたものの、サイドバーやナビバーなど他のテンプレートでは日本語用のlocaleファイルしかないため、`translation missing en. ~~~~`  と、英語のlocaleファイルなんてないよ！と表示されてしまう。


しかもlocale自体を変更してしまうとキャッシュされてしまうため、view毎に表示が適応されない。
つまり今回の場合、**localeを変更せずに日本語、英語を切り替える必要がある。**

考えられる対策として、
・　日本語用のlocaleファイルしかないものは、英語用のlocaleも全て作る。
・ `translation missing en. ~~~~` となっている場所を全て日本語に明示的に指定する
・　viewのselfに対して,localeを設定する

というものだが、どれも非常に面倒くさいし日本語版しかないのにわざわざ同じ英語版を作るのも好ましくない。



結局たどり着いた答え↓

##localeを明示的かつ動的に指定する

まず、言語を明示的に指定するには第二引数にlocaleを設定してあげる。

```ruby
I18n.t("views.users.name", locale: :en)
```

しかし、もちろんこれでは日本語を表示させたい場合であっても英語でしか表示さえれない。
なのでこの`:en`の部分をグローバル変数として動的に変更させればいい。


```app/controllers/users.rb
@locale = user.foreigner? ? :en : I18n.default_locale
```

```app/views/users.rb
I18n.t("views.users.name", locale: @locale)
```

**①コントローラで条件別にlocaleを設定。**
**②コントローラで設定したlocaleをviewに渡してlocaleで明示的に指定**

こうすれば、一部のviewだけに日本語、英語を表示することができる。
tar.gzをシェルスクリプトに埋め込む

# 概要
普通、シェルスクリプトはシェルコマンドを列挙して動作を記述するスクリプトですが、tarなどを用いて圧縮したファイルのバイナリデータを埋め込んでやることで単体のファイルで動作可能なオフラインインストーラにできたり、何らかのファイルを扱う処理を単体で記述できたりします。これ自体は有名な気がするのですが、日本語の情報がなぜか少なかったので書いておきます。"shell script embedded tar file"とかググると英語情報はいっぱい出ます。
私が見たことある例だと、AnacondaのLinux向けインストールスクリプトはAnacondaの構成ファイルすべてをスクリプトに埋め込んであるため、シェルスクリプトでありながら637MBものサイズがあります。

#環境
- zsh

# 手法
とりあえず以下のようなシェルスクリプトを用意します。

```shell:tarball1.sh
#!/bin/zsh

TAR_START=$(awk '/^__TARFILE_FOLLOWS__/ { print NR + 1; exit 0; }' $0)

tail -n +${TAR_START} $0 | tar -zpvx

exit 0

__TARFILE_FOLLOWS__
```
適当なtar.gzファイルを用意します。ここでは以下のVimアイコンを圧縮して調達します。
![vim-icon.png](https://qiita-image-store.s3.amazonaws.com/0/225893/b156a513-05c3-402e-ffba-2fb7e5cf7ebf.png)

```shell
$ tar -zcf ./tarfile.tar.gz ./vim-icon.png
```

次に、以下のコマンドでシェルスクリプトの末尾にtar.gzファイルを埋め込みます。

```shell
$ cat ./tarfile.tar.gz >> ./tarball1.sh 
```

これだけです。これで、`tarball1.sh`を実行してやるとカレントディレクトリに`vim-icon.png`が展開されるようになります。

# 仕組み
```shell:tarball1.sh
#!/bin/zsh

TAR_START=$(awk '/^__TARFILE_FOLLOWS__/ { print NR + 1; exit 0; }' $0)

tail -n +${TAR_START} $0 | tar -zpvx

exit 0

__TARFILE_FOLLOWS__
```

改めてこのシェルスクリプトを見て、仕組みを解説していきます。

まず、この箇所です。

```shell
TAR_START=$(awk '/^__TARFILE_FOLLOWS__/ { print NR + 1; exit 0; }' $0)
```
この箇所では、TAR_START変数に、awkコマンドの出力結果を格納しています。
awkコマンドの構造はざっくり書くとこんな感じです。

```shell
awk '/^[この文字から始まる行]/ {print NR + 1; exit 0;}' filename
```
つまり、filenameで指定したファイルの中で、1つ目の指定で指定した文字列と合致する行をまず抜き出し、その結果が自動で格納される組み込み変数NRに1を加算した結果をprintしています。なお、$0というのはコマンドライン引数の取得リテラルで、0番目は自分自身のファイル名を指します。
今回のスクリプトのawkの場合は`__TARFILE_FOLLOWS__`の**次の行**を返すことになります。後にtarバイナリが入る先頭行ですね。

次にこの行です。

```shell
tail -n +${TAR_START} $0 | tar -zpvx
```
tailコマンドの方から見ていきます。この場合のtailコマンドの構造は以下のようなものです。

```shell
tail -n +N filename
```
この場合、tailコマンドはfilenameで指定したファイルのN行目**以降**を抜き出して出力します。
つまり、今回のスクリプトではcatで埋め込んだtarバイナリのみが切り出されます。

そして、その結果を以下のtarコマンドにパイプで渡しています。

```shell
tar -zpvx
```
これはおなじみで、渡されたファイルのバイナリを見て展開可能なファイルであれば展開を行ってくれます。

最後にこいつです。

```shell
exit 0
```
普段わざわざシェルスクリプトの最後にexitを書いて明示終了することはあまりありませんが、今回の場合はこれを書いてやらないと、それ以降の`__TARFILE_FOLLOWS__`やtarバイナリがコマンドとして実行されてしまいエラーになるので、書かなければなりません。

# 利用例
普通にインストーラや展開装置として便利なのですが、ちょうど[この記事](https://qiita.com/strv13570/items/00cc0a75fa99b0588267)の中で面白い使い方をしたので例に挙げます。

```shell:makeimg.sh
TAR_START=$(awk '/^__TARFILE_FOLLOWS__/ { print NR + 1; exit 0; }' $0)

tail -n +${TAR_START} $0 | tar -C /tmp -zx

cat ./$1 > $2
cat /tmp/disktmp.bin >> $2

rm /tmp/disktmp.bin

exit 0
__TARFILE_FOLLOWS__
# バイナリデータは略（というか書けない）
```

このスクリプトは、ブータブルディスクのブートセクタバイナリとそれ以外の領域のバイナリを結合して一つのブータブルディスクイメージを生成するスクリプトです。簡単に言うと、2つのバイナリファイルをそのまま結合して出力してくれるものです。しかし、結合する一方のファイルは不変であるため、スクリプトに埋め込んで外部ファイルに依存しないようにしたのです。
実際は以下のように使えます。

```shell
sh ./makeimg.sh [結合するバイナリ名] [出力バイナリ名]
```
実行すると、[結合するバイナリ名]に渡したファイルの後ろに、スクリプト内に埋め込まれたtarを展開したバイナリが結合されて、[出力バイナリ名]に指定した名前でカレントディレクトリに出力されてきます。

この場合は展開されるファイルそのものがほしいわけではなく、一時的に展開したファイルを利用して得た成果物がほしいだけなので、tarコマンドに`-C`オプションを適用して`/tmp`ディレクトリに一時ファイルを作成しています。

おしまい。
Mac OS Mojaveでvagrantがまともに動かなかったときにやったこと

こんにちわ、久々の投稿です。今回は、Mac OS XをMojaveに上げたところ、vagrantがまともに動かず、四苦八苦したときの記録を。

# ことのおこり

とある朝、仕事用に使用しているMac OS Xのバージョンを「Mojaveに上げろ！」というMac様のうっとおしいシュプレヒコールに辟易してMojaveに上げたところから始まります。
バージョンを上げること自体は滞り無く行われ、他のアプリは大して苦もなく対処できたのですが、一つだけハマってしまいました。

更に、業務の関係上vagrantを使っているのですが、コマンドを叩くと `VirtualBoxのバージョンを上げろ！` と怒られたので5.0.26から5.2.20に上げてさあもう大丈夫だろうと思ったところ…

vagrantがまともに動かなくなったのです

# 解決するまでのやり取り

vagrantが動かないと作業に支障が出るので復旧しなきゃいけない。ところが、原因をつかもうにも、現象が

* chefディレクトリのNFSマウントでストール
* ネットワークがダブって作られているエラー
* GuestAddonのアップデートでストール

と定まらない。周りの方々の助け舟でいろいろ方策を取りました。

* `VAGRANT_LOG=debug vagrant up` でログを取ってみたり
* [ここ](https://qiita.com/takutoki/items/33cf1230e032931f9adc)を参照してみたり
* [ここ](https://qiita.com/satokourov/items/e632df854be6048adf7b)を参照してみたり
* `sudo chmod 1777 /private/tmp` を試してみたり
* [ここ](https://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85)を参照してみたり
* 他にも、[ここ](https://qiita.com/silva114jp/items/6e1e64e9aeaca62b1c04)とか[ここ](https://www.ryuzee.com/contents/blog/6381)とか[ここ](https://www.demandosigno.study/entry/2017/04/30/160450)とか…

試しても、やはり症状は↑の３つの堂々巡り。

* vagrantのplugin周りじゃないか
* いや、セキュリティ周りじゃね？
* Mojaveで追加された権限周りとか？

とかいろいろ可能性は出てくるのですが、いずれも決め手に欠け、悶々とした状態に。
気がついたらもう夜。
「もしかしたら時間かかってるだけじゃない？」というサジェストもあり、GuestAddonのストールのまま一晩おいておきました。
翌朝、全く変わらない画面に呆然。途方に暮れながらいじっていると、同じ環境で作業している某氏からの

`vbguest? そもそもplugin入れてないよ`

というメッセージにより、一気に解決へ向かったのでした。

# そして解決へ

というわけで、さくっとpluginを削除することにしました。

## vbguestプラグインの削除

`vagrant plugin uninstall vagrant-vbguest`

## vagrant VMの削除

念の為クリーンインストールにしたほうがよかろうと、もとのVMを削除

```
vagrant destroy -f
rm -rf .vagrant
```

## vagrantのバージョンアップ

`vagrant version` してみると、バージョンが2.0.1。最新(当時)は2.2.0のため、[hashicorpのサイト](https://www.vagrantup.com/downloads.html)から2.2.0をDL。

* vagrant2.0.1アンインストール
* OS再起動
* vagrant2.2.0インストール

## そして…

`vagrant up` してみると、無事に終了。
VM内アプリも無事起動。
結局、解決に24時間かかりました…疲れた。
Rspecでbindingを使って変数の中身を調べる方法

##起こった問題
binding.pryを使えばどこでも停止させることができるが、変数の中身とか見れなくて困った。

```rb

RSpec.describe Model, :type => :model do
  describe "validations" do
    before do
      @user = User.new(name: "hoge")
    end
    binding.pry #追加
    it "valid?" 
      expect(@user).to be_invalid
    end
  end
end
```


```

> @user.name
RSpec::Core::ExampleGroup::WrongScopeError: `user` is not available on an example group (e.g. a `describe` or `context` block). ......
```


結論から言えば、**itの中であれば参照することができる**


##itの中で使う

実際に見てみましょう。

```rb

RSpec.describe Model, :type => :model do
  describe "validations" do
    before do
      @user = User.new(name: "hoge")
    end
    it "valid?" 
      @user.name = nil
      binding.pry #追加
      expect(@user).to be_invalid
    end
  end
end
```

```rb
> @user.name
"hoge"
```
Userインスタンスのnameが変更されているのも確認できてます。

もちろん、FactoryGirlを使った場合も同様に参照可能。

```rb

RSpec.describe Model, :type => :model do
  describe "validations" do
    let!(:user) { User.new }
    it "valid?" 
      binding.pry #追加
      expect(user).to be_invalid
    end
  end
end
```

```rb
> user.name
"hoge"
```
IBM Cloud PaaS勉強会#5 内容のまとめ(CI/CD,Cloud Foundry Enterprise,制御基板とのコラボ(KNX)

## 始めに
本記事は、[開発相談会#5 : DevOps(CI/CD,Test)](https://bmxug.connpass.com/event/103839/)でのディスカッション内容のまとめです。

## IBM Cloudで実現するCI/CDについて
AWSやAzure等と同様に、IBM Cloudでも簡単にCI/CDが実現できる様な仕組みが提供されています。
例えば、メニューからDevOpsを選択するだけで、下記の様にいくつかのテンプレートが利用できる事が確認できます。
これにより、初心者でもとっつきやすくなっている点が私としては素晴らしい点かと思います。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/d6b53333-7ce2-9f12-ec10-4a6e40becb48.png)

ちなみに、**ツールチェーン**という言葉から想像できるように、3rdパーティ製品を含めて多くのDevOps用のツールを「繋いで」利用する事が出来ます。
#### Githubでソースを管理⇒Cloud Foundryのアプリへのデプロイを実現する例
![2-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/51c8db22-83f7-9e94-8988-0e87cd3df1b8.png)
※矢印は私が追加しています。

上記の場合、Githubのリポジトリの変更が合った場合に自動的にCloud Foundryアプリにデプロイする、という流れを実現しています。
繋げるアプリケーションの変更や追加を行う際には、画面右上から「ツールの追加」を押すと下記の画面が現れるのでそこから選択するだけのお手軽仕様です。
例えば、Slack等も組み込まれているので上記の流れで、更に**デプロイ後にSlackで通知する**なんてことも簡単に実現できるのが嬉しいですね。:+1:
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/a2fa5890-f718-badb-b850-3f813e4de30a.png)

この繋げるツール群の一つの`Delivery Pipleline`も中々に使い勝手がよく中で自分でシェルを組めるので自由にカスタマイズが出来ます。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/55a08986-bf74-0cdf-ea65-53410017c6ff.png)
もちろん、デフォルトの通り`cf push`だけでも十分に価値がありますよ。

Cloud Foundryでのアプリ開発をする際に、毎回、ローカルのコンソールからデプロイされている場合、このツールを使うだけでも生産性は変わると思います。
奥が深い世界ですが挑戦してみる価値は十分にあるのではないでしょうか。

## Cloud Foundry Enterpriseについて
Cloud Foundry Enterpriseについてです。通常のCloud Foundryと異なりIaaSとしては共通基盤を使い、その上でk8sの技術を使って環境を占有できるとのことです。
Enterpriseとあるだけあって、リソースだけではなく環境までもクローズに出来るようなのでこれが採用するメリットになりそうです。

ただ、金額はそれなりにするので私自身は試せていません…

## KNXとのコラボレーションについて
日本ではまだあまり使われていませんが、海外では浸透している[KNX](https://ja.wikipedia.org/wiki/KNX)について紹介されました。
規格に対応しているシャッターや照明、ファン等を制御できるプロトコルです。この企画の素晴らしいところは、これまではbit単位でシリアル通信で制御してきた機械をTCP/IPベースで制御できるようになったことです。
これにより、一般的なプログラマにも機械制御を行う為の門戸が広く開かれたことが評価されています。
[勉強会時に公開された資料](https://www.slideshare.net/nakachong/ss-122349822)

例えば、`NodeRED`や`PHP(Laravel)`からも基盤制御できるようになったことでクラウドアプリから基盤を制御する事が出来るようになっています。

勉強会の中で出てきた活用のアイデアとしては、
1. オフィス内にある空調や照明の自動制御(最終退勤後は全て電源OFFとか)
2. 電車やエレベーターの混雑状況を画像認識し、空いているところへ照明で誘導し混雑を緩和する
3. CO2や温度センサーを使って農業の支援に活用する。

等です。
詳しくは[デジタルライト(Digital-light.jp)](https://digital-light.jp/)というブログに多くの記事が投稿されていますので興味のある方は参照してみて下さい。

## 宣伝
IBM Cloudを使ってみたい(もしくは実際に使った)けど、どう使ったらよいか分からない！という方は、是非、相談会に遊びに来てください。
また、12/8に[IBM Cloud Community Summit 2018](https://bmxug.connpass.com/event/105149/)も開催されます。
そちらでも、貴重な情報が得られると思いますので是非、ご参加ください。
JAVA=JAVAscript問題について考える（今後必要）

# この記事の目的

JAVA = JAVAscriptであることを示します。
一応、末尾にまじめな解説とかもつけました。
なお、一部誤りがあったので末尾に謝罪もつけました。

# コード

同じコードを２つ貼ります。

```java
/*
<script>
var System = {out: {println: function(e){console.log(e);document.getElementsByTagName('body')[0].innerHTML=e;}}};
window.onload = function() {
    eval(document.getElementById('code').innerHTML.replace(/[*]/g, '/').replace(/(public|static|void|String\[\] args)/g, ''));
}
</script>
<div id="code">
*/
class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
/*
new Main().main();
</div>
*/
```

```html
/*
<script>
var System = {out: {println: function(e){console.log(e);document.getElementsByTagName('body')[0].innerHTML=e;}}};
window.onload = function() {
	eval(document.getElementById('code').innerHTML.replace(/[*]/g, '/').replace(/(public|static|void|String\[\] args)/g, ''));
}
</script>
<div id="code">
*/
class Main {
	public static void main(String[] args) {
		System.out.println("Hello, world!");
	}
}
/*
new Main().main();
</div>
*/
```

# JAVAで動かす

実行方法は正直なんでもいいのですが、paizaというサイトに貼り付けて実行します。
うごく！Hello, world!ってでる！すごい！

# JAVAscriptで動かす

上記のコードを**htmlとして保存して**、ダブルクリックするなどして適当なブラウザで開きます。
検証した環境はchromeでした。
Hello, world!ってでる！すごい！

ひょっとすると、一部のブラウザの画面には変な文字列が出ているかもしれませんが、真の男はそういう事は気にしません。
一部のブラウザを使っている場合も、開発者ツールを見てみましょう。Hello, world!ってたぶんでる！すごい！

# ポエム

真の男にとっては、JAVA=JAVAscriptであることは自明なことだ。
JAVAとJAVAscriptは違うなどとゆうあほや腰抜けも居るが、メキシコの荒野ではそんなのは通用しない。
それがわからないやつは、最初は威勢だけはいいが、やがてコメント欄に吹き荒れるメキシコの風に倒れ、酒場で知り合ったベイブと慰め合い、刹那の快楽に酔い、子を産み育て、「何も面白いことが無い一生だった」などと酒場でぼやきながら・・・・やがて老いて死ぬ。THE END OF MEXICO....。
だが、おまえがまだ真の開拓精神を持っているならば話は別だ。今からでも遅くはない。JAVA=JAVAscriptをやれ。

# うそです

JavaとJavaScriptは別物です。すみませんでした。
なぜ別物なのに同じだと主張する人が出てくるのか？という背景については、
https://qiita.com/pik/items/1c95d69debee4aedffea
が詳しいです。

# ちょっとだけ解説

JavaとJavaScriptは、コメントの形式などもC由来で似ている言語なのですが、一方で予約語の振る舞いなどが色々違います。とくに、スペースだけでトークンを配置した時の扱いも貧弱です。
そこで、素朴なやり方ではどちらでも動くコードを書くのは不可能かなと思い、邪道に手を出しました。

## コメント

まず、HTMLを使う事によって、JavaではコメントだがJSではコメントではない、という領域を作り出します。
Javaの世界では、これによってJavaScript用のコードを全てコメントとして扱えるようになります。Javaにはマクロもないので、コードを実行時に動的に書き換えるのは少し難しく、コメントを除けばJavaとしては普通のコードになるようにします。

## コードの書き換えとeval

上述のとおり、素朴なやり方では邪魔な予約語が沢山あるので、コードを書き換えます。キモになるのは、evalとreplaceです。

### eval

evalというのは、パフォーマンス的にもセキュリティ的にもやってはいけない事で、文字列をJavaScriptのコードとして評価します。

### replace

予約語とコメントの片割れが邪魔なので、正規表現で置換します。予約語以外も、一部面倒なので消してしまいます。

# ワンポイント

実は、このコードには、例えばphpを乗せることも不可能ではないのですが、出力をHello, world!だけにするのがちょっとめんどくさいなと思ってやめました。

# お詫び

## その１

コピペミスっていて、Javaのソースが古いバージョンになってました。直しました。すみません。

## その２

replaceは以下の通り、一回で良かったです。すみません。

```javascript:改良版
/*
<script>
var System = {out: {println: function(e){console.log(e);document.getElementsByTagName('body')[0].innerHTML=e;}}};
window.onload = function() {
    eval(document.getElementById('code').innerHTML.replace(/[*]/g, '/'));
}
</script>
<div id="code">
*/
class Main {
    /**/ public static void
    main(
        /**/ String[] args
    ) {
        System.out.println("Hello, world!");
    }
}
/*
new Main().main();
</div>
*/
```

おしまい！
Windows10上のVS CodeからRaspberry Piにリモート接続

# VS CodeのTerminalからRaspberry PiにSSH接続
Windows上のvs CodeのTerminalからRaspberry piにssh接続することにより、Windows上vs codeでRaspberry pi上のファイルを編集することが出来ます。もちろん、単にterminal(windows環境なのでWindows subsystem for linux)からssh接続してVim等のエディタを用いて編集することは可能なのですが、自身はvs CodeのVim拡張の方が使いやすかったので、こちらの方法で編集していました。以下に作業環境のバージョンを示します。

|    ソフトもしくはハード    |       バージョン |
|:-----------------:|:------------------:|
| VS Code             |              1.28.2| 
| Raspberry pi          |            Model 3 B+ | 

以下においては、クライアント側(Windows上のVS Code)とサーバ側(Raspberry　Pi)の処理に分けて接続方法を説明します。


## サーバ側(Raspberry　PI)


- **1**. raspi-configにおいてSSH接続を許可する
    - raspi-configはRaspberry piのterminalから以下のコマンドで開けます

```bash

$sudo raspi-config
```

- **2**. 以下のコマンドを実行する

```bash

$sudo wget -O /usr/bin/rmate https://raw.github.com/aurora/rmate/master/rmate
$sudo chmod a+x /usr/bin/rmate
```

以上がサーバ側での設定となります。

## クライアント側(Vs Code側)

- **1**. VS Codeを開き、拡張機能で”remote VSCode”を追加する
    - 以下に該当の拡張機能の画像を示します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/169342/edbe93ae-63c1-292d-9545-c65867d7b631.png)

- **2**. VS Codeのファイル>基本設定>設定>Remote VSCodeから, 設定を変更する
    - 変更点を以下の表及び画像に示します。
    
|    変更点                |       変更内容 |
|:---------------------:|:------------------------:|
|     Remote：Host        |              127.0.0.1| 
|     Remote：Port        |              52698|
| Remote:Onstartup            |            "Launch the server on start up"に チェックを入れる | 

![2.png](https://qiita-image-store.s3.amazonaws.com/0/169342/2ae108f4-4bf7-3a2f-4175-fd2ddbb1037b.png)


- **3**. %USERPROFILE%/.ssh/configに以下を追記して保存する。

```bash
Host pi
   HostName 192.168.100.103
   user "Userの名前"
   ForwardAgent yes
   RemoteForward 52698 127.0.0.1:52698
```

- **4**. VS Code上でターミナルを開く
- **5**. 以下のコマンドをでログインする
    - ログインする前にサーバ側のIPアドレスをifconfig等で知っておく必要があります。
  
```bash

$ssh -R 52698:127.0.0.1:52698 pi@"Raspberry PiのIPアドレス"
```

- **6**. ログイン状態で編集したいファイルに対して以下を実行するとローカルのVS Code上で開かれる

```bash

$rmate -p 52698 test.py
```

以上がクライアント側の設定となります。

## 参考資料
https://qiita.com/take-iwiw/items/5b20558f8ab3f27ca4a4
"WindowsVideoMedia error 0xc00d5212" in Unity

iPadで撮った動画(MOVファイル)をUnityで再生することがあったので、Windows上のUnityに取り込んでみると

"WindowsVideoMedia error 0xc00d5212 while reading C:/~/Assets/~.MOV"

と返って来ました。

調べてみると、
数々の動画ファイル(.MOV, avi, mp4...)があるけれど、今回取り込んだMOVファイルはWindowsに対応していなかったということでした。(どうやら、MOVはAppleのものらしい)

MOVファイルのままで取り込むためには、AppleのQuickTimeを入れる？
でも、もうサポートは終了してる…
https://freesoft.tvbok.com/movie_encode/codec/install_quicktime_windows.html

色々面倒でやめました…

aviファイルならWindowsに対応していたので、MOVからaviに変換しました。
https://www.aconvert.com/jp/video/mov-to-avi/

aviファイルで無事にUnityに取り込むことが出来ました。
タプル・リスト_「すごいErlangゆかいに学ぼう！」_#05

# タプル
複数の値のセット
X = 5, Y = 6.
Point = {5, 6}.

{M, _} = Point. %% 片方だけ取り出すとき

{tokyo, {tokyo, 23}}. %% atom付き、入れ子でも可

# リスト
[1,2,3].

[1, 2] ++ [3, 4]. %% [1,2,3,4]
[1,2,3,4,5,6,1,2,3] -- [1,2]. %% [3,4,5,6,1,2,3]。言語によっては、全ての1,2が削除される場合もある

[1, 2, 3] -- [1, 2] -- [3]. %% [3]。右から計算するから
[1, 2, 3] -- [1, 2] -- [2]. %% [2,3]。右から計算

hd([1,2,3]). %% [1]。関数。headのこと
tl([1,2,3]). %% [2,3]。関数。tailのこと

[1 | [1,2,3]]. %% [1,1,2,3]。
[[a,b] | [c,d]] %% [[a,b],c,d] 前はまとめられる。後ろはリストが展開されるので後ろはリストであることが原則。
Firefox を headlessで起動

Xvfbが不要になってありがたい。

* [ヘッドレスモード - Mozilla | MDN](https://developer.mozilla.org/ja/docs/Mozilla/Firefox/Headless_mode)

## 起動

```sh:起動
firefox --headless \
  "https://yahoo.co.jp"
```

## 画面キャプチャ

```sh:起動
firefox --headless \
 --screenshot "a.png" \
  "https://yahoo.co.jp"
```


## firefoxが既に起動しています の対応

* profile を新規で指定すればよい。

```sh:起動
mkdir ./profile/

firefox --headless \
 --profile ./profile/ \
 --screenshot "a.png" \
  "https://yahoo.co.jp"
```

## `*** You are running in headless mode.` 表示を消す

この表示を消したい場合は以下

```sh:起動
firefox --headless \
 --profile ./profile/ \
 --screenshot "a.png" \
  "https://yahoo.co.jp" 2>/dev/null
```
C++らしく単振り子の運動を計算する

# はじめに

[C++で単振り子の数値シミュレーション](https://qiita.com/ysuzuki19/items/c1be78d9e9e90dd4aa1e)のコードを見て、C++らしい書き方をするとこうなるよと初心者向けに書き直してみました。
[GitHub](https://github.com/shohirose/qiita/tree/master/ysuzuki19)にCMakeの設定ファイルと共にアップしてありますので、自由にダウンロードして試してください。
コメントを書かなくても理解できるようにコードを書くよう心掛けましょう。

# コード

単純に元のコードをC++14で書き直しています。一階微分や二階微分の評価方法が実はちょいおかしいとか、評価した角度とその時間がずれて記録されているとか、本当は細かく修正しないといけないのですが、面倒なのでそのままにしました。

```cpp:single_pendulum.cpp
#include <cmath>
#include <fstream>
#include <vector>

inline constexpr auto deg2rad(double deg) { return deg / 180.0 * M_PI; }
inline constexpr auto rad2deg(double rad) { return rad / M_PI * 180.0; }

int main() {
  // In SI units
  constexpr auto delta_time                 = 0.01;
  constexpr auto start_time                 = 0.0;
  constexpr auto end_time                   = 100.0;
  constexpr auto initial_angle              = deg2rad(12.0);
  constexpr auto gravitational_acceleration = 9.80665;
  constexpr auto pendulum_length            = 10.0;
  constexpr auto pendulum_mass              = 2.0;
  constexpr auto drag_coeff                 = 0.02;

  const auto dt = delta_time;
  const auto x0 = initial_angle;
  const auto g  = gravitational_acceleration;
  const auto l  = pendulum_length;
  const auto m  = pendulum_mass;
  const auto k  = drag_coeff;

  const auto ndata = ceil((end_time - start_time) / dt);

  std::vector<double> time_series;
  std::vector<double> angle_series;
  time_series.reserve(ndata);
  angle_series.reserve(ndata);

  auto t = start_time;
  auto x = x0;
  auto v = 0.0;

  while (t < end_time) {
    // Equation of motion for a single pendulum with a drag force
    const auto a = -g / l * sin(x) - k / m * v;
    v += a * dt;
    x += v * dt;
    angle_series.push_back(x);
    time_series.push_back(t);
    t += dt;
  };

  std::ofstream fo("single_pendulum.txt");
  fo << "time [s],angle [deg]" << std::endl;
  for (size_t i = 0; i < time_series.size(); ++i)
    fo << time_series[i] << "," << rad2deg(angle_series[i]) << std::endl;
}
```

# 補足

c++でコードを書くときは最低限以下のことに気をつけましょう。

- マクロの代わりに`constexpr`を使う
- 動的配列には`std::vector`を使う
- `const`および`auto`を積極的に使う
Colaboratoryを使う際のGoogle Driveマウント方法など取り扱いかた色々

##はじめに
###対象読者
- Colaboratoryを使って、継続的にデータを残したい人

###このページの目的
- Colaboratoryを使って色々動かすときに、ファイルを毎回アップロードする手間を省く

###その他
- [ColoboratoryFAQ（公式）](https://research.google.com/colaboratory/faq.html)

##アジェンダ
1.ColaboratoryでのGoogleDriveマウント方法
2.GoogleDriveの取り扱い方いろいろ
3.終わりに

# 1.ColaboratoryでのGoogleDriveマウント方法

以下のコードを実行すると、MyDrive直下がマウントされます。

```
from google.colab import drive
drive.mount('/content/drive/')
```

マウントされると、左メニューの「ファイル」タブに"drive"という文字が現れます。
![bandicam 2018-11-08 08-17-24-684.jpg](https://qiita-image-store.s3.amazonaws.com/0/232326/94c18892-a512-c02b-304b-6f20efa38c5b.jpeg)

これで、いちいちファイルをアップロードしなくても、GoogleDriveからデータを読み込んだり、逆に書き込みを行ったりすることができます。

# 2.GoogleDriveの取り扱い方いろいろ
基本的な使い方は①の通りです。
そのほかに試したことなどを追記していきたいと思います。

### どのようにアクセスするのか？
MyDrive直下までのパスは「/content/drive/My Drive/」です。
私は、Colaboratoryようにdatasというフォルダを作成しているので、下記のようにbase_dirを作成しています。

```
base_dir = "/content/drive/My Drive/datas/".replace('/', os.sep)
```

### ファイルの書き込み方法
例えば、OpenCVでの保存方法は下記のようになります。
普通にローカルで保存するのと同じですね。


```
cv2.imwrite(base_dir + "images/im.png", resultImage)
```

## 3.終わりに
ColaboratoryとGoogle Driveの連携で、めちゃくちゃ便利に検証環境が作成できました。
本当に感謝しかない。

まだまだ使い倒しているわけではないので、いろいろ調べながら更新していきたいと思います。
APEXでLambdaのデプロイ環境を分離する

# はじめに

APEXでLambda関数のリソースをデプロイ環境ごとに切り分ける方法について、個人的に良いとおもう方法をまとめました。

# 要件

1. デプロイ環境ごとに異なるAWSアカウントを利用する
2. デプロイ環境ごとに異なる環境変数を設定する
3. ソースコードリポジトリにアップロードしたくないような秘密情報については、2とは別に管理する
4. Lambdaソースコード自体はデプロイ環境にかかわらず同一にする

要件1について、StagingとProductionで同一のAWSアカウントを利用する場合もあると思いますが、AWSアカウントを独立させるほうがリソースの分離が徹底されます。私が関わったプロジェクトでもおもに要件1の構成を採用しています。

APEXで標準で用意されている方法を使えば要件4は自動的に満たされるので、以下では次の2つの観点で記述します

要件1 => AWSアカウントの分離について
要件2, 3 => 環境変数の分離について

# AWSアカウントの分離について

APEX で AWS の Credentialsを指定する方法は次の2つがあります。

1. 環境変数を利用する方法
2. `~/.aws` ファイルを利用する方法

デプロイ環境ごとにディレクトリスを分けられる場合は、direnvを使ってディレクトリごとに環境設定をスイッチすることができます。
しかし、APEXだと環境設定ファイルを `project.production.json` のような名前で同じディレクトリに配置していくことになるので、1の方法は使えません。

したがって、今回は2の方法を採用します。

## デプロイ環境ごとにProfileを用意する

デプロイ環境ごとにプロファイルを用意します。
なお、意図しないCredentialsを使ってリソースを作成されてしまうリスクがあるので、（特に複数のプロジェクトでCredentialsを使い分けている場合など）基本的には **`default`のプロファイルは設定しないほうが良い**と思います。

```ini:~/.aws/credentials
[staging]
aws_access_key_id = xxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxx
[production]
aws_access_key_id = xxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxx
```

## project.*.json にprofileを指定する

デプロイするときのprofileを指定する方法には次の2通りの方法があります:

1. apex コマンドのオプション `--profile` で指定する
2. `project.*.json` で指定する

環境ごとの設定を指定する場所をなるべく1箇所に集約したいので、今回は2の方法を採用します。1の方法だとデプロイ時に `apex deploy --profile=staging --env=staging` のようなコマンドを打つ必要があり、環境を指定する部分が冗長になってしまいます。

```json:project.staging.json
{
  "profile": "staging"
}
```

```json:project.production.json
{
  "profile": "production"
}
```

# 環境変数の分離について

パスワードなど、GitHubなどのソースコードリポジトリにアップロードするとまずい情報は通常の環境変数とは別で管理します。

## 秘密情報を含まない環境変数は project.*.json に記述する

秘密情報を含まない通常の環境変数は `project.*.json` に記述して**ソースコードリポジトリに含めます**。


```json:project.staging.json
{
  "environment": {
    "AUTH_ACCOUNT": "1234567890"
  }
}
```

```json:project.production.json
{
  "environment": {
    "AUTH_ACCOUNT": "abcdefghijk"
  }
}
```

## 秘密情報を含む環境変数はデプロイ時の引数 `--env-file` で渡す

パスワードなど、秘密情報を含む環境変数は `env.*.json` に記述し、`--env-file` でデプロイ時の引数として指定します。
環境変数を記述した `env.*.json` は**ソースコードリポジトリには含めません**。

なお、環境変数の優先順位は以下の順番です:

* -s, --set flag values
* -E, --env-file file values
* environment variables specified in project.json or function.json

したがって、`project.*.json` には環境変数のキー名だけ埋め込んでおき、`env.*.json`で実際の値を注入するのがよいと思います。

```json:project.staging.json
{
  "environment": {
    "AUTH_ACCOUNT": "1234567890",
    "AUTH_SECURITY_TOKEN": ""
  }
}
```

```json:project.production.json
{
  "environment": {
    "AUTH_ACCOUNT": "abcdefghijk",
    "AUTH_SECURITY_TOKEN": ""
  }
}
```

```json:env.staging.json
{
  "AUTH_SECURITY_TOKEN": "XXXXXXXXXXXXXXX"
}
```

```json:env.production.json
{
  "AUTH_SECURITY_TOKEN": "YYYYYYYYYYYYYYY"
}
```

# デプロイ

実際にデプロイするときのコマンドは以下のようになります。

## staging

```bash
apex deploy --env-file=env.staging.json --env=staging
```

## production

```bash
apex deploy --env-file=env.production.json --env=production
```

# 参考

* APEXでの環境変数の指定方法
  * https://github.com/apex/apex/blob/master/docs/env.md
* 環境変数の暗号化に関する APEX のISSUE
  * https://github.com/apex/apex/issues/613
  * https://github.com/apex/apex/issues/651
  * https://github.com/apex/apex/pull/532
今後必要にはならないかもしれないけれど、独断と偏見でお勧めする言語

#酔っ払った勢いで書くおすすめ言語

##MS-MASM

 マイクロソフトのマクロアセンブラ。マクロ機能があまりにも強力で、アセンブラでありながら高級言語を使っているかと錯覚するような使い方が出来る。今であればVisualStudioでVC++をインストールすると、ステルス的に勝手にインストールされる。アセンブルするのに必要なコマンドはml.exeだ。

　私の記憶だとMASMはもっと昔だとMS-DOSの拡張機能セットに付いてきた気がする。30年ぐらい前の話で記憶が曖昧になっているので、そのあたりの突っ込みを歓迎したい。あの頃はMS-DOS上で動くFM音源ドライバとかMIDIドライバとかを作っていた気がする。その手のネタはIOとかComputerFanとかいう雑誌に記事を投稿したが今となってはそんな雑誌、誰も知らないかもしれない。

　Windows時代では一般の開発者がMASMに触ることは稀である。しかしC/C++開発者であれば、アセンブラを触ることによって得られるメリットは大きい。

　例えばコード領域に変数を用意して、そこに書き込んだらどうなるかというような実験が気軽に出来る。もちろん書き込みに対する保護がかかっているので定数しかおけないという事実に気づかされる。割り算をするときに、商と余りが同時に返ってくることに驚愕するかもしれない。C/C++から引数を渡すときにスタックにどう積まれて、どうやって引っ張り出せば良いのか理解したときには感動を覚えることだろう。いやMASMにはそのあたりを隠蔽してしまう高級機能が付いているので気がつかずに終わる可能性もある。あまりにも強力な言語だ。

　Webシステムを開発するような用途にははっきり言って実用性は皆無だが、知識に飢えている面々には絶対にお勧めする。


##C/C++

　高級言語の元祖であり、その存在がなくなったら、その他の言語も一緒に心中するしかなくなるという恐るべき言語である。OSがC/C++で組まれ、様々なコンパイラがC/C++で組まれ、様々なインタプリタやスクリプトの実行プログラムがC/C++で作られている。その存在が消失したら、IT系の業界は地上に止まることは出来ず、天界にその住居を移すしかなくなるだろう。

　C/C++は何をしたらヤバいのか、リソースの管理を怠ったらどうなるのか、そういったものを全てを分からせてくれる。さらにアセンブラと併用することによってCPUが何をやっているのか、ある程度は理解できる。そしてメモリの確保を自分でやることによって、リソース資源の有り難みを実感できるのだ。その神髄に填まると「ガベージコレクション？何その気持ち悪いの」という気分にさせられる。


##COBOL(おまけ)

　まあ、未だ使われているところでは使われている。しかし新たなプロジェクトで選択されることなど皆無だ。なぜこれをお勧めするか？理由は簡単だ。古き設計による冗長さを体験して欲しいからだ。あいでんでぃふけいしょんでぃびじょん、えんばいろんめんとでぃびじょん、でぇたでぃぶじょん、ぷろせじゃぁでぃびじょん。「何を言っているのか　わからねーと思うが」、是非、これらを記述して欲しい。出来れば汎用機にジョブを投入するところまで体験してもらいたいが、汎用機は今となっては絶滅していることだろう。絶滅してるよね？え、ある？


##cmd:MS-DOSコマンド&BATファイル

　恐ろしいことにWindows時代になってからも使われている。MSはPowerShellを推奨しているが、未だに使われている。無くなったら色々なシステムが窮地に立たされる、そんな存在だ。文法はわかりやすいとは言いがたく、ループとか分岐が必要になってくると記述するのに気が重い。最大の欠点はUNCパスの扱いに問題があり、カレントディレクトリがドライブ上にマウントされていないとBATで組んだコマンドは誤作動する。最近困ったのはWindows版Node.jsのnpmがBATで組まれていて見事誤作動した。一応解決方法が無くもないのだが、そういったものに遭遇するたびに対処するのは面倒くさい。しばらく書かないとループなどの文法を忘れ、思い出すのに苦労する。しかしWindowsがらみのシステムでは、なんだかんだで必要になってしまうのだ。


##PowerShell

　この野郎と思うしか無い。なんでこっちの方向に進化した？求めていたのはそれじゃ無いんだ。cmdをもっと使いやすくして欲しかったと色々思うことがある。しかしWindowsやMSのサービスがらみの機能をいじるのに、PowerShellでしかコマンドが提供されていないものが多々あり、他に選択肢は無い。ビジネス版のOffice365で、あるユーザのOneDriveの不具合を解決するのに、MSのサポートからPowerShellでコマンドによるリカバリを要求された。目的の場所へたどり着くためのモジュールと認証手順はどこかにメモっておかないと、どんどん時間を吸い取られていく。恐怖としか言い様がない。

##sh/bash
　ほとんどのUNIX系で標準採用されているshellスクリプト。UNIX系のコマンドとともに、システムを立ち上げる部分は最低限記述できるようになっておくことが無難だ。大勢を占めているので、俺はCShell派だから必要ないとも言っていられない。昔はFreeBSD&CShell派だったが、Linux&bashという時代の波にのまれたのは責めないで欲しい。

#まとめ

　猜疑心を抱いてはいけない。お勧めはお勧めなのだ。
jqueryメモ⑤　制御文

#論理演算子

***!***：　条件の真偽値を反転する（条件がtrueならflase, falseの場合はtrue）。　！条件


#主な制御文

***if文***

```
if( 条件1 ){
  条件1がtrue(真)の場合のみif文内の処理を実行する
} else if( 条件2 ){
  条件1がfalse（偽）で、条件２がtrue(真)の場合はここのコードを実行
} else{
  条件1と条件2ががfalse（偽）の場合はここのコードを実行
}
```

 
***switch文***
「ある一つのデータと複数のデータとを比較して処理を分岐する。」際に使用できる。
If文でもいいが、switch文は条件を省略できるので、コードの内容の可読性が高くなります。
Break文を省略してもエラーにはなりませんが、break文を書き忘れると該当のcase以降のすべての処理が実行されてしまい、意図した結果にならなくなる。



***for文***
for (初期化; 条件; 変更){
  繰り返す処理
}

①初期化で「条件」と使用するカウント用の変数などを初期化する
②「条件」を評価し、trueの場合は③へ、flaseの場合はfor文の処理を終了する
③上記の「繰り返す」処理を実行する
④カウント用の変数などを変更し②にもどる

例：数値が格納されている配列内の値を全て足したい

```js

var a = [1,2,3,4,5,6];
var b = 0;

for(var i = 0; len = a.length; i < len; i++){
  b + = a[i];
}
//結果は21
```


また以下の２種類の文を指定できます。
continue文：処理を途中で止めて、「変更」の処理にスキップする
break文：for文の処理を強制的に終了する

上記の文を指定することで、任意のタイミングでfor文の処理を制御できるようになります。
「配列内の値が偶数の場合は加算し、５の倍数の場合は処理を終了する」という条件を加えると下記のようになる。

```js

var a = [1,2,3,4,5,6];
var b = 0;

for(var i = 0; len = a.length; i < len; i++){
  var num = a[I];


  if(num % 5 === 0){
	break;                ←break文が実行されると、処理の途中でもfor文は終了。ここでは６回処理が実行されるように書いてあるが、「5」で終了する。
 }else if(num % 2 ===1){
	continue;            ←他の処理が残っていても、処理がfor文の先頭に戻る。つまり奇数の時は加算処理がスキップされる。
}
b += num;
}

```

なおjQueryではeach()メソッドを使用することでも繰り返し処理を実行することができる。
いつもなんとなくで使っているdisplayプロパティについて


いつもなんとなく使っているCSSのdisplayプロパティをちゃんと理解しようと思い、調べながら色々遊んでみました。


# displayプロパティについて
以下のHTMLソースと一緒に見ていきます。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>display</title>
  </head>
  <style>
    div, span {
      border: 1px solid;
      margin: 5px;
      padding: 5px;
    }
  </style>
  <body>
      <div class="box1">
        block 1
      </div>

      <div class="box2">
        block 2
      </div>

      <span class="box3">
        inline
      </span>

      <span class="box4">
        inline-block
      </span>
  </body>
</html>
```

表示はこんな感じ↓↓
![スクリーンショット 2018-11-05 22.58.27.png](https://qiita-image-store.s3.amazonaws.com/0/159675/0acaa38b-01f4-cd98-def7-f052d93707ad.png)

## block
縦並びに増えていく要素。
div, p, h1などはすべてblock要素です。

## inline
横並びに増えていく要素。
<b><span style="color: red">width, heightなどのサイズの調整ができない。</span></b>
a, spanなどは全てinline要素です。

## inline-block
横並びに増えていく。
<span style="color: #ff0000"><b>inlineだけどサイズの調整ができる。</b></span>
inlineとblock要素のいいとこ取りな奴です。

## none
非表示にします。

# 覚えがてらあそんでみる
とりあえず、超
てきとう
簡単なページをつくりました。

```html
    <style>
    .backButton, .nextButton {
      border: 1px solid gray;
      padding: 5px;
      text-align: center;
      text-decoration: none;
      color: #000;
      background-color: #dbdbdb
    }
  </style>
  <body>
      <div class="container">
        <p class="description">文を入力してください</p>
        <textarea placeholder="ここにテキストを入力" ="name" rows="30" cols="80"></textarea>
          <a href="#" class="backButton">もどる</a>
          <a href="#" class="nextButton">次へ</a>
      </div>
  </body>
```

![スクリーンショット 2018-11-05 23.12.44.png](https://qiita-image-store.s3.amazonaws.com/0/159675/8f43867b-4761-5264-1843-77aed76cf217.png)

テキストを入力して「次へ」ボタンをクリックするページのサンプルです。
（ボタンを押してもどこへも遷移しませんが）


ボタンをテキストボックスの下に配置したいので、ボタン２つをdiv.buttonAreaで囲んでやります。

```html
        <div class="buttonArea">
          <a href="#" class="backButton">もどる</a>
          <a href="#" class="nextButton">次へ</a>
        </div>

```

![スクリーンショット 2018-11-05 23.17.11.png](https://qiita-image-store.s3.amazonaws.com/0/159675/a22c4351-958f-527a-b88b-3174f329515f.png)

<b>divはblock要素なので、下に回り込みます。</b>よって、divに囲まれたボタン達はblock要素となり下に回り込みます。


次に、ボタンの大きさを変えたいのでwidthを設定します。

aタグはinline要素のためサイズの調整ができません。なので、CSSからボタンにinline-block要素を適用してやります。

```css
    .backButton, .nextButton {
      border: 1px solid gray;
      padding: 5px;
      text-align: center;
      text-decoration: none;
      color: #000;
      background-color: #dbdbdb;
      /* 追加↓↓ */
      display: inline-block;
      width: 110px;
      /* 追加↑↑ */
    }
```

![スクリーンショット 2018-11-05 23.25.46.png](https://qiita-image-store.s3.amazonaws.com/0/159675/eba795ff-9e86-9c27-5f5a-0c2b6e5ce064.png)

うーん、なんか戻るボタンが要らなく感じてきました。
ひとまず暫定的にnoneで非表示にして、次へボタンを右に寄せときましょうか。

```css
    .backButton {
      display: none;
    }

    .nextButton {
      margin-left: 370px;
    }
```

![スクリーンショット 2018-11-05 23.32.17.png](https://qiita-image-store.s3.amazonaws.com/0/159675/afe5c2dd-4ad2-1d83-1c01-9855a19bc14e.png)

いい感じですね。

ここで挙げたもの以外にも、displayはまだまだ奥深いのでもっと勉強していかないとなあ。

### 参考にしたサイト
https://dotinstall.com/lessons/basic_css_v3/31718
テーブルの更新履歴を確認する方法

〇更新履歴を見る方法
select * from all_tab_modifications where table_owner = '※スキーマ名'
例）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207111/6f8e675e-bd18-b492-9139-383fbda8f7fd.png)
TABLE_OWNER	TABLE_NAME	PARTITION_NAME	SUBPARTITION_NAME	INSERTS	UPDATES	DELETES	TIMESTAMP	TRUNCATED	DROP_SEGMENTS
TRPG	TEST_TABLE			3	2	0	18-11-08	NO	0


〇更新されたレコードを確認する
SELECT SCN_TO_TIMESTAMP(ora_rowscn),A.* from test_table A order by SCN_TO_TIMESTAMP(ora_rowscn) desc
SCN_TO_TIMESTAMP(ORA_ROWSCN)	ID	NAME	VALUE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207111/31379a2b-ce75-f8b4-bdd0-0451b0e4835d.png)
18-11-08 06:26:34.000000000	0000000004	岩手	4
18-11-08 06:20:39.000000000	0000000002	青森	2
18-11-08 06:20:39.000000000	0000000003	秋田	4
18-11-08 06:20:39.000000000	0000000001	北海道	1


〇更新履歴をリセットする方法
--監視情報をリセットするSQLのためリスクあり
--DBシャットダウンしないとリセットされない模様
exec dbms_stats.flush_database_monitoring_info
英語は重要

#結論

###"英語"が今の時代で1番重要な自然言語

#はじめに
今回は**"自然言語"**について話そうと思います。

#自然言語とは

Wikipediaによると

>自然言語（しぜんげんご、英: natural language）とは、人間によって日常の意思疎通のために用いられる、文化的背景を持って自然に発展してきた言語である。
>[(Wikipedia - 自然言語)](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E)

つまり、簡潔に言うと私たちが会話をするために話している言語のことです。
**英語・日本語・中国語・スペイン語・アラビア語・ラテン語・シルボ語……などなど**

これらの言語を**自然言語**と呼びます。

#英語

**英語は重要な自然言語です。**

開発者にとって**絶対に欠けることが出来ない**自然言語だと思います。

では、具体例を見てみましょう。

以下のソースコードは**C言語で文字列を出力する**ものです。

```c:Source.c
#include <stdio.h>
int main(void) {
	printf("Hello, World!\n");
}
```

皆さんお気づきでしょうか？
実はこのソースコード、**英語**が使われています。

```c:英語
include //含める
main //主要な
void //空(から)の
print //表示される
Hello, World! //こんにちは、(このプログラミング言語の)世界！
```

このように多くのプログラミング言語は**英単語が多く登場します。**

多くのプログラミング言語の入門書に書かれている**`Hello, World!`**も
英語ですので、英語の重要さがわかると思います。

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

ソースコードは自由に使用してください。