OmniAICreator/Qiita-1.07M huggingface dataset:
MacでDocker環境構築時、Docker-for-MacとDockerHub登録が最小構成ぽいよ

# はじめに 
Qiita初投稿です。
Dockerのプロジェクトに初めて入って、環境構築に４時間かけて、ハマったところがあったので、**MacOSX** での一番シンプルな環境構築の検証結果の自分用メモです。
Vagrantの環境でのプロジェクトは経験していたのですが、プロセスやら、localhostの設定やら、VitualBox等での、**VagrantとDockerの間で競合関係のエラーが出る** 事を今回知りました。
基本的には、環境構築の時に使った、**コマンドとDockerの公式ドキュメントの内容** ですので、DockerFile、docker-compose.yml、docker-entrypoint.shの書き方については触れません。

## 環境情報
| 環境              | version           |
|:-----------------|:-----------------:|
| Docker-for-Mac   | 18.03.1-ce-mac65  |

<img width="585" alt="スクリーンショット 2018-07-10 16.31.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/173550/1b38e380-ad07-1eea-4994-c969cabbf225.png">



## docker、docker-compose、Docker-for-Mac、Docker Toolbox、docker-machineとあるけれど、どれを使えばいいの？ 
[Docker-for-Mac vs Docker Toolbox]
(https://docs.docker.com/docker-for-mac/install/#what-to-know-before-you-install) という選択になるのが一般的だと思います。
上の公式ドキュメントの記事によると、Docker-for-Macは、docker-machineに影響を与えない。Docker-for-Mac と Docker Toolboxは共存できる。とありますが、共存は、細かい設定が必要になります。
docker-machineは、VirtualBoxに、仮想マシンを作るので、**VagrantとDockerの仮想マシンがVirtualBox内に混在すると競合**します(hostsをいじれば対応できるらしいが、プロセスキルや、サーバー停止などの手間が必要)。しかし、Docker-for-MacとDocker Hub登録だけの構成だとVirtualBoxに仮想マシンを作らないので、その分シンプルです。僕は、今回これでサイトを表示させるところまで行きました。

Dockerのプロセスを超綺麗にするコマンド

```Console
$ docker kill $(docker ps -aq)
$ docker rm $(docker ps -aq)
$ docker rmi $(docker images -f "dangling=true" -q)

$ docker ps
$ docker ps -a
$ docker images
$ docker-compose ps
```

[Dockerで80番へポートマッピングした際に起きたエラーについて(参考リンク)](https://hodalog.com/port-80-unexpected-error-when-docker-run/)

よって、今回は採用しませんでした。社内でも、今までのプロジェクトの全Docker化なども、構想としてあって、VagrantのプロジェクトのGitHubからForkして元プロジェクトに影響のないようにDocker化しようと考えています。

## 環境構築 
Dockerで、環境が出来上がっているものを自分のローカル環境に落とすだけなら

```Console
$ docker-compose build
$ docker-compose up
```
で、済むはずが、うまく行かずにハマったのは、

```Console
$ docker ps 
```

した時に確認できたのですが、同じローカルホストのポート解放をDocker Hubのサンプルコードで使用していたからです。
それで、上記のDockerで80番へポートマッピングした際に起きたエラーについて(参考リンク)の記事のように
httpdの80番ポートを止めて、古いもう使わないimageは削除して、また使用したいときは、その都度イメージ作成、コンテナ作成をすれば良いと判断しました。


[docker-compose コマンドまとめ](https://qiita.com/aild_arch_bfmv/items/d47caf37b79e855af95f) から引用
> docker-compose.ymlに書かれているサービスを参考にコンテナを停止し、そのコンテナとネットワークを削除します。オプションで--rmi allをつけることでイメージも削除してくれます。

```Console 
$ docker-compose down --rmi all
```

上記のコマンドをターミナルで実行してからbuild,upすると
立ち上げるコンテナのサーバーが、error(address already in use)にならず、rails、sql共に
サーバーが立ち上がり、doneになります。

docker-compose upして、サーバーがdoneになっていれば、ssh接続などせずとも、そのまま
ローカル環境がlocalhostで立ち上がりました。

## 参考サイト
[Docker-for-Mac vs Docker Toolbox]
(https://docs.docker.com/docker-for-mac/install/#what-to-know-before-you-install)
[Dockerで80番へポートマッピングした際に起きたエラーについて](https://hodalog.com/port-80-unexpected-error-when-docker-run/)
[docker-compose コマンドまとめ](https://qiita.com/aild_arch_bfmv/items/d47caf37b79e855af95f)
[オープンソースのかんばん式管理ツールを３つほど試してみた](http://blog.namiking.net/post/2015/09/kanban-board/)
日付のフォーマット(ISO8601)

## 概要
APIで日付を返すときのフォーマットについて調べたところISO8601がヒットしたので、調べてみた結果をメモしておく。

## PostgreSQL
PostgreSQLで日付を生成してみる。

```sql:
SELECT to_char('2018-07-10 09:00:00'::timestamp, 'YYYY-MM-DD"T"HH24:MI:SS"Z"');  -- "2018-07-10T09:00:00Z"

SELECT to_char(NOW() at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"'); -- "2018-07-10T09:07:10Z"
```

## MySQL
```sql
SELECT DATE_FORMAT(CONVERT_TZ('2017-07-10 18:00:00', 'Asia/Tokyo', 'UTC'), "%Y-%m-%dT%TZ"); -- "2017-07-10T09:00:00Z"

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CONVERT_TZ('2017-07-10 18:00:00', 'Asia/Tokyo', 'UTC'))); -- "2017-07-10 09:00:00"
```

## PHP
PHPだとこうかな？

```php
$date = new \DateTime("2018-07-10 18:00:00", new \DateTimeZone('Asia/Tokyo'));
$date->setTimezone( new \DateTimeZone('UTC'));
$iso8601 = $date->format('Y-m-d\TH:i:s') . 'Z';
var_dump($iso8601);     # string(20) "2018-07-10T09:00:00Z"
```

## 参考サイト
- [日時のフォーマット（ISO 8601）](https://qiita.com/kidatti/items/272eb962b5e6025fc51e)
- [PostgreSQLのtimestampをISO8601表記にしたい](https://open-groove.net/postgresql/postgresql-timestamp-tips/)
- [PHPのタイムゾーン（時差の計算）についての備忘録](https://qiita.com/saba1024/items/ddfdba2af8c360b69c29)
- [ISO8601 Date in PHP with Format YYYY-MM-DDTHH:MM:SS.mmmmmmmZ](https://stackoverflow.com/questions/26892302/iso8601-date-in-php-with-format-yyyy-mm-ddthhmmss-mmmmmmmz)
- [Format date in MySQL SELECT as ISO 8601](https://stackoverflow.com/questions/9321809/format-date-in-mysql-select-as-iso-8601)
MySQLでToxi法でのタグ登録をまるっとできるストアド

# はじめに
ハッシュタグの機能を追加したいと思ったときに、テーブル設計はToxi法でいこう→プログラム大変じゃない？となったので、まるっとStoredProcedureで登録できる処理を作りました。
といってもネット上で落ちているソースを組み合わせただけですが・・・
トランザクション管理などは各々で追加していただければと思います。

## 各テーブル(参考)


| comments テーブル |    |
|:-----------------|------------------:|
| id             |              id(主キー) |
| comment           |            コメント |
| registd             |              登録日 |


| tag_maps テーブル |    |
|:-----------------|------------------:|
| id             |              id(主キー) |
| comment_id           |            commentsテーブルの主キー |
| tag_id             |              tagsテーブルの主キー |

| tags テーブル |    |
|:-----------------|------------------:|
| id             |              id(主キー) |
| name           |            ハッシュタグの名前 |

コメントに対してハッシュタグを複数個登録ができることを想定しています。

##処理の流れ
登録する文字列をカンマ区切りで受け取り登録します。

コンマで文字列を区切り、一時テーブルに文字をインサートします。
一時テーブル内にある文字がtagsテーブルにない場合はインサートします。

一時テーブルとtagsをjoinして、各tags.idをtag_mapsテーブルにinsertします。

▼特定の文字列をカウントするFunction
カンマを数えるために使用します。

```sql
CREATE FUNCTION substrCount(s VARCHAR(255), ss VARCHAR(255)) RETURNS tinyint(3) unsigned
    READS SQL DATA
BEGIN
DECLARE count TINYINT(3) UNSIGNED;
DECLARE offset TINYINT(3) UNSIGNED;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = NULL;
SET count = 0;
SET offset = 1;
REPEAT
IF NOT ISNULL(s) AND offset > 0 THEN
SET offset = LOCATE(ss, s, offset);
IF offset > 0 THEN
SET count = count + 1;
SET offset = offset + 1;
END IF;
END IF;
UNTIL ISNULL(s) OR offset = 0 END REPEAT;
RETURN count;
END;
```

▼特定の文字で区切られた文字列を配列のように取得する

```sql
CREATE FUNCTION strSplit(x varchar(21845), delim varchar(255), pos int) 
RETURNS varchar(255)
BEGIN
return replace(
	replace(substring_index(x, delim, pos),substring_index(x, delim, pos - 1),''),
	delim,
	'');
END;
```


▼一時テーブルにタグを登録する

```sql
CREATE PROCEDURE splitter(x varchar(255), delim varchar(12))
BEGIN
	SET @Valcount = substrCount(x,delim)+1;
	SET @v1=0;
	DROP TABLE if exists splitResults;
	create temporary
	table splitResults (split_value varchar(255));
	WHILE (@v1 < @Valcount) DO
		SET @val = strSplit(x,delim,@v1+1);
		INSERT INTO splitResults (split_value) VALUES (@val);
		SET @v1 = @v1 + 1;
	END WHILE;
END;
```
▼タグのデータ登録処理

```sql
CREATE PROCEDURE Regist_tag(vString VARCHAR(8000),pid int,updateflag int)
BEGIN

	IF updateflag = 1 THEN
	  DELETE FROM tag_maps WHERE post_id = pid;
	END IF;

	CALL splitter(vString, ',');

	INSERT INTO tags(name)
		SELECT trim(x.name)
		FROM (SELECT split_value AS name FROM splitResults ) AS x
		LEFT JOIN tags ON x.name = tags.name
		WHERE tags.id is NULL;

	INSERT INTO tag_maps(post_id,tag_id)
		SELECT pid ,tags.id
		FROM tags
		INNER JOIN splitResults ON splitResults.split_value = tags.name
		GROUP BY tags.id;
END;
```
esaからconfluenceへの移行


ドキュメント管理ツールのesaをチームでトライアルで使ってみたのですが、「やはりconfluenceを使いたい」という声が挙がったため、移行のスクリプトを書いてみました。
シンプルなスクリプトですが、confluenceのドキュメントを読むのに多少時間がかかったので、共有します。
個人的にはesaだったのですが残念……………。

# 前準備
* [esaからデータをエクスポートする](https://docs.esa.io/posts/11)。markdown形式でzipでダウンロードできます。
* [attlasianのAPI KEYを取得する](https://id.atlassian.com/manage/api-tokens)
  - REST APIについてはこちらをご覧ください。 https://developer.atlassian.com/cloud/confluence/basic-auth-for-rest-apis/

# script
以下を実行します。コメントやタグなどの情報については移行していません。
名前空間をちゃんと移行したい場合は `CATEGORY_TO_ANCESTOR_ID` に手動で値を入力してください。

```ruby
require 'faraday'
require 'json'
require 'redcarpet'

class Confluence
  def initialize
    @host = 'https://katsumanarisawa.atlassian.net'
    @conn = Faraday.new(url: @host) do |faraday|
      faraday.request :url_encoded # encode post params
      faraday.adapter :net_http # Net::HTTP
      faraday.basic_auth('katsuma.narisawa@gmail.com', 'your_api_key')
    end
  end

  def create_page(title, body, ancestor_id = nil)
    response = @conn.post do |req|
      req.url '/wiki/rest/api/content/'
      req.headers['Content-Type'] = 'application/json'
      req.body = {
        "type": 'page',
        "title": title,
        "space": { "key": 'ESA' },
        "body": {
          "storage": {
            "value": body,
            "representation": 'storage',
          },
        },
        "ancestors": [
          { "id": ancestor_id&.to_s }.compact,
        ],
      }.compact.to_json
    end
    print "#{@host}/wiki#{JSON.parse(response.body)['_links']['webui']}\n" if response.status == 200
  end

  def get_pages
    response = @conn.get do |req|
      req.url '/wiki/rest/api/content/'
      req.headers['Content-Type'] = 'application/json'
    end
    print response.body
  end

  def get_page(content_id)
    response = @conn.get do |req|
      req.url "/wiki/rest/api/content/#{content_id}"
      req.headers['Content-Type'] = 'application/json'
    end
    print response.body
  end
end

class Esa
  def initialize(path)
    File.open(path, 'r') do |file|
      @content = file.read
      metadata_raw, @body = @content.split("\n---\n")
      @metadata = metadata_raw.split("\n").reject { |x| x == '---' }.map { |x| result = x.split(': '); result.push('') if result.count == 1; result }.to_h
    end

    @markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, tables: true)
  end

  def title
    @metadata['title'].strip.tr('"', '')
  end

  def body_html
    @markdown.render(@body)
  end

  def category
    @metadata['category'].split('/')[0]
  end
end

CATEGORY_TO_ANCESTOR_ID = {
  "Category1": 225_837_057,
  "Category2": 225_771_557,
}.freeze

confl = Confluence.new

# initialize space
# CATEGORY_TO_ANCESTOR_ID.keys.each do |key|
#   confl.create_page(key, '')
# end

# create page
Dir.glob('./esa/**/*').each do |path|
  next unless path.match?('md$')
  p path
  esa = Esa.new(path)
  raise unless CATEGORY_TO_ANCESTOR_ID.has_key?(esa.category.to_sym)
  confl.create_page(esa.title, esa.body_html, CATEGORY_TO_ANCESTOR_ID[esa.category.to_sym])
end

# get page(sample)
# confl.get_page(225_804_363)

```
C言語の共用体について

```union_test.c
#include <stdio.h>

struct bits {
	unsigned char b1 : 1;
	unsigned char b2 : 1;
	unsigned char b3 : 1;
	unsigned char b4 : 1;
	unsigned char b5 : 1;
	unsigned char b6 : 1;
	unsigned char b7 : 1;
	unsigned char b8 : 1;
};

union test {
	unsigned char chr;
	struct bits bit;
};

int main()
{
	union test test;

    /* 共用体のサイズ */
	printf("sizeof(unoin) %luByte\n", sizeof(union test));

	test.chr = 10;
	printf("test.chr %d\n", test.chr);

	printf("bit\n");
	printf("0b %d%d%d%d%d%d%d%d\n",
		test.bit.b8, test.bit.b7, test.bit.b6, test.bit.b5,
		test.bit.b4, test.bit.b3, test.bit.b2, test.bit.b1);

	return 0;
}
```
```
実行結果
sizeof(unoin) 1Byte
test.chr 10
bit
0b00001010
```
##共用体
構造体と似ているが(メンバアクセス方法など)大きな特徴として、**メンバ変数でメモリを共用する**ということが挙げられます。
上例では"test"という共用体が定義されており、メンバとして"unsigned char"と"構造体bit"が定義されています。この２つのメンバがメモリを共用しているというわけです。メモリサイズはメンバの中で一番多くメモリを消費する変数のサイズとなっています。
実行結果を見てみると、変数chrに代入された１０を構造体bitのメンバから参照することができています。
##ビットフィールド
C言語では変数は"unsigned char"の8bitが最小単位ですが、ビットフィールドを使うと８bitよりも小さな変数(?)を作ることができます。注意が必要なのは**構造体のメンバとしてのみ**定義できるということです。



##参考記事
https://www.sejuku.net/blog/25556
SQL Formatter　（SQL Server Management Studio）

[ここ](http://architectshack.com/PoorMansTSqlFormatter.ashx#Download_5)から下記をダウンロード。
Extension for CURRENT VERSIONS of SSMS (2014-17) 　※2018.07.10時点

インストールすると、SQL Server Management Studioの[ツール]メニューに
「Format T-SQL Code」が追加される。

案外便利。
SkyWay WebRTC GWを利用してUnityでWebRTC Videoをレンダリングする

## やったこと

最近公開された[SkyWay](https://webrtc.ecl.ntt.com)の[WebRTC Gateway](https://github.com/skyway/skyway-webrtc-gateway)を利用して、WebRTCの映像をUnityでレンダリングしてみました。
具体的な実装方法についてざっくり記載します
=> 2018/7/13追記: ソースコード公開して解説記事を書きました。　https://qiita.com/nakakura/items/a99c468c56db2a92b32f

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">SkyWay WebRTC GW使ってブラウザからUnityに動画流し込み成功した。<br>リファクタしたらライブラリ化しよう。 <a href="https://t.co/rFORJ55Dlc">pic.twitter.com/rFORJ55Dlc</a></p>&mdash; るんばにゃん (@arukakan) <a href="https://twitter.com/arukakan/status/1016584230753615872?ref_src=twsrc%5Etfw">2018年7月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 実装

Unityへのテクスチャ取り出しについては、MHD Yamen Saraiji氏の[mrayGStreamerUnity](https://github.com/mrayy/mrayGStreamerUnity)を利用しました。Thanks Yamen!
mrayGstreamerUnityはその名の通り、[gStreamer](https://gstreamer.freedesktop.org)というオープンソースアプリケーションで処理する動画データをUnityのテクスチャとして取り出すためのUnity Pluginです。
gStreamerを利用すると動画をRTPで送受信することができるため、別の端末から映像を配信してUnityで描画することができます。

![mrayGstreamerUnityの構造](https://qiita-image-store.s3.amazonaws.com/0/104451/1ed4cd8a-6441-2cb0-e576-601a834613f3.png)

平たく言うと、RTPで動画を送ればUnityのテクスチャを生成してくれる便利なUnity Pluginとして利用することができます。
ここでSkyWay WebRTC GWを利用します。
SkyWay WebRTC GWはMediaStreamで受け取ったメディアをRTPで外部に転送してくれる機能があります。
これを利用して、mrayGstreamerUnityの受信ポート宛に転送してやれば描画してくれます。

![SkyWay WebRTC GWの利用](https://qiita-image-store.s3.amazonaws.com/0/104451/2d386457-b8d1-e798-a41c-e722e29f83e4.png)

SkyWay WebRTC GWはDataChannelも扱えるので、Unityアプリケーション間でのデータのやりとりも可能です。
UDPでデータの送受信をしてやれば、Unity間でインターネット経由でのチャットやデータ転送も可能です。

![Untitled Diagram-Page-2 (3).png](https://qiita-image-store.s3.amazonaws.com/0/104451/1285af6b-5e0f-00d3-a3e1-3fd9834bd2e4.png)


## できるようになったこと

- UnityアプリケーションからのWebRTC利用(インターネット越しの映像・音声通信・データ転送)
    - Unityアプリケーションとブラウザ間でビデオ通話
    - Unityで作ったVRアプリケーション間で通話

例えば、VRゲームの途中で、メタルギアソリッドの無線みたいな感じで通話できるようになる。
ARアプリケーションでリアルタイムにナビを行える。etc.

## 公開について

まだソースコードがきちゃない状態なので、整理したあとUnity Pluginとして公開しようと思っています。
WSL上でDockerが動…かない！現象の解決方法

紹介記事：https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87

WSLでdocker daemonが動くようになったと聞いたので、喜び勇んで紹介手順に従って作業した結果、動…かない！
という現象にハマり、最終的に動いたので原因と解決策のみ共有します。

#環境
Windows 10 Pro(1803/OSビルド 17134.137)
Ubuntu 16.04 in WSL(ストア版)

#解決法
##Hyper-Vを無効化する
- [Windowsの機能の有効化または無効化]からHyper-Vのチェックを外し、OKを選択してから再起動する。

- この記事(https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87) の手順に従って作業する。

**以上。**

#原因(想像)
Hyper-Vが有効になっている事により全ての通信が仮想スイッチ経由になるわけですが、
この動作によって何か問題が起こってるんじゃないかと思われます。
docker composeもネットワーク関連の理由で現状動かないらしいので、
かなり怪しめ(※完全に想像です)。
MSX z80asm

z88dkのz80asmでMSX用のhello, worldを作る。

```hello.asm
CHPUT   equ     $00a2

        org     $d000
start:
        ld      hl, text
.loop
        ld      a, (hl)
        or      a
        ret     z
        call    CHPUT
        inc     hl
        jr      loop

text:   defm    "hello, world", 0
```

アセンブル
`z80asm -b hello`
hello.binファイルが作られる。

`appmake +msx -b hello.bin --org 0xd000`
hello.msxファイルが作られる。

WebMSXを起動する。
hello.msxファイルをDrive Aの+ FILESにドロップする（Altキーを併用してもいい）
`bload"hello.msx",r`
と入力する。

![WMSX Screen (4).png](https://qiita-image-store.s3.amazonaws.com/0/257554/3b287583-a02f-641a-af99-20b64a018924.png)

- 参考

[MSX2 Technical Hand Book - BIOS一覧](http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=Appendix+A%2E1+BIOS+%B0%EC%CD%F7)

別バージョン

```hello2.asm
CHPUT   equ     $00a2

        org     $d000
start:
        ld      hl, text
        call    puts
        ret
puts:
.loop
        ld      a, (hl)
        or      a
        ret     z
        call    CHPUT
        inc     hl
        jr      loop

text:   defm    "hello, world", 0
```
AWS : IAMについて今更学ぶ

# 概要
* AWS：IAMについて学んだことをまとめる
* 学習は [Amazon Web Services 業務システム設計・移行ガイド](http://amzn.asia/fSNXfGm) をベース

# IAM (Identity and Access Management) とは
「どのサービス（リソース）に対する」
「どのような操作を」
「誰に」
許可するか・許可しないかを定義出来る

## IAM を用いてユーザに権限を付与するまでの流れ
1. AWSサービスやAWSリソースに対する操作権限を「IAMポリシー」として定義する
2. IAMポリシーを「IAMユーザー」や「IAMグループ」にアタッチする

# IAMポリシー
* AWSサービスやAWSリソースに対する操作権限をJSON形式で定義したものがIAMポリシー

## 定義項目
| 項目 |内容 |
|:----------------:|:-----------------:|
| Version          | IAMポリシーの文法バージョン（2017年12月現在は「2012-10-17」） |
| Effect           | ここで定義するポリシーが許可を与えるポリシー（Allow)か拒否するポリシー（Deny)かを設定 |
| Action          | 「どのAWSサービス」に対する「どのような操作」を許可(拒否)するかを設定 |
| Resource          | 「どのAWSリソース」に対する操作を許可(拒否)するかを設定 |

## IAMポリシー例
* EC2リソースの閲覧
* EC2インスタンスの開始
* EC2インスタンスの停止

上記権限を付与するポリシーは以下

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:Describe*",
                "ec2:StartInstances",
                "ec2:StopInstances*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

### Action
`Action` にEC2関連の全ての参照権限を示す `ec2:Describe*`
EC2のインスタンスの開始と停止権限の `ec2:StartInstances` `ec2:StopInstances` を設定
`*` を用いることで `ec2:Describe*` から始まる全ての権限を許可している

### Resouce
`Resouce` に `*` を設定することで全てのリソースに対して権限を付与している
`Resouce` に Amazonリソースネーム(ARN) を設定することでAWSリソース個別指定することも可能
ARNは `arn:aws:ec2:region:account:instance/instance-id` のように指定できる

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:Describe*",
                "ec2:StartInstances",
                "ec2:StopInstances*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:region:account:instance/i-xxxxxxxxx",
            "Resource": "arn:aws:ec2:region:account:instance/i-yyyyyyyyy"
        }
    ]
}
```

### Effect
`Effect` に `Allow` `Deny` を設定することで許可 / 拒否を設定できる

# IAMユーザーとIAMグループ
AWSの操作を行うためのユーザーを `IAMユーザー` と呼ぶ
IAMユーザーは主にマネジメントコンソールにログインする用途で使用される
IAMユーザーにIAMポリシーをアタッチすることで操作権限を付与できる
アクセスキーとシークレットキーのキーペアを払い出しIAMユーザーと同等の権限をプログラムに付与することもできる

`IAMグループ` は同じ権限を付与すしたいIAMユーザーをひとまとめに管理する
IAMグループにIAMポリシーをアタッチすることでIAMユーザーへ一律に権限を付与することができる

# ルートユーザーの扱い
マネジメントコンソールにログインできるのはIAMユーザーだけではない
AWSアカウント作成時に設定したアドレスとパスワードでログインできる `ルートユーザー`　が存在する
ルートユーザーはAWSアカウントに対する全ての操作が可能
更に下記の操作はルートユーザーのみが実行可能

* AWSアカウント全体の設定変更（メールアドレス / パスワード変更など）
* AWSサポートのプラン変更
* EC2からのメール上限緩和申請
* 逆引きDNS申請
* 侵入テスト申請
* AWSアカウントの停止

Admin権限を付与したIAMユーザーでも上記操作はできない
これらからルートユーザーは `日常の開発/運用` では使用しない
初めにAdmin権限を付与したIAMユーザーを作成しそのユーザーで作業を行うようにする 
AWSアカウントは `二要素認証` をかけ上記のようなルートユーザでしかできない作業以外で使用しない
FPGAゲート数記録

#位相変調器
###ゲート数
12万ゲート
ロジック4万+乗算8万=12万

###期間
検証なしで2か月弱くらい
内蔵フラッシュメモリをCPUへ開放するためのモジュールが重かった
基本機能とメモリで比率1対1くらい
基本機能のみなら1か月弱

###内容
CPUからレジスタ設定し動作
加速レジスタと速度レジスタに設定し
距離を求める
距離を変調の信号波として出力するところまでが担当
変調自体は外部回路で行う
gitでちょっと前のコミットに戻りたい時

#はじめに
開発途中で、「ん？デグってるっぽいな」と感じた時、
**自分のせいじゃない**と確信するために、過去のコミットに戻って、ビルドして動きを確かめる時の流れをメモとして残しておきます。

#実行するgitコマンド
## 1.stashの作成

```bash
$ git stash       # 現在編集中でコミットしていないファイルをtemp領域に移動させる
$ git stash list  # あるか確認
```

##2.過去に移動
```bash
$ git log --oneline      # どのコミットに戻るか吟味 自分のコミット毎に試してます。
$ git checkout 25426c3c8 # git logで選んだコミットに戻る
$ git show               #　戻ったよね確認
```

##3.ビルドして、動きを確かめたり何やら
~~ああ、やっぱり自分が産んだデグレか~~

##4.現在に戻る
```bash
$ git checkout -f develop # ブランチ名は環境によりますが。
$ git show                #　戻ったよね確認
```

##5.stashの復元
```bash
$ git stash pop  # これでコミット前のファイルも戻ってきます。
```

#終わりに
最初はgit stashの存在を知らなくて、かつ「checkout -f develop」で編集中のファイルを失うことを知らず
、、、かなり痛い目を見ました。
Google Chrome で「安全な接続を確立しています」のままタイムアウトする問題の解決方法

DNSキャッシュを消したりChromeの設定を消したり再インストールをしても直らない、EdgeやFirefoxでは特に問題が起こらない…という現象が発生しました。
英語で調べてようやく解決できたので共有。
CryptSvcというサービスとレジストリが原因のようです。
Windows 10 April 2018 Update（1803） に Google Chrome をインストールした場合に発生します。

# 解決方法
https://productforums.google.com/forum/#!msg/chrome/s5S1uPI0kMc/PVBgVbx6DAAJ

# 自分がやった操作
自分の場合の操作記録を残しておきます。
**※レジストリ操作を行うので自己責任でお願いします。**

## 1. Chromeが止まっている間CryptSvcサービスが高CPU使用率になることを確認

タスクマネージャ->サービスからCryptSvcを選択して右クリック->詳細の表示
選択されているsvchost.exeのCPUが2%より大きいなら次に進みます。

## 2. Chromeを終了、CryptSvcサービスを止める
タスクマネージャ->サービスからCryptSvcを停止

## 3. レジストリを削除
regeditを開いて、下記のパス以下を削除します。
HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\Root
念のため事前にエクスポートするなどバックアップを取得するといいでしょう。

HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\Root\ProtectedRootsがそのままでは削除できないので右クリック->アクセス許可で操作アカウントにフルコントロールを付与します。
Admin権限でやったので持っていない場合は各自の管理者にご相談。

## 4. CryptSvcサービスを開始、Chromeを起動
タスクマネージャ->サービスからCryptSvcを開始。
これでChromeを起動させると遅くならずに動作するはずです。
直っていなければもう一度レジストリを消したり、Windowsの再起動が必要かもしれません。
DockerコンテナをPipenvでセットアップする

# この記事の概要

* Dockerコンテナにインストールするpython packageをpipenvで管理する手順を説明します。
* 概要:
    1. DockerfileでホストOSからコンテナに`Pipfile`, `Pipfile.lock`を`COPY`.
    2. `pipenv install --system`オプションでdockerコンテナに直にインストール。
    3. Dockerコンテナ内がPipenvで設定される。

# 動機

* ほとんどのケースでPipfileによる管理だけで十分なんだけど、極たまにDockerを使った環境を使う必要がある。
* その時、Dokcerの中の環境を(ホストOSにある)Pipfileで管理したい。

みたいなニーズがありました。

# 手順

## Pipenvによる環境構築

* とりあえず、python 3.5でnumpyを使うプロジェクトだったと仮定します。
* まず、Pipenvで環境を構築します。

```shell
$ mkdir pipenv_docker  # 適当なディレクトリ
$ cd pipenv_docker
```

```shell
$ pipenv install --python 3.5
$ pipenv install numpy
$ pipenv shell
```

* 今回はプロジェクトの内容は関係ないのですが、numpyのバージョンを出力する`test.py`ファイルを用意しておきます。

```shell
$ echo 'import numpy; print(numpy.__version__)' > test.py
$ python test.py 
1.14.5
```

* この時点でカレントディレクトリの中身はこうです。
* pipenvによる環境構築が出来ました。

```shell
$ ls
Pipfile      Pipfile.lock test.py
```

# Dockerによる環境構築

* まず、Ubuntu上でpython 3.5が動作して`pipenv`が動かせる環境を作ります。
    * pipenvによるセットアップはこの後やります。
    * Dockerfileの内容は色々適当ですのでご注意ください。
    * `FROM ubuntu:16.04`で構築しますが、他のディストリビューションでも(aptを除いて)そう大きく変わらない手順になると思います。


```Dockerfile:Dockerfile
FROM ubuntu:16.04

# ubuntu:16.04には設定されてないので設定しておく
ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

# 適当なディレクトリ作って移動
RUN mkdir /var/app
WORKDIR /var/app

# python, curl install
RUN apt update && apt install -y python3.5 curl

# pip install: https://pip.pypa.io/en/stable/installing/
RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
RUN python3.5 get-pip.py

# pipenv install
RUN pip install pipenv

# 先程のtest.pyもコピーしておきます
COPY test.py ./
```

この時点で一回起動してみましょう。

```shell
$ docker build . -t pipenv_docker
$ docker run -it pipenv_docker  # コンテナ起動, 以下、コンテナのshell

root@8fe8f243a0b9:/var/app# pipenv --version
pipenv, version 2018.7.1
```

はい、pipenvのインストールまで出来ました。
さらにDockerfileに追記していきます。

```Dockerfile:Dockerfile追記
# Pipfile: host -> container
COPY Pipfile ./
COPY Pipfile.lock ./

# Pipfileからインストール. ただしpipenvの仮想環境は作らずにcontainerに直接入れる
RUN pipenv install --system
```

* ホストOSからPipfileとPipfile.lockを`COPY`して`pipenv install`を行っています。
* この時、container内に更に仮想環境を作る必要は無いので`--sysytem`を付けてcontainerに直接インストールしています。

出来たので動かしてみます。

```shell
$ docker build . -t pipenv_docker
$ docker run -it pipenv_docker  # コンテナ起動, 以下、コンテナのshell

root@4f51d99fc8ff:/var/app# python3.5 test.py
1.14.5
```

`Pipfile`内で指定されている`numpy`が読み込めています。
pipenvでdocker container内の環境が構築できました。

## 補足: Pipfile.lockを参照させない場合

先程の手順で、`Pipfile.lock`を`COPY`せずに`Pipfile`だけ`COPY`した場合、エラーになります。

```Dockerfile:Dockerfile追記
# Pipfile: host -> container
COPY Pipfile ./
# COPY Pipfile.lock ./  # コメントアウト

# Pipfileからインストール. ただしpipenvの仮想環境は作らずにcontainerに直接入れる
RUN pipenv install --system
```

エラー

```
...
Warning: --system is intended to be used for Pipfile installation, not installation of specific packages. Aborting.
See also: --deploy flag.
The command '/bin/sh -c pipenv install --system' returned a non-zero code: 1
```

`Pipfile.lock`を無視して`Pipfile`からインストールしたい場合は、`pipenv install --sysytem`に`--skip-lock`オプションを加えれば行けます。
Settingで環境変数を変更したが、Rails consoleで反映されないとき

##起きている問題
`config/settings.yml` というファイルから環境変数を変更した後に`rails c` で変更が反映されているのか確かめていたのだが、何度やっても変更が反映されない。
##結論: Springをストップさせる

以下のコマンドでspringが走っているかどうかを確かめてみると、走っているのが確認できるかと思います。

```
bundle exec spring status
```

```
Spring is running:

.......
.......

```

今度は以下のコマンドを打って一旦springをストップさせてみましょう。

```
bundle exec spring stop
```

これで再度`rails c` を実行すれば、変更が反映されていることが確認できるかと思います。

##そもそもSpringとは何者なのか
springは、**アプリケーションプリローダー**のことであり、
`rails` コマンドを実行するまでにかかる時間を短縮させてくれます。

railsでは様々なライブラリのロードが処理されているので、実行するにも時間がかかってしまいます。
この待ち時間は、`rails c` や　`rails s`　といった`rails`コマンドを何度も使う開発において、ストレスになりかねません。

そこでspringを使うことで、裏側で事前にライブラリをロードをしてくれるので、待ち時間を短縮することができるのです。


springめ！と思っていたがついでに調べてみるととてもいいやつだった。

参考: https://ja.stackoverflow.com/questions/23286/rails-config-%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84

http://ruby-rails.hatenadiary.com/entry/20141026/1414289421
PythonでMatplotlib例

# 背景
よく忘れるので備忘録兼チートシート的な役割として

# コード
```py
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
# 線描画
plt.plot([0.0 ,1.0], [0.0, 1.0])
# 点描画
plt.plot(2.0, 1.0, 'bo')
plt.scatter(3.0, 0.0)
# 棒描画
plt.bar(1.5, 1.5)
plt.fill_between([2.0, 3.0], [2.0, 3.0], [1.5, 1.5], alpha=0.8)
# 矢印描画
plt.quiver(0.0, 3.0, 1.0, -1.0)
plt.quiver(1.0, 2.0, 1.0, -1.0)
# タイトル、範囲
plt.title('Test Output')
plt.xlim(-1.0, 4.0)
plt.ylim(-0.5, 4.0)
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88552/7ec143a0-3f3d-7ddf-3f4c-1f604a106aca.png)

# おまけ
これはお遊び用

```py
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = Axes3D(fig)
size = 256
#n = 15
n = 51
range_size = range(0, size, n)
for r in range_size:
    for g in range_size:
        for b in range_size:
            color_word = '#' + format(r, '02x') + format(g, '02x') + format(b, '02x')
            ax.scatter3D(r, g, b, c=color_word)
ax.set_xlabel('Red')
ax.set_ylabel('Green')
ax.set_zlabel('Blue')
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88552/f05fe66f-8f19-08dd-7cc8-8cf05a9e9938.png)
SVN externalヘビーユーザのためのGit submoduleの考え方

Subversion(SVN)で外部参照(externalプロパティ）ヘビーユーザのためのGit submoduleの考え方についてまとめました。

SVNでめちゃくちゃexternal使っていた方のために。
#Git submoduleとは？
SubmoduleとはGitにおいて、SVNでいうところのexternalプロパティです。

共用APIなど、他のリポジトリなどにあるファイル、またはディレクトリを外部参照で引っ張ってきたい時に使います。

この記事はそもそもSVN externalを理解している人のためのものなので、詳細は省略します。

SVNから移行する時に、このexternalを使っている場合、submoduleを使うことになります。

#SVN externalとの違いは？
SVN externalとGit submoduleの大きな違いは、更新の方法です。

SVN externalは親ディレクトリでSVN updateをすると、その下に属するexternal属性が付いたサブディレクトリは全て最新に更新されます。

一方、Git submoduleは親ディレクトリでpullしようが、mergeしようが、更新されません。

submoduleを設定したその時のCommit IDが記録されているだけなのです。

更新するには、外部参照しているディレクトリをPullコマンドなどで更新した後、

submodule updateというコマンドを実行してあげないといけません。

#１つ１つフォルダを指定してsubmodule updateしなきゃならないの？
その必要はありません。そこはちゃんと考えられています。

親ディレクトリでsubmodule updateを実行すると、同時に更新するpathを設定できます。(Tortoise Gitの場合）

ここで複数パスを選ぶことが出来るので、どこかのディレクトリだけ取り残されたというようなことを防げます。

#submoduleにbranchは指定できる？

もちろんbranch側も指定可能です。

別々の異なるリポジトリのコードを組み合わせて一時的な開発用ブランチを作るといったケースでも使いますね。

submodule addをするときに、branch側を指定すればそれ以降そのbranchの変更を取り込んでいくことが出来ます。

#submodule設定しているディレクトリをbranchしたらどうなる？
前述したように、submoduleはcommit IDを指定したスナップショットのようなものです。

そのため、branchするとその時のcommit IDがそのまま引き継がれます。

submoduleの設定も引き継がれますので、branchした後もsubmodule updateすることは可能です。

#submodule指定されたフォルダ以下のファイルは更新できない
SVN externalのように、リポジトリをチェックアウトしているわけでは無く、

あくまでスナップショットなので、変更をコミットすることが出来ません。

コミットもしたいという場合は、別コマンドであるSubtreeを使ってください。

#色々試した結果思ったこと
Git submoduleでもSVN externalのような運用は可能ということが分かりました。

しかし、SVNと違って勝手に更新されないので、その意識が無いと組み合わせるモジュールが古かった等のミスを誘発しかねません。

従って、Gitに移行する際には、「本当に外部参照が必要なのか？」をもう一度考え直して、

その機会に外部参照は極力使わない方向でツリーを見直すというのがベストかと思います。
Carrierwave のファイル名に日本語を許可する


## はじめに
SEO 対策として画像に正しい alt を設定したかったのですが、
alt のテキスト用のカラムを作るのも微妙だったので、画像名を alt にすることにしました。
もちろん画像名をちゃんとすることが前提になりますが、微力とはいえ画像名も Google にわかりやすい名前にすることも大切なので一石二鳥ということで。

サイトは Rails で作られており、画像周りは Carrierwave を使っています。
ここで問題があり、Carrierwave はデフォルトの設定ではファイル名には日本語は許可されず、日本語のファイル名を入れると「____」に置き換わってしまうので今回は Carrierwave のファイル名に日本語も許可するようにします。
## 実装
つらつら書きましたが、実装は以下のみです。

```config/initializers/carrierwave.rb
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
```

こちら <a href='https://github.com/carrierwaveuploader/carrierwave' target='_blank'>github</a> にも載っています。
ちなみにビュー側は以下のようにしました。


```app/views/images/show.html.haml
= image_tag @image.url, alt: "#{File.basename(@image.path, '.*')}"
```
## まとめ
上記の1行を入れるだけで簡単に日本語を許可することができました。
ただし alt を設定するという目的の場合、ある程度画像数がある場合は既存の画像を差し替えるなどの作業も必要になるのでケースバイケースでやり方を考えた方がいいかと思います。

## 参考
公式 github
<a href='https://github.com/carrierwaveuploader/carrierwave' target='_blank'>https://github.com/carrierwaveuploader/carrierwave</a>
<AndroidStudio>いきなり「AndroidSupportによる原因」で動かなくなった場合

今回は、最近入門した「AndroidStudio」について。

いきなり「IDE側による致命的なエラー」が発生し、「AndroidSupportによる原因」とか書かれてしまって、かなり困った。。。


何でも、「adbが見つからない」のだそうだ。

結構初歩的なエラーなのだろうか、Google検索しても納得のできる回答が無く、設定を変えてみたり、友人に聞いてみたりといろいろ模索してみたが、検索している中で気になることがあった。


「セキュリティソフトによるadb.exeのブロックが原因では？」（←海外の某サイト）


まさかとは思ったが、実は、ちょっとへそ曲げて前の環境（Eclipse）に戻して編集していたのだが、実機にて実行しようとした際に、セキュリティソフトにadb.exeがブロックされ、実行ができなかった。

これは！と思い、隔離フォルダを見ていたら、、、やはりブロックされていた。

こんなところに解決策があったとは、、、

復元し、再度ビルドして実行したところ、デバイスが選択できるようになった。

こんなことに時間を費やしてしまったのか、、、、

やはり行き詰ったら、一回離れてみたら案外解決することが多いことを改めて実感した。
[メタプログラミングRuby]monetize のオープンクラス

メタプログラミングRubyを読んでて、オープンクラスの例として [monetize](https://github.com/RubyMoney/monetize) が上がっていたので、実際にオープンクラスしているところを見てみた。

[このディレクトリ](https://github.com/RubyMoney/monetize/tree/master/lib/monetize/core_extensions) にあるファイルでオープンクラスしてて、それぞれのクラスごとに `to_money` を定義してる。

NilClass ではこんな感じ :arrow_down: で定義してある。

```ruby
class NilClass
  def to_money(currency = nil)
    Money.new(nil, currency || Money.default_currency)
  end
end
```
Prometheusのすすめ - Grafana で AlertをTeamsに通知するのは簡単です   -

Prometheusでコンテナの情報や、AWSやGCPでのService Discoveryをやって、
上手い感じに監視対象を入れたり、Grafanaで欲しい情報を載せたりしてみたけど、肝心のアラート通知をしてなかったです。<br />

# Grafanaでアラートの設定をしてみる
導入当初はAlertManagerでアラート通知すると思ってたけど、Grafana入れたらAlertManager要らないんだね。
Graphの中で設定すれば良いらしい。

## メモリ使用率のアラート
こういうグラフでAlertタブの中で設定してみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160548/e3a07e24-6d2c-0cb9-091a-d080ddceecbe.png)

１．[Create Alert]クリック

２．グラフの右に出てくるハートの部分をドラッグアンドドロップで閾値設定。（簡単！）
　　※これをすると勝手にConditions（下の条件式的な個所）の設定が反映されます。

３．その他の設定をする。
Alert Config
 * Name : 任意
 * Evaluate every : 60s 閾値の監視間隔
 * [If no data or all values are null] ※値がない場合の挙動
 * [If execution error or timeout]※値が取れなかった場合の挙動

## TestRule実行！　しかし。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160548/edd967a8-89c4-8dfa-96f3-b4f4df0a07d3.png)

[Template variables are not supported in alert queries] 
テンプレート変数がアラートクエリでサポートされていません。だそうです。

んー。テンプレート変数というと、このグラフ(というかダッシュボード）はサーバ毎に表示するようにテンプレート変数を使ってるけど、それだとダメって事か。


## 別のダッシュボードで試す。
![ALLSERVER.PNG](https://qiita-image-store.s3.amazonaws.com/0/160548/f8da8e81-4b0b-e921-3043-4386f574b3b8.png)
importしないでアラート用としてダッシュボードを作ってみました。
<br/>
メモリ用グラフ（node_exporterで取得できるサーバのメモリ使用率が全部載ってる）
![mem.PNG](https://qiita-image-store.s3.amazonaws.com/0/160548/e96d6617-c031-92bf-b3a7-48d6a0487151.png)

で、さっきと同じ感じで閾値30で試す。
![test.PNG](https://qiita-image-store.s3.amazonaws.com/0/160548/b57bbc39-7507-4987-9b34-e30e308dd7e4.png)

OK！
matchってなってるのが閾値を超えたやつで、logsの中でEval: falseは閾値超えてないって感じかな。
<br/>
今だとアラート通知はメールになってるから、次はTeamsに通知だ！

## Teams側設定
Teams側の設定は以下を参考にしました。
[Microsoft Teams に PowerShell で投稿してみる](https://qiita.com/miyamiya/items/ccae505b8e97b5b532a7)
※チャンネルにIncoming Webhookを追加する所まででURLをコピーしておく。<br/><br/>


## Grafana Notification
左メニューにある[Alerting]の[Notification Channels]から[New Channels]をクリック

TypeをMicorosft TeamsにしてUrlにさっきコピーした物を張り付けるだけ。

（簡単！）

## 通知テスト
Notification Channelの設定画面で[Send Test]があるのでクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/160548/362cd1b0-e9ff-4111-9b9a-d1baf18bc951.png)


（簡単！）

<br/>
<br/>
<br/>

Prometheus 過去記事

[Prometheusのすすめ - Grafanaで監視対象のユーザ一覧が欲しい -](https://qiita.com/nekoneck/items/75bf58ffd4fc8014d430)
[Prometheusのすすめ - 初期導入 -](https://qiita.com/nekoneck/items/fad926b5ee58ad65f47c)
[Prometheusのすすめ - Service Discovery -](https://qiita.com/nekoneck/items/aefdbb9d2a1bb1f03513)
[Prometheusのすすめ - exporter導入 node-exporter(apt-get) -](https://qiita.com/nekoneck/items/4e301520be4af69e2b68)
[Prometheusのすすめ - exporter導入 node-exporter(バイナリ) -](https://qiita.com/nekoneck/items/b8fafd5fc99842fe4ab1)
[Prometheusのすすめ - Service Discovery - EndPointが「http://:9100/metrics」になって、自分自身になってしまう件](https://qiita.com/nekoneck/items/7ca5c65eee758e97c356)
ajaxではまった話（XMLHttpRequest : 500）

CakePHP3でajaxで取得した情報を処理しようとしたら、データが取得できなかった。
まずエラーが表示されないので、エラー内容が表示されるように設定する。

```jQuery
.fail(function (XMLHttpRequest, textStatus, errorThrown) {
  console.log("XMLHttpRequest : " + XMLHttpRequest.status);
  console.log("textStatus     : " + textStatus);
  console.log("errorThrown    : " + errorThrown.message);
});
```

そして、表示されたエラー内容。

``` 
XMLHttpRequest : 500
VM1377:70 textStatus     : error
VM1377:71 errorThrown    : undefined
```

ってことはサーバー側の問題？
とコントローラーの設定を確認したり、データベースを確認したりしたが全く糸口がつかめずお手上げ状態。

しかしエラー修正はあっという間にできた。

```jQuery
$.ajax({
  url: '/ajax',
  type: "post",
  data: {
    // 送信データ
  }
}).done(function (data) {
  console.log(data);
  alert('OK');
}).fail(function (XMLHttpRequest, textStatus, errorThrown) {
  alert("NG");
  console.log("XMLHttpRequest : " + XMLHttpRequest.status);
  console.log("textStatus     : " + textStatus);
  console.log("errorThrown    : " + errorThrown.message);
});
```

```cakePHP3
public function ajax()
{
  echo $this->request->is(['ajax']);
  exit;
}
```

コントローラーで値を返していなかったのが原因でした…。
【Laravel】CORS の設定に barryvdh/laravel-cors を使うと allowed-origin の指定に正規表現を使える

## 背景

CORS (Cross-Origin Resource Sharing) についてはこちらを参考

* https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control

`Access-Control-Allow-Origin` の仕様として、全てを受け入れる `*` か、全てを受け入れない `null` か、さもなければ個別で指定（複数の場合はスペース区切り）するしかできない。

「サブドメインを許可する」といったことをするには apache の `mod_rewrite` を使うなどの工夫が必要。

* 仕様
    * https://www.w3.org/TR/cors/#access-control-allow-origin-response-header
* 工夫の例
    * [CORS 対応時の注意点などメモ#特定サブドメインからのAJAX取得を許可 @umechiki](https://qiita.com/kawaz/items/6a22c2c970c8d932a3a1#%E7%89%B9%E5%AE%9A%E3%82%B5%E3%83%96%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%8B%E3%82%89%E3%81%AEajax%E5%8F%96%E5%BE%97%E3%82%92%E8%A8%B1%E5%8F%AF)

[barryvdh/laravel-cors](https://github.com/barryvdh/laravel-cors) はその辺りの面倒をよしなにやってくれる。

作者は [laravel-debugbar](https://github.com/barryvdh/laravel-debugbar) や [laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper) などで（個人的に）おなじみの [barryvdh](https://github.com/barryvdh) さん。

## 検証

例として、Chrome の拡張機能 [Advanced REST client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo) を使ってプリフライトリクエストを発行してみる。

### 環境

* クライアント
    * Google Chrome 67.0.3396.99（Official Build） （64 ビット）
    * Advanced REST client 10.0.12-stable
* サーバ
    * PHP 7.1.18
    * Laravel 5.6.26
    * barryvdh/laravel-cors 0.11.0

### 設定

検証内容に合わせて Chrome 拡張機能からのリクエスト（`Origin` が `chrome-extension://～` ）を許可する設定。

**※あくまで検証用。本番環境の設定は慎重に行うこと！**

```php:config/cors.php
<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Laravel CORS
    |--------------------------------------------------------------------------
    |
    | allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
    | to accept any value.
    |
    */
   
    'supportsCredentials' => false,
    'allowedOrigins' => [],
    'allowedOriginsPatterns' => ['@^chrome-extension://.*@'],
    'allowedHeaders' => ['*'],
    'allowedMethods' => ['*'],
    'exposedHeaders' => [],
    'maxAge' => 0,

];

```

### 検証内容

サーバ側は `/echo` という `GET` と `POST` を許可しているエンドポイントがある、という想定。

`OPTIONS` メソッドと `Access-Control-Request-Method` でプリフライトリクエスト扱いとなる。

`OPTIONS https://<ドメイン>/echo`

```:リクエストヘッダ
Access-Control-Request-Method: POST
```

![preflight.png](https://qiita-image-store.s3.amazonaws.com/0/49690/5c8a30ef-b9ca-e519-fef1-5439e3a382f5.png)


### 結果

`200 OK` が返って来ている。
（許可されてないリクエストだった場合 `403 Forbidden` が返って来る）

また、レスポンスヘッダの `Access-Control-Allow-Origin` には Advanced REST client を表す `chrome-extension://apcedakaoficjlofohhcmkkljehnmebp` が**自動的に**セットされているのが確認できる。

```:レスポンスヘッダ（前後略）
Access-Control-Allow-Origin: chrome-extension://apcedakaoficjlofohhcmkkljehnmebp
```

![preflight-res.png](https://qiita-image-store.s3.amazonaws.com/0/49690/122c2808-897e-e738-5dd9-768af338145d.png)


## 参考

* laravel-cors のインストール手順などはこちらを参照
    * http://kayakuguri.github.io/blog/2017/06/19/larave-cors/
Terraform&AWS初心者のEC2インスタンス作成とping疎通

# 概要
- Terraformを使用してEC2インスタンスを1つ作成することが今回のゴール
- ping疎通を可能にするため、ICMP通信を許可するセキュリティグループを付与する
- 作業環境はMac

# Terraformインストール
```
$ brew install terraform
```

# 手順
1. AWSコンソールにて、IAMユーザーを作成し、アクセスキーとシークレットキーを取得
2. IAMユーザに「AmazonEC2FullAccess」ポリシーを付与。これを付与しないと、TerraformからEC2インスタンスを作成できない
3. Terraform用のファイルを作成(EC2インスタンス作成とセキュリティグループの作成および付与を定義)
4. Terraformの実行

# Terraform用のファイルを作成
- 手順1,2は省略する。
- 設定ファイル"sample.tf"にEC2インスタンス作成とセキュリティグループの作成および付与を定義
- 変数用ファイル"terraform.tfvars"にアクセスキーとシークレットキーを定義

sample.tf

```
variable "access_key" {}
variable "secret_key" {}
variable "region" {
  default = "us-west-2"
}

provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region     = "${var.region}"
}

resource "aws_security_group" "web-sg" {
    name = "web-sg"
    ingress {
	from_port = 8 // ICMP Type "Echo Request"
	to_port = 0 // ICMP Type "Echo Reply"
	protocol = "icmp"
	cidr_blocks = ["0.0.0.0/0"]
    }
}

resource "aws_instance" "web" {
    ami           = "ami-db710fa3"
    instance_type = "t2.micro"
    security_groups = ["${aws_security_group.web-sg.name}"]
}
```

terraform.tfvars

```
access_key = "XXXX"
secret_key = "XXXX"
```

sample.tfの"web"インスタンスへのセキュリティグループの付与は、以下のように直接セキュリティグループ名を与えるとエラーになるので注意。

```
security_groups = "web-sg"
```
このようなエラーとなる。

```
* aws_instance.web1: 1 error(s) occurred:

* aws_instance.web1: Error launching instance, possible mismatch of Security Group IDs and Names. See AWS Instance docs here: https://terraform.io/docs/providers/aws/r/instance.html.

	AWS Error: Value () for parameter groupId is invalid. The value cannot be empty

```


セキュリティグループのICMP許可の定義のfrom_portとto_portは、ICMP Typeを表している。（通常はポート番号)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html

ICMP Type 一覧: http://www.infraexpert.com/info/5.0adsl.htm


# Terraformの実行
以下のコマンドを実行すると、設定ファイルに定義したインスタンスとセキュリティグループが作成される。

```
$ terraform apply
.
.
.
aws_instance.web: Still creating... (10s elapsed)
aws_instance.web: Still creating... (20s elapsed)
aws_instance.web: Still creating... (30s elapsed)
aws_instance.web: Creation complete after 31s (ID: XXXXXX)

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```

# 参考
- [Terraform Guides - Getting Started > Build Infrastructure](https://www.terraform.io/intro/getting-started/build.html "")
- [Terraform Guides - Getting Started > Input Variables]
(https://www.terraform.io/intro/getting-started/variables.html "")
- [TerraformとAWSに同時入門する]
(https://qiita.com/litencatt/items/8da20374def6320a014b "")
【Tips】Windows Subsystem for Linux の Ubuntu で使っている容量を調べる

# 初めに
　Windows Subsystem for Linux (WLS) を長く使ってアプリのインストールなどを多くやっているとふとそういえば今どれだけの容量を使っているのだろうと気になることも多いと思います。特にコンピュータに搭載されている外部記憶容量が小さい場合。
　ということで、WLSのUbuntuが使っている容量を調べてみました。

# NG：Windows側から調べる
　UbuntuのフォルダはWindows側からみると下記の場所に格納されています。

```PowerShell
C:\Users\【ユーザー名】\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
```

このフォルダの容量を見ればUbuntuの使用容量がわかるような気がしますが、実際に見てみると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147741/64343f57-eeac-f151-c6c7-58b0f056abf6.png)

というようにやたら小さな値が表示されてしまいます。そんなわけないだろ。
　いろいろと試行錯誤してみたところ、どうやら「.rbenv」のような.から始まるフォルダ・ファイルが容量計測から外されている模様。これをWindows側から解決する方法もあるとは思いますが、今回はWindows側での計測は諦めて、Ubuntu側で計測してみることにしました。

# OK：Ubuntu側から調べる
　ということで、通常Linuxで使われているディレクトリ容量を図るためのコマンド「ncdu」を利用します。WLSのUbuntuには標準搭載されていないため、

```bash
sudo apt install ncdu
```
　でインストールした後、

```bash
ncdu
```

で実行します。実行結果は以下の通り。なお表示までに結構な（分レベルの）時間がかかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147741/bfcd0db3-f3fb-207d-fb73-e20a0e70252d.png)

　一番上のmnt以外正しく表示されましたが、mntはUbuntu側から見たCドライブなどが入っているディレクトリなので今回のWLSが使っている容量の測定という目的においてはむしろ除外すべき対象です。よってこれは無視して、それ以下のディレクトリの合計容量を足した5GBぐらいが現在Ubuntuが使っている容量ということになります。
　なお

```bash
ncdu --exclude=mnt
```

と実行すれば最初からmntを除外した結果を表示してくれます。Windowsファイルを読みにいかない分実行も早く終わるので基本的にはこちらの形で実行する方が良いでしょう。

# 参考文献
- [Linuxのファイル容量調べるコマンドメモ](https://qiita.com/okb_m/items/a3096c873e1855bae7d8)
- [【 du 】コマンド――ディスクの使用量を表示する](http://www.atmarkit.co.jp/ait/articles/1610/25/news016.html)
- [Linuxコンソール上で容量が大きいディレクトリを確認する『ncdu』コマンド](https://orebibou.com/2014/09/linuxコンソール上で容量が大きいディレクトリを確/)
- [dfコマンドについてまとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-df)
- [【NG集】Windows Subsystem for Linux（Bash on Ubuntu on Windows）上のrubocopをVisual Studio Code 拡張「ruby-rubocop」で使用→失敗](https://qiita.com/GandT/items/d825f7ab8896db4d4b7a)
ScalikeJDBCでエラーログにsqlを出力しないように制御する

# 利用
- scala
- playframework
- scalikejdbc
- scalikejdbc-config

# はじめに

エラーログにsqlを出してくれるのは便利だが、出ないように制御したいときもある

たとえばログ上に機密性の高い情報を残したくないとか

## エラーログ出力例
```
[error] s.StatementExecutor$$anon$1 - SQL execution failed (Reason: Duplicate entry '123456789' for key 'XXXX_ID'):

   insert into xxxx (XXXX_ID, NAME, UPDATED_BY, UPDATED_AT) values (123456789, 'test', 1, '2018-07-10 02:18:41.988')
```

# ログ出力箇所
エラーログの`SQL execution failed`を出力しているのは↓

https://github.com/scalikejdbc/scalikejdbc/blob/86f733fefa7c6cdfd63eccc2ab8c66b09bed1607/scalikejdbc-core/src/main/scala/scalikejdbc/StatementExecutor.scala#L355


# 制御箇所
```scala
if (settingsProvider.loggingSQLErrors(GlobalSettings.loggingSQLErrors)) 
```

で制御している

# 対応方法
application.confに

`scalikejdbc.global.loggingSQLErrors=false`

を追加してやるとでなくなる

# 追記
https://github.com/scalikejdbc/scalikejdbc-play-support
に
`scalikejdbc.global.loggingSQLErrors=true`載ってますね。

ドキュメントはちゃんと読みましょう。
「Chainerで作るコンテンツ自動生成AIプログラミング入門」をWindows10で読み進める

# この記事について
この本「Chainerで作るコンテンツ自動生成AIプログラミング入門」は、
Ubuntuにインストールする想定で書かれています。

しかしなにも怖れることはありません。わたしたちは世界の覇権Windows使い。

というわけで、どのあたりをチョイ変すればChainer on Windows10で進めていけるのか、
メモしておこうという記事です。

なので、本質的な事は本紙をご覧下さいませ。

# Chainerのインストール
シンプルにいきましょ！ 書の読解が目的なので、CUDA環境はインストールしませんえん。

||手順|note|
|--:|:--:|:--|
|0|**Anaconda**のインストール|ダウンロードしてインストール！|
|1|**Anaconda Navigator**を起動する|仮想環境とパッケージ管理をするツール|
|2|Environmentsを新たにCreateする|仮想環境をつくっておきましょう。好きな名前で。|
|3|**Chainer**をインストールする|リスト左上で"Not installed"を選ぶと出てくる|
|4|**hd5f**をインストールする|リストから**hd5f**を選択する。hd5fファイルのライブラリ|
|5|**curl**をインストールする|chap.3で使う|

# 本紙のサンプルコードをダウンロード
サンプルコードのダウンロード先は、本紙に記載があります。
(GitHubで公開してくれたら、修正しがいがあるのになぁ)


# Chap.2
GPUない環境で読んでいるので、勝手に下記のようにして進めます。
まちがっていたら、あとで気づくはず。

```python:chapt02-1.py
  use_devices = -1
# use_devices = 0
```

するすると進んでしまいましたが、もうひとつだけ。
書もサンプルコードも、"MNIST" -> "NMIST" と表記していた箇所がありました。
リファクタリングで指摘してあげてください。いまは動くならば何でもいいです。

# Chap.3
wgetなかったので、curlをインストールしちゃいました。
下記のとおりです。
じぶんの環境に都合がよかったので、
オプションの "-O"(大文字)は、"-o"(小文字)にしました。

```python:chapt03-1.py
  os.system('curl '+o+' -o portrait/'+face)
# os.system('wget '+o+' -O portrait/'+face)
```


さて、メモここまで。後日更新します。
ansible コマンドでモジュール引数 ( パラメータ ) を複数渡す方法

# Playbook に書くような内容を ansible コマンドで実行したい

例えばこんなのを ansible コマンドでやりたい。

```yaml:some_playbook.yml
- hosts: localhost
  tasks:
    - file:
        path: ~/example.txt
        state: touch
```

# 結論

こんな風に、key=value形式をスペースで区切って渡せば良い。

`$ ansible -m "モジュール名" --args "key1=value2 key2=value2"`


# 実行例

```
$ ansible localhost -m "file" --args "path=~/example.txt state=touch" 
```

```bash

localhost | SUCCESS => {
    "changed": true,
    "dest": "/Users/yinaura/example.txt",
    "gid": 20,
    "group": "staff",
    "mode": "0644",
    "owner": "yinaura",
    "size": 4,
    "state": "file",
    "uid": 501
}
```

(注釈‥localhostであれば便宜的にインベントリ指定なしでも動く)

# ここに至る経緯

最新版の ansible help でもごく簡素にしか書かれていない。

```
Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
```

StackOverFlow や 公式ドキュメントを探しても例が出てこない。
コロンやセミコロンや改行で区切っても無理だ。

色々試してようやく動いた。

# 追記

[How Ansible Works](https://www.ansible.com/overview/how-ansible-works) にしれっと例が書いてあったという驚き。

```
ansible all -m ping 
ansible foo.example.com -m yum -a "name=httpd state=installed"
ansible foo.example.com -a "/usr/sbin/reboot"
```


# 環境

- ansible 2.6.0

# Links

- [Gist](https://gist.github.com/YumaInaura/06e080e3f807338c122837bdb2d34571)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MacにAnsibleをインストール

Homebrewでインストールしたのでメモ

# Homebrewで探す
```
$ brew search ansible

==> Searching local taps...
ansible                           ansible-lint                      ansible@2.0
ansible-cmdb                      ansible@1.9                       terraform-provisioner-ansible
==> Searching taps on GitHub...
homebrew/cask/ansible-dk
==> Searching blacklisted, migrated and deleted formulae...
```

# Ansibleをインストール
```
$ brew install ansible

....
🍺  /usr/local/Cellar/ansible/2.6.1: 19,347 files, 228.7MB, built in 8 minutes 33 seconds
```

# 実行確認
`ansible --version` コマンドで実行確認

```
$ ansible --version

ansible 2.6.1
  config file = None
```
ファイルの中に記述されている１行目を取得し、画面に表示させたい(PHP)

wordで１行目 ２行目 ３行目 ４行目...と文字を打ちtxtで保存し、

viエディタで下記コードを書き、ターミナルでphp aaa.phpとコマンドを打って表示させようとすると、

?P?s??と表示されますが、原因がわかる方いらっしゃいましたらご回答願います。

```<?php
  
$fp= fopen("/Users/tanakaakio/Desktop/phptanaka.txt","r");

$line = fgets($fp);

fclose($fp);

$hoge = file("/Users/tanakaakio/Desktop/phptanaka.txt");

print $hoge[0];

?>
Clipkitの記事アイキャッチ画像がNo Imageかどうか判別する方法

No Imageかどうか判別して、No Imageでない場合はアイキャッチ画像を表示する例

```
{% assign image_undefined = article.image_medium_path | match: '/missing\.png$' %}
{% unless image_undefined >= 0 %}
<img src="{{ article.image_medium_path }}">
{% endunless %}
```

matchフィルタに使う画像パスは、medium以外でもOKです。
Pandas 公式チートシートを翻訳しました

 インターンに来る学生に Python の pandas の操作に慣れてもらうため、[公式チートシート](https://github.com/pandas-dev/pandas/tree/master/doc/cheatsheet)[^1] を翻訳しました。ざっとググった限りでは、R 関係のチートシートの翻訳は見かけますが pandas のは見つかりませんでした。どうやら本邦初の日本語版らしいので、一般公開します。

本体は github にあります。pptx 版もあるので編集も容易です。
https://github.com/Gedevan-Aleksizde/pandas-cheat-sheet-ja

![スクリーンショット 2018-07-10 13.38.17.png](https://qiita-image-store.s3.amazonaws.com/0/236849/ca722689-34c5-d69d-5146-0e537c4c15bd.png)

![スクリーンショット 2018-07-10 13.38.26.png](https://qiita-image-store.s3.amazonaws.com/0/236849/8fc04f5a-1c2d-bf9f-66a4-20e0b0c93647.png)

2019/7/26: 公式チートシートを踏まえて, 応用的な使い方について書きました.
https://qiita.com/s_katagiri/items/cc0bceddbbf84eb08d18

[^1]: 公式とは別に、オンライン学習サイトの datacamp が作成したものもあります。 https://www.datacamp.com/community/blog/python-pandas-cheat-sheet
iOS定期購読課金の無料トライアルを調べてみた

## 無料トライアルを対応する

こちらの記事がとてもわかりやすく最高にまとまっていました！
[iOSアプリの継続課金コンテンツに無料トライアル機能を導入する方法](https://tech.starttoday-tech.com/entry/free_trial)

無料トライアルはこれまで購読したかどうかではなく「このアプリで無料トライアル登録したことがあるか」でトライアル可能かが変わるようです。

## 無料トライアル登録できないパターン

ユーザが以下の状態だと無料トライアル登録できないことを確認しました。
次の更新時に決済できる状態でないと登録できないようです。

- 決済登録がない
 - キャリア決済やクレジットカード登録をしていない状態
 
<img width="20%" alt="Image from iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/173676/492d8117-dc3d-a638-939c-8985a4770030.png">

- 決済登録がないかつiTunesのチャージが足りていない
 - 更新時に発生する金額分のチャージがない(チャージされているが足りていない)と登録不可でした

## サーバ側のレシート処理

無料トライアル登録したときのレシートも通常と同じく発行されるので特に対応する必要はなし。
無料トライアルかどうかはレシート情報の「is_trial_period」(true : 無料トライアル)にて判断できます。
また無料トライアルから更新された(無料トライアルが終了した場合)はレシートが新たに発行されるのでそちらを確認すればOKです。

## 無料トライアル中にクロスグレードもしくはアップグレードした場合

こちらは調査次第追記したいと思います。
AngularJS's note


## Angular、Angular CLI

- [【初心者必見】Angularとは？いまさら聞けない基礎を学ぼう | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト](https://www.sejuku.net/blog/9019#WEB)
- [Angularの基本構造を理解して、アプリ開発を始めるには？ - Build Insider](https://www.buildinsider.net/web/angulartips/002)
- [Angular 入門 - アプリケーションを作りながらモジュールとコンポーネントとサービスについて理解する - Qiita](https://qiita.com/nirasan/items/a42a1f7723779141f186)

## 抑えておきたい

- ng-csp: https://www.buildinsider.net/web/angularjstips/0054
- ng-cloak: https://www.buildinsider.net/web/angularjstips/0006
- [SCSS with Angular-cli](https://qiita.com/nksm/items/e6e68833e9410a2ee7da#angular-2-%E3%81%AE-css-%E3%81%AE%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96)
- そのプロジェクトの仕様を知りたければ: angular.json

## ngBootstrap

- via angular-cli: https://qiita.com/nirasan/items/72739440d513ba146f37
- non via angular-cli: https://qiita.com/pshiko/items/d81fb374d54a65b41884
- 上記で示されているcss 4.x系のdoc: http://getbootstrap.com/docs/4.1/layout/overview/

## トラブルシューティング

- `Could not find an NgModule. Use the skip-import option to skip importing in NgModule`
    - `ng generate component header --project {{project name}}`
    - もしくは
    - `ng g component home --skip-import`: ただしsrc/app/app.module.tsをアップデートするのは手動でする必要がある

## 知っトク

- /e2eフォルダがある理由: https://angular.jp/guide/quickstart ![image.png](https://qiita-image-store.s3.amazonaws.com/0/17342/f9aa9fab-f225-6ea7-0790-aba5a26eb46d.png)
- Directiveはstyleがあたらない
[Review] Audio and Digital Signal Processing in Python

## Introduction
When you deal with the signal from the device or some other gadgets, it always is a analog data. However, in order to do some fancy stuff on your pc, it has to be Digital. Hence, we are required to process the data into digital one.
So in this article I would like to talk about the way to transform audio data.

## Agenda
1. Create a Sine Wave

## Create a Sine Wave
In this section, we are going to create a sine wave as a running example.
But before that, let's review some terminologies.

- Frequency: the number of times a sine wave repeats a second. ex) 1KHz
- Sampling Rate: the number of times a second we take a sample of the analog signal.
- Sine Wave Formulae: <img width="176" alt="Screen Shot 2018-07-10 at 10.31.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/30fff4a3-f007-3c7c-bb2a-54fad46f0ef6.png">  
<img width="536" alt="Screen Shot 2018-07-10 at 10.33.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/36948c0c-7179-1b7b-86e3-f88e21f26903.png">