OmniAICreator/Qiita-1.07M huggingface dataset:
10秒でわかるエンジニアそれぞれ

パスタの種類より複雑なエンジニアの種別をまとめました。

| 職種 | 業務内容 | 必須スキル |  |
|:--|:--|:--|:--|
| WEBデザイナー | Illustrator、Photoshopでクライアントの理想を描く | デザインセンス、llustrator、Photoshop | https://www.internetacademy.jp/it/design/web-design.html |
| HTMLコーダー | 出来上がったデザインをHTMLに起こす | HTML、CSS、JavaScript | https://html-coding.co.jp/knowhow/about_coder/000001/ |
| フロントエンドエンジニア | HTMLにアニメーションをつけたりバリデーションチェックを作成する | HTML、CSS、JavaScript<br/> (HTMLコーダーよりやや高度) | https://html-coding.co.jp/knowhow/about_coder/front-end-engineer/ |
| サーバエンドエンジニア | 商品検索処理や商品購入処理を作成する | Java、PHP、perl… | https://engineer-shukatu.jp/archives/47227 |
| マーケティング | メール配信、SEO等でコンバージョンと促す | SEO、MA | https://mtame.jp/marketing_foundation/web_marketing/ |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/178b25cf-2d3f-6028-37a1-22b198468a28.png)

---
スパゲッティー　スパゲッティーニ　違い　とは🤔
https://minna-no-kurashi.jp/article/detail/294
#AWS SQS の可視性タイムアウトとは何なのか？トランザクションのロックに近いイメージなのかもしれない。

言葉が死ぬほどわかりづらいが、そんな気がする。

[Amazon SQS 可視性タイムアウト - Amazon Simple Queue Service](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)

>メッセージが受信された直後は、メッセージはキューに残ったままです。他のコンシューマーが同じメッセージを再び処理しないように、Amazon SQS は可視性タイムアウトを設定しています。この時間内では、他のコンシューマーによる同じメッセージの受信と処理が防止されます。

>ただし、コンシューマーでメッセージを削除する前に障害が発生して、DeleteMessage アクションが呼び出されないまま可視性タイムアウトの期限が切れると、そのメッセージは他のコンシューマーに見えるようになり、再度受信されます。メッセージを一度だけ受信する必要がある場合、コンシューマーは可視性タイムアウトの時間内にメッセージを削除する必要があります。

# 何のために必要なの？

一定時間したら、なんども処理させる、というようなことが可能なのだろうか？

>ただし、コンシューマーでメッセージを削除する前に障害が発生して、DeleteMessage アクションが呼び出されないまま可視性タイムアウトの期限が切れると、そのメッセージは他のコンシューマーに見えるようになり、再度受信されます。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2455








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
postgresql



ERROR PG::ConnectionBad: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
ERRORを解決した方法
brew install postgres
brew install postgis
berw uninstall postgres
berw install postgres
psql -d template1 
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Dockerコンテナ単体で自動起動の設定と確認を行う

以下のオプションを使って自動起動の設定を変更できます。

##### 有効化
```bash
docker update --restart=always [コンテナ名]
```

##### 無効化
```bash
docker update --restart=no [コンテナ名]
```

##### 自動起動が有効になっているコンテナを検索する

```bash
docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always
```

###### 出力結果例

```bash
/container-1 always
/container-2 always
```
KotlinでAPI入門

# はじめに
KotlinでAPIを叩いたことないので，叩いてみた．
これからいろんなAPI叩いてみたいので練習した時の記録とAPIの簡単な解説．

# 用語について

## API
API(Application Programming Interface)とは，企業や団体等が公開し，機能を使用可能としているシステムのことである．
ネットワークを介して利用可能であり，プログラムの一部として取り込むことによって個人だけでは実現不可能なシステムの生成が可能となる．
例として，今回取り上げるOpenWeatherMapがあり，世界中の様々な天気や温度，湿度等を取得することができるため，システム単体で実現不可能な天気を表示することが可能となる．

## Json
Json(JavaScript Object Notation)は，オブジェクトと呼ばれるデータ形式であり，機械が判別できるように作られたデータの扱い方だ．
よくわからないが，簡単に言うと配列の番号部分(array[0]やらarray[1]やら)を番号ではなく，文字(array["id"]やらarray[name])で扱うことができるデータ形式だ．

Json形式のデータの例を見てみよう．

``` json
{
    "id"   : "123456789",
    "name" : "SoraY677",
    "favorite" : ["game" , "sleeping" , "programing"]
}
```
このようなデータ形式となる．例えば「id」を呼び出せば，「123456789」を得ることができる．
このデータの左側(id,name，favorite)を**key**といい，右側(123456789,SoraY677,["game" , "sleeping" , "programing"])を**value**という．
keyとvalueは1対1になっているが，valueが配列であったり，さらにJson形式のデータであるため注意が必要だ．

# 早速叩いてみよう

## APIキーの取得
APIを叩く時の基本事項だが，APIの仕組みをしておく必要がある．
APIはWebで公開されているものなので，APIを叩く際にはサイトにアクセスするときと同様にURLが必要になる．また，APIの種類にもよるが，APIを叩く際にはAPIキーと呼ばれるAPIを叩くための許可が必要になる場合がある．

試しに[OpenWeatherMap](https://openweathermap.org/)でのAPIの取得を行ってみる．
- サイトにアクセスし，上部のバナーからまずはログイン(ない場合はアカウント作成)を行う．
- ログインできたらバナーの「API」をクリックし，API一覧のサイトに移動する．
- 一覧から「Current weather data」の「Subscribe」を選択し，料金表の中からFree枠の「Get API key and start」を選択すると，APIの叩き方の案内が出てくる．これに従い，APIを叩こうと思う．
- 上部バナーのsign inボタンを押し，メニューから「API Keys」を選択する．すると，APIキーの作成画面が出てくると思うので，createkeyの入力部分にAPIキーの名前を入力(任意)し，APIキーを作成することができる．
こうすることで，APIキーを作成できる．

## 開発
### 必要となるライブラリ
ここまで来て伝えるのは心苦しいが，JavaやKotlinはもともとJson形式のデータを簡単に処理することができない．そのため，外部ライブラリが必要となる．
[このサイト](https://mvnrepository.com/artifact/org.json/json/20180813)からFilesという項目からbundleをクリックし，jarファイルをダウンロードして展開しておく．

続いて，IntelilJを起動し，Kotlinでプロジェクトを作成する．
リボンから「File」->「Project Structure」->「Libraries」と移動し，＋ボタンで先ほど展開しておいたjarファイルを指定する．
こうすることで，Jsonファイルの取り扱いが可能となる．

---
### コーディング
では，コーディングを行っていこう．

```kotlin
import java.io.BufferedReader
import java.io.InputStreamReader
import java.net.URL
import org.json.JSONObject

fun main(args: Array<String>) {

    //APIキー
    val API_KEY = "[APIキー]"
    //都市のID(横浜)
    val CITY_ID = 1848354
    //アクセスする際のURL
    val API_URL = "http://api.openweathermap.org/data/2.5/forecast?" +
            "id=" + CITY_ID + "&" +
            "APPID=" + API_KEY
    var url = URL(API_URL)

    //APIから情報を取得する.
    var br = BufferedReader(InputStreamReader(url.openStream()))
    
    //json形式のデータとして識別
    var json = JSONObject(br)
    
    //cityのキーに対応するvalueを表示する．
    println(json.get("city"))

}
```

どうだろう？かなり簡単にAPIを叩くこと自体はできただろう．
「val API_KEY = "[API_KEY]"」の[API_KEY]の部分に対して先ほど取得したAPIキーが入る．またAPPIDに取得したい都市のIDを入れることで，最終的にAPI_URLでURLを算出し，APIを叩いているという仕組みだ．
json.get("city") が実際にJson形式のデータに対してkeyを指定し，valueを得ている部分だ．実際にJson形式のデータを扱う際にはこのようになるので，注意が必要だ．

# おわりに
以上で，今回の記事とする．
もう少し細かく解説したほうが良いと思われる部分や修正したほうが良い部分もあると思うので，教えていただけるとありがたい．
AWS Lightsail で「公式マニュアル通りに」WordPress を立ち上げる

# AWS Lightsail 1ヶ月無料なんでやってみた
1ヶ月(Lightsailを使い始めた月に750時間分、他転送量等は確認してね)しかないので、~~暇なくせに~~急ぎの記事ですいません。まずはアウトプットが大事なんです(どやぁ

追記: 2019-10-03 無料枠切れた
![2019-10-03 18_48_53-Billing Management Console - Opera (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439283/2aa88fdb-a976-fdc6-ecc8-f6a9fb65f02f.jpeg)

3 Hrs...(´・ω・｀)


追記: 2019-09-27 テスト用サイトは削除しました。 

- Lightsail の無料枠節約のため←ケチ
- WordPressサイト放置すると危ないので(ガチ

あと3日間で200時間分くらい無料枠あまってるので、できる限りLightsail 使ってみようと思います(貧乏性)


# とりあえず常時SSLまでは(もちろん無料で)やってみた。

Bitnami のツール(元々入っている or Bitnamiのサーバーから落とす)を使うと一通りできました。
→「[AWS Lightsail で Bitnami HTTPS Configuration Tool を 使った Let's Encrypt (自動更新まで)」](https://qiita.com/tsukashu0210/items/c849b4cff5fa7c25afac)

![2019-09-17 23_12_14-TEST NEW Blog! – Just another WordPress site - Opera (4)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439283/1f41b2a0-b086-7296-7e24-3fc760fd3512.jpeg)


こちらの方法 [(Alternative Approach(Bitnami)](https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/#alternative-approach) →やってることはLet's Encrypt を手動で設定)も使ってみたんですが、SSL証明書のためのものなのでリダイレクトまでできませんでした。


# やりたかったこと
マニュアル通りやると、早い人で5分～10分(独自ドメイン取得前提)でできると思います。僕は**「半日」**かかりました。ｾｰｻﾝｾｰ(ﾟ∀ﾟ)

公式のマニュアル通り、というか~~「調べた方法で動いた」~~ →「理解して動かす」という段階でやってみたくて、少し手間ですが自分でやりました。
Qiitaやクラスメソッドさんとかの記事は参考にストックしたり、マニュアルと見比べる程度にしました。マニュアルにない部分は基本的にWordPress以降です(テーマとか)
そのため、慣れている人からすると無駄な部分が多いかと思いますが、学習前提と思って頂ければ。


## やれなかったことと(と、あとからやったこと)
- cron などを使ったLet's Encrypt の自動更新設定  
  - →Bitnamiさんのツールでできました。(ツールもcron使っているみたいなので実質的には一緒です)
- wwwつきとnon-wwwドメインの正規化(リダイレクト設定)  
  - →Bitnamiさんのツールで。(wwwにリダイレクト。やっていることは、httpd.confによるParmanentリダイレクト。)
- ~~Qiitaに素敵な投稿を公開( ｡･･)/⌒ＱｉＩＴａ~~ いつかきっと誰かの役に立てると信じて


### やれなかったこと補足  
だいたいできましたが少し補足です。
### cron などを使ったLet's Encrypt の自動更新設定
公式の「チュートリアル」と書いてあるマニュアルでは、Let's EncryptでのSSL証明書の取得まででです。初心者さんはLightsail を使うなら、Bitnamiさんのツールを使うのが良いと思います。

Qiita読者諸姉は"Lightsail SSL"とかでQiita検索すると何件か投稿されてた気がします。cronのスクリプトもあったので、この機会に少しずつ覚えていこうかと思っていますが、毎回同じ作業するならツールは便利です(スクリプトも便利です。使いやすい方で。)

### wwwつきとnon-wwwドメインの正規化(リダイレクト設定) 
「どっちでもいいけど、一つにしとこうか」と「301リダイレクトを**.htaccess**ファイルで設定するといいよ」という記事が多いと思いますが、セキュリティなどの都合上.htaccessファイルは極力いじらない方がいいそうです。そこで、**httpd.conf**
というファイルに記述する方法を、Apache公式も勧めています(この辺→[When (not) to use .htaccess files](http://httpd.apache.org/docs/current/howto/htaccess.html))。Bitnamiのツールもこちらを使っています。


(更新履歴)
2019-10-03: Lightsail 無料枠終了
2019-09-27: テストインスタンス削除。
2019-09-27: 記事まとめ。
[メモ] Pythonを入れすぎてpip使えなくなったときの対応

# ことの始まり
pipでライブラリをダウンロードしようとしたところ、「Fatal error in launcher: Unable to create process using '"'」のエラーが出現

# 対応
インストールした場所からディレクトリを移動させてしまったのが原因。もう一度インストールして新しくパスを上書きしたところ治った。

# 備考
自分の環境にあるPythonのバージョンはちゃんと把握しておこう。
むやみにたくさんのバージョンをインストールしないようにしよう。
どのディレクトリにインストールしてあるかちゃんと管理しておこう。
Podのデプロイから削除まで~最低限知っておきたいkubectlコマンド集~

## はじめに  
kubectlコマンドはふだんから使わないと忘れてしまうのでその備忘録も兼ねて私がよく使うkubectlコマンドをまとめてみました。  

## クラスターのコンテキスト(接続情報)に関するkubectlコマンド  
### Kubenetesクラスターのコンテキストの一覧表示  

```
kubectl config get-contexts
``` 

### カレントコンテキストの表示  

```
kubectl config current-context
```

### コンテキストの削除  

```
kubectl config delete-context <コンテキスト名>
```

### カレントコンテキストの切替  

```
kubectl config use-context <コンテキスト名>
```

## リソースを参照するkubectlコマンド  

### リソースの種類を指定して表示する  

```
kubectl get <リソース名>
実行例：Podの表示
kubectl get pod
```

### 全てのリソースを一括表示  

```
kubectl get all
```

## リソースの作成に関するkubectlコマンド  

###  マニフェストを使用してKubernetesリソースを作成する  

```
kubectl apply -f <マニフェストファイル名>
```
**ちなみにファイルではなく、ディレクトリを指定するとそのディレクトリにある全てのマニフェストが適用されます。**

## リソースの削除に関するkubectlコマンド  

### マニフェストを指定してリソースを削除する  

```
kubectl delete -f <マニフェストファイル名>
```   

### マニフェストファイル名を指定せずリソースを削除  
どのフォルダでリソースを作成したか分からなくなったときに便利です。どのディレクトリにいても実行できます。

```
kubectl delete <リソースの種類> <リソース名>
実行例：Podを削除
kubectl delete pod sample-pod
```  


## デバッグに便利なkubectlコマンド  

### Podの現在の状態を標準出力  

```
kubectl describe pod <pod名>
```

### Podの中で行われた処理を標準出力  

```
kubectl logs <Pod名>
```
Spring MVC support using more than 1 template engine

# Example

In this example, extra FreeMarker template engine is added into Spring MVC project using Thymeleaf template engine. A 'hello world' page is displayed using this new added engine.

First get a copy of my [notice board example application](https://github.com/saladlam/spring-noticeboard). Add following line into *pom.xml* to include FreeMarker template engine into project.

```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
```

Add a FreeMarker template, as *'resources/templates/public/freemarker_test.ftl'*.

```html
<html>
<head>
  <title>${title}</title>
</head>
<body>
  <div>${body}</div>
</body>
</html>
```

Add a new function into *info.saladlam.example.spring.noticeboard.controller.PublicController* controller.

```java
public class PublicController {
    // ...
    @GetMapping("/freemarker_test")

    public String freemarkerTest(Model model) {
        model.addAttribute("title", "FreeMarker test page");
        model.addAttribute("body", "Hello world!");

        return "public/freemarker_test";
    }
}
```

Start application and in browser to open [http://localhost:8080/freemarker_test](http://localhost:8080/freemarker_test). As result 'Hello world!' is show.

# # What happen behind?

When application started. Following *org.springframework.web.servlet.ViewResolver* bean is created by Spring Boot.
- org.thymeleaf.spring5.view.ThymeleafViewResolver
- org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver

org.springframework.web.servlet.DispatcherServlet instance is created. During initialization, method **initViewResolvers()** is called.

```java
        if (this.detectAllViewResolvers) {
            // Find all ViewResolvers in the ApplicationContext, including ancestor contexts.
            Map<String, ViewResolver> matchingBeans =
                    BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
            if (!matchingBeans.isEmpty()) {
                this.viewResolvers = new ArrayList<>(matchingBeans.values());
                // We keep ViewResolvers in sorted order.
                AnnotationAwareOrderComparator.sort(this.viewResolvers);
            }
        }
        // ...
```

Code listed above shows that all bean with *ViewResolver* interface is provided by *BeanFactory*.

When method **freemarkerTest()** in *PublicController* being called, string 'public/freemarker_test' is return. This string will pass into *org.thymeleaf.spring5.view.ThymeleafViewResolver*. Since no Thymeleaf template withi this name is defined, so null is returned. Then pass into *org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver* and instance with *org.springframework.web.servlet.View* interface is returned.
うすい30パーセントキーボードをつくってみた【キーマップ作成】2019/09/16

##前説
既存のキーマップを参照してもいいと思ったのですが、まずは単機能で理解しないといけないかなと思い、新規にキーマップを作成してみました。
QMKの環境は立ち上がっているので、そのあたりはすっ飛ばした記載となってます。

##新規キーマップ作成
new_keyboard.shでデフォルトのツリーを作成でき、対話形式に従ったら新規キーマップ作成用のツリーが生成されます。

```
$ ./util/new_keyboard.sh
Generating a new QMK keyboard directory

Keyboard Name: sosuu31
Keyboard Type [avr]:
Your Name: qzi00173

Copying base template files... done
Copying avr template files... done
Renaming keyboard files... done
Replacing %YEAR% with 2019... done
Replacing %KEYBOARD% with sosuu31... done
Replacing %YOUR_NAME% with qzi00173... done

Created a new keyboard called sosuu31.

To start working on things, cd into keyboards/sosuu31,
or open the directory in your favourite text editor.
```

##キーボードのマトリクス設定
./config.hを編集して、マトリクスの設定を行います。

* マトリクスの行列数を記載する。

```
/* key matrix size */
#define MATRIX_ROWS 6
#define MATRIX_COLS 6
```
* 割り当てたピン名※順番通りに記述する。

2019/9/21 最終版の回路ではF6,F7を入れ替えてたので修正。
印刷してたのが最終と思ってたのが間違えのもと。データでちゃんと確認しよう。

```
#define MATRIX_ROW_PINS \
    { F5, F7, F6, F4, B1, B3 }
#define MATRIX_COL_PINS \
    { B4, E6, D7, C6, D4, B5 }
```

修正前

```
#define MATRIX_ROW_PINS \
    { F5, F6, F7, F4, B1, B3 }
#define MATRIX_COL_PINS \
    { B4, E6, D7, C6, D4, B5 }
```

* ソフトウェアシリアルは使わないので、コメントアウトする。

```
//#define SOFT_SERIAL_PIN D0  // or D1, D2, D3, E6
```
##コンパイルルールの変更

./rules.mkを編集して、BOOTLOADERはpicomicroを使うので、caterinaに変更する。

```
BOOTLOADER = caterina
```

##キーマトリクスの定義
./sosuu31.hを編集して、キーマトリクスの定義を決めます。
物理的には3*11のマトリクスとしていますが、マイコン的には6*6としていますが、キーマップをいろいろ見てるとこうした方がマイコンへの本数を減らせそうなのでこの方法を採用しました。
余ったピンはワイヤーで引き出したりしてキラキラさせたい:sparkler:

```
//3*11の配列を真ん中で折り返しているので、実際には6*6のマトリクスで再現される
\#define LAYOUT( \
  L00, L01, L02, L03, L04, L05, L06, L07, L08, L09,     \
  L10, L11, L12, L13, L14, L15  L16, L17, L18, L19,     \
  L20, L21, L22, L23, L24, L25, L26, L27, L28  L29, L2A \
  ) \
  { \
    { L00, L01, L02, L03, L04, KC_NO }, \
    { L10, L11, L12, L13, L14, KC_NO }, \
    { L20, L21, L22, L23, L24, KC_NO }, \
    { L05, L06, L07, L08, L09, KC_NO }, \
    { L15, L16, L17, L18, L19, KC_NO }, \
    { L25, L26, L27, L28, L29, L2A   }, \
  }
```
折り返して配列を構成しているのは**[marksardさん](https://scrapbox.io/self-made-kbds-ja/marksard)**作の**[stonehenge30](https://github.com/marksard/Keyboards/tree/master/stonehenge30)**を穴が開くくらい見させていただきました。

##キーマップ
![sosuu31-keyboard-layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283328/f4362b4a-cdad-6e86-a967-9eae1af8e106.png)
お試しなのでfoobarとほぼ同じに。使っていってブラッシュアップすればいいかなと。
右下は何にしよう:thinking:

##つづき
はんだ付けをしてあげないといつまでもキーボードにならない:frowning2:
[続き](https://qiita.com/qzi00173/items/cd3ddec34d8c8fa4526d)
MySQL入門　　基本的なデータベースの操作



①データベースの作成

```
mysql> create database mydb01;
Query OK, 1 row affected (0.00 sec)
```

②データベースの削除

```
mysql> drop database mydb03;
Query OK, 0 rows affected (0.00 sec)
```
③操作対象のデータベースを調べる

```
mysql> select database();

結果

+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)
```

NULLと出てるので現在操作対象になっているデータベースは選択されていない。


④データベースの操作対象指定

````
mysql> use mydb02;
Database changed

結果

+------------+
| database() |
+------------+
| mydb02     |
+------------+
```
PdfFileReaderを使うときはファイルストリームを閉じてはいけない

表題の通りでちょっとハマったのでメモ。

PDFファイルを読み込み、それを分割して保存する場合、`PyPDF2`というモジュールが便利です。

`PyPDF2`には、`PdfFileReader`と`PdfFileWriter`というクラスがあり、Readerで読み込み、Writerで書き込みと、完全に役割が分かれています。

```python
  r = PdfFileReader(...)
  w = PdfFileWriter()
  w.addPage(r.getPages(0))
  w.addPage(r.getPages(1))
  w.addPage(r.getPages(2))
  # …
```

# クラスでラッピングするときの注意

で、PDFファイルの読み込み処理にいろんな処理を挟むときなど、ついつい`PdfFileReader`をオリジナルのクラスでラッピングしたくなりますが…。

```python
  with open(filename, mode="rb") as f:
    self.__reader = PdfFileReader(f, strict=False)
    # 色々な処理
```

よくあるプログラムのように、このように書いてしまうと、withを抜けた後に`PdfFileWriter`でPDFに書き込みを行うことができません(エラーにはならないですが、出力されるページがすべて真っ白になります)。

`PdfFileReader`は読み込みの時に、ファイルをすべて読み込まず、必要な時に適宜ファイルを読み込む実装になっているため、ファイルストリームは開きっぱなしにしておかなければいけません(よく見ると、いちおう`PdfFileReader`のドキュメントコメントにそれっぽいことが書いてあります)。

ですので、クラスでラッピングする場合も

```python
  self.__fs = open(pdf_filename, mode="rb")
  reader = self.__reader = PdfFileReader(self.__fs, strict=False)
  # 色々な処理
```

とし、別途`self.__fs.close()`を呼ぶ必要があります。他のサンプルを見てもなぜか`with open("PDF"...) as ...` のような書き方をしていないなあ と思ったら。

## クラスをwith文対応にする

せっかくなのでラッピングしたクラスもwith文に対応させておくと後々使いやすいです。これまたいつもと同じですが。

```python
  def __enter__(self):
    return self

  def __exit__(self, exc_type, exc_value, tb):
    if exc_type is not None:
      import traceback
      traceback.print_exception(exc_type, exc_value, tb)
    self.close()
    return self
```

という定義をクラスのどこかに加えればOKです。`__enter__`は「もし`__init__`に引数があったとしても」そのまま`self`を`return`すればOKです。

また、サンプルコードによっては`__exit__`の引数が`self`だけになっている場合があるのでこちらも注意です(引数が足りないと`with`文を抜けたときにエラーが発生します)。

# 参考資料

* [PyPDF2を調べた \- Qiita](https://qiita.com/wrblue_mica34/items/16fe8cf3f8d12ebbbe58)
* [PyPDF2 Documentation — PyPDF2 1\.26\.0 documentation](https://pythonhosted.org/PyPDF2/)
ファイル名が日時のログ

#現在時刻(OS準拠)を取得してログファイル名に
DateTime.Now.ToString("yyyy.MM.dd.HH.mm.ss") で西暦から秒まで取得できる．西暦など省略もできる．
System.Text.Encoding.GetEncoding("shift_jis"))でテキストのエンコード方式を指定できる．
下記の例ではexeのある階層に"yyyy.MM.dd.HH.mm.ss.log"の空ファイルができる．


            using TextWriter writerSync = TextWriter.Synchronized(new StreamWriter(DateTime.Now.ToString("yyyy.MM.dd.HH.mm.ss") + ".log", false, System.Text.Encoding.GetEncoding("shift_jis")));
            writerSync.WriteLine(DateTime.Now.ToString("HH.mm.ss:")+"ここにログを記述");

#ログを7z(7zip)で圧縮する場合
階層内のログファイルをまとめて圧縮する．
ファイル名は"yyyy.MM.dd.HH.mm.ss.7z"になる．
以下のURLから"7z.exe"を入手しexeと同じ場所に配置する必要がある．
https://sevenzip.osdn.jp/download.html
 -sdelは圧縮したら元のファイルを削除
 -mx9は圧縮レベルで0は無圧縮(0-9)
".7zを".zipに変えるとzipになる

            ExecuteAnotherApp("7z.exe", "a " + DateTime.Now.ToString("yyyy.MM.dd.HH.mm.ss") + ".7z *.log -sdel -mx9", false, true);

            private void ExecuteAnotherApp(in string FileName, in string Arguments, bool UseShellExecute, bool CreateNoWindow) {
                System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo {
                    FileName = FileName, Arguments = Arguments,
                    UseShellExecute = UseShellExecute,
                    CreateNoWindow = CreateNoWindow    // コンソール・ウィンドウを開かない
                }).WaitForExit();
            }
#Github + #Slack 連携が最高になる！ Pull  Reminders の DM 設定

![image](https://user-images.githubusercontent.com/13635059/64939595-73c07000-d89c-11e9-8982-f55565b0e0ca.png)


# You are assigned a review

レビューリクエストされた時

# Your team is assigned a review

なにこれ？

チームへのレビューリクエストというのがあるらしい。
https://help.github.com/ja/articles/requesting-a-pull-request-review
> あなたが Organization のメンバーである場合、特定の Team に変更をレビューするようリクエストすることもできます。



# Your PR is approved or has changes requested

自分のPRが承認 / 変更要求された時

# You are made an Assignee

アサインされた時

# Someone merges your PR

PRが他の人にマージされた時

# Someone comments on your PR

PRにコメントがついた時

# You are mentioned in a comment

コメントでメンションされた時 ( e.g  @yumainaura )

# Someone comments in a thread you're in

自分がいるスレッドにコメントがついた時

自分がレビューでコメントしたり、他の人のレビューに連ねてコメントしたスレッドに対して、さらに他のコメントがついた時、通知してくれる感じかもしれない

# Your PR has merge conflicts

自分のPRがコンフリクトした時

# Your PR has failed CI checks

自分のPRでCIが落ちた時

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2454








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Python] [R] 注目したニュースの話題性をグーグルトレンドで確認する

　グーグルニュースやYahooニュースなどで気になったニュース内容への関心の推移を確認したい場合、グーグルトレンドを使います。キーワードが複合語やフレーズの場合、いくつかの組み合わせ方で検討してみる必要があります。
今年2019年7月のグーグルニュースから**「天気の子レシピ」**に関する7月23日リリースのニュースに注目しました。
[**新海誠監督の話題の最新作「天気の子」の劇中レシピを国内No.1のレシピ動画サービス「クラシル」が考案・提供**](https://prtimes.jp/main/html/rd/p/000000070.000019382.html)

「天気の子レシピ」に対する関心の推移、話題性を確認するために、2種の単語の組み合わせでグーグルトレンドのデータを確認しました。プログラムはPythonとRを併記してあります。両言語ともにグーグルトレンドデータを取得するパッケージが用意されています。
検討した検索ワードの組み合わせは、「天気の子レシピ」と、
"天気の子"と"子"の間に半角を入れた「天気の子 レシピ」です。
データ取得期間は2018年1月1日～2019年8月31日に設定しました。

#Pythonでグーグルトレンドの時系列データを取得する
##環境
Windows10
Python3.6.5

##グーグルトレンドのデータ取得のためにpytrendsをコマンドプロンプトでインストール

```
$ pip install pytrends
```

##Pythonのスクリプト
```python:GoogleTrend
from pytrends.request import TrendReq  #グーグルトレンドの情報取得
import pandas as pd  #データフレームで扱う

pytrends = TrendReq(hl='ja-JP', tz=360)
kw_list =["天気の子レシピ", "天気の子 レシピ"]
pytrends.build_payload(kw_list, cat=0, timeframe='2018-01-01 2019-08-31', geo='JP', gprop='')
df = pytrends.interest_over_time() #時系列データを取り出す
df.to_csv("グーグルトレンド_天気の子レシピ_Python.csv", encoding='cp932')
```

#Rでグーグルトレンドの時系列データを取得する
Windowsでは検索ワードを日本語にすると文字コードに由来するエラーが発生して修正できなかったのでので、Macで実行しました。

##環境
Mac
R3.5.0

##グーグルトレンドデータ取得のためにパッケージgtrendsRをインストール

```r:gtrendsR
install.packages("gtrendsR")
```

##Rでのスクリプト
```r:GoogleTrend
library(gtrendsR)
kw_list <- c("天気の子レシピ", "天気の子 レシピ")
d <- gtrends(keyword = kw_list, geo = "JP", time = "2018-01-01 2019-08-31")
write.csv(d$interest_over_time, "グーグルトレンド_天気の子レシピ.csv")
```

#グラフで表示
　保存したcsvファイルからエクセルで作成したグラフを添付します。
注目したニュースのリリース日がグーグルトレンドのピークとほぼ一致しています。
![グーグルトレンド_天気の子レシピ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481830/2d40121e-5765-575d-9dc9-1cd66e2dbcde.png)

#まとめ
　グーグルニュースで注目した「天気の子レシピ」の話題性をグーグルトレンドで確認することができました。グーグルトレンドの検索ワードとしては"天気の子レシピ"ではなく"天気の子"と"レシピ"の間に半角の区切りを入れるのが適正でした。このように、複合後やフレーズに関するトレンドを見るためには、単語の組み合わせ方をいくつか検討してみる必要があります。
Pythonでは、グーグルトレンドのデータ取得には問題はありませんでしたが、matplotlibでプロットを作成する場合に、"天気の子"のような日本語に対応するフォントが用意されておらず、文字化けすることがわかりました。いくつかの記事を参考にフォントを入れてみましたが、未だに修正できなかったので、グラフは保存したcsvファイルからエクセルで作成して添付しました。
Rでは、Windowsではグーグルトレンドのデータ取得の際にエラーになりました。やはり"天気の子"のような日本語の文字コードに対応できていないようです。
Macでは実行できました。
日本語への対応や文字コードでは結構悩まされます。

スクリプトは下記記事に利用しました。
[**データサイエンスで食のヒットの種を見つけだそう!  (1)  - ローソンのバスチー  ヒットの秘密 -**](https://blog.hatena.ne.jp/yamtakumol/yamtakumol.hatenablog.com/edit?entry=26006613407003507)

[**食のヒットの種を見つけだそう! (2) - 2019年6月～8月は「完全食」と「天気の子レシピ」-**](https://www.yanwari-data.com/entry/2019/09/09/110208)

[**食のヒットの種を見つけだそう! (3)  - 2019年9月はタピオカティーに続く台湾発の食 、特に「チーズティー」**](https://blog.hatena.ne.jp/yamtakumol/yamtakumol.hatenablog.com/edit?entry=26006613447159392)

[**食のヒットの種を見つけだそう!  - 2019年10月はスイートポテトパイ**](https://blog.hatena.ne.jp/yamtakumol/yamtakumol.hatenablog.com/edit?entry=26006613466611130)

[**2020年期待の食のヒットの種　- チーズボール -**](https://www.yanwari-data.com/entry/2020/02/09/164036)



**参考記事**
[【Python 3.6】matplotlibを日本語化する](https://qiita.com/maroKanatani/items/3b080c639395bba7795a)
[【R】gtrendsRパッケージのつまづきポイント](https://clean-copy-of-onenote.hatenablog.com/entry/R/trouble_with_gtrendsR)
【俺得】Linux基本コマンド①

自分用の備忘録になります。
今後整理して共有的な面も目指していきます。

#■ユーザー追加する
```
$useradd USER名
```
#■存在するユーザー確認する
```
$cat /etc/passwd 
```
#■存在するグループ確認する
```
$cat /etc/group 
```
#■ユーザーを削除する
```
$userdell USER名
```
#■ユーザーへデフォルトグループへ紐付ける
```
$usermod -g GROUP名 USER名
```
#■ユーザーへサブグループを追加する(-aにより既存サブグループも保持する)
```
$usermod -aG GROUP名 USER名
```
#■グループに所属するユーザを確認する
```
$getent group GROUP名
```
うすい30パーセントキーボードをつくってみた【材料調達】2019/09/16

##前説
うすくて小さいキーボードがほしかったから、基板設計からやってみました。
キーボード基板作成は先駆者のみなさんが詳しいページを記されていますので、参照すれば特に困る事なくデータ作成できると思います。

わたしは **[foostanさんの開発者向けガイド(JP)](
https://github.com/foostan/mkbd/blob/master/developers_guide/developrs_guide_jp.md)** を参照しました。CADから基板発注までの一気通貫で書かれていますので、不安を感じることなく作成に集中できました。

##制作物の構想
基板設計のポリシーはうすく作ると決めてたから、そこから落とし込んで設計しました。

* 大体30キー (結局31キーに落ち着いた)
* マイコンは基板表面に配置
* キースイッチはKailhロープロファイルスイッチを使う

もしかしたら**[これ](https://scrapbox.io/self-made-kbds-ja/Dilly)**と同じ感じかも:thinking:

##制作物
基板表面はお知り合いの方が描かれているかわいいくまさんを、裏面はキー数が31になったので素数(Prime Number)だから、でかでかフォントで基板いっぱいに書きました。
キースイッチは無地なのはつらいから、シールでレジェンドを作って貼りました。
![IMG_1911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283328/cd368ae8-538e-87ce-0916-5fec18a7b0ab.jpeg)
![GerbView — C__data_keyboard_tappy30per_sosuu31_sosuu31_gerber_sosuu31-B_SilkS.gbr (X2属性付き) 2019-09-16 18.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283328/04405b50-ab31-5d9f-76f3-151041c944b0.png)
シールは透け感があるやつがいいかなと思って、これを採用。
![IMG_1899.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283328/0f5419f5-af09-b1ba-6a30-4aab57ad6132.jpeg)
仮実装した感じも良さそう
![IMG_1908.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283328/35398960-ff9d-3377-5855-e88eeda6abd1.jpeg)

##つづく
次はキーマップをつくってマイコンに書き込みです。
[続き](https://qiita.com/qzi00173/items/588ff3963da13215a310)
変化したinput要素の色をJavaScriptで変える

Webフォームで記入内容が初期値から変わっていたらわかりやすく見た目が変わってほしいなと思ったんです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212471/0a6bf543-82cf-175d-4d03-15f779557c65.png)

で、こんな感じになりました。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="mifumi323" data-slug-hash="qBWyXLe" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS+JSで変化したInputの色を変える">
  <span>See the Pen <a href="https://codepen.io/mifumi323/pen/qBWyXLe/">
  CSS+JSで変化したInputの色を変える</a> by 松田美文 (<a href="https://codepen.io/mifumi323">@mifumi323</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

発想としては、input要素のカスタムデータ属性にvalue属性と同じ内容の初期値を入れておいて、入力があるたびにチェックして、違っていたら色を変える、という風にしています。onchangeだとフォーカスが外れたときにしかチェックしないので、oninputを使っています。
この例ではスタイルを直接変更していますが、CSSのクラスを付け替えるとかするともっと柔軟性が出そうですね。

# 余談
CSSでも属性セレクタ（[attr=value]）を使って条件判断できるのでJavaScript抜きでもできるんじゃないかなと思ったんですが、右辺は定数しか受け付けないようなので、断念しました。
以下、失敗例。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="mifumi323" data-slug-hash="wvwxRBa" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="変化したinput要素の色をCSSで変えたかった">
  <span>See the Pen <a href="https://codepen.io/mifumi323/pen/wvwxRBa/">
  変化したinput要素の色をCSSで変えたかった</a> by 松田美文 (<a href="https://codepen.io/mifumi323">@mifumi323</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Oculus GO からワンクリックでキャプチャーをPCに転送する方法

# はじめに
いつも大変お世話になっております。シャチクです。
今回の記事は Oculus GO で撮影したスクリーンショットや動画を
簡単にパソコンへコピーする方法の紹介です。

## 要するに
adb pull コマンド便利！PowerShell 便利という記事です。

# 動作確認環境
+ Oculus GO
    + [開発者モード] にして、USBデバッグを許可しておくこと
+ Windows 10 x64 1803
    + adb コマンドが動作すること

# 手順
用途に合わせて以下のコマンドを実行するだけです。

+  [全ファイル転送したいときのコマンド](#全ファイル転送したいときのコマンド) 
+  [日付を指定して転送したいときのコマンド](#日付を指定して転送したいときのコマンド)
    +  こちらがおすすめ:thumbsup:

## 注意点
+ adb pull コマンドで転送するとファイルは **問答無用で上書き** されます

## Oculus GO 内に保存されているフォルダ
録画したキャプチャー動画は
**/sdcard/oculus/VideoShots/**
に .mp4 として保存されています。

撮影したキャプチャー画像は
**/sdcard/oculus/Screenshots/**
に .jpg として保存されています。

転送したいものに合わせてコマンドを読み替えてください。

## 全ファイル転送したいときのコマンド
実行すると C:\Temp\VideoShots\ フォルダに Oculus GO 内でキャプチャーしたファイルがコピーされます。
C:\Temp\ は各自キャプチャーを保存したいフォルダに置き換えてください。

```console:TransferVideoShots.bat
mkdir C:\Temp\
adb pull /sdcard/oculus/VideoShots C:\Temp\
```

    
## 日付を指定して転送したいときのコマンド
PowerShell が実行できる環境であれば、こちらのコマンドが高速で便利です。

```powershell:TransferVideoShotsToday.ps1
$today = Get-Date -Format "yyyyMMdd"
$saveDir = "C:\Temp\$today\"
$videos = adb shell ls /sdcard/oculus/VideoShots/*$today*
mkdir -Force $saveDir
foreach($file in $videos){ adb pull $file $saveDir }
```
一度 ls コマンドを使ってコピー対象のファイルを取得し、foreach で 1ファイルずつコピーしています。
なぜこんな回りくどい方法をとるかというと adb pull コマンドは *（アスタリスク）でフィルターできません。
Oculus GO のキャプチャーファイル名の書式が yyyyMMdd を含んでいるため、このような指定になっています。

### 今日以外の日付をコピーしたい場合
$today の行を以下のように変更してください。

####前日をコピーしたい場合
```powershell
$today = (Get-Date).AddDays(-1).ToString("yyyyMMdd")
```

####指定日をコピーしたい場合
```powershell
$today = 20190916
```

# メリット
## エクスプローラーでコピーすると再生できない動画が問題なく再生できる
私の環境では、なぜだか Windows のエクスプローラーから Oculus GO の動画をコピーすると長さが「00:00:00」になっており正常に再生できない現象に悩まされました（再生できても真っ黒な画面が一瞬再生されるだけ）

Oculus GO の Wi-Fi を OFF にして、Oculus GO を再起動を何回も繰り返せば再生できる、という情報を聞き試しましたが、私の環境では10回以上再起動してもダメでした。

しかし、今回紹介した adb pull コマンドを使えば問題なく再生可能な .mp4 ファイルがコピー出来ました。

## ワンクリックで簡単で高速にコピーできる

今回紹介したコマンドをスクリプトファイルに保存しておけば、ワンクリックで簡単に実行できます。
Windows の [画像とビデオのインポート] 機能で転送する方法もあるようですが、
Oculus GO 内の全てのメディアファイルを走査しているようで、毎回コピーに使うには耐えがたい遅さでした。

# おわりに
今回紹介した adb コマンドのように Oculus GO でも Android 開発の知識が使い回せるので、どんどん使っていきましょう。
Oculus Quest や Windows 以外の OS でもパスを揃えれば動作すると思いますが、
環境を持っていないので試せていません。
『こんな環境で動きました！』『こっちのやり方がオススメ』など皆さんのご意見ご感想お待ちしております。

# おまけ
adb pull 以外に便利な adb コマンドの紹介。

## Oculus GO 内のファイルを削除するコマンド
  
**重要なファイルを削除しないよう誤指定に注意**

```console
adb shell rm -rf /sdcard/oculus/VideoShots/*20190916*
```
## Oculus GO 内のファイルを閲覧するコマンド

```console
adb shell ls /sdcard/oculus/VideoShots/
```
## PCからOculus GO 内にファイルをコピーするコマンド
今回紹介した pull の反対のコマンド。フォルダ毎コピーするときは1つ上の階層にコピーします。
   
```console
adb push C:\Temp\VideoShots\ /sdcard/oculus/
```
Homebrew CoreからMongoDBが消えた

Macに`brew install mongodb` でMongoDBでも入れようと思ったらできなかった。

```bash
$ brew install mongodb
Error: No available formula with the name "mongodb"
==> Searching for a previously deleted formula (in the last month)...
Warning: homebrew/core is shallow clone. To get complete history run:
  git -C "$(brew --repo homebrew/core)" fetch --unshallow

mongodb was deleted from homebrew/core in commit 2c2e57c:
  mongodb: delete

To show the formula before removal run:
  git -C "$(brew --repo homebrew/core)" show 2c2e57c^:Formula/mongodb.rb

If you still use this formula consider creating your own tap:
  https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap
```

どうやらMongoDBがオープンソースライセンスではなくなったからhomebrew-coreから消えたらしい

https://github.com/Homebrew/homebrew-core/pull/43770

## 導入方法
どうしても入れたいという人向けに導入方法を共有

```bash
brew uninstall mongodb

brew tap mongodb/brew
brew install mongodb-community

// 実行
mongod --dbpath /usr/local/var/mongodb/
```


まあDocker使えという話ではある
Faceware retargetter で VTuber を目指すメモ

## Faceware Retargetter とは?

http://support.facewaretech.com/retargeter-intro

Faceware analyzer でトラッキングしたデータを, キャラクター rig に流し込んでアニメーションさせます.
結果としてキーフレームが生成されます.

Retargetter は, 3dmax や Motionbuilder など, 3D DCC のプラグインとして提供されています. ここでは Maya 版を想定します.

## 要件

* Retargetter Maya 
* Analyzer で facial landmarks のトラッキングが済んでいる(トラッキングデータがある)
* channel(attribute)で FACS あたりの表情を作れるような rig が仕込まれたキャラクターデータがある(rig なしモデルに対してよろしく制御コントローラを自動作成して動きを retarget してくれるわけではない).
  * rig については, アーティストなどに作ってもらうか, Polywink rig on demand https://www.polywink.com/14-62-automatic-facial-rig-on-demand.html などの自動 rig 作成サービスを使うことになるでしょう(Blender でも auto rig みたいなのがあったような?)


rig のつくりかたについて, faceware 向けの rigging best practices が参考になるかもしれません.
http://support.facewaretech.com/rigging_best_practices


## 使い方

### Character setup

まず, 顔のパーツと, 制御コントローラのアトリビュート/channel との関連付けを行います.

https://www.youtube.com/watch?v=_VrxWvIb0Rc

UI がわかりづらいですが, youtube チュートリアルを見ればだいたいどう操作すればよいかわかります.

#### Control setup

Control Setup タブで, 顔を制御するコントローラのリストなどをリストアップしていきます.
New すると, head, eye, mouth, bows などプリセットを作ってくれます(実際にはこれは単なる名称なので, 適当にリネームしてもよいかも?)

それぞれの group item に対して, rig controls で動かすアトリビュートのリストをリストアップします.

このとき, コントローラ(attribute)に lock がかかっていたり, parent が付いていたりものを選んでしまうと, 後述の Expression set のところで Maya warning が出てうまくリターゲットできませんので注意ください. コントローラは単独で制御できるような構成にしておきましょう.
 
#### Expression set 

https://www.youtube.com/watch?v=BvRKsSh8MZU

Control Setup が終わりましたら(途中でも問題はありませんが), 次に Control setup のコントローラの値を動かし顔表情の登録を行います.
こちらは画像があるのでわかりやすいかと思います. Phoneme(https://ja.wikipedia.org/wiki/%E9%9F%B3%E7%B4%A0) のパターンもありますのでいくらか lip sync の知識があるとよいです.

Use にチェックがあるものだけ後述の retarget で利用されます. 設定はあとで追加/削除できますので, とりあえず数パターンだけ登録し, 後述の retargetting でデータを流し込んでうまく動くかをまず確認するとよいでしょう.

`Apply Saved Expressions To Scene` で, 設定した expression をシーンに反映して確認できるようになります. ここで Maya に warning が出ていないかどうか確認しておきます. warning が出なければうまく設定できています.

設定したら .xml ファイルをセーブします. 

### Retargetting

https://www.youtube.com/watch?v=bE4wIU4fW-w

![retargetter-load.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/03863d32-0a3a-977b-19d2-12d86520c58c.png)

トラッキングデータ(.fwr)と, 先ほど作成した Character setup file(.xml) を読み込みます.

autosolve を有効(Generate AutoSolve)にします. これでだいたいよろしくやってくれます(トラッキングデータから, character rig のコントローラキーフレームをよろしく作成).  

`Import Video` を有効にすると, ビデオをシーンに取り込んでくれるので確認がしやすくなります.

**とりあえずこれでトラッキングデータと連携して, キャラクターがアニメーションします!**

### 微調整など

https://www.youtube.com/watch?v=cQzH9E-Uegk

データをスムージングとか, いろいろ後処理をする機能があるようです(未検証)

### Studio Plus

http://support.facewaretech.com/shared-poses-2

ポーズを共有化して複数のフッテージで使える用? 大量にトラッキング/リターゲットしたい人向けでしょうか.

Studio Plus は USD 399/year とお安いだったので(通常版だと USD 99/year でさらに激安), 筆者は Studio Plus ライセンスを買ってみましたが, いまのところ Shared pose など Studio Plus の機能を使うには至っていません.

## TODO

* [ ] Character setup file(.xml)を自前で作るのを考慮する(Maya でぽちぽちするのが面倒になってきたら)
* [ ] 自前トラッキングデータを faceware データに変換することで, analyzer 非依存で retarget できるか試す.
* [ ] リアルタイムでトラッキング+リターゲットできる LIVE を試す https://www.facewaretech.com/software/live
* [ ] Faceware retargetter でデータセットを作り, 機械学習させて facial capture などに利用し, VTuber を目指す.
【PHP8.0】未定義変数へのアクセスが例外にな・・・らない

ついにこの日が来てしまったようです。

PHPのユルさの象徴のひとつとして『未定義変数に普通にアクセスできる』というものがあります。

```php
echo $a; // Notice: Undefined variable: a
```

大抵の言語ではエラーや例外で落ちますが、PHPでは処理が中断することはありません。
警告は出ますが、最もエラーレベルの低い[E_NOTICE](https://www.php.net/manual/ja/errorfunc.constants.php)です。

が、PHP8.0でこの挙動が変わることになりそうです。

[Reclassifying engine warnings](https://wiki.php.net/rfc/engine_warnings)というRFCが提出され(提出者はいつものNikita)、2019/09/26まで投票中です。
これは様々な警告のエラーレベルを変更しようというRFCなのですが、ここではそのうちのUndefined variable、Undefined array indexに絞って紹介してみます。
RFCでもこれらの項目は特別に分けられていますしね。

# Reclassifying engine warnings

変更には投票の2/3の賛成が必要です。

## Proposal

警告や例外には主にE_NOTICE、E_WARNING、Error例外の3段階がありますが、一部の警告についてエラーレベルを変更します。
ただし上げる場合でも1段階しか上げません。
現在E_NOTICEの警告のエラーレベルを上げる場合はE_WARNINGに上げるだけで、いきなり例外まで上げるとはない、ということです。

ただしUndefined variableのみ例外。

### Undefined variable

大抵の場合、未定義変数へのアクセスは重大なバグです。
現在のE_NOTICEというとても軽い警告は、`register_globals`のような外から変数を定義してしまうことができていたPHP暗黒時代の遺物です。
理想的には、未定義変数へのアクセスはコンパイルエラーになるべきですが、PHPの性質上コンパイル時に全ての分析を行うことはできないため、このRFCでは代わりにError例外にすることを提案します。

しかしながら、例外にするとこれまでのように警告を無視することができなくなるため、大量の警告を抑制して運用しているようなレガシーコードは多大な改修が必要となります。
また一部には、未定義変数の使用は正当なコーディングスタイルであるとさえ考えている過激派も存在します。

これらの理由のため、Error例外にするか、E_WARNINGにするか、E_NOTICEのままにするかの個別投票を行います。

2019/09/14現在、Error例外が22票、E_WARNINGが8票、E_NOTICEのままが4票で、おそらくError例外になります。


### Undefined array index

未定義変数や未定義プロパティと同様、未定義の配列キーへのアクセスは、モダンPHPではプログラミングのエラーであるはずです。
しかし、変数やプロパティは主に静的に定義されるのに対し、配列のキーは動的に生成されることが多いため、全く同じ扱いをすることは難しいかもしれません。

JavaScriptのような一部の言語は、未定義の配列キーへのアクセスをエラーにしませんし、そのような操作をサイレントに実行します。
PHPでも主流ではないものの、同じようなコーディングスタイルを取る者たちがいて、彼らは未定義の配列キーへのアクセスが抑制可能な警告であることを願っています。

従って個別投票により、E_WARNINGに上げるか、E_NOTICEのままかを決定します。

2019/09/14現在、E_WARNINGが23票、E_NOTICEのままが13票で拮抗しています。


# 感想

私としては、仕事とかで書くちゃんとしたコードは常に`error_reporting(-1)`と書いているので、業務上は影響ありません。
ただ使い捨てで適当に書き散らすコードなんかは警告が出てても一回動けばいいやとかやったりしているのですが、今後はそのような手抜きが許されなくなります。
書いたらなんかとりあえず動く、という他言語に対するPHPの大きな利点(にして同時に欠点)を投げ捨ててまで得られるものがあるのかというと、個人的には少々疑問に感じます。

巷に溢れるテキトーなコードも大半が即死し、PHPを始める敷居が大きく上がってしまうことは間違いありません。
テキトーなコードなんて死滅してもいい？
むしろ絶滅させるべき？
みんな正しいコードを書くべき？
正しいコードしか許されないべき？

未定義変数アクセスの例外化は、プログラミング言語として正しい方向性でしょう。
しかし世の中、[正しければ勝てるというわけでもありません](https://yakst.com/ja/posts/4416)。
使用前の変数宣言なんて難しいコーディング、誰も彼もができるわけではないのです。
この正しい変更は、入口が狭まるというデメリットを上回るメリットを果たして得られるのでしょうか。

あと最大の問題点として、[ゴ](https://qiita.com/rana_kualu/items/6f6722558fc5c8bb204a)[ル](https://qiita.com/rana_kualu/items/0e9b48b4361ee567c7e6)[フ](https://qiita.com/rana_kualu/items/948c284a5e8ba7f94b55)が不可能になります。
こりゃ致命的だ。


# 回避策はあるか？

レガシーコードでは`error_reporting(E_ALL~E_NOTICE)`なんてことをやって警告の通知を無視していたわけですが、例外になるとこれが無視できなくなります。
プログラムを変更せずに回避する方法はないでしょうか？

PHPには例外の挙動を変更する[set_exception_handler](https://www.php.net/manual/ja/function.set-exception-handler.php)という関数があります。
しかし、これは実のところ単にプログラム全体を囲む`try/catch`なので、発生自体を無視したり、発生箇所に戻って先に進むといったことはできません。

ということでちょっと思いつかないですね。
誰かがきっと考えてプルリクしてくれるはず。

うん、まあ、そもそも例外が出ないように修正しろよって話ですが。
PythonのOpenCVで、画像に対して綺麗に文字を表示させる

# はじめに
以下のような画像を作りたかったのですが、OpenCVで実装しようとすると少しハマりどころがあったので書いています。
![スクリーンショット 2019-09-16 17.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190157/b3855f35-5871-f2af-3afc-37fa6135f34b.png)


# 実装

## 画像にテキストを載せる

OpenCVのputTextは、そのままでは`\n`を認識できないようです。
そのため、このように`for`文を回して処理を分ける必要があります。
この関数では、`texts`として文字列を受け取った場合にも処理が可能なようにしています。

```python
def draw_texts(img, texts, font_scale=0.7, thickness=2):
    h, w, c = img.shape
    offset_x = 10  # 左下の座標
    initial_y = 0
    dy = int(img.shape[1] / 15)
    color = (0, 0, 0)  # black

    texts = [texts] if type(texts) == str else texts
    
    for i, text in enumerate(texts):
        offset_y = initial_y + (i+1)*dy
        cv2.putText(img, text, (offset_x, offset_y), cv2.FONT_HERSHEY_SIMPLEX,
                    font_scale, color, thickness, cv2.LINE_AA)
```




## `cv2.rectangle`でalpha(透過)とfill(塗りつぶし)を考慮する

それらしくするために`fill=True`, `alpha=0.4`などとは`cv2.rectangle`は認識することができません。
そのため、塗りつぶしのためには`fill=-1`, 透過のためには`cv2.addWeighted`を使用します。

```python
def draw_result_on_img(img, texts, w_ratio=0.35, h_ratio=0.2, alpha=0.4):
    # 文字をのせるためのマットを作成する
    overlay = img.copy()
    pt1 = (0, 0)
    pt2 = (int(img.shape[1] * w_ratio), int(img.shape[0] * h_ratio))

    mat_color = (200, 200, 200)
    fill = -1  # -1にすると塗りつぶし
    cv2.rectangle(overlay, pt1, pt2, mat_color, fill)
    
    mat_img = cv2.addWeighted(overlay, alpha, img, 1 - alpha, 0)
    
    draw_texts(mat_img, texts)
    
    return mat_img
```

ここで、文字とマットを含めて全て同じ数値のものを指定するのが望ましいと思われるのですが、その理由は**cv2で処理している場合、BGRでの処理がデフォルトになる**ため、RGBの要領で書いていると`cv2.imwrite`時に想定通りの色にならないことが考えられるからです。

# 実行例
jupyter notebook内にて`lenna`さんの画像を同ディレクトリに配置し、実行します。

```python
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread("lenna.png")
mat_img = draw_result_on_img(img, texts=["name: lenna", "gender: female"])

plt.figure(figsize=(8, 8))
plt.imshow(cv2.cvtColor(mat_img, cv2.COLOR_BGR2RGB))
```

すると、はじめにで書いたような画像を出力することができます。

# 参考
- [IAmSuyogJadhav/Transparent drawings in OpenCV.py](https://gist.github.com/IAmSuyogJadhav/305bfd9a0605a4c096383408bee7fd5c)
- [OpenCV putText（）改行文字](https://stackoverrun.com/ja/q/7589598)
インターネットの仕組み　パート2

<h1>OSI参照モデルとTCP/IP</h1>
・OSI参照モデル
　OSI参照モデルとは、国際標準化機構（ISO）により策定されたコンピュータなどの通信機器の通信機能を、階層構造に分割したモデル、共通のルールです。

| 層 | 各層の名称 | 役割|
|:-:|:-:|:-:|
| 第７層  | アプリケーション層  |通信に関する約束事（プロトコル）を定める|
| 第６層  |プレゼンテーション層   |  データの表現形式を機器ごとのフォーマットに合わせるなどの管理を行う |
| 第５層  | セッション層  |   コネクションの確立や切断など、データ送信に関する管理を行う|
| 第４層  | トランスポート層  | 相手先にデータが確実に送信されたかどうかのチェックを行う|
| 第３層  | ネットワーク層  | 間接的に繋がっている相手先への送信を行う  |
| 第２層  | データリンク層  | 物理層で直接繋がっている相手と通信を行う|
| 第１層  | 物理層  |通信媒体に応じた信号の種類、内容やデータの伝送方法を決める |

・TCP/IP
　TCP/IPは、インターネットで標準的に使用されている通信プロトコルのことです。この通信プロトコルを使用することで、コンピュータが相互に通信することが可能になります。
　プロトコルは１つのプロトコルで実現されるのではなく、複数のプロトコルを階層的に組み合わせます。

| 層 | 各層の名称 | OSI参照モデル| プロトコル |
|:-:|:-:|:-:|:-:|
| 第４層  | アプリケーション層  |アプリケーション層、プレゼンテーション層、セッション層|HTTP、SMTPなど
| 第３層  |トランスポート層   | トランスポート層 |TCP、UDP
| 第２層  | インターネット層  | ネットワーク層 |IP、ルーティングなど
| 第１層  | ネットワーク・インターフェース層  | データリンク層、物理層 |イーサネット、WiFi、PPPなど|

　コンピュータ間で通信する場合は、上層（アプリケーション層から下層（ネットワーク・インターフェース層）へと渡され、受け取る際は、下層（ネットワーク・インターフェース層）から上層（アプリケーション層）へ渡される。送信する際に、各層でヘッダが付加される（カプセル化）。反対に受信する場合においては、各層でヘッダが取り除かれる（非カプセル化）。

　例えばユーザーがWebサイトを閲覧する際には、アプリケーション層で「HTTP」、トランスポート層で「TCP」（この時ポート番号の付加も行われる）、インターネット層では「IP」、ネットワーク・インターフェース層では「Ethernet」と上層から下層へとヘッダが付加され、Webサーバへ送られる。次にWebサーバはデータが到着すると、下層から上層へとヘッダが取り除かれ、HTMLファイルなどのデータを取り出し、同様にユーザーへデータを送信する。このような仕組みでWebサイトを閲覧している。

<h2>IPアドレス</h2>
　上記のインターネット層で、どのコンピュータに送信すればよいか、送信元を特定するのがIPアドレスである。IPアドレスは「192.168.2.1」のような数字の羅列で表記され、「グローバルIPアドレス」と「プライベートIPアドレス」の２つに分けることができる。「グローバルIPアドレス」とは、全世界で共通するIPアドレスであり、決して重複することがないものである。次に「プライベートIPアドレス」とは、会社や家庭などの組織で一意に割り振られるIPアドレスである。

<h2>ドメイン名</h2>
　IPアドレスは数字の羅列であるため、私たちが覚えるのは簡単ではない。そこでホームページやメールを利用する際は、私たちが覚えやすい意味のある名前「〇〇〇.com」のようなドメイン名が使用されている。
　ドメイン名は、インターネット上に存在するコンピュータやネットワークを識別するための名前である。ホームページで使用するURLは「http : //www .〇〇〇. com」 メールアドレスは「〇〇〇＠〇〇〇.com」などと表示され、「〇〇〇.com」の部分がドメイン名にあたる。

<h2>最後</h2>
　今回は、コンピュータ通信の仕組み、IPアドレスとドメイン名との関係について紹介しました。どこか修正点、補足等ございましたら、コメントよろしくお願いします！
ASRock A300 に CentOS7 を入れて自宅サーバ運用

下記を自宅サーバにしようと購入、非常に省スペースで使いやすいが
CentOS7.6 を入れようとしたところいくつか問題が発生したのでメモを残す

https://www.asrock.com/nettop/AMD/DeskMini%20A300%20Series/index.jp.asp

# NIC (Realtek RTL8111H) ドライバ問題

CentOS7 デフォルトの r8169 ドライバだと以下のエラーでリンクアップに時間がかかる
（しばらく待っていたらつながる）

```
NETDEV WATCHDOG: enp2s0 (r8169): transmit queue 0 timed out
```

以下を参考にドライバを入れ替える

https://gist.github.com/nekoya/3775259

```
# yum install -y kmod-r8168
```

ドライバを入れ替えてリブート後、うまくつながるようになった

```
$ modinfo r8168
filename:       /lib/modules/3.10.0-957.27.2.el7.x86_64/weak-updates/r8168/r8168.ko
version:        8.046.00-NAPI
license:        GPL
description:    RealTek RTL-8168 Gigabit Ethernet driver
author:         Realtek and the Linux r8168 crew <netdev@vger.kernel.org>
retpoline:      Y
rhelversion:    7.5
```

# LVM が md デバイス上の PV を認識しない
旧環境で使っていたHDD (LVM on MD Raid 構成) を新しい環境に引っ越して pvscan すると、md デバイスの PV を認識しない

数時間ハマったが、結論としては lvm.conf の設定を以下のように変更することで認識するようになった

```
md_component_detection = 0 # デフォルトは 1 だった
```

意味を考えると逆のような気もするが？？
優先度付きQueueの使い方

#ABC141のD問題を地獄のようなコードで解いてしまった
昨晩のAtCoder Beginner Contest 141を地獄のようなコードで回答してしまった。
[問題](https://atcoder.jp/contests/abc141/tasks/abc141_d)

優先度付きQueue(PriorityQueue)を知らぬが故、sort->pop->push->sort...を繰り返すという
脳筋技を使ってしまったので、その反省

##経緯
###問題文読みたくない人向けのさっくりした説明
- **すべての商品を買うための値段**を求めたい
- それぞれの商品には値段がついている
- ただし、N枚のクーポンを持っていて、クーポンを一つ使うと**一つの商品の値段が半額**になる

といった問題
※若干意訳あり

###筆者の脳内基本設計
値段の高いものからクーポン使い切るまで使っていけば安くなるのでは？

**凡例:**
クーポンが3枚あるとする。
3つの商品があり、値段はそれぞれ下記の通り。
100円,75円,40円

**解法:**
1. 100円の商品にクーポンを利用(100円->50円)
2. 75円の商品にクーポンを利用(75円->37円)
3. 50円の商品にクーポンを利用(50円->25円)
4. 25円,37円,40円の合計金額は**102円**なので、これを出力

###ここから地獄
基本設計レベルあたりまでは間違ってなかったと思うのですが、
コードに起こしたときに優先度付きQueueを知らずに、
LinkedList+Collections.sortに頑張ってもらうという記述

```java:Main.java
public static void main(String args[]) {
	FastScanner sc = new FastScanner();
	int n = sc.nextInt();
	int m = sc.nextInt();

	LinkedList<Integer> list = new LinkedList<>();
	for (int i = 0; i < n; i++) {
		list.add(sc.nextInt());
	}

	for (int i = 0; i < m; i++) {
		//ここゴリラ
		Collections.sort(list, Collections.reverseOrder());
		list.add(list.pop() / 2);
	}

	long result = 0;
	for (int x : list) {
		result += x;
	}

	System.out.println(result);
}
```
コードの解き方としてはおそらく正常に動作しておりましたが、
もちろんTLEとなり、死亡しました。

###なにが終わっているのか
言わずもがな、最大値を取るために、毎回sortを行っている部分がだめですね…
javaのCollectionのsortは修正マージソートを利用しているため、
商品の数をN,クーポンをMとすると、処理コストはN log(N)×M回処理が行われていることになる。

##こういったときに使えるPriorityQueueクラス
優先度付きキューのクラス(PriorityQueue)を使うことによって解消

###How to use PriorityQueue
使い方は至って簡単。
priorityQueueクラスを宣言し、addクラスで設定、
peakメソッドで参照(get的な動作),pollメソッドで取出し(pop的な動作)

```java:Main.java
	public static void main(String[] args) {
		Queue<Integer> q = new PriorityQueue<Integer>();
		q.add(1);
		q.add(2);
		q.add(3);
		q.add(4);
		System.out.println(q.poll());//output:1 q:{2,3,4}
		System.out.println(q.peak());//output:2 q:{2,3,4}
		System.out.println(q.poll());//output:2 q:{3,4}
	}
```
上記の例だと、最小値の1が取り出される。
(Queue内は2,3,4が残っている)

降順にしたいのであれば、コンストラクタの引数に`Collections.reverseOrder()`を設定

```java:Main.java
	public static void main(String[] args) {
		Queue<Integer> q = new PriorityQueue<Integer>(Collections.reverseOrder());
		q.add(1);
		q.add(2);
		q.add(3);
		q.add(4);
		System.out.println(q.poll());//output:4 q:{3,2,1}
		System.out.println(q.peak());//output:3 q:{3,2,1}
		System.out.println(q.poll());//output:3 q:{2,1}
	}
```

##優先度付きQueueを用いて、再度提出
```java:Main.java
public static void review(String args[]) {

		FastScanner sc = new FastScanner();
		int n = sc.nextInt();
		int m = sc.nextInt();

		Queue<Integer> q = new PriorityQueue<Integer>(Collections.reverseOrder());
		for (int i = 0; i < n; i++) {
			q.add(sc.nextInt());
		}

		for (int i = 0; i < m; i++) {
			q.add(q.poll() / 2);
		}

		long result = 0;
		for (int x : q) {
			result += x;
		}

		System.out.println(result);
	}
```

結果は<font color="DarkGreen ">**AC**</font>,179msとだいぶ早く処理してくれました。
[PyCon2019レポート] Pythonを使ったAPIサーバー開発を始める際に整備したCIとテスト機構

Session: https://pycon.jp/2019/schedule?sessionId=119

参加して来ました。

自分がピンと来た部分だけをピックアップして紹介します。詳細は公開されている資料をご覧ください。

# 資料

- SpakerDeck https://speakerdeck.com/hgsgtk/python-api-ci-test


## 主旨

発表者: Higashiguchi Kazuki さん / [@hgsgtk](https://twitter.com/hgsgtk)

筆者がPythonを業務で使い始めたときに、やっててよかったと思える準備について語る。**学習サイクルを促進できるCI導入・自動テストの考え方**を述べる

## どのような観点でテスト/チェックするのか

CIを入れて、指摘結果から学ぶ。

- コード検査
  - コーディング規約 (PEP8, PEP257など)
  - テスト - 「テスタビリティの声」を聞く
    - テストを書けば、自分のコードがどの程度「テストしやすいのか」の感覚が得られる
    - 「テストしやすさ」の感覚は、「関心」の分離がなされた疎結合なコード設計を促す
  - docstring
    - コードは、**書く時間よりも、読まれている時間の方が多い** という考え方に従う
  - 型検査
- 自動テスト
  - テストスコープを、アプリの内部に留めたい（外部環境に依存するテストは不安定である）
  - 外部への依存を分離して、簡単に差し替え可能な設計になっているか？
  - テストを実行する「前準備」のコストから、設計に対するフィードバックが得られる
    - 疎結合なコード設計に目を向けるきっかけになる

# 感想

ポジティブにCI/テストする、というテンションが非常に良かったです。

テクニカルというよりはメンタル的な、啓発的な色が強いセッションという印象でした。だがそれが良い。

「慣れない人からしたら、テストは _やったほうがいい、でも面倒_ というイメージが強いと思う。でも、CIやテストを自分のコード設計に対するフィードバックとして積極的に取り入れたらもっとハッピーになれるよ」

といったようなことを終わり際に話されていました（一言一句は覚えていませんが）。私自身も、多少ながらテストを意識してコードを書くようになってきたのでこの言葉は至言だなと思いました。とても良いセッションでした。
【Swift】reduceを使ってInt型配列の中身の合計値を取得する(自分用メモ)

配列に入っている数値をスマートに合計したかった.
reduceを使えば一行でできることがわかった.
足し算だけでなく、引き算や掛け算にも応用できる.

# 配列内の数値の合計値を取得する
```reduce.swift
let array: [Int] = [1, 2, 3, 4, 5]
let result: Int = array.reduce(0) { $0 + $1 }

print(result)
// 結果 -> 15
```
reduceでは`{}`内の処理が要素数の分だけ繰り返される.

# 1回目の動き
`reduce()`の中身は初期値.
自身で好きな値を入れられる.

```reduce.swift
reduce(0)
// -> 初期値として 0 を代入している.
$0
// -> 初期値 0 が代入される.
$1
// -> 配列の要素が左（Indexが０の値）から代入される.(ここではarray[0] = 1)
```

# n回目の動き
``` reduce.swift
$0
// -> (n-1)回目の計算結果が代入される.
$1
// -> array[(n-1)]の値が代入される.
```

# 合算(+)以外の計算
`{}`の中身を`-`や`*`に書き換えれば繰り返し計算ができる.
Epoc Timeの変換式（Excel）


Epoch TimeのExcel上でyyyy/mm/dd形式に変換したい場合、下記変換式を適用のもと、セルの書式設定を「yyyy/mm/dd 等」に変更する。



### Epoc Time(secound)の変換式

```
 = (<TimeStamp> / 86400) + DATE(1970,1,1)
```

### Epoc Time(Millisecound)の変換式

```
 = (<TimeStamp> / 86400000) + DATE(1970,1,1)
```

以上
draw.ioでAWSのネットワーク構成図を作りたい。

awsを使ってシステム作るときのネットワーク設計書をdraw.ioを使用してつくる。

始め方は以下を参考にさせていただきました。
[https://qiita.com/nave-m/items/68425f476b254a1a47b0](https://qiita.com/nave-m/items/68425f476b254a1a47b0)

アイコンはedrawのアイコン一覧を参考にしました。
（設計書も今度はedrawで作ってみようかしら。）
[https://www.edrawsoft.com/jp/aws-icons.php](https://www.edrawsoft.com/jp/aws-icons.php)

成果物↓
（作図から滲み出る図の配置のセンスのなさ・・・悲しい。）
![aws_network (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351087/61aebbc4-7094-a9bc-0739-d6f7d8fd0327.jpeg)


良い点
1.ブラウザでできる。（macのofficeソフトが重たすぎる）
2.ithubと連携できる。
3.アイコンが豊富。
4.図を配置するときに、小さいマス単位で動かせるから、縦横が変にずれにくい。
5.上記の図くらいなら始めたばっかでも1時間かからないくらいで作れちゃう。

以下、更新履歴。（参照していただいてる方にはご迷惑おかけします。）
※2019/10/01 当初はプライベートネットワークにPostgreSQL用EC2インスタンスを作成し、インターネットからPostgreSQLをダウンロードするためのNATルーターを配置する予定だったが、RDSを採用したため図からNATルーターを削除。

※2019/09/28 RDSを作成する際に異なるアベイラビリティゾーンにスタンバイインスタンスを作成することが必須であったため、図を修正。
Rust勉強中 - その1 -> 環境構築

# 自己紹介
出田 守と申します。
しがないPythonプログラマです。
情報セキュリティに興味があり現在勉強中です。CTFやバグバウンティなどで腕を磨いています。主に低レイヤの技術が好きで、そっちばかり目が行きがちです。

Rustを勉強していくうえで、読んで学び、手を動かし、記録し、楽しく学んでいけたらと思います。

# 動機
今回なぜRustに興味を持ったかというと、

* 最近特に話題になっている気がする
* システム向けのプログラミング言語をマスターしたい
* セキュリティを学ぶ上でもRustを通してメモリ管理の方法を学びたい
* システムプログラミングをしたい
* などなど

あげるとキリがない、欲望の塊ですね。
私はPythonからこの世界に入り、Cは学生時代と勉強のために少し使っていた程度で、C++なんかは使ったことがないという・・・。なので、一つはシステム向けのプログラミング言語を操れるようになりたいという気持ちから興味を持ちました。
あと、やはりコンピュータ技術でもコアな部分を触りたいという気持ちもあります。例えば、OSを作ったり、デバイスドライバを作ったりしたいです。作って、動かしている姿を想像するとワクワクしますよね。

# Rustとは
上でも書いた通りシステム向けプログラミング言語のひとつです。ほかにはCやC++などがあります。
RustはCやC++では難しいメモリの管理を正しく制御し、これらをコンパイル時にチェックしてくれるようです。
Rustでは所有権、移動、借用という機構が存在します。

* 所有権は個々の値の生存期間を明確にすること
* 移動はある値をある所有者へ引き渡すこと
* 借用は所有権に影響を与えることなく一時的に値を利用すること

今はモヤモヤしていますが、これらは勉強を進めていくうちに学んでいくと思います。

# 環境構築
今回新しい言語を学ぶということで、普段はLinuxを使っていますが、Windowsという新しい環境で構築し学んでいこうと思います。また、エディタもEmacsを使っていますが、Vimを使うことにしました。
以下、私の環境です。

OS: Windows10 Home 64bit 1903 
CPU: Intel Core i5-3470 @ 3.20GHz
RAM: 8.00GB

## インストール
インストールは非常に簡単でした！WindowsはVisual C++ 2013以降が必要なようなので事前にインストールしておいてください。

1. https://www.rust-lang.org/tools/install にアクセス
2. Windowsの場合はrustup-init.exeをダウンロード&インストール。Linuxの場合は`curl https://sh.rustup.rs -sSf | sh`とするだけでしょうか(未検証)。


環境変数もPATHに.cargo/binが自動で設定されていました。至れり尽くせりですね！

## バージョン確認

```
$ cargo --version
cargo 1.37.0 (9edd08916 2019-08-02)
$ rustc --version
rustc 1.37.0 (eae3437df 2019-08-13)
$ rustdoc --version
rustdoc 1.37.0 (eae3437df 2019-08-13)
```

これら3つのコマンドについて

* cargoはRustのコンパイルとパッケージを管理。
* rustcはRustのコンパイラ。通常はcargoでコンパイルしてくれるが、直接実行することもあるらしい。
* rustdocはRustのドキュメンテーションツール。ソースコード中のコメントを正しく記述していればHTMLなどでドキュメント化してくれるらしい。


今回はここまで。