OmniAICreator/Qiita-1.07M huggingface dataset:
Androidアプリケーション技術者認定試験ベーシックの試験範囲の知識をまとめた(1)

# 初めに

**Androidアプリケーション技術者認定試験ベーシック**の試験範囲の知識を、自分自身の勉強時にまとめたので順に公開していこうと思います。

# 注意

教材となった本自体が、**2012年**のものなので情報としては非常に古いです。Eclipse前提だし。
ですが、基本となる部分は変わらないはずなので公開してみることにしました。
少し検索して探したんだけど、今は試験自体人気ないのか、新しい本出てないみたい。

# 元になった本

-『3週間完全マスター Androidアプリケーション技術者認定試験ベーシック』日経BP社(2012)

# まる写しではないよ

章立てまではだいたい同じだけど、内容は自分にわかりやすくまとめ直しているのと、サンプルソース／練習問題等載せていないものも多数。

わかるだろってところは端折ったりしてます。

なので本を見た方が理解が深まるのは間違いないです。

何かお気づきの点、ありましたら指摘願います。

---
【JavaScript】配列を同じ値で埋めたり、連続した値を設定する

## 環境
google chrome
TypeScript2.6を使用しています。

##配列を同じ値で埋める方法

### `Array.prototype.fill()`を使ったコード

```ts
const len: number = 10;      // 作りたい配列の長さ
const el: string = 'foo';    // 埋めたい値
const ary = new Array<string>(len).fill('foo');

console.log(ary.join(','));    // foo,foo,foo,foo,foo,foo,foo,foo,foo,foo
```

以下のようにArrayのコンストラクターは引数が数値一つだけの場合、その長さを持った配列を作ります。

```ts
const ary1 = [3];    // 3という要素を持つ配列

const ary2 = new Array(3);    // 長さが3の配列

const ary3 = new Array(3, 6, 88, 1);    // 長さが4の配列

```

**`fill()`**メソッドは、配列中の開始インデックスから終了インデックスまでの要素を固定値で設定します。
第1引数には設定する値、第2引数には開始インデックス、第3引数には終了インデックスを指定します。
第2、第3引数を省略すると配列にすべて同じ値を設定します。

### `Array.prototype.fill()`を使わないコード

```ts
const len: number = 10;
const word: string = 'foo';

const ary = new Array<string>(len);
for (let i = 0, len = ary.length; i < len; i++) {
    ary[i] = word;
    // ary.push(word);
}
```

上記のコードではforループを使って各要素に値を代入もしくは順に`push()`しています。
繰り返す回数の指定やインデックスなどバグが入り込みやすくなるので非推奨です。

## 配列に連続した値を設定する方法

### `Array.prototype.map()`を使った方法

```ts
const len: number = 10;
const sequential = new Array(len)
    .fill(null)
    .map((_, i) => i);

console.log(sequential.join(','));    // 0,1,2,3,4,5,6,7,8,9
```

まず、任意の長さを持つ配列を作り、**`fill()`**で各要素を埋めます。
**`map()`**のcallback関数に渡される第1引数には現在処理中の要素、第2引数には現在処理中の要素のインデックスが渡されます。
途中の**`fill()`**は省略できないので以下のようには書けません。
理由をご存知の方がいらっしゃたら教えてください。

```ts
const len: number = 10;
const sequential = new Array(len)
    .map((_, i) => i);
```

以下のように書くと0以外から連番を開始することもできます。

```ts
const len: number = 10;
const sequential = new Array(len)
    .fill(1)               // 1で埋めて
    .map((n, i) => n + i); // 1 + インデックスで要素をマッピングした新しい配列を作る

console.log(sequential.join(','));    // 1,2,3,4,5,6,7,8,9,10
```

```ts
const len: number = 10;
const sequential = new Array(len)
    .fill(null)
    .map((_, i) => i + 20);    // 処理中のindex + 任意の値
console.log(sequential.join(','));    // 21,22,23,24,25,26,27,28,29,30
```

### `Array.prototype.map()`を使わない方法

```ts
const len: number = 10;

const sequential = new Array<number>(len);
for (let i = 0, len = sequential.length; i < len; i++) {
    sequential[i] = i;
    // sequential.push(i);
}

console.log(sequential.join(','));
```

同じ値で要素を埋める場合と同じように実装します。
forループを使ったコードが先ほどの通り、バグが入り込む可能性が上がるので非推奨です。

## `Array.prototype.from()` を使った方法

コメントで Array.prototype .from を使用した連続した値の生成方法を教えていただいたのでFizzBuzz問題に使用してみました。

```ts
class FizzBuzz {
    private numbers: number[] = [];

    constructor(range: {
        start: number,
        end: number
    }) {
        this.numbers = Array.from(
            { length: (range.end - range.start + 1) },
            (v, k) => k + range.start);
    }

    public exec(): string[] {
        return this.numbers.map(n => this.getWord(n))
    }

    private getWord(n: number): string {
        let word: string = '';
        if (n % 3 === 0) {
            word += 'Fizz';
        }
        if (n % 5 === 0) {
            word += 'Buzz'
        }
        return word === '' ? n.toString() : word;
    }
}

const fb = new FizzBuzz({ start: 1, end: 100 });
fb.exec().forEach(s => console.log(s))
```
PyQt5 > Link: Qt Documentation

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
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
```

PyQt5のコードを見ていて分からない部分が出てきた時、以下を参照する。

[Qt Documentation](http://doc.qt.io/qt-5/index.html)

例としてQSliderのvalueChangedを見たいとする。

1. Qt Documentationの右上の「Google Custom Search」に`QSlider`を入力する
2. `QSlider Class | Qt Widgets 5.10`をクリックする
3. ページ内で「valueChanged」を検索する
    - >> Detailed DescriptionのSignal, Descriptionの表で見つかる
    

### 関連

下記のリンク先ではQSliderのvalueChangedがQLCDNumberのdisplayにコネクトされている。

- [【PythonでGUI】PyQt5 -イベント-](https://qiita.com/Nobu12/items/de180641b7492c6460e9)
すべてのシートのA1セルにカーソルを合わせる

```VBA:a1.vas
Sub A1()
    For Each s In ActiveWorkbook.Sheets
        s.Activate
        ActiveSheet.Range("A1").Select
        ActiveWindow.ScrollColumn = 1
        ActiveWindow.ScrollRow = 1
        'ActiveWindow.Zoom = 100
    Next s
    Sheets(1).Activate
End Sub
```
CentOS7 kubespray で kubernetes(1.9) cluster を作る - Dashboard -

# Overview

[CentOS7 kubespray で kubernetes cluster を作る - その1-](https://qiita.com/ainamori/items/cf24466c6c0f4cec16d5) の続き

# Scope of Work

- kube-dashboard を使いこなす

前回の記事でdashboardへのアクセスは可能になったが
アクセスするたびにkube proxy を起動するのは手間が掛かりすぎる。
かといってこれを init script 等にしてdaemon稼働するのも違うので
公式ドキュメントを見ながら恒常的にdashboardにアクセスする最適な環境を作る

# How to AccessAccess

## Access kube dashboard from kube proxy (review)

- Kick kube proxy

```
 $ kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
```

とりあえずこれで kube proxy を起動したノードで dashboardアクセスができるのは前回の通り。

# How to Login

### Create full control -(review)

```
 $ kubectl create -f dashboard-admin.yaml
```

これも前回の振り返り。

# Creating Sample User

https://github.com/kubernetes/dashboard/wiki/Creating-sample-user
Good Night Status

नमस्ते दोस्तों मै श्वेता परमार , जैसा कि आप सब जानते हो आज कल सब <a href="https://reallifejokes.com/good-night-status/">Good Night Status</a> गूगल पर सर्च करते है तो हम आपके लिए Good Night Status लाये है |
リストの中のdatetime型を基準にソートする方法

# リストの中のdatetime型を基準に並び替え（ソート）をする方法

WEBスクレイピングで得たデータは最新の情報が上の方にあり、古いデータが下にある、
もしくは古い情報になればなるほど、次のページや深いページにあるということが一般的です。
そんなデータを取得するとこんな感じになります。

```python
from datetime import datetime as dt
from pprint import pprint

sale = []
sale.append(['モンスターエナジー', '210',  '1', dt(2018, 1, 20)])
sale.append(['リンゴジュース', '120',  '1', dt(2018, 1, 18)])
sale.append(['レッドブル', '250',  '1', dt(2018, 1, 6)])
sale.append(['ジョージアエメラルドマウンテン', '100',  '1', dt(2018, 1, 5)])

pprint(sale)

# [['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]

```

定期的にデータを取得して、データベースに保存する場合は、
古いデータから登録していきたいところなんですが、
WEBスクレイピングしてきたままのデータだと新しいデータから古いデータへと登録がされていってしまいますね。

ですので、このリストを並び替えてから、データベースに登録していけば
古いデータから順に登録していくことができます。
並び替えるのは `sorted()` を利用します。
デフォルトでは昇順に並び替えされます。
降順に並び替えたい場合は引数に `reverse=True` を追加します。
datetime型でも簡単に並び替えできます。


```python
from datetime import datetime as dt
from pprint import pprint

sale = []
sale.append(['モンスターエナジー', '210',  '1', dt(2018, 1, 20)])
sale.append(['リンゴジュース', '120',  '1', dt(2018, 1, 18)])
sale.append(['レッドブル', '250',  '1', dt(2018, 1, 6)])
sale.append(['ジョージアエメラルドマウンテン', '100',  '1', dt(2018, 1, 5)])

# sample
pprint(sale)

# result1 日付の古い順で並び替え(datetime型)
sorted_sale = sorted(sale, key=lambda s: s[3])
pprint(sorted_sale)

# result2 値段が高い順（降順）に並び替え
sorted_sale = sorted(sale, key=lambda s: int(s[1]), reverse=True)
pprint(sorted_sale)

# sample
# [['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]

# result1
# [['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)],
#  ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)]]

# result2
# [['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]
```
Delphi でゲームコントローラーを扱う (Windows API)

# はじめに

この記事は Delphi で...というより Windows API でゲームコントローラーを扱ってみるものです。

# コード

uses に Winapi.MMSystem を追加しておくとゲームコントローラーを扱うコードを記述できます。

```pascal:
uses
  ..., Winapi.MMSystem;
```

## joyGetPos()

簡単にゲームコントローラーを扱うには [joyGetPos()](https://msdn.microsoft.com/ja-jp/library/cc410473.aspx) を使います。タイマーでポーリングするとよいでしょう。

```pascal:
var
  JoyInfo: TJoyInfo;
begin
  if joyGetPos(JOYSTICKID1, @JoyInfo) <> JOYERR_NOERROR then
    Exit;

  // 処理
end;
```

[joyGetPos()](https://msdn.microsoft.com/ja-jp/library/cc410473.aspx)　の最初の引数は以下の通りです。

| 定数 | 説明 |
|:-:|:--|
|JOYSTICKID1|ゲームコントローラー 1|
|JOYSTICKID2|ゲームコントローラー 2|

二番目の引数には状態を返す [JOYINFO 構造体](https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd757110(v=vs.85).aspx) へのポインタを渡します。

戻り値が JOYERR_NOERROR の場合には成功です。それ以外の値が返ってきた場合には指定されたゲームコントローラーが使えない事を意味しています。

[JOYINFO 構造体](https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd757110(v=vs.85).aspx) には以下の値が返ってきます。

| wXpos | 位置 |
|:-:|:--|
|0|左|
|32767|押されていない|
|65535|右|

| wYpos | 位置 |
|:-:|:--|
|0|上|
|32767|押されていない|
|65535|下|

wZpos も同様です。アナログスティックの場合、wXpos / wYpos / wZpos には 0 ～ 65535 でアナログ値が返ります。ニュートラル位置の値が 32767 だとは限りません。

wButtons には JOY_BUTTON1 / JOY_BUTTON2 / JOY_BUTTON3 / JOY_BUTTON4 のいずれか、またはその合計値が返ります。

[joyGetPos()](https://msdn.microsoft.com/ja-jp/library/cc410473.aspx) は 3 軸 4 ボタンまでのゲームコントローラーしか扱えないという制限があります。

## joyGetPosEx()

もう少し高度にゲームコントローラーを扱う [joyGetPosEx()](https://msdn.microsoft.com/ja-jp/library/cc410475.aspx) もあります。こちらもタイマーでポーリングするとよいでしょう。


```pascal:
var
  JoyInfoEx: TJoyInfoEx;
begin
  JoyInfoEx.dwSize  := SizeOf(JoyInfoEx);
  JoyInfoEx.dwFlags := JOY_RETURNALL;
  if joyGetPosEx(JOYSTICKID1, @JoyInfoEx) <> JOYERR_NOERROR then
    Exit;

  // 処理
end;
```

使い方は [joyGetPos()](https://msdn.microsoft.com/ja-jp/library/cc410473.aspx) とほぼ同じですが、[JOYINFOEX 構造体](https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd757112(v=vs.85).aspx) は初期化しておく必要があります。

[joyGetPosEx()](https://msdn.microsoft.com/ja-jp/library/cc410475.aspx) は 6 軸 32 ボタン + POV (Point Of View) のゲームコントローラーを扱えます。

# おわりに

DirectInput? RawInput(WM_INPUT)? ...いえ、知らない子ですね。
C++の例外クラスの自作

#はじめに
例外の差異に例外クラスを使ってthrowする必要を感じたので，どうしたら良いか調べようと思っても中々思ってる情報が出てこないので書きました．
C++はほぼ全くの初心者です．Better Cとして使ってます．
間違い等があればご指摘いただけると幸いです．

#意味
- throw "hogehoge";とするのは簡単だが，受け取った側は「あ，なんか例外来た．ユーザーに表示して終了しよう」くらいしかできない．
- あるいは握りつぶすか，タイミングで推測するか
- 受け取り側のプログラムにエラーの内容がわかるように例外を投げる→例外クラスを使う

#作り方
**コメントにて指摘があったので追記**

- std::exceptionを継承する**か，あるいはstd::runtime_errorを継承する**
- そうすることで，std::exceptionをcatchすることでまとめて捕まえることができて便利．(握りつぶしたいときとか，とりあえず全部キャッチしたいときとか)
- ~~std::exceptionはそのままではメッセージくらいしか出せない．e.what()で読める．~~ **→ これはMSの独自仕様らしい．std::runtime_errorなどは標準の仕様でメッセージが出せる．**
- デバッグする人間のためにe.what()で概要をつかめるようにすべき
- 追加のデータ構造は自分で持たせる

```cpp:
	class PCSCCommandException : public std::runtime_error
	{
	public:     //元々std::runtime_errorにある文字列↓   ↓追加の情報
		PCSCCommandException(const char *_Message, int res)
			: _Errinfo(res), runtime_error(_Message)
                                      //↑こうすることでwhat()で人間向けメッセージが読める
		{}

           //↓追加のエラー情報を返すGetter
		int returncode()
		{
			return _Errinfo;
		}
	private:
		int _Errinfo;
	};
```

- 本来こういうのは良くないのかもしれないが，自分は詳細なエラー情報を別途持たせたりしている．

```cpp:
	class PCSCStateException : public std::runtime_error
	{
	public:
		enum
		{
			FAILD_TO_ESTABLISH,
			NOT_CONNECTED_TO_SERVICE,
			NOT_CONNECTED_TO_READER,
			NOT_CONNECTED_TO_CARD,
			NO_READERS_AVAILABLE,
			FAILED_TO_DETECT_READER,
			FAILED_TO_GET_CARD_STATUS,
			READER_DISCONNECTED,
			UNKNOWN_STATUS,
			NO_CARD_FOUND,
			UNKNOWN_ERROR,
			FAILED_TO_DIRECT_CONNECTION,
			CARD_REMOVED,
		};

		PCSCStateException(const char *_Message, int errorcode, LONG ret)
			: _Errinfo(), runtime_error(_Message)
		{
			_Errinfo.errorcode = errorcode;
			_Errinfo.ret = ret;
		}

		int errorcode()
		{
			return _Errinfo.errorcode;
		}
		LONG returncode()
		{
			return _Errinfo.ret;
		}
	private:
		struct PCSCStateError_struct
		{
			int errorcode;
			LONG ret;
		};

		PCSCStateError_struct _Errinfo;
	};

```
星条旗のSVGファイルがスマートで良かった

Wikipediaにあったアメリカ合衆国の国旗である星条旗のSVGファイルがスマートで良かった。特に50個の星のところをgタグを使って効率良く生成してて良かった。

https://commons.wikimedia.org/wiki/File:Flag_of_the_United_States.svg

![800px-Flag_of_the_United_States.svg.png](https://qiita-image-store.s3.amazonaws.com/0/13740/91167780-9330-ccca-fa6d-d5d1272f80d5.png)

## 解説付きコード

```Flag_of_the_United_States.svg
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1235" height="650" viewBox="0 0 7410 3900">

<!-- 下地の赤 -->
<rect width="7410" height="3900" fill="#b22234"/>

<!-- 白いストライプ 矩形でなくて太い線で -->
<path d="M0,450H7410m0,600H0m0,600H7410m0,600H0m0,600H7410m0,600H0" stroke="#fff" stroke-width="300"/>

<!-- 星をのっける紺の四角 -->
<rect width="2964" height="2100" fill="#3c3b6e"/>

<!-- 星 -->
<g fill="#fff">

	<g id="s18">

		<g id="s9">

			<!--一番左の列の5個の星-->
			<g id="s5">
				<g id="s4">
					<path id="s" d="M247,90 317.534230,307.082039 132.873218,172.917961H361.126782L176.465770,307.082039z"/>
					<use xlink:href="#s" y="420"/>
					<use xlink:href="#s" y="840"/>
					<use xlink:href="#s" y="1260"/>
				</g>
				<use xlink:href="#s" y="1680"/>
			</g>

			<!--次の列の4個の星-->
			<use xlink:href="#s4" x="247" y="210"/>

		</g>

		<!--まとめて9個の星-->
		<use xlink:href="#s9" x="494"/>

	</g>

	<!--さらにまとめて18個の星-->
	<use xlink:href="#s18" x="988"/>

	<!--9個の星-->
	<use xlink:href="#s9" x="1976"/>

	<!--一番右の列の5個の星-->
	<use xlink:href="#s5" x="2470"/>

</g>

</svg>
```
星条旗だけじゃなくて他の国旗もだいたいスマートに書かれてる。
MongoDB + mongo-expressをDocker Composeでお手軽構築

## はじめに
Docker Composeを使用して、下記をお手軽構築します。

| S/W | 詳細|
|:-----------|:------------|
| MongoDB| NoSQLデータベース|
|mongo-express| MongoDB GUI管理ツール|

また、OSはUbuntu16.04を使用します。

参考:mongo-express画面
<img src=https://qiita-image-store.s3.amazonaws.com/0/194385/e65ea98e-4428-08b3-b454-f333c0f2f277.png width=50%>




## Step0. docker-composeインストール
docker-composeがインストールされていない場合、インストールします。

```bash
$ sudo apt-get update
$ sudo apt-get install docker-compose
```

## Step1. docker-compose.yml作成

```yaml:docker-compose.yml
version: '2'

networks:
  bridge:
    driver: bridge

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    environment:
      -  'MONGODB_USER=user' 
      -  'MONGODB_PASS=password!'
    volumes:
      - 'mongodb-data:/data/db'
    ports:
      - '27017:27017'
    command: mongod --smallfiles  
  mongo-express:
    container_name: mongo-express
    links:
      - 'mongodb:mongo'
    ports:
      - '8081:8081'
    environment:
      - 'ME_CONFIG_OPTIONS_EDITORTHEME=ambiance'
      - 'ME_CONFIG_BASICAUTH_USERNAME=user'
      - 'ME_CONFIG_BASICAUTH_PASSWORD=password!'
    image: mongo-express

volumes:
  mongodb-data: {}

```

## Step2. dockerコンテナ作成＆起動

```bash
$ sudo docker-compose up
```
MongoDBのコンテナと、mongo-expressのコンテナが作成＆起動します。

なお、mongoDBのデータは、下記に配置されます。
/var/lib/docker/volumes/(親ディレクトリ)_mongodb-data/

## Step3. 起動確認
1. ブラウザで下記URLにアクセスします。
http://localhost:8081

1. 認証を求められるので、下記を入力します。
ユーザ名：user
パスワード：password!

1. mongo-expressにログインできました！
<img src=https://qiita-image-store.s3.amazonaws.com/0/194385/d4050cbf-38ee-8546-268e-1864aa877e75.png width=50%>
Kindle Paperwhite マンガモデル(PW3-32)をJailbreakする&キャンペーン情報（広告）の削除

#Kindle Paperwhite マンガモデルの脱獄#
32GB仕様のKindle Paperwhiteで、日本でしか売っていません。
その為Jailbreak(脱獄)も進展がない状態が続いていたのですが、ついにknc1氏が脱獄方法を発見したのでメモ。

**注意**
端末のroot領域をいじるため、下手をするとbrick(文鎮化)します。
知識がある方、brickを直す方法を知っている方のみ下記手順を実行してください。

##動作確認済機種##
PW3-32, キャンペーン情報付きモデル
(もちろんキャンペーン情報無しでも可能です）

##1. Jailbreak手順##
**①OTA(Wi-Fi経由のアップデート）をブロック**
　端末をPCに接続し、トップレベルのディレクトリに **update.bin.tmp.partial** というフォルダを作成

**②ファクトリーファームウェアをダウンロード**
　[update_pw3_factory_5.8.9.0.1.bin](https://pan.baidu.com/s/1jH4rMsA) をダウンロードします。
　（アクセス→下戴だけではダウンロードできないので、Tampermonkeyに [こちら](https://redirect.viglink.com/?format=go&jsonp=vglnk_151723987318014&key=d0c4501c26bc8abf83c7e1774a20d875&libId=jd0dfz2001000fpu000DA3rf15ohj&loc=https%3A%2F%2Fzukfans.eu%2Fcommunity%2Fthreads%2Fhow-to-download-pan-baidu-com-links-directly-from-idm.1944%2F&v=1&out=https%3A%2F%2Fgreasyfork.org%2Fen%2Fscripts%2F26638-ex-%25E7%2599%25BE%25E5%25BA%25A6%25E4%25BA%2591%25E7%259B%2598&ref=https%3A%2F%2Fwww.google.co.jp%2F&title=%5BHOW%20TO%5D%20Download%20PAN.BAIDU.COM%20Links%20directly%20from%20IDM%20%7C%20ZUK%20Fans%20Europe&txt=here) のスクリプトをインストールの上ダウンロード）

**③ファクトリーファームウェアの書き込み**
　端末のトップレベルに上記ファイルをドラッグアンドドロップ。
　Kindleよりアップデートを実行。

**④Jailbreak**
　[Update_jailbreak_hotfix_1.14_nomax_install.bin](https://www.mobileread.com/forums/attachment.php?attachmentid=158236&d=1501804569) をダウンロード、
　③の要領でアップデートを実行。

**⑤最新ファームウェアへのアップデート**
　[Amazon公式ファームウェア](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201756220) をダウンロードし、
　③の要領でアップデート。


##2. キャンペーン情報（広告）の削除##
<font color="red">こちらに関しては動作確認をしていません。（Amazonに怒られるかも）　自己責任でお願い致します。</font>

**①必要ツールのインストール**
　[こちら](http://soranoji.air-nifty.com/blog/2016/07/kindlejailbre-2.html)の **第8世代** を参考にKUAL, Helper, MR Package Installerをインストールします。

**②Terminalをダウンロード**
　こちら より[kterm](https://www.fabiszewski.net/kindle-terminal/) (kindle用のターミナル）をダウンロード、
　解凍後、extensionsフォルダにドラッグアンドドロップします。

**③キャンペーン情報の削除**
　KUALよりktermを実行、

```bash:kterm
cd /var/local/
rm -r adunits/ merchant/
sqlite3 appreg.db "delete from properties where handlerid='dcc' and name='adunit.viewable'"
sqlite3 appreg.db "delete from properties where handlerid='dcc' and name='dtcp_pref_ShowScreensaverPref'"
sqlite3 appreg.db "delete from properties where handlerid='dcc' and name='dtcp_pref_ShowBannerPref'"
reboot
```
を実行します。

追記：ちなみにその他キャンペーン情報は、ルートディレクトリ/system/.assets にある模様です。

###参照###
[Removing Ads From the Kindle PW2](https://www.binaryspawn.com/4/) by Nicholas Kuckuck
[PW3-4, PW3-32, fw-5.8.9.0.1 software jailbreak](https://www.mobileread.com/forums/showthread.php?t=291336) by knc1
[ドイツ語の本読んでみ・・](http://soranoji.air-nifty.com/blog/2016/07/kindlejailbre-1.html)
[Python]WEBスクレイピングで取得した色んなフォーマットの日付の文字列からdatetime型に変換する方法

#WEBスクレイピングで取得した色んな形の日付のデータをdatetime型に変換する方法です。

まずは一般的な形から

```python
from datetime import datetime as dt

today = '2018/01/9 18:55:20'
tdatetime = dt.strptime(today,'%Y/%m/%d %H:%M:%S')
print(tdatetime)

# 2018-01-09 18:55:00

```

漢字の表記だったとしても使い方は一緒です。

```python
from datetime import datetime as dt

today = '2018年01月9日18時55分'
tdatetime = dt.strptime(today,'%Y年%m月%d日%H時%M分')
print(tdatetime)

# 2018-01-09 18:55:00

```


よくある西暦が2桁の場合、%Yを%yに変えれば大丈夫です。

```python
from datetime import datetime as dt

today = '18/01/9 18:55:20'
tdatetime = dt.strptime(today,'%y/%m/%d %H:%M:%S')
print(tdatetime)

# 2018-01-09 18:55:20

```

よく使うフォーマットは暗記しちゃいましょう。

| ディレクティブ     |       意味 |    使用例    |
|:-----------------|:------------------|:------------------|
| %y             |              0埋めした10進数で表記した世紀ありの年。 |        00, 01, …, 99|
| %Y           |            西暦 ( 4桁) の 10 進表記を表します。|       2016, 2017, 2018       |
|%m             |             0埋めした10進数で表記した月。 |        01, 02, 03|
| %d               |                0埋めした10進数で表記した月中の日にち。 |         01, 02, …, 31         |
| %H             |             0埋めした10進数で表記した時 (24時間表記)。 |       00, 01, …, 23       |
| %I          |           0埋めした10進数で表記した時 (12時間表記)。 |   01, 02, …, 12    |
| %M         |          0埋めした10進数で表記した分。 |    00, 01, …, 59    |
| %S     |        0埋めした10進数で表記した秒。 |    00, 01, …, 59     |


[8.1. datetime — 基本的な日付型および時間型](https://docs.python.jp/3/library/datetime.html)
JavaScriptのsomeとeveryがすごく便利

every someがすごく便利だったのでメモ

## every
everyは配列が条件をすべて満たす場合にtrueを返す
* 間違いがありましたので修正致しました
@syon さんありがとうございます！

```js:every.js
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr.every(value => value > 0)
// return true

arr.every(value => value < 5)
// return false

```

ただreturnを返すだけでも大丈夫

```js:return.js
const arr = ['hello', true, 1]

arr.every(value => {
  return value //分かりやすいようにあえてreturn
})
// return true

const arr = ['hello', true, 0 /* JSは0をfalseとみなす */]
arr.every(value => {
  return value
})
// return false
```

## some
someは配列が条件を一つでも満たしていればtrueを返す

```js:some.js
const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr.some(value => value < 10)
// return true

arr.every(value => value > 11)
// return false
```

先ほどと同じ通り、returnを返すだけでも大丈夫

```js:return.js
const arr = [false, null, 1]

arr.some(value => {
  return value
})
// return true

const false_arr = [false, null, 0]
arr.every(value => {
  return value
})
// return false
```

### 使い所
everyはフォーム等の**必須条件**とかに使えそう
someは各条件、一つでも満たせば良い所とか(コンタクトフォームとか？)

### 質問
ずっと`for (var i = 0; i < arr.length; i++)` とか使ってたのですが `map` とかと比べてパフォーマンス変わるんですか？
vSphere6.5.X のパッチ適用

vSphere6.5.x のESXi に対して、コマンドでパッチを適用する時の流れを自分自身の備忘を兼ねて記載。

## 環境
* vSphere 6.5.x

## 手順

1. 現在のESXi のバージョン確認
　　vmware -v

2. パッチのダウンロードサイト
　 https://my.vmware.com/ja/group/vmware/patch#search

3. ダウンロードしたパッチをデータストアへアップロード　　

4. ESXiホストをメンテナンスモードへ変更
　vim-cmd hostsvc/maintenance_mode_enter

5. パッチファイルのプロファイル確認
　esxcli software sources profile list --depot=/vmfs/volumes/datastore1/Update/ESXi650-20171211.zip

6. パッチの適用
　sxcli software profile update -d /vmfs/volumes/datastore1/Update/ESXi650-20171211.zip -p ESXi-6.5.0-20170304101-standard
IntelliJ Ideaのキャッシュを消す方法

IntelliJ Ideaのバッドノウハウの紹介です。

たまにIntelliJ Ideaのキャッシュがおかしくなって、エディタ上ではコンパイルエラーが発生してないが、実行時に NoSuchMethod エラーが発生することがある。↓こんな感じ。

<img width="1041" alt="msm____work_msm__-_____src_main_kotlin_bukken_ui_Routes_kt__msm_main_.png" src="https://qiita-image-store.s3.amazonaws.com/0/529/ad261235-14f3-2469-93b6-d89bd3a4fae6.png">

こうなってしまうとIntelliJ Ideaを再起動しても治らず、キャッシュを消すしかない。

まず IntelliJ Ideaを終了する。

次にキャッシュディレクトリを消します。
Macなら ~/Library/Caches/IdeaICXXXX.X というディレクトリを消す。
Windowsなら、\Users\ <USER ACCOUNT NAME> \ .IdeaICXXXX.X\system というディレクトリを消す。

これで IntelliJ Idea を起動しなおすと、エラーが起こらなくなる。

<img width="941" alt="msm____work_msm__-_____src_test_kotlin_bukken_save_SaveBukkenProfileSpec_kt__msm_test_.png" src="https://qiita-image-store.s3.amazonaws.com/0/529/9d5d1a3a-67f7-0f70-e657-9153b700c73a.png">

コンパイルエラーがないのに実行時エラーになってしまって、おかしいなと思ったときに試してみて下さい。

# 追記

より良く解決できるバッドノウハウ情報いただきました！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">キャッシュディレクトリ消すのが一番確実だけど、FileメニューのInvalidate Caches / Restart…でも似たようなことできますよ。<br>|qω・`)ﾁﾗｯ <a href="https://t.co/juD0VVRfQz">https://t.co/juD0VVRfQz</a></p>&mdash; いまいまさのぶ (@masanobuimai) <a href="https://twitter.com/masanobuimai/status/958096257997717504?ref_src=twsrc%5Etfw">2018年1月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 参考

[Directories used by the IDE to store settings, caches, plugins and logs](https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-store-settings-caches-plugins-and-logs)
Bashで引数込みの二重起動防止シェルを1行で

#概要
Cronで動かすシェルで二重起動防止が必要になった。シェル内ではさらに他言語のバッチを起動している。バッチ稼働が長引いた際の対応。

#要件
・シェルの二重起動を抑止
・但しシェルの引数が違う場合、起動できる
・既存のシェルを書き換えるのは嫌
・cronのみ二重起動を抑止できれば良い。手動でシェルを叩く場合は起動するが、有識者が行っている為考慮しない

#どうしよう
・プロセスIDを引数込みで検索し存在すればを抑止
・二重起動防止の為だけのシェルを作りcronの設定ファイルに仕込む

#こうなった

```bash:/home/user/bin/single
#!/bin/bash -ue
[ "$$" -ne $(pgrep -fo "$0 $*") ] && exit 1 || eval $*;exit $?
```

あっ、1行とちゃう、2行や。
「single "シェルパス 引数"」これで起動。

##ログ出力の場合
```bash:
#!/bin/bash -ue
func_message() { echo '[INFO] already process is running [${1}]';exit 1; }
[ "$$" -ne $(pgrep -fo "$0 $*") ] && func_message "$*" || eval $*;exit $?
```

#設定をする
二重起動防止の下駄をはかせる。実行権限。

```bash:
chown user. /home/user/bin/single
chmod 750 /home/user/bin/single
```

```bash:before
/etc/crontab
* 2 * * * user /home/admin/sh/backup.sh Mantenace Backup
*/5 * * * * user /home/user/sh/getmessage.sh partner 
*/5 * * * * user /home/user/sh/getmessage.sh employee
*/5 * * * * user /home/user/sh/putmessage.sh partner 
*/5 * * * * user /home/user/sh/putmessage.sh employee
・・・
```
```bash:after
/etc/crontab
* 0 * * * user /home/admin/sh/backup.sh Mantenace Backup
*/5 * * * * user /home/user/sh/single "/home/user/sh/getmessage.sh partner"
*/5 * * * * user /home/user/sh/single "/home/user/sh/getmessage.sh employee"
*/5 * * * * user /home/user/sh/single "/home/user/sh/putmessage.sh partner"
*/5 * * * * user /home/user/sh/single "/home/user/sh/putmessage.sh employee"
・・・
```

#参考
https://qiita.com/nao58/items/bdf97826a3683ccd63fb

#尚、
cron が sh起点で動いている場合は pgrepで取得できるプロセスIDが変わる。
親psIDを取ってきているため。

```bash:
#[ "$$" -ne $(pgrep -fo "$0 $*") ] && exit 1 || eval $*;exit $?
[ "$$" -ne $(pgrep -fo "`cat /proc/$$/cmdline | xargs --null`)") ] && exit 1 || eval $*;exit $?
```
JavaのOptionalとガード節を共存させてみた


Java SE 8のOptionalはガード節と相性が悪いのが悩みどころですが、
何とかガード節と共存できないかなと考えて作ってみました。

```java
package com.ikemo3;

import java.util.Optional;

public class Main {

    public static void main(String[] args) {
        System.out.println(Main.sqrt("16"));
        System.out.println(Main.sqrt("-16"));
        System.out.println(Main.sqrt("str"));
    }

    public static String sqrt(String str) {
        return Optionals.of(str, String.class)
                .guard((s) -> toInteger(s), () -> "整数ではない")
                .guard((i) -> sqrt(i), () -> "正の数ではない")
                .get((d) -> String.valueOf(d));
    }

    /**
     * 値が正なら整数にする
     */
    public static Optional<Integer> toInteger(String str) {
        try {
            return Optional.of(Integer.valueOf(str));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }

    /**
     * 値が正なら平方根を取る
     */
    public static Optional<Double> sqrt(int i) {
        if (i >= 0) {
            return Optional.of(Math.sqrt(i));
        } else {
            return Optional.empty();
        }
    }
}
```

出力結果は以下のようになります。

```
4.0
正の数ではない
整数ではない
```

呼び出し方はこんな感じです。
だいたいガード節っぽく見えるかなと。

```java
    public static String sqrt(String str) {
        return Optionals.of(str, String.class)
                .guard((s) -> toInteger(s), () -> "整数ではない")
                .guard((i) -> sqrt(i), () -> "正の数ではない")
                .get((d) -> String.valueOf(d));
    }
```

クラスの実装は次の通り。

```java
package com.ikemo3;

import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;

public class Optionals<IN, RET> {
    private final IN value;
    private final RET elseValue;
    private final Class<RET> clazz;

    public static <IN, OUT> Optionals<IN, OUT> of(IN value, Class<OUT> clazz) {
        return new Optionals(value, clazz);
    }

    private Optionals(IN value, Class<RET> clazz) {
        this.value = value;
        this.clazz = clazz;
        this.elseValue = null;
    }

    private Optionals(RET elseValue) {
        this.value = null;
        this.clazz = null;
        this.elseValue = elseValue;
    }

    public <OUT> Optionals<OUT, RET> guard(Function<IN, Optional<OUT>> func, Supplier<RET> elseValue) {
        if (this.elseValue != null) {
            return new Optionals(this.elseValue);
        }

        Optional<OUT> result = func.apply(this.value);
        if (result.isPresent()) {
            return Optionals.of(result.get(), this.clazz);
        } else {
            return new Optionals(elseValue.get());
        }
    }

    public RET get(Function<IN, RET> func) {
        if (this.elseValue != null) {
            return this.elseValue;
        } else {
            return func.apply(this.value);
        }
    }
}
```
ReactでHelloWorld

# ローカル環境構築

## 1. ディレクトリ作成する

```
$ mkdir reactApp
$ cd reactApp
```


## 2. npm初期化

```
$ npm init -y
```
`-y`で自動的にyesしてくれる (`-f` `--force` と同義)


## 3. Javascriptのビルド関連パッケージを入れる

```
$ npm i --save react react-dom
$ npm i -D babel-core babel-loader babel-preset-es2015 babel-preset-react
$ npm i -D webpack webpack-dev-server
```
面倒なのでまとめておりゃっと
dependenciesとdevdependenciesは分けてみた


## 4. babel設定

```
$ touch .babelrc
```

```json:.babelrc
{
  "presets": ["react", "es2015"]
}
```


## 5. webpack設定

```
$ touch webpack.config.js
```

```webpack.config.js
module.exports = {
  entry: './app.js',
  output: {
    path: __dirname + './dist',
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      }
    ]
  }
}
```

ブラウザリロードタスクも設定追加

```package.json
...
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack",
    "start": "webpack-dev-server --hot --inline"
  }
...
```
`npm run build`でビルド
`npm start`で自動リロードしてくれる


## 6. React実装

```app.js
import React from 'react'
import ReactDOM from 'react-dom'

class App extends React.Component{
  render(){
    return(
      <div>Hello World</div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("content"))
```

```html:index.js
<html lang="jp">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>React Document</title>
</head>
<body>
  <div id="content"></div>
  <script src="./dist/bundle.js"></script>
</body>
</html>
```
`<body />`以外はテキトーに

## 7. 実行

```
$ npm run build
$ npm start
```
正常にstartしたらブラウザで`http://localhost:8080`で確認できる
バイナリデータを1バイトごとに16進数の文字列で扱えるようにする

シェルスクリプトでIoTをやるには[シリアルポートさえ読めればいい](https://qiita.com/miminashi/items/4028eb2365cc23efa02d)ということに気づいたのですが、世の中そんなに甘くはなかった。
シリアルポートでパソコンやIoTゲートウェイに接続される測定器やセンサの中には、データを改行（CR/LF/CRLF）区切りの文字列でくれないものもたくさんあります。
そういったものはASCIIコードとは縁もゆかりもない、1ビット1ビットに丹精に意味が込められた無慈悲なビット列が流れてきます。（シリアル通信の時点で1バイト単位にはなってはいるけれど）

`cat`で簡単にシリアルポートからデータが読み出せるといっても、流れているのが改行区切りのテキストではないとすると、シェルスクリプトでもバイナリを扱える必要が出てきます。
1バイトずつ16進数の文字列に変換してしまえばなんとかなるのでは？と思い、まずはその変換をやってみることにしました。

最初、`od`コマンドをつかって、以下のようにしようとしました。

```sh
cat binary_data | od -vtx1 -An | tr -s ' ' '\n'
```

ところが、`od`が出力をバッファリングしているようで、ファイルに保存済みのバイナリデータを変換するのはうまくいくけれど、1バイトずつリアルタイムに16進数のテキストに変換されてほしいので、これではあまり意味がない。

POSIXコマンドでできる範囲ではどうやら無理そうだったので、諦めてCで短いコードを書きました。（Cは経験があまりないのでこれでいいのかよくわからない・・・）
フォーマットが`%02x`になっているのは、1バイトあたり2文字の固定長になるようにしたいからです。

```c:byte2hex.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
  unsigned char buf[1];

  while(read(0, buf, 1) > 0) {
    printf("%02x\n", buf[0]);
    fflush(NULL);
  }

  return 0;
}
```

コンパイルは以下の通り。

```shell-session
c99 byte2hex.c -o byte2hex
```

1バイト（0x41 = "A"）を16進数文字列に変換してみる。

```shell-session
$ printf "%b" "\x41" | ./byte2hex
41
```

1秒おきに連続でデータを流してみる

```shell-session
$ while :; do printf "%b" "\x41"; sleep 1; done | ./byte2hex
41
41
41
41
41
```

さらに後ろに別のコマンドをパイプで繋いでもちゃんと流れてくる

```shell-session
 while :; do printf "%b" "\x41"; sleep 1; done | ./byte2hex | tee /dev/null
41
41
41
41
41
```

1バイトが3バイト（2文字+LF）になるのでデータ量は3倍になってしまいますが、これでバイナリを1バイト1行のストリームとして扱えるようになりました。

<!--
# なんでバイナリが流れてくるんだよという話

測定器やセンサなどのハードウェアは当然ハード屋さんがつくっているわけですが、ハードウェアというのは数を売ってなんぼで、安い部品を使って1セットあたりの原価を下げれば下げるほど儲けが多くなります。
そうなるとCPUにしても安ければ安いほどよいわけで、必要最小限のリソースを持ったCPUを使うので、当然扱うデータ量が少なければ少ないほどいいわけです。
CPUだけでなく、通信も同じことで、通信速度を上げれば上げるほど、回路は難しくなり、高品質な伝送路が要求されます。
`{"temp": 21.85}`などのように単精度の浮動小数を表すのに120bitも使っても1週間早くコードが完成するほうが褒められるITの世界とはコストの成り立ち方が根本的に違うわけです。
-->
はてなブログにSeakerDeckのスライドをページ番号を指定して埋め込む

```html
<iframe class="speakerdeck-iframe" frameborder="0"
 src="//speakerdeck.com/player/{スライドID}?slide={表示したいスライド番号}" 
allowfullscreen="true" mozallowfullscreen="true" 
webkitallowfullscreen="true" 
style="border: 0px; background: transparent; margin: 0px; padding: 0px; border-radius: 5px; width: 560px; height: 482px;"></iframe>
```

以上のコードをはてなブログのMarkdown形式にて埋め込む。
SpringBoot 2.0 + Java9 の試作アプリ作成しました

# 更新履歴

|日付|内容|
|:--|:--|
|2018.01.29|Spring Boot 2.0 M7 にて作成|
|2018.02.10|Spring Boot 2.0 RC1 にて作成|
|2018.02.25|Spring Boot 2.0 RC2 にて作成|
|2018.03.01|Spring Boot 2.0 GA にて作成|
|2018.05.12|Spring Boot 2.02 にて作成|
|2018.06.30|Spring Boot 2.03 にて作成|

# はじめに
既存アプリのSpringBoot 1.5 -> 2.0化に失敗したので、
ひとまず新規でWebApiを作成することにしました。
課題は山積みですが、いったんは表題の組み合わせで動作しております。
Java9化を進めたいかたには参考になるかと思います。
※Java9化の鍵は[build.gradle](https://github.com/mabubu0203/ItemControl/blob/master/build.gradle)に集約されております。

- FW
    - ~~Spring Boot 2.0 M7~~
    - ~~Spring Boot 2.0 RC1~~
    - ~~Spring Boot 2.0 RC2~~
    - ~~Spring Boot 2.0 GA~~
    - ~~Spring Boot 2.02~~
    - Spring Boot 2.03
- Libraries
	- Flyway
	- Lombok
	- SpringDataJpa
	- SpringFox
- JDK
	- 9.0.4(Oracle)
- Build
    - ~~Gradle 4.5.1~~
    - ~~Gradle 4.6~~
    - ~~Gradle 4.7~~
    - Gradle 4.8.1
- IDE
    - ~~IntelliJ IDEA Community 2017.3~~
    - IntelliJ IDEA Community 2018.1

[サンプル・コード](https://github.com/mabubu0203/ItemControl)

# 乗り越えていない課題

## modelmapper
skipしたいけどうまく動かない。。。

## module-info.java
作成していません。
なので起動引数に今後削除予定のものを記載しています。

## SpringFox DataRest
2.9で動かない。。。

## メタモデルクラス
IntelliJでの設定方法わからず断念しました。(java9とは関係ない)

# つまづいた箇所

## Actuator
yamlで定義するプロパティ値がかなり変更されているようです。
以前出力していた内容がどれに対応しているか把握しきれていません。

## javadoc
build.gradleのサンプルがみつからず、1時間ほどかかりました。

```groovy:build.gradle
tasks.withType(Javadoc) {
    doFirst {
        options.addStringOption('-add-modules', 'java.xml.bind,java.xml.ws.annotation')
    }
}
```

※ "module-info.java"作成したらこの箇所は変更する気が

## JAXB
[Spring Boot with Java 9](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9)に記載あるように、dependencyに追加すればよいです。
ですが、issuesに上がっているので手で書かなくもよくなるかも？
[Provide dependency management for JAXB as it's not provided with Java9 anymore](https://github.com/spring-projects/spring-boot/issues/11205)

```groovy:build.gradle
compile("javax.xml.bind:jaxb-api:2.3.0")
```

## junit5化
ライブラリのversionを4.x -> 5.xにするのかと思ってましたが違うようですね。

```groovy:build.gradle
// Junit 5
testCompile("org.junit.platform:junit-platform-launcher:1.1.1")
testRuntimeOnly("org.junit.platform:junit-platform-engine:1.1.1")
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
```

## lombok
~~1.16.18 -> 1.16.20 に変更したらあっさり解消しました。
ただ、着手開始時には1.16.20はリリースされていませんでしたので、解消されない時間が存在しています。

Spring Boot 2.0 RC1のdependency-managementにより、
lombokはデフォルトで1.16.20を取得するようになりました。
なので依存関係のバージョンをbuild.gradleに手入力せずともjava9化できるようになりました。

## Optional
nullでない時に例外投げたい。。。
下記記載方法はダサい。

```java
Optional<GoodsTbl> optionalCode = service.findByCode(goodsCode);
if (optionalCode.isPresent()) {// goodsCode(unique制約)の存在チェック
    throw new ConflictException("goodsCode", "CODEが重複しています。");
}
```

## O/R Mapper
flyway、mysql5.7、SpringDataJPAの組み合わせで起動中に大量の警告が出ていました。
現在は警告消しているので、どこかの記述が誤っている可能性がかなり有ります。
時間のある時に調査したいです。

```groovy:build.gradle
// Flyway
compile("org.flywaydb:flyway-core")
testCompile("org.flywaydb.flyway-test-extensions:flyway-spring-test:5.0.0")
```

# 今後の取り組み
1. CRUDの残りの機能の作成
2. リファクタリング
3. 続)SpringBoot 2.x対応
4. Testの追加
5. Productの追加
goで構造体内に定義した配列をネストして値を取得するやり方

構造体内に別構造体の配列を定義して、その配列がネストしていくようなイメージのものを作って再帰的に値を取り出してみたかったので試してみました。

# イメージ

やりたかったのは、配列の中に配列が...さらに配列が...のようなイメージのものをやってみたかった。
pythonで言うと以下のようなイメージ(ざっくり感がパない)

```python:example.py
#!/usr/bin/env python3
array = [1, 2, 3]
array2 = [4, 5, 6]
array3 = [7,8,9]
array2.append(array3)
array.append(array2)

print(array)

def rec(a):
    for i in a:
        if(isinstance(i, list)):
            rec(i)
        else:
           print(i)

for i in array:
    if(isinstance(i, list)):
        rec(i)
    else:
       print(i)
```
これを実行すると以下のような結果になります。
~~classを作ってやったほうがイメージが近いのではと思いましたがめんd~~

```
$ ./example.py
[1, 2, 3, [4, 5, 6, [7, 8, 9]]]
1
2
3
4
5
6
7
8
9
```

ようは、配列の要素を一つずつ取り出して行ってもし配列型だった場合は再度forを回して再帰的に値を取得していくものがGoで実装したかった！！

# 使用する構造体について

ここでは `Test` と `ChildTests` の構造体を例にしてみたいと思います。
Testの `Nameフィールド` で定義した名前を親にして、それの子を `ChildTestsフィールド` に定義していく形にします。

```go
type Test struct {
	Name       string
	ChildTests []ChildTests
}

type ChildTests struct {
	Name       string
	ChildTests []ChildTests
}
```

ChildTests構造体の `ChildTestsフィールド` は自身のスライスを定義しているので以下のようにネストするような実装が可能になります。

```go
s := []Test{
    Test{
        Name: "HOGE",
        ChildTests: []ChildTests{
            ChildTests{
                Name: "FUGA",
                ChildTests: []ChildTests{
                    ChildTests{
                        Name: "HIGE",
                    },
                },
            },
        },
    },
}
```

# 実装例

親には `HOGE` と `Taro` を指定して、それぞれの子を設定して実行してみます。
`Test構造体` のスライスを作って `RecursiveCall` 関数に渡して子が1個以上ある場合は `GetChild` に渡して再帰的に値を取得しています。
`GetChild` の引数は `interface` として受け取って `reflect` を駆使してやってみました。。。

```go:main.go
package main

import (
	"fmt"
	"reflect"
)

type Test struct {
	Name       string
	ChildTests []ChildTests
}

type ChildTests struct {
	Name       string
	ChildTests []ChildTests
}

func GetChild(ts interface{}, c int) {
	s := reflect.ValueOf(ts)
	v := reflect.Indirect(s.Index(0))
	t := v.Type()
	for i := 0; i < t.NumField(); i++ {
		if t.Field(i).Name == "Name" {
			c += 2
			for i := 0; i < c; i++ {
				fmt.Print(" ")
			}
			fmt.Println(v.Field(i).String())
		}
		if t.Field(i).Name == "ChildTests" && v.Field(i).Len() > 0 {
			GetChild(v.Field(i).Interface(), c)
		}
	}
}

func RecursiveCall(t []Test) {
	for _, i := range t {
		fmt.Println(i.Name)
		if len(i.ChildTests) >= 1 {
			GetChild(i.ChildTests, 0)
		}
	}
}

func main() {
	s := []Test{
		Test{
			Name: "HOGE",
			ChildTests: []ChildTests{
				ChildTests{
					Name: "FUGA",
					ChildTests: []ChildTests{
						ChildTests{
							Name: "HIGE",
							ChildTests: []ChildTests{
								ChildTests{
									Name: "HHH",
								},
							},
						},
					},
				},
			},
		},
		Test{
			Name: "Taro",
			ChildTests: []ChildTests{
				ChildTests{
					Name: "Hanako",
				},
			},
		},
	}
	RecursiveCall(s)
}
```

# 実行結果

子がある場合は、スペースでインデントを入れています。

```
$ go run main.go
HOGE
  FUGA
    HIGE
      HHH
Taro
  Hanako
```

今回は、結構力任せでやっていますが期待していたことが出来たのでひとまずこれでよしとしよう。。。
WebpackとRollupを比べてみて

JavaScriptの依存関係を処理するバンドラとしてWebpackやRollupなど、いくつかのものが存在しています。今回は、この2つを比較してみました。

# CommonJSとES6 Module

まず、WebpackとRollupの話に入る前に、JavaScriptに2種類存在するモジュールシステムについて説明します。

もともとブラウザ用ということもあって、JavaScriptにモジュール化の仕組みはなかったのですが、Node.jsなど他の環境でJavaScriptを使うのにあたって、「ないと困る」ということになったようなこともあり、`require`と`module.exports`を使ったモジュールシステムであるCommonJSが制定されました。

その後、JavaScript自体にもES6で`import` / `export`の仕組みが導入されましたが、両者は（変換して相互運用できなくはないのですが）別物となっています。

特に、1つのモジュールから大量のプロパティを出しているような場合、CommonJS形式では全部エクスポートするしかなかったのですが、ES6 Moduleでは使用しているモジュールが静的に判定できるので、Tree Shakingなどをやりやすくなっています。

# 両者の違い
## ネイティブなモジュールシステム

Webpack 1ではCommonJSしか認識できず、ES6 Moduleで書かれたものはBabelなどで下処理しないと処理不能だったのですが、Webpack 2以上ではES6 Moduleも認識できるようになっています（BabelのES6 Module変換は止めておく必要があります）。

一方、RollupはES6 Moduleだけをネイティブに実装していて、CommonJSの処理にはプラグインが必要です。

## ESのバージョン

Webpackの場合、Webpack 2以上ではES6も通せるはずなのですが、`babel-loader`でES5に変換してから読み込むのが一般的な使用法となっています[^1]。一方、RollupはJavaScriptとしてもES6が前提になっていて、ES5にしたい場合は出力時にBabelを通します。

この違いが目立つのは、`class`や`...`など、ES5に変換しようとすれば補助関数が必要になるようなコードです。モジュールごとに変換をかけるWebpackでは、同じ関数があちこちに作られてしまいます。一方、Rollupでは全体に1つで済みます。

## 名前空間の扱い

Webpackでは「ファイルの名前空間を、関数を使って再現する」という方針を取っています。一方で、Rollupでは「名前の衝突はリネームで解決して、フラットな空間に開く」という形になっています。

そのため、コードサイズ的にはRollupのほうが有利なのに対して、「ファイル分割」や「動的ロード」といった、モジュール間を疎結合にするような動作についてはWebpackが有利となります。

## JavaScript以外の扱い

WebpackはJavaScript以外のCSSや画像に関しても活用されていますが、Rollupは基本的にJavaScriptの処理用となっています。

[^1]: Webpackでも、出力時にUglifyES経由でES5にする、というアプローチがありそうではありますが、ローカル環境ではそうもいかなさそうですし、Babelでさらにtransformを差し込みたい場合は、またややこしいです。
Sprite EditrのEdit Physics Shapeを使って、SpriteのColliderエッジを調整する

　この投稿では、Unityゲームエンジンにおいて、Sprite EditrのEdit Physics Shapeを使って、SpriteのColliderエッジを調整する方法を紹介します。

　次の画像はSpriteRendererにPolygonColliderを付与した様子です。Colliderのエッジは画像の淵に設定されています。

![sprite_renderer_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/939b0cd2-ffb4-0a7b-b92a-b21443ff6fc3.png)

　次の画像はTilemapにTilemapColliderとCompositeColliderを付与した様子です。ColliderのエッジはTileの淵に設定されています。

![tile.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/8ba9ac00-ee46-c454-ced9-281e033c86d8.png)

　このColliderの形状では、画像中の壁にキャラクターなどが埋まってしまうように見えてしまい問題があります。Colliderのエッジを画像やTileのふちではなく、次の画像のようにSprite中の壁に沿うように設定したいです。

　改善後のSpriteRenderer。

![sprite_renderer.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/373e5ab4-edb2-c324-9d53-8034bd9ac04c.png)

　改善後のTilemap。

![tile2.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/4c470629-9ae1-011f-7108-ef861f62471a.png)

　これを実現するには、Sprite EditrのEdit Physics Shapeを使って、SpriteのColliderエッジを調整すれば可能です。

　Project Windowで対象画像を選択、Inspector上のSprite Editorボタンを押し、Sprite Editr Windowを開きます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/8e794328-4c7d-1ace-c629-f79af556ab98.png)

　そしてSprite Editor Windowの左上部「Spite Editor」というタブを押し、ドロップダウンよりEdit Physics Shapeを選択してください。

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/7dc28826-1632-be90-0e13-4846b2a8333f.png)

 そうすると次のようにEdit Physics Shapeモードになり、Spriteの四隅に白い四角が表示されます。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/fcc0cd4c-61ab-eecd-8368-e199f925b4e9.png)

　この白い四角と白い四角が結ぶ線がColliderのエッジとなります。この白い四角を次のGifのように動かしApplyボタンを押すことで、Colliderのエッジを調整できます。

![SpriteEditorShapePhysics.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/8245a559-2db8-2f3c-e134-23be62807939.gif)

　次のSpriteのColliderのエッジを調整しましょう。この画像の場合はColliderの頂点が4個ではたりません。頂点を追加するには、この白い四角と白い四角が結ぶ線の間をクリックすると頂点を追加することができます。

![SpriteEditorShapePhysics.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/d8cdf042-9157-8ac6-a33b-37c422d4596b.gif)

　このようにSprite EditrのEdit Physics Shapeを使って、SpriteのColliderエッジを調整することで目的のColliderの形状を得ることができます。

![tile2.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/4c470629-9ae1-011f-7108-ef861f62471a.png)

　また透過背景をもつSpriteであれば、Snapボタンを押すと、非透過部の形状にそってエッジを自動的に設定してくれます。こちらも合わせて覚えておくことをお勧めします。
MS Excelでanything.elやpecoのように絞込でファイルを開けるマクロを作ってみた


## MS Excel でのファイルオープン周りの不満
Excelはどの業界においても広く業務に使われているソフトだと思います。
私も業務でほぼ毎日といっていいほど使っていますが、その頻度故に細かいインターフェースの手になじまなさが気になってきてしまいます。
私の場合は特にファイルのオープン周りの不満が大きく感じており、例えば…

+ 同時に開いているファイルの切り替えが簡単に行えない（ショートカットだと切り替えにくい、Alt+TABだと他のソフトも対象になる）
+ ファイルを開く際にバックステージを経由する（Ctrl+Oで直接ダイアログを開くこともできますが）
+ 最近使ったファイルはバックステージ経由でしか開けない(Alt+F+Rで楽だが決定にマウスが必要)

などなど、キーボードだけではどうにも完結し難いというのが気になっています。
というわけで、簡素ですが、peco 、anything.el 等のような絞込インターフェースでファイルが開けるマクロを作りました。

## できる事
Excelでファイル名を絞込ながらファイルを開く、あるいは開き済みのファイルの切り替えができます。
具体的にはスクリーンショットのイメージを参考にしてください。


![anim.gif](https://qiita-image-store.s3.amazonaws.com/0/54981/1b2ad5f8-daf0-e138-ba54-d0c9a9462203.gif)

## 公開場所
<https://github.com/simacho/excel_file_opener>

## インストール方法
+ 上記の場所から、ExcelFileOpener.xlam をダウンロードします。
+ Excelで、ファイル→オプション→アドイン→設定→参照を選び、ダウンロードしたマクロを指定します

以上で完了です

## 利用方法
デフォルトでは以下のショートカットに設定します。

- Ctrl+Shift+a  現在開いているブックのフォルダを起点に開くファイルを選択します
- Ctrl+Shift+r  現在開いているブックのフォルダから再帰的に探索しファイルを選択します
- Ctrl-Shift+m  最近使ったファイルから開くファイルを選択します。
- Ctrl+Shift+b  開いているブックのリストから編集するブックを選択します。

変更したい場合は 開発→Visual Basic を選択してVBEを開いて、ThisWorkbook　の以下の部分を変更してください。

```vbnet
Private Sub Workbook_Open()
    Application.OnKey "^A", "OpenFile_ACTIVE_PATH"
    Application.OnKey "^R", "OpenFile_RECURSIVE_PATH"
    Application.OnKey "^M", "OpenFile_RECENT_FILE"
    Application.OnKey "^B", "OpenFile_SWITCH_BOOK"
End Sub
```
position:fixed;で固定したヘッダーを横方向だけスクロール可能にする奴（テスト）

##最初に作ったやつ（firefox上のhtmlで)
```javascript
window.addEventListener('scroll', function() {
  document.getElementById("header").style.marginLeft= "-"+ window.pageXOffset+ "px";
}, false);
```
googleで検索すると，jQuery使ったやつばっかりヒットするのでvanillaな奴をこさえてみました．
.style.marginLeftで指定する値が数値じゃ駄目なのには嵌った...
とりあえず動くので来たけど，ただ問題はaddEventListenerがhtaでは動かないことなんだよなあ．attachEventとかで動いてくれるとええんやけど(・ω・｀)

##htaで動いたやつ
```javascript
window.attachEvent('scroll', function() {
    document.getElementById("header").style.Left= -document.documentElement.scrollLeft;
});
```
addEventListenerは動かないからattachEventに変えましたよ，
marginLeftは試してないけどLeftで大丈夫でしたよ，
pageXOffsetが全然駄目で，scrollLeftが使えましたよ，
documentじゃなくて，document.documentElementにしないと動きませんでしたよ，
StyleのLeftの値はhtaでは数値でも単位「px」追加した文字列でもどっちでも動作しましたよ．
とりあえずやりたい動作が叶ったので良かったです(´^ω^｀)
v-modelに複数のselectboxをバインドする

# やりたいこと

「複数のアイテムがそれぞれselectboxを持つUI」をv-modelで表現する。

``` html
id:1のselectbox
<select name="" v-model="?">
   <option value="a">A</option>
   <option value="b">B</option>
</select>

id:2のselectbox
...

id:3のselectbox
...
```

# 方法

CodePenを見たほうが話が早いと思う。
v-modelを`{ アイテムのid: 選択した値 }`という形式のobjectにしてそれを素直に書いた感じ。

<p data-height="265" data-theme-id="0" data-slug-hash="MQWpae" data-default-tab="js,result" data-user="seihmd" data-embed-version="2" data-pen-title="vue v-model multi-select" class="codepen">See the Pen <a href="https://codepen.io/seihmd/pen/MQWpae/">vue v-model multi-select</a> by seihmd (<a href="https://codepen.io/seihmd">@seihmd</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
ElectronのWebViewを使用したアプリで、ファイルアップロードを実現

Electronで`<input type="file">`に対してファイルをアップロードするファイルを設定することは、
セキュリティ上できないと思っていたが、下記のコードでアップロードすることに成功したのでメモ。
デバッグ機能を活用するみたい。

```upload.js
// wv -- WebView
var wc = wv.getWebContents();
try {
    if(wc.debugger.isAttached()) {
        wc.debugger.detach();
    }
    wc.debugger.attach("1.1");
} catch (err) {
    console.error("Debugger attach failed : ", err);
}

wc.debugger.sendCommand("DOM.getDocument", {}, function (err, res) {
  wc.debugger.sendCommand("DOM.querySelector", {
    nodeId: res.root.nodeId,
    selector: "#file"  // CSS selector of input[type=file] element
  }, function (err, res) {
    wc.debugger.sendCommand("DOM.setFileInputFiles", {
      nodeId: res.nodeId,
      files: ['/tmp/tst']  // アップロードしたいファイルパス
    }, function (err, res) {
      wc.debugger.detach();
    });
  });
});
```

参考
https://github.com/electron/electron/issues/749
Java 9 で Androidプロジェクトの gradle でビルドができない

Java 9 が入っている環境でビルドができなくて困ったのが、Java 8 は入れるのは面倒だから入れたくない！！という人向けのメモ

## なぜコマンドからビルドができない
Android Studio は jdk も内蔵しているので Java 9 を入れていてもビルドできる。しかし、gradle コマンドを実行する際は JAVA_HOME が利用されるので Java 9 が利用されてしまい実行できない。

## 手っ取り早い対処
前述のとおり Android Studio は jdk も内蔵しているので、こいつを利用するように JAVA_HOME を一時的に書き換えてから実行すればよい。


普通に実行するとこういう感じだが

```
ore@mypc:~/myproject$ ./gradlew 
                                                                                                                 
FAILURE: Build failed with an exception.                                                                         
                                                                                                                 
* What went wrong:                                                                                               
Could not determine java version from '9.0.4'.                                                                   
                                                                                                                 
* Try:                                                                                                           
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.   
                                                                                                                 
* Get more help at https://help.gradle.org                                                                       
ore@mypc:~/myproject$                                                                             
                                                                                                                 
```

こんな感じで Android Studio が使用している jdk へのパスを export してやれば、とりあえずビルドはできるようになる。mac だったら mac の jdk のパスにいい感じに変える必要がある。

```
ore@mypc:~/myproject$ export JAVA_HOME="C:\Program Files\Android\Android Studio\jre" 

ore@mypc:~/myproject$ ./gradlew 
Welcome to Gradle 4.1.                                         
                                                               
To run a build, run gradlew <task> ...                         
                                                               
To see a list of available tasks, run gradlew tasks            
                                                               
To see a list of command-line options, run gradlew --help      
                                                               
To see more detail about a task, run gradlew help --task <task>
                                                               
BUILD SUCCESSFUL in 2s                                         
1 actionable task: 1 executed                                  
ore@mypc:~/myproject$                                                                             

```