OmniAICreator/Qiita-1.07M huggingface dataset:
RESTful な並び替え実装の個人的ベストプラクティス

こんにちは。Mikatus でサーバーサイドエンジニアをしている gypsy と申します。
この記事は Mikatus アドベントカレンダーの17日目です。
最初、「Scala + DDD + 関数型でポケモンをモデリングしたい」というタイトルで記事を書こうと思っていたのですが、モデリングしているうちに情熱が失われてしまったので別のことを書きます。

# 並び替え処理の悩み
最近、要素の並び替え処理（ToDo アプリのタスクの並び替えのような）を設計する機会があったのですが、なかなか納得のいく実装が見つけられないでいました。

最初に考えたのは、並び順を 1 からの連番として表現し、

```
// resourceId の並び順を 2　番目にするリクエスト
PUT path/to/resources/resourceId/sort

{
  "order": 2
}
```

みたいな感じで並び替え用の URI に PUT メソッドを投げ、並び順を指定する方法です。
そしてサーバサイドでは、

```
// E を 2 番目に移動する場合
A: 1      A
B: 2      E 割り込み
C: 3  =>  B 1つ繰り上げ
D: 4      C 1つ繰り上げ
E: 5      D 1つ繰り上げ
```

こんな感じで移動する順番以降の全リソースに対して並び順を変更します。

この実装でも一応並び替え自体は実現できるのですが、単一のリソースを対象に PUT を行っているのに、他のリソースにまで変更が及んでしまうのが気持ち悪いです。また、一度の PUT に対して複数のリソースが変更されるため、処理のコストが高くなってしまう可能性があります。（これに関してはバルクアップデート等の回避策があるため、問題にならないかもしれませんが）

妙案も思い付かずもやもやしていたのですが、開発グループのリーダーから「REST に従って並び替えを実装するなら、要素の位置を浮動小数点で表現すればよい」とアドバイスされ、これが面白く、自分の不満を解消するものだったので取り上げさせていただきます。（後で調べたら Trello もこの実装方法でした）

# 位置を浮動小数点で表現した場合の並び替え処理
要素の位置を浮動小数点で表現する、とはつまりこういうことです。

```
A:  65535.0
B: 131070.0
C: 196605.0
D: 262140.0
E: 327675.0
```

最初のやり方では、全体の中の相対的な順番を 1 からの連番で表現していたのに対し、こちらはその位置の絶対値となります。（ちなみに、この 65535 という数値は Trello を参考にしています）

では実際に、どのように並び替えを行うのか見ていきましょう。
リクエストは以下のような感じになります。

```
// resourceId の位置を 98302.5 にするリクエスト（ = 並び順を 2 番目にするリクエスト）
PUT path/to/resources/resourceId

{
  “position”: 98302.5
}
```

先ほどのリクエストでは相対的な並び順を指定していましたが、今回は位置の絶対値となっています。指定している position は並び替えた後の前の要素と後ろの要素の中間の値です。ここでは 65535.0 と 131070.0 ですね。

では続いてサーバーサイド。

```
// E を 2 番目に移動する場合
A:  65535.0      A:  65535.0 変更なし
B: 131070.0      E:  98302.5 位置情報変更
C: 196605.0  =>  B: 131070.0 変更なし
D: 262140.0      C: 196605.0 変更なし
E: 327675.0      D: 262140.0 変更なし
```

Eの位置情報を変更しただけで、全体の並び順が変えられたことがわかります。
もう少し並び替えを行ってみましょう。

```
// C を 2 番目に移動する場合
A:  65535.0      A:  65535.0  変更なし
E:  98302.5      C:  81918.75 位置情報変更
B: 131070.0  =>  E:  98302.5  変更なし
C: 196605.0      B: 131070.0  変更なし
D: 262140.0      D: 262140.0  変更なし

// B を 最初に移動する場合
A:  65535.0       B:  32767.5  位置情報変更
C:  81918.75      A:  65535.0  変更なし
E:  98302.5   =>  C:  81918.75 変更なし
B: 131070.0       E:  98302.5  変更なし
D: 262140.0       D: 262140.0  変更なし

// B を 最後に移動する場合
B:  32767.5       A:  65535.0  変更なし
A:  65535.0       C:  81918.75 変更なし
C:  81918.75  =>  E:  98302.5  変更なし
E:  98302.5       D: 262140.0  変更なし
D: 262140.0       B: 327675.0  位置情報変更
```

先ほどは移動する度に以降の全リソースに対して並び順を変更する必要がありましたが、この方法であれば変更するのは対象のリソースのみで問題ありません。このように、連番の並び順ではなく位置情報を用いることで、単一のリソースを対象に PUT を行っているのに、他のリソースにまで変更が及んでしまう気持ち悪さは解消されました。また、1 度の PUT で複数変更される事によるコスト増大も起こりません。

すばらしい。

# まとめ
RESTful な API の設計は難しいです。もちろん過度に REST に囚われてしまうのはアンチパターンだと思うのですが、できるなら REST っぽくしたい。そんな時には他のサービスがどう実現しているのか、探ってみると良い解決法が見つかるかもしれませんね。

# 参考
[Trello の API リファレンス](https://developers.trello.com/reference/)
Rustのエラー処理(2)

続編です。前編はこっち

[Rustのエラー処理(1)]()
## Result型

　こんな型です

```rust
enum Result<T, E> {
    Ok(T),
    Err(E),
}
```

　Option型が、存在しないことを示すのに対し、Resultはエラーになる可能性を示します。エラーは何のために処理が失敗したのかを説明するために用いられます。もちろんエラーにNoneを渡すこともできるので、以下のように

```rust
type Option<T> = Result<T, ()>;
```

Result型はOption型の一般化とも言えます。Result型はOptionと同じでunwrap型があります。

```rust
impl<T, E: ::std::fmt::Debug> Result<T, E> {
    fn unwrap(self) -> T {
        match self {
            Result::Ok(val) => val,
            Result::Err(err) =>
              panic!("called `Result::unwrap()` on an `Err` value: {:?}", err),
        }
    }
}
```

Option型と同じように、値が取れれば値を返し、エラーの時はエラーを起こします。Option型と違うのは、エラーに値があることで、この情報を基にDebugをしやすくします。また、型パラメーターEにはDebug制約をつけることが必要です。

## 整数のパース

　整数をパースする処理を以下のように書いたとします。

```rust
fn double_number(number_str: &str) -> i32 {
    2 * number_str.parse::<i32>().unwrap()
}

fn main() {
    let n: i32 = double_number("10");
    assert_eq!(n, 20);
}
```

文字列が整数にできない時は、

```
thread '<main>' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }', /home/rustbuild/src/rust-buildbot/slave/beta-dist-rustc-linux/build/src/libcore/result.rs:729
```

エラーが吐き出されます。うるせぇ。標準ライブラリの parse メソッド のシグネチャをみると、

```rust
impl str {
    fn parse<F: FromStr>(&self) -> Result<F, F::Err>;
}
```

parse型は一般化されていますが、今回はi32だけ取り扱います。FromStrは[ドキュメント](https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/std/primitive.i32.html)から、FromStr→Err→ParseIntErrorと見つけていきます。それを基にOption型と同様に処理すると、

```rust
use std::num::ParseIntError;

fn double_number(number_str: &str) -> Result<i32, ParseIntError> {
    match number_str.parse::<i32>() {
        Ok(n) => Ok(2 * n),
        Err(err) => Err(err),
    }
}

fn main() {
    match double_number("10") {
        Ok(n) => assert_eq!(n, 20),
        Err(err) => println!("Error: {:?}", err),
    }
}

```

また場合分けをします。今回もmap型で整理しましょう

```rust
use std::num::ParseIntError;

fn double_number(number_str: &str) -> Result<i32, ParseIntError> {
    number_str.parse::<i32>().map(|n| 2 * n)
}

fn main() {
    match double_number("10") {
        Ok(n) => assert_eq!(n, 20),
        Err(err) => println!("Error: {:?}", err),
    }
}
```

Result でよく使われるのは、unwrap_orとand_then ですResult は2つ目の型パラメータも取るので、エラー型だけに影響を与える map_err （map に相当）と or_else （and_then に相当）もあります。

## Result型エイリアスを用いたイディオム

 標準ライブラリではResult<i32>のような型を見ますが、Result型は二つの型パラメーターを取るように定義しました。なぜ一つだけ指定して済むようになっているのか説明する必要があります。実は、Resultの型エイリアスを定義して、エラー型を固定しています。なので、

```rust
use std::num::ParseIntError;
use std::result;

type Result<T> = result::Result<T, ParseIntError>;

fn double_number(number_str: &str) -> Result<i32> {
    unimplemented!();
}
```
のようにして書き換ええることができます。

## unwrap自体は悪じゃない

　次のケースならば、unwrapは悪ではありません。

- 使い捨てのコードを書く時
- 条件にマッチしない時に致命的なバグとなるとき

続きます（だんだん疲れてきた）

## 補足

- Debug制約

トレイト境界の一つです。今回は人間にとって見やすい(フォーマッターによって標準出力に変換できる)型であることを示します。
シェルスクリプト bash 算術式

bash では算術式 (()) を使って、数式を評価することが可能。
以下はカウントダウンの例。

```bash:arithmetic1.sh
((i = 3))
while ((i >= 1))
do
  echo "$i"
  ((i--))
done
```

```bash:arithmetic-result1
3
2
1
```

ただし、bash 以外では使えないため、ほかのシェルでも使える記述を使ったほうが良いかもしれない。

```bash:arithmetic2.sh
i=3
while [ "$i" -ge 1 ]
do
  echo "$i"
  i=`expr "$i" - 1`
done
```

```bash:arithmetic-result2
3
2
1
```
flask_sqlalchemyのSQLALCHEMY_TRACK_MODIFICATIONのwarningの解消方法

# はじめに
[PostgreSQLのこのページ](https://postgresapp.com)
のイントロダクションのPythonのFlaskを試している際に警告が出てしまい、解決方法を模索した結果を残します。

# サンプルコードの変更点
`flask.ext.sqlalchemy`からインポートできなかったので、`flask_sqlalchemy`に変更した。`[YOUR_DATABASE_NAME]`は適切な名前に変更した（ここでは省略）。

```python:変更後
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/[YOUR_DATABASE_NAME]'
db = SQLAlchemy(app)
```

# 実行すると・・・
上記コードを実行すると、以下の警告が表示された。

```sh:warning
/usr/local/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py:835: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
```

実行自体はできているのだが、`... will be disabled by default in the future.`と言われているので不安になった。

# 解消方法
`SQLALCHEMY_TRACK_MODIFICATIONS`の値を手動で設定してあげると良い。下記コードを適切な部分に追加すると、警告が出なくなった。

```python:add_code
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
```

# 参考
- https://www.crifan.com/flask_sqlalchemy_warning_userwarning_sqlalchemy_track_modifications/
macOS Catalina：依然としてWineに非対応（2019/12/01 時点）

#これまで

[@miima17 10月13日時点での状況](https://qiita.com/miima17/items/30d7fa34c021a3f95453)
- 10.14までの対応に止まっているとのこと

#2019/12/01 時点での状況

[WineHQ Forum "Catalina and the future of Wine on Mac"](https://forum.winehq.org/viewtopic.php?f=9&t=32590&sid=f14a28fbfdba3ed8d36ad533e42016ce&start=50)
- CrossOver19で試した方がいいんじゃないか？→確証得られず
- 32bitから64bitにすればいいんじゃないか→そういう問題でもない？（一人だけ上手く行ったかもみたいなことを言ってる...）
- 2019/11/26を最後にスレッドは沈黙...。

#結局Parallelsに頼ることに

[BlackFridayだからしょうがなくParallelsを買いました...。](https://www.parallels.com/jp/)
3分でわかるセキュリティ

# はじめに
これは基本情報技術者試験を勉強した際に「セキュリティ意外と面白い」と思ったことがきっかけに書いた記事です。
僕の専門ではないですm(__)m

(ちなみに僕の専門はReal Time Strategyです)

# セキュリティの三大要素
単にセキュリティといっても、攻撃の目的などはいくつかあります。多くの人（特にハッカーに憧れる子供とか）は攻撃と言うと情報を盗むことを想像するかもしれません。しかし、それ以外にも情報の改ざん・サービスの停止のために攻撃することもあるのです。
これから、情報の漏洩・改ざん・サービスの停止を狙う攻撃について、セキュリティ側が大切にするポイントを見ていきたいと思います。

## 機密性
これは情報の**漏洩がされない、情報が盗み出されない**ことを示す言葉です。例えば、あなたが今から国のサーバにアクセスして全国民の住所や氏名を入手したとしましょう。これは情報を盗み取っているから国のサーバの機密性は低いといえるでしょう。ほかにも、AさんからBさんへのメールの中身をあなたが盗み見た。これも情報漏洩といえます。

さて、これはどのようにして解決できるでしょうか。例えば、そのデータを暗号化するのはどうでしょうか？　AさんからBさん宛てに出した、暗号化されたメールをあなたが盗み見たとしましょう。中身がわからないのでは情報の盗みようがありません。これで情報の漏洩を防ぐことが出来ます。

## 完全性
次に完全性の話をします。これはデータが**改ざんされていない**ことを示す言葉です。先ほど、あなたはAさんからBさんに宛てられた暗号化されたメールを入手しました。もちろん中身は見られません。しかし、もしも中身を書き換えてBさんに何食わぬ顔で送った場合どうなるでしょう。Bさんは虚偽の情報に踊らされるでしょう。

この問題点はメールが改ざんされていたことに気づかなかったことに問題があるといえるでしょう。では、このメールに何か約束をつけたとしたらどうでしょうか？　例えば、メール全体の文字列のビットごとの数字の合計を一番最後につけるとか。そのようなルールを知らない場合、せっかくメールを改ざんしてもBさんには気づかれるでしょうね。

## 可用性
これは**サービスが停止をしない**ことをさす言葉です。数年前、Twitterが「バルス」という言葉で落ちたことはご存じですか？　金曜ロードショーで「天空の城ラピュタ」を上映したところ、多くのTwitter民が主人公の「バルス」のタイミングで「バルス」とツイートしたところ、ラピュタ城と同時にTwitterのサーバも負荷で落ちたそうです。これは可用性に関わる問題です。

これの対策は・・・
まあサーバを強化・多重化するのが定番でしょうか(何故か深く書かれていないのです。もしかして対策方法はないのか！？)

教えていただいた方法として、縮小運転があるそうです。提供するサービスの質を下げることでサーバへの負荷を下げて解決することです（要するに手抜き運転・・・）(2019/12/19更新)

## 最後に
いかがでしたか？　とても軽い内容ですが、これがセキュリティで大切にされていることです。単にセキュリティと言わずに何から守りたいか分かっているだけでも、ちょっとだけ自慢げな態度を取れるのではないでしょうか？

ちなみに加筆・修正要請があればじゃんじゃん言ってください！
僕もセキュリティは浅いし、何よりも勉強になりそうです。
RocksDBのColumn Familiesについてのメモ

#RocksDBのColumn Familiesとは
同じデータベース内でキーが同じでも、Column Familiesが異なると、登録・参照・削除できるようになります。
公式のドキュメントには「データベースを論理的にパーティション分割する方法を提供します」とのことでした。
名前空間と同じような概念と思って良いと思います。
以下が特徴です（公式をGoogle翻訳ですので、正しくは公式ドキュメントを参照してください）。

* 異なるColumn Familiesへのアトミックな操作が可能 
 Write({cf1, key1, value1}, {cf2, key2, value2}) がアトミックに行えるということです。cf1とcf2がColumn Familiesの指定です。

* データベース内のColumn Familiesに渡った一貫的なビュー 
よくわかりません

* 異なるColumn Familiesを個別に構成する機能
よくわかりません

* 新しいColumn Familiesの追加、ドロップができます。どちらの操作もかなり高速です
記載のとおりです

公式ドキュメント
https://github.com/facebook/rocksdb/wiki/Column-Families

#どんなときに使う？
正直わかりません。ただこんな機能があることを知っていると、いつか役立つかも。。。

#使い方
```java
public class SampleCulmunFamily {

	public void execute() throws Exception {

		// DBの作成
		try (final RocksDB db = RocksDB.open("sample")) {
			// column familyの作成（先にColumnFamilyDescriptorを複
			// columnfamilyを複数作成する場合は、ColumnFamilyDescriptorのListを作成して、db.openに渡せばOKです
			try (final ColumnFamilyHandle columnFamilyHandle = db.createColumnFamily(
					new ColumnFamilyDescriptor("new_cf".getBytes(),
							new ColumnFamilyOptions()))) {
			}
		}

		// DBと2つのCulmunFamilyの作成
		final List<ColumnFamilyDescriptor> columnFamilyDescriptors = new ArrayList<>();
		// CulmunFamilyを指定しない場合でも、defaultというCulmunFamilyが裏で作成されています。
		// したがって、今回は、defaultとnew_cfという2つのCulmunFamilyを作成するということになります
		columnFamilyDescriptors.add(new ColumnFamilyDescriptor(
				RocksDB.DEFAULT_COLUMN_FAMILY, new ColumnFamilyOptions()));
		columnFamilyDescriptors.add(new ColumnFamilyDescriptor(
				"new_cf".getBytes(), new ColumnFamilyOptions()));
		final List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>();
		try (final DBOptions options = new DBOptions();
				final RocksDB db = RocksDB.open("sample",
						columnFamilyDescriptors, columnFamilyHandles)) {

			// CulumnFamilyの識別子を取得
			ColumnFamilyHandle defaultColumnFamily = columnFamilyHandles.get(0);
			ColumnFamilyHandle newColumnFamily = columnFamilyHandles.get(1);

			try {
				// 同一キーで登録します。識別子を使用して、登録先を振り分けます。
				db.put(defaultColumnFamily, new WriteOptions(),
						"key".getBytes(), "default_value".getBytes());
				db.put(newColumnFamily, new WriteOptions(),
						"key".getBytes(), "new_cf_value".getBytes());

				// 参照
				System.out.println(new String(db.get(defaultColumnFamily, "key".getBytes())));
				System.out.println(new String(db.get(newColumnFamily, "key".getBytes())));

				// 削除
				db.delete(defaultColumnFamily, "key".getBytes());
				db.delete(newColumnFamily, "key".getBytes());

				// column familyの削除
				db.dropColumnFamily(newColumnFamily);
			} finally {
				for (final ColumnFamilyHandle handle : columnFamilyHandles) {
					handle.close();
				}
			}
		}
	}
}
```
returnとprintの違い -Python

returnとprintの違いがよく分からなかったので、ここにまとめておきます。しかし、まだ完全に違いを掴めていないので、明確に違いを理解できたらなと思っております。

**return** = 関数において、値を呼び出し元に返す。勘違いしていたのだが、returnは値を返すものなので値を出力したい場合はprintを使わないといけない。
**print** = ただ文字列を出力するもの。関数の時だけでなく、様々な場面で利用する。returnで返した値を出力したい場合は、printで出力しないと表示できない。

なんとなくは理解しましたが、returnの「値を返す」という部分がまだはっきり理解できていません。これから何度もコードを書いたり、他の方が書かれたコードを読んで明確に理解できたらなと思います。
「ソフトウェア開発」を照らす様々な方法論

すぎいです。

この記事は[iRidge Advent Calendar 2019](https://qiita.com/advent-calendar/2019/iridge) 4日目の記事です。


「ソフトウェア開発をもっとうまくやりたい」
こう考えてIT業界でずっと仕事をしてきました。
長年やってると様々な方法論や知識体系に触れる機会があります。
私が影響を受けたいくつかの方法論を紹介していきたいと思います。

# 設計・コーディング
### デザインパターン
Gang of Four（GoF）と呼ばれる4人組（Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides）がまとめたものが有名です。
[「オブジェクト指向における再利用のためのデザインパターン」](https://amzn.to/2XXY7Yb)

ソフトウェア開発にパターンを持ち込むことで再利用性や汎用性が高まり、業界そのものの生産性がよくなったと言われています。
非常に画期的でした。
「パターン」とはもともとは建築家のクリストファー・アレグザンダー氏が提唱したもので、GoFの方々によってソフトウェアに応用されました。
ここから派生して、アーキテクチャパターンとかクラウドデザインパターンとか出てきています。

### Python Enhancement Proposal（PEP）
Python推しの弊社。PEPの紹介です。
方法論とは少し違うかもしれませんが非常に良いドキュメント群だと思います。
[The Zen of Python（PEP20）](https://www.python.org/dev/peps/pep-0020/)は素敵ですね。

お気に入りはこれです。

> Now is better than never.
> ずっとやらないより今やろう。
> Although never is often better than *right* now.
> ただし今すぐやるならやらないほうがよい。

# 開発プロセス、方法論
### PMBOK
言わずと知れたPMBOK。
開発というよりはマネジメントを体系化したものです。
ソフトウェア開発と開発プロセスは切り離せないもので、どういったプロセスでやるにしてもPMBOKに書いてあることを参照するのがよいと思います。

### アジャイル関連
アジャイルマニフェストをベースに、XP（Extreme Programming）、Scrumなど様々な方法論があります。
https://agilemanifesto.org/

XPには「価値」が定義されており、その１つに **リスペクト** があります。
私はこの**リスペクト**がソフトウェア開発の方法論の１つであるXPに含まれていることをとても気に入ってます。

# その他
### リーンスタートアップ
リーンスタートアップといえばこの書籍。
[リーン・スタートアップ](https://amzn.to/34CF20t) 
ソフトウェア開発というよりはビジネスを作る方法論といったところでしょうか。
MVP（Minimum Viable Product）やBuild-Measure-Learnの考え方は非常に素晴らしいと思います。

### デザイン思考(Design Thinking)
共感 (Empathise) 、定義 (Define)、概念化 (Ideate)、試作 (Prototype)、テスト (Test)の5つのプロセスが有名です。
特に「共感」という考え方は個人的に画期的でした。
デザイン思考にも様々な方法があるようですので今後深掘りしていきたいところです。

### UXD/HCD
雑にまとめるとUXポリスの標的になりそうですが(笑)
UXD（User Experience Design）、HCD（Human Centerd Design）などがあります。

これらはソフトウェア開発だけの考え方でないのですが、私はスマートフォンアプリを開発しているので「ユーザー体験」は非常に重要になります。ちゃんと勉強して実践したい分野です。

# 最後に：「ソフトウェア開発」とは何か
世の中には上記に挙げた以外にも様々な方法論やツールが存在します。チームビルディングや組織開発などもその１つでしょう。
しかしその一つひとつを見ると完璧なものはなく、複雑で深淵なる１つの**システム**とも言える「ソフトウェア開発」をいくつかの角度から照らしたものに過ぎないのかな、と思います。

私にはまだまだ「ソフトウェア開発」が何なのかわかりません。いくつかの角度から照らしたものから限定的に把握しているにすぎません。
「こうすればよかった」「次はこれを試してみよう」とずっと考えています。まだまだやりたいことばかりです。

今後もソフトウェア開発をもっともっと上手くできるように、より多くの知見を得て、ソフトウェア開発を様々な角度から照らし続けたいと思います。
IIS Expressに外から接続する

# やりたいこと

https://qiita.com/ledsun/items/ca77c60aad424438cdd7

上記の投稿内容とほぼ同じことをやりたいです。

端末A（Windows）WebAPIをIIS Expressで実行。

端末B（Mac）端末AにIPアドレスを指定して、HTTPでアクセスする。

# 環境

-端末A
  -Windows 10
  -Visual Studio Community 2019
（WebApiは、.NET Core 3.0で作成したAPI）

#  試したこと

## applicationhost.configの編集

ググったところ、ソリューションフォルダの.vs/プロジェクトフォルダ/configに
あるapplicationhost.configを以下の通り編集しました。

![qiita_image_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542336/f927dc40-62f9-488e-c7c7-ea35e42aa5b2.jpeg)

## ACLの設定

これもググって設定を行いました。

コマンドプロンプトを管理者権限で実行し、以下のコマンドを実行。

```
netsh http add urlacl url=http://自身のIPアドレス:ポート番号/ user=everyone
```

以下のコマンドで、リッスンできていることを確認。

```
netsh http show urlacl
```

##  ファイヤーウォールの設定
受信の規則に上記のポート番号の設定を行う。

![qiita_image_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542336/0c091ab7-bfe8-559e-93a7-45e6c3d8be8a.jpeg)


##  Visual Studioを管理者モードで起動し実行

Visual Stduioを管理者モードで起動しないと、IISのエラーが発生するという情報があったので管理者モードで起動し、デバッグ実行。

#  結果
端末Bから、接続する前にまず端末Aから、POSTMAN を使ってIPアドレス指定でアクセスできず・・・。
localhostであれば、接続ができます。

デバッグ実行では、ローカルのみ接続しかできないのだろうか。

何かご存じの方、いらっしゃいましたら情報ください。
型にはめるだけでうまくいくなんてことはないという話

この記事は宮崎IT関連勉強会アドベントカレンダー１日目の記事です。

https://qiita.com/advent-calendar/2019/miyazaki

先日、宮崎初のJbugに参加してきました。

https://jbug.connpass.com/event/152790/

自分も登壇させていてだきましたが、それはまた別で、今回はその懇親会でのお話で面白い話があがったので紹介します。

ある顧客がメールマガジンをしたいと要望したところ、なぜそれをしたいのかがわからないまま適用しようとしているという話から、デザイン界隈でもファッション雑誌なんかも各ページのレイアウトなんかは長い年月をかけて一定の形式が決まっていて、それに沿ってコンテンツを埋めてもなんの効果がない。大事なのはその中身、コンテンツ、つまりWhyが大事なんだとか。

それと似たことがAgileやScrumにも言えるんじゃないかと思いました。

今や、AgileもScrumもアーリーアダプターの段階は超えていて、マジョリティの段階に来ていますよね。
弊社でもScrumのプラクティスを取り入れて毎スプリントを過ごしています。

しかし、ただやるだけではうまくいくはずもなく、、、もしかしたらうまく行っていないことにも気づけないかもしれません。
逆に何かおかしいと感じるかもしれませんが、何も手を打たなければ、そうしているうちに結局手遅れになり炎上している。。。とういうことも。。。

定期的にWhyを確認する必要があります。
なぜスプリントでやるのか？なぜポイントで見積もるのか？なぜベロシティを計測するのか？なぜ朝会をするのか？なぜペアプロをするのか？
そもそもなぜその事業をするのか？自分は何をする人なのか？

実はなぜAgileなのか？Scrumなのか、解説してくれる本ってなかなかないと思います。
もっと言えば、なぜチームでやるのか。。。この点については解説してくれる本にまだ自分も出会っていません。
チームでやればなぜパフォーマンスが上がるのか？そもそもどういう状態だとチームでやってると言えるのか？

考えるのは自分たち自身。それこそ答えは一つではないと思うのでチームで考える必要があるでしょう。
また、守離破という自分もお気に入りの言葉がありますが、まず「守ってやってみる」のも大事ですが、それには「なぜやるのか」を考えながら守るという意味が含まれていると思っています。

年の暮れにこんなことを振り返ってみるのはいかがでしょうか？
react-hooks-global-stateの紹介

## はじめに

React Hooksがアナウンスされた時に、まずやってみようと思ったことが簡易なglobal stateの実現でした。React Hooks登場以前から[試みていた](https://logmi.jp/tech/articles/320489)のですが、それのHooks版を開発しました。

## ライブラリ

<https://github.com/dai-shi/react-hooks-global-state>

このライブラリはとてもシンプルなものになっています。つまり、React ContextとReact Hooksを素直に使ったglobal stateになっています。

いくつかの特徴はありますが、あとで説明します。

## 使い方

まず必要なライブラリをimportします。

```javascript
import React from 'react';
import { createGlobalState } from 'react-hooks-global-state';
```

最初にinitialStateを定義します。

```javascript
const initialState = {
  count: 0,
  text: 'hello',
 };
```

次に、それをもとにglobal stateを作成します。

```javascript
const { GlobalStateProvider, useGlobalState } = createGlobalState(initialState);
```

global stateを使うコンポーネントを作ります。

```jsx
const Counter = () => {
  const [count, setCount] = useGlobalState('count');
  return (
    <div>
      <span>Counter: {count}</span>
      <button onClick={() => setCount(v => v + 1)}>+1</button>
      <button onClick={() => setCount(count - 1)}>-1</button>
    </div>
  );
};
```

`useGlobalState`の引数にglobal stateのproperty nameを指定しているところがポイントです。これを指定することで他のpropertyが変更にあった場合でも本コンポーネントは再renderする必要がなくなります。

最後にAppでProviderを指定します。

```jsx
const App = () => (
  <GlobalStateProvider>
    <Counter />
    <Counter />
  </GlobalStateProvider>
);
```

## デモ

[CodeSandbox](https://codesandbox.io/s/github/dai-shi/react-hooks-global-state/tree/master/examples/01_minimal)で動作させることができます。

## 特徴

React ContextとReact Hooksを使ってglobal stateを実現するライブラリは世の中にたくさんあります。本ライブラリはそのうちの一つですが、いくつかの特徴があります。

### select by property name

global stateを設計する上でのポイントの一つは、大きなstateのうち、一部分を使う場合にそれを限定して使うための仕組みです。例えば、Reduxではselectorというインタフェースを使って、stateから派生したデータを作ります。本ライブラリはよりシンプルな手法として、stateオブジェクトのproperty nameでselectするという手法を採用しています。これは、selectorのようにオブジェクトの深い構造をselectすることはできませんが、reselectのようなselectorをmemoizeする必要がないというメリットがあります。その代わりstateオブジェクトはflatになるような設計にする必要はあります。同様のアプローチを採用しているライブラリに[storeon](https://github.com/storeon/storeon)があります。

### unstable_observedBits

本ライブラリは上記selectの実現にobservedBitsという仕組みを使っています。observedBitsについては[こちらの記事](https://medium.com/@koba04/a-secret-parts-of-react-new-context-api-e9506a4578aa)が詳しいです。この仕組みを使うと、contextが変更した際に、一部のコンポーネントだけを再renderすることができます。

## おわりに

本ライブラリは、名前が直接的なためか比較的参照されることが多いようですが、実は今後の方針は悩んでいます。一つは、今回紹介しなかったreducerインタフェースがReduxの完全な互換にはできないことと、もう一つは、observedBitsが将来のReactでは使えなくなる[可能性が高い](https://twitter.com/dan_abramov/status/1192780782215008256)ことがあります。ユーザの利用シーンをヒアリングしつつ今後の方針を決めていきたいと思います。
Array、運命の操作

# はじめに

JavaScriptにはプリミティブ型とオブジェクト型があります。

[Primitive (プリミティブ) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Primitive)

>JavaScript において、プリミティブ (primitive、プリミティブ値、プリミティブデータ型) はオブジェクトでなく、メソッドを持たないデータのことです。 7 種類のプリミティブデータ型があります。文字列、数値、真偽値、null、undefined、そしてシンボル (ECMAScript 2016 で追加) です。

つまり、普段よく使う文字列や数値などは「プリミティブ」、配列などは「オブジェクト」に分類されるということです。
プリミティブ型とオブジェクト型で大きな違いがあり、それは条件式で比較したときにこのようになる点です。

```javascript
// プリミティブ型の比較
a = 5;
b = 5;
console.log(a == b); // true
```


```javascript
// オブジェクト型の比較
a = [5, 10];
b = [5, 10];
console.log(a == b); // false
```

プリミティブ型では値同士を比較することが可能ですが、オブジェクト型の場合はそれができません。
今回はそのオブジェクト型である配列に関する内容です。


# Uint16Array（符号なし整数の配列）

突然ですが、JavaScriptには様々な種類の配列があります。

[JavaScript リファレンス - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference)

>索引付きコレクション
これらのオブジェクトは、インデックス値で順序付けされたデータのコレクションを表します。これには、(型付けされた) 配列や配列に似た構造体も含まれます。

Arrayはよく使われると思いますが、Uint16Arrayなどあえて型付けされる配列も用意されています。

```javascript

a = new Uint16Array([10, '20', -5, 65540]);
console.log(a); // Uint16Array [ 10, 20, 65531, 4 ]
```

UintというのはUnsigned integerの略で、符号なし整数と言われます。
Uint16の場合は符号なし整数のうち、2の16乗の数を扱えるということになり、0〜65535（＝2の16乗から1引いたもの）まで利用できます。
-5は2の補数表現 [^1] に従うので65531になり、65540は2進数にしたときに16ビットからあふれるものがあるので、それを無視するんだと思います。


# ArrayとUint16Array

自分がなにを思い立ったかわかりませんが、こんなことをしてみました。

```javascript

a = new Uint16Array([10, 20]);
b = new Array(10, 20);
console.log(JSON.stringify(a)); // {"0":10,"1":20}
console.log(JSON.stringify(b)); // [10,20]
```

JSON文字列にするというただそれだけなのですが、同じ `Array` を名乗っているにもかかわらず、微妙に違うようです。
自分の知識不足でこれ以上深追いできませんが、個人的に小さな闇だと思いました...

`JSON.stringify` の挙動についてもうすこし調べてみました。続きはこちらで！
[続・Array、運命の操作](https://qiita.com/gununu1028/items/f441257eceaffa0b13c9)（2019/12/08追記）

[^1]: この記事がとてもわかりやすいです。https://qiita.com/YamadaTakahito/items/79693ce08cad8baf130b
渋谷女子で大流行のプログラム言語スクラッチの紹介


![alt](https://scratch.mit.edu/images/ideas/cards-illustration.svg)
今どきの、小中学生に大人気のプログラム言語Scratch！

## Scratchとは？
https://scratch.mit.edu/

- 8歳から16歳向けにデザインされたプログラムを勉強する教育向け利用につくらている。
- オンラインで作成することができる（ブラウザーがあれば始められる）
- つくったプログラムを公開することができ、他の人がつくったプログラムも利用できる
- Google作のblocklyベースのUIで、マウスだけでプログラミングができる
- 拡張ブロックを作ることで、ドローンやロボットなども制御できる

とにかく、操作性、機能面、拡張性、など、かなりのスグレモノで、プロジェクトによってはScratchで実装した方がらくなのでは？とおもわせるほどツールとしてのクオリティーが高いです。

## 開発者目線から気になる技術内容
内部はNode.js、画面はReactで実装、ES2015(constなど)には対応、webpackでコンパイル、npmパッケージを導入可能。（参照：Scratch 3.0でオリジナルブロックをつくろう：https://qiita.com/Hiroyuki_OSAKI/items/a46e1c881d3aed4661f7）


Scratchブロック
Scratch Blocksは、GoogleのBlocklyの技術をベースに構築され、垂直(テキストベース)と水平(アイコンベース)の両方の形式に対応する、プログラミング・ブロック構築用フレームワーク
（GoogleのBlockly：https://developers.google.com/blockly/）

かなりいけてる技術の集合体でつくられるとおもわれます。

![tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92225/db00b62c-5748-4b1d-32d1-84577405e540.png)



## なんでScratchを

OSSのイベントプレゼン資料をみていたときに、笑いを取るページで、渋谷女子高生がなんでもScratchで作っちゃう的な、記事を見たのが、自分が知るきっかけでした。

気になったので、自分のまわりにいる、小中学生に聞いてみたら
Switchと同じぐらいの感覚で、これつかってゲーム作って遊んでました。
ためしにうちの小学１年生の子にScratchJrをタブレットで与えたら、夢中になってあそんでました。

- 感覚だけでプログラミングができてしまう、UI、UXのすばらしさ
- アイデアを実現できる、機能と、すぐれた拡張性

子供だけでなく大人も夢中になれるすぐれたツールだとおもいます。
有益な拡張ブロックつくって組み合わせることでAPIコントローラにつかったり
ビデオセンサーなどを利用した接客アプリとか

アイデアが刺激されますね。。。

仕事柄、

- 子供にプログラミング習わせたいけどどう思う？
- 始めるなら早いほうがよい？
 
など相談されることがあるのですが、お金かけてスクールに行かなくても、
Scratchで遊ばせておけば、天才プログラマーが育ってしまうのではと。。。。
クリスマス直前!! フルカラーテープLEDとobnizを使った イルミネーションの作り方

クリスマスが近いので イルミネーションを作ってみようと思ったので、obnizでフルカラーテープLEDを光らせらせてみました。

##まずは、動画
LINEさんからいただいたLED TシャツとLEDコラボしてみました。
上はLINEThingsで制御、下はObnizとFirebaseでJavascriptを使って色を制御しています。
（なるべく呼吸っぽい光り方にしてあります）

どちらもWS2812B を使っていることが分かります。（高い！）

https://youtu.be/7YtyxmPH07s
[![LED](http://img.youtube.com/vi/7YtyxmPH07s/0.jpg)](http://www.youtube.com/watch?v=7YtyxmPH07s)



##必要部材
・obnizBord 1個 
・テープLED 144個 WS2812B (秋葉原ピカリ館)
・ACアダプター 5V 4A(秋葉原ピカリ館)
・DCジャックコネクター(秋葉原ピカリ館)

※LEDは144個ありますが、実際には85個までしか制御できません。
86個以降を操作しようとするとエラー吐きます。

##説明
テープLED 144個 WS2812Bは、
マイコンで1個ずつ制御することができるマイコン内蔵の画期的なフルカラーRGBのLEDです。

##問題点
WS2812Bを使用しているテープLED はかなり電力が必要になってくるため、
obnizBordのIO直結では電源供給不足で制御できません。


##参考記事
https://temari.co.jp/blog/2018/12/17/obniz/
てまりさんの記事の中の最後にもあるように、テープLEDのみを外部電源で接続し、obnizだけで制御しようとすると光り方がうまく制御できません。
（取りあえずバラバラ光ってくれる感じです）


##解決方法
obnizもテープLEDの外部電源から電源を取るとうまく制御できるようになります。
（電気系が詳しくないのですが、GNDを同じにするという感じですかね）

##配線図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/6232c4cf-01d7-c02a-db45-0dc713262e8f.png)

LED側の3線をobnizに繋げるイメージ
LED：obniz
白：IO0：GND
緑：IO1：VCC
赤：IO2：DIN

```led.js
          var led = obniz.wired("WS2812B", {gnd:0, vcc: 1, din: 2});
```


##プロトアウトスタジオ Advent Calendar 2019
次は 13日の金曜日!!…ジェイソン役がいないので、
14日は @zgw426 さんの○○です！
Emacsで競プロしませんか？ ～Emacsでonline-judge-toolsを使おう～

#注意
現状、残念ながらAtcoderにしか対応できていません。拡張できるように作ってはいるので、今後追加しようと思っています。

#導入
みなさん、Emacsはお好きですか？なんでもEmacsでやりたくなるお年頃ですよね？

私もその一人です。ここ最近Atcoderにちょくちょく参加しているのですが、Emacsで書いていると、コードをコピーして提出するのが地味に面倒臭いです。

そこでまず初めに登場するのが `online-judge-tools`(以下`oj`)です。詳細は以下にあります。

ソース, 本体: https://github.com/kmyk/online-judge-tools
ドキュメント: https://online-judge-tools.readthedocs.io/en/master/introduction.ja.html

このツールは、オンラインでの競技プログラミングにおいて必要な提出、テストなどの雑多な操作をコマンドラインで行えるようにするものです。

そして、今回ご紹介する拙作は、このツールのEmacsクライアントです！

https://github.com/ROCKTAKEY/emacs-online-judge

packageの名前はなんの捻りもなく`online-judge`です。これを使えば、Emacsの関数ひとつで提出やテストが行なえるようになります！

#ご使用の前に
現状、[`dash`](https://github.com/magnars/dash.el)と[`f`](https://github.com/rejeep/f.el)に依存していますので、それらと、先程の[`emacs-online-judge`](https://github.com/ROCKTAKEY/emacs-online-judge)をダウンロードして`load-path`に通してください。

次に、[`oj`](https://github.com/kmyk/online-judge-tools)にパスを通すか、`online-judge-executable`に場所を格納してください。

```emacs-lisp
(require 'online-judge)
(setq online-judge-executable "/path/to/oj")
```

最後に、`M-x online-judge-login`をして、Atcoderを選択し(現状これ以外に選択枝はありません)、Atcoder のユーザー名とパスワードを入力してください。`oj login`に渡されます。これは、解答を提出する際に必要なものです。なお、Emacs側ではこれらの情報は一切保存しないので御安心ください。

基本的に前もって必要な設定はこれだけです。あとは、適当なファイルを開いて、`M-x online-judge-mode`すると、サービス名及びコンテスト名、問題番号を聞いてきますので、順次入力していけば、設定は完了します。

ちなみに、パス名を次のような感じにすると、よしなにサービス・コンテスト名や問題番号を検出してくれます。ここは結構がんばりました。
- `atcoder/abc130/a.cpp`
- `atcoder/abc130/b2.cpp`
なお、ABCとAGC以外のコンテストは検出できませんので、悪しからず。

それと、次のように、`online-judge-directories`にディレクトリのリストを指定しておくと、そのディレクトリ内のファイルを開いたときに自動で`online-judge-mode`が立ち上がるようになります。

```emacs-lisp
(setq online-judge-directories '("~/atcoder/"
                                 "/my/awesome/dir/"))
```

#使い方
##ファイルを開く。
`online-judge-mode`になっていれば、モードラインに現在解いている問題の情報が表示されます。
## 問題を解く。
##コンパイルする。
`online-judge-command-name`がデフォルトのままなら、`a.exe`もしくは`a.out`にコンパイルしてください。`online-judge-command-name`を`nil`にしておくと、`拡張子なしファイル名.exe`が実行ファイルになります。お好みでどうぞ。

申し訳ないのですが、インタプリタ型言語には今のところまともに対応できておりません。`online-judge-command-name`という変数をevalすることで実行ファイル名を得ているので、自前でS式を用意していただけると幸いです。

##`M-x online-judge-run-test`でsample caseをtestする。
ただし、初回はサンプルのダウンロードがあるのでやや遅いです。
また、非同期での実行になりますので、テストが終わって初めてテスト結果が表示される形になります。~~この画面が今のところかなり見づらいです。今後改善したいと思います。~~

2020-02-03 追記: テスト結果の表示に`outline-minor-mode`及び`font-lock`を導入しました。比較的重要でない出力にはコード内コメントのfaceが適用されます。また、現在の実行結果以外は折り畳まれるようになりました。これで、だいぶ見やすくなった思います。

##`M-x online-judge-submit`で提出！
提出が成功すると、"Submission succeeded."とエコーエリアに表示されます。

#誤差
- `online-judge-toggle-error-range`: 誤差許容範囲を0と`online-judge-error-range-default`でtoggle
- `online-judge-update-error-range`: 誤差許容範囲の変更。
これらは、答えとの誤差の許容範囲を設定するものです。デフォルトは許容誤差は0(つまり誤差を許容しない)になっています。問題によって異なるので、各自で設定してください。

#今後の展望
- ~~test結果の見た目をきれいにする。~~ DONE: 2020-02-03
- Codeforce, Topcoderなどに対応する。
- インタプリタ型の実行をサポートする。
- melpaへの投稿。

#最後に
当packageが依存しまくっている`oj`の作者の[Kimiyuki Onaka](https://github.com/kmyk)さんに多大なる感謝の意を表します！
また、まだまだ発展途上なpackageですので、issue、pull-requestともどもお待ちしています！Starも大歓迎です！それではよいEmacs Lifeを！
Nextで特定のAPI リクエストをproxyする方法

# 書いてる事
[Next.js](https://github.com/zeit/next.js/)で一部のリクエストを別環境へproxyしたいケースは多いかと思います。
例えば、下記のようなケース

* フロントエンドをバックエンドと環境を分離している
    * Backend向けAPIだけ裏側へproxyしたい
* バックエンド環境を自身の開発環境に用意するのが面倒（管理・運用面で）
    * できれば、最新状態がキープされている共通環境側へproxyしたい

上記の場合の対応方法について書きました。
 
# 書いてない事
Node(JavaScript)以外で頑張る方法。
Nodeがあれば再現できる方法がフロントエンド開発者としては嬉しいと思うので。

# 1. micro-proxyをNextと別で立ち上げる
あまりオススメしない方法。
[zeit](https://github.com/zeit/micro-proxy)が出しているNodeライブラリーである[micro-proxy](https://github.com/zeit/micro-proxy)を使う案。別プロセスでproxy立ち上げ、一部のリクエストをproxy向けにリクエストを飛ばしてproxyさせる手法。ただし、この方法は問題点が何個かあって

* そもそもarchiveされているライブラリー
* micro-proxyはNextと別プロセスで立ち上げるので別ポートでListenする必要があり、Nextとポートを分けないといけない
    * リクエストするクライアント側からも振り分けないといけなくなる
* __proxyするリクエスト__と__proxyしないリクエスト__でクロスドメインになるのでその対処が必要
    * 例えば、Nextは`localhost:3000`、micro-proxyが`localhost:9000`だと、micro-proxy向けのリクエストはクロスドメイン扱いとなり、。ブラウザ側で拒否される

# 2. NextのCustome Server(Routes)上でhttp-proxy-middlewareを使う。
個人的なオススメ。
[http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware)はNode製のproxy library。Nodeのweb framework、例えば[express](https://github.com/expressjs/express)などで簡単に利用できる。これをNextのCustom Server上で利用する。
以下は実際に設定したコード例です。Nextの[Custom Server例](https://github.com/zeit/next.js/blob/master/examples/custom-server-express/server.js)を参考にしました。

```javascript:server.js
const express = require('express')
const next = require('next')
const proxy = require('http-proxy-middleware')

const port = parseInt(process.env.PORT, 10) || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare().then(() => {
  const server = express()

  server.use(
    '/api',
    proxy({
      target: 'http://www.example.org',
      changeOrigin: true
    })
  );

  server.all('*', (req, res) => {
    return handle(req, res)
  })

  server.listen(port, err => {
    if (err) throw err
    console.log(`> Ready on http://localhost:${port}`)
  })
})
```
上記でCustom Serverを起動すると`/api`向けのリクエストは`http://www.example.org`へproxyされ、他リクエストはNext.js内部で処理(SSRなど)する。同プロセス、同ポートへのリクエストとなり、クロスオリジンの問題は起きない。

# まとめ
2番目がオススメ。ただ、他にオススメがあれば教えてください。
MQL4でバイナリーオプションのサインツールを作っています。

当方、素人です。
ネットで拾ったコードをベースにバイナリーオプションのサインツールを作っています。
インジケーターRSIの値、30以上70以下での逆張りの手法なんですが、上手く動いてくれません。

Highエントリー条件
iRSI(NULL,0,14,PRICE_CLOSE,1) < 30 && Open[i] > Close[i]

Lowエントリーの条件
iRSI(NULL,0,14,PRICE_CLOSE,1) > 70 && Open[i] > Close[i]

以上のコードを使用すると、サイン（矢印）が出なくなってしまいます。
試しにと思い、

Highエントリー条件
iRSI(NULL,0,14,PRICE_CLOSE,1) > 30 && Open[i] > Close[i]

Lowエントリーの条件
iRSI(NULL,0,14,PRICE_CLOSE,1) < 70 && Open[i] > Close[i]

RSIの内張りの設定にすると、すべてのローソク足にサインが出てしまいます。
なので、iRSI関数がきちんと機能していないようです。
どこを直せば動くようになりますか？

ご教示願います。
機械学習メモ(train_test_splitのrandom_state)

train_test_splitのrandom_stateについてずっと疑問だったが、なんとなく理解したのでメモ
random_stateを使うと設定した値を基にして、ランダムな選択がされる。
（どのような仕組みになっているのか深いところまでは不明）

例えば、random_state=1が2つある場合は、元のデータから同じランダムなデータが選択される。
random_state=1とrandom_state=2など変わった場合は、別のデータが選択される。

基本指定する数字が同じだったら同じ値が選択されると覚えておけばいい気がする。
数字自体には意味がなさそう・・

random_stateをつけなければ、毎回random_stateが変わって別々のものが出てくるイメージ
IT業界4ヶ月の人間が、ある記事に触発されてTrelloダミーを作ってみたお話し。

#Trelloダミー作ってみた！！
この記事【[トップデベロッパーになるために作成したいアプリ8選](https://qiita.com/baby-degu/items/f905c8ee972cf46ce11b)】に触発されて、Trelloダミーなるものを作ってみました。
作品はこちら→[TODOdo?](https://heroku-tododo.herokuapp.com/)


##Trelloって何？
TODOリストです。
タスクを自由に作成し、ドラッグ&ドロップで並び替えもできます。
[Trello](https://trello.com/)


##開発環境
バック: Laravel 6.5
フロント: Vue.js
DBは使用してません。
使ったライブラリ: Vue.Draggable


##仕組み
localStorageを使用し、曜日単位でTODOリストを管理しています。
ちなみにlocalStorageへ保存するときはkey: valueの形なので
**[key]: [valiue]**
**[曜日]: [TODOリスト]**
と言った形で保存しています。
なので、タスクの保存や並び替え時の順番保持なども全てlocalStorageへ保存しています。

##工夫点
・上記の記事のサンプルは消去ができなかったこと、Trelloでは消去の方法が分かりにくかったので、タスクの消去を直感的にできるようにしました。

・Trelloでもサンプルでも大枠を自由に作ることができますが、今回作成したものの大枠は、月から日曜日の一週間のみとし利便性を追求してみました。

・どの曜日を選んでも
**するべきこと**
**作業中**
**完成**
と言ったものをテンプレートで表示させるようにし、最初のリスト作成する手間を減らしました。

##流れ
メインのシステムのや工夫した点を一部載せていきいます。
作品→[TODOdo?](https://heroku-tododo.herokuapp.com/)

##1,home画面

###曜日の表示
こちらは見たままです。
vue-routerを使い曜日に対する画面を切り替えるために、定義した配列の中で曜日に応じたパスも定義しております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302326/18907270-605a-d321-f84f-091d234a43f4.png)

```sample.vue
<script>
import draggable from 'vuedraggable'
export default {
  name: 'App',
  components: { draggable },
  data() {
    return {
      weeks: [
        {path: 'mon', week: '月'},
        {path: 'tue', week: '火'},
        {path: 'wed', week: '水'},
        {path: 'thu', week: '木'},
        {path: 'fri', week: '金'},
        {path: 'sat', week: '土'},
        {path: 'sun', week: '日'}
      ],
    }
  },
}
</script>
```
こんな感じ〜

##2,メイン画面
左上の「新しくリストを作る」で新規のカードを作成し、その中の「するべきことを追加」「作業中を追加」「完了を追加」でリストを追加できます。
そして、ゴミ箱にリストを持っていくと削除することができます。
###並び替えしたときの順番の保持
このカードが追加されたり、リストが追加or削除されたりするとlocalStorageに保存されるようになっています。
ちなみに、並び替えは[Vue.Draggable](https://github.com/SortableJS/Vue.Draggable)で行なっています。
![画面収録 2019-12-01 2.15.41.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302326/cd999519-9158-f0a1-ac1b-a1b8e0671f95.gif)

ここで工夫した点は、並び替え時の順番は保存する点です。
Vue.Draggableの機能で、並び替えしたときの順番も保持できるのですが、それを使うとゴミ箱にリストを捨てる際、選択していないリストも一緒にゴミ箱に捨てられるといった挙動になってしまいました。

なので、Vue.Draggableに備わっているeventの```end```を使い並び替えしたときの順番を保持させました。
```end```は選択したリストを掴んで、離したときに発火するイベントです。

選択したリストの情報は[eventobject](https://github.com/SortableJS/Sortable#event-object-demo)で取得できるので、その中からいろんなデータを引っ張り出しあーだこーだして並び替えしたときの順番を保持しlocalStorageへ保存しました。

###trash
リストをゴミ箱に移動させた際も[eventobject](https://github.com/SortableJS/Sortable#event-object-demo)でDOMを抜き出して、```display: none;```を付与し消えたように見せています。
今後はゴミ箱をクリックするとゴミ箱の中身が見れるようにし、そこから削除をできるようにしていきたいと思っています。

##まとめ

###実際作ってみてどうだった？
実はTODOリストを作成するのが初めてなのもあって「まぁこんな感じかな〜」とシステムを頭の中で思い描いていたのですが、記述した並び替えの保持やtrash機能などについては少し悩みました。
「どうやって選択したDOMの情報を取得するんだ？？」と。
結果的に[eventobject](https://github.com/SortableJS/Sortable#event-object-demo)を見つけてからは早かったのですが、documentをよく読まねばなと思いました。

そして、何より楽しかったです。
普段TODOリストは使わないのですが、Trelloにしろ参考にした記事のDEMOにしろ、「凄いな〜」と思う反面「こうだったらもっと使いやすくなるのにな〜」とか思いついてそのアイディアを実装していく過程がとても楽しかったです。

この後も機能追加したり、他の作品を作っていきます。

###おまけ
今後追加していきたい機能
・レスポンシブ化
・携帯と同期させられるようにする
・作業中から完了までの時間を可視化させる
・スケジュール張と同期させるようにする。
作品はこちら→[TODOdo?](https://heroku-tododo.herokuapp.com/)
至らぬ点もありますが、良かったら使ってみてください。
そして、アドバイス等頂ければ幸いです。
実践 キングウンコの作り方

アドベントカレンダーできてたので、せっかくだからなんか書いてみる。

### そもそもキングウンコってなに？

こいつ。
主に[シェル芸bot](https://twitter.com/minyoruminyon)に生息しているよ！
キングとついてるだけあって、そこらのウンコとはわけが違うよ！！

![t.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152960/616aff07-2064-20d7-c402-bd92b1feaf1b.png)

最近は、世界でもっともクリーンなOSSとして名高い[super_unko](https://github.com/unkontributors/super_unko)リポジトリの`unko.shout`とか`unko.king`なるコマンドによって生成されてるけど、当初はsedとかを駆使して生み出してた。
もともとは`unko.tower`というコマンドの出力を利用していたよ！

### 作ってみよう！

#### 一般的なコマンドで作る

もともとのベースにしている`unko.tower`の元になったシェル芸を参考に生成してみる。
ちょっと長い。

```
(
  x=5; \
  eval echo {${x}..1} | \
    fmt -1 | \
    perl -snle '$l="　"x$_;$m="💩"x($n-$_);print $l."（$m💩$m）"' -- -n=${x} \
) | \
    sed -e"s/（💩）/　👑/" -e'3s/💩/👁/'{2,3} -e'4s/💩/👃/4' -e'5s/💩/👄/5'
```

##### 参考

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">seq 3 | tac | perl -snle &#39;$l=&quot;　&quot;x$_;$m=&quot;　&quot;x($n-$_);print <a href="https://twitter.com/search?q=%24l&amp;src=ctag&amp;ref_src=twsrc%5Etfw">$l</a>.&quot;（$m　$m）&quot;&#39; -- -n=3 | sed &quot;s/（　）/　人/&quot; | sed &#39;s/^/./&#39;<a href="https://twitter.com/hashtag/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8?src=hash&amp;ref_src=twsrc%5Etfw">#シェル芸</a></p>&mdash; ぐれさん (@grethlen) <a href="https://twitter.com/grethlen/status/984423562835628032?ref_src=twsrc%5Etfw">April 12, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#### unko.towerを用いる場合

最初にこさえたときの方法。
unko.towerでは当初`-m(文字列をうんこの中に入れる)`や`-s(文字列をウンコの中に入れる(繰り返し))`オプションがなかったので、sedでウンコの中の全角スペースを置換する処理をしていたよ。

```
unko.tower 4 | \
 sed -r ':a;s/(（　*)　/\1💩/;ta' | \
 sed -e'3s/💩/👁/'{2,3} -e'4s/💩/👃/4' -e'5s/💩/👄/5' -e'1s/人/👑/'
```

あとから追加された`-s`オプションを使うと2行目の処理が不要になる。

```
unko.tower -s 💩 4 | sed -e'3s/💩/👁/'{2,3} -e'4s/💩/👃/4' -e'5s/💩/👄/5' -e'1s/人/👑/'
```
GoでIteratorパターンを実装する

## 概要

デザインパターンの１つであるIteratorパターンをGoで実装してみます。

## Iteratorパターンとは

Iteratorパターンは、任意のオブジェクトを集約して列挙しながら参照する時によく用いられるデザインパターンです。

forで回せないような複雑なリストを列挙したい場合などに、列挙処理を内部に隠蔽して順次に参照できるようになる利点があります。


## Goでイテレーターが使われている処理

例えばdatabase/sqlの内部実装でイテレーターが使われています。
sql.Drivers.Rowsにイテレーターが実装されていて、上流レイヤであるsql.Rowsでmutexなどを使って処理をラップしているようです。

sql.Rows
https://golang.org/src/database/sql/sql.go?s=75693:76415#L2672

sql.Drivers.Rows
https://golang.org/src/database/sql/sql.go?s=75693:76415#L2672

## 実装例

Iteratorパターンでは、以下の概念のオブジェクトを実装します。

- Items(アイテムの集合体)
- Item(アイテム単体)
- Iterator

一般的にIteratorは以下の2つのメソッドを持ちます。

- HasNext() -> 次の要素が存在するか。
- Next() -> インデックスをインクリメントする。

さて、以上のことを踏まえてここからは音楽プレーヤを例に解説します。
プレイリストをMusics、中身の単体のアイテムをMusicとしつつ、
Musicsを管理するイテレータ構造体を作成して、Musicsの中に処理を隠蔽する構成で作っていこうと思います。

まずはMusicの定義。

```go
package main

type Music struct {
	Id     int64
	Title  string
	Artist string
}

func (m Music) String() string {
	return fmt.Sprintf("ID: %d, Title: %s, Artist: %s", m.Id, m.Title, m.Artist)
}
```

次に、Musicの集合体を定義する前にMusicsが保持するIteratorを先に作成します。

```go
type MusicsIterator struct {
        // MusicのAggregate
	Musics *Musics

        // 現在のインデックス
	Idx    int64
}

func (m *MusicsIterator) HasNext() bool {
	if m.Idx < m.Musics.GetSize() {
		return true
	}
	return false
}

func (m *MusicsIterator) Next() *Music {
	item := m.Musics.GetItemAt(m.Idx)
	m.Idx += 1
	return item
}
```

最後に、Musicの具象AggragateクラスであるMusicsを定義します。

```go
type Musics struct {
        // 外に解放しない
	items    []*Music
	iterator *MusicsIterator
}

func NewMusics() *Musics {
	m := &Musics{
		iterator: &MusicsIterator{},
	}
	m.iterator.Musics = m
	return m
}

func (m *Musics) GetItemAt(idx int64) *Music {
	if m.GetSize() <= idx {
		return nil
	}
	return m.items[idx]
}

// AggregatorのアクションとしてIterationさせたいので
// Iteratorの処理をラップ。
func (m *Musics) HasNext() bool {
	return m.iterator.HasNext()
}

// ここも同じ
func (m *Musics) Next() *Music {
	return m.iterator.Next()
}

// わかりやすくするためにsliceにappendしていますが
// リストの場合などはポインタで連結して再代入。
func (m *Musics) Append(music *Music) {
	m.items = append(m.items, music)
}

// ここもわかりやすくするために単純にlen(xx)で済ませていますが
// リストの場合などはノードをたどる処理が入ったりするかも。
func (m *Musics) GetSize() int64 {
	return int64(len(m.items))
}
```

さて、準備が整ったので実際にイテレーションの動作を確かめてみましょう。

```go
package main

import (
	"fmt"
)

func main() {
        // 要素をappendして出力するだけ。
	musics := NewMusics()
	musics.Append(&Music{
		Id:     1,
		Title:  "MusicA",
		Artist: "ArtistA",
	})
	musics.Append(&Music{
		Id:     2,
		Title:  "MusicB",
		Artist: "ArtistB",
	})

	for musics.HasNext() {
		m := musics.Next()
		fmt.Println(m)
	}
}
```

はい、見事に集約された構造体の走査処理を隠蔽することができました。
出力はこのようになるはず。

```shell
ID: 1, Title: MusicA, Artist: ArtistA
ID: 2, Title: MusicB, Artist: ArtistB
```

実際に書いたコードは [https://github.com/OdaDaisuke/go-algorithm/blob/master/dp/iterator/main.go](https://github.com/OdaDaisuke/go-algorithm/blob/master/dp/iterator/main.go)
ABC086C - Traveling

#問題
https://atcoder.jp/contests/abs/tasks/arc089_a
<img width="1115" alt="スクリーンショット 2019-12-01 17.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/17eb9c3f-3028-529f-61ad-a1d8013f9834.png">

#1回目
##回答
```ruby
N = gets.to_i
T,A,B = N.times.map{gets.split.map(&:to_i)}.transpose

can = true
t, x, y = T[0], A[0], B[0]
for i in 0..N-1
  if i > 0
    t = T[i] - T[i-1]
    x = A[i] - A[i-1]
    y = B[i] - B[i-1]
  end
  if x + y > t || ( t - x - y ) % 2 != 0
    can = false
    break
  end
end

puts can ? "Yes" : "No"
```
##結果
<img width="1087" alt="スクリーンショット 2019-12-01 17.38.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/924f7fd5-da92-d768-85a9-0983cd7f8a6c.png">

#感想
他の人の回答を見た所、t,x,yの差を見ていなかったのが不思議だ。
もうちょい考えます。
奇数チェックは```odd?```にした方が良い。
Rider で捗る、inspector の変数リファクタリング

Unity の IDE に Rider 使うと楽になったな～と思っているショートカットの紹介シリーズです。

# 前提
* ショートカットキーの設定が Resharper バインドです

# inspector に出てる変数リファクタリング

Unity の inspector に出てる変数のリファクタリングどうしてますか？

* リファクタリングは諦めている
* 変数名変更してから、再度設定している
* FormarlySerializeAs つけて修正している

これ、Rider なら自動 FormarylySerializeAs 付けてでやってくれます。
F2 押して出てくるポップアップに変更後の変数名入れたら一発です。
![f2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c4c11ced-20cf-b5ea-a094-872587428938.gif)
【俺得】EBS暗号化とは

#前提知識
EC2作成時等に表示されるEBS暗号化について、深く理解してこなかったので整理したいと思う。
今迄での認識では、ストレージ自体の暗号化を行っておりあまり意味なさそう。。。位しか知らなかった。

<img width="1099" alt="AW.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/8a08bd19-02c9-f8b1-21d4-1d47d5aece49.png">

#EBS暗号化を有効にする事で提供される機能
**1.**　AWSのデータセンターに侵入してHDDを盗まれた場合に、EBS暗号化を行っておけば盗人からデータを守る事が可能

**2.**　EBS～EC2インスタンス間の通信経路上も暗号化される。

#総評
確認した感じだと、EBS暗号化はいらなそう。
現実的にAWSデータセンター内への侵入が起こることが考えられない。
・・・通信経路上の暗号化も不要な気がする。(多分専用線を利用して通信していると考えられる。)

#参考
https://blog.jicoman.info/2018/04/ebs-encryption/
Youtubeで見る海外エンジニアのお仕事

# はじめに
元技術部で現在営業部として働いています。
この秋、先輩がドイツの会社に転職したのを機に、海外のエンジニアは
どのような働き方をしているのか興味を持ちました。

# なぜYoutubeなのか
単純にググったり、SNS界隈を探せば調べられる情報とも思いますが、
現場の空気感や働いてる姿というものを見るのであればやはり動画かなと思いました。
最近はvlogという言葉もあり、結構探したら出てきたので紹介したいと思います。

個別のチャンネルごとではなく、こんなキーワードで探すといいよ！というまとめです。

## 1.engineer day in the life
名前の通り、起きるとこから寝るところまでを1日追ってます。
日本でも「エンジニアの一日」と検索すれば出てきますが、会社公式アカウント等が多く、
どうも作りこみされてる感があります。（コメントOFFなど。。。

<img width="720" alt="aday.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541506/801b5247-c223-8455-a822-a9d0762fc72b.jpeg">


海外はほぼセルフィ―で撮影していますが、
Facebook、SAP、iOSのエンジニアの方が投稿されています。

海外のオフィスに憧れもちます。。。

[検索リンク engineer day in the life](https://www.youtube.com/results?search_query=engineer+day+in+the+life)

## 2.datacenter engineer
弊社もデータセンターに監視センターをもっているので気になる分野です。
1つ目と被る分野もありますし、多々単にデータセンターの紹介もありますが
規模が違うスケールのものも多々あり興味があります。

<img width="715" alt="datacenter.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541506/752327d2-407f-0120-b01c-184e64fbc625.jpeg">


[検索リンク datacenter engineer](https://www.youtube.com/results?search_query=datacenter+engineer)

## 3.sre developer
もう少し範囲をせばめてみるパターン。
そもそもどのような定義をしているか、google先生の公式動画であったり、
主にインタビュー・講演内容が多くなってきます。

<img width="702" alt="sre.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541506/69063b3f-faf3-df08-f20a-c3d362c7cb6a.jpeg">


自分の主な活動分野での単語の組み合わせで検索してみると面白いと思います。

[検索リンク sre developer](https://www.youtube.com/results?search_query=sre+developer)

# まとめ
日本のエンジニアの方はイベントや勉強会などで話を聞くことは出来ても
海外の方は中々触れあえないため、情報を仕入れる方法としても1つの方法かと思います。
あとは英語の勉強にも使えて一石二鳥な感もあります！！
興味持った方は是非見てみてください。
人生で初めて意図的にtry catchを使った話

こんにちは、ヨースケです。
![qiita1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/f1fe294c-01d6-69f9-2fa6-5e8f6f34140f.png)
記事を出して3つ目の[僕がAndroidアプリ開発をする上で気を付けていること](https://qiita.com/ysk75/items/52bece8017532f1e8875)が300以上のviewsにいいねが4も付きました！ありがとうございます！励みになりますなります。m(v _ v)m

- 以前は..
- 初めてのアプリで

### 以前は..
　意図的じゃなかったらどうやってtry catchしてんだwって話なんですが、今までは参考書とかに書いてある通りコードを打って「あぁ、例外処理なんだな」と思って何にも気にしていませんでした。なので、try catchをする意味も理解できていませんでした。食わず嫌いも少しあったかもしれません。

### 初めてのアプリで
![qiita1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/4862d1ee-dd99-b045-6bff-b7e5fcffd744.png)

　初めて作ったアプリで2進数、16進数変換をしたいときに入力された数字が整数じゃないと計算できない、そもそも整数以外で変換ボタンを押すとNumberFormatExceptionのエラーが発生してしまいます。何とかそのエラーを防ぎたいと目につけたのが今まで避けていたtry catchです。(一部抜粋です↓)

```java:MainActivity.java
 //int型以外の数値が入ったら2進数変換ができないのでエラー処理
                    try{
                        int error = Integer.parseInt(calc_text.getText().toString());
                    }catch (NumberFormatException e){
                        calc_text.setTextColor(Color.RED);
                        Toast.makeText(MainActivity.this,"変換は整数でしか行えません！または範囲外の数値です",Toast.LENGTH_SHORT).show();
                        break;
                    }
```
これは入力された数字がInt型以外、つまりNumberFormatExceptionのエラーが発生するなら文字を赤くしてトーストでエラー内容を表示するといった内容です。(switch内なのでbreakしてます)
　何て便利なんだ！とそのときは感動を覚え、ちょっとは成長できたかなーと思ったものですが、やっぱり何でもやってみないと分からないものですね(当たり前)。
軽量なSambaのDockerイメージを作ってRaspberry Piで動かしてみた

# はじめに
Raspberry PiをNASにするため，Dockerでsambaを立ち上げるべく，Alpine Linuxをベースイメージとして，(たぶん)軽量なイメージを作成してみました↓↓

- [Dockerhub](https://hub.docker.com/repository/docker/horithe3rd/lw_samba)

Dockerでsambaを動かす場合はdperson/sambaが有名ですが，今回は勉強もかねてすべて自分でDockerfileを書いてみました．

# 環境
Raspberry Piで動かします。

- マシン: Raspberry Pi 3B+
- OS: hypriot OS

```shell
$ docker --version
Docker version 19.03.5, build 633a0ea
```

# つくるもの
機能は単純に高望みせず，以下のような物を目指します．

- ユーザのホームディレクトリを共有
- 軽量にするためベースイメージはAlpine Linux
- あくまで個人利用目的で複数ユーザ、セキュリティは考慮しない

# つくったもの
構成は、

- Dockerfile
- smb.conf
- start_samba_system.sh

の3ファイルです。

smb.confはbuild時にイメージに取り込まれ、デフォルトのsmb.confと置き換えられます。また、start_samba_system.shはsamba起動スクリプトです．

## Dockerfile

```dockerfile
FROM alpine:3.9
MAINTAINER HoriThe3rd

ENV USERNAME="name" \
    PASSWD="weak_passwd"

RUN apk update && apk --no-cache add samba

COPY ./smb.conf /etc/samba/
COPY ./start_samba_system.sh /usr/local/bin
RUN chmod 775 /usr/local/bin/start_samba_system.sh

EXPOSE 139 445
ENTRYPOINT [ "/bin/ash" ]
CMD [ "/usr/local/bin/start_samba_system.sh" ]
```

コンテナ起動時は、ENTRYPOINTで/bin/ashを呼び出し、CMDでstart_samba_system.shを走らせています．
このシェルスクリプト内で環境変数USERNAMEとPASSWDを使ってsambaユーザを作成し，sambaを起動します．docker run時に環境変数を設定することで任意のユーザ名とパスワードに対応します．

なお、Alpine Linuxを用いているので、シェルはbashではなくashが標準です。

## samba起動スクリプト

ユーザの作成を行った後にsambaを起動しています．
シェバンが#!/bin/ashになっています．

```shell
#!/bin/ash

# Create an account
adduser -D $USERNAME
echo $USERNAME':'$PASSWD | chpasswd
echo -e $PASSWD'\n'$PASSWD | pdbedit -a -u $USERNAME

# Start daemons
nmbd restart -D
smbd restart -FS </dev/null
```

最後の行の</dev/nullはコンテナを起動した瞬間にexitedとなってしまうのを防ぐために入れています．こちらの記事を参考にさせていただきました．
[Dockerでイメージ作成してsamba立ち上げる](https://qiita.com/hasegit/items/3cf5dbd8951d8f236d54)

## smb.conf

ホームディレクトリを共有する設定をしたものを配置しました．

```text
[homes]
   comment = Home Directories
   browseable = no
   writable = yes
```

# ビルド
Dockerfileのあるディレクトリでビルドします。

```shell
docker build -t mysamba:1.0 . 
```

ビルド後のimageのサイズは、私の環境で32.1 MBと思いの外軽量に出来あがりました。dockerhubで有名なdperson/sambaが200 MB以上だったので大幅に軽くなっています。
もちろん、今回作成したものは必要最低限の構成なので、この比較はあくまで参考値とお考えください。

ラズパイのようなリソースの少ないマシンでは特に小型なのは助かります。

# Run
自分でビルドしない場合は，次の"Dockerhubからダウンロードして実行する場合"を使ってください．

コンテナの/home/USERNAME/以下がsambaで共有されるので、-vオプションなどでホストのストレージと同期するようにして起動します。--restart=alwaysで再起動時に起動するようにしています。

```shell
docker run -d -p 139:139 -p 445:445 --name smb --restart=always -v <host path>:/home/USERNAME -e USERNAME="<your_name>" -e PASSWD="<your_pw>" mysamba:1.0
```

# Dockerhubからダウンロードして実行する場合
Dockerhubにイメージをpushしていますので，以下のコマンドで実行できます．
ラズパイで実行する場合は，rpiタグで使用できます．latestはアーキテクチャがamd64なので通常のマシン用です(試していませんが・・・)．

```shell
docker run -d -p 139:139 -p 445:445 --name smb --restart=always -v <host path>:/home/USERNAME -e USERNAME="<your_name>" -e PASSWD="<your_pw>" horithe3rd/lw_samba:rpi
```

# おわりに
実際にDockerfileを手書きしてなかなか勉強になりました．

Alpine Linuxを用いることでかなり軽量なsambaイメージを作成することができました．ラズパイのようにリソースが少ないマシンで扱うにはやはりCentOSやUbuntuをベースにすると重たくなってしまうのでAlpine Linuxが便利ですね．

なお，今回作成したイメージはセキュリティなどは全く考えていないので，何かあっても作者は責任は取らないことはお約束です・・・
JMockitでテスト対象クラスから呼ばれるクラスの部分Mock方法メモ

#必要な状況
テスト対象クラスから呼ばれるクラスの一部のメソッドのみMock化したい場合

#JMockit
1.46

#結論
1. ExpectationsにMock化したいインスタンスを渡して、Mock化したいメソッドのみExpectations内に定義する
2. テスト対象クラスに（無理やり）設定する

#テスト対象クラス
```java
public class Sample {

	@Inject
	Hoge hoge;

	public String getHoge() {
		return hoge.getHoge() + hoge.getHogeUpper();
	}
}
```
テスト対象クラスからInjectしたHogeのメソッドを使用しています。
そのHogeについて部分Mockしたい場合の対処法となります。

#テスト対象クラスから呼ばれるクラス
```java
public class Hoge {

	public String getHoge() {
		return "hoge";
	}

	public String getHogeUpper() {
		return null;
	}
}
```
getHogeは実装完了しており、getHogeUpperはまだ未実装という状況としてください。

#テスト失敗
```java
public class SampleTest {

	@Tested
	Sample sample;

 	@Injectable
	Hoge hoge;

	/**
	 * テスト対象クラスから呼ばれるクラスの一部のメソッドのみMock化したいケース。
	 * テストは失敗する。
	 */
	@Test
	public void test() {

		new Expectations(hoge) {{
			hoge.getHogeUpper();
			result = "HOGE";
		}};

		String actual = sample.getHoge();
		assertThat(actual, is("hogeHOGE")); // actualはnullHOGEとなる
	}
}
```
テスト対象クラスはInjectを使用しているため、通常、JMockitの@Testedと@Injectableでインスタンスを注入するようにかくと思いますが、それではテストは失敗します。
理由は、@InjectableでHogeのすべてのメソッドが空になるためです。

#テスト成功
```java
public class SampleTest2 {

	Sample sample = new Sample();

	/**
	 * テスト対象クラスから呼ばれるクラスの一部のメソッドのみMock化したいケース。
	 * テストは成功する。
	 * @throws Exception
	 * @throws NoSuchFieldException
	 */
	@Test
	public void test() throws NoSuchFieldException, Exception {

		Hoge hoge = new Hoge();
		new Expectations(hoge) {
			{
				hoge.getHogeUpper();
				result = "HOGE";
			}
		};

		// Sampleのprivateフィールドに部分Mockしたhogeを設定
        Field field = sample.getClass().getDeclaredField("hoge");
        field.setAccessible(true);
        field.set(sample, hoge);

		String actual = sample.getHoge();
		assertThat(actual, is("hogeHOGE"));
	}
}
```
部分Mockの詳細は以下を参照してください。
https://jmockit-ja.nyamikan.net/tutorial/Mocking.html#partial
部分MockしたMockインスタンスを、リフレクションでテスト対象クラスに設定することでテストを成功させています。

#最後に
JMockitの古いバージョンでは、MockUp<Hoge>で一部のみMock化し、getMockInstanceで取得したインスタンスをDeencapsulation.setFieldでテストクラスに設定していましたが、1.46ではどちらのメソッドも消えていました。。。
JMockitはAPIの削除が頻繁に行われているので、バージョンを新しくする際はご注意ください。
他に良い方法などあればぜひ教えて下さい。