OmniAICreator/Qiita-1.07M huggingface dataset:
Ansible初心者（私）がつまずいたポイントをできる限り列挙する

【自己紹介】
エンジニアになって半年ほど経ちました。
この半年間、ネットワーク、Ansible、pythonを中心に勉強しており、CCNAとAnsibleスペシャリスト認定試験は合格できたので最近はひたすらpythonでansibleの自作モジュール（主にcisco機器を扱うためのモジュール）開発に取り組んでいるところです。
目指せ、脱初心者！

【本題】
今回アドベントカレンダーに参加させて頂くにあたり、テーマが、好きなmoduleの紹介や使い方のtips、となっていたのでエンジニアになりたての私にはまだ高度な内容が思いつかないまま担当の日を迎えてしまいました。
どうしても記事に起こすほどのレベルの話題が見つからなかったので、今回はひたすらつまずいた点や失敗したことを列挙していこうと思います。
あまり新しい発見はご提供できないかもしれません（申し訳ない）。

①copyモジュールはリモートホストとローカルホストでどちらのfact変数を使うのか？

例えば、以下のような場合に、生成されるファイルの中身はリモートホストとローカルホストでどちらの方のfacts変数が使われるのでしょうか。

```test.yml
- host: hogehoge
  gather_facts: yes

  tasks:
    - name: write gather_fact file
      copy:
        content: "{{ ansible_hostname }}"
        dest: ~/gather_test.txt
        force: no
```

答えとしては、リモートホスト側のホスト名がファイルに記入されるようです。

上記のようなファイルをリモート側に生成したい場合、lineinfileとcopyモジュールのどちらを使うべきか迷ったのがきっかけでこの疑問が湧きました。copyモジュールはローカル側にあるファイルなどをリモートにコピーしたい時に使われるのでlineinfileの方が用途としては合っているのではと思いましたが、新しいファイルを作る際、copyモジュールの方でもlineinfileと同じ結果を得られるようです。

ちなみに私はcopyモジュールを使うときはほぼ習慣的にforce: noを設定しています。
こうしておけば、ファイルが既に存在していても知らないうちに置き換わってしまうリスクを無くす事ができるからです。

②playbookのループってどんな動きをするの

```test2.yml
- hosts: hogehoge
  
  tasks:
    - name: create users
      user:
        name: 
          - ansible
          - redhat
          - ibm
        groups:
          - ansible_friends
          
```

出力結果

```
・・・省略
Cannot create user "['ansible', 'redhat', 'ibm']"
```
リストひとかたまりをユーザー名として扱ってしまうようです。

なので、

```test2.yml
- hosts: hogehoge
  
  tasks:
    - name: create users
      user:
        name: "{{ item }}"
        groups:
          - ansible_friends
        with_items:
          - ansible
          - redhat
          - ibm
```
ユーザーを作成する時は必ずループで回しましょう。

③commandモジュールとshellモジュールの違い

```test3.yml
- hosts: hogehoge
  
  tasks:
    - name: output file from shell module
      shell: cat ~/username/; cat test file.txt
    
    - name: output file from command module
      command: cd ~/username/; cat test file.txt
```
上記のplaybookの場合、output file from shell moduleのタスクは成功しますが
output file from command moduleのタスクは失敗します。
shellモジュールは環境変数が使えるところがcommandモジュールとの違いとAnsible公式マニュアルには書いてありましたが、エンジニアなりたてだったので最初は意味がわかりませんでした。
;の他にも、シェルでコマンドを打つときに使う><や|などはcommandモジュールでは使えません。

【最後に】
私が好きなモジュールはuntilです。
このモジュールはプレイブックの実行ログに意図した文字列が出てくるまでひたすら待機し、出てきたら次のタスクに移る、という使い方ができます。
こういったモジュールを駆使していく事で人間がわざわざ常時監視する必要が無くなるので、いわゆる「働き方改革」につながると思っています。
これで、夜間作業なども近い将来やらなくて良いようになるといいですね。起きたら全てのタスクが全自動で終わっている世界の実現。ええ。自社だけでもまずは実現して見せますよ(⁎⁍̴̆Ɛ⁍̴̆⁎)


以上です。
また苦労したことが出てきたら随時更新していこうと思います。

また、アドベントカレンダー以外にも自作モジュールを作る際のTipsなども投稿していこうと思います。
docker volumeの共有で Permission deniedが発生する centos7

## 事象
・ホストとコンテナ間でvolumeをマウントした箇所にアクセスするとPermission deniedでアクセスできなくなる


## 確認
・SELinuxが有効になっているため発生するらしい。

```
[root@localhost env]# getenforce
Enforcing
```

## 対処

```
[root@localhost env]# setenforce 0
[root@localhost env]# getenforce
Permissive

```
##再起動後も有効にするには
* /etc/sysconfig/selinuxを編集する

```
SELINUX=disabled   : 無効にする
SELINUX=Enforcing  : SELinuxパーミッションのチェックを行い、アクセスを拒否する
SELINUX=Permissive : SELinuxパーミッションのチェックはするが実際にアクセスの拒否はしない
```
データベースの「ロック」という概念は2種類ある

　ロックって何だっけ、ということで整理しようと思ったので書いていきます。「ｼﾞｬｶｼﾞｬｰｰｰﾝ！」のあれではなく、データベースにおけるロックですね。雑魚エンジニアによる記事なので、修正等見つけたら是非コメントください。

### ロックには２種類の概念がある
　データベースには<b>「共有・占有ロック」と「楽観的・悲観的ロック」</b>という２種類の異なる次元の概念があります。前者はデータベースの行や表に対するアクセス制御をする「機能」的なもので、後者はどうやってロックをするかという「方針」的なものになります。

### 共有・占有ロックについて
　READロックとかWRITEロックとか言われることもあります。考え方としては、これからREADするからデータは弄るなよーって時に掛けるのが共有ロック（READロック）、これからWRITEするから見るのも許さんぞーってのが占有ロック（WRITEロック）です。

<b>共有ロックを掛けると、「自他共にREADは出来るが、WRITEが出来ない」という状態になります。占有ロックを掛けると、「自分はREAD・WRITEできるけど、他からはどちらも出来ない」という状態になります。</b>

恐怖のデッドロックを起こしてしまう直接的原因となるのがこちらの概念ですね。共有ロック同士でデッドロックが起きることはありませんが、共有・占有 or 占有・占有パターンで発生する可能性があります。SELECT文と他のDML分とでロックが起きるパターンというのは、SELECT文でも共有・占有ロックを掛けることがあるからです。

### 楽観的・悲観的ロックについて
　僕の場合はこちらをきちんと理解していませんでした。[「排他制御（楽観ロック・悲観ロック）の基礎」](https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc)という記事がすごくわかりやすかったです。簡単に言うと、<b>「①データの確認(SELECT) → ②データの更新(UPDATE)」というフローがあるときに、①の時点でロックを掛ける場合を悲観的ロック、掛けない場合は楽観的ロックということになります（UPDATEの直前にはもちろんロックが掛かります。）。</b>

楽観的ロックをする場合にはレコード単位のバージョン管理を行う必要があります。つまりテーブルにSEQUENCEとかVERSIONとかいう数値の列項目を持たせるということです。レコードを更新するたびにバージョン管理の項目値を+1していくことで、SELECTとUPDATEの間に、他の人がレコードを更新したか否かを判定することが出来るという仕組みです。

そして、悲観的ロックをする場合にはSELECT ... FOR UPDATE のようなクエリを投げます。このクエリを投げた時点で、対象の範囲に共有ロックが掛かり、他から更新することが出来なくなります。逆に言えば、トランザクションを解除するまではずっとロックがかかるので、タイムアウトを設定しておかないと、ずっと処理が止まったまま、なんてことも発生する可能性が出てきます。

### 楽観的ロックと悲観的ロックの使い分け
- 悲観的ロックの場合
　複数人が同じレコードを同時に更新する可能性が高く、一回の更新件数が少なく、処理が速い場合に使用されるようです。銀行のオンラインシステムなどによく使われるとのこと。ただし、何らかの理由で広い範囲を長時間ロックしてしまうと、他の処理も固まってしまうので、注意が必要ですね。

- 楽観的ロックの場合
　SELECT文を発行してから実際の更新までに時間が掛かり、複数人が同時に更新する可能性が高くない場合に使うようです。マスタ更新でよく使われるようですね。SELECT FOR UPDATEを発行すると共有ロックが掛かります。もし同じプログラムからSELECT FOR UPDATEを発行すると、ロック待ちが発生してしまいます。これがフローとして、「①データ確認（SELECT FOR UPDATE）→ 画面操作 → 更新(UPDATE)」だとすると、タイムアウトの時間が設定されていなければ、画面操作が終わるまで待たされることになります。だから更新の直前までロックを掛けない楽観的ロックという方法をとるわけですね。私が昔やっていた販売管理のシステムもほとんどが楽観的ロックで実装されていたように思います。

とはいえ、一概に言えず、その時の用途に応じて使い分けが必要だと思われます。
includesでN + 1クエリ問題を対処する

##はじめに
先日、初めてN + 1クエリ問題に遭遇したため、その対処方法を記録します。
そもそも、N + 1クエリ問題とは？
...モデル同士が関連づけられているときに、レコードを全件取得しようとすると、SQLの発行回数が増えてしまい、動作が重くなる問題。
と認識している。間違っていたらごめんなさい。

##N + 1クエリ問題が発生する実際の例
例えば、以下のような３つのモデルがあるとする。

```ruby:product.rb
has_many :product_properties
has_many :properties, through: :product_properties
```
```ruby:property.rb
has_many :product_properties
has_many :products, through: :product_properties
```
```ruby:product_property.rb
belongs_to :product
belongs_to :property
```

コントローラー側では、親であるProductをidから検索し、取得する。
```ruby:product_controller.rb
  def show
    @product = Product.find(params[:id])
  end
```

viewでは、関連先のデータを表示する。

```ruby:show.html.erb
  <% @product.product_properties.each do |property| %>
    <%= #{property.value} %>
  <% end %>
```

このとき、N+1クエリ問題が発生している。

##対処方法
コントローラを次のように変更する。

```ruby:product_controller.rb
  def show
    @product = Spree::Product.includes(product_properties: :property).find(params[:id])
  end
```

こうすると、テーブルが結合されてSQLの発行回数が減る。
SpringのDIについて②

##この記事の目的
[SpringのDIについて①](https://qiita.com/haseesah/items/59d948c0ffa84ec852f7)
の続きです

##この記事の範囲
Configurationについてを主に扱う

###Configurationとは？
 **Bean定義ファイル**

###機能
- DIコンテナに対し、【どのインスタンス】【どの初期値】で渡すかを定義してくれる、BeanとDIコンテナの橋渡し役になる
- ORMにおけるマッピングファイルに近いかもしれない
- DIの基本的な機能である【オブジェクトの情報を外部に持つ】というものの【外部】そのものと言える
- オブジェクトの状態をソースコード中にバラバラに置くのではなく、こういったファイルにまとめて置くことでメンテナンスが簡単になる

![Configurationの概略.jpg](https://qiita-image-store.s3.amazonaws.com/0/292905/3b2a2ee0-2307-ef33-de7e-cb010284a422.jpeg)

###種類
- Javaのクラスで持つか、XMLファイルで持つか、またそれら二つにアノテーションを組み合わせたものの4種類がある

**JavaベースConfiguration**

```Java:JavaConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HogeConfig {
	@Bean
	HogeService hogeService() {
		return new HogeService():
	}
	
	@Bean
	AAABean aAABean() {
		return new AAABean(hogeService());
	}
	
	@Bean(name = "bBean")
	BBBBean bBBBean() {
		return new bBBBean();
	}
}
```
- Configurationクラスには@Configurationアノテーションを明示的に付与する
- 複数アノテーションを付与することもできる
- 各メソッドに引数を追加することで、他のBeanを参照できる
- 明示的にBean名を定義することもできる(name = "hoge")DIコンテナからインスタンスをgetBeanする際に試用する

**XMLベースConfiguration**

```XML:xmlConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http;//www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="hogeService" class="jp.co.hogeProgram.HogeService" />
    
    <bean id="aAABean" class="jp.co.hogeProgram.AAABean">
        <constructor-arg ref="hogeService"/>
    </bean>

    <bean id="bBean" class="jp.co.hogeProgram.BBBBean>
        <constructor-arg value="aaa"/>
    </bean>
</beans>
```

- bean要素内でBeanを定義する
- constoructor-argで他のBeanやスカラ値を渡すこともできる


以上二つはそれぞれBeanの数だけ定義を書かなくてはいけない為、手間がかかるため、次のアノテーションベースを組み合わせてDIを行うのが一般的である

**アノテーションベースConfiguration**

Bean

```Java:Hoge.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Hoge {
	
	オートワイヤリング
	このアノテーションの記述によりFugaServiceをDIコンテナから自動的にBeanを取ってくる
	@Autowired
	public Hoge(FugaService fuga);
	
	処理を記述
}
```
Configクラス(xmlは省略)
この場合はjp.co.hoge以下のクラスを探す

```Java:AppCongig.java
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("jp.co.hoge")
public class AppConfig {

}
```

- 「コンポーネントスキャン」により@Componentアノテーションが付与されたクラスを自動的にDIコンテナに設定することが出来る。これを「オートワイヤリング」という

- アノテーションは@Componentだけでなく、@Serviceなどクラスの役割によって複数存在するが、基本的に@Componentと同様である

- コンポーネントスキャンを有効にするには、ConfigクラスorXMLに@ComponentScan("パッケージ")、もしくはcontext:component-scan要素にパッケージを記載するとパッケージ配下に存在するアノテーションを付与されているクラスを探す

- スキャン範囲のパッケージが広い程時間がかかるので、適切な範囲を設定する必要がある


##次回予告
Beanの紐づけについてやる予定です
現実に馴染むAR表現を考えてみた。

この記事は[AR Advent Calendar 2018](https://adventar.org/calendars/2956#list-2018-12-14)の13日目の記事です。
# はじめに
はじめまして。[ENDROLL](https://endroll.me/)というARスタートアップで3Dデザイナーとして働いているSomaと申します。
ARで3Dオブジェクトをいかに現実と馴染ませるかを普段から考えているので、今回はそれをまとめてみます。
この記事をみて、こういう表現もあるんじゃないかな！みたいなコメントくれたら幸いです！！

## 目次
AR表現で考える必要がある要素は色々ありますが、今回は以下の要素をあげてみます。

- ライティング
- シェーダー、マテリアル
- エフェクトによる演出
- コンテクスト

（デザイナーなもんで、オクルージョンは専門外です、、、）

## ライティング
ライティングはAR以外におけるゲームにおいても重要な要素ですが、ARではさらに重要性が高まります。
こちらの画像を見ていただければライティングの重要性を感じ取れるかと思います。

ライティング前
<img width="540" alt="Screen Shot 2018-12-11 at 11.02.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/293594/2f6f7a5a-41ef-20db-9c1c-40b134ecc7a7.png">
ライティング後
<img width="539" alt="Screen Shot 2018-12-11 at 11.03.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/293594/30bf1e53-6013-47f6-d6c5-70f0e2c5f1d2.png">

ここでポイントとなりそうな点を挙げてみます。
正直ライティングに関しては少ししか勉強していないので、逆にご教示いただきたいです。。。

- 現実の影と同じ向きの影
- 陰（光の当たらない部分）の表現
- 光量・影の大きさ
- 光の色相・明度・彩度

これらをうまく現実と近づければ近づけるほど、現実に馴染むAR表現ができます。

## シェーダー、マテリアル
続いてはシェーダー、マテリアルです。
こちらもうまく使うことで、より高い基準でARを表現することができます。
もちろん現実のものに見えるように、ディテールやマテリアルを現実に近づけることも大事ですが、現実と干渉するようなシェーダーもARらしい表現です。

アカツキさんの[こちらの動画](https://www.youtube.com/watch?time_continue=104&v=ErKOtOuaWw0)がとてもわかりやすく、参考になります。
<img width="931" alt="Screen Shot 2018-12-11 at 11.36.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/293594/2444234f-1cab-dea0-e5f9-6f0326a7ba91.png">
ガラスや半透明のようなシェーダーを使い、現実のものとうまく馴染ませています。

## エフェクトによる演出
演出ももっとも重要な要素の一つです。エフェクトを使った自然に見える演出を探求しています。
現在試行錯誤して様々な演出を考えていますが、無限大に方法はあるでしょう。
直近で自分が考えているのは、異世界への扉やキャラクターの出現の演出です。

参考動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">デモだよ <a href="https://t.co/VWf2LkFinv">pic.twitter.com/VWf2LkFinv</a></p>&mdash; そーま (@masoma101) <a href="https://twitter.com/masoma101/status/1072481795646636032?ref_src=twsrc%5Etfw">2018年12月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

地面から出てくる、フェードイン、テレポートのようなパーティクルを使った演出、などここは想像力をフルに使って演出を考えます。こういう動きがいいんじゃないか、こういう動きなら現実に馴染みそう！というのを社内でブレストし、現在それぞれを開発している最中です。

これは間違いなく現段階では正解も不正解もありません。
自社でいいと思ったアイデアを沢山出してAR業界を盛り上げていきましょう！


## コンテクスト
##### コンテクストとは、文脈や背景となる分野によってさまざまな用例がある言葉であるが、一般的に文脈（ぶんみゃく）と訳されることが多い。文脈により「脈絡」、「状況」、「前後関係」、「背景」などとも訳される。
（Wikipediaより）

なぜ、その場所に、そのオブジェクトを置くのか、というコンテクストがAR表現では殊更に重要です。こちらに関してはプランナーの領域になりますが、デザイナーやエンジニアも考えていれば、より良いものを作ることができると思います！

例えば、
**「カメラでこのマーカーを見てください。ドラゴンが出てきます。」**
これは全くもってコンテクストがありません。

それに対して、このような表現はどうでしょうか。

**「ここには、古来から幽霊が住んでいるという噂が絶えない。カメラで証拠写真を撮ってきてくれないか？」**
**「透明な材質でつくられた爆弾がどこかに隠されている。普通では見られないが、このカメラには特殊なスキャナが搭載してある。これを利用して爆弾を探してくれ！」**

2つ目は本日(12/13)に行われるテックカンファレンス「iNTERFACE SHIFT」で、ENDROLLが没入型ARゲームとして実際に提供するコンテクストです！
![F6139109-223A-47AB-948D-99ECA7394E4F.png](https://qiita-image-store.s3.amazonaws.com/0/293594/333e262c-48c1-30d3-ebfe-579bcc05962c.png)


まずカメラを通して探したくなるし、体験として何よりワクワクしますよね？
このように、場所やマーカー、カメラの意味付けがAR表現、特にゲームにおいて必要だと考えています。

#最後に
現在のARにおいては、オブジェクトをこだわってリッチにするより、
このような様々なAR表現を試すことが大事だと思います。今回は、

- ライティング
- マテリアル、シェーダー
- エフェクトによる演出
- コンテクスト

について書きました。
ARゲームとして新しいジャンルを作っていくために、色んな表現を模索していきたいですね！

それではみなさん良いお年を！！
freenomでドメインの取得

# はじめに
このページは、[谷ゼミ Advent Calender 2018](https://qiita.com/advent-calendar/2018/drawing_pad_from_tani_seminar) の11日目の投稿になります。
最近、行った無料でドメイン取得したことを備忘録として記録しておきます。

今では、[お名前.com](https://www.onamae.com/)などでドメインを簡易に取得可能ですが、やはり無料がいい！お試しで作りたい！という方向けの記事と思っていただければ幸いです。

## 目次
今回、以下のような構成になっています。
1. freenomとは
2. 検索・取得
3. おわりに

## freenomとは
まず、freenomとは何かについてですが。
先ほど述べたとおり、無料でドメインを取得できる海外のサービスで、以下の5種類の中から自分の使いたいドメインを取得することができます。

1 .tk オーストララシアにあるニュージーランドの領土であるトケラウ
2 .ml マリ
3 .ga ガボン
4 .cf 中央アフリカ
5 .gq 赤道ギニア

## 取得について
それでは、使用したいドメイン名を取得していく流れを説明していきます。
まず、freenomのホームページへ行きます。
[freenom](https://www.freenom.com/ja/index.html?lang=ja)

**検索・取得**

まず、下記のようなページで**Sign in**をクリックし、ログインします。
この際、EmailアドレスやGmail,Facebook等でログインすることができます。
ログインに成功後、**Services** → **Register a New Domein**のページへ行き、
**Find a new FREE domein**に使いたいドメイン名を入力して**Check Availability**で検索します。
<img width="1173" alt="freenom.png" src="https://qiita-image-store.s3.amazonaws.com/0/317734/8329a22a-bc40-f24c-efe6-d84802248ef8.png">

次に、入力したドメインが空いているか確認します。
もし、空いていなかった場合は以下のようになっています。
<img width="950" alt="スクリーンショット 2018-12-11 21.30.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/317734/1e2bb632-9137-3e35-602a-02703cd9fcbd.png">
空いている場合は以下のようになっています。
<img width="948" alt="スクリーンショット 2018-12-11 21.31.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/317734/8e658889-7e11-72e8-9f38-cf6cfe91f6d4.png">
使用したいドメインが空いていた場合、5種類の中から選択して**Get it now!**をクリックし、上の方に表示される**Checkout**をクリックします。
今回は、sampleabc.mlというドメインを取得してみます。
(.tkは非推奨です。後に、理由は記述します。)

次のページに行くと、**Use your new domain**は、
後から設定変更できるので、**Forward this domain**を選択し、適当なURLを入力します。
**Period**は「12Months @ FREE」を選択し**Continue**をクリックします。
12Monthes以降もありますが、有料になってきます。
<img width="946" alt="スクリーンショット 2018-12-11 21.40.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/317734/08c8233b-0c28-a07a-d7d4-73201c333aba.png">

合計金額が、$0.00であることを確認します。Your Datailsには追加入力は不要なようですので、
**I have read and agree to Terms & Conditions**にチェックをして**Complete Order**をクリックします。

| Total Due Today:   | $0.00USD |
|:--|:--|

<img width="622" alt="スクリーンショット 2018-12-11 22.02.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/317734/95e3a443-f763-2481-41cb-99d0a9855c39.png">

ドメインの取得が無事に完了すると、以下のようなページが表示されます。
これで取得は終了になります。

<img width="552" alt="スクリーンショット 2018-12-11 21.59.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/317734/f30203cb-871b-211f-95c7-2e7bc722e06f.png">

完了後、ホームページへ戻り
**Services** → **My Domains**をクリック後My Domainsのリストに、先ほど取得したドメインが表示されています。
**Manage Domain**をクリックして、ドメインに関する設定を各種行います。
ご自身のブログだったりページにドメインを当てると表示されます。

## おわりに
今回、無料で取得できるドメインについて紹介してきました。
ただ、正直にいうとWebサイト等で使用することにオススメはできません。
色々と調べてみると、特に.tkに関しては以下のようで、
>連続90日で25回の訪問がなかったサイトは、自動的に使用停止になる。容易に取得が可能なため、フィッシングサイトなどの温床となっている。
3文字以下の名前は有料での登録となる。
wikipediaより


また、検索してみれば分かりますが、コンテンツが日本語で表示される
freenom系ドメインのウェブサイトはあまりないこともあります。
そのために、普通のドメイン名を取得して活用したほうがいいと思います。

なので、freenomの無料ドメインを活用したい場合は、お試しでやってみる程度のつもりで活用していただけるのが一番かなと思います。
初めての投稿で、不備等あるかもしれませんがよろしくお願いします！

## 参考ページ
[wikipedia](https://ja.wikipedia.org/wiki/.tk)
[無料のドメインを取得する](https://qiita.com/teekay/items/135dc67e39f24997019e)
マクロの乗ったExcelファイルと同じディレクトリにあるcsvファイルを全て読み込むやつ

- 背景
- 概要
- ReadCSV
- DeleteCSV
- Reference

# 背景
Qiita初投稿です。

ラボで使っている装置が、測定データ(Current-Voltage特性など)を.csvで吐き出します。基本的に1条件あたり1csvとなるので、いろんな条件で測るとデータ整理が大変。

ということで、xlsmファイルと同じディレクトリにあるcsvファイルを全て読み込むマクロを書きました。

# 概要
読み込まれたcsvは「Data1」「Data2」...という名前のシートとして、マクロの乗ったWorkbookに保存されていきます。

自分用で、「動けばいいや」なのでコード汚いです。ごめんよ。

# ReadCSV

```visualbasic

Sub readCSV()

    Dim fso As Object
    Dim csvFile As Object
    Dim csvData As String
    Dim splitcsvData As Variant
    Dim i, j, cnt As Integer
    Dim buf As String
    Dim path As String
    
    buf = Dir(ThisWorkbook.path & "\*.csv")

    ' CSVファイルが見つからないときの処理
    If buf = "" Then
        MsgBox "There are NO csv files"
        End
    End If

    cnt = 1
    Do While buf <> ""
        Set fso = CreateObject("Scripting.FileSystemObject")
        path = ThisWorkbook.path
        Set csvFile = fso.OpenTextFile(path & "\" & buf, 1)
        
        i = 1
        Worksheets.Add after:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = "Data" & cnt
        
        Do While csvFile.AtEndOfStream = False
            csvData = csvFile.ReadLine
            splitcsvData = Split(csvData, ",")
            j = UBound(splitcsvData) + 1
            ActiveSheet.Range(Cells(i, 1), Cells(i, j)).Value = splitcsvData
            
            i = i + 1
        Loop
        
        cnt = cnt + 1    
        csvFile.Close        
        Set csvFile = Nothing
        Set fso = Nothing 

        '一番左上のセルにcsvファイルの名前を出力します。
        Cells(1, 1) = buf
        buf = Dir()

    Loop

    MsgBox ("Complete")

End Sub
```

#DeleteCSV
大量のcsvを読み込むとシートの数が爆発するので、一撃で削除するマクロも書きました。

```vb
Sub deleteCSV()
    ' 先頭のシートを除く、全てのシートを削除します
    Do While Sheets.Count > 1
        Application.DisplayAlerts = False
        Sheets(2).Delete
        Application.DisplayAlerts = True
    Loop
End Sub
```


# Reference
Qiita記事の書き方
[Qiita記事作成方法 初心者の備忘録](https://qiita.com/liston/items/996ae933ae94c5711883)

Qiitaのシンタックスハイライト
[Qiitaでシンタックスハイライト可能な言語一覧](https://qiita.com/Qiita/items/e84f5aad7757afce82ba)


VBAのもろもろ
[Office TANAKA Excel VBAコンテンツ]
(http://officetanaka.net/excel/vba/index.htm)
TypeScript + React 環境構築

yarnのインストールがまだの方はインストールしておきます。

```
$ npm install -g yarn
```

（インストールしたら```exec $SHELL -l```が必要です。）

Node.jsはこちらの記事を参考にインストールしてください
[Node.jsのインストール〜①anyenv編〜](https://qiita.com/kawa64372358/items/de5532f7f18ceb83802b)
[Node.jsのインストール〜②nodenv編〜](https://qiita.com/kawa64372358/items/c55b527b523317d8758e)
###  TypeScript の実行環境をグローバルインストール

```
$ yarn global add typescript
$ yarn global add ts-node
```

任意の場所に``my-app``というディレクトリを作成します。
参考：https://github.com/wmonk/create-react-app-typescript

```
$ npx create-react-app my-app --scripts-version=react-scripts-ts
```
my-app は任意のプロジェクト名に変えてください。
次に、```$ cd my-app```をして下記を実行。

```
$ yarn start
```

これで自動的に localhost:3000が開きます。

### コンパイル設定を変更する
baseUrl(src)からの絶対パスの指定が可能&ECMAScript6から最新のES2018へ変更。

```tsconfig.json
-     "baseUrl": ".",
+     "baseUrl": "src",

-     "lib": ["es6", "dom"],
+     "lib": ["es2018", "dom"],
```

これでOK:blush:
DHT11でチョッパヤ室内環境可視化

ポキオ（@pokiiio）です。
[Nefry Advent Calendar 2018の12日目](https://qiita.com/advent-calendar/2018/nefry)ということで、簡単に室内環境を可視化できるモジュール（DHT11）について紹介をさせてください。（以前、[私のブログでも紹介した内容](https://relativelayout.hatenablog.com/entry/2018/10/21/233106)な上に、kitazakiさんとダダ被りでした・・・）







## 神モジュールに神ライブラリ


とりあえず、なんとなく室内環境を可視化したいと思い、1つのモジュールで温度・湿度が取れるDHT11を買ってみました。



![ポキオ Nefry BT DHT11](https://lh3.googleusercontent.com/aeH6qei80ehh_-klk-FmaWk3-5R-ZjFkOtVWZ8PM-RBgOJ2MtAgsh1WAmHsTob4jm4rwDsZr3SbrgU1BpTAbb4eB9wf3cWXCMB9o8UpIqkyqc9jqG_PWUCGj2doIXsrMDU5z4MuvhhM=s600 "ポキオ Nefry BT DHT11")



端子は３つ。5VとGNDと信号線。信号線ってことはいろいろ実装しなければならないのかなと思いきや、安心と信頼のAdafruitさんから素晴らしいライブラリが出ていたので、あとは間違えずに配線するだけです。



> Good for 20-80% humidity readings with 5% accuracy
> Good for 0-50°C temperature readings ±2°C accuracy




[https://learn.adafruit.com/dht:title]




精度はアレですが、非常に廉価なので問題ないでしょう。


今回は、センサーの値を直接確認できるように、ディスプレイ付きのNefry BTで動かしてみました。




## 実装はArduino IDEで


まずはライブラリをインストールします。


![ポキオ Nefry BT DHT11](https://lh3.googleusercontent.com/IxZ1hI4fTFZG1uyBdzcjXsW7itXKj50fhS_OTHpedeZOPNcHugFd7OJgpoYE3HahCjWHCuRXiqwCJEWIgdIRERfzySDO4koxutHvZTUa73Ct5_Puf6v5Fvhtsfn3Q1RHfIRMFlHIvQU=s600 "ポキオ Nefry BT DHT11")


ライブラリマネージャーから<b>DHT Sensor Library by Adafruit</b>を探してインストール。これで実装・・・と思ったんですが、これだけではだめで、<b>Adafruit Unified Sensor by Adafruit</b>も必要になりますので、未インストールであればインストールしておきます。（これがないとコンパイルが通らない）


![ポキオ Nefry BT DHT11](https://lh3.googleusercontent.com/Z1pBR_7gtZ4NyHcyWEliKG7Djyr4CfY0rJPScgIbzrlM4GXxYVaRLXkSxhtH6xcHpMwIhh-8s7BRxcVCebw_2moTwZFMdNHw0fL-_EKR4BcHClljHr5LKmel-9IwYTyzLro78UTM914=s600 "ポキオ Nefry BT DHT11")


これこれ。このライブラリがあれば、信号線のピン番号で初期化して、あとは`readHumidity()`だったり`readTemperature()`を行うだけ。簡単すぎて逆に引きます。



## Nefry BT向けのコードはこちら

```c
#include <Nefry.h>
#include <NefryDisplay.h>
#include "DHT.h"

DHT dht(A0, DHT11);

void setup() {
  dht.begin();
}

void loop() {
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  NefryDisplay.print("DHT11");

  if ( isnan(humidity) || isnan(temperature) ) {
    NefryDisplay.print("---[%]");
    NefryDisplay.print("---[deg C]");
  } else {
    NefryDisplay.print(String(humidity) + "[%]");
    NefryDisplay.print(String(temperature) + "[deg C]");
  }

  delay(1000);
}
```



## いざ動作確認


動いてますねー。

![ポキオ Nefry BT DHT11](https://lh3.googleusercontent.com/3ZTR0IOu6jem3XBgSfM_dTTTfRgcTE9hOmQf_rvmR6UdC-79f2B8I4ryLJrB6kjz7O-spdNgMCxilFH1-mSBNTlVuPZJcD7k7S2HvZ0pJYISB7M7hF1IYcPOF4GF2xlA8s5nFV1zV5Y=s600 "ポキオ Nefry BT DHT11")


たまにセンサー値が`nan`になるので、そのハンドリングはちゃんと実装しておいたほうが良さそうです。なにはともあれ、秒で実装できる素晴らしいモジュールでした。
Stripe webhookの処理にResolverを試してみた覚書

初めて試したので、忘れないようにメモ。

## やりたいこと
webhookのtypeに応じて使うクラスを変えたい

## 試したこと

ask-sdk v2にも使われているResolverを入れてみた。

## 参考
https://speakerdeck.com/hidenorigoto/sok-solidfalseyuan-ze-tutedonnahuunishi-ufalse-opunkurozudofalseyuan-ze-senpaifalsekodeingufalsetobian
https://qiita.com/shinichi-takahashi/items/7191d3d393e08b2746f0

## Resolver

```js
class Resolver {
  constructor () {
    this.updater = []
    this.set(this.getArgs(arguments))
  }
  getArgs (arg) {
    return Array.prototype.slice.call(arg, 0)
  }
  set (updaters) {
    this.updater = updaters
  }
  setUpdaters () {
    this.set(this.getArgs(arguments))
  }
  addUpdater (updater) {
    this.updater.push(updater)
  }
  resolve (type) {
    const target = this.updater.filter(updater => updater.supports(type))
    if (target.length < 1) throw new Error(`Unsupported webhook type: ${type}`)
    return target[0]
  }
}
```

`constructor`か`setUpdater`で一括登録が可能。
`addUpdater`で後から追加可能。

## resolveされる側

```js
class CustomerInfoUpdater {
  supports (type) {
    return type === 'customer.created' || type === 'customer.updated'
  }
  process () {
    return 'customer'
  }
}
class SubscriptionInfoUpdater {
  supports (type) {
    return type === 'customer.subscription.created' || type === 'customer.subscription.updated' || type === 'customer.subscription.deleted'
  }
  process () {
    return 'subscription'
  }
}

class InvoiceInfoUpdater {
  supports (type) {
    return type === 'invoice.payment_succeeded'
  }
  process () {
    return 'invoice'
  }
}
```

それぞれ`supports`で指定しているwebhookのtypeの時に、`process`で処理を実行するという想定です。

## 組み合わせる

```js
try {
  const resolver = new Resolver(
    new CustomerInfoUpdater(),
    new SubscriptionInfoUpdater(),
    new InvoiceInfoUpdater()
  )
  const t1 = resolver.resolve('customer.updated')
  console.log(t1.process())
  const t2 = resolver.resolve('customer.subscription.created')
  console.log(t2.process())
  const t3 = resolver.resolve('invoice.payment_succeeded')
  console.log(t3.process())
  const t4 = resolver.resolve('hoge')
  console.log(t4.process())
} catch (e) {
  console.log(`[ERROR!] ${e.message}`)
}
```

実行結果がこちら

```bash
$ node test.js
customer
subscription
invoice
[ERROR!] Unsupported webhook type: hoge
```

ちゃんと対応するメソッドが実行されてますね。

## この後

既存のソース側でTypeScriptのビルドが事故る現象があったので、interfaceなどの実装は先送り。
新規のPJなどであればTypeScriptでもうちょっといい感じにしていきたい。
ネットワークトポロジー図に対して思うこと

#ネットワークトポロジー図に対して思うこと

* 本記事は自称エンジニアによる実体験に基づいた，"創作ポエム"です．

---
## 皆さんは，普段どのようにネットワークトポロジー図を描かれていますか?
私は，以下のルールを決めており，丸や四角の図形をアイコンの代わりに使用しています．

* 簡潔に表現されていること
* 誰でもわかること
* 素早くかけること

しかし，昨今InteropのShowNetで，展示されているような，多種多様なアイコンや線を用いた，ネットワークトポロジー図(ShowNet型トポロジー図と定義)を描く人が，私の身の回りに増えてきています．
私は，特にこだわりはないので，見れれば良い・わかれば良いの信念のもと，描いていますが，ShowNet型トポロジー図を描く人たちの中には，
無駄に
こだわって描いており，聞いた話では，他人に強要する人もいるそうです．

## ネットワークトポロジー図は可視化する手段の1つに過ぎない
私は，ShowNetのように，展示が目的なら，こだわってもいいと思いますが，特に展示の予定もないのに，こだわったり強要する人たちの気持ちが，理解できなく，図ではなく目的であるネットワークの構成にこだわればいいと思っています．

ネットワークトポロジー図は，あくまでもネットワークの構成要素や構成を，可視化する手段の1つに過ぎません．
しかし，前述の通り，目的と手段を取り違えてネットワークトポロジー図に対して
無駄に
こだわる人が増え，それを強要し広めようとする人が，増えて残念に思います．

## まとめ
ルールを決めて，ネットワークトポロジー図を書けばいいと思います．
しかし，あくまでも手段の1つにしか過ぎないので，特にこだわる必要がないと思います．
ネットワークトポロジー図に，こだわるぐらいなら，中身のネットワーク構成や設計に，こだわってください．
趣味の世界なので，「わかりやすい」，「はやっている」などの
理解不能な
理由で，他人に強要したりしないでください．

以上，自称エンジニアによる実体験に基づいた，"創作ポエム"でした．
アイカツ！のマイページから情報を取得するやつを作る 番外編その1 - 各環境で実行可能なバイナリをgoreleaserでビルドしてGitHub Releasesでリリースする

# はじめに

この記事は、[アイカツ！ Advent Calendar 2018](https://adventar.org/calendars/3700)の**11日目**の記事です。内容としては、現在大好評稼働中のアーケードゲーム、[データカードダス アイカツフレンズ！](http://www.aikatsu.com/friends/)のマイページから情報を取得するツールを作成中で、その内容と進捗の紹介になります。

前日の記事は[sakura_metal](https://adventar.org/users/7601)さんによる[にゃるらと on Twitter: "すんごい今更だけどaikatsupのTwitterCards対応した https://t.co/K3nEO0pRWm"](https://twitter.com/sakura_metal/status/1071731493767065600)でした。

ちなみに、これまでアイカツ！ Advent Calendar 2018では以下のような技術系記事が投稿されています。

- [アイカツ！画像でLGTMできるChrome拡張機能をストアに公開しました - matのブログ](https://romiogaku.hateblo.jp/entry/2018/12/01/223906)
    - 2日目
- [Aikatsu Music Medoly - アトリエあざらし](http://blog.a-azarashi.jp/entry/2018/12/05/060344)
    - 5日目
- [アイカツ！のマイページから情報を取得するやつを作る その1 - Qiita](https://qiita.com/kakakaya/items/0371752db771d1cede4d)
    - 7日目

# aikatsu-dcd-parser
については前回の記事を読んでください。中身は何も変わっていません。

[アイカツ！のマイページから情報を取得するやつを作る その1 - Qiita](https://qiita.com/kakakaya/items/0371752db771d1cede4d)

# GoReleaser
Go製ツールで、ビルド対象のアーキテクチャやOS、対象のファイルなどを指定してあげることで、タグに基づいてバイナリをGitHubのReleasesにアップロードすることのできるツールです。

## 設定例
最新版では、以下（https://github.com/kakakaya/aikatsu-dcd-parser/blob/9e4a1d93e114c5b7aab11843d8737d97846ed6a8/.goreleaser.yml より抜粋、一部割愛）のように設定して、……


```yaml
builds:
  -
    main:
      ./cmd/dcdkatsu
    binary: dcdkatsu
    goos:
      - windows
      - darwin
      - linux
      - freebsd
    goarch:
      - amd64
archive:
  format: tar.gz
  format_overrides:
    - goos: windows
      format: zip
```

……リリースしたいバージョンにタグをつけて環境変数`$GITHUB_TOKEN`に`repo`権限のあるトークンを与えて`goreleaser release --rm-dist`を実行することで、以下のような形でバイナリを各環境向けにクロスコンパイルして圧縮してGitHubでリリースしておくことができます。
[Release v0.1.3 · kakakaya/aikatsu-dcd-parser](https://github.com/kakakaya/aikatsu-dcd-parser/releases/tag/v0.1.3)

![2018-12-11_22-17-07.png](https://qiita-image-store.s3.amazonaws.com/0/80036/45e091e0-3cc2-2049-d88b-24a348d1a0e6.png)

# おわりに
なんか11日目がなかったのでスッと差し込みました。スマブラの対応に追われており進捗が微妙です。今後やることは以下のとおりです。前回の記事からの変更点が太字になっています。

- 取得間隔の制限（サーバへの負荷を防ぐため）
- 取得可能な機能の追加
  - デジタルバインダーの取得
  - ログインが必要な部分の取得
    - フレンズ
    - バッジ
    - ランキング実績
    - 大会実績
    - アーカイブ
      - アイカツスターズ！1弾〜5弾
      - アイカツスターズ！星のツバサ編
- 取得結果の保存、差分表示
- テストの作成
    - ランキング周りが面倒そう
- CI
    - やるだけ
    - **今回GoReleases入れたのでこれもいい感じにできるようにしたい**
- **リリース方法のいい感じ化**
    - **.debを配布したい**
    - **AURに置きたい**


他にも欲しい機能やマサカリがあったら、この記事のコメントにお願いします。これは非公式なものであり、データカードダス アイカツフレンズ！公式や、バンダイナムコ、その他権利者の方に問い合わせないようお願いします。また、怒られたらすぐに消します。

明日は[nyakuro](https://adventar.org/users/25130)さんの「アイカツ関連のdiscord botについて書く予定」です。
【2ステップで解決】GitHubからgit cloneしたけどページが表示されない問題

##最初に試してみる事

①ターミナルに、`bundle install --without production`を入力。


##次に試してみる事
下記フォルダを見ると、「この問題を解決するためには、このコマンドを入力して下さい」と親切に書かれてます！！

```Rails:development.log

ActiveRecord::PendingMigrationError (

Migrations are pending. To resolve this issue, run:

    bin/rake db:migrate RAILS_ENV=development

):
```

② ターミナルに、`bin/rake db:migrate RAILS_ENV=development`を入力。

##無事動きました！！
Git、GitHubの導入方法（SSH Key設定まで）

転職したので、良い機会だと思って今回行った環境構築まわりのQiita書きます:blush:

- [Homebrewのインストール（macOS）](https://qiita.com/kawa64372358/items/758c1ce481524cd62a8f)
- [Node.jsのインストール〜①anyenv編〜](https://qiita.com/kawa64372358/items/de5532f7f18ceb83802b)
- [Node.jsのインストール〜②nodenv編〜](https://qiita.com/kawa64372358/items/c55b527b523317d8758e)
- [iTerm2の導入・Zshの導入](https://qiita.com/kawa64372358/items/3fae9aa728148cd30ef5)
- [Git、GitHubの導入方法（SSH Key設定まで）](https://qiita.com/kawa64372358/items/3ef4bbc60b38caa13212)

## Gitとは
Gitはバージョンを管理してくれるシステムです。
GitHubは、みんなでGitを使って開発するときに便利なWebサービスです。

#### Gitがインストールされているかの確認
```
$ git --version
 ```
以下が表示されればgitが入っています。
（新品macに入っていたので標準で入ってると思います）

```
git version 2.14.3
```
もしGitが入っていなければ、インストールしましょう。
#### Gitのインストール
Homebrewをつかってインストールします。

Homebrewのインストールがまだの方は上記リンクより導入してください。

```
$ brew install git
```
#### 個人の識別情報
名前とメールアドレスの設定をします。

```
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
```
（もしプロジェクトごとに設定を使い分けたいのなら、--globalオプション無しで設定します。その場合、プロジェクトのディレクトリで毎回設定が必要です。）

下記で設定の確認ができます。

```
$ git config -l
```
## GitHubとの連携
ローカルでSSH Keyを作成します。

```
$ ssh-keygen -t rsa -C "メールアドレス"
```
下記のように聞かれるので、enterをして2回パスワード入力しましょう。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/kawa/.ssh/id_rsa): 
```

このように表示されたらOKです。

```
+----[RSA]-----+
|              |
|              |
|              |
|              |
+----[SHA]-----+
```

保存場所は、下記のように表示されます。

```
(略)
Your public key has been saved in /Users/kawa/.ssh/id_rsa.pub.
```

ちなみに```.pub```がついているほうのファイルが公開鍵で、もう一方が秘密鍵です。

SSH Keyの作成ができたら、```$ cd /Users/kawa/.ssh```で移動し、```$ less id_rsa.pub```でファイルを開き、GitHubへ貼り付けるため、ファイルの文字列を全てコピーしておきましょう。

[Git-サーバー-SSH-公開鍵の作成](https://git-scm.com/book/ja/v1/Git-サーバー-SSH-公開鍵の作成)
[Connecting to GitHub with SSH](https://help.github.com/articles/connecting-to-github-with-ssh/)

#### GitHub の SSH and GPG keys を開く

次にGitHubでの操作をしていきます。

ユーザー登録をして、Settingを開きます。
左側のPersonal settingからSSH and GPG keysを選択します。

次に、右上の緑色の```New SSH key```ボタンを押しましょう。
<img width="1001" alt="スクリーンショット 2018-10-17 20.51.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/239038/a8868091-be2a-d57f-cf23-c565b0f0dd09.png">

Title ：　任意の名前でOK
Key ：　先ほどコピーしておいたid_rsa.pubのコードを貼り付け

```Add SSH key```をすれば完了です！
おつかれさまでした:blush:
esp32で人感センサーの動作テストしてみた

#はじめに
今度使う予定のある焦電型赤外線センサー（以下人感センサー）の動作確認をしました。
安定性はありませんがとりあえずのチェック用です。

#回路（手書き）
回路図です。fritzingとか使おうと思ったんですけどたいそうなものでもないので申し訳程度に。

![image1 (1).JPG](https://qiita-image-store.s3.amazonaws.com/0/228792/e3f0baa2-4c24-82fa-c949-bf16e5a9fadf.jpeg)

人感センサーはこれを使いました。（秋月通商さんのサイトより）
![M-09627.jpg](https://qiita-image-store.s3.amazonaws.com/0/228792/5741e488-cbb5-a71b-8b0c-402b03774584.jpeg)

#サンプルコード
脳死でピン設定しておしまいです。（以下のコードの責任は負いかねます）

```c:sensor_check.ino
int pir = 35;
int led = 13;

void setup() {
  pinMode(pir, INPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  if(digitalRead(pir)) {
    Serial.println("on");
    digitalWrite(led,HIGH);
    
  } else {
    Serial.println("off");
    digitalWrite(led,LOW);
    }
    //delay(1000); 
}
```

先ほどの回路には書きませんでしたが、LEDでセンサーの状況を可視化しました。
なんかにいつか使いたいですね。
iTerm2の導入・Zshの導入

転職したので、良い機会だと思って今回行った環境構築まわりのQiita書きます:blush:

- [Homebrewのインストール（macOS）](https://qiita.com/kawa64372358/items/758c1ce481524cd62a8f)
- [Node.jsのインストール〜①anyenv編〜](https://qiita.com/kawa64372358/items/de5532f7f18ceb83802b)
- [Node.jsのインストール〜②nodenv編〜](https://qiita.com/kawa64372358/items/c55b527b523317d8758e)
- [iTerm2の導入・Zshの導入](https://qiita.com/kawa64372358/items/3fae9aa728148cd30ef5)
- [Git、GitHubの導入方法（SSH Key設定まで）](https://qiita.com/kawa64372358/items/3ef4bbc60b38caa13212)

## Homebrew-Caskの導入
Homebrew-Caskを使ってiTerm2を入れます。
Homebrew-Caskを使うと、VSCodeなどのツールもインストール可能になります。

Homebrewのインストールがまだな方は上記リンクより導入してください。

```
$ brew install cask
```

### iTerm2の導入
まずはiterm2がインストール可能かどうか検索します。

```
$ brew search iterm2
```

iTerm2が表示されますね！インストールしていきます。

```
$ brew cask install iterm2
```

インストール完了！現在のターミナルを閉じてiTerm2を起動しましょう！

### Zshの導入
```
$ brew install zsh
```

```
$ sudo vi /etc/shells
```

末尾に以下を追記

```
/usr/local/bin/zsh
```

ログインシェルの変更

```
$ chsh -s /usr/local/bin/zsh
```

```
$ exec $SHELL -l
```

今までのbashファイルは下記コマンドで移せます。

```
$ cat .bash_profile >> .zprofile
```

あとはホームディレクトリに```.zshrc```ファイルを作って設定を書けばOK！
私はまだ設定ファイル作成に詳しくないので、下記を参考にしてみてください。

[Web系だけど.zshrc晒す](https://qiita.com/Hibikine_Kage/items/61711d5e3d3d5f572f9f)
[Homebrewでzsh導入＆oh-my-zsh初期設定まとめ](http://vdeep.net/zsh-oh-my-zsh)
Node.jsのインストール〜②nodenv編〜

転職したので、良い機会だと思って今回行った環境構築まわりのQiita書きます:blush:

- [Homebrewのインストール（macOS）](https://qiita.com/kawa64372358/items/758c1ce481524cd62a8f)
- [Node.jsのインストール〜①anyenv編〜](https://qiita.com/kawa64372358/items/de5532f7f18ceb83802b)
- [Node.jsのインストール〜②nodenv編〜](https://qiita.com/kawa64372358/items/c55b527b523317d8758e)
- [iTerm2の導入・Zshの導入](https://qiita.com/kawa64372358/items/3fae9aa728148cd30ef5)
- [Git、GitHubの導入方法（SSH Key設定まで）](https://qiita.com/kawa64372358/items/3ef4bbc60b38caa13212)

## nodenvのインストール
前回インストールした**anyenv**を使ってインストールします。

anyenv：https://github.com/riywo/anyenv#readme

```
$ anyenv install nodenv
```
インストールできたら下記コマンドで再起動しましょう。

```
$ exec $SHELL -l
```

nodenvのインストールができ、Node.jsをバージョンごとに管理できます。

## Node.js のインストール
[Node.js HP](https://nodejs.org/ja/)で推奨版のバージョンを確認しましょう。

```
$ nodenv install 8.12.0
```

下記コマンドでバージョンが表示されればOKです。

```
$ node -v
```

お疲れ様でした:v_tone1:
Node.jsのインストール〜①anyenv編〜

転職したので、良い機会だと思って今回行った環境構築まわりのQiita書きます:blush:

- [Homebrewのインストール（macOS）](https://qiita.com/kawa64372358/items/758c1ce481524cd62a8f)
- [Node.jsのインストール〜①anyenv編〜](https://qiita.com/kawa64372358/items/de5532f7f18ceb83802b)
- [Node.jsのインストール〜②nodenv編〜](https://qiita.com/kawa64372358/items/c55b527b523317d8758e)
- [iTerm2の導入・Zshの導入](https://qiita.com/kawa64372358/items/3fae9aa728148cd30ef5)
- [Git、GitHubの導入方法（SSH Key設定まで）](https://qiita.com/kawa64372358/items/3ef4bbc60b38caa13212)

## Node.jsとは
Node.jsは、サーバー上で動くJavaScriptです。
フロントエンドの開発で用いられるツールはNode.jsで動作するものが多いです。

## anyenv のインストール
バージョン管理をするため、まず```anyenv```をインストールします。
anyenvの中にはnodenv(node.js）以外に、rbenv(ruby)などがあります。

参考：https://github.com/riywo/anyenv#readme

下記でダウンロードしましょう。

```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
```
下記コマンドでパスを通します。（bashの場合）

```
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
```
シェルを再起動します

```
$ exec $SHELL -l
```
下記コマンドで```Usage```が表示されればOK

```
$ anyenv
```

次は、**nodenv**をインストールしていきます！

[Node.jsのインストール〜②nodenv編〜](https://qiita.com/kawa64372358/items/c55b527b523317d8758e)
Homebrewのインストール（macOS）

転職したので、良い機会だと思って今回行った環境構築まわりのQiita書きます:blush:

- [Homebrewのインストール（macOS）](https://qiita.com/kawa64372358/items/758c1ce481524cd62a8f)
- [Node.jsのインストール〜①anyenv編〜](https://qiita.com/kawa64372358/items/de5532f7f18ceb83802b)
- [Node.jsのインストール〜②nodenv編〜](https://qiita.com/kawa64372358/items/c55b527b523317d8758e)
- [iTerm2の導入・Zshの導入](https://qiita.com/kawa64372358/items/3fae9aa728148cd30ef5)
- [Git、GitHubの導入方法（SSH Key設定まで）](https://qiita.com/kawa64372358/items/3ef4bbc60b38caa13212)

## Homebrewのインストール

macOSで動作するパッケージ管理システムです。

Homebrewを使うことで、コマンドライン上でツールのインストールができます。
ソフトウェアのインストールを**ビールの醸造**に見立てています。


macにあらかじめ入っているrubyをつかってインストールします。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

```
The Xcode Command Line Tools will be installed.
```

と聞かれたらXcodeが入っていないという事なので、インストールをするためreturn key(enter)を押しましょう。（結構時間がかかります・・。）


```
$ brew -v
```
で```Homebrew 1.8.0```が表示されればOK。(記事投稿現在)

[Homebrew](https://brew.sh/index_ja)
kintoneの一覧画面を便利にするプラグインを作ってみた

## はじめに
kintone Advent Calendarに登録をしたので、
せっかくなので以前から作りたかったプラグインを作ってみることにしました。

## 一覧拡張プラグイン
* Github: https://github.com/tonio0720/kintone-adv-view
* ダウンロード: https://github.com/tonio0720/kintone-adv-view/releases

## 機能
### 動的に項目の追加、並び替え
![fieldadd.gif](https://qiita-image-store.s3.amazonaws.com/0/272803/1d0472a7-49d9-cf6e-9ae7-5babc299f959.gif)

### 一括レコード削除
![recorddelete.gif](https://qiita-image-store.s3.amazonaws.com/0/272803/9987bcce-cc5c-b125-0dba-e0c4981c5023.gif)

## インストール手順

### カスタム一覧作成
* アプリの設定
* 一覧タブ
* ＋ボタンから一覧の追加
* レコード一覧の表示形式をカスタマイズに変更
* <b>一覧IDをメモする</b>
* ページネーションを表示するからチェックを外す
* HTMLに下記を記載

```{html}
<div id="app"></div>
```
### プラグインをインストール
* [Github](https://github.com/tonio0720/kintone-adv-view/releases/)からダウンロード
* 参考（https://jp.cybozu.help/k/ja/admin/system_customization/add_plugin/plugin.html）

### プラグインをアプリに追加
* アプリの設定
* プラグイン
* プラグインの追加から一覧拡張プラグイン
* 先ほどメモした一覧IDを使用
* フィールドを選択から初期表示したい項目を選択
* 保存

## こだわりポイント
表示項目(<code>displayFields</code>)やページ数(<code>page</code>)などの設定情報をすべてURLのパラメータに格納しているので、
URLをお気に入りなどに登録することで、一覧が再現可能になっています。
e.g. ?view=xxx&displayFields=aaa,bbb,ccc&page=1&rowsPerPage=20

## 最後に
今回はvue.jsを使って作成してみました。
制約の多いkintoneの中でも、フレームワークをうまく使うことで、色々なことが出来そうですね！
まだまだ機能を追加したいので、要望があればコメント欄にお願いします！
（よければ<b>いいね</b>もお願いします・・・）
form_forについて

#form_forについて

```rb

def new
  @book = Book.new
end
```

newアクションは @book = Book.new の1行です。Book.newでBookクラスのインスタンス（データは空っぽ）を作り、@bookインスタンス変数へ代入し、ビューへ渡します。Book.newでつくったBookクラスのインスタンスはタイトルとメモを格納できるようになっています。
⇒
値を格納したインスタンスをcreateアクションに送るんだよ！
⇒いやviewから送られてきたパラメータを引数にして
createアクション内でインスタンスを作るんやな。
http://igarashikuniaki.net/rails_textbook/new-create.html
Julia を使ってお手軽に数学 gif を作ってみよう

本記事では Windows を使っている人向けに、Julia をインストールし、jupyter notebook を使って gif ファイルを生成するところまでを解説します。

Macのユーザは@SatoshiTerasaki さんの [Jupyter notebook を Gistにアップしたときに Python の matplotlib 出力 gif が動くようにする．](https://qiita.com/SatoshiTerasaki/items/5b56c6968ae521204456)をご覧ください。

# 1. Anaconda3 をインストールしよう
この章では以前書いた
[Python を使ってお手軽に数学 gif を作ってみよう](https://qiita.com/wakabame/items/c3648501eb0f2b921ddf#2-notebook-%E4%B8%8A%E3%81%A7%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97)
の前半部分を実行してください。

`環境変数`を開き、Pathという変数を編集（あるいは新規に作成）し、
`C:\Anaconda3`、`C:\Anaconda3\Scripts`、`C:\Anaconda3\Library\bin`
を追加しておきます（実は重要）。

さらに、今回は@SouTakenakaさんによると[Plots.jlで動画出力するにはffmpegまたはimagemagickが必要](https://qiita.com/SouTakenaka/items/94600300633a23512aa5)とのことでしたので、matplotlibのバージョンアップに加えて、
`conda install -y -c conda-forge ffmpeg`
をプロンプト画面で実行します。

# 2. Julia をインストールしよう
ここが難所です。
この章は黒木玄先生の[WindowsへのJulia言語のインストール](http://nbviewer.jupyter.org/gist/genkuroki/81de23edcae631a995e19a2ecf946a4f)を参考にしました。


まず、公式サイトに行き、インストーラを手に入れましょう。
`Windows Management FrameWork` がない場合は、先にインストールしておきます。
後で述べるように、これを行っていないと途中から進めなくなります。。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/241946/d3d4c711-21e0-6738-2d38-de7480c67eb0.png)

ダウンロードに成功したら、exeファイルを開きます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/241946/1e171362-94eb-6c50-839e-a22e24369719.png)

黒い画面が現れます。左上にjuliaのアスキーアートがありますが、バックスラッシュが円マークになっていて可愛いですね。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/241946/d6305d6f-9719-e513-2b17-3aa20e0aec0d.png)

`ENV["PYTHON"] = "C:\\Anaconda3\\python.exe"`
の入力は必須ではありません。
`]`キーを押すと、入力モードが変わります（元に戻すには、`BackSpace`キーを押します）。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/241946/443235ad-099c-be14-b4e8-2a92abf68da9.png)
`pkg> add IJulia PyPlot Plots PyCall`
`pkg> build`
を順に行っていきます。

最初のダウンロードの手順で `Windows Management FrameWork` をインストールしていないと、ここで怒られます。
黒い画面で英語で怒られるのって恐いですよね。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/241946/cb23e006-b9b0-18ea-a9f7-301f73a89bbf.png)

気を取り直して（やり忘れた人は`Windows Management FrameWork`をインストールして）、作業を続行しましょう。
今度はスイスイ進むかと思います

![6.png](https://qiita-image-store.s3.amazonaws.com/0/241946/f339971d-9397-5b88-a1ba-bb07dfd5e2e2.png)
再びコマンドプロンプトに戻り、`jupyter notebook`と打ち込むと、notebookが立ち上がります。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/241946/1a791a57-c0fb-229e-30c5-16971979463c.png)

Juliaが正しくインストールされていれば、`Julia 1.0.2`が表示されているはずです。
選択しましょう。


# 3. 数値計算をして、実際にgifを出力しよう
yellowshippoさんの[Numerical analysis for Van der Pol oscillator ](https://gist.github.com/yellowshippo/687482b788fc91d8c0f1262e5596fe85)
![anim.gif](https://qiita-image-store.s3.amazonaws.com/0/241946/a0d41c62-bd73-eba9-1b88-6e267bf3b647.gif)

@SouTakenakaさんの[Juliaで群れシミュレーション"Boids"](https://qiita.com/SouTakenaka/items/c2b8e9ed5826a5db160a)
![Boids4.gif](https://qiita-image-store.s3.amazonaws.com/0/241946/5b6873d7-7452-9386-c8d8-133c237b7e71.gif)


も出力できるようになりました。
ただし、
`gif(anim, "anim_dir/anim_name.gif",fps=15)`
により保存する際には、`anim_dir/`としてカレントディレクトリ(`./`または空欄)を指定するか、すでに存在するフォルダを指定しましょう。
【2018年版】/proc/meminfoの情報をZabbixで収集してみる

# 初めに
2013年07月に[/proc/meminfoの情報をzabbixで収集してみる]( https://qiita.com/mutz0623/items/2a8186de010c494cbfe0)という記事をQiitaに投稿しました。
Linuxのメモリーに関する情報を/proc/meminfoという特殊なファイルから取得してZabbixで集計してみた、というものでしたが、当時は`system.run`アイテムで実行したスクリプトで/proc/meminfoを処理して`zabbix_sender`コマンドでTrapperアイテムに値を登録するといった内容で、今見返してみると~~面倒~~上級者向けな方法だったように感じます。

今回は、2018年12月時点での最新バージョンであるZabbix 4.0が備える機能を活用すると同じ監視内容が手軽に実現できるという内容についてご紹介します。

# 前提条件
- Zabbix 4.0を対象にしています
- 動作確認はRHEL7/CentOS7で行っています

# 手順
必要なファイルは[GitHub上のリポジトリ](https://github.com/mutz0623/zabbix_meminfo)で公開しています。

## 監視対象ホストでの作業
- 上記のリポジトリをクローン
    - 必要なファイルはuserparameter_meminfo.confとzbx_templates_meminfo_40.xmlの二つだけなので、ファイルだけダウンロードしても構いません

```shell-session
$ git clone https://github.com/mutz0623/zabbix_meminfo
```

- ユーザーパラメーターを記述した設定ファイルをコピー

```shell-session
$ sudo cp zabbix_meminfo/userparameter_meminfo.conf  /etc/zabbix/zabbix_agentd.d/
```

- Zabbix agentを再起動

```shell-session
$ sudo systemctl restart zabbix-agent.service
```


## ZabbixサーバーのWeb UIでの作業
- テンプレートのXML(`zbx_templates_meminfo_40.xml`)をインポート
- テンプレートを対象ホストに割り当てる
- 少し待つ  
対象ホストのホストスクリーンで値が見え始めたらOKです。

# 仕組み
大きく二つの機能の組み合わせで実現しています。

## ローレベルディスカバリー
/proc/meminfoの項目数は環境によって増減します。
試しにMicrosoft Azure上のRHEL 7.6で数えてみたところ46個、RaspberryPi 3B+にインストールしたFedora 29では44個でした。

このように、環境によって異なる項目を柔軟に監視する上で欠かせないのが[ローレベルディスカバリー](https://www.zabbix.com/documentation/4.0/manual/discovery/low_level_discovery)です。
Zabbixエージェントにはあらかじめネットワークインターフェースやファイルシステム、CPUコアといった、環境によって個数や名前の異なる項目の一覧を取得するためのアイテムが組み込まれていますが、いずれもZabbixサーバーからのリクエストに対して比較的平易なJSON形式のテキストデータを返送するアイテムとして実現されており、ワンライナーを使ったユーザーパラメーターでも容易に実現できるものです。
今回はユーザーパラメーターで「/proc/meminfoに含まれる項目」のディスカバリーを行うアイテムを実装しました。
(ちなみに2013年の記事では、すべてのアイテムを手作業で個別に登録するといったことをやっていました)

## 依存アイテム機能
バルクメトリクスと言った方が分かりやすいかもしれませんが、要するに複数の値を含む情報を一度にまとめて取得するといったものです。
上述のローレベルディスカバリーのみでも今回ご紹介する内容と同様の監視は実現可能ですが、「個別の項目に対してそれぞれサーバーとエージェント間での値の取得が取得が実行される」と「すべての値をまとめて取得する」とではアイテム取得の実行頻度やエージェントの処理の負荷が大きく変わってくるほか、[アイテム取得の実行タイミングの微妙なずれによる影響を低減することができます。](https://qiita.com/mutz0623/items/1d07560f4f13b61e189f)
また、依存アイテム機能自体はZabbix 3.4で追加された機能でしたが、Zabbix 4.0でローレベルディスカバリーとの組み合わせが強化され、監視項目の柔軟性が向上しました。

今回は、/proc/meminfoから取得した値をJSON形式にまとめるワンライナーをユーザーパラメーターとして登録し、JSONから値を取り出す依存アイテムをローレベルディスカバリーのアイテムのプロトタイプとしてテンプレートに記述しています。

以上の機能を組み合わせることにより、/proc/meminfoに含まれる40以上の項目の値を一度に取得してまとめてサーバーに返送するといったことが可能になります。

# 終わりに
「/proc/meminfoの情報をZabbixで監視したい！」と思う人はあまりいないかもしれませんが、ローレベルディスカバリーと依存アイテムの組み合わせは柔軟な監視を実現する上で非常に強力な機能だと思います。
ESP-WROOM-32 + Arduino IDE で、ヘッダが見つかりませんと言われちゃうときは。

# TL;DR
設定ファイルがサブモジュール化されているので、サブモジュールごとcloneしましょう。

# 問題
Arduino IDEで、スクリプトを動作させようとすると、

```
「/Users/XXXX/Documents/Arduino/hardware/espressif/esp32/libraries/BLE」に、無効なライブラリ「/Users/XXXX/Documents/Arduino/hardware/espressif/esp32/libraries/BLEにはヘッダファイル（.h）がありません」があります。
```

などと言われてしまうときは、設定ファイルの libraries/AzureIoT と、libraries/BLE がgit のsubmoduleとなっており、それが正常にダウンロードされていない可能性があります。Zipでダウンロードしたり、無印のgit cloneしたときに発生します。

このときは、

```
cd ~/Documents/Arduino/hardware/espressif/esp32
git submodule update --init --recursive
```

してやるか、まだダウンロードしてないときは、

```
mkdir -p ~/Documents/Arduino/hardware/espressif && \
cd ~/Documents/Arduino/hardware/espressif && \
git clone --recursive https://github.com/espressif/arduino-esp32.git esp32 && \
cd esp32/tools/ && \
python get.py
```

としてやりましょう。--recursive がキモ。
ダウンロードしていたときは、

```
rm -rf ~/Documents/Arduino/hardware/espressif/esp32
```
してから、上のコマンドで治ると思います。

# 蛇足
。。。この記事、ニーズありますかね？ニッチすぎる？
AWSの仮想化

## このブログで分かることとその効果

### わかること
* Xenについて
* 仮想化のタイプには３タイプある

### 効果
ちょっとした知識が手に入ります。ただ一方で、実用的なコマンドとかは出てきません。

## Xenとは?
`Xen`とは、`ハイパーバイザ型`の仮想化ソフトウェアのことです。

Xenのリンク↓
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/virtualization_types.html


AWSはこの`Xen`で動作しています。




## ハイパーバイザー型？
仮想化には3パターンあります。
（2パターンという見方もできますが、今回はコンテナ型を一つの仮想化パターンとしてカウントしました。）

では、その3パターンを簡単に説明していきます。

### ハイパーバイザー型
* 具体的なソフトウェア: Xen
    * これがAWSが動いています。
    * ハードウェアレベルでリソースを割り当てます
    * リソースを物理的にVM(仮想マシン)に割り当てるので、他のVMからの影響は受けにくいというメリットがあります。
    * 全く受けない訳ではありません
    * ユーザはハイパーバイザーと呼ばれる上で実行されるVMを使います。
    * そのVMがEC2です


一般的なEC2のインスタンスの場合、AWSコンソールからインスタンスの起動や再起動をすることができますが、これはXenのコマンドを実行しています（詳しくはAWSで働かないとわからないですが。）

![xen.png](https://qiita-image-store.s3.amazonaws.com/0/254666/af5148ff-1652-9e8e-5b8c-6a1272776f4c.png)


### KVM型
* 具体的なソフトウェア: Vagrant（Virtualbox）
    * リソースをOSレベルで割り当てます。
    * VMは、アプリとして動作します
    * VMからの影響はハイパーバイザー型よりは受けやすい

![kvm.png](https://qiita-image-store.s3.amazonaws.com/0/254666/67fd286e-ded4-c292-8367-a7129d911281.png)


### コンテナ型

* 具体的なソフトウェア: Docker
* アプリ（プロセス）レベルの仮想化です
    * これをAWSの物理マシンから見ると、二重に仮想化しているように見えます。
* ネステッド（入れ子）といいます
    * このことを`Nested Virtualization`と言ったりします。
 
*　Vagrantと同じレイヤの仮想化ですが、コンセプトが違います。
*　Vagrantでは、OSを仮想的にのせるのに対して、コンテナではOS(厳密にはkernel)レベルを共有します。
*　なので、実行は速いです。 

![container.png](https://qiita-image-store.s3.amazonaws.com/0/254666/fadb394d-fc53-7700-09a0-cc68958369b0.png)


### ハイパーバイザー型仮想化のライフサイクル

ハイパーバイザー型仮想化において、VMのプロセスは、実際にVM上で実行されることはありません。
VMのプロセスを実行すると、その実行権限は、その下のハイパーバイザーに渡されます。

ハイパーバイザーがVMのプロセスを代わりに実行して、その結果をVMに返します。

どんな仮想化でも、VMの代わりにその下のレイヤが実行するようになっています。（確か）

* Xen → xend
* vagrant(virtualbox) → virtualbox engine
* Docker → dockerd(docker engine)



## おまけ
最近はC5インスタンスはKVMにだそうです。これは知りませんでした。

## 参考にした記事
* https://blog.kasei-san.com/entry/2018/01/10/003933
* https://dev.classmethod.jp/cloud/ec2-migration-to-hvm/
* https://www.publickey1.jp/blog/17/awskvmc5.html
* https://dev.classmethod.jp/cloud/aws/ec2-instance-detail/
* https://qiita.com/9en/items/f4eab2f61485a9f3885a
    * ほぼまんまのQiitaです。既出でしたか。残念。


# AWS歴
ちなみに僕のAWS歴をここに書かせてください。

* 僕自身AWSをさわりはじめたのは、ここ数ヶ月。

* 今まで触ったAWSサービス
  * ワークメール
  * SES
  * ECR
  * ECS
  * EC2
  * Lightsail
     * [書評ブログ書いています](https://shymylife.site/)
俺のTortoiseGitのアイコンオーバーレイが表示されないのはTGitCacheがさぼっているからだろうか

グレンジ [Advent Calendar 2018](https://qiita.com/advent-calendar/2018/grenge) 13日目の記事を担当しました、k_kimura_01 と申します。
グレンジでサーバサイドエンジニアをしております。

WindowsでTortoiseGitを使っている方は割といるかと思います。
（ファイル差分確認とかコミット履歴追うのが楽ですよネ）

で、昔はなかった気がするのですがある時から「たまに」アイコンオーバーレイが表示されなくなることが発生するようになりました。
元々表示されるのに時間がかかることはあるのですが、1日中表示されないことがあったり。
（ローカルにクローンしたファイルが多くなってきたからなのかな）

TortoiseGitのアイコンオーバーレイ
![アイコンオーバーレイ.png](https://qiita-image-store.s3.amazonaws.com/0/218917/7531d3de-f61b-ea37-8551-b65b2ec43a30.png)

事象が起きると…
・アイコンが表示されない（だけならまだしも）
・右クリックでメニューを出そうとするとエクスプローラがしばらく応答なしになる
・個別のファイル単位でコミットログが見れなくなる
・PC再起動しても直らないことが多々あった
と、割と不便でした（´・ω・｀）

しばらく放置してたのですが、ふとした拍子に解決方法がわかりました。
（記事のタイトルでだいたいネタバレしてる）

#先に確認しておくこと

Windowsはアイコンオーバーレイが15個までしか表示出来ない仕様らしいです。

なので、TortoiseGit以外のアプリケーションでアイコンオーバーレイが複数使われていて、
レジストリの並び順（優先度）で表示されなくなるパターンがあるとのこと。

TortoiseGit以外にどれくらいアイコンオーバーレイが使われているかは、
設定のオーバーレイハンドラ―を見るとわかるかも。
![オーバーレイの個数確認.png](https://qiita-image-store.s3.amazonaws.com/0/218917/bd33fa49-2743-c032-1419-29a95d2348c4.png)

ここで引っかかってそうな方は、不要なアプリケーションを消すなり、レジストリの優先度の変更なりをお試しください。
（レジストリの優先度変更とかは他の方の記事をご参考ください）

#本題

結論から書くと、TortoiseGitのアイコンオーバーレイを更新してる（と思われる）TGitCache.exeがなんらかの理由で眠ったままの可能性が高いです。

以下、眠れる獅子を起こす2パターンの手順を記載します（どちらもやってることほぼ同じです）

##パターン1：猛る漢の荒療治

まず、タスクマネージャからTGitCache.exeを確認します（CPUも0で眠っていそう）
![TGitCache.png](https://qiita-image-store.s3.amazonaws.com/0/218917/b0a208b4-e08e-15c8-179c-96a81d58fcbf.png)

プロセスの終了をします（ワイルドだろぉ？）
※そんなやり方スマートじゃないですねという紳士な方はパターン2をお試しください。
![プロセスの終了.png](https://qiita-image-store.s3.amazonaws.com/0/218917/d390bbf0-99c5-a0d1-0924-5cc30269cd88.png)

プロセスが終了されたことを確認したら、エクスプローラから任意のクローンしたフォルダへアクセスします。
しばらく待つと、TGitCache.exeが再起動して処理を行い始めます。
![しばらく待つ.png](https://qiita-image-store.s3.amazonaws.com/0/218917/f3097b05-3778-3356-400d-3ae42608fd5a.png)

処理を行い始めた時点で順次アイコンオーバーレイは表示されていくと思いますが、
CPU使用が落ち着いたら作業完了です。

##パターン2：クールな紳士の蘇生術

まず、タスクマネージャからTGitCache.exeを確認します。
TortoiseGitの設定からアイコンオーバーレイを表示して、状態のキャッシュを「無し」にして適用します。
※ちなみに無しだとフォルダにはアイコンオーバーレイが表示されて、ファイルには表示されない状態になります。
![状態のキャッシュ_無し.png](https://qiita-image-store.s3.amazonaws.com/0/218917/4980c5a4-a749-e307-ac61-b1e8db020e89.png)

しばらく待つとTGitCache.exeが消えるので、確認できたら状態のキャッシュを「デフォルト」にして適用します。
![状態のキャッシュ_デフォルト.png](https://qiita-image-store.s3.amazonaws.com/0/218917/9e76ec42-1bfe-7dad-34a4-314cd86c27d8.png)

エクスプローラから任意のクローンしたフォルダへアクセスします。
しばらく待つと、TGitCache.exeが再起動して処理を行い始めます。

処理を行い始めた時点で順次アイコンオーバーレイは表示されていくと思いますが、
CPU使用が落ち着いたら作業完了です。

#おわりに

同じように困ってる人がこれで救われたら幸いです（｀・ω・´）
（もしかしたら自分しか困ってなかった説あるけれど。こういう記事見かけなかったので）