OmniAICreator/Qiita-1.07M huggingface dataset:
Ext2Fsd で ext4 パーティションをマウントできないとき

## はじめに

Windowsからext4形式のパーティーションがマウントできるExt2Fsdですが、いくつか気をつけないといけないことがあります。

## 環境
私が使った環境です。
Windows 10 Home
Ubuntu 18.04 ( > 16.10)

## 手順
SourceForge のサイトから Ext2Fsd(現時点でバージョン0.69) をダウンロードして、Windowsにインストールします。
サイト：https://sourceforge.net/projects/ext2fsd/files/Ext2fsd/

インストールが終わり、再起動をします。
が、まだこの時点でExt2Fsdがext4を正しく認識してくれず、マウントできない可能性があります。
エクスプローラーから開いても、「フォーマットしますか？」と聞かれてしまいます。

マウントできる場合は、下のようにext4とただしく認識されています。
<img width="535" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/171762/92907fb5-acc9-c165-043b-631e47b3b0ab.png">
マウントできる場合は、作業は以上で終了です。

## 対処
正常にマウントできないのは、Ext2Fsdが、ext4のmetadata_csum,64bitオプションに対応していないためです。
ちなみにそれぞれのオプションの意味は、

- metadata_csum : チェックサムを保存してディスクの信頼性を高める (詳しくは[こちら](https://ext4.wiki.kernel.org/index.php/Ext4_Metadata_Checksums))
- 64bit : サイズを16TB以上にできるようにする

です。この２つのオプションを無効にすれば、Ext2Fsdでマウントできるようになります。（バージョンが16.10以上のUbuntuではどちらもデフォルトで有効です。）

まずは、マウントしたいデバイス名を調べます。


```console
# fdisk -l
```

Linux側でマウントされている場合は、アンマウントしてください。ルートにマウントされているときは、USBブートやCDブートなどを使いましょう。

まずは、パーティーションのチェックを行います。

```console
# e2fsck /dev/sdXX
```

次のコマンドで、64bitオプションを無効にします。

```console
# resize2fs -s /dev/sdXX
```

metadata_csumオプションも無効にします。

```console
# tune2fs -O ^metadata_csum /dev/sdXX
```

これで、Windowsに戻ってExt2Fsdを立ち上げると正常にext4が認識されて、マウントできるようになっていると思います。


## 注意点
こういう人はあまりいないとは思いますが、**Ext2Fsdのバージョン 0.68以下 を使ってはいけません**。対応していないオプションにもかかわらず、パーティーションを読み込んでしまうため、**ファイルシステムが壊れます**。
（実際にやりました（笑）。幸い、e2fsckを走らせたらなおりました。）


## 関連リンク
http://www.ext2fsd.com/?p=236
http://ktkr3d.github.io/2017/04/18/Be-Careful-using-Ext2Fsd/
LinuxやMacで お名前.com ダイナミックDNS の IPアドレスを更新する

# はじめに
お名前.com ではダイナミックDNSのサービスを提供してくれていますが、IPアドレスの更新にはWindows専用のクライアントアプリを使う方法しか提供されていません。
クライアントアプリがIPアドレスを更新するプロトコルを調べたところ、簡単なテキストベースのやりとりをしているだけだったので、MacやLinuxでも簡単に更新できることが分かりました。
この記事では、MacやLinuxに標準でインストールされているOpenSSLコマンドを使用してIPアドレスを更新する方法を記載します。

**公式に認められた方法ではないので、試す場合は自己責任でお願いいたします。**

# OpenSSLコマンドで更新
テキストベースのプロトコルですが、通信自体はSSLを使用しているので、TelnetのSSL版**openssl s_client**コマンドを使います。

## 手順
ターミナルで以下のコマンドを入力し、お名前.comのサーバーに接続します。

```shell
openssl s_client -connect ddnsclient.onamae.com:65010 -quiet
```

接続されると以下のテキストが表示されます。

```console
000 COMMAND SUCCESSFUL
.
```

続けて以下のテキストをターミナルに入力します。
入力が遅いとサーバーから切断されてしまうので、予めテキストを用意してペーストしてください。

```console
LOGIN
USERID:ここにお名前.comのお名前ID
PASSWORD:ここにお名前.comのパスワード
.
MODIP
HOSTNAME:ここに更新対象のホスト名
DOMNAME:ここに更新対象のドメイン名
IPV4:ここに更新するIPアドレス
.
LOGOUT
.

```

以下のテキストが表示されたら成功です。

```console
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
```

## 実際に実行してみた結果

```shell-session
$ openssl s_client -connect ddnsclient.onamae.com:65010 -quiet
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Domain Validation CA - SHA256 - G2
verify error:num=20:unable to get local issuer certificate
verify return:0
000 COMMAND SUCCESSFUL
.
LOGIN
USERID:xxxxxxxx
PASSWORD:xxxxxxxx
.
MODIP
HOSTNAME:xxxxx
DOMNAME:xxxxx.xx
IPV4:xxx.xxx.xxx.xxx
.
LOGOUT
.

000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
```

正規表現を使った文字列処理


# 文字列の判定
RegexクラスのIsMatchメソッドを使う。

# 文字列の検索
## 最初の部分文字列を見つける
RegexクラスのMatchメソッドを使う。

## 一致する文字列をすべて見つける
RegexクラスのMatchesメソッドを使う。

# 文字列の置換と分割
## 置換
RegexクラスのReplaceメソッドを使う。

## 分割
RegexクラスのSplitメソッドを使う。

# グループ化
"()"でグループ化する。インデックスは、1スタート。
Groupsプロパティで文字列を取り出すことができる。

# 最長一致の原則

# 例
* 半角英数字　[0-9a-zA-Z]
* 平成(\d+)年
* 数値　^[-+]?(\d+)(\.\d+)?$
* 携帯の電話番号　^0[789]0-\d{4}-\d{4}$
*
Swift:App Storeへのアプリのバージョンアップ申請方法

#はじめに
初歩的だとは思いますが、App Storeへのアプリのバージョンアップをする際にいつも躓いてしまうため、備忘録を含め残したいと思います。


##①iTunes Connect を登録する

①「App情報」を選択
②「バージョンまたはプラットフォーム」を選択
③「ios」を選択

<img width="678" alt="スクリーンショット 2018-06-23 11.14.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/941c5b44-f305-99be-e6df-b6e1377dbef7.png">

##②バージョンを登録する

バージョンの番号を記述します。


##③Xcodeでバージョンを登録する

①【②バージョンを登録する】でしたバージョンを指定します。

<img width="1293" alt="スクリーンショット 2018-06-23 12.28.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/689923c2-3968-582f-cfed-cedf942022b4.png">


##④XcordでArchiveを行う。
①「App名」から「Generic iOS Device」を選択します

<img width="339" alt="スクリーンショット 2018-06-23 11.28.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/bbfc80a6-8fdd-7206-6dad-142127a87b2d.png">

②「Product」を選択し「Archive」を実行します。

<img width="349" alt="スクリーンショット 2018-06-23 11.27.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/aaa3eec5-9210-7c3d-77d7-668694cf5264.png">

##⑤Upload App Storeを選択

<img width="937" alt="スクリーンショット 2018-06-23 12.53.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/33b96ed3-926a-388f-4bc1-8313b5a3a58f.png">


##⑥Nextを選択
確認してNextを選択
<img width="741" alt="スクリーンショット 2018-06-23 12.55.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/df5895e7-a367-c48c-81eb-2b3bb50b746e.png">


##⑦Nextを選択
確認してNextを選択
<img width="727" alt="スクリーンショット 2018-06-23 12.55.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/ebea9dad-e733-8467-5e53-2f7a3ce2da43.png">


##⑧Uploadを選択
<img width="722" alt="スクリーンショット 2018-06-23 13.02.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/f6f94eac-fb20-f23c-557d-a2e926f72b18.png">

##⑨問題なければ下記が表示されます。
<img width="730" alt="スクリーンショット 2018-06-23 12.02.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/e2b766b0-7659-bf64-4281-fc7fd360ecde.png">


##⑩ビルドを選択する
アップロードをしてから、10分程度で、Appl Store Connectのビルドのに【＋】が表示されます。

<img width="1292" alt="スクリーンショット 2018-06-23 12.24.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/63a67530-2a8e-11c1-b5ac-77a2add16669.png">

あとは最初の申請通り、一番右上の審査へ提出ボタンを押下します。

以上となります。

上記手順を忘れた頃にアップロードしたい実装がよくあるため今回まとめさせて頂きました。

ご参考になれば幸いです。
【PhpStorm】ctpファイルを認識させる

設定の時いつも忘れちゃうのでメモ。

初期設定だとCTPファイルは真っ白。
<img width="793" alt="beforeCTP.png" src="https://qiita-image-store.s3.amazonaws.com/0/68268/43678227-a3a0-6ccc-6f35-92efb0868f9a.png">

1. PhpStorm → Preferences → File Types
2. Recognized File TypesでPHPを選択する
3. プラスボタンをクリックして、「*.ctp」を追加する
<img width="1436" alt="settings.png" src="https://qiita-image-store.s3.amazonaws.com/0/68268/cd6dd5a8-438b-c0be-b198-020263b06be3.png">


シンタックスハイライトされて見やすくなりました(^o^)
<img width="991" alt="afterCTP.png" src="https://qiita-image-store.s3.amazonaws.com/0/68268/7ada2bd0-a2eb-a895-b445-ecd854570796.png">
[Materialize]カレンダーをローカライズする

## Materialize(1.0.0-rc.1)でカレンダーをローカライズする

最近はWebから離れていたので、htmlやjsやcssの進化の速さには驚くばかりです。
Materialize(cssフレームワーク)を触る機会があって、カレンダーの日本語化に少々はまったのでメモ。

公式のマニュアルにもあるのですが、サンプルが無いと少々わかりにくいですかね。

[公式ドキュメント Picker](https://materializecss.com/pickers.html)

```HTML:html
<input type="text" class="datepicker">
```

```JavaScript:js
(document).ready(function(){
    $('.datepicker').datepicker({
        i18n:{
            months:["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
            //...公式ドキュメントの[Datepicker Internationalization options]の項目を指定できます。
        },
        format: "yyyy-MM-dd"
    });
});
```

オプションのi18nがオブジェクト型なので、入れ子にすればいいです。
NefryBT(ESP32)でTelloを制御。1回だけ離陸して着陸する


奥多摩から記事を書いています。

https://www.facebook.com/sugawara.ryousuke/posts/1972987319402926

## Tello

DJIとIntelのトイドローン。
最近流行ってたので触ってみました。

## 出来たもの

NefryBTからTelloに命令を送って離陸させて着陸させます。

![](https://i.gyazo.com/b8f0bfdf5ab1344616a63db489b6710a.jpg)

https://www.instagram.com/p/BkVZdOll-cx/?igshid=16m74ps5wigj2&utm_source=fb_www_attr

## コード

そんなに依存コードが無くてシンプル。

TelloとNefryBTはWiFiで接続してUDPでコマンドを送ってる感じです。

```tello.ino
#include <WiFiUDP.h>

const char* TELLO_IP = "192.168.10.1";
const int PORT = 8889;

WiFiUDP Udp;
char packetBuffer[255];
String message = "";

void setup() {
  Serial.begin(115200);

  Serial.println("start");
  Udp.begin(PORT);
  
  sendMessage("command");
  message = listenMessage();
  Serial.println(":command");
  Serial.println(message);
  delay(1000);

  //離陸
  sendMessage("takeoff");
  Serial.println(":takeoff");
  message = listenMessage();
  Serial.println(message);
  delay(5000);

  //着陸
  sendMessage("land");
  Serial.println(":land");
  message = listenMessage();
  Serial.println(message);
}

void loop() {}

//Telloからのレスポンスを確認する関数
String listenMessage() {
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = 0;
    }
    Serial.println("Contents:");
    Serial.println(packetBuffer);
  }
  // this only works as tello's API doesn't return responses greater than 255 char
  return (char*) packetBuffer;
}

//UDPでTelloに命令を送る関数
void sendMessage(char* ReplyBuffer) {
  Udp.beginPacket(TELLO_IP, PORT);
  Udp.printf(ReplyBuffer);
  Udp.endPacket();
}
```

## 参考

この辺のコードが参考になりました。
* https://github.com/Tzyinc/arduinoTello/blob/master/telloflyer.ino
* https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiUDPClient/WiFiUDPClient.ino

## 所感

TelloってParrotのローリングスパイダーなどと同じ挙動をするけど関係ないのかな?
ElixirプログラマーのためのErlangワンポイント文法

# はじめに

ElixirプログラマーがOTPの機能を使うとき、Erlangのドキュメントを見る必要が出てきますよね。コードサンプルなどが載って読む必要が出てくるのですが、Erlangの文法は独特です。慣れたらそれなりに読めるようになるのですが、Elixirに戻って再度見ると面食らう・・・ということを何度もやっているので、早見表的なものを作ってみました。 



# 基本 Elixirとの比較

これだけ押さえておけば、だいたい読めます。
一番の難関(?)は、**変数が大文字で始まり、アトムが小文字で始まるルール**です。
ドキュメントの例文などを読む際、Elixirの感覚で変数だと思っていたものが、「変だな？」と思ったら、それはアトムだったということが多々あります。

|種別 |解説|Erlang例|Elixir例|
| --- | --- | --- | --- |
|変数　  | **大文字**から始まる | MyVal | my_val |
|アトム　| **小文字**から始まる。**記号含む**| ets | :ets |
|マクロ　| 使用時は`?`から始まる |下記参照 | ← |
|コメント |`%%` | `%%` | `#` |
|関数呼び出し |モジュール名:ファンクション名()  |math:pi()|:math.pi()|
|メッセージパッシング | Pid ! Message | `pid ! "hello"` | send( pid, "hello")|


# 関数のパターンマッチング
`;`でつないで、最後`.`

# ガード式
 when以降

| 記号 | 役割 |  
| --- | --- |
|`,`(カンマ)つなぎ  | 論理積 |
|`;`(セミコロン)つなぎ| 論理和|
|`=:=`| 左辺と右辺が同じ値ならtrue |

# 組み込みマクロ

| 機能     |  Erlang  |  Elixir  |
| ---- | ---- | ---- |
|  モジュール    |  ?MODULE  |  `__MODULE__`  |
|  ファイル名  |  ?FILE  |  `__FILE__` |
|  行  |  ?LINE  |  `__LINE__`  |

# レコード 構造体

| Erlang(record)   |  Elixir(struct)   |
| --- | --- |
|#item{name="apple"}  |  %Struct_name{item=>"apple"} |

例

```erlang
-record(product, {id,name,price}).  %% productという名の構造体を定義
  Apple = #item{id=431,name=apple,price=200}.

> #item{name= Name,price= Price} = Apple.  %% ･･･要素を変数に束縛 / 順序に注目
#item{id = 431,name = apple,price = 200}

> Name.
apple

> is_record(Apple, item).  %%・・レコード判定
true
```

# おわりに
---
Erlangも読めるようになって、Elixirのパワーをより引き出しましょう。
PyQtインストールしたけど使い方がわからなかった話

「PythonでGUIアプリを作ろう！」と意気込んでPyQt5をインストールしたものの、どう使っていいかわからない。

「PyQt5 使い方」と調べても、いきなりコードが出てきて「ん？　コード入力するの？　それって画期的じゃなくね？」と迷宮入り。

いろいろ考えた結果、ようやく使い方がわかりました。

# GUIを使わず、直接コードを書く
ここを参考に、直接コードを入れます。
[Python Turorials -PyQT5-](https://pythonspot.com/en/pyqt5/)

以下はGUIを試した話です。

# Qt Designer
「Qt Designer 使い方」でググればいろいろでてきます。
Qt Designerは、PyQtの心臓部。
これさえあれば、画面にボタンやアイコンをドラック&ドロップして簡単にGUIアプリが作れるのです。やったぁ。

ググったところ、↓のサイトがわかりやすかったです。
[Qt Designerを使ってみよう](https://densan-labs.net/tech/qt/chapter5.html)

# Pythonエディタ
しかしQt Designerだけでは、ボタンを押したときの動作などのイベントが書けません。そこでPythonエディタの登場です。

Qt Designerで作った画面を、コマンドでpythonファイルにします。
それをPythonエディタで読み込んでから、イベントを追加入力します。

PythonエディタにはPyQtのインストールが必要です。

# 大規模アプリには向かない
しかし、「Qt Designer」には欠点もあります。大規模なアプリの設計が難しいです。

Qt Designerから生成したコードは見づらいです。特にlayoutの入れ子構造が多すぎます。
また、作り直す際には、Qt Designerで直した後、コマンドでpythonファイルにしなければならず、手間がかかります。
Swooleによる非同期リクエストとGuzzleによる非同期リクエストのベンチマーク

# Swoole との出会い
PHPカンファレンス福岡の前夜祭、及び afterhack にて、[@uzulla](https://twitter.com/uzulla) さんが、
[最近メールフォームかいてないメールフォーマーによる、ちょっとだけ変わった一応PHPのメールフォーム(?)のお話](https://speakerdeck.com/uzulla/zui-jin-meruhuomukaitenaimeruhuomaniyoru-tiyotutodakebian-watuta-ying-phpfalsemeruhuomu-falseohua-fu-ti-zui-jin-swoolegatafalsesiidesu)
という発表をされていました。
その中で、PHPのSwooleエクステンションのことについてお話されていました。

その話を聞いて興味を持ったので、今回ベンチマークを取ってみることにしました。  

Swoole とは？ という説明は上記の発表資料に書いてあるので割愛させていただきます。
上記資料には、
- 主にリクエストを処理するphp-fpmの代用としてSwoole
- タイマー
- シングルトン
- coroutine による非同期リクエスト

など盛り沢山ですが、
今回の話は、 coroutine による非同期リクエストだけ使いたい場合の話、
つまり、PHPで書いてあるコードの一部だけ非同期でリクエストを投げたい時の話です。

自分がパッと思いつくのは、
資料にも書かれているようにDNSを引く場合とか、SESにリクエスト投げつける場合とかです。
今までだと、Guzzle で実装していました。

# 環境
Docker on Mac 上に、 centos:latestイメージから立ち上げたコンテナで実験を行いました。
Swoole を使うときは、Mac上で直接ではなく、仮想環境上で行ったほうが良いらしいです。
Mac上よりもLinux上の方が処理が10倍速いとも、100倍速いとも。。。  

ということで、

```bash
docker pull centos:latest
docker run --rm -it centos:latest /bin/bash
yum update -y && yum groupinstall "Development Tools" -y && yum install git wget curl vim -y
# https://webbibouroku.com/Blog/Article/centos-php7
yum install epel-release -y && rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install --enablerepo=remi,remi-php72 php php-swoole -y
```
を行えば環境構築は完了です。
あとは、

```bash
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer require guzzlehttp/guzzle
```
を行うと、guzzle も使えるようになります。


# 実装
Guzzle を使った場合、Swoole を使った場合、普通に file_get_contentsを使った場合の3種類のコードを書いていきます。

## Guzzle
[参考にした記事](https://qiita.com/qiita-kurara/items/6e2eaae63b5f22ede7f4)

```php
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;

$client = new Client();
$promises = [];
for ($i = 0; $i < 10; $i++) {
    $promises[] = $client->requestAsync('GET', 'https://hogehogehogehoge.hoge/');
}
$responses = \GuzzleHttp\Promise\all($promises)->wait();
```

## Swoole

```php
<?php
for ($i=0; $i<10; $i++) {
  go(function() {
    $http = new \Swoole\Coroutine\Http\Client('hogehogehogehoge.hoge', 80);
    $ret = $http->get('/');
  });
}
```

## file_get_contents
```php
<?php
for($i=0; $i<10; $i++) {
  file_get_contents('https://hogehogehogehoge.hoge/');
}

```

と、3種類のコードを書きました。

# ベンチマーク結果
ベンチマークは、

```bash
time php hoge.php
```

を5回ずつ実行し、実行速度の平均値をベンチマーク結果としています。

結果は、


|  |Guzzle |Swoole |file_get_contents |(参考) Guzzle 直列 |
| --- | --- | --- | --- | --- |
|real |0m0.597s |0m0.114s |0m3.410s |0m0.906s |
|user |0m0.112s |0m0.024s |0m0.154s |0m0.064s |
|sys  |0m0.102s |0m0.006s |0m0.024s |0m0.066s |


となりました。
今回の結果だけでいくと、 Swoole が Guzzle の5倍ほど早いことになります。
また、Guzzle のコードは、Promise\all()->wait();
など、独特のコードを書く必要がありますが、
Swoole のコードは、割と直感的に書くことができます。


ということで、Swoole の有効性の片鱗が見えてきたので、
次は、CPU使用量やメモリ使用量などについても調べてみようと思います。  
(今回は、サーバー立てるのめんどくさかった。)  
もし問題なかったら、実戦投入も視野に入れていこうと思います。


# 余談
今回使ったSwooleのバージョンは、Swoole4 です。
Swoole の新機能に関しては、カジュアルに壊れてるらしい(@uzulla さん談)ので、
最新版のSwoole を使うときには注意が必要だそうです。

# 使ってみた感想
速い！
しかも、直感的に書けるので、割と重宝しそうです。
通常、APIのリクエスト数には上限があったりするので、
そのへんをどのように書けるかは少し調査が必要です。  
あと、今回のメインテーマではないのですが、  
Guzzle 直列と file_get_contents の間の実行時間の差が気になります。  
機会があったら調べてみたいです。  (CPU使用量とかのほうが先。)
DateTime::SetTimeZoneの挙動が変わった？

ほんの少しだけハマった。

PHPで日付を計算するには、DateTimeクラスを使うのが便利です。

そして、UTCで書かれた日付データを日本時間に直す場合などは、SetTimeZoneメソッドを使います。


そこで、SetTimeZoneメソッドですが、公式のヘルプには次のように書かれています。

```php
<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
```

http://jp2.php.net/manual/en/datetime.settimezone.php より引用

ただ、どうもこれだとうまく動きません。setTimeZoneメソッドを使ってもタイムゾーンが変わらないのです。

いろいろ唸ってみた結果、どうも、setTimeZoneの結果が、戻り値にしか反映されていないっぽい


```php
<?php
$date = new DateTime('2000-01-01');
echo $date->setTimezone(new DateTimeZone('Asia/Tokyo'))->format('Y-m-d H:i:sP') . "\n";
?>
```

PHP 7.2.1のバグなのか、新しい仕様なのかは不明です。
rustとscalaとkotilnの勉強 数当てゲーム(rust)

続き
rustから
数当てゲームをつくる

TRPLを写経なので特に問題は起きない

```zsh
cargo new guessing_game
```

```rust
use std::io;
fn main() {
    println!("数をあててごらん");
	println!("ほら、予想を入力してね");
	let mut guess = String::new();
	io::stdin().read_line(&mut guess)
		.expect("行の読み込みに失敗しました");
	println!("次のように予想しました:{}",guess);
}
```

rustでは基本的に例外というかエラーは戻り値で返ってくる。
Result<T,E>でOkかErr
Errでスコンと落としたいときはunwrapで落とすときに文字列を渡せるのがexpect

rustは高階型がないらしいのでモナドやファンクタを型で表現できないらしけど、Resultにはmapやらmap_errやらand_thenがあってそれっぽく使える。

とりま標準入力から読み込んで3超ならOkでそれ以外はErrを返すとするとこんなの

```rust
use std::io;
fn main(){

	let mut s = String::new();
	io::stdin().read_line(&mut s).map_err(|err| err.to_string())
		.and_then(|_| s.trim().parse::<i32>().map_err(|err| err.to_string()))
		.and_then(|e| if e > 3 { Ok(e) } else { Err(e.to_string()) } ).unwrap();

}
```

地味にはまったのが「trimしないとparseでこける」
ラムダ式は|prm| -> retType { xxxxx }
||はrubyっぽい？？
結構||ってタイプしにくい。慣れの問題だろうか。

read_lineは成功失敗は戻り値で戻るけど、読み込んだ文字列は引き数で渡したsに入ってくるので1回目のand_thenではクロージャの引数は_で指定。
引数使わないときはこれでいいっぽい。でも文法ちゃんと調べてない。コンパイラの警告が消えたからたぶんこれでいいんだろう。

標準ライブラリにランダムがないのでcrates.ioから落とす。
TRPLだとバージョンが0.3.14なんだけど
https://crates.io
で見たら0.5.2なのでそっちで。
https://crates.io
で探してもいいけどcargo search xxxで探してもいい。

```rust
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main(){
	let secret_number = rand::thread_rng().gen_range(1,101);
	println!("秘密の数字は次の通り:{}",secret_number);
	println!("数をあててごらん");

	println!("ほら、予想を入力してね");
	loop{
		let mut guess = String::new();
		io::stdin().read_line(&mut guess)
			.expect("行の読み込みに失敗しました");
		println!("次のように予想しました:{}",guess);
		let guess = match guess.trim().parse::<u32>(){
				Ok(n) => n,
				Err(_) => continue
		};
		match guess.cmp(&secret_number){
			Ordering::Less => println!("ちいさすぎる"),
			Ordering::Greater => println!("おおきすぎる"),
			Ordering::Equal =>{
				println!("せいかい");
				break;
			}
		}
	}
}
```

とりあえず動いたけど問題が。
dockerのコンテナ内で動かしているんだけど、一度コンテナを抜けるとcargo runする度にrandやらlibcやらをダウンロードしちゃう。

どうもCargo.tomlのdependenciesに書いたクレートを
/usr/local/cargo/registry/cache/xxxx/・・・にキャッシュしてるらしく、コンテナを破棄すると（docker runの時に-rmを指定してるからなんだけど）cacheが消えてrunしなおした時にやりなおし・・・になってるっぽい。
cacheのパスを変える方法ないのかな・・・。

scalaのsbtでも似たようなことは起きて、それは.zshrcに

```zsh
export SBT_OPTS="$SBT_OPTS -Dsbt.ivy.home=/home/xxx/study/scala/.ivy2"
```

としてマウントしているホストのディレクトリにキャッシュするようにして逃げてる。

毎回毎回ダウンロードされると辛いのでなんとかしたい。

（追記）
.zshrc で CARGO_HOMEを設定したらいけた。

```zsh
export CARGO_HOME=/home/xxx/study/rust/.cargo
```

よかったー
みんなこれを使っていたのか！？Qiitaや記事サイトで見るイラストの正体

よく記事サイトで見る以下のイラスト。
みんなどこからとってきているんだろうと思っていたが[【いらすとや】](https://www.irasutoya.com/
)を使っていたのか。ようやく正体がわかったので、そのメモ書き。

![computer_businessman4_laugh.png](https://qiita-image-store.s3.amazonaws.com/0/230829/aa580e20-face-6f0b-fd5e-e02d9343c034.png)

さっそくQiitaのアイコンに使ってみた。
今後Qiitaの投稿や資料作成に活用できれば。

▼　利用上の注意！
https://www.irasutoya.com/p/terms.html
vagrant upでエラー（vagrant package実行中が原因）

vagrant up でエラーが出た事例を備忘録的に付けます。

vagrant packageを実行中に違うボックスを立ち上げようと
vagrant upコマンドを実行。

以下のエラーが出ました。

```error.shell

PS C:\Users\example\example\centos7.2> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["modifyvm", "0e69433c-5048-4ed3-86e2-f90ee18d0e2a", "--natpf1", "ssh,tcp,127.0.0.1,2222,,22"]

Stderr: VBoxManage.exe: error: A NAT rule of this name already exists
VBoxManage.exe: error: Details: code E_INVALIDARG (0x80070057), component NATEngineWrap, interface INATEngine, callee IUnknown
VBoxManage.exe: error: Context: "AddRedirect(Bstr(strName).raw(), proto, Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(), RTStrToUInt16(strGuestPort))" at line 1820 of file VBoxManageModifyVM.cpp

```

vagrant packageが終わった段階で
vagrant upしたら難なく成功した。

焦ってごねごねしなくてよかったという記録です。
Makefile (GNU make) > MAKECMDGOALS > Make will set the special variable MAKECMDGOALS to the list of goals you specified on the command line. 

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

下記はADDAのMakefileからの抜粋。

```txt:Makefile
ifneq ($(if $(MAKECMDGOALS),$(if $(filter $(NONTRIVIAL),$(MAKECMDGOALS)),1,),1),)
```

`MAKECMDGOALS`とは何か。

http://murakan.cocolog-nifty.com/blog/make/index.html @ 日々此精進 by murakanさん
情報感謝です。

https://www.gnu.org/software/make/manual/html_node/Goals.html
> Make will set the special variable MAKECMDGOALS to the list of goals you specified on the command line.
Paperspaceというお手軽GPU環境の紹介

# Paperspace
皆さんは機械学習やマイニング等でGPU環境が必要となった時に、どうしているでしょうか。
自分でGPUを買うという人もいれば、AWSやGCPなどのクラウドサービスを使うという方も多いのではないでしょうか。
これらのクラウドサービスは、素晴らしいですが、インフラの知識がないアプリケーションエンジニアなどにはとっつきにくいものとなっているのも事実です。
そこで登場したのが、Y Combinator出身の[Paperspace](https://www.paperspace.com/)です。
Paperspaceは導入が容易というのが一つの売りのようで、実際に使ってみましたが、確かに簡単に仮想マシンを立てて、機械学習のトレーニングまで出来ました。

# 導入
導入については[こちら](https://www.fusenstage.com/archives/201612070211272246.html)の記事を参照ください。

# 使用感
実際に使ってみてですが、導入はかなり簡単でした。機械学習用のパッケージもすでにインストールしてあるテンプレートが用意してあって、環境構築の手間もないです。
そしてベータ版となっていますが、デスクトップも使えるので、私はjupyter notebookをデスクトップで開いて実行してます。
価格はこのようになっています。
<img width="1130" alt="スクリーンショット 2018-06-23 10.47.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/259118/0322e5e2-c1c8-b68f-024c-9f919d23f629.png">
従量課金制だと一番安いので、0.40\$/hourですね。これにプラスして、月額課金のストレージ代を払います。100GBで6\$/Month、250GBで7\$/Month、500GBで10\$/Monthといった感じです。私は結構使って、月1.5万くらいでした。

また、データセンターが置いてあるリージョンが３つしかなく、日本から遠いため、デスクトップ環境では若干操作にタイムラグが生じます。
<img width="1143" alt="スクリーンショット 2018-06-23 11.05.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/259118/aadaf2b6-d50d-41d4-a172-96f47c3662a0.png">

# まとめ
機械学習やってみたいけど、AWSとかGCPのインフラ周り良くわかんないや、という人はぜひPaperspaceを検討してみてはいかがでしょうか。
【VCSA6.0】vCenterのDNS・デフォルトゲートウェイを変更する

#DNS・デフォルトゲートウェイ変更手順

本変更手順は、vCenter Server Appliance 6.0(VCSA6.0)を使用した条件下でvCenterのDNSやデフォルトゲートウェイを変更します。
※今回はVMware Hands on labで実際にやってみた手順を紹介します。

####**環境**
- vCenter Server Appliance 6.0.0.30300

**※注意事項※**
VCSAのバージョンが「6.0.0.0」の場合、管理インターフェイスの使用はサポートされていないため、自分が使用しているVCSAのバージョンが「6.0.0.1」以降であることを確認する必要がある。

####**手順**
① ブラウザから[ https://vCenterホスト名:5480/ ]にアクセスし、管理インターフェースであるAppliance Managementにrootユーザでログインする。
![pic1](http://drive.google.com/uc?export=view&id=1hd0qwky1PbzSAv0uy3QgQeZrL1KRY-Zk)

②左ペインの「Networking」を選択し、「Manage」タブをクリックする。
![pic2](http://drive.google.com/uc?export=view&id=1E3q02mEPLWEpw_rq5Wk3FSokScMGpiVf)

③編集ボタンをクリックし、DNSまたはデフォルトゲートウェイを入力する。
![pic3](http://drive.google.com/uc?export=view&id=1EYSYmKvlSouwbFfgul3wZcK4HspSchYV)

④設定内容が反映されていることを確認できたら設定完了。
MastodonのLet'sEncrypt期限切れ更新メモ

友人との交流用の、GCPで運用しているMastodonのSSL(letsencrypt)の期限が切れおり、アクセスできなくなっていた。
その更新方法のメモ(ドメインはexample.comにしています。)

Let's Encryptから「期限切れそうだよー」メールが来たら、以下の手順を実施
1.GCPにログイン
2.rootで入る

```
sudo su -
```

3.SSLの有効期限を確認するため、以下コマンドを実施

```
DOMAIN=example.com
openssl s_client -connect ${DOMAIN}:443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not "
```
ログが流れて行ってしまったので、切れているときの結果が無い…

4.有効期限切れ間近なことを確認し、以下コマンドを実施

```
systemctl stop nginx
letsencrypt certonly --standalone -d example.com
```
結果、成功なら以下メッセージが出る(はず)

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2018-09-21. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```
2018-09-21は有効期限で、今日(2018/06/23)更新したので90日後のこの日付になっている


5.4.で止めたnginxを再起動する

```
systemctl start nginx
```
6.3.で実行したコマンドを再度実行して確認

```
DOMAIN=example.com
openssl s_client -connect ${DOMAIN}:443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not "
```
実行結果が以下のように出力

```
            Not Before: Jun 23 00:33:41 2018 GMT
            Not After : Sep 21 00:33:41 2018 GMT
```
AfterがSep 21(90日後)に変更されているのでOK

以上が自分用の備忘メモ
自動更新するように設定すればいいとは思うんだけど、Linux触らないと忘れるの＆90日に1回だからいいかなと。

Let's Encryptのメールが広告かなーと思って完全スルーしていて、アクセスできなくなってたのは内緒
Makefile (GNU make) > ifeq ($(.FEATURES),) > Special Variablesの一つ: .FEATURES

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).


下記はADDAのMakefileからの抜粋。

```txt:Makefile
ifeq ($(.FEATURES),)
  $(error GNU make version 3.81 or higher is required)
endif
```


https://www.gnu.org/software/make/manual/html_node/Special-Variables.html

.FEATURESというのはSpecial Variablesの一つのようだ。

上記の実装では、.FEATURESが空の時にGNU makeのバージョンが3.8未満と分かるようだ。
バージョン管理システム 言い換え集


このVCSでいう〇〇は、あのVCSでいうところの何なんだ? をまとめたい  
とりあえず使ったことあるやつから

|↓やること/VCS種類→|Git|SVN|ClearCase|Perforce|
|:--|:--|:--|:--|:--|
|リポジトリのファイル構成を自分のローカルに構成する|`clone`|`checkout`|Create View (Snapshot)|ワークスペースを作成|
|自分のローカルでの変更をリポジトリのファイルに反映|`add` → `commit` → `push`|`commit`|(Checkout →) Checkin|チェックアウト→サブミット (→コピーアップ)|
|リポジトリの更新状態を自分のローカルに反映|`pull`|`update`|Refresh → Update from Repository|(マージダウン→) 最新のリビジョンを取得|
|ある時点におけるリポジトリの状態に名前をつけ、復元を容易にする|Tag|Tag|Label|?|
初学者なので戦略的リソース学習法というので意識を高めていきたい

就活中の新卒学生でプログラミング初学者です！
ITエンジニアの募集でやっぱり結構QiitaやGitHubのアカウントを求められるな・・・と実感してアカウントを作りました！
今まで一方的に参考にしてたので、自分もこうしたコミュニティに貢献できるようになれば嬉しいです。
（三日坊主になりませんように・・・）

パレオな男('https://yuchrszk.blogspot.com/')
というブログを愛読してるのですが、記事の戦略的リソース利用法というのが面白かったので、プログラミング学習でも使えれば・・・と考えています。

スタンフォード大学の実験で、何でも1週間で成績が4.65%アップもアップしたり、テストのストレスも激減したのだとか。
（ https://yuchrszk.blogspot.com/2017/06/blog-post_2.html )
＞ 具体的にはテストをひかえた学生に協力をお願いして、1週間前に以下のような指示をしたんだそうな。
＞
＞・勉強前に「テストでどれぐらいの成績が欲しいか？」を紙に書く
＞・その成績が自分にとってどれだけ重要かを100点満点で採点する
＞・その成績を取るのにどれぐらいの自信があるかを100点満点で採点する
＞・テストにどんな問題が出そうかを紙に書き出す
＞・勉強に使えそうな資料や参考書を最大15個にまでしぼり込んで紙に書き出す
＞・なぜその資料や参考書が使えると思ったかを紙に書き出す
＞・その資料や参考書をどのように使うつもりかを紙に書き出す
＞
＞事前に「そもそも何のためにテストをするの？」ってとこをハッキリさせたうえで、
＞さらに使えるリソースを明確にしたわけですね。研究チームは、この手法を「戦略的リソース利用法」と呼んでおります。かっこいいっすな。

PaizaというサービスでランクBを取ってから、AtCoderのビギナーの過去問をダラダラ解いてるだけだったので
こういう形式で目標とか手法を決めた方が、モチベも確かに上がりそうな予感・・・？
いっそこの戦略的リソース学習法を、Webサービスとかアプリで作っても面白いかも？

Strategic Resource Use for Learning: A Self-Administered Intervention That Guides Self-Reflection on Effective Resource Use Enhances Academic Performance
http://journals.sagepub.com/doi/abs/10.1177/0956797617696456?journalCode=pssa
Salesforce 送信変更セットのコンポーネント選択を使いやすくする

# 概要

　送信変更セットでアップロードするコンポーネントを選択するのが、とてつもなくめんどくさい・・・
　1画面に表示される項目数が25なので、項目が多いとページングが発生し、選択しては画面が戻り、また選択するというフラストレーションが溜まる作業をしなければならない
　個人的にSalesforceの中で1、2を争うUXの悪い機能だと思います


# 解決方法

## Chromeの拡張機能を導入

玄人の方でしたらすでに導入済みかもしれないですが、[Boostr for Salesforce](https://chrome.google.com/webstore/detail/boostr-for-salesforce/kegohbhdgaoaoanbpconbeleanhdodlo)を導入することで、項目の検索機能とページングなしでコンポーネントを表示することができる操作性が飛躍的に向上します

残念ながら項目名のソートはないので、githubのコードをフォークして自分で実装するのもいいかもしれない


## ページング数を増やす

拡張機能の導入ができない（もしくはしたくない）場合は、「変更セットに追加」画面のURLパラメータに `&rowsperpage=400`を追加することで表示数を増やすことができます
これだけでも飛躍的に操作性が向上します！

※400は各自で調整してください


上記以外にも方法がありましたら、ご教示いただけると幸いです！
MacにKafkaをhomebrewを使ってインストールする

# 概要

MacにKafkaをhomebrewインストールする手順

インストールされるKafkaのversionは、現時点で1.1.0になっています。

# 手順

## インストール

```
$ brew install kafka
```

## zookeeper起動

kafkaを入れるとzookeeperも入っている(はず)

```
brew services start zookeeper
```

## kafka起動

```
brew services start kafka
```
## 確認

kafka-topicsがPATHに設定されている

```
$ which kafka-topics
/usr/local/bin/kafka-topics
$ ls -l /usr/local/bin/kafka-topics
lrwxr-xr-x  1 gosshys  admin  38  6 23 09:04 /usr/local/bin/kafka-topics -> ../Cellar/kafka/1.1.0/bin/kafka-topics
```

トピックのリストを見る

```
kafka-topics --list --zookeeper localhost:2181
```

トピックを作る


@shallowell さんに教えてもらった最近の方法

「--zookeeper は今はDeprecatedなので、以下のコマンドが良さそうです」

```
kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
```

※3年前のコマンド（ご参考）

```
$ kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".
$ kafka-topics --describe --zookeeper localhost:2181 --topic test
Topic:test	PartitionCount:1	ReplicationFactor:1	Configs:
	Topic: test	Partition: 0	Leader: 0	Replicas: 0	Isr: 0
```
tmuxで新規セッションを立ち上げる

最近tmuxを使い始めました。
複数に散らばっていたターミナルが一つの画面に収まるようになり、散らかり放題だった画面がスッキリしました。

# 任意の名前のセッションを立ち上げる
初歩の初歩ですが、任意の名前のセッションを立ち上げるコマンドをメモ。

``` bash
tmux new -s <任意の名前>
もしくは
tmux new-session -s <任意の名前>
```

ちなみに、-sオプションを-tオプションに変えて、

``` bash
tmux new -t <任意の名前>
```

のように書くと、名前の後ろにセッション番号が付いてしまいます。。。
馬鹿の一つ覚え: Matplotlib

#### Matplotlibの基本的な使い方1
```python
import numpy
import matplotlib
# matplotlib.use('PDF') # PDFに保存する場合
import matplotlib.pyplot
# %matplotlib inline    # Jupyter Notebook

x = numpy.arange(-4.0, 4.0, 0.1)
sinh = (numpy.exp(x) - numpy.exp((-1) * x)) / 2.0    # 双曲線正弦関数
cosh = (numpy.exp(x) + numpy.exp((-1) * x)) / 2.0    # 双曲線余弦関数

matplotlib.pyplot.plot(x, sinh, label= 'sinh(x)')
matplotlib.pyplot.plot(x, cosh, linestyle = '--', label = 'cosh(x)')
matplotlib.pyplot.title('y = sinh(x) and y = cosh(x)')
matplotlib.pyplot.xlabel('x')
matplotlib.pyplot.ylabel('y')
matplotlib.pyplot.legend()
matplotlib.pyplot.show()    # 表示
# matplotlib.pyplot.savefig('sinhcosh.pdf') # PDFに保存
```

#### Matplotlibの基本的な使い方2
```python
import numpy
import matplotlib.pyplot
# %matplotlib inline

number_of_volunteers = [ 9, 10,  8, 12, 11, 10,  7,  6,  5,  5, \
                         8,  7,  7,  9,  8,  4,  8,  5,  6, 12, \
                         6,  6,  8, 10, 11,  6,  8, 11,  7,  7, \
                         6, 11,  7,  8, 10,  7,  5,  5,  6,     ]

n_volunteers = numpy.array(number_of_volunteers)

x = numpy.arange(0, len(number_of_volunteers), 1)

matplotlib.pyplot.xlim(0.1, 42)    # 横軸の0を表示させないために
matplotlib.pyplot.ylim(0, 15)
matplotlib.pyplot.xlabel('Horticulture work')
matplotlib.pyplot.ylabel('Number of volunteers') 
matplotlib.pyplot.plot((x + 1), n_volunteers, color = "green", linewidth = 2)
matplotlib.pyplot.savefig('participants.pdf')
```

#### x軸のラベルを回転させて表示
```python
matplotlib.pyplot.xticks(rotation = 60)    # 反時計回りに60度回転
```

#### 下側がはみ出してしまう場合の対応
```python
matplotlib.pyplot.savefig('figure.pdf', bbox_inches = 'tight')
```
Go言語でのファイル読み取り

#Go言語でのファイル読み取り

##環境
go version go1.9.4 
Zorin OS 12.3

##概要
Go言語を使ったファイルの読み取りプログラムについてまとめる

### ファイル読み取り処理
まず読み取るファイルを作成します。内容は何でもOK。

```text:test.txt
これはファイル読み取り処理用に作られたファイルです
テスト用
```

読み取りプログラムを記述。
ファイル読み取りに必要なものは２つ。
byte型スライスとosパッケージ。

```go:test_read.go
package main

import(
	"fmt"
	"os"
)

func main(){
	fmt.Println("ファイル読み取り処理を開始します")
	// ファイルをOpenする
	f, err := os.Open("test.txt")
	// 読み取り時の例外処理
	if err != nil{
		fmt.Println("error")
	}
	// 関数が終了した際に確実に閉じるようにする
	defer f.Close()

	// バイト型スライスの作成
	buf := make([]byte, 1024)
	for {
		// nはバイト数を示す
		n, err := f.Read(buf)
		// バイト数が0になることは、読み取り終了を示す
		if n == 0{
			break
		}
		if err != nil{
			break
		}
		// バイト型スライスを文字列型に変換してファイルの内容を出力
		fmt.Println(string(buf[:n]))
	}
}

```

```terminal:出力
ファイル読み取り処理を開始します
これはファイル読み取り処理用に作られたファイルです
テスト用
```
### ファイル読み取り処理2
io/ioutilパッケージを使うと、読み取り部分がスッキリする。

```go:test_read2.go
package main

import(
	"fmt"
	"os"
	"io/ioutil"
)

func main(){
	fmt.Println("ファイル読み取り処理を開始します")
	// ファイルをOpenする
	f, err := os.Open("test.txt")
	if err != nil{
		fmt.Println("error")
	}
	defer f.Close()

	// 一気に全部読み取り
	b, err := ioutil.ReadAll(f)
	// 出力
	fmt.Println(string(b))
}
```

```terminal:出力
ファイル読み取り処理を開始します
これはファイル読み取り処理用に作られたファイルです
テスト用
```
出力結果も同じなので問題ない。
WebツールのプラットホームとしてChromeを使いたいからCORSを無効にして起動する


# Chromeの起動オプションに--disable-web-securityを指定する

user-data-dirも合わせて指定し、設定ディレクトリも別にします。
例えば、Windows用にバッチファイルを作ると以下のようになります。

```bat
start chrome ./tools.html --disable-web-security --user-data-dir="./"
```

# おわりに

APIを実行してみたいとき、例えば、curlを使ったりすると思います。
しかし、プログラマブルになにかしたいとき、Windowsだとcurlが標準で使えないし、Powershellもネットワーク処理がイマイチ…。

というわけで、選択肢の一つとしてブラウザを使ってちょっとしたGUIツールを作ったのですが、CORSに阻まれました。

というのが経緯です。

jQueryなどを使用すればOSにも依存しないし、HTML＋Javascriptというのも使いやすくて良いと思います。
Amazon ECRにDockerイメージをPushする

## 概要

Amazon ECRにDockerイメージをPushするときのメモ。
手順をよく忘れるので。

## 手順

- Amazon ECR に Dockerリポジトリを作成
- IAMユーザにアクセス権限を付与
- リポジトリにイメージをPush

## Amazon ECR に Dockerリポジトリを作成

マネージメントコンソールからリポジトリを作成できる。

- マネージメントコンソールからAmazon ECSのコンソールを開く
- メニューのAmazon ECR->リポジトリを選択
- 適当なリポジトリ名を入力し作成

## IAMユーザにアクセス権限を付与

ECRのコンソールからIAMユーザにリポジトリへのアクセス権限を付与できる。

- 「アクセス許可」タブを開く
- IAMユーザ・ロールが表示されるので、付与したいユーザを選択
- 「すべてのアクション」を選択し、設定を保存

## リポジトリにイメージをPush

以下のコマンドを実行していく

```
$ aws ecr get-login --no-include-email --region ap-northeast-1
docker login -u AWS -p eyJwYXlsb2FkIjoibHFReTVqexxxxxxxxxxx https://081239xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
```

認証コマンドが表示される
認証コマンドを実行

```
$ docker login -u AWS -p eyJwYXlsb2FkIjoibHFReTVqexxxxxxxxxxx https://081239xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
```

イメージをビルド

```
$ docker build -t your_project_name .
```

イメージにタグをつける

```
$ docker tag your_project_name:latest 081239xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/your_project_name:latest
```

イメージをPush

```
$ docker push 081239xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/your_project_name:latest
```
GPSの研究　その27

#概要

GPSを理解したかった。
u-centerのKMLをcesiumで表示してみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/2109b412-be19-6467-d82a-472c791c5cf9.png)


#サンプルコード


```
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.15, 37.92, 3000.0),
});
viewer.dataSources.add(Cesium.KmlDataSource.load('http://jsrun.it/assets/Q/u/g/x/QugxD'));


```

#成果物

http://jsdo.it/ohisama1/obw2


以上。
たとえばSSL関連のエラーが出た場合は --verbose する習慣をつけよう

エンジニアの実力は習慣で決まる。

# `--verbose` しない場合

エラー番号しか分からず苦しむことになる。

```
[root@c7e7efa6aee5 /]# curl https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh
curl: (35) SSL connect error
```

# `--verbose` した場合

詳細が表示され手がかりが掴める。

```
[root@c7e7efa6aee5 /]# curl --verbose https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh
* About to connect() to toolbelt.treasuredata.com port 443 (#0)
*   Trying 151.101.89.177... connected
* Connected to toolbelt.treasuredata.com (151.101.89.177) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS error -12190
* Error in TLS handshake, trying SSLv3...
> GET /sh/install-ubuntu-xenial-td-agent2.sh HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: toolbelt.treasuredata.com
> Accept: */*
>
* Connection died, retrying a fresh connect
* Closing connection #0
* Issue another request to this URL: 'https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh'
* About to connect() to toolbelt.treasuredata.com port 443 (#0)
*   Trying 151.101.89.177... connected
* Connected to toolbelt.treasuredata.com (151.101.89.177) port 443 (#0)
* TLS disabled due to previous handshake failure
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS error -12286
* Closing connection #0
* SSL connect error
curl: (35) SSL connect error
````








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
chromelessを日本語対応するよ！


## はじめに

headless chrome を lambda で動かすにあたって日本語化に躓いたので、対応法をば。
chromelessかどうかにかかわらず、lambdaで日本語扱うなら同じような感じで対応可能かも？
フォントの入っている `.fonts` ディレクトリの作成と、HOME環境変数の設定でいけそう。

## 手順
---

### chromelessをインストールする
```
$ git clone https://github.com/graphcool/chromeless.git
$ cd chromeless/serverless
$ npm install
```

###  .fonts ディレクトリを作成してNotoSans入れる
 ```
mkdir .fonts
$ cd .fonts
$ wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
$ unzip NotoSansCJKjp-hinted.zip
$ find . -not -iname "*.otf" -type f -delete
 ```

### serverless.ymlを編集 (Diff)
```serverless.yml
2a3,6
 package:
   include:
     - .fonts/*

57a62
       HOME: /var/task
```

### デプロイ
```
$ npm run deploy
```
※ 要Credentials, IoT Endpointの設定

## 参考
Github Issue
https://github.com/adieuadieu/serverless-chrome/issues/49#issuecomment-377342836）
C++　拡張for文

※C++11以降のお話

C#やPHPではforeachを使った事があったが、C++では使った経験が無く、同じようなものがあったら便利だなと思い調べてみました。
正確にC++では「範囲ベース for ループ」と言うらしいです。

#拡張for文とは？
ノーマルfor文は条件を指定して繰り返しを行います。拡張forは配列、コンテナなどの要素数があるものの全要素に対して処理を行うものです。全要素にアクセスしたい時はノーマルfor文よりスマートにプログラムが書けます。

#使い方

```cpp
//ノーマルfor文
for(/*初期化式*/;/*条件式*/;/*変化式*/){
    //処理
}

//範囲for文
for(/*変数宣言*/ : /*範囲*/){
    //処理
}
```

例）


```cpp
#include <iostream>
int main()
{
    int score[5] = {1, 2, 3, 4, 5};
    for(int s : score)
    {
        std::cout << s << std::endl;
    }

    std::vector<int> count{1, 2, 3, 4, 5};
    for(auto&& x : count) {
        std::cout << c << std::endl;
    }
}
```
変数宣言に`auto&&`を使用すると便利とのこと

#仕様
C++日本語リファレンスによると

>値の型が配列の場合、配列のサイズが分かるものでなければエラーとなる。値の型が配列以外（クラスなど）の場合、begin()とend()で範囲の先頭と終端が表せるものでなければエラーとなる。語弊を恐れず言えば、メンバ関数にbegin()およびend()を持つクラスであれば、何でも範囲for文の範囲として指定できる。

とのことなので、自作クラスにも使用したいときは`begin()`と`end()`のメンバ関数を実装すれば良い！


これを使えば配列の要素を変えてもfor文の条件式を書き換える必要がなくなる！便利！！
vimでメモをしたい！

vimで作業をしていて、メモしたいといった時がちょくちょくあり、探してみたところ「QFixHowm」というものが良さそうなので使い方をメモ。
出典：[QFixHowm](https://sites.google.com/site/fudist/Home/qfixhowm)

# コマンド
### 新規メモの作成 - `g,c`
・新しくメモファイルを作成する。
・一行目の`=`はタイトルを表す
・保存されたファイルはvimrcで設定したディレクトリ内に保存される
・URLなどはカーソルを持ってきて<CR>でそのまま開いたりできる
![Screen Shot 2018-06-22 at 13.43.34.png](https://qiita-image-store.s3.amazonaws.com/0/161122/a1ab96b0-c90c-4b55-307d-7118fde4ec46.png)

### クイックメモの作成 - `g,u`
・ちょっとしたメモの作成に良いらしい
・毎回同じファイルが開かれる
![Screen Shot 2018-06-22 at 13.49.12.png](https://qiita-image-store.s3.amazonaws.com/0/161122/e4e8491c-9c9c-07d7-85a5-5928f7c37e54.png)

### 特定のファイルに紐付いたメモを作成 - `g,j`
・特定のファイルに紐づいてくれるメモを作成できる。これはジーニアス！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161122/9d508884-a74b-d607-5592-35b51796828a.png)

### メモを一覧表示 - `g,m`
・quickfixで更新順でメモを表示してくれる！これはマーベラス！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161122/f450f1a6-85cb-ae27-06b4-041fcf04bc64.png)

### メモを外部grepで検索 - `g,g`
・検索するgrepパターンとファイルの形式まで指定して、メモを検索。こちらもquickfix。これはアベンジャーズ！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161122/7653caf6-97e6-fa8a-c653-ce4096b530eb.png)
Xcodeでの実機転送をワイヤレスで行う方法

## TL;DR
Macにケーブルで繋いでアプリ開発。
今まで何本のLightningケーブルが犠牲になっただろう…。
Xcode 9からはワイヤレスで実機転送できるらしい。
やってみた。

## 環境
- Xcode 9.4.1
- iPhone 7 Plus ( iOS 11 )

## やりかた

1. iPhoneをwifiに繋ぐ（実機転送を行うMacと同じLanを使用する）
- macとiPhoneをいつも通りLightningケーブルでつなぐ
- XcodeからWindow > Devices and Simulatorsを選択
- Devicesタブを選択するとつないでるiPhoneが表示されるので、Connect via networkの項目にチェックを入れる
- ケーブル抜いていつも通り実機転送する
- 実機転送できる！！
- すごい！

## 参考
https://stackoverflow.com/questions/44382841/how-do-you-perform-wireless-debugging-in-xcode-9-with-ios-11
HTML5で回線速度を計測する[speedtest]

#概要
回線速度を計測したいが、サーバーは自前で用意したいと思うことはありませんか？（ないよね）
すぐに見つけられたので、備忘録を残しときます。
https://github.com/adolfintel/speedtest
こいつ。サンプルも豊富でドキュメントもあります。
#インストール
(webサーバーは普通持ってるよね。)
git clone https://github.com/adolfintel/speedtest
cd speedtest 
rm -rf .git
#テスト
ブラウザでサンプルを試す。色々サンプルはあるので、試してみてください（書くの疲れた（））。
http://speedtest.fdossena.com/
![スクリーンショット 2018-06-23 1.35.37.png](https://qiita-image-store.s3.amazonaws.com/0/245977/bbc28be1-6674-0991-447e-2d75311f2d1d.png)


#カスタマイズ
speedtestのjson読み込みしたあと、実際に計測を開始する際に渡すパラメタで設定ができます。

```javascript
w.postMessage('start {"param1": "value1", "param2": "value2", ...}')
```

```javascript:例
w.postMessage('start {"test_order": "I_P"}')//ipを測定(I)して1秒後(_)にPing（P)をとる。
```
参考：実行する計測の種類

> test_order: テスト時にどれを実行するか。:
I: IP取得
D: 下りテスト
U: 上りテスト
P: ping + jitter テスト
_: 1秒の遅延を作る
デフォルト: IP_D_U
＊1度しか実行されません。
*Firefoxでは上りテストは最後にした方が良いかと。

詳細は”Starting the Test”に。https://github.com/adolfintel/speedtest/blob/master/doc.md

ちなみに、pingとjitterだけ見れるようにしたものです。
私のサービス「MiRm(http://mirm.jp  )」のユーザーが確認できるようにしたかったので。
https://www.mirm.jp/speedtest/pingtest.html
#まとめ
こんなに楽にテストができるなら、一家に一台（？）設置してはいかがでしょう。
#参考文献
https://github.com/adolfintel/speedtest/blob/master/doc.md
MacのVisual Studio CodeでQuick Fix


MonoBehaviourではQuick Fixを使って名前空間を入れていたので，
Visual Studio Codeでのやり方がわかりませんでした．
https://qiita.com/MKLemma/items/29578e573d43ad8c55f2


ようやく見つけたのでメモ

![スクリーンショット 2018-06-23 1.20.52.png](https://qiita-image-store.s3.amazonaws.com/0/113504/2d5e8cdc-7f32-2c6d-875e-f85b8678a798.png "スクリーンショット 2018-06-23 1.20.52.png")

Command + . でした．

![スクリーンショット 2018-06-23 1.22.02.png](https://qiita-image-store.s3.amazonaws.com/0/113504/e4448750-56dd-df1c-c6d7-3a7829d51cd9.png "スクリーンショット 2018-06-23 1.22.02.png")


MonoDevelopと同じAlt + Enterに変更して完璧！
JavaScript学習記録２　2018年6月22日分



使用図書
『ここからはじめるJavaScript入門』（井上久夫　2002年1月25日発行）

今日やったこと
第５章：ウインドウの制御について　　

・ウインドウの制御について
10年くらい前にいかがわしいサイトで驚かされたような、そうでないようなウインドウができるのかな。どこか懐かしさを感じつつポチポチ



```json

window.alert("おとといきやがれ");
```

これで出るっぽい。windowのオブジェクトにalert（）内を吐かせる……であってるよね？
動作確認の際にalertをスペルミスしてて焦ったのは内緒だぞ。

オブジェクトには階層があるらしい。documentの上位にWindowだってさ。まあ普通に考えればわかるよー

・コンファームウインドウで分岐
おなじみなif文がここで出てきた！　｛｝でくくってelseはJavaとかCとかと同じなのね。
””でくくる部分の指定を特にミスって5回ほど見直すハメに。でも間違えやすいところわかってきた気がするよ！

```js
if(window.confirm("盛り上がってるゥ〜！？")){
  document.write("<CENTER><H2>2階席のみんなも、見えてるからねー！！</H2></CENTER>");
}else{
  document.write("<CENTER><H2>元気だしていきましょう、エーザイ</H2></CENTER>");
```

これで気分はあいっどるっ！さん！

・プロンプトウインドウで願いを聞く
入力された文字を使って文章を返す。みたいな使い方かな。名前とかそういうので「ようこそ、◉◉さん！」とかそんなん？



```js
──────


var wish;
   wish=window.prompt("キミの願いはなんだい？聞かせておくれよ！");
   document.write("キミの" + wish + "という願いはエントロピーを凌駕した。","さあ、解き放ってごらん。キミの魔法を！")
```

varで変数を指定して、promptで変数に文字列を突っ込んでもらうと。
文字と変数を混ぜて文章にするには””でくくるのと+を使うといいのだな。

![スクリーンショット 2018-06-23 0.35.02.png](https://qiita-image-store.s3.amazonaws.com/0/265808/d39a4ad1-0557-08b5-5533-b641ff39e27d.png)
　　　　　　　　　　　　　↓
![スクリーンショット 2018-06-23 0.35.11.png](https://qiita-image-store.s3.amazonaws.com/0/265808/f008b918-e0e6-1cc5-fc14-6d38a56e8619.png)

もう魔法でもなんでもいいから楽にしてくれ

・ブラウザウィンドウを開いてページを表示させる。
これはアレかな、スマホでページ見てるとスゥーっとスクロールしてきた広告がページを飛ばすあの嫌がらせに使いそうなやつだ。おのれ

ok.htmlは別で作成しておいてopenで飛ばせばいいのだな。イベントハンドラはcliｃｋだけど、これOnMouseOverとかにしたらめちゃくちゃうっざいページできないかな？

今回の分はここまで！なかなかwebページで使いそうなものじゃあないですか。これは目標達成も近いな！

追記
コードの記述方法の提案、ありがとうございます。編集リクエストのとおりに使わせていただきました
sed 出力をカラー表示

こんにちは
sed コマンドの出力をターミナル上でカラー表示させる方法を調べました。下記例で gsed にマッチさせた ```pp``` の部分がカラー表示されます[^1]。sed 利用ですので冗長になりました。方法はここで見つけました：

 - "[Using sed to color the output from a command on solaris](https://unix.stackexchange.com/questions/45924/using-sed-to-color-the-output-from-a-command-on-solaris)" (UNIX & LINUX) 

```console
$ echo -e "11pp22\n33qq" | while read line; do esc=$(printf '\033'); echo $line | gsed -e "s,\([0-9]\+\)\([a-z]\+\)\([0-9]\+\)$,\1${esc}[32m\2${esc}[0m\3,"; done
11pp22
33qq
```

[^1]: この例のコード番号 32 は foreground color の green です（see ANSI escape code#Colors (Wikipedia)）。 ↩

#### egrep

また、egrep コマンドで行頭部でマッチさせた部分を同様にカラー表示することができます（下記例で ```111a``` の部分）。この方法はコメントでいただきました。

```console
$ echo -e "111a222\n333" | GREP_COLOR='01;32' grep -E --color '^|\d+a'
111a222
333
$
```
IBM Call for Codeで自然災害に技術で立ち向かってみよう(参加編)


>自然災害救援に向けて、クラウド、データ、AI、ブロックチェーンを活用するための、「Call for Code」を主導
> https://developer.ibm.com/jp/callforcode/ より引用

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/9721a307-b338-8862-b146-ecf2ae7c3047.png)

# Call for Codeとは
2018/6/18から世界規模でCall for Codeが開催されました。
このイベントは世界規模で行われるインターネット上でのvirtualハッカソンです。

# ハッカソンとは
> ハッカソン（英語: hackathon 、別名:hack day ,hackfest ,codefest ）とはソフトウェア開発分野のプログラマやグラフィックデザイナー、ユーザインタフェース設計者、プロジェクトマネージャらが集中的に作業をするソフトウェア関連プロジェクトのイベントである。
> https://ja.wikipedia.org/wiki/ハッカソン

# 求めるもの
自然災害を救援するための技術を考える。
画像分析で災害に役立てたり、ブロックチェーンで災害にも耐えうる情報プラットフォーム作ったりとかをチャレンジしてみる。

# 参加条件と評価
##参加条件
・1名から最大5名までのチーム
・IBM Cloud上で動くことが条件で(スポンサーなので)、
##評価項目・得点
・完全性と譲渡性
・有効性と効率性
・デザインとユーザビリティ
・創造とイノベーション
をそれぞれ５点、合計２０点の評価点をもとに採点されます。

# 特典
## 期間中
・WorldWideのエンジニア達と繋がれる Call for CodeのSlackワークスペース
　国をまたいだチームを有志で構成したりもできるチャンネルがあるので必見
・IBM Champion限定のCall for Code Watson Workspace
　一般参加不可ですが、WordWideのIBM Championと一緒にCall for Codeについて意見交換することが可能です。
## 入賞すると
賞金がもらえたり、優勝者やアワードを獲得した人はCall for Code Global Prize Eventに招待されるそうです。

# 実際に参加してみた
そもそもハッカソンに参加したことが無い。
プログラムは書くけど周りに公開できるほどのプログラマではない。
（ワタシ、プログラム、チョットデキルなんて口が裂けても言えない）
英語がわからない。(watson translate / google translateは神!)

な私ですが、チャレンジしてみます。

### 第１のハードル：申し込み
１個目のフォームは、Call for Codeの参加申し込みです。

多くのハッカソンの運営を行うangelshackというサイトをベースに申し込みを行います。
フォーム自体はすごく簡単ですが、「Call-for-Code-Participation-Agreement」という規約に同意する必要があります。
これは、スポンサーのこと、チームのこと、米国禁輸国の人は参加できないこと、コンテスト概要、権利関連（著作権・コードや素材を流用する場合の利用権）、評価、などを始めとした項目がA4 7ページにも及んでます。(読んだけど、まとめきる自身がないので、日本語訳出ないかなーって期待）

### 第２のハードル：既にIBM Cloud アカウント持ってた。
２個目のフォームは、IBM Cloudのアカウント申請を行うものが出てきました。

もしかすると、既にアカウントを持っていても流用できるのかもしれないのですが、
IBM Cloudのライトアカウント作成のURLショートコードがWelcomeメールについてきたので、
あれ？新しく作れってこと！？という理解をして、メールアドレス作ってもう一度IBM Cloudアカウントをライトアカウントとして作成しました。

そして、申込みフォーム後、IBM Coder Program(influitive)というサイトのアカウントも自動で作成されました。
※どれもアカウント持ってた。influitiveはさまざまなチャレンジ課題が用意され、クリアしていくとポイントがもらえる（まだポイントの使いみちがはっきりしないけど）サイトです。
既に自分のメールアドレスで様々なチャレンジを進めてたので、様子を見ながら使おうと思います。

##で、この記事で何が言いたかったか

#日本のCallforCode参加者つのる。英語できる人も求む。みんなでハッカソンチャレンジしてみよう

これはIBM Championの中でも出てきた会話ですが、
「僕はコードをかけないけど、Call for Codeに参加できるのか」
→　良いのです。たとえば、チームでUI/UXで参加する、セキュリティとして参加する、アイデア・使用を考える人となってコーディングできる仲間を世界から見つける。コレも方法だと思います！

参加していくに連れて徐々に判明することや、困ったことをまた共有できればと思います。
内容の無い記事となってしまいましたが、最後までお付き合いありがとうございました。
Raspberry Pi3にHDMI接続したら「Mounting FUSE Control File System」で止まった

# 結論
LCDディスプレイモードになっていたので**HDMIモードに切り替える**。

```
cd LCD-show
sudo ./LCD-hdmi
```

LCDディスプレイモードに戻す場合は

```
sudo ./LCD32-show
```

# 余談
・私の環境ではLCD-showは、/home/pi/LCD-showにありました。
・最初、SDカードが壊れたのかと思って検索したら、**やはりOS再インストールしかない**、
　というような記事も出てきたが焦らなくてよかった。
・今回使用したラズパイは知人から借りた物で、最初からLCDディスプレイが付いていた
　ので**ディスプレイを変えるために切り替えコマンドを打たなければならない**ことに
　頭が回らなかった。

# 参考URL
■Raspberry Pi 3に3.2インチLCDを接続する手順
http://l-w-i.net/t/raspbian/lcd_001.txt

■RP3 doesn't load on HDMI - Mounting FUSE Control File System
https://raspberrypi.stackexchange.com/questions/59353/rp3-doesnt-load-on-hdmi-mounting-fuse-control-file-system