OmniAICreator/Qiita-1.07M huggingface dataset:
Macにphpbrewを入れてphpのバージョン管理

# この記事について
Macにphpの開発環境を整えたい、かつ、phpのバージョン管理もしたいのでphpbrewを入れることにした話。主に作業時のコマンドのメモ。
phpbrew本家→ https://github.com/phpbrew/phpbrew

## 要点
* Homebrew は最新に保とう `brew upgrade` `brew update` 等で

# 手順
## brew install phpbrew で失敗
いきなりインストールコマンドで失敗

```bash
$ brew install phpbrew
```

エラーメッセージは以下

```
Error: /usr/local/Library/Taps/homebrew/homebrew-php/Formula/phpbrew.rb:35: syntax error, unexpected <<
  def caveats; <<~EOS
                 ^
/usr/local/Library/Taps/homebrew/homebrew-php/Formula/phpbrew.rb:38: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('
Please report this bug:
    https://git.io/brew-troubleshooting
/usr/local/Library/Homebrew/formulary.rb:21:in `module_eval'
/usr/local/Library/Homebrew/formulary.rb:21:in `load_formula'
/usr/local/Library/Homebrew/formulary.rb:38:in `load_formula_from_path'
/usr/local/Library/Homebrew/formulary.rb:87:in `load_file'
/usr/local/Library/Homebrew/formulary.rb:78:in `klass'
/usr/local/Library/Homebrew/formulary.rb:74:in `get_formula'
/usr/local/Library/Homebrew/formulary.rb:211:in `factory'
/usr/local/Library/Homebrew/formulary.rb:356:in `find_with_priority'
/usr/local/Library/Homebrew/extend/ARGV.rb:20:in `block in formulae'
/usr/local/Library/Homebrew/extend/ARGV.rb:16:in `map'
/usr/local/Library/Homebrew/extend/ARGV.rb:16:in `formulae'
/usr/local/Library/Homebrew/cmd/install.rb:100:in `install'
/usr/local/Library/brew.rb:87:in `<main>'
```

とりあえずbrewを最新版にするために 

```bash
$ phpbrew upgrade
$ phpbrew update
```

を実行。この過程でエラーが発生したがそれは別記事を書いた→ https://qiita.com/makito/items/4204ef5c4ce8e80ed535
こっちも参考→ [brew updateをしたらError: /usr/local must be writable!が出た](https://qiita.com/hsylife/items/46f11057d060140d9b6c)


その後

```bash
$ brew install phpbrew
```

バージョン確認

```bash
$ phpbrew -version
...
phpbrew 1.22.5		powered by https://github.com/c9s/CLIFramework
```

## 初期設定
本家のREADMEに沿って https://github.com/phpbrew/phpbrew#getting-started 初期設定を実施

```bash
$ phpbrew init
```

インストール可能なバージョンを確認

```bash
$ phpbrew known
7.2: 7.2.2, 7.2.1, 7.2.0 ...
7.1: 7.1.14, 7.1.13, 7.1.12, 7.1.11, 7.1.10, 7.1.9, 7.1.8, 7.1.7 ...
7.0: 7.0.27, 7.0.26, 7.0.25, 7.0.24, 7.0.23, 7.0.22, 7.0.21, 7.0.20 ...
5.6: 5.6.33, 5.6.32, 5.6.31, 5.6.30, 5.6.29, 5.6.28, 5.6.27, 5.6.26 ...
5.5: 5.5.37, 5.5.36, 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31, 5.5.30 ...
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...
```

7.1系を入れたいので 7.1.１４ を入れる

```bash
$ phpbrew install 7.1.14 +default
```

7.1.14 に切り替え

```bash
$ phpbrew use php-7.1.14
$ php -version
PHP 7.1.14 (cli) (built: Feb 24 2018 09:37:29) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```
brew update で update-report should not be called directly! 出て困った

# この記事について
Mac (OS X El Capitan)で `brew update` したら `update-report should not be called directly!` というエラーが出て困ったのでメモ

# 参考にしたものと解決方法
この記事 https://qiita.com/n-satoru/items/6bf7f8b4edb2263fbc92 に書いてある方法で解決。事前に `brew upgrade` するというだけ。

```bash
$ brew upgrade
$ brew update
```

この手順でOK。なお `brew update` 時に内部的にダウンロードに時間がかかっている時、まるで止まっているように見えるのでデバッグと詳細表示オプションを付けて実行した方が良い。

```bash
$ brew update --debug --verbose
```
AWS CLI で JSON を入力に与えてオプションも指定するとオプションが優先される

AWS CLI で JSON を入力に与えてオプションも指定するとオプションが優先されるようです。

# 前提
- aws-cli/1.14.8 Python/2.7.5 Linux/4.9.76-38.79.amzn2.x86_64 botocore/1.8.12


# 実行結果
```
$ cat create-db-instance.json
{
    "DBInstanceIdentifier": "test-aurora",
    "DBInstanceClass": "db.t2.small",
    "Engine": "aurora-mysql",
    "PubliclyAccessible": false,
    "DBClusterIdentifier": "test-aurora-cluster",
    "CopyTagsToSnapshot": true
}

$ aws rds create-db-instance --cli-input-json file://create-db-instance.json --db-instance-identifier override
{
    "DBInstance": {
......
        "DbInstancePort": 0,
        "DBInstanceIdentifier": "override"
    }
```
BitcoinウォレットもどきをScalaで書いてみた

作って学ぶBitcoin！ゼロから作るSPVウォレット
https://qiita.com/lotz/items/1aa6cf18aa193f40c647

のHaskell実装を参考にウォレットもどきをハンドェイクできるところまで作ってみました。
https://github.com/ryogrid/ScalaSPVWarretBTC/blob/41a145401ee1f051f4a82dc3862e15a291df4751/SPVWarretBTC.scala

続きもこれから実装していきます。
[メモ] Win7 - RDP 8.xを有効化

- よく忘れるので、メモ

## 概要
- Win7にて、RDP 8.xを有効化する
- Windows Updateにて機能は入るが、手動で有効化しないといけない(んだとおもう)



## 手順

1. Win+R で、`gpedit.msc [Enter]` (グループポリシー設定)

2. Computer Configuration > Administrative Templetes > Windows Components > Remote Desktop Services へ行く

3. Remote Session Environment > Enable Remote Desktop Protocol 8.0 を　Enabled に
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/0814b536-e79d-dfad-c5b3-c0796bcf07c2.png)

4. Conections > Select RDP transport protocols で、Use both UDP and TCP を選択
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/5302c809-959e-7fc2-536c-d8f59b2823b2.png)

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/3d40b883-5fc0-6cf3-e143-99ccdccf3301.png)
5. 再起動



## その他
- コマンドラインで設定できないだろうか...
VSCodeにgoのselectのスニペット追加

Code → Preferences → User Snippetsでこれを入力すると

```json
{
	"select case statement": {
		"prefix": "sel",
		"body": [
			"select {",
			"case $1:",
			"\t$2",
			"case $3:",
			"\t$4",
			"}"
		],
		"description": "select case statement"
	}
}
```

こんなのがさくっと出てきます。

```golang
select {
case :

case :

}
```

goだとselectはchannel絡みでよく出てきそうだけど、公式に入ってないのが不思議。
Aurora を AWS CLI でスナップショットから復元する

Aurora をスナップショットから CLI で復元します。

# 参考
- [DB スナップショットからの復元 - Amazon Relational Database Service](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html#USER_RestoreFromSnapshot.CLI)
- [restore-db-instance-from-db-snapshot — AWS CLI 1.14.45 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html)
- [restore-db-cluster-from-snapshot — AWS CLI 1.14.45 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-snapshot.html)

# 流れ
1. Aurora クラスターの復元
2. クラスターへのインスタンスの追加

（参考）
aurora のスナップショットはどうやらクラスターのスナップショットとして保存されるようで、restore-db-instance-from-db-snapshot では復元できませんでした。

```
$ aws rds restore-db-instance-from-db-snapshot --cli-input-json file://restore-db-instance-from-db-snapshot.json

An error occurred (DBSnapshotNotFound) when calling the RestoreDBInstanceFromDBSnapshot operation: DBSnapshot not found: test-aurora
```

# 1. restore-db-cluster-from-snapshot
```
$ cat restore-db-cluster-from-snapshot.json
{
    "AvailabilityZones": [
        "ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"
    ],
    "DBClusterIdentifier": "test-aurora-cluster",
    "SnapshotIdentifier": "test-aurora",
    "Engine": "aurora-mysql"
}


$aws rds restore-db-cluster-from-snapshot --cli-input-json file://restore-db-cluster-from-snapshot.json
```


# 2. create-db-instance
```
$ cat create-db-instance.json
{
    "DBInstanceIdentifier": "test-aurora",
    "DBInstanceClass": "db.t2.small",
    "Engine": "aurora-mysql",
    "PubliclyAccessible": false,
    "DBClusterIdentifier": "test-aurora-cluster",
    "CopyTagsToSnapshot": true
}

$ aws rds create-db-instance --cli-input-json file://create-db-instance.json
```
[メモ]Nordic nrf51822: BLE GATT read/writeされてるときにUARTを使いたい

- 忘れるので、メモっておく。

## 概要

SoftDeviceで、BLEで、Read/Writeされたときは、割り込み中なので、UARTの割り込みが動かない。(PRIORITYをHIGHにすると、別のとこがおかしくなった)
ので、UARTはFIFOのやつを使って、UARTの割り込みハンドラのUART0_IRQHandler()を呼び続ける。

BLEでリクエストあったときに、別のデバイスから、UARTで情報取り出して、それを使いたいとか、そういうとき使う。反応がおそいと、BLE接続が切れるので注意する。


## 例

```c
volatile uint8_t bFlagExit;
uint8_t ReceivedCh;
void usr_uart_recv_ch(uint8_t ch)
{
	ReceivedCh = ch;
	bFlagExit = 1; // ループを抜ける
}

void uart_error_handle(app_uart_evt_t * p_event)
{
	switch (p_event->evt_type)
	{
	case APP_UART_COMMUNICATION_ERROR:
		APP_ERROR_HANDLER(p_event->data.error_communication);
		break;
	case APP_UART_FIFO_ERROR:
		APP_ERROR_HANDLER(p_event->data.error_code);
		break;
	case APP_UART_DATA_READY:
	case APP_UART_DATA:
	{
		uint8_t cr;
		if (app_uart_get(&cr) == NRF_SUCCESS)
		{	//読み出しがうまくいったら、ユーザ関数を呼んで、うまく処理する
			usr_uart_recv_ch(cr);
		}
		break;
	}
	case APP_UART_TX_EMPTY:
		break;
	default:
		break;
	}
}

void uart_wait_for_RX_in_interrput()
{
	bFlagExit = 0;
	while (!bFlagExit)
	{
		UART0_IRQHandler(); // こいつをぶん回して、uart受信すると、ル＝プから抜けるハズ
	}
}
```

uart_error_handle()は、uartの初期化の時に登録するコールバック

```
    APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_error_handle,		//<==こいつ
                         APP_IRQ_PRIORITY_LOW,
                         err_code);
```
PythonとYoutube Data API(v3)で再生数を取得する

# 何でこんなくだらないもの書くの？
Youtubeにアップロードされた動画再生数だけ取得したい。
……と、pythonのサンプルをいじってた時に思ったので覚書。

直接Youtubeで見れば良いじゃん！ですが、videoIdだけ取得出来てる状態の時に使えるかもしれない。

引数のidにはカンマ区切りで複数指定できます。
タイトルやチャンネルIDも表示させてますが、件数だけ欲しい人は、
`part="id,snippet,statistics`
を
`part="statistics"`
このようにstatisticsだけ指定してください。

```Python
#!/usr/bin/python

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser

# Set DEVELOPER_KEY to the API key value from the APIs & auth > Registered apps
# tab of
#   https://cloud.google.com/console
# Please ensure that you have enabled the YouTube Data API for your project.
DEVELOPER_KEY = "あなたのAPIキーに変えてください"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

def youtube_saerch_video(options):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    developerKey=DEVELOPER_KEY)

  videos_response = youtube.videos().list(
    part="id,snippet,statistics",
    id=options.id
  ).execute()

  videos = []

  for result in videos_response.get("items", []):
    videos.append("(%s) [%s] <%6s> %s" % (result["id"],
                                          result["snippet"]["channelId"],
                                          result["statistics"]["viewCount"],
                                          result["snippet"]["title"]))
  print("\n".join(videos), "\n")

if __name__ == "__main__":
  argparser.add_argument("--id", help="VideoIDs", default="Sq5QW3YqipM")
  args = argparser.parse_args()

  try:
    youtube_saerch_video(args)
  except HttpError as e:
    print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content))
```
# 終わりに
はい、サンプルコードのまんまです。Syntax Error 出まくりで Qiita の記事には助けられました。リンク面倒なのでいいねだけ押させていただきました。

[【注意！】Qiitaの「いいね」ボタンを押しただけだと記事はストックされませんよ！](https://qiita.com/gimupop/items/be53044143a9a3e90a4b)

・・・。また見るのでストックさせていただきます。
pythonの学習途中に手を付けてしまったので、先輩方の添削をお願いします。
# 参考
[Youtube Data API(v3)サンプル キーワードで検索](https://developers.google.com/youtube/v3/code_samples/python?hl=ja#search_by_keyword)
PHP T_ENCAPSED_AND_WHITESPACE Parse error

## エラーが取れず悩んだ覚書

php のバージョンは7.2.1 です。
ブラウザーはChrome 64 32ビットです。

```test11.php
<?php
if('POST' == $_SERVER['REQUEST_METHOD']){
	print "Hello, ". $_POST['my_name'];
} else {

print <<<__HTML__
<html><body>
<form action="$_SERVER['PHP_SELF']?" method="POST">
your name: <input type="text" name="my_name">
<br>
<input type="submit" value="Say Hello">
</form>

</body></html>
__HTML__;
}
?>
```

このプログラムをブラウザーから実行すると以下のエラーが出ます。

<b>Parse error</b>: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in <b>C:\xampp\htdocs\test11.php</b> on line <b>8</b>

##解決法１
'PHP_SELF'のシングルコーテーションで括るのをやめる。

``` correct.php
<form action="$_SERVER[PHP_SELF]?" method="POST">
```

##解決法２
$_SERVER['PHP_SELF']を{} で括る。

``` correct.php
<form action="{$_SERVER['PHP_SELF']}?" method="POST">
```

どちらでも思った動作となりました。
iOSアップロードエラーについて その3

現在、Monacaで提供している `Cordova 7.1` では、iOSビルドにXcode9が使用されています。
Xcode9でビルドする場合は、アプリ内に `App Sore アイコン` を含める必要があります。

Monacaでは、`iOSアプリ設定` の `App Store用アイコン` から、「App Sore アイコン」を登録することができます。

この 「App Sore アイコン」には、 `透過` や `アルファチャンネル` を含めることはできません。
「App Sore アイコン」に `透過` や `アルファチャンネル` が含まれていると、MonacaのiOSアップロード機能を使用してiTunes Connectへアップロードした際に、下記のエラーが出力されます。

```
ERROR ITMS-90717: "Invalid App Store Icon. The App Store Icon in the asset catalog in 'アプリ名.app' can't be transparent nor contain an alpha channel."
```

このエラーが出力された場合は、「App Sore アイコン」を確認し、画像に `透過` や `アルファチャンネル` が、含まれていないことを確認してください。

基本的に、iTunes Connectへ登録している「App Sore アイコン」と同じものを登録することでエラーは表示されなくなります。


# iTunes Connectへアップロードした際の多いエラー

iTunes Connectへアップロードした際に多いエラーとして、

```text:すでに同じバージョンが登録されている場合
ERROR ITMS-4238: "Redundant Binary Upload. There already exists a binary upload with build version '1.0.1' for train '1.0.1'" at SoftwareAssets/PreReleaseSoftwareAsset
```

```text:AppleIDが2ファクタ認証されている場合:
Error: Unable to validate your application. Please sign in with an app-specific password. You can create one at appleid.apple.com.
```

があります。

`すでに同じバージョンが登録されている場合`は、現在iTunes Connectへ登録されているバージョンより大きい値に設定し、ビルドし直す事で対応できます。

`Apple IDが2ファクタ認証されている場合`は、`App用パスワード`を使用する事で対応できます。
Apple IDの2ファクタ認証対応については、[[Monaca] iOSアップロードエラーについて](https://qiita.com/keeey/items/82d29c8582dc7ae383d0)を参照してください。

# Monacaでの一般的なビルドエラーについて
Monacaでの一般的なビルドエラーについては、[一般的なビルドとアップロードエラー](https://docs.monaca.io/ja/monaca_ide/manual/build/build_error/)で公開されています。

ビルドエラーが発生した場合は、一度確認してみてください。
【Unity2017.3】Rigidbody 2Dのパラメタ一覧

**もっと素敵なわかりやすい記事はこちら**
https://mechalog.com/unity2d-rigidbody



- Body Type
    - Dynamic (動的)
        - Rigidbodyの全てのパラメタが使用可能になる
    - Kinematic (キネマティック)
        - 物理演算の影響をうけず、ユーザが指定したパラメタに厳密に従う（要詳細調査★）
    - Static (静的)
        - 何かに衝突されたときしか動かないようになる
- Material
    - このRigidbody2DにアタッチされたCollider2Dすべてに、同じMaterialを適用する
- Simulated
    - 当たり判定のCollider2D、相互作用のJoint2D（←要詳細調査★）の有効／無効を切り替えられる
- Use Auto Mass
    - アタッチされてるColliderから自動的にゲームオブジェクトの質量を計算する（要詳細調査★）
- Mass
    - Rigidbody2Dの質量（Use Auto Massにチェックされてる場合は無効になる）
- Linear Drag
    - 位置移動の減衰値。
- Angular Drag
    - 回転移動の減衰値。
- Gravity Scale
    - ゲームオブジェクトにかかる重力の度合い。
- Collision Detection
    - Collider 2D 間の衝突を検知する方法を設定します。
        -   Discrete	
            -   Collision Detection を Discrete (不連続) に設定すると、Rigidbody 2D と Collider 2D を持つゲームオブジェクトの動く速度が十分速い場合は、物理計算の更新の間に、ゲームオブジェクトが、互いに重なったり通り抜けたりすることができます。衝突の接触は新しい位置でのみ発生します。
        -   Continuous	
            -   Collision Detection を Continuous (連続) に設定すると、Rigidbody 2D と Collider 2D を持つゲームオブジェクトは、物理計算の更新の間に、互いに重なったり通り抜けたりしません。代わりに、Unity は Collider 2D の最初の衝突位置を計算し、そこにあるゲームオブジェクトを動かします。これは、Discrete よりも CPU で長い時間がかかります。
- Sleeping Mode
    - プロセッサー負荷を抑えるために、オブジェクトがスリープするときのモードを設定します。
        -  Never Sleep	スリープを無効にします。(システムのリソースに大きな負荷を与える場合もあるので、可能な限りこの設定は避けるべきです。)
        -  Start Awake	起動時にオブジェクトを起こす。
        -  Start Asleep	初期状態でオブジェクトはスリープしていますが、衝突によりスリープが解除されます。
- Interpolate
    - 物理計算の更新の合間に、どのようにオブジェクト動作を補間するかを選択します (動きがぎこちないときに役に立ちます)。
    - None	スムージングを適用しません。
    - Interpolate	前フレームでのオブジェクト位置にもとづいて動作をスムージングします。
    - Extrapolate	次フレームでのオブジェクト位置の予測にもとづいて動作をスムージングします。
- Constraints
    - Rigidbody 2D の動きの制限を設定します。
python-speech-featuresとlibrosaの相違点

python-speech-featuresのfbankとlibrosa.feature.melspectrogramの処理の違いを軽くまとめてみる。

## プリエンファシスフィルタの有無
プリエンファシスフィルタは波形の広域成分を強調する効果を有している。python-speech-featuresではプリエンファシスフィルタを入力波形に適用させているのに対し、librosaはプリエンファシスフィルタを適用していない。

## 窓関数・FFTsize
FFTを波形に適用するときに、波形を切り出し、切り出された波形の末端成分を滑らかにするために窓関数をかけるのが一般的である。一般的には、窓関数の幅は、FFTの幅と一致させる。librosaのstft内では、窓関数の幅はデフォルトではFFTsizeと一致し、波形同士で重複する幅は、FFTsize/4のサイズとなる。窓関数の幅をFFTsizeと一致させなかった場合、窓はFFTsizeに合うようにパディングされる(pad_mode='reflect')。対してpython-speech-featuresでは、引数であるwinlen・winstep・サンプリングレートから、窓幅=winlen×samplerate、窓の重複幅=winstep×samplerate、でそれぞれ算出する上、FFTsizeはデフォルトで512となっているため、デフォルトのままだと窓幅とFFTsizeが一致しない。なお、librosaの窓関数はデフォルトではハン窓であるのに対し、python-speech-featuresでは矩形窓である。

## fftに用いているライブラリ
python-speech-features：numpy.fft.rfft
librosa：scipy.fftpack.fft
それぞれデフォルトだと、出力される次元が異なる

## delta特徴量
python-speech-features.base.deltaでは、データの個数が3に対しての移動平均を算出したものであり単純な行列処理である。一方で、librosaでは、librosa.feature.utils.deltaの内部でscipy.signal.savgol_filterが用いられている。Savitzky-Golayフィルタは最小二乗法による多項式近似により信号を平準化し、信号の高周波数成分を維持しつつ平準化したい時に有効なフィルタである。savgol_filter関数は引数として、対象の信号、フィルタ窓の長さ(近似に使うデータ数)、多項式の次数をとるので、フィルタ窓を3、多項式の次数を1とすれば、python-speech-featuresでのdelta特徴量と同じ結果が返ってくる。
[AWS] DynamoDB でネストしたレコードの扱いかた。

今回は、DynamoDBのリスト型、マップ型を使う際にこうしたほうがいいんじゃないか？ というお話です。
Webでも情報が少ないので、書くことにしました。

使用するのは、
[AWS-SDK for javascript](https://aws.amazon.com/jp/sdk-for-node-js/) です。

# 結論
ネストは１階層まで。
子要素はすべて、stringifyしたJSONにする。

例

```
{
  element: { S: 'element'},
  children: { L: [
    '{"c1e1": 'c1e1', "c1e2": "c1e2"}', <-- JSON.stringifyしたオブジェクト。
    '{"c2e2": 'c2e2', "c2e2": "c2e2"}'
  ] }
}

```

# 理由
ネストしたDynamoDBオブジェクトは、getするとこうなる。(scan, queryでも同じ）

ネストしたリソースをレコードに入れると、以下のようになります。
DynamoDB の式にしたがうなら、

[UpdateExpression のlist_appendなど](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html) を使うことになるでしょう。

dynamoDBに、以下のオブジェクトをPutしたとします。

```
{
  element: { S: 'element'},
  children: { L: [
    {M:{c1e1: {S: 'c1e1'}, c1e2: {S: 'c1e2'}}},
    {M:{c2e2: {S: 'c2e2'}, c2e2: {S: 'c2e2'}}}
  ] }
}
```

レコードは以下のようになります。
element -> 'element'
children -> { L: [{M:{c1e1: {S: 'c1e1'}, c1e2: {S: 'c1e2'}}}, {M:{c2e2: {S: 'c2e2'}, c2e2: {S: 'c2e2'}}}] }

これをgetで取り出すと以下のように取れます。
```
{
  element: { S: 'element'},
  children: { L: [
    'Object'
    'Object'
  ] }
}
```
Objectとして出力されてしまうので、アクセスできません。これを回避するために、ネストしている子オブジェクトはstringifyしましょう。

# 補足
DynamoDBを操作する際には、どうしても型情報が付いて回ります。つねに、
```
{S: 'XXXX'} や、{N: 123} 
```
などと型を指定しなければならず、記載が煩雑になりがちです。

この型指定をうまいことラップしてくれている
[DocumentClient](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html)
というものがありますが、ネストしたリソースに関しては同じ問題が付いて回ります。
【小ネタ】Google Mapアプリの"経路オプション"隠れパラメータ

# はじめに

Google MapアプリはAndroidアプリであればIntentで、iOSであればURLスキームで呼び出すことが出来ます。
ドキュメントは以下となります。

https://developers.google.com/maps/documentation/android-api/intents?hl=ja
https://developers.google.com/maps/documentation/ios-sdk/urlscheme?hl=ja

# 経路オプションは設定できない?

上記のドキュメントでは経路オプションについて書かれていません。
書かれているのはAndroidナビゲーションモードの`avoid`のみです。

> ターンバイターンのナビゲーション
> :
> avoid は、ルートで避けるべき地物を設定します。 avoid は省略可能で、次のうち 1 つ以上を設定できます。
> t: 有料道路
> h: 高速道路
> f: フェリー

が！

実はAndroid/iOSの経路マップにおいて、
`dirflg`というパラメータ名で使用することが出来るようです。
複数選択する場合は`dirflg=fht`など続けて書きます。

注意として、Androidはさらに以下d,w,bのいずれかを`dirflg`に加えないと動作しません。

> mode は、移動手段を設定します。 mode は省略可能で、デフォルト値は車です。次のいずれかの値に設定できます。
> d は車
> w は徒歩
> b は自転車

例として、Androidで車の移動手段で有料道路を使用しない設定は`dirflg=dt`です。

# サンプルコード

Android

```Activity.java
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
String url = "https://www.google.co.jp/maps?saddr=東京都&daddr=茨城県&dirflg=dfht";
i.setData(Uri.parse(url));
startActivity(i);
```

```Activity.kt
val i = Intent()
i.action = Intent.ACTION_VIEW
i.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity")
val url = "https://www.google.co.jp/maps?saddr=東京都&daddr=茨城県&dirflg=dfht"
i.data = Uri.parse(url)
startActivity(i)
```
<img width="240" src="https://qiita-image-store.s3.amazonaws.com/0/19692/d818dfe8-9d4d-1913-aff6-ba47fd06be1f.png" />

iOS

```URLScheme
comgooglemaps://?saddr=東京都&daddr=茨城県&dirflg=fht
```
<img width="240" src="https://qiita-image-store.s3.amazonaws.com/0/19692/6d4fb76d-ad1c-4aa0-6b45-ef3285d979c9.png" />

# まとめ

謎の機能ですがインターネットを漁ったら出てきました。
ドキュメントになく、正式にはサポートしていない機能だと思うので、
実装する場合は自己責任で。。

参考
https://stackoverflow.com/questions/1056984/open-google-maps-to-bus-directions
Redmineにアバターを表示する(view customizeで無理矢理)

[Gravatar](https://ja.gravatar.com/)とか[Redmine Local Avatars](https://github.com/ncoders/redmine_local_avatars)を使え、で済む話。
普通はそうなのだが、GravatarはWordPressのアカウントないと駄目だし、Redmine Local Avatarsは他の優先度が高いプラグインと競合でもしたのか入れたらログインすらできなくなってしまったりしたので、自分でなんとかしてみた。

## 環境

- Redmine
  - [view customize](https://github.com/onozaty/redmine-view-customize)
- Jenkins

二つは同じサーバに既に入っているもの(view customizeも)とする。

## やったこと

### サーバ

アバター用画像ファイルを置いておくディレクトリを、Redmineのインストールディレクトリ配下に作る。ここでは`/var/lib/redmine/public/avatar`としておく。

```shell
mkdir -p /var/lib/redmine/public/avatar
```

### Jenkins

- ICONFILE: アバターアイコンにしたい画像ファイル
- REDMINEUSERNAME: アバターを指定したいアカウント名
- DBUSERNAME: Redmine用DBに接続するアカウント名
- DBPASSWORD: Redmine用DBに接続するパスワード([Mask Passwords](https://github.com/jenkinsci/mask-passwords-plugin)で設定する)

```shell
## Redmineのアカウント名に対応する番号を取得、できなかったらエラー終了
USERID=$(MYSQL_PWD="${DBPASSWORD}" mysql <DB名> -u ${DBUSERNAME} -N -B -e "select id,login from users where login=\"${REDMINEUSERNAME}\"" | awk '{ print $1 }')
test -z "${USERID}" && exit 1

## 配置するファイル名を定義
AVATARFILE="/var/lib/redmine/public/avatar/${USERID}.png"

## アップロードしたファイルをリサイズしてpngに変換、ファイルがなかったらエラー終了
sudo convert -resize 256x ICONFILE ${AVATARFILE}
test -f "${AVATARFILE}" || exit 2

## 正常終了
exit 0
```
### Redmine(view customize)

#### アバター表示

アカウント名の左にアバターアイコンが出るようにしたかったので、そうなるような処理を追加。

- Path pattern: /issues
- Type: JavaScript

```javascript
$(function(){
  // ユーザー名の前にアバターのimg要素を追加する
  $("#main a.user.active").each(function(i, elem) {
    var userid = $(elem).attr("href").split('/').pop();
    var avatar = '<img src="/redmine/avatar/' + userid + '.png" alt="avatar" class="user' + userid + ' avatar" />';
    $(elem).before(avatar);
  });

  // 画像ファイルが用意されていないアカウントはimg要素を追加しない
  $('img.avatar').error(function() {
    $(this).remove();
  });
});
```

#### アバターのサイズ指定と丸アイコン化

少し大きいサイズの画像を置いて、それを画像を縮小させた方があとから表示箇所によって微妙にサイズ変えたりするのが楽そうなので、CSSでサイズ指定。あと丸く加工するのはめんどくさそうなのでそれもCSSに任せた。
ついでに画像に対してテキストの縦位置がセンタリングされてる方が見栄えしそうなのでそれも。

- Path pattern: /issues
- Type: StyleSheet

```CSS
img.avatar {
  height: 48px;
  width: 48px;
  border-radius: 24px;
  -webkit-border-radius: 24px;
  -moz-border-radius: 24px;
}

* {
  vertical-align: middle;
}
```

## 終わりに

Jenkinsなくてもどうにかなりそうな気がするけど、他の仕事の合間にやったのでできそうな手段でやれりゃいいやと投げた結果。
jQueryは初めて調べてみたけど色々できそうで楽しそう。普段はシェルスクリプトとPowerShellしか書かないインフラ屋だから、触ることまったくなさそうだけど。
LDAP認証サーバで，あるグループのメンバの認証を制限する．

# 概要
利用者をグループごとに管理していると，「このグループのメンバにはこのサーバにsshログインでいないようにしたい」ということがあると思います．僕の研究室では「サーバ管理者」「研究室内の一般ユーザメンバ」「卒業生」というグループ分けでアカウントを管理していて，新たに卒業される先輩は「卒業生」グループに配属しなおし，このグループのメンバーははサーバにログインできないようにしたい，というようなことがあります．

これを実現するためには次の三つのステップを踏みます．
1. （必要であれば）ログインを制限したいメンバーのグループを作成する．
2. メンバーのグループを変更する．
3. サーバのssh設定で特定のグループをログイン禁止にする．


# 手順１：ログインを制限したいメンバーのグループを作成する．
例として，'graduated'グループを作成して，このグループのログインを禁止するとします．まずグループを作成するldapのスクリプトを作成し，次にldapaddコマンドでこのスクリプトを実行します．

``` add_group.ldif
dn: cn=graduated,ou=groups,dc=XXX-lab
gidNumber: 503
cn: graduated
objectClass: posixGroup
objectClass: top
```
`ldapadd -x -D cn=admin,dc=XXX-lab -f add_group.ldif`

# 手順２：メンバーのグループを変更する．
手順１と同様に，グループを変更するldapのスクリプトを作成し，ldapmodifyコマンドでこのスクリプトを実行します．その後，認証に関わるサービスであるnscdをリスタートしておきます．

``` modify_user_group.ldif
dn: uid=user0001,ou=users,dc=XXX-lab
changetype: modify
replace: gidNumber
gidNumber: 503
```
`ldapmodify -D cn=admin,dc=XXX-lab -f modify_user_group.ldif; sudo service nscd restart`

# 手順３：サーバのssh設定を変更する
最後に，クラスタを構成する全サーバの/etc/ssh/sshd_configを書き換えます．

``` /etc/ssh/sshd_config
# 最終行に追加
DenyGroups graduated
```

実はこの手順３，/etc/ldap.confを次のように設定するように紹介されることがあるのですが，sshの鍵認証を~/.ssh/authorized_keysファイルで管理していると，なぜか鍵認証ではログインが通っちゃうので，僕はsshの設定を変更しました．

ダメだったパターン↓

``` /etc/ldap.conf
# gidNumber=501と502はログイン許可したい．
pam_filter &(objectClass=posixaccount)(|(gidNumber=5001)(gidNumber=502))
```
IMEの状態をゲット出来るようになるまでのノンプログラマー的冒険(AutoHotkey)

#IMEの状態をゲット出来るようになるまでのノンプログラマー的冒険
neokix

#そもそものスタンス
私はノンプログラマーなのであまりよくわからないのですが（なぜここにいる），IMEの設定をAutoHotkeyから行うには，IME.ahkというライブラリを使うように勧められることが多いようです．

karakaram/alt-ime-ahk : https://github.com/karakaram/alt-ime-ahk

ですが，ライブラリは便利な一方，どう動いているかが分かりにくい．
ということで，あんまり使いたくない．
まぁそんなことを言い出したら，AutoHotkeyでさえライブラリ的ではないかという議論はさておき．

#試したこと1
最初に試したことは，PixelGetColorでIME部分の[あ]→[A]の色の違う部分を得ようという極めてジャンキーな方法です．
これ，うまくいきません．ご注意を．
ただし，他のプログラムではジャンキーな方法としてはいいと思います．Adobe Premier Proでそのような方法をしているかたを知っています．

#試したこと2
IME.ahkを分解してみる．
しかし，うまくいきませんでした．
どこが何を指しているのか，どう動いているのか，さっぱりなのです．
ここでノンプログラマーである私は独学ゆえの浅学を思い知ることになります．

#試したこと3
平昌オリンピック　カーリング　女子日韓戦をエンド1から11までしっかり見て，勇気をもらう．

#試したこと4→とりあえずの解決策
ググる．
すると，こちらに行きつきました．

(AutoHotkey)(IMEの制御をする 編) - もらかなです。 : http://d.hatena.ne.jp/morakana/20080213/1202876561

少し詳し目に説明されています．ラッキー!

ということで，以下のように抽出できました．

```
F1::
   WinGet, vcurrentwindow, ID, A
   vimestate := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint", vcurrentwindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
   Msgbox, %vimestate% `n 0はOFF `n 1はON
return
```

詳しくはよくわからないのですが（詳しい方解説おねがいします），ひとつめのDllCallでIMEからどの部分を抜き出すかを指定し，中にさらに入っているDllCallでIMEの状態をvcurrentwindowという変数に入れているようです．

IMEの現在の状態が分かればこっちのものです．ノンプログラマーの方法でLabelをつけていきます．
そもそもの発端はvkf3/vkf4がトグるところなんですよね···．
なんとかならないかなー．

```
F1::
imeon:
	Gosub, IMEGetstate
	If (vimestate=1) ;imeがonなら
	{
	;ONだからなにもしない
	}
	else
	{
	Send, {vkf3} ;全角/半角ボタン
	}
	return

F2::
imeoff:
	Gosub, IMEGetstate
	If (vimestate=0) ;imeがoffなら
	{
	;Offだから何もしない
	}
	else
	{
	Send, {vkf3}
	}
	return

IMEGetstate:
	DetectHiddenWindows, ON
	WinGet, vcurrentwindow, ID, A
	vgetdefault := DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint", vcurrentwindow)
	vimestate := DllCall("user32.dll\SendMessageA", "UInt", vgetdefault, "UInt", 0x0283, "Int", 0x0005, "Int", 0)
	DetectHiddenWindows, Off
	return
```


···スパゲッティーコード?すみません．
ホームポジションに引きこもりたい方は，F1/F2を変換/無変換などに割り当てるのもよいでしょうね．

これでライブラリを使わずにコードを組み込めますね．あとはGosubを使ってコードに組み込んでいけばいいわけです．
そう，あなたがノンプログラマーならね···．プログラマーの人はちゃんとセットの方も出来そうでうらやましいです．

では!
【超初心者】Kerasをとりあえず動かす

CentOSで普段プログラミングしているが、今回はwindows

 ただ、内容は一緒なのでOSには依存しないと思う。

まずはライブラリのインポート

```python:import
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation
```

```python:オブジェクトの作成
model = Sequential()
```

作成したオブジェクトに.addでネットワークを追加していく

```python:add一回目
model.add(Dense(4, input_dim = 3))
```

この段階では以下のようなネットワークとなる。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/146328/8274732f-7bd5-854f-d53e-0942a62227b4.png)


そして、活性化関数を追加する。今回はsigmoid

```math
\frac{1}{1+e^{-x}}
```

とすると

```python:活性化関数
model.add(Activation('sigmoid'))
```
すると以下のようなネットワークになる

![2.png](https://qiita-image-store.s3.amazonaws.com/0/146328/7e83d174-66da-f22a-4cee-26b996b5bebe.png)

更に出力を3つにする

```python:
model.add(Dense(3))
```

そうすると、以下のようになる

![3.png](https://qiita-image-store.s3.amazonaws.com/0/146328/b1953d65-9ae9-3010-008c-8f164cf18f6f.png)


最後にsoftmax関数で正規化する

```math
\frac{e^{x_i}}{\sum x_i}
```

```python:softmax
model.add(Activation('softmax'))
```


そうすると、以下のようになる


![4.png](https://qiita-image-store.s3.amazonaws.com/0/146328/07a5aeb0-46fd-417f-baba-3c0c2d06e5cc.png)

ここで、以下を実行するとネットワークのサマリーが出ます

```python:サマリー
model.summary()
```

作成したネットワークをコンパイルします。

```python:softmax
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy')
```

これでネットワークの構築ができました。

そして、入力データと教師データをnumpyの配列で適当に作成する

```python:データの生成
import numpy as np

#入力データ
x = np.array([
              [0,1,1],
              [0,0,1]
             ])

#教師データ
y = np.array([
              [1,0,0],
              [0,1,0]
             ])
```

学習させる

```python:学習
model.fit(x,y,epochs=1500)
```
これは[0,1,1]を入力すると[1,0,0]を出力するように、
[0,0,1]を入力すると[0,1,0]を出力するように
ネットワークの重みを計算してくれます。


つまり絵で書くと

![5.png](https://qiita-image-store.s3.amazonaws.com/0/146328/0ac109cf-cac2-eba1-a611-05c6ef73485b.png)

epochsは学習回数みたいなものです。多すぎても少なすぎても良くないです。

実際にテストしてみます

```python:テスト
print(model.predict(np.array([[0,1,1]])))#試しに[0,1,1]を入力する
print(model.predict(np.array([[0,0,1]])))#試しに[0,0,1]を入力する
```
```python:テスト結果
[[ 0.82834005  0.16713376  0.00452619]]
[[ 0.20225681  0.77913678  0.01860645]]
```
んーあんまりよくないですね、、、
つまり、事前に学習したネットワークに値を入れたら
[0,1,1]→[ 0.8, 0.2, 0.0]≒[1,0,0]#教師データと一致？
[0,0,1]→[ 0.2, 0.8, 0.0]≒[0,1,0]#教師データと一致？
となりました。
【初心者向け】Gitはまず用語とコマンドを覚えよう

Gitをはじめたばかりの頃は、Gitの用語やコマンドでよく混乱していました。
そんな経験を元に、Git初心者の方に向けてまず覚えておきたい用語とコマンド一覧を作りました。
とっつきやすく&わかりやすいようにシンプルな意味で解説しています。
（より深く詳しく知りたい方はGitの書籍等を参考にされるのが良いかと思います:bow_tone1:）

## 用語
<img width="594" alt="スクリーンショット 2018-02-23 17.14.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/e68fa9c9-c4a6-bb54-d882-11951dfcbc07.png">

 `Git`：バージョン管理システム。後述するGitHubの省略名ではない。
 `リポジトリ`：Gitにかかせない歴史を保存する入れ物。
<br>
<hr>
<img width="749" alt="スクリーンショット 2018-02-23 17.11.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/0dcaa04d-0b97-4466-5fe8-77c99c578e3e.png">

 `コミット`：歴史の一部（あの瞬間の状態）、セーブポイント。
 `アド`：変更内容をインデックス（ステージ）に移すこと。commitをする前にします。
 `インデックス`：commitする前に一時保存する箱のようなところ。ステージと呼ばれたり。

<hr>

<img width="829" alt="スクリーンショット 2018-02-23 17.18.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/510d1360-19b9-43b8-bfc7-7af368de3c67.png">

 `GitHub`：Gitをネット上で管理するサービスの名称。 GitHubには世界中の人々のリポジトリがある。
 `リモート`：ネット上の世界。
 `ローカル`：自分の手元のパソコンの世界。


<hr>
<img width="639" alt="スクリーンショット 2018-02-23 18.33.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/16e2e1e2-d4d7-bf22-8da6-d88d2d68be99.png">


 `プッシュ`：ローカルからリモートのリポジトリへcommitを送ること
 `プル`：リモートからローカルのリポジトリへcommitをもらうこと

<hr>

<img width="723" alt="スクリーンショット 2018-02-23 17.27.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/0e0012dc-e3f6-fcd7-3478-746d1f6c917a.png">

 `フォーク`：GitHub上で人のリポジトリを自分のリポジトリとしてコピーすること
 `クローン`：GitHub上のリポジトリをローカルにコピーすること（人のリポジトリでも、自分のでも）

## コマンド

### 変更内容をインデックスに移動させる「add」
```console
$ git add ファイルパス
```
ファイル名ではなく、 `.`をつけると全ての変更ファイルをaddできる

```console
$ git add .
```

### 変更内容とインデックスの中を確認する

```console
$ git status
```

### commitする
コメントは後で見た時に困らないよう変更内容が簡潔にわかるとGood

```console
$ git commit -m "コメント"
```

### commitのログを見る（qで終了できます）

```console
$ git log
```
commitのログをショート版で見る

```console
$ git log --oneline
```

### リモートリポジトリを登録する

```console
$ git remote add リポジトリ名前 リポジトリのURL
```

登録しているリモートを確認する

```console
$ git remote -v
```

### リモートリポジトリにコミットを送る「push」

```console
$ git push リポジトリ名 master
```

### リモートリポジトリのコミットを受け取る「pull」

```console
$ git pull リポジトリ名 master
```

## 参考
サルでもわかるGit入門
https://backlog.com/ja/git-tutorial/
【初心者向け】ターミナルのコマンド

黒い画面ってコマンドをうっても、最初は何が起こっているのかわからなくて難しいですよね。
初心者の方向けに基礎コマンドまとめておきました。まずはこれさえ覚えれば概ねはなんとかなるはず。
順に色々覚えていくのが吉です。

### フォルダを移動する
```console
$ cd ファイルパス
```
ファイルパスの入力はは大変なので、macの方は ターミナルに直接finderから**ファイルをドラッグ&ドロップ** しましょう！

### 現在地確認

```console
$ pwd
```

### 中に入っているファイルを見る

```console
$ ls
```

-alをつけると隠しファイルも見れます
```console
$ ls -al
```

### フォルダを作る

```console
$ mkdir フォルダ名
```


### ファイルを作る

```console
$ touch index.html
```
index.htmlのところは作りたいファイル名と拡張子を任意で入れて下さい。
GraphQL-クエリの型定義

##クエリの型定義
GraphQLにおけるクエリの型定義の書き方をご紹介します。

まず、GraphQLで使用できる型は以下になります

- Schema
    - GraphQLSchema
- Definitions
    - GraphQLScalarType
    - GraphQLObjectType
    - GraphQLInterfaceType
    - GraphQLUnionType
    - GraphQLEnumType
    - GraphQLInputObjectType
    - GraphQLList
    - GraphQLNonNull
- Scalars
    - GraphQLInt
    - GraphQLFloat
    - GraphQLString
    - GraphQLBoolean
    - GraphQLID

次に使い方を書いていきます。
例えば取得するデータが

```
{
  "name": "sample name"
}
```
のような形の場合、次のように書けます。

```NameType.js
import {
  GraphQLObjectType,
  GraphQLString,
} from 'graphql';

const NameType = new GraphQLObjectType({
  name: 'Name',
  fields: {
    name: { type: GraphQLString },
  },
});

export default NameType;
```

また、GraphQLString as StringTypeのように、asで繋ぐことで型を任意の名称に出来ます。

```NameType.js
import {
  GraphQLObjectType as ObjectType,
  GraphQLString as StringType,
} from 'graphql';

const NameType = new ObjectType({
  name: 'Name',
  fields: {
    name: { type: StringType },
  },
});

export default NameType;
```
取得するデータが、

```
{
  "items": [
    {
      "name": "sample name",
      "age": 20
    },
    {
      "name": "sample name2",
      "age": 30
    }
  ]
}
```
のようにネスト構造の場合は、GraphQLListを用いて書くことができます。

```NameListType.js
import {
  GraphQLObjectType as ObjectType,
  GraphQLString as StringType,
  GraphQLInt as IntType,
  GraphQLList as ListType,
} from 'graphql';

const NameType = new ObjectType({
  name: 'NameType',
  fields: {
    name: { type: StringType },
    age: { type: IntType },
  },
});

const NameListType = new ObjectType({
  name: 'NameListType',
  fields: {
    items: {
      type: new ListType(NameType),
      resolve(list) {
        return list.items;
      },
    },
  },
});

export default NameListType;
```


##参考
[React Starter Kit](https://github.com/kriasoft/react-starter-kit)
[graphql/type | API Reference](http://graphql.org/graphql-js/type/)
UnityのDebug.Logの上手な使い方

#UnityプログラミングではDebug.Logを上手に使おう
プログラムが今、どんな値、どんな状態で実行されているのかリアルタイムで確認するのは開発時間の大幅な短縮になります。その日の飲み会に参加できるかできないかここで決まってくるかも知れません。
チーム製作では出しすぎて人の迷惑にならないようにしないといけませんが、バンバン活用しましょう。

#基本的な使い方
##文字列をそのまま出す

```c#
Debug.Log("(・∀・)ｲｲ!!");
```
![スクリーンショット 2018-02-24 0.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/240336/88b7fe66-e01c-fb71-4105-3661a1aa8850.png)


##文字列と変数を組み合わせて出す

```c#
string message = "(・∀・)ｲｲ!!";
Debug.Log("message = " + message);
```

![スクリーンショット 2018-02-24 0.06.59.png](https://qiita-image-store.s3.amazonaws.com/0/240336/dddba892-c5dc-281e-6fd7-69d19c4cd649.png)

intなどの変数も可。

##文字列に色をつけて出す
```c#
Debug.Log("<color=red>(・∀・)ｲｲ!!</color>");
```
![スクリーンショット 2018-02-24 0.08.46.png](https://qiita-image-store.s3.amazonaws.com/0/240336/84241db5-295b-5865-60b1-dcc9c67735dd.png)


##警告やエラーとして出す
```c#
Debug.LogWarning("(・∀・)ｲｲ!!");
```
![スクリーンショット 2018-02-24 0.09.51.png](https://qiita-image-store.s3.amazonaws.com/0/240336/efe71281-d873-8a0a-c3da-75b1ca635a4f.png)


```c#
Debug.LogError("(・A・)ｲｸﾅｲ!!");
```
![スクリーンショット 2018-02-24 0.11.33.png](https://qiita-image-store.s3.amazonaws.com/0/240336/63ae40b7-41ab-1cbc-9928-3bde2d9af2db.png)

LogErrorはエラー扱いなので、ログウィンドウのErrorPauseをONにしてPauseさせることもできる。
Cloud Functionsで環境変数を設定する方法


Google Cloud Functionsで環境変数を設定する方法です．
herokuでいう`heroku config:set`を実現したかったのでやってみました．

## 環境変数になるRuntime Configの設定

Cloud Functionsと同じくまだベータ版ですが，[Runtime Config](https://cloud.google.com/deployment-manager/runtime-configurator/)というものを使うことで実行時の変数をセットできます．

### コンフィグ(config)と変数(variable)

Runtime Configでは，変数をまとめるコンフィグという概念があります（グループのようなもの．）
例えば，`service-a`と`service-b`というコンフィグにそれぞれ`TOKEN`と`HOST`いう変数を持たせる場合，次のように構成したりできます．

```
service-a (config)
  |- TOKEN=abc123 (variable)
  `- HOST=host-a (variable)
service-b (config)
  |- TOKEN=xyz987 (variable)
  `- HOST=host-b (variable)
```

とりあえず今回はコンフィグも変数も１つでやってみます．

### 値の設定

`heroku`という名前のコンフィグを新しく作るには次のようなコマンドを使います．

```bash:
$ gcloud beta runtime-config configs create heroku
```

`heroku`コンフィグに`TOKEN`という名前の変数を`abc123`という値で作るには次のようなコマンドを使います．

```bash:
$ gcloud beta runtime-config configs variables set TOKEN abc123 --config-name heroku --is-text
```

## Cloud Functionsから環境変数として読み出す

Node.jsで作ったファンクションからこの値を読み出すには次のようにします．

### ライブラリ

[@google-cloud/rcloadenv](https://www.npmjs.com/package/@google-cloud/rcloadenv)を使います．
次のようにインストールしておきます．

```bash:
$ npm i --save @google-cloud/rcloadenv
```

### 環境変数の読み出し

試しに次のようなhttpトリガーのCloud Functionsを作りました．
Runtime Configから先程設定した変数を取得し，httpレスポンスとして返しています．

```js:index.js
const rcloadenv = require('@google-cloud/rcloadenv');

exports.getToken = (req, res) => {
  rcloadenv.getAndApply('heroku', {})
    .then((env) => {
      console.log('TOKEN', env.TOKEN);
      res.send(`TOKEN=${env.TOKEN}`);
    })
    .catch((err) => {
      console.error('ERROR:', err);
    });
};
```

これをデプロイし，httpアクセスしてみます．

```bash:
$ gcloud beta functions deploy getToken --trigger-http
$ curl https://[YOUR_REGION_AND_PROJECT].cloudfunctions.net/getToken
TOKEN=abc123
```

変数値を変更してアクセスすると値が変わっていることが確認できます．

```bash:
$ gcloud beta runtime-config configs variables set TOKEN xyz987 --config-name heroku --is-text
$ curl https://[YOUR_REGION_AND_PROJECT].cloudfunctions.net/getToken
TOKEN=xyz987
```

### 注意

[npmのページ](https://www.npmjs.com/package/@google-cloud/rcloadenv)のサンプルのように`rcloadenv.getAndApply('heroku')`としてしまうと，（[ソース](https://github.com/GoogleCloudPlatform/rcloadenv/blob/d27014cbcb4054b63a4ccfdfed3c08a5454b1f27/nodejs/src/index.js#L158)を見たところ`getAndApply`の第2引数はデフォルトで`process.env`で，それがRemote Configより優先されてしまうので）`gcloud`コマンドによる変数値の変更がファンクションに適用されませんでした．
そこで，元々の環境変数の値は無視して`rcloadenv.getAndApply('heroku', {})`としています．
Boost を用いた ISO 8601（RFC 3339）フォーマットの日付出力 

Boost を用いて ISO 8601（正確には RFC 3339）フォーマット日時を出力するサンプルです。

```main.cpp
#include <iostream>

#include <boost/date_time/c_local_time_adjustor.hpp>
#include <boost/date_time/local_time/local_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

std::string current_local_time() {
    const auto current_time = boost::posix_time::microsec_clock::local_time();
    const auto utc_timestamp = boost::posix_time::second_clock::universal_time();
    const auto local_timestamp = boost::date_time::c_local_adjustor<boost::posix_time::ptime>::utc_to_local(utc_timestamp);
    const auto td = local_timestamp - utc_timestamp;

    std::ostringstream oss;
    oss << boost::posix_time::to_iso_extended_string(current_time);
    oss << (td.is_negative() ? '-' : '+');
    oss << std::setw(2) << std::setfill('0');
    oss << boost::date_time::absolute_value(td.hours());
    oss << ':';
    oss << std::setw(2) << std::setfill('0');
    oss << boost::date_time::absolute_value(td.minutes());
    return oss.str();
}

int main() {
    std::cout << current_local_time() << std::endl;
    return 0;
}
```

以下のようにビルドして実行します。Boost のインクルードパスは環境に合わせて適宜変更してください。

```shell-session
$ g++ main.cpp -std=c++11 -I/usr/local/Cellar/boost/1.66.0/include -lboost_date_time
$ ./a.out
2018-02-24T00:09:55.980492+09:00
```

## 蛇足

[ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) と [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) は、それぞれ詳細を確認して貰いたいのですが、簡単に特徴と違いをまとめると：

- ISO 8601 は `20180102T212223Z` または `20180102T212223+0900` が基本形式で、`2018-01-02T21:22:23Z` または `2018-01-02T21:22:23+0900` が拡張形式
    - `2018-01-02T21:22Z` や `2018-01-02T21Z`のような精度も可
    - 末尾には小数点を指定可能で `2018-01-02T21:22:23,5Z`、`2018-01-02T21:22,5Z`、`2018-01-02T21,5Z` などの指定が可能（それぞれ `21:22:23.5`、`21:22:30`、`21:30:00` を意味する）
    - 小数点はカンマが推奨されるが、ピリオドでも可
    - T または Z は小文字も可
- RFC 3339 は秒未満の精度を持つ `2018-01-02T21:22:23.123456Z` または `2018-01-02T21:22:23.123456+09:00`
    - 秒未満の桁数は任意

という感じです。

ここでは詳細を省略していますが ISO 8601 はもっともっとあいまいなフォーマットで、例えば `YYYY-DDD` という表記で月を省略したり `YYYY-Www-D` で第何週の何曜日かを表したりもできます。ISO 8601 といえば上述の箇条書きのフォーマットが一般的に認知されており、こうした特殊なフォーマットはあまり使われないと思いますが、ISO 8601 の拡張かつサブセットである RFC 3339 がフォーマットとしてはカチッとしていて扱いやすいです。

今回の記事は ISO 8601 フォーマットを出力するなら [strftime](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strftime.3.html) で比較的簡単に出力できるのですが、RFC 3339 を出力するベストプラクティスがネット上で見つからなかったので[^1]作成しました。

[^1]: 実際には [C++ & ISO8601 : 時刻文字列 "2016-01-25T15:30:15.123+09:00" を出力する例 - Qiita](https://qiita.com/usagi/items/ab8ec7014d1b1b1894d2) がすぐに見つかったのですが、実装が大きくて複雑なので採用できませんでした（すみません）
Huawei Device's Sound Equalizer Function Broken After Updating to Oreo (Oreoへ更新後、Huawei端末のイコライザー機能が動作しなくなる)

[このページの日本語訳](https://translate.google.co.jp/translate?hl=ja&sl=en&u=https://qiita.com/discoheavan/items/eb800288717b9d44a4f0)

(This article was recently updated on May 18 2019)

# Equalizer Alternatives for Huawei Devices
For Huawei devices there are two alternatives to configure equalizer settings:

* Huawei's original Histen sound technology (for the latest devices such as Mate 10 and Honor 9)
* Android's standard equalizer API (for relatively old devices such as Mate 9 and P10)

# Huawei's Original Histen Sound Technology
Builtin GUI is avaiable to configure equalizer settings.
https://www.gadget-manual.com/huawei/sound-settings-in-honor-9/

# Android's Standard Equalizer API
There is no builtin GUI, but third party apps are available to call the standard API.

API spec:
https://developer.android.com/reference/android/media/audiofx/AudioEffect.html

Sample equalizer app:
http://kevinboone.net/android_simple_eq.html

# If Histen Equalizer is Available, Standard Equalizer Does Not Work
Third party equalizer app does not work well on Honor 9, on which device Histen Equalizer is supported. On enabling Bass Boost, low tone emitted from earphones completely disappears. Probably the two equalizer functions conflict with each other.
https://club.hihonor.com/in/honor-9-lite.321/poor-sound-using-external-equaliser-app-in-huawei-9-lite--help--.83911

# Even If Histen Equalizer is Unavailable, Standard Equalizer Does Not Work after Updating to Oreo (Why???)
Surprisingly, after updating to Oreo, the same issue happens on Huawei Mate 9, on which device Histen Equalizer is not supported.
https://forum.xda-developers.com/p10-plus/help/equalizer-broken-oreo-update-t3749336

I suspect Histen Equalizer function was merged into the mainline source code of Huawei's Android Oreo (EMUI 8), though this function is disabled on Mate 9.

# Any Solution?
Currently there is no solution to the issue on Mate 9 and P10. Once Updating to Oreo on these devices, we can never configure equalizer settings correctly.

I reported the issue to Huawei official support center, but I do not know if the issue will be fixed. I do not reprint the reply from Huawei official support center, because Huawei prohibits presenting communication log between Huawei and customers to public.

# (update) At Last the Problem Fixed by Updating to Android Pie!
I confirmed the malfunction of bassboost was fixed on my mate 9 by updating OS to android pie.

https://forum.xda-developers.com/showpost.php?p=79550082&postcount=18
SourceTreeでcouldn't agree a key exchange algorithmに出くわした

#ある日FetchやPushしようとすると怒られるように
`couldn't agree a key exchange algorithm`
とのこと。

#SourceTree2.4.7で認知されたバグで、2.4.8にて修正済みとのこと

[SourceTreeのReleaseNotes](https://www.sourcetreeapp.com/update/windows/ga/ReleaseNotes_2.4.8.0.html)によれば


>SourceTree 2.4.7.0 [20 December 2017]
Known Issues
SRCTREEWIN-8264 v0.70.1-Sourcetree of PuTTY/PLink shipped with Sourcetree 2.4.7.0 is unable to read credentials for username/password based SSH connections. This potentially blocks fetch/pull/push actions to remote hosts. Key pair based SSH and HTTPS connections continue work correctly.


とのこと。さらに

>SourceTree 2.4.8.0 [17 January 2018]
Changes
SRCTREEWIN-8264 Updated PuTTY/PLink dependencies to 0.70.2-Sourcetree to fix interactions with SSH urls using username/password credentials.


だそうで、**SourceTree**のバージョンアップにて解決⸜( ´ ꒳ ` )⸝
Pythonでtarアーカイブをメモリ上で解凍する方法

いちいちファイルに書き出したくないときに使えるテクニック。デフォルトで用意されているモジュールtarfileを用います。

```py3
import tarfile

with tarfile.open("archive.tar.xz", mode="r:xz") as tar:
    for tarinfo in tar:
        if(tarinfo.isreg()):
            #bytesで格納
            binary = tar.extractfile(tarinfo).readline()
            #文字列に変換
            str = binary.decode("utf-8")
            print(str)
```

tar.extractfileの返り値が[ExFileObject](http://epydoc.sourceforge.net/stdlib/tarfile.ExFileObject-class.html)なので、readline()等でbytesに変換するのがポイント。そのあと文字列で使いたければデコードします。

**訂正＆補足：**
この例だと1行しか読み取れません。1ファイル内に改行が含まれる場合は例えば、以下のようにします。

```py3
binary = b''.join(tar.extractfile(tarinfo).readlines())
```
ライブラリを捨てるとき

多くの言語で、ライブラリを管理するエコシステムが整ってきていることもあって、気軽に追加することも多いかと思います。ただ、ときどきは「削除」ということを考えたほうがいいかもしれません。

# 削除するシチュエーション

## 全く不要なライブラリ

ふつう、全く不要なライブラリを入れてしまうことはそう多くないかもしれません。ただ、状況によっては発生してしまうことがあります。

* プログラムの改造を繰り返すうちに、そのライブラリを使っていた機能がなくなってしまったケース
* 最初のインストール時に「標準的なライブラリリスト」を生成するけど、リストの中で自分の環境では不要なものがあった場合

使いもしないライブラリを入れておいても、完全にデメリットしかありません。不要だとわかったものは、きちんと消しておきましょう。

## バージョン互換性の問題

npmで管理されるJavaScriptライブラリは、通常「グローバル展開」を行わず、必要な分だけローカルで読み出すような形となっていますので、「AのライブラリがCの3系列に、BはCの4系列に依存する」というような状況でも、両方のCを入れることで解決することができます。

とはいえ、こんな芸当が成り立つ環境は少数派で、RubyのGemでは同じGemの複数バージョンを共存させることはできません。なので、古いGemに依存し続けるGemは、どうにかして外さざるを得なくなることがあります。また、Rails本体が順調にアップデートを続ける環境下で、Rails用なのにアップデートが追いつかないGemは、遅かれ早かれ外すほかなくなってしまう場面が訪れる危険も大きいです。

## 処理系などのアップデート

処理系やRailsなどの基幹ライブラリがアップデートすることで、直接動かなくなるだけでなく、環境の変化でGemが不要となる例もあります（そして、そういう状況になったライブラリは、保守がなされず放置される例も多いです）。

たとえば、以前に[ちょろっと紹介した](https://qiita.com/jkr_2255/items/ef35a82547925bc76ebb)、特定文字のエスケープをC拡張に置き換えて高速化する`escape_utils`というのがあったのですが、@joker1007 さんの提案で、Ruby本体にCで書かれたエスケープが[マージされた](https://github.com/ruby/ruby/pull/1238)結果、**そっちのほうが速くなっている**状況なので、もはや不要になった感もあります。

あと、Rails本体にActiveRecord::Enum、Webpacker、ActiveStrorageのような拡張が行われていっている結果、これらと同じ分野のサードパーティgemはお株を奪われているような状況です。
Exchange Serverの受信ログをPowerShellから確認する方法

## 準備
mailaddr.txtというファイルに下記のように1行ずつ受信ログを確認したいメールアドレスを記述します。

```tex:mailaddr.txt
hoge@example.com
hogehoge@example.jp
hoge+admin@example.co.jp
```
ログの出力先フォルダを作成しておきます。

```powershell
mkdir C:\temp\exLog
```

## PowerShellの準備
下記スクリプトは、Exchange Management Shellがあるサーバ上で実行しないとエラーになりますので
Exchange Server上に保存します。

```powershell:ExchangeLog.ps1
$i=1
$re = "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@"

$exSh = ". 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto;"

foreach ($l in Get-Content mailaddr.txt) {
    
    $s = [regex]::Match($l, $re, "IgnoreCase").Value.Replace("@","")
    
    $exCmd = "Get-MessageTrackingLog -Recipients " + $l + " | Export-Csv C:\temp\exLog\" + $s + ".csv -Encoding Default -NoTypeInformation"
    Start-Process -FIlePath powershell.exe -ArgumentList "-command  $exSh  $exCmd" -Wait 
    $i++
}

Write-Host "処理が完了しました。"
```

## 実行
```powershell
PS C:\Scripts>.\ExchangeLog.ps1
```

## 結果

```vim

PSComputerName	RunspaceId	Timestamp	ClientIp	ClientHostname	ServerIp	ServerHostname	SourceContext	ConnectorId	Source	EventId	InternalMessageId	MessageId	Recipients	RecipientStatus	TotalBytes	RecipientCount	RelatedRecipientAddress	Reference	MessageSubject	Sender	ReturnPath	MessageInfo	MessageLatency	MessageLatencyType	EventData
hoge.local	33f3c2d5-e2c9-4f87-86b2-aa5f1	2018/1/25 1:15	XXX.XXX.XXX.XXX	hoge.example.com	192.168.1.1	exchange	08D4C9B6B47A7BDD;2018-01-24T16:15:32.793Z;0	HOGE\HOGE	SMTP	RECEIVE	16794221	20180124161532.189ED61664@hoge	System.String[]	System.String[]	47904	1			Requests statistics -	hogehoge@example.jp	hoge2@example.jp	00A: NTS: 		None	System.Collections.Generic.KeyValuePair`2[System.String,System.Object][]
```

配列で出力されしまう箇所があるため、下記blogで解説されているようにSelectコマンドを利用して出力します。
[メッセージ追跡ログを CSV ファイルに出力する方法](https://blogs.technet.microsoft.com/exchangeteamjp/2015/11/17/csv/)
HSPでコンソール出力の色を変える

備忘録。本当は[これ](https://qiita.com/yosgspec/items/8454a0b021bbd06fd463)の移植をやりたくて調べていたんだけど、コンソール上のカーソルの設定方法がわからなかった(構造体を使うしかない…)ため断念したのでまとめておく。
コンソールなのであまり気にすることはないと思うけど、dll使っているので環境依存です。linuxでは多分動かないかな?

```cpp
#runtime "hsp3cl"
#define STD_OUTPUT_HANDLE -11
#define STD_ERROR_HANDLE -12

#uselib "kernel32"
#cfunc GetStdHandle "GetStdHandle" int
#func SetConsoleTextAttribute "SetConsoleTextAttribute" int,int
#func WriteConsole "WriteConsoleA" int,str,int,int

mes "いつもの色"
hErr=GetStdHandle(STD_ERROR_HANDLE)

repeat $100
	SetConsoleTextAttribute hErr,cnt
	puts=strf("%02X ",cnt)
	WriteConsole hErr,puts,strlrn(puts),0
	if cnt\$10=$F : mes ""
loop

SetConsoleTextAttribute hErr,$7
```