OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Lambdaを使って、AMIを取得してみました

AWS Lambdaを利用してAMIを取得する処理を作ってみました。
他にも作ってみたものがありますが、似たコードになってしまう・・・

タグにenv: devが設定されたインスタンスのAMIを取得します。
AMI名はdev-日付時間で作成されます。

普段はインフラ屋さんなのでこういったものを作ると新しい発見があって楽しいです。

```py

from __future__ import print_function
import boto3
from boto3.session import Session
from datetime import datetime

ec2 = boto3.client('ec2')
dev_list = []
img_name = "dev-" + datetime.now().strftime("%Y%m%d%H")

# def
def get_list():
  instance_list = ec2.describe_instances(
    Filters=[{'Name': 'tag:env', 'Values': ['dev']}]
  )
  for Reservations in instance_list['Reservations']:
    for dev_instances in Reservations['Instances']:
      dev_list.append(dev_instances["InstanceId"])
      return dev_list

def create_image(dev_list):
  for instance_id in dev_list:
    response = ec2.create_image(
      InstanceId = instance_id,
      Name = img_name,
      NoReboot = True
    )
    
def lambda_handler(event, context):
  get_list()
  create_image(dev_list)
  return dev_list
 ```

https://github.com/handa3/study/blob/master/aws/lambda/create_ami.py
Arrayを複数回す際に役立ちそうなこと



2つのArrayを回して値を取り出したい
アプリの履歴管理とかはstructでまとめてArrayにするのが定石だけど
例えばファイルをリネームするときにわざわざstructを作りたくないのでタプルで回す

普通にやると

```swift
let items = try! FileManager.default.contentsOfDirectory(atPath: path)
let renamedItems = items.map{$0.replace("aaa",with:"bbb")}
let tuples = [(String,String)]
for i in items.count-1 {
   tuples.append(items[i], renamedItems[i])
}
tuples.forEach{
   ...
}

```
となり少し冗長、できればループはメソッドチェーンでやりたい。

#タプルで回す

Arrayにextensionで実装

```swift

extension Array{
    func tupled<T>(_ items:[T])->[(Element,T?)]{return self.enumerated().map{($1,items.index(at: $0))}}
    func index(at index:Int)->Element?{return index >= 0 && index < self.count ? self[index] : nil}
}


```

```swift
let items = try! FileManager.default.contentsOfDirectory(atPath: path)
let renamedItems = items.map{$0.replace("aaa",with:"bbb")}
items.tupled(renamedItems).forEach{atPath,toPath in
    guard let toPath = toPath else {return}
    try! FileManager.default.moveItem(atPath: atPath, toPath: toPath)
}

```

満足...　　(スナネコ) ![CzdtZdRUoAAc1LT.jpg](https://qiita-image-store.s3.amazonaws.com/0/117659/0d73c66a-fcf4-1a72-d602-a8397c22df85.jpeg)
Fire7(第5世代) 旧タブレットを使ってみた。

Newモデルは異なる可能性があります。
#Fireの比較
(おすすめ)Amazonが新型Fire 7とFire HD 8を発売！旧型モデルとスペックの違いを比較してみた！
http://www.sin-space.com/entry/2017/05/18/010008
(参考)Fireタブレットの比較 
https://www.amazon.co.jp/dp/B01J90PKEM/ref=ods_for_redirection
(参考)第5世代Kindle Fire（2015）の簡易レビューと最初にした設定 まとめ
http://ahiru8usagi.hatenablog.com/entry/Fire_5th_settings
Fire 7   （Newモデル）192 x 115 x 9.6mm  295g  SQRT(192^2+115^2)/25.4=8.8inch
Fire 7   （第5世代）  191 x 115 x 10.6mm 313g
Fire HD 8（Newモデル）214 x 128 x 9.7mm  369g  SQRT(214^2+128^2)/25.4=9.8inch
Fire HD 8（第5世代）  214 x 128 x 9.2mm  341g
iPhone 7              138.3×67.1×7.1   138g 
Nexus7(2013)LTE       200 × 114 ×8.65  299g
#標準のPDFのリーダが、横スクロールしかできない
Kindleストアから、以下を無料ダウンロードした。
(Google Playストアを使うことができないそうです。技があるようです。)
「Adobe Acrobat DC-PDF Readerそのほか」バージョン 15.3.1
「連続」という設定で縦スクロールができた。

－－－－－－－－－－－－－－
【補足】(2017/10/08)
「
ライセンス期限切れ
あなたが所有しているこのライセンスを更新する必要
があります。もう一度試してください。
OK
」
とダイアログがでました。
wifiで接続したら、でなくなりました。

－－－－－－－－－－－－－－
【補足】(2017/10/22)
充電を開始すると、画面がつきます。
充電を終了しても、画面がついた状態なので、シャットダウンが必要です。
RubyMine が A server is already running. Check /.../server.pid. と怒ってる

サーバー起動中に強制終了してしまったときなどに裏にプロセスが残っているとき

```
lsof -i:3000
```

をして、

```
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    40322 aaaaaaa    8u  IPv4 aaaaaaaaaaaaaaaaaa     
```

表示された PID で

```
kill -9 40322
```
【自分用】Linuxコマンド - メモ

#インデックス


###参考サイト

- [Linux入門](https://webkaru.net/linux/)
 

###時間のあるときに見たいサイト

- [【Linux入門講座】初心者からステップバイステップで学べる！](https://eng-entrance.com/category/linux)

---
###️ファイル

ファイルのいろいろ

```
ll  # ls -l　と同じ
ファイルとファイルサイズが表示される

```
参考：https://webkaru.net/linux/ls-command/
　

フォルダー内のファイル数を調べる

```
1行に1ファイルを表示し、その行をカウントする
ls -1 | wc -l

ファイル一覧からファイル名（単語数）をカウントする
ls | wc -w

```
参考：http://qiita.com/stc1988/items/e3a1d7dccafe4ab573fa
　

ファルダー内から任意の単語を含むファイル名の物を表示する

```
ls | grep 単語

```
　
ファイルをコピーする（クリップボードにコピーする方法）


```
#macの場合
cat ファイル名 | pbcopy


#リモートからローカルにコピーする場合
参考：http://qiita.com/katsukii/items/225cd3de6d3d06a9abcb

```
　
ファイルの削除

```
rm -rf ファイル名

#ディレクトリ内のファイル削除
rm -rf フォルダー名/*

```

###プロセス

プロセスを調べる？

```
ps 

```
参考：https://webkaru.net/linux/ps-command/
Reactでカウントダウン・タイマーを実現するコンポーネント作ってみた


## やりたいこと

- カウントダウンしたい時間を`props`へ与えられる
- タイマーの進むインターバルを`props`へ与えられる
- インターバル毎とカウントダウン終了時にコールバック関数を設定できる
- タイマーロジックとタイマー表示は切り離す
	- ロジック部分を担うコンポーネントを作った
	- 表示は任意の別のコンポーネントを使えるようにする

## 他に調べたコンポーネント

- [dcousens/react-timers](https://github.com/dcousens/react-timers): [公式で非推奨になっているMixin](https://facebook.github.io/react/blog/2016/07/13/mixins-considered-harmful.html)を使ってるのでナシ
- [uken/react-countdown-timer](https://github.com/uken/react-countdown-timer): 表示フォーマットを関数で設定するタイプ。実装は参考にした
- [StevenIseki/react-timer](https://github.com/StevenIseki/react-timer): 表示は固定フォーマット。タイマーの実装サンプルのような感じ
- [troch/react-timer-hoc](https://github.com/troch/react-timer-hoc): HOC(Higher Order Component)による実装。コールバックが無いけど理想に近い。正直コレで良かったけど、作った後に見つけたから仕方ない

## 実装の方針

- ~~タイマー機能は[公式のタイマーロジック実装](https://github.com/reactjs/react-timer-mixin)を（mixinじゃないかたちで）利用する~~
	- この実装を使うとTestがしにくかったので標準関数`setInterval`,`clearInterval`を使う
- タイマーの残り時間は`context`で子コンポーネントへ渡す

## 作ったもの

[noriaki/react-timer-component](https://github.com/noriaki/react-timer-component)

今後、[npm packageとして公開 ~~したい~~ した](https://www.npmjs.com/package/react-timer-component)。でもまだ`README`を書いてない。

## Demo/Usage

[noriaki/react-timer-component - Storybook](https://noriaki.github.io/react-timer-component/)
（なぜか`propType`の一覧表が上手く表示されてないのが気になる）

ミリ秒でカウントダウンする時間`remaining`を与え、表示用のコンポーネントを入れ子にして使う。

```js
<Timer remaining={20000}>
  <Countdown />
</Timer>
```

タイマー表示のための子要素`<Countdown />`では、`context`を読み取れるように`Countdown.contextTypes`を設定する必要がある。サンプルは以下。

```js
const Countdown = (props, context) => {
  const d = new Date(context.remaining); // auto passed context.remaining
  const { seconds, milliseconds } = {
    seconds: d.getUTCSeconds(),
    milliseconds: d.getUTCMilliseconds(),
  };
  return (
    <p>{`${seconds}.${milliseconds}`}</p>
  );
};

Countdown.contextTypes = {
  remaining: PropTypes.number,
};
```
#PlayFramework Anormを使う

Play FrameworkではAnormという便利なAPIがあって、そのAPIを追加する手順をサクッと紹介。

## Anormとは
簡単に言うと、Payとデータベースのアクセスをよりシンプルかつ高機能に提供するもの。
`SQL("SELECT * FROM users")` のようにそのままコードに書くことができるので可読性も高く、パースなどの機能も提供する。
## 追加手順
僕みたいな初心者が陥りがちなのが、以下のようにして追加できた気になるという。

```
import anorm._
```

けれども、これで実行すると

```
not found: object anorm
```

ってエラーが。
これは、build.sbt に以下を追記することで解決できた。

```build.sbt
libraryDependencies ++= Seq(
  jdbc,
  "com.typesafe.play" %% "anorm" % "2.5.1"
)
```

ただし、追記して

```
$ sbt compile
```

再度コンパイルする必要あり。
これで無事 Anorm を追加できました。
Tomcat8.5のログ出力をLog4j2.8以降に置き換える

# Tomcat8.5系のログ出力の変更点

Tomcat8.0系とは異なり、8.5系のログ出力は少々変更点があります。

* commons-logging実装に置き換えた
* 8.0系まで存在していたログ出力用のアダプタは拡張(extras)からなくなり、最初から同梱されている
 * 同梱先はなぜか bin ディレクトリにある tomcat-juli.jar
 * そのため、startup.batやstartup.shにて、わざわざクラスパスを追加している

今回これをLog4j2に置き換えますが、Log4j2.4以前の方法では、 **一切無視** されてしまいます。

# Log4J2.8.2から出力する方法

手順は次のとおりです。

1. log4j2のjarをTomcatへコピーする
2. log4j2の設定ファイルを配置する
3. log4j2の設定ファイルへのパスを環境変数に追加する

## 1. log4j2のjarをTomcatへコピーする

https://logging.apache.org/log4j/2.x/download.html より、log4j2の一式をダウンロード→解凍します。
次にTomcatの標準ログアダプタとして食わせるjarファイルと、Log4J2本体のjarを Tomcat8.5インストールディレクトリ( 以降、Tomcat起動bat|shファイルにならい、環境変数に定義している CATALINA_HOME とします )の lib へ以下3つを配置します。

* log4j-api-2.8.2.jar
* log4j-core-2.8.2.jar
* log4j-jcl-2.8.2.jar

## 2. log4j2の設定ファイル(log4j2.xmlやlog4j2.yml)を配置する

Log4j2の設定ファイル（通常は log4j2.xmlを使います）を作り、これを配置します。配置先はどこでも良いですが、わかりやすいように、CATALINA_HOME/conf の中へ配置します。

log4j2.xmlの設定例については、 [Qiita:Tomcatのログ出力をlog4j2に置き換える手順](http://qiita.com/sonodar/items/d591851db750fca0fb25) にもあります。適宜調整をしましょう。

## 3. log4j2の設定ファイルへのパスを環境変数に追加する

Tomcat起動ファイルである、startup.bat , startup.sh にて、環境変数を定義できる setenv.bat , setenv.sh を実行するよう定義されていますので、これらのファイルを **作成** します。

Windowsであれば次の1行を記述します

```bat:setenv.bat
SET JAVA_OPTS=%JAVA_OPTS% -Dlog4j.configurationFile=file://%CATALINA_HOME%/conf/log4j2.xml
```

設定項目は以上です。
startup.bat や startup.sh を実行すると、無事 Log4j2から出力されます。

# Tomcat8.0系まで有効だった手順で、やってはいけないこと

Tomcat8.0系までは、CATALINA_HOME/conf にある logging.properties を削除するか他の場所へ退避し、ログ出力用のアダプタを別途ダウンロードする必要がありましたが、これらの作業は不要になりました。むしろ **やってはいけません**（ログ設定が一切無視されるため）

# 参考文献
[Qiita:Tomcatのログ出力をlog4j2に置き換える手順](http://qiita.com/sonodar/items/d591851db750fca0fb25)
[Log4J|Commons Logging Bridge](https://logging.apache.org/log4j/2.x/log4j-jcl/)
[http://tomcat.apache.org/download-80.cgi#8.5.15](http://tomcat.apache.org/download-80.cgi#8.5.15)
Jenkinsで権限設定に失敗したときの対処方法

# はじめに

Jenkinsでアカウントの権限設定に失敗し（管理者権限のつけ忘れなど）、ログインすることができない、操作権限がなく何もできないといった状態に陥った場合の対処方法です。

# 手順
## 1. サーバーへアクセス

SSHでサーバーへアクセスする

## 2. 設定ファイルを開く

以下にあるコンフィグファイルを開く。

> /var/lib/jenkins/config.xml
> （$JENKINS_HOME）

## 3. セキュリティを無効化する

1. useSecurityタグ内ををFalseに変更する。
2. authorizationStrategyタグ内を削除する。
3. securityRealmタグ内を削除する。

## 4. Jenkinsを再起動させる

> sudo /etc/init.d/jenkins restart

## 5. Jenkinsにログイン

ブラウザからログイン。その後にセキュリティ設定正しく設定する。

# 参考
<a class="url" href="https://wiki.jenkins-ci.org/display/JENKINS/Disable+security ">https://wiki.jenkins-ci.org/display/JENKINS/Disable+security </a>
Swiftメモ AnyになったDictionaryからワンライナーで値を取り出す

```swift
func hoge() -> Any {
    return ["name": "aaa", "age": 10]
}

var d = hoge()
print(d)

// ワンライナーで値取得
(d as! [String: Any])["name"]   //=> "aaa"

// Anyなやつがホントは何か知る方法のイディオム(get class name)
String(describing: type(of: d)) //=> "Dictionary<String, Any>"
```
vCSA6.5に公開鍵/秘密鍵を使用してSSHで自動ログインする

[以前の投稿](http://qiita.com/negi_c/items/f9332b4a6308378bc36f)のvCenter Server Appliance 6.5版です。

vCSA6.5にTeraTermで自動ログインできるようにするための設定です。

#前提
* vCenter Server Appliance 6.5 (build-4944578)
* vCSAにはrootユーザでログインする
* vCSAのSSHはVAMIから有効化済み
* vCSAに公開鍵をアップロードするためにWinSCPを使用

#鍵の生成

1. TeraTermのウィンドウを開く

1. 新しい接続はしないでキャンセル

1. [設定] - [SSH鍵生成] をクリック

1. 開いたTTSSH:鍵生成ウィンドウの[生成]をクリック
(鍵の種類とビット数ははデフォルトのRSAと2048ビットでOK)

1. [鍵のパスフレーズ]と[パスフレーズの確認]を入力

1. [公開鍵の保存]をクリックして、任意のディレクトリに公開鍵を保存

1. [秘密鍵の保存]をクリックして、任意のディレクトリに秘密鍵を保存


#デフォルトのシェルをbashに変更

2. TeraTermで鍵を配置するvCSAにSSHでログイン

2. シェルをbashに変更
`> shell`

2. デフォルトのシェルをapplianceshからbashに変更
`# chsh -s /bin/bash root`

2. SSH接続を切断


#公開鍵ファイルをvCSAにアップロード
3. WinSCPで公開鍵ファイルを以下のファイル名でアップロード
`/root/.ssh/authorized_keys`

3. vCSAにSSHでログインし公開鍵ファイルとディレクトリの権限を変更
`# chmod 700 /root/.ssh/`
`# chmod 700 /root/.ssh/authorized_keys`

3. vCSAからログアウト

3. 再度TeraTermを開き、[RSA/DSA/ECDSA/ED25519鍵を使う]を選択して、[秘密鍵]を指定しログインできることを確認。
(ユーザー名はroot、パスフレーズは秘密鍵生成時のもの)


#TeraTermマクロで自動ログイン

以下のようなマクロファイルを作成する。

```
;============================================ 
; Filename    : ssh_connect-vcsa65.ttl 
; Description : SSH Auto login 
; Author      : MyName
; Created     : 2017/06/06
; modified    : 
;============================================ 
;; ユーザ名／パスワード設定 
HOSTADDR = 'vCSA6.5のIPアドレス' 
USERNAME = 'root'
PASSFILE = 'C:\work\ssh_key\password.dat' //パスワードを保存する任意のファイル名
KEY_FILE = 'C:\work\ssh_key\id_rsa' //作成した秘密鍵のファイル名
;============================================ 
;; ①パスワード取得 
getpassword PASSFILE USERNAME PASSWORD
 
;; ②コマンド組立て 
COMMAND = HOSTADDR 
strconcat COMMAND ':22 /ssh /2 /auth=publickey /user=' 
strconcat COMMAND USERNAME 
strconcat COMMAND ' /passwd=' 
strconcat COMMAND PASSWORD 
strconcat COMMAND ' /keyfile=' 
strconcat COMMAND KEY_FILE
 
;; ③サーバへ接続 
connect COMMAND
 
;; ④マクロ終了 
end

```

作成した.ttlファイルはttpmacro.exeに関連付けて実行。

初回のみパスフレーズの入力を求められるが、以降はマクロを実行するだけでvCSAにログインできるようになる。

#参考
vCenter Service Appliance 6.5 Tips and Tricks
http://www.virten.net/2017/02/vcenter-service-appliance-6-5-tips-and-tricks/
Amazon Dash Buttonでslack statusをぽちぽち変更する

## 概要

- Amazon Dash Buttonが押されたら、slack statusを「着席中」「離席中」で交互に更新するようにしました
- これをNode.jsで実装し、仕事で使っているマシン上で走らせるようにしました
    - https://github.com/abeyuya/amazon-dash-slack-status
- Dash Button押すの楽しい :smile: 

## 背景

全員がリモートワークの会社 (https://sikmi.com) で働いていています。
リモートワークということもあり、メンバーは常にdiscord(ボイスチャット)でオンラインになっています。(しかし、普段はもくもく部屋とかで皆さん仕事をしている。)
何か質問があったりすると、discordで気軽に「○○さんお疲れ様ですー。ちょっと質問があるのですが...」という感じで相手のいる部屋に凸してボイスチャットをする文化があります。

この時に相手がトイレやMTGなどで席を外していると、「あれ、離席中ですかね...？」と虚しい独り言となってしまい、MPが少し減るかもしれません。
また、slackに「急ぎ質問したいことがあるので、席戻ったら声かけてもらえると助かります！ :telephone: 」と書き込むことになったりします。

こうした課題への対応として、Amazon Dash Buttonを押してslack statusを楽に更新し、自身の着席・離席をリアルタイムに表現しようかなと思いました。

## 実装

https://github.com/abeyuya/amazon-dash-slack-status
↑こちらが実際に作ったのものです。
ボタンの押下イベントが発火したらslackAPIを叩くだけの非常にシンプルな実装になっています。

押下イベントの取得については、既存の素晴らしいライブラリがあったのでそちらを利用しました。
https://github.com/hortinstein/node-dash-button

本当はローカルマシンで走らせるのではなくAWS lambdaなどにスクリプトを設置してサーバレスにしたかったのですが、ライブラリの仕様上、LAN内でサーバを立ち上げておく必要があったため、このような実装になっています。
ライブラリの仕様というか、Dashボタンの仕様だと思うので、Web上で動かすのはちょっと難しそうだなぁと思いました。


## 感想

- slack status以外にも、トグルで何かを表現するような場合、Dashボタンは結構相性良さそう
- discordのAPIも叩いてプロフィール的な何かを更新するとより効果がありそう
- 通常の用途だと気軽にDasuボタン押せないけど、この用途だとめっちゃ気軽に押せて嬉しい


Dashボタンの用途の参考になれば幸いです。
c#のリフレクション

##リフレクションについて

リフレクションとは、メタデータを用いてデータにアクセスすることです。
リフレクションの使い方が分かると、動的言語話者が静的言語と仲良くなれると言われています~~[誰によって?]~~。
どんなときに利用したくなるか、どうやって利用するかを説明します。

##利用したくなるケース

```c#
class Character
{
    public int HP;
    public int Attack;
    public int Speed;
}
class Enemy
{
    public int HP;
    public int Attack;
    public int Speed;
}
```

上記のような2クラスがあり、`Character`から`Enemy`に攻撃する際のダメージを計算する関数を書くとします。

```c#
int CalcDamage(Character character, Enemy enemy)
{
    return (character.Attack - enemy.Speed / 4) * Random.Range(100, 156) / 256;
}
```

さて、`Enemy`から`Character`に攻撃する際のダメージを計算する関数も作りましょう。

```c#
int CalcDamage(Enemy enemy, Character character)
{
    return (enemy.Attack - character.Speed / 4) * Random.Range(100, 156) / 256;
}
```

全く同じような関数ができてしまいました。

##リフレクションの使い方

今回の問題の解決方法としては、`Character`と`Enemy`に共通のinterfaceを定義するか、親クラスを定義して継承するやり方が相応しいと思われます。
今回はリフレクションを解説する記事なので、強引にリフレクションを利用して解決してみます。

まず、c#には[`Type`というクラスがあります](https://msdn.microsoft.com/ja-jp/library/system.type.aspx)。
リフレクションはこの`Type`オブジェクトを取得するところから始まります。

```c#
int CalcDamage(object attacker, object receiver)
{
    Type attackerType = attacker.GetType();
    ...
}
```

c#では`object`に`GetType`メソッドが定義されていて、全てのオブジェクトの`Type`をこれで取得することができます。
上記の例の場合、`attacker`に`Character`オブジェクトを渡した場合、`Character`クラスの情報(メタデータ)を持った`Type`オブジェクトが`attackerType`に代入されます。

`Type`オブジェクトからクラスのメタデータを取得しましょう。

```c#
using System.Reflection;
...
    Type attackerType = attacker.GetType();
    FieldInfo hpField = attackerType.GetField("Attack");
```

`FieldInfo`クラスは`System.Reflection`namespaceのクラスなので、`using`を忘れずに追加します。
`Type`クラスには`GetField`メソッドが定義されており、これを使って変数の名前から`FieldInfo`オブジェクトを取得できます。
`FieldInfo`オブジェクトを利用すると、実際にオブジェクトに設定された値を取得したり、オブジェクトに値を設定したりできます。
それでは、リフレクションを利用した場合の実装例です。

```c#
int CalcDamage(object attacker, object receiver)
{
    FieldInfo attackField = attacker.GetType().GetField("Attack");
    int attack = (int)attackField.GetValue(attacker);
    FieldInfo speedField = receiver.GetType().GetField("Speed");
    int speed = (int)speedField.GetValue(receiver);
    return (attack - speed / 4) * Random.Range(100, 156) / 256;
}
```

注意したいのは、上記の例の`attackField`はあくまで`attacker`の`Type`の`Attack`変数のメタデータであり、`receiver`の`Attack`の取得には利用できないことです。
`Character`の`Attack`と、`Enemy`の`Attack`はそれぞれ別の`FieldInfo`ということです。

##まとめ

- `GetType`、`GetField`を利用して、変数名が同じなら型が違っても変数を取得できる。
- `GetProperty`を利用して、プロパティでも同じことができる。
- `GetMethod`を利用して、メソッドの呼び出しを行うことができる。
- c#4.0以降が利用できるのであれば、`dynamic`で同じようなことができる。
- 今回のようなパターンでは、リフレクションを使わずに設計を見直すほうが有効である。
相関関係を把握するためにスプレッドシートでできる相関分析手法

![相関分析.png](https://qiita-image-store.s3.amazonaws.com/0/160563/fc050af3-864d-a190-912f-3ebe719107dd.png)


#相関関係とは？

二つのものが密接にかかわり合い、一方が変化すれば他方も変化するような関係。
出典：[小学館](http://www.daijisen.jp/)

```html:qiita.rb
(例)
・気温が上がるとアイスクリームの売上がアップする
・役職が上がると年収が上がる
```
つまり、「AがあがればBもあがる」ということがわかれば、「Aのページに人を集めればBの申込数が増えるぞ！」なんて分析が可能。

#相関分析手法
お互いの数値の相関関係を調べるために利用する方法が「相関分析」。

##分析STEP
1.データを用意
2.散布図を作成
3.相関係数を算出

###1.データを用意
> ![データ準備.png](https://qiita-image-store.s3.amazonaws.com/0/160563/9a501d99-0dff-5e15-c39c-ac5566769182.png)
> ※データの数値は適当です

###2.散布図を作成
> ![散布図.png](https://qiita-image-store.s3.amazonaws.com/0/160563/e2a3641d-baaf-b112-4b07-41a39dbbd09d.png)

```text:qiita.rb
X軸：最高気温 Y軸：アイスクリームの売上
```
グラフを作成するときはできるだけ正方形にすると相関関係が見やすい
(パッと見、相関関係がありそう)

###3.相関係数を算出
> ![相関係数.png](https://qiita-image-store.s3.amazonaws.com/0/160563/d8b8ece2-d1fd-f5b6-849e-602e68ff4797.png)


```html:qiita.rb
<!-- 相関係数の算出方法 -->
=CORREL(Y軸のデータ,X軸のデータ)

<!-- 決定係数の算出方法(相関係数の二乗) -->
="相関係数"^2
```
####相関係数の目安
|相関係数(絶対値)|相関の強さの目安|
|:---|:---|
|0.3未満|ほぼ相関無し|
|0.3〜0.5未満|弱い相関がある|
|0.5〜0.7未満|相関がある|
|0.7〜0.9未満|強い相関がある|
|0.9以上|非常に強い相関がある|

今回の場合は、0.7以上なので「**強い相関あり**」と言える

##サンプルデータ
* [Googleスプレッドシート](https://goo.gl/rJMDv5)
[Unity] InstantiateしたGameObjectをUIの背面に表示したい備忘録

前回、Canvas内でImageをInstantiateする備忘録を書きました。
Kogarasi様、アドバイスいただきありがとうございました！

あれから、ちょちょっと手を加え、UIなども追加しました。
そこでまた問題が出てしまったのです。。。
InstantiateされたGameObjectがUIの前面に表示されてしまう問題。。。

#Canvas内にContainerを用意してInstantiateさせる
Canvas内は下に配置されればされるほど表示順が高くなる。
今回の原因はボタンを配置したのですが、Canvas内でボタンを一番下に配置しようがしまいがInstantiateしたGameObjectが無条件でCanvas内の一番下にCloneされてしまう。
どうにかボタンより上にGameObjectをCloneできないものかと。。。

今回は簡単に見つかりました。解決策。
参考にさせていただいたサイトは後ほど。

前回CanvasとGameObjectを親子要素で紐付けました。
それがどうやらいけないようでした。
今回はCanvas内にContainerを追加してその中でCloneさせることにしました。

前回
`prefab.transform.SetParent(canvas.transform, false)`
にしておりましたのでCanvasとの親子関係になっていました。

そこを
`prefab.transform.SetParent(Container.transform, false)`
に。
変更点は
Canvas.transformをContainer.transformにしました。

これで実行してみると、GameObjectがContainerとの親子関係となりContainerの中にCloneされるようになりました。
UIもGameObjectより前面に表示されました。
ここで注意したいのがContainerの位置です。
前面に表示させたいUIより下に配置してしまうと意味がありません。
必ず、前面に表示させたいUIより上に配置する。

##まとめ
今回は文字が多くなってしまった。
後で見返した時訳分からなくなりそう。。。
そのうち見やすく編集します。そのうち。。。

今回参考にさせていただいたサイト↓
http://gamenosirusi.blog.fc2.com/blog-entry-9.html

なんのこっちゃという人は前回の記事からお読みください↓
http://qiita.com/tibe/items/5e1ae977c31cdbec1e60
ASP.NETメモ　逆引きプロジェクトテンプレート表

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
このプロジェクト、どのテンプレートで作ったの？を見分けるのに役に立つかもしれない、
プロジェクトテンプレートと生成される主なファイルの対応表。

# <i class="fa fa-cubes" style="font-size:1em;"></i> 環境
* Visual Studio 2015
* .NET Framework 4.5.2

# <i class="fa fa-cubes" style="font-size:1em;"></i> ASP.NET 4.5.2 テンプレート

★印は他のテンプレートには無いので、見分けるのに使えそうなファイル。

|                     |                         | MVC | Web API | Azure API App | Azure Mobile App |
|---------------------|-------------------------|:---:|:-------:|:-------------:|:----------------:|
| App_Start           |                         |     |         |               |                  |
|                     | BundleConfig.cs         | ○   | ○       |               |                  |
|                     | FilterConfig.cs         | ○   | ○       |               |                  |
|                     | IdentityConfig.cs       | ○   | ○       |               |                  |
|                     | RouteConfig.cs          | ○   | ○       |               |                  |
|                     | Startup.Auth.cs         | ○   | ○       |               |                  |
|                     | Startup.MobileApp.cs    |     |         |               | ★                |
|                     | SwaggerConfig.cs        |     |         | ★             |                  |
|                     | WebApiConfig.cs         |     | ○       | ○             |                  |
| Controllers         |                         |     |         |               |                  |
|                     | AccountController.cs    | ○   | ○       |               |                  |
|                     | HomeController.cs       | ○   | ○       |               |                  |
|                     | ManageController.cs     | ★   |         |               |                  |
|                     | TodoItemController.cs   |     |         |               | ○                |
|                     | ValuesController.cs     |     | ○       | ○             | ○               | 
| Models              |                         |     |         |               |                  |  
|                     | AccountBindingModels.cs |     | ★       |               |                  | 
|                     | AccountViewModels.cs    | ○   | ○       |               |                  |
|                     | IdentityModels.cs       | ○   | ○       |               |                  |
|                     | ManageViewModels.cs     | ★   |         |               |                  | 
|                     | MobileServiceContext.cs |     |         |               | ○                | 
| Global.asax         |                         | ○   | ○       | ○             |                  |
| Project_Readme.html |                         | ○   | ○       |               |                  |
| Startup.cs          |                         | ○   | ○       |               | ○                |
macOS Sierraでの秘密鍵のパスフレーズ対応と、SSH keyのEd25519への変更

# 目的
macOS Sierraにアップデートしたところ、SSH通信をするたびに秘密鍵のパスフレーズを聞かれるようになり、対策を調べていたところ、せっかくなのでSSH key自体も現時点で世界最強のEd25519のものに変更しよう、という目的で書いた記事です。

# 前提
- macOS Sierra
- 今までのSSH keyはすべて消す
- SSH認証を使っているのはGitHubへの接続のみ

# 手順
## ssh-agentに登録されているSSH keyを削除
`ssh-add -l`で登録されているSSH keyを確認後、`ssh-add -D`で全て削除します。

## 【注意】キー自体を削除
`rm -rf ~/.ssh`でSSH keyのフォルダごと削除します。

## SSH KeyのフォルダとSSH key自体を作成
`mkdir -p ~/.ssh && ssh-keygen -t ed25519 -C "your_email@example.com"`でSSH keyのフォルダとSSH key自体を作成します。メールアドレスはGitHubで使用しているものに置き換えてください。

## 作成したSSH keyをssh-agentに追加
`eval "$(ssh-agent -s)"`で、ssh-agentをバックグラウンドで実行します。`ssh-add -K ~/.ssh/id_ed25519`で秘密鍵をssh-agentに追加します。

## SSH configファイルの追加と編集
`touch ~/.ssh/config`でconfigファイルを追加し、エディタで下記のように編集してください。

```text:.ssh/config
Host *
 AddKeysToAgent yes
 UseKeychain yes
```

## GitHubに公開鍵を追加
`cat ~/.ssh/id_ed25519.pub`を実行し、結果を全てコピーします。
https://github.com/settings/keys にアクセスし、New SSH keyをクリック、TitleにはPCの名前、Keyに先程コピーしたものをペーストしてAdd SSH keyをクリックします。

## 通信出来るかを確認
`ssh -T git@github.com`を実行します。
`Hi (your GitHub user name)! You've successfully authenticated, but GitHub does not provide shell access.`と出れば成功です。

# 参考
[Connecting to GitHub with SSH](https://help.github.com/articles/connecting-to-github-with-ssh/)
[Generating a new SSH key and adding it to the ssh-agent](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent)
[Working with SSH key passphrases](https://help.github.com/articles/working-with-ssh-key-passphrases/)
[macOS SierraでSSH鍵のパスフレーズの件](http://qiita.com/d6rkaiz/items/efb085b1a2eb3fddd70e)
[GitHubでEd25519鍵をつかう](http://jnst.hateblo.jp/entry/2014/12/15/200542)
[ssh-addで記憶した鍵を登録削除したい場合](http://qiita.com/tukiyo3/items/504cb9d51c8df22725bd)
[【SSH】ssh-agentの使い方を整理する](http://qiita.com/Yarimizu14/items/6a4bab703d67ea766ddc)
[SSHなるものをよくわからずに使っている人のための手引書](http://qiita.com/kenju/items/b09199c4b3e7203a2867)
Azure Web Apps で最新 Node.js バージョンを使う

さて、 [Node.js 8.0.0 version が 2017-05-30 にリリースされました。](https://nodejs.org/en/blog/release/v8.0.0/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29416/f1ade3b3-27ed-ae95-9362-cf5be4f35d99.png)

[Azure Web Apps](https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-web-overview) で早速使えるか試してみます。
該当のドキュメントはこの辺です。[Azure アプリケーションでの Node.js のバージョンの指定](https://docs.microsoft.com/ja-jp/azure/nodejs-specify-node-version-azure-apps)

# 結論

Azure Web Apps で最新の v8.0.0 がすでに利用可能でした。
しかも、2017-05-30 のリリースから、**3, 4日後に最新バージョンが利用可能に**なってます。

# 詳細

ドキュメント上では、Web App で Node.js のバージョンを指定する方法は下記の3つ。

* 1. `WEBSITE_NODE_DEFAULT_VERSION` にデフォルトバージョンが指定されているので、それを目的のバージョンに設定＆上書きする。
* 2. `package.json` の `"engines":{"node":version}` 部分に目的のバージョンを設定する。
* 3. `iisnode.yml` で任意の node.exe を使う。

結果的に、2 の方法で一番簡単に実現できました。package.json 上で変更すると、デプロイ先が複数ある場合に（例：dev, test,  staging, production）、想定外の設定忘れなどが無く、運用上良いかと思います。
検証するために、Node.js のコードは以下のような具合にバージョンを出力するようにしておきます。

```js:index.js
var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("Hello world on nodejs version " + process.version);
});

var port = process.env.PORT || 1337;
server.listen(port);
});
```

2017/06/06 の時点では、Web App デプロイ直後、環境変数
 WEBSITE_NODE_DEFAULT_VERSION は、6.9.1 でした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29416/c9ed0043-9b73-af81-8dc3-03986101b8e4.png)

もしここで、`package.json` の engines に以下のように 6.9.1 **以上**、というように指定していると、最新バージョン v8.0.0 で実行されます。つまり、優先度は、package.json > 環境変数 WEBSITE_NODE_DEFAULT_VERSION のように動作しています。

```json:package.json
    "engines": {
        "node": ">=6.9.1"
    }
```

```text:output
Hello world on nodejs version v8.0.0
```

特定のランタイムバージョンを固定して利用したい場合は、以下でOKです。Web App もこの設定に追随します。

```json:package.json
    "engines": {
        "node": "6.9.1"
    }
```

```text:output
Hello world on nodejs version v6.9.1
```

## ちなみに
Web App で利用可能なランタイムバージョンを調べるには、Kudu なりで、`D:\Program Files (x86)\nodejs` の下を確認すればOKです。

```
D:\Program Files (x86)\nodejs>ls -l | tail
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Apr  2 00:17 7.3.0
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Apr  2 00:17 7.4.0
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Apr  2 00:17 7.5.0
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Apr  2 00:17 7.6.0
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Jun  2 21:12 7.7.4
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Jun  2 21:11 8.0.0
-rwxr-xr-x 1 Unknown+User Unknown+Group 4699496 Jul 10  2012 node.exe
drwxr-xr-x 1 Unknown+User Unknown+Group       0 Apr  2 00:05 node_modules
-rwxr-xr-x 1 Unknown+User Unknown+Group     274 Jul 10  2012 npm
-rw-r--r-- 1 Unknown+User Unknown+Group     209 Jul 10  2012 npm.cmd
```

なんと、 `Jun  2 21:11 8.0.0` !!!
**2017/05/30 の最新 8.0.0 バージョンのリリースから、数日後（※コンソール出力のタイムゾーンはUTC）には利用できるようになっているではないですか。** 最新バージョンをいち早く使いたい場合でも、数日待てば使えるのであれば、それほど心配は要らないですね。
marignの相殺

####marginの相殺が起こるケース
*大きい方のmarginの値が適用される
・要素が上下に隣り合う時
・入れ子の時

####marginの相殺が起こらないケース
・floatが指定されている

・入れ子の時に、以下が親要素に指定されている
　・border 
　・padding 
　・overflow:hidden, scroll 
　・position:absolute, fixed (relative, staticは適用されない)


参考リンク
http://kojika17.com/2012/08/margin-of-css.html
Raspberry Pi で、Web カメラを使う

コマンドで使う場合
fswebcam をインストールします。

```
sudo apt install fswebcam
```

画像のキャプチャー

```bash
sudo chmod 666 /dev/video0
```
 
```bash
fswebcam photo.jpg
```

Python で使う場合
opencv をインストールします。

```bash
sudo apt install libopencv-dev
sudo apt install python3-opencv
```

実行プログラム

```py:usb_camera.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	usb_camera.py
#
#						Oct/17/2020
# --------------------------------------------------------------------
import sys
import cv2
#
sys.stderr.write("*** 開始 ***\n")
#
cc = cv2.VideoCapture(0)
#
rr, img = cc.read()
cv2.imwrite('photo.jpg', img)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

次の環境で確認しました。

```text
$ uname -a
Linux violet 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux
$ python3 --version
Python 3.7.3
```
Amazon Advertising APIを利用して、ISBNで商品を検索する

## 書籍を簡単に検索したい人へ
- Google Books APIを利用する方が簡単です
    - 参考 : https://manablog.org/google-books-apis/
- 一部の書籍が検索に引っかからなかったり、作成しようとしているアプリの要件を満たせないため、Amazon Advertising APIを利用しました

## 手順
1. リクエストに必要な`Access Key ID`・`Secret Access Key`を取得
    - 以下を参照してください
    - http://docs.aws.amazon.com/AWSECommerceService/latest/DG/becomingDev.html 
2. リクエストに必要な`Associate Tag`を取得
    - 以下を参照してください
    - http://docs.aws.amazon.com/AWSECommerceService/latest/DG/becomingAssociate.html
3. ItemLookUpオペレーションを利用して、必須パラメータを入力
    - 必須パラメータリスト: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/RequiredParameters.html
    - ItemLookupドキュメント: https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?RG_ItemAttributes.html

## 最終的なリクエストはこんな感じ
http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&Operation=ItemLookup&SubscriptionId=[Access Key Id]&AssociateTag=[Associate Tag]&ItemId=[ISBN]&IdType=ISBN&ResponseGroup=Images,ItemAttributes,Offers&SearchIndex=All
2017年になったのでそろそろCSSのレイアウトをおさらいする(CSS Flexbox Layout)

[cloudpack あら便利カレンダー 2017](https://cloudpack.github.io/benri2017/) 5日目の記事です。

最近めっきりfloatをレイアウト組に使わなくなりました。自分ではこの1年くらい書いた記憶がないです。
他のCSS関連の記事でもFlexbox, Grid Layoutのキーワードがみえてきたので、このあたりで今CSSでレイアウト組む場合の選択肢についてまとめようと思います。

#Flexbox Layout
こちらはざっくり説明すると親要素の直下の子要素に対し縦軸もしくは横軸に一律にコントロールしたいときにかなり威力を発揮します。

_以下サンプルは色の薄いboxが何もしていしない場合のスタイルです_
## justify-content(親要素に指定)
親要素全体に対して子要素を横軸でどう統一するかを指定します。よく使う`justify-content: center;`を指定した場合が以下の例です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35271/98fb3b3e-faf8-9523-531f-adec6f6a46d5.png)
[CodePen](https://codepen.io/nobu222/pen/awObBO)

## align-items(親要素に指定)
親要素全体に対して子要素を縦軸でどう統一するかを指定します。よく使う`align-items: center;`を指定した場合が以下の例です。
ちなみに`justify-content:center;`と組み合わせるとボックス全体の中心に配置することが出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35271/e0dd24b2-6612-a469-2ada-190b04228586.png)
[CodePen](https://codepen.io/nobu222/pen/PjqomQ)

## flex-grow(子要素に指定)
子要素の拡大率を他の子要素と__相対的に__決定されます。ちなみに`width`指定よりも優先されます。
相対的にというのがポイントで`flex-grow`の指定をもとにさらに後述の`flex-basis`、親要素の`flex-wrap`も影響を受けます。
あとに続く`flex-shrink` `flex-basis`も含めて相対的に決定されるためレスポンシブレイアウトに利用しやすい反面、固定レイアウトには少し使いづらくなっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35271/2cbba4df-71fa-ef5d-1cf4-101522de5a9d.png)
[CodePen](https://codepen.io/nobu222/pen/rwVNwN)

## flex-shrink(子要素に指定)
子要素の縮小率を他の子要素と__相対的に__決定されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35271/b40cff17-d762-7df8-eeb2-04e7919bda5a.png)
[CodePen](https://codepen.io/nobu222/pen/jwPOaJ)

## flex-basis(子要素に指定)
子要素の幅を任意に（%,pxなど）指定します。ただし親要素が指定の幅よりも小さい場合はそのとおりにはなりません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35271/a460f941-e8f0-05a7-9bda-5e23e6d1bfc4.png)
[CodePen](https://codepen.io/nobu222/pen/OgVJzE)

## その他
- flex-wrap 親要素に指定。子要素の幅合計が親要素の幅よりも大きい場合の折り返すかどうかの指定。流し込みレイアウト時などはこれを指定しています。
- flex `flex-grow` `flex-shrink` `flex-basis`のショートハンド指定
- order 子要素に指定することでレイアウトの順番を変更することが出来ます。window幅によって順番を変えたいときなどに重宝します。

以上がFlex Layoutの概要です。チートシート的に役立てれば嬉しいです。
【mysql: command not found】の解決策

# ■ 前提

mysql：homebrewでインストール済

# ■ 起きた問題

```terminal:terminal
$ mysql -u root -p パスワード
```
で `mysql: command not found` エラーが発生。

# ■ 解決

結論、以下コマンドで通る。ただ長いので、上記コマンドに置換したい。

```terminal:terminal
$ /usr/local/mysql/bin/mysql -u root -p パスワード
```

# ■ 解決までの手順

```terminal:terminal
$ vi ~/.bash_profile 
```

vimが開くのでキーボードの **i** を押す。(編集モード)

以下の行を追加する。

```vim:vim
alias mysql=/usr/local/mysql/bin/mysql
```

キーボードの **esc** を押す。(エスケープ)
キーボードの **:** → **w** → **q** を順番に押す。(保存)

# ■ 確認

```terminal:terminal
$ mysql -u root -p パスワード


/中略/


mysql> 
```

無事通りました。

以上

以下記事は別の要因でcommand not foundになった事例です。
とても参考になります。
→http://ema-hiro.hatenablog.com/entry/20170406/1491490645
httpd: Content-typeや処理時間を access_logに記載する

# やりたいこと

httpd(apache2.4)がブラウザに返却するコンテンツのヘッダ情報(Content-type)や処理時間が知りたい。

* ”Content-Type"を知ることで、Deflateする対象がわかったり([ここで利用](http://qiita.com/mishikawan/items/bf269a7816136b3dda35))
* 処理時間がわかることで、プログラムの遅延対象が判明する

# 実現手順
## コンフィグファイル修正 

Customlogで指定しているフォーマット(今回の例ではcombined)のLogFormatディレクティブに追記する。

```ruby:httpd.conf(修正前)
...
<IfModule log_config_module>
    ...
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    ...
    CustomLog "logs/access_log" combined
</IfModule>
...
```

|フォーマット|説明|
|----|----|
|%D|リクエストを処理するのにかかった時間、マイクロ秒単位(今回はこっちを採用)|
|%T|リクエストを処理するのにかかった時間、秒単位|
|%{Content-Type}o|応答のヘッダの Content-Type: の中身|

```ruby:httpd.conf(修正後)
...
<IfModule log_config_module>
    ...
    LogFormat "%h %l %u %t \"%r\" %>s %b %D \"%{Content-Type}o\" \"%{Referer}i\" \"%{User-Agent}i\"" combined
    ...
    CustomLog "logs/access_log" combined
</IfModule>
...
```
## 再起動

```
# service httpd restart
```

# 参考

LogFormatに記載するフォーマットが多数記載されています。用途に応じて利用しましょう。

[Apache モジュール mod_log_config](https://httpd.apache.org/docs/2.4/ja/mod/mod_log_config.html#page-header)
PHP Manual 読書会(6回目)(演算子#2)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回: [PHP Manual 読書会(5回目)(演算子#1)](http://qiita.com/amesho/items/da638432fe8aec00d0b0)

## 演算子#2

### [エラー制御演算子](http://php.net/manual/ja/language.operators.errorcontrol.php)

+ `エラー制御演算子@`を使用すると発生したエラーメッセージが無視される


通常の場合

```php
<?php

$file = file('hogehgoeoghoehgeheog.txt');
```

```
PHP Warning:  file(hogehgoeoghoehgeheog.txt): failed to open stream: No such file or directory
```

エラー制御演算子をつけた場合


```php
<?php

$file = @file('hogehgoeoghoehgeheog.txt');
```

なにもでない。

> set_error_handler() で自作のエラーハンドラを設定した場合は エラー制御演算子があってもそのエラーハンドラがコールされます。

と書かれているので、`set_error_handler`をつけると

```php
<?php

function myHoge($errno, $errstr, $errfile, $errline)
{
    print_r(array($errno,$errstr,$errfile,$errline));
    return;
}

set_error_handler("myHoge");

echo 1/0;
```

```
Array
(
    [0] => 2
    [1] => Division by zero
    [2] => /home/xxxxxxxxx/git/php_sample/operators/set_error.php
    [3] => 11
)
INF
```

このようにhookをかけられます。また、エラー制御演算子が存在していてもこの登録関数は呼び出されます。
WPS > error: error while loading shared libraries: libnetcdf.so.11: cannot open shared object file: No such file or directory

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
gcc version 4.9.2 (とgfortran): Software Collections (SCL) で有効にした状態
NCAR Command Language Version 6.3.0
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

WRF(Weather Research and Forecasting Model)に関して。
前処理のWPS実行でのエラー。

GFortran v4.9.2にてNetCDF v4.4.1.1をインストールした環境で、WPS実行時に以下のエラーが出る。

```
$ ./geogrid.exe 
./geogrid.exe: error while loading shared libraries: libnetcdf.so.11: cannot open shared object file: No such file or directory
```

参考: https://code.mpimet.mpg.de/boards/2/topics/939

.bashrcに以下を追加した。

```
# 2017/06/06 for geogrid.exe with GFortran v4.9.2
LD_LIBRARY_PATH=/usr/local/netcdf-4.4.1.1/gcc492/lib/:$LD_LIBRARY_PATH
```
printデバッグに最適! pythonで変数名を文字列にして、中の値と同時にprintする関数を実装

printデバッグをpythonで行う場合、以下のように書くことが多いのではないだろうか。

```py
print("hoge = " + str(hoge))
```

しかしわざわざダブルクォーテーションで囲ったり`str()`を用いたりするのは面倒である。
そこで、pythonインターフェースを開いたら、以下のような`chkprint`関数を記述しておくと良い。

# 1. 実装

```py
def chkprint(*args):
    flg = 1
    for obj in args:
        for k, v in globals().items():
            if id(v) == id(obj):
                target = k
                break
        if flg == 1:
            out = target+' = '+str(obj)
            flg = 0
        else:
            out += ', '+target+' = '+str(obj)            
    print(out)
```

この関数を一番最初に定義しておくだけ。

**(※2017/06/07追記 : 上記の関数はグローバル変数にしか対応していません。[shiracamus](http://qiita.com/shiracamus)さんのコメントに書かれている関数がローカル変数にも対応しているので、ここに記載します)**

```py
from inspect import currentframe

def chkprint(*args):
    names = {id(v):k for k,v in currentframe().f_back.f_locals.items()}
    print(', '.join(names.get(id(arg),'???')+' = '+repr(arg) for arg in args))
```



# 2. 挙動

```py
def chkprint(*args):
    flg = 1
    for obj in args:
        for k, v in globals().items():
            if id(v) == id(obj):
                target = k
                break
        if flg == 1:
            out = target+' = '+str(obj)
            flg = 0
        else:
            out += ', '+target+' = '+str(obj)            
    print(out)
    
    
if __name__=="__main__":
    a = 1
    lst = [3, 1, 4, 1, 5]
    chkprint(a)
    chkprint(lst)
    chkprint(a, lst)
```

```python:実行結果
a = 1
lst = [3, 1, 4, 1, 5]
a = 1, lst = [3, 1, 4, 1, 5]
```

こんな感じになる。
長いコードを動かしている途中でprintデバッグをはさみたくなった時、この`chkprint`関数は手軽に「変数名」と「その変数の中身」を同時にprintしてくれるので、とても便利であると思われる。

# 3. 詳細
上記の関数で、一体何をやっているのかの説明。

```py
for k, v in globals().items():
    if id(v) == id(obj):
        target = k
        break
```
この部分はすべて、変数`obj`を`"obj"`という文字列に変換するためのものである。
`globals()`とは、グローバル変数の一覧を辞書として返す「組み込み関数」である。

```py
>>> globals()
{ '__name__': '__main__', 'a': 1, 'lst': [3, 1, 4, 1, 5], '__package__': None, 
'__builtins__': <module 'builtins' (built-in)>, '__doc__': None, '__spec__': None}
```

この中で`v`の`id`が`obj`の`id`と一致した場合には、その時のkの値が変数名の文字列、ということになる。
(`id()`を付けているのは、「中の値は`obj`と同じだけれども変数名は`obj`と異なるような変数」が拾われてしまうのを避けるためである)

# 参考URL
 - [2. 組み込み関数 &#8212; Python 3.6.1 ドキュメント](https://docs.python.jp/3/library/functions.html)
OxyPlotのコントロール(PlotView)をリアルタイムにアップデートする方法

#はじめに
[OxyPlot](http://docs.oxyplot.org/en/latest/index.html)のコントロールPlotViewはバインドしたデータを変更しただけでは更新がされません。
この記事は変更したデータをリアルタイムに反映するための設定の備忘録です。

#変更したデータをリアルタイムに反映させる方法
[OxyPlot](http://docs.oxyplot.org/en/latest/index.html)の[このページ](http://docs.oxyplot.org/en/latest/common-tasks/refresh-plot.html)に記述してあります。
(1) ```PlotView```コントロールの```Model```プロパティを変更
(2) ```PlotView```コントロールの```Invalidate```を呼ぶ
(3) ```PlotModel```の```Invalidata```を呼ぶ

自分で設定したときに、上記説明と違ったので以下に例を載せます。
#具体例
```csharp:PlotViewRefreashExample.cs
var myPlotModel = new PlotModel(); //PlotModelの生成
myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Minimum = 0.0, Maximum = 1.0 }); //x軸の設定
myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Minimum = 0.0, Maximum = 1.0 }); // y軸の設定

plotView1.Model = myPlotModel; // --(1) , plotView1はPlotViewコントロール

LineSeries myLine = new LineSeries(); //データインスタンスを生成

myPlotModel.Series.Add(myLine); //データをPlotModelへバインド

for(int i = 0; i < 10; i++)
{

   myLine.Points.Add(new DataPoint(i, i)); //データの変更

   plotView1.Invalidate(); // --(2) , ここでデータの変更が反映され、PlotViewが更新される

   myPlotModel.Axes.Clear(); // 軸の変更のため、以前の設定をクリア
   myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Minimum = 0.0, Maximum = i }); //x軸の設定
   myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Minimum = 0.0 , Maximum = i }); //y軸の設定
   myPlotModel.InvalidatePlot(true); // -- (3) , ここで軸設定が反映され、PlotViewが更新される

}
```

例に示したように、PlotViewコントロールのInvalidateを呼ぶだけでは、軸の設定は反映されないので注意してください。
無から始めるKeras

# 無から始めるKerasについて

Python も Keras もわからないけれど、近年のありえんニューラルネットワークブームに追いつくために勉強しようと思って作りました。

初心者で何もわからない状態から始めていますので、あたたかく見守っていただき、疑問や不審な点があればどしどしご指摘いただければとおもいます。

環境は Debian 8.8 ＋ Python 3.4.2 ＋ Keras 2.0.5 ＋ TensorFlow 0.10.0 です。

# もくじ

1. [はじめての Keras](http://qiita.com/Ishotihadus/items/c2f864c0cde3d17b7efb)
2. [活性化関数、目的関数、最適化手法とは](http://qiita.com/Ishotihadus/items/d47fc294ca568536b7f0)
3. [Functional API で実装してみる](http://qiita.com/Ishotihadus/items/e28dd461a8ba27a2676e)
4. [学習された重みから手計算で推定する](http://qiita.com/Ishotihadus/items/ca8cc2e7b5b14ed51a2f)
5. [MNIST と EarlyStopping、バッチサイズ、DropOut](http://qiita.com/Ishotihadus/items/b171272b954147976bfc)
6. [CNN で MNIST](https://qiita.com/Ishotihadus/items/28feac1ee42111afbd11)
7. [リカレントニューラルネットワーク](https://qiita.com/Ishotihadus/items/f8a2fd1d071047413302)
Terraform メジャーアップデート チェック

![スクリーンショット 2017-06-06 17.29.46.png](https://qiita-image-store.s3.amazonaws.com/0/58788/fafda9b6-93d1-9fc3-19a3-8b288e9691f9.png "スクリーンショット 2017-06-06 17.29.46.png")
---

# Highlights
* Destroy Provisioners
* State Locking
* Interruptable Provisioners
* State Environments
* Remote State Revamp
* Provider Changes

## Destroy Provisioners
* リソースの作成または破壊の一部として、ローカルマシンまたはリモートマシン上でスクリプトを実行するために使用される。
	* 使いどころがいまいちピンとこない...!

## Remote State Revamp
* リモート状態の管理方法が大幅に変更
	* 後方互換正を持っているが、ver0.11でサポートが無くなるようです。
		* 0.9以降を使用している中で、削除対象機能を使っているとMSGが出るとのこと。
* `terraform remote config`が廃止され、RemorteBackendとしてtfファイルに記述できるようになった
	* 初期化とセットアップは、`terraform init`で一元化
		* Backend？という方は[こちら](https://www.terraform.io/docs/backends/index.html?_ga=2.20716795.21732889.1496652050-1530441161.1496652050)

## State Locking
* apply中にロック機能が働き、コンフリクトを回避する機能のようです
	* 自動で機能するので、ロックさせたくない場合は明示的に記述する必要があります。
		* `Usage: terraform force-unlock [DIR]`

## State Environments
* 開発中の変更をテストするための一連のリソースを分離するブランチ
	* マージはできない...!
	* 1つの大きな構成を複数の小さな構成に分割して、terraform_remote_stateデータソースと一緒にリンクする方が、管理しやすく安全という着想

## Providers
### Timeouts
* 今は、一部のリソースのみだが、タイムアウトを指定できる
	* リソースの作成、読み取り、更新、および削除のタイムアウトを構成できる。

### Interrupts
* 今は、一部のリリースのみだが、長時間実行されているリソースをCtrl-Cですぐに中断することが可能

### New providers and resources
* [changelog](https://github.com/hashicorp/terraform/blob/v0.9.0/CHANGELOG.md)


### Huge improvements
* 既存のリソースを大幅に改善
	* 例えばs、AWSインスタンスのサイズを強制的に破棄することなく変更可能になった
	* EC2に対して完全なIPv6をサポート

## Conclusion
* 2週間ごとにマイナーリリース
	* 全然枯れない...!
DockerでMongoDBを起動する


# 前提条件

- macOS Sierra version 10.12.1
- [Docker Toolbox](https://www.docker.com/products/docker-toolbox)がインストールされていること
- [Dockerホスト](http://qiita.com/tanakaworld/items/427b94ea0435b5dccfa2)が作成&起動されていること


# MongoDBセットアップ

## [Docker公式のMongoDbイメージ](https://hub.docker.com/_/mongo/)を使用

バージョンを指定しない場合は、最新版が自動的に選ばれる。

```console
$ docker pull mongo
```

## イメージ確認

```console
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mongo               latest              34ba9aead272        13 days ago         359.9 MB
```

## コンテナを起動する

Host OS ↔ Container 間のポートを変更して起動する。

```console
$ docker run -p 28001:27017 --name dev-mongo -d mongo
```

## コンテナの起動・接続確認

各バージョンのコンテナが起動していればOK

```console
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
58287b7282ce        mongo               "docker-entrypoint.sh"   8 minutes ago       Up 8 minutes        0.0.0.0:28001->27017/tcp   dev-mongo
```

mongoのコンテナ毎に接続できることを確認する。
`docker-machine ip dev` はDockerホストのIPアドレスを返す。

```console
$ mongo --host $(docker-machine ip dev) --port 28001
```

## コンテナの再起動

```console
$ docker start dev-mongo
```
React redux starter kit で認証画面を作るときのルーティング

### React redux starter kit でのルーティングで認証画面を挟んで、ログインページと、コンテンツページを分けるときに参考になったページをメモ

* childRoutes 配列内にコンポーネントのパスを入れて、`onEnter` パラメータに認証に失敗したときのパスなどの条件分岐をすればよいらしい。

```
function requireAuth (nextState, replace, callback) {
  const token = localStorage.getItem('@TOKEN')
  if (!token) replace('/')
  return callback()
}

// ...

export const createRoutes = (store) => ({
  path: '/',
  childRoutes: [
    // Authenticated
    {
      component: CoreLayout,
      onEnter: requireAuth, // add this
      indexRoute: Dashboard,
      childRoutes: [
        ProfileRoute(store),
        BillingRoute
      ]
    },
    // Not-authenticated
    {
      component: ModalLayout,
      childRoutes: [
        LoginRoute
      ]
    },
    // Other Not-authenticated routes
    HelpRoute,
    ContactRoute
  ]
})
```

参考ページ
https://medium.com/@peterpme/react-router-authentication-onenter-requireauth-plainroute-a-follow-up-to-a-github-issue-71ea3e7d59c9
ARKit性能

# 概要
WWDCで発表されたARKitを触ってみた感じ、他のARデバイス、SDKと比べてどんな感じかのメモ

# 詳細
ARKit実装方法は以下を参考
[UnityでiOSのARKitを動かす手順](http://qiita.com/arumani/items/aac7372a171e441e1f16)
理屈は以下を参照
[公式](https://developer.apple.com/documentation/arkit/understanding_augmented_reality?changes=latest_minor)
[classmethodさんのまとめ](http://dev.classmethod.jp/smartphone/iphone/understanding-arkit/)

## 触って見た感じメモ
- 3DObjectを空間に配置した時の動かなさはすごい、Tango, HoloLensに少しだけ劣るくらい、youtubeで公開されているプロモに嘘はない  
[ARKit demo](https://www.youtube.com/watch?v=RSXqyOi_GYY)
- マーカー認識機能などは今の所どうしたらいいのかわからない、Vision APIを使うのだろうか  
[Vision API](https://developer.apple.com/documentation/vision)
- iPhone 6sだとカメラがチカチカする・・・
- ドキュメントに説明がないので何が、どこまで、できるのかまだよくわからない
- Tango, HoloLensに比べるとはるかにカスタマーにリーチできるが、6s以上の端末が対象なので導入する際には意外と考えないといけない

# 感想
想像以上にすごい
Vuforiaと比べると3DObjectの固定具合は圧倒的
だが、まだできることがよくわからないので置き換えるイメージはわかない・・・

まだベータなので本リリースの時どこまでよくなっているか大いに期待はできる
Iptablesについて調べた

ファイヤーウォールのお勉強です

## Iptablesの仕組み
iptablesは、設定した幾つかのルールにnetwork trafficを照らし合わせる。そのルールは、そのコンピュータがパケットを受け入れるかどうかを決める。

それらのルールは、パケットのプロトコルや、そのパケットがどこに向かっているか（アドレス、ポート番号）、以前のパケットとの関係、などである。

それらのルールをパケットが満たした場合、行われるアクションが"target"と呼ばれる。acceptするかdropするか、など。また、ただログを取るだけなど、様々なtargetの選択肢がある。

このようなルール"chains"と呼ばれるグループにまとめられる。chainはパケットが次々にチェックされるルール。
パケットがあるルールを満たしたとき、そのルールに紐付けられれたactionを取る。なお、chains上のそれ以降の条件はチェックされない。

ユーザーは様々なchainsを定義できるが、デフォルトであるのは以下の３つ。

* INPUT:あなたのサーバーに入ってくるパケットを処理する
* OUTPUT:あなたのサーバーから発せられたパケットを処理する
* FORWARD:他のサーバーに向けられた（あなたのサーバーから発せられたものではない）パケットについて処理する

iptablesはモジュールを用いて接続をトラックすることもできる。

以降はINPUT chainsについて見ていく。

### IPv4とIPv6
IPv6はIPv4の進化版らしい。使えるIPアドレスの量が増えたり。Linuxのnetfilterはこれらのプロトコルを完全に分けて処理するそう。

ふつうの```iptables```コマンドはIPv4についての設定を行う。IPv6の設定をするには```ip6tables```を使う。

これら２つのコマンドのシンタックスは同じなので２つを設定するのはそんなにoverwhelmingではない

## 注意点
iptablesがパケットをどのように処理するかはだいたいこんな感じ；パケットを適切なchainに受け渡す→マッチするまでルールに照らし合わせる→もしマッチするルールがなければデフォルトのルールに従う

SSHでサーバーに接続してる場合はその接続もブロックしないように気をつけよう。

それぞれのchainのルールの順番に気をつけよう。はじめにより一般的なルールを書いてしまったら、後のより特別なルールは参照されないので。したがって、上の方により特別なルールを書いておこう。最も一般的なルールは、デフォルト・ポリシーである。


## 結論
さて、実際にiptablesの設定をするのが最も良い学習方法だろう。

# 参考
https://www.digitalocean.com/community/tutorials/how-the-iptables-firewall-works
情弱さんがiOS ARKit + Unityに挑んだよ

[UnityでiOSのARKitを動かす手順](http://qiita.com/arumani/items/aac7372a171e441e1f16)を参考に、Unity初心者(しかも普段はWindowsに環境作ってる)が、Build→iOSアプリ書き出しするまでの記録です。

# 情弱さんのOSはEl Capitanだった
Adobe Creative CloudとMac OSの相性問題があり、そのまま放置していたEl Capitanさん。書いてあるとおりにXcode9betaをダウンロードするも…ファイルの検査が待てど暮らせど終わらない。

もしかして：OS？

昼休みを挟んで2時間放置して諦めてOSをバージョンアップすることに。
さらばEl Capitanさん！…これユキヒョウだっけと最後までボケたけれどそれはSnow Leopardだ。

バージョンアップしてみると一瞬で検査が終わり、Xcodeのアプリが手に入った。
この時点でOSのバージョンは**10.12**。バージョンアップ直後はMacOSであろうとも初期バージョンだと学んだ。

Xcode betaのアイコンに利用できませんマークが出ていた。ベータだから？と無理に開こうとしたところ、アラートが出て教えてくれた。
**Xcode 9 beta**は**10.12.4**以降でないと動かないそうだ。
辛い。

## ぷろびじょにんぐふぁいる？

もう何年くらい前の話だろうか。3GSがでて半年くらいした頃、その頃に作った開発者アカウントはお金の力で健在だった。Xcodeのbeta版をすんなりダウンロードできたわけだから当たり前だ。
けれども証明書関係とデバイスの登録状況は古いままで既に使えない。これは待ち時間の間に作っておく。今も昔も先達さまは情弱さんに優しい。

参考： [開発用証明書(CER)を作成](http://qiita.com/takuyaWt/items/8cf6269834307ad084d5)

かつてやったことは全く覚えてませんでしたがね！

# 情弱さんはf1とp1の見分けがつかなかった

Xcode 9 betaのファイルサイズは5.29GB、OSのバージョンアップ→アップデートで1時間…気がつくと16時を回っている。ココカラはHoloLensのチュートリアルでなれているから簡単だろう…情弱さんだからそう考えてしまったのも仕方ない。。。

順調に参考にしたページのURLからパッケージをダウンロードしてimport(gitlabにあるのはパッケージングする前のファイルですね)。ココまで順調。

今マシンはUnityを今日入れた……Unityにパッチは当たってない。5.6.1f1だ。…参考にしたページにp1にしてねと書いてあった。…さんざんエラーがでた後の振り返りで気がついた。

この[p1のダウンロード](https://unity3d.com/jp/unity/qa/patch-releases)も2G近くため息がｗ

なお、2017/06/06の17時頃はUnityのフォーラムが落ちていた。。。何というタイミングだろう。辛い。

## Unityで配置するSceneは１つだけOK

duplicateになるので当たり前ですが、よく読んでないでシーンを2つ置いてなんでこんなにカオスなの？となるｗ よく読む大切！
それぞれ試せる機能が違うから、2つのアプリを書き出してしまうとよい。

# 情弱さん Xcodeの扱いを一切覚えていない。

AppID設定しないと走らないよねぇ。。。エラーを見てなんとかわかった。確かにcom.Company.ProductNameなんていう、hogehoge名では書き出せない。

## AppIDをどうにかする

自分のためにメモしておくと2つの方法がある。

1. Xcodeで変える  
プロジェクトアイコンを選び、ターゲットをUnity-iPhoneに変更する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10363/42b790f1-c0b6-ce72-a3bf-5830b21fef9a.png)
ターゲットを選べばApp IDは変更できる。
2. Unityで変える  
Build SettingでiOSを選んだらPlayerSettingsを開いて記入します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10363/e00fa62a-fee5-32e3-32e6-287c63f33a8b.png)

## Unityの吐き出すコードは最適化してもらう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10363/1dff4a5e-cab7-3736-b2af-79e7d17f2e80.png)
Perform Changesを押してきれいにしてもらおう

それでもwarningは大量に出る。いっぱいでてきても無視して大丈夫。進もう。

# 情弱さんは新しい機能の動く機種をチェックしない

Build→Runでスムーズにパブリッシュに成功。でも…なんかデバイス上で青いんですよね？
```
ARKit runs on the Apple A9 and A10 processors.
```
ハイ。iPod touch 第七世代はA8チップでした。本当にありがとう(ry

<img width="320" alt="IMG_0099.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/10363/c50752e7-36a3-7414-adf0-ac92365ce1c7.png">
対応してないデバイスだとこうなると…

# 最後に

* どの機種で動くかの確認は最初に！最初にしよう…
* マシンはメンテナンスが大切  
特にOSを作っているところのアプリを使いたい人はまめにアップデートしよう(当たり前)
* バージョン確認はしっかり  
ひと目でわかるようなf1とp1の違いを間違えてはいけない。
* Apple○○でもマメに自作アプリを更新しておくべき  
去年仕方なく買うまで最初のIntel MacBook pro現役で使っててどうにもならなかったのです

久々にXcode使って楽しかったのでまあいっかｗ