OmniAICreator/Qiita-1.07M huggingface dataset:
Javascriptのevalの評価の仕方

###変数の代入

```html
<html>
<head>
  <script type="text/javascript">
    eval("5 + 5") === 10; //true
    eval("var ninja = 5;");
    console.log(ninja); //5
   </script>
</head>
</html>
```
###scopeの確認

```html
<html>
<head>
  <script type="text/javascript">
    var test = function() {
                 eval("var ninja1 = 5;");
                 console.log(ninja1); //5
               };
    test();
    console.log(ninja1); //scopeが違うのでError
 </script>
</head>
</html>
```
###letで試してみる。

```html
<html>
<head>
  <script type="text/javascript">
    {
      eval("let ninja2 = 5;");
      console.log(ninja2); //Error letでは動かない
    }
    console.log(ninja2); //Error
   </script>
</head>
</html>
```
###globalのscopeに付け替える

```html
<html>
<head>
  <script type="text/javascript">
    function globalEval(data){
      data = data.replace(/^\s*|\s*$/g, "");
      if (data){
        var head = document.getElementsByTagName("head")[0] ||
                   document.documentElement;
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.text = data;
        head.appendChild(script);
        head.removeChild(script);
      }
    }

    window.onload = function() {
      (function(){
        globalEval("var ninja3 = 5;");
      })();
      console.log(ninja3);
    }
   </script>
</head>
</html>
```
###globalのscopeに関数を付け替える
alertも出せる。
document.writeも動く

```html
<html>
<head>
  <script type="text/javascript">
    function globalEval(data){
      data = data.replace(/^\s*|\s*$/g, "");
      if (data){
        var head = document.getElementsByTagName("head")[0] ||
                   document.documentElement;
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.text = data;
        head.appendChild(script);
        head.removeChild(script);
      }
    }

    window.onload = function() {
      var greet = function(){
        alert("hi hi");
        document.write("hello write");
      }
      (function(){
        globalEval("greet();");
      }).call(this);
    }
   </script>
</head>
</html>
```
AppjarをつかってPythonでGUIプログラミング


# 概要
[Appjar](http://appjar.info)というTKinterのラッパーを使って、GUIを持ったPythonアプリケーションを作成する。

# 環境
OS: Windows10
Python: 2.7.15

# インストール

```
pip install appjar
```

# 使い方
基本的な流れとしては以下のようになります。
①ライブラリインポート
②GUIインスタンス(ベース)作成
③ウィジェットを追加
④Buttonなどのイベントを発生させるウィジェットに対して、対応する関数を作成
⑤GUIを起動

詳しくは[公式](http://appjar.info/#hello-appjar)を参照してください。
以下は公式にあるHello Worldを少しだけ変えたものです。

```py:SimpleGUI.py
# -*- coding: utf-8 -*-

# ①ライブラリのインポート
from appJar import gui

# ②GUIのインスタンスを作成
# 書式: app = gui("Window name","vertical x width")
app = gui("Login Window", "400x200")

# 全体的な背景色、文字色とフォントの指定
app.setBg("black")
app.setFg("white")
app.setFont(16)

# ③GUI上のイベントと連動するための関数を定義
def press(button):
    if button == "Cancel":
        app.stop()
    else:
        usr = app.getEntry("Username")
        pwd = app.getEntry("Password")
        print("User:", usr, "Pass:", pwd)
        
# ④ベースのインスタンスにウィジェットを追加していく。
app.addLabel("title", "Welcome to appJar")
app.setLabelBg("title", "lightblue")
app.setLabelFg("title", "black")

app.addLabelEntry("Username")
app.addLabelSecretEntry("Password")

# "Submit","Cancel"という2つのボタンを作成し、それに対応するアクションとしてpress関数を指定
app.addButtons(["Submit", "Cancel"], press)

# "Username"にフォーカスをセット
app.setFocus("Username")

# ⑤GUI起動。この後には基本的にコードは書かないこと。
app.go()
```

大雑把な覚え方としては、gui()のアトリビュートは、
(add or set) + (ウィジェット名) + (パラメータ名)
引数は、
("アトリビュート名", "パラメータの値")
となっているようです。addではパラメータの部分は引数部分にしかないケースもあります。
例えば、app.setLabelBg("title", "lightblue")であれば、
titleという名前の、Labelというウィジェットの、Bgというパラメータの値を、
lightblueという値に、変更(set)しているという形です。

## 補足
使用可能なウィジェットの一覧
http://appjar.info/pythonWidgets/
ただ、ここには各ウィジェットに対して変更可能なパラメータの一部が書いてあるだけです。例えば、ここだけ見るとMessageには背景とか設定できない?となりますが、そんなことはなくて、基本的なパラメータ(Bg,Fg,Widthなど)は共通です。
[こちら](http://appjar.info/pythonWidgetOptions/#changing-widgets)を見ると、設定可能なパラメータがより詳しく書いてあります。

# まとめ
Appjarは個人的にはTKinterよりも直感的でわかりやすいと思います。
ただドキュメントの配置とか少しわかりにくかったので、使い始めのハードルが少し高い気がします。この記事がそのヘルプになれば幸い。
【PHP】アロー演算子(->)、クラス、オブジェクト、インスタンスって要するになんなのさ

##　->　この記号ってなんだ？

オブジェクト指向とかでよく見る　**->**　これとかを嚙み砕いて言葉で自分なりに説明したいと思います。

```php:class.php
<?php
//クラス生成、$nameの参照範囲を全体から可能にする(public宣言)
class _Manname{
    public $name = '桜木';
}
//オブジェクトの生成
$a = new _Manname;
//インスタンスの生成
$man_name = $a->name;
//$man_nameの中身を出力
echo $man_name;
```

```:出力
桜木
```

##アロー演算子ってどーやって使うの？
まず**アロー演算子(->)**を初学者視点からの説明を書いてみたいと思います。
上記のコードを実行すると　桜木　と出力されると思います。実際にコピペして頂いても動きますので試してみて下さい。インスタンスの生成で**アロー演算子(->)**を使用していますが、これは**$a**のオブジェクトから*public*宣言している**$name変数を参照**している状態で参照した変数を**$man_name**に代入しているという流れになると認識しています。**代入ではなくて参照**、ここがポイントなんでしょうか。

もう少し処理を増やして説明した方がいいのかもしれませんが現在こんな感じで認識してます。


##クラスってなんなのさ
上のソースコードでクラス宣言をして**class** **_Manname**としていますよね？よく**設計図**として例えられるクラス。あくまで初学者の認識での説明なので間違っていたらごめんなさいというか誰かご指導お願いします。このクラスの中に色々な材料(色んな引数)を渡してやるとクラス内部でゴニョゴニョして色んな返り値を渡してくれるスゲー便利な奴って感じだと思います。処理を複数書いて返り値を複数受け取ることで可読性の高いソースコードが書けるようになるって認識です。


##オブジェクト？何それ食べれるの？
オブジェクトはインスタンスと似て非なるもの。オブジェクトは返り値や色々な変数が入る箱のイメージ。Object=物として直訳されますね。**new**で宣言して**$a**の中に**_Manname**クラスの箱を作ってる感じだと思います。オブジェクトを参照してそのオブジェクトの中身を引っ張り出したりして代入したり、ゴニョゴニョしたりした値を変数に代入したりする大きい箱の中に小さい引き出しがいっぱい作れたり入ってるしてる物というイメージです。


##インスタンスってオブジェクトと違うの？
インスタンスはオブジェクトの中身を細分化した物で実際に変数が代入されている物という感じでしょうか？参照は実際の値が入っているのではなく、間接的に同じ値が入っているように見えるのが参照。インスタンスは実際に代入されて値そのものが入っている状態の変数って感じじゃないでしょうか？




**初学者の言い分なので鵜呑みにしてはいけません！**
これから先、色々と悩むことが多いプログラミングではありますが少しずつ認識を広げて先駆者の方のお力添えも求めつつ、張り切ってコードを書いていきたいと思ってます！
Keychainで The specified item could not be found in the keychain. が出たときの対処法

## iOSでPush通知証明書を発行しようとする時にでたエラー

Push通知のために証明書を発行しようとKeychainAccessで証明書署名リクエスト (CSR) ファイルを作成しようとすると、以下のようなエラーが出てきた。`指定された項目がキーチェーン内に見つかりませんでした`と書いてある。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122365/adb6a0be-97bd-25c6-68bc-6e5b01c347a8.png)

## 原因

秘密鍵に対応する公開鍵が、KeychainAccessに登録されていないためだそう。

## 解決策

1. KeychainAccessを開いて、利用するprivateキーをExportする。ここでは`private.p12`とする。パスワードは入力せずに作成しても問題ない。
- 先程Exportしたファイルと同じ場所に移動する。`openssl pkcs12 -in private.p12 -out private.pem`で、`.p12`から`.pem`にする。Exportする時に設定したパスワードと新しいパスワード（ここは4文字以上）設定する。
- `openssl rsa -in private.pem -pubout > public.pem`を実行する。
- `security import public.pem -k login.keychain`でKeychainAccessにインポートする。
- ローカルに作成した`.p12`ファイルや`.pem`ファイルを削除する。
AWSで本当にECSをやってみた

# 本気です
実際にサービスとして運用されているものを、SRE責任者としてコンテナ化してみました。

# 結果
ハッピーになりました！

# なぜこの記事を書いたか
現在いろんな企業や個人の方々の中でAWSを利用している方が増えてきていると思います。私もそうです。で、今までサーバーでwebアプリケーションを構築してきたのに、急に「コンテナ」なるものが出てきて、どうすればいいのかって思っている人が多いのではないかと思って書きました。
本当にそれっていいのか？コンテナって？みたいな。
それで実際に、今働いでいる会社でコンテナで運用しちゃおうと思って、やっちゃって、良かったので記事にしました。
※弊社はAWS大好き（弊社ではなく自分かも…）なので、ECSに偏ります。

# 何をやったか
今までbeanstalkでアプリケーションを運用していました。その中で。「本当にbeanstalkでいいのか」「コンテナって実際どうなの？」などいろいろ疑問を持っていました。なので、直接AWSの中の人に「最近コンテナ流行ってるけど、やるべきなん？」「beanstalkもおたくの商品だけども、ECSに移行していいことあるん？」みたいなことを聞いてみて、結果良さそうなので今のプロダクトのリニューアルに乗っかってシステム構成の変更（beanstalk->ecs）をやっちゃいました。

# 何が良かったか
明確なのは、「EC2インスタンスが減った」「スポットフリートで運用することによるコスト削減」です。
めっちゃ安くなりました！

あとは環境差異がなくなりました！今までは、アプリケーションを開発して、サーバーにデプロイして、ローカルとデプロイしたサーバーに差分があって、よくわからないエラーが起きて…
みたいな感じが多かったと思います。
これを常にコンテナ化することにより、どこにデプロイされても同じ状況が作れることになり、結果、環境差異による無駄な工数が削減できました！（奇跡）

あとは、ECSだとメモリの利用状況が管理できます！
弊社はメイン言語がjavaなのですがメモリがネックになってきます。（VMはメモリをくう！）で、cloudwatchでは今までメモリの使用状況が管理できなかったのですが、ECSならできます！（やってみないとわからないと思うので、やってみてください！）
なのでサーバーが持っているメモリリソースをフルに活用できます！
※java以外にもGO言語を扱っているのですが、GO言語のアプリケーションに関してはもっと効率的にサーバー
リソースの消費ができます。そもそも軽くてメモリも食わないので、純粋に平均的にリソース消費が可能です。


# 終わりに
やってみて本当に良かったと思います。損はないですやってみてください！
※ここには細かいことはかけませんが、ご興味がある方はコメント等に書き込みください。
node-jt400を試してみた（SQL query）


node-jt400のコーディング例は[ここ](https://github.com/tryggingamidstodin/node-jt400)に書いてありますので、それに沿ってテストしてみます。
#SQL query
```SQLquery.js
var jt400 = require("node-jt400");
var express = require("express");
var app = express();

var pool = jt400.pool({ host: '192.168.X.XXX', user: 'MYUSER', password: 'MYPASS' });

var server = app.listen(8888, function () {
    console.log("curl http://localhost:" + server.address().port + '/~');
});

app.get("/query", function (req, res, next) {
    let stmt = "select * from member";
    let members = [];
    pool.query(stmt).then(
        function (result) {
            var id, lname, fname, prof, tokuten;
            for (var i = 0; i < result.length; i++) {
                id = result[i].ID;
                lname = result[i].LNAME;
                fname = result[i].FNAME;
                prof = result[i].PROF;
                tokuten = result[i].TOKUTEN;
                members.push(id + lname + fname + prof + tokuten);
            }
            res.send(members);
        }
    )
});
```
パラメータ無し、単純に全件取得する例です。
結果の確認はコマンドプロンプト＋curlコマンドで行っています。
utf-8でエンコードされるので、事前にCHCP 65001を実行しています。

![nodejt02.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/58ffacca-a119-1597-03d4-f52e87f37c0c.png)
実行結果
![nodejt03.png](https://qiita-image-store.s3.amazonaws.com/0/146069/c62a55da-d49f-006d-72db-f429e9629951.png)
ライブラリを指定していなくてもエラーにならないのは、ライブラリリストにMYLIBが載っているからです。
明示的に指定する場合は、／（スラッシュ）で指定します。

JSON形式で返す例です。

```SQLquery.js
app.get("/queryJson", function (req, res, next) {
    let stmt = "select * from mylib/member where id <= ? or prof like ?";
    pool.query(stmt,[101,'%あい%']).then(
        function (result) {
            res.json(result);
        }
    )
});

```

![nodejt04.png](https://qiita-image-store.s3.amazonaws.com/0/146069/b11e4f2c-ae80-fac2-4b8b-74641b214c01.png)
moment-duration-formatである時刻からある時刻までの経過時間を整形

# moment-duration-formatである時刻からある時刻までの経過時間を整形

ある時刻からある時刻までの経過時間、英語でいうdurationの操作は、時刻の操作とは別の難しさがあります。時刻を文字列整形するJavaScriptのライブラリとしては[Moment.js](https://momentjs.com/docs/)が有名ですが、これはdurationの文字列整形はできません。例えば、99時間経ったら`"99:00:00"`のように表示したいとして、以下のように書いても上手くいきません。

```ts
const moment = require("moment");
moment(99 * 3600 * 1000).format("hh:mm:ss"); // 12:00:00
```

durationの文字列整形の方法を[StackOverflow](https://stackoverflow.com/questions/6312993/javascript-seconds-to-time-string-with-format-hhmmss)を漁ってみると独自に実装せいという意見がトップに来ます。しかし、見ると結構ややこしいので、何らかのライブラリを使いたいと思う人も多いのではないでしょうか。

そこで出てくるのが[moment-duration-format](https://github.com/jsmreese/moment-duration-format)です。このライブラリを使うと以下のように99時間経過したdurationを文字列整形できます。

```ts
const moment = require("moment");
require("moment-duration-format");
moment.duration(99 * 3600 * 1000, "ms").format("hh:mm:ss", { trim: false }); // 99:00:00
```

2行目の`require`で`moment`オブジェクトに`duration`メソッドが生えます。

`format`の第2引数に`{ trim: false }` を入れていますが、このオプションを入れると、例えば10秒経過していた場合、`”00:00:10"`になります。デフォルトの`true`だと`"10"`になります。

また、類似ライブラリで[twix.js](https://github.com/icambron/twix.js)があります。これもmoment.jsのプラグインとして動作しますが、Dateオブジェクトを2つ受け取ってDurationを得るAPIになっているようです。
AWS SDK for PHPでSMSを利用してメッセージを送る

仕事でAWSを使ってSMS認証を送るという課題をいただいたので挑戦しました。
しかしいきなりSMS認証は難しいので、今回はAWSで自分の携帯電話番号に「こんにちは」とショートメッセージを送るところまでにしました。
以下はその手順です。

#手順

###①IAMでグループとユーザーを設定
アクセスキーとセキュリティキーが発行されるのでメモを取る。セキュリティーキーは表示を押すと見ることができます。

:loudspeaker:　注意　:loudspeaker:
アクセスキーとセキュリティーキーは、漏洩しない場所にメモしてください。
もし悪用されると大量にアクセスされ、AWSから高額請求が来ることもあるようです。
また発行されたページから他のページに移動してしまうとセキュリティーキーは２度と見られないので、必ずメモを取るかcsvをダウンロードしましょう。

###②作成したグループ内のユーザーにAmazonSNSFullAccessポリシーをアタッチする。
※私ははじめここが理解できず、EC2をアタッチしていました。
###③SDK for PHPをComposerでインストールして、venderディレクトリをドキュメントルートに入れる。下のコードもドキュメントルートに置く。

```smstest.php
<?php
require './vendor/autoload.php';
error_reporting(E_ALL);
ini_set("display_errors", 1);

$params = array(
	'credentials' => array(
		'key'	=>	'XXXXXX',  //アクセスキー
		'secret'	=>	'XXXXXX', //セキュリティキー
	),
	'region'		=>	'ap-northeast-1', //リージョンの設定
	'version'		=> 	'latest'
);

$sns = new \Aws\Sns\SnsClient($params);

$args = array(
	"SMSType"		=>		"Transational",
	"Message"		=>		"こんにちは",　//英語も送信できます。
	"PhoneNumber"	=>		"電話番号"　//日本であれば+81-XX-XXXX-XXXX
);

$result = $sns->publish($args);
echo "<pre>";
var_dump($result);
echo "</pre>";
?>

```

###④phpファイルを実行

1. まずsmstest.phpを置いたドキュメントルートへ移動する
\$ cd /your/document/root/ 

2. ファイルを実行
\$ php smstest.php

ブラウザからでもコンソールからでもできます。
ブラウザの場合はBASIC認証をかけるなりして第三者からのアクセスを防いでください。


#実行結果

できたー！
![smstest.jpg](https://qiita-image-store.s3.amazonaws.com/0/156063/308e6f16-f0ca-914c-bdab-ad9bcf2eb13f.jpeg)

これだけ見るとだいぶ怖いですが、目標は達成しました。


#まとめ
今回は、SDK for PHPでSMSを利用してメッセージを送ることに挑戦しました。
AWSのドキュメントを~~丸パクリ~~参考にしつつ、無事メッセージを送ることに成功しました。
ここから発展させて、SMS認証も作っていきたいと思います。

最後までお読みいただきありがとうございました！:smiley:
感想や説明不足な点がありましたら、コメントいただけると嬉しいです。
Excel で Power Query を使い始めるには

Excel で柔軟なデータの収集やデータマッシュアップが実現する Power Query ですが、使い始めるまでの情報をまとめてみます。

#Power Query for Excel のエディション
あまり取り上げられる内容ではないが、Power Query for Excel には2つのエディションが存在していて、エンタープライズ向け機能などがサポートされているかどうかの違いがある。
導入先のOffice 環境によって振り分けられるので任意に選択することはできない。

##Power Query Premium
すべての機能 / データソースへの接続をサポート
Office 365 ProPlus / Office Professional Plus などエンタープライズ向け Office 上位エディション 

##Power Query Public
コンシューマ向け Office すべて と エンタープライズ向け Office 下位エディション
エンタープライズ向け製品やサービスを利用することがサポートされていないので、該当するデータソースや機能はメニューに表示されない。
####サポートされない機能
- Power BI データ カタログ

####サポートされないデータソース
- Microsoft Azure 上のサービス
- データベース
    - Oracle
    - DB2
    - MySQL
    - PostgreSQL
    - Sybase
    - Teradata 
- オンラインサービス
    - SharePoint
    - Dynamics CRM
    - SAP
    - Salesforce
- その他
    - Active Directory
    - Exchange

#導入と更新
Office のエディションやバージョンによって リボン など GUI が異なるが基本的な操作もしくは機能は同じ。Power Query for Excel アドインや Excel のアップデートに合わせて使用できる関数や機能などが追加されるので最新の状態に更新し使用されることが望ましいでしょう。
##Office 2016 / 2019
Excelに統合済みなのでなにもしなくても使い始めることができる。
[データ]タブ → 取得と変換
###GUI - リボン
リボンの表示は導入先の Office 環境により異なる。
ex. Office 365 ProPlus
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/08302b9f-3381-a81c-dadd-19f5e069c8a2.png)
ex. Office Professional Plus
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/c7a4b767-b26c-70fe-c1c8-b6614ae16687.png)
###更新
**製品(Excel)の更新に含まれる。**
##Office 2013
Power Query for Excel アドインのインストールが必要
[Power Query]タブが追加される。
###GUI - リボン
POWER QUERY タブが追加される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/4fa8e42c-81a6-5c59-237b-d88ccba687fc.png)
###更新
**製品の更新に含まれない。**アドインを更新する。
##Office 2010
Power Query for Excel アドインのインストールが必要
Office 2010 Professional Plus + Software Assurance(SA) の Excel 2010
SA付帯した Volume License(VL)で購入した Office 2010 Professional Plusということ
###GUI - リボン
POWER QUERY タブが追加される。
###更新
**製品の更新に含まれない。**アドインを更新する。

#Power Query for Excel
Microsoft ダウンロードセンターから
[Download Microsoft Power Query for Excel from Official Microsoft Download Center](https://www.microsoft.com/ja-jp/download/details.aspx?id=39379)
Office のアーキテクチャ(64bit/32bit)に合わせることが必要

||Office 2013|Office 2016|
|:-------------------|:----------:|:----------:|
|Power Query for Excel アドイン|必要|不要|

||Office 2013|Office 2016|
|:-------------------|:----------:|:----------:|
|Power Query Premium | Professional Plus|Professional Plus / Office 365 ProPlus |
|Power Query Public|☝以外|☝以外|

#情報
- [Excel 2016 で取得と変換を実行する - Excel](https://support.office.com/ja-jp/article/Excel-2016-%e3%81%a7%e5%8f%96%e5%be%97%e3%81%a8%e5%a4%89%e6%8f%9b%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b-881c63c6-37c5-4ca2-b616-59e18d75b4de)
- [Microsoft Power Query for Excel のヘルプ - Excel](https://support.office.com/ja-jp/article/Microsoft-Power-Query-for-Excel-%E3%81%AE%E3%83%98%E3%83%AB%E3%83%97-2b433a85-ddfb-420b-9cda-fe0e60b82a94)
- [Power Query M Reference](https://msdn.microsoft.com/en-us/library/mt211003.aspx)

#その他
[Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
[Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
Windows10Mobile機をリカバリしたときのメモ 

#概要
子供向けに用意していたWindows10Mobileが急遽iPhone5になった
http://qiita.com/akazaru/items/ea0339e7bb17c195836d
ので、空いたWindowsMobileを自分用に作り直そうとしてリセットしてハマった。

#動機
WindowsMobile機はそれ自体でリセットが可能。工場出荷状態に戻せるが、Versionはそのまま。
個人情報はおろか、キーボードや言語も入っていない素の状態になる。

Windows10Mobile機は日本語他のキーボードや言語が簡単には追加できず、
InsiderPreview等のUpdateが発生したタイミングで一緒に導入される。
（http://qiita.com/tkprof/items/31828758647598b81a64 は試したがNGだった。。。）

しかし子供に渡すためにOSのUpdateをしていた為、最新になっていた(10.0.15063.540)。
http://www.itmedia.co.jp/pcuser/articles/1704/07/news098.html
https://www.microsoft.com/ja-jp/windows/windows-10-mobile-specifications
こういう話があり、そもそも対象外の機種＆これ以降のUpdateが期待できない
　　　　　　　　　→日本語キーボードを入れるチャンスがない。
という事態に。軽々しくリセットしてハマった。。。

#リセット前の状況
メール、Skype、Slack等コミュニケーションツールをインストールし、
メールアカウントも複数登録していた。（各サービスの断で連絡が取れなくならないように）
それをひとつひとつアカウントを削除し自分のアカウントを設定するのが面倒だったので
リセットを実施。（実はリセットした際にちょっと大変さを思い出したが手遅れ）

#手順
- Windows10Mobileのリセット手順
  - 設定 => システム => バージョン情報 => 電話のリセット
　　これで綺麗さっぱりアプリ、個人情報とともにキーボード、言語も削除。Versionはそのまま

- Windows Device Recovery Tool
 1. Download：http://go.microsoft.com/fwlink/p/?LinkId=522381
 2. Windows7～10のPCにインストールする。
 3. 接続すると接続機種の選択画面が表示されるので選択
 4. 画面上で対象機器にインストールするファームウェアのバージョンを確認。
 5. 対象機器へのダウンロード＆インストール

  これでWindows8.1Mobileに戻るので日本語キーボードをインストールしつつ、Windows10へのUpgrade。
　　
　　
#結果
  Windows Device Recovery ToolでWindows8.1へ
  ストアアプリでUpgrade AdvisorをInstallし実行。
  無事Windows10Mobileに復帰。
  ただ、Upgrade Advisorで入るのは"Threshold 2"(10.0.10586、2015年11月)。
  Update完了後に電話の更新をすると"Redstone 1"(10.0.14393、2016年7月)になる。
  それから後はInsider Previewで。まずはスローにして更新すると”Redstone 2”(10.0.15063.2、2017年3月)が適用可能になる。
  Lumia636では現在のところそこまで。
  

#備考
　Redstone 3 はいつくるのだろう？
CentOSにGo言語のインストール


先日作成したCentOS7仮想環境にGo言語をインストールしてみます。

## Goのダウンロード
公式サイトから最新のバージョンのURIを確認します。
https://golang.org/dl/

確認したリソースを取得する。

```bash
$ wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz
```

## Goのインストール
展開して、適当な場所に置くだけです。

```bash
$ tar vzfx go1.9.linux-amd64.tar.gz
$ sudo mv go /usr/local/
```

環境変数GOPATHを設定します。
また、PATHに"/usr/local/go/bin"、"$GOPATH/bin"を追加しておきます。
.bash_profileあたりに書いておくことにします。

### 確認
```bash
$ go version
go version go1.9 linux/amd64
$ echo $GOPATH
/home/centos/go
```

## Hello, world!
おなじみ、最初のプログラムです。

```go
$ vim hello.go
package main
import (
   "fmt"
)

func main(){
    fmt.Println("Hello, world!");
}
```

runでコンパイルと実行をまとめて実行できる模様です。

```bash
$ go run hello.go
Hello, world!
```

終わりです。

## 参考
http://golang.jp/effective_go
WMwareでCentOS7環境を作る



調べ物のためにLinux環境が欲しかったので、Windows7上のVMwareに、CentOS7を入れました。

## ダウンロード
[VMware](https://www.vmware.com/products/player/playerpro-evaluation.html)
[CentOS](https://www.centos.org/download/)

## VMwareのインストール
インストーラで適当にインストールします。

## 仮想マシンの作成
WMwareを起動して「新規仮想マシンの作成」ー「後でOSをインストール」ー「Linux（CentOS 64ビット）」ー仮想マシンの名前と場所、最大サイズを決めて作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/2d87ac32-27ad-ad9f-cd42-a7f5eb31f843.png)

メモリは4GB、プロセッサを2に。あとはデフォルト設定のままです。

## CentOS7のインストール
仮想マシンを選択して「仮想マシン設定の編集」から「CD/DVD(IDE)」にダウンロードしておいたCentOSのISOを指定します。

そしたら「仮想マシンの再生」を押します。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/4d1a1baf-ee59-0766-a05c-9d0a57938bbd.png)

「この仮想マシンは、64ビットゲストOS向けに構成されています。ただし、64ビット操作は使用できません。
このホストはIntel VT-xに対応していますが、Intel VT-xは無効になっています。」

エラーやんけ！

### BIOS設定
エラーメッセージどおり無効になっていたBIOS設定を有効にしました。
私の環境ではCPU詳細設定にありました。

ちょっと試すのにホストのBIOS設定を変更するっていうのはイヤですね…。

### 再挑戦
![image](https://qiita-image-store.s3.amazonaws.com/0/197945/a7f66e28-e856-21ef-add6-7d5a99a473ba.png)

ENTERを押してインストールスタート！

GUIの設定画面がでるので「ソフトウェアの選択」で適当に選択します。

「インストール先」のパーティションを選択し、「ネットワークとホスト名」を選択して「インストールの開始」を押したらしばらく待ちます。

インストール中にユーザの設定ができるのでROOTに適当なパスワードを設定、"centos"というユーザを作成しておきました。

インストールが終わったら、「再起動」をします。

### 確認
ホスト（Windows7）からTeraTermで作成したユーザを使って接続できることを確認して完了です。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/fafed3d3-8675-181d-85a3-71842b7168c3.png)

## 初期設定
引き続き、最低限の設定をします。プライベート環境なのでトラブルの元になりやすいセキュリティ設定をきっておきます。

### SELinuxを無効にする
```Bash
$ sudo setenforce 0
$ getenforce
Permissive
$ sudo vi /etc/selinux/config
```

### firewallをオフ
```Bash
$ systemctl status firewalld
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
```

## コマンドをインストールする
必要になりそうなものをインストールしておきます。

### wgetをインストール
```bash
$ sudo yum install wget
```

### vimをインストール
```bash
$ sudo yum install vim
```

### gitをインストール
```bash
$ sudo yum install git
```


終わりです。

## 参考
https://www.pct.co.jp/technical_note20160705-001
[クイズ]javascriptと仲良くなるための一歩　第４１話「this」

#問題

```js
function Car(brand) {
   this.brand = brand;
}
Car.prototype.getBrand = function() {
   return this.brand;
}
var foo = new Car("toyota");
println(foo.getBrand());  // "toyota"
var brand = "not a car";
var bar = foo.getBrand;
println(bar());  // ？
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:


```js
function Car(brand) {
   this.brand = brand;
}
Car.prototype.getBrand = function() {
   return this.brand;
}
var foo = new Car("toyota");
println(foo.getBrand());  // "toyota"
var brand = "not a car";
var bar = foo.getBrand;
println(bar());  // "not a car"
```
明示的なインターフェイス実装

C# の [
IEnumerator Interface](https://msdn.microsoft.com/en-us/library/system.collections.ienumerator(v=vs.110).aspx)のページによくわからないコードがあった。師匠に聞いてみると、明示的なインターフェイス実装というコーディング方法らしい。ちょっと試してみた。


# 通常のインターフェイス実装

```csharp
    public interface IFoo
    {
        string GetSome();
    }

    public class Foo : IFoo
    {
        public string GetSome()
        {
            return "Foo!";
        }
    }

 :
        static void Main(string[] args)
        {
            IFoo foo = new Foo();
            Console.WriteLine($"IFoo: {foo.GetSome()}");
            Console.WriteLine($"Foo : {((Foo)foo).GetSome()}");
:
```

結果は普通に

```
IFoo: Foo!
Foo : Foo!
```

# 明示的なインターフェイス実装

さて問題の謎実装。明示的なインターフェイス実装というらしい。

```csharp
    public class SpecialFoo : IFoo
    {
        string IFoo.GetSome()
        {
            return "Special Foo!";
        }
    }
:
        static void Main(string[] args)
        {
            IFoo specialFoo = new SpecialFoo();
            Console.WriteLine($"IFoo: {specialFoo.GetSome()}");
            //  Console.WriteLine($"SpecialFoo : {((SpecialFoo)specialFoo).GetSome()}");  // コンパイル不可
:

```
インターフェイス経由でメソッドを呼ぶと問題ないが、実装クラスにキャストすると、`GetSome()` などないといわれる。なんとも面白い動きだ。実装クラスから、インターフェイス実装を隠したいときとかに使うらしい。

# 複数インターフェイスの実装

複数インターフェイスを実装したらおもしろいことができる。

```csharp
    public interface IFoo
    {
        string GetSome();
    }

    public interface IBar
    {
        string GetSome();
    }
      
    public class FooBar : IFoo, IBar
    {
        string IFoo.GetSome()
        {
            return "IFoo.FooBar";
        }
        string IBar.GetSome()
        {
            return "IBar.FooBar";
        }
        public string GetSome()
        {
            return "FooBar";
        }
    }
:
        static void Main(string[] args)
        {
            FooBar fooBar = new FooBar();
            Console.WriteLine($"IFoo: {((IFoo)fooBar).GetSome()}");
            Console.WriteLine($"IBar: {((IBar)fooBar).GetSome()}");
            Console.WriteLine($"FooBar : {fooBar.GetSome()}");
:

```

実行結果

```
IFoo: IFoo.FooBar
IBar: IBar.FooBar
FooBar : FooBar
```

なんとも面白い仕様！さて、コレクションの調査に戻る。
計算幾科学者がマスターしておくべき七つの言語

計算機科学者（コンピュータサイエンティスト）たるもの，古い言語に執着して新しい言語を学ばないことは恥ずべきことだ．かと言って，新しい言語を追いかけすぎても計算機の本質を見失うことになる．そこで，2017年の計算機科学者がマスターしておくべき七つの言語を理由付きで紹介しておこう．

（ちなみに全て僕の主観である．反論はこちらでも良いし [Twitter](https://twitter.com/kanaya) でも受け付けたい．）

# A. 計算の本質を極めるための言語
計算機科学者は計算の本質を極めねばならない．それには Lisp 系言語は鉄板として，他に意外な言語が役に立つだろう．

## A-1. Scheme
計算の本質はラムダであり，その最もシンプルな計算機表現はS式だ．S式をマスターするには，S式そのものである Scheme 言語が一番良いだろう．名著 [Structure and Interpretation of Computer Programs](https://www.amazon.co.jp/gp/product/489471163X/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=ichikanaya-22&camp=247&creative=1211&linkCode=as2&creativeASIN=489471163X&linkId=cb840c4855c313002fd9f0900a5d3a97) を読むにも Scheme の読解力が必要である．

## A-2. Common Lisp
Common Lisp のマクロは「プログラムを生成するプログラム」として唯一の実用的な言語だ．また大規模なプログラムも書ける上に，もし好きならオブジェクト指向方法論を自然に取り入れることも可能だ．
僕は「計算機言語の本質は機械語だ」という主張を否定しない．ただ僕は「Lisp は Lisp 機械の機械語だ」と主張したい．だから Lisp プログラマは，機械語プログラマでもある．

Common Lisp の教科書ではないけれど，[On Lisp](https://www.amazon.co.jp/gp/product/4274066371/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=ichikanaya-22&camp=247&creative=1211&linkCode=as2&creativeASIN=4274066371&linkId=80f45a26779b14daf7102fe69bac27ed) は Lisp のパワーを知る上で最上の本だと思う．

## A-3. 冗談言語
チューリング完全な冗談言語を何かひとつマスターしておこう．そうすることで，チューリングマシンの気持ちか，あるいはラムダ式の本質がわかるようになる．前者を試したければ Brainfuck を，後者を試したければ Lazy K を勧めたい．

# B. 数学とプログラミングの間を泳ぐ
計算アルゴリズム，つまり逐次実行，条件分岐，繰り返し（または再帰）の組み合わせと，伝統的な数学の間には大きな乖離があるように見える．この両者はラムダ式によって見事に統一されるのだが，それでもなお，ユーザとの入出力，非決定性，状態などの重要な概念と数学の参照透過性という概念の間には大きな溝がある．この両者は最終的にモナドという数学概念を通して統一的に扱えるようになる．そこで，モナドを意識したプログラミング言語をぜひ一つはマスターしておきたい．

## B-1. Haskell
モナドを陽に扱う計算機言語のひとつとして，比較的ライブラリが充実している Haskell を勧めたい．

Haskell は v7.10 以降が数学的に美しい（アプリカティブ関手が正しい位置に収まる）のだが，教科書やウェブサイトによっては v7.10 よりも古いコンパイラを対象としたものがあるので注意が必要だ．

# C. 実用的なコードを書く
計算機科学者は実用的なコードも書かなくてはならない．Common Lisp や Haskell でも実用的なコードは書けるが，よりポピュラーな言語も覚えておく必要があるだろう．なおシェルスクリプトと AWK は空気なのでカウントしなかった．

## C-1. C++11/14
だいたいどんな計算機でも動く上に，大規模なプログラムも書ける．組み込みも C++ のサブセットでいけることが多い．

もし数値計算を行うならば，次に述べる Python を第一選択に考えてみるべきだ．数値計算のライブラリが豊富に揃ってきているし，コードも C++ よりは遥かに読みやすいものになる．

## C-2. Python
実用的でクリーンなコードを書こうと思ったら Python (v3) がお勧めである．Python というと素人くさいと思われるかもしれないが，今や極めて堅牢で，実用的で，十分な実行速度がある．

## C-3. Java | Swift | ECMAScript
モバイル開発，ウェブ開発のいずれかは出来た方がいいのと，ジェネリックだったりオプショナルだったりという，Common Lisp や Haskell の機能が劣化コピーされていく過程を見るという意味で，新し目の言語を一つは覚えておいた方がいい．

# D. どうでもいい言語
最後に「歴史的理由」だけでマスターしておいた方が良い言語を挙げておく．

## D-1. C89 (ANSI C)
プログラマなら C89 (ANSI C) は読めて当然という風潮が未だにあるように思う．C89 が支配的だった時代が過去のある時期続いたからだろう．

ただし C89 が支配的だった時代と現代では，求められるお作法がまるで違う．C89 で安全なコードを書くには常に知識をアップデートしていかないといけない．

---

[リンク元](https://pineapple.blog/計算幾科学者がマスターしておくべき七つの言語-a1eeee857538)
iOSアプリの中国からのダウンロードが多い件・そして終息へ？【実際のグラフあり】

**10/3 追記: 
10/2あたりから、@tosakakun さんや [appleのフォーラム](https://forums.developer.apple.com/thread/84146)などで中国からの異常に多いダウンロードが止まったという報告が出てきました。このまま終息へと向かうのか、はたまた休止期間なのか・・・**


## 注意
- 誤解を招く表現ですが、iOSアプリとandroid他のアプリを比較してというわけではありません。
- **原因は結局不明で、事実報告と私の推測のみです。原因を知りたい方はご自分で調べてください。（わかったら教えてください）**
- ここでは「ダウンロード」という言葉を使っていますが、正確には「ユニット」のことを指します。「ユニット」とは、新規ダウンロードのことを指し、同じユーザーの2回目以降のダウンロードをカウントしません。
- 特定の人種への批判等を行う投稿ではありません。

## 謎の中国からのダウンロード
３月にiOSアプリ[英単語タイマー1800 大学受験編](https://itunes.apple.com/us/app/id1218804893?l=ja&ls=1&mt=8
)をapp storeで配信しました。**このアプリは名前の通り、英単語に関するアプリで、中国語は一切含まれていません。アプリの説明も全て日本語です。もちろん、配信しているストアは日本のストアです。**
中国からのダウンロードが始まったのは７月からです。そして、８月に一気に増えました。
関係がありそうなのは、この８月に2ch・Twitterなどで広報活動を行ったことくらいです。この広報活動の結果、一時的に日本からのダウンロードが増えたのですが、日本からのダウンロードが減ってくると同時に、なぜか中国からのダウンロード数が増えてきました。

## より細かく

### 実際に中国からのダウンロードは多いのか
itunes connectの「売り上げとトレンド」を確認したところ、以下のような統計結果が得られました。
<img width="1152" alt="qiita_china_download.png" src="https://qiita-image-store.s3.amazonaws.com/0/164020/1afc8051-f6d7-da4a-746a-6ae997c39271.png">
緑色が日本・青が中国です。
8月14日あたりから日本からのダウンロードが伸びたあと、8月18日からは日本からのダウンロードはほぼ０に減っていきます。それと同時に、中国からのダウンロードが増加し、この記事の初回投稿日の前日、8月25日には100を超えるまでに至っています。(おそらく日本からのダウンロードが減ったタイミングとは関係ないと思います。日本でのダウンロードが増えた数日後から中国からのダウンロードが始まったと見るべきでしょう)ちなみに8月25日の日本のダウンロード数は1に対し、中国からのダウンロードは101でした。
このように、中国からのダウンロードが日本と比較してかなり多いことがわかるかと思います。

### 中国人（？）がアプリをダウンロードする意味は？

<img width="960" alt="qiita_china_download2.png" src="https://qiita-image-store.s3.amazonaws.com/0/164020/d0f20c87-7637-5bca-61f5-d99edefd1e5d.png">

グラフを見比べるとわかるのですが、先ほどのグラフでは8月18日から中国からのダウンロードが増え、このグラフの最大値である8月15日の時点（ダウンロード数のグラフの最大値の時点）よりもダウンロード数は増えているのに対し、セッション数は減少傾向にあります。
このことからわかるように、日本からのダウンロード比率が多い時期に比べ、**中国からのダウンロード比率が多い時期にはアプリのセッション数（アプリを２秒以上使用した回数）が低い**という結果になりました。

つまり、**中国からアプリをダウンロードするユーザーは、ダウンロードしただけでアプリを使っていない割合が多い**（もしくは、データの取得を拒否している割合が多いからとも考えられます。Appleは、ダウンロード数は全ユーザから集計を取るのに対し、セッション数はユーザーが許可した場合しか集計をとっていません）ということです。
ということは、中国のユーザーはアプリを使用目的以外（解析目的・ランキング操作など）に使っているのかもしれません。
ちなみに、中国の開発者にコピーアプリを制作されたという事例もあるようです。
[アプリが勝手に中国語化されてリリースされていると聞いて調べてみたら、想像以上にやばかった](http://tomeapp.jp/archives/862)
**[8/28 追記]**
**リファーラルスパムやランキングのソートアルゴリズムの調査のためにダウンロードされているのではないかというコメントをいただきました。**
なんにせよ、不気味です・・・


## 原因・意図は不明
一体誰が・何のためにダウンロードしているかは謎です。

- 中国に住む日本人の間で私のアプリが細々と話題になっているが、appleに統計データは渡したくないというユーザが多い
- 中国で私のアプリをダウンロードして、中身を調べようとしている悪徳（？）開発者がいる

[8/28 追記]

- リファーラルスパムとしての宣伝目的
- ダウンロードによりランキングを操作し、ソートアルゴリズムを調査する目的

これらが目的として考えられますが、実際のところはわかりません。

詳しい方はコメントいただけると嬉しいです。
pythonさんこんにちは。

python3を使いたくなったので最初のところのメモ。

### python3を入れる

```bash

localhost:~ yoichan$ python3
-bash: python3: command not found
localhost:~ yoichan$ brew install python3

...

localhost:~ yoichan$ python3 -V
Python 3.6.2
```

### virtualenvを入れる

```bash

localhost:~ yoichan$ pip3 install virtualenv
Collecting virtualenv
  Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
    100% |████████████████████████████████| 1.8MB 397kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-15.1.0
localhost:work yoichan$ virtualenv Komachin
Using base prefix '/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/yoichan/work/Komachin/bin/python3.6
Also creating executable in /Users/yoichan/work/Komachin/bin/python
Installing setuptools, pip, wheel...done.
```

### 環境を作る

```bash

localhost:work yoichan$ mkdir Komachin
localhost:work yoichan$ cd Komachin/
localhost:Komachin yoichan$ mkdir env
localhost:Komachin yoichan$ virtualenv env
Using base prefix '/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/yoichan/work/Komachin/env/bin/python3.6
Also creating executable in /Users/yoichan/work/Komachin/env/bin/python
Installing setuptools, pip, wheel...done.
```

`activate`するとつくった環境のコマンドが使われる

```bash

localhost:Komachin yoichan$ source env/bin/activate
(env) localhost:Komachin yoichan$ which python
/Users/yoichan/work/Komachin/env/bin/python
(env) localhost:Komachin yoichan$ which pip
/Users/yoichan/work/Komachin/env/bin/pip
(env) localhost:Komachin yoichan$ ls -l env/bin/
total 136
-rw-r--r--  1 yoichan  staff   2089  8 26 17:46 activate
-rw-r--r--  1 yoichan  staff   1031  8 26 17:46 activate.csh
-rw-r--r--  1 yoichan  staff   2185  8 26 17:46 activate.fish
-rw-r--r--  1 yoichan  staff   1137  8 26 17:46 activate_this.py
-rwxr-xr-x  1 yoichan  staff    262  8 26 17:46 easy_install
-rwxr-xr-x  1 yoichan  staff    262  8 26 17:46 easy_install-3.6
-rwxr-xr-x  1 yoichan  staff    234  8 26 17:46 pip
-rwxr-xr-x  1 yoichan  staff    234  8 26 17:46 pip3
-rwxr-xr-x  1 yoichan  staff    234  8 26 17:46 pip3.6
lrwxr-xr-x  1 yoichan  staff      9  8 26 17:46 python -> python3.6
-rwxr-xr-x  1 yoichan  staff   2348  8 26 17:46 python-config
lrwxr-xr-x  1 yoichan  staff      9  8 26 17:46 python3 -> python3.6
-rwxr-xr-x  1 yoichan  staff  13068  8 26 17:46 python3.6
-rwxr-xr-x  1 yoichan  staff    241  8 26 17:46 wheel
```




### hello worldしてみる

```bash

(env) localhost:scripts yoichan$ vi hello.py
```

```py3

# hello.py
print("Hello world!")
```

```bash

(env) localhost:scripts yoichan$ python hello.py
Hello world!
```

よさそう。
Goでラベル付Tupleのようなもの

を実装してみた。
Swiftでタプル依存な体質になってしまったのでGoでも使いたいと思ってしまうことがちょいちょいあった。
アイデア元は[goderive](https://github.com/awalterschulze/goderive)というcode generatorツールから。全体サンプルは[こちら](https://play.golang.org/p/kLzR1TwOrs)に
## コード
基本方針としては多値関数としてタプルを定義。
ラベルでのgetter, setterをそれぞれ関数として作成し、タプルの初期化は`NewABTuple`でラップする。

```
type ABTuple func() (*A, *B)

func (t ABTuple) A() *A {
	a, _ := t()
	return a
}

func (t ABTuple) B() *B {
	_, b := t()
	return b
}

func (t ABTuple) SetA(a *A) ABTuple {
	return NewABTuple(a, t.B())
}

func (t ABTuple) SetB(b *B) ABTuple {
	return NewABTuple(t.A(), b)
}

func NewABTuple(a *A, b *B) ABTuple {
	return func() (*A, *B) {
		return a, b
	}
}
```

イチイチ関数書かないとダメなのでこの辺もcode generatorの方で生成されるようになると嬉しい。
上のでやっぱり便利だなと思ったらtupleのcode generator作ってみようかなと。。
## 改修ポイント
- `ABTuple`の型の関係でポインタレシーバに出来ずsetterでNew返すのはなんかアレ。。

#### 追記
よくよく考えたら上のような用途だとstructで十分では...
コマンドラインでは動作するのにRubyMineではエラーになる時の対応

Rails 実行・デバッグや，RSpec がコマンドラインでは正常に動作するのに，RubyMine経由で実行するとエラーになる場合は，下記を確認して解決した．

# 検証条件
- RubyMine 2017.2.2


# 1. SDKがプロジェクトのを使うようになっていること

`Run > Edit Configurations > Rails > Ruby SDK` をチェックして，プロジェクト名になっていることを確認する．
`Rspec` も同様．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/c3aab582-b4fd-85db-1e6c-c39480bad635.png)

# 2. `bundle exec` で実行されていること

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/96d696be-0e50-4f5d-7b11-832bf227775c.png)



# 3. RubyMine 経由で `bundle install` していること

コマンドラインから `bundle install` している場合に，RubyMine経由でgem関連の処理が実行された時にエラーになることがある．
例えば `Your bundle is locked to xxxx (3.0.0)` のような Gem ファイルのバージョンと食い違っています的なエラーが出るとき．
またこの時は `Gemfile` 上でも行がハイライトされて警告がでている．

コマンドラインからではなく，RubyMine経由で `bundle install` すると解決する．

`Tools > Bundler > Install`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/5c7bd3cc-a90c-378f-152b-36e87d46d435.png)
WebサイトでSquareのPOSレジアプリを使う（iOS編）

Squareではスマートフォン向けにPOSレジアプリを提供しています。このアプリを使うことで手軽にレジ機能が使え、さらにクレジットカード決済も利用できるようになります。数種類の商品を素早く販売するキオスクアプリに使ったり、その場で金額を入力して決済してもらうことができます。

![IMG_2894.PNG](https://qiita-image-store.s3.amazonaws.com/0/197026/31120018-4697-bc71-3cc0-9907f6c27116.png)

このPOSレジアプリにはAPIがあります。POS APIというのですが、これを使うと自分の作ったスマートフォンアプリとPOSレジアプリを連携させられます。URLスキームを使ったアプリ連携機能を使うのですが、これは何もスマートフォンアプリだけでなく、Webサイトでも利用できます。

今回はこのWebサイトにおけるPOSレジ機能の利用法について紹介します。まずはiOSでの実装方法です。[Androidでの実装はこちらを参考にしてください](http://qiita.com/goofmint/items/c462a686c7c63b5f8b16)。

## コードについて

今回のコードは[goofmint/Square_Web_POS_API_Demo](https://github.com/goofmint/Square_Web_POS_API_Demo)にアップロードしてあります。実装時の参考にしてください。このコードでは以下のライブラリを使っています。

- **Onsen UI**  
Webサイトに簡単にネイティブアプリライクなUI/UXを実装できるライブラリです。
- **jQuery**  
DOM操作用。

いずれも必須という訳ではありませんが、開発のしやすさのために利用しています。

## POSレジアプリの呼び出しについて

今回は https://example.com/ というサイトで決済を開始し、決済が終わった後に https://example.com/callback というURLを呼び出す形で実装します。

まずWebサイト側では以下のようなコードでURLを呼び出します。

```
var dataParameter = {
  // 金額に関する情報
  "amount_money": {
    "amount" : "100",
    "currency_code" : "JPY"
  },
  // POSレジアプリがコールバックするURL
  "callback_url" : 'https://example.com/callback',
  // アプリケーションID（自分のものに置き換えてください）
  "client_id" : "YOUR_APPLICATION_ID",
  // バージョン（現在は1.3固定です）
  "version": "1.3",
  // 取引に関する説明書き
  "notes": "取引に関する説明書き",
  "options" : {
    // 利用できる決済方法
    "supported_tender_types" : [
      "CREDIT_CARD",      // クレジットカード
      "CASH",             // 現金
      "OTHER",            // その他
      "SQUARE_GIFT_CARD", // ギフトカード
      "CARD_ON_FILE"      // オフライン決済
    ]
  }
};
// URIの生成
var uri = "square-commerce-v1://payment/create?data=" + encodeURIComponent(JSON.stringify(dataParameter));
location.href = uri;
```

金額は数値とともに通貨単位を指定する必要があります。さらにコールバックURLは自分のサイトのものを、アプリケーションIDも自分のものに置き換えてください。決済手段は提供できるものを指定してください。

呼び出すURIですが、スキーマは `square-commerce-v1` 固定です。パスは `/payment/create` で、 `data` パラメータに対して各種設定を指定します。

## 実行してみる

実行すると Safari からPOSレジアプリが呼び出されて決済画面になります。

![IMG_2893.PNG](https://qiita-image-store.s3.amazonaws.com/0/197026/838cd210-44d8-dae7-971f-cc97e7b173e8.png)

決済が完了すると、再びSafariが呼び出されます。この時のURLは設定で指定しているコールバックURLになります。なお、このコールバックURLはSquareの管理画面であらかじめ設定しておかなければなりません。

<img width="1353" alt="Screenshot_ 2017-08-26 17.56.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/197026/0c8f8617-dc70-8041-faea-9c02c5789ef1.png">

コールバックされたURLはGETリクエストになります。そしてdataパラメータを持っています。

![IMG_2891.PNG](https://qiita-image-store.s3.amazonaws.com/0/197026/eb7826dd-7722-1f1c-bede-a0d71a6db3e8.png)

このdataパラメータで指定される文字列はJSONオブジェクトになります。例えばJavaScript上で処理を行う場合としては、次のように処理できるでしょう。

```
var param = JSON.parse(
  decodeURIComponent(
    location.search.replace('?data=', '')
  ));
```

こうして取得できるデータとしては下記になります。

|パラメータ|内容|
|--------|--------|
|status|結果。正常終了の場合はokという文字です|
|transaction_id|トランザクションID。ユニークなIDです|
|client_transaction_id|クライアントトランザクションID。オフライン決済用です|

----

このような手順でiOSのSafari上でPOSレジアプリによる決済を提供できるようになります。なお、Chromeなどのサードパーティーのブラウザでも利用できます。

実店舗や移動式店舗などと連動してWebサイト上で物販する際などにぜひ使ってみてください。カフェなどでアプリを作るのは難しくとも、HTMLであればそれほど手間をかけずに作れるのではないでしょうか。

[Square Connect API Documentation](https://docs.connect.squareup.com/articles/web-api-ios)
csv添付メール送付時のファイル名指定


pythonでcsv添付ファイルを添付したメールを送付する際に，
windowsに送付すると `無題のドキュメント.txt` になってハマったのでメモ．

```
from email.mime.text import MIMEText
from django.core.mail import EmailMessage

filename = 'test.csv'
encoding = 'cp932'
contents = create_csv()  # ここでcsvファイル作成
contents = contents.encode(encoding, 'ignore')  # python3のunicode型からstr型へ変換
csv_file = MIMEText(
    contents,
    'csv',
    encoding,
)

csv_file.set_param('name', filename)  # outlook対応

csv_file.add_header('Content-Disposition', 'attachment',
                    filename=('iso2022-jp', '', filename))

email = EmailMessage(
    'メールタイトル',
    'メール本文\n',
    to=['hoge@example.com'],
    attachments=(csv_file,),
)
email.send()
```

実際に送付されるメールの添付ファイル部分は以下の通り．

```
--===============3879210183231680079==
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: text/csv; charset="cp932"; name="test.csv"
Content-Disposition: attachment; filename*=iso2022-jp''test.csv

ファイルの内容

--===============3879210183231680079==--
```


EmailMessageはdjangoで用意されている送付用のメソッド．
attachementsで添付したいファイル等を追加していく．

添付するファイルのMIMETypeは `text/csv` なので `email.mine.text.MIMEText` を使う．
ファイル名は `Content-Disposition` で指定．
macのmailやgmailはこれで問題ないが，outlookはこのヘッダを見てくれない．



`Content-Type` の最後にある `name="test.csv"` が重要で，outlookはこれを見てファイル名を表示しているらしい．  

日本語のファイルの場合はnameをbase64encodeで変換する必要があるらしい．

```
Content-Type: application/applefile;
	name="=?utf-8?B?5pel5pys6Kqe44Gu44OV44Kh44Kk44OrLmNzdg==?="
```
VS Code のタイルを見やすくする

## 問題

Insider-build では既に変更されている新しいアイコンですが、境界線らしき境界線がなくタイルの背景によっては見づらくなります。極端な例を挙げると

<img src="https://qiita-image-store.s3.amazonaws.com/0/76740/e9043ead-848a-7596-973a-78d17f1aebfd.png" width="300">

こうなります。これはさすがにきついので Visual Studio のタイルのように変更してみます。

## 結果

https://github.com/EbXpJ6bp/VS-Code-Start-Menu-Patch/

<img src="https://qiita-image-store.s3.amazonaws.com/0/76740/2b3cc812-7d1c-01e5-7b48-cf13b2ba9c93.png" width="300">


## やってること
特にひねりもなく `.visualelementsmanifest.xml` を利用します。

```xml
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <VisualElements
      BackgroundColor="#2D2D30"
      ShowNameOnSquare150x150Logo="on"
      ForegroundText="light"
      Square150x150Logo="Assets\VisualStudioCode.150.png"
      Square70x70Logo="Assets\VisualStudioCode.70.png" />
</Application>
```

画像とxmlを配置してもスタートメニューのlnkは自動的に更新されないので、 Powershell(管理者) を使ってファイルスタンプを更新します。

```ps1
(ls "<your vscode insider lnk in start menu>").lastwritetime = get-date
```

なお lnk が更新できればいいので、コマンドでなくてもフォルダーから完全に削除して再配置すれば変わるはずです
Pythonで言語処理100本ノック2015 問題00


普段はPHPerですが将来的にPythonで仕事したいです。
ということで、まず評判分析が面白そうという好奇心から言語処理100本ノックを始めました。
Python始めて３ヶ月・・・言語処理も機械学習も全くの素人です！
コメントでご指摘など頂けましたらありがたいです。

##環境
・macbookAir (Sierra)10.12.3
・python 3.6
・anaconda 4.3.0
・jupyter notebook

>00.問題：文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．

```:Python3
s = 'stressed'
print(s[::-1])
```

```:実行結果
desserts
```
slice()を使って
・逆順から
・全部取得
だけで逆順になりました。

#参考
・slice()に関して: https://qiita.com/ycctw1443/items/03f99f3f72a797fdcbf6
SW工学手法を導入すると、どう導入すればよく成果が目立つのか（＃１）


十数年の開発期間を経て品質関連コンサルを５年目やっているのですが僕も周りにはいわゆる「スタート・アップ」と言われる企業をやってる方がおおいです。

企業人数が１０人当たりの場合、開発がフール・スタック開発者に全部行われて仕様管理、開発の進捗管理、テスト管理までやる精神的な暇はない。こんな組織に「コード分析をしましょう」とか「仕様管理をちゃんと記録して管理しましょう」のコンサルは受けられるわけはないですね。

個人的にいままで経験したのを整理すると下のようです。

**規模が大きい組織の場合**

* 開発チームが別にあるしパート別に担当者がいる。
* テストも単体でやってる。（もちろん組織によってしないのもあります。）
* 自分のコードの品質向上活動も仕事の一部。
* 大体にクライアントさんの範囲が広い。
* 以外にアジャイルで興味が高い。

**規模が小さい組織の場合**

* 開発の担当区分が曖昧。
* 単体テストをやる精神的な暇がない。流れ込む仕事の処理でいつも忙しい。
* もちろんコード品質管理は興味なし。（すれば良いのは知ってるけれども…）
* 大体にクライアントさんの範囲が狭い。
* 以外にアジャイルに興味がない。

組織がアジャイルとかのいろんなSW工学手法を導入すると、どう導入すればよく成果が目立つのかが僕のポイントです。

そのポイントに着くため僕が建てた仮説は下のようです。

**（開発組織が）大きい場合：下流工程<sup>＊</sup>にフォーカスする。**
**（開発組織が）小さい場合：上流工程<sup>＊＊</sup>にフォーカスする。**

＊：V-Modelの下位部分の活動（設計、開発ー単体てすと、統合テスト、システムテストなど）の意味です。
＊＊：V-Modelの上位部分の活動（仕様分析、機能定義ー受け入テスト）の意味です。



詳しい話は次の投稿でやります。:boy_tone1:
サーバー構成基礎基本のき

# はじめに
## 前置き
昨今クラウド上でパズルみたいにサーバー群を組み合わせてサービスのインフラを構成できるようになっています。
今まで便利だなあくらいでその構成についてはをあまり気にしてこなかったのですが、何がどうしてそうなっているのかを推測できることはアプリケーション開発的にも重要で、それを教えてくれる先輩がちょうど！近くに！いて内容がQ&Aでわかりやすかったのでまとめようと思いました。
以下そんな内容ですが、この場合はこういう解決策あるよ！等教えていただけたら幸いです。

# ECサイトを構築するとしたら、その最小構成はどうなる？
登場人物はシンプルに、

- Webサーバー
- DBサーバー

です。

```A.データの流れはこんな感じ.txt
ユーザーPC =(問い合わせ)=> Webサーバー =(問い合わせ)=> DBサーバー
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　||
ユーザーPC <=====(結果)== Webサーバー <=====(結果)== DBサーバー
```

# ユーザーが増えてリクエスト数が増加しました
## 最初にオーバーワークになりそうなのは？
アクセス内容やアプリケーションの作りにもよりますが、だいたいの場合においては
**A. DBサーバー**
です。それも書き込みリクエストに比べて参照リクエストが多く、それが負担になりはじめます。

### 参照リクエストを上手にさばこう
#### キャッシュを利用する
WebサーバーとDBサーバーの間にキャッシュを置き、一定時間更新されなくても良いデータはそちらでさばいてもらうようにします。
ただしこれにも限界があり、特にECサイトのようにリアルタイムで変化する情報を**確実に同期させていなければいけないアクセスが多い場合（在庫数など）、あまり有効な手立てではありません**。

#### 参照DBを増やしましょう（レプリケーション構成）
参照先のDBをコピーで増やして負荷分散します。
これが**マスター1：スレーブ（マスターのコピー）nのレプリケーション構成**です。
この場合、マスターとスレーブのデータ同期が問題となってきますが、

```A.データの流れはこんな感じ.txt
ユーザーPC =(処理)=> Webサーバー =(書込み命令)=> マスターDB -(書込み/非同期)-> スレーブDB 
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　||
ユーザーPC <=(処理OK)= Webサーバー <=(処理OK)=  マスターDB

-----
ユーザーPC =(参照)=> Webサーバー =(参照命令)=> [割振り] => スレーブ?号のDB
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　       ||
ユーザーPC <=(結果)= Webサーバー <=========(結果)======= スレーブDB

```

こんな感じで書込み処理に対しては非同期にマスターからスレーブに書換えの命令が走り、参照リクエストに対しては空いてるスレーブDBからデータが返却されます。

#### 各テーブルのデータ量を減らしましょう
参照リクエストに対して答える際、他にボトルネックになりそうなのはデータ量の増加です。ユーザーデータに紐づくログデータなどは特に増加具合が激しく、**データ量が多いがゆえに検索時間がかかってリターンが遅くなってしまう**ケースが考えられます。
この場合に考えられる対策としては、

- スレーブ1：ユーザー1〜1000までのデータを保存
- スレーブ2：ユーザー1001〜2000までのデータを保存
- ...

というように、ユーザーID単位でテーブルを分ける方法ですが、管理が複雑になるため単純にDBのスペックをあげるほうが有効だったりするそうです。
DBのスペックをあげられない場合、クラスター構成といって複数の低スペックPCを一つのPCとみなして稼働させるような方法もあるらしいのですが、ここまで大規模になることはほぼないらしいので今は突っ込まずにおいておきます。
（書込みデータが10011011001100001だった場合、4台のPCでDB1が1001/DB2が1011...みたいに分割して保存したりするイメージ）

## DBサーバーを改善したら、今度はWebサーバーへのアクセス増加がボトルネックになりました
アクセス集中でWebサーバーのほうがボトルネックになった場合、どうするかというお話です。
### Webサーバーを増やしてロードバランサーをかます
DBの場合同様、負荷分散のためにWebサーバーを増やします。このとき振り分けをしてくれる仕組みが必要になるのですが、これを担当するのが**ロードバランサー**です。

### 静的コンテンツサーバーの分離
それでも限界がきた場合、静的コンテンツを分離して静的コンテンツサーバーに保存・そこからDLしてもらうように変更します。
手法としてはなんとなく知っていたのですが、なぜそれで改善するのか聞かれて答えられず。。何となく知っていて何となくやっているとこういうところが弱くなります。。

#### 静的コンテンツと動的コンテンツは何が違うのか？
**A. ファイルの大きさと生存期間**
です。
静的コンテンツ（動画や画像）は大容量のため、**素早くユーザーに届けるために必要なノウハウがそもそも動的コンテンツとは大きく異なり**ます。そのため、サーバーを分けて処理を分離したほうがお互い得意なところで改善勝負ができるというわけです。
また、静的コンテンツは動的コンテンツに比べて生存期間が長いので、キャッシュが良い仕事をします。

#### 静的コンテンツの問い合わせ分だけWebサーバーが楽をできるようになる
そもそも一般的なWebページを考えたとき、html持ってくる => imgタグから画像を問い合わせる => ...という何往復ものリクエストをWebサーバーが捌いています。
その往復回数が減るというだけでもWebサーバーはかなりの楽ができるようになります。

#### 番外編：そもそもアクセス先サーバーが物理的に遠かった場合、応答が遅くなる問題の解決（CDN）
静的コンテンツはキャッシュが良い仕事をするという話ですが、物理的に遠いサーバーへのアクセス速度を改善する仕組みとして**ContentsDeliveryNetwork(CDN)**という仕組みがあります。
CDNを設定すると**静的コンテンツを世界各国のどこかのサーバーに適当にキャッシュしてくれる**ので、一番近いキャッシュサーバーから重たい静的コンテンツを持ってこられるようになり、速度が改善するというわけです。

# 終わりに
以上、この話は実はCDNって何ですかという話から派生したのですが、それ以外のほうをしっかり教えてもらうことになりました。
これを機にちゃんと「なぜそうなっているのか」をはっきりさせる根気を持つようにしようと思った次第です。
バンドルID(Bundle identifier)とは


普通なことなんでしょうけど、わかんなかったんでメモ。

#バンドルID(Bundle identifier)とは

バンドルIDは、アプリケーションを識別ために使われます。
バンドルIDの文字列は、英数字（A-Z、a-z、0-9）、ハイフン（-）、ピリオド（.）のみで構成しないといけないです。

組織のドメインがAcme.comで、Helloという名前のアプリケーションを作成する場合、バンドルIDは

<B><I>「com.Acme.Hello」</I></B>

という文字列です。


![スクリーンショット 2017-08-26 16.49.45.png](https://qiita-image-store.s3.amazonaws.com/0/64334/86fbd397-9279-d5b0-a8ca-4136101be4c2.png)


#バンドルIDの具体的な保存場所と用途
ここはあまり詳しく読まないでいいような気もした。

![スクリーンショット 2017-08-26 16.53.08.png](https://qiita-image-store.s3.amazonaws.com/0/64334/2a2696d6-e9ca-ae4c-ffac-44ea14e2e6a3.png)

- 1.Xcodeプロジェクト

バンドルIDを「情報プロパティリスト」ファイル（Info.plist）に保存します。このファイルは、ビルドの際、アプリケーションバンドルにコピーされます。

- 2.iTunes Connect

バンドルIDを入力することによりアプリケーションを特定します。アプリケーションの最初のビルドをiTunes Connectにアップロードすると、バンドルIDの変更や関連する特定App IDの削除ができなくなります。

- 3.開発者アカウント

アプリケーションのバンドルIDに合致するApp IDをXcodeが生成します。
これが特定App IDであれば、バンドルIDと完全に一致する文字列です。
ただし、ドメイン名と違い、大文字と小文字の区別がある。

- 4.iCloud

Xcodeプロジェクトで指定するコンテナIDは、アプリケーションのバンドルIDをもとに生成したものでなければなりません。





ここの内容です。
https://developer.apple.com/jp/documentation/IDEs/Conceptual/AppDistributionGuide/ConfiguringYourApp/ConfiguringYourApp.html

その他　用語集
https://developer.apple.com/jp/documentation/IDEs/Conceptual/AppDistributionGuide/Glossary/Glossary.html#//apple_ref/doc/uid/TP40012582-CH18-SW18
VirtualBoxでNginxとpumaの連携がうまくいかない人に試してほしい３つのこと（多分ここだけにしかない手順あり）


# きっかけ
- Nginxの勉強がしたいぞ
- railsアプリを作って、pumaサーバのsockファイルで通信しよう
- ん？Permission deniedとか出て502しかでないぞ？
- そしてどこも似たような解決方法を書いてあるけどどれも効かないんですけど！
- ........結果的に解決したけどこの方法誰も言及してない。書いとこう

# 対象
- NginxとRailsの連携がしたいのに502に行く手を阻まれている方
- **setenforce?**そんなものもうやり尽くしたよ！でもできねーよ！という人

# 結論先取り
- 以下の三つを確認しましょう

> 1. SElinuxがオフになっているか
2. sockファイルを/tmpディレクトリに置いてたりしないか（共有できない場所らしい）
3. /home/vagrant配下にsockファイルを置いている（自分が一番ハマったところ）

# 私の環境
- CentOS7を使いました

```
$ uname -rs
Linux 3.10.0-514.16.1.el7.x86_64

$ nginx -v
nginx version: nginx/1.10.2

$ rails -v
Rails 5.1.3
```

# SELinux
- これがオンになっているせいで、リクエストが弾かれてしまいうまくいかないパターン
- いたるところで解決策として提示されている他、案外これで解決してしまうことも多いらしいのでその記事を参考にしてください

# sockファイルを/tmpに置いている
- [こちらの記事](http://qiita.com/emahiro/items/b2762a26bca35bbb0cf9)を参考にしました
- 自分は実際に試していないのだが、/tmpディレクトリ配下にsockファイルを置いてしまうとnginxとの共有ができなくなるため、繋がらなくなるんだとか
- なので、railsのルートディレクトリにあるtmp/sockets/ディレクトリに置くようにしましょうという話

# /home/vagrant配下にsockファイルをを置いている（メイン！）
- 私は **VagrantのルートディレクトリにRailsアプリを置いていた**わけだが、これが **致命的に502に直結するきっかけになり得る**ということを知らなかった........
- 厳密にはsockファイルをアプリのtmpディレクトリに置いていたため、sockファイルが/home/vagrant配下に作られることになったのが原因だとのちに判明しました（hmikisatoさんありがとうございます）
- どうやらNginxが原因ではなくて、pumaが/home/vagrant配下にsockファイルを作成することができないからなんだとか。（[参考](https://github.com/puma/puma/issues/790)）


# まとめ
- socketファイルは、配置的にRailsアプリ内のtmpディレクトリに置いて置いた方がわかりやすい
- なのでNginxとVagrantを使うなら、Railsアプリはsockファイルが作成できる`/usr/share/nginx/html`配下に置きましょう
この週末で正規表現音痴から脱出しよう

# この記事について

データ分析を勉強していくうちに、正規表現を理解しないといけない状況がどんどん出てきます。人のコードを読むときとか、データクリーニングのとき。。。などなど。
２つの資料を使って、二日ぐらい勉強したら、下記みたいなよく使うやつは意外と書けるようなったので、勉強した資料を記事にまとめたいと思います。

```
"https?://(?:www.)?([a-zA-Z0-9\-_]+(?:\.[a-zA-Z0-9\-]+)+)"
```


# HackerRank で練習する

[HackerRank Introduction Challenges](https://www.hackerrank.com/domains/regex/re-introduction)
正規表現は正確にいうと、言語の一種です。
だから、使わないと勉強できない。
このサイトなら、本当に基礎ゼロから練習できるからオススメ。

# Python 3 の公式サイト

少し (二、三問でも大丈夫) HackerRank で練習したら、多分お題とチュートリアルを読んでもよくわからないやつがどんどん出てきてるので、その時は [Python 3 の公式ドキュメント](https://docs.python.org/3/library/re.html) を開きましょう。

これを全部読むと正規表現の文法を理解できる。でも、いまは全文を読む必要はありません。我慢できなくなるまで読んでください。そしてまた HackerRankに切り替えて練習しましょう。

# 結論

HackerRankと公式ドキュメントを切り替えてやっていくとHackerRankのお題をすぐに全部解けるようになる。そして、これでほとんどの正規表現は読めるようになるはず！

もっと練習したいなら、Pythonのコースのなかでも正規表現のお題があります！でもこちらの方がPythonの特有のメソッドへの理解が必要かも。

[HackerRank の Python 3 正規表現](https://www.hackerrank.com/domains/python/py-regex)
node-jt400を試してみた（環境構築編）

#node-jt400って？
jt400をnode.jsで使用するラッパーです。jt400で接続可能なIBMi(AS400)なら動きそうです。

#テストした環境のバージョン
IBM i:V5R4
開発PC：Windows10Pro64bit
node.js:6.9.1
npm:3.10.9
java:1.8.0_71
node-jt400:1.4.1

#node.jsの開発環境（Windows）
[この手順](http://qiita.com/okamoai/items/a875b26abab7f18da7d1)を参考にさせてもらい、構築しました。これらをやらないとnpm installでビルドエラーが出ます。
（なお、Macだとすんなりnpm installできました。）

#インストール
```
mkdir myfolder
cd myfolder
npm init -y
npm install node-jt400
npm install express
```
参考までに、node-jt400でインストールされるモジュールです。

```
-- node-jt400@1.4.1
  +-- flushwritable@1.0.0
  +-- java@0.8.0
  | +-- async@2.0.1
  | +-- find-java-home@0.1.3
  | | `-- which@1.0.9
  | +-- glob@7.1.1
  | | +-- fs.realpath@1.0.0
  | | +-- inflight@1.0.6
  | | | `-- wrappy@1.0.2
  | | +-- inherits@2.0.3
  | | +-- minimatch@3.0.4
  | | | `-- brace-expansion@1.1.8
  | | |   +-- balanced-match@1.0.0
  | | |   `-- concat-map@0.0.1
  | | +-- once@1.4.0
  | | `-- path-is-absolute@1.0.1
  | +-- lodash@4.16.4
  | `-- nan@2.4.0
  +-- JSONStream@1.0.7
  | +-- jsonparse@1.3.1
  | `-- through@2.3.8
  `-- q@1.4.1
```
expressは稼働確認をしやすくするために使用しているだけで、本編とは関係ありません。
以上でPC側の開発環境は終了です。

#IBMi(AS400)側の準備
テストで使用する物理ファイルとテストデータ

```MYLIB/MEMBER.PF
      ***************************************************************** 
      *    ファイルＩＤ       : MEMBER                                  
      ***************************************************************** 
     A          R MEMBERR                   TEXT(' メンバー ')          
      *                                                                 
     A            ID             3S 0       COLHDG(' ＩＤ ')            
     A            LNAME         12J         COLHDG(' 苗字 ')            
     A            FNAME          6G         COLHDG(' 名前 ')            
     A            PROF          40O         COLHDG(' プロフィール ')    
     A            TOKUTEN        7P 3       COLHDG(' 得点 ')            
```
```
INSERT INTO MYLIB.MEMBER VALUES(100,'漢字','太郎','漢字のみ',1000);
INSERT INTO MYLIB.MEMBER VALUES(101,'半角','カ　ナ','ｱ ｲ ｳ ｴ ｵ',50.555);
INSERT INTO MYLIB.MEMBER VALUES(102,'英数','小文字','abcDEF!',-100);
INSERT INTO MYLIB.MEMBER VALUES(103,'特殊','文字','①髙㈱Ⅳ～',.01);
INSERT INTO MYLIB.MEMBER VALUES(104,'漢字','混在','aiuあいうｱｲｳ',-15.25);
```
IBMiのサインオンするユーザーのCCSIDは5035にしており、物理ファイルも5035で作成しています。

![nodejt01.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/94f5865a-d863-31ea-eb2f-943f3b8a9985.png)


Open Source Technologies(5733－OPS)を導入せず、nodeで接続できるのはなかなか面白いですね。