OmniAICreator/Qiita-1.07M huggingface dataset:
How-to: OpenSSL を使用してファイルを RSA 暗号化する

> [!NOTE]
> この記事は 2012/10/14 に [momoto.github.io](http://momoto.github.io/) へ投稿した内容を Qiita へ移行してきたものです

OpenSSL は様々な暗号方式による暗号化および復号化をサポートするセキュリティライブラリで、使用可能な暗号方式は `openssl ciphers` で確認できます。

RSA暗号方式の 暗号化、復号、署名、検証 を利用する場合は `openssl rsautl` を使用します。

## 暗号化

ファイルをRSA暗号方式で暗号化するには、秘密鍵または公開鍵のいずれかが必要になります。


```bash:秘密鍵“private_key”を使用して、ファイル“plain.txt”を暗号化する
$ openssl rsautl -encrypt -inkey private_key -in plain.txt -out encrypted
Enter pass phrase for private_key:

## 秘密鍵にパスフレーズが設定されていればパスフレーズの照合が必要です
```

```bash:公開鍵“public_key”を使用して、ファイル“plain.txt”を暗号化する
$ openssl rsautl -encrypt -pubin -inkey public_key -in plain.txt -out encrypted

## -pubin のオプションを加えることに注意します
```

上のコマンドで暗号化した場合、encrypted という名前でバイナリファイルとして出力されます。`unable to load Public Key` とエラーになってしまう場合は、鍵の形式が無効です。使用できる公開鍵は次のような形式です。

```
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM2twTjVLOYMK2Y7uKQ03CeSc8B+0GjJ
xy0ir28fIfGb523ogDyWKDjMDx5pTBUpOgDYUgSpP/I6SzER1ArhcnMCAwEAAQ==
-----END PUBLIC KEY-----
```

## 復号

暗号化されたファイルを復号するには、秘密鍵が必要です。

```bash:秘密鍵“private_key”を使用して、暗号化されたファイル“encrypted”を復号する
$ openssl rsautl -decrypt -inkey private_key -in encrypted -out decrypted.txt
Enter pass phrase for private_key:

## 復号に成功すると、“decrypted.txt”にその内容が出力されます
```
How-to: Iconv をつかって文字コードを変換する

> [!NOTE]
> この記事は 2012/10/08 に [momoto.github.io](http://momoto.github.io/) へ投稿した内容を Qiita へ移行してきたものです

文字コードを変換するためには、 `iconv` のオプション `--from-code (-f)` に変換前の文字コードを、`--to-code (-t)` に変換後の文字コードを、さらに入力ファイルと出力ファイルを指定します。

例えば、Windows で作成したテキストファイル（SJIS-WIN）を UTF-8 へ変換したい場合は次のようなコマンドになります。

```bash
iconv -f SJIS-WIN -t UTF-8 coded_in_sjiswin.txt > coded_in_utf8.txt
```

扱える文字コードについては `iconv --list` で一覧を出力できます。日本語に関連しそうな行に見当をつけて、制限して表示してみると次のような出力でした。

```bash:
iconv --list | grep -iP "ja|jp"

  CSEUCPKDFMTJAPANESE//
  CSISO2022JP//
  CSISO2022JP2//
  EBCDIC-JP-E//
  EBCDIC-JP-KANA//
  EUC-JP-MS//
  EUC-JP//
  EUCJP-MS//
  EUCJP-OPEN//
  EUCJP-WIN//
  EUCJP//
  ISO-2022-JP-2//
  ISO-2022-JP-3//
  ISO-2022-JP//
  ISO646-JP-OCR-B//
  ISO646-JP//
  ISO2022JP//
  ISO2022JP2//
  JP-OCR-B//
  JP//
```

## 参考

- [テキストファイルの文字コードを変換するには - Ubuntu Japanese Wiki](https://wiki.ubuntulinux.jp/UbuntuTips/FileHandling/ConvertTextfileCharacterEncoding)
How-to: Libvirtを用いて仮想マシンを構築する

> [!NOTE]
> この記事は 2012/08/04 に [momoto.github.io](http://momoto.github.io/) へ投稿した内容を Qiita へ移行してきたものです

virt-install を使って CUI から仮想マシンのディスクイメージを作成します。

動作要件として、ホストOS にハイパーバイザ（KVMやXen）と libvirt がインストールされていて、libvirtd が起動している必要があります。virt-install 自体は、RPM では `python-virtinst` パッケージに含まれています（参考：[RPM resource virt-install](http://rpmfind.net/linux/rpm2html/search.php?query=virt-install)）。

virt-install のオプションには仮想マシンに割り当てるリソースなどを指定します。例えば、仮想マシン名は「myvirtualmachine」、インストールイメージには [kddilabs.jp](ftp://ftp.kddilabs.jp/Linux/packages/CentOS/) のミラーが配布している CentOS6.3 [x86_64] を指定した準仮想化ゲストOS を /var/lib/libvirt/images/myvirtualmachine.img に作成する場合は次のようなオプションになります。

```bash
virt-install \
  --name=myvirtualmachine \
  --ram=512 \
  --vcpus=1 \
  --paravirt \
  --location='ftp://ftp.kddilabs.jp/Linux/packages/CentOS/6.3/os/x86_64/' \
  --file=/var/lib/libvirt/images/myvirtualmachine.img \
  --file-size=8 \
  --nographics \
  --keymap=jp106
```

また `--prompt` オプションを使うと対話的に各項目を指定することができます。

```bash
virt-install --prompt

  Would you like a fully virtualized guest (yes or no)? This will allow you to run unmodified operating systems.
  // 完全仮想化を行うかどうか（noで準仮想化）
    no

  What is the name of your virtual machine?
  // 仮想マシンの名称
    myvirtualmachine

  How much RAM should be allocated (in megabytes)?
  // 仮想マシンに割り当てるメインメモリの容量
    512

  What would you like to use as the disk (file path)?
  // イメージディスクのファイルパス
    /var/lib/libvirt/images/myvirtualmachine.img

  How large would you like the disk (/var/lib/xen/images/centos-6.3-x86_64.img) to be (in gigabytes)?
  // イメージディスクに割り当てる容量
    8

  Would you like to enable graphics support? (yes or no)
  // グラフィクスサポートを有効にするかどうか
    no

  What is the install CD-ROM/ISO or URL?
  // ISOイメージのファイルパス、または配布元のURL
    ftp://ftp.kddilabs.jp/Linux/packages/CentOS/6.3/os/x86_64/
```

`--nographics` オプションを指定していれば、テキストユーザインタフェースでゲストOSのインストールが始まります。ゲストOSとのコンソール接続を終了する場合は `Ctrl + ]` でホストOSへ戻ることができます。

## 参考

- [libvirt 仮想化ライブラリーの徹底調査 | IBM developerWorks](https://www.ibm.com/developerworks/jp/linux/library/l-libvirt/)
- [仮想化ゲストインストールの概要 | Red Hat Product Documentation ](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/5/html/virtualization/chap-virtualization-virtualized_guest_installation_overview)
How-to: Android 端末を検出するために udev ルールを追加する

> [!NOTE]
> この記事は 2012/08/02 に [momoto.github.io](http://momoto.github.io/) へ投稿した内容を Qiita へ移行してきたものです

デバイス管理ツール udev を使用している Linux システムで、USB 接続した Android 端末を検出できない場合、USBベンダーID ごとに udev ルールを加える必要があります。

例えば、USBベンダーID が `0bb4` になる HTC の端末を検出する場合、次の内容のファイルを 51-android.rules として /etc/udev/rules.d に追加します。

```:/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"
```

各メーカーに対応する USBベンダーID は [developer.android.com](https://developer.android.com/studio/run/device?hl=ja) で確認することができます。

また、/etc/udev/rules.d は読み取り可能である必要があります。以下のコマンドは、すべてのユーザーに対してファイルの読み取りを許可します。

```:/etc/udev/rules.d/51-android.rules
$ sudo chmod a+r /etc/udev/rules.d/51-android.rules
```

USB 接続した Android 端末を検出できているかどうかは、`lsusb` または Android SDKに含まれる `adb` コマンドで確認します。

```:lsusbで確認する
$ lsusb

  Bus 002 Device 008: ID 0bb4:0c8d High Tech Computer Corp. EVO 4G (debug)
```

```:adbで確認する
$ ~/android-sdks/platform-tools/adb devices

  List of devices attached 
  SHTBB106827 device
```

`adb` から検出できるようになれば、Eclipse プラグイン ADT の「Device Chooser」からも同様に認識されるはずです。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/58/25ac9000-386b-eb5a-e62d-a3627ec508e2.png)

## 参考

- [ハードウェア端末上でアプリを実行する | developer.android.com](https://developer.android.com/studio/run/device?hl=ja)
Ruby - no such file to load

> [!NOTE]
> この記事は 2012/08/01 に [momoto.github.io](http://momoto.github.io/) へ投稿した内容を Qiita へ移行してきたものです

## no such file to load — curses (LoadError)

```bash:RPM
sudo yum install ncurses-devel
```

```bash:APT
sudo apt-get install ncurses-dev
```

## no such file to load — readline (LoadError)

```bash:RPM
sudo yum install readline-devel
```

```bash:APT
sudo apt-get install libreadline6 libreadline6-dev
```

## no such file to load — openssl (RuntimeError)

```bash:RPM
yum install openssl-devel
```

```bash:APT
sudo apt-get install libssl-dev
```

## no such file to load — zlib

```bash:RPM
sudo yum install zlib-devel
```

```bash:APT
sudo apt-get install zlib1g-dev
```

## cannot load such file — rubypython (LoadError)

```bash:RPM
sudo yum install python-devel
```

```bash:APT
sudo apt-get install python-dev
```
Rubyで言語処理100本ノック 第1章:準備運動 (06 ~ 09)

[言語処理100本ノック] (http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。

[前回までの挑戦](https://qiita.com/mamem/items/be3c188056548e16856b)


配列の集合演算に関して、以下の記事を参考にさせていただきました。
ありがとうございます！
[rubyのArrayで集合（和集合・積集合・差集合・対称差集合・補集合）](https://qiita.com/namitop/items/be11c007da456ea95735)

# 06. 集合
> "paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を，
それぞれ, XとYとして求め，XとYの和集合，積集合，差集合を求めよ．
さらに，'se'というbi-gramがXおよびYに含まれるかどうかを調べよ．

``` ruby
class Array
  def ngram(n)
    self.each_cons(n).map(&:join)
  end
end

word1 = "paraparaparadise"
word2 = "paragraph"

X = word1.chars.ngram(2)
Y = word2.chars.ngram(2)

# 和集合
puts X | Y
# 積集合
puts X & Y
# 差集合
puts X - Y

puts X.include? "se"
puts Y.include? "se"
```

``` ruby:結果
# X
["pa", "ar", "ra", "ap", "pa", "ar", "ra", "ap", "pa", "ar", "ra", "ad", "di", "is", "se"]
# Y
["pa", "ar", "ra", "ag", "gr", "ra", "ap", "ph"]
# 和集合
["pa", "ar", "ra", "ap", "ad", "di", "is", "se", "ag", "gr", "ph"]
# 積集合
["pa", "ar", "ra", "ap"]
# 差集合
["ad", "di", "is", "se"]

# Xに "se" が含まれるか
true
# Yに "se" が含まれるか
false
```

# 07. テンプレートによる文生成
> 引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ．
さらに，x=12, y="気温", z=22.4として，実行結果を確認せよ．

``` ruby
def template(x, y, z)
  "#{x}時の#{y}は#{z}"
end

puts template(12, "気温", 22.4)
```
``` ruby:結果
"12時の気温は22.4"
```

# 08. 暗号文
> 与えられた文字列の各文字を，以下の仕様で変換する関数cipherを実装せよ．
 ・ 英小文字ならば(219 - 文字コード)の文字に置換
 ・ その他の文字はそのまま出力
この関数を用い，英語のメッセージを暗号化・復号化せよ

``` ruby
def cipher(str)
  str.chars
    .map{ |c| c.match?(/[a-z]/) ? (219 - c.ord).chr : c }
    .join
end


word = "Cipher Text"

cipheredWord = cipher(word)

puts cipheredWord
puts cipher(cipheredWord)
```
``` ruby:結果
"Crksvi Tvcg"
"Cipher Text"
```

# 09. Typoglycemia
>スペースで区切られた単語列に対して，各単語の先頭と末尾の文字は残し，
それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ．
ただし，長さが４以下の単語は並び替えないこととする．
適当な英語の文
（例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."）
を与え，その実行結果を確認せよ．

``` ruby
sentence = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."

strangeSentence = sentence.split(/\s/)
                    .map{ |word|
                      word.size >= 4 ? word[0] + word[1..-2].chars.shuffle.join + word[-1] : word
                    }
                    .join(" ")

puts strangeSentence
```
``` ruby:結果
"I culnd'ot beevile taht I colud alcaluty utanrdnesd 
 waht I was rdenaig : the panonmeehl pweor of the huamn mind ."
```

# 学んだ事
- 配列の集合演算
- 文字とASCII文字コードの相互変換
- 指定した範囲の文字列の摘出

準備運動でも学ぶことがたくさんありました。
そんな素晴らしい課題を公開されている乾・岡崎研究室の岡崎先生に感謝です。

次回 「第2章: UNIXコマンドの基礎」
【codility】Lesson 2:Arrays OddOccurrencesInArray

#subject
Lesson 2:Arrays OddOccurrencesInArray
N個（奇数）の要素を持つ配列の中に、ペアのいない要素があり、その要素を返す問題。
例）
`A = {9, 3, 9, 3, 9, 7, 9}`の場合は`7`を返す。
#submit
score100にたどり着くまでに、計算速度の課題にぶち当たった。メモリをクリアできないとscore77止まり。
<img width="1147" alt="スクリーンショット 2018-06-03 20.56.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/237869/4b0971e9-86c7-501d-4aec-55d0d05efe87.png">
#program
結局メモリの課題はクリアできず、過去に解いた方のものを理解した。[参考](http://codility-lessons-jp.blogspot.com/2015/04/lesson-99-oddoccurrencesinarray-odd.html)
このXORに自分ではたどり着けなかった。こんなに短くてシンプルなプログラムがかけると気持ち良いだろうな。とても学びになった。

```c++:oddOccurrencesInArray.cpp
#include<iostream>
#include<vector>
using namespace std;

int solution(vector<int> &inputArray, int N) {

    int oddOccurrences = 0;
    for (int i : inputArray) {
        oddOccurrences ^= i;
    }
    return oddOccurrences;
}
```

演算速度には引っかかってしまったが、自分で考えたプログラムはこんな感じである。

```c++:oddOccurrencesInArray_NG.cpp
#include<iostream>
#include<vector>
#include<map>
using namespace std;

int solution(vector<int> &inputArray, int N) {

	map<int, int> number;

	//count occurrences
	for (int i : inputArray) {
		auto itr = number.find(i);  // find key i
		if (itr != number.end())    //if there are the key i
            number.erase(i);
		else
		    number.insert(make_pair(i, 1));
	}

	//find the unpare element
	for (auto x : number) {
			return x.first;
	}
	return 0;
```
PyPI 新URLへの登録・アップロード

## 背景
[2018.06.03更新]

2016年9月にPyPIのURLが変更となり、2017年7月3日から過去のURLを使ったパッケージの登録及びアップロードができなくなった.
本記事は、その変更点と対応方法についてまとめる.

## 変更点
* PyPIのアップロードリポジトリURLの変更
    * `https://pypi.python.org/pypi` から `https://upload.pypi.org/legacy/` に変更
* TestPyPIのアップロードリポジトリURLの変更
    * `https://testpypi.python.org/pypi` から `https://test.pypi.org/lecagy/` に変更
* TestPyPIからのインストールリポジトリURLの変更
    * `https://testpypi.python.org/simple/` から `https://test.pypi.org/simple/` に変更
* パッケージアップロード前の、パッケージ情報登録が不要になった
    * `python setup.py register` を実行せずに、 `python setup.py upload`を実行できるようになった
 
## ~/.pypircの設定

上記アップロードリポジトリURLの変更に対応するため、`~/.pypirc`を書き換える.

### 旧バージョン
```~/.pypirc
[distutils]
index-servers =
  pypi
  testpypi

[pypi]
repository=https://pypi.python.org/pypi
username=****
password=****

[testpypi]
repository=https://test.pypi.org/pypi
username=****
password=****
```

### 新バージョン
```~/.pypirc
[distutils]3
index-servers =
  pypi
  testpypi

[pypi]
repository=https://upload.pypi.org/legacy/
username=****
password=****

[testpypi]
repository=https://test.pypi.org/legacy/
username=****
password=****
```

## TestPyPI
### TestPyPIへのパッケージアップロード
パッケージ情報登録は不要.
アップロードするパッケージの`setup.py`があるディレクトリで、下記コマンドを実行.
`python setup.py sdist upload -r testpypi`

### TestPyPIからのインストール
変更後のリポジトリURLからインストールする
`pip install --index-url https://test.pypi.org/simple/ PACKAGE_NAME`

## PyPI
### PyPIへのパッケージアップロード
TestPyPIと同様にパッケージ情報登録は不要.
`python setup.py sdist upload`

## 参考文献

下記チュートリアル記事を参考にした.
https://packaging.python.org/guides/migrating-to-pypi-org/
https://packaging.python.org/guides/using-testpypi/
【ブロックチェーン論文まとめ①】ALZA: 効率的なハイブリッド分散型決済システム

# はじめに
始業前にGoogle Scholarでブロックチェン関係の論文を、コーヒーでも飲みながらまとめてみよう、わけわからないなりに継続すればそのうち分かるようになるといいな。という試みです。週2報を目標。慣れたら1日1報。
世の中の理系院生は当然それぐらいの量は軽く読んでるはずなので無駄に張り合って私も頑張ります。笑
英語つらすぎるのでGoogle翻訳をフル活用。多分Ethereum中心です。
今日は思い立ったが吉日ということで休日だけどとりあえず1記事。
明日以降は朝活論文まとめということで。

ちなみに始業前の貴重な朝の時間は、CryptoZombie（Ethereumのプログラミング言語Solidityの学習サイト）自己学習と論文紹介に交互ぐらいで割り振っていこうと思います。

エンジニア歴も短く、ブロックチェーンについても深くは知らないので誤りなどあればご指摘してくださるとうれしいです。結構わからないままとりあえず文字起こししている感があります。
初回ということもあって、AbstructとConclusionしか読んでいませんがご勘弁ください。。。

# Title
### ALZA: An Efﬁcient Hybrid Decentralized Payment System（効率的なハイブリッド分散型決済システム）
https://arxiv.org/abs/1805.11510

# Abstruct
分散型台帳システムの効率化は常に課題であり、その効率性は以下の3項目で測定される。

- スケーラビリティ
    - 物理的なリソースを追加するとどれだけシステムのキャパシティが増加するか
-  スループット
    - 一定の時間内にどれだけのトランザクションを処理できるか（最近ではNEOやEOSの改善が行われている。）
- レイテンシー
    - 一つのトランザクション処理にかかる時間

従来のブロックチェーンではブロック発生率が主な待ち時間のボトルネックであるが、最新の成果によると、ステートチャネルのようなオフチェーンプロセスは、部分的なインバウンドトランザクションを統合して遅延時間を短縮できるという。しかしながらこれは同時に、クロスチャネル同期のような問題を発生させるためブロックチェーンへの全面的適用はできない。

そこで我々は、ALZAと呼ばれるエンドツーエンドのソリューションを提案した。これは自律的な決済フィールドを持つ専用のハイスループットブロックチェーンと紐づきます。
これにより、任意の組のユーザーが支払いフィールドを作成できるようになり、そのフィールドの中ではトランザクションの遅延は非常に短くなるため、直ちに決済をすることができるようになる。

また、すべてのトランザクションがフィールド内で行われた場合、トランザクションコストは数桁低下する。

さらに、ALZAは、革新的なレプリケーションメカニズムにより、主要元帳を各クライアントに分配するため、システムはブロックチェーンシステムの欠陥に対してより堅牢になる。

論理的には、ALZAは1秒間に何百万もの高頻度取引を可能にする。

# Conclusion
本稿では、ALZAという効率的なハイブリッド分散型決済システムを提案した。

これはブロックチェーンのセキュリティの利点と、自律型決済フィールドと呼ばれるオフ・チェーン・ソリューションの効率性を創造的に結びつけたものである。

理論的には、このインフラストラクチャは、1秒間に何百万ものトランザクションを安定して完了させることができ、同時にトランザクションコストを最小限に抑えることができる。さらに、我々が提唱する、信頼性コンポーネント「Redundant Array of Satellite Infrastructure（RaFi）」は、すべての参加者に主要元帳を配布し、すべての人にガバナンス力を与える。 RaFiは、すべてのSuperNodeで障害が発生したときに元帳を完全に回復することもできる。 
ALZAは電子決済システムでシームレスな支払い体験を可能にする。
開発環境にてマネジメントコンソールでスポットリクエスト（インスタンス）を作成してみる

# 概要
AWSを利用する上でスポットリクエストは食わず嫌いで敬遠しがち（経験談）
スポットインスタンスを利用することで利用量は50-70%くらいOFFになるため、開発環境などでは積極的に利用を本当にお奨めする。
実際、EC2の利用料は半額以下になった。


以下は開発環境での作成を想定した手順概要（サービス環境で利用する場合も基本同様）
すべてAWSのGUIから3ステップで出来る

1. サーバの構成を一通り設定したAMIを作成
2. マネジメントコンソールでEC2->Launch Templates(起動テンプレート）を作成　
3. マネジメントコンソールでEC2->スポットリクエストを作成　※起動テンプレートを利用

# 1.サーバの構成を一通り設定したAMIを作成

ここは各々のサーバにそって、ApacheなりTomcatなりnodejsなり必要なモジュール、設定をひととおりいれてAMIを作成
オンデマンドでEC2を作成する場合と一緒。
一通り作成したらオンデマンドでもバックアップ用にAMIを取得すると思うので取得。

# 2.マネジメントコンソールでEC2->Launch Templates(起動テンプレート）を作成　

EC2->Launch Templatesメニューから起動テンプレート画面を表示
![WS000044.JPG](https://qiita-image-store.s3.amazonaws.com/0/31435/5404e379-1a56-27cb-bbff-2bc0e9351c44.jpeg)

1の手順で取得したAMIをベースに設定
必要あれば、キーペア、ネットワークインタフェース、セキュリティグループ、ストレージボリュームなどを設定。
設定しなければデフォルト値が利用される。
シャットダウン時動作を削除ではなく停止にしたい場合はここで設定。　※スポットリクエストでは設定できないため注意

# 3.マネジメントコンソールでEC2->スポットリクエストを作成　※起動テンプレートを利用

2の手順で作成した起動テンプレートをベースに設定（2を手順を飛ばしてここでAMIを個別に設定も可能）
![WS000045.JPG](https://qiita-image-store.s3.amazonaws.com/0/31435/e5ad7b05-29b7-190a-96ac-e23102c622ac.jpeg)

ここでは空いているEC2インスタンスを入札するということを覚えておけばOK

リクエストタイプ：リクエストと維持を指定すると、スポットインスタンスが入札価格を上回って止まった場合も再入札で再動作するのでおすすめ。
合計ターゲット容量：必要なサーバ台数分
起動テンプレート:2で作成したものを選択

その他、2で設定したものはデフォルト値で表示されるので、EC2を立ち上げるとき同様に設定していく
ロードバランサにも紐付けられるためサービス環境で利用したい場合はここで設定

ポイントは最高価格の設定箇所。「自動入札を使用 (推奨）」でも良いが、
「最高価格を設定する (インスタンス時間当たり)」で価格を設定しておくと、それを上回る入札をしないためコストコントロールがしやすい。「価格設定履歴」ボタンで現在の入札価格がわかるため、そこから超えてほしくない値段を設定する。
大体オンデマンドの半額ぐらいは超えない。

# スポットリクエスト完成
ここまでの手順でスポットリクエストが完成する。
しばらくするとスポットリクエストを元にEC2が起動してくる。
あとはお安いEC2を利用し放題。

小さい構成の場合はついめんどくさがってオンデマンドで利用しがち。
構成がある程度固まっていて、数ヶ月以上利用するなら迷わずスポットにすべき。
Homesteadで画面起動したら「No input file specified.」になった時の対処法

昨日に弾き続けLaravelの開発環境構築関連ネタを。

[https://qiita.com/ymk1102_1t/items/e8f61fd38d08b87ebef2](Homesteadで2つ目の開発環境を作ろうとしたら「仮想マシンが既に存在している」というエラーに直面した件)

1つ目の環境を発生していたので今2つ目を作っている時もスムーズに対応できたんですが、ハマる人多そうなので残しておく。

## エラーの原因

```
No input file specified.
```
直訳すると「入力ファイルが指定されていない」という意味。
多分初期表示のディレクトリが自分の意図したものになっていないんだろうなと見込んで調査を開始。

## どこのディレクトリを見にいっているかの調査

`vagrant@homestead:~$ vim /var/log/nginx/〇〇-error.log` 
に載っていた。
※〇〇のところにはHomestead.yamlのsitesのmapに書いた内容が入るらしい。
　　

```
2018/06/03 11:13:37 [error] 919#919: *1 FastCGI sent in stderr: 
"Unable to open primary script: /home/vagrant/code/public/index.php (No such file or directory)" 
while reading response header from upstream, client: 192.168.20.1, server: 〇〇, request: "GET / HTTP/1.1", 
upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "192.168.20.10"
```
エラー内容はこんな感じ。
`/home/vagrant/code/public/index.php` のファイルが見つからないとのこと。

実際、 `~/code`　で `ls` を投げるとLaravelというプロジェクトをまとめたフォルダが出てきてpublicというフォルダは見つからなかった。
Laravelの下に `public/index.php` はあったので、ディレクトリ構造の設定ミスが原因だという説が濃厚になる。

## パスの設定箇所の修正

設定しているのはHomestead.yamlなのでそこを見に行きます。

```
sites:
    - map: homestead-test
      to: /home/vagrant/code/public
```

さっきのエラーの通り、Laravelのディレクトリが抜け落ちてるのでここに書き足す。

## 設定を反映する
```
vagrant up --provision
```
これで設定を反映できる。
再起動だけで行けると勘違いして何回も `vagrant reload`　してしまっていたけどそっちは意味ないらしい^^;

  
原因特定から修正対応まではこんな感じ。
Open vSwitchのインストール

やってみたのでメモ

# 手順
1. あらかじめ依存ライブラリをインストール

    ```
    # yum -y install make gcc openssl libcap-ng epel-release
    ```

2. pipをインストール

    ```
    # yum -y install python-pip
    ```

3. sixライブラリをインストール

    ```
    # pip install six
    ```

4. ファイルをダウンロードする

    ```
    # curl -LkvOf http://openvswitch.org/releases/openvswitch-2.9.2.tar.gz
    ```

5. ファイルを展開する

    ```
    # tar zxf openvswitch-2.9.2.tar.gz
    ```

6. configureを実行する

    ```
    # cd openvswitch-2.9.2
    # ./configure
    ```

7. makeを実行する

    ```
    # make
    ```

8. インストールする

    ```
    # make install
    ```

# 参考
- [Open vSwitch on Linux, FreeBSD and NetBSD](http://docs.openvswitch.org/en/latest/intro/install/general/)
Windows10(64bit)にBDE(Borland Database Engine)のインストール

# はじめに
Windows 7の延長サポート終了(2020年1月14日)まで残り2年を切り、Windows 10移行検証をしています。既存アプリケーションの中にBDE(Borland Database Engine)が必要なものがあり、Windows10(64bit)でBDEのインストールを実行すると、「Windowsのバージョンとは互換性がありません」旨のエラーでインストールができません。

新しいPCになるとOSが最初から64bitになることも考慮していく必要があります。

以前、別ブログで「[[Delphi]ソケット切断時の3分待機と64bitOSへのBDEインストール](http://blogs.wankuma.com/yaju/archive/2015/12/24/524977.aspx)」を書きました。この時はWindows Server 2008R2(64bit)のOSが対象で2014年8月時点の話でリンク先も切れてるので、今回は別な方法を考える必要があります。

# CarsyBde.exe のインストール
Delphiメーリングリストの過去ログの質問の回答として、下記がありました。
>CarsyBde.exeが６４Bit対応でインストールできたかと思います。
「[BDEをWindows Server 2008 R2に導入するには](https://www.freeml.com/delphi-users/2581/latest)」

「CarsyBde.exe」で検索すると怪しいサイトだったり、あってもリンク先が切れてたりという中で見つけたのが下記サイトになります。

ブラジルのソフトウェア会社(optionsinformatica)のようです。
[Downloads » Mais Informações - OPTIONS INFORMÁTICA](http://www.optionsinformatica.com.br/index.php/suporte/atualizacao/244)

下図はGoogle翻訳したものです。
![BDE64download.png](https://qiita-image-store.s3.amazonaws.com/0/14053/78f97ab9-f967-0618-e46c-d0d853d2fa54.png)

ダウンロードした「CarsyBde.exe」を実行します。読み方はカーシーBDE。
![SetupCarsybde.png](https://qiita-image-store.s3.amazonaws.com/0/14053/d5f01e23-bce4-7750-e905-e270d024eaf0.png)

インストール先を指定します。デフォルトのまま
![SetupCarsybde2.png](https://qiita-image-store.s3.amazonaws.com/0/14053/7af77ec0-ed7a-aba4-40e8-9eb48a34f9fe.png)

インストール完了
![BDEComplete.png](https://qiita-image-store.s3.amazonaws.com/0/14053/f017480f-7a49-e381-fa7a-df830ffd4da0.png)

インストール先に「BDEADMIN.EXE」があります。
![BDEInstall.png](https://qiita-image-store.s3.amazonaws.com/0/14053/8b71bffa-cacc-f92f-903c-fa4a816961e0.png)

※以前にWindows Server 2008R2でBDEをインストールしたものと時と比較すると、「sqlint32.dll」が含まれていないようです。

# 最後に
BDE(64bit)となっていますが、あくまで64bit OSでインストールできるようにしたもので、中身は32bitのままです。
これで動作するようになるといいですね。
jest-puppeteerを使ったテストを試す

[smooth-code/jest-puppeteer: Run your tests using Jest & Puppeteer 🎪✨](https://github.com/smooth-code/jest-puppeteer)

```
yarn add --dev jest-puppeteer puppeteer jest
```

`jest-puppeteer`はpuppeteerの設定をするだけでなく、click前に要素の出現を待機するなどインテグレーションテストのために設計されている。

## 使い方

`jest.config.js`にpuppeteerの設定を書く

今回は試すだけなので、`jest.config.js`に書くが基本的に他のテストも書くと思うので、`--config`を使って`jest.config.e2e.js`などのファイルを用意するといいだろう。

```js
module.exports = {
  preset: 'jest-puppeteer',
}
```

google.comを開いたときgoogleが表示されるかテスト。
ちなみに自分はdescribeを書くぐらいならテストファイルを分割する。

```js:index.test.js
let page

beforeAll(async () => {
  page = await browser.newPage()
  await page.goto('https://google.com')
})

test('should display `google` text on page', async () => {
  await expect(page).toMatch('google')
})
```

![スクリーンショット 2018-06-03 19.55.08.png](https://qiita-image-store.s3.amazonaws.com/0/15319/9f7cb3a3-a188-1d54-156e-11569044c8f1.png)

Cool。テストが通った。
テストは落としてなんぼなので、`gooooogle`の文字があるかテスト

![スクリーンショット 2018-06-03 19.57.21.png](https://qiita-image-store.s3.amazonaws.com/0/15319/8bc5dcd7-e074-92b9-9795-cddcc9a0d782.png)


フォームへの入力とか、クリックとかの基本的な操作は以下にまとまっている。

[jest-puppeteer/README.md at master · smooth-code/jest-puppeteer](https://github.com/smooth-code/jest-puppeteer/blob/master/packages/expect-puppeteer/README.md#api)

フォームの入力やクリックの挙動を見るために、テストを追加してみる。

```js
test('`akameco`検索し検索結果にQiitaがあること', async () => {
  await expect(page).toFill('input[title="検索"]', 'akameco')
  const navigationPromise = page.waitForNavigation() // pageの遷移を待つ
  await expect(page).toClick('input[type="submit"]')
  await navigationPromise
  await expect(page).toMatch('akameco - Qiita')
})
```

実行時間を見ると、`1119ms`。思ったより非常に高速。

なお、pageインスタンスは、puppeteerのPageなので、`page.waitForNavigation()`などが普通に使える。
選択ソートについて

# 選択ソートとは
ソートアルゴリズムの一つ。
配列の要素を左から右へ、アクセスし一番大きな値を別の配列に移動することでソートを行うアルゴリズムのこと。

# 例
下記にある配列の要素を昇順にソートしたい場合。

```
[5, 3, 6, 2, 10]

```

左から右へ隣合わせの値をそれぞれ比較して、小さい方を別変数に保存し、次の要素と比較を行う。

上記例だと
1. `5`と`3`だと`3`の方が小さい。
2. `3`と`6`を比較すると、`3`の方が小さい。
3. `3`と`2`と比較すると、`2`の方が小さい。
4. `2`と`10`を比較すると、`2`がの方が小さい。
5. `2`が一番小さな値のため、この配列から取り出して、新しい配列にプッシュする。
6. 再度1から始める。 

となる。

この処理はすべての要素にアクセスするため、計算量は*O(N)*となる。

ただし**この処理をすべての要素に行うため**、このアルゴリズムの計算量は O(N * N)となり、**O(N2)**になる。 

# まとめ
いろんなケースに使用できるアルゴリズムだが、パフォーマンスは良くはない。
CleanArchitectureへの自分の混乱を正す

iOSやAndroid開発ではCleanArchitectureというアーキテクチャが利用されることがあるが、利用者によって解釈が大きく変わりそれが自分の中での混乱を招いているのでは？と考えた。なので自分なりに整理してみた。

# CAとDDDの混乱
CleanArchitectureは

- ヘキサゴナルアーキテクチャ
- オニオンアーキテクチャ
- スクリーミングアーキテクチャ
- リーンアーキテクチャ
- UseCase駆動

などのアーキテクチャを参考にしており、オニオン型アーキテクチャは
> DDDのドメイン層からインフラ層への依存をなくすために依存性逆転の法則を用いて**「ドメインが何にも依存しないように」**する

という目的で生まれたものなので、DDDの文脈を受け継いでいると考えてよいと思った。


# Entity/UseCaseの混乱

[クリーンアーキテクチャ(The Clean Architecture翻訳)](https://blog.tai2.net/the_clean_architecture.html)を読み直してみた。

Entityの定義の中の一文で以下のように書いてある。
> エンティティは、メソッドを持ったオブジェクトかもしれない、あるいは、データ構造と関数の集合かもしれない。

そしてUseacaseはこのように書かれている。
> ユースケースは、エンティティからの、あるいはエンティティーへのデータの流れを組み立てる。そして、エンティティ、プロジェクトレベルのビジネスルールを使って、ユースケースの目的を達成せよと指示する。

Entityはデータ構造だけでUseCaseにロジックを持たせるような利用がよくされているが、原文はちゃんと**ドメイン駆動の文脈に沿った使い方を想定されている。**

なので、**Entityにはドメインのロジック**を持たせて、**UseCaseはユーザーの利用する機能単位のロジック**を設けてエンティティへのデータの流れを組み立て、インターフェース(抽象)に依存してお互いやりとりする。というのが正しいCAの理解ではないか？と考える。

この辺りのEntityとUseCaseの誤解が原因で、アプリケーションロジックとドメインロジックの混同が生まれてしまってドメイン駆動の旨味を損なってしまっていた気がする。

# 「テスト可能」の適応範囲の混乱
CAのシステムとして、

1. フレームワーク独立
2. テスト可能
3. UI独立
4. データベース独立
5. 外部機能独立

が挙げられるが、2.テスト可能についての詳細は以下のようになる。
> ビジネスルールは、UI、データベース、ウェブサーバー、その他外部の要素なしにテストできる。

このビジネスルールについて、前はUseCaseとEntityの混同があったために単にUseCaseに対してのテストだと考えていたが、CAの図では

> Entities: Enterprise Business Rules
UseCases: Application Business Rules

と表現されており、**UseCaseもEntityもビジネスルールで、どちらも外部の要素なしにテストされる** という適応範囲の解釈の違いがあったように思う。

# Interface Adapterの役割の混乱
このレイヤーはヘキサゴナルアーキテクチャーのAdapterに当たる。

CAでの定義は以下になる。
> このレイヤーのソフトウェアは、アダプターの集合だ。これは、ユースケースとエンティティにもっとも便利な形式から、データベースやウェブのような外部の機能にもっとも便利な形式に、データを変換する。(中略...)
> 同じように、データはこのレイヤーで、エンティティーやユースケースにもっとも便利な形から、どんな永続化フレームワークが使われているにしろ、それにとってもっとも便利な形に変換される。

インターフェースアダプターに属するのは

- Controllers
- Gateways
- Presenters

なので、**Viewや外部のDBでの内外のデータ形式変換はこいつらが行う。**
**UseCaseがデータ変換の責務を負ってはいけない。**

しかし、データ変換の役割だけならTranslatorで問題ないわけなので「Presenter/Controller/Gatewayのそれぞれの役割を果たしつつ、内外のデータ変換の責務も負ってね。」という理解をしている。

# 参考
[[DDD]ドメイン駆動 + オニオンアーキテクチャ概略](https://qiita.com/little_hand_s/items/2040fba15d90b93fc124)

[Clean Architecture srnlib](https://srnlib.com/clean-architecture/)
"ワンドロ"開発をしよう

# ことの始まり

さて、唐突だけれど、"ワンドロ"という言葉はご存知だろうか？
イラストレーター界隈の言葉で、「60分お絵かき一本勝負」のことを指すらしい。
具体的にはこんな感じで話が進むようだ。

1. 「お題」を決める。
1. 御題に沿って描き始める。
1. 60分経ったら作業途中でもおしまい。

トレーニングの一環であり、且つ、娯楽のひとつでもあるようで
ツイッターなんかだと決まった時間に御題を出してくれるアカウントなんかもあるらしい。
あるいは自分の絵を世に出す広報的な役割もあるのかもしれない。

なぜこんな話を始めたか、と言うところなのだけれど
実は最近少し暇を持て余している。

フリーランスのエンジニアで、受託開発を主としているのだけれど
仕事と仕事の合間があるとまぁやること無いわけで。

で、"ワンドロ"のことをふと思い出した訳である。

# 具体的には･･･

絵のことはよくわからないけれど、少なくとも開発を一時間ってのはさすがに厳しい。
作るものがガッツリ決まっているならともかく、御題という形でざっくりだされた物だと
1時間では詳細な仕様を決めるだけで終わりだろう。
作ったものはGitHubで公開するつもりなので、あまりにも雑なソースを出すわけにも行かない。

そんなわけで以下の条件を設定することにした。

1. 「御題」に対する時間見積もりを別途行う。最大で一週間ほど。
1. 1日に使える時間を制限する。クリエイティブな活動は8時間が限度、という言葉を鵜呑みにして8時間を最長に。
1. 見積もり時間を越えたら作業途中でもおしまい。

もはやワンドロなんだか一人スクラム開発なんだかわからないけど、暇に任せて携帯弄ってるよりよさそうなのでこれでやってみよう。

# せっかくなので

開発時間を記録するアプリをサクッと作ってみた。

ConditionalDevelopmentSupportApp (条件付き開発支援アプリ)
https://github.com/Shiratori1218/ConditionalDevelopmentSupportApp

ちょっと納得いかないところもあるので随時更新予定。
とはいえ、これで環境は整ったので今週からワンドロ開発をやってみようと思う。
Rails5の勉強: unknown keyword: idについて

#**注意:この記事はガチの初心者がとりあえずの解決法を書いてるだけです．参考にはなりませんからね**

いつもの．
なにか「間違えたこと書かないでくれ」な点がありましたら教えていただけると幸いです...

#1. 今回のエラー
前回言ってた「もう一個のエラー」なのです．コントローラのテストをする際のエラーです．

とりあえず問題のコード

```ruby:articles_controller_test.rb
require 'test_helper'

class ArticlesControllerTest < ActionController::TestCase
  #中略
  
  test "show" do
    article = FactoryGirl.create(:article, expired_at: nil)
    get :show, id: article
    assert_response :success
  end

end
```

前回と同じくテストをしてみる．

実行したコマンド
`bin/rake test TEST=test/controllers/articles_controller_test.rb`

返答

```
DEPRECATION WARNING: Using a dynamic :action segment in a route is deprecated and will be removed in Rails 6.0. (called from block in <main> at /Users/xxx/Rails/myapp/config/routes.rb:4)
Run options: --seed 54319

# Running:

.E

Error:
ArticlesControllerTest#test_show:
ArgumentError: unknown keyword: id
    test/controllers/articles_controller_test.rb:12:in `block in <class:ArticlesControllerTest>'


bin/rails test test/controllers/articles_controller_test.rb:10



Finished in 0.387560s, 5.1605 runs/s, 5.1605 assertions/s.
2 runs, 2 assertions, 0 failures, 1 errors, 0 skips
```

idなんか知らんって言われてる...

#2. 原因
(多分)バージョンによる違いだと思う.
自信ないです，ｽﾝﾏｾﾝ...

#3. 変更
[ここ](https://stackoverflow.com/questions/43797133/controller-spec-unknown-keyword-id)を参考に修正．


```ruby:articles_controller_test.rb
require 'test_helper'

class ArticlesControllerTest < ActionController::TestCase
  #中略
  
  test "show" do
    article = FactoryGirl.create(:article, expired_at: nil)
    get :show, params: { id: article.id }
    assert_response :success
  end

end
```

#4. 結果
無事にエラーは消えました．同じように
`xx: yy`
と表記してるところはすべて
`params: { xx: yy.xx }`
に直してます．これで今のところは大丈夫そう...?_
[Review] Double DQN

## Introduction
This is the branch article about Deep Reinforcement Learning.
Main contribution is here.
https://qiita.com/Rowing0914/items/9c5b4ffeb15f4fc12340

In this article, I would like to summarise a famous research paper about DDQN.
Also, i would like to share the implementation as well!
Hope you will like it!

Link: double q network
https://papers.nips.cc/paper/3964-double-q-learning.pdf

double dqn
https://arxiv.org/pdf/1509.06461.pdf

Main Contributor: Hado van Hasselt

## Overestimation of Q-learning
What we have seen in the deep q network was quite brilliant achievement.
Especially the generalisation for various games of Atari-26000, it outperformed the previous benchmark significantly. However, Hasselt et al have found the huge overestimation arising in value estimation as well. To avoid this overestimation, they have introduced DDQN(deep double q network). Indeed, this was not the first time for the overestimation to be reported, actually this problem has certainly long history since Q-Learning was introduced by Watkins in 1989. Since then many researchers have been tried to extend this immense algorithm to reach higher goal.
And Hasselt was one of them, and found that the optimism arise in the step of maximisatoin of the value function in some stochastic environments using q-learning. And even the novel approach introduced by Mnih et al., 2015 has caused the same issue as well.
So with the foundation of double q learning, they have approached this issue.

<img width="450" alt="Screen Shot 2018-06-06 at 13.13.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/e02baeb5-c8e1-36d2-38df-711cba465fec.png">
As you can see from this chart, orange bars indicate the bias in a single Q learning and on the other hand the blue ones show the one in double q learning. It is evident that the bias increase with the number of actions.

## Double Q Learning algo
In double q learning, they have approached the issue of overestimation which caused by the usage of the value function for updating and selecting action.
To avoid this, they used two different action-value function for the process of maximisation of the expected values in next step. Each Q function is updated with a value from the other Q function for the next state.

<img width="556" alt="Screen Shot 2018-06-06 at 11.52.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/1cad86e5-9ae8-39db-e84b-b4682b0089db.png">

## Deep Double Q Learning
Simply replacing the q function with the approximated estimate neural network.
The update algo is same as DQN.

## Implementation
Try this!
it's using keras and well implemented!

https://github.com/DavidSanwald/DDQN

**Mind this point below.**

```python:original_main.py
    def run_experiment(self, agent):
        self.env.monitor.start('/tmp/cartpole', force=True)
        for n in range(N_EPISODES):
            self.run_episode(agent)
        self.env.monitor.close()
        pass
```

this should be 

```python:new_main.py
    def run_experiment(self, agent):
        for n in range(N_EPISODES):
            self.run_episode(agent)
        pass
```
Larave5.5 + Heroku のやったことメモ

# このドキュメントについて



## Heroku 環境の設定

### nginx の設定を用意しておく

```bash
echo web: vendor/bin/heroku-php-nginx -C nginx_app.conf public/ > Procfile
echo 'location / { index index.html index.php; try_files $uri $uri/ /index.php?$query_string; }' > nginx_app.conf
git add .
git commit -m 'add web server setting'
```

### Postgresql を用意して環境変数に設定を入れる

```bash
heroku addons:create heroku-postgresql:hobby-dev
php -r 'preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches); `heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]`;'
```

### ビルドパックの準備

ビルドパックにnodejsを追加してnpmできるようにしておく

```bash
heroku buildpacks:set heroku/php
heroku buildpacks:add --index 1 heroku/nodejs
# confirm
heroku buildpacks
```

## Heroku 用のビルド設定
### package.json の変更

package.json の初期で `devDependencies` になっているのを `dependencies` に変更

```package.json
    "dependencies": {
        "@fortawesome/fontawesome": "^1.1.8",
        "@fortawesome/fontawesome-free-brands": "^5.0.13",
        "@fortawesome/fontawesome-free-regular": "^5.0.13",
        "@fortawesome/fontawesome-free-solid": "^5.0.13",
        "axios": "^0.17",
        "bootstrap": "^4.0.0",
        "browser-sync": "^2.24.4",
        "browser-sync-webpack-plugin": "^2.0.1",
        "cross-env": "^5.1",
        "jquery": "^3.2",
        "laravel-mix": "^2.0",
        "lodash": "^4.17.4",
        "markdown-it": "^8.4.1",
        "popper.js": "^1.14.3",
        "vue": "^2.5.7"
    }
```

`npm run production` する設定を追加

```package.json
    "scripts": {
....
        "heroku-postbuild": "npm run production"
    }
```

### webpack.mix.js
https://qiita.com/llhrkll/items/513c23008b2596089a00 の内容を参考にしているが、 `mix.browserSync` は使わないのでコメントアウトしている。


```webpack.mix.js
let mix = require('laravel-mix');

mix
    .disableNotifications()
    .js('resources/assets/js/app.js', 'public/js')
    .sass('resources/assets/sass/app.scss', 'public/css')
    .options({
        postCss: [
            require('autoprefixer')
        ]
    });

if (mix.config.inProduction) {
    mix.version();
} else {
    // mix.browserSync({
    //     proxy:     'localhost:8000',
    //     startPath: '/'
    // });
}
```

### blade.php ファイル
css, js ファイルの読み込み時に `asset` 担っている箇所を `mix` に変更した。

```
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
<script src="{{ mix('js/app.js') }}"></script>
```

# 参考
参考になりました→ https://qiita.com/kamukiriri/items/73ff35fc7f9083ca68c1
これとてもありがたかった→ https://qiita.com/llhrkll/items/513c23008b2596089a00
pytorchでtensorboardを使えるようにする

pytorchの学習過程の可視化にはtensorboardxが便利らしい
https://qiita.com/r9y9/items/d54162d37ec4f110f4b4
https://qiita.com/ciela/items/ae1737bf6cb357cda900

tensorboadxでログを取るのは簡単だったけど，
tensorboardを使えるようにするまでちょっと苦労した．
成功した方法を示す．(自分メモ用に)

pytorchとtensorflowを同じ環境に置きたくなかったので
別の仮想環境を作ってtensorboardを使う環境を別にした．

#tensorboard確認用の環境構築
tbという仮想環境を作成して諸々導入
python2系だと上手く行かなかったから3系で

```terminal
$ conda create -n tb python=3.5.4
$ source activate tb
$ pip install tensorflow==1.7.0 tensorflow-tensorboard==0.1.7
```

#tensorboard実行
logというディレクトリにtensorboard用のログがある場合
tensorboard.shというlog確認用のbashを作成して実行

```tensorboard.sh
#!/bin/bash
source activate tb
tensorboard --logdir=./log --port=6006
```

```terminal
$ bash tensorboard.sh
```

port番号を変えることによって複数のlogを同時に見ることが可能


github
https://github.com/lanpa/tensorboard-pytorch
tensorboardxの使い方
http://tensorboard-pytorch.readthedocs.io/en/latest/tensorboard.html
CADとカスタマイズ用プログラム言語の関係メモ

# 2018年5月調査

|CAD Name       |VBA|VB.Net|C++|C# |LISP|Python|JavaScript|java|独自|
|:-:            |:-:|:-:   |:-:|:-:|:-: |:-:   |:-:       |:-: |:-:|
|AutoCAD        |○  |○     |○  |○  |○   |○     |○ from2014|×   |   |
|Vectorworks    |   |      |   |   |    |○     |          |    |VectorScript|
|Jw_cad         |   |      |   |   |    |      |          |    |   |
|Fusion360      |×  |×     |○  |×  |×   |○     |○※       |×   |   |
|Creo Parametric|?  |○     |○  |   |×   |      |○         |○   |   |
|SolidWorks     |○  |○     |○  |○  |×   |×     |×         |×   |   |
|CATIA          |○  |      |○  |   |×   |      |          |    |CATScript<br>VBScript|
|NX             |   |○     |○  |○  |×   |      |          |○   |   |
|FreeCAD        |   |      |   |   |    |○     |          |    |   |


※Fusion360は、2017年7月からJavaScriptをメインテナンス モードへ移行してPythonとC++のみのサポートとなる。

# その他、カスタマイズ開発ツール
- Creo Parametric →　Creo Parametric TOOLKIT
- CATIA →　CADAM Application Architecture (=CAA)

参考リンク
[はじめてのVectorScript(1)](https://www.aanda.co.jp/develop/VSBook/vsb1-1.html)
[VectorScript Language Guide](https://developer.vectorworks.net/images/0/0c/VectorScriptLanguageGuide.pdf)
機械学習プロジェクトの進め方：『Machine Learning Yearning』31-32章（Learning curves）

現在、AIや機械学習界隈で最も有名なスタンフォード大学のAndrew Ng教授が、「Machine Learning Yearning」というオンライン書籍を執筆中です。2018年4-5月に、そのドラフト版（1-35章）がオンラインで公開中です。この投稿では、いち早く翻訳を進めています。

http://www.mlyearning.org/
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/188414/741778bb-9523-9feb-736b-6bd5aedc42e6.png)

この本は、機械学習プロジェクトの構築方法を提供します。また、機械学習アルゴリズムを教えるのではなく、機械学習アルゴリズムが機能する方法に焦点を当てています。

本投稿は、**31-32章(Learning curves)**の翻訳になります。少しづつ翻訳していきます。※翻訳違っていたらご指摘ください。
本書籍は、とても読みやすく、かつ各章短めに記載されています。

##### **1～30章までの翻訳**
https://qiita.com/Ishio

##**31.  Interpreting learning curves: Other cases(学習曲線の解釈：他のケース)**
次の学習曲線について考えてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/b17efba9-58d7-f614-a547-52b6c9ec2a78.png)

このプロットは、ハイバイアス？ハイバリアンス？もしくは両方？

青線（トレーニングセットのエラー曲線）は比較的低く、赤線（開発セットのエラー曲線）は青線よりも高くあります。したがって、バイアスは小さくバリアンスが大きいです。より多くのトレーニングデータを追加すると恐らく開発セットとトレーニングセット間のエラー数のギャップを埋めるのに役立つでしょう。 

では、こちらの学習曲線はどうでしょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/4d21b4b0-9907-319f-bc40-b0e628b31018.png)

今回は、トレーニングセットのエラーは大きく、目標とするパフォーマンスレベルよりもはるかに高く位置します。開発セットのエラーはトレーニングセットのエラーよりも多いです。したがって、大きなバイアスとバリアンスが存在します。アルゴリズムのバイアスとバリアンス両方を減らす方法を探さないといけません。
##**32. Plotting learning curves(学習曲線を描く)**
100サンプルの小さなトレーニングセットを保持しているとしましょう。10サンプルのサブセットをランダムに選択することによって、アルゴリズムをトレーニングします。次に20サンプル、30サンプル、100サンプルまで10件感覚でサンプルの数を増やします。次に10個のポイントを学習曲線にプロットします。小さなトレーニングセットのサイズでは、学習曲線は若干ノイズを含むように見えるかもしれません（値が予想よりも上下にプロットされることを意味します。）。

無作為に抽出された10件のサンプルだけをトレーニングするとき、多くの曖昧/誤ったラベルがついたサンプルなど、不運にも特に「悪い」トレーニングセットを持っているかもしれません。もしくは、運が良ければ、「良い」トレーニングセットを得ているかもしれません。小さなトレーニングセットを持つことは、開発セットとトレーニングセットのエラーがランダムに変動する可能性があることを意味します。
もし、機械学習アプリケーションが1つのクラスにひどく偏っている場合（EX:負のサンプルの割合が正よりもはるかに多いネコ分類器のタスク）、もしくは非常に多くのクラスが存在する場合（EX:100種の動物種の識別など）、特に「代表的でない」または悪いトレーニングセットを選択する機会が高くなります。例えば、サンプルの80%が負（y=0）のサンプルで、20%だけが正（y=1）のサンプルである場合、10件のトレーニングサンプルには、負のサンプルしか含まれない可能性があります。したがって、意味ある何かをアルゴリズムが学習することは非常に難しいです。
トレーニングセットの学習曲線のノイズが真のトレンドの把握を妨げる場合、次の2つの解決方法があります。

* 10サンプルで1つのモデルだけをトレーニングする代わりに、ランダムに選択されたトレーニングセット10サンプルを3～10パターン用意します。これはオリジナルの100サンプルからサンプリングします。それぞれのサブセットについて、異なるモデルをトレーニングし、得られたモデルのトレーニングセットと開発セットのエラーを計算します。トレーニングエラーの平均値と開発エラーの平均値を計算しプロットします。

* トレーニングセットが1つのクラスに偏っている場合や、多くのクラスがある場合、100サンプルから無作為に10サンプルを取得する代わりに「バランスの取れた（balanced）」サブセットを選択します。例えば、10件中2件が正のサンプルであり、残りの8件が負のラベルであることを確かめます。より一般的には、各クラスのサンプルの割合が元のトレーニングセットの割合に限りなく近似していることを確かめます。

既に学習曲線をプロットを試みて、その学習曲線にノイズが多すぎているため根本的な傾向を把握することができないと結論付けていない限り、これらのテクニックで悩むことはないでしょう。また、もしトレーニングセットが大きく（10,000サンプルを超えている場合）、クラスの分布に偏りがない場合、これらのテクニックが必要ないでしょう。
最後に、学習曲線を描くことは、計算コストがかかる可能性があります。例えば、10個のモデルを1,000、2,000、10万のサンプルまでトレーニングしなくてはならない場合があります。小規模なデータセットでモデルをトレーニングすることは、大規模データセットでよりもはるかに高速です。したがって、上記のようにトレーニングセットのサイズを線形の間隔で均等に空けずに、1,000、2,000、4,000、6,000、10,000サンプルといったサイズでモデルをトレーニングすることができます。これは、学習曲線の傾向の明確な感覚を与えるはずです。もちろん、このテクニックは、トレーニングセットの計算コストが重要な場合のみ関係します。
mpsytでラズパイからYouTube音楽再生

### mpsytて何?

コマンドラインからYoutube再生できる便利プログラム。ラズパイでBGM再生、とかの用途に使える。
mpsというコマンドライン音楽再生プログラムがあって、それでYouTubeを使えるようにしたからmpsytということらしい。

[mps-youtube(GitHub)](https://github.com/mps-youtube/mps-youtube)

<h3>インストール</h3>
パッケージ管理ツールかpip3でインストールできる。

```sh
$ sudo apt-get install mps-youtube
```

もしくは

```sh
$ pip3 install mps-youtube youtube-dl
```

<h3>操作方法</h3>

<h5>起動</h5>
<pre class="prettyprint">
$ mpsyt
</pre>
<h5>コマンド</h5>
###### 動画検索

```
:/Lady Gaga
```

###### プレイリスト検索

```
://Lady Gaga
```

その他、

- (数字)で再生。範囲指定なら2-5,8みたいに。
- qで終了
- [Space]で一時停止/再生

など。hかhelpでヘルプ出てくるのでそれを見ればよい。

それか [mps-youtube(GitHub)](https://github.com/mps-youtube/mps-youtube) に色々書いてある。


##### 便利コマンド
###### ボリュームのデフォルトを変更
(例：デフォルトを30に設定)

```
set playerargs --volume 30
```

###### シャッフル

```
:shuffle
```

### 今後の展望

プレイリスト機能とか使いこなせると良さそう。
Ruby | pry とか p で表示される アットマークって何なの？

# 答え

インスタンス変数。
メソッドの戻り値とかじゃないので注意。


# コード例

```rb
class A
  def initialize
    @some_instance_variable = :example
  end
end

p A.new # #<A:0x00007fc3930961c8 @some_instance_variable=:example>
```

# ちなみに

- pの結果にはinspectメソッドが使われる。

# 環境

- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

# 参考

- [inspect (Object) - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/object/inspect)
- [p (Kernel) - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/kernel/p)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PHPStormでリファクタが捗るおすすめ6+1選

## はじめに

開発をしてく中でリファクタって大事だと思うのですが、人の手で修正を加えていくとしょうもないところでミスしたりします。
IDEができるところは任せてしまいたいなぁという方におすすめの小技集を紹介します。

## 実行環境

 - IDE
    - PHPStorm 2017.3.1
 - マシン
    - MacbookPro
        - OS
            - macOS High Sierra
        - バージョン
            - 10.13.1

### 1. クラス内のメソッドの命名変えたい
![changingFunctionSignature.gif](https://qiita-image-store.s3.amazonaws.com/0/194069/64fdadc6-09ec-b236-4459-31e1ad52404a.gif)
#### shortcut key
 - ``⌘ F6``

#### 説明
クラス内のメソッドを変更したい場合に使用します。
親クラスを継承した子クラスが存在して、指定したメソッドがオーバーライドしていた場合でも、子クラスのメソッドも含めて一括で変更します。
さらに、例えばシングルトンパターンを使ったりしてメソッドチェーンをしている場合でも、対象のメソッドの命名に変更を加えることが出来ます。
<img width="536" alt="スクリーンショット 2018-06-03 17.22.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/194069/12d262b3-068b-c967-41d3-4058c7a52616.png">
さらにメソッドに対して引数を追加した場合にも上のダイアログ内で、変数名、デフォルト値を設定することでメソッドの引数、参照先両方に一括で変更を加えることが出来ます。

### 2. 冗長な変数の利用を置き換えたい
![inlineVariable.gif](https://qiita-image-store.s3.amazonaws.com/0/194069/d7685a11-4449-d2f2-4d36-b8be0f3189c5.gif)
#### shortcut key
 - ``⌥ ⌘ N``

#### 説明
メソッド内で変数で宣言を行ってるけど、これそのまま``return``で返した方が処理がスッキリするというメソッドに対して置換を行なってくれます。

### 3. 指定の値に対して定数で外出ししたい  
![Const.gif](https://qiita-image-store.s3.amazonaws.com/0/194069/f44bab82-3a7b-5eeb-1d66-513e4ce3ec9b.gif)

#### shortcut key
 - ``⌥ ⌘ C``

#### 説明
ハードコーディングされて直接内部に書き込まれてしまっているマジックナンバーを抽出して定数で外出しします。

### 4. コンストラクタのメソッドから初期値、プロパティを作成したい
![initializeFields.gif](https://qiita-image-store.s3.amazonaws.com/0/194069/df7d8643-335e-8b67-9565-13b481046ebc.gif)
#### shortcut key
 - ``⌥ Enter`` => Initial Fieldsにカーソルを合わせ``Enter`` => ``⌘A`` => ``Enter``

#### 説明
コンストラクタ内に定義されたメソッドからクラス内にコンストラクタで定義した引数のプロパティを作成し初期状態で``$this->{引数名}``の形で初期化を行ないます。
PHP 7.0以上で、引数に対してスカラー型のタイプヒンティングを行なっている場合は初期化したプロパティにdocコメントを自動で挿入してくれます。

### 5. staticで定義されたメソッドを別クラスに移動させたい
![moveStaticMethodToClass.gif](https://qiita-image-store.s3.amazonaws.com/0/194069/d3cb9ed5-d678-9f4c-2e76-5991681b2556.gif)

#### shortcut key
 - staticメソッドにカーソルを合わせて``F6``

#### 説明
staticメソッドのクラス移動です。
表示されるダイアログ内で複数メソッドにチェックを入れれば複数のメソッドを移動させることが出来ます。
ただ、現状メソッドの移動をサポートしているのはstaticメソッドのみでインスタンスメソッドに関してはこの機能を使えません。

### 6. メソッドの抽出
![extractMethod.gif](https://qiita-image-store.s3.amazonaws.com/0/194069/f8068cd5-16cf-b8eb-1ef9-f176453b0866.gif)

#### shortcut key
 -  ``⌥ ⌘ M``

#### 説明
選択されたブロックに対して、メソッドの抽出を行います。
``Visibility``からアクセス権の範囲を指定が出来て、かつdocコメントを追加するかstaticメソッドにするかをチェックボックスから選択することが出来ます。

### 7. PHPStormのリファクタであの機能ってショートカットキーなんだったけ...
<img width="379" alt="スクリーンショット 2018-06-03 18.21.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/194069/160e5864-9935-cd67-3852-49b8642ed910.png">

#### shortcut key
 -  ``⌃ T``

#### 説明
最強コマンド。
メソッドや変数などにカーソルを合わせて``⌃ T``を押すとドロップダウンメニューが表示されて、そのドロップダウンメニュー内のメニューから選択することが出来ます。
とりあえずこのコマンドを覚えて行ってわざわざメニュー開くのが面倒になったら各コマンドを覚えて行くでもいいかも。

## まとめ
PHPStormのリファクタの機能を中心に説明して行きました。
PHPStormの標準で備わっているリファクタの機能はかなり便利で強力です。
ただ、こういう便利なリファクタツールを使ったとしても、結局どこかでツールに頼らずにリファクタする場面が出てきた時が出てきます。
その時にどういうコードがリファクタしなきゃいけないのか、どうすれば綺麗になるのかをきちんと把握した上で、こういうツールを使って作業効率を捗っていけるといいですね。
ボーイスカウト精神でまた明日も一つソースを綺麗にして行きましょう！
Django×PinaxでWebサービス入門①｜マニュフェスト

今回から何回かにわけて、Python製のWebフレームワーク『Django』を使ってWebサービスを作り、実際にVPSにデプロイして全世界に公開するまでの手順を書いていきます。

## 想定する読者の方
Webサービスをローカルの開発環境で作るだけでなく、実際にVPSにデプロイしてインターネット公開するまでやっていきます。Webはいろいろな技術を組み合わせてものができるので、GitやLinux、Apacheといった用語が出てきます。なので本当に理解しようとするといろいろなことをキャッチアップしないといけません。

プログラミングやWebに関する知識が無いとその分何をやっているのか見えないとは思います。ただ個人的にはまず動くものがあったほうが、どうやってそれが動いているかを理解しやすいと考えているので、まずはコピペの連続でもいいので簡単な完成形を作ることを目的にします。動かないものは動かない理由がたくさん考えられ、さらにそれら原因が複数あることが多いです。しかしまず動くものがあると、それ前提でいじって動かなくなったとしても、そのいじった部分が動かなくなった原因であることは自明です。なので五里霧中というか、闇雲にいろいろ試して時間を浪費するけど結局よくわからない、みたいな負のスパイラルになるべくはまらずに学習できると考えています。

ということで、全然Webやプログラミングの知識が無い方でも、とりあえず説明をなぞったら動くものができた、というレベルを目指します。
そのため本当に初歩的なこととかも書きますが、ご存知の方も多いと思うので適宜読み飛ばしていただければと思います。

## マニュフェスト
全体的には下記の図に出てくるような内容を書いていきます。

![Overall Structure.png](https://qiita-image-store.s3.amazonaws.com/0/113133/1fe94c72-e620-1e0a-8aac-cca1c331d5f0.png)

自分のローカル開発環境でDjango製のWebアプリケーションを開発。それを本番環境であるVPSにデプロイし、インターネット接続を可能にするという流れです。

### 技術的な内容
- **Django** : Python製Webフレームワーク
- **Pinax** : 予めいろいろな機能が内包されている、Djangoでできた雛形アプリケーションです。
  - ユーザー管理タイプ（登録・ログイン・ログアウト・退会等）
  - 決済管理タイプ（Stripeとの連携機能）
  - ブログ管理タイプ（記事の投稿・編集・公開等）  
  ... などなど、作りたいサイトに合わせていろんな種類が用意されています。今回は`Pinax-Account`というオーソドックスなユーザー管理用アプリケーションを利用してWebサービスを作っていきます。
- **VPS（バーチャルプライベートサーバー）** : 作ったアプリケーションをホスティングするためのインフラです。イメージ的にはどこかにあるサーバーを借りて、それを自由に使うという感じです。VPS特有の内容でなにかキャッチアップするというよりも、下記のような基本的な内容を舐める形になります。  
  - **Centos7** : Linux系のOSで、Webサーバーによく利用されるものです。
  - **Apache** : 老舗Webサーバーソフトです。
  - **Git** : バージョン管理ソフトです。複数人で開発を効率的に行うためのものですが、今回はローカルのPCとVPSをつなぐために利用します。  
  
  DjangoでWebアプリケーションを作りそれを公開する場合、herokuが頻繁に利用されるように感じます。ただ、個人の趣味とは言えWebサービスを開発・公開して運営していくとなるといささかハードルがあるので、より自由度が高く融通が効いて安いVPSを利用していきます。  

### 作るWebサービス
題材として、下記のような仕様のTODOアプリを作成していきます。（かなりありきたりかつつまらなくてすいません。）  

- 会員登録すると利用できる
- TODOを作成・削除できる
- TODOを一覧表示できる
- プロジェクトを作って複数のTODOをまとめられる
  
本来必要な機能は全然足りない状態で進めますが、その辺りは長期的に記事を書いて、その時の題材として使い回せるようにしていきます。

### 環境構築周りの話を先に終わらせます
個人的にWebフレームワークを学習するときなんかは、環境構築はそうそうに早くコードを書きたくなります。しかしせっかく時間をかけて作っていざサーバーを借りて公開しようとしても、使おうとしていたライブラリの制約があったり、データベースに制限があったりで、大幅に後戻りをするということが起きることがあります。
なのでそういった不確実性が高いものからリスクを潰していくということもあり、まず先にWebアプリケーションが公開できるというところまで持っていって、その後ようやくTODOアプリとして拡張していきます。

- 前提
  - Macを利用します。
  - 統合開発環境PyCharmを利用します。
  - Pythonの簡単な構文はご存知という前提で進めていきます。

## 初学者の方へ
もしPython（プログラミング言語）、インフラ、OS、みたいな単語がピンとこない、それらがWeb全体の中でどんな役割を担っているのかわからない、という場合は下記の記事を先に読んだほうが全体像を俯瞰しながら進めることができると思います。（わからないまま進めても大丈夫なようにはしようと思います。）

[webサービス(webアプリ)を1年独学で個人開発してきた僕の作り方](http://mtitg.com/how-to-make-webservice/)
[これからIT業界を目指す人へ 知っておきたいWeb開発の基本](https://kuguru.jp/2062)
[Webの仕組みとプログラミング言語](https://www.slideshare.net/YossyTaka/web-53212467)

## 次回
それでは、Macにいろいろインストールして、Webアプリケーションにローカルでアクセスするまでをやっていきます。

[Django ×PinaxでWebサービス入門②｜ローカルアプリ編](https://qiita.com/mtitg/items/91f4accad77d1888c883)
文字列の置換

Javaで日付文字列の置換を行います。

```java:Java

package example;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class ReplaceTestDate {

    public static void main(String[] args) {

        LocalDate localDate = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;

        String todayMinus1 = localDate.minusDays(1).format(formatter);
        String today = localDate.format(formatter);
        String todayPlus1 = localDate.plusDays(1).format(formatter);
        String todayPlus2 = localDate.plusDays(2).format(formatter);

        String[] lines = {
                "\"1\", \"2\", \"a\", \"b\", \"あ\", \"$_TODAY_MINUS_1_$\"",
                "\"1\", \"2\", \"a\", \"b\", \"$_TODAY_$\", \"あ\"",
                "\"1\", \"2\", \"a\", \"$_TODAY_PLUS_1_$\", \"b\", \"あ\"",
                "\"1\", \"2\", \"$_TODAY_PLUS_2_$\", \"a\", \"b\", \"あ\"",
        };

        Path csvFile = Paths.get("CSV/ReplaceTestDate.csv");
        Path backupFile = Paths.get("CSV/ReplaceTestDate_orig.csv");
        StandardCopyOption copyOption = StandardCopyOption.REPLACE_EXISTING;

        try (FileOutputStream fos = new FileOutputStream(csvFile.toString(), true);
                OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
                BufferedWriter bw = new BufferedWriter(osw)) {

            Files.copy(csvFile, backupFile, copyOption);

            for (String line : lines) {
                String replacedLine = line
                        .replace("$_TODAY_MINUS_1_$", todayMinus1)
                        .replace("$_TODAY_$", today)
                        .replace("$_TODAY_PLUS_1_$", todayPlus1)
                        .replace("$_TODAY_PLUS_2_$", todayPlus2);
                bw.write(replacedLine + "\n");
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        }

        try {
            Files.copy(backupFile, csvFile, copyOption);

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
```
【Salesforce:コミュニティ】お問い合わせフォームの項目の名前を変更する方法

salesforceのコミュニティクラウドを使って、問い合わせをフォームを作ることができます。
その際、標準では、ケースの「項目の表示ラベル」名が、フォームの項目のラベルとしてされます。

標準的に作るとこんなイメージ。

<img width="797" alt="スクリーンショット 2018-06-03 18.06.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/30859/e2be9c9f-fa23-bc30-29fe-e4cf297d361f.png">

さすがにこれはイケてない・・・
salesforceのカスタマーサポートに問い合わせたところ出来るよう。

```

下記の設定より、表示ラベルを変更することで、コンポーネントの差し込み項目も変更できます。

ただし、こちらの設定は組織全体に影響しますので、Salesforce の内部組織のケースオブジェクトの
項目の表示ラベルも変更されますのでご留意くださいますようお願いいたします。

　[ 手順 ]
　1. 設定より [タブと表示ラベルの名称変更] メニューを検索し、開きます
　2. 「ケース」横の「編集」をクリックします
　3. オブジェクト名の変更は行いませんので、「次へ」をクリックします
　4. 「WEB会社名」など各項目の横の名前を編集し、保存します

　■参考：タブと項目の表示ラベルの名称変更に関する考慮事項 
　https://help.salesforce.com/apex/HTViewHelpDoc?id=customize_rename_considerations.htm&language=ja 

```

やったところ問題無く変更できました。

<img width="770" alt="スクリーンショット 2018-06-03 18.00.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/30859/fe36e9bf-55bd-02cb-8247-5f33388a74ff.png">

おしまい。
JavaScript 初心者の備忘録

JavaScript を勉強していると、覚えておくべきルールがたくさんあります。
主なとこだけでも、書き留めておきます。

#jQueryとは
DOM要素を簡単に取得できるライブラリ

##設定方法は
ダウンロードしてセットする方法
公開ライブラリにリンクする方法

##DOMとは
DOM（Document Object Model）
ダグで作成されたドキュメント
[参照]
http://piyo-js.com/05/dom.html

##DOM要素の選択方法
idで選択

```javascript
$("#target")
```

classで選択

```javascript
$(".target")
```

CSSのセレクタで指定

```javascript
$("div.target")  //<div>でクラスが target
$("div span")    //<div>内の <span>
```