OmniAICreator/Qiita-1.07M huggingface dataset:
Excelアラートウィンドウを非表示化

CSV保存時等に立ち上がるアラートウィンドウを非表示化
※）非表示化の後は再び表示されるよう元に戻す

```vb:Excel-VBA
Application.DisplayAlerts = False 'アラートウィンドウ機能停止
Application.DisplayAlerts = True 'アラートウィンドウ機能再開
```
'デスクトップにCSV形式でファイルを保存

'デスクトップフォルダのパスを取得
※）デスクトップフォルダのパスは通常「C:\Documents and Settings\＜ログインユーザー名＞\デスクトップ\」。
　　パソコン及びログインユーザによって異なるため、あらかじめVBAのコードで特定は難しい。

```vb:Excel-VBA
  Dim Path As String, WSH As Variant
  Set WSH = CreateObject("WScript.Shell")
  Path = WSH.SpecialFolders("Desktop") & "\"
```



'csv形式でファイルをデスクトップPATHに保存
※）出力ファイル名は"テストyyyymmdd.csv"

```vb:Excel-VBA
  ActiveWorkbook.SaveAs Path & "テスト" & Format(Date, "yymmdd") & ".csv", _
  FileFormat:=xlCSV, Local:=True
```
Angularでスクロールイベントを検知する(Angular2,4,5)

Clickイベントはよく使うので、すぐに検索したら見つかるが、スクロールはめったに使わないのでなかなか検索しても出てきません。
実はかなり簡単にとれます。

```
<div (scroll)="scrollEvent($event)"></div>
```

実は `(scroll)` でとれます。

https://github.com/angular/angular/issues/13048#issuecomment-274344485
netcatとcatで人間サーバ

# 要約
```cat | nc -l ポート番号```
であなたもサーバになれますよという話。
\#ただしASCIIなプロトコルに限る。

# やりたかったこと
「telnetでSMTPサーバに接続して手動でコマンドを送信すると、メールが送れちゃいますよ」みたいなのはよく見かけると思います。
今回はそれの逆、つまり「クライアントからの接続を待ち受けて、手動でそのリクエストに応答できますよ」がやりたかった。
クライアント側のテストをしたいんだけど手頃なサーバがいない！とかに役立つ気がします。

# 解説
\#あえて解説するまでもないですが、、、
netcat(`nc -l ポート番号`)で指定したポートでtcp接続を待ち受けることができますが、telnetのように入力を受け付けてくれたりはしません。
ただ、netcatはパイプでつなぐとデータを転送できるので、catで標準入力を受け付けてnetcatに渡すということができました。

タイピング速度=応答速度なのと、同時接続数が1なのが欠点といえば欠点。

# おまけ
```cat | nc -l 8888 | sed -e 's/^/> /'```
とすると、受信文字列の先頭に`> `が付与されるのでログを残すときは便利そう。

# 例
## SMTPサーバになる
### クライアント側
```
[admin@localhost ~]$ echo 'Hello!!' | mail -S smtp=smtp://localhost:2525 -s 'subject' -r from@example.com to@example.com
```
クライアントにはmailxを使いました。
### サーバ側
```
[admin@localhost ~]$ cat | nc -l 2525 | sed -e 's/^/> /'
220 OK
> HELO localhost
250 OK
> MAIL FROM:<from@example.com>
250 OK
> RCPT TO:<to@example.com>
250 OK
> DATA
354 OK
> Date: Sat, 07 Apr 2018 16:31:52 +0900
> From: from@example.com
> To: to@example.com
> Subject: subject
> Message-ID: <xxxxxxxxxxxxxxxxxxxxxxxxx%from@example.com>
> User-Agent: Heirloom mailx 12.5 7/5/10
> MIME-Version: 1.0
> Content-Type: text/plain; charset=us-ascii
> Content-Transfer-Encoding: 7bit
>
> Hello!!
> .
250 OK
> QUIT
221 OK
^C
[admin@localhost ~]$
```
プロトコルに従ってしこしこリターンコードを入力すると、クライアントとおしゃべりできます。

## HTTPサーバになる
### クライアント側
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142321/a10fa333-7e47-6f6d-f6ef-a28844706b37.png)
chromeでリクエストを投げました。

### サーバ側
```
[admin@localhost ~]$ cat | nc -l 8888 | sed -e 's/^/> /'
> GET / HTTP/1.1
> Host: localhost:8888
> Connection: keep-alive
> Cache-Control: max-age=0
> Upgrade-Insecure-Requests: 1
> User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
> Accept-Encoding: gzip, deflate, br
> Accept-Language: ja,en-US;q=0.9,en;q=0.8
>
HTTP/1.0 200 OK
Content-Length: 7

Hello!!
^C
[admin@localhost ~]$
```
プロトコルに従って、しこしこレスポンスを書きます。

# 注意事項
## 改行コード
RFCによるとHTTPとかSMTPの改行コードはCR+LFですが、上記の例だとLFのみになってしまっています。
その辺を厳密にやりたいときは`Ctrl+v` + `Ctrl+m`でCRを入力できるので、エンターをたたく前に入力してあげてください。

```
[admin@localhost ~]$ cat | nc -l 1234 | sed -e 's/^/> /'
aaa^Mbbb
```
`^M`の部分が`Ctrl+v` + `Ctrl+m`。

```
[admin@localhost ~]$ sudo tcpdump -i lo -nn -n -s 0 -X port 1234
[sudo] password for admin:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
17:20:09.955677 IP 127.0.0.1.1234 > 127.0.0.1.39892: Flags [P.], seq 2056111940:2056111948, ack 2448075712, win 342, options [nop,nop,TS val 3384957060 ecr 3384918152], length 8
        0x0000:  4500 003c 07cc 4000 4006 34ee 7f00 0001  E..<..@.@.4.....
        0x0010:  7f00 0001 04d2 9bd4 7a8d c744 91ea abc0  ........z..D....
        0x0020:  8018 0156 fe30 0000 0101 080a c9c2 5884  ...V.0........X.
        0x0030:  c9c1 c088 6161 610d 6262 620a            ....aaa.bbb.
```
tcpdumpでみると、`0x61`(a)と`0x62`(b)の間に`0x0d`(CR)がいるのがわかる。
VSTS-CIのCordova-iOSビルド後のArtifactで「[error]Could not find file '****/platforms/ios/build/device/****.app'.」エラーが発生した時の対処法

# :one: 環境

* VSTS (Visual Studio Team Services) CIサービス (無料プラン)
* Agent: Hosted macOS Preview
* Node.js: v6.14.1
* cordova: v7.1.0
* cordova-ios: 4.5.4

# :two: エラー内容

VSTS-CIのCordova-iOSビルド後のArtifactで `[error]Could not find file '****/platforms/ios/build/device/****.app'.` エラーが発生する。

```bash:エラーログの内容
2018-04-07T06:36:32.1413500Z ##[section]Starting: Publish Artifact: ios
2018-04-07T06:36:32.1473750Z ==============================================================================
2018-04-07T06:36:32.1487260Z Task         : Publish Build Artifacts
2018-04-07T06:36:32.1500710Z Description  : Publish build artifacts to Visual Studio Team Services/TFS or a file share
2018-04-07T06:36:32.1514780Z Version      : 1.131.0
2018-04-07T06:36:32.1528900Z Author       : Microsoft Corporation
2018-04-07T06:36:32.1542730Z Help         : [More Information](https://go.microsoft.com/fwlink/?LinkID=708390)
2018-04-07T06:36:32.1557020Z ==============================================================================
2018-04-07T06:36:32.6651510Z ##[section]Async Command Start: Upload Artifact
2018-04-07T06:36:32.6665160Z Uploading 8 files
2018-04-07T06:36:34.5469250Z ##[section]Async Command End: Upload Artifact
2018-04-07T06:36:34.6223280Z ##[error]Could not find file '/Users/vsts/agent/2.131.0/work/1/s/platforms/ios/build/device/my-ionic1.app'.
2018-04-07T06:36:34.6320880Z ##[section]Finishing: Publish Artifact: ios
```

# :three: 原因

原因不明。

ログからは「`my-ionic1.app`が見つからないよ」エラーとなっているが、どこかで`my-ionic1.app`をどうのこうの設定した覚えは無い。
単純に`platforms/ios/build/device`を出力するように指定しているだけなのに・・・(*'ω'*)


# :four: 対応

cordova-iosのビルドで出力される場所が`platforms/ios/build/device`と思っていたが、設定を見直すと`bin`ディレクトリとなっていた。どうやらVSTS-CIでのcordova-iosビルド後の出力先は、以下のキャプチャのように初期状態で`bin`ディレクトリのようだ。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/67192/35cb4fd9-6a5b-84ec-3e4c-0067a9fa60ed.png)

よって、以下のキャプチャの様に`Publish Artifact`の参照先を`bin`ディレクトリに変更。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/67192/ebdc6045-5a18-00c1-a7b8-ccef9492515d.png)

そして`Artifacts`から`ipaファイル`(iOSアプリの実行ファイル)を取得することに成功。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/67192/8a9380ef-0997-9e76-2bce-08dfc1087e9f.png)
(windows)マウスのホイールでのスクロール幅を変更する方法

#環境
- OS: windows10
- 使用マウス： ellecom ex-g

#きっかけ
ブラウザの画面をそんなに大きく開いていない時にスクロールしたとき、
想定以上に画面がスクロールしてしまったため。

#マウスホイールのスクロール幅の変更方法
1. [windowsボタン] + [R] キーで[ファイル名を指定して起動]を開き、名前：にcontrollを入力して実行
![スクリーンショット 2018-04-07 17.06.24.png](https://qiita-image-store.s3.amazonaws.com/0/117406/7de97534-524d-b150-37c6-13fa51173788.png)

2．コントロールパネルが起動するので、[ハードウェアとサウンド]を選択
![スクリーンショット 2018-04-07 17.09.27.png](https://qiita-image-store.s3.amazonaws.com/0/117406/b2de4d07-da13-b9e1-dd83-96459fc3c9da.png)

3．デバイスとプリンター>マウスを選択
![スクリーンショット 2018-04-07 17.13.23.png](https://qiita-image-store.s3.amazonaws.com/0/117406/39db8e0e-167b-1c94-d32b-9673994e8290.png)

4．マウスのプロパティが開かれるので[ホイール]タブを選択
![スクリーンショット 2018-04-07 17.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/117406/d7c49fb8-5c0a-28f1-5fd8-01a5dc9808ef.png)

5．垂直スクロールの[一度に次の量スクロールする（N）]で好きな値を入力（自分は3）
![スクリーンショット 2018-04-07 17.16.49.png](https://qiita-image-store.s3.amazonaws.com/0/117406/d613067c-c6a9-a640-e4ac-a14854e7bcea.png)

6． OKボタンを押下して終了
Dockerの超基礎的な知識メモ

#Dockerとは...
名前はもちろん知ってたし、「コンテナ」とかそういうキーワードは聞いたことあったけど、正直よく知らんかった。
「Dockerの基礎」を教えてくれるハンズオンセミナーに参加してきたので、「最低限理解しておきたいこと」をメモとして残しておく。
（※あんまり自信は無い。曲解があるかも）

###「仮想化ソフトウェア」
Dockerとは、「コンテナ型の仮想環境」を「作成、配布、実行」するためのプラットフォーム。
「仮想化されたコンテナ」の上で、さまざまなミドルウェアを実行させることができる。

###Dockerのメリット①「速い」
VMWareとかは、「PC全体を仮想化」するイメージで動作している。
Dockerは「ミドルウェアを実行する部分を仮想化」しているイメージのため、動作が速い。

###Dockerのメリット②「Dockerfile」
「Dockerfile」は、「環境構築のための情報」が色々記載されたファイル。
また、ファイルの中身を見ることで、その環境の情報（使っているソフトとかバージョンとか）がすぐ分かる。
Dockerfileをビルドすることで、環境を構築できる。

「Githubとかでバージョン管理する」こともできるし、「開発メンバが増えた際の環境構築が楽になる」という、色々なメリットがある。
（実際の現場では、「インフラ担当のメンバ」がゴリゴリDockerfileを書いて、それを使うことが多いらしい。）

###Dockerの色んな用語
####「コンテナ」
実際に「ミドルウェアが動いている部分」みたいな感じ。
コンテナで区切られて実行されているため、「同じミドルウェアのバージョン違い」も同時に実行することができる。（別のIPアドレスで実行されている）

####「イメージ」
コンテナを動かすための「設計図」みたいな感じ。
「イメージ」を落としてきてから(docker pullコマンド)、「コンテナ」を実行する(docker runコマンド)。

###「公開されているイメージ」を使う
１からDockerfileを記述して環境構築することもできるが、初心者は「公開されているイメージ」を基に環境構築するのが楽。
DockerHubから探して落としてくる。インストールやrunの仕方（コマンド）も乗っているため、すぐに使える！
[DockerHub](https://hub.docker.com/)

###Dockerで使えるコマンド
####実行中のプロセスを表示

```:コマンド
docker ps

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
4accd55b32c4        microsoft/mssql-server-linux   "/opt/mssql/bin/sqls…"   4 seconds ago       Up 3 seconds        0.0.0.0:1433->1433/tcp   jovial_euler

```
####コンテナの起動、停止、再起動
```:起動
docker start コンテナID
```
```:停止
docker stop コンテナID
```
```:再起動
docker restart コンテナID
```

####コンテナを削除する
```:コマンド
docker rm コンテナID
```

####コンテナへ接続
ミドルウェアの中で吐かれるログを確認したいときは、このコマンドで中に入ってログを見る。

```:コマンド
docker exec -it コンテナID /bin/bash
```

####イメージを確認
```:コマンド
docker images

REPOSITORY                     TAG                   IMAGE ID            CREATED             SIZE
mongo                          latest                a0f922b3f0a1        10 days ago         366MB
nginxhttpphpmysql_php          latest                348d430cfda8        3 weeks ago         79.5MB
microsoft/mssql-server-linux   2017-latest           741bd53beb22        5 weeks ago         1.42GB
microsoft/mssql-server-linux   latest                741bd53beb22        5 weeks ago         1.42GB
mysql                          5.7.21                5195076672a7        6 weeks ago         371MB
nginx                          1.13.9-alpine         537527661905        2 months ago        17.9MB
php                            7.2.2-fpm-alpine3.6   59d3e94a05b7        2 months ago        77.2MB
```

####イメージを削除
```:コマンド
docker rmi imageID
```

#Dockerを使って...
Docker上でASP.NETアプリケーションが動かせるようにしてみたい。
##SQLServer
とりあえずSQLServerをインストールしてみた。

```:pullコマンド
docker pull microsoft/mssql-server-linux
```
[DockerHub - SQLServer](https://hub.docker.com/r/microsoft/mssql-server-linux/)

```:起動
docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=P@ssw0rd! -p 1433:1433 -d microsoft/mssql-server-linux
```


#参考URL
[Docker入門（第一回）～Dockerとは何か、何が良いのか～](https://knowledge.sakura.ad.jp/13265/)

[Dockerとは|4つの特徴と基本的な使い方
](https://furien.jp/columns/147/)
値の入っているA列の最終行以降を削除

値の入っているA列の最終行以降を削除
※）10000行までを削除対象とする

```vb:Excel-VBA
Dim 最終行 As Long
最終行 = Cells(Rows.Count, 1).End(xlUp).Row + 1
Range(最終行 & ":10000").Delete
```
【初心者】就活のためにJavaの勉強を始めてみた話〜2ヶ月目〜

こんにちは。
地方の無名文系大学に通う3年生です。

私は就活のために2ヶ月程前からプログラミングの勉強をしています。
勉強を始めたきっかけなどについて気になる方は前回の記事を見て頂ければと思います。
前回の投稿からは1ヶ月を少し過ぎてしまいましたが、プログラミングに関する勉強の2ヶ月目の記録を書いていきます。

今回は

・2ヶ月目に取り組んだ内容
・初めてAndroid studioを使ってみて感じたこと
・企業を訪問してみて思ったこと

という３つの観点から記事を書いていきます。


## 2ヶ月目に取り組んだ内容

私が2ヶ月目に取り組んだのは、主に

・プロゲートの復習
・ドットインストールを使ったアプリ開発の勉強

です。
1日3時間と勉強時間を決めて取り組みました。

##### **プロゲートの復習**

プロゲートの復習では、1ヶ月目の時に学習したJavaのレッスンにもう一度取り組みました。
1巡目の時と比べて躓く部分も減り、エラーの原因を自分で見つけることができるようになったので、少しではありますが自身の成長を感じました。
また、1巡目の際に理解があやふやのまま進んでしまった「オブジェクト指向」などの内容も理解できるようになったように思います。

##### **ドットインストールを使ったアプリ開発の勉強**

ドットインストールでは

・Androidアプリ入門
・Androidレイアウト入門
・Androidリストビュー入門
・Androidデータベース入門
・Androidフラグメント入門
・Androidでおみくじアプリを作ろう
・Androidでストップウォッチを作ろう
・Androidで姓名判断アプリを作ろう
・Androidでウェブブラウザを作ろう
・Androidでクイズアプリを作ろう
・Androidでメモアプリを作ろう

の11個のレッスンに取り組みました。
最後のメモアプリのレッスンは今取り組んでいる途中であり、終わり次第アプリ入門から順に復習していく予定です。

ドットインストールのレッスンは最新バージョンの動画にKotlinが用いられている場合が多いのですが、私はまだ勉強した言語がJavaだけなので少し古いバージョンの動画を見て勉強していました。
そのため自分が入力した以外の箇所で動画と違っている部分を勝手に書き換えたりしてエラーを出すことが多かったです。
また、私のパソコンがWindowsのためMacとは違う方法を取らなくてはいけない場合があるのに、気付かずそのまま入力してエラーになることもありました。
二巡目に取り掛かる時にはこのようなミスがないように、それぞれの違いに気を付けて適切なコードを書けるようにしたいです。

勉強全体を通して感じたのは、春休みで自由に使える時間がたくさんあるとは言ってもコンスタントに勉強を続けていくのは思っていたよりも難しいということです。
春休みが終わり 来週からは授業も始まる為、今までよりも時間が取りにくくなってしまうと思うので、これからは空きコマなどを上手に使って勉強時間を確保するよう心掛けていこうと思います。

##初めてAndroid studioを使ってみて感じたこと

今回ドットインストールで勉強をするにあたりAndroid studioを使い始めたので、感想を書いていこうと思います。

Android studioを最初に使った時に感じたのは、それまでに勉強していたJavaを使わないレイアウトから作らなくてはならないことに対する戸惑いでした。
私はAndroid studioを使った勉強に入る時には、アプリがどのようにして作られるか理解しておらず、すべてJavaで書くものだと思っていました。
そのためレイアウトを作るのに使われる新しい用語や書き方を見て混乱していました。
でも今では、レッスンを進め色々なレイアウトを作っていくうちにレイアウトの書き方にも慣れてきたので、そろそろ動画を観ずに自分の力で簡単なレイアウトなら作れるのではないかと思っています。
まだ挑戦はしていませんが。

Android studioで躓いたのは、文法的なエラー以外の要因で起こる不具合の対処でした。
ログキャットを使ってエラーの箇所を見つけるのは私にはまだ難しかったです。
エラーが起きている箇所は分かっても何がダメなのかわからないということも何度かありました。
また、文法的なエラーの内に含まれますが、SQLiteを使っているところでスペースを空けるのを忘れたためにエラーが出ることも何度もありました。

Android studioを使うのは初めてだったこともあり難しいと感じる部分はたくさんありましたが、ドットインストールの2巡目では1巡目よりは使いこなせるように頑張ろうと思います。

## 企業を訪問してみて思ったこと

春休み中に東京に行く機会があったのですが、その際に２つの会社を訪問してきました。
なので最後にその時に感じたことも書いておこうと思います。

今回訪問した会社は、1社目が音楽教育関係の会社、2社目が動画配信関係の会社でした。

この２つの会社を訪問してみて私が感じたことは、知識や自分の意見を持つことが必要であるということです。

私は小さい頃からピアノを習っており、今でも吹奏楽や軽音楽のサークルに所属しているので音楽に関する知識があります。
また、教育学部に所属しているので教育に関することも知識があります。
なので1社目で説明を受けた会社の概要や取り組みについては理解し易かったです。
一方2社目のような動画配信の類には疎いため、聞かれた事にもなかなか答えられず、自分から質問もあまりできませんでした。
プログラミングに関する話になった時も、訪問した時にはまだプロゲートの勉強にしか取り組めておらずアプリを作ったこともなかったのでわからないことだらけでした。

なので、次回以降会社を訪問する時には、事前に訪問する会社について十分に調べ、聞きたいことを明確にしておこうと思います。
そして、自分が今どのような勉強を何のためにしているのかなどもはっきり言えるようにしようと思います。
また、なぜ教職に就かずプログラマーを目指すことにしたのかは ほぼ確実に聞かれると分かったので、それについてもちゃんと説明できるようにしておきたいです。


##最後に

最後まで読んでくださってありがとうございました。
躓くことは多いですが、少しずつでも出来ることは確実に増えていると感じるのでこれからも諦めずに頑張っていきたいです。
次はゴールデンウィーク頃に3ヶ月目の進捗を書きたいと思いますので、ご覧いただければ幸いです。
Jsoupでスクレイピング

# 要件
- webから直接情報を取得する(api等は用意しない)

# Jsoupとは
https://github.com/jhy/jsoup
htmlを取得してjQueryっぽく要素にアクセスできるライブラリです。サイト上のhtmlまるごと取得するので自前APIに比べ決して早くは無いですが、簡単なアプリでwebから情報を取得する場合はこれで十分だなと思いました。

# URLからHTMLを取得する
```kotlin

val document = Jsoup.connect("サイトのURL").get()
```

# 取得したHTMLから要素を指定する
色々APIはありますが、`.select`で大概のことが出来ます。※list形式で取得されるので使用する際はindexを指定する必要があります

## タグ指定の場合
```kotlin
document.select("タグ名").first().text()
```

## ID指定の場合
```kotlin
document.select("#ID名").first().text()
```

## クラス指定の場合
```kotlin
document.select(".クラス名").first().text()
```

## 属性の値を取得したい場合
```kotlin

document.select("タグ名").first().attr("abs:属性名").`val`()
```

# サンプルコード
Qiitaのトップページから、最初の記事のURLを取得してみたいと思います。

```kotlin

data class QiitaItem(
        var url: String
) {
    companion object {
        fun getUrl(): Single<QiitaItem> {
            return Single.create<Document> {
                val document = Jsoup.connect("https://qiita.com/trend").get()
                it.onSuccess(document)
            }.flatMap {
                val cell = it.select(".p-home_main .tr-ItemList .tr-Item").first()
                val url = cell.select("tr-Item_title").first().attr("abs:href")
                Single.just(QiitaItem(url))
            
            }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
        }
    }

}


QiitaItem.getUrl().subscribe(object : DisposableSingleObserver<QiitaItem>() {
            override fun onSuccess(data: QiitaItem) {
                Log.d("url", data.url)
            }

            override fun onError(e: Throwable) {
                Log.e("error", e.toString())
            }
        })
```
EDA playground

# EDA playground
SystemVerilog assertionについて書こうと思っているわけですが、なかなか投稿できません。
何か例題をと思っても実際にシミュレータで実行した波形などをのせられればいいのですが、プログラミング言語と違って普段仕事で使っているシミュレータを自宅のPCで動かすわけにもいかないのがなかなか進まない理由の一つ。

というわけでよく使っているCadenceのIncisiveでちょこっと実行できる[EDA Playground](https://www.edaplayground.com) を使ってみようかなと思っています。

googleアカウントでログインできるのでExampleにあるUVMの簡単なテストベンチを選択してみた。
![Clipboard01.jpg](https://qiita-image-store.s3.amazonaws.com/0/160145/a30de9ea-9d84-ccfc-72c1-c8d918cfa5a0.jpeg)

dump.vcd
を作れば波形を確認できる
![Clipboard02.jpg](https://qiita-image-store.s3.amazonaws.com/0/160145/b050273c-a48e-5642-8c30-2e39708dfe65.jpeg)

かなり機能は限定的だけど少し試してみようかと思います。
Python3のtkinterのタブの実装[sample]

Pythonのtkinterという便利そうなものがある。
しかし、制約があったり使い方がいまいちピンとこない人
タブの実装して起きましたから参考にしてください
環境は、python3のMacOSです。
※python2.7と3で異なります。

## 実際のユーザフォーム
入力フォーム
<img width="298" alt="スクリーンショット 2018-04-09 20.51.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/205341/d6b0534f-f40a-8bc8-86cb-6b2812bd9111.png">

表示フォーム
<img width="299" alt="スクリーンショット 2018-04-09 20.51.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/205341/68bff045-4459-ce8b-c32b-9d85502e0a31.png">


## ソースコード
```python:sample-tkinter.py
# -*- coding: utf-8 -*-

import tkinter as tk
import tkinter.ttk as ttk

# 登録ボタンがクリックされた時にデータをDBに登録するコールバック関数
def create_sql():
    # 日付の読み取り
    acc_data = entry1.get()
    print(acc_data)
    # 内訳の読み取り
    item_code = entry2.get()
    # 金額の読み取り
    amount = entry3.get()

# rootフレームの設定
root = tk.Tk()
root.title("家計簿アプリ")
root.geometry("300x280")

# ノートブック
nb = ttk.Notebook(width=200, height=200)

# タブの作成
tab1 = tk.Frame(nb)
tab2 = tk.Frame(nb)
tab3 = tk.Frame(nb)
nb.add(tab1, text='入力', padding=3)
nb.add(tab2, text='表示', padding=3)
nb.add(tab3, text='その他', padding=3)
nb.pack(expand=1, fill='both')

## タブ1

# 入力画面ラベルの設定
label1_1 = tk.Label(tab1,text="【入力画面】",font=("",16),height=2)
label1_1.pack(fill="x")

# 日付のラベルとエントリーの設定
frame1_1 = tk.Frame(tab1,pady=10)
frame1_1.pack()
label1_2 = tk.Label(frame1_1,font=("",14),text="日付")
label1_2.pack(side="left")
entry1_1 = tk.Entry(frame1_1,font=("",14),justify="center",width=15)
entry1_1.pack(side="left")

# 内訳のラベルとエントリーの設定
frame1_2 = tk.Frame(tab1,pady=10)
frame1_2.pack()
label1_3 = tk.Label(frame1_2,font=("",14),text="内訳")
label1_3.pack(side="left")
entry1_2 = tk.Entry(frame1_2,font=("",14),justify="center",width=15)
entry1_2.pack(side="left")

# 金額のラベルとエントリーの設定
frame1_3 = tk.Frame(tab1,pady=10)
frame1_3.pack()
label1_4 = tk.Label(frame1_3,font=("",14),text="金額")
label1_4.pack(side="left")
entry1_3 = tk.Entry(frame1_3,font=("",14),justify="center",width=15)
entry1_3.pack(side="left")

# 登録ボタンの設定
button1_4 = tk.Button(tab1,text="登録",font=("",14),width=5,bg="gray",command=create_sql)
button1_4.pack()

## タブ2
# 入力画面ラベルの設定
label2_1 = tk.Label(tab2,text="【表示画面】",font=("",16),height=2)
label2_1.pack(fill="x")

# フレーム2_1の作成
frame2_1 = tk.Frame(tab2, pady=10)
frame2_1.pack()

# リスト2_1の作成
listb2_1 = tk.Listbox(frame2_1, width=20, height=7)
listb2_1.pack()

# スクロール2_1の作成
scroll2_1 = tk.Scrollbar(frame2_1, orient = 'v', command = listb2_1.yview)

# スクロールの設定
listb2_1.configure(yscrollcommand = scroll2_1.set)

# gridで配置
listb2_1.grid(row = 1, column = 0, sticky = 'ns')
scroll2_1.grid(row = 1, column = 1, sticky = 'ns')

# メインループ
root.mainloop()
```
Gradle Shadow を使って fat JAR を作る手順

Gradle プロジェクトで fat JAR を作るのに、 [Gradle Shadow](https://github.com/johnrengelman/shadow) plugin が使える。

同じような用途に使える [Gradle FatJar Plugin](https://github.com/musketyr/gradle-fatjar-plugin) もあるが、メンテナンスされてないため Shadow を使うように推奨されてる。

# 設定

```build.gradle
plugins {
    id 'com.github.johnrengelman.shadow' version '2.0.3'
    id 'java'
}

jar {
    manifest {
        attributes "Main-Class" : "app.Main"
    }
}
```

実行可能なJarを作るには、`Main-Class` 設定に、エントリポイントのClassを指定する必要がある。
Shadowは `jar` タスクの設定を引き継いで使用する。
それと別に Shadow 専用の設定として `shadow` を用意している。 

# fat JAR 作成

```bash
./gradlew shadowJar
```

これで build/libs 以下に .jar ファイルが作成されます。
.jar ファイルを実行するには、以下のコマンドを実行します。

```bash
java -jar xxx-1.0-SNAPSHOT-all.jar
```

# Shadow がデフォルトでやってくれること

[ドキュメント](http://imperceptiblethoughts.com/shadow/)に書いてる内容の抜粋です。

* プロジェクトの依存ライブラリを含めた .jar ファイルを作ってくれる。
* プロジェクトの依存ライブラリを配置する時、以下のパターンのファイルをコピーしない。これらは署名Jarのファイルで、これらのファイルがコピーされると、実行時に署名の検証に失敗して「クラスが見つからないかロードできない」とエラーになってしまうのを防ぐため。
  * META-INF/INDEX.LIST
  * META-INF/*.SF
  * META-INF/*.DSA
  * META-INF/*.RSA


# 参考
[Shadow Plugin User Guide & Examples](http://imperceptiblethoughts.com/shadow/)
[サンプルプロジェクト](https://github.com/kmdsbng/codelog/blob/master/20180407/shadowtest/build.gradle)
オフラインリアルタイムどう書くE23の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/71800 )を行っています。

問題は「コッホっぽい曲線」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde23nokoch/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あれば大丈夫と思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Gitを何故使うのか

Gitを使う理由としては、
・チーム開発でも自分個人のリポジトリが持てる
・ブランチを気軽に作ることが出来る
ところでしょうか。

# そもそも、ソースコードバージョン管理ツールを使わない場合
まずは、SubversionやGitのようなソースコードバージョン管理ツールを使わない場合、
ファイルのバックアップで行うことになりますが、得てしてこんなこと(惨事)にもなります。

```
hello.20180215.c
hello.c.bak
hello.c.bak2
hello.c.bak.bak
hello.c.org
backup_20180325/hello.c
```

# ソースコードバージョン管理ツールを使う
Subversion(svn)やGitなどのツールを使えば、

- ファイルをそのままの名前で履歴管理してくれる
- そのバージョンの説明(コミットコメント)も記録出来る
- バージョン間の比較も簡単
- 過去のバージョンに戻すことも簡単

なので、ソフトウェア開発において必須のツールと言えます。

# チーム開発でも自分個人のリポジトリが持てる
## リポジトリがチームのものになる
チーム開発となると、リポジトリ(バージョン管理のデータベース)が共有されるので、Subversionでは気軽なコミットが出来なくなります。

ビルドが通らない、動かないような適当なタイミングでコミットしてしまうと、チームに迷惑が掛かってしまうので、
レビューを実施し、ビルドも通り、きちんと動作する状態のソースコードしかコミット出来ません。
そうなると、ローカルの開発は、

```
hello.20180215.c
hello.c.bak
hello.c.bak2
hello.c.bak.bak
hello.c.org
backup_20180325/hello.c
```

に戻ってしまいます。

## ローカルにリポジトリを作ってみる
では、対策として、ローカルにSubversionのリポジトリを新たに作成して、そこにソースコードをコミットしてみます。
こうすれば、チーム開発でも気軽なコミットが(ローカル限定ですが)出来るようになります。

ただ、面倒くさいです。
こんな作業を都度やらないといけないです。

- 元のリポジトリからチェックアウトしたファイルを、ローカルのリポジトリにコピーしてコミットする
- ローカルで開発したソースコードを、元のリポジトリにコピーしてコミットする
- ローカルでのコミット履歴を元のリポジトリには反映したければ、ローカルのコミット単位で元のリポジトリにコミットする。

なかなかやってられないですね。

## Git
この、ローカルでリポジトリを作成して、元のリポジトリを取り込む、
そして、ローカルでの作業結果を元のリポジトリに反映するという作業を専用コマンドで簡単に出来るようにしたのがGitです。

clone コマンドで、元の(リモート)リポジトリとリンクするローカルリポジトリを簡単に作れます。
pullやfetchコマンドで、リモートリポジトリのコミットをローカルリポジトリに簡単に取り込めます。
pushコマンドで、ローカルのコミット履歴をそのままリモートリポジトリに反映出来ます。

ローカルでの適当なコミット履歴だとマスターとなるリモートリポジトリに反映出来ない(したくない)、という場合は、
commit --amendやrebaseコマンドで既存のコミットやコミットコメントを奇麗にする、ということも出来ます。

# ブランチを気軽に作ることが出来る
Gitはブランチを非常に低コストで作ることが出来ます。
ブランチを作成するだけだと、数十バイト程度のファイルが作成されるだけであり。コミットして初めてそのコミット分"だけ"容量が増えるという、非常に軽量な仕組みとなっています。

Gitではそのブランチを活用することで、

- 「レビューが通って初めてリポジトリに"コミット"出来る」ようなことは無く、
　作業用のfeatureブランチを作成することで、そこで幾らでもコミットすることが出来る。
　→レビューOKとなった作業ブランチをマスターに取り込む。

- 開発のある程度の作業単位でブランチを作成することで、他担当者、他作業に影響されない開発が可能。
　→同時並行に複数作業が出来る。

- 作業ブランチに対して、さらにログ仕込み版ブランチというように、好き放題にブランチを作ることが出来る。

# そしてGitHub
Gitの人気に最も貢献しているのが、GitHubでしょう。

チームでリポジトリを共有するにはサーバーが必要です。
社内の共有サーバーが有ればそこでもいいのですが、複数拠点での開発となると面倒です。
GitHubは、その共有リポジトリを預かるサービスです。

作業ブランチのコミットをマスターブランチに取り込む為の申請を出す「プルリクエスト」機能も有名ですね。
作業項目(issue)管理機能も有ります。

# まとめ
とにかく、Gitは便利です。

便利なのですが、その独特のコマンドの扱い、考え方が初心者に分かり難いということも有ります。
幾つか記事を紹介します。

[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)

[こわくない Git](https://www.slideshare.net/kotas/git-15276118)

[【Git】リモートからの取得とリモートへの反映で行っていること(fetch,pull,push)](https://qiita.com/forest1/items/db5ac003d310449743ca)
git config の設定が想定した内容にならなかった

以下のドキュメントにあるようにクロスアカウント設定のための `git config --global credential.helper`を実行したが想定した設定内容にならず、`git clone` で失敗。

[クロスアカウントアクセス: AccountB のリポジトリユーザー用アクション ](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/cross-account-user-b.html)

```bash
$git config --global credential.helper "!aws codecommit credential-helper --profile MyCrossAccountAccessProfile $@"

$git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/xxxx
Cloning into 'xxxx'...
git: 'credential-aws' is not a git command. See 'git --help'.

$cat .gitconfig
[credential]
        helper = "aws --profile MyCrossAccountAccessProfile codecommit list-repositories --region ap-northeast-1 codecommit credential-helper --profile MyCrossAccountAccessProfile "
```

となり、`.gitconfig がおかしい`
本当は以下のドキュメントにあるように以下のようになって欲しい。

```.gitconfig
[credential]    
    helper = !aws codecommit credential-helper --profile=CodeCommitProfile $@ 
    UseHttpPath = true 
```

これは設定したのが Bash だったので展開されてしまったためようだった。

[What is $@ in Bash? [duplicate]](https://stackoverflow.com/questions/3898665/what-is-in-bash)

実は CodeCommit のドキュメントにも記載があったのだが、二重引用符ではなく単一引用符を使用すれば OK.

```bash
$git config --global credential.helper '!aws codecommit credential-helper --profile MyCrossAccountAccessProfile $@'

```

[ステップ 3: 認証情報ヘルパーを設定する](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-windows.html#setting-up-https-windows-credential-helper)

>Windows のコマンドラインではなく Bash エミュレーターを使用している場合は、二重引用符ではなく単一引用符を使用する必要があります。
【Ruby】インデントを使って綺麗なコードを書きたい

#綺麗にコードをかけるようになりたい
ruby勉強始めて２年目になるのですが、ただ書けるだけでなく、綺麗に書けるようになりたいと思うようになりました。
また別のサービスも作り始めようと思うので、その前に次はこのように綺麗に書こうという備忘録として記録します。
インデントが一番直し易いが、重要度が高い気がするので、今回はインデントに絞って書いていきます。
また、今回の内容は自分で考えたものではなく、人に話を聞いたりブログを読んだりして得たものをまとめたものです。

#基本的には２つ文字分のインデントで字下げをする。また、そこにはソフトタブを使う。

```
if a >= b
  puts "aはbより大きいです"
end

```
上の例ではputsは左より、２文字分横に移動しています。
ちなみにソフトタブはスペースでタブを表現するやり方です。ソフトがあるならハードがあるわけで、ハードタブは\tにて表現します。
どっちがいいのかという話になりますが、ハードタブの場合、開くエディタによって幅が変わるらしいのでソフトタブの方がいいのではという話を聞きました。

#case文におけるwhenはcaseと同じインデント
調べたらこれは賛否両論ありますね。。。。。
要は

```
case a
when 1
 puts "1です"
when 2
 puts "2です"
else 
 puts "どれでもありません"
end
```
か、

```
case a
　　when 1
　　　puts "1です"
　　when 2
 　　puts "2です"
　　else 
 　　puts "どれでもありません"
end
```
にするか話なのですが、エンジニアの方の話を聞いたり、[伊藤淳一さんのブログ](http://blog.jnito.com/entry/2013/02/28/084302)
を読んだりすると同列に揃えるべきなのではという意見が多くあります。
なので、とりあえずは揃える方向で自分もやっていきたいと思います。

#同じ要素は同じインデントに揃える
当たり前といえば当たり前の話なのですが、同じ要素はインデントの幅も合わせましょう。
急いで書いているとおろそかになることが多いので、自戒のつもりで列挙しました。。。。。

```
a = 1
b = 2
   c = 3
#cが右に寄りすぎ
````

また制御構造を記述する際にも、

```
if a
 if b
      if c
      end
 end
end
#if cが右に寄りすぎ
```

しっかり揃えてあげないと、わかりづらいです。

#引数は一列に揃えてあげる

メソッドを定義するとき、引数が複数ある場合がありますが、そこでも注意することがあります。
複数の引数をメソッドに定義する場合は、適当に改行するのではなく、一列に揃えてあげた方が見易いです。

```
#こうするのではなく、
def example (id, user_id, book_id, 
             a, b, c, name_id)

end

#一列に揃える
def example (id, 
             user_id, 
             book_id, 
             a, 
             b, 
             c, 
             name_id)

end

```

#未来の自分にわかりやすく書く
以前までは、一人で書くのにそんなにコードの綺麗さを重視する必要あるんかね？と思っていました。
ですが、リーダブルコードを読んで、今書いたコードを読む未来の自分に向けて綺麗に買う必要があるということを学びました。またこういうところでクセをつけておかないと、いざ複数人開発になった時に対応ができなくなるかなと思います。
インデント以外にもたくさん綺麗に書くべき項目があると思うので、それらもこれから更新していく予定です。
kerasでbackend その9

#概要

kerasのbackendで、autoencoderやってみた。

#実行結果

![auto0.png](https://qiita-image-store.s3.amazonaws.com/0/18104/4757c02b-5ff6-e0bf-28d0-05e9fd2dce08.png)


#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
from tensorflow.contrib.keras.python.keras.optimizers import SGD, Adam, RMSprop, Adagrad, Adadelta
from tensorflow.contrib.keras.python.keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt

(x_train, _), (x_test, _) = mnist.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1 : ])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1 : ])))

input_dim = 784
output_dim = 784
hidden_dim = 32
x = K.placeholder(shape = (None, input_dim), name = "x")
ytrue = K.placeholder(shape = (None, output_dim), name = "y")
W1 = K.random_uniform_variable((input_dim, hidden_dim), 0, 1, name = "W1")
W2 = K.random_uniform_variable((hidden_dim, output_dim), 0, 1, name = "W2")
b1 = K.random_uniform_variable((hidden_dim, ), 0, 1, name = "b1")
b2 = K.random_uniform_variable((output_dim, ), 0, 1, name = "b2")
params = [W1, b1, W2, b2]
hidden = K.relu(K.dot(x, W1) + b1)
ypred = K.relu(K.dot(hidden, W2) + b2)
loss = K.mean(K.square(ypred - ytrue), axis = -1)
opt = RMSprop()
updates = opt.get_updates(params, [], loss)
train = K.function(inputs = [x, ytrue], outputs = [loss], updates = updates)
test = K.function(inputs = [x], outputs = [ypred])
for ep in range(10000):
	for i in range(10):
		st = train([[x_train[i]], [x_train[i]]])
	if ep % 1000 == 0:
		print (ep, st[0])

n = 10
plt.figure(figsize = (20, 4))
for i in range(n):
	ax = plt.subplot(2, n, i + 1)
	plt.imshow(x_train[i].reshape(28, 28))
	ax = plt.subplot(2, n, i + 1 + n)
	img = test([[x_train[i]]])
	plt.imshow(img[0].reshape(28, 28))
plt.savefig("auto0.png")
plt.show()

```

以上。
IBM Cloud Private(ICP)標準のLogstashが対応しているプラグイン一覧

IBM Cloud Private(ICP)は標準でELKスタックが動いていますが、そのLogstashが対応しているプラグインの一覧です。今ログをElasticsearch以外に転送するための研究をしているのでメモ。

```
$ kubectl exec -it -n kube-system logstash-5c8c4954d9-78wfj /usr/share/logstash/bin/logstash-plugin list
```

- logstash-codec-cef
- logstash-codec-collectd
- logstash-codec-dots
- logstash-codec-edn
- logstash-codec-edn_lines
- logstash-codec-es_bulk
- logstash-codec-fluent
- logstash-codec-graphite
- logstash-codec-json
- logstash-codec-json_lines
- logstash-codec-line
- logstash-codec-msgpack
- logstash-codec-multiline
- logstash-codec-netflow
- logstash-codec-plain
- logstash-codec-rubydebug
- logstash-filter-clone
- logstash-filter-csv
- logstash-filter-date
- logstash-filter-dissect
- logstash-filter-dns
- logstash-filter-drop
- logstash-filter-fingerprint
- logstash-filter-geoip
- logstash-filter-grok
- logstash-filter-json
- logstash-filter-kv
- logstash-filter-metrics
- logstash-filter-mutate
- logstash-filter-ruby
- logstash-filter-sleep
- logstash-filter-split
- logstash-filter-syslog_pri
- logstash-filter-throttle
- logstash-filter-urldecode
- logstash-filter-useragent
- logstash-filter-uuid
- logstash-filter-xml
- logstash-input-beats
- logstash-input-couchdb_changes
- logstash-input-dead_letter_queue
- logstash-input-elasticsearch
- logstash-input-exec
- logstash-input-file
- logstash-input-ganglia
- logstash-input-gelf
- logstash-input-generator
- logstash-input-graphite
- logstash-input-heartbeat
- logstash-input-http
- logstash-input-http_poller
- logstash-input-imap
- logstash-input-irc
- logstash-input-jdbc
- logstash-input-kafka
- logstash-input-log4j
- logstash-input-lumberjack
- logstash-input-pipe
- logstash-input-rabbitmq
- logstash-input-redis
- logstash-input-s3
- logstash-input-snmptrap
- logstash-input-sqs
- logstash-input-stdin
- logstash-input-syslog
- logstash-input-tcp
- logstash-input-twitter
- logstash-input-udp
- logstash-input-unix
- logstash-input-xmpp
- logstash-output-cloudwatch
- logstash-output-csv
- logstash-output-elasticsearch
- logstash-output-file
- logstash-output-graphite
- logstash-output-http
- logstash-output-irc
- logstash-output-kafka
- logstash-output-nagios
- logstash-output-null
- logstash-output-pagerduty
- logstash-output-pipe
- logstash-output-rabbitmq
- logstash-output-redis
- logstash-output-s3
- logstash-output-sns
- logstash-output-sqs
- logstash-output-statsd
- logstash-output-stdout
- logstash-output-tcp
- logstash-output-udp
- logstash-output-webhdfs
- logstash-output-xmpp
- logstash-patterns-core
- x-pack
kerasでbackend その8

#概要
kerasのbackendで、sin問題やってみた。

#実行結果

![sin0.png](https://qiita-image-store.s3.amazonaws.com/0/18104/0a7521c6-86ac-fef5-3f1d-cd8fd275f7f8.png)


#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
from tensorflow.contrib.keras.python.keras.optimizers import SGD
import numpy as np
import matplotlib.pyplot as plt

dx = np.arange(-3, 3, 0.1)
dy = np.sin(dx)
input_dim = 1
output_dim = 1
hidden_dim = 8
x = K.placeholder(shape = (None, input_dim), name = "x")
ytrue = K.placeholder(shape = (None, output_dim), name = "y")
W1 = K.random_uniform_variable((input_dim, hidden_dim), 0, 1, name = "W1")
W2 = K.random_uniform_variable((hidden_dim, output_dim), 0, 1, name = "W2")
b1 = K.random_uniform_variable((hidden_dim, ), 0, 1, name = "b1")
b2 = K.random_uniform_variable((output_dim, ), 0, 1, name = "b2")
params = [W1, b1, W2, b2]
hidden = K.tanh(K.dot(x, W1) + b1)
ypred = K.tanh(K.dot(hidden, W2) + b2)
loss = K.mean(K.square(ypred - ytrue), axis = -1)
opt = SGD()
updates = opt.get_updates(params, [], loss)
train = K.function(inputs = [x, ytrue], outputs = [W1, b2, loss], updates = updates)
for ep in range(2000):
	for i in range(60):
		c1, c2, c3 = train([[[dx[i]]], [[dy[i]]]])
	if ep % 100 == 0:
		print (ep, c3[0])
test = K.function(inputs = [x], outputs = [ypred])
p = []
for i in range(60):
	preds = test([[[dx[i]]]])
	p.append(preds[0][0])
plt.plot(dx, dy, 'b', dx, p, 'r--')
plt.savefig("./sin0.png")
plt.show()



```

以上。
kerasでbackend その7

#概要
kerasのbackendで、fizzbuzz問題やってみた。

#実行結果

```
0 [ 1.56234002]
100 [ 0.21391739]
200 [ 0.10527255]
300 [ 0.06537795]
400 [ 0.01701604]
500 [ 0.0023935]
600 [ 0.00431998]
700 [ 0.00739238]
800 [ 0.00098056]
900 [ 0.00199422]
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
31
32
fizz
34
buzz
fizz
37
38
fizz
buzz
41
fizz
43
44
fizzbuzz
46
47
fizz
49
buzz
fizz
52
53
fizz
buzz
56
fizz
58
59
fizzbuzz
61
62
fizz
64
buzz
fizz
67
68
fizz
buzz
71
fizz
73
74
fizzbuzz
76
77
fizz
79
buzz
fizz
82
83
fizz
buzz
86
fizz
88
89
fizzbuzz
91
92
fizz
94
buzz
fizz
97
98
fizz
buzz

```

#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
from tensorflow.contrib.keras.python.keras.optimizers import SGD, Adam, RMSprop, Adagrad, Adadelta
import numpy as np


def binary_encode(i, num_digits):
	return np.array([i >> d & 1 for d in range(num_digits)])

def fizz_buzz_encode(i):
	if i % 15 == 0:
		return np.array([0, 0, 0, 1])
	elif i % 5  == 0:
		return np.array([0, 0, 1, 0])
	elif i % 3  == 0:
		return np.array([0, 1, 0, 0])
	else:
		return np.array([1, 0, 0, 0])

def fizz_buzz(i, prediction):
	return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]

NUM_DIGITS = 8
dx = np.array([binary_encode(i, NUM_DIGITS) for i in range(101)])
dy = np.array([fizz_buzz_encode(i) for i in range(101)])

input_dim = 8
output_dim = 4
hidden_dim = 48
x = K.placeholder(shape = (None, input_dim), name = "x")
ytrue = K.placeholder(shape = (None, output_dim), name = "y")
W1 = K.random_uniform_variable((input_dim, hidden_dim), -1, 1, name = "W1")
W2 = K.random_uniform_variable((hidden_dim, output_dim), -1, 1, name = "W2")
b1 = K.random_uniform_variable((hidden_dim, ), -1, 1, name = "b1")
b2 = K.random_uniform_variable((output_dim, ), -1, 1, name = "b2")
params = [W1, b1, W2, b2]
hidden = K.tanh(K.dot(x, W1) + b1)
ypred = K.tanh(K.dot(hidden, W2) + b2)
loss = K.mean(K.square(ypred - ytrue), axis = -1)
opt = Adam()
updates = opt.get_updates(params, [], loss)
train = K.function(inputs = [x, ytrue], outputs = [loss], updates = updates)
test = K.function(inputs = [x], outputs = [ypred])
for ep in range(1000):
	for i in range(100):
		st = train([[dx[i + 1]], [dy[i + 1]]])
	if ep % 100 == 0:
		print (ep, st[0])

for i in range(100):
	pre = test([[dx[i + 1]]])
	#print (pre[0])
	print (fizz_buzz(i + 1, np.argmax(pre[0])))



```

以上。
kerasでbackend その6

#概要
kerasのbackendで、xor問題やってみた。

#実行結果

```
0 [ 0.99838728]
100 [ 0.99522972]
200 [ 0.86496431]
300 [ 0.81149882]
400 [ 0.75091565]
500 [ 0.67710733]
600 [ 0.60705864]
700 [ 0.54741299]
800 [ 0.49332687]
900 [ 0.43740678]
1000 [ 0.37347558]
1100 [ 0.29807252]
1200 [ 0.21222651]
1300 [ 0.12819625]
1400 [ 0.06629251]
1500 [ 0.03200632]
1600 [ 0.01577413]
1700 [ 0.00830716]
1800 [ 0.00472095]
1900 [ 0.00288095]
[0.0, 0.0] [[ 0.0213472]]
[0.0, 1.0] [[ 0.8747952]]
[1.0, 0.0] [[ 0.8718797]]
[1.0, 1.0] [[ 0.03415748]]

```

#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
from tensorflow.contrib.keras.python.keras.optimizers import SGD

dx, dy = [], []
dx.append([0.0, 0.0])
dx.append([0.0, 1.0])
dx.append([1.0, 0.0])
dx.append([1.0, 1.0])
dy.append(0.0)
dy.append(1.0)
dy.append(1.0)
dy.append(0.0)

input_dim = 2
output_dim = 1
hidden_dim = 8
x = K.placeholder(shape = (None, input_dim), name = "x")
ytrue = K.placeholder(shape = (None, output_dim), name = "y")
W1 = K.random_uniform_variable((input_dim, hidden_dim), 0, 1, name = "W1")
W2 = K.random_uniform_variable((hidden_dim, output_dim), 0, 1, name = "W2")
b1 = K.random_uniform_variable((hidden_dim, ), 0, 1, name = "b1")
b2 = K.random_uniform_variable((output_dim, ), 0, 1, name = "b2")
params = [W1, b1, W2, b2]
hidden = K.tanh(K.dot(x, W1) + b1)
ypred = K.tanh(K.dot(hidden, W2) + b2)
loss = K.mean(K.square(ypred - ytrue), axis = -1)
opt = SGD()
updates = opt.get_updates(params, [], loss)
train = K.function(inputs = [x, ytrue], outputs = [loss], updates = updates)
test = K.function(inputs = [x], outputs = [ypred])
for ep in range(2000):
	for i in range(4):
		st = train([[dx[i]], [[dy[i]]]])
	if ep % 100 == 0:
		print (ep, st[0])

for i in range(4):
	st = test([[dx[i]]])
	print (dx[i], st[0])



```


以上。
"VBoxClient (seamless): failed to start" エラーが出てしまったときの解決方法

# Virtualbox環境でUbuntuにGuest Additionsをインストールしようとしてハマった

![vboxerror.png](https://qiita-image-store.s3.amazonaws.com/0/225010/2b1c23ea-a5bc-ebda-852f-5925a4c6fb80.png)


Virtualbox環境でUbuntu17.10にGuest Additionsをインストールしようとしてハマったので解決策をメモ代わりに書いときます。

## 起こった問題

新しい環境をセットアップし、Guest Additionsをインストールしたときに以下のエラーが出てしまいました。

```
VBoxClient (seamless): failed to start. Stage: Setting guest IRQ filter mas Error: VERR_INTERNAL_ERROR
```

## 原因

[こちら](https://askubuntu.com/questions/985815/vboxclient-seamless-failed-to-start-stage-setting-guest-irq-filter-mask-err)で調べてみるとインストール時に必要なライブラリがないためエラーが起こっているようです。

## 解決方法

ですので以下の必要なライブラリをインストールしておきましょう。

- gcc
- make
- perl

```sh:terminal
$ sudo apt install gcc make perl -y
```

後はGuest Additionsを再インストールして再起動すれば終わりです。

# 終わりに

久々にセットアップとかをするとこういう問題にぶち当たってモチベーションが下がってしまいますよね。
この問題の解決策を書いている日本語の記事があまり見当たらなかったので苦労しました。
何かのお役に立てたなら幸いです。
【Windows】nvm、npm、node.jsのインストール

## 技術要件
* Windows10
* Ubuntu 16.04
* Vagrant 2.0.1

## nvmのインストール

```
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash

$ source .nvm/nvm.sh  #パスを通す
$ nvm --version  #バージョン確認
```


## Node.jsのインストール

### インストールできるバージョンの確認

```
$ nvm ls-remote 
        v0.1.14
        v0.1.15
        v0.1.16
        v0.1.17
        v0.1.18
        v0.1.19
        v0.1.20
　　　　　・
　　　　　・
　　　　　・
```

### インストール

先ほど表示した中で、最新のものを指定してインストール。

このときはv8.11.1が最新でした。

```
$ nvm install v8.11.1
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v8.11.1 (npm v5.6.0)
Creating default alias: default -> v8.11.1
```

### 確認

```
$ node -v
v8.11.1
```

```
$ nvm ls
->      v8.11.1
default -> v8.11.1
node -> stable (-> v8.11.1) (default)
stable -> 8.11 (-> v8.11.1) (default)
iojs -> N/A (default)
lts/* -> lts/carbon (-> v8.11.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.14.1 (-> N/A)
lts/carbon -> v8.11.1
```

### デフォルトに設定

これを設定することで、起動時に毎回設定しなくてもよくなる。

```
$ nvm alias default v8.11.1
```

## npmのインストール

```
$ sudo apt-get install npm
```
関数を「分割」してはいけない

*注: 記述する上で面倒なので、以下で「関数」と単に書いてある場合、メソッドやプロシージャといったものをまとめて指すこととする。*

# TL;DR
**「分割」しようとするな。一つ一つ、別の処理に「分解」しろ。**

# そもそもなぜ「分割」しろといわれるのか
**短くしたいから**。

人間、長い文章は途中で混乱するものだ。
そしてプログラムも結局は文章である。

多くの日本人が英語の本を読んだら混乱するように、人類は長いプログラムを読むと混乱する。これは当然だ。

なにしろプログラムは「プログラミング言語」という言語で記述されている。この言語は困ったことに、なんと外国人どころか**コンピュータと対話する**ための言語である。
そりゃあ、慣れないうちは（あるいは慣れたとしても）混乱して当然だ。

# 重要なのは「短い」ことではない
「This is a pen」は日本人を混乱させるだろうか。
もちろん、させないだろう。「これはペンです」。簡単だ。

では「Er ist wieder da」はどうだろう (いや、これは人によっては通じると思うが) 。
答えは「彼、再び」といった具合になるらしい。ちなみにドイツ語で、小説のタイトルである。彼再び！って、なんのこっちゃ？[^1]

そう、仮に十分に短い場合であっても、**それ単独で意味が通じなければ、結局多方面を調べ回るハメになる**。当然時間がかかる。
重要なのは、わかりやすいことだ。もし混乱しないのであれば、長くてもその方がよい。
**短くしろと言われるのは、短ければ「マシ」になりやすいからであって、短くすることそれ自体は解決策たり得ない**。

# 例
ここにクソ長いメソッドがあり、これを短くしろと命じられたとする。

```
public void hoge(List<Hoge> h, List<Fuga> f){

    ...(なんかいっぱい)...

}
```

## 駄目な例
「切り離しました！」

```
public void hoge(List<Hoge> h, List<Fuga> f){

    part1(h, f);
    part2(h, f);
    part3(h, f);

}

private void part1(List<Hoge> h, List<Fuga> f){

    ...(なんか)...

}

(以下略)
```

**ぶん殴られても文句言えない**。

## 何が駄目か
単純に、**結果どうなるのかを見通すためには全部読まなければならない**。
part1, part2, part3 はそれぞれ独立していないので、本当にただ切り離しただけなのだ。
こうなってくると単に連続した処理が別の場所に書かれただけで、**いろいろなところを読まなければならない分却ってめんどくさい**。

## どうすべきか
こうすると**少し**改善する。
(他にもいろいろやるべきことはあるが、今回の記事でいいたいのはここ)

```
public void hoge(List<Hoge> h, List<Fuga> f){

    List<Pair<Hoge, Fuga>> result1 = part1(h, f);
    List<Pair<Hoge, Fuga>> result2 = part2(result1);
    List<Pair<Hoge, Fuga>> result3 = part3(result2);

}

protected List<Pair<Hoge, Fuga>> part1(List<Hoge> h, List<Fuga> f){

    ...(なんか)...

}
protected List<Pair<Hoge, Fuga>> part2(List<Pair<Hoge, Fuga>> result1){

    ...(なんか)...

}

(以下略)
```

## どう違うのか
先ほどと違い、part1, part2, part3 は**それぞれ「結果」を返している**。
乱暴な言い方だが、**結果が出るということは、その処理一つだけでも意味が通り、検証が可能だということである**。
このため、自動ユニットテストも掛けやすくなる。手動のテストもいくらかやりやすくなるだろう。
(protected になっていることに気づいたらなかなか鋭い。普段ならリフレクションで private を触らせるが、今回はそういう意味合いも込めて protected にした) 

[^1]: 結構面白かった。日本語訳も出てるので興味があれば調べるとよい。そう、調べないとわからんだろ。
Linux で任意のサイズのファイルを作る

基本的に以下に書いてありましたが、メモ。

+ [指定したサイズのダミーファイルを作成するには（Linux編）](https://qiita.com/UmedaTakefumi/items/c850eb03c664a9fa6d20)
+ [ddを使ったテストファイルの作り方 ](http://www.server-memo.net/tips/test-data.html)

以下は 1GByte のファイルを作る例

```bash
# 1Gbyte のファイルを作成
$dd if=/dev/zero of=1G.dummy bs=1M count=1000

# 確認
$ls -lh |grep 1G
-rw-rw-r--. 1 ec2-user ec2-user 1000M  4月  6 04:44 1G.dummy

```

以下は 9MByte のファイルを作る例

```bash
# 9Mbyte のファイルを作成
$dd if=/dev/zero of=test9M bs=1M count=9

# 確認
$ls -lh |grep 9M
-rw-rw-r--. 1 ec2-user ec2-user  9.0M  4月  6 04:43 test9M

```

`man dd`を見るとなるほどという感じ。

```bash
$man dd

       if=FILE
              read from FILE instead of stdin
              
       bs=BYTES
              read and write up to BYTES bytes at a time
              
       count=N
              copy only N input blocks
              
       of=FILE
              write to FILE instead of stdout
```           
     
bs と count オプションを変えれば任意のサイズのファイルが作成できる。
micro:bitの無線機能を使って宝探しゲーム

子供のプログラミング勉強用に買ってみたmicro:bitがとても面白く、プログラミング初心者ですが、いろいろ作って遊んでます。

子供の評判が一番良かったのが、2台のmicrobitを使った宝探しゲームです。「宝」のmicrobitはradioの送信をし続けて、探す方のmicrobitがそのRSSI値に応じて違う高さの音をスピーカで鳴らし続ける、というものです。

探す方はアルミ箔を張った段ボール箱に入れてある程度方角が分かるようにしてます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/244823/02c8ca58-5025-f94b-e112-019fcaa7e7ba.png)

以下、宝側のblockです。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/244823/f4a2f723-b347-436c-6052-dda60ce6f557.png)

以下、探す側のblockです。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/244823/bf3f63cb-2c2b-7871-1709-1e327e3ecbf0.png)
Python で文字列連結

# リテラル

元ネタ
https://note.nkmk.me/python-long-string/

```
s = 'aaa' 'bbb'
```

```
s = 'aaaaaaa' \
    'bbbbbbb'
```

```
s = ('aaaaaa'
     'bbbbbb')
```

```
s = "1234567890" * 2
-> "12345678901234567890"
```

# オブジェクト

```
str1 = "abc"
str2 = "def"

str3 = str1 + str2
-> "abcdef"

こんなのも OK

str4 = str1 + ":" + "str2"
-> "abc:def"
```
Runkit で作るお手軽サーバレス Web API

# Runkitとは
[Runkit](https://runkit.com) は npm が使える Node.js 向け Playground です。それぞれのコード・スニペットを Notebook と呼び、npm からモジュールをインポートしたり、ある Notebook を別の Notebook へインポートしたりもできます。

今回は、この Runkit の機能のひとつである **Endpoint** という、Notebook を AWS Lambda ファンクションのように Web API として公開することができる機能について紹介します。

# 使い方
最もシンプルな使い方は

```js
exports.endpoint = (req, resp) => {
  resp.end("Hello!");
}
```
こんな感じで `exports.endpoint` に リクエストとレスポンスを受け取るハンドラを定義するもの。

publishの横にある**endpoint**というリンクから、そのNotebookに割り当てられたEndpointのURLが分かります。
![Selection_057.png](https://qiita-image-store.s3.amazonaws.com/0/18973/a26b25c1-359d-5e1d-01e9-b854a98bb8e6.png)

上のサンプルのEndpoint URLは https://untitled-pnq6ao8zpp2j.runkit.sh に割り当てられているので、そこへ [httpie](https://qiita.com/ytabuchi/items/02fa15ac209823a4d19f) してみると

```bash
 $ http https://untitled-pnq6ao8zpp2j.runkit.sh/
HTTP/1.1 200 OK
connection: close
content-length: 6
date: Sat, 07 Apr 2018 04:31:54 GMT
runkit-rate-limit-remaining: 9989
strict-transport-security: max-age=31536000
x-powered-by: runkit.com

hello!

```
レスポンスに定義された文字列が返ってきました。

## Runkitのヘルパを使う
上のシンプルなやり方は実際使うには不便です。なぜかというと、`export.endpoint` は内部では以下のように `http.Server` の `request` イベントコールバックに引き渡されるため、リクエストとして帰ってくるのが [http.IncomingMessage](https://nodejs.org/docs/v0.10.40/api/http.html#http_http_incomingmessage) というストリームだったりするので、リクエスト・ボディのシリアライズ処理などが面倒なのです。

```js
server.on("request", (req, resp) => {
  resp.end("hello!");
});
```

なので、あらかじめ Runkit が用意している [Endpoint 用のヘルパ Notebook](https://runkit.com/runkit/json-endpoint) をインポートしてもう少し便利につかいましょう。

```js
const endpoint = require("@runkit/runkit/json-endpoint/1.0.0");

endpoint(exports, incomingData => {
  return incomingData.body;
})
```
これで `incomingData` としてシリアライズされたリクエストのデータを受け取れるようになりました。
上はパラメータとして受け取ったものをただエコーするだけの例ですが、これを再び httpie で叩いてみると

```bash
 $ http https://untitled-pnq6ao8zpp2j.runkit.sh name=justine
HTTP/1.1 200 OK
access-control-allow-origin: *
access-control-expose-headers: tonic-rate-limit-remaining
connection: close
content-length: 23
content-type: application/json; charset=utf-8
date: Sat, 07 Apr 2018 06:22:05 GMT
etag: W/"17-C5+qw1XJcXNTe59jonBwYQ"
runkit-rate-limit-remaining: 9956
strict-transport-security: max-age=31536000
vary: Accept-Encoding
x-powered-by: runkit.com

{
    "name": "justine"
}
```
リクエスト・ボディがしっかり受け取れているのが分かりますね。

## Expressとの併用
```js
const express = require("@runkit/runkit/express-endpoint/1.0.0");
const app = express(exports);

app.get("/:name", (req, res) => res.send(`hey ${req.params.name}`))
```
`exports` を Express に渡すことで、Express を使った Endpoint 実装もできます。

# 制限
Runkitは便利ですが、以下のような制限もあります。

- Endpointで利用できるスキーマは **HTTPS** のみ
- Betaのため非商用利用限定（商用利用したい場合は問い合わせが必要）
- リクエストのタイムアウトは60秒で固定
- エンドポイントにはレート・リミットあり
  - HTTPレスポンスに含まれている `runkit-rate-limit-remaining` というヘッダのカウントが0になったらおそらく終わり。なので時間か日単位でリセットされるまで**9999**回のリクエストまで可能。

とはいえ、ちょっと遊んだり個人で使うぶんには全く気にならなそうですね。

参考: [Runkit Endpoint](https://runkit.com/docs/endpoint)
PHPでNEMのアドレス有効性チェック

PHP 5.3〜

ネットワーク種別は、単純に頭文字をチェックするんでもOK。

```sh
$ composer require christian-riesen/base32
$ composer require izayoi256/keccak
```

```php5
require_once __DIR__ . '/vendor/autoload.php';

use Base32\Base32;
use izayoi256\Keccak;

define('NETWORK_ID_MAINNET', 104);
define('NETWORK_ID_MIJINNET', 96);
define('NETWORK_ID_TESTNET', -104);

function is_valid_address($address, array $networkIds = array())
{
    if (!is_string($address)) {
        throw new \InvalidArgumentException('Address must be string.');
        // または
        // return false;
    }

    if (!is_array($networkIds) || $networkIds !== array_filter($networkIds, 'is_int')) {
        throw new \InvalidArgumentException('Network IDs must be an array of integer.');
    }

    $str = str_replace('-', '', $address);

    if (strlen($str) !== 40) {
        return false;
    }

    $decoded = bin2hex(Base32::decode($str));
    $hash = substr($decoded, 0, 42);
    // hex2bin()はPHP5.4以降のため、pack('H*', $var)を使用する。
    $bin = pack('H*', $hash);
    $checksum = substr(Keccak::hash($bin, 256), 0, 8);

    if (substr($decoded, 42) !== $checksum) {
        return false;
    }

    $networkValid = !count($networkIds);

    foreach ($networkIds as $networkId) {
        $hex = bin2hex(pack('c', $networkId));
        $networkValid = $networkValid || preg_match("/^{$hex}/", $decoded);
    }

    return $networkValid;
}

// アドレスの有効性をチェックする
is_valid_address('TCY3JIKAYRUPEFDAJUZX7TPOOV6M22E4YU6R42RI');
// TRUE

// アドレスの有効性と、ネットワーク種別をチェックする
is_valid_address('TCY3JIKAYRUPEFDAJUZX7TPOOV6M22E4YU6R42RI', array(NETWORK_ID_MAINNET));
// FALSE

```
HSPで予期せぬエラーで作業中のデーターが消えるのを防ぐ

作業データーがフリーズした後の強制終了によって消えないようにする方法。
HSPが出すエラー(エラー番号が書かれているもの)ではなく、Windowsが出すエラーに対応。

## Windowsから情報の回復を求められたことを知る
Windowsから情報の回復を求められたことを知るには、Kernel32のRegisterApplicationRecoveryCallback関数でコールバック関数を登録すればよい。

```cpp
//作業データーが強制終了によって失うことがないメモ帳

#uselib "kernel32.dll
#func DebugBreak "DebugBreak"
#func RegisterApplicationRecoveryCallback "RegisterApplicationRecoveryCallback" int, int, int, int
#func ApplicationRecoveryFinished "ApplicationRecoveryFinished" int
#define TRUE 1

#uselib ""
#func ApplicationRecoveryCallback "" int

#include "hscallbk.as"
setcallbk fnRecoveryCallback, ApplicationRecoveryCallback,*OnRecoveryCallback

RegisterApplicationRecoveryCallback varptr(fnRecoveryCallback), 0, 0, 0

sdim buf
mesbox buf, ginfo_winx, ginfo_winy-20, 5
button gosub "停止！", *btn
stop

*OnRecoveryCallback //情報の回復が求められた
	notesel buf
	notesave "backup.bak" //作業中のデーターを保存する
	ApplicationRecoveryFinished TRUE //作業が完了した
return 0

*btn
	DebugBreak //プログラムの実行を停止する
return
```
次回起動時に保存した作業中のファイルを読み込めばOK。