OmniAICreator/Qiita-1.07M huggingface dataset:
TensorFlow 公式の CycleGAN チュートリアルをオリジナルデータで動かす

[公式の CycleGAN チュートリアル](https://www.tensorflow.org/tutorials/generative/cyclegan
)をオリジナルデータで動かした時のメモです。Google Colab 上で動かします。

# 1. データの準備

リンクがある [cyclegan.ipynb](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/generative/cyclegan.ipynb) はデフォルトで [tensorflow_datasets](https://github.com/tensorflow/datasets) の [cycle_gan/horse2zebra](https://www.tensorflow.org/datasets/catalog/cycle_gan#cycle_ganhorse2zebra) を利用するようになっています。順当にやるなら [`tfds new` などでカスタムデータセットを作成する形](https://www.tensorflow.org/datasets/add_dataset#_info_dataset_metadata)なります。
ただ若干書くことがありそうだったので、以下に書いたように `horse2zebra.zip` の DL を置換する方法で動かしました。

## 1.1. `horse2zebra.zip` の DL を置換

[cycle_gan/horse2zebra の実装](https://github.com/tensorflow/datasets/blob/master/tensorflow_datasets/image_classification/cycle_gan.py)は[大学のサイト](https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/)から `horse2zebra.zip` を落としてくる実装になっています。
ただ試すだけであれば、`horse2zebra.zip` を落としてくる部分を置換すれば良いので、まずデータを以下のように作成します。

- horse2zebra
    - testA
        - testA_0001.jpg
        - testA_0002.jpg
        - ...
    - testB
        - testB_0001.jpg
        - testB_0002.jpg
        - ...
    - trainA
        - trainA_0001.jpg
        - trainA_0002.jpg
        - ...
    - trainB
        - trainB_0001.jpg
        - trainB_0002.jpg
        - ...

上記の構成 (horse2zebra 含め) を zip を固めて Google Drive に上げておき(例: my_horse2zebra.zip)、以下のコードを [cyclegan.ipynb](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/generative/cyclegan.ipynb) の冒頭にいれると、ダウンロードの代わりに zip を利用できます。

```py
## Google Drive をマウント
from google.colab import drive
drive.mount('/content/drive')

## Google Drive から zip をコピー
!cp /content/drive/My\ Drive/my_horse2zebra.zip ./

## URL をダウンロードするところを extract に変更
## https://www.tensorflow.org/datasets/api_docs/python/tfds/download/DownloadManager#extract
!git clone --depth 1 https://github.com/tensorflow/datasets
!perl -i.org -pe 's{data_dirs = .*}{data_dirs = dl_manager.extract("/content/my_horse2zebra.zip")};' datasets/tensorflow_datasets/image_classification/cycle_gan.py
!diff datasets/tensorflow_datasets/image_classification/cycle_gan.py{.org,}
!cd datasets/; pip install -e .

## import しておく
import sys
sys.path.append("/content/datasets/")
import tensorflow_datasets as tfds
print(tfds.__version__)
```

# 2. 学習

「Checkpoints」では `checkpoint_path` に前回のチェックポイントがあれば自動的に読み込んでくれるので (デフォルトだと `./checkpoints/train` = `/content/checkpoints/train`)、Google Drive 上のディレクトリのシムリンクを作っておきます。

```py
!mkdir -p /content/drive/My\ Drive/cyclegan_checkpoints/
!ln -s /content/drive/My\ Drive/cyclegan_checkpoints/ /content/checkpoints
```

後は [cyclegan.ipynb](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/generative/cyclegan.ipynb) をただ上から実行すれば学習・出力されます。
初心者のscssの使い方まとめメモ

Probate sassの勉強内容まとめ
拡張子が変わります。
.cssではなく、.scssになる。

□　scssのメリット
記述量が減る
コードの再利用が出来る

同じセレクタの省略　カッコの内に記載する。　
例　.cssの時
.header {
 Width: 100%:
}

.header ul {
 Width: 100%:
}

⇩　scssの時
.header {
 Width: 100%:
　ul {
 　Width: 100%:
　}
}

復習　カーソルを乗せると赤色に変える　ホバー
:hover{
background-color : red:
}

復習 クリック時動作する　アクティブ
:active {
positions: relative;
top: 7px;
box-shadow: none;
}　

ホバーカーソルを乗せると赤色になるをscssで記述
.header {
 Width: 100%:
&:hover{
background-color : red:
}

}

&で繋げることが出来るもの
classも同様に出来る。
例
li {
    color: #b5afaf;
    &.current-page {
      color: #f74c90;
    }  
  }

□　mixinで入力量を減らしてみる
@include mixin名とincludeを使う。
// circleという名前のmixinを定義してください 
 
@mixin circle {
  display: inline-block;
  border-radius: 50%;
  margin-left: 10px;
  text-align: center;
  background-color: #888888;
 }

.main {
  margin: 20px 10px;
  color: #ffffff;
  .small {
    // 定義したcircleを呼び出してください include circleの中身はmixin circleと同じです。
   @include circle;
    width: 34px;
    height: 34px;
  }
  .medium {
    // 定義したcircleを呼び出してください
    width: 62px;
    height: 62px;
  }
  .large {
    // 定義したcircleを呼び出してください
    @include circle; 
    width: 90px;
    height: 90px;
  }
}
ドットを含むユーザー名ではAWSコンソールのEC2 Instance Connectで接続できません

EC2があります。

`useradd ssh.test`
としてユーザーを作ります。
AWSコンソールのEC2 Instance Connectからユーザー名をssh.testとして接続します。
"There was a problem setting up the instance connection"
と表示されます。

`usermod -l sshtest ssh.test`
としてユーザー名を変更します。
AWSコンソールのEC2 Instance Connectからユーザー名をsshtestとして接続します。
接続できました。
Hello Vue.js　初心者が学んでみた

<h１>javascript初心者がVueを学んでいく</h１>
<p>まず自分のレベルはjavascriptの基礎を覚えたか覚えてないかくらいの初心者なので的外れなことも多々あるかもしれないのでご注意ください。</p>

```html
//html
<body>
//Hello Vue.jsと表示させてみる</h1>
<div id="app">
//普通にかくとこう
<p>Hello Vue.js</p>
```
```javascript

  <script>
//vueインスタンスを作る
        new Vue({
//elでhtmlのどこを対象にするかを指定する。
            el:'#app',
//dataには色々なものを定義できる。　ここではHello Vue.jsと表示させたいのでmessage は　Hello Vue.js だよーというのを指定
            data:{
                message:'hello Vue.js'
            }
```
<p>このmessageに入れたのを使うにはhtmlに指定してやる必要がある</p>
```html
//{{}}これにさっき作ったmessageを入れてやる
<p>{{message}}</p>
```
<p>こうするとHello Vue.jsと表示することができる</p>

<p>ちなみにこれは
v-textという物を使っても表現することができる</p>
```html
html
//これでも同じくHello vue.jsというのが呼び出せる
<p v-text = 'message'></p>
```
Android 11以降でWebViewでローカルHTMLが表示できないとき

※本記事は、NativeScript-Vueのコードを提示していますが、考え方は、どの開発言語・フレームワークでも同一と思われます。予めご了承ください。

# 陥った事象

最近、[NativeScript-Vue](https://nativescript-vue.org/ja/)というものを使って、Androidネイティブアプリケーションを試しに作ってみたりしています。Vue.jsに慣れている人であれば、楽にネイティブアプリを作ることができるということで、使わせてもらっています。

さて、開発をしている最中に、UIコンポーネントの1つである「WebView」を使って、アプリ内のアセットとして配置しているHTMLファイルを表示させたい場面がありました。

通常であれば、NativeScript-Vueの場合、次のように書きます。

```vue:./src/components/App.vue
<template>
  <Frame>
    <Page>
      <GridLayout columns="*" rows="*">
        <!-- ↓ここでWebViewコンポーネントを配置して、srcとしてassetsディレクトリ内のファイルを指定 -->
        <WebView row="0" col="0" src="~/assets/index.html" />
      </GridLayout>
    </Page>
  </Frame>
</template>
```

しかしこの状態で、アプリをAndroid 11上で動作させると、次のような「ERR_ACCESS_DENIED」という表示になってしまいました。エミュレータでも実機でも同様です。

![ERROR](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/35b032c5-9d9e-e7b7-b5b2-dbb1b8e76c46.png)

そして、試しにAndroid 10のエミュレータで動作確認すると、正常に表示されるのです。

# 解決方法

[Androidのリファレンス](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess(boolean))に次のようなことが書かれていました。

> setAllowFileAccess
>
> The default value is true for apps targeting Build.VERSION_CODES.Q and below, and false when targeting Build.VERSION_CODES.R and above.

バージョンコードR（つまりAndroid 11）から、WebSettingsの**AllowFileAccess**の設定が、デフォルトで`false`になっていますよ、とのことです。ですので、明示的に`true`にしてあげることで、解決できそうです。

NativeScript-Vueの場合、次のように、Loadedイベントと組み合わせることで、解決できました。

```vue:./src/components/App.vue
<template>
  <Frame>
    <Page>
      <GridLayout columns="*" rows="*">
        <!-- ↓ここでWebViewコンポーネントを配置して、loadedイベントを捕捉 -->
        <WebView row="0" col="0" @loaded="webViewLoaded" />
      </GridLayout>
    </Page>
  </Frame>
</template>

<script lang="ts">
export default {
  methods: {
    // loadedイベントが発生した時の処理
    webViewLoaded(args) {
      if (args.object.android) {
        args.object.android.getSettings().setAllowFileAccess(true); // ここで、setAllowFileAccessメソッドを使って、trueにする
        args.object.src = "~/assets/map/index.html"; // 上記設定をしてから、ファイルを初めて読み込む
      }
    },
  },
};
</script>
```

ただ、同リファレンスにも少し書かれているのですが、このような方法でHTMLを表示させるよりも、より安全な方法があるのかもしれません。

---

※結局自己解決したのですが、もともと[StackOverflowで質問していました](https://stackoverflow.com/questions/64739230/nativescript-vue-unable-to-display-local-html-in-webview)。
ARマーカーの作成方法メモ

#■ARマーカ作成サイト:AR.js Marker Training
https://jeromeetienne.github.io/AR.js/three.js/examples/marker-training/examples/generator.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/01423b04-54f3-1af6-0330-cc0ba3f06553.png)

#使い方

１．Pattern Ratioそのまま、ImagesizeはMAXに設定してUPLOADボタンをクリック。

２．DOWNLOAD MARKER：パターンファイルをダウンロードできる

３．DOWNLOAD IMAGE：実際のマーカーのpngファイルをダウンロードできる
git submodule

submodule追加

```bash
git submodule add <git url> <path>
```

submoduleのステータス確認

```bash
git submodule status
```

submodule削除

```bash
# .git/configの中身の該当箇所を削除(?)
git submodule deinit <path>
# .gitmodules/modulesの中を削除
rm -rf .gitmodules/modules/<name>
# 実体を削除
rm -rf <path>
```

submodule更新

```bash
git submodule update --remote
```

参考

* https://qiita.com/k_yamashita/items/040c04f8798d2384806e
* https://qiita.com/BlueSilverCat/items/19bb9b814572cd35b2ae
Gutenbergの埋め込みでWordPressのアイコン画像をカスタマイズする方法


#Gutenberg埋め込みでWordPress画像が表示される

実用的なGutenbergのカスタマイズをご紹介します。
WordPressのURLを埋め込みすると…WordPressアイコン画像が表示されます。
![Alt text](https://i.gyazo.com/226c62eadc4dde2429ea98701ccfd9c6.png)

#サイトアイコンにオリジナル画像を登録

![Alt text](https://i.gyazo.com/d08a73913a4c15b43e3c93fa39f278ca.png)

WordPress管理画面メニューの
外観＞カスタマイズ＞サイト基本情報のサイトアイコンにオリジナル画像を登録します。

![Alt text](https://i.gyazo.com/fd1c7cff864830b9a06ad9a312bf1daa.png)

![Alt text](https://i.gyazo.com/b55aaee184699b2d9fb32cf0a2109638.png)

カスタマイズ大成功〜:v_tone2:

しかし…画像カスタマイズを行うと
WordPress管理画面のFaviconがオリジナル画像に変わってしまいます。

別に画像を指定する場合は管理画面のFaviconを設定します。
function.phpに以下の記述を追加してください。

#管理画面のFaviconを設定

```php:php
//管理画面にfaviconを指定
function admin_favicon() {
  echo '<link rel="shortcut icon" type="image/x-icon" href="/wp-includes/images/w-logo-blue.png" />';
}
add_action('admin_head', 'admin_favicon');
```
WordPress管理画面のFaviconも自由に設定できます。

Gutenbergカスタマイズの際は忘れないよう指定しておくと良いですね〜:fist:
Macで<stdc++.h>を使えるようにする簡単な方法

## stdc++.hを作る
```
$ brew install gcc
$ mkdir /usr/local/include/bits
$ vi /usr/local/include/bits/stdc++.h
```
[stdc++.hの中身](https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a01040_source.html)をコピーする.
stdc++.hへ書き込む. (行番号をエディタなどで削除.)

## stdc++.hが機能しているか確認する
```
#include <bits/stdc++.h>
using namespace std;

int main() {
  freopen("IO_in1.txt", "r", stdin);
  int TC;
  vector<int> v;
  scanf("%d", &TC); // number of test cases
  while (TC--) { // shortcut to repeat until 0
    int a, b, c; scanf("%d %d %d", &a, &b, &c);
    v.push_back(a);
    v.push_back(b);
    v.push_back(c);
    sort (v.begin(), v.end()); 
    printf("%d %d %d\n", v[0], v[1], v[2]); // compute on the fly
  }
  return 0;
}
```

## TC_in1.txtを書く
```
1
3 5 1
```

## 実行
```
$ g++ io.cpp
$ ./a.out
```
1 3 5と出てきたら成功.
GitHubでリモートリポジトリにpushしようとしたらerror: failed to push some refs to ...(URL)と出てきたとき

ネットに書いてある情報をそのままコピペしてGitHubのリモートリポジトリに初pushしようとしたら　error: failed to push some refs to　...とエラーが出てきました。

```
$ git add .
$ git commit -m "First commit"
$ git push origin master
 error: src refspec master does not match any
 error: failed to push some refs to '
```

GitHubページをよく見てみたら、デフォルトのbranchがmasterじゃなくてmainに変わっていました。

ということで

```
$ git push origin main
```

でいけました。


チャンチャン
『エンジニアの知的生産術』第一章　新しいことを学ぶには　を読んで

##はじめに
今回初めてQiitaに投稿します。よろしくお願いします。
「エンジニアの知的生産術」という本を読んだので、一章ずつ印象に残った部分を投稿していければと思います。
『エンジニアの知的生産術　西尾泰和』[Amazonリンク](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93-%E2%94%80%E2%94%80%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B3%E3%80%81%E6%95%B4%E7%90%86%E3%81%97%E3%80%81%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-WEB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774198765)

##今回やってみた読み方
いつも技術書を読んだときにまとめ方に困っており、GoogleDocumentに書き抜きをしたりしていたのですが、本の中で繰り返し読み・マインドマップでのアウトプットが出てきましたので、
本の中で紹介されていた方法とは少し異なってしまいますが、
気になった点にラインマーカー→ラインマーカーを頼りにマインドマップ（書き方あっているかわかりませんが）の読み方を試しています。
第一章のマインドマップ（というかメモ？）はこちら。
![IMG_6809.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661656/415d585b-f364-5f53-d56f-c353c324d70f.jpeg)

##やる気の維持に必要なこと
本題です。「第一章　新しいことを学ぶには」で印象に残ったのはやる気の維持についてです。勉強したいなと思うことがあっても、やる気の維持はいつでも課題です。
紹介されていたことを一言でまとめると、やることを明確化して、達成していくという感じがしました。
###知りたいところから
重要だと感じたのは、以下のポイントです。
やる気の維持には「知りたいところから」。「遠いゴールではなく『今、自分のやりたいこと』を目指す」。その前提としては「目標の明確化」「達成可能な目標設定」「大まかな全体像の把握」が必要。写経は「大まかな全体像の把握」ができない場合の手段で、その場合はゴール明確化のために時間帯での目標設定が有効。写経をやっていくうちに新たに知りたいことややりたいことが発見できれば、目標の明確化ができ、脱写経できる。写経は効率は良くないが、悪いことではなく、写経しないとわからないくらいの新しい分野へのチャレンジは大切。

特に自分は「大まかな全体像把握」をせずに写経に突入することが多かったので、次回から活かしてみたいと思います。

##検証
もう一つ、検証についても印象に残りました。（間に抽象化のパートもありましたが、そこはあまりピンとこなかったので割愛します。）
以下ポイントと感じたことです。
学んで自分の頭にあることは正しいとは限らないので、使ってみて検証する必要がある。
###作って検証
プログラミングは試行錯誤（検証）のコストが安く、「学びのサイクルを高速に回せる」分野。プログラミングのように実際に「作って検証」する他に、「解説を作る」という方法も有効。

###おわりに
今回はじめてマインドマップでまとめる方法を試してみましたが、短時間でまとめられて頭の整理にもなり、かなり良いと感じました。この調子で最後の章まで挫折せずに投稿していきたいと思います。
モデルから立体感のあるスプライトを作る

UniversalRPでは[エモい2Dライトが使えます](https://youtu.be/Km_4NQPk59s)。
せっかくなので、エモイライトでエモく陰影が付くスプライトを作ってみましょう。
＊下の画像で回転しているのは**モデルではなく陰影付きのスプライトです。**
![ezgif-3-b6a4f7e766c9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/457ed49b-5592-4edf-3b1a-07806578944b.gif)

まずはバンプマップを表示するShaderGraphを作成します。
![2020-06-12_224906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/98d55d6f-6892-92f1-7cce-9551e587a934.png)

サンプルとして、AssetStoreから[ダウンロードして](https://assetstore.unity.com/packages/3d/animations/sd-unity-chan-haon-custom-bundle-84992)[既存マテリアルを半自動で変換した](https://qiita.com/ELIXIR/items/60e0fbd0a060ac3a698c)モデルと、
![outputURP_albedo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7aa9584d-e10b-70c2-a5f1-1f1c896e1349.png)

バンプシェーダーを使って表示したバンプモデル
![outputURP_bump.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2a60e92c-4069-d655-ba6d-76191c6363b2.png)
をファイルに保存し、
UniversalRPのマテリアルにアタッチしました。
![2020-06-13_000845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/95a7a027-d7ce-2758-bd76-e4274b974dd8.png)

1枚絵ですがかなり立体感があります。
![gif_animation_003.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1ef64faa-2ecb-d36f-c4ae-26d2ccbfb9a6.gif)

シェーダーを写経するのが面倒、という方は
 [アセット販売中です](https://assetstore.unity.com/packages/tools/sprite-management/modeltobump-171138)！
[![ModelToBump_Icon160x160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1cda5feb-c92d-82db-474e-a6a16a4b4dd8.png)](https://assetstore.unity.com/packages/tools/sprite-management/modeltobump-171138)
VSCodeでコーディング中のRustコードを"Run test"ボタンでユニットテストする時に環境変数を効かせたかった

![VSCode_s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/2ef40a15-4c68-b012-9e27-35ede836766d.png)
`Run test`のボタンでユニットテストするときに、何故かエラーになるので、どうしてカナ？って思った。
ターミナルから直接 `cargo test` するのは問題ないからコードのせいではないな、と。
最初コレ、デバッガーの機能だと勘違いしていたので、 `launch.json` いじくり回して悩んでいたんだ。
でもこれ、ターミナルで `cargo run` しているだけなんだね。
ちょっと気がつくのに時間がかかった。
そもそも、ターミナルからのテストは

```
$ env $(cat ../.env.sample) cargo test
```
と、環境変数を一時設定した`sh`で実行していたので、 `VSCode` のターミナル実行も当然環境変数の設定のが必要なわけですね。
結論としては

```
$ tree .vscode
.vscode
├── launch.json
└── settings.json
```
ここに、`settings.json`作って環境変数を設定すると、ターミナルを開いたときに適用される。

```
{
    "terminal.integrated.env.linux": {
        "SET_ENV": "dev",
        "SET_DATABASE_URL": "mysql://root:password@127.0.0.1:3306/test_database01"
    }
}
```
こんな感じ[^1]。
[^1]: 設定して最初の一回目だけ「設定ファイル適用するか？」みたいなことを聞いてくる。「はい」と答えてもターミナルは既に開いてしまっているので、もう一度実行する必要があります。

めでたく、正常終了しました。

これって結局、`Rust`でも`crago`でもなくて、`VSCode`の設定の問題でしたね。
他の言語でもVSCodeのターミナル実行するケースでそのまま使えると思います。
AIパイプラインのmediapipeのノート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521590/5a0a1e7b-3e0f-7472-dfdb-b913f1f58c8b.png)

mediapipeの説明と自分のTFliteモデルを使い方
https://blog.gofynd.com/mediapipe-with-custom-tflite-model-d3ea0427b3c1


mediapipeのリポジトリ
https://github.com/google/mediapipe

mediapipeのFlutterのハンドトラッキングのアプリ
https://github.com/zhouzaihang/flutter_hand_tracking_plugin

mediapipeの各プロジェクト
https://github.com/mgyong/awesome-mediapipe/


mediapipeのハンドコマンドの実施方法
https://www.deuxexsilicon.com/2020/03/16/1st-motivation-and-first-steps/
アイコンをマウスオーバーした際に吹き出しを表示させる

# はじめに
今回は、アイコンにマウスオーバーした際に、吹き出しが表示させる実装を行います。

# 完成イメージ
![tooltip2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683220/efda8eab-6f55-4dfd-03a1-e97e8abfdcd2.gif)



# 環境
MacOS 10.15.7
ruby 2.6.5
Ruby on Rails 6.0.0
jquery 3.4.1


# 前提条件
- bootstrapが導入済みである。
- font-awesomeが導入済みである。

# 作業していきましょう！

今回は、bootstrapのtooltipの機能を使って実装します。

###html.erb

```erb:○○○.html.erb
<i class="fas fa-bell headerBellIcon", data-toggle="tooltip", data-placement="top", title="お知らせ">
```

tooltipを使う場合は

```erb
data-toggle="tooltip", data-placement="top", title="文字列"
```
を追加します。


###jsファイル

```javascript:○○○.js
$(function() {
  $('[data-toggle="tooltip"]').tooltip()
})
```

### 補足
html.erbの`data-placement=`は要素に対してどの位置に吹き出しを表示させるのかを指定します。
data-placement= 'top'の場合だと、要素に対して上部に吹き出しが現れるようになります。

なお、
'right' ・・・　要素の右側に表示
'left' ・・・　要素の左側に表示
'bottom' ・・・　要素の下部に表示
となります。

titleについて実際に吹き出しに表示させたい文字列を明記します。


# 参考
今回の内容は、↓のリンクに全て書かれております。他にもオプションなどが用意されておりますので、一度見ていただければと思います。

Tooltip bootstrap 4.3 日本語リファレンス
https://getbootstrap.jp/docs/4.3/components/tooltips/
WPFプロジェクトでリソースを正しく参照する

##はじめに
WPFアプリをタスクトレイに常駐させたくなり、便利そうなライブラリがあったので使うことにしました。
[Hardcodet NotifyIcon for WPF](https://github.com/hardcodet/wpf-notifyicon)

ただチュートリアルに沿って試してもicoファイルが参照できず、少し手こずったのでメモ

##準備

1. VisualStudioからWPF/.NetCoreのプロジェクトを作成
2. Nugetマネージャから上記ライブラリをインストール

##アイコン追加
コンソールマネージャからWPFプロジェクト上で右クリックし、[プロパティ]を選択
左のタブの[リソース]を選択し、[このプロジェクトには..]を選択してリソースファイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/d2f22789-8b21-1d20-c79a-1721100ac997.png)

左上のリソースの種類から[アイコン]を選択し、[リソースの作成]をクリック
アイコンのファイル名が求められるので、今回は適当に"sample"と入力
するとWPFのプロジェクトに"Resources"というディレクトリが作成され、"sample.ico"というファイルが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/17aca316-bce4-4fa7-fbc3-831939ecd1dc.png)

##XAML
[チュートリアル](https://www.codeproject.com/Articles/36468/WPF-NotifyIcon-2)には以下のように記載があります

```XAML:MainView.xaml
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:tb="http://www.hardcodet.net/taskbar"
>
  <Grid>
    <tb:TaskbarIcon
      IconSource="/Icons/Error.ico"
      ToolTipText="hello world" />
  </Grid>
</Window>
```

今回、icoファイルはRecourcesディレクトリに存在し、ファイル名はsample.icoなので
IconSourceの値を

```
IconSource="/Recources/sample.ico"
```
に変更すれば行けそうだ。
と思ったんですが、コンパイラに「見つかりません」と怒られてしまいました

##解決策
ソリューションエクスプローラからsample.icoをクリック
すると下にファイルのプロパティが表示される

このプロパティの**ビルドアクション**を**リソース**へ変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/8d8ec027-d544-b1d0-682c-343b33247694.png)


またRecourcesにicoファイルを置いた場合、パスの指定が間違っていたので

```
IconSource="../Recources/sample.ico"
```

に修正。

こうすることで、正しくicoファイルを参照し、タスクトレイへ表示することができました。
Webデザイン 色のイメージ

#はじめに
現在オリジナルアプリを作成中です。トップページのフロント実装時に色合いの考え方を調べました。忘れても思い出せるよう書き記します。

**開発環境**
ruby 2.6.5
Rails 6.0.3.4

#目次
1.色の効果
2.オリジナルアプリの配色

#1.色の効果
Webデザインで使う色は目的別で選ぶ必要がある。Webサイトを利用するユーザー目線に立つことが重要である。


<font color="Crimson">赤系</font>
--------
熱い、生命力、<font color="Crimson">警告</font>

<font color="Orange">オレンジ系</font>
-------
近親感、陽気

<font color="Gold">黄系</font>
-------
好奇心、協力

<font color="Green">緑系</font>
-------
自然、リラックス

<font color="Blue">青系</font>
-------
冷たい、静けさ、<font color="Blue">誠実</font>

<font color="Purple">紫系</font>
-------
後期、威厳

<font color="Pink">ピンク系</font>
-------
柔らかい、可愛い

<font color="Broun">茶色系</font>
-------
安定、信頼、歴史


#2.オリジナルアプリの配色
オリジナルアプリは大きく分けて下記2つの機能を有する。トップページからそれぞれリンク先に遷移できるように実装した。
・ユーザーへの掃除提案
・掃除したデスク画像の共有

「ユーザーへの掃除提案」リンクを赤系にした。これは清掃を促す(警告)するためである。「掃除したデスク画像の共有」は青にした。これは清掃後のデスクを想定したため、清潔感をイメージする青を選択した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703987/49f0efb2-31af-6cae-89dc-3fbe341a7680.png)


参考
[1冊ですべて身につくHTML-CSSとWebデザイン入門講座](https://www.amazon.co.jp/1%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FHTML-CSS%E3%81%A8Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-Mana/dp/4797398892/ref=asc_df_4797398892/?tag=jpgo-22&linkCode=df0&hvadid=295723231663&hvpos=&hvnetw=g&hvrand=14579486333190010068&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009202&hvtargid=pla-637663128882&psc=1&th=1&psc=1)
[Qiitaのマークダウンで色をつける方法[140色]](https://qiita.com/twipg/items/d8043cd4681a2780c160)
（MacbookAir2018）トラックパッド操作時のマウスカーソル挙動が異常であるときに試すこと

PC:MacbookAir2018 13インチ　
OS:Catalina 10.15.6

症状はタイトルのとおりですが、具体的な例としては

 **-カーソルの位置がワープする**
 **-指をおいているだけでもカーソルが小刻みに動く**
 **-思ったとおりの方向に動かない**

などです。
結論から先に書きます。

##私の場合は、電源アダプタの接続を外したら解消しました。
今までは純正品のアダプタを使用していましたが、別のものを購入したので使用しておりました。
バッテリー20%の時でも再現性がみられたため、過充電が原因でもなさそうです。

一応、今回使ったアダプタのリンクを貼っておきます。
[87W USB-C 電源アダプタPD対応 急速充電器](https://www.amazon.co.jp/gp/product/B08BCJ72KQ/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)


他の方の記事でよく見る試してみることとしては

 **-NVRAMリセット**
　1.システム終了する。
　2.電源ボタンを押したら、Command＋Option＋P＋Rを押し続ける。
　3.起動音が2回鳴る、または十分な時間キーを押し続けたら、キーを離す。
 　[Mac で NVRAM または PRAM をリセットする方法](https://support.apple.com/ja-jp/HT204063)

 -**SMCリセット**
　1.システム終了する。
　2.「shift」「control」「option」を押しながら電源ボタンを押し、4つのキーを押した状態のまま10秒程待つ。
　3.電源ボタンを押してMacを起動する。
　[MacのSMC(システム管理コントローラ)をリセットする方法](https://support.apple.com/ja-jp/HT201295)
　
などがよく見られましたが、私の場合は試しても何も変わりませんでした。
Github【プルリクエスト手順】

GitHubのプルリクエストについて、説明していきます。

【目次】
１．ターミナルでのcommitとpushについて。
２．Githubで、プルリクエスト！



１．ターミナルでのcommitとpushについて。
①ターミナル上で、masterブランチに戻る。
$git checkout master

②Github上の最新のmasterを取得する。
$ git pull origin master

③修正用にブランチを作成する。
$ git checkout -b feature/　ブランチ名　

④必要な修正を行う。

⑤変更したファイル一覧と、変更した内容を確認する。
ファイル：$ git status
内容：$ git diff 

⑥問題なければ、変更したファイルをブランチに追加する。
$ git add .

⑦コミットを行い、”コメント”を入れる。
$ git commit -m "コメント"

⑧プッシュを行う。
$ git push origin feature/　ブランチ名



２．Githubで、プルリクエスト！

![0 Issues.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884878/c6208d0a-f17f-771a-23a7-f3b06d38993f.png)


①プッシュを行うと、Github上部にプルリクエストのタブが表示される。
それを押すと、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884878/732af9ac-bff4-d22e-9ebe-857261f58c31.png)

②どのブランチからマスターにつなげるのかを、表示してくれる。
これを再度チェックして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884878/3fb1bd31-d578-c8d6-c45d-6449ba77dba7.png)

③必要なプロジェクトメンバーを入れてから、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884878/14688ceb-07f4-141b-65cd-433ac1b8c8a6.png)

④プッシュ。
Emacs Lispで湯婆婆を実装してみる

# はじめに

この記事は [湯婆婆 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/yubaba) の5日目です。


こちらの記事をきっかけに、色々な言語で湯婆婆（入力された名前から1文字選んで新しい名前を付ける）を実装するのが流行っています。
原作者様: [Javaで湯婆婆を実装してみる - Qiita](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)

世の中にはいったい何種類のプログラミング言語があるのか…。**令和のHello World!**
→[【毎日自動更新】湯婆婆 LGTMランキング！ - Qiita](https://qiita.com/torifukukaiou/items/c8361231cdc56e493245)

だいたいのプログラミング言語は出てしまっているので、何にしようかなと思いましたが
[Vim script で湯婆婆を実装してみる - Qiita](https://qiita.com/peony/items/52d9d04b004bd9a5e62b)
こちらからヒントを得て「Vim script があるなら Emacs Lisp があってもいいじゃない」ということで。

# 検証環境

- Cygwin (Windows 10 20H2 Home)
- GNU Emacs 27.1

# コード

Emacsの設定ファイル (``~/emacs.d/init.el`` など) に以下のコードを書いてください。

```emacs-lisp:~/emacs.d/init.el
(defun yubaba (name)
  (interactive "sそこに名前を書きな。")
  (let* ((len (length name))
         (index (random len))
         (new-name (substring name index (+ index 1))))
    (message
     "フン。%sというのかい。贅沢な名だねぇ。\n今からお前の名前は%sだ。いいかい、%sだよ。分かったら\\
返事をするんだ、%s!!"
     name new-name new-name new-name)))
```

Emacsを再起動すると、``yubaba`` コマンドが使えるようになります。
``M-x yubaba`` [^1] を入力すると湯婆婆が起動します。

[^1]: ``M-x`` は Alt+Xキーを同時押しするか、Escキーを押した後にXキーを押すと入ります。

```
M-x yubaba
そこに名前を書きな。
```

ここで名前を入力してEnterを押すと、湯婆婆は名前からランダムに1文字取って命名します。

```
そこに名前を書きな。山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は太だ。いいかい、太だよ。分かったら返事をするんだ、太!!
```

サロゲートペアにも対応しているようでした。

```
そこに名前を書きな。𠮷田
フン。𠮷田というのかい。贅沢な名だねぇ。
今からお前の名前は𠮷だ。いいかい、𠮷だよ。分かったら返事をするんだ、𠮷!!
```

## 解説

あまり解説することもありませんが、強いて言えば ``interactive`` でしょうか。

``(interactive "sそこに名前を書きな。")`` を含む関数が ``M-x`` でコマンドとして呼び出されると、「そこに名前を書きな。」を表示して入力を促し、入力された内容を文字列としてその関数の第1引数 (``name``) にセットします。

``interactive`` の使用例が書かれたページをいくつか挙げておきます。

- [\[Home\] Interactive Function](https://www.emacswiki.org/emacs/InteractiveFunction)
- [Emacs Lispを基礎から学ぶ (3): コマンドの定義 - yhashのブログ](http://yhash.hatenablog.com/entry/2012/07/14/134732)
- [emacsのinteractiveの使い方を整理し理解してみました - むかぁ～ どっと　こむ](http://mukaer.com/archives/2012/03/24/emacsinteractiv/)

ちなみに、この関数はコマンドとして動くだけではなく、普通の関数として ``(yubaba "山田太郎")`` のように引数を与えて呼び出すことも可能です。
例えば ``*scratch*`` などに ``(yubaba "山田太郎")`` と書いて、閉じカッコの後ろにカーソルを移動して ``C-x C-e`` を入力すると

```
"フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は郎だ。いいかい、郎だよ。分かったら返事をするんだ、郎!!"
```

のように表示されます。このとき「そこに名前を書きな。」は表示されません。

# お約束

名前を書かずにEnterを押すとクラッシュします。

```
そこに名前を書きな。
Args out of range: "", 339121942017045916, 339121942017045917
```
【JavaScript】基本的なモジュール（ESM）の使い方について【まとめ】

# モジュール（ESM）とは
・ソースコードを整理、分割する仕組み
・ブラウザ上で動作
・ES６から導入
・import / exportを使用
・IEでは未対応

**これを使用することにより、別ファイルで定義した変数や関数を扱うことができる**

# import
モジュールを読み込む

# export
モジュールを出力

# 主な用途

例として**moduleA.js**と**moduleB.js**のファイルを作成。
**moduleA.js**で`export`したモジュールを**moduleB.js**に`import`します。

```
フォルダ構成
|--index.html
|--moduleA.js
|--moduleB.js
```
***
htmlファイルの準備

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>Document</title>
  </head>
  <body><!-- ↓typeを"module"に。   ↓moduleB.jsを読み込む。 -->
    <script type="module" src="moduleB.js"></script>
  </body>
</html>

```



***
moduleA.jsの準備
適当な変数と関数を定義

```javascript:moduleA.js

const hoge = 'ほげ';

const fuga = () => {
  console.log('ふが');
}

```

現状もちろんこれらの変数、関数は**moduleA.js**内でしか使用できません。
これを`export`を使い**moduleB.js**内で使用できる様に準備します。

```javascript:moduleA.js

export const hoge = 'ほげ';

export const fuga = () => {
  console.log('ふが');
}

```

***

moduleB.jsの準備

**moduleA.js**で定義した`hoge`と`fuga`を`import`しています。

```javascript:moduleB.js
import { hoge, fuga } from './moduleA.js'

console.log(hoge); // => ほげ
fuga()             // => ふが

```

できました！
***
ちなみにこうすることで`import`した変数関数の名前を変更できます。

```javascript:moduleB.js
import { hoge as h, fuga as f} from './moduleA.js'

console.log(h); // => ほげ
f()             // => ふが

```
***

オブジェクトとして格納することも可能。

```javascript:moduleB.js
import *as moduleA from './moduleA.js'

console.log(moduleA.hoge); // => ほげ;
moduleA.fuga();            // => ふが;

```

# デフォルトエクスポート
さっきまでのは**名前付きエクスポート**という機能でした。
**デフォルトエクスポート**もやってみます。

**moduleA.js**及び**moduleB.js**の記述を変更します。



```javascript:moduleA.js

export default 'ほげ';

```

```javascript:moduleB.js

import hoge from './moduleA.js'

console.log(hoge); // => ほげ

```

**デフォルトエクスポートはモジュールごとにひとつしか作れません。**
Javascriptの配列操作

Javascriptの配列まわりの関数や構文を抜粋してみました。

##スプレッド構文
配列(正確にはIterableな値全般)を展開します。
単に展開したいときはもちろん、配列のコピーを作れるため配列を直接変更するメソッドも配列を変更せずに利用できます。
配列を結合するArray.prototype.concatの代わりにもなります。

```Javascript:
const newarray = [value1, ...array, value2];
const copyarray = [...array];
```

##Array
コンストラクタです。特定の長さの配列が作れます。
スプレッド構文かArray.prototype.fillなどで初期化しないと、Array.prototype.mapが動かないので注意が必要です。

```Javascript:
const newarray = Array(8);
```

##Array.prototype.fill
全要素を指定した値で埋めます。直接変更されます。
開始位置と終了位置は省略可能で、省略して場合は先頭から末尾までです。

```Javascript:
const newarray = [...array].fill( value, start, end );
```

##Array.prototype.reverse
配列の順序を反転させます。直接変更されます。

```Javascript:
const reversed = [...array].reverse();
```

##Array.prototype.find / Array.prototype.findIndex
条件を満たす要素、あるいはその要素のindexを返します。
どちらも先頭から走査して、最初に条件を満たした要素について処理します。

```Javascript:
const value = array.find( (element, index, array) => boolean );
const index = array.findIndex( (element, index, array) => boolean );
```

##Array.prototype.filter
findに似ています。条件を満たす全ての要素からなる新しい配列を返します。

```Javascript:
const newarray = array.filter( (element, index, array) => boolean );
```

##Array.prototype.join
String.prototype.splitと対になるようなメソッドです。
全要素を連結した1つの文字列にします。
区切り文字が指定でき、省略した場合は「,」(カンマ)になります。
空文字を指定することで区切り文字無しで連結することができます。

```Javascript:
const text = array.join(separator);
```

##String.prototype.split
Array.prototype.joinと対になるようなメソッドです。
区切り文字を省略した場合、または文字列中に区切り文字が見つからなかった場合は分割せずに1要素の配列を返します。
空文字を指定した場合は1文字ずつに分割されますが、サロゲートペアも分割してしまうので、絵文字などが含まれる場合は注意が必要です。
また、分割限界数を指定することができます。省略した場合は無制限です。

```Javascript:
const array = string.split(separator, limit);
```
##Array.prototype.map
全要素を変換して新しい配列を返します。

```Javascript:
const newarray = array.map( (element, index, array) => value );
```

##Array.prototype.reduce
全要素を変換して新しい**値**を返します
他のメソッドの実質的な上位互換で、なんでもできます。

```Javascript:
const newvalue = array.reduce( (accumulator, element, index, array) => newaccumulator, initialvalue );
```

#おわりに
今回の投稿はreduce()の用途がわからなかったので、他のメソッドを調べて比較したのがきっかけです。
自分がよく使うものを中心にまとめたので、網羅はできてないかもしれませんが、みなさんの助けになれば幸いです。

#参考
Array - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array

困ったらね、MDN見たらいいんですよ。:sunglasses:
親から孫コンポーネントのデータ連携方法

##概要
vue.jsとtypescriptでアプリを制作中、親-子コンポーネントのデータ連携はできたが、親-子-孫コンポーネントのデータ連携に少し時間がかかってしまった。

そこで、階層の深いコンポーネント間のデータ連携についてまとめていきます。

#####親クラス
```vuejs:Parent.vue
<template>
<!-- 1, 2 -->
  <Child
    :name="name"
    @nameFromChild="name=$event">
    </Child>
</template>

<script lang="ts">
import {Vue, Component} from 'vue'
import Child from 'components/Child.vue'

@Component({
    components: {
        Child
    },
    })
class Parent extends Vue {
    /** 名前(変更対象) */
    private name = "";
}  
</script>

```
1. Childコンポーネントに空のname=""を渡す
2. 子コンポーネントが"nameFromChild"で発火したイベントを受け取り、name変数に変更された値が入る

#####子クラス
```vuejs:Child.vue
<template>
<!-- 2, 3 -->
  <GrandChild
    :grandChildName="childName"
    @grandChildName="childName = $event">
    </GrandChild>
</template>

<script lang="ts">
import {Vue, Component} from 'vue'
import Child from 'components/Child.vue'

@Component({
    components: {
        Child
    },
    })
class Child extend Vue {
    /** 1 */
    @Prop()
    private name = "";
    
    /** 3 */
    get childName(){
        return this.name;
    }

    /** 4 */
    set childName(name: string){
        this.$emit('nameFromChild', name);
    }
}  
</script>

```
1.  親コンポーネントからProp関数で空のname=""を受け取る 
2.  GrandChildコンポーネントに空のchildName=this.nameを渡す
3.  孫コンポーネントが"nameFromGrandChild"で発火したイベントを受け取り、childNameに変更された値が渡される
4.  孫コンポーネントからgrandChildNameでイベントが発火される。childNameが孫から渡された値($event)によって変更された場合、下記ではemit関数で親コンポーネントにイベントを発火し、書き換えられたnameを渡す

#####孫クラス
```vuejs:GrandChild.vue
<template>
  <v-text-field
    :value="grandChildName"
    @input="$emit('nameFromGrandChild', $event)">
    </v-text-field>
</template>

<script lang="ts">
import {Vue, Prop} from 'vue'

class GrandChild extends Vue {
    /** 1 */
    @Prop()
    private grandChildName?: string;
}  
</script>

```
1. 子から渡ってきた空のgrandChildName=""
2. emit関数を使用し、テキストフィールドが変更(input)されたら、変更された値($event)を引数を持ってイベントを発火
SquidでAWS EC2をフォワードプロキシにする

# はじめに
AWS EC2にSquidをインストールして、フォーワードプロキシとして利用する手順です。
EC2のOSのバージョンは、Amazon Linux 2です。

# 手順
**1. EC2にSquidをインストールする**

```sh:スクリプト
sudo yum update -y

# Squidをインストールする
sudo yum install squid -y

# Squidを起動する
sudo systemctl start squid

# Squidの起動とサーバーの起動を連携する
sudo systemctl enable squid
```
**２. Squidの設定をする**

```sh:スクリプト
export VPC_IP=[Squidを利用するVPCのCidrBlock]
# Squidで利用するポート番号
# 今回は8080とする
export SQUID_PORT=8080

sudo sed -i "s#10.0.0.0\/8#${VPC_IP}#g" /etc/squid/squid.conf
sudo sed -i "s/acl localnet src 172.16.0.0\/12/# acl localnet src 172.16.0.0\/12/g" /etc/squid/squid.conf
sudo sed -i "s/acl localnet src 192.168.0.0\/16/# acl localnet src 192.168.0.0\/16/g" /etc/squid/squid.conf
sudo sed -i "s/acl localnet src fc00::\/7/# acl localnet src fc00::\/7/g" /etc/squid/squid.conf
sudo sed -i "s/acl localnet src fe80::\/10/# acl localnet src fe80::\/10/g" /etc/squid/squid.conf

sudo sed -i "s/acl Safe_ports port 2/# acl Safe_ports port 2/g" /etc/squid/squid.conf
sudo sed -i "s/acl Safe_ports port 48/# acl Safe_ports port 48/g" /etc/squid/squid.conf
sudo sed -i "s/acl Safe_ports port 5/# acl Safe_ports port 5/g" /etc/squid/squid.conf
sudo sed -i "s/acl Safe_ports port 7/# acl Safe_ports port 7/g" /etc/squid/squid.conf
sudo sed -i "s/http_port 3128/http_port${SQUID_PORT}/g" /etc/squid/squid.conf

cat <<EOS | sudo tee -a /etc/squid/squid.conf
forwarded_for off
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
reply_header_access X-Forwarded-For deny all
reply_header_access Via deny all
reply_header_access Cache-Control deny all
EOS
```
FitGen.exeを日本語Windowsで実行したとき発生するJavaのエンコーディングに関するエラーを回避する

## TL;DR
環境変数の `JAVA_TOOL_OPTIONS` に `-Dfile.encoding=UTF-8` を設定する。

![環境変数_JAVA_TOOL_OPTIONS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594488/0de2abfb-b41a-c959-5ec6-905519c52203.png)


## 詳細
GARMIN FIT SDKでカスタムメッセージ等を定義した場合、FitGen.exeを実行しFIT SDKを生成する必要がある。
https://developer.garmin.com/fit/cookbook/fitgen/

しかし、最近Garmin Developersで配布されているFIT SDKのEventMesg.javaのドキュメントコメントに謎の文字化けが混入しておりそのままFitGen.exeを実行すると

```
> .\FitGen.exe -o test -java
FIT Code Generator - Protocol 2.00  Profile 21.40Release
SDK Version: production/akw/21.40.00-0-g813c158
Parsing existing config.csv...
Writing new config.csv...
Generating Java code...
Building Java tools...0%
com\garmin\fit\EventMesg.java:679: エラー: この文字は、エンコーディングMS932にマップできません
     * Comment: Theﾃつ?firstﾃつ?byteﾃつ?isﾃつ?theﾃつ?radar_threat_level_max, theﾃつ?secondﾃつ?byteﾃつ?isﾃつ?theﾃつ?radar_threat_count, and theﾃつ?lastﾃつ?16ﾃつ?bitsﾃつ?areﾃつ?reservedﾃつ?forﾃつ?futureﾃつ?useﾃつ?andﾃつ?shouldﾃつ?beﾃつ?setﾃつ?toﾃつ?FFFF.
                     ^
以下略
```

というエラーが発生し、ビルドに失敗する。

`この文字は、エンコーディングMS932にマップできません` というエラーはjavacにUTF-8等適切なエンコーディングを渡してやることで回避することが可能。以下のようなオプションを渡すことで回避できる。

```
javac -encoding UTF-8 EventMesg.java
```

しかしFitGen.exeの場合、javac呼び出し部分はFitGen.exe内部で行われているので直接javacにオプションを渡すことができない。

そこでFitGen.exeを実行するWindowsのユーザー環境変数にJAVA_TOOL_OPTIONSを追加し、javacに渡したいオプションを指定することでエラーを回避することができる。

https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/envvars002.html
https://qiita.com/n_slender/items/6c566bb345e844ba8127
UE4 BPで誰よりも簡単に湯婆婆を実装してみた

# はじめに
@Nemesis さんのJavaで湯婆婆を実装してみるのUE4/BP版です。
湯婆婆関連の記事にはUnitask、c++、C#、Peri...様々な言語で実装を観てきましたがUE4のBPでの記事を見た事が無かった為書くことにしてみました。
ノードベースの為一番誰でも作りやすいと思います。
今回はUE4.25.3を使用しています。
# 実際に作っていく
## 1.ウィジェットの配置
まずはこんな感じにウィジェットを配置します
![スクリーンショット (660).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549844/e6dad832-714a-9d3c-6e1d-2603875f6890.png)

|使用物|用途|
| ---- | ---- |
|一般/Text|「契約書だよ。そこに名前を書きな。」表示欄|
|インプット/TextBox |署名入力欄|
|一般/Button|署名ボタン|
|一般/Text|湯婆婆からのメッセージ表示欄|
この際、一番下のTextのisVariableのチェックをつけておきます
## 2.BPノードを配置する
まずは入力欄の初期化をします。
また、同時にメッセージ表示欄も空欄にしておきます
![スクリーンショット (663).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549844/2a1466f9-d597-7095-ddac-f3fbc0327753.png)
ここからが本番です
実際に署名から名前を取得し、抜き出しましょう
署名ボタンの中にあるイベントからOnClicked関数を使用します。
![スクリーンショット (667).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549844/2b3590b4-d6e3-9395-7995-61d2a3527e9d.png)
今回は一か所で処理を行った為少し横に長くなってしまいました

※ミスがあったため修正しました。
下の画像が正しいAppendノードになります
![スクリーンショット (672).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549844/2839b98f-d08f-e3e1-948c-7db57b44f691.png)

処理内容としては
1. 署名欄からTextを取得し、String型に変換
2. Length(長さ)を取得し、-1した値と0の間から乱数を取得
3. Stringの中にあるMid関数を使用し1文字を取得
4. Append関数を使用、湯婆婆からのメッセージを作成
5. メッセージ欄のTextに文章を出力
たったこれだけです。簡単ですね

さいごにこのウィジェットを画面に表示します。
この際、マウスカーソルが見えないと話にならないのでShowMouseCurserをtrueにしています
![スクリーンショット (670).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549844/fb33701d-bf8e-107a-aa7e-07af240e6381.png)
# 実行結果
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ミス修正しました... <a href="https://t.co/bPt7Av8Opj">pic.twitter.com/bPt7Av8Opj</a></p>&mdash; 鎖人 (@kusaribito1203) <a href="https://twitter.com/kusaribito1203/status/1328285213890285568?ref_src=twsrc%5Etfw">November 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
# まとめ
ちょっと楽しかった
2020/11/16/19:16 ミス修正
pythonとかをbatファイルから実行してみた

# batファイルでCとかpythonとかを実行する
この頃寒いですね。
## なんでそんな面倒なことを
え？なんで？そりゃぁ、ねぇ、、、夢ってやつ？
あ、多分詳しいやり方とかはご自分でググったほうがわかりやすいかと。
あくまでも自己満なので。
## やってみた
まずbatファイルから。
c言語の実行↓(オプションなどは随時書き換えるしかないです。~~とゆうか誰も使わないか~~)

```vb
@echo off
gcc %1
a
```
pythonの実行↓

```vb
@echo off
python %1
```
今回実行してみたコード(C言語&python)

```c
//test.c
#include <stdio.h>

int main(){
    printf("OK!! this is c");
    return 0;
} 
```

```py
#test.py
print("OK! this is python")
```

# 結果
できた！やったぜ。

```vb
OK!! this is c
```

```vb
OK! this is python
```
OpenstackのコンポーネントがMySQLに接続できない

MySQLをデータベースとしてopenstackを構築したところ、各コンポーネントのログにエラーが。

```
ERROR oslo_db.sqlalchemy.engines [req-e8ea5ffd-f4f9-4c44-855c-c72c4eeee270 - - - - -] Database connection was found disconnected; reconnecting: oslo_db.exception.DBConnectionError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (ConnectionResetError(104, 'Connection reset by peer'))")
```

該当ホストからmysqlコマンドでログインできるため、ネットワーク的な問題はなさそうです。

どうやらコネクションタイムアウトっぽい。

MySQL側のwait timeoutは

```
MariaDB [(none)]> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  |   120 |
+---------------+-------+
1 row in set (0.001 sec)
```
となっていて、特に異常はないように思えた。

ところが、openstackではDBのコネクションを継続使用しているため、mysql側でtimeoutさせてはならないようだ。
そのため、timeoutさせないようにopenstackは300秒毎にポーリングも行ったいた。

### openstackのポーリング秒 > MySQLのwait timeout

となってしまっていたため、最初の `Database connection was found disconnected`が出ていた。

素直に

```
MariaDB [(none)]> set global wait_timeout=600;
```
やって無事解決。
IBMCloud vSRX KVMコンソールアクセス

##目的
vSRXに対してのKVMコンソールアクセス方法を記載する。
ubuntuからvsrxにアクセスする部分がわかりにくいので、記事にしました。
ibmcloudポータル→KVMコンソール→ubuntu(vsrx)→vsrx本体

##KVMコンソールアクセス

**クラシックインフラストラクチャ** -> **ゲートウェイ・アプライアンス**を選択
![IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/cb88d45a-0da3-0256-15db-28eeefec5d2f.png)

**KVMアクセスしたいクラスタ名**を選択
![IBM_Cloud_-_ゲートウェイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/63447b18-86a6-5f2b-1648-bad52ff61b17.png)

**KVMアクセスしたいホスト名**を選択
![IBM_Cloud_-_ゲートウェイの詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/6b5c6128-56c6-0b15-6c5f-00fcc92b0aa9.png)

**リモート管理**を選択し、**管理(IPアドレス)**、**ユーザ-**および**パスワード**を確認する。
![IBM_Cloud_-_デバイス詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e860f92f-50dd-82e9-e3a6-384ab7e3c72a.png)

確認したIPアドレス、ユーザー名およびパスワードを利用し、ブラウザからログインする。
![https___10_193_97_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/5a81b053-3691-0315-36df-fdad278c0d1f.png)

##ubuntu(vsrx)アクセス

**Remote Controll** -> **IKVM/HTML5** -> **I
KVM/HTML5**を選択する。
![https___10_193_97_12_cgi_url_redirect_cgi_url_name_mainmenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/386cd259-3d02-4109-d1a5-3f77041d1847.png)

ログイン画面が表示されるので、webブラウザのコンソールから操作する。
![Resolution_1024x768_FPS__30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/166731c4-9874-f962-76cf-21ad83f99373.png)

ログインするとubuntuの画面にログインする。

```
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-112-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch
New release '20.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Mon Nov 16 03:25:25 2020
```

##vSRXコンソールにアクセス

**virshコマンド**を利用し、vsrx用のコンソールにアクセスするためのポート番号を確認する
これ→<font color=red>service='8615'</font>

```
root@kou-srx02:~# virsh dumpxml 1 | grep -B 2 telnet
    <serial type='tcp'>
      <source mode='bind' host='127.0.0.1' service='8615' tls='no'/>
      <protocol type='telnet'/>
--
    <console type='tcp'>
      <source mode='bind' host='127.0.0.1' service='8615' tls='no'/>
      <protocol type='telnet'/>
```

vsrxへのコンソールポートが8615とわかったので、telnetでアクセスする。
あとはいつも通りに設定可能。

```
root@kou-srx02:~# telnet 127.0.0.1 8615
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.


FreeBSD/amd64 (kou-srx00-vsrx-vSRX-Node0) (ttyu0)

login: root
Password:
Last login: Sat Sep 26 13:15:51 from 106.160.xx.xx

--- JUNOS 18.4R1-S1.3 Kernel 64-bit  JNPR-11.0-20181207.6c2f68b_2_bu
root@kou-srx00-vsrx-vSRX-Node0:~ #
```
Sparse high-degree polynomials for wide-angle lenses のコードコンパイルと実行のメモ

Sparse high-degree polynomials for wide-angle lenses
https://jo.dreggn.org/2016_optics/lenses2016.html

Polynomial optics を広角レンズにもうまく対応したもの.
スライドの最後のコードのリンクがあります.

Linux(Ubuntu) では特に問題なくそのままコンパイルできます(Eigen + gtk3 ライブラリインストール)

あとは `dumpall.sh` ではレポート作成用に pdftk のインストールが必要になります(Ubuntu 18.04 では snap で入る)

`fit` ののち `view` でインタラクティブに確認できます.

<blockquote class="twitter-tweet"><p lang="und" dir="ltr">✌️ <a href="https://t.co/nEt3ogkTe9">pic.twitter.com/nEt3ogkTe9</a></p>&mdash; Syoyo Fujita 🌸 レイトラ 🐯 2 周年 🎉 (@syoyo) <a href="https://twitter.com/syoyo/status/1328266781111111681?ref_src=twsrc%5Etfw">November 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
CLIでElasticBeanstalkのプラットフォームバージョン変更

ElasticBeanstalkのプラットフォームバージョンの変更方法

CLIで利用可能なソリューションスタックを一覧を表示

```terminal
$ aws elasticbeanstalk list-available-solution-stacks

{
    "SolutionStacks": [
        "64bit Amazon Linux 2018.03 v4.17.0 running Node.js",
        "64bit Amazon Linux 2018.03 v2.9.12 running PHP 7.2",
        .
        .
        .
    [
}
```

あとはEBの環境名とスタック名を入力すれば完了！

```terminal
$ aws elasticbeanstalk update-environment \
--environment-name 'Your env name' \
--solution-stack-name 'Stack name'
```

いちいちマネコンにログインしなくていいCLIは便利でいいですねーーーー
AWS Chatbotを使ってヘルスチェックアラートをSlackに送る

## AWS Chatbot
AWS Chatbotを使うことで、これまでSlackへの通知をLambdaで実装する必要があったのですが、簡単にAWSコンソールを触ることで連携が可能となります。
今回はRoute 53のヘルスチェックエラーをChatbotを使ってSlackに通知を送るよう実装しました。

参考：[AWS Chatbot](https://aws.amazon.com/jp/chatbot/)
>AWS Chatbot は、Slack チャンネルや Amazon Chime チャットルームで AWS のリソースを簡単にモニタリングおよび操作できるようにしてくれるインタラクティブエージェントです。

## 手順
1. SNS（Amazon Simple Notification Service）でトピックの作成
2. AWS Chatbotでクライアントの設定
3. AWS ChatbotでSlackチャンネルを設定
4. Route53でヘルスチェックの作成

## SNS（Amazon Simple Notification Service）でトピックの作成
トピックは名前を決めるくらいなのですが、リージョンをバージニア北部（us-east-1）で作成します。
参考：[ヘルスチェックを作成または更新するときに指定する値](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/health-checks-creating-values.html)
他のリージョンはヘルスチェックアラートに設定できないので注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/93e763bb-5c89-0268-e378-556aaa944f7f.png)

## AWS Chatbotでクライアントの設定
クライアントを設定をクリックするとSlackの画面に飛ぶのでログイン後（ログイン済みの場合は不要）連携を許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/85f9979b-f69e-47e6-2af0-130d94542374.png)


## AWS ChatbotでSlackチャンネルを設定
名前を決め、投稿するチャンネルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/ae9cfba7-3f33-377a-d2f6-8911f9c16bd5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/50d0582c-c38c-6df1-6589-0f6a68f7dff9.png)

## Route53でヘルスチェックの作成
ヘルスチェックは通常の作成します。
今回は[httpstat.us](https://httpstat.us/)を利用しました。このサイトは
[httpstat.us/200](https://httpstat.us/200)だとhttpステータス200を
[httpstat.us/503](https://httpstat.us/503)だとhttpステータス503を返すように任意のステータスをスラッシュ以後に書くと帰ってくるので非常に便利で、今回はテスト用に利用させていただきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/3da4d1f8-a866-f16b-ea9b-6c01951d9f84.png)

アラームを作成して、通知先を先程作成したSNSトピックを選択します。上述したとおり、バージニア北部にSNSトピックがないとここに現れないので注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/0ccf9b03-0b6a-d811-82ed-53144d71c1a6.png)

## 設定完了
以上で設定完了です。
ヘルスチェックアラートは以下のようなSlackが飛んできます。
メッセージ内容はうまい具合にやってくれて、画像も添付してくれます。

![スクリーンショット 2020-11-16 18.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/89c6ae46-f620-4894-ac30-45536af90449.png)


## 困ったこと
Chatbotはメッセージを上述のようにデフォルトできれいに送信してくれる一方カスタムができません。
なので緊急度の高いメッセージでも@channelや@someoneなどつけることができません。通知設定はSlack側でコントロールするか、カスタマイズが必要な場合はやはり自前でLambdaを利用する必要がありそうです。
Nuxt.js【@nuxtjs/pwa】キャッシュの設定メモ

Nuxt.jsのpwa用ライブラリ【@nuxtjs/pwa】にて、キャッシュの設定方法です。

## 【@nuxtjs/pwa】キャッシュの設定

```js:nuxt.config.js
  manifest: {
    name: 'demo',
    lang: 'ja',
    short_name: 'demo',
    title: 'demo',
    'og:title': 'demo',
    description: process.env.npm_package_description,
    'og:description': process.env.npm_package_description,
    theme_color: '#212121',
    background_color: '#212121'
  },
  pwa: {
    workbox: {
      /* workbox options */
      clientsClaim: true,
      skipWaiting: true,
      runtimeCaching: [
        {
          urlPattern:
            'https://demo/.*.(png|gif|jpg|jpeg|svg)', // 画像をキャッシュ
          handler: 'StaleWhileRevalidate',
          strategyOptions: {
            cacheName: 'assets'
          },
          strategyPlugins: [
            {
              use: 'Expiration',
              config: {
                maxAgeSeconds: 72 * 60 * 60,
                cacheableResponse: {
                  statuses: [200]
                }
              }
            }
          ]
        },
        {
          urlPattern: 'https://demo/.*', // 特定のURL以下をキャッシュ
          handler: 'StaleWhileRevalidate',
          strategyOptions: {
            cacheName: 'demo'
          },
          strategyPlugins: [
            {
              use: 'Expiration',
              config: {
                maxAgeSeconds: 72 * 60 * 60,
                cacheableResponse: {
                  statuses: [200]
                }
              }
            }
          ]
        }
      ]
    }
  }
```
## 参考

[https://pwa.nuxtjs.org/workbox](https://pwa.nuxtjs.org/workbox)
COBOLで湯婆婆を…

#n番煎じ
乗るしかないこのビッグウェーブに

@Nemesisさんの[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)が面白かったのでCOBOLでやってみました。


```COBOL:YUBABA.COB
000010******************************************************************
000020*  湯婆婆                                                        *
000030******************************************************************
000040 IDENTIFICATION             DIVISION.
000050 PROGRAM-ID.                YUBABA.
000060 AUTHOR.                    MOSAKU ANCH.
000070 DATE-WRITTEN.              2020/11/16.
000080*
000090 ENVIRONMENT                DIVISION.
000100 CONFIGURATION              SECTION.
000110 SOURCE-COMPUTER.           FACOM-V-830.
000120 OBJECT-COMPUTER.           FACOM-V-830.
000130*
000140 INPUT-OUTPUT               SECTION.
000150 FILE-CONTROL.
000160*
000170 DATA         DIVISION.
000180 FILE         SECTION.
000190*
000200 WORKING-STORAGE  SECTION.
000210 01  FULLNAME         PIC X(20) VALUE SPACE.
000220 01  FULLNAME2.
000230   03  FULLNAME3      OCCURS 20.
000240     05  NAME         PIC X(1) VALUE SPACE.
000250 77  NEWNAME          PIC X(1) VALUE SPACE.
000260 77  RANSU            PIC 9(2) VALUE ZERO.
000270 01  JIKAN.
000280   03  HH             PIC 9(2) VALUE ZERO.
000290   03  MM             PIC 9(2) VALUE ZERO.
000300   03  SS             PIC 9(2) VALUE ZERO.
000310   03  TT             PIC 9(2) VALUE ZERO.
000320 77  SYURYOCNT        PIC 9(3) VALUE ZERO.
000330*
000340 PROCEDURE               DIVISION.
000350 HAJIME                 SECTION.
000360     PERFORM KIMEI.
000370*
000380     PERFORM MEIMEI UNTIL  NEWNAME  NOT =   SPACE.
000390*
000400     PERFORM OWARI.
000410     EXIT.
000420*
000430 KIMEI               SECTION.
000440     DISPLAY "契約書だよ。そこに名前を書きな。".
000450     ACCEPT  FULLNAME FROM     CONSOLE.
000480     DISPLAY "フン。" FULLNAME "というのかい。贅沢な名だねぇ。".
000490     MOVE   FULLNAME  TO          FULLNAME2.
000500     EXIT.
000510*    
000520 MEIMEI              SECTION.
000530     ACCEPT  JIKAN    FROM     TIME.
000540     COMPUTE RANSU    = (HH + MM + SS + TT).
000550     PERFORM UNTIL RANSU < 21
000560             COMPUTE RANSU    =  RANSU - 20
000570     END-PERFORM.
000580     IF NAME(RANSU) NOT = SPACE
000590       MOVE    NAME(RANSU) TO NEWNAME
000600     END-IF.
000610     ADD     1           TO SYURYOCNT.
000620     IF SYURYOCNT > 100
000630        MOVE 4081        TO RETURN-CODE
000640        STOP RUN
000650     END-IF.
000660     EXIT.
000670*
000680 OWARI                  SECTION.
000690     DISPLAY "今からお前の名前は" NEWNAME "だ。いいかい、" 
000691          NEWNAME "だよ。分かったら返事をするんだ、" NEWNAME "!!".
000700     STOP RUN.
000710     ENDCOBOL.
000720

```

説明はニーズがなさそうなので割愛。
もちろん全角入力は対応しておりません。

```
契約書だよ。そこに名前を書きな。
MOSAKU ANCHU

フン。MOSAKU ANCHU        というのかい。贅沢な名だねぇ。

今からお前の名前はMだ。いいかい、Mだよ。分かったら返事をするんだ、M!!
```

Mになりました。