OmniAICreator/Qiita-1.07M huggingface dataset:
プライマリキーの変更を行う方法

# 確実にプライマリキーを削除する
```sql
ALTER TABLE テーブル名 DROP CONSTRAINT プライマリキー名 CASCADE DROP INDEX
```
CASCADE DROP INDEX を書かないと、不意にプライマリキーからは外れるけどインデックスがそのまま残るという現象に遭遇してしまう。（Oracle10g以降）
DMPでインポートされたテーブルに対して行うと発生するらしい。

# プライマリキーを作成する
```sql
ALTER TABLE テーブル名 ADD
  CONSTRAINT プライマリキー名
  PRIMARY KEY (項目, 項目, 項目) USING INDEX
    PCTFREE 10
    INITRANS 2
    MAXTRANS 255
    TABLESPACE テーブルスペース名
    STORAGE(INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS 2147483645 BUFFER_POOL DEFAULT)
    LOGGING
    ENABLE
```

一時表に対してプライマリキーを指定したい場合は

```sql
ALTER TABLE テーブル名 ADD
  CONSTRAINT プライマリキー名
  PRIMARY KEY (項目, 項目, 項目) USING INDEX
    ENABLE
```
Windows Subsystem for Linux (Ubuntu)のdockerコマンドからDocker for Windowsに接続する

# 概要

Windows Subsystem for Linux (WSL)上でdockerホストを動かしても、NTFSファイルシステムにアクセスできません。そこで、WSLからdockerコマンドを実行したいが、dockerホストとしてはWindows上で動作しているDocker for Windowsに接続したい、というような場合の設定方法を記します。

[こちらのサイト](https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly)を参考にしています。

環境は以下の通りです。

* Windows 10 Pro
* Ubuntu 18.04 （Microsoft Storeより）

# Docker for Windowsのインストール

* [Docker Desktop (Windows)](https://hub.docker.com/editions/community/docker-ce-desktop-windows)をインストールする
    
* [Settings]-[General]で、'Expose daemon on tcp://localhost:2375 without TLS'をチェックする。

* [Settings]-[Shared Drives]で、dockerホストからアクセスしたいドライブを共有する。

# WSLへのdockerのインストール

Ubuntuを管理者（rootでは無く、Windowsの管理者）として実行し、以下の通りdockerをインストールする。

```bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install docker.io
$ sudo usermod -aG docker $USER
```

# WSLの設定

WSLから、Docker for Windowsに接続するための設定をする。

```bash
$ echo "export DOCKER_HOST=tcp://0.0.0.0:2375" >> ~/.bashrc && source ~/.bashrc
```

WSLのマウントポイントの設定をDocker for Windowsに合わせて、`/mnt`ではなく`/`にする。

```bash
$ sudo vi /etc/wsl.conf

[automount]
root = /
options = "metadata"
```

マシンを再起動して、WSLにて動作確認する。

```bash
$ docker info
...
Operating System: Docker for Windows
...
```
CryptoViper: Vyperを学習できるプラットフォーム

先月から、私はVyperの勉強を始めました。しかし、私はVyperドキュメンテーションだけを使うことができます。 Vyperを学習するための他のプラットフォームはありません。だから私はVyperを学習できるプラットフォームを作ってみました。

# Vyperとは
現在、Ethereum Blockchain上のSmart Contractを書く言語はSolidityとVyperの二種類です。しかしなが、Solidityにはいくつかの問題点があります。それらの問題を軽減するために、Vyperが開発されました。Vyperはスマートコントラクトを開発するための新しい言語です。Vyperはスマートコントラクトの作成プロセスを大幅に簡素化するように設計されています。VyperはSolidityと同じロジックを持ちますが、Pythonと同じ構文です。Vyperは2018年6月現在でもv0.1.0 - beta.1にあります！

しかし、Vyperには学習プラットフォームがありません。勉強したい人は、Vyperのドキュメンテーションを使わなければなりません。なので、現在はVyperを使う人が少ないです。私はVyperをサポートしたいので、私は人々にそれを使うように誘う方法を考えました。

このリンクでVyperを勉強することができます：
https://qiita.com/Binsu/items/2d43e5d494e7d961a7df
https://vyper.readthedocs.io/en/latest/

# CryptoViperとは
そこで、私はVyperをサポートする方法を考えました。私が開発したものは、Vyperを学習できるプラットフォームのCryptoViperです。CryptoViperには、Vyperの基本から自分のゲームキャラクターを作るまでのステップバイステップのレッスンが含まれています。
<img width="1680" alt="Game.png" src="https://qiita-image-store.s3.amazonaws.com/0/300943/2c729ab9-41dc-8e3a-f26b-04e9eb259400.png">
<img width="1680" alt="IDE.png" src="https://qiita-image-store.s3.amazonaws.com/0/300943/e65f4464-e41c-9ab6-cc62-2d98de41bb92.png">

## CryptoViperの目的
CryptoViperには3つの目的があります。まず、Vyperを勉強したい人にプラットフォームを提供します。二つ目に、ユーザーはゲーム感覚でVyperを学習することができます。最終的に、Vyperエンジニアの数を増やします。私のCryptoviperを使うとより良いスマートコントラクトをVyperで作ることができるようになるでしょう。しかし、このアプリはまだ起動する準備ができていません。それはまだ開発中です、そして私はそれをもっと良くやっています。

## プログラムの流れ
このアプリは、ユーザーがレッスン1を開始することから始まります。各レッスンには具体的な指示があります。ユーザーはこの指示に従い、答えを開発する必要があります。もし、ユーザーの答えが正しかったら、ユーザーは次のレベルに行くことができます。ブロックチェーンを使って、私はユーザーの進行状況を追跡します。すべてのレッスンが終わった後、ユーザーはERC 721トークンで発行された修了証をもらうことができます。この修了証は、ユーザーのランクも表しています。

<img width="566" alt="Screen Shot 2018-12-27 at 18.14.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/300943/e79dd8ea-31ba-7414-efd0-6ee3d15e8224.png">

## Demo
このリンクでデモビデオを見つけることができます: https://www.youtube.com/watch?v=Lc0SvF42rWo&feature=youtu.be

## 使用されるツール
CryptoViperを作るにあたり、私はReact.jsとVyperコンパイラとSolidityを使いました。私はウェブサイトのフロントエンドにReact.jsを使いました。フロントエンドコードはGithubに格納されています。ユーザーの進捗状況を追跡し、トークンを与えるために、私はSolidityを使いました。ユーザーの答えを確認するために、Vyperのコンパイラを使いました。

このリンクでReact.jsを勉強することができます：https://reactjs.org

<img width="625" alt="Screen Shot 2018-12-27 at 18.24.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/300943/f98e2bbb-40c9-6814-02bd-2047e4899184.png">

# まとめ
良い新しいプログラミング言語が常に作られています。しかし時々それはリリースされたとき普及していない。Vyperはスマートコントラクトを作るための良い言語です。しかし、コミュニティからの支援はまだほとんどありません。それが私がCryptoviperを作った理由です。私はVyperをサポートして、それを他のBlockchain開発者に人気にしたいです。私は私のような普通の開発者が良い言語をサポートできることを示すためにQiitaを通して私のアプリケーションを投稿しました。あなたも新しい言語をサポートできます。CryptoViperと同じようなアプリを作成したり、独自の新しい方法を作成することもできます。
投書：「クリーンミート」普及への道筋と米国議会

原文 - [Letter: Congress, clear path for "clean meat"](https://www.timesunion.com/opinion/article/Letter-Congress-clear-path-for-clean-meat-13492367.php)

慣れ親しんだ風味と食感で、当たり前のように行われる家畜の屠殺や熱帯雨林の破壊を進めずに、本物の肉で作られたおいしいハンバーグを食べることを想像してください。SFの話のように聞こえますか？信じられないかもしれませんが、これは2021年という遠くない未来で現実になる可能性があります。

すでに、科学者たちは、生きた牛を殺さずに採取したほんの数個の細胞から、ハンバーガーを培養することに成功しています。現在、着実にコストを削減しており、「クリーンミート」として知られるハンバーガーの生産規模を拡大しています。そして彼らは細胞培養で作られたハンバーガーがまもなく消費者に届けられるようになることを期待しています。ハンバーガーや同様のクリーンミート製品は私たちの食卓に革命をもたらし、家畜を育てるために必要な資源の量を劇的に減らし、大量の温室効果ガスの排出量を削減することができます。しかし、これはクリーンミートを市場に出すための有効な道筋がある場合にのみ起こり得る未来です。有効な道筋とは、食肉製品表示に求められる専門知識と細胞培養に求められる専門知識を考慮すると、米国農務省と米食品医薬品局(FDA)が協働に合意することを指します。残念ながら、FDAによるクリーンミート規制への関与に反対している牛肉産業界に圧力をかけられている米国議会は、今年の予算法案に含めるために「セクション736」として知られる付加条項を現在検討しています。この付加条項が可決されれば、米国農務省は単独でクリーンミートに取り組まざるを得ないであろうし、どちらの機関(注:米国農務省とFDA？)も無駄で時間のかかる形式的な手続きをする必要に陥るでしょう。

クリーンミート技術の前進のため、Charles Schumer上院議員のような私たちの代表が(既存産業の)企業の利権に立ち向かい、予算を法案から排除することを願っています。

Don Ferlazzo

Clifton Park(ニューヨーク サラトガ郡郊外の町)
Gitの使い方 ⚠️勉強中

よく使うGitコマンドについて、自分なりにまとめてみた。

---

##### ワーキング・ツリー内のファイル変更や新規追加ファイルがあるかどうかなど状態を確認する
```
$ git status
```

##### ファイル内の変更を部分的に分けてステージングしたい場合
※[ここ](https://qiita.com/miyohide/items/79ab0ff3b3852289a6be)が分かりやすい

```
$ git add -p
```

##### 新規追加したファイル一括でステージングする
1. 編集されたファイルの一覧が表示される
2. 選択肢の4: add untrackedを選択　※ 4でenter
3. 新規ファイルの一覧が表示されるので、すべての新規ファイルを選択するため*でenter
4. qで操作終了

```
$ git add -i

           staged     unstaged path
  1:    unchanged      +11/-11 app/controllers/hoge_controller.rb
  2:    unchanged       +25/-1 app/views/hoge/hoge.erb

*** Commands ***
  1: status       2: update       3: revert       4: add untracked
  5: patch        6: diff         7: quit         8: help
What now> 4
  1: app/models/hoge.rb
  2: db/migrate/20190413063115_create_hoge.rb
  3: test/models/hoge_test.rb
Add untracked>> *
added 4 paths

*** Commands ***
  1: status       2: update       3: revert       4: add untracked
  5: patch        6: diff         7: quit         8: help
What now> q
Bye.
```

##### ブランチを新しく作成して、そのブランチに切り替える
```
$ git checkout -b ブランチ名 (ブランチ名の例：updating-usersなど)
```

##### コミット履歴を確認する(コミットログを確認できる)
```
$ git log
↓
確認後は"q"で抜け出すことができる。
```

##### 特定のファイルのコミット変更履歴を確認する(コミットログを確認できる) ※-pオプションで差分を確認できる。
```
$ git log ファイルパス
例)
$ git log db/schema.rb
↓
確認後は"q"で抜け出すことができる。
```

##### 特定のファイルのみ前のコミットの状態に戻す
```
$ git checkout コミットログ ファイルパス
例)
$ git checkout acba1bb2fdf08f6ba6217763e891097f743a459e db/schema.rb
```

##### ファイルを編集していてエラーなどが続き、最新のコミットからやり直したい場合
```
$ git add -A
↓
$ git checkout ブランチ名(作業中) -f
```
※追加されたファイルは、一度ステージングしてあげる必要があるため、上記コマンドになる。

##### ファイルを編集していてエラーなどが続き、途中のコミットからやり直したい場合
```
$ git reset --hard コミットログ
```
※リモートも戻す場合は、

```
$ git push -f origin HEAD:ブランチ名
```

##### 直前のコミットを取り消す
```
$ git reset --hard HEAD^
```

##### 直前のコミット取り消しを取り消す
```
$ git reflog
↓
$ git reset --hard HEAD@{1}
```

##### pullについて [こちら参照](https://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921)
```
pull = fetch + merge origin/master
```

##### mergeを取り消す
```
$ git reset --hard ORIG_HEAD
```

##### 補足
```
$ git reset --hard
$ git reset --mixed
$ git reset --soft
```
の違いについては[こちら](https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)

```
$ git add
```
のオプションや詳細は[こちら](http://yukiten.com/blog/info-tec/git-git-add/#content_1_11)

その他参考は
[Git 公式サイト](https://git-scm.com/)
[限定公開 Qiita記事](https://qiita.com/capybara1229/private/4f93016f23f25b8d38c4)
AMP for WordPress プラグインの Paired （ペア）モードでCSSが効かなくて崩れた時に設定した項目メモ

[AMP for WordPress](https://wordpress.org/plugins/amp/)プラグインが、
正式版1.0になったそうで、試しにPaired Mode（ペア モード）にしてみた。
ちなみに今適応しているWordPressのテーマは [Twenty Nineteen](https://ja.wordpress.org/themes/twentynineteen/)。


モードについては以下を参照。
[WordPressをAMP対応するプラグインの正式版 v1.0 が公開。統一されたデザインと機能のAMPページを実現(海外SEO情報ブログ)](https://www.suzukikenichi.com/blog/official-amp-plugin-for-wordpress-v-1-0-is-available-now/)

すると、CSS（見た目）が効いてない。なんで！？
<img width="435" alt="AMP for WordPressでCSSが効いていない" src="https://qiita-image-store.s3.amazonaws.com/0/40940/66388b47-d9a8-e5fc-24df-ca2cdaef156b.png">

[公式ドキュメント](https://test-wordpress-amp.pantheonsite.io/)を読んでも分からない。

あちこちググって、ようやく、Githubのページを見つけた。
https://github.com/ampproject/amp-wp

それによると...

>[Switch from Classic to Paired or Native modes in AMP settings screen. You may need to disable the admin bar in AMP if your theme has a larger amount of CSS.](https://github.com/ampproject/amp-wp#switch-from-classic-to-paired-or-native-modes-in-amp-settings-screen-you-may-need-to-disable-the-admin-bar-in-amp-if-your-theme-has-a-larger-amount-of-css)

Google翻訳：AMP設定画面でクラシックモードからペアモードまたはネイティブモードに切り替えます。テーマのCSSの量が多い場合は、AMPの管理バーを無効にする必要があります。

つまり、AMPメニューのGeneralで、「Disable admin bar on AMP pages」にチェックを入れればいいらしい。

<img width="1205" alt="AMP設定画面" src="https://qiita-image-store.s3.amazonaws.com/0/40940/dd310eca-62d1-6cfd-fe3e-022826ff6a7c.png">

保存して、サイトをチェックしたら、ちゃんとできてた！
<img width="409" alt="Twenty NineteenのAMPペアモードの見栄え" src="https://qiita-image-store.s3.amazonaws.com/0/40940/fcd8d76f-85cd-e01c-881b-4324bd0ff3f5.png">
logrotate を使って S3 にログデータをダンプする

AWS CLI がある事が前提
大体 EC2 インスタンスにロール持たせていると思う

次のスニペットをよしなに(※)貼る
-----------------------

```
    # custom configuration for s3 dump
    # make sure it uses expected suffix format
    # Include hour to avoid having overwrite
    dateext
    dateformat -%Y%m%d%H
    compress

    # unlike postrotate, lastaction will run **after the compress**
    lastaction
        dateext="-$(date +%Y%m%d%H)"
        bucket="bucket/prefix"

        for filepath in /path/to/file /path/to/another/file
        do
          filename=$(basename $filepath)
          [ -r ${filepath}${dateext}.gz ] && aws s3 cp ${filepath}${dateext}.gz s3://${bucket}/${filename}${dateext}.gz >/dev/null || true
        done
    endscript
```

(※) ... ubuntu ベースの AMI を使ったら `/etc/logrotate.d` の中に `syslog` とか `nginx` とかあったので、そこら辺によしなに
(※) ... 毎回 compress が必要かというと、そうでもない場合も多いと思うので、そこら辺よしなに
(※) ... ファイルパスの指定とか、S3 のパスの指定とか、そこら辺よしなに

lastaction
----------

logrotate を調べると `postrotate` がよく出てくるけど、`postrotate` はファイルを圧縮する前に実行されてしまう。
`lastaction` はファイル圧縮後に実行されるので、ディスクスペースの無駄な消費を避けるためにこちらを使っている。

Reference
---------

助けてもらった記事
Logrotate の基礎について <https://qiita.com/zom/items/c72c7bac63462225971b#世代管理をする>
lastaction について <https://stackoverflow.com/a/12072083>
@yukihiro_matz 2019年には始めたい。初心者のためのRuby！特徴は？就職は？どんなプログラミング言語？ Ruby の父 #まつもとゆきひろ さんの言葉。

# Rubyは楽しい言語

楽しさ大事。

Ruby経験3年の@yumainauraの感想は「書いてて楽しい！」。


---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/099b4c5d-7266-0f82-6328-c5b4f686932e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/10f409de-6f00-d578-8e8e-0cb7ce8b4d78.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c205de8f-5891-fcb3-3c44-6939d58a6456.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/74640eb0-4d01-d70a-1f59-8a63d4a1e656.png)

# 実は、初心者向け言語ではない


「大人の言語」ということはよく聞いた。

と言っても、大阪のWeb開発の人と話した限定的な経験を元にだけど。


---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0ae8fa67-ce1d-15d7-b397-0a93609d9a72.png)

# プログラミングのエッセンスに集中できる設計


プログラミングの本質的でないことを極力削ぎ落とすようにできている。

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/38dca0bf-34c3-e0a0-f686-8652532c52bf.png)

# お金を稼げるの？就職転職できるの？


まつもとさんは僕らの幸福を願ってくれているらしい。

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/598c27a2-14d3-99c2-6983-6699d185ffa8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0e17aee9-b90a-d410-ffe6-a38bae8319f8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/154ee283-354f-15d2-5cb1-d023ae8a500c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a4e79521-aaaa-3718-fe44-7328ba16072c.png)

# 出展


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/93a8e594-ad78-5160-3554-f318637bbb01.png)

[プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ) | 伊藤 淳一 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GCPでの隔離環境

GCP Compute Engineでインシデントが起きた時の対応メモ


#準備
ログはbigqueryに送っておくと幸せになれる。標準機能だと一部のログは7日/30日がStackdriver Loggingの保持期間。
インシデントが起きたあとでログをbigqueryに送るのは面倒です・・・

ログをローカルにDLする方法

```
yumano$ gcloud logging read [フィルタ] --format=json --limit=100000 > output.json 
```


#初動
スナップショットを取る　**絶対だぞ！忘れるなよ！！**

#調査用隔離VPCを作成
 ingress ssh src:アクセス元IPアドレス port:22
 egress all deny 

ブラウザSSHを利用する場合、接続元はGCPのIPアドレスになるのですよ。
SSH KEYが手元にある場合は普通に自分のIPアドレスを設定すればよいです。

#調査
ログを取得する。一括して抜き取るにはこれが便利
https://github.com/Recruit-CSIRT/LinuxTriage

```
$ sudo bash rcsirt-linux_triage.sh
```
ブラウザSSHを利用する場合、オプションからファイルのアップロード/ダウンロードできるので便利。
ダウンロードがうまくできない場合はACLをちゃんと見直そう！ 
特にフォレンジック対象からファイルを持ってくる時はrootで操作していることが多いので、
chown yumano:yumano evidence.zip とかやっとく必要があり、

#GCPのIPを確認
公開SPFを用いて確認
https://support.google.com/a/answer/60764?hl=ja
Cognosで単数指定のテキストのプロンプトにカンマ区切りで入力した値で複数絞込みを行う

#はじめに
単数選択で指定しているテキストのプロンプトにカンマ区切りで値を入力し、複数の項目で絞り込むためのフィルタ式の紹介です。

IBM Supportから公開されている文書にすべて記載されているのですが、よくある要件であることやクエリマクロの使用例として改めて紹介したいと思います。
[How to filter a report using a comma-separated string entered in a text box](http://www-01.ibm.com/support/docview.wss?uid=swg21342203)

#実行結果
やりたいことは次の通りです。
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/ba8995e2-9a63-2ae9-ca5d-24064c0c1d53.jpeg)

テキストのプロンプトにカンマ区切りで入力した、「991」と「992」の製品ラインコードでリストが見事に絞り込まれています、

#実現方法
リストのクエリーに追加するフィルター式の記述方法が肝となります。
2つのパターンで紹介されているので、ここでも2パターン紹介します。

※検証時のレポートでは下記のように指定しています。環境に合わせて置換してください。
フィルター対象のデータアイテム = [製品ラインコード]
テキストのプロンプトのパラメータ名 = pLineCD

###パターン１

```html:フィルター式_パターン１
[製品ラインコード] in (#csv( split(',', prompt('pLineCD', 'token') ) )#)
```

###パターン２

```html:フィルター式_パターン２
((#sq(prompt('pLineCD', 'token', 'testValue'))# <> 'testValue') and 
[製品ライン コード] in (#csv( split(',', substitute(' ','', prompt('pLineCD', 'token')) ) )#) ) 
or ((#sq(prompt('pLineCD', 'token', 'testValue'))# = 'testValue'))
```

クエリマクロを使用してプロンプトから渡された値をカンマで区切って式に渡しているのがポイントです。
プロンプトが単数で指定されているのに対して、フィルター式内では、IN句を使って複数絞込みで受けているところもポイントです。


##最後に
パターン１とパターン２が紹介されていますが、パターン１の式だと","の後に空白スペースが入っているとレポート実行エラーとなってしまいます。
入力したい値にもよりますが個人的にはパターン２がオススメかとも思います。
MySQL で直近変更のあったテーブルを確認する

```sql
SELECT
  TABLE_SCHEMA,
  TABLE_NAME,
  UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = '{{ database_name }}'
ORDER BY UPDATE_TIME DESC;
```

- `TABLE_SCHEMA` データベースの事


## Reference

ベースの SQL を見つけた場所
<https://stackoverflow.com/a/307488>
RTMPdumpでプロバイダ変更などした時に出るエラーとその対処法

###地域が変更されているので申請する。

先日NURO光に変更したタイミングでRTMPdumpが下記のようなエラーを返す様になった。
ググると地域判定がどーたらといったページがいくつか見られたので[https://radiko.jp/contact3](https://radiko.jp/contact3)に行ってみると東京都で判定されていた。（実際は大阪府）
正しい地域をRadikoに申請すると１〜３日ほどで正しい地域に修正してもらえるそうです。

`RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: No application or playpath in URL!
Connecting ...
WARNING: Trying different position for server digest!
INFO: Connected...
ERROR: rtmp server sent error
ERROR: rtmp server requested close`
ubuntuでc言語(x86_64用)のクロスコンパイラを作ろう(mintも可)

#ubuntuでc言語のクロスコンパイラを作ろう
普段はcentosかfreebsdを使用しているのですが、osを自作するにあたりクロスコンパイラが必要になったので、ubuntuも使うことにしました。クロスコンパイラの構築に思いの外時間がかかったのでここに備忘録を残します。あと、rootになっておいてください。

#1.必要なソースコードやパッケージ
```bash:パッケージをインストール
sudo apt install -y 
```
>1.gccのソースコード(https://ftp.gnu.org/gnu/gcc/)
2.binutilsのソースコード(https://ftp.gnu.org/gnu/binutils/)
3.build-essential[makeコマンドをインストール]
4.bison(https://ftp.gnu.org/gnu/bison/)
5.flex(https://github.com/westes/flex/releases)
6.libgmp3-dev(https://ftp.gnu.org/gnu/gmp/)
7.libmpc-dev(https://ftp.gnu.org/gnu/mpc/)
8.libmpfr-dev(https://ftp.gnu.org/gnu/mpfr/)
9.texinfo(https://ftp.gnu.org/gnu/texinfo/)
10.libcloog-isl-dev(https://www.cloog.org)?
11.libisl-dev(http://isl.gforge.inria.fr)
12.gcc(パッケージのやつ)
13.g++(パッケージのやつ)

さすがubuntu。必要なツールのパッケージは殆ど揃ってますね。
ubuntuは1,2以外はすべてパッケージが用意されています(1,2は環境にチューニングされていると困るので自分でビルドします)。以上に記された名前のパッケージをインストールしてください。括弧はソースコードのURLを示しています。パッケージが無いときはこちらからソースコードをダウンロードしてビルド([1]tar -xvfで解凍[2]./configureをソースコードのディレクトリで実行[3]makeコマンドを実行[4]make installコマンドを実行)してください。

#2. 環境変数を設定
```bash:環境変数を設定
export PREFIX="/usr/local"
export TARGET=x86_64-elf
export PATH=$PATH:$PREFIX/bin
```
PREFIX(コンパイラを呼び出すときに使用するアドレス(コンパイラが置かれるアドレス))
TARGET(コンパイラのバイナリを処理させる環境)
PATH(コンパイラのバイナリが置かれる場所。PATH:を忘れると変数が初期化されてしまうので気をつけてください)
>TARGETに指定できる環境(他にもあります)
x86_64 : x86_64-elf
i386   : i386-elf
i686   : i686-elf
aarch  : aarch64-elf
powerpc: powerpc-elf

#3.binutilsのビルド
```bash:binutilsのビルド
mv binutils-x.y.z /usr/local(PREFIXに指定したアドレス)

cd $PREFIX
 
mkdir build-binutils
cd build-binutils
../binutils-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
make
make install
```

#4.gccのビルド
```bash:gccのビルド
mv gcc-x.y.z /usr/local(PREFIXに指定したアドレス)

cd $PREFIX
 
mkdir build-gcc
cd build-gcc
../gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers 
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc
```

#5.クロスコンパイラの呼び出し
```bash:(例)クロスコンパイラを呼び出し
x86_64-elf-gcc 
```
TARGETがi386のときはi386-elf-gccとなります。
先に設定しているので大方大丈夫だと思いますが上記のように"TARGET"+-gccの形で呼び出せないときは、

```bash:PATHにクロスコンパイラのコマンドのアドレスを追加
export PATH=$PATH:$PREFIX/bin
```

#6.最後に
これでクロスコンパイラは用意できました。一般ヘッダはlinuxやbsdの場合はダウンロード出来ます。

#8.参考文献
[OSdev.org](https://wiki.osdev.org/GCC_Cross-Compiler)(一部内容を変更してお送りしました。)

#ちょっとmemo
1.-Ttext org(それぞれ出力ファイルの bss、 data、 text セグメント に対して org を開始アドレスにする。 org は 16 進の整数でなければならない。)
2.-nostdlib
gdriveでアカウントを変更する

###jsonファイルを削除してアカウント認証をやり直す。

見出しの通り。乱暴ですが
`rm -rf ~/.gdrive/token_v2.json`
で、削除します。

その後に
`gdrive list`
などで再認証を求められるので、新しいアカウントで認証します。
状態フィードバック制御

これはAmusementCreators AdventCalendar2018の２５日目の記事です。
AmusementCreatorsのkerochanです。今回は、前回の記事([システムと状態方程式](https://qiita.com/kerochan/items/aaca94cd31719f04b20a))の続きとしてシステムの制御のための最も基本的な方法である、状態フィードバックについて話します。

#はじめに
この記事は前回の記事の続きなので、前回の記事を読まないとなんのこっちゃな部分が出てくると思います。そのため、前回の記事を読むことをお勧めします。
さて、前回の記事ではシステムを状態方程式を用いて記述し、その安定性について説明しました。また、可制御性と可観測性という概念についても説明し、それと安定性との関連も同時に示しました。
今回の記事ではその可制御性と可観測性に関連した事項でありかつ制御の最も基本的な方法でもある状態フィードバックについて説明します。

#状態フィードバックと可制御性
##状態フィードバック
過去の記事でも説明したのですが、システムが安定して動作するためには制御することは不可欠です。制御なしでは、どんどん速度の増加する自動車や飛行中常に上下に振動する飛行機などが作られてしまう可能性があります。このような不安定な状態を解消するために制御は必要不可欠であることはわかると思います。
その制御を実現させるための方法の１つに**状態フィードバック**があります。これは、簡潔に言えば**状態変数を入力として利用する**、という制御方法です。この方法は、伝達関数の表現でのフィードバック制御と似た方法です。フィードバック制御が最も基本的な制御方法であることがうかがえると思います。ただし、状態フィードバックを行うためにはある条件が必要となりますがこれは次項で詳しく説明します。
状態フィードバック制御を施したシステムの状態変数線図は下図のようになります。ただし、${\bf b}$はn次のベクトルであるとします。
![feedback.png](https://qiita-image-store.s3.amazonaws.com/0/214300/5009d1d4-4e96-f49d-4711-4f3b23a607b2.png)
上図を見ると、確かに状態変数が入力に用いられいます。上図において${\bf k}$を**フィードバックゲイン**と言い、なお、フィードバックゲインは行ベクトルで、${\bf k} = (k\_1, k\_2, \cdots, k\_n)$です。PID制御における比例器のような見た目をしています。このフィードバックゲインの値によってシステムの安定性が大きく変化します。
上図の数式を見るとフィードバックゲインをかけたシステム全体のシステム行列が$A + {\bf bk}$(${bk}$はn*nの行列になります)となり、**フィードバックゲインがシステム行列に影響している**ことがわかります。このことはすなわち、フィードバックゲインの値によってシステム行列の固有値が変化することと同じです。前回の記事で、システムの安定性はシステム行列の固有値の実部によって決まると書きましたが、このことから固有値が変化すればシステムの安定性も変化することがわかります。つまり、このフィードバックゲインの値によってシステムの安定性が大きく変化する理由は、**フィードバックゲインの値がシステム行列の固有値を変化させる**からです。
このフィードバックゲインは制御システムの設計者が自由に決められるため、**必ずシステムを安定させることができる**ということがわかります。
##状態フィードバックが可能な条件
前項の初めに、フィードバック制御が可能な(正確には意味をなす)条件がある、と書きましたがこの条件がまさに可制御であるということです。その理由は、入力がシステムに影響しないということは、そもそも状態変数を入力として利用することで制御を行うフィードバック制御はそもそも意味をなさないからです。
もう少し詳しく説明します。前項で示した図のシステム行列$A - {\bf bk}$(この行列の変換を$\tilde{A\_k}$とします)の${\bf bk}$に注目してみます。ただし、${\bf b} = (b\_1, b\_2, \cdots , b\_n)$の列ベクトルとします。
実は対角正準計形式へ変換する際、$A - {\bf bk}$の変換途中で${\bf \tilde{b}}$を含む項($A$と行、列の数が同じ行列)が出てきます。もしもシステムが可制御でない場合、その行列に0だけが並ぶ行ができます。最終的にはこの行列と元のシステムの行列$A$との和が$\tilde{A\_k}$となるため、可制御でないということは**フィードバック制御前のシステム行列の固有値がフィードバック制御後もそのまま現れる**、すなわち制御が意味を成さないモードが存在するということになります(あくまでも意味をなさないだけで、フィードバック制御自体は可能)。
このことを図で表すと下図のようになります。
![feedback_controlable.png](https://qiita-image-store.s3.amazonaws.com/0/214300/d60a55a2-ceef-5300-7e9f-309298c23613.png)
まとめると、**フィードバック制御が意味を成す条件はシステムが可制御である**ということが言えます。
#まとめ
この記事では、状態フィードバック制御について説明してきました。まとめとして、次の２つを書いておきます。

* 状態変数を入力として利用する、状態フィードバック制御によってシステムの安定性を変化させられる
* 状態フィードバック制御は、システムが可制御でないと意味をなさない
転職用ポートフォリオを作るまでの道のり【サイトのコンセプトを考える】

#はじめに
転職用ポートフォリオ（Webサービス）を初めて作るまでの手順を記事にします。記事を書く目的は、SNSの反応によって得られるモチベーション維持と、文書化することで、自分のやってる作業を客観視するためです。

#参考サイト
下記サイトの手順をそのまま実行します。

「オリジナルサイトを作ろう／チームラボオンラインスキルアップ課題」
https://team-lab.github.io/skillup/3/1.html

# Webサービス完成までにやること
##オリジナルサイトを作ろう
* 1.　画面仕様書、スケジュールを作ってみる
* 2.　テストとは
* 3.　単体テストを書いてみる
* 4.　IDEを使ってみる
* 5.　バージョン管理をしてみる
* 6. セキュリティ対策をしてみる

#今日やったこと

* 画面仕様書、スケジュールを作ってみよう
    * 作りたいサイトのコンセプトを考える

>まずは自分で作りたいサイトのコンセプトを考えましょう！なんでも良いです。誰かが何かに困っているなら、その人のためのサイトでも良いでしょう。不便なことがあるなら、それを解決するサイトでも良いでしょう。誰が、誰に、どんな価値を提供するサイトか？そのサイトの成功の定義は何か？を明確にしましょう。複雑になりますので、お金がそのサイトで儲かるかどうかは、一旦この時点で考える必要はありません。この時は、資料に落とす必要はありません。紙に手書きでもいいので書き出し考えてみましょう。

##で、やったこと
**身近な人が困ったり、不便に感じていることは？**

* ①(雇用主)スタッフ探し
	* 給与、勤務場所（通勤）、社会的地位、仕事内容、と理由は多岐にわたる
		* 社長やスタッフのSNS発信、本を書く
　	　　* お金をかけない福利厚生（最新技術を使える等）でPR
		*（入社後は）経営者の人徳や人柄
		* 個人の紹介。会社の規模に関係なく、良い人材を取れる可能性がある
		* 
* ②飲食店や宿のドタキャン
	* ネット予約の弊害。顔が見えない相手はドタキャンしやすい（就職面談等でも同様）
		* リザベーションデポジット（飲食店HPに機能追加）
		* 実名制の飲食店予約サービス（Facebookと連動、匿名よりも割引率が高い）
* ③本や映画の感想を語り、他者からの反応を得たい
	* 本は1人で消費する娯楽だが、終わった後は感想をシェアしたり余韻を愉しみたい
		* Twitter(ﾊｯｼｭﾀｸﾞ)やブログで発信
　　　　* 余韻を残したまま参加する交流会（カフェとか）
* ④住居用の家賃が高い
	* 現役を引退して年金生活。貯金も上限があるので、固定を減らしたい。
		* 高齢者専門のシェアハウス //きついか？
		* 地方移住
* ⑤車の維持費が高い
	* 地方は電車の1駅区間が長い。国道沿いに店が集中してる場合もあり、車を手放せない
		* シェアエコノミー
	　	* 買い物、運転代行
		* 週1からの家政婦（高齢者と家政婦のマッチング）
* ⑥子育てがしんどい
	* 手抜きできない（社会の空気感）
	* 「情報弱者になりたくない」と子育ての情報を集めた結果、方向性を決めきれない
		* デュアル生活（都市&地方、都市&海外）
		 **世間の空気や価値観は、場所に大きく左右される。
　　　　　  空気が変わるには時間がかかるので、自ら場所を変える(週1からでも）**
* ⑦出会いがない
	* 社会に出ると自分で動かないと出会いがない。
	* かといって出会い系や相席居酒屋に来るような異性とは付き合いたくない(わがまま）
		* 硬派な出会い系サービス
		* 外国人を対象に含めた結婚相談サービス
* ⑧旅行に行くきっかけ
	* ハワイ等のメジャーな地域を除き、海外旅行は最初の1歩目のハードルが高い
	* 仕事を除けば、 同じ国に何度も訪れる動機として強いのは「人」。
	　　* 海外在住者によるSNS発信（ブログやTwitter）
		* マッチングサービス(トラベロコ）
　　　　　上記は現役在住者限定。帰国者も参加できるサービスしてはどうか？
* ⑨趣味を再開したい（仮にバンド）
	* 周囲の人間を見る限り、40を過ぎたあたりから人は趣味に目覚めている
	* 気の合う友人達とやりたいが、皆が同時に音楽に目覚めるとは限らない。それぞれ事情もある
		* 音楽系マッチング（演奏動画をUP／スキルや1ステージ辺りの単価提示 /無料も可）
* ⑩職業の選り好みが進んでいる
	* 情報社会の功罪。Youtube等でノウハウが共有された結果、専門職に対する尊敬が薄れている。
	* 特定の職業(Webエンジニアや公務員）に関心が偏り、その他の職種に人が集まらない
		* 肉体労働やサービス業の地位を高める。地道なブランディング活動
		* 地道なSNSの情報発信が一番の近道？
* ⑪(主に関東圏)人間関係が希薄
	* 関東の傾向として、社内で他人のプライバシーを探らない、というものがある
	* しがらみがなく自分の好きなことに時間を使えるが、良好な人間関係もない。自由は孤独。
		* Twitterやオフ会、ネットで趣味趣向の近い人間と知り合う
		* 都心と地方を行き来する
* ⑫満員電車に乗りたくない
	* 会社員の永遠のテーマ、時間と体力が奪われ、日本人の幸福度を下げている一番の要因（？）
		* （可能であれば）友人の家に居候
		* シェアハウスに住む
		* リモートワーク可能な会社に転職する
		* （経済的に問題なければ）職場近くに引越し

#おわり
次回は今回書き出した情報を元に、サイトに必要な機能を考えます。

**つづく**
MacからRaspberry Pi3をSSHで繋いで、Bluetoothの情報も拾いたい

# MacからRaspberry Pi3にSSHで接続する
条件：MacとRaspberry Pi3がローカルネットワーク上に存在すること

## Raspberry Pi3でIPアドレスを確認する
RaspberryPiのコンソールで以下のコマンドを実行する。
`ifconfig`
IPアドレスが表示されます。

## MacからSSHで接続する
Macのターミナルで以下のコマンドを実行する。
`ssh pi@Raspberry PiのIPアドレス`
パスワードが聞かれるかと思いますので、初期は以下のパスワードとなります。
`raspberry`

これで、MacからSSHを利用して、Raspberry Pi3へ接続ができます。

## 注意
固定のIPアドレスにしていないと接続が切れやすいです。

# Raspberry Pi3でBluetoothの一覧を取得する
## bluezを取得する
以下のコマンドを実行する。
`wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.45.tar.xz`
## ファイルの解凍
以下のコマンドを実行する。
`xz -dv bluez-5.45.tar.xz
tar -xf bluez-5.45.tar
cd bluez-5.45
`
## Bluetoothを取得する
以下のコマンドを実行する。
`hcitool lescan`

または

`bluetoothctl -a
[bluetooth] scan on
[bluetooth] discoverable on`

これで、Bluetoothの情報が取得できました。
Node.js + Express4.xでejs-localsモジュールが使えなかった


# エラー発生
Webアプリケーションを作成中にモジュールエラーが出ました。原因は[ejs-locals](https://github.com/RandomEtc/ejs-locals)モジュールでした。

# 原因
ejs-localsを使えるのはExpress3.xまでとのこと。
私が使っているのはExpress4.16.0なので、そりゃ使えない。

# 解決法
Express4.xでも使える[ejs-mate](https://github.com/JacksonTian/ejs-mate)があるのでこれを使えば良さそう。
使い方もejs-localsと全く同じだと思います。
ReactNative Firebase Analytics

https://qiita.com/koki_cheese/items/e9f165563b3dadb0da03

Google Analytics for Firebase


# 予約イベント
https://rnfirebase.io/docs/v5.x.x/analytics/reserved-events
```
javascript const reserved = [ 'app_clear_data', 'app_uninstall', 'app_update', 'error', 'first_open', 'first_visit', 'first_open_time', 'first_visit_time', 'in_app_purchase', 'notification_dismiss', 'notification_foreground', 'notification_open', 'notification_receive', 'os_update', 'session_start', 'screen_view', 'user_engagement', 'ad_impression', 'ad_click', 'ad_query', 'ad_exposure', 'adunit_exposure', 'ad_activeiew', ];
```

# Funnel設定
https://blog.theodo.fr/2018/01/building-google-analytics-funnel-firebase-react-native/

# Reference
https://rnfirebase.io/docs/v5.x.x/analytics/reference/analytics

##  logEvent(event, params)
Log a custom event with optional params.
Note: up to 100 characters is the maximum character length supported for event parameters.

- event(string): 
- params(object):


## setAnalyticsCollectionEnabled(enabled)
If true, allows the device to collect analytical data and send it to Firebase.
- enabled: false

## setCurrentScreen(screenName, screenClassOverride)
- screenName: 'PoiScreen'
- screenClassOverride: -

## setMinimumSessionDuration(miliseconds) 
Sets the minimum engagement time required before starting a session. The default value is 10000 (10 seconds).
- miliseconds: 5000

## setSessionTimeoutDuration(miliseconds) 
Sets the duration of inactivity that terminates the current session. The default value is 1800000 (30 minutes).
- miliseconds: 1800000 

## setUserId(id) 
- id: RECID

## setUserProperty(name, value)
ユーザー登録ができたら追加

## setUserProperties(fieldMapping) 
ユーザー登録ができたら追加
tcpdumpで異常な程パケットロスする

#症状
パケットキャプチャしたところ

```
1 packet captured
12897 packets received by filter
12896 packets dropped by kernel
```


最初の一つ以外全部ドロップ

さらに、ctrl + c を押してもなかなか終了しない

#原因
__tcpdumpが動作しているマシンでDNS解決ができなくなっていたのが原因__

tcpdumpはデフォルトで名前解決を行う
最初の一つのパケットを受信し
名前解決を行おうとするが、成否のDNS応答が帰ってこず、その後のパケットを処理できなかった

と、思われる。
自分は名前解決なしのオプションをつけても解決しませんでした（何故か）
ので、PCから利用できないDNSサーバの設定を削除すると治りました
STU48が某個人配信プラットフォームで強いって言われてるけど・・・ その２の３

STU48が某個人配信プラットフォームで強いって言われてるけど・・・ その２の１は[こちら](https://qiita.com/iowanman/items/ef5eb399c8710dbcd1dd)
[その２の２](https://qiita.com/iowanman/items/ef5eb399c8710dbcd1dd)
STU48イベント中の僕の妄想により観測されたデータを元に集計しています。
注意 このデータは僕の妄想から構成されています。信じるか信じないかはあなた次第

#目的
STU48のイベントがありました。
彼女達に使われたポイントは3000万円(独自集計)
これを誰がぶっこんだか興味があるので解析します。

具体的には、上位陣に対して課金額を基にして、以下のような解析をここではします。

1.STU48のファンではなかった方々がどれくらいいるのか
2.上位陣のファンではなかったハズの方々がどれくらいポイントを入れたのか

です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/03640f2d-5612-1f89-a127-bed787518525.png)

#推し数について

推し数とは僕が勝手に定義した数字です。
ここでは、視聴者がイベント前の約一ヶ月間で、STU48メンバーの誰対して最も有料ギフトを投入しているかを調査し、そのポイントの多い順に一推し 2推し ３推し・・・を見つけます。
推し順に、推し数として、1/(4^j) [j=0,1,2,3,...] = 1, 0.25, 0.0625, 0.015625 という評価関数をを推し数としてます。
ただし、一推しに対してですら課金額が１００円以下の方は無視しています。

このような推し数を持つ視聴者が誰に対してお金払ったのかを調べます。

##計算例
以下のような課金額の行動をイベント前にした視聴者A-Dがいたとします。

||土路生優里 |福田朱里 |由良朱合 |中村舞 |沖侑果  |
|:--: |--: |--: |--: |--: |--: |
|視聴者A | 100000   |  0  |  2000  | 0   |0    |
|視聴者B | 0   |  5000  |  2000  | 0   |1000    |
|視聴者C | 0   |  0  |  0  | 0   |10000   |
|視聴者D | 0   |  0  |  10  | 0   |80    |

計算された推し数は以下のような感じです。

| |土路生優里 |福田朱里 |由良朱合 |中村舞 |沖侑果  |
|:--: |--: |--: |--: |--: |--: |
|視聴者A | 1   |  0  |  0.25  | 0   |0    |
|視聴者B | 0   |  1  |  0.25  | 0   |0.0625   |
|視聴者C | 0   |  0  |  0  | 0   |1  |
|視聴者D | 0   |  0  |  0 | 0   |0    |

事前に計算した、推し数のメンバーごとの合計の結果を示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/4d1c29a2-b8f4-c626-2bb6-e64e1735986b.png)

その２の４でも同じような表を作ったのですが、今村美月さん人気ありすぎです。
とはいえ、No way manのオーディションによるご祝儀の影響が多分に含まれていると思われます。

#計算結果
上位５人の計算結果を示します。緑色はother、ピンクは土路生優里さんの結果の上位の方、薄黄色は福田朱里さんの上位の方です。
otherは過去一ヶ月間に一度も100円以上の課金をしなかった方々です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/4350b1ee-591b-55eb-5235-e5e473ae9977.png)

otherはそもそもSTU48のファンなのか、さらに誰のファンなのか一切不明な方々です。やはり、イベントとなると普段課金しない（もしくはSTUファンではない）方々も顔を出すのが面白いですね。
土路生優里さんと福田朱里さんを比較すると、二人を応援したであろう方々がの大勢が違うことが、ものすごく明らかです。兵藤葵さん、森香穂さんのファンは福田朱里さんを明らかに応援してますが、土路生優里さんのことはあまり応援してないようです。

これを一番知りたかった！
めっちゃ下衆い！
まじサイコー

#考察
僕の独断と偏見で面白い傾向を示したメンバーのファンの傾向をピックアップしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/3525e870-9a8f-e596-78c3-9f91e514903c.png)


この下衆いグラフから読み取れることは、

1.兵藤葵さんのファンは福田朱里さんを最も応援した
2.管原早紀さんのファンは福田朱里さんを応援した傾向がある
3.石田千穂さんのファンは土路生優里さんと中村舞さんを応援した
4.岩田陽菜さんのファンは土路生優里さんを最も応援した
5.森香穂さんのファンは福田朱里さんだけ応援した
6.田中皓子さんのファンは土路生優里さんだけを応援した

などなど。ゲスい。なんともゲスい。そして僕が一番知りたかったこと。

以下のヒートマップはseabornのヒートマップで作ったやつで、縦軸と横軸はother先輩のあるなしで理解してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/becb637c-05d8-980c-520f-881672bda7b5.png)

イベント中にどのメンバーから課金があったのは一目瞭然です。
基本的には、前月一ヶ月の行動と同じ行動をした人が最も課金をつかっています。当然ですよね。無料の星は推し以外に投げても、課金はやっぱり一推しが基本ですよね。
前述のように、今村美月さんと門脇実優菜さんについては、ご祝儀があったためあまりデータ的にあてになりません。なりませんが、明らかに今村美月さんのファンは土路生優里さんを応援した跡があります。

#まとめ
ゲスい解析で、STU48のファンと思われる方々のイベント時の行動は見えても、その理由をデータは教えてはくれません。

アイドル様それぞれの特性（例えば 顔 性格 愛嬌 歌 ダンス 身長 特技 ヲタク性 などなど）と、ファンの共通性からそれらを考察する必要があります。
それをここでやると、めっちゃ怒られそうなので、やりません。
Nginx上のLaravel5.5にWordpressを共存させたった話

Webサイトのテキスト修正をエンジニアが対応するのって開発工数=費用の無駄だと思うんです。
対応したいエンジニアもそんないないはず。

そんなことで今回は
### 「Laravelの静的ページのみWordpressに移行しましたよ」
というお話。

# 環境

* Amazon Linux
* Nginx
* PHP 7
* Laravel 5.5

# ポイント
* WordpressのURLは　/WP/のように下層パスでの出し分けはNG
* Nginxなので「.htaccess」のmod_moduleは使えない
* 入力フォームなども非エンジニアでも作れるようにすること

# 手順
    1. Laravelにwordpressをセットアップ
       →　/var/www/server/publicにwgetコマンドで取得、解凍、ブラウザからセットアップを実施済み
    　　　　　　　　https://hogehoge.jp/wp/wp-login.phpのような形でログイン画面にアクセスできるところまでは飛ばします。

    2.　既存サイトの共通ヘッダー、フッターのHTMLをWordpressのthemeのテーマヘッダー、テーマフッターにコピペ
    
    3. パーマリンク設定は「投稿名」に変更　（https://hogehoge.jp/wp/sample-post/)

    4. 固定ページを新規作成しコンテンツ部分を流し込む(※cssやjs、imageファイル等のパスの調整は別途必要)
    　　　　　　スラッグを既存静的ページのパスに合わせる
    
    5. https://hogehoge.jp/wp/配下で各静的ページの動作確認。
    
    6. Nginxに下記設定を追加し再起動、データベースからサイトURLとWordpressURLを更新 

    7. 指定URLの静的ページのみWordpress化が完了

    8. Wordpressの「WP Mail SMTP」、「WPForms Lite」のプラグインをセットアップ
    
    9. 簡単なレクチャをして任務完了

# ハマりどころ

Wordpressは記事更新時に/wp-json/というリクエストを投げる。
物理フォルダはないので、Nginxが404を返してしまう。

→ Nginxのtry_filesで物理ファイルがない場合の参照先を指定する。

# Nginx設定

Laravelとして管理したい管理画面や動的なページ、認証周り
→　/var/www/server/public/index.php

Wordpressとして管理したい静的なページ
→　/var/www/server/public/wp/index.php

    # wp-adminは末尾に/を必ずつける
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    rewrite /wp-admin/$ /wp-admin/index.php last;
    rewrite /files/$ /index.php last;

    # wp-config.phpはDBの接続情報があるのでアクセス制限する
    location ~* /wp-config.php {
        deny all;
    }

    # wordpressでページを編集する際に必要
    location ~^/wp-json/ {
       try_files $uri $uri/ /wp/index.php?$args&wp-json;
    }
    location ~^/wp-.*/.*(.css|.js|.png|.svg|.gif|.jpg|.jpeg)$ {
        root /var/www/server/public/wp;
    }
    location ~^/wp-.*.php {
        root /var/www/server/public/wp;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass php-upstream;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }

    # Wordpress化したいページ
    location ~^/(|guide/|qa/|introduction/|terms/|privacy/|contact/|builder/)$ {
        root /var/www/server/public/wp;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass php-upstream;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        include       fastcgi_params;
    }

    # Laravelを使いたいページ
    location / {
        root /var/www/server/public;
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
        root /var/www/server/public;
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

Nginxの記述は少し見直しが必要ですが、切り替えも問題なく完了しました。
git revertの-mオプションでコミットメッセージを入力してしまって

`git commit`と同じようにできるかなー、と思って、`git revert -m "commit message" cc64a7e`をやってみた。

結果: エラー。

# 結論
あきらめて`--no-edit`使うか、vimの使い方を覚える。
tensorflowのsoftmax cross entropy関数の実装例

tensorflowを用いたsoftmax cross entropy関数の実装方法は複数あります。
ここでは4つの実装方法についてまとめました。

# 実装
## tf.softmax()

```python
logits = tf.placeholder(tf.float32, [None, 2])
labels = tf.placeholder(tf.float32, [None, 2])

softmax = tf.nn.softmax(logits)
output = -tf.reduce_sum(tf.log(softmax) * labels, axis=1)
```

## tf.nn.softmax_cross_entropy()

```python
logits = tf.placeholder(tf.float32, [None, 2])
labels = tf.placeholder(tf.float32, [None, 2])

output = tf.nn.softmax_cross_entropy_with_logits_v2(
         labels=labels, 
         logits=logits)
```

## tf.nn.sparse_softmax_cross_entropy()

```python
logits = tf.placeholder(tf.float32, [None, 2])
sparse_labels = tf.placeholder(tf.int32, [None])

output = tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits = logits,
        labels = sparse_labels)
```

## tf.one_hot

```python
logits = tf.placeholder(tf.float32, [None, 2])
sparse_labels = tf.placeholder(tf.int32, [None])

softmax = tf.nn.softmax(logits)
one_hot = tf.one_hot(sparse_labels, 2)
output = -tf.reduce_sum(tf.log(softmax) * one_hot, axis=1)
```

# まとめ
```python
import numpy as np
import tensorflow as tf

logits = tf.placeholder(tf.float32, [None, 2])
labels = tf.placeholder(tf.float32, [None, 2])
sparse_labels = tf.placeholder(tf.int32, [None])

# Use softmax function
softmax = tf.nn.softmax(logits)
output1 = -tf.reduce_sum(tf.log(softmax) * labels, axis=1)

# Use softmax_cross_entropy_with_logits function
output2 = tf.nn.softmax_cross_entropy_with_logits_v2(
        labels=labels, 
        logits=logits)

# Use sparse_softmax_cross_entropy_with_logits function
output3 = tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits = logits,
        labels = sparse_labels)

# Use one_hot function
one_hot = tf.one_hot(sparse_labels, 2)
output4 = -tf.reduce_sum(tf.log(softmax) * one_hot, axis=1)

logit = np.array([[0.7, 0.3],
                  [0.2, 0.8]])

label = np.array([[1, 0],
                  [0, 1]])

sparse_label = np.array([0,
                         1])

with tf.Session() as sess:
    y1, y2, y3, y4 = sess.run(
            [output1, output2, output3, output4],
            feed_dict = {logits: logit, 
                         labels: label,
                         sparse_labels: sparse_label
            }
    )

    one_hot = sess.run(one_hot, feed_dict={sparse_labels: sparse_label})

    print("y1:", y1)
    print("y2:", y2)
    print("y3:", y3)
    print("y4:", y4)
```

# Reference
[TensorFlowのクロスエントロピー関数の動作](https://qiita.com/exy81/items/8c9ab6ba8d4a03873d7c)
【プログラミングいろは】調べる、判断する(条件分岐)

[K3Tunnel](https://k3tunnel.com)を使ってプログラミングのいろはを書いています。

K3Tunnelのはじめかたはこちら⇒[【プログラミングいろは】はじめるのはカンタンです](https://qiita.com/drrn/items/96a86e8fa83dc48741cf)

今回は、データを調べて、こんなだったらこれをして、あんなだったらあれをする、というプログラミングをしてみます。

# もし～だったら～(条件文、if文)

調べるには、画面右の｢条件文｣にあるifブロックをつかいます。
K3Tunnelにかぎらず、だいたいのプログラミング言語でif文といえばこれです。
![Screenshot_20181227-151502.png](https://qiita-image-store.s3.amazonaws.com/0/297642/3d6441bf-6f02-db51-a17a-cb7f8279e10a.png)

で、調べたいことは｢条件｣といって、例えば、｢数字が10より大きい｣とか｢名前が"佐藤"だ｣とか。
この条件というのもブロックがあります。
ifブロックと同じ画面右の｢条件文｣を開くと見つかります。ifブロックの下にある、=とかandがかかれてるブロックがそれです。

# かんたんな例(数字が大きい？)

やってみましょう。
数字が10より大きいことを調べるには、こうやります。
![Screenshot_20181227-154737.png](https://qiita-image-store.s3.amazonaws.com/0/297642/3eb1b20a-5254-e2d2-b800-0fb08ed501e0.png)

実行すると、13なので大きいという結果です。
![Screenshot_20181227-154753.png](https://qiita-image-store.s3.amazonaws.com/0/297642/51717966-ece8-5799-a625-1f9198352906.png)

試しに、数字が3だったら…
![Screenshot_20181227-155220.png](https://qiita-image-store.s3.amazonaws.com/0/297642/99301b88-ec1c-0edb-047a-a2f433f2d153.png)
![Screenshot_20181227-155230.png](https://qiita-image-store.s3.amazonaws.com/0/297642/8b70ff94-716e-e7c7-6f6a-1e8389cb74b9.png)
なにも出ません…

# そうじゃなかったら～(else)

で、10より大きくないときさみしいので、結果を出すようにしてみましょう。
プログラミングで、｢そうじゃなかったら｣はelseといいます。

ifブロックの左上に歯車のマークがあるので、ここをタップするとelseとかelseifとか見つかります。
![Screenshot_20181227-160518.png](https://qiita-image-store.s3.amazonaws.com/0/297642/a8ff04fc-7f1a-04d5-05f6-b3d11a366cda.png)


出てきた青い枠のなかの右側にあるifの下にelseを並べましょう。
![Screenshot_20181227-160529.png](https://qiita-image-store.s3.amazonaws.com/0/297642/3ca2f4ce-8360-bff8-6cc3-c7391ac85228.png)

で、そうじゃなかったらどうするか、ブロックを並べて実行してみましょう。
![Screenshot_20181227-160835.png](https://qiita-image-store.s3.amazonaws.com/0/297642/fd42b563-ddd2-3c7f-ffd6-79c22021aafe.png)
![Screenshot_20181227-160843.png](https://qiita-image-store.s3.amazonaws.com/0/297642/9f2b5d99-ed52-8df2-eb94-f9bc091793d0.png)

もう少し工夫してみます。
10より大きいか、同じか、小さいかを調べて見ましょう。
elseifを使います。さっき歯車をタップしてelseを並べたのと同じようにしてif～elseif～elseとします。
で、こんな感じ。
![Screenshot_20181227-161825.png](https://qiita-image-store.s3.amazonaws.com/0/297642/c6c7798a-70f4-e4e9-ed43-f373464891a9.png)
![Screenshot_20181227-161838.png](https://qiita-image-store.s3.amazonaws.com/0/297642/086952dc-be58-c486-f544-829a8f404f23.png)



# ちょっと複雑な例

数字を1から10まで数えながら、偶数か奇数かを調べてみましょう。

繰り返しのプログラミングは、以下でやりました。参考にしてください。
[【プログラミングいろは】5秒前、4、3…繰り返し](https://qiita.com/drrn/items/d33fd604f6dfcd9cf8b7)

こんな感じにブロックを並べて、実行。
![Screenshot_20181227-163338.png](https://qiita-image-store.s3.amazonaws.com/0/297642/f9ef49db-2a7b-5dad-1243-b3ab96fc760a.png)
![Screenshot_20181227-163347.png](https://qiita-image-store.s3.amazonaws.com/0/297642/d45347a8-1ffa-66b4-7929-13dcd2ee8239.png)
argc,argvとは？

今思えばもんのすんごい基本的なことであったが、プログラミング始めた当初よくわからなくて躓いたので後学の為に当時調べたことをメモ書き程度にまとめてみた。
※とはいえ、まだ勉強し始めたばかりなので、間違い箇所等ありましたらご指摘願います。。。

ネットで調べたところ、以下のような記述があった。
argc: "argument count"(引数の個数)の略。
argv: "argument vector"(引数の配列)の略。引数文字列の"配列へのポインタ"のことを指している。

しかし、なんとなくわかりそうで、でもピンとこない。

ということで、イメージは下の感じ
「hogehoge」というプロクラムを実行するときは

"hogehoge"

を書くだけで実行された。
しかし、このときに

"hogehoge abcde aiueo"

のように空白で区切り、文字列を並べることができる。
この文字列がコマンドライン引数と呼ばれるものである。

このときの引数(正確にはプログラム名+引数)の個数が

 "argc" 

であり、

引数の値を格納する配列のことを

 "argv" 

という。

そのため、今回の例に当てはめると

argc    = 3
argv[0] = hogehoge
argv[1] = abcde
argv[2] = aiueo

となるわけである。
argc(引数の数)と言っておきながら、プログラム名(今回はhogehoge)
も含まれているので、argcの値は実引数の数よりも1多くなります。
あー、ややこC

※コメント欄にて記述がございますように、一部のソースコードには
例外的にプログラム名が使用されていない場合もあります。
　そのため、必ずargv[0]にプログラム名が入っているわけではない
ので、そのことを頭の片隅に入れておくと今後役立つかもしれません。
　(ご指摘いただいたangel_p_57さん、drabさん、感謝いたします)


なお、C言語のプログラム内でコマンドライン引数を使用するには、
以下のようにすることが一般的である(と思われる…)。

main(int argc, char *argv[])
moto によって requests が意図せずモック化されてしまう問題を回避する

[moto](https://github.com/spulec/moto) は、AWS SDK の mocking パッケージです。
moto を用いたユニットテストについては以前 [エントリ](https://qiita.com/kumapo/items/6ed21aaf3a9a8a374e96)を書きました。

このなかで触れましたが、[requests](https://github.com/requests/requests) パッケージが意図せずモック化されてしまう問題があります。
この問題の回避策について自分なりのアプローチをまとめておきます

## 問題

問題としては、moto でスタブをアクティブにすると その後の requests パッケージによるリクエストがすべてモック化されてしまうというものです:

https://github.com/spulec/moto/issues/1567

これにより、[elasticsearch-py](https://github.com/elastic/elasticsearch-py) など requests に依存したパッケージにおいてHTTPリクエストのさいにエラーが起きることがあります。

## 回避策

回避策としては、moto の `responses_mock` にパススルーする URL を登録します:

```Python3
moto.core.models.responses_mock.add_passthru('http://localhost:9200')
```

[responses](https://github.com/getsentry/responses) という requests の mocking パッケージがあります。
moto はこれを AWS からのレスポンスをスタブ化するのに使っていて、パススルー元を追加するメソッドでスタブ化させたくない URL を事前に登録します。

## 参考

   - https://github.com/spulec/moto/blob/0fc00e2a3be74e4954227c413a75a89707e080d8/moto/core/models.py#L189
   - https://github.com/getsentry/responses/blob/0ca614109dd2c798d7089599fc8eab8d7afaf5d7/responses.py#L489
二つのReactDOMを使ったReact-RouterのMaster-Slave通信

LaravelとReactを組み合わせた場合Vueの場合と違いルート要素を軒並み上書きしてしまうため
bladeの機能を犠牲にすべきか上のメニュー領域を犠牲にするかというジレンマがあったので二つのルート要素に対してReactDOMを配置してReact-Routerで通信する手段がないか模索したレポート
![img_20181227.png](https://qiita-image-store.s3.amazonaws.com/0/314532/1f57423c-333f-bbfd-ec1e-165b8ce4f684.png)

基本的には二つのルート要素というよりもBowserRouterでReact-Routerのページ割り当て(メニュー選択→コンテンツ領域切り替え)のようなことはできなくなっていてLinkでアドレスバーが変わってもRoute要素の表示は変わらなかった

まず最初に目を付けたのはReact-Router-Reduxだったが最新バージョンの関係か書いてある通りにやっても最初のデモが動かなかった
(githubの最新版のexampleもOSの関係かビルドでこけてた)
バージョンを揃える事でうまくいくかも知れないがいずれ廃れる旧バージョンで再現するのも癪だったのもあって他を探していたところ

@Anharu氏の[React Router v4とReduxを繋げるにはconnected-react-routerを使うのがおすすめだよ！](https://qiita.com/Anharu/items/adb5a0d907edde392807)というのがあったので試してみた
記事の省略箇所の関係か己の未熟さ故か上手くいかなかったので[本家](https://github.com/supasate/connected-react-router)からソースを取得しexample(connected-react-router-master/examples/basic)をためしてみた
幸いyarnコマンドで問題なく依存関係を解決できyarn startでうまく起動した
![img_20181227(1).png](https://qiita-image-store.s3.amazonaws.com/0/314532/8470d18e-c17d-0fd1-86c2-352ae3e4d5ea.png)
ソースを加工し二つのルート要素にReactDOMを割り当ててみたところ無事二つのDOM領域が同期して表示切替された
![img_20181227(2).png](https://qiita-image-store.s3.amazonaws.com/0/314532/253af598-462c-a3c3-c36b-279a97326b50.png)
これを元に最小構成になるように切り出しをしたところ以下のようになった

```html:indexhtml
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Minimal Hot Reload</title>
  </head>
  <body>
    <div id="menu"></div>
    <hr />
    <div id="react-root"></div>
    <script src="/dist/bundle.js"></script>
  </body>
</html>
```

```jsx:index.js
import React from 'react'
import ReactDOM from 'react-dom'
import { createStore, combineReducers } from 'redux'
import { Provider } from 'react-redux'
import { Link, Route, Switch } from 'react-router-dom'
import { connectRouter, ConnectedRouter } from 'connected-react-router'
import { createBrowserHistory } from 'history'

const history = createBrowserHistory()
const rootReducer = (history) => combineReducers({ router: connectRouter(history) })
const store = createStore(rootReducer(history))
const Home = () => (<div>Home</div>)
const Content2 = () => (<div>Content2</div>)
const Content3 = () => (<div>Content3</div>)
const NoMatch = () => (<div>NoMatch</div>)

ReactDOM.render(
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <div>
        <Link to="/">Home</Link>　
        <Link to="/content2">Content2</Link>　
        <Link to="/content3">Content3</Link>
      </div>
    </ConnectedRouter>
  </Provider>
  ,document.getElementById('menu')
)
ReactDOM.render(
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/content2" component={Content2} />
        <Route path="/content3" component={Content3} />
        <Route component={NoMatch} />
      </Switch>
    </ConnectedRouter>
  </Provider>
  ,document.getElementById('react-root')
)
```

![img_20181227(3).png](https://qiita-image-store.s3.amazonaws.com/0/314532/f68f60d3-d769-a3c0-0cbc-6119ac7b20eb.png)

確認用の最小構成としてはこれで動きますが拡張性を考えるなら元のexampleのディレクトリ構成を活かした方がいいと思います。
【初心者】プログラミングと英語を一緒に勉強したい人向けチャンネル4選【YouTube】

こんにちは。
プログラミングを勉強しはじめた人の中で、「英語の知識が必要だな、、」と薄々感じている方はおられませんか？
でも日本語でさえ初心者にとっては呪文のように見えるプログラミングの解説ページを、英語で読むことは至難のわざです。
そんなときにオススメできる教材がみなさんにも馴染みのある動画サイト**YouTube**です。
ここではそもそもプログラミングと英語を一緒に勉強するメリットとYouTubeを使うべき理由、さらにオススメチャンネルをいくつかご紹介します。

##プログラミングと英語を一緒に勉強するメリット
####1. 情報量の違い
インターネットや書籍など、情報を検索する際に日本語で書かれた情報の数と英語で書かれた情報の数には大きな差があります。
例えば日本の人口は2017年時点で約1.268億人と言われていますが、一方で世界中で英語を話す人の数はおよそ15億人いると言われています。
これだけでも単純に12倍弱の差があります。

具体的にGoogleを使って、日本語で「オブジェクト指向」、英語で「object oriented」と調べてみます。（※2018/12/27時点）
すると日本語では1,480,000件の検索結果に対して英語では266,000,000件と、**およそ180倍**も多くの検索結果が見つかりました。

いかに日本語と比べて英語での情報量が多いかがおわかりいただけたのではないでしょうか。

####2.　ほとんどの言語が英語ベース
日本語でコードを書ける日本語プログラミング言語と呼ばれるものがあります。
しかし、実際に仕事の現場で日本語プログラミング言語が使われることはほとんどありません。
JavaやPythonなど有名な言語は全て英語をベースとして設計されています。
プログラミングの中で出てくる英単語を理解しておけば、その後の学習もスムーズに進めることができるかもしれません。

##YouTubeを使うべき理由
上記でプログラミングと英語は一緒に勉強すべき理由を述べましたが、とはいえ専門的な解説を英語で読むのは辛いものがあります。
その点YouTubeを使えば、画像（動画）を通して資格的に勉強することができます。
またほとんどの動画で速度調整や字幕をつけることができますので、リスニング力に自信がない方でも工夫することが可能です。


##オススメのYouTubeチャンネル
####1. Derek Banas
チャンネル登録者数が90万人を超えるプログラミング系YouTuberの中でも特に人気のチャンネルです。
さまざまな言語の初心者用のチュートリアルからゲームの作り方など幅広い動画をアップロードしています。
実際にコーディングしている画面をみながら学習できるため、手を動かしながら勉強したい人にオススメです。
[![Derek Banas](https://qiita-image-store.s3.amazonaws.com/0/301887/b1425429-ec2a-979c-7b7f-915d537caebb.png)](https://www.youtube.com/user/derekbanas/featured)

####2. Treehouse
オンライン学習サービスを運営するTreehouseが開いたYouTubeチャンネルです。
いろんなバックグラウンドを持った講師がインタビュー形式や対談形式、あるいはアニメーションを用いてそれぞれのトピックについて話し合います。
実際のコーディングを学ぶというよりは「どのように勉強したらいいのか」、「Pythonとは一体どういう言語なのか」といった基本的な内容を勉強したい人にオススメです。
[![Treehouse](https://qiita-image-store.s3.amazonaws.com/0/301887/f12333aa-25b8-cd2d-cac0-a73a068d0881.png
)](https://www.youtube.com/user/gotreehouse/featured)

####3. CS Dojo
Googleでソフトウェアデベロッパーとして働かれていた方が開いたチャンネルです。
日系の方なので親近感が湧きやすく、とても穏やかな印象を受けます。
また英語の発音も日本人が馴染みやすい話し方なので、英語に自信がない方にもぴったりです。
アルゴリズムやオブジェクト指向といった基礎的なことからPythonの解説やGoogleの入社試験についてなどおもしろいトピックが更新されています。
[![CS Dojo](https://qiita-image-store.s3.amazonaws.com/0/301887/843724d4-d78d-5859-a957-32e9db0d07f4.png
)](https://www.youtube.com/channel/UCxX9wt5FWQUAAz4UrysqK9A/featured)

####4. The Coding Train
とてもお茶目でおもしろいヒゲもじゃのおじさんがわかりやすくさまざまなトピックを解説してくれます。
更新頻度が高く、多いときには毎日動画を更新されていて、動画そのものにもわかりやすいように趣向をこらしてあります。
楽しく、真剣に勉強したいという人はぜひ試してみてください。
[![The Coding Train](https://qiita-image-store.s3.amazonaws.com/0/301887/ef644994-a507-2ca2-9f18-3a0ba65feb47.png)](https://www.youtube.com/user/shiffman/videos
)


##まとめ
以上、今回はプログラミングと英語を一緒に勉強するメリットとYouTubeを使うべき理由、さらにオススメチャンネルをご紹介しました。
プログラミングと英語を一緒に学びたい方はぜひ参考にしてみてください。
PHP7系におけるループのメモリ使用量と処理速度を比較

https://qiita.com/h13/items/a75fba76f435212a2eb3
こちらの記事でなされている実験が、PHP7系ではどのような結果になるかを実験してみました。
PHP5とPHP7ではメモリ管理において大きな違いがあるようなので、実際に検証してみようと思います。
実際、かなり違いました。

##この記事の目的
2018/12/27現在、`php メモリ節約` でググると[元記事](https://qiita.com/h13/items/a75fba76f435212a2eb3)が一番上にヒットします。
ですがPHP7系では違う結論に至るため、**「あれ？　書いてあることと違うぞ？」**ってなったのでこの記事を書いた次第です。
古い情報をgoogle先生に除外してもらいたい。

## 実行環境

```
MacBook Pro
OS Mojave v10.14.2
プロセッサ 3.1Ghz Intel Core i5
メモリ 16GB 2133 Mhz LPDDR3

PHP 7.1.19 (cli) (built: Aug 17 2018 20:10:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

マシンが違うので少なくとも実行時間は元記事と違うのは注意してください。

## 実験方法
[元記事](https://qiita.com/h13/items/a75fba76f435212a2eb3#%E5%AE%9F%E9%A8%93%E6%96%B9%E6%B3%95)と全く同じ方法で実験します。
ただし、今回は`array_shift` を用いたパターンは実験しません。時間がかかるのは結局同じで、実用的ではないためです。

```sample.php
$baseMemoryUsage = memory_get_usage();
$baseTime = microtime(true);

for ($i = 0; $i < 100; $i++) {
    $data = range(1, 100000);
    // ここでループ処理を行います。
    $data = null;
}

$maxMemoryUsage = (memory_get_peak_usage() - $baseMemoryUsage) / (1024 * 1024);
$processTime = microtime(true) - $baseTime;

printf("Max Memory Usage : %.3f [MB]\n", $maxMemoryUsage);
printf("Process Time : %.2f [s]\n", $processTime);
```

##結果
ループのパターンと番号は[元記事](https://qiita.com/h13/items/a75fba76f435212a2eb3)に合わせていますので、各パターンは[元記事](https://qiita.com/h13/items/a75fba76f435212a2eb3)を参照してください。

|No. |ループ文 |パターン |メモリ[MB] |処理時間[s] |
|:---|:------|:-------|:--------|:---------|
|0.0.|-|NOP|4|0.193|
|1.1.|foreach|通常|8|0.619|
|1.2.|foreach|節約|8|0.995|
|1.3.|foreach|通常-参照渡し|12|0.737|
|1.4.|foreach|節約-参照渡し|10|0.775|
|2.1.|while|通常|8|1.679|
|2.2.|while|節約|8|1.974|
|3.1.|for|通常|8|0.652|
|3.2.|for|節約|8|0.766|

処理時間は他のプロセスやマシンスペックに影響されているため、あまり価値のあるデータではないでしょう。
相対的な値として捉えてください。

##結論
PHP7になってメモリ管理に関するアップデートが行われた結果、何もひねらずforeachを使えば良いということがわかりました。Copy-On-Writeですね。
道具の進化により人の労力が削減される好例かと思います。

**結論：普通にforeach使おう**

##余談
Qiitaの情報を参考にするときは、コメント欄まで見たほうがいいです。