OmniAICreator/Qiita-1.07M huggingface dataset:
PyQSでお気軽Task Queue構築

PythonでQueue制御をする場合、[Celery](http://www.celeryproject.org/)などが定番ですが、Amazon SQSを使った[PyQS](https://github.com/spulec/PyQS)というのを見つけたのでちょっと使ってみました。[README](https://github.com/spulec/PyQS/blob/master/README.rst)とは微妙に挙動が異なるので苦労しましたが、非常にお気軽なTask Queue構築が可能なのはありがたいです。

## 設置

設置は簡単でpipコマンド一発です。
`pip install pyqs`

## 環境変数

以下の環境変数が必要です。

- `AWS_ACCESS_KEY_ID` `AWSS_SECRET_ACCESS_KEY`...Amazon SQSへのRead/Write権限を備えていること
- `PYTHONPATH`...Queueで実行するPythonスクリプトを参照できるようにしておきます

## タスク

pyqsからデコレーター`task`をインポートして、Queueに登録したい関数に載せます。

```qqq/tasks.py
from pyqs import task


@task('queue0')
def another_task(message):
    print "another_task: message={}".format(message)


@task('queue0')
def send_email(subject):
    print "send_email: subject={}".format(subject)

```

## Queueへの登録
```add_queue.py
from qqq.tasks import another_task, send_email
from settings import config

for i in range(0, 100):
    send_email.delay(subject='hogehoge')
    another_task.delay(message='hogehogehoge')
```

## Workerの起動

```run_queue.sh
#! /bin/bash

export PYTHONPATH=`pwd`
export QUEUE='queue0'
pyqs $QUEUE
```

Githubの[README](https://github.com/spulec/PyQS/blob/master/README.rst)によればQueue名は「queue0.tasks.send_email」とか「queue.tasks.another_task」になるはずですが、実際のSQSはQueue名にピリオドは許してくれないので、@taskデコレータで宣言したqueue0がQueue名になります。ここを理解するまでに2時間くらいソース追いかけましたよ。

## まとめ

自力でメッセージブローカーを設定しなくても、Amazon SQSへのアクセス権があれば即Task Queueを作れるのは魅力的です。あとSQSはタダ同然なのもありがたいですね。

##　Github

ソースは [こちら](https://github.com/masayang/pyqs_exploring)
技術英語 > cemented that decision / as it happened

https://answers.atlassian.com/questions/150135/install-on-windows-xp

> As it happened the threading models available in newer versions of .Net that had dropped XP support **cemented that decision**.

http://ejje.weblio.jp/content/cement
> 〈友情・団体などを〉固く結びつける，強固にする.

http://ejje.weblio.jp/content/as+it+happened
> as it happened
> as it happens（たまたま；ｌ折よく；あいにく）の過去形

上記の意訳「あいにく、.Netの新しいバージョンで利用可能なthreading modelsがXPのサポートをやめたことが、**その決定を強固なものにしました**。」
Scala環境設定 on Ubuntu

# TL;DR

Ubuntu16.04でsbt0.13.13以降をインストールする際は、別途Java8を設定する。

```
sudo apt-get install openjdk-8-jre-headless galternatives
sudo galternatives
```
# 経緯

Scalaの公式の手順

```
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt
```

するとこんなエラーがでます。

```
:: problems summary ::
:::: WARNINGS
		[FAILED     ] org.scala-sbt#main;0.13.13!main.jar: sun.security.validator.ValidatorException: No trusted certificate found (3067ms)

		[FAILED     ] org.scala-sbt#main;0.13.13!main.jar:  (0ms)

	==== local: tried

	  /home/ten/.ivy2/local/org.scala-sbt/main/0.13.13/jars/main.jar
```

中国広東省深圳での作業中だったので、中国の金盾がいけないのかなと思ってVPN通したり外したりしたのですが、うまく行かない。"No trusted certificate found"でぐぐってもJavaのエラーの情報ばかり。おお、sbtの神様である当時LightBendの中の人[ユージーン横田さん](https://eed3si9n.com/ja/6years-at-lightbend/)のQAがあるじゃないですか

https://github.com/sbt/sbt/issues/2931

え？jdk6がvirtualパッケージだからjdk8に変えてコミット済み？なるほどなるほどー、で、どうしたらいいの？　質問のリンク先にSolutionが書いてありました。

https://medium.com/@henricook/solution-to-sun-security-validator-validatorexception-e300dd7dba70#.r0ysdbo2d

```
SBT was running with a default of ‘experimental java 9’. Nuking that package and using update-java-alternatives to setup the also installed openjdk-8-jre-headless sorted it right out.
```
jdk9を捨てて、8をセットアップしろということ？Nukeしたら8しか残らないんじゃないの？sortはわかるけど'sorted it right out'ってどういうこと？イディオムわからんけど順番を設定しろということだろう。

横田さんの説明と食い違ってるしよくわからないけどまあやってみよう。

## やったこと

Ubuntu手に馴染んでないまましばらく触ってなかったので全然思い出せない。まずは'apt-cache search jdk*' してみる。openjdk-8-jre-headlessがそれっぽい。うーんjreじゃなくてjdkが欲しいんだけどまあいいか。

CentOSではalternativesコマンドがあったんだけどUbuntuではgalternativesというGUIツールしかないみたい。なのでこれを入れました。よく見たらQAのところにupdate-java-alternativesを使えと書いてありました。guiのやつは一覧できて便利なのでまあこれでいいや。

ということで冒頭のコマンドになりました。

明日からまたalpine使ってdockerにgitbucketとか構築する
Ethereum go-ethereum/gethバージョンによるNetwork Listening Portについて（プライベート環境）

> _（2017/3/25追記）_
> 以下の投稿リンクに続きを記載しました。
どちらかと言うと、複数ノード接続によるプライベート環境構築の方法に力点をおいていますが。。。
> ＜リンク＞
> [「Ethereum go-ethereum/gethでのプライベート環境構築方法について」](http://qiita.com/tomohata/items/8a1156397a6b61df9d75)

> 以上


Ethereum go-ethereum/gethをubuntuへインストールし、プライベート環境にて複数ノードの接続検証実施時に気づいたgethバージョンによる注意点について纏めました。
（ざっくりした感じですみません。。。）

【本文】
--------------
複数ノードをプライベート環境でP2P接続を実施する場合、geth起動時にオプションにてNetwork Listening Port（--port XXXXX（※パブリック環境はデフォルトで30303））を指定する必要がありますが、インストール時のgethバージョンによっては、正常に機能していない可能性があることに気づきました。

具体的には、gethバージョン1.5.9以上だと、geth起動時にNetwork Listening Portを指定しても、geth起動後にnodeinfoで中身を覗くと、ランダムなport番号が割り当てられてしまうようです。

なお、幾つかのバージョンで検証した結果、gethバージョン1.4.20までは指定したport番号の通りに起動するようです。

【検証したgethバージョン】
--------------
v1.3.6
v1.4.20
v1.5.9
v1.6.0

【geth起動例】
--------------
> $ geth --dev --datadir ABC --port 50303 --nodiscover --maxpeers 10 console

上記でgeth起動後、
>\> admin.nodeInfo

を実行。

＜～v1.4.20:geth＞
[nodeinfo]
{
  enode: "enode://publickey_of_node@[::]:50303?discport=0",
（以下略）
}
（コメント）
「--port 50303」と指定した通りに起動していることが、nodeinfoで確認できる。

＜v1.5.9～:geth＞
[nodeinfo]
{
  enode: "enode://publickey_of_node@[::]:XXXXX?discport=0",
（以下略）
}
（コメント）
「--port 50303」と指定したもののnodeinfoで確認すると、実際にはランダムなport番号が割り当てられる。


【Network Listening Portがランダムに割り当てられる場合の問題点】
--------------
本来であれば、プライベート環境で複数ノードを接続する際に、static-nodes.jsonを使用すれば、毎回、接続コマンド（addPeer）を発行しなくても、static-nodes.json内の接続先情報を各ノードが読み込み自動接続してくれます。

その際、設定情報として、「"enode://publickey_of_node@ip:port"」が必要なのですが、今回の問題でいうと、portが毎回ランダムに変更されるため、static-nodes.jsonファイルを読み込んで自動接続ができなくなります。

また手動接続する場合も、ランダムなport番号を指定してaddPeerコマンドを発行しても、うまく接続できないという事象が発生します。

以上よりプライベート環境で複数ノードによる接続検証を行いたい場合、現時点では、gethバージョンをv1.4.20以下にしておくことをお薦めします。

【後記】
--------------
今回のgeth起動オプションの一つである「--port XXXXX」（Network Listening Port）がgethバージョン次第では指定したport番号ではなくランダムに割り振られる、という事象については、他事例や解決策がないか調査中です。
（※現状、英文含めこの話題に触れている記事を見つけることができず、私だけの固有な事象かもしれませんし。。。）
私と同事象が発生して悩んでおられる方がいればと思い、今回の投稿となりました。

何か有益な情報が確認できたらまた連携します。

【参考情報】
--------------
＜複数ノードの接続方法について＞
・ethereumのPrivate Chainを2台のマシンで運用する（ばりきのあしあと）
　http://barikidazu.blog.fc2.com/blog-entry-98.html

・Ethereum(geth)でプライベート・ネットワークを作る手順
　http://qiita.com/hshimo/items/8b69975d40466022f278
WordPress 子テーマの作成


## はじめに

- まずはググって、色々な子テーマの作成の記事を見ながら試していたのですが、どうもローカルで試すと上手く行かず、悩みました。
- 最終的には公式ドキュメントを見て解決できました。最初から公式をチェックすれば良かった。

## 子テーマの作成

### 子テーマディレクトリの作成

```bash
$ cd /path/to/wordpress_root
$ mkdir wp-contents/themes/child
$ cd wp-contents/themes/child
```

### style.css ファイルの作成

ファイルを作成します。

```bash
$ touch style.css
```

「Twenty Ten」を親として、子テーマを作成します。取り急ぎ、最低限の内容としては以下の感じ。

```css:style.css
/*
 Theme Name: Twenty Ten Child
 Template: twentyten
*/
```


### functions.php ファイルの作成

必須なのは style.css のみのようなのですが、この状態だと正しく表示されないので、この手順を行います。親テーマの css を @import する、というのが今までの方法だったようなのですが、良い方法ではないそうです。

[子テーマ - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E5%AD%90%E3%83%86%E3%83%BC%E3%83%9E#.E5.AD.90.E3.83.86.E3.83.BC.E3.83.9E.E3.81.AE.E4.BD.9C.E3.82.8A.E6.96.B9)

> 最後のステップでは、親テーマと子テーマのスタイルシートをキューに入れます。以前は @import: を使用して親テーマのスタイルシートをインポートしていましたが、これはもはや良い方法ではありませんので注意してください。

ファイルを作成します。

```bash
$ touch functions.php
```

内容は以下の通り。

```php:functions.php
<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
  wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
  wp_enqueue_style( 'child-style',
    get_stylesheet_directory_uri() . '/style.css',
    array('parent-style')
  );
}
```

## 子テーマの適用

### 管理画面から子テーマを選択

一覧に作成した子テーマが表示されますので「有効化」します。

![スクリーンショット 2017-03-23 2.05.13.png](https://qiita-image-store.s3.amazonaws.com/0/170980/eb3b4979-17b5-1edb-ef26-e6a033680537.png "スクリーンショット 2017-03-23 2.05.13.png")

### サイトの確認

無事、子テーマが適用されました。めでたしめでたし。

![スクリーンショット 2017-03-23 2.07.26.png](https://qiita-image-store.s3.amazonaws.com/0/170980/48f616b6-0573-b72f-57e5-57d9a38fa692.png "スクリーンショット 2017-03-23 2.07.26.png")
Laravel Elixirで .vue ファイルのCSSにPostCSSを適用する

## 前提

Laravel 5.3
Webpack 2.1.0-beta.22
Vue.js 2.2.4
PostCss 5.2.16

## 完成図

https://github.com/noboru-i/laravel-sample/commit/a77de030829f4135a6437f27209f709c4884faf2 が今回分の差分です。

`Example.vue` などの`.vue`ファイル内に記載したscopedなCSSに対しても、PostCSSが適用されるようになります。

```scss
<style scoped>
@import "../../postcss/variables";
.panel {
  & .panel-body {
    font-size: 40px;
    color: var(--mainColor);
  }
}
</style>
```

出力結果
![image](https://qiita-image-store.s3.amazonaws.com/0/8708/aa95401b-12f3-db72-343b-9113c5304eba.png)


## 手順

`postcss`などの必要なnode moduleを追加します。
yarnを利用していたので、下記のように実行していきました。

```
yarn add postcss -D
yarn add postcss-import -D
yarn add postcss-cssnext -D
yarn add postcss-discard-empty -D
```

すると、package.jsonとyarn.lockが変更されます。
https://github.com/noboru-i/laravel-sample/commit/a77de030829f4135a6437f27209f709c4884faf2#diff-b9cfc7f2cdf78a7f4b91a753d10865a2

次に、プロジェクト直下に `webpack.config.js` というファイルを新規に作成します。
https://github.com/noboru-i/laravel-sample/commit/a77de030829f4135a6437f27209f709c4884faf2#diff-11e9f7f953edc64ba14b0cc350ae7b9d

```js
module.exports = {
  vue: {
    postcss: function(webpack) {
      return [
        require('postcss-import'),
        require('postcss-cssnext'),
        require('postcss-discard-empty')
      ];
    }
  }
};
```

これだけで、最初に書いたようなCSSをPostCSSを適用した形で出力してくれるようになります。
- `@import` による他ファイルの読み込み
- cssnext内の `postcss-nesting` による、ネストされたCSSの適用
- cssnext内の `postcss-custom-properties` による、`var`の解釈

その他、postcssのプラグインであれば、同じようにyarnによるインストール -> webpack.config.jsへの追加によって、追加してくことが出来るかと思います。

## 感想

`.vue`ファイルによるコンポーネント単位のCSS適用は、管理が楽になりそうなので良さげ。
その中でもPostCSSが使えれば、かんたんに書けたり、autoprefixerによる互換性の担保だったりがかんたんに出来そう。

ただ、Laravel 5.4でElixirからMixになったんですよね。。。
[めも]pixi.jsなどで、Error: WebGL: drawElements: This operation requires zeroing texture data. This is slow.が発生する場合

バグを拾ったようなので、暫定めも。
手元環境:
Firefox:52.0.1
PIXI.js:4.4.2

#現象：drawElements()などが呼ばれると、Firefoxの場合は、"Error: WebGL: drawElements: This operation requires zeroing texture data. This is slow."が表示される
初期化関連の現象なので、初回のみ発生。
原因はFirefox側ではないと思われます。

##発生個所
pixi.jsの、21784行目
`SpriteRenderer.prototype.flush`の`gl.drawElements()`

再現用のコードは、[[めも]pixi.jsなどで、Error: WebGL: texImage2D: Conversion requires pixel reformatting.が発生する場合[Firefoxのバグ]](http://qiita.com/toris-birds/items/e3b5a2f254d1cabdb273)と同じです。

##Firefox側のエラー表示部分
[ZeroTextureData()](https://dxr.mozilla.org/mozilla-central/source/dom/canvas/WebGLTexture.cpp#625-641)
>   // This has two usecases:
    // 1. Lazy zeroing of uninitialized textures:
    //    a. Before draw, when FakeBlack isn't viable. (TexStorage + Draw*)
    //    b. Before partial upload. (TexStorage + TexSubImage)
    // 2. Zero subrects from out-of-bounds blits. (CopyTex(Sub)Image)

pixi.jsの場合は、drawElements()がDraw*の条件に該当するらしい。
(three.jsの例は、CopyTex(Sub)Image()の方。)

###Firefox側の関連個所
dom\canvas\WebGLContextDraw.cpp
`WebGLContext::DrawElements()`、`DrawElementsInstanced()`、`DrawArrays()`、`DrawArraysInstanced()`
=> `ScopedResolveTexturesForDraw scopedResolve()`
=> `ScopedResolveTexturesForDraw::ScopedResolveTexturesForDraw()`
dom\canvas\WebGLTexture.cpp
=> `WebGLTexture::ResolveForDraw()`
=> `WebGLTexture::GetFakeBlackType()`
=> `WebGLTexture::IsComplete()`、`IsMipmapComplete()`
=> `WebGLTexture::EnsureLevelInitialized()`
=> `WebGLTexture::EnsureImageDataInitialized()`
=> `WebGLTexture::InitializeImageData()`
=> `ZeroTextureData()`

`EnsureImageDataInitialized()`などで使っている、ImageInfoは、
dom\canvas\WebGLTexture.h にある。

エラーメッセージにある"zeroing"は、`calloc()`のこと。

ImageInfoの`mIsDataInitialized`が`false`の場合に`InitializeImageData()`が呼ばれる。

#似たようなバグ
[three.js - Lens Flares and Firefox 45 #8321](https://github.com/mrdoob/three.js/issues/8321)　(対策済み)

>  Mugen87 commented on 17 Mar 2016 
> I'm still getting the error messages in FF45 and OS X 10.10.5. According to the source code zeroing texture data seems to be evil since FF45.
>
>>    Zero subrects from out-of-bounds blits. (CopyTex(Sub)Image)
>
Maybe the parameters of gl.copyTexImage2D in LensFlarePlugin are not 100% correct...

>  Mugen87 commented on 18 Mar 2016 
>copyTexImage2D copies pixels from the current Framebuffer to a texture. If the area of the copy is not defined correctly (e.g. outside of the viewport), FF will produce the mentioned messages.
>
The LensFlarePlugin plugin in three.js had some out-of-bound copies. The upcoming PR will prevent this behavior.
Slackを導入して直面する疲れ（利用者視点）


## 前提：Slackの利用状況など
メールからSlackに転換して、その恩恵を感じていますが、一方でSlackに変えてから生じた新たな課題（＝利用者の疲れ）について、書き出していきます。

* Slackを導入してから1年弱です。（2017年4月時点）
* Slackチームへの参加人数は、約300人です。（ゲストアカウント含む）
* チャンネル数はパブリックだけで約130個です。
* 1チャンネルあたりの参加人数は、おおよそ平均で8〜10名前後です。(アラート通知など閲覧中心のチャンネルは除く)
* 一番人数の多いチャンネルは #generalで約100名です。
* 利用プランは「Standard」です。

＜書かないこと＞

* Slackの機能紹介、操作説明、用語説明
* アプリ連携やBotなどの技術的な課題

＜補足＞

* 課題が収束しないので、随時、追加していく予定です。
* 解決策も随時、更新していく予定です。（策があれば）


## 本題：Salckで直面する課題＝疲れ

### 課題
事象と問題点

* 解決案？

の形式で書いていきます。

---

### `@channel`メンションを多用される
情報発信者にとっては重要な情報のつもりで`@channel`メンションを何度も使うが、受信者側はメンション通知が何度も送られてきて、Slack疲れする。

* 情報のウォッチが必要な場合は、受信者側で`Activity of any kind`などの通知設定で代替が可能。
* 必要な対象者のみのメンションにする
* それも厳しい場合は、せめて`@here`メンションにする。


### チャンネルの参加人数が多すぎて、書き込みづらい
（障害対応時のチャンネルなど）人が多すぎると代表者的な人が書き込むべきみたいな暗黙の空気ができてしまって、お見合い状態になる。情報を把握したい人は多いけれども、書き込もうとする人は少ない。かといって、みんなが書き込み出すと話が交錯して混乱しやすくなる。

* 参加人数を絞り込んだほうがいいのかもしれない。（可能なら）
* 緊急時などは、可能なら対面で話す。
* 拠点が離れている場合は、Slackの音声通話機能(Calls)などを使う。（最大15名まで同時通話可能）


### 関係のないチャンネルから離脱しない
本人に関係ないチャンネルでも「たまに重要な情報が見つかるから」といって、チャンネルに張り付く人がいる。結果、Slackだけを見つめている状況が多くなり、その人の作業進捗が停滞する。

* 無関係な投稿のウォッチは目の前の作業を妨げるので、離脱するよう推奨する。
* 管理者から強制的に離脱させる（`Remove`）


### 投稿しながら編集する（結果、長文になる）
書き終わったのか、まだ書いている途中なのか分からないし、読んだ後に内容を大幅に編集されると、もう一度読み返さないといけなくなる。さらに連投されると、読む気が削がれて、Slack疲れする。

* できるだけ連投しない。書く内容が固まってから投稿する。
* 編集は誤字脱字の修正のみとし、大幅変更の場合は一度削除する。
* 投稿後の編集可能な時間を制限する（`Message Editing & Deletion`）


### Slack上で議論する（終わりが見えない）
議論をしたがっている人は充実しているように感じているが、目の前の作業を中断されて応答している人は、相手の書き込みを待っている時間がもどかしい。要点がつかめないと苛立ちやすくなる。

* やりとりが3往復以上する場合は、可能なら対面で話をしよう。（その方がはやい）


### 急ぎの用件をSlackだけで済ませようとする
相手のSlack上ステータスがアクティブだからといって、必ずしもSlackに気付ける状況とは限らない。後になって、なんでSlack見てないんだと揉めることがある。

* 本当に急ぎの場合は、対面で話しましょう。


### 常にSlackを見なきゃいけない強迫観念が生まれる
夜中でも休日でも常に見ていないと不安になるらしく、Slack疲れする人が増える。

* 解決策を模索中。。


### 操作権限が縛られ過ぎている
Slackでは、いろいろな操作の権限を設定できますが、（たとえばチャンネル作成はOwnerのみ可など）権限を縛りすぎたりした結果、自由度の失われたツールはあまり使われなくなっていきます。

* 権限設定はデフォルトのまま使用したほうがいい。デフォルトは推奨設定です。
* 制限する場合は、なぜ制限するのか理由や経緯を誰もがいつでも知れる状態にする。


### Slackをあまり使わない人がルールを決めていく
経営層やマネジメント層の声は強いかも知れませんが、実際によく使う現場の人たちの声を無視して決められたルールは、Slackの自由度や利便性が失われるどころか、日々使う人たちの操作負荷があがります。

* 一部の人の間だけで一方的に決めないこと。
* ルールを決めるのであれば、理由や経緯を誰もがいつでも知れる状態にする。
* ルールを決めたとしても、使っていく中で不適切なものは随時ルール変更していくべき。


### コミュニケーション上のトラブルの原因をSlackのせいにされる
今までクローズドな場でも発生していたであろうコミュニケーション上のトラブル（感情的な揉め事）が、パブリックなチャンネル上で目立ちやすくなっただけなのに、Slackを導入したからトラブルが起きていると言われる。

* コミュニケーションの問題をツールで解決しないこと。（Slackの権限を縛るなどはNG）
* 何が問題かをきちんと整理して、誤解のないよう説明を続けるしかなかった。（他の人の間でもトラブルは起きますか、たとえばメールならトラブル防げますか）


## これを書いた背景

Slackチームに新しく参加してきた人は、だいたい似たようなことを経験してSlack疲れしているので、あらかじめ「こういうことが起こるかもしれないけれども、気楽にいきましょうね」と言えるようにしたかった。

いざ、書き連ねて見ると、まだまだ書ききれなかったので、機会を見て追加・更新していきたいと思います。


## 更新メモ
3/24：前提の項目を追加、「チャンネルの参加人数が多すぎて、書き込みづらい」を更新
6/1：「操作権限が縛られ過ぎている」、「Slackをあまり使わない人がルールを決めていく」、「コミュニケーション上のトラブルの原因をSlackのせいにされる」を追加
※Slack特有の問題ではなかったので迷ったのですが、Salckを使っていく中で発生したことは、やはりできる限り、そのまま記録していこうと思います。
RubyでFizzBuzz書いてみた

#RubyでFizzBuzz書いてみます
##FizzBuzzとは？
- 1 から順に数を出力
- 3 で割り切れるならば**Fizz**と出力
- 5 で割り切れるならば**Buzz**と出力
- 3 でも 5 でも割り切れる場合は**FizzBuzz**と出力

といった感じの要件を満たすプログラムです。
僕も新卒のOJTの際に書いてみてって言われてJava,JavaScriptで書いた覚えがあります。

現在仕事でRubyを使っているので、初心にもどって書いてみます。
まずはよく見かける形でコーディング

```fizz_buzz.rb
(1..100).each do |i|
    if i % 15 == 0
        puts "FizzBuzz"
    elsif i % 3 == 0
        puts "Fizz"
    elsif i % 5 == 0 
        puts "Buzz"
    else
        puts i
    end
end
```
ふむ
まずこの```(1..100)```というRangeをターミナルから入力して自由に決めたい。
あとは、ちょっとずつメソッドに切り出してみよう。
加えてRubyのメソッドを存分に使う形で組み替えてみます。

ということで、うねうねした結果がこちら。

```fizz_buzz.rb
def console(args)
  raise "argument is nil" if args.nil?
  puts map_upto args.to_i
end

def map_upto(max)
  (1..max).map { |n| fizzbuzz n }
end

def fizzbuzz_hash
  { 'fizz' => 3, 'buzz' => 5 }.sort_by { |_, v| v }.to_h
end

def fizzbuzz(n)
  fizzbuzz_hash
    .map { |str, val| str if (n % val).zero? }.join
    .tap { |str| break str.empty? ? n : str }
end

if __FILE__ == $0
  console ARGV[0]
end
```

初めとぜんぜん違う感じになりました。
一つずつ見ていきます。

```fizz_buzz.rb
def console(args)
  raise "argument is nil" if args.nil?
  puts map_upto args.to_i
end
```
ターミナル上に表示させるためのメソッド。
consoleというメソッドの引数にターミナル上での入力を渡す予定です。
このスクリプトを実行した際に、引数がなければ例外をあげます。
*to_i* で引数を**String**から**Integer**へ変更し*map_upto*メソッドへ渡しています。
※引数が文字列であった場合でも*to_i*することで0となります。


続いてこちら

```fizz_buzz.rb
def map_upto(max)
  (1..max).map { |n| fizzbuzz n }
end
```
maxが先程*map_upto*メソッドへ渡された値となります。
もとのコードで```(1..100)```となっている部分をmaxで置き換えた感じです。
1から順番に渡された引数までをnという値で順次*fizzbuzz*メソッドへ渡しています。
ここの戻り値がコンソール表示される値となります。


続いてこちら

```fizz_buzz.rb
def fizzbuzz_hash
  { 'fizz' => 3, 'buzz' => 5 }.sort_by { |_, v| v }.to_h
end
```
こちらは単に固定値のHashを返すだけのメソッドとなります。
※　@QUANON さんにアドバイス頂き修正しました。Hashの中身の数値でsortすることで
中身の順番に依存しなくなります。

続いてこちら

```fizz_buzz.rb
def fizzbuzz(n)
  fizzbuzz_hash
    .map { |str, val| str if (n % val).zero? }.join
    .tap { |str| break str.empty? ? n : str }
end
```
まず*fizzbuzz_hash*が先程のHashとなります。
*map*の部分で、引数で受け取ったnが3,5で余りなく割り切れるかどうかでstr、つまりHashのキーの部分を返しています。

*map*は、表示する値を配列にして返すので、例えばnが15の場合、['fizz','buzz']という配列を返すことになります。

対して、余りが生じるような場合は、空の配列を返すことになります。
この配列を*join*することで文字列として返すことが出来ます。
最後に*tap*を使うことで、文字列が空の場合は引数を、そうでない場合は文字列を返しています。


でもって最後

```fizz_buzz.rb
if __FILE__ == $0
  console ARGV[0]
end
```
```__FILE__``` は現在実行しているプログラムのファイル名を表していて
$0は実行時に指定されたファイル名を相対パスで表しているそうです。
これらが等しい場合に、*console*メソッドに入力値を表すARGV[0]を渡しています。
では最後に結果を見てみます。

```
ruby fizz_buzz.rb 15
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
```

いけてるようですね。
時間があればテストも追加しようと思います。
Artifactory on Dockerをセットアップして、MavenからDeploy（アップロード）するまで

# インストール
```
# docker run -d -v /var/opt/jfrog/artifactory:/var/opt/jfrog/artifactory -p 8081:8081 docker.bintray.io/jfrog/artifactory-oss:latest
```
執筆時の最新バージョン: 5.1.4

# セットアップ
ブラウザでhttp\://host:8081にアクセスすると、ウィザードが起動
Configure a Proxy Serverはスキップ
Repository Typeは"Generic"と"Maven"を選択

これでもう、Web画面からリポジトリにDeploy（アップロード）が可能。
Set Me Upで各リポジトリへのDeploy方法がわかる。

# MavenからのDeploy設定

releaseビルド用とsnapshotビルド用、各々にlocalありなしのリポジトリが作られているが、localの方が実際のリポジトリで、なしの方はVirtualリポジトリで複数のリポジトリをまとめて1つのURLでアクセスできるようにする機能のようなので、とりあえずはlocalの方を使うということでOKそう。

あとは、libs-snapshot-localリポジトリのSet Me Upを開いて、snippetをpom.xmlにコピペするだけ。ただ、これだけだとdeployしたときにPermission deniedになってしまうので、anonymousでデプロイできるようにArtifactoryのPermissions設定を変更する。Anythingを選んで、Usersタブを開き、anonymousユーザに対して、Deploy/Cache権限を与える。

これで、maven deployでデプロイができるようになる。なんと簡単。

# セキュリティ設定

だた、このままでは公開して外から使うのは危険なため、以下の設定をする。
- anonymousを無効にして、ユーザ認証を必須にする
- HTTPSにする

## ユーザ認証

ArtifactoryでPermissionsの設定でAnythingからanonymousユーザの権限をすべてとり、MavenのUser Settingsファイルsettings.xmlに以下を追加。

```settings.xml
	...
	<servers>
		...
		<server>
			<id>snapshots</id>
			<username>admin</username>
			<password>password</password>
		</server>
		...
	</servers>
	...
```

## HTTPS

以下のような構成にする。

```
Client -----------> Apache ---------> Artifactory
          HTTPS               AJP
```

Docker版のArtifactoryはもとから8019番でajp接続を受け付けるようになっているため、Artifactory側の設定変更は、コンテナ起動の際のポート設定を8019番にするだけ。

```
# docker run -d -v /var/opt/jfrog/artifactory:/var/opt/jfrog/artifactory -p 8019:8019 docker.bintray.io/jfrog/artifactory-oss:latest
```

あとはApacheの設定。

```
# a2enmod proxy_ajp
# vi /etc/apache2/sites-available/default-ssl.conf
<VirtualHost _default_:443>
        ...
        ProxyPreserveHost on
        ProxyPass /artifactory ajp://localhost:8019/artifactory
</VirtualHost>
# service apache2 restart
```
Rails の i18nでドハマリする前に

うちのサービスが、i18nのインデントの仕方を間違えたせいで、アクセスできなくなってしまった！
なんとか気がついたので、直ったんだけど、普通じゃ気が付かないからまとめておきます。

エラーメッセージは人によって違うが、基本は

インデントの数をちゃんと揃えろってこと。
後、いろんな記事を見ると、半角スペースしか駄目と書いてあるが、それも嘘。
ATOMでタブ使ったら大丈夫でした。

が、重要なのはタブだけではキレイにインデントを揃えられないということ。
半角スペースを使う、一行前の一番後ろにカーソルを合わせてエンターを押して先頭を揃えるなど、テクニックが必要です。

まぁ、僕の場合は見知らぬコードが混ざっていて、そいつのせいでローカルが動かなかった事で、ローカルチェックが出来ずそのまま軽い気持ちでアップロードしたらこのざまになってしまったという教訓があります。

みなさんも、チェックは必ずやりましょう。
Docker(Windows)はじめてみた　～インストールから少し触れる程度~

# [Docker Toolbox](https://www.docker.com/products/docker-toolbox)をインストールする。

![170304-001.png](https://qiita-image-store.s3.amazonaws.com/0/138660/a8f1f6e2-0860-00eb-e6fe-3293646a2b53.png)

![170304-002.png](https://qiita-image-store.s3.amazonaws.com/0/138660/fa964d27-8a8e-7459-17b3-45a85010cc4b.png)

![170304-005.png](https://qiita-image-store.s3.amazonaws.com/0/138660/e42e950c-9b60-8780-e7cd-2468006301a2.png)

### 元々virtualboxとかgitが入っている場合はチェックを外す必要があるので注意
![170304-006.png](https://qiita-image-store.s3.amazonaws.com/0/138660/79eb4c83-eea6-72c4-bdd3-ad31686285e9.png)
![170304-007.png](https://qiita-image-store.s3.amazonaws.com/0/138660/332ff365-fbfa-a0f7-db07-8dc12b0d33ae.png)
![170304-008.png](https://qiita-image-store.s3.amazonaws.com/0/138660/febc1afc-bec8-8e50-1330-daaa04ac030b.png)
![170304-004.png](https://qiita-image-store.s3.amazonaws.com/0/138660/c8b6cb84-a7bc-6e29-3b6b-9a3a0048fe76.png)

![170304-010.png](https://qiita-image-store.s3.amazonaws.com/0/138660/6c32129a-7b92-90e7-d3f5-046b3da896f5.png)

### Docker QuickStart Terminalを実行してクジラがでるまで待つ

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/0741e8bb-479e-9759-fbae-82ebc6a9768f.jpeg)
↑でたらインストール完了。

# ハマったこと
※環境変数を指定する必要がある
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/e31bf4da-de7e-a932-ddbb-ed82a3d66521.jpeg)
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/920cbbf3-cddc-6ac1-4077-67ab8d4a0f9b.jpeg)

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/47cd32d0-faa3-4ece-6d0f-5b2c4a723b2d.jpeg)

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/7be3facc-2521-92e6-cf3c-f4d30db63448.jpeg)

#### ※下記をコピペしてください。
COMPOSE_CONVERT_WINDOWS_PATHS
1


# よく使うコマンド

### dockerマシンを止める
docker-machine stop

### 起動しているコンテナの確認
docker ps 

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/16e336a6-bd05-8d58-1ac5-c9c1f6847610.jpeg)


### 停止しているコンテナも含めた確認
docker ps -a

### 各コンテナに入る
docker exec -it [コンテナの名前(赤い部分)] bash
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/ef83799a-9aa3-3453-a7a3-8649a158fab4.jpeg)

例
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/138660/9a74f7b1-6c49-40b7-74eb-2c9e1e01304a.jpeg)


# docker-composeを使用した場合
### 起動
docker-compose up -d
### 停止
docker-compose stop
### コンテナ削除
docker-compose rm
### 停止と削除
docker-compose down
TwitterはScalaを捨ててはいないらしい

Twitterを始め、方々で噂になっている（？）[この記事](http://www.utali.io/entry/2017/02/24/170000)についてですが、どうやら、モバイル向けのフロントエンドをNode.jsに置き換えただけとのこと。
詳しくは[こちら](https://www.reddit.com/r/programming/comments/5st3dy/all_of_twitters_mobile_web_traffic_thats_like_a/ddjgi5a/)。

しかし、この選択に至った経緯やNode.js以外のJSONパースを最適化してもNode.jsに敵わないのかとか、システム構成がどうなっているのか？といった部分はとても気になるところです。

参考情報
http://kmizu.hatenablog.com/entry/2017/03/22/233335
Rust: クロージャに見る所有権の移動

## はじめに
クロージャ使ってたら色々コンパイラに怒られることがありまして、備忘録程度にまとめておきます。
おそらく中級者以上の方には当たり前すぎる話かと思います。

### クロージャの作成

```Rust:test.rs
#[derive(Debug)]
struct Foo {}

fn test(x: Foo) {
  println!("x: {:?}", x);
}

fn main() {
  let bar = Foo {};
  let clousure = || test(bar);
  clousure();
}
```
クロージャを作成して実行する簡単なプログラムです。
これは全く問題なく動作します。
次にこのプログラムのクロージャ作成部分を関数化してみます。

```Rust:test2.rs
#[derive(Debug)]
struct Foo {}

fn test(x: Foo) {
  println!("x: {:?}", x);
}

fn make_closure() -> Box<Fn()> {
  let bar = Foo {};
  Box::new(move || test(bar))
}
fn main() {
  let clousure = make_closure();
  clousure();
}
```
クロージャを返す関数であるためBoxingされた形にはなりましたが[^1]、前述のプログラムとさほど変わりはありません。
しかし！これはコンパイルエラーが出ます。

```text:Error
error[E0507]: cannot move out of captured outer variable in an `Fn` closure
  --> src\test2.rs:10:25
   |
10 |   Box::new(move || test(bar))
   |                         ^ cannot move out of captured outer variable in an `Fn` closure
```

### どういうことか？
`struct Foo`はCopyトレイトを持っていません。つまり参照でなければ必ず**ムーブ**されるということです。
このプログラムでは「クロージャが作られたとき」と「クロージャ内でtest関数を呼び出すとき」の2回、所有権の移動が起こっています。
つまり、クロージャ内でtest関数を呼び出すと、クロージャは`bar`の所有権を手放してしまうのです。と、いうことはそれ以上クロージャを呼び出すこと、つまり`test(bar);`を実行することはできないですよね？ しかしFnタイプのクロージャは何度も呼び出すことが可能です。矛盾しているわけです。なので、Rustのコンパイラさんは怒っていらっしゃるわけです。
「問題ない」とした最初に挙げたプログラムを見てみましょう。`test1.rs`の`clousure();`の下にもう一度`clousure();`を書き足してみてください。

```text:Error
error[E0382]: use of moved value: `clousure`
  --> src\test.rs:12:3
   |
11 |   clousure();
   |   -------- value moved here
12 |   clousure();
   |   ^^^^^^^^ value used here after move
   |
   = note: move occurs because `clousure` has type `[closure@src\main.rs:10:18: 10:30 bar:Foo]`, which does not implement the `Copy` trait
```

エラーが出てしまいました。実は2回実行していないから大丈夫だったのです[^2][^3]。
また、i32のようなCopyトレイトを持つオブジェクトならCopyが行われるため所有権の移動は起こりません。従って問題なく動作します。


```Rust:test3.rs
fn test(x: i32) {
  println!("x: {:?}", x);
}

fn make_closure() -> Box<Fn()> {
  let bar = 10;
  Box::new(move || test(bar))
}
fn main() {
  let clousure = make_closure();
  clousure();
}
```

### 明示的なClone
std::cell::CellのようなCopyトレイトは持っていないがCloneを持つオブジェクトの場合は、`test(bar.clone());`と明示的にcloneすることで、クロージャがbarの所有権を放棄することなく（ほとんどの場合では）想定された動作を実行できます。

## 終わりに
クロージャは通常の関数と違い、「環境」を持つため通常の関数よりも所有権の問題が発生しやすく、かつ私のような何も考えていない人間ですと何が起こっているのかも分かりづらいです。
同じような部分で躓いている方の助けになれば幸いです。

今回挙げたような例なら、test関数にリファレンス渡したらよくね？というのはナイショにしておいてください。:sweat:

[^1]: Boxではなく`std::rc::Rc`などでも構いません。Boxingが必要な理由などについてはプログラミング言語Rustの[4.23 クロージャ#クロージャを返す](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/closures.html#%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%82%92%E8%BF%94%E3%81%99)を参照してください。
[^2]: コンパイラのエラーを見るに、このクロージャはFnではなくFnOnceのようです。従ってbarの所有権問題というよりもselfの所有権の問題です。この点、`test2.rs`の例とは異なりますのでご注意ください。
[^3]: `test2.rs`においてもFnOnceならいけそうだ！と感じる方はいるかもしれません。ところが、どうもFnOnceはまだ機能的に微妙なようで（1.16.0現在）、これもダメです（[参照: Rust で Box + FnOnce を使う](http://d.hatena.ne.jp/harre_orz/20170212/1486831305)）。またnightlyならば、[FnBox](https://doc.rust-lang.org/alloc/boxed/trait.FnBox.html)というものも使えます。これらを利用すれば期待通りの動作を得られるはずです。ただしFnBoxに関しては、FnOnceがまともになったら置き換わる予定です（[see issue #28796](https://github.com/rust-lang/rust/issues/28796)）。
Vagrant 1.9.3 でポートマッピング設定するとVMが起動しない

# 環境
Windows 7
VirtualBox 5.1.18
Vagrant 1.9.3

# 事の経緯
vagrant 1.9.3がリリースされたのでアップデートしたところ、Vagrantfileでポートマッピングを行なっているVMが軒並み起動しなくなってしまいました。
ポートマッピングを解除すれば起動するものの、マルチVM環境で各VM毎にSSHポートを固定にするためにポートマッピングしているため、vagrant sshはおろか、vagrant up時の共有フォルダー設定すら失敗するという・・・

原因は・・・

[このIssue](https://github.com/mitchellh/vagrant/issues/8395)

ということで、ポートマッピング設定が必要な方は、修正されるまではアップデートを控えられた方がいいかも知れません

ちなみに、Vagrantの中のRubyを弄れば解決するのかも知れませんが、面倒臭かったのでダウングレード（アンインストール＆1.9.2をインストール）しました。
セキュリティ関連の修正が入っていなくてよかった・・・

# 追記
1.9.4 で修正されるとのこと
https://github.com/mitchellh/vagrant/pull/8399#event-1012783833
Rustの所有権(Ownership)について


Rustの所有権(Ownership)について良く理解できないままドキュメントの説明を読んでいたが、自分でサンプルコードを記述しているうちに、理解する必要が出てきた。

まず、よくありがちな配列(Vectors)を使用して、Max関数に引数を渡す例。

```max_main.rs
fn main() {
    let my_array = vec![61,14,71,23,42,8,13,66];
    let max = max(my_array);
    println!("Max value is {}.", max);
    // => Max value is 71.
}

fn max(array: Vec<i32>) -> i32{
    let mut max = array[0];
    for val in array{
        if max < val {
            max = val;
        }
    }
    max
}
```

思った通りに動作する。

その後、Min関数を作成する。そして同様の配列の変数を渡す。

```max_main.rs
fn main() {
    let my_array = vec![61,14,71,23,42,8,13,66];
    let max = max(my_array);
    let min = min(my_array);
    println!("Max value is {}.", max);
    println!("Min value is {}.", min);
}

fn max(array: Vec<i32>) -> i32{
    let mut max = array[0];
    for val in array{
        if max < val {
            max = val;
        }
    }
    max
}

fn min(array: Vec<i32>) -> i32{
    let mut min = array[0];
    for val in array{
        if min > val {
            min = val;
        }
    }
    min
}
```

残念ながらエラーとなる。

```
error[E0382]: use of moved value: `my_array`
 --> src/main.rs:4:19
  |
3 |     let max = max(my_array);
  |                   -------- value moved here
4 |     let min = min(my_array);
  |                   ^^^^^^^^ value used here after move
  |
  = note: move occurs because `my_array` has type `std::vec::Vec<i32>`, which does not implement t
he `Copy` trait
```

理由は、Rustの独自仕様である所有権(Ownership)の問題。
問題というより、他言語に馴染んでいるとハマる部分。
一度でも、プリミティブでない変数への参照が使用されると、参照可能な所有権が移ってしまい、その後に参照しようとするとエラーとなる。

この場合、下記のように修正する必要がある。

```max_main.rs
fn main() {
    let my_array = vec![61,14,71,23,42,8,13,66];
    let max = max(&my_array);
    let min = min(&my_array);
    println!("Max value is {}.", max);
    println!("Min value is {}.", min);
    // => Max value is 71.
    // => Min value is 8.
}

fn max(array: &[i32]) -> i32{
    let mut max = array[0];
    for &val in array{
        if max < val {
            max = val;
        }
    }
    max
}

fn min(array: &[i32]) -> i32{
    let mut min = array[0];
    for &val in array{
        if min > val {
            min = val;
        }
    }
    min
}
```

まだまだ`Rust`勉強中であり、このメリットは感じられないが、まずは所有権(Ownership)の理解には役立ったので、覚え書きとして記述＆投稿した。
【初心者投稿-7】progate_有料会員の壁突破

#昨日までのおさらい
やる気を出したところで有料会員にならないと、全然勉強できないことが発覚！
(最初から調べておけ)
qiitaに"無料で頑張る"と投稿した

#有料会員へ
エンジニアの友人に相談したら「月額980円で勉強の効率上がるなら安い投資でしょ」とご教示頂いたので、さっそく登録。
モチベーションが上がっていた道場コースを1ステージさっそくクリア！

#学習の記録
* Progate5日目
* 今日の勉強時間：1時間
* 総学習時間：5時間55分
* 今日学んだこと：いくら頑張っても高さが合わない。一回どこがダメなのかわからなくなると、捗らなくなりますね…何度確認してもわからないので一回あきらめて明日へ
* 今日の感想：数学の問題に似ている…これまでも答えが出ているのに自分の答えの導き方の誤りを探すことができなかった…
GoのTemplateのPipelines(パイプライン)を理解しながら、テンプレート内で関数にスライスを引数で渡してみる

# Goのテンプレートの中で関数を使い、その関数に引数を渡す
GoでMVCなアプリを書くときに重宝するであろう、templateパッケージ<br>

そのtemplateパッケージを使用してGoでテンプレートを書き、その中で関数を呼び出し、引数に構造体のフィールド上に存在するスライスの要素を渡す<br>

GoのtemplateのPipelinesを理解するのにも役に立つと思うのでメモ<br>

## GoのTemplateでスライスを扱うには
Goのtemplateのあらかじめ定義されたグローバル関数であるindexを使用する<br>

indexは
>最初の引数を続く引数でインデックスした結果を返します。
例えば"index x 1 2 3"はGoの文法では x[1][2][3]となります。
インデックスされる値はマップ、スライス、配列である必要があります。
(引用元:http://golang-jp.org/pkg/text/template/)

## GoののTemplateで関数を扱うには
FuncMapで関数の名前と関数のmapを定義する<br>
詳しくは、後述のコードを参照<br>


## GoのPipelines(パイプライン)とは
>パイプラインはパイプライン文字'|'で区切ってコマンドをつなげることによって「連鎖」させることができます。 連鎖されたパイプラインでは、各コマンドの結果は次のコマンドへ最後の引数として渡されます。 パイプラインにおける最後のコマンドの出力がそのパイプラインの値になります。
(引用元: http://golang-jp.org/pkg/text/template/)

例えば、aというコマンドとbというコマンドが存在した場合、<br>

```
a | b
```

というコードは、Goでは、aのコマンドの実行結果が、bのコマンドの最後の引数となる<br>

## 実装してみる

```go

package main

import (
	"html/template"
	"net/http"
	"log"
)
// メイン関数
func main() {
	// ハンドラをバンドル
	http.HandleFunc("/", Handler)

	// リスナー
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

// テンプレートを生成
func Handler(w http.ResponseWriter, r *http.Request) {
	// 構造体Programを生成
	p := &Program{Languages:[]string{"Go", "Java", "Python", "JavaScript"},}

	// 関数を名前をつけてtemplateのFuncMapに登録
	funcMap := template.FuncMap{
		"judgeLangType" : JudgeLangType,
	}

	// テンプレート部分
	text := `
	Go : {{ index .Languages 0 | judgeLangType}}
	Java : {{ index .Languages 1 | judgeLangType}}
	Python : {{ index .Languages 2 | judgeLangType}}
	JavaScript : {{ index .Languages 3 | judgeLangType}}
	`

	// テンプレートをパースして、http.ResponseWriterに書き込み
	tmpl := template.Must(template.New("calculator").Funcs(funcMap).Parse(text))
	tmpl.Execute(w, p)
}

// 構造体
type Program struct {
	Languages []string
}

// 言語を引数に受けて、その言語の型を返す
func JudgeLangType(lang string) string{
	switch lang {
	case "Go", "Java":
		return "Static"
	case "Python", "JavaScript":
		return "Dynamic"
	default:
		return "unknown"
	}
}

```

実行結果

```
	Go : Static
	Java : Static
	Python : Dynamic
	JavaScript : Dynamic
 
```



上記のコードのテンプレート部分である以下に注目する

``` go
	// テンプレート部分
	text := `
	Go : {{ index .Languages 0 | judgeLangType}}
	Java : {{ index .Languages 1 | judgeLangType}}
	Python : {{ index .Languages 2 | judgeLangType}}
	JavaScript : {{ index .Languages 3 | judgeLangType}}
	`
```

```
Go : {{ index .Languages 0 | judgeLangType}}
```

* ``` index .Languages 0```  で、構造体 ``` Program```  のフィールド ``` Language```  のスライスの0番目の要素を表している
* ``` | ```  で、パイプラインを表している
* ``` judgeLangType```  は、``` template.FuncMap```  で登録した関数を表している

これは、``` |```  の左側の ``` index .Languages 0```  の結果(Languagesスライスの0番目の要素)が ``` |```の右側の ```  judgeLangType```  関数の引数になっている

## 参考にさせていただいたサイト
http://golang-jp.org/pkg/text/template/#FuncMap
https://gohugo.io/templates/go-templates/

※ ブログでも同一記事を投稿している
http://www.sekky0905.com/entry/2017/03/22/Go%E3%81%AETemplate%E3%81%AEPipelines%28%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%29%E3%82%92%E7%90%86%E8%A7%A3%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E3%80%81%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC
ipアドレスを調べる

他のサイトのipアドレスを調べた時に少しつまったので、メモとしてまとめておきます。

##ipアドレスを調べる

###nsllookup
nslookup example.com

※このとき、http://はつけない


###ping
ping -c 3 example.com

-c ：試験的にパケット送る回数を指定。


参考
http://unix.oskp.net/linux_command/ping.html
Rails + devise で、データをメール認証の流れをスキップして登録する方法

RalisでDeviseを使用して、ユーザー周りの機能を実装している。

その中で、入力されたメールアドレスにメールを飛ばし、そこから本登録のURLへ...という流れを採用しているのだが、
管理者が、そのメールの流れを無視して登録する機能が必要だったので、調べた。

結論、Deviseで用意されている `skip_confirmation!` メソッドを save の前に実行すれば、メール認証の流れは無視される。

実際に使用するときは以下のような感じ。

```
# 例外処理とかは特に書きませんのでご了承を！
user = User.new(user_params)
user.skip_confirmation!  # <- こいつで無視される。
user.save
```

以上。

検索用のキーワード↓
すっとばす すっとばし メールなし メール無し メール送らない メール送らずに
Atomの環境を整える for Pythonista

Pythonでコードを書く人向けに、Atomに入れておくべきパッケージを記しておきます。
おそらくこれだけ入れておけば間違いないはず。

### 追記(2017/03/24)
japanese-wrapというパッケージも紹介していましたが、どうやらAtomのアップデートで不要になったどころか不具合を発生させてしまうようです。
ということで外しました。

# 全般系
## japanese-menu
メニュー等、Atomをガッツリ日本語化してくれます。これは必須。
## file-icons
ファイルアイコンが可愛くなります。入れておくといいかも。
## atom-beautify
コードを整形してくれます。けっこういろんな言語に対応。
Pythonコードを整形するために必要なので、pipでautopep8パッケージも導入しておきましょう。
## atom-runner
ターミナル要らずで、Ctrl+Rでプログラムを実行してくれます。
これもPythonやRuby、Go、JS、ShellScriptなどに対応。かなり便利です。
## git-plus
Git使うなら必須。
## minimap
![image](https://qiita-image-store.s3.amazonaws.com/0/132881/2af0d3f8-6d08-b40b-4b4d-70f64e8f8003.png)
こんな感じに、Sublime Textでお馴染みのminimapを表示してくれます。長いコードを書いている際に現在の位置がなんとなく分かって非常に便利。
## terminal-plus
![image](https://qiita-image-store.s3.amazonaws.com/0/132881/87fc8d56-05ce-ad05-b752-fe96e467eb21.png)

Atom内でターミナルが開けます。これも必須と言ってもいいかもしれませんね。非常に便利です。
## browser-plus
![image](https://qiita-image-store.s3.amazonaws.com/0/132881/f460d731-eafd-2264-b5ba-8892b07f33ba.png)

こんな風にAtom内でブラウザが開けます(Chromium)。コード書きながらググりやすいし非常に重宝。

# Python向け系
## autocomplete-python
Pythonのコードを自動補完してくれます。無いとやってられませんね。
Selenium WebDriverでテスト作業の効率化を図る

#はじめに

既存システムの保守作業の中で、
シナリオテストなど業務に沿った検証を行うために
既存のWebアプリケーションを実行しテストデータを作成する場合がある。

そこで頻繁にテストデータ作成に使われるWebアプリケーションについては
Selenium WebDriverでブラウザ操作を再現するテストコードを用意し、
都度の手作業によるブラウザ操作を削減する。

#実行環境について
今回はSelenium WebDriverをJunit上で起動させるケースについて記載します。
使用するブラウザはInternet Explorerです。

##テストメソッドの実行前後処理について

- setUpBeforeClass

一番最初のテストメソッド実行前(setUp()よりも前)に呼ばれるメソッド

```java
@BeforeClass
public static void setUpBeforeClass() throws Exception {
    System.setProperty("webdriver.ie.driver", "./driver/IEDriverServer.exe");
}
```

- setUp

各テストメソッドの実行前に呼ばれるメソッド

```java
@Before
public void setUp() throws Exception {
}
```

- tearDown

各テストメソッドの実行後に呼ばれるメソッド

```java
@After 
public void tearDown() throws Exception {
}
```

- tearDownAfterClass

一番最後のテストメソッド実行後(tearDown()よりも後)に呼ばれるメソッド

```java
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
```

##ブラウザで操作する要素の指定方法について
要素の指定方法はID、cssセレクタなどありますが、今回はxpathで指定する方法を記載します。

###xpathの調べ方
Google Chromeデベロッパーツールを使ってxpathを調べる場合

１．Google Chromeでxpathを調べたいWebページを表示する。
２．（動作環境がWindowsの場合）F12キーを押下する。
３．下記スクリーンショットのようにデベロッパーツールが表示されるので
　　Webページ上の要素をマウスを使って選択する。
４．右クリックメニューからCopyXpathをクリックするとXpathを取得できる。

![image](https://qiita-image-store.s3.amazonaws.com/0/158972/da8c8e7a-eb41-1776-fd90-ba5c40ceb4e8.png)


#よく使うブラウザ操作
- テキストフィールドの入力

```java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

WebDriver driver = new InternetExplorerDriver();
WebElement element = driver.findElement(By.xpath("操作対象のxpath"));
element.sendKeys("入力したい文字列");
```
- プルダウンの選択

```java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.Select;

WebDriver driver = new InternetExplorerDriver();
Select element = new Select(driver.findElement(By.xpath("操作対象のxpath")));
element.selectByVisibleText("選択したい選択肢の文字列");
```

- クリック

```java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

WebDriver driver = new InternetExplorerDriver();
driver.findElement(By.xpath("操作対象のxpath")).click();
```

- クリア

```java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

WebDriver driver = new InternetExplorerDriver();
driver.findElement(By.xpath("操作対象のxpath")).clear();
```

- ウィンドウの切り替え

```java
import java.util.Set;
import org.openqa.selenium.WebDriver;

// ＸＸＸ入力画面から＠＠＠選択画面へ
WebDriver driver = new InternetExplorerDriver();
String currentWindowHandle = driver.getWindowHandle();
Set<String> windowHandles = driver.getWindowHandles();

windowHandles = driver.getWindowHandles();
windowHandles.remove(currentWindowHandle);
driver.switchTo().window(windowHandles.iterator().next());

//指定した画面側の操作

// ＸＸＸ入力画面の処理へ戻る
driver.switchTo().window(currentWindowHandle);
```

- フレームの選択

```java
import org.openqa.selenium.WebDriver;

// 指定するフレームへ
WebDriver driver = new InternetExplorerDriver();
driver.switchTo().frame("操作したいフレームのname");
```

- 操作したい画面の表示

```java
import org.openqa.selenium.WebDriver;

WebDriver driver = new InternetExplorerDriver();
driver.get("操作したい画面のURL");
```
VMWare ESXi を 5.5 から 6.5 にCDを使わずアップデートする

# <font color="DodgerBlue">はじめに</font>
VMWare ESXi を5.5 から 6.5 にCDを使わず esxcli でアップデートした際の手順メモです。

本手順では、予めオフラインバンドルを取得したうえでアップデートします。
インターネット経由で [デポット一覧](https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml) から直接指定でアップデートする方法もありますが、私の環境ではアップデート処理の途中でパッチファイルを上手く取得できずエラー終了しました。

# <font color="DodgerBlue">アップデート前の作業</font>

## ESXiのSSHログイン有効化
1. F2 #ESXiコンソールから、F2で設定モードに入る
2. [Troubleshooting Options] Enter
3. [Enable ESXi Shell] Enter
4. [Enable SSH] Enter
5. Esc

※vsphere client経由でもできます。

## オフラインバンドルの準備  
[my vmware](https://my.vmware.com/group/vmware/patch#search) より下記オフラインバンドル及びパッチデータをそれぞれダウンロードします。  
・update-from-esxi6.0-6.0_update02.zip  
・VMware-ESXi-6.5.0-4564106-depot.zip

![myvmware.png](https://qiita-image-store.s3.amazonaws.com/0/25413/e7979b14-056d-e5bd-84b9-f6ee0d660ae5.png)

## オフラインバンドルを配置
vSphereClient や scp 等で上記2ファイルをデータストア上にアップロードします。
私は「datastore1/UpdateFiles」フォルダにアップロードしました。

## メンテナンス準備
1. ESXi上の仮想マシンを全て停止する  
※仮想マシンを停止する前に、起動中の全マシンを自動起動に入れておくとメンテナンス終了後がラクです。
1. ESXiをメンテナンスモードにする

# <font color="DodgerBlue">ESXi 6.0にアップデート</font>

まずは、ESXi 6.0 にアップデートします。

1. ESXiにTeraTerm等でSSHログインする
1. アップデートコマンドの実行

```console:update-command
esxcli software profile update -p ESXi-6.0.0-20160302001-standard -d /vmfs/volumes/datastore1/UpdateFiles/update-from-esxi6.0-6.0_update02.zip
```

コマンド実行後に再起動し、ESXiのバージョン、仮想マシンの動作等、問題がないか確認する  
※VMFS3が非サポートになるため、VMFS3のデータストアはVMFS5に変換する


# <font color="DodgerBlue">ESXi 6.5にアップデート</font>

1. ESXiにTeraTerm等でSSHログインする
2. アップデートコマンドの実行

```console:update-command
esxcli software profile update -p ESXi-6.5.0-4564106-standard -d /vmfs/volumes/datastore1/UpdateFiles/VMware-ESXi-6.5.0-4564106-depot.zip
```
コマンド実行後に再起動し、ESXiのバージョン、仮想マシンの動作等、問題がないか確認する 

# <font color="DodgerBlue">(追記) ESXi6.5 から 6.5Update2 にアップデート</font>

1. パッチをダウンロードする    
インターネット経由で [パッチ検索サイト](https://my.vmware.com/ja/group/vmware/patch#search) より「update-from-esxi6.5-6.5_update02.zip」をダウンロード
2. ESXiにTeraTerm等でSSHログインする
3. アップデートコマンドの実行    

```console:update-command
esxcli software profile update -p ESXi-6.5.0-20180502001-standard -d /vmfs/volumes/datastor
e1/updates/update-from-esxi6.5-6.5_update02.zip
```

# <font color="DodgerBlue">アップデート後の作業</font>

## メンテナンスモードの終了
1. ESXiのメンテナンスモードを終了する
1. 元々起動していた仮想マシン群を全て起動する

##  ESXiのSSHログイン無効化（必要に応じて）
1. F2 #ESXiコンソールから、F2で設定モードに入る
2. [Troubleshooting Options] Enter
3. [Enable ESXi Shell] Enter
4. [Disable SSH] Enter
5. Esc
webStormでAngular-cliが使えない

久しぶりに、WebStromでAngular-cliのプロジェクトを作ろうとしたら作れなかったので、簡単な対処法をメモ残しておきます。

今までは、Angular-cliを選択し、すぐにCreateが押せたのですが、押せなくなりました。
<img width="789" alt="１.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/cf73a2e7-4852-9e18-1c11-e3d5a460844f.png">

[...]を押下し、一度上の階層を開き、再度[...]を押して@angularを選択するとCreateができるようになります。
<img width="811" alt="２.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/502b4f5c-d72f-9064-e8a3-0e3f4f310510.png">


これで、webStorm上のディレクトリは作られるのですが、結局angulrのファイル作成に失敗します。

<img width="782" alt="３.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/eb580cea-9a9e-c4bd-23ce-3405e2c83eeb.png">

ここまで来れれば、コマンドで強引にプロジェクトを作ります。



```ruby:ターミナルコマンド
cd ..
rm -rf プロジェクト名
ng new プロジェクト名
cd プロジェクト名
```


ここまで来れれば、angularの開発を始めることができます。
**メンドクセー**

あまりにもめんどくさいので、日本代理店のサムライズムさんに問い合わせたところ、
本家JetBrainでも問題に上がっているそうです。
https://youtrack.jetbrains.com/issue/WEB-23060



早く改善してほしい。




追記、最近さらに、npmが対応せず、
node_modulesフォルダがツリーの中に出て来ないことが多くなってきました。
そういう場合は、
作ったプロジェクトフォルダの中で、npm installをしてください。
Ruby で URL のパラメータにバックスペースをたくさん入れたらどうなるか

# 発端

URL のパラメータに変数を埋め込む場合、もしその変数にバックスペースがたくさん埋め込まれていたら、URL を置き換えることができるんじゃないかと思って試してみた。

# サンプルコード

```ruby
require 'json'
require 'open-uri'

# バックスペースたくさん
val = "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bhttps://api.github.com/users/niwasawa"

# URLのパラメータに変数を埋め込む
url = "https://api.github.com/users/maigolab?#{val}"

# 出力
p url
puts 'out: ' + url
puts 'res: ' + JSON.parse(open(url).read)['url']
```

# 実行結果

```
"https://api.github.com/users/maigolab?\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bhttps://api.github.com/users/niwasawa"
out: https://api.github.com/users/niwasawa?
res: https://api.github.com/users/maigolab
```

# 結論

URL を置き換えてしまうことは無い、ということがわかった。

* Kernel.#p で出力してみるとバックスペースが文字列の内部に残ったままなのがわかる
* コンソールに出力する際にはバックスペースが適用されて前方の文字が消される
* open-uri で HTTP 通信する際にはバックスペースで前方の文字が消されたりはしない
AR内でselfを付けるかどうか

AR内のメソッドで`self`を書くべきか書かないべきか悩んでいたのでここにメモ。

- `Ruby`の`private`メソッドはレシーバー（`hoge.method`の形）で**呼び出せない**
  - つまりAR内で`self.method`の形で書くと`private`メソッドが呼び出せない。
  - 自クラス内なら`public`も`private`も特に意識する必要はなし。なので`self.hoges`や`self.foo`などと`self`を書く必要は**ない**


では、どいういうときにselfを付けるべきか

- クラスメソッドを作るとき（ARにクラスメソッド作りたいと思ったことはほぼない）
- カラムアトリビュートになんか代入するとき
  - `def be_nil; self.hoge_id = nil; end`
  - 上記の場合 `hoge_id = nil` にしてしまうと `be_nil`メソッド内のローカル変数`hoge_id`がnilになってしまう。なのでARのカラムに相当するアトリビュートを更新することができない。ARが自動で生やしたsetterメソッド(`xxxx=`の形のメソッド）を使ってもらうために`self.hoge_id = nil`とすること。

## つまり早い話しがRubyはこういう動きをすることのようだ
ARでどうしようって悩んでいたが結局、Rubyはこういう動きをするようだ。

```rb
def piyo
  self.foos.present? #=> publicなfoosゲッターへアクセス
  foos.present? #=> foosローカル変数ないよ。ないならfoosゲッターへアクセス。（これはARが生やしたゲッター）
  hoge_id = nil #=> hoge_idローカル変数をnil
  self.hoge_id = nil #=> hoge_idセッターでnilに設定（これはARが生やしたセッター）
end
```
ゲッターの場合はいい感じに気を利かせた感じに動くけど、セッターの場合はローカル変数じゃん！これに代入しよってなっちゃうわけみたい。`@hoge_id`と`@`を使ったときはまた頭が混乱しそうなので調べる。

参考：
[Why isn't self always needed in ruby / rails / activerecord? - Stack Overflow](http://stackoverflow.com/questions/5183664/why-isnt-self-always-needed-in-ruby-rails-activerecord)
CSSのみで、ブロック要素の最初の3つのmargin-topを変更させる方法

#:nth-childとは何か？
nth-childはセレクタに追加して条件を指定する擬似クラスのひとつで、子要素のn番目(nth)にスタイルを適用させることができる便利な機能

#やりたいこと
オレンジ色の要素だけに、margin-topの値を変更させたい
<img width="243" alt="li.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/316745db-7086-fbc1-aeeb-eaf9dde10542.png">

#解決方法
```:scss
&:nth-child(-n+3){
 margin-top: 0
}
```
nが0から始まるので 
-0　→　3
-1　→　2 
-2　→　1
-3　→　0
となるので、 3番目より低い要素が選択できる。

#まとめ
nは、0から始まるので、1から始まると考えると、(-n+4)なり、4番目の要素まで影響してしまうので注意が必要。擬似クラスしか使ったことないので、擬似要素の必要性が、まだイメージができないのですが、要素の「意味」と「目的」を理解した（or知っている）上で、擬似要素と擬似クラスを使い分けることができるかが大事だと思う。HTML、CSSも、ふわっと使ってるだけではなく、腰を据えて一つ一つ紐解いて理解してみたいと思います。



#Q＆A

```:セレクタとは？
CSS命令を適用するか選択（セレクト）する部分をセレクタと呼びます。 {} ←　こいつです
```
```:擬似要素とは？
要素の一部に対して影響を与える事ができる

:（コロン）は２つ

:before
::after
::first-letter
```

```:擬似クラスとは？
擬似クラス：指定したもの全体に影響を与えるもので、文書構造の範囲外にある情報や単体セレクタで表現できないものを選択するために導入された概念

:（コロン）は1つ

:active
:hover
:nth-child()
```

```:擬似要素と擬似クラスの違いは？
指定した要素の影響範囲の違いで、擬似要素は、一部。擬似クラスは全て
```

#参考記事
[CSSのセレクタ](http://www.shoshinsha.com/hp/ref/css/css_selecter.html)
[疑似要素](https://developer.mozilla.org/ja/docs/Web/CSS/pseudo-elements)
[疑似クラス (Pseudo-classes)](https://developer.mozilla.org/ja/docs/Web/CSS/Pseudo-classes)
[CSSの擬似要素と擬似クラスの違いを明確に](https://wp.yat-net.com/?p=4505)
[:nth-childの使い方](http://csspro.digitalskill.jp/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/nth-child%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)
Laravel5でJSONリクエストを受け付けるAPIをテストする

# 背景
JSONをPOSTのボディで受けるAPIのテストを書きたかった
# ポイント
テストクラスの $this->json() に配列を渡すとJSONにしてリクエストしてくれる。
使い方はサンプル実装参照。
レスポンスの検証は seeJson() や seeJsonEquals() を使うと良い。
検証メソッドについてはリファレンスを見るのが一番。
https://laravel.com/api/5.2/Illuminate/Foundation/Testing/TestCase.html#method_json
# 準備
テストコードを artisan で作成
```php artisan make:test TagsControllerTest```
# サンプル実装
```php:TagsControllerTest.php

<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class TagsControllerTest extends TestCase
{
    use WithoutMiddleware;

    /**
     * A basic test example.
     *
     * @return void
     */
    public function testSearch()
    {
      $params = [
        'type' => 'item',
        'tag' => 'ボーダー',
        'limit' => 10,
        'offset' => 0
      ];

      $headers = [
        'Content-Type' => 'application/json',
        'Accept' => 'application/json'
      ];

      $this->json('POST', '/api/v1/tags/search', $params, $headers)
      ->seeJson(
        [
          "tag" => "ボーダー"
        ]
      );
    }
}
```
# テスト実施
プロジェクトのルートにて、以下をシェルより実行するだけ
```./vendor/bin/phpunit```

成功していれば以下のような結果となる

```bash
PHPUnit 4.8.35 by Sebastian Bergmann and contributors.

.

Time: 5.4 seconds, Memory: 13.25MB

OK (1 test, 1 assertion)
```
入れ子のコルーチンを作る新しい方法と止め方

# TL;DR

* Unity 5.3 から `yield return StartCoroutine(SubCoroutine())` ではなく `yield return SubCoroutine()` と書けるようになっていた。
* 新しいほうだと `StopCoroutine` で子供のコルーチンの中でも止まる。

# きっかけ

[宴](http://madnesslabo.net/utage/) のソースコードを見ていたら、 `yield return StartCoroutine(SubCoroutine())` ではなく `yield return SubCoroutine()` と書かれていて、 `StartCoroutine` 要らないの?! と思ったのがきっかけ。
http://madnesslabo.net/utage/?p=6633 によると Unity 5.3 から `StartCoroutine` なしで動くようになったようですね。

入れ子のコルーチンは `StopCoroutine` で止められないという話もあったので、ついでに動作確認してみました。

# やってみた

動作確認したのは Unity 5.5.2f1

```csharp:NestCoroutine.cs
using System.Collections;
using UnityEngine;

public class NestCoroutine : MonoBehaviour
{
    private IEnumerator _coroutine;
    private int _count;
    private int Count
    {
        get
        {
            return _count;
        }
        set
        {
            _count = value;
            Debug.Log(_count);
        }
    }

    private void Start()
    {
        Count = 0;
        _coroutine = MainCoroutine();
        StartCoroutine(_coroutine);
    }

    [ContextMenu("StopCoroutine")]
    private void StopCoroutine()
    {
        Debug.LogWarning("Stop");
        StopCoroutine(_coroutine);
    }

    [ContextMenu("RestartCoroutine")]
    private void RestartCoroutine()
    {
        Debug.LogWarning("Restart");
        StartCoroutine(_coroutine);
    }

    private IEnumerator MainCoroutine()
    {
        for (int i = 1; i <= 5; i++)
        {
            yield return new WaitForSeconds(1);
            Count = i;
        }

        yield return StartCoroutine(SubCoroutine());
        yield return SubCoroutine();

        yield return new WaitForSeconds(1);
        Count = 99;
    }

    private IEnumerator SubCoroutine()
    {
        var last = Count + 5;
        for (int i = Count + 1; i <= last; i++)
        {
            yield return new WaitForSeconds(1);
            Count = i;
        }
    }
}
```

StopCoroutine と RestartCoroutine は手動です。

# 結果

![スクリーンショット 2017-03-22 21.25.37.png](https://qiita-image-store.s3.amazonaws.com/0/18702/71552415-c05e-9953-6483-359bd35ccb5a.png)

`yield return StartCoroutine(SubCoroutine())` だと `SubCoroutine` が終わるまで止まらない。
`yield return SubCoroutine()` だと `SubCoroutine` の途中で止まる。

入れ子のコルーチンを `StartCoroutine` で再開するのは無理そう。

# 結論

Unity 5.3 以前に対応するとかでなければ `StartCoroutine` を使う必要はなさそうですね。
[Java] nullを返すメソッドの戻り値はOptional<>にすると幸せかもしれない

# Optional<>前夜

例えば、こんなメソッドを作ったとします。

```java:Factory.Java
public class Factory {
    /**
     * MyObjの新規インスタンスを作成して返す。<br>
     * 作成失敗したときはnullを返す。
     *
     * @return
     */
    public MyObj createMyObj() {
      // ...
    }
}
```

このメソッドを使う側は、こんな感じのコードになるでしょう。

```java:
Factory factory;
// ...
MyObj myObj = factory.createMyObj();

if (myObj != null) {
    // 成功時の処理
}
```

# Optional<>後夜

Optional<>を返すようにしてみました。

```java:Factory.Java
public class Factory {
    /**
     * MyObjの新規インスタンスを作成して返す。<br>
     * 作成失敗したときはnullを返す。
     *
     * @return
     */
    public Optional<MyObj> createMyObj() {
      // ...
    }
}
```

使う側はこんな感じになります。

```java:
Optional<MyObj> myObj = factory.createMyObj();

myObj.ifPresent(o -> {
    // 成功時の処理
});
```