OmniAICreator/Qiita-1.07M huggingface dataset:
インフラコード化を始める前に

# はじめに

最初はクラウド環境をポータルなどを経由して作ることもあるとは思いますがいざ、インフラをコード化して自動化していこうとしてもなかなか始められないもしくは進まないといった場合に参考にしてください。

また、新規で作るようなときに初めに決めておくと便利そうなものをあげておきます。

普段コードを書いてる人は何気なくやっていることかもしれませんがガッツリインフラエンジニアだった人はあまりなじみがなかったりするので始める前の指標にしてください。

# 環境の定義

これから作るシステムの環境を決めましょう。

本番(商用)環境と開発環境はすぐ決まるが検証環境を「RC」と読んだり「ステージング」と呼んだりとチームによってあいまいになりがちなのでここで用途を決めておく。

実際にコードを使って構築する際の検証でも使用したいので特に検証環境が曖昧だと
本番環境にも影響が出ることもあるのでルールを明確にしておくようにする

# 命名規則

作るインフラのリソースそれぞれに付ける名前の命名規則を決めましょう。

これを決めておらず、ポータルなどいわゆる手動でリソースを作っている場合に人によって名前がバラバラで数カ月経つと用途不明のリソースが出来上がります。
（思い切って削除できればいいですが、そうといかないほうが多いように見えます）

コード化を進めていくと変数を使って環境差分を埋めていくとどうしても必要になってくるので初めに決めておきましょう。

よく使っている例としては[環境名]-[システム名]-[サービス名]などです。
クラウドのサービスによっては使える文字列に制限があるサービスもあります
ですが、その辺は臨機応変に例にある3要素が入るようにすれば大体、名前もかぶらず使えると思います。

# 権限

各環境に対する誰が何をしてよいかの定義をしましょう。

例えば、本番環境は運用者しか変更ができないとか開発環境は誰でもなんでも作ってよい状況にする（お金の制約はあるとは思いますが）など各チームのポリシーを決めておきます。

どこでも手動で作れてしまうとせっかくのコード化も**実際の環境とコードのずれ**が出てきてしまいコードを使わなくなるといった事態に陥るので気を付けましょう。


# コード管理

他のアプリケーションのコードと同じようにコードのバージョン管理を行う。
Gitを使うことによりシステムのアプリケーションと同様のフローで扱うことも可能になります。

具体的に例をあげると新規機能で必要になったクラウドインフラがあったとします。
検証環境でコードを作成これを検証用ブランチで管理（自分はよく「develop」ブランチとしてます）。

これを上記の環境定義で決めた検証環境で構築しアプリケーションと合わせることでテストします。このテストを合格したら本番環境用のブランチへマージします（「master」ブランチと呼んでます）。

これであれば環境差異を極力減らしテスト可能にすることで本番環境でのバグを減らす要因となります。また、同じコードを流すのでインフラ面でも本番環境構築を容易にします。

# 定義はドキュメント化

コードと一緒にreadmeなどを書き保存しておくことをおすすめします。
もちろん、wikiなどチームの文化に合わせてドキュメント管理していれば大丈夫です。

あまりおすすめしないのはバージョン管理されていないテキストやexcelなどのファイルです。あまり変化することはない定義ですが信頼に関わるので使わないで済むなら使わない方向が吉です。

# まとめ

上記の要素が全部決まっていないと始められないというわけではありません。
ですが、インフラのコード化を進めていくうちに出てくる課題の一部です。

とくに命名規則など途中で方向修正が大変になるケースが出てくるので決められるうちに決めておくことをおすすめします。
Syntax error, unrecognized expressionというエラーが出た場合の対処法

```
Uncaught Error: Syntax error, unrecognized expression:
```
コンソールで上記のようなエラーが出た場合は、引用符のエラーみたいです。

自分は今回、

```
jQuery('.page-link a[href^=#]').click(function(){
〜
}
```
と記述したらエラーがでました。

ですので、

```
jQuery('.page-link a[href^="#"]').click(function(){
〜
}
```
と「#」の前後にダブルクォーテーションをつけたらエラーがなくなりました。
#docker + #shell のエイリアス設定で  ホストの #python スクリプトを走らせるお手軽な profile 設定  ( #zsh の例 )

# ./version-check.py

```
import sys

print(sys.version_info)

```

# profile

.zsh .bashrc など

```
function docker-python() {
  cat "$1" | docker run -i python
}

```

# exe

```
$ docker-python ./version-check.py
sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1374








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
localの特定のgit branch のみを削除する方法

```sh
$ git branch
hoge-1
hoge-2
hoge-3
hoge-4
fuga-1
fuga-2
fuga-3
```

たくさんのbranchが残っててうざったい...すべてまとめて消したい...

そんなあなたに魔法の言葉！

```sh
$ git branch | grep fuga | xargs git branch -D
```

これで `fuga` が含まれるブランチを全て一発削除してくれる！(typo注意
ゲームサーバーってどうやって作るものなの？

みなさん、こんにちは。GS2の丹羽です。

今回からテックコラムと題して、ゲーム業界に関する話やビギナー向けの記事を書いていきたいと思います。
第一回はゲームサーバーの作り方です。 Game Server Services株式会社 らしいコンテンツから入ります。

# サーバーってどうやって手配するの？

「ゲームサーバーを作りたい」と思っても、そもそもサーバーってどうやって手配するの？パソコンとは何が違うの？と疑問に思うかもしれません。

## パソコンとサーバーのちがい

パソコンとサーバーの大きな違いは、ハードウェアとして”長時間の連続稼働”が前提として設計されているかどうか。しかありません。
そこで動作するソフトウェアはパソコンと違いはありません。
ただし、サーバー用途で使用されるOSは、Windows 10 や maxOS ではなく、Windows Server や Linux、Unix といったOSです。

## ソフトウェア

### Windows 10 と Windows Server って何が違うの？

動作するアプリケーションなどには一般的な Windows 10 と Windows Server では違いはありません。
違う点は Windows の用途に関するライセンス（利用条件）が異なります。
同時に利用する利用者が1人を想定した Windows 10 とサーバーに同時に多くのユーザーが接続してくることを想定した Windows Server では Windows Server のほうが利用料金が高い。ということになります。

### Windows と Linux/Unix は何が違うの？

動作するアプリケーションが異なります。
iPhone と Android では動作するアプリケーションが異なるのと同じです。
開発者によっては、Windows と Linux/Unix 向けの両方に提供している場合もあります。
サーバーに使うアプリケーションがどちらで動作するか。ということを意識してどのOSを使用するかを決める必要があります。

## ハードウェア

### 物理サーバ（オンプレミス）

いまあなたが使っているパソコンをインターネットに公開してサーバー機能を提供することも可能です。
ただし、前述の通り、OSのライセンスには気をつける必要があります。
また、民生品のパソコンは24時間365日処理を続けることを想定した設計にはなっていません。
セキュリティ的にもあなたの大切なデータが入っているパソコンをインターネットに公開するのは危険かもしれません。

### 仮想サーバ

仮想サーバとは、VMWare のような仮想化ソフトウェアを使って、OSの中で擬似的なパソコンを用意して異なるOSを動かす仕組みです。
この仕組を使用することで、1台のハードウェアを複数のハードウェアに見せかけて複数のOSを動作させたり、異なる役割のOSを分割して動作させることで問題が発生したときの原因調査をしやすくしたりできます。

仮想サーバは自分のパソコンで動作させることもできますし、仮想サーバを貸し出してくれるサービスもあります。

### IaaS (Infrastructure as a Service)

Amazon が提供している Elastic Compute Cloud(EC2) や Google Cloud が提供している Google Compute Engine(GCE) のようなサービスです。
これらはクラウドと呼ばれているものです。

IaaS は仮想サーバのレンタルサービスで、1分あたり。または1時間あたりといった時間単位で利用料金を支払うことで利用できます。
様々な性能の仮想サーバがレンタルされており、性能によって時間あたりの利用料金が異なります。
IaaS の多くはオンデマンドサービスとして提供されており、サーバーをほしい。というリクエストを管理画面から出すと、その瞬間に利用できるようになります。

昔はサーバーを使いたい。と思っても実際に使用できるようになるのは数カ月後とか。しかも、初期費用や最低利用期間のような制約がありましたので、IaaSの登場によって必要なときにすぐに手配して、要らなくなったら返却すれば利用料金もかからなくなるようになりました。

---

あなたのニーズにあわせてサーバーの種類を決めましょう。

# ゲームサーバーってなに？

ゲームサーバーとは、これまで説明してきたハードウェア・OSの上で動作するゲームと通信するためのアプリケーションが起動したモノです。
一口にゲームサーバーといっても、用途に合わせて大きく2種類あります。

## リアルタイムサーバー

MMORPGやPUBGのようなバトルロワイヤルゲームのようなゲームで使用されるのがリアルタイムサーバーです。
リアルタイムサーバーは通信頻度が高く、通信遅延がゲーム性に影響を与えるような用途で使用するものです。
リアルタイムサーバーでは一般的に常時接続型の通信が使用されます。

常時接続型の通信というのはゲームサーバーとゲームアプリケーションが常に接続された状態を維持し、
ゲームサーバーとゲームアプリケーションがゲームの実装にあわせて必要な情報を常に交換するタイプのサーバーです。

通信に使用するプロトコルはゲームごとに独自に定義したものを使うことが多いです。

## 一般的なサーバー

アカウント管理サーバーとのログイン通信や、ガチャサーバーとの抽選処理通信などは常時接続をするほどデータ交換が高頻度ではありません。
このような処理はサーバーに接続をしてデータ交換が終わったら切断するような設計をします。
最近のゲームサーバーでは Webページの配信に使用される HTTP通信を使用することが一般的です。

なにもないときにはサーバーと接続していないため、常時接続型のリアルタイムサーバーと異なり、サーバー側から何らかのイベントをクライアントに通知するようなことはできません。

# まとめ

1. サーバーとパソコンの違いは、ハードウェアの設計が常時稼働することを前提としているか
2. サーバーで動作させるOSは動作させたいアプリケーションから決定することになる
3. サーバーを動作させるハードウェアの種類は、物理サーバー、仮想サーバーの2種類があり、IaaSを使えばオンデマンドでサーバーを手配できる
4. ゲームサーバーはただのゲームと通信するために用意されたアプリケーションが動作したサーバー
5. ゲームサーバーはリアルタイムサーバーと一般的なサーバーの2種類がある
6. リアルタイムサーバーは高頻度のデータ交換・通信遅延を実現するために使用される
7.  ログイン処理など通信頻度の低い目的の通信は Webなどで使用される HTTP 通信を使用することが一般的
8. 常時接続型でないとサーバーからゲームアプリケーションに通知を出すことはできない

# GS2のご紹介

Game Server Services では ゲームサーバーのレンタルをおこなっています。

[個人からプロまで使えるゲームサーバー - Game Server Services(GS2)](https://gs2.io)

それでは、また。

# 次回

[ゲームサーバーで使うデータベースってどんな種類があるの？](https://qiita.com/kazutomo/items/7a97fac3f88f513105cd)
コンボボックスで規定値が設定できない。DefaultSelectedItemsが効かない

PowerAppsでコンボボックスとドロップダウンコントロールのItems属性はほとんど同じように使えるんですが、規定値、つまりDefault属性の設定のし方が少し違います。

ドロップダウンはDefault属性に文字列型を設定するだけですが、コンボボックスにはDefaultSelectedItems属性にテーブル型の情報を入れる必要があります。

今回DefaultSelectedItems属性に下記の式を入れて何の問題もなさそうだったのですが、一向に思った結果になりませんでした。

```
DefaultSelectedItems属性 = Filter(Tbl_OtherChakra,ID2=ThisItem.ID)
```

数時間の格闘のすえにやっと分かったのがこのコンボボックスのItems属性に下記の式で直接値を入れていました。

```
Items属性 = ["A","B","C","D","E","All"]
```

参照してたデータソースにも同じ値が入っていたのですが、この場合はDefaultSelectedItems属性がうまく効かないみたいです。Items属性も同じデータソースを参照するように変更したら上手く出来ました。

こういう問題は答えを見つけるのが難しいですね。

ちなにみ、一番最初はそのデータソースにItems属性で表示させたい選択肢を入れておく必要があります。
Hyper-Vで作成したOSにSSHで接続出来ない

メモ失礼しますm(_ _)m

Hyper-Vで作成したOSにSSHで接続出来ないのですが
解決方法を後から思い出すためメモ失礼します。

現状っ
HyperVからインストールしたOSを立ち上げていて
親PCから上記インストールしたOSにping打っても帰らないし
SSHで接続しようとしてもホストは見つからないとのエラーで
どうしてだろ？？？と思っているのです……

先週金曜日は接続出来たんだけどな……

Hyper-Vで作成したOSのネットワーク部分にはちゃんとIP割り振られているんだけどな……
php-master-changes 2019-04-21

今日は static.php.net 廃止に伴う URL 修正、ドキュメントの更新、テストの追加、不要ファイルの削除、ビルドシステムのリファクタリングがあった！

# 2019-04-21
## petk: Fix [#77921](https://bugs.php.net/bug.php?id=77921): static.php.net doesn't work anymore
- https://github.com/php/php-src/commit/44502883443fe2ac28a93398c32340250de9547f
- sapi/fpm で、ステータスページの PHP ロゴを static.php.net のものから DataURI に修正

## petk: Update changelog
- https://github.com/php/php-src/commit/295c66911f6e46ea7ff7589dd6c3baa50d11006a
- [7.2~]
- ↑ の NEWS への追記

## vitormattos: Add test for date timestamp
- https://github.com/php/php-src/commit/c050045faaaf288b8f6c4a63c5e88ffeb58395c0
- [7.4~]
- ext/date で、タイムスタンプ取得のテストを追加
- [date_timestamp_get()](https://php.net/manual/ja/function.date-timestamp-get.php) を使うテストの追加でカバレッジを上げる[意図](https://github.com/php/php-src/pull/4026)

## royopa: Added test for imagecolorclosesthwb
- https://github.com/php/php-src/commit/ba0f7f7e438a9ff490925986c9c89e58ec0ee741
- [7.4~]
- ext/gd で、[imagecolorclosesthwb()](https://www.php.net/manual/ja/function.imagecolorclosesthwb.php) のテストを追加

## petk: Remove zend.ico
- https://github.com/php/php-src/commit/b58bd11ae55f5417f3ab3c76c1505e8fc947c929
- [7.4~]
- 使われていなかったファイル zend.ico を削除

## petk: Move ucgendata README to generator file header
- https://github.com/php/php-src/commit/36c7946522eb9ed0a4463e6247b5954c3118097d
- ext/mbstring で、ucgendat の README の内容をコードのコメントへ移動

## petk: Refactor docs files for bcmath library
- https://github.com/php/php-src/commit/e8a812866579ecf525b4a1c5f722414b97052575
- [7.4~]
- ext/bcmath で、複数ファイルに散らばっていたドキュメントを統合しマークダウン化

## petk: [ci skip] Fix typo
- https://github.com/php/php-src/commit/bb958053276959b0556d9a899afbc519ff350e2a
- [7.4~]
- typo の修正

## petk: [ci skip] Fix logo location
- https://github.com/php/php-src/commit/47c5fa07102cebd3471074805a086d578c376d67
- [7.4~]
- PHP ロゴの URL を修正

## royopa: Updated visual text elements using markdown
- https://github.com/php/php-src/commit/80f3c69ae925b09068b0642306a8a14a42c7d25c
- [7.4~]
- ドキュメントの見た目調整部分をマークダウン化

## petk: [ci skip] Fix CS in Markdown files
- https://github.com/php/php-src/commit/1c94aac89e0d7dfbd5efc15ec1862214b22603d1
- [7.4~]
- ドキュメントの修正
- 改行位置の修正とマークダウンでの整形への移行、あからさまに古くなっていた記述の更新

## petk: Refactor Zend/acinclude.m4 local macro
- https://github.com/php/php-src/commit/b1d3509e8c22f1ae12b6462e7732baddedde9bdd
- [7.4~]
- ビルドシステムで、Zend/acinclude.m4 のローカルマクロをリファクタリング
- 元々スタンドアロンでの Zend Engine のビルドを想定してた構成だったけど、（そんなのやらないことになった）今だと単純化できる、という話かな
【Unity】git addしたときのopen("Temp/UnityLockfile"): Permission deniedの原因と対処方法

# 動作確認環境
- Windows 10
- Unity 2018.3.1f1 Personal

# 背景

先日、新規作成したUnityプロジェクトをGitHubにpushしようと思い、```git add .```しました。
そしたら、下記のようなエラーが出ました。

```bash
$ git add .
error: open("Temp/UnityLockfile"): Permission denied
error: unable to index file Temp/UnityLockfile
fatal: adding files failed
```

どうやら、Unityでプロジェクトを開いているときにだけ存在するTempフォルダが原因のようです。

# 解決方法

プロジェクトを閉じて、```git add.```すればいいです。
もしくは、.gitignoreに追記して、Version管理対象外にすれば問題ないです。

## なぜこうなってしまったか

自分の場合は、githubのUnity用テンプレートの.gitgnoreを使用していました。
.gitgnoreに書いているファイルおよびフォルダ、ディレクトリは、gitのバージョン管理対象外にすることができます。

```shell-session:.gitignore
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
Assets/AssetStoreTools*

# Visual Studio cache directory
.vs/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.opendb

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage
```
にもかかわらず、なぜ```git add .```の対象になってしまったか。
それは、単純に手順が悪かったです。
どういうことかというと、

1. GitHubで、画面ポチポチして新規リポジトリを作成する。←ここで**.gitignore**を作成。
2. ローカルでUnityプロジェクトを新規作成。
3. 新規作成したUnityプロジェクト配下で```git init```
4. ```git add .```
5. ```git commit -m "first commit"```
6. ここでGitHubのリポジトリと紐付いていないことに気づく。  
```git remote add origin https://github.com/<username>/<ripository>.git```
7. ```git pull origin master``` してリモートリポジトリと同期する。← ここでローカルに**.gitignore**を作成

```git add .```している時点では、ローカルリポジトリに.gitignoreがありません。
そのため、.gitignoreで管理外に設定しているTempもバージョン管理の対象にしてしまいます。
その結果、Tempも含めて全てaddしてしまったということでした。

# 終わりに

正直、このエラーがでるまで、自分の手順が間違っていることに気づきませんでした。
個人の勉強用リポジトリなので、管理が雑でした。
ミスって不要なファイルまでpushしていることも気づかず、お恥ずかしい…
Vive Trackerとかを用いてVtuberっぽいことをした時の雑記

# Vive Trackerの色々
ざっくり8か月くらいViveを使っていろいろした時の過去の記憶
過去の記憶なので、参考程度に見てほしい
トラブルシューティングを主に書こうと思う

Youtubeにも上がっているCEDECでのVIVE公式講演の動画を見ていない人は見ること。
https://www.youtube.com/watch?v=wmMZq3oZ624
https://www.youtube.com/watch?v=RGNNgh7NvXA

# トラッキングが飛ぶんだけど
原因はざっくり2種類に分けられる。赤外線反射か、通信の不調のどちらか。
自分では試せなかったが、通信が原因の場合は有線でつなぐこともできる。
切り分けのために有線は用意すべきかも。

## とにかく赤外線・反射に気を付ける（反射系）
基本中の基本だが、些細なもので反射する。
ステンレスのような銀に光るものも駄目だし、透明アクリルなんかも鋭角で反射する。
とにかく塞ぐしかない。高いけどパーマセルテープとか使えるといい。
日光もだめです。お日様つおい。
ライトハウスの光源は、強すぎることはあっても弱いことはないと思っていいと思います。

## 腰と足元は基本飛びやすい（反射系・電波系かも？）
死角を作りやすい高さなので、ライトハウスからの角度と反射に気を付けたい。
基本的にそれだけだが、地面からの反射は意外と対処しにくい。

## 電波状況に気を付ける（電波系）
一般的な環境では大丈夫だと思うが、ドングルは一般的な無線帯域(2.4Ghz周辺)を使っている為、
周囲に無線ルーターがある場合も5Ghz帯のみにするなど対策する。
公衆の面前のような使い方は避ける。
公式講演の動画などでも言っているが、ドングルを一か所に刺しまくるのは良くない。


## トラッカーの周囲に鉄板を置かない（電波系）
トラッカーの下部に無線通信するモジュールがあるらしいので、
下部を遮るような金属質なものは避けること。
足元が飛ぶのはこれが原因かも？

# 環境面のいろいろ
## USB接続数に気を付ける
USB3.0は実は同時接続数が少ない。基本的に、入力と出力それぞれで16、合計32個らしい。実質16個。
(128個つけれるのはUSB Ver1の話。)
HMDはそれ単体で3つのUSBを使用する。（HMD内部にドングルが2つ内蔵されている。コントローラーと紐づけるやつ）
マウス・キーボードで2つ使うとする。
全身キャプチャ用にTrackerを8個繋げるとする。（腕2肘2頭1腰1足2）
計13

あと3つしか付けられないじゃないか！

USB HUBもリソース使うことがあるので、より少ない。
上限を超えた場合は、後から繋げたものから認識されなくなるしOS自体が挙動不審になる。

## Tracker Ver2.0。ライトハウス4つ。死角無し！これで勝つる！
そんなことはないです。サポート対象外っぽいです。
ライトハウス認識に問題があるらしく、認識しているライトハウスによって時折飛びます。

広範囲をカバーする使い道ならまだいいと思いますが、
モーキャプみたいな狭域を高精度で、という使い道にはまだ未対応のようです。

## Tracker Ver2.0ってどうよ？
スペック上Ver1の上位互換になっていますし、実践上でも体感良くなっている気がします。
ライトハウス2つでやる分にはよいと思います。
ライトハウスからの信号も記号化されているらしいので、干渉も少ないようです。
ただしすべて2.0環境にする必要がある。

## そもそもTrackerで全身モーキャプするってどうよ？
精度は高いです。Vive Tracker 自体、高精度でポジションを取ってくれます。
ただしトラッカー本体位置なので、人間の体の位置を取ろうとすると、オフセットが必要です。

あと意外と見逃しがちなのがTrackerの重さです。うろ覚えですが200g以上あります。
このくらい重くて大きいものを人体から外部に固定するのは結構大変です。
ずれやすいし、体からの突起物のなので結構邪魔になる。

足につける場合でも、例えばクロックスみたいなものだと簡単にくっつけられますが、
弾力がある素材なので、ぼよよんって感じを思い切り拾ってしまいます。

あと腰。腰については安定して高精度で取るにはちょっと工夫が必要そう。
そもそも腰に固定してくっつけるのが結構大変。

## Ikinema Orionってどうよ？
結構いいと思いますが、胸のトラッキングポイントはありません。
頭から腰に掛けて補完で取る形になるので、ベリーダンスのような腰くねくねみたいなのをやりたい人には向きません。

個人的には手はコントローラーのほうが色々よさそうかなと思っています。
操作する人の技量に掛かっていますが、腕にくっつけるのではなく、手で握るため、
狙って動かす分にはズレが少なく動かせます。

固定位置、方向でキャリブレーションするのでつけ方に気を付けないといけない。
公式に図があったと思いますが、Tポーズしたときに前に向くように取り付けるはずです。
（この向き調整が地味にTrackerを体に取り付けるパーツがずれる原因になる…）

※　何か思い出したら追記します。
10連休向けアドベントカレンダーシステムを作った【個人開発】


10連休が結構時間取れそうなので、
毎日ブログ更新しよう！と、個人アドベントカレンダーシステムを作りました



デバッグしてくれる人
**<font color="red">GWアドベントカレンダー実施仲間募集中です</font>** 


## つくったもの

[GWアドベントカレンダー](https://gw-advent.9wick.com/)

１２月にやるアレです。サンタさんが待ち遠しくなるやつです。
アドベントカレンダー自体の説明は[Qiitaさんの記事](https://help.qiita.com/ja/articles/qiita-adcal-1)がわかりやすいです

### サービストップ
![スクリーンショット 2019-04-22 1.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/e8632592-dccf-db21-de8b-04982783fd85.png)

作られたアドベントカレンダーの一覧が見れます（まだ自分しか登録してないので1つだけ）

### カレンダー画面
![スクリーンショット 2019-04-22 1.53.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/35f6e929-54c5-6ba7-a32f-52c719c6a8c2.png)

日付ごとにタイトル／ブログURLを登録できます。
それだけだと寂しいので、登録者のアイコン＋名前をだしています。


### Twitterアカウント
通知用も兼ねて作りました
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ゴールデンウィーク１０連休のアドベントカレンダーシステム作りました！<a href="https://twitter.com/hashtag/GW%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#GWアドベントカレンダー</a> <a href="https://twitter.com/hashtag/qiita?src=hash&amp;ref_src=twsrc%5Etfw">#qiita</a><a href="https://t.co/QIHxnpL0Ry">https://t.co/QIHxnpL0Ry</a></p>&mdash; gw_advent (@AdventGw) <a href="https://twitter.com/AdventGw/status/1120116424062595072?ref_src=twsrc%5Etfw">April 22, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


### サービスの主な機能

- twitterログインができる
- だれでも10連休向けアドベントカレンダーが作れる
- カレンダーごとに、デイリーのブログURLの登録ができる
- ブログURLは当日になると自動で公開される

ブログ投稿機能はありません。あくまでリンク集としてのシステムです。


## なぜ作ったか

いくつか理由がありますが、メインは

**最近ブログ書けてない　＋　10連休なにしようかな
 　→そうだ、アドベントカレンダーやろう**

という理由です。

あとは、１２月のアドベントカレンダーが楽しかったので、半年たったGWあたりで**プチアドベントカレンダー**があってもいいんじゃないかなと思いました。
１２月まであと半年もまてない・・・・


技術書展6で買った本を消化したいなとか、積みデバイスがたくさん溜まってきたなとか、半年間このフレームワーク使ってみたいなとおもったまま手を付けていないなとか、そういう方は**<font color="red">GWアドベントカレンダー実施仲間募集中</font>** ですので、GWにブログ書く**意思表示**をぜひしてみてください

https://gw-advent.9wick.com/



## 技術的なお話：使ったもの

いろいろな技術／システムを使ってみたい！というもあったので、使ったこと無いものを多めにチョイスしました。

それぞれの詳細はアドベントカレンダーのネタとして書く予定です！


- フレームワーク：[adonis.js](https://adonisjs.com/)
  海外のnode.jsフレームワーク10選！とかの記事でよく見かけたやつ。
  MVC全部サポートしてくれそうなのが良さそうだから使ってみたかった。

- テンプレートエンジン：[Edge](https://edge.adonisjs.com/)
  adonis.jsにくっついてるテンプレートエンジン。レイアウトという概念が導入されていて、それが良くて（？）単独でも使う人が結構いるらしい

- ログインシステム：[firebase](https://firebase.google.com/?hl=ja) 
  自分で実装がめんどくさかったので、ログイン部分だけfirebaseを利用

- 言語：node.js
  adonis.jsを使うためにnode.js

- PaaS：[dokku](http://dokku.viewdocs.io/dokku/)
  mini herokuといわれる、herokuライクなことができるオープンソース。
  しょーもないシステムを大量に作るのにいちいちheroku借りたくないなということで今回導入。

- VPSサーバー：[conoha](https://www.conoha.jp/)
 いつもはsakuraを使っているが、dokkuのテンプレートがconohaはデフォルトであるようなのでこっちにしてみた

- DNS：[お名前.com](https://www.onamae.com/)
  普段から使っているので今回も利用。これはなかなか変えにくい

## かかった時間

土日２日間でサクッと作りました。
サクッと作った分、デザインが犠牲になってたり、システム的に手抜きだったりします。
本当はサンタがサーフィンしてる絵でも描きたかった・・・。

- conoha契約〜dokku導入　半日
- adonis.js立ち上げ〜アプリ作成　１日

GWまであと１週間切っていたのもあり、最低限、最低限と自分に言い聞かせながら作りました。
登録者数がもしのびるようだったらちょこちょこ改善します。
Rails5 renderのpartialファイルにデータを渡す

##共通で使うrenderファイルにデータを渡す方法

- **partialファイル(_xxx.html.erb)を呼ぶ出すときはrenderメソッドを使う。**

 = render 'xxx' もしくは = render partial: 'xxx'

- **データを渡したいときはlocalsオプションを利用する。**
  
 = render partial: 'xxx', locals: { key: data}
localsオプションにはオブジェクトを渡します。
オブジェクトのkeyがパーシャル内で参照できる値になります。

また、localsオプションだけを指定する場合は省略形で記述することも可能です。
 = render 'xxx', key: data

###例

```erb:index.html.erb
<div class="contents row">
    <% @tweets.each do |tweet| %>　
      <%= render partial: "tweet", locals: { tweet: tweet } %>　
    <% end %>
    <%= paginate(@tweets) %>
</div>
```

**_tweet.html.erb**というpartialファイルがあるとします。

partialファイルtweetをrenderメソッドで呼び出す。
localsオプションではkeyがtweetで値がeach文の|tweet|である。
**= render 'tweet', tweet: tweet**としても呼び出す事ができる。

_tweet.html.erbファイルではtweetをキーとして@tweetsの変数であるtweetを使用できる。

```erb
  <%= simple_format(tweet.text) %>
  <span class="name">
    <a href="/users/<%= tweet.user_id %>">
      <span>投稿者</span><%= tweet.user.nickname %>
    </a>
  </span>
```
ブラウザでブラウザを操作してスクレイピングを行う

他の投稿はこちら

- [Webアプリの限界を超える方法](https://qiita.com/tekka/items/1bf440ccd50bb4171886)
- [Webアプリの限界を超える方法(セキュリティ編)](https://qiita.com/tekka/items/d9f6fd2e30c1f778b5aa)
- [ブラウザで(WebUSBもActiveXも使わずに)FeliCaリーダーを読み込む](https://qiita.com/tekka/items/537115a3d6444b9a8848)
- [Webブラウザでシリアル通信を行う](https://qiita.com/tekka/items/36edc0d6e918ac2b5ab9)

タイトルを読んで「何言ってんだコイツ」と思われた方も居るかもしれません。
要するに、ブラウザからブラウザ（というかWebBrowserコントロール）を立ち上げて、スクレイピングをする方法を紹介します。

# 概要
![ブラウザ_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/ced3c8ef-e750-6880-d8aa-1cfbe7851ecf.png)

* WebBrowserコントロールを組み込んだネイティブアプリを作成する
* ネイティブアプリ上でWebSocketサーバーを立ち上げる
* ブラウザからネイティブアプリのWebSocketサーバーにローカルホスト接続する
* ネイティブアプリでスクレイピングを行い、WebSocketサーバーを通して、情報をブラウザに送信する。

構成は、前回「[ブラウザで(WebUSBもActiveXも使わずに)FeliCaリーダーを読み込む](https://qiita.com/tekka/items/537115a3d6444b9a8848)」とほぼ同じで
カードリーダー部分をWebBrowserコントロールに挿げ替えただけです。

# デモ

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/dd27ff64-510c-08a4-e987-bb120845adae.gif)

ブラウザで入力したキーワードを元に、ググった結果を表示しています。

# まとめ

正直、ブラウザからブラウザを動かして何が嬉しいの？と思われるかもしれません。
確かに今回のように、単純な用途でスクレイピングをしたいだけなら、curlなどを使用して取得した文字列を解析すれば十分ですが

* APIが用意されていないBtoBサイトと自社サイトを連携させたい
* サーバー側の負荷軽減のため、クライアント側でスクレイピングさせたい
* WebベースでRPAをやりたい

といった要求がある場合、今回紹介した技術が役に立つと思います。

また、今回はC#＆WebBrowserコントロールを使用しましたが
実際はSeleniumでもヘッドレスブラウザでも、自由に実装して頂けます。

# サンプル＆ソース

サンプル＆ソースは[こちら](https://github.com/tekka/ParallelHybridApp_browser)
GASで勉強会を自動化する

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/GAS%E3%81%A7%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B/)をご覧ください😀

春ですね。みなさん社内勉強会してますか？
続いてますか？継続って大変ですよね！

## 勉強会の準備って大変...

開催までには下記のようなタスクがあります。

- 参加フォームを作る
- 告知メールを送る
- 発表内容をまとめて勉強会のwebページを作る
- 開催日が近くなったらリマインドメールを送る
- 前日もう一度リマインド

毎月開催しようとすると、これだけで疲弊してしまいますよね。。
そこで、これ全部GASで自動化しました！

## 使い方

Googleカレンダーに勉強会の予定を登録するだけ！
これだけでフォームもメールもwebページもGASが自動で作ってくれちゃいます。
![FotoJet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/f3f0cebb-5b7e-5fde-a177-473795c0d914.jpeg)


## しくみ

トリガー設定で毎日スクリプトを起動して、下記を行ってます。

- 当月に勉強会の予定があれば
    - [参加フォーム](https://docs.google.com/forms/d/e/1FAIpQLScJSpCsVPhb6R5k7cP4Fi0YhW-q5DqzdXxlJrHGJfkti8k6UQ/viewform)を作成
    - 告知メールを送る
    - [webページ](https://script.google.com/macros/s/AKfycbw2r6Th_VNa9Lpf0hS6gzOE8bMSUi-xyigutP5rKn-30bbznSJ8/exec?date=2019/04/26)を作る
        - フォームの回答内容が自動で反映される
- 開催3日前と前日にリマインドメール
    - 発表者がいなければ中止メール


## プログラム

[GitHubにアップ](https://github.com/naoqoo2/study-meeting-gas)してます。
事前準備とスクリプトプロパティを登録すれば動くかと。
不明点あればご連絡ください。


### 事前準備

参加フォームは開催毎にコピーして作るので、コピー元となるテンプレートを作っておきます。

[テンプレート例](https://docs.google.com/forms/d/e/1FAIpQLSczsHbr-ZMmcBEBlMMACdAMdEeaDJbmEuVSAhVguhKV4bwmoQ/viewform?usp=sf_link)


### スクリプトプロパティを登録

ファイル→プロジェクトのプロパティ→スクリプトのプロパティタブを開いて下記を登録

- EVENT_ACCOUNT
    - 勉強会の予定を登録するGoogleアカウント（メールアドレス）です

- TEMPLATE_FORM_ID
    - 事前準備で作成したフォームのID

- BASE_FOLDER_ID
    - 開催毎に作成されるフォームを置くためのドライブのフォルダID

- WEB_PAGE_URL
    - GASスクリプトのwebページURL（公開→ウェブアプリケーションとして導入をする必要あり）

- MAIL_TO
- MAIL_CC
    - 告知メールの宛先

## さいごに

ちょっと手を加えれば下記のようなことも可能です。

- 勉強会後のアンケートメール
- Googleサイトを利用してもっとイケてるwebページ
    - 現状は新GoogleサイトがAPI対応されてなくて断念しました
- 毎週開催

それではステキな勉強会ライフを。
準備が簡略化された分、中身を濃くしていきましょう！
コンボボックスで選択した複数アイテムをデータソースに一行ずつ保存する

PowerAppsでコンボボックスで選択した複数アイテムをデータソースに保存しようとしましたがハマりました。

解決策が見つかったので記録しておきます。CB_ChakraSelection3.SelectedItemsの部分以外は普通のForAllとPatchの組合せで出来ました。

設置したボタンのOnSelectに次のPatch関数でTbl_OtherChakraのデータソースに保存します。

```
ForAll(
    CB_ChakraSelection3.SelectedItems,
    Patch(
        Tbl_OtherChakra,
        Defaults(Tbl_OtherChakra),
        {
            ID2: TI_ID3.Text,
            Other_Chakra: Value
        }
    )
)
```
rails-ERDを使用して簡単にER図を作成する

## はじめに
職場でRailsで作られたプロダクトの最新のER図を作成しようということがあり、面倒なのでいいライブラリがないかなと調べたところrails-erdがあったので共有する。

## 準備
まず、OSにgraphvizというツールパッケージをインストールする。
**Graphviz (Graph Visualization Software)**とは
DOT言語のスクリプトで示されたグラフを描画する。
グラフ記述には十分な自由度が用意されていて、矢印ひとつにしても多くのバリエーションの中から適したものを選択できる。
https://ja.wikipedia.org/wiki/Graphviz

今回は、このグラフ描画を簡単にするツールを使用するgemみたいです。

早速入れて見ましょう。
### Ubuntu
```
$ sudo apt-get install graphviz
```

``` ruby:Gemfile
group :development, :test do
  gem 'rails-erd'
end
```

### Mac
```
$ brew install graphviz
```

``` ruby:Gemfile
group :development, :test do
  gem 'rails-erd'
end
```

## 実行
以下をプロジェクトのディレクトリで実行します。

```
$ bundle exec erd
```


## ER図

![refinery.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277836/6453a38f-95aa-a0da-641c-60ec4be8cba9.png)


## オプション
### help
```
$ erd -h

Usage: erd [-v]


        --title=TITLE                Replace default diagram title with a custom one.
        --notation=STYLE             Diagram notation style, one of simple, bachman, uml or crowsfoot.
        --attributes=TYPE,...        Attribute groups to display: content, primary_keys, foreign_keys, timestamps and/or inheritance.
        --orientation=ORIENTATION    Orientation of diagram, either horizontal (default) or vertical.
        --inheritance                Display (single table) inheritance relationships.
        --polymorphism               Display polymorphic and abstract entities.
        --direct                     Omit indirect relationships (through other entities).
        --connected                  Omit entities without relationships.
        --only                       Filter to only include listed models in diagram.
        --exclude                    Filter to exclude listed models in diagram.


        --filename=FILENAME          Basename of the output diagram.
        --filetype=TYPE              Output file type. Available types depend on the diagram renderer.
        --no-markup                  Disable markup for enhanced compatibility of .dot output with other applications.
        --open                       Open the output file after it has been saved.


        --help                       Display this help message.
        --debug                      Show stack traces when an error occurs.
    -v, --version                    Show version and quit.
```
emacsでもCtrl-Cでリージョンをコピーする

リージョンが設定されているときだけ、Ctrl-Cのキーバインドをkill-ring-saveに変更することで実現できます。
そのために、まず、パッケージ「selected」をインストールします。

```
M-x package-install <enter>
selected<enter>
```
これでselected-keymapが使えます。
次に、init.elに以下を追記します。

```emacs-lisp
(require 'selected)
(selected-global-mode 1)
(define-key selected-keymap (kbd "\C-c") #'kill-ring-save)
(define-key selected-keymap (kbd "\C-x") #'kill-region)
```

これでリージョンがあるときは、
　・Ctrl-cでコピー
　・Ctrl-vでカット
ができるようになります。
ついでに以下もinit.elに追加すればCtrl-vでペーストもできるようになります。

```emacs-lisp
(global-set-key "\C-v" 'yank)
```
以上
割り算（わり算）のひっ算

#ひっ算

小学生で四則のどのような計算でもできるようになる必殺の技がひっ算です。ところで，その仕組みについてはどうでしょうか。

足し算・引き算については，自然な仕組みになっています。かけ算については，分配法則を使って，各位の計算を順序立てて行っています。わり算はどうでしょうか。わり算のひっ算の仕組みは直感的に理解できるような・理解できないような複雑なものです。

手順は小学校で習いましたから，分かると思います。

<a href="https://www.codecogs.com/eqnedit.php?latex=\large&space;\begin{tabular}{rlrrrr}&space;&&space;&&space;&&space;2&space;&&space;5&space;&&space;7&space;\\&space;\cline{2-6}&space;21&space;&&space;\kern-5pt&space;\Big)&&space;5&space;&&space;4&space;&&space;1&space;&&space;2&space;\\&space;&&&space;4&space;&&space;2&space;\\&space;\cline{3-4}&space;&&space;&&space;1&space;&&space;2&space;&&space;1&space;\\&space;&&&space;1&space;&&space;0&space;&&space;5&space;\\&space;\cline{3-5}&space;&&space;&&space;&&space;1&space;&&space;6&space;&&space;2&space;\\&space;&&space;&&space;&&space;1&space;&&space;4&space;&&space;7&space;\\&space;\cline{4-6}&space;&&space;&&space;&&space;&&space;1&space;&&space;5&space;\end{tabular}" target="_blank">
<img src="https://latex.codecogs.com/svg.latex?\large \begin{tabular}{rlrrrr}  &  &  & 2 & 5 & 7 \\ \cline{2-6} 21 & \kern-5pt \Big)& 5 & 4 & 1 & 2 \\ && 4 & 2 \\ \cline{3-4} & & 1 & 2 & 1 \\ && 1 & 0 & 5 \\ \cline{3-5} & & & 1 & 6 & 2 \\ & & & 1 & 4 & 7 \\ \cline{4-6} & & &  & 1 & 5 \end{tabular}"/></a>

上のひっ算のコマンドは次の通りです。

```tex
\begin{tabular}{rlrrrr}
 &  &  & 2 & 5 & 7
\\
\cline{2-6}
21 & \kern-5pt \Big)& 5 & 4 & 1 & 2
\\
&& 4 & 2
\\
\cline{3-4}
& & 1 & 2 & 1
\\
&& 1 & 0 & 5
\\
\cline{3-5}
& & & 1 & 6 & 2
\\
& & & 1 & 4 & 7
\\
\cline{4-6}
& & &  & 1 & 5
\end{tabular}
```

online latex equation editorを使い，表示しています。

どのようにして，商の各位の値を計算していくのかを考えていくことにします。

実は，この仕組みを改めて理解したいと感じたのは，有理数は絶対に有限小数化か循環小数になるものなのか気になったからです。
循環小数が有理数になることは大雑把な議論ですが示すことができます。循環しない小数が有理数になり得ないと言い切れるのか，それを証明することがきっかけでした。

##問題の明確化

商の各位の値を順次計算していくことから，10進法を計算の仕組みに取り入れていることに気をつけます。一般に$d>1$進法とは，正の整数$a$に対して，

```math
a = a_0 + a_1 d^1 + a_2 d^2 + \cdots + a_n d^n
```
各$i$は，$0 \leq a_i < d$を満たす整数と表した，整数の組$(a_0,a_1 ,a_2, \cdots , a_n)$のことです。普通は$d=10$とし，左側の数の方が大きなくらいの数としています。

割り算のひっ算は，いかにして商を$d$進数で表していくのかがここでの論点となります。


##ひっ算の手順

ひっ算の手順では，商を位が大きい方から求めていきます。さらに次のステップに進むために，余りを出します。ここでの商と余りを出す操作をここでは解き明かします。

まず，割る数を大きくすることから始めます。注目する点は，

```math
a > b \cdot d^n
```

となる最大の$n$が存在することです。これで商と余りがでます。$a$を$b \cdot d^n$で割ったときの商を$c_n$，そのときの余りを$r_n$とする。つまり，

```math
a=c_n \times b \cdot d^n + r_n
```

と変形できます。この$c_n$, $r_n$は一意に決まります。ただの書き換えになりますが，この式は次のように読みかえることができます。

```math
a=b \times c_n \cdot d^n + r_n
```

$b$で割った商が$c_n \cdot d^n$，余りが$r_n$。ただし，通常$b < r_n$だから，$r_n$を$b$で割った余りということはできません。まだ計算途中です。しかし，ひっ算の計算の1ステップは終わりました。(商が$d$進数で表される第1ステップが終了しましたが，$c_n < d$が**満たされているのか**，気になります。しかし，これは最後に議論したいと思います。)

$r_n < b \cdot d^n$だから，次は$r_n$を$b \cdot d^{n-1}$で割り商と余りを求めていきます。この余りの部分に同じ方法を用いていきます。$r_n$が$b\cdots d^{n-1}$より小さい場合は，商が0，あまり$r_{n-1}=r_n$としましょう。

```math
r_n = b \times c_{n-1} \cdot d^{n-1} + r_{n-1}
```

このように，各$d^i$の位の数$c_i$が定まることが分かります。$n=0$のときの余りを求めた時点で，この作業を終えることにすると，$a$は結局，

$a= b (c_n \cdot d^n + c_{n-1} \cdot d^{n-1} + \cdots  + c_0) + r_0$

となり，商を$d$進法で表したものと，余り$r_0$が得られる。






---
まだ編集途中
XMonadでワークスペース毎に異なる壁紙を設定する

# はじめに
記事タイトルを「XMonadでfehを使わずに壁紙を設定する方法」とかにしたかったのですが、諸事情によりできませんでした。

# 依存パッケージ
- feh
- imagemagick

「諸事情」です。

[ソース](http://hackage.haskell.org/package/xmonad-contrib-0.15/docs/src/XMonad.Hooks.WallpaperSetter.html#wallpaperSetter)をみたところ、しっかりfehを呼び出していました。

# 目的
- ワークスペース毎に異なる壁紙を設定する。
- xmonad.hs内で壁紙を管理する。

# デメリット
- 壁紙の切り替えに若干のラグを挟みます。

# メリット
- ワークスペース間で壁紙を変えることができる
- 何もかもHaskellに押し付けることで達成感を得られる

# 実装
設定する壁紙は

- ~/Pictures/wallpapers/ワークスペース番号.jpg
- ~/Pictures/wallpapers/main.jpg

です。

1.jpgはワークスペース1の壁紙、4.jpgはワークスペース4の壁紙として設定され、ワークスペースを切り替える毎に変更されます。番号のファイルがない場合はmain.jpgが設定されます。

以下が実装です。

```haskell:~/.xmonad/xmonad.hs
{-# LANGUAGE LambdaCase #-}

import Control.Monad
import Data.List
import Data.Monoid
import Data.Ord
import System.Directory
import System.Posix.Files

import XMonad.Hooks.WallpaperSetter


myLogHook :: X ()
myLogHook = setWallpaper

myWallpaperDir :: IO FilePath
myWallpaperDir = (++ "/Pictures/wallpapers/") <$> getHomeDirectory

myWallpaper :: FilePath
myWallpaper = "main.jpg"

spWallpapers :: [FilePath]
spWallpapers = map (++ ".jpg") myWorkspaces

getWallpaper :: FilePath -> IO Wallpaper
getWallpaper spwPath = do
      (doesFileExist <$> (++ spwPath) =<< myWallpaperDir) >>= \case
         True  -> return $ WallpaperFix spwPath
         False -> return $ WallpaperFix myWallpaper

setWallpaper :: X ()
setWallpaper = do
      wallpapers'  <- io $ traverse getWallpaper spWallpapers
      wallpaperDir <- io $ myWallpaperDir
      let wplist = WallpaperList $ zip myWorkspaces wallpapers'
          wpconf = (WallpaperConf wallpaperDir) wplist
      wallpaperSetter wpconf

myWorkspaces :: [WorkspaceId]
myWorkspaces = map show [1 .. 9 :: Int]
```

getHomeDirectory関数でホームディレクトリを取得できます（末尾にスラッシュがないことに注意）。

実態としては「ワークスペース毎に設定」というよりも、「該当するワークスペースに来た時に壁紙を変更する」のほうが正しいです。

# まとめ
Haskell力が少し上がった気がした。
レスポンシブ実装 について - 2019現在考え得るブレイクポイントなど

# ここでの"レスポンシブ実装"の前提

* レスポンシブレイアウトは画面の横幅で制御する
* media orientation など、画面の物理的サイズに寄り添えない手法はベースレイアウトには利用しない
* CSSパターンが4つ以上になったり、プロパティの影響範囲が瞬時にイメージできない構造は運用時に破綻するため避ける


# ユーザー環境の実態
## SP

* 1位 ： 375px
* 2位 ： 360px
* 3位 ： 320px
* 4位 ： 414px


## PC

* 1位 ： 1366px
* 2位 ： 1920px
* 3位 ： 1280px

※ ： 以上、あるサービスの一例


# 考慮すべき横幅値

* 320px ： SP縦表示の事実上の最小横幅
* 375px ： SP縦表示の現在主流の横幅
* 414px ： SP縦表示のうち大きめの端末の主流の横幅
* 768px ： Tablet縦表示の現在主流の横幅
* 808px ： SP横表示のうち大きめの端末の主流の横幅
* 896px ： SP横表示のうち大きめの端末の現状最大の横幅
* 980px ： PCデザイン基調の現状最小と言っていい横幅
* 1024px ： Tablet横表示の現在主流の横幅
* 1300px 以上 ： PCデザイン基調の次期主流になるであろう横幅


|横幅px値|端末種別|代表端末|オリエンテーション|viewport-fit||
|--:|:-:|:--|:--|:-:|:--|
|320px|SP|iPhone 3〜5|Portrait|||
|375px|SP|iPhone 6〜8<br>iPhone X<br>iPhone 11 Pro|Portrait|||
|414px|SP|iPhone 6〜8 Plus<br>iPhone XR<br>iPhone XS Max<br>iPhone 11<br>iPhone 11 Pro Max|Portrait|||
|414px|−|−|−||画像リキッドレイアウト上限 ※|
|724px|SP|iPhone X<br>iPhone 11 Pro|Landscape|contain||
|767px|−|−|−||ブレイクポイント下限 ※※※|
|768px|Tablet|iPad|Portrait|||
|808px|SP|iPhone XR<br>iPhone XS Max<br>iPhone 11<br>iPhone 11 Pro Max|Landscape|contain||
|812px|SP|iPhone X<br>iPhone 11 Pro|Landscape|cover||
|834px|Tablet|iPad Pro 10.5<br>iPad Air 3rd|Portrait|||
|896px|SP|iPhone XR<br>iPhone XS Max<br>iPhone 11 Pro Max|Landscape|cover||
|979px|−|−|−||ブレイクポイント上限 ※※|
|980〜1000px|PC|PC下限|−|||
|1024px|Tablet|iPad|Landscape|||
|1112px|Tablet|iPad Pro 10.5<br>iPad Air 3rd|Landscape|||
|1300px 以上|PC|PC<br>リキッドレイアウト|−|||

* ※ ： 延伸するリキッドレイアウト画像が414pxを超過すると可読性は悪化し始める
* ※※ ： ブレイクポイント値の選択肢の一つ。PCデザインの最小幅未満にSPデザインを適用する
* ※※※ ： ブレイクポイント値の選択肢の一つ。タブレットのポートレートモード以上のすべての横幅にPCデザインを適用する


# 2018〜2019年現在の課題

* iPhoneX〜11シリーズのように、Viewportのアスペクト比が大きい細長い画面のスマホが存在すること
* スマートフォンの横幅の最大値がランドスケープモードにおいて 896px と、非常に大きくなっていること


# 細長いViewportのLandscape表示の現状

* ランドスケープ表示は、あまり利用されてないにもかかわらず**実装上**の対応は**必要**
* 単純なリキッドレイアウトでは基本的になんでも横幅いっぱい延伸する
* 単純なリキッドレイアウトでは画像表現は横幅いっぱいに**縦横ともに拡大**する
* 何を見ているか、何が表示されているかが**判別できない**
	* **UX**が**悪化**する


## 対策案

* センタリングレイアウトオブジェクトについては、**リキッドレイアウトに上限**を設けて、画像などを拡大しすぎない
* SP解像度の増大を考慮し、**ブレイクポイント**はなるべく**大きめ**に取る
* SP解像度の増大による解像度の多様化を考慮し、現在は**ブレイクポイント**の設定は**1つ**に制限し実装の**複雑化を抑止**する


## 著者の個人的なガイドライン

* センタリングするリキッドレイアウトは **Max 400px**
* ブレイクポイントを1つ設定する場合<br>（リキッドレイアウト／PCレイアウト）
	* PCデザインが1000px基調以上であれば **990px**
	* PCデザインが1000px基調以下であれば、 **PC横幅 - 10px** 程度のキリの良い値
* ブレイクポイントの**2つ以上**の設定はなるべく**避ける**
【Ruby on Rails 2019/4】 その他 機能 メソッド

#目次

+ 降順・昇順の並び替え(orderメソッド)
+ ページネーション(kaminari)
+ データをいくつ取得するか指定する(limitメソッド)
+ 条件に当てはまるレコードがテーブルに保存されていればそのレコードのインスタンスを取得できる(first_or_initializeメソッド)
+ 

###■昇順、降順の並び替え (orderメソッド)
一覧表示などでよく使われます。投稿日時を最新の日時で並び替えたり使い方は様々です。
コントローラーのindexメソッドなどに定義することが多いかもしれません。
降順 DESC
昇順 ASC

```:posts_controller.rb
def index
 @posts = Post.all.order("created_at DESC")
end
```
created_atは、作成された日時なので 降順 DESC で新しい投稿が上にくるようにできます。

```:posts_controller.rb
@posts = Post.order("created_at DESC")
```
補足ですが、　.all　を省略することもできます。
###■ページネーション(kaminari)
ページネーションとは、ページの下部にページ数を表示することができます。
GemfileにGemを追記してインストールします。

```:Gemfile
gem 'kaminari'
```
追記が終わったらターミナルで下記を実行します。

```
$ bundle install
```
次にコントローラに以下を追記します。

```:posts_controller.rb
.page(params[:page]).per(3)
```
per（）の中は表示される記事数なので、3以上にする場合は変更してください。

```:posts_controller.rb
def index
    @posts = Post.all.order("created_at DESC").page(params[:page]).per(3)
end
```
これで、インスタンス変数に代入することができましたので、ビューに表示させます。ビューの表示させたい部分に以下を追記してください。

```:index.html.erb
<%= paginate @posts %>
```
ブラウザで確認すると表示されているかと思います。
###データをいくつ取得するか指定する(limitメソッド)
例えば、一覧表示のデータを10件取得し、表示する場合

```:〇〇controller
def index
 @posts = post.all.limit(10)
end
```
###条件に当てはまるレコードがテーブルに保存されていればそのレコードのインスタンスを取得できる(first_or_initializeメソッド)

```
post = Post.where(条件).first_or_initialize
#重複しないようにするメソッド
post.text = 本文
#textカラムの値を更新する
post.save
#保存する
```
テーブル名が自動的に複数形になる


Qiita初投稿です。

#取り組んでいた箇所
新規投稿フォームを作成後、Migrationでテーブルを作成しデータを保存するといった部分。
教材を参考にしてコードを書いて行き、フォームにデータを入力し、更新ボタンをクリック！

ここでエラーが！！

```
SQLSTATE[42S02]: Base table or view not found: 1146 Table`データベース名.テーブル名`~
```

※僕の場合はワインのサイトを作成していたので、
 「データベース名/テーブル名」部分は→「mywine/wine」で作成していました！

エラーの内容自体は「参照しにいったテーブルがないですよー」とのこと。

もう少しよく見てみるとエラーに表示されているのは
「mywine/winesのテーブルなんてないよ〜」でした。

？？？

なぜ　**wine** ではなくて　**wines**　を参照しにいってるの？？

答えがこちら↓


#自動的にテーブルを複数形にされる
>Flightモデルにどのテーブルを使用するか、Eloquentに指定していない点に注目してください。他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。今回の例で、EloquentはFlightモデルをflightsテーブルに保存します。モデルのtableプロパティを定義し、カスタムテーブル名を指定することもできます。
[Laravel 5.4 Eloquent：利用の開始](https://readouble.com/laravel/5.4/ja/eloquent.html)

簡単に言うと、「Laravelはテーブル名を明示的に指定していない場合、Modelのクラス名に対して複数系の名前でデータベースにテーブルを探しに行く」ということらしいです。

#解決方法

なぜ複数形になるのか仕組みが理解できたので、今回は、

```
php artisan migrate:rollback
```

でwineテーブルを取り消し、新たにwinesテーブルを作る。
これだけで解決しました。

#感想（おまけ）

前述の通り、教材を参考に自分のサイトを作成していました。
その教材ではサンプルで、ニュース投稿フォームを作成しており、テーブル名は「news」でした。
こちらは元々テーブル名が複数形なので問題なかったということですね！

・どういう処理が行われているのか、どこからどこが呼び出されているかがわかっていなかった
・データベースの構造
など、理解が甘かったので時間がかかりました。
基礎的なことが理解できていればもっと早く解決できたと思います。
Power BI 勉強帳：最大値を色付けする

先日の勉強会で質問があったので、やり方を考えてみました。
他にもっとスマートな方法や説明があるのではないかとは思いますが、自分の勉強として。

##やりたいこと
ある分類について、最大値を色分けしたい。（多分、こういうことだと思います）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/c51999fd-4cdd-8cca-fd50-ad896b004558.png)

##考え方

1. 分類の表に対して「最大値か／それ以外か」を区別する列（ISMAX列）をつくる
2. グラフの場合「凡例」にISMAX列を適用する
3. 表の場合、「条件付き書式」で「ルール」を選択し、ISMAX列を条件に適用する

##1. 分類の表に対して「最大値か／それ以外か」を区別する列（ISMAX列）をつくる

前提として、数値の合計をメジャーとしてつくっておきます。

```
数値SUM = SUM('テーブル'[数値])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/d4a534c5-8e02-cf77-0db0-8d5f488a8bb1.png)


次に、分類のマスタとなる表があると思うので、そちらに計算列として「ISMAX列」を追加します。

```
ISMAX = 
 if(
    [数値SUM]=MAXX('分類マスタ',[数値SUM]),
    true,
    false
    )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/d42f5965-7c7c-d08b-3e9d-b027f2b97cbc.png)


評価する式の、左辺は各行ごとの数値合計、右辺は最大値を表します。
MAXXの末尾の「X」は行ごとに評価するという意味で、分類マスタの行ごとに計算した結果の最大値を返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/b2e08001-7b0a-9e1c-928e-439bf349e94b.png)


分解するとこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/ceb2e0a4-0e42-9252-a8c1-0926e6fe2b5c.png)

##2. グラフの場合「凡例」にISMAX列を適用する
図のように、ISMAX列を「凡例」に追加します。
［追記］積み上げ棒グラフを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/43da113b-dd68-f9a4-53a4-8b8bc471990b.png)

このようなグラフの塗り分けは、下記のhrkasnoさんの記事が詳しいです。
https://qiita.com/hrkasno/items/a472d7094d2b862f0eed
hrkasnoさんは他にもグラフの見せ方について沢山記事を書いて見えて、どれもすごく参考になります！

##3. 表の場合、「条件付き書式」で「ルール」を選択し、ISMAX列を条件に適用する

表の場合、「true,false」だとうまくできなかったので、「1,0」という数値にしました。

```
ISMAX2= 
 if(
    [数値SUM]=MAXX('分類マスタ',[数値SUM]),
    1,
    0
    )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/ae940c79-396a-59cf-7058-714cb1e36586.png)

現在のPower BIでは、表に含まれないフィールドに基づく書式設定ができるようになっています。便利！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/b6db2f98-e68f-f582-fdef-115475a77985.png)


条件付き書式を設定するには、設定したいフィールド名を右クリックするか、下向き三角をクリックし、条件付き書式を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/c9a70c3b-94eb-b4da-731b-188b191db715.png)


設定画面で、「ルール」を選び、フィールドISMAX2について、合計が1の場合に好きな色になるようルールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/78cfab45-c503-8265-8076-9f5a643d4bd2.png)

「概要」は日本語だとわかりにくいですが、英語だと「summarization」で、評価する値を1つ算出するための計算方法を選ぶ欄と言えばいいでしょうか。今回はもともと評価対象の値が1つずつ（1か0）なので、合計でなく、平均、最大値、最小値などを選んでも結果は同じになります。

こういったラベルは、英語の方が直感的に分かりやすく、私はよくわからなかったら英語にしてみるということをたまにします。（英語力もさほど無いのでアレですが…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/b87eee7b-a3e4-4630-b86d-164a1a91925d.png)

##最後に
色分けはひと手間掛かるのですが、レポートがぐっと見やすくなることがあり便利ですね！

自分の場合ですと、利用者がExcelに慣れている文化があり、表が求められる事が多いのですが、数字だけだと1目で分かりにくいので、必ずデータバーなどを足して使っています。

もう1歩踏み込むと、Power BIでは、Excelより少ない手間でより多くの表現ができるので、今までは「最大値を色分けする」という表現方法だったけれども、本当に一目で表現したいことに対して、もしかしたら別の見せ方ができるかもしれないな、という目で検討してみるのもいいんじゃないかなと思います。
まだreact-reduxで消耗してるの？（unstatedに移行した話）

## reduxやめた理由

- とりあえずはトレンドにのる派くらいの理由でreduxを使っていたが、コード量やファイル数がやたら増えて嫌な感じだった
    - めんどくさくなって結局ほとんどをlocalなstateで管理していた
- 対象案件が趣味の個人開発だったので、大規模開発ではなく、スピード重視で進めたかった

## [unstated](https://github.com/jamiebuilds/unstated)にした理由

- なんとなく目に止まってスター数が多かったから（2019.4.22時点で6,000over）
    - スター数のわりに英語・日本語ともにまだ情報少なめな気もする。ただ、作りがシンプルなのでそこまでみんな困っていないのかも
    - エコシステム的にはまだまだこれから感はある
- ※後悔はしていない

## やったこと

- [公式github](https://github.com/jamiebuilds/unstated)の説明を読む
- reduxの`actions`とか`containers`とか`reducers`とかを、unstatedでいうところの`Container`にまとめる
    - reduxの`containers`で`mapStateToProps`とか`mapDispatchToProps`していた部分をunstatedの`Container`に移植するイメージ
- reduxの`components`を上記で作った`Container`を`Subscribe`して動くように修正する
    - HOCでラップするイメージだけど、軽くぐぐった感じ使いまわせそうなのがなかったので、一旦はゴリゴリ書いてみた
    - renderにすべて書いている場合は楽だけど、あまりそういうケースも多くないので、結局のところ[こちらの記事](https://qiita.com/kaba/items/b05f680f850dd46548f3#%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E6%AE%8B%E5%BF%B5%E3%81%AA%E3%81%A8%E3%81%93%E3%82%8D)で書かれている通り、既存のcomponent全体を`Subscribe`でラップする感じになると思う
- componentのimport元をreduxの`containers`からunstatedで動くようにした`components`に変更
- コードとファイル数が減って(ﾟдﾟ)ｳﾏｰ
    - 個人開発でredux使っている部分はあまり多くなかったので半日とかで移行できました

## 移行して思ったこと

- 個人開発や小規模プロジェクトであればunstatedで十分
    - シンプルで学習コスト低め
- 今後のエコシステム拡大に期待
    - unstated-debugなるものもあるけど、reduxだとchromeのpluginあったり、まだそこまでではない感がある
Markdownの強調記法の解釈についてちょっと調べた（GitHub編）

# はじめに

誰もが一度はマークダウン（Markdown）の処理系の自作を考えると思います。
最近、私も例に漏れずひそかに制作に着手しました[^1]。

普段なんとなく使っている記法でも、よくよく考えてみるとどうやって処理すればよいか、なかなか思いつかないこともあるでしょう。そんな時は、既存の処理系がマークダウンの記述をどう解釈しているか調べてみると、参考になるかもしれません。

ということで、今回は強調記法（ `*` とか `**` で囲むやつ）のGitHubのマークダウンにおける解釈を調べてみました。

# マークダウンの強調記法について

改めて書く必要はないかもしれませんが、念のため。

* 強調
  * `*` で囲まれた箇所は emタグで囲まれた部分に変換されます。
  * emタグで囲まれた部分はブラウザでは *斜体* で表示されます。 
* 強い強調
  * `**` で囲まれた箇所はstrongタグで囲まれた部分に変換されます。
  * strongタグで囲まれた部分はブラウザでは **太字** で表示されます。 
* em + strong
  * `***` で囲まれた箇所はemタグとstrongタグの両方で囲まれた部分に変換されます。

# GitHubのマークダウンにおける強調記法の解釈

## 変換前

```
ケース1: *a*

ケース2: **a**

ケース3: ***a***

ケース4: ***a**a*

ケース5: ***a*a**

ケース6: **a*a*

ケース7: ***a*a*a*

ケース8: ****a*a*a*a*

ケース9: *a*a*a***

ケース10: ****a**a**

ケース11: ******a**a**a**

ケース12: ********a**a**a**a**

ケース13: **a**a**a******
```

## 変換後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126305/cb2483d2-c937-07dc-38c5-c19450055ff5.png)

```
<p>ケース1: <em>a</em></p>
<p>ケース2: <strong>a</strong></p>
<p>ケース3: <em><strong>a</strong></em></p>
<p>ケース4: <em><strong>a</strong>a</em></p>
<p>ケース5: <strong><em>a</em>a</strong></p>
<p>ケース6: **a<em>a</em></p>
<p>ケース7: <em><em><em>a</em>a</em>a</em></p>
<p>ケース8: <em><em><em><em>a</em>a</em>a</em>a</em></p>
<p>ケース9: <em>a</em>a<em>a</em>**</p>
<p>ケース10: ****a<strong>a</strong></p>
<p>ケース11: <strong><strong><strong>a</strong>a</strong>a</strong></p>
<p>ケース12: <strong><strong><strong><strong>a</strong>a</strong>a</strong>a</strong></p>
<p>ケース13: <strong>a</strong>a<strong>a</strong>****</p>
```

## 考察

ケース1~3は通常の使い方での強調記法です。
ケース3を見ると、emタグの内側にstrongタグという順番になっています。
ケース4,5を見ると、 同じ `***` で始まるケースでも、後ろの書き方次第でemタグとstrongタグの順番が入れ替わっていることがわかります。
ケース6~8を見ると、emタグの入れ子は2重の時はうまく変換できないようです。3重、4重はうまく変換できています。
ケース9はケース7を逆順で書いたものですが、これはうまく変換できないようです。
ケース10~13はケース6~9をstrongタグが使われるように書き換えたものです。結果はemタグの時と同じでした。
処理系を困らせるような書き方はいくらでも思いつきそうですが、今日のところはこの辺にしておきましょう。

# まとめ
GitHubのマークダウンの強調の解釈について挙動を調べました。

どう実装されているか知るには、ソースコードを見るのが一番の近道だと思いますが、自力でどこまでできるか試したいので、今回は挙動を調べるだけにとどめておきます。

記法をどう解釈するかや、どこまで記法に対応するかなど作者依存なことろもあるので、この調子で *私の考える最強のマークダウン処理系* を作っていこうと思います[^1]。

ちなみに、上で示したケースをQiitaに書くと次のようになります。
GitHubと全然違いますよね。

ケース1: *a*

ケース2: **a**

ケース3: ***a***

ケース4: ***a**a*

ケース5: ***a*a**

ケース6: **a*a*

ケース7: ***a*a*a*

ケース8: ****a*a*a*a*

ケース9: *a*a*a***

ケース10: ****a**a**

ケース11: ******a**a**a**

ケース12: ********a**a**a**a**

ケース13: **a**a**a******

[^1]: 完成するかは神のみぞ知る...
MATLAB simulinkで行列を分解する小技

# simulinkでのベクトルの分解

1次元ベクトルならばDemuxというブロックを用いて分解できます。

もっと言うとDemuxの出力数が入力のベクトルの倍数ならきちんと等倍してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/c256f4cb-6b7b-1820-d0bb-535b69f19a70.png)

等倍できない場合はこんな感じに末尾が足りない感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/7840ce15-7b5f-aa8d-2c56-c9dd71fcd1af.png)

# simulinkでの行列の分解

しかし，行列はDemuxでは分解できません。
concatenateで結合はできるのに，です。


従って例えば縦方向に分解したい時などは小技として次のようにベクトルをかけて縦列を取り出します。横列がほしければその転置を書けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/0c444008-7f73-b21e-09e6-fc7c547ba387.png)

# 参考情報
- Demux：https://jp.mathworks.com/help/simulink/slref/demux.html?searchHighlight=demux&s_tid=doc_srchtitle
- Concatenate： https://jp.mathworks.com/help/simulink/slref/vectorconcatenate.html
terraformでAWS WAFを利用してCloudFrontのELBオリジンへ直接アクセスを制限

[こちら](https://dev.classmethod.jp/cloud/aws/restrict-elb-origin-awswaf/)の記事のterraform版

```
# cloudfrontにカスタムヘッダーを付与して、ALBではそのヘッダーが付いていなければblockする

resource "aws_cloudfront_distribution" "cf" {
  ~略~
  origin {
    ~略~
    custom_header {
      name  = "${lookup(var.cf_custom_header_key, "${terraform.workspace}.value")}"
      value = "${lookup(var.cf_custom_header_value, "${terraform.workspace}.value")}"
    }
  }
}

resource "aws_wafregional_byte_match_set" "cloudfront_custom_header_match" {
  name = "cloudfront_custom_header_match"

  byte_match_tuples {
    text_transformation   = "NONE"
    target_string         = "${lookup(var.cf_custom_header_value, "${terraform.workspace}.value")}"
    positional_constraint = "CONTAINS"

    field_to_match {
      type = "HEADER"
      data = "${lookup(var.cf_custom_header_key, "${terraform.workspace}.value")}"
    }
  }
}

resource "aws_wafregional_rule" "block_ignore_cloudfront" {
  name        = "block-ignore-cloudfront"
  metric_name = "blockignorecloudfront"

  predicate {
    data_id = "${aws_wafregional_byte_match_set.cloudfront_custom_header_match.id}"
    negated = false
    type    = "ByteMatch"
  }
}

resource "aws_wafregional_web_acl" "block_ignore_cloudfront_alc" {
  name        = "block-ignore-cloudfront-alc"
  metric_name = "blockignorecloudfrontalc"

  default_action {
    type = "BLOCK"
  }

  rule {
    action {
      type = "ALLOW"
    }

    priority = 1
    rule_id  = "${aws_wafregional_rule.block_ignore_cloudfront.id}"
  }
}

resource "aws_wafregional_web_acl_association" "block_ignore_cloudfront_attach_alb" {
  resource_arn = "xxxxxxxxxxxxxxxxxxxx"
  web_acl_id   = "${aws_wafregional_web_acl.block_ignore_cloudfront_alc.id}"
}

```
[RNN] RNNとは何ですか？

#1. 言語モデル
私はRNNに基づく言語モデルを提示します。2つの形式を持つ言語モデルの応用。 1つは、実際の類似性に基づいて文の正確性を評価することです。この評価は文法の正確さと文の意味を評価するのに役立ちます。これらのモデルは、機械翻訳システム（Machine Translation）でよく使用されます。2つ目は自動テキスト生成です（私はこのアプリがより魅力的だと思います）。たとえば、シェイクスピアの作品を使ったモデルトレーニングによって、シェイクスピアが書いたような文章を作成することができます。さらに、時間があれば、Andrej Karpathyによるこの興味深い[記事](https://karpathy.github.io/2015/05/21/rnn-effectiveness/)（英語）を参照して、語彙レベルの言語モデルの機能について調べることができます。

この記事は、ニューラルネットワークの基本を知っておくためのものです。ニューラルネットワークについてよく知らない場合は、記事基本的な[ニューラルネットワークのインストール](http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/)をお読みください 。その記事はあなたがそのアイデアの基本的なアイデアとどのように基本的なニューラルネットワーク - 非回帰ニューラルネットワークを構築するかを得るのを助けるでしょう。

#2. RNN回帰ネットワークとは何ですか？
RNN（Recurrent Neural Network）の主な目的は、一連の情報を使用することです。従来のニューラルネットワークでは、すべての入力と出力は互いに独立しています。つまり、それらは互いにリンクしていません。しかし、これらのモデルは多くの問題には適していません。たとえば、文中に現れる可能性のある次の単語を推測したい場合、前の単語がどのようにして手配されるかがわかるのが大事です。RNNは、以前の計算に応じて出力が文字列のすべての要素に対して同じタスクを実行するため、Recurrentと呼ばれます。言い換えれば、RNNは以前に計算された情報を記憶することができます。理論的には、RNNは非常に長い文書の情報を使用することができますが、実際には、それは数ステップ前にしか覚えていません。基本的に、RNNネットワークは次のようになります。
![rnn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344186/760b4a07-fb89-8a71-2b7f-39bdfc33ae0c.jpeg)
RNN (Recurrent Neural Network)とそのフォワード計算に関わる計算の時間的展開。ソース：Nature

上記のモデルはRNNのコンテンツ展開について説明しています。ここで展開することは、単純にシリアルシーケンスニューラルネットワークを描くことによって理解することができます。たとえば、「私は学生です」という４語の文章がある場合、展開されたニューラルネットワークは各文字に対応する４つのニューロンで構成されます。そのとき、RNN内の計算は次のように行われます。

- `ｘ(t)`はステップ`ｔ`における入力である。 たとえば、`x(1)`は文の2番目の単語（は）に対応するワンホットベクトル(one-hot vector)です。
- `ｓ(t)`はステップ`ｔ`における隠れ状態である。 それはネットワークの**記憶**です。 `ｓ(t)`は、前の非表示状態とそのステップでの入力の両方に基づいて計算されます:![Screenshot from 2019-04-21 22-27-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344186/4565338b-0d18-d316-3b88-2c87333e2e8f.png)。 関数fは通常双曲線`tanh`や`ReLu`のような非線形関数です。 最初の隠し要素を計算するためには、`s(0)`を初期化する必要があります。通常、初期値は0に設定されています。
- `ｏ(t)`はステップ`ｔ`における出力である。 たとえば、文中に出現する可能性がある次の単語を予測する場合、`ｏ(t)`はボキャブラリリスト内の単語を識別するベクトルです:![Screenshot from 2019-04-21 22-37-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344186/2bd127bb-85ea-41f5-6130-1bcbc77e1a9f.png)。

#3. RNNの能力
自然言語処理（NLP  -  Natural Language Processing）の分野では、さまざまな問題についてRNNの多くの成功が記録されています。 この時点で、最も一般的に使用されているRNNのモデルの1つにLSTMがあります。 LSTM（Long Short-Term Memory）は、従来のRNNモデルよりも多くのステップを思い出すことができるという点で優位性を示しています。 LSTMは基本的に従来のRNNの構造と同じなので、あまり心配する必要はありません。隠れノードの計算が異なるだけです。 次の記事でLSTMについての詳細を見ます。

#4. RNNのトレーニング
RNNネットワークのトレーニングは、従来のニューラルネットワークと似ていますが、バックプロパゲーション(backpropagation)は少し変更する必要があります。 RNNネットワーク内のパラメータはネットワーク内のすべてのステップで共通に使用されるため、各出力での導関数はそのステップでの計算だけでなく前のステップにも依存します。たとえば、t = 4で導関数を計算するには、3つのステップすべてを前方に展開し、それらの導関数を合計する必要があります。このタイプの導関数の計算は、バックワードプロパゲーション（BPTT  -  Back Propagation Through Time）と呼ばれます。ステップの依存度が高ければ高いほど、導関数の問題（消失/爆発）が発生するため、学習が困難になることを忘れないでください。この問題を解決するために提案されたいくつかの方法があり、現在のRNNネットワークタイプはLSTMのようにそれらを排除するように設計されています。
#5. 結論
RNNの基本とその能力を説明しました。私の記事を読んでくれてありがとうございます。
【Windowsバッチ】コマンド実行結果を環境変数に代入する方法

ちょっとバッチを書いていてこれは知ってると便利！と思ったのでメモ。

LinuxのBashシェルなどでこのように書く処理

```bash:Bashの場合
# hoge.txtの行数を取得してLINECOUNTに代入するコマンド
LINECOUNT=`wc -l hoge.txt`
echo $LINECOUNT
```

実はWindowsバッチでも同じようなことができる。

```shell:Windowsバッチの場合
rem hoge.txtの行数を取得してLINECOUNTに代入するコマンド
for /f "usebackq" %%A in (`type hoge.txt ^| find /c /v ""`) do set LINECOUNT=%%A
echo %LINECOUNT%
```

め、面倒臭え……。
素直に「変数=\`コマンド\`」じゃいかんのかと思うけどこう書くらしい。
また「\`コマンド\`」内でパイプ「|」を使う場合はエスケープが必要で「^|」と書く。

ちょっと応用して、指定したフォルダ下にあるテキストファイルの名前、行数、サイズのリストを取得するバッチの例。

```shell:Windowsバッチの場合
rem 入出力設定
set DIR=%~dp0data
set OUTPUT=%dp0count.txt
if exist %OUTPUT% del %OUTPUT%

rem カウント出力処理
setlocal enabledelayedexpansion
for /f "usebackq" %%I in (`dir /b %DIR%`) do (

    rem ファイル行数を代入
    for /f "usebackq" %%J in (`type %DIR%\%%I ^| find /c /v ""`) do set LINECOUNT=%%J

    rem ファイルサイズを代入
    for %%K in (%DIR%\%%I) do set SIZE=%%~zK

    rem ファイル名、行数、サイズを出力
    echo %%I    !LINECOUNT!    !SIZE!>> %OUTPUT%
)
```

バッチのfor文内で環境変数を展開する場合は「setlocal enabledelayedexpansion」の指定が必要になる。
また環境変数の展開は「%変数%」ではなく「!変数!」となる。