OmniAICreator/Qiita-1.07M huggingface dataset:
サーバの引越しの時にはまずDNSのTTLを短くしておこう

そろそろ平成最後令和最初の大型連休ですね。この機会にウェブサーバを別のサービスに移してみようかな、考えている趣味のサーバー管理者の皆さんも多いと思います。よね？そんな時には、まず自分のホストを指しているDNSレコードのTTLを短くしておいて、引越しが終わったらすぐにアクセスできるようにしましょう。

## DNSにはキャッシュがある
ご存じの通りDNSは浸透しません。でもキャッシュがあります。いろいろな計算機が名前解決をしてからTTL (Time To Live)で指定された有効期間だけ結果をキャッシュするので、その分だけ過去の情報が流通を続けることになります。

引越しをする時には、引越し予定の時刻くらいに世界中のキャッシュの有効期間が切れるようにあらかじめTTLを調整しておくことで、引越し後すぐにサーバにアクセスができるようになります。

## あらかじめTTLを短くしておくことで古すぎる情報のキャッシュを避ける
予定時刻のTTL時間くらい前にTTLを短かくすることで、引越し予定の時刻くらいにキャッシュの有効時間が切れるようにすることができます。キャッシュを短くすることでDNSサーバへの負荷は増えるので、例えば予定時刻が近づくごとにTTLを1/2ずつすることで、負荷の増加を小さく抑えつつ予定時刻にキャッシュの有効期限を合わせることができます:

1. 変えたい`A`レコードや`CNAME`レコードの今のTTLを調べる
2. 変えたい時刻のTTL前頃に、TTLを半分にする
3. 設定したTTL分の時間だけ待ち、TTLを半分にする
4. TTLが60秒くらいになるまで3を繰り返す

TTLが86400秒(24時間)だった場合、引越しの24時間前に43200秒に、12時間前に21600秒に、6時間前に10800秒に、とTTLを短くしていきます。

えー、めんどう、という人は、いきなり60秒にしてしまっても良いかもしれません。AWSのクラシックELBの`A`レコードのTTLはずっと60秒で、DNSはちゃんと機能しているようです。

## 引越しが終わったらTTLを元に戻す
引越しが終わり自分のサーバにアクセスができるようになったことを確認したら、TTLを元に戻しておきましょう。今後しばらく引越しがない場合にはキャッシュを生かしてみんなの負荷を減らしてあげたいものです。

## ネームサーバのTTLは変えられないかも
サーバがお世話になっているサービスの引っ越しをする時にはネームサーバ自体も引っ越したくなるかもしれません。ネームサーバを示す`NS`レコードのTTLは変えられないことも多いようなので、ネームサーバを引っ越す時には、元の`NS`レコードのTTL前までに

1. 引っ越し先のネームサーバに引っ越し元と同じレコードを作成して、
2. `NS`レコードを引っ越し先のものに変更して

おくのが良さそうです。`A`レコードや`CNAME`レコードの変更の時間も見越しておくか、サーバの引っ越し後に`NS`レコードの引っ越しをするのも良さそうです。
ＲＸマイコン別性能（レイトレーシングによる）比較

## 各種ＲＸマイコンによるレイトレーシング

- RX65N Envision kit を標準的にして、他のデバイスも評価しています。
- RX65N, RX72N 以外は、LCD への描画は、ポートバスによるソフトウェアー書き込みになっています。

※RX65N, RX72N はフレームバッファ方式で、ピクセルはメモリに書き込むだけで、描画に関係するオーバーヘッドは最小となっています。

RX65N 以外のマイコンでは、水平ライン描画毎に、計算時間を描画していましたが、ポート経由のソフトウェアーだと、フォント描画がボトルネックになっている事実などがあり、描画終了時（レンダリング時間に影響しない）に表示するようにしています。

※今回、RX64M も加えました。
※最近発売された「RX72N Envision Kit」のベンチマークも追加しました。

## ベンチマーク結果
   
|型番|core|fsqrt命令|動作周波数 [MHz]|ROM|RAM|実時間 [ミリ秒]|価格 [円]|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|---|
|R5F562N8BDFP RX62N|RXv1|✖|96|512K|96K|1860|800 (参考)|
|R5F524TAADFP RX24T|RXv2|〇|80|256K|16K|1224|974 (572/10)|
|R5F565NEDDFB RX65N|RXv2|〇|120|2M|640K|784|1910 (1320/10)|
|R5F564MFCDFC RX64M|RXv2|〇|120|2M|512K|751|2120 (1570/10)|
|R5F566TEBDFP RX66T|RXv3|〇|160|512K|64K|602|900 (700/10)|
|R5F571MFDDFC RX71M|RXv2|〇|240|2M|512K|439|2600 (1940/10)|
|R5F572NNHDFB RX72N|RXv3|〇|240|4M|1024K|361|2200 (1650/10)|
|STM32F756BGT6|Cortex-M7|〇|216|1M|320K|620 (参考)|1820 (1250/10)|
   
※価格は「Chip One Stop」調べの参考価格となっています。

![IMG_1406s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58667/3009c27a-a0af-471c-f954-37d44236a316.jpeg)
![IMG_1638.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58667/04959981-d0e6-fbd1-b315-be0e836214f9.jpeg)

## 備考

- RX72N Envision Kit が発売されたので、追加しました。
- RX66T は最新のコア（RXv3）を採用したマイコンで、家電用のゾーン（モーター制御など）に特化したものですが、高速で価格が安い為、その他の用途にも十分利用出来ると思います。
- RX24T、RX66T は８ビットのポートバスでLCDと接続している。
- RX64M、RX71M は１６ビットのポートバスでLCDと接続している。
- RX マイコンは全般的に浮動小数点の演算が強力で、同価格帯のマイコンに比べて優位と思います。   
  ※通常の命令でも十分高速
- A/D 変換が高速で、ノイズが少なく変換誤差が少ない、変換スケジュールも非常に細かい設定が出来る。
- RXv3 コアで利用出来る、倍精度浮動小数点演算命令には対応していません。
- RX62N（RX621)を追加しました。

![IMG_1412s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58667/16d804a7-f286-2e8e-431b-0331e90afea6.jpeg)

## ソースコード

<a href="https://github.com/hirakuni45/RX/tree/master/RAYTRACER_sample" target="_blank">Github ソースコード、プロジェクト</a>

## コンパイル、起動方法

- 各プラットホームディレクトリに移動して「make」する。
- raytracer_sample.mot が出来る。
- マイコンに書き込む。
【TypeScript】redux-observableでofTypeの型を完全に推論させる


redux-observableの公式で提供されている型定義だと`ofType`の推論ができないので、redux-observableの型定義を拡張してofTypeを推論させる方法について書きます。

ofTypeが推論されると、引数とofType後のActionがなんであるか確定し、payloadが補完されるようになるので便利です。

[![Image from Gyazo](https://i.gyazo.com/7cb37829a8f85b8240232b49e35690d5.png)](https://gyazo.com/7cb37829a8f85b8240232b49e35690d5)

[![Image from Gyazo](https://i.gyazo.com/b5c8b2cc160799dc8526d7ab1f6339b6.png)](https://gyazo.com/b5c8b2cc160799dc8526d7ab1f6339b6)

## サンプルプロジェクト
サンプルプロジェクトを用意したので基本これの真似すればできます。
[akameco/redux-observable-example](https://github.com/akameco/redux-observable-example)
よかったらスターしてください。

## How

では、解説していきます。

### プロジェクトで一つのAction
redux-observableの`ofType`で推論させるためにはまずプロジェクトで共通のAction型を定義する必要があります。Actionの型を定義する方法はたくさんありますが、このプロジェクトでは、`as const`と[redux-actions-type](https://github.com/akameco/redux-actions-type) を使ってActionの型を定義します。

詳しくは、[【redux】as constでaction creatorからActionの型を簡単につくる - Qiita](https://qiita.com/akameco/items/84df3a7b5c75cb1939d9) を読んでください。

src/actionType.ts

```ts
import { ActionType } from "redux-actions-type";
import * as actions from "./actions";

export type Action = ActionType<typeof actions>;
```

### redux-observableの型定義の拡張
Actionの型を利用し、redux-observableの型定義を拡張します。Action型が一つなので、`Extract`を使い`ofType`引数から戻り値の型が推論されるようになります。

src/@types/redux-observable.d.ts

```ts
import { Action } from "../actionType";
import { Observable } from "rxjs";

declare module "redux-observable" {
  function ofType<ActionType extends Action["type"]>(
    ...key: ActionType[]
  ): (
    source: Observable<Action>
  ) => Observable<Extract<Action, { type: ActionType }>>;
}
```

### Epic型の定義

最後に`Epic`型を定義しましょう。これを利用することで`ofType`の推論が効くようになります。あとは、プロジェクトに合わせて必要であればStateやDependenciesを設定するとより補完が便利になるでしょう。

src/typeRoot.ts

```ts
import { Epic as _Epic } from "redux-observable";
import { Action } from "./actionType";

export type Epic = _Epic<Action, Action>;
```

### Enjoy!
これで、`ofType`入力時の補完と`ofType`後のActionが推論されるようになりました。
あとは補完が効く環境で`Epic`を書くだけです。Enjoy！

```ts
import { of } from "rxjs";
import { delay, mergeMap } from "rxjs/operators";
import { combineEpics, ofType } from "redux-observable";
import { Epic } from "../../typeRoot";
import { increment } from "./actions";

const incrementAsync: Epic = action$ =>
  action$.pipe(
    ofType("incrementAsync"),
    mergeMap(action => of(increment()).pipe(delay(action.delay)))
  );
```

[akameco/redux-observable-example](https://github.com/akameco/redux-observable-example)

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">redux-observableのofTypeを完全に推論させる例 <a href="https://t.co/Nw4Voqy9wn">https://t.co/Nw4Voqy9wn</a> <a href="https://t.co/H36oOftUT1">pic.twitter.com/H36oOftUT1</a></p>&mdash; あかめ@孤独に歩め。悪をなさず、求めるところは少なく。林の中の象のように.js (@akameco) <a href="https://twitter.com/akameco/status/1120403771572531208?ref_src=twsrc%5Etfw">April 22, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
tmuxのウインドウ数を抑える工夫

## 概要

tmuxはウインドウ数が多くなりがち...
そんな時は、Ctrl-zを使って、なるべくコンソール上のウインドウを増やさないようにしよう！

今回は、tmuxを使って説明してますが、tmuxなどを使ってない人（terminalを普通に使ってる）にも使える手法だと思います。

## どういう状況で無駄なウインドウが増える？

例えば、コンソール上にて、`nvim test.md` を実行していて、ファイルを編集していたとしましょう。

（ややこしくなるので、vim上でコマンドを実行出来る環境を揃えていないということにして下さいw）

編集している時に、コンソール上で、あるコマンドを一つ打ちたくなりました...

そういう場合、僕は今まで、
- ウインドウやペインを増やして、その新しいウインドウ, ペインでコマンドを実行するか
- 一度vimを閉じて、そのvimを閉じたウインドウで、コマンドを実行してました

僕は、tmuxを使っているのですが、すぐにウインドウやペインを増やしがちです...
必要なウインドウなら良いのですが、コマンドを一つ二つ打ちたい為に、すぐにウインドウを増やしてしまうと、
移動も面倒ですし、後ほど削除するのも大変です...

## 解決策
### Ctrl-zを使えばいいじゃないか！？

Ctrl-zを使えば、
Unuxのプロセスを一時停止することが出来ます。

vimを実行している画面で、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/3298d2b9-10b4-9ee8-1ccf-c8c3311fc837.png)

Ctrl-zを使ってみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/95ee8207-6d56-e132-572b-022d01d4f619.png)

すると、このように vimを開く画面を一時的に停止することに成功します。
そして、vimを開いていたコンソールが空き、コマンドを実行出来る状態になるので、実行したかったコマンドを実行します。

### 一時停止したジョブの確認

`$ jobs` コマンドを実行することにより、`nvim test.md` というvimを開くジョブが一時停止された状態で存在することが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/3251c859-0054-156c-c3a0-daee685f01ff.png)

### 一時停止したジョブの再開

コマンドを実行した後は、vimを開いていた画面に戻りたいとします。

その場合は、
`$ fg`
を実行してあげるだけで、最初のvimに戻ることが出来ます。

もしも、複数のジョブが存在した場合は、
`$ fg %ジョブ番号` を実行して上げれば、対象のジョブを再開することが出来ます。

### まとめ

このようにLinuxのコマンドを利用することによって、普段のターミナル生活をより一層便利にしましょう！

## 参考

Ctrl-zなどのコマンドの意味が詳しくまとまっています。

https://qiita.com/toshihirock/items/bc6a9a4091afa9bb61f1
LibreOfficeがものすごく重い件


# libreoffice が遅い

自宅では今更MS Officeを買ったりする金銭的余裕がないので、Libreofficeを使っているのですが、いつの頃からかものすっごく重くなっており、Excel（Calc）でセルをカーソルで移動するのも悶絶するぐらい遅くなってました。


# Libreoffice の更新

6.1.1 だったのですが、その時点の最新が6.2.3だったので、Downloadしてインストール。

https://www.libreoffice.org/download/download/?lang=ja&version=6.2.3

追記： win7 32bit版だと6.2.3のインストールに失敗するが、6.2.2であればうまくいくようだ。

#  JREも入れてみる。

いろいろ設定をいじっていると、JREが入ってなさそうだったのでこちらもインストール。とおもったのですが、配布方法がかわってて単独インストールができなくなっているようでした。 が、Oracleさんにレジストするといけそうだったのでレジストしてみます。

https://www.oracle.com/technetwork/jp/java/javase/downloads/jre8-downloads-2133155.html

このあたりから、OSとCPUアーキに合わせてモジュールを選択すると、OracleProfileというのを入力する画面に飛ぶので、そこでレジストするとDownloadが始まります。

Download後、インストール。

# 設定を変更
LibreOfficeを起動して、まずJREが認識できていることを確認します。 ツールー＞オプション－＞詳細、と開くと、 自動でJREのインストール先を探しにいって、数秒で表示されました。
![libreoffice-jre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403638/847ad330-2098-d517-7d19-b477569f74bc.png)

さらに、熟練者用設定（ExpertMode）を開き、以下のようにCacheサイズを変更。

![libreoffice-expert.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403638/2704aba4-8ed3-9783-6b80-e5835f7b0d1b.png)

以上の設定で、普通のエクセル並みに快適にうごくようになりました。

設定は以前から入れていたのですが、それでも重かったので、バージョンアップが効いたのかJREが効いたのかよくわかりませんが、とりあえず良しとしておきます。
Capistrano3 でrailsのログを tail -f する

capからでもログを終えるようにしておくと意外と便利なので備忘録も兼ねて投稿しておきます。
# 環境
Capistrano 3.10
# コード
```ruby:deploy.rb
set :format_options, truncate: false

namespace :log do
  desc "tail log"
  task :tail do
    on roles(:app) do
      execute "tail -f #{shared_path}/log/#{fetch(:rails_env)}.log"
    end
  end
end
```

tailコマンドをexecuteするだけです。
`set :format_options, truncate: false`はCapistrano3で有効になるログの省略を無効化しています。必須ではないですがログを見るときは省略されてしまうとまずいので設定しておくと良いです。

```bash
$ bundle e cap log:tail
︙
01 I, [2019-04-23T02:57:49.673509 #292]  INFO -- : [a64c8da5-4ee1-44f5-8592-7fffc4dbcb72] Rendered text template (0.0ms)
01 I, [2019-04-23T02:57:49.673509 #292]  INFO -- : [a64c8da5-4ee1-44f5-8592-7fffc4dbcb72] Completed 200 OK in 3ms (Views: 0.4ms | ActiveRecord: 0.6ms)
︙

```

## 追記
ホストが複数ある場合は以上の方法ではどのホストのログか判断できません。
xargsが使える環境では以下のように書けばホスト名が一緒に表示できます。

```ruby:deploy.rb
set :format_options, truncate: false

namespace :log do
  desc "tail log"
  task :tail do
    on roles(:app) do
      execute "tail -f  #{shared_path}/log/#{fetch(:rails_env)}.log | xargs -L1 echo [`hostname`]"
    end
  end
end

```

## 追記2
Airbrusshを利用しているならモンキーパッチでホスト名を表示することもできます。
以下のように書けば色分けできるので見やすいです。
今のところ[標準で対応することはない](https://github.com/mattbrictson/airbrussh/issues/98)らしいので、見栄えは悪いですが割り切るしかないですね。

```ruby
module Airbrussh
  class CommandFormatter < SimpleDelegator
    @@colors = {}

    def format_output(line)
      host = user_at_host
      @@colors[host] ||= Airbrussh::Colors::ANSI_CODES.keys[@@colors.size]
      host = send( @@colors[host], "[#{host}]" )
      "#{number} #{host} #{line.chomp}"
    end
  end
end
```
VSCodeのMarkdown PDF拡張機能のヘッダー・フッターの生成を止める方法

設定ファイル(settings.json)に以下の設定を追記します．

```json
{
    "markdown-pdf.headerTemplate": "<span class='title' style='display: none;'></span>"
    "markdown-pdf.footerTemplate": "<span class='title' style='display: none;'></span>"
}
```

（参考URL：https://coderwall.com/p/7vkrpw/remove-headers-from-pdf-files-generated-by-the-markdown-pdf-vscode-extension）
ドットインストール　PHP入門まとめ

変数：データに付けるラベル
phpにおける＝の意味　右辺を左辺に代入するという意味

データ型：
文字列
論理値
数値
配列
オブジェクト
null

var_dump：これで指定したものがどの型なのか教えてくれる

定数：変更されない値につけるラベル
定数名、大文字を使う

defineを使用

var_dump(__LINE__);行数
var_dump(__FILE__);ファイル名
var_dump(__DIR__);ディレクトリ名

if条件分岐
echo
elseif
elseで分けれる
比較演算子
> < >= <= == === != ¡==
論理演算子
and &&
or //
not !

falseになる場合
文字列；空、”0”
数値；0,0.0
論理値；false
配列；要素の数が0

switch条件分岐:いくつかの条件がある時に使える

case
echo
break

また、caseで同じ条件で２個使いたいときは、
case
caseと羅列すると良い

ループ処理について
while(条件）{
}
前処理

do{
}while(条件）
後処理

for文の中身
(ループが始まる前の初期化処理,ループが終わる条件,ループの処理が終わるごとに行う条件){
break:ループを抜ける
continue:それ以降の処理行せずに次のループ処理を続ける
}

配列について
key valueを用いる
key=>valueとする

$sale=array{
"taguchi"=>200,
"yamada"=>100,
};

foreach($取り出したい中身 as $key=>$value){
echo"($key)$value";
}

foreach($color as $value);
echo"$value";
endforeach;

function sayHi(){
echo "hi!";
}
これで機能の定義完了

呼び出したい時

sayHi();

引数を定義（"この中に入力"）;

function sayHi($name){
echo "hi!".$name;

sayHi("Tom");
sayHi("Bob");
}

return；呼び出し元に値を返す

変数は、{
}
この関数内だけで使用できる

classが持つ変数：Property 
classが持つ関数：Method

classは定義しただけ

classを元に実際にデータを持たせたオブジェクトのこと：インスタンス

インスタンスを作る際には、$bob=new User("")と定義することが必要

クラスの中のProperty,methodにアクセスするためには、this->を使う

クラスの定義ー＞インスタンス化

クラスの継承
class 子クラス　extends User {

private：そのクラス内からのみアクセス可能
protected：そのクラス＋親子クラス内からのみアクセス可能
public ：どこからでもアクセス可能

static インスタンス化しなくても表示される

インスタンス化する場合、
例
public static $count=0;

$tom=new User("Tom");
$bob=new User("Bob");
echo User::$count; //2が表示される

クラス内からクラスを指定する場合、

self::

interface 複数実装できる　
抽象クラス　複数実装できない　implements

インターフェース；このクラスでは、このメソッドを必ず実装してくださいよ、というルールを定義するための仕組み

外部ファイルを読み込む方法
require_once

session:cookieと同じようにアクセスしてきたブラウザに応じてデータを保存できる仕組み
ブラウザ側ではなく、サーバ側に保存できる仕組み

例
session_start();
$_SESSION['username']="taguchi";
echo $_SESSION['username'];
パラメトリシティを使って自由モノイドが構成できることの証明

# パラメトリシティを使って自由モノイドが構成できることの証明


## 目的

この記事では、以下のように定義した`FM`が、一定の条件のもとで自由モノイドになっていることをパラメトリシティを使って証明したい。

動機としては、https://qiita.com/lotz/items/424abee02fe598c60247 のコメント欄における$\bar f$の一意性についての議論に答えを出したかった。

```haskell
{-# LANGUAGE RankNTypes #-}
module FM where

newtype FM a = FM { runFM :: forall m. (Monoid m) => (a -> m) -> m }

instance Semigroup (FM a) where
  FM a <> FM b = FM (\k -> a k <> b k)

instance Monoid (FM a) where
  mempty = FM (\_ -> mempty)

embed :: a -> FM a
embed x = FM (\k -> k x)

foldMap :: (Monoid m) => (a -> m) -> FM a -> m
foldMap f (FM g) = g f
```

## 前提条件

以下を仮定する。

* Free theoremが成立するようなHaskellのサブセットで考える。具体的には、`seq`と⊥については考慮しない。
* 関数の外延性を仮定する。つまり、同じ引数に対して同じ値を返す関数は、実行効率などの点で違いがあっても、同じとみなす。

また、証明の中では`newtype`を付けたり外したりする関数`FM`と`unFM`を省略して書く。

## 命題0

`foldMap f`はモノイド準同型である。

### 証明

定義を展開すれば分かる。

## 命題1

`f`が関数で、`u`がモノイド準同型であるとき、

```
foldMap (u . f) = u . foldMap f
```

### 証明

型`forall m. (Monoid m) => (a -> m) -> m`についての[free theorem](https://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf)を計算すると、この型の項`t`は以下の性質を満たすことが分かる。

```
任意の関数fと、任意のmemptyと(<>)を保存する関数uについて、t (u . f) = u . t f
```

ただし、「`u`が`mempty`と`(<>)`を保存する関数である」とは、任意の`a`、`b`について以下が成り立つことである。

```
u mempty = mempty
u (a <> b) = u a <> u b
```

`u`はモノイド準同型だから、`mempty`と`(<>)`を保存する。`foldMap`の定義を使うと、示すべき命題が示される。

## 命題2

任意の`f`について、

```
foldMap f . embed = f
```

### 証明

定義を展開すれば分かる。

## 命題3

```
foldMap embed = id
```

### 証明

`foldMap embed g f`を変形していく。

```
foldMap embed g f
= {foldMapの定義を逆向きに使う}
  foldMap f (foldMap embed g)
= {命題1を内側のfoldMapに適用する。命題0よりこれは許される}
  foldMap (foldMap f . embed) g
= {命題2}
  foldMap f g
= {foldMapの定義}
  g f
```

外延性の仮定から、`foldMap embed = id`がいえる。

## 命題4

`FM a`は`a`をアルファベットとする自由モノイドである。

### 証明

「任意の`f`について、`h . embed = f`を満たすモノイド準同型`h`が唯一つ存在する」を示せばよい。

このような`h`が存在して、`foldMap f`で与えらえることは命題2と命題0から分かる。

次に一意性を示す。このような`h`が他にも存在したとすると、

```
foldMap f
= {仮定より}
  foldMap (h . embed)
= {命題1}
  h . foldMap embed
= {命題3}
  h
```

従って、このような`h`は全て`foldMap f`に等しく、よって一意である。これで証明できた。
Create React AppはまだMarkdownを簡単にLoadする手段がない

# 概要

Create React App（以下、CRA）は知識がなくてもReactアプリを構築してくれる優れもの。
難しいことは識者が対応してくれているので、ユーザーは使っているだけで恩恵を受け続けれる。
だからCRAはイジェクト(CRAが中で持っている設定ファイルを取り出し、以降自己管理)したくない。
イジェクトすれば簡単にMarkdownファイルを読めるんですが、イジェクトしないとちょっと個別対応が必要になるというお話。

# 読者対象

- MarkdownをReactで読み込みたい
- CRAのイジェクトは絶対にしたくないでござる
- CRAのイジェクトせずに設定ファイルをカスタムできるパッケージも導入したくないでござる

# 経緯

## 読み込む方法について議論されていた模様

再処知らずにmdを読み込んだところ、デプロイ時のファイルパス？の文字列が取得( ﾟДﾟ)ﾊｧ?

```javascript

import doc from './doc.md';
```

これはどういうことだ？と思ってググってみると、どうやらCRAがMarkdownを読み込むための手段を提供できていない模様。
どう提供するかをいろいろ議論していることが判明。
関係ないが議論の過程でSVGについては、サポートするようになった模様。
https://github.com/facebook/create-react-app/issues/3722

もしwebpackの設定ファイルにアクセスできる場合、webpackにraw-loaderというパッケージがあるので、mdファイルの場合にそれを介してやると、簡単にファイルの中身を読み込める。


## 私はこうしておいた

fetchAPIを使って非同期で取得するのも手段の一つ。
理由を失念したが、私はそれについては不採用。
https://stackoverflow.com/questions/42928530/how-do-i-load-a-markdown-file-into-a-react-component

イジェクトはしたくないし、webpackの設定取り出すパッケージも公式のものじゃないなら気が進まない。
ということで、前述の議論の内容をみて、紹介されていた中の一つであるraw.macroというパッケージを採用することに決定。
バンドルサイズが小さく、chunkファイルになるので、アプリ本体から切り離せるのがいい。
https://github.com/facebook/create-react-app/issues/3722#issuecomment-458124126


# まとめ

CRAがmdファイルをサポートできていないのが意外だったので、簡単であるが経緯の記録としてまとめておいた。
もし将来mdファイルをサポートしたら、おそらくCRAの公式ドキュメントのこのページ、もしくは同階層に新しいページができて、そこに記述されると思われる。
https://facebook.github.io/create-react-app/docs/adding-images-fonts-and-files
各自の環境に適した方法で対処しておき、CRAが手段を提供するのを長い目で見守りましょう:sweat:
Ubuntu だとcdの打ち方にコツが必要なことに今更気づいた

AWS docsに従い、Windows Subsystemをインストールしました。（通称WSL）

あら？cdでディレクトリを指定しても開けない。。。なぜ？
権限変更とかやってみました。

うーん。。意味なし。。なんでだ？と思ったら場所が違うんですね～。師匠教えていただきありがとうございました。

参考にしたのはこちら↓
https://qiita.com/funafuna/items/c3bb78a546cf2605205d
勉強になりました。



nodejsのバージョンの仕方もついでにまとめときます

http://www.tohoho-web.com/ex/nodejs.html#install
> $ sudo apt-get update               必要に応じてパッケージをアップデートする
$ sudo apt-get install nodejs       Node.js をインストールする
$ sudo apt-get install npm          npm をインストールする
$ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 8.10


バージョン指定
https://www.trifields.jp/how-to-install-node-js-on-ubuntu1604-2680
背景画像が表示されない

css内で

```admin.scss
background-image: url('../images/XXX.png');
```
と記述しても背景画像が表示してくれない、、、
相対パスをしっかりとurlに指定しているのに何故？と途方にくれていました。

調べてみるとLaravel MixはWebpackに構築されている為、
cssコンパイルをする際に```url()```の中身を書き換えて最適化する機能があるみたい、、、



Laravel MixとWebpackが```XXX.png```を見つけると```public/images```にコピーしてから```url()```の中身を以下のように書き換えてしまう。



```admin.scss
background-image: url('../images/XXX.png');
                    ↓ (書き換え)
background-image: url(/images/XXX.png?d41d8cd98f00b204e9800998ecf8427e);
```

※但し、絶対パスを指定すると書き換えは行われません。

```admin.scss
background-image: url('/images/XXX.png');
background-image: url('http://XXX.com/images/XXX.png');
                    ↓ (書き換えされない)
background-image: url('/images/XXX.png');
background-image: url('http://XXX.com/images/XXX.png');
```

便利な機能みたいだけど、恐らくこれのせいでうまく背景画像が表示されなかったみたいでした。
なので```webpack.mix.js```に

```
.options({
  processCssUrls: false
 });
```
を書き足すことで書き換える機能が停止して
無事、背景画像が表示されるようになりました！


参考記事
-
https://readouble.com/laravel/5.5/ja/mix.html
ありがとうございました！
相互includeが上手くいかない(C++)

## どういうわけか"does not name a type"
今日ハマった話。こういうのは「そりゃそうだ！」という結論が待ってます。

### きちんとincludeして、多重も避けているのに"does not name a type"になってしまうのは何故だ

hoge.h

``` c++
#include "pugya.h"
class Hoge
{
    Pugya pu;
    void func(void);
};
```

pugya.h

``` c++
#include "hoge.h"
class Pugya
{
    using HogeFunction = void(Hoge::*)(void);
};
```
このような相互関係のあるクラスを作り相互にincludeさせようとすると上手くいきません。 **もちろん多重includeを避けるロジックは入れておきます。**
気付けば当たり前だけど片側のソースコードのみを見ていると全く分からないこの問題。

hoge.cppをコンパイルするときに、まずhoge.hをincludeして、その中からpugya.hをincludeしますよね。するとpugya.hからhoge.hはincludeされないわけです。class Pugyaの定義を開くときにHogeは未定義(未宣言)になっている、というのが答えでした。

従って解決策は、プロトタイプで済む方の#includeを止め、プロトタイプ宣言にする、です。

pugya.h

``` c++
class Hoge;    // プロトタイプ宣言
class Pugya
{
    using HogeFunction = void(Hoge::*)(void);
};
```

気付いたときの脱力感がすごかった...
[PHPUnit]あるクラスの指定のメソッドのみをmockするやり方

#概要
PHPUnitのテストをやっているとやっぱりmockを使えると便利ですよね！
ということでmockを使ったテストのやり方についてです
#さっそくやってみる
まずこんな感じのテストしたいクラスがあることにしましょう。

```php:target.php
class Target{

    private $otherClass;

    public function construct(OtherClass $otherClass)
    {
        $this->otherClass = $otherClass;
    }
    
    public function start()
    {
        //ここで色々な処理があるとする
        try{
            $result = $this->next();
            return $result;
        }catch(Exception $e){
            return false;
        }
    }

    public function next()
    {
        //なんらかの処理をしてその結果を返す
        $processResult = $this->process();
        if($processResult === true){
            return true;
        }else{
            return false;
        }
    }
}
```
コンストラクタのインジェクションで別のクラスが注入されてて、start関数がnext関数を呼んでいるとしましょう。
start関数は色々な処理をした後にnext関数を呼んでいて、next関数はなんらかの処理をしたあとその結果を返します。

このときに、next関数だけをmockにしてstart関数はそのままの状態でテストしたかったのでこう書きました！

```php:test.php
class Test{
    
    public function test001()
    {
        //makePartialを使うことでshouldReceiveを設定したクラスのみをモックにすることが可能。mockの第二引数はコンストラクタ
        $targetClassMock = Mockery::mock(Target::class, [OtherClass::class])->makePartial();
        //next関数が呼ばれたらtrueを返すようにモックを設定する
        $targetClassMock->shouldReceive('next')->andReturn(false);
        //start関数をコール
        $ret = $targetClassMock->start();
        //Trueであることを確認
        $this->assertTrue($ret);
    }
}
```
また、next関数で例外が発生したときに、それがちゃんとキャッチされてreturn falseを返せるかも確認したいです。
そういうときはこう書きます。

```php:test.php
class Test{
    
    public function test002()
    {
        //さっきと同じ
        $targetClassMock = Mockery::mock(Target::class, [OtherClass::class])->makePartial();
        //next関数が呼ばれたらエラーが発生するようにモックを設定する
        $targetClassMock->shouldReceive('next')->andThrow(new Exception('test002だよ');
        //さっきと同じ
        $ret = $targetClassMock->start();
        //falseであることを確認
        $this->assertFalse($ret);
    }
}
```

まだまだ他にも奥が深そうですが、自分がやりたいことは一旦できたので共有ここまで。
もっと色々と手を出してみたいですね！
Cython使用時の型のキャスト

# はじめに
Cythonを使用してコードを書いていた時、型に関する初歩的なミスに気付くまで少し時間をかけてしまったので自戒を込めて記事を書くことにしました。

# 内容
Cythonを使用して高速化したいコード中で小数の結果を得たいのにint型の数aと同じくb(ただし$a < b$)の割り算をした時に結果が0になる仕様に気付かずに時間をかけた。
具体的に次のようなb.pyxとbの関数fを呼び出して結果を表示するaがある場合関数f内のa/bはint型の同士の割り算なので結果もint型となります。

```python:a.py
import pyximport; pyximport.install()
import b

print(b.f(2, 3))  # 0
```

```cython:b.pyx
cpdef f(int a, int b):
    return a / b  # C言語でのint型同士の割り算と同じ
```

# 解決策
キャストにより解決できるがCythonでのキャストはキャストしたい変数の前に<型名>を記述する。

```python:a.py
import pyximport; pyximport.install()
import b

print(b.f(2, 3))  # 0.6666666666666666
```

```cython:b.pyx
cpdef f(int a, int b):
    print(type(a))  # <class 'int'>
    print(type(<double>a))  # <class 'float'>
    return <double>a / b  # 結果はfloat型になる
```

# おわりに
文法がほとんどPythonと同じなので意識から外れていたけど型指定してC言語に変換してコンパイル、実行してるから考えれば当然だなと思いました。
コードを少し変更するだけで実行速度を速くしてくれるCythonに感謝。
Python手遊び(Excel to CSV - powered by xlrd)

#この記事、何?
ついこの前あれこれ投稿した中の一つでExcelからcsvを作りたいというのを書いた。
C#で書いてみたんだけど、悔い改めてPythonで書き直した。

いやぁ・・・だって、すごーーく遅かったんだもの。
たぶん、あとで原因分析やります。トラブルシューティングの事例ということで。

で、Pythonで20行ほど書いておしまい。
しかも、ほとんどはほかの方のコードの流用。。。

いや、いいんだ。Excelからcsvが欲しいということ自体が目的なので。。。


##参考資料

■PythonでExcel
https://qiita.com/fukuit/items/f28ae581cd199fc30e0b

#仕様を一言
ハードコーディングの対象ファイルのシートを全部csv化する。
(※Tabで区切ったのでtsvといえ、という話もあるかもですが。。。)


#出来上がり

```python
import xlrd
import os.path
import numpy as np
xlfile = "test.xlsx"

#テキストファイル出力
def write_text(filepath, lines):
    with open(filepath, 'w', encoding='utf-8') as f:
        for line in lines:
            f.write(line + '\n')

if os.path.exists(xlfile):
    xls = xlrd.open_workbook(xlfile)
    for sheet in xls.sheets():
        nrows = sheet.nrows-1
        ncols = sheet.ncols 
        lines = []
        for r in range(1, nrows+1):
            line = ''
            for c in range(0, ncols):
                line += str(sheet.cell(r,c).value) + '\t'
            lines.append(line)
        
        write_text(sheet.name, lines)

```

#感想
C#で奮闘したのって何だったんだろうねぇ・・・
ありがとうPython、ありがとうQiita。

参考資料の投稿されたfukuitさん、ありがとうございます！
C#でVBの「With」風な記述をしてみる


# 前置き
ふっふっふ。
本当は`C#`の`using`ステートメント的な記述をイメージしているんですよ。
でも、`With`って云った方が喰い付きが良い様な気が…
でも結局はC#のキーワードには存在しない`「With」`の方が実装には便利だったりしてね。

# 背景
すまん。
私、VB使いではないので`「With」`じゃなくて、`using`の方で説明させて下さい。
どういう事かと云うと―

```csharp
using(FileStream fs = new FileStream(FileName, FileMode.Open)) {
	fs.Name～
	fs.Length～
	fs.Position～
}
```
ってやると、`using`ブロック内だけで有効な変数`fs`が定義される。
ま、本当の意味は、リソースの廃棄が必要なオブジェクトの生存期間の明示的な記述を言語文法レベルでサポートしている、と云う事ですね。
でも、リソースの廃棄が必要なオブジェクトでないとこの書き方はできない（`＝IDisposable`を継承している必要がある）ので例えば―

```csharp
using(Rectangle rect = new Rectangle(x, y, w, h)) {
	rect.Bottom～
    rect.Right～
}
```
みたいな使い方はできない。
<br>
例が悪くて申し訳ないですけど、こんなことが出来たらいいのになー
と思った事は一度や二度ではない筈。

# で、どうするか
`Extension`ですよ。

```csharp
public static class ExtentionClass  {
    public static void With<T>(this T Me, Action<T> action) => action(Me);
}
```
ってのを定義しておくと

```csharp
	listView1.Items[index].With((obj) => {
		obj.SubItems[0].Text = "aaa";
		obj.SubItems[1].Text = "bbb";
		obj.SubItems[2].Text = "ccc";
	});
```
こんな感じで`listView1.Items[index]`のインスタンスを`Withブロック`内に閉じた`obj`の名前で参照できちゃいますね。
だいぶ`With`に近くないですか？
<br>
一方`using`の書き方からはちょっと離れちゃってる感じがしなくはないですけど、やりたい事は出来ているのでこれで良いよねー
って思いました。
【初心者】AWS Connect を使ってみる (Connect + Lambda + DynamoDB + SNS)

# 目的
- AWS connectについて仕事上の相談があり、勉強（知ったかぶり）のため、基本動作を確認することにした。
- AWS connect単体ではさびしいので、少しだけ他のサービス(Lambda/DynamoDB/SNS)と連携させて検証することにした。


# AWS Connectとは（自分の理解）
- 電話番号、着信時の処理（自動応答、オペレータ転送等）機能がSaaSとして提供され、自由に設計、構築できるサービス。

# やったこと
以下を実現する。

- DynamoDBに名簿(電話番号と名前のリスト)を用意しておく。
- ユーザがConnectが用意する電話番号に電話をかける。
- Connectで、ユーザの発信者番号を取得し、Lambdaを呼び出し、DynamoDBを検索する。電話番号が存在したら、それに紐づく名前を取得する。
- DynamoDBから取得した名前を使って、「xxさんですね」と応答する。
- 発信者に対し、SMS(お礼のメッセージ)を送信する。

# 構成図

![kousei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c47c99f4-cf3a-5876-3f17-5cd51ca8d69f.png)



# 手順
- DynamoDB(名簿)の用意
    - 以下の感じで、電話番号(PhoneNumber)と名前(Name)の表を用意する。
    - PhoneNumberをプライマリーキーとする。

![DynamoDB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c502252a-f811-0e07-5ef8-c70516024ace.png)


- Connectの設定
    - 電話番号を取得する。
    - 問い合わせフローを作成し、電話番号と紐づける。
        - 電話番号の取得や問い合わせフローの作成は以下のクラメソブログを参照。 [【東京リージョン】Amazon Connectでコンタクトセンター構築はじめの一歩](https://dev.classmethod.jp/cloud/aws/hello-connect-tokyo-region/)
    - 問い合わせフローは以下の感じ。日本語モードにして、「電話してくれてありがとう」と音声出力して、Lambdaを呼び出して、NameがDynamoDBにあれば、名前を「トーマスさんですね」と音声出力して終わり。
        
![toiawase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/34f6f566-1522-02a1-98a9-0a9789ad30ad.png)

- Lambdaコード(python)の作成
    - connectから発信者番号をもらって、DynamoDBを検索して、Nameを返すLambdaを作成する。
    - Lambdaには適切な権限(DynamDB等にアクセス可能な権限)を付与する。
    - Lambdaにはトリガーの設定(Connectからの呼び出しを許可する設定)をCLIで行う(2019/4時点でCLIでの設定が必要)。ConnectからのLambda呼び出しについては以下のクラメソブログを参照。[【Amazon Connect】 問い合わせフローの中でLambda関数を実行する](https://dev.classmethod.jp/cloud/aws/amazon-connect-lambda/)

```python:mksamba-connect-to-lambda
import json
import boto3
from boto3.dynamodb.conditions import Key

def lambda_handler(event, context):
    #受け取ったJSONを確認
    eventdata = json.dumps(event)
    print(eventdata)

    #電話番号を抜き取り
    InputPhoneNumber = event["Details"]["ContactData"]["CustomerEndpoint"]["Address"]
    print(InputPhoneNumber)

    #dynamodbにアクセス
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table("mksamba-connect-userdb")
    
    #connectからもらった電話番号がDBにあるか検索
    querydata = table.query(
      KeyConditionExpression = Key("PhoneNumber").eq(InputPhoneNumber)
    )
    print(querydata)
    
    #なければunknownを返す
    if querydata["Count"] == 0:
        username = "unknown"
        
    #あれば電話番号に紐づく名前を返す
    else:
        username = querydata["Items"][0]["Name"]
        print(username)
        
        #相手の電話にSMSを送る
        sns = boto3.client("sns")
        sendmessage = "Thank you for calling."
        sns.publish(
            PhoneNumber = InputPhoneNumber,
            Message = sendmessage
        )

    resultdic = {"Name":username}
    return resultdic
```

# 所感
- Connectの初歩的な設定は分かったので、音声認識／合成等、別の機能も触っていきたい。

# その他参考にした記事
[Amazon Connect | Lambda関数からデータを返す方法]
(https://hacknote.jp/archives/50307/)
[PythonでSESでemailを、SNSのSMSでショートメッセージを送信する](https://qiita.com/is_ryo/items/582656e41ffc7a8dbb5c)
本番環境でrake db:seedを使ったデータ投入

rake db:seedでデータ投入した際、開発環境ではデータは入ったのですが、
本番環境でデータが入らなかったので、その記録です。

#課題　（以前の記事）
```rb
lady = Category.create(:name=>"レディース")

lady_tops = lady.children.create(:name=>"トップス")
lady_jacket = lady.children.create(:name=>"ジャケット/アウター")

lady_tops.children.create([{:name=>"Tシャツ/カットソー(半袖/袖なし)"}, {:name=>"Tシャツ/カットソー(七分/長袖)"},{:name=>"その他"}])
lady_jacket.children.create([{:name=>"テーラードジャケット"}, {:name=>"ノーカラージャケット"}, {:name=>"Gジャン/デニムジャケット"},{:name=>"その他"}])

```

```
$ rake db:seed
```
```
1	レディース	NULL
2	メンズ	NULL
：
13	その他	NULL
14	トップス	1
15	ジャケット/アウター	1
：
19	その他	1
20	Tシャツ/カットソー(半袖/袖なし)	1/14
21	Tシャツ/カットソー(七分/長袖)	1/14
22	シャツ/ブラウス(半袖/袖なし)	1/14
23	シャツ/ブラウス(七分/長袖)	1/14
：
```
レコード投入完了！
（のはずが、、）
↓
↓

本番環境（Ec2上）で実行したがデータが入らない。。。

#解決

seedでデータを投入する際は環境の指定をする必要があるようです。

テスト環境では

```rb


rake db:seed RAILS_ENV=test
```

本番環境では

```rb
rake db:seed RAILS_ENV=production
```



これで大丈夫かと思いましたがこれだけではまだ投入できませんでした。

/var/www/アプリ名/current まで移動して実行すればデータ投入ができました。

```
 cd current
```
↓

```rb
rake db:seed RAILS_ENV=production
```


方法はわかったのですがなぜcurrentに移動すればデータが入るのか、理由がまだわかっておりません。


理由等、ご存知の方がいましたらご教示ください:no_mouth:
 

#参考記事
http://d.hatena.ne.jp/seinzumtode/20150715/1436962405
https://g1034725.hatenablog.com/entry/2018/12/25/213044
https://qiita.com/naoki_mochizuki/items/657aca7531b8948d267b#capistrano%E3%81%AE%E5%B0%8E%E5%85%A5

上記記事の通りにコマンドを打っただけなので、記事にするほどではないですが、、、
GameObjectを円運動させてみた2

###１． 2を作ろうとした経緯
Unityの勉強しているときにRotateAroundが出てきて、以前の投稿とは別の方法で円運動させていることから、復習もかねて作りました。2種類の方法を使い違いを調べます。

GameObjectを円運動させてみた
https://qiita.com/uroshinse/items/b167a411ce2168e0c5a0

###２．RotateAround
~~~C#
public class Circle1 : MonoBehaviour {

    //円運動の中心となるGameObject
    [SerializeField] GameObject center;
    //円運動の速度
    float speed = 20;

	// Update is called once per frame
	void Update () {
        
        //RotateAround(円運動の中心,進行方向,速度)
        transform.RotateAround(center.transform.position, 
        transform.forward, speed * Time.deltaTime);

	}
}

~~~

メソッドで中心の定義ができる。スクリプトのアタッチは円運動させたいGameObject。

###３．MovePosition

~~~C#
public class Circle : MonoBehaviour {

    //円運動させたい物体。Rigidbodyをコンポーネントさせておく
    [SerializeField] Rigidbody rbody; 
    //速度を設定
    private float speed =1.0f;
    //半径を設定
    private float radius =2.0f;
    
    //float型を定義しておく
    float movex;
    float movez;
	
	// Update is called once per frame
	void Update () {
        //movex(Sin波）・moveZ座標(Cos波）の指定をしておく。わからないときは三角関数を調べる。
        movex = radius * Mathf.Sin(Time.time * speed);
        movez = radius * Mathf.Cos(Time.time * speed);

        //Rigidbodyのオブジェクトを移動。
        rbody.MovePosition(new Vector3(movex, transform.position.y, movez));
        

    }
}
~~~

Vector3のY座標で中心を定義する。スクリプトのアタッチは中心(GameObject)。

###４．結果
赤Cube　:　MovePosition
青Cube　:　RotateAround

![movie (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/da8a5375-921d-44b5-79d2-118068f7be38.gif)

赤Cube　:　シリンダーを中心にRotateせずに周回している。
青Cube　:　シリンダーの方向を向いて周回している。


###５．まとめ

同じ周回でもメソッドによってはGameObjectのRotationに影響を与えることが分かった。
これら2つの使えるケースで考えられるのは

MovePosition　：　ゲーム全般
RotateAround　：　オブジェクト周りを見る

「GameObjectを円運動させてみた」も円運動はしているが、中心がわかりにくいのでオブジェクトの設置に時間がかかる。今後はこちらを使っていきます。

###参考サイト
Unity3DCG
https://uni.gas.mixh.jp/unity/circle.html
Googleがはじき出した「良いマネジャーの8つの条件」

<img src="https://artiencecorp.com/wp-content/uploads/2017/12/abstractly_087.jpg">

#良いマネジャーの8つの条件

１．良いコーチであること
（Be a good coach）

２．チームに権限を与え、細かい管理をしないこと
（Empower your team and don't micromanage）

３．チームメンバの成功や個人の幸せに強い興味を持つこと
（Express interest in team members' success and personal well-being）

４．弱虫でないこと。生産主義、結果主義であること
（Don't be a sissy: Be productive and results-oriented）

５．チームに対する良いコミュニケーター、良い聴き手であること
（Be a good communicator and listen to your team）

６．従業員のキャリア形成の手助けをすること
（Help your employees with career development）

７．チームのための明確なビジョンと戦略を持っていること
（Have a clear vision and strategy for the team）

８．チームに助言をするための技術的スキルを持っていること
（Have key technical skills so you can help advise the team）

#参考
http://blogs.itmedia.co.jp/tani/2013/04/google8-68ff.html
PowerShellをリモート実行

<img src="https://image.itmedia.co.jp/ait/articles/0805/16/wi-ps1sec05.png">

#問題
PowerShellをリモート実行時、署名がないとかエラー

#ソリューション
リモート先ドメインを信頼済みサイトに登録する
 
```
IE→インタネットオプション→セキュリティ→信頼済みサイト
file://domain
```

なんでIEに登録しないといけないんだ・・・
いろいろやってみたし、レジストリもいじってみたが、IE設定が一番簡単で分かりやすかった。

#参考
http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html
Unityを複数画面で起動する方法【Mac】

## Unityを複数画面で起動する方法【Mac】
リアルタイム通信を行うオンラインゲームを開発する時にはUnityの実行モードウィンドウを複数起動したい状況があると思います。
Windowsだと、各プロジェクトごとに実行モードウィンドウが起動できるため、プロジェクトをコピーして起動することで解決出来ます。

しかし、MacではUnityは1プロジェクトしか起動できません。
そこで自分が取っているのは、複数のMacを使い、Git連携してコードを同期して複数起動を実現するというものです。

これでも面倒ではありますので、もっと良い方法があれば知りたいところです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
webpackの基本だけどハマりやすいentryの設定と[name]

# webpackとエントリーポイント

皆様、webpackは使っていますか？
一部では脱webpackという流れもあるような話を見かけましたが、
私はwebpack大好きでJS関連のプロダクトの場合はとりあえず入れてます。

しかし、webpackにはわかりづらい点があります。

loaderやruleあたりのチェインもそれなりにわかりづらいのですが、[^1]
それ以前の基本的な設定である、`entry`と`[name]`の関連性です。

わかってしまえば簡単なのですが、私は最初ハマりました。
この記事はごく基本的な`entry`のことについて記載します。

## `entry`とは

公式ドキュメントの以下のあたりに書いている
https://webpack.js.org/concepts/entry-points/

```js
module.exports = {
  entry: './path/to/my/entry/file.js',
};
```

こういうやつです。

## 設定しない場合の挙動

`entry`を設定していない場合、webpackは

* **`./src/index.js`を`./dist/main.js`に出力する**

という挙動になります。[^2]

細かく書くと、

* `./src/index.js`をエントリーポイントとし
* `index.js`内でimport、requireされ使われているファイルをバンドルして
* `./dist/main.js`に出力する

という動きです。

## `entry`,`output`のデフォルト値

このデフォルトの挙動は、当然ながら設定で変更できます。
しかし、そもそものデフォルトの設定値がマニュアルには載っていません（たぶん）

デフォルトの設定値を記載すると、以下のようになります。

```js
module.exports = {
  entry: './src',
  output: {
    filename: '[name].js',
    path: __dirname + '/dist'
  }
};
```

これは、以下の設定しているのと同じことです。

```js
module.exports = {
  entry: {
    main: './src'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/dist'
  }
};
```

つまり、実質、

```js
module.exports = {
  entry: {
    main: './src/index.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/dist'
  }
};
```

としているのと同じです。

## 理解していないとハマる

これらのデフォルト値と挙動は、理解していないと少し複雑なことをしようとするとハマります。

### 例1：エントリーポイントと出力先を変更する

エントリーポイントを`./src/js/entry.js`
出力先を`./dist/index.bundle.js`
に変更したいとします。

```js:例
module.exports = {
  entry: './src/js/entry.js'
  output: {
    filename: 'index.bundle.js',
    path: __dirname + '/dist'
  }
};
```

この例は動作します。

### 例2:複数のエントリーポイントを設定する

エントリーポイントを`./src/js/entry.js`と、'./src/js/index.js'とし、
それぞれを`./dist/entry.bundle.js`と`./dist/index.bundle.js`に出力したいとします。

```js:失敗例
module.exports = {
  entry: [
    './src/js/entry.js',
    './src/js/index.js'
  ],
  output: {
    filename: '[name].bundle.js',
    path: __dirname + '/dist'
  }
};
```

この例は失敗し`main.bundle.js`しか出力されません。 [^3]
想定通りに動かすには以下のように設定します。

```js:成功例
module.exports = {
  entry: {
    entry: './src/js/entry.js',
    index: './src/js/index.js'
  },
  output: {
    filename: '[name].bundle.js',
    path: __dirname + '/dist'
  }
};
```

# 結論

以上のことからわかる、webpackの基本的な`entry`と`[name]`の設定についてまとめます。

## `[name]`とはエントリーポイント名である

* エントリーポイントのファイル名ではありません

## `entry`を配列や文字列で設定した場合、エントリーポイント名は`main`になる

* `[name]`は`main`に変換されます
* オブジェクトを使うことで複数のエントリーポイントを設定できます

この2点を抑えておけば、エントリーポイントと出力先周りでハマることは減るでしょう。

# 参考資料

[webpackが何故必要で、 何故分かりづらいのか - Speaker Deck
https://speakerdeck.com/tomof/webpackgahe-gu-bi-yao-de-he-gu-fen-kariduraifalseka](https://speakerdeck.com/tomof/webpackgahe-gu-bi-yao-de-he-gu-fen-kariduraifalseka)

私がこの記事に書いていることを理解したきっかけになったスライドです。[^4]

[^1]: いつか別記事に書きたい（といいつつこの記事も1年ぐらい下書きのままでした）
[^2]: もし`src/index.js`が無い場合は`ERROR in Entry module not found: Error: Can't resolve './src' `というエラーが発生します
[^3]: 私はかつて、これでwebpackはSPA向けで一つバンドルするしかできないと思いこんでいました
[^4]: まさしくbrowserifyとgulpの複雑さに疲れ果ててた頃でした…このスライドに感謝
Pythonの特徴をまとめよう (これから始める人向け)


Pythonを始めたきっかけが、[HackerRank](<https://www.hackerrank.com/>)に挑戦しようと思ったからなので、正直Pythonにはどんな特徴があるのかを把握していませんでした。

反省を込めて、一度Pythonにはどんな特徴があるのかをまとめます。
#Pythonはシンプルで見やすい

Pythonはシンプルにこだわった言語だそうです。

シンプルなメリットは自分が書きやすいだけでなく、他人が書いたコードも読みやすいのです。

そのため、初心者でも親しみやすい言語なのだそうです。

## Pythonには字下げが必要


Pythonでは、ブロック構造をするときには**「{}」**を使いません。

例えばif文を使う場合だと、

```python3:color.py

if blue == color:
    print('青色です')
elif red == color:
    print("赤色です")
else:
    print('私には色が分からないの…')
```

このように記述します。(colorの中身は適当に想像しておいてください)

ここで注意が必要なのが、条件の処理をさせるところはインデントしなければならないことです。

インデントとは、段落の行頭を下げることです。

「字下げ」とも言われています。

上記の例で言うと、

```Python3:errorBlue.py
if blue == color:
print('青色です')
#↑間があいてない
```
ではエラーが出てしまいます。

```python3:trueBlue.py
if blue == color:
​	  print('青色です')
#↑間をあける
```

というようにしましょう。

また、**「{}」**を使う言語よりもPythonは比較的見やすいコードとなります。

#Pythonはいろいろできる

調べていると、Pythonを使えば何でも~~かんでも~~できるようです。

というのも、Pythonには数多くのライブラリやフレームワークがそろっているので、幅広い開発ができるのだそうです。(ちょっとDjangoに興味が湧いた)

>ちなみにライブラリとは、汎用性のある特定の機能群を他のプログラムから再利用できるようにまとめたもののこと。 

Pythonはまだ深いところまでしてないので、後が楽しみです。
SQL Server Management Studio v17 日本語化できない

#問題
SQL Server Management Studio v17.3の日本語版がインストールできない

#ソリューション

- Microsoft Visual Studio 2015 Shell (Isolated)をアンインストール

簡単すぎた？これで再インストールができるようになった。知っちゃったら簡単と言っちゃう・・・

#参考
https://tsubalog.hatenablog.com/entry/2018/01/02/000000
AWS Beanstalk 強制削除

<img src="https://drive.google.com/uc?export=view&amp;id=154DuyN53xs60XjN5IizzwhtqaKP7K81n">

#問題
ELBを手動削除したら環境終了できない

#ソリューション

- まずエラー内容から関連ELBを削除

- リンクを切る！

```bash
eb terminate {Environment} --ignore-links
```

#参考
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-terminate.html
Linux コマンド

#Linux 日付でファイル検索
###“find” n日前より古いファイルをまとめて削除
```bash
find ./ -type f -mtime +365 -exec rm -f {} ;
```
###30分以下更新されたファイル　直近使われているかどうか
```bash
find ./ -type f -mmin -30
```
http://www.rep1.co.jp/staff/200vcxg/217rav/find_n_lcd_-linux_command_dict.htm


#数字名のディレクトリのみを削除
```bash

rm -Rf $(ls -d */ | grep -E '[0-9]')
```
npm runでコマンドライン引数を渡す方法

# 概要

Node.js自体は3年ほど使用していてるが、単体プログラムでコマンドライン引数を必要としなかったので、いままで使うことがなかった。
コマンドライン引数が欲しくなったので、使おうとしたら少しハマったのでそれをまとめておく。

# 読者対象

- 将来Node.jsでコマンドライン引数を使いそうな方

# 経緯

## コマンドライン引数が渡せない

コマンドライン引数なんてハイフンつけて実行するだけ（ハイフンはいらない模様、私の思い込みでした）。
実行するプログラムはindex.jsとし、オプションはbooleanのdevとする（開発モードで実行するシーンを想定）。

```console
$ node index.js --dev
```

nodeコマンドならこれで行けた（もう一度言っておくがハイフンはいらない模様、大事なので2度言いました:relaxed:）。


## npm runの際の注意点

nodeもnpmも同じと考えると次のようになる。

```json:package.json
{
  ...
  "scripts": {
    ...
    "index": "node index.js",
    ...
  },
  ...
}
```

```console
$ npm run index --dev
```

実際に実行すると、index.jsにdevのコマンドライン引数は渡されません。
ここでしばらくはまる。

npmの公式ドキュメントは比較的わかりにくく気は進まなかったが、困ったときは公式ドキュメントということで参照する。
https://docs.npmjs.com/cli/run-script

>As of npm@2.0.0, you can use custom arguments when executing scripts. The special option -- is used by getopt to delimit the end of the options. npm will pass all the arguments after the -- directly to your script:
>
```
npm run test -- --grep="pattern"
```

Google翻訳先生によると
>npm@2.0.0以降、スクリプトを実行するときにカスタム引数を使用できます。特別なオプション -- は、オプションの終わりを区切るためにgetoptによって使用されます。 npmは -- の後のすべての引数をあなたのスクリプトに直接渡します。

私が解釈したところ、**--の後にコマンドラインに渡したいパラメータ書け！**

つまり最初の例を動かすにはこうする。

```console
$ npm run index -- --dev
```


## コマンドライン引数はパッケージを使う

戦いの末、書き方はわかった。
あとはindex.jsのほうでargsを取得すればいいのだが・・・、Node.jsのargsは使いやすいとはいいがたい。
パースやら意味解釈を自分でやる必要がある。
https://nodejs.org/docs/latest/api/process.html#process_process_argv

それじゃパッケージの出番ということでググると、おすすめを紹介されている記事を発見。いい感じ。
http://thr3a.hatenablog.com/entry/20181203/1543763623

念のためnpmで検索して、妥当性のチェック。
利便性、学習コスト、人気度、更新頻度、バンドルサイズ(ウェブアプリじゃないので今回は対象外)、いずれも申し分なし！
jsonで取得できるのが決め手。
https://www.npmjs.com/package/command-line-args


## 実際に書いたソースコード

…ブログの記事もあるし、パッケージのサンプルも丁寧なので、掲載の意味なしと判断してカット:joy:
【Unity】AdMobを入れるとアプリが起動できなくなった時に試したこと

## 状況
AdMobを利用するためにGoogleMobileAds.unitypackage
をインポートした後、Unity上でエラーもなく、実機テストをする際にBuild and Runも通るが、実機でアプリを起動する際に何も反応しない。(アプリをタップした直後にクラッシュしている？)

## 解決法
### android
Assets/Plugin/Android/GoogleMobileAdsPlugin ディレクトリでAndroidManifest.xmlをテキストエディタ等で開き、

```
<manifest>
    <application>
        <!-- Your AdMob app ID will look similar to this
        sample ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR_ADMOB_APP_ID"/>
    </application>
</manifest>

```
"YOUR_ADMOB_APP_ID"と書いてある部分にAdMob IDを記入する。

### ios

Assets/GoogleMobileAds/Editor ディレクトリで PListProcessor.cs を開き、

```
[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
{
    // Replace with your iOS AdMob app ID. Your AdMob app ID will look
    // similar to this sample ID: ca-app-pub-3940256099942544~1458002511
    string appId = "ADMOB_APPLICATION_ID";

    string plistPath = Path.Combine(path, "Info.plist");
    PlistDocument plist = new PlistDocument();

    plist.ReadFromFile(plistPath);
    plist.root.SetString("GADApplicationIdentifier", appId);
    File.WriteAllText(plistPath, plist.WriteToString());
}
```

"ADMOB_APPLICATION_ID"の部分にAdMob IDを記入する。

---
(参考)
[スタートガイド  \|  Unity  |  Google Developers](https://developers.google.com/admob/unity/start?hl=ja)
Active Directoryサーバの共有フォルダを参照できるタスク追加


#問題
ドメイン管理者のみ、DCにある共有フォルダを参照できるようにすると、GPOで指定したタスク（スクリプト）はローカル権限しか持たないためDCの共有フォルダにアクセスできない。
ドメイン参加のコンピューター上、ドメイン管理者権限でタスクスケジューラーを作成すると動くが、ドメイン管理者のパスワードを変更するとタスクスケジューラーも更新する必要がある。

#ソリューション
共有フォルダに「Domain Computers」グループを追加すると、ローカルのSYSTEMの権限からもアクセスできる。
ドメインユーザはアクセスできないため安心。
[Clojure]デバッグのための簡単なマクロ

「プログラミングとはデバッグである」

そんな言葉を言っていた人がいました。そして、デバッグで基本となるのが

「とりあえず怪しい変数をプリントしていく」

事ではないでしょうか。

ClojureではREPL（Read Eval Print Loop)が使えるため、データの可視化は容易にできます。しかし、それでも関数が長くなるとその関数の中でどのようなデータが処理されているのか不透明になることもあるかと思います。

そこで、関数内で任意の変数をその変数名と共にプリントするマクロを作りました。

## debug

下のマクロdebugは任意個の引数をとり、そられを変数名とともにプリントします。

```Clojure
(defmacro debug
  "Prints args. This is useful when debugging."
  [& args]
  (let [sym (gensym "sym") val (gensym "val")]
    `(do
       (println "debug information:\n")
       ~@(map (fn [sym val] `(println ~sym " : " ~val)) (map str args) args)
       (println))))
```

マクロを作成した場合、

macroexpand

を使って、どのようにコードが展開されるのかを確認できます。

```Clojure
(def x 1)

(def y 2)

(macroexpand '(debug x y))

;; => (do
;;      (clojure.core/println "debug information:\n")
;;      (clojure.core/println sym15155 " : " val15156)
;;      (clojure.core/println sym15155 " : " val15156)
;;      (clojure.core/println))
```
実際に上記のコードを評価してみると、以下の結果を得ました。

```Clojure
(def x 1)

(def y 2)

(debug x y)

;; =>   x  :  1
;;      y  :  2
```

debugを関数の中に挿入すれば、好きな変数をプリントしその値を確認することができます。

例として、整数のシーケンスを引数にとり、

「偶数のみフィルターしたあとそれらを二乗する」

という変形をする関数 filter-even-then-square を作ってみます。

```Clojure
(defn filter-even-then-square [coll]
  (let [original coll
        only-even (filter even? original)
        squared (map #(* % %) only-even)]
    squared))

(filter-even-then-square [1 2 3 4]) ;; => (4 16)
```
上の例では想定どおりの結果が得られていますが、「途中のデータの変形」については情報がありません。

そこで、debugを挿入するとデータ変形の途中経過を可視化できます。

```Clojure
(defn filter-even-then-square [coll]
  (let [original coll
        only-even (filter even? coll)
        squared (map #(* % %) only-even)]

    ;; letしたデータをプリント
    (debug original only-even squared)
    
    squared))

(filter-even-then-square [1 2 3 4]) ;; => (4 16)
```

結果は同じですが、repl bufferにdebugに渡したデータが表示されました。

```
debug information:

original  :  [1 2 3 4]
only-even  :  (2 4)
squared  :  (4 16)
```

ちなみに、filter-even-then-squareのような関数は、Clojureに標準装備されている「アローマクロ」を使うと簡潔に書けます。

```Clojure
;; 上と同じ関数をアローマクロで作成
(defn filter-even-then-square [coll]
  (->> coll (filter even?) (map #(* % %))))
```

この程度の変形であれば、わざわざデータをプリントする必要はないかもしれませえんが、もっと長い関数を書く場合にはdebugのようなマクロが役に立つのではないでしょうか。

今回の内容は以上になります。最後までお読み頂きありがとございました。
Goでベンチマークを取ってみる

# はじめに
golangのtest全般を支援しているtestingパッケージには関数のベンチマークを行う機能が備わっています。
今回はそれを用いてベンチマークを取って行きます。

# ベンチマークをする
まずベンチマークの対象となる実装をしていきます。
メモリ確保を先にしておくとパフォーマンスが上がるコードを例としてみます。

### ベンチマークを取る対象の関数を実装
引数nを貰ってその数だけのメッセージが入ったスライスを返却し
都度appendする `makeSlice1` と
先にメモリを確保する `makeSlice2` の二つ関数を実装します。

```hoge_test.go
package main

import (
    "fmt"
    "testing"
)

func makeSlice1(n int) []string {
    var r []string
    for i := 0; i < n; i++ {
        // 都度appendする
        r = append(r, fmt.Sprintf("%03d hoge", i))
    }
    return r
}

func makeSlice2(n int) []string {
    // 長さを指定してメモリを確保する
    r := make([]string, n)
    for i := 0; i < n; i++ {
        r[i] = fmt.Sprintf("%03d hoge", i)
    }
    return r
}
```
### ベンチマーク関数の実装
次にベンチマーク関数の実装を行います。

```hoge_test.go
func BenchmarkMakeSlice1(b *testing.B) {
    b.ResetTimer()
    makeSlice1(b.N)
}

func BenchmarkMakeSlice2(b *testing.B) {
    b.ResetTimer()
    makeSlice2(b.N)
}
```

#### b.ResetTimer()
`func (b *B) ResetTimer()` はタイマーを停止し、経過したベンチマーク時間とメモリ割り当てのカウンタをゼロにします

#### b.N
```
ベンチマークが実行されながら、実行時間（所要時間）を正しく測定できるまで、b.Nの値が調整される。
```

### ベンチマークの実行
```
$ go test -bench .
goos: darwin
goarch: amd64
pkg: github.com/go_app/test
BenchmarkMakeSlice1-4   	 5000000	       311 ns/op
BenchmarkMakeSlice2-4   	10000000	       196 ns/op
PASS
ok  	github.com/go_app/test	4.379s
```

```
// テストした関数の実行回数
5000000

// 1回あたりの実行に掛かった時間(ns/op)
311 ns/op
nanosecond/operation
```

メモリの確保した容量も気になりますよね。
-benchmemオプションを付けると

```
$ go test -bench . -benchmem
BenchmarkMakeSlice1-4   	 5000000	       294 ns/op	     108 B/op	       2 allocs/op
BenchmarkMakeSlice2-4   	10000000	       148 ns/op	      40 B/op	       2 allocs/op
PASS
ok  	github.com/go_app/test	3.468s
```

```
// 実行ごとに割り当てられたメモリのサイズ
108 B/op
(Byts/operation)


// １回の実行でメモリアロケーションが行われた回数
2 allocs/op
```
上記のベンチマークの結果により、予めスライスを確保する事で、メモリ確保の回数を減らした方がパフォーマンスが良いことがわかりました。


### おまけ
Go 1.12から実行回数を指定してベンチマークを取ることができるようになりました。

```
$ go test -bench . -benchtime=1000x
BenchmarkMakeSlice1-4   	    1000	       376 ns/op
BenchmarkMakeSlice2-4   	    1000	       178 ns/op
PASS
```

### 参考
[Package testing](https://golang.org/pkg/testing/)
[go標準のbenchmark機能の使い方](https://qiita.com/marnie_ms4/items/7014563083ca1d824905)
git pushまでの流れ

1.gitを使い始める。
-

```:ターミナル
$ git init
```
2.まずファイルをトラッキング状態にする。
-

```:ターミナル
$ git add トラッキングするファイル名
```

※全てのファイルをトラッキングしたい場合は以下のように書く。
-

```:ターミナル
$ git add .
```

3.コミットする。
-

```:ターミナル
$ git commit -m "コミットメッセージ"
```
`コミットメッセージ`の部分は好きに入力してOK!

4.push
-

```:ターミナル
$ git remote add origin git@github.com:アカウント名/リポジトリ名.
$ git push -u origin master
```
```$ git remote 〜 ```はそのローカルリポジトリを初めて利用するときだけ必要です。
CSSのセレクタについて

###はじめに
初学者のアウトプット備忘録記事です。
アドバイスご指摘はどうぞよろしくお願いします。


##CSSのセレクタについて
今回CSSのセレクタについて考えることになったきっかけは、

```css
* {color:blue;}　　#すべての要素に適用
```
これ 「*」

このア○ルマーク、、、ではなく、このセレクタって何ナノ？
ってことで調べたら全要素らしく、恐ろしいこと全要素にCSSが適用されるというヤバみがあります。


```css

 

 classセレクタ 要素名.クラス名  クラス名を付けた要素  p.sample {color:blue;} 
 
idセレクタ | 要素名#id名 | id名を付けた要素 | div#sample {color:blue;} |
 
擬似クラス | 要素名:link | 未訪問のリンク | a:link {color:blue;} |
 
visited | 訪問済のリンク | a:visited {color:blue;} |

hover | カーソルが乗っている要素 | a:hover {color:blue;} |

active | クリック中の要素 | a:active {color:blue;} 

focus | フォーカスされている要素 | input:focus {background:blue;} 

lang | 特定の言語を指定した要素 | p:lang(en) {color:blue;} 

first-child | 要素内の最初の子要素 | p:first-child {color:blue;} 

first-line | 要素の最初の一行 | p:first-line {color:blue;} 

first-letter | 要素の最初の一文字 | p:first-letter {color:blue;} 

before | 要素の直前 | blockquote:before {content:"『";} 

after | 要素の直後 | blockquote:after {content:"』";} 



```

とういうことで他のパターンも。
命名規則【Ruby超入門】

命名規則が慣習的に決まっていることが多かったのでまとめました。
以前自分がまとめたキャメルケースなどのブログも参考に。

**関連記事**
[命名規則に出てくるキャメルケースなどの種類](https://yukimasablog.com/notation)

#ファイル名、ディレクトリ名
* ファイルは末尾に`.rb`をつける
* 全てを小文字にし、**snake_case**(スネークケース)で記述
* ファイル名：**クラス名やモジュール名をsnake_caseに変更した名前を使用**
* ディレクトリ名：**モジュールの名前空間をsnake_caseに変更した名前を使用**

```rb
# OK
# ファイル名
sample.rb
sample_ruby.rb
# ディレクトリ名
sample
sample_ruby

# NG
# ファイル名
Sample.rb
sample.ruby
sampleRuby.rb
# ディレクトリ名
Sample
SampleRuby
```

#クラス名、モジュール名
* **CamelCase**(アッパーキャメルケース)で記述。(先頭も含めた単語の最初を大文字)
* `_`(アンダースコア)は使わない
* ``HTTP``や``FTP``などの略語は大文字のまま

```rb
# OK
Sample
SampleRuby
FTPServer

# NG
sample
SAMPLERUBY
Sample_Ruby
```
#変数名、メソッド名
* 全てを小文字にし、**snake_case**(スネークケース)で記述
* 配列は**複数形**で記述

```rb
# OK
sample
sample_ruby
# 配列
drinks
menbers

# NG
Sample
sampleRuby
```

#定数
* **SCREAMING_SNAKE_CASE**(スクリーミングスネークケース)で記述

```rb
# OK
SAMPLE
SAMPLE_RUBY

# NG
sample
SampleRuby
```
#参考記事
* https://qiita.com/TakeshiFukushima/items/647a652439b55525945f
* https://qiita.com/deerboy/items/f035b9044edf9a51aff7
GCPを触るまで

# GCPってなに？
GCP(Google Cloud Platform）とは、Googleが運営しているパブリッククラウドサービス（クラウドコンピューティング環境をインターネット経由で提供するサービス）です。
AWSと比較するとGCPの方が料金が安いらしいです。

## この記事は何のために書いてるの？
初めてGCPを触っていた時のことを忘れないための、備忘録です。
何がわからなかったのか、どうやってGCPについて調べたか等書いていきます。

# なんでGCPにしたの？
GCPを選んだ理由は二つです。
一つ目は、会社でGCPを使った開発をやっていく（らしい）から。
二つ目は、AWS以外のクラウドサービスを使ってみたかったから。

# GCPを始めたいけど、何からすれば良いのかわからない
これは凄く悩みました。最初は何をすれば良いのか本当に分かりませんでした。
私の場合、とにかくGCPを触ってみようと考えて始めたので、あれこれ悩んでいました。
GCPにはどんなサービスがあるのかを知らないと、どんな構成でシステムを構築できるのかイメージが掴みにくいと思います。
そこで、まずはGCPに関するページを読むところから始めました。

# 参考にしたサイト

[【AWSしかやったことない人向け】AWSとGCPのネットワークの違いを理解してみよう](http://www.mpon.me/entry/2017/04/22/020428)
AWSとGCPのアカウントやネットワークの概念の違いについて書かれています。
恐らく、調査を初めて一番最初に見たサイトです。
私も元々はAWSを使っていたので、こちらのサイトの内容にはとても助けられました。

[Google Cloud Platform のドキュメント](https://cloud.google.com/docs/?hl=ja)
GCP公式のドキュメントです。
どんなサービスがあるのかを確認できます。

[AWS プロフェッショナルのための Google Cloud Platform](https://cloud.google.com/docs/compare/aws/?hl=ja)
GCPを選ぶ理由や、AWSとGCPサービスの比較について書かれています。
公式がこういう情報をまとめてくれているのはありがたいですね。

[Google Cloud Platform の無料枠](https://cloud.google.com/free/?hl=ja)
GCP無料枠についてです。
無料枠内で使えるに越したことはないので、とりあえず読みました。

[これから始めるGCP（GCE）　安全に無料枠を使い倒せ](https://qiita.com/Brutus/items/22dfd31a681b67837a74)
GCPを始める人を対象とした記事です。
GCPの利用を開始するまでの流れやセキュリティ対策について書かれています。
これを読んでおけば、最初の一歩は問題ないと思います。

[クラウド破産について](https://cloud-textbook.com/84/)
クラウド破産が起こりやすいポイントについて、まとめられています。
対策までしっかりと書かれていますので、クラウドサービスの利用を始める前に読んでおくべきだと思います。

# 現状
上記のサイトを参考に、1週間前になんとかGCPを触り始めました。
今のところ公式のチュートリアルを見ながら仮想マシン、Cloud Shell、Cloud Functionsを触っています。

# おわりに
半年ぶり、二回目の投稿です。
しかしこの記事を書くのに2時間位かかってる、まじですか。
次回はチュートリアルで詰まったところや、分からなかった用語についてまとめてみようかと考えています。
1週間以内に投稿できたらいいなあ。