OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxでファイルが作成された日時を詳細に表示する

`stat` コマンドで詳細を表示できる。

## ファイルを作る

```
touch hoge
```

## stat コマンドで詳細を表示する。

```
stat hoge
```

```plaintext:出力結果
  File: ‘hoge’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: ca10h/51369d	Inode: 369369369   Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 369/ reoring)   Gid: ( 369/ reoring)
Access: 2018-09-05 03:06:09.190763369 +0000
Modify: 2018-09-05 03:06:09.190763369 +0000
Change: 2018-09-05 03:06:09.190763369 +0000
 Birth: -
```

`Modify` が作成日時となる。

## Access, Modify, Change の違い

### Access

ファイルデータが最後にアクセスされた時刻。mknod(2), utimes(2) と read(2) システムコールによって変更される。

### Modify

ファイルデータが最後に変更された時刻。mknod(2), utimes(2) と write(2) システムコールによって変更される。

### Change

ファイルの状態が最後に変更された時刻（inodeデータの変更）。chmod(2), chown(2), link(2), mknod(2), rename(2), unlink(2), utimes(2) と write(2)システムコールによって変更される。

## 他の方法

`ls`の、`--time-style`オプションに、 `full-iso` を指定する

```
ls -la --time-style=full-iso
```
【css】テキストは左揃え、画像は中央ぞろえにしたいときの方法【初心に返ろう】

#自分にびっくりした話
テキストは左揃え、画像は中央ぞろえにしたいときってどうすればいいの・・・？
これ、基本的なやつのはずなんだけどなぜか数か月前にやり方がわからなくなって調べました。
おかしいな、今までの自分はどうやってたんだろう・・・？

##結果から

以下のように、imgタグにcssで **display:block;** と **margin:0 auto;**を入れるだけ。

```html:HTML
<div class="box">
  <p><img src="jyuyo-img.jpg"></p>
  <p>すごく重要な画像</p>
</div>
```

```css:CSS
.box{
  background:#f9e6e4;
  width:300px;
}
.box img{
  display:block;
  margin:0 auto;
}
```
![例03.jpg](https://qiita-image-store.s3.amazonaws.com/0/276676/1396ae8b-8d46-9d84-a777-48ffa45d31cf.jpeg)

とっても簡単！

##解説

例えばこの黄色いボックスを例にします。
![例01.jpg](https://qiita-image-store.s3.amazonaws.com/0/276676/32e0fab5-97ed-feb7-cc61-1d920cfe1b41.jpeg)


###失敗例①
たくさんある画像を真ん中に表示させたい。
そう思ったときに多くの人が一番最初に思いつくのが **text-align:center;** です。
そんなわけで単純にこうすると・・・

```css:css
.box{
  text-align:center;
}
```
![例02.jpg](https://qiita-image-store.s3.amazonaws.com/0/276676/08102a99-56a6-86de-1a99-829536e282c6.jpeg)

全部真ん中に寄っちゃいます。
**text-align** プロパティはインラインレベルのコンテンツの行ぞろえを指定するものです。
そしてテキストもimgもインラインレベルのコンテンツなのです。

###失敗例②
text-align プロパティは指定したいコンテンツの**親要素**にかけないといけないのでこれもダメです。

```css:css
.box img{
  text-align:center;
}
```
何も起きません。期待してこれやったらイラっとします。

###結果の解説
では、「[結果から](https://qiita.com/kape/private/d539635f4ed0100b3638#%E7%B5%90%E6%9E%9C%E3%81%8B%E3%82%89)」 では何が起きているのか？

**① 文字 ⇒ インラインレベル、img ⇒ ブロックレベル に差別化する**
.box img { display : block; }

**② margin で左右中央にする**
.box img { margin : 0 auto }
![例04.jpg](https://qiita-image-store.s3.amazonaws.com/0/276676/1077a2bf-7360-077e-e0ae-6b3f1cc27498.jpeg)
上の画像を見たらなんとなくわかると思いますが、**margin : 0 auto** を使う場合は、その要素に**width定義が必要** です。
<font color="red">※ 画像は幅が決まっているものなのでわざわざwidth指定しなくても効くようです。</font>
Remixで発生する The constructor should be payable if you send value.について

## 環境
- WEBのRemixを利用（http://remix.ethereum.org/）
- Solidity 0.4.24
- JavaScript VMを利用（ほかのEnvironmentだと発生しない）


## エラーメッセージ
```
transact to **** errored: VM error: revert.
revert	The transaction has been reverted to the initial state.
Note: The constructor should be payable if you send value.	Debug the transaction to get more information. 
```

このメッセージを読む限り
「トランザクションをリバートしたよ、送金するならコンストラクタにpayableつけてね」
なんだなと思って調べたが原因がわからなかった

## 結論
結果的に単純にロジックが間違っていて
処理の途中でrequireによってrevertされていただけだった。。。
terraformでaws_launch_configurationを作成する時は、name_prefixを使う

## 概要
terraformでaws_launch_configurationを更新したい時に、再作成できなくて困ったのでメモ

## 
以下のようなコードでaws_launch_configurationを作成した。

```
resource "aws_launch_configuration" "config" {
  name　　　　　　　　　　　　　　                 = "hogehoge-config"
  image_id                    = "ami-0e95c345XXXXXXXXXXX"
  instance_type               = "t2.micro"
  key_name                    = "adminkey"
  security_groups             = ["sg-1234567890"]
  associate_public_ip_address = 0

  lifecycle {
    create_before_destroy = true
  }
}
```

作成したあとにAMIを入れ替えたくなったので、修正して再作成。
`terraform apply` したところ以下のようなエラーを受け取った。

```
Error: Error applying plan:

1 error(s) occurred:

* module.autoscale.aws_launch_configuration.config: 1 error(s) occurred:

* aws_launch_configuration.config: Error creating launch configuration: AlreadyExists: Launch Configuration by this name already exists - A launch configuration already exists with the name <リソース名>
        status code: 400, request id: a2a7ac89-b0ca-11e8-8187-db9a15b5b0a9
```

どうやら一度作ったリソース名と同じ名前のリソースを再作成できないらしい。

## 解決策

```
resource "aws_launch_configuration" "config" {
  name_prefix　　　　　　　　　　　　　　          = "hogehoge-config"  // name -> name_prefixに修正
  image_id                    = "ami-0e95c345XXXXXXXXXXX"
  instance_type               = "t2.micro"
  key_name                    = "adminkey"
  security_groups             = ["sg-1234567890"]
  associate_public_ip_address = 0

  lifecycle {
    create_before_destroy = true
  }
}
```

として再度applyすると今度は通った。

## ドキュメント
公式ドキュメントには以下のように書かれている

```
Launch Configurations cannot be updated after creation with the Amazon Web Service API. In order to update a Launch Configuration, Terraform will destroy the existing resource and create a replacement.
In order to effectively use a Launch Configuration resource with an AutoScaling Group resource, it's recommended to specify create_before_destroy in a lifecycle block. 
Either omit the Launch Configuration name attribute, or specify a partial name with name_prefix. 
```

## 実行後
applyを実行すると、AutoScaling Groupは新しいaws_launch_configurationを元にしたものに変更されるが、すでに起動されているインスタンスが更新されるわけではない。よって新しいaws_launch_configurationでインスタンスを更新したい場合はAutoscaleさせる必要がある。


## 参考
https://github.com/hashicorp/terraform/issues/3665
https://www.terraform.io/docs/providers/aws/r/launch_configuration.html
PowerShell 自作LoggerClass

#■概要
・自身の仕事で使用するために作成したロガークラスです。
・インスタンス化して使用します。
・出力対象（ファイル、コンソール）が設定できます。
・出力レベル（Info、Warn、Error、Debug）が設定できます。
・マルチスレッドに対応しております。（MUTEX）
・外部ファイルは使用しておりません。

以下の記事を参考にして作成しました。
https://qiita.com/miyamiya/items/f36ce9c4b0ffea26afe0

#■環境
PSVersion：5.1

#■ロガークラス
```powershell:MyLogger.psm1
#ログ処理
class MyLogger {

    #ログファイルのパス パスを設定しない場合はログを出力しない
    [string] $LogPath = ""

    #true Write-Hostする,False Write-Hostしない
    [bool] $ShouldWriteHost = $true
    
    #エンコーディング
    [string] $Encoding = "Default"

    #各ログレベルの使用可否 true:可 
    [bool] $IsInfoEnabled  = $true
    [bool] $IsWarnEnabled  = $true
    [bool] $IsErrorEnabled = $true
    [bool] $IsDebugEnabled = $true    
    
    #MUTEX名 空白の場合ログファイル名
    [string] $MutexName = ""

    MyLogger () {        
    }

    MyLogger ([string]$logPath, [bool]$shouldWriteHost) {
        $this.LogPath         = $logPath
        $this.ShouldWriteHost = $shouldWriteHost
    }

    #Info出力
    [void] Info($msg) {
        if ($this.IsInfoEnabled) {
            $this.PutLog("INFO", $msg) 
        }
    }
    #Warn出力
    [void] Warn($msg) {
        if ($this.IsWarnEnabled) {
            $this.PutLog("WARN", $msg) 
        }
    }  
    #Error出力
    [void] Error($msg) {
        if ($this.IsErrorEnabled) {
            $this.PutLog("ERROR", $msg) 
        }
    }   
    #Debug出力
    [void] Debug($msg) {
        if ($this.IsDebugEnabled) {
            $this.PutLog("DEBUG", $msg) 
        }
    } 

    #ログ出力
    hidden [void] PutLog([string]$level, [string]$msg) {
        
        $logparam = $null                     #WriteHost文字色, 出力ログレベル文字列 
        if ($level -eq "INFO")  { $logparam = @("White",    "INFO") }
        if ($level -eq "WARN")  { $logparam = @("Yellow",   "WARN") }
        if ($level -eq "ERROR") { $logparam = @("Red",      "ERROR") }
        if ($level -eq "DEBUG") { $logparam = @("DarkGray", "DEBUG") }
                
        $logtxt = "[$(Get-Date -Format "yyyy/MM/dd HH:mm:ss")] {0} {1}" -f $logparam[1].PadRight(5), $msg

        #画面表示
        if($this.ShouldWriteHost) {
            Write-Host -ForegroundColor $logparam[0] $logtxt
        }

        #ログ出力　パスがない場合はログを出力しない
        if($this.LogPath) {
            $mutex = New-Object System.Threading.Mutex($false, $this.GetMutexName())
            $mutex.WaitOne()
            try {
                Write-Output $logtxt | Out-File -FilePath $this.LogPath -Append -Encoding $this.Encoding
            }
            finally {
                $mutex.ReleaseMutex()
            }
        }
    }

    #Mutex名取得 Mutexプロパティに設定がなければLogファイル名をMutex名にする
    hidden [string] GetMutexName() {
        if ($this.MutexName) {
            return $this.MutexName
        }
        return [System.IO.Path]::GetFileNameWithoutExtension($this.LogPath) 
    }
}
```

#■使用方法
```powershell:Main.ps1
using module ".\MyLogger.psm1"

$logger = MyLogger::new("C\test.log", $true)
$logger.IsDebugEnabled = $false #DEBUGは出力しない
$logger.Info("情報")
$logger.Debug("デバッグ")
```
OpenSSH での SFTP 利用設定

## はじめに
これも備忘録。
OpenSSH で SFTP をさせたい場合のやり方。
ssh での接続は許可せず、sftp でのみ接続するユーザを作るのがゴール。

まず sftp 専用グループを作成。

```bash:
groupadd sftponly
```

次に sftp 接続ユーザを作成。
サブグループで sftp 専用グループを指定、ログインシェルは `nologin` を指定する。

```bash:
useradd -G sftponly -s /sbin/nologin sftpuser
```

上記で作成したユーザのパスワードを設定。

```bash:
passwd sftpuser
```

作成したユーザのホームディレクトリにある bash 関連のドットファイルを削除する。

```bash:
cd /home/sftpuser
rm -f .bash_logout .bash_profile .bashrc
```

sftp ユーザのホームディレクトリの権限を変更する。

```bash:
cd /home
chown root. sftpuser/
chmod 755 sftpuser/
```

ホームディレクトリ直下にはファイルを保存できない(させない)よう、ホームディレクトリ内に任意のディレクトリを作成し、所有者を sftp 接続ユーザにする。

```bash:
cd /home/sftpuser
mkdir sftpuser/
chown sftpuser. sftpuser/
```

`sshd_config` の最終行あたりに追記する。

```bash:/etc/ssh/sshd_config
～ 中略 ～
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match group sftponly
  ChrootDirectory /home/%u
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
```

最後に sshd の設定を反映する。

```bash:
systemctl reload sshd
```

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
kubectlを1.11にアップグレードしたらget podsができなくなった

# 問題
Ubuntu (16.04)でkubectlを1.11にアップグレードしたらget podsなど基本的なコマンドが次のようなエラーが出て失敗。

```bash
$ kubectl get pods
No resources found.
Error from server (NotAcceptable): unknown (get pods)
```
# 解決方法
調べたら[Kubernetesのissue](https://github.com/kubernetes/kubernetes/issues/65575#issuecomment-401319830)に上がっていました。
Kubectl 1.11はサーバーのバージョンが1.9以上じゃないとうまく動かないそう。
サーバーのバージョンを上げればいいのだろうが、本番サービスが動いていてなかなかそうも行かないので、
kubectlを1.10にダウングレードすることで解決

```bash
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.10.0/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
```
FuelPHPのOrmのObserverで、保存する前に値をtrimするように設定する

1.Observerに登録

``` php:model/orm.php
protected static $_observers = array(
    'Orm\\Observer_Self' => array(
        'events' => array('before_save')
    ),
);
```

2. Observer呼び出し時のトリミング処理

``` php:model/orm.php
public function _event_before_save()
{
	$properties = array_keys($this->properties());
	foreach ($properties as $property) {
		if(!isset($this->{$property})) {
			continue;
		}
		if (!is_string($this->{$property})) {
			continue;
		}
		$this->{$property} = trim($this->{$property});
	}
}
```

全角スペースのトリミングはこちらを参考にしました。
https://qiita.com/saku/items/2cac8fbd7cfd4c493b52
OpenCVSharpで48bit画像の保存

OpenCVSharp3にて48bit(16bit/Color) TIF画像をいじった時に躓いたので覚書です。
VB.netですが。。。

もっといい方法があるかもしれません。

``` VB
'TIFを開く
Dim src As Mat = Cv2.ImRead("TEST.TIF", ImreadModes.Unchanged)

～何らかの処理～

'MatをBitmapSourceへ変換
Dim bs As System.Windows.Media.Imaging.BitmapSource = Extensions.BitmapSourceConverter.ToBitmapSource(src)

'保存用のStreamを生成
Dim stream As New IO.FileStream("OutPut.TIF", IO.FileMode.OpenOrCreate)

'TIFのエンコーダー
Dim encoder As New System.Windows.Media.Imaging.TiffBitmapEncoder
encoder.Compression = System.Windows.Media.Imaging.TiffCompressOption.None
encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bs))

'保存
encoder.Save(stream)

'Streamを閉じる
stream.Close()
```
GitHub 上でサクッと空のディレクトリを作成する方法

## やり方
![createGitkeepWithDir3.gif](https://qiita-image-store.s3.amazonaws.com/0/70638/5b565ca3-768b-5ef2-099d-c38d32429f49.gif)


本来、新しいディレクトリを git 管理し、GitHub へ反映するには下記のような手順が必要です。

1. ローカルで新しいディレクトリを作成
2. 中にファイルを置く
3. ファイルを `git add` する
4. ファイルを `git commit` する
5. `git push` する

しかし、前述のキャプチャの方法ならブラウザさえあれば GitHub上で全て完結できます。ローカル作業が面倒なときはお試しください。用途例としては、プロジェクトブランチに共用のディレクトリだけを先に用意する、みたいなときによく使います。

## 説明
`Create new file` をクリックして、ファイル名を `path/to/.gitkeep` という名前で作成します。すると、スラッシュで区切られたところはファイル名ではなくディレクトリ名として扱われ、`path/to` ディレクトリ内に `.gitkeep` というファイルが作成されます。このとき `path/to` ディレクトリがまだ存在しない場合は新しく作成されますのでこれを利用しているというわけです。

なんでディレクトリの作成をしたいだけなのに、わざわざこんなファイルを作るのかといいますと、[**git では空のディレクトリを add することはできないためです。**](https://git.wiki.kernel.org/index.php/Git_FAQ#Can_I_add_empty_directories.3F) まだディレクトリに入れるファイルが何も無い場合でも何かしら入れておかないと add して git での管理ができません。

ここでは `.gitkeep` というファイルを設置しておくことでディレクトリを中身のある状態にしています。これによって add ができるようになります。`.gitkeep` ファイル自体は特に何も中身はない、ただの空ファイルです。ファイル名や中身はなんでもいいんですが、**ディレクトリをgitに認識させるためだけに設置した特に中身には意味の無いファイルである** ということがファイル名を見るだけでわかるので、一般的にこの名前で空ファイルを作ることが多いようです。

## 参考
`.gitkeep` を設置している点以外は基本下記と全く同じです。

https://stackoverflow.com/questions/18773598/creating-folders-inside-github-com-repo-without-using-git#answer-18791455

## 補足
`.gitkeep` でこの記事に辿り着いている方が多い？様子なので少し補足です。

`.gitkeep` というファイル名は特にそういう公式ドキュメントがあるわけではないです。あくまでも先行例が多いため右に倣っているだけです。事例については [**GitHubを検索してみるとたくさん見つかります**](https://github.com/search?o=desc&q=filename%3A.gitkeep&s=&type=Code) ので気になる方は覗いてみてください。

[ちなみに `.keep` にしているケースも筆者は見かけたことがあります](https://github.com/rails/actioncable-examples/tree/master/log)。
任意バージョンのMySQL リポジトリを選んでyum install する

### 前提

CentOS でMySQL をyum install する際、公式のリポジトリをストレートに落としてくると最新版のMySQL リポジトリが適用されますよね。
例えば、2018年09月05日現在だと8.0系。

ですが、場合によっては5.6系を使いたい場合もあるわけで。  
そんなとき、いちいち5.6系のリポジトリを探して登録するのではなく、最新のリポジトリを入れつつも、インストール時にバージョンを指定してしまおうという方法です。

### 概要

最新のMySQL リポジトリをインストール後、yum-utils のyum-config-manager を使ってリポジトリの有効/無効を切り替えます。

### 手順の流れ

1. yum-utils をインストール
2. 最新のMySQL リポジトリを公式サイトからダウンロードしてインストール
3. リポジトリの有効状態を確認（yum info mysql-community-server）
4. 任意バージョンのリポジトリのみを有効化（yum-config-manager）
5. MySQLをインストール
6. バージョン確認

### 手順

#### 1. yum-utils をインストール

このツールで、リポジトリの有効&frasl;無効を簡単に切り替え可能になります。

```Bash
# yum install yum-utils -y
```

#### 2. 最新のMySQL リポジトリを公式サイトからダウンロードしてインストール

何はともあれ.rpm ファイルの入手。
下記にて最新版のダウンロードリンクを取得できます。
https://dev.mysql.com/downloads/repo/yum/

```Bash
# yum localinstall &lt;取得したrpm ダウンロードURL&gt;
```

#### 3. リポジトリの有効状態を確認

リポジトリの有効状態を確認します。
ここで、有効にしたいバージョンのリポジトリ名と無効にしたいリポジトリ名をメモ。  
※下記は8.0 を無効にして、5.6 を有効にしたい場合。

```Bash
# yum repolist all | grep mysql
mysql-cluster-7.5-community        MySQL Cluster 7.5 Community      無効
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - So 無効
mysql-cluster-7.6-community        MySQL Cluster 7.6 Community      無効
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - So 無効
mysql-connectors-community         MySQL Connectors Community       有効:
mysql-connectors-community-source  MySQL Connectors Community - Sou 無効
mysql-tools-community              MySQL Tools Community            有効:
mysql-tools-community-source       MySQL Tools Community - Source   無効
mysql-tools-preview                MySQL Tools Preview              無効
mysql-tools-preview-source         MySQL Tools Preview - Source     無効
mysql55-community                  MySQL 5.5 Community Server       無効
mysql55-community-source           MySQL 5.5 Community Server - Sou 無効
mysql56-community                  MySQL 5.6 Community Server       無効  # ここを有効にしたい
mysql56-community-source           MySQL 5.6 Community Server - Sou 無効
mysql57-community                  MySQL 5.7 Community Server       無効
mysql57-community-source           MySQL 5.7 Community Server - Sou 無効
mysql80-community                  MySQL 8.0 Community Server       有効: # こっちは無効にしたい
mysql80-community-source           MySQL 8.0 Community Server - Sou 無効
```

#### 4. 任意バージョンのリポジトリのみを有効化

※下記は8.0 を無効にして、5.6 を有効にしたい場合。

```Bash
# yum-config-manager --disable mysql80-community  # 8.0を無効に設定
# yum-config-manager --enable mysql56-community   # 5.6を有効に設定
# yum info mysql-community-server  # 有効化したバージョンが利用可能なパッケージとなっている事を確認
```

#### 5. MySQLをインストール

yum コマンドでインストール。

```Bash
# yum -y install mysql-community-server
```

#### 6. バージョン確認

※下記は8.0 を無効、5.6 を有効にして、yum install した結果。

```Bash
# mysqld --version
mysqld  Ver 5.6.38 for Linux on x86_64 (MySQL Community Server (GPL))
```

以上です。
UnityでC#7.2を使用できるようにしてVisualStudioに対応させる

#環境
Unity2018.2.2f1
Incrementalcompiler 0.0.42-preview.19

#概要
Incrementalcompilerをインストールしたら、VisualStudioにc#のバージョンが違うと怒られました。
その対処方法です。

#Incrementalcompilerのインストール
・Unityを開く
・「window」>「PackageManager」を開く
・「All」タブでIncrementalcompilerを選択し、「install」を押す

#VisualStudioがエラーを出さないようにする
・https://github.com/zoon/C-Sharp-Latest-for-Unity/releases
から「csharplatest-0.1.0.18.unitypackage」をインストールする

#参照
https://forum.unity.com/threads/unity-incremental-c-compiler.523993/page-7
PythonのQueueとSchedulerについてのまとめ

# PythonのQueueとSchedulerについてのまとめ

公式のリファレンスを見て、自分なりにまとめたものを置いておきます.
python3.3以降の環境での仕様であり、それ以前だと引数の扱いが微妙に異なります.

---
# Queue
[url](https://docs.python.jp/3/library/queue.html)
multi-producerとmulti-consumerを使う上で基礎となるライブラリ.
マルチスレッドプログラミングで情報をやりとりする際に必要な排他処理が備わっているのでとっても便利.

## import

```
	import sched
```
## 例外
- queue.Empty  
	queue.getで投げられる.
- queue.Full  
	queue.putで投げられる.

## オブジェクト
- Queue.qsize()  
	queueの近似サイズを返すよ.
- Queue.empty(), Queue.full()  
	そのままの意味で、TrueかFalseを返す.  
	ただ、例えばempty()がFalseを返したとしても、後続のget()がブロックしないことは保証されない.  
	なぜかは分からん. 
- Queue.join()  
	すべてのアイテムが取り出されるまでブロックされる.
- Queue.put(item, block=True, timeout=None)
	これを使う場合は、以下の3パターンが考えられる.
	- item, block=True, timeout=None  
		スロットが利用可能になるまでずっと待つ.
		利用可能ならばitemをqueueに入れる.
	- item, block=True, timeout=正の数  
		スロットが利用可能になるまでは最大でtimeout秒間待つ.  
		待っても利用可能にならない場合は例外Fullを出す.
	- item, block=False  
		利用可能ならばitemをqueueに入れるが、できないならFullを出す.  
		timeoutは指定しても無視される.
		
- Queue.put_nowait(item, block=True, timeout=None)
	Queue.put(item, block=False)と等価.
- Queue.get(block=True, timeout=None)
	Queue.put()と似た感じ
- Queue.get_nowait()
	QUeue.put_nowait()と似た感じ

---
# Scheduler
[ソース](https://docs.python.jp/3/library/sched.html)
現実世界の時間を意識して複数の関数を扱いたいときに使う.
個人的には、**マルチスレッドの親玉**として認識してる.
## import

```
	import sched
```

## オブジェクト
- sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
  time.monotonicが無ければtime.timeを使うようになっている.
  実行環境によってデフォルト引数の型が変化するのは避けたいので、`shed.scheduler(time.time)`として**time.timeを利用することをオススメ**するよ.
	
- scheduler.enterabs(time, priority, action, argument=(), kwargs={})

	- 概要  
    **関数(action)をイベントとして登録する.**
		**現実世界の、ある時間で関数を呼び出したい時に使う.**
	- 戻り値  
	後で登録した関数(action)をキャンセルできるように、eventを返す.
	- 引数  
	timeで関数を呼び出すタイミングを指定する.  
	時間を扱う型はいくつもあるので、ここではschedulerのコンストラクタ第1引数で定義した時間の型を使って指定する.  
	action,argument,kwargsは以下のように使うよ.

```
def printTime(a='default'):
    print(a)

s = sched.scheduler(time.time, time.sleep)
s.enter(5, 2, print_time, argument=('s.run()の5秒後に呼ばれるよ（優先度: 高）',))
s.enter(5, 1, print_time, kwargs={'a': 's.run()の5秒後に呼ばれるよ（優先度: 低）'})
s.run()
```

- scheduler.enter(delay, priority, action, argument=(), kwargs={})
  - 概要
	**scheduler.enterabsの、相対時間で指定したいときに使う版.**  
	例えばプログラムを起動した3秒後に起動音を鳴らすみたいな場合とかね.  
	
- scheduler.cancel(event)
	- 概要  
  	enter,enterabsで登録したものをキャンセルできる.
	- 例外  
		存在しないeventを引数で指定していた場合はValueErrorを吐く.
- scheduler.empty()
	もしイベントキューが空ならば、Trueを返す.

- scheduler.run(blocking=True)
	- 概要
		**実行されるイベントの時間が来るまで待機し**、登録されたイベントのタイミングごとに、同じスレッド上でイベントを実行する.  
		
		実行するイベントを待つときはSchedulerのコンストラクタで指定した関数を用いて待機する.  
		あと、スケジューラー自体はマルチスレッドではない.
		
		**もし実行されたイベントがなかなか終わらずに次のイベントの呼び出し時間が来てしまった場合は、単に次のイベントが呼び出されるのが遅くなるだけ.**  
		特にイベントが落ちるとかは無いし、例外も投げない.	
		そういったことはscheduler.cancelの役目らしい.
	- 例外
		action(登録された関数)で投げられた例外をそのまま伝播する.
		actionで例外が投げられたときは以降
  - よく分からんかったとこ

 ```
If an exception is raised by action, the event will not be attempted in future calls to run().
```
- scheduler.queue
	- 概要  
		登録されたイベントが呼び出される順序ごとに整列したリストとして返される.
	- 戻り値  
		リストを返す.
		リストの各要素はイベントの情報がタプルで入っている.
Elm 0.19 について

 Elm 0.19が先月末にリリースされているようです。バージョンに関して注意が必要です。


　今まで通り以下のコマンドでElmをインストールすると、期待する結果になりません。Elm 0.19がインストールされます。その結果、従来のコマンドが使えなくなり、しかもパッケージがElm 0.19対応でないと使えないようです。厳しいです。


```
npm install -g elm
```


　従来通りの環境にしたいときは、以下のように0.18を明示してインストールしましょう。

```
npm install -g elm@0.18.0
```


 Elm 0.19になって嬉しいことは何かは、[elm/projects　Roadmap FAQ - github.com](https://github.com/elm/projects/blob/master/roadmap.md)、を参照してください。将来的に(?)　single-page appsとかServer-side rendering対応とか書いてあります。
【jQuery】モーダルウィンドウの構造を理解しよう！その1（未完）【単一画像】

モーダルウィンドウって地味によく使いますよね。
今ちょうど文字がいっぱい詰まってる画像を使うところで見にくいからクリックで拡大表示させたい案件発生中です。
せっかくなのでモーダルウィンドウを自作してみます！

【作成計画（ふわっと版）】

+ クリックしたら大きい画像とタイトル
+ できればアニメーションしてうにょーんって出てほしい
+ 当然レスポンシブ


##具体的な作成計画
**クリック後にでっかい画像が真ん中表示** ⇒ imgタグの中身を入れ替える⇒ cssじゃ無理そうだから**【jQuery】**で作成！
**背景を半透明の灰色にする** ⇒ positionプロパティでなんやかんやしたらいけそう！⇒ **【css】**で作成！
**画像がうにょーんってアニメーションする** ⇒ transition でいけそう ⇒  **【css】**で作成！

・・・あれ？これだけできれば結構モーダルウィンドウっぽくなりそう！

##作成① とりあえずCSSをつくろう

とりあえず小さいほうの画像を真ん中に表示して背景半透明の灰色なCSSを作成します！
こんな感じのHTMLで。

```html:HTML
<figure class="modal"><img src="img01.jpg"></figure>
```

###画面のど真ん中に画像を表示させるよ！

```css:CSS(画面のど真ん中に配置)
.modal {
	position: fixed;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	z-index: 9999;
```
position ～ transformプロパティが画像をど真ん中に表示させる方法です。translate 超便利
z-index で画像が一番上にくるようにテキトーに9をいっぱい入れます。

###背景を黒半透明にするよ！
HTMLに背景用のタグを追加します。

```html:HTML
<P class="modalBack"></p>
<figure class="modal"><img src="img01.jpg"></figure>
```

```css:CSS（黒半透明背景）
.modalBack{
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 120%;
	background: rgba(0,0,0,0.6);
	z-index: 999;
```
【 ポイント 】

 + z-indexに、ちょっと控えめに９をいっぱい入れ、「画像＞半透明背景」になるようにします。
 + スマホ対策としてheightを120％にする。iPnoneなどはナビバーが出たり引っ込んだりするため、jQueryの計算がおかしくなるそうだ。

##作成② jQuery を書いてみよう

まずは簡単そうな画像と背景表示非表示に挑戦です。

透明背景を **display:none;** で一旦非表示にしておきます。

```js:jQuery(画像クリックで背景表示)

$(function() {
  // 「.modal」画像をクリック時に、showメソッドでHTML要素を表示する
  $('.modal').on('click', function() {
    $('.modalBack').show();
  });
```

かくして実行してみたら透明背景は狙い通りに動きました！・・・でも思ってたのと違う（笑）
真ん中に小さいほうの画像（サムネイル）が常にドドーンとあります。
えーとつまり、

 + .modalは最初から画像に付けてはいけない ⇒ addclassで後から付ける！
 + サムネイルをクリックしたら大きい画像に変わるようにしないといけない ⇒ attr()で要素を変更する！
 
今度はこれに挑戦してみます！

##目指せモーダル

```html:HTML(大きい画像の情報も追加)
<P class="modalBack"></p>
<figure class="beforeModal"><a href="img01_l.jpg"><img src="img01.jpg"></a></figure>
```
HTMLはこのように書き替えてみました。
① .modal は一旦外して別のクラス名（.beforeModal）をつける
② attr() で大きいほうの画像名が取得できるようにaリンクをつける

```js:jQuery(サムネイル画像クリックで画像と背景表示)

$(function() {

    $('.beforeModal').on('click', function() {
  // 「.beforeModalのimgタグ」の中の src の中身を「.beforeModalのaタグ」の中の href の中身に変える
    $('img',this).attr('src',$('a',this).attr('href'));
  // 「.beforeModal」に「.modal」を追加する
    $(this).addClass('modal');
  // 「.beforeModal」画像をクリック時に、showメソッドでHTML要素を表示する
    $('.modalBack').show();
    return false;
    });
});
```

できたし、思った通りに動いたけど・・・**大きい画像がサムネイルのサイズのままで表示される** ので意味ない。

ええー。

もうちょっと調べます・・・。
広告

# 参考
* Recommendation as a Service https://www.yuspify.com/blog/recommendation-as-a-service/
* Recommendation System for Netflix https://beta.vu.nl/nl/Images/werkstuk-fernandez_tcm235-874624.pdf
* Machine Learning for Recommender systems — Part 1 (algorithms, evaluation and cold start) https://medium.com/recombee-blog/machine-learning-for-recommender-systems-part-1-algorithms-evaluation-and-cold-start-6f696683d0ed
* Advertising in the IoT Era:Vision and Challenges https://arxiv.org/pdf/1802.04102.pdf
SSH の ControlMaster について

## はじめに
ただの備忘録。
自分は SSH のコネクションプール的なものって解釈している。
Ansible 等、SSH を大量に使う場合に効果あり。

設定方法は下記のとおり。

```bash:~/.ssh/config
Host *
  ControlMaster auto
  ControlPath ~/.ssh/mux-%r@%h:%p
  ControlPersist 60
```

古いバージョンの OpenSSH だと使えないと思う。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
ScalaTestでテストレポートを出力する

[ScalaTest](http://www.scalatest.org/)でユニットテストを書いて [sbt](https://www.scala-sbt.org/) でテストを実行すると、sbtのコンソールにはテスト結果とログがごちゃ混ぜになって出力されるかと思います。

「テスト結果のサマリーだけ見たい！！」ってときはログが邪魔ですが、かと言っていちいちログ出力レベルを変えるのも面倒、と言うときはテスト結果をレポートとして出力すると便利だと思います。

以下の例のように *build.sbt* で `testOptions` にレポート出力の設定を追加するだけでOKです。

* レポートのファイル名にプロジェクト名を含めておかないと、プロジェクトごとに上書きされてしまいます。
* レポートの出力内容などはオプションで調整できます。詳細は [ScalaTestユーザーガイド - Writing your first test](http://www.scalatest.org/user_guide/using_scalatest_with_sbt) の **Using Reporters** の項を参照）

```scala:build.sbt
val commonSettings = Seq(
  :
  testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-fWDT", s"target/test-report_${name.value}.txt", "-eNDXEHLO")
)

val projectA = (project in file("projectA"))
  .settings(commonSettings)
  :

val projectB = (project in file("projectB"))
  .settings(commonSettings)
  :
```

これで `sbt test` を実行すると、テストレポート `/target/test-report_****.txt` が出力されるようになります。

```
/example
  /projectA
    /src
      /main
      /test
    /target
  /projectB
    /src
      /main
      /test
    /target
  /target
    test-report_projectA.txt
    test-report_projectB.txt
  build.sbt
```

以上です。
Djangoでウェブアプリ - htmlページを表示

Djangoを使ってウェブアプリを作ります
最初のhtmlページを表示してみます

- このページで作成されたDjango環境は[ここ](https://github.com/eggplnt/northernlights5)からダウンロード可能です

#1. htmlページを用意します
- `penguin`フォルダに`templates`サブフォルダを作成し、その中に下記のようなシンプルなhtmlを用意します

```html:index.html
<html>
  <body>
    <p>Hello, World.</p>
  </body>
</html>
```
<img width="526" alt="スクリーンショット 2018-09-05 13.54.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/5166653d-1069-0863-01d1-ad225e4045e1.png">

- `northernlights`の`urls.py`に以下の記述を追加します。`import`で`include`を追加するのを忘れないようにします

```python:northernlights/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('penguin.urls')),
]
```

- 同様に`penguin`フォルダに`urls.py`を追加し、以下のように記述します

```python:penguin/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```
- `penguin`フォルダの`views.py`に以下の記述を追加します

```python:penguin/views.py
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')
```

#2. 稼働を確認します
- `python manage.py runserver`でdjangoを起動します
- ブラウザで`localhost:8000`へアクセスし、用意した`index.html`が表示されることを確認します

<img width="324" alt="スクリーンショット 2018-09-05 14.00.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/4dc74966-3ee0-4af4-7fa3-883a93f05f9e.png">


#3. migrateします
- データベースへの変更が溜まっていたら`migrate`コマンドで反映します

```
(ve18) MacBook:northernlights tohru$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
```
Docker コンテナで Embulk を動かす

Docker おじさんです。

ちょっと試しに Embulk を使おうとしたものの、手元のマシンではそのまま動かせなかった。
手元のマシンには Java 9 が入っているが、Embulk v0.9.x は Java 8 じゃないと動かせないらしい。
Java 8 入れるのもなんか嫌だったのでとりあえず Docker で動かすか、となった。

## Dockerfile を書く
``` Dockerfile:Dockerfile
FROM openjdk:8-jre-alpine

# Embulk 本体をインストールする
RUN wget -q https://dl.embulk.org/embulk-latest.jar -O /bin/embulk \
  && chmod +x /bin/embulk

# 使いたいプラグインを入れる
RUN apk add --no-cache libc6-compat \
  && embulk gem install embulk-output-td

WORKDIR /work

ENTRYPOINT ["java", "-jar", "/bin/embulk"]
```

躓いたポイントが2点。

- `FROM openjdk:8-jre-alpine` だと `embulk gem install` で失敗する
    - `flock unsupported or native support failed to load` というエラーが出る
    - <del>[libjffi を入れたら動く](https://qiita.com/Tomoyuki_Mikami/items/60f5ecdbaeef0f535414)かと思ったけど動かなかったので、あきらめて alpine をやめることにした</del>
    - `libc6-compat` を入れたら解決した[^1]
- `ENTRYPOINT ["/bin/embulk"]` だけだとコンテナが起動しない
    - `exec user process caused "exec format error"` というエラーが出る
    - Docker の ENTRYPOINT では、jar ファイルを直接起動することが出来ない
        - `sh -c "..."` するか `java -jar ...` する必要がある

[^1]: https://twitter.com/hiroysato/status/1037190771336732672

## イメージをビルドする
``` console
$ docker build -t embulk .
```

## コンテナを起動して Embulk を使う
例えばこんな感じで。

``` console
$ docker run --rm -it -v $(pwd):/work embulk --help
```

``` console
$ docker run --rm -it -v $(pwd):/work embulk guess seed.yml -o load.yml
```

``` console
$ docker run --rm -it -v $(pwd):/work embulk run load.yml
```
tulindでテクニカル分析

# 概要 
- 【目的】手軽にテクニカル分析したい
- - 環境
    - Windows10
    - VSCode
    - Node v8.11.3
- 参考
    - [npm tulind] (https://www.npmjs.com/package/tulind )
    - [Github tulind ] (https://github.com/TulipCharts/tulipnode )
   -  [Tulip Indicators API ](https://tulipindicators.org/list )
   -  [npm axios]( https://www.npmjs.com/package/axios )
 
#Sample axios,tulind  
Bitmexから1分足を取得してSMAを得る
- BITMEX API doc 
  - https://www.bitmex.com/api/explorer/#!/Trade/Trade_getBucketed

```javascript
const axios =require('axios')
var tulind = require('tulind')

const test = async ()=>{
  const res = await axios.get('https://testnet.bitmex.com/api/v1/trade/bucketed'
    +'?symbol=XBTUSD' + '&binSize=1m&partial=true&count=10&reverse=true')
  const close = res.data.map(v => v['close'])
  const sma = await tulind.indicators.sma.indicator([close], [3])
  console.log(close)
  console.log(sma)
}
test()
```

output

```bash
//close
[ 7338.5, 7338.5, 7338.5, 7338.5, 7339, 7339, 7338, 7341, 7341, 7345.5 ]
//sma
[ [ 7338.5,
    7338.5,
    7338.666666666666,
    7338.833333333333,
    7338.666666666666,
    7339.333333333333,
    7340,
    7342.5 ] ]
```
#コンソール上にチャートを表示(asciichart)
```javascript
const axios =require('axios')
var tulind = require('tulind')
var asciichart = require ('asciichart')

const test = async ()=>{
  const res = await axios.get('https://testnet.bitmex.com/api/v1/trade/bucketed'
    +'?symbol=XBTUSD' + '&binSize=1m&partial=true&count=50&reverse=true')
  const close = res.data.map(v => v['close'])
  const sma = await tulind.indicators.sma.indicator([close], [10])
  console.log(asciichart.plot(sma[0],{ height: 10 }))
}
test()
```

output

```bash
    7343.65 ┤                               ╭─╮       
    7342.00 ┤                            ╭──╯ ╰╮      
    7340.35 ┤                         ╭──╯     ╰───╮  
    7338.70 ┤                    ╭────╯            ╰╮ 
    7337.05 ┤           ╭────────╯                  ╰ 
    7335.40 ┤        ╭──╯                             
    7333.75 ┤       ╭╯                                
    7332.10 ┤     ╭─╯                                 
    7330.45 ┤   ╭─╯                                   
    7328.80 ┤ ╭─╯                                     
    7327.15 ┼─╯    
```
kustomizeでconfigMapを取り扱うときの注意

# configMapGeneratorの動作を考える

現在、kustomizeでConfigMapを処理する方法は2つの方法があり
kustomizeのconfigMapGeneratorが若干クセのある動作をするので
軽くまとめておく

# tl;dr

雑に

* 基本的には`configMapGeneratorを使おう`

configMapの編集するたびに確実にconfigmapを違う名前にしたいのだったら `configMapGeneratorを書く` 

configMapの更新で名前が変わったら困るなら `configMapもresourcesに書く`

## 前提

* kustomization.yaml
* deployment.yaml
* configmap

k8s manifestとしてはdeployment + configMapという最小構成を考える

## 2つの方法の違いを見ていく

* `resources` の中に書いてresourceとして処理する
* kustomization.yaml にconfigMapGeneratorとして書く

ここからは2つの方法の違いを見ていく。
deploymentのmanifest `deployment.yaml` の内容はまったく同じものとする

### deployment.yaml

~~~yaml
# 余計なものを省いています
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: api
  labels:
    app: api
spec:
  template:
    spec:
      containers:
      - name: api
        envFrom:
        - configMapRef:
            name: awesome-config
~~~

基本的な `awesome-config` を読み出すmanifestです

# resourcesを使う

`kustomization.yaml`, `deployment.yaml`, `config.yaml` 3つのファイル

### kustomization.yaml

~~~yaml
resources:
- ./deployment.yaml
- ./config.yaml
~~~

### config.yaml

~~~yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: awesome-config
data:
  foo: a
  bar: b
  baz: c
~~~

### kustomize build 結果

~~~yaml
# (一部省略)
apiVersion: v1
data:
  bar: b
  baz: c
  foo: a
kind: ConfigMap
metadata:
  name: awesome-config
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: api
spec:
  template:
    spec:
      containers:
      - envFrom:
        - configMapRef:
            name: awesome-config # !!!ここに注目!!!
~~~

注目するべきは

~~~
config.yamlを更新してを再び
$ kustomization build

configMapRefで参照しているconfigmap nameは更新されないこと！！！
~~~

`resourcesを使うとconfigMapの更新にかかわらず必ず同じ名前を参照する`

# configMapGeneratorを使う

### kustomization.yaml

~~~yaml
resources:
- ./deployment.yaml

# resourcesにconfig.yamlを書かない
configMapGenerator:
- name: awesome-config
  literals:
    - foo=a
    - bar=b
    - baz=c
~~~

### kustomize build 結果

~~~yaml
# (一部省略)
apiVersion: v1
data:
  bar: b
  baz: c
  foo: a
kind: ConfigMap
metadata:
  creationTimestamp: null # できてる
  name: awesome-config-cf7cgck6mg
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: api
  name: api
spec:
  template:
    spec:
      containers:						
      - envFrom:
        - configMapRef:
            name: awesome-config-cf7cgck6mg # !!!ここに注目!!!
~~~


注目するべきは

~~~
Deploymentが参照している configMapRef.nameが更新されたこと！！！
その後、configMapの内容を書き換えて kustomize buikdを行うとhashが更新された！！！！

> name: awesome-config-tm49dhk965
~~~

# まとめ

kustomize環境下でのconfigMapの取扱は二種類の方法があり
目的によって使い分けるのが良さそう

が、殆どの場合`configMapGenerator`がいいと思う

利用してるdeoloymentも確実に再起動してほしいのであれば
`configMapGenerator` を使おう

再起動したくないのであればvolume mountしてをconfigmapの変更を監視しようってことになりそう(prometheusは多分sidecar立ててそうしてる)
Qiita　自己情報管理方法

# Qiitaでの自己情報

qiitaで記事を投稿した時に検索すると自分以外の投稿まで検索してしまう。
その解決方法

## 解決方法

1.記事をかく
2.タグを設置する
3.ストックに入れる

そうするとマイページから、自分のストックの中から、検索できる
packer source_ami_filterメモ

## 記述例

* Amazon Linux 2

```json
{
  "builders": [{
    "type": "amazon-ebs",
    "region": "ap-northeast-1",
    "source_ami_filter": {
      "filters": {
        "virtualization-type": "hvm",
        "name": "amzn2-ami-hvm-2.0.*-x86_64-gp2",
        "root-device-type": "ebs"
      },
      "owners": ["137112412989"],
      "most_recent": true
    }
  }]
}
```

## amiのnameやownersを得る

```bash
$ aws ec2 describe-images --image-ids ami-08847abae18baa040
```
gdalで距離ラスタの作成

考古学でよく使いそうな距離ラスタ作成のコマンド。河川からの距離地図などを想定しています。

## ラインベクタのラスタ変換
gdal_rasterize コマンドを使います。

```
## ベクタファイルを入力して2値のラスタファイルを出力する
#　-burn　オプションで地物のある領域に「1.0」を代入
#　-tr オプションで解像度を指定（10mメッシュ）
#　-a_nodata オプションで地物のない領域に「0.0」を代入
#　-te オプションで対象領域の範囲を指定（xmini xmax ymini ymaxの順に指定）
#　入力ファイル（WL.shp） 出力ファイル（WL.tif）の順に指定
gdal_rasterize  -burn 1.0 -tr 10.0 10.0 -a_nodata 0.0 
 -te 417000.0 4621000.0 459000.0 4659000.0 WL.shp WL.tif
```

![01.png](https://qiita-image-store.s3.amazonaws.com/0/60438/0561bee9-a89d-03b5-8552-5598f4fade3d.png)


## 距離ラスタの作成
gdal_proximity.py コマンドを使います。

```
## ラスタファイルを入力してラスタ距離地図を作成する
# distunits オプションで「GEO」を指定（地図上の距離）
# 入力ファイル（WL.tif） 出力ファイル（WL_buffer.tif）の順に指定
gdal_proximity.py -distunits GEO WL.tif WL_buffer.tif
```
![02.png](https://qiita-image-store.s3.amazonaws.com/0/60438/53cfb953-fc5f-085c-e7d8-ceaee3641ac3.png)

### コマンドまとめ
```
## ベクタのラスタ化
gdal_rasterize  -burn 1.0 -tr 10.0 10.0 -a_nodata 0.0 -te 417000.0 4621000.0 459000.0 4659000.0 WL.shp WL.tif
### 距離ラスタ作成
gdal_proximity.py -distunits GEO WL.tif WL_buffer.tif
[Vue warn]: Property or method "_anyProperty" is not defined on the instance but referenced during render.

[Vue warn]: Property or method "_anyProperty" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

-------------
上記のようなエラーメッセージがwarningに表示されました。

初歩的ミスですが健忘録として
下のようなComponentを作ってるときに表示されました。

```vuejs
<template>
  <p> {{ _anyProperty }} </p>
</template>

<script>
export default {
  props : ['anyPropery']
  data() {
    return {
      _anyProperty : this.anyPropery
    }
  }
}
</script>
```

原因は単純で[Vue.jsのdataプロパティで'_'と'$'で始まる名前は駄目です。](https://jp.vuejs.org/v2/api/#data) [^1]
初歩的です。名前を変更すれば動きます。

```vuejs
<template>
  <p> {{ myAnyPropery }} </p>
</template>

<script>
export default {
  props : ['anyPropery']
  data() {
    return {
      myAnyPropery : this.anyPropery
    }
  }
}
</script>
```

## 参考
https://github.com/vuejs/vue/issues/2098
ドキュメントにも書かれてます。。。
https://jp.vuejs.org/v2/api/#data

同じエラーメッセージでもv-forで出力されることが多いみたいです。
https://qiita.com/kawakami-kazuyoshi/items/3f55b5cf7d745065b2c8

[^1]: 正確にはvm.$data.propertyでアクセスすれば問題ないですが冗長です
メモ：同一端末で複数のGitHubアカウントをレポ毎に別に使い分ける設定

$ cd ~/.ssh
$ ls
id_rsa              id_rsa.pub
既存のファイル名以外のファイル名を指定してSSH鍵生成
$ ssh-keygen -t rsa -C [メールアドレス] -f [ファイル名]

$ cat ~/.ssh/id_rsa_sub.pub | pbcopy

https://github.com/settings/ssh 
「Add SSH Key」へ貼る


$ subl ~/.ssh/conifg
Host github.com
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa  # メインのアカウント用SSH鍵ファイルへのパス
  TCPKeepAlive yes
  IdentitiesOnly yes
Host github.com.sub  # github.com以外の名前
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa_sub  # サブアカウント用SSH鍵ファイルへのパス
  TCPKeepAlive yes
  IdentitiesOnly yes

接続確認
$ ssh -T <HOST>

利用するアカウント設定
$ cd Project
$ git config --local user.name "サブアカウント"
$ git config --local user.email "サブアカウントメールアドレス"

Remote repository設定
$ git clone git@github.com.サブアカウント:GHaccount/GHrepo.git
$ git remote add origin git.サブアカウント@github.com:GHaccount/GHrepo.git

source:
https://qiita.com/yamataku29/items/4744c9c70ad793c83b82
https://github.com/youkinjoh/TrainingWebSocket/wiki/%E5%90%8C%E4%B8%80%E7%AB%AF%E6%9C%AB%E3%81%A7%E3%80%81%E8%A4%87%E6%95%B0%E3%81%AEGitHub%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95
Watson Assistant Improve ログ workspace 共有方法

#Watson Assistant Improve ログ workspace 共有方法
2018/2にImprove画面に表示されるユーザー入力ログがworkspace間で共有できるようになりました。
これによって開発用のworkspaceと本番用のworkspaceの運用が楽になりましたね。
ライト/標準プランでは同じinstance内のworkspace間のみ、プレミアムプランでは異なるinstance間でも共有できるようです。
<details><summary>Improve画面はこちら</summary>
![Improve.png](https://qiita-image-store.s3.amazonaws.com/0/130492/09d16b84-2389-f61e-b8ba-93141efe14a4.png)
</details>

[IBM Cloud　Watson Assitant Improve コンポーネントの概要](https://console.bluemix.net/docs/services/conversation/logs.html#deploy_id)に設定方法が記載されてあるのですが、私は設定するのに困ったので備忘録として記事を投稿します。(きっとみんなも戸惑うよね！！)

#今回やること
workspace「qiita-prod」と「qiita-dev」でImproveログを共有する設定を行います。
サービスが公開されている「qiita-prod」にきたユーザー入力のログを「qiita-dev」へ共有するという想定です。
###①qiita-prodの設定
開始ノードに、名前は「metadata」、valueは「{"deployment":"Qiita-Production"}」というコンテキスト変数を作成して下さい。welcomeノードに必ず作成しなくてもよいのですが、Message APIのcontextに「$metadata」を含める必要があります。 
![qiita-prod.png](https://qiita-image-store.s3.amazonaws.com/0/130492/ba1c8efa-226c-2271-dd4a-adb17ca44a82.png)
###②assistant-simpleの画面を用意する
①の設定を有効化するには「qiita-prod」をMessage APIでコールすることが必要です(try itでは駄目です)。
こちらを使用するとよいでしょう[watson-developer-cloud/assistant-simple](https://github.com/watson-developer-cloud/assistant-simple)

```bash:
git clone https://github.com/watson-developer-cloud/assistant-simple.git
cd assistant-simple
vi .env
```

.envファイルにご自身の環境情報を入力して下さい。
WORKSPACE_ID=******
ASSISTANT_USERNAME=******
ASSISTANT_PASSWORD=******
![vim.png](https://qiita-image-store.s3.amazonaws.com/0/130492/9508c8c5-e7ef-1806-2af7-7861faba1ae6.png)


```bash:
npm install
npm start
```
ブラウザの新規タブで「localhost:3000」を開く
何かメッセージを送信して下さい。contextに$metadataが入っていればよいです
![assistant-simple.png](https://qiita-image-store.s3.amazonaws.com/0/130492/27004165-739f-9ae0-e15f-a387fa8fee00.png)
###③Data sourceを設定する
②まで完了するとqiita-devのData sourceにQiita-Productionが表示され選択できるようになります。
これでqiita-prodとqiita-devのログが共有できるようになりました。
(私はなかなか表示されないので設定が反映されるまでに時間差があるのか?一定の件数が貯まらないと表示されないのか？などなど悩みましたが、単に設定が間違っているだけでした...。)
![source.png](https://qiita-image-store.s3.amazonaws.com/0/130492/e257d17f-b4b8-a6c8-6976-05943d8deee6.png)
![source.png](https://qiita-image-store.s3.amazonaws.com/0/130492/9c7c4e88-9d21-55c9-36a9-c572be58f622.png)
Mangacoinのコンパイルをしよう

# はじめに
Mangacoinのコンパイルを試みた方は読者の中にもいらっしゃったのではないでしょうか。
うん。[ここのね。](https://manga-coin.com/)
repoは[こ↑こ↓](https://github.com/mangacoinproject/mangacoin)。

# 普通にやればいいじゃん
じゃあやろうか。

```
git clone https://github.com/mangacoinproject/mangacoin
cd mangacoin
./autogen.sh
./configure
make
```

依存関係クリアしてても`make`で失敗する

# 模範解答
それではヤバいのでこれを使う。

```
git clone https://github.com/monacoinproject/monacoin
cd monacoin/depends
make
```
ﾊﾞｧｰﾝ!!!
なんでMonacoinが登場するのかと言うと、そのままではコンパイル出来ない上、Mangacoinのdependsがぶっ壊れているため。Bitcoinのdependsでも行けそうだけど未検証。
あとはクロスコンパイルの要領で普通にコンパイルすればいい。ただし`CONFIG_SITE`は先程のMonacoinの`config.site`を使うこと。
ゼロから始めるPython(2)


ゼロから始めるPythonの2回目になります。
[一回目はこちら](https://qiita.com/wind0411/items/f2b5919840799bb700d4)


#おさらい

前回では、Pythonの導入とシェル上でPythonの実行までを行いました。
インタプリタを使って対話モードで実行するところですね。

次は、Pythonスクリプトを作成して実行します。

#スクリプトの作成

Pythonスクリプトの作成はとっても簡単。

1. 拡張子[.py]のファイルを作成する。
2. コードを書く。

以上。

ってごめんなさい、ちゃんと説明しますね。

まず、デスクトップ上でも良いですし、IDE使っている方はIDEからファイル作成しても良いです。
拡張子が[.py]のファイルを作成してください。

次に、前回と同様、あいさつするコードを入力してみます。
以下をそのままコピペしてください。
(今回はhello.pyというファイルにしました)

```python:hello.py

# !/usr/bin/ python3.7
# -*- coding: utf-8 -*-
print('はじめまして!!!')

```

1行目と2行目なに？と思った貴方。私と同じです!~~(同類は嫌とか言わないでください)~~

まず、1行目の
>\#!/usr/bin/ python3.7

ですが、これはShebang(シバン)と呼ばれています。
Windowsユーザにはあまり必要ないかもしれませんが、
Unix系システムで、このプログラムをどのように実行するかを指定するものです。
つまり、今回で言えば
「/usr/binディレクトリ内のPython3.7を使って実行するよ」ということを指定しています。

次に、2行目の
>\# -*- coding: utf-8 -*-

ですが、これはソースコードをどの文字コードで解釈させるかを指定しています。
上記ではutf-8ですね。
ちなみに、Pythonの標準では「utf-8」が採用されているらしいです。

3行目は言わずもがな、ですね。

では、このファイルを保存して閉じます。
そして、シェル上で実行してみます。

```:入力
hello.py
```

```:出力
はじめまして!!!
```

おお。スクリプトを実行できました！！

#まとめ
対話側とスクリプト側の両方で実行することができるようになりました。
(1回目とまとめて投稿してもよかった。。。)
次回は、チュートリアルの内容からPythonコードの詳細についてまとめていきたいと思います。

#リンク
・随時更新予定
１文字名のgemが作りたかった話。

# 背景
先日gemを作った際に迷ったのがgemの命名。
[Rubyを絵文字で書けるようにするGemつくった](https://qiita.com/rnitta/items/cdd88dd1e8d399bac14e)

もともとは「🤔」にしようと思ってたのですが、gemの名前にマルチバイト文字は使えなかったので、
適当に"emozi"にしてしまいました。

これは"emoji"がすでに使われていたからではなく、
僕が作ったgemのせいで"emoji"というgemの名前が今後rubygems上では使えなくなるというのが憚られたからです。

# 思いつき

個人的な感覚だとこういう「他の人と競合しそうな名前」は避けたがるとおもうのですが、
そのへんを気にしない厚顔無恥の方が世界にはどのくらいいらっしゃるのか調べてみようと思いました。

# 調べてみた
[Rubygems](https://rubygems.org/)上の１文字のgem名をスクレイピングしてみました。

[mechanize](https://github.com/sparklemotion/mechanize)を使ってざっくりスクレイピング

スクレイピングコード

```ruby
require 'mechanize'

mechanize = Mechanize.new

search_url = %(https://rubygems.org/search?utf8=%E2%9C%93&query=name%3A+)
('a'..'z').each do |char|
  search_page = mechanize.get(search_url + char)
  gem_titles = search_page.search('h2.gems__gem__name')
  gem_names = gem_titles.map { |title| title.at(:span).remove; title.inner_text.strip }
  if !gem_names.include?(char) && !gem_names.include?(char.upcase)
    puts "'#{char}'空いてます!!!!!!"
  else
    puts "'#{char}'空いてません"
  end
end
```


実行結果

```bash
'a'空いてません
'b'空いてません
'c'空いてません
'd'空いてません
'e'空いてません
'f'空いてません
'g'空いてません
'h'空いてません
'i'空いてません
'j'空いてません
'k'空いてません
'l'空いてません
'm'空いてません
'n'空いてません
'o'空いてません
'p'空いてません
'q'空いてません
'r'空いてません
's'空いてません
't'空いてません
'u'空いてません
'v'空いてません
'w'空いてません
'x'空いてません
'y'空いてません
'z'空いてません
```

どの文字も空いてませんでした。

つらい。
  
  
  
  
ちなみに２文字(aa-zz)だと280パターンぐらいあいてた。
スクレイピングするときは適切な間隔を開けてDDoSしないようにしましょう。


## 追記

コメントで `gem search`を教えていただきました。

```bash
$ gem search -r '^.$'
```

実行結果

```bash

*** REMOTE GEMS ***

- (1)
_ (1.4)
a (0.1.1)
b (1.0.3)
c (0.0.3)
d (1.2.0)
e (0.5.1)
f (0.1.0)
g (1.7.2)
h (4.0.0)
i (0.1.0)
j (0.6.11)
k (0.1.1)
l (0.1.0)
m (1.5.1)
n (0.1.0)
o (2.0.4)
p (0.2.1)
Q (0.0.1)
q (0.0.1)
r (0.0.3)
s (0.0.2)
t (3.1.0)
u (1.0.2)
v (0.1.1)
w (0.0.0)
x (0.0.3)
y (0.0.2)
z (0.1.0)
```

僕はシェル芸できないので抜けてる文字（無い）を探したりはできないですが、こっちのほうがスマートですね。
【ColdFusion】リストや配列から空の要素を削除する

`listToArray()`すると空要素が消えるのを利用します。
（逆に消したくないときはincludeEmptyFieldsを指定してね）

###リストから空の要素を削除する

```php
<CFSET lList = "1,3,,,6,,7,,5">
<CFSET aArray= listToArray(lList)>
<CFSET lList= arrayToList(aArray)>
<CFDUMP var="#lList#">
```
リストは`1,3,6,7,5`になります。

###配列から空の要素を削除する

```php
<CFSET aArray = ["1","3","","","6","","7","","5"]>
<CFSET lList= arrayToList(aArray)>
<CFSET aArray= listToArray(lList)>
<CFDUMP var="#aArray#">
```
配列は以下のようになります。
![2018-09-04_164558.png](https://qiita-image-store.s3.amazonaws.com/0/106969/4718ba70-ef28-cd65-07c9-316ecc9c5dd9.png)
値にカンマが含まれる場合は第二引数にカンマ以外のデリミタを指定してください。
TerraformでCodePipelineを設定したらパイプラインが2重起動した

# 起きたこと

タイトルの通り。

# 背景

- 以下ステージ構成の CodePipeline を設定した。
    - Source
    - Build
    - Staging
    - Approval
    - Production
- Source ステージはS3を設定し、CloudWatch Events + CloudTrailによる変更検知を設定した。
- 上記の設定には Terraform を利用した。
    - https://www.terraform.io/docs/providers/aws/r/codepipeline.html

# 調べたこと

- CloudTrailのイベントログ調査
- CloudWatch Eventsの無効化

### CloudTrailのイベントログ調査

当然ながらCloudTrailのデータイベントログは取得できているので、パイプライン動作時のイベントログを確認した。すると、1回の `PutObject` に対して、CodePipelineのArtifactsバケットへの `CopyObject` が2回走っていることがわかった。

``` json
{
  "Records": [
    {
      ... 略 ...
      "eventName": "PutObject",
      ... 略 ...
    },
    {
      ... 略 ...
      "eventName": "CopyObject",
      ... 略 ...
    },
    {
      ... 略 ...
      "eventName": "CopyObject",
      ... 略 ...
    }
  ]
}
```

この結果から、Sourceステージが2重起動していることがわかった。

### CloudWatch Eventsの無効化

さらに被疑箇所を特定するため、CW Eventsを無効化した状態でS3バケットにソースを置いてみたところ、CodePipelineが１回だけ起動した。このことから、CW Events以外の方法でCodePipelineが起動していることがわかった。


# 原因と対処方法

ここまで調べてある程度あたりがついたのでドキュメントを読んでみたら、無事原因がわかった。

### 原因

原因はSourceステージの設定ミスだった。CodePipelineのSourceステージ(S3)は、以下2種類の方法でソースを検知できる。

- CW Eventsによる検知
- CodePipelineによるポーリング

CodePipelineによるポーリングの有効化/無効化は、`PollForSourceChanges` というパラメータで管理している。AWSはCW Eventsによる検知を推奨しているため、AWSコンソールでCodePipelineを作成する場合、 `PollForSourceChanges` はデフォルトで `false`(無効化) となる。しかし、CLI (Terraform) で設定する場合はデフォルトで `true`(有効化) となる。したがって、Terraformで設定する際には明示的に `PollForSourceChanges = false` とする必要があった。以下ドキュメント[^1]からの引用。

[^1]: https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-pipeline-structure.html

>　CLI を使用して作成あるいは更新されたパイプラインでは、このパラメータのデフォルトは true ですが、これは推奨される設定ではありません。代わりに、パイプラインを更新し、推奨される変更検出方法を使用してこのパラメータを false に設定します。詳細については、パイプラインの自動開始に使用される変更検出方法 を参照してください。このパラメータは、明示的に設定されていない場合は表示されません。

### 対処方法

設定を見直したら案の定 `PollForSourceChanges` が抜けていたので、Terraform設定ファイルに以下のように設定を追記した。

``` python:codepipeline.tf
resource "aws_codepipeline" "app" {

  ... 略 ...

  stage {
    name = "Source"

    action {
      name             = "Source"
      category         = "Source"
      owner            = "AWS"
      provider         = "S3"
      version          = "1"
      output_artifacts = ["MyApp"]

      configuration {
        S3Bucket    = "${aws_s3_bucket.app_src.bucket}"
        S3ObjectKey = "app.zip"

        ### CodePipelineによるPollingでオブジェクトの変更を検知する機能
        ### CW Eventsによる検知が使えるため非推奨
        ### CLIで設定する場合は明示的に無効化する必要がある
        PollForSourceChanges = "false"
      }
    }
  }
  ... 略 ...
}
```

上記を適用したところ、CodePipelineの2重起動は解消された。というわけで、ドキュメントをちゃんと読みましょう案件だった。
Go handler 比較

## 1. http.ServeMux
HTTPリクエストのURLとそれに対応するハンドラを登録する。
HTTPリクエストが来た時に、そのURLにマッチしたハンドラを呼び出す。

http.ServeMux 使ってhandler登録：

```go
type testHandler struct{}

func (h *testHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Hello World")
}

func main() {
    mux := http.NewServeMux()
    mux.Handle("/test", testHandler)
    ...
}
```
## http.ServeMux.Handler　と　http.HandlerFunc 比較

ServeMuxにはHandleメソッド以外にもHandleFuncというメソッドが定義されている:

```go
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    mux.Handle(pattern, HandlerFunc(handler))
}
```

実際の例：

```go
//  http.ServeMux.Handle つまり： mux.Handle パータン1： 構造体作る

func main() {
    mux := http.NewServeMux()
    mux.Handle("/test", testHandler)
    ...
}

type testHandler struct{}

func (h *testHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "this is test")
}


//-------------------------------------------------------------------------
//  http.ServeMux.Handle つまり： mux.Handle + mux.HandlerFunc パータン2： 構造体いらない 　
func test(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Hello World")
}

func main() {
    mux := http.NewServeMux()
    mux.Handle("/hello", http.HandlerFunc(test)) // testをHandlerFuncにキャスト
}

//-------------------------------------------------------------------------
//http.ServeMux.HandleFunc　つまり：mux.HandleFunc パータン　：　構造体いらない
mux := http.NewServeMux()
mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Hello World")
})

```

## http.HandleとDefaultServeMux実際の呼び出し先：

httpパッケージ内にDefaultServeMuxがglobar変数で定義されています
http.Handleを呼び出すと、ここのDefaultServeMux.Handleが呼び出されるわけです。
http.HandleFuncも一緒です、DefaultServeMux.HandleFuncが呼び出されるわけです。



## まとめ
- 1. http.HandlerはServeHTTPメソッドを定義するinterface
- 2. http.HandlerFuncを使えばServeHTTPを実装するstructを作らなくて良い
- 3. ServeMux.HandleメソッドでPathとhttp.Handlerのマッピングを登録する