OmniAICreator/Qiita-1.07M huggingface dataset:
「マカフィー スモール ビジネス セキュリティ」は黙って防ぐ

## ウィルス対策には誤検知が付き物だが、黙って防ぐのはよくない

ウィルス対策ソフトウェアに誤検知は付き物です。悪意あるファイルを100%防ぐ事ができないことと同じように、正常なファイルを100%防がない事もできません。見逃してしまうファイルを少なくするために、誤検知率が多少高くなってしまっても、それは仕方が無いことだと思います。

そう、誤検知によって、正常なファイルの実行や処理が防がれること自体は問題ありません。しかし、その防いだと言うことを知らせないことは問題と考えています。もし、あるソフトウェアにおけるなんらかの処理にエラーが発生したとき、それが、そのソフトウェアの不具合によるエラーなのか、誤検知によって防がれたことで発生したエラーなのかを区別することは重要です。もし、ウィルス対策ソフトが防いだことを教えてくれたのであれば、正式なファイルであることを確認した後、ウィルス対策ソフトの無効化や除外をすればいいだけです。しかし、防いだことを教えてくれなかった場合、たいていの場合はソフトウェア自体の不具合を疑います。ソフトウェアの不具合を調べるには、設定の見直し、ログの確認、類似の現象がIssuesに上がっていないかの確認や、サポートへの問いあわせ、等の多くの苦労が必要とします。全てが正常のはずであると確認して、初めてウィルス対策ソフトを疑うのです。なぜなら、ウィルス対策ソフトを無効にするというのは、脆弱な穴を開けることになるため、最終手段になるからです。

つまり、「黙って防ぐ」というウィルス対策ソフトほど使いにくい物は無いと言うことです。

## 「マカフィー スモール ビジネス セキュリティ」というもの

新しいWindowsパソコンを買ったときにウィルス対策ソフト[^1]の利用権[^2]が付いてくる場合があります。メーカーによって何が付いてくるかは異なりますが、その中に「マカフィー スモール ビジネス セキュリティ」(以下、マカフィー)があります。パッケージがピーター・ノートンの写真だったころからのノートン先生愛用者である私ですが、この前買ったパソコンにこのマカフィーがバンドルされていましたので、物は試しにマカフィーをそのまま使ってみることにしました。ここ2ヶ月ほど使ってみましたが、**本日アンインストールすることを決意しました**。はっきり言って、Windows Defenderの方がましだからです[^3]。

このマカフィーですが、「黙って防ぐ」という誤検知が2件発生しました(後述)。もしかしたら、それ以上発生していた可能性もありますが、通知しないばかりでは無く、**履歴にすら残っていない**ため、本当のところはわかりません。しかし、いずれも開発環境としては重要なソフトウェアのインストール時に発生したため、今後も発生する可能性が高いことを考えると、使用し続けるとは難しいです。1年間の使用権があったため、あと10ヶ月ほどは使えるのですが、10ヶ月も使い続ける方が苦痛です。

## 「マカフィー スモール ビジネス セキュリティ」が邪魔する処理

いずれも、リアルタイムスキャンを無効にすると正常にできることを確認しています。有効の時は失敗しますが、マカフィーは通知もしませんし、セキュリティ履歴にも何もありません。

「マカフィー スモール ビジネス セキュリティ」のバージョンは16.0.1です。バージョンが変われば違ってくるかも知れません。

### VirtualBox Extension Pack のインストールが失敗

個人で買って使っているパソコンなので、Oracle VM VirtualBoxにはOracle VM VirtualBox Extension Packを入れています。このExtension Packを入れようとすると、マカフィーが有効のままでは失敗します。

### Git for Windows を Chocolatey でインストールが失敗

Visual Studio Installerで入るGit for Windowsのバージョンが古かったので、Chocolateyで入れることにしました。Chocolateyで入れるために、`cinst git.install`を実施しましたが、マカフィーが有効のままでは失敗します。Chocolateyのログにはアクセスエラーとだけあります。

## もしかしてバグではないのか？

誤検知で防いだのでは無く、ウィルス対策ソフトウェアの不具合により、ファイルシステムへのアクセス等が正常できなくなった可能性があるかも知れません。そうであれば、もっと最悪です。気付かないうちに色々壊れていたかも知れないとすると、軒並みインストールし直しとかを考える必要がありそうです。

少なくとも、開発環境ではこのような動作をするウィルス対策ソフトは使用しない方が良いでしょう。最悪なのは、ソフトウェアの開発中に発生した場合です。ソフトウェアのバグなのかどうかを判断することが難しく、余計な苦労をすることになるでしょう。また、利用者から原因不明なバグ発生の報告があった場合、その利用者がこのようなウィルス対策ソフトを使用しているなら、無効またはアンインストールしてから使用を試して貰うように言ってみると良いでしょう。ウィルス対策ソフトから通知がなく、セキュリティ履歴も無い場合でも、ウィルス対策ソフトが原因の可能性があります。

## 他のウィルス対策ソフトでは発生しないのか？

**わかりません。**ノートンでは発生した記憶がありませんが、偶々かも知れません。Windows Defenderでも発生する可能性はあります。また、同じマカフィーでも、別の製品では動作が異なる可能性があります。もし、上のような現象が他にもあったことがあれば、コメント等で報告して貰えると嬉しいです。

[^1]: ここで述べているのは、Windows 10標準のWindows Defender以外のウィルス対策ソフトのことです。これらはバンドル版と言われる特殊なエディションである場合も多く、通常の製品版とは少し異なる場合があります。
[^2]: 1～3ヶ月といった試用版もあれば、1年間使えるものもあります。
[^3]: と言っても、ノートン先生の使用権が1個あまっているので、そちらを使う予定ですが。
TeamViewer for Raspberry Pi（Raspbian, Jessie）

テスト版だった [RaspberryPi 用の Teamviewer V.11](https://blog.keinos.com/20161118_1899) が、Ver.12（2017年５月）から正式にRaspbian（Jessie）対応になっていました。

- How to install TeamViewer Host for Linux <br>https://community.teamviewer.com/t5/Knowledge-Base/How-to-install-TeamViewer-Host-for-Linux/ta-p/6318

ここではラズパイ（Raspbian）を中心に抜粋・翻訳した内容を記載します。また、実際の検証を行ってみて、何かあれば追記して行きたいと思います。

# ライセンス
- Linuxユーザーに限らず[個人利用は無料、企業での利用は有料](https://www.teamviewer.com/ja/pricing/)

# システム要件
##OS
- Debian >=8 (Jessie)<br>（[Qt](https://ja.wikipedia.org/wiki/Qt) >= 5.2, カーネル >= 2.6.27, [GLIBC](https://ja.wikipedia.org/wiki/GNU_C%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA) >= 2.17）

##ハードウェア 
- armv7 32bit: ramv7 hardfloat（Raspberry Pi >= 2+）

# 対応パッケージ
- ARMパッケージ

# TeamViewer Host（サーバー・アプリ）のインストール

以下のいずれか。

  - パッケージをデスクトップ上でダブルクリック
  - コマンドラインで以下を実行<br>`apt install ./teamviewer_12.0.xxxxx_yyy.deb`

## 注意点

TeamviewerとTeamviewer-host（クライアントとサーバー）は併用できません。

## SSH接続でインストールした場合
SSH接続でコマンド・ラインからインストールした後に、モニタが接続・認識されていない場合やXサーバーが実行されていない場合など（Teamviewerがヘッドレス・モードで動作している場合）には、接続IDやパスワードなどの確認が別途必要です。

コマンド・ラインからパスワードを設定してTeamViewerの接続IDを取得できますが、デバイス（RaspberryPi）をTeamviewアカウントに紐づけるためにセットアップを行うことを推奨します。

```bash
teamviewer help
teamviewer setup
```

## アップデートについて

インストール中にTeamviewerのリポジトリがシステムに追加されます。
そのため、システムのアップデートを行えば自動的にTeamviewerのアップデートも一緒に行われます。

### リポジトリ情報

TeamViewerはリポジトリ情報を含んだファイル `/apt/sources.list.d/teamviewer.list` を追加します。

同時に信用できるリポジトリとして、リポジトリの著名鍵をシステムに登録します。

手動で`teamviewer.list`の追加と著名鍵のリポジトリ登録を行いたい場合は以下のコマンドで行えます。

```bash
wget -O - https://download.teamviewer.com/download/linux/signature/TeamViewer2017.asc | apt-key add -
```

上記コマンドでリポジトリ情報を更新できますが、手動で行わないことを強くオススメします。

また、利用可能なリポジトリの確認については、下記コマンドを実行ください。
プレビュー版やベータ版を使わず、安定版（stable）のリリースのみを選択することができます。

```bash
teamviewer help
teamviewer repo
```
ただし、**現時点では全てのリリースはプレビュー版**扱いであるため、安定版・プレビュー版の両者に同じものがリリースされるので、特に違いはありません。
Segwit まとめ

SegWitについて簡単にまとめます。あまり分かりやすくはないです。随時追記していきます。

## 背景
Bitcoin にはScalabilityの問題があります。これは、ブロックサイズの上限が1MBと決められていることから、将来ビットコインのトランザクションが増えた際にビットコインネットワークの処理が追いつかない（ちょっと前も追いついていなかった）ことが予想されるという問題です。ネットワークの混雑によって、いつまでたってもトランザクションが承認されなかったり、手数料が安いことが１つの売りであるビットコインの手数料が馬鹿みたいに高くなってしまったり（１０００円とか）して、ビットコインが存在意義を失ってしまうほどの大きな問題です。
このScalabilityの問題に対する解決方法として（もともとはトランザクション展性の解決法として提案されたそうです）Bitcoin Coreの開発者Peter Wuilleによって提案されたのが、Segregated Witness(SegWit)です。

## 簡単な説明
BitcoinのTransactionは input と output から成り立ちます。inputはtxidとsignatureから成り、outputは送金する量とscriptPubkeyが含まれています。そのうち、inputにあるsignatureはvalidationの時のみに使われるのにも関わらず、Transactionの６０％をも占めるデータ量を持つそうです。さらに、signatureはtransactionが行う処理について書かれているわけではなく、ただそのUTXOをredeemする権限を持っていることを証明するためのものです。

したがって、PeterさんはSignatureをtransactionから取り除いて他の場所に置こうと考えました。これがSegregated Wittness（分離された署名）です。

ここで、Witnessとはsignatureの事で、signatureは実際にはトランザクションにおいて何も処理を行わずただ見ている（witness）だけだということからこの名前がつけられたそうです。

## 実装方法
でもsignatureってtransactionの一部なのに、それを分離して成り立つんでしょうか？ 成り立たない。
じゃあどうしよう。=> Bitcoinの仕組みを根底から変えちゃおう。

下の図のように、従来はトランザクション全体のハッシュを取ってtxidとしていましたが、witnessを除いたデータのハッシュを取ることで、トランザクション展性が解決されます。


![segwit.png](https://qiita-image-store.s3.amazonaws.com/0/168442/762d5adf-be47-c0d6-e7f5-000395fa5c99.png)


## Lightning Network と SegWit
BIPの１つで、Lightning Network（以下LN）というものがあります。これは、簡単に言うとペイメントチャネルを1対1から多対多にしたものです（[ペイメントチャネルについてはこちら](https://en.bitcoin.it/wiki/Payment_channels)（英語））。これによってオフチェーンで少額取引を（ほぼ無限に）行うことができ、スケーラビリティ問題を緩和してくれます。

## トランザクション展性（Transaction Malleability）について
SegWitは当初、Scalabilityではなくtransaction malleabilityの問題を解決するために発案されたらしいです。トランザクション展性についてのメモも書いておきます。
### トランザクション展性とは
展性、malleabilityという言葉はもともと金属の板を叩いたときに薄く広がる性質を指す言葉です。すなわち、変化しやすいという意味でいいと思います。
トランザクション展性とは、トランザクションID(txid)をマイナーや悪意のある第三者が自由に書き換えられるというビットコインの脆弱性といってもいいものです。

なぜtxidを書き換えられるかというと、txidはトランザクション全体のハッシュして64桁の16進数にしたものですが、トランザクションの構成要素には、必ずしも重要ではないものが含まれるます。したがって、違うトランザクションで同じ意味を持つものを作れてしまうということです。これによって同じトランザクションでも違うハッシュ値をもつものが作れてしまいます。これによって、txidによってトランザクションをチェックしているウォレットでは残高の整合性がなくなるなどの問題があります。


## 参考ページ
* [Segregated Witness Benefits](https://bitcoincore.org/en/2016/01/26/segwit-benefits/)(Bitcoin Core)
* [What the 'Bitcoin Bug' Means: A Guide to Transaction Malleability](http://www.coindesk.com/bitcoin-bug-guide-transaction-malleability/)
* [P2WPKH (Pay to Witness Public Key Hash)](https://programmingblockchain.gitbooks.io/programmingblockchain/content/other_types_of_ownership/p2wpkh_pay_to_witness_public_key_hash.html)
LINE Messenger APIで作った機能

# 1. アフィリエイトURL

LINE botをアフィリエイトで

拡散させることができるようにしました。

アフィリエイトURLを発行することによって

友だちが増えた場合に

紹介者が誰なのか全て記録することができます。

報酬を与えることでアフィリエイターを使って

一気に友だちを増やすことができます (#^^#)

---

# 2. ステップLINE

友だちが増えたら

どんどんクロージングしていきましょう☆彡

ステップメールのように

1日1通ずつLINEを送っていくことができます。

全員配信ではなく、友だちになったところから

1日目、2日前、3日目と進んでいきますので

見逃しもなく、途中からもなし！

この機能を使って

ドンドン売り込んでいきましょう☆彡

---
# 3. 動画チェック

ステップLINEをしていく時に

動画を配信することができます (^-^)

更に！

その動画を本当に最後まで見たかを

全て記録する機能を備えました！！

ちゃんと見た人にだけ

次の配信をすることができます♪♪

---

# 4. シナリオ応答

色々配信をしていく中で

確認を行うことができます (＾◇＾)

確認の結果

Aと答えた人にはA用の配信を

Bと答えて人にはB用の配信を

していくことが可能です。

その人に合った配信ができるので無駄がなく

ブロック率を抑えることができます♪♪

---

# 5. アンケート機能

性別、年齢、都道府県など

アンケートを取り集計することができます (^^)

家族構成、職業、趣味や興味があることなど

どんなアンケートでも取ることが可能です☆彡

---

# 6. セグメント分割

その人の好みにあった配信をしていきましょう！

要らぬ配信はブロックに繋がってしまいます。

シナリオやアンケートで取得した情報を元に

その人がほしがっている情報だけを

適切に送っていきましょう (^▽^)

---

# 7. ビーコン機能

LINEのビーコンを使って

おもしろい企画をすることができます。

LINEビーコンって？

それはココに詳しく書いてあります。

http://blog.feedmatic.net/entry/2017/01/20/184529

ビーコンを使えば、

お店の近くまで来たらクーポンをあげる。とか

渋谷のどこかにいる人を探したら

プレゼントあげる。など

ちょっと変わったおもしろい企画ができるので

話題性で友だちを増やしていくことが

可能になります♪♪

---

# 最後に

その他にもコレがほしい！

という機能があれば

ドンドン追加していきます (^○^)

大企業ではなく個人なので

その辺のフレキシブルさは売りの1つです 笑
LineRendererについて

#今回のテーマ： LineRendererを使ってみる
友達とゲーム制作をすることになりLineRendererを使うことになったので、
初歩的な使い方をメモがてらまとめていきたいと思います!

#手順
1.まずは空のオブジェクトを作り、コンポーネントからLinerendererを追加してください。
今回僕は空オブジェクトの名前をLineRendererObjectとしました。
2-1.ソース

```
GameObject Cube_1 = GameObject.Find ("Cube_1");
//Cube_1はlineの始点にあるオブジェクト

GameObject Cube_2 = GameObject.Find ("Cube_2");
//Cube_2はlineの終点にあるオブジェクト

LineRenderer line = GameObject.Find("LineRendererObject").("LineRendererObject").GetComponent<LineRenderer> ();

line.SetPosition (0, Cube_1.transform.position);
line.SetPosition (1, Cube_2.transform.position);
//line.SetPosition関数の第一引数は配列の要素数(配列は0スタートです！,第二引数は座標です)

line.startWidth = 0.1f;
line.endWidth = 0.1f;
//lineの太さを決められます。
```
3.色を変えるには
線の色の設定は下記のようにします。

```
line.SetColors(Color.blue,Color.red);
//第一引数には始点、第二引数には終点の色を渡します。
```

そうするとこんな感じになります。
<img width="545" alt="スクリーンショット 2017-07-08 19.06.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/e4981da5-1a60-9ec1-a6ab-aaa48d04cc28.png">

4.終わりに
大体これを使えば基本のことはできるんじゃないかなって思います。
また調べ次第情報を加えていきますー。
アディオス!
GasLimitの計算方法をソースコードレベルで理解する　～go-ethereum～

## 背景
* 最近、[急速にGasLimitが上昇しているというニュース](http://www.coindesk.com/miners-ethereum-transactions-gas-limit/)を見て、分散ネットワーク上でどのようにGasLimitを変化させているのかが気になった。
* GasLimitによるcontractの実行制限を排除する方法を知りたいと思った。
    * [解説1] GasLimitとは、contract実行に必要なGas(ether)の上限値である。GasLimitの存在によって、高負荷なプログラムの実行を防止し、無限ループ等によるnode停止を防いでいる。
    * [解説2] contractとは、ethereum上で動作するアプリケーションである。

## ソースコード
```go-ethereum/core/block_validator.go
// CalcGasLimit computes the gas limit of the next block after parent.
// The result may be modified by the caller.
// This is miner strategy, not consensus protocol.
func CalcGasLimit(parent *types.Block) *big.Int {
	// contrib = (parentGasUsed * 3 / 2) / 1024
	contrib := new(big.Int).Mul(parent.GasUsed(), big.NewInt(3))
	contrib = contrib.Div(contrib, big.NewInt(2))
	contrib = contrib.Div(contrib, params.GasLimitBoundDivisor)

	// decay = parentGasLimit / 1024 -1
	decay := new(big.Int).Div(parent.GasLimit(), params.GasLimitBoundDivisor)
	decay.Sub(decay, big.NewInt(1))

	/*
		strategy: gasLimit of block-to-mine is set based on parent's
		gasUsed value.  if parentGasUsed > parentGasLimit * (2/3) then we
		increase it, otherwise lower it (or leave it unchanged if it's right
		at that usage) the amount increased/decreased depends on how far away
		from parentGasLimit * (2/3) parentGasUsed is.
	*/
	gl := new(big.Int).Sub(parent.GasLimit(), decay)
	gl = gl.Add(gl, contrib)
	gl.Set(math.BigMax(gl, params.MinGasLimit))

	// however, if we're now below the target (TargetGasLimit) we increase the
	// limit as much as we can (parentGasLimit / 1024 -1)
	if gl.Cmp(params.TargetGasLimit) < 0 {
		gl.Add(parent.GasLimit(), decay)
		gl.Set(math.BigMin(gl, params.TargetGasLimit))
	}
	return gl
}
```
引用元：https://github.com/ethereum/go-ethereum/tree/master/core
## パラメータの説明
* gl:　New GasLimit
* GasLimitBoundDivisor:　GasLimitの増減率
    * ``defined by genesis block``
* contrib:　GasLimit増加方向に寄与
    * ``(parentGasUsed * 3 / 2) / GasLimitBoundDivisor``
* decay:　GasLimit減少方向に寄与
    * ``parentGasLimit / GasLimitBoundDivisor -1``

## GasLimitの計算方法
* ``New GasLimit = parentGasLimit - decay + contrib`` 
-> ``parentGasUsed``と``parentGasLimit * (2/3)``の大小関係によって、New GasLimitが増減される
* ``MinGasLimit ≦ New GasLimit ≦ TargetGasLimit``  
-> ``MinGasLimit``と``TargetGasLimit``の範囲に調整される

## GasLimitによるcontract実行制限を解除する
* ``MinGasLimit``と``TargetGasLimit(GenesisGasLimit)``を十分大きくすれば良い。
* ``MinGasLimit,GenesisGasLimit``は、``genesis.json``or``params/protocol_params.go``で設定する。


## まとめ
* Block生成毎に、GasLimitが再計算される。
* ``前ブロックのGas使用量``と``前ブロックのGasLimit*(2/3)``の大小関係によって、New GasLimitが増減される
* GasLimitによるContractの実行制限を排除したい場合は、MinGasLimitとGenesisGasLimitを十分大きくすれば良い。
* GasLimitの計算は、consensus protocolではないため、minerが決定することができる。
nginx+php7.0+xdebugインストールではまったこと


PHPのデバッグ用拡張モジュール「Xdebug」をインストール。
色々試行錯誤したあとの備忘録です。
<pre>ホスト：MacOSX Sierria(10.12.5)
サーバ：Ubuntu 16.04
(VM上で動作)
</pre>

<b>①Xdebugインストール</b>
peclでインストールしてみたけれどnginxでは動いてくれんかったのでapt-getで再インストール

1.apache<pre># pecl install xdebug</pre>
2.nginx<pre># apt install php-xdebug</pre>

(原因までは調査してない。peclインストール後、phpinfo()の結果にxdebugの項目が存在していないならapt-getでインストールしてみてもいいかも)


<b>②php.ini修正</b>
<pre>いわゆる
zend_extension=xdebug.so
xdebug.collect_vars=on
xdebug.collect_params=4
xdebug.dump_globals=on
xdebug.dump.GET=*
xdebug.dump.POST=*
xdebug.show_local_vars=on
xdebug.remote_enable = On
xdebug.remote_handler = dbgp
xdebug.remote_port = 9003
xdebug.idekey = "netbeans-xdebug"
xdebug.remote_host="192.168.0.11"
xdebug.remote_autostart=off
xdebug.remote_mode=req
を書くファイル
</pre>
1.apache
php.ini
(/usr/local/php/lib/php.iniとか/etc/php5/apache2/php.iniとか)

2.nginx
/etc/php/7.0/mods-available/xdebug.ini

あと、apacheでは
<pre>zend_extension=[xdebug.soのフルパス]</pre>
nginxでは
<pre>zend_extension=xdebug.so</pre>

じゃないと動いてくれんかった
(nginxとapacheとの違いじゃなくて別要因な気もするけど..)
Dockerでビルド時にベースイメージを切り替える

Docker CEのバージョン17.05.0-ceで[Allow using build-time args (ARG) in FROM](https://github.com/moby/moby/pull/31352)が取り込まれていた。これを使う事でビルド時にベースイメージを切り替える事ができる。

# どういう時に使えそうか
* 開発時とリリース時のベースイメージを変える
* アーキテクチャ毎にベースイメージを変える

# 使い方
```:Dockerfile
ARG  IMG
FROM ${IMG}

CMD ["foo"]
```

```bash
$ docker build  -t xxx --build-arg IMG=ubuntu:14.04 .
```
Mac OS XでモナーコインをCPUマイニングする

##動機
今更CPUでマイニングはねぇだろ、てのは分かってますが、採掘をするというのはどういう事か、
試さないで知った顔するよりは、やる事やって得られる知識は少なからずあるはず、という好奇心の元、試してみました。
特に、今時のMacの情報が少なく、ビルドに苦戦したのでシェアします。
色々と試行錯誤した結果、最適解かどうか整理しきれておりませんので、ご容赦ください。

###手持ちのカード
- 型落ちのMacbook Air(El capitan)
- 諦めの悪さ

###事前準備
- [Xcode Command Line Tools](https://developer.apple.com/download/)
- [homebrew](https://brew.sh/index_ja.html)

##cpuminerをビルドする
###ライブラリなどのインストール
マイニングをするに当たってはCPU Minerというプログラムが必要なので、ソースコードをダウンロード。

```
$ git clone https://github.com/tpruvot/cpuminer-multi
```

READMEによると、libcurl、jansson、openssl、pthreads、zlibが必要らしいので、homebrewを駆使してインストール。

```
$ brew install curl
```

```
$ brew install jansson
```

OpenSSLは、

```
$ brew install openssl
```
してもOSX標準のパス(/usr/bin/openssl)から切り替わらなかったので、パスを通しました。
(未確認ですが、標準のOpenSSLのままでも問題なかったかもしれません:sweat:)

```
$ echo export PATH=/usr/local/Cellar/openssl/1.0.2l/bin:$PATH >> ~/.bash_profile
$ source ~/.bash_profile
```
(バージョンは要確認)

```
$ which openssl
```
でパスが変わった事を確認。

pthreadsは、

```
$ brew install php56-pthreads
```

zlibは、特に何かした記憶がないので、元から入ってるか、Xcodeに含まれてるのでしょうか。

その他、automake、autoconfも同様にインストール。

###ビルド
README通りに

```
$ ./autogen.sh
$ ./nomacro.pl
$ ./configure CFLAGS="*-march=native*" --with-crypto --with-curl
make
```
だとmakeできずハマったんですが、

```
$ ./autogen.sh
$ ./nomacro.pl
$ ./configure CFLAGS="-march=native" --with-crypto --with-curl
$ perl -p -i -e "s/#if \(WINDOWS\)/#define ASM 0\n#if (WINDOWS)/g" algo/neoscrypt.c
$ make
```
最終的にこれでなんとか成功！

(3行目：CFLAGSの*を抜く)
(4行目：なんらかの理由でASMのコードが動かないので、手動で無効にするとの事)
[参考] https://bitcointalk.org/index.php?topic=841401.msg13025434#msg13025434

ビルドできてしまえば、あとは掘るだけ:pick:

##モナーコインを掘ってみる
###事前準備
- モナーコインウォレット
    - [Monacoin-Qt](https://monacoin.org/ja/)
    - [Monappy](https://monappy.jp) など
- マイニングプール(採掘場)のアカウント
    - [ASICpool](https://asicpool.info)
    -  [VIPpool](https://vippool.net/) など

###設定ファイルを作成
[ASICpool](https://asicpool.info/) の例

```monacoin.json
{
    "api-bind": "127.0.0.1:4048",
    "url": "stratum+tcp://stratum-jp.asicpool.info:2101",
    "user": "ユーザー名.ワーカー名",
    "pass": "パスワード",
    "algo": "lyra2rev2",
    "threads": 0,
    "cpu-priority": 0,
    "cpu-affinity": -1,
    "benchmark": false,
    "debug": false,
    "protocol": false,
    "quiet": false
}
```
[参考] https://blog.visvirial.com/articles/499

###実行

```
$ ./cpuminer --config monacoin.json
```
するとMacが唸り始め、
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/191104/6fb5774b-4a7f-be33-f0b6-dfbec2887157.png)

しばらくすると、
**<font color="green">yes!</font>**
が出てきます。
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/191104/f13df035-7f89-8ca1-ce2d-547e02271b3c.png)

これが掘れてるサインみたいですが、今時のGPUだとMH/s出るっぽいので約1000倍差はありそうです。
仮に採掘し続けたとして、0.001MONA/DAYくらいの印象でしょうか。
これに価値を見出せるかどうか。。

##「掘ったことがある」というのがいつか大きな財産になる
かどうかは今はわかりませんが、いつか見返した時にそうなっていればいいものです。
書いてみればこの程度でしたが、ビルドに費やした時間は自分にとってはすでに有益なものになっていると思っています。
Hubotに予測できないタイミングで発言して貰う

予期せず人間との連携プレーを果たしたりしてとてもよいです。

## 実装方法
cronとtimeを入れてね。
`npm install cron time --save`

要は1分毎にガチャ引いて、当たったら発言するというだけです。

```coffeescript:scripts/cron.coffee
cronJob = require('cron').CronJob
random = require('hubot').Response::random

module.exports = (robot) ->
  randomTalk = new cronJob
    cronTime: '0 * 0-2,10-23 * * *' # ここでBOTが起きてる時間を調整
    timeZone: "Asia/Tokyo"
    onTick: () =>
      envelope = room: "#channel_name" # チャンネル名
      sayArr = [ # 発言リスト
        'ほげほげ'
        'ふがふが'
      ]
      if Math.random() < 0.005 # ここの数字を調整して、発言頻度を変える
        say = random sayArr
        robot.send envelope, say
```
kotlin コールバックを簡単にシーケンシャルにする

kotlinを使った開発で、コールバックをシーケンシャルで動かしたい！
となったとき、どんな実装をされていますか？
こんな方法を思いつきましたという一例です

## やりたいこと

シーケンシャルに動作させたいメソッドがあるとします
非同期で取得してきたデータの処理は一般的にcallbackで処理を戻してくると思います。

```kotlin:SequentialManager.kt
firstMethod( complete = {
    result -> ...
    secondMethod( complete = {
        result -> ...         
        thirdMethod( complete = {
            result -> ...         
        }}
    }}
})
```
これだとnestが深くなりますよね。可読性が落ちるので私は好きではありません。もっと可読性を高めたいですよね。

とは言っても以下のような書き方をしても…だめな例です。

```kotlin:SequentialManager.kt
// 最初のメソッド
firstMethod( complete = {  /// --- ①
    result -> ...          /// --- ②
})

// 次のメソッド
secondMethod( complete = { /// --- ③
    result -> ...          /// --- ④
}}

firstMethod(complete:(result:Boolean) -> Unit) {
    Thread {
        ...
        complete.invoke(true)
    }
}

secondMethod(complete:(result:Boolean) -> Unit) {
    Thread {
        ...
        complete.invoke(true)
    }
}
```


動作としては ①→③→②,④ となってしまい
本当に動作させたい①→②→③→④
にはならないと思います。

そんなときは以下の方法が有効かもしれません

## シーケンシャルメソッドのためのコールバック手法
### CallBack 用の専用クラス実装

まず、CallBack専用のクラスを実装します
これは、シーケンシャルに実行するために最も重要な処理です

```kotlin:AppSequentialThreadHandler.kt
class AppSequentialThreadHandler(function: KFunction1<@ParameterName(name = "complete") (result: Any?) -> Unit, Unit>) {
    private var mfunction = function
    private var mResult:Any? = null

    init {
        // スレッドを停止するためのCountDownLatch生成
        val countdownlatch = java.util.concurrent.CountDownLatch(1)
        // Threadの生成
        Thread {
            (mfunction){
                // Callback
                result -> mResult = result
                countdownlatch.countDown()
            }
        }.start()
        // 元スレッドは一時停止
        countdownlatch.await()
        //countdownlatch.await(1000,TimeUnit.MILLISECONDS)
    }
    // データを戻したい場合呼び出す
    fun resultCallback():Any? {
        return mResult
    }
}
```
これは、コールバックを返却するメソッドを抽象化した状態で定義をしています。これにCountDouwLatchを組み合わせます。
CountDownLatchはThreadを生成したところで停止し、生成されたスレッドは抽象化したメソッドを実行します。
コールバックで結果が帰ってくると、元スレッドの停止状態を解除する仕組みです。

これを上で記載の処理と組み合わせると
// 2017/07/08 誤記修正

```kotlin:SequentialManager.kt
// シーケンスを走らせるメソッド
fun seq() { 
    // 最初に走る処理
    AppSequentialThreadHandler(AppProcess::firstMethod)
    // 次に走る処理 上の処理が完了するまで実行されない 
    // データがほしいときはresultCallbackメソッドを実行
    var data = AppSequentialThreadHandler(AppProcess::secondMethod).resultCallback()
}
```
```kotlin:AppProcess.kt
// 最初の処理の実態
firstMethod(complete:(result:Boolean) -> Unit) {
    Thread {
        ...
        complete(true)
    }
}

// 次の処理の実態
secondMethod(complete:(result:Boolean) -> Unit) {
    Thread {
        ...
        complete(true)
    }
}
```

メインシーケンスの書き方はシーケンシャルに書くことができるようになります。
UMLでシーケンス図を書いていて、そのままの実装をしたいときにべんりですね！
Rails.application の config_for を使って、ユーザ定義の設定値を定義する

Rails のアプリケーション開発の折、

* プロダクトに固有の設定を定義したい
* 設定値なので YAML で管理したいが、読み込みは実装したくない
* でも config/secrets.yml に置くのは違う感じがする
 - パスワードやAPIキーの定義じゃあるまいし、別に隠してるわけでは…

というようなことがあった場合、Rails 4.2 から使えるようになった `config_for` で、良い感じに分割しつつ定義ができるとか、できないとか。

```yaml:config/preference.yml
default: &default
  app_name: "I'm stillalive"
  cheat_enabled: true

# 環境ごとの差がない場合はやや勿体無いような気もしますが、気にせず
development:
  <<: *default
test:
  <<: *default
production:
  <<: *default
```

```ruby:config/application.rb
# config.x 名前空間はユーザ定義用に用意されているらしいので、折角なので利用(必須ではない)
config.x.preference = config_for(:preference)
```

定義方法からお察しの通り、環境ごとの設定値を個別に定義でき、その点でも便利なのですが、実行結果は単なる Hash オブジェクトとなるため、参照時にはやや使いにくい印象を受けるような……？

```ruby
Rails.configuration.x.preference["cheat_enabled"] #=> true
Rails.configuration.x.preference[:cheat_enabled] #=> nil
Rails.configuration.x.preference.cheat_enabled #=> NoMethodError
```

というわけで、ActiveSupport::OrderedOptions を用いる場合の例。

```ruby:config/application.rb
config.x.preference = ActiveSupport::InheritableOptions.new config_for(:preference).symbolize_keys
```

こうすれば、以下の実行ができるように。

```ruby
if Rails.configuration.x.preference.cheat_enabled
  puts "升乙"
end
```
クラウドサーバでTensorFlow　その5

#概要
クラウドサーバでTensorFlowやってみた。
cgi-binでpython3やってみた。

#環境
クラウド idcf
linux debian-8.11
tensorflow 1.2
gpu 無し

#apache2.4の設定

##cgi.loadの設定

```
ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load
```

##000-default.confの設定

nano /etc/apache2/sites-available/000-default.conf

```
Include conf-available/serve-cgi-bin.conf
```

##mime.confの設定

nano /etc/apache2/mods-available/mime.conf

```
AddHandler cgi-script .cgi .py
```

##serve-cgi-bin.confの設定

nano /etc/apache2/conf-available/serve-cgi-bin.conf

```
<IfModule mod_alias.c>
        <IfModule mod_cgi.c>
                Define ENALBLE_USR_LIB_CGI_BIN
        </IfModule>
        <IfModule mod_cgid.c>
                Define ENALBLE_USR_LIB_CGI_BIN
        </IfModule>
        <IfDefine ENALBLE_USR_LIB_CGI_BIN>
                ScriptAlias /cgi-bin/ /var/www/cgi-bin/
                <Directory "/var/www/cgi-bin">
                        AllowOverride None
                        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                        Require all granted
                </Directory>
        </IfDefine>
</IfModule>
```

#cgi-binを作成する。

mkdir /var/www/cgi-bin

#テスト

cgi-binに、test.py作る。 
chmod 755 test.py
ブラウザで、cgi-bin/test.pyに、アクセス。
curlコマンド ~ アラート通知などで自動メール送信機能を実装した際に、テストでリクエストを投げる方法(コマンドメモ)

アラートメールを送信する機能を実装し、動作確認する際に
jsonデータを送り擬似的にアラートを発生させます。

ターミナル(コマンドプロンプト)から下記を叩きます。
```
$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d 'jsonデータ'  送信先URL
```


#例

ショップ(shop)のレジ(account)に異常が発生した際の自動送信メール機能を実装
・アラート(alert)のID(alert_id)が14の場合
・shop-controllerのalertDataメソッドを呼ぶ


下記のようにcurlコマンドを叩きます。
```
$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"shop_id":"1","account_id":"1","alert_data":{"alert_id":"14","additional_info":"hoge"}}'  http://localhost:3000/shop-controller/alertData/
```
今使っているActiveRecordのバージョンを調べる方法

とあるgemを作っている際、ActiveRecordのバージョンによって、deprecateになったメソッドを使わないようにする......といった要望が出てきて、ちらっと調査していたのですが、日本語の情報がなかなか出てこなかったので、こちらにメモしておきます。

```ruby:irb
irb(main):001:0> require "active_record"
=> true
irb(main):002:0> ActiveRecord.version
=> #<Gem::Version "5.1.2">
irb(main):003:0> ActiveRecord::VERSION::STRING
=> "5.1.2"
```

**APIdock - version (ActiveRecord)**
https://apidock.com/rails/ActiveRecord/version/class

**APIdock - ActiveRecord::VERSION**
https://apidock.com/rails/ActiveRecord/VERSION

以上。
なお、`Gem::Version`クラスを使ったバージョン比較については、こちらの記事で親切に解説されているので、一緒にどうぞ。

**WEB SALAD - RubyとRailsで特定のバージョン下でのみ適用したいパッチを書く方法**
http://web-salad.hateblo.jp/entry/2015/05/27/090000
[C#][Visual Studio] T4テキストテンプレート 内でJSON.NET(3rd Party製ライブラリ)を利用する

# T4テキストテンプレート 内でJSON.NET(3rd Party製ライブラリ)を利用する

T4 Template 内で外部ファイルを読み込みたい場合、`System.Xml` でもいいですが、Jsonを利用したい場合があると思います。
その場合、`JSON.NET`のようにNugetで取得したライブラリを使用したい場合は以下のようにすればよかったです。
（プロジェクト名がベタ打ちのため、あんまりきれいなやり方じゃないですけども・・・）

```csharp:
<#@ assembly name="$(SolutionDir)\MyProject\bin\Debug\Newtonsoft.Json.dll" #>
<#@ import namespace="Newtonsoft.Json" #>
```

テンプレート内で `$(SolutionDir)` という、ソリューションの絶対パスを取得できる変数を利用しています。

# 使用例

```C#:sample.tt
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(SolutionDir)\MyProject\bin\Debug\Newtonsoft.Json.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="Newtonsoft.Json" #>
<#@ output extension=".cs" #>
<#
	var jsonFilePath = this.Host.ResolvePath("Config.json");
	var desirialized = JsonConvert.DeserializeObject(File.ReadAllText(jsonFilePath));
	WriteLine(desirialized.ToString());
#
```

この使用例ではテンプレートファイルからの相対パスを取得するために、[`Host.ResolvePath`](https://msdn.microsoft.com/ja-jp/library/microsoft.visualstudio.texttemplating.itexttemplatingenginehost.resolvepath(v=vs.110).aspx) を使用しています。
これを利用するためには、１行目の `hostspecific="true"` の設定を有効にする必要があるので注意してください。

上記例で使用している `Config.json` は `sample.tt` と同じディレクトリに配置されていることを想定しています。

# 参考
[T4 テキスト テンプレートを使用したデザイン時コード生成](https://msdn.microsoft.com/ja-jp/library/dd820620.aspx)
[Visual Studio搭載のT4テンプレートエンジンの3通りの活用方法 - seraphyの日記](http://d.hatena.ne.jp/seraphy/20140419)
[複数の入力ファイルをT4テンプレートに適用して複数のファイルを生成する - Qiita](http://qiita.com/wonderful_panda/items/61a365a47fc20743693a)
サービス縮小時のサーバ削減についてのメモ書き

新規サイトの立ち上げや、サーバの移設などで、サーバ群を新規構築したり、逆に全てを停止したりすることはたまに行ってきたけど、サイトを維持したままサーバの台数を減らしてランニングコストを減らすことはあまりしてこなかったので、そのメモ。

# サーバ構成
今回、削減対象となるサーバ群は、一般的な以下の構成で計４台のクラウドサービスの仮想サーバ。

RP (ReverseProxy, LoadBalancer)
│
Web
├─────┐
│  　　　　　│
DB(Master)　DB(Slave)

DBには高速ストレージを追加してあり、サービスが成長し、ある程度のトラフィックとデータ量になっても耐えられるように設計されていた。
が、当初の想定通りには進まず、ほとんどトラフィックがないにもかかわらず、ランニングコストが月額10数万円ほどかかってしまっていた。
これを、月に1万円程度にできないか、という要求。コストを10分の１にせよ、と。

このサイトには設計にも構築にも運用にも関わってなかったので中身は分からないが、ざっと見たところできなくはなさそうなのでやってみた。

# サーバ削減計画
webサーバが１台しかないのがアレだけど、webサービスを運営するサーバ構成としてはごく一般的な形。
これを削減していくにあたり、フェーズとして以下の３段階に分けて考えた。

## 1. Slave DB を削除

障害でサービスが止まってもよい（かつ、過去のある時期のデータが残っていて復旧できれば良い）という要件だったので、まずはさくっとできる Slave DB を停止することでコスト削減。
DBサーバがコストの大きなシェアを持っているので効果大。

## 2. RPを削除

可用性、負荷分散のためにロードバランサ（apache によるリバースプロキシ）が存在しているが、現状 web サーバは一台だけで、処理能力的にそれで十分、かつ、可用性も求められないということで削除。
フェーズ１，２でコストは当初の半分に。

結果的にこれが予想以上に手間取った。


## 3. Master DB を webサーバと統合

ディスク容量、メモリ容量的に不安があるが、webサーバで DB も動かしてしまうことで １台でサイト運用ができる。
これが最終型。月額１万円台に。

ごく普通の MySQL サーバだと思ったら、mroonga が入っており、若干手間取った。


## フェーズごとに順を追っていく

### 1. Slave DB を削除
まずは、
・ ps、netstat、lsof、chkconfig などで mysql 以外のサービスが動いてないか確認
・ cron で何かタスクを動かす設定がされていないか確認

上記により下記が判明
・ mysql 以外には何も役割は担っていない
・ mysql への接続は web サーバからのみ
・ cron で自分のディスクに対してDBの日次バックアップを行っている

やること
・ web サーバから slave DB への接続をやめる
・ 日次バックアップの処理を master DB へ移す
・ slave を止める

#### ・ webサーバから slave DB への接続をやめる
webのシステムはどうやら symfony2 で作られている模様。社内的には他では使われていないので、手探り。
DBの接続情報のところで、更新用のDBと、参照用のDBを指定して接続を切り分けているところがあり、ホントはそこで更新系／参照計を一つにまとめるのが筋だけど、やり方を調べて動作検証をするのがめんどいので、とりあえず参照用も master へ向けることで解決。
DB接続が無駄に倍になるので良い子はマネしちゃだめ。

#### ・ 日次バックアップの処理を master DB へ移す
こちらは、DBのバックアップを行うスクリプトファイルを master のサーバへうつし、master にて朝方に cron 起動するように設定。
DBへの更新はほとんどないので稼働中のバックアップで問題なし。

#### ・ slave を止める

mysql> stop slave;

で、他のサーバからの接続がなくなっていることを確認してサーバを shutdown。
数日 slave 無しでサイトを運用して問題がないこを確認して、サーバ解約！

第１フェーズは特に詰まるところもなくさくっと完了。
長くなったので、第２フェーズ以降はまた次回。。。
I made add of Agent Smith usb key[RingZer0]


[問題ページ](https://ringzer0team.com/challenges/20)

![SnapCrab_NoName_2017-7-8_15-26-20_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/9432c5d0-b089-6c5b-252b-a567c3916c7a.png)

I'm sure it contain the matrix password! Can you find it?と書かれている。とりあえずgoogle翻訳してみる。
![SnapCrab_NoName_2017-7-8_15-27-57_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/b643b353-2242-336d-c8bf-f836f76838aa.png)
　問題にあるファイルをダウンロードをすると拡張子のないファイルが手に入った。
![SnapCrab_NoName_2017-7-8_15-32-23_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/6cf1c478-c327-7acc-5562-fe763b1d4b7b.png)
このファイルからパスワード(=フラッグ)を見つけることができれば良いのだろう。
　「WinSCP」を用いて仮想マシンにこのファイルを転送し、そちらで解析することにした。まず、このファイルが何のファイルなのかを知るために「fileコマンド」を実行した。
 ![SnapCrab_NoName_2017-7-8_15-5-55_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/6669c20a-c037-0950-ddde-34d21ff15b66.png)
 このファイルは、`Linux rev 1.0 ext2 filesystem data`というファイルということがわかった。調べてみると、ex2ファイルはタイトルから察するに、usbのフォーマットの一種で、Linux形式のフロッピ･ディスクだということが分かった。それならマウントをすれば中にあるファイルが見れるのでは？と考え、同じディレクトリに「m」というディレクトリを作成し、そこにマウントした。
 ![SnapCrab_NoName_2017-7-8_15-50-35_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/42f492c8-4aa3-f542-64de-d943ddc986b9.png)
 そうすると、「image」、「lost+found」、「to keep」の3つのディレクトリが出てきた。そして、lsの「-R」オプションを用いて中身のファイルをすべて表示させ、怪しいファイルがないかを調べてみる。
 ![SnapCrab_NoName_2017-7-8_15-57-18_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/ea76cfe0-4a83-b98d-1e5a-ea37caf2acfa.png)
 すると、３つの画像ファイルと1つのテキストファイルが出てきた。

初めに、すぐ内容がみれそうな「01.txt」の内容を見てみる。
![SnapCrab_NoName_2017-7-8_15-59-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/aa9b72d3-955b-2c95-7f01-eadc5c123fc9.png)
直訳すると、「私の母乳ミルクを持参することを忘れないでください」ということで、これはフラッグではない。したがたないので、３つの画像ファイルを一度ホストマシンに戻して内容を見てみることにした。
![SnapCrab_NoName_2017-7-8_16-6-17_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/5e661da4-7d90-8627-4ddb-effaf985eeb9.png)
全然関係ない画像が出てきた。フラッグは画像に書かれているわけではなかった。
この後、隠しファイルがないかなど探ってみたが見つからず。画像ファイルに関しては「strings」コマンドで怪しい文字列がないか探ったりもしたが見つからず。最終的にはマウントされたディレクトリやファイルは関係ないという考えに至った。

初めにダウンロードしたファイルに「strings」で調査すれば良いのでは？
![SnapCrab_NoName_2017-7-8_16-37-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/e934afb0-b361-c192-a378-f0673bee29ad.png)
１０文字以上の文字列を表示させたところ、見つかった。いろいろ回りくどいことをしたがマウントする前のファイルにもマウントした後のデータは含まれているわけなのでこの方法でも良いはずであった。
ちなみに「grep」コマンドを用いれば文字数を指定せずとも見つけることが可能である。
![SnapCrab_NoName_2017-7-8_16-40-42_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/191144/4e528a4a-54fe-d6aa-6678-84083d8393e3.png)
【Rails】CarrierWave・MiniMagickで画像をトリミングできない問題

# 仮想属性に値が入っていない
Uploaderに以下のようなcropの処理を書いていても、`model.crop_x`などの仮想属性の値がnilになるため、cropできないといった問題が起こることがあります。

``` image_uploader.rb
# (省略)

def crop
  manipulate! do |img|
    crop_x = model.crop_x.to_i
    crop_y = model.crop_y.to_i
    crop_w = model.crop_w.to_i
    crop_h = model.crop_h.to_i
    img.crop "#{crop_w}x#{crop_h}+#{crop_x}+#{crop_y}"
    img = yield(img) if block_given?
    img
  end
end
```

この場合、コントローラのストロングパラメータで定義しているパラメータの順番が原因の可能性が高いです。
仮想属性より先に`image`を定義してしまうと、`crop_x`などの仮想属性に値が入っていない状態で、cropしようとするため、エラーとなります。

``` users_controller.rb
# （省略）

def user_params
  params.require(:user).permit(:name, :email, :image, :crop_x, :crop_y, :crop_w, :crop_h)
end
```

したがって、以下の様に仮想属性を`image`より、先に定義する必要があります。
こうすることで、先に仮想属性がオブジェクトに反映され、正常にcropすることができるはずです。

``` users_controller.rb
# （省略）

def user_params
  params.require(:user).permit(:name, :email, :crop_x, :crop_y, :crop_w, :crop_h, :image)
end
```

# 終わりに
Uploaderの処理が呼ばれる前に仮想属性をモデルオブジェクトに適用させましょう。
Node.jsでrequestで画像をダウンロードしようとしてハマったので忘備録

## やりたかったこと
Lambda上のNode.jsでurlから画像をダウンロードして、リサイズしてS3に保存。
（よくあるLambda活用術？）
画像ダウンロードに使ったライブラリは定番の`request`バージョンは2.81.0
画像リサイズはgmを試しました。（試行錯誤したため）

## ハマった点
以下のコードでなぜか、画像リサイズに失敗する。
そもそもリサイズ抜きで画像を保存してもファイルが開けない。responseの中身をログで吐くと、ちゃんとbodyやらcontent-typeは入っている。


```ResizeImage.js
//〜〜（略）〜〜
request(event.imageurl, function (error, response, body) {
  //**** 画像をリサイズ & 保存する処理（略） ****
}
```


## 解決法
encodingにnullを指定したら治りました。

```ResizeImage.js
//〜〜（略）〜〜
request({method: 'GET', url:event.imageurl, encoding: null}, function (error, response, body) {
  //**** 画像をリサイズ & 保存する処理（略） ****
}
```
responseをコンソール出力したときの文字化けも同時に治りました。
まさか、encodeingを指定しない場合と、nullを指定する場合で違う動きをするとは思いませんでした。

以上　、恐ろしいので、忘れないためのメモでした。
コンパイラ作り入門

この記事では、この分野のことを考えている人以外はあまり考えないような *コンパイラの構造* と、*実際にコンパイラを作るために必要な技術* を紹介していきます。

わりとゆっくり更新していくと思うので、その点あしからず。

# コンパイラとは

まずは、コンパイラとは何かを明確にしておきましょう。(とは言ってもWikipediaからですが..)

> [コンパイラ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)とは、いわゆる「プログラミング言語」（＝人間が理解しやすい言語や数式でプログラムを記述可能な人工言語）で書かれたプログラムを、コンピュータ（のCPU）が直接的に実行できる機械語（あるいは、元のプログラムよりも低いレベルのコード。たとえばバイトコードなどの中間言語）に変換するプログラムのことである。

コンパイラは、人間が直接使うには厄介な機械語や中間言語を、いわゆるプログラミング言語から代わりに生成してくれます。自然言語で言えば、通訳者としての役割を果たしていますね。

# コンパイラの基本構造

プログラミング言語は大きく分けると **字句解析** **構文解析** **意味解析** **コード生成** という4つのフェーズを経てより低レベルなコードへと変換されていきます。
順に見ていきましょう。

## 字句解析

字句解析とは、ソースコードを意味の分かる最小単位ごとに分けていくことです。これは、例を見たほうがわかりやすいでしょう。
例えば、ここにCで書かれたコードがあるとします:

```c
int main() {
  puts("hello world");
}

```

字句解析をすると以下のようなデータになります:

```
identifier: int
identifier: main
  symbol  : (
  symbol  : )
  symbol  : {
identifier: puts
  symbol  : (
  string  : hello world
  symbol  : )
  symbol  : ;
  symbol  : }
```

コードが ``int`` や ``(`` などに分解されました。このそれぞれのことを*トークン*と呼びます。
トークンには、そのトークンが何を表しているかのデータが付属していることもあります。``identifier`` や ``symbol`` などがそれです。どんなコンパイラを作るかによっては、これらのデータはもうちょっと細かく分類されたりします。
これは構文解析の時に役に立ちます。

以上のように、字句解析ではソースコードを細かく分けていきます。
わかりにくかったら、ちょうど国語の時間に文章を文節や単語ごとに分けていた時のことを思い出すといいでしょう。

## 構文解析

構文解析とは、字句解析でできたトークンをもとに、意味のわかる形式(e.g. [AST(Abstract Syntax Tree)](https://ja.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E6%A7%8B%E6%96%87%E6%9C%A8)) に変換することを言います。
ここでは特にASTへの変換についてみていきます。

こちらもサンプルを見ていきましょう。さっき登場したトークン列を使用します:

```
identifier: int
identifier: main
  symbol  : (
  symbol  : )
  symbol  : {
identifier: puts
  symbol  : (
  string  : hello world
  symbol  : )
  symbol  : ;
  symbol  : }
```

今回はこれらをASTに変換してみましょう(中間コードでも考え方は同じはず)。
*ここでは、ASTを[S式](https://ja.wikipedia.org/wiki/S%E5%BC%8F)で表します。*

まず、このコードは関数定義を表しています。よって、関数定義を表すASTが出来上がれば良いはずです。

```
(func-def)
```

関数を作るには、返り値の型、名前、引数、中身などのデータが必要です。

```
(func-def (type int) main () (
  (func-call puts "hello world")
                             )
)
```
ASTは抽象構文木という名前から分かる通り、トークン列よりも抽象的になっています。カッコやセミコロンの類は消えてなくなり、``(type int)`` など、見るだけで何を表しているかすぐにわかります（これは具体的?).

と、唐突にASTが完成しましたが、これだけでは何が起きたのかわかりませんね。
まずはトークン列が関数定義を表していることをしらなければなりません。

人間なら、``int`` -> ``main`` -> ``(`` ->  ``)``-> ``{`` と見ていきながら、最後の中括弧を見たところで、関数定義だと確信することができます。中括弧を見るまでは、プロトタイプと見分けがつきませんからね。
コンピューターも人間と同じように(いろんな方法がありますが普通は)トークンを前から見ていきながら、``{`` を見つけたところで関数定義だと確信します。


- sorry coming soon
[Salesforce DX] Scratch Orgを使った開発フローをためしてみた

今回は「Scratch Org」を使って「Salesforce DX」で想定されている開発フローを試してみました。

詳細は下記リンク先にまとめております。
http://dev.classmethod.jp/cloud/salesforce-dx-scratch-org/


Scratch OrgはDocker的な使い方ができていいかんじです。
ですが、Scratch Org以外の環境へデプロイするときにうまくいかないときがあったので
そこらへんつめていきたいです。
次はCI/CDを試してみます。
python で 緯度経度と世界座標を相互変換してみる

# やりたかったこと

- 緯度経度の情報を、メッシュ的に区画分割した単位で集計等を行いたい
- そのため、緯度経度を解像度を落した区画xyに配置したかった
- [Google Maps APIの fromLatLngToPoint](https://developers.google.com/maps/documentation/javascript/reference#Projection) 同等のことをPythonでオフラインでやりたかった

# やったこと

TRAIL NOTEさんの http://www.trail-note.net/tech/coordinate/ にあった情報を元に、pythonで、緯度経度と世界座標の変換を行う関数にしてみました。

## 実装

ひたすら↑の記載内容を写経しました。

```py
from math import pi
from math import tanh
from math import sin
from math import asin
from numpy import arctanh

# refer from http://www.trail-note.net/tech/coordinate/

def tile2latlon(x, y, z):
    L = 85.05112878
    lon = ((x / 2.0**(z+7) )-1) * 180
    lat = 180/pi * (asin(tanh(-pi/2**(z+7)*y + arctanh(sin(pi/180*L)))))
    return [lat, lon]

def latlon2tile2(lat, lon, z):
    L = 85.05112878
    x = int((lon/180 + 1) * 2**(z+7))
    y = int( (2**(z+7) / pi * ( -arctanh(sin(pi*lat/180)) + arctanh(sin(pi*L/180)) ) ))
    return [x,y]
```

## 確認

既知の緯度経度を入力して、[国土地理院の地図](https://maps.gsi.go.jp/development/ichiran.html#std) で確認してみます。

```py
#simbashi
lat = 35.666280
lon = 139.758375
# lat = 30.335927
# lon = 130.504283

pix = 256
# lat/lon to tile
for z in range(15,19):
    a,b = latlon2tile2(lat,lon,z)
    print [a,b]
    print 'http://cyberjapandata.gsi.go.jp/xyz/std/{0}/{1:d}/{2:d}.png'.format(z,a/pix,b/pix)
    a,b = tile2latlon(a,b,z)
    print [a,b]
```

実行するとこんな感じで出力されますので、元のlat/longとあっていること、zoomレベルが上がると精度が上がること。実際の地図での場所の確認を行いました。（国土地理院の地図はズームレベル18まで）

```
[7450910, 3303678]
http://cyberjapandata.gsi.go.jp/xyz/std/15/29105/12904.png
[35.66629207402928, 139.75836753845215]
[14901820, 6607356]
http://cyberjapandata.gsi.go.jp/xyz/std/16/58210/25809.png
[35.66629207402928, 139.75836753845215]
[29803640, 13214713]
http://cyberjapandata.gsi.go.jp/xyz/std/17/116420/51619.png
[35.66628335763601, 139.75836753845215]
[59607281, 26429426]
http://cyberjapandata.gsi.go.jp/xyz/std/18/232840/103239.png
[35.66628335763601, 139.75837290287018]
```


# 要確認事項

- 測地系とかよく分かっていません
- pyproj といったライブラリがあるようなのでこちらを使う方がいいのかもしれません。使い方をご存知の方は教えてください！
PRMLの図作成 演習問題1.4 確率密度関数の非線形変換

#やりたいこと
確率変数$x$と$y$が、$x = g(y)$の関係になっているとします。また、$x$に関する確率密度関数$p_x(x)$は分かっているとします。
この時、$y$に関する確率密度関数$p_y(y)$の形はどうなっているかを考えます。

#説明
単純に変換すると、$p_x(g(y))$となりますが、これは$x$に関する確率密度関数であるため、$p_y(y) \neq p_x(g(y))$です。

$p_x(x)$と$p_y(y)$の関係は、任意の範囲$x_1\sim x_2$に関して、

```math
\int_{x_1}^{x_2} p_x(x) \mathrm{d}x = \int_{g^{-1}(x_1)}^{g^{-1}(x_2)} p_y(y) \mathrm{d}y
```

となるはずです。
ただし、$g^{-1}(x)$は、$g(x)$の逆関数です。

積分の変数変換の公式を用いると、

```math
\begin{align}
\int_{x_1}^{x_2} p_x(x) \mathrm{d}x&=\int_{x_1}^{x_2} p_x(g(y)) \mathrm{d}x\\
&=\int_{g^{-1}(x_1)}^{g^{-1}(x_2)} p_x(g(y))\left|
\frac{\partial g(y)}{\partial y}\right| \mathrm{d}y
\end{align}
```
よって、

```math
p_y(y) = p_x(g(y))\left|
\frac{\partial g(y)}{\partial y}\right|
```
となります。

#実装

```math
p_x(x) = \mathcal{N}(x\mid\mu,\sigma^2)\\
x = g(y) = \ln(y)-\ln(1-y)+5\\
y = g^{-1}(x) = \frac{1}{1+\exp(-x+5)}
```
の場合を考えます。

```math
\frac{\partial g(y)}{\partial y} = \frac{1}{y(1-y)}
```

より、

```math
p_y(y) = \mathcal{N}(g(y)\mid\mu,\sigma^2)\frac{1}{y(1-y)} 
```

これが、$p_x(x)$からのサンプルを$y=g^{-1}(x)$で変換したデータのヒストグラムと一致するかを確認します。

##コード
```python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

#ガウス分布の密度関数
def gaussianDist(sig,mu,x):
    y=np.exp(-(x-mu)**2/(2*sig**2))/(np.sqrt(2*np.pi)*sig)
    return y

#確率変数の変換関数
def g(y):
    x=np.log(y)-np.log(1-y)+5
    return x
    
#確率変数の変換関数の逆関数
def invg(x):
    y=1/(1+np.exp(-x+5))
    return y

#ガウス分布px(x)の平均、分散
sig=1.0
mu=6

#ヒストグラムのサンプル数
N = 50000 

plt.xlim([0,10])
plt.ylim([0,1])

####
x = np.linspace(0,10,100)

#確率変数の変換関数をプロット
y=invg(x)
plt.plot(x,y,'b')

#px(x)のプロット
y = gaussianDist(sig,mu,x)
plt.plot(x,y,'r')

#px(x)からのサンプルを元にヒストグラムをプロット
x_sample = mu + sig * np.random.randn(N)
plt.hist(x_sample,bins=20,normed=True,color='lavender')


####
y=np.linspace(0.01,0.99,100)

##py(y)のプロット
x=gaussianDist(sig,mu,g(y))/(y*(1-y))
plt.plot(x,y,'m')

#px(x)からのサンプルをg^-1(x)で変換したデータのヒストグラムをプロット
y_sample = invg(mu + sig * np.random.randn(N))
plt.hist(y_sample,bins=20,normed=True,orientation="horizontal",color='lavender')

#px(g(y))のように単純に変換した関数をプロット
x = gaussianDist(sig,mu,g(y))
plt.plot(x/(x.sum()*0.01) ,y,'lime')

####
#平均muとg^-1(mu)との関係をプロット
plt.plot([mu, mu], [0, invg(mu)], 'k--')
plt.plot([0, mu], [invg(mu), invg(mu)], 'k--')

```

#実行結果
![test.png](https://qiita-image-store.s3.amazonaws.com/0/188747/b3937350-a4e1-6c6f-133b-43e2b09893dc.png)
JSONからPerlオブジェクトを生成する方法


まさにこれ。
[How to convert Perl objects into JSON and vice versa \- Stack Overflow](https://stackoverflow.com/questions/4185482/how-to-convert-perl-objects-into-json-and-vice-versa)（PerlオブジェクトをJSONに変換するにはどうすれば？またその逆は？）



# 要点

- Blessed Objectはそのままencodeしようとするとエラーになるよ

　`encountered object 'Person=HASH(0x11d6d40)', but neither allow_blessed nor convert_blessed settings are enabled at sample.pl line 24.`

- allow_blessedが有効だと例外エラーしなくなるよ。代わりにnullが返るよ。
- convert_blessedを有効にするとBlessed ObjectのTO_JSONが呼ばれてそれを使うよ。
- `sub TO_JSON { return { %{ shift() } }; }`という風に書いてハッシュに変換するといいよ。
- でもこれだと何のObjectかわからないから、`__CLASS__`フィールドを用意しておくといいよ。
- JSONをインスタンスに変換するのはPerlに限らず、他の言語でも必要だよ。

# 実例

```pl
#!/usr/bin/perl

package Person {
    use v5.10;
    use warnings;
    use Moo;

    has 'num' => (is => 'rw', default => 22);
    has 'hash' => (is => 'rw', default => sub { { a => 22} } );
    has '__CLASS__' => (is => 'ro', default => __PACKAGE__);

    sub TO_JSON { return { %{ shift() } }; }
}

use v5.10;
use warnings;
use Data::Dumper;
use JSON;

# Objectを生成
my $obj = Person->new();
say Dumper $obj;

# JSONに変換
my $json_text = JSON->new->utf8->allow_blessed->convert_blessed->encode($obj);
#my $json_text = JSON->new->utf8->allow_blessed->encode($obj);
die "return null" if $json_text eq "null";
say $json_text;
# ↑convert_blessedを付けない場合nullが返る

# JSONからObjectを生成
my $ref = JSON->new->decode($json_text);
say Dumper $ref;
my $obj2 = bless($ref, $ref->{__CLASS__});
say Dumper $obj2;
__END__
$VAR1 = bless( {
                 'hash' => {
                             'a' => 22
                           },
                 '__CLASS__' => 'Person',
                 'num' => '22'
               }, 'Person' );

{"__CLASS__":"Person","hash":{"a":22},"num":"22"}
$VAR1 = {
          'hash' => {
                      'a' => 22
                    },
          '__CLASS__' => 'Person',
          'num' => '22'
        };

$VAR1 = bless( {
                 'hash' => {
                             'a' => 22
                           },
                 '__CLASS__' => 'Person',
                 'num' => '22'
               }, 'Person' );
```

# 参考

moose - Unblessing Perl objects and constructing the TO_JSON method for convert_blessed - Stack Overflow https://stackoverflow.com/questions/25508197/unblessing-perl-objects-and-constructing-the-to-json-method-for-convert-blessed

blessされたオブジェクトをJSONに変換 - hounobouno http://koizuss.hatenablog.com/entry/20090605/1244174060

How to convert Perl objects into JSON and vice versa - Stack Overflow https://stackoverflow.com/questions/4185482/how-to-convert-perl-objects-into-json-and-vice-versa

JSON - JSON (JavaScript Object Notation) encoder/decoder - metacpan.org https://metacpan.org/pod/JSON
memo: テキスト全選択の JavaScript コードが動かなくなったので修正した

pre タグの内側に書かれたテキストを1クリックで全選択するためのコードが、 Chromium ベースのブラウザで動かなくなりました。

対処として、以下のように `.addRange()` の前に `.removeAllRanges()` を追加して動くようにしました。

```html
<script type="text/javascript">
function select_contents(obj) {

    var s = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(obj);
		
    s.removeAllRanges();	// ←追加

    s.addRange(range);
}
</script>
```


# どういうこと? 

pre タグの内側をクリックするとテキスト部分を全選択する、という処理を以下のように実装し、問題なく動いていました(2017年4月頃確認)。

```html
<script type="text/javascript">
function select_contents(obj) {

    var s = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(obj);
    s.addRange(range);
}
</script>

<pre id="output_txt" onclick="select_contents(this);">
...
</pre>
```

ところが先日、この処理が Chromium ベースのブラウザで動かなくなっていることを確認しました(2017/07/05 確認)。

すなわち、

+ クリックしても全選択されない
+ 以下の警告メッセージがブラウザのコンソールに出力された

````
[Deprecation] The behavior that Selection.addRange() merges existing Range and the specified Range was removed.
````

調べてみると、つまりこういうことだそうです。

> Selection API: addRange() ignores additional Ranges
>
> In a case where document already has text selection and Selection.addRange() is called, Blink merges the Range and the existing text selection into one if they have overlap, and does nothing otherwise.
>
> We'll change it so that Blink always ignore the Range. It matches to Edge.
>
> cf. Chorome Platform Status https://www.chromestatus.com/features/6680566019653632

ざっくり: Selection に既に何か設定されているときに .addRange() しても無視されるよ。


# 環境

動かなくなったことを確認したブラウザ:

- Google Chrome 59.0.3071.86
- Vivaldi 1.10.867.42

以下のブラウザでは、いままで通り動くことを確認しました。

- Firefox 54.0.1


# 対処

Selection に既に設定されている値(Range)を取り払ってから .addRange() するようコードを修正しました。

すなわち

```js
s.addRange(range);

↓

s.removeAllRanges();	// 追加
s.addRange(range);
```

としました。

これで、処理が動かなくなっていたブラウザでも、当初の想定通り動くことを確認しました。


# 参考文献

+ .removeAllRanges() / STUDIO KINGDOM, js STUDIO
http://js.studio-kingdom.com/javascript/selection/remove_all_ranges

+ .addRange() / STUDIO KINGDOM, js STUDIO
http://js.studio-kingdom.com/javascript/selection/add_range

+ Selection API: addRange() ignores additional Ranges / Chorome Platform Status
https://www.chromestatus.com/features/6680566019653632

+ javascriptで文字列を選択状態にする / 赤芽, 2014
http://akameco.hatenablog.com/entry/2014/01/16/024309
手っ取り早くMacで複数バージョンのPHPをインストールしてphpenvで切り替えて使う

# やりたいこと

* `phpenv` って便利
* でも持ってないバージョンのPHPが欲しい時、 `phpenv install` でいちいちPHPのビルド走らせるのは時間かかるし、依存ライブラリのインストールだとかがとにかく面倒
* ビルド済みのPHPが欲しい
* でもって当然 `phpenv` でバージョン切り替えながらコマンドラインから使いたい


# 環境

* macOS 10.12.5
* [phpenv v0.0.4-dev](https://github.com/madumlao/phpenv) ([anyenv](https://www.mamp.info/en/downloads/)でインストールした)
* [MAMP 4.1.1](https://www.mamp.info/en/)


# なぜMAMP

MAMPは、Mac用のApache Web Server、MySQL、PHPとそれらの制御用の小さなプログラムが付いたパッケージです。

なぜMAMPを使うかといえば、Mac用のビルド済みPHPバイナリを手に入れる方法で、おそらく一番手っ取り早いからです。
MAMP同梱のPHPならmysqlやsqliteのライブラリもリンク済みで機能も豊富。

同梱されていないバージョンでもダウンロードして所定のディレクトリに放り込むだけで良いので簡単。
Homebrewで大量にライブラリを落としてきてインストールに時間がかかる、ということもありません。


# 手順

## MAMPをインストール

インストーラーに従って次へ連打で終わり。

## 使いたいバージョンのPHPバイナリを入手

[MAMPのダウンロードページ](https://www.mamp.info/en/downloads/)に、ある程度メジャーなバージョンのビルド済みPHPのコーナーがあります。

![MAMP___MAMP_PRO_-_Downloads.png](https://qiita-image-store.s3.amazonaws.com/0/41896/5f84f1d2-ddb8-4aba-945f-088ddeb25431.png)


欲しいものをダウンロードして解凍し、 `/Applications/MAMP/bin/php` に放り込みます。

## phpenvの管理下で使えるようにする

MAMPのディレクトリに置かれているPHPを、phpenvでも扱えるようにします。
phpenvは `versions` 以下に置かれたディレクトリでPHPのバージョンを管理しているので、シンボリックシンクを張ってやれば普通に使えます。

```bash
# 例えばバージョン7.1.1をphpenvで操作できるようにしたいとき
ln -s /Applications/MAMP/bin/php/php7.1.1 $(phpenv root)/versions/7.1.1
```


## いつも通り使う

`phpenv versions` に先ほどのMAMPのPHPが出てくるようになるので、普通に使います。

```
$ phpenv versions
  system
* 7.0.12 (set by /Users/kikuchy/.anyenv/envs/phpenv/version)
  7.1.1
$ phpenv global 7.1.1
$ phpenv rehash
```

# おまけ

MAMPみたいな大きなプログラムを入れるのは嫌！　みたいな方は、MAMPから必要なdylibとかだけ取り出して、 install_name_tool とかでphpのリンクテーブル書き換えて、phpenvのversions以下にディレクトリ置けば、それでも使えると思います。
ライセンス的にどうなのか知らないので試してませんが。
AthenaのAPI操作をIAMで制御

## Athena のAPIは今のところこれ

```
pioho $ aws athena help
:
AVAILABLE COMMANDS
       o batch-get-named-query

       o batch-get-query-execution

       o create-named-query

       o delete-named-query

       o get-named-query

       o get-query-execution

       o get-query-results

       o help

       o list-named-queries

       o list-query-executions

       o start-query-execution

       o stop-query-execution
```

## クエリ実行して、クエリの状態見て、結果を得る

### start-query-execution

※ちなみにOutputLocationでクエリ結果がS3に出力されますが、これ必須です。つけないとエラーです。今のところそういった仕様です。

```
pioho $ aws athena start-query-execution --query-string "select * from sampledb.elb_logs limit 10" --result-configuration OutputLocation=s3://aws-athena-query-results
{
    "QueryExecutionId": "0ec3a09e-144b-4a6c-b2f4-a2fb790e4141"
}
```

### get-query-execution

```
pioho $ aws athena get-query-execution --query-execution-id 0ec3a09e-144b-4a6c-b2f4-a2fb790e4141
{
    "QueryExecution": {
        "Status": {
            "SubmissionDateTime": 1499483900.008, 
            "State": "SUCCEEDED", 
            "CompletionDateTime": 1499483901.083
        }, 
        "Query": "select * from sampledb.elb_logs limit 10", 
        "Statistics": {
            "DataScannedInBytes": 282613, 
            "EngineExecutionTimeInMillis": 956
        }, 
        "ResultConfiguration": {
            "OutputLocation": "s3://aws-athena-query-results/0ec3a09e-144b-4a6c-b2f4-a2fb790e4141.csv"
        }, 
        "QueryExecutionId": "0ec3a09e-144b-4a6c-b2f4-a2fb790e4141"
    }
}
```

### get-query-results

```
pioho $ aws athena get-query-results --query-execution-id 0ec3a09e-144b-4a6c-b2f4-a2fb790e4141
{
    "ResultSet": {
        "Rows": [
            {
                "Data": [
                    {
                        "VarCharValue": "request_timestamp"
                    }, 
                    {
                        "VarCharValue": "elb_name"
                    }, 
                    {
                        "VarCharValue": "request_ip"
                    }, 
                    {
                        "VarCharValue": "request_port"
                    }, 
                    {
                        "Var
:
:
:
```

## getresultを拒否する

### IAM ポリシーをDenyで作成し適用(画像は許可だど..)

<img width="643" alt="スクリーンショット 0029-07-08 11.35.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/dbf8b5fe-e641-406d-dfc3-4b93536eddf3.png">

### Deny get-query-results

```
pioho $ aws athena get-query-results --query-execution-id 0ec3a09e-144b-4a6c-b2f4-a2fb790e4141
An error occurred (AccessDeniedException) when calling the GetQueryResults operation: User: arn:aws:iam::xxxxxxx:user/piko is not authorized to perform: athena:GetQueryResults
```

## AWS Organization

こちらでも制御できるのでAthenaだけ実行させたいアカウントとかもいいかもね

<img width="1030" alt="スクリーンショット 0029-07-08 13.18.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/e13d0850-01e8-eb0f-1040-1d1d1653e39d.png">

## あとは

リソースをもう少し細かく制御できるといいなぁと