OmniAICreator/Qiita-1.07M huggingface dataset:
Firefox OS ビルド手順 (KEON)

# はじめに
**注意: 自サイトに置いていた記事をこちらに移動しただけです。最新情報ではありません。**

このページは Firefox OS の KEON 向けビルド手順について記載しています。

# 必要事項
下記手順にて作業するためには以下の 2 つが必要です。

* KEON
* Ubuntu 13.04 (64bit)

# Firefox OS をビルドする

以下 Ubuntu にて作業します。

## パッケージのインストール
下記コマンドで必要なパッケージをインストールします。

```
$ sudo apt-get install --no-install-recommends autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib gcc-4.6 g++-4.6 g++-4.6-multilib git ia32-libs lib32ncurses5-dev lib32z1-dev zlib1g:amd64 zlib1g-dev:amd64 zlib1g:i386 zlib1g-dev:i386 libgl1-mesa-dev libx11-dev make zip
```

64bit 環境の場合は下記コマンドを入力します。

```
$ sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install ia32-libs
```

adb 及び fastboot を下記コマンドでインストールします（Android SDK 等でインストール済みの場合は不要）

```
$ sudo apt-get install android-tools-adb android-tools-fastboot
```

## ソースコードのダウンロード
下記手順でソースコードをダウンロードします。

```
$ git clone git://github.com/mozilla-b2g/B2G.git
$ cd B2G/
$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"
```

下記コマンドを実行するとダウンロードが始まります。通信環境によっては時間が掛かります。

```
$ BRANCH=master ./config.sh keon
```

ダウンロードが終わったらビルドの設定を行ないます。下記コマンドでコンパイラを設定します。

```
$ vi .userconfig
export CC=gcc-4.6
export CXX=g++-4.6
```

## ビルド
初回ビルド時は KEON からファイルを抜き出すので PC に KEON を挿した状態で実行します。
そのため下記行を追記して udev が KEON を認識できるようにしておきます。

```
$ sudo vi /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="05c6", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
```

設定後 udev または PC を再起動します。下記コマンドを入力して以下のように表示されれば OK です。

```
$ adb devices
List of devices attached 
full_keon	device
```

下記コマンドでビルドします。 -j の後の数字は CPU の個数を記載します。
参考までに Core i7 3770 では 20 分掛かりました。

```
$ ./build.sh -j8
```

下記コマンドで書き込みを行ないます。

```
$ ./flash.sh
$ ./flash.sh gaia
```

# 日本語入力を使う
## 日本語辞書をインストールする
[このサイト](http://sourceforge.jp/projects/ipadic/downloads/24435/ipadic-2.7.0.tar.gz/)から ipadic-2.7.0.tar.gz をダウンロードし、下記コマンドで辞書を生成します。

```
$ cd B2G/gaia/keyboard/imes/jskanji/dict
$ mkdir ipadic
$ tar xzf ipadic-2.7.0.tar.gz
$ cp *.dic B2G/gaia/keyboard/imes/jskanji/dict/ipadic/
$ cd B2G/gaia/keyboard/imes/jskanji/dict
$ make
```

## 日本語キーボードをインストールする
下記コマンドで日本語キーボードをインストールします。

```
$ cd gaia/
$ GAIA_KEYBOARD_LAYOUTS=en,jp-kanji make reset-gaia
```

## 日本語キーボードを有効にする
KEON を起動して下記手順で日本語キーボードを有効にします。
Settings -> Keyboards -> Selected keyboards -> Add more keyboards -> Japanese - Kanji にチェック。
UnityでのiPhoneX対応

**iPhoneXは縦長なのでそのまま実行すると横が切れてしまう**

http://application.hateblo.jp/entry/2018/02/02/074019
この記事を参考に
![スクリーンショット 2018-05-23 15.55.44.png](https://qiita-image-store.s3.amazonaws.com/0/259356/86908aba-4885-173b-eea0-8c2c98cb45f6.png)
Canvas ScalerのScreen Match ModeのMatch Width Or HeightをWidthの方（0）にする。
これで横幅に合わせられる。





しかし、少し縦に伸びている感じがしたので、
https://qiita.com/tkyaji/items/8cdc0a4324d4e89633e8
こちらをimportさせていただきました。
CentOS6でchef-clientが動かなくなった

### 問題

CentOS6にChefClientをインストールすると

```
/opt/chef/embedded/bin/ruby: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/chef/embedded/lib/libruby.so.2.3)
/opt/chef/embedded/bin/ruby: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by /opt/chef/embedded/lib/libruby.so.2.3)
```

と出て動かない。
※CentOS6のGLIBCが古くてダメなようだ

### 解決案

1. CentOS6はあきらめる
1. EC2で良ければ、CentOSに近しいAmazon Linux使う
1. もし他のCentOS6でchef-clientが動いている環境があれば
    1. 動いているところと同じバージョンのchef-clientをrpm install
    1. 動いているところの
/opt/chef/embedded
を丸ごとコピーでインストールされてしまったものを置き換え
1. その他何かあったら教えてください

私は諸事情でやむを得ず3番目で回避しています
Iterator Pattern

# Iterator Pattern
- is very commonly used design pattern in Java
- This pattern is used to get a way to access the elements of a collection object in sequential manner without any need to know its underlying representation(基本的な表現方法を知らなくても連続した方法でコレクションオブジェクトの要素にアクセスする方法を取得するのに使われる)
- collection class has a inner class(iterator class). that class can7t be used by other class.


# Reference
- [tutorialspoint:Iterator Pattern](https://www.tutorialspoint.com/design_pattern/iterator_pattern.htm)
- [journaldev:Iterator Pattern](https://www.journaldev.com/1716/iterator-design-pattern-java)
- [geeksforgeeks:Iterator Pattern](https://www.geeksforgeeks.org/iterator-pattern/)
- [iluwatar:Iterator Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/iterator)
Firefox OS ビルド手順 (APC Paper)

# はじめに
**注意: 自サイトに置いていた記事をこちらに移動しただけです。最新情報ではありません。**

このページは Firefox OS の APC Paper 向けビルド手順について記載しています。

# 必要事項
下記手順にて作業するためには以下の 3 つが必要です。

* APC Paper
* microSD
* Ubuntu 14.04 (64bit)

# Firefox OS をビルドする
以下 Ubuntu にて作業します。

## パッケージのインストール
下記コマンドで必要なパッケージをインストールします。

```
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install --no-install-recommends autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib \
gcc-4.6 g++-4.6 g++-4.6-multilib git lib32ncurses5-dev lib32z1-dev zlib1g:amd64 zlib1g-dev:amd64 zlib1g:i386 \
zlib1g-dev:i386 libgl1-mesa-dev libx11-dev make zip libxml2-utils
```

コンパイラの設定をします。

```
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 1
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 2
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 1
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 2
$ sudo update-alternatives --set gcc "/usr/bin/gcc-4.6"
$ sudo update-alternatives --set g++ "/usr/bin/g++-4.6"
```

adb 及び fastboot を下記コマンドでインストールします（Android SDK 等でインストール済みの場合は不要）

```
$ sudo apt-get install android-tools-adb android-tools-fastboot
```

## ソースコードのダウンロード
下記手順でソースコードをダウンロードします。以下、 Firefox OS のルートを FIREFOXOS_ROOT とします。

```
$ cd ${FIREFOXOS_ROOT}
$ git clone git@github.com:apc-io/apc_b2g_b2g.git B2G
$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"
$ cd B2G
$ git checkout apc8950-master
```

下記コマンドを実行するとダウンロードが始まります。通信環境によっては時間が掛かります。

```
$ ./config.sh wmid
```

ダウンロードが終わったらビルドの設定を行ないます。起動時に初期設定ウィザードが表示されないようにします。

```
$ vi .userconfig
export NOFTU=1
```

## ビルド
下記コマンドでビルドします。 -j の後の数字は CPU の個数を記載します。
参考までに Core i7 3770 では 20 分掛かりました。

```
$ ./build.sh -j8
```

## フォームウェアダウンロード
下記コマンドでファームウェアをダウンロードします。

```
$ cd ${FIREFOXOS_ROOT}
$ git clone git@github.com:apc-io/apc_8950_firmware_update.git
$ cd apc_8950_firmware_update
$ git checkout B2G
```

## 書き込み
microSD に書き込みます。以下、 microSD のルートを SDCARD_ROOT とします。

```
$ cd ${FIREFOXOS_ROOT}
$ cp -r apc_8950_firmware_update/* ${SDCARD_ROOT}
$ cd B2G
$ cp out/target/product/wmid/boot.img ${SDCARD_ROOT}/bspinst/
$ cp out/target/product/wmid/recovery.img ${SDCARD_ROOT}/bspinst/
$ rm -f ${SDCARD_ROOT}/bspinst/packages/*
$ cp out/target/product/wmid/rootfs.b2g_*.tgz ${SDCARD_ROOT}/bspinst/packages/
$ sync
```

できあがった microSD を APC Paper に挿して起動します。
Golang: PostgreSQL のデータを作成 (Create)

## プログラム

```golang:postgre_create.go
// ----------------------------------------------------------------
//
//	postgre_create.go
//
//					Mar/03/2023
//
// ----------------------------------------------------------------
package main

import (
	"fmt"
	"database/sql"
	_ "github.com/lib/pq"
	"strconv"
)

// ----------------------------------------------------------------
func main() {
	fmt.Println ("*** 開始 ***")

	dict_aa := data_prepare_proc ()

	str_connect := "user=scott dbname=city password=tiger123 sslmode=disable"
	db, err := sql.Open("postgres", str_connect)
	defer db.Close ()

	_, err = db.Exec ("drop table cities")
	if err != nil {
		fmt.Println (err)
		}

	sql_str := "create table cities (id varchar(10),name varchar(20),population int,date_mod date)"
	fmt.Println (sql_str)

	_, err = db.Exec (sql_str)
	if err != nil {
		fmt.Println (err)
		}

	for key,_ := range dict_aa {
		name := dict_aa[key]["name"].(string)
		population := dict_aa[key]["population"].(int)
		date_mod := dict_aa[key]["date_mod"].(string)
		sql_str :="insert into cities values ('" + key + "','" + name + "','" + strconv.Itoa(population) + "','" + date_mod + "')"
		fmt.Println (sql_str)
		_, err = db.Exec (sql_str)
		if err != nil {
			fmt.Println (err)
			}
		}

	fmt.Println ("*** 終了 ***")
}


// ----------------------------------------------------------------
func data_prepare_proc () map[string](map[string]interface{}) {
	dict_aa := make (map[string](map[string]interface{}))

	dict_aa["t3461"] = unit_gen_proc ("広島",97452,"1921-11-12")
	dict_aa["t3462"] = unit_gen_proc ("福山",49271,"1921-8-25")
	dict_aa["t3463"] = unit_gen_proc ("東広島",63597,"1921-4-14")
	dict_aa["t3464"] = unit_gen_proc ("呉",95178,"1921-2-20")
	dict_aa["t3465"] = unit_gen_proc ("尾道",41749,"1921-6-24")
	dict_aa["t3466"] = unit_gen_proc ("竹原",74582,"1921-1-10")
	dict_aa["t3467"] = unit_gen_proc ("三次",48297,"1921-10-19")
	dict_aa["t3468"] = unit_gen_proc ("大竹",38591,"1921-12-28")
	dict_aa["t3469"] = unit_gen_proc ("府中",25978,"1921-5-14")

	return (dict_aa)
}

// ----------------------------------------------------------------
func unit_gen_proc (name string,population int,date_mod string) map[string]interface{} {
	unit_aa := make (map[string]interface{})
	unit_aa["name"] = name
	unit_aa["population"] = population
	unit_aa["date_mod"] = date_mod

	return (unit_aa)
}

// ----------------------------------------------------------------
```

## 実行の準備

```bash
go mod init create
go mod tidy
```

>go.mod go.sum が作成される。

## 実行コマンド

```bash
go run postgre_create.go
```
Firefox OS ビルド手順 (Galaxy S2)

# はじめに
**注意: 自サイトに置いていた記事をこちらに移動しただけです。最新情報ではありません。**

このページは Firefox OS の Galaxy S2 向けビルド手順について記載しています。
Galaxy S2 向け Fierfox OS は、今ではあまり活発に開発されていません。
可能であれば他の機種を使うことをおすすめします。

# 必要事項
下記手順にて作業するためには以下の3つが必要です。

* Galaxy S2 (SC-02C)
* Windows XP 以降
* Ubuntu 12.04 (32bit)

# Android 4.0 を焼く
以下 Windows にて作業します。 Galaxy S2 のファームウェアやデータを消してしまうので、必要であればバックアップを取ってから下記作業を行ないましょう。

## ファームウェアを準備
[ファームウェア](http://hotfile.com/dl/156116610/75bfcfc/I9100XWLPD_NEELP4_Nordic_Android_4.0.3.zip.html)をダウンロードします。**※リンク先が無くなっていて、もうダウンロードできません。**

I9100XWLPD_I9100XXLPW_I9100NEELP4_HOME.tar.md5 の後ろの .md5 を削除。
I9100XWLPD_I9100XXLPW_I9100NEELP4_HOME.tar を解凍。
「hidden.img」以外を同時に選択して XWLPD.tar に圧縮。

## Windows ドライバをインストール
[Galaxy S2用のドライバ](http://drivers.softpedia.com/get/MOBILES/Samsung/Samsung-Galaxy-S-USB-Driver-for-Windows-x86.shtml)をダウンロードします。

## ファームウェア書き込みソフトをインストール
[odin3 1.85](http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CB4QFjAA&url=http%3A%2F%2Fforum.xda-developers.com%2Fattachment.php%3Fattachmentid%3D581913%26d%3D1304094576&ei=-FkCT7SXFubFmQWU4cyMAg&usg=AFQjCNF7sF0f2yJp0IxHp1ISlP2fzGKhtw&sig2=yYpcAucxXAlMLffTdUgorQ)をダウンロードします。

## ファームウェアの書き込み
odin を起動します。
電源を切った状態の Galaxy S2 のボリューム↓+ホームボタンを押しながら、電源ボタンを長押しします。
Volume up: Continue
PC に Galaxy S2 を接続します。
odin にて
Added!!
の表示を確認します。
PDA にチェックし「ファームウェアを準備」で作成した XWLPD.tar を選択します。
Start ボタンを押します。
書き込みが終わったら自動的に再起動します。
しかし Galaxy S のタイトルから先に進まないので電源ボタンを長押しして電源を切ります。
Galaxy S2 のボリューム↑+ホームボタンを押しながら、電源ボタンを長押します。
wipe data/factory reset を選択します（ボリュームボタンで選択、電源ボタンで決定）。
Yes -- delete all user data を選択します。
reboot system now を選択します。
これで Android 4.0.3 の書き込みが完了します。

# Firefox OS ビルド準備
以下 Ubuntu にて作業します。

## パッケージのインストール
下記コマンドで必要なパッケージをインストールします。

```
$ sudo apt-get install autoconf2.13 git ccache gcc g++ g++-multilib bison flex make curl bzip2 zlib1g-dev libncurses5-dev libusb-1.0-0-dev
```

## Heimdall のインストール
下記コマンドで Heimdall をインストールします。

```
$ git clone git://github.com/Benjamin-Dobell/Heimdall.git
$ cd Heimdall
$ git checkout fbbed42c1e5719cc7a4dceeba098981f19f37c06
$ cd libpit
$ ./configure
$ make
$ cd ..
$ cd heimdall
$ ./configure
$ make
$ sudo make install
```

## USB の設定
udev が Galaxy S2 を認識できるようにしておきます。

```
$ sudo vi /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", MODE="0666"
```

## adb のインストール
Android の adb をインストールし adb へのパスを通しておきます。

## バックアップ
必要であれば Galaxy S2 内のデータを下記コマンドでバックアップしておきます。

```
$ adb pull /system ./galaxy_s2_backup/system
$ adb pull /data ./galaxy_s2_backup/data
$ adb pull /vendor ./galaxy_s2_backup/vendor
```

# Firefox OS をビルドする
以下 Ubuntu にて作業します。

## ソースコードのダウンロード
下記手順でソースコードをダウンロードします。

```
$ git clone https://github.com/mozilla-b2g/B2G.git
$ cd B2G/
```

以下 Galaxy S2 からファイルを抜き出すので Galaxy S2 を挿して adb にパスを通した状態で実行します。

```
$ ./config.sh galaxy-s2
$ git pull
```

最後に下記コマンドを実行するとダウンロードが始まります。通信環境によっては時間が掛かります。

```
$ ./repo sync
```

## ビルド
下記コマンドでビルドを行ないます。 -j の後の数字は CPU の個数を記載します。
参考までに Athlon X2 4400 では 2 - 3 時間掛かりました。

```
$ ./build.sh -j2
```

## 書き込み
下記コマンドで書き込みを行ないます。

```
$ ./flash.sh
$ ./flash.sh gaia
```

これで終了です。
C#プログラミング

※自分のメモ用に書いています

環境:windows 10 Visual Studio 2012

今回はテキストプレートを使ってみる
まずテキストプレートを追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/6cb1492d-4d89-80a7-8ea6-fb397cf7e2d3.png)
初めに1行目と6行目を書き換える
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/e33b3cbf-2050-d5a3-16cf-eac9ab7a287d.png)
次にメイン部分の追記していく
~~(間違えても色が変わらないのがツライ...)~~
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/9010e961-a654-1391-36dd-9ad83a93a80f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/f55324bd-761b-dffc-9567-f69cae92417a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/7c8ce019-055c-4c10-9a18-b0212dc51ca4.png)

---

ちょっと別のことも書いておく
使用:Sourcetree
GitHubにアップロードする方法
まずアップロードするためにフォルダを作成する。
その中にアップロードするものを入れ、Sourcetreeを起動する。
最初の画面でCreateを選択して保存先のパスの場所にさきほど作ったフォルダの場所を
名前は任意で入れGitを選択して作成する。
その後作業ツリー内の下の欄に入れたものがあることを確認し真ん中あたりにある
インデックスに追加を選択する。
次に下のテキストボックス内にそのファイルの説明を記入して
右下もしくは左上のコミットを選択する。
次に一番上のリボジトリを選びリボジトリ設定にいき追加リモート名を記入し
アップロードする場所のURLを追加する。
追加したら上の方にあるプッシュを選択して対象のチェックを入れて、右下のプッシュを選択する
これでアップロード完了。
Laravel5.5のroute:listでCall to a member function parameter() on nullと言われた

# 前提
基盤にしているのはこちらの記事

- [Laravel 5.6で基本的なCRUDを作る - Qiita](https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)

ついでにこれを見ながらあれこれメモした記事。

- [Laravel5.5でDBのCRUDを実装してみる - Qiita](https://qiita.com/ragingalpaca/items/2e27e25888241cd56e23)



# 事象
記事にコメントを書けるようにしたかったのです。
というわけでCommentControllerとかいうのを追加して、postに紐付いたcommentを保存する機能を追加しました。

## CommentController.php
```php:CommentController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Comment;
use League\Flysystem\Exception;
use Illuminate\Support\Facades\Route;

class CommentController extends Controller
{
    public function __construct(Request $request)
    {
        $this->middleware('auth');
    }

    public function store(Request $request)
    {
        $comment = new Comment();

        $comment->comment = $request->comment;

        $comment->user_id = $request->user()->id;
        $comment->post_id = $request->post_id;
        $comment->save();

        return redirect('posts/'.$comment->post_id)->with('status', __('Commented to article.'));
    }
}

```


## web.php
```php:web.php
Route::post('posts/{post_id}/comments', 'CommentController@store');

```

## route:listでエラー
すると、`php artisan route:list`でなんかエラーになるようになりました。

```bash:
$ php artisan route:list

In Router.php line 991:
                                                 
  Call to a member function parameter() on null  

```

ちなみに動作自体は想定通りに動いてます。
なんでだろう。


# 原因
とりあえず、web.phpに追加したルーティングをコメントアウトするとエラーは出ません。
なのでこれが原因っぽいです。

# 対応
storeがダメなのかな？と思って名前を変えてみるも特に変化なし。

いろいろ試した結果、**この機能をPostControllerに移動させたらエラーが出なくなる**ことがわかりました。
（storeのままだとかぶるので、storeCommentとかに変更しました）

んー……なんとなくわかるようなわからないような……。

まあそもそも分けた理由自体なんとなくというかぶっちゃけ理由なんてなかったんで、どうでもいいんですけどいまいち腑に落ちない。
ログファイルによるdisk圧迫への対処法

# 経緯
ログファイルがdiskを圧迫し、サーバ処理が出来ないという問題が発生。暫定的にファイルを削除しようと思ったが、lotateされてあるファイルなので、logrotate.dが使えない。
しょうがないので、cronを使う。

# cronの記載

http://www.server-memo.net/tips/crontab.html
これを見れば十分。

# find
findはいつも細かいオプションを忘れる。本来は、findだけで、もっと色々出来るのだが、パイプで繋ぐのを多用している気がするなあ。
-atime (+/-)n
最後にアクセスしたのが n日前の file/dir を検索(+n：n日以上、-n：n日以下)

-ctime (+/-)n
最後にステータスが修正されたのが n日前の file/dir を検索(+n：n日以上、-n：n日以下)

-mtime (+/-)n
最後にデータが修正されたのが n日前の file/dir を検索(+n：n日以上、-n：n日以下)
http://www.rep1.co.jp/staff/200vcxg/217rav/find_n_lcd_-linux_command_dict.htm
なのだが、「何分前」というのは以下を使う。
-amin -cmin -mmin

# 実際のcronの記載
```
$ crontab -l
10 0-23/1 * * * find /var/log/xxxx -type f -mmin +180 | grep -E ".log-xxxx$" | xargs rm >/dev/null 2>&1
```

毎時10分に、`/var/log/xxxx`ディレクトリにある、modify後180分経った`.log-xxxx`というsuffixの付くlogファイルを削除する。
本来は、ワンライナーではなくシェル化すべきだが、暫定対処なのでそのまま。
gzip化するのなら、こう。

```
$ crontab -l
10 0-23/1 * * * find /var/log/xxxx -type f -mmin +180 | grep -E ".log-xxxx$" | xargs gzip >/dev/null 2>&1
```
ドローン(Ryze Tello)をProcessingのみで飛ばした

# 環境
- ドローン Ryze Tello
-- 公式スペックページ　https://www.ryzerobotics.com/jp/tello/specs
- Tello sdk 1.0.0.0
-- ダウンロードサイト ここにあるpdf内のバージョン表記です　https://www.ryzerobotics.com/jp/tello/downloads
- Processing 3.3
- udp(Processingライブラリ) 1.0

今回はnodeや公式サンプルのあるpythonなどは使用せずに飛ばします
前回( https://qiita.com/tkyko13/items/02f74180daac05254367 )で飛ばしたparrotのswatは壊しちゃいました．．．汗

# サンプルコード
いきなりサンプルコード

``` java:TelloP5_01.pde
import hypermedia.net.*;

UDP udp;
String ip = "192.168.10.1";
int port = 8889;

void setup() {
  udp = new UDP(this, port);
  udp.listen(true);
  
  // 最初にcommand実行
  udp.send("command", ip, port);
}

void draw() {
}

void keyPressed() {
  if (key == 't') {
    udp.send("takeoff", ip, port);
  }
  else if(key == 'l') {
    udp.send("land", ip, port);
  }
  else if(key == 'q') {
    udp.send("cw 100", ip, port);
    udp.send("down 100", ip, port);
  }
  else if(key == 'p') {
    udp.send("speed?", ip, port);
    udp.send("battery?", ip, port);
    udp.send("time?", ip, port);
  }
}

void receive(byte[] data, String ip, int port) {
  // 後ろ2バイトは改行コード
  data = subset(data, 0, data.length-2);
  String recMess = new String(data);
  
  println(recMess);
}
```

とりあえずこれだけで要は足りる人は足りるのかな

## ちょい解説
Tello sdkについて
まずは，サンプルを動かすための手順

1. Processingのダウンロード（詳細は省く）
1. Processing内で「udp」ライブラリのインストール（詳細は省く）
1. Tello本体の電源をつける
1. wifiに「Tello〇〇」という名前が見つかるはず，そこに繋ぐ
1. Processingにてサンプルを実行 tキーを押すと離陸，lキーで着陸

実行した後，
qキーを押すと，100°旋回命令と，100cm下に下降命令を同時に送っている
期待する結果は回りながら下降してほしいが，その場で回った後，下降する挙動になっている
てことは斜め移動できない！！
公式のスマフォアプリ「Tello」だとできるのにね！！
sdkは1.0だけどもバージョンアップ来て，できるようになってほしいなぁ．．．

仕組みとして，
公式SDKにも乗っているが，Telloが飛ばしているwifiに接続して指定のipとportにudpで遅れればどんな言語でもできそうです
他の言語でも挑戦してみたい！
もちろんESPなんかのwifi付きマイコンでも操作したいね！！

#　参考
公式のTelloダウンロード場所
「Scratch README」内にnodeのサンプルが置いてあるURLが書いてあるし，「Tello SDK」内にはpythonのサンプルURLが書いてある
https://www.ryzerobotics.com/jp/tello/downloads

日本語で丁寧に解説している
Scratchを利用していて，nodeもある
http://yaaam.blog.jp/archives/75130218.html

GO言語のライブラリgobot内でHackしてる様子が見れる
公式SDK以上に詳しい
https://gobot.io/blog/2018/04/20/hello-tello-hacking-drones-with-go/

ESPで編隊飛行
楽しそう
https://qiita.com/bishi/items/30ba53eedbb868cb6ddc
RustでVec<T>に&を付けると&[T]が得られる理由、及びDerefの解説

Rustで`&[T]`を必要とする場所に`&v`の形で`Vec<T>`を渡すと`&[T]`に変換されます。
私は最初Rustが`Vec<T>`を特別扱いしているのだと思っていたのですが、そうではありません。
これは[Deref](https://doc.rust-lang.org/std/ops/trait.Deref.html)トレイトの動作です。

`Deref`は次のように定義されています。

```rust
pub trait Deref {
    type Target: ?Sized;
    fn deref(&self) -> &Self::Target;
}
```

自分への参照を`Target`への参照に変換するというメソッドが定義されています。

また、`Deref`のドキュメントには次のように書かれています。

> If `T` implements `Deref<Target = U>`, and `x` is a value of type `T`, then:

> In immutable contexts, `*x` (where `T` is neither a reference nor a raw pointer) is equivalent to `*Deref::deref(&x)`.
> Values of type `&T` are coerced to values of type `&U`
> `T` implicitly implements all the (immutable) methods of the type `U`.

これを翻訳すると:

> `T`が`Deref<Target = U>`を実装し、`x`が`T`型の値のとき:
>
> * イミュータブルの文脈では、`*x`は (`T`が参照でも生ポインタでもないとき) `*Deref::deref(&x)`と同値。
> * `&T`型の値は`&U`型の値に強制される。
> * `T`は型`U`の全ての（イミュータブルな）メソッドを暗黙的に実装する。

となります。

つまり冒頭の疑問の答えは、`Vec<T>`が`Target = [T]`として`Deref`を実装しているのでドキュメントの二つ目の項目に当てはまり、コンパイラが自動的にスライスへの参照に変換してくれるからということになります。

他にも[`iter`](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter)などのメソッドは`Vec`のメソッドではなく`slice`のメソッドで、三つ目のルールから`v.iter()`というのは`v.deref().iter()`に自動的に変換されています。

ミュータブル版の[`DerefMut`](https://doc.rust-lang.org/std/ops/trait.DerefMut.html)もあります。
Node.js Promiseの戻り値2つの実装

普通に戻り値2つ取ろうとすると
ふたつ目がundefinedとなる。

```javascript
// 省略...
    await get_info(config).then((data,fdata) => {
        console.log(data);   // test
        console.log(fdata);  // undefined
    });
// ...

let get_info = async (conf) =>{
    return new Promise((resolve, reject) => {
        var data = "test";
        var fdata = "test.txt";
        result(data, fdata);
        });
    });
};
```
## 解決策
配列にしていれば渡せる

```javascript

// 省略...
    await get_info(config).then(([data,fdata]) => {
        console.log(data);   // test
        console.log(fdata);  // test.txt
    });
// ...

let get_info = async (conf) =>{
    return new Promise((resolve, reject) => {
        var data = "test";
        var fdata = "test.txt";
        result([data, fdata]);
        });
    });
};
```
javaのバージョン切り替えを簡単にする(Mac)

java のverison切り替えするのが少しだけ面倒でしたので、bashの関数にしてコマンドのように利用できるようにしました。

参考：
http://shinsuke789.hatenablog.jp/entry/2017/08/16/103000
https://qiita.com/ponsuke0531/items/795cd00d93b71c14d07b

# bash追加内容
1.`~/.bash_profile` を編集

```bash
$vi ~/.bash_profile
```

2.下記を追記

```bash:~/.bash_profile
#!/bin/bash

# PATH初期化
export PATH=/sbin:/bin:/usr/bin:/usr/local/bin:/usr/sbin

#~~~ 普段~/.bash_profileでやっている処理 ~~~
# ~/.use-java-version
if [ -f ~/.use-java-version ]; then
        export JAVA_HOME=$(cat ~/.use-java-version)
else
        # わたしはデフォルトはjava8にしている
        /usr/libexec/java_home -v 1.8 | tee ~/.use-java-version
        export JAVA_HOME=$(cat ~/.use-java-version)
fi
export PATH=$JAVA_HOME/bin:$PATH

function lsjava () {
        # インストール済みのjavaを出力
        echo -e "\033[0;33mInstalled java version:\033[0;39m"
        /usr/libexec/java_home -V
        # 現在利用中のjavaを出力
        echo -e "\n\033[0;33mCurrent specificed java version:\033[0;39m"
        java -version
}
function chjava () {
        # パラメータが指定されてなかったら
        if [ -z "$1" ]; then
                echo -e "Please specific java version. \nex)\n\$ chjava 1.8"
                return 1
        fi
        /usr/libexec/java_home -v $1
        local checkJavaVersion=$?
        # 指定したjavaバージョンがインストールされてなかったら
        if [ $checkJavaVersion -ne 0 ]; then
                echo "Please specific installed java version."
                echo Java $1 is not installed.
                return 2
        fi
        echo Use java $1.
        /usr/libexec/java_home -v $1 | tee ~/.use-java-version
        # ~/.use-java-versionに利用するjavaのpath出力されたので、上の方のif [ -f ~/.use-java-version ]のところで、PATHに追加されるようになる
        source ~/.bash_profile
        # PATHを表示
        echo PATH=$PATH
　　　　　　　　　　　　　　　　# 利用中のjava versionを表示
        java -version
        return 0
}
```

3.修正したbash_profileを読み込み。

```bash:
$source ~/.bash_profile
```

# 機能
## java version切り替え

`$chjava [javaのバージョン]` で行う

```bash
#java10を指定
$chjava 10.0

#java8を指定
$chjava 1.8
```

### エラーハンドリング

```bash
#パラメータを忘れた場合
$chjava
Please specific java version.
ex)
$ chjava 1.8

#インストールされていないjava versionが指定された場合
$chjava 1.9
Unable to find any JVMs matching version "1.9".
/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
Please specific installed java version.
Java 1.9 is not installed.
```

## 現在インストール済みのjava version&利用中のversion 

`$lsjava` で行う

```bash
$lsjava
Installed java version:
Matching Java Virtual Machines (3):
    10.0.1, x86_64:	"Java SE 10.0.1"	/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
    1.8.0_121, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
    1.8.0_101, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home

Current specificed java version:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
```
MDB2 Error: connect failed （connect: [Error message: No such file or directory]）が発生して接続できない

設定不備ではないのに MDB2 Error: connect failed で MySQL に接続できないとき。
mysql.sock の場所が違う可能性があります！

https://stackoverflow.com/questions/12584762/mysql-connect-no-such-file-or-directory

/tmp/mysql.sock へのシンボリックリンクを /var/mysql/mysql.sock へ作成して回避。

```
cd /var 
mkdir mysql
cd mysql
ln -s /tmp/mysql.sock mysql.sock
```
claudia.jsによるAPIGatewayへのデプロイがコケる

ある日claudia.jsを利用したAPI群のデプロイがコケるようになった。
TooManyRequestsExceptionとあるが、上限値に引っかかるほどAPIを呼んでいるわけでもなさそうだった。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/limits.html

```
{ TooManyRequestsException: Too Many Requests
    at Object.extractError (/xxx/xxx/node_modules/aws-sdk/lib/protocol/json.js:48:27)
    at Request.extractError (/xxx/xxx/node_modules/aws-sdk/lib/protocol/rest_json.js:52:8)
    at Request.callListeners (/xxx/xxx/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
    at Request.emit (/xxx/xxx/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit (/xxx/xxx/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition (/xxx/xxx/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/xxx/xxx/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /xxx/xxx/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/xxx/xxx/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/xxx/xxx/node_modules/aws-sdk/lib/request.js:685:12)
  message: 'Too Many Requests',
  code: 'TooManyRequestsException',
  time: 2018-05-16T09:19:37.499Z,
  requestId: '483f4e63-58ea-11e8-8ca8-0f1395b3d620',
  statusCode: 429,
  retryable: false,
  retryDelay: 32.340008107058836 }
```

というわけでAWSへ問い合わせ。

「requestIdだけだと辛い。エラーになっているAPIを特定して」と言われ、そうだよなと悲しくなりながらClaudia.jsのコードを追ってログを仕込み、`create-deployment`がTooManyRequestsExceptionで返ってきていることを特定。

そちらを伝えると「特定のRestAPIリソースに対して`create-deployment`呼ぶと、AWS側でInternalErrorが発生している。その際に内部的にリトライが発生し、最終的にTooManyRequestsExceptionが帰っているっぽい。原因は不明。リソースを作り直せば回避できる」とのお返事。

言われるがままに、既存のRestAPIを削除して、まったく同じものを作り直してみると正常にデプロイできた。というわけで、APIGatewayの`create-deployment`で`TooManyRequestsException`が出ちゃった方は、作り直すといいかもしれません。
ラズパイでフォルダへのショートカット作成

OSはRaspbianのGUI版

# はじめに

よく使うフォルダへのショートカットを作りたくても、
windowsの用に「～へのショートカット」のようなショートカットを
簡単に作れなかったので、作成方法を覚え書き。


# lxshortcutのインストール

以下のサイトの情報を参考にしました。
[【STEP-21】Raspbianのデスクトップにショートカット追加](https://www.fabshop.jp/%E3%80%90step-21%E3%80%91raspbian%E3%81%AE%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%AB%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E8%BF%BD%E5%8A%A0/)

# ショートカットの作成

ショートカットを作成したいフォルダでコンソールを開きます。

![2018-05-23-143032_1824x984_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/55069/ae165092-f072-ef43-4542-f1c75664c59f.png)

試しに、/home/pi/.config/lxsession/LXDE-piへの
フォルダショートカットを作ります。

以下のコマンドを実行

```
lxshortcut -o Autostart_Shortcut
```
※Autostart_Shortcutの部分は自由に変えてＯＫ

![2018-05-23-143158_1824x984_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/55069/00128607-d6c9-b060-553e-a3b0e7271fed.png)


するとアプリケーションショートカットが開きます。

![2018-05-23-143202_1824x984_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/55069/79e23815-0986-d521-bd70-ed37a7cee34e.png)


名前は空欄でもＯＫ、空欄にするとコマンド実行時の名称が入ります。
※今回の例だと「Autostart_Shortcut」


コマンドの部分にフォルダを開くコマンドを記述します。

```
pcmanfm /home/pi/.config/lxsession/LXDE-pi
```
又は

```
xdg-open /home/pi/.config/lxsession/LXDE-pi
```
※コマンドによる違いは分からないので、ご存じの方がいれば是非、、、！
※フォルダへのパスのみだと何も起こらないので注意


これでOKを押せばショートカットが生成されますが、
デフォルトだとアイコンがテキストファイルみたいなアイコンになるので、
フォルダーへのショットカットぽいアイコンにします。

↓作りました。ご自由にどうぞ

![ShortcutIcon.png](https://qiita-image-store.s3.amazonaws.com/0/55069/33b84396-3e11-ad1c-cba9-acda35d8f29e.png)

それでOKを押せば、アイコンがちゃんと設定されたショートカットが出来ます。

![2018-05-23-150618_1824x984_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/55069/d6201f0c-84bb-1bf1-351e-f945944990d0.png)


ダブルクリックすれば、対象のフォルダが開きます。

![2018-05-23-145131_1824x984_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/55069/2f91e2a4-0d8a-41b3-3d4e-3c746cb76e8d.png)
クライアントサイドのJavaScriptだけでPDFを生成する(日本語対応)

[jsPDF](https://github.com/MrRio/jsPDF)がv1.4.0でついにUnicodeをサポートしました。こんな感じで使えます。

```javascript
var WebKoruri = "AAEAAAAUAQAABABARk...";
var doc = new jsPDF();

doc.addFileToVFS("WebKoruri.ttf", WebKoruri);
doc.addFont('WebKoruri.ttf', 'WebKoruri', 'regular');
  
doc.setFont('WebKoruri', 'regular');
doc.setFontSize(20);

doc.text("クライアントサイドのJavaScriptだけでPDFを生成する", 20, 20);
```
フォントはbase64エンコードしたものを読み込みます。今回は軽量日本語フォント[WebKoruri](https://cdn.ghippos.net/font/webkoruri/)を利用させてもらいました。

```bash
$ base64 -w 0 ./WebKoruri.ttf > WebKoruri.txt
```
コード中では"AAEAAAAUAQAABABARk..."とし省略していますが、実際はWebKoruri.txtの中身をすべて貼り付けてください。
[jsPDF](https://github.com/MrRio/jsPDF)リポジトリのトップにあるindex.htmlを開くとPDF生成をリアルタイムに試せます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5023/27be90e6-b15a-2b95-ba32-c3f88d12b16d.png)
RxJS Observableの作成 (1) 　Observable.of の使い方


## 用途
Observable.ofは、シンプルな値を流したいときに利用します。
引数を可変長で受け取り、値をそのまま流します。

## 基本的な使い方

引数で受け取った値をそのまま流します。
入れれる値は文字列、数値、配列、オブジェクト等です。
通常単体の利用することはあまりなく、複数のオペレーターと組み合わせて使用します。

``` js
const numbers = Rx.Observable.of(1,2,3).subscribe(x => {
  console.log(x);
});

// 結果
// 1
// 2
// 3


Rx.Observable.of('hoge',[1,2,3],{name:'keisukeh'}).subscribe(x => {
  console.log(x);
});

// 結果
// hoge
// [1,2,3]
// {name:'keisukeh'}
```

[ ES6 stackblitz ](https://stackblitz.com/edit/rxjs-of-01-es6)
[ TypeScript stackblitz ](https://stackblitz.com/edit/rxjs-of-01-ts)


## 他のオペレーターとの組み合わせ

``` js
const numbers = Rx.Observable.of(1,2,3);
const timer = Rx.Observable.timer(2000);
Rx.Observable.concat(timer, numbers).skip(1).subscribe(x => {
  console.log(x);
})

// 結果
// (2秒後)
// 1
// 2
// 3
```
[ ES6 stackblitz ](https://stackblitz.com/edit/rxjs-of-01-es6)
[ TypeScript stackblitz ](https://stackblitz.com/edit/rxjs-of-01-ts)
秋月オシロスコープ

#概要
オシロスコープの使い方

#写真
MultiScope　22-321　Ver1.10　2001年
![CIMG2629.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/3c5a231b-5108-3998-b07c-930c838d2b51.jpeg)

#AUTO操作
MENUを押す。
F2を押す。
MANUALで上下どちらかのキーを押す。
![CIMG2630.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/5548c23e-c52b-3e92-d44a-3e1561fea5bd.jpeg)

#時間軸、電圧軸の操作。
4キー、7キーで電圧軸。
6キー、9キーで時間軸。
#波形を止める操作。
STDBYキーを押す。
![CIMG2631.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/9998694f-41eb-79a2-49fe-2c246d645e7e.jpeg)

以上。
Google Analytics のデータ保持期間が中途半端なわけを探る

Google アナリティクスが、2018年5月25日以降、EUの一般データ保護規則に対応するために、データ (Cookie、ユーザーの識別子（例: ユーザー ID）、広告 IDに関連付けられたユーザー単位やイベント単位のデータが対象。)を自動的に削除する仕組みを導入しますね。
つまりは、Google アナリティクスサービスの利用者自身が、ユーザデータをいつまで必要か考えて保存期間を決めなさいよってことですよね。責任が利用者に移って来た。
その時に、選べる保存期間の選択肢。14ヶ月、26ヶ月、38ヶ月、50ヶ月、自動的に期限切れにならない、の5つ。

https://support.google.com/analytics/answer/7667196?hl=ja

なんで、12ヶ月きっかりじゃないんでしょうね、って話をします。

# 14,26,38,50

14ヶ月、26ヶ月、38ヶ月、50ヶ月って数値は何を根拠にしているんでしょう。
年+2ヶ月だろうとは思うのですが、どこにも示されていないんですよね。
なので、ここから先は全部想像です。


年+2ヶ月だとしたら、どうして +2ヶ月 しているんでしょう。

# 12ヶ月だとダメなんですか？

選択肢は `自動的にデータが削除されるまでの保持期間` です。
`データの保持期間が終了すると、月単位で自動的に削除されます。` と説明があります。
`保持期間` ってどういう計算なんでしょうね。

たとえばデータの保持期間を1ヶ月だとしたときに、8/10 13:00 のデータはいつ保持期間を終了するのでしょう？ 9/10 12:59 でしょうか 9/9 23:59 でしょうか、8/31 23:59 でしょうか、それとも一月おまけして 9/30 23:59 でしょうか。それはつまり、Google は保持期間を秒、分、時、日、月のどこで切り捨てているかという話です。まあ、今は知りようがないわけですが。
いずれにしても、一番短いのは月単位で切り捨てでしょう。8月のデータは8月末までで1ヶ月。もし9月末までにおまけしちゃうと、データの保持期間を1ヶ月と言っておきながら1ヶ月以上保持していることになり法的に訴えられた時に戦いにくい。

というわけで、最も短くなる月単位で切り捨てのケースで、この先考えていきます。
8月のデータは翌年の7月末で12ヶ月。削除されるのは翌8月。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/185984/cc3f5785-94a3-7c7b-7a93-7c8461d8e484.png)

X月のデータが削除されるのは翌年のX月。
わかりやすい。
しかし、Google の月単位の削除処理をいつやったとしても、丸一年保持されないデータが発生してしまう。
サービス利用者は丸一年分のデータが得られないなら、年単位でのデータ処理がしにくく困ります。
伸ばしましょう。

# 13ヶ月じゃダメなんですか?

13ヶ月だと、
X月のデータが削除されるのは翌年のX+1月。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/185984/05c18bb4-7df8-6f6b-0554-154aee25cf5a.png)


データは確実に丸一年保持されるようになりますね。やったぜ。
でも、僕らはたとえばバッチ処理などで毎月年間データの集計をしたりするわけです。
１ヶ月のあいだで集計のタイミングが運悪くデータ削除のタイミングよりもあとになると、集計時点では11ヶ月分のデータしか読めないわけです。
Google の月単位の削除処理は何日に行われるのでしょう？情報開示されていないですよね。
うまく集計できたり、集計できなかったりするわけです。話にならない。
伸ばしましょう。

# 14ヶ月

14ヶ月だと、
X月のデータが削除されるのは翌年のX+2月。

![14.png](https://qiita-image-store.s3.amazonaws.com/0/185984/6d854fa4-1d9a-171d-79e6-6a22e2bd29a7.png)


これなら、Google が月単位の削除処理をいつ行おうと、僕らの毎月の年単位でのデータ集計処理はいつでも行えます。
`データの保持期間` の定義を一番短い方で考えても問題ないのだから、Googleがデータの保持期間をどのように定義していようと、問題はおきません。
サービスの利用者は、`データの保持期間` の定義も、Google が削除処理をいつ行うのかも、全く知る必要がないわけです。

# まとめ

というわけで、僕の考えは、
詳しい内部仕様を開示しなくても多くのユーザが困らなくなるので +2ヶ月している。です。

システム開発をしていて、過去データの削除処理を設計する時に、気軽に前年同月で削除するひとのなんと多いことか。まあ、トラブって修正するわけですが。基本 +1ヶ月。他の年次処理の影響を無視できるようにするなら +2ヶ月しましょうね。
手元のフォルダをGitHubに上げる方法

手元で作ってたプロジェクトをGitHubにまとめて上げる方法。
毎回悩むのでメモ。

###　手順

まずブラウザからGitHubにログインし、新規レポジトリを作る。(例としてhogehogeという名前で)

次にローカルのフォルダ内で以下のコマンドを叩く。

```bash
$ git init
$ ###(必要に応じて書く)###
$ vim .git/info/exclude
$ vim .gitignore
$ ###(ここまで)###
$ git add .
$ git commit -m "initial commit"
$ ##つまづきやすいので注意！##↓ここで、GitHubからコピペしたリンクにユーザー名を付け加える(GitHubに公開鍵設定などしてない場合)
$ git remote add origin https://username@github.com/username/hogehoge.git
$ git push origin master
```

以上。

### 参考

[【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践～とりあえず一緒に動かしてみようぜ！～](https://qiita.com/nnahito/items/565f8755e70c51532459)
[gitでpushしようとしたら403された話](https://qiita.com/ritukiii/items/0d14df8f0253ca223373)
Azure VMのJenkins自動アップグレード

# Azure VMのJenkins自動アップグレード

Jenkinsのバージョンアップのたびにファイルをダウンロードして、
jenkins.warファイルを置き換えるのがめんどくさくなったので、自動アップグレード出来るようにしました。

jenkins.warが設置されているディレクトリの権限をjenkinsに変更すれば自動アップデートできるとのこと

VMのOSはUbuntsでしたので、以下のディレクトリの権限を変更

```
$ chwon -R jeknins:jenkis /usr/share/jenkins
```

これでjenkins画面に自動アップデートのボタンが表示がされましたので、
クリックすればアップグレードが実行されます。
![jenins_update.png](https://qiita-image-store.s3.amazonaws.com/0/181159/d3814f28-ffb4-e5e2-e414-f52e9cfda7d5.png)
[JAWS-UG CLI] JSONをYAMLに変換するシェルスクリプト

CloudFormationではJSON、YAMLの2種類の記法を利用することができます。

利用者の間では可読性と記述性の高いYAMLが人気ですが、AWSアーキテクチャセンター( https://aws.amazon.com/jp/architecture/ )で配布されるテンプレートにはJSONのものが多いように感じます。


# シェルスクリプト(例)

CLI環境で気軽にCloudFormationテンプレートをYAMLに変換するために以下のようなシェルスクリプトを作成しておくと良いでしょう。

```bash:~/bin/json2yaml.sh:
#!/bin/sh

readonly FILE_INPUT=$1

if [ ! -z ${FILE_INPUT} ]; then
  ruby -ryaml -rjson -e 'puts YAML.dump(JSON.parse(STDIN.read))' < ${FILE_INPUT}
else
  echo "usage: $0 json_file"
fi
```


# 使用方法

## templateの取得(例)

1.  https://docs.aws.amazon.com/quickstart/latest/vpc/welcome.html にアクセスする。

2. "View Template"ボタンをクリックする。(JSON形式テンプレートのダウンロードがはじまる)

3. シェルスクリプトでテンプレートをコンバートする。

```bash:コマンド:
~/bin/json2yaml.sh aws-vpc.template
```

```yaml:結果(一部):
---
AWSTemplateFormatVersion: '2010-09-09'
Description: This template creates a Multi-AZ, multi-subnet VPC infrastructure with
  managed NAT gateways in the public subnet for each Availability Zone. You can also
  create additional private subnets with dedicated custom network access control lists
  (ACLs). If you deploy the Quick Start in a region that doesn't support NAT gateways,
  NAT instances are deployed instead. **WARNING** This template creates AWS resources.
  You will be billed for the AWS resources used if you create a stack from this template.
  QS(0027)
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
    - Label:
        default: Availability Zone Configuration
      Parameters:
      - AvailabilityZones
      - NumberOfAZs
    - Label:
        default: Network Configuration
      Parameters:
      - VPCCIDR
```
pod initができない。[Xcodeproj] Unknown object version.

### Pod initができない。
いつものようにライブラリをinstallしようとしたら、できなかったことをメモします。

### 状況
プロジェクトがあるところで、`pod init`をしたら、`[!] Oh no, an error occurred.`ってなった。

### Stack

```
   CocoaPods : 1.4.0
        Ruby : ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
    RubyGems : 2.7.6
        Host : Mac OS X 10.13.2 (17C205)
       Xcode : 9.3.1 (9E501)
         Git : git version 2.15.1 (Apple Git-101)
Ruby lib dir : /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib
Repositories : master - https://github.com/CocoaPods/Specs.git @ 70f83844bbda3c5cf69bfb22204d9229782e031e
```

### Plugins

```
cocoapods-deintegrate : 1.0.2
cocoapods-plugins     : 1.0.0
cocoapods-search      : 1.0.0
cocoapods-stats       : 1.0.0
cocoapods-trunk       : 1.3.0
cocoapods-try         : 1.1.0
```


### エラー
```
RuntimeError - [Xcodeproj] Unknown object version.
/Library/Ruby/Gems/2.3.0/gems/xcodeproj-1.5.4/lib/xcodeproj/project.rb:217:in `initialize_from_file'
/Library/Ruby/Gems/2.3.0/gems/xcodeproj-1.5.4/lib/xcodeproj/project.rb:102:in `open'
/Library/Ruby/Gems/2.3.0/gems/cocoapods-1.4.0/lib/cocoapods/command/init.rb:41:in `validate!'
/Library/Ruby/Gems/2.3.0/gems/claide-1.0.2/lib/claide/command.rb:333:in `run'
/Library/Ruby/Gems/2.3.0/gems/cocoapods-1.4.0/lib/cocoapods/command.rb:52:in `run'
/Library/Ruby/Gems/2.3.0/gems/cocoapods-1.4.0/bin/pod:55:in `<top (required)>'
/usr/local/bin/pod:22:in `load'
/usr/local/bin/pod:22:in `<main>'
```


### 解決方法
- `pod setup`
- `[sudo] gem install cocoapods`

### 終わり
xcode9.3にしたのがダメやったぽい。
あまり原因がわからなかった。
参考にしました。
https://github.com/CocoaPods/CocoaPods/issues/7458
Base64変換後のバイト数について


顧客データを暗号化したときの備忘録です。

## カラムの文字数制限について
Base64で暗号化をすると平文より文字数が増えます。
そのため既存のDBのカラム定義だと保存できない問題がありました。

### 暗号化アルゴリズムについて
対応としてはDBのカラム定義（VARCHAR）の長さを増やして対応します。
使っている暗号化アルゴリズムは`Block Cipher`(AES 256 Encryption)であり、`Block Cryption`は入力された値の長さによりブロック分けして暗号化するので暗号化された値の文字数はそのブロックにより異なります。

Base64変換後の文字列サイズは以下の式で求まります。[参考: BlockCryption](http://www.obviex.com/articles/CiphertextSize.pdf)

``` 公式
(変換後のバイト数) = (文字数 * バイト数) + ブロック数 - MOD(文字数 * バイト数, ブロック数)

```


以下公式内の変数の説明。

- 文字数：入力文字列の文字数。
- バイト数：一般的に文字のサイズは以下の通り。

| UTF-8 | バイト数 |
|:-:|:-:|:-:|
|  英文字 |  2 Bytes |
|  ひらがな or カタカナ |  3 Bytes |
|  漢字 |  3 or 4 Bytes |


- ブロック数：入力文字列によりブロックが設定される（文字数1〜7→16,文字数8～15→32, etc.)

### 凡例
名前の入力値は50文字で上限を掛けているのでこの値で計算してみます。

|| アルファベット | ひらがな or カタカナ | 漢字 |
|:-:|:-:|:-:|:-:|
| 文字数  | 50  | 50  | 50  |
| バイト数(Byte)  | 2  | 3  |  4 |
| ブロック数  |  16 |  16 |  16 |
|式| (50*2)+16-MOD(50*2,16)|(50*3)+16-MOD(50*3,16)|(50*4)+16-MOD(50*4,16)|
|サイズ(Byte)|152|216|280|

### 結論
以上から50文字上限なら280のバイト数を設定すればよさそうです。
他のカラムについても同様に計算ができます。
RubyMineを更新したら起動しなかった

最強のRailsIDEと名高いRubyMineですが、この前バージョンをあげたらうんともすんとも言わなくなりました。
macからの「Webから入手したアプリですが開きますか？」という趣旨の画面で「開く」を押した後、開く気配がありませんでした。
原因よくわからず半泣きになりながらなんとかしたので、どこかの誰かの役に立てば…とメモを残します。

## 2019/9/26追記

**！！注意！！**
**ファイルを消す際には、どこの何を消すべきなのかしっかり確認した上で、自己責任でお願いします。**

2019.2で発生していた文字入力の不具合のトラブルシューティングに記載されていた対応策も「なんか開かんな」に効果があったので記載しようかと思います。RubyMineにまつわる色々が削除できるので、解決策を様々試して環境がグロくなってしまった時なんかに特に効果があると思います。
僕の場合は多分JBRを自分で変更した影響で立ち上がらなくなっていたので、自身でいじった設定を一旦全消去からのToolBoxさんにお任せインストールをしたら復活しました…という形です。

不具合概要: [公式記事](https://blog.jetbrains.com/jp/2019/07/30/2025)

具体的にどんな操作をすればよいかというと、記事の下の方に書いてあるここです。

<img width="834" alt="スクリーンショット 2019-09-26 10.05.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255661/3453ee28-ec61-5f37-72ad-5f27dcaaf4cc.png">

(画像内のリンクは[こちら](https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-store-settings-caches-plugins-and-logs))

で、記事内には

> 「Configurations」「Caches」のディレクトリを削除

とありますが、僕の場合はこれだけでは改善せず(？) `Application Support/RubyMine<バージョン>` も削除をした上で再インストールしたら正常に立ち上がるようになりました。

というわけで、どうすればよくわからなくなったら、色々としっかり消した上できっちりと入れ直すのがよいんじゃないかという話でした。間違って大切なものを消してしまわないように気をつけつつ、試してみるとよいかもしれません。

追記終わり


##JetBeansのToolboxを導入する

ズバリこれです。[JetBeans / ToolBox ダウンロードページ](https://www.jetbrains.com/toolbox/app/)
RubyMineだけでなくJetBeans製のIDEを管理できるアプリです。IDEだけでなく、そこで作ったプロジェクトの管理？もできるみたいです。ワンクリックでIDEを起動しつつプロジェクトが開けます。
インストール / アンインストールはもちろん、IDEのバージョン管理もできます。便利そう。

## 再インストール
復活させるために私が行った手順は以下の通りですが、アンインストールはしなくても良いかもしれません。バックアップを取っておきましょう。

1. 現在のRubyMineをアンインストール
    - ToolBox > Tools > 消したいRubyMineの右に表示されているナット（？）をクリック > Uninstall
2. RubyMineをインストール
    - ToolBox > Tools > Available Tools より、IDEとバージョンを指定してインストール
3. 立ち上げ時に設定インポートの画面が立ち上がります。設定ファイルが残っていれば（/Liblary/Preferences/RubyMine[version]）、以前のキーバインドやらを適用することができます。

無事立ち上がれば嬉しいです。
RubyでFizzBuzzを6byteで実装できる訳がない

### 参考記事

スクリプトもネタも全てこちらから拝借しました。申し訳ありません。ありがとうございます

FizzBuzzを1byteで実装する
https://qiita.com/ymg_aq/items/b8e5d26035180bc8797e


### スクリプト

```ruby:1.upto 100do|n|puts"FizzBuzz\n"[i=n**4%-15,i+13]||n end#.rb
eval$0
```

123456・・よーし６バイトやな！

### 実行結果

```shell
$ ruby -v
ruby 2.6.0preview1 (2018-02-24 trunk 62554) [x86_64-darwin15]

$ ruby '1.upto 100do|n|puts"FizzBuzz\n"[i=n**4%-15,i+13]||n end#.rb'
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```
Apple Connectに提出する最低限のスクリーンショット(画像, 動画)のサイズ

# 概要

iPhone, iPadで**各２種類**用意してiTunesConnectにアップすると、よしなに表示してくれるのでオススメ。

最低限必要なサイズは**動画もあるなら４種類**、**静止画だけなら３種類**（iPadは静止画の場合どちらも同じサイズなので）です。

# iPhoneのサイズ

## 5.5 インチ（iPhone 6s Plus、iPhone 7 Plus、iPhone 8 Plus）

### Video
1080 × 1920 (横:1920 x 1080 )

### Image
1242 × 2208 (横:2208 x 1242)

## 6.5 インチ（iPhone XS Max、iPhone XR）🆕

### Video
886 x 1920 (横:1920 x 886)

### Image
1242 x 2688（横:2688 x 1242）

# iPadのサイズ

## 12.9 インチ（iPad Pro（第 2 世代））

### Video
900 × 1200 (横:1200 × 900)

### Image
2048 × 2732 (横:2732 x 2048)

## 12.9 インチ（iPad Pro（第 3 世代））🆕

### Video
1200 x 1600 (横:1600 x 1200)

### Image(第３世代と同じ)
2048 × 2732 (横:2732 x 2048)

# その他注意点
- iPadのスクリーンショットにはiPadのデバイスの写真を貼るようにする。iPhoneのを使い回すとリジェクトされる。
- 動画では、デバイスが映ったりしてはならない。アプリのスクリーンキャプチャを見ているような感じで動画を構成する。キャプション文字は装飾はOK


# 参考
https://help.apple.com/app-store-connect/#/dev4e413fcb8
https://help.apple.com/app-store-connect/#/devd274dd925
今後の Java 開発で気を付けること

Java の バージョン
==================

Java は Java **9** までの数字は Major バージョンを表していました。Java **10** 以降は、数字が上がることを **Major** バージョンアップとは言わず、**Feature** バージョンアップと呼び、意味合いも文字通りのものとなりました。

Java 9 以降 の @Deprecated
==========================

今後 Java で 開発する場合、@Deprecated(String since, boolean forRemoval) が 付いているメソッドは、使わないようにしましょう。
今までは、長く生き残っているメソッドもありましたが、今後は本当に消えていくようです。
更に、forRemoval=true に なっているメソッドは、次のバージョンかその次のバージョンで消えると思っておいてください。

詳しくは、Java Champion 桜庭さんの Java Day Tokyo 2018 での 資料「[Migration Guide to Java SE 10 and also Java SE 11](http://www.slideshare.net/skrb/migration-guide-to-java-se-10-and-also-java-se-11)」 を ご参考にしてください。

さいごに
========

Java 10 の [JavaDoc 日本語バージョン](https://docs.oracle.com/javase/jp/10/docs/api/overview-summary.html) が 公開されました。こちらも是非、活用してください。
P ≠ NP 証明

P = NP が現実世界で成立するか検討し、成立しないと仮定できた場合、P ≠ NP が証明できる。
この順を追って説明する。
まず、現実世界の地球に住んでいる世界の人の共通意識圏内ののよく有限後数を数える用語での最小単位の次の値を 1　とし、人の意識世界現実世界における人Aの、脳を構成するニューロンを1つの圏とし、一般的に脳と定義されるまでの
ニューロンの圏を P とする。
また、もう1人Bがいると仮定し、共通意識圏内で NP となる問題を作成したとする。また、これは、簡単な例で言うと、適当に10分ぐらい一筆書きを書いたものだとする。よって、現実社会の適当な絵に投射した後に、Aに読ませてもAが死ぬまでに解釈できないので、 A にとっては、 NP と仮定してもよいだろう。
この時、A = NP となる様に、A が有限解試行したとしたら、 A は説けない問題に対応しているうちに、完全情報状態になるか、A が だれにも認知されなくなるまで、 A は、この試行を繰り返すだろう。
この時、A の一生 を 現実世界で解釈を共通意識圏に投影すると、A は 局所的には存在するが(光の様なもの)、最終的には死滅する。
よって、A は 消えると解釈してもよいだろう。これを、まあ、現実世界での人と、意識世界での人との間で、交換条件が成立するまで、繰り返す。この時、よくある使う比喩で使われる、サルがシェイクスピア作品を作るまでタイプライターを打ち続ける仕事を、皆に与えたら普通に考えたら、世界は死滅するので、 0 = 0 よって、 P = NP。
しかし、普通隣の人が困っていたら助けるので、こんな状態が起こるわけなく。
何かが生まれるたびに、それに対する解釈が指数関数的い広がるので　我々が共通で意識している世界は所詮有限個の何かしらの最小単位で構成されているので、 P ≠ NP といっても良いだろう。
ゆえに、サルがシェイクスピアが打ち続ける状態になる前に、この状態を気づければ P ≠ NP といえるだろう。

なので、この文書を意識圏内で P ≠ NP と意識する人が一人でもいたら、そういえるので結局はその再帰なので、 P ≠ NP は成り立つといってもいいだろう。

経済学でいう用語なら、完全情報ゲームに至る前に、解を得られたら最適解。
普通に考えたら、 2 の n 乗 で数え上げられるもの等、時間スケールを無視すれば、何にでも成り立つ。
よって、ありえないという人が思う限り世界は広がり続ける。
python3 bitlyでURL短縮

GoogleのURL短縮が、2019年3月でサービス終了してしまうということで
bitlyのサービスを使用する。（無償版で1日1万件まで）

bitlyのTOKEN作成は以下参照

```py3

import json
import urllib.request, urllib.error

def GET_Url(access_token, longUrl):

    url = "https://api-ssl.bitly.com/v3/shorten"    #End Point
    values = {"access_token": access_token,"longUrl": longUrl} #引数

    data = urllib.parse.urlencode(values).encode('ascii')
    result = json.loads(urllib.request.urlopen(urllib.request.Request(url,data)).read())
    print(result)

    return result["data"]["url"]

if __name__ == "__main__":
　　#bitlyのTOKEN　
    access_token = "c12d79XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    
　　#Wiki バンダイナムコのページ
    longUrl="https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%B3%E3%83%80%E3%82%A4%E3%83%8A%E3%83%A0%E3%82%B3%E3%82%A2%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BA%E3%83%A1%E3%83%B3%E3%83%88"
　　#結果出力　
    print (GET_Url(access_token, longUrl))
```

■結果

```py3
http://bit.ly/2rqzWBW
```

■bitly TOKEN作成(https://app.bitly.com/)
1．ログイン後右上のセッティングボタン押下
![1.png](https://qiita-image-store.s3.amazonaws.com/0/117598/c2329742-65ba-7dd0-7ec9-baba2333ef65.png)

2.「Setting」選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/117598/035aff57-8e02-0a6d-b87e-e68a8a91eb3e.png)

3.「Generic Account Token」選択
![3.png](https://qiita-image-store.s3.amazonaws.com/0/117598/26722c76-3cea-596e-44fc-c09723af0440.png)

4.「PASSWORD」欄にパスワードを入れ「GENERATE TOKEN」ボタン押下で生成
![4.png](https://qiita-image-store.s3.amazonaws.com/0/117598/d98b3f76-c059-9610-2d18-763b5b563cef.png)
postfixとdovecotを使って、macのメールアプリでlocalhostなメールを確認する

Web系（に関わらず）をやってるとほぼ必ずでてくるメール関連の実装とかテストとか。
その場合に、ローカル環境で送信テストしたい、と思ってもOBP25Blockingとかあってメール送信が通常出来ない。

> OBP25 Blocking
> スパムメールとか意図しない大量メールの送信（ウィルス感染などによるものとか）を防ぐため、
> 一般のプロバイダは会員自前のメールサーバーから外部SMTPサーバーへの接続（ポート２５向け）をブロックする。

このため、いくらmacにPostfixを入れようが外部にメール送信はできない。
ここでよく出てくるのはGmailとかを中継させてローカルでも外部にメール送信できるようにする方法。
けどこれって結構手順が多くて大変…
しかもバージョン変われば設定ファイルが変わるときもあるので、さらに煩雑に…

ということで、外部にメール送信をあきらめて、localhost宛のメールのみ扱おうじゃないか、というのが動機。

Postfixをインストールしただけだと、外部メールアドレスに送れないけど、（アカウント名）@localhostというアドレスにはメールが送れる。
（メールアドレスのバリデーションには通らない場合もあるが、それは別の話）
ここでのアカウント名はmacにログインしている（登録されている）ユーザー名を使う。

では送信テスト
（Postfixはbrewとかportとかでインストールしておく、設定は特にいじらない）

```
mail account_name@localhost
Subject: test mail
body here
.
```

でターミナルを開くと、「メールが来てるよ」みたいなのが出るはず。
出ていたらmailコマンドでメールを確認しよう。
ちゃんと来ていればOK

Postfixのデフォルト設定だとmbox形式（１つのファイルにいろんなメールが入る）になっているので、これはMaildir形式に変更しておく。

``` /etc/postfix/main.cf
401 # DELIVERY TO MAILBOX
402 #
403 # The home_mailbox parameter specifies the optional pathname of a
404 # mailbox file relative to a user's home directory. The default
405 # mailbox file is /var/spool/mail/user or /var/mail/user.  Specify
406 # "Maildir/" for qmail-style delivery (the / is required).
407 #
408 #home_mailbox = Mailbox
409 home_mailbox = Maildir/
```

（バージョンにより場所は異なるので、検索とかで探す）
409行目の設定を加えた。（説明に書いてある通り、スラッシュ必要）

これでPostfixを再起動させれば自分のホームフォルダにMaildirというフォルダができるはず。
（mboxというファイルは使わないので削除でOK）

Postfix側はこれでOK、次はDovecotの設定に移る。
Postfixと同じく、brewやportでDovecotをインストールしておく。
あとインストール後はDovecotの設定ファイルがないので、
`/usr/local/Cellar/dovecot/2.3.1/share/doc/dovecot/example-config`
のフォルダ（brewの場合、もちろんバージョン値は異なる場合あり）から
`dovecot.conf`と`conf.d`フォルダをまるごと`/usr/local/etc/dovecot/`にコピーする。

Dovecotの設定はちょっといじる必要あり。
以下

``` dovecot.conf
# protocols = imap imaps pop3 pop3s
protocols = pop3
```

まぁどうせローカルだし、popしかいらない、ってことでprotocolsの部分を書き換える。
次はメールの場所の指定

``` dovecot.conf
mail_location = maildir:~/Maildir
```
（postfixをmbox形式のままで、DovecotもMbox形式の設定にしてもどうも上手くいかなかった。なのでMaildir形式に変更している）

SSLは使わないので

``` 10-ssl.conf
ssl = no
...
# ssl_cert = </etc/ssl/certs/dovecot.pem
# ssl_key = </etc/ssl/private/dovecot.pem
```

SSL関係はコメントアウト（ここはdovecotを起動すればエラーと言われる部分なので忘れてても気付く）

Dovecotを動かすユーザー関連

``` dovecot.conf
default_login_user = _dovenull
default_internal_user = _dovecot
```

を追記、macだとデーモン系のユーザーは前にアンダーバーがつくそうな。

このままだとmacにあるユーザーアカウント情報でDovecotにログインできないので、もう一手間

``` conf.d/auth-system.conf.ext
10 passdb {
11   driver = pam
12   # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
13   # [cache_key=<key>] [<service name>]
14   #args = dovecot
15   args = login  << 追加
16 }
```

１５行目の部分を追加すればmacのユーザー情報でログインできるそう。

ここまでやればだいたいOK（なはず）

あとは`sudo dovecot start`で開始。
（launchdとかに登録する方法もあるがこれもややこしいので割愛、というかやってない）

これで問題なく起動していれば、あとはmacのメールアプリでアカウントを追加
アカウント名はログインユーザーで、パスワードはログインパスワード
設定が終われば、ちゃんとメールを受信できるかテストを行う。
問題なければこれで終了。
PCを再起動したりしたときは、`dovecot start`を忘れないように。

なお、当然ながらusername@localhostというメールアドレスにはgmailとかyahooとか外部のメールからは送信できない。
あくまで、完全ローカル環境のみ有効なアドレスであることをお忘れなく。