OmniAICreator/Qiita-1.07M huggingface dataset:
いまいち慣れない MySQL の仕様3選

# この記事の内容

PostgreSQL から RDBMS を使い始めた私が、MySQL を使うようになって「なんだこれ」とハマってしまった仕様について紹介します。

# 第3位: エンコーディングに utf8 と utf8mb4 がある

カラム（テーブル・データベース）のエンコーディングには、3バイトまでしか格納できない "utf8" と、4バイトを格納できる "utf8mb4" があります。"utf8" では「𠮷」や絵文字などの4バイト文字を扱うことができません。

このように別のエンコーディングになっているのには歴史的経緯があるものと推測しますが、"utf8mb4" というエンコーディングの存在を知らないと「utf8 なのにいったいどういうことなんだ」と戸惑うことになります。

※[MySQL 8.0.1](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html) からは "utf8mb4" がデフォルトのエンコーディングになりました。

# 第2位: 大文字と小文字を区別しない

MySQL のデフォルトの照合順序は utf8_general_ci であり、"ci" つまり case-insensitive（大文字と小文字を区別しない）ということになります。

```
> SELECT foo FROM bar WHERE foo='A';
+-----+
| foo |
+-----+
| a   |
| A   |
+-----+
```

カラムの照合順序を utf8_bin に変更したり、カラムに BINARY 属性を付けたり、SQL に BINARY 演算子を付けてキャストしたりすると区別されるようになります。

※ちなみに、SQLServer もデフォルトが Japanese_CI_AS になっているようです。

# 第1位: VARCHAR(n) の列に n 文字を超える文字列を入れてもエラーにならない

VARCHAR(1) の列に "ZA" を入れようとするとエラーにならず、切り詰められて "Z" が格納されます。

これでは「"ZA" が格納されなかった」ことに気づかないため、「エラーにしてくれれば、意図した文字列が格納されていないことに気づくのに……」となります。

sql_mode で STRICT_TRANS_TABLES または STRICT_ALL_TABLES を有効にすることで、これをエラーになるようにすることができます。

# まとめ

MySQL を使いだして十数年ですが、いまだにうっかり忘れて「おや？」となることがあります。
いろいろな RDBMS を使い分けるのであれば、それぞれの特徴を把握して対応できる脳になるしかないですね。
nuxt.jsを初めて実践で使ってみて知ったこと

# 導入
公式ドキュメントに目を通しただけだと内容がいまいち頭に入らないことってありますよね…。
実際にnuxt.jsを使ってみてこういうことができるんだ！便利！と改めて実感できたことをまとめてみました。

※ソースサンプルは[公式ドキュメント](https://nuxtjs.org/docs/get-started/installation)から転載しているものがあります。

# 便利な点
## コンポーネントのprefix（接頭辞）を設定できる
ファイル名をすっきり保ちつつテンプレート側ではどういうコンポーネントなのか一目で判断できてよかったです。Atomic Designのコンポーネント整理をする場合とても噛み合っていると感じました。

``` nuxt.config.js
export default {
  components: [
    '~/components',
    { path: '~/components/awesome/', prefix: 'awesome' }
  ]
}
```

```
// ディレクトリ

| components/
---| awesome/
------| Button.vue
---| Button.vue
```

```SomeComponent.vue
<template>
  <div>
    <AwesomeButton>Click on me 🤘</AwesomeButton>
    <button>Click on me</button>
  </div>
</template>
```

### 参考
https://go.nuxtjs.dev/config-components

## ファイル名を保ったままビルドすることができる
>assets ディレクトリにはスタイルや画像、フォントなどコンパイルされていないアセットを入れます。

との記載があるので画像もassetsディレクトリに入れるものだと思いこんでいたのですが、
staticディレクトリに入れる方法もあると教えていただきました。
assetsディレクトリに入れたファイルはビルドの過程でパスが書き変わりビルドファイルは人間視点だとわかりづらくなります。サーバのルートに置きたいファイル類（favicon等）のほか、画像類もstaticに入れた方が個人的に良いかなと思いました（感覚的ですみません）

### 参考
https://nuxtjs.org/ja/docs/get-started/directory-structure#static-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA

## 外部ファイルの設定方法
具体的にはGTMの読み込みをしました。
nuxt.config.jsのhead.scriptでパス設定ができます。
公式ドキュメントではjqueryを読み込んでいますが、下記のようにルートパスでstaticディレクトリ下のファイルを設定して読み込めました。gtm.jsの内容は発行されたGTMの`<script>`の中身そのままです。

```nuxt.config.js
export default {
  head: {
    script: [
      {
        src: '/assets/js/gtm.js'
      }
    ]
  }
}
```

```gtm.js
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-SOMEGTMID');

```

※GTMのIDは適当な文字に置き換えてます

また`<noscript>`はプロジェクトルートのapp.htmlに直接記載することで実現できました。

```app.html
// ~~ 省略 ~~
<body {{ BODY_ATTRS }}>
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-SOMEGTMID"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->
    {{ APP }}
// ~~ 省略 ~~
```

### 参考
https://nuxtjs.org/ja/docs/features/configuration#%E5%A4%96%E9%83%A8%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9

https://nuxtjs.org/ja/docs/concepts/views#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88-apphtml

# まとめ
以上です。他にも思いついたら更新します！
リファラ とは

## 勉強前イメージ

聞いたことはあるけど、なにかは答えられないー
なんだっけ・・・

## 調査

### リファラ とは

英語で referer と書き、参照元のページを指します。
accesslogに記載されている情報の一つで、あるページにアクセス際に経由したページの事になります。
リファラを辿ると、どこのサイトから来たのか、どのようなアクセス履歴なのかなどを調べることが出来ます。

単にリファラというと参照元のページを指しますが、
検索エンジンでなんのキーワードで来たのかの キーワードリファラ などがあります。

### ノーリファラ

また、リファラ(参照元のページ)がないことがあります。
そんなことある？って思うかもしれませんが
ブラウザの起動直後に表示したページやブックマークから開いた場合であれば参照元は存在しません。
参照元をサーバに連絡することを拒否する設定もあるブラウザで設定がされた際もアクセスログ上は参照元は存在しない可能性があります。

## 勉強後イメージ

ブラウザの設定で見れないこともあるんだ。。。

## 参考

- [リファラ 【referer】 リファーラ](https://e-words.jp/w/%E3%83%AA%E3%83%95%E3%82%A1%E3%83%A9.html)
- [リファラー（Referrer）](https://www.mitsue.co.jp/case/glossary/l_011.html)
FortigateVM 7.0.5 でIPSec-VPNが繋がらない(peer SA proposal not match local policy)

FortigateVMとFortiClient間でIPSec-VPNが確立できず、以下のログが発生した際の対処です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6f906020-92d8-0616-bebf-d37f503a87f8.png)

```
ログの詳細    IPsec phase 1 error
アクション    negotiate
ステータス    negotiate_error
理由    peer SA proposal not match local policy
```

```
ログの詳細    Progress IPsec phase 1
アクション    negotiate
ステータス    failure
結果    ERROR
```

■バージョン
FortiGate for VMware FortiOS v7.0.5 build0304 (GA)
FortiClient 7.0.5.0238




# 解決策
FortiClient側のVPN詳細設定にて、フェーズ1およびフェーズ2のIKEプロポーザルを `AESxxx`　から `DES` に変更すると、VPN通信が確立できるようになります。

■設定後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2909068d-acd6-1dad-f02e-81a5c4cbdb1d.png)


# 状況確認
IPsecウィザードで作成したVPNトンネルですが、こちらを [カスタムトンネルへコンバート] し、[フェーズ1プロポーザル]の[暗号化]あたりを見てみると、`DES`以外が選択できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/c0770729-4737-d9a1-c48b-cb80c8395177.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/cb7ddf48-1a41-e3b4-9ad3-fcbf3e310f4d.png)

フェーズ2プロポーザルでは`NULL`といった項目すらあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/3bce53d2-b27d-5515-b6a8-25b6537d603d.png)

ただし、公式にはAESもサポートすると書いてはあります。

https://docs.fortinet.com/document/fortigate/7.0.5/administration-guide/238852/encryption-algorithms

おそらくCUIでは設定できるのかもしれませんが、そこまで確認する気が起きませんでしたので今回はここまで。とりあえず `DES` であれば通信できます。

# 参考
https://qiita.com/Higemal/items/b5108fda21c000135948

https://docs.fortinet.com/document/fortigate/7.0.5/administration-guide/238852/encryption-algorithms

https://docs.fortinet.com/document/fortigate/7.0.5/administration-guide/520377/ipsec-vpns

https://www.fortinet.com/content/dam/fortinet/assets/deployment-guides/ja_jp/fg-7-0-ipsecvpn.pdf

https://www.youtube.com/watch?v=7I28wWmW9fE
レインボーテーブル について

## 勉強前イメージ

虹色のテーブル...？

## 調査

### レインボーテーブル とは

ハッシュ値から平文を割り出す効率的な手法の一つ。
ハッシュ値と平文の対照表のこと、またその対照表を使用して平文を割り出すことを指します。

ハッシュ値は平文を不可逆的に変換したもので、ハッシュ値から復号化することは出来ません。
しかし、レインボーテーブルを使えばハッシュ値から平文を出すことが出来ます。
そのため、レインボーテーブルはハッシュ化された情報を不正に取得する際に使用されます。

### レインボーテーブルの関数

レインボーテーブルには以下の2つの関数が使用されています。

- ハッシュ関数

平文をハッシュ化する関数になります。
ハッシュ化する関数はいくつもアルゴリズムが存在しますが、同じアルゴリズムであればハッシュ化した値はいつも同じになります。

- 還元関数

ハッシュ値から平文を割り出す関数です。
そのままではハッシュ値から正しい平文を得ることは出来ないので、一旦なにかの平文と紐づけます。

### レインボーテーブル攻撃の対策

- ソルト処理を行う

ソルト処理は平文に余分な文字列を追加することで、追加する文字列を `ソルト` と呼びます。
これを行うことで解読が困難になります。

- ストレッチングの実施

ストレッチングとは平文に繰り返しハッシュ化を行うことです。
レインボーテーブル攻撃のハッシュ化解読には時間がかかります。
ハッシュ化を何回か繰り返したものを解読するには現実的には困難で、またハッシュ化の回数が増えることでサーバに負担がかかります。

## 勉強後イメージ

なんでレインボーテーブルっていう名前がついたのか気になるけど、
ハッシュ化された文字列から平文を割り出すってことね。
そもそも大量のデータが必要みたいな感じはする。

## 参考

- [レインボーテーブルとは？攻撃の仕組みや対策方法もあわせて解説！](https://it-trend.jp/encryption/article/64-0067)
Turtlebot3 でSlamしながらNavigation2する方法

## はじめに
Navigation2では、Slam_toolboxが標準のSlamのPackageとなっていますが、Turtlebot3のマニュアル内では、Slamのツールとして、Cartographerが利用されており、Navigation2を勉強するにあたっての、混乱の原因になっているのではないかと感じましたので、記事にさせていただきます。

## CartographerとSlamToolBoxの違い

大きくは、Odometoryが必須かどうかが大きく違います。
CatographerはOdometryが任意（もちろんあったほうが性能は良いですが）に対して、
SlamToolBoxはOdometryが必須となりますので、Cartographerから乗り換える際にお気をつけください。
ただ、SlamToolboxを利用すると、SlamしながらNavigation2を利用できますので、できればSlamtoolboxを利用したほうが、良いかと思います。


## Demo
ubuntu20.04
ros2 galactic

1. Navigation2をBuildします。
~~~
mkdir -p ~/turtlebot3_ws/src
cd ~/turtlebot3_ws/src
git clone -b galactic https://github.com/ros-planning/navigation2.git
git clone -b galactic-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
cd ~/turtlebot3_ws
rosdep install --from-paths src -i 
colcon build --symlink-install
~~~

2. DEMOの実行(LAUNCHファイルを4つ起動します。)
~~~
source install/setup.bash
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py 
~~~
~~~
source install/setup.bash
ros2 launch slam_toolbox online_async_launch.py 
~~~
~~~
source install/setup.bash
ros2 launch nav2_bringup navigation_launch.py
~~~
~~~
source install/setup.bash
ros2 launch nav2_bringup rviz_launch.py
~~~

### 動画

![Peek 2022-05-09 00-08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93168/55670403-761d-83e1-e1cb-b1a089162d3b.gif)




navigation2で動きつつ、Mapの作成を行うことが可能です。これで未知の空間に対するNavigationが可能となります。
M1 Macにphpenvでphp 8.0を入れてみた

かなり苦労したのでメモとして残しておく。
```bash
$ brew install autoconf \
bzip2 \
krb5 \
libedit \
libiconv \
libjpeg \
libpng \
libxml2 \
libzip \
oniguruma \
openssl@1.1 \
pkg-config \
tidy-html5

# icu4cの最新バージョン(70)はビルドできないので旧バージョンの68を使う
$ brew tap-new icu4c/taps
$ brew extract icu4c icu4c/taps --version 68
$ brew install icu4c/taps/icu4c@68

# pkg-configの環境変数
$ export PKG_CONFIG_PATH="/opt/homebrew/opt/krb5/lib/pkgconfig:\
/opt/homebrew/opt/icu4c@68/lib/pkgconfig:\
/opt/homebrew/opt/libedit/lib/pkgconfig:\
/opt/homebrew/opt/libjpeg/lib/pkgconfig:\
/opt/homebrew/opt/libpng/lib/pkgconfig:\
/opt/homebrew/opt/libxml2/lib/pkgconfig:\
/opt/homebrew/opt/libzip/lib/pkgconfig:\
/opt/homebrew/opt/oniguruma/lib/pkgconfig:\
/opt/homebrew/opt/openssl@1.1/lib/pkgconfig:\
/opt/homebrew/opt/tidy-html5/lib/pkgconfig" 

# M1はPHP JITを支援しないのでPCREを別バージョンに入れる
$ export PHP_BUILD_CONFIGURE_OPTS="--with-external-pcre=$(brew --prefix pcre2) \
--with-bz2=$(brew --prefix bzip2) \
--with-iconv=$(brew --prefix libiconv) \
--with-tidy=$(brew --prefix tidy-html5)"
$ phpenv install 8.0.12
```
WSL2環境でWindowsからUbuntuのファイルにアクセスする方法

もう誰か書いていると思いますが、
私はこれに助けられたのでポストします。

Windows → Ubuntuへのファイルアクセス
エクスプローラー等で以下のディレクトリにアクセスする
\\wsl$

助けてくれたURL
https://demura.net/education/18275.html
【C】初めてのC言語（4. 構造体）

# はじめに

* これまでの学習に続いて、今回は構造体について学んだ結果をまとめてみました。
  * [【C】初めてのC言語（1. Hello world）](https://qiita.com/nkojima/items/518c1a4ec06861d74b3c)
  * [【C】初めてのC言語（2. 四則演算とフォーマット指定子）](https://qiita.com/nkojima/items/36ea93b7296ce9e8a55b)
  * [【C】初めてのC言語（3. ポインタ）](https://qiita.com/nkojima/items/825bb9f931016faccd68)


# 学習環境

* 今回は[paiza.io](https://paiza.io/ja/projects/new)のC言語のエディタを使いました。

# 構造体とは

* データ型の一つで、1つもしくは複数の値をまとめて格納できる型のこと。（[Wikipediaより](https://ja.wikipedia.org/wiki/%E6%A7%8B%E9%80%A0%E4%BD%93)）
  * JavaやC#のクラスは「データとデータに紐づく処理をまとめたもの」なので、構造体は似て非なるものだと思います。
  * VBAの[ユーザー定義型](http://officetanaka.net/excel/vba/variable/12.htm)は構造体と同義だと思います。

# サンプルコード

## 構造体を使った例

* 普通に構造体を使うと、以下のようになります。
  * 構造体`employee`型の変数を宣言する際に、常に`struct`というキーワードが必要になるのが注意点です。
* `_employee`のように下線（アンダースコア）で始まる名前は予約されているので、このような名前をユーザーが使うのは好ましくありません。（※[参考URL](https://www.jpcert.or.jp/sc-rules/c-dcl37-c.html)）
  * @SaitoAtsushi さん、ご指摘ありがとうございました。

```c:Main.c
#include <stdio.h>
struct employee {   /* タグ名：社員型 */
    int id;         /* 整数型のメンバ変数：社員番号 */
    char* name;     /* 文字列型（char型のポインタ）のメンバ変数：社員名 */
};

int main(void){
    struct employee emp;
    emp.id = 1;
    emp.name = "Sato";
    
    printf("社員番号%dの社員名は%sです。", emp.id, emp.name);
}
```

```text:出力結果
社員番号1の社員名はSatoです。
```

## typedefとは

* `typedef　定義されている型　定義する新しい型名;`という構文で、既に定義されている型に対して、別の新しい名前をつけて定義することができます。

```c:Main.c
typedef int nk_int;  /* int型をnk_int型という名前で再定義する */
```

## typedefを使った例

* 構造体を宣言する箇所が`typedef struct 型名 {...} 新たな型名`という構文になっています。
* typedefを使う事により、`struct`キーワード無しで構造体Employee型の変数を宣言できます。
  * typedefを使った方が、main関数内がスッキリした感じがします。
* なお @SaitoAtsushi さんからのコメントによると、「構造体タグ名は省略してもかまわない」とのことですが、一方で「構造体タグが必要な場合は、型名と一致させるのがおそらく現代の主流だと思われる」とのことでした。
  * @SaitoAtsushi さん、ご指摘ありがとうございました。
  * 今回のコードでは、構造体タグ名と型名を一致させる形で書いています。

```c:Main.c
#include <stdio.h>
typedef struct Employee {   /* employee（社員）はタグ名 */
    int id;                 /* 整数型のメンバ変数（社員番号） */
    char* name;             /* 文字列型のメンバ変数（社員名） */
} Employee;                 /* employee型をEmployee型として再定義する */

int main(void){
    Employee emp;
    emp.id = 1;
    emp.name = "Sato";
    
    printf("社員番号%dの社員名は%sです。", emp.id, emp.name);
}
```

# 参考URL

* [構造体 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%A7%8B%E9%80%A0%E4%BD%93)
* [複数のデータ型をまとめるユーザー定義型](http://officetanaka.net/excel/vba/variable/12.htm)
* [構造体](https://www.cc.kyoto-su.ac.jp/~yamada/programming/struct.html)
* [DCL37-C. 予約済み識別子の宣言や定義をしない](https://www.jpcert.or.jp/sc-rules/c-dcl37-c.html)
【Flutter】Flutter Inspectorで「Setting up DevTools Failed」が表示されたときの対処法

# 環境
android studio Bumblebee 2021.1.1 Patch 3
Flutter 2.10.5
# 対処法
こんな状態のときの対処法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/d9b4cbab-a2bb-8e75-383d-4ca09f1359e8.png)
file →　settings →　Languages&Frameworks →　Flutter　→　「Enable emberdding DevTools in the Flutter Inspector tool window」 のチェックを外してOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/329ad393-0d29-6c85-912a-a1cd56dee843.png)
 File → Invalid Caches → Invalidate and Restart をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/f7253424-e546-c956-081a-19dea7361fb5.png)
Flutter Inspector が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/e2b9a3c3-e721-35b5-c0c4-8d2f31b45d7e.png)
GitHub Copilotのショートカットキー一覧

GitHub Copilotのショートカットをgoogleで検索してもすぐ出てくれないのでQiitaにまとめました。
ご質問・ご指摘はコメントかツイッターまでお気軽にどうぞ！（よかったらフォローしてください）
LGTMや拡散していただけると励みになります。
# GitHub Copilotとは
AI言語モデルの(GPT-3)を用いた技術により、コメントやコードから文脈を読み取り個々の行や関数全体を提案する機能をもっており、まるでペアプログラミングの相手の様にAIがコードを自動生成してくれるサービスです。
# GitHub Copilotのショートカット一覧


|内容|Windows / Mac|
| ---- | ---- |
|インラインコードの提案を受け入れる|Tab|
|インラインコードの提案を却下する|Esc|
|次の提案を表示|Alt + ] / Option (⌥) + ]
|以前の提案を表示|Alt + [ / Option (⌥) + [|
|トリガーの提案|Alt + \ / Option（⌥）+ \
|候補の一覧を表示|Ctrl + Enter|
ネスト、collectionとmemberの違いについて（ルーテイング設定）

ルーテイング設定のネスト、collectionとmemberの違いについて学んでいきましょう。
```
resources :stores do
  resources :products
  member do
    get 'drink'
  end
  collection do
    get 'ice'
  end
end
```
まずはネストから学んでいきましょう。
記載方法としては上の1~2行目です。
このようにresourcesの中にresourcesを記載することで
親子関係を作ることができます。
routingがこのようになります。
```
＃ネストしたルーテイング
/stores/:store_id/products/:id
```
storeの中にproductが入り込んでいるイメージです。


次は一気にmemberとcollectionを見ていきましょう。
一番最初のコードの2行目以外にご注目ください。
このmemberとcollectionを使うと下のようにルーテイングが変化します。
ルーテイングが変わることによって、基本のアクション以外のルーテイングを設定できるのが特徴です
```
＃member設定したルーテイング
/stores/:id/drink
＃collection設定したルーテイング
/stores/ice
```

memberとcollectionの違いは間に
「:id」 
があるかないかです。
この機能の実装はいろいろなところで有効活用することができます。ちなみに、
僕はtwitterアプリのいいね機能やブックマーク機能に既に使いました。


ぜひルーテイングをマスターしていきましょう。
マイコン（AVR）で最強の省電力なsleepが何なのか検証してみた！

現在はマイコンなどの省電力化が進み、
電池などで動かせる製品が多く開発されています。
私も電池で動かす製品の開発依頼は多くあります。

そこで今回はこの世の中に出回っている色んなAVRマイコン用の
スリープ機能の中からどれが一番省電力なのか、
検証した結果を記事にしてみました！！

電池を使用した製品開発をご検討の方！
省電力製品の開発をご検討の方！
ぜひ御覧ください！！

詳細は以下のサイトから
https://note.com/kurogara/n/nc1cb4147f05d
Dynamics項目に数式埋め込んで文字連結させて表示する。URL遷移できるようにする

## はじめに

動的なリンクを項目に持たせたい。（意図：画面項目に外部リンクのURLを持たせたい。）
Dynamics 365でもできる。また Power Platform でも同じことができる

## 完成イメージ
文字を入力すると、リンクURL loテナント情報 = http;//「lo外部システム変数URL元」.co.jp　として
遷移したいURLを設定できる。→つまり文字結合して、URLリンクを用意できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/fffcd8a5-ee5b-1fb3-ef34-b274e8679721.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/fde91194-7651-a1c0-25b5-c9a0b20171ee.png)

遷移できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/10e58e0c-ea9d-75aa-d23b-40f04fcde99e.png)


## どういったときに便利？
* 外部システムURLを設定したいとき。
* 文字結合してデータ表示したいとき。

## やりかた

### 1. テーブルの項目作成時に、計算フィールド設定する。計算フィールドにCONCAT関数で文字列結合。
* [計算列を定義して計算を自動化する](https://docs.microsoft.com/ja-jp/power-apps/maker/data-platform/define-calculated-fields?msclkid=c65a6c14ced711ec93b1675fa63a5ada#functions-syntax)
参考URL。

https://docs.microsoft.com/ja-jp/power-apps/maker/data-platform/define-calculated-fields?msclkid=c65a6c14ced711ec93b1675fa63a5ada#functions-syntax



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/b58fbb1c-3e83-8b6c-654c-7ce5be9cefb7.png)

#### 1.1 Power Apps モデル駆動の項目に、リンクURLのもととなる情報を持たせる。→つまり項目を用意。
#### 1.2 保持した文字列をもとにリンク情報の項目を用意する。→つまりCONCAT 関数の数式をもった項目を用意する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/502a04fb-8e32-b91b-be74-4d87431324c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/e5342d4b-2be7-1120-ae7e-a40773c4a982.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/20117af1-bd32-5999-c8ba-e9c4f42e74ea.png)

設定後、保存ボタンを押すとリンクが作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/fffcd8a5-ee5b-1fb3-ef34-b274e8679721.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/fde91194-7651-a1c0-25b5-c9a0b20171ee.png)

遷移できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/10e58e0c-ea9d-75aa-d23b-40f04fcde99e.png)


## 感想
* 前職で開発していたSalesForceのように、項目に数式を設定でき文字結合できることがわかった。
* 文字結合だけでなく、SUMといった合計なども以下ロールアップ列を使うことでできそう。


https://docs.microsoft.com/ja-jp/power-apps/maker/data-platform/define-rollup-fields

## 参考URL
https://docs.microsoft.com/ja-jp/power-apps/maker/data-platform/define-calculated-fields?msclkid=c65a6c14ced711ec93b1675fa63a5ada


以上
unable to access unity servicesと表示された時の対処法（備忘録）


Build Settingsに
>Unable to access Unity service. Please log in, or request membership to this project to use these services.

という警告文が出た時にやったことの備忘録です。
![スクリーンショット 2022-05-08 23.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890419/eed9ff8b-afc0-043a-add6-0c752f3d593b.png)

:::note info
使用PC： MacBook Pro (13-inch, M1, 2020)
OSバージョン: 11.5.2
Unityバージョン：2020.3.30f
:::

# やったこと

① `Window`⇨`General`⇨`Services`を開く。
![スクリーンショット 2022-05-08 23.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890419/4b822473-3d39-a710-d314-f48bb544efbc.png)

②`Services`の`General settings`を選択。そうするとProject Settingsに移動します。

③`Project Settings`の`Services`を選択。

④`New link`というのを押す。

⑤`Organizations`の選択肢がSelect organizationになっていたので、それを展開して出てきたものを選ぶ。

⑥create

## できた！以上！

# 参考
https://docs.unity3d.com/ja/2019.4/Manual/UnityAnalyticsMismatchedProjectId.html

https://qiita.com/nonkapibara/items/808834465b6d0157cfc6
AWS セキュリティグループに関して

AWSの勉強を始めて、頻繁に出てくるセキュリティグループに関して、毎度これって何の為にあるんだっけという衝動に駆られることがあったので、ここらへんで1回まとめてみたいと思い記事を書いてみてることにしました。
記事の内容としては基本的なことしか記載しておりませんので、初学者向けと思って読んで頂けると幸いです。

## セキュリティグループの役割とは?

セキュリティグループとはAWS側で提供されている仮想ファイアウォール機能のことで、
VPC上の通信(トラフィック)を制御する為に使用されます。代表的なものとして、
EC2インスタンスやRDS設置の際に適用することで、外部からのアクセスを制限したりといったことが行えます。

## セキュリティグループの設定方法

ここではRDS用のセキュリティグループを例にとって、一つ設定してみたいと思います。
前提としてMYSQLを使用し、WEBサーバーからのアクセスのみを許可するといった仕様で進めて行きます。
下記が実際の設定画面になります。
(EC2のダッシュボードから、ネットワーク & セキュリティ欄の1番上のセキュリティグループをクリック)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576652/45e0a13b-3d34-1d2f-4711-14da074a22e1.png)
右上のセキュリティグループを作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576652/3e8d6092-2447-f4ce-f411-d360d92cfb15.png)

セキュリティグループ名・説明
→特別なルール等はありません(ただしVPC内で一意である必要あり)が、このセキュリティグループがどういった用途で使われるのか分かりやすい形で命名してあげると良いかと思います。例えば今回の例のように、RDS用のセキュリティグループを作成したい場合は命名の中でDB等を記載してやるとイメージが付きやすいです。

VPC
→VPCではもしご自身で作成したVPCがあれば、それを紐付けてやることでこのセキュリティグループがどのVPCに所属させるのか決めることができます。
指定がなければデフォルトのセキュリティグループが設定されることになります。

インバウンドルール
→インバウンドルールというのは、外部からインスタンスへの受信トラフィックを制御します。デフォルトでは<font color="Red">すべて拒否</font>になっており、設定によって一部のトラフィックのみ許可することができるようになります。
タイプではこのセキュリティグループがどこからのアクセスを許可するかを選択でき、
今回はMYSQLへの通信を許可したいので、MYSQL/Auroraを選択します。例えば作成したインスタンスに対して、SSHで接続を行えるようにしたい際はSSH等を選択します。
ソースではどのWEBサーバーからの通信を許可するかを選択することになりますが、ここでは個別のIPアドレスを指定するのではなく既に作成されているWEBサーバーのセキュリティグループを選択するようにしてやります。
サーバーを複数台運用した際は個別に指定してあげる必要がありますが、セキュリティグループを選択することで<font color="Red">選択したセキュリティグループを設定しているインスタンスからのアクセスを許可</font>することができるようになるからです。

アウトバウンドルール
→アウトバウンドルールというのは、インスタンスから外部への送信トラフィックを制御します。インバウンドルールとは異なり、<font color="Red">すべてのトラフィックが許可</font>されています。
ここではデータベース側から外部にアクセスすることに対して、特に制限をかける必要はありませんので設定は行いません。

最後に画像では見えていませんが、画面右下の作成ボタンを押してやることでセキュリティグループの作成が完了します。

## 終わりに
AWSの学習を進めていると、頻繁に出てくるこのセキュリティグループに関して整理する良いきっかけになったと思います。本記事では基本的なところにしか触れておらず、用途に応じてタイプなどは変わるものですので、今後も引き続き学習を進めて行きたいと思います。
jQueryでページタイトルを取得してURLにパラメータとして追加する

https://qiita.com/mrd-takahashi/items/86e37d9e0e5213d4d164

記事を書いてる途中で**毎回URLにパラメータを付けるのは面倒**だなと思い始めた。
↑の記事では『商品ID』って書いたけど、『商品名』の方がストレートでわかりやすい。
アルファベットと数字で構成される文字列を取得したら、スプレットシート等でIDと商品名の付き合わせ作業が発生しそう。

**嗚呼、めんどくさい。**

結果、「**ページタイトルを抜き出してURLに付ければいいじゃん**」という結論に達した。

# jQueryでページタイトルを取得する
オワコンと言われようと私はjQuery使うぞ。
CodePenの場合、タイトルが『 - 』で繋がってるので、```split```で分割した。

<p class="codepen" data-height="400" data-default-tab="html,result" data-slug-hash="poagKrR" data-user="mrd-takahashi" style="height: 400px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mrd-takahashi/pen/poagKrR">
  ページタイトルを取得してパラメータとしてURLに追加</a> by Mari Takahashi (<a href="https://codepen.io/mrd-takahashi">@mrd-takahashi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

フォームは記事ごとに作るのが面倒だったので、冒頭の記事で使っているものをそのまま流用。
![パラメータにタイトルが入っている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44795/0403dd25-540c-4f35-9490-1403bd441925.jpeg)
うまくいきました。

# 参考にしたサイト
- [jQueryでURLの後ろのパラメータを変える | Proglad](https://www.proglad.tokyo/2016/02/jqueryurl.html)
- [GoogleフォームにURLパラメータ使って初期値を指定する方法 | なかちょんブログ](https://blog.nakachon.com/2016/12/22/how-to-add-url-parameter-for-google-form/)
CoreMotionを使ってiPhoneから気圧を取得してみた

## 投稿の経緯
業務でiPhone標準搭載の気圧計を使った機能の開発をするかもしれなくなったので、事前に技術検証としてCoreMotionを触ったので記事にします。

## 環境
Mac Monterey 12.3.1
Swift 5.6
Xcode 13.3.1

## サンプルアプリ
![QR_017541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/06a226ce-ade6-ea92-a198-c5e902cbf18b.png)
コードはGitHubにPushしています。気になる方はご覧ください。
https://github.com/ken-sasaki2/CleanArchitectureTraining

## 実装
```ContentView.swift
import SwiftUI

struct ContentView: View {
    private let altimator = Altimator()
    
    var body: some View {
        Button {
            altimator.startUpdate()
        } label: {
            Text("気圧計起動")
                .frame(width: 300, height: 44)
                .background(.blue)
                .foregroundColor(.white)
                .font(.system(size: 20, weight: .semibold, design: .default))
                .cornerRadius(25)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
viewはボタンタップで気圧計を起動させるシンプルなUIです。

```Altimator.swift
import CoreMotion

final class Altimator {
    var altimeter: CMAltimeter?
    
    init() {
        altimeter = CMAltimeter()
    }
    
    func startUpdate() {
        guard let altimeter = altimeter else {
            return
        }
        
        if CMAltimeter.isRelativeAltitudeAvailable() {
            altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main) { data, error in
                if error == nil {
                    let altitude = data?.relativeAltitude.doubleValue
                    guard let pressure = data?.pressure.doubleValue else {
                        return
                    }
                    
                    print("気圧", pressure * 10)
                    print("高度", altitude as Any)

                    self.stopUpdate()
                } else {
                    // エラー対応
                }
            }
        }
    }
    
    func stopUpdate() {
        altimeter?.stopRelativeAltitudeUpdates()
    }
}
```
気圧計を使うにはCoreMotionの**CMAltimeter**を使い、`startRelativeAltitudeUpdates`で連続したデータ取得をおこないます。`stopRelativeAltitudeUpdates`でデータの取得を終了させます。

CMAltimeterで取得できるpressureの単位はkPaなので10倍しておきます。

なお、シミュレーターでは取得できない模様。動作確認は実機でおこなってください。

## おわりに
今回はCoreMotionを使った気圧計機能に関して記事を書きました。これまでiPhoneに気圧計が標準搭載されてるなんて知りませんでした。

ご覧いただきありがとうございました。
こうしたほうがいいや、ここはちょっと違うなど気になる箇所があった場合、ご教示いただけると幸いです。
コールバック処理を実現する（before_action）

コントローラーのアクションを記述する際に、全く同じ文を記述していることはないでしょうか？例えば下の記述のような感じです。
```
＃Drink Controller

def edit
  @drink = Drink.find(params[:id])
end

def destroy
  @drink = Drink.find(params[:id])
  @drink.destroy
  ~~省略~~
end
```

このような感じでeditとdestroyの一行目が同じ処理を記述していますよね。
こう言う時はbefore_actionでまとめてあげましょう。
```

before_action: set_drink, only: [:edit, :destroy]

def edit; end

def destroy
  @drink.destroy
  ~~省略~~
end

def set_drink
  @drink = Drink.find(params[:id])
end
```
このような感じでコードをすっきり書くことができます。
同じ処理は何度もかくより一つにまとめて書く習慣をつけていきます。
Djangoで既存テーブルにForeignKeyを追加する

Djangoで、既存テーブルにForeignKeyを追加する


もともと、Userモデルが存在していて、そこに以下のようにStatusモデルを追加します。

```python:models.py
class User(Model):
    id = UUIDField(primary_key=True)
    name = TextField()
```

```models.py
class Status(Model):
    id = UUIDField(primary_key=True)
    name = TextField(primary_key=True)

class User(Model):
    id = UUIDField(primary_key=True)
    status = ForeignKey(Status)
    name = TextField()
```

makemigrationsを実行すると以下のメッセージが出力されます。

```
You are trying to add a non-nullable field 'status' to user without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
```

外部キー制約をつけたので、nullを許容したくないのですが、既存のカラムになにかデータを入れる必要がありました。
一時的なデフォルト値を設定するかmodels.pyを修正するかの入力を求められました。

今回の対応としては、
1. ForeignKey(Status, null=True)
2. 外部キーデータを投入
3. ForeignKey(Status)に変更

の順番でそれぞれmakemigrationsを実行して、マイグレーションファイルを作成しました。

他に方法はあるのでしょうか。。。
Dynamics 365  ダッシュボードにレコード遷移できるようにURLアイコンを設定する

## はじめに
Power BI のBIツールをつかってダッシュボードを作成し、Dynamics 365で公開する
Dynamics 365 の設定内容やできることを標準ベースで記録しています。

前回の記事の続きです。
* [案件管理やタスクをダッシュボードを使って見やすく管理する Dynamics 365](https://qiita.com/hide6974/items/c982f71751d7094b223b)


## ダッシュボード完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/9d797711-2ef6-5de8-7b76-e31da253e0ad.png)



今回はここのURLアイコンを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/4d10752a-41b8-10cc-4abb-baa72293773d.png)

押下後Dynamics 365　レコードに飛ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d6b696a7-be4b-f7ac-fab7-b450df9d06ef.png)



## どういったときに便利？
* データを見て詳細を確認したいとき。詳細画面へ飛びたいとき。
* データを修正するため修正画面へ飛びたいとき。

## やりかた
### 1 今回はExcelがデータ元であるため、Excel行に該当のレコードのURLを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/6d52b239-988e-afdd-c1be-b6dc94e821f5.png)

### 2 Power BI　作成時に列を追加する。
データ型カテゴリ　WebURL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/739c2437-976d-58fa-4831-9f42df0514f4.png)

## 感想
項目追加するだけで簡単にできた。
今回はテーブル元がExcelであるが、実際はテーブルであるdataverse　テーブルにhttpから始まる項目データがあれば同じことができる。

## 参考URL

https://docs.microsoft.com/ja-jp/power-bi/create-reports/power-bi-hyperlinks-in-tables?msclkid=6e203413ced411ec807dc58183c25c88&tabs=powerbi-desktop

以上
化石エンジニアが3日でFlutterでアプリを作った

# 経緯
アンモナイトは「化石なエンジニア→まっとうなIT人類」を目指して、地道にKaggleに挑戦していたのだが、せっかくのGW、記憶に残ることをしたいじゃない？　ということで、唐突に「GWでFlutterでのアプリ開発、どこまでいけるかな？」をやってみることにした。人生とはその場のノリの連続である。

※ 化石エンジニア・アンモナイトのスペック：
●十年前にプログラマーとして、.Net+SQLサーバーで他社の基幹システムを作る。
以降、WFでPLだのPMだのやりつつ、VBAで社内ツールを作ったりしていた。
アジャイルに目覚めてからはSMが多く、いまは自習でKaggleがらみでPythonをやっている。
ちなみに、スマホアプリを作ったことはない。
Flutterの環境構築経験もない。
アプリPLは1回やった。←アプリ作ったことないのに、なんでアプリPLに抜擢されたのかは本当に不明。

# 1：第一日

とりあえず軽挙妄動して、セールをやってたUdemyでFlutter関連の動画を買いあさる。そしてFlutterの環境作ってみよう的な動画を視聴、突貫で環境を構築。途中、エラーが5つほど出たが、力技とネットの力でエラーをクリア、環境構築が完了する。夜中の2時に。
詳細は前回の投稿参照 → https://qiita.com/ammonite_404/items/5b264a1776ce78d9d625

# 2：第二日

環境を立ち上げ、Udemy動画を参考にアプリ開発を始める。初心者なのであまり深く考えず、エミュレーターではPixel2を選択（どれを選んでもAPI30は変わらなさそうだったから適当に選んでみた←「画面サイズ」の意味）
　・ランディングページ作成
　・ページ遷移＆値の受け渡し
　・2画面目のページ作成
　・ボタン押下時の動的な動き
上記を実装、エミュレーターで動作を確認、apk作成までこぎつける。

# 3：第三日

突貫でFlutter組んだため、独自の仕組みや文法がよくわかっていない。補習としてUdemy動画でFlutterについて学ぶ。
If文やWhile、Try-Catchはいにしえと変わらないので、違和感なく理解する。記述方法が違うだけな印象。
動画の学習の中で、Goto文が出てこないことに安堵する。あの破壊呪文、この世のコード全てからなくなればいいのに、と心の底から思う。

※アンモナイトは過去、ものっすごい壮大なスパゲティコードを前任者（すでにいない）から引き継いだことがあり、Goto文・If文の5回以上のネスト・結果を確認してない＝動かない＝適当なSQL文がトラウマになっている。

# 4：結論

スマホアプリは化石エンジニアでも三日で作れます。
※出来はもちろんショボい（2画面+ボタン程度）。が、動けはまずはOK

UI改善、セキュリティ、DB連携、API等、ストア公開までにこれからやらねばならないことは山盛りですが、やればとりあえず作れるんだな、と一段、階段を上がりました。
まったく知らない言語を使って独学独力で三日でなにかを作るのはなかなか難しいので、Udemyを適切に活かすのはアリだと感じました。
これからアプリ作成を続けていきたいし、Kaggleの挑戦も続けていこうと思います。

以上、長文にお付き合いいただき、ありがとうございました！
Redmine 5.0.0 DMSF 文書管理プラグイン

#### 参考
> インストール方法↓
[Bitnami Redmine に DMSF プラグインを導入する - Qiita](https://qiita.com/tackyto/items/e5e4160ab1e48429e646)
> [最新をZIPでダウンロード](https://github.com/danmunn/redmine_dmsf.git)
> [cacert.pemダウンロード先](http://curl.haxx.se/ca/cacert.pem)
> バックアップ方法↓
[Bitnami Redminのバックアップ & リストア - Qiita](https://qiita.com/lusf/items/dcfe1706a54359ff371f)

* `C:\Bitnami\redmine-5.0.0-0\ruby\lib\ruby\gems\2.6.0\gems\bundler-2.2.27\lib\bundler\ssl_certs`
bundlerフォルダは3つあったが上記のみに格納
ssl_certsフォルダは新規作成した

* `C:\Bitnami\redmine-5.0.0-0\ruby\lib\ruby\2.6.0\rubygems\ssl_certs`

* Gemfileファイルに`xapian`の記載なし

* 以下もなし
(`C:\Bitnami\redmine-5.0.0-0\apps\redmine\htdocs\.bundle\config`)
> .bundle\config の BUNDLE_FROZEN: 1 の行を削除

* `C:\Bitnami\redmine¥use_redmine.bat`を管理者権限で実行
bundle install以降実施
VS Code 拡張機能のローカライズの標準化について


### VS Code April 2022 (version 1.67)

現在、VS Code 本体については、言語パックによって日本語表示できますが、拡張機能については、
拡張機能ごとに独自にローカライズする必要があり、対応するものとしないものに分かれています。

2022年4月にリリースされた VS Code April 2022 (version 1.67) のリリースノートには、
VS Code 拡張機能のローカライズの標準化についての記述があるので、その部分のみの翻訳を下記に掲載しておきます。


### 拡張機能のための新しいローカリゼーション パイプライン

VS Code は、言語パックをインストールすることで有効にできる、多くの [表示言語](https://code.visualstudio.com/docs/getstarted/locales) をサポートしています。 これらは、VS Code 自体と、VS Code に組み込まれる拡張機能をローカライズするのに適しています。 今回のイテレーションでは、チームが所有する組み込みではない拡張機能をローカライズするための標準化作業を開始しました。 この取り組みの結果は、[GitHub Repositories](https://marketplace.visualstudio.com/items?itemName=GitHub.remotehub) と [Azure Repos](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-repos) の 2つの拡張機能で確認できます。 また、その共通の依存関係の拡張機能である [Remote Repositories](https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-repositories) が、この取り組みに参加した最初の拡張機能となります。

次のイテレーションでは、この標準化の取り組みを継続し、より多くの拡張機能を搭載していく予定です。 現在、[Python 拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-python.python) が作業中で、GitHub Repositories と Azure Repos もすぐに追随する予定です。 私たちは、チームが所有するすべての拡張機能がローカライズされ、将来作成される新しい拡張機能が簡単にオンボードできるようになり、英語を母国語としないユーザーが VS Code で素晴らしい経験をできるようになることを目指したいと考えています。


### 追記: May 2022 (version 1.68) 

2022年5月にリリースされた VS Code April 2022 (version 1.68) のリリースノートには、
Python 拡張機能に関して、以下のように記述されています。

> **Enable localization**
> The Python extension now supports translations in all the languages that VS Code supports. We have updated the way we get the translations of our commands, notifications, titles, etc. using [vscode-nls](https://www.npmjs.com/package/vscode-nls). These translations are maintained by a localization team to ensure that they are up to date and correct.

DeepL 翻訳で訳しておくと、以下のようになります。

Python 拡張機能は、VS Code がサポートするすべての言語の翻訳をサポートするようになりました。 [vscode-nls](https://www.npmjs.com/package/vscode-nls) を使って、コマンド、通知、タイトルなどの翻訳を取得する方法を更新しました。
これらの翻訳はローカライゼーションチームによって、最新かつ正しい翻訳が維持されるように管理されています。
Heroku でよく使うコマンド

# はじめに
- 趣味で Heroku を触る中で利用頻度の高いコマンドをメモ
    - 末尾の `--app [アプリ名]` は良しなに
    - 管理画面からできるものは基本省略
    - 随時追加していく予定
- [公式ドキュメント](https://devcenter.heroku.com/ja/articles/heroku-cli-commands)

# 環境変数
```sh
# 一覧確認
$ heroku config

# 設定
$ heroku config:set TEST=test
$ heroku config:unset TEST
```

ちなみに、コマンド実行結果を設定しようとしたけど上手くいかなかった👇

```sh
# tmp/test の中身を設定したいが反映されない
$ heroku config:set TEST=$(cat tmp/test)
$ heroku config:set TEST=`cat tmp/test`

# ダブルクォーテーションや空白を含むので、シングルクォーテーションで囲めば OK
$ heroku config:set TEST='[tmp/test の内容をコピペ]'
```

# アドオン
```sh
# 一覧（インストール済みアドオン）
heroku addons --all

# 設定
heroku addons:create test:test
heroku addons:destroy test:test
```

# postgre
```sh
# インストール
$ heroku addons:create heroku-postgresql:hobby-dev

# 情報確認
$ heroku pg:info

# コンソール接続
$ heroku pg:psql
```

## Heroku Dataclips
いわゆるダッシュボード作成ツール  
管理画面に Dataclips タブを押して、Create Dataclip すると、画面からクエリ実行してその結果を CSV で落とせる  

https://devcenter.heroku.com/ja/articles/dataclips

## バックアップ取得
試してないけれど、[数ステップ](https://devcenter.heroku.com/ja/articles/heroku-postgres-import-export)で出来そう
- Herokuからバックアップをダウンロード
- ローカルデータベースへの復元
- ローカルデータベースからダンプファイルの作成
- Herokuへダンプファイルをインポート

# ログ
```sh
# 確認
heroku logs --tail
```

# 実行
```sh
# ログイン
$ heroku run bash

# Vim 込みでログイン（デフォルトだと入ってなくて結構アレ？ってなるので）
# https://elements.heroku.com/buildpacks/jasonheecs/heroku-vim
$ heroku vim

# rails 関連
$ heroku run rails console
$ heroku run ./bin/rails db:seed
```
【サクラエディタ】コンテキストメニューから定型文を挿入する

# はじめに

サクラエディタのちょっとした効率化を記載します。
定型文の挿入をコンテキストメニューから行うことでメール作成や SQL 生成などがラクになります。

# 定型文の準備

任意の場所に挿入したい定型文を格納する。

```test.txt
テンプレートテキストを挿入する
メッセージ

おわり
```

# 使用するマクロ（コード）

```js:insert.js
var fs = new ActiveXObject("Scripting.FileSystemObject");
var template_file = fs.OpenTextFile("D:\\work\\sakura_test\\test.txt", 1);
var text = template_file.ReadAll();
Editor.InsText(text);
template_file.Close();

```

# 外部マクロの登録

1. 「設定 > 共通設定 > マクロを選択する
2. マクロ一覧にパスが設定されていることを確認する
3. 名前欄に任意の名前、File 欄には作成した js ファイル名(ここでは insert.js)
4. 「設定」ボタンを押下する

![外部マクロの登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/66b85530-0372-bfba-d172-6d82cc7c7b7d.png)

※Ctrl+6 で共通設定は開く。

# カスタムメニューへの登録

1. 「設定 > 共通設定 > カスタムメニューを選択する
2. 種別を「外部マクロ」に設定する
3. 追加したマクロを選択し、「→」を押下する

![カスタムメニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/7e223bbf-1cf1-4d13-2ccc-12915032e74d.png)


# 外部マクロの実行

1. エディタを開き、右クリックでカスタムメニューを実行する
![カスタムメニュー表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/4ffc8b73-d06f-8a09-c15e-0370c8519955.png)
2. 定型文が挿入される
![カスタムメニュー実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/3871d8e3-a984-36b2-32cc-0586203a3a7a.png)


# おわりに

右クリック一つで定型文を挿入できるようになりました。
定型作業が少しラクになるかもしれません。あと生産性向上も。

# 参考

https://qiita.com/inokou/items/fff2917aa0d0963b565b
https://solution-hack.co.jp/archives/368
https://qiita.com/mosh/items/0097e23a5084b07c2518
Linuxってなんだ？ 初学者向けに5点をまとめてみた！

# 1:Linuxの概要
MaxOS, Windowsのなどと同じ**OSの一つ**。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/c95dbd58-261e-b7e0-1606-d2a30dabeafb.png" class="img" alt="OSとは"> <img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/159e620f-a6e6-2167-a3dd-fbde304c7920.png" class="img" alt="OSとは">



パソコンだけでなく, 家電などにも利用されている。
Webサーバに利用されることも…

# 2:Linuxでできること

WindowsやMaxOSのように**パソコン操作**(ファイルやフォルダの操作/インターネット検索)ができる。
他のOSと異なる点は**CUI操作**(マウスを使わずにキーボードだけで操作)が基本であること。

例)フォルダーにあるファイルをコピーする場合
* cp コピー元 コピー先


https://www.sejuku.net/blog/5465


# 3:Linuxのメリット

1. 多くの種類がある
2. 無料で使える
3. スペックが低いパソコンでも使える

## 1.多くの種類がある

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/d20093af-0ba1-a648-f2b9-97b3e154702e.png" class="img" alt="OSとは">



## 2.無料で使える
* Windowsは有料
* MacOSは無料でもPCが必須

WindowsやMacOSが入っているPCでも**Linuxを導入することができる**

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/5e47be39-afdb-4a8e-722f-54d233a7a933.png" class="img" alt="OSとは">

## 3.スペックが低いパソコンでも使える

使いたいプロラグラムだけをインストール、使わないプログラムはインストールしないで利用することになる。

その為、
WindowsPCと比較すると**非常にシンプルな構成**のため低いスペックのノートPCでも動作させることが可能。


# 4:Linuxの代表的なディストリビューション

* Red Hat Enterprise Linux(RHEL)

**有償のLinuxディストリビューション**で最も有名であり, 商用サポートも付いている。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/367075a6-6f04-26da-86c7-860a7c2be06a.png" class="img" alt="OSとは">

* Ubuntu

誰もでも使いやすいOS。
CUI操作だけでなく, **GUI操作**もできる。
macOSやWindowsに似た画面を表示できる。


<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/d8482334-6433-53f2-bab7-48f1e18ad722.png" class="img" alt="OSとは">


* CestOS(RHELの無料版)

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/2be735cd-8ca1-6bbc-6ef7-3b91f6bb01fb.png" class="img" alt="OSとは">


# 5:Linuxの導入方法

* パソコンにインストールする
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/c35a9c05-092a-6224-2a5a-a9f951ff0fd3.png" class="img" alt="OSとは">

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/814824d7-c402-de83-01af-e2b2e51e68e3.png" class="img" alt="OSとは">

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/100f13fc-b54e-aa95-ceb4-44a3cb5b0f0a.png" class="img" alt="OSとは">

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/ac9f7ad3-10b1-624b-b447-971f172286d9.png" class="img" alt="OSとは">



* 仮想環境にインストールする

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/57ae82db-e699-0936-d401-77086eb64a73.png" class="img" alt="OSとは">


【参考文献】

https://www.sejuku.net/blog/82291/?utm_source=youtube&utm_medium=video&utm_campaign=91-TmH12o3s&cid=youtube_blog

https://www.youtube.com/watch?v=91-TmH12o3s
【書籍】AWS IAMのマニアックな話（IAMとは？）

<img width="200" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/26ed7ef9-d0fa-b6c1-7e03-ae5cda06eac8.png">


会社の先輩から勧められて読んでみました。
マニアックとはかかれていますが、IAMの基本の話から思想・設計の話まで幅広くかかれています。
アウトプットとしてこの記事を書きます。

IAM設計は答えがないという点で奥が深くて、難しいです。
そう意味で設計段階での思想がとても重要になります。

IAMに特化した本は他にないので、これから設計とかやると人は持っておくと良い１冊です。
ちなみに著者の佐々木さんは、AWS認定の要点整理系の本も書いてるNRIネットコムの方です。
この記事では全体のざっくりとした紹介と、IAMの基本と気になったポイントを紹介します。

## 全体の概要
**第1章 AWS と IAM**
IAMがどんなものであるか？という概念的な章。

**第2章 IAM の機能★後述します**
ユーザー、グループ、ポリシー、ロールといったIAMといえば的な章。

**第3章 IAM チュートリアル**
２章を深堀して実際に動かしていく章。

**第4章 IAM ポリシーのデザインパターン★後述します**
ポリシーをどう設計するべきかを考える章。
個人的に勉強になった章です。

**第5章 IAM グループのデザインパターン★後述します**
４章のグループ版。どうやってグループを形成するかを考える章。
こっちもまた４と同じく重要。

**第6章 IAM とセキュリティ**
セキュリティという概念を前提にどうIAMを設計していくかを考える章。
１〜５章を踏まえてより設計を想定した内容になっています。

**第7章 IAM の運用★後述します**
６章までを踏まえて、さらにここでは運用を考えます。
運用を考えた設計です。

**第8章 IAMとCloudFormation**
ユーザー、ポリシー、ロールの作成自動化です。

**第9章 IAMのテンプレート集**
運用に合わせたテンプレの作成例が記載されています。

**第10章 IAM以外のAWS サービスの活用**
IAMに絡んでくるOrganizations、CloudTrailm、AWSConfig、Amazon GuardDuty
あたりのサービスがかかれています。

## IAMの機能
２章のアウトプットとして、
ユーザー、グループ、ポリシー、ロールを１スライドにまとめてみました。
![スクリーンショット 2022-05-08 19.27.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/3f6dd924-b44b-db7e-b065-d25594572a45.jpeg)
・ユーザー：AWS内のサービスを操作できる各ユーザー
・グループ：ユーザーを束ねるもの
・ロール：サービス側での操作権限
・ポリシー：上記３つに付与する各権限の大元になる要素

この中で一番わかりにくいのがロールだと思います。
たとえばEC2からRDSにアクセスするときにユーザーを介さないですよね。
そういったとき、EC2に与えてあげる権限がロールになります。
あとはIAMユーザーを当てられないLambdaなどの権限として使われたりもします。

## IAM設計の思想で考えるべきこと
４、５、７章あたりのアウトプットとして勉強になったポイントです。

**・ポリシーのデザインパターン**
IAMのベストプラクティスとして最小権限というものがありますが、
これはホワイトリストで実現しますが、実際には難しくブラックリストとの
兼ね合いでうまく折衷させるという話です。

例えばあるサーバがあったとして、
大量のクライアントのアクセスを許可する場合、
壮大な数のホワイトリストを登録・管理しないといけません。
これからが不透明である場合、尚更です。
これは運用という観点からいうとあまりいい方法ではありません。

**・グループのデザインパターン**
運用として複数グループに登録する方法と、
グループ自体に複数ポリシーを付与する２つのパターンがあります。
基本は１ユーザーに対して１グループがわかりやすくて理想かなと
思いますが、前者のパターンもよくみかけますね。

**・IAMの運用**
ポリシーのデザインパターンと話が似ていますが、
設計で理想を追求しすぎると、かえって運用負荷があがって
最終的にコスト面でマイナスになってしまうというパターンが考えらえます。
これを回避するために設計段階で運用もしっかり考えましょうという話ですね。

あとはユーザーの棚卸し。多くのシステムで不要なユーザーが残り続けると思います。
不要ユーザーの残はなんのメリットもないので、ちゃんと消す必要があります。

最後はクレデンシャルですね。
AWSの事故はこの系統が大半なのでアクセスキーとかは発行せずに済むなら
できるだけその方法で済ませましょう。

## 最後に
最近は試験という観点で勉強ばかりしていたので、
設計や運用目線で書かれているこの本はとても勉強になりました。
まだIAMを設計段階から考えたことはないので、この本で学んだことを
生かしてやってみたいなと思いました。

AWSはもちろん、IAMは進化し続けるので
設計段階であまり考え込まず、とりあえずやってみるのも重要的な
内容もありました。結局なんとかなるとか。

エンジニアは守りに入りがちな傾向にあるので、
AWSのとりあえずやっとけ精神は個人的にとても好きな思想です！
[ERROR]Linux Native AIO interface is not supported on this platform. Please check your OS documentation and install appropriate binary of InnoDB.の対処法

Rails + MySQL + DockerでWebアプリを作っていた所
DBからエラーが吐かれているのを見つけた。

```zsh
[ERROR] [MY-012585] [InnoDB] Linux Native AIO interface is not supported on this platform. Please check your OS documentation and install appropriate binary of InnoDB.
```

今回のエラーでアプリが落ちているわけでは無いが、エラーが毎回吐かれるのは精神衛生的によく無い。

とりあえずGoogle翻訳

> [エラー][MY-012585][InnoDB]LinuxネイティブAIOインターフェースはこのプラットフォームではサポートされていません。 OSのドキュメントを確認し、InnoDBの適切なバイナリをインストールしてください。

どうやら対応していない様です。
docker-compose.ymlへ以下を記載します。

```docker-compose.yml
version: '3'
services:
  db:
    platform: linux/x86_64
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
      TZ: "Asia/Tokyo"
    ports:
      - "3306:3306"
    volumes:
      - ./tmp/db:/var/lib/mysql
    #エラー発生をoff　以下を追加
    command: mysqld --innodb_use_native_aio=0
```

これで再びstartすると消えている。


参考サイト：https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0167
レッツノート CF-SX2 にLinuxを入れて音が出なかった問題の対処法

# 発生した問題
音が出ない。
`alsactl init`を実行すると一時的に音がでるが、再起動すると元に戻る。

# 環境
## ハードウェア
 - Panasonic CF-SX2 (CF-SX2BD6TC)
 - メモリを増設しHDDをSSDに換装しているが、今回の問題とは無関係。

Googleで検索した限り、他の機種でも起きている？
## ソフトウェア
 - Mabox Linux 22.04
 - Linux kernel 5.15.32-1

# 対処方法
ログイン時に、自動的に`alsactl init`を実行させる。 
Mabox Linuxの場合、viかGeanyで`~/.config/openbox/autostart`を開き、
末尾に`(sleep 5s && alsactl init) &`を追記する。
ログイン後にスクリプトが呼ばれたら、バックグラウンドで5秒待機しalsactl initを実行する。

再起動して、ブラウザなり音楽プレーヤーで音が出ることを確認する。
Vision 基礎

### Vision.frameworkとは
Appleが高度な画像解析処理を行うフレームワークのこと。
CoreMLが基礎になっている。Vision以外にも音声認識Speech,何の音か特定するSoundAnalysis、テキストを　処理するNatural Languageを提供している。


### 画像分析の流れ
VNRequest->画像の分析のリクエストを表す。分析したい種類によってそれぞれのサブクラスが用意されている。
VNImageRequestHandler/VNSequenceRequestHandler画像データを渡し、VNRequestを実際に実行する。
VNObservation 分析結果を表すクラス。

```swift
do {
　// リクエスト作成
　　　　　let request = VNDetectFaceRectanglesRequest()
　　　// リクエストハンドラー作成
　　　　　let requestHandelr = VNImageRequestHandler(cgImage: image,options: [:])
　　　　　　// 画像分析実行
　　　　try requestHandelr.perform([request])
　　　　　// 結果を得る
　　　let result = request.results?.first! as! VNFaceObservation
　　} catch {
print(error.localizedDescription)
}
```

#### 分析できるもの
顔の短形(VNDetectFaceRectanglesRequest)
目,鼻,口,あご,顔の特徴を検出(VNDetectFaceLandmarksRequest)
文字検出(VNDetectTextRectanglesRequest)
文字を認識(VNRecognizeTextRequest)
バーコードを検出(VNDetectBarcodesRequest)
長方形の物体を検出(VNDetectRectanglesRequest)
ビデオフレーム画像から物体を追跡(VNTrackObjectRequest)



#### VNRequest
 画像分析のリクエストを行う。引数なしでイニシャライザをするか、VNRequestとError?を引数にもつクロージャーを入れる。
```swift
init(completionHandler: VNRequestCompletionHandler? = nil)
```

```VNImageRequestHandler,VNSequenceRequestHandler```

VNImageRequestHandler->同じ画像データにリクエストを複数実行
一つの画像に対してリクエストを実行するから効率的に分析できる。
VNSequenceRequestHandler→連続画像フレームにリクエストを実行
カメラからの連続フレーム画像に対してリクエストを実行するためのクラス。ビデオフレーム画像からトラッキングを行う場合に利用する。

また、これらのリクエストハンドラーで画像の向きを指定する（上向き）が正しく設定されているかどうか。

```VNObservation```
分析結果を表す。プロパティのconfidenceの精度を読み取れる。

```swift
var confidence: VNConfidence
```
このVNObservationを親クラスとしてサブクラスが何を分析したかにより分かれる。
three.jsで頂点カラーを設定する

# three.jsで頂点カラーを設定する

方法を忘れそうなのでメモ書きとして。

## 前提

- threejsバージョン: r139
- GPU: NVIDIA GeForce

※three.jsはよく仕様変更されるので後々通用しなくなる可能性あり

## 本文

とりあえずサンプルコード、頂点カラーを設定したシンプルな平面Meshを生成します。
コード全体はこちら：**[実行サンプルコード](https://codesandbox.io/s/threejs-sample-setting-vertex-color-tguy0j?file=/src/index.ts)**

```tsx
// ヘルパー
function getVertexNum(geometry: BufferGeometry) {
  const posAttr = geometry.getAttribute("position");
  return posAttr.array.length / posAttr.itemSize;
}

// コンフィグ変数
const useAlphaChannel: boolean = false;
const colorList = [
  new Color(0x990000),
  new Color(0x009900),
  new Color(0x000099),
  new Color(0xffffff)
];

// Geometry: attribute "color"を設定
const geometry = new PlaneGeometry(SCREEN_WIDTH * 0.8, SCREEN_HEIGHT * 0.8);
{
  const colorItemSize = useAlphaChannel ? 4 : 3;
  const vertexColorData = [];
  let colorListIndex = 0;
  for (
    let i = 0, len = getVertexNum(geometry) * colorItemSize;
    i < len;
    i += colorItemSize
  ) {
    const color = colorList[colorListIndex];
    vertexColorData[i] = color.r;
    vertexColorData[i + 1] = color.g;
    vertexColorData[i + 2] = color.b;
    if (useAlphaChannel) vertexColorData[i + 3] = i / len;

    // colorListループ
    if (colorList.length <= ++colorListIndex) colorListIndex = 0;
  }
  geometry.setAttribute(
    "color",
    new Float32BufferAttribute(vertexColorData, colorItemSize)
  );
}

// Material: vertexColorsオプションをtrue
const material = new MeshBasicMaterial({
  vertexColors: true,
  transparent: useAlphaChannel
});

// Create Mesh
const mesh = new Mesh(geometry, material);
mesh.position.set(SCREEN_WIDTH * 0.5, SCREEN_HEIGHT * 0.5, 0);
scene.add(mesh);
```

↓ 実行結果 ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81823/9f68e788-543e-7ffd-0ff1-961a986ddcd6.png)

コードが若干長くなって読みづらいですが、大事なポイントとしては

- Geometry側：geometry.setAttributeで”color”をセットする
- Material側：material.vertexColorsオプションをtrueにする

ということだけです。

色値はR・G・B値を各頂点ごとに設定する形ですが、一般的な`0 ~ 255`ではなく、`0 ~ 1.0`で設定することに注意です（値がオーバーしても動作上は問題ないですが）。
上記コードのようにTHREE.Colorクラスを使うと楽です。

### アルファ値（透明度）の設定

またアルファ値の設定も可能です。これはsetAttributeの際にitemSizeを4にすることで自動的にthree.js側がよろしく設定してくれます。（もちろん実データ側の更新を忘れずに）

- ただしmaterial側の`transparent`パラメータをtrueにしないと反映されないことに注意。
- ちなみに以前は`vertexAlphas`というオプションがあったようで、検索ではこちらを使った方法が出てきますが、現版には存在しないので注意（内部パラメータとしては存在）

サンプルコードでは`useAlphaChannel`変数フラグの切り替えで反映させてます（値はテキトーです）

### おまけ：ShaderMaterialでのcolor変数の扱い

ShaderMaterialで独自のvertexシェーダーを定義するとき、vertexColorsをtrueにしているときは宣言なくcolor変数が使えます。

```glsl
varying vec3 vColor;

void main() {
  vColor = color;  // <- ここ
	gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4( position, 1.0 );
}
```

これは[組み込みのattribute](https://threejs.org/docs/#api/en/renderers/webgl/WebGLProgram)としてthree.jsプログラムオブジェクトが自動的に宣言を付与してくれているためです。（上記コードでいう`projectionMatrix`などと同様）

なおデフォルト設定では`vertexColors`はfalseのため、宣言が省かれます。その場合コンパイルエラーになることに注意。
フロントエンド開発の言語

# フロントエンド開発
- ユーザーの見える部分を開発
    - Webサイトの画面や文字、ボタンなど

:::note info
バックエンド開発
ユーザーには見えない部分（サーバーの運用や処理、DBの保存など）
言語はPHPなど
:::

# フロントエンド開発の言語

| HTML | CSS | JavaScript |
|:-----------:|:------------:|:------------:|
| .html       | .css        | .js         |
| 内容だけ | 装飾する | 動きを付ける |
| 大元 | 埋込/外部 | 埋込/外部 |

## HTML（ハイパーテキストマークアップランゲージ）
- ファイルの拡張子は「.html」
- Webサイトの文章や画像の指定
    - スタイルを指定していくだけ！
- W3Cで定義

## CSS（カスケーディングスタイルシート）
- ファイルの拡張子は「.css」
- Webサイトのデザインの指定
    - Webサイト全般のデザイン
- HTML内に書けるが、外部ファイルに置くのが一般的
- W3Cで定義

## JavaScript
- ファイルの拡張子「.js」
- Webサイトの動的な部分、時間による処理、ユーザのクリックなどへの反応
- HTMLだとホバー、クリック程度。より細かいのはこちら

:::note warn
IE/safariなどで動かない命令もある！
IEはOSによって上限があったりと、古いVerも確認できるとよい。
（Can I use…ブラウザやバージョンでHTMLやcssの有効性確認ができる！）
:::