OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCIの設定変更を Git コミットせずにローカルで試すチュートリアル

## はじめに

最近、<a href="https://www.youtube.com/channel/UC9_Pmtv-cUccKkusuapItMQ" target="_blank" rel="nofollow noopener">CircleCI の公式 YouTube チャンネル</a>を見つけ、動画での学習を試しています。

その中で、CircleCI の設定変更を git コミットせずに試すチュートリアル動画があったので、動画を観つつ検証した手順を残しておこうと思います。

## tl;dr

* CircleCI は、Githubリポジトリ、リポジトリのリビジョン、CircleCI の API トークンを指定さえすれば、いちいち ```config.yml``` を git で更新しなくても HTTPS API 経由で実行検証できる

## 前提

### CircleCIのセットアップ

CircleCI 公式ドキュメントの<a href="https://circleci.com/docs/2.0/#prerequisites-for-running-your-first-build" target="_blank" rel="nofollow noopener">First CircleCI Build</a> は実施していて、最低限の CircleCI 実行は試せるものとします。

### 参照したチュートリアル動画

今回の記事の内容に関する動画です。

<a href="https://www.youtube.com/watch?v=HB5DehCufG0&list=PL9GgS3TcDh8x6tcY7HDq2zmEx0fAtwWsM&index=1" target="_blank" rel="nofollow noopener">Run builds on CircleCI using a local config file - YouTube</a>

### チュートリアル動画の補足記事

チュートリアル動画の内容に関する補足は下記に載っています。

<a href="https://discuss.circleci.com/t/run-builds-on-circleci-using-a-local-config-file/17355" target="_blank" rel="nofollow noopener">Run builds on CircleCI using a local config file - Tips, Tricks and Hacks - CircleCI Community Discussion</a>

## 検証手順

ここからは動画の内容に従って検証していきます。

### ローカル環境にディレクトリ作成

ローカル環境にCircleCIの設定ファイルと、curl を実行するスクリプトを準備できるよう、ディレクトリを作ります。

```
$ mkdir -p circleci-tools/pushConfig
```

#### config.yml をローカルに作成

CircleCI で実行する処理を記述する ```config.yml``` を準備します。

```
$ vim circleci-tools/pushConfig/config.yml
```

```circleci-tools/pushConfig/config.yml
version: 2
jobs:
  build: 
    machine: true
    steps:
      - run: echo 'test'
```

#### curl コマンドのスクリプトを作成

ローカルの ```config.yml``` を基に CircleCI を実行するためのスクリプトを作成します。

```
$ vim circleci-tools/pushConfig/pushConfig.sh
```

```circleci-tools/pushConfig/pushConfig.sh
GITHUB_REVISION=XXXX
curl --user ${CIRCLE_TOKEN}: \
  --request POST \
  --form revision=${GITHUB_REVISION} \
  --form config=@config.yml \
  --form notify=false \
    https://circleci.com/api/v1.1/project/github/gotchane/circleci-101/tree/master
```

CircleCI の API 実行を、curl コマンドから実施しています。

```GITHUB_REVISION``` は CircleCI を実行したい Githubリポジトリのコミットのハッシュ値を指定します。

```CIRCLE_TOKEN``` には後ほど取得する CircleCI の API トークンを環境変数で指定します。

API の URL は```gotchane/circleci-101``` の部分を環境に応じてユーザー名・リポジトリ名共に変更します。

#### CircleCI の API トークンを取得する

CircleCI の GUI コンソールを開き、画面右上の「User settings」をクリックして User Settings 画面に移動します。

左側のサブメニューから「Personal API Tokens」をクリックし、新しい API トークンを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/8f54e459-e7ea-7586-4031-9e0df40790ec.png)

作成した API トークンは控えておき、```circleci-tools/pushConfig/pushConfig.sh``` を実行する前に環境変数として設定しておきます。

```
$ export CIRCLE_TOKEN=XXXXX
```

#### スクリプト実行

CircleCI の API トークン、git のリビジョンを curl コマンドに反映したら、スクリプトを実行します。

```
$ cd circleci-tools/pushConfig
$ chmod +x pushConfig.sh
$ ./pushConfig.sh
```

#### 実行確認

ローカルの ```config.yml``` を基にCircleCI が実行されているか確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/76664254-174b-7d7b-1bd3-cbf4af2b8c5b.png)

### 終わりに

今回検証をやってみて、いちいちコミットしなくても ```config.yml``` を検証できるのは便利だなと思いました。

また今回は動画を観ながら検証をやってみたのですが、理解が進みやすかったなと思います。ただ、動画だけでなく、ドキュメントや関連ブログ記事といった補助的な情報にも触れていくといいなと思いました。
マップの実行順序を指定する

## はじめに

`map`を`range`で処理すると実行順序が都度変わってしまうので、ソートする時のメモ。

```go
numerics := map[string]int{"one": 1, "two": 2, "three": 3}

for k, _ := range numerics {
	fmt.Printf("%s --> %v\n", k, numerics[k])
}
```

上のコードを何回か実行すると下記のように実行順序が変わってしまう。

```
2 --> two
3 --> three
1 --> one
```

```
1 --> one
2 --> two
3 --> three
```

```
3 --> three
1 --> one
2 --> two
```

## キーでソートする

`sort`パッケージを使用すると実行順序を指定できる。

```go
package main

import (
	"fmt"
	"sort"
)

func main() {
	numerics := map[int]string{1: "one", 2: "two", 3: "three"}

	// キーを配列に追加する
	keys := make([]int, 0)
	for k, _ := range numerics {
		keys = append(keys, k)
	}

	// キーをソートする
	sort.Ints(keys)

	for _, k := range keys {
		fmt.Printf("%v --> %s\n", k, numerics[k])
	}
}
```

これで順番に実行されるようになる。

```go
1 --> one
2 --> two
3 --> three
```

## キーでソートする（逆順）

逆順にするのであれば、次のようにすれば良い。

```go
package main

import (
	"fmt"
	"sort"
)

func main() {
	numerics := map[int]string{1: "one", 2: "two", 3: "three"}

	// キーを配列に追加する
	keys := make([]int, 0)
	for k, _ := range numerics {
		keys = append(keys, k)
	}

  // キーを逆順にソートする
	sort.Sort(sort.Reverse(sort.IntSlice(keys)))

	for _, k := range keys {
		fmt.Printf("%v --> %s\n", k, numerics[k])
	}
}
```

以上。
なるべく手間をかけずEC2インスタンスのPublic IPを取得してみた

よくEC2インスタンスを一時的に立てて作業をすることがあるのですが

1. 公開するサービスでもないためElasticIPは不要
2. とはいえ再起動時に割り振られるPublic IPを手間なく知りたい（AWSコンソールにいちいちログインしたくない）

という想いがありました。それを解消した備忘録。

# ElasticIPによる課金

[EIPで料金発生するパターンとしないパターン #AWS](https://dev.classmethod.jp/cloud/aws/cost-of-eip/)

ここに詳しく載ってますが、よくあるパターンとして

- ElasticIPは割り当てた
- 割り当てたEC2インスタンスは必要な時以外動かさない

という時は課金対象となります。このパターンだと、0.005USD / hourかかってしまいます。月3.6ドル、400円程度。少額とはいえ、EC2インスタンスを停止してコストを抑えようとしているのにElasticIPで課金されているようでは意味がありません。

ということで以下の通りの設定をしました。

# 起動スクリプトにPublic IPを出力、S3に配置する処理を記述
準備として以下を実施します。

1. awscliのインストール（すでにされているインスタンスがほとんど）
2. S3にデータ保存用のバケット作成
3. 起動するEC2インスタンスにS3バケットへのアクセス権限をつける

起動スクリプト（ユーザーデータではない。再起動時に毎回実行して欲しいから）にメタデータを取得し、そのデータをS3に配置するようにします。

```
$ sudo vi /etc/rc.local
```

ファイルを開いたら、以下の処理を追記します。（ファイルの最後に記述されている```exit 0```の前に追記します）

```sh
curl http://169.254.169.254/latest/meta-data/public-ipv4/ > /tmp/ip.txt
aws s3 cp /tmp/ip.txt s3://xxx-xxxx-conf
```

これで再起動時に新しく割り振られたPublic IPがS3に保存されるので、それを自分のマシンから参照するだけです。

```
$ aws s3 cp s3://xxx-xxxx-conf/ip.txt - 2>/dev/null | head
54.236.XXX.YYY
```

これで無事Public IPアドレスが取得できました。
cookieパースしたら謎のスペースが入っていた

# Javascript使って自力パースしている場合はパースロジックを見直すこと

```js
let cookies = document.cookie.split(';');
    cookies.map((value) => {
      let content = value.split('=');
      if (content[0] === 'iwantu') {
        // do something use 'iwantu'
        console.log("I got :", content[1])
      };
    });
```

このコードで *iwantu* が取れる場合は、
そのクッキーがクッキー文字列の先頭にある場合のみ、前に他のクッキーが存在する場合、
謎の？スペースが挿入されて、 *===* 評価では取れない

# なぜ？

document.cookieを叩いて見てみる

```
"iwantu=ineedu; foo=bar; hoge=piyo"
```
さっきのロジックを追ってみる、まずsplit(';')を実行すると

```js
cookies[0] = "iwantu=ineedu"
cookies[1] = " foo=bar"
cookies[2] = " hoge=piyo"
```
スペースも文字列の一種なわけで、あくまで *;*でsplitしているわけだから、
当然この時点でスペースが入る

なので、比較するときに、一旦空白を取り除いてからが良いかと
（
　そもそもcookieの値に空白を入れる "a k b=48"みたいなケースは想定しません
  これってcookieとして正しいのか？　はさておき
 ）

# 改良版

```js
let cookies = document.cookie.split(';');
    cookies.map((value) => {
     //一回スペースを取り除く
      let content = value.split('='); 
      if (content[0].trim(" ") === 'iloveu') {
        // do something use 'iloveu'
        console.log("I got :", content[1])
      };
    });
```
これで取れる

####  <font color="gray">/* 別にAKB好きではありません */</font>
CSSのtransform:rotateZ,rotateX,rotateZそれぞれの動き

# 背景
transform:rotateのX,Y,Zの動きが分かりにくかったのでまとめました。
完全の個人的なメモ…

# transform:rotate各種動き
下記のような縦軸、横軸にして交差したところは足しこんでいます。
縦軸：`Z>X>Y`の順でそれぞれ４５°設定
横軸：`Z>X>Y`の順でそれぞれ４５°設定


<p data-height="550" data-theme-id="0" data-slug-hash="qybYYM" data-default-tab="css,result" data-user="hashito" data-embed-version="2" data-pen-title="transform:rotata" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/qybYYM/">transform:rotata</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#関連する記事

[・CSSでhoverでafter要素で文字を表示するとプルプルする件](https://qiita.com/hashito/items/f25b6a6542ee32893fd1)
機械学習論文読みメモ_135

[Curricilim Domain Adaptation for Semantic Segmentation of Urban Scenes](https://arxiv.org/abs/1707.09465)
CNNはsemantic segmentationのタスクにおいて重要な役割を果たしてきた。
しかしながらそのモデルを学習するためには膨大な量のデータとそのアノテーションが
必要となってしまう。
一方最近は人工的に作成したphoto-realisticな画像を変わりに用いる手法も研究されている。
こうした手法の場合、実際データとの間に生じるdomain gapの解消が課題となってくる。
本論ではこの問題に対してcurriculum learningの手法に則ったdomain gapの解消手法を
提案する。
この手法では学習において、始めに簡単で重要な特性からtarget domainへadaptさせる。
例えばそれは、target domainの画像に関するglobal distributionであったり、
画像内のlandmark super-pixelに関するlocal distributionなどである。
こうした分布はdomainに関わらず都市部において共通点が多いため学習がしやすくなっている。

[MapNet: Geometry-Aware Learning of Maps for Camera Localization](https://arxiv.org/abs/1712.03342)
visual SLAMなどにおいて地図は画像ベースのlocalizationを
行うに当たって重要である。
しかし地図の定義はapplicationに依存しており、
人手で作られる場合が多い。
本論では、代わりに地図をdeepnetとして構築する
手法を提案する。
このネットワークはMapNetと呼び、
データから地図表現を学習させる事を可能とする。
この手法はGPUと画像情報のみを使ってvisual odometryとの組み合わせ
とともにカメラのlocalizeを行う。
こうした情報から得られる幾何的な制約情報を用いて損失を定義し、ネットワークの学習を
行う事が可能である。
またMapNetはunlabeledなvideo sequenceに対してself-supervisedな手法を用いる事で
ネットワークの更新が可能である。

[Neumann Optimizer: A Practical Optimization Algorithm for Deep Neural Networks](https://arxiv.org/abs/1712.03298)
deepnetはその学習に長い時間がかかる事が課題である。
単純なハードウエアリソースの拡大は逓減効果があるためスケールしない。
本論では、計算効率を改善させ、さらに高速化させるような、
large batchなstochastic optimizationアルゴリズムを提案する。
この手法は各バッチに対して暗にinverse Hessianを計算する。
これは陽にHessian行列を計算したり、近似したりしない事を意味する。
この事は各ステップにおける勾配計算の際、新たなsub-problemを形成し、
その問題を逆行列に対するNeumann expansionを利用しながら解く事で実現する。
wifiの研究 その２

#概要
wifiを理解したかった。
wemosで、wifi scanしてみた。

#結果
11aが、見つからない。

```
16 networks found
1: aterm-34e11b-g (-73)*
2: B0C7456B8141 (-80)*
3: B0C7456B8141-1 (-77)*
4: aterm-34e11b-gw (-73)*
5: 000A79A44485 (-79)*
6: keyenceautoid (-80)*
7: aterm-24820d-g (-88)*
8: Buffalo-G-A6F4 (-75)*
9: aterm-4c4c3c-g (-64)*
10: 001D738791F4 (-68)*
11: aterm-be5422-g (-84)*
12: DIRECT-D3EA284F (-87)*
13: 001D736531AA_G (-56)*
14: Buffalo_11n/g/b (-81)*
15: Buffalo-G-E128 (-75)*
16: 0024A50BC93C (-75)*
```

#サンプルコード

```
#include "ESP8266WiFi.h"

void setup() 
{
	Serial.begin(115200);
	WiFi.mode(WIFI_STA);
	WiFi.disconnect();
	delay(100);
	Serial.println("Setup done");
}
void loop() 
{
	Serial.println("scan start");
	int n = WiFi.scanNetworks();
	Serial.println("scan done");
	if (n == 0) Serial.println("no networks found");
	else
	{
		Serial.print(n);
		Serial.println(" networks found");
		for (int i = 0; i < n; ++i)
		{
			Serial.print(i + 1);
			Serial.print(": ");
			Serial.print(WiFi.SSID(i));
			Serial.print(" (");
			Serial.print(WiFi.RSSI(i));
			Serial.print(")");
			Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
			delay(10);
		}
	}
	Serial.println("");
	delay(5000);
}




```

以上。
DymanoDBについての備忘録

DynamoDBについて勉強したので、忘れたくないことをメモ。

# 参考サイト
- [コンセプトから学ぶAmazon DynamoDB ｜ シリーズ ｜ Developers.IO](https://dev.classmethod.jp/series/conceptual-learning-about-dynamodb/)
    - 公式の用語を用いていないので注意が必要
    - DynamoDBの内部構造まで含めた解説がされており、深い理解ができる。
        - 仕組みを理解した上で利用しないとパフォーマンスを下げる使い方をしてしまうのでとても参考になる。

# 覚えておきたい特徴
- パーティショニングされていてパーティションキーによって分散される
- スループットはWCU、RCUで指定できる
    - [読み取りと書き込みのスループットキャパシティー - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ProvisionedThroughput.html)

# 整理ポイント
- 主キーのみのテーブル
    - パーティションキーを主キーとする
    - パーティションキーでアイテムを取得
- 複合主キーのテーブル
  - [コンセプトから学ぶAmazon DynamoDB【複合キーテーブル篇】 ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/conceptual-learning-about-dynamodb-composite-key/)
  - テーブル作成時にパーティションキーとソートキーを指定
  - RDBの複合主キーのようにパーティションキーとソートキーの組み合わせが同じものは１つしか保存できない
  - パーティションキーの重複が許される
  - 一回で特定範囲の値を取得できる
- 主キーとインデックスの整理
    - [コンセプトから学ぶAmazon DynamoDB【インデックス俯瞰篇】 ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/conceptual-learning-about-dynamodb-index/)
    - 主キーは特定のアイテムを唯一に特定できる検索条件
    - インデックスは特定の検索条件に一致するデータがどこに保存されているかを管理するデータ構造、重複してても良く検索条件で一意の値が取得できるとは限らない
    - DynamoDB
        - 主キー：パーティションキー or パーティションキー & ソートキー
        - インデックス：LSI、GSI
             - 複合主キーとなるパーティションキーとソートキー以外でも検索がしたい時に利用
- 結果整合性モデル
    - データをコピーして３つのAZに分散配置
- ローカル・セカンダリ・インデックス（LSI）
    - 複合主キーを持ったテーブルでしか利用できない
    - テーブルと同じパーティションキーを利用して、異なるソートキーを持つインデックスを作成
    - インデックスへの射影は選択をする
    - 射影（どの属性をインデックスに含むか）は作成時に選択する
        - 射影を主キーのみにした場合インデックスに対するクエリで主キーを見つけて、テーブルに対してその主キーでアイテムをGetする
    - テーブル作成時にしか作成できない
- Global secondary index(GSI)
    - 新しいパーティションキーとソートキーを持つインデックス
        - インデックスなので重複しててもよい
    - 任意のタイミングで作成可能
荒れ果てたpython開発環境を再構築する(mac)

# きっかけ
tensorflow入れようと`pip install`しようとしたらpipが何故かお亡くなりになった．
うーん．と調べているうちにすごいことに気づいてしまった．
自分の開発環境が： 
 - brew, pyenv, virtualenv, pyenv-virtualenv, virtualenvwrapper, anacondaごちゃ混ぜ（←すごいミックス！）
 - bash/zshごちゃ混ぜ  

よく理解しない大学3年生の時とかにインストールしたのと，
友達に勝手にシェルをzshにされていたのが原因です．
（terminal便利にしといたから〜って言われたこともあったな〜）

# 参考文献
ここが一番よくまとまってた  
http://www.zopfco.de/entry/2017/04/03/233811

# 詳しくは
https://kandai.hatenadiary.jp/entry/2018/07/16/105940
GCP Compute EngineにTeraTermで接続する

### 1. PuTTy Key Generatorで鍵を作成する。
Generateボタンを押下してKeyエリアの中をマウスでぐりぐりする。
![putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/215812/8a8f9de3-4574-68ad-8860-69d7f74c5bf6.png)

### 2. 鍵ができたら、公開鍵、秘密鍵ともにファイル保存する。
![putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/215812/ec769611-7571-656e-ed7a-2a6193742199.png)

### 3. Compute Engineの左のメニューから「メタデータ」を選択し、「SSH認証鍵」タブを選択する。
![putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/215812/ec8049a7-3f33-75a7-902d-2780ec8abbd4.png)

### 4. 編集ボタンから、「ssh-rsa 公開鍵 ユーザ@gmail.com」の形で項目を追加する。
PuTTy Key Generatorで保存した公開鍵ファイルを開いて、鍵の部分を"改行なし"で入力すること。
![putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/215812/ce273e7e-f29f-f470-ef73-6b246abb068e.png)

このように入力
![putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/215812/dc322078-b591-bb17-f28c-492c8039be30.png)

### 5. TeraTermでログインする
ログイン時のユーザ名は、4で登録した「ユーザ@gmail.com」の@の左側の部分がユーザ名となる。
1.で作成した秘密鍵を指定する。パスフレーズをパスワード欄に入力する。
CAP-X(アセンブラ)

現在、公開資料を捜索中。

CAP-X解説書 (情報処理教育講座シリーズ) 松尾三郎, 電子開発学園 ,1986
https://www.amazon.co.jp/dp/4886475027

情報処理技術者試験アセンブラ演習,日高 哲郎,共立出版,1980
http://www.kyoritsu-pub.co.jp/bookdetail/9784320021334

明解COMPーX&CAPーX (第1種・第2種情報処理技術者試験対策) 玉井浩,サイエンス社,1985/1/1
https://www.amazon.co.jp/dp/4781904130/

情報処理技術者試験受験者・アセンブリ言語入門者のためのCAP-X入門〈61年度版〉 (I/O books) 赤松 徹 , 伊藤 嘉保, 1986/3
https://www.amazon.co.jp/dp/4875930771/

CAP‐X入門―情報処理技術者試験受験者・アセンブリ言語入門者のための (60年度版) (I/O books) 赤松 徹, 1985/3
 (著)
https://www.amazon.co.jp/dp/4875930526/

CAP‐X入門―情報処理技術者試験受験者・アセンブリ言語入門者のための (59年度版) (I/O books) 赤松 徹  1984/1
https://www.amazon.co.jp/dp/487593033X/

CAP‐X入門―情報処理技術者試験受験者・アセンブリ言語入門者のための (58年度版) (I/O books) 赤松 徹 1983/1
https://www.amazon.co.jp/dp/4875930194/

CAP-X入門〈55年版〉 (1980年) (I/O books)  1980/7
https://www.amazon.co.jp/dp/B000J809E0/

詳解 CAPーX問題・解答集―1・2種情報処理技術者試験,甘利 直幸 ,オーム社,1985/4
https://www.amazon.co.jp/dp/4274157628/

第2種CAPーX (情報処理受験シリーズ) 魚木五夫, 朝倉書店, 1983/9
https://www.amazon.co.jp/dp/4254125658/

CAP‐X&COMP‐X―情報処理試験 アセンブラ言語 (MSA Soft books) 島田 峻,現代MSA, 1985/9
https://www.amazon.co.jp/dp/4875979584
ISBN: 978-4875979586

CAP-X & COMP-X : 情報処理試験アセンブラ言語 参考書ではわからなかった人のための実習書
島田峻 著,星光電子 編,現代MSA, 1985
ISBN: 978-4875979584
http://iss.ndl.go.jp/books/R100000002-I000001763668-00

CAP-X85 Ｏｈ！ＭＺ 1985年10月号 藤永和俊
http://mio.servequake.com/~takky/emuz2000/sos/cap-x.html

I/O アイ・オー 1980年2月号
 CAP-X勉強室、明石ミニコン研究会『I/O』昭和55年 2月号 p.121、工学社
https://archive.org/stream/Io19802/IO_198002#page/n121/mode/2up

アセンブラ言語CAP-Xのマイコン用シュミレータの試作
宮崎 敬
長野工業高等専門学校紀要 / 国立高等専門学校機構長野工業高等専門学校 編
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwjg47-Z1KLcAhXZMN4KHR-MCj4QFjAAegQIARAs&url=https%3A%2F%2Fnagano-nct.repo.nii.ac.jp%2Findex.php%3Faction%3Dpages_view_main%26active_action%3Drepository_action_common_download%26item_id%3D579%26item_no%3D1%26attribute_id%3D22%26file_no%3D1%26page_id%3D13%26block_id%3D28&usg=AOvVaw1jFxoHlrJ5lWNivkBiPtgL

アセンブラ言語CAP-Xのマイコン用シミュレータの試作　宮嵜敬
昭和57年度高等専門学校情報処理教育担当者上級講習会課題研究発表
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=2ahUKEwiMs7uw06LcAhVE7WEKHRI-A78QFjACegQIARA-&url=https%3A%2F%2Fnagano-nct.repo.nii.ac.jp%2Findex.php%3Faction%3Dpages_view_main%26active_action%3Drepository_action_common_download%26item_id%3D579%26item_no%3D1%26attribute_id%3D22%26file_no%3D1%26page_id%3D13%26block_id%3D28&usg=AOvVaw1jFxoHlrJ5lWNivkBiPtgL

 アイ・オー 1980年5月号
CAP-X勉強室 4 明石ミニコン研究会
https://archive.org/details/Io19805

# 文書履歴(document history)
ver. 0.10 初稿 20180716
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
矩形ヴィジュアルでのカット/ヤンクした内容を，挿入/追加

矩形ビジュアルの[挿入][00]や[追加][01]については，色々な箇所で紹介されておりますが，
こちらは，あまり目にすることがなかったので．

つか，まぁそれだけ普通に，特に必要とされることがないものだから．．．，なのでしょうが😏

具体的な例を使いながら進めさせていただこうかと思います．

[00]: https://vim-jp.org/vimdoc-ja/visual.html#v_b_I ":h v_b_I"
[01]: https://vim-jp.org/vimdoc-ja/visual.html#v_b_A ":h v_b_A"

ケース 1: 先頭(左端)へ
------------------------------
こういうシーンがあったとします．

![case1.png](https://qiita-image-store.s3.amazonaws.com/0/13126/13f8eb11-2859-d032-fa41-4263c38984f4.png)

こうなるかと思います．

![-case1.gif](https://qiita-image-store.s3.amazonaws.com/0/13126/448b9a7b-8b6b-d49b-4cf4-46451102a91a.gif)

貼り付けのキーは `P` です．
小文字の `p` ではありません．

また貼り付けの際，置くべきカーソルの位置は，左上端になります．
矩形ヴィジュアルで行頭位置列を指定したくもなりますが．



ケース 2: 途中の任意の箇所へ
------------------------------
次，両端ではなく真ん中です．

![case2.png](https://qiita-image-store.s3.amazonaws.com/0/13126/05901fb5-1f09-8989-35a8-4acd9723b878.png)

こんな感じになるでしょうか．

 ![-case2.gif](https://qiita-image-store.s3.amazonaws.com/0/13126/42cc86e7-3d23-f0b1-5fdc-9cc15f56939a.gif)



ケース 3: 末尾(右端)へ
------------------------------
最後です．

ここではちょっとした問題のある事象を敢えて用意してみたいと思います．

それは，挿入または追加の対象が揃っていない場合です．

![case3.png](https://qiita-image-store.s3.amazonaws.com/0/13126/d60156d2-2310-9625-dd1a-49d578b425e1.png)

### 凸凹問題
上述 2 つのケースも同様の問題を抱えることになると思います．

各アイテムの長さが異なり，行末の位置がそれぞれにバラバラの場合．

貼り付ける前に，
一番長い行の行末位置以上のスペースを埋め，そのうえで貼り付ける，というオペレートになります．

正直，あまりスマートな感じはありません．

自身が分かっていないだけで，もっときちんとした正解があるかもしれません．  
ご存知の方，いらっしゃいましたら．

リソースはこちらになってます．;
» [How do I paste a column of text after a different column of text in Vim? - Stack Overflow][30]

![-case3.gif](https://qiita-image-store.s3.amazonaws.com/0/13126/5d339a97-a860-7378-0a93-621009614045.gif)

[30]: https://stackoverflow.com/questions/9120552/how-do-i-paste-a-column-of-text-after-a-different-column-of-text-in-vim/27542895#27542895 "How do I paste a column of text after a different column of text in Vim? - Stack Overflow"


おわり
------------------------------
きっかけは，今回の例のような感じで，
垂直(Y軸)方向に，それぞれ対応した関係で並ぶ複数の塊があって，それらを，  
水平(X軸)方向に並べたい，という場面に出くわしたことでした．

そして出くわしたシチュエーションに，
いちいちそんなことだけのためにエクセル起ち上げなくとも．．．，と．

状況が限られて，
決して汎用的でも，また応用が利くようなテクニックではありませんが．


参照，参考先としたリソースです．;

»   [How do I paste a column of text after a different column of text in Vim? - Stack Overflow][30]
»   [矩形ビジュアルモードを利用した編集を使いこなす — 名無しのvim使い][40]
»   [:h v_b_I][00]
»   [:h v_b_A][01]
»   [コピペで使える都道府県一覧・県庁所在地一覧 HTMLタグ|Start Point][41]

[40]: http://nanasi.jp/articles/howto/editing/blockwise-operation.html#id7 "矩形ビジュアルモードを利用した編集を使いこなす — 名無しのvim使い"
[41]: https://www.start-point.net/maps/tool/ "https://www.start-point.net/maps/tool/"


おしまいです．
StreamBuilderとDismissibleを使うと A dismissed Dismissible widget is still part of the tree.

FirestoreのデータをStreamBuilderを使ってListViewに表示していました。
ここでアイテムをスワイプで削除できるようにListTileをDismissibleでラップしたところ、スワイプでアイテムを削除する時に以下のエラーが発生するようになってしまいました。

```
A dismissed Dismissible widget is still part of the tree.

Make sure to implement the onDismissed handler and to immediately remove the Dismissible widget from the application once that handler has fired.
```

どうやらスワイプで削除したアイテムのDismissibleウィジェットはスワイプされたらすぐに消せよといっている。
Firestoreのデータを削除するだけでは不十分で`setState`でデータを消してすぐに反映する必要があるっぽい。

StreamBuilderを使ってうまく解決できなかったのでおとなしく`initState`でリッスンし始めて、`setState`でリストのデータを管理するようにしたところエラーは出力されなくなった。
AlibabaCloudのRAMってどんなの？

# はじめに
今回は、AlibabaCloudのRAM(Resource Access Management)に触れます。

# ドキュメントはこちら

[Resource Access Management - クラウドの ID およびアクセス管理サービス | Alibaba Cloud](https://jp.alibabacloud.com/product/ram?spm=a21mg.8156373.907453.dnavproductsj2.730d3625Ztm5Sc)

[RAM の概要 - はじめに| Alibaba Cloud ドキュメントセンター](https://jp.alibabacloud.com/help/doc-detail/28627.htm?spm=a21mg.p38356.b99.2.1d4e124fn4JlWF)

# 基本的なところ
## Alibaba Cloud アカウント
一般的にパブリッククラウドではまずアカウントを作成します。メールアドレスとパスワードで作成します。
これが、Alibaba Cloud アカウントとなります。

次に、クレジットカードを紐づけ従量課金できるようにし
ECSなど使えるようにする状態です。

Alibaba Cloud アカウントは
リソースに対してroot権限を保持してます。

さて、この状態でメールアドレスとパスワードがあれば
悪意ある人だと
インスタンスを起動できるので
高額なインスタンスを起動することもできます。
各所のリージョンですので、 **x17** です。(2018.07時点)

オンプレ環境だとすると
サーバを購入し
DCに入館でき(指紋認証したり、警備からラックの鍵を手渡しされたりなど)
サーバをラックに設置できて稼働できる
のと同等です。
それがリージョンの数 **x17** 分です。

イメージすると、沢山の鍵を持ってる感じですね。
![011ELLY18420_TP_V.jpg](:storage/6000b375-af30-46ad-b9fc-59504963b5e3/14c8bcd3.jpg)

複数のデータセンター(東京、香港など)どこでも入れて
なんでもできるのと同じになります。

Alibaba Cloud アカウントをクラックされると大変なんですが
その対策は、また別の機会にお話しします。

## RAMとは
ここで本題のRAMとは、AlibabaCloudのリソースアクセスに対しコントロールする管理のためのものになります。

なぜ、このような管理が必要なのか？

組織では
インフラエンジニアや
アプリケーション開発エンジニアなど
様々なユーザーがいます。
またシステムやアプリケーションが人ではない使うユーザーというのもあります。

もしDBの調子がおかしくなった場合に
プロジェクトに関わる全ての人たちが
停止や再起動ができるというのは好ましくありません。
アプリケーション開発エンジニアが
DBを操作することは、ほとんどないでしょう。

前述のAlibaba Cloud アカウントを共有し
「これはあなたは触れてはいけません」
なんて運用しても大変です。

## RAMの情報を整理
ドキュメントからRAMの情報を整理して表にしてみます。

|種類|リソースの保持の有無
|固定のIDの有無|ID 認証情報アクセスキーの有無|権限付与の必要|
|:---|:---|:---|:---|:---|
|Alibaba Cloud アカウント|o|x|x|x|
|RAMユーザー|x|o|o|o|
|RAMロール|x|o|x|o|

# まとめ
適切に権限を設定したRAMを使いこなすことで
システムを安全に開発/運用することができます。
セキュリティ上も効果があり、
業務を継続するに非常に重要なものです。
プロジェクトのインポート時に起こる'AppCompatActivity'のエラー解決(備忘録メモ)

####プロジェクトインポート時に起こるビルドエラーの解決方法

<img width="448" alt="Screen Shot 2018-07-16 at 8.23.26 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/121228/4235dede-5741-3213-5aad-89cf810c7fb2.png">

プロジェクトインポート時に、たまにAppCompatActivityが赤文字になってるときがあります。AndroidStudioのビルドツール、Gradleに問題があるようです。
いつも解決方法を忘れてしまうのでメモ。

###解決方法1
**File -> Sync Project with Gradle Files** をクリック。
<img width="289" alt="Screen Shot 2018-07-16 at 8.42.30 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/121228/babd95aa-1385-8c4b-5887-e4172d2d3350.png">


###解決方法2
上記の方法でダメだったら、**build.gradle (Module: app)**を開き、
dependenciesセクション内のサポートライブラリを手動でアップデートする。
<img width="498" alt="Screen Shot 2018-07-16 at 8.43.43 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/121228/53bf8fdc-5490-f499-9fff-7cdbfbc0315f.png">
CからNimの配列を得たい


# 本日は

　[ここで](https://qiita.com/SatoshiTerasaki/items/6f2736006dbb013086ee#%E5%A4%B1%E6%95%97%E4%BE%8B)

でCからNimの配列を得ようとしましたが期待しない値を得てしまう現象が起きたので再トライします。

どうやら配列のメモリを確保した際に要素にアクセス仕方に工夫がいるようです。

[Nimのフォーラム](https://forum.nim-lang.org/t/1188)　で議論されていることを参考にしました。

#　実装

## Nim側
```nim:test.nim

proc test_arr(): pointer {.exportc.} =
  var p = cast[ptr cfloat](alloc0 sizeof(array[3, cfloat]))

  cast[ptr cfloat](cast[ByteAddress](p) +% 0 * sizeof(p[]))[] = -1'f32
  cast[ptr cfloat](cast[ByteAddress](p) +% 1 * sizeof(p[]))[] = -2'f32
  cast[ptr cfloat](cast[ByteAddress](p) +% 2 * sizeof(p[]))[] = -3'f32
  return p
```

`cast[ptr cfloat](cast[ByteAddress](p) +% index * sizeof(p[]))[]` という書き方をするといいみたいです。

## C側

```c:main.c

#include<stdio.h>

extern void* test_arr();

int main(int argc, char const *argv[])
{
    float* a = (float*)test_arr();
    printf("%f\n", a[-1]); //dangerous
    printf("%f\n", a[0]);
    printf("%f\n", a[1]);
    printf("%f\n", a[2]);
    printf("%f\n", a[3]); //dangerous
    return 0;
}
```

## コンパイル

次のような `Makefile` を作成し

```
main: libtest.a
	gcc -o main main.c libtest.a 

libtest.a:test.nim
	nim c --app:staticlib --noMain test.nim 

clean:
	rm -rf nimcache
	rm -f main
	rm *.a
```

さらにターミナルを起動して次を実行します。

```shell-session
$ ls
Makefile	main.c		test.nim
$ make
$ ./main
./main 
0.000000
-1.000000
-2.000000
-3.000000
0.000000
```

一応呼び出しは成功しているみたいです。

#　テンプレートを使う

Nimのコードの方は　`p[index]=value`という直感的な記法でポインタの操作をできるようテンプレートを使うことも出来ます。

```nim:test.nim

#[
Reference:
https://forum.nim-lang.org/t/1188
]#

template ptrMath(body: untyped) =
  template `+`[T](p: ptr T, off: int): ptr T =
    cast[ptr type(p[])](cast[ByteAddress](p) +% off * sizeof(p[]))
  
  template `+=`[T](p: ptr T, off: int) =
    p = p + off
  
  template `-`[T](p: ptr T, off: int): ptr T =
    cast[ptr type(p[])](cast[ByteAddress](p) -% off * sizeof(p[]))
  
  template `-=`[T](p: ptr T, off: int) =
    p = p - off
  
  template `[]`[T](p: ptr T, off: int): T =
    (p + off)[]
  
  template `[]=`[T](p: ptr T, off: int, val: T) =
    (p + off)[] = val
  body


proc test_arr(): pointer {.exportc.} =
  ptrMath:
    var p = cast[ptr cfloat](alloc0 sizeof(array[3, cfloat]))
    var a: array[3, cfloat]
    for i in a.low..a.high:
      a[i] += 1'f32

    p[0] = a[0]-4'f32
    p[1] = a[1]-2'f32
    p[2] = a[2]-3'f32
  return p
```
viを初心者でも使いやすくしてみる

# はじめに
- vimでは上下左右をhjklで動くのが正道です
- しかし、vim初心者としては、カーソルがある環境ならばカーソルで動きたいものです
- また、INSERTモードになったときに、バックスペースも使いたいです
- さらに、「：」でジャンプするには、行番号を表示したいです

# 前提
- NAME="Ubuntu"
- VERSION="16.04.4 LTS (Xenial Xerus)"


# vimの設定ファイルを編集する
```
vi ~/.vimrc
```

- 下記の設定を書き込みます

``` .vimrc
set nocompatible
set backspace=indent,eol,start
set number
```

- 以下、設定の意味を少し説明します

## set nocompatible

- vi互換の動作を無効にするコマンド
- 主に自分にとってはINSERTモード時にもカーソル移動を可能にしてくれるコマンド
- 多くのシステムは、これを設定しなくても、上記の事が出来たりします
- 環境によっては、これをしないとINSERTモードでカーソル入力すると、ABCDと入力してくださいます
- さくらVPSのUbuntu 16.04.4 LTS (Xenial Xerus)はこれが必要でした

## set backspace=indent,eol,start

- indent 字下げをバックスペースで消去可能
- eol 行末をバックスペースで消去可能(行を連結)
- start 挿入の開始点を超えてバックスペースで消去可能

## set number

- 行番号を表示する
- 行番号が表示されていると、「:(行数)」でのジャンプが楽になって幸せ感があります
俺的Angularで開発始める前の設定

久々にAngularで作ろうとしたら、設定することがこまごまあったのでメモ兼ねてまとめ。
環境は以下の通り。

- VSCode 
- angular-cli 6.0.8
- angular:6.0.3

# newするときにスタイルをscssに設定
プロジェクトはangular-cliで作りますが、cssではなくscssで作りたいのでプロジェクト作成時に設定します。

```
ng new プロジェクト名 --style=scss
```

# コードの修正
`ng new`でプロジェクトを作った直後だとなぜか`ng test`と`ng e2e`が通らないので以下の2箇所を修正します。

```js:src/app/app.component.ts/9行目
title = 'app'; // appをプロジェクト名と同じに変更
```

```js:src/app/app.component.spec.ts/19行目
expect(app.title).toEqual('app'); // appをプロジェクト名と同じに変更
```

# .htmlhintrcの作成
angularのテンプレートとしてhtml使っているため、HTMLHint使ってると警告が出ます。
なので、.htmlhintrcをプロジェクト直下に作って部分的に警告を出さないように設定を記述します。

```json:.htmlhintrc
{
    "tagname-lowercase": true,
    "attr-lowercase": false,
    "attr-value-double-quotes": true,
    "doctype-first": false,
    "tag-pair": true,
    "spec-char-escape": true,
    "id-unique": true,
    "src-not-empty": true,
    "attr-no-duplication": true,
    "title-require": true
}
```

angularの属性はlowercaseじゃないものも使うため`"attr-lowercase"`と、
部分的なHTMLのため先頭にDOCTYPE書かないので`"doctype-first"`をfalseにします。

# git-hookの設定
プッシュするときにテストを実行させてからプッシュしたいので、.git/hooks/pre-pushに以下のコマンドを記述します。

```
ng test --watch=false
ng e2e
```

`ng test`のほうは`--watch=false`をつけないとテスト後に処理が終了しません。

# npm shrinkwrap
Angularだからというわけではないですが、勝手にバージョンが変わらないように`npm shrinkwrap`実行して`npm-shrinkwrap.json`を作っておきます。

後はgitlab-ciの設定とかもしたけど、それは別記事でまとめる予定です。

(7/17追記)gitlab-ciの設定についてまとめました。
[https://qiita.com/frost_star/items/efd624d35edd2aef4379](https://qiita.com/frost_star/items/efd624d35edd2aef4379)

# 参考
[angular-cli:Wiki](https://github.com/angular/angular-cli/wiki)
[HTMLHit:wiki](https://github.com/yaniswang/HTMLHint/wiki/Usage)
rails5でacts-as-taggable-onを使う手順

# gemをインストール

```ruby:Gemfile
gem 'acts-as-taggable-on', :git => 'https://github.com/mbleigh/acts-as-taggable-on'
```
```
$ bundle install
```

# タグ用テーブルを作成

```
$ rake acts_as_taggable_on_engine:install:migrations
```

```
$ rails db:migrate
```

# Model

```ruby:app/models/entry.rb
class Entry < ApplicationRecord
  acts_as_taggable_on :job
  acts_as_taggable
end
```

# Controller

```ruby:app/controllers/entries_controller.rb
class EntriesController < ApplicationController
  def entry_params
    params.require(:entry).permit(:job_list)
  end
end
```

# View

```ruby:edit.html.erb
<%= f.radio_button :job_list %>
<%= f.label :job_list %>
```

# タグの一覧を表示する方法


## Model

```ruby:app/models/model.rb
class Book < ApplicationRecord
  acts_as_taggable_on :tag
  acts_as_taggable
end
```


## Controller

```ruby:app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
    @tags = Book.all_tags
  end
end
```

# 共通箇所（サイドナビなど）でタグの一覧を表示する方法

## Controller

```ruby:app/controllers/concerns/common.rb
  def list
    @taglist = ActsAsTaggableOn::Tag.for_context(:tags)
    @categorylist = ActsAsTaggableOn::Tag.for_context(:categories)
  end
```
redirect_toやrenderのオプションではなく、sessionを使いました。

Ruby on rails 

やりたいこと・・・アクション間のデータの受け渡し

インスタンス変数を使えば良いと思って、インスタンス変数@hogeをshowアクションとmy_checkアクションに記述して、my_checkアクション内で、showアクションをredirect_toして、binding.pryで確認したところ、アクション間ではインスタンス変数@hogeはデータを受け渡しできないことがわかりました。
つまり、my_checkアクションでは@hogeにデータが入っているのに、my_checkアクションからredirect_toされたshowアクション内の@hogeを見ると、nilになっていました。

ということで、アクション間でデータを送りたい場合は、sessionを使おうということです。

自分は思い込みで、redirect_toかrenderに引数（オプション）をパラメータとして指定してやれば、アクション間でのデータの受け渡し（共有？）をできると思って、いろいろコードをいじってましたが、駄目でした。
結構悩んだので、ここにメモって置きます。と言っても、１日くらいですが。
誰かの参考になりますかね〜。

サンプルコードはこんな感じです。

```XXXs_controller.rb
def show
  @my_data = session[:my_session]
  //このあと、@my_dataをshow.html.erbで利用する
end

def my_check
  session[:my_session] = 1
  redirect_to controller: 'XXXs', action: 'show'
end
```


以下のサイトを参考にしました。
https://qa.atmarkit.co.jp/q/3159


#追記　セッションを使わなくてもいい
```quizzes_controller.rb
def select
  redirect_to controller: 'quizzes', action: 'show', id: params[:id], 
answered: @answered_quiz_ids
end
```
こんな感じで、selectアクションからshowアクションにパラメータを渡せました。別の書き方をすると、うまくパラメータが渡せなかった。というか、こんなところで、セッションとか使わない方がいいですね、やはり。とりあえず、いろいろ試行錯誤しているということです。
PHP のインストール

# 前提
Wordpress の環境を構築するために php のインストールを行う。
Nginxはインストール済みの状態を想定。

https://qiita.com/silverskyvicto/items/db16512571fe9bbb930c

https://qiita.com/silverskyvicto/items/be332504506bad8daa34

# リポジトリにあるものをインストールする場合 (Ubuntu)
## 手順

1. 次のコマンド
    ```sh
    $ sudo apt install php php-mysql
    ```

# ソースからビルドする場合

CentOS 7 の場合、リポジトリにあるものが古かったため、ソースからビルドのみしてみた。
今回は試しレベルのため、SELinux もあらかじめ無効にして試している。
実環境でインストールする場合には、セキュリティの設定を自環境における適切なものに適宜設定してください。

## 手順

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

    ```bash:CentOS
    # yum -y install libxml2-devel systemd-devel libpng-devel
    ```
    
    ```bash:Ubuntu
    $ sudo apt install build-essential
    $ sudo apt install \
        autoconf \
        re2c \
        bison \
        libsqlite3-dev \
        libpq-dev \
        libonig-dev \
        libfcgi-dev \
        libfcgi0ldbl \
        libjpeg-dev \
        libpng-dev \
        libssl-dev \
        libxml2-dev \
        libcurl4-openssl-dev \
        libxpm-dev \
        libgd-dev \
        libmysqlclient-dev \
        libfreetype6-dev \
        libxslt1-dev \
        libpspell-dev \
        libzip-dev \
        libgccjit-10-dev \
        libsystemd-dev
    ```

2. phpのtar.gzファイルをダウンロードする

    ```
    # curl -LkvOf https://www.php.net/distributions/php-7.4.27.tar.gz
    ```

3. ファイルに破損がないか確認する

    ```
    # sha256sum php-7.4.27.tar.gz
    564fd5bc9850370db0cb4058d9087f2f40177fa4921ce698a375416db9ab43ca  php-7.4.27.tar.gz
     ```

4. Configureとビルドを実行する

    ```
    # tar -zxf php-7.4.27.tar.gz
    # cd php-7.4.27/
    # ./configure --enable-fpm --with-openssl --with-curl --with-mysqli --with-zlib --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-fpm-systemd --enable-mbstring --with-mysql-sock=/var/lib/mysql/mysql.sock
    # make
    # make test
    # make install
    ```

5. 必要な設定ファイルを雛形からコピーする

    ```
    # cp php.ini-production /usr/local/lib/php.ini
    ```

# 参考
- [PHP公式ダウンロードページ](http://php.net/downloads.php)
- [Nginx 1.4.x on Unix systems（古いのであくまで参考程度に）](http://php.net/manual/ja/install.unix.nginx.php)
- [Bug #67588 configure fails to recognize systemd in CentOS 7.0](https://bugs.php.net/bug.php?id=67588)
- [【PHP】7.0.0 ソースからコマンド最短インストール方法](https://blog.77jp.net/php-7-0-0-command-shortest-how-to-install-from-the-source)
- [mysqlのsocketの位置を確認する](https://qiita.com/jiji4000/items/04f41839ec07dc293046)
Chrome 67からJavaScriptのプリミティブ型BigIntが使用可能に

表題の件を知り、調べてみたまとめになります。
間違いなどあればご指摘いただければ幸いです。

# はじめに
BigIntは任意精度の整数型。
TC39(ECMAScriptの策定委員会)で提案中のプロポーザルの一つです。
プロポーザルは0~4の5つのStageがあり、BigIntは現在(2018年7月)Stage3の段階になります。
https://github.com/tc39/proposal-bigint

ChromeやNode.jsで採用されているJavaScriptの実行エンジン「V8」では、
v6.7よりBigIntが実装されています。
https://v8project.blogspot.com/2018/05/v8-release-v67.html
Chrome67〜ではV8 v6.7〜なので、
最新のChromeが入っていればDevToolsのコンソールから簡単に試すことができます。
https://en.wikipedia.org/wiki/Google_Chrome_version_history
Node.js v10.4以降でも使用可能
https://nodejs.org/ja/download/releases/

# 現在のJavaScript
## プリミティブ型
JavaScriptでは以下の6つのプリミティブ型があり、
それ以外はArrayなど含め全てObject型となります。
数値を表す型はnumber型の一つしかありません。

- number
- string
- boolean
- null
- undefined
- Symbol (ECMAScript2015で追加)

*number, string, booleanはそれぞれラッパー型であるNumber,String,Booleanがあり(全てObject型)、区別のためプリミティブ型は小文字で表記します。*

## number型
number型はIEEE754で規定されている倍精度浮動小数点数です。
よって、正確に扱える数値の範囲は、-(2の53乗 - 1) ~ (2の53乗 - 1)となります。

```javascript
// 正確に扱える最大整数値(9_007_199_254_740_991)
const max = Number.MAX_SAFE_INTEGER;

// 1を足すことは可能。　--> 9007199254740992
console.log(max + 1);

// 9007199254740993のはずだが... --> 9007199254740992
console.log(max + 2);

// よって以下はtrueとなる --> true
console.log(max + 1 === max + 2);
```

# BigInt
これまでnumber型範囲以上の数値を扱うにはサードパーティのライブラリを用いる必要がありましたが、
今後BigIntが広く使用可能となれば、ビルトインオブジェクトの範囲で対応可能となります。
下記記事内の画像では、パフォーマンスも向上されることが確認できます。
https://developers.google.com/web/updates/2018/05/bigint
(ただし、Stage3なので却下される可能性はあり)

## 使用方法
- リテラルは数値の後ろにnを付与
- グローバル関数BigInt()で、number型(またはstring型) -> BigInt型の変換

```javascript
// --> 9007199254740993n
console.log(BigInt(Number.MAX_SAFE_INTEGER) + 2n);
console.log(BigInt("9007199254740991") + 2n);

// 2,8,16進数表記のリテラルも可能 --> 4n, 64n, 256n
console.log(0b100n);
console.log(0o100n);
console.log(0x100n);

// ただし小数はBigIntで表現できないのでエラー
// エラー(RangeError)
console.log(BigInt(2.5));
// エラー(SyntaxError)
console.log(BigInt("2.5"));

// プリミティブ型なのでtypeof演算子にも対応 --> "bigint"
console.log(typeof 2n);
```

- 演算子 + - * **は想定通りに働く
- 演算子 / % は0へ丸められる場合がある

```javascript

// number型の場合 --> 2.5
console.log(10 / 4);
// BigInt型の場合 --> 2n
console.log(10n / 4n);
``` 

- BigIntとnumber型の演算は基本的にエラー
- 例外として比較演算子はエラーとならない
- 緩い比較演算子や不等号では片方の型に変換されて評価される
- 0nはnumber型の0同様にfalseと評価される

```javascript
// エラー(TypeError)
console.log(2n + 2);

// --> false
console.log(2n === 2);
// --> true
console.log(2n == 2);
// --> true
console.log(3n >= 2);

// --> "0n evaluates to false"
if (0n) {
  console.log("0n evaluates to true");
} else {
  console.log("0n evaluates to false");
}
```

## その他API
以下のAPIで、BigIntを任意のビット範囲に絞ったリ、64ビットの配列を作成可能。
(いまいち用途を分かっていないです…)

- BigInt.asIntN(width, value)
- BigInt.asUintN(width, value)
- BigInt64Array(size) (コンストラクタ)
- BigUInt64Array(size) (コンストラクタ)

```javascript
// 符号付６４bit整数の最大値(9_223_372_036_854_775_807)
const max = 2n ** (64n - 1n) - 1n;

const v = BigInt.asIntN(64, max + 1n);
// オーバフローして負の値に --> -9223372036854775808n
console.log(v);

// [0n, 0n, 0n, 0n]
const array = new BigInt64Array(4);
array[0] = max + 1n;
// オーバフローして負の値に --> -9223372036854775808n
console.log(array[0]);
```

# 引用元
- https://developers.google.com/web/updates/2018/05/bigint
[C++] 競プロで面倒なコンパイルコマンド入力をzshのSuffix Aliasesでいい感じにする

C++のプログラムのコンパイルは以下のようなコマンドで行いますが、速度が求められる競技プログラミングではタイピングの時間がもったいなく感じます。

```sh
$ g++ -o hoge hoge.cpp
```
C++14とデバッグのオプションをつけると、こんなに長くなってします。

```sh
$ g++ -std=c++14 -g -O0 -o hoge hoge.cpp
```
私はコンテスト開始前に上記のコマンドを入力しておき、シェルの履歴を利用して時間短縮をしていたのですが~~(アホくさ)~~、zshのSuffix Aliasesという素晴らしい機能でそれが改善できたので、記事にしました。

# 環境
macOS 10.13.5
zsh 5.5.1

# zshとは
シェルの一つです。強力な補完やワイルドカードを利用したファイルの指定、コマンド修正など便利な機能が盛りだくさんです。私は最近使い始めたのですが、大変満足しています。

# Suffix Aliasesとは
Suffix Aliasesはzshの便利な機能の一つです。ファイルの拡張子に関連したエイリアスを作成し、ファイル名を打ち込むだけでそのエイリアスを実行することができるようになります。
例えば、`hoge.py`を実行するときは

```sh
$ python hoge.py
```
と実行すると思いますが、Suffix Aliasesでファイル名だけで実行できます。

```sh
$ alias -s py=python # エイリアスの作成
$ hoge.py            # python hoge.pyと同じ
```

# やりたいこと
Suffix Aliasesを使ってC++のプログラムのコンパイルとプログラムの実行を

```sh
$ hoge.cpp
```
で自動で行えるようにします。プログラムの実行だけをしたい時にコンパイルをすることは無駄なので、ファイルの更新日時を見て、コンパイルが必要か判断することにします。以下のフローに詳細を示します。


![flow.png](https://qiita-image-store.s3.amazonaws.com/0/152199/ce8b1ec7-1a41-c40e-ef9d-79fa360af2b0.png)

# シェルスクリプトを書く
`~/.zshrc`に以下を追加します

```sh:~./zshrc
function with_echo() {
  echo $@
  $@
}

function cpp_compile() {
  with_echo g++ -std=c++14 -g -O0 -o $1 $2
}

function cpp_run() {
  cpp_file=$1
  exe_file=${cpp_file:0:-4}
  shift

  if [ -s $cpp_file ]; then
    if [ ! -f $exe_file ]; then
      cpp_compile $exe_file $cpp_file && ./$exe_file $@
    else
      cpp_date=`date -r $cpp_file +%s`
      exe_date=`date -r $exe_file +%s`
      if [ $cpp_date -gt $exe_date ]; then
        cpp_compile $exe_file $cpp_file && ./$exe_file $@
      else
        ./$exe_file $@
      fi
    fi
  else
    echo $cpp_file is empty
  fi
}

alias -s cpp=cpp_run
```

## with_echo()
`echo`で実行するコマンドを出力してから、コマンドを実行します。

## cpp_compile()
C++14とデバッグのオプションをつけてg++でコンパイルをします。`with_echo()`でコンパイルが行われたことを示します。

## cpp_run()
`$1`でコンパイル対象のファイル名を取得し、`${cpp_file:0:-4}`で実行ファイル名を作成します。また、`if [ -s $cpp_file ]`、`if [ ! -f $exe_file ]`、`if [ $cpp_date -gt $exe_date ]`がフローチャートの分岐に対応しています。
`cpp_date`と`exe_date`は、C++のプログラムファイルと実行ファイルの更新日時のUNIX時間を変数に入れたもので

```sh
date -r $file_name +%s
```
で取得することができます。

```sh
cpp_compile $exe_file $cpp_file && ./$exe_file $@
```
`shift`で引数を一つずらすことで`$@`で必要なコマンドライン引数を全取得できるようにし、`&&`でコンパイルが成功した場合のみプログラムをそのまま実行するようにします。

# 結果
![result.png](https://qiita-image-store.s3.amazonaws.com/0/152199/50c8b1f0-4e8d-84bc-251a-803f542b7708.png)

最高ですね！！！！！

# おわりに
プログラムのコンパイルと実行が`$ hoge.cpp`だけで済むようになったので、めっちゃ捗ってます。皆さんもこの方法で一秒でも早くプログラムを提出しちゃってください！
【記録】Unity 2Dでゲームを作る 03[TilemapとMouse座標軸の連動]

#目的
Mouseでクリックしたワールド座標と
Gridで管理されているTilemapのワールド座標から
クリックされたTileの位置を特定したい。

#クリックした座標と連動
##手段
###Mouse側
```
        // Vector3でマウス位置座標を取得する
        position = Input.mousePosition;
        // Z軸修正
        position.z = 10f;
        // マウス位置座標をスクリーン座標からワールド座標に変換する
        screenToWorldPointPosition = Camera.main.ScreenToWorldPoint(position);
        //tilemapに座標情報を渡す
        Tilemap.clickedPosition(screenToWorldPointPosition);
```
こんな感じでポインターの位置を特定

###Tilemap側
```
    public void clickedPosition(Vector3 position) {
        Vector3Int clickPosition =  Tilemap.WorldToCell(position);
        Tilemap.SetTile(clickPosition, testTile);
    }
```
tilemapの[ref: WorldToCell](https://docs.unity3d.com/ScriptReference/GridLayout.WorldToCell.html)関数を使ってワールド座標からセルの特定

##結果
![06.gif](https://qiita-image-store.s3.amazonaws.com/0/270036/64c75376-d938-269b-6571-c443b16756a0.gif)
今回はクリックしたタイルをそのままテスト用のタイルに変換するようにした

#タイル表示がすいつくように
~作成中~
macで不審なポートが開いていた件(rapportd)

この間、何気なしに`nmap`でmacのlocalhostを検索してみると、ひどい結果が待ち受けていました。

```console
$ nmap localhost
PORT      STATE SERVICE
111/tcp   open  rpcbind
631/tcp   open  ipp
1021/tcp  open  exp1
1023/tcp  open  netvenuechat
2049/tcp  open  nfs
49163/tcp open  unknown
```

正直、開けたことがあるような、ないようなポートがいっぱいです。特に、最後の`49163`なんてポートは絶対に自分では開けた覚えがありません。

とすると、バックドアでも仕掛けられていたのだろうかと心配になり、色々と調べてみることになりました。

結果的には、`1021, 1023`あたりのポートは`nfsd`でした。特定のリポジトリを共有してたことがあったような、なかったような...。

とりあえずディレクトリ自体は既に削除していたので、無効にすることにします。

```console
$ sudo nfsd checkexports
$ sudo vim /etc/exports
$ sudo nfsd stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.nfsd.plist
```

その他、色々とやりまして、大方のポートは閉じられたのですが、残ったのはやはり、`49163`でした。(なお、このポートを利用するアプリは再起動と同時に開けるポートを変動させるようです)

追記:コメントを参照して、適切に処理してください。どうやら問題なく使用されるポートであることのほうが多いみたい。

```console
$ nmap localhost
49163/tcp open  unknown

# root権限で開いてるポートは別です。ユーザーとは別に閉じなければいけません。
$ sudo nmap localhost
49163/tcp open  unknown
```

詳しく調べてみると、そのポートはアップルが署名した特定のコマンドから実行されているようでした。


```console
$ sudo lsof -i tcp:49163
rapportd 402 syui    3u  xxxx      TCP *:49158 (LISTEN)

$ codesign -dv --verbose=4 /usr/libexec/rapportd
$ otool -L /usr/libexec/rapportd

# 一応、当該proccesをkillしておくことに
$ lsof -p 402
$ kill -KILL 402
or 
$ launchctl list | grep 402
$ launchctl stop com.apple.rapportd
```

次に、自動起動されているrapportdを停止させるコマンドを実行します。

```console:rootで実行されているrapportdを停止
$ cd /System/Library/LaunchDaemons
$ grep -R rapportd .
	Binary file ./com.apple.jetsamproperties.Mac.plist matches
	Binary file ./com.apple.rapportd.plist matches

$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.jetsamproperties.Mac.plist

$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.rapportd.plist
    error:Operation not permitted while System Integrity Protection is engaged
```

ここで、問題が発生します。どうやらmacは`/System/`以下の変更を一部で制限しているみたいで、リカバリモードから特定のコマンドを実行して制限を解除しなければならないようです。これは、セキュリティの設定なので、変更した後は戻してほうが良いかもしれません。コンピュータウィルスに重要なディレクトリを変更されやすくなってしまう危険があるためです。

このセキュリティ制限解除の手順は以下の通り。

	1. Command+Rを押しながらMACを再起動でリカバリーモード起動
	2. トップメニューから「ユーティリティー>ターミナル」と選んでターミナルを起動
	3. csrutil disableというコマンドを実行

さて、これで、　

```console
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.rapportd.plist
```

が通るようになります。

```console
$ sudo nmap localhost
...
```

確かめてみるとrapportdが開けていたポートが閉じられているようです。

ただし、まだユーザー権限で実行されているものがあるみたいなので、そちらのplistもunloadします。`/System/Library/LaunchAgents/com.apple.rapportd-user.plist`にあります。

```console
$ nmap localhost
49163/tcp open  unknown
 
$ launchctl unload -w /System/Library/LaunchAgents/com.apple.rapportd-user.plist
$ launchctl stop com.apple.rapportd

$ nmap localhost
...

# root,userともに開いてるポートは無くなりました。よかった。
```

ちなみに、詳細に調べる時は`open -a Network\ Utility.app`を実行して、`portscan`しましょう。

追記:

`BetterTou`がポートを開けてたので、macのfirewallでブロックしときました。多分、updateとかで必要になるかもしれませんけど、その時はその時です。

追記2:

久しぶりにportscanしてみました。以下のportが開いてました。必要ないアプリの場合は、disableしたほうがいいかもしれませんね。

```sh
Open TCP Port: 	xxx, keybase
Open TCP Port: 	xxx, kbfs
Open TCP Port: 	xxx, Dropbox
Open TCP Port: 	xxx, Dropbox

$ sudo lsof -i tcp:xxx
```

`kbfs`はKeybaseが使っているPortです。

### 追記


現在は、ポートを全部閉じることに成功して、結果は何も表示されないというOKの状態になりました。
CircleCI2.0にSSH


## やりたいこと

- CircleCIのコンテナにSSHログインしてデバックしたい

## 準備



### GithubにSSHキーを登録

以下などを参考に設定してください

- [gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
- [ssh agentをパスフレーズ省略に応用する方法まとめ](https://qiita.com/onokatio/items/397a5899a0ec16c7e60a)


### テストをRerun

一度失敗すると右上にRerun Job with SSHのボタンがでるので押す

<img width="1422" alt="CircleCI.png" src="https://qiita-image-store.s3.amazonaws.com/0/81805/b3863504-2489-e72b-2800-543e46aab60e.png">

Rerunも失敗すると、

```
You can now SSH into this box if your SSH public key is added:
    $ ssh -p 64537 35.172.20.99

Use the same SSH public key that you use for your VCS-provider (e.g., GitHub).

RSA key fingerprint of the host is
  SHA256:Ckcz2qtZrgzUQL9GbFDK+VTsUs2fFM4P7xxxxxxxxxxx
  MD5:4f:49:ca:ba:fd:13:d5:c2:25:e4:6a:01:xx:xx:xx:xx

This box will stay up for 2h0m0s, or until 10m0s passes without an active SSH session.
```

と表示が出るので、IPアドレスとポート番号を確認し、Githubに登録したSSHキーを使って

```
$ ssh -i .ssh/id_rsa -p 64543 ubuntu@35.172.20.99
circleci@8af0c1c68e5a:~$
```

でコンテナにログインできます。
macbookで開発しててストレージ容量がやばい人はLibrary/Developer以下を掃除しよう

ストレージをあまりつかっている意識がないのに、ストレージ容量があと少しです、と怒られる、、
調べてみたら、システムってとこで80GBくらい使ってる（！！）

[macのストレージでシステムの容量が大きすぎる時の対処法]
(https://www.kawabatamasami.com/entry/2017/08/25/111030)

これを試してみたが変化がない、かつXcode使って開発してるひとは試してみるといいかも。
~/Library/Developer/Xcode/iOS DeviceSupport/
までいって、左クリック＞「情報を見る」
ここから容量を確認し、70GBくらいあればビンゴ。ここが原因だ。
ログや、キャッシュや、シミュレータの情報などを必要最低限にして削除しよう！
(実際あまり使わないし、、)

[[Xcode 8.2] 年末なので Xcode まわりの不要ファイルを一掃してみた](https://dev.classmethod.jp/smartphone/remove-xcode8-related-unnecessary-files/)
こちらの方の記事を読んで、安全に行いましょー。
VisualStudioCodeでpythonアプリのdebugを行えるようにしたり、ターミナルでUbuntuのアプリを使えるようにしてみた。

## VisualStudioCodeがあつい

OSCに行ってVSCodeの便利な使い方を教えてもらったので早速適用してみた。

### まずはDebugを行えるようにする

ほぼ下記リンクの通り。
https://beachside.hatenablog.com/entry/2016/08/17/004500

追加でPython Extension Packも入れてみた。

なお、Flaskでアプリを作成したときにlaunch.jsonで指定を変えるとDebugの名前や起動するファイル名を変えることもできた。

```
        {
            "name": "DebugForMyFlaskApp",
            "type": "pythonExperimental",
            "request": "launch",
            "module": "flask",
            "env": {
                "FLASK_APP": "run.py"
            },
            "args": [
                "run",
                "--no-debugger",
                "--no-reload"
            ],
            "jinja": true
        }
```

### 次にターミナルにUbuntuアプリを指定する

ほぼ下記リンクの通り。
https://qiita.com/m_zuma/items/6b2ee25001109a6506c4

Ubuntu18.04を入れていたのでexeファイルがubuntu1804.exeだったくらい。


Gitは標準で対応しているし、クラウドサービス(Azure)との連携やDockerHubとの連携、ペアプログラミングもなんでもござれのVSCode使いこなせるようになりたい。
便利なサービスの使い方がわかったら適宜、追記していきます。
Error: read ECONNRESET  ionic3で出たエラー

```
events.js:167
      throw er; // Unhandled 'error' event
Error: read ECONNRESET
    at TCP.onread (net.js:656:25)
```
久々に動かしたionicプロジェクトで謎のエラーがでたので解消法

```
npm install @ionic/app-scripts@3.1.6 --save-dev
```
app-scriptsを更新したら直った wsのバグ？

詳しくは
https://forum.ionicframework.com/t/ionic-serve-crash-on-save/115615/56
へ
CSSでhoverでafter要素で文字を表示するとプルプルする件

# 背景
悩んでしまったのでここの記しておきます。
それは今さっき…`transform`の動きを確認しようとしたときでした。

変化済みの見ても分かりづらいのでhoverしたら設定内容と設定更新をアニメーションでやろうと思ったら…

```
プルプルプル…
プルプルプル…
```
↓
![名称未設定.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/89227/6f9febe4-573a-a705-bf03-dc2f7eb4ecb7.gif)

怖いですねぇ…

# 解決
困ったときの`overflow: hidden;`を入れると治るようです。

```css
.b{
  display:inline-block;
  transform:rotateZ(0deg) rotateX(0deg) rotateY(0deg); 
  background-color:#aaa;  
  overflow: hidden;/*ここに追加です…*/
  margin:2px 5px;
  height:100px;
  width:100px;
  transition: all 500ms 0s ease;
  font-size:5px;/*はみ出ると消えちゃうので文字サイズを調整ください*/
}
.b1:hover{transform:rotateZ(0deg) rotateX(0deg) rotateY(0deg); }
.b1:after{content  :"rotateZ(0deg) rotateX(0deg) rotateY(0deg);";}

.b2:hover{transform:rotateZ(45deg) rotateX(0deg) rotateY(0deg); }
.b2:after{content  :"rotateZ(45deg) rotateX(0deg) rotateY(0deg);";}
```


# コード
## 解決前

<p data-height="265" data-theme-id="0" data-slug-hash="jpEgKZ" data-default-tab="css,result" data-user="hashito" data-embed-version="2" data-pen-title="test test" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/jpEgKZ/">test test</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## 解決後

<p data-height="265" data-theme-id="0" data-slug-hash="rrxzdY" data-default-tab="css,result" data-user="hashito" data-embed-version="2" data-pen-title="test test3" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/rrxzdY/">test test3</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 解決してないよ！！！
現象としては解決をみたのですが。
原因がわかっていません。。。。

なぜなら`overflow: hidden;`は**内部の要素が外側の要素への与える影響を抑える効果**があることを利用しているだけなのです。。。。
だいたい、親要素で問題が有り子要素を消すと解決できる問題はこれで解決できるのですが…


## 他の解決策
自分は他にも解決策を見つけました。
下記のようなものを入れること

```css
line-height:100px;
font-size:100px;
```

<p data-height="265" data-theme-id="0" data-slug-hash="NBxvwx" data-default-tab="css,result" data-user="hashito" data-embed-version="2" data-pen-title="test test2" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/NBxvwx/">test test2</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

これを入れると糞のように文字でっかくなるけど消えます。
*(ただし、隣の要素がずれますが…）*

そもそも`line-height`とか`font-size`の問題であれば**逆に０pxにした場合に解決**すると思ってたのですが…

申し訳ありませんが分かる方教えていただければ助かります。
無知で申し訳ありません…

#関連する記事

[・CSSのtransform:rotate各種動き](https://qiita.com/hashito/items/dcd5f98e3a123b6eec9b)
JSONを扱う時におすすめのツール

JSONを扱うときに個人的に利用しているツール

## エディタ
### Atom
https://atom.io/

TEXTのタイプにJSONを選択して、構成を確認しながらJSONを組み立てられる


## Chrome Extension (拡張)
### JSONView
[Chrome ウェブストア - JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc) 

ブラウザでJSONを表示した際に自動で整形してくれる

## コマンドライン
### jq
https://stedolan.github.io/jq/

`apt-get install jq`

標準出力でのJSONの整形などに利用できる
スプレッドシートで複数の出力を表示したい時はqueryを使おう

こんにちは。フランス優勝しましたね。

ところでみなさんは、スプレッドシート使ってて、
「vlookupで出力が複数あるのに、先頭の1件しか表示されないよーふぇぇ」
ってなったことはないでしょうか？

はい、query使って、select文使いましょう。


```sql:hoge
=QUERY(A:B, "select A where B = hoge")
```

とやると、A~B列でBの値がhogeの行のAの値が複数あれば各セルに入力されます。

複数出力したい問題は、excel系あるあるだと思うので、スプレッドシートならばqueryが使えるのが嬉しいですね。