OmniAICreator/Qiita-1.07M huggingface dataset:
ブラウザで(WebUSBもActiveXも使わずに)FeliCaリーダーを読み込む

他の投稿はこちら

- [Webアプリの限界を超える方法](https://qiita.com/tekka/items/1bf440ccd50bb4171886)
- [Webアプリの限界を超える方法(セキュリティ編)](https://qiita.com/tekka/items/d9f6fd2e30c1f778b5aa)
- [ブラウザでブラウザを操作してスクレイピングを行う](https://qiita.com/tekka/items/e6e1c51fd24fa3fd2c32)
- [Webブラウザでシリアル通信を行う](https://qiita.com/tekka/items/36edc0d6e918ac2b5ab9)

ブラウザでICカードを読み込む場合、IEでActiveXを使用し、FeliCaリーダーに接続する方法が一般的です。
また最近では、WebUSBでFeliCaリーダーに接続する方法も出てきました。

今回は、WebUSBもActiveXも使用せずに、ブラウザからFeliCaリーダーに接続する方法を紹介します。

# 概要

構成は以下の通りです。

![カード_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/bc94b0fd-baed-f7e5-5193-ae334abac426.png)

* FeliCaリーダーを読み込むネイティブアプリを作成する
* ネイティブアプリ上でWebSocketサーバーを立ち上げる
* ブラウザからネイティブアプリのWebSocketサーバーにローカルホスト接続する
* ネイティブアプリでFeliCaリーダーからICカードを読み込み、WebSocketサーバーを通して、情報をブラウザに送信する。

# デモ

![chrome.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/87f5ceac-8e91-a34c-6aec-4767838094d1.gif)

今回はネイティブアプリ部分をC#で作成しました。
Nfcの読み取り部分は[TomoSoft](https://tomosoft.jp/design/?p=5543)様のwinscard.dllラッパーを使用させて頂きました。

# メリット

カード読み取り機能がネイティブアプリとしてブラウザから独立しているため
WebSocket通信が可能なら、どんなブラウザでも動きます。

上記のデモはChromeで撮影していますが
Firefoxでも
![firefox.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/576460eb-2661-d04c-ebf0-848bdd1b6530.gif)
Edgeでも
![edge.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/3cedb2f7-a291-611a-7907-0bc0773c623a.gif)
IEでも
![ie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/4b16307e-de35-e497-c491-7218df00a7cc.gif)
動きます。

# まとめ

このように、ネイティブアプリ上に立ち上げたWebサーバーに、ブラウザからローカルホスト接続することで
Webアプリにネイティブアプリの機能を追加することが出来ます。

従来のハイブリッドアプリは、ネイティブアプリ内にWebViewを内包しますが
今回紹介した構成は、ネイティブアプリとブラウザが独立して並列に稼働します。
この構成を、従来のハイブリッドアプリに対して、「パラレルハイブリッドアプリ」と呼んでいます。

パラレルハイブリッドアプリは、ネイティブアプリとブラウザの接点がWebSocket通信部に限られるため
従来のWebView方式に比べて独立性が高く、セキュリティ面、設計面の問題が起きにくくなっています。

パラレルハイブリッドアプリの詳細な説明は[こちら](https://qiita.com/tekka/items/1bf440ccd50bb4171886)
Webアプリとの連携において、通信内容を暗号化したい場合は[こちら](https://qiita.com/tekka/items/d9f6fd2e30c1f778b5aa)

# サンプル＆ソース

サンプル＆ソースは[こちら。](https://github.com/tekka/ParallelHybridApp_card)
（動作確認にはFeliCaリーダーが必要です）
ABC - 115- A&B&C

#AtCoder ABC 115 A&B&C
[AtCoder - 115](https://atcoder.jp/contests/abc115)


#A問題

```java
	private static void ABC115_A() {
		Scanner scanner = null;
		int date = 0;

		try {
			scanner = new Scanner(System.in);
			date = scanner.nextInt();

			switch (date) {
			case 22:
				System.out.println("Christmas Eve Eve Eve");
				break;
			case 23:
				System.out.println("Christmas Eve Eve");
				break;
			case 24:
				System.out.println("Christmas Eve");
				break;
			case 25:
				System.out.println("Christmas");
				break;
			default:
				System.out.println("fail!");
				break;
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - ソートして、一番最後（一番高い）ものを$1/2$にする

```java
	private static void ABC115_B() {
		Scanner scanner = null;
		int numItem = 0;

		try {
			scanner = new Scanner(System.in);
			numItem = scanner.nextInt();
			int[] priceArray = new int[numItem];

			for (int i = 0; i < numItem; i++) {
				priceArray[i] = scanner.nextInt();
			}

			Arrays.sort(priceArray);

			int prices = 0;
			for (int i = 0; i < priceArray.length; i++) {
				if (i != numItem - 1) {
					prices += priceArray[i];
				} else {
					prices += priceArray[i] / 2;
				}

			}

			System.out.println(prices);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

```

#C問題

 - いくつか選択して飾り付けるので、選択する木は何でもよい
 - 木を高さでソートして、N本連続で選択し、最小と最大を比較する
 - N本連続するのを全てのパターン試せばよい

```java
	private static void ABC115_C() {
		Scanner scanner = null;
		int totalTreeNum = 0;
		int selectedTreeNum = 0;

		try {
			scanner = new Scanner(System.in);
			totalTreeNum = scanner.nextInt();
			selectedTreeNum = scanner.nextInt();

			int[] treeTehightList = new int[totalTreeNum];

			for (int i = 0; i < totalTreeNum; i++) {
				treeTehightList[i] = scanner.nextInt();
			}

			Arrays.sort(treeTehightList);

			//			int[] sabunList = new int[treeTehightList.length - 1];

			//			for (int i = 0; i < sabunList.length; i++) {
			//				sabunList[i] = treeTehightList[i + 1] - treeTehightList[i];
			//			}
			int minDiff = 0;
			for (int i = 0; i < treeTehightList.length - (selectedTreeNum - 1); i++) {
				if (i == 0) {
					minDiff = treeTehightList[i + selectedTreeNum - 1] - treeTehightList[i];
				}
				if (minDiff > treeTehightList[i + selectedTreeNum - 1] - treeTehightList[i]) {
					minDiff = treeTehightList[i + selectedTreeNum - 1] - treeTehightList[i];
				}

			}
			System.out.println(minDiff);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```
spring bootをマルチプロジェクトでgradleしてみたかった

# はじめに
eclipseでspring-bootでgradleでマルチなプロジェクトでプロジェクトフォルダを同階層に配置した構成でやってみようと思いました。なかなかうまくいかなかったのでメモ代わりに！

## 構成
fooをルートプロジェクトにしてbarを子プロジェクトとして↓のようにしてみました。

```
foo	← プロジェクトフォルダ
	build.gradle
	settings.gradle
bar	← プロジェクトフォルダ
	build.gradle
```
## 内容
### foo
fooフォルダのgradleはいつものようにgradleを作って、settings.gradleの1行目に`includeFlat 'bar'`を書き足しました。

```foo/build.gradle
plugins {
	id 'org.springframework.boot' version '2.1.4.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	compile project(':bar')
	compileOnly 'org.projectlombok:lombok'
}
```


```foo/settings.gradle
includeFlat 'bar'
/*
pluginManagement {
	repositories {
		gradlePluginPortal()
	}
}
*/
rootProject.name = 'foo'
```

### bar
こっちはいろいろ試して最後に以下のようになりました。
pluginsに`id 'org.springframework.boot' version '2.1.4.RELEASE'`があるとうまく認識してくれませんでした。
`apply plugin: 'io.spring.dependency-management'`や`apply plugin: 'org.springframework.boot'`はなくても動くかもしれません。（試してませんｗ）


```bar/build.gradle
plugins {
	id 'java'
}

apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.springframework.boot'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	compileOnly 'org.springframework.boot:spring-boot-starter-thymeleaf'
	compileOnly 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	compileOnly 'org.projectlombok:lombok'
}
```
## おわり
とにかくこんな構成で動くところまでは確認しました。
久しぶりにgradle触ったら記述方法が変わってて軽いギャップを感じてしまいました。
mac に root 権限で npm モジュールをグローバルインストールする

mac で TypeScript を使えるようにしようとして手間取った。

## Node.js をインストール

Node.js 本体を https://nodejs.org/ からダウンロードしてインストールする。
インストールには管理者権限が必要。

## npm のモジュールをグローバルインストール…失敗

ターミナルで `npm install -g typescript` を実行。
…インストール先ディレクトリーに権限がないということで失敗。

<details>
<summary>ターミナルでの入出力</summary>
```bash
$ npm install -g typescript
npm ERR! path ../lib/node_modules/typescript/bin/tsc
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall symlink
npm ERR! Error: EACCES: permission denied, symlink '../lib/node_modules/typescript/bin/tsc' -> '/usr/local/bin/tsc'
npm ERR!  { [Error: EACCES: permission denied, symlink '../lib/node_modules/typescript/bin/tsc' -> '/usr/local/bin/tsc']
npm ERR!   cause:
npm ERR!    { Error: EACCES: permission denied, symlink '../lib/node_modules/typescript/bin/tsc' -> '/usr/local/bin/tsc'
npm ERR!      errno: -13,
npm ERR!      code: 'EACCES',
npm ERR!      syscall: 'symlink',
npm ERR!      path: '../lib/node_modules/typescript/bin/tsc',
npm ERR!      dest: '/usr/local/bin/tsc' },
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, symlink \'../lib/node_modules/typescript/bin/tsc\' -> \'/usr/local/bin/tsc\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'symlink',
npm ERR!   path: '../lib/node_modules/typescript/bin/tsc',
npm ERR!   dest: '/usr/local/bin/tsc' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).
　
npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/sdkei/.npm/_logs/2019-04-13T01_16_55_245Z-debug.log
```
</details>

## root のパスワード？

Node.js が root 権限でインストールされていたので、`npm install -g typescript` も root ユーザーで実行する必要があった。
じゃあ `sudo` で…。
あれ、root ユーザーのパスワードとか知らんぞ？
管理者アカウントは root アカウントとは違うしな。

`mac root` でggる。
　↓
[Mac でルートユーザを有効にする方法やルートパスワードを変更する方法](https://support.apple.com/ja-jp/HT204012)

システム環境設定から root ユーザーを有効にして（そのときにパスワードも設定する）、
それから root ユーザーを使い、
作業が終わったらまた無効にするとのこと。

## やってみる

まずシステム環境設定から root ユーザーを有効化・パスワード設定して…。

`sudo` で `npm install` を実行する。

```bash
$ sudo npm install -g typescript
/usr/local/bin/tsserver -> /usr/local/lib/node_modules/typescript/bin/tsserver
/usr/local/bin/tsc -> /usr/local/lib/node_modules/typescript/bin/tsc
+ typescript@3.4.3
```

（実行した時点でパスワードを聞かれる。）

インストールできたようなので root ユーザーを無効に戻す。

typescript モジュールがインストールされたことを確認する。

```bash
$ tsc --version
Version 3.4.3
```

成功！
【STATA】outreg2を使って基本統計量を綺麗な表（word, excel）に出力する

## 目的
統計ソフトSTATAの[outreg2](http://repec.org/bocode/o/outreg2.html)を用いて、変数の基本統計量（データ数平均、標準偏差、最大値、最小値）を論文に載っているようなきれいな表に出力する。

## 環境
* STATA13.0

## サンプルコード
``outreg2``をインストール（すでにインストールされている場合はこの手順をスキップ）

```stata
ssc install outreg2
```
使うファイルを指定。（今回はサンプルデータを利用するため``sysuse...``としてある点に注意。）

```stata
sysuse auto, clear
```

``result.xls``ファイルに表を出力
※Wordファイルに出力したい場合は、拡張子を``.doc``に変更すれば可能。

```stata
outreg2 using result.xls, replace sum(log)
```

下記画像のような結果が得られたら、windowsユーザーの人は、画像下部の青い``result.xls``をクリック。
※macユーザーは``dir: seeout``をクリック（たぶん…）
![20190412b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/55914921-1208-0956-cd44-f73a42169e60.png)

## 結果
excelで見ると下記画像のような感じ。
![20190412b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/3f24208d-48c8-a3d1-2ef0-1fe2de915aa3.png)

パワポなどに張り付けると下記画像のような感じ。
![20190412b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/4e49b344-cd90-8d1d-3c8a-2243d4906324.png)

## 追記
以下のようにオプションに``keep(任意の変数名)``と付け加えることで、任意の変数のみで表を作成できる。

```stata
outreg2 using result2.xls, replace sum(log) keep(変数1 変数2 変数3)
```

## 参考文献
* https://dss.princeton.edu/training/Outreg2.pdf
* http://repec.org/bocode/o/outreg2.html
[wordpress]index.phpが改ざんされて無関係のページにリダイレクトされる

友人が運営するwordpressサイトがハッキングされていました。

ざっと調べたところよくある問題のようです。どのサイトでも発生する可能性があると思われるので、そのサイトの情報は伏せた上で、症状と対処を共有しておきます。

[security - My site is infected with obfuscated PHP malware - what is it doing + how do I get rid of it? - Stack Overflow](https://stackoverflow.com/questions/43211850/my-site-is-infected-with-obfuscated-php-malware-what-is-it-doing-how-do-i-ge)


どういう経路で改ざんされたか未特定なので対症療法的な対処です。（なんらかの脆弱性を突かれたとした場合、そこを塞ぐのが根本対応となります）

# 環境

- PHP 5.6.40
- WORDPRESS 4.9.10
- さくらレンタルサーバ

# 症状

そのサイトにアクセスすると「時々」、無関係なページ（多くはショッピングサイト）にリダイレクトされる。

# 原因

`index.php`と`wp-settings.php`が改ざんされて、不正なコードが実行されるようになっていました。(コメント欄で`wp-config.php`も改竄されたというご報告もいただきました)

具体的には、以下のようなコードがファイルの先頭(`<?php`の後)に挿入されています。（include命令のハイフンは実際には存在しません）

```php:index.php
/*5cadc*/

@i-nclude "\057ho\155e/\...中略.../.\0671b\143bc\1452.\151co";

/*5cadc*/
```

```php:wp-settings.php
@include "\057h\157m\145/\...中略...\157r\057.\0671\142c\142d\1453\056i\143o";

```


このコードをデコードすると、以下のようになります。

```php
@i-nclude /home/...中略.../.71bcbce2.ico
@i-nclude /home/...中略.../.45f02abd.ico
```

この `.71bcbce2.ico` ファイルは実際はPHPファイルで`eval`を含むコードが記載されていて、これによりリダイレクトしているようです。

```php
phpタグではじまる難読化されたコード 

e-val(rawurldecode($_b6zpgi5) ^ substr(str_repeat($_tzdfh, (strlen($_b6zpgi5)/strlen($_tzdfh)) + 1), 0, strlen($_b6zpgi5)));

続く

```

# 対処

index.phpに挿入されたコードを削除すればリダイレクトされてしまう問題は解消されます。

`ico`ファイルも削除します。

サイトの最上位ディレクトリで以下のコマンドを実行して、他にも同様の改ざんがないか確認します。

```bash
find . -name '*.php' | xargs grep 151co
find . -name '*.php' | xargs grep 143o
```

繰り返しになりますが、これは対症療法であり根本的には脆弱性をふさぐ必要があります。

# 追記

改ざん・生成されたファイルの多くはWordfenceプラグインのScanで検出されますが、`icoファイル`は検索対象外のようで検出されませんでした。
icoファイルを探して、一つづつ確認したほうがよさそうです。

```bash
find . -name '*.ico'
```
Oracle Bronze 12c SQL基礎 (SELECT, 引用符, NULL, 置換)

# RDBとSQL

### リレーショナルモデルの構成要素：
- SQL演算子
- データ整合性
- オブジェクト・リレーションの集合

※トランザクション管理はDBMS（データベース管理システム）の機能の一つ

### E-Rモデルの構成要素：
- エンティティ
- 属性
- リレーションシップ

# Select文

###主な機能
- 選択：特定の行の検索（where句）
- 射影：特定の列の指定（select句）
- 統合：表の結合


# 引用符（''と""）

一重引用符で囲むもの：文字リテラル、日付リテラル、日付書式、数値書式
二重引用符で囲むもの：ネーミング規則に沿わない名前（列別名、オブジェクト名など）、日付書式中の文字リテラル
※列見出しはデフォルト大文字なので「"」が必要

```
select ename "Emp_Name", deptid "DEPT ID" from emp;
select * from emp where ename='HOGE' and hdate>'00-01-01';
```

# NULLの扱い
- NULLを含む計算式の結果はNULL
- `where a <> 100`などの時はa=null値も検索対象外

# 列別名
- 使える：order句
- 使えない：select句(列別名を他の列で使う場合)、where句、group by句、having句

# 置換変数（&と&&）
- 大文字・小文字は区別されない
- ACCEPTコマンドで値を入力＆定義

```
ACCEPT emp_id char PROMPT '値を入力してください：'
値を入力してください：130  　※ここで値を入力
```

- DEFINEコマンドで事前定義　`define var_no=120`
- UNDEFINEコマンドで変数解除 `undefine var_no`
- &：実行時に値を入力　
- &&：値の入力と同時に事前定義（そのため、以降のSQL分に引き継がれる）
- `set verufy on`で置換後の値を表示されるよう設定（デフォルトでON）

初めの"&&EMP_NO"のみ入力を求められるスクリプト例

```
select * from emp where empno=&&EMP_NO;
update emp set=sal*1.2 where empno=&emp_no; 
```

# 行制限（OFFSET句, FETCH句）
- order by句の後に指定
- rowとrowsは同じ
- firstとnextは同じ
- WITH TIESはorder by句と一緒だと有効（一緒でないとONLYと同じ）

```
select * from emp order by hdate 
offset 10 rows fetch first 20 rows with ties
```

# 単一行関数
#### 文字関数
- LOWER: 文字列を小文字に変換
- UPPER: 文字列を大文字に変換
- INITCAP: 文字列の先頭を大文字に、移行を小文字に変換
- CONCAT: 文字列を連結
- SUBSTR：文字列の指定位置から指定文字数分を抽出(デフォルトは最後までの文字列を抽出)
- LENGTH：文字列の長さを表示
- INSTR：指定文字列の(先頭からの)数値位置を表示（デフォルトは先頭1文字目から検索して、1回目の出現位置を表示）（見つからない場合は0を返す）
- LPAD：文字列の左側に指定文字を埋め込む
- RPAD：文字列の右側に指定文字を埋め込む
- TRIM：先行、後続文字の切り捨て
- REPLACE：文字列を置換


|例 　　　 |結果 |
|---------|-----|
|LOWER('Hoge Fuga')        | hoge fuga  |
|UPPER('Hoge Fuga')        | HOGE FUGA  |
|INITCAP('Hoge Fuga')      | Hoge Fuga  |
|CONCAT('Hoge Fuga','Boo') | Hoge FugaBoo  |
|SUBSTR('Hoge Fuga',2,6)   | oge Fu  |
|SUBSTR('Hoge Fuga',-4)   | Fuga  |
|LENGTH('Hoge Fuga')       | 9  |
|INSTR('Hoge Fuga','g')       |3 |
|INSTR('Hoge Fuga','g',-1)    |8 |
|INSTR('Hoge Fuga','g',-1,2)  |3 |
|LPAD('Hoge Fuga',12,'*')     | ***Hoge Fuga  |
|RPAD('Hoge Fuga',12,'*')     | Hoge Fuga***  |
|TRIM('g', FROM 'Hoge Fugagg')  | Hoge Fuga  |
|TRIM(' &nbsp; Hoge Fuga &nbsp;')  | Hoge Fuga  |
|TRIM('g', FROM 'Hoge Fuga')  | Hoe Fua  |
|REPLACE('Hoge Fuga','g','m')  | Home Fuma  |

#### 数値関数
- ROUND：数値を丸める（四捨五入する）
- TRUNC：数値を切り捨てる

**※どちらも第二引数のデフォルトは0で整数を返す**
**※+1毎に右側（-1毎に左側）に丸める（切り捨てる）桁が移動する**

|例 　　　 |結果 |
|---------|-----|
|ROUND(123.567) | 124  |
|ROUND(123.567, 2) | 123.57  |
|TRUNC(123.567) | 123  |
|TRUNC(123.567, -2) | 100  |

#### 日付関数
- LAST_DAY：指定日付が含まれる月の最終日を表示
- NEXT_DAY：指定日付より後の最初の指定曜日の日付を表示
- CURRENT_DATE：セッションタイムゾーンの現在日付を表示（SYSDATEはDBが存在するOSの現在日時を表示）

|例 　　　 |結果 |
|---------|-----|
|LAST_DAY('01-FEB-14') | 28-FEB-14  |
|NEXT_DAY('02-APR-19','MONDAY') | 8-APR-19  |
|NEXT_DAY('02-APR-19','2') | 8-APR-19  |
ABC - 114- A&B&C

#AtCoder ABC 114 A&B&C
[AtCoder - 114](https://atcoder.jp/contests/abc114)

#A問題

 - 7,5,3だったらYES

```java
	private void solveA() {
		int numN = Integer.parseInt(next());

		switch (numN) {
		case 7:
		case 5:
		case 3:
			out.print("YES");
			break;
		default:
			out.print("NO");
			break;
		}

	}

```

#B問題

 - 文字列を前から3文字ずつ切りだして比較
 - 頭から全探索

```java
	private void solveB() {
		String strN = next();

		int res = 99999999;
		for (int i = 0; i < strN.length() - 2; i++) {
			String wk = strN.substring(i, i + 3);
			int wkNum = Integer.parseInt(wk);
			res = Math.min(res, Math.abs(wkNum - 753));
		}

		out.println(res);
	}

```
#C問題：幅優先探索

**ループだけでなくこういう解法もすぐ思いつくようになりたい**

 - 3,5,7を足していく
    - 現在の値を*10して3,5,7を足す

 1. $35 \; * \; 10 \; = \; 350 $
 2. $350 \; + \; 7 \; = \; 357 $

 - 生成する数値が753の制約を満たしているかをチェックして満たしていればカウントする


```java
	long resC2 = 0;

	private void solveC2() {
		long numN = Integer.parseInt(next());
		dfsSolveC2(numN, 0);

		out.println(resC2);
	}

	private void dfsSolveC2(long numN, long current) {
		if (current <= numN) {
			char[] wk = Long.toString(current).toCharArray();

			int num7 = 0;
			int num5 = 0;
			int num3 = 0;
			for (int i = 0; i < wk.length; i++) {
				if (wk[i] == '7') {
					num7++;
				} else if (wk[i] == '5') {
					num5++;
				} else if (wk[i] == '3') {
					num3++;
				}
			}
			if (num7 > 0 && num5 > 0 && num3 > 0) {
//				System.out.println(current);
				resC2++;
			}
			/**
			 * 所詮、配列の中に3種の文字が何回現れるのか？という話でしかない。
			 */
			dfsSolveC2(numN, 10 * current + 3);
			dfsSolveC2(numN, 10 * current + 5);
			dfsSolveC2(numN, 10 * current + 7);
		}
	}
```

#C問題：TLE-Version ループで実装したらTLE

 - 1以上N以下の数字を全部調べる
    - 1以上ではあるが、最低は357以上
        - 356以下は条件を満たさない
    - 偶数は対象外

```java
	private void solveC() {
		int numN = Integer.parseInt(next());

		int res = 0;
		for (int i = 357; i <= numN; i++) {
			if (i % 2 == 0) {
				continue;
			} else {
				String wk = Integer.toString(i);
				int num7 = 0;
				int num5 = 0;
				int num3 = 0;
				if (wk.contains("9") || wk.contains("8") || wk.contains("6") || wk.contains("4") || wk.contains("2")
						|| wk.contains("1")) {
					continue;
				} else {
					if (wk.contains("7")) {
						num7++;
					}
					if (wk.contains("5")) {
						num5++;
					}
					if (wk.contains("3")) {
						num3++;
					}
				}
				if (num3 > 0 && num5 > 0 && num7 > 0) {
					res++;
				}
			}
		}

		out.println(res);
	}

```
tcコマンドを使ったパケットロス設定

## 概要
データが欠損時の再送機能のテストのためにパケットロスを発生させる環境を作った時のお話

## 環境

|PC|IP|
|:--|:--|
|データ送信PC|192.168.1.100|
|Macbook Pro|192.168.1.110,192.168.2.100|
|テスト対象PC|192.168.2.110|

データ送信PC
　　｜
Macbook Pro <-ここでtcコマンドを実行
　　｜
テスト対象PC

## tcコマンドでパケットロスを発生させる
パケットロスを発生させるためtcコマンドを使用する。
[tc(8) man](http://man7.org/linux/man-pages/man8/tc.8.html)

しっかり設定しようとするとかなりややこしいコマンドなので、今回は簡単にパケットロスの設定と変更、削除のみ。

**設定**
`tc qdisc add dev eth0 root netem loss 2%`
設定値は少数も可能

**確認**
`tc qdisc show dev eth0`

**設定値の変更**
`tc qdisc change dev eth0 root netem loss 4%`

**削除**
`tc qdisc del dev eth0 root`

## まとめ
tcコマンドはSource/Dest IPごとに制御したり帯域制限（帯域保証まで！）の設定もできる面白いコマンドだと思います。
この後に物理NIC一本で同じ環境作れない？みたいな面倒な案件もありましたが、それはまた時間があれば...

## 参考情報
[tcを利用したトラフィックコントロール](https://alpha-netzilla.blogspot.com/2015/01/tc.html)
[よくわかるLinux帯域制限](http://labs.gree.jp/blog/2014/10/11266/)
[Linux TC (帯域制御、帯域保証) 設定ガイドライン](https://labs.gree.jp/blog/2014/10/11288/)
[tcコマンドの使い方](https://qiita.com/hana_shin/items/d9ba818b49aca87b2314)
#shell で複数の echo や cat の標準出力をまとめて一個のファイルに書き込む例

```
echo $(echo "abc" && echo "b" && cat tmp/in.txt && cat tmp/in.txt) > tmp/out.txt
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1230








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ABC - 113- A&B&C

#AtCoder ABC 113 A&B&C
[AtCoder - 113](https://atcoder.jp/contests/abc113)

#A問題

 - Yが偶数なので/2しても問題ない

```java
	private void solveA() {
		int numX = Integer.parseInt(next());
		int numY = Integer.parseInt(next());

		out.print(numX + numY / 2);

	}
```

#B問題

 - 最小値のindex

```java
	private void solveB() {
		int numN = Integer.parseInt(next());
		int numT = Integer.parseInt(next());
		int numA = Integer.parseInt(next());

		double[][] wk = new double[numN][2];

		int index = 0;
		double sabun = 999999999;
		for (int i = 0; i < wk.length; i++) {
			wk[i][0] = nextInt();
			wk[i][1] = numT - wk[i][0] * 0.006;
			if (Math.abs(numA - wk[i][1]) < sabun) {
				sabun = Math.abs(numA - wk[i][1]);
				index = i;
			}

		}

		out.println(index + 1);
	}
```

#C問題

 1. 入力を配列に格納するときに、取り込み時のindexを保持しておく（市の番号）
 2. 県/誕生年でソートする
 3. 都市の誕生番号を入れる
 4. 市の番号順でソート
 5. 出力

```java
	private void solveC() {
		int numN = Integer.parseInt(next());
		int numM = Integer.parseInt(next());

		long[][] wk = new long[numM][4];

		for (int i = 0; i < wk.length; i++) {
			wk[i][0] = i;
			wk[i][1] = nextLong();
			wk[i][2] = nextLong();
		}

		Arrays.sort(wk, new Longcompare());

		int cnt = 1;
		for (int i = 0; i < wk.length; i++) {
			wk[i][3] = cnt;
			cnt++;
			if (i < wk.length - 1 && wk[i][1] != wk[i + 1][1]) {
				cnt = 1;
			}
		}

		Arrays.sort(wk, (x, y) -> Long.compare(x[0], y[0]));

		for (int i = 0; i < wk.length; i++) {
			String res1 = String.format("%06d", wk[i][1]) + String.format("%06d", wk[i][3]);
			out.println(res1);
		}

	}

	private class Longcompare implements Comparator<long[]> {

		@Override
		public int compare(long[] o1, long[] o2) {
			if (o1[1] < o2[1]) {
				return -1;
			} else if (o1[1] > o2[1]) {
				return 1;
			} else if (o1[1] == o2[1]) {
				if (o1[2] < o2[2]) {
					return -1;
				} else if (o1[2] > o2[2]) {
					return 1;
				} else if (o1[2] == o2[2]) {
					return 0;
				}
			}
			return 0;
		}

	}
```
Springer に svjour3.cls 使った LaTeX 英文論文を投稿するtips

[Springer社](https://www.springer.com/jp/authors-editors/journal-author)が出版している雑誌に [svjour3.cls](https://www.springer.com/gp/livingreviews/latex-templates) を使ったLaTeX英文論文を論文投稿システムの[Editorial Manager](https://www.editorialmanager.jp/)から投稿すると、

- 紙の余白が多くて文字が小さく詰まっていて大変読みにくい
- [svjour3.cls](https://www.springer.com/gp/livingreviews/latex-templates) はベクトル表記をボールド体にするなど様式の変更を行うが、[stix.sty](https://ja.wikipedia.org/wiki/STIX%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E4%BA%8B%E6%A5%AD) など一部のフォント変更スタイルファイルを読み込むと [svjour3.cls](https://www.springer.com/gp/livingreviews/latex-templates) の様式変更が無効化されてしまう
- svjour3.cls はA4 の用紙しか選べないのにEditorial Managerが添付表紙はUSレターサイズになり1ページ目とそれ以降でPDFのページサイズが異なる

などの問題があるので、それらへの対応法をまとめておく。

```latex:paper.tex
\pdfoutput=1
% pdflatex を使わせたい場合

\RequirePackage[T1]{fontenc}
\RequirePackage{fix-cm}
\RequirePackage{stix} % または \RequirePackage{stix2}
% documentclass の前にfontencとフォント関係のスタイルファイルを読ませてしまう

\documentclass[a4paper,smallcondensed,envcountsame,draft,pdftex]{svjour3}
\smartqed  % flush right qed marks, e.g. at end of proof
\journalname{Inventiones mathematicae}
% 投稿する雑誌の名前を書く

\usepackage[unicode,final]{hyperref}
\usepackage[letterpaper,mag=1400,includehead,margin=10truemm,tmargin=20truemm,lmargin=15truemm,rmargin=15truemm,twoside=false,truedimen]{geometry}
% geometryパッケージを上記のオプションを付けて読み込むと紙いっぱいに大きい文字で組版される
% USレターサイズの表紙を添付されるから本文もUSレターサイズにする

\providecommand{\doi}[1]{DOI~\href{http://dx.doi.org/#1}{\path|#1|}}
% 参考文献リストをSpringer提供のbibtexスタイルファイルを用いて作るとDOIが
% \doiコマンドで囲まれるがそれをハイパーリンクにする
ABC - 042- A&B&C

#AtCoder ABC 042 A&B&C
[AtCoder - 042](https://atcoder.jp/contests/abc042)

#A問題

 - 5が2個
 - 7が1個

```java
	private void solveA() {
		int n5 = 0;
		int n7 = 0;
		for (int i = 0; i < 3; i++) {
			if (nextInt() == 5) {
				n5++;
			} else {
				n7++;
			}
		}

		out.println(n5 == 2 && n7 == 1 ? "YES" : "NO");
	}
```

#B問題

 - 文字列ソートして結合

```java
	private void solveB() {
		int numN = nextInt();
		int numL = nextInt();
		String[] wk = IntStream.range(0, numN).collect(() -> new String[numN],
				(t, i) -> {
					t[i] = next();
				},
				(t, u) -> {
					Stream.concat(Arrays.stream(t), Arrays.stream(u));
				});

		Arrays.sort(wk);

		String builder = Arrays.stream(wk).reduce("",
				(sum, i) -> {
					sum += i;
					return sum;
				});

		out.println(builder);
	}

```

#C問題

 - N以上の数値を条件に合致するかを判定し、条件に合致したら出力して終了
    - setを使っているのは条件判定をcontainsで行いたかったから

```java
	private void solveC() {
		int numN = nextInt();
		int numK = nextInt();

		Set<String> notUseSet = IntStream.range(0, numK).mapToObj(i -> next()).collect(
				() -> new HashSet<String>(),
				(t, i) -> {
					t.add(i);
				},
				(t, u) -> {
					t.addAll(u);
				});

		int j = numN;

		while (true) {
			String[] wk = Integer.toString(j).split("");
			boolean isRes = true;

			for (String c : wk) {
				if (notUseSet.contains(c)) {
					isRes = false;
					break;
				}
			}
			if (isRes) {
				out.println(j);
				break;
			}
			j++;
		}

	}
```
ROS2インストール・初期設定 for Crystal_Clemmys

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)
Crystal Clemmys用
Dashing Diademata用は[こちら](https://qiita.com/NeK/items/d2bdd8798de7cdea1932)

# Ubuntu 18.04
[install]:https://index.ros.org/doc/ros2/Installation/
[公式インストールガイド][install]のDebian Packagesに従ってインストール．

## 特記
### localeについて
説明ではen_US.UTF-8だが，ja_JP.UTF-8に置き換えてインストール．

### Install ROS2 packages
[公式インストールガイド][install]のDebian packagesにて[Install ROS2 packages](https://index.ros.org/doc/ros2/Installation/Linux-Install-Debians/#install-ros-2-packages)でインストールするものを選択しないといけないが，以下のように選ぶ．

- Ubuntu Desktop 18.04
    - Desktop Install(Recommended)
- Ubuntu Server 18.04
    - ROS-Base Install(Bare Bones)

Ubuntu Server 18.04は，例えば[Raspberry Pi 3B+](https://qiita.com/NeK/items/849c6d1e05fb05314fc6)でロボットを制御する場合(GUIが不必要な場合)での使用が考えられる．

### 上記ガイド以外でインストールしたもの

```Bash:terminal
$ export ROS_DISTRO=crystal
$ sudo apt install ros-$ROS_DISTRO-rqt*
$ sudo apt install python3-colcon-common-extensions
$ sudo apt install python-catkin-pkg python-bloom
$ sudo apt install python-pip python3-pip
$ sudo pip install -U catkin_pkg
$ sudo pip install empy
```
pip install -U catkin_pkgやempyをしていないと，ROS2のビルド(colcon build)でImportErrorが出る場合がある．というか出た．

sudo pip install ...はsudo -H pip installの方がよい
リモートリポジトリのブランチをローカルに反映する方法

リモートリポジトリからプロジェクトをgit cloneした時に、ローカルリポジトリには、masterブランチしか反映されておらず、リモートの他のブランチをローカルに反映するにはどうしたら良いのか？少し戸惑ったため、記録しておきます。

#方法
結論：git checkout -b （ローカルで付けたいブランチ名）（リモートのブランチ名） を使います。

####手順1
git branch -a を実行することで、リモートとローカルに存在するすべてのブランチを確認できる。
下記の通り、*がついているブランチは今作業中のブランチを表しています。※<font color="lightgreen">緑色</font>で表示されているはず。
また、リモートのブランチは<font color="red">赤文字</font>で表示されているはずです。

```
$ git branch -a 

⇒　
   * master
   remotes/origin/hoge
   remotes/origin/hogehoge
```

####手順2
手順1で確認したように、ローカルでdevelopブランチを作成し、リモートのhogeブランチを反映します。

```
$ git checkout -b develop remotes/origin/hoge
```

再度git branch -aを実行し確認すると、ローカルにdevelopブランチが作成されており、
作業ブランチがdevelopに切り替わって、リモートのhogeブランチの内容が反映されています。

```
$ git branch -a 

⇒
     master
   * develop
   remotes/origin/hoge
   remotes/origin/hogehoge
```

#終わりに
この記事を見てくださった方、ご指摘の点など、ございましたらコメントを
くださいm(_ _)m
KotlinでUTC標準記述の文字列を、日本時刻に変換して文字列出力

KotlinでAndroidアプリを作っていて、WebのAPIで返ってきたUTC標準時刻で記載された文字列の日時を、日本時刻に変換して表示する方法。
文字列をDateに、Dateを文字列に、というあたりの情報は結構見つかったのですが、TimeZoneを変更して出力するというやり方は「これ」というのが見当たらず、いくつかのページを参考に試行錯誤したらできたんですが自分で忘れそうなので備忘録です。

# やったこと

以下の手順で処理したらできました。

1. UTCで書かれた文字列（私が扱っていた元データはISO8601形式だったので `"yyyy-MM-dd'T'HH:mm\:ssZ"` でした）を、Dateに変換
2. DateをCalendarに変換
3. CalendarにTimezoneをセット
4. DateFormatを指定して、文字列を出力

実際のソースコードはこちら

```kotlin
import android.text.format.DateFormat
import android.icu.text.SimpleDateFormat
import java.util.*

            val df = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            val jpCal:Calendar = Calendar.getInstance()
            jpCal.time = df.parse(item.updateDateTime)
            jpCal.timeZone = TimeZone.getTimeZone("Asia/Tokyo")
            holder.mUpdateDTView.text = DateFormat.format("MM-dd HH:mm",jpCal)
```
item.updateDateTime内に、例えば `2019-04-12T01:00:00Z` という文字列が設定されているとして、これでmUpdateDTView.textの中には `04-12 09:00` という文字列が出力されるようになりました。

多分ですが、`"Asia/Tokyo"` のところを、端末の標準設定とか持ってこれれば、APIから返ってきた時刻を、その端末の現地時間に合わせて表示できるんじゃないのかなと思います。（未検証ですが…）

若干冗長な気はしているので、もっと簡単にできるよ～という方法があったら是非教えて頂きたいです。m(__)m


## 参考にさせていただいたサイト
https://developer.android.com/reference/android/text/format/DateFormat.html
https://qiita.com/emboss369/items/5a3ddea301cbf79d971a
https://stackoverflow.com/questions/48838992/how-to-convert-date-string-to-timestamp-in-kotlin
キカガク流ＡＩ入門セミナーに参加してみた

####【イベント概要】
[【キカガク流ＡＩ入門セミナー】Kaggleではじめるデータサイエンス体験セミナーでプルス・ウルトラ！](https://kikagaku.connpass.com/event/126525/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link)

####【参加目的】
「kaggle」を通して機械学習やデータサイエンスの実務を疑似体験を通して勉強方法や手法などを勉強したかった。
**→自分の中に落とし込むのには時間はかかるが切っ掛けに良かった**

####【内容】
Pythonを扱う場合、jupyter notebook を利用していますが、今回はgoogle colab、google ドライブを利用し環境構築をせず体験できました。
[・参考google colab](https://colab.research.google.com/notebooks/welcome.ipynb)

続いて、kaggleコンペサイトより今回の題材である「titanic」で、どんな特徴を持った人達が生き残ったのかを乗客の名前、年齢、性別、乗船クラスなどの情報から推定し分析しました。
[・参考kaggleコンペサイト](https://www.kaggle.com/)

####【実際の手作業】
kaggleから「titanic」の分析に必要なテストデータを取得し、データ数と特徴量を確認、欠損値の補完、モデルの構築を順を追って行っていきます。データを整形するという過程の重要性が分かりました。

「titanic」では歴史的背景で名前によって階級差があり、その差が生存率に大きな影響を示していました。講師の方が「ドメイン知識」とおっしゃっており、AIエンジニアだけでなく、そのデータを扱っている業務の人と相互にやり取りしないと良い結果が出ないといわれており、現在、発注側として関わっていますがその通りだと感じます。

圧倒的にAIへの知識は足りないので相互に補完しながらさらに勉強したいところです。講義資料にも消化しきれないほどコードがあったので、特徴量を変えながらモデル構築をしていきたいと思います。

####【まとめ】
キカガクさん主催のセミナーは物凄くいいと思います。（個人的主観(笑)）
Rails5でBootstrap4を使おうとしたらassets precompileで未定義エラー

## はじめに

[bootstrap-sassでエラーメモ](https://qiita.com/shizuma/items/8329be107510631495d7)
こちらの方とエラー内容、解決方法としては同じだが、以下のbootstrap-rubygemでも発生したので、書き留めておく。
[bootstrap-rubygem](https://github.com/twbs/bootstrap-rubygem)

### エラー内容

先述のgemのREADME->Installation->a.Ruby on Railsに従って、bootstrapを使う設定を行い、アプリを起動したところ以下のエラーが発生した。

```bash
Undefined variable: "$alert-padding". while precompile assets
```

### 解決方法

以下のようにワイルドカードでコンパイル後のcssを取り込もうとしていた。

```ruby:assets.rb
Rails.application.config.assets.precompile += %w( *.js *.css)
```

これがまずいらしく、以下のように取り込むcssを指定して設定する必要がある

```ruby:assets.rb
Rails.application.config.assets.precompile += %w( *.js *application.css)
```
vim-rspec で Vim 上で RSpec を楽に実行する

## はじめに

Vim で Rails でのアプリ開発をしているときに、RSpec でモデルのテストを回す、というようなケースがあると思います。

今までは tmux で別ペインにターミナルを立てて、該当の spec を直接コマンド実行していたのですが、なかなか面倒でした。

そんな中、[vim-rspec](https://github.com/thoughtbot/vim-rspec) という Vim プラグインが非常に便利だったので、紹介します。

## vim-rspec とは

[vim-rspec](https://github.com/thoughtbot/vim-rspec) とは、Vim 上で動作する軽量の RSpec ランナーです。

よく使うキーマップを設定しておくことで、Vim 上で Rspec を実行することが出来ます。

## 使い方

### インストール

まず、vim-rspec をインストールします。（以下は dein.vim でのインストール例です）

```vim:.vimrc
call dein#add('thoughtbot/vim-rspec')
```

### キーマップ設定

次に、それぞれの関数を実行するキーマップを設定します。

```vim:.vimrc
" RSpec.vim mappings
map <Leader>t :call RunCurrentSpecFile()<CR>
map <Leader>s :call RunNearestSpec()<CR>
map <Leader>l :call RunLastSpec()<CR>
map <Leader>a :call RunAllSpecs()<CR>
```

それぞれの関数の概要は以下の通りです。

関数|概要
:--|:--
RunCurrentSpecFile()|現在開いている spec ファイル全体を実行
RunNearestSpec()|現在開いている spec ファイルのカーソルに一番近いブロックの spec を実行
RunLastSpec()|前回実行した spec を実行
RunAllSpecs()|プロジェクトのすべての spec を実行

### 実行コマンド設定

次に、実際に実行するコマンドを設定します。

```vim:.vimrc
let g:rspec_command = "!bin/rspec {spec}"
```

`{spec}` 内に実際に実行する spec ファイル名が入ります。外部コマンドを実行するので、最初に`!`をつけます。

僕の場合は、[spring-commands-rspec](https://github.com/jonleighton/spring-commands-rspec)を使っていたので、`bin/rspec`としています。


## 実行

上記設定後、編集中の spec ファイル上で例えば `<Leader>t`実行すると、その RSpec ファイルを実行し、Quickfix ウインドウ上で結果を表示してくれます。

## vim-dispatch で更に便利に

tmux などの仮想ターミナルを使っている方は、[vim-dispatch](https://github.com/tpope/vim-dispatch) と組み合わせると更に便利かもしれません。

vim-dispatch は tmux、screen、iTerm、Windows などの仮想ターミナル上で、非同期にテストやコンパイルを実行できるプラグインです。

利用イメージは[作者の動画](https://vimeo.com/63116209)を見るのがわかりやすいです。

使い方としては、まずvim-dispatch をインストールし、

```vim:.vimrc
call dein#add('tpope/vim-dispatch')
```
rspec を以下のように修正するだけで OK です。

```vim:.vimrc
let g:rspec_command = "Dispatch bin/rspec {spec}"
```

この設定で RSpec を実行すると、tmux であれば別ペインを開き、非同期で spec を実行してくれます。実行中も Vim 上で操作ができるので便利です。

## おわりに

こちらで 開発中何度も RSpec を実行するのが非常に楽になりました。よかったら試してみてください。
他の使い方は [vim-rspec の README](https://github.com/thoughtbot/vim-rspec)を読むと良いと思います。

## 参考

* [vim-rspec](https://github.com/thoughtbot/vim-rspec)
* [tmuxとvim-rspecとvim-dispatchで快適なRSpec生活](https://qiita.com/take/items/7bb67276c785e223069a)
Edge TPU Accelarator＋カスタムモデルMobileNetv2-SSDLiteの.tflite生成 【やっと成功したよ】_Docker編_その４

**Tensorflow-bin**　[![GitHub stars](https://img.shields.io/github/stars/PINTO0309/Tensorflow-bin.svg?style=social&label=Stars)](https://github.com/PINTO0309/Tensorflow-bin)
<a href="https://github.com/PINTO0309/Tensorflow-bin"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/PINTO0309/Tensorflow-bin.png" width="460px"></a>
**TPU-MobilenetSSD**　[![GitHub stars](https://img.shields.io/github/stars/PINTO0309/TPU-MobilenetSSD.svg?style=social&label=Stars)](https://github.com/PINTO0309/TPU-MobilenetSSD)
<a href="https://github.com/PINTO0309/TPU-MobilenetSSD"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/PINTO0309/TPU-MobilenetSSD.png" width="460px"></a>

# １．Introduction
TPUモデルコンパイラがカスタムモデルの変換に対応したそうですので早速試してみました。
この記事の手順では最終的に生成されたモデルの精度が極悪ですが、転移学習ではなくフル学習にしたり、パラメータを調整することで精度は改善可能です。
この記事で語るのは、あくまで **`独自DockerイメージによるカスタムTPUモデルの学習と生成手順`** のみです。
モデル性能のチューニングは実施しません。

# ２．Procedure
学習手順は、前回記事 **[Edge TPU Accelaratorの動作を少しでも高速化したかったのでMobileNetv2-SSD/MobileNetv1-SSD+MS-COCOをPascal VOCで転移学習して.tfliteを生成した\_Docker編_その２](https://qiita.com/PINTO/items/8a91d79abe6e939ef01c)** あるいは **[Edge TPU Accelaratorの動作を少しでも高速化したかったのでMS-COCOをPascal VOCで転移学習して.tfliteを生成した\_GoogleColaboratory[GPU]編_その３](https://qiita.com/PINTO/items/6eb6de95e3cda0e09c84)** をそのまま使用します。 前回記事はもともと、 TPUコンパイラ がカスタムモデルに対応することを事前に知っていたため、機能がリリースされたときに最速で検証できるよう事前準備をしていたのです。
私独自のDockerは公式のDockerイメージとは異なり、NVIDIA Docker を使用します。
公式のDockerがGPUトレーニングに対応していないため、自力でシーケンスを大幅に組み直しています。

なお、対応可能なレイヤと変換アルゴリズムは、 公式の **[TensorFlow models on the Edge TPU](https://coral.withgoogle.com/docs/edgetpu/models-intro/)** に記載されていますので参考にしてください。

# ３．Results
**[前回記事](https://qiita.com/PINTO/items/8a91d79abe6e939ef01c)** の手順により生成した MobileNetv2-SSDLite の .tflite ファイルをコンパイラに投入してみます。

**https://coral.withgoogle.com/web-compiler/**
![FireShot Capture 008 - Edge TPU Model Compiler - Coral - coral.withgoogle.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/43b0b47c-3384-76b5-6975-5afb3d18d5e4.png)


ドラッグ＆ドロップで、 せーの、ホイッ！
![FireShot Capture 006 - Edge TPU Model Compiler - Coral - coral.withgoogle.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/030fbace-9c87-ad8e-8455-062098baaf93.png)

あっさり成功しました。 しかも、アップデートが入る前までは一切表示されなかった変換ログが表示されるようになっています。 さらに、TPU側で非対応のレイヤーは自動的にCPUへオフロードされる仕様に改善されています。
最高です。 OpenVINOに欲しい機能です。
ある程度自由にレイヤを組み合わせて推論させることができるため、対応モデルの幅が大幅に広がりましたね。

今回は、各種公式ドキュメントを一切見ずに独自の軽量トレーニングとコンバートを実施しました。

# ４．Finally
おいおいフルトレーニングをし直して推論精度を向上した .tflite モデルを生成して遊びたいと思います。
【Blender】スザンヌをゴールドにする

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Blender v2.79.6
⭐️Mac Book

完成図↓↓↓↓
<img width="380" alt="スクリーンショット 2019-04-13 7.08.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/933bf20e-622d-b569-1caf-36b962b85034.png">



作り方は、「はてなブログ」に記載してます↓↓↓↓　
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/04/13/073611)
ツイッターで本人のツイートのみをJavaScriptで見る方法

# きっかけ

ツイッターで本人のツイートのみを見たいと思ったことはないだろうか？

多くがリツイートで占められるツイーターアカウントに遭遇することがある。熱心に全部のツイートを読むのではなく、軽く本人のツイートのみを読みたいという需要だ。

JavaScriptでリツイートを非表示にすることを思いついた。

> ツイッターで本人のツイートのみを見る方法が分かりません。
> 例えば、「堀江貴文(Takafumi Horie) @takapon_jp」は見たい。
> しかし、「堀江貴文(Takafumi Horie)さんがリツイート」は見たくないという場合です。
>
> 出典: [Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11161714971)

とあるように、ニッチな需要があるようだ。


# JavaScriptで非表示に

ChromeではデベロッパーツールのConsole(Firefoxではウェブコンソール)を開いて次のJavaScriptを実行する。

```javascript
target_name=document.querySelector("b.u-linkComplex-target").textContent
document.querySelectorAll("#stream-items-id>li").forEach(l=>{if(l.getElementsByClassName("tweet")[0].getAttribute("data-screen-name")!==target_name){l.style.display="none"}})
```

元に戻すには

```javascript
document.querySelectorAll("#stream-items-id>li").forEach(l=>{if(l.getElementsByClassName("tweet")[0].getAttribute("data-screen-name")!==target_name){l.style.display=""}})
```

# console.logがundefinedになる不具合

ツイッターにはconsole.logの出力がundefinedになる不具合があるようだ。ツイッターを閲覧中にデベロッパーツールかウェブコンソールを開いてconsole.logを実行するとundefinedのみが表示された。ツイッター以外の場所では正常にconsole.logの出力が表示された。この不具合のおかげでツイッターでJavaScriptを書くのが大変だった。

console.logのように使用頻度の高い関数を悪意のある関数と置き換えて、任意のスクリプトを実行させる攻撃があるらしいが、まさかツイッターのような大企業が姑息な技を使うとは思わなかった。console.logの出力がツイッター社に送信されていないことを祈るばかりだ。
メールフォーム周りについて(2)-項目の絞り込み

#ラジオボタンの選択をセレクトボックスに反映
ラジオボタンとセレクトボックスに共通のクラス名をつけて、表示・非表示を連動しました。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="kazu-1" data-slug-hash="NmxjjW" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="NmxjjW">
  <span>See the Pen <a href="https://codepen.io/kazu-1/pen/NmxjjW/">
  NmxjjW</a> by kazu-1 (<a href="https://codepen.io/kazu-1">@kazu-1</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
ラジオボタンでなくても、セレクトボックス同士、チェックボックスなど一対多の絞り込みに対応する筈です。

```html:html
<dl>
  <dt>希望参加形態</dt>
  <dd>
      <label><input type="radio" name="keitai" class="sanka" value="参加者">参加者</label>
      <label><input type="radio" name="keitai" class="toudan" value="登壇者">登壇者</label>
      <label><input type="radio" name="keitai" class="borantia" value="ボランティア">ボランティア</label>
  </dd>
</dl>
<dl>
  <dt>希望地</dt>
  <dd>
    <select class="kibouchi" name="希望地">
      <option class="sanka borantia" value="北海道">北海道（参加者・ボランティア）</option>
      <option class="sanka" value="青森県">青森県（参加者）</option>
      <option class="sanka toudan" value="岩手県">岩手県（参加者・登壇者）</option>
      <option class="sanka" value="宮城県">宮城県（参加者）</option>
      <option class="sanka" value="秋田県">秋田県（参加者）</option>
      <option class="sanka" value="山形県">山形県（参加者）</option>
<!--  省略-->
      <option class="sanka" value="長崎県">長崎県（参加者）</option>
      <option class="sanka borantia" value="札幌支店">熊本県（参加者・ボランティア）</option>
      <option class="sanka borantia" value="熊本県">大分県（参加者・ボランティア）</option>
      <option class="sanka toudan" value="宮崎県">宮崎県（参加者・登壇者）</option>
      <option class="sanka toudan borantia" value="鹿児島県">鹿児島県（参加者・ボランティア・登壇者）</option>
      <option class="sanka borantia" value="沖縄県">沖縄県（参加者・ボランティア）</option>
    </select>
  </dd>
</dl>
```
###html
1.選択側と選択される側に共通のクラス名を入れます。
今回の場合は、sanka、toudan、borantiaの３つです。
2.選択側を特定するセレクタと選択される側にも範囲を絞り込めるセレクタを入れます。
今回の場合は、inputとkibouchiです。
###jquery
```js:jquery
$(function() {
  $('input').change(function() {          //inputの値が変わったとき発火
    let keitai = $(this).attr("class");   //1.inputのクラス名を取得
    let kibouchi = ".kibouchi ." + keitai;//2.1を利用して表示するクラスを作成。
    $(".kibouchi option").hide();         //3.いったんセレクトボックスの値を非表示にする。
    $(".kibouchi").val("");               //4.セレクトボックスの値を削除
    $(kibouchi).show();                   //5.2で作成したクラスを表示する。
  });
})
```
ソフトウェアはレストランである。

最近大学の授業の内容で大衆に向けてのプレゼンをする機会があったので、そのときに使った比喩をメモして行こうと思ったので書いていきます。

まずは、レストランでの一連の流れをおさらいしましょう。
###レストランでの一連の流れ。
1. 客が入店、客にメニューを渡す。
2. フロアの人が客からオーダーを取る。
3. フロアの人が厨房までそのオーダーを持っていく。
4. 厨房で、オーダーに対応する材料を集めて、調理をする。
5. 料理が完成したら、フロアの人に皿を渡す。
6. フロアの人が客のところまで皿を持っていく。
7. 客が料理を食べる。


###ソフトウェアに当てはめてみる。
1. ユーザーがソフトを起動、何をするかのメニューが表示される。
2. ユーザーの入力値をインターフェイスが受け取る。
3. インターフェイスが受け取った入力をバックエンドの理解できるものに変換して、バックエンドに渡す。
4. バックエンドのプログラムが入力に対する出力をするためのデータを集め、計算する。
5. 出力値の計算が完了したら、それをまたインターフェイスに渡す。
6. インターフェイスが出力値をフロントエンドに渡す。
7. ユーザーがその出力値を観測する。

ソフトウェア開発等に関わったことのない人はフロントエンドやらバックエンドやらインターフェイスってなんやってなると思うので、そのへんを細かく説明していきます。

###フロントエンド
**レストラン**で言う内装、出てくる料理、メニュー等大雑把に言えばレストランへ来た客が五感で感じるものすべてのこと。メニューから客が注文するところまでがフロントエンド。
**ソフトウェア**でいうデザイン、アイコン、色使い、音楽、ユーザーが触れ合う部分のことをフロントエンドという。ユーザーからの入力はすべてこのフロントエンドから行われる。

この社会に当てはめてみていうとしたらサービス業がもう全部フロントエンド。
仕事を探していてもよくフロントエンドエンジニアなど、フロントエンドに特化する人がいるぐらいに重要で複雑なもの。どんな神ゲーもどんな糞ゲーも全部このフロントエンドがそれ相応のものでないと正当な評価は得られないのではと思ったり。

###バックエンド
**レストラン**で言う厨房。生野菜やら調味料やら調理器具やら厨房で使われるものやそれらを手に入れる工程をバックエンドという。それだけではなく、レストランとしての税金を払ったり、保健所とのやりとりをしたり、レストランの管理自体も含まれている。
**ソフトウェア**でいう、データやそのデータを正規化するプログラム、ユーザーからの入力を処理して何らかの出力を出すプログラム等も全部バックエンド。ソフトウェアにもよるが、サーバーの構築やルーティング、ドメイン設定等の裏方作業も全部バックエンド。

これまたフロントエンドとおなじでバックエンドエンジニアというバックエンドに特化した職種があるように重要で複雑。

### インターフェイス

**レストラン**でいうウェイター。客からの注文を取って厨房に回す役割。フロアと厨房を両方行き来することができる。
**ソフトウェア**では、フロントエンドとバックエンドをつなげる役割をしているもの。入力値をバックエンドに渡して、バックエンドから返された出力値をフロントエンドに返す仕事。


しっかりした定義はないらしいのでフロントエンドとバックエンドの定義が曖昧になっている部分もあるが、かんたんに言ってしまえばユーザーが触れるものがフロントエンド、ユーザーが触れないものがバックエンドと考えてもらってもいい。

フロントエンドもバックエンドもある程度できるよって人がフルスタックエンジニアと呼ばれている。
このフルスタックっていうのはバックエンドからフロントエンドがスタックのように積み重なっていくので、そういった呼び名らしい。
WSLのターミナルにHyperを導入する

## Hyperとは
見た目がかっこいいターミナル
Windowsのデフォルトのターミナルがダサいので入れてみました

## Hyperのインストール
https://hyper.is/
からインストーラをダウンロードし、よしなにインストールする

## シェルとホームディレクトリの設定
設定するとHyperが立ち上がらなくなったりしたが、端末再起動で解決した

```
    shell: 'C:\\Windows\\System32\\wsl.exe', //デフォルトのシェルをWSLのBashにする
    shellArgs: ['~'], //これがないとHyper導入前と後でホームディレクトリが変わってしまう
    ...

    env: {LANG: 'ja_JP.UTF-8'}, //日本語の文字化けを防ぐ
```
## プラグインの導入
[hyperterm-material](https://github.com/dperrera/hyperterm-materia)がオススメみたいだったので、``Ctrl + ,``で``.hyper.js``を開き、

```
  plugins: ['hyperterm-material'],
```
と記述
以下のような見た目になった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265544/03127e33-b384-4063-a9c0-ae8c90ca989a.png)
Rustで"zero-setup"クロスコンパイルを試してみる

組み込み開発では違うCPU向けにコードをコンパイルするためにクロスコンパイルをする必要がありますが、[rust-embedded/cross](https://github.com/rust-embedded/cross)を使うと簡単に出来るらしいので試してみます。
手元に実機が無いので今回はx86_64 (Intel Core i7-8700K)上でAArch64のコードを生成し実行する事を目標とします。

Setup
------

> "Zero setup" cross compilation and "cross testing" of Rust crates
https://github.com/rust-embedded/cross

```
cargo install cross
```

でインストールされます。crossはdockerを使ってQEMU等のクロスコンパイル環境を用意してくれるので、ユーザー権限でdockerを使えるようにしておきます。

zero-setupらしいので手動で用意するのはここまでです！

QEMUで実行する
----------

```
cargo new --bin hello_cross
```

これはデフォルトで次のようなコードを生成します

```rust:src/main.rs
fn main() {
    println!("Hello, world!");
}
```

これをクロスコンパイルしてQEMUで実行します

```
$ cross run --target aarch64-unknown-linux-gnu
   Compiling hello_cross v0.1.0 (/project)
    Finished dev [unoptimized + debuginfo] target(s) in 0.20s
     Running `qemu-aarch64 /target/aarch64-unknown-linux-gnu/debug/hello_cross`
Hello, world!
```

簡単ですね。あれ、すごい簡単ですね(´・ω・｀)？？

何が起こっているのか
=================
あまりに簡単だったのでどうやって動いているのか少し見てみましょう。
crossはいくつかの要素技術を組み合わせて自動化してくれています。

rustup/cargo
-------
まずRustはLLVMをベースとしているので、LLVM IR経由でユーザーのコードを別CPU向けにクロスコンパイルできます。それ以外の部分、標準ライブラリ(libstd)やlibcore(`core::`名前空間にあるstdより限定された最小限の実行時環境)はコンパイル済みのバイナリが[多くのプラットフォーム向け](https://forge.rust-lang.org/platform-support.html)にrustupで配布されており、cargoがリンクします。

```
rustup target add aarch64-unknown-linux-gnu
```

で手動でインストールできます。クロスコンパイルするには

```
cargo build --target aarch64-unknown-linux-gnu
```

のように`cargo`にターゲットを指定するだけで`target/aarch64-unknown-linux-gnu`以下にバイナリが生成されます。
libstdやlibcoreをコンパイルする必要がある場合は[xargo](https://github.com/japaric/xargo)が必要でしたが、現在では`thumbv*-none-eabi*`やnvptx等の限定的な場合でしか必要ありません (crossはxargoを使う場合もサポートしています、詳しくは[README](https://github.com/rust-embedded/cross)へ)。

QEMU
-----
一方、別CPU向けにクロスコンパイルされたバイナリを実行するにはQEMUが使われています。

> QEMUは機械全体をエミュレーションするシステムエミュレーションと呼ばれる環境と、Linuxのユーザーランドをエミュレーションするユーザーエミュレーションと呼ばれる環境がある。 
https://ja.wikipedia.org/wiki/QEMU

らしいですが、crossが使用しているのはユーザランドのエミュレーションです。なのでこれを自分で構築しようと思うとQEMUをインストールする手順が必要になりますが (参考：[DockerでユーザモードQEMUによるARMエミュレーション環境を構築する](http://inaz2.hatenablog.com/entry/2015/03/03/235759))、[crossプロジェクトが用意してくれているdockerコンテナ](https://github.com/rust-embedded/cross/tree/master/docker)を使うことで環境構築が容易になっています。このコンテナにはQEMUだけでなく、Rustが依存しているOpenSSLや、Android NDKなども同梱されているようです。
【Salesforce Commerce Cloud】 デベロッパーのトレーニングを受けてきました。

# 挨拶
こんにちは、__イエノカド__です。
今回、Salesforce が提供している__Commerce Cloud Digital Developer__のトレーニングを受講してきました。
あまり情報も載っていないので、備忘録として記述していきます。
結果的に4日間のトレーニングを受講した1週間後には、__Commerce Cloud Digital Developer__の資格を取得できました。

# Salesforce Commerce Cloudとは
* __セールスフォース・ドットコム__が2016年6月に買収したデマンドウェアの製品を基盤とした製品
* __クラウドECプラットフォーム__
* グローバル企業が導入している（__アディダス__, __クロックス__, __アシックス__）

# Commerce Cloudの開発環境を得るためには
* [Commerce Cloud Digital Developer](https://help.salesforce.com/HTTrainingCourseDetail?id=a230M000000Tune) のトレーニングを受講する（受講終了後、2週間後に開発環境が利用できなくなります）
* Commerce Cloudのサービスのライセンス契約をする（契約料についてはレベニューシェアですが、契約できる企業はある一定基準の売上を満たしている企業と思われる）
* Salesforce Commerce Cloudのパートナー企業となる（資格保有者が4人いる企業がなれるそうです）

# 開発環境
* eclipse(Neon)
* Windows 10 Pro

# トレーニングの4日間の中で何を教えてもらえるか
* Commerce Cloudのカスタマイズ方法（プログラミング）
  * Javascriptコントローラ
  * ISMLテンプレート

基本的に上記内容の通り、Commerce Cloudはサーバー言語がJavascriptで
テンプレートエンジンがISML（HTMLのようなもの）というものです。

トレーニングの中ではJavascriptでサーバー上の処理を書きますが、
JQueryみたいな書き方は基本なく、生書きするようなイメージです。

* __Javascriptコントローラ__

```javascript:JShowProduct.js
'use strict';

// テンプレートエンジンの呼び出し
var ISML = require('dw/template/ISML');
// 関数を新しい名前で設定できる
var guard = require('storefront_controllers/cartridge/scripts/guard');
// 商品マネージャー
var ProductMgr = require('dw/catalog/ProductMgr');

function start() {
    var parameterMap = request.httpParameterMap;
    // Getパラメータ「pid」から値を取得
    var parameterId = parameterMap.pid.stringValue
    // pidから商品データを取得 
    var product = ProductMgr.getProduct(parameterId);
    if (product == null) {
       // 商品情報がnullの場合、テンプレートにメッセージを渡す
       ISML.renderTemplate('productnotfound.isml', {message: 'product with id ' + parameterId +' not found'});	
    } else {
       // 商品データを取得できた場合、商品データをテンプレート変数に設定
       ISML.renderTemplate('productfound.isml', {myProduct: product});
    }
}

// URLの設定
exports.Start = guard.ensure(['get'], start);
```

* Javascriptコントローラが実行されるURL

```md
http://xxxx.demandware.net/on/demandware.store/Sites-xxx-Site/default/JShowProduct-Start
```

* __ISMLテンプレート__（「pid」がnullの場合）

```html:productnotfound.isml
<h1> ${pdict.message}  </h1>
```

* 表示結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377903/8132ce65-e6e6-c08e-7301-b1dc06cc767f.png)

* __ISMLテンプレート__（「pid」がある場合）

```html:productfound.isml
<iscomment>Using a custom tag</iscomment>
<isdecorate template="product/pt_productdetails">
	<iscomment> Using the producttile custom tag </iscomment>
    <isinclude template="util/modules.isml" >	
	<isproducttile product="${pdict.myProduct}" showswatches="${true}" showpricing="${true}" showquickview="${false}">
</isdecorate>

<h1> ${pdict.myProduct.name} </h1>
```

* 表示結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377903/027c54c3-dd93-14ed-c6db-1ce5c9434531.png)

# まとめ
* 基本的には__Javascript__と__HTML__, __CSS__の理解があればコードは書けそう。
* ただし、Commerce Cloudならではのお作法（__ISML__等）があるため、そこは色々試して知っていかなければならない。
* Commerce Cloudライセンスを契約することはかなり大手（グローバル）企業でないと無理そう。
* トレーニング費用が個人ではなかなかお高い額のため、「ちょっとやってみたい」ができない。
* 2019/6/18現在はコードの書き方が少し変わっており、サーバーサイドはNode.jsを基盤として書かれています。

__Commerce Cloud カスタマイズのための情報等がまだまだ日本語では少ないため、今後も調べていき、発信したいと思います。__
【Windows】サスペンド/ハイバネーション

# シャットダウンじゃなくて復帰が少し早い、くらいは知っているが、スリープとか休止とか、どう違うのかわからない

■種類

|        |メモリの内容|電源|電力消費|停止/開始にかかる時間|別名|備考|
|:--|:--|:--|:--|:--|:--|:--|
| モダンスタンバイ|メモリに保持 |WiFiはONのまま(30秒に一回通信)  |大  |速  |S0低電力アイドル/Instant Go(Win8.1)/コネクトスタンバイ(Win8 ※ちょっとモダンスタンバイとは異なる) |スマホのような動作のイメージ|
| サスペンド      |メモリに保持  |メインメモリ以外OFF|中(ある程度食う)|中(数秒程度)|スタンバイ(Win98)/スリープ(Vista～)||
| ハイバネーション |storageへ退避|全面OFF          |小(ほぼ0)|遅 |休止状態||

- サスペンド、ハイバネーションからの復帰をレジュームという。
remove Loopback audio from device list

soundflowerを探す過程でloopback audioというsoftwareを試した. 
しかし, 結局, loopback audioは不要ということになったので, applicationから削除した. 
だが, soundのdevice listにloopback audioが残ってしまった. 
[サウンドデバイスから削除できない諸問題を解決した。[Soundflowerとか]](http://macmen.tokyo/system-sound/)
の方法ではloopback audioのkextが見つからず削除できなかった. 

本記事はその解決方法の備忘録. 

[公式](https://rogueamoeba.com/support/knowledgebase/?showArticle=UninstallingLoopback)
にあるように, 
loopback audioのinstallerを立ち上げて, そこでunistallを実行してやるとちゃんと消えた.