OmniAICreator/Qiita-1.07M huggingface dataset:
Attachされていない不要なSG(Security Group)を抜き出すScript

AWSを使っていると、SG(Security Group)がとめどなく増えてしまうことがある。
一人や少人数で開発・運用している分にはまだ良いが、開発に携わる人数が増えて、各人が自由にインスタンスを上げられる権限を与えられていたりすると、下手すると1インスタンスごとにSGが作られたり、そのSGがAttachされたインスタンスがTerminateされた後も、どこにもAttachされないSGが大量に残ってしまうこともしばしば起こる。

こういったゾンビSGを抜き出すScriptを書いてみた。

```unattached_sg.sh
#!/bin/bash
export LANG=C
export AWS_DEFAULT_OUTPUT=text
export AWS_DEFAULT_REGION=ap-northeast-1

### EFSにAttachされているSGを取得し配列に格納
EFSs=(`aws efs describe-file-systems | grep "FILESYSTEMS" | awk '{print $6}'`)
num1=0
num2=0
while [ $num1 -lt ${#EFSs[*]} ]
do
	EFS_mountpoint=(`aws efs describe-mount-targets --file-system-id ${EFSs[$num1]} | awk '{print $7}'`)
	while [ $num2 -lt ${#EFS_mountpoint[*]} ]
	do
		SG=`aws efs describe-mount-target-security-groups --mount-target-id ${EFS_mountpoint[$num2]} | awk '{print $2}'`
		num2=`expr $num2 + 1`
		echo ${EFS_SGs[*]} | grep $SG >/dev/null 2>&1 && continue
		EFS_SGs=($SG ${EFS_SGs[*]})
	done
	num1=`expr $num1 + 1`
done

### それぞれのSGが使用されているのかCheck
SG=(`aws ec2 describe-security-groups --group-ids | grep SECURITYGROUPS | awk -F"\t" '{print $3}' | sort -u`)
for CHECK in ${SG[*]}
do
	aws ec2 describe-instances | grep $CHECK >/dev/null
	if [ $? -eq 0 ]
	then
		continue
	fi
	aws elb describe-load-balancers | grep $CHECK >/dev/null
	if [ $? -eq 0 ]
	then
		continue
	fi
	aws elbv2 describe-load-balancers | grep $CHECK >/dev/null
	if [ $? -eq 0 ]
	then
		continue
	fi
	aws rds describe-db-instances | grep $CHECK >/dev/null
	if [ $? -eq 0 ]
	then
		continue
	fi
	aws rds describe-db-clusters | grep $CHECK >/dev/null
	if [ $? -eq 0 ]
	then
		continue
	fi
	aws elasticache describe-cache-clusters | grep $CHECK >/dev/null
	if [ $? -eq 0 ]
	then
		continue
	fi
	echo ${EFS_SGs[*]} | grep $CHECK >/dev/null
	if [ $? -eq 0 ]
	then
		continue
	fi
	echo $CHECK
done
```
*2021/5/1, RDSやElastiCacheにAttachされているSGを除外するCodeなどを追記。*
*2021/5/6, EFSにAttachされているSGを除外するCodeなどを追記。ちょっとややこしかった…*

これで、EC2, RDS, ElastiCache, ALB/ELB/NLBのいずれにもAttachされていないSGを探し出すことができる。
この結果に基づいて不要なSGを整理すれば、スッキリする環境も多いのではないか?
Hyperledger Fabric のチュートリアルをした時につまった@mac

https://hyperledger-fabric.readthedocs.io/en/release-1.1/tutorials.html
Hyperledger-fabric やろうとしてこのチュートリアルをやったときに詰まったものをまとめました。

そもそもこいつ毎日のように更新されるからやるたんびに違うエラーがでてきてやばたにえん。

# `npm install` 時の警告

```
added 370 packages from 293 contributors in 217.786s
[!] 3 vulnerabilities found [965 packages audited]
    Severity: 1 low | 2 moderate
    Run `npm audit` for more detail
```

もー嫌な予感しかしないですね。とりあえず実行してみましょうか

# そも `enrollAdin.js` が実行できない

```
[minori@mba fabcar] ((v1.1.0))
$ node enrollAdmin.js 
module.js:545
    throw err;
    ^

Error: Cannot find module './api.js'
    at Function.Module._resolveFilename (module.js:543:15)
    at Function.Module._load (module.js:470:25)
    at Module.require (module.js:593:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/private/tmp/fabric-samples/fabcar/node_modules/fabric-ca-client/lib/FabricCAClientImpl.js:19:11)
    at Module._compile (module.js:649:30)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)
```

`package.json` のライブラリ指定が不正確なため検証不足なライブラリが引っ張られている様です。
結合テストしてないんかい……

```diff
diff --git a/fabcar/package.json b/fabcar/package.json
index 50420ab..cdf70cd 100644
--- a/fabcar/package.json
+++ b/fabcar/package.json
@@ -7,9 +7,9 @@
         "test": "echo \"Error: no test specified\" && exit 1"
     },
     "dependencies": {
-        "fabric-ca-client": "~1.1.0",
-        "fabric-client": "~1.1.0",
-        "grpc": "^1.6.0"
+        "fabric-ca-client": "1.1.0",
+        "fabric-client": "1.1.0",
+        "grpc": "1.6.0"
     },
     "author": "Anthony O'Dowd",
     "license": "Apache-2.0",

```
やっぱり忘れたtruffleの使い方

# はじめに

truffleは使い勝手が良いのですが、使い方をよく忘れます。
自分が悪いんですけど。

忘れないように記録を。

# セットアップ
## node.jsをインストール

node.jsをインストールする必要があります。

[公式サイト https://nodejs.org/ja/](https://nodejs.org/ja/)

各OSごとにインストールは違いますが、簡単なので割愛します。

## truffleをインストール

コマンドラインで、以下を実行

```
npm install -g truffle
```

私の場合、windowsなので、powershellのコマンドラインで実行しました。

## プロジェクトの作成

引き続きコマンドラインで、ディレクトリーを作成します。

```
mkdir my-project
cd my-project
```
## truffleプロジェクトを作成

truffleの新規プロジェクトを作成します。

```
truffle init
```

実行すると、プロジェクトディレクトリーに以下の構成が作成されます。

> │  truffle-config.js
> │  truffle.js
> │
> ├─contracts
> │      Migrations.sol
> │
> ├─migrations
> │      1_initial_migration.js
> │
> └─test

# コンパイル、マイグレーションとテスト

## 開始

```truffle develop``` を使用すると、他のetheruemクライアントがなくてもテストが可能です。
実行すると、truffleのコンソールプロンプトに代わります。
終了するときは、Ctrl + D で終了します。

```
truffle develop
truffle(develop)> 
```

## コンパイル

作成されたcontractsディレクトリーにsolidityファイルを保存します。
実行するためにコンパイルを行います。

```
truffle(develop)> compile
```

truffleのコンパイルは差分コンパイルです。前回から変更されたファイルのみ再度コンパイルします。
すべて再コンパイルするときは、```--all```オプションを付けます。

```
truffle(develop)> compile --all
```

## マイグレーション

実際のEthereumのメインネットへのコントラストのデプロイ、テストネットやローカルネットのデプロイを
行うためにマイグレーションを行います。

```
truffle(develop)> migrate
```

どこにデプロイするかは、```migrations/1_initial_migration.js```に記載します。

## マイグレーションのやり直し

テストに失敗したときなどでコントラストの修正を行ったときに、マイグレーションを行うと、
前回のデプロイが残っていてうまく動作しないことがあります。
そのときは、```--reset```オプションをつけてマイグレーションを最初からやり直します。

```
truffle(develop)> migrate --reset
```

# 終わりに

まだ慣れていない方や、これから使う方はご参考に。
XRDP を ubuntu18.04に aptで インストールして使う


標準の環境がgnomeになって さらに 簡単になった
インストールしたあと 修正点は2か所

# インストール
aptコマンドで 簡単インストール

```
sudo apt install xrdp
```


# 設定変更1

/etc/X11/Xwrapper.config の内容を

```
allowed_users = anybody
```

に 書き換える


# 設定変更2
polkitの設定を修正しないと "Authentication is required to create a color managed device" と言われる

/etc/polkit-1/localauthority.conf.d/02-allow-colord.conf を作成して次のように記述する

```
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.color-manager.create-device" ||
       action.id == "org.freedesktop.color-manager.create-profile" ||
       action.id == "org.freedesktop.color-manager.delete-device" ||
       action.id == "org.freedesktop.color-manager.delete-profile" ||
       action.id == "org.freedesktop.color-manager.modify-device" ||
       action.id == "org.freedesktop.color-manager.modify-profile") {
     return polkit.Result.YES;
  }
});
```
## 注意点
注意点としては コンソールで x環境使っているユーザはログインできないようです。
herokuのhobby dynoってauto scalingなしなら無料なのか？

<img width="1237" alt="Screen Shot 2018-05-09 at 13.51.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/4a501383-9fae-e10a-d81c-ef35261ce0dc.png">


* このチェックをオフにするとただになるのか。
* そうでないなら逆にオンにすると7ドルかかるからhobbyの7と合わせて14になるのか（なってないように見える）？

# 参考
https://www.heroku.com/pricing
markdownファイルのリンク切れをチェックする

ブログ記事や書籍を執筆するときにMarkdownを使うことが珍しいことではなくなりました。

チュートリアルなどを書くとき、図説をたくさん入れます。
最初はキレイに管理できるのですが、ページの構成を変更したり、後から画像を追加したりなどしていくうちに画像のリンク切れが頻発します。

そういう時に便利なツールがnpmにありました。

[tcort/markdown-link-check: checks that all of the hyperlinks in a markdown text to determine if they are alive or dead](https://github.com/tcort/markdown-link-check)

# 前提条件
* コマンドラインツールがちょっと使えること
* node.jsのインストール
* npmのインストール

# markdown-link-checkのインストール

```npm install -g markdown-link-check```

実行するとこんな風にインストールされます。

<img width="1019" alt="スクリーンショット 2018-05-09 10.26.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/8405/41c28de9-1e9a-30e6-7744-32e32bed54a9.png">

# Checkの仕方

``` markdown-link-check ファイル```

とすればこんな風にチェックしてくれます。

<img width="1019" alt="スクリーンショット 2018-05-09 10.26.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/8405/83f4717c-af35-fe7b-f1dd-be895419985f.png">

むっちゃ便利ー!
Subversionの検証(チュートリアル)をした際のメモ

# Subversionの検証(チュートリアル)をした際のメモ

* 自宅学習として、下記サイトを使ってSubversionの検証させていただきました
  * [バージョン管理システム入門(初心者向け)by tracpath](http://tracpath.com/bootcamp/learning_subversion_tutorial4.html)


* とてもわかりやすかったです(ありがとうございます)！
* 使ったコマンドと機能をメモしておきます
<br>


| 番号 | コマンド | 機能 |
|:-----------|------------:|:------------|
| 1 | create | リポジトリ(神様)作成 |
| 2 | import | ローカルにあるリポジトリを、作成したリポジトリ(神様)に追加 (   trunk , branches , tags の３フォルダからなる構成である必要あり ) ※上記のチュートリアルでは未使用(svn  mkdirして、リポジトリ(神様)に直接作っている)|
| 3 | checkout | リポジトリ(神様)を作業フォルダ(カレント)にコピー |
| 4 | status | 作業フォルダ(カレント)上に、リポジトリ(神様)への追加・修正ファイルがあるか確認する  |
| 5 | add | 作業フォルダにあるファイルのうち、statusで確認した時に追加ファイル(?マークになったファイル)を、commitするためのファイルリストに追加する.これは原則1ファイルずつしかできない(泣) (git add -A ができない) また、変更したファイルはaddしなくて良い.|
| 6 | commit | 作業フォルダにあるaddしたファイルと変更があったファイルを、リポジトリ(神様)に反映する. オプション：-m "message" |
| 7 | update | チェックアウト先(カレント)に現在のリポジトリ(神様)を反映する. その際に、チェックアウト先で編集してcommitしていないファイルには変更を加えない.|


| 番号 | ブランチ操作系コマンド | 機能 |
|:-----------|------------:|:------------|
| 1 | copy | trunk(幹)からbranches(枝)へのコピー、branches(枝)からtagのコピー |
| 2 | merge | branches(枝)とtrunk(幹)を合体 |

<br>

```sh
# 参考：status で確認したファイルを一括でaddする(git add -A する)
svn status |awk '{print $2}'|xargs svn add
```

<br>

# 参考にさせていただいたサイト

* [Qiita 今更聞けないSubversionの使い方]
(https://qiita.com/mountcedar/items/e756bb9136e3b1722bb2)

**--> 図がわかりやすいです！**
    図にはないですが、commitする前にadd(commitするファイルリストを作成する処理)する必要はあります
Rubyでシャッフルランチをシャッフルする

`シャッフルランチ`という文字列をシャッフルしたい時があると思います。

Rubyの場合は、次のように書くことができます。

```ruby
'シャッフルランチ'.chars.shuffle.join
```
> ※追記 2018/05/09 15:25 scivolaさんに頂いたコメントの内容を反映しました。

irbなどで実行すると、次の結果が得られます。

```
irb(main):004:0* 'シャッフルランチ'. chars.shuffle.join
=> "ラフルチンャシッ"
```
node.js（spawn）でログ監視がうまく動かなかった

#問題
node.jsでdockerコンテナのログを監視し、特定のログが出た場合に必要なアクションをとるようなアプリを作ろうとしたが、spawnでstdoutが上手く拾えなかった

#原因
ログの絞込みのためgrepを使用していたが、grepの出力がbufferされていて適切なタイミングでstdoutに出力されていなかった

#対応
grepのbufferを無効化するオプション（--line-buffered）を使用する。

サンプル

呼び出し元

```app.js
const spawn = require('child_process').spawn

cmd = spawn('./tail.sh');
cmd.stdout.setEncoding('utf8');
cmd.stdout.on('data', (data) =>{
	//アクション
	console.log(data);
});

```

呼び出し先

```tail.sh
docker logs -f --tail 0 コンテナ名 2>&1 | grep "監視文字列" -a --line-buffered
```

 grepのオプション -a はつけなかった場合、"バイナリファイル (標準入力) に一致しました" とだけ標準出力に出力されてしまってログの内容が取れなかったのでその回避策でつけました

#まとめ
タイトルにはnode.jsやspawnと入れていましたが結局呼び出しているシェルの問題でした。grep以外にも各種コマンドや言語によって標準出力がデフォルトでbufferされていることがあるようなのでそれぞれにあったオプションをつける必要があるようです
備忘録：pythonのelse時に何もしない場合の書き方をワンライナーで

気付いたらそれだけなんですが、気付くまでに時間が掛かるやつです。
探しても見つからなかったので備忘録。

# やりたいこと
``` Ternary_operator.py
def practice(message = None):
  if message is None:
    message = 'no message'
  print(message)
```

messageがあればそれを、なければno messageと表示させたい。
この書き方を一行でスマートにできればいいよね＾＾というのが事の発端。

# 調べたら見つかりやすかったケース（三項演算子を使う）
``` Ternary_operator.py
def practice(message = None):
  message = 'no message' if message is None else message
  print(message)
```

確かにこれで良いんですが、elseは何もしないので書きたくない。

# こうすれば良かった
``` Ternary_operator.py
def practice(message = None):
  if message is None: message = 'no message'
  print(message)
```

三項演算子を使う、というところにとらわれすぎてて、基本的な使い方を忘れていました。
if～: の後に改行をしなければ良いだけなのですが、なぜか思い当たるまでに時間が掛かってしまった……。

# （私がよくやる）実運用ケース
``` Ternary_operator.py
class hoge(object):
  message = 'no message'  #実際はこのmessageを__init__なりで色々変更しています。

  def practice(message = None):
    if message is None: message = self.message
    ～なにかしらの処理～
```

これで少しはムダなコードが減りますね。
ちなみに、if～: 【ここ】は代入以外も当然書けますので、実際に活用する場合はその方がいいです。
lambdaと組み合わせるとすごい効果を発揮します。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
Laravel+MySQL+NginxでさくっとDocker開発立ち上げる

Laravel環境をDockerで作りました。
よく使われている環境はありますが、シンプルにやりたかったので自前でdocker-composeしています。

# ファイル構成イメージ
```
.
├── Dockerfile
├── docker-compose.yml
├── etc
│   └── nginx
│       └── conf.d
│           └── default.conf
└── laravel
```

# docker-compose.yml

```docker-compose.yml
version: "2"

services:
  nginx:
    image: nginx:alpine
    volumes:
      - ./etc/nginx/conf.d/:/etc/nginx/conf.d/
      - ./laravel/public:/var/www/laravel/public
    ports:
      - 80:80
    links:
      - phpfpm
    depends_on:
      - phpfpm
  phpfpm:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./laravel:/var/www/laravel
    links:
      - mysql
    depends_on:
      - mysql
    environment:
      - DB_HOST=mysql
      - DB_DATABASE=wakana
      - DB_USERNAME=root
      - DB_PASSWORD=pass
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=pass
      - MYSQL_DATABASE=wakana
```

Mysqlのバージョンが5.7なのは、8だとめんどくさいエラーでるからです。

```:めんどくさいエラー
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
```

# Dockerfile

```:Dockerfile
FROM php:7.2-fpm-alpine

RUN docker-php-ext-install pdo_mysql
```

PHPはメンテコストを考え現在(2018/05/09現在)latestの7.2に固定していますがお好きなので大丈夫です。
phpfpmにpdo_mysql入ってないので別にDockerfile作成しインストールしてあげます。

# Nginx

nginxコンテナに共有する./etc/nginx/conf.dに置くファイルです。
普通にららべる向けの設定を書けばOKです。

```:default.conf
server {
    listen       0.0.0.0:80;
    server_name  localhost;
    charset      utf-8;

    root /var/www/laravel/public;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass  phpfpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
```

# Docker立ち上げ

`docker-compose up -d`

どーん！

# アプリケーションキー発行、マイグレーションなど

`docker-compose exec phpfpm /var/www/laravel/artisan key:generate`
`docker-compose exec phpfpm /var/www/laravel/artisan migrate`

もしくは

`docker-compose exec phpfpm /bin/sh`

このコマンドで中入れるのでlaravelフォルダ内で作業します。

`cd /var/www/laravel/`

`php artisan key:generate`
`php artisan migrate`

# アクセス

こんにちわんこ！
http://localhost/

<img width="670" alt="スクリーンショット 2018-05-09 13.28.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/20557/4da400a4-f2a6-6706-5d6b-5eb70c8cf663.png">
Flutterで丸イメージを表示する


## Flutterが流行ってきた

beta 3が発表されました。

https://qiita.com/aoinakanishi/items/cf8376bb1780e1c48553

今、Flutterがきてますね。


GoogleがOracleの権利関係の裁判で負けたようなのでこれから下の二つを予想しています。(https://gigazine.net/news/20180329-oracle-beat-google/)

- JavaからKotlinに移行していく
- Flutterがくる

(個人の見解です)


## 丸い画像を表示する


![スクリーンショット 2018-05-09 13.31.15.png](https://qiita-image-store.s3.amazonaws.com/0/139360/461637fc-0bc8-0c50-7c94-21cd6fab3589.png)

↑のような丸画像は下記で実装できます。

```dart
Widget _userIconImage() {
    return new Container(
        width: 150.0,
        height: 150.0,
        decoration: new BoxDecoration(
            shape: BoxShape.circle,
            image: new DecorationImage(
                fit: BoxFit.fill,
                image: new NetworkImage(
                    "画像URL")
            )
        ));
  }
```

誰かの力になれば
solidityでのつまずきについて

# はじめに

しばらくQiitaはROM専だったのですが、備忘録のために残します。

最近、仮想通貨とか暗号通貨とかブロックチェーンとかについて色々調べています。
ただ、ネットにある情報が若干（数か月前の情報ですが）古いために、サンプルコードがまともに動かないことが多くて
その調査だけで時間が掛かっています。

私自身が経験したつまずいたことを書いていきます。

## バージョン違いによる仕様変更

2018/05現在、solidityのバージョンは v0.4.23です。
ですので、このバージョンと以前のバージョンでの違いについてがメインとなります。
いろいろ変わっていますので、対応が必要です。


### public などの関数の可視性

```solidity:以前バージョン

method(uint param) {   // 可視性はなくてもOKでした
   ....
   ....
}
```

```solidity:v0.4.23.sol

method(uint param) public {   // 可視性が必要です
   ....
   ....
}
```

多言語でよくある ```public int method(int param)```のような形ではありません。
__関数名の後ろ__に付けるのがsolidityです。これに気が付くまでに時間が掛かりました。

ちなみに戻り値があるときは、可視性の後ろにreturns修飾子を付けます。

```solidity:v0.4.23.sol

method(uint param) public returns(bool ret) {
   ....
   ....
}
```

### コンストラクタについて

```solidity:以前バージョン
contract TestToken {
    
    TestToken() {    // 以前は、コントラスト名と同じでした
        ....
        ....
    }
}
```

```solidity:v0.4.23.sol
contract TestToken {
    
    constructor () public { // constructorというキーワードです
        ....
        ....
    }
}
```

constructor という表記方法に代わっています。
もちろんですが可視性(public)も必要です。

### uintについて

```solidity:以前バージョン

method(uint param) {   // uintでOKでした
   ....
   ....
}
```

```solidity:v0.4.23.sol

method(uint256 param) public {   // uintだとWarningが発生しますので、uint256などに変更
   ....
   ....
}
```

uint型は、推奨ではないようです。
__ERC20__のコードなどを見るとuint256を使用しているケースが多いので、
uint256にしておくのが良いかと。


### event修飾子

```solidity:以前バージョン

event Transfer(address indexed _from, address indexed _to, uint _value);

function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
	if (balances[msg.sender] < amount) return false;
	balances[msg.sender] -= amount;
	balances[receiver] += amount;
	Transfer(msg.sender, receiver, amount);       // 特になにもする必要はありませんでした
	return true;
}

```

```solidity:v0.4.23.sol

event Transfer(address indexed _from, address indexed _to, uint _value);

function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
	if (balances[msg.sender] < amount) return false;
	balances[msg.sender] -= amount;
	balances[receiver] += amount;
	emit Transfer(msg.sender, receiver, amount);    // emit修飾子を使います
	return true;
}

```

event(トランザクションへのログ出力)を実行するときは```emit```をつける必要があります。


# 終わりに

オープンソースですので、仕様の変更がよくあるのは仕方がないと割り切っていますが、
情報を探すが結構大変です。公式サイトなどをしっかり読めば気づくのでしょうけど・・・

# 参考URL
[solidity(https://solidity.readthedocs.io/en/latest/index.html)](https://solidity.readthedocs.io/en/latest/index.html)
[https://github.com/OpenZeppelin/openzeppelin-solidity/issues/932](https://github.com/OpenZeppelin/openzeppelin-solidity/issues/932)
参照設定 の 情報を VBA で取得する

##参照設定の初期値
Access 2016 参照設定 の初期値は、下記のようになっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/c7864801-d5a6-d52c-823e-08ce6c48fb12.png)

参照設定にライブラリを追加すると、配布した時に、ユーザーのバージョンが低いとエラーになってしまいます。

そのために、ライブラリの設定情報を取得して、判定する場合などの情報です。


##参照設定のライブラリ情報を取得する。
マクロで参照設定を操作する
http://officetanaka.net/excel/vba/tips/tips100.htm

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/f1749696-f57e-7a03-86c7-d75fcbf844fe.png)

```
Sub Sample1()
    Dim Ref, buf As String
    For Each Ref In ActiveWorkbook.VBProject.References
        buf = buf & Ref.Name & vbTab & Ref.Description & vbCrLf
    Next Ref
    MsgBox buf
End Sub
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/95251ad9-3ba8-fd10-935c-c6dc237e55e9.png)


##Accessをクラウドで運用する方法
[<img src="https://qiita-image-store.s3.amazonaws.com/0/93227/0a92c014-c979-ade7-7c61-417465a03a38.png" width=70%>](http://access-cloud.hatenablog.com/)
---
▼Accessを使って、「Accessをクラウドで運用する方法」をブログで発信しています。
よろしければ、お立ち寄りください。

汎用データベース「カードボックス BARI」
http://access-cloud.hatenablog.com/entry/cardbox-bari
AWSのp2・p3インスタンスのベンチマーク

DeepLearning用にAWSでp系インスタンスを使うのですが、p2インスタンスとp3インスタンスのどちらを使うべきなのか迷うことがあったのでベンチマークを取ってみました。

## 環境情報
- リージョン：オレゴン
- AMI：Deep Learning AMI (Ubuntu) Version 8.0 - ami-0bbbd373 (Amazon AMIs)
- インスタンス：p2.xlarge・p3.2xlarge
    - スポットインスタンスを利用
    - 参考情報ですが、実験時p2.xlargeが`$0.2783`、p3.2xlargeが`$1.0159`でした（もちろん変動しますのでご注意を）
- EBS：gp2 100GB
    - 最適化なし・暗号化なし。

## ベンチマーク結果

[TensorFlowのResNet](https://github.com/tensorflow/models/tree/master/official/resnet)の学習（＋推論）を使って計測しました。
データセットは `CIFAR-10` です。
※実験の詳細な手順は後述しています。

結果は以下のようになりました。5回実行した結果の平均時間です。

| p2.xlarge        |p3.2xlarge         |
|:-----------------|------------------:|
| 179.10 sec       |74.16 sec          |

画像処理においては、p2.xlargeをp3.2xlargeにするとざっくり `2倍強の速度が出る` という結果となりました。
選択の際の目安程度にはなるかと思います。

## ベンチマーク計測手順

ご興味がある人はご確認ください。以下、p2インスタンス・p3インスタンス共に共通です。

```
# p系インスタンスにSSHしておく

# TensorFlow(+Keras2) with Python3 (CUDA 9/MKL)に切り替え
source activate tensorflow_p36

# tensorflow/modelsをclone（実行環境のTensorFlowのバージョンに合わせる）
git clone -b r1.7.0 https://github.com/tensorflow/models.git

# tensorflow/modelsの環境設定
export PYTHONPATH="$PYTHONPATH:/home/ubuntu/models:/home/ubuntu/models/official"
cd models/official/resnet

# データセットを取得
python cifar10_download_and_extract.py

# 一部書き換え
vim cifar10_main.py

# 実行
python cifar10_main.py --resnet_size 14 --train_epochs 10
```

vimで以下のように書き換えてます。

```
$ git diff
diff --git a/official/resnet/cifar10_main.py b/official/resnet/cifar10_main.py
index 443a251..7c984d8 100644
--- a/official/resnet/cifar10_main.py
+++ b/official/resnet/cifar10_main.py
@@ -222,8 +222,12 @@ def main(argv):
   flags = parser.parse_args(args=argv[1:])

   input_function = flags.use_synthetic_data and get_synth_input_fn() or input_fn
-  resnet_run_loop.resnet_main(flags, cifar10_model_fn, input_function)

+  import timeit
+  loop=5
+  result = timeit.timeit(lambda: resnet_run_loop.resnet_main(flags, cifar10_model_fn, input_function), number=loop)
+  print(result / loop)
```
mac標準のgrepはなぜかエラーが出るので、brew install grepしてみた

grepしたらエラーが出るので、解決策を記します。

#mac標準のgrepだとエラーがでる

mac標準のgrepを使ってみました。

```
$ grep -r "こんにちは"
egrep: warning: recursive search of stdin
```

なんなんやろ、このエラー
調べてもわかりませんでしたが、解決策はわかりました。

#解決策は「brew install grep」
Homebrewからgrepをインストールし、PATHを通したらいけます！

```
$ brew install grep
```

「.bashrc」を開いて下記を追加

```
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
MANPATH="/usr/local/opt/grep/libexec/gnuman:$MANPATH"
```

「.bashrc」を読み込む

```
$ source ~/.bashrc
```

もう一回grepしてみる

```
$ grep -r "こんにちは"
hello/hello.html
```

いけました！
Essential Phone PH-1にAndroid P Betaをインストールする手順

# Android P Beta
Google I/O 2018でAndroid P Betaの公開が発表されました。

# 対応端末
過去の開発者プレビューはNexusとかPixelのみに配布されていましたが、Android Pは、
* Sony Xperia XZ2
* Essential Phone
* Nokia 7 Plus
* Xiaomi Mi Mix 2S
* Oppo R15 Pro
* Vivo X21
* OnePlus 6
にも対応とのことで早速手元にあるEssential Phone PH-1にインストールしました。

https://www.essential.com/developer/developer-preview

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129712/4a48aee1-0442-cc62-28f0-56f745b77e25.png)

# 開発者プレビューに関する注意
* 通常利用には向かない
* 未完成の製品
* カスタマーサポートは無し
* 元に戻すにはフルリセットが必要

などという警告も書いてあります。

# 既知の問題点

Google
https://developer.android.com/preview/release-notes#dp1

Essential
https://www.essential.com/developer/developer-preview-issues

Essential版の日本語訳
* ダイナミックカレンダーは設計通りに動作しない
* 360度カメラアクセサリバージョンとシリアル番号が設定画面に表示されない
* IP経由でのSMS送信が動作しない
* "System > Gestures > Swipe up on home button"は動かない。"Home settings"で設定してください
* Wi−Fi Hotspot動かない
* ビデオコールを受け取ることが出来ない
* 音声再生中にボリュームが落ちることがある
* 暗い壁紙を使用しているとクイック設定の見た目がピンクに見える

# ダウンロード
<img width="792" alt="Screen Shot 0030-05-09 at 12.01.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/129712/941b197c-0877-c6bd-7422-e3b61fe40601.png">

## OTA版
OTAで降ってくるのと同じzipファイルでsideloadでアップデートすることができる
（データのワイプ不要）

## Fastboot版
faskbootでイメージを焼き直してアップデートすることができる
（データのワイプが必要）

# インストール手順

## Fastboot版
Fastboot版はEssentialのサイトに記載されていますが、こちらをインストールすると、Wi−Fiが動作しないのでインストールしないようにしましょう！（これでハマった）

## OTA版
1. PH1-OTA-PPR1.180412.048.zip をダウンロード
2. adbコマンド等のセットアップ https://developer.android.com/studio/releases/platform-tools
3. Essential Phoneの開発者モードをONにする
4. USB debuggingとOEM Unlockingを有効にする
5. パソコンとEssential Phoneを接続
6. "adb reboot recovery" を実行してリカバリモードに入る
7. リカバリ画面で「ボリュームダウン」ボタンを押したまま電源ボタンを押して、ボリュームアップボタンを押す
8. リカバリメニュー画面に移動したらボリュームボタンの上げ下げで「Apply update from ADB」を選択
9. 電源ボタンを押して決定
10. パソコン上から"adb sideload PH1-OTA-PPR1.180412.048.zip"を実行
11. しばらく待ってインストールが完了したら再起動

# Android Pのスクリーン
![Essential Phone PH-1 Android P Beta](https://qiita-image-store.s3.amazonaws.com/0/129712/6b2b770b-4162-0eba-82eb-5de8b1f793d3.gif)
ASP.NET の DropDownList にて optgroup を使う

## はじめに

ページ主体の ASP.NET アプリケーションで動的に DropDownList を作る際に optgroup に対応したいケースがあり、調べたら複数の方法がありましたので参考先を含めて記します。

1. DropDownList の Adapter を作る
1. JavaScript でグループだけ追加する
1. JavaScript で全部作る
1. ASP.NET MVC を使う

## DropDownList の Adapter を作る

正攻法のような気がしますが、DropDownList 一つに対応するには工数が大きい。グループが必要な DropDownList をたくさん持つ Web アプリをこれから作るのでしたらこれを採用するのがよいでしょう。

https://www.codeproject.com/Articles/15505/ASP-NET-DropDownList-with-OptionGroup-support

C# のコードですが、VB にも移植できます。ですが、移植しただけではエラーになりました。RenderListItem() メソッドの最後に以下のコードが必要です。

```vb
Page.ClientScript.RegisterForEventValidation(Me.Control.UniqueID, item.Value)
```

## JavaScript でグループだけ追加する

ListItem の Attributes プロパティに data としてグループを追加して、JavaScript で書き換えるというものです。jQuery を使えば簡単ですし、下記にサンプルがあります。

https://www.aspforums.net/Threads/211463/Group-items-in-DropDownList-in-ASPNet-example/

jQuery に慣れていないと、どのような仕組みになっているか理解するのに頭をひねるかもしれません。またサーバー側のコードでコントロールを初期化して、クライアント側で更に加工しないと初期化が終らない気持ち悪さがあるかもしれません。

こちらもそのまま使ったら動きませんでした。jQuery のバージョンによるのかもしれません。`$(this)[0]` を２箇所 `this` にするなど、いくつか変更して使いました。

## JavaScript で全部作る

JavaScript 側に（クライアント側に）データだけを渡し、クライアント側で DropDownList を作成、サーバー側は Request.Form で受け取るという方法もあります。そうなるともう ASP.NET を使う旨みがあまりありませんね。

## ASP.NET MVC を使う

開発開始時に ASP.NET MVC を採用すれば、最近のバージョンでは対応しているようです（ページ主体の ASP を使うケースのほうがまれなのかもしれません）。

https://qiita.com/rryu/items/0fdfde55a62a44f0add0

## 採用実績

以下の理由から二番目の方法（JavaScript でグループだけ追加する）を採用しました。

- 既にページ主体の ASP で実装を開始している（運用も開始している）
- jQuery を既に導入している
- グループ化したい DropDownList が１つだけ
【Laravel】Eloquentを使って単一項目＆重複は削除して取得


| id | pref | city |
|:-----------|------------:|:------------:|
| 1       |        北海道 |     札幌市     |
| 2       |        北海道 |     函館市     |
| 3       |        北海道 |     小樽市     |
| 4       |        青森県 |     五所川原市     |
| 5       |        青森県 |     平川市     |
| 6       |        岩手県 |     宮古市     |
| 7       |        岩手県 |     一関市     |
| 8       |        岩手県 |     奥州市     |

都道府県だけ欲しい時。

```
PrefCity::groupBy('pref')->get(['pref']);
```

- `groupBy` で重複削除
- `get(['カラム名'])` で単一項目取得

これで取得できる。

```
        {
            "pref": "北海道"
        },
        {
            "pref": "青森県"
        },
        {
            "pref": "岩手県"
        },
```
PHPでAWS SESから(添付ファイル付き)メッセージ送信をしようとしたらハマった

まず、 この記事にめっちゃめちゃお世話になりました。。。。多謝でございます！
https://qiita.com/kitanoow/items/2a81d9c4571656a31a2f

その上で、自分がハマった点をメモ。

### 前提
* CakePHPを利用して、To/BCC指定でファイル添付メールを送りたい
* 「受取人名」「差出人名」を指定したい
* 事情があり、 EmailTransport1は利用しない
* sendRawEmail()を直接的に利用する

### 何にハマったの
* SES APIのパラメータ Destination を指定するだけだとうまく行かなかった
* APIパラメータとしてDestination と Destinations がそれぞれ別に存在し、使い方が違うことに気づいていなかった

### Destination を指定するだけだとうまく行かなかった
RawMessage.Dataに、ヘッダー情報を含める必要がある。

* subject
* to
* cc
* bcc

など。
MIME-Typeなどを指定したのみで2、 宛先情報や差出人情報といった(SDK的には別の箇所からも指定される)内容の記述を忘れており、そのために期待通りの動作をしていなかった。

最終的には、

```php
$content = $headersToString($email->getHeaders()) .
      "\r\n\r\n" .
      $encodedContent .
      "\r\n\r\n\r\n";
$this->client->sendRawEmail([
    'Source' =>  'hogehoge<example@email.com>';
    'RawMessage' => ['Data' => $content]
]);
```

みたいな感じになるイメージ。

DestinationとDestinations
これらは別物。
前者は、Amazon風に言えば "[フォーマット済み](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-formatted.html)の"パラメータ指定方法となるだろうか。後者は「生のアドレスリスト」となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/0a528cd3-2c6a-8c79-3b83-7c4af5606cb5.png)
(https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-email-2010-12-01.html#sendemail)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/f170eb56-a5ac-4ddb-0d9b-84182cdd3a08.png)

(https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-email-2010-12-01.html#sendrawemail)

すなわち、以下のsendの書き方は2つとも同じような働きとなる。

```php
$headers = [
    'To' => ["main-no-atesaki<{$toAddress1}>", "sub-no-atesaki<{$toAddress2}>"],
    'Bcc' => [$bccAddress],
];
// いい感じに $encodedContentを組み立てる

$this->client->sendRawEmail([
    'Source' => $from,
    'Destinations' => [
         $toAddress1,
         $toAddress2,
         $bccAddress,
    ],
    'RawMessage' => ['Data' => $encodedContent]
]);
$this->client->sendRawEmail([
    'Source' => $from,
    'Destination' => [
        'ToAddresses' => [$toAddress1, $toAddress2],
        'BccAddresses' => [$bccAddress],
    ],
    'RawMessage' => ['Data' => $encodedContent]
]);
```

ただ、

```php
'Destinations' => [
        'ToAddresses' => 'email@example.com',
]
```
みたいな書き方も許容らしい。

```php
'Destinations' => [
        'ToAddresses' => ['email@example.com'],
]
```
がだめで、コチラは

>Found 1 error while validating the input provided for the SendRawEmail operation:[Destinations][ToAddresses] must be a string or an object that implements __toString(). Found array(1)


というエラーを吐き出された。
最初にこの書き方をしていてハマってしまい、パラメータ名が(それ自体は適格ということで)違っていることに気づかなかった・・・

みたいな話のメモでした！
Nuxt.jsで src="~assets/hoge.jpg" が変換されなくて困った

変換される :thumbsup_tone5: 

```vue
<img src="~assets/hoge.jpg" />
```

変換されない :thinking: 

```vue
<v-card-media src="~assets/hoge.jpg" />
```


以下を追記して変換されるようにした

```js:nuxt.config.js
build: {
  extend(config, { isDev, isClient }) {   
     const vueLoader = config.module.rules.find((rule) => rule.loader === 'vue-loader')
     vueLoader.options.transformToRequire['v-card-media'] = ['src']
  }
}
```

他になんか方法ないの？
最速のqsort(クイックソート) qs9 と ベンチマークテスト

# より速い qsort( qs9 )
コンパイラ標準qsortより 1.04倍～3倍 高速なクイックソートです。
（64bitモードの極端なケースでは10倍高速）500行を超える大きなプログラムです。

コンパイラ標準qsort と qs9 を比較するベンチマークテストを作りました。
http://ww51.tiki.ne.jp/~srr-cake/qsort/qs9/index.html
に実施要領を記しました。ソースコードなどを含みます。

qs9より速いソート (qsort以外のソートも含む) があれば、
是非参考にして、改良したいと思っております。

ご興味のある方は、ベンチマークテストにご協力頂けないでしょうか

# ベンチマークテストの出力例（一部）
「d=」キーの種類　　「e=」要素数　　「s=」要素の大きさ
「c=」比較関数の呼び出し回数　　「T=」処理時間

----------- benchmark.txt begin ------- Z = 10 ----------- 
qsort d=-3 e=10000 s=8 0 R10000 M  0:  0 c=136796 ～ a=0 0 ～ T=20.32 203
qs9   d=-3 e=10000 s=8 0 R10000 M140:900 c=128188 ～ a=0 0 ～ T=18.72 187
 
qsort d=100 e=10000 s=20 0 R20000 M  0:  0 c=62887 ～ a=0 0 ～ T=36.46 182
qs9   d=100 e=10000 s=20 0 R20000 M140:900 c=60873 ～ a=0 0 ～ T=18.73  94
 
qsort d=2 e=10000 s=1000 10 R4000 M  0:  0 c=15020 ～ a=0 0 ～ T=28.89 722
qs9   d=2 e=10000 s=1000 10 R4000 M140:900 c=15053 ～ a=0 0 ～ T=8.74  218
=================  benchmark.txt end  ====================
新しくセットアップしたUnix環境にどのコマンドがあるかをチェックするスクリプトを書いた。

# 経緯

新しくVPS立てた、中にどんなインタプリタとかコマンドとかあるのか知りたかった。
次回立てたり、再インストール後にきっとまた知りたくなる気がした。
シェルスクリプトにしておいた。

# コード

```bash:checker.sh
#!/bin/bash

CMDS=(python sed awk ruby nkf node perl java javac gcc dot)

for item in ${CMDS[@]}; do
        echo -n "$item > "
        RESULT=`which ${item} 2>/dev/null`
        if [ "$?" != "1" ]; then
                echo -e "\e[33m EXIST \e[m $RESULT"
        else
                echo -e "\e[32m NOT EXIST \e[m"
        fi
done
```

「別にその都度書けばいいじゃない」とは思うのですがね。
CMDSに追加すれば便利かもよ。
Symfony2 でHTTPステータスコードと表示内容をいい感じにしたい

メンテ中とかでメンテ中です画面とか出したいんだけど、メンテ中画面は503がいいらしいんですよね

でも既存の503ページは「一時的に見れません」とか書いてるしメンテ中表示とはちょっと違うし
.htaccessとかいじるのも面倒だし、そもそもSymfony2だからディレクトリ切った下に.htaccess追加すればいいとか言う感じでもないし、どっちにしてもAction内でIPみてこちゃこちゃやる感じだよね云々

```PHP
public function indexAction () { 
  // 503を返すレスポンス
  return new Responce('メンテナンス中でーす', 503);
}
```

これだけでもいいんですけどちょっと商業では現実的じゃないよね

```PHP
public function indexAction () { 

  $frontRendererService = $this->container->get('front_renderer_service');
  $frontRendererService->addExternalTemplateLoader();

  $view = 'maintenance503.twig.html';
  $responce = new Responce('', 503);

  return $this->container->get('templating')->renderResponse($view, [], $response);
}
```

こんなかんじにすると好きなテンプレートで好きなステータスコードを返せる

```php
public function render($view, array $params = array(), Response $response = null)
{
  $frontRendererService = $this->container->get('front_renderer_service');
  $frontRendererService->addExternalTemplateLoader();
  return $this->container->get('templating')->renderResponse($view, $params, $response);
}
```

みたいに関数化しとくと、色々な用途で便利に使える
Nimで言語処理100本ノック 02. 「パトカー」＋「タクシー」＝「パタトクカシーー」

# 問題

[言語処理100本ノック 2015#sec02](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec02)

>「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

# 考え方

2重ループではなくて、両方から1文字ずつ空の変数に注ぐカフェオレのようなイメージ。

```
P = 'パトカー'
T = 'タクシー'

PT = ''

for(i=0; i < max(T.length,P.length); i++) {
  if (i < T.length) {
    PT += T[i]
  }
  if (i < P.length) {
    PT += P[i]
  }
}

echo PT
```

順当に考えるとこんなもの。
でもなんだか交互という感じがしないし、maxで無理やり長い方に合わせているのも気持ち悪い？
最後まで読み込み終わった感が欲しい。
そしてこう、一文字とりだしたらピタっと止まる感覚が欲しくなった。
(普段は十中十割上の方法でやるでしょう)

任意のタイミングで次の一文字を取り出すとなると、前回の状態を記憶しておく必要があるので、ややこしい。

staticならこんな感じ？

```php
function 一文字取り出す($str) {
  static $i = 0
  return $i < strlen($str) ? $str[$i++] : '';
}

一文字取り出す('パトカー');
# タクシーに使えない…
```
[PHPの静的変数 (static変数) の挙動まとめ - Qiita](https://qiita.com/trashtoy/items/f4e2a97765e620bb2828)


jsなら

```js
const fnc = ((str) => {
  let i = 0
  return () => {
    return i < str.length ? str[i++] : ''
  }
})

const T = fnc('タクシー')
T();
```

な感じ？

Nimならどうすっか…
というところで目に入った

[至高の言語、Nimを始めるエンジニアへ - Qiita #FizzBuzzのイミュータブルな解決法は？](https://qiita.com/rigani/items/6e87c7cee6903ed65ed2#fizzbuzz%E3%81%AE%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%81%AA%E8%A7%A3%E6%B1%BA%E6%B3%95%E3%81%AF)

のイテレータ版が、好きなときに一文字とってこれる感が出て良さそうだと思いました。
普段イテレータなんて絶対作らないのでたまには…というのも込めて。

# 解答

```nim2.nim
import unicode

const str1 = "パトカー"
const str2 = "タクシー"

# https://nim-by-example.github.io/for_iterators/
proc makeGetRuneIterator(str: string): iterator(): Rune =
  return iterator(): Rune = 
    for c in toRunes(str) :
      yield c

var newStr: seq[Rune] = @[]

let str1Ite = makeGetRuneIterator(str1)
let str2Ite = makeGetRuneIterator(str2)

while not finished(str1Ite) or not finished(str2Ite):
  if not finished(str1Ite):
    newStr.add(str1Ite())
  if not finished(str2Ite):
    newStr.add(str2Ite())

echo newStr
```

別々の文字列を持った別々のイテレータが欲しいのでClosure Iterators？パターンになりました。
関数？を返す関数？を作ると上級者っぽい気分とコードを複雑にしている気分を味わえます。

イテレータの良いと思ったことは走査終了が`finished`で調べられることですね。わかりやすいです。
ただ`for`などに渡さないのはイテレータとしてすっきりしないかもです。

# 既存解答例について

Pythonではzipを使う方法がよく挙げられているようですが、
あれはなんとなくしっくりこなかったです。

nimにもzipはあるので、似たように書けそうです。
[Module sequtils#zip](https://nim-lang.org/docs/sequtils.html#zip,openArray[S],openArray[T])

ただ、短いほうに合わせるzipのようです。Pythonと同じですね。



# 前回

[Nimで言語処理100本ノック 01. 「パタトクカシーー」 - Qiita](https://qiita.com/khsk/items/599316178c6e2c72b94b)
Sierra MC8355 をWindows10環境で使えるようにする

# Sierra MC8355 をWindows10環境で使えるようにする

Sierra MC8355はWindows8.1までサポートが打ち切られた3G通信カードである。
ドライバーの更新履歴によると、バージョン3.4で一度Windows10のサポートが追加された後、同じバージョンにてWindows10のサポートが削除されている。
ThinkPad X220にSierra MC8355をインストールし、Windows10環境で利用できるようにする。
なおX220はWindows10をサポートしていないため、Windows10をサポートするX230用のドライバを利用する。

## 事前準備

対象のマシンにSierra MC8355をインストールしておく。
Windows10もインストールし、SIMカードも挿入しておく。

## ドライバのインストール

### ドライバをダウンロードする

X220の場合は[Lenovoのサポートサイトのドライバーとソフトウェア](https://pcsupport.lenovo.com/ec/ja/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x230/downloads)からダウンロードする。

ダウンロードするのはネットワーキング：ワイヤレスWANの項目の中にある[Sierra ワイヤレス MC8355 - Gobi 3000 ソフトウェア (Windows 8.1 32bit, 64bit/ 8 32bit, 64bit)](https://download.lenovo.com/ibmdl/pub/pc/pccbbs/mobiles/g7wt12ww.exe)

### ドライバを展開する

インストーラーは2段階で動作する。まずg7wt12ww.exeを実行するとドライバのディレクトリにLenovoGobi3kSetup.exeが展開され、続けてLenovoGobi3kSetup.exeが実行される。

ダウンロードしたg7wt12ww.exeをダブルクリックするとファイルのインストールが行われるので指示に従って進んでいく。
最後にドライバーをインストールするステップに進むか聞かれるので、チェックを外してインストールを終了する。
(もしsetup.exeが起動してしまった場合は終了する。)


### ドライバをインストールする

エクスプローラーで C:\DRIVERS\WIN\WWANSR を開く。

まずConfiguration.iniを編集する。
2行目に DEFAULTIMAGE=302 とあるので、これを DEFAULTIMAGE=6 に書き換えて保存する。
[GOBI 3000ドライバーをインストールするときに既定のキャリアーのファームウェアを設定する方法](https://pcsupport.lenovo.com/it/ja/solutions/ht050584)に記載されている通り、デフォルトのままインストールすると汎用ドライバが組み込まれないためである。

次にLenovoGobi3kSetup.exeを右クリックして 管理者として実行(A) を選択する。

インストールが終わったら再起動する。

### デバイスマネージャー

ドライバのインストールに成功していればデバイスマネージャーは以下のようになる。

- センサー
    - Sierra Wireless Location Sensor
- ネットワークアダプタ
    - Sierra Wireless MC8355 - Gobi 3000(TM) Module
- ポート(COMとLPT)
    - Sierra Wireless MC8355・Gobi(TM) 3000 HS-USB Diagnotics 9013 (COM9)
    - Sierra Wireless MC8355・Gobi(TM) 3000 NMEA 9013 (COM8)
- モデム
    - Sierra Wireless MC8355・Gobi(TM) 3000 HS-USB Diagnotics 9013 #2

## ありがちなエラー

### 接続できない

デフォルトではNTT DoCoMo用のAPNしか設定されていないため、MVNOの場合はAPNを自分で設定しなければならない。

### NTT DOCOMOが見えているが接続できない / 圏外になる

電波を掴むまで少し時間がかかるため、しばらく待ってみる。あるいは本体左の無線ON/OFFスイッチで無線をリセットする。

### 接続が不安定になる

WiMAX/Wi-Fi対応のカードも同時に積んでいる場合は不安になりやすい傾向がある。WiMAX/Wi-Fiをオフにすると若干改善される場合がある。
また原因は不明だがWebブラウザが多数のセッションを張るような環境やサーバー側から何らかのプッシュを受け取るような場合でも接続が不安定になる傾向があるようだ。これについては現状回避策が見つかっていない。
ArcGIS製品のソフトウェア認証を自動化する

# ArcGIS製品のソフトウェア認証を自動化する

## PowerShellでサイレント認証する

C:\Program Files\Common Files\ArcGIS\bin\softwareauthorization.exeをたたけばいい.
事前に認証ファイル(.prvc)を作成しておくこと.

下の例はArcGIS Desktopを認証する場合.

``` powershell:AuthorizeArcGISDesktopStandartSilently.ps1
$softwareAuthorizationExe = 'C:\Program Files\Common Files\ArcGIS\bin\softwareauthorization.exe'
$softwareAuthorizationArg = '-S -LIF E:\Prvc\ArcGISDesktopStandard.prvc'
Start-Process -FilePath $softwareAuthorizationExe -ArgumentList $softwareAuthorizationArg -Verb runas -Wait
```

``` txt:ArcGISDesktopStandard.prvc
// User Information

First Name=Hoge

Last Name=Fuga

Organization=Some Company

Department=System Development

Email=someone@somecompany.co.jp

Address 1=1-1-1 Shinagawa

City=Shinagawa-ku

State/Province=Tokyo

Country=Japan

Zip/Postal Code=111-1111

Phone Number=+81(0)3-1234-5678

// Features and authorization numbers

Desktop Standard=ESU000000000

```

### 参考

http://desktop.arcgis.com/ja/license-manager/10.5/provisioning-files.htm


## 認証が壊れた場合

この前ArcCatalogを開こうとしたら突然ライセンス修復しろって怒られたので対処法をメモ.

1. 「C:\ProgramData」配下にあるフォルダー「FLEXnet」を任意の場所に移す(表示されない場合は隠しフォルダーを表示するように設定すること).
2. 再認証する.

### 参考

https://gis.stackexchange.com/questions/197148/why-does-my-arcgis-license-manager-have-a-repair-option
【Golang】Sleep Sortを実装してみた

# TL;DR
Sleep Sortなるものを（今更）知ったので、Go言語で書いてみました。

### Sleep Sortとは
[画期的（？）なソートアルゴリズム「Sleep Sort」 - 濃縮還元オレンジニュース](http://gihyo.jp/dev/clip/01/orangenews/vol63/0006)
[sleep sort の解説 - Qiita](https://qiita.com/snsk/items/33c01951ef27bbd2b093)

# ソースコード
```sleepsort.go
package main

import(
  "fmt"
  "time"
)

func main() {
  numList := []int{12, 27, 46, 23, 30, 6, 38, 43, 19, 11}
  fmt.Printf("numList:\t%d\n", numList)
  sortedList := make([]int, 0, 10)

  start := make(chan struct{})
  for _, num := range numList {
    go func(n int) {
      <- start
      time.Sleep(time.Duration(n) * time.Millisecond)
      sortedList = append(sortedList, n)
    }(num)
  }

  close(start)
  for {
    if len(numList) == len(sortedList){
      fmt.Printf("sortedList:\t%d\n", sortedList)
      return
    }
  }
}
```

## 実行結果
```
numList:	[12 27 46 23 30 6 38 43 19 11]
sortedList:	[6 11 12 19 23 27 30 38 43 46]
```

#　そもそも
やはりですが、他にも実装している人がいました。
[【ネタ】Go言語 で Sleep Sort - Qiita](https://qiita.com/krmtyshr/items/ebd3572fae705e38e7a6)
[Sleep sort in Go](https://mattn.kaoriya.net/software/lang/go/20110520010425.htm)
調べてから書きましょう（戒め）

# 工夫点
記事にするか迷ったのですが、channelを使用して並行処理を一斉開始するように工夫したので投稿しました。

```sleepsort.go
//channelの作成（種類はどうでもいい）
start := make(chan struct{})
  for _, num := range numList {
    go func(n int) {
      //全ての並行処理の準備が終わり、開始されるのを待つ
      <- start
      time.Sleep(time.Duration(n) * time.Millisecond)
      sortedList = append(sortedList, n)
    }(num)
  }

  //並行処理の開始
  close(start)
```

## つまづきポイント
Gopherには当たり前だとは思いますが、記事の内容そのままハマりました。
[Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと - Qiita](https://qiita.com/sudix/items/67d4cad08fe88dcb9a6d)
今回は関数内の処理が少ないので、「無名関数で引数を宣言し、実行時に値を渡す」方式にしました。

# まとめ
「他の要素と比較しない」のにソートされるというのが新鮮でした。
しかも、発表（？）されたのが2000年後半以降というのがまた。
Visual Studio CodeでTypeScriptデバッグ

**学習用メモ**です。　
#Visual Studio CodeでTypeScriptをデバッグする流れ

```PowerShell:PowerShell
PS C:\Users\Taro\Desktop> mkdir ws


    ディレクトリ: C:\Users\Taro\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/05/09     11:10                ws


PS C:\Users\Taro\Desktop> cd ws
PS C:\Users\Taro\Desktop\ws> tsc --init
message TS6071: Successfully created a tsconfig.json file.
PS C:\Users\Taro\Desktop\ws> code .
```
tsconfig.json で、**"sourceMap": true,** のところコメントアウト

次のファイル作成

```TypeScript:index.ts
console.log("hello TypeScript")
```   
以下、Visual Studio Codeで
1. タスク > 既定のビルドタスクの構成 > tsc:ビルド
2. タスク > ビルド　タスクの実行　
3. デバッグ > デバッグの開始 (F5)
Google I/O'18: Stage 1 - What's new in Firebase

![whatsnew.png](https://qiita-image-store.s3.amazonaws.com/0/18699/3f0c64a1-5f0c-d5fc-2591-49df11012577.png)

# Build Better App
## [Cloud Firestore](https://firebase.google.com/docs/firestore/?hl=ja)
1. 伝統的なDBと違ってClient SDKを通して直接データにアクセスできる
2. リアルタイムなデータ変更をListenできる
3. クエリ結果を自動でキャッシュを作成するので、オフラインでもアプリが動く

## [Cloud Function](https://firebase.google.com/docs/functions/?hl=ja)
HAMILTOMのアプリが興味深と言っていました。
ユーザー数はとても多くとあるイベントの際には、何百万人ものユーザーが同時に接続し、何百万ものリクエストが短期間で実行されたそうです。
その時、Cloud Functionは人間の作業全くなしに自動でスケールしました。
### :sunny:New in Functions
![newfunc.png](https://qiita-image-store.s3.amazonaws.com/0/18699/bfd55f64-55ea-db6b-0c33-b6c70cfbc3ff.png)

・HTTPS Functionを実行するためのクライアントサイドSDKの提供
　　これによってバックエンドとの統合がとても簡単になる
・TypeScriptサポート
・Unit Test

## [Firebase Authentication](https://firebase.google.com/docs/auth/?hl=ja)
<img width="500" alt="スクリーンショット 2018-05-10 12.24.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/18699/1ec00604-bf78-98c2-11da-49736ca628c7.png">

毎日800万人以上の認証が毎日行われています。
### :sunny:New in Authentication
・Phone number sign-in
・Passwordless sign-in
　　ボタン押す→送られるリンクを踏む という手順のようです

## [ML Kit for Firebase](https://firebase.google.com/docs/ml-kit/)
Firebaseで機械学習を使えるようになります。
デバイス、Cloud Functionの双方で利用可能。

<img width="500" alt="スクリーンショット 2018-05-10 12.10.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/18699/629e8df5-3142-52eb-6f5c-232dcbd9426e.png">
以下の5つです。

1. テキスト抽出
2. 顔検知
3. バーコードスキャン
4. 画像ラベリング
5. 建物の検知

例として、[VSCO](https://vsco.co/)アプリが挙げられていました。
VSCOは大量のフィルターを搭載した画像加工アプリです。
VSCOでは、ML Kitを利用して、大量のフィルターの中から画像に適したフィルターを提案します。

また、カスタムしたTensor Flowもアップロード可能

<img width="500" alt="スクリーンショット 2018-05-10 12.23.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/18699/e6550044-349e-f765-c968-73a061cfd513.png">

# その他気になったもの

## PWAとDesktop APP（Native APP）の統合
タイトル通り、PWAとDesktop APPの統合について説明していました。  
デモでは、Chrome Bookを使って
1. SpotifyのPWAへブラウザでアクセス
2. アプリインストールの提案モーダルが出る
3. 一瞬でNative Desktopアプリがインストール
が実現されていました。  
DesktopのNative Desktopアプリのメリットとしては、
・より速いService Worker
・ウィンドウのサイジング
等が挙げられていました。
上述の通り、デモはChrome Bookでしたが、将来WindowsとMacにも対応するようです。

![calltoaction.png](https://qiita-image-store.s3.amazonaws.com/0/18699/cbcef1d8-a6b6-c5b9-75fa-429fd4e3d9a0.png)

#### 英語版: [Google I/O’18: What’s new in Firebase – Taishi Kato – Medium](https://medium.com/@taishi.k/google-i-o18-what-s-new-in-firebase-18b9383d27f2)
tracerouteコマンドでネットワークインターフェイスを指定する方法


macOSでの`traceroute`コマンドでネットワークインターフェイスを指定するには__小文字__の`-s`オプションを使う。

## 利用シーン

例えば、WiFiとLANケーブルの2つにMacBookを繋いでいる場合、ネットワークインターフェイスが2つできる。

## ping -Sの使い方

```bash
traceroute -s [インターフェイスに割り当てられたIPアドレス] [対象ホスト]
```

「インターフェイスに割り当てられたIPアドレス」を調べる方法は、『[Macでネットワークインターフェイスに割り当てられたIPアドレスを調べる方法](https://qiita.com/suin/items/e65e5477a954d7b81e1b)』を参照。

例えば、ネットワークインターフェイスに割り当てられたIPアドレスが`192.168.5.67`で、対象ホストが`1.1.1.1`の場合は次のコマンドを実行する:

```console
$ traceroute -s 192.168.5.67 1.1.1.1
traceroute to 1.1.1.1 (1.1.1.1) from 192.168.5.67, 64 hops max, 52 byte packets
 1  192.168.5.1 (192.168.5.1)  0.493 ms  0.277 ms  0.264 ms
 2  fs76eefb41.tkyc510.ap.nuro.jp (118.238.251.65)  2.246 ms  2.409 ms  2.557 ms
 3  182.171.93.178 (182.171.93.178)  3.881 ms  3.901 ms  3.160 ms
 4  39.110.252.241 (39.110.252.241)  2.485 ms
    39.110.252.73 (39.110.252.73)  2.296 ms
    39.110.252.69 (39.110.252.69)  1.929 ms
 5  202.213.194.15 (202.213.194.15)  2.293 ms
    202.213.194.47 (202.213.194.47)  2.236 ms
    202.213.193.81 (202.213.193.81)  2.227 ms
 6  218.100.6.62 (218.100.6.62)  2.405 ms
    13335.tyo.equinix.com (203.190.230.72)  2.669 ms  14.392 ms
 7  1dot1dot1dot1.cloudflare-dns.com (1.1.1.1)  2.370 ms  2.486 ms  2.285 ms
```
Firebase-CLI ( Realtime Database 操作)　#firebase

## 公式サイト手順

以下を見れば全てできるようになっています。
[Firebase CLI リファレンス  \|  Firebase](https://firebase.google.com/docs/cli/)

ここでは、備忘録としていくつか


## ログインしたFirebaseのプロジェクト一覧を参照する

```shell

 $ firebase list
┌────────────────────┬───────────────────────┬─────────────┐
│ Name               │ Project ID / Instance │ Permissions │
├────────────────────┼───────────────────────┼─────────────┤
│ xxxxxxTrainer      │ xxxxxxtrainer         │ Owner       │
├────────────────────┼───────────────────────┼─────────────┤
│ xxxxFortuneTelling │ xxxxfortunetelling    │ Owner       │
├────────────────────┼───────────────────────┼─────────────┤
│ xxxxxxxxxmodular2  │ xxxxxxxxxmodular2     │ Owner       │
├────────────────────┼───────────────────────┼─────────────┤
```

## Firebaseのどのプロジェクトを使うか

```shell
$ firebase use --add
? Which project do you want to add? xxxxxxxxxmodular2
? What alias do you want to use for this project? (e.g. staging) firefunctions
```

## 利用中のFirebaseプロジェクト

```shell
$ firebase use
Active Project: firefunctions (xxxxxxxxxmodular2)

Project aliases for /Users/bohebohechan/Documents/gitLab/FirstFourNotes/lab/ionic/ionic-firebase:

* firefunctions (xxxxxxxxxmodular2)
```

## Realtime Databseにデータをセットする

jsonで登録データを作成する

```shell

$firebase database:set /users users.json
? You are about to overwrite all data at https://xxxxxxxxxmodular2.firebaseio.com/users. Are you sure? Yes

✔  Data persisted successfully

View data at: https://console.firebase.google.com/project/xxxxxxxxxmodular2/database/data/users
```


で、表示されたURLで見ると。/usersの配下にデータが登録されている


## Realtime Databseにデータを取得する


```shell

 $ firebase database:get /users | jq .
[
  {
    "address": {
      "city": "Gwenborough",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      },
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "zipcode": "92998-3874"
    },
    "company": {
      "bs": "harness real-time e-markets",
      "catchPhrase": "Multi-layered client-server neural-net",
      "name": "Romaguera-Crona"
    },
    "email": "Sincere@april.biz",
    "id": 1,
    "name": "Leanne Graham",
    "phone": "1-770-736-8031 x56442",
    "username": "Bret",
    "website": "hildegard.org"
  }

```

## Realtime Databseからデータ削除


```shell
$ firebase database:remove /users
? You are about to remove all data at https://xxxxxxxxxmodular2.firebaseio.com/users. Are you sure? Yes
✔  Data removed successfully
```



CloudFireStoreについては、deleteコマンドしか用意されていない模様(2018/5/9現在)
Macでネットワークインターフェイスに割り当てられたIPアドレスを調べる方法

MacBookなどでWiFiに接続しつつ、LANケーブルを繋ぎこむとネットワークインターフェイスが複数できる。本稿では、このようなシーンでそれぞれのネットワークインターフェイスに当っているIPアドレスを調べる方法を説明する。

## ネットワークハードウェアのリストを出す

`networksetup`コマンドを使うと、Macのネットワークハードウェアを一覧できる。出力の`Device`の値が`ifconfig`のネットワークインターフェイス名と一致する。

```console
$ networksetup -listallhardwareports

Hardware Port: Thunderbolt Ethernet
Device: en8
Ethernet Address: a8:20:66:24:d4:3f

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: dc:a9:04:78:61:8b

Hardware Port: Bluetooth PAN
Device: en6
Ethernet Address: dc:a9:04:73:dc:65

Hardware Port: Thunderbolt 1
Device: en1
Ethernet Address: aa:00:c9:08:ec:01

Hardware Port: Thunderbolt 2
Device: en2
Ethernet Address: aa:00:c9:08:ec:00

Hardware Port: Thunderbolt 3
Device: en3
Ethernet Address: aa:00:c9:08:ec:05

Hardware Port: Thunderbolt 4
Device: en4
Ethernet Address: aa:00:c9:08:ec:04

Hardware Port: Thunderbolt Bridge
Device: bridge0
Ethernet Address: aa:00:c9:08:ec:01

VLAN Configurations
===================
```

## ネットワークインターフェイスに割り当てられたIPアドレスを調べる

割り当てられたIPを調べるには`ifconfig`コマンドを使う。`networksetup`コマンドで調べたインターフェイス名からIPアドレスを引く。

```console
$ ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether dc:a9:04:78:61:8b
	inet6 fe80::148c:c32:e7bf:9bc%en0 prefixlen 64 secured scopeid 0x8
	inet 172.20.10.4 netmask 0xfffffff0 broadcast 172.20.10.15
	inet6 2001:240:241a:8c30:d2:6945:d5a1:6a33 prefixlen 64 autoconf secured
	inet6 2001:240:241a:8c30:1582:71cf:5eb2:ca6d prefixlen 64 autoconf temporary
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
```

```console
$ ifconfig en8
en8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
	ether a8:20:66:24:d4:3f
	inet6 fe80::863:126f:5921:7e83%en8 prefixlen 64 secured scopeid 0x12
	inet 192.168.5.67 netmask 0xffffff00 broadcast 192.168.5.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect (1000baseT <full-duplex,flow-control,energy-efficient-ethernet>)
	status: active
```
redmine-slack プラグインの設定が404になってしまう

この記事ではUbuntu16.04上で、docker-composeでsameersbn/redmineからredmineイメージを起動しています。

[redmine-slack](https://github.com/sciyoshi/redmine-slack)を[この記事](https://qiita.com/truly109/items/7384bfc16df62050c437)でインストールし、redmineのプラグイン設定画面にて、設定ボタンをクリックしたら404エラーが表示されてしまいます。


# 対策

[ここ](https://qiita.com/truly109/items/7384bfc16df62050c437)を参考に、docker内のredmineプロセスへアクセスします。

redmineのフォルダのpluginsへ移動します。
移動後、redmine-slackフォルダをredmine_slack へ変更します。

```
cd plugins/
mv redmine-slack redmine_slack
```

redmineをrestartすると、redmine-slackの設定画面が開けるようになります。
pingコマンドでネットワークインターフェイスを指定する方法

macOSでの`ping`コマンドでネットワークインターフェイスを指定するには`-S`オプションを使う。

## 利用シーン

例えば、WiFiとLANケーブルの2つにMacBookを繋いでいる場合、ネットワークインターフェイスが2つできる。

## ping -Sの使い方

```bash
ping -S [インターフェイスに割り当てられたIPアドレス] [ICMP送信先のIPアドレス]
```

「インターフェイスに割り当てられたIPアドレス」を調べる方法は、『[Macでネットワークインターフェイスに割り当てられたIPアドレスを調べる方法](https://qiita.com/suin/items/e65e5477a954d7b81e1b)』を参照。

例えば、ネットワークインターフェイスに割り当てられたIPアドレスが`192.168.5.67`で、ICMP送信先が`1.1.1.1`の場合は次のコマンドを実行する:

```shell-session
$ ping -S 192.168.5.67 1.1.1.1
PING 1.1.1.1 (1.1.1.1) from 192.168.5.67: 56 data bytes
64 bytes from 1.1.1.1: icmp_seq=0 ttl=58 time=2.312 ms
64 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=2.444 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=2.267 ms
```