OmniAICreator/Qiita-1.07M huggingface dataset:
tar, gzipコマンド


tar tvf document.tar
tar xf document.tar

tar cf user.tar *

```
[root@ik1-331-25935 id]# tar cf user.tar *
[root@ik1-331-25935 id]# ls
log.txt  pstree.txt  user.info  user.tar
```

tar tvf user.tar

```
[root@ik1-331-25935 sato.d]# tar tvf user.tar
-rw-r--r-- root/root      2937 2018-04-11 11:51 log.txt
-rw-r--r-- root/root      2907 2018-04-11 11:48 pstree.txt
-rw-r--r-- root/root        87 2018-04-11 11:43 user.info
```

tar xf user.tar
tar tvf user.tar
gzip user.tar

```
[root@ik1-331-25935 sato.d]# tar xf user.tar
[root@ik1-331-25935 sato.d]# ls
log.txt  pstree.txt  user.info  user.tar
[root@ik1-331-25935 sato.d]# tar tvf user.tar
-rw-r--r-- root/root      2937 2018-04-11 11:51 log.txt
-rw-r--r-- root/root      2907 2018-04-11 11:48 pstree.txt
-rw-r--r-- root/root        87 2018-04-11 11:43 user.info
[root@ik1-331-25935 sato.d]# gzip user.tar
[root@ik1-331-25935 sato.d]# ls
log.txt  pstree.txt  user.info  user.tar.gz
[root@ik1-331-25935 sato.d]# ls -l
total 16
-rw-r--r-- 1 root root 2937 Apr 11 11:51 log.txt
-rw-r--r-- 1 root root 2907 Apr 11 11:48 pstree.txt
-rw-r--r-- 1 root root   87 Apr 11 11:43 user.info
-rw-r--r-- 1 root root 1507 Apr 11 11:52 user.tar.gz
```

gunzip user.tar.gz
```
[root@ik1-331-25935 sato.d]# gunzip user.tar.gz
[root@ik1-331-25935 sato.d]# ls
log.txt  pstree.txt  user.info  user.tar
[root@ik1-331-25935 sato.d]# ls -l
total 24
-rw-r--r-- 1 root root  2937 Apr 11 11:51 log.txt
-rw-r--r-- 1 root root  2907 Apr 11 11:48 pstree.txt
-rw-r--r-- 1 root root    87 Apr 11 11:43 user.info
-rw-r--r-- 1 root root 10240 Apr 11 11:52 user.tar
[root@ik1-331-25935 sato.d]# gzip user.tar
[root@ik1-331-25935 sato.d]# ls -l
total 16
-rw-r--r-- 1 root root 2937 Apr 11 11:51 log.txt
-rw-r--r-- 1 root root 2907 Apr 11 11:48 pstree.txt
-rw-r--r-- 1 root root   87 Apr 11 11:43 user.info
-rw-r--r-- 1 root root 1507 Apr 11 11:52 user.tar.gz
```

```
[root@ik1-331-25935 sato.d]# du -h user.tar.gz
4.0K    user.tar.gz
```

```
[root@ik1-331-25935 sato.d]# gunzip user.tar.gz
[root@ik1-331-25935 sato.d]# du -h user.tar
12K     user.tar
```
java8 lambda入門編

# java8 lambda 式とは
実装が必要なメソッドを1つだけ持つインターフェースに、
実現内容を簡単に書ける式。

例1：local classを利用した場合

```java
	public static void main(String[] args) {
		
		// local class を利用した場合
		class LocalImp implements Runnable {
			public void run() {
				System.out.println("hello lambda!");
			}
		}

		Runnable runner = new LocalImp();
		runner.run(); // hello lambda!

	}
```

例2：無名classを利用した場合

```java
	public static void main(String[] args) {

		// 無名class を利用した場合
		Runnable runner = new Runnable() {
			public void run() {
				System.out.println("hello lambda!");
			}
		};

		runner.run(); // hello lambda!

	}
```

例3：*lambda式を利用した場合*

```java
	public static void main(String[] args) {

		// lambdaを利用した場合
		Runnable runner = () -> {System.out.println("hello lambda!");};
		
		runner.run(); // hello lambda!

	}
```

# 変数のスコープ
匿名クラスの使い方と同様、
外側で定義された変数を使用する場合、final もしくは実質的 final である必要がある。
（java8は、final定義が省略できるが、実質的finalが必要）

例1：final変数の参照

```java
	public static void main(String[] args) {

		final int count = 1;
		
		Runnable runner = () -> {
			System.out.println("count is " + count);
		};

		runner.run(); // count is 1
```

例2：finalを省略する場合

```java
	public static void main(String[] args) {

		int count = 1;
		
		Runnable runner = () -> {
			System.out.println("count is " + count);
		};

		runner.run(); // count is 1

	}
```

例3：実質finalではない場合、コンパイルエラー

```java
	public static void main(String[] args) {

		int count = 1;
		count ++; //実質finalではない
		
		Runnable runner = () -> {
			System.out.println("count is " + count);
			// コンパイルエラー：Local variable count defined in an enclosing scope must be final or effectively final
		};

		runner.run();

	}
```

例4：外部参照を変更しよう場合、コンパイルエラー

```java
	public static void main(String[] args) {

		int count = 1;
		
		Runnable runner = () -> {
			System.out.println("count is " + count);
			
			count ++;
			// コンパイルエラー：Local variable count defined in an enclosing scope must be final or effectively final
		};

		runner.run();

	}
```

# stream APIとは
lambda式で、要素の集まりに対して様々な処理を行うAPI

### 処理の流れ
*結果 = stream生成().中間操作A().中間操作A().中間操作A().終端操作();*

・中間操作：
　　　戻り値がない、内容を編集するだけ。
・終端操作：
　　　戻り値があり。

よく使うものはこれを参照:
[Java8 Streamざっくりまとめ](https://qiita.com/frost_star/items/fb87caf05e106c46dfe4)


# 関数型インターフェイス
java se8で追加されたlambdaで使うパッケージ：
　　[公式：https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/package-summary.html](https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/package-summary.html)

下記はよく使われる例；

### ・ Consumer\<T\>
T:  引数
interface:  void accept(T)

```java
Consumer<Goods> buyer = (goods) -> { System.out.println(goods.getName() + "を買いました。"); };

buyer.accept(new Goods("コーラ")); // コーラを買いました。
```

### ・ Function\<T, R\>
T:  引数
R:  戻り値
interface:  R apply(T)

```java
		Function<Integer, String> onePlus = (i) -> {
			return "結果は：" + (i + 1);
		};
		
		System.out.println(onePlus.apply(5)); // 結果は：6
```

### ・ Predicate\<T\>
T:  引数
interface:  boolean test(T)
※テスト用かな。。。

```java
		Predicate<String> isNull = (o) -> {
			return  null == o ;
		};
		
		boolean result = isNull.test("notNull");
		
		System.out.println(result); // false
```
DirectX のテクスチャにGDI のデバイスコンテキストを使用して描画した画像を割り当てる

GDI ではアルファを書き込めないので何を書いても透明(アルファ0)にで塗りつぶされるので使い物にならないかも。要調査

GDI+ を使えばアルファも書き込める
アルファを反映するには以下のコードでモードを変更する必要あり。

``` c++
Graphics myGraphics(hDC);
myGraphics.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);
```

# 前提
GDI を使用して描画する仕組みを知っている
http://www.kumei.ne.jp/c_lang/sdk/sdk_24.htm とか

フルカラーのみ。カラーテーブルは考慮していません。

ビットマップ形式のヘッダ、ピクセル情報の格納先はメモリ上に作成、確保しておく必要があります。ヘッダ情報の後ろにピクセル情報をコピーします。
参考 http://www.kumei.ne.jp/c_lang/sdk2/sdk_169.htm

CImage が超便利

# 考え方
1. デバイスコンテキストを取得
2. ビットマップ割り当て
3. 描画
4. ビットマップ形式でメモリ上にコピー
5. メモリ上のデータをテクスチャに割り当て

# 1 と 2 と 4 について
## メモリデバイスコンテキストにビットマップを割り当てる方法
メモリデバイスコンテキストを作成(CreateCompatibleDC)して、ビットマップを割り当てる(CreateCompatibleBitmap)場合

メモリコピーは、GetDIBits でピクセル情報をコピーできるらしい。未確認

GetDIBits は推奨されていないっぽいのでこの方法は使わない方がよさそう

## 画像を読み込む場合、CImage クラスを使用する方法
CImage クラスで、Load メソッドを使用して読み込んだ場合、ビットマップが割り当て済みのデバイスコンテキストも同時に作成されるので、それを使用して描画すれば読み込んだ画像の上に描画することができる。

メモリコピーは、ピクセル情報は、GetBits メソッドでピクセルの先頭アドレスが取得できるので memcpy で丸ごとコピーできる。
ただし、GetPitch メソッドでマイナスが返ってきた場合、先頭のアドレスでは無く画像の最終行の先頭アドレスを示しているので、本当の先頭アドレスを計算する必要がある。

# 3 については取得したデバイスコンテキストで描画するだけ
割愛

# 5 について
コピーしたデータを
D3DXCreateTextureFromFileInMemory または D3DXCreateTextureFromFileInMemoryEx に渡すだけ。
Xcodeのショートカットとカスタマイズメモ

Jump to Definition の近くに
Find Call Hierarchy を置いたら捗りそうなので設定してみた

コンフリクトしてるのはご愛嬌です

<img width="797" alt="キーバインド.png" src="https://qiita-image-store.s3.amazonaws.com/0/25903/a924bf7d-637c-1eef-34e9-33f6e9a092fd.png">
2012/06/27 私の中のJavaScriptの進化

昔書いた社内ブログ記事です。

---

どうも（ｐ・∀・ｑ）

  
父にボジョレーを贈り、母に[フットケア](http://babyfoot.co.jp/)を贈り、妹に[中華街](http://www.dalian-kichi.com/)で奢り、

弟はまだ学生なので放置してきた23日は勤労感謝の日でした。  
  
  
さてさて、私のチームでは、PHPのコーディング規約で

[ハンガリアン記法](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95)のようなものを使用しています。  
  
変数の先頭に、変数の型や意味を現す文字列を付与する記法です。

  
  
＋＋＋　例　＋＋＋  
[![](http://lh4.ggpht.com/_9JzdOC0XbDg/TOvkAvIeJHI/AAAAAAAAAPg/41GGT6D_t3g/s800/20101123.gif)](http://picasaweb.google.com/lh/photo/lxGd6kWSpZ1iE_EU2wdYYQ?feat=embedwebsite)  
  
  
今回はこの記法の概要と、利点、欠点を書いてみます。

  
  
  

**概要**

  
  
例えば私の趣味を配列型の変数に格納する場合（ｐ・ω・ｑ）＜ﾘｱ充ｨｪｨ（←

変数に『配列（`array`）を意味する `ar` 』（ローカルルール）をつけます。

  
```php
$arMyHobbies = array("ネット", "漫画", "手工芸", "映画");
```
  
  
配列をカンマ区切りの文字列に変換するとかよくありますよね。

文字列の変数には『文字列（`string`）を意味する `s` 』（ローカルルール）をつけます。

  
```php
$sMyHobbies = implode(",", $arMyHobbies);
```

  
（`implode()` は、第二引数の配列を、第一引数の文字列で連結し、それを文字列で返します。）

  
  
**利点**

  
  
コードの中でおかしい部分を見つけやすいことが一番の利点だと思います。

  
  
例えば、`implode()` の第二引数は配列でないといけませんが

下のように書いてあったら、第二引数が配列なのか見ただけではわかりません。

  
```php
$mine = implode(",", $yours);
```

  
少し前のコードまでさかのぼって、

`$yours` にホントに配列が入っているか確認しないと安心できません。

  
  
一方、これなら合っている可能性が高いので安心です（ｐ・∀・ｑ）

  
```php
$sMine = implode(",", $arYours);
```

  
  
また、これは間違っている可能性が高いので確認する必要があります（ｐ・д・ｑ）

  
```php
$sMine = implode(",", $sYours);
```

  
  
他にも、この式はおかしいとパッと見でわかります。

  
```php
if($iMailOkFlag === true) {...}
```

  
『整数（`int`）を表す `i` で始まっている』（ローカルルール）ので、

このフラグの値は `1` または `0` のはずだからです。

  
  
本来のハンガリアン記法は変数の型だけでなく、もっと多岐に渡って利用できます。

  
例えば、  
  

*   Webページで入力された生の値が入った変数
    
*   入力値チェック後の変数
    
*   HTMLエンコード後の変数
    

  
これらを区別してみるだけで、入力値チェックをしていない変数を

DBに登録してしまうような間違いが減ります。

  
私のチームでも、Webページからの入力値の種類を区別するために使っています。  
  
  
これについては、[間違ったコードは間違って見えるようにする](http://local.joelonsoftware.com/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)という記事がお勧めです。  
  
  
**欠点**

  
  
もちろんこの記法に対する反論もあるようです。

  
慣れない人には使いにくいとか、型を変えたときの修正箇所が多いとか。

  
ハンガリアン記法が、型でしか区別できないという誤った意味で流行ってしまったのも

反論者を増やしてしまった一因らしいです。

  
  
それでも私は便利だと思いますけどね・・（ｐ・ω・ｑ）

  
特にPHPは変数を宣言するときに型を書かないので、

関数の返り値の型など明記されている方がわかりやすいです。

  
  
これなら**グループのメンバーを数えた整数値**が返ってきそうですし。

  
```php
$iCount = countMembers($iGroupId);
```

  
こっちだと**実行結果の成否**が返ってくるような予測ができます。

  
```php
$bResult = countMembers($iGroupId, $iCount);
```

  
（ `b` は `bool` を意味して、TRUE/FALSEのこと。）

  
  
  

もしこの記法について知らない人がいたら、  
[間違ったコードは間違って見えるようにする](http://local.joelonsoftware.com/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)を読んでみてください。  
  
コーディング記法は好き嫌いあると思いますが、  
他の人の書き方を聞くだけでも面白いですよね。  
  
  
大文字小文字混ぜて使うのかどうかとか、  
  
`$iMyStatus`、`isStudent()`  
  
ハイフンを使うのかどうかとか、  
  
`$user-name`、`$user-age`
  
アンスコを使うのかどうかとか、  
  
`$my\_name`、`$get\_my_data()`
  
Companyはどうやって短縮するのかとか（笑）  
  
`$company`、`$comp`、`$cmpn`
隠し情報をゼロ幅文字エンコードする仕組み

# はじめに

ゼロ幅文字にエンコードした隠し情報で、文書をリークしたメンバーを特定 | 秋元@サイボウズラボ・プログラマー・ブログ
http://developer.cybozu.co.jp/akky/2018/04/leaker-detection-by-zero-width-characters/

が、とても興味深かったのでRubyで写経してみました。

# どういう仕組み？

簡単に書くと次のようになります。

```rb
v = "a".ord.to_s(2)             # => "1100001"
v = v.tr("01", "\u{200B 200C}") # => "‌‌​​​​‌"
v = v.tr("\u{200B 200C}", "01") # => "1100001"
v.to_i(2).chr                   # => "a"
```

1. 文字を二進数にする
1. 0 と 1 を見えない文字に変換する
1. 見えない文字を 0 と 1 に変換する
1. 二進数から文字に変換

たったこれだけのことですがアイデアをすぐに適用できるのはすごいなあと感心しました。

# 実際に埋め込んで復元するまでの流れ

## 埋め込みたい秘密の文字列を準備

```rb
str = "ぱくった人(id:123)"
```

もっとちゃんと作る場合には、改竄されてもわかるようにハッシュなどにした方がよいとのことです。

## 見えない文字列に変換

```rb
bin = str.codepoints.collect { |code|
  code.digits(2).collect { |bit|
    bit.zero? ? "\u200B" : "\u200C"
  }.join
}.join("\u200D")

bin.size                        # => 133
bin                             # => "‌​​​‌‌‌​​​​​‌‌‍‌‌‌‌​​‌​​​​​‌‌‍‌‌​​​‌‌​​​​​‌‌‍‌‌‌‌‌​‌​​​​​‌‌‍​‌​‌‌‌​‌​‌‌‌​​‌‍​​​‌​‌‍‌​​‌​‌‌‍​​‌​​‌‌‍​‌​‌‌‌‍‌​​​‌‌‍​‌​​‌‌‍‌‌​​‌‌‍‌​​‌​‌"
```

- U+200B, U+200C, U+200D の3つを使いました
- 本家では4つ使ってますがまだ意図がよくわかってません
- bin 変数がゼロ幅の文字列で、ブラウザ上では空文字列に見えます
- Emacsだと1文字1ドットぐらいですが**何かいる**のが確認できます

## 任意の文字列に埋め込む

```rb
text = "相手の防#{bin}衛ラインを乱したりして、得意の接近戦に持ち込もう"
text # => "相手の防‌​​​‌‌‌​​​​​‌‌‍‌‌‌‌​​‌​​​​​‌‌‍‌‌​​​‌‌​​​​​‌‌‍‌‌‌‌‌​‌​​​​​‌‌‍​‌​‌‌‌​‌​‌‌‌​​‌‍​​​‌​‌‍‌​​‌​‌‌‍​​‌​​‌‌‍​‌​‌‌‌‍‌​​​‌‌‍​‌​​‌‌‍‌‌​​‌‌‍‌​​‌​‌衛ラインを乱したりして、得意の接近戦に持ち込もう"
```

埋め込んだのにブラウザ上では見えていないことがわかります。

## 埋め込んだ文字列から見えない文字列を抽出

```rb
bin2 = text[/[\u200B-\u200D]+/]
```

埋め込まれているのは一箇所だけと仮定しています。

## 見えない文字列から秘密の文字列に復元

```rb
bin2                            # => "‌​​​‌‌‌​​​​​‌‌‍‌‌‌‌​​‌​​​​​‌‌‍‌‌​​​‌‌​​​​​‌‌‍‌‌‌‌‌​‌​​​​​‌‌‍​‌​‌‌‌​‌​‌‌‌​​‌‍​​​‌​‌‍‌​​‌​‌‌‍​​‌​​‌‌‍​‌​‌‌‌‍‌​​​‌‌‍​‌​​‌‌‍‌‌​​‌‌‍‌​​‌​‌"

str2 = bin2.split("\u200D").collect { |str|
  str.chars.collect.with_index { |char, i|
    (char == "\u200B" ? 0 : 1) << i
  }.sum.chr("UTF-8")
}.join

str2                            # => "ぱくった人(id:123)"
```

正しく復元できました。

この仕組みがあれば文章のコピペを追跡しやすくなります。自衛のためのChrome拡張もありますがそれでも効果はあると思います。最近だと個人運営のゲーム攻略サイトの盗用対策として活用するのもおもしろそうです。

# 参照

Be careful what you copy: Invisibly inserting usernames into text with Zero-Width Characters
https://medium.com/@umpox/be-careful-what-you-copy-invisibly-inserting-usernames-into-text-with-zero-width-characters-18b4e6f17b66

ゼロ幅文字にエンコードした隠し情報で、文書をリークしたメンバーを特定 | 秋元@サイボウズラボ・プログラマー・ブログ
http://developer.cybozu.co.jp/akky/2018/04/leaker-detection-by-zero-width-characters/

その透明な文字に混じらず、見つけ出すんだ。 - Qiita
https://qiita.com/kitsuyui/items/12db383f5e5971f32b08

Whitespace character - Wikipedia
https://en.wikipedia.org/wiki/Whitespace_character

chpmrc/zero-width-chrome-extension: Replace scary zero-width characters with funny emojis
https://github.com/chpmrc/zero-width-chrome-extension
Vagrant 事始め 04 - Vagrant のネットワーク設定

[前回](https://qiita.com/centipede/items/f6ec6bf5b78440dbd03c)からの続きです。

Vagrantfile で設定できるネットーワークは、大まかに 5 種類あります。

- NAT
- ホストオンリーアダプター
- 内部ネットワーク
- ブリッジアダプター
- ポートフォワーディング

## 1. NAT

Vagrantfile の初期設定です。同ファイルにネットワークの設定を記述しない場合は、NAT が設定されます。NAT の設定がされた場合、SSH の接続はできず、Virtualbox のターミナルで仮想マシンを操作することになります。

## 2. ホストオンリーアダプター

ホスト (ローカルマシン) から仮想マシンへ接続ができるようになります。この設定で、仮想マシンの IP を固定 IP にするか、動的 (DHCP) に指定するか選択できます。

```ruby:Vagrantfile
  # 固定 IP を指定するときは、下記の行を記述する
  config.vm.network "private_network", ip: "192.168.33.10"
```

```ruby:Vagrantfile
  # 動的に IP を指定するときは、下記の行を記述する
  config.vm.network "private_network", type: "dhcp"
```

## 3. 内部ネットワーク

1. NAT 接続と同じですが、Vagrantfile に同じネットワーク名が指定されている場合、仮想マシン同士で通信ができるようになります。

```ruby:Vagrantfile
  # ネットワーク名を virtualbox__intnet で指定する
  config.vm.network "private_network", ip: "192.168.33.10", virtualbox__intnet: "mynetwork"
```

内部ネットワークの使用を設定するが、名称を指定しない場合は初期設定で「intnet」名が割り当てられます。

```ruby:Vagrantfile
  # virtualbox__intnet: true だと、ネットワーク名に intnet が割り当てられる
  config.vm.network "private_network", ip: "192.168.33.10", virtualbox__intnet: true
```

### 4. ブリッジアダプター

ローカルマシンが所属するネットワーク内の IP を仮想マシンに割り当てます。同一のネットワーク内の IP を割り当てることで、ローカル・仮想マシン以外のクライアントが接続できるようになります。

```ruby:Vagrantfile
  # 固定 IP を割り当てる場合
  config.vm.network "public_network", ip: "192.168.0.10"
```

```ruby:Vagrantfile
  # DHCP で動的に IP を割り当てる場合
  config.vm.network "public_network"
```

```ruby:Vagrantfile
  # 複数のネットワークインターフェースがある場合、vagrant up 時に使用するネットワークインターフェースを尋ねられるので、
  # その場合は Vagrantfile に使用するネットワークインターフェースを記述してしまう
  # 例えば、有線LAN と無線 LAN 接続ができるノート PC など
  config.vm.network "public_network", bridge: "en0: Ethernet"
```

### 5. ポートフォワード

ローカルマシンの特定のポートに届く接続を、仮想マシンに指定したポートへ転送します。

```ruby:Vagrantfile
  # ローカルマシン 80 番ポートへの接続を仮想マシンの 8080 番ポートへ転送する
  config.vm.network "forwarded_port", guest: 80, host: 8080
```

### ネットワーク設定の一覧表

|種類|VM<br>-> ローカル|ローカル<br>-> VM|VM<br>-> 外部|外部<br>-> VM|VM <-> VM|
|:---|:---:|:---:|:---:|:---:|:---:|
|NAT| 〇 | × | 〇 | × | × |
|<nowrap>ホストオンリーアダプター</nowrap>| 〇 | 〇 | 〇 | × | × |
|内部ネットワーク| 〇 | × | 〇 | × | 〇 |
|ブリッジアダプター| 〇 | 〇 | 〇 | 〇 | 〇 |
|ポートフォワーディング| 〇 | △ | 〇 | × | × |

* 外部とはローカルマシン以外を指します<br>(ローカルネットワークのPCや仮想マシンの他インターネット等)
* 「VM <-> VM」は同じネットワーク内に存在する仮想マシン同士の通信を指します

---

* [Vagrant 事始め 05 - 共有フォルダを設定する](https://qiita.com/centipede/items/5b3cb4965618993cefec)
IntelliJのターミナルでmsys2を使う

普通にmsys2のbashを設定しただけではいろいろ不便だったので調べてみました。


IntelliJのSettingを開き、Tools > Terminalと選択してShell pathを次のようにします。

```
"cmd.exe" /c set "CHERE_INVOKING=1" & set "MSYS2_PATH_TYPE=inherit" & "C:\msys64\usr\bin\bash.exe" --login -i
```

環境変数を設定しているのはmsys2の設定で、

- CHERE_INVOKING=1

カレントディレクトリを作業ディレクトリとする。
これを設定しておけばshellのカレントディレクトリがプロジェクトのルートから開始できます。

- MSYS2_PATH_TYPE=inherit

パスの設定をwindowsから引き継ぎます。
category.php に表示される記事一覧から、子カテゴリの記事を除外する

# 結論
add_action('pre_get_posts') を使う。
下記のコードをfunctions.phpに記載しておけば、 category.phpへのアクセス時に呼び出す

```php

function exclude_category( $query ) {
  /*
   * 今回、除外したいのは、
   * category.phpというテーマファイルが呼び出されたとき（つまり```is_category() == true```）に、
   * そのページで表示する用の記事一覧を取得するタイミングの標準クエリからなので、
   * 標準クエリを判定する ```$query->is_main_query()``` と
   * カテゴリページであることを判定する ```$query->is_category()```とを用いて
   * 条件を設定する。
   */
  if($query->is_main_query() && $query->is_category()){
    // 現在のカテゴリページの、子カテゴリ一覧を取得する
    $child_cats = myfunc_get_children_categories(); 

    // 子カテゴリ一覧を、カテゴリIDのみの配列にする
    // その際、除外する指示子である"-"（マイナス）を、IDの前につけておく。
    $exclude_cat_ids = array_map(function($cat){
      return "-".$cat->term_id; // $cat->cat_IDでも大丈夫なはず
    }, $cats);

    // join
    $imploded_ids = implode(',', $exclude_cat_ids);

    $query->set('cat', $imploded_ids);
  }
}

add_action( 'pre_get_posts', 'exclude_category' );
```

# 問題点
たぶんこれだと、「現在のカテゴリと、子カテゴリの両方に属している記事」も除外されてしまうので、そういう記事を救済する処置は必要そう。
Docker コンテナの CPU 使用率を制限する Tips

Docker コンテナが利用できるリソースを制限する方法はいくつかあるが、その中のひとつに `--cpus=N` というオプションがある。[^1]

[^1]: [Limit a container's resources \| Docker Documentation](https://docs.docker.com/config/containers/resource_constraints/#cpu)

これは、例えば CPU コア数が 4 個だった場合に、`docker run` コマンドに `--cpus=3.2` というオプションを指定することで CPU 使用率を最大 80% 制限できる。

マシンごとに CPU コア数を調べてオプションをベタ書きで指定してもいいが、以下のように `--cpus` オプションを指定すればどの環境でも CPU 使用率を最大 80% に制限できる。

``` console
$ docker run -it \
    --cpus=$(cat /proc/cpuinfo | grep processor | wc -l | perl -ne 'print $_ * 0.8') \
    alpine
```
ECSクラスターのボリュームをKMSで暗号化する

# 概要
システム要件の都合上、ECSで作成するEC2インスタンスのボリュームの暗号化が必要になりました。
AWSマネジメントコンソールでは、ECSクラスターを作成時に暗号化できないため、`ecs-cli`コマンドを利用してボリュームを暗号化します。
事前に暗号化済みAMIを作成するなど、一工夫必要になります。

# 手順
## ecs-cliをインストール
インストール手順は[こちら](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI_installation.html)を参照してください。

- ecs-cliインストール（Macの場合。最後のコマンドでバージョンが表示されればOK）。

```
$ sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-darwin-amd64-latest
$ sudo chmod +x /usr/local/bin/ecs-cli
$ ecs-cli --version
```

- 初期設定（デフォルトのprofileとconfigを使う場合）

```
# AWS認証情報を登録
$ ecs-cli configure profile \
    --access-key ＜AWSアクセスキー＞ \
    --secret-key ＜AWSシークレットアクセスキー＞

# ECSの設定を登録
$ ecs-cli configure \
    --cluster ＜クラスター名＞ \
    --default-launch-type EC2 \
    --region ap-northeast-1
```

## ボリューム暗号化済みAMIを作成
[デフォルトのECS用AMI](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-optimized_AMI.html)は暗号化されていないため、AMIをコピーします（コピー時にボリュームを暗号化）。
以前はパブリックなAMIはコピーできず、インスタンス作成→AMI作成→AMIコピー時に暗号化という手順を踏まなければいけなかったので、かなり便利になりました。

- 対象のAMIを検索して[アクション]→[AMIのコピー]を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36626/4474d334-b3f6-f527-36d0-5ecf3ed6db82.png)

- [送信先のリージョン]、[暗号化]を選択し、[名前]、[説明]を入力して[AMIのコピー]を選択する。作成したAMIのIDは控えておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36626/9042fe3b-02c9-cb88-d564-7b5924b74b7b.png)

## ECSクラスター構築
`ecs-cli`コマンドでECSクラスターを構築します。
使用できるオプションは[こちら](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cmd-ecs-cli-up.html)を参照してください。

```
$ ecs-cli up \
    --capability-iam \
    --keypair ＜キーペア名＞ \
    --size ＜インスタンス数＞ \
    --instance-type ＜インスタンスタイプ＞ \
    --image-id ＜暗号化済みAMIのID＞ \
    --vpc ＜VPC ID＞ \
    --subnets ＜サブネットID＞,＜サブネットID＞ \
    --security-group ＜セキュリティグループID＞ \

# 例
$ ecs-cli up \
    --capability-iam \
    --keypair sample-key \
    --size 1 \
    --instance-type t2.micro \
    --image-id ami-xxxxxxxx \
    --vpc vpc-xxxxxxxxx \
    --subnets subnet-xxxxxxxx,subnet-xxxxxxxx \
    --security-group sg-xxxxxxxx \
```

## 確認
作成したインスタンスのボリュームを確認すると、暗号化されていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36626/12e3bfd8-b1ad-1651-982a-6a7a0933b839.png)

## 最後に
ボリュームの暗号化は普段あまり意識されないかもしれませんが、機密情報を扱うシステムでは`ボリュームを全て暗号化すること`のような要件が出てくることがあるため、そんな時に使ってください。
また、ECSはマネジメントコンソールでの操作が限られているため、できる限りコード化しておくと安心だと思います。
SmartGit > 手順 > MergeコミットのRevert

```
Windows 7 Pro (64bit)
SmartGit 17.1.6 #11221, installed: #11182
```

Mergeコミットのrevertをしてみる。

### 手順

1. Log for .画面において、Messageペインで該当のMergeコミットを選択
2. 右クリック > Revert
    - Revert画面でコミットの選択になる (ブランチで複数コミットをしている場合?)
3. Mergeコミットを行う前のコミットを選択
4. Revertを選択
    - **Log for .画面では変化がない**
5. Log for .画面を閉じる
6. メイン画面(起動時の画面)にて該当リポジトリに赤文字**`<reverting>`**が付随している
    - Filesペインにrevertのファイル変更が明示されている
7. Filesペインの全ファイルを選択し、右クリック -> Commit選択
    - Commit Message:に`Merge branch '[ブランチ名]' (reverted from ハッシュ値)`が表示される
8. Commitを選択する

### 注意

手順4においてLog for .画面で変化がない。
変化がないからと、再度RevertするとConflictを起こす。

メイン画面に戻ること。

### link

- [SmartGit > Branchesペイン > Local Branches > ブランチ > rename > originのブランチ名は変更できない](https://qiita.com/7of9/items/f12c66e50503c43283cf)
Fuchsiaで使われているリポジトリ管理ツールJiriを少しだけ触ってみる

## まえおき

複数のGitリポジトリをまとめて管理するツールとして、Androidでは [repo](https://source.android.com/setup/develop/repo) が使われていたけど、Fuchsiaでは [Jiri](https://fuchsia.googlesource.com/jiri)という別のものが使われているらしい。

2018年4月現時点では「もしかしてjira？」って言われるくらいマイナーなツールなんだけども、ちょっとだけ味見してみよう。
（※ あえて「味見」って書いてるのは、この記事ではソースのビルドとかGerrit連携とかは想定してなくて、ただ単にgitリポジトリをまとめて取得することだけを試してみよう！という意図で書いていることをあらかじめご承知おきください...）

## インストール

公式のDocには myrootみたいなのを用意しろって書いてるんだけど、とりあえず味見程度に触りたいだけなら

```
curl -s https://raw.githubusercontent.com/fuchsia-mirror/jiri/master/scripts/bootstrap_jiri | bash -s /usr/local/jiri
ln -s /usr/local/jiri/.jiri_root/bin/jiri /usr/local/bin/jiri
```

rootで↑を実行すれば `jiri` コマンドが使えるようになる。

## repoユーザのためのjiriの基本手順

repoだと

1. マニフェストファイルをどこかのGitリポジトリに置く
2. `repo init -u マニフェストのURL` で `.repo/` が作られて
3. `repo sync -j4` でソース同期


これがjiriだと、

1. 自前で `.jiri_manifest` ファイルを用意する（jiri importとかでインポートすることも可能）
2. `jiri init` で `.jiri_root/` が作られて
3. `jiri update` でソース同期

## いざ味見

importとか、hookとかかなり多機能っぽいんだけど、とりあえずソースをまとめて取ってきたいという用途だけで使う。

### ソースを取ってきたい場所に移動する。

```
$ cd path/to/workspace/
```

### manifestを書く

```xml:.jiri_manifest
<manifest>
  <projects>
    <project name="sdk"
      remote="https://github.com/dart-lang/sdk"
      path="dart-sdk" />
    <project name="flutter"
      remote="https://github.com/flutter/flutter"
      path="flutter" />
    <project name="flutter-engine"
      remote="https://github.com/flutter/engine"
      path="flutter-engine" />
    <project name="flutter-plugins"
      remote="https://github.com/flutter/plugins"
      path="flutter-plugins" />
  </projects>
</manifest>
```

https://fuchsia.googlesource.com/topaz/+/master/manifest/minimal とか色々参考にしつつも、
ソースを取ってくるだけなら、とりあえずこんな感じで書いておけば良さそう。

### jiri init, jiri update

```
$ jiri init
$ jiri update
WARN: Please opt in or out of analytics collection. You will receive this warning until an option is selected.
To check what data we collect run 'jiri init -show-analytics-data'
To opt-in run 'jiri init -analytics-opt=true "/home/ubuntu/workspace"'
To opt-out run 'jiri init -analytics-opt=false "/home/ubuntu/workspace"'

Updating all projects
PROGRESS: Creating project "flutter-engine"
PROGRESS: Creating project "flutter"
PROGRESS: Creating project "sdk"
```

しばらく待っていると、

```
$ ls
dart-sdk/  flutter/  flutter-engine/  flutter-plugins/
```

こんな感じでダウンロード完了。
実にシンプルだ。

## まとめ

repoと違って、 [Jiri](https://fuchsia.googlesource.com/jiri)は `.jiri_manifest` をローカルに用意するだけで始められるので、ローカルのリポジトリ管理でも結構便利な感じがします。
まずは皆さん味見してみましょう。
tensorflow.jsでloadModel

#概要
tensorflow.jsでloadModelをjsdoでやりたかった。

#loadModelの調査

必要なのは、model.jsonとgroup1-shard1of1などのweight
loadModel("model.json")で、モデルとweightを読み込む。


#model.jsonをgithubで探す。

安易に、githubで探す。3つ、見つかった。

MNIST
https://github.com/CreativeGP/tensorflowjs-mnist 
MNIST
https://github.com/yukagil/tfjs-mnist-cnn-demo 
maru,sikaku,sankaku
https://github.com/choonguri/tfjs_shape_inference 

#model.jsonをperseしてみる。

http://jsdo.it/ohisama1/UKRJ


#jsdoの壁

jsdoには、壁が2つある。
1、アセットの1ファイルは、1ｍｂまで。
2、ファイル名が、/assets/c/R/W/c/cRWcMとか、意味不明になる。

挑戦したが、読み込めず。

http://jsdo.it/ohisama1/U8uZ


#作戦変更

githubのrawファイルを直接、読み込む。
結果は、cors規制で、撃沈。

#成功

rawgitを、採用して、corsをすり抜ける。

#成果物

http://jsdo.it/ohisama1/IBcT


以上。
SmartGit > Branchesペイン > Local Branches > ブランチ > rename > originのブランチ名は変更できない

```
Windows 7 Pro (64bit)
SmartGit 17.1.6 #11221, installed: #11182
bitbucketリポジトリ
```

featureブランチを切り作業していた。
一度、リモートoriginにそのブランチをpushしている。

featureブランチの名前が適切でないと思い、名前変更した。ローカルの名前は変更されたが、リモートoriginの名前は変更されない。

ローカルとリモートoriginで異なる名前のブランチになると、将来の参照性が悪くなる。

**SmartGit上のブランチ名変更(下記作業))を使わず、ブランチを新たにきる方がいいだろう**。

- ブランチ名変更 (Local Branche)手順: 
    - Branchesペイン上
    - Local Brancheds内の該当ブランチ名で右クリック
    - Rename

### link

- [技術英語 > Working with pointers successfully requires a [two-pronged] strategy. / 2つのコピーは、将来きっと枝分かれすることになる](https://qiita.com/7of9/items/2c9378a4a1e9bd6c40e0)
Rubyでの配列の数、要素の長さの出し方の3つめ？

最近,paizaのdを全盗.

rubyでのarrayの要素数はlength,size以外だとcountもあった.

[count (Array) - Rubyリファレンス]
(https://ref.xaio.jp/ruby/classes/array/count)

> countメソッドは、配列の中で引数objと同じ要素の数を返します。引数を省略したときは、単純に要素の数を返します。

>
```rb
numbers = [1, 2, 5, 5, 1, 3, 1, 2, 4, 3]
puts numbers.count(1)
puts numbers.count
```

>
```
3
10
```
Link > mistakes > @ stackoverflow

[技術書ランキングサイトをQiita記事を集計して作ったら、2700冊の技術本がいい感じに並んだ](https://qiita.com/jabba/items/edefda09121877b79760)
の[コメント](https://qiita.com/jabba/items/edefda09121877b79760#comment-d09782b64aa96699bb9f)に書いて「失敗」について。

stackoverflowではタイトル検索`title:mistakes`にてmistakes例が見つかる。
https://stackoverflow.com/search?q=title%3Amistakes

votes降順にして見ていくと、自分の言語でよくある失敗の情報に効率的に到達でできるだろうか。
linux tc(Traffic Control)コマンド


送信先IP、送信元ポートを指定してパケットをロスさせる方法

```
tc qdisc add dev [NIC] root handle 1: prio
tc filter add dev [NIC] protocol ip parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc qdisc add dev [NIC] parent 1:1 handle 10: netem loss 100%
tc filter add dev [NIC] protocol ip parent 1: prio 1 u32 match ip dst [送信先IP]/32 match ip sport [送信元ポート] 0xffff flowid 1:1
```

むずかしい。

設定されている内容を一覧表示する

```
tc qdisc show dev [NIC]
```

設定されている内容を削除する

```
tc qdisc del dev [NIC] root
```
Selenium+Chromeで「WebDriverException: Message: unknown error: call function result missing 'value'」とでた場合の対処法

#事象
Docker([toru2220/scrapy-chrome](https://hub.docker.com/r/toru2220/scrapy-chrome/))で
google-chrome(Selenium)を動かしていたところ、以下のエラーが発生

```bash
  File "/usr/local/lib/python3.6/site-packages/selene/elements.py", line 358, in set
    condition=be.visible)
  File "/usr/local/lib/python3.6/site-packages/selene/elements.py", line 251, in _execute_on_webelement
    return command(_wait_with_screenshot(self._webdriver, self, condition))
  File "/usr/local/lib/python3.6/site-packages/selene/elements.py", line 353, in clear_and_send_keys
    webelement.clear()
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py", line 95, in clear
    self._execute(Command.CLEAR_ELEMENT)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing 'value'
  (Session info: headless chrome=65.0.3325.181)
  (Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Linux 4.13.0-19-generic x86_64)
```

#原因
[ここ](https://github.com/webdriverio/webdriverio/issues/2631)を読むと、
単にgoogle-chrome本体に対してchrome-driverのバージョンが古いのが原因とのこと。
確かに最近google-chromeはversionupしたが、chrome-driverはそのままだった、、、、

#対策
chrome-driverを2.37へUpgrade

```udiff:Dockerfile
-RUN	wget https://chromedriver.storage.googleapis.com/2.31/chromedriver_linux64.zip && \
+RUN	wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip && \
 	unzip chromedriver_linux64.zip -d /usr/bin/
```
Twilio Functionsを外部からセキュアに呼び出す

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

Twilioには、サーバーレスアーキテクチャーである [Twilio Functions](https://jp.twilio.com/functions) というサービスがあります。この仕組を使うことで、ユーザ側にサーバーを用意せずに、動的なTwiMLを生成したり、TwilioのRestAPIで電話やSMSを操作することができます。
Functionsを実行するためには、Functionsを作成したときに自動的に生成されるURLを呼び出す必要があります。

この記事では、Functionsの呼び出し時のセキュリティ対策として、「ACCESS CONTROL」を活用する方法を記載します。

## ACCESS CONTROLとは

Twilioには、Functionsに限らず、Twilioからの正式なリクエストであることを証明するために、[バリデーションリクエスト](https://jp.twilio.com/docs/usage/security#validating-requests)という仕組みが用意されています。具体的には、TwilioからのリクエストURLやパラメータに対して、ユーザしか知り得ないAuth Tokenでハッシュ値を取って、それをX-Twilio-SignatureというHTTPヘッダーオプションの入れています。
ユーザ側は、このヘッダー値を自ら検証することで、本当にTwilioからのリクエストであること、パラメータを含め改ざんがされていないことを保証することができます。

Twilio Functionsには、Functionsの生成時に以下のACCESS CONTROLオプションがあります。
![スクリーンショット 2018-04-11 09.32.46.png](https://qiita-image-store.s3.amazonaws.com/0/86046/5df5d664-94ba-f220-af1e-796ac666f74c.png)
このチェックボックスをONにすることで、上記のバリデーションリクエストがFunctions実行時に検証されます。
すなわち、Twilio内部からのアクセスに制限する場合（たとえば、電話番号の着信設定時のURLとしてFunctionsを指定する場合など）は、チェックをONにしておくことが推奨されます。

## 外部からのFunctions呼び出しでバリデーションリクエストを利用する

上記のように、X-Twilio-Signatureを検証するのが、ACCESS CONTROLの目的ですので、外部のサーバーからFunctionsをコールする場合も、Twilioからのリクエスト同様にX-Twilio-Signatureを生成してヘッダーに付与することで、ACCESS CONTROLをONにしながらセキュアなアクセスが可能となります。

### X-Twilio-Signatureの生成例

以下のコードは、Node.jsを使って、X-Twilio-Signatureを生成するサンプルです。

```Node.js
// Get twilio-node from twilio.com/docs/libraries/node
const crypto = require('crypto');

// Your Auth Token from twilio.com/console
const authToken = 'YOUR_AUTH_TOKEN';

// FunctionsのURL
let url = '呼び出したいFunctionsのURL';

// POSTパラメータ
const params = {
  test: 'hogehoge'
};

// パラメータを並び替えて、URLに連結した文字列を生成
Object.keys(params).sort().forEach(function(key) {
  url = url + key + params[key];
});

// X-Twilio-Signatureの生成
const signature = crypto.createHmac('sha1', authToken).update(Buffer.from(url, 'utf-8')).digest('base64')

console.log(signature);
```

このようにして生成したX-Twilio-SignatureをFunctionsの呼び出し時にPOSTヘッダーに入れてあげることで、外部から呼び出す際のセキュリティ対策となります。ちなみにSignatureが違っている場合は、呼び出しが403エラーとなります。
[Memo] Python でPPTを作ろう

やってみました！！
説明とかもまだけておらずすいません、、
今、これまでの記事等を整理をしておりまして、、

時間を見つけて説明を書きますが、まずはGithubの方にてアプリケーションをご賞味ください！

https://github.com/Rowing0914/ppt_creation_python
[C#] Google Drive API v3を使ってGoogle Slidesを取得する

# 概要
Google Drive API v3の日本語記事があまり存在せず~~泣いた~~困ったため
備忘録もかねてつらつらと記載します。
この記事ではC#を用いてGoogle Slidesを取得します。

# Google Slidesを取得する

ユーザー認証やDrive API serviceを生成する過程は[Google Drive APIs .NET Quickstart](https://developers.google.com/drive/v3/web/quickstart/dotnet)を参照。

### リクエストパラメータの定義
FilesResource.ListRequestのインスタンスを作成し、ファイル一覧を取得する際に使われるリクエストパラメータを定義します。
各プロパティは[ListRequest Class Reference](https://developers.google.com/resources/api-libraries/documentation/drive/v3/csharp/latest/classGoogle_1_1Apis_1_1Drive_1_1v3_1_1FilesResource_1_1ListRequest.html)を参照。

- PageSize
1ページに返す最大ファイル数が指定できます。  

- Q
ファイルの検索結果をフィルタリングするためのクエリ構文を記載できます。
Google Drive APIでは、フォルダ含め全てのファイル再帰的に取ってきてしまうため、特定のファイルが欲しい場合はクエリ構文で指定する必要があります。
クエリ構文の記載は[Google Drive APIs Search for Files and Team Drives](https://developers.google.com/drive/v3/web/search-parameters)を参考にしました。
今回は、Google Slidesだけを取得したいので、クエリ構文でMINE Typeを指定しました。
Google Drive APIsで用意されているGoogle Drive固有のMINE Type一覧は[Google Drive APIs Supported MINE Types](https://developers.google.com/drive/v3/web/mime-types)を参照。         


- Fields
取得したいファイルのフィールド属性を指定します。
指定していないフィールドを取得しようとすると、C#ではnullが返ってきます。    


## Google Slidesをエクスポートする
今回はGoogle Slidesを取得するため、Exportメソッドを用います。
Exportメソッドでは、ダウンロードするファイルのIDとファイル形式をMINE Typeを引数で指定します。
Googleドキュメント形式と変換形式に対応するMINE Type一覧は[Google Drive APIs Download Files](https://developers.google.com/drive/v3/web/manage-downloads)を参照。

一般的な形式の場合はExportメソッドの代わりにGetメソッドを使ってファイルをダウンロードします。

```cs

            // リクエストパラメータの定義
            // service(DriveService)はユーザ認証部分なので割愛
            FilesResource.ListRequest listRequest = DriveService.service.Files.List();
            listRequest.PageSize = 1;

            // Google Slidesのみ取得する
            listRequest.Q = "mimeType = 'application/vnd.google-apps.presentation'";
            listRequest.Fields = "nextPageToken, files(id, name)";

            // ファイル一覧の取得
            IList<Google.Apis.Drive.v3.Data.File> files = listRequest.Execute().Files;

            // 例えば一番最初にとれたファイルをダウンロードする
            var id = files.First().Id;

            // 保存するファイル先を指定する
            string saveTo = /*ファイル先*/;

            // 例えばGoogle SlidesをPDF形式でダウンロードする
            var request = DriveService.service.Files.Export(id, "application/pdf");
            var filest = new System.IO.FileStream(Path.Combine(saveTo,files.First().Name + ".pdf"), System.IO.FileMode.Create, System.IO.FileAccess.Write);
            request.Download(filest);
         
```

# 参考
https://www.daimto.com/download-files-from-google-drive-with-c/
https://developers.google.com/drive/v3/web/manage-downloads
https://www.milk-island.net/translate/ggd/drive/v3/web/manage-downloads.html
初投稿！！ 地震波形データをAudioで聴くメモを、これから。

初投稿です。以前にC#フォームアプリとして作った、「地震波形サウンド再生機」を、HTMLのAudioやCanvasなどを利用し、DHTML/JavaScriptアプリとして作り直して公開・共有したいと思い、分かったこと解らないことなどここにメモとしておいて行こうと思います。


利用する地震波形データは「防災科学技術研究所」で公開している強震波形データです。
http://www.kyoshin.bosai.go.jp/kyoshin/quake/
[Notes] LSTM and Peephole ~2000~

Link: ftp://ftp.idsia.ch/pub/juergen/TimeCount-IJCNN2000.pdf
Title: Recurrent Nets that time and count
Authors: Felix A. Gers, Jurgen Schmidhuber
Previous versions of LSTM: 
CEC+forget gate: https://qiita.com/Rowing0914/items/cefa095c761e11dcc3ad
CEC: https://qiita.com/Rowing0914/items/1edf16ead2190308ce90
iTunes Connectのビルド処理中の完了を通知する

iTunes Connectにビルドをアップロードしてから、ビルドの処理中が完了するまでに30分以上かかることもありますよね。
待ち遠しくて、ついついブラウザをリロードしたくなりますが、確認するのは時間がもったいないです。

そこで、処理中が終わったことを通知してくれるようにして、無駄な時間を削減しましょう。

いくつかの方法を、紹介します。

# メールで確認する

一番シンプルな方法です。

ビルドのアップロード後やビルド処理の完了時などにメールが送られています。
メールクライアントの通知機能で通知してもらうだけで、簡単にチェックできますね。

# fastlane

[fastlane](https://github.com/fastlane/fastlane)というビルドやリリースなどの面倒な作業をコマンドで実行できるようにしてくれるツールがあります。

ローカルの端末でfastlaneのアクションの`upload_to_testflight`などを実行して、ipaをiTunes Connectにアップロードすると、コマンドが終了した時にはビルド処理中が終わっているので、そこで完了したかどうかを判断できます。
[terminal-notifier](https://github.com/julienXX/terminal-notifier)を使って、コマンドが終了した時にmacの通知でお知らせしてくれるようにするのも便利です。

また、fastlaneにはビルド処理中を待つツールが別途用意されています。
それが[watchbuild](https://github.com/fastlane/watchbuild)です。

下記のコマンドを動かしておくと、ビルド処理中が完了したタイミングでmacの通知で教えてくれます。

```bash
$ watchbuild
```

一定間隔で処理が完了したかどうかチェックする仕組みになっています。


fastlaneを使った方法はとても便利ですが、CIサービスやCIサーバでfastlaneを動かすようにしていると、ビルド処理の待機で専有してしまうため、`skip_submission`や`skip_waiting_for_build_processing`などのオプションを有効にして、待機させないようにすることが多いと思います...
その場合は次の方法がおすすめです。

# IFTTTやMicrosoft Flowで通知する

最初にメールが届くことを書きましたが、そのメールをトリガーに任意のアクションができるツールを使うと、通知や色々な自動化が捗ります。

例えば、Gmailを使っている場合は、[IFTTT](https://ifttt.com/)で簡単に設定できます。

## IFTTT

My Appletsのメニューから、「New Applet」を選択するとこのような作成画面が出てきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91631/75e72b87-eaa4-38aa-7556-f19a0ff198ce.png)

「+this」を選択、続いて、Gmailのトリガーを選択し、「New email in inbox from search」を選択します。
そして、Search forに「subject:"has completed processing" from:no_reply@email.apple.com」と入力します。

![スクリーンショット 2018-04-11 0.54.49.png](https://qiita-image-store.s3.amazonaws.com/0/91631/d2daeb3a-76a9-2a04-2711-dec6726e6fde.png)

これは、件名に「has completed processing」が含まれており、「no_reply@email.apple.com」から送られてきたメールをトリガーにするという意味です。
Search forには [Gmail で使用できる検索演算子](https://support.google.com/mail/answer/7190?hl=ja) が利用できます。
**今後、メールの内容が変わる可能性はありますので、こちらの設定はappleから送られてくるメールに合わせて適宜変更してください。**

トリガーはこれで完成なので、次は呼び出されるアクションを作ります。ここでは例としてSlackに通知するようにしてみます。
「+that」を選択して、slackを選びます。後は通知したいチャンネルやメッセージなどを自由に設定するだけです。

![スクリーンショット 2018-04-11 1.11.22.png](https://qiita-image-store.s3.amazonaws.com/0/91631/2504cb27-5ce4-3404-e82a-84f4fd979e3a.png)

これでビルド処理完了後にSlackにメッセージが来るようになり、とてもわかりやすくなりました。

## Microsoft Flow

あまり知られていませんが、[Microsoft Flow](https://flow.microsoft.com/ja-jp/)というツールも同じように簡単に設定できます。
もし、Office 365などを使っている場合はこちらのほうが簡単に設定できると思います。
例としてOutlookをトリガーにして、Slackに投稿するフローを作成してみます。

マイフローのメニューから「一から作成」を選択し、「新しいメールが届いた時」を選択します。
メールの自動振り分け機能などを利用している場合は、appleからのメールが届くフォルダーを選択します。
詳細オプションを表示し、件名フィルターに「has completed processing」と入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91631/bfcbf22d-078a-cfe2-be47-93101c353679.png)


続いて、新しいステップを選択し、アクションの追加を選びます。
出てきた検索フィールドにSlackと入力するとSlackが出てくるので選択し、投稿メッセージを選びます。

後は、IFTTTと同じようにチャネル名やメッセージを入力し、フローを保存すると完成です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91631/2fa01e69-aa18-8d51-d897-72df1f84a007.png)

# まとめ
ビルド処理中の完了を通知する方法を紹介しました。

Slackなどに投稿するようにすると、チームメンバー全員に知らせることができてとても良いですね。
IFTTTやMicrosoft Flowを使った方法はSlackへの投稿以外にも様々なことができるので、みんな大好きな楽しい自動化の助けになると思います。
学習記録(1) -Processing

1.使用言語
　　Processing3.3.5
2.製作時間
　　約40分
3.できたこと
　　キーボードからの入力を反映する　-keyPressed()
4.できなかったこと
　　連続で複数のブロックを動かす

![block_down.png](https://qiita-image-store.s3.amazonaws.com/0/249225/65683b81-4c87-bffd-f45d-a26dc5c31dbf.png)
日本のLoRaWAN商品のまとめ

LoRaWANのいいところは免許不要でゲートウエイを立てて
自分のLoRaWANネットワークを組めるところですが、
それが故に1社提供のSigfoxや、キャリア提供のCat.M1,NB-IoTの様に、
サポートエリアマップやサポートデバイスの「まとめ」がありません。

ないものは自分で作る。
というわけで、日本のLoRaWANを盛り上げたいという思いで作っています。

https://github.com/tanupoo/lorawan-japan

オープンで商用、基本的には誰もが買えるものを集めています。

私が所属している企業や団体とは関係ありません。
記載している情報の扱いは自己責任でお願いします。

プルリクは遠慮なく下さい。

- [デバイス](https://github.com/tanupoo/lorawan-japan/tree/master/device/)

- [ゲートウエイ](https://github.com/tanupoo/lorawan-japan/tree/master/gateway/)

- [ネットワークサーバ](https://github.com/tanupoo/lorawan-japan/tree/master/ns/)

- [アプリケーションサーバ](https://github.com/tanupoo/lorawan-japan/tree/master/as)

- [サービス](https://github.com/tanupoo/lorawan-japan/tree/master/service/)
XUbuntu: タイピング中、手がタッチパッドに触れてイライラする方へ



# 環境
* XUbuntu 16.04 LTS
* ThinkPad T460s

# 問題
XUbuntuのデフォルト設定では、タイピング中もタッチパッドが有効です。
そのため、タイピングの途中でフォーカスが外れたり、想定外のところで漢字変換されたりします。


# 解決方法
以下の設定で、解決できました。

設定→マウスとタッチパッド→「デバイス」タブ→「タッチパッド」タブ→「タイプ中はタッチパッドを無効にする」チェックボックスをON

![Inkedxubuntu_touchpad_setting_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/37903/f560fa45-90ab-f402-ef74-de7eaefc4965.jpeg)
Access Excel 緯度 経度 130度45分15.001秒 S20度22分30秒を130.000 -20.0000に変換する関数

#グローバル対応
正規表現を参照設定します。
各数字は正規表現で抜き出し、文字をカットする手法です。
また、西経、南緯はマイナス表記になります。
このため、文字列の最初か最後にW、Sが付けばマイナスにしています。
小数点以下が続くので倍精度Double形式です

```visualbasic
'https://oshiete.goo.ne.jp/qa/8901355.html
''正負、NESWがある場合。正規表現を使用するので参照設定
Public Function DMStoSignGbl(str) As Double
Dim DegreeLng As Long, MinDbl As Double, SecDbl As Double
Dim Reg As RegExp: Set Reg = New RegExp
Dim M As Match, MC As MatchCollection, iM As Long, lSgn As Long
Reg.Global = True: Reg.MultiLine = True: Reg.IgnoreCase = False
Reg.Pattern = "(\-[0-9]{1,3}度|[0-9]{1,3}度)" '正負を想定して
Set MC = Reg.Execute(str)
If MC.Count > 0 Then Set M = MC(0)
DegreeLng = Abs(Replace(M.Value, "度", "", 1, 1, vbTextCompare))
If DegreeLng <> Replace(M.Value, "度", "", 1, 1, vbTextCompare) Then lSgn = Sgn(Replace(M.Value, "度", "", 1, 1, vbTextCompare))
Reg.Pattern = "(^S|S$|^W|W$)" 'S,Wが最初か最後にあれば符号はマイナス
If Reg.Test(str) = True Then lSgn = Sgn(True)
Reg.Pattern = "(度[0-9]{1,2}分)"
Set MC = Reg.Execute(str)
If MC.Count > 0 Then Set M = MC(0)
MinDbl = (Replace(Replace(M.Value, "度", "", 1, 1, vbTextCompare), "分", "", 1, 1, vbTextCompare)) / 60
Reg.Pattern = "分[0-9]{0,}.[0-9]{0,}秒" 'この場合のピリオドは小数点ではなく任意の1文字
Set MC = Reg.Execute(str)
If MC.Count > 0 Then Set M = MC(0)
SecDbl = (Replace(Replace(M.Value, "分", "", 1, 1, vbTextCompare), "秒", "", 1, 1, vbTextCompare)) / 3600
If lSgn <> 0 Then DMStoSignGbl = (DegreeLng + MinDbl + SecDbl) * lSgn Else DMStoSignGbl = DegreeLng + MinDbl + SecDbl '符号に注意して返す
End Function
```
Djangoで、３テーブル間の参照をするには

プログラミング歴半年足らずの初心者です。

Python + Djangoで次のような設計で開発しています。

User -- Profile -- Company

UserとProfile は、OneToOneで対応しています。
ProfileとCompanyは、Profile:Company = N : 1　です。

この状況で、Userのマイページ内に、Userテーブルの情報、Profileテーブルの情報、Companyテーブルの情報を出力したいと思っています。

mypage.html内に、次のように記載したところ、

        ユーザー名 : {{ user.username }}
        所属 : {{ user.profile.company }}
        支払い : {{ user.profile.company.payment_choice }}

「ユーザ名」と「所属」はうまく出力できました。
しかし、「支払い」は、何も出力されませんでした。ここで本来は、Companyテーブルに持っている、payment_choiceの値を出力させたいのですが、どのようにすればよいでしょうか。

環境はこちらです。
Python 3.5.1 
Django 2.0.3

ご教授願えましたら幸いです。
物体検出で遊んでみた♬

ここまで画像やってきたので、いよいよ物体検知♬

有名どころのもので、遊んでみた
[SSD: Single Shot MultiBox Detector 高速リアルタイム物体検出デモをKerasで試す](https://qiita.com/PonDad/items/6f9e6d9397951cadc6be)

###Kerasバージョンを探せ
そして、オリジナルは以下のサイト
[weiliu89/caffe](https://github.com/weiliu89/caffe/tree/ssd)
でも、やはりKerasの方が見やすい
[rykov8/ssd_keras](https://github.com/rykov8/ssd_keras)
ところが、これKerasのバージョンが
This code was tested with Keras v1.2.2, Tensorflow v1.0.0, OpenCV v3.1.0-dev
ということで、バグを探っていくと、。。。
たどり着けました（笑）

以下が今回実行できたバージョンのサイト
[cory8249/ssd_keras](https://github.com/cory8249/ssd_keras)
This code was tested with Keras v1.2.2, Tensorflow v1.0.0, OpenCV v3.1.0-dev
 Also support newest Keras v2.0.1 (using ssd_v2.py)

###少しだけカスタマイズ
画像を少し追加して、物体検知後の画像を保存できるように改変して。。。
肝心な変更として、ACCがもとは0.6以上としてますが、案外低いのも当たっているので、0.3に変更しました。
これでめでたく、人間が識別したのと似たような結果画像が得れました。

それだけですが、以下のとおり物体検知できました‼

コードは以下に置きました。
[MuAuan/SSD](https://github.com/MuAuan/SSD)

なお、フィッティング済重みは以下からダウンロードできます。
Weights are ported from the original models and are available [here](https://mega.nz/#F!7RowVLCL!q3cEVRK9jyOSB9el3SssIA). You need weights_SSD300.hdf5, 

###結果
![recognized_picture001.png](https://qiita-image-store.s3.amazonaws.com/0/233744/e3567df4-332f-a38b-7ec2-61dfc717802a.png)
![recognized_picture002.png](https://qiita-image-store.s3.amazonaws.com/0/233744/a4a4c73e-6cb8-2bd6-f03c-7495aaddba6e.png)
![recognized_picture003.png](https://qiita-image-store.s3.amazonaws.com/0/233744/fc9ea44f-e91d-1c50-ebfe-9b34208f22fc.png)
![recognized_picture004.png](https://qiita-image-store.s3.amazonaws.com/0/233744/e6d00f81-2cd2-f0b8-a20c-99e42429a427.png)
![recognized_picture005.png](https://qiita-image-store.s3.amazonaws.com/0/233744/ec6f7361-f78d-5943-1cfa-baa569a3ed63.png)
![recognized_picture006.png](https://qiita-image-store.s3.amazonaws.com/0/233744/51d8b42f-484f-9ddf-eecd-a671c2c9067a.png)
![recognized_picture007.png](https://qiita-image-store.s3.amazonaws.com/0/233744/deffd81a-78b2-59a6-4330-c4123edf4850.png)
![recognized_picture009.png](https://qiita-image-store.s3.amazonaws.com/0/233744/1b1d0398-3a59-1ef9-dfef-844ff589e6f3.png)
FlaskとjQueryを使ったAjax通信で他のボタンと連動して有効無効を切り替える

結論からいうとタグを正確に指定して`$(#hoge).prop("disabled", false)`のようにajax通信後にすれば良いのだが、`$(this)`で指定していると`.done()`の所で上手くいかないので、何かしらの固有のidを付けるなりして指定しやすくしましょうということです。
今回はFlask-MongoEngineというライブラリを使ってページネーションを実装する際のサンプルコードを以下に示します。
> https://flask-mongoengine.readthedocs.io/en/latest/

###html抜粋
```html
<form method="post">
    <button class="btn btn-primary" name="like" id="like-{{data.key}}"  value='{{data.key}}'>Like</button>
    <button class="btn btn-danger" name="dislike" id="dislike-{{data.key}}" value='{{data.key}}'>Dislike</button>
</form>
```
`{{data.key}}`というところはFlask-MongoEngineで作られたオブジェクトで、単純になにかの文字列が入っています。

例えばデータベースに
1. key が hoge1
2. key が hoge2 
の2つのレコードがあるとすると、

```html
{% for data in data_page.items %}
<button class="btn btn-danger" name="dislike" id="dislike-{{data.key}}" value="{{data.key}}">Dislike</button>
{% endfor %}
```

というコードはレンダリングする際に

```html
<button class="btn btn-danger" name="dislike" id="dislike-hoge1" value="hoge1">Dislike</button>
<button class="btn btn-danger" name="dislike" id="dislike-hoge2" value="hoge2">Dislike</button>
```
というhtmlに書き換えられます。

###jQuery
```js
$("[ name = 'like' ]").on('click', function () {
        $(this).prop("disabled", true);
        $.ajax({
            url: "/rating_insert_like",
            type: 'POST',
            contentType:'application/json',
            data: JSON.stringify({"key":$(this).val()}) ,
        }).done(function(data){
            const dislike_id = "#dislike-"+ data;
           $(dislike_id).prop("disabled", false);
        });
    });

    $("[ name = 'dislike' ]").on('click', function () {
        event.preventDefault();
        $(this).prop("disabled", true);
        $.ajax({
            url: '/rating_insert_dislike',
            type: 'POST',
            contentType:'application/json',
            data: JSON.stringify({"key":$(this).val()})
        }).done(function(data){
           $("#like-"+ data).prop("disabled", false);
        });
    });
```

###flask側
```py
@app.route('/rating_insert_like', methods=["POST"])
def rating_insert_like():
    return request.json["key"]

@app.route('/rating_insert_dislike', methods=["POST"])
def rating_insert_dislike():
    return request.json["key"]


```
[Python] if __name__ == '__main__' について理解しよう

python を学び始めると、***`if __name__ == '__main__'`*** をおまじないのように書くことになるでしょう。
まるでC言語の`#include <stdio.h>`の如く。[^1]

そんなおまじないたちにもちゃんとした意味があるので、解説していきたいと思います。

# `__name__` (dunder name [^2]) とは?
モジュールの名前を格納して、インポートシステムの中からモジュールを一意に識別するための変数です。
`__name__`はスクリプトが読み込まれると、自動的に宣言されてモジュール名を格納します。

# `__main__` (dunder main) とは?
スクリプトとして直接実行されたのモジュール名を意味し、自動的に変数`__name__`に文字列`'__main__'`が格納されます。

# `if __name__ == '__main__'` とは?
これまで述べてきたことをまとまると、このif文は直接実行されたスクリプトか、それともインポートされたモジュールかを判定するための条件文です。
Trueなら直接実行されたもの、Falseならインポートされたモジュールということです。

最後にコードを実行して確認しておきましょう。[^3]

```python:test1.py
def hoge():
    # __name__に格納されている文字列を表示します
    print("\t : __name__ is \'{}\'".format(__name__))

if __name__ == '__main__':
    # 直接実行されたスクリプトであることを意味します
    print("test1.py : True")
    hoge()
else:
    # インポートされたモジュールであることを意味します
    print("test1.py : False")
    hoge()
```

```python:test2.py
# このケースではインポートされたとき、モジュールが実行されます
import test1

def foo():
    # __name__に格納されている文字列を表示します
    print("test2.py : __name__ is \'{}\'".format(__name__))

if __name__ == '__main__':
    foo()
```

```:execution
$ python test1.py
test1.py : True
         : __name__ is '__main__'

$ python test2.py
test1.py : False
         : __name__ is 'test1'
test2.py : __name__ is '__main__'
```

実行結果より示されたtest1.pyが直接実行されたときと、モジュールとしてインポートされたときとの振舞の違いから、先に述べたことの裏付けができたと思います。

## 参考
- [\_\_name\_\_ (Python 3.6.5 documentation)](https://docs.python.org/3/reference/import.html?highlight=__name__#__name__)
- [\_\_main\_\_ (Python 3.6.5 documentation)](https://docs.python.org/3/library/__main__.html#module-__main__)

[^1]: 簡単に説明すると、これはプログラムに必要な関数が定義されているヘッダーファイルを読み込むためのものです。
[^2]: dunder とは、double under(underscores)を意味します。
[^3]: コードの中で`if __name__ == '__main__': .... else: ...`というような表現がありますが、あくまで分かりやすく確認するためのものなので、日頃の開発の中で書くことは推奨しません。
yum が使えなくなったときの対処法

#エラーメッセージ
yum -y update
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.11 (default, Oct  2 2016, 08:04:49)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]

If you cannot solve this problem yourself, please go to
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

# 解決方法
yum で使用するpython のバージョンを指定する。

vi /usr/bin/yum
誤： #!/usr/bin/python
正： #!/usr/bin/python.26

#引用文献
[Pythonアップデート（2.6 -> 2.7）]("https://qiita.com/Hiroyama-Yutaka/items/8a52d54819a0923436a7")
ローカルで開発したプロジェクトをGitHubに連携したいとき

#概要
Git初心者の学生が、GitHub入門でいきなりコケて2,3時間悩んで解決した。:v:

すでにGitHub上にあるプロジェクトをフォーク＆クローンして、それを元にわちゃわちゃする例はよくあるが、**自分がローカルで元々作っていたものを、「さぁ、これをGitHubにあげよう」ってなった時どういう手順で行うのか、**という疑問にドンピシャで答える感じの情報がなかった。:baby:

環境は、SourceTree × GitHub
各々の基本的な操作は割愛。


#手順

##1. ローカルレポジトリの準備

まずGitしたいディレクトリに移動。

```bash
$ cd ~/target
```

git initで.gitを作る。

```bash
$ git init
```
>.gitignoreなどの設定はここのタイミングで行う。
自分の場合、node_modules/を外した。

そしてSourceTreeを開いてコミット
作業していた内容を全てコミットする。

##2. GitHubでリモートレポジトリを作る
![スクリーンショット 2018-04-11 1.55.06.png](https://qiita-image-store.s3.amazonaws.com/0/235781/25a65a37-6b5d-a361-52d6-52fcc7e0ecd0.png)

**※詰まりポイント**
readmeの自動生成や、add licenceなどでファイルを追加してしまうと、以降の手順でpushやpullができなくなってしまう。ここでかなり詰まった。
**何もファイルのない空のレポジトリを作るべし。**

##3. GitHubと接続
GitHubの、clone or downloadのボタンを押し、出てきたURLをコピー。
※「~.git」となっている。

これを使い、

```bash
$ git remote add origin [レポジトリのURL]
```

これでremoteとして登録された。

##push
```bash
$ git push -u origin master
```

これで成功。

![スクリーンショット 2018-04-11 2.20.07.png](https://qiita-image-store.s3.amazonaws.com/0/235781/0659f9a4-6dda-bcce-a70e-7a679ee4f564.png)

こんな風に、masterとorigin/master両方が表示されていれば、良し。


**※詰まりポイント**
このpushの際に普通にpushしようとすると

```bash
The current branch master has no upstream branch
```
と返ってきてエラーに。upstream、つまり上流ブランチがないとのこと。調べるとトラッキングブランチともある。よく分からないが、「-u」をつけると次回からのpushがトラッキング(?)されて、ただのpushでもremoteに反映されるようになるのだとか。ともかくここは「-u」をつけるものと覚えておく。


#まとめ
ローカルにレポジトリを用意！
GitHubに空のレポジトリを用意！
remote addからのpush -u！
:writing_hand_tone2: