OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntuからsqlcmdとbcpを使う

「日本語テーブルなシステムあり得ねぇ。」と思っているイケてるWebエンジニアの皆さま、こんにちは。
Microsoft♡Linux。
MicrosoftはLinuxで動くSQL Serverのツール bcpとsqlcmdも提供してくれました。

ubuntuからbcpコマンドを使いcsvにExport、csvからテーブルにデータのImportをやってみたいと思います。
勿論、データベース名、テーブル名、カラム名、全て日本語です。

Ubuntu環境からbcpコマンド、sqlcmdコマンドを使ってみようと思います。

##環境

Server

- Windows2012R2 評価版
- SQLServer 2016 Express Edition
    - データベース名　日本語システム
    - テーブル名　タイトル
    - カラム名 タイトルno,タイトル

Client

- Ubuntu 16.04.2 LTS (x86_64)
- 下記のパッケージがInstall済み
    - msodbcsql
    - unixodbc-dev
    - mssql-tools

msodbcsqlやmssql-toolsのインストール等は[Microsoft公式ドライバーでUbuntuからSQLServerを見に行く](http://qiita.com/arachan@github/items/bce9841568f63902f80c)を参考にしてください。

##bcpコマンドは×つかえない sqlcmdは○使える
結論から言うとデータベース名、テーブル名が日本語の場合は使えません。
sqlcmdは日本語データベース名だろうと、日本語テーブル名だろうと問題なく使えます。

bcpの場合はカラム名だけが日本語の場合はCSVにexportできます。


##実験

###日本語名DB名、日本語テーブル名の場合

日本語名でデータベース名を付け、日本語名でテーブルを付けてみました。
これをbcpコマンドでexportしてみます。

```sql:日本語DB名、日本語テーブル名の場合
$ sqlcmd -S IPAddr -U sa -P Password
1> use 日本語システム
2> go
データベース コンテキストが '日本語システム' に変更されました。
1> select * from 名前
2> go
ID          名前
----------- --------------------
          1 yusuke
          2 Microsoft love Linux
```

```bash:csvにexportしてみる

$ bcp 日本語システム.dbo.名前 out name.csv -c -t ',' -S IPAddr -U sa -P Passowrd
SQLState = 37000, NativeError = 4060
Error = [unixODBC][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Sn�▒g▒BU▒_▒▒▒▒▒▒ "日本語システム" ▒▒Q~[▒�▒k1WW~W_
SQLState = 28000, NativeError = 18456
Error = [unixODBC][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]▒▒▒▒ 'sa' o�▒gM~[▒gW_

```

へんな文字化けとともに失敗しました。
SQLState = 37000, NativeError = 4060 SQL State = 28000 , NativeError = 18456 で検索を掛けると接続エラーみたいなのですが、僕には日本語DB名と日本語テーブル名が原因で繋がらないとしか思えなかった。

そこで、下記のテーブルを作成してもう一度Exportしてみることにした。

###日本語カラム名のテーブルをExport

```sql:日本語カラム名
~$ sqlcmd -S IPAddr -U sa -P Password
1> use test1
2> select * from namelist
3> go
データベース コンテキストが 'test1' に変更されました。
ID          名前
----------- --------------------
          1 yusuke
          2 Microsoft love Linux

```

下記のようにうまく動きます。

```bash:日本語カラム名のテーブル
$ bcp test1.dbo.namelist out name.csv -c -t ',' -S IPAddr -U sa -P Password

Starting copy...

4 rows copied.
Network packet size (bytes): 4096

```

下記のように中身も問題なし。

```bash:内容を表示
$ cat name.csv
1,yusuke
2,Microsort love Linux

```

###Windows Server上のbcpコマンドなら？

日本語DB名も日本語テーブル名も問題なくインポートできます。

```ps1:WindowsでデータをImport
PS > cat .\name.csv
1,yusuke

PS > bcp 日本語システム.dbo.名前 in c:\users\administrator\name.csv -c -t ',' -S localhost -T

コピーを開始しています...

1 行コピーされました。
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 15     平均 : (66.67 行/秒)
PS >

```

###参考サイト
[bcpユーティリティ](https://msdn.microsoft.com/ja-jp/library/ms162802.aspx)

[SQL ServerのBCPコマンド](http://aoki1210.hatenablog.jp/entry/20080807/p1)
Microsoftのは網羅的すぎて分かりずらいので、先ずはこちらで試してみた。
Ubuntu PHPから表示されないSQL Serverのフィールド

Microsoft公式のSQL Serverへ接続するPHPのドライバーを試しています。
Ubuntuからでもapt-get一発でインストールできるようになりました。
設定等は[Microsoft公式ドライバーでUbuntuからSQLServerを見に行く](http://qiita.com/arachan@github/items/bce9841568f63902f80c)を参照。
日本語で入力しているテキストが特定のField型だと表示しないことが分かりました。

なんとchar型のフィールドのデータだけ表示しないようです。
テキストを入れるデータ型でほかにも表示されないデータ型があるのでは？
と思い、調査してみました。

## 結果

|Field型|ASCII文字表示|日本語表示|絵文字表示|
|---|:-:|:-:|:-:|
|char|○|×|×|
|varchar|○|○|×|
|text|○|○|×|
|nchar|○|○|○|
|ntext|○|○|○|
|nvarchar|○|○|○|


## 調査方法
以下のように各種データ型のフィールドを持ったTableを作成していく。
PHP側から表示ができるか確認する。

```sql:テーブル作成
use 日本語システム

Create table タイトル(
ID int identity(1,1) not null primary key
,char char(20)
,varchar varchar(20)
,nchar nchar(20)
,nvarchar nvarchar(20)
,text text
,ntext ntext
);

insert into タイトル(
char,
varchar,
nchar,
nvarchar,
text,
ntext
)
values
(
'ASCII Char',
'ASCII Char',
'ASCII Char',
'ASCII Char',
'ASCII Char',
'ASCII Char'
)
,(
'㈱とか',
'㈱とか',
'㈱とか',
'㈱とか',
'㈱とか',
'㈱とか'
)
,(
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux'
);
```

```php:実行するPHP
<?php
$serverName = "IPAddr";
$connectionOptions = array(
    "Database" => "日本語システム",
    "Uid" => "sa",
    "PWD" => "Password"
);

//Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if($conn)
    echo "Connected!";

$tsql="SELECT * FROM タイトル";
$getProducts = sqlsrv_query($conn, $tsql);

if ($getProducts == FALSE)
   die(FormatErrors(sqlsrv_errors()));

$productCount = 0;

while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC))
{
     print_r($row);
     $productCount++;
}

sqlsrv_free_stmt($getProducts);
sqlsrv_close($conn);


function FormatErrors( $errors )
{
    echo "Error information: ";

    foreach ( $errors as $error )
    {
        echo "SQLSTATE: ".$error['SQLSTATE']."";
        echo "Code: ".$error['code']."";
        echo "Message: ".$error['message']."";
    }
}

?>
```

```bash:実行結果1
$ php show.php
Connected!Array
(
    [ID] => 1
    [char] => ASCII Char
    [varchar] => ASCII Char
    [nchar] => ASCII Char
    [nvarchar] => ASCII Char
    [text] => ASCII Char
    [ntext] => ASCII Char
)
```

あれ？
1行しか表示していない。
char型のフィールドに格納されている文字をnullにしてしまおう。

```sql:char型の2行目のデータをnullに
$ sqlcmd -S IPAddr -U sa -P password
1> USE 日本語システム
2> go
データベース コンテキストが '日本語システム' に変更されました。
1> UPDATE タイトル SET char = null WHERE ID=2
2> go

(1 rows affected)
1> quit

```

```bash:実行結果2
$ php test.php
Connected!Array
(
    [ID] => 1
    [char] => ASCII Char
    [varchar] => ASCII Char
    [nchar] => ASCII Char
    [nvarchar] => ASCII Char
    [text] => ASCII Char
    [ntext] => ASCII Char
)
Array
(
    [ID] => 2
    [char] =>
    [varchar] => ㈱とか
    [nchar] => ㈱とか
    [nvarchar] => ㈱とか
    [text] => ㈱とか
    [ntext] => ㈱とか
)
Array
(
    [ID] => 3
    [char] => Microsoft?Linux
    [varchar] => Microsoft?Linux
    [nchar] => Microsoft❤Linux
    [nvarchar] => Microsoft❤Linux
    [text] => Microsoft?Linux
    [ntext] => Microsoft❤Linux
)
```

char型に日本語文字列を入れるとその文字以降表示しないということが分かった。
nの付く型では絵文字が問題なく表示できるが、それ以外だと?に変換されてしまうようだ。
[Git]カレントブランチをブランチ名を指定せずにプッシュする

# 追記

コメントで以下のコマンドで同じことができると教えていただきました！！
こちらのほうが遥かに簡潔ですね

```
$ git push origin HEAD
```

参考: [まだ git push origin するときに current branch 名を入力して消耗しているの?](http://qiita.com/mabots/items/76d48aa33720287253bf)

# 追記2

同僚に以下の設定をするのが一番楽と教えていただきました

```
$ git config --global push.default simple
$ cat ~/.gitconfig | grep default                                                                  # Use the Git 1.x.x default to avoid errors on machines with old Git
    # `git config --global push.default simple`. See http://git.io/mMah-w.
	default = simple
```

Git v2.0 からは `simple` がデフォルト設定になっているとのことですが、
一応設定しておいたほうが安心できますね。


現在のブランチ名は以下のコマンドで取得できる

```
$ git rev-parse --abbrev-ref HEAD
```

# カレントブランチにpush

```
$ git push origin $(git rev-parse --abbrev-ref HEAD)
```

fish では  `$()` でコマンド展開できないので以下のようにかく

```
$ git push origin (git rev-parse --abbrev-ref HEAD)
```

エイリアスに登録

```
$ balias gpoc 'git push origin (git rev-parse --abbrev-ref HEAD)'
```
Scala のラムダ式は trait に自動変換できる

ぼくが昨日知った Scala の変態記法をお知らせします。

```scala
scala> trait A { def greeting(name: String): String }
defined trait A

// これは普通
scala> val a1: A = new A { def greeting(name: String): String = "Hello, " + name }
a1: A = $anon$1@5c0f79f0

scala> a1.greeting("Serval")
res0: String = Hello, Serval

// ！！！？！？！？！？？！？！？？！！？！？
scala> val a2: A = { name: String => "Hello, " + name }
a2: A = $$Lambda$1050/812031404@629adce

scala> a2.greeting("Arai-san")
res1: String = Hello, Arai-san

// なにこれ！すごーい！
scala> val a3: A = "Hello, " + _
a3: A = $$Lambda$1051/777970377@55a609dd

scala> a3.greeting("Fennec")
res2: String = Hello, Fennec
```

abstract method が一つだけ定義された trait は、ラムダ式から変換できるらしい。 @xuwei_k 先生曰く、2.12 から入った機能とのこと。 **SAM conversion** と呼ばれている。

## SAM Conversion
SAM (single abstract method) conversion の仕様は言語仕様に記述されている。適当に訳してみる。

http://www.scala-lang.org/files/archive/spec/2.12/06-expressions.html#sam-conversion

>
### SAM conversion
型 `(T1, ..., TN) => T` の式 `(p1, ..., pN) => body` は以下を満たすとき、期待される型 `S` に SAM変換可能である。
>
* `S` のクラス `C` がシグネチャ `(p1: A1, ..., pN: AN): R` の抽象メソッド `m` を一つ宣言している
* `C` は `m` の他に抽象値メンバーを宣言・継承していない
* `S` のサブタイプ `U` であって、式 `new U { final def m(p1: A1, ..., pN: AN): R = body }` が正しく型付けされる（期待される型 `S` に合致する）こと
* スコーピングのために、 `m` が static メンバーとして扱われること（`U` のメンバーが `body` のスコープ内に現れないこと）
* `(A1, ..., AN) => R` が `(T1, ..., TN) => T` のサブタイプであること（この条件を満たすことで `S` の未知の型パラメータの型推論を行う）
>
SAM の対象となる関数リテラルは、上記のインスタンス生成式にコンパイルされるとは限らないことに注意せよ。これはプラットフォーム依存である。
>
ここから以下のことが言える。
>
* もしクラス `C` がコンストラクタを定義しているなら、それはアクセス可能であり、唯一の空の引数リストを定義しなければならない
* `C` は `final` や `sealed` であってはならない（単純のため、SAM変換がその sealed class と同じコンパイル単位で行えるかどうかを問わないことにする）
* `m` はポリモーフィックであってはならない
* `C` の未知の型パラメータの推論を行うことで、 `S` から完全型 `U` を導出できなくてはならない
>
最後に、いくつかの実装上の都合による制約を課す（これらは将来のリリースで撤廃されるかもしれない）。
>
* `C` はネストしていたり、ローカルであってはならない（0引数コンストラクタとなるよう、環境をキャプチャしてはならない）
* `C` のコンストラクタは implicit 引数リストを持ってはならない（これは型推論を簡略化する）
* `C` は自分型を宣言してはならない（これは型推論を簡略化する）
* `C` は `@specialized` であってはならない

## 例

抽象メソッドが一つだけであれば、他にメソッドが生えていてもいいらしい。抽象メソッドの引数も1つである必要もない。

```scala
scala> trait B {
     |   def greeting(place: String, species: String, name: String): String
     |   def speak: String = "みゃみゃみゃみゃみゃ"
     | }
defined trait B

scala> val b: B = { (p: String, s: String, n: String) => s"ここは${p}！わたしは${s}の${n}だよ"}
b: B = $anonfun$1@ed2f2f6

scala> b.greeting("ジャパリパーク", "サーバルキャット", "サーバル")
res7: String = ここはジャパリパーク！わたしはサーバルキャットのサーバルだよ

scala> b.speak
res8: String = みゃみゃみゃみゃみゃ
```

しかし、SAM変換可能なのは関数リテラル `(p1, ..., pN) => body` だけであることに注意。一般の FunctionN インスタンスをSAM変換することはできない。

```scala
scala> trait C { def speak(): String }
defined trait C

scala> val c1: C = { () => "アライさんに任せるのだ！" }
c1: C = $$Lambda$1135/2085013955@7197b07f

scala> val fn: Function0[String] = { () => "ふえぇぇぇぇぇ！？" }
fn: () => String = $$Lambda$1136/1695195255@7ce29a2d

scala> val c2: C = fn
<console>:13: error: type mismatch;
 found   : () => String
 required: C
       val c2: C = fn
```

リリースノートによれば、これは Java 8 のライブラリを便利に呼び出すのに使えるそうだ。SAM変換によって、 Runnable のインスタンスを簡単に作ることができる。

## 参考文献
* http://www.scala-lang.org/files/archive/spec/2.12/06-expressions.html#sam-conversion
* http://eed3si9n.com/ja/scala-2.12.0
Azure Invoice APIで請求書取得


本日Azureにログインしたところ、以下のポップアップがでてきました。
![image](https://qiita-image-store.s3.amazonaws.com/0/119101/dfef55a5-95cd-945e-a7d2-e226a145f95a.png)

Billing Readerという課金情報が取得できるとロールとInvoice APIが使えるということらしい。
毎月請求書をアカウントセンターというところから取得しているのですが、これで自動的に取れるかもということで
試してみました。（メールで請求書送ってくれるけど、クレジットカードの請求と合わせて処理しているので、１個前のやつが欲しい）
以下APIドキュメント
https://docs.microsoft.com/en-us/rest/api/billing/invoices
list, getができるみたいです。

## 有効化
デフォではこの機能が無効になっているので、有効化する。
![image](https://qiita-image-store.s3.amazonaws.com/0/119101/07eb50ae-091b-5945-c2e9-be7f4271101d.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/119101/2e67883f-a511-20d9-0777-669f81075a17.png)



## テスト
とりあえず最新のを取得できるかテスト。

billing readerロールでアカウントを作成。

```
az ad sp create-for-rbac -n billing --role "billing reader"
```

アクセストークンを取得

```
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials&resource=https://management.core.windows.net/&client_id=$appid&client_secret=$secret" https://login.microsoftonline.com/$tenant/oauth2/token?api-version=1.0
```

請求書最新版ダウンロード

```
 curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" https://management.azure.com/subscriptions/$subscriptionid/providers/Microsoft.Billing/invoices/latest\?api-version\=2017-02-27-preview
```
すると以下のようなレスポンスが。

```json
{
  "id": "/subscriptions/さぶすくid/providers/Microsoft.Billing/invoices/201705-217671190373201",
  "type": "Microsoft.Billing/invoices",
  "name": "201705-217671190373201",
  "properties": {
    "downloadUrl": {
      "expiryTime": "2017-04-27T08:39:57Z",
      "url": "https://billinginsightsstore08.blob.core.windows.net/invoices/さぶすくid-217671190373201.pdf?sv=2014-02-14&sr=b&sig=NEK1Qfvgg85Xds878h3Dh34dQ%2B7gqXMvXgQ0s0nsSI%3D&se=2017-04-27T08%3A39%3A57Z&sp=r"
    },
    "invoicePeriodEndDate": "2017-03-18",
    "invoicePeriodStartDate": "2017-02-19"
  }
}
```
sas付きのblobのurlがかえってくるので、ここからpdfがダウンロードできます(一応sasちょっと変えてます)。

これでAzure Functionで毎月請求書取ってきて、blobかどっかのストレージに格納するか、Logic Appsからメールで送ればはかどりそうですね。
LINE BOT to Wordpress on Azure

以下のサイトを参考にLINE BOTを作成してみましたが
当方の環境ですと躓いてしまったので回避策を残しておきます。

■【PHP】LINE BOTの作り方 on Messaging API
http://ysklog.net/line_bot/4551.html

# 環境
Azureサーバ上にWordpressを立てて
そこにCallback.phpを設置

# 躓いたところ
LINEのreply用アドレスにcurl接続する際、証明書エラーが発生しました
※curlエラーの60番

なのでcurl_setoptに以下を追加したところ改善

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
※証明書エラーを無視する

セキュリティ的にどうなん？って感じですが
とりあえず動きました。
logrotateで`removing old log`しようとするとエラーが出る

# 概要
nginxのログファイルを調べていたら、正常にローテートできているものとそうでないものがあった。

# 環境
CentOS 6.5

# 原因
デバッグモードで動かしてみたところ、下記のエラーが出ていた。

```
$ logrotate -d /etc/logrotate.d/nginx
```

```
removing old log /var/log/nginx/hoge.access.log.53.gz
error: error opening /var/log/nginx/hoge.access.log.53.gz: No such file or directory
```

ログファイルを消そうとしているけど存在しないって言われている。

# 設定ファイル

``` /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 644 maro maro
        sharedscripts
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}
```

'missingok'は入れているが、削除しようとした場合はエラーを出すようだ。

# 結論
'/var/lib/logrotate.status' に、ローテートの状況が残ったままでログが手動で削除されたっぽい(誰かの手によって)。

# 対処法
'/var/lib/logrotate.status' このファイルを退避させて再生成したらうまく回るようになった。

# 備考
ログファイルのパーミッションが原因だとばかり思い込んでいた。
Pythonのインストール方法[Windows]

#概要
Pythonのwindowsへのインストール手順がだいぶ便利になっていたので，一連の動作を他人に説明するためのメモ書きとしてインストールから初めの一歩までを記します．

#今回インストールするもの
Python本体
Pythonの便利なライブラリ
- numpy
- scipy
- matplotlib
- seaborn
- pandas
Pythonを書くためのエディタ

#Python本体のインストール
##Pythonのインストール
[Python公式サイト](https://www.python.org/downloads/ "Python.org")からインストーラーをダウンロードしてください．
※バージョンに関しては個人の好みですが，私個人の推奨はPython3系です．
ダウンロードが終了したら，そのPythonインストーラーを起動します．
下の方にある`add python ○.○ to PATH`にチェックを入れると自動でパスの設定をしてくれます（画像はバージョン3.6）
![intro_python.jpg](https://qiita-image-store.s3.amazonaws.com/0/178461/56aa232e-6a49-0c2a-2ced-450c1985a1ed.jpeg)

`Install Now`をクリックしてインストールを開始し，完了したらPythonのインストールは終了です．

##インストールできたかの確認
[Windows]+[R]で出てきたやつに`cmd`と打ちエンターを押しコマンドプロンプトを立ち上げます．
その画面に`python -h`と打ち込んで色々ヘルプが出てきたらオッケーです．

#便利なライブラリのインストール
pythonには便利なライブラリがたくさんあります．
その中からいくつか入れておくと便利なものの紹介とインストール方法を紹介します．
基本的にライブラリ類のインストールはコマンドプロンプトで`pip install ライブラリ名`でインストールできますが一部例外があります．
##numpy
numpyは行列の扱いが得意なライブラリです．使い慣れると便利でよく使うものの一つです．
pipでもインストールは可能ですが後述のライブラリ類を使用するときにエラーが出るので下記の方法をお勧めします．
[このサイト](http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy "numpy")にアクセスし対応するバージョンのものをダウンロードします．（cp○○の部分がバージョンでPython3.6なら36となっているものを選びます）
コマンドプロンプトに`pip install ダウンロードしてきたファイル`とするとインストールが開始されます．
（ダウンロードしたファイルをコマンドプロンプトへドラック＆ドロップするとパスが自動的に書かれます．）

##scipy
scipyはフーリエ変換などの数値計算が得意なライブラリです．
pipだとエラーが出るので下記の方法でインストールします．
[このサイト](http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy "scipy")にアクセスし対応するバージョンのものをダウンロードします．（cp○○の部分がバージョンでPython3.6なら36となっているものを選びます）
コマンドプロンプトに`pip install ダウンロードしてきたファイルのパス`とするとインストールが開始されます．
（ダウンロードしたファイルをコマンドプロンプトへドラック＆ドロップするとパスが自動的に書かれます．）

##matplotlib
matplotlibはグラフの描画ができるライブラリです．可視化が容易のため表現の幅が広がります．
matplotlibはコマンドプロンプトに`pip install matplotlib`と入力するとインストールできます．

##seaborn
seabornはmatplotlibで描画する際にいい感じにきれいにしてくれます．
pipだとうまくいかないので[このサイト](http://www.lfd.uci.edu/~gohlke/pythonlibs/#seaborn "seaborn")からseabornのファイルをダウンロードします．
コマンドプロンプトに`pip install ダウンロードしてきたファイルのパス`とするとインストールが開始されます．
（ダウンロードしたファイルをコマンドプロンプトへドラック＆ドロップするとパスが自動的に書かれます．）

##pandas
pandasは統計処理を得意とするライブラリです．データに対する処理が楽になります．
pandasはコマンドプロンプトに`pip install pandas`と入力すると入ります．

##インストールできたかの確認
コマンドプロンプトに，`python`と打ち込みPythonの環境を立ち上げる．
`import ライブラリ名`で何もエラーが出なければインストール完了です．

#エディタのインストール
Pythonのコードを書くにはテキストエディタと呼ばれるメモ帳の強化版のようなものを使用します．
私が使用しているのは[atom](https://atom.io/ "atom")というものです．
他にも[sublimeText](https://www.sublimetext.com/ "sublimeText")やVim，Emacsなどもありますが，初心者に優しいのはatomかsublimeTextだと思います．
何かしらのエディタを入れたら準備は完了です．

#はじめの一歩
ではPythonで初めの一歩をやってみましょう．
お好きなエディタを開き，以下のように書き`test.py`という名前で保存します

```py3:test.py
print("hello world!")
```

コマンドプロンプトを立ち上げで，`test.py`がおいてあるフォルダへ移動します．
※移動するには`cd ディレクトリのパス`と打ち込みます．

そしてコマンドプロンプトに以下のように入力してpythonを走らせます．

```:in[1]
python test.py
```

以下のように出てくれば無事Python入門完了です．

```:out[1]
hello world!
```

お疲れ様でした(^^)
CentOS7でLodgeを導入したら記事を登録できなかった

# 原因：Solrが正常に動作していなかった。
### 対応1：yumのJDK1.8 → 公式のJDK1.8
参考:http://stackoverflow.com/questions/34958993/solr-sunspot-runs-but-wont-start
### 対応2：「config/sunspot.yml」の「path: /solr/production」→「path: /solr/default」
参考:http://stackoverflow.com/questions/19759906/rails-app-solr-throwing-rsolrerrorhttp-404-not-found-when-executing-searc

## 詳細

ログを見ると、「Connection Refused」が発生していた。

```
I, [2017-04-27T09:49:17.162558 #2495]  INFO -- : Completed 500 Internal Server Error in 86ms (ActiveRecord: 17.9ms)
F, [2017-04-27T09:49:17.165441 #2495] FATAL -- :
RSolr::Error::ConnectionRefused (Connection refused - {:data=>"<?xml ...
```

JDKが合ってないとダメみたいなので、wgetでダウンロードしたJDKに変更。

```
# alternatives --config java

  選択       コマンド
-----------------------------------------------
*  1           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el7_3.x86_64/jre/bin/java)
 + 2           /usr/java/jdk1.8.0_131/jre/bin/java
```

今度は「404 Not Found」が発生。

```
RSolr::Error::Http (RSolr::Error::Http - 404 Not Found
Error:     Not Found
```

sunspot.ymlの「path: /solr/production」が変わってるみたいなので、「path: /solr/default」へ変更。

```
production:
  solr:
    hostname: localhost
    port: 8983
    log_level: INFO
    path: /solr/default
    # read_timeout: 2
    # open_timeout: 0.5

development:
  solr:
    hostname: localhost
    port: 8982
    log_level: INFO
    path: /solr/development

test:
  solr:
    hostname: localhost
    port: 8981
    log_level: WARNING
    path: /solr/test
```

これで私は登録できるようになりました。
【初心者】ターミナル起動後、vagrantを立ち上げる場合

ターミナルを起動した場合

vagrant plugin install vagrant-vbguest

cd

cd MyVagrant

cd MyCentOS

sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile

vagrant up

vagrant status

vagrant ssh

ip a

IPアドレスが192.168.33.10になっていればOK
phpビルトインサーバーでphp.iniの設定で日本語文字化けを解決


次のようなphp.iniを用意する

```ini:php.ini
; php.ini
default_charset = UTF-8
mbstring.internal_encoding = UTF-8
```

php.iniを読み込んでビルトインサーバーを起動
>php -S localhost:8888 -c php.ini

以上
テスト（JEST,Jasmine）のtoHaveBeenCalledWithとtoBeCalledWithの違い

#toHaveBeenCalledWithとtoBeCalledWithの違い

- toHaveBeenCalledWithはjasmine
- toHaveBeenCalledWithはspyが呼ばれたかを確認する
- toBeCalledWithはjest
- toBeCalledWithはモック関数が呼ばれたかを確認する

##ユースケース
- 親コンポーネント
 - 子コンポーネント

親コンポーネントから子コンポーネントに関数をpropsで渡していて、
子コンポーネントでpropsで渡された関数をテストする時はjestの方。
理由はspyが仕込めないから。
spyOnでオブジェクトに入り込み、監視対象メソッドをspyに書き換えるけど、propsは書き換えられないようです。
jestの方であれば、spyを仕込まなくてよくて、ダミー関数をjest.fn()で作成して、そのダミー関数が呼ばれたかを確認すればいい。




参照先
[jasmine](https://jasmine.github.io/2.0/introduction.html)
[jest](https://facebook.github.io/jest/docs/mock-functions.html)




reactもテストも初めてだから、メッチャわけ分からんかった。
ドキュメントが英語しかないから、大学受験の英語やっといてよかったな〜と思いました。
話したりは無理だけど、簡単になら読めるので。
英語の勉強も頑張ろうと思います。
Firebaseを使う～Firebaseの機能一覧編～

# 情報元
Firebase
https://firebase.google.com/

# Firebaseとは

公式：
https://firebase.google.com/features/

公式の情報によると、様々なプラットフォームに対応したツールやインフラストラクチャを提供している。
今回はAndroidにフォーカスすると、以下の機能がAndroidに提供されている。
機能によっては無料機能も存在する。

料金に関しては下記を参照。
https://firebase.google.com/pricing/


## Analytics
アプリの利用状況を解析してくれる

## Develop
### Cloud Messaging
Androidにプッシュ通知するサーバの機能
### Authentication
様々なサービスにログインする機能

* Facebook
* Twitter
* Github
* Email
* Googleなど

### Realtime Database
アプリのデータをリアルタイム保存できる。
JSON形式で保存するNoSQLのデータベース。
データベースに変更が発生すると接続しているクライアントに通知する。

### Storage
画像、動画などのメディアファイルを保存や取得が可能。

### Remote Config
アプリのアップデートを公開しなくても、アプリの動作と外観を変更可能。
この機能を利用するとA/Bテストも可能。

### Test Lab
Google データセンターでホストされている端末上でアプリをテスト

### Crash Reporting
アプリで発生したエラーの詳細レポートを作成可能。
ユーザにエラーのレポート送信を行わせずに、アプリ内で発生した例外のスタックトレースを確認できる。

## Grow（拡大）
ユーザー層を確実に拡大するために下記の機能も提供している。

### Notifications
Android と iOS をまたいだ無制限の通知を無料で送信可能。
通知設定もWebブラウザで設定可能。


### App Indexing
アプリ内のコンテンツを Google 検索に組み入れることが可能。

### Dynamic Links
Webページ上のダイナミック リンクを開いたユーザーの端末にアプリがインストールされていない場合にインストールを促し、インストール完了後にアプリを起動してリンクを開くことが可能
僕がUnityでHoloLensアプリをビルドできなかったワケ

#前書き
先日、日本マイクロソフトセミナールームで行われてシェアリング実装ハンズオンにて、まずビルドすらできなかったよっしーです。

レンタルPCを借りて環境構築したのですが、エラーの連続でうまく行きませんでしたので、その時のことを書いて行きます。

環境構築は基本的には、この記事を参照していただくとうまく行きます。
http://qiita.com/morio36/items/80556038010f584adb2a

#問題１　「僕のミス」
<img width="566" alt="スクリーンショット 2017-04-27 15.33.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/114709/325ecaf6-ed83-c5c7-8278-7b3d09fba135.png">

画像には上のように、「Nextをクリック」と書いてありますが、**Windows Store .NET Scripting Backend**のチェックボックスは、デフォルトで**非アクティブ**です。一度チェックボックスを入れたことのある人は以降付いていますが、僕は特に気にせずホイホイ「Next」を押してしまうおばかさんだったので、ビルド失敗しました。チェックボックスを入れればうまく行きました。

#問題2 「Windows Creators　Updateの爆弾」
Windows Creators Updateをすると、Visual Studio 2017の内部バージョンが15.1にアップデートされて新しいSDKが入ります。すると**Unityとの互換性がなくなって死にます。**これはほぼどうしようもない問題なのですが、逆コンパイルをすることで参照ファイルを見つけて、regeditからの書き換えで対応されている方がおられました。

じんぐるさん、ありがとうございます！
http://blog.xin9le.net/entry/2017/04/23/194631

こちらも僕の環境で修正を試したところ、うまく行きました！
[メモ] ラズパイ３: LineageOS 14.1 (Android 7.1.2)

- (2018-03-15追記) [LineageOS 15.1 (Android 8.1.0) for Raspberry Pi 3 (March 7, 2018)](http://konstakang.com/devices/rpi3/LineageOS15.1/)

---

- ブラウザ<br>
![IMG_6505.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/817557c6-cad7-8889-44bc-996abfb87f5b.jpeg)

- インストールされてるアプリ
![IMG_6504.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/70986013-0fff-c500-5d2c-d3d5ba6eefa6.jpeg)


## 概要
- ラズパイ向けのAndroid 7ベースの LineageOSというのを発見。
- ダウンロードして、解凍して、(Raspbianみたいに)焼くだけ。
- ダウンロード先: [LineageOS 14.1 (Android 7.1.2) for Raspberry Pi 3](http://konstakang.com/devices/rpi3/CM14.1/)
- [LineageOS - about](https://lineageos.org/about/)
    1. lineal descent from an ancestor; ancestry or pedigree.<br>祖先からの直系。 祖先または血統。
    2. a sequence of species each of which is considered to have evolved from its predecessor.<br>その前身から進化したと考えられる種の系列。<br>(ぐーぐる先生訳)
- ということらしいが、これは、非公式ビルド、とのこと。

## 環境
- Raspberry Pi 3　+ USBのキーボード + USBマウス

## 手順
1. ダウンロード<br>`lineage-14.1-20170416-UNOFFICIAL-KonstaKANG-rpi3.zip`
https://www.androidfilehost.com/?fid=529152257862719615
`md5:8be2a31af8a1f1874d3200a617f870fe`
2. 解凍すると、`lineage-14.1-20170416-UNOFFICIAL-KonstaKANG-rpi3.img`というのが出てくるので
3. いつもの、ツールで焼く。
4. microSDをらずぱい３にさして起動。(起動アニメーションがでる。速度の遅いmicroSDだったので、次の画面まで、結構待った..)
5. こんなのが出てくる。 右下の `Next >`<br>![IMG_6498.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/87ec695e-e817-758c-1cf5-edc9fb67bf50.jpeg)
6. 言語設定、日付時刻(ネットに接続すると、自動補正される)、Wifi設定。<br>![IMG_6501.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/df023903-42dd-5eeb-7865-cc66fceb796b.jpeg)
7. マウスカーソルが、ごにょごにょになってる...(いつも通りというか..)<br>![IMG_6503.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/0652bbb3-b997-29f9-421d-881bb452bb70.jpeg)

## その他
- ↓の、AOSP/AndroidTVのほうを試してたんだけど、gaspp.sh導入できたんだけど、PayStoreからのダウンロードとかYouTubeの動画再生とかうまく動かなかった。
    - [[ROM] [Testing] Tab-Pi | AOSP/Android TV for Raspberry Pi 3 (7.1.2)](https://forum.xda-developers.com/raspberry-pi/development/rom-tab-pi-aosp-android-tv-raspberry-pi-t3593506)
    - [Android TV Nougat ROM now available for Raspberry Pi 3](https://androidcommunity.com/android-tv-nougat-rom-now-available-for-raspberry-pi-3-20170425/)
- イントールしてる間に、LineageOS for RPi3を発見.. こっちは簡単に動作したが、PlayStoreとかない.
cron メモ

- cronの起動確認  
通常は自動起動設定となっているが、一応確認  
  ```/etc/rc.d/init.d/crond status```  
もし起動していなかったら手動で起動  
```/etc/rc.d/init.d/crond start```  
ランレベル2～5をオンにする  
```chkconfig --level 2345 crond on```  
設定確認  
```chkconfig --list crond```
- cronファイルの設定  
```crontab -e```  
or  
```crontab -u ユーザー名 -e```  
- 表記方法  
``` 分　時　日　月　曜日　コマンド```  
例 (毎日4時に実行。右にファイル名を書くだけ)  
``` 0 4 * * * /var/xxx/file.rake```  

- 実行ログを確認  
```sudo tail -f /var/log/cron```
抽象クラス(Abstract Class)とインターフェース(Interface)の使い分け in Java

#Abstract ClassとInterfaceおさらい

できることできないことリスト

| 　　　　　　       |     Abstract Class   |    Interface       |
|:-----------------|:------------------:|:------------------:|
| 定義できる?        | No (型にはなれる）|        No        |
| fieldもてる？     |            Yes     |       No(できるけど強制public static final)       |
| メソッド           | private/public/protected |       強制public        |
| 継承               |super classは一つのみ |        いくつでもOK         |

#Abstract ClassとInterfaceの使い分け
以下が当てはまる場合はAbstract Classを使う

- 抽象クラスを似ているクラスの間で共有したいとき。
- 抽象クラスから継承されたクラスが似たようなメソッドとフィールドを持つとき。
- Non-static non-finalなフィールドを使うとき。

以下が当てはまる場合はInterfaceを使う

- 関係ないクラスがこのインターフェースを定義するとき（Comparableなど)。
- 誰が定義するかわからないとき、もしくは気にしない時。
- 多重継承したいとき。

# Reference
[Abstract Methods and Classes from Oracle](https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)
Tangoで既存のAreaDescriptionFileを読み込む

KSF（公式のスクショ[^1]が古かったので）

# ADF(Area Description File)の作成

Tangoのサンプルシーンにある`AreaDescriptionManager`あたりを使って作っておく。

# Tangoシステムのセットアップ

概ね公式のIntroductionが使えるのでそれに沿う。

特に少し試したいだけだからといって`Tango Manager`に`Relocalizing Overlay`を貼るのを忘れたりしないように。
動かないので[^2]。

特に気をつけたい点は以下の通り。

+ `Tango Manager settings for saved area descriptions` で説明されている `Enable Area Descriptions
` が `Pose Mode` のドロップダウンに統一されているので、`Local Area Description(Load Existing)`を選ぶ
![スクリーンショット 2017-04-27 15.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/178486/a687b4ac-da0c-cf8c-3e13-4355f3b0e5eb.png)

+ カメラ映像を写すために `Enable Video Overlay` で `Texture` もしくはTextureが含まれる何かを選んでおく
![スクリーンショット 2017-04-27 15.25.57.png](https://qiita-image-store.s3.amazonaws.com/0/178486/61af41c0-4ba9-4568-8513-f7216b19bdd3.png)

+ 最新ver[^3]で`Tango Delta Camera`と`Tango AR Camera`のprefabが統一されたため、`Tango Camera`に`Tango AR Screen`を貼る
![スクリーンショット 2017-04-27 15.23.14.png](https://qiita-image-store.s3.amazonaws.com/0/178486/5114b88c-ab3f-68f7-7b0c-b6a03fe0f0b7.png)

+ 初期のFarClip値が意外と短いので、長めにしておくとよい（上記画像で100にしてある）

# 読み込むADFの選択

公式のコードは最新のADFを読み込むようになっているので、必要なら適宜選択させる。

```csharp:AreaLearningStartup.cs
	public void OnTangoPermissions(bool permissionsGranted)
	{
		if (permissionsGranted)
		{
			AreaDescription[] list = AreaDescription.GetList();
			if (list.Length > 0)
			{
				foreach (AreaDescription areaDescription in list)
				{
					dropdown.options.Add (new Dropdown.OptionData (areaDescription.m_uuid + "(" + areaDescription.GetMetadata().m_name + ")"));
				}
			}
			else
			{
				Debug.Log("No area descriptions available.");
			}
		}
	}
```

等々の手法でドロップダウンを作っておいて、 OnButtonPressedか何かで `m_tangoApplication.Startup(selectItem);` する。


<BR>
<BR>
<BR>

---

[^1]: https://developers.google.com/tango/apis/unity/unity-howto-area-learning
[^2]: 実体験
[^3]: Gankino (Version 1.52, April 2017)
Feedlyからinoreaderへ乗り換えた

情報収集ツールとして、GoogleRSSリーダーが無くなってから、ずっとFeedlyを使ってきたのですが、1点困ったことが起きました

Twitterの自分のタイムラインをFeedlyに登録して見てたのですが、Feedlyの更新間隔が3時間くらいかかる（公式だと1時間らしいが。。）ので、
フォローが増えてくると、追いつかなくなってきました

3時間単位で200くらい一気にFeedlyに送られてきます。。
しかも200超えてたら、全部取れて無い気もする。。

そのうちタイムラインに表示されるのを減らす必要はあると思いますが、
とりあえず、もっと更新間隔が速いRSSリーダーがないか探してみたところ、

「inoreader」が良さそうでした！
http://www.inoreader.com

inoreaderだと、無料で特定フィードを10分間隔にできます！

ただし無料枠だと10フィードまでらしいです
でもデフォルトでも1時間置きくらいに取ってくれると思うので、他のフィードはそれで十分です

## 設定手順
ちなみに自分のTwitterのタイムラインのURLは以下で作れます

Twitter Great RSS
http://twitter-great-rss.herokuapp.com

このツールを使わして頂いて、アプリ連携認証すると4つURLが生成されるのですが、
これの1番上が自分のタイムラインになってます

このURLをinoreaderに登録して、

<img width="243" alt=" 2017-04-27 15.07.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/7bae9202-c165-4024-a9de-17cb2ec2d03e.png">

フィードの情報を表示をクリック

<img width="360" alt=" 2017-04-27 15.09.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/2f3757c1-d103-3394-791d-2f0af5867167.png">

巡回間隔をブーストをクリック

<img width="360" alt=" 2017-04-27 15.09.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/67b7c019-73cf-e0c1-b702-7c1592853f5c.png">

10分になった！
（てかブーストしなくても30分間隔で取れるのか）

## 感想
inoreaderを使って日が浅いですが、今の所いい感じです
日本語対応されてる点も良いかと思います
後は、chrome拡張でフィードの記事が読めるのがあればいいなーって思いました

でも1番大事なのはタイムラインを整理することなので、通勤時間で読めきれなくなってきたら整理しよう
取得できても、読み切れなければ意味がない
Cognos Analyticsのライセンスロールに合わせた権限の付与方法

##概要
Cognos Analyticsのライセンスロールで、それぞれのライセンスに対して、Cognos Analyticsでどのように権限を付与するべきか、という情報です。

元ネタはこちらです。
**How to create the Cognos Analytics Licensed Roles**
https://www.youtube.com/watch?v=sYe_F7tbu6U

**How do you restrict users based on their License Roles in Cognos Analytics**
http://www-01.ibm.com/support/docview.wss?uid=swg21684890

##手順
**Analytics Administratorロール**
Analytics Administratorは、「System Administrators:システム管理者」の役割に所属する必要があります。

Cognos Analyticsにログインし、左黒帯の「Manage」から「Account」を選択、Cognosネームスペースの「System Administrator」の「Member」タブで追加を選択し、LDAPからシステム管理者になるユーザー・グループを選択して、メンバーに登録してください。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/366da28a-982a-db36-89af-cb78522aaaa9.png)

また、デフォルトで所属している「Everyone:すべてのユーザー」を削除してください。
これは、System Administratorsのみならず、Cognosネームスペース配下の全てのグループ・役割に対しても同様で、Everyoneユーザーをメンバーから削除してください。
※注意点として、System Administratorsに誰かを所属させる前に、Everyoneを削除してしまうと、誰も管理者権限を持たない状態になってしまいますので、必ずユーザーを所属させた後に行ってください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/8c0cd410-1780-ae2f-7ccc-18081e8b294a.png)

**Analytics Explorerロール**
Analytics Explorerは、「Authors:作成者」「Consumers:使用者」「Metrics Authors:評価指標作成者」「Mobile Users:Mobileユーザー」に、同様の手順で所属させてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/ee02204c-d533-091b-8ff4-42c767f6e3dc.png)

**Analytics Userロール**
Analytics Userは、「Authors:作成者」「Consumers:使用者」「Mobile Users:Mobileユーザー」に、同様の手順で所属させてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/4b3e1dae-3d61-1afb-5509-4597ff3defff.png)

**Information Distributionロール**
Information Distributionは、「Readers:読者」「Mobile Users:Mobileユーザー」に、同様の手順で所属させてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/37f8d817-5295-0c6b-61df-3ea4a32bc8fd.png)

また、Information Distributionでは、Executive Dashboardの権限を剥奪する必要があります。
「Manage」から「Administration Console」を起動してください。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/52219ffe-1e58-da23-1d75-182fb9d0377b.png)

「Security」タブの「Capabilities」から「Executive Dashboard」を探し、矢印をクリックしてください。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/44bb0278-40c6-6e1d-84e5-07e78981ce93.png)

「Permissions」タブで、「Override the access permissions acquired from the parent entry」にチェックを入れ、「Add」ボタンでLDAP上からInformation Distributionのロールに相当するユーザーを追加し、「Execute」と「Traverse」の「Deny:拒否」にチェックを入れて下さい。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e524c6cc-e2a0-a755-d634-9aaf57c70963.png)

**設定の確認**
ログインしているユーザー自身の所属グループ・役割や保持している機能を確認するためには、「My Preference」を選択します。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/cd9f1b8c-5ac6-1841-6ad8-08fd3059734c.png)

「Personal」タブの「Advanced」から、「Groups and roles」を確認すると所属グループ・役割が、「My capabilities」を確認すると許可された機能を確認する事ができます。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/72fc977b-e8eb-2bce-913e-cb6285d30b24.png)

また、「Manage」の「Licenses」を選択すると、グループ・役割に所属しているユーザー数から、どれだけのライセンスを使用しているか確認する事ができます。
※あくまで「確認」であって、ライセンスの「登録」を行うものではありません。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d63527cb-0435-926c-5a5f-e3991f22f54d.png)
sshの接続先を登録する

ラズパイのSSHの許可方法が他と違っていたので
メモします。

```
sudo raspi-config
```
```
Interfacing Options
SSH
```

[公式](https://www.raspberrypi.org/documentation/remote-access/ssh/)

下記のファイルに接続先情報を記入する。

```
~/.ssh/config
```

```
Host 　　　適当な名前
HostName  IPアドレス
Port      22
User      username
```

terminalで下記を入力するだけ。

```
ssh ユーザー名@適当な名前
```
Node.jsのrequireの仕組み

### requireの仕組み
---

説明のために、hoge.jsをrequireすると仮定します。

初回のrequire('./hoge')で'./hoge'専用の空オブジェクトが作成され、そのファイル後、hoge.jsの中身すべてが評価されます。

空オブジェクトの設定箇所は、このへんです（Moduleクラス）
https://github.com/nodejs/node/blob/v7.9.0/lib/module.js#L37

1回目のみ作成と評価を行い、2回目以降はmapから取り出されるので評価されないです。
https://github.com/nodejs/node/blob/v7.9.0/lib/module.js#L420

ざっくりと表現すると、requireしたときの状態は、下記となります。

```js
require('hoge') === module.exports === exports === {}
```

### 循環参照の話
---

全部評価すると言っているが、a.jsを評価中に、b.jsをrequireした場合、どうなるんだ？という話になりますが、requireしたファイルが評価中だった場合、その時点でのmodule.exportsのオブジェクトを受け取るように出来ています。

例）a.jsの評価中に、b.jsをrequireする。さらに、b.jsの中から評価中のa.jsをrequireした場合の挙動

a.js

```js
require('./b'); // 実行順番:1

// こちらだと、まるっと上書きなので、b.jsのsetTimeoutに出てこなくなる
module.exports = {z1: 999}; // 実行順番:4

// こちらだと、設定されているオブジェクトに追加なので、b.jsのsetTimeoutに出てくる
// module.exports.z1 = 999; // 実行順番:4
// or
// exports.z1 = 999; // 実行順番:4

```

b.js

```js
var a = require('./a'); // 実行順番:2
console.log(a); // 実行順番:3
// {}

setTimeout(function() {
  console.log(a); // 実行順番:5
  // {} まるっと置き換えた場合
  // {z1: 999} exportsに追加した場合
}, 1000);
```

上記の形でmodule.exportsをまるっと置き換えると、b.jsの中のa変数は、空オブジェクトになってしまいます。moudle.exportsをまるっと置き換えるなら、他をrequireする前にやったほうが良いと思います

【改良版】a.js

```js
module.exports = {z1: 999}; // 先に行う！！

require('./b');
```
Windows環境でTensorFlow-GPUをpipインストールするまで

・<2017/05/28　追記>Anacondaのcreatecondaで仮想環境を作ったほうが良いらしいです。
なのでこのやり方は間違っているようです。


私自身 TensorFlow のGPU対応版のダウンロードができずかなり苦戦しましたが解決したので同様の悩みの人のためにここに書いておきます。

<h2>環境</h2>
・Windows 10 (64bit)
・NVIDIA - GTX960M
・Python3
・Anaconda3

Windows環境でNVIDIAのグラフィックボードを積んでるPCを対象に進めます。

<h2>CUDA と cuDNN のインストール</h2>
これに関してはこの記事がわかりやすいのでここを見てください。
[WindowsでGPU使ってTensorFlowを動かすメモ](http://qiita.com/binzume/items/7a0170fe834e250ddef9)

<h2>Anacondaを使ったPythonのインストール</h2>
ここからがメインです。

最初にAnacondaをインストールします。(既にインストールしてる人は飛ばして貰って構いません。)
[Anaconda](https://www.continuum.io/downloads)
ここの Python3.6 Verision をインストールしてください。
インストーラーに関しては指示に従ってインストールするだけで大丈夫です。

<h2>Python のバージョン変更</h2>
ここでは Python3.6 を TensorFlow が対応している Python3.5.2 にダウングレードさせます。

Anaconda Prompt を起動し、**conda install python=3.5.2** と入力し実行します。
　以上です。

これでPythonのバージョンが 3.6 から 3.5.2 にダウングレードできるはずです。

Anaconda Prompt の場所はデフォルトであれば
(C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit))
にあるはずです。

<h2>GPU対応のTensorFlowのインストール</h2>
pipでインストールするだけです。
<pre>pip install tensorflow-gpu</pre>


これでGPU対応版 TensorFlow のインストールができたはずです。

わからないことなどありましたら質問にてどうぞ。

<h3>解決に導いてくれて記事やサイト</h3>
- [stack overflow](http://stackoverflow.com/questions/40941015/tensorflow-on-windows-not-a-supported-wheel-on-this-platform-error)
- [WindowsでGPU使ってTensorFlowを動かすメモ](http://qiita.com/binzume/items/7a0170fe834e250ddef9)


ここまで見てくださりありがとうございました。
ES6 オブジェクトの配列を特定のキーでオブジェクトに変換


`Array.prototype.reduce()`を使う.
accに前回の結果が入ってバケツリレーされていくので、同一キーがあった場合後に実行される方が残る.

```js
let arr = [
  { name: "Newton", age: 84, role: "Physicist" },
  { name: "Newton", age: 84, role: "Mathematician" },
  { name: "Newton", age: 84, role: "Economist" },
  { name: "Mozart", age: 35, role: "Musician" },
  { name: "Darwin", age: 73, role: "Biologist" },
  { name: "Newton", age: 84, role: "Alchemist" },
  { name: "Mozart", age: 35, role: "Composer" },
]

let objects = arr.reduce((acc,value)=>{
  acc[value.name] = value
  return acc
}, {})

console.log(objects)
// {
//   "Newton": {
//     "name": "Newton",
//     "age": 84,
//     "role": "Alchemist"
//   },
//   "Mozart": {
//     "name": "Mozart",
//     "age": 35,
//     "role": "Composer"
//   },
//   "Darwin": {
//     "name": "Darwin",
//     "age": 73,
//     "role": "Biologist"
//   }
// }
```
macOSのJSONエディタを作った

JSONの編集機能を持つmacOSアプリです。ダウンロードは ↓
https://rink.hockeyapp.net/apps/ee2cdc8de51549e08d180cb6552a2380

アプリの動きをみたい方はYouTubeをチェック ↓
[![On YouTube Now!](http://img.youtube.com/vi/8jk2eircovI/0.jpg)](http://www.youtube.com/watch?v=8jk2eircovI)

v0.9(2) -> 100倍ぐらいパフォーマンスを向上させましたぁ！ 
v0.9(3) -> Undo/Redo実装、Copy/Paste実装
redashのバックアップ


redashをバックアップして障害に備えるぜ！てなった時に、
Linux力が足らず検索しまくったので、
次やる時に、また調べることになるのも嫌なのでメモしておく。

# 手順

1.[Redash を Backup & Restore する](http://kakakakakku.hatenablog.com/entry/2017/03/27/233008)を参考にshファイル(backup.sh)を作成する
2. EC2インスタンスにS3へのアクセスのためにIAMロールをタッチする
3. cron登録用のファイル(redashcron)を作成する。
4. `crontab redashcron`でジョブを登録する
 * 登録済みcronを確認する。`crontab -l`

```sh:backup.sh
#!/bin/sh

cd /usr/local/redash_backup
sudo -u redash /usr/bin/pg_dump redash | /bin/gzip > /usr/local/redash_backup/redash_backup_$(date +%Y%m%d_%H%M%S).gz
backup="$(ls -1t | grep redash_backup | head -n 1)"
S3_BUCKET_NAME='lenet-redash'
/usr/local/bin/aws s3 cp ${backup} s3://${S3_BUCKET_NAME}/
```

```txt:redashcron
0 5 * * * /usr/local/redash_backup/backup.sh >/dev/null 2>&1
```

## cronがうまく動かないのでデバッグしたい

1. ubuntu で cronのログが出ないので出るようにする
2. `/etc/rsyslog.d/50-default.conf`で`＃cron.* /var/log/cron.log`の行のコメントアウトを解除
3. `service rsyslog restart`でsyslogを再起動


# 参考

* [Redash を Backup & Restore する](http://kakakakakku.hatenablog.com/entry/2017/03/27/233008)
* [ubuntu14.04 cronログ出力設定](http://qiita.com/skyfish20ch/items/46db70e1ff88166ead87)
VisualStudio2015で未使用の参照ボタンの代わりになるものは?

VisualStudio2005を使っているとき、プロジェクトの参照設定に「未使用の参照」ボタンがあった。プロジェクトが参照設定していdll等から使用していないものを削除する機能である。
ただこれがVisualStudio2015だとなぜかなくなっている。

#結論
VisualStudio2015のアドオンであるResolveURを使えばいいらしい。
会社のPCに制度上の理由で入れられなかったので未検証。

#未使用の参照を消す意味は?
不要な参照がなくなってきれいになる。くらいらしい。
一応動作速度が改善するらしいが、体感できるほど早くなるわけではないらしい。

未使用の参照がある状態でビルドを行い、その後参照先のdllを削除した場合でも、そのdllを使用しようとしない限りエラーは発生しない。そのため、使用していない参照がなくなったとしてもEXEの実行には問題は発生しない。
symfony1.xでschema.ymlを分割する

symfony1.xのdoctrineで `config/doctrine/schema.yml` に全テーブル定義を記載し
それを元に以下のコマンドを実行してモデルクラスを作成する際

```
php symfony doctrine:build --model
```

`config/doctrine/[テーブル名].yml` でテーブルごとに定義を分割しても
勝手にディレクトリ内のファイルを全取得してくれる模様。
\verbコマンドをキャプションや脚注で使う

あんまりないけれど, たまにどーーーーーしても`\verb`コマンドを`figure`環境のキャプションや脚注で使いたい時があって, その都度調べている気がしたので, その方法を簡単にメモしておく.

ここに書く方法が古い情報なのか「今風」なのかはよくわからない.

# 脚注で使う

`\usepackage{fancyvrb}`して, `\begin{document}`の後に(?)`\VerbatimFootnotes`と書く.

```latex
\usepackage{fancyvrb}

\begin{document}
\VerbatimFootnotes

ここは本文%
\footnote{\verb|\~@?&| ここは脚注}
```


# キャプションで使う

`\usepackage{cprotect}`して, `\caption`の前に`\cprotect`と書く.

```latex

\usepackage{cprotect}

...

\begin{figure}
\includegraphics{...}
\cprotext\caption{\verb|&$#?*~$| キャプション}
\end{figure}
```

参考: [How to include verbatim in a figure caption?](https://tex.stackexchange.com/questions/8810/how-to-include-verbatim-in-a-figure-caption)


# リンク

- [fancyvrb.sty](https://www.ctan.org/pkg/fancyvrb)
- [cprotect.sty](https://www.ctan.org/pkg/cprotect)
Groovyで@SingletonしたクラスからのgetInstance()をJavaからやる

# はじめ
意外に引っかかりました

```groovy
@Singleton
class Test{
@I have a=new pen('yeah');
}
```

こんなクラスがあったとする

```Java
Test test=Test.getInstance();//エラー
```

これではTestクラスのインスタンス持ってこれない。
なぜだ

# 結論
JavaでGroovyのようにアクセスできるメソッドがあるのでそれを使う。

```java
Test test=(Test)InvokerHelper.getProperty(Test.class,"instance");//OK
```
GitHub/GitBucket でデフォルトでcloneされるbranchを変更する。

# やりたかったこと
`git clone`でクローンした際に`-b`オプションを省略するとmasterからクローンされるが、この際にも任意のブランチからクローンされるようにしたかった。

# 方法
## GitHub
変更したいリポジトリから setting -> Branches で表示されるDefault branch を任意のブランチに変更します。
_※settingタブは権限によっては表示されません_
![Branches.png](https://qiita-image-store.s3.amazonaws.com/0/171917/dc93d9a4-2859-d9de-a371-62a69d16ebde.png)

## GitBucket
デザインは異なりますが、基本的にGitHubと同じです。
変更したいリポジトリから setting -> Branches で表示されるDefault branch を任意のブランチに変更します。
_※settingタブは権限によっては表示されません_
![Branches.png](https://qiita-image-store.s3.amazonaws.com/0/171917/9bc92ed7-51ef-0ee9-7eca-6faf395c4d8a.png)

# 確認
`git branch -a`で`remotes/origin/HEAD -> origin/任意のブランチ`となっていることを確認する。
ES6 オブジェクトの配列を特定のキーでユニークにする


オブジェクトの配列内で同じ値を持つオブジェクトのユニーク配列を作成する.
同じオブジェクトであることの判定は、`findIndex`でおこない、条件合致したはじめのオブジェクトがユニーク後に残される.

```js
let arr = [
  { name: "Newton", age: 84, role: "Physicist" },
  { name: "Newton", age: 84, role: "Mathematician" },
  { name: "Newton", age: 84, role: "Economist" },
  { name: "Mozart", age: 35, role: "Musician" },
  { name: "Darwin", age: 73, role: "Biologist" },
  { name: "Newton", age: 84, role: "Alchemist" },
  { name: "Mozart", age: 35, role: "Composer" },
]

let uniqArr = arr.filter((obj, index, self)=>{
  let firstIndex = self.findIndex((x)=>{ return obj.name === x.name })
  return firstIndex === index
})

console.log(uniqArr)
// [
//   {
//     age: 84,
//     name: "Newton",
//     role: "Physicist",
//   },
//   {
//     age: 35,
//     name: "Mozart",
//     role: "Musician",
//   },
//   {
//     age: 73,
//     name: "Darwin",
//     role: "Biologist",
//   }
// ]
```
windowsでTensorFlow その4

#概要
windowsのTensorFlowで、強化学習やってみた。

#写真
「私、失敗しないんです。」
![au.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/d79d46d0-bef3-abea-f7a5-736d3e82fbe5.jpeg)

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5

#成果物
https://github.com/ohisama/CatchGame-QLearningExample-TensorFlow
Windows版OpenSSHをSSHクライアントとして使ってみる

Windows版のOpenSSHをSSHクライアントとして使ってみた備忘録です。

やってみたこと
・batファイル叩いて一発で公開鍵接続する。

その他の条件
・公開鍵接続の準備ができている。
・batファイルの文法がある程度分かる。
・OpenSSHの文法がある程度分かる。
・Windows側の環境変数は変更しない。
・Windows側のフォルダ構成は以下の通り
├─OpenSSH-Win32
├─OpenSSH.bat(このフォルダにある.batを叩いて接続する)
└─sshkeys
　　└─myself
　　　　└─hogefuga(ここに鍵ファイルがある)

OpenSSH.bat(フォルダ)に以下のbatファイルを作成します。
ホスト名やポート番号、ユーザー名などは適時読み替えて下さい。

```hogefuga.bat
@echo off 
cd /d %~dp0
cd ..\OpenSSH-Win32

set HOSTNAME="hogefuga.jp"
set KEYFILE="..\sshkeys\myself\hogefuga\id_rsa"
set PORT="22"
set USERNAME="hogefuga"

ssh.exe -p %PORT% -i %KEYFILE% %USERNAME%@%HOSTNAME%
```

Windows版OpenSSHをクライアントとして使ってみての感想
・bashのコマンド履歴検索(Ctrl-r)をすると画面がぐちゃぐちゃになる。
・clearコマンド等を使おうとすると`TERM environment variable not set.`となり環境変数が読み込まれない(sshのコマンドの問題？)ので`echo "export TERM=xterm" >> .bashrc`する必要がある。
・作成したbatファイルをVSCodeから使うと便利

以上
AngularJS - Close modal function not working

````
close and dismiss are methods of $modalInstance  object  returned by $modal.open:

$scope.open = function() {
    $scope.$modalInstance = $modal.open({
        scope: $scope,
        templateUrl: "modalContent.html",
        size: '',
    })
};

$scope.ok = function() {
    $scope.$modalInstance.close();
};

$scope.cancel = function() {
    $scope.$modalInstance.dismiss('cancel');
};
````
[iOS] storyboard 上での多言語化対応と UITabBarController の各タブの title の多言語化対応

多言語化対応の基本は、情報がいっぱいあるのでここでは紹介しません。

## 準備するもの

* Localization した .strings ファイル

## 1. storyboard 上で多言語化対応する方法

準備はシンプルで、 UILabel などにキーをプロパティで指定できるようにするだけ。
準備ができたら storyboard 上から直接設定できます。

```
import UIKit

/**
 UILabel に多言語化対応プロパティを設定
 */
extension UILabel {
  @IBInspectable var localizedText:String {
    set(key){
      let textComps:[String] = key.components(separatedBy: ".")
      self.text = NSLocalizedString(textComps[1], tableName: textComps[0], comment: "")
    }
    get{
      return self.text!
    }
  }
}

/**
 UIButton に多言語化対応プロパティを設定
 */
extension UIButton {
  @IBInspectable var localizedText:String {
    set(key){
      let textComps:[String] = key.components(separatedBy: ".")
      let text = NSLocalizedString(textComps[1], tableName: textComps[0], comment: "")
      self.setTitle(text, for: .normal)
    }
    get{
      return self.titleLabel!.text!
    }
  }
}

/**
 Bar Button に多言語化対応プロパティを設定
 */
extension UIBarButtonItem {

  @IBInspectable var localizedTitle: String {
    set(key){
      let textComps:[String] = key.components(separatedBy: ".")
      self.title = NSLocalizedString(textComps[1], tableName: textComps[0], comment: "")
    }
    get{
      return self.title!
    }
  }
}

/**
 NavigationItem に多言語化対応プロパティを設定
 */
extension UINavigationItem {

  @IBInspectable var localizedTitle: String {
    set(key){
      let textComps:[String] = key.components(separatedBy: ".")
      self.title = NSLocalizedString(textComps[1], tableName: textComps[0], comment: "")
    }
    get{
      return self.title!
    }
  }
}
```

すると、 storyboard のユーティリティエリアにプロパティが追加されているので、 `[ファイル名].[キー]` の形式で指定できるようになります。

![Screen Shot 2017-04-27 at 13.37.09.png](https://qiita-image-store.s3.amazonaws.com/0/14517/5e17b913-3a1e-1f2b-7a51-0f6fa880bb64.png)


## 2. UITabBarController の各タブの title を多言語化対応する方法

こちらは、 storyboard 上から設定する方法がわからずコードで指定してます。
下記コードを、 UITabBarController 配下の各ページに追加します。

```
  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.navigationController?.tabBarItem.title = NSLocalizedString("pageTitle", tableName: "pageFile", comment: "")
  }
```
Message HubでKafkaしてみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
ちょっと横道にそれてBluemixのMessage HubでKafkaを試してみます

# 1. MessageHubを用意します
- Bluiemixカタログのアプリケーション・サービス内の"Message Hub"をインスタンス化します。

# 2. クライアントを用意します
1. [https://console.ng.bluemix.net/docs/services/MessageHub/index.html](https://console.ng.bluemix.net/docs/services/MessageHub/index.html)の手順に従います。
2. gitからクライアントコード等を入手します。Java、python、JS(node)のクライアントが用意されています。ここではJavaクライアントを使った手順をご紹介します。`git clone https://github.com/ibm-messaging/message-hub-samples.git`
3. `cd message-hub-samples/kafka-java-console-sample`で移動し、`gradle clean && gradle build`でビルドします。
gradleが導入されていない場合、`brew install gradle`(MacOS)などで導入します。
4. 前項で用意したMessage Hubサービスの「サービス資格情報」タブを開き、「資格情報の表示」メニューから`api_key`、`kafka_admin_url`、`kafka_brokers_sasl`を入手します。`kafka_brokers_sasl`は複数行あるので`ホスト1:ポート1,ホスト2:ポート2,...`の形式で一行に続けて用意します。

# 3. クライアントを実行し結果を確認します
- 複数のConsumerを起動しておきます

```java -jar build/libs/kafka-java-console-sample-2.0.jar kafka_brokers_sasl kafka_admin_url api_key -consumer```

- Producerを起動し動作を確認します

```java -jar build/libs/kafka-java-console-sample-2.0.jar kafka_brokers_sasl kafka_admin_url api_key -producer```


- Producerからの出力
![スクリーンショット 2017-04-27 13.12.03.png](https://qiita-image-store.s3.amazonaws.com/0/125842/23ff5a48-04bc-a80a-74d7-3e91ab7e8a2c.png)

- 一つ目のConsumerからの出力
![スクリーンショット 2017-04-27 13.12.20.png](https://qiita-image-store.s3.amazonaws.com/0/125842/78d9d90d-e84f-aab8-d0e5-c4989dd1c35b.png)

- 二つ目のConsumerからの出力
![スクリーンショット 2017-04-27 13.12.32.png](https://qiita-image-store.s3.amazonaws.com/0/125842/8ccae18b-2162-d125-d20b-0b8f4df96f2e.png)

# 4.参考情報
- [Getting started with Message Hub](https://console.ng.bluemix.net/docs/services/MessageHub/index.html)
- [ibm-messaging/message-hub-samples](https://github.com/ibm-messaging/message-hub-samples)
- [Apache Kafka - Documentation](https://kafka.apache.org/documentation/#producerapi)
- [Managing IoT devices with Kafka and MQTT](https://www.ibm.com/blogs/bluemix/2017/01/managing-iot-devices-with-kafka-and-mqtt/)
- [Apache Kafka Connect MQTT Source Tutorial](http://howtoprogram.xyz/2016/07/30/apache-kafka-connect-mqtt-source-tutorial/)
- [Apache Kafkaに入門した](http://deeeet.com/writing/2015/09/01/apache-kafka/)
Windows10 Creatorsでメモリーエラー（Windowsアップデートで解決）

#環境

PC：Windows10 Pro Creators
フレームワーク：.net3.5
アプリのプラットフォームターゲット：x86

#メモリエラーになるソース

```
for(int i = 0; i < 100; i++)
{
  using (PrintDocument pd = new PrintDocument())
  {
    pd.PrinterSettings.PrinterName = "MyPrinter";
    pd.PrintController = new StandardPrintController();
    pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
    pd.Print();
    pd.PrintPage -= this.pd_PrintPage;
  }
}

private void pd_PrintPage(object sender, PrintPageEventArgs e)
{
  e.Graphics.DrawString("テスト", new Font("Arial", 12), Brushes.Black, new PointF(0, 0));
}
```

プラットフォームターゲットを「x64」にすれば当該問題は起こらない。
また「x86」でも「Anniversary」だと問題は起こらない。
どうしたものかorz

#その後

- 追記 2017年5月12日

原因としては「splwow64」が悪さをしているようで。
本日リリースされていた「Insider Preview 16193.1001」をインストールすると
当該現象は修正されていた！正式版リリースでもちゃんと直ってるといいなぁ。

- 追記 2017年6月30日

2017年6月28日のKB4022716をWindowsアップデートからインストールすることで解決した模様！
OSのビルド番号は15063.447。
いやぁ、良かったよ。マジで。

- 追記 2017年7月31日

どうもKB4022716の公開は終了していてKB4025342に包括されている模様。
[https://support.microsoft.com/ja-jp/help/4022716/windows-10-update-kb4022716](https://support.microsoft.com/ja-jp/help/4022716/windows-10-update-kb4022716)
cancancan 1.12.0 -> 1.16.0 のアップデートをしたときの話

# cancancanとは
authorization(認可、権限付与)を管理できるRuby Gem :gem: です。
GitHub Repository: [CanCanCommunity/cancancan: The authorization Gem for Ruby on Rails.](https://github.com/CanCanCommunity/cancancan)

# 1.12.0 -> 1.16.0 へのアップデート
1.12.0 っていつリリースのものを使ってたんですかって話はさておき…

Gemfileを書き換えて `bundle update` して `bundle exec rspec` すると cancancan 周りでテストがコケまくりました。原因を探っていてわかったことは [draper](https://github.com/drapergem/draper) で `decorate` したものに対して `authorize!` や `can?` していた箇所がコケているということでした。

```ruby
irb(main):001:0> user = User.first
  User Load (1.1ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
=> #<User id: 1, name: "user1", blog_id: 1, created_at: "2017-03-10 06:50:54", updated_at: "2017-03-10 06:50:54">
irb(main):002:0> blog = user.blog
  Blog Load (0.5ms)  SELECT  "blogs".* FROM "blogs" WHERE "blogs"."id" = $1 LIMIT 1  [["id", 1]]
=> #<Blog id: 1, name: "blog1", created_at: "2017-03-10 06:50:54", updated_at: "2017-03-10 06:50:54">
irb(main):003:0> ability = Ability.new user
(中略)
irb(main):004:0> ability.can? :read, blog
=> true
irb(main):005:0> ability.can? :read, blog.decorate
=> false
```

# まとめ
- decoったモデルに対して権限確認はやめよう
- decoるタイミングをちゃんと設計しよう
MobyプロジェクトとDockerの位置づけ

Dockerから新しいオープンソースプロジェクト「[Moby](https://mobyproject.org/)」が[発表されました](https://blog.docker.com/2017/04/introducing-the-moby-project/)。

Mobyとは何か、Dockerとの位置づけは？を理解するのに役立つ画像を
Docker Weekly #183: April 26th, 2017に掲載されていました。

![image](https://qiita-image-store.s3.amazonaws.com/0/65435/48a220e4-808a-e9ca-a5c1-946158b8b830.png)

* エコシステムの強化
* 様々なコンテナー技術を活用できるライブラリ、フレームワークを提供
 * ライブラリ：コンテナー化バックエンドコンポーネント
  * ビルダー、ロギング、ディスク管理、ネットワーク、イメージ管理、SwarmKitなど
 * フレームワーク：コンテナープラットフォームにコンポーネントを組込んだり、ビルドしたり、テストやビルドするツール