OmniAICreator/Qiita-1.07M huggingface dataset:
.Net CoreのコントロールアプリをLinuxで動作させる際に参考にした情報

## はじめに

dotNet Coreで作成したコントロールアプリをLinuxでも動くようにしたく、いろいろと参考にした記事のメモです。

### WindowsからLinux環境で動作確認する

今回、Linuxでの動作を確認するためにDockerを利用しました。

https://qiita.com/KoKeCross/items/a6365af2594a102a817b

### アプリを自己完結型で発行する

Linuxで動作以前にdotNetの環境がない状態でアプリを実行しようとしても動作しないため、自己完結型で発行する必要がありました。

https://qiita.com/yusuke-sasaki/items/80bb84c4b3534d1481fc

### 実行時にICUパッケージが見つからないとエラーが出る

```
Process terminated. Couldn't find a valid ICU package installed on the system. Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support.
```

自己完結型で発行し、いざ実行してみると上記のようなエラーが出る。
調べてみるとICUパッケージがLinux環境にインストールされていない場合に出るエラーだそうで、ICUパッケージをLinux環境にインストールするか、国際化対応を行わない`Invariant`モードにすることで解決できるとありました。

下記を参考にしてICUパッケージをLinux環境にインストールすることでも実行できるようになりましたが、環境を作るたびにやりたくないし、自分以外に渡すときも面倒になるので
https://github.com/dotnet/core/blob/main/Documentation/build-and-install-rhel6-prerequisites.md#icu

今回は`Invariant`モードにする設定を行い、Linux環境で動作できるようにしました。

#### Invariantモードの設定

>グローバリゼーション不変モード（.NET Core 2.0の新機能）を使用すると、グローバリゼーションデータおよびグローバリゼーション動作に対するアプリケーションの依存関係を削除できます。このモードはオプトイン機能であり、グローバリゼーション機能やグローバリゼーションの正確さよりも、依存関係と分散のサイズを減らすことに関心がある場合に、より柔軟性を提供します。（参考記事をGoogle翻訳しました）

https://github.com/dotnet/runtime/blob/main/docs/design/features/globalization-invariant-mode.md#app-behavior-with-and-without-the-invariant-config-switch

ちょっと意味がわかりにくいですが、アプリに対する国際化対応のサポートを行わない設定とし、そもそもICUパッケージを使用しないようにすることで、ライブラリが見つかりませんというエラーを回避するものだと思います。インバリアントにすることの影響などは上記記事を参照ください。

実際に設定する際はプロジェクトファイル（.csproj）に以下を追加します。

```
  <ItemGroup>
    <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
  </ItemGroup> 
```

以下の[3.グローバリゼーション インバリアント モードを使用するかどうかを決定します。]を参考にしています。

https://docs.microsoft.com/ja-jp/dotnet/core/deploying/deploy-with-vs?tabs=vs156#self-contained-deployment-without-third-party-dependencies

インバリアントについては下記記事がわかりやすかったです。

https://smdn.jp/programming/netfx/locale/cultureaware_and_cultureinvariant

## 補足

### ICU（International Components for Unicode）とは

http://site.icu-project.org/home  
> ICUは、ソフトウェアアプリケーションのUnicodeおよびグローバリゼーションサポートを提供する、成熟した、広く使用されているC / C ++およびJavaライブラリのセットです。ICUは広く移植可能であり、すべてのプラットフォームで、C / C ++とJavaソフトウェア間で同じ結果をアプリケーションに提供します。

調べた限りでは、国際化対応をサポートするライブラリというもので、日付/時刻など国ごとに違う書式（日本なら2021年3月11日、英語なら11 March,2011など）や文字列のどこで改行していいのか、アルファベットの大文字/小文字の対応付けみたいな言語に依存する情報なんかが入ってるライブラリでICUのほかにもWindowsであればNLS（National Language Support）が使われているそうです。
Github Actions内でprivate repoのassetを取得したいとき、これ使っておけば大丈夫だった

Github ActionsでCIしたいけど、private repoにあるバイナリをfetchする必要がある。
そのためには、githubのAPIをcurlで叩いてasset idを調べて... みたいなことをしていませんか？

↓ こういうやつ
* https://stackoverflow.com/a/35280061
 
```bash
$ curl -H "Authorization: token YOURGITHUBTOKEN" \
    https://api.github.com/repos/NAME/REPO/releases/latest 
# => "url": "https://api.github.com/repos/NAME/REPO/releases/assets/1275759" # asset idが見つかった！
```

その場合は、
* https://github.com/marketplace/actions/fetch-github-release-asset 

これ使っておけば全く同じことをしてくれるので便利でした。

しかもasset idとか調べなくてよく、ファイル名記載で大丈夫です。

```
uses: dsaltares/fetch-gh-release-asset@master
with:
  repo: "dsaltares/godot-wild-jam-18" # どのrepoから
  version: "latest" # どのrelease versionの
  file: "plague-linux.zip" # どのファイルを取ってくるか
  target: "subdir/plague-linux.zip" # そのファイルをCIコンテナのどこに置くか(repoからの相対パス)
  token: ${{ secrets.YOUR_TOKEN }} # private repoの場合はアクセス権限がいるのでPersonal Accesss Tokenを指定する
```

内部のshellで代わりのことをやってくれています。

fetch先がprivate repoの場合は`token` にGithubのPersonal Access Tokenを設定すれば使えます。
pandasメモ（DataFrameの操作）

## サンプルデータ

```python
import pandas as pd
from sklearn.datasets import load_iris

# データ取得（あやめの花のデータセット）
iris = load_iris()
data = iris.data
columns = iris.feature_names

# pd.DataFrame
df = pd.DataFrame(data=data, columns=columns)
```
## データの確認
```python
df.head() # 先頭を5件を表示

df.shape # 行数、列数を表示
```

# カラム名の変更
```python
# カラム名をリストで定義
columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
df.columns = columns
```

## 特定の要素を抽出
### iloc （要素番号を指定）
```python
# 11行〜20行目までを取得
df.iloc[10: 20] # df.iloc[10: 20, : ]と同じ
# 11行〜20行目、2〜3列目までを取得
df.iloc[10: 20, 1: 3]
# 1〜3列目までを取得
df.iloc[: , : 3]
```

### loc（columns, indexを指定）
```python
# 11行〜20行目までを取得
df.loc[11: 20]
# 11行〜20行目、2〜3列目までを取得
df.loc[11: 20, 'sepal_width': 'petal_length']
# 1〜3列目までを取得
df.loc[: , : 'petal_length']
```
### 特定の列を抽出
```python
df['sepal_length'] # 戻り値の型は、pandas.core.series.Series
```

### 要素の条件で抽出
**sepal_length >= 5.0**

```python
df[df['sepal_length'] >= 5.0]

df.query('sepal_length >= 5.0')
```

**sepal_length >= 5.0 かつ sepal_width >= 3.0**

```python
df[(df['sepal_length'] >= 5.0) & (df['sepal_width'] >= 3.0)]

df.query('sepal_length >= 5.0 & sepal_width >=3.0')
```

## ソート
### データ（要素）でソート
```python
# sepal_lengthでソート（ascending=Trueは昇順）
df.sort_values(by='sepal_length', ascending=True)
```

### インデックスでソート
```python
# ascendingは昇順／降順
# indexでソート
df.sort_index(ascending=False)
# columnsでソート
df.sort_index(axis=1, ascending=True)
```
PHP メールの送り方（基本）

#基本のメールの送り方

```php

<?php


ini_set('mbstring.language','Japanese');//日本語関連の処理を行うための設定
$name = '鈴木タラオ';
$to = mb_encode_mimeheader($name) . "<hogehoge@fugo.co.jp>";//宛先に日本語を含む場合mb_encode_mimeheder()でMIMEエンコードする
$subject = 'ご挨拶';
$body = "こんにちは、$name さん";
mb_send_mail($to, $subject, $body);//宛先、件名、本文を設定。

//上記で宛先メールアドレス宛にメールを送れる。

```
スクリーンショットをとってSNSでシェアする方法

画面の任意の部分をスクリーンショットして、アクティビティビューからSNSでシェアする方法です。アルバムにも画像を保存できます。


```swift
import UIKit

class ViewController: UIViewController {

    //インスタンス作成
    private var snapshot = Snapshot()

    @IBAction func didTapTakButton(_ sender: Any) {

        let width = UIScreen.main.bounds.size.width
        let height = UIScreen.main.bounds.size.height

        //snapshotする画面のサイズを規定
        let size = CGSize(width: width, height: height * 12 / 24)

        //snapshotした画像を載せたアクティビティビューを作成
        let activityVC = snapshot.share(size: size, view: view)

        //アクティビティビューを表示
        present(activityVC, animated: true, completion: nil)
    }

}

class Snapshot {

    private var snapshotImage = UIImage()

    func take(size: CGSize, view: UIView) {

        //bitmapの描画環境を構築し、描画開始
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)

        //渡されたviewの切り出し
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)

        //切り出した部分をUIImageとして保存
        snapshotImage = UIGraphicsGetImageFromCurrentImageContext()!

        //描画終了
        UIGraphicsEndImageContext()
    }

    func share(size: CGSize,  view: UIView) -> UIActivityViewController {

        //描画してUIImageを切り出し
        take(size: size, view: view)


        //アクティビティビューに渡すために[Any]型に変換
        let items = [snapshotImage] as [Any]

        //アクティビティビューに載せる
        let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)

        //アクティビティビューを返す
        return activityVC
    }
}
```
WSL2でデフォルトのディストリビューションを変更する

# はじめに

WSL2 ではデフォルトディストリビューションが設定されており、bash や wsl を実行すると、そのディストリビューションが実行される。デフォルト設定を変更したかったため、調査してみた。[WSL 既定ディストリビューションの変更方法](https://kb.seeck.jp/archives/16946)を参考にした。

# ディストリビューションの確認・変更

以下コマンドで、インストール済みのディストリビューションを確認できる。

```
$ wsl -l (または wsl --list)
# Linux 用 Windows サブシステム ディストリビューション：
# Ubuntu-20.04
# Ubuntu-18.04 (既定)
```

デフォルトディストリビューションは Ubuntu-18.04 になっている。これを Ubuntu-20.04 に変更する場合は以下コマンド。

```
$ wsl -s Ubuntu-20.04 (または wsl --set-default Ubuntu-20.04)
$ wsl -l
# Linux 用 Windows サブシステム ディストリビューション：
# Ubuntu-20.04 (既定)
# Ubuntu-18.04
```

# 指定ディストリビューションでの起動

ディストリビューションを指定して起動したい場合は以下コマンド。

```
$ wsl -d Ubuntu-18.04 (または wsl --distribution Ubuntu-18.04 )
```
iOSシミュレータで出るエラー

# 概要
iOSシミュレータを使うとよく起こるエラーをメモする

# エラーと解決方法

## safari cannot open the page because the address is invalid
このエラー自体はいろんな原因で出るが、シミュレータ上で開発中のアプリからAppStoreを開こうとして出たエラー。
AppStoreが入っている実機で試すとエラーは起こらなかった。

※AppStoreが入っているシミュレータで開けばいいのかは未検証
Mongodbのauthorization: enabledを設定するときの注意

この記事はMongodbにユーザー認証を設定するときに3日間くらい悩み通したあとに些細なミスに気がついたという、今後そんなことがないための忘れないようのものです。
###些細なミス

```
#security:
↓
security:
◯◯authorization: enabled
```
authorization: enabledの手前をタブ一回押しではなくスペース二個分にしなくてはいけないということ。(pythonに慣れてる人はすごくミスりそう)
それから海外のサイトで見たのですが、

```
security:
  authorization: "enabled"
```
とダブルクォーテーションで囲むのはなしらしいです。
**そんだけです！**
秋月の脈拍センサー,AE-NJL5501Rで脈拍を見る NJL5501R


秋月で約350円で売っている脈拍センサーで脈拍をPCオシロスコープで
観察する。

回路は、秋月のサンプルを少し改造して使用した。
2k,20kがなかったので2.2k,22kにした。
仮想GNDを追加した。

思ったより増幅率が低すぎる。
DCをカットしてもう一段、非反転増幅を入れないだめかも
約2倍から約5倍。 増幅率を上げるよりノイズを減らす方が
効果的、センサー側の電源に0.1ufを2個、仮想グランドの
入力側に47ufを入れた。電源系のノイズが少なくなった。(3/12)
ノイズの軽減の為にセンサー部を電池化する、化学電池もノイズを
発生しているが、定電圧レギュレータとどちらがノイズが多いか検討、そのまま6V(3/12)
そもそも論として、安価に脈拍数を取るには、オペアンプを飽和させればいいが
波形自体も見て楽しみたいが、物量は、賭けたくない。目標として、イラストと
して書かれたくらい、波形が綺麗に出ると楽しい。(3/12)
低周波の発振の原因は、ヒックアップの75uFのコンデンサーだった、
スペシャルな1uFのコンデンサーにしたら低周波の発振が収まった。(3/13)
主なノイズの原因は、センサーと赤色LEDだった。LEDは、電池にしたら収まった、
センサーは、外部光のカットと小指の固定具を制作中。(3/13)
小指を光源で照らしていろいろして目で見たらどくどく明るさが変わるのが
見えたのでセンサーで追い込めば拾えるはず。一体型の赤色LEDの光源は、暗い
気がする。ピックアップ自体は、消耗品の使い捨てのもあるのでもう少し無理が
出来る気がする。(3/13)
改造② は、あまりにもセンサーのノイズがひどかったので3個電池を使用してノイズ対策を
した。今後の予定、あまりにも電池が無駄なのでノイズ少ない定電圧レギュレータを使い
9ボルトから5Vを作って3か所に配る。多分、光源にノイズが乗るとセンサー、アンプと増幅されていくのでノイズの少ない光源のドライブ方法を検討。シャントICをうまく使うと4桁ぐらいの電圧精度がてたような、なんか変な電池だと8桁ぐらいの精度がでたような検討。(3/13)
1個スペシャルな物が出来ても工業的には、意味がないので統計的に意味のある約20個くらい
作る。アンプだけで約2800円、センサーだけで約7000円(3/15)

約33倍x約10倍になっている。
ローバスフィルターは、約48.23hと約7.958hが掛っている。

秋月のセンサー
ＮＪＬ５５０１Ｒ搭載　パルスオキシメータ用・反射型センサ　ＤＩＰ化モジュールキット
[AE-NJL5501R]
通販コード　K-09433
発売日　2015/07/01
メーカーカテゴリ　株式会社秋月電子通商

使用した部品
パルスオキシメータ K-09433
２回路入入出力フルスイングオペアンプ　ＮＪＵ７０４３Ｄ　x2 I-06840
47uf P-06040
0.1uf P-13372
1uf P-13699
3.3k,1k,33k,2k,20k,22,750 千石

今後の方針、とりま、STM32F767(Mbed)に繋いでみるか?

改造② 赤色LED,センサー,アンプの3個の独立電池電源　と　1段アンプと2段アンプの2kを470に変えた
![pm_an_dd_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1154d365-6d09-7119-2a40-ec159c2ca32d.jpeg)

センサーを固定する治具(3/14)
![pm_an_dd_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/edf307a1-79ad-7780-7977-f722293de414.jpeg)

オペアンプ用の中間電源回路
![pm_an_dd_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/62c827ee-e0aa-4f17-64d8-8bfd19dd980b.jpeg)


![pm_an_ff_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f8258f1b-ab23-b99f-c982-9e4e07995b3a.jpeg)

![pm_an_ff_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a3169e1c-1ac4-89ad-1141-c2d4eb083d8a.jpeg)

![pm_an_ff_3_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7c0dd205-6c98-681e-2903-b7b25a16d8dd.jpeg)


![pm_an_ff_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/72f1edf7-6b06-cb6b-3c24-bec71d7787e7.jpeg)
strtolower() とmb_strtolower()の違い

#大文字のアルファベットなどを小文字に出来るかどうか

例）

```php

<?php 


$str = "Mary Had A Little Lamb and She LOVED It So";
$str2 = 'ＭＮＬ';

echo strtolower($str).PHP_EOL;// mary had a little lamb and she loved it so
echo mb_strtolower($str).PHP_EOL;// mary had a little lamb and she loved it so

echo strtolower($str2).PHP_EOL;// ＭＮＬ
echo mb_strtolower($str2).PHP_EOL; //ｍｎｌ

```

strtoupper()とmb_strtoupperも考え方は同じ
.Net Coreのコントロールアプリを自己完結型で発行する際に参考にした情報

## はじめに

dotNet Coreで作成したコントロールアプリを他のPCでも動くようにしたく、自己完結型でどうやって発行するのか参考にした記事のメモです。

### 自己完結型で発行とは

dotNetを使用して作成したアプリはフレームワーク依存と自己完結型の2つのモードで発行することができます。

- フレームワーク依存の発行
利用者側にdotNetの環境がインストールされていることを前提に実行ファイルだけの小規模な形でアプリを発行する。
デメリットとして、利用者側にdotNetの環境がインストールされていない場合にアプリが動作しない。

- 自己完結型の発行
利用者側にdotNetの環境がインストールされていなくても実行できる形でアプリを発行する。
デメリットとして、追加されるdotNet環境の情報が非常に大きい。
（一例として、今回自分が作成したアプリの実行ファイル一式は3MBほどでしたが、自己完結型にすると70MB近くになりました。）

参考記事：

https://docs.microsoft.com/ja-jp/dotnet/core/deploying/

### VisualStudioで発行する

プロジェクトの右クリックから「発行」を選んで設定をポチポチしていけばできます。
参考記事：

https://7iro.net/csharp-dotnetcore-linux/

### コマンドラインから発行する

dotnetコマンドを利用して発行することができます。

```bat
dotnet publish -r win-x64
```
コマンドラインからの発行ですが、今回はwindows用とlinux用の2つ用意したく、さらにGitHubにアップロードしたかったためzip圧縮までしてくれるバッチファイルも作りました。
リポジトリのトップに格納する想定です。（１、２、３のところは書き換えてください。）

```bat
@echo off
rem 自己完結型でwin-x86とlinux-x64向けに発行し、GitHubにアップロードするためにzip圧縮するバッチファイル
dotnet publish （１） -o （２） -c Release --self-contained=true -r linux-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true
powershell Compress-Archive -Path （２） -DestinationPath （２）.zip -Force
dotnet publish （１） -o （３） -c Release --self-contained=true -r win-x86 -p:PublishSingleFile=true -p:PublishTrimmed=true
powershell Compress-Archive -Path （３） -DestinationPath （３）.zip -Force
@echo --- Finished ---
pause > nul
```

（１）：Project/Solutionを指定しています。
　　　　例えば`src/Application.csproj`や`src/Application.sln`です。
（２）：linux-x64形式での出力パスを指定しています。
　　　　例えば`src/Application/bin/Release/linux-x64-publih`です。
　　　　指定しなくてもRelease以下のところに`linux-x64/publish`で出力してくれますが、
　　　　複数発行する際には名前を区別できるようしたほうが良いと思います。
（３）：win-x86形式での出力パスを指定しています。（２）と大体同じです。

今回使用したdotnetのpublishコマンドについてのメモ
詳細：https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish

- `dotnet publish [<PROJECT>|<SOLUTION>]`
プロジェクトまたはソリューションを指定して発行します。
指定しないと現在の作業ディレクトリが設定される

- `-o <OUTPUT_DIRECTORY>`
出力ディレクトリのパスを指定します。
自己完結型の実行可能ファイルの場合、既定値は [project_file_folder]/bin/[configuration]/[framework]/[runtime]/publish/ に設定されます。

- `-c <CONFIGURATION>`
ビルド構成を定義します。 既定値は Debug です。

- `--self-contained=true`
trueで自己完結型、falseでフレームワーク依存になります。
true (自己完結型) の場合は`-r`オプションが必須になります。

- `-r <RUNTIME_IDENTIFIER>`
指定されたランタイムのアプリケーションを発行します。
上記の例だと`win-x86`と`linux-x64`を指定しました。
詳しくは公式を参照ください：https://docs.microsoft.com/ja-jp/dotnet/core/rid-catalog

- `-p:PublishSingleFile=true`
ファイル一式をまとめたかたちに出力されます。（もろもろのDLLが1つのApplication.exeだけになる）
若干ですが、ファイルサイズも小さくなります。

- `-p:PublishTrimmed=true`
不要なDLLを抑制してファイルサイズを小さくできます。
今回作成したアプリは70MB→40MBくらいになりました。

最後の2つはこちらを参考にしました：https://tech.guitarrapc.com/entry/2019/08/19/003131#SCD-1

`powershell Compress-Archive`というのはコマンドライン上でzip圧縮を行うには別途インストールが必要となるためPowerShellで行うためのコマンドです。　
`-Path`にzip圧縮の対象を指定し、`-DestinationPath`に出力先を指定します。
`-Force`をつけると既存ファイルがあった場合に上書きする設定になります。
Docker で Jupyter Notebook を使う（PostgreSQL と pgAdmin コンテナ同時起動）

Jupyter Notebook から DB へアクセスできるように、三つのコンテナ（Jupyter Notebook / PostgreSQL / pgAdmin）を同時に起動できる環境を構築します。

# 準備
プロジェクト用ディレクトリと各種ファイルを作成します。

```shell
$ mkdir my-anaconda && cd my-anaconda
$ touch Dockerfile docker-compose.yml
```

```docker:Dockerfile
FROM continuumio/anaconda3:latest

RUN useradd -d /home/[ユーザー名] -m -s /bin/bash [ユーザー名]

WORKDIR /home/[ユーザー名]/my-anaconda

RUN /opt/conda/bin/conda install jupyter -y --quiet
RUN pip install psycopg2-binary
```

```yml:docker-compose.yml
version: '3'

services:
  db:
    image: postgres:10.4
    container_name: postgres-my-anaconda
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin-my-anaconda
    volumes:
      - ./pgadmin:/var/lib/pgadmin
    ports:
      - "8000:80"
    depends_on:
      - db
    environment:
      PGADMIN_DEFAULT_EMAIL: postgres
      PGADMIN_DEFAULT_PASSWORD: postgres

  anaconda:
    build: .
    container_name: my-anaconda
    volumes:
      - .:/home/[ユーザー名]/my-anaconda
    ports:
      - "8080:8888"
    depends_on:
      - db
    tty: true
    command: >
      jupyter notebook
      --notebook-dir=/home/[ユーザー名]/my-anaconda
      --ip='0.0.0.0'
      --no-browser
      --allow-root
      --NotebookApp.token='jupyter'

volumes:
  db-data:
```

# サービスのビルドとコンテナの作成
サービスをビルドします。

```shell
$ docker-compose build
```

コンテナを作成します。

```shell
$ docker-compose up -d
```

# ブラウザからアクセスする
## Jupyter Notebook
http://localhost:8080 にアクセスします。「Password or token」に「jupyter」と入力すれば Jupyter Notebook が表示されます。

## pgAdmin
http://localhost:8000 にアクセスします。ログイン情報は、Email Address / Password ともに「postgres」です。

# サービスの開始と停止
サービスを停止するには以下を実行します。

```shell
docker-compose stop
```

再度サービスを開始して Jupyter Notebook を使う場合は以下を実行します。

```
docker-compose start
```
レプリケーションってなんぞや？（初心者編）

###レプリケーション？そんなのわからないよ

初めて聞く人にも説明させて頂きます

レプリケーションとはストレートに日本語訳すると``複製``ですね。
ではレプリケーション（複製）とはデータベースの分野で言うと、Aのデータベース（MySQL）があるとしてまったく同じBのデータベースをレプリカを複製するということですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180820/8d442931-94f5-9bf1-195c-9a4dafe3c3fa.png)

#####ではなぜこんなことするのか？
（意外に情報として既に周知されてるので僕みたいなビギナーは当初はなぜだかわからなかったです。ですのでくどいですが説明させて頂きます。）


<dl>
  <dt>レプリケーションを利用した場合以下のことができます</dt>
　<br>
  <dd>データをリモートサイトに転送（ディザスタリカバリ等に利用）</dd>
　<dd>データのフルバックアップを取得（マスターサーバの負荷軽減と手順の簡素化） </dd>
　<dd>スタンバイサーバ（マスターサーバがクラッシュした際に切り替える。ただし、データの転送は非同期なので、マスターがクラッシュした場合にはデータが少し失われる可能性があります。）</dd>
　<dd>参照系クエリの負荷分散スレーブを多数用意することで、参照系のクエリを、ロードバランサーを用いて負荷分散させる</dd>
</dl>





#####ではマスターとスレーブってなに？
* マスターサーバとは
複数のスレーブをもてるのもマスターの特徴
マスターで変更した内容をスレーブに転送すること
データの変更

*スレーブサーバとは
マスターでの変更内容を受け取る
変更内容をデータベースに反映
スレーブは1つのマスターのみ持てる


##レプリケーションのメリット
参照性能の向上
参照処理の負荷が高い場合は、スレーブサーバを追加することで、負荷分散による性能向上が実現できる

高可用性構成の実現
マスターの障害時に、スレーブをマスターに昇格することで高可用性を実現可能

地理的冗長性の実現
地理的に離れた場所に、災害対策サイトを構築可能
NW経由で離れたロケーションでマスタースレーブ構成を構築可能

バックアップサーバとしての利用
スレーブサーバでバックアップを取得することで、マスターサーバに影響を与えずにバックアップを取得可能
－例）マスターサーバは常時かどうさせつつ、スレーブサーバでDBを停止してコールドバックアップを取得する



 [マスターとスレーブに歴史が関わり、呼び名について論争が10年前からあるので暇なときに拝見して見ては面白いと思います。押下してもらえればリンク飛べます。](https://www.itmedia.co.jp/news/articles/2007/13/news057.html)








```

```
iwコマンドを叩いたら実行できなかったので、パッケージを探してインストールした

#####本当にinstallされてないのかを確認する
    # yum info iw
    利用可能なパッケージ
    名前                : iw
    アーキテクチャー    : x86_64
    バージョン          : 4.3
    リリース            : 2.el7
    容量                : 70 k
    リポジトリー        : base/7/x86_64
    要約                : A nl80211 based wireless configuration tool
    ※リポジトリーにinstalledとなってないので無い

#####パッケージを検索
iwコマンドは、ファイルなので　*/iw で検索

    # yum provides */iw
    iw-4.3-2.el7.x86_64 : A nl80211 based wireless configuration tool
    リポジトリー        : base
    一致          :
    ファイル名    : /usr/sbin/iw
    パッケージ名が、iw-4.3-2.el7.x86_64　である事が分かった

#####パッケージをインストール
    # yum -y install iw-4.3-2.el7.x86_64
    完了!

#####確認する場合はこちら
    # which iw
    /sbin/iw
    # echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    でパス通を確認


SEE YOU, GOD BLESS YOU! ^_^
Googleスプレッドシートのクエリの統合

###Googleスプレッドシートのクエリの統合の方法

##結論
各シートのデータを一つのクエリにまとめたい時に、これで縦結合できます

```
=QUERY({'シートA'!A:F;'シートB'!A:F})
```

条件指定する場合はこんな感じ

```
=QUERY({'シートA'!A:F;'シートB'!A:F},"SELECT Col1,Col2 WHERE Col6 ='対象'")
```

####ポイント
**・縦に結合したい場合のカンマは「;」横に結合したい場合のカンマは「,」**
**・条件指定はA、BではなくCol1,Col2....**

##よくあるエラー
**・ARRAY_LITERAL の配列リテラルで、1 つ以上の行の値が見つかりませんでした。**
→縦結合の場合の列数が違う（例：QUERY({'シートA'!A:F;'シートB'!A:E})
）
**・関数 ARRAY_ROW のパラメータ 2 に一致しない行サイズがあります（XXXX となるべきところが XXXX になっています）。**
→横結合の場合の行数が違う（例：QUERY({'シートA'!A100:F100,'シートB'!A50:F50})
）

**関数 QUERY のパラメータ 2 のクエリ文字列を解析できません: NO_COLUMN: A**
→条件指定がColの記載になってない（例：QUERY({'シートA'!A:F;'シートB'!A:F},"SELECT A"）

##参考にさせていただいたサイト
・https://monoblog.jp/archives/411
・https://qiita.com/ShishidoToru/items/e2b991fbf0f63710141c
pandas メモ


## サンプルデータ

```python
import pandas as pd
from sklearn.datasets import load_iris

# データ取得（アイリスという花のデータセット）
iris = load_iris()
data = iris.data
columns = iris.feature_names

# pd.DataFrame
df = pd.DataFrame(data=data, columns=columns)
```

## データ全体を確認
### 先頭からデータを表示: head()
```python
df.head() # 引数なしで5件表示

df.head(10) # 引数分データを表示
```

### 末尾のデータを表示: tail()
```python
df.tail() # 引数なしで5件表示

df.head(10) # 引数分データを表示
```

### 列（column)、行(index)の確認: columns, index
```python
df.columns # 列

df.index # 行
```

### 各カラムの最大値、最小値: max(), min()
```python
# 最大値
df.max()
# 最小値
df.min()
```
## 各カラムの平均、標準偏差: mean(), std()
```python
df.mean() # 平均

df.std() # 標準偏差
```

## 最大、最小値や平均値をまとめて確認: describe()
```python
df.describe()
```

## データの中身を確認
### データ型を確認: dtypes
```python
df.dtypes
```

### 欠損値（NaN）の確認: isnull()
```python
# 欠損値の有無
df.isnull().any()

# 欠損値の数
df.isnull().sum() # NaNの合計
```
【Python】#1「関数、変数、引数」( ..)φメモメモ

社内のPython講習にて学んだことを書き出しておきます。
まったくも～ってくらい自分用です。
なので間違ってるところも出てくると思いますよ。（震え声）

というかまだQiitaの書き方がわからないのだわ・・・。

#見出し
1.関数
2.変数
3.引数
4.関数つくるお

#関数
関数とは、定義されているもの。（ざっくり）
数学の関数のように与えられた値（引数）を元に何らかの計算や処理を行い、結果を返す命令のこと。
って調べたら書いてあった。

**標準関数**は、Pythonがはじめから用意してくれている関数。
**独自関数**は、変数を作るのと同じように自由に名前と処理を考え、プログラマーが作る。


##標準関数
・**print()** ......カッコ内の文字や数字を出力する

```python
print('こんにちワニ')

こんにちワニ                  #実行結果
```
___
・**str()** ......str型に変換

```python
name = '月には桜が咲きます'
num = 3
print(str(num) + name)

3月には桜が咲きます            #実行結果
```
___
・**int()** ......int型に変換（整数）

```python
num = '123'
num1 = 456
print(int(num) + num1)

579            #実行結果
```
___
・**len()** ......カッコ内の文字数を数えてくれる（文字列）

```python
name = 'ありがとウサギ'
len(name)

7              #実行結果
```
___
・**input()** ......文字列入力ダイアログが出る

```python
input('名前を入力してネ：')

名前を入力してネ：入力欄
'入力したの文字列が表示される'                  #実行結果
```
___
・**type()**……カッコ内に入力したものの型を判断してくれる

```python
name = 'さよなライオン'
type(name) 

str              #実行結果
```

#変数
あれ、普通は変数から説明するもんじゃね？　知らんけど。
***変数は箱。***値を入れておく箱。中身は上書きされたり変えられるんるん。


・**srt型**……文字列型

```python
name = 'ねこさん'          #シングルクォーテーションで囲む
```
___
・**int型**……整数の数値型

```python
number = 108               #囲う必要なし　
                           #煩悩の数
```
___
・**list型**……配列型、複数の値を入れられる、順番を持っている

```python
name_list = ['ねこさん','いぬさん','さめさん']         #　0から始まる
                                                     #どうぶつだいすき
name_list[2]
'さめさん'                                            #実行結果
```
___
・**dictionary型**……辞書型、複数の値を入れられる、キーと値の関係がある

```python
dic = {'cat':'猫','dog':'犬','shark':'鮫'}        #「key:value」の関係
                                                  #{}で囲むし、：がつくよ
dic['shark']
'鮫'                                              #実行結果
```
___
・**bool型**......真偽型、TrueかFalseで返ってくる

```python
bool1 = True                                 #「Boolean」のbool
bool2 = False
print(bool1)
print(bool2)                                 

True                                         #実行結果
False                                        #フラグに使われる
```
___
・**float型** ......小数点以下の数値型、int型と計算できる

```python
answer = 2.0 * 3                             #掛け算
print(answer)

6.0                                          #実行結果
```


#引数
print()などのカッコの中身は***引数***になる。
「input()」等カッコ内がなくても動くものもある。
引数を使う関数と使わない関数がある。
今ぼくにわかるのはそれだけ。

#関数つくるお
1を足してくれる関数の作り方です。まじでただのメモ。

```python
num = 1                #1を足してくれるための変数
def plusOne(num):      #「plusOne」が関数の名前、：大事
   print(num + 1)      #Tabキーを押して字下げ

plusOne(num)
2                      #実行結果
```
___

盛りだくさんにし過ぎた感。（急に韻を踏み出す）
一旦おわり。
※気が向いた時に編集されている可能性あり(-_-)zzz
<table>内のform_withが作動しない･･･

####【ページ内リンク】
[０．環境](#０環境)
[１．事象](#１事象)
[２．解決策](#２解決策)
[３．解決策２(turbolinks削除)](#３解決策２turbolinks削除)

#０．環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
・MySQL 5.7.31

#１．事象
```erb:example.html.erb
<% team = Team.find(1) %>
<table>
  <%= form_with model: team do |f| %>
    <%= f.text_field :name %>
    <%= f.submit "登録" %>
  <% end %>
</table>
```
これで`登録`ボタンを押しても送信されない･･･
※ちなみに`ページ再読み込み(F5)`すれば普通に作動した

[ページ内リンクへ戻る](#ページ内リンク)

#２．解決策
どうやら`<table>`内では`form_with`は上手く作動しないみたい。なので`form_with`を`<table>`の外に出した

```erb:solution.html.erb
<% team = Team.find(1) %>
<%= form_with model: team do |f| %>
  <table>
    <%= f.text_field :name %>
    <%= f.submit %>
  </table>
<% end %>
```
これでうまく作動した

※ちなみに`<thead>`や`<td>`内に`form_with`を入れても問題なかった
※しかしそれらが`<table>`の入れ子になってたらやっぱりOUT

[ページ内リンクへ戻る](#ページ内リンク)

#３．解決策２(turbolinks削除)
```erb:application.html.erb
↓</head>の上にあるこの1行(いわゆるturbolinks)を削除する
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```
・`turbolinks`は、ページ遷移の際、いちいち読み込みをする必要を無くす役割。(ページ遷移しても`更新ボタン`が変化しない)
・[１．事象](#１事象)で書いた通り、F5をすれば作動したことから、試しに`turbolinks`を削除したら正常に作動した

[ページ内リンクへ戻る](#ページ内リンク)
PHP strlen() と mb_strlen()違い　＆　substrとmb_substr違い

#文字のバイトによる長さか文字の数か

コード

```php

echo strlen('アイウエオ').PHP_EOL; //15
echo strlen('ア').PHP_EOL;//3
echo strlen('a').PHP_EOL;//1
echo strlen('あ').PHP_EOL;//3

echo mb_strlen('アイウエオ').PHP_EOL;//5
echo mb_strlen('ア').PHP_EOL;//1
echo mb_strlen('a').PHP_EOL;//1
echo mb_strlen('あ').PHP_EOL;//1

echo substr('アイウエオ',0,1).PHP_EOL;//�
echo substr('ア',0,1).PHP_EOL;//�
echo substr('a',0,1).PHP_EOL;//a
echo substr('あ',0,3).PHP_EOL;//あ

echo mb_substr('アイウエオ',0,1).PHP_EOL;//ア
echo mb_substr('ア',0,1).PHP_EOL;//ア
echo mb_substr('a',0,1).PHP_EOL;//a
echo mb_substr('あ',0,3).PHP_EOL;//あ

```


substrとmb_substrは第一引数で指定した文字列の第二引数で指定した位置から第三引数で指定したバイト数（mb_substrでは文字数）分の文字を出力する。
substrでは第三引数を1とするとバイトが３の日本語はエラーになる
ノートパソコンの画面の明るさをボタン一つで変更する【C#】

## 動機

メインで Windows10 のノート PC を使用しているのですが、持ち歩くことが多く環境によってディスプレイの明るさを変えなければならない場面が度々ありました。

そこで、いつも手動で画面の明るさを変更するのは面倒だなと思い、自分専用の「ディスプレイ輝度変更アプリ」を作ってしまえ！というのが動機です。

## イメージ画像

プロトで作ってみたので、UI としてはとてもそっけないです。

UI の明るさ最大(100)を選択すればディスプレイの輝度が最大に、明るさやや暗め(40) を選択すればディスプレイの輝度は 40 になります。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/4b901fb3-d7c9-47cd-9aa9-298603b1a1fe.png)


## ソース

### MainWindow.xaml

```MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button x:Name="button" Content="明るさ最大(100)" HorizontalAlignment="Left" Margin="246,40,0,0" VerticalAlignment="Top" Width="229" Height="126" Click="button_Click"/>
        <Button x:Name="button1" Content="明るさやや暗め(40)" HorizontalAlignment="Left" Margin="249,213,0,0" VerticalAlignment="Top" Width="226" Height="139" Click="button1_Click"/>

    </Grid>
</Window>

```

### MainWindow.xaml.cs

```MainWindow.xaml.cs
using System.Management;
using System.Windows;
namespace WpfApp1
{

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            // クリック後、画面表示
            //MessageBox.Show("Hello, world!!");

            // 輝度変更
            DeviceManager.Brightness.BrightnessController bc = new DeviceManager.Brightness.BrightnessController();
            bc.SetBrightness(100); // 輝度 100
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            // 輝度変更
            DeviceManager.Brightness.BrightnessController bc = new DeviceManager.Brightness.BrightnessController();
            bc.SetBrightness(40); // 輝度 40
        }
    }

}
namespace DeviceManager.Brightness
{
    class BrightnessController
    {
        ManagementClass WmiMonitorBrightnessMethods = new ManagementClass("root/wmi", "WmiMonitorBrightnessMethods", null);

        public void SetBrightness(int level)
        {
            foreach (ManagementObject mo in WmiMonitorBrightnessMethods.GetInstances())
            {
                ManagementBaseObject inParams = mo.GetMethodParameters("WmiSetBrightness");
                inParams["Brightness"] = level;
                inParams["Timeout"] = 5;
                mo.InvokeMethod("WmiSetBrightness", inParams, null);
            }
        }
    }
}}

```

## おわりに

自分自身はまだ C# に詳しくないですが、自分の生活が豊かになるものを作れる程度に、これから少しずつ勉強していけたらなと思っています。

なお、C# を使った今後の目的は、自分専用の Windows10 環境を簡単に変更することができるアプリを作っていきたいな、と思っています。
動画編集1



#環境
windows10 pro
Adobe　premiere pro　有料
[Avidemux（無料)](https://ja.wikipedia.org/wiki/Avidemux)



#始める
1. プロジェクト作成
2. 右下のスペースに動画をドロップする
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/11223a32-9bbd-4434-2e73-c92c6a176713.png">

#テスト用の動画
[このへんからDLする](https://pixabay.com/ja/videos/%E5%B1%B1-%E6%9C%A8-%E6%9E%97-%E6%A3%AE%E6%9E%97-%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89-61818/)

#動画サイズ変更(avidemux)
avidemuxでアスペクト比を無視して動画サイズを変更します。
VideoOutputをmpeg4にして、フィルタからswsResizeを選択します。
[Lock Aspect ratio]を無効にして、サイズを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/5c36ac0b-315b-d609-032b-0cbc6820c4c9.png)

File-Saveでファイル名を指定して保存すると動画コンバートが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/6c05592e-b548-bf17-d5ec-7f6a5f922d02.png)

# 動画の音声のみを保存する(adobe)
動画シーケンスの目のマークをオフにして保存、ファイル形式wav等にすると音声ファイルができます。
<img width="180" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/2caca736-249c-79e5-6f7e-e24ac94a4f41.png">

#複数の動画を１個にまとめる

[テスト用の動画](https://1drv.ms/u/s!ApO4wsxFJBbVww_2KpEkZ1NrWSbg?e=7SO2uF)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/d4da40bb-3dbe-976c-123b-374aa4df001e.png)

エフェクトコントロールを使います。デフォルトだと左上のwindowsです。

アンカーポイントを(0,0)にして、スケール５０％、位置を左上基準で指定します。
右下
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/b08667ff-3693-b613-2ea2-d0c2326400db.png">
ClionでMPIのプログラムを実行する

ClionでMPI並列化されたプログラムをビルドするには CMakeLists.txt に`find_package(MPI)`などの必要な設定を書けばよい。

ではCLionのIDE内でプログラムを実行するにはどうすればよいか。以下のようにすれば良い。


## 1 画面右上の"Edit configuration" を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28792/fd0e7ab5-c525-eb2c-a968-5f4a4b0d57f0.png)


## 2 設定を以下のように変更する

- "Executable" をmpiexecのパスに。私の環境の場合は(`/usr/local/bin/mpiexec` だった）
- "Program arguments" にmpiexecに渡す引数を設定する。実行するバイナリプログラムも引数として設定する
- "Working directory" を `$CMakeCurrentBuildDir$` に設定する。これはビルド時のディレクトリを参照するマクロで、デフォルトでは`cmake-build-debug`または`cmake-build-release`になる。
    - この設定がないと、mpiexecがあるディレクトリ(`/usr/local/bin`)を作業ディレクトリとして実行してしまい、プログラムが見つからずエラーになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28792/313a54a7-17b1-e4b3-145c-d31b70568df0.png)

あとは普通に実行するだけでMPIのプログラムを実行することができる。

### 参考情報

- https://intellij-support.jetbrains.com/hc/en-us/community/posts/205822679-Execute-program-with-mpirun
- https://www.jetbrains.com/help/clion/run-debug-configuration.html#services-tool-window
Docker for Mac インストール

# PC環境
Macbook Pro 13-inch 2017
メモリ 16GB
MacOS BigSur バージョン 11.2.2

# Dokcer for Mac ダウンロード
公式よりダウンロードします。
https://www.docker.com/
![スクリーンショット 2021-03-11 14.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/23f163b8-932a-9d9e-75ba-aea5c0778f54.png)

## Mac用ダウンロード

https://www.docker.com/get-started

![スクリーンショット 2021-03-11 14.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/99040ec9-5a5c-5432-3e2f-529016cac188.png)

# インストール
Docker.dmg をダブルクリック
![スクリーンショット 2021-03-11 14.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/bea77b75-ffa1-46cd-b68b-7af06cf3e8a3.png)
インストールが始まり、アプリケーションを移動させるように促されます。
ドラッグして、ローカルPCのアプリケーションフォルダにコピーさせます。
![スクリーンショット 2021-03-11 14.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/c455d936-0092-b959-d0ef-d1a36547b472.png)

# 動作確認
Docker.appをダブルクリックし、アプリを起動させます。
下記のような画面が出れば、dockerは起動しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/60f3c14f-1f33-7c15-4089-818047d612d7.png)

画像に記載されているdockerコマンドをターミナルで流すと、nginxのコンテナが立ち上がります。
そこまで確認できれば、あとは個人でコンテナを作成していくだけです。

```
docker run -d -p 80:80 docker/getting-started
```

下記URLをブラウザで開くと、チュートリアルのドキュメントが表示されます。
http://localhost/tutorial/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/a4098cfc-9055-7db4-4c84-befca5d50dd0.png)

# まとめ
環境をローカルに構築する際は、重宝していきたいです。
動作確認やモジュールのバージョンアップを確認する際は、活用していきます。
Azure IoT Edgeランタイムインストール - Raspberry Pi OS Buster編

> 2021/04/09 : 最新化しました。

Azure IoT EdgeランタイムをRaspberry Piにインストールする手順についてなるべく簡単にまとめます。
公式ドキュメントではRaspberry Pi OS StretchをTier 1としてサポートしていますが、最新OSのRaspberry Pi OS BusterはTier 2としてサポートしてます。

Tier 1 : Microsoft社が確認とインストールパッケージを提供
Tier 2 : Microsoft社は非公式サポート、Azure IoT Edgeと互換性あるので使用可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/7ef8d200-0476-1a62-86a2-faa4dcbfaa4e.png)

不要な内容とゴミが残らないような手順で整理しておきます。
基本、Raspberry Pi OS Stretch手順をBusterでもそのまま使えます。
（去年までは追加手順が必要でしたが、現在は不要です）

ARM64向けのUbuntu Server 20.04.X 64bit OSがインストールされているRaspberry Piはこちらの手順を参考してください。

https://qiita.com/motoJinC25/items/5696e25e7d445a7d7817

# バージョン確認

最新のRaspberry Pi OS with Desktopをインストールしてください。
https://www.raspberrypi.org/software/operating-systems/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/020efc23-11f2-1693-d88e-3f01984f8b95.png)

Debian Buster確認
https://www.debian.org/releases/

```bash
$ cat /etc/debian_version
10.8
```

# インストールパッケージのリポジトリ設定

```bash
$ curl https://packages.microsoft.com/config/debian/stretch/multiarch/prod.list > ./microsoft-prod.list
$ sudo mv ./microsoft-prod.list /etc/apt/sources.list.d/
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo mv ./microsoft.gpg /etc/apt/trusted.gpg.d/
```

# コンテナーエンジンのインストール

```bash
$ sudo apt update
$ apt list -a moby-engine
...
moby-engine/stretch,now 3.0.13+azure-0 armhf
moby-engine/stretch 3.0.12+azure-0 armhf
moby-engine/stretch 3.0.11+azure-2 armhf
...
$ sudo apt install -y moby-engine
```

# IoT Edgeセキュリティデーモンのインストール

2021年3月11日時点としてバージョン1.1が最新とLTSです。
1.2はまだプレビューとなり別手順でインストールしなければいけないです。

https://qiita.com/motoJinC25/items/1650813c465d2c58591c

```bash
$ apt list -a iotedge
Listing... Done
iotedge/stretch 1.1.1-1 armhf
iotedge/stretch 1.1.0-1 armhf
iotedge/stretch 1.0.10.4-1 armhf
iotedge/stretch 1.0.10.2-1 armhf
...
$ sudo apt install -y iotedge
$ sudo usermod -aG docker ${USER}
$ sudo reboot now
```

# デバイスのプロビジョニング

簡単なコマンドのみ掲載して説明は緩和します。

```bash
$ sudo vi /etc/iotedge/config.yaml
$ sudo systemctl restart iotedge
$ sudo systemctl status iotedge
$ sudo journalctl -u iotedge | grep "Starting module edgeAgent"
$ iotedge list
NAME             STATUS           DESCRIPTION      CONFIG
edgeAgent        running          Up 18 seconds    mcr.microsoft.com/azureiotedge-agent:1.1
$ $ docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED              STATUS              PORTS               NAMES
b851a8db4d43        mcr.microsoft.com/azureiotedge-agent:1.1   "/bin/sh -c 'exec /a…"   About a minute ago   Up About a minute                       edgeAgent
```

# 注意点

ありません。わずか数分でインストールできます。
最新のRaspberry Pi OS Busterでインストールしてある状態なら、問題なくAzure IoT Edgeランタイムをインストールできます。

# One more thing

IoT EdgeデバイスにDeployment Manifestを作成するには下記のウェブサイトで作成することをお勧めします。
フローダイアグラムでIoT Edgeモジュールを配置してDeployment Manifestをダウンロードできます。

https://wedx-edgeflow.motojin.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/1514fbc2-977d-600c-a1ec-94cd15571da4.png)
ROBOTCを用いてMindstroms NXT2.0を久しぶりに動かしてみた


# Mindstroms NXT2.0とは

>2009年6月29日にver2.0発表、8月1日発売開始[1]。パーツ数が619に増え、2個のタッチセンサーと1個の超音波センサーと新型の色センサーが導入された。NXT 2.0 は浮動小数点演算を使用するが、初期の型では整数演算を使用した。[2] キットの値段はおよそUS$280だった。
2010年11月に、ソフトウェアがNXT 2.1にバージョンアップされた。

随分昔の教育用おもちゃってことですね、、昔は４万円程度で売られていたのですが在庫の関係で値段が２倍になっていることがびっくりです！もう十年すれば相当なレアおもちゃになりそうなのでこれからも大切に扱っていこうと思います(;'∀')

# ROBOTCとは
>RobotCは、C言語に基づくプログラミング言語です。これは、教育の分野に特化したロボット工学の最初の言語です。「EtU」（使いやすい）開発環境で作成されました。RobotCを使用すると、VEX IQ、VEX COREX、NXT、EV3、Arduino MEGA1280およびMEGA2560などのロボットをプログラムできます。そのファイル構造により、必要なコマンドと変数を見つけることができます。RobotC言語は現在、プロプライエタリライセンスの下にあります。
コーディングは柔軟で比較的普遍的であり、コードをプラットフォームに送信したいユーザーは、ほとんどまたはまったく問題に遭遇しません。

早速今回の本題に入っていくのですが、子供のころは現在でいうと`スクラッチ`のようなアルゴリズムを組み立ててmindstromsを動かしていたのですが、今回はより精密な動作ができるようにROBOTCというテキスト型言語のC言語に近い言語を用いてロボットに動作のスクリプトを組み込みしていきたいと思います。

# ROBOTCのインストール方法　【Windows編】

ダウンロードリンクはこちらから
https://www.robotc.net/

`Download`のすぐ下に


|VEX|LEGO|Arduino|
|-|-|-|

とありますので`lEGO`をクリックしてください。

そうするとレゴの写真がでてくると思いますので`Current Version`のリンクで

|4.56(EXE)|4.56(MSI)|
|-|-|

↑上記はどちらも同じですが、拡張子が違うだけなのでこの拡張子の違いを理解できない型はこちらのリンクを参照にしてみてください。
https://aprico-media.com/posts/3926

ダウンロードできましたら、
**ROBOT for LEGO mindstroms 4.X**
というアプリの名前がでるのでそちらをクリックして起動してみてください。

クリックしましたら下記のような写真になるかと思います。
![スクリーンショット 2021-03-11 142255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904294/81f6a2ca-0971-98e1-c7be-af962264282b.png)


ここでスクリプト実行エラーとなっておりますが、私も理由がわからないのでそのまま`このページのスクリプトを実行し続けますか？`で`はい`という回答にして無視しています。


## 早速、mindstrom nxt2.0を動かしてみよう！

ソースコードはモーターだけを動かすように開発しました

```
SourceFile002.c
-------------------


task main(){
	motor[motorA] = 1000;
	motor[motorC] = 1000;
	wait1Msec(4000);

	motor[motorA] = -100;
	motor[motorC] = -100;
	wait1Msec(4000);

	motor[motorB] = 0;
	motor[motorC] = 0;

	return;
}

```

![スクリーンショット 2021-03-11 135443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904294/aac410c1-f867-7101-6654-6829082b33b6.png)

# firemwareをダウンロードしてmindstroms NXTシールドを使えるようにしよう！

早速実行しようと右上のボタンで
`Download to Robot`というのをクリックしましたができませんでした。

実は、その一つ手前に`Firmware Download`というボタンがありますのでそちらのボタンを押してNXTシールドに読み込んで置かないとスクリプトの実行ができません。
**ここで注意して置きたいことは、FirmwareをダウンロードするとNXTシールドが初期化されるので大事なデーターがあるかたはどっかにバックアップをとってください。**

残念ながら、私は高校１年生の時に開発したルービックキューブロボットのデーターを気づかず初期化してしまったためすごくショックです、、、


# コンパイル成功～！

<img width="1000" alt="ダウンロード" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904294/50b6e639-c9fb-093b-2479-3a3031e8bd44.gif">

今回は簡単な入門をしただけなのでまた次回より精密なプログラムを組んで何か開発してみたいと思います～！


#そのほか参考記事
今回の説明はおおざっぱな部分が多いため、参考にした記事を下記にて記載しますのでよければ参考にしてみてください。

[INTRODUCTION TO PROGRAMMING NXT ROBOTS IN C WITH ROBOTC](
https://www.generationrobots.com/en/content/58-robotc-logiciel-programmation-robots-lego-mindstorms-nxt)
[ROBOTCによるプログラミング基礎]
(https://www.maizuru-ct.ac.jp/control/control_www/images/practice_photo/1s_2019/004_ROBOTC_4pages.pdf)
[ROBOTCのチュートリアル]
(https://www2.denshi.numazu-ct.ac.jp/lego/NXT/RobotC/index.html)
[CS2N](
https://www.cs2n.org/curriculum)
### CS2N
CS2Nの説明を入れなかったのですが、`Download to Robot`をクリックした際にアカウントを作らないとNXTにコンパイルできなかったようです、、、
【初心者でもわかる】iphoneのロック画面で使われているフワッと表示する文字アニメーションを再現

# どうも7noteです。文字をふわっとだすアニメーションを作成

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/6877ac0b-99f6-41b1-2619-9b2b7c87fb7e.gif)




iphoneのホーム画面で使われている文字のアニメーションがきれいだったので同じようなものを作ってみます。
**文章の中央からフワッと文字が表示されるようなアニメーション**です。

## 書き方

```index.html
<p>ホームボタンを押してロック解除</p>
```

```style.css
p {
  display: inline-block; /* beforeとafterのサイズを同じにするため */
  position: relative;    /* 基準位置とする */
}

p::before,
p::after {
  content: '';           /* 疑似要素に必須 */
  width: 100%;           /* 幅いっぱいに指定 */
  height: 100%;          /* 高さいっぱいに指定 */
  display: block;        /* ブロック要素にする */
  position: absolute;    /* 相対位置に指定 */
  top: 0;                /* 上から0pxの位置 */
  left: 0;               /* 左から0pxの位置 */
}


p::before {
  background: linear-gradient(to left, transparent ,#FFF 50%) no-repeat; /* 背景と同じ色のグラデーション（左半分） */
  animation : fuwa1 1s forwards;             /* アニメーションを1秒間隔で行い停止 */
}

p::after {
  background: linear-gradient(to right, transparent ,#FFF 50%) no-repeat; /* 背景と同じ色のグラデーション（右半分） */
  animation : fuwa2 1s forwards;             /* アニメーションを1秒間隔で行い停止 */
}

/* アニメーション(左:before用) */
@keyframes fuwa1{
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: -250px 0; /* 適度な大きさの数字を指定 */
  }
}
/* アニメーション(左:before用) */
@keyframes fuwa2{
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: 250px 0; /* 適度な大きさの数字を指定 */
  }
}
```

## 解説

色付きでみていただく方が早いかもしれませんね。↓

![sample2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/96a8eb98-2dfe-7483-bea6-5385187e361c.gif)

左側にbefore、右側にafterを配置しそれぞれに背景色と同じ色のグラデーションを指定しておきます。
あとはアニメーションを左右それぞれ個別に指定し、beforeは左に移動するように、afterは右に移動するようにアニメーションを設定すれば完成。

## まとめ

iphoneでは文字自体が透明になっているのですがCSSでそれを再現しても今回のような左右に広がるような透かし方や表示はできない（難しい？）のでかんたんに実装できる疑似要素を使った方法で作成しました。

背景が単色のところでなけでば再現できませんが、実践でも問題なく使えるレベルのCSSかなと思います！

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】HTML・CSSのちょいテク詰め合わせ](https://qiita.com/7note)
android studioが起動できない場合の対応（Windows）

android studioがセキュリティの設定で起動できなかったため、設定した内容を残します。

## エラー内容
起動時に「アプリケーションを正しく起動できませんでした。」と表示され、私の環境では2種類のエラーコードがでました。

- エラーコード
    - 0xc000007b
    - 0xc0000005

## 設定内容
どちらも Windows Defender の設定をします。

1. Windowsの設定から「Windows Defender セキュリティセンター」を開きます。
2. 「アプリとブラウザーの制御」を開きます。
3. 「Exploit Protection」の「Exploit Protection の設定」を開きます。
4. 上部の「プログラム設定」を選択し、以下の順で選択します。
    1. 「プログラムを追加してカスタマイズ」の「＋」ボタン
    2. 「プログラムの名前で追加」
5. 「phpstorm64.exe」を入力し、以下を設定します。
    1. 「イメージのランダム化を強制する（必須 ASLR）」
        1. 「システム設定の上書き」にチェック
        2. 「**オン**」にする
    2. 「仮想メモリの割り当てをランダム化する（ボトムアップ ASLR）」
        1. 「システム設定の上書き」にチェック
        2. 「**オフ**」にする
6. 「studio64.exe」を入力し、以下を設定します。
    1. 「イメージのランダム化を強制する（必須 ASLR）」
        1. 「システム設定の上書き」にチェック
        2. 「**オフ**」にする
    2. 「仮想メモリの割り当てをランダム化する（ボトムアップ ASLR）」
        1. 「システム設定の上書き」にチェック
        2. 「**オフ**」にする

## 参考
- [JetBrains IDE Error on start : The application was unable to start correctly (0xc000007b)](https://stackoverflow.com/questions/53795155/jetbrains-ide-error-on-start-the-application-was-unable-to-start-correctly-0x?rq=1)
- [Android Studio cannot be initialized (0xc0000005)](https://stackoverflow.com/questions/47500401/android-studio-cannot-be-initialized-0xc0000005)
トランザクションデータのまとまりにIDを割り当てる

# 概要

SQLでトランザクションデータを扱うとき、特定のルールに沿ったまとまりごとに処理を行いたい時がある。
自分で１から加工するのが結構大変だったので、備忘のために記事として残す。

# やり方

1.扱いたいデータのまとまりの切り替わりのタイミングを定義し、UUIDを生成する
2.生成したUUIDをまとまりの中で割り当てる

例として、PVのトランザクションデータの中で、あるユーザが連続して同じ階層(page_category)をPVしたまとまりを取得したいときの例を以下に示す。
※BigQueryでの例
UUIDの生成やIDの振り分けは関数を用いており標準機能の範疇でないので、DBによって変える必要がある

```sql:連続するページカテゴリの回遊のまとまりを分類する
select
    *,
    case
        when unique_id is null then last_value(unique_id ignore nulls) over(
            partition by user_id
            order by pv_time rows unbounded preceding
        )
    end pv_chunk_id,
from (
    select
        *,
        case
            when page_category != lag(page_category, 1) over (
                partition by user_id
                order by pv_time
            ) then null
            else generate_uuid()
        end unique_id,
    from
        sample_pv_transaction
)
```

ここでは、ページ階層(page_category)が切り替わったタイミングでUUIDを生成しているが、この定義を変えることで色々なトランザクションのまとまりへの活用が効く。
Rails で gem を使わず論理削除を実装する方法

# 論理削除
データをまんま消すと復旧したいときに困ってしまうので、消されたことにしておくが、実際は消さないという実装方法

_やるまえに、本当に論理削除じゃないとダメなのかどうか、よくよく考えた方が良いです!!!_


# paranoia は非推奨

前の現場などでは、よく見たparanoia ですが公式のお達しの通り、ActiveRecordのdeleteとdestroyを上書きしちゃうので新しいプロジェクトに入れるのはおすすめしないっすとあります。
https://github.com/rubysherpas/paranoia

```
Notice:

paranoia has some surprising behaviour (like overriding ActiveRecord's delete and destroy) and is not recommended for new projects. See discard's README for more details.

Paranoia will continue to accept bug fixes and support new versions of Rails but isn't accepting new features.
```

# Gemを使わず実装してみる
default_scope + リレーション でなんとなくやりたいことはできるのかなと思いました。

嫌われがちなdefault_scopeですが、用途を限定したら良いのではないかと思っています。
参考 : https://qiita.com/yokochi@github/items/730418b0c7f36ded5b5f


```ruby
class Parent < ApplicationRecord
  default_scope { where(deleted_at: nil) }
  scope :with_deleted, -> { unscope(where: :deleted_at) }
end
```

このように定義しておけば、gemを使わなくても呼び出し時にはdeleted_at に値が入っているものを除外してくれます。

```
$ Parent.all
=> SELECT `parents`.* FROM `parents` WHERE `parents`.`deleted_at` IS NULL 

$ Parent.with_deleted.all
=> SELECT `parents`.* FROM `parents` 
```

# 子データから論理削除済みの親データを参照したい

状況によっては不便になるので良し悪しですが、

親と子でリレーションが成立しているとき、

```ruby
class Child < ApplicationRecord
  belongs_to :parent
end
```

parentに紐づくchildが作成された後に、parentが論理削除された場合には、既に削除済みのデータは呼べません

```
$ child.parent
=> nil 
```

リレーションがある場合にはdeleted_atを無視したい場合には条件を設定します。（管理画面とかで過去データを表示する時に役に立ちました）

```ruby
class Child < ApplicationRecord
  belongs_to :parent, -> { with_deleted }
end
```

# 論理削除したい
都度やるの面倒ですが、腹を括って .soft_destroy といった名前でdeleted_at に時間を埋めるメソッドを追加するしかないかなーと思います

# まとめ
やっぱ論理削除をgemなしでやろうとすると面倒ですね。。
【AWS】Lambdaで別アカウントのリソースにアクセスする


##目的
* 何回かやって調べながらやったためメモ的に
* lambdaで別アカウントの各リソースにアクセスしたい
![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643364/aced822c-25b6-e378-a9bc-a86f58f367a1.png)



##準備するもの
* アカウントA
    * Lambda用IAM Role
    * Lambda関数
* アカウントB
    * assume role用 IAM Role
  
## 作成

###アカウントB
#### Role
ポリシーはアクセスしたいリソースによって変える

信頼関係を以下のように編集する

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::アカウントAのアカウント番号:role/LambdaのRole名"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

### アカウントA
#### policy
以下ポリシーを付けたRoleを作成

```
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::アカウントBのアカウント番号:role/アカウントBで作成したRole名"
    }
}
```

#### Lambda関数

```
import boto3

def lambda_handler(context, event):

    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::アカウントBのアカウント番号:role/アカウントBで作成したRole名",
        RoleSessionName="cross_acct_lambda"
    )
    
    ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
    SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
    SESSION_TOKEN = acct_b['Credentials']['SessionToken']

    # create service client using the assumed role credentials, e.g. S3
    client = boto3.client(
        's3',
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        aws_session_token=SESSION_TOKEN,
    )

    return "Hello from Lambda"
```

これでアカウントBにアクセスできるLambdaが完成
複数環境にアクセスしたい場合はCloudFormationとかでアカウントにIAMRole配ればできるようになるので
今後はここら辺を簡単に実装できる方法を考えたい、、、




###参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-function-assume-iam-role/
Font Awesomeが表示されないことの不具合を解消

#はじめに
Font Awesomeのマークがいつの間にか表示されていませんでした・・・
間違えてコードを消してしまったのかな・・・
検証ツール使って確認しても問題なさそうだな・・・

（本来）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/2dadc2dc-6fa3-8d2e-0214-9a1dcdd52909.png)


（今回消えてる・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/afca51d4-62c2-8a4f-9f44-1a850ca7fdbf.png)

#結論
wifiがoffになっていたので、wifiをonにすると元どおりになりました笑

#理由
Font Awesomeのコードが、インターネットを経由した先にあるためだからです。

localでの作業中での出来事だったので、offラインとなっていると、その外部からコードが引用できなったと考えられます。

灯台もとぐらしですね笑

以上です。
MarkerOptionsでマーカーの色を変える方法

`MarkerOptions#icon`に`BitmapDescriptor`を渡します。

実装は以下のようになります。

```kotlin
val latLng = LatLng(0.0, 0.0)

val bitmapDescriptor = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)

MarkerOptions().position(latLng).icon(bitmapDescriptor)
```

# 色の種類
`BitmapDescriptorFactory`には以下の色があります。

## HUE_RED
![Screenshot_1614955788.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/d8a3fa38-3631-3315-a219-0e105826c310.png)

## HUE_ORANGE
![Screenshot_1614955926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/ee810e8a-90c6-a75b-bc90-b5befebea0bf.png)

## HUE_YELLOW
![Screenshot_1614954070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/7336090e-da68-746f-ed5b-dd01739f047f.png)

## HUE_GREEN
![Screenshot_1614954104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/93ff5869-7c25-c86b-ba79-0caedb3e1f4a.png)

## HUE_CYAN
![Screenshot_1614954144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/36e7a0f6-8392-c278-ae99-cd31c97bb1bb.png)

## HUE_AZURE
![Screenshot_1614954211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/0e9e1d61-96f5-d3ca-c9a6-e36025285848.png)

## HUE_BLUE
![Screenshot_1614954237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/3080bc0b-d753-f800-0bfc-1912ff714aa1.png)

## HUE_VIOLET
![Screenshot_1614954268.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/e05ae2b7-c7e0-fb00-4014-0cd65050e105.png)

## HUE_MAGENTA
![Screenshot_1614954290.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/392e2443-865e-d116-32ff-66c1e1d6080c.png)

## HUE_ROSE
![Screenshot_1614954315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365643/5ec65b47-f8ef-d237-6d7d-c23619c5ad44.png)
【Vue.js】意図しないタイミングでcreatedが発火していた。

タイトルの件で躓きましたので、再現方法と解決法を記載します。

# 問題のあるコード

ボタンを押した時に、コンポーネントとは関係のないdivの表示非表示を切り替えているだけなのですが、実際にこのコードを動かすとコンポーネント内のcreatedが発火してしまいます。

```index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>vue-component-test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <button @click="show = !show">show toggle</button>
        <div v-if="show">div1</div>
        <div>
            <my-component></my-component>
        </div>
        <div v-if="show">div2</div>
    </div>
</body>
<script>
    Vue.component('my-component', {
        template: '<div>my component</div>',
        created() {
            console.log('created!');
        }
    })

    new Vue({
        el: '#app',
        data: { show: true }
    })
</script>
</html>
```

# なぜなのか

componentの親divの前後のdivが同時に消えた際に、同一のDOMと認識されずに再描画されてしまっているのだと思います。
（内部のアルゴリズムまでは見られていないので有識者がいらっしゃったらご教示いただきたいです）

# どうしたか

keyを与えてあげて、同一DOMだよっていうことをvueに教えてあげました

```index.html
        <!-- 前略 -->
        <div :key="myComponent">
            <my-component></my-component>
        </div>
        <!-- 後略 -->
```

以上