OmniAICreator/Qiita-1.07M huggingface dataset:
10.3.2 RioにJCLとJVCLをインストールする。

##JCL/JVCLとは
JCLとJVCL MPL 1.1で公開されているProject Jediのライブラリ/コンポーネント群です。JVCLがビジュアルコンポーネントで，JCLを利用しています。
公式サイト http://www.delphi-jedi.org/

#Delphi 10.3.2 にJCLとJVCLをインストール
素のDelphi 10.3.2 にJCLとJVCLをインストールしようとすると
Install.batをから起動さえるJediInstaller.exeが上がる直前で以下のダイアログが表示されエラーで停止してしまいます。

```
JediInstaller.exe - エントリ ポイントが見つかりません
プロシージャ エントリ ポイント @System@Classes@TFieldsCache@$bcctr$qqrv がダイナミック リンク ライブラリ D:\jedi\jcl\jcl\bin\JediInstaller.exe から見つかりませんでした。 
```
#Delphi 10.3.2にパッチを当てる
2019/10/15現在ダウンロードサイトに公開されているパッチは以下の5つあります。
RAD Studio 10.3.2 Runtime Packages Compatibility Patch
Delphi_10.3.2_macOS_Debugging_Patch
C++Builder and Delphi 10.3.2 Building Changed Files Patch
RAD Studio 10.3.2 C++ and Delphi Toolchain Patch
RAD Studio 10.3.2 C++ Debugging Patch
依存関係があるようなので古い者から順番に適用します。
今回関係しているのはRAD Studio 10.3.2 Runtime Packages Compatibility Patchです。[MarcoのBlog] ( http://blog.marcocantu.com/blog/2019-august-1032-runtime-packages-patch.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+marcocantublog+%28marcocantu.blog%29 ) には
> Note: A new application built in 10.3.2 will not run if executed against a 10.3.x version of the runtime packages, showing surfacing an error like 'Entry Point not Found "@System@Classes@TFieldsCache@$bcctr$qqrv"'. 

とあるので，これで解決しそうです。が，私のところでは解決できませんでした。

#rtl360.bplを探す
@Owlsperspective様よりアドバイスをいただき，まずは古いrtl360.bplを探すことにしました。すると
C:/Windows/SysWOW64 にありました。もしかすると何かのツールがDelphi製でここにランタイムライブラリをインストールしたのかもしれません。これを取り除くとjclのJediInstaller.exeが起動できました。

もしもDelphi 10.3.2にjclやjvclをインストールするときにうまくいかない場合には，ランタイムライブラリのrtl360.bplがパスの通っているところにないか調べてみるとよいと思います。

私の七転八倒の様子は
https://twitter.com/p_kato/status/1183672400090562560
よりご覧いただけます。アドバイスをいただきましたigy様，Owl's perspective様ありがとうございました。
Haskell の case 式を使ってみる

case 式を使うと、変数の指定した値に対するコードブロックを評価できる。
つまり、コード中のどこでもパターンマッチが使える構文ということである。

# 関数のパターンマッチ

Haskell では関数のパターンマッチを以下の様に実装する。
例として、リストの先頭要素を取得する関数 `head` を実装してみる。

```haskell
head' :: [a] -> a
head' [] = error "no head"
head' (x:_) = x
```

# case式によるパターンマッチ

関数のパターンマッチは実際には case 式によるパターンマッチのシンタックスシュガーである。
同様に `head` の実装は以下のようになる。

```haskell
head' : [a] -> a
head' xs = case xs of [] -> error "no head"
                      (x:_) -> x
```
# guardも使える

```hs:
main :: IO ()
main = do
    print $ flip map [1..100] $ \ n -> case n of
        n'  | n' `mod` 15 == 0 -> "FizzBuzz"
            | n' `mod`  5 == 0 -> "Buzz"
            | n' `mod`  3 == 0 -> "Fizz"
            | otherwise -> show n'
```

# case式はプログラム中のどこでも使える

関数のパターンマッチは関数を定義する際のみだが、case式は式の途中やプログラム中でも使える。

### 関数の途中で

```haskell
describeList :: [a] -> String
describeList list = "The list is "
                  ++ case list of []   -> "empty"
                                  [x]  -> "a single"
                                  xs   -> "multiple"
```

### プログラム中で

```haskell:case-expression.hs
import System.Environment
import System.IO

main = do
   args <- getArgs
   let result = case args of [] -> "args is empty"
                             xs -> foldl (\acc x -> acc ++ x) "args is " xs
   putStrLn result
```

```sh
$ ghc --make /path/to/case-expression.hs                

$ /path/to/case-expression aaa bbb ccc
args is aaa bbb ccc

$ /path/to/case-expression
args is empty
```

# 終わり
Azure Cognitive Services の Bing Image Search 機能を使ってみる

今回は Cognitive Services 機能の一つである Bing Search を使って、テキストから画像を検索するデモを試してみる。
#Bing Image Search とは?
Microsoft の Bing Image Search の紹介ページには以下の様に記載している。
https://azure.microsoft.com/ja-jp/services/cognitive-services/bing-image-search-api/
>Bing Image Search API v7 は、Web での画像検索に役立ちます。検索結果にはサムネイル、画像の完全な URL、発行元 Web サイトの情報、画像のメタデータなどが含まれます。API v7 であれば、画像検索で特定の結果を簡単に見つけられる新しい並べ替えオプションやフィルター オプションが利用でき、結果のページングも可能です。

つまり単純に「犬」といった固有名詞の検索だけでなく、「かわいい　動物」といった形で検索することが可能となっているみたいです。実際にデモページで「Cute Animals」と検索すると可愛らしい動物たちの画像が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/6127ec72-2e2a-cbfa-a638-41b8c326b98f.png)

この開発コードが GitHub に公開されていたので、今回はそれをいじってみて、実際に自分の WebPage から Bing Image Search が呼び出せるか確認してみようと思います。

#Azure Portal から Bing Image Search のデプロイ
まずは Azure Portal からBing Search v7 をデプロイします。リソースの作成から「Bing」と検索すると1番目か2番目に出てくると思います。作成するとき、今回はデモで実施するため、フリーの「F0」プランを選択します。Cognitive Services は API を申請するのみのため、VM等と比べると早くデプロイが終わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/a6fb4392-de82-3367-abf3-46aa03bf8340.png)
Azure Bing V7 のデプロイが終わったら、Key をコピーしておきます。

#GitHub からソースコードを入手し、変更箇所を書き換える
Microsoft が公開しているコードを自分の PC 環境にデプロイします。Clone が完了したら、今回使用する Bing Image Services が入っているディレクトリに移動します。

```
git clone https://github.com/Azure-Samples/cognitive-services-REST-api-samples.git
Tutorials/Bing-Image-Search/
```

無事に Clone と該当ディレクトリへの移動が完了したら、public/js の中にある Script を変更します。
一番上に Key を入力する行があるので、そこに先ほどコピーした Key を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/f400fc0f-c991-bfe5-656d-534386b71275.png)

#実際に使用してみる
ここまで出来たら実際にデプロイしてみます。
node js でのデプロイ方法、「npm install」と「node app.js」をコマンドで打つと、ローカルでアプリケーションが実行され、ブラウザからアクセスできるようになります。実際にアクセスし、「くまのみ」と検索すると以下のような画像がかえってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/1b82ffaa-aec6-7786-c6e3-ee1fd4c91287.png)

以前作成した、Custom Vision を使って判別された画像とテキストを使って、類似の画像を検索する、というのも簡単にできそうです。
https://qiita.com/komiyasa/items/0ba847d7359817ea2dd5

#参考URL
GitHub ソースコード
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/tree/master/Tutorials/Bing-Image-Search

Create a single-page app using the Bing Image Search API
https://docs.microsoft.com/en-us/azure/cognitive-services/bing-image-search/tutorial-bing-image-search-single-page-app
WebGLを使ったグリグリ動くWebコンテンツをチームで作ってみた - 目次

# 何
WebGLで3Dを活用したWebサイト、「 [3DWebSite](https://playcanvas-demo.jp/examples/web/3dwebsite/) 」をPlayCanvasを利用して開発しました。
![Imgur](https://imgur.com/bj1IEIF.png)

ここでは、3DWebSiteを開発した際に得られた、__ゲームエンジンを利用してWebサイトを作る__知見を残すためそれぞれの担当メンバーが解説記事を執筆しています。

**実行リンク**
3DWebsite : https://playcanvas-demo.jp/examples/web/3dwebsite/

**解説記事一覧**
[【3Dエンジニア編】](https://qiita.com/utautattaro/items/23f6bc6d3f50b21bf52f) by [@utautattaro](https://twitter.com/utautattaro)
[【3Dモデラー編】](https://qiita.com/shujimuna1102/items/89947ffd6a4a79ff1db5) by [@shujimuna](https://twitter.com/shujimuna)
[【フロントエンドエンジニア編】](https://qiita.com/yushimatenjin/items/de1aa22ab05fa45d79cc) by [@Mxcn3](https://twitter.com/Mxcn3)
[【デザインエンジニア編】](https://qiita.com/sutobu000/items/827df2d1cd77b5c4b025)by [@sutobu000](https://twitter.com/sutobu000)



## PlayCanvas　とは

HTML5/WebGL向けコンテンツが簡単に作れるWebブラウザ上で動くクラウドにホストされたゲームエンジンです。ソフトウェアをインストールすることなく、URLにブラウザからアクセスするだけで、複数人でゲーム開発ができます。

もともとはゲーム開発向けエンジンでしたが、WebGLに詳しくなくても3Dモデルを簡単に描画できる点や、独自のJavaScriptで簡単にゲームロジックを実装できる点、HTMLやCSSも手軽に書き込める点から、ゲーム開発以外にもWebサイトやリッチ広告などでも使われています。

PlayCanvas日本公式ページ : https://playcanvas.jp
SSH接続の設定を~/.ssh/configに書いておくと接続する際に長いコマンドを打つ必要がなくなる

# この記事を読むことで実現できること
~/.ssh/configにあらかじめ設定を書いておくことで、SSH接続する際に以下のような長いコマンドを打っていたのが、

```bash
ssh -i {秘密鍵までのパス} {ユーザー名}@{ホスト名}
```

以下のように短いコマンドで済むようになります。

```bash
ssh {適当な名前}
```

# ~/.ssh/configに設定を書く

`~/.ssh/config`を作成するため以下のコマンドを実行します。

```bash
touch ~/.ssh/config
```

テキストエディタで`~/.ssh/config`を開きます。そして、以下のように入力します。

```bash:~/.ssh/config
Host {適当な名前}
HostName {ホスト名}
User {ユーザー名}
IdentityFile {秘密鍵までのパス}
```

`Host`にはコマンドで呼び出す際の名前を入力します。`HostName`には接続先のホスト名を入力します。`User`には接続先のユーザー名を入力します。`IdentityFile`には公開鍵認証に使う際の秘密鍵までのパスを入力します。公開鍵認証を使わない場合は入力する必要はありません。

# 接続できるか確認

`Host`に入力した名前でSSH接続ができれば成功です。

```bash
ssh {適当な名前}
```
【Mac】openCVのインストール

### openCVのインストールについて．

n番煎じですが，備忘録として．
macを使っている方は，homebrewを使ってopenCVをインストール可能です．

```
$ brew install opencv
```

難なく完了．
Pythonで使うことを想定して

```
$ pip install opencv-python
```

でしばらくして完了．
無事インストールできたかを確かめるために

```
$ python3
>>> import cv2
```

として何もメッセージが出なければOK.

### エラーが出たら
エラーが出たらこちらを参考に
https://qiita.com/riyuri654/items/b87b910a6405d0a4a991#_reference-573ae94857afdbacccbe
raspberry pi 3B+ buster　に　vscodeをインストールした 


vscode　が、htmlやcssを書くのに、便利なので、raspberrypiにインストールしたかったのだが、ずっと失敗してました

今回、raspberry pi の公式サイトで、成功例があったので、その通りやってみたら、成功したので報告
Ihave suceeded install visualstudio code on raspberrypi buster 

$ uname -a
Linux raspi_name 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l GNU/Linux
 
$ cd ~
$ wget https://github.com/stevedesmond-ca/vscode-arm/releases/download/1.28.2/vscode-1.28.2.deb
$ sudo apt install ./vscode-1.28.2.deb


https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=251989&p=1537974&hilit=Visual+Studio+Code+on+buster#p1538186

Note that later versions intended for a PI may not work and Visual Studio Code has gone to 64-bit only so the very latest versions won't run
Google Natural Language API でハマるところ

Natural Language APIではまったところをエラーメッセージとともに解決策をメモしておきます。

## Cloud Shell上での認証エラー
> google.api_core.exceptions.PermissionDenied: 403 Your application has authenticated using end user credentials from the Google Cloud SDK or Google Cloud Shell which are not supported by the language.googleapis.com. We recommend that most server applications use service accounts instead. For more information about service accounts and how to use them in your application, see https://cloud.google.com/docs/authentication/.

### 解決法
**サービスアカウントを取得してパスを通す**
取得は[こちら](https://console.cloud.google.com/iam-admin/serviceaccounts/)から
取得したサービスアカウントをセットして環境変数をエクスポート

```bash:
export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
```

[ヘルプ詳細](https://cloud.google.com/docs/authentication/getting-started)

## Colabで環境変数を設定できない
> DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credential and re-run the application. For more information, please see

Colabはexportされた環境変数を読み込まないためosモジュールを使って設定する。

```python:
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'your/path/to/.json'
```
【Unity】オブジェクトの実行順序を設定する。

# やりたいこと
　シューティングを例として、下記処理を任意順序で実行したい。
　1. プレイヤーを移動する。
　2. 敵が弾を生成する。
　3. 当たり判定を実行する。

# デフォルトの処理順序について
Unityでは下記のようなイベント関数 (定義するだけで自動的に呼ばれる関数)の実行順序は定まっていない。
　・Awake
　・Start
　・Update

# 処理順序の変更(継承なし）
テストとして下記クラス、ObjectA, B, Cを同名のオブジェクトにアタッチしたところ、実行順序はバラバラであった。
(正確には、Unityを再起動したタイミング)

```csharp
public class ObjectA : MonoBehaviour
{
    DateTime dt;
    void Awake() {OutLog("Awake"); }
    void Start() {OutLog("Start"); }
    void Update() {OutLog("Update");}
    void OutLog(string funcName)
    {
        dt = DateTime.Now;
        Debug.Log(name + " - " + funcName + " : <frame/time>" + Time.frameCount + "／" + dt.Second + "." + dt.Millisecond);
    }
}
```

## スクリプトの実行順序を設定する。
下記サイトのままであるが、
・スクリプトファイルの「インスペクタ -> Execution Order」を選択する。
・下図のようにDefault Timeに数値の少ない順にスクリプトを追加する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/0c4b75e4-7472-600c-9c31-5f58563061a4.png" width=50%>


## デフォルト時間とは
・公式リファレンスでのデフォルト時間についての定義が見つからなかった。
・試しに、設定する数値を10000刻みで設定したが、特に実行は遅延しなかったため、秒やミリ秒ではなく単なる順序番号として扱われているようだ。


# 処理順序の変更(継承あり)
実際ゲームを作成していると、ポリモーフィズムを利用したい場合が出てくると思う。
例えば敵クラスを派生した敵1クラス, 敵2クラス…
それらの全ての派生クラスに対して処理順序を設定していたら大変だ。
そこで、基底クラスのみでも処理順序が正しく効くか試してみる。


```csharp
public class Prefub : MonoBehaviour
{
    public GameObject enemyPrefub;
    public GameObject playerPrefub;

    public void Start()
    {
        GameObject enemy;
        GameObject player;

        // Player A,B,C ／ Enemy A,B,Cを動的に生成する。
        enemy = Instantiate(enemyPrefub);
        enemy.AddComponent<EnemyC>();
        player = Instantiate(playerPrefub);
        player.AddComponent<PlayerC>();
        enemy = Instantiate(enemyPrefub);
        enemy.AddComponent<EnemyB>();
        player = Instantiate(playerPrefub);
        player.AddComponent<PlayerB>();
        enemy = Instantiate(enemyPrefub);
        enemy.AddComponent<EnemyA>();
        player = Instantiate(playerPrefub);
        player.AddComponent<PlayerA>();
    }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/4cd5720d-587c-a0b6-a66f-0246ba491e18.png" width=50%>

## 結果
(EnemyC -> PlayerC -> EnemyB -> PlayerB -> EnmeyA -> PlayerA)
意図した結果にならず、生成と同じ順序でUpdate()が呼ばれる。

# 結論
暫定として、EnemyはEnemyManager, PlayerはPlayerManagerとして一括にまとめて、
PlayerManager -> Update, EnemyManager -> Updateとオブジェクト種別ごとに処理をすればいったんは解決しそうである。

# 参考サイト
[【Unity】狙った順に処理したい時はスクリプトの実行順を指定する](https://ekulabo.com/execution-order)
[イベント関数](https://docs.unity3d.com/ja/2018.1/Manual/EventFunctions.html)
[イベント関数の実行順]
(https://docs.unity3d.com/ja/2018.1/Manual/ExecutionOrder.html)
[Script Execution Order Settings](https://docs.unity3d.com/ja/2018.1/Manual/class-MonoManager.html)
[【理解した！】スマホ向けUnity スクリプト実行順の謎](https://ameblo.jp/sugawara-monolizm/entry-11889665729.html)
rails tutorial 5章　備忘録

## アセットパイプラインとは本番環境で読み込み時間を短縮するために効率化された仕組みのこと
- アセットディレクトリ
    - 静的なファイル（cssやjs）を目的別に分類している
- マニフェストファイル
    - アセットディレクトリに配下したファイルをどのように一つにまとめるかを記載したもの
- プリプロセッサエンジン
    - .erbや.scssなどサイトテンプレート用に変えるもの。railsでは拡張子を元に変更する。

## sassの使い方
- ネスト（冗長なコードはまとめる事ができる）

```scss
ネスト前
.center {
  text-align: center;
}

.center h1 {
  margin-bottom: 10px;
}
```

```scss
ネスト後
.center {
  text-align: center;
  h1 {
    margin-bottom: 10px;
  }
}
```

- 変数を定義できる（色とか）

```scss
変数定義前
h2 {
  .
  .
  .
  color: #777;
}
.
.
.
footer {
  .
  .
  .
  color: #777;
}
```

```scss
変数定義後

$light-gray: #777;
.
.
.
h2 {
  .
  .
  .
  color: $light-gray;
}
.
.
.
footer {
  .
  .
  .
  color: $light-gray;
}
```

## パーシャルについて
パーシャルはviews/layoutの中に定義する。パーシャルは最初にアンダースコア（_）をつけることが慣習である。
例えば、_header.html.erbなど。また初学者はyeildとパーシャルの違いを理解することが難しいと思うかもしれないが、yeildはlayout以外のテンプレートを流しこむ機能に対して、パーシャルはlayoutの中身を綺麗にする。

## routeの統合テスト

```rb
【Python】Tkinterでクラス分類用のアノテーションツールを作ってみた

## はじめに
物体検出用のアノテーションツールは山のようにあるのに、クラス分類用のアノテーションツールって意外と無いなと思って、python + Tkinterで作りました。

使い方やコードはGitHubにも載せているので、参考にどうぞ
https://github.com/takanosuke/classifier_annotation_tool

## 環境
* OS:windows10
* Python 3.x
* pillow 5.x

## コード
GitHubに公開しています。[こちら](https://github.com/takanosuke/classifier_annotation_tool)を参照してください。

## 各メソッドの簡単な説明
* init
    * 各変数の初期化
* init_window
    * ウィンドウに配置するものを初期化
* init_shortcuts
    * 各ボタンのショートカットキーを設定
* set_message
    * メッセージ内容の更新
* set_image
    * 表示する画像の更新
* get_class_name
    * 現在表示している画像にラベリングされたクラス名を表示
* onNextButton
    * 画像を1つ先に進める
* onBackButton
    * 画像を1つ前に戻す
* labeling
    * 現在表示している画像にラベリングする
* load_json
    * jsonファイルの読み込み
* update_json
    * jsonファイルの更新

## 動作画面
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294119/d027d67d-add3-c688-4e82-ca44b570b2b9.png)
## まとめ
Tkinterは簡単にGUI操作のプログラムが作成できるので、JavaScriptとかで書くのが面倒くさいときにおすすめです。

## 参考
[Python + Tkinter で作る、GUIな画像トリミングツール](https://qiita.com/MasahikoYasui/items/4bfdfab0ba27c7ca0620)
【centos7 ⇔ windows10 ダウンロード/アップロード】teratermを利用しさくらVPSサーバーからローカルへファイルをダウンロード/アップロードする方法　

teratermを利用してファイルをアップロード・ダウンロードしたい場面は多くあります。いずれも簡単なのでやりましょう。

# ダウンロード　centos7からwindows10へダウンロード
「ファイル」 →「 SSH SCP...」を選択します。

![0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/740c488d-4b96-bfcb-c956-72d1b0674260.png)

ポップアップが開くので

From
To
をそれぞれご自身の環境に設定して「Receive」を押してください。
例えばsample.zipをダウンロードしてみましょう。

```
From　/home/hogeuser/sample.zip
To　C:\Users\hoge\Desktop
```

と入力します。

![0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/3bd0c1d6-5932-2e2b-c563-19af6f4d8314.png)

するとサーバーのsample.zipがローカルのデスクトップへダウンロードすることができました。

# アップロード　windows10からcentos7へアップロード

続いて今度はwindows10のファイルをcentos7へアップロードしてみましょう。アップロードをする時はファイルをteratermの中にドラッグ＆ペーストすればＯＫです。

以上、アップロード・ダウンロードする方法でした。
【AWS】IAMでアクセス制御 EC2, RDS, S3

# 概要

AWSのマネジメントコンソールへのアクセス制御をIAMで行います。

IAMユーザの権限ですが、今回は
- EC2(full)
- RDS(full)
- S3(full)
- IAM(read only)

# 参考記事

[AWS IAMユーザー](https://qiita.com/kzykmyzw/items/ca0c3276dfebb401f7d8)

## IAM 管理ユーザを作成

- サービスのIAMを選択すると画像のような表示になるので「ユーザー」を選択し「ユーザーを作成」を押す

![スクリーンショット (128)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/a8cfccdc-6782-f030-3f13-488d599fe8a8.jpeg)

管理ユーザであることがわかる名前を付け、「AWS マネジメントコンソールへのアクセス」を選択します。
パスワードも設定し、「パスワードのリセットが必要」にもチェックを入れ「次のステップ：アクセス権限」押し次に進む

![スクリーンショット (129)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/7611c677-30e0-23e3-c02c-69f0fdb2e700.jpeg)

画面中央の「グループの作成」を押すと

![スクリーンショット (130)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/7c87a4a9-dc60-b3c6-6d36-bc3bddb143ca.jpeg)

モーダルが出てきます。
「グループ名」を入力し、「ポリシー名」は「AdministratorAccess」にチェックをいれて
「グループの作成」で次に進みます。

![スクリーンショット (132)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/f1758b19-20a0-8305-4361-5f3ba87066e5.jpeg)

このようにグループが作成され、また
作成されたグループに今作成中のユーザが参加するようにチェックがついていることを確認し「次のステップ:タグ」で進みます。

![スクリーンショット (133)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/d6cf9090-c5fe-34fc-0a84-c9dd632d780b.jpeg)

内容を確認し「ユーザーの作成」を押す

![スクリーンショット (134)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/bc98ee8d-0a14-1ff6-ed31-b768d6bb7f59.jpeg)


一応`.csv`をダウンロードします。
済んだのち、画面中央のリンクにアクセスし、ログインしてみます。


![スクリーンショット (139)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/06453efc-928c-05bb-5ac0-0cab5ed39989.jpeg)


ログインが済むと、パスワード変更画面が表示されます。
新しいパスワードを設定してください。


![スクリーンショット (136)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/e100b4e4-e80f-b636-899c-9e735ea2872a.jpeg)

パスワード再設定後、先ほど作った`admin`IAMユーザでログインしたことがわかります。


![スクリーンショット (137)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/5e8afa6c-4545-3abb-982a-781d97155393.jpeg)



## IAM プロジェクトユーザを作成

今度はプロジェクトメンバー用のユーザを試しに1つ作ってみます。

もう一度サービスの`IAM`、ユーザーを選択し「ユーザーを追加」を押します。


![スクリーンショット (138)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/decbe947-06c5-60e0-074f-ecf50bebf955.jpeg)

ユーザ作成の部分はほとんど管理ユーザと変わりませんが、
グループはまた新たに作成します。

その時、アタッチするポリシーは今回は以下の4つです
- AmazonEC2FullAccess
- AmazonRDSFullAccess
- AmazonS3FullAccess
- IAMReadOnlyAccess

画像のように検索し、チェックを入れていきます。
その後はまた同じようにグループが作成されたことを確認し、またグループ参加のチェックが入っていることを確認した上で
次に進んでいきます。

![スクリーンショット (141)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/142da54e-78be-af5d-7c50-f2bfbdb8e9e5.jpeg)

内容を確認し「ユーザーの作成」で完了です。

![スクリーンショット (142)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/f138ca5a-f1c5-5e6f-60dd-aa01478a76c6.jpeg)
楽しい数当てゲーム

こんにちは。
今回は、時間を持て余したのでそれを使って、数当てゲームを作ってみました。

#遊び方。
このゲームは隠された数字をヒントをもとに探し出すゲームです。

デフォルトでは。
・aキーを押すと現在のカウントをマイナスします。
・dキーを押すと現在のカウントをプラスします。
・スペースキーを押すと回答を答え合わせします。
・AキーやDキーを押すとちょっと多く操作できます。
・q、w、eキーではワープができます。

最大値に大きな値を入れると迷子になる可能性があります。

#開発環境
Visual Studio2019デス。130行位あります。

#免責
デバッグはしていますが、大体2時間で書いたコードなので抜けはあるかもしれません。

#コード
```C++:Main.cpp
#include <iostream>
#include <cstdint>
#include <tuple>
#include <random>

#include <conio.h>//not standard.


//C++14 needed.

std::intmax_t GetInput() {
	std::intmax_t R = 0;


	std::cin >> R;
	std::cin.clear();

	return R;
}

std::tuple<bool,std::intmax_t, std::uintmax_t, std::uintmax_t> Game(std::uintmax_t N) {

	std::random_device rd;
	std::mt19937 mt(rd());
	std::uniform_int_distribution<std::intmax_t> ui(-static_cast<std::intmax_t>(N), static_cast<std::intmax_t>(N));

	std::intmax_t V = 0;
	std::intmax_t A = ui(mt);
	std::uintmax_t CA = 0;
	std::uintmax_t CM = 0;

	while (true) {
		std::cout << V<<" "<< "\r";
		int Key = _getch();
		//std::cout << '\a';
		CM++;
		if (Key == 'd') {
			V++;
		}
		if (Key == 'a') {
			V--;
		}
		if (Key == 'D') {
			V+=7;
		}
		if (Key == 'A') {
			V-=7;
		}
		if (Key == 'w') {
			V = 0;
		}
		if (Key == 'e') {
			V = N;
		}
		if (Key == 'q') {
			V= -static_cast<std::intmax_t>(N);
		}
		if (Key == 27) {
			return { false,A,CA,CM };
		}	
		std::cout <<"          " <<'\r';
		if (Key == ' ') {
			if (V > A) {
				std::cout <<V <<":L" <<'\r';
			}
			if (V < A) {
				std::cout <<V << ":H" << '\r';
			}
			if (V == A) {
				std::cout <<V << ":GET IT!!" << '\r';
				break;
				
			}	
			CA++;
		}
		
		V = std::max<std::intmax_t>(-static_cast<std::intmax_t>(N), std::min<std::intmax_t>(V, static_cast<std::intmax_t>(N)));

		//V = std::clamp<std::intmax_t>(V, -static_cast<std::intmax_t>(N), static_cast<std::intmax_t>(N));
	}
	std::cout << std::endl;
	std::cout << std::endl;
	return { true,A,CA,CM };
}

int main() {

	std::cout << "Wellcome!!" << std::endl;
	std::cout << "I am Number Hitter!!" << std::endl;

	std::cout << std::endl;
	std::cout << "***You will Find a Number!!***" << std::endl;		
	std::cout << std::endl;

	std::cout << "Input Max Number!" << std::endl;
	std::cout << ">>";
	
	std::intmax_t N = GetInput();

	std::cout << std::endl;
	
	if (N <= 0) { N = 16; }
	std::cout << "You choise Max is " << N << std::endl;

	std::cout << "Let's Start Game!!" << std::endl;
	std::cout << "a key is move Minus. " << std::endl;
	std::cout << "d key is move Plus. " << std::endl;
	std::cout << "Space key is Auth Anther. " << std::endl;
	std::cout << std::endl;

	bool F = false;
	std::intmax_t A = 0;
	std::uintmax_t CA = 0;
	std::uintmax_t CM = 0;
	
	std::tie(F,A,CA,CM)=Game(N);

	if (F) {
		std::cout << "You Find Anther! " << A << std::endl;	
		std::cout << "The Move Count is " << CM << std::endl;
		std::cout << "The Auth Anther Count is " << CA << std::endl;
		if (CA == 1) { std::cout << "You are Wonder!!!" << std::endl; }
	}
	else {
		std::cout << "You Fail!" << std::endl;		
		std::cout << "Anther is " << A << std::endl;
		std::cout << "The Move Count is " << CM << std::endl;
		std::cout << "The Auth Antheris " << CA << std::endl;
	}
 	return 0;
}
```
2019-10-15 NetCDF > configure オプション 「--disable-netcdf-4」> NetCDF-4 APIの有無

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS Linux release 7.7.1908 (Core)
```

### 概要

NetCDFのインストール時のconfigureにてNetCDF-4 API対応の有無について調べた。
ビルドしようとしているソフトがNetCDF-4 APIを使う設定になっており、NetCDFのインストールを間違ったことで、そのソフトがビルドできなかったことがきっかけとなり調べた。

### w/o NetCDF-4 API

```
./configure --prefix=/usr/local/netcdf-4.4.1.1/gcc485 --disable-netcdf-4 --disable-dap
...

# Features
--------
NetCDF-2 API:           yes
HDF4 Support:           no
NetCDF-4 API:           no
NC-4 Parallel Support:  no
PNetCDF Support:        no
DAP Support:            no
Diskless Support:       yes
MMap Support:           no
JNA Support:            no
```

NetCDF-4 APIがnoとなっている。


### w/ NetCDF-4 API

```
./configure --prefix=/usr/local/netcdf-4.4.1.1/gcc485 --disable-dap


# Features
--------
NetCDF-2 API:           yes
HDF4 Support:           no
NetCDF-4 API:           yes
NC-4 Parallel Support:  no
PNetCDF Support:        no
DAP Support:            no
Diskless Support:       yes
MMap Support:           no
JNA Support:            no
```

NetCDF-4 APIがyesとなっている。
github alertが出たときの備忘録

#メールにnode_modulesのバージョンが低く脆弱性があると言われたのでその対処法
１　botからくるプルリクを確認して、リモートリポジトリ内でマージする(ボタン１つで終わる。)
２　ローカルリポジトリにpullする

```
git pull origin プルリクがbotから送られたブランチ名
```
これでオケ。

ちなみに手動でnode_modulesのバージョンをアップデートしてみたが、何故かアラートは消えなかった。
(ラズパイ) VSCodium (VSCode 1.39.2ベース)

(2020-02-13) 1.41.0 から、Codiumの公式のreleasesでも、armhf, arm64のバイナリが配布されるようになりましたね。
> https://github.com/VSCodium/vscodium/releases


(2019-10-28) x10hostは、定期的にファイルが消されてしまう。別のアップロード先を検討しなければ..
(2019-10-16) 1.39.2ベース

VSCode 1.39.1 のビルドがなんとかできました。(ちゃんとした手順は不明..ぉぃ)
が、Extensionのマーケットプレイス(?)が削除されてるんですね？

VSCodium ( https://github.com/VSCodium/vscodium )　のスクリプトで生成したら、使えました。

![2019-10-15-170336_1280x1024_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/7cd56ac8-edfb-8a80-27fe-8ea959c84769.png)


# TL;DR

```bash:VSCodium-1.39.2
curl -LO http://mt08.x10host.com/vscode/codium_1.39.2-1571258974_armhf.deb
sudo apt install ./codium_1.39.2-1571258974_armhf.deb
```

# 実行環境
- Raspberry Pi 3B / 3B+ / 4B
- Raspbian: `2019-09-26-raspbian-buster.img`ベース



# その他
- いろいろためしているうちに、できたので、正常に動作しないとこがあるかもしれません。
- VSCode(code-oss)のdebは、https://file-up.biz/web/file/dl?h=c719c82b4ad03204a1af2a44f29eb7428a82a5ee  10月22日まで.
- ビルド方法については、手順がわかったら、記事を更新します。(もう２度とdebを生成できないかもしれませんが..ぉ)
イメージコピーで作ったwindows10でmackerelを再起動

## 状況

* mackerel-agentが動いているwindowsサーバを運用
* このサーバを並列化などの要件で丸コピする案件が発生
* イメージコピーをつくて、サーバを立ち上げて...
* mackerelが動かない

## 原因

mackerelで監視サーバを一意に特定するIDがかぶっているため。

https://mackerel.io/ja/docs/entry/faq/troubleshoot/agent-not-start
> Docker ImageやAMIなどによりOSイメージ化した際に/var/lib/mackerel-agent/idもコピーしている場合、このファイルを削除する必要があります。

## 対応

/var/lib ... のwindowsでの対応方法をメモっておく

windowsのmackerelでプラグインいれたことがあったりconf書き換えたことがある人は3まで飛ばしてください。

##1. コンポーネントサービスを開く

`サービス` で検索すれば出てくると思います。
その中からmackerel-agentを見つけておく。

##2. 実行ファイルのパスを開く

コンポーネントサービスのmackerel-agentを右クリック => プロパティで実行ファイルのパスを確認

<img width="413" alt="スクリーンショット 2019-10-15 17.11.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53063/239d6f07-664a-b9dc-08a1-b64867a44222.png">

このフォルダに移動します。

##3. idファイルがあるので削除

削除が怖い人はrenameで。

##4. コンポーネントサービスでmackerel-agentを再起動

mackerel-agent右クリックで再起動を選択

##5. ログの確認

イベントビューアーを開き、Windows ログ => Application を選択することでmackerel-agentのログがみれる。
(Mac)Bourbonのインストール〜使用方法

## 環境
Visual Studio Code

## /homeでbourbonのgemをインストールする（home以外でインストールすると、パスを通す必要があるらしい）
```
$ cd /home
$ gem install bourbon
```

## Bourbonを配置したいディレクトリ（scssファイルを配置しているフォルダ等）に移動して、下記コマンド実行
*

```
$ cd xxxxx  // scssを配置しているフォルダ等
$ bourbon install
```

* コマンド実行すると、bourbonフォルダが作成される

## Bourbonを使う
* 使いたいscssファイルでインポートする

```:xxxxx.scss
@import "bourbon/bourbon";
```
* scssファイル保存時（cssファイル生成時）エラーになって、cssが生成されない  

* 下記に修正すると解消された

```:xxxxx.scss
@import "bourbon/_bourbon.scss";
```
Rails アプリを日本語化(翻訳)

Railsで作成したアプリを日本語化する方法、
userというアプリを作成する場合。

アプリ/ja.yml に下のように追記する。

```ja.yml
ja:
  activerecord:
    errors:
      messages:
        record_invalid: 'バリデーションに失敗しました: %{errors}'
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
 #ここから↓↓
    models:
      user: ユーザー
    attributes:
      user:
        id: ID
        name: 名前
        age: 年齢
        created_at: 登録日時
        updated_at: 更新日時
```

このままでは反映されない。

ja.yml を config/locales配下にする。

config/locales/ja.yml の場所にあればOK。

インデントのズレで反映されないのでシビアにチェック！
PCAでパフュームを次元削減してみる

#1.何が出来るの？
　お気に入りの動画をPCA（主成分分析）で次元削減して、GIF動画にするコードを作りました。例えば、こんなものが出来ます。
![320_out_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/8e013d90-b137-e1e4-ab45-c67fd56c3c45.gif)

#2.コード
　カレントディレクトリーの動画 **'movie.mp4'** を読み込み、PCAを実行し、カレントディレクトリーにGIF動画 **'pca_imgs.gif'** を出力するコードです。

```python
import cv2
from PIL import Image
import numpy as np
from sklearn.decomposition import PCA
from tqdm import trange  # プログレスバー　ライブラリー

# 動画の読み込み
cap = cv2.VideoCapture('movie.mp4')
imgs = []
for i in trange(400, desc='capturing video'):  # 先頭から400フレーム読み込み
    flag, img = cap.read()    
    if flag == True:
        #cv2.imwrite('./input/'+'img_%s.png' % str(i).zfill(6), cv2.resize(img, dsize=(420, 240)))  # フォルダーに保管
        img = img[:, :, ::-1].copy()  # BGRをRBGに変換
        img = Image.fromarray(img).resize((420, 240))  # PIL.Imageにして、420*240にリサイズ
        img = np.asarray(img)  # 配列に変換
        imgs.append(img)         
    else:
        break
imgs = np.array(imgs)  # numpy配列に変換
imgs = imgs.reshape(imgs.shape[0], imgs.shape[1] * imgs.shape[2] * imgs.shape[3])  # 1次元に変換   

# PCA実行
print('starting PCA...')
pca = PCA(n_components=320)  # n_components は読み込んだ画像枚数以下とする  
trans = pca.fit_transform(imgs)  

# gif動画作成
interval = 3  # 3枚おきに動画を作成
pca_imgs =[]
for i in trange(200, 300, desc='making gif'):  # 200フレームから300フレームを読み込み
    if i % interval == 0:
       pca_img = trans[i].dot(pca.components_).reshape((240, 420, 3))  #内積を取り、シェイプを戻す
       pca_img = Image.fromarray((255 - pca_img).astype(np.uint8))  # PIL.Imageに変換 
       #pca_img.save('./output/'+'img_%s.png' % str(i).zfill(6))  #　フォルダーに保管
       pca_imgs.append(pca_img)
pca_imgs[0].save('./pca_imgs.gif', save_all=True, append_images=pca_imgs[1:], 
             duration=100, loop=0)  # duration:表示速度（m秒）
```
![スクリーンショット 2019-10-12 13.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/2effda08-9636-5223-a4d9-6da81f8e50b6.png)

コードを実行すると、こんな感じでプロセスの進捗状況が逐次表示され、GIF動画が出来ます。

#3.コードの補足
　コードの内容は、コメントを見て頂ければ分かると思いますが、少し補足します。

**1)プログレス・バーの表示**
　割と処理時間の掛かるコードなので、**tqdm** を使ってプログレス・バーを表示しています。

　使い方は、**>pip install tqdm** でインストール。コードは、**from tqdm import trange** でインポート、後は forループを **for i in trange(ループ指定, desc='名称'):** とするだけ。

　コードを実行すると、先頭に'名称'が付いたプログレス・バーが自動的に表示されます。とても、簡単。

**2)オプション**
　「動画の読み込み」にあるコメントアウトを外すと、'input'フォルダーに読み込んだ画像を保存します（'input'フォルダーは事前に作っておいて下さい）。

　「gif動画作成」にあるコメントアウトを外すと、'output'フォルダーにGIF画像にする元画像を保存します（'output'フォルダーは事前に作っておいて下さい）。　

#4.次元削減数による効果
　「PCA実行」にある **n_components** で次元削減数を設定出来ます。次元削減数を変化させた時の画像の変化を見てみましょう。
![スクリーンショット 2019-10-12 13.56.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/0d679aa6-e737-c4a8-5692-d32022ea4134.png)
流石に、n_components =10 まで行くと、何が何だか分からなくてなりますね。n_components = 40 でGIF動画を作ってみます。
![40_out_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/caed0897-36af-9026-691f-e2a453c9e5f2.gif)
パフュームだとこういう映像効果、もう既にやってそうですね（笑）。
[Mac]コーディングでよく使うショートカット[Atom]

MacのAtomで主にHTML、CSSをコーディングするときのショートカットの自分用メモ

#開発環境
Mac:  macOS Sierra バージョン10.12.6
Atom: バージョン1.40.0

#カーソル移動
このショートカット知るまで矢印(→、↑、↓、←)でカーソル移動してたのでめっちゃ不便だった。。。

| ショートカット | 説明 |
|:-----------:|:------------:|
| control + F | カーソルを１文字右に移動 |
| control + B | カーソルを１文字左に移動 |
| control + P | カーソルを１文字上に移動 |
| control + N | カーソルを１文字下に移動 |
| control + A | カーソルを文の先頭/文頭に移動 |
| control + E | カーソルを文の末尾/文末に移動 |
| control + M | 開始タグと閉じタグ間を移動 |

#削除
| ショートカット | 説明 |
|:-----------:|:------------:|
| control + D | カーソルの右の１文字を削除 |
| control + H | カーソルの左の１文字を削除 |
| control + K | カーソルの右から文末まで削除 |

一行削除したい場合は、control + A、control + Kがおすすめ

#貼り付け
| ショートカット | 説明 |
|:-----------:|:------------:|
| control + Y | control + Kで削除した文字を貼り付け |

#選択
| ショートカット | 説明 |
|:-----------:|:------------:|
| Shift + control + E | カーソルの右から文末まで選択 |
| Shift + control + A | カーソルの左から文頭まで選択 |

control + Aで文頭までカーソルを移動させ、Shift + control + Eでその1行全てを選択

#Emmet
Atomに追加できる拡張機能
HTML&CSSのコーディングが爆速に

##導入方法
Preferencesからinstallを選択し、Emmetを検索してインストールするだけ

##HTML
コマンドを入力し、Tabを打ち込むだけでタグを生成できる
以下に一例を示す

```html
<!--（コマンド) div -->
<div></div>

<!--(コマンド) ul>li -->
<ul>
  <li></li>
</ul>

<!--(コマンド) h1+p -->
<h1></h1>
<p></p>

<!--(コマンド) ul>(li>a)*3 -->
<ul>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
</ul>

<!--(コマンド) div.className -->
<div class="className"></div>

<!--(コマンド) div#idName -->
<div id="idName"></div>

<!--(コマンド) ! -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
```

##CSS
HTMLと同様にプロパティの頭文字を打ってTabでコードを生成できる
以下に一例を示す

```css
/*(コマンド) bz:b*/
-webkit-box-sizing: border-box;
box-sizing: border-box;

/*(コマンド) w:100*/
width: 100px;

/*(コマンド) bgc*/
background-color: #fff;

/*(コマンド) ta:c*/
text-align: center;

/*(コマンド) d:f*/
display: -webkit-flex;
display: -ms-flex;
display: flex;
```
ベンダープレフィックスも自動的に書いてくれるから非常に便利で書き漏らしが減る
基本的にプロパティの頭文字だが、ものすごい量のコマンドがあるのでひとつずつ覚えていくしかない
↓コマンド一覧
https://docs.emmet.io/cheat-sheet/

#参考資料
[テキスト入力が死ぬほどはかどるMacショートカットキー15個](https://www.find-job.net/startup/mac-shortcut)
[「はじめて」でも簡単！Emmetの使い方とよく使うパターン集](https://haniwaman.com/emmet/)
2019-10-15 NetCDF > error > undefined reference to `nf_def_var_deflate_' > NetCDF version 4の関数によるエラー

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS Linux release 7.7.1908 (Core)
```

WRF (Weather Research and Forecasting Model)関連。

### 関連

- [NetCDF > Error: Function 'nf_def_var_deflate' at (1) has no IMPLICIT type > --has-nc4がnoになっている](https://qiita.com/7of9/items/51b0c699002a6e005418)

### 概要

- WRFの後処理で使うとあるソフト(F****T)のビルドに失敗する
    - `undefined reference to `nf_def_var_deflate_'`

### nf_def_var_deflate_

NetCDF version 4対応でNetCDF(C APIとFortran API)をインストールした場合、netcdf.incにnf_def_var_deflate_の記載が見つかる。

一方で、NetCDF version 4未対応でNetCDFをインストールした場合、netcdf.incに記載が見つからない。

nf_def_var_deflate_はNetCDF version 4で用意された関数のようである。


### 対応

NetCDF version 4対応でNetCDFをインストールしたにも関わらず、やはり上記のエラーは出るようである。

NetCDF v4.4.1.1, NetCDF(Fortran API) v4.4.4の組合せでインストールしている。

NetCDF version 4対応をしないようにF****Tのビルド用設定ファイルを変更することで、エラーは回避できた。

```
#NETCDFVERSION=4
NETCDFVERSION=3
```

この場合、NetCDF version 4による圧縮機能が使えなくなり、出力のNetCDFファイルのサイズが大きくなる。

### 関連

- [NetCDF > 異なるサイズの.ncファイル | 同じncdump結果 > NetCDFのバージョン3と4の違い](https://qiita.com/7of9/items/5782324c2a078d45debd)

> Version 3にした理由はメモに残っていない。

おそらく上記と同じ問題があり、Version 3として対応したものと思われる。
詳細は追いきれてはいないが、gccのバージョンによっては、この問題が出る場合と出ない場合があるようだ。
3年前の作業時には一つのgccではversion 4でビルドしており、もう一つのバージョン(gcc version 4.9.2)ではversion 3としてビルドしている。
ラズパイ上でMediaPipeを動作させる

Desktop PCやiOS、Androidへのビルドドキュメントはあるのにラズパイ用はない...非推奨？？
一個一個のnodeはtfliteなので、EdgeTPU利用でアプリケーション動作しそうなものだけど。


## bazelのinstall
buildにbazelが必要。aptでさらっと入れれないためビルドする。細かい入れ方はPINTOさんの記事そのものなので以下を参考に。
 - https://qiita.com/PINTO/items/ecdab78dda6868221aee
    - 記事中でも入れてるがzramなどメモリ対策しておかないとビルド中にOut Of Memoryして終わる...



## OpenCV、ffmpegのinstall
ここはMediaPipeのInstalling MediaPipeに記載のとおりに入れれるので入れる。

```
$ sudo apt-get install libopencv-core-dev libopencv-highgui-dev \
                       libopencv-imgproc-dev libopencv-video-dev
```


## MediaPipeのビルド
```
$ export GLOG_logtostderr=1
$ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
    mediapipe/examples/desktop/hello_world:hello_world
```
Hellow Worldと出ればOK


## Hand Trackingを動作させる 
次ここを動かしたいが、ビルド途中で止まる...
ここはラズパイならではの処理が色々と必要そうなので簡単にはいかなさそう。
@IBActionで紐づけたのにunrecognized selector sent to instance

# 現状
こんなメソッド書いて`Storyboard`とも紐付けたのにこれ

```swift
@IBAction func hoge(sender: AnyObject) {
//huga
}
```

```
unrecognized selector sent to instance
```

# 対策
このエラーは状況によって色々解決策あるようですが
僕の場合は
**`hoge`メソッドを2回同じUIに繋いでいた**
ことが原因でした。
(`Storyboard`で`対象のVC Scene`->`四角のやつ(First Responderの左)`->`Received Action`
あるいは`繋いだUI`->`Sent Events`でメソッドとUIをどう繋いだかは確認可能)

# 参考
**・[【iOS】ちゃんと紐付けたはずのIBOutletがUnrecognized Selectorになってクラッシュする時に試すこと - Qiita](https://qiita.com/ruwatana/items/7cfc63ce102938962260)**
composer require が止まって全然うごかねえ

バグってんのかって思ったが

https://yuzurus.hatenablog.jp/entry/composer-hayai

これで動く

ただし、時代が時代なので、このまま使うと

 [Composer\Downloader\TransportException]
  Your configuration does not allow connections to http://packagist.jp/packages.json.
  See https://getcomposer.org/doc/06-config.md#secure-http for details.

と出てしまう

https://qiita.com/shinkuFencer/items/00c6cdbc0d0e0e081e38

httpsにすればよし
pipでパッケージをインストールしたはずなのにModuleNotFoundErrorが発生する問題

# 事象
pipで必要なパッケージを追加したのにプログラム実行時にModuleNotFoundErrorが発生してしまう．

# 原因
pipの向き先が誤っていた．
virtualenvで追加したpython3.7の実行環境にパッケージを追加したいのにpython3.6の実行環境に追加されていた．

# 解決方法
`$(which python)`で正しい向き先を指定する．

```bash
sudo $(which python) -m pip install mysqlclient
```
Raspberry PiへTensoflow/KerasのInstall

## 環境
2019/10/15現在
Raspberry Pi 3B
Raspbian Strech

##  インストール
前準備

```
$ sudo apt-get install git gcc make openssl python3-dev
$ sudo apt-get install libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ sudo apt-get install tk-dev python-tk libfreetype6-dev
$ sudo apt-get install pkg-config libjpeg8-dev libpng12-dev
$ sudo apt-get install python3-numpy python3-scipy python3-matplotlib python3-h5py
```


## TensorFlow

インストールする

```
$ pip3 install tensorflow

Collecting tensorflow
  Downloading https://www.piwheels.org/simple/tensorflow/tensorflow-1.14.0-cp35-none-linux_armv7l.whl (100.7MB)
    47% |███████████████▎                | 48.0MB 5.4kB/s eta 2:43:30
THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
    tensorflow from https://www.piwheels.org/simple/tensorflow/tensorflow-1.14.0-cp35-none-linux_armv7l.whl#sha256=cba22b6d9a3e7a92c07e142bd5256c9773fd20c18090cb1d222357d3b3028655:
        Expected sha256 cba22b6d9a3e7a92c07e142bd5256c9773fd20c18090cb1d222357d3b3028655
             Got        deee69199d8775d6d809b0f45c50d7f2ba88f181552e93db1180dfcd5e659929
```
→エラーする

調べると直接whlを落としてきてinstallすると良いとのこと


再度インストール

```
$ wget https://www.piwheels.org/simple/tensorflow/tensorflow-1.14.0-cp35-none-linux_armv7l.whl
$ pip3 install tensorflow-1.14.0-cp35-none-linux_armv7l.whl 
```

Tensorflow利用時にnumpyのエラーが発生する。
　- https://qiita.com/Tarooo000/items/dcce992672c7ea539049

```
# 以下で対応
$ pip3 install numpy==1.16.4
```

## Keras
```
$ pip3 install keras
```
こちらは素直に入った
【VSCode】ワークスペース毎に文字コードを設定する。

メモとして残します。

ワークスペースを保存すると下記のファイルが作成される。
`ワークスペース名.code-workspace`
これをエディタで開き、下記のように`"files.encoding": "文字コード"`を追記。


#■やり方

```json
{
	"folders": [
		{
			"path": "D:\\project_tmep\\"
		}
	],
	"settings": {
		//下記を追加
		"files.encoding": "EUC-JP"
	}
}
```
いちいちエンコード指定して開きなおすのは正直面倒。
欲を言えば、ディレクトリ毎に設定できたらもっといい。
[漏洞预警]CVE-2019-14287/sudo提权漏洞

### 漏洞描述
2019年10月14日,CVE组织公开了一个新的主机漏洞，其编号为CVE-2019-14287.该漏洞主要由sudo程序造成.用户可以使用特定的payload,满足以下三个条件的情况下可进行提权到root权限.目前poc已经公开,请广大厂商及时升级sudo版本且做好sudo用户列表管理.
###### 1.sudo version < 1.8.28
###### 2.知道当前用户密码
###### 3.当前用户存在于sudo权限列表
### CVE编号
CVE-2019-14287
### 漏洞威胁等级
低危
### 影响范围
1.8.28以前版本
### 漏洞复现
使用payload进行验证

```
sudo -u#-1 任意命令
```

![使用payload进行验证](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/494b25b2-6e18-c1cd-cfea-f6dba5d072e3.png)

经过尝试 macOS不受影响

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/67b80936-dcbd-bb8d-fada-2001c76d6a13.png)


### 修复建议
1.升级sudo到1.8.28版本
2.做好sudo用户列表管理
【Unity】プレビュータブでカメラとUIの表示領域を一致させる

#手順
1．Canvas -> Render Modeを 「Screen Space -Overlay」から「Screen Space Camera」に変更する。
2．Render CameraにHierarchyのMain Cameraをドラッグ&ドロップ

#参考サイト
[【Unity】Canvasの大きさをカメラの範囲内に収めるように調節する方法](https://miyagame.net/canvas-size/#UnityCanvas)
Some Facts About Visual Hires That Would Impress Your Audience

![uploading-0]()
It is vital for you to have an online content which is visual so you could have it for your event. You just need to think that how do you preserve content online? Visual content is taking the place in the market and you must have it at your event. It is very essential for you to have Visual Hire for your event so that you could make your event attractive as it would help you to get success that you want to get. There are some things that you must keep in your mind which would give you more knowledge. 
Quality Surely Matters:
You do not need to hire a professional photographer for your event marketing in order to take all the pictures of everyone and of every aspect at your event. It is obviously important to have amazing and professional pictures of every performance or of every speaker at your event, but the most vital thing that you need to have is the quality of the pictures that you use in your content. 
You are also supposed to make sure that you get clear and vibrant pictures without having and copyright problems. Your motive must be to show people an honest representation of what your event is about, so this way the suitable and right people would aspire to purchase the tickets of your event and they would be able to see all the amazing things according to their expectations. You definitely want a big success of your event so therefore you should not do compromise for the quality of things at your event, as quality matters a lot. 
You Have to Make Your Event Memorable:
It is studied that 10 percent things are remembered by people which they hear and if you show them the things, they would remember it 65 percent which would be great and amazing for your event. If we talk about the pictures, then it enhances our memory but if you use latest pictures which are related directly to your event that could make your material even more remarkable. 
Audio Visual Enhances Attention to Your Event:
You really need to get <strong><b> </b></strong><a href="https://www.ems-events.co.uk/"><strong><u><b>Visual Hire</b></u></strong></a><strong><b> </b></strong> so that it would be helpful for you to make your event much amazing and great. When people would see pictures at your event then this way, they would be engaged with your event more. People always prefer to see images rather than listening so it is always better to show them things so that they could understand it better. 
You Must Make Things Affordable at Your Event:
The tools would be great and amazing for you to generate captivating and amazing visuals that would be exquisite for generating visualizations and infographics. You can also have a look at Ems-Events if you want to get detailed information and it would also help you to know various things that would be beneficial and important for your event and would help you to know more about it. This way you would also be able to generate new ideas as well.
Node.js: 外部パッケージを使わずに14行で作るHTTPリバースプロキシ

この投稿では、外部パッケージを一切使わずに、Node.jsビルトインモジュールだけで作る、たった14行のHTTPリバースプロキシの実装を紹介する。なお、本稿のサンプルコードはTypeScriptで提示する。


## 14行のHTTPリバースプロキシの実装

ここで紹介するリバースプロキシの実装は、主に次の流れでHTTPリクエストをさばく:

1. リバースプロキシは普通のHTTPサーバとして起動する。
2. リバースプロキシは、クライアントからのリクエストを受け取ったとき、バックエンドサーバ向けのHTTPリクエストを新たに生成する。
3. クライアントからのリクエストをコピーし、バックエンドにリクエストを送る。
4. リバースプロキシは、バックエンドからレスポンスを受け取ったとき、それをクライアント向けレスポンスにコピーし、クライアントにレスポンスを返す。

```typescript
import {createServer, request} from 'http'

createServer((clientReq, clientRes) => {
  // クライアントから受け取ったリクエストを、バックエンドサーバに送る処理
  const serverReq = request({
    host: '127.0.0.1', // バックエンドHTTPサーバのホスト
    port: 9000, // バックエンドHTTPサーバのポート
    method: clientReq.method,
    path: clientReq.url,
    headers: clientReq.headers,
  }).on('error', () => clientRes.writeHead(502).end()) // バックエンドサーバとの通信エラーが発生した場合
    .on('timeout', () => clientRes.writeHead(504).end()) // バックエンドサーバとの通信がタイムアウトした場合
    .on('response', serverRes => {
      // バックエンドから受け取ったレスポンスをクライアントに送る処理
      // ステータスコードやヘッダをそのまま送る
      clientRes.writeHead(serverRes.statusCode!, serverRes.headers)
      // HTTPボディはストリームパイプで流す
      serverRes.pipe(clientRes)
    })
  // リクエストのHTTPボディはストリームパイプで流す
  clientReq.pipe(serverReq)
}).listen(8000) // リバースプロキシサーバのポート
```

HTTPボディについては、大きなデータが来てもメモリを消費しにくいよう、ストリームのパイプで受け渡すようにしている。

## 使用例

バックエンドサーバとリバースプロキシサーバを組み合わせた完全なコードを以下に示す。

```typescript
import {createServer, request} from 'http'

// バックエンドサーバ
createServer((req, res) => {
  res.writeHead(200, {'X-Custom-Header': 'Header from backend server'})
  res.end('Response from backend server')
}).listen(9000)

// リバースプロキシサーバ
createServer((clientReq, clientRes) => {
  const serverReq = request({
    host: '127.0.0.1',
    port: 9000,
    method: clientReq.method,
    path: clientReq.url,
    headers: clientReq.headers,
  }).on('error', () => clientRes.writeHead(502).end())
    .on('timeout', () => clientRes.writeHead(504).end())
    .on('response', serverRes => {
      clientRes.writeHead(serverRes.statusCode!, serverRes.headers)
      serverRes.pipe(clientRes)
    })
  clientReq.pipe(serverReq)
}).listen(8000, () => {
  // リバースプロキシサーバにリクエストを送ってみる処理
  request({host: '127.0.0.1', port: 8000, method: 'GET', path: '/foo/bar'})
    .on('response', response => {
      console.log(response.statusCode)
      console.log(response.headers)
      response.pipe(process.stdout)
    })
    .end()
})
```

実行結果:

```
200
{
  'x-custom-header': 'Header from backend server',
  date: 'Tue, 15 Oct 2019 07:05:56 GMT',
  connection: 'close',
  'transfer-encoding': 'chunked'
}
Response from backend server
```

## 様々なユースケースを想定した動作デモ

[GitHubのほう](https://github.com/suin/nodejs-playground/tree/master/http-reverse-proxy)にこのプロキシサーバの使用例をいくつか実装している。

バックエンドサーバーがIPC(Unixドメインソケット)の場合、バックエンドサーバーがストリームレスポンスを返す場合、バックエンドサーバーのレスポンスが遅すぎてプロキシサーバでタイムアウトさせる場合などのサンプルがある。
Calculateの使い方（PowerBI/PowerPivot/DAX）

PowerBI/PowerPivot（以下、総称してDAXと呼びます）で非常に重要な意味合いを持つCaluculate関数について、書いてみたいと思います。この関数については、単に処理内容を理解するだけでは不十分です。裏側でDAXが処理しているコンテキストの変換についての理解がなければ、最悪の場合、間違った集計値を出してしまうかもしれません。逆に言えば、Calculateを理解できれば、DAXの理解は大きく前進します。そのくらい重要な関数です。

なぜこの関数がそれほど重要かというと、やはりコンテキストの概念が大きく関係しているからです。コンテキストの解釈によってPowerBIやPowerPivotはGUI上における直感的な分かりやすさを得ている反面、難しさや取っ付きにくさの原因にもなっています。つまり、あらゆる意味で「肝」になっている部分なのです。

今回は、Calculate関数の基礎部分を見ていきます。Calculateを理解するにあたって、その代表的な使い方のひとつである「売上割合の算出」を使います。

基本的な計算は
「売上高」/「総売上高」
です。

非常に単純な計算ですが、DAXではフィルターが関係します。分母は総売上高なので、フィルターの影響を除外する必要があります。つまり、フィルターをクリアする必要があります。

## ALL関数について
ALL関数を使えば、フィルターをクリアできます。式としては、以下のようになります。


売上割合 =
DIVIDE（
     SUM（売上明細 [売上]）、
     SUMX（ALL（売上明細）、売上明細[売上]）
）

この式は正常に動作します。ALLでフィルターをクリアした売上明細テーブルをSUMXでイテレーションして総合計を算出しています。

![Calculate1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499774/cbe3196f-bf90-53ec-2b35-d67682e94b7a.png)

ただし、ここにフィルターを掛けると、想定通りには動きません。

![Calculate2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499774/991eda11-3805-33e7-c459-9073fa456f24.png)

この状態では、「トップス」「小物」カテゴリーに対して、商品のフィルターがかかっています。（PCバッグとTシャツだけを抽出しています）　つまり、「トップス」「小物」の数値は、PCバッグとTシャツの売上高のみ抽出されて合計されています。ですから、この場合の「総計」はPCバッグとTシャツの売上高のみ抽出された結果としての総計でなければ不自然です。

にもかかわらず、ここでの売上割合は「総合計」に対する売上割合になっています。スライサーでかけたフィルターが反映されず、分母は全商品の総売上高になっています。そのため、「総計」の売上割合も100％ではなく、これら商品の売上割合を表す数値になっています。（総売上高に対する売上割合、という意味で考えれば間違った数値ではありませんが、この表における文脈で考えれば不自然です）

これを解決するには、分母を「スライサーで選択したフィルターを適用したうえでの総合計」にする必要があります。

## Calculateを使う
特定のフィルターをクリアするには、Calculateを使います。
Calculateの最初の引数は、評価実行する式を取ります。2つ目以降の引数では、既存のフィルターを置き換える新たな条件を指定します。
例を見てみましょう。

=DIVIDE(
    SUM('売上明細'[売上]),
        CALCULATE(
            SUM('売上明細'[売上]),
            ALL('商品'[商品カテゴリー])
        )
    )

この例は、先ほどALL関数のところで見た式をCalculateを使って書き直したものになります。

Calculateは、以下のような処理を行います。

・2番目の引数であるALL('商品'[商品カテゴリー])によって、商品カテゴリー列へのフィルターをクリア
・その状態で'売上明細'[売上]を評価し、SUM('売上明細'[売上])を実行
・集計した値を返します

その結果、下記のようになります。（行に指定しているのは'商品'[商品カテゴリー]です。スライサーで'商品'[商品名]を選択しています）

![Calculate3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499774/67b14ded-57f1-2693-8c61-c89e5acf716d.png)

これで、スライサーで指定した'商品'[商品名]のフィルターを維持したまま、各カテゴリーの売上割合を出すことができました。CalculateでALL('商品'[商品カテゴリー])を第二引数に指定することで、クリアするフィルターを明示的に指定しています。その結果、スライサーで指定している商品名のフィルターは維持されたまま集計することができています。

なお、ここでは商品テーブルでしかフィルターのクリアを行っていません。にもかかわらず、'売上明細'[売上]を合計しています。'売上明細'[売上]のフィルターはクリアしていません。しかし、最終結果としては、'商品'[商品カテゴリー]列へのフィルターがクリアされた総売上高が返されています。

これは、フィルターの伝播によるものです。リレーションシップで定義された関係性の方向により、フィルターのクリアも伝播されます。'商品'[商品カテゴリー]でクリアしたフィルターは売上明細テーブルの該当列におけるフィルターもクリアします。これにより、'商品'[商品カテゴリー]へのフィルターの影響を除外した売上合計を算出することが可能になっているわけです。

![フィルター伝播.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499774/12524b75-ce1f-2fc7-8882-e3ce199dcd97.png)

ここではCalculateの引数にとっているのは非常に単純な数式のみでしたが、FILTER関数と組み合わせて、より高度なフィルター操作も可能です。それについては項を改めて書くことにします。
MacOS Catalinaでbashをzshにせよという警告文を消す方法

macOS Catalinaでは、デフォルトのシェルがzshになりました。

この記事を、 `.bash_profile` とかの移行とかめんどくさいし、そのまま使い慣れた `bash` を使いたいというあなたへ送ります。

# macOS Catalinaでbashは使えるのか？
macOS Catalinaでbashは使えます。

macOS MojaveからmacOS Catalinaにアップデートした方はデフォルトはbashのまま。
クリーンインストールした方は、デフォルトがzshなので以下のコマンドでbashにできます。

```bash:bash
$ chsh -s /bin/bash 
```

しかし、この状態でいつものターミナルを開くと以下のような警告が毎回出てきます。

```:bash
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

警告が出たままbashを使い続けることもできますが、毎回この警告が出てこられるのは嫌ですよね。
次のコマンドを実行すると簡単に警告を消す事ができます。

# 警告を消す方法

```bash:bash
$ echo "export BASH_SILENCE_DEPRECATION_WARNING=1" >> .bash_profile
```

これを実行して環境変数に書き込むだけです。簡単ですね。
制御の反転（Inversion of Control、IoC）

本記事では制御の反転（Inversion of Control、IoC）について出来る限りシンプルに紹介します。

ここでは、プログラムを以下の2つに分類します。
- 再利用可能なプログラム
- アプリケーション固有のプログラム

# 伝統的な手続き型プログラム

伝統的な手続き型プログラムではアプリケーション固有のプログラムから再利用可能なプログラムを呼び出します。

![](http://yuml.me/diagram/class/[アプリケーション固有のプログラム]呼び出す-.->[再利用可能なプログラム])

このような再利用可能なプログラムはライブラリと呼ばれます。

# 制御の反転

一方で制御の反転を採用したプログラムでは再利用可能なプログラムからアプリケーション固有のプログラムを呼び出します。

![](http://yuml.me/diagram/class/[再利用可能なプログラム]呼び出す-.->[アプリケーション固有のプログラム])

このような再利用可能なプログラムはフレームワークと呼ばれます。


# 参考にしたサイト

- [制御の反転 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E3%81%AE%E5%8F%8D%E8%BB%A2)
- [制御の逆転](http://bliki-ja.github.io/InversionOfControl/)
LeetCode ::: 26 /// Remove Duplicates from Sorted Array

:lemon: :pear: `思考回路`
> 「Two Pointer」というアプローチを使ってみました。

- まず、配列の長さが 0 だったら、もう用がないので、リターンします。
- 変数 i を用意し、ポインタ①号として 0 を代入しておきます。
- インプットの配列をループします。
- 通常 for ループの中だけで使う変数 j はポインタ②号で 1 を代入。
- で、ポインタ①号とポインタ②号、それぞれ指した配列のアイテムを比較します。
- もし二つのアイテムが違ったら、i が指したアイテムを j が指したアイテムに置き換えて、i 足す 1 で次のループへ移行します。
- 最後の i + 1 は実際にユニークなアイテムの数量です。

---
<p class="codepen" data-height="735" data-theme-id="0" data-default-tab="result" data-user="jujuriri" data-slug-hash="RwwWgOR" style="height: 735px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="LeetCode ::: 26 /// Remove Duplicates from Sorted Array">
  <span>See the Pen <a href="https://codepen.io/jujuriri/pen/RwwWgOR">
  LeetCode ::: 26 /// Remove Duplicates from Sorted Array</a> by jujuriri (<a href="https://codepen.io/jujuriri">@jujuriri</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
---
:apple: :green_apple: `参考したサイト、助かりました`
[Tackling Algorithms: Counting Unique Values](https://dev.to/denisepen/tackling-algorithms-counting-unique-values-1a5n)