OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Linux 2でPHP7.2をインストールする


## デフォルトのPHPバージョンは5.4

Amazon Linuxのバージョン

```bash
$ cat /etc/system-release
Amazon Linux release 2.0 (2017.12) LTS Release Candidate

```

そのまま`sudo yum install php`を実行すると、PHP5.4がインストールされる。（セキュリティサポートは2015年9月で終わっているはず。。）

※2018年3月時点です。

## Amazon Linux 2のExtras Libraryを利用する

Extras LibraryのPHP7.2をインストールすれば、yumでPHP7.2がインストールできる。

```bash
$ sudo amazon-linux-extras install php7.2

$ sudo yum install php php-mbstring

======================================================================================================
 Package                アーキテクチャー バージョン                 リポジトリー                 容量
======================================================================================================
インストール中:
 php                    x86_64           7.2.0-3.amzn2.1            amzn2extra-php7.2           2.9 M
 php-mbstring           x86_64           7.2.0-3.amzn2.1            amzn2extra-php7.2           504 k
依存性関連でのインストールをします:
 oniguruma              x86_64           5.9.5-3.1.amzn2            amzn2-core                  129 k
 php-cli                x86_64           7.2.0-3.amzn2.1            amzn2extra-php7.2           4.4 M
 php-common             x86_64           7.2.0-3.amzn2.1            amzn2extra-php7.2           1.1 M
 php-json               x86_64           7.2.0-3.amzn2.1            amzn2extra-php7.2            70 k

トランザクションの要約
======================================================================================================
インストール  2 パッケージ (+4 個の依存関係のパッケージ)
```
自然言語処理始めました


いろいろあって自然言語処理をやることになりました。

一言で機械翻訳と言っても、やはり複数の分野から構成されていて、
・データ解析
・自然言語処理
・機械学習
と、ただでさえ重い内容がいっぱいあってとても重い。処理内容的にも、とても重い。
翻訳のための機械学習も、現在の主流はディープラーニングなので、必要な学習データ量や計算資源がとんでもないのがハードル高い。

google翻訳あるし敵わないからやる価値なくね？とかいうな。
そういうこと言えてしまう人間の方が存在価値ないぞ。

ということで最初に参考になったHPを紹介してみる。

#最初に参考になったHP
・Python による日本語自然言語処理(http://www.nltk.org/book-jp/ch12.html)
『入門　自然言語処理』の日本語版で追記された第12章のみ、無償で公開されている。
無償で公開している内容にもかかわらず、日本語における自然言語処理の概要を把握するのに十分な内容がまとまっている。

・首都大学東京 小町研HP(http://cl.sd.tmu.ac.jp/)
自然言語処理界隈についてよくまとめられている。
というか『自然言語処理が学べる研究室』と『自然言語処理を独習したい人のために』で得られる情報が、初学者にとってありがたいうえこの上ない。

・言語処理100本ノック (http://www.cl.ecei.tohoku.ac.jp/nlp100/)
もはや鉄板の言語処理練習教材らしい。
pythonでの文字列処理を学ぶのにも優秀。

険しい道のりだけど、こつこつと精進していきます。


#以下、学習に使ったHP

##言い換え系論文リスト
・否定の焦点情報アノテーション　電通大 松吉俊　2014/4/1
https://www.jstage.jst.go.jp/article/jnlp/21/2/21_249/_article/-char/ja/
・日本語文章に対する述語項構造アノテーション仕様の考察 2014/4/1　〇
https://www.jstage.jst.go.jp/article/jnlp/21/2/21_333/_article/-char/ja/
・言い換え技術に関する研究動向 乾健太郎 2004/
https://www.jstage.jst.go.jp/article/jnlp1994/11/5/11_5_151/_pdf/-char/ja
・ニューラルネットワークによる日本語述語項構造解析の素性の汎化 乾健太郎 2017/3
http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/B4-5.pdf
・日本語述語項構造アノテーションにかかわる諸問題の分析　　松林雄一郎　2013/11/15
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=95868&file_id=1&file_no=1
・日本語深層格の自動抽出のためのコーパス開発 2012/3
http://www.anlp.jp/proceedings/annual_meeting/2012/pdf_dir/P1-3.pdf
・二格深層格の定量的分析 2014/3
http://www.anlp.jp/proceedings/annual_meeting/2014/pdf_dir/P5-3.pdf
・機械学習を用いた二格深層格の自動付与の検討 2014/3
http://box.jnlp.org/arc/14/14NLP-takeno.pdf
・格助詞「に」の深層格推定 -格助詞の意味再考- 2008/11/19
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=47665&file_id=1&file_no=1
・頑健な格解析を実現する各フレーム辞書の自動構築 2002/2
http://nlp.ist.i.kyoto-u.ac.jp/member/kawahara/paper/NLP2002-2.pdf
・文体と難易度を制御可能な日本語機能表現の言い換え
https://www.jstage.jst.go.jp/article/jnlp1994/15/2/15_2_75/_pdf/-char/ja

##スライド
・統計的係り受け解析入門 2010/10/10
https://www.slideshare.net/unnonouno/ss-5724050
・述語項構造と照応関係のアノテーション
http://www.anlp.jp/anniversary/20th_sympo/slide_iida.pdf
・統計的係り受け解析入門
https://www.slideshare.net/unnonouno/ss-5724050
・自然言語処理プログラミング（ビタビアルゴリズムについての参考になった）
http://www.phontron.com/slides/nlp-programming-ja-04-ws.pdf

##その他
・格文法と格フレーム
http://www.jaist.ac.jp/~kshirai/lec/i223/06.pdf
・自然言語処理 主要研究室まとめ
http://cl.sd.tmu.ac.jp/prospective/labs
・言語情報処理用語集
http://www.jaist.ac.jp/project/NLP_Portal/doc/glossary/#i0198
・KNP
http://nlp.ist.i.kyoto-u.ac.jp/?KNP
絵文字機能を無効にする

特定の文字を入力したときに自動的に表示される絵文字は英語圏向けなので，あまり使われません．その機能を無効にするためのコードです．

```php:stinc/src/basic/no-emoji.php
function disable_emoji() {
	remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
	remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
	remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
	remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
	remove_action( 'wp_print_styles', 'print_emoji_styles' );
	remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
	remove_action( 'admin_print_styles', 'print_emoji_styles' );
	remove_action( 'embed_head', 'print_emoji_detection_script' );
}
```
webサイトを作る際に参考にした記事の備忘録③：レスポンシブ対応

#レスポンシブ対応をしようと思ったら、見事にPCサイズのサイトデザインが崩れた。
崩れてしまったものはしょうがない。
初めてのレスポンシブ対応に四苦八苦しています。
元のhtmlの書き方が悪いのかとか、cssでの書き方で何がまずいのか、どこから手をつけたらいいのかと悩みながら検索してたどり着いた記事の備忘録になります。

他のサイトのレスポンシブ対応がどうなっているのかを確認しながら、ひとつひとつ潰しながら学ぶしかないです……。
まず、解決したい項目を列挙し、各項目に対する対策を一つずつ考えていきたいと思います。

##まずレスポンシブ対応するために、何をしなければならないのか。
最初は単純に幅狭めたらどうなるかを確認したあと、基本的なレスポンシブ対応でするべき最低限のところは何か、と探しました。

[レスポンシブWebデザインについて知っておきたいこと【コーディング編】](http://www.asobou.co.jp/blog/web/responsive2)

基本中の基本ですね。
<head>内へのviewportの設定。
css内での`@media screen and (max-width: 680px)`の記述。
基本的なスタートラインはここからだと、せっせせっせと参考にしてソースに記述しました。


##PCサイズの時ではなく、タブレットサイズ以下のフォントサイズを画面に合わせて拡大縮小したい。
まず色々なサイトを見て気づいたことなのですが、画面幅に合わせてフォントサイズが変わっているのをよく目にしました。
最初は `@media screen and (max-width: 680px)`の`max-width`のサイズごとに、`font-size`を指定して、追記していこうと思っていたのですが、それとはまた違う方法が用いられているのかなと検索しました。

[[CSS]レスポンシブ対応の文字サイズを指定するこれからのテクニック](https://coliss.com/articles/build-websites/operation/css/font-size-used-responsive-scales.html)

自分が表示したい文字のサイズによって、計算式があるようなのですが、自動計算してくれるオンラインツールも紹介されていました。
[[CSS]レスポンシブ対応のフォントサイズの指定方法 -デスクトップやスマホのビューポート幅（vw）に対して文字サイズを変化させる](https://coliss.com/articles/build-websites/operation/css/font-size-generator-for-responsive.html)


##もう少しレスポンシブ対応しやすいソースの書き方はないものだろうか、と思った中で出会ったGrid。
今回は使わない予定ですけれど、これを見かけたときは対応ブラウザを再度確認して、使えたら使いたいなと思いました。
あとで使ってみたいです。

[CSSグリッドレイアウトで、サイズが違う複数のボックスをタイル状に配置する](https://www.webcreatorbox.com/tech/css-grid-layout)


まだレスポンシブ対応を学び始めたばかりなので、気になる記事をまた探したいです。
atom・pythonで競技プログラミングのテスト環境構築

最近競技プログラミング始めましたのでその時の環境構築について書きます．
atom上でプログラムをテストを実行するため，pythonの標準入出力をファイルに繋ぎました．
他の人がどんな感じでやっているか分からなかったのでそうしたのですが，他のやり方があったら教えて頂けると嬉しいです．

#atomのインストール
まずatomをインストールします．atomは非常に人気の高いテキストエディタの一つです．
atomはlinux，mac，windowsに対応しています．
今回はwindows10にインストールします．
まず[公式サイト](https://atom.io/)に入りダウンロードします．次にダウンロードしたインストーラを起動してインストールします．
インストールが終わるとatomが起動します．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246521/0ff23cd4-7e16-1660-754f-59e9deedf106.png)

#atomの設定
次に日本語化を行います．上のメニューの「File」→「setting」をクリックすると新しく「setting」というタブが出てくるので「Install」を選択します．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246521/37087890-ea6d-fda5-088d-8767210da3e1.png)

そして右側のSearch packagesの部分に「japanese-menu」と打ち込むと「japanese-menu」というパッケージが出てくるのでインストールします．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246521/166b951a-0d9a-03b6-2e68-5d53d2fefa7a.png)

次にatom上でターミナルが使用できるようにします．先ほどのSearch packageの部分に「terminal」と打ち込むと「platformio-ide-terminal」というパッケージが出てくるのでインストールします．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246521/b01fbf48-a272-779b-ac8b-a762737f211a.png)

すると画面下側に小さい「+」マークが出現します．それをクリックするとターミナルが起動します．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246521/9a0ff51a-cc6a-f961-8954-5cb9328c2879.png)

さてこれでatomの設定は終わりました．

#プログラミング・実行

まず「ファイル」→「フォルダを開く」から作業するフォルダを開きます．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246521/bbd21a15-0e7b-762a-8f26-ea2ba24ca03d.png)

そうすればフォルダが表示されるので右クリックして新規ファイルを作成します．
私は競技プログラミングで使用される入力を別のファイルに書いて動かしています．
python3による競技プログラミングでは入力は一行毎にinput()関数で取ることが多いです．
input()関数は標準入力に対応しています．
なので標準入力をそのファイルに繋ぐための処理を実行するファイルの先頭に記述しております．

```python:test.py
import sys
import os
f = open('input.txt', 'r')
sys.stdin = f
```

後は通常のプログラミングと同じです．
簡単なサンプルを動かします．

```input.txt
Hello World 
```
```python:test.py
import sys
import os
f = open('input.txt', 'r')
sys.stdin = f

x = input()
print(x)
```
としてターミナルから「python test.py」と打ち込むと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246521/827690e1-efa4-36e3-f54c-bcc8ee8ab035.png)

こんな感じで動きます．

#参考資料
[標準入出力をファイルへ移し替える](http://lightson.dip.jp/zope/ZWiki/169_e6_a8_99_e6_ba_96_e5_85_a5_e5_87_ba_e5_8a_9b_e3_82_92_e3_83_95_e3_82_a1_e3_82_a4_e3_83_ab_e3_81_ab_e3_81_a4_e3_81_aa_e3_81_8e_e6_8f_9b_e3_81_88_e3_82_8b)
[すぐ分かる！Atomエディタのインストールと日本語化，便利な使い方](https://eng-entrance.com/atom-editor)
Amazon QuickSightでAmazon Athenaのデータを可視化・分析する、の準備。2018-04-04

# 内容
* QuickSightでAthenaからデータをselectし、そのデータを可視化・分析する準備をします
* 主にAthenaのデータからQuickSightのdata set作成するところをまとめます

# Edit QuickSight read-only access to AWS resources
Athenaからデータを取得するとき、`Edit QuickSight read-only access to AWS resources` の設定で

* Amazon Athena
* Amazon S3

の2つにチェックを入れる必要がありそう。

Athenaだけにチェックを入れてもデータが読み出せない。 

# data setを作る
* QuickSightの上部にある「New analysis」か「Manage data」をクリックします。<br>![スクリーンショット 2018-04-04 17.45.01.png](https://qiita-image-store.s3.amazonaws.com/0/3800/bc1827f7-078b-b6f3-cfc6-46f364a6cbea.png)
* 「New data set」からデータセットを作成します。<br>![スクリーンショット 2018-04-04 17.46.49.png](https://qiita-image-store.s3.amazonaws.com/0/3800/49115cb5-cb14-244e-122e-e46687507931.png)
* data setを選ぶ画面に遷移します。Athenaを使うのでクリックします。<br>![スクリーンショット 2018-04-04 17.47.17.png](https://qiita-image-store.s3.amazonaws.com/0/3800/ff266a83-f1b7-f572-b8d3-9513181d8f0d.png)
* 適宜、名前をつける。<br>![スクリーンショット 2018-04-04 17.57.01.png](https://qiita-image-store.s3.amazonaws.com/0/3800/1f9875d6-5f0f-523d-da13-99888b850db8.png)
* Database、Tableを選ぶ。<br>![スクリーンショット 2018-04-04 17.58.20.png](https://qiita-image-store.s3.amazonaws.com/0/3800/a5319b0f-0a14-75c0-a265-6f8fb2aba5ae.png)
* importするかどうかを選びます。<br>![スクリーンショット 2018-04-04 18.22.48.png](https://qiita-image-store.s3.amazonaws.com/0/3800/744ef33b-2f3e-8c2c-8044-c9e78bf5120f.png)

以上で完了です。

# まとめと課題
ぽちぽちして簡単にdata setが作成できました

Athenaのテーブルが1個しか選べなかった
~~QuickSightでJOINとかできないのだろうか~~
**=> 追記**
「Data source」を編集する画面から、Tableが追加できた。Joinもできそう
Mac版Microsoft Office 2016のExcelでファイルを開くときの通知を回避する手順

# はじめに

数ヶ月前からExcelのファイルを開こうとすると「'〇〇.xlsx'の一部の内容に問題が見つかりました。可能な限り内容を回復しますか？ブックの発行元が信頼できる場合は、[はい]をクリックしてください。」という通知が表示されるようになりました。

![スクリーンショット 2018-04-04 6.10.23.png](https://qiita-image-store.s3.amazonaws.com/0/114240/39d306f6-41be-e7fd-c757-1cdca011639f.png)

「はい」をクリックして不要な情報を削除すると通常どおり使えるようになるのですが、保存時に名前をつけて保存する操作が必要になり、なんとなく困っていたのですが、ある操作をしたらここ数日出なくなったので、以下に手順をまとめます。

# ファイルを閉じる前のひと手間

ファイルを保存する前にIMEを英数半角モードにして、セルに何か文字を入力してからそれを消して保存します。

以上。

とりあえず、いくつか通知の出ていたファイルで通知が出なくなってくれてとても嬉しい(^_^;)

# 追記

しばらくひと手間を心がけていてわかったこととして、一度上記の操作をしたファイルはしばらく上記の操作をしなくてもエラーがでなくなるようです。
ということで、エラーが出たファイルのみ上記の操作をして終了するという運用で、全然違和感なく利用できてます(^-^)/

# 追々記

どうやら最後の入力した文字が半角のアルファベットか数値でない場合に、上述のエラーが出るので、保存の前に半角で文字を入力してから保存するというのはいつも心がける必要がありそうです。
CD/DVDをデータとして保存しておくメモ

# 部屋、狭い…
HDDのGB単価も随分下がって、今や\15kもあれば6TB買えてしまうそうなので、1枚0.00065TBとかの円盤は全部データ化してフリスビーにでもしまったほうが居住スペースに優しい！エコ！
計算してみると1HDD(6TB)≒9230CD(650MB)！！！
お財布に優しい4TBくらいに抑えたとしても数千枚のディスクがコースターに早変わり！！！！

と思ったのでデータを抜きぬきしたときのメモです。

# データCD/DVDはisoファイルに
```bash
ddrescue -n -v /dev/sr0 ${OUTFILENAME}.iso ${OUTFILENAME}.log
```
-nオプションをつけるとエラーセクタは無視して読めるところだけ拾ってくれるらしい？
今のところエラー出るディスクがないのでddでもいいのかも。
あとは-rオプションをうまく使ってエラーセクタを何度か読んでみるといいとかなんとかかんとか。

# 音楽CDはwav+cueに
```bash
abcde -1 -n -N -x -a default,que -o wav
```
最初ddrescueでiso化鉄板だべ？と思って試したらエラーまみれで死んだので別の方法を探してGoogleを放浪することになった。
「Audio CD」とかで検索していたのですが、「CDDA」って呼ぶんですね、これ。ググ力が1上がった。
で、cdrdaoってツールで行けるよ！！（意訳）って記述が山ほど引っかかったので大勝利！ガハハハ！！と実行してみたらsegfaultで死にまくって死んだ魚のような目になった。
しかたないのでabcdeって別のツールを使ってみたらシャッキリポン！と抜けたのでまぁこれでいいんじゃないかな。
ubuntu16.04LTSだとデフォルト入らないみたいだからよろしくインストールする

```bash
sudo apt-get install abcde
```

-1ってオプションでトラックを分けずに1ファイルにまとめなさる
-nはCDDBの問い合わせをしない。個人で焼いたCDとかだとトラック情報なんて無いものね。たまたま別のトラック情報が引っかかって嘘名称になるよりはいっそ不明なアーチストみたいにしておいたほうが自分は気が楽。
-NはCDDBの編集するかい？って問い合わせにNoを叩きつけてくれる。いちいちN押してEnterするの面倒な時に。
-xはリード終わったらEjectして下さる。Ejectボタン押すのすら面倒な時に。
-oはアウトプットのファイル形式らしい。デフォルトoggでflacとかも選べるよ。
-aはコピペままだから分からないが、不都合はないのでそのままにしている…。

# まとめ
一つのツールでデータ音楽問わずiso1ファイルにできたら楽なのに、と思わずにはいられない春の日だった。
Linuxの基本コマンド集②2018/04/04

2日目からかなり難しくなってきた。

ディレクトリ作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247308/73b8c5a2-c9a0-0aef-7c4a-20ab981846de.png)
1,1-2,1-3,1-4,1-5に2018cal.txtをコピーそれを一行でおこなう
mkdir -p 20180404/1/2/3/4/5
cd 20180404
mkdir 1-2
mkdir 1-3
mkdir 1-4
mkdir 1-5
cal > 2018cal.txt
cp 2018cal.txt 1-2; cp 2018cal.txt 1-3; cp 2018cal.txt 1-4 ; cp 2018cal.txt 1-5; cp 2018cal.txt
ls -l

```
[root@ik1-331-25935 home]# mkdir -p 20180404/1/2/3/4/5
[root@ik1-331-25935 home]# cd 20180404
[root@ik1-331-25935 20180404]# mkdir 1-2
[root@ik1-331-25935 20180404]# mkdir 1-3
[root@ik1-331-25935 20180404]# mkdir 1-4
[root@ik1-331-25935 20180404]# mkdir 1-5
[root@ik1-331-25935 20180404]# cal > 2018cal.txt
[root@ik1-331-25935 20180404]# cp 2018cal.txt 1-2; cp 2018cal.txt 1-3; cp 2018cal.txt 1-4 ; cp 2018cal.txt 1-5; cp 2018cal.txt 
[root@ik1-331-25935 20180404]# ls -l
total 4
drwxr-xr-x 3 root root  32 Apr  4 17:45 1
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-2
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-3
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-4
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-5
-rw-r--r-- 1 root root 133 Apr  4 17:43 2018cal.txt
```

mv 1/2018cal.txt 1/2018.txt.1 
%20180404ディレクトリから1ディレクトリにあるファイルを2018.txt.1に変更
cd 1
ls -l

```
[root@ik1-331-25935 20180404]# mv 1/2018cal.txt 1/2018.txt.1
[root@ik1-331-25935 20180404]# cd 1
[root@ik1-331-25935 1]# ls -l
total 4
drwxr-xr-x 3 root root  14 Apr  4 17:42 2
-rw-r--r-- 1 root root 133 Apr  4 17:45 2018.txt.1
```

cp 2018.txt.1 ../20180404.txt
%2018.txt.1を20180404ディレクトリにファイル名を20180404.txtに変えてコピーする

```
[root@ik1-331-25935 1]# cp 2018.txt.1 ../20180404.txt
[root@ik1-331-25935 1]# cd ..
[root@ik1-331-25935 20180404]# ls -l
total 8
drwxr-xr-x 3 root root  31 Apr  4 18:03 1
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-2
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-3
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-4
drwxr-xr-x 2 root root  24 Apr  4 17:45 1-5
-rw-r--r-- 1 root root 133 Apr  4 18:14 20180404.txt
-rw-r--r-- 1 root root 133 Apr  4 17:43 2018cal.txt
```
Xcode9.3アップデート時のlibxml2のエラーの対処法

2018/3/29にリリースされたXcode9.3（9E145）でアップデートした際にエラーが発生してビルドできなくなったのでその対処法のメモです。

# エラー内容
Objective-CコードのXMLパース処理で以下のエラーが発生していました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113553/dadeb531-9e12-406f-0c8c-9e9d50fb7eb3.png)

> Use of undeclared identifier 'XML_SAX2_MAGIC'
> Definition of '_xmlSAXHandler' must be imported from module 'libxml2.parser' before it is required

# 対処方法
以下のようにlibxmlの必要なファイルをインポートするとビルドできるようになります。

```objc
#import <libxml/parser.h>
```
JavascriptのFunctionオブジェクトの特性

## 関数は常に値を返す
これまであまり意識していませんでしたが、関数の`return`文を書かなかったり、`return`に何も指定しない場合、その関数は`undefined`を返します。

```javascript:script.js
const func1 = function() {
	return 'hello!';
}
console.log(func1());  // 'hello'


const func2 = function() {
	console.log('good morning');
}
console.log(func2());	  // undefined


const func3 = function() {
	console.log('good night');
}
console.log(func3());  // undefined

```


## Javascriptの関数は第一級関数
Javascriptの関数はオブジェクトなので、変数などに「値」として格納することができます。また、関数を関数の引数や戻り値にすることもできます。
第一級関数は下記の性質を持つ関数です。

- 変数やデータ構造に格納することができる
- サブルーチン（関数やプロシージャ）のパラメータとして渡すことができる
- サブルーチン（関数やプロシージャ）の戻り値となることができる
- 実行時に生成することができる
- 独自の存在を持つ（名前によらない存在である）


## 関数の実行方法はいろいろある
Javascriptの関数は`function`文で宣言した名前の後ろに`()`を付けて実行するのが一般的ですが、他にも実行方法があります。

### 関数として実行

```javascript:func1.js
const func1 = function() {
	return 'as a function';
}
console.log(func1());	// 'as a function'
```

### メソッドとして実行

```javascript:func2.js
const myObj = {
	func2: function() {
		return 'as a method';
	},
};
console.log(myObj.func2());	// 'as a method'
```

### コンストラクタとして実行

```javascript:func3.js
const myPC = function() {
	this.memorySize = 8;
	this.cpuClock = 2.7;
	this.displaySize = 14;
	this.getMemorySize = function() {
		return this.memorySize;
	}
}
const pc = new myPC();
console.log(pc);	// pcオブジェクトとそのプロパティ
```

### appy()もしくはcall()を使って実行
```javascript:func4.js
const greet = {
	runGreet: function() {
		console.log(this.name, arguments[0], arguments[1]);
	}
}

const cody = { name: 'cody' };
const lisa = { name: 'lisa' };

greet.runGreet.call(cody, 'foo', 'bar');	// cody foo bar
greet.runGreet.apply(lisa, ['foo', 'bar']);  // lisa foo bar
```

## 無名関数
無名関数は名前がない関数で、主に引数として他の関数に渡すために利用されます。

```javascript:noname.js
const sayHi = function(f) {
	f();	// 引数として渡された関数fを実行
}

sayHi(function() { console.log('hi') });	// 'hi'

```

## 関数式を即時実行
関数式（=Functionコンストラクタで生成された関数を除く全ての関数）は、関数定義の後に`()`を付与することで即時実行ができます。

```javascript:immediate.js
const sayHi = function() {
	console.log('hi');
}();	// 'hi'
```

## 無名関数の即時実行
関数式と同様に、無名関数も即時実行ができます。

```javascript:noname-immediate.js
(function(msg) {
	console.log(msg);
})('hi');
```

括弧でくくるのは、「式」として扱うようにするためです。


## 関数の巻き上げ
Javascriptでは、関数宣言（function文）を使って、定義される前に関数を実行することができます。
Java等のサーバサイドの言語を経験している人にとっては不自然でないかもしれません。

```javascript:calc.js
console.log(sum(2, 2));
function sum(x, y) {
	return x + y;
}
```

関数を変数に代入した場合は解釈されません。

```javascript:calc.js
console.log(sum(2, 2));
const sum = function(x, y) {
	return x + y;
}
```
addEventListener の once オプションの Polyfill

IE で効かないので作った。
第3引数に Object を許容するので IE で効かないけど `passive`　も使える。
~~面倒というか他にやり方わからなかったので、元の `addEventListener` を `__addEventListener` ってプロパティで `window` と `Element.prototype` に退避もとい汚染してるので宜しくはないでしょうけど。~~

```js
let _isSupportsOptions = false;

window.addEventListener('test', null, {
  get once() {
    _isSupportsOptions = true;
    return false;
  }
});

if (!_isSupportsOptions) {
  const _addEventListener = Node.prototype.addEventListener;
  const _removeEventListener = Node.prototype.removeEventListener;
  const _preventDefault = Event.prototype.preventDefault;

  const _addFn = function (eventType, listener, opts = false) {
    const _target = this;
    const _isObj = typeof opts === 'object';
    const _capture = _isObj && 'capture' in opts && opts.capture === true;
    const _once = _isObj && 'once' in opts && opts.once === true;
    const _passive = _isObj && 'passive' in opts && opts.passive === true;
    ({
      handleEvent: function (e) {
        if (_once) {
          _removeEventListener.call(_target, eventType, this, _capture);
        }
        e.__passive = _passive;
        listener(e);
      },
      add: function () {
        _addEventListener.call(_target, eventType, this, _capture);
      },
    }).add();
  }

  const _removeFn = function (eventType, listener, opts = false) {
    const _target = this;
    const _capture = 'capture' in opts && opts.capture === true;
    _removeEventListener.call(_target, eventType, listener, _capture);
  };

  const _preventDefaultFn = function () {
    if(this.__passive) {
      console.error('Unable to preventDefault inside passive event listener invocation.');
      return;
    }
    _preventDefault.apply(this);
  }

  Object.defineProperty(Node.prototype, 'addEventListener', {
    get: function () {
      return _addFn;
    },
  });

  Object.defineProperty(Node.prototype, 'removeEventListener', {
    get: function () {
      return _removeFn;
    },
  });

  Object.defineProperty(Event.prototype, 'preventDefault', {
    get: function () {
      return _preventDefaultFn;
    },
  });

}
```

## DEMO
<p data-height="265" data-theme-id="0" data-slug-hash="ZxjmGN" data-default-tab="result" data-user="syuji-higa" data-embed-version="2" data-pen-title="addEventListener options polyfill" class="codepen">See the Pen <a href="https://codepen.io/syuji-higa/pen/ZxjmGN/">addEventListener options polyfill</a> by syuji-higa (<a href="https://codepen.io/syuji-higa">@syuji-higa</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
シェルスクリプトを書く際にifを事前チェックするためのfunction

# ほしいもの

shellscriptを書く際のif文をチェックしたい。

# 対応

以下のコードをzshrcに入れた。

```bash
function bool {
  eval "
  if [[ $@ ]] ; then
    echo 'true'
  else
    echo 'false'
  fi
  "
}
```

以下みたいに使う。

```shell_session
$ bool -f .zshrc
true
$ bool ! -f .zshrc
false
```

# 気持ち

ちょっと作業を自動化したいときにシェルスクリプト書くじゃないですか。
↓みたいなやつ。

```bash
if [[ `date` =~ 水曜日 ]]; then
  echo '今日は水曜日なので可燃ごみ';
fi
```

このifの中身の書式にいつも戸惑ってる上に、いちいちシェルスクリプト実行してチェックしてるのでとても生産性が低かった。

なんか既存のものがあったら悲しいですが教えてください。
Go言語はじめました　その3

#はじめに
[前回](https://qiita.com/thimi0412/items/b0f527a284a539c8d21f#naked-return)の続き、今回は制御構文

#for
```go
package main

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	println(sum)
}
```
```
45
```
率直にいってC言語から```()```をとっただけ

ちなみに```fmt.Println()```ではなく```println```で出力していますが```println```では出力のフォーマットができないので```fmt```のパッケージにある```Printf```関数は使いましょう
実際ただ出力するなら```println```でも事足りると思います

```for {}```のように条件を指定しなければ無限ループができます(いつ使うんや？)


###whileがない!?
```go
package main

func main() {
	sum := 1
	for sum < 100 {
		sum += sum
	}
	println(sum)
}

```
```
128
```
Goでは```while```がなく```for```を使って```while```のように書きます
正直びっくり（実際最近while使ってないけど）

#if
```go
package main

import "math/rand"

func main() {
	var num = rand.Intn(15)
	if num >= 10 {
		print("10以上")
	} else if num >= 5 {
		print("5以上")
	} else {
		print("4以下")
	}
}

```

やっぱり```()```がなくなっただけ、みなさんおなじみのif文です

###ifステートメント
```go
package main

import "math"

// targetのn乗がlimitを超えているか判定する関数
func checkPowLimit(target, n, limit float64) bool {
	if v := math.Pow(target, n); v <= limit { //<- ここ!
		return true
	} else {
		return false
	}
}

func main() {
	println(checkPowLimit(2, 3, 10))
	println(checkPowLimit(2, 4, 10))
}
```
```
true
false
```

forと同じように条件を記述する前に　簡単なステートメントを記述することができます
ここではtargetのn乗をvに代入した後、評価をしています

#switch
```go
package main

import "runtime"

func main() {
	switch os := runtime.GOOS; os {
	case "darwin":
		print("Mac!")
	case "linux":
		print("Linux")
	default:
		print(os)
	}
}
```
switchですがGoでは選択されたcaseのみを実行するので他の言語でいう```break```を書く必要がありません
これは地味に嬉しいヾ(o´∀｀o)ノﾜｧｰｨ♪

###switchでもif else
```go
package main

import "time"

func main() {
	t := time.Now()
	switch {
	case t.Hour() < 12:
		print("Good morning!")
	case t.Hour() < 17:
		print("Good afternoon")
	default:
		print("Good evening")
	}
}
```
こんな感じでもかけます　```if else```より見やすい気がしないでもない

#Defer
```go
func main() {
	defer print("World")

	print("Hello")
}
```
```
HelloWorld
```

deferは呼び出された関数が終了するまで実行されません(ぶっちゃけいつ使うんや？)


###Stacking defers
```go
package main

func main() {
	for i := 0; i < 10; i++ {
		defer println(i)
	}
	println("Start!")
}
```
```
Start!
9
8
7
6
5
4
3
2
1
0
```

deferは複数使えるらしい(スタックっぽい、いやむしろスタック)
これがFILOってやつか！ なんかの授業でやった記憶がpushとかpopとか
C++ Builder 10.2 Tokyo Update 3 > MinimizeName() > 未解決のシンボル > 対処 | XE4では動作していた

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
RAD Studio 10.2 Tokyo Update 3
```

### エラー

MinimizeName()を使って表示文字列の短縮をしようとしたらエラーになった。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <FileCtrl.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String filePath = L"C:\Windows\System32\TemporaryFiles\readme.txt";

    Edit1->Text = filePath;

    Edit2->Text = MinimizeName(filePath, this->Canvas, Edit1->Width);
}
//---------------------------------------------------------------------------
```

Unit1.cppはビルドできるが、プロジェクトのメイクでエラーが出る。

> [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall Vcl::Filectrl::MinimizeName(System::UnicodeString, Vcl::Graphics::TCanvas *, int)' が ***\DEBUG\UNIT1.OBJ から参照されています

### 対処

`#include <FileCtrl.hpp>`
を
`#include <Vcl.FileCtrl.hpp>`
に変更する。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <Vcl.FileCtrl.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String filePath = L"C:\\Windows\\System32\\TemporaryFiles\\readme.txt";

    Edit1->Text = filePath;

    Edit2->Text = MinimizeName(filePath, this->Canvas, Edit1->Width);
}
//---------------------------------------------------------------------------
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e73af44a-2f5b-d732-b801-1ad5e49dbe21.png)

### link

http://docwiki.embarcadero.com/Libraries/Tokyo/en/Vcl.FileCtrl.MinimizeName

### XE4では動作していた

XE4では`#include <FileCtrl.hpp>`でもエラーが出ない。

http://docwiki.embarcadero.com/Libraries/XE4/en/Vcl.FileCtrl.MinimizeName

XE4の場合、本来は`#include <Vcl.FileCtrl.hpp>`にすべきであるが、`#include <FileCtrl.hpp>`でも動作するようになっていたようだ。

docwiki.embarcadero.comの記載でincludeファイルを確認する方が良いだろう。
Delphi で Hello,world. (コンソールアプリケーション)

# program HelloWorld;
プログラムの名前は HelloWorld なので、プロジェクトソースファイルは "HelloWorld.dpr" となります。

コンソールアプリケーションは [ファイル | 新規作成 | その他...] から **コンソールアプリケーション** を選ぶと作れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/0e640d6b-64af-10a0-0bee-a0fdbcf31958.png)

C で言う所の argc / \*argv[] を **program** ヘッダのパラメータとして指定したりはできません。同等の機能を持つ関数はそれぞれ [ParamCount()](http://docwiki.embarcadero.com/Libraries/ja/System.ParamCount) / [ParamStr()](http://docwiki.embarcadero.com/Libraries/ja/System.ParamStr) となります。

# {$APPTYPE CONSOLE}
プログラムの種類はコンソールアプリケーションです。[$APPTYPE 指令](http://docwiki.embarcadero.com/RADStudio/ja/Application_%E3%81%AE%E7%A8%AE%E9%A1%9E%EF%BC%88Delphi%EF%BC%89)が未指定だと {$APPTYPE GUI} を指定したのと同じになります。
# {$R *.res}
[$R 指令](http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%EF%BC%88Delphi%EF%BC%89)はプログラムにリソースを追加します。追加しておかないとウィルス対策ソフトに "ウィルスだ！" とレッテルを貼られる事があります。無能は嫌いなのです！
# uses
[uses 句](http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A8%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%EF%BC%88Delphi%EF%BC%89#.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.A0.E3.81.AE_uses_.E5.8F.A5)です。ここに書かれたユニットが使用されます。C / C++ とかで言う所の #include に近いです。
##  System.SysUtils;
[System.SysUtils](http://docwiki.embarcadero.com/Libraries/ja/System.SysUtils) を使います。

なくてもコンソールアプリケーションは作れますが、便利なルーチンが使えるようになります。
# begin
これがないと始まりません。
## Writeln('Hello,World.');
[Writeln()](http://docwiki.embarcadero.com/Libraries/ja/System.Writeln) 手続きで 'Hello,World.' を標準出力に出力します。
# end.
これがないと終わりません。ユニットの最後は . (ピリオド) で終わります...終止符を打つわけですね。

なお、最小の Hello.world コンソールアプリケーションは以下のようになります。

```pascal:HelloWorld.dpr
program HelloWorld;

{$APPTYPE CONSOLE}

begin
  Writeln('Hello,World.');
end.
```

なお、最小でないソースコードは右上にあります (w
PythonでbitFlyer/Zaif/coincheck/からビットコインの価格を取ってくる方法


#PythonでbitFlyer/Zaif/coincheck/からビットコインの価格を取ってくる方法

```
import requests

#bitFlyerからビットコインの価格を取得する
r = requests.get('https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY')
json = r.json()
print('bitFlyer  btc_jpy: ' + str(json["ltp"]))

# Zaifからビットコインの価格を取得する
r = requests.get('https://api.zaif.jp/api/1/ticker/btc_jpy')
json = r.json()
print('Zaif      btc_jpy: ' + str(json["last"]))

# coincheckからビットコインの価格を取得する
r = requests.get('https://coincheck.com/api/ticker')
json = r.json()
print('coincheck btc_jpy: ' + str(json["last"]))
```
Amazon QuickSightをはじめる。2018-04-04

# 内容
* [Amazon QuickSight](https://aws.amazon.com/jp/quicksight/)を使ってみます
    * Amazon QuickSightは「Fast, easy-to-use business analytics」だそうです
* 導入部分にしか触れませんん

# 料金
最初のアカウントは無料だそうです（2018-04-04現在）。無料で始められるのはうれしいです。

https://aws.amazon.com/jp/quicksight/#Pricing

![スクリーンショット 2018-04-04 17.17.09.png](https://qiita-image-store.s3.amazonaws.com/0/3800/e3059ef1-aa74-6221-b6c8-f1b65539a8ec.png)

# はじめる
* AWSにログインして、「Services」から「QuickSight」を選びます。
* Sign upの画面に遷移するので、Sign upします。![スクリーンショット 2018-04-04 17.19.30.png](https://qiita-image-store.s3.amazonaws.com/0/3800/4450b06c-2a50-25f6-e595-e2f457043743.png)
* プランを選びます。今回は「Standard」で行きます。![スクリーンショット 2018-04-04 17.29.32.png](https://qiita-image-store.s3.amazonaws.com/0/3800/31f72c8a-80ca-23be-a1e0-70fe4a6024c7.png)
* 各項目を埋めます。![スクリーンショット 2018-04-04 17.30.52.png](https://qiita-image-store.s3.amazonaws.com/0/3800/201cddee-93c1-9ed7-e4f9-eb242b0d5e19.png)
* 以上ではじめる準備は完了です！![スクリーンショット 2018-04-04 17.32.34.png](https://qiita-image-store.s3.amazonaws.com/0/3800/5e4ce524-7102-19f1-814d-ab2d18fda298.png)
* サンプルが用意されています。![スクリーンショット 2018-04-04 17.33.18.png](https://qiita-image-store.s3.amazonaws.com/0/3800/e92cb5b1-6c5d-42cd-9b72-9d7dc823ae84.png)

# まとめ
特に難しいところもなく、ぽちぽちして開始できました。
Swagger YAMLファイルをHTMLへ変換するdocker image 2

[Swagger YAMLファイルをHTMLへ変換するdocker image](https://qiita.com/nmatsui/items/ed9ae462141eeadb6f6a)では、[swagger2markup](https://github.com/Swagger2Markup/swagger2markup-cli)と[asciidoctor](https://asciidoctor.org/)を用いてHTMLを生成しましたが、[Spectacle](https://sourcey.com/spectacle/)というツールもイイカンジの静的なHTMLを生成してくれます。

![](https://sourcey.com/spectacle/screenshot.jpg)

ただ[Spectacle](https://sourcey.com/spectacle/)は外部のJSやCSSを読み込む形のHTMLを生成するため、[inline-source-cli](https://www.npmjs.com/package/inline-source-cli)を使ってJSとCSSを埋め込んだ単一HTMLファイルを生成するdocker imageを作成しました。

# 利用方法

SwaggerのYAMLファイルがあるディレクトリで、次のコマンドを実行してください。

```bash
docker run --rm --volume $(pwd):/mnt nmatsui/swagger2spectacle swagger_filename.yaml
```

Swagger YAMLファイルから生成したHTMLファイルが同じディレクトリに生成されます。

# Dockerfile

```dockerfile
FROM node:8.11-alpine
MAINTAINER Nobuyuki Matsui <nobuyuki.matsui@gmail.com>

WORKDIR /opt
COPY entrypoint.sh /opt/entrypoint.sh
RUN apk update && apk upgrade && \
    apk add --no-cache --virtual .build git && \
    git clone https://github.com/sourcey/spectacle.git /opt/spectacle && \
    cd /opt/spectacle && \
    npm install && \
    cd /opt && \
    npm install inline-source-cli && \
    apk del .build && \
    chmod 755 /opt/entrypoint.sh

ENTRYPOINT ["/opt/entrypoint.sh"]
```

# entrypoint.sh

```sh
#!/bin/sh

if [ $# -ne 1 ]; then
  echo "usage: docker run --rm --volume \$(pwd):/mnt nmatsui/swagger2spectacle swagger_filename.yaml"
  exit 1
fi

YAML_FILE=${1}
BASE_NAME=${YAML_FILE%.*}

if [ ! -e /mnt/${YAML_FILE} ]; then
  echo "${YAML_FILE} not found"
  exit 1
fi

node /opt/spectacle/bin/spectacle.js -t . /mnt/${YAML_FILE}
sed -i -e 's#<link rel="stylesheet" href="stylesheets/foundation.min.css" />#<link inline rel="stylesheet" href="stylesheets/foundation.min.css" />#' /opt/index.html
sed -i -e 's#<link rel="stylesheet" href="stylesheets/spectacle.min.css" />#<link inline rel="stylesheet" href="stylesheets/spectacle.min.css" />#' /opt/index.html
sed -i -e 's#<script src="javascripts/spectacle.min.js"></script>#<script inline src="javascripts/spectacle.min.js"></script>#' /opt/index.html
/opt/node_modules/.bin/inline-source --compress false index.html > /mnt/${BASE_NAME}.html

exit 0
```
CSSで最低限の高さを指定し、それ以上の場合はフレキシブルなBOXを作る。

cssで最低限の高さをBOXに作ってやり、
それ超えたら、フレキシブルにするCSSです。
久々にこれやって、あれ？って思ったので備忘録として書いておきますよ。

やるのは簡単これだけ！

```css.style.css
.box{
min-height:50px; 
height:auto !important; 
height:50px;
}
```
ElasticsearchのScriptを使った検索

ElasticsearchのScriptを使った検索
---

- scriptを使用することで、下記のような検索が可能です。

#### ▼ createdとmodifiedが等しいドキュメントの検索
```
GET index_name/type_name/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "script": {
                "script": "doc['created'].value == (doc['modified'].value)",
                "params": {}
              }
            }
          ]
        }
      }
    }
  }
}
```
Azure Data Lakeに触れてみた

[Azure Antenna](https://azure.connpass.com/) で開催されたData Lakeワークショップで、Azure Data Lakeに触れてきました。
触ってみた感想や手順等を残しておきます。

# Azure Data Lakeってなに？

分析ツールである「Azure Data Lake Analytics」と、データ格納領域の「Azure Data Lake Store」から構成されます。

## Azure Data Lake Analytics
* サーバレスの分析エンジン
* 親しみのあるSQLに近いU-SQL言語
* 柔軟なスケールで大量データ処理が得意
* ジョブ単位の課金

## Azure Data Lake Store
* どんなフォーマットのデータでも無制限に格納できるストレージ
* 分散型で分散処理パフォーマンスが高い
* OSSとの親和性

## ざっくり概要をまとめてみる
その名のとおり、ビッグデータにおけるデータレイクとしての活用が期待されるサービスですね。
Data Lake Storeにデータを溜めて、Data Lake Analyticsでクエリ投げて分析するといった感じです。

分析するか分からないけどとりあえずデータを入れておこう、分析が必要なら必要なデータだけクエリ発行して活用しよう。
という使い方になります。

Data Lake Storeはどんなフォーマットのデータでも格納できるというのがキモで、IISのログといったフラットファイルだけでなく、画像データなんかも格納できました。
ワークショップでは、画像データをData Lake Analytic ＋ Face APIで、人物を検出して結果を出力するということをやってみました。

AWSではS3をデータレイクとして活用しますが、AzureではData Lake Storeを使うということのようですね。

RDBMSと違って、頻繁な読み書きや細かいデータの参照や書き込みには不向きです。
大量のデータに対して分析することに向いています。

グラフにしたりといった可視化の機能は持っていないので、そこはPower BIを活用することになります。
Power BIからData Lakeに直接接続してクエリ結果を可視化することができます。
現時点ではPower BIからクエリ投げることはできませんが、そのうち対応するんじゃないかとのこと。

スケジューリング機能は持っていないので、定期的にクエリ投げたいといった場合は、Automationを使ったり、Data Factoryのスケジューリング機能で実現する必要があります。

あと現時点で日本リージョンにはきていません。

# Data Lake Storeにデータを格納するには？

* Azure Portal  
ワークショップではAzure Portalからデータをアップロードしました。
こんな感じで、ローカルPCのファイルを選んでData Lake Storeにアップロードできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/135f81a5-4a49-27dc-8a8d-0c54b2d2e00f.png)

他にもPowerShell,CLI,SQL Database,SQL Data Warehouse,Event Hub,Data Factory等があるようです。
Data Factoryが使えるので、オンプレDBでもRedshiftでもS3でも、様々なデータをData Lakeに集約することができそうです。
また、Event HubのCapture機能でData Lake Storeに直接データを保存できるので、ストリーミングデータも対応できるようです。

# U-SQLで分析してみた

## インプットデータ準備
* IISのログをAzure PortalからData Lake Storeにアップロードします。
* こんな感じのログ数万行です。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/574541fa-5070-c296-3432-00ab94e8926f.png)
<br>

## クエリ実行
* U-SQLを書きます。ここでは、IISログをスペース区切りで分割し、日付毎に、ヒット数、送信バイト、受信バイトを集計しています。

```sql
@log =
	EXTRACT
		date string,
		time string,
		client_ip string,
		username string,
		server_ip string,
		port int,
		method string,
		stem string,
		query string,
		status string,
		server_bytes int,
		client_bytes int,
		time_taken int,
		user_agent string,
		referrer string
	FROM "/iislogs/2008-01.txt"
	USING Extractors.Text(' ', silent:true);

@dailysummary =
	SELECT
		date,
		COUNT(*) AS hits,
		SUM(server_bytes) AS bytes_sent,
		SUM(client_bytes) AS bytes_received
	FROM @log
	GROUP BY date;

OUTPUT @dailysummary
TO "/output/04_Daily_summary.csv"
ORDER BY date
USING Outputters.Csv(outputHeader:true);
```

* クエリを実行し完了されるまで待ちます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f8c519da-fcd4-38b5-01d8-79d3b873be4a.png)
<br>

* こんな感じで集計されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8ab0cbd5-58c1-9189-7c11-bd350f4870bb.png)

# まとめ
今回の例のようなログデータだけであれば、Log Analyticsでも同様のことができますが、Data Lakeはどんなデータでも扱えるというのが強みですね。
少量のデータだとクエリ実行時間が長いように感じましたが、データが増えれば増えるほど処理の早さに気付くそうです。大容量データに向いているとのこと。
日本リージョンでリリースされたらより流行りそうなサービスですね。
UINavigationController.popViewController(animated:)の結果をキャプチャする必要が無くなっていた件

Swift2からSwift3.0へマイグレートする際に、

```swift
navigationController?.popViewController(animated: true)
```

に対し

> "Expression of type "UIViewController?" is unused".

という警告が出て

```swift
_ = navigationController?.popViewController(animated: true)
```

というような書き方を渋々させられた経験、誰もがあると思います。
StackOverflowでも2016年に投稿されたiOS関連の投稿でVote数6位になるくらいには有名でした。
元ネタ: [Stack Overflowで最も投票数の多かったiOS関連の質問ベスト10(2016年版)](https://qiita.com/koogawa/items/ec2009653cbf5902bd1e#%E7%AC%AC6%E4%BD%8Dswift-3%E3%81%A7expression-of-type-xxx-is-unused%E3%81%AE%E8%AD%A6%E5%91%8A%E3%81%8C%E5%87%BA%E3%82%8B%E5%95%8F%E9%A1%8C129%E7%A5%A8)

さて、この件について実はSwiftコミュニティでもバグ([SR-1681](https://bugs.swift.org/browse/SR-1681))として起票されており、
Xcode8.3及びSwift3.1で修正されていたようです。

これにより、

```swift
navigationController?.popViewController(animated: true)
```

のままでも警告が出なくなっていました。

`@discardableResult`が付いているメソッドの結果を使う分には何の警告も出ないのでこの修正に気づいた人意外といないのかも...
Jupyter notebook kernel dead

##背景
Jupyter notebookを開いた瞬間にカーネルが死んでしまう現象が起きていた

##原因
カーネルのバージョンが古かったこと

##解決方法

```.py
#pip install hoge　でhogeをインストール
#-U　をつけるとアップデート

pip install ipykernel -U
```
CSS3の「flexbox」でフッターをページ最下部に固定して浮くのを防ぐ

コンテンツの縦幅が狭い際、フッターが画面最下部から浮いてしまいますが、flexboxを使って最下部に固定する方法を見つけたのでメモします。


```haml:hmtl
<body>
  <div id="wrapper">
    <main>メインコンテンツが入ります。</main>
　　<footer>フッターが入ります。</footer>
  </div>
</body>
```

```css:css
body,#wrapper {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
 
footer {
  margin-top: auto;
}
```
Hive カラム名ありのデータ出力

###概要
Hiveでデータを出力する際に列名つきで出力する。
（デフォルトは列名出力なし）

###方法

```.hql
set hive.cli.print.header=true;
```

を実行後に、
通常の出力（以下サンプル）で列名つきのデータが出力可能。

```.sh

hive -e "select * from hoge;" > hoge.tsv

```
Visual Studio Code で Salesforce 開発環境を作る

Salesforce の開発で Eclipse がいまいちだなと思っていたが、
Visual Studio Code（以下 VS Code）でもできるみたいなので、トライ。
ネットでよく見かける方法だと一部上手くいかないところがあったので、備忘録として残しておく。
試した時の VS Code のバージョンは、1.21.1。

基本的な手順としては、

1. 拡張機能に ForceCode をインストール
2. フォルダーを開く
3. Salesforce のログイン認証を行う
4. ソースコードをダウンロードする

参考にしたのは
https://www.terrasky.co.jp/blog/2017/170412_002051.php
など。

## 1. 拡張機能に ForceCode をインストール
左メニューの拡張機能アイコンかメニューバーの表示->拡張機能を押下して拡張機能画面を開く。
ForceCode を選択して「インストール」ボタンを押下（サジェストされるので、全て入力する必要はない）。
インストールが完了すると（2～3分かかるかも）表示される「再読み込み」ボタンを押下してインストール完了。

※同時に以下の拡張機能もインストールされます。

- Apex
- VisualForce

## 2. フォルダーを開く
左メニューのエクスプローラーからフォルダーを選択して、
Salesforce のソースコードをダウンロードするフォルダーを選択。

## 3. Salesforce のログイン認証を行う。
2 で開いたフォルダーでコマンドパレットを開き、

```
ForceCode Menu
```
を選択して

- ユーザ名
- パスワード（とセキュリティトークン）<br>※セキュリティトークンがある場合はパスワードに続けて入力
- 環境
- 自動デプロイ<br>最初は No を選択した方が無難かも

を入力（選択）すると、フォルダーに force.json が作成される。

ちなみにバージョンのせいか分からないが、よく見かける手法だとこの手順のところで、

```
Force: get Class, page, or Trigger
```
を選択とあるが、自分の環境では下記のエラーが出てしまった。
「Running the contributed command:'ForceCode.open' failed.」

## 4. ソースコードをダウンロードする
コマンドパレットを開き、

```
Force: Refresh from server
```
を選択すると、パッケージ名が表示されるので選択。
成功するとダウンロードが始まり、src フォルダが作成され、その中にソースコード一式が作成される。
UnityのC#からSelenium経由でChromeをゴニョゴニョする

# はじめに
あるサイトのログインした状態のページをスクレイピングしたくてPythonからSelenium経由でChromeを触ってたけど、めんどくさくなってUnityから直接触れないか調べたら割りとカンタンにできました。

おそらくほぼ同じやり方でFirefoxも対応できると思います。


# 環境
- OS：macOS Sierra (10.12.6)
- Unity：2017.3.1f1
  - Scripting Runtime Version：Experimental(.NET 4.6 Equivalent)
- Unityエディタ上とMacのスタンドアロンビルドで確認

Windows / Linux では未確認。


# 準備

## Seleniumのダウンロードとセットアップ

0. [NuGetのページ](https://www.nuget.org/packages/Selenium.WebDriver/)の「Manual Download」からSeleniumをダウンロード
  - 記事執筆時点の最新バージョンは3.11.0

0. ダウンロードした「selenium.webdriver.x.xx.x.nupkg」の拡張子を「nupkg」から「zip」に変更して解凍

0. 中にある`lib/net45/WebDriver.dll`をUnityの`Plugins`フォルダ以下に入れる

## ChromeDriverのダウンロードとセットアップ

0. [ここ](https://sites.google.com/a/chromium.org/chromedriver/)の「Latest Release: ChromeDriver x.xx」のリンクからダウンロード
  - 記事執筆時点の最新バージョンは2.37

0. zipを解凍して出てきた`chromedriver`ファイルをUnityの`StreamingAssets`フォルダに入れる

<b>That's it!</b>

# C#からChromeを起動する

あとはC#から好きなようにChromeを操作できる。

```WebDriverTest.cs
using OpenQA.Selenium.Chrome;
using UnityEngine;

public class WebDriverTest : MonoBehaviour
{
    private ChromeDriver _driver;

    void Start()
    {
        var path = Application.streamingAssetsPath;

        // NOTE: 起動にはそこそこ時間がかかる
        _driver = new ChromeDriver(path);

        // 起動後は好きなようにChromeを操作できる
        _driver.Navigate().GoToUrl("http://yahoo.co.jp");
    }

    void OnDestroy()
    {
        _driver.Dispose();
    }
}
```

# あとがき / TODO
- `StreamingAssets`フォルダを使わなくてもいいかも、要確認
- Windows / Linux のスタンドアロンビルドでも動くか確認
  - 誰かチャレンジして結果を教えてください


# 参考
- [C# + Selenium + ChromeDriverを使って、HTMLフォームへ入力してみた](http://thinkami.hatenablog.com/entry/2016/01/12/230037)
- [C# から Selenium Web Driver を利用してみる](http://sig9.hatenablog.com/entry/2015/01/13/010335)
- [Selenium C Sharp](http://toolsqa.com/selenium-c-sharp/)
AWSセキュリティグループ設定をコマンド(aws-cli)でやる

ブラウザでぽちぽちは面倒ってことで
aws cliで登録する。

# セキュリティグループの作成
```
VpcId="vpc-12345678"
NewGroup="application.stg.sg"
aws ec2 create-security-group --group-name ${NewGroup} --description "${NewGroup}" --vpc-id ${VpcId} --description "${NewGroup}" > create-security-group
```

# 環境変数に設定
まぁ、いろいろ便利なので
```
GroupID=`cat create-security-group | jq -r .GroupId`
```

# 確認
```
# 人間が見やすいフォーマット
aws ec2 describe-security-groups --group-id ${GroupID} --output table
# json
aws ec2 describe-security-groups --group-id ${GroupID} --output json
```

# 追加
```
aws ec2 authorize-security-group-ingress --group-id ${GroupID} --protocol tcp --port 8081-8082 --cidr 10.0.0.1/32
```
Port 8081~8082で10.0.0.1/32からのアクセスをallowする


# 削除
```
aws ec2 revoke-security-group-ingress --group-id ${GroupID} --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 8081, "ToPort": 8082, "IpRanges": [{"CidrIp": "10.0.0.1/32"}]}]'
```
Port 8081~8082で10.0.0.1/32からのアクセスを削除する


# 知りたいこと
GUIの名前タグに相当するオプションが見つからない。なんかあるんでしょうかね。
https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html


# あとで追記すること
jsonフォーマットを読み込み
dockerコマンドメモ

buildしては失敗したり試行錯誤したときに使ったコマンドをメモ
参考：https://docs.docker.com/engine/reference/commandline/docker/

## コンテナ

### 確認

```
docker ps
```
-aを追加して`docker ps -a`とすると、起動していないコンテナも表示されます。

### 削除

```
docker rm (CONTAINER ID)
```
`(CONTAINER ID)`には`docker ps`で確認したCONTAINER IDを入れます。

## イメージ

### 確認

```
docker images
```

### 削除

```
docker rmi (IMAGE ID)
```
`(IMAGE ID)`には`docker images`で確認したIMAGE IDを入れます。

## volume

### 確認

```
docker volume ls
```

### 削除

```
docker volume rm (VOLUME NAME)
```

## ログ

```
docker logs --details (CONTAINER)
```
起動に失敗した時のログとかが見られます。
EditorWindow could not be loaded because the script is not found in the project が出たとき

Unityを触っていて、ふと素材のプレビューが全く表示されず、「EditorWindow could not be loaded because the script is not found in the project」と表示されていることに気が付きました。
あまり症状が出ていないのか、ネットを検索しても解決方法がなかなか見つからなかったので備忘録。

右上にあるLayoutコンボボックスを開き、Revert Factory Settingsを実行する

これで直ります。
一度症状が出るとプロジェクトを消してもダメで、プロジェクトフォルダ内以外のところで何かしらの情報が記録されているようです。
テキストが選択・ドラッグされたときに、選択された文章を取得する方法【Javascript/jQuery】

ページの中のテキストが選択やドラッグされたときにイベントを発火して、選択された文章を取得する方法のメモです。

## やりかた
javascriptやjqueryには、「ドラッグされたことを検知するイベント」はないみたいなので、　jqueryの`on.('mouseup')`で代替します。
主な流れは下の通り
1. `on.('mouseup')`でイベント発火
2. `window.getSelection`でselectionオブジェクトを取得
3. 上のオブジェクトを`toString()`で文章を抽出
4. 文章が空文字もしくは改行文字でないかチェック(クリックと区別するため)

## コード例
```js
$('body').on('mouseup', function(e){  //mouseupでイベント発火
  var selectedStr;
  if(window.getSelection){  //selectionオブジェクト取得
    selectedStr = window.getSelection().toString();  //文章取得
    if(selectedStr !== '' && selectedStr !== '\n'){  //文章チェック
      console.log(selectedStr);
    }
  }
});
```

## お世話になったサイト
[Selected text event trigger in Javascript
](https://stackoverflow.com/questions/3545018/selected-text-event-trigger-in-javascript)
[window.getSelection - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Window/getSelection)
[PHP]Amazon SNS を使い、iOS・AndroidへPUSH通知 - トピック作成・配信編 -

## **トピック操作**
### **トピック作成**
セグメント配信をする場合は単純な検索でない限り、一予約配信毎にトピックを作成して、トピックにエンドポイントを追加します。
配信するときにトピックを指定することで、そのトピックに登録されているエンドポイントに一斉配信できるようになります。

```
$result = $sns->createTopic(array(
  'Name' => $topic_name
));

// トピックARNを取得
$topic_arn = $result['TopicArn'];
```
・Name
　トピック名を入れます。
　既に登録されているトピック名でも成功のレスポンスが返ってきますが、複数データが生成されるわけではないので、ユニークな名前を付けた方がいいです。

取得したトピックARNはDBに保存しておきましょう！
抽出したエンドポイントをトピックに追加する場合は、前回の記事の「ALLトピックに追加」をループで回して追加します。
複数のエンドポイントを一気に追加できない仕様のようなので、件数が多い場合はこの部分が一番ネックになります。
環境にもよりますが1時間で2万件くらいです。

#### **エラー発生を考慮**
```
try {
    // エンドポイントをトピックに登録
    $sns->subscribe(array(
      'Endpoint' => $sns_endpoint,
      'Protocol' => 'Application',
      'TopicArn' => $topic_arn
    ));
} catch (Exception $e) {
    $message = $e->getMessage();
    
    $pos = strpos($message, 'Endpoint does not exist');
    if ($pos !== false) {
        // トークンとエンドポイントの削除処理など
    }
}
```
エンドポイントが存在しない場合などエラーが発生します。
その場合はエラーメッセージに「Endpoint does not exist」という文言があれば、DBからトークンやエンドポイントを削除などの処理をするといいと思います。

### **トピック削除**
```
$sns->deleteTopic(array(
  'TopicArn' => $topic_arn
));
```
・TopicArn
　トピック作成時に取得したトピックARN

削除するとトピックに登録されているエンドポイントも削除されます。

## **トピックに登録されているエンドポイントへ一斉配信**
### **APNs JSONデータ作成**
```
$apns = json_encode(array(
  'aps' => array(
    'alert' => array(
      'body' => $body
    ),
    'sound' => 'default',
    'badge' => 'default',
    'category' => null
  ),
  'url' => $url,
  'push_id' => $push_id
));
```
・body
　配信するメッセージ
・url、push_id
　カスタムkeyです。
　アプリで通知を開いたときにWebViewを表示させたい場合や開封率を計測した場合など、自由にkeyとvalueを設定できます。

### **GCM JSONデータ作成**
```
$gcm = json_encode(array(
  'data' => array(
    'message' => $body,
    'url' => $url,
    'push_id' => $push_id
  )
));
```
・message
　配信するメッセージ
・url、push_id
　カスタムkeyです。
　アプリで通知を開いたときにWebViewを表示させたい場合や開封率を計測した場合など、自由にkeyとvalueを設定できます。

### **Message作成**
```
$message = json_encode(array(
    'default' => $body,
    'APNS' => $apns,
    'GCM' => $gcm
  ));
```
・APNS
　本番 または Ad Hoc用であればAPNS、開発用であればAPNS_SANDBOX

例ではiOS、Android両方同時に送っていますが、どちらか片方への送信であれば、送信しない方のデータは作成しなくても問題ありません。

### **配信実行**
```
$json = array(
  'MessageStructure' => 'json',
  'TargetArn' => $topic_arn,
  'Message' => $message
);

// 配信実行
$sns->publish($json);
```
・MessageStructure
　JSON固定
・TargetArn
　トピック作成時に取得したトピックARN
　特定のデバイスのみ送りたい場合は、プラットフォームエンドポイント
・Message
　JSONエンコードされたデータ

事前にトピックへエンドポイントを追加しておき、配信時間になったらトピックのエンドポイントに向けて一斉配信します。
SESでシミュレータを利用するときに気をつけること

# SESのメールボックスシミュレータ
テスト等で存在しないメアドに送信するとバウンスレートに影響を与えてしまう。
SESでシミュレータが用意されているのでそれを利用すると便利。

```
成功シミュレータ(バウンスやサプレッションリスト用シミュレータもある)
success@simulator.amazonses.com
```
# ラベリング
シミュレータはラベリングをサポートしている。
以下のように+(プラス)記号で柔軟にパターンを用意することが可能。
メールにユニーク制約のあるようなテストでも利用可能。

```
success+hogehoge@simulator.amazonses.com
```

# 注意点
> メールボックスシミュレーターに E メールを送信する場合、最大送信レートによって制限されます。また、E メールの使用料金が発生します。ただし、メールボックスシミュレーターへの E メールは、バウンスと苦情の配信性能メトリクス、または送信クォータの数には影響しません。 

シミュレータ宛は、
・利用料金 → 発生する
・最大送信レート → 制限が有効
・バウンス等のメトリクス → 影響しない
・送信クォータ → 影響しない
なので、大量送信をテストするときは、料金と最大送信レートには気をつけなければならない。

# 参考
https://docs.aws.amazon.com/ses/latest/DeveloperGuide/mailbox-simulator.html
バージョン確認コマンド

よく使うやつだけ。

#CentOSのバージョン確認

```
cat /etc/redhat-release
```

#Apatchのバージョン確認

```
httpd -v
```

#phpのバージョン確認

```
php -v
```

#Mysqlのバージョン確認

```
mysql --version
```
Homesteadの設定方法

[Laravel 5.4 Laravel Homestead](https://readouble.com/laravel/5.4/ja/homestead.html)
こちらに大体のことは書いてあります。
ただ書いてないことも合ったので、記事にしました。

## 事前準備
VirtualBoxとVagrantがインストールされている。
※インストールされてない場合以下のURLからインストール

* https://www.vagrantup.com/downloads.html

* https://www.virtualbox.org/wiki/Downloads
mac前提です。

## vagrantにhomesteadのboxを追加

```
vagrant box add laravel/homestead
```
2回目の場合はboxをアップデートしてくと良いかも

```
vagrant box update
```

## gitでHomesteadの設定に必要なファイルcloneする
```
git clone https://github.com/laravel/homestead.git Homestead
```
Homesteadの箇所は任意で変更可能。プロジェクト名とかにしとくと良いかも。
例:hoge_project

## Homestead.yamlの設定

### Homestead.yamlファイルを生成
cloneしたディレクトリにcdして以下のコマンドを実行

```
bash init.sh
```
### Homestead.yamlを書き換える。
```yaml
---
ip: "192.168.10.20" #前回作ったHomesteadなどとかぶらないIPの方が良い
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub #自分の公開鍵と同じパス(無い場合は作成)

keys:
    - ~/.ssh/id_rsa #自分の秘密鍵と同じパス(無い場合は作成)

folders:
    - map: ~/workspace/hoge_project/hoge_project #localからプロジェクトファイルまでのパス
      to: /home/vagrant/hoge_project #vagrantからプロジェクトファイルまでのパス
      type: "nfs"　#localので書き換えた内容がvagrantに反映されないことがあり、nfsの設定をしたら治ったので追記しとく
       

sites:
    - map: hoge_project.local #localでアクセスするURL
      to: /home/vagrant/hoge_project/public #rootディレクトリのパス
      schedule: true　#laravelのスケジュール機能を使う場合はこのオプションを追加
　　　　　　　　　#もし複数ドメインがある場合はこのようにして追加出来る
    - map: sub.hoge_project.local　
      to: /home/vagrant/hoge_project/public
      schedule: true

databases:
    - hoge_project　#DB名

```

## homesteadを複数起動する場合に必要な設定
以下の処理をしないとエラーになる。
`Homestead/scripts/Homestead.rb`の
`homestead-7`と書かれた箇所を任意の重複しない名前に変更する。
※`(`を使うと良くないエラーが出る。

これでhomesteadの設定は完了です。
後はプロジェクトをHomestead.yamlと同じ階層に配置して`vagrant up`すればOK。
【tutorial】GitHubのリポジトリをローカルにクローン（GitBash）

GitBash（Git For Windows）のインストールは↓の記事。
https://qiita.com/d778980/items/063e3d04fd6d2bf91abd

2018/4/4に実施。

１．GitBashを起動。↓のコマンドで秘密鍵と公開鍵を作成。

```
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -C 'メールアドレス'
```

２．何も考えずに Enter を3回。

```
Generating public/private rsa key pair.
Enter file in which to save the key:　→Enter1回目
Enter passphrase (empty for no passphrase):　→Enter2回目
Enter same passphrase again:　→Enter3回目
```

３．↓のコマンドで公開鍵をクリップボードにコピー。

```
clip < ~/.ssh/id_rsa.pub
```

４．GitHubにログイン。「Settings」をクリック。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/27716e40-e376-f50d-204a-b7e342229f00.jpeg)

５．「SSH and GPG keys」をクリック。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/82eef203-a2d9-c4f1-ad93-b43446dd2d82.jpeg)

６．「New SSH key」をクリック。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/c7d5394d-861b-e287-e4b7-4c8ecc3a6ae9.jpeg)

７．Titleを適当に入力して、keyに「３．」でコピーした公開鍵を貼り付け。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/e0313be7-328b-18bd-41bf-03fea3d33c05.jpeg)

８．GitBashに戻り、↓のコマンドでクローン。今回はデスクトップにクローンを作成。

```
cd ~/Desktop/
git clone git@github.com:Githubのユーザ:リポジトリ名.git
 例：git clone git@github.com:d778980/first.git
```

９．↓の質問に「yes」を入力。
Are you sure you want to continue connecting (yes/no)?

終わり。

クローンしたリポジトリにファイルを追加してコミット→プッシュする方法は次の記事。
https://qiita.com/d778980/items/6492e5b1ee70ca4a78fc