OmniAICreator/Qiita-1.07M huggingface dataset:
python bitmex 新規注文につていて

bitmexのapiを使って注文をしたいです。

このコードだと注文が通るのですが。記下のコードだとエラーになってしまします。宜しくお願い致します

注文成功コード

```py
import ccxt
import json

bitmex = ccxt.bitmex({
       #APIキーをご自分のものに差し替えてください
       'apiKey': 'ほげほげ',
       'secret': 'ほげほげ',
})

print(bitmex.publicGetInstrument({'symbol': 'XBTUSD'})[0]['lastPrice'])
entryPrice = (bitmex.publicGetInstrument({'symbol': 'XBTUSD'})[0]['lastPrice'])

bitmex.create_market_buy_order(symbol='BTC/USD', amount=1)
```

注文失敗コード

```py
import ccxt
import json

bitmex = ccxt.bitmex({
       #APIキーをご自分のものに差し替えてください
       'apiKey': 'ほげほげ',
       'secret': 'ほげほげ',
})

print(bitmex.publicGetInstrument({'symbol': 'XBTUSD'})[0]['lastPrice'])
entryPrice = (bitmex.publicGetInstrument({'symbol': 'XBTUSD'})[0]['lastPrice'])


bitmex.create_StopLimit_order(symbol='BTC/USD', orderQty=1,stopPx=8000,price=8000,side="BUY")
```
athrill(アスリル)機能マニュアル(外部入出力)

#概要
[athrill(アスリル)](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)の外部入力について解説します．

#外部入力
##シリアル入力(S)
シリアルチャネル０は，標準でデバッグモードでシリアル入力用に使用できます．
シリアル入力コマンドの書式は以下のとおりです．

```
 * serial(S):
   1) serial <channel> <input_data(string)>
      set <input_data> on the serial(<channel>) as an input
```


以下に，入力例を示します．

* [asp3](https://github.com/tmori/athrill/tree/master/sample/os/asp3/OBJ)を起動すると，シリアルチャネル０で標準出力に起動メッセージが出力されます．

```
[CPU>
TOPPERS/ASP3 Kernel Release 3.2.0 for V850-ESFK3 (Jun 23 2018, 21:03:48)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2017 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
Sample program starts (exinf = 0).
E_OBJ (-1) reported by `serial_opn_por'.
task1 is running (001).   |
task1 is running (002).   |
qtask1 is running (003).   |

[NEXT> pc=0x94c sample1.c 152
```

* シリアルチャネル０に"3>a"を入力

```
[DBG>S 0 3>a
```

* 処理再開すると，asp3のサンプルメインタスクが"3>"入力を検出し，task3のプライオリティをHIGHにし，task3がシリアル出力し始めます

```
[DBG>c
[CPU>#chg_pri(3, HIGH_PRIORITY)
#act_tsk(3)
task3 is running (001).       *
task3 is running (002).       *
```
TOPPERSコンテスト受賞作品紹介(9)第四回(2014)アプリケーション開発部門 金賞Toppers_ASPカーネルとScilab による組込みメカトロニクス制御シミュレーション 塩出武 (個人)

TOPPERS「活用アイデア」・「アプリケーション開発」コンテスト
は、2011年から毎年実施されています。
https://www.toppers.jp/contest.html

「アプケーション開発」は、ソースコードの公開を前提としています。
「活用アイデア」でも、その後実現したソースコードなどもある。探しながら紹介。

なお、この記事は、TOPPERSプロジェクトの公式見解ではなく、
小川清　の　技術者個人の考えに基づいています。

# 目的(purpose)
TOPPERS開発アイデア・アプリケーション開発コンテスト受賞作品には、良質な算譜、技術的に崇高な志向、目的を達成するための意思などが感じられる。広く、source codeを表示して紹介し、次の応募作品を促す。
#成果(outcome)

応募作品の算譜を眺めると、その技術者の得意分野や技法を感じることができる。応募作品のソースコードを使ってみようという気になる。ソースコードを一度コンパイルしたくなる。自分も良い作品を作ろうという気になる。

# TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(９)第四回(2014)アプリケーション開発部門 金賞
## Toppers_ASPカーネルとScilab による組込みメカトロニクス制御シミュレーション 塩出武 (個人)

## 応募資料(application material)等
 コンテスト応募資料 
https://www.toppers.jp/docs/contest/2014/shiode.pdf

### Download
ソースコード 
https://www.toppers.jp/docs/contest/2014/src_shiode.zip

# 算譜(source code)

```c:xxx.cpp
紹介ソース検討中

```
# 参考資料(reference)

TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(5)第三回アプリケーション開発部門銅賞 Toppers_JSPとScicos_lab（Scilabでも可）による組込みメカトロニクス制御シミュレーション 塩出 武（個人）
https://qiita.com/kaizen_nagoya/items/2aa0454c7bde7058e3f1

「TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介」まとめ
https://qiita.com/kaizen_nagoya/items/72b882d96b2841f25faf

TOPPERS活用アイデア・アプリケーション開発コンテストを振り返る
https://researchmap.jp/joxkbxlck-1778110/
「応募すると何が嬉しい」TOPPERS活用アイデア・ アプリケーション開発コンテスト
https://www.slideshare.net/kaizenjapan/ss-78528931

「TOPPERS活用アイデア・アプリケーション開発コンテスト」への道
https://researchmap.jp/jovr40j3b-1778110/?block_id=1778110&active_action=journal_view_main_detail&post_id=38687&comment_flag=1

# 文書履歴(document history)
ver. 0.10 初稿 
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Ruby + Twilio でのSMS送信実行

## TwilioでサインアップしてSMSを送る例
https://jp.twilio.com/
サインアップ自体は無料でできて500円分の無料枠もあり。
これで電話番号を買うまではできるが、通常のアプリのように任意の電話番号にSMSを送るためには有料会員へのアップグレードが必要。

### ライブラリのインストール

```
$ gem install twilio-ruby
```

### ライブラリを利用してSMSを送信
次にこんなスクリプトを作ってrubyコマンドで実行。

```sms_test.rb
require 'twilio-ruby'
 
account_sid = 'xxx SID xxx'
auth_token = 'xxx TOKEN xxx'
client = Twilio::REST::Client.new(account_sid, auth_token)
 
from = '購入した電話番号 ' # Your Twilio number
to = '送る電話番号' # Your mobile phone number
 
client.messages.create(
from: from,
to: to,
body: "Hey friend!"
)
```

電話番号は +81090xxxxxxx という具合に国番号をつける。
無料アカウントのままだとこんなエラーメッセージが出る。

```
$ ruby sms_test.rb 
 
/Users/[USER]/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/twilio-ruby-5.9.0/lib/twilio-ruby/framework/version.rb:150:in `create': [HTTP 400] 21608 : Unable to create record (Twilio::REST::RestError)
The number +8190xxxxxxxx is unverified. Trial accounts cannot send messages to unverified numbers; verify +8190xxxxxxxx at twilio.com/user/account/phone-numbers/verified, or purchase a Twilio number to send messages to unverified numbers.
https://www.twilio.com/docs/errors/21608
```
Kotlin で データベースマイグレーションツール を作った経緯

Kotlin で、 データベースマイグレーションのツールを作ってみました。
GitHub においてあります : [GitHub Harmonica](https://github.com/KenjiOhtsuka/harmonica)
今のところ PostgreSQL と MySQL と SQLite と Oracle Database で使えます。 

雑ですが、考えてきたことを書き留めました。

## 始まり

Kotlin + Spring でウェブアプリケーションサーバを作るとき、 データベースマイグレーションは Phinx や Rails を使っていました。 Java系のマイグレーションツールは Flyway などあるそうですが、 知識もないし、とある GitHub のコメントによると "古い" そうなので、自分で作ってみることにしました。

## モデル

モデルにしたのは、 Rails と Phinx です。

こんな感じでマイグレーションが書ければいいわけです。

```
class OneMigration {
    fun up {
        // ...
    }

    fun down {
        // ...
    }
}
```

そして、 up/down/create のようなコマンドでマイグレーション実行・作成ができればOKです。

### 仕組み

マイグレーションツールの仕組みは多くを望まなければシンプルです。

* ファイル名にバージョン番号を付加してどのファイルがどの順序かわかるようにする。
* バージョン番号の順序でマイグレーションが行われるようにする。
* 実行されたマイグレーションのバージョンをDBのあるテーブルに格納して、続きからでもマイグレーションを実行できるようにしておく。

## 今後

* Seed機能(初期データを入れる機能)を作る。
Laravel+React+EC2の備忘録

#注意
個人的なメモです。
#EC2インスタンスにログイン
各々に応じてログイン。
#EC2のセットアップ
```terminal
[ec2-user ~]$ sudo yum update -y
[ec2-user ~]$ sudo yum install -y git
[ec2-user ~]$ sudo git clone git://github.com/creationix/nvm.git /opt/nvm
[ec2-user ~]$ sudo source /opt/nvm/nvm.sh
[ec2-user ~]$ sudo nvm install v8.11.3
[ec2-user ~]$ sudo yum install -y httpd24 php71 mysql56-server php71-mysqlnd php71-mbstring
```
node関連参考:https://www.yoheim.net/blog.php?q=20161202

私の場合phpのバージョンが7.1以下だと後々にcomposer installする時なぜだか怒られたので状況に応じてバージョンは管理する。
#custom.conf
※参考:https://qiita.com/atto/items/e1effd28c212c3829cb0
Apacheの設定ファイルである```/etc/httpd/conf/httpd.conf```の最後に```IncludeOptional conf.d/*.conf```とありカスタムの```any.conf```を受け入れてくれるとあります。

この原理に基づき、

```terminal
[ec2-user ~]$ sudo vim /etc/httpd/conf.d/custom.conf
```
上記のように、custom.confを設置する。

エラーログファイルの場所の変更なども上記参考URLにあるのでやるといい。

```terminal
[ec2-user ~]$ sudo mkdir /var/www/log
```
```/etc/httpd/conf.d/custom.conf

# ドキュメントルート
DocumentRoot "/var/www/yourproject/public"

# .htaccess 有効化
<Directory /var/www/yourproject/public>
    AllowOverride All
</Directory>

# エラーログ
ErrorLog "/var/www/log/error_log"

# アクセスログ
<IfModule log_config_module>
    CustomLog "/var/www/log/access_log" combined
</IfModule>

```
#パーミッション設定
```terminal
[ec2-user ~]$ sudo groupadd www
[ec2-user ~]$ sudo usermod -a -G www ec2-user
[ec2-user ~]$ exit
[ec2-user ~]$ groups // 確認
```
ec2-user wheel www と表示されればOK。

```terminal
[ec2-user ~]$ sudo chown -R root:www /var/www
[ec2-user ~]$ sudo chmod 2775 /var/www
[ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} +
[ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} +

```

#Composer Install
- composer

```terminal

[ec2-user ~]$ curl -sS https://getcomposer.org/installer | sudo php
    // Downloading...
[ec2-user ~]$ sudo cp composer.phar /usr/local/bin/composer
[ec2-user ~]$ sudo ln -s /usr/local/bin/composer /usr/bin/composer
```
- 拡張ライブラリ

```terminal
[ec2-user ~]$ sudo yum install -y php71-pdo php71-mysqlnd
```
#git clone
```terminal
[ec2-user ~]$ cd /var/www
[ec2-user ~]$ mkdir yourproject
[ec2-user ~]$ cd yourproject
[ec2-user ~]$ git clone yourrepository
```
これでlaravel+reactのプロジェクトをEC２にクローンしましたが、.envと/venderがgitignoreのためこのままじゃ動きません。

```terminal
[ec2-user ~　/youreproject]$ vim .env
```
上記で、.env設定します。（内容は当たり前すぎるので省略）

/venderを調達のため、自分のプロジェクトrootで

```terminal
[ec2-user ~　/youreproject]$ composer install
```
php artisan -Vでバージョン出たら成功。

あとLaravel周りのmigrateとかは当たり前すぎるので省略

#Reactのnpm install及びnpm run prod
インストールとbuildやります。
2018年今更主張する、フロントエンドでなぜテストをするのか

# 経緯
普段Vue.jsとdjangoを書いてるエンジニアです。テストしやすいコンポーネント設計を導入するか、どの程度適用するのかを決める際に、そもそもなんでテストするのか？について考える必要がありました。今回は、私がざっと考えてみたなぜ、テストが必要なのか？どの程度必要なのか？についてのざっくりとした考察記事です。

# 前置き
フロントエンドのテストって、意味わからないですよね。
デザインは頻繁に変わるし、画面数もとても多く、完全に統一された部品の再利用で作られたデザインでもなければ、全てをテストしきるのは本当に手間がかかるのに対して、見返りがとても少ないです。しかも、デザインが一新された場合、コンポーネントの作成・メンテナンスだけでも大変なのに、新しいのから、変更のあったコンポーネントテストも全てしなければならないとなると、到底テストをする工数の捻出から、モチベーションを続けるのは難しいでしょう。では、なぜフロントエンドでテストをするのでしょうか？UIが壊れていたって、なにか困ることがあるのでしょうか？テストしやすい設計なんて必要なのでしょうか？どれくらいテストすればよいのでしょうか？

# TL;TD;
バグが起きたらインパクトの大きい箇所から順番にテストしましょう!

## テストをする理由
### サーバーサイドでテストをする理由
サーバーサイドでエラー・バグが発生した際に起きうる不都合な事をいくつか並べてみます

1. 個人情報等、重要な情報の流出
1. アプリケーション・会社の信頼性の低下
1. 意図しない機能の実行
1. 全体の機能が完全利用不可
1. 特定機能が完全利用不可
1. UXの低下

まだまだあると思いますが、ざっとこんなところでしょうか？
一応根拠のない優先度をつけてみました。

#### 失敗
ではそれを踏まえた上で、とあるtoBサービスがテストコードを十分に書かないでリリースした場合の1つの失敗を可能性を例にしてみましょう。

バグった機能は個人チャット機能です。

原因
調べた所、送信対象のユーザーIDがintを要求しているのに、なぜかstringで渡されてしまって、型チェックで落ちてしまいました。しかし、チームは軽い気持ちでこの変更が含まれるコードをリリースしてしまいました。

症状
このサービスを利用していた全てのtoBが一時的に業務連絡が取れなくなってしまいました。このせいでサービスの信頼性が低下し、類似する他のサービスへユーザー移動してしまいました。

#### 予防策
これは、etoeテストでレスポンスのステータスコード200番が帰ってくるかだけでも確認していれば、こんな単純なミスは防げたでしょう。まぁ、使用言語によっては、stringからintへ自動キャストされて200が通ってしまう場合もありますが、それは置いときましょう。

### 学び
今回は重大な機能ながらも、1機能の停止で済みましたが、もしormのdeleteの構文ミスで想定と違うレコードを削除してしまったりしていたら、目も当てられません。DBのレコードを追加・更新・削除する機能を持つモジュールは全てテストするべきです。この3つは取得よりも優先度がとても高いでしょう。データの取得は最悪バグっても、個人情報の流出以外なら、なんとかなる場合が多いです。

## テスト優先度
今回の学びを活かして、テストする優先順位をつけるならこんな感じで大丈夫でしょう。

1. 個人情報を取り扱う全ての機能
2. 更新機能・削除機能・追加機能
3. 取得機能

## フロントエンドでのテスト
### フロントエンドでテストをする理由
これは、サーバーサイドでテストをする理由と同じだと思います。

### 経験
そもそもモダンなフロントエンド技術で作成する大半のものは、データの表示でしょう。通信インターフェイスを利用し、色んなデータを加工したりして、装飾を付けて表示します。それらは、テスト優先度で言う所の3番目の優先度です。
大抵の装飾がバグったとしても、データに影響がないので困らないでしょう。勿論UXに影響はあるでしょうが、先程適当に付けたテストをする理由の中では、**最も優先度**の低い理由です。

### フロントエンドのテストが大変な理由
フロントエンドでは、テストの優先度が特に重要になってきます。それは、テストがとても大変だからです。
なぜ大変かというと

1. デザインの変更が機能の変更と比べて、頻度が高い
2. 作成されるコンポーネントの粒度がバラバラだから、同じ経験則でのテストができない
3. 全体の機能を一新しよう！という事は基本ないのに、デザインを一新しよう！は全然ある。ページが20ぐらいあったならば、テストするコンポーネントは100は行くでしょうか？デザインによりますね。
4. 単純な関数をテストする際のin outとは違い、リッチなコンポーネントでは状態がとても多く、しかもコードを読むのが辛い。まるでサーバーサイドにクラスが100個ぐらいあって、それらをテストするのに近い。しかも変化にはアニメーションやら非同期が含まれる。

ざっとこんなものでしょうか？

### フロントエンドでのテストの優先順位付け
どこからテストすれば良いでしょうか？
当然ですが、個人情報に関わる全てのコンポーネントでしょう。個人情報は特別ですので、それを除いた場合を考えましょう。
それは、追加(post)・更新(put)・削除(delete)です。htmlで実現する場合、form要素を使うことになるでしょう。つまり、formのテストが基本的には優先度が高いでしょう。

### テスト作成ストーリー
1. 個人情報に関わる全てのコンポーネントのテストを作ります。
2. サービスのコアの機能となるFormからテストを作ります。
3. 残りの表示用コンポーネントのテストをします。

## まとめ
バグが起きたら**インパクトの大きい**箇所のテストから作成していきます。そのインパクトの大きさは、テストをする理由の指標を用意し、当てはめたら大体わかるでしょう。
指標を作成する際には、テストをする理由の指標をポイントとセットで用意し、この段階ではこの閾値以上のポイントを持つコンポーネントのテストをすると決めると良いでしょう。そうすれば、そのコンポーネントはテストしなければならないとわかり、コンポーネントに当てはめるパターンを決めれます。すると、そのコンポーネントを作成するのに必要な工数も、前よりは大分正確に見積もれる副産物もあります。また、テストする優先度がとても低いコンポーネントは雑に作っても問題ないとわかります。もちろん、クオリティを追求した方が技術的にはよいでしょうが、開発速度とのトレードオフがあることを、理解しなければなりません。

## 最後に
初めにテストしやすい設計が必要？という問いに関しての解は、当たり前ですが、コンポーネントによる、でしょうか。
テストはとても大変でしょうが、まずは個人情報等を操作するフォームから小さく初めてみてはいかがでしょうか？
Linux環境でHDD1TB→SSDの240Gに換装した際の覚書

##　環境
OS：linux mint mate 18.3
PC:Dell Inspiron 14 3467
usbメモリ:Xubuntu 18.04 LTS

## はじめに
ノートPCのHDDをSSDにして、爆速の起動を体感したい！
　
人権を持ちたい！　と常に思っていたのですぐに換装できるだろうと慢心しながら始めました。

また、せっかくのHDDを腐らすのはもったいないということでDVDドライブを外してそこに入れることにしました。

その結果、終わるまでに3日もかかってしまったので、その際のトラブル等の覚書。

## 手順
1. USBメモリにXubuntuをフルインストール
2. HDDのパーテーションを切り、サイズを240G以下へ
3. HDDのクローンをSSDに作成
4. SSDのパーテーションサイズの調整
5. SSDを内蔵し、HDDをDVDドライブへ

追加発生
1.1 ブートローダの修復
6.UUIDの変更 

## 実際の作業
### 1.USBメモリにXubuntuをフルインストール

基本的には[ここ](http://yohaku6066.blog.fc2.com/blog-entry-44.html)とか[ここ](http://devstu.hatenablog.com/entry/2016/03/12/004354)を参考にインストール用のDVDを作成しUSBメモリにフルインストールしました。
#### ハマった点その1
[ここ](https://forums.ubuntulinux.jp/viewtopic.php?id=18563)でも取り上げられているのですが、正しくブートローダをインストールするデバイスを選択していたのにもかかわらず、HDDのブートローダが書き換えられるということが発生しました。

後学のために、わかるかた是非教えていただきたいです…

このあとクローンをするのに、ブートローダが書き換わったままでクローンしたら駄目じゃん…
ということで、修復作業が始まりました。

### 1.1ブートローダの修復
知識ゼロスタートだったので苦労したが、どうやらLinuxのデータは壊れていないのでgrubからOSを起動→grubをHDDに再インストールで大丈夫っぽい。

・ルートになるパーテーションを指定
grub > `set root=(hd0,gpt2)`

・カーネルを指定
grub > ` linux /boot/vmlinuz-xx.x root=/dev/sda2`

・初期RAMディスクを指定
grub > `initrd /boot/initrd-xx.x `

・起動
grub > `boot`

これでLinux mintが立ち上がったのでgrubを再インストールします。
`# grub-install /dev/sda`

### 2.HDDのパーテーションを切り、サイズを240G以下へ
ここは問題なくすぐに終わりました。

Xubuntuをインストールしたusbを挿入し、起動。

起動後、Gpartedを起動しHDDだど思われるディスク(今回だと/dev/sda)を選択し100GBまで減らしました。

### 3.HDDのクローンをSSDに作成＆4. SSDのパーテーションサイズの調整
[ここ](http://d.hatena.ne.jp/kappaseijin/20160924/1474683913)を参考にddコマンドでコピー＆gptの修正をしたら簡単にできました。

はじめはddrescueを入れて、パーテーションごとでコピーを取ったのですが、コピー後実際にSSDを挿入しても起動しませんでした。

多分、パーテーション単位だとUEFIで起動するのに必要なのがコピーできてない？←ごめんなさい、原因はよくわかってないです。


### 5. SSDを内蔵し、HDDをDVDドライブへ
私のノートPCは内蔵HDDを外すには、キーボードを外し、背面のネジすべて取り出す必要がありました。

今回はSSDへの交換でしたが、いつかはメモリの増設もあると思うので、参考にしたサイトをペタペタ貼っておきます。

#### 参考
[たびびとライフ](https://tarelife.com/inspiron15-ssd/)
[DELL公式ドキュメント](http://downloads.dell.com/manuals/all-products/esuprt_laptop/esuprt_inspiron_laptop/inspiron-15-3567-laptop_service%20manual_ja-jp.pdf)

### 6.UUIDの変更
SSDを内蔵し、HDDをDVDドライブに挿入したし、よし完成！！！と思い起動してみるとあら不思議。

Linux mintのOSは動いてます。動いているのですが、HDDにあるのを読み込んでる…

調べたところ、クローンしたことでUUIDを同じ状態であることが原因。

改めてusbメモリからXubuntuを起動し、Gpartedを起動。ディスクは/dev/sdb(入れ替えたためHDDがsdbになった)を選択。

その後、sdb2にlinuxが入っているため、そのパーティションに新しいUUIDを付与。

その後改めてLinux Mintを立ち上げてみたが、SSDを参照して起動していることの確認ができた。

### 終わってみて
とにかく無駄に時間がかかりすぎてしまった。

ハマった点は結果的にはあっさり解決したのに、なぜかハマってる最中はとても時間かかってしまった。

~~Linuxだから情報を見つけにくいのが悪い~~　言い訳です。はい。

このあとは、HDDにWindowsを復活させようかなと、あとパーティション切って500GBの共有領域作りたい。

また、ハマって時間がかかりそうだが、完成したら覚書として残しておく所存。
はじめてのスコープ関数

# はじめに
真面目にAndroidアプリを作ろうと決意したので、学習したことの備忘録として書いてます。
下記のサイトを参考にさせてもらいました。
https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e

# スコープ関数とは
引数にとる関数のスコープを変更するための関数。（クロージャと同じ？）
基本的には、複数処理をまとめたい場合に使用する。

## let

### 定義

``` kotlin
public inline fun <T, R> T.let(f: (T) -> R): R = f(this)
```
### 特徴
* 拡張関数であるため、自分自身をゴニョゴニョするときに使う
* Nullableな値に使用すると、nullの場合はnullを返し、nullでない場合は関数の実行結果を返す。

### 使用例
nullableな値をすべて大文字にし、逆にする。

```kotlin
val hoge: String? = "hoge"
val result = hoge?.let {
  it.toUpperCase()
  it.reversed()
}
```
## with

### 定義
```kotlin
public inline fun<T, R> with(receiver: T, f: T.() -> R):R = receiver.f()
```

### 特徴
* 拡張関数ではなく、ただの関数
* 最後の実行式を返す

### 使用例
ユーザークラスのnameとageのプロパティに値を設定する

```kotlin
val user = with(User(), {
    name = "taro"
    age = 20
    this
})
```

上記のようにオブジェクトに値を設定したい場合は、後述するapplyを使うほうが適しているかもしれない。

## run

### 定義
```kotlin
public inline fun<T, R> T.run(f: T.() -> R):R = f()
```

### 特徴
* 拡張関数
* 実行結果を返す
* letとwithを合体させた感じ 

### 使用例
```kotlin
val user = User().run {
    name = "taro"
    age = 20
}
```
## apply

### 定義
```kotlin
public inline fun<T> T.apply(f: T.() -> Unit): T { f(); return this }
``` 
### 特徴
* レシーバーを返す。
* レシーバーのオブジェクトに対して何かを設定したりするときに使用する。
* レシーバーのオブジェクトに対して、関数の実行結果を返すわけではないので何も起こらない。

### 使用例
ユーザークラスのnameとageのプロパティに値を設定する。

```kotlin
val user = User().apply {
    name = "taro"
    age = 20
}
```
オブジェクトに対して何かを設定するときに使用する。

#　最後に
自分でも完全に理解できていないので随時更新していきます。
iOSから安全に社内リソースにアクセスする

Windowsクライアントに対してはセキュリティ設定や、ユーザーの操作ログとかとっていて、外出時にVPN引いて業務出来るようにしている組織は多いと思います。監査面で操作ログとることが必須だ！だなんてやかましい会社であればなおさらです。

外出先での業務にWindowsクライアントだけでなく、モバイルを業務に利用するシーンは増えてきているでしょうし、ユーザーから「社内システムをモバイルからつかるようにしてよ！」というニーズも増えてきているでしょう。しかし、常に社外で使う前提のモバイルデバイスから、社内リソースにアクセスさせる環境はセキュリティ上難があるので、デバイスごとVPNを引かせるのも困ります。


こんな時に、モバイルから社内のシステムを利用する際に、特定のアプリだけ許可する（たとえば、社内システム向けのモバイルアプリからは許可するけど、Safariからは禁止する）ことができれば比較的安全です。

社内のモバイルデバイスをEMSで管理しているとき、以下の２つのシナリオがあります。
・Azure AD App Proxyを利用して、Managed Browserからのアクセスのみ許可する
・Per App VPNを利用して、特定のアプリからの場合のみ、アクセスを許可する




Azure AD App Proxyは、特定の条件を満たしたデバイスやアプリからの場合は、VPNを引かなくても社内webアプリを利用できます。社内情報を許可アプリ内で閉じさせて、許可アプリ以外にペーストできなくしたい場合は、Managed Browserでアクセスさせれば、社内システムを安全に利用させられます。

しかし、社内システムの仕様や要件により、ManagedBrowserで利用できない場合（モバイルブラウザでの操作性が違うことや、FQDNを変換することにより処理が正常に行われない、など）や、ネイティブアプリで利用させたい場合は、この方法は使えません。そういった場合は、Per App VPNを使って社内システムを利用させるシナリオを検討することができます。

Per App VPNは、クライアントデバイス側の「特定のアプリの場合だけ、VPN通信をさせる」「それ以外の場合はVPN通信させない」という機能です。社内システム用のアプリAppStoreに公開されているケースではこちらで実現できるかもしれません。


次回、Intune管理画面上でのPer App VPNの設定について書きます。
TOPPERSコンテスト受賞作品紹介(16)第六回(2016)アプリケーション開発部門フリークラス 銀賞  Sessalet（せされっと）

TOPPERS「活用アイデア」・「アプリケーション開発」コンテスト
は、2011年から毎年実施されています。
https://www.toppers.jp/contest.html

「アプケーション開発」は、ソースコードの公開を前提としています。
「活用アイデア」でも、その後実現したソースコードなどもある。探しながら紹介。

なお、この記事は、TOPPERSプロジェクトの公式見解ではなく、
小川清　の　技術者個人の考えに基づいています。

# 目的(purpose)
TOPPERS開発アイデア・アプリケーション開発コンテスト受賞作品には、良質な算譜、技術的に崇高な志向、目的を達成するための意思などが感じられる。広く、source codeを表示して紹介し、次の応募作品を促す。
# 成果(outcome)
応募作品の算譜を眺めると、その技術者の得意分野や技法を感じることができる。応募作品のソースコードを使ってみようという気になる。ソースコードを一度コンパイルしたくなる。自分も良い作品を作ろうという気になる。

# TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(16)第六回(2016)フリークラス 銀賞 
## Sessalet（せされっと）山根ゆりえ（株式会社 達人出版会），渡辺のぼる（合同会社 ワタナベ技研），島敏博（セイコーエプソン株式会社）

## 応募資料(application material)等
 コンテスト応募資料 
https://www.toppers.jp/docs/contest/2016/Sessalet（せされっと）.pdf

### Download
ソースコード 
https://www.toppers.jp/docs/contest/2016/src_sessalet.zip

#関連資料(related URL)

# 算譜(source code)

```c:control.c
// EV3操作用の関数
#include "ev3api.h"
#include "syssvc/serial.h"
#include "app.h"
//#include "control.h"

// Debug Message on LCD
void lcd_new_message(const char* msg) {
	ev3_lcd_fill_rect(0, 0, EV3_LCD_WIDTH, EV3_LCD_HEIGHT, EV3_LCD_WHITE);
	ev3_lcd_draw_string(msg, 10, EV3_LCD_HEIGHT / 2);
}

// フタを開ける(モータ-ID, フタを開けるために必要なモータの回転角度, フタを開けるスピード)
void openCover(void) {
	ev3_motor_rotate(cover_motor, COVER_OPEN_DEGREE, COVER_OPEN_SPEED, false);
}

// フタを閉じる
void closeCover(void) {
	ev3_motor_rotate(cover_motor, COVER_CLOSE_DEGREE, COVER_CLOSE_SPEED, false);
}

// ノズルを出す
void putOutNozzle(void) {
	ev3_motor_rotate(nozzle_motor, NOZZLE_DEGREE, NOZZLE_SPEED, true);
}

// ノズルをしまう
void putAwayNozzle(void) {
	ev3_motor_rotate(nozzle_motor, NOZZLE_OFF_DEGREE, NOZZLE_SPEED, true);
}

// ウォシュレットの水を出す
void openSplay(void) {
	ev3_motor_set_power(splay_motor, 50);
}

// ウォシュレットの水を止める
void closeSplay(void) {
	ev3_motor_set_power(splay_motor, 0);
}

// 洗浄水を流す（ブザー音で代替）
void openFlash(void) {
	ev3_speaker_play_tone(FLASH_SOUND, SOUND_MANUAL_STOP);
}

// 洗浄水を止める
void closeFlash(void) {
	ev3_speaker_stop();
}

// 着座判定
int chkSeated(const int reflect_min, const int reflect_max) {
	int reflect = ev3_color_sensor_get_reflect(seated_sensor);
	static char msg[100];
	sprintf(msg, "reflect: %d\r\n", reflect);
	(void)serial_wri_dat(SIO_PORT_BT, msg, sizeof(msg));
	if (reflect_min < reflect && reflect < reflect_max) {
		return 0;
	} else {
		return 1;
	}
}

```


#参考資料(reference)
「TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介」まとめ
https://qiita.com/kaizen_nagoya/items/72b882d96b2841f25faf

TOPPERS活用アイデア・アプリケーション開発コンテストを振り返る
https://researchmap.jp/joxkbxlck-1778110/
「応募すると何が嬉しい」TOPPERS活用アイデア・ アプリケーション開発コンテスト
https://www.slideshare.net/kaizenjapan/ss-78528931

「TOPPERS活用アイデア・アプリケーション開発コンテスト」への道

https://researchmap.jp/jovr40j3b-1778110/?block_id=1778110&active_action=journal_view_main_detail&post_id=38687&comment_flag=1

# 文書履歴(document history)
ver. 0.10 初稿 20180624
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
当然知っているよね？Goの変数のスコープとシャドーウィングのクイズ

Goにおける変数のスコープとシャドーウィングのクイズです。
本当に基本的な内容なのでGoを触っていたら楽楽全問正解できるはず！
実務的ではない、というか実務でこの状況に遭遇するのはまずい気がします。

問題は以下を省略してメイン関数だけ書いてます。

```go
package main

import "fmt"
```

## 前提確認

```go
var n = 0

func main() {
	fmt.Println(n)
}
```

出力は？

<details><summary>解答（折りたたみ）</summary><div>

```
0
```

これがわからなければ基本からやり直そう

</div></details>

## 第一問

```go
var n = 0

func main() {
	n := 1
	fmt.Println(n)
}
```

出力は？

<details><summary>解答（折りたたみ）</summary><div>

```
1
```

まあこうなるよね。

</div></details>

## 第二問

```go
var n = 0

func main() {
	n := 1
	fmt.Println(n)
	printN()
}

func printN() {
	fmt.Println(n)
}
```

出力は？

<details><summary>解答（折りたたみ）</summary><div>

```
1
0
```

main関数内のnはグローバル変数のnとは別の変数になります。スコープはメイン関数だけなので、printN関数の中ではグローバル変数が参照されます。

というわけで一行目が1で二行目が0。

</div></details>

## 第三問

```go
func main() {
	n := 1
	{
		fmt.Println(n)
	}
}
```

出力は？

<details><summary>解答（折りたたみ）</summary><div>

```
1
```

中括弧のブロックはメイン関数の中なのでメイン関数で定義されたnを参照します。

</div></details>

## 第四問

```go
func main() {
	n := 1
	{
		n := 2
		fmt.Println(n)
	}
	fmt.Println(n)
}
```

出力は？

<details><summary>解答（折りたたみ）</summary><div>

```
2
1
```

シンプルなシャドーウィングです。
中括弧で囲われたブロック内ではnは２、main関数ではnは１。

</div></details>

## 第五問

```go
func main() {
	n := 1
	for n := n + 1; n < n+2; n++ {
		fmt.Println(n)
	}
}
```

出力は？
（__実行しないでください__）

<details><summary>解答（折りたたみ）</summary><div>

```
2
3
4
...
```

2以上の整数をえんえんと出力し続けます。
for文の条件式のうち、

```go
n := n + 1 //左がforのスコープ、右がmainスコープ
n < n + 2 //両方forのスコープ
n++ //forのスコープ
```
`n < n + 2`は常に真なのでずっと出力が続きます。

</div></details>

## 最終問題

```go
func main() {
	n := 1
	if n := n + 1; true {
		fmt.Println(n)
		n = n + 1
		fmt.Println(n)
	}
	fmt.Println(n)
}
```

出力は？

<details><summary>解答（折りたたみ）</summary><div>

```
2
3
1
```

軽く引っ掛けっぽい問題です。
if文の中のnは、if文だけのスコープになります。
それ故、5行目で書き換えてもmainスコープのnには影響を与えません。

</div></details>

## 終わりに

以上、いかがだったでしょうか？
ごくごく基本的なものだけ集めてみました。
真面目な話をすると、理由なく同じ変数名を別のスコープで使うのは可読性を下げるのでやめたほうがよいでしょう。

ありがとうございました！
gif-for-cli: GIFアニメを動くアスキーアートとしてターミナル上に表示する

# gif-for-cli

GoogleがGIFアニメをCLI上にアスキーアート風に表示するツール「git-for-cli」を開発し、github上に公開しました。
GIFフォーマット（GIF87a）の公開が1987年6月15日で、その31周年記念ということです。
またGoogleはGIF画像検索プラットフォームTenorを今年3月27日に買収しており、そのコラボでもあるようです。

- 記事: [31st anniversary of the GIF: give your terminal some personality with Tenor GIF for CLI](https://opensource.googleblog.com/2018/06/tenor-gif-for-cli.html)
- リポジトリ: https://github.com/google/gif-for-cli

# インストール

手元のmacに入れてみます。

```
brew install ffmpeg zlib libjpeg python
pip3 install gif-for-cli
```

入った。

```
$ which gif-for-cli 
/usr/local/bin/gif-for-cli
```

# ターミナル起動時にキズナアイさんに踊っていただく

Googleのブログ記事によると

> Many developers configure static ASCII art to appear when opening a terminal, but I imagined that ASCII art could animate like a GIF, and could easily be created from any GIF on Tenor.

「大勢の技術者がターミナル起動時に静的なアスキーアートを表示させるように設定してるけど、アスキーアートはGIFのように動かすことができると思ってたし、Tenorの好きなGIFから簡単にアニメを作ることもできたんだよね〜」
ということなので、早速やってみます。

Tenorから[キズナアイさんがギミチョコ踊ってるGIF画像](https://tenor.com/view/gimme-chocolate-baby-metal-kizuna-ai-yotuber-gif-11945020)を見つけてきてローカルに保存。
次のコマンドを`.zshrc`に追記します。

```
gif-for-cli --display-mode=256 -cw 10 -ch 34 --cols 142 -l 1 ~/Pictures/greeting.gif
```

オプション

- `--display-mode=256`
    - `nocolor` `256` `256fgbg` `truecolor` の4種類あり、いちばんしっくり来たのを選びました
- `-cw CELL_WIDTH`, `-ch CELL_HEIGHT`
    - 縦横比があっていればいいらしく、自分の環境の1文字のピクセル数を数えて設定
- `--cols COLS`
    - ターミナルのデフォルトの列数を指定

ターミナルを起動すると次のようにGIFアニメ風のグリーティングが表示されます。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">ターミナル起動時にキズナアイさんに踊っていただく設定にしてみました。頑張ろうって思えますね。<br><br>gif-for-cli: GIFアニメをターミナル上に表示する | Qiita<a href="https://t.co/6zIJI16tjn">https://t.co/6zIJI16tjn</a> <a href="https://t.co/8Kq8SyFuze">pic.twitter.com/8Kq8SyFuze</a></p>&mdash; set0gut1 (@set0gut1) <a href="https://twitter.com/set0gut1/status/1010755497480212480?ref_src=twsrc%5Etfw">2018年6月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


はいどうもー！頑張ろうっていう気分になりますね。
isucon7予選練習環境を5分で作る

# はじめに

- このエントリではISUCON7(予選)アプリケーションイメージが提供されている[conoHa](https://www.conoha.jp/)のVPSを使用します。
- 筆者はconoHaさんと一切の関係はありません。

# 手順
- conoHa VPSに[登録](https://www.conoha.jp/signup/?plan=tyo_2gb&ns&btn_id=guide_isucon_signup)します
- 支払い方法を登録したら、イメージタイプからアプリケーション→isucon7(予選)を選択してサーバーを追加します
<img width="1018" alt="スクリーンショット 2018-06-24 13.56.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/137903/a1811e86-2750-743a-2d1b-fe655f8bc76e.png">


- [サーバーリスト](https://manage.conoha.jp/Service/)の中から、先程追加したサーバーのネームタグをクリックします
- 詳細画面に移動するので、IPアドレスをコピペします
- 上記でコピペしたIPアドレスを使ってssh接続します

```
$ ssh -l root {IPアドレス}
```

- 接続完了したら、ベンチマークを実行しましょう

```
# /home/isucon/isubata/bench/bin/bench -data=/home/isucon/isubata/bench/data -remotes=localhost -output=result.json
```



# 参考
https://www.conoha.jp/guide/isucon.php
spring-securityでログイン画面でタイムアウトするとCSRFトークンが有効期限切れしてログイン失敗する

## 現象と原因
現象としては、Spring Security有効環境下で、ログイン画面を開いたあと長時間放置してからログインしようとすると正しいID・パスワードでも失敗する。

これの原因は、長時間放置のタイムアウトでCSRFトークンが無効になるため。タイムアウト後のログインでセッションが再作成されて認証処理そのものは成功するが、送信されるCSRFトークンは失効したものなので、最終的にログインは失敗する。

## 対策
CSRFがタイムアウトする前にログインページを定期的にリフレッシュする。参考： https://stackoverflow.com/questions/27501212/csrf-token-expires-during-login

```html
<META HTTP-EQUIV="REFRESH" CONTENT="csrf_timeout_in_seconds">
```

また、参考URLにこれ以外の解決策も挙げられている。
Railsで重複レコードを一気に削除する方法

#環境
rails 5.1.4
ruby 2.5.0

#背景
Railsでリリース前のアプリを作っていて、Tagモデルに後からunique制約を入れたのですが、元々のデータで重複がたくさんあり、それを消す時にどうすればいいか悩みました。

最初は下記の記事を参考に削除しようとしたのですが、created_atが重複して完全には消せなかったので、IDをキーに削除しました。IDをキーで消したい人の参考になれば。それ以外のキーで消したい場合は、下記記事を参考ください。

【Ruby on Rails】重複しているレコードを取得する【MySQL】
http://techblog.kyamanak.com/entry/2017/10/18/215532

#方法
まずは下記のコードで重複がどれだけあるか確認。今回はTagモデルのnameの重複を確認します。

そうすると重複しているレコードがズラズラ出て来ます。

```ruby
pry(main)> Tag.group(:name).count.sort_by(&:second).reverse
=> [["aaa", 4],
 ["bbb", 3],
 ["ccc", 2],
 ["ddd", 2],
 ["eee", 2],
etc...
```

順調に重複しているのがわかると思います。

方針としては上記記事にもある通り下記の方針で削除します。
・重複しているレコードの中で、残したいレコードのIDを取得する。
・重複しているレコードの中で、残したいレコード以外を削除する。

その中で上記記事ではcreated_atを基準に削除されていました。
しかし私の場合は、created_atが被っていた為、削除ができませんでした。

そのためIDをキーに削除することにしました。
IDをキーにすると書くコードを一つ少なくすることができます。

結論的には下記で消すことができます。

```ruby
pry(main)> hash = Tag.group(:name).having('count(*) >= 2').maximum(:id)
=> {"aaa"=>2202,
 "bbb"=>3361,
 "ccc"=>2699,
 "ddd"=>3960,
 "eee"=>2212,
etc...

pry(main)> Tag.where(name: hash.keys).where.not(id: hash.values).destroy_all
```

最後に消せたかどうかを確認すると、

```ruby
pry(main)> Tag.group(:name).count.sort_by(&:second).reverse
=> [["aaa", 1],
 ["bbb", 1],
 ["ccc", 1],
 ["ddd", 1],
 ["eee", 1],
etc...
```

で消せたことが確認できました。
Dockerfileの書き方

以下をファイルに書いて、それを`docker build`することでイメージファイルができるらしい。

**FROM**
どのイメージを基にするか。
これを最初に書かなければならない。

**LABEL**
作成者情報等メタデータの追加。

**RUN**
`build`時、イメージに対してコマンドを実行する。次のステップではコマンド実行後のイメージが使われる。

**CMD**
`build`されたイメージが何をするものかを書く。`build`時には影響しない。
Dockerfileの中に一つだけ書く（沢山書いても最後のCMDが使われる）

**EXPOPSE**
実行時にコンテナがlistenするポート指定。

**ENV**
`build`時＋実行時の環境変数設定。

**ADD**
ディレクトリやURLで指定したファイルをイメージのファイルシステム上にコピーする。
もしも`src`が圧縮されていたら展開してディレクトリとしてコピーされる。
ワイルドカードも使える。

**COPY**
ディレクトリやファイルをイメージのファイルシステム上にコピーする。ワイルドカードも使える。

**ENTRYPOINT**
実行可能なコンテナとして設定するために使う。
`CMD`との組み合わせやどういう引数を与えるかによって動きが変わるので詳細は公式のドキュメント[^ENTRYPOINT]参照。

**VOLUME**
マウントポイントを作る。

**USER**
ユーザーを設定する。イメージやステップを実行する権限が設定されたユーザーにないときはrootで実行される。

**WORKDIR**
作業ディレクトリを設定する。

*ARG**
`build`時にユーザーから渡される変数を定義できる。

**ONBUILD**
後で実行されるトリガーをイメージに追加する。もしこれを使うのであれば`FROM`直後に書く必要あり。よくわからんので使ってみる。

**STOPSIGNAL**
コンテナを終了するためのシステムコールシグナルを設定する。

**HEALTHCHECK**
コンテナが正常動作しているかをDockerが確認する方法を記す。

**SHELL**
デフォルトのシェルを上書きする

[^ENTRYPOINT]: https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact
Nuxt.js プロジェクトを作成し Typescript, bootstrap-vue を適用

めっちゃ簡単だった。
Nuxt はフロントエンド設定地獄に一筋の光を差しているかもしれない…

# 環境
- OSX High Sierra
- node 10.5.0
- vue cli 2.9.6

# vue cli の導入
```
yarn global add vue-cli
```

# Nuxt.js + Typescript プロジェクト作成
```
vue init nuxt-community/typescript-template myproject
```

# bootstrap-vue 導入
```
yarn add bootstrap-vue
```

```diff:nuxt.config.js
modules: [
    "@nuxtjs/axios",
-   "~/modules/typescript.js"
+   "~/modules/typescript.js",
+   "bootstrap-vue/nuxt"
  ],
```

# 動作確認
```
yarn dev
```

# 参考
https://ja.nuxtjs.org/guide/modules/
https://bootstrap-vue.js.org/docs/
GitHub から ERROR: Account is disabled. Please ask the owner to check their account. と表示されクレジットカードを更新

ローカルで GitHub リポジトリを git pull するとエラーがでました。

# git pull でエラー
pull が失敗します。

```
ERROR: Account `pugiemonn' is disabled. Please ask the owner to check their account.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
アカウント pugiemonn が有効ではないとあります。どういうことでしょうか。

# GitHub 課金で問題がでているとメッセージ
GitHub にアクセスするとメッセージがでています。

```
We are having a problem billing your account. Please enter a new payment method or check with your payment provider for details on why the transaction failed. If you don’t need access to your private repositories, you can downgrade to the Free plan in your Billing settings.
You can always contact support with any questions.
```
課金が失敗したので、直してねみたいな感じでメッセージがでています。
そういえば最近クレジットカードの期限が来てしまったことを思い出しました。

# クレジットカードを設定
支払いの画面に移動します。
https://github.com/settings/billing/payment

新しいクレジットカード情報を入力するとメッセージが出ます。

`Your credit card has been successfully updated. Thanks!`

# git pull を試す
今度は成功しました(☝ ՞ਊ ՞)
[AutoHotKey]コマンドライン引数%n%と変数に関する覚書


## 基本
- [スクリプトのコマンドライン引数](http://ahkwiki.net/Scripts#.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.AE.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89.E3.83.A9.E3.82.A4.E3.83.B3.E5.BC.95.E6.95.B0)
- [AutoHotkey Scripts and Macros](https://autohotkey.com/docs/Scripts.htm#cmd)

Ahk2Exe.exeでコンパイルしたスクリプトは、コマンドライン引数を受け取った場合、変数`%1%`～`%n%`に格納する。変数`%0%`には引数の数を格納する。

AutoHotKey 1.1.27 以降では、組み込み変数`A_Arg`から引数にアクセスできる。

これは配列オブジェクトであり、例えば`A_Arg[1]`には1つ目の引数が格納されている。

## 数値を変数名とする変数の扱い
扱いは通常の変数と同様であるが、これに限らず数値を変数名とする変数は、式中で参照することができない。

以下しばらく、コンパイルしてないスクリプトで数字を変数名とする変数を扱う場合。

```txt:sample.ahk
1 = abc
var := 1 . "def" ; 式で文字列を連結する
MsgBox, , %A_scriptname%, %var%
; 「1def」と表示される
```

このように、式中では数値は変数名ではなくただ数値として扱われる。
[these variables cannot be referenced directly in an expression because they would be seen as numbers rather than variables.](https://autohotkey.com/docs/Scripts.htm#cmd)というわけである。

↑の例であれば、右側を式の代入ではなく、変数を含む文字列にすればよい。

```txt:sample.ahk
1 = abc
var = %1%def
MsgBox, , %A_scriptname%, %var%
; 「abcdef」と表示される
```

どうしても式中で参照する必要がある場合（例えば関数のパラメータ）、別名の変数に格納する必要がある。

```txt:sample.ahk
1 = abcdef
1p = %1%
F_MsgBox(1)
; 「1」と表示される
F_MsgBox(1p)
; 「abcdef」と表示される

F_MsgBox(msg) ; パラメータの文字列を表示する関数
{
    MsgBox, , %A_scriptname%, %msg%
}
```

## A_Argsさいこうすぎる
そんな面倒は`A_Args`にはないのでとっととアップデートしてとっとと配列覚えましょう。

### 引数のループ処理
以下は、引数の有無を判定した上でループ処理する例。

```txt:sample.exe
If (A_Args.length() > 0) ; 引数が1個以上ある場合
{
    For index, Target in A_Args ; 引数をループ処理
    {
        If FIleExist(Target)
            Run, %Target%
    }
}
```

### フラグ処理を加える例
readme.mdっぽく書くと`sample.exe [/flag_a] [arguments]`みたいな、コマンドラインスイッチがありつつ複数のパラメータも取れるスクリプトを書く場合。

```txt:sample.exe
flag_del = 0
If (A_Args.length() > 0) ; 引数があったら
{
    If (A_Args[1] = "/del")
    {
        flag_del = 1
        A_Args.remove(1) ; 第1パラメータを削除し配列をシフト
    }
    If (A_Args.length() > 0) ; まだ引数があったら
    {
        For index, Par in A_Args ; パラメータをループ処理
        {
            If FIleExist(Par)
                If (flag_del = 0)
                    Run, %Par%
                Else
                    FileDelete, %Par%
        }
    }
}
```

まあだいたいこれを基本にしていじればなんとかなる。

### ただし
配列オブジェクトは、雑な言い方だが式中でしか参照できないのがちょっと扱いづらさは感じる。
AutoHotKeyの配列は配列オブジェクトであって配列変数ではない。変数ではないので変数として参照はできない。
変数として参照できないので、そのままでは**値として扱うことができない**。ということになる。

例えば`A_Args[1]`を表示したいだけなんだよなー！というとき、`MsgBox, , %A_scriptname%, %A_Args[1]%`とか`MsgBox, , %A_scriptname%, %A_Args%[1]`とかやってもダメ。

正しくはこう。（参照：[式 \- AutoHotkey Wiki](http://ahkwiki.net/Expression#.E6.A6.82.E8.A6.81)）

```txt:sample.exe
MsgBox, , %A_scriptname%, % A_Args[1]
```

なんかなーうーんなんかなー！

こういう場面では*Legacy*な`%<数値>%`のほうが簡単ではある。両方使うと混乱するから、配列の方に統一したけど。
Word VBA - よく使う列挙型マクロとAPI/サンプルコードのリンク集

#概要

よく使う列挙型マクロとAPI/サンプルコードのリンク集

##WdSaveOptions 列挙
[msdn_ja-jp](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/wdsaveoptions-enumeration-word)
[msdn_en-us](https://msdn.microsoft.com/en-us/vba/word-vba/articles/wdsaveoptions-enumeration-word)

###API
- [Document.Close メソッド (Word) - msdn](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/document-close-method-word)

###サンプルコード
- [Python(pywin32)でWordを操作する[7] - 既存文書を開く_閉じる(Documents.Open(), Document.Close()) - Qiita](https://qiita.com/int_main_void/items/af46e7fe40f528b0b5cd#%E5%A4%89%E6%9B%B4%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%9B%E3%81%9A%E3%81%AB%E6%96%87%E6%9B%B8%E3%82%92%E9%96%89%E3%81%98%E3%82%8B)

##WdStatistic 列挙

[msdn_ja-jp](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/wdstatistic-enumeration-word)
[msdn_en-us](https://msdn.microsoft.com/en-us/vba/word-vba/articles/wdstatistic-enumeration-word)

###API
- [Document.ComputeStatistics Method (Word)](https://msdn.microsoft.com/en-us/vba/word-vba/articles/document-computestatistics-method-word)

###サンプルコード
- [Python(pywin32)でWordを操作する[8] - 段落単位の文字列取得, 統計(ページ数, 段落数,etc)取得 - Qiita](https://qiita.com/int_main_void/items/7c5bc0aab52d8bfadd6e#%E6%A0%A1%E9%96%B2%E3%82%BF%E3%83%96%E6%96%87%E5%AD%97%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E7%B5%B1%E8%A8%88%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%97%E3%81%AA%E3%81%84)


##WdInformation 列挙

[msdn_ja-jp](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/wdinformation-enumeration-word)
[msdn_en-us](https://msdn.microsoft.com/en-us/vba/word-vba/articles/wdinformation-enumeration-word)

###API
- [Range_Information プロパティ (Word) - msdn](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-information-property-word)

###サンプルコード
- [Python(pywin32)でWordを操作する[10] - Word文書をgrepする(ページ数表示, 行数表示, ワイルドカード展開)](https://qiita.com/int_main_void/items/18fd401a627409be5d49)


##WdViewType 列挙

[msdn_ja-jp](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/wdviewtype-enumeration-word)
[msdn_en-us](https://msdn.microsoft.com/en-us/vba/word-vba/articles/wdviewtype-enumeration-word)

###API
- [View.Type プロパティ (Word) - msdn](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/view-type-property-word)

###サンプルコード
- [Python(pywin32)でWordを操作する[10] - Word文書をgrepする(ページ数表示, 行数表示, ワイルドカード展開)](https://qiita.com/int_main_void/items/18fd401a627409be5d49)
Dockerの概念と使い方

# 概要
Linuxカーネルが持つLXC (Linux Container)という機能（以下コンテナ機能）を使って、あたかも他のプロセスやコンテナから独立したPC上でアプリケーションが動いているかのようにする技術。

**仮想環境と比較したメリット**

* プロセスを管理するようなコストで管理できる
* 余計なオーバーヘッドがない[^余計なオーバーヘッドがない]
* リソースも関係あるものに絞ることができる

## コンテナ機能：LXC (Linux Container)
名前空間の隔離機能
リソースの隔離機能

詳しくは[俺はLinuxコンテナについてなんにも解っていなかった～haconiwaで学ぶLinuxコンテナ(1)～](https://inokara.hateblo.jp/entry/2017/04/30/092304)から色々調べるとちゃんと理解できるかも。

# Dockerの中身
DockerはDocker APIを使って外部からコンテナ機能を実行できるようにする。この状態のシステムをまとめてDockerホストと呼ぶ。DockerホストはDockerイメージをもとにアプリケーションを操作する。

## Dockerイメージ
アプリケーションとその実行環境、展開・操作方法等をまとめて1つのパッケージとして保存、配布される。そのパッケージのこと。
公式のリポジトリ[^公式のリポジトリ]で配布されているものもあれば、自作することもできる。

また、履歴管理を備えている。基本的にイメージ内のファイルシステムは全て書き込み禁止となっており、書き込まれた内容は差分として保存される。このレイヤー内容を「コミット」することで新しいイメージとして保存できる。

## Dockerfile（スクリプト機能）
Dockerイメージに含まれる。イメージに対してどのように展開/操作するかといった指示を記述できる。それによって、既存のイメージに対して追加でインストール等を行った結果を新たな環境として保存することができる。

# Dockerの使い方

## 基本的にこれだけでOKらしい

```sh:koredake.sh
$ docker run imageName
```
これによって、もしローカルにimageName（Dockerイメージ）がなければ自動的にダウンロードされ、実行される。

## その他基本的な操作に必要なコマンド

| 役割 | コマンド |
|:--|:--|
|イメージの入手 | `docker search`<br>`docker pull`|
|イメージの確認 | `docker images`|
|イメージの起動 | `docker run`|
|コンテナの状態確認 | `docker ps`|
|外部と通信させる | `docker port`|
|新しいイメージとして保存 | `docker commit`|
|ディスクイメージ[^ディスクイメージ]の削除 | `docker rm`|
|イメージそのものの削除 | `docker rmi`|

[^ディスクイメージ]: 通常、一度実行したコンテナは終了後もイメージとして残るので、消したい場合は明示的に削除する必要がある。残ることで、次回素早く起動することができる。

他にもいろいろコマンドはあるので、あとは必要に応じて…。

## Dockerfileの書き方
上記したようにスクリプトを使って環境構築作業を常に同じ手順で再現できる。Dockerfileを`build`することでDockerイメージを作成する。

FROMやCMD等INSTRUCTIONについては記事がごちゃごちゃするので別記事で。
[Dockerfileの書き方](https://qiita.com/natacom/items/a93dd7907301a2ef31d3)

# その他関係するもの
<dl><dt>Docker Swarm<dt>
<dd>複数のコンテナを実行するホストを1つのクラスタとして管理する機能。規模が大きい実行環境で使われる。</dd></dl>

<dl><dt>Docker for Windows</dt>
<dd>Windows OS上でもDocker環境を構築できるツール。<br>
<a href="
https://docs.docker.com/docker-for-windows/" title="Docker for Windows">Get started with Docker for Windows</a>
</dd></dl>

# まとめ
思っていたよりも簡単そうなのでとりあえず実際に触ってみようと思います。実際に使ってみて何か追記するかもしれません。

[^余計なオーバーヘッドがない]: 最終的なアプリケーションはOS上の1プロセスとして実行されるため
[^公式のリポジトリ]: https://hub.docker.com/ の中の、"OFFICIAL"に[OK]がついているものが公式イメージ
1行JSONを整形して表示(PythonのJSONモジュール)

整形するために `jq` (https://stedolan.github.io/jq/) を入れていたこともあったが、閲覧するだけのために `jq` をインストールするのはやりすぎ。

Pythonがインストールされていれば簡単に整形ができる。

# 要約
- JSON APIのレスポンスは、1行に圧縮されていており、だいたいの場合人が読みづらい。
- Pythonがインストールされていれば、単純な整形は一瞬でできる
- 方法は、https://docs.python.jp/3/library/json.html#module-json.tool で紹介されている

# 試す
デモのために、 [郵便番号-住所検索API](http://zipaddress.net/) を利用する。もしあなたがAPIを利用するときは、 [利用規約](http://zipaddress.net/#terms) に目を通して欲しい。

453-0809という郵便番号から住所を検索してみる。

```
$ curl -s -X GET 'http://api.zipaddress.net/?zipcode=453-0809&lang=rome'
{"code":200,"data":{"pref":"AICHI","address":"NAGOYA-SHI NAKAMURA-KU KAMIKOMENOCHO","fullAddress":"AICHI NAGOYA-SHI NAKAMURA-KU KAMIKOMENOCHO"}}
```

短いJSONのため、我慢すれば読めないことはない。人が目視確認をするときは、整形されていたほうが好ましい。整形するためにはJSONをパイプで PythonのJSONモジュールに渡す。

```
$ curl -s -X GET 'http://api.zipaddress.net/?zipcode=453-0809&lang=rome' | python -m json.tool
{
    "code": 200,
    "data": {
        "pref": "AICHI",
        "address": "NAGOYA-SHI NAKAMURA-KU KAMIKOMENOCHO",
        "fullAddress": "AICHI NAGOYA-SHI NAKAMURA-KU KAMIKOMENOCHO"
    }
}
```

この方法は、 PythonのJSONモジュールのドキュメントに記述されている。詳しくは　https://docs.python.jp/3/library/json.html#module-json.tool を参照してほしい。
Node.js のバージョンが変わらなくてイラッとしたときの解消法

#事象
```
npm WARN npm npm does not support Node.js v7.6.0
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm Supported releases of Node.js are the latest release of 6, 8, 9, 10, 11.
npm WARN npm You can find the latest version at https://nodejs.org/
```

と注意されるようになったので、
nodeをupdateしようと決意。
どうやら n というのがいいらしい、とグーグル先生が教えてくれたので、

```
npm install -g n
n --latest
sudo n latest

```

とやってみたら、

```
 install : node-v10.5.0
       mkdir : /usr/local/n/versions/node/10.5.0
       fetch : https://nodejs.org/dist/v10.5.0/node-v10.5.0-darwin-x64.tar.gz
############################### 100.0%
   installed : v7.6.0
```

あれ？

```
node --version
v7.6.0
```

なんでだよ！
ってなった
#原因

```
$ which node
/Users/HOGE/.nvm/versions/node/v7.6.0/bin/node
```
どうやらnvmの方のnodeみてるよう設定されてたので、 n でnodeいれても
それが適用されていなかった
そもそもnvmって(Node Version Manager)だから、間違いないのかもだけどｗ
n のほうがなんかわかりやすかったからnvmから離脱したい

#解決法
1 .bash_profileから 「nvm読むぜ」の記載削除
2 .bash_profile更新
3 .nvmフォルダの削除
4 node の場所と、バージョンがあがったこと確認して完了

##1 .bash_profileから 「nvm読むぜ」の記載削除
1 .bash_profileから 「nvm読むぜ」の記載削除
ターミナルにて

```
$ vi ~/.bash_profile
i
```
して

```
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
```
上記削除する

```
escキー
:
wq
```
して編集完了する


##2 .bash_profile更新
.bash_profile の変更を反映

```
source ~/.bash_profile
```
##3 .nvmフォルダの削除
```
$ sudo rm -rf ~/.nvm
```

##4 node の場所と、バージョンがあがったこと確認して完了

```
$ which node
/usr/local/bin/node
$ node --version
v10.4.1
```

ニッコリ。



---
#参考にした記事
※ nodebrewってのも良いらしいです〜  
@kota2_0 さんの記事
[Node.jsの管理をnvmからnodebrewに変更した時のメモ](https://qiita.com/kota2_0/items/ec7dc77955ff0f45f06f)
【Ruby】メソッドの戻り値ってなんだ

#メソッド、引数、戻り値・・・わからなすぎる

>とりあえず、例を見てみよう

```ruby:
#def メソッド名でメソッドを定義
def add(a, b)
#return 値で呼び出し元に値を返す
 return a + b
#↑aとbを足した値が戻り値として呼び出し元に返る。あとはendで閉じる
end

#メソッドの呼び出し部分がそのまま戻り値に置き換わる
#変数sumに呼び出し部分add(1,3)を代入する
sum = add(1,3)
#表示してみよう
puts sum
```
>・・・わかった？
実行結果

```ruby:
4
```


>if文で使う条件式をreturnすることで、その結果として得られる真偽値（true, false)を返すことができる。
真偽値を返すメソッドにはメソッド名の末尾に「?」をつける習慣がある

まあいったん見てみよう。

```ruby
#def メソッド名でメソッドを定義
def negative?(number)
#return 値(number<0)で真偽値(trueかfalse)を返す
 return number<0
#endで閉じる。
end
#メソッドで定義したnumberに5を当てはめて真偽判定しよう
#確認だがあくまでも返ってくるのは真偽値(trueかfalse)だ
puts negative?(5)
```

>実行結果は？

```ruby:
false
```



#演習
>引数priceを受け取るメソッドshipping_free?を定義し、そのメソッドの中でprice >= 5000を戻り値として返す。
if文の条件式でshipping_free?メソッドを呼び出し、その際引数を3000とする。
真偽値がtrueの場合は"5000円以上のお買い上げなので送料はいただきません",
真偽値がfalseの場合は"追加で送料をいただきます"
と出力してみよう。

解説はなし！やってみよう。

```ruby:
def shipping_free?(price)
 return price >= 5000
end

if shipping_free?(3000)
 puts "5000円以上のお買い上げなので送料はいただきません"
else
 puts "追加で送料をいただきます"
end
プライマリコンストラクタとinitブロック[Kotlin備忘録]

Android開発でKotlinを書いていて「どうやって書くんだっけ」と思って調べたことの備忘録です。
Kotlinをちゃんと勉強しようと思ったのでリファレンスを読んで気になったことや、書いていて忘れていたところを中心に残していきたい。

#プライマリコンストラクタ
Javaとは違い、Kotlinにはプライマリコンストラクタというものがあり、

```java:java
public class Customer{
    private String name = "";

    public Customer(String name){
        this.name = name;
    }
     ....
}
```
これを

```kotlin:kotlin
class Customer(name: String){
    ....
}
```
こんな感じで書けます。(直書きしたので記述ミスとかあるかも)

#初期化処理で色々やりたい
上記からわかるように、プライマリコンストラクタだけではコードを含めることができず、初期化処理がし足りない場合があります。諸々の初期化処理も行いたい場合はどうすれば良いのか。
結論から言うとinitを使えば大丈夫です。

```kotlin:kotlin
class Customer(name: String){
    init {
    // ここで初期化処理
    }
}
```

こんな感じでプライマリコンストラクタに書けない初期化処理をinitブロック内で行えます。

ちなみにプライマリコンストラクタではvalやvarの宣言やデフォルト値の設定などできることは意外とあり、プライマリコンストラクタを使用しないこともできます。

#参考

クラスと継承 - Kotlin Programming Language
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/classes.html

Classes and Inheritance - Kotlin Programming Language
https://kotlinlang.org/docs/reference/classes.html
rustとscalaとkotilnの勉強 数当てゲーム(kotlin)

TRPLの数当てゲームをkotlinで

```kotlin
import java.util.Random
import java.util.Scanner

fun main(args:Array<String>){
	val secret_number = Random().nextInt(99) + 0
	println("秘密の数字は次の通り：${secret_number}")
	println("数をあててごらん")
	println("ほら予想を入力してね")

	loop@while(true){
		println("in")
		val s = Scanner(System.`in`)
		val guess = s.nextLine()
		if (guess != null){
			println("次のように予想しました${guess}")
			try{
				val n_guess = Integer.parseInt(guess)
				when {
					n_guess == secret_number -> {
						println("正解")
						break@loop
					}
					n_guess > secret_number -> println("おおきすぎる")
					n_guess < secret_number -> println("ちいさすぎる")
				}
			}catch(e:Exception){
				println(e.toString())
			}
		}
	}
}
```

実はgradlew runで実行すると動かない。
ScannerのnextLineあたりでおかしくなる。もともとはreadLineだったんだけどそっちもだめ.
gradleとおさずに直接実行するとうまくうごく。
なんなんだろ。

kotlinはふつうにtry catch
maybeとかoptionとかeitherとかはなし
正直この程度しか書いてないとちょっと文法が変わったJavaという感想。
第15話 ラマヌジャン・スコーレムの定理

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第15話です。

```math
\arg⁡max_{n} [2^n-7=m^2 ]=15\\
```
ラマヌジャン・スコーレムの定理(ラマヌジャン・ナーゲルの定理)で、
$2^n-7=m^2$を満たすnの最大の値は15である、という式です。
予想したのはラマヌジャンです。またお前か。

最初にこの問題を証明したのはナーゲルです。
しかし、スコーレムの方が遅く解決したにもかかわらず、
そちらが先に広まったので、表記が揺れているようです。

この式を満たすnは3,4,5,7,15だけになります。具体的に以下の式になります。

```math
2^3-7=1^2\\
2^4-7=3^2\\
2^5-7=5^2\\
2^7-7=15^2\\
2^{15}-7=181^2\\
```

これも、第9話で出てきた、ディオファントス方程式の一つです。
5個しかない、というのは若干不思議かもしれません。

解くには円環体というものを使います。
式を変形して次の形にします。

```math
m^2+7=4 \frac{m-\sqrt{7}i}{2}\frac{m+\sqrt{7}i}{2}=2^n\\
\frac{m-\sqrt{7}i}{2}\frac{m+\sqrt{7}i}{2}=2^{n-2}
```

整数の問題なのにルートや虚数が出てきていますが、実は理由があります。

実は足し算は常に扱いづらく、掛け算のほうが扱いやすいです。
例えば、a+b=100とab=100のとき、abは自然数でa<bだとしたら、
足し算は候補が49個ありますが、掛け算はa=1,2,4,5しかありません。

式が掛け算の組み合わせになっていると、分解して考えられますし、
式を成り立たせるための条件をつけられます。
先程の例だと、aもbも100の約数という条件が付けられます。

足し算より掛け算の方が扱いやすいので、
平方根や虚数を使ってでも掛け算の組み合わせにしてしまうわけです。
最終的にはこれらの値は整数になるわけですから、
個々の因数には、「こうなってないといけない」という束縛条件を求められます。

具体的な条件とは次になります。

```math
(\frac{m+\sqrt{7}}{2})^x の\sqrt{7}の係数が\frac12
```

これを満たすx=1,2,3,5,13です。
n-2=xですからn=3,4,5,7,15となります。

途中がすっ飛ばされているので、なんで？って感じになりますが、
そこはかなり難しいのでお察しください。

この円環体、実はある問題を抱えていますが、それはまたかなり先の話でやります。
Node.jsでsqlite3のserializeを使うときの注意点

# sqlite3のserialize

sqlite3の処理は通常callbackを使って完了したことを待つことができます。

```js
db.run("INSERT INTO foo ...", (err) => {
  // 完了！
});
```

`async/await`を使っていい感じに書くと、こうでしょう。

```js
async function run(sql) {
  return new Promise((resolve, reject) => {
    db.run(sql, (err) => {
      if (err) reject();
      else resolve();
    });
  });
}

await run("INSERT INTO foo ...");
```

しかし、serializeを使うと、何も考えずに同期的に書ける方法があります。便利！

```js
db.serialize(() => {
  db.run("...");
  db.run("...");
  db.run("...");
});
```

# 注意点

残念ながら、同期的に書くことができるのはserialize内のコードだけで、それ以外は非同期で実行されてしまいます。
つまり、以下のようなコードは、非同期で同時に実行される可能性があります。
おそらく、いっこめのINSERTが終わったあたりでSELECT文が実行されてしまうでしょう。

```js
db.serialize(() => {
  db.run("INSERT INTO FOO ...");
  db.run("INSERT INTO FOO ...");
  db.run("INSERT INTO FOO ...");
});
db.all("SELECT * FROM foo");
```

## 対策
serializeをいい感じに`async/await`でラップしましょう。
最後の処理で、resolveしてあげます。

```js
async function serialize() {
  new Promise(resolve => {
    db.serialize(() => {
      db.run("INSERT INTO FOO...");
      db.run("INSERT INTO FOO...");
      db.run("INSERT INTO FOO...");
      db.run("INSERT INTO FOO...", () => resolve());
    });
  });
}
```

以上です。よろしくお願いいたします。
【Ruby】ファイル読み込みメソッドまとめ

#概要
Rubyではデータ読み込みの際に使用するメソッドによって、`ファイル末尾に到達した時の振る舞い`や`空ファイルを開いた時の振る舞い`が異なります。
各メソッドの動きとEOF・空ファイルに対する振る舞いの違いについてまとめました。

#IOクラスのファイルを読み込むメソッド・振る舞い一覧


|メソッド名|処理|EOF・空ファイルに対する振る舞い  |
|---|---|---|
|read|IOから内容を読み込む。引数で読み込みの長さの指定が可能。|空ファイルの場合は「""」が返る。引数で読み込みの長さが指定されている場合はnilが返る。|
|readlines|ファイルを全て読み込んで、行ごとに要素に分けた配列にして返す。|空ファイルの場合は空配列（[]）が返る。|
|each/foreach|指定されたファイルを開き、各行ごとにブロックに渡す。|与えられたブロックが実行されない。 |
|each_byte|与えられたブロックに１バイトずつ整数として渡す。| EOFであれば何もしない。 |
|gets|IOオブジェクトから１行だけ読み込む。|nilを返す。 |
|readline|IOオブジェクトから１行だけ読み込む。|EOFErrorエラーが発生する。|
|getc|IOオブジェクトから１文字読み込む。|nilを返す。 |
|readchar|IOオブジェクトから１文字読み込む。|EOFErrorエラーが発生する。 |
|getbyte  |IOオブジェクトから1バイト読み込んで整数として返す。|nilを返す。 |
|readbyte  |IOオブジェクトから1バイト読み込んで整数として返す。 |EOFErrorエラーが発生する。|
pillowモジュールにおいてURLから直接画像を読み込む

pillowモジュールのImage.openの引数にはファイル名を渡す使い方が一般的だが、ファイルオブジェクトを渡しても開くことができる。

https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.open

```python
img = Image.open('localfile.jpg')
```

# リモートのファイルを読み込む方法
ローカルのファイルではなく、リモートのファイルを直接読み込みたい場合、2つの方法がある。

- リモートのファイルをローカルにダウンロードして読み込む
- リモートのファイルを直接読み込む

前者は無駄にストレージを使用するため、保存する必要がないときには使いたくない。
リモートへのアクセスが一時的に保証されているなら、後者のほうがローカルストレージを圧迫しないため、手軽。メモリ上に展開されるだけなので、明示的に消さなくても良い。

# URLから直接画像を読み込む
requestモジュールと、ioモジュールを使えば簡単にできる。

## コア部分
ioモジュール: https://docs.python.jp/3/library/io.html#io.BytesIO
requestsモジュール: http://docs.python-requests.org/en/master/user/quickstart/#binary-response-content

```python

io.BytesIO(requests.get(a_url).content)
```

## コード
```python
import matplotlib.pyplot as plt
from PIL import Image
import requests
import io

a_url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa,_by_Leonardo_da_Vinci,_from_C2RMF_retouched.jpg/687px-Mona_Lisa,_by_Leonardo_da_Vinci,_from_C2RMF_retouched.jpg'
b_url = 'https://pixabay.com/static/uploads/photo/2012/11/28/08/56/mona-lisa-67506_960_720.jpg'

# core
a_img = Image.open(io.BytesIO(requests.get(a_url).content))
b_img = Image.open(io.BytesIO(requests.get(b_url).content))

# images scale up
plt.figure(figsize=(20,20))

# display images horizontally
plt.subplot(121)
plt.imshow(a_img)
plt.subplot(122)
plt.imshow(b_img)
```

https://gist.github.com/tamanobi/ed2536a086cfedd64baa54796ac9bf33