OmniAICreator/Qiita-1.07M huggingface dataset:
Mingw64にYices2をインストールする

Yices2は昔からあるSMTソルバーです．
現在ではSMTソルバーと言えばCVC4やZ3がメジャーですが，それらが登場する以前はこのYicesが一世を風靡していたらしい？
gprefとGMPに依存しています．途中，Mingwでは解決できないシンボルがソースコード中に登場するためそれを修正する必要があります．

## gprefのインストール

```Terminal.sh
$ cd gperf-3.0.4
$ ./configure
$ make
$ make install
```

## GMPのインストール

```Terminal.sh
$ cd gmp-6.1.1
$ ./configure
```

```summary-of-build-options.sh
configure: summary of build options:

  Version:           GNU MP 6.1.1
  Host type:         ivybridge-pc-mingw64
  ABI:               64
  Install prefix:    /usr/local
  Compiler:          gcc
  Static libraries:  yes
  Shared libraries:  no
```

```Terminal.sh
$ make -j 4
$ make install
```

make checkをしていないのでCAUTIONは出るが無視する．

```CAUTION.sh
+-------------------------------------------------------------+
| CAUTION:                                                    |
|                                                             |
| If you have not already run "make check", then we strongly  |
| recommend you do so.                                        |
|                                                             |
| GMP has been carefully tested by its authors, but compilers |
| are all too often released with serious bugs.  GMP tends to |
| explore interesting corners in compilers and has hit bugs   |
| on quite a few occasions.                                   |
|                                                             |
+-------------------------------------------------------------+
```

## Yices-2.5.1のインストール

```Terminal.sh
$ cd yices-2.5.1
```

/src/frontend/yices/yices_reval.cの44行目を編集する．

```yices_reval.c
- #define STDIN_FILENO (_fileno(stdin))
+ #define STDIN_FILENO (fileno(stdin))
```

46行目も編集する．

```yices_reval.c
- #define isatty _isatty
+ #define isatty isatty
```

./configureのオプションは以下．

* LDGLAGSに-L/usr/local/lib
* --with-static-gmpに/usr/local/lib/libgmp.a
* --with-static-gmp-include-dirに/usr/local/include

```Terminal.sh
$ ./configure LDFLAGS=-L/usr/local/lib --with-static-gmp=/usr/local/lib/libgmp.a --with-static-gmp-include-dir=/usr/local/include
$ make
$ make install
```
JSONのキーが "" で囲まれてなかったときに置換した

こういう変なJSONぽいものがあったので、

```json
{
  name : "simeji",
  hp: 3,
  mp: 55
}
```

これで置換した。vimで。

```vim
:%s/\v^( +)([^" ]+)(\ +)?:/\1"\2"\3:/g
```

結果。

```json
{
  "name" : "simeji",
  "hp": 3,
  "mp": 55
}
```

よかったです。それだけです。
ネットワークアダプタのMACアドレスを取得する


ifconfigの出力をスクレイピングして・・・とかやらなくても、

```bash
cat /sys/class/net/eth0/address
```

とするだけでOKみたいです。

Bluemix IoTのQuickStartを使うときに、デバイスのMACアドレスをDevice IDとするのが慣例のようなので、自動で何台か動かすときにややこしいことしなくてもプログラムから一発でMACアドレス取得できて便利ですね。

http://stackoverflow.com/questions/245916/best-way-to-extract-mac-address-from-ifconfigs-output

ちなみに、コロンを取るなら、こんな感じかな。

```bash
cat /sys/class/net/eth0/address | sed -e 's/://g'
```
Android Studioでファイルヘッダのユーザ名を変更する


Macにて。


デフォルトでFileTemplates -> includes -> File Headerに記述がある通りにコメントが入るけど、
`${USER}` という変数はどこから…？

デフォルトではログインユーザ名になっているようだが、変更できる。
下記ファイルを編集する。AndroidStudio起動時にjvmに渡すパラメータのようだ。

```
/path/to/Android\ Studio.app/Contents/bin/studio.vmoptions
```

```
-Duser.name=My New Name
```

これでAndroidStudioにユーザ名が渡る模様。


また直接試していないが、テンプレート内で

```
#set ($USER = "My New Name")
```

などとすることで、テンプレート内変数を上書きできる模様。
これでも実現できそうだ。


# 参考

* [IntelliJのファイルヘッダーコメントを変更する - Qiita]
(http://qiita.com/iwamatsu0430/items/95a525697523dfb27367)
* [java - Change Author template in Android Studio - Stack Overflow](http://stackoverflow.com/questions/21160288/change-author-template-in-android-studio)
Microsoft Teams に PowerShell で投稿してみる

## 経緯

Microsoft から対抗 Slack と噂されていたサービスが発表されました。

普段仕事で Office365 を使っている私にとっては、Microsoft Teams はとてもワクワクするサービスですね。

* [Introducing Microsoft Teams—the chat-based workspace in Office 365](https://blogs.office.com/2016/11/02/introducing-microsoft-teams-the-chat-based-workspace-in-office-365/)

早速ですが Microsoft Teams に PowerShell から投稿してみることを試してみました。


## 検証環境

* Windows 10 Pro
* PowerShell 5.0

## 手順

* チャネル名の右にある点々をクリックして、コネクタをクリックします  
  ![1.png](https://qiita-image-store.s3.amazonaws.com/0/118961/2aab3d91-31ee-0bf2-f648-bcb3270b847e.png)  

---
* **Incoming Webhook** を探して **追加** をクリックします  
  ![2.png](https://qiita-image-store.s3.amazonaws.com/0/118961/4f9a0db9-f92e-5253-b445-2cb748f27dd4.png)  

---
* 名前やアイコンを設定します  
  ![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/118961/9fc919fb-94cd-eb7b-8abe-a08966141743.png)  

---
* スクロールして **作成** をクリックします  
  ![3-2.png](https://qiita-image-store.s3.amazonaws.com/0/118961/13d50aed-c40b-b6d8-5f5c-309da35515a2.png)  

---
* URL が表示されますので、コピーしてテキストエディタにでも貼り付けておきます  
  ![4.png](https://qiita-image-store.s3.amazonaws.com/0/118961/a9640e1b-e1e1-432b-d00a-79ea164fff8f.png)  

---
* チャネルの画面に戻ると 3 で付けた名前とアイコンの何者かが参加しています  
  ![6.png](https://qiita-image-store.s3.amazonaws.com/0/118961/f743de7b-9763-1361-c561-ef8a6e4a5c0c.png)

---
* Hello World  
  1万年と2000年前から使われるこのフレーズを使います。  
  ![7.png](https://qiita-image-store.s3.amazonaws.com/0/118961/0f9e3892-a084-f4d5-4d82-e4ce3773f54b.png)  
  下記コマンドを PowerShell から入力すると画像のように投稿されると思います。

```ps1
$URI = 'コピーしてテキストエディタにでも貼り付けておいた URL'
$body = ConvertTo-JSON @{
  text  = 'Hello World'
}
Invoke-RestMethod -uri $URI -Method Post -body $body -ContentType 'application/json'
```

---
* Office 356 Connectors API を使って少しリッチな投稿を試す  
  成功するとこのような感じで表示されます。  
  ![9.png](https://qiita-image-store.s3.amazonaws.com/0/118961/1210520d-e5b7-d82c-f982-c9cc29c86e86.png)  
  Office 356 Connectors API は今回始めて使ったのですが楽しいですね。  

```ps1
$URI = 'コピーしてテキストエディタにでも貼り付けておいた URL'
$body = ConvertTo-JSON -Depth 4 @{
  summary  = 'Microsoft Teams テスト'
  title    = '自己紹介'
  sections = @(
    @{
      activityTitle = 'miyamiya'
      activityImage = 'http://1bed.saloon.jp/wp-content/uploads/2010/08/904153-150x150.jpg'
    }
    @{
      title = 'facts テスト'
      facts = @(
        @{
          name  = '好きな食べ物'
          value = 'ステーキ, ラーメン'
        }
        @{
          name  = '好きな芸能人'
          value = 'misono'
        }
        @{
          name  = '好きなプログラム言語'
          value = 'PHP'
        }
      )
    }
  )
}
$body = [Text.Encoding]::UTF8.GetBytes($body)
Invoke-RestMethod -uri $URI -Method Post -body $body -ContentType 'application/json'
```

## 参考 URL

* [Office 365 Connectors API Reference](https://dev.outlook.com/Connectors/Reference)
* [Post notifications to Microsoft Teams using PowerShell](https://blogs.technet.microsoft.com/privatecloud/2016/11/02/post-notifications-to-microsoft-teams-using-powershell/)
kaliのvagrant boxを作る。

# TL;DR

kaliをvagrantで入れようと思ったが、既存のboxだとエラーが出る。
せっかくなので自分でvagrantのboxを作ってみた。

# インストール

[公式](https://www.offensive-security.com/kali-linux-vmware-virtualbox-image-download/)からvirtual boxのイメージ（`Kali Linux 64 bit VBox`）を落としてくる。
3GB以上あるので気長に待つ。

落としたらSHA1Sumをチェックする。
公式だとgpg使っていろいろしているけど面倒なので、ハッシュが合ってるかだけみる。

```
$ shasum Kali-Linux-2016.2-vbox-amd64.ova
a22978e7db5da82a6d013da51be227ee2982042d  Kali-Linux-2016.2-vbox-amd64.ova
# ↑がダウンロードページに乗っているSHA1Sumと一致することを確かめる。
```

virtual boxを開いて、`ファイル->仮想アプライアンスのインポート`からovaファイルを開く。

インポートが終わったら、設定をいじる。
もし`Oracle VM VirtualBox Extension Pack`が必要とでたら、Extension Packをインストールするか、`ポート->USB`から`USBコントロールの有効化`を切ると良い。

設定が終わったら、kaliを起動する。

usernameはroot、パスワードはtoor

# 初期設定

## vagrantユーザーの作成

```
$ useradd -m vagrant
$ passwd vagrant
$ usermod -a -G sudo vagrant # vagrantにsudo権限を追加する。
```

## sshのセットアップ


```
$ su vagrant # 移行はvagrantユーザーで行う。
$ mkdir /home/vagrant/.ssh
$ chmod 700 /home/vagrant/.ssh

# vagrant で公開されている Insecure Keypair(安全でないキーペア) のダウンロード
$ cd /home/vagrant/.ssh
$ curl -k -L -o authorized_keys 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub'

$ chmod 600 /home/vagrant/.ssh/authorized_keys
# sshの自動起動を設定
$ systemctl enable ssh.service
```

## sudoの設定
vagrant up時にpassword無しでsudo出来るように設定を変える。

```
$ sudo visudo
%sudo ALL=(ALL:ALL) NOPASSWD:ALL # こう変更する。
```

## cacheのクリア

```
$ apt-get autoclean
$ apt-get clean
```

## 終了

以上で最低限の設定は終了です。
その他、iptablesとか設定が必要だったらしてください。

```
$ sudo shutdown -h now
```

# boxの作成

```
$ cd kali_box
# --base {仮想マシン名}　--output {出力するbox名}です
$ vagrant package --base Kali-Linux-2016.2-vbox-amd64 --output kali-2016.2-amd64.box
```

# boxの使用

```
$ vagrant box add --name kali2.0 kali-2016.2-amd64.box
$ mkdir kali2; cd kali2
$ vagrant init kali2.0
$ vagrant up
$ vagrant ssh
```
Chromeのショートカット集(mac用)

# タブ・ウィンドウ関係
| 操作 | ショートカット |
|:--|:--|
|新しいウィンドウを開く|⌘+n|
|新しいタブを開く|⌘+t|
|最後に閉じたタブを開く|⌘+shift+t|
|右のタブに移動する|⌘+option+右矢印|
|左のタブに移動する|⌘+option+左矢印|
|特定のタブに移動する|⌘+1 ～ ⌘+8|
|一番右のタブに移動する|⌘+9|
|現在のタブやポップアップを閉じる|⌘+w|
|現在のウィンドウを閉じる|⌘+shift+w|
|ウィンドウを最小化する|⌘+m|
|ウィンドウを隠す|⌘+h|
|終了する|⌘+q|
|ホームページを現在のタブで開く|⌘+shift+h|
|リンクを新しいバックグラウンド タブで開く|⌘+リンクをクリック|
|リンクを開いてリンク先に移動する|⌘+shift+リンクをクリック|
|リンクを新しいウィンドウで開く	|shift+リンクをクリック|

# 開発関係
| 操作 | ショートカット |
|:--|:--|
|デベロッパー ツールを開く|⌘+option+i|
|キャッシュ コンテンツを無視して現在のページを再読み込みする|⌘+shift+r|
|現在のページの HTML ソースコードを表示する（編集不可）|⌘+option+u|
|JavaScript コンソールを開く|⌘+option+j|

# ページ操作関係
| 操作 | ショートカット |
|:--|:--|
|フルスクリーン モードをオンまたはオフにする|⌘+ctrl+f|
|ダウンロード ページを新しいタブで開く|⌘+shift+j|
|ページ検索バーを開く|⌘+f|
|検索バーが開いているときに、選択したテキストを検索する|⌘+e|
|[閲覧履歴データを消去する] オプションを開く|⌘+shift+delete|
|現在のページを印刷するオプションを開く|⌘+p|
|現在のページを再読み込みする|⌘+r|
|現在のウェブページをブックマークとして保存する|⌘+d|
|開いているすべてのタブをブックマークとして新しいフォルダに保存する|⌘+shift+d|
|ページ上のすべての要素を拡大する|⌘ を押しながら + キーを押す|
|ページ上のすべての要素を縮小する|⌘ を押しながら - キーを押す|
|ページ上のすべての要素をデフォルトのサイズに戻す|⌘+0|
|ウェブページを 1 画面ずつ下にスクロールする|スペース|
|ウェブページを 1 画面ずつ上にスクロールする|shift+スペース|
|ウェブを検索する|⌘+option+f|
|テキスト欄内で前にある単語の先頭にカーソルを移動する|option+左矢印|
|テキスト欄内で次にある単語の後ろにカーソルを移動する|option+右矢印|
|テキスト欄内で前にある単語を削除する|option+backspace|
PowerShellでAnacondaの仮想環境をactivateする

# 環境
* Windows 7 32bit Professional
* PowerShell 2.0

# 問題
PowerShellでcondaの仮想環境をactivateできない問題に対処した
下記のように、activateしようとするが実際にはされていない

```PowerShell
$ conda info -e
# conda environments:
#
py2                      C:\Users\USERNAME\AppData\Local\Continuum\Anaconda3\envs\py2
root                  *  C:\Users\USERNAME\AppData\Local\Continuum\Anaconda3

# 現在はroot

$ activate py2  # py2に変更したい

$ conda info -e
# conda environments:
#
py2                      C:\Users\USERNAME\AppData\Local\Continuum\Anaconda3\envs\py2
root                  *  C:\Users\USERNAME\AppData\Local\Continuum\Anaconda3

# rootのまま！
```

# 対処方法
* 2つあります。方法(1)の方が簡単だと思います。

## 方法（１）
@lambdalisue さんにコメントをいただきました。
下記コマンドでactivateできるようになります。

```
$ conda install -n root -c pscondaenvs pscondaenvs
```

## 方法（２）
[Powershell activate and deactivate  #626](https://github.com/conda/conda/issues/626)にありました

[Liquidmantis/PSCondaEnvs](https://github.com/Liquidmantis/PSCondaEnvs)からPowerShell用のactivate/deactivateコマンドをダウンロードする
そのファイルをactivate.bat/deactivate.batがあるフォルダにコピーする

```PowerShell
$ git clone https://github.com/Liquidmantis/PSCondaEnvs
$ cd PSCondaEnvs
$ cp activate.ps1 ~\Appdata\Local\Continuum\Anaconda3\Scripts\.
$ cp deactivate.ps1 ~\Appdata\Local\Continuum\Anaconda3\Scripts\.
```

# 確認
```PowerShell
$ activate py2

Activating environment "py2..."

$ conda info -e
# conda environments:
#
py2                   *  C:\Users\USERNAME\AppData\Local\Continuum\Anaconda3\envs\py2
root                     C:\Users\USERNAME\AppData\Local\Continuum\Anaconda3

# activateできた！
```
PHPで連想配列の配列から特定キーの配列を取り出す - array_column

「まさかそんな便利なメソッドないだろ〜」と思って調べたらあったのでメモ。

以下のような連想配列の配列なデータがあって、
そのうちのキー`id`のみの配列が欲しいときの話です。

```php
$users = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    )
);
```
普通にやると、ループを回して新しい配列に詰め直す必要がありそうですが、

```php
$id_list = array_column( $users, 'id' );
```
↑たったこれだけで実現できます。
###　結果
```php
print_r( $id_list );
```
```
Array
(
    [0] => 2135
    [1] => 3245
    [2] => 5342
)
```

### 参考
[PHP: array_column - Manual](http://php.net/manual/ja/function.array-column.php)
ド初心者はAWS OpsWorksを始めるにあたって何をすれば良いのか

## 誰向けの記事か

基本的には個人的な情報まとめで、公開用に最低限の調整をしたものです。 OpsWorksの情報、不足してるなーって感じがしたので。

ついさっきまでの僕自身と、同レベルの「OpsWorksを勉強したいけど何から読めば良いか良く分からん」という人には役に立つかもしれない。 少しでもOpsWorksを使ったことがあるような人の役に立つものではない。

ちなみに、Linuxのサーバーについて、authorized_keysが何かとか、パーミッションが何かとか、そのレベルが分かってない場合はChefはまだ早いので、自力で少しはサーバーを扱えるようになってからChefに挑んだ方が近道なんじゃないかと思う。

## 前提

僕はOpsWorksもChefも超初心者です。機能までbeanstalkとOpsWorksのどっちにするか迷って結局OpsWorksにしようと決めたくらいのレベルです。
昔いた会社ではEngineYardでChefを使っていましたが、僕は数回ちょっとした事をしただけで、もうほとんど覚えてませんでした。
知っていたのはせいぜい「どうやら正しく書かれたChefのスクリプトは冪当性を持つらしい」という程度でした。

## OpsWorks を始めるにあたってやるべきこと

要約： Chefについての勉強とか後回しでいいから以下の記事の通りチュートリアル的に進めてしまえ！

まず以下は一応一読しておく。
StackとLayerとInstanceのニュアンスだけ掴んでおけばとりあえずOK。他は後から段々分かってくると思う。
すごい雑な事を言うとStackは運用したいサービス、Layerはその中の役割ごとのグループ(Webサーバー、とか、DBサーバー、とか。)、Instanceはいつも通りのEC2のインスタンス。だいたいそんな感じなんじゃないか、多分だけど。

- [AWS OpsWorks とは何ですか?](https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/welcome.html)

これ読んだら、もう中にリンクあるんだけど、以下の記事に飛んでいいと思う。
他のチュートリアルを先にやっても良いけれど、いきなりクックブックを使う例も結構丁寧だし、ちゃんと追えば分かるレベルだと思う。 というか、サンプルプロジェクトを言われるがままデプロイしても、特に学びはなかった。

- [AWS OpsWorks でのクックブックの使用開始](https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-cookbooks.html)

## ほか個人的に気になった事とかのメモ

- gitにレシピを上げると更新作業は少し楽になる
  - ssh-keygenで適当な鍵をつくって、githubの「デプロイ鍵」に公開鍵を設定、秘密鍵をStackの設定に入力するだけで上手く動く。 S3に何度も上げるの面倒だし、githubに置くことを強くオススメします。
  - `Repository URL` には `git@github.com:AknEp/MyOpsworks.git` みたいなgitでいつも使う記法で書けば大丈夫
- インスタンスにsshの鍵を設定し忘れてたら cookbook_file を使ってauthorized_keysを作成するような事も可能。 (後述)
- これから理解したいこと：
    - まだ `ステップ 6: クックブックを更新してユーザーを追加する` まで実践した所なので、続きを見ていく
    - SetupとかConfigureとかのイベントはどういう時に発生するものなのか
    - RailsとかのアプリケーションもChefから入れるべきなのか、それともCapistrano/Minaあたりでデプロイする環境の構築をChefで行うべきなのか。どちらもアリだとすれば長所と短所を理解したい
    - そういえば`Application`の役割が良く分かってない。↑と関連する？

## SSH鍵のrecipeによる設定方法

emacsが立ち上がるかテストしようと思ったら、SSH鍵を設定してなくて詰んだので、試しにやってみた。

1. 以下のレシピを作る

```recipes/ssh_key.rb
cookbook_file "/home/ec2-user/.ssh/authorized_keys" do
  source "authorized_keys"
  action :create
  owner "ec2-user"
  group "ec2-user"
  mode "0600"
end
```

2. 以下のファイルを置く

```files/authoriezed_keys
# 内容はid_rsa.pubみたいな、公開鍵の内容。
```


だいたいこんな感じ。 きっと、また記事を上げると思います。
AndroidのBuildを別マシンで行うスクリプト書いたった

## 追加
2017-06-21 これを使ったほうがcoolです。 [gojuno/mainframer: Tool for remote builds\. Sync project to remote machine, execute command, sync back\.](https://github.com/gojuno/mainframer)
2016-11-21 23:44 テストに対応
2016-11-14 13:12 クラウドでの実行方法追記

## この記事を３行で
Androidはビルドが重い。
CPU100%なので開発マシンがその間使えない。
別のマシンでビルドする。

## 問題
遅い、遅い、AndroidStudioのビルドが、遅い。
とりあえずビルドを始めるとこうなる。
<img width="489" alt="Screen Shot 2016-11-03 at 23.52.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/16532/27351cda-a909-cbb3-7aae-59c4d7a17ee1.png">
これが、これくらい続く
![Screen Shot 2016-11-03 at 23.55.37.png](https://qiita-image-store.s3.amazonaws.com/0/16532/41c90597-4ccb-dc9c-62f9-c17883eec498.png)
この間はAndroidStudioでコード入力も出来ない。ブラウジングもできない。本を読むしか無い。お陰で積ん読が減った。でも納期はやってくる。

ビルドが重いのは仕方ない。そこはもうGoogleに任せるしか無い。せめて、ビルドしてる間

* 他のソース読んだり
* コメント書いたり
* ブラウジングしたり

その時間だけでも確保したい。
ここでは`ビルドを高速化する`のではなく`ビルド中に開発マシンのCPUリソースを食いつぶすのを防ぐ`ことに着目してみました。

## 重い原因
* kotlinによる開発
* Dagger2, DBFlow などのソースコード自動生成ツール
* ProGuardによる難読化とか
* 共通モジュール参照

などなど色んな事が重なって日に日にビルドが重くなってきた。んだと思う。

## 対策1 有志によるAndroidStudioPluginを使う
[Android Studioでのビルドをクラウドで行い開発を高速化する - Unyablog.](http://nonylene.hatenablog.jp/entry/2016/04/28/171828)
大人気のこの記事で解決するやんけ！ で試してみたけど、AndroidStudio 2.2 ではもう動かなくなってた・・・。ちょっといじれば2.2でも使えるかな？と思ったけど、全然わからなかった・・・。

## 対策2 速くならなくてもいいので開発マシンが専有されないようにする
でもこの仕組み、無理にAndroidStudioでやらなくてもシェルでいいよなぁ。pythonのfabricでいいよなぁと思ったので作ってみた。
また、お金かかるのでクラウドじゃなくて、mac mini が余ってたのでそれでビルドするようにしました。

## 手元のPCで動かす
スクリプト書いたよ！
https://gist.github.com/shikajiro/90cdbdac652cf37a563840d812d73c5b

## クラウドで動かす
[@sys1yagi](https://twitter.com/sys1yagi
) さんが Googleのクラウド GCE で構築したみたいです。ｵﾇﾇﾒ
[AndroidアプリケーションをGoogle Compute Engineのインスタンスでビルドする](http://sys1yagi.hatenablog.com/entry/2016/11/13/162400)

## インストール
1.プロジェクトのルートディレクトリに上のスクリプトファイルを置く
2.ビルドする別マシンのipaddressとか設定する。
3.ビルドするアプリのmodule名、flavor名、debugか否かを設定する。
4.別マシンでもビルドができる環境を作る
5-1.`$ fab build` でいつものビルドのように動作する。コンパイル、インストールが終わればActivityが起動する。
5-2.`$ fab test` で、テストもできる。結果はブラウザに表示される。 `$ fab android_test`,`$ fab test_all` もできます。

## スクリプトの流れ
1.開発中のコードを空いている別マシンにコピーする。
2.別マシンでビルドする。
3.別マシンからビルドしたapkを持ってきてインストールする。
4.アプリを起動する。

## 計測結果
普通のビルドより余計にかかる時間を計測しました。
### 環境
| 場所       |      回線 |    室内環境    |
|:-----------------:|:------------------:|:------------------:|
|自宅 開発マシン|光回線|ルータ -> wifi -> マシン|
|事務所 別マシン|光回線|ルータ -> wifi -> マシン|
### 実行時間
* ソースコードの同期・・・2秒超 （変更したテキストファイル３つ）
* apkファイルのダウンロード・・・12秒超 （8MB）
ビルド時間が分超えるなら許容範囲だと思います。

次はLTEでのテザリングで試しました。
### 環境
| 場所       |      回線 |    室内環境    |
|:-----------------:|:------------------:|:------------------:|
|カフェ 開発マシン|LTE|Android -> テザリング -> マシン|
|事務所 別マシン|光回線|ルータ -> wifi -> マシン|
### 実行時間
* ソースコードの同期・・・3秒超 （変更したテキストファイル３つ）
* apkファイルのダウンロード・・・33秒超 （8MB）
* 
やっぱりapkのダウンロードが遅い。速さを求めるなら控えたほうが良さそうですね。
でも、出先でバッテリー使わないのはすごく良い！！
Synergy使っててサーバー側のキーボード新調したらクライアントでの入力が変になった

プログラミング話ではないです。

WindowsやMacのマウス入力、キーボード入力、クリップボードを共有してくれる、Synergyというアプリがあります。
> Synergy - Mouse and keyboard sharing software
> http://symless.com/synergy/

同ネットワーク内に接続したマシンでアプリを立ち上げ、
サーバーマシンとクライアントマシンを決めると、
サーバー側に接続されたマウスやキーボードでクライアントたちを操作できるようになります。


## 環境

- Synergyアプリ 各OS向け最新版
- サーバーマシン
    - MBP (JIS配列)
    - OS：macOS Sierra
    - 環境言語：英語
    - キーボード等：Magic Keyboard (US配列) & Magic Trackpad 2
- クライアントマシン
    - OS：Windows 10
    - 環境言語：日本語
    - 入力キーボード配列：英語キーボード

## 起きたこと
サーバーマシン（Mac）に接続していたキーボード（US配列）を、Magic Keyboard (US配列）に新調したところ、
クライアントマシン（Win）での入力がJIS配列扱いとなってしまいました。

（`@`を打つと、`"`が入力される。などなど。）

ただ、使用している最中に、クライアント側でUS配列入力が可能になる場合もあり、よくわからない状況でした。
Synergyを再起動する、マシンを両方再起動するなど試しましたが、解決しませんでした。

## 解決した方法
サーバーマシンであるMacの入力ソースを日本語に固定、入力レイアウトをJANSI[^1]に固定する

[^1]: JIS配列キーボードでUS配列入力できるようになるキーマッピングです <br> 参考：[kenie 33 - JANSI/ JANSI / Mac OS X 10.4 - 10.12](http://kenie33-jansi.blogspot.jp/p/mac-os-x-104-107-jisascii.html)

### 原因と参考にした記事
<!-- -->
> [Synergyとリモートデスクトップの組み合わせによるキー配列の不一致問題を解決する | PCと遊ぶ日々の記録](http://wp.calcurio.com/?p=1873)

<!-- -->

> [マイナス思考のIT使用生活/ Synergyで統一の使用感を得るために・・・](http://minusthinkit.blogspot.jp/2017/01/synergy.html)

これら記事を見ていて、
・サーバー側マシンのMacはJIS配列で、日本語入力のレイアウトにJANSI[^1]を採用している
・US配列入力ができなくなるのは、サーバー側の入力言語が英語（U.S.）になっている時 
という条件に気づけました。

### Before

・入力言語を「日本語」「英語」で切り替えることで日英入力切り替え
サーバーマシンは下記のような設定になってました。
![Screen Shot 2017-01-30 at 15.01.49.png](https://qiita-image-store.s3.amazonaws.com/0/9289/dd0f165b-dbd3-0281-2b08-ea3bea5c4dcc.png)

クライアント側でJIS配列の入力になってしまっていた時には、サーバー側の入力が [U.S.] となった時でした。

### After
・入力方式で「ひらがな」「ローマ字」を切り替えることで日英入力切り替え
・入力レイアウトはJANSIです
設定を下記に変更しました。
![Screen Shot 2017-01-30 at 15.02.43.png](https://qiita-image-store.s3.amazonaws.com/0/9289/babcdfd5-53eb-5dc1-446f-a418c33f5018.png)


### そういえば
Macのキーボードに、Win向けキーボードだと右上にあるForward Deleteキーがなくて不便と思ってましたが、
`fn + delete` でForward Deleteの振る舞いをしたので、解決しました。
デュアルカメラを利用した携帯電話

デュアルカメラ　モジュールがいよいよ携帯電話に搭載された。

以前、デュアルカメラ　モジュールの記事を読んで、その可能性に驚きを感じた。
(奥行きを計測するステレオカメラではなく、デュアルカメラとして奥行き以外の項目についても着目している可能性におどろいた。"被写界深度エフェクト"はデュアルカメラ　モジュールの可能性の１つにすぎない。）


Toshiba Announces Stereo 3D Depth-Enabled Camera Module
http://image-sensors-world.blogspot.jp/2013/09/toshiba-announces-stereo-3d-depth.html


![TCM9518MD](http://1.bp.blogspot.com/-xpAiWVeybJA/UkS_3RkjgqI/AAAAAAAAHdQ/Q5peh1KE190/s400/Toshiba+3D+Module+TCM9518MD.jpg)

東芝がイメージセンサ事業を売却してしまったので、
このモジュールはどうなってしまったのだろうか？

[2015年10月24日
ソニー、画像センサーで独走狙う。東芝の事業買収か
東芝の生産拠点・大分工場の一部を取得する案浮上](http://newswitch.jp/p/2455)


[ソニーセミコンダクタマニュファクチャリング株式会社  生産拠点一覧](https://www.sony-semiconductor.co.jp/company/kyoten)

[「ソニー、熊本工場での外販向けカメラモジュールの開発、製造の中止を発表 ー iPhone7向けカメラモジュールか！？」](https://coool.blue/11870)

2016年05月23日
iPhone7のデュアルカメラはLG系に大量発注か、熊本地震でソニーの供給遅れ
http://newswitch.jp/p/4752

2016年発売のiPhone7にデュアルカメラ搭載？ソニーの設備増強の理由はこれ？
http://itstrike.biz/apple/iphone/25980/



どこのモジュールを利用しているのかはわからないが
デュアルカメラを搭載した携帯電話が市販されている。

[HUAWEI P9レビュー！高性能デュアルカメラを搭載したHuawei Pシリーズのフラッグシップモデル](https://mobareco.jp/a78326/)


[Huawei、デュアルカメラを搭載した「Honor 8」を9月28日に国内発売](http://getnews.jp/archives/1521701)


[HUAWEI P9 スペック]
(http://consumer.huawei.com/jp/mobile-phones/tech-specs/p9-jp.htm)


HUAWEI P9 [1つはRGBセンサー、もう片方がモノクロセンサーという構成。](https://mag.kakaku.com/pc-smartphone/?id=4395)


[iPhone 7 Plusのデュアルカメラは光学2倍以上の価値あり](http://ascii.jp/elem/000/001/234/1234877/)


[広角/望遠のデュアルカメラを搭載した「iPhone 7 Plus」
"被写界深度エフェクト"を後日提供　iPhone 7も光学式手ブレ補正に](http://dc.watch.impress.co.jp/docs/news/1018999.html)

[iPhone 7 Plusデュアルカメラの作例11枚。ポートレートモードの被写界深度エフェクトの実力を試す](http://gadget-shot.com/gadget-review/36993)

[iPhone 7 Plusは2つのカメラをどう使い分けているのか (1/3)](http://www.itmedia.co.jp/mobile/articles/1609/25/news008.html)

"被写界深度エフェクト" について言うと、AppleよりもHuaweiの方が先を行っている。


[ライカのカメラ(HUAWEI P9)をiPhone6sと比較してみた](http://mislead.jp/4458.html)

デュアルカメラ　は、画像についての空間的な理解を可能にする。
奥行き情報が得られていることで、奥行きがピントの位置と異なる領域については、ボケを加えることで"被写界深度エフェクト" を実現しているのだろう。対象物の画像認識をする際には、奥行き情報を加えることで認識精度をあげることが常套手段になっていくのだろう。

デュアルカメラはステレオカメラではない。
視野が異なったり、RGBとモノクロカメラだったり、そのようなものであっても、奥行きの情報が得られたりする。ステレオカメラで遠方の距離を評価しようとする場合、視野角の狭いカメラを用いた方が、その奥行きの精度が高くなる。人の網膜では、色の解像度は輝度の解像度ほど高くない。そのような部分で、デュアルカメラはまだまだ、他の使い方が可能な気がする。

携帯電話でデュアルカメラが当たり前の電子部品になっていくと、ロボットの分野に使えるようになってこないだろうか。


[このダブルレンズは名前だけじゃない。ライカを愛用するフォトグラファーが見た「HUAWEI P9」の実力とは？ 2016.11.11 11:00Sponsored ](http://www.gizmodo.jp/2016/11/huawei_p9_kisshomaru.html)


[プロカメラマンに聞く！ 「HUAWEI P9」のダブルレンズカメラの使いこなし術 2016年11月14日 11時00分更新](http://ascii.jp/elem/000/001/260/1260362/)

[ファーウェイ製スマホ分解で見えたアップル／サムスンを超えた“中国のチップ開発力” ](http://eetimes.jp/ee/articles/1701/26/news022.html)

![図1：中国Huaweiが2016年前半に発売したスマートフォン「P9」のカメラ部分 ](http://image.itmedia.co.jp/ee/articles/1701/26/l_tt170126_10years_001.jpg)
Swift3でPPAP

PPAPのズンドコキヨシっぽいやつをSwiftでやってみました。

```Swift:PPAP.swift
import Foundation

var flag = 0
print("PPAP")//なんとなく入れてみた。最初に言うので。
sleep(1)//なんとなく入れてみた

main: while true {
    let random = arc4random_uniform(3)
    print(["ペン", "パイナップル", "アップル"][Int(random)])
    switch (random, flag){
    case (0, 0):    flag = 1;
    case (1, 1):    flag = 2;
    case (2, 2):    flag = 3;
    case (0, 3):    print("Pen Pineapple Apple Pen!!!"); break main;//最後にもう一回言うので。
    default:        flag = 0;
    }
}
```

あとはいつも通りswiftcでコンパイルです。

#コメント
最近自分の投稿が途絶えたので久しぶりに何かネタないかなと思ったんですが、これくらいしかありませんでした。これはただの暇つぶしです。

この記事を書いた時はまだ誰もこんなことしてなかったんですが、知らないうちにPPAPなんてタグもできちゃってるんですね〜。すごい。
もう今ではズンドコキヨシとは別としてPPAPが確立してるんですかね。PPAPキヨシとは呼ばれてないんですね...
今度こそ理解するTensorFlow (MNISTを題材に)

タイトルは釣りですw
TensorFlowのMNISTチュートリアル(for Beginner)の解説は数あれど、精度をちょろっと出してお終いで、その学習したモデルを使ってどう予測を行えば良いかを書いている記事が見当たらなかったので記事にしてみます。あと、良い入門記事を見つけたので、それも紹介します。

#はじめに読んでおくと良い記事
こちらの連載を読むとTensorFlowの理解が深まるのでまずは読んでおくことを強くお勧めします。
http://www.buildinsider.net/small/booktensorflow/0001
http://msyksphinz.hatenablog.com/entry/2015/11/19/022254

#TensorFlowのMNISTチュートリアル(for Beginner)の解説
こちらの記事が大変分かりやすいです (丸投げ)
http://qiita.com/tuno-tky/items/cf7068f14ceea08802e8

# 学習したモデルを使った予測
以下の最後の3行で学習結果を使った予測を行っています。
やっていることは、テスト用のデータを引っ張ってきて、定義済みのyというオペレーションを、argmaxでラップしたオペレーションを作成し、それを実行しています。
実行すると、テストデータそれぞれのラベルが得られます。

```python:mnist_beginner.py
import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

x = tf.placeholder("float", [None, 784])

y = tf.nn.softmax(tf.matmul(x, W) + b)

y_ = tf.placeholder("float", [None,10])

cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy)

sess = tf.Session()

init = tf.initialize_all_variables()
sess.run(init)

# 実行時間短縮のため10000回から100回に減らしている
for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

    print sess.run(accuracy, feed_dict={x: mnist.test.images,y_:mnist.test.labels})

# prediction
batch_xs, batch_ys = mnist.train.next_batch(5)
pred_rslt = sess.run(tf.argmax(y, 1), feed_dict={x: batch_xs})

print(pred_rslt)
```
https://github.com/ryogrid/learnDeepLearning/blob/29130e36246c20e0509e9e642b6a1343707187ab/tensorflow_mnist_pred.py


実行結果
>(省略)
0.8672
0.8766
0.889
0.8943
[5 1 1 3 6]

#その他参考
http://qiita.com/tawago/items/c977c79b76c5979874e8
http://qiita.com/tawago/items/931bea2ff6d56e32d693
Raspberry-pi  wicd-curses の接続が不安定

# 現象

raspberry pi 2 (raspbian 7.8) + Bufferlo WLI-UC-GNM2

上記環境でWifiの自動接続設定を wicd-cursesで実施
しかし、自動接続が行われず、かつwicd-cursesを直接立ち上げて
手動で接続指示をおこなっても、かなりの確率で失敗する

再起動も☓

# 原因

理由はわからないが
dhcpcdが邪魔をしている


# 対策

dhcpcdを起動しないように設定する


1. chkconfigのインストール  
`sudo apt-get install chkconfig`

2. dhcpcdの自動起動をoff  
`sudo chkconfig dhcpcd off`


これで接続が安定した
カスタムビュー（CustomView)の高さを可変にする設定（主にconstraints)


UIViewをカスタムビューで作りたいときのやり方を考える

## 用意するファイル
- storyboard（仮名: Main.storyboard）
- viewController.swift（仮名: MainViewController.swift）
- view.swift（仮名: CustomView.swift）
- view.xib（仮名: CustomView.xib）

### 各ファイルの中身

```:MainViewController.swift
class MainViewController: UIViewController {

    @IBOutlet weak var customView: customView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        customView.set()
        print("ViewControllerのviewDidLoad")
        print(customView.frame)
    }
    
    override func viewWillAppear(animated: Bool) {
        print("ViewControllerのviewWillAppear")
        print(customView.frame)

    }
}
```


```:CustomView.swift
class ChildInfoView: UIView {
    @IBOutlet weak var xxxLabel: UILabel!    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.xibSetup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.xibSetup()
    }
    
    func set(){
        xxxLabel.text = "hoge"
    }
    
    private func xibSetup() {
        let view = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil).first as! UIView
        view.frame = self.bounds
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        
        print("CustomView.swiftのinit内")
        print(frame)
        
        self.addSubview(view)
    }

```

## 下準備
1. storyboardにviewControllerを一つ置いて、クラス名をviewControllerに指定する
2. viewController内にviewを置いて、クラス名をCustomViewに指定する


## 正解のconstraints設定
1. UIViewのheight>=10、priority=1000
2. UIViewのheight=10, priority=750

※ 10はstoryboard上の見た目になる。1以上ならなんでもいい
![constraints.png](https://qiita-image-store.s3.amazonaws.com/0/68146/7ece6a68-65d3-a115-3e4c-f42bb6f564b9.png "constraints.png")


### 各箇所でのframeの値
```
CustomView.swiftのinit内
(0.0, 20.0, 375.0, 10.0)

ViewControllerのviewDidLoad
(0.0, 0.0, 40.0, 10.0)

ViewControllerのviewWillAppear
(0.0, 0.0, 375.0, 90.0)
```

## 失敗のconstraints設定
1. UIViewのheight=80、priority=1000
![Screenshot at 11月 03 23-39-54.png](https://qiita-image-store.s3.amazonaws.com/0/68146/6f28a60a-cad9-cf9d-189c-aa49971d7c7f.png "Screenshot at 11月 03 23-39-54.png")


### 各箇所でのframeの値
```
CustomView.swiftのinit内
(0.0, 20.0, 375.0, 80.0)

ViewControllerのviewDidLoad
(0.0, 0.0, 40.0, 80.0)

ViewControllerのviewWillAppear
(0.0, 0.0, 375.0, 80.0)
```

## 結論
heightのpriority=1000は>=xxにする
heightの=xxxはpriority=750にする
ことでカスタムビューの高さを可変にできました。
MacにAnacondaをインストールし、Anaconda Cloud に Jupyter (IPython) notebook をアップロードする


# MacにAnacondaをインストール
こちらを参考に進めます。
https://docs.continuum.io/anaconda/install

たとえばMacの場合では、下記リンクからインストーラーをダウンロードして、インストールすればOKです。
https://www.continuum.io/downloads

動作確認した環境：
macOS Sierra バージョン10.12.1
Anaconda 4.2.0 (Python 3.5 version)


# Anaconda Cloudの利用
## Anaconda Cloudのアカウントを作成
こちらからアカウントを作成します。
https://anaconda.org

## Anaconda Navigatorを起動
ターミナルから

```bash
open ~/anaconda/Anaconda-Navigator.app
```

もしくは、 ~/anaconda/のフォルダからAnaconda-Navigatorをダブルクリックで起動します。

![スクリーンショット 2016-11-03 22.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/64560/b1ba67ab-980e-fdd5-157c-07d36098c587.png "スクリーンショット 2016-11-03 22.00.36.png")

画面右上ボタンから、さきほど作成したアカウントでログインします。

## anaconda-clientのインストール
ターミナルから

```bash
conda install anaconda-client
```

## Jupyter notebook を起動してファイルを作成してみる
ターミナルから

```bash
jupyter-notebook
```

もしくは、上記のAnaconda Navigatorの画面からjupyterをLaunchする。
中身は何でも良いのでファイルを作成しましょう。ここではtest.ipynbとします。

## 上記で作成したファイルをアップロード
ターミナルから

```bash
anaconda upload test.ipynb
```

これだけで、anaconda cloud にファイルのアップロードが完了します。


# マークダウン記法を活用する

プルダウンメニューからMarkdownを選択してセルを追加し、Markdown記法で文を作成する。
たとえば、#が大見出し、##が中見出しになる。

![スクリーンショット 2016-11-03 22.39.31.png](https://qiita-image-store.s3.amazonaws.com/0/64560/bac86390-db84-aae4-9f39-f608288b5a6a.png "スクリーンショット 2016-11-03 22.39.31.png")

Shifr+Enter (またはCtrl+Enter) でMarkdownが反映される

![スクリーンショット 2016-11-03 22.39.41.png](https://qiita-image-store.s3.amazonaws.com/0/64560/e9185a06-06aa-e305-bfc2-a8fe08159945.png "スクリーンショット 2016-11-03 22.39.41.png")


# 補足資料
上記にて、私が試しにAnaconda Cloudにアップロードしたファイルは下記になります。
https://anaconda.org/mitsuyoshi/zero-kara-tsukuru_deeplearning_ch02/notebook
「ゼロから作る Deep Learning」 第２章を自習した内容です。
eclipseでtomcatが止まらない時の対処法

eclipseでtomcatが止まらない事象が最近起こりました。

tomcat起動中にeclipseが異常終了してしまったら、tomcatが止まらない状態になります。


この状態で、再度eclipseからtomcatを起動しようとすると、「ポート番号が使用中です」の様な事を言われて起動できないはずです。


この場合は、Ctrl+Shift+Escキーの同時押しで、Windowsタスクマネジャーを起動させて、プロセスタグの中に、javaw.exeがあると思いますので、それを選択し、プロセスの終了ボタンを押すと、tomcatを止めることができます。


こうすると、eclipseでtomcatを起動できるようになるはずです！
eclipseでF5を押してリフレッシュすると状態が変わるはずですよ。
いろいろな攻撃手法とその対策

少しずつ書いていく
##パスワードクラック
### ブルートフォースアタック（総当たり攻撃）  
  考えられる文字列全ての組み合わせを試す  
#### 対策  
   - ログイン試行回数に制限をもたせる  
   - パスワードを長くする  
   
### 辞書攻撃  
  辞書にあるような意味を持つ単語でパスワードクラックを試みる  
#### 対策  
   - 意味が通じるパスワードを設定しない（例：password）  
   - ログイン試行回数に制限を持たせる  

### リバースブルートフォースアタック  
  特定のユーザーIDに対してさまざまなパスワードを試すブルートフォースアタックに対して、特定のパスワードでさまざまなユーザーIDに対して試みる  
#### 対策  
 - 一定時間内に同じIPアドレスから多数のログイン失敗がみられた場合アカウントをロックする

## スクリプト攻撃
###クロスサイトスクリプティング（XSS）  
webサイトやwebアプリケーションの脆弱性を利用して悪意のあるコードを実行させる  
####対策  
- 埋め込まれたコードを無害化するためにサニタイジングを行う

###SQLインジェクション
データベースと連携しているwebサイトやwebアプリケーションに対してSQLの断片をパラメーターとして与えることにより、不正に情報を取得したり、データベースを改ざんする攻撃
####対策
 - サニタイジングを行う
 - 不要なエラーメッセージなどの情報を与えない
2分探索木

#2分探索木

###2分探索木とは
配列が整列されている事を利用し、探索する数を半分ずつ減らす事で効率良く数を探索することが出来る。

###[例1] 1 2 3 4 ⑤ 6 7 8 9 　　　※6を探したいとする
この場合の配列の基準値は５になる。
5<6であることから6は5より右側にあることがわかる。左側にある全ての値は削除。

### [After] ６ ⑦ 8 9
この場合の配列の基準値は7となる。
6<7なので6は7の左側にあることがわかる。右側にある全ての値は削除。

この他の例題もこなした感じだと、このように偶数になった場合に配列２つに分割して、
その手前側の一番最後の値を配列の中心値として定義しているようだ。
この点は調べていないので**要チェック**

### [last] ⑥ 
6=6となり探索が完了した。

■アルゴリズム図鑑
http://algorithm.wiki/ja/app/
Bottleのセットアップ

Python で Web アプリ開発をやるにあたり Bottle から始めるのがハードル低くて良いと聞いていたので環境構築手順をメモ

## 利用環境
利用する環境は以下

|OS・ミドルウェア|バージョン|
|:-----|:-----|
|OS|Mac OSX|
|Python|Python 3.5.2|

なお、Python のインストールは Homebrew から pyenv をインストールしてからインストールしました。

## 仮想環境の構築
### 1. virtualenvのインストール
Pythonの開発環境の構築ではvirtualenvを使用するそうなのでまずはvirtualenvをインストールする

インストールはpipコマンドで実行できる。

```
$ pip install virtualenv
```

これでvirtualenvがインストールされる。簡単。

### 2. 仮想環境を構築するディレクトリを準備
任意の場所にPython仮想環境用のディレクトリを作成する（この手順はオプション）

```shell
$ mkdir PythonEnv
$ cd PythonEnv
```

### 3. 仮想環境構築コマンドで構築
次のコマンドを使用することで仮想環境を構築できる

```
$ python virtualenv <仮想環境につける名前>
Using base prefix '/Users/ey/.pyenv/versions/3.5.1'
New python executable in /Users/ey/Desktop/PythonEnvs/Sample/bin/python3.5
Also creating executable in /Users/ey/Desktop/PythonEnvs/Sample/bin/python
Installing setuptools, pip, wheel...done.
```

## Bottleのインストール
インストール方法はいくつかあるけれど、pipを使用するのが簡単。
仮想環境に入ってからpipでインストール

```
$ source <仮想環境のbinフォルダまで>/activate
$ pip install bottle
```

これでインストール終了
Hello java World!

突然ですが、javaについて勉強していく事にしました。

経歴の関係でjavaをいじるのが初心者というわけではないですが、知識も浅いので復習もかねてjavaの知識を磨いていきたいと思いました。

ところでみなさん、<a href="http://shaunkawano.com/java/2014/05/28/duke-post-japanese-translation/">javaには公式マスコット</a>がいるみたいですね！
この記事を書いている時に初めて私は知りました。

タイトル通り"Hello java World"をやっていこうと思います。
今回は簡単なコンソールアプリケーションを作成するだけなので開発環境のeclipseを使用しないで作ってみようと思います！

eclipseなしの理由はと言いますと
「プログラミングの勉強するならまず自分でJDK(Java Development Kit)を使用しようぜ！」と言われたからです！

確かに今まで何も考えず、参考書通りeclipseを導入してプロジェクトを作成し、実行ボタンを押すだけでした。
なので今回の"Hello java World!"は物凄く難易度が高かったです！

##友達からいただいた助言
プログラムを書く(.java)
↓
コンパイルする(バイトコード(.class)ができあがる)   ：JDKのjavac.exeを使用する
↓
JVM(ava virtual machine、Java VM) がバイトコードを解釈して実行する。  ：JDKのjava.exeを使用する

今回は主にJDKのプログラミングツール
・javac.exe -  Javaコンパイラで、ソースコードをJavaバイトコードに変換する。
・java.exe - Javaアプリケーション用のローダ。このツールはインタプリタで、javacコンパイラにより生成されたクラスファイルを解釈できる。
を使用すればできるらしい

まず一番最初にやった事はエクスプローラーでプロジェクトの作成（もちろん手動）

```text
ドキュメント
    ├──workspace/
        ├──hellojavaworld/
            ├──Hellojava.java
```

プロジェクトのディレクトリはこんな感じで作成しました。
javaファイル名 = クラス名 = クラス名の頭は大文字が基本

次に環境の設定
・コマンドプロンプトでさっき作ったプロジェクトのhallojavaworldにディレクトリを移動
＜基本コマンド＞
cd パス - カレントディレクトリを変更
dir - カレントディレクトリにあるファイルやフォルダーの一覧

・環境変数PATHに一時的にJDKのPATHを追加しておく
※こんご使用率が高い場合は普通に環境変数PATHを通しておくのもありです。

```bat
set path=%path%;追加パス
``` 
私はeclipseの中にあるJDKを使用することにしました。

いよいよプログラムを書いていきます。
適当なテキストエディタでHellojava.javaを開きます。
※今回私が仕様しているエディタは"Visual Studio Code"です。

```java
class Hellojava {

}
```

##クラスの基礎
java(オブジェクト指向言語)では、このクラスをベースにシステムを作り上げていく。
クラスとクラスが連携し、ソフトウェアを形成していくらしいです。

とりあえずここまで書きコンパイルしてみます。

```bat
Javac Hellojava.java
```

![test1.png](https://qiita-image-store.s3.amazonaws.com/0/146678/9e3d30e3-6797-0aa6-d0f6-0641b6d43e7f.png)

javacを実行するとHellojava.javaの他にHellojava.class(javaバイトコード)が生成されます。
※再コンパイルすると新たなファイルが生成されるのではなく更新されるみたいです。

![test2.png](https://qiita-image-store.s3.amazonaws.com/0/146678/9121b992-4ec6-6168-8c2f-510b334ca408.png)

コンパイルできる事も確認できたし今度こそHello java World!を実行していきたいと思います！

```java
class Hellojava {
    public static void main (String[] args) {
        System.out.println("Hello java World!");
    }
}
```

public static void main (String[] args){}はプログラムを実行する時の玄関にあたる部分らしいです。
１プロジェクトに１つが原則です。
実際これなしにコンパイルしたらエラーがでました。

ついに実行します！

```text
java Hellojava
```

![test3.png](https://qiita-image-store.s3.amazonaws.com/0/146678/a180afa8-9179-383c-8be7-d5e2d7a61dad.png)

見事Hello java World!が出現しました！

※よくありがちなミスとしてHellojava.classと書いてしまう場合があります。
実行する時は"ファイルパス"を指定するのではなく"クラス"を指定するみたいです。

#感想
ネットを使い調べながらここまでやりましたが
eclipseを使ってしまえばプロジェクトを作成して`System.out.println("Hello java Wlorld!");`を書いて実行ボタンを押すだけなんですよね。
JDKのくだりはほとんど理解せずできてしまうんですよね（私はこの記事書こうとするまで殆ど理解してませんでした）。
ブロックの有無 Javaの問題をTypeScriptにしてみる　5-3

次のプログラムの実行結果を選びなさい

```java:java.java
public class Main{
 public static void main(String[] args){
 int a = 0;
 while(a<5)
    do
        a++;
        System.out.println(a);
    while(true);
 }
}
```

A.012が表示される
B.012が5回表示される
C.何も表示されない
D.無限ループになる
E.コンパイルエラーが発生する
F.実行時に例外がスローされる

答えは、E

do-whileの中に２つの処理が書かれていますが、通常のwhileと同様に{}(ブロック)にされていないとコンパイルエラーとなります。

```java:java.java
public class Main{
 public static void main(String[] args){
 int a = 0;
 while(a<5)
    do{
        a++;
        System.out.println(a);
    }while(true);
 }
}
```

このようにすればコンパイルは通りますが、do-whileの条件がtrueのため無限ループになります。
両方のwhile文の条件をa<5にしておけば、1〜5を表示して終了します。

これをTypeScriptにすると

```ts:TypeScript.ts
 var a:number = 0;
 while(a<5)
    do{
        a++;
        console.log(a);
    }while(a<5);
```

このようになります。
Siv3D August 2016 v2 用のプリコンパイル済みヘッダー設定済みプロジェクトテンプレートを作成する

Visual Studio 2015 で [Siv3D](http://play-siv3d.hateblo.jp/) の新規プロジェクトを作る際に、プリコンパイル済みヘッダーの設定を毎回するのが面倒だったので、設定済みのテンプレートを作成することにしました。

※ この事について、以前 Slack 上で作者様からの言及がありましたので、いつか標準で組み込まれるのかもしれません

![a.png](https://qiita-image-store.s3.amazonaws.com/0/35599/0553b90a-cade-2ec0-a456-4b6ccb7bb224.png)



## おおまかな手順

次のとおりです。

1. 標準のプロジェクトテンプレート `Siv3D(August2016v2).zip` を展開
2. `stdafx.cpp`、`stdafx.h` を作成
3. プロジェクトファイル `Siv3D(August2016v2).vcxproj` を開き、以下を設定
    * `stdafx.cpp`、`stdafx.h` をプロジェクトに追加
    * プリコンパイル済みヘッダーを作成・使用するよう設定
4. `MyTemplate.vstemplate` を編集
    * テンプレートの設定（`TemplateData` タグ内。必須ではない）
        * テンプレート名（`Name` タグ）
    * プロジェクトに含まれるファイルの設定（`TemplateContent` タグ内）
        * `stdafx.cpp`、`stdafx.h` についての `ProjectItem` タグを追加
5. ZIP 書庫を作成し `Siv3D(August2016v2).zip` と同じ場所へ配置

## 1. 標準のプロジェクトテンプレートを展開

`$(VisualStudioDir)/Templates/ProjectTemplates/Siv3D(August2016v2).zip` の内容を適当なフォルダに展開します。


展開されたファイル一覧：
![files.png](https://qiita-image-store.s3.amazonaws.com/0/35599/5562adcc-e500-8eda-7f9a-aa75fe525089.png)


※ `$(VisualStudioDir)` の場所は、マイドキュメント→Visual Studio 2015 フォルダだと思います。Visual Studio の "C# Interactive" ウィンドウで

```csharp
Environment.GetEnvironmentVariable("VisualStudioDir")
```
を実行して確認できます。

## 2. `stdafx.cpp`、`stdafx.h` を作成

それぞれのファイルを以下の内容で作成し、上記のプロジェクトテンプレートを展開したフォルダに配置します。

```cpp:stdafx.cpp
#include "stdafx.h"
```

```cpp:stdafx.h
#include <Siv3D.hpp>
```

## 3. プロジェクトファイルの設定

`Siv3D(August2016v2).vcxproj` をダブルクリックし、Visual Studio から以下の設定を行います。

### 3-1. `stdafx.cpp`、`stdafx.h` をプロジェクトに追加

先ほど作成したファイルをプロジェクトツリーに追加します。


### 3-2. プリコンパイル済みヘッダーを作成・使用するよう設定

プロジェクトのプロパティを開き、

* 「すべての構成」、「すべてのプラットフォーム」を選択
* 「C/C++」→「詳細設定」→「必ず使用されるインクルードファイル」を `stdafx.h` に設定
* 「C/C++」→「プリコンパイル済みヘッダー」→「プリコンパイル済みヘッダー」を `使用` に設定

プロジェクトツリーで `stdafx.cpp` を選択し、

* 「C/C++」→「プリコンパイル済みヘッダー」→「プリコンパイル済みヘッダー」を `作成` に設定

## 4. `MyTemplate.vstemplate` を編集

こんな感じの内容に編集します：

```xml
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData>
    <Name>Siv3D(August2016v2) with Precomiled Header</Name>
～省略～
      <ProjectItem ReplaceParameters="false" TargetFileName="Main.cpp">Main.cpp</ProjectItem>
      <ProjectItem ReplaceParameters="false" TargetFileName="stdafx.cpp">stdafx.cpp</ProjectItem>
      <ProjectItem ReplaceParameters="false" TargetFileName="stdafx.h">stdafx.h</ProjectItem>
～以下省略～
```

## 5. ZIP 書庫を作成し配置

1 で展開したファイル + stdafx.cpp、stdafx.h をまとめて ZIP 書庫を作成し、プロジェクトテンプレートのフォルダ（`Siv3D(August2016v2).zip` のある場所）へ配置します。

Visual Studio を起動し、新しいプロジェクトダイアログを表示すると、Visual C++ テンプレートの一覧に先ほど作成したものが追加されています。
Swift3以降のUIColorの使い方

[APIデザインガイドライン](https://swift.org/documentation/api-design-guidelines/)が適用されたSwift3になってから、記述量が少なくなっていい感じになりました。

そこで、アプリで使用する色の管理をデザインガイドラインを意識して書いてみました。

```swift:UIColor+AppDefined.swift
extension UIColor {
    
    convenience public init(rgba: Int64) {
        let r = CGFloat((rgba & 0xFF000000) >> 24) / 255.0
        let g = CGFloat((rgba & 0x00FF0000) >> 16) / 255.0
        let b = CGFloat((rgba & 0x0000FF00) >>  8) / 255.0
        let a = CGFloat( rgba & 0x000000FF)        / 255.0
        
        self.init(red: r, green: g, blue: b, alpha: a)
    }
    
    class var background: UIColor {
        return UIColor(rgba: 0x43BFFEFF)
    }
    
    class var title: UIColor {
        return UIColor(rgba: 0xFE99ACFF)
    }
}
```

また、Xcode8から使えるようになった[Color Literal](http://qiita.com/okuderap/items/f980dde37e3f44fd9d01)を使った場合はこうなります。
<img width="197" alt="color_literal.png" src="https://qiita-image-store.s3.amazonaws.com/0/2037/dfe3dc87-f27d-f229-c9c1-d3fb5b28ab2e.png">
※以下と同義です。

```swift:UIColor+AppDefined.swift
class var error: UIColor {
    return #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)
}
```

このようなカテゴリを作っておくと、次のようにUIColorが扱えていい感じです。

```swift:ViewController.swift
view.backgroundColor = .background
titleLabel.textColor = .title
errorLabel.textColor = .error
```
TailCall#invokeをループで書き直す

「Javaによる関数型プログラミング」の「7.1.3 TailCall関数型インタフェース」で紹介されているTailCallについてです。

例のごとくソースは公式サイトを参照してください。
https://media.pragprog.com/titles/vsjava8/code/recur/fpij/TailCall.java

このインタフェースでは、invokeというメソッドで、再起呼出しをStremに置き換えています。内容は合っていると思いますが、飛躍が大きいので、invokeをループで書くとこうなります。

```java
  default T invokeLegacy() {
      TailCall<T> c = this;
      while(!c.isComplete()) {
          c = c.apply();
      }
      return c.result();
  }
```

ループで書いてみると簡単ですね。streamも便利でいいのですが、慣れないうちは、ループだったらどう書くかを考えてみるといいかもしれません。
webサービス利用でshellでtweetする

# shellからtwitterにpostしたい

このサービスを利用してツイートをさせる。
http://stewgate-u.appspot.com/

ツイート元にしたいTwitterアカウントでログインしてTokenを発行する。

# Tokenを環境変数に定義する

用途に応じて適当なところに取得したTOKENを定義
/etc/environment
/etc/profile
~/.bash_profile
~/.bashrc

今回は自分のRaspberryPiの起動時にTweetしてもらいたいので以下の定義をした。

``` shell:/etc/environment
export STREWGATE_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

# shellscript 

１４０文字に切って、POSTするだけのかんたんなスクリプト

```shell:tweet
#!/bin/sh
#
TWEET=$(echo "$*"|cut -c -140)
curl -X POST --silent --data "_t=${STREWGATE_TOKEN}" --data-urlencode "msg=${TWEET}" http://stewgate-u.appspot.com/api/post/ > /dev/null
```
# 動作確認

```
pi@raspberrypi:~ $ tweet お前も蝋人形にしてやろうか！！！
```

![tweet.png](https://qiita-image-store.s3.amazonaws.com/0/19483/c6c8cafa-20eb-4926-9915-2472408503e0.png)

# 備考
同じ文字列を連続してTweetは出来ないよ。（Twitter側の仕様っぽい）
適当に動作させるには手軽で良いサービスですね。
ログをまとめて取得する

テストする時に事前にapacheのログのtailして、syslogをtailして、キャプチャも取ってと、めんどくさいので一気にできるように。
pidのkillはもっといい方法があれば改善。

## 概要
バックグラウンドでコマンド投入とコンソールに出力するログを取得するツール
単なるbashのscript

[Y05H1/bgcmd](https://github.com/Y05H1/bgcmd)

## インストール
cloneするだけ

```
# git clone https://github.com/Y05H1/bgcmd.git
```

## 使い方

### 設定
実行するコマンド、コマンド実行後にコンソールに出力するメッセージを保存するログファイル名、pidを保存するファイル名を,区切りで書く

```
# cat cmdlist
#command,console log,pid file
tail -f /var/log/messages,${DATE}_messages.log,messages.pid
tail -f /var/log/httpd/access_log,${DATE}_http_access.log,http_access.pid
tcpdump -s 1500 -w ${DIR}/${DATE}_tcpdump.pcap,${DATE}_tcpdump.log,tcpdump.pid
```

- ${DIR}はデフォルトのlogディレクトリ名(log)
- ${DATE}はbgcmdを起動した時刻(YYYYMMDDHHMMSS)


### ツール起動
登録したコマンドリストを指定して起動

```
# ./bgcmd.sh start cmdlist
```

起動後、やりたいテストとかを実施
webサーバにアクセスとか、トラフィックを流すとか。

### ツール停止
テストが終わったらツール停止

```
# ./bgcmd.sh stop cmdlist
```

### ログ確認
log配下に、cmdlistに投入したログの出力結果が格納されてるので確認
コマンドリストのconsole log列に書いたファイルにログが残ってるはず。。。

```
# ls log
```
GoでSecureRandomを使いたい

Rubyの以下のコード

```rb
require 'securerandom'

puts SecureRandom.hex(16)
```

をGoに移植したいと思ったとします。すると以下のようになります。

```go
package main

import (
	crand "crypto/rand"
	"fmt"
)

func secureRandomStr(b int) string {
	k := make([]byte, b)
	if _, err := crand.Read(k); err != nil {
		panic(err)
	}
	return fmt.Sprintf("%x", k)
}

func main() {
	fmt.Println(secureRandomStr(16))
}
```

なんでこんな話をするのかというと、以前移植する機会があったんですね。

  * [catatsuy/private-isu](https://github.com/catatsuy/private-isu)
  * [private-isu/app.go at master · catatsuy/private\-isu](https://github.com/catatsuy/private-isu/blob/master/webapp/golang/app.go#L258-L264)

Ruby実装は `SecureRandom.hex(16)` と書いてあるだけでした。実はRubyのコードもGoのコードも自分が書いたのですが、Rubyで何も考えずに書いたコードがこんなに長くなるのか！って感じで（他にも色々あって）移植作業は予想以上に大変でした。

こういう風にRubyだと1行だけど、Goだと色々しないといけないといけないみたいなパターンが色々あるので、色んな言語で実装する必要があるWebアプリケーションを実装するときは気を付けましょう、という話でした（まあ自分が悪い）。
【Android】ListViewを複数回に分けて表示する

#環境
 - AndroidStudio 2.2.2
 - Java 1.8.0
 - Android 2.3.3

```java:activity.java
public class MyActivity extends Activity {
    /**
     * 1度に追加するリストの数.
     */
    private int listAddSize;

    /**
     * リストビューに表示するアイテム.
     */
    private ArrayList<String> arrayList;

    /**
     * アダプター.
     */
    private ArrayAdapter<String> adapter;

    @Override
    protected final void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //画面作成
        LinearLayout linearLayout = new LinearLayout(this);
        setContentView(linearLayout);

        //リストアイテム作成
        arrayList = new ArrayList<>();
        int listSize = 150;
        for (int i = 1; i <= listSize; i++) {
            arrayList.add("item:" + i);
        }

        //アダプタ作成
        adapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_list_item_1
        );

        //アダプタに初期表示分追加
        listAddSize = 50;
        for (int i = 0; i < listAddSize; i++) {
            if (i < arrayList.size()) {
                adapter.add(arrayList.get(i));
            } else {
                break;
            }
        }

        //リストビュー作成
        ListView listView = new ListView(this);
        listView.setAdapter(adapter);
        listView.setOnScrollListener(setOnScrollLast());
        linearLayout.addView(listView);
    }

    /**
     * リストをスクロールしたときの処理を作成し、返却.
     *
     * @return リストをスクロールしたときの処理
     */
    private AbsListView.OnScrollListener setOnScrollLast() {
        return new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(
                    final AbsListView view,
                    final int scrollState) {
            }

            @Override
            public void onScroll(
                    final AbsListView view,
                    final int firstVisibleItem,
                    final int visibleItemCount,
                    final int totalItemCount) {

                /**
                 * itemPrecense   アイテム数が1以上ならtrue
                 * positionIsLast リストビューの最終行を表示していればtrue
                 */
                boolean itemPrecense = totalItemCount > 0;
                boolean positionIsLast
                        = totalItemCount == firstVisibleItem + visibleItemCount;

                if (itemPrecense && positionIsLast) {
                    for (int i = 0; i < listAddSize; i++) {
                        if (totalItemCount + i < arrayList.size()) {
                            adapter.add(arrayList.get(totalItemCount + i));
                        } else {
                            break;
                        }
                    }
                }
            }
        };
    }
}
```
AMPページにタグ(AdSense)を入れたメモ（Automatic社のWordPressにAMP導入するプラグイン使っているとき）

##参考にしたもの

WordPressにAMPを導入するプラグイン
https://ja.wordpress.org/plugins/amp/

プラグインのカスタマイズの仕方が載っている。
https://github.com/Automattic/amp-wp/blob/master/readme.md

AdSenseの公式ヘルプ「AMP 広告ユニットを作成する」
https://support.google.com/adsense/answer/7183212?hl=ja


##AdSenseを入れる場合

###1.AdSense管理画面でレスポンシブ広告ユニットを作成
生成されたタグの中の「data-ad-client」と、「data-ad-slot」を控えておく

###2.AMPに貼る&lt;amp-ad&gt;タグを作る

[AdSenseの公式ヘルプ](https://support.google.com/adsense/answer/7183212?hl=ja)の「スクロールしなければ見れない位置」のタグをコピーしてきて、
「data-ad-client」と、「data-ad-slot」を控えたやつに書き換える。

「スクロールしなければ見れない位置」を選んだのは、一番下に広告を表示するから。

###3.AMPにjsと&lt;amp-ad&gt;タグを実装

使用しているテーマのfunctions.phpに以下を追記。

注）自作しているテーマならよいが、
WordPress公式からテーマをダウンロードしている場合は、子テーマに記入するとかしないと、
テーマをアップデートしたときに上書きされて消えてしまう。

####3-1.AMPのソースの &lt;head&gt; と &lt;/head&gt; タグの間にamp-ad-0.1.jsを貼り付ける

「amp_post_template_head」を使えば、&lt;head&gt; と &lt;/head&gt; タグの間に挿入できた

```functions.php
add_action( 'amp_post_template_head', 'xyz_amp_add_tag_adsense_js' );

function xyz_amp_add_tag_adsense_js() {
?>
<!-- AMP Ad -->
<script async custom-element="amp-ad" src="https://cdn.ampproject.org/v0/amp-ad-0.1.js"></script>
<?php
}
```

####3-2.広告を表示したいところにさっきの&lt;amp-ad&gt;を貼る

「amp_post_template_footer」を使うと、&lt;/body&gt;直前に挿入できた

```functions.php
add_action( 'amp_post_template_footer', 'xyz_amp_add_tag_adsense' );

function xyz_amp_add_tag_adsense() {
?>
<!-- Google Adsense -->
<amp-ad layout="responsive" width=300 height=250 type="adsense" data-ad-client="ca-pub-xxxxxxxxxxxx" data-ad-slot="xxxxxxxxxx">
</amp-ad>
<?php
}
```

参考：
https://github.com/Automattic/amp-wp/blob/master/readme.md#head-and-footer
Rで代数的集合をプロットする

Watanabe理論勉強会というのやっているのですが、スライドの中にある代数的集合のプロットはRを使って描いています。

- [Watanabe理論勉強会で発表してきました - ほくそ笑む](http://d.hatena.ne.jp/hoxo_m/20160926/p1)
- [代数曲線 - Wikipedia](https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E6%9B%B2%E7%B7%9A)

多項式ごとにひとつひとつ描いていたのですが、面倒になってきたので関数化してみます。

```r:R
plot_algebraic_set <- function(f, xlim = c(-1, 1), ylim = c(-1, 1), 
                               main = NULL, lwd = 2, ...) {
  if(is.null(main)) {
    main <- parse(text = sprintf('paste(%s, " = 0")', deparse(body(f))))
  }
  x_range <- seq(xlim[1], xlim[2], length.out = 100)
  y_range <- seq(ylim[1], ylim[2], length.out = 100)
  z <- vapply(y_range, function(y) {
    vapply(x_range, f, numeric(1), y = y)
  }, numeric(100))
  contour(x_range, y_range, z, nlevels = 1, method = "edge",
          xlim = xlim, ylim = ylim, main = main, lwd = lwd, ...)
}
```

これを使うと、多項式に対する代数的集合が簡単に描画できます。[^1]
[^1]: ただし、2次元限定です。

スライドにある Example 1 から 5 までを描画してみましょう。

```r:R
# Example 1
f1 <- function(x, y) y - x^3
plot_algebraic_set(f1, xlim = c(-2, 2), ylim = c(-3, 3))
```

![example1.png](https://qiita-image-store.s3.amazonaws.com/0/2570/4f98eeb7-e61d-240c-2590-1fc14896ec25.png)

```r:R
# Example 3
f3 <- function(x, y) x * y
plot_algebraic_set(f3, main = "xy = 0")
```

![example3.png](https://qiita-image-store.s3.amazonaws.com/0/2570/d6f0aae5-10ca-8024-725e-ef5c5a6bce46.png)

```r:R
# Example 4
f4 <- function(x, y) y^2 - x^3
plot_algebraic_set(f4, xlim = c(-0.5, 2), ylim = c(-3, 3))
```

![example4.png](https://qiita-image-store.s3.amazonaws.com/0/2570/2c368176-f49e-98d3-337a-4cef15698127.png)

```r:R
f5 <- function(x, y) x^5 - y^3
plot_algebraic_set(f5)
```

![example5.png](https://qiita-image-store.s3.amazonaws.com/0/2570/9ee491db-aa28-133d-153e-880ea14bfb0c.png)

同じ図が描けました。

Enjoy!