OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCIをGitHubと連携して使ってみた　

### 注意点

:warning: とりあえず動かしてみたい人向けです

### 同期

+ [builderscon tokyo 2018](https://builderscon.io/tokyo/2018) で [CircleCIの話](https://builderscon.io/tokyo/2018/session/5a57092f-b6c8-4fe3-b0c4-f3a3f5d5d46c)を聞いて久しぶりに使ってみたくなりました
+ 現状のバージョンは CircleCI 2.1.5が最新(2018/10 現在)
    + https://circleci.com/server/changelog/
+ [2017/01/11] CircleCI 2.0 Reaches General Availability
    + https://circleci.com/blog/launching-today-circleci-2-0-reaches-general-availability/

### 参考資料

+ 公式

https://circleci.com/docs/2.0/sample-config/


# 実際に書いてみましょう

## hello worldを出すだけの簡単な設定

### GitHub

https://github.com/iganari/circleci-test

### ソースと簡単な説明

+ PATH
    + Repository内に下記のPATHで設定ファイルを配置します

```
.circleci/config.yml
```

+ ソース

```
version: 2 
jobs:       
  build:
    docker:
      - image: iganarix/base-alpine
    steps:
      - checkout
      - run:
          name: Hello World TEST
          command: "echo 'Hello World !!!'"
workflows:
  version: 2
  build_test:
    jobs:
      - build
```

+ こうなります


![circleci-fs-01.png](https://qiita-image-store.s3.amazonaws.com/0/25582/b0862547-70c4-54ff-aac5-61d26fee0259.png)
![circleci-fs-02.png](https://qiita-image-store.s3.amazonaws.com/0/25582/4ee1800c-4b58-4fd6-615a-820e1a89f950.png)


この中で、 

+ `image: iganarix/base-alpine` のとこは、別のコンテナでも動きます
+ `build_test:` のところは違う名前でも動きます
    + 単なる表示名っぽいので、 `hogehoge:` でも動きます
+ 公式のHello Worldより若干手を入れています
    + https://circleci.com/docs/2.0/hello-world/#section=getting-started


# まとめ

+ CircleCI 2.0 になって、処理が早くなりました!! (今回のテストは簡単過ぎるため、コンテナの恩恵はほぼ出てません)
+ 導入の閾値はそこまで高くなさそうです!! (今回の趣旨)
+ 公式ドキュメントも(読み込めば)怖くない!! (これからの課題)


### Let's Enjoy CircleCI 2.0 !! :relaxed:

# おまけ

### QitiaでCircleCIの記事たち

https://qiita.com/tags/circleci

### Tips

+ `name` はきちんと書いた方が良いです
    + ブラウザでJobsを確認した時に分かりやすいです
+ 公式のサンプルを見ればだいたいのことが書いてあるけど、慣れないとしんどいかもしれない…
    + 普段gitlab-ciをよく書くので、公式を見つつ推察した部分は少しあります
    + もしくは公式を熟読する気力があれば…
+ 公式資料のとくに下記を見ておくとなんとなく書き方が分かります
    + [EXAMPLES](https://circleci.com/docs/2.0/examples-intro/#section=configuration)
    + [ADVANCED CONFIG](https://circleci.com/docs/2.0/adv-config/#section=configuration)
+ SSH鍵について
    + ちょっと思うところがあったので別の記事にまとめます
C++ Builder XE4 > IDE Insight search box > TLabel, TEditのCaption, Text編集 > Capで検索すればいい

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

- [C++ Builder XE4 > IDE > IDE Insight search box > TButtonのNameプロパティ(@オブジェクトインスペクタ)にジャンプ](https://qiita.com/7of9/items/8dd5986e4d0ffa4a2b4e)

下記のCaptionとTextの修正があるとする。

- TLabel (Caption)
- TEdit (Text)

IDE Insight search boxにおいては「どちらともCapで検索」すればいい。

TEditの場合、下記となるから。

![2018-10-17_10h06_47.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3123d03f-a3cf-6940-c84c-d32967af9a39.png)
送金処理。Etherを送金

解除したいアカウント

```
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x53c21065cce445d95dd0376083aca950f760d71d
Passphrase:
true
```

実際にEtehrを送金してみる。

```
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(10, "ether")})
INFO [12-24|12:49:53] Submitted transaction                    fullhash=0xe88c8984d53a340628f30f0c4e425d9a7776e6c8465b21ab9a2d972f71f08f2a recipient=0xcc308c4cA7Df6694479bBd31B3AeC7E78BFbd5F1
"0xe88c8984d53a340628f30f0c4e425d9a7776e6c8465b21ab9a2d972f71f08f2a"
```

ここではまだ送金されてない。


未処理のトランザクションの取得
```> eth.pendingTransactions```

トランザクション詳細の取得
```> eth.getTransaction("トランザクションID")```


マイニングを実行

```> miner.start(1)```


```
> eth.pendingTransactions
[]

> eth.blockNumber
68 <- 数字が増えているかどうか

> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
10
```
viもしくはvimでファイルを開いたら文字化け・・・。でも、慌てずファイルエンコードを変えれば読めるよ!

# viもしくはvimでファイルを開いたら文字化け・・・。でも、慌てずファイルエンコードを変えれば読めるよ!


う～ん。viの使い方ぐらいSEなら覚えようよ・・・。
viで文字化けしてたからって、scpでgetしてエディタで開くとか時間の無駄だから・・・。

## まずは、viの文字コードを確認

```console:viでファイル開いた状態で
:set enc?
```

すると画面最下部に[encoding=<文字コード>]って表示されるから、これがviのデフォルトの[fileencodings]もしくは[encoding]だよ。
都度viで設定が面倒なら、ユーザ毎に[~/.vimrc]にて設定出来るから。

ちなみに

```console:確実にファイルの文字コードを調べたいなら(他にも調べる方法はあるから自分で調べてね)
nkf --guess <file name>
Shift_JIS (LF)
```

## [~/.vimrc]の設定するなら
[~/.vimrc]の設定内容は、こんな感じで

```
# default encoding
set encoding=utf-8

# Character code when opening. 
# If more than one is specified, it tries to open with matched ones from the beginning.
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8

# Automatic recognition of line feed code.
set fileformats=unix,dos,mac
```

## vi上で文字コードを変更

```console:vi上で表示の文字コードを変更するなら
:e ++enc=<文字コード>
```

これで読めるようにはなったでしょ？

## vi上で文字コードを変更して保存するなら

もし、ファイルが意図しない文字コードであれば、文字コードを変更して保存することもデキるからね。

```console:ファイルの文字コード変更
:set fenc=<文字コード>
```

```console:もちろん、その後保存してね
:wq
```
SWI-Prolog で JSON ファイルを読む

```text:json_read.pl
/* ------------------------------------------------------------------- */
/*
	json_read.pl

						Oct/18/2018
*/
/* ------------------------------------------------------------------- */
:- use_module([ library(http/json) ]).
:- initialization main.
 
/* ------------------------------------------------------------------- */
%% [4-6-8]:
display_line_proc(Dict,Key) :-
	write(current_output ,Key),
	write(current_output ,'\t'),
	write(current_output ,Dict.Key.name),
	write(current_output ,'\t'),
	write(current_output ,Dict.Key.population),
	write(current_output ,'\t'),
	writeln(current_output ,Dict.Key.date_mod).
/* ------------------------------------------------------------------- */
%% [4-6]:
print_list(Dict,[]).
print_list(Dict,[Element|List]) :-
	display_line_proc(Dict,Element),
	print_list(Dict,List).

/* ------------------------------------------------------------------- */
%% [4]:
reading_JSON_term(File_in) :-
	write(File_in),nl,
	open(File_in, read, Stream, [] ),
	json_read_dict(Stream, Dict, []),
	close(Stream),
%%
	dict_keys(Dict,Keys),
	length(Keys,Ll),
	writeln(current_output , Ll),
	print_list(Dict,Keys).

/* ------------------------------------------------------------------- */
main(Argv) :-
	format('*** 開始 ***\n'),
	format('Argv: ~w\n', [Argv]),
	[File_in|_] = Argv,
	reading_JSON_term(File_in),
	format('*** 終了 ***\n'),
	halt.

/* ------------------------------------------------------------------- */
```

実行方法

```bash
swipl -f ./json_read.pl /var/tmp/json/cities.json
```
ドメイン取得からELBへのSSL証明書登録（完全無料）

# はじめに

ドメイン取得からELBへの証明書登録まで行います。

# 前提条件

* AWSアカウントを持っていること。

# ドメイン取得

以下のサイトからドメインを取得します。
[Freenom](http://www.freenom.com/ja/index.html)

# ホストゾーン登録

[Route53] -> [Hosted zones] -> [Create Hosted Zone]の順でクリックします。

|項目|設定値|
|:--|:--|
|Domain Name|取得したドメイン名|
|Comment|任意|
|Type|Public Hosted Zone|

上記の内容を入力し、[Create]ボタンをクリックします。

# DNS設定

[Freenom](http://www.freenom.com/ja/index.html)を開きます。

上部メニューの[Services] -> [My Domains]をクリックします。

登録したドメインの[Manage Domain]をクリックします。

[Management Tools]タブの[Nameservers]をクリックします。

[Use custom nameservers]にチェックする。

Nameserver1〜4に、Route53でホストゾーン登録時に作成されたNSレコードを設定する。
注意）NSレコードをコピー時に最後のピリオド「.」は除く。

上記の設定が完了後、[Change Nameservers]ボタンをクリックする。

# メールの設定
※東京リージョンがないので、バージニア北部で行います。

[SES] -> [Domains] -> [Verify a New Domain]の順でクリックします。

|項目|設定値|
|:--|:--|
|Domain|取得したドメイン名|
|Generate DKIM Setting|チェックなし|

上記の内容を入力し、[Verify This Domain]ボタンをクリックします。

[Use Route 53]ボタンをクリックする。

警告メッセージが表示されたら、以下の項目のチェックボックスにチェックを入れます。

* Domain Verification
* Email Receiving Record
* 登録したホストゾーン

[Create Record Sets]ボタンをクリックします。

※認証が完了するまで、最大72時間かかります。

# 受信設定

[SES] -> [Rule Sets] -> [Create Rule]をクリックします。

## Step 1: Recipients

|項目|設定値|
|:--|:--|
|Recipient|取得したドメイン名|

上記の内容を入力後、[Add Recipient]ボタンクリックします。

[Next Step]ボタンをクリックします。

## Step 2: Actions

[Add action]で「S3」と「Stop Rule Set」を追加する。

### S3の設定

|項目|設定値|
|:--|:--|
|S3 Bucket|メールを受信するバケット名|
|Object key prefix|キー名|
|Encrypt Message|チェックなし|
|SNS topic|None|

### Stop Rule Setの設定

|項目|設定値|
|:--|:--|
|SNS topic|None|

[Next Step]ボタンをクリックします。

## Step 3: Rule details

|項目|設定値|
|:--|:--|
|Rule name|一覧上に表示されるルール名|
他の項目はそのままにしておきます。

[Next Step]ボタンをクリックします。

登録したルールのステータスがEnabledになっていることを確認します。

# 証明書発行（ACM）

[Certificate Manager] -> [証明書のリクエスト]をクリックします。

ドメイン名に以下の内容を追加します。入力テキストの追加は[この証明書に別の名前を追加]ボタンで行います。

* ワイルドカードありのドメイン名
* ワイルドカードなしのドメイン名

[確認とリクエスト]ボタンをクリックします。

承認メールがS3に届くので確認します。受信先は受信設定で設定したパスです。

メールの内容を開き、https://〜で始まるリンクを探し、ブラウザで開きます。

内容を確認後、[I Approve]ボタンをクリックします。

# ELBに証明書を設定

[EC2] -> [ロードバランサ]をクリックします。

証明書を設定したいELBを選択します。

[リスナー]タブを開き、[編集]ボタンをクリックします。

[追加]ボタンをクリックします。

|項目|設定値|
|:--|:--|
|ロードバランサのプロトコル|SSL、またはHTTPS|
|ロードバランサのポート|443|
|インスタンスのプロトコル|任意|
|インスタンスのポート|任意|

SSL証明書の[変更]をクリックします。

|項目|設定値|
|:--|:--|
|証明書タイプ|AWS証明書マネージャ（ACM）から、既存の証明書を選択する。|
|修了書|取得した証明書|

[保存]ボタンをクリックします。

# 参考サイト

[無料ドメイン(.tk)とRoute53を利用して0円でHTTPS環境を設定してみた](http://dev.classmethod.jp/cloud/aws/mesoko-r53-cdn/)
Rails — ActiveModel::Conversion to_partial_path のパス生成 ( people/person ってどこから出てきたの？ )

## この例

```rb
class Person
  include ActiveModel::Conversion
end

person = Person.new
person.to_partial_path # => "people/person"
```

https://api.rubyonrails.org/classes/ActiveModel/Conversion.html

peopleってどこから出てきたの？

## 他のクラスで試してみる

```rb
class Dog
  include ActiveModel::Conversion
end

person = Person.new
person.to_partial_path # => "dogs/dog"
```

Dog の場合は `dogs/dog` が生成された。

どうやら Person クラスの場合は、 **person の複数形である people に変換** されているようだ。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
メタデータ　

## メタデータとは

種となるデータの説明書きが書いてあるデータの事


## 例

```

Wordで作ったファイル「piyota.docx」


メタデータには

・作った人はピヨ太君です
・2017年2月17日に作りました
・ファイルの大きさは、100キロバイトです

といった

```


## 参考記事

https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF

https://wa3.i-3-i.info/word15688.html
[VSCode]No symbol information for the file

# 現象

Symbolの参照リストを開こうとするとこんな感じのエラーが出て、参照が全くでない状態になる
![Screen Shot 2018-10-17 at 9.34.17.png](https://qiita-image-store.s3.amazonaws.com/0/132627/d43bc022-3c11-97bf-d154-7fd9ae12692e.png)

# 原因

OmniSharp Logを出力するとプロジェクトをロード中にタイムアウトしていることがわかる

```
[ERROR] Error: OmniSharp server load timed out. Use the 'omnisharp.projectLoadTimeout' setting to override the default delay (one minute).
```

# 対策

⌘,でUser Settingsを呼び出し、検索窓に`project load`と記入すると、Omnisharpのロードタイムアウト時間を設定できる項目が出てくる

![Screen Shot 2018-10-17 at 9.43.09.png](https://qiita-image-store.s3.amazonaws.com/0/132627/cf442e5c-0097-b040-a102-47b4c60073c2.png)

この時、デフォルトで60sが指定されているため、600sに変更することで正常にロードされるようになった。
iPhoneで簡単にSSH接続 ”iOS12のショートカット”

#概要
iOS12に面白い機能が追加されたと聞いて、色々遊んでみました。
その中で、iOS12で追加された"ショートカット"アプリを用いて、SSH接続に挑戦してみます。

#検証環境
今回は手元に、ev3devというLinuxを導入したレゴのEV3があったので、接続先はEV3としました。
- iOS 12.0.1 (iPhoneSE)
- 教育版レゴ マインドストーム EV3
- ev3dev 4.14.61-ev3dev-2.2.2-ev3

#検証手順
1. iPhoneへ["ショートカット"](https://itunes.apple.com/jp/app/workflow/id915249334?mt=8)というアプリをインストールします。
2. "ショートカット"を起動すると以下の画面になるので、"＋ショートカットを作成"か、右上の＋をタッチ。

<img width="320" alt="20181016_025358000_iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/265266/cc0f40cb-365e-c27b-0198-8dcca92b748b.png">
3. SSHで検索すると、"SSH経由でスクリプトを実行"が見つかるので選択。

<img width="320" alt="20181016_025419000_iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/265266/11c815fa-5a8e-9924-ba9d-2f023d9b6083.png">
4. 各種設定とスクリプトを書きます。名前やアイコン、Siriとの連携は右の設定マークから。

<img width="320" alt="20181016_025436000_iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/265266/61da7022-c069-2035-c2d7-96d3f6f838a1.png">
5. 編集画面の中央再生ボタンか、ライブラリのアイコンをタッチしてコマンド送信。

<img width="320" alt="20181016_030953000_iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/265266/2bfc7c94-f7d4-9261-3ea5-5588f27c19b5.png">

#まとめ
iOSから簡単にSSH接続できました。サーバ上に簡単に接続できることで、色々な活用方法が考えられそうですね。
Siriと連携すれば、音声操作も簡単に実装できるので、近いうちに記事にしたいと思います。
##参考情報
以下の記事でショートカットの面白い使い方を紹介されています。
["iOS12のShortcutsで今日の金曜ロードショウを確認するショートカット作ってみた"](https://qiita.com/kouichirou/items/a8b6b5f43075cf5c1e39)
Log4jの出力がハテナになってしまう問題＠CentOS7

Log4jでログ出力しているバッチを叩いたら下記みたいな感じになった。
新しい環境なのでまぁ色々設定もれてるんかなと思い、解決するまでの備忘録
Log4jまわりでほんのり検索してもパッと出てこなかったので書いておく

```bash
[test]$ java -jar test.jar
2018/10/17 08:48:53.402 [main] INFO   ??????????
```

# 文字コード

端末（putty）の文字コード、と開発している環境の文字コードを一応調査した。
問題なくUTF-8(CJK)で統一されていた

# ロケール

ハテナで出るときはだいたいここがおかしい。
CentOS7はlocalectlがあるので確認が楽なのがよいね。ということでぽち

```bash
[test]$ localectl
   System Locale: LANG=C
       VC Keymap: jp106
      X11 Layout: jp
```

System LocaleがCになってるのが怪しい。
ja_JPに変えたいので変更できるロケール一覧を表示する。grepにはiオプション付けたほうがいいかも

```bash
[test]$ localectl list-locales | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```

ja_JP.utf8があったので設定変更する。
ユーザー権限で叩いたら怒られたのでsudoかrootにスイッチするかしてくれ。

```bash
[test]$ localectl set-locale LANG=ja_JP.utf8
==== AUTHENTICATING FOR org.freedesktop.locale1.set-locale ===
Authentication is required to set the system locale.
Authenticating as: root
Password:
==== AUTHENTICATION COMPLETE ===
```

sudo権限なしのパスワード認証ザルサーバーなのでパスワードぽちぽちして設定変更完了。確認

```bash
[test]$ localectl
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp106
      X11 Layout: jp

```

よしよし、これでいけるだろ。

```bash
[test]$ java -jar test.jar
2018/10/17 09:18:21.995 [main] INFO   ??????????
```

＿人人人人人人人人人人人人＿
＞　進捗駄目です！！！！　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣

いやいや…この手のものは設定変えただけでは反映されないというのが世の常。
なので読み込み直す、リログでも可

```bash
[test]$ source /etc/locale.conf
[test]$
[test]$ java -jar test.jar
2018/10/17 09:20:36.583 [main] INFO   システムを開始します
```

お疲れ様でした
AssumeRoleできるかをローカルで検証する

## 事の発端

Bアカウントが作成したS3バケットにAアカウントで書き込みたい。
Bアカウントの人にお願いしてバケットポリシーを書いてもらい、AアカウントからS3バケットへ書き込めるようにしてもらった。
無事に書き込めたが、BアカウントからS3オブジェクトに対して操作ができないと言われた。

### なぜか？
ご存知だと思うが、この方法を使ってBアカウントの持つS3バケットにAアカウントを使ってオブジェクトを書き込めるが、
オブジェクトに対する操作ができない。これはオブジェクトの所有者がAアカウントになっている為である。
具体的にはオブジェクトに対する閲覧、権限変更ができない。しかしバケット自体に権限はあるのでBアカウントからオブジェクトを削除することは可能。
どうすればAアカウントからアップロードしたS3オブジェクトに対し、Bアカウントにも権限を付与できるか。

## 解決策
AssumeRoleを使ってBアカウントとして書き込めば、そのオブジェクトはBアカウントが所有者となるので、自由に権限を操作できる。
Bアカウントにお願いし、Aアカウントで用意したRole(以下、A-role)にのみAssumeでき、S3バケットに対して操作できるRole(以下、B-role)を用意してもらった。
これでAssumeRoleすれば書き込めるぞ！

## ここで壁に当たる。
本当にA-roleでAssumeRoleできるのか検証しないといけない。
しかも操作するのはAWS Batchであった為、いちいちコンテナにスクリプト入れて試行錯誤する必要があって、とても手間がかかる。面倒。
AssumeできるのはA-roleにのみ許可されているので、Aアカウントに所属するIAMユーザーを使ってクレデンシャルを発行してもそのIAMユーザーにはB-RoleをAssumeできる権限はない。
あくまでA-Roleでないといけない。しかしA-Roleにクレデンシャルは発行できない。どうする・・・

## ここで思いつく。
そうだ！A-RoleをさらにAssumeできるIAMユーザーを発行して、A-roleにAssumeし、
さらにそこからB-roleをAssumeすればいいんだ！

コードだと以下のような感じ。

```python
import boto3
from boto3.session import Session

def main():
    # ユーザーとして入る。このユーザーはA-roleをAssumeできる権限があり、A-roleから信頼済みアカウントとして定義されている。
    client = boto3.client(
        'sts', 
        aws_access_key_id="A:User:xxx", 
        aws_secret_access_key="yyy")
    
    account_id = client.get_caller_identity()
    print("1. {}".format(account_id))

    # ユーザーとしてA-roleの権限をAssumeする。
    response = client.assume_role(
                RoleArn="arn:aws:iam::A:role/A-role",
                RoleSessionName="A-role"
            )
    
    # A-roleでクライアントを作る。
    A_session = Session(aws_access_key_id=response['Credentials']['AccessKeyId'],
                    aws_secret_access_key=response['Credentials']['SecretAccessKey'],
                    aws_session_token=response['Credentials']['SessionToken'],
                    region_name=REGION_NAME)
    A_client = A_session.client('sts')
    account_id = A_client.get_caller_identity()
    print("2. {}".format(account_id))
    
    # A-roleのクライアントを使ってAssumeRoleを行う。このRoleであれば許可されている為、Assumeできる。
    # このRoleにS3のアクセス権限がある。このRoleをAssumeできるのはA-roleのみ。
    response = A_client.assume_role(
                RoleArn="arn:aws:iam::B:role/B-role",
                RoleSessionName="Assume",
            )
    
    B_session = Session(aws_access_key_id=response['Credentials']['AccessKeyId'],
                    aws_secret_access_key=response['Credentials']['SecretAccessKey'],
                    aws_session_token=response['Credentials']['SessionToken'],
                    region_name=REGION_NAME)  
    B_client = B_session.client('sts')
    account_id = B_client.get_caller_identity()
    print("3. {}".format(account_id))

    # S3バケットにアップロードしてみる。B-roleにはS3バケットへの操作権限があるので書き込める。
    # またAssumeしているのでそのオブジェクトの所有者もBアカウントとなる。
    s3 = B_session.resource('s3')
    s3.meta.client.upload_file('A.png', "B-bucket", 'A.png')


if __name__ == "__main__":
    main()
```

## まとめ
結局何がしたかったのかというと、RoleにのみAssumeが許可されている場合、いちいちEC2等にアタッチして検証するのは面倒なので、IAMユーザーを使って疑似的にEC2が行っている権限情報をSTSから貰う仕組みをやっている感じです。
EC2ならいいけど、これがコンテナ経由だとコンテナデプロイやって試行錯誤していると時間がもったいないので、お手軽にできるかと思います。
PHPでの関数の定義と組み込み関数

PHPで関数を定義する時は、👇
```php
<?php
function sayHello($name="world") {
  echo "hello! ".$name;
}
sayHello();
# hello! 
```
詳しく説明すると、
```
function <定義したい関数名>($<変数名>="入れる値") {
　　<行いたい処理>;
}
<定義した関数名>();
```
となる。

しかし、PHPには**組み込み関数**という元々用意されている関数があるので、わざわざ定義しなくても良いことがある。

例えば、
- ceil
小数点以下を切り上げる
- floor
小数点以下を切り捨てる
- round
四捨五入
- rand(1,10)
リロードする度に乱数を生成、適当に数字を引っ張ってきてくれる
- strlen
文字数(英数字)を数える。

など。
組み込み関数を知っておくと、プログラムを書くのが楽になる👍
GET、POSTについてわかりやすく解説してみた

# はじめに

現在、Ruby on Railsのプログラミングスクールに通っています。
先日、一通りカリキュラムを終わらせたのですが、まず感じたことが「あ、これ**Railsが書ける人**になっただけだ。」でした。
コードが書けるのはもちろん大事なのですが、それだけでは**エンジニア**にはなれなそうです。
「Railsが書けるだけの人」→「エンジニア」に近づくために今回は、HTTPメソッドの「GET」、「POST」についてわかりやすく解説していきます！

# そもそもHTTPメソッドとは
私たちが「あの記事読みたい！」と思ったとき、リンクをクリックしますよね？
私たちが「よし、記事ができた！投稿だ！」というとき、「Qiitaに投稿」をクリックしますよね？
クリックしたとき、サーバーと通信が行われます。
私たち（クライアント）がサーバーと通信するときに「HTTPリクエスト」が送られます。
そのときにサーバーに要求する処理の種類が**HTTPメソッド**です。
主に使われるのはGET、POSTです。
他にもPUT,DELETEなどいろいろあります。

<img width="785" alt="スクリーンショット 2018-10-17 7.11.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/276589/e27cb458-ed9d-ea93-4e8d-7f91e9b981ac.png">

# GETについて
簡単に言うとGETは**「そのページください」**って意味です。
リンクをクリックして見たいページに飛ぶときに使われます。

# POSTについて
簡単に言うとPOSTは**「このデータあげます」**って意味です。
基本的にサーバーのDBにデータを保存したいときなどに使われます。

# くらべてみましょう！
GETとPOST。
くらべてみたほうが理解しやすそうなので比較していきます！

### ○リクエストの送り方
GET・・・`GET/login.html?name=test&pass=123`
POST・・・`POST/login.html HTTP/1.1`

上記はあるサイトにログインしたときの例です。
GETを使ってデータ送信する場合、URLの後ろに送りたいデータを付与して送ります。
一方、POSTを使った場合、URLではなく、HTTPリクエスト内のメッセージボディというところにログインデータを入れて送られます。

この場合、GETを利用してログインするとURLにデータが組み込まれるため、送ったデータがブラウザの履歴に残ってしまいます。
つまり、ユーザー名やパスワードを盗み見られる可能性があります。
でもPOSTを利用してログインすれば、メッセージボディ内にデータが組み込まれるので、履歴にデータが残るということはありません。
なので、こちらからデータを入力してサーバに渡すときは機密性の高いPOSTメソッドを使います。

### ○ブックマーク
GET・・・できる
POST・・・できない

そもそもブックマークとは頻繁に訪れるWebページの**URL**を登録しておくことです。
GETにはURLにページの全てのデータがあるのでブックマークができます。
POSTはURLだけでなく、メッセージボディ内にもページのデータがあるので、ブックマークすることができません。

わかりやすく例を挙げると、
Qiitaの検索で「Rails」と検索するとします。
GETの場合、`https://qiita.com/search?q=Rails`
POSTの場合、`https://qiita.com/search`
というURLになるので、POSTの`https://qiita.com/search`をブックマークをしても「Rails」を検索したページが表示されないということになります。

ちなみにQiitaの検索は（というか検索は基本的に）GETで通信されるので検索結果を表示したページをブックマークすることができます！
ご安心を！

### ○文字数制限
GET・・・2048文字
POST・・・無制限

URLに使用できる文字数が2048文字なので、データを全てURLにのせるGETは気をつけましょう。
大量のデータを送りたい場合は、POSTを使いましょう。

#参考記事
[GETとPOSTの使い分け ついでにPUTとDELETE](https://qiita.com/qiita_taro/items/66f2930c5d1cc10722e7)
[GETとPOSTの違いについて](https://qiita.com/kanataxa/items/522efb74421255f0e0a1)

#最後に
この記事を書いて「普通はGET」、「保存するときはPOST」となんとなく使っていたことを反省しました笑
この「なんとなく」のところを言葉でわかりやすく説明できるように意識して記事を書いていきます！
なにか間違っているところなどあればご指摘ください！
C++ Builder XE4 > ショートカットキー > Tool paletteへフォーカスを移す (IDE Insight search boxと組合せて使う) > Ctrl+Alt+P

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

- [C++ Builder XE4 > IDE > IDE Insight search box > TButtonのNameプロパティ(@オブジェクトインスペクタ)にジャンプ](https://qiita.com/7of9/items/8dd5986e4d0ffa4a2b4e)


上記の操作により、フォームデザインにおいてプロパティの変更作業はかどる。
(「nameを変更したい」->F6, name, <kbd>Return</kbd> -> 変更)

一方で、フォームにコンポーネントを追加する時は、ツールパレットに移動する必要がある。

ツールパレットに移動するキーは何か?

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Default_Keyboard_Shortcuts

> Ctrl+Alt+P
> View > Tool Palette
> Opens the Tool Palette pane.

<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>P</kbd>
で可能のようだ。
（忘れるだろう)
数学オンチのプログラマが数学を学習し直すらしいです【目次】【随時更新】

# はじめに
この記事は、ゲームプログラミングや深層学習を始めるに辺り、数学の理解の乏しさを痛感した筆者が、HaskellやPythonを電卓にして、数学を学び直そう、数式が読めて理解ができるようになろう。という試みである。

このシリーズは、
「まず数学記号を読めて、意味が理解できるようになろう」
「ついでにそれをソースコードで表せるようになろう」
が目標の、かなり小馬鹿にしたようなものとなるので、ご容赦いただきたい。

## 筆者性能

* 全日制普通科高校卒業（2009年）
* 基本情報技術者試験合格（2010年）
* 2年制情報系専門学校卒業（2011年）

とは言ったものの、

* 中学時代から数学の赤点ギリギリコース
* 高校時代も赤点ギリギリコース
* 専門学校でビット演算を習ってようやく論理和・積が理解できた（はず）
* 高校で物理は受講していたが、やっぱり赤点ギリギリ

である。

まず文章題の読み解きに時間がかかる。更にいうと、それをどうやって数式に起こしたり、数学で処理するのかが思いつかない。三角関数の波を描くグラフも、5年前（つまり高校を卒業して5年後）に意味がわかった。それくらい数学オンチである。

---

奇遇にも、自分のような数学のつまづき方をした方がいたら、
「ああ、こいつはそうやって理解したんだ」
という参考になれば幸いである。

# 目次（TODOリスト）

* [集合（論理和・論理積）](https://qiita.com/manzyun/items/3f3f627635c57a9b1c50): やっぱりド・モルガン考えた時点でそのロジックはやばい
* 指数・対数: 数字の圧縮と展開と考えれば……
* 微分・積分: 図形・グラフをビロンビロン
* 関数: プログラマなら `def`, `function`, `proc` とか使ってるやん
* 三角関数（sin, cos, tan）: 横軸って、時間では？
* 数列・数級: for文でぶん回せるのでは？　え、違うの？
* [統計](https://qiita.com/manzyun/items/833ae7fba582d899c618): ああ、プログラミングができてよかった
* etc...

# 参考書籍・参考Webページ

* 数学　こんな授業を受けたかった！（岡部恒治・長谷川愛美:日本実業出版社 2007年 ISBN978-4-534-04318-4）
* [Pythonからはじめる数学入門（Amit Saha 著・黒川利明 訳:オライリー・ジャパン 2016年）](https://www.oreilly.co.jp/books/9784873117683/)
* [Dive Into Python 3 日本語版](http://diveintopython3-ja.rdy.jp/index.html)
* [高等学校数学 - Wikibooks](https://ja.wikibooks.org/wiki/%E9%AB%98%E7%AD%89%E5%AD%A6%E6%A0%A1%E6%95%B0%E5%AD%A6)
php-master-changes 2018-10-16

今日は不要ファイルの削除、.gitignore を整理する修正があった！ petk だけ動いてた！

# 2018-10-16
## petk: Remove unused test.inc in ext/iconv/tests
- https://github.com/php/php-src/commit/787dfd0909e14d1061574283bcafe4c7c2961dd7
- ext/iconv のテストディレクトリの使われていなかったファイルを削除

## petk: Remove outdated ext/spl/examples items from .gitignore
- https://github.com/php/php-src/commit/1df1792b9ca23e4792e30acd59c8ce5f11fdbc02
- .gitignore から ext/spl/examples の指定を削除
- 実際の中身は[先月消してた](https://qiita.com/sj-i/items/bd65df069383ab7e43a4#petk-remove-and-refactor-extsplexamples)からね！

## petk: [ci skip] Add magicdata.patch exception to .gitignore
- https://github.com/php/php-src/commit/c54d382b2e2102bb396903cf071d09dd92f18aec
- ext/fileinfo/magicdata.patch を .gitignore へ追加

## petk: Remove obsolete buildconf.stamp from .gitignore
- https://github.com/php/php-src/commit/0df202e7ae402c04fbad0ce448da2e133b1bae70
- .gitignore から buildconf.stamp の指定を削除
- かつてビルド時に利用していたファイルだったが、現在は使われていない
stylish-haskell のインストールに手こずった件

# stylish-haskell のインストールに手こずった件


## 環境
- macOS High Sierra 10.13.6
- stack 1.7.1


## 経緯と対処

### stylish-haskellをインストールしたい 
```
stack install stylish-haskell
```
[stylish-haskell](https://github.com/jaspervdj/stylish-haskell)を見て、上のように打って実行してみると...

### 問題1
```
  （中略）
`gcc' failed in phase `Assembler'. (Exit code: 1)
```

と表示されて止まってしまいました[^1]。

### 問題1の対処
そこで、`~/.stack/programs/x86_64-osx/ghc-8.2.2/lib/ghc-8.2.2` にある `settings` というファイルをいじります。

```
 [("GCC extra via C opts", " -fwrapv -fno-builtin"),
  ("C compiler command", "gcc"),
  ("C compiler flags", " -m64 -fno-stack-protector"), 
  ("C compiler link flags", " -m64 "),
- ("C compiler supports -no-pie", "YES"),
+ ("C compiler supports -no-pie", "NO"),
...
```

`C compiler supports -no-pie` の行の `YES` を `NO` に変えて実行してみると...

### 問題2
今度は

```
  （中略）
   |
30 | # error __STDC_VERSION__ does not advertise C99 or later
   |   ^
`gcc' failed in phase `C Compiler'. (Exit code: 1)
```

と表示されて止まってしまいました。

### 問題2の対処
そこで再び、`~/.stack/programs/x86_64-osx/ghc-8.2.2/lib/ghc-8.2.2` にある `settings` というファイルをいじります。

```
 [("GCC extra via C opts", " -fwrapv -fno-builtin"),
  ("C compiler command", "gcc"),
- ("C compiler flags", " -m64 -fno-stack-protector"), 
+ ("C compiler flags", " -m64 -fno-stack-protector -std=c99"), 
  ("C compiler link flags", " -m64 "),
  ("C compiler supports -no-pie", "NO"),
...
```

`C compiler flags` の行に、 `-std=c99` を追加します。
（参考） [stackoverflow](https://stackoverflow.com/questions/48045243/ghc-gcc-compiler-issue-stdc-version-w-c99-from-stg-h-fails-for-every-packa)

### 問題3
さらに

```
Copying from /Users/user_name/.stack/global-project/.stack-work/install/x86_64-osx/lts-11.13/8.2.2/bin/stylish-haskell to /Users/tomo/.local/bin/stylish-haskell

Copied executables to /Users/user_name/.local/bin:
- stylish-haskell

Warning: Installation path /Users/user_name/.local/bin
         not found on the PATH environment variable.
```

と出てきてしまいました。

### 問題3の対処
`~/.bashrc` や `~/.zshrc` 等に次の1行を追加します。

```
export PATH="/Users/user_name/.local/bin:$PATH"
```

（参考） [github](https://github.com/commercialhaskell/stack/issues/2897)


## まとめ
`~/.stack/programs/x86_64-osx/ghc-8.2.2/lib/ghc-8.2.2` にある `settings` というファイルの次の2行を以下のように変更すると解決しました。

```:変更前
 ("C compiler supports -no-pie", "YES"),
 ("C compiler flags", " -m64 -fno-stack-protector"), 
```

```:変更後
 ("C compiler supports -no-pie", "NO"),
 ("C compiler flags", " -m64 -fno-stack-protector -std=c99"), 
```

[^1]: 「問題1」のエラーメッセージが1行分しか残っていませんでした。申し訳ありません。
Amazon Linux 2 に Node + yarn をインストールする

## 概要

Amazon Linux 2 に Node + yarn をインストールする時のメモ
yum でさっとは入らない、よく忘れるのでメモ

```yaml
- name: download nvm installer
  become: no
  get_url: url=https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh dest=/tmp/nvm-installer.sh

- name: execute the nvm-installer.sh
  become: yes
  shell: sh /tmp/nvm-installer.sh

- name: Add nvm initialization to profile
  become: yes
  template: src=nvm.sh.j2 dest=/etc/profile.d/nvm.sh

- name: install node
  become: no
  shell: source /etc/profile && nvm install --lts

- name: use node
  become: no
  shell: source /etc/profile && nvm use --lts

- name: download yarn installer
  become: no
  get_url: url=https://yarnpkg.com/install.sh dest=/tmp/yarn-installer.sh

- name: execute the yarn-installer.sh
  become: no
  shell: sh /tmp/yarn-installer.sh
```
【Ethereum】Dapp開発のエコシステム

#はじめに
Webアプリ開発も、ブロックチェーンアプリ開発もはじめての自分が、Ethereumのスマートコントラクトを使ったDappを作るにあたり、Dapp（特にWebアプリ）開発を取り巻くエコシステムを調べた


# スマートコントラクト開発
##ノード
Ethereumのブロックを生成するEthereumクライアント

- [Geth](https://github.com/ethereum/go-ethereum/wiki)
- [Parity](https://www.parity.io/)
- [CPP-Ethereum](https://github.com/bobsummerwill/cpp-ethereum)

上記はすべて同じEthereumプロトコルを実装しており、違いは書かれている言語だけである
もちろんブロック情報に互換性があり、ブロックチェーンから複製したブロックはどのノードでも使える

## ブラウザ
ノードを構築することなくEthereumブロックチェーンと接続するソフトウェア

- [MetaMask](https://metamask.io/) - [Infura](https://infura.io/)を通じて情報を取得するChromeとFirefoxのプラグイン
- [MIST](https://ethereum.org/) - Ethereum公式の、独立したブロックチェーンブラウザ

## スマートコントラクト開発言語

- Solidity - スマートコントラクト開発のデファクトスタンダード言語. コンパイル(solc)が必要で、コンパイルされると`Byte Code`と呼ばれるEVM[^4]アセンブリに変換される

[^4]: Ethereum Virtual Machine

## IDE
- [Remix](https://remix.ethereum.org/) - ブラウザで起動する統合開発環境. Solidityによるスマートコントラクト実装と、コンパイルが可能. デバッガも統合されている



## スマートコントラクト開発支援ツール
スマートコントラクトのテスト、管理、ネットワークへのデプロイを支援するツール

- [Truffle](https://truffleframework.com/truffle) - `Truffle Box`というDapp開発のサンプルになる環境も提供されている
- [Embark](https://embark.status.im/)

# Webアプリ開発　

## フレームワークとライブラリ
Javascriptフレームワーク

- Angular
- Vue.js
- React
- Redux

上記フレームワークだけでは、Ethereumブロックチェーンへ繋げないので以下のライブラリが必要

- [Web3.js](https://web3js.readthedocs.io/en/1.0/index.html)
- [EthJS](https://github.com/ethjs/ethjs)

## モジュールバンドラ
複数ファイルのJavascriptをまとめるツール

- Webpack
- Browserify
- Node Package Manager

# 最後に
調べただけでは実際よくわからない
ひとつずつインストールしながら使い方を覚える
HomebrewでいれたPythonの削除

#Pythonをアンインストール
brewで入れたので、いつものようにアンインストール

```
$ brew uninstall python3
Ignoring bigdecimal-1.3.5 because its extensions are not built.  Try: gem pristine bigdecimal --version 1.3.5
Error: Refusing to uninstall /usr/local/Cellar/python/3.7.0because it is required by vim, which is currently installed.
You can override this and force removal with:
  brew uninstall --ignore-dependencies python3
```

強制的にやりなさいという事で --force で綺麗に削除

```
$ brew uninstall --force --ignore-dependencies python3
Ignoring bigdecimal-1.3.5 because its extensions are not built.  Try: gem pristine bigdecimal --version 1.3.5
Uninstalling python... (4,787 files, 102MB)
```

スッキリ
CentOS7で起動時にネットワークを自動起動する方法

### CentOS7で起動時にネットワークを自動起動する方法
　CentOS7で、起動時のネットワーク自動起動をGUI画面から設定する方法に
　最近気づいた(~~なぜ気づかなかった~~)ので、自分用のメモとして記載


![00111_1st.png](https://qiita-image-store.s3.amazonaws.com/0/262207/d414e3fa-18a5-7536-a8fa-13f8bc149370.png)

### 設定方法

![00111_2nd.png](https://qiita-image-store.s3.amazonaws.com/0/262207/cf90c9e5-3b6f-7e2f-20aa-fe69ca983e85.png)

↓

![00111_3rd.png](https://qiita-image-store.s3.amazonaws.com/0/262207/984e2930-7e20-0699-2db9-9750522c8385.png)


以上！！！
【react】Sentryを使ってバグレポート

[Sentry | Error Tracking Software — JavaScript, Python, PHP, Ruby, more](https://sentry.io/welcome/)


Sentryはバグを自動で収集してくれたり、下記のようなクラッシュレポートを簡単に導入してくれるツール。今回は個人プランで使い心地を調査してみた。

![スクリーンショット 2018-10-17 02.15.06.png](https://qiita-image-store.s3.amazonaws.com/0/15319/0b3fb9f5-cfa2-6728-312e-3724af40f529.png)


とりあえず`componentDidCatch`で親コンポーネントにいれば描画系のエラーは集計できるだろう。

```jsx
import React, { Component } from 'react';
import * as Sentry from '@sentry/browser';

Sentry.init({
  dsn: 'tekitounamojiretsu' // ここにDSNキーを入れる。設定の下の方に(DNS)という欄があるのでそれ
});

class ExampleBoundary extends Component {
    this.state = { error: null };

    componentDidCatch(error, errorInfo) {
      this.setState({ error });
      Sentry.configureScope(scope => {
        Object.keys(errorInfo).forEach(key => {
          scope.setExtra(key, errorInfo[key]);
        });
      });
      Sentry.captureException(error);
    }

    render() {
        if (this.state.error) {
            //render fallback UI
            return (
              <a onClick={() => Sentry.showReportDialog()}>Report feedback</a>
            );
        } else {
            //when there's not an error, render children untouched
            return this.props.children;
        }
    }
}

class BugComponent extends Component {
  render() {
    throw new Error("Oops") // わざとエラーを起こす
    return <div>hello</div>
  }
}

class App extends Component {
  render() {
    return (
      <ExampleBoundary>
        <BugComponent />
      </ExampleBoundary>
    );
  }
}

export default App;
```


エラーレポートはこんな感じで、使用したブラウザやipアドレスなんかもデフォルトで集計する。また、付属するデータも送ることができる。

![スクリーンショット 2018-10-17 02.19.16.png](https://qiita-image-store.s3.amazonaws.com/0/15319/91503a74-91d0-5a22-7df2-8adea36e8ed9.png)
Pythonで仮想環境virtualenvを作成し、Visual Studio Codeで自動適用する開発環境を構築する

virtualenvで作成したPythonの仮想環境をVisual Studio Code（以後VSCode）で自動適用させ、Pythonの開発環境を構築する手順を記載します。

環境

* Windows 7 (SP1) Ultima x64
* VSCode(User Installer) x64 (Ver:1.28.1) [^1] [インストール手順はこちら](https://qiita.com/psychoroid/items/7d85ae6bade4a67aedb1)
* Python 3.7.0 (32bit版) [インストール手順はこちら](https://qiita.com/psychoroid/items/9930e871fb8169a91f9a)

以降の手順は、上記のようにWindowsにPythonとVSCodeをインストールした環境を前提に記載します。

## virtualenvで仮想環境を作成する

まず、コマンドプロンプトを起動し、pipコマンドでvirtualenvのモジュールをインストールします。

```console
pip install virtualenv
```

次に、プロジェクトを作成するフォルダに移動し、プロジェクトフォルダmyprojectを作成し移動します。

```console
mkdir myproject
cd myproject
```

プロジェクトフォルダ内にvirtualenvモジュールで仮想環境envを次のように作成します。
（※このフォルダ構造が肝になります）

```console
python -m virtualenv env
```

これでmyprojectフォルダ直下に、仮想環境envが構築されました。

## VSCodeに Python extensionを導入する

次に、VSCodeにPython用の拡張機能（Python extension）を適用します。

VSCodeを起動し、VSCodeの左端にあるアクティビティーバー（縦型のツールバー）の拡張機能メニューを開いて、入力欄に "python" と入力し、 フィルタリング表示された 拡張機能Pythonの インストール をクリックします。

![python_vscode1.png](https://qiita-image-store.s3.amazonaws.com/0/299676/c2a0e87d-eccd-08e5-fb8a-fc906a24653d.png)

Python extensionの再読み込みをクリックして再読み込みさせます。

![python_vscode2.png](https://qiita-image-store.s3.amazonaws.com/0/299676/a4f9ef3c-2bff-dfbe-3f95-434426eee264.png)

## VSCodeでPythonの仮想環境が（自動的に）適用されることを確認する。

VSCodeでは適用する仮想環境（Pythonオリジナルの設定環境含む）を選択することができますが、**プロジェクトとして読み込んだフォルダの階層に仮想環境がある場合はデフォルトで仮想環境を適用してくれます。（但し、フォルダ内にpythonのファイルが含まれている場合に限ります）**

実際に試してみると、仮想環境envを含むmyprojectをVSCodeで開き、myproject内に拡張子pyのファイル（ここではsample.py）を作成すると、次の赤枠で示すように、VSCodeが仮想環境envを読み込んだ状態に移行します。
更に、Ctrl+@のショートカットでターミナルを開くと、自動的にターミナルも仮想環境envに入ります。
>仮想環境のactivate.batが実行されることで仮想環境に入り、仮想環境に入ったことを示す(env)がターミナルの頭に付きます。

![python_vscode3.png](https://qiita-image-store.s3.amazonaws.com/0/299676/e719f0f8-d0ad-2013-c778-05b4ee5d338e.png)

myprojectと仮想環境envを作成した初期状態では、拡張子pyのファイルをダミーで作成する必要がありますが、実際に開発を進めていけばその必要はありません。  
（ものすごく普通ですが・・・）このフォルダ構造を構築することで、VSCodeやターミナルを毎回手動で仮想環境に適用させなくてもよいので、IDEの様にすぐに開発を始めることができます。

## Pythonの仮想環境にpylintを導入する

最後に、仮想環境envにpylintをインストールし、開発環境とVSCodeを連携させて開発環境を構築します。因みにpylintのインストール方法は次のどちらでも構いません。
>pylintも悪くはありませんが、flake8の方がお勧めかと最近思いましたのでpylintの代わりにflake8をインストールされる方は次のリンクを参照ください。  
[VSCodeのPython開発環境でpylintの代わりにflake8を導入し自動整形を設定する](https://qiita.com/psychoroid/items/2c2acc06c900d2c0c8cb)

* VSCodeから導入する場合：Case1へ
* コマンドプロンプトから手動で導入する場合：Case2へ

### Case1: VSCodeから導入する場合

先ほどの図でウインドウの右下に、トースト通知で”Linter pylint is not installed"が表示され、pylintの導入を促されますので、そのままInstallをクリックすると、次のコマンドがVSCodeより自動的に発行されplintがインストールされます(同時に依存関係のあるモジュールもインストールされます)。

```console
python.exe -m pip install -U pylint
```

![python_vscode4.png](https://qiita-image-store.s3.amazonaws.com/0/299676/e6e3fceb-29eb-4e6f-a727-916cc5ea9ced.png)

暫く待つとインストールが完了します。

### Case2: コマンドプロンプトから導入する場合

勝手にインストールされるのは気持ち悪い！・・・という人は、自分でコマンドプロンプトを立ち上げ、先ほど作成したmyprojectのenvのactivateスクリプトを実行し、仮想環境envに入ります。

```console
myproject\env\Scripts\activate
```

すると、(env)がコマンドプロンプトの頭に表示され、仮想環境に入ったことが示されるので、入った状態でpylintをインストールします。

```console
pip install pylint
```

実行後、pylintと依存関係のあるモジュールもインストールされ、pylintのインストールが完了します。

[^1]: インストール先はデフォルトではありません
Debian9のタイムゾーン設定に関するメモ

debian9のDockerイメージでタイムゾーン設定しようとしたらハマったのでメモ。

## 本来の設定方法（2020/02/14追記）
そこそこ前の記事にも関わらず、閲覧されることが多くなってきたので改めて調べてみたところ
`/etc/localtime`にリンクを張るだけで設定できました。それはそう。

```bash
root@bb9ce4dcdf33:/# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

参考文献: [TimeZoneChanges - Debian Wiki](https://wiki.debian.org/TimeZoneChanges)

一応アーカイブとして過去に書いた内容も以下に残しています（が、恥ずかしいので見ないでほしい。）

>## 事象
>タイムゾーンを `Asia/Tokyo` にしようとしたところ...
>
>```bash
>root@33e1b3b70dd0:/# echo "Asia/Tokyo" > /etc/timezone
>root@33e1b3b70dd0:/# dpkg-reconfigure -f noninteractive tzdata
>
>Current default time zone: 'Etc/UTC'
>Local time is now: Tue Oct 16 16:38:14 UTC 2018.
>Universal Time is now: Tue Oct 16 16:38:14 UTC 2018.
>```
>
>反映されない。
>
>## 解決策
>ubuntuの方にtzdataのバグとして報告されていて、簡単な解決方法も投稿されていたので真似してみる。
>https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806
>
>一度`/etc/localtime` を削除するとうまくいくとのこと。
>
>```bash
>root@33e1b3b70dd0:/# rm /etc/localtime
>root@33e1b3b70dd0:/# echo Asia/Tokyo > /etc/timezone
>root@33e1b3b70dd0:/# dpkg-reconfigure -f noninteractive tzdata
>
>Current default time zone: 'Asia/Tokyo'
>Local time is now: Wed Oct 17 01:40:34 JST 2018.
>Universal Time is now: Tue Oct 16 16:40:34 UTC 2018.
>```
>
>無事に変更できた。
unstated-debugを使ってunstatedのデバッグをする

[sindresorhus/unstated-debug: Debug your Unstated containers with ease](https://github.com/sindresorhus/unstated-debug)

```jsx
// @flow
import * as React from 'react'
import { Provider, Subscribe, Container } from 'unstated'
import UNSTATED from 'unstated-debug' // eslint-disable-line no-unused-vars

type CounterState = {
  count: number
}

class CounterContainer extends Container<CounterState> {
  state = { count: 0 }
  increment() {
    this.setState({ count: this.state.count + 1 })
  }
  decrement() {
    this.setState({ count: this.state.count - 1 })
  }
}

function Counter() {
  return (
    <Subscribe to={[CounterContainer]}>
      {counter => (
        <div>
          <button onClick={() => counter.decrement()}>-</button>
          <span>{counter.state.count}</span>
          <button onClick={() => counter.increment()}>+</button>
        </div>
      )}
    </Subscribe>
  )
}

function App() {
  return (
    <Provider>
      <Counter />
    </Provider>
  )
}

export default App
```

`unstated-debug`をインポートするだけで機能するが、暗黙的な処理をするので、`eslint-disable-line no-unused-vars`とかきっと書くはめになる。もちろんdevのみ有効にした方がいいでしょう。

これを使うと、redux-loggerのように状態の追跡ができる。個人的には常に有効化するとうるさいので必要なときに有効化するといいと思う。以下の任意の場所に挟めばデフォルトでログを表示しなくなる。あとはfalseの部分を`process.env.DEBUG`的なのに置き換えてwebpackで制御するのもありだと思う。

```
UNSTATED.logStateChanges = false;
```

Chromeのconsoleタブを開いて`UNSTATED`と打てば、現在の状態やログが取れるので、stateの確認に便利。

[jamiebuilds/unstated: State so simple, it goes without saying](https://github.com/jamiebuilds/unstated)
[sindresorhus/unstated-debug: Debug your Unstated containers with ease](https://github.com/sindresorhus/unstated-debug)
Python マルチスレッド/マルチプロセス

Python のマルチスレッド、マルチプロセスにはまってしまったのでまとめました。
まず、おさらいです。

- 1プロセスは複数のスレッドを持つことが出来る
- マルチプロセスのメモリは共有されない、マルチスレッドのメモリは共有される
- スレッド作成よりプロセス作成の方がコストがかかりオーバーヘッド
- など...

ここまでは、一般的な違いなのですが、
Python には GIL (グローバルインタプリタロック)というものがあり、あるスレッドが他のスレッドの実行を止めてしまう機能があります。このおかげで、複数スレッドやコルーチンを実行した際も、安全に変数の代入できるなどの利点があるのですが、一方で頑張ってコーディングしたのに速くならない寧ろ遅くなるというやっかい事が起こります。

1万番目の素数を求めるプログラム

```python
import time

def run():
    start = time.clock()
    primes = []
    number = 1
    while True:
        number += 1
        if not is_prime(number):
            continue
        primes.append(number)
        if len(primes) == 10000:
            print("10000th prime is " + str(number))
            break
    print("[python] duration is " + str(time.clock() - start) + " sec")

def is_prime(number):
    for n in range(2, int(number/2)):
        if number % n == 0:
            return False
    return True

run()
```

CPU Xeon (Westmere E56xx/L56xx/X56xx)で計測したところ
実行は16.61秒かかりました

一方、マルチスレッドで書くと

```python
import time
from threading import Thread

def run():
	start = time.clock()
	primes = {}
	max = 120000

	t0 = Thread(target=worker, args=(primes,2,max))
	t0.start()
	t1 = Thread(target=worker, args=(primes,3,max))
	t1.start()
	t2 = Thread(target=worker, args=(primes,4,max))
	t2.start()
	t3 = Thread(target=worker, args=(primes,5,max))
	t3.start()
	t0.join()
	t1.join()
	t2.join()
	t3.join()

	number = 0;
	for n in range(2, max, 1):
		if primes[n]: number += 1
		if number == 10000:
			print("10000th prime is " + str(n))
			break
	print("[mt.python] duration is " + str(time.clock() - start) + " sec")

def worker(box, start, end):
	for n in range(start, end, 4):
		box[n] = is_prime(n)

def is_prime(number):
	for n in range(2, int(number/2)):
		if number % n == 0:
			return False
	return True

run()
```

実行には22.97秒かかりました。
他方、マルチプロセスだと、

```python
import time
from multiprocessing import Process, Array

def run():
	start = time.time()
	max = 120000
	primes = Array('i', range(max))

	p0 = Process(target=worker, args=(primes,2,max))
	p0.start()
	p1 = Process(target=worker, args=(primes,3,max))
	p1.start()
	p2 = Process(target=worker, args=(primes,4,max))
	p2.start()
	p3 = Process(target=worker, args=(primes,5,max))
	p3.start()
	p0.join()
	p1.join()
	p2.join()
	p3.join()

	number = 0;
	for n in range(2, max, 1):
		if primes[n]: number += 1
		if number == 10000:
			print("10000th prime is " + str(n))
			break
	print("[mp.python] duration is " + str(time.time() - start) + " sec")

def worker(box, start, end):
	for n in range(start, end, 4):
		box[n] = is_prime(n)

def is_prime(number):
	for n in range(2, int(number/2)):
		if number % n == 0:
			return False
	return True

run()
```

実行には10.96秒かかりました。
実行速度として、
**マルチプロセス > 普通 > マルチスレッド**
となりました。

なぜ、実行が遅くなるわ、コードも見にくくなるわで、利点が全く感じられないマルチスレッドなのですが、いったい何のためにあるのでしょうか・・・？

もう一つ注意点として、マルチプロセスの場合、時間の計測にtime.time()を使用していますが、これには理由があります。time.clock()は自身のプロセスが実行されていた時間しか計測できず、マルチプロセスの場合は、うまく経過時間を測ることができなくなるためです。そこで精度は劣りますが、time.time()を使用しています。

[PrimeNumberリポジトリ](https://github.com/hidetobara/PrimeNumber)
データプロダクトを作るために

## データプロダクトとは？

ユーザーからの受動的なデータを元に、開発されたプロダクト


## データをどう生かすべきか？

使われた機能を、期間で区切る

なぜ使われたか考える

　この理由にはユーザーの課題があるはず

解決策として機能を開発する

## どのデータで判断するか？

controller   
action
session_id

```
  class CreateActionHistoryJob < ActiveJob::Base 
     
     def  params, user_id, session_id 
       ActionHistory.create( 
         controller_name: params[:controller], 
         action_name: params[:action], 
         session_key: session_id, 
         params: params, 
         admin_user_id: admin_user_id 
       ) 
     end 
   end 
 end 
```

```
updated_at = co.orders.last.updated_at
ActionHistory.where(created_at: (updated_at - 3.minutes)..(updated_at + 3.minutes)).pluck(:controller_name, :action_name, :created_at, :id)
ap eval(ActionHistory.find(4184).params)
```

## 必要なスキル

sql
結合セルを解除して、１行上のセルと同じ値を設定する手順

### 完成イメージ

#### 【実施前】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/779bce89-5053-c3d7-d789-221cf61e0102.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/a877779f-0b3d-ad17-feb3-9935ac15e170.png)

#### 【実施後】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/56b92bc4-5536-3fa7-0e3b-18d4cdc670f6.png)


### 手順

#### 手順１

・対象範囲（ヘッダを除く）を全て選択する。


#### 手順２

- セル結合を解除する。

    - ホーム ＞ セルを結合して中央揃え 　をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/424b5248-5a64-1bf6-f776-46ef80742f6d.png)




#### 手順３

- 結合解除したセルを全て選択している状態で、『Ctrl + G』を押下して、以下のダイアログが表示後、『セルの選択』をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/8cd0bf2a-55da-dae9-22c1-1ab465eb20fa.png)


#### 手順４

- 「空白セル」をチェックしOKボタンをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/bba44fc5-ba61-a7e8-e08c-8fc7c8468027.png)
  
- ※  ２．で解除したセルで、空欄のセルのみ選択状態となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/e726fa2f-fdda-ed89-e9f2-c34b40d564b9.png)


#### 手順５

- 赤枠の入力欄に以下を入力する。
    - 入力値：左上の空欄のセルの１つ上のセル
    - ※下記の図だと、『B5』と入力。※ ４．で選択されたセル（結合解除により空白となったセル）の内、最も左上のセルが「B6」となる為、『=B5』と入力する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/e9bbbccc-a035-29cd-7666-32db522b2524.png)


#### 手順６

- 『Ctrl + Enter』 を押す。
    - ※４．で選択されたセル（結合解除後に空欄となったセル）に、１行上の行の値が設定される。
    - ※ Ctrl + Enter は、入力した値を、選択済みのセル全てに反映する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/6074ee6d-95b6-6013-9423-c0b8b116233d.png)
遺伝的アルゴリズム（GA）とGenerative adversarial nets（GANs)との関係

###はじめに
根源的な発想なのですが，GAとGANs何が違うんだろうと思ったことです．細かい違いはありにせよ発想的には全く同じだよねと．
そうなれば数学的に何が違うのだろうと気になります．それはこの記事では触れません．

###GAとGANsの関係
![IMG_0758.jpg](https://qiita-image-store.s3.amazonaws.com/0/33329/17efe5c3-5562-3c8a-eca5-1c084ff81b29.jpeg)

図を書くの時間かかるので，ホワイトボードで許してください．

####海外勢で2年前に同じ疑問を持った人がいた．

>How do GANs align with 'traditional' genetic algorithms? Where does the entropy in the GAN come from and could they be complementary?
(GANとGAはどのような関係があるの？GANのエントロピーはどこからきて，それらは互いに補い合うのか？)
https://www.reddit.com/r/MachineLearning/comments/52wab3/how_do_gans_align_with_traditional_genetic/

この記事では，GAは確率的にサンプリングしているが，GANsはサンプリングする必要は無くただ単に勾配を計算しているという事を指摘している．**調整したい学習パラメータ数に応じてサンプリングの必要がないのでGANsの方が優位であると指摘している．**
（太字だれか証明して．それだけで論文になる．）

GANsの場合、識別モデルは適応関数を提供するだけでなく、識別関数への各入力に対して適応関数の導関数を提供する。したがって、遺伝的アルゴリズムとは異なり、サンプリングは必要ありません。単に勾配を計算し、それに応じて更新するだけです。

というようなことを記事では議論しています．

###おわりに
数学的な解説は余裕があれば追記でしたいです．
また，遺伝的アルゴリズムとモンテカルロフィルタは同じ枠組みであると言われています.[^1]

[^1]: [遺伝的アルゴリズムとモンテカルロフィルタ(樋口1996)](https://ci.nii.ac.jp/naid/120006019273/)
SSLのために、certbotでLet’s Encryptから証明書を発行してもらう。

# Let's Encrypt
[公式HP](https://letsencrypt.jp/)

# コマンド
以下、`example.com`はSSLを発行するドメイン名に変えてください。

```.sh
# install
yum install epel-release
cd /usr/local/src
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
mv /usr/local/src /usr/local/bin

certbot-auto certonly --manual -d example.com
```

```app.js
const http = require('http');
http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});

  if(req.url == '/.well-known/acme-challenge/***************') {
    res.end('***************.***************');
  }
}).listen(80, () => console.log('80'));
```

```.sh
node app
```

`/etc/letsencrypt/live/example.com`内に証明書が保存されています。
osascript -l Javascriptでスクリプトを書いてみた

macOSをターミナルから動かせるosascriptというものがあり、しかも最近はJavascriptでかけるようになったそうなので、簡単なスクリプトを書いてみた。

ターミナルで引数を受け取ったら、それをポップアップウィンドウに表示する簡単なコードである。

```javascript
#!/usr/bin/osascript -l JavaScript

function run(argv){
  let app = Application("System Events");
  app.includeStandardAdditions = true;
  app.displayDialog(JSON.stringify(argv));
}
```

このファイルをalertと名付けて、パスの通った場所に置き、実行権限をつける。
ターミナルで
alert hello
とすると、"hello"がargvに入り、run関数が実行される。
![スクリーンショット 2018-10-17 0.34.59.png](https://qiita-image-store.s3.amazonaws.com/0/250433/c01aca21-1186-dae0-7794-79d52c5728ee.png)

というウィンドウが表示された。
bashとmacOSを繋げて色々便利そうである。
AWS Lambda関数のバージョン管理

## はじめに
Alaxaスキル開発では、AWS Lambdaを使用している人が多いのではないでしょうか。
Lambda関数の修正が伴うAlexaスキルのバージョンアップをするとき、公開中のLambda関数を修正するわけにはいきません。Lambda関数にはバージョンを付与することが可能で、公開中のバージョンと開発中のバージョンを区別することができます。

## この記事の対象者
AWS Lambda利用者が対象です。この記事では、Alexaスキル開発を例に説明します。

## Lambda関数にバージョンを付与する
Lambda関数の実装・テストが完了したらバージョンを付与します。Lambda管理コンソールの関数画面上部にある「アクション」から「新しいバージョンを発行」を選択します。
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/148011/0f43b41e-33d0-d639-ccd0-f036ef01fcef.png)

「新しいバージョンを発行」を選択すると以下の画面が表示されます。必要に応じて「バージョンの説明」にコメントを入力して発行ボタンをクリックします。
なお、\$LATESTとは、編集中（最新版）のコードを指します。このコードにバージョンを付与します。
![2018-05-23 (2).png](https://qiita-image-store.s3.amazonaws.com/0/148011/6911db05-d859-0639-141b-c4f60f8381b8.png)

バージョンを付与すると、以下のような画面が表示されます。赤枠の部分に注目してください。
バージョン番号は１から順に整数が自動的に付与されます。**ARN**の関数名の末尾に**:1**のようにバージョン番号が付加されます。
![2018-05-25 (1).png](https://qiita-image-store.s3.amazonaws.com/0/148011/773ac5d6-94c5-d785-18c6-5a7536954aa9.png)
上記画面はバージョン１のコードが表示された状態で、バージョンを付与したコードは修正できなくなります。

バージョンを付与するとトリガーがなくなるので、改めてAlexa Skill Kitを追加します。
![2018-05-25 (2).png](https://qiita-image-store.s3.amazonaws.com/0/148011/6ee8cb99-3859-b7c4-2fca-5d8a0ddf93cc.png)
スキルIDを入力して追加ボタンをクリックしてください。追加したら画面右上の保存ボタンをクリックします。
![2018-05-25 (3).png](https://qiita-image-store.s3.amazonaws.com/0/148011/73dac031-b272-2ba5-00e0-af5081f18eaa.png)

以上でLambda関数のバージョン付与は完了です。
あとは、バージョン番号が付加された**ARN**をスキルのエンドポイントに設定してください。バージョン番号が付加されていない**ARN**は、\$LATEST（編集可能な最新コード）を指定したことになるので注意してください。

## バージョンの切り替え
下記のように「限定条件」をクリックして、表示するバージョンを選択することが可能です。\$LATESTとは前述のとおり最新版の編集可能なコードです。よって、バージョンアップ作業は、\$LATESTコードに修正を施し、コードがFIXしたらバージョンを付与するという作業の繰り返しとなります。
![2018-10-16.png](https://qiita-image-store.s3.amazonaws.com/0/148011/5358263a-95f0-3f3f-8358-27f55e92ccb9.png)

## 参考資料
[AWS Lambda 関数のバージョニングとエイリアス](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/versioning-aliases.html)
GAE(AppEngine)ダッシュボードのインスタンス（作成、有効、課金インスタンス推定）について


# 概要

GCPのWebコンソールのGAEの管理画面に「ダッシュボード」があるが、そのグラフ設定で「インスタンス」を選択すると、「作成」、「有効」、「課金インスタンス推定」の３つが表示される。それぞれ何を意味しているか、という話。AppEngineの料金を考える際にこの部分を理解しておく必要がある。

これらについての直接的な説明はドキュメント上にはない。

※「課金インスタンス推定」は、AppEngineのオートスケーリングを有効にしている場合にのみ表示される。


# それぞれの説明
### 有効
まさにリクエストを処理しているインスタンス数。

### 作成
作成されたインスタンス数。重要な点として「作成されたインスタンス数=課金対象のインスタンス数」というわけではない。（詳細は後述）
「作成」されたが「有効」ではないインスタンスは一見無駄に見えるが、リクエストがバーストした際に速やかに使用される。

### 課金インスタンス推定
かかった費用を計算するのに使えるインスタンス数。AppEngineの料金は、インスタンス時間（インスタンスタイプ、インスタンス数、使用時間）で決定される。

オートスケーリングの場合、インスタンス数が動的に増減するため、実際にどれほどのインスタンスが稼働していたか見えにくい。そこで、「課金インスタンス推定」の情報が役に立つ。
ただし、この情報はあくまで推定であり目安なので、正確な数値ではない点に注意が必要。

# AppEngine（オートスケーリング有り）の課金について

ある条件のもと、AppEngineは自動でインスタンスを増加させるが、15分間アイドルだったインスタンスは課金されない。（スケーリングの条件は[app.yaml](https://cloud.google.com/appengine/docs/standard/python3/config/appref#scaling_elements)に指定する。）

一度作成されたインスタンスは、リクエストが落ち着いた後もすぐには削除されず、リクエストのバースト時などに使われる。そして、GCPの任意なタイミングで削除される。（スケールイン）

このような待機用インスタンスを常にキープしておきたい場合は、min_idle_instancesのパラメータを使用する。しかし、常にキープされるため、課金の対象となる。（たとえ15分以上アイドル状態だったとしても）


# 安く使うためのチューニング

「有効」と「課金インスタンス推定」に開きがそれなりに場合、無駄があると言えるはず。また、「作成」と「有効」の差が大きい場合も設定が適切でない可能性が高い。（無駄にインスタンスを作成しているかも）

app.yamlの設定を見直すことで、より安く、同等のパフォーマンスを維持できる可能性がある。


# 参考

* https://groups.google.com/forum/#!topic/google-appengine/Pbn4omhqv3Y
    * GCPのサポート担当者が、作成、有効、課金インスタンス推定についての質問に回答している。一番詳しい情報。
* https://cloud.google.com/appengine/docs/standard/python/how-instances-are-managed#instance_billing
    * 「15分間アイドルのインスタンスは課金されない」的な話
* https://cloud.google.com/appengine/docs/standard/?hl=ja#instance_classes
    * AppEngineのインスタンスクラスについて
* https://cloud.google.com/appengine/pricing?hl=ja#standard_instance_pricing
    * AppEngineの料金
* https://cloud.google.com/appengine/docs/standard/python3/config/appref
    * app.yamlのリファレンス（スタンダード環境Python3.7）
MacでPythonに好きなバージョンを入れて切り替えられるようにする

Python3.7.xを使っていたが、諸事情でPython3.6.6の必要がでたので変更

環境
MacbookPro15(2017)
MacOS Mojave 10.14
Python3.7.x

#Pyenvをインストールする
pyenvがなければインストールする

```
$ brew install pyenv
```

pyenvを使って欲しいバージョンを指定する

```
$ pyenv install 3.6.6
```

Build Filedなどが出て失敗したら、xcode-selectがないとなるのでいれる

```
$ xcode-select --install
```

Mojaveだとこんなエラーがでてしまう

```
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

最新版にはmacOS SDK headerがないのでインストール

```
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

>"xcode-selectの最新バージョン(2354)にMojave用のmacOS SDK headerがデフォルトで入っていないのが原因のようです。
https://qiita.com/zreactor/items/c3fd04417e0d61af0afe"

#pyenvを使って好きなバージョンを適用させる
pyenvにパスを通す

```
$ touch .bash_profile
$ export PATH="$HOME/.pyenv/shims:$PATH"
$ source .bash_profile
```

あとはセットするだけ
セットされているものを確認

```
$ pyenv versions
*  system
   3.6.6 (set by /Users/.python-version)
```

使いたいバージョンをセットして確認

```
$ pyenv global 3.6.6
$ pyenv versions
   system
* 3.6.6 (set by /Users/.python-version)
$ python -V
Python 3.6.6
```