OmniAICreator/Qiita-1.07M huggingface dataset:
AdMobをAndroidに組み込んでみよう（環境設定編）

AdMobをAndroidに組み込んでみようという事で覚書
元にした内容
https://developers.google.com/admob/android/quick-start#kotlin
■Step1.プロジェクト作成
---
・プロジェクトを作成する場合
今回はAndroidなので「Phone and Tablet」を選択し
「Empty Activity」を選択後「Next」で次の画面に移ります。
![2020-06-16 (0).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/574749c1-16b4-41ab-6c29-f787b5b7ba83.png)
今回はNameを借りに「AdMob01」とします。
開発言語は「Kotlin」を選択してください。
![2020-06-16 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/4cbf8ada-f108-58af-03ef-71f0d6d7e3e4.png)
最後「Finish」でプロジェクト作成が終了します。
■Step2.プロジェクトの設定
---
・「build.gradle」の設定
「repositories」の「Google()」が入っている事を確認してください（なければ足して）
![2020-06-16 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/d6f5a0db-9700-1182-7e2f-c07cdde9ddda.png)
・「build.gradle」の設定
「deoebdencies」に

```text:
implementation 'com.google.android.gms:play-services-ads:19.1.0'
```
を追加してください。
![2020-06-16 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/b1d0c634-3fe9-db6d-9582-3c945dc46b68.png)
・マニフェストの設定
マニフェストにMeta-dataを追加します。

```text:
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-3940256099942544~3347511713"/>
```
ca-app-pub-**** な文字列はデモではこれでよいですが、本番では登録したものを使用してください
![2020-06-16 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/8a02e759-f5b7-f4fc-d9c1-a04ef412a6cf.png)
これで初期設定は完了です。
■Setp3：広告
広告にはいくつかのパターンがあるのでそれに合わせて分岐します
・AdMobをAndroidに組み込んでみよう（バナー広告編）
  https://qiita.com/sanoh/items/8c18b580613d40f80d1b
・AdMobをAndroidに組み込んでみよう（全画面広告編）
  https://qiita.com/sanoh/items/de86f1c8b00b89dfccd8
・AdMobをAndroidに組み込んでみよう（Video広告編）
  https://qiita.com/sanoh/items/89f17320567faf9ba9ae
新しいMacを移行ツールでセットアップした後にやる事リスト

# 移行ツール雑感
基本的にはとても優秀だと思う。

HOMEディレクトリ内のファイルや各種アプリケーションなど期待を上回るレベルでかなりちゃんと網羅的に移行できてるけど、やっぱり追加で作業が必要なものもあるようなので、備忘録としてメモしておく。


# 大量のアプリが色んな許可を求めてくるのでせっせと許可する。
セキュリティ許可を求めるダイアログはみんながみんな最前面に表示でだしてくるせいで、セキュリティとプライバシーの設定ウィンドウが隠されて操作しにくいけど頑張って許可を与え直す。


# ホスト名を変える
システム環境設定＞共有 でホスト名を変更する


# TouchIDの指紋を登録＆リネームする
- 指紋登録がやり直しなので複数指登録してる分が足りなくて地味に不便なので登録し直す。
- あと「指紋１」とかになってるので「右人差し指」などといつものようにリネームする


# キーボードの設定で CapsLock の割当を直す
CapsLock は Control キーに置き換えてたのがもとに戻ってるので再設定する。


# ディスプレイの解像度を変更する
システム環境設定＞ディスプレイ　で解像度がデフォルトに戻ってるので「スペースを拡大」にする。


# brewを使えるようにする
一度実行してみると ↓ コマンドを実行しろっていわれるのでするだけです。一瞬で終わります。

```bash
sudo xcodebuild -license accept
```


# sudoでTouchIDが使えるようにする
使えなくなってるはずなのでもう一度以下スクリプトを実行する。

```
curl -sL https://gist.github.com/kawaz/d95fb3b547351e01f0f3f99783180b9f/raw/install-pam_tid-and-pam_reattach.sh | bash
```


# VPN設定などが消えてるので新しく作る
ネットワーク環境設定から頑張る。


# VPN設定が作りなおされて各VPN設定の GUID が変わるので ~/.ssh/config を調整する。
こういう事してる奴。
- https://twitter.com/kawaz/status/649427059966504960
- https://gist.github.com/kawaz/8bd7db8416f90c3cc168f12c8c75b6d3
Xcodeのインデントについての知見

Swiftでmapやreduceなどを使ったりクロージャーを使うメソッドを使ってチェーンメソッドを組むと、いつの間にかインデントがおかしくなることがあります。そして、Xcode標準の自動リインデントを使っても、このインデントの不自然さは改善されません。

```swift:おかしい例
class Hoge {

    var array: [Int] = (0 ... 100).map { $0 }

    func method() -> String {
        return array
            .map { (n) -> Int in
                return n % 5
        } // ←ここがおかしい！
        .compactMap({ (m) -> String? in
            return m == 0 ? nil : String(m)
        })
            .joined(separator: ", ") // ←ここがおかしいように見える...
    }

}
```

```swift:期待する形の例
class Hoge {

    var array: [Int] = (0 ... 100).map { $0 }

    func method() -> String {
        return array
            .map { (n) -> Int in
                return n % 5
            }
            .compactMap({ (m) -> String? in
                return m == 0 ? nil : String(m)
            })
            .joined(separator: ", ")
    }

}
```

この、謎インデント挙動は、`Trailing Closure`を用いた時に起きるようで、`{`だけで記述するとXcodeが不機嫌になるっぽいです。
今回の場合は、下のように書くと自動リインデントできれいに整形されます。

```swift
class Hoge {

    var array: [Int] = (0 ... 100).map { $0 }

    func method() -> String {
        return array
            .map({ (n) -> Int in
                return n % 5
            })
            .compactMap({ (m) -> String? in
                return m == 0 ? nil : String(m)
            })
            .joined(separator: ", ")
    }

}
```

***
下のような場合も同様

```swift:おかしい例
extension Int {
    func hoge(num: Int, callback: (_ v: Int) -> Void) -> Int {
        let newNum = self + num
        callback(newNum)
        return newNum
    }
}

class Hoge {

    var array: [Int] = (0 ... 100).map { $0 }

    func method() -> String {
        return array.map { (n) -> String in
            return n
                .hoge(num: 4) { (m) in
                    print(m)
            }              // ここがおかしい！
            .description   // ここがおかしい！
        }
        .joined()
    }

}
```

```swift:改善版
extension Int {
    // （中略）
}

class Hoge {

    var array: [Int] = (0 ... 100).map { $0 }

    func method() -> String {
        return array.map { (n) -> String in
            return n
                .hoge(num: 4, callback: { (m) in
                    print(m)
                })
                .description
        }
        .joined()
    }

}
```
[Ruby] 真偽知を返すメソッド

Progate学習メモ
メソッドの戻り値に条件式を記述して真偽知を返すようにする

```.rb
def shipping_free?(price)
  return price >= 3000
end
```
**真偽値を返すメソッドは、メソッド名の末尾に「?」をつける慣習がある。**
このメソッドは、priceが3000以上だとtrue、
priceが3000より少ないとfalseを返す

if文に組み込むとこんな感じ

```.rb
if shipping_free?(4000)
  puts "送料無料です。"
else
  puts "送料５００円がかかります。"
end
```
これの実行結果は、

```console
送料無料です。
``

---
参考：[Progate](https://prog-8.com)
windowsでiverilog その24

#概要

windowsでiverilogやってみた。
counter書いてみる。

#サンプルコード


```

module counter(input clk, input rst, output reg [7:0] out);
	always @(posedge clk)
	begin
		if (rst == 1)
		begin
			out <= 8'd0;
		end
		else
		begin
			out <= out + 8'd1;
		end
	end
endmodule

module test();
	reg clk;
	reg rst;
	wire [7:0] out;
	counter u(.clk(clk), .rst(rst), .out(out));
	initial
	begin
		$monitor("%b %b %d", clk, rst, out);
		clk = 0;
		rst = 0;
		#10
			rst = 1;
		#10
			rst = 0;
		#50
			$finish;
	end
	always
	begin
		#5
			clk = 1;
		#5
			clk = 0;
	end
endmodule





```

#実行結果


```


0 0   x
1 0   x
0 1   x
1 1   0
0 0   0
1 0   1
0 0   1
1 0   2
0 0   2
1 0   3
0 0   3
1 0   4
0 0   4
1 0   5
0 0   5


```

以上。
Mithril.js stream() の使いどころ - JavaScript での参照渡しの解決に

自分は、Mithril stream() は、基本的に使いません。
JavaScript の Object がそもそも参照渡しであるし、Class の作り方を工夫すれば、なんとかなっちゃうからです。ごくまれに、仕方なく stream() 使うことがあるかも程度です。


# Mithril stream() の使いどころ - JavaScript での参照渡しの解決に

JavaScript は欠陥言語と言われる1つに *参照渡し* *値渡し* の問題も1つ大きな欠陥ではないかと自分は考えています。

プリミティブ型(string, number, boolean ...等) の引数で関数コールや別の変数へのコピーは、それは *値渡し*です。
だからといえ、インターネット上では 変数をオブジェクト(object, array)でラップして渡せば良いという記事が目につきます。

でも、別の方法も有ります。変数を Mithril stream() でラップしてしまう方法です。

Mithril stream() は **変数を参照渡しできる。さらに変数が変更されたときHookもできる!** というものです。

Mithril ではコンポーネント という概念の元、コンポーネントにコンポーネットを入れて...というのは日常的に行われます。
そういったときに 参照渡しが使えないと 子コンポーネントでの変更を親コンポーネントに伝えるには onchange() などでつないでいかないといけません。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310537/43da9fb1-29f5-62bd-24a8-08fd6677463a.png)

コンポーネントが増えれば増えるだけ onchange() が増えて悲劇が起きます。
そこで思うのが **参照渡しがあればどんなに楽なんだろう?** となるわけです。


**Mithril stream() はそれを解決する1つの方法です。**

次の例は、 MainComponent と CustomInputComponent で変数の実態を共有する例です。
変数 myValue は stream<string> 型です。

CustomInputComponent 内で変更した値は、そのまま MainComponent の変数と共有しているので変更がそのまま反映されます。

```tsx

import m from 'mithril';
import stream from 'mithril/stream';

class CustomInputComponent {

	public view(vnode){

		return(
			<input
				type="text"
				value={ vnode.attrs.value() }
				onchange={ (event)=>{ vnode.attrs.value( event.currentTarget.value ); } }
			/>
		);

	}

}

class MainComponent {

	public myValue : stream<string> = stream("Hello World");

	public view(){

		return(
			<div>
				<CustomInputComponent
					type="text"
					value={ this.myValue }
				/>
				<button onclick={ ()=>{ alert( this.myValue() ); } } >show myValue</button>
			</div>
		);

	}

}

m.mount(document.body, MainComponent)

```
AirflowでDAG間の依存関係の作成方法のまとめ

AirflowではDAG同士の依存関係を定義する方法が2つある。
1つは [TriggerDagRunOperator](https://airflow.apache.org/docs/stable/_api/airflow/operators/dagrun_operator/index.html) を使う方法と、 [ExternalTaskSensor](https://airflow.apache.org/docs/stable/_api/airflow/sensors/external_task_sensor/index.html) を使う方法だ。
どういう場合にどちらを使うべきか個人的に思うところをまとめる。

# TriggerDagRunOperator を使う場合
DAG_A >> DAG_B　のように **DAGの依存関係が1対1** である場合。

DAG_AがDAG_Bを発火させるのでシンプルでわかりやすい。
ただし、DAG_Aが終了した直後にDAG_Bが発火してしまうので、DAG_Bの発火時刻を指定したい場合には使えない。

```triggering.py
from datetime import timedelta
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dagrun_operator import TriggerDagRunOperator

default_args = {
    "owner": "airflow",
    "start_date": airflow.utils.dates.days_ago(1),
}

dag = DAG("triggering", default_args=default_args, catchup=False, schedule_interval="0 0 * * *")

t1 = BashOperator(
    task_id='t1',
    bash_command='echo 1',
    dag=dag
)

trigger = TriggerDagRunOperator(
    task_id="trigger",
    trigger_dag_id="second_dag", 
    dag=dag,
)

task1 >> trigger
```

```triggered.py
from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago

default_args = {
    "owner": "airflow",
    "start_date": airflow.utils.dates.days_ago(1),
}

dag = DAG( "second_dag", default_args=default_args, schedule_interval=None)

bash_task = BashOperator(
    task_id="bash_task",
    bash_command='echo "success trigger"',
    schedule_interval=None,
    dag=dag,
)
```

# ExternalTaskSensor を使う場合
[DAG_A, DAG_B] >> DAG_C のように **DAGが複数DAGに依存する場合。**
もしくは、 **DAG_Cの発火時刻を指定したい場合**。

ExternalTaskSensorはpollingしながらDAG_AとDAG_Bが終了したかをチェックする。
polling中はワーカーは動き続けてしまうので、出来るだけTriggerDagRunOperatorを使う方がいいと思う。

### ExternalTaskSensorの注意点

ExternalTaskSensorはスケジューリングに気をつけないと動作しない。
この辺りの詳細とサンプルは以前書いたのでそちらを参照↓

[AirflowでExternalTaskSensorを使う時に気をつけること](https://qiita.com/munaita_/items/6b448d2e23776b934273)
nuxtをGAEにアップした際にServer Errorになったときの対処法

### GAE!GAE!GAE! nuxtを手軽にアップするならGAE！

ということでGAEにアップしてみました。
しかし、Server Error（500エラー）。

そんな貴方と私に対処法をお教え致します。
それぞれのバージョンは以下の通り。

```
▶︎︎ node -v                                                                     
v12.1.0
▶︎︎ nuxt -v  (こんなコマンドはない）
v2.12.2
```

### 純粋にGAEにアップする方法をお探したの方は以下
https://ja.nuxtjs.org/faq/appengine-deployment/

###さて本題、エラーの原因を調べる。
GAEにはエラーを調べるために非常に便利なコマンドがあります。
```sudo gcloud app logs tail -s default  ```
これでログが出せました。

```
Error: Cannot find module 'vuetify/es5/util/colors'
Require stack:
- /workspace/nuxt.config.js
- /workspace/server/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:957:15)
    at Function.Module._load (internal/modules/cjs/loader.js:840:27)
    at Module.require (internal/modules/cjs/loader.js:1019:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Object.<anonymous> (/workspace/nuxt.config.js:1:78)
    at Module._compile (internal/modules/cjs/loader.js:1133:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1153:10)
    at Module.load (internal/modules/cjs/loader.js:977:32)
    at Function.Module._load (internal/modules/cjs/loader.js:877:14)
    at Module.require (internal/modules/cjs/loader.js:1019:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/workspace/nuxt.config.js', '/workspace/server/index.js' ]
}

```
なるほど、vuetifyのエラーのようです。
色々と調べていると、package.jsonの@nuxtjs/vuetifyが
devDependencies　にあるのがエラーの根源らしい。

ということでdependencies　に移動させて完了

###　Have a good life!
Vol.7 はじめてのゲーム作成(6)

#はじめに
前回に引き続き、実際にUnityを触って3Dゲームを作っていくよ！
今回は追いかけてくる敵を作成してみよう！敵役がいた方がゲームはおもしろいよね！
自分のペースでしっかり読んで早速初めてみよう！

#1. スタート画面の作成とビルドの方法

###1. 画像を使ってみよう！
最後にスタート画面を作成するよ！
スタート画面があるとより一層ゲームらしさが増しますのでぜひ作成してみてね！
以下のようにプロジェクトウィンドウのSceneフォルダにCreate→Sceneで新しく「TopMenu」シーンを作成してみよう。
![6-18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644397/7df99ca2-b2bf-e1bb-0b9b-6ed2df559d50.gif)

シーンはダブルクリックすれば開くことができるよ。
まずは外部から画像を取得するよ。
今回はユニティちゃんダウンロード公式ページから適当な画像を使用しよう！
https://unity-chan.com/download/releaseNote.php?id=UnityChanImagePackVol1

使用したい画像をUnityのプロジェクトウィンドウのフォルダにドラッグ&ドロップすれば画像をインポートすることができるよ。

今回は「images」フォルダを事前に作成してそちらに保存しておく。
インポートが完了したら画像をUnityで使用できる状態にするよ！

以下のようにインスペクターウィンドウでTextureTypeをSpriteに変更してみよう。
![6-19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644397/4e1aba83-ef4e-3eb7-f6d6-f0b6cf795272.gif)
画像の位置は以下のように変更しよう。
<img width="634" alt="スクリーンショット 2020-06-16 15.23.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644397/ee14bdd3-686c-d87e-fb9b-aa98f4da5fb4.png">


###2. テキストを作成してみよう！
次にテキストを作成するよ。
タイトルは「自分の好きなもの」にしよう。

クリックしたらゲームがスタートするように「Click To Start!!」の文言も入れておこう！
まずはヒエラルキーウィンドウのCreate→UI→Panelを選択してね。

作成したパネルを以下のように変更してみよう。
<img width="324" alt="スクリーンショット 2020-06-16 15.29.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644397/f26f7a5a-85dd-9d43-37a1-e9b5841a9f22.png">
<img width="657" alt="スクリーンショット 2020-06-16 15.29.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644397/31d01a81-376e-2df4-e8bc-138e961bb7ce.png">

また、色は自由だけど、透明度が低めの黒だと文字が見やすくなるよ！

次にヒエラルキーウィンドウのCreate→UI→Textを選択してください。名前を「StartText」に変更します。

ここで作成したテキストをPanelの子オブジェクトに変更してPositionを全て０に変更してください。

そのほかの設定は以下画像をご参考ください。


お気付きの方もいるかと思いますが、フォントが初期設定のものではありません。フォントの変更方法はとても簡単ですので以下記事を参考にチャレンジしてみてください。

###3. ゲームをビルドしてみよう！

次に画面をクリックしたらシーンを変更するようにします。

まずは新しく「SceneController」スクリプトを作成して、以下のように変更してください。

スクリプトはたったこれだけです。

「SceneManager.LoadScene(“シーン名”)」でシーンを読み込むことができます。

作成したスクリプトを新しく作成する空のオブジェクト「SceneManager」にアタッチしてください。

しかし、このままではまだ利用できません。

Macの場合は「⌘+Shift+B」でビルドセッティングを開いてください。

ここでシーンを追加する必要があります。

それぞれのシーンを開いた状態で右中段の「AddOpenScenes」を選択してください。

すると現在開いているシーンが追加されますのでTopManuシーンとGameシーンどちらも追加してください。

シーンは一番上のシーンが最初に読み込まれますのでTopMenuシーンを最初にしておきましょう。

この状態で実行するとシーン遷移を実行することができます。

#まとめ
今回は、おいかけを作成してみたね！クラスを使うとプログラムが楽に書けるようになるんだね！インスタンスとは実体そのもの。コンストラクタとは、初期化するための専用のメソッド。難しい単語やはじめて聞いた言葉は、徐々に覚えてくるから大丈夫だよ！

これでユニティちゃんゲームは完成だよ！お疲れ様！はじめてのゲーム作成はどうだったかな？

[次へすすむ]()
BlenderでFBXエクスポートをするとクソデカサイズになってしまうときの対処法

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/a7028bfd-4da6-46bc-1a19-3a9fca628acf.png)


# 原因：
どこにも使用していない孤立したデータが影響しているらしい

# 対処法：
アウトライナー画面を選択し、プルダウンから『孤立データ』を選択する。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/94c77755-0867-852d-bd6d-cfdc50ea2eaf.png)

画面に孤立データ（おそらくどこにも使われていないデータなど）が一覧として出るので右側のチェックマークかFマークをクリックすると削除することができる。一度保存してブレンドファイルを読み込みなおすと消えているはずなのでもう一度FBXエクスポートをすれば解消できていると思う。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/e3f7fc74-69e2-f387-68c8-b5285f179f21.png)

解決サイト
[Blenderで書き出したFBXファイルが重い（外部サイト）](https://scrapbox.io/mushus/Blender%E3%81%A7%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97%E3%81%9FFBX%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E9%87%8D%E3%81%84)
プリントスクリーンで全画面、アクティブウィンドウをショートカットだけで自動保存する方法

１．アクティブウィンドウ
キー：[Windows]+[Alt]+[PrintSc]
保存先：C:\Users\ユーザ名\Videos\Captures(PC/ビデオ/キャプチャ)

２．全画面
キー：[Windows]+[PrintSc]
保存先：C:\Users\ユーザ名\Pictures\Screenshots(PC/ピクチャ)

３．矩形選択（自動保存されない）
キー：[Windows]+[Shift]+[S]

以上
Azureインオープンプランにクレジットを追加する

#はじめに
会社で検証用にAzureインオープンプランというライセンスを購入してます。

Azureインオープンライセンスとは、事前に使用する金額分のライセンスを購入し、
サブスクリプションに補充できるものです。

従量課金だと毎月どこかのプロジェクトのお財布から払わないといけません。
そうするとサービスイン後の維持保守をするような息の長いプロジェクトが必要となります。

Azureインオープンライセンスではプロジェクトのお財布に余裕のある時にまとめ買いができます。
向こう1年分くらいのライセンスを買っておくことでプロジェクトのお財布を使うことなく検証ができとても便利です。
この仕組みは2020年6月現在、AWSにもGCPにもないAzureのいいところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/ce96880a-25ae-2fbf-bdfd-aa926a339908.png)

実はこのライセンス、アクティブ化してから1年間という有効期限があります。

100万円分をまとめて買うと、1年で使い切れるかわからない、という場合もあるかと思います。
そういう場合は50万円分×2を買って、まず50万円分をアクティブ化します。
そして足りなくなりそうになったら残り50万円分をアクティブ化します。

そういう使い方をすることで有効期限を1年より長くすることができます。
もちろん10万円分×10でもいいですが、アクティブ化する運用負荷がかかるので、バランスが大事です。

#Azureインオープンライセンスにクレジットを追加する

今回はサブスクリプションのクレジット残高が減ってきたのでクレジットを追加した手順を記録しました。

いきなり冒頭のサブスクリプション管理画面にアクセスすることも可能ですが、
普段使ってないのでURLとか覚えてませんので、使い慣れているAzureポータルからたどりましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/e8719cd8-cc61-0e1d-3b53-55bb07151f21.png)
「すべてのサービス」から「サブスクリプション」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/807903c4-696c-ce43-c1f2-3ae3902749ba.png)
サブスクリプションの一覧に「Azureインオープンプラン」が表示されるので選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/bfca9882-523d-f5df-0984-f553bdab0b96.png)
ここで「管理」を選択することで冒頭のサブスクリプション管理画面に飛べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/9c2db245-19c3-dceb-42a4-fec4912a5f10.png)
認証します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/4643b7ab-b535-a666-68a3-571edec4d9dd.png)
サブスクリプション管理画面です。
いろいろなアラートが出てますね。
まだ10万円残ってるのにサービス中断されるぞ、と脅してくれます。
毎月の使用料も加味してアラート出してるんでしょうかね。
ここで「クレジットの追加」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/9c2db245-19c3-dceb-42a4-fec4912a5f10.png)
また認証します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/9dd8ae8b-125e-326f-7b8c-e688d1e3462c.png)
あっという間にAzureポータルに返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/1220fc91-7f27-c6be-15a2-75f97783c104.png)
ここに購入したライセンスのプロダクトキーを入力し検証します。
さらにこの画面の下の方に「適用」ボタンがあるので押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/dca2e50f-f537-caf2-d14f-236bc3cc5897.png)
無事に適用されたと通知してもらえました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/f55b4fc2-a831-de6b-c181-a062079d18d0.png)
最後にサブスクリプションのクレジット残高が増えていることを確認して終了です。

#おわりに
Azureインオープンライセンスへのクレジットの追加方法についてご紹介しました。

実はライセンス買ったりそのライセンスからプロダクトキー払い出すところがもっと面倒くさいんですけどね。
これらは機会があれば記事書くかもしれません。

最後まで読んでいただきありがとうございました。
新しくRailsプロジェクトを作る時にやること／やらないこと

## やること

- `Ridgepole`を入れる
- `action_args`を入れる
- `haml`もしくは`slim`を入れる
- `tapp-awesome_print`を入れる
- 最新バージョンの`Rails`を使う
- 常に`Gem`を最新にアップデート出来る状態を維持する
- `Heroku`を使う
- `Getting Real`を読む
  - [Getting Real: The smarter, faster, easier way to build a successful web application](https://basecamp.com/books/getting-real)
  - 日本語アーカイブ: [Getting Real by 37signals](https://web.archive.org/web/20110721234749/http://gettingreal.37signals.com/GR_jpn.php)

## やらないこと

- 論理削除をしない
- `devise`を入れない
- `default_scope`を使わない
- `React`を入れない
- `jQuery`を入れない
- `CoffeeScript`を使わない
- `before_action`を濫用しない
- サービスクラスを導入しない
Windows CMDでnetstatコマンドが使えないときの対処法

##ことの発端
XAMPP入れていろいろやってたら80番ポートとかいろいろ使われてたみたいなので、ググってたら`netstat`コマンドで調べることができるらしい。
##使えなかった
コマンドプロンプトで`netstat`打ってもも使えなかった
##対処法
`netstat`コマンドの本体は「System32」の中にあるのでここにパスを通せばよい。
###やり方
1.コントロールパネル＞システムとセキュリティー＞システムの左側にある「システムの詳細設定」に行く
2.そこへ行くとこのような画面が出るので、下のほうにある「環境変数(N)」って書いてあるところを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/275c3b83-f713-dff9-65c9-7638fa386ad2.png)
3.ユーザーの環境変数の(上半分)の「PATH」をダブルクリック
4.すると、現在システムに通ってる環境変数(パス)の一覧が出るので、右側の「参照」を押す。
5.したらば、`C:windows/System32`をディレクトリごと選択する。
以上

##結果
![awsedrftgyhujikl;lkjhgfdsd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/2295808c-9e67-12ad-9054-2f98fc819017.png)
ちゃんと出た

##おわり
多分何か入れた時にSystem32のパスを消しちゃったのかもしれない。
困ったらSystem32にパス通しておけば大乗かもしれない（ほんまか？）
SalesforceのToDoを繰り返す

# ToDoの繰り返し
Salesforceにはアクションを管理するToDoというオブジェクトがありますが、その繰り返しの設定にハマったのでここに残しておきます。
https://help.salesforce.com/articleView?id=tasks_repeating.htm&type=5

# レイアウトの修正
ToDoのレイアウトに `このToDoを繰り返す` と `繰り返し期間` を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97162/4bb29969-ed26-d548-982d-e07aa55c4b43.png)

# このToDoを繰り返す
## 繰り返しの起点を設定
新規にToDoを作成する際に、このToDoを繰り返す、を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97162/04eadf0b-3f7b-3f94-fcfe-ee10b173ca74.png)

ここで、完了した日を起点とするのか、期日を起点にするのかを選びます。

## 繰り返し期間を設定する
起点を選んだ後は、繰り返しの日数をいれます。試しに10日とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97162/0e669280-913e-2980-9cb3-2117e43e9808.png)

## ToDoをToDoとしてマーク
作成したToDoを完了にします。
すると、自動的にそのToDoの `繰り返し期間` は `(完了したToDo)` になります。
（Salesforceあるあるですが、ちょっとよくわからない日本語ですね🤔）

## ToDoを確認する
完了後、関連先のToDoを確認すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97162/71167529-fc24-1f37-0055-e1d09ca659d3.png)

10日後が期日のToDoが作成されました🎉

# ハマったところ
これを設定する時にハマったのが、似たような名前の違う機能らしい `定期的なToDo` です。
この子と、ToDoを繰り返す機能は別物のようなので、お気をつけください。

参考： [定期的なToDoの作成を試してみました](https://tyoshikawa1106.hatenablog.com/entry/2018/07/15/161249)

こちらは、毎週繰り返すようなToDoを作成するのに向いているようですね。
Ansible unarchiveでルートディレクトリにowner,groupが効かない

# 何があったさ

``play-book``に以下のように``owner``,``group``を指定しているのに、ルートディレクトリだけはコレが効かないので色々試した。

```yml:playbook.yml
- name: test unarchive
  unarchive:
    src:   "hoge.tar"
    dest:  "/tmp/."
    owner: "udon"
    group: "udon"
```

```bash:結果
$ find /tmp/hoge -ls
792842    4 drwxr-xr-x   2 root     root         4096  6月 16 14:44 hoge    ★コイツがroot:rootになる
792926    0 -rw-r--r--   1 udon     udon            0  6月 16 14:44 hoge/b
792927    0 -rw-r--r--   1 udon     udon            0  6月 16 14:44 hoge/c
792855    0 -rw-r--r--   1 udon     udon            0  6月 16 14:44 hoge/a
```

# 環境

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ ansible --version
ansible 2.9.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ansi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
```

# 原因

転送する``hoge.tar``の作り方に問題があった。
``unarchive``に指定する``owner``,``group``は、アーカイブに含まれるファイル・ディレクトリについてのみ有効となる。

```bash:間違ったアーカイブ作り方
$ tar cfp hoge.tar hoge/*
```

```bash:正しいアーカイブ作り方
$ tar cfp hoge.tar hoge
```

上記のように「``hoge``」ディレクトリもアーカイブに含めてやればいい。


「正しい」と書いてしまったが、それは時と場合によりけり。
windowsでiverilog その23

#概要

windowsでiverilogやってみた。
ram書いてみる。

#サンプルコード


```

module ram(input clk, load, input [7:0] addr, input [15:0] data, output [15:0] out);
	reg [15:0] out;
	reg [15:0] mem[255:0];
	always @(posedge clk)
	begin
		if (load)
			mem[addr] <= data;
		out <= mem[addr];
	end
	initial
	begin
		mem[0] =  16'h0001;
		mem[1] =  16'h0002;
		mem[2] =  16'h0003;
		mem[3] =  16'h0004;
		mem[4] =  16'h0005;
	end
endmodule

module test();
	reg clk;
	reg load;
	reg [7:0] addr;
	reg [15:0] data;
	wire [15:0] out;
	ram u(.clk(clk), .load(load), .addr(addr), .data(data), .out(out));
	initial
	begin
		$monitor("%b %b %h %h", clk, load, data, out);
		clk = 0;
		load = 0;
		#10
			addr = 8'h01;
			data = 16'h0008;
			load = 1;
		#10
			load = 0;
		#10
			
		#10
			
		#10
			$finish;
	end
	always
	begin
		#5
			clk = 1;
		#5
			clk = 0;
	end
endmodule





```

#実行結果


```


0 0 xxxx xxxx
1 0 xxxx xxxx
0 1 0008 xxxx
1 1 0008 0002
0 0 0008 0002
1 0 0008 0008
0 0 0008 0008
1 0 0008 0008
0 0 0008 0008
1 0 0008 0008
0 0 0008 0008


```

以上。
Laravelで認証付きAPIの実装をUnitテスト

- Windows 10
- PHP 7.4.5
- Laravel Framework 7.9.2

LaravelでのAPIサーバー開発において、認証つきサービスの試験をUnitテストで実装します。
JWT認証の構築や、Unitテストの準備などについては、それぞれ下記の記事をご参照ください。

- [LaravelでのJWT認証](https://qiita.com/nozaki-sankosc/items/7ed320d6549f5f92b9b9)
- [Laravelの認証でwebとapiの両方を使う](https://qiita.com/nozaki-sankosc/items/88d12602a2d6f051fd8a)
- [LaravelでのUnitテストざっくり入門](https://qiita.com/nozaki-sankosc/items/4f20a4a30e6b730ec211)
- APIサーバー：https://develop.sankosc.co.jp/apitest/

このサーバーをベースにして、認証中にアクセスできるAPI`http://localhost/api/me`へアクセスし、ユーザー情報を取得するテストコードを実装したいと思います。

## テストコードの前処理でログインする

1. ログインユーザーを作成
2. ログインAPIでアクセストークン取得
3. アクセストークンを変数に保存しておく

```php:ExampleFutureTest.php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Hash;
use Tests\TestCase;
use App\User;

class ExampleFeatureTest extends TestCase
{
    use RefreshDatabase;

    private $accessToken = null;

    protected function setUp(): Void // ※ Voidが必要
    {
        // 必ずparent::setUp()を呼び出す
        parent::setUp(); 
        // 1.ログインユーザー作成
        User::create([
            'name' => 'sample user',
            'email' => 'sample@sankosc.co.jp',
            'password' => Hash::make('sample123'),
        ]);
        // 2.ログインAPIでアクセストークン取得
        $response = $this->post('/api/login', [
            'email' => 'sample@sankosc.co.jp',
            'password' => 'sample123'
        ]);
        $response->assertOk();
        // 3.アクセストークンを変数に保存しておく
        $this->accessToken = $response->decodeResponseJson('access_token');
    }
}
```

## 認証が必要なAPIのテストケースを実装する

- 認証が必要なAPIにアクセスするときにヘッダにアクセストークンを含める

```php:ExampleFutureTest.php
    /**
     * @test
     * @group testing
     */
    public function getWithAuth()
    {
        $response = $this->get('/api/me', [
            'Authorization' => 'Bearer '.$this->accessToken
        ]);
        $response->assertOk()->assertJsonFragment([
            'name' => 'sample user'
        ]);
    }
```

## テスト実行

```powershell
> .\vendor\bin\phpunit --group=testing
PHPUnit 8.5.4 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 766 ms, Memory: 28.00 MB

OK (1 test, 3 assertions)

```
Railsで主キーをid以外に設定し、ほかのテーブルとアソシエーションを結ぶ

先日、どうしてもテーブルの主キーをID以外に変えなければならない状況になり、依存関係もあるテーブルの主キーを変更したのですが、個人的にはかなり躓いてしまったので、手順をメモします。

# やったこと
実施したことは以下の通り。

- マイグレーションファイルを変更（参照先テーブル、参照元テーブル）
- モデルの変更（参照先テーブル、参照元テーブル）

なお、環境は以下の通り

- Rails 5.2.4.2
- Postgresql 12.2

## マイグレーションファイルの変更
### 参照先テーブルの設定

officesテーブルに従属するstaffsテーブルがあったとします。
officesテーブルの主キーは`office_code`とします。

この時officeテーブルを作成するマイグレーションの設定は下記のとおりです。

```ruby:migration
class CreateOffices < ActiveRecord::Migration[5.2]
  def change
    create_table :offices, id: false do |t|  # id: falseを追加
      t.string  :name, null: false
      t.integer :office_code, null: false, primary_key: true  # primary_key: trueを追加
  
      t.timestamps
    end
  end
end
```
`id: false`で自動で主キーをIDにする設定を解除します。
次に、`primary_key: true` で明確に`office_code`を主キーに設定します。
参照される側のテーブルの設定はこれで終わりです。

### 参照元テーブルの設定
次に、`staffs`テーブルから`office`テーブルを`office_code`という外部キーで参照したいと思います。
この時のマイグレーションファイルの設定は下記のとおりです。

```ruby
class CreateStaffs < ActiveRecord::Migration[5.2]
  def change
    create_table :staffs do |t|
      t.string     :name, null: false
      t.references :office, null: false  #foreign_key: true は設定しない

      t.timestamps
    end
    add_foreign_key :staffs, :offices, column: :office_code , primary_key: :office_code
    # ここで外部キーを設定
  end
end
```
`t.references :office`でofficesテーブルを参照することを宣言しますが、ここで`foreign_key: true`を設定しないのがポイントです（ここでだいぶはまった…）。
`foreign_key: true`を設定すると`office_id`を参照し続けてしまいます。

そして、マイグレーションファイルの下方に

```ruby
add_foreign_key :参照元テーブル, :参照先テーブル, column: :参照するカラム , primary_key: :参照するテーブルの主キー
```
を記述します。

## モデルの変更（参照先テーブル、参照元テーブル）
### 参照先テーブル

参照先テーブルである`office.rb`のモデルファイルの設定は下記の通り。

```office.rb
class Office < ApplicationRecord
  self.primary_key = :office_code　　# ここに追記

  has_many :staffs

  validates :name, presence: true
  validates :office_code,   presence: true
end
```

まず、`self.primary_key = 'カラム名'`で主キーを設定します。
これによってfindメソッドで`office_code`による検索が可能になります。

### 参照元テーブル

最後に、`offices`テーブルを参照している`staffs`テーブルのモデルの記載について

```staffs.rb
class Staff < ApplicationRecord
  belongs_to :office, primary_key: :office_code　# ここに追記

  validates :office_id, presence: true
  validates :name, presence: true, length: { maximum: 50 }
end

```

`primary_key: :office_code`の部分で、staffsテーブルからデータを参照するときの主キーを`:office_code`に変更します。

上記で、無事、依存関係のあるテーブルにおいて、主キーをIDから変更し、アソシエーションを定義することができました。
まだ理解があいまいな点もあるので、間違いを発見したら修正していこうと思います。

## 参考情報
[Railsで規約に沿わない古いデータを扱う](https://qiita.com/k-shogo/items/884498ad512c0e6eb303)
[[Rails] 主キーがid以外のテーブルを外部キーに設定する方法](https://shara3.blogspot.com/2018/01/rails-id.html)
[Active Record の関連付け
](https://railsguides.jp/association_basics.html)[Rails で id 以外を主キー（primary_key）に設定する](https://www.kaqiita.com/entry/2019/02/17/104923)
Processing(python) マウスでなぞったところに円を描く！

#Processing(python) マウスでなぞったところに円を描く！
今回は、自分の後輩に課題の質問をされて"python","processing"懐かしいなということで書いてみることにしました！
くれぐれもこれを見た後輩君たちは丸写ししないようにね！（俺が怒られちゃうから）

##やること！
**現在のフレームから9フレーム前の座標まで中心とした円を描画！**

##先に完成プログラム！（説明と照らし合わせて読んでね！）

```python:sketch.py
decorate_x = []
decorate_y = []

def setup():
    size(800, 800)

def draw():    
    decorate_x.append(mouseX)
    decorate_y.append(mouseY)
    background(255)
    if len(decorate_x) == 10:
        for i in range(10):
            ellipse(decorate_x[9-i], decorate_y[9-i], 90, 90) 
        del decorate_x[0]
        del decorate_y[0]   
```

##意識しなければならないこと！!
1. 現在から9フレーム前までの円を描写すること
2. 前のフレームの座標を保存すること！
3. ９フレーム描写したらいったん消すこと！

##書くための発想！
1. 座標を保存！
2. 座標を全部で9個保存
3. 保存した新しい順番で9個描写
4. 描写したものを削除！

###1.座標を保存！
今回保存するのに使うのは`python`の`list`
まず、`list`を宣言！
保存するには、`list名.append(値)`左のコードでリストに値を追加する！

###2.座標を全部で9個保存！
座標の保存方法はさっきの説明したがどうやって9個保存したかを確かめるか？
`len()`を使って`list`の中に何個値が入ってるかを調べる！
9個値が入ってるときだけ動くように`if`で条件分岐を作ればok

###3.保存した新しい順番で9個描写
新しくリストに入った順に書くなんてどうするの！？ってところだけど、
`for i in range(10)`をやることで`i`には`0`から`9`までが順に入っていく、順番を逆にしてリストの中身を書きたいなら引いてしまえばいい！
`ellipse(decorate_x[9-i], decorate_y[9-i], 90, 90)`引くことで`[]`の中には`9`から`0`の順に変わる！

###4.描写したもの削除！
`processing`には描写したものを消すコードは存在しないが上書き保存することで消すことができる！
そこで背景を全部塗り替えちゃえってことで！`background(255)`をつかう！

## 結果映像！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">一年生からprocessingの質問きたからコードの説明書いてみた！ｗ<a href="https://t.co/1CAaWfDAfG">https://t.co/1CAaWfDAfG</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/EK9g49iBOv">pic.twitter.com/EK9g49iBOv</a></p>&mdash; Miryuu (@Miryuu_neko) <a href="https://twitter.com/Miryuu_neko/status/1272762718299144194?ref_src=twsrc%5Etfw">June 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
windowsでiverilog その22

#概要

windowsでiverilogやってみた。
stack書いてみる。

#サンプルコード


```


module stack(top_out, next_out, top_in, next_in, pop, push, w_tos, w_next, clk, rst);
	output [15:0] top_out,
		next_out;
	input [15:0] top_in,
		next_in;
	input pop,
		push,
		w_tos,
		w_next,
		clk,
		rst;
	reg [15:0] top_out,
		next_out;
	reg [15:0] stack_ram[31:0];
	reg [4:0] tos_position,
		next_position;
	always @(posedge clk or posedge rst)
	begin
		if (rst == 1)
		begin
			tos_position = 5'b0;
			next_position = 5'b11111;
		end
		else if (clk == 1)
		begin
			if (pop == 1)
			begin
				tos_position = tos_position - 1;
				next_position = next_position - 1;
			end
			else if (push == 1)
			begin
				tos_position = tos_position + 1;
				next_position = next_position + 1;
			end
			if (w_tos == 1)
				stack_ram[tos_position] = top_in;
			if (w_next == 1)
				stack_ram[next_position] = next_in;
			top_out = stack_ram[tos_position];
			next_out = stack_ram[next_position];
		end
	end
endmodule

module test;
	reg [15:0] top_in;
	reg [15:0] next_in;
	reg pop;
	reg push;
	reg w_tos;
	reg w_next;
	reg clk;
	reg rst;
	wire [15:0] top_out;
	wire [15:0] next_out;
	stack u(.top_out(top_out), .next_out(next_out), .top_in(top_in), .next_in(next_in), .pop(pop), .push(push), .w_tos(w_tos), .w_next(w_next), .clk(clk), .rst(rst));
	initial
	begin
		$display("clk rst in out");
		$monitor("%b %b %h %h", clk, rst, top_in, top_out);
		top_in = 0;
		next_in = 0;
		pop = 0;
		push = 0;
		w_tos = 0;
		w_next = 0;
		clk = 0;
		rst = 0;
		#10
			rst = 1;
		#10
			rst = 0;
		#10
			top_in = 16'b1100110011001100;
			w_tos = 1;
		#10
			top_in = 16'b0011001100110011;
			push = 1;
		#10
			top_in = 16'b0011100110100101;
		#10
			top_in = 16'b1011001110001111;
		#10
			w_tos = 0;
			pop = 1;
		#10
			next_in = 16'b1111111100000000;
			w_next = 1;
			pop = 0;
		#10
			$finish;
	end
	always
	begin
		#5
			clk = 1;
		#5
			clk = 0;
	end
endmodule





```

#実行結果


```


clk rst in out
0 0 0000 xxxx
1 0 0000 xxxx
0 1 0000 xxxx
1 1 0000 xxxx
0 0 0000 xxxx
1 0 0000 xxxx
0 0 cccc xxxx
1 0 cccc cccc
0 0 3333 cccc
1 0 3333 3333
0 0 39a5 3333
1 0 39a5 39a5
0 0 b38f 39a5
1 0 b38f b38f
0 0 b38f b38f
1 0 b38f 39a5
0 0 b38f 39a5
1 0 b38f b38f
0 0 b38f b38f


```


以上。
[Oracle Cloud] ポートフォワーディングを使用してセキュアにWindowsサーバへアクセス

# はじめに
public subnetにWindowsのインスタンスを作成すれば、容易にRDPでアクセスすることができます
その際、Security Listにはこんな設定をすることが多いと思います
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/4c69ae88-2ede-4ca1-1e06-7d0abf14e841.png" width=85%>
ただWindowsサーバはuser/password認証なので、上記設定だとインターネット上から不正なアクセスを多数受け、最悪の場合認証を突破される危険性があります

Security Listは最低限の通信のみ許可をして、Windowsサーバへのアクセスには他サーバを踏み台としてRDPするのがよりセキュアです

本書では、下図のようにlinuxサーバを踏み台としてWindowsサーバへアクセスする方法を記載します
なお、OCIのlinuxサーバはパスワード認証ではなく鍵認証です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/d227fa9f-b2b5-2df1-35a0-7c1d2e547971.png)

# 事前準備 -OCI環境-
まずは上図のようなOCI環境を準備します

- VCN作成
- Subnet作成
- Security List作成
- Route Table作成
- instance作成

instanceはRDPでアクセスするWindowsサーバと、踏み台として利用するlinuxサーバを作成しています
2つのインスタンスは同じSubnetに属していますが、別のSubnetでも問題ないはずです
重要なのはinternetから踏み台サーバまでsshで到達できればよいのです

各サーバ上での設定には特に不要です
サーバが起動してさえいれば、必要となる機能/サービス群は立ち上がっています

# 実際にアクセスしてみる
クライアント側はTera Termを使用します
1. Tera Termで踏み台サーバへログインします (IP : YY.YY.YY.YY)
2. sshで無事ログインできましたら、Tera Termメニューの「設定」->「SSH転送」を選びます。下図のボックスがでてきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/29303e58-7065-f2e0-ff88-5b7695c28974.png)
3. 「追加」をクリック。下図ウィンドウが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/cd32d2d6-6e85-27b4-1d1a-d70fecbf33c7.png)
4. 以下のように指定して、OKをクリック。下図のようになります
- ローカルポート : 13389 (任意)
- リッスン : 未入力
- リモート側ホスト : 10.50.0.4
- ポート : 3389
- ※ リモートサーバのポート、ダイナミックポート は使用しません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/fc962baf-084c-044c-364b-2a442b0d03e4.png)
5. OKをクリックしボックスを閉じます
6. RDPを起動します
7. 下図のように指定し、接続をクリック。ポートは上記で指定した13389を使いましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/7b044010-5c36-74c4-7b48-4706688bf6b4.png)
8. 下図のようにWindowsのログイン画面がでてきます。無事アクセスできるはずです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/fab7c4f4-af7e-1e0f-48af-5623ec00f22b.png)

# 参考URL
xxx
多言語Overleaf覚え書き（一部だけ違うフォントを使用したいとき）

###Overleafで多言語出力

Overleafで多言語出力をするためのレシピ

- XeLaTeXをコンパイラに指定
- `fontspec`パッケージを使用
- 今回はチベット語フォントJomolhariを題材に

使用できるフォント一覧についてはパッケージのドキュメントを参照。
新しいフォントを入れたい場合には以下のように`\newfontfamily\コマンド名{フォント名}`で指定してあげる。

```example.tex
\usepackage{fontspec}
\newfontfamily\Tibetanfont{Jomolhari}
%\setmainfont{Times New Roman} -> デフォルトのフォントの指定をしたい場合。
```

出力したい文字列を`{\コマンド名 文字列}`で任意のフォントで文字を出力することができます。

```example2.tex
{\Tibetanfont ཚུགས་} means ``be able to do".
```


####Future work
- `fontspec`と`polyglossia`パッケージ併用している場面をよくみるが、ほんとうに必要なのかを調べたい。
Pythonによる.txtファイルの読み込み

paizaラーニングの環境でPythonの基礎をひと通り勉強した後にAtomに移行したら標準入力ができないことに困惑してしまい、どうしたら外部からのデータを読み込めるか調べた時のまとめです。
初心者の自分用にまとめたものなので間違いなどあったら教えてくださると幸いです。

以下のサイトを参考にさせていただきました。
**note.nkmk.me**様
- [Pythonでカレントディレクトリを取得、変更（移動）](https://note.nkmk.me/python-os-getcwd-chdir/)
- [Pythonでファイルの読み込み、書き込み（作成・追記）](https://note.nkmk.me/python-file-io-open-with/)
**crukky**様
- [atom・pythonで競技プログラミングのテスト環境構築](https://qiita.com/crukky/items/73c1322f5929b1ca5834)
##カレントディレクトリを取得してパスをつなげる
```python:pass.py
import os
path = os.getcwd()
print(path)
```
**os.getcwd()**は現在Pythonが実行されているカレントディレクトリの絶対パスを文字列として返す。
##.txt形式のファイルを読み込む
os.getcwd()で取得したパスのつながったフォルダ内に.txtファイルを移動させておかないとファイルをうまく読み込めずにエラーが出てしまう。
###ファイル全体を文字列として読み込む(read)
```python:read.py
path = "ファイル名.txt"

with open(path) as f:
    s = f.read()
    print(s)

```
["文字列"] という形で出力される。
###ファイル全体を行ごとにリストとして読み込む(readlines)
```python:read2.py
path = "ファイル名.txt"

with open(path) as f:
    l_strip1 = [s.strip() for s in f.readlines()]
    print(l_strip1)

```
["1行目", "2行目", "3行目", "4行目", ・・・] という形で出力される。
 paizaのスキルチェックにあるように " "(スペース) で区切られた文字列をさらにリストとして分割して全体を2次元リストとして読み込みたいときは **split(" ")** を追加して

```python:read3.py
path = "ファイル名.txt"

with open(path) as f:
    l_strip2 = [s.strip().split(" ") for s in f.readlines()]
    print(l_strip2)

```
とすればよい。
[["1-1", "1-2", "1-3"], ["2-1", "2-2", "2-3"], ・・・] という形で出力される。

##Atom上のTerminalで.py形式のファイルを呼び出す
Atomの「ファイル>設定>インストール」から「**platformio-ide-terminal**」というパッケージをインストールする。
そうすると、画面左下に小さな"+"マークが現れるのでここをクリックするとAtom上でTerminalを呼び出せる。
Terminalの「**PS C:\ Users \ (ユーザ名) \ (カレントディレクトリ名)>**」の右に「**python (ファイル名).py**」と記述してEnterを押すとTerminal上で.pyファイルが呼び出される。

以上です。
CodeBuild で使用中のイメージを一括で取得するワンライナー

# 背景

2020/05/22 に AWS から CodeBuild の古いイメージのメンテナンスが終了するというメールが来ていたため、メンテナンス終了の影響を受けるイメージを使っているか調べました。
その際に使ったコマンドのメモです。

AWS からのメールのタイトルは以下のようなものです。

> AWS CodeBuild Ending Maintenance of Older Images [AWS Account: xxxxxxxxxxxx]

※ メールの内容によると、イメージ自体は引き続き使用できるものの、ビルド時のレイテンシが増加する可能性があるとのことです。おそらく、CodeBuild 側にイメージがキャッシュされなくなるのだと思います。

# 結論

```console
$ aws codebuild list-projects --output text \
  | awk '{ print $2 }' \
  | xargs aws codebuild batch-get-projects --names \
  | jq -r '.projects[].environment.image'
```

※ ワンライナーと言いつつ改行はしています

# 対象のイメージが存在するかまで検索する場合

```console
$ aws codebuild list-projects --output text \
  | awk '{ print $2 }' \
  | xargs aws codebuild batch-get-projects --names \
  | jq -r '.projects[].environment.image' \
  | grep -E '(aws/codebuild/standard:1.0|aws/codebuild/standard:2.0|aws/codebuild/amazonlinux2-x86_64-standard:1.0)'
```
Laravel + Vue-cliを使用した  SPAの構築

####バージョンを指定してLaravelのプロジェクトを作成 ####
```
  composer create-project "laravel/laravel=6.*" laravel_sample
```

####    サーバーを起動させる　####
プロジェクトディレクトリに移動

```
 cd laravel_sample
```

下記コマンドを打つ

``` 
  php artisan serve 　
```

サーバー起動後、( http://localhost:8000 )にアクセスしてLaravelのTOP画面が表示されていればOK

#### Vue-cliプロジェクトとLaravelとの連携　####

##### Vueをnodeの(npm)を使用してローカルインストール 
```
npm install --save-dev vue-cli
```

##### 作成済みのlaravelのディレクトリに移動してVue-cliのプロジェクトを作成　#####

①プロジェクト作成する為下記コマンドを入力。

```
vue create vue_sample
```

②インストール方法をdefaultかManuallyかを選択します。
　　　(今回はSPAを構築するのでManuallyを選んでください。)

```
Vue CLI v*.*.*
 ? Please pick a preset:
   default (babel, eslint)
 > Manually select features
```

③必要な機能を選択します。
   　　　(今回はBabel・Router・Linterの3個を選択します)   

```
? Check the features needed for your project:
>(*) Babel
 ( ) TypeScript
 ( ) Progressive Web App (PWA) Support
 (*) Router
 ( ) Vuex
 ( ) CSS Pre-processors
 (*) Linter / Formatter
 ( ) Unit Testing
 ( ) E2E Testing
```

Use history mode for router? (Requires proper server setup for index fallback in production): Yes

? Pick a linter / formatter config: Basic

? Pick additional lint features: Lint on save

? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? In dedicated config files


##### Vueで Single Page アプリケーションの作成準備 #####

```
├─src/
　├─assets/
　├─components/
  ├─router/
　├─views/
　├─App.vue　　　       　
  └─main.js
```



##### Vueアプリケーションをlaravel上で立ち上げる　#####

①プロジェクト直下に配置されている(public)ディレクトリのindex.htmlファイルをプロジェクト直下のディレクトリに置き直しファイル名をbase.htmlに変更

②Vue.config.jsファイルを作成し下記のように変更

```
module.exports = {

    outputDir: '../public/app',

    publicPath: '/app',

    // src
    pages: {
       
        src: {
            entry: 'src/main.js',
            template: 'templates/base.html',
            filename: '../../resources/views/spa/apli.blade.php',
        },
    },
};
```



##### Vue-cli側で作成したコードを配信する為にlaravel側に新たにControllerを作成

```
 php artisan make:controller SpaController
``` 

作成したcontrollerファイルに下記のコードを追記

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SpaController extends Controller
{
    public function app()
    {
        return view('spa/apli');
    }
}
```

##### laravel側のroutes/web.phpファイルに下記のルートを追記 #####

```
Route::get('/apli{any}', 'SpaController@app')->where('any', '(/?$|/.*)');
```

#####Vue-cliのディレクトリに移動して ビルドする

```
npm run build
```

#####配信されるURLを整える #####
プロジェクト名\src\router\index.jsを下記のように変更

```
export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
```

         
　↓↓↓

```
export default new Router({
  mode: 'history',
  base: '/apli/', 
```

###ラストに Vueのプロジェクトのディレクトリにてnpm run build でビルドをして完了です。
###確認の為アクセスしてみましょう。 
####URL( http://localhost:8000/apli)####
####アクセス時VueのTOP画面が表示されていればOK

こちらのサイダス技術者ブログさんを参考に記事を書いています(https://tech.cydas.com/entry/vue-laravel-mspa1)
シェルの変数に代入した値を改行込みで出力したい！

# やりたいことと困ったこと
```
git diff --name-only origin/master | grep -e '\.\(jpg\|png\|gif\)'
```
この複数行の出力（masterブランチとの差分があるファイル名一覧）を、バッククオートで囲んで $changed_files 変数に１行毎に代入したい。

```
changed_files=`git diff --name-only master | grep -e '\.\(jpg\|png\|gif\)'`
```

しかし、そのままechoで出力しても１行にまとめて表示されてしまう。

```
$ echo $changed_files
VERY_LARGE_PHOTO.jpg hoge.jpg
```

# 結論

echoをする時に、ダブルクオートを使うと改行コードを含めて表示できる。
つけていないと、改行は省略されて表示されてしまう。

```
$ echo "$changed_files"
VERY_LARGE_PHOTO.jpg
hoge.jpg
```
Windows 10 + nodejs + selenium-webdriver + geckodriver で headless firefox を試してみる

#目的
Firefoxをnodejs + selenium-webdriver + geckodriverからキックしてみる

##SeleniumBasicのインストール
※環境変数の文字数制限により、同居(笑)
[Seleniumbasic](https://florentbr.github.io/SeleniumBasic/)の Release page より SeleniumBasic-2.0.9.0.exe をDLする
exeを実行すると、C:\Users\user_name\AppData\Local\SeleniumBasic にインストールされる
ソースコードのプロジェクトをVS2019で開くと .NET Framework 3.5 を指定しているので
Windowsの設定 -> アプリ -> オプション機能 -> Windowsのその他の機能 -> .NET Framework 3.5 が有効であることを確認する

##selenium-webdriverのインストール
※v4なのは、Edgeと比較するため(かもしれない)

<pre>
> npm install -S selenium-webdriver
+ selenium-webdriver@4.0.0-alpha.7
</pre>
##Geckodriverのインストール
[mozilla/geckodriver](https://github.com/mozilla/geckodriver/releases)
より最新版(geckodriver-v0.26.0-win64.zip)をDLする
geckodriver-v0.26.0-win64.zip を解凍後 geckodriver.exe を SeleniumBasic フォルダに上書きする

##サンプルコード
```js
const { Builder, By, Key, until } = require('selenium-webdriver');

let driver;
(async () => {
  try {
    driver = await new Builder().forBrowser('firefox').build();
    
    await driver.get('https://www.google.co.jp/');
    await driver.findElement(By.name('q')).sendKeys('webdriver', Key.RETURN);
    await driver.wait(until.titleIs('webdriver - Google 検索'), 5000); 
    // await driver.sleep(5000);
  }
  catch(error) {
    console.error(error);
  }
  finally {
    if(driver) {
      await driver.quit();
    }
  }
})();
```
#参考にしたのは以下のサイト
[selenium-webdriver](https://www.npmjs.com/package/selenium-webdriver)
[mozilla/geckodriver](https://github.com/mozilla/geckodriver/releases)
[Windows 10 + Excel2016 VBA + seleniumbasic で chromedriver / msedgedriver を使ってみる](https://qiita.com/tabizou/items/9793dc04d3d98d3b4842)
⚠️Pythonのデフォルト引数値に気をつけましょう⚠️

ちゃお・・・†

最近Pythonのデフォルト引数値による意図せぬ挙動に悩まされたので、同じ過ちを繰り返さぬようここで情報を共用したいと思います。こちらの環境はPython 3.7.7と3.8.3です。

# デフォルト引数値とは
下記コードのうち `dt=datetime.now()`を指します。


```py
from datetime import datetime


def show_second(dt=datetime.now()):
    print(dt.second)
```

# Pythonのデフォルト引数値の罠
先ほどのコードを、 `show_second` 関数を一度呼び出し、三秒後にまた `show_second` 関数を呼び出すようにいじってみました。

```py
import time
from datetime import datetime


def show_second(dt=datetime.now()):
    print(dt.second)

show_second()  #=> 23
time.sleep(3)
show_second()  #=> 23
```

すると、なんということでしょう！三秒間sleepしたにも関わらず二度目の `show_second` 関数呼び出し時にプリントされる値が三秒前と同じでした…！？時が止まった？ザ・ワールド？？？新手のスタンド使いか？？？


# Pythonのデフォルト引数値の挙動
さて、これはどういうことかとPythonのドキュメントを読んでみたところ、下記の記述がありました。

> デフォルト引数値は関数定義が実行されるときに左から右へ評価されます。 これは、デフォルト引数の式は関数が定義されるときにただ一度だけ評価され、同じ "計算済みの" 値が呼び出しのたびに使用されることを意味します。
> from: https://docs.python.org/ja/3/reference/compound_stmts.html#function-definitions

つまり、関数定義時にデフォルト引数値は一度評価され、その結果がメモリーに保存されて、以降はその関数を何回呼び出してもデフォルト引数値を利用する場合は関数定義時の評価結果を使用するという仕組みになっているようです。

なので、`datetime.now()` のようなcallする度に違う結果を出すもの and/or リアルタイム性が求められるものをデフォルト引数値として用いるのは危険です⚠️

同様にデフォルト引数値にリストや辞書を指定したときも気をつける必要があるようです。([Pythonの関数でのデフォルト引数の使い方と注意点 | note.nkmk.me](https://note.nkmk.me/python-argument-default/))

# Pythonのデフォルト引数値の対策
それではどうしたらいいかというと、デフォルト引数値に `None` を設定して、`None` であれば本来デフォルト引数値として設定したかった値を代入するという風にするのが良いそうです。

以下example codeです。

```py
import time
from datetime import datetime


def show_second(dt=None):
    if dt is None:
        dt = datetime.now()
    print(dt.second)

show_second()  #=> 23
time.sleep(3)
show_second()  #=> 26
```

そんなわけでPythonのデフォルト引数値に気をつけようというお話でした。
vagrant up がエラーになる

## 概要
エラーの備忘として書いていきます。

エラー① vagrant upでエラーになる（tmp？）
エラー② (更新していきます)

## エラー① vagrant upでエラーになる（tmp？）
今まで普通に立ち上げができていたのに、ある日突然下記のようなエラーがでました。実は２回目なのに、またググって調べる私・・・。もう忘れないように（いや、忘れてもすぐ解決できるように）解決した方法を備忘として記録しておきます。

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["showvminfo", "4e50bcbc-38e6-4a31-80d1-29b34962fae1"]

Stderr: VBoxManage: error: Failed to create the VirtualBox object!
VBoxManage: error: Code NS_ERROR_SOCKET_FAIL (0xC1F30200) - IPC daemon socket error (extended info not available)
VBoxManage: error: Most likely, the VirtualBox COM server is not running or failed to start.
```

### ★試したこと★
1. `vagrant halt`　・・・　❌
前回立ち上げ時に異常停止になっていたかも？と思い強制終了や再起動をしましたが、同じよなエラー文が表示されるだけでした。


2. vagrantのアンインストール＆再インストール　・・・　❌
最新版の6.1のバージョンだと別のエラーが出たので、6.0のバージョンをインストールするも、また最初と同じエラーメッセージが表示されましたorz


3. tmp ディレクトリのパーミッション変更・・・⭕️
 - `ls -la /private/tmp`
とまず実行してみると下の■before■ような結果に。`drwxr-xr-x`がtmp ディレクトリのパーミッション（読み書きなどの権限）を表している***らしい***のですが、それがどうやらおかしい**らしい**。
 - `cd /private`  `sudo chmod 1777 tmp`
の順に実行してからもう一度`ls -la /private/tmp`を実行すると、■after■の結果に。「-」が「w」に変わり、どうやらwriting(書き換え？)の権限が与えられた模様(うろ覚え)。このあと`vagrant up`するといつも通り進められました。

```
■ before ■
total 0
drwxr-xr-x  12 root     wheel  384  6 16 10:21 .
drwxr-xr-x   6 root     wheel  192 12 28 18:52 ..
（以下、省略）
```
```
■ after ■
total 0
drwxrwxrwt  15 root     wheel  480  6 16 11:25 .
drwxr-xr-x   6 root     wheel  192 12 28 18:52 ..
（以下、省略）
```
Raspberry Pi で iPhoneを探す(iBeacon)

# やりたいこと
1. iPhoneでibeaconを発信して、Raspberry Piでそれを受信する
2. 信号強度から距離を計算する

# iBeacon発信
iPhoneのアプリ(Beacon入門, 無料)を使用
### 発信方法
「ビーコン発信」の画面でこの矢印をタップするだけ
<img width="375" alt="iOS の画像 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404557/552850b2-b22b-f413-9b03-bbe4cca9b0cb.png">
これで発信できます
<img width="375" alt="iOS の画像 (3).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404557/65f70208-02c4-17ef-c6f0-d3f5bf8beef6.png">


# iBeacon受信
Raspberry Pi 3B+を使用
受信用のプログラムを作成

実行用コード

```javascript:scan.js

var Log4js = require('log4js');

Log4js.configure("log_config.json");

var logger = Log4js.getLogger('system');


Bleacon = require('bleacon');
Bleacon.startScanning();

Bleacon.on('discover', function(bleacon) {
   console.dir(bleacon);
   logger.info(JSON.stringify(bleacon));
});
```

ログ設定ファイル

```json:log_config.json
{
    "appenders": {
        "default_appenders":{
            "type":     "file",
            "filename": "./logs/system.log",
            "pattern":  "-yyyy-MM-dd",
            "maxLogSize": 10000000,
            "backups": 100
        }
    },
    "categories": {
        "default":{
            "appenders":["default_appenders"],
            "level": "INFO"
        }
    }
}
```


あとはこれを実行するだけ
ログはこんな感じ

```
[2020-05-21T23:19:54.235] [INFO] system - {"uuid":"485344424c45414480c01800ffffffff","major":100,"minor":1,"measuredPower":-59,"rssi":-69,"accuracy":1.8809104243859365,"proximity":"near"}
[2020-05-21T23:19:54.299] [INFO] system - {"uuid":"485344424c45414480c01800ffffffff","major":100,"minor":1,"measuredPower":-59,"rssi":-61,"accuracy":1.1346805817813888,"proximity":"near"}
```

# 距離計算
発信信号強度(TxPower)と受信信号強度(RSSI)を使って距離が求められる

```math
RSSI = TxPower - 20 * lg(d)
```

```math
d=10^\frac{TxPower-RSSI}{20}
```

# (参考)テスト
iPhoneを持ってRaspberry Piの前を通り過ぎてみる
![bluetooth_log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404557/1551b321-df62-e85e-bc70-eabfdb778666.png)