OmniAICreator/Qiita-1.07M huggingface dataset:
Gradle6系 + Jacoco + マルチモジュール + フルKotlin + Android + Robolectric環境でユニットテストのカバレッジを出す

何番煎じなのか分かりませんが、Gradleが6系になりまた記述方法が変わったりしたので気にせずに記事にします。

- Gradle: 6.0.1
- Android Gradle Plugin: 3.5.3

の環境で検証しています。
また、カバレッジの算出に不要な記述は省いています。

実際のプロジェクトでどのように書くか気になる場合は以下を参照
https://github.com/ohmae/touch-icon-extractor

## シングルモジュール

まずはマルチモジュールの前に各モジュールの中でのカバレッジ算出です。

```gradle
apply plugin: "jacoco"

android {
    testOptions {
        unitTests.includeAndroidResources = true
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
}

jacoco {
    toolVersion = "0.8.5"
}

task jacocoTestReport(
    type: JacocoReport,
    dependsOn: "testDebugUnitTest",
    group: "verification"
) {
    reports {
        xml.enabled = true
        html.enabled = true
    }
    getSourceDirectories().from = "${projectDir}/src/main/java"
    getClassDirectories().from = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug")
    getExecutionData().from = "${buildDir}/jacoco/testDebugUnitTest.exec"
}
```

これだけです。ビルドバリアントに依存する部分がありますので、その部分は適宜書き換えてください。

```gradle
android {
    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
}
```

上記の記述がないと、Robolectricを使ったテストのカバレッジが算出できません。

```gradle
getClassDirectories().from = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug")
```

上記の部分はコンパイルされたクラスファイルの指定です、Androidでは自動的に生成されるクラスを除外する記述を行いますが、(現時点では)javaとkotlinでクラスファイルの場所が違っており、フルKotlinのプロジェクトならKotlinのクラスファイルを指定するだけで除外する必要はありません。

## マルチモジュール

マルチモジュールでプロジェクト全体のカバレッジを出すには、各プロジェクトごとのカバレッジ情報を集める必要があります。
これはルートプロジェクトのGradleファイル上でタスクを定義します。

```gradle
apply plugin: "jacoco"

jacoco {
    toolVersion = "0.8.5"
}

task jacocoMerge(
    type: JacocoMerge,
    group: "verification"
) {
    gradle.afterProject { project, _ ->
        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
            executionData "${project.buildDir}/jacoco/testDebugUnitTest.exec"
        }
    }
}

task jacocoMergedReport(
    type: JacocoReport,
    dependsOn: [tasks.jacocoMerge],
    group: "verification"
) {
    getExecutionData().from = jacocoMerge.destinationFile

    gradle.afterProject { project, _ ->
        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
            getSourceDirectories().from += "${project.projectDir}/src/main/java"
            getClassDirectories().from += project.fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/debug")
        }
    }
    reports {
        xml.enabled = true
        html.enabled = true
    }
}
```

ルートプロジェクトはサブプロジェクトよりも先に評価されるため。そのままではサブプロジェクトの情報を集められない。
`gradle.afterProject` を使って、各プロジェクトが評価された後にクロージャを経由して情報を収集する。
クロージャではルートプロジェクト自身と、Jacocoを使っていない、カバレッジ算出対象外のプロジェクトを除外しています。
モジュールごとの算出と同じものを集めているだけといった形です。

jacocoMergeの依存関係で各モジュールのテスト実行をさせたかったのですがうまくいかず、補足いただけると幸いです。

以上です。
順列列挙

整数型配列やVectorを順列で一つ一つ処理をしていく方法
next_permutation関数を使う。
関数の使い方が少し独特である。
全ての順列を取得したい場合は、この関数に最初に与える範囲が、
昇順にソート済みになっていること。
つまりこの関数は、現在の状態から順々に並び替えて次の値を取得する、ということ

順列は自分で実装する場合は再帰を使うが、わりと手間である。

整数型配列

```cpp
	int a[5] = { 1,2,3,4,5 };
	do {
		for(int i = 0;i<4;i++){
			cout << a[i] << " ";
		}
		cout << endl;
	} while (next_permutation(a, a + 4));
```

Vector

```cpp
	vector<int> v = { 6,7,8,9 };
	do {
		for(auto V : v){
			cout << V << " ";
		}
		cout << endl;
	} while (next_permutation(v.begin(), v.end()));
```

文字列

```cpp

	string b = "abcde";
	do {
		cout << b << endl;
	} while (next_permutation(b.begin(), b.end()));
よさこいの隊列表を書くのがめんどくさい

#隊列表とは何か
よさこいやダンスなどで使われ、曲のタイミングや人間の位置、踊りの拍などが細やかに書いてある表のこと。
これを作るのが非常にめんどくさい。この一言に尽きる。
とりあえず隊列表の例を載せておく。
<img width="320" alt="o0480048011835488267.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481147/89e99ec5-5a95-4de7-35bb-0b0f2b7e678b.jpeg">
引用:https://ameblo.jp/kana-shape/entry-11184648505.html

上の例では数十人だが、チームの人数が100人を超えれば、〇の記号を人間の位置だけでページ数×100個書かなければならない。
私の感覚だと、どのチームでも大抵10ページ以上は書いている。

よさこいをやっている方々なら、振り班が必死で隊列表を書いている姿を見たことがあるはずだ。
学生ならば、授業中に作成したり、期日が近ければ徹夜して書くこともよくある。
社会人となれば休憩時間を費やしたり、貴重な休日が失われてしまう。
もっと追い詰められれば仕事にも影響を与えてしまうかもしれない。

もしも、簡単に作れるようなアプリケーションが存在したら…。

#隊列表アプリを作ってみる
そこで、Visual Studioを使って実際に作ってみようと思った。
最新のユニバーサル Windows プラットフォーム (UWP) で実装してみよう
進捗次第ではあるが、Mac,Android,iOSでも使えたらいいなぁ。

#まずはVisual Studioのインストール
1時間くらいかかった。これが一番めんどくさい。

#プログラムの設計
クラスとしては、人間(person)、物(tool)、隊列表(table)、祭りくらいだろうか。
ある祭りに対して隊列表が何ページが存在することにする。
隊列表の要素(オブジェクト)としては、人間と物である。

なぜ物があるかといえば、最近のよさこいは大道具の派手さで勝負(大道具戦争)をしているからだ。
大道具がステージの半分くらい占める時もある。

まず必要な機能を決めよう。

#祭りに対する操作
- 新規作成
- 名前の設定
- 名前を付けて保存
- 画像に変換して出力 (pdfはちょっとめんどくさい…。)

#隊列表に対する操作
- 新規作成
- 複製
- 削除
- 隊列表の名前の設定
- ステージサイズの設定
- ステージの向きの設定
- オブジェクトの間隔の設定

#隊列表上のオブジェクトに対する操作
- オブジェクトモード
    - 左クリックで配置
    - 右クリックで削除
    - ドラッグで移動
    - オブジェクトの形の設定
    - ダブルクリックでオブジェクトの名前の入力
    - 名前の重複確認
- 描画モード
    - 線や四角形の入力
    - テキスト入力
- カラーモード
    - 色の選択
    - オブジェクトの選択
    - オブジェクトの色の変更



#Windows Formのデザイン
ぶっちゃけデザインは苦手なので、得意な方にお願いしたいレベル。

#次回は実装編
実装は大変そう…。
まだまだ続きます。
Azure [Functions]、スタート

Azure Functionsのクイックノート

# 事前に必要なもの

- Visual Studio
- Azure アカウント
- Azure Storage アカウント(任意、この投稿ではAzure Storageアカウントを使っています)
- VisualStudio Dev Op アカウント

# プロジェクトのスタート

Visual Studioで新しいプロジェクトを開始する際にAzure Functionsを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/d90e26b1-7019-5487-af85-78c196b76bf1.png)

プロジェクト名、ソリューション名を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/b403df42-91a5-fd0a-49c9-1e20a748acd2.png)

次にトリガーをセットします。
今回はWebhookに対してのアクションを設定したいので、APIを指定します。
Httpトリガーを指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/06ca07a4-b3bf-70e8-8c8d-c3fa2f82e4b7.png)

自動的に下記のコードが生成されます。

```csharp

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace ShopifyWebhookHandler
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }
}
```

# 実行

上記のFunctionを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/6908e8f2-47a9-1a62-b697-c7d5c428705a.png)

準備完了とのことで、下記のURLをブラウザーに入力しロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/6d201388-0d8b-236f-9a86-9c8ec90c2065.png)


実行できました。

# 次

次回は他のトリガータイプも紹介したいと思います
基本情報技術者試験の勉強計画1月

##　基本情報技術者試験の勉強計画　1月
### 目標
・体調管理
・計算問題の克服
・早寝早起き
・できる限り繰り返し解く
### 結果
・無理せず試験勉強に取り組めた
・早起きを実施したのでテスト中眠くならずに済んだ
・繰り返し何度も解いた
## 振り返り
### keep
・復習を続けること
・自分のペースで続けること
### problem
・遊んでしまうこと
・計画通りに進まないこと
### try
・次に向けた計画を立てる
## 週次報告
### [第12週(1/6週)](https://qiita.com/poohsan/items/9fd618fa8689286ce262)
### [第13週(1/13週)](https://qiita.com/poohsan/items/3f5428b7dbdda02a144b)
### [第14週(1/20週)](https://qiita.com/poohsan/items/0c281a1f09279ba7d3f7)
### [第15週(1/27週)](https://qiita.com/poohsan/items/7b8aa5c8e0ccb20bcbc6)
【React Native】アプリ開発 〜プロジェクトのビルドから下準備まで〜

# 開発環境
- MacOS(シェルは.bash)
- Atom(エディター) #もちろんどのエディターでもできるにはできるはず。
- Expo

# プロジェクトのビルド

まずは新規プロジェクトを作りたいディレクトリにcdとかmkdirとかして、

```python
expo init
```

を実行。
いろいろ種類はあるけど、とりあえず

```python
blank
```
を選択してみる。
名前とか要求されるので適当につける。
これで新規プロジェクトのディレクトリができている。

# 必要なライブラリを用意する
## 1.構文チェックのためのライブラリ

```terminal
cd hogehoge #さっき作ったプロジェクト
```

して、

```terminal
npm install --save-dev eslint babel-eslint eslint-config-airbnb
```

- eslint
- babel-eslint
- eslint-config-airbnb

これでこの3つのライブラリがインストールできた。
コードの書式の誤りを怒ってくれるやつらしい。
これで記述ミスが減らせるはず。
--save-devは『開発環境にのみ必要ですよ。』って言っているぽい。

インストールできているかどうかは、プロジェクトのディレクトリにある
package.json
で管理されているので、それを確認すると、さっきインストールしたライブラリの記述が増えている。

>  "devDependencies": {
    "@babel/core": "^7.0.0",
    "babel-eslint": "^10.0.3",
    "babel-preset-expo": "~8.0.0",
    "eslint": "^6.8.0",
    "eslint-config-airbnb": "^18.0.1"
  },
>

こんな感じの記述が増えているはず。

さらに、

```terminal
npm install eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react
```

で、

- eslint-plugin-import
- eslint-plugin-jsx-a11y 　#Lではなくて数字の１なので注意。
- eslint-plugin-react

も追加。

最終的にはこんな感じになっていればok。

```json:package.json

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "eslint-plugin-import": "^2.20.1",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-react": "^7.18.3",
    "eslint-plugin-react-hooks": "^1.7.0",
    "expo": "~36.0.0",
    "react": "~16.9.0",
    "react-dom": "~16.9.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-36.0.0.tar.gz",
    "react-native-web": "~0.11.7"
  },
  "devDependencies": {
    "@babel/core": "^7.0.0",
    "babel-eslint": "^10.0.3",
    "babel-preset-expo": "~8.0.0",
    "eslint": "^6.8.0",
    "eslint-config-airbnb": "^18.0.1"
  },
  "private": true
}
```

## 2.Atomにパッケージをインストール

- linter
- linter-eslint

※依存関係に関するメッセージが出たら、それに追随するパッケージもインストール。


## 3. ".eslintrc.json"の作成・記述

さらに、プロジェクトのディレクトリの直下に　.eslintrc.json　というファイルを作って、

```json:.eslintrc.json
{
  "extends": "airbnb",
  "plugins": [
    "react",
    "jsx-a11y",
    "import",
  ],
  "parser": "babel-eslint"
}
```
を記述。そして、Atomを再起動。
そうすれば構文エラーなどを怒ってくれるようになる。

今後怒られるルールを書き換える時にはこの記事とかも参考になりそう。
[意外と知られてないっぽいMarkDownのリンクの書き方](https://mae.chab.in/archives/2874)

次回はReactNativeでアプリ画面を作ってみようと思います。
【jQuery】ボタンを押したらdivタグの表示・削除を実行するtoggle


```html:filename.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="comListBtn">各企業名を展開　/　閉じる</div>
    <div id="comListWrapper">
      <ul class="comList01">
        <li>株式会社A</li>
        <li>株式会社B</li>
        <li>株式会社C</li>
      </ul>
</div>
```

```css:filename.css
ul.comList li {
  width: 100px;
  height: 100px;
  border: 1px solid black;
}

#comListBtn {
  background-color: azure;
  display: inline-block;
  padding: 10px 20px;
  border: 1px solid black;
  border-radius: 30px;
}

#comListBtn:hover {
  cursor: pointer;
  background-color: orange;
}
```

```html:filename.js
    $(function(){
        // 「id="comListWrapper"」を非表示
        $("#comListWrapper").css("display", "none");
     
        // 「id="comListBtn"」がクリックされた場合
        $("#comListBtn").click(function(){
            // 「id="comListWrapper"」の表示、非表示を切り替える
          $("#comListWrapper").toggle();
        });
    });
```
OctoPrint+IFTTTで3Dプリンタの印刷状況をスマホに通知する

# 最初に
OctoPrint-IFTTTというOctoPrint用のプラグインからIFTTTのWebhooksに連携するだけです。意味が分かる方は以下は読む必要ありません。

# 環境
* OctoPrint導入済みの環境（ラズパイなど）

# 事前準備
* [IFTTT](https://ifttt.com/)のWebhooksを使ったことがない場合は、[IFTTT](https://ifttt.com/)にアクセスし、Webhooksサービスを登録する。
* [My Services]->[Webhooks]->[Documentation]からアクセスキーを確認しておく。
![octo3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70061/91f614ea-517a-82d7-4cda-3d16275346fe.png)


# 手順
* OctoPrintのプラグインマネージャーからOctoPrint-IFTTTをインストールします
<img width="731" alt="octo2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70061/62f4f094-0a93-5f36-0f07-a94f293cfe2e.png">

[Makerkeys]のところにIFTTTで確認したキーを入力します。
[DefaultPrefixs]はデフォルトのままでOKです。

[Event & Triggers]を編集する
- Event Name: [http://docs.octoprint.org/en/master/events/index.html#printing] (http://docs.octoprint.org/en/master/events/index.html#printing)を参考に入力する。
よく使いそうなのはPrintStartedやPrintDone、PrintFailedあたり。
- Trigger Names: IFTTTのWebhooksで発火するときのキーとなる名称。わかりやすい名前を付けておきます
- Value1～Value3: 一緒に送るペイロード。[http://docs.octoprint.org/en/master/events/index.html#printing](http://docs.octoprint.org/en/master/events/index.html#printing)に記載があるが、
name=ファイル名　time=時間　reason=失敗理由などが便利。

![octo11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70061/92447620-6340-3004-923f-23f1897f4bea.png)

最後にIFTTTのWebhooksの設定で[Event Name]を[Trigger Names]と同じにすればOK。
LINEやスマホへのプッシュ通知（要IFTTTアプリ）、メール送信など自由に通知先を設定できる。
![octo5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70061/257fdb73-9e1e-8cc9-7e36-aafb97adf506.png)
DNSラウンドロビン - Qiitaの例

##DNSラウンドロビンとは

>DNSラウンドロビン(DNS Round Robin)とは、DNSを利用して一つのサービスに複数台のサーバを分散させる手法です。
 （[1]より）

##Qiitaの例

　コマンド。

```shell
User:~ user$ dig qiita.com
```

結果。

```shell
User:~ user$ dig qiita.com

; <<>> DiG 9.10.6 <<>> qiita.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58697
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;qiita.com.			IN	A

;; ANSWER SECTION:
qiita.com.		56	IN	A	18.176.94.118
qiita.com.		56	IN	A	3.113.145.178
qiita.com.		56	IN	A	52.192.235.44

;; Query time: 105 msec
;; SERVER: 192.168.100.1#53(192.168.100.1)
;; WHEN: Sun Jan 05 20:48:16 JST 2020
;; MSG SIZE  rcvd: 86
```

```shell
User:~ user$ dig qiita.com

; <<>> DiG 9.10.6 <<>> qiita.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35328
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;qiita.com.			IN	A

;; ANSWER SECTION:
qiita.com.		47	IN	A	52.192.235.44
qiita.com.		47	IN	A	3.113.145.178
qiita.com.		47	IN	A	18.176.94.118

;; Query time: 91 msec
;; SERVER: 192.168.100.1#53(192.168.100.1)
;; WHEN: Sun Jan 05 20:50:36 JST 2020
;; MSG SIZE  rcvd: 86
```

##参考文献
[1][[24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ) ](https://www.amazon.co.jp/24%E6%99%82%E9%96%93365%E6%97%A5-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E2%80%BE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%80%81%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%80%81%E7%9C%81%E5%8A%9B%E9%81%8B%E7%94%A8-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774135666)
動画や音声ファイルの音量(ゲイン)を ffmpeg で調整するときのメモ

# やりたいこと

- mp3 や mp4 などの音声データの音量を、ffmpeg で聞きやすいレベルに変換する方法です。
- ffmpeg 4.0 を使います。
- Windows 10 / Ubuntu 20.04LTS / MacOS 10.15.7 (intel) のどれでもできることは確認済み(M1 Mac では試してません)。

# 参考

- https://nico-lab.net/normalize_audio_with_ffmpeg/
- https://nico-lab.net/ebur128_with_ffmpeg/
- https://qiita.com/cha84rakanal/items/e84fe4eb6fbe2ae13fd8
- https://ffmpeg.org/ffmpeg.html

むしろ上記の抜粋。

# 実食

## 音量レベルを確認する。

```
ffmpeg -i input.mkv -vn -af volumedetect -f null -

```

- -i は入力ファイル。mp4 でも mp3 でも OK
- -vn でビデオストリームを無視する
- -af でオーディオフィルタを指定する (volumedetect フィルタの指定)
- -f null で出力ファイルを null に指定。
- 最後の - はダミー

```
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] n_samples: 30121984
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] mean_volume: -35.0 dB
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] max_volume: -10.0 dB
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_10db: 14
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_11db: 66
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_12db: 256
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_13db: 498
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_14db: 1262
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_15db: 2748
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_16db: 6410
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_17db: 10955
[Parsed_volumedetect_0 @ 0x7ffdf671c9c0] histogram_18db: 20253
```

こんな感じで出るので、max_volume が 0dB くらいになるように合わせる。上の場合は max_volume が -10dB になっているので 10dB 上げる。

## ゲイン調整

```
ffmpeg -i input -af volume=10dB output
```

- -af volume でゲインを指定する。

再エンコード不要の場合は下記：

```
ffmpeg -i input -codec:v copy -af volume=10dB output
```

## 無音部分を取得する

おまけ

```
ffmpeg -i input -af silencedetect=n=-30dB:d=1 -f null -
```

- n で音量のレベルを指定する
- d でそのレベルが続く時間 (sec) を指定する
【デプロイ】package.jsonのdependenciesとdevDependenciesの違いで本番環境デプロイ失敗

## はじめに
Rails+Vue.jsのSPAを本番環境(Heroku)にデプロイしようとしたときに、以下エラーが発生しました。

```shell
ModuleNotFoundError: Module not found: Error: Can’t resolve ‘vuetify’ in ...
```
いや、開発時は**Vuetify**普通に使ってたしな…と思いつつ、こちらを解決した方法を残します。

## 環境
```yaml
OS: macOS Catalina 10.15.1
```
## 結論:package.jsonでミス発見

【Before】

```json:package.json
{
  "name": "app_name",
  "private": true,
  "version": "0.1.0",
  "dependencies": {
...
  },
  "devDependencies": {
    "vuetify": "^2.1.15", //これがおかしい
    "webpack-dev-server": "^3.10.1"
  }
}
```
↓
【After】

```json:package.json
{
  "name": "app_name",
  "private": true,
  "version": "0.1.0",
  "dependencies": {
...
    "vuetify": "^2.1.15", //移動
  },
  "devDependencies": {
    "webpack-dev-server": "^3.10.1"
  }
}
```

## 理由

`devDependencies`に記載されたパッケージは本番環境に反映されません。
[【いまさらですが】package.jsonのdependenciesとdevDependencies - Qiita](https://qiita.com/chihiro/items/ca1529f9b3d016af53ec)

```json
{ 
  "name": "app_name",
  "dependencies": {
    //どの環境でも使用するパッケージ（本番環境含む）
  },
  "devDependencies": {
    //開発環境のみで使用するパッケージ
  }
} 
```

## なぜ`devDependencies`に入ってしまったのか
恐らく、`yarn add`の時にミスしたと考えられます。
[依存関係の管理 | Yarn](https://yarnpkg.com/lang/ja/docs/managing-dependencies/)

> yarn add --devはdevDependenciesを追加します。

普通は

```shell
$ yarn add vuetify
```
でインストールしますが、

```shell
$ yarn add --dev vuetify
```
とインストール時にコマンドを誤ってしまったようです。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [【いまさらですが】package.jsonのdependenciesとdevDependencies - Qiita](https://qiita.com/chihiro/items/ca1529f9b3d016af53ec)
- [依存関係の管理 | Yarn](https://yarnpkg.com/lang/ja/docs/managing-dependencies/)
MOLファイル、SDFファイルにおける同位体、電荷、ラジカルの記載方法について調べてみる

#はじめに
MOLファイル、SDFファイルにおける同位体、電荷、ラジカルの記載方法について、少し突っ込んで調べてみた。

#対象
以下の形式とした。
- V2000 fomat

#調査したURL
- [CTFile Formats](https://www.daylight.com/meetings/mug05/Kappler/ctfile.pdf)
 　本家っぽい。これが一番詳しかった。
- [MOL V2000 files](https://chemaxon.com/marvin-archive/latest/help/FF/19693841.html#MDLMOLfiles,RGfiles,SDfiles,Rxnfiles,RDfilesformats-molMOLV2000files)
  chemaxonのサイト。まとまってはいるが、具体的な書式等に関する詳細はかなり端折られている。
- [平成 29 年度化学物質安全対策（新規化学物質申出における構造を表すコードの記載のあり方に関する調査）報 告 書](https://www.meti.go.jp/meti_lib/report/H29FY/000629.pdf)
 経済産業省の調査報告書であり、概要レベルの話が載っている。

#分かったこと
ほぼ[CTFile Formats](https://www.daylight.com/meetings/mug05/Kappler/ctfile.pdf)の抜粋になるが、以下の通り。

## 同位体
プロパティブロックに以下の形式で記載する。

```
M ISOnn8 aaa vvv ..
```
ここでnn8はエントリーの数であり、1～8まで指定できる。aaaは原子番号である。
vvvは、同位体の絶対質量であり、正の整数である。
このプロパティが存在する場合、原子ブロック内の同位体値に優先する。 
デフォルト（エントリなし）は、natural abundanceである。


## 電荷
プロパティブロックに以下の形式で記載する。

```
M CHGnn8 aaa vvv ...
```
nn8とaaaは同位体と同じである。
vvvは電荷であり、デフォルトの0は非荷電原子を意味する。 
このプロパティが存在する場合、原子ブロック内の電荷およびラジカル値に優先し、M CHGまたはM RAD行にリストされていないすべての原子に0電荷を強制する。

## ラジカル
プロパティブロックに以下の形式で記載する。

```
M RADnn8 aaa vvv ...
```
nn8とaaaは同位体と同じである。
vvvがラジカルの値であり、デフォルトは0 =ラジカルなしである。　1 =singlet（:)、2 =doublet（.または^）、3 =trilet（^^）。 
このプロパティが存在する場合、原子ブロック内のすべての電荷とラジカルの値に優先し、M CHGまたはM RAD行にリストされていないすべての原子に0（ゼロ）の電荷とラジカルを強制する。

#注意
これらは原子ブロックでも指定はできるようだが、古いCtabとの互換性のために保持されており、プロパティブロックが優先されるようだ。
ラズパイ3（OS：Ubuntu 18.04(64bit)）にOpenCVをインストール

# はじめに
今回、諸事情によりラズパイ3 Model B+ に 
・Ubuntu(64bit)
・OpenCV
をインストールしなければならなくなりました。

OpenCVをインストールしてpythonで使用出来るまでに
かなりつまづいたたので、備忘録的に書いていこうと思います。

ちなみに
今回私が使用した環境は以下の通りです。
・ラズパイ3 Model B+ 
・Ubuntu 18.04LTS(64bit)
・OpenCV 3.4.0

#Ubuntuのインストール
Ubuntuをインストールするに辺り以下の記事を参考にさせていただきました。
・[Raspberry Pi 3で64ビット版Ubuntu 19.10を起動してみました](https://denor.jp/raspberry-pi-3で64ビット版ubuntu-19-10を起動してみました)

こちらはUbuntuのバージョンが異なりますが基本的には上記記事の通り
[こちら](https://wiki.ubuntu.com/ARM/RaspberryPi)よりイメージファイルをダウンロードしてSDカードに書き込みます。

ちなみに今回18.04を選んだ理由としては
・上記ダウンロードサイト内の16.04が
　ラズパイ3 Model B+ では<font color="Red"> 起動出来なかった</font>ため
・19.10のpythonのバージョンが ‘3.7系’で
　numpyが上手くインストール出来なかったため
です。

#OpenCVのインストール
OpenCVのインストールの細かいコマンド等については、
多くの記事が出ているので、この記事では割愛します。

ここでは、OpenCVをインストールするに辺り
つまづいた点について書いていきます。

###①libjasper-dev,libpng12-devがない
Ubuntu18.04には、パッケージに上記2つがないため、

```
sudo apt-get install libjasper-dev
sudo apt-get install libpng12-dev
```
を実行すると、エラーが出ます。
（libpng12-devはlibpng-devに名称が変更になったとか）

これを解消するために[こちら](https://qiita.com/usk81/items/98e54e2463e9d8a11415)を参考にしました。
リンクの記事にある通り、libjasper-dev等が存在する
バージョンのリポジトリを追加する必要があります。

しかし、リンク記事にある

```
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu bionic-security main"
```
や、コメント欄にある

```
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
```
を<b>ラズパイ</b>で実行すると<font color="Red">エラー </font>になります。
（以下エラーが出ます）

```
404 not found
```

理由としては、ラズパイのCPUがARMであることです。
上記2つのリポジトリは、Intel向けのみのフォルダしか存在しておらず、
ラズパイにて実行するとARM向けのフォルダを探そうとするため、404になってしまいます。

そのため、

```
sudo add-apt-repository "deb http://ports.ubuntu.com/ubuntu xenial-security main"
```
とARM向けのフォルダが存在するリポジトリを指定してあげる必要があります。

ちなみに、上記コマンドはOpenCVに必要なライブラリを<b>インストールする前</b>に
実行した方が良いです。
（私は、`sudo apt update`, `sudo apt upgrade`を実行する前に実行しました。）


これで、` libjasper-dev `と`libpng12-dev`をインストールすることが出来るようになるはずです。

###②メモリ不足によりmakeが止まる
①により、インストールがサクサク進み、意気揚々とmakeコマンドを実行するも、
以下のファイルをビルドしている最中に、止まる事があります。

```
modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o
```

[こちら](http://www.neko.ne.jp/~freewing/raspberry_pi/nvidia_jetson_nano_build_opencv_410/)の記事によれば、これとpython2はメモリを喰うらしく
メモリ不足によりmakeが止まってしまうそうです。私自身の環境でもずっと止まっていました。

そのため、仮想メモリを追加してあげる必要があります。
今回は[こちら](https://blog.masato.xyz/ubuntu-server-1804-lts-swapfile-setup)の記事を参考にさせていただきました。

仮想メモリを追加してあげた状態で再度makeすることで、
多少時間はかかりますが、最後まで実行されるはずです。

OpenCVをインストールするに辺り、つまづいた点は以上になります。

#終わりに
この辺りがクリアできれば、OpenCVが使えるようになると思います。

今回、インストール完了するまでに結構かかったので忘れないようにしないとですね...。
認証と認可について

## 認証と認可の違い
### 認証(Authentication,AuthN)
- 誰であるか確認すること。
- 以下は認証の三要素。
    - WHAT YOU ARE(inherence factor):顔貌,声紋,指紋
    - WHAT YOU HAVE(possession factor):身分証
    - WHAT YOU KNOW(knowledge factor):パスワード,秘密の質問等

### 認可（Authorization,AuthZ）
- 特定の条件に対して、リソースアクセスの権利、権限を与えること。

## RADIUS認証(Remote Authentication Dial In User Service)
- ユーザ認証プロトコルの一つ。
- Radiusによる認証システムは以下の3つからなる。
  - Radiusサーバ
  - Radiusクライアント
  - ユーザ
- RADIUSプロトコルではUDPが使われている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149611/66725270-a23f-5255-8f58-ae6cc553a0ea.png)
https://www.infraexpert.com/study/security20.html

## Kerberos認証
- ネットワーク認証方式の1つでありサーバとクライアント間の身元確認のために使用するプロトコル。
- MITのアテナプロジェクトで開発された。
- 現在のケルベロスのバージョンは5。
- 複数のユーザが複数のサーバを利用するケースの場合、一度認証を受けてしまえば、複数のサービスを受けることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149611/92b9f375-8a0d-be5f-2708-5143f861d965.png)


|    用語    |    説明    |
|:------------------:|:------------------:|
|KDC（Key Distribution Center）|サーバとユーザに関する信頼関係の情報を一括管理する中央データベース|
|TGS（Ticket Granting Server）|チケット発行サーバ。各サーバを利用するためのチケットを発行するサーバ|
|プリンシパル（Principal)|KDCが認証を行うユーザやサーバのこと|
|レルム(Realm)|同じKDCの配下にあるシステムをグループとして定義する論理ネットワーク|

## Kerberos認証の流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149611/35e92140-89e8-820d-aea8-79b216d7de08.png)

- チケット盗聴を防ぐために、チケットにはタイムスタンプが記録されている。
- チケットを受信したサーバがチケットのタイムスタンプとサーバの持つ時刻とにズレがあると認証に失敗する。

## 参考
[よくわかる認証と認可]
(https://dev.classmethod.jp/security/authentication-and-authorization/)
[Radius認証とは - ネットワークエンジニアとして]
(https://www.infraexpert.com/study/security20.html)
[ケルベロス認証（Kerberos Authentication）とは]
(https://www.infraexpert.com/study/security18.html)
【Rails】Rspecを利用したテストコードとマッチャについて

RSpecを利用したテストコードの記述を学習する中で得た知見の記録を目的とした記事です。

#まずRspecとは
Rubyコードをテストする為にRubyで記述された「ドメイン固有言語」テストツールです。
Railsでは「`rspec-rails`」という`Gem`を導入する事で、使用出来るようになります。
※この記事ではRspecの導入方法については触れません。

導入の目的は、テストコードが設計である事をプログラマーが意識する事と、テストコードの記述をスムーズに行う為です。

#Rspecのディレクトリ構造
RSpecで書かれたテストコードのファイルをspecファイルと呼びます。
アプリケーションのappディレクトリ以下にあるテスト対象となるモデルやコントローラーの位置に
対応させる形で、specフォルダ以下にディレクトリを配置します。

例：
`spec/models/
spec/controllers/`

また、specファイルの命名規則として、**対応するクラス名_spec.rb**と設定する必要があります。

# テストコードについて
前置きが長くなりましたが、テストコードについて説明します。

```sample_spec.rb
describe "CalculationFunction" do
  it "5 + 5は10になる事" do
    expect(5 + 5).to eq 10
  end
end
```
##describe
`describe`は直後の`do〜end`までをグループ化して、テストのまとまりを作ります。`describe`のあとの""にはテストの対象とするものを書きます。

##itとexample
`it`は`example`と呼ばれる実際に動作するテストコードのまとまりを表します。itに続く""にはその`example`の説明を書きます。

##エクスペクテーション
テストで評価される式の事です。`it do〜end`の間に書きます。例では`expect(5 + 5).to eq 10`の部分がエクスペクテーションです。また、`eq`の部分をマッチャと言います。

##マッチャ
エクスペクテーションの中で、テストが成功する条件を示します。例では、`eqマッチャ`を使用しており、「等しければ」という意味を持っています。


##to / not_to

```
expect(5 + 5).to eq 10
```
`to`は「〜である事」を期待する際に使用します。

```
expect(5 + 7).not_to eq 10
```
逆に「～ではない事」を期待する際は not_toを使用します。

##includeマッチャ

```
x = [1, 2, 3]
expect(x).to include 1, 3
```
includeマッチャの引数にとった値が、expectの引数である配列に含まれているかをチェックする事が出来ます。

##be_validマッチャ
```
it "is valid with a nickname, email, password, password_confirmation" do
      user = build(:user)
      expect(user).to be_valid
    end
```
expectの引数にしたインスタンスが、全てのバリデーションをクリアする場合にパスするマッチャです。


##matchマッチャ
引数に配列クラスのインスタンスをとり、expectの引数と比較するマッチャです。配列の中身の順番までチェックします。

##render_templateマッチャ
引数にシンボル型でアクション名を取り、引数で指定したアクションがリクエストされた時に自動的に遷移するビューを返します。
TP-Link Deco の Ethernet Backhaul を有効にするネットワークトポロジー

## え？私の Deco 、有線 LAN 使ってない...??

[TP-Link Deco M5 による家庭内メッシュ Wi-Fi 環境](https://qiita.com/ma2shita/items/63f7cbf02bebc66a7a89) の公開が1年前でした。[ファームウェアも順調にアップデート](https://www.tp-link.com/jp/support/download/deco-m5/#Firmware)され、スマホの管理アプリで表示できる情報が増えたのですが、気が付いたことがあったのです。

私の家では 2 つの Deco M5 を有線 LAN で接続(Ethernet Backhaul)しているはずなのに **無線でメッシュが組まれている** ということが！

![wifi-mesh](https://docs.google.com/drawings/d/e/2PACX-1vSjglvd__PB3xfGQOFAnoQzPXKkG9rrRHntG2sLmmzdC4JDL2iC6Xl9QWjF_pfZQ1UJ1vdAeCw5VztH/pub?w=325&h=411)

確かにブツブツ切れるなぁと感じてたのですけど。そりゃよく切れるわけだ (信号レベルも低いし)

## 結論: トポロジーが悪かった

#### 改善前

![NG topology](https://docs.google.com/drawings/d/e/2PACX-1vRiDK_7SxOxCNOzaFsuDGIWA_VAzAbEBn6WTzA2GecgjB2-GwinUbx2AZGwciQafVoqH-QuSuzHgESI/pub?w=765&h=368)

#### 改善後 (緑色の線)

![Good topology](https://docs.google.com/drawings/d/e/2PACX-1vT7610bnbbVO8oJhv0YfV681r9WsRAwciqoZFafalDXoEpbpuQEKiFmcIFcCyb5UQpczRBNKtMpuxGB/pub?w=765&h=368)

トポロジーを変更後に Main の Deco を再起動したら、信号元が有線 LAN となりました。

![lan-mesh](https://docs.google.com/drawings/d/e/2PACX-1vTobRvnusrOSQxr2mmOf3kvJpFQHlKGtumqrSz0Qv021YmuUidXPsSa-mthnYtvGrfPAq0JnAo6gbV1/pub?w=325&h=411)

## よく読めば、そう書いてある

TP-Link の FAQ [Deco間をLANケーブルで繋いで利用できますか？(Ethernet Backhaul)](https://www.tp-link.com/jp/support/faq/1794/) をよく見ると、確かにメインの Deco を経由するトポロジーだったのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/272e7f2a-0744-a75d-7fd4-b71c4f8ed9d9.png)
(FAQ からスクリーンショットをいただきました)

敗軍の将が語るならば「2 ポートある Ethernet ポートの片方を modem に、もう片方を Switch か AP に接続します」と書いてくれれば親切ですよね、、、と感じる次第です。

### ちなみに: Deco の 2 ポートある Ethernet ポートはどっちが WAN ??

https://012cloud.jp/column/deco-m5

> ポートに接続されたケーブルがインターネット回線に繋がっていればWANポートとして、LAN側に繋がっていればLANポートとして自動構成が行われます。

ということで、どっちに挿しても良いとの事。Facebookのコメントで教えていただきました、あざます！ (-人-)

## あとがき

Wi-Fi メッシュが(そこそこ)動いていたので、全然気づきませんでした。
普段からの違和感やチェックは必須ですね。

EoT
CentOS6.5で"tar"をアップデートする（パッケージ構成上でもアプデ反映する）


#1. tarのバージョンについて
これから記載するのは，以下URLを基にtarをバージョン1.24に上げた状態で起こった問題．
「GNU Tar」のHPから直接 tar-1.24.1.tar.bz2　をダウンロードし，./configureコマンドとmake installコマンドでインストールを行った

[あの山のむこうに... tarのバージョンアップ](http://anoyamanomukouni.blog130.fc2.com/blog-entry-235.html "あの山のむこうに... tarのバージョンアップ")

※ OS　　CentOS6.5
※ 環境　  VirtualBox

#2. 問題内容
Petalinux2017.2をインストールする際，tarのバージョンが1.23のままだぞというエラー文章が表示された．

* 入力コマンド
`` ./petalinux-v2017.2-final-installer.run /(インストール先）`` 

* エラー文章
`` Detect tar version 1.23 is less than the expected 1.24 petalinux`` 

※ ``tar --version``を入力した際，ちゃんとバージョンは1.24となっている．

#3. 問題の原因

項目1.で記載したURLに下記文章が掲載されていた．
>■■■【お断り】■■■
>当作業は、単純に .tar.xz を扱えるようにするためにだけ、コマンドレベルで
>tar-1.15.1 から tar-1.27.1 にアップグレードしているに過ぎません。
>``# rpm -q tar``
>``tar-1.15.1-32.el5_8``
>で示されるように、フォルダ指定を行えば旧版は正常に動作しますし、
>データフォルダ上からもtar-1.15.1 は消えていません。
>パッケージ管理上は tar-1.15.1 のままです。（これはyum更新で解消されるはずです）

つまり，以下の現象が起こる

* tarコマンドを自分で入力する際には，バージョンは1.24に上がっている．
* petalinuxのインストール時のような，自分でtar操作を行わない場合には．元々インストールされていたtarが活用されてしまう．

新規にインストールしたtarは``/usr/local/bin``に保存されていた．
しかし，CentOSインストール時は``/usr/bin``にtarはインスト―ルされている
⇒　新規インストールしたtarを，``/usr/bin``にコピーすれば解決できる！

#4. 解決方法
下記コマンドを入力し，``/usr/bin``にバージョン1.24のtarをコピーする．
``sudo cp /usr/local/bin/tar /usr/bin/tar``

これでエラーが出なくなりました．
一件落着！
ケモインフォマティクスで学ぶPythonの条件分岐

# はじめに

[ケモインフォマティクスで学ぶPythonのデータ構造](https://qiita.com/yukiya285/items/874c9119a9bcf93afbfa)に引き続き、リピドミクス（脂質の網羅解析）を題材として「条件分岐」について解説していきます。
ケモインフォマティクスの実践例を中心に説明していきますので、基本を確認したいという人は以下の記事を読んでからこの記事を読んでみてください。

[製薬企業研究者がPythonの制御文についてまとめてみた](https://qiita.com/yukiya285/items/1db03558c38f1405dbbb)

# if文

`if 条件式:`として、次の行に、条件式が成り立つときの処理を記述します。
`if`の次の行は、半角4文字分インデントして書き始めます。

```python
Un = 0

if Un == 0:
    print('saturated fatty acid')
else:
    print('unsaturated fatty acid')
```

`else`は、`if`に続く条件式が成り立たなかった場合の処理を記述するために使います。
さらに細かく条件を分けたい場合は、`elif 条件式:`とすることで、別の条件が成り立つ場合の処理を記述することができます。ちなみに、`elif`は、「else if」の略です。
上のプログラムでは、不飽和度（脂肪酸の二重結合の数）を示す変数`Un`が0だった場合は、`saturated fatty acid`（飽和脂肪酸）と出力し、`Un`が0以外の数値だった場合は、`unsaturated fatty acid`（不飽和脂肪酸）と出力するようにしています。


## 論理演算子

条件式の部分は複数の条件を指定することも可能です。

```python
Cn = 18
Un = 0

if Cn == 16 and Un == 0:
    print('palmitic acid')
elif Cn == 18 and Un == 0:
    print('stearic acid')
else:
    print('other fatty acid')
```

`if`の後の条件式において、`and`は「かつ」というような意味になります。
「または」にしたい場合は`or`を用います。


## in演算子

`in`演算子を用いると、リストに含まれる要素かどうかを判定することができます。

```python
fatty_acids = ['FA 16:0', 'FA 18:0', 'FA 18:1']

if 'FA 16:0' in fatty_acids:
    print('Palmitic acid is included')
else:
    print('Palmitic acid is not included')
```


## 応用：SMILES記法

最後に応用編として、SMILES記法で記述された化学構造から、飽和脂肪酸なのか不飽和脂肪酸なのかを判定することを考えてみます。

```python
smiles_fa = 'OC(CCCCCCCCCCCCCCC)=O'

if smiles_fa.count('=') <= 1:
    print('saturated fatty acid')
else:
    print('unsaturated fatty acid')
```

不飽和脂肪酸かどうかは、炭素鎖の中に二重結合が含まれるかどうかで判定することができます。
カルボン酸部分にも二重結合はあるので、上のプログラムではそれ以外に二重結合があるかどうかを判定しています。


# まとめ

ここでは、Pythonの条件分岐について、ケモインフォマティクスで使える実践的な知識を中心に解説しました。
もう一度要点をおさらいしておきましょう。

- if文は、`if 条件式:`として改行して半角スペース4つ分インデントした後に条件式が成り立った時の処理を記述します。条件を細かく分けたい場合は、`else`や`elif`も使えます。
- 条件式には、`and`や`or`といった論理演算子も使用することができます。
- `in`演算子を使うと、指定した要素が配列の中に含まれるかどうかを判定できます。

続いて、Pythonの反復処理について以下の記事で解説しています。

[ケモインフォマティクスで学ぶPythonの反復処理](https://qiita.com/yukiya285/items/cca27f036c0efac6bec7)


# 参考資料・リンク

[意外と少ない！？製薬会社でのプログラミングに必要な「最低限」の知識](https://pharma-engineer.com/basic-programming/minimum-information/)
WindowsでHTMLを書いているときにパス指定で躓いた話

#WindowsでHTMLのパス指定をする際の落とし穴
とかなんとか言っていますが、結果的に見るとこれは僕の凡ミスです。
一応メモとして今回のミスを書き残しておきます。

#今回のミス
今回躓いたのは、WindowsでHTMLコードを書いているときのパス指定です。
imgタグを使う時にファイルをパス指定して表示させようと思っていたのですが、うまく表示されず小一時間悩みました。

パス指定で躓く大きな理由はおそらく３つ挙げられると思います。
① コードのシンタックスエラー
② パスを間違えている
③ ファイル名を間違えている
この３つです。
大体②で躓いて困ることがあるかと思うのですが、今回は③でつまづきました。

その原因は、WindowsとMacでファイル名を変更する際のマナーが異なっていたからでした。
詳しい話をしていきましょう。

#ファイル名を変更する際のマナー
##Macの場合
Macでは、ファイル名は基本的に拡張子まで表示され(例外はありますが)、変更する際には拡張子まで指定して変更することができます。
例えば、
Sample.jpg
を
example.png
に変更する際には、拡張子までファイル名を書き換えてしまえば、拡張子を変更することができます。

##Windowsの場合
Windowsでは、ファイル名は拡張子まで表示されないことがあり、変更する際には拡張子までファイル名で変更してかいても実際に拡張子を変更することができません。
例えば、JPG形式の
Sample
を
example.png
に変更してもPNG形式に変更することはできません。ファイル名が「example.png」のJPG形式のファイルに変更されてしまいます。
なので、もし

```HTML
<img src="./img/example.png">
```

と書いてもexample.pngを呼び出すことはできません。
仮に、Sampleという名前の元のファイルを画像ファイルとして呼び出したいときには、

```HTML
<img src="./img/Sample">
```
ではなく、

```HTML
<img src="./img/Sample.png">
```
と表記することで呼び出せます。
vueのウォッチャー

vueのdateオプションで登録した値になんらかの変更があった際に、実行したい処理がある場合はウォッチャーを使用します。



```
new Vue({
  watch: {
    // 監視を行うデータ
    todos: {
      // 変化した時に行いたい処理
      handler: function(todos) {
        todoStorage.save(todos)
      },
    }
  }
})
```
【AWS】AWSのセキュリティー

# AWSのセキュリティー

**セキュリティーはAWSにとって最重要事項**

## データの保護
 - 回復性を備えたインフラストラクチャ
 - 高度なセキュリティー
 - 強力な安全対策

##継続的改善
- 急速なイノベーション
- 絶えず進化するセキュリティーサービス

## 従量課金性
- 高度なセキュリティーサービス
- リアルタイムで新たなリスクに対処する
- より低い運用コストでニーズを満たす

## コンプライアンス要件への準拠
- ガバナンスで有効になる機能  
 監督の強化  
 セキュリティ統制  
 一元的なオートメーション  

## AWSの責任共有モデル
- AWSのセキュリティ統制を継承
- コントロールをレイヤー化

## セキュリティー製品と機能
- ツール  
 AWSとパートナーからのアクセス  
 モニタリングとログの記録に使用

## ネットワークセキュリティ
- 組み込みのファイアウォール
- 転送中の暗号化
- プライベート接続／専用接続
- 分散サービス妨害（DDoS）の緩和

## インベントリと設定の管理
- デプロイツール
- インベントリと設定のツール
- テンプレートの定義と管理のツール

※ITの資産

## データの暗号化
- 暗号化機能
- キー管理オプション  
 AWS Key Management Service
- ハードウェアベースの暗号キーストレージオプション  
 AWS CloudHSM

 ## アクセスコントロールとアクセス管理
- Identity and Access Management（IAM）
- Multi-Factor Authentication（MFA）
- 社内ディレクトリとの統合とフェデレーション
- Amazon Cognito
- AWS SSO

## モニタリングとログ記録
- リスクプロファイリングを減らすツールと機能  
 APIコールの高い可用性  
 ログの集計とオプション  
 アラート通知

## AWS Marketplace
- AWSのお客様にソフトウェアのマーケティング／販売を行う資格のあるパートナー
- AWSで実行できるオンラインソフトウェアのストア

# IAM
User：永続的
Role：限定的

アクセス許可：Policy Docs→JSON形式
APIの実行認可：Role

Policy Docs 
許可<明示的な禁止<なにも指定しない

CloudTrailでは全てのAPI操作が記録される


# Amazon Inspector
## セキュリティーの課題
ITセキュリティは重要だが、IT インフラストラクチャの保護は
- 手間がかかる
- 高価
- 時間がかかる - 構築/設定/維持
- IT環境の変化を全て追跡することが難しい
- 高価的に実現するのが難しい

## Amazon Inspectorとは
- アプリケーションの評価
 脆弱性  
 ベストプラクティスからの逸脱
- 詳細レポートの作成
 セキュリティの調査結果  
 優先順位付き改善ステップ  

# AWS Shield
AWS Shieldは分散サービス妨害（DDoS）に対するマネージド型保護サービスで、AWSで実行中のアプリケーションを保護する

# セキュリティーコンプライアンス
責任分担と統制

保証プログラム
ACM で発行した証明書を CloudFront で使う

# ACM で発行した証明書をCloudFrontで使、えなかった
S3上の静的コンテンツをHTTPSで公開したく、CloudFrontに証明書を設定しようとしたら意外と手こずったので残します。

## 前提条件
- コンテンツ：S3でパブリックに設定したバケット上に配置。HTTPではアクセスできる状態。
- ドメイン名：取得済み。
- DNSサービス：AWS Route 53 を使用。取得済みドメインを登録し、FQDNで先程のコンテンツにアクセエスできる状態。
- 証明書：ACM - AWS Certificate Manager (in 東京) で発行。※先に書いてしまうと、東京で発行してたのがNG元。

## 困った状況
ここまで準備できれば、CloudFrontでディストリビューションを作成し、発行した証明書を設定すればコンテンツにHTTPSでアクセスできるようになる、と考えていました。が、CloudFrontのコンソールから、Create Distribution > Distribution Settings で、「Custom SSL Certificate (example.com):」がグレーアウトして選択できません。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513300/34ad7803-48f5-a015-9fed-2b0efb8c1946.png)

> Choose this option if you want your users to access your content by using an alternate domain name, such as https://www.example.com/logo.jpg. You can use a certificate stored in AWS Certificate Manager (ACM) in the US East (N. Virginia) Region, or you can use a certificate stored in IAM.

大事な部分は後半の２行、この部分ですね。
- You can use a certificate stored in AWS Certificate Manager (ACM) in the US East (N. Virginia) Region,
- or you can use a certificate stored in IAM.

最初から１行目の方をちゃんと読めば良かったのですが、「in the US East」の部分を読み飛ばしていました。このすぐ下にあるボタンを押しても証明書リクエストの画面が呼ばれるだけ。すでに発行済みなのでやってもムダです。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513300/b196da37-f8ce-eb5e-2050-2a8f88a0ca63.png)
それではと２行目の方を追って見たものの、行き詰まりました。

# 解決
単純な話ですが、`- You can use a certificate stored in AWS Certificate Manager (ACM) in the US East (N. Virginia) Region,` ここに **in the US East (N. Virginia) Region** と記載されている通り、証明書の発行を東京リージョンではなく、北バージニアのACMで行うべきでした。
![region 東京.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513300/15903c87-04ad-9641-53ad-725fc90d4ba7.png) < ダメ
![region N Virginia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513300/eb520abb-ccd8-6671-7662-20020282833a.png) < 正解
北バージニアのAMCで同様の証明書を発行したところ、無事に「Custom SSL Certificate (example.com):」を選択することができるようになりました。
ロン・ウィーズリーの家にある時計にあこがれて簡単なものを作ってみた

# 背景
ハリーポッターに出てくるロン・ウィーズリーの時計(家族の位置が時計の形式で表示される)に憧れました。
家にあったらおしゃれじゃないかという簡単な気持から

# 手法について

* 自分の居場所をどうやって伝えるか

常に持ち歩いているスマホを使う

* 居場所をどうやって何に伝えるか

理想はスマホの現在地を取得し、時計に直接渡す方法ですが、時計に受け口を作るため自宅にサーバを立てて公開するという私の能力では時間がかかりすぎる問題が発生。
そこでクラウドを習得したいという思いもあるので、AWSに一度居場所を保持し、それを時計から取りに行くという方針に決定。

具体的には、DynamoDBに位置情報を保存(選定理由に深いものはありません)。
現在地はIFTTTで特定の場所に来たら通知する方式を選択。
IFTTT<=>DynamoDB間はlambaとAPIGatewayを使って居場所の更新用と居場所取得用のAPIを作成しました。
(時間があればAWS周りのところをもう少し細かく書きます)


#時計はどうするか

## Web上に用意
理想は実物ですが、まずはWeb上に時計を作りました。
APIはサーバレスで用意できているので、静的ファイルのホスティングサービスを探します。AWSのS3は個人の遊び用には無料枠が存在せず？向いてなさそうだったので、CIも簡単にできてしまうというNetlifyを利用しました。
リポジトリはgithubのプライベートリポジトリを連携しました。
驚くほど簡単に静的ファイルのデプロイができました。

<img width="343" alt="F927F070-7CAA-45D7-8EA5-119DC5A4D735.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137239/4bf6f706-c499-a242-5e74-e256a0293728.jpeg">


位置情報は、家とオフィスとそれ以外にしています。
実物でなくとも、これをディスプレイで表示して、定期的に更新するのもありかと思ったんですが、わくわくしないので、実物の作成を目指します。
NativeScript-VueをVS Codeで開発してみる

## Prologue

[NativeScript](https://docs.nativescript.org/)はNativeScript Playgroundというブラウザベースの開発環境が用意されています。QRコードの読み込みやスマホとの同期も簡単に進められ、console.logやエラーも確認ができるので、初めてNativeScriptに触れる自分のような初学者にもわかりやすく使いやすいと思います。
その中で、自分のlocal環境で開発するとしたらどのように設定し、どのようにプロジェクトを作成するのか...疑問に思ったので設定周りをチャレンジしてみました。

## 環境
- macOS: 10.15.2
- node.js: 10.16.0
- terminal: iTerm
- エディタ: VS Code
- スマホ実機: iPhone XS(iOS13.3)

- Project概要
    - 言語: NativeScript-Vue
    - パッケージマネージャ: `yarn`, `npm`

## 注意
- NativeScriptはほんの少し触った程度のため、実際開発を行っている人向けではないと思います。
もし違う点等あればご指摘ください。
- NativeScriptを一度も触ったことがない方は、NativeScript Playgroundから入ることをお勧めします。ここではNativeScript Playgroundを使ったことがあることを前提とし、そのため必要なapp等は公式Documentをご確認ください。
- ここで書いているのは設定から最初のプレビューまでとなります。

## NativeScript CLIのインストール

1. node.jsがインストールされているか予め確認。

``` 
node --version
```

2\. nataivescriptのインストール。

参考: https://docs.nativescript.org/angular/start/quick-setup

```
npm install -g nativescript

// EACCESS エラーが出たらsudoコマンドを使う

sudo npm install -g nativescript
```

※ Document通りに進めていましたが、あとで調べたらyarnのpackageにもあるようなので、使いたい人は以下をお試しください。

```
yarn add nativescript
```

インストールが成功しているか確認します。

```
nativescript --version

6.3.0 // version情報が出る
```

3\. `tns`コマンドの実行。
  
  3-1. デモプロジェクトの作成
  参考: https://docs.nativescript.org/angular/start/cli-basics

  ```
  tns create nativeApp[project-name] --template tns-template-blank-ng
  ```
 
  3-2. localで作ったAppとスマホデバイスのNativeScript Playground appをリンクさせます。

  ※ 以降のコマンドはiTermなどのターミナルでもVS Codeのターミナルどちらでも可能。

  ```
  cd nativeApp[project-name]
  tns preview
  ```

  3-3. QRコードが作成されたら、NativeScript Playground appでQRコードをスキャンします。
  同期が取れると使用しているスマホデバイスの情報が表示され、以下のようなテキストが出ます。

  ```
  Project successfully prepared (ios)
  ```

  3-4. 画面の確認

  初期画面は何もない真っ白な画面がスマホに表示されます。

  ※ プロジェクトの変更を検知して画面も更新されるので、その様子を確認したい人はhttps://docs.nativescript.org/angular/start/cli-basics の中にサンプルがあるので試してみてください。

## NativeScript-Vueでプロジェクトを作ります。

1. `@vue/cli @vue/cli-init` のインストール
 
```
yarn global add @vue/cli @vue/cli-init
```

2\. プロジェクトの作成。

プロジェクトを作成したいディレクトリまで移動して以下のscriptを実行。
サンプルではプロジェクト名を'native-vue-app'として作成しています。

```
vue init nativescript-vue/vue-cli-template native-vue-app
```
※ 'vue-devtools'を使用すると以下のようなエラーが出たため、予めインストールしないようにするか、インストールした場合にはコメントアウトしてください。(コメントアウト箇所は下記参照してください。)
原因はわかり次第別途追記します。

```
***** Fatal JavaScript exception - application has been terminated. *****

//

Terminating app due to uncaught exception 'NativeScript encountered a fatal error: TypeError: undefined is not an object (evaluating 'socket.on')

```

既にインストールしていて、同様のエラーが出た場合には、`app¥main.js`の以下の部分をコメントアウト。

``` Javascript
// import VueDevtools from 'nativescript-vue-devtools'


if(TNS_ENV !== 'production') {
  // Vue.use(VueDevtools)
}
```

3\. プレビュー画面の確認。

```
cd native-vue-app
tns preview
```

上部のBarに'Welcome to NativeScript-Vue!'が表示されます。


## Epilogue

Document通りに設定していけば特に難しい部分はありませんでしたが、'nativescript-vue-devtools'のエラーではまってしまいました。
今回は自力で設定してプレビューが見れるところまでを確認したかったため、コメントアウトで対応しましたが、今後もし機会があれば調べてみたいと思います。

### 課題

- ブラウザdebugの方法、ブラウザで画面確認をする方法
- CSSの読み込みが`tns preview`を再度実行しないと確認できない理由について
- VS Code Extensionに'NativeScript'があるため、debug等何ができるのか調べてみたい
zip

```py:1
players = ['勇者', '戦士', '魔法使い']
enemies = ['スライム','ドラゴン', 'ガーゴイル']

for i in range(len(players)):
    print(players[i] + 'は' + enemies[i] + 'を攻撃した')
```

```:1の実行結果
勇者はスライムを攻撃した
戦士はドラゴンを攻撃した
魔法使いはガーゴイルを攻撃した
```
zip関数を使って書くと

```py:zipで
players = ['勇者', '戦士', '魔法使い']
enemies = ['スライム','ドラゴン', 'ガーゴイル']

for player, enemy in zip(players, enemies):
    print(player + 'は' + enemy + 'を攻撃した')
```

```:zipでの実行結果
勇者はスライムを攻撃した
戦士はドラゴンを攻撃した
魔法使いはガーゴイルを攻撃した
```
Microsoft Learn 36日目

2019年12月に Advent Calendar を使って [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) で学んでいく...と試みてなんとか完遂した([記事はこちら](https://qiita.com/advent-calendar/2019/d01tsumath_learn))。
しかし、スローペースだったのもあり25日間毎日受講しているとは言え、コースの半分しか終わってない。
そこで、「Azure の基礎」コースが終わるまで続けていこうと思う。毎日できるかは不明、でもがんばる。

と、いうことで。以下、受講記録のはじまりはじまり～。

1/5は
Azure Policy でインフラストラクチャの標準を適用して監視する
 - Azure Blueprints を使用して標準リソースを定義する
 - コンプライアンスマネージャーを使用してサービスのコンプライアンスを調べる
を受講した。

# Azure Policy でインフラストラクチャの標準を適用して監視する
## Azure Blueprints を使用して標準リソースを定義する
Azure Blueprints は、さまざまなリソーステンプレートやその他のアーティファクトのデプロイを宣言によって調整する方法。
実装するプロセスは、以下の手順で構成されている。

1. Azure ブループリントを作成する
2. ブループリントを割り当てる
3. ブループリントの割り当てを追跡する

Azure Blueprints を使用すると、Blueprints 定義 (何をデプロイする "必要がある" か) と Blueprints 割り当て(何がデプロイされたか)の間に関係が維持され、この結び付きによって、デプロイの追跡と監査が向上する。

### Resource Manager テンプレートとの違い
Blueprints においてデプロイの対象に含めるものはほぼすべて、Resource Manager テンプレートを使用して実現できるが、Resource Manager テンプレートは Azure にネイティブに存在するドキュメントではなく各テンプレートはローカル、またはソースコントロール内に格納される。

### Azure Policy との違い
Blueprints は、一貫性とコンプライアンスを確保する再利用可能な Azure クラウドサービス、セキュリティ、デザインの実装に関連した、焦点を定めた一連の標準、パターン、要件を作成するためのパッケージまたはコンテナー。
ポリシーは、デプロイ時のリソースプロパティと、既に存在するリソースのリソースプロパティに焦点を合わせた既定での許可と明示的な拒否のシステム。 

## コンプライアンスマネージャーを使用してサービスのコンプライアンスを調べる
Microsoft は、構築の基礎となるリソースを "プロバイダー" がどのように管理するかを非常に重要なものと考え、4 つのソースを使って完全な透明性を実現している。
### Microsoft プライバシーに関する声明
この声明は、Microsoft とユーザーおよび Microsoft 製品(サービス、Web サイト、アプリ、ソフトウェア、サーバー、デバイスなど)とのやり取りに適用される。
目的は、Microsoft が Microsoft の製品やサービスの中で個人データを処理する方法を開示し、誠実に示すこと。

### Microsoft セキュリティ センター
Microsoft がすべての Microsoft クラウド製品とサービスにおいてセキュリティ、プライバシー、コンプライアンス、および透明性をどのように実装し、サポートしているかに関する情報と詳細を含む Web サイトリソース。
Microsoft Trusted Cloud Initiative の重要な部分を占め、法務およびコンプライアンス コミュニティにサポートとリソースを提供している。

### Service Trust Portal
Compliance Manager サービスをホストしている、監査レポートや Microsoft のクラウドサービスに関連するその他のコンプライアンス関連情報を公開するための Microsoft の公開サイト。

### コンプライアンス マネージャー
Trust Portal 内のワークフローベースのリスク評価ダッシュボード。
これを使用すると、Microsoft プロフェッショナルサービスや Microsoft クラウドサービス(Office 365、Dynamics 365、Azure など)に関連する組織の法規制順守アクティビティを追跡、割り当て、および検証することができる。
scikit-learn(sklearn)のfetch_mldataのエラーの解決法

# 目的
**scikit-learn(sklearn)でデータセットをダウンロードする際に使われるfetch_mldata関数(sklearn.datasets.fetch_mldata)のエラーを解決する。**

## エラー例
*urllib.error.URLError: \<urlopen error [WinError 10060] 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。>*

# 環境
sklearn(scikit-learn):version 0.21.2

# 解決法
fetch_mldataが非推奨となり、代わりにfetch_openmlが作成されたため、fetch_openmlを使用します。

なお、fetch_mldataはversion 0.22で削除されます。
> sklearn.datasets.fetch_mldata to be removed in version 0.22.

# 具体例
scikit-learnは様々なデータセットをダウンロードできますが、ここではmnistのデータセットをダウンロードする例を示します。
また、言語はPythonを使用しています。

## エラー時のソースコード
```python:fetch_mldata.py
from sklearn.datasets import fetch_mldata

mnist = fetch_mldata("MNIST original", data_home=".")

x_all = mnist['data'].astype(np.float32) / 255
y_all = mnist['target'].astype(np.int32)
```

## 修正後のソースコード
fetch_openmlでは、fetch_mldataで使用していたデータセット名と異なっている場合があるため、注意してください。

```python:fetch_openml.py
from sklearn.datasets import fetch_openml

mnist_X, mnist_y = fetch_openml('mnist_784', version=1, data_home=".", return_X_y=True)

x_all = mnist_X.astype(np.float32) / 255
y_all = mnist_y.astype(np.int32)
```
Leetcode Medium 973. K Closest Points to Origin

各地点のうち（0,0）から最も近い地点を求める

-それぞれ距離を計算する（sqrtは求めなくてよい）
-結果をソートして小さい方から順に表示する


```cpp
class Solution {
public:
    vector<vector<int>> kClosest(vector<vector<int>>& p, int k) {
        vector<pair<int, vector<int>>> distance;
        for (auto v : p) {
            distance.push_back({ v[0] * v[0] + v[1] * v[1], v });
        }
        sort(distance.begin(), distance.end());

        vector<vector<int>> ans;


        for(int i = 0;i<distance.size();i++){
            if (i >= k)break;
            ans.push_back(distance[i].second);
        }

        return ans;
    }
};

//int main()
//{
//    Solution* Sol = new Solution();
//    random_device rnd;
//    mt19937 mt(rnd());
//
//    //vector<vector<int>> v1 = { {1,3},{-2,2} };
//    //int k = 1;
//
//    vector<vector<int>> v1 = { {3,3},{5,-1},{-2,4} };
//    int k = 2;
//
//    //v1.push_back(15);
//    //for (int i = 0; i < 100; ++i) v1.push_back(mt() % 1000);
//
//    Sol->kClosest(v1,2);
//}
Leetcode Easy 819. Most Common Word


解説
禁止文字に該当しない最大の出現回数である文字を返せば良い
-アルファベット以外の文字（!?.;など）を空白に変換する
-空白を区分字としてSplitする。（C++はSplitが無い。。。）
-文字は小文字に統一
-文字ごとに出現回数を記録する
-禁止文字に該当しない最大の出現回数である文字を返す

```cpp
#include <algorithm>
#include <vector>
#include <random>
typedef long long  ll;
#define rep(i,s,n)for(ll i=s;i<n;i++)
#define repe(i,s,n)for(ll i=s;i<=n;i++)
#include <map>
#include <iostream>
class Solution {
public:
    map<string, int> mp;
    string mostCommonWord(string p, vector<string>& b) {
        string q;
        rep(i, 0, p.size()) {
            if (p[i] == '!' || p[i] == '?' || p[i] == '\'' || p[i] == ',' || p[i] == ';' || p[i] == '.') {
                p[i] = ' ';
            }
        }
        
        int s = 0;
        string t;
        rep(i, 0, p.size()) {
            if (p[i] != ' ') {
                if (p[i] >= 'A' && p[i] <= 'Z') {
                    //p[i] = (char)(p[i] + ('a' - 'A'));
                    p[i] = (char)(p[i] + ('a' - 'A'));
                }
                t += p[i];
            }
            else if(t != ""){
                mp[t]++;
                t = "";
            }
        }
        
        vector<pair<int,string>> v;
        for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++) {
            v.push_back({ it->second, it->first });
        }
        sort(v.begin(), v.end());
        reverse(v.begin(), v.end());

        for (auto k : v) {
            bool isban = false;
            for (auto ban : b) {
                if (k.second == ban) {
                    isban = true;
                }
            }
            if (!isban) {
                return k.second;
            }
        }

        return t;
    }
};
Go言語の基本Tips

プロジェクトによって色々な言語を使うことが増えてくると、パッと切り替えられず混乱してしまうことがあります。そんな自分用の備忘録です。

Go言語のプレイグラウンドは[こちら。](https://play.golang.org/)

# 特徴
* コンパイル言語であるため、Pythonなどの動的言語に比べ実行速度が圧倒的に速い。
* Goのプログラムが起動した直後には「main」パッケージに属する「main関数」が実行されるため、必ず「main関数」が必要。

# 処理の書き方
処理の最後に`;`は不要です。

```Go
println("hoge")
```

# 変数
`var`で定義し、データ型が変数名の後ろになります。
Goでは、データ型の指定を省略することが可能です。
次の3行は全て同じ意味になります。

```Go
var a int = 1
var a = 1
a := 1
```
#メソッド名や変数名の大文字/小文字
名前(トップレベルの型名、関数名、メソッド名、定数名、変数名、構造体のフィールドおよびメソッド名）の先頭一文字が大文字になっていれば、パッケージの利用者側から参照可能となります。すなわち大文字にしなければ、それが定義されているパッケージ内からしか参照できません。

# 標準出力

`println`だけでも出力できますが、扱えるデータ型が多いため`fmt`パッケージをインポートして使うことの方が多いようです。

```Go
import (
	"fmt"
)

// メソッドの中で
println("hoge") //fmtを使わない場合
fmt.Println("hoge")

```
`fmt.Printf`を使用すると、フォーマットを指定して出力します。次の例のように文字列の中に`%s`を埋め込むことで、文字列を埋め込むこともできます。数字の場合は`%d`を使います。
なお、`Printf`の場合は出力の最後が改行されません。

```Go
import (
	"fmt"
)

// メソッドの中で
fmt.Printf("%s world", "Hello")

//出力結果
Hello world
```


# 1を足して代入、１を引いて代入
省略系が用意されていて、1行目と2行目、4行目と5行目は同じ意味になります。

```Go
n = n+1
n++

n = n-1
n--
```
# if文
条件を()で囲まない書き方になります。
また、左右の値が等しいかどうかは`==`で判定します。

```Go
if i == 10 {
 //iが10と等しい場合に実行する処理
}

if y != 10 {
 //iが10と等しくない場合に実行する処理
}

```

# for文
条件の部分は()不要。初期値の定義は必ず`:=`を使います。

```Go
package main

import (
	"fmt"
)

func main() {
        //初期値; 条件式; 増減値
	for i := 1; i <= 5; i++ {
		fmt.Println(i)
	}
}

//出力結果
1
2
3
4
5

```

# 関数の呼び出し

`関数名()`で呼び出すことができます。

```Go
package main

import (
	"fmt"
)

func main() {

	//関数の呼び出し
	hoge()
}

//関数の定義
func hoge() {

	fmt.Println("hoge")

}

```
# 引数の渡し方
引数を受け取る関数の場合は、`引数名` `データ型`の順で指定します。

```Go
package main

import (
	"fmt"
)

func main() {

	//関数の呼び出し
	hello("takashi")
}

//引数名 データ型
func hello(name string) {

	fmt.Printf("Hello, %s", name)

}
```

# 戻り値の返し方
戻り値は呼び出し元で変数に代入できる。初期化も兼ねる場合は`:=`を使用することに注意です。（`=`だとエラーになります）


```Go
package main

import (
	"fmt"
)

func main() {

	//:=で戻り値を変数に代入
	aisatsu := hello("takashi")
	fmt.Printf(aisatsu)
}

//戻り値のデータ型を指定
func hello(name string) string {

	fmt.Printf("Hello, %s\n", name)
	return "Bye, yuri"

}
```

# ポインタの利用
Goでは変数が格納されているメモリアドレス空間をポインタを通して扱うことができます。
変数のデータ型の前に`*`をつけることでポインタ型の変数を定義できる。stringの場合は`*string`、intの場合は`*int`となります。

次のように、ポインタを使うことにより、関数を跨いで呼び出し元の変数を直接更新することも可能です。

```Go
package main

import (
	"fmt"
)

func main() {

	name := "yuri"
	
	//ポインタ型の変数を定義して変数nameのアドレスを代入
	var namePtr *string = &name
	fmt.Println(namePtr)
	
	//ポインタ型の変数を引数に渡して関数を実行
	changeName(namePtr)
	fmt.Printf("Hello,%s", name)
}

func changeName(namePtr *string) {

	//ポインタを使って元の変数を更新
	*namePtr = "hana"

}

//出力結果
0x40c138
Hello,hana
```