OmniAICreator/Qiita-1.07M huggingface dataset:
OpenAMを使ったAWSマネジメントコンソールへのSSOをMulti-Roleに対応させる方法

## 概要	
　[前回](http://qiita.com/Tom3/items/c1d457850a6f3f0b9f9f)までで、Single-Roleの場合についてはOpenAMのダッシュボードよりAWSマネジメントコンソール（以降、AMC）へのSSOができるようになった。今回は、Multi-Roleの場合についても同様にSSOできるようにするための手順を書きます。

## 設定
1. OpenAM側の対象ユーザの編集画面を開き[User Alias List]に、AWSロールの"Role ARN"と"Trusted Entities"をカンマで繋げた値を追加する。
![55456aaa-7ae3-a5dc-7ddd-84483f68b865.png](https://qiita-image-store.s3.amazonaws.com/0/118448/bb5f3c5d-7c78-f2d4-cc29-39981de3383e.png)


2. SP[urn:amazon:webservices]の[Assertion Processing]のページへ行き、[Attribute Map]へ<https://aws.amazon.com/SAML/Attributes/Role=iplanet-am-user-alias-list>を追加する。（<https://aws.amazon.com/SAML/Attributes/Role=employeeNumber>があれば削除）。
![Untitled3.png](https://qiita-image-store.s3.amazonaws.com/0/118448/a51363ab-f9cb-1908-b4b0-c55896e8c4fb.png)


以上で完了。


## 動作
1. OpenAMにログインしてダッシュボードよりAMCを起動する。
![OpenAMdash.png](https://qiita-image-store.s3.amazonaws.com/0/118448/bdef5c2b-d82a-3632-5188-bcc3b8371e60.png)

2. ロールを選択する画面が表示されるので、目的のロールを選択してログインする。
<img width="535" alt="select_role.png" src="https://qiita-image-store.s3.amazonaws.com/0/118448/8271ba13-7809-7f29-483a-4ce4a150aab0.png">

↑↑ログインユーザにAWSロールである「Administrator」「OpenAMSAML」を関連付けた場合


## まとめ
たったこれだけです。ですが、複数ロールをSAMLResponseに乗せてAMC側へどのように渡せばいいのかでかなり悩みました。

最初は、Groupにて設定するのが管理的にも綺麗かと思ったのですがAssertionに余計なタグが出てしまったりしてうまくいかず。
最終的に[User Alias List]を使うことにしたのですが、もっと良い方法ありそうに思います。OktaやOneLogin、Pingfederateでは簡単に設定できるようです。

## 参考
- [Chapter 4. Configuring Realms](https://backstage.forgerock.com/#!/docs/openam/current/admin-guide/chap-realms)
- [CONFIGURING SAML MULTI-ROLE FOR AMAZON WEB SERVICE (AWS)](https://onelogin.zendesk.com/hc/en-us/articles/204397070-Configuring-SAML-Multi-Role-for-Amazon-Web-Service-AWS-)
- [How to Set Up SSO to the AWS Management Console for Multiple Accounts by Using AD FS and SAML 2.0](https://blogs.aws.amazon.com/security/post/Tx2989L4392V75K/How-to-Set-Up-SSO-to-the-AWS-Management-Console-for-Multiple-Accounts-by-Using-A)
- [Configure Amazon Web Services SSO for multiple roles and accounts](https://ping.force.com/Support/PingOne/PingOne-Setup/Configure-Amazon-Web-Services-SSO-for-multiple-roles-and-accounts)
- [Mapping user roles/groups from LDAP to SAML assertions in OpenAM](http://www.martijnburgers.net/post/2013/11/15/Mapping-user-rolesgroups-from-LDAP-to-SAML-assertions-in-OpenAM.aspx)
- [Configuring SAML Assertions for the Authentication Response](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html)
オートコンプリートにスクロールバーを表示する

autocompleteで候補がたくさんあるときにスクロールバーを表示したかったので表示方法を調べたのでメモ書き。

```js:main.js
$( function() {
    //console.time('timer1');
    var computerLanguages = [];
    for(var i = 1; i < 10001; i++) {
      computerLanguages.push('a' + i);
    }
    //console.log(computerLanguages);
    //console.timeEnd('timer1');
    $( '#jquery-ui-autocomplete-input' ) . autocomplete( {
        source: computerLanguages,
    } );
} );
```


```html:index.html
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/jquery-ui.min.js"></script>
  <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/themes/redmond/jquery-ui.css">
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/i18n/jquery-ui-i18n.min.js"></script>
  <script src="script/main.js"></script>
  <style>
<!--
.ui-autocomplete {
    max-height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
    padding-right: 20px;
}
#jquery-ui-autocomplete label {
    float: left;
    margin-right: 0.5em;
    color: black;
    font-size: 15px;
}
-->
</style>
</head>
<div id="jquery-ui-autocomplete" class="ui-widget">
    <label for="jquery-ui-autocomplete-label">入力欄: </label>
    <input id="jquery-ui-autocomplete-input" />
</div>
</html>
```
Unicode全角カタカナ正規表現で長音符を含める方法

##ご挨拶
Qiita初投稿です。普段Facebookにいろいろ書くことが多いですが、そちらでは技術系の投稿に反応がまったくないのでQiitaを始めてみることにしました。半分メモ代わりです。

さて、今回は、最近仕事でエントリーフォームを作っていて気がついたフロントエンドのTipsネタです。
## 全角カタカナ正規表現
HTML5でFormの入力エラーチェック（バリデーション）に使う**pattern属性**はなかなか便利ですが、2016年現在「正規表現 カタカナ」といったキーワードでググると、下記のように書くべしという情報が多く出てきます。

```html
<input type="text" id="name_kana" required pattern="[\u30A1-\u30F6]*"/>

```

確かに大半の日本人の名前だけを考えるならばこれでいいのですが、この書き方だと**長音符「ー」**が含まれないので、長音符が入る外国人の名前などのバリデーションに不都合が生じます。

![360af5b3bd82bedc9f4738d8c55322f3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/119598/8f0909a7-f2f7-023e-ec33-74cbbf3427f1.jpeg)

「リリー・フランキー」アウト！「所ジョージ」もアウト！
### 全角カタカナ正規表現に長音符を含める方法
これではいけないので、pattern部分を以下のように書き換えます。

```html
        <input type="text" id="name_kana" required pattern="[\u30A1-\u30FC]*"/>

```
こうすれば、長音符が含まれるようになるので、無事にバリデーション出来るようになりました。
### 余談
なお[日本語のために割り当てられた Unicode 一覧](http://www.xn--eckwd4c7cy36u3zowmk0qcl32k.com/unicode/Unichar.html)はこちら。
見たことない文字がいっぱいあります。「ヿ」はなんと読むのでしょうか...。
tracの導入 (Windows + trac 1.0.10)

Windows 32bit上に入れる。

# install

1. python 2.x を導入する ... https://www.python.org/downloads/ から Python 2.7.11 の Windows 32bit をダウンロードして実行する。 just for me で pathに追加しておくと便利。コマンドプロンプトを立ち上げて python --version で Python 2.7.11 と応答があればOK。
2. pip用のproxyを設定する。 set HTTPS_PROXY=http://username:password@hostname:port
3. pip install trac を実行する。依存する setuptools も genshi もインストールしてくれる。ついでに babel, pytz, pygments も入れておけ。

# tracd で起動

4. プロジェクトディレクトリを作る。 C:\projects
5. cd /d C:\projects して trac-admin myproject initenv を実行し、ウィザードに従って初期化
7. htpasswd という名前で```admin:$apr1$nMK8buQS$XHSkfP45PEnpFQIxDxn/70```という内容のファイルを作る。あるいは```admin:{SHA}0DPiKuNIrrVmD8IUCuw1hQxNqZc=```
8. trac-admin /projects/myproject permission add admin TRAC_ADMIN しておく
6. tracd --env-parent-dir C:\projects --basic-auth="*,/projects/myproject/conf/htpasswd,TRAC" とやって起動
7. 右上の login をクリックして、 admin:admin でログインする

# Eclipse Pydev から起動

1. JDKをインストール
2. Eclipseをダウンロード、展開
3. configuration を configuration.org という名前でバックアップしておく
4. Eclipseを起動。 \workspace を指定しておく
5. Eclipse Marketplace で python で検索して pydev を導入する
6. Ctrl-N で pydev project ```trac``` を作る。途中で　Python Interpreter を指定する。Quick Auto Config で進めればよい
7. Scripts\tracd-script.py を Eclipseワークスペースにコピーし、run as - Python run で登録する。エラーが出るので停止する。
8. run configuration で、arguments に以下を追加する:

```
--env-parent-dir ${project_loc:trac}/projects
--basic-auth="*,${project_loc:trac}/projects/htpasswd,Trac"
```
install 取り消し(docker)

##1 はじめに

環境
vagrant centos6.5
やろうとしたこと
dockerのインストールとその取り消し。
結果
雑誌の手順だと動かなかったのでインストール取り消してから別手順でインストールし直した。

P.S.)  そもそもcentos6にdocker入れようとしたこと自体が間違ってた。7以上じゃないとダメらしい。
　　 結局雑誌とかを見るよりdockerの公式マニュアル見た方が確実だった。
恥ずかしながら、yumの操作取り消しがこんなに簡単だったとは知らなかったのでわかってよかった。

##2 before

```bash
sudo yum update -y
sudo wget -P /etc/yum.repos.d http://www.hop5.in/yum/el6/hop5.repo
sudo yum install xz docker-io -y 
sudo service docker start
docker: 認識されていないサービスです。
```

##3 取り消し

```bash
sudo yum history package-list docker*
読み込んだプラグイン:fastestmirror
ID     | 操作           | パッケージ                                           
-------------------------------------------------------------------------------
     9 | インストール   | docker-io-0.6.2-1.el6.x86_64                       EE
sudo yum history undo 9
```

##4 やり直し

```bash
sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install docker-io
sudo service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:	                                   [  OK  ]
[vagrant@localhost ~]$ sudo docker version
Client version: 1.7.1

```
iOSでFPS(フレームレート)計測

説得力が無いせいか、最近説明するのがしんどいのでメモ書き。

### アプリがガタガタする

なんてことあってはならんのです。
例えば画面をびょーんとスクロールした時なんかにガタガタってぎこちない動きするアレです。

いちいち説明するまでもなく見れば分かる事なのですが、どうも人によっては問題とは考えてくれないようなので今更ながらにあえて前置きだけの話をします。

何故にガタガタするかといえばフレームレートに処理が追いついてないのです。

### おさらい

すごく端折ります。

フレームレートに追いついてない（フレーム落ち・処理落ち）なんてのは、古来ファミコンの時からある話で、ときどきぎこちない動きでガタガタってするアレです。昔のゲーム開発者はインターレスとて29.997fpsで垂直帰線期間しか画面I/O叩けないとかなんとかで泣くほど苦労し、昔のゲーマーはいらいらしつつもたまにグラ３やR-TYPE２周目7面後半復活で助かったりするアレです。フレーム落ち話だけで酒が飲めそうです。

そんな時から20〜30年ほど経ったiPhoneとて今だにこの話は残っていて、秒間60フレーム(60fps)で画面を定期的に書き換えて表示しています。
時間にすると 1/60 = 0.016666...秒 = 約16ms、この時間内で処理を終えタイミングよく回っていれば問題ないのですが、処理時間などがかかってしまいこの時間をオーバーすると次の書き換えタイミングに回されてしまい、結果正しいタイミングで書き換えがされずフレームが落ち、ガタついてしまうわけです。

iOSは原則として表示される画面の処理についてはメインスレッドのみで行わなければなりません。
iOSはイベント駆動で処理されますから、OSから何らかのコールバックが来ます。
特に画面系のコールバックはメインスレッドでやって来ます。

つまりは、このメインスレッドにおけるコールバックを16ms以内に返さないと画面更新のタイミングに間に合わず先送りされてしまい、ガタガタしてしまうってわけです。

### 確認方法

そんなの見りゃわかる、ちょっとスクロールとかさせればわかる、蛍光灯の前で手でも振ればわかる、格ゲーなんかの人なら１フレーム単位で見えてる。
なんですが、実際のところよほど慣れているかやばい薬でもキメて脳内クロック上がってるとかでないと難しいですし、どこで何フレームずれたかなんてのはさすがに見た目で数えられるものじゃありません。

なので数値として出した方がよいです。

計測といえばXcodeでinstrumentsなのですが、これは描画された時の数値しか出なくていまいち希望の値が取れません。

別の方法として、iOSでは画面更新毎の時間をCADisplayLinkで取得することができます。
CADisplayLinkでは画面更新毎にコールバックを受け取る事が出来、これの.timestampが前回の画面更新時間になります。

ちなみに、.durationはしっかり 1/60 = 0.0166666...ですね。
よって、このコールバック毎に前回とのtimestampの差を取ってやれば画面更新間の時間が拾え、フレーム落ちしているかどうか判断できます。

### 計測ライブラリ

計測方法はわかったけれど書くのも面倒なのでライブラリに頼ります。

[RRFPSBar](https://github.com/RolandasRazma/RRFPSBar)というライブラリがうまく出来ているのですが、もう少し見た目、ライブラリ自体の負荷、他のデータなどをよくしたかったのでちょっと書いてみました。

[FPSStatusBar https://github.com/asaday/FPSStatusBar](https://github.com/asaday/FPSStatusBar)

![](https://raw.githubusercontent.com/asaday/FPSStatusBar/master/docs/ss.png)


cocoapodsやcarthageで入れて、importとstart()の2行ほど付け足せばステータスバーのところに、fps及びcpu使用量などの値を表示できます。

### どこで起きるか

ゲーム系はまた別として、UIKitでフレーム落ちはどこで起きるか？
ライブラリを入れて視覚化すると結構色々なところでフレーム落ちはあります。

ですが正直に全部をクリアする必要はありません、目につく部分だけやればOKです。

どこが目につくかといえば、やはりテーブルなどのスクロール系、アニメーション系、ユーザーによるドローなど画面が連続的に動く箇所になります。
逆にアクションの始めや画面遷移の始めなど、静から動の瞬間は結構ごまかせます。


### どう改善するか

どこの画面のどんな操作でフレーム落ちが発生するか分かれば、そこにメインスレッドにおける処理が16ms以上かかっている箇所があるハズです。

やるべきことはメインスレッドで必要でない処理はバックグラウンド処理に回すことです。

メインスレッドで処理せざるを得ないものは画面系ですので、逆に画面系でない処理は極力バックグラウンドにて処理します。

これが自分では十分そんなこと対応していると思いきや色々なものが起因してメインスレッドで動いていたりするんですよね。

あれやこれやと色々な方法はあるのですが、まぁここまでの話が通じていればようやく前置き終わりです。はぁ。
Chrony on FreeBSD 〜Chrony を FreeBSD で使ってみた話〜

# 前書き
以前、[ntpd の monlist 機能を使った DDoS 攻撃に関する注意喚起](https://www.jpcert.or.jp/at/2014/at140001.html)(CVE-2013-5211)があったので monlist を無効にしていましたが Qiita をぼーっと見ながら「chrony があるんだなぁ」ということと「やっぱり pool.ntp にリソースを提供してるしどこからアクセスされてるか見てみたいなぁ！」という欲求にかられてどうにかした話です。

もちろんリファレンスなどで書いてあることも含まれていますので「こんなことしてるんだな、へぇー」と思いながら見ていただければと思います。

# Machine Spec
* FreeBSD(10.1-RELEASE amd64)
* Chrony(2.2 / by ports)

# Install
FreeBSD ports からインストールしました。
デフォルトの設定で IPv6 オプションが有効になっていますが気にせず設定しました。

# Config
## chrony.conf
```
include /usr/local/*** 秘密のサーバーリスト置き場 ***/*.conf

peer *** クラスタにしているもう1台のサーバー ***

driftfile /var/db/chrony/drift

#keyfile /usr/local/etc/chrony.keys
#commandkey 10
#generatecommandkey

! dumponexit
! dumpdir /var/db/chrony

! pidfile /var/run/chronyd.pid

! makestep 1.0 3

logdir /var/log/chrony
log measurements statistics tracking rtc 

allow allow 0.0.0.0/0
cmdallow 127.0.0.1

;ratelimit interval 4 burst 4

bindaddress 0.0.0.0
bindcmdaddress 127.0.0.1

broadcast 60 172.16.255.255

clientloglimit 0
```
基本的にはどこからでも受け付けるようにしています。(ここには記載しませんが)ntp.conf にある server, pool, peer も使えます。
ratelimit は ports にあるバージョンが 2.2 で使えないので 2.3 になったら使えるようにコメントしてあります。

## chronyc Config
[バージョン 2.2 から通常の ntpd / ntpdc を使ってネットワーク越しで出来ることができないようです。](https://chrony.tuxfamily.org/faq.html#_i_keep_getting_the_error_code_501_not_authorised_code) 

```
Since version 2.2, the password command doesn’t do anything and chronyc needs to run locally under the root or chrony user, which are allowed to access the chronyd's Unix domain command socket.
```
ということで監視サーバー上で clients のリストを見るためにユーザーを作り、 SSH と sudo を使って監視サーバーでも見れるように設定してあげます。もちろん監視サーバーを使わなくても出来るのですっ飛ばしてもいいです。というかセキュリティ的にどうなのと突っ込まれそうなのであえてここで書きませんけどもうちはそうしてます。

# bonus section 〜when viewed actually looking at the "clients" log〜
pool.ntp にボランティアとしてリソースを提供していますが我が家にやってくる方々は「近くにもっといいサーバーｱﾙﾖｰ」ということを知らずに使っているのかあえてここを使ってるという方なんだろうなーと思っています。
ぜひ[この wiki に記載されているリスト](http://wiki.nothing.sh/page/NTP)を見て頂いて「おー、うちとむちゃくちゃ近いとこあんじゃん！！」と興奮しながら設定することをおすすめします。特に大手 ISP や大学など「自分のとこにも NTP サーバーがある」ところで「別に pool.ntp じゃなくてもいいかなー」という方はきっと人生変わるかもしれないですｗ
~~本当は NTP サーバーを運用している ISP や大学の中の人が「このサーバー使って使って〜」ともっと宣伝して欲しいところなんですがｗ~~
yumについて　[ 自分用メモ ]

参考サイト
http://blog.inouetakuya.info/entry/20111006/1317900802

yumとはソフトウェアをインストールするためのツール
Linux用のコマンド(ブラウザで検索してダウンロードしてたが、それをコマンドでできる)

例)
yum install git
yum install postgresql

Macだとyum、brewを使用する
Windows 7 で IEを起動せずにChromeをダウンロードする（PowerShell）

「IEを普段使わない。強いて言えば初めてその環境で他のブラウザをダウンロードするときだけ」
という人もいるそうです。

もしかしたら、できればIEを起動すらしたくないという人かもしれません。
そんな場合。
ここではIEを起動せずChromeのセットアップブログラムを
ダウンロードしてインストールを始めます。


```ps1:chromedownload.ps1
$webclient = New-Object System.Net.WebClient
$url = "https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7BB893F592-87F3-86BB-FF97-7BE12F83B3B8%7D%26lang%3Dja%26browser%3D4%26usagestats%3D0%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers/update2/installers/ChromeSetup.exe"
$file = "./ChromeSetup.exe"
$webclient.DownloadFile($url,$file)
& $file
```
AWSリンク集

個人的な備忘のためにAWSに関するリンク集を作成。リンクについては随時追加予定。

AWS Cloud Design Pattern
---
http://aws.clouddesignpattern.org/index.php/

**概要**
・AWSクラウドデザイパターン

Amazon Web Servicesブログ
---
URL：https://aws.amazon.com/jp/blogs/news/

**概要**
・最新アップデート情報
・週刊AWS

AWS Global Infrastructure
---
URL：http://aws.amazon.com/jp/about-aws/global-infrastructure/

**概要**
・リージョンやアベイラビリティゾーンの詳細

AWS Security Center
---
URL：http://aws.amazon.com/jp/security/

**概要**
・セキュリティホワイトペーパー(半年に一度の更新)
・セキュリティ速報
・顧客によるペネトレーションテストのポリシー
・セキュリティベストプラクティス
・AWS Identity & Access Management (AWS IAM)
・AWS Multi-Factor Authentication (AWS MFA)

AWSコマンドラインインターフェイス (AWS CLI)
---
URL：https://aws.amazon.com/jp/cli/

**概要**
・AWSコマンドラインインターフェイスのダウンロード元
・AWSコマンドラインインターフェイスのコマンドライン

AWSトレーニング
---
URL：http://aws.amazon.com/jp/training/

**概要**
・トレーニングや認定資格に関する情報

AWSの導入、お問い合わせの相談
---
URL：https://aws.amazon.com/jp/contact-us/aws-sales/

**概要**
・AWSクラウド導入に関する質問、見積、資料請求に関する問い合わせ窓口

過去のWebinar資料
---
URL：http://aws.amazon.com/jp/aws-jp-introduction/

**概要**
・過去のWebinarの資料配布

イベントの告知
---
URL：http://aws.amazon.com/jp/about-aws/events/

**概要**
・AWSに関する各種イベントの告知

AWS WEB問題集で学習しよう
---
URL：https://aws.koiwaclub.com/

**概要**
・AWSの資格取得のためのWEB問題集
AVCam-iOSをSwiftで実装し直してみる


###### 2017/05/02 追記
iOS10になってからまた仕様が変わり、いくつかのメソッドが非推奨になってます。
そのせいか、Appleから公式にAVCamのSwift版サンプルが出て要るので、今後はそちらを参照してもらった方がいいでしょう。

[AVCam-iOS](https://developer.apple.com/library/content/samplecode/AVCam/Introduction/Intro.htmla)


以上

----------------------------------------------------------------------------------------------------------



カメラや動画を扱ういいサンプルはないかと探していたら、そもそもAppleがいいものを出してくれていました。

[AVCam-iOS: Using AVFoundation to Capture Images and Movies](https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html)

カメラと動画を扱うサンプル

[AVCamManual: Extending AVCam to Use Manual Capture API](https://developer.apple.com/library/ios/samplecode/AVCamManual/Introduction/Intro.html)

上記の機能プラスカメラのホワイトバランスやフォーカスを手動出来る仕組みがついてくる

ただどちらもObjective-Cで実装されていてるので、とりあえず上の方をSwiftで実装してgithubにあげました。


[AVCamSample](https://github.com/rnsm504/AVCamSample)


以下実装していて気になった箇所

###### available

iOSのバージョンで条件分けしたい時とかに使います。変更の多いSwiftでは必須の機能か

```
if #available(iOS 9.0, *){

```

###### cast from 'UIDeviceOrientation' to uncleard type 'AVCaptureVideoOrientation' always fails

以下の実装時の警告

```
previewLayer.connection.videoOrientation = deviceOrientation as! AVCaptureVideoOrientation
```

Objective-Cでは問題ないのだけど、Swiftでは警告が出ます。
この 〜always failsって普通にエラーになるのでは・・・と思ったので以下のように修正。
もっと簡単に出来そう


```
previewLayer.connection.videoOrientation = { () -> AVCaptureVideoOrientation in
                switch deviceOrientation {
                case .Portrait:
                    return AVCaptureVideoOrientation.Portrait
                case .LandscapeLeft:
                    return AVCaptureVideoOrientation.LandscapeLeft
                case .LandscapeRight:
                    return AVCaptureVideoOrientation.LandscapeRight
                case .PortraitUpsideDown:
                    return AVCaptureVideoOrientation.PortraitUpsideDown
                default:
                    return AVCaptureVideoOrientation.Portrait
                }
                }()
```



とりあえずほぼ写経に近い感じでやったのでもっとSwiftの良さを活かした実装がありそうに思う。
例えばRxSwiftで非同期部分を扱ってみるとか・・・時間が出来たらやってみたいです。
Pythonの薦め　-Webサイト作りが嫌いなプログラマーへ-

この記事は私自身の個人的な解釈ですので、決して一般論ではありません。ご注意を。

#【なぜプログラミングするの？】 :sweat_drops: 
みなさんがプログラミングを始めようと思ったきっかけは何だろうか？
　・プログラミングできるとかっこいいから！
　・Webサイトを作りたいから！
　・スマホアプリを作りたいから！
　・プログラミングに興味があるから！
　・機械学習の勉強や人工知能を作ってみたいから！
　・先生に言われて・・・、学校の授業で必修だから・・・
　　　（別にやりたくないのよー＼(◎o◎)／！）

それぞれプログラミングを始めようと思った理由があると思います。この時点では知らない世界に飛び込むので心はウキウキです :satisfied: 
じゃあ、プログラミングをやってみようかと思い立って本屋で本を探しに行きます :rocket: 

#【本屋での落とし穴】
ウキウキ気分で本屋に到着したあなたは、たくさん本があるのでどの本を買えばいいのか混乱してしまいます。 :sweat_smile: 
でも、大丈夫！　なぜなら事前にネットで、どんな言語があってどの本がお勧めなのかを調べておいたからです。 :sunny: 
「初心者はWebサイト作りから始めた方がいいのか～」と、そんな気持ちで本を眺めます。
「確かに、たくさんWebサイト作りの本があるからWebサイト作りから始めるか！」と思いこんでしまいます。しかし、
##これが本屋の落とし穴なんです！！！##

どういうことかというと本当はWebサイト作りなどしたくないのに、ネットの情報やWebサイト作りの本がたくさんあるのを見て
「君はWebサイト作りから始めるべきなんだ」と脅迫されてしまうのです＼(゜ロ＼)(／ロ゜)／
そして、１ヶ月もすればあなたのウキウキした心は、深い深い海に沈んでいることになるのです・・・ :scream: 

確かに、初心者にとってはWebサイト作りから初めてクライアントとサーバのやり取りなどを学んだ方がいいかもしれません。
しかし、私のようなWebサイトを作るのが面白くない人もいるわけで違う入り口からプログラミングを学んだっていいはずです。
(；一_一)

そこで、オススメしたい言語としてPythonがあります。

#【Pythonやってみようよ】
Pythonは読みやすく書きやすい、とっても初心者向けのプログラミング言語です。
それだけではなく、Pythonの一番良いところは
##ライブラリ（やりたいことが簡単にできるプログラムの塊）が豊富##

Pythonでできることは例えば、
・twitterでbotを作る
・スクレイピング
・行列計算
・データ解析
・機械学習
・形態素解析
・顔認識
・画像編集
などなど、このほかにもたくさんあります。
さらに、これがライブラリを使うことによって簡単にできてしまうのです！ :v: 

もちろん、PythonにもWebフレームワークがあるのでWebサイトも作れます・・・

#【まとめ】
まあ、私の言いたかったことは「プログラミングはWebサイト作りだけじゃないよ」ってことです。 :+1: 
プログラミングたのしもうぜ(*´ω｀*)
Elixir+Phoenixでorder_byで昇順・降順で更新日順に並び替える


## たとえばブログ記事としてPostモデルがあったとして

```
  schema "posts" do
    field :title, :string
    field :body, :string

    timestamps
  end
```

## 最新順に並び替えたい

こうします。

```
  def index(conn, _params) do
    query = from(p in Post, order_by: [desc: p.inserted_at])
    posts = Repo.all(query)
    render(conn, "index.html", posts: posts)
  end
```
Nginxの設定ファイルをハイライトさせる

## はじめに

[さくらのVPS 標準OSの環境構築(3) Webサーバーの設定](http://qiita.com/takahiko-takei/items/110a3da996e733e5a43c)のときに`Vim`を使うならしておいた方がよい設定。
解説では`Vi`を使っているので別記事しておきます。

多分設定ファイルのディレクトリ名などはバージョンによって違うと思います。
その際は適宜変更して臨機応変に対応してください。


## 作業環境

* サーバー
    * さくらのVPS [メモリ2GBプラン](http://vps.sakura.ad.jp/specification/)
    * 標準OS CentOS 6.7
    * Vim 7.4
    * Nginx 1.9.15


## Syntax定義ファイルのダウンロード

`Vim`のSyntax定義群の中に、`Nginx`の定義ファイルをダウンロードします。

> `cd /usr/share/vim/vim74/syntax/ && \`
> `wget https://fossies.org/linux/www/nginx-1.9.15.tar.gz/nginx-1.9.15/contrib/vim/syntax/nginx.vim?m=t -O nginx.vim`


## ユーザーごとにSyntax定義の適用

ログインユーザーのホームディレクトリに、Syntax定義を読み込むよう`Vim`の設定を追加します。

> `mkdir -p ~/.vim/ && \`
> `touch ~/.vim/filetype.vim && \`
> `cat > ~/.vim/filetype.vim <<EOF`
> `au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif`
> `EOF`

以上で完了になります。
Linux cent OS 7 hostnameの変更


以下の3つのファイルをroot権限で書き換え

```
[hnishi@localhost ~]$ cat /etc/hostname
YOURHOSTNAME
[hnishi@localhost ~]$ cat /etc/hosts
127.0.0.1   YOURHOSTNAME localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[hnishi@localhost ~]$ cat /etc/sysconfig/network
# Created by anaconda
NETWORKING=yes
HOSTNAME=YOURHOSTNAME
NETWORKING_IPV6=no
GATEWAY=192.168.11.1
```

書き換えたら`sudo /etc/init.d/network restart`
でネットワークをリスタートさせる。

`[hnishi@YOURHOSTNAME ~]$ hostname
YOURHOSTNAME`
で確認。
今さらだけどElixirでズンドコキヨシ

# 概要

しばらく前に来ていたズンドコブームに乗り損ねましたが、自分なりにElixirで書いてみました。

[元ネタまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)

# 実装

* 状態の保持はAgent
* `ズン` か `ドコ` を１つ足しては全体から５個切り出すを繰り返す
* １つ足すついでに標準出力へ出力（副作用なのでちょっと微妙）
* ５個切り出したのが目的の `ズンズンズンズンドコ` と一致したら、終了
* `iex` で実行すると文字化けが起きるので、最後に実行用の１行を追加した。

```elixir:zundoko.exs
defmodule Zundoko do
  def run do
    {:ok, agent} = Zundoko.start

    Zundoko.run(agent)
  end

  def run(pid) when is_pid(pid) do
    if Zundoko.complete?(pid) do
      IO.puts "キ・ヨ・シ！"
    else
      Zundoko.add(pid)
      Zundoko.run(pid)
    end
  end

  def start do
    Agent.start_link(fn -> [] end)
  end

  def get(pid) do
    Agent.get(pid, fn prev ->
      prev |> Enum.reverse |> Enum.join
    end)
  end

  def add(pid) do
    next = Zundoko.random
    IO.write(next)

    Agent.update(pid, fn prev ->
      [next | prev] |> Enum.take(5)
    end)
  end

  def complete?(pid) do
    Zundoko.get(pid) == "ズンズンズンズンドコ"
  end

  def random do
    ["ズン", "ドコ"]
    |> Enum.random
  end
end

Zundoko.run
```

# やってみて
やっぱり、考えなしにやるとまだ副作用の残る設計になってしまう（要改善）。

今回のだと、５個切り出したのを状態として保持するのではなく、それまで出たのすべてを保持して最後に返せば副作用を排除できそう。その場合、あんまり長いと出力の際に問題になりそう。５個に切り分ける部分を分離させて、５個ずつ表示させていけば解決するかな？
Tweepyを使ってみる[Python2.7]

tweepyというPython向けTwitterクライアント見つけたのでいじってみました。
そもそもTwitterを普段使わないので私の場合は作ったところで使いみちが無いのですが。。。

まず、実装してみたものとしては
・トークン発行
・ツイート削除
・片思いである人をフォロー解除又は、フォロー
・特定のアカウントをフォローしているユーザーをフォロー
片思いの定義はここでは
1.自分がフォローしており、相手がフォローしていない状態。
2.相手がフォローしており、自分がフォローをしていない状態。
とします。

それぞれ関数名,処理を説明をします。
deletion(self, id, count=200)
- id=アカウントid(@XXX)
- count=件数
この関数は引数idで指定されたidのツイートを引数countだけ取得し
削除します。この関数はトークンがidのものと同一である場合動作します。
当然他人のツイート削除などはできません。

destroy(self, id)
- id=アカウントid(@XXX)
この関数は引数idで指定されたidのユーザーが片思い(定義1)であるユーザーのフォローを解除します。

create(self, id)
- id=アカウントid(@XXX)
この関数は引数idで指定されたidのユーザーが片思い(定義2)であるユーザーのフォローします。

follow(self, id)
- id=アカウントid(@XXX)
この関数は引数idで指定されたidのユーザーをフォローしているユーザーをフォローします。

```py

class Token:
	def __init__(self, consumer_key, consumer_secret):
		self.auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
	def GET(self):
		redirect_url = self.auth.get_authorization_url()
		print "URL: %s" % (str(redirect_url))
		self.auth.get_access_token(raw_input('code: ').strip())
		return [self.auth.access_token, self.auth.access_token_secret]

class Twitter_Class:
	def __init__(self, consumer_key, consumer_secret, access_token, access_secret):
		auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
		auth.set_access_token(access_token, access_secret)
		self.api = tweepy.API(auth)

	def deletion(self, id, count=200):
		try:
			map(self.api.destroy_status, [i.id for i in self.api.user_timeline(id, count=count)])
		except Exception, e:
			print e

	def destroy(self, id):
		try:
			friends_ids = self.api.friends_ids(id)
			followers_ids = self.api.followers_ids(id)
			list_ = []
			for i in friends_ids:
				if not i in followers_ids:
					list_.append(i)
			map(self.api.destroy_friendship, list_)
		except Exception, e:
			print e

	def create(self, id):
		try:
			followers_ids = self.api.followers_ids(id)
			friends_ids = self.api.friends_ids(id)
			list_ = []
			for i in followers_ids:
				if not i in friends_ids:
					list_.append(i)
			map(self.api.create_friendship, list_)
		except Exception, e:
			print e

	def follow(self, id):
		try:
			friends = self.api.friends_ids(id)
			count = 0
			for i in friends:
				if count < 50:
					self.api.create_friendship(i)
				else:
					[time.sleep(18) for i in range(100)]
					count = 0
		except Exception, e:
			print e
```
CakePHP3 EntityのsetでDBの型によってはまったこと

#CakePHP3 EntityのsetでDBの型によってはまったこと

今日、普通にCakePHP3を書いてたわけですが、  
patchEntityすると、データが消えるという謎現象が発生したわけですね。

## 具体的に起きたこと

```php
    public function index()
    {
        $a = $this->Topics->newEntity();
        $b = [];
        $b['tiny1'] = true;
        $b['tiny4'] = true;
        $b['timestamp'] = '2016-01-01 00:00:00';
        $b['datetime'] = '2016-01-01 00:00:00';
        $a = $this->Topics->patchEntity($a, $b);
        debug($a);
    }
```

こんな感じなコードがあったとして、Entity先のDBのカラムはカラム名の通り、それぞれ、`tinyint(1)`,`tinyint(4)`,`timestamp`,`datetime`なわけですよ。

その結果返ってくる結果がこれ

```
object(App\Model\Entity\Topic) {

	'tiny1' => true,
	'timestamp' => object(Cake\I18n\Time) {

		'time' => '2016-01-01T00:00:00+00:00',
		'timezone' => 'UTC',
		'fixedNowTime' => false
	
	},
	(以下略)
```

`tiny(4)`と`datetime`のデータが返ってきません。

さらに、以下のようにfind後にpatchEntityをした場合だと・・・

```php
    public function index()
    {
        $a = $this->Topics->find('all')->first();
        $b = [];
        $b['tiny1'] = true;
        $b['tiny4'] = true;
        $b['timestamp'] = '2016-01-01 00:00:00';
        $b['datetime'] = '2016-01-01 00:00:00';
        $a = $this->Topics->patchEntity($a, $b);
        debug($a);
    }
```

```
object(App\Model\Entity\Topic) {

	'tiny1' => true,
	'tiny4' => null,
	'timestamp' => object(Cake\I18n\Time) {

		'time' => '2016-01-01T00:00:00+00:00',
		'timezone' => 'UTC',
		'fixedNowTime' => false
	
	},
	'datetime' => null,
```

なんか`null`になってるーーーーーーー！？

## 何が起きているか

entityのsetが走るタイミングでデータの変換が行われているのですが([このへん](https://github.com/cakephp/cakephp/blob/master/src/ORM/Marshaller.php#L155))、型の中で想定外のものは全部nullに変換されています。([この辺とか](https://github.com/cakephp/cakephp/blob/master/src/Database/Type/IntegerType.php#L83))

今回の場合、tinyintの場合だと、桁数が1の場合はboolean,桁数が4の場合はintegerと判定されたため、tinyint(4)では`true`は想定外のデータなので`null`という動作をしています。

`tinyint`はCakePHP2だと確か、桁数によらずboolean的な動作をしてたので、そのノリで使ってたら動かない！的なことになったわけですね。

日時については、`timestamp`は文字列でも普通にいけるんですが、`datetime`の場合はちゃんとtimeクラスのオブジェクトにしておかないと`null`を返されてしまいます。。。

## まとめ

とりあえず現状こんな問題が出てきたのはmysqlばっかりなんですけど。。。  
postgresは特に今のところこんな話は出てきていません。  
まぁDB設計はちゃんとしましょうってお話なんですが()
yumで入れたパッケージのコンフィグの差分を確認したい話

# 背景

RHELやらCentosやら、yumなどのパッケージ管理ツールでソフトウェアを入れた時、だいたいの場合コンフィグも一緒に入ってくれる。
ゼロからコンフィグを書くのはしんどいので凄く便利、なんだけど、デフォルトのコンフィグがいつでもそのまま使えるワケではなくて、何かしらの修正を加えることになる。

ものによっては `.d` ディレクトリに新規ファイルを作るとか、 `.local` みたいな拡張子で設定を上書きするとか、パッケージ管理ツールで入るコンフィグに直接手を加えずに設定できるものもあるけど、直接パッケージ管理ツールで入るコンフィグを修正しないといけない場合も結構ある。

で、パッケージのアップデートしたい、とか、サーバーを移行したいなんて時に、デフォルトのコンフィグからどんな修正を加えたかなぁ、と調べたいことが結構多々ある(ありますよね？)

調べてみると `rpmdevtools` パッケージに入っている `rpmpeek` というコマンドで、パッケージと現在の状況との差分を作ってくれる、らしい……
のだけど、どうにもこうにも手元の環境では `rpmpeek` なんてコマンドは無い。

あと、 `rpm -V` で手元の環境に差分があるかどうかの確認はできる。
のだけど実際どんな修正をいれたのかまではワカラナイ。

仕方が無いので自作してみた。

# 概要

ソース: https://github.com/takei-yuya/rpmdiff

コマンド一発で、例えばこんなdiffが作れます (openssh-serverの例)

```diff
--- /etc/ssh/sshd_config
+++ /etc/ssh/sshd_config    2016-02-20 12:37:50.866572704 +0900
@@ -14,13 +14,13 @@
 # SELinux about this change.
 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
 #
-#Port 22
+Port 10022
 #AddressFamily any
 #ListenAddress 0.0.0.0
 #ListenAddress ::

 # The default requires explicit activation of protocol 1
-#Protocol 2
+Protocol 2

 # HostKey for protocol version 1
 #HostKey /etc/ssh/ssh_host_key
@@ -46,13 +46,13 @@
 # Authentication:

 #LoginGraceTime 2m
-#PermitRootLogin yes
+PermitRootLogin no
 #StrictModes yes
 #MaxAuthTries 6
 #MaxSessions 10

-#RSAAuthentication yes
-#PubkeyAuthentication yes
+RSAAuthentication yes
+PubkeyAuthentication yes

 # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
 # but this is overridden so installations will only check .ssh/authorized_keys
@@ -76,7 +76,7 @@
 # To disable tunneled clear text passwords, change to no here!
 #PasswordAuthentication yes
 #PermitEmptyPasswords no
-PasswordAuthentication yes
+PasswordAuthentication no

 # Change to no to disable s/key passwords
 #ChallengeResponseAuthentication yes
@@ -109,8 +109,8 @@
 # problems.
 UsePAM yes

-#AllowAgentForwarding yes
-#AllowTcpForwarding yes
+AllowAgentForwarding yes
+AllowTcpForwarding yes
 #GatewayPorts no
 X11Forwarding yes
 #X11DisplayOffset 10
@@ -123,8 +123,8 @@
 UsePrivilegeSeparation sandbox     # Default for new installations.
 #PermitUserEnvironment no
 #Compression delayed
-#ClientAliveInterval 0
-#ClientAliveCountMax 3
+ClientAliveInterval 30
+ClientAliveCountMax 3
 #ShowPatchLevel no
 #UseDNS yes
 #PidFile /var/run/sshd.pid
```


やっていることは凄く単純で、 `yum reinstall` に `--downloadonly` オプションを付けて、オリジナルの `.rpm` ファイルを取得。
その後、 `rpm2cpio` + `cpio` でファイルを抽出して、現在のファイル状況とdiffを取るだけ。
おまけで、ファイルに出力しつつも、画面への出力は `pygmentize` があったら色を付ける、なんてことをしています。

そんな説明することがなかった。

まぁ、あると地味に便利系ツールということで。 EoQ



// 編集する前に `.orig` とかバックアップを取っておけという話ですが……。
databaseの把握


RDB(OSS)
=================================

MySQL
https://www.mysql.com/

PostgreSQL
http://www.postgresql.org/

NoSQL
=================================

MongoDB
https://www.mongodb.org/

CouchDB
http://couchdb.apache.org/

Cassandra
http://cassandra.apache.org/

HBase
https://hbase.apache.org/

Redis
http://redis.io/

Neo4j
http://neo4j.com/


参考
---------------------------------

mongodb redis cassandra 機能 - Google 検索
https://goo.gl/70Vkpm


[レポート]NoSQLの必要性と主要プロダクト比較 #dbts2015 #be_crazy_about_db_tech ｜ Developers.IO
http://goo.gl/I8lnYF

今回は下記が重要かな。

	データの多様性
	→非構造データが増えてきているため、RDBMSでは格納が困難

下記の特徴がある。

	非構造データの取り扱いが得意
	水平分散が得意（結果整合性）

どれにするか。分類についてざっと調べると、たぶんドキュメント型かな。
KVSやグラフ型は大量のデータを扱うときに重要になる分類かと。
今回は非構造データを扱いたいのが主な目的。
でも、それぞれの要素にIDを降るのもやりたいので、KVS的な面も必要。
もしかするとRDBSでいいのかもとは思っている。

	NoSQLの分類
		KVS
			キーバリュー型・・・redis、memcached、Oracle Coherence、
			列指向型ワイドカラムストア・・・Cassandra、HBASE、Cloud Datastore
	ドキュメント型・・・MongoDB、Couchbase、MarkLogic、PostgreSQL、MySQL、DynamoDB、MS-DocumentDB
	グラフ型・・・Neo4j
	
	流行として、Hadoopはすでに旬を過ぎている。ドキュメント型、キーバリュー型が現在、グラフ型がこれから。

	製品によってそれぞれ言語が違う、RDB屋がとっつきやすいのは？
	→redis、mongoDBが分かりやすい、そこから他を選択するのがよいかと

ドキュメント指向データベースと列指向データベース | Think IT（シンクイット）
https://goo.gl/kTcNkA

各種DBシステムの概要　RDBMSとNoSQL - Qiita
http://goo.gl/ckb9S4


ドキュメント型について調べる。mongoDBはかなり目的にあっているが、
結合が必要になってくる可能性については慎重に考えたほうがいいかも？？
なんとかなりそうな気がするけどな。
ある程度制約ができても非構造データを扱えるメリットを重視したいかも。
でも、RDBSでもある程度できそうだから、そこが選択肢かな。

PostgreSQLのアンチパターン : 何でもかんでもjsonに入れる | Yakst
https://goo.gl/oo3MfR

PostgreSQL JSON の応用メモ - Qiita
http://goo.gl/Gf270b
	
	通常のリレーショナルモデルを使ったデータベースに収まらないデータがある場合、json型を使いましょう。EAVパターンを使ったり、JavaやRubyやPythonなどのオブジェクトをシリアライズしてbytea列に格納したり、どこか別の構造化した外部オブジェクトを参照するキーを保存したりといった時こそが、json列に手を出すべき時です。

cassandraではスーパーカラムを使ってネストできるらしいけど、
深いネストはきっと望ましくないんじゃないかと予想。

	キーバリュー型のデータベースと比べると、複雑なデータ操作を行うこともできます。例えば、条件を指定してデータを検索するようなことも可能です。そのため、リレーショナルデータベースに慣れた方にも、比較的とっつきやすいNoSQLデータベースだと言えます。
	
	ただし、リレーショナルデータベースとは違って、結合に相当するような機能はありません。したがって、結合を多用するような複雑なデータ処理には、MongoDBはあまり向いていないと言えるでしょう。

Couchbaseはサーバースペックが必要になるから、大規模で使うらしい。

するめごはん日記: PostgreSQLアンカンファレンス＠東京に参加しました
http://goo.gl/bEMMT5

もう二度と、絶対にMongoDBを使うべきじゃない理由 | FAworks(エフエーワークス)
https://goo.gl/QzuKoV

mongoDBはいろいろ問題があったみたい。
いまもそうなのかはわからないがpostgresqlのjson,jsonb型が無難かもな。

jsonb型だと参照とかは便利だけど更新は一部マージじゃなく全体更新っぽい？

NoSQLであればノー・インジェクション? | Japan Security Intelligence
http://goo.gl/GSQfEH

jsに任せないように気をつけよう。

Cloudantに関する7件の投稿 - Qiita
http://goo.gl/0xzxJ4

Check! DBaaS ってなんだろう? IBM Cloudant を Bluemix で触ってみる。 - Qiita
http://goo.gl/GL2Mmr
	
	クラウド上にデータを格納し、スケール可能 (=DBaaS)
	ローカルにインストールしての利用も可能
	JSONをはじめ、テキスト、地理的データなど格納可能
	ファイル添付も可能
	REST APIでJSONやファイルを読み取り可能
	ウェブやモバイルアプリケーション、センサーからの断続的・継続的なデータ格納にも対応

Cloudantのチュートリアル - Part1: はじめに - Qiita
http://goo.gl/Tq79sg
	
	Cloudantが毎月$50ドルまで利用料が無料になるそうです。こちらに記事があります。Build More with $50 Free Each Month

cloudantはありかも。IBMか。
どうすっかなあ。
まず軽く試したほうが技術者的には正解なのだろうけど。。
JSON.stringify をオブジェクトのキーでソートした出力にする


## ES5

```ES5
JSON.stringify(obj, function(_, v) {
  return (!(v instanceof Array || v === null) && typeof v == "object") ? Object.keys(v).sort().reduce(function(r, k) { r[k] = v[k]; return r }, {}) : v;
});
```

## ES2015

```ES2015
JSON.stringify(obj, (_, v) => (!(v instanceof Array || v === null) && typeof v == "object") ? Object.keys(v).sort().reduce((r, k) => { r[k] = v[k]; return r }, {}) : v);

```



  [参考]
http://stackoverflow.com/questions/5467129/sort-javascript-object-by-key/29622653#29622653
Macでpyenv使ってPythonの環境設定をするansible playbook



Pythonを始めました。
rbenvと同様にpyenvという便利なものがあることを発見。
使い方もほぼほぼおんなじだったのでplaybookにしてみました。

ansibleは2.0.2。入れるPythonは3.5.1。

## これがそのplaybookだ

```yaml:main.yml
---
- hosts: localhost # hostname
  become: no
  gather_facts: no
  vars:
      python_version: "3.5.1"

  tasks:
    - include: tasks/python.yml
```

```yaml:tasks/python.yml
---
- name: Install basic python packages
  homebrew: name=pyenv

- name: Check installed Python version
  shell: "pyenv versions | grep {{python_version}} > /dev/null; echo $?"
  ignore_errors: true
  register: python_is_installed
  changed_when: python_is_installed.stdout != '0'

- name: Install Python
  shell: "pyenv install {{python_version}}"
  args:
    creates: ~/.pyenv/versions/{{python_version}}/bin/python

- name: Check Python version
  shell: "python --version | grep {{python_version}} > /dev/null; echo $?"
  register: is_correct_version
  changed_when: is_correct_version.stdout != '0'

- name: Switch Python version
  shell: "pyenv global {{python_version}} && pyenv rehash"
  when: is_correct_version.stdout != '0'

- name: pyenv init
  shell: 'eval "$(pyenv init -)"'
  changed_when: is_correct_version.stdout != '0'
```

とっても簡単。（あんまり綺麗じゃないシェルスクリプトですが）

ひとまずこれを叩くとpyenvを入れてpython 3.5.1を入れてそれをセットアップするものができます。

あとは手動で`.bash_profile`などに`eval $(pyenv init)`を書いておくと完了です。

僕の場合はdotfilesを色んな所に持ち出しているので

```bash
if [ `which pyenv` ]; then
    eval "$(pyenv init - --no-rehash)" # adding --no-rehash makes this faster
fi
```

としています。


## おまけ

このPythonの環境設定を含むMacをプロビジョニングするもの作ったので、興味のある方はどうぞ。

> ikuwow/mac-provision: Provisioner of My Mac.
> https://github.com/ikuwow/mac-provision
Webを支える技術を研修で読んでる　まとめ１

輪講形式で読んでいて、気になった点をまとめておく

## 第１部：Webの概要
+ RPC
	+ 分散システムを実現するための技術の１つ
+ 分散システムの流れが来たが、複雑さの問題から発展しなかった
+ Webはシンプルな単方向リンクだけを持つものとして開発
+ SOAP
	+ メッセージ転送の方法だけを定めたプロトコル
	+ 標準化戦争勃発
+ REST
+ リソース
	+ リソースとはWeb上の情報
	+ 世界中の無数のリソースは、それぞれURIで一意の名前を持つ
	+ URIを用いることで、プログラムはリソースが表現する情報にアクセス出来る
+ RESTなアーキテクチャのために
	+ クライアント/サーバ
		+ ユーザインターフェースと処理を分離する
	+ ステートレスサーバ
		+ クライアントのアプリケーション状態をサーバで管理しない
		+ ステートフルな場合、Cookieを使ったセッション管理をしている
			+ REST的には間違い
	+ キャッシュ
		+ 一度取得したリソースをクライアント側で使い回す
			+ 効率化はできるが、情報の信頼性が下がる
	+ 統一インターフェース
		+ URIで指し示したリソースに対する操作を統一した限定的なインターフェースで行う
	+ 階層化システム
		+ サーバとクライアントの間にロードバランサを設置して負荷分散を行う
	+ コードオンデマンド
		+ ブラウザ以外にクライアント側を拡張出来る
			+ JSやFlashなど
		+ プログラムをクライアントにダウンロードして実行する

## 第２部：URI
+ URIの仕様
	+ railsのrouteファイルなどに関わってくるから、ここから大事！
+ URIスキーム
	+ ```http://hogehoge.com```
	+ ```http```の部分がURIスキーム
+ URIフラグメント
	+ ```hogehoge/member#user1```
	+ ページ内の#以下の文字列の要素を示す
+ URIの設計
	+ 変わりにくいURIのために
		+ プログラミング言語に依存した拡張子やパスを含めない
			+ メンテナンス性や可読性
		+ メソッド名やセッションIDを含めない
			+ リファクタリングの時に大変なことに
		+ URIはリソースを表現する名詞にする
			+ 
	+ シンプルで分かりやすいものがCool
	+ 拡張子で表現する方法
		+ .jaや.enなどの言語を指定する時に使う
		+ .txtや.jsonを付けてやる(rails

## 第３部：HTTP(Hypertext Transfer Protocol)
+ HTTPの基本
	+ 階層型プロトコル
		+ p69参照
	+ 同期型プロトコル（レスポンスを待つ）
	+ HTTPメッセージ
		+ ヘッダとボディーに分かれておく
CMSampleBufferをUIImageに変換する(Swift)

#この文書について
以下に書かれた内容をSwiftで書きなおしただけです。
- http://qiita.com/hkato193/items/c0327e4c56ccf1c15e7d

#やり方
CMSampleBuffer -> CVImageBufferRef -> CIImage -> CGImage -> UIImage
という順序で変換していくとUIImageが得られます。

##サンプルコード
```swift:

//CMSampleBufferをUIImageに変換する
func UIImageFromCMSamleBuffer(buffer:CMSampleBuffer)-> UIImage {
    // サンプルバッファからピクセルバッファを取り出す
    let pixelBuffer:CVImageBufferRef = CMSampleBufferGetImageBuffer(buffer)!

    // ピクセルバッファをベースにCoreImageのCIImageオブジェクトを作成
    let ciImage = CIImage(CVPixelBuffer: pixelBuffer)

    //CIImageからCGImageを作成
    let pixelBufferWidth = CGFloat(CVPixelBufferGetWidth(pixelBuffer))
    let pixelBufferHeight = CGFloat(CVPixelBufferGetHeight(pixelBuffer))
    let imageRect:CGRect = CGRectMake(0,0,pixelBufferWidth, pixelBufferHeight)
    let ciContext = CIContext.init()
    let cgimage = ciContext.createCGImage(ciImage, fromRect: imageRect )

    // CGImageからUIImageを作成
    let image = UIImage(CGImage: cgimage)
    return image
}
```
#注意
CGImageを飛ばしてCIImageからUIImageを作ることもできますが、このやり方では得られたUIImageからUIImageJPEGRepresentationを使ってJPG画像を作成すると戻り値がnilになってしまうのでCGImageを経由するのが良いと思われます。

#参考
http://qiita.com/hkato193/items/c0327e4c56ccf1c15e7d
Meta Trader 4 におけるカスタム指標の作成

# はじめに
今回は Meta Trader 4 (MT4) 標準で搭載されているテクニカル指標以外に、独自のカスタム指標を作成してみる。

# MT4 の基本的な使い方 & 開発環境設定
MT4 の基本的な使い方と Sublime Text 3 を利用した開発環境の構築は以下のページにまとめてある。

* [Meta Trader 4 の基本的な使い方](http://qiita.com/Salinger/items/4fe247f27418e4dc734e)
* [Sublime Text 3 による MQL 開発環境の構築](http://qiita.com/Salinger/items/be5dcc6f686b9fe07d9e)

ここまでで下準備は完了。


# カスタム指標作成の基本
## プログラムの構造
MQL4 では `init()` 、 `start()` 、 `deinit()` という特殊な関数が存在する。

* init():
   * チャートにカスタム指標を追加した際に実行される。
* start():
   * init() 実行直後 & 価格が更新されるたびに実行される。
* deinit():
   * チャートからカスタム指標を削除した際に実行される。


# サンプルコード
直近 3, 7 区間の単純移動平均 (SMA) を表示するサンプルコードを以下に示す。

MQL の見た目は C 言語にかなり近い。他の言語の経験があれば、すぐに書けるようになるはず。ただし、時系列データを扱いやすいように、無限長の配列、専用の数値計算や取引のための関数群など機能が数多く搭載されている。

```3_7_sma.mq4
// プリプロセッサ命令
#property indicator_chart_window // チャート内に表示
#property indicator_buffers 2     // 2 個の指標を表示
#property indicator_color1 Red   // 0 番目の指標の色を指定 (-1 番目になるのに注意)
#property indicator_color2 Blue  // 1 番目の指標の色を指定
#property indicator_width1 3     // 0 番目の指標の太さを指定
#property indicator_width2 2     // 1 番目の指標の太さを指定

// 指標用の配列の定義
double Ind0[];
double Ind1[];

// チャートにカスタム指標を追加した際に実行
int init(){
	SetIndexBuffer(0, Ind0);  // Ind0 を 0 番目の指標として登録
	SetIndexBuffer(1, Ind1);

	return(0);
}

// init() 実行直後 & 価格が更新されるたびに実行
int start(){  
    int not_calc = Bars - IndicatorCounted(); // 未計算のバーの数を取得
    for(int i = not_calc - 1; i >= 0; i--){
      // 未計算部分の指標を全て計算
      Ind0[i] = iMA(NULL, 0, 3, 0, MODE_SMA, PRICE_CLOSE, i); // 3区間移動平均
      Ind1[i] = iMA(NULL, 0 ,7, 0, MODE_SMA, PRICE_CLOSE, i); // 7区間移動平均
	}
	return(0);
}


// チャートからカスタム指標を削除した際に実行
int deinit(){
	return(0);
}
```


# サンプルコードの実行
上記 `3_7_sma.mq4` を Sublime Text 3 上でコンパイルし、`3_7_sma.ex4` を作成する。

Finder から `アプリケーション -> XMTrading.app` を選択し、右クリック。パッケージの内容を表示 を選択。 `drive_c/Program Files/XMTrading MT4/MQL4/Indicators` 以下に先ほど作成した `3_7_sma.ex4` をコピーする。

MT4 の画面の `Navigator` から `Indicators` を右クリックし、Refresh を選択。先ほどコピーした `3_7_sma.ex4` が `Navigator`で確認できるようになるので、右クリックし、`Attach to a chart` を選択。設定変更のウィンドウが表示され、プリプロセッサ命令で定義した変数の値の変更ができるが、今回はデフォルトのまま `OK` を選択。

![03_02_37sma.tiff](https://qiita-image-store.s3.amazonaws.com/0/58390/307cdaf8-f08d-86d6-c2e1-7e78ed814ad2.tiff)

これで2つの移動平均が赤色、青色の実線として上記のようにチャート上に表示される。


# おわりに
あとはプログラミングに慣れているユーザなら、 [メタトレーダー４ MQL言語リファレンス日本語翻訳マニュアル ver1.1](http://www.metasys-seeker.net/MQL4_Reference_ver1/MQL4_Reference_Contents.html) にある情報を見れば、各種変数、テクニカル指標を組み合わせ、適切な制御構造を組んでいけば、自由に独自指標を作成することができるだろう。

次は自動取引のためのエキスパートシステムプログラムを作成する。


# 参考文献
* [Meta Trader 4](http://www.metatrader4.com/)
* [Meta Trader 4 の基本的な使い方](http://qiita.com/Salinger/items/4fe247f27418e4dc734e)
* [Sublime Text 3 による MQL 開発環境の構築](http://qiita.com/Salinger/items/be5dcc6f686b9fe07d9e)
* [MQL4](https://www.mql4.com/)
* [メタトレーダー４ MQL言語リファレンス日本語翻訳マニュアル ver1.1](http://www.metasys-seeker.net/MQL4_Reference_ver1/MQL4_Reference_Contents.html)
Slack | いちど設定したリマンドを解除する

# 解決

コメント欄に `/remind list` って入力すると、リマインドの一覧が表示されるので「Delete」を選ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/87919de7-8124-a6e2-1ec2-c630e49092ba.png)

# 問題

いちど設定したリマインドを、どこから解除したら良いか分からない。

# 環境

- Slack ver 1.1.2
- Max OSX



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
プログラミングしたこと無い人向けにサンプルプログラムを作った話（１）

## はじめに
同じ会社で事務員をやっている女の子が、
「html触ってみたいけど、いまいち分からない・・・
headタグとbodyタグのことなら知ってるけど・・・」
て言っていたので、ひとまずサンプルプログラムを渡してみた。

```html
<!DOCTYPE html>
<html>
<head>
    <!--エンコードをUTF-8に指定-->
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>タイトルは、ここに書く</title>
</head>
<body>
    <h1>■とりあえず何か書いてみた↓</h1>
    タグ無しで文字に書くと、こんな感じ。bodyタグの中に書かないと表示されない。<br/>
    基本的に、htmlだけだと黒色でしか表現できない。<br/>
    色付けやデザインなどは、htmlではなくcssという言語を用いる必要がある。<br/>
    改行タグ『&lt;br/&gt;』を使わないと改行できない。

    <br/>
    <h1>■見出しタグのサンプル</h1>
    <h1>h1タグだとこれぐらいの大きさで表示される</h1>
    <h2>h2タグだとこれぐらいの大きさで表示される</h2>
    <h3>h3タグだとこれぐらいの大きさで表示される</h3>
    <h4>h4タグだとこれぐらいの大きさで表示される</h4>
    <h5>h5タグだとこれぐらいの大きさで表示される</h5>
    <h6>h6タグだとこれぐらいの大きさで表示される</h6>
    <br/>
    <h1>■pタグのサンプル</h1>
    <p>
        pタグ内だと、こんな感じ。ここは１つの段落として表現される。<br/>
        テキストテキストテキストテキストテキストテキストテキストテキストテキスト<br/>
        テキストテキストテキストテキストテキストテキストテキストテキストテキスト<br/>
        テキストテキストテキストテキストテキストテキストテキストテキストテキスト
    </p>
    <p>
        pタグごとに改行される。テキストテキストテキスト
        pタグ内では改行タグ『&lt;br/&gt;』を使わないと改行できない。
    </p>
    <br/>
    <h1>■なんか違うページ開きたい時</h1>
    <a href="http://www.yahoo.co.jp/" target="_blank">ここをクリックしたら飛ぶよ</a>
    <br>
    <h1>■リスト表示してみたい</h1>
    <ul>
        <li>リスト１</li>
        <li>リスト２</li>
        <li>リスト３</li>
    </ul>
    <br>
    <h1>■テーブル表示してみたい</h1>
    <table>
        <tr>
            <th>番号</th>
            <th>品物</th>
            <th>個数</th>
        </tr>
        <tr>
            <td>1</td>
            <td>りんご</td>
            <td>４個</td>
        </tr>
        <tr>
            <td>2</td>
            <td>みかん</td>
            <td>５個</td>
        </tr>
        <tr>
            <td>3</td>
            <td>ぶどう</td>
            <td>３個</td>
        </tr>
    </table>
    <br>
    <h1>■入力フォーム的なの作りたい</h1>
    <p>
        名前：<input type="text" size="40">
    </p>
    <p>
        性別：<input type="radio" name="sex" value="male">男
        <input type="radio" name="sex" value="female">女
    </p>
    <p>
        血液型：
        <select name="blood">
            <option value="A">A型</option>
            <option value="B">B型</option>
            <option value="O">O型</option>
            <option value="AB">AB型</option>
        </select>
    </p>
    <p>
        ご感想：<br>
        <textarea rows="4" cols="40"></textarea>
    </p>
    <p>
        <input type="submit" value="クリックしても何も起きないボタン">
    </p>
    <br/>
</body>
</html>
```

## おわりに
まぁ、そんだけなのですが・・・。
.NET4.5と.NET4のソートは結果が異なる

List<T>.Sort()メソッドを利用する以下のコードは、.NET Framework4.5とそれ以前のバージョンでは異なる結果を返します。

```Program.cs
    static class Program
    {
        [STAThread]
        static void Main()
        {
            List<Pair> l = new List<Pair>();

            Random rnd = new Random(0);  // seedを0で固定
            for (int i = 0; i < 100; i++)
            {
                l.Add(new Pair(i, rnd.Next(10)));
            }
            l.Sort(Comparison);

            foreach(Pair p in l)
            {
                Debug.Print("value=" + p.value + ", index=" + p.index);
            }
        }

        static int Comparison(Pair p1, Pair p2)
        {
            return p1.value - p2.value;
        }
    	
    }

    class Pair
    {
        public int index;
        public int value;
        public Pair(int index, int value)
        {
            this.index = index;
            this.value = value;
        }
    }
```

.NET Framework4.5での結果。

value=0, index=99
value=0, index=36
value=0, index=15
value=0, index=29
value=0, index=64
value=0, index=23
value=1, index=75
value=1, index=66
value=1, index=80
value=1, index=54
value=1, index=98
value=1, index=48
value=1, index=42
value=1, index=30
value=1, index=78
（以下略)

.NET Framework4/3.5での結果。

value=0, index=23
value=0, index=64
value=0, index=15
value=0, index=29
value=0, index=36
value=0, index=99
value=1, index=54
value=1, index=30
value=1, index=48
value=1, index=42
value=1, index=98
value=1, index=78
value=1, index=75
value=1, index=80
value=1, index=66
（以下略)

どうやら、.NET4.5になって、ソートのアルゴリズムに変更があったようです。value値が等しい要素の順序が異なっています。

元のリストにおける要素のインデックスが得られるような好運な状況ならば、Comparison関数を以下のように書けば安定ソートになり、.NETのバージョンによらず常に一定の結果を返します。

``` Program.cs
        static int Comparison(Pair p1, Pair p2)
        {
            int t = p1.value - p2.value;
            if (t != 0)
            {
                return t;
            }
            else
            {
                // value値が等しいならば、
                // index値(元の配列におけるインデックス)に基づいてソート
                return p1.index - p2.index;
            }
        }
```

実行結果
value=0, index=15
value=0, index=23
value=0, index=29
value=0, index=36
value=0, index=64
value=0, index=99
value=1, index=30
value=1, index=42
value=1, index=48
value=1, index=54
value=1, index=66
value=1, index=75
value=1, index=78
value=1, index=80
value=1, index=98
(以下略)
[Ruby] Webpayのエラーを日本語対応する


## はじめに

Webpayの日本語エラー対応で調べてて詰まったのでメモ的に書いておきます。

## set_accept_languageを設定

やることは単純で、set_accept_languageを入れるだけでした。

```
webpay = WebPay.new('test_secret_...')
webpay.set_accept_language('ja') # これを入れる
```

ググっても意外に見つけるのに苦労したので。。

## 参考

http://tkoyama1988.hatenablog.com/entry/2014/10/23/111517
HTMLの孤島発見スクリプト

# はじめに

長いことウェブサイトを管理してて、どこからもリンクされていないファイルが増えてきた。それを気軽にチェックしたかったのだが、そのために何かインストールしたりするのも面倒だし、いちいちそんなのGUIでチェックするのも鬱陶しい。それくらいどこかに転がってるだろうと思ってちょっと探したが見つからなかったので超手抜き孤島発見Rubyスクリプトを書いた。無責任無保証。

# 使い方

自分のウェブサイトのファイルがあるディレクトリ(例えばpublic_html)で、上記スクリプトを実行すると、どこからもリンクされていないと思われるhtmlファイルを報告する。

```shell-session
$ cd public_html
$ ruby linkchecker.rb
/path/to/public_html/foo.html is isolated.
/path/to/public_html/bar.html is isolated.
```

# スクリプト

```ruby:linkchecker.rb
# Copyright kaityo256 2016
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

def findlink(filename,h)
  dir = File.dirname(filename)
  open(filename){|f|
    f.gets(nil).scan(/a href=\"(.*?)\"/).each{|a|
      s = a[0]
      next if s =~ /^http/
      next if s =~/^#/
      if s=~/(.*?html)#/
        s = $1
      end
      next if s !~/html$/
      s =  File.expand_path(s,dir)
      h[s] = true
    }
  }  
end

h = Hash.new
files = Array.new
Dir.glob('./**/*').each{|filename|
  if filename =~ /html$/
    full = File.expand_path(filename)
    files.push full
    findlink(full,h)
  end
}

files.each{|f|
  if !h.has_key?(f)
    puts "#{f} is isolated."
  end
}
```


# 動作原理

Dir.globで、スクリプトを実行した場所から再帰的にhtmlファイルを探して全てリストアップ。それぞれを一括で読み込んで(`gets(nil)`)、リンクを全部調べる('scan')。見つかったリンクをフルパスになおしてハッシュに突っ込む。全てハッシュに突っ込んだら、全てのhtmlファイルがそのハッシュに存在するか調べ、なかったら報告する。

# 余談

何も指定しなければ、おそらくUTF-8じゃないと動かない(それ以外のファイルが来たら止まる)。また、複数のエンコーディングが混ざっている場合に対応させるのはちょっと面倒だと思う。
【CSS】margin / padding / display-style がよくわからないぼくへ

# **はじめに**
イマイチCSSの以下の部分が理解できていないのでまとめてみようと思います。

- **ボックスモデル**
  - margin
  - padding

- **display-style**
  - blockレベル要素
  - inline要素
  - inline-block要素


# **ボックスモデルについて**
## **ボックスモデルとは？**
![box-model1.gif](http://ad-line.jp/tips/wp-content/uploads/2014/10/box-model1.gif)

## **ボックスモデルの各領域について**
### **content**
- テキストや画像などが表示される領域
- 幅はwidthプロパティ、高さはheightプロパティを指定する事で任意の幅と高さにする事ができる
- backgroundプロパティの指定が有る場合、内容領域とパディングに背景が表示される

### **padding**
- 内容領域とボーダーの間にある余白領域
- パディングの指定は、paddingプロパティで行う
- backgroundプロパティの指定が有る場合、パディング部分にも背景が表示され、パディング領域の左上が背景画像の始点になる

### **border**
- パディングの外側にある領域
- ボーダーは余白とは違い、その名の通り「線」のため、パディングやマージンのように余白の指定をするのではなく、各borderプロパティによって線の種類（border-style）を変えたり太さ（border-width）や色（border-color）を変えたりといった事ができる

### **margin**
- ボックスの最も外側にある余白領域
- marginプロパティの指定をする事で余白を調整する事ができる
- マージン領域には背景が表示されないため常に透明になる
- 要素同士が垂直方向で隣接している場合、条件によってはマージンが重なり、いずれかの大きいマージンの値が反映されることを**マージンの相殺**と言う
- 水平マージンは相殺されず、各マージンの値が足されたマージンが反映される

# **display-styleについて**
![](https://camo.githubusercontent.com/3134f9555fc0adc294dc9b639500d61be6faca3d/687474703a2f2f342e62702e626c6f6773706f742e636f6d2f2d5469774f69786c6f6f4a6b2f55345579456e765f5870492f41414141414141414346732f4e75754c7a3249766f5a342f73313630302f6373732d646973706c61792d626c6f636b2d76732d696e6c696e652d626c6f636b2e706e67)

## **blockレベル要素**
### **blockレベル要素とは？**
- 文書の骨組みとなる要素
- 見出し要素（h1, h2, h3…h6）、p、ul、ol、li、div、table など
- 要素の前後に改行が入り、ブロックを積んでいくような表示になる

### **特徴**
- 縦に積まれていく
- 幅 width と高さ height が指定できる
- 上下左右に margin を指定できる
- 上下左右に padding を指定できる
- text-align は要素の中身に適応される
- vertical-align は指定できない

## **inline要素**
### **inline要素とは？**
- ブロックレベル要素の中身として使われる要素
- a、span、strong など
- 要素の前後には改行は入らず、テキスト状に横に横に流れていくような表示になる

### **特徴**
- 横に並んでいく
- 幅 width と高さ height は指定できない
- 幅や高さは文字列の長さや文字の大きさなど、内容物のサイズのみ指定可能
- 左右だけ margin を指定できる
- 左右に padding を指定できる
- text-align を親ブロックに付けることで指定できる
- vertical-align を指定できる

## **inline-block要素**
### **inline-block要素とは？**
- インライン要素のように横に並んでブロック要素のように幅や高さ、margin や padding　を指定できる

### **特徴**
-  横に並んでいく
-  幅 width と高さ height が指定できる
-  上下左右に margin を指定できる
-  上下左右に padding を指定できる
-  text-align を親ブロックに付けることで指定できる
-  vertical-align が指定できる



# **参考**
- http://kojika17.com/2012/08/margin-of-css.html
SwiftでCSV形式の文字列を生成する(Swift2.2)

SwiftでCSV形式の文字列を作成するためのメモ。
カンマが入ったデータにも対応させる。

#編集前Ver・・・
~~~Swift
var csvData = [
    ["1,234", "222", "hoge", "aaa,bbb,ccc", "1,000,000"],
    [1_000_000, 2, 3, 4, 5.555],
]
var s = ""
for a in csvData {
    for aa in a {
        s += "\"\(aa)\","
    }

    s = s.substringToIndex(s.startIndex.advancedBy(s.characters.count - 1))
    s += "\n"
}
s = s.substringToIndex(s.startIndex.advancedBy(s.characters.count - 1))
print(s)
~~~


#編集後シンプルVer
~~~Swift
var csvData = [
    ["1,234", "222", "hoge", "aaa,bbb,ccc", "1,000,000"],
    [1_000_000, 2, 3, 4, 5.555],
]
var s = csvData.map { $0.map { "\"\($0)\"" }.joinWithSeparator(",") }.joinWithSeparator("\n")
print(s)
~~~

#結果

~~~
"1,234","222","hoge","aaa,bbb,ccc","1,000,000"
"1000000","2","3","4","5.555"
~~~