OmniAICreator/Qiita-1.07M huggingface dataset:
Movable Typeクラウド版でのogpの記述のコツ

クラウド版Movable Typeをステージング環境として使用している場合、本番環境へファイルを配信する際にhtml上のURLがドキュメントルートからのパスに置換されてしまうため、例えば`og:url`の`content`に`<mt:CanonicalURL>`を指定しても本番環境ではドメイン部分がごっそり抜けてしまう。

> 配信される HTML ファイルに含まれている URL （サイト URLと同じ URL のみ）は、/ で始まる相対パスに自動的に置換されます。
[サーバー配信 | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/mt6/advanced/content-sync.html)

そのためphpを利用し以下のように対応した。
# htaccessの設置

htmlでもphpが動作するように 

`AddType application/x-httpd-php .php .html`
もしくは
`AddHandler application/x-httpd-php .php .html`

と記述した.htaccessファイルを作成し本番環境にアップ。

# mtのテンプレート内にphpを記述

以下をHTMLヘッダーなどのテンプレートに記述。

まず変数にドメインを格納。

`<?php
$url  = empty($_SERVER["HTTPS"]) ? "http://" : "https://";
$url .= $_SERVER["HTTP_HOST"];
?>`

次に該当箇所に`echo`で表示。

`<meta property="og:url" content="<?php echo $url; ?><mt:CanonicalURL>">`

# 出力結果

ステージング環境のドメインが `example.movabletype.biz`、
本番環境のドメインが `www.example.com` の場合、
ステージング環境では

`<meta property="og:url" content="http://example.movabletype.biz/http://example.movabletype.biz/2017/12/post.html">`

にように出力されてしまうが、配信されるタイミングでステージング環境のドメインは削除される＆htmlを生成する際にphpで本番環境のドメインを取得するため、結果的に以下のように出力される。

`<meta property="og:url" content="http://www.example.com/2017/12/post.html">`

クラウド版Movable Typeは標準の検索機能も使えないし使う案件を選びますね。
配信機能については、相対パスへの書き換えではなく本番環境のドメインに置換するオプションとか用意してくれれば楽なのにな、と思いました。
Elmなんか作ろう会はじめました

Webフロントエンドに特化したAltJSであり、フレームワーク(アーキテクチャ)を内蔵したReduxの親である関数型言語Elm 今年熱いです！！！

現時点(12月21日)ではありますが、Advent Calendar 2017のプログラミング言語 いいね ランキング3位で、かなりメジャー言語に食いついています(なにげに7位にElm2もいます)

<img width="994" alt="スクリーンショット 2017-12-21 13.30.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/48687/5de87bf5-b7cf-9163-6df6-125ae1a2dd4f.png">

そんな今熱い言語Elmですが日本語書籍も無く(来年には、[基礎からわかる Elm](https://www.amazon.co.jp/dp/4863542224)発売予定です！)、日本語のWeb情報を充実している最中でございます。それでも一人で学び始めるには、ツライ・・・ そんなあなたの為にElm日本コミュニティ(たぶんまだ公認ではありませんが・・・)が、不定期ではありますが、それなりの頻度でオンライン・ハンズオン形式で学べる、[なんか作ろう会](https://scrapbox.io/ababup1192/Elm%E3%81%AA%E3%82%93%E3%81%8B%E4%BD%9C%E3%82%8D%E3%81%86%E4%BC%9A)を開催しました！ 第一回が12/20で、第二回は12/22を予定しております。

会の内容ですがDiscord(チャットオンリー)を使い、私ABAB↑↓BAが、その日の題材を決め30分から1時間を目安に参加者一斉に物を作ってもらいます。最後に模範解答的なものや皆さんが出来たものを見せ合って解散となります。全くわからない人向けにテンプレートを用意したり、途中分かる方に助言を求めたり、眺めるだけでの参加も自由になってますので興味がある方は、是非ご参加ください！出来上がったものは私が適当にピックアップして[記録として残している](https://scrapbox.io/ababup1192/Elm%E3%81%AA%E3%82%93%E3%81%8B%E4%BD%9C%E3%82%8D%E3%81%86%E4%BC%9A)ので是非触ってみて遊んでみてください。
WindowsでMagic Keyboardを使う

渋々Windowsへ移行した/一時的に使っているけれどMagic Keyboard使いたい、身体的にMacの⌘ショートカット操作を維持しておきたい人のための設定メモです。自分はテンキー付き・US配列で動かしているので、コンパクトなものやJP配列だと若干違うのかも。1年くらい使って今のところ快調です。


## SharpKeys
https://sharpkeys.codeplex.com/
レジストリ操作によるキーバインド変更をサポートしてくれます。デフォルトではスペースバーの左右にある⌘キーがWinキーになってしまうので、それをCtrlキーとしてアサインしています。一番上の行は好みですが、代わりにCaps LockをWinキーとしてアサインしています。

![sharpkeys.jpg](https://qiita-image-store.s3.amazonaws.com/0/153494/79ba6ac7-d8c1-ca44-aac6-ae6845855067.jpeg)



## AutoHotKey
https://autohotkey.com/
キーの入れ替えだけでなく、キーを組み合わせた場合の挙動なども自由に設定ができます。

- ⌘Q → Alt + F4
- ⌘Tab → Alt + Tab

Mac操作時に使用頻度の高い、アプリの切り替え(⌘Tab)と終了(⌘Q)のショートカットを実現したくて使っています。こちらはバックグラウンドで起動させておく必要があるので、以下のテキストファイルを.ahkスクリプトとして保存して、スタートアップに設定します。

```
#HotkeyModifierTimeout 100

^q::
   Send, !{F4}
return

^Tab::
   Send, {LAlt Down}{Tab}
return

#If WinExist("ahk_class MultitaskingViewFrame")
Ctrl Up::
   Send, {LAlt Up}
Enter::AltTabMenuDismiss
LButton::AltTabMenuDismiss
#IfWinExist
return
```

## ここがいい
ほとんどMac使用時と変わらない操作感でWinが使えます。快適！

## ここがだめ
- Macでの⌘Tabで⌘ホールドダウンからの⌘Q が使えない（アプリの切り替えウィンドウの中で直接アプリの終了ができない)。無理に使おうとしたり、⌘+Tab中に別のキーを押そうとしたりすると稀に⌘キー押さえっぱなしになったりします。
　

- ⌘Tab操作中はCtrlをAltキーと入れ替えたりする必要のある関係で、AHKのみで完結できなかった。あまりレジストリに触りたくないのと、セットがややこしくなるので、できればSharpKeysのみで実現したい。

AHKスクリプトの上手な方、改善できそうな所があれば是非教えてください。。
さくらのクラウド + legoでLet's encrypt(DNS-01) 

**>>> 2018/10/18 追記**

ようやくさくらのクラウド対応が含まれる lego v1.1.0がリリースされました。
https://github.com/xenolf/lego/releases/tag/v1.1.0

この記事の以降の部分は不要となっています。
sacloud/legoを使わなくても[xenolf/lego](https://github.com/xenolf/lego/releases/tag/v1.1.0)を直接利用すればOKです。

**<<< 2018/10/18 追記**


**>>> 2018/6/22 追記**

本日legoのさくらのクラウド対応がマージされました。  
この記事の内容はそのまま利用可能となっています。

また、マージされるまでの間にワイルドカード対応(ACME v2対応)なども行われています。
便利になりましたのでぜひお試しください。

**<<< 2018/6/22 追記**


「[さくらのクラウド ウェブアクセラレータでLet's Encryptを使う](https://qiita.com/masa23/items/f17c148d4c941d6f2ed4)」という記事を読んで、
「そういえばさくらのクラウドでlego+DNS-01出来ないかな?」と思って調べたら、出来そうだったので対応してみました。

## というわけでlegoにPR送った

[lego#456: Add DNS Provider for SAKURA Cloud](https://github.com/xenolf/lego/pull/456)

これがマージされれば以下のような感じでさくらのクラウドDNSを利用してDNS-01で証明書発行が可能です。

```bash
# さくらのクラウドAPIキーを環境変数に指定
export SAKURACLOUD_ACCESS_TOKEN=<APIアクセストークン>
export SAKURACLOUD_ACCESS_TOKEN_SECRET=<APIアクセスシークレット>

# --dns=sakuracloudと指定してlego runを実行
lego --email="example@example.com" --domains="example.com" --dns="sakuracloud" run
```

なお、あらかじめさくらのクラウドDNSにゾーンを登録しておく必要があります。
参考：[【さくらのクラウド】DNSアプライアンス導入ガイド](https://www.slideshare.net/sakura_pr/sakuracloud-dns)

**>>> 2018/6/22 追記**

本日PRがマージされました。
今後は以下の暫定対応は不要となりました。

**<<< 2018/6/22 追記**


## マージされるまでの暫定対応

legoは最近あまり開発に動きがないようですので、PRがマージされるまでの暫定版として以下2通りで配布しています。

- forkしたリポジトリでバイナリを配布(https://github.com/sacloud/lego/releases/latest)
- Dockerイメージで配布

GitHubからダウンロードする場合、各プラットフォームごとにバイナリを置いていますので自身のプラットフォームにあったものをダウンロードしてください。

Dockerの場合は以下のように利用します。

```bash
# さくらのクラウドAPIキーを環境変数に指定
export SAKURACLOUD_ACCESS_TOKEN=<APIアクセストークン>
export SAKURACLOUD_ACCESS_TOKEN_SECRET=<APIアクセスシークレット>

docker run -it --rm \
       -e SAKURACLOUD_ACCESS_TOKEN \
       -e SAKURACLOUD_ACCESS_TOKEN_SECRET \
       -v $PWD:/lego \
       sacloud/lego \
         --path=/lego \
         --email="example@example.com" \
         --domains="example.com" \
         --dns="sakuracloud" \
         run
```

上記のように実行すると、カレントディレクトリに`accounts`と`certificates`というディレクトリが作成されます。

証明書/秘密鍵は`certificates`に配置されています。

## ということで

はやくlego本体にマージされるといいなー。
以上です。
Bitnami Redmine でSVNリポジトリの変更をチケットへ反映させる

## 環境
OS : Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-129-generic x86_64) 

## 手順
1. 「管理」→「設定」画面の「リポジトリ」タブで「コミットを自動取得する」をOFF

2.  以下のコマンドをcronで実行する
    
    例) 10分おきの場合
    $ crontab -e
    以下を記載
    */10 * * * * cd /opt/bitnami/apps/redmine/htdocs/lib/redmine/; PATH=$PATH:/opt/bitnami/ruby/bin /opt/bitnami/ruby/bin/rake redmine:fetch_changesets RAILS_ENV=production >/tmp/redminecrontab.log 2>&1

# 参考リンクほぼまんま
[「リポジトリ」を開くまでSubversion等のリポジトリへのコミットが「活動」に表示されません](http://redmine.jp/faq/repository/subversion/)
[Atom] bracket-matcherカスタム設定でTeXの数式囲み（$$）を簡単に挿入

AtomでTeX文書を編集したりとか、Markdown + MathJaxな環境を構築してTeX文法の数式入りMarkdown文書を編集したりとか、やってる人は少なからずいると思います。

markdown-preview-plusパッケージを導入すればプレビューも可能で、結構実用的です。環境構築はQiitaだとこのあたりの記事が参考になります。

- [【必見】Atomで作る快適な論文執筆TeX環境【Mac】【卒論】【LaTeX】 - Qiita][atex]
[atex]: https://qiita.com/ken0nek/items/f98f88c9c45d8499786e
- [AtomでMarkdown+数式を利用する - Qiita][amm]
[amm]: https://qiita.com/noppefoxwolf/items/335323b98f0400a6f07d

# `$$`

TeX文法での数式挿入に対応している環境では、インラインで数式挿入する場合は`$$`で数式部分を囲みます。

例えば、

```
さて、$T_i = 30$の場合、
```

このように書くと、

> さて、$T_i = 30$の場合、

と数式表示されます。（Qiitaも対応しています）
すると当然の欲求として、

```
さて、T_i = 30の場合、
    ^^^^^^^^
```

↑この部分を選択した状態で、<kbd>Shift + $</kbd>を打鍵したら、

```
さて、$T_i = 30$の場合、
```

こうなって欲しいわけです。Atomではデフォルトでbracket-matcherという公式パッケージが存在しており、このような機能を実装しています。
`""`や`()`のような一般的な囲みにはデフォルトで対応していますが、`$$`はTeX文法に独特なものなので、以下のようにして導入できます。

# 言語ごとにbracket-matcherの追加パターンを登録する

要は[ここ][ss]に書いてあることですが。

[ss]: https://github.com/atom/bracket-matcher#scoped-settings

単純に、bracket-matcherのsettingを開いて、

![Autocomplete Characters](https://qiita-image-store.s3.amazonaws.com/0/76980/b05d60ed-634b-ed98-24f5-c7d6b5d2199d.png)

この部分に追加パターンを挿入するのでもOKですが、そうすると言語問わずグローバルにパターンが有効になってしまいます。`$$`は対応環境以外では不要なので、言語を絞りたい。

Open Config Folder > `config.cson`と選択して、編集します。

```yaml:config.cson
".tex.text":
  "bracket-matcher":
    autocompleteCharacters: [
      "()"
      "[]"
      "{}"
      "\"\""
      "''"
      "``"
      "“”"
      "‘’"
      "«»"
      "‹›"
      "$$" # デフォルトに無い`$$`
    ]
```

すでに`.tex.text`スコープに関するユーザ設定が存在している場合は、既存の`.tex.text`エントリ配下に追記しましょう。
LaTeX等の派生規格を使用している場合も、AtomのTeX関連パッケージではそれらのスコープが`.latex.tex.text`のようにサブスコープになっているため、上位のスコープに対して適用しておけば有効になります。

Markdownでも適用させたい場合は`.md.text`スコープに同じように記述しましょう。
C#でWebBrowserを使用し、JavaScriptとデータをやり取りする

C#のWebBrowserコントロールを使用した場合、ハードウェア制御の処理はC#で行い結果表示はjsで表示したいことがあります。
WebBrowser.InvokeScriptメソッドを使用することでC#とjsとでデータのやり取りを行うことができます。

```c#:sample.cs
public partial class Form1 : Form
	{

		public Form1()
		{
			InitializeComponent();

			webBrowser1.ObjectForScripting = new TestClasss();
			MainForm_Load();

		}

		private void MainForm_Load()
		{

			var indexPath = "http://127.0.0.1:80/sample.html";
			System.Text.Encoding encoding = System.Text.Encoding.UTF8;
			webBrowser1.Navigate(indexPath);

		}


		[ComVisible(true)]
		public class TestClasss
		{
			public void TestFunc(string str)
			{
				MessageBox.Show(str, "戻り値", MessageBoxButtons.OK);
			}
		}

		private void button1_Click(object sender, EventArgs e)
		{
			webBrowser1.Document.InvokeScript("sample", new string[] { "あいうえお", "さしすせそ" });
		}
	}

```
```html:forward.html
<html>
<head>
    <meta charset="utf-8">
    <title>タイトル</title>
</head>
<body>
    <script>
        function sample(arg1, arg2) {
            window.external.TestFunc(arg1 + ",かきくけこ," + arg2);
        }
    </script>
</body>
</html>
```

C#のボタンを押すとjsのsample関数が実行されます。その際objectで引数を渡しています
```webBrowser1.Document.InvokeScript("sample", new string[] { "あいうえお", "さしすせそ" });```

jsのsampleは受け取った値（「あいうえお」と「さしすせそ」）の文字列をに「かきくけこ」を追加し、C#側のTestFuncを呼び出します。
```window.external.TestFunc(arg1 + ",かきくけこ," + arg2);```

これでC#とjsとでデータの受け渡しが完了です。
コンパイラの中間表現いろいろ

# 中間表現

一般に、あるプログラミング言語で書かれたソースコードと、コンパイラが成果物として出力する目的コードには抽象度に大きな隔たりがあります。

例を挙げると、`1 + 2 - 3`のような単純な数式も、`push 1; add 2; sub 3;`のような形式に変換する必要があります。

このギャップを一気に埋めるのはとてもつらいため、多くのコンパイラでは**中間表現**というアイディアを採用しています。

例えば、HaskellのコンパイラGHCは、抽象構文木以外に、大きく分けてCore,Std,C--の3つの中間表現を使っています。
CのコンパイラGCCも、GIMPLE、RTLといった中間表現を用いています。

中間表現を用いるもう一つのメリットは、コンパイラの内部構造のモジュール化です。
中間表現を採用することで、ソースコードをASTに変換し意味検査を行うフロントエンド、中間表現に変換し最適化を行うミドルエンド、中間表現から目的コードへの変換を行うバックエンドに分割できます。

# 中間表現の種類と性質

この記事では、数ある中間表現を大きく「命令型」「関数型」の2つに分けて紹介します。
この区分は何らかの合意にもとづくものでも厳密なものでもなく、「ALGOLっぽい雰囲気」「MLっぽい雰囲気」程度の主観的なものです。

中間表現には、異なる歴史的経緯を辿って似たような形式にたどり着いたものがいくつか存在します。
これらの対比、あるいは歴史的に連続したものの比較をわかりやすくする目的でこの区分を採用しました。

ここで紹介する中間表現は、実際にはソース言語に由来する拡張を追加したり、複数の手法を合わせて利用されるものも含まれます。

## 命令型
### 3番地コード

典型的な3番地コードの命令は`x := y op z`の形式で表現されます。

例えば、

```c
a = 2 + b * 2 / c
```
は、一時変数を追加して

```c
t1 = b * 2
t2 = t1 / c
a = 2 + t2
```
のように変換されます。

制御構文を含むプログラムは、無条件ジャンプと条件付きジャンプを使用してより機械語に近い形に変換されます。

例えば、

```c
a = 0
for (i = 0; i < 10; i++) {
  a += i;
}
```
は

```c
    a = 0
    i = 0
L1: if i < 10 goto L2
    a = a + i
    i = i + 1
L2:
```
のように変換されます。

最も単純な中間表現の一つで、他の多くの中間表現でもベースに3番地コードを採用しています。

### CFG 制御フローグラフ

TODO: 書く

#### 基本ブロック

TODO: 書く

### SSA 静的単一代入形式

SSAは、すべての変数が唯一の定義をもつ中間表現です。

例えば、

```
a = 1
a = 2
b = a + 2
```
のようなコードがあったとき、一行目の`a = 1`が消去できることは明らかです。
しかし、手続きとしてこの処理を行うためには、変数がどこで再代入され、どこで使用されているのかを解析する必要があります。

SSAに変換すると、

```
a_1 = 1
a_2 = 2
b_1 = a_2 + 2
```
のようなコードになるため、a_1が使用されていないことがより簡単に分かります。

TODO: より複雑な例、φ関数について書く

データフロー、制御フローの解析や最適化アルゴリズムをより単純にできるため、
多くのコンパイラで採用されています。
また、最近のコンパイラではLLVMが広く使われていますが、これもSSAを採用しています。

### RTL

TODO: 書く

## 関数型
この節で紹介する中間表現の多くはλ計算がベースとなっています。

この記事で使用するλ計算は、以下のような構文で定義される、let式をもつものです。

```bnf
TERM := <identifier>
     |  TERM TERM
     |  "λ" <identifier>+ "." TERM
     |  "let" <identifier> "=" TERM "in" TERM
```

また、いつもどおり関数適用は左結合、λ抽象はカリー化されているものとします。

### CPS 継続渡しスタイル

Schemerにはおなじみのアレです。
関数を評価するとき、結果を変数に代入するのではなく、次の処理を表す関数を引数として与える形式を、**継続渡しスタイル**と呼びます。

```lisp
fib (+ 4 (- 10 2))
==>
(- 10 2 (λx.
  (+ 4 x (λy.
    (fib y k)))))
```

制御構造が陽に示される、すべての変数が一度だけ宣言されるなど、SSAと似た性質をもつため、関数型言語のコンパイラが中間表現として採用している事があります。(SML/NJなど)

### K正規形

TODO: 書く

### A正規形

TODO: 書く

# 関連する話題

* LLVM
* 制御フロー解析、データフロー解析

# 参考文献

* 最新コンパイラ構成技法
* Compiling with Continuations

TODO: 参考文献の追加

折を見て追記していきます。
AWS 踏み台ホスト:クイックスタートリファレンスデプロイ　多段SSHでハマる

## 前提
### AWS クラウドでの Linux 踏み台ホスト 
AWSは、よくある踏み台ホスト環境の CloudFormation テンプレートを用意しています。 
[AWS クラウドでの Linux 踏み台ホスト: クイックスタートリファレンスデプロイ](http://docs.aws.amazon.com/ja_jp/quickstart/latest/linux-bastion/welcome.html)

## 多段SSHでハマる

### 多段SSH 設定例
```~/.ssh/config
Host bastion #踏み台
   HostName xxx.xxx.xxx.xxx #グローバルIP
   Port 22
   User xxxxxx
   IdentityFile ~/.ssh/id_rsa

Host target #各サーバ
   HostName 10.0.0.1 #VPC内ローカルIP
   User xxxxxx
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W %h:%p username@xxx.xxx.xxx.xxx
```

### 多段SSH 実行時のエラーメッセージ
```
$ ssh target
channel 0: open failed: administratively prohibited: open failed
stdio forwarding failed
ssh_exchange_identification: Connection closed by remote host
```
最初焦りましたが、理由は単純で AWS提供のbastionサーバのデフォルトがAllowTcpForwarding no でした。

### 設定を変更して

```ruby:/etc/ssh/sshd_config
AllowTcpForwarding yes
```

### sshを再起動しましょう
```
service sshd restart
```
「Communications link failure」が出る時


## MySQLのポート番号を調べる

MySQLのListenしているポートを調べます。

```mysql
mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3307  |
+---------------+-------+
```

以下のコマンドでポート確認できているつもりになっていると、ハマる場合があります。 
実際には`mysql.sock`が使われている場合があります。

```bash:確認コマンド
$ mysql -uroot -hlocalhost -P3306 -p
```

シェルコマンドで確認する場合は、telnetで行うのが確実です。


## MySQLのコネクションタイムアウト値を調べる


MySQLのコネクションタイムアウト値が短すぎると、JDBCのコネクションプール機能を使用している時にエラーが出る場合があります。

以下のコマンドで、コネクションタイムアウト値`wait_timeout`が短すぎないか確認します。

```mysql
show global variables like '%wait%';
+---------------------------------------------------+----------+
| Variable_name                                     | Value    |
+---------------------------------------------------+----------+
| innodb_lock_wait_timeout                          | 120      |
| innodb_spin_wait_delay                            | 6        |
| lock_wait_timeout                                 | 31536000 |
| performance_schema_events_waits_history_long_size | 10000    |
| performance_schema_events_waits_history_size      | 10       |
| wait_timeout                                      | 60       |
+---------------------------------------------------+----------+
```

確実に接続したい場合は、`default.poolValidationQuery`を設定して、接続確認を行うようにします。

```
default.poolValidationQuery="select 1 as one"
```


■参考
scalikejdbcでmysqlとの通信時のCommunicationsExceptionに対処する
http://zudoh.com/archives/248
Scalaでも量子計算がしたい！　〜のでブラケット演算のDSLを作ってます〜

量子コンピュータの話題がアツいですね！
Microsoftの[YouTube PV](https://www.youtube.com/watch?v=doNNClTTYwE)では「10億の並行宇宙で走るコンピュータによって解くべき問題とは？」なんて煽り文句まで飛びだして、おまえは何を言っているんだ感ありますが、実際、従来のコンピュータとは計算モデルからして異なるものです。

たとえば、アダマールゲートという回路があるのですが、これはブラケット記法を使うと次のように表せます。

```math
\newcommand{\bra}[1]{\left\langle #1 \right|}
\newcommand{\ket}[1]{\left| #1 \right\rangle}
\newcommand{\bracket}[2]{\left\langle #1 \middle| #2 \right\rangle}
H = \frac{\ket{0}\bra{0} + \ket{0}\bra{1} + \ket{1}\bra{0} - \ket{1}\bra{1}}{\sqrt{2}}
```

$\bra{\ \ }$ がブラで、 $\ket{\ \ }$ がケット、二人掛け合わせてブラケット $\bracket{\ \ }{\ \ }$ ってなもんで、

```math
\bracket{0}{0} = 1 \\
\bracket{1}{1} = 1 \\
\bracket{0}{1} = 0 \\
\bracket{1}{0} = 0
```

異なる基底を掛けるとゼロになって消えちゃいます。ばよえ〜ん
さて、先ほどのアダマールゲートに量子ビット $\ket{1}$ を適用してみますと、

```math
\begin{align}
H \ket{1}
&= \frac{\ket{0}\bracket{0}{1} + \ket{0}\bracket{1}{1} + \ket{1}\bracket{0}{1} - \ket{1}\bracket{1}{1}}{\sqrt{2}} \\
&= \frac{\ket{0} - \ket{1}}{\sqrt{2}}
\end{align}
```

となって、めでたく量子ビット $\ket{0}$ と $\ket{1}$ の重ね合わせ状態になります。
重ね合わせ、それはロマン。あるいは、猫が生きている宇宙と猫が死んでいる宇宙が同時に存在する、なんて日本語でおkな説明をされるやつです。やりましたね。

さて、 $1$ 量子ビットの計算であれば $2$ 個の基底で表現できるのですが、 $n$ 量子ビットの計算となると $2^n$ 個の基底が必要となり、式もどんどん複雑になって手計算やってられっかという気持ちになります。
目の前に量子コンピュータがあればソレに計算させればいいじゃんという話もあるのですが、量子状態は確率的にしか測定できないお茶目なやつなので、やはり量子回路組む前にブラケット記法でゴリゴリ計算しておきたいところではあります。
ということで、普通の古典計算機でコーディングしちゃう？　わけなのですが、私たちは数式っぽく書きたい…でしょう？

となると、シンタックスに自由がありつつ、硬めの計算もできる言語が良さそうです。こんなこともあろうかと、オブジェクト指向で関数型なスクリプト言語Scalaを使えば——

　
これが、

```math
H = \frac{\ket{0}\bra{0} + \ket{0}\bra{1} + \ket{1}\bra{0} - \ket{1}\bra{1}}{\sqrt{2}}
```

こうなって、

```scala
val h = ( |(0).> * <(0).| + |(0).> * <(1).| + |(1).> * <(0).| - |(1).> * <(1).| ) / √(2)
```

こうじゃ( ＾ω＾)

```scala
> println(h * |(1).>)

+0.7071 |0> -0.7071 |1>
```
　

え、丸括弧とドットが余分ですって。ま、マクロを使ってみては？
ともかく、このくらいで良しとする人生ならば、ブラとケットの定義は簡単です。わぁいケースクラス あかりケースクラス大好き。

```scala
case class <(i: Int) extends AnyVal {
  def | = SparseMatrix(Map(0 -> Map(i -> 1)))
}

case class |(i: Int) extends AnyVal {
  def > = SparseMatrix(Map(i -> Map(0 -> 1)))
}
```

Scalaって、クラス名とか関数名に `<` `|` `>` 使えるんですね。
コンパイル通ってビビりました（ぉぃ

さて、実は。ブラやケットは行列でも表すことができて、されば `SparseMatrix` を実装すればってなもんで、それは `Map[Int, Map[Int, Complex]]` をラップすれば良さそうで、Hey Yo、行列は行列でも複素行列なので `Complex` も必要で、その値は `0.1 + 0.2 i` みたいに書きたくって、行列の演算は足し算や掛け算だけじゃなくてクロネッカー積なるものも欲しく、はたまた行列を安全に計算するためには `Seq[Seq[Complex]]` で長さも型情報に埋めこんだ方がいいなんて話もあって、量子回路の適用はパイプラインでやりたい気もしてきて、アーッお客様困ります要望が多すぎて実装がアーッ、でもScalaなら？


……という話を、ScalaMatsuri 2018でしたい、です！　ので応募しました。
なんと今年は参加者の投票はもちろんのこと、下記リンク先のセッションページをSNSでシェアしてもらうことでも、発表確率が高まっていく仕組みです。　＼カワイイ／

[量子コンピュータをScalaでかわいくシミュレーションしてみよう♪](http://2018.scalamatsuri.org/ja/candidates/TorigoeTakatomo_1/)
pandasのMultiIndexから列に変換する。

調べてもでなかった。
indexを列に変換したかった。

# indexをresetすると勝手に列が出現する

(￣◇￣;)

```
df.reset_index(drop=False).head()
```

#マルチインデックスで行抽出

```
df.loc[pd.IndexSlice[3:4,], :]
```
pandasで連続値をカウントする

昨日書いた処理ににていますが、グループごとに連続する値をカウントしてみたいという要件があったとき、pandasには一発でやる機能がありません。
どのようにするか、stack overflowに答えがありましたが、２次的解説。

```Python
df = pd.DataFrame({'group' : [1,1,2,3,3,3,3,2,2,4,4,4] , 'value' : [1,2,1,1,3,2,4,2,1,3,2,1]} )

    group  value
0       1      1
1       1      2
2       2      1
3       3      1
4       3      3
5       3      2
6       3      4
7       2      2
8       2      1
9       4      3
10      4      2
11      4      1
```

# cumcountじゃね？

こういうデータに対して、cumcount()を使うと以下のようになってしまいます。

```Python
df['new'] = df.groupby('group').cumcount()

    group  value  new
0       1      1    0
1       1      2    1
2       2      1    0
3       3      1    0
4       3      3    1
5       3      2    2
6       3      4    3
7       2      2    1
8       2      1    2
9       4      3    0
10      4      2    1
11      4      1    2
```

これでいい場合もあると思いますが、group2を扱う際、連続するという条件を加味すると、これではまずいことがわかります。

# ちょっと気持ち悪いけど

so([Counting consecutive positive value in Python array](https://stackoverflow.com/questions/27626542/counting-consecutive-positive-value-in-python-array))に書いてあったのは、以下のようにshiftとcumsumを使う方法です。ちょっと回りくどい気もしますが、わかりやすいです。

例はarrayでという質問でしたが、この回答はpandas DataFrameかSeriesに対して有効です。
簡単にいうと、シーケンスの変わり目にフラグを立てて、cumsomで階段状の累積インデックスを振っていきます。これで元のグループ（要素）とは関係なく連続値を再グループ化できますので、groupbyしてcumcount()で終わり。

```Python
y = df['group']
df['new'] = y.groupby((y != y.shift()).cumsum()).cumcount() + 1

    group  value  new
0       1      1    1
1       1      2    2
2       2      1    1
3       3      1    1
4       3      3    2
5       3      2    3
6       3      4    4
7       2      2    1
8       2      1    2
9       4      3    1
10      4      2    2
11      4      1    3
```

groupbyする前にグループ化したりとか、少々二度手間感がありますが、そもそもやろうとしていることが違うので、そんなに無駄ではないでしょうね。
localの状態をremoteのレポジトリに反映させるコマンド(Mac・github)

# コマンドの意図
　以下のコマンドは、入力するだけで簡単にlocalの状態を反映するためのものである（.pklファイルを間違えて入れちゃったり、remoteのfileを削除したことを反映させたいときなどに使用できる）

# コマンド


```
git add -u
git commit -m "cleanup"
git push
```
# 参考資料

* [ローカルで実行したファイル削除を，GitHubに反映させる](http://core.hatenablog.jp/entry/2013/08/09/134511)
クラウドEAIサービス運営者から見るCDataの可能性

#自己紹介
双日システムズ株式会社の成塚健次と申します。2016年4月にクラウドEAIサービス「PolarisGate」を運営し、クラウド間のデータ連携に特化してサービス提供をしています。APIリファレンスを見るのが大好きで、いつもPostmanでAPIを叩いています。最近はまっているAPIはSharePoint。
[PolarisGateのページ](https://erp-jirei.jp/cloud_eai)


#CDataとの出会い
私がCDataに出会ったのは2016年12月。その機能にすっかり惚れ込み、1か月後には社内を説得してパートナーシップを締結していました。私が2016年の4月にPolarisGateを立ち上げてから、連携先のクラウドサービスを月に1件くらいのペースで開拓していました。お客様からの要望を受けてのものもあれば、マーケティング戦略による連携もありました。
CDataを採用するきっかけは、NetSuiteと勤怠管理システム間の連携案件の引合でした。**「クラウドのデータに、ODBCでアクセスできますよ」**とCDataの疋田さんから製品の話は聞いていましたが、ODBCが絡んだシステム開発で何度か痛い目を見てきた私は否定的な目でCDataを見ていました。とはいえ、NetSuiteの壁は高く、NetSuite社の協力も頂いて、APIリファレンスを元に連携を模索しましたが、認証を通るだけでもしんどいサービス。色々な策の1つとしてCDataの検証に着手しました。ODBCドライバをインストールして、**「アカウントID」**と**「ユーザID」**、**「パスワード」**、**「サンドボックスか否か」**を指定するだけでNetSuiteのオブジェクトの中身のデータが参照できました。
![capture01.png](https://qiita-image-store.s3.amazonaws.com/0/225307/415f752f-aea7-aaa3-5707-cf12aa729d30.png)


CDataを使う事を即決して、お客様にもデモを行ないました。お客様も即決。無事に受注することができ、CDataとのパートナーシップも締結しました。今では、NetSuiteだけでなくMarketoやSharePoint案件にもCDataを使っています。

 
#CDataのすごいところ
改めて書くまでもないかもしれませんが、EAIツールヘビーユーザーの観点からCDataのすごいところをまとめます。
###(1)認証の手間が非常に少ない(OAuth認証も楽)
EAI／ETLツールを利用してクラウドサービスにアクセスする際に、まずぶち当たる壁は認証です。OAuth認証のクラウドサービスですと、2，3往復の手続きが発生しますので、それだけで複雑なフローになりますCDataを使えば、パラメータのセットだけで対応ができますが、EAI／ETLツールはプログラミングにて対応せざるをえません。これだけでもCDataを使う理由になるのではないでしょうか。

###(2)クラウドサービスのデータをJSONやXMLではなくデータベースとして扱える
例えばデータ参照のAPIを叩いて、JSONのレスポンスデータが返ってくる場合、それらのデータ加工は結構面倒です。私の場合は、CSVや作業用のDBにデータを移して加工してしまいます(他に良い方法があれば教えてください)。リレーショナルDBで長年開発をしてきた人間としては、データ加工にあたりSQLで抽出、並び替え等ができるのは非常にありがたいことです。むしろ、大量のトランザクションデータを扱いたい場合、JSONやXMLで出力されても処理が非常に厄介です。


#EAI＋CDataのすごいところ
CDataを使って、クラウドサービスのデータの参照／登録・更新ができてしまえば、EAIツールを使って様々なことが実現できるようになります。
　**- スケジューラを使ってバッチ連携が可能**
　**- 複数のCDataドライバを用いて、クラウドサービス間の連携が可能**
　**‐ データを外部ファイルに出力が可能**
　**‐ 内部変数を使って計算や置換、文字コード変換が可能**
例えば、「**ERPの取引先マスタをCRMの取引先マスタに1日1回反映する**」ことや、「**1日分のTRデータをCSVに落としてAWSのS3に格納する**」といったことが自動で実現できるようになります。1対1の連携に限らず1対Nの連携もOKですので、お客様の数だけ、連携パターンがあります。


#まとめ
EAI／ETLツールの弱点は、**連携先とのインタフェース部分**にありました。各社はアダプタを作成し、連携先の豊富さで差別化を図っていましたが、開発・メンテナンスによる高価格化がネックで広く普及していませんでした。**CDataの出現により今までの常識は崩壊してきています**。実際に国内主要3社は2016年にEAIツールのクラウドサービス提供を開始して低価格路線、IoTやフィンテックといったテクノロジーへの特化を模索しています。今後、**MS-Flow**や**AWS Glue**の台頭によりさらに盛り上がり、**EAI／ETLツールはデファクトツールとなっていくと考えています**。今のうちからCDataとEAI／ETLツールに触れておいては如何でしょうか。
Google Home x IFTTT ｘ Google Calendarでタモリ倶楽部のリマインダーを作った話

#ご挨拶
どうも、Advent Calendar初投稿のForex Roboticsです。
[スマートスピーカーIFTTT大喜利Advent Calendar](https://qiita.com/advent-calendar/2017/ssifttt)２２日目ということで今回の記事を書かせていただきます。
いきなりですが、自分は学生の頃から「タモリ倶楽部」のファンで、タモさんと会うのを現世の最終目標としています。（笑）
Google Home x IFTTT連携とということで、今回はGoogle Calendarに「タモリ倶楽部」のリマインダーを作った話を書きたいと思います。
#タモリ倶楽部とは
[タモリ倶楽部](http://www.tv-asahi.co.jp/tamoriclub/)とは、昭和５７年からテレ朝系で関東では毎週土曜日0:20-0:50に現在放映しているテレビ番組です。
バラエティなのですが「これから笑わせるぞ！」という力の入り方はまったくなく、タモリ＋ゲストで基本毎回テーマが変わるゆるーい番組です。
空耳アワーはわりと有名ですが、鉄道、地形、仏像など、マニアックな内容をゆるく紹介しており、人生の1/3はタモリ倶楽部で学んだといっても過言ではありません。
ちなみにWikipediaの説明は[こんな感じ](https://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%A2%E3%83%AA%E5%80%B6%E6%A5%BD%E9%83%A8)。(と紹介しておいて読んでしまって、筆者はここで１時間経過しています)
#使い方
今回作ったのは、
・Google Homeに**「ねぇ、Google。タモリ倶楽部リマインドして」**というと
・**「わかりました。毎度おなじみ。流浪の番組。タモリ倶楽部をリマインドします。」**と毎度おなじみのセリフを言って
・Googleカレンダーに放映時間をイベント作成してくれる。
という**胸アツもの**レシピです。
普通に毎週イベント作成しておけばいいって？**Google Homeに「毎度おなじみ。流浪の番組、タモリ倶楽部」と言わせるのがポイント**なのです。
これによって**Google Homeへの親密度が200%アップ**します！

#IFTTTのコンフィグ
![config.jpg](https://qiita-image-store.s3.amazonaws.com/0/175066/e2c62dc4-6c8b-bc99-94aa-8a74b55c3df5.jpeg)
（モザイク部分はGoogleカレンダー名です）
Google Homeは**「Say a simple phrase」**で、Googleカレンダー側は**「Quick add event」**で作成しました。（detailではうまくいかなかったので）

#しかしそのままでは動かない
作成して何度か試してもどうしても指定した曜日にならず、設定した日の翌日の0:20に作成されてしまいます。
これにはハマりました。orz
何度か試しているうちにふと作成されたイベントのタイトルに目をやると「Tamori Club Saturday」に。
**「これは曜日を認識してない！」**と思い、Googleカレンダーの設定画面から**言語設定を英語に変更**することで、無事指定日時にイベント生成できました。
<img width="589" alt="cal1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/175066/c5349cf3-4615-d398-d59f-59ef85f37319.jpeg">
またデフォルトイベントの作成時間を1時間から３０分に変更することにより放映時間に対応しました。
<img width="588" alt="cal2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/175066/37167fd7-b82c-4cee-c945-17005f59ec28.jpeg">
#最後に
いかがでしたでしょうか？他にもいろいろ応用が利くと思うので試してみて下さい。
GoogleカレンダーのIFTTT連携は初めてだったので結構苦戦しました。
あとタモリ倶楽部の次回予告が最近ついたのですが、オープニングのゲストの並びでテーマを当てる特技を持つ私としては**次回予告反対派**です。

また弊社ではGoogle Home向けアプリ開発も行なっているので、お気軽にご相談ください！
http://forexrobotics.jp/news20171023.html

それではこの辺で！
gitで一部のcommitを抜きたい

PRしたときに、一部抜いてほしいと言われて操作してみました。

![git_modify.png](https://qiita-image-store.s3.amazonaws.com/0/104066/2fc5cc9d-fc18-7ce8-586e-c45e5c9033e3.png)

この図のbとdを抜いてみます。

まずeからブランチfを作ります。

```
% git branch f
```

aまで巻き戻します。

```
% git reset --hard <aのid>
```

cとeを反映します。

```
% git cherry-pick <cのid>
% git cherry-pick <eのid>
```

これでbとdが無い状態になりました。

他にも方法ありそうですが、とりあえず忘れないように。
Python の累算代入は演算してから代入しているのではない

# はまったこと

Python のコレクションの要素に累算代入演算子を使ったところ、想定外の動作をしたので、メモしておきます。

デフォルトの設定を保持する辞書 `default_settings` に追加の設定 `additional_settings` をマージしてから特定の設定をいじる処理をしていました。

```pycon
>>> # 以下の2変数は変更したくない（定数的なものを想定）
>>> default_settings = {'a': 1, 'b': [0, 1]}
>>> additional_settings = {'a': 10, 'c': 'hoge'}
>>> 
>>> settings = dict(default_settings, **additional_settings)
>>> settings
{'a': 10, 'b': [0, 1], 'c': 'hoge'}
>>> 
>>> # 'list' に 2, 3 を追加
>>> # default_settings が変更されたら困るので extend でなく、+ 演算子を使う
>>> settings['b'] += [2, 3]
>>> settngs  # こっちは OK
{'a': 10, 'b': [0, 1, 2, 3], 'c': 'hoge'}
>>> default_settings  # こっちは NG。なぜか 'b' が書き換っている!!
{'a': 1, 'b': [0, 1, 2, 3]}
```

# なぜそうなるか

[Python のドキュメント](https://docs.python.jp/3/reference/simple_stmts.html#augmented-assignment-statements)を見ると以下のように書いてあります。

> `x += 1` のような累算代入式は、 `x = x + 1` のように書き換えてほぼ同様の動作にできますが、厳密に等価にはなりません。累算代入の方では、 `x` は一度しか評価されません。また、実際の処理として、可能ならば インプレース (in-place) 演算が実行されます。これは、代入時に新たなオブジェクトを生成してターゲットに代入するのではなく、以前のオブジェクトの内容を変更するということです。

つまり、上の例ではあえて `extend` でなく `+` としたが、`+=` と書くと `+` ではなく `extend` と同じ動作をするということです。よって正しくは以下のようにしなくてはいけません。

```pycon
>>> default_settings = {'a': 1, 'b': [0, 1]}
>>> additional_settings = {'a': 10, 'c': 'hoge'}
>>> 
>>> settings = dict(default_settings, **additional_settings)
>>> settings
{'a': 10, 'b': [0, 1], 'c': 'hoge'}
>>> 
>>> settings['b'] = settings['b'] + [2, 3]
>>> settngs
{'a': 10, 'b': [0, 1, 2, 3], 'c': 'hoge'}
>>> default_settings
{'a': 1, 'b': [0, 1]}
```

何、その仕様？？？

ちなみに C, C++, Java, C#, Ruby などを調べましたが、こんな奇妙な仕様にはなっていないようです。（ただし、Ruby のメンバに対する `=` は代入（メンバへのバインド）ではなくメソッド呼び出しなので、Ruby だけちょっと事情が異なりますが。）
プラグインの質問やリクエストで覚えておきたいこと

ツクールMVに限らないのですが、プラグインのリクエストに際して気を付けた方がいいことをまとめます。

#共通
##終わったらお礼をする
一番大切です。
大事なことなので一番最初に持ってきました。
礼儀以上に**問題が解決したことを伝えるのが重要です**。
これがないと問題が解決したのか、解決ができずに諦めたのかがわかりません。

##スレッドを立てる前に検索する
プラグインの名前で検索すれば、ほとんどの場合でバグなどが見つかります。
リクエストの場合は、スレッドのタイトルを単語ごとに分けて検索すると見つかりやすいです。
これを忘れると回答者は心の中で「**ググレカス（ちゃんと検索しろ）**」と思います。
**回答が付かない場合、半分はググレカス案件です**。
一方で難易度が高い問題も回答者が付きません。
画面表示を大きく改造するようなのは難易度が高い傾向にあります。
WebGLに起因する問題もややこしいですね。

##自分で試行錯誤する
「**自分で試行錯誤してダメだった**」というのを経過とともに書き込みましょう。
試行錯誤の経過があると、具体的なアドバイスが出やすいです。
また、自分でやれる限りやってからだと回答者からの印象も良いです。

どういった言葉で検索したかも書いておきましょう。
そうすれば、次にどこを探せばいいかが見つかりやすいです。

##何がわからないかを言葉にしてみる・わかることだけでも言葉にしてみる
「何かわからないけど動きません」では何もわかりません。

サンプルデータを入れて動かすことはできたか、以前は動いたかなどの情報があると役に立ちます。
何でもいいので書いてみましょう。
少し文章が長くても、回答者はそこから必要な情報を見つけてくれます。

「何がわからないのかわからない」というパターンもありますが、その場合はわかることだけでも書きましょう。

##関連するプラグインへのリンクを張る
競合・バグ解決・リクエストのどの場合でも、関連プラグインへのリンクを張りましょう。
検索するのは割と手間です。

#質問・バグ解決依頼のとき

##自分で競合の原因を探る
[【RPGツクールMV】プラグイン利用者に向けた問題の切り分け方法](https://qiita.com/triacontane/items/2e227e5b5ce9503a2c30)の記事を参考に競合しているプラグインを探りましょう。
**これをプラグイン作者に丸投げするのは一番失礼です。**

##スタックトレースを用意する
エラーが発生したときにF8を押すとデベロッパーツール（開発用ツール）が出るので、これをalt+print screenで保存して貼り付けましょう。
**慣れた人であれば、スタックトレースだけでバグの解決手段を見つけます。**
**それぐらい強力な情報源です。**

#リクエストの時

##具体的な完成形を伝える
これはプロでも難しいところですが、頑張りましょう。
ABテストを用いるのも有効です。
ABテストとは自分がイメージしているものを二分法を使いつつ正解に近づく方法です。
例：自分がチャーハンをイメージしている時に「カレーとラーメンどっちが近い？」と聞かれたらご飯物ということでカレーと答える。

##画像で完成形を伝える
もう一つの方法は画像を使うことです。
メニュー画面などであれば、四角形の集まりで表現しても十分伝わります。


##他のゲームを例にイメージを伝える
比較的効果的です。
動画のURLも用意してあると好感度が高いです。

ただし、**自分のイメージと指定したゲームの動作が完全に一致するとは限りません**。
私は特定のゲームを例に出された場合はそのゲームの仕様を可能な限りコピーしますが、イメージの違いについては省略する傾向にあります。
そこまで対応すると疲れるので。


#守らないとどうなるの？
質問・リクエストで上記の内、いくつかが抜け落ちているぐらいなら未熟さゆえに許してもらえることはあります。
ただ、あまりにも酷いとプラグイン作者が酒の場で話のタネにするらしいですよ？
Reactで複数クラスを適用する方法

##複数classNameの適用
classnamesをインストール（react-starter-kitにはインストール済み）

```
yarn add classnames --save
```
classnamesをインポート

```
import ClassNames from 'classnames';
```

true,falseで適用するclassNameを決定

```
const classNames = ClassNames({
    [s.button]: true,
    [s.buttonColor]: this.state.isBlue,
    [s.buttonSize]: this.state.isBig,
});
```
ボタン押下で適用クラスが切り替えられるサンプル

```Home.js
import React from 'react';
import withStyles from 'isomorphic-style-loader/lib/withStyles';
import ClassNames from 'classnames';
import s from './Home.css';

class Home extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      isBlue: true,
      isBig: true,
    };
  }

  colorChange = () => {
    this.setState({ isBlue: !this.state.isBlue });
  };

  sizeChange = () => {
    this.setState({ isBig: !this.state.isBig });
  };

  render() {
    const classNames = ClassNames({
      [s.button]: true,
      [s.buttonColor]: this.state.isBlue,
      [s.buttonSize]: this.state.isBig,
    });

    return (
      <div className={s.root}>
        <input
          type={'button'}
          className={classNames}
          value={this.state.isBlue ? 'none' : 'blue'}
          onClick={() => this.colorChange()}
        />
        <input
          type={'button'}
          className={classNames}
          value={this.state.isBig ? 'small' : 'big'}
          onClick={() => this.sizeChange()}
        />
      </div>
    );
  }
}

export default withStyles(s)(Home);
```

```Home.css
.root {
  padding-left: 20px;
  padding-right: 20px;
}

.button {
  height: 30px;
  width: 60px;
}

.buttonColor {
  background: #6688ff;
}

.buttonSize {
  height: 60px; 
  width: 80px;
}
```
忘年会のゲーム用アプリを作って、使い捨てた

@kNagadou です。
この記事は[体育会系エンジニアアドベントカレンダー](https://qiita.com/advent-calendar/2017/athlete)の21日目です。

[筋肉エンジニアアドベントカレンダー](https://qiita.com/advent-calendar/2017/mdd)があることにも驚きですが、まさか[体育会系エンジニアアドベントカレンダー](https://qiita.com/advent-calendar/2017/athlete)まであるとは。

中学は**軟式野球**、
高校（高専）は**硬式野球**、
エンジニアとなってからは**草野球**と**筋トレ**に熱中しているので、
体育会系エンジニアでもある、と言って良いはず。これは記事を書かないわけにはいきません。

ということで、所属する草野球チームの忘年会幹事を任された際に、忘年会のゲーム用アプリを作った話をします。

# 2015年入部2年目、忘年会幹事を任される
忘年会日時とお店は即座に確定。
問題は、余興的なものをどうするか。
「プレゼント交換とか面白そうだよね」、という先輩部員の一言をそのまま取り入れ、
1人1500円以内のプレゼントを購入・持参してもらい、プレゼント交換をすることに決定。

しかし、普通にプレゼント交換するだけでは面白さに欠ける、と思い、
ゲームアプリを使って何かできないかと考え始めたわけです。
そして考えたのが、**ロシアンルーレット勝ち抜けプレゼント交換**。
ルールは、
1. 好きな数だけロシアンルーレットのカウントを増やして、次の人にパス。これを繰り返す。
2. カウント中に、外れカウントを引き当ててしまった人が負け。外れカウントを引かなかった直前の人が勝ち。

例）外れカウント8の場合
Aさん「1,2,3」
Bさん「4,5」←勝ち
Cさん「6,7,8」←負け

そういえば昔、**スマホを振って、ロシアンルーレットをカウントしていくiOSアプリ**があったな〜
それ使えばできそうだし、やるか〜😋

と、これで準備を全て終えたつもりでした。
目的のアプリをDLもしないまま。。。

# 結局アプリは見つからず、自作（忘年会当日）
忘年会当日、「あっ…そういえばiOSアプリDLしてない」と気づき、AppStoreを検索。
しかし、昔使ったことがあるような気がするアプリの名前なんて覚えているわけもなく。

「これは作ってしまったほうが早いか！？」
と焦った私は、忘年会まで残り５時間という状況でXCodeを立ち上げ、突貫工事で以下のアプリを作ったのでした。

## RouletteCounter
https://github.com/kNagadou/RouletteCounter

UIEventでiPhoneがシェイクされたのを検知してカウントアップ。
外れカウントに達したならAVAudioPlayerで音を鳴らす。
…だけのアプリ。
見てもらえばわかる通り、コードも少なく適当なヘボアプリです。
忘年会当日は一応役に立ちましたが、その後はリリースもせず放置、使い捨てアプリとなりました。。。

でもまあ、エンジニアなら、無いものは自分で作る、という意識は凄く重要だと思います。
結果ボツになっても、「とりあえず作ってみる」精神で今後もやっていこうと思います。

最後に、私が所属する**草野球団あしたば**を宣伝して終わります。

# [草野球団あしたば](http://ashitaba.sports.coocan.jp/index.html)とは
* 活動日
    * 毎週土曜日、時間帯はバラバラ
* 活動場所
    * 世田谷区中心
    * 二子玉川緑地や世田谷公園、羽根木公園、世田谷区立総合運動場が多め
    * その他都内、横浜周辺など
* メンバー
    * http://ashitaba.sports.coocan.jp/shoukai.html
* 絶賛、部員を募集中です。野球未経験者大歓迎です。特に細かい技術や戦略は求めず、ゆるい感じですが、毎週活動するためのチームルールは徹底されているので参加しやすいです。
    * https://ws.formzu.net/fgen/S65125791/
SORACOM Funnel で IMEIやIMSI(といったヘッダ情報)を付けずにそのままデータを流す方法 (AWS IoT使う)


## ソラコムサンタが街にやってくる

[#ソラコムサンタ](https://twitter.com/search?f=tweets&vertical=default&q=%23%E3%82%BD%E3%83%A9%E3%82%B3%E3%83%A0%E3%82%B5%E3%83%B3%E3%82%BF&src=typd) という、ハッシュタグ **#ソラコムサンタ** をつけると、もしかすると実装されるかも！という、なんともユルい企画がございます

さすがに12月なのでどんなお願いが来てるのかをチョット見たところ、気になる #ソラコムサンタ を見つけました

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Funnelで、IMEIやIMSIを付けずにそのままデータを受け流すオプションがほしい！なにとぞ！<a href="https://twitter.com/hashtag/%E3%82%BD%E3%83%A9%E3%82%B3%E3%83%A0%E3%82%B5%E3%83%B3%E3%82%BF?src=hash&amp;ref_src=twsrc%5Etfw">#ソラコムサンタ</a></p>&mdash; Keita Mohri (@ktam1219) <a href="https://twitter.com/ktam1219/status/918770261758853120?ref_src=twsrc%5Etfw">2017年10月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

確かに。

## どういうお願い？

[SORACOM Funnel](https://soracom.jp/services/funnel/) というクラウドアダプタサービスがあります。
最小構成だと４つくらいのパラメータを設定してもらうだけで AWS IoT や Azure Event hubs にデータを送れるようになるというサービスです。

実際に SORACOM Funnel を設定して、デバイスから下記のように送ってみます

```console

curl -H "Content-Type: application/json" -d '{"my_name": "is max!!", "old": 39}' funnel.soracom.io
```

するとクラウドサービス側では、こんなJSONで受け取ることになるのです

```json:AWSIoTで受けた場合の例
{
  "operatorId": "OP0099999911",
  "timestamp": 1513816876880,
  "destination": {
    "resourceUrl": "https://AWSIOT-ENDPOINT.iot.us-west-2.amazonaws.com/rawdata/#{imsi}",
    "service": "aws-iot",
    "provider": "aws"
  },
  "credentialsId": "awsiot-dataaccess0",
  "payloads": {
    "my_name": "is max!!",
    "old": 39
  },
  "imei": "359999999999991",
  "sourceProtocol": "http",
  "imsi": "449999999999993"
}
```

デバイス側から送ったデータが `payloads` というキーに押し込まれて、その他便利に使ってもらえる付帯情報がくっつくフォーマットです
一見便利そうなのですが、このJSONを例えば Amazon Elasticsearch Service へ流したりすると、データの加工のひと手間が必要だったりと、逆に面倒ということもあるので「付帯情報をつけないオプションって無いのかなー？」というお願いということで理解しました！

## ソラコムサンタの代わりにお届け（限定的ですが）

AWS IoTを使うということになりますが、論よりコード
AWS IoT のルール (今はACTって名称になりましたね) で、こんな感じに設定してみてください

```sql
SELECT payloads.* FROM 'rawdata/#'
```

**payloads.***が肝です。これで「payloadsの中身を取り出す」という宣言になります
すると `rawdata/` トピックに投げられたJSONは、下記のように再構成されます

```json
{
  "my_name": "is max!!",
  "old": 39
}
```

## でも、困るような気が。

データ内に識別できる情報が抜けてしまっていて、どのデバイスからのデータかわからなくなってしまうと思います
そのため、例えば IMSI (International Mobile Subscriber Identity) を加える場合は、こんな感じになります

```sql
SELECT payloads.*, imsi FROM 'rawdata/#'
```

**imsi**がポイントです。下記のように取り込まれます

```json
{
  "my_name": "is max!!",
  "old": 39,
  "imsi": "449999999999993"
}
```

## おわりに

どうでしょう？お届けに足りる内容であればうれしいです！
『Wireshark』を一晩だけ触ってみた話

##なぜ勉強しようと思ったか
ネットワークを流れてるパケットを傍受してみたかった。
ただの興味本位。

以下、ほぼ備忘録なので、参考にならないかと思いますが、悪しからず、、、。

##Wiresharkとは
パケットキャプチャを行うツール

###パケットキャプチャとは
> パケットキャプチャとは、ネットワーク上で実際に流れるトラフィックのパケットを採取することです。
> [ネットワークエンジニアとして - Packet Capture](http://www.infraexpert.com/study/span.htm)

##インストール手順
以下を参照
[Wiresharkの使い方](http://beginners-network.com/wireshark.html)

インストールしていると、WinPcapやUBSPcapをインストールするかという手順が出てきます。
WinPcapは必須として、UBSPcapも入れておきましょう。

###pcapとは
> pcap (packet capture) とは、コンピュータネットワーク管理の分野におけるパケットスニファのためのAPIである。
> Unix系のシステムではpcapはlibpcapとして実装されている。
> WindowsではWinPcapというlibpcapを移植したものが使われている。
> [Wikipedia - pcap](https://ja.wikipedia.org/wiki/Pcap)

##「表示フィルタ」と「キャプチャフィルタ」
フィルタにも種類があって、上記の２種類があるっぽい。

###表示フィルタ
- IPアドレス
	- 送信元IP
		- `ip.src==xxx.xxx.xxx.xxx`
	- 宛先IP
		- `ip.dst==xxx.xxx.xxx.xxx`
	- 双方向(送信元/宛先どちらも)
		- `ip.addr==xxx.xxx.xxx.xxx`
- ポート番号
	- TCP
		- `tcp.port==xxx`
	- UDP
		- `udp.port==xxx`
- プロトコル
	- `xxxx(icmpなど)`

###キャプチャフィルタ
- IPアドレス
	- 送信元IP
		- `ip src host xxx.xxx.xxx.xxx`
	- 宛先IP
		- `ip dst host xxx.xxx.xxx.xxx`
	- 双方向(送信元/宛先どちらも)
		- `host xxx.xxx.xxx.xxx`
- ポート番号
	- TCP
		- `tcp port xxx`
	- UDP
		- `udp port xxx`
- プロトコル
	- `xxxx(icmpなど)`

###ちょっと似てるけど、ちょっと似てない、それが可愛いフィルター機能
いや、可愛くない。
ドットとイコールくらいかな。

##パケット一覧の見方
以下を参照。
[Wiresharkを使った解析](http://beginners-network.com/wireshark_analyze.html)

- ARP
	- 接続されてるルータのMACアドレス取得
	- (ARPは、IPアドレスからMACアドレスを引くためのプロトコル)
- DNSでルータに接続先のIPアドレス持ってるか聞く
	- (DNSは、ドメイン名からIPアドレスを引くためのプロトコル。これが正引き。逆も出来る(=逆引き))
- TCP(接続確立)
	- 3WAYハンドシェイクで、接続先との接続確立
- HTTP
	- やっとデータ送るよ
- TCP(データ受信)
	- 接続先からPDUを受け取る
	- 一定数受け取ったら接続先にACKを返す
		- これを繰り返していく
- TCP(接続終了)
	- 接続先にFIN,ACKを送信
	- 接続先からACKを受信
	- 接続先からFIN,ACKを受信
	- 接続先にACKを送信
		- お互いに同じパケット送りあって終了を伝え合う、可愛い

他にもいろんな通信してるから見てみてね。

##パケット詳細部の見方

以下は、TCPの通信の場合の詳細部。
HTTPとかARPとかで違ってくるので、その辺は随時調べましょう。(「{プロトコル名} フレーム」で検索するといいかも)

- Frame
	- サーっと調べたけど、イマイチ分からず、、、。
	- 使い込んでて何か、見つけたら編集します
	- ちなみに、一覧部の色がどういう理由でその色なのか、みたいな情報はここで見れる
- Ethernet II
	- 物理ケーブルを流れてるパケットの情報
	- 無線LANの場合は物理ではないけども
	- [詳細](http://www.infraexpert.com/study/ethernet4.html)
- Internet Protocol Version 4
	- IPヘッダ情報
	- [詳細](http://beginners-network.com/packet.html#header)
- Transmission Control Protocol
	- TCPヘッダ情報
	- [詳細](http://beginners-network.com/tcp_udp.html#tcp)

接続先のMACアドレスが取れれば、逆引きしてIPアドレスも取れるかもしれないし、
パケット内容が見れちゃったら、パスワードクラックだって(ダメです)
ライセンスの分類についてざっくり説明

オープンソースのライブラリーなどを当たり前のようにつかっています。トップページによく```Released under the MIT License (see LICENSE file)```のような記載があります、つまりこのライブラリーの使用と再配布などはこのライセンスに従ってくださいと言ってます。

？？？MIT、BSD、GNU？？？ワカリマセン

ではざっくりライセンスを分類してライセンスの違いを勉強しましょう。
##Copyright
コピーライト•著作権、知的財産権と呼ぶ場合もあります。これは許諾なく再配布などしたら裁判沙汰になります。そもそもオープンソースでオープンにする時この類のライセンスはあまり使いません。

##Copyleft
上のCopyrightに反発して生まれるライセンスカテゴリーです。CopyrightはCopy（複製、再配布）+Right（権利、右の意味も有り）を合わした造語です。Copyrightに制限されて知識をシェアできなくて困っていた人たちはCopyleftライセンスを作りました。CopyleftはCopy+Left（左）だから、Copyrightライセンスとは逆の方向を目指しています。<font color="red">Copyleftライセンスのソースコードは再配布する時もCopyleftライセンス（普通はソース無償公開など条約有り）を使用するよう求めます。</font>
例：　GNU GPL（GPL）ライセンス

##Copycenter
またはPermissive、BSD-likeライセンスと呼びます。
CopyrightとCopyleftライセンスとも違う、間（Center）に立つ種類です。再配布する時の
ライセンスを制限しません。一番自由なライセンス種類です。
例：MITライセンス、BSDライセンス
AWSCLIのログイン



案件でdockerを使ってる時のお話です。

新人エンジニア、未経験エンジニアとして入って
AWS CLIでログインしてimage取れるようにしてとか言われてもよくわかりませんよね。

質問しても、調べれば出てくるよ(そう言われればそうなんですが)。と言われ以降質問しずらくなる。よくある光景です。

さてそんな人たちのために（お前しかいねえよ）
AWSCLIでimageを取ってこれるようなコマンドを簡単にまとめました。

まずはprofileを作成します。一応profile名はなくてもいいオプションになってはいるんですが、案件一つなんて個人でやってないかぎりはありえないと思うので、案件ごとにprofileを作ったほうが便利です。

```bash:ターミナル
$ aws configure --profile profile名

AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]: json
```

それが終わったら以下のコマンドを打ちます。

```bash:ターミナル
$ $(aws ecr get-login --no-include-email --profile profile名)
```

※コメントでご指摘頂きまして、「$()」をで囲むとログインまで自動で行ってくれます！
そうすると、ズラ～っとターミナルに文字が出てきます。
それを全部コピって再度ターミナルでエンターを押します。


そうするとawsからimageをpull出来るようになります。


##おまけ
rootディレクトリで

```bash:ターミナル
$ cat .aws/config #登録されているprofile一覧
$ cat .aws/credentials #登録されているprofileのaccesskeyやsecretkeyが見れる
```
/username/.aws
にconfigとcredentialsが存在しているので直接書き換えることも可能。

参照
profile作成
http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html
awsgetlogin
http://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ECR_AWSCLI.html
GNU coreutils > cp > symbolic linkとなっているディレクトリを通常ディレクトリとしてコピー > cp -Lr srcdir dstdir

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.9を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU coreutils 8.4
```

### 処理とコマンド

- srcdirというディレクトリがsymbolic link
- dstdirという通常ディレクトリとしてコピーしたい

参考: https://superuser.com/questions/216919/how-to-copy-symlinks-to-target-as-normal-folders

```bash
$cp -Lr srcdir dstdir
```

### man

```
       -L, --dereference
              always follow symbolic links in SOURCE
```

### 記憶の宮殿

https://ja.wikipedia.org/wiki/L%E2%87%94R
> L⇔R（エルアール）は、日本の音楽バンド。

KNOCKIN' ON YOUR DOORのサビを頭に思い浮かべながら作業する。

### explainshell.com

https://explainshell.com/explain?cmd=cp+-Lr
AndroidStudio 3.0.1 のビルドエラーについて

AndroidStudioが3.0.1に上がった際に過去のプロジェクトをビルドするとエラーが発生した。
その時の対処メモを残す。

# エラー

```
Error:Unsupported method: BaseConfig.getApplicationIdSuffix().
The version of Gradle you connect to does not support that method.
To resolve the problem you can change/upgrade the target version of Gradle you connect to.
Alternatively, you can ignore this exception and read other information from the model.
```

Gradleがバージョンが合わないのが原因。

File -> Project Structure -> Project 

から Gradle のバージョンを変更する。


![project-gradle.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/bbde42b9-ee71-6868-45a7-095ff7c00448.png)

Gradle と Android Plugin のバージョンの組み合わせはこれを参考にする。
Android Studio 3.0 からは Gradle 3.3 以上を指定する必要がある。

![gradle.png](https://qiita-image-store.s3.amazonaws.com/0/112253/c507e4ce-4318-9623-73f3-0194a538e973.png)

変更後にビルドを行うと以下のエラーが発生する。

```
Warning:The specified Android SDK Build Tools version (22.0.1) is ignored,
as it is below the minimum supported version (26.0.2) for Android Gradle Plugin 3.0.1.
Android SDK Build Tools 26.0.2 will be used.
To suppress this warning, remove "buildToolsVersion '22.0.1'" from your build.
gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
```

現在の buildToolsVersion が (22.0.1) なので最低でも (26.0.2) に変更しろと言わているのでその通りに変更する。

```
apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"

    defaultConfig {
        applicationId "screencapture.sample.techbooster.org.screencapture"
        minSdkVersion 22
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
```

必要があればこちらも参照
 http://k-hiura.cocolog-nifty.com/blog/2017/11/androidstudio30.html
【Laravel】whereRawを使って、DBの情報を置換して検索する。

##■やりたかったこと
###前提
1.DBに格納されている社員名の苗字と名前の間に全角スペースがあるのとないのが存在している。
2.検索をかける社員名は別のtableからとっていて、苗字と名前の間にスペースはない。
3.[1,2]より、DBの社員名の全角スペースを削除して[2]の値と比較をしたい。
4.[2]をひとつずつ引数にして、[1]から検索を行う。

###mysqlで書くなら
![スクリーンショット 2017-12-21 9.50.58.png](https://qiita-image-store.s3.amazonaws.com/0/174991/5f225f8e-76f9-2da1-2ed4-746c531b9673.png)
たぶんこんな感じで取れる。

###Laravelで書きたい&クロージャーはごちゃるので嫌だ！
以下のwhereRawというbuilderがあったので使うことにした。
![スクリーンショット 2017-12-21 10.15.27.png](https://qiita-image-store.s3.amazonaws.com/0/174991/38bcaadf-5eb1-b731-aa87-8a74710446d8.png)

##■解決策
![スクリーンショット 2017-12-21 10.41.23.png](https://qiita-image-store.s3.amazonaws.com/0/174991/30a810e6-f700-a4cd-1f57-6e9050d6faba.png)
この[?]に気づくまでに時間かかりました。第二引数には、変数の場合は配列にkeyなしでひたすら入れていけばいい感じです。裏側で配列にキャストしているので、変数が一つだったらそのままぶちこんでも大丈夫っぽいですね。
Raspi３とWebカメラでストリーミング試したい


## SETUP
[Raspberry Pi 3 初期セットアップ（Mac 用）](https://qiita.com/knyrc/items/d27cd0d8a78138de6b58)
とか
[Raspberry Piをモニタ等無しでMacから使えるようにする方法](http://labs.torques.jp/2014/08/17/3684/)
を参考にWifi経由でラズパイにSSH接続できるようにする。

## uv4lのインストール
使っているraspiのOSのバージョンをしっかり確認する。
stretchか、jessieか、wezzyかようわからんけど、自分の場合はstretchだったので、以下を参考にapt-getで必要そうなライブラリをインスコ！

http://blog.cudmore.io/post/2016/06/05/uv4l-on-Raspberry-Pi/

`sudo apt-get install uv4l uv4l-webrtc uv4l-uvc uv4l-xscreen uv4l-dummy`

## Webカメラ起動
[Raspberry Pi3にuv4l-webrtcをインストールして接続してみる。](https://qiita.com/t_furu/items/d31dfa5e4c0881383ea5)
を参考にカメラを起動して、手順通りWebにアクセスするとVoila !!

![](https://media.giphy.com/media/xT77XFY9Kpo5HkQTUk/giphy.gif)
Cloud9で「lambda_function.lambda_handler timed out after 3 seconds」errorが発生する。

# 問題

Cloud9実行時にlambdaの実行時間を設定しているにも関わらず、timed out after 3 secondsと言われてしまう。

# 解決方法

Cloud9の設定を見直しましょう。(lambdaとは別に設定が存在します。)

## 手順

Cloud9右側"AWS Resource"タブ→"Local Function"→lambda関数名を右クリック→"Edit Config"→"Timeout"の値を適切に設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22247/6fca268b-d870-c82d-dbb3-e46758ae2ae8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22247/4aebc954-8859-fc7d-3b6a-9683ef8f8f9d.png)


## 注意

lambda側(デプロイ後に実行する環境)で設定した値とは異なります。
ここで最長の5分に設定していても、Cloud9側では短い値が設定されていればTime outしてしまうので注意してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22247/8757ccce-85c7-31af-215f-0c8ef077f12f.png)

## マニュアル

Editがあるという事はDocumentにしっかり書いてあります。
ちゃんと読みましょうという気付きを我々はあと何回学べば良いのでしょうか……。

http://docs.aws.amazon.com/cloud9/latest/user-guide/lambda-functions.html#lambda-functions-update-settings

# 経緯

RDSへのInsert処理を実装中に動いたり動かなかったりして困ってました。
lambdaのTimeout時間はしっかり伸ばしてあるのに……と思い込んで上記設定になかなか気付きませんでした。
go-ethreum vs Parity

# 結論から言うと
推しEthereumクライアントは~~Parity~~go-ethereum(以下geth)([鞍替えしました](https://speakerdeck.com/akira_taniguchi/pycon-mini-osaka-fa-biao-zi-liao-ethereum?slide=71))。
理由は初期環境構築速度が早いから。
時間がある人は続きをどうぞ。

# はじめに
色々あって全く時間が取れず、情報の量と質が著しく低いこのページを許してください。
Ethreumのクライアントとして名高いgethとParity、両方触る機会があったので、所感を書くことにしました。
忙しい人のために結論を最初に書いておきました。5秒で読めると思います。以下理由。

# 理由
##その1：Parityの方がブロックデータを構築するのが早い
gethでブロック情報を0から構築する場合、fastオプションをつけても3日かかりましたが、Parityは1日もかからず構築できていました。
Parityはどうやらどこぞにブロック情報がまとめてアップロードされていて、それをパッと持ってくる感じらしいです。
色々忙しい中、この初動の速さはかなり評価できるかと。

##その2：Parityの方がRPCが安定しているような気がする
gethもParityもhttpやWebSocketのRPCが存在します。
ユーザはこれらを利用してEthereumのブロック情報を解析したり、トランザクションを発行したりします。
gethよりParityの方が早くて安定していた気がします。ただそんな気がしただけ、タイミングとかも合ったかもしれません。
数字なんてもちろんとってないです。Rustのなせる技ですかねぇ。Rust万歳。

#最後に
その2はぶっちゃけ微々たるもので、もうその１だけが理由だったりする。ParityはWebベースのUIもあるけど、ぜんぜん使ってません。
ただエンジニアとして使ってみた感じ、gethよりParityの方が今後も使っていきたいと言う感覚を得ることができたというのを共有します。
es6での変数の値入れ替え

変数の値入れ替え。忘れないようにメモ。


```js:es5

var a = 1;
var b = 2;

var tmp = a;
a = b;
b = tmp;
// => a: 2, b: 1
```


```js:es6
let a = 1;
let b = 2;
[b, a] = [a, b];
// => a: 2, b: 1
```


配列の分割代入を利用する。
なぜいま一時的セキュリティ認証情報が必要なのか

トリの豚ですが、二日目が空いていると締まらないので本人の許可なく勝手に埋めさせてもらうこととする。
勢いで書いた文章のため、短文かつ内容は薄い。主張したいことは簡潔である。

# はじめに

昨今のサーバレスアーキテクチャの趨勢に考えを及ぼすと、不特定多数のエンドユーザーがクラウド上のリソースに対して直接的にアクセスするアーキテクチャについても、視野に入れていかねばならなくなるであろう。

クラウド上のリソースとは、例えるならAWSにおけるS3やGoogle Cloud Storage、その他様々な情報を配信するマネージド・サービスを指すこととする。
そして、その際に前提として考えなければならないのは、そのエンドユーザーが真にそのリソースにアクセスする権限を有するかどうか、という点である。

# AWSの場合

AWSはこの課題に対し、AWS STS(Security Token Service)という形で解決策を提示している。
STSを用いることで、ある特定のリソースに一時的に有効な、特定のアクションを実行する権限を、一時的な認証情報という形でエンドユーザーに払い出すことができる。
詳細な説明はAWSの公式ページに譲るとして、早い話が動的にIAM credentialsをリクエスト単位で生成できるようなものである。

>一時的セキュリティ認証情報は、その名前が示す通り、使用期限が短くなっています。有効期限は数分から数時間に設定できます。認証情報が失効すると、AWS はそれらを認識しなくなります。また、その認証情報によって作成された API リクエストによるあらゆるタイプのアクセスが許可されなくなります。
一時的セキュリティ認証情報はユーザーとともに保存されることはなく、ユーザーのリクエストに応じて動的に生成され、提供されます。一時的セキュリティ認証情報が失効すると（または失効する前でも）、ユーザーは新しい認証情報をリクエストできます。ただし、リクエストするユーザーがまだその権限を持っている場合に限ります。

参考: http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html

# GCPの場合

まだ解決策はない。なんとかしてほしい。

# おわりに

かつての苦しみはどこへやら、クラウドを採用することで僅かな工数でサービスが出来上がる。といった未来はまだ訪れていないが、ビジネスにおける本質的な価値の追究に、エンジニアはそのリソースを集中させることができるようになってきた。
同時にクラウドサービスが勢いを増し、その選択肢が多岐にわたる中で、自らが所属する組織、ないしは状況に応じて適切な解を導き出すのもまた至難である。
本稿を例にとっても、一つの技術要素の有無によって、取るべき選択は変わってくる。エンジニアはエンジニアリングによって価値を追究すべきであり、独りよがりにそれを追究するのではなく、ビジネスの内容も踏まえて適切な判断が下せるよう、努力していきましょう。
Twitter の特定ユーザーのツイートを取得

特定ユーザーのツイートを取得する方法です。
API名は、user_timeline ですが、特定ユーザーのツイートを取得できます。

参考情報
[GET statuses/user_timeline - ユーザータイムラインを取得する](https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/user_timeline/)

```py:get_tweet.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	get_tweet.py
#
#						Dec/21/2017
# --------------------------------------------------------------------
import sys
import json
import oauth2 as oauth
#
from define_client import define_client_proc
# --------------------------------------------------------------------
# [8]:
def get_tweets_proc(client,user_id):
	nnx = 10
	url_base = "https://api.twitter.com/1.1/statuses/user_timeline.json?user_id="
	url = url_base + user_id + "&count=" + str(nnx)
	array_aa = []
	response, data = client.request(url)
	if response.status == 200:
		json_str = data.decode('utf-8')
#		print(json_str)
		array_aa = json.loads(json_str)
		sys.stderr.write("len(array_aa) = %d\n" % len(array_aa))
#
	else:
		sys.stderr.write("*** error *** get_ids_proc ***\n")
		sys.stderr.write("Error: %d\n" % response.status)
#
	return	array_aa
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
user_id = "276219120"
#
client = define_client_proc()
#
array_aa = get_tweets_proc(client,user_id)
#
sys.stderr.write("len(array_aa) = %d\n" % len(array_aa))
#
for unit_aa in array_aa:
	print (unit_aa['created_at'])
	print (unit_aa['id'])
	print (unit_aa['text'])
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

```py:define_client.py
# --------------------------------------------------------------------
#	define_client.py
#
#					Apr/26/2019
# --------------------------------------------------------------------
import os
from dotenv import load_dotenv
from requests_oauthlib import OAuth1Session
import oauth2 as oauth
# --------------------------------------------------------------------
def define_client_proc():
	dotenv_path = '.env'
	load_dotenv(dotenv_path)
	CONSUMER_KEY = os.environ.get("CONSUMER_KEY")
	CONSUMER_SECRET = os.environ.get("CONSUMER_SECRET")
	ACCESS_TOKEN = os.environ.get("ACCESS_TOKEN")
	ACCESS_TOKEN_SECRET = os.environ.get("ACCESS_TOKEN_SECRET")
#
	consumer = oauth.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
	access_token = oauth.Token(key=ACCESS_TOKEN, secret=ACCESS_TOKEN_SECRET)
	client = oauth.Client(consumer, access_token)
#
	return client
# --------------------------------------------------------------------
```

```text:.env
CONSUMER_KEY = '******'
CONSUMER_SECRET = '******'
ACCESS_TOKEN = '******'
ACCESS_TOKEN_SECRET = '******'
```

Arch Linux でのライブラリーのインストール

```bash
sudo pip install oauth2
```