OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】動的に追加したimg要素の表示を待ってから処理する

# やりたいこと
- 処理A：append() などで複数のimg要素を追加・表示する。
- 処理B：Aで追加したimg要素に対して操作を行う。処理Bは、img要素が**すべて表示された後**に行いたい。

調べたところ、img以外の要素や、動的に追加されたものではないimg要素に対する手法しか見つからなかったのでメモ。


#採用した方法
@piouc さんにいただいたコメントより追記です。ありがとうございます。
自分の実装よりスマートなので最終的に使用させていただくこととしました。

###1. jQuery.Deferredを使う
```js
function main(){
    // DOMの操作は同期的に行われるため$.whenを利用する必要はない。
    $('最初からある要素').append('追加したいimg要素')

    // 追加されたそれぞれの要素をDeferred化し全てのロードが完了するのを$.whenで待つ
    $.when.apply($, $('追加したimg要素').map(waitForLoading)).then(function(){
        // ロード完了後に行う処理
    })

}
function waitForLoading(index, img){
    var dfd = $.Deferred()

    // img要素のロード完了はimg.completeで取得できます。
    if(img.complete){
        // すでにロードが完了していれば即時resolve。
        dfd.resolve()
    } else {
        // ロードが完了していなかった場合、イベントリスナー登録しロードの完了を待つ
        $(img).on('load', function(){
            resolve()
        })
    }
    return dfd
}
```

### 2.jQueryを利用しない場合、async, awaitを使う

```js
async function main(){
    //ここで画像の追加
    await Promise.all(Array.from(document.querySelectorAll('追加したimg要素')).map(waitForLoading))
    // ロード完了後に行う処理
}
function waitForLoading(img){
    return new Promise(resolve => {
        if(img.complete){
            resolve()
        } else {
            img.addEventListener('load', () => resolve())
        }
    })
}
```

# 当初やってみたもの
setTimeout()でポーリング＋画像の高さが1以上なら表示完了、という力技です。
jQueryの使用を前提としています。

1. 処理A→処理Bの非同期処理にjQuery.when()を使う。
2. 処理Bの「img要素が表示された後」の処理にsetTimeout()を使って表示されるまで待つ。

```js
function main() {
	$.when(
		// 処理A
		$('最初からある要素').append('追加したいimg要素');
	).then(function() {
		loadingCheck();
	});
}

function loadingCheck() {
	var timer;
	var count = 0;

	// 複数でないならループは不要
	$('追加したimg要素').each(function() {
		// 表示されていれば height > 0
		if ($(this).height()) {
			count++;
		}
	});

	// 追加した要素数と、height > 0 の要素数が一致していればすべて表示されている
	if ($('追加したimg要素').length === count) {
		// 処理B
		// $('追加したimg要素')になんらかの処理

		// setTimeout()の停止
		clearTimeout(timer);
	} else {
		// すべて表示されていなければ100ミリ秒（要素数やサイズで調整）待ってもう一度実行
		timer = window.setTimeout(loadingCheck, 100);
	}
}
```
シンボリックリンクとは？linuxコマンド 「ln」の使い方　

##結論
シンボリックリンクを設定されたファイルはシンボリックリンク先のファイルを参照するようになる。

##内容
リンクさせるとか紐づけるとか言われても
具体的なイメージが湧かなかったので実際にコマンドで試したら理解できた


sオプションをつけることでシンボリックリンクの作成を意味する

```shell
ln -s
```


試しにやってみる。

```shell
$ pwd 
your/route/linux_cmd_work 

$ mkdir dir1 dir2

$ ls
dir1	dir2

$ cd dir1

#リンク先となるファイルの作成
$ echo "this is hoge" >> hoge.text

$ ls
hoge.text

$ cat hoge.text
this is hoge

$ cd ../dir2

$ pwd
your/route/linux_cmd_work/dir2

#シンボリックリンクの作成
#ちなみに、ここでlink.textを作成してる。すでにlink.textがあった場合はエラーになるので注意
$ ln -s your/route/linux_cmd_work/dir1/hoge.text link.text

#なにこの矢印って思ってた
$ ls -l
lrwxr-xr-x  1 user_name  staff  53 12 20 17:37 link.text -> your/route/linux_cmd_work/dir1/hoge.text

#リンク先のhoge.textの内容が表示される
$ cat link.text
this is hoge

#なるほど〜
```


シンボリックリンクが貼られたファイルを参照したら
そのリンク先の内容を表示してくれるというもの。

シンボリックリンクの説明を読むだけじゃ
具体的にイメージできなかったんですけど
こういうことだったんですね〜（いまさら感）



##終わりに
今回はAWSのログタスクを見てる中でシンボリックリンクの話が出てきたのでググりました。

コマンドは思いついたままに記述したので
無駄があるかもしれません。

コマンドに関して、
こういう時はこのコマンドの方が便利だぜ的なのがあれば
教えていただけると嬉しいです。
Siri から DataSpider を呼ぶ

皆さんこんにちは。

Advent Calendar 初日に書かせていただくのは初めてです。自分で作ったカレンダーなので、頑張ります。
まだ全然埋まってない日が多いから何度か書かなければいけない気はするけど、初日は大好きな DataSpider ネタで行くと決めていました。

じゃあ早速行きましょう！

### やりたいこと
DataSpider はいろんなシステムをノンコーディングでつなぐことができ、様々なタイミングで処理を動かすことができます。

この処理を動かすタイミングをトリガーと呼んでいて
　・スケジュールトリガー ・・・ 毎日 xx:yy に実行、xx 分置きに実行
　・ファイルトリガー・・・ファイルを監視して、作成・更新時に実行
　・HTTP トリガー ・・・ DataSpider が Web サーバとなり、URL にアクセスがあったら実行
などの種類があります。

ただ、DataSpider ではトリガー実行だけの画面は用意していないため、再実行のためには Studio と呼ばれる開発ツールにログインしてリトライするか、上記のトリガーを再度呼び出す必要があり、たまにお客様から「リトライ用の画面が欲しい」と言われることもありました。

そんなある日（つい最近）、Twitter を眺めていたら面白い[記事](http://tech-blog.rakus.co.jp/entry/20180925/iphone/shortcut/automation)がリツイートされていました。

これによれば Siri から REST API を呼び出すことができるとのこと。
これを見て ***ピコーン！*** ときました。これで HTTP トリガーを呼び出せば　Siri から DataSpider のトリガーをキックできるのでは！？と

###作り方
上記記事でほとんどの手順は触れられているのですが、改めておさらいを。
また、DataSpier 側ではスクリプトが作成されており、HTTP トリガーで呼び出す設定、レスポンスとして「スクリプトの実行に成功しました」というレスポンスを返す設定がされている前提です。

**1.インストール**
まず、「ショートカット」アプリをインストールします。
標準ではインストールされていないのですが、これは Apple の公式アプリです。!
<img src="https://qiita-image-store.s3.amazonaws.com/0/129487/3a037b1f-9b98-e7db-3be5-2161429541a3.png" width=50%>

**2.ショートカットの作成**
このアプリの目的は「ショートカット」として様々な作業を自動化・短縮化するためのものです。この中に URL を呼び出す機能があるのでこれを使います。

このアプリ自体の操作方法はとても直感的でわかりやすいので手順は触れませんが、作ったものは以下のとおりです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/129487/fb40eefb-750c-7bb7-60d1-d5b4be5118c8.png" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/129487/f809383c-653d-43de-1831-fdd43aae1b17.png" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/129487/127c0a86-5181-f4d2-3b1f-c75d108d1fd1.png" width=50%>

以上の設定により、このショートカットが実行されたときには指定された URL に接続し、URL で取得した内容をテキストで読み上げる、という動作になります。

**3.Siri の設定**
ショートカットはできましたが、これを Siri から呼び出せるようにする必要があります。
右上の設定ボタンを押して、「Siri のフレーズ」の設定を行います。
ここで自分の声を録音すると、その後 Siri からその名称でこのショートカットを呼び出すことができるようになります。
今回は「データスパイダー」と呼びかけたらショートカットが動くように設定します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/129487/e0c79389-affd-28e9-69b7-2a111deb9f17.png" width=50%>

設定は以上です。

###動かしてみる
では、実際に Siri を呼んでみましょう。（音量注意：Youtube が開きます）
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/L8VyLF_Uy5E/0.jpg)](http://www.youtube.com/watch?v=L8VyLF_Uy5E)

動画の通り、Siri によって設定したショートカットが動き、HTTP トリガーも実行されたことが確認いただけたと思います。

この機能があれば手が離せない場所、視覚に障害のある方であってもスマートスピーカーの操作と同じように声で DataSpider を実行することができると思います。

また、このショートカットは Siri からではなくアイコン化もできるので、「このアイコンをタップしたら処理を実行」ということも実現ができます。

DataSpider の用途が無限に広がりますね！！！

では、またノンコーディングの世界でお会いしましょう！
リスト

#ul　＆　ol　＆　liについて
主に箇条書きを作る方法で使用される
classをつけても大丈夫
使用用途によって「 ul 」か「 ol 」を選んで「 li 」をくくる

|コード|内容|
|:--|:--|
|ul|番号つかないリスト（unordered list）|
|ol|番号付きリスト（ordered list）|
|li|ulまたはolでくくられている中身（list item）|

```ruby:このように記載する
<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>
```

#dl　＆　dt　＆　ddについて
言葉とその言葉の説明を組み合わせたリストの際に用いる

|コード|内容|
|:--|:--|
|dl|dtとddをくくるもの（description list）|
|dt|言葉（description term）|
|dd|言葉の説明（description,definition>）|

```ruby:このように記載する
<dl>
  <dt>りんご</dt>
  <dd>赤い</dd>
  <dd>美味しい</dd>
</dl>
```
Bitrise のワークフローを分割して再利用性を高めよう

お久しぶりです。Bitrise おじさんと化した iOS エンジニアです。

CI/CD ツールとして、Bitrise を導入していますが、GUI でワークフローの設定ができてとても便利ですが、時々複数のワークフロー内に同じ仕事の連続があって、例えばビルド前の CocoaPods などの依存解決とかの場合、ワークフローごとにその連続した仕事を追加しないといけなかったり、開発に連れてちょっと途中のステップを変更する必要が出てきてしまった場合全てのワークフローにそれを適用しなければならなかったりするのって、かなり大変ですよね。

そんな時に便利になるのは、ワークフロー内に別のワークフローを使うという方法です。使い方はとても簡単で、ワークフローの設定画面に別のワークフローを追加するだけです：
<img width="1423" alt="スクリーンショット 2018-11-30 17.24.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/63998/30a94f96-4070-e4af-408b-20cd1b455be3.png">

例えば現在自分が入ってるプロジェクトではこのようなワークフローが設定してあります、これは Dev 環境のアプリデプロイをするワークフローです：
![スクリーンショット 2018-11-30 17.29.35（2）.png](https://qiita-image-store.s3.amazonaws.com/0/63998/11ac8541-4eb3-12c5-c857-2edb33931534.png)

ご覧の通り、`develop-deploy` という名前のワークフローですが、中には `_preparation`、`_pull-cache`、`_install-dependencies`、`_push-cache`、自分自身、`_adhoc_deploy` という順番で実行されていきます。`_` で始まるのがそれぞれ別のワークフロー[^1]です。

このようにワークフローを小分けしていくと最大のメリットは、まさに一つのワークフローに修正を入れれば、それを利用する全てのワークフローがそれに合わせて直るというわけです。例えばこちらは PR もらった時のテスト用のワークフローです：
![スクリーンショット 2018-11-30 17.36.56（2）.png](https://qiita-image-store.s3.amazonaws.com/0/63998/bdc5ada8-f2ca-e2de-d1e5-06c7fa0bc585.png)

ご覧の通り、`_preparation`、`_pull-cache`、`_install-dependencies` と `_push-cache` は全て上のデプロイワークフローと同じ流用です。こうすることによって、例えば今度 `DIKitGen` 以外のビルド用依存を入れた場合、`_install-dependencies` 内に一度だけそれを入れておけば、それを使う `develop-deploy` と `fast-test` 両方とも更新されて、二度手間が省けるのでとても便利です。

というわけでみなさんもぜひワークフロー分割で楽しい Bitrise ライフを💪

[^1]: 別に `_` から始まらないと別のワークフローには使えないというわけではなく、「本ワークフロー」「子ワークフロー」を目で見て区別できるために、子ワークフローの名前の最初に `_` を入れてるだけです。
Bitbucketで課題を自動的に解決する

# 公式

[ユーザーがコードをプッシュしたときに課題を自動的に解決する](https://ja.confluence.atlassian.com/bitbucket/resolve-issues-automatically-when-users-push-code-221451126.html)

## 課題の解決

* close
* closes
* closed
* closing
* fix
* fixed
* 修正
* fixing
* resolve
* resolves
* resolved
* resolving

## 課題の再オープン

* reopen
* reopens
* reopening

## 課題を保留として設定

* hold
* holds
* holding

## 課題を修正対象外として設定

* wontfix

## 課題を無効として設定

* invalidate
* invalidates
* invalidated
* invalidating

## 課題のチェンジセットにリンク

* addresses
* re
* references
* ref
* refs
* see

fixed,closeのほかにも色々あった。
上手く使えばPJ運用にも活用できそう。
FreeBSD on Virtual Box

Virtual Box に FreeBSD を入れて遊んでみたのでその時のメモです。
Qiita の記事投稿に慣れる意味も含めて。

# 一般ユーザの作成
```
# adduser
```

# GUI 環境の準備
```
# pkg install xorg
# pkg install gnome3
```
/etc/fstab に以下を追加

```
proc    /proc    procfs    rw    0    0
```

/etc/rc.conf に以下を追加

```
dbus_enable="YES"
hald_enable="YES"
gdm_enable="YES"
gnome_enable="YES"
```
再起動

```
# shutdown -r now
```
これで Gnome3 の環境が使えるようになりました。
今回は Virtual Box に FreeBSD をインストールしたので Guest Additions をインストールします。

```
# pkg install virtualbox-ose-additions-5.2.18_1
```
/etc/rc.conf に以下を追加

```
vboxguest_enable="YES"
vboxservice_enable="YES"
```
再起動

```
# shutdown -r now
```

とりあえず今回はここまで。
これから日本語環境や好みのエディタ等入れていくのでその都度書いていきます。
さくっとherokuにswaggerをデプロイする

## はじめに
APIの仕様書をオンラインに上げるときの手順書です。
docker image作ってherokuに上げようとしたんですが手間がかかりそうだったのでそのままindex.html上げています。

Qiitaのいろいろな記事を参考にさせていただきました。

## 開発環境構築

```docker-compose.yml
version: "2"
services:
  swagger:
    image: swaggerapi/swagger-ui
    volumes:
      - ./swagger.yml:/usr/share/nginx/html/swagger.yml
    environment:
      API_URL: swagger.yml
    ports:
      - "8080:8080"
```

`$ docker-compose up` で起動、
`localhost:8080` にアクセスで確認できます。

APIの仕様は`swagger.yml` に記述してください

## herokuへdeploy

### ファイル

```static.json
{
  "root": "dist/",
  "routes": {
    "/swagger.yml": "../swagger.yml"
  },
  "basic_auth": true
}
```


```dist/index.html
<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Swagger UI</title>
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.17.2/swagger-ui.css" >
    <style>
      html
      {
        box-sizing: border-box;
        overflow: -moz-scrollbars-vertical;
        overflow-y: scroll;
      }

      *,
      *:before,
      *:after
      {
        box-sizing: inherit;
      }

      body
      {
        margin:0;
        background: #fafafa;
      }
    </style>
  </head>

  <body>
    <div id="swagger-ui"></div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.17.2/swagger-ui-bundle.js"> </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.17.2/swagger-ui-standalone-preset.js"> </script>
    <script>
    window.onload = function() {
      // Begin Swagger UI call region
      const ui = SwaggerUIBundle({
        url: "swagger.yml",
        dom_id: '#swagger-ui',
        deepLinking: true,
        presets: [
          SwaggerUIBundle.presets.apis,
          SwaggerUIStandalonePreset
        ],
        plugins: [
          SwaggerUIBundle.plugins.DownloadUrl
        ],
        layout: "StandaloneLayout"
      })
      // End Swagger UI call region

      window.ui = ui
    }
  </script>
  </body>
</html>
```

### セットアップ
```
$ git init
$ heroku git:remote -a app_name
$ heroku stack:set heroku-18
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-static -a app_name
```

### デプロイ
```
$ git push heroku master
```

## 参考
ありがとうございました！

[Dockerを使ってswagger.yamlをサクッとみる (swagger-ui 3.x)](https://qiita.com/NewGyu/items/6a00e0f09a7f8a93cfd5)
[Swagger x Heroku で手軽に API モック＆ドキュメントを作る](https://qiita.com/tanabee/items/e6cedfcc75a4e50e3ad2)
Embree3 でレンダラを書くときの tips

## 最大レイ距離

Embree3 では, 扱える floating point(32bit)の最大が

```
FLT_LARGE = 1.844E18f;
```

に設定されています. これは `std::numeric_limits<float>::max()` よりも小さいので,  `std::numeric_limits<float>::max()` をレイの最大距離に設定していると, まったく交差しないという結果になりますので注意ください.

## アルファテクスチャでの透過対応

`rtcIntersect` したあとにレンダラ側でシェーダとテクスチャを評価してアルファを取得し, アルファがあれば透過マテリアルとしてレイの throughput を減衰してレイの追跡を継続するというのが標準的なやりかたですが, これだといくらか効率が悪いので, intersection filter(交差判定時にカスタムコールバックを仕掛けることができる)で対応することができます.

Embree tutorials の `intersection_filter` を参考ください.

## shadow ray

どこかに当たるか当たらないかだけがわかるのでよければ rtcOccluded を使います. shadow ray の追跡で透過やアルファを含んだ形状を考慮する場合は, 上記 intersection filter で対応するのがよいでしょう.

## node visibility

rtcEnableGeometry/rtcDisableGeometry があります. 変更後は rtcCommtiScene が必要になります.

Embree の API は multi thread safe でないようなので, `rtcIntesect` で追跡するスレッドとは別で `rtcEnableGeometry` や `rtcCommitScene` を呼ぶとクラッシュします.

インタラクティブレンダリングなどで, レンダリングスレッド(rtcIntersect を呼んでいるスレッド)とシーン編集/描画のスレッドをわけている場合, シーンの変更は一度別途キューにいれておき, アトミックに同期をとってから更新系 API を呼ぶことになります.


## ray visibility

ray による visibility(visible from eye ray, visible from specular ray, etc) を対応したい場合は IntersectionFilter を使って実現します.

## Multi-hit

subsurface で multi-hit が欲しい場合, rtcOccluded に filter を入れて, filter で N 個までの交差リストを作る感じで対応できる... はず?



参考文献

* OSPRay
* Cycles(Embree 対応版)
【Docker】Docker Image作り、Tensorflow-OpencvのContainer

【はじめに】
皆さん、こんにちは。今日はここでの一言とか要らないです。では始めさせて頂きます。

##準備
まずは必要なイメージを作るために必要な環境を用意します。
 - Docker Toolbox
 - Docker Cloud

##Docker Toolbox インストール
今回の記事ではDocker Toolboxを利用してやります。
[Install Docker Toolbox on Windows](https://docs.docker.com/toolbox/toolbox_install_windows/) ←ここから簡単にダウンロードができます。
筆者は既にインストール済みなのでこちらの画面が問題なしに表示されば成功です。![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/0200e58a-8ab8-34f1-89b6-85d549005fbe.png)

##イメージダウンロード
タイトルではイメージ作りだと記載しましたが今回は既にある<b>Ubuntu16.04</b>を利用して作りたいと思います。
commandに次のように入力します。

```docker:command
docker pull ubuntu:16.04
```

するとこのようにUbuntuのイメージが生成されます。![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/f91469a2-4e6a-f41c-c09f-e96f4fba2749.png)
何でUbuntuの最新バージョンの18.04ではなく、16.04なのかに疑問があると思うんですけど実際18.04バージョンに環境を設置するとうまくいかなかったので16.04にしました。なんの設置かというと[【Ubuntu】Ubuntu16.04にPython環境インストール（前半）](https://qiita.com/wb_seo/items/4a5156be897b1e67c5ba)こちらの環境構築です。これも同じく16.04にダウンして成功させました。

##イメージのUbuntuにPython3環境を構築
[【Ubuntu】Ubuntu16.04にPython環境インストール（前半）](https://qiita.com/wb_seo/items/4a5156be897b1e67c5ba)
この説明はこちらの記事にあるので参考にして下さい。そちらの方が早いです。終わったらこの画面になりますね。![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/179eb50c-08cf-4e2c-832d-3e83a609815c.png)

##ライブラリインストール
Opencv環境までの構築は終わったら今回の記事もほぼ終わりになります。後はPythonの基本ライブラリとTensorflowやOpencvに必要なライブラリをインストールします。

```python:command
pip install tensorflow
pip install opencv_contrib_python
pip install pyqt5
pip install panda
pip install sklearn
pip install scipy
pip install torch
pip install chainer
...
```
人によって必要なライルぶらりは全部違うと思うので各自自由にインストールして下さい。ここまで出来たら次の作業はこのコンテナをcommitして内容を保存します。

#※番外
ここからはContainerをcommitしてDocker CloudにPushする作業になります。Cloudにあげることによってどの環境でも時間かけずに構築することができます。

##Docker Cloudのアカウント生成、ログイン
[docker cloud](https://cloud.docker.com/)こちらで無料ですぐ作れるんで必要な方は作ってみてください。![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/8bc54a0a-ec88-0944-f545-7b2b2315346c.png)
筆者は既にopencvまで構築完了のバージョンと本番用のイメージをアップロードしています。

そしてDockerにログインします。

```docker:command
docker login
username: ****
password: ****
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/ab1d3169-e486-8ecf-af44-2e5d7d3d3fd5.png)

##COMMIT
構築が終わったコンテナをCOMMITします。

```docker:command
docker commit -m "test" <コンテナID> <イメージID>:TAG
```
これでコンテナの内容がCOMMITされて最初pullしたubuntu16.04イメージとは別の自作のイメージが作られます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/f91469a2-4e6a-f41c-c09f-e96f4fba2749.png)
最初pullしたイメージ：ubuntu16.04
commitで作られたイメージ：sample/sample:TAG
筆者の場合だと<b>wbseo/tensorflow-opencv:16.04</b>になります。

##PUSH
最後に作ったイメージをクラウドにPUSHするための作業です。
まずTAG commandで新しい名前にします。

```docker:command
docker tag local-image:tagname new-repo:tagname
```
そしてクラウドにPUSHします。

```docker:command
docker push new-repo:tagname
```

【まとめ】
Virtual BoxにUbuntuをインストールしてその上に構築するよりこれが時間もかからないしすごく楽になります。ほとんどそうだと思うんですけど同じチームで作業しているのに微妙にライブラリのバージョンが合わなくてうまくいかなかった経験とかないでしょうか。僕はそれにものすごくイライラしちゃったのでこうやって作りました。
MySQLメモその2

[前回のお話](https://qiita.com/umeharas/items/b1750fc8704e4cffbf48)
せっかくデータを作成したので、読み取り側も作成したいと思います。
今回はexpressで作成します。

## expressの導入

とりあえず新規に作業用フォルダを作ります。
express-mysqlとしました。
npm initからexpressをインストールします。

```
$ npm init
~中略~
$ npm install express --save-dev
```
次に作業フォルダにindex.jsを作成し、動作確認します。

```index.js
const express = require("express");
const app = express();

app.get("/", function(req, res) {
  res.send("Hello World!");
});

app.listen(3000, () => {
 console.log('Go to http://localhost:3000/ to view page');
});
```

node index.jsで実行し、localhost:3000にアクセスしてHello World!と表示されていれば成功です。

## node.jsでMySQLを操作する

次に、JSでMySQLを操作できるよう、MySQL用のパッケージを用意します。
https://www.npmjs.com/package/mysql

```
$ npm install mysql --save-dev
```

これがあれば、JSファイルからMySQLサーバーにアクセスし、クエリの実行等々行うことができます。
便利です。

先ほどのindex.jsの3行目以下に、次のように記述を追加します。

```index.js
const mysql = require("mysql");
const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
  database: "test"
});
```

host、user名等は適宜付け替えてください。
これで、connectionという変数で以降MySQLにアクセスできるようになります。

最後に、データを確認するため、簡易的に表示部分を追加します。
Hello World!を返していたapp.get関数部分を、以下の様に書き換えます。

```index.js
app.get("/", function(req, res) {
  connection.query("select * from todos LIMIT 0, 10", error, results, fields) {
    if (error) throw error;
    res.send(results);
  });

    connection.end();
});
```

これで、localhost:3000にMySQLのデータが表示されていれば成功です。


### MySQL8.0以降における注意

MySQL8.0からパスワードの認証方法が変更され、上に挙げたnpm標準パッケージでは未対応となっています（2018.11現在）。
そのため8.0以降のサーバーに上記の方法でそのままアクセスしようとすると、ER_NOT_SUPPORTED_AUTH_MODE:というエラーコードにより弾かれてしまいます。

解決策としては、[こちら](https://www.npmjs.com/package/@mysql/xdevapi)の方のパッケージを使用するか、
以下のやり方でMySQL側のユーザーパスワードをcaching_sha2_passwordからmysql_native_passwordに変更することが必要だそうです。

**既存ユーザーの変更**

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass';
```
もしくは、
**新規ユーザーの作成**

```
CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';
```

下のやり方は若干力技な気がしますが、一応これで動作すると思われます。
（大人しく対応済みのパッケージを使用したほうが良いかも・・・）

※参考にしたのはこちら
https://stackoverflow.com/questions/50373427/node-js-cant-authenticate-to-mysql-8-0
Nextcloud の管理者が他ユーザでログインする方法

#はじめに
Nextcloudはユーザ毎の領域にファイルが保管されるので、管理者ユーザーがログインしても、管理者ユーザーの領域のファイルしかアクセス・閲覧できません。しかし、管理者であれば、他のユーザーがどのようなファイルを保管しているか、どのファイルを共有しているかを管理する必要はあります。今回は、管理者ユーザーが他ユーザ―としてログインする方法を紹介します。

#プラグイン
「Impersonate」というプラグインです。公式アプリなので、有効にします。
![画像134.png](https://qiita-image-store.s3.amazonaws.com/0/308127/abd54965-d905-8d9e-9de8-1e69678fe1c0.png)

#使い方
管理者ユーザーでログインし、ユーザー管理画面を開きます。ログインしたいユーザーの詳細から、「偽装」を選択します。
![画像135.png](https://qiita-image-store.s3.amazonaws.com/0/308127/54321adf-2fed-7961-ea4f-a0ba02a4be0b.png)

偽装してもよろしいですかとポップアップが出てきますので、「はい」を。
![画像136.png](https://qiita-image-store.s3.amazonaws.com/0/308127/f80bc613-b515-14f0-1d44-0d2beec74a92.png)

はい、他ユーザーでログインできました。どんなファイルが保管されているか確認できます。
![画像137.png](https://qiita-image-store.s3.amazonaws.com/0/308127/68e1c267-432f-8777-f574-9286c27eb98e.png)

ログアウトする際は、普通にメニューからログアウトを選択します。
![画像138.png](https://qiita-image-store.s3.amazonaws.com/0/308127/5cfdff21-ce5c-8a85-fb0c-30442f86fd7f.png)

ログアウトすると、ユーザー管理画面に戻ります。
![画像139.png](https://qiita-image-store.s3.amazonaws.com/0/308127/94c827a3-09f2-d2dd-b3ed-f068aa182482.png)

#まとめ
実は、最近提供された機能です。今までは、実機にSSHでログインしてデータディレクトリやデータベースを確認するしか方法がなかったのですが、これだと使いやすいですね。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
Nextcloud の世代管理機能

#はじめに
複数人でファイル共有をしていると、誰かが同じファイル名で上書きしてしまうなんて事もあります。複数人で直接編集が出来たり、排他制御がかかったりすればとも思いますが、Nextcloudだと、基本的な動作はアップロード・ダウロードとなりますので、最後にアップロードされたファイルが最新版として残るだけです。このような事象を回避するために、世代管理（バージョニング）機能があります。

#プラグイン
標準でついているプラグインです。
![画像128.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b91a70cc-8d09-17f9-5c77-f0e697fa12ef.png)

#使い方
管理者での設定は特にありません。ユーザのファイル操作画面で、対象のファイルの共有アイコンを選択すると、右側に詳細画面が表示されます。バージョンタブを選択すると、そのファイルの過去のバージョンが表示されます。
![画像129.png](https://qiita-image-store.s3.amazonaws.com/0/308127/e2fa9431-dac1-3a58-0c24-f4eb5ed33490.png)

試しに上書きしてみましょう。同じファイル名でアップロードすると、新しいファイルか既存ファイルかを選択する画面が表示されます。上書きの場合は、新しいファイルのみ選択します。
![画像130.png](https://qiita-image-store.s3.amazonaws.com/0/308127/cd910840-346e-c451-991d-ec7bcdbe868f.png)

アップロード完了後、そのファイルの詳細画面からバージョンを確認すると、新しいバージョンになっている事と古いバージョンが蓄積された事が確認できます。
![画像131.png](https://qiita-image-store.s3.amazonaws.com/0/308127/41f494a7-be6c-ef22-dc75-d0f4c30ec56a.png)

古いバージョンに戻したい場合は、そのバージョンの右側に表示されている復元アイコンをクリックします。
![画像132.png](https://qiita-image-store.s3.amazonaws.com/0/308127/6f8fd492-0d2e-c2b1-7b5f-d4224e24a3d0.png)

復元すると、古いバージョンのファイルが最新版として表示されます。
![画像133.png](https://qiita-image-store.s3.amazonaws.com/0/308127/d5340b05-80f3-9575-0619-26bb4b9d9349.png)

#まとめ
基本的には有効にしておいた方がよいプラグインです。古い世代のファイルが蓄積されるので、ユーザ毎の容量（クォータ）が気になるかと思いますが、ユーザのクォータが圧迫されてきたら、古いバージョンから削除するような仕様になっているので、その辺は気にしなくてもよいかと思います。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
【私的メモ】MSDNダウンロードURL 

MSDNのダウンロードURLを毎回ググってしまう自分のための備忘録です。

#MSDNとは
>*Microsoft Developer Network (ディベロッパーネットワーク、MSDN) とは、マイクロソフトの開発者ネットワークであり同社が開発者向けに提供するサービスの総称。*
>*https://ja.wikipedia.org/wiki/Microsoft_Developer_Network*
>*Wikipediaより引用*


#MSDNのダウンロードURL
ダウンロードURLは下記です。
https://my.visualstudio.com/Downloads/Featured

![Windowsサーバー0.PNG](https://qiita-image-store.s3.amazonaws.com/0/297303/437e6ea7-b3aa-1f98-9021-ce251e2d64b5.png)


#ISOでダウンロードしたい場合は？
言語指定して、DVDを選択するとiso形式でダウンロードできます。

![Windowsサーバー.PNG](https://qiita-image-store.s3.amazonaws.com/0/297303/dc27bc92-95ac-e7eb-1579-2613ce6a824f.png)
AWS EMRでLambdaからPySparkジョブを呼ぶ方法

boto3でPySparkを呼び出すのにてこずった

- `command-runner.jar` だけ渡してやればいいみたいだ

```python
    import boto3
    emr = boto3.client('emr', region_name='ap-northeast-1')

    spark_args = ['spark-submit', 'pyspark_app.py']

    response = emr.add_job_flow_steps(
        # クラスタ作成後にもらえるJobFlowId
        JobFlowId='j-XXXXXXXXXXXXXX',
        Steps=[
            {
                'Name': 'sample batch job',
                'ActionOnFailure': 'CANCEL_AND_WAIT',
                'HadoopJarStep': {
                    'Properties': [],
                    'Jar': 'command-runner.jar',
                    'Args': spark_args
                }
            },
        ]
    )
```
PDF をコマンドラインから圧縮する

## 概要

Zip ファイルのような圧縮ではなく、品質を GhostScript で調整して PDF のファイルサイズを削減する話です。

インターネット経由でPDFを共有するなら容量はなるべく小さい方がいい。膨らみがちなPDFのファイルサイズを小さくする方法はないかと `PDF 圧縮` なんて検索すると Web サービスがいくつかヒットしますが、PDF の内容次第ではそのようなサービスを利用したくないこともあるでしょう。

そこで、なるべくローカル完結させたい・コマンドラインで処理したいという要望に応えるべく「GhostScript でPDFのファイルサイズを減らす方法」を紹介します。


## Install GhostScript

GhostScript が必要なのでインストールしてください。

普段 TeX・LaTeX なんかを使っている人はすでに GhostScript がインストールされているかもしれません。 `gs --version` を実行してみてバージョン情報が返ってくるようであればすでに `gs` コマンドが利用可能なのでこの項目は飛ばしてください。

### macOS

Homebrew でインストールできます。

```sh
brew install ghostscript
gs --version
# 9.26
```

### その他OS

以下を参考にしてください。

- [How to Install Ghostscript](https://ghostscript.com/doc/9.26/Install.htm)

Ubuntu 18.04 とかであれば `sudo apt install ghostscript` でインストール可能だと思いますが私は検証していません。あと環境次第ではコマンド名が `gs` ではなく `ghostscript` である場合もありそうです。


## 圧縮方法

### 実行するコマンド

```sh
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
```

`input.pdf` を入力にして `output.pdf` が得られます。

`PDFSETTINGS` は以下のものから選択できます。

- `/default`
- `/screen`
- `/ebook`
- `/printer`
- `/prepress`

### Shell function

次のような Shell 関数を定義しておくと便利です。

```sh
function pdfmin()
{
    local cnt=0
    for i in $@; do
        gs -sDEVICE=pdfwrite \
           -dCompatibilityLevel=1.4 \
           -dPDFSETTINGS=/ebook \
           -dNOPAUSE -dQUIET -dBATCH \
           -sOutputFile=${i%%.*}.min.pdf ${i} &
        (( (cnt += 1) % 4 == 0 )) && wait
    done
    wait && return 0
}
```

4 プロセスまでを同時実行できます。同時実行数の上限はお使いの環境に合わせて修正してください。 `.bashrc` などに書いておけば、次のようにして実行できます。

```sh
pdfmin *.pdf
```

`*.min.pdf` が生成され上書きはしません。


## どの品質を選ぶべきか

以下のPDFに対してそれぞれの品質でコマンドを実行してみました。

- [search-engine-optimization-starter-guide-ja.pdf](https://static.googleusercontent.com/media/www.google.co.jp/en/jp/intl/ja/webmasters/docs/search-engine-optimization-starter-guide-ja.pdf)

```sh
for i in screen ebook printer prepress default; do
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/${i} -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output_${i}.pdf input.pdf
done
```

```sh
$ du -h *
3.9M	input.pdf
3.1M	output_default.pdf
2.1M	output_ebook.pdf
4.1M	output_prepress.pdf
4.1M	output_printer.pdf
2.1M	output_screen.pdf
```

この処理では **画像の品質の影響が大きい** ので画像を多く含むPDFほどオプションごとに違いがでます。次に `screen` と `ebook` を指定した場合のそれぞれの実行結果を載せてみました。


### screen の場合

<img width="922" alt="screen.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/285675/1a4e3169-6aa0-ec43-af1e-ff345eecd3b6.jpeg">

左が元のPDFで右が処理後のPDFです。画像の劣化が激しく、文字の判別ができなくなってしまいました。 `screen` は削減効果絶大ですがあまり実用的ではありません。

### ebook の場合

<img width="888" alt="ebook.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/285675/78d88709-8c0f-a758-581a-23df72cca4cd.jpeg">

左が元のPDFで右が処理後のPDFです。よく見ると画像の劣化が分かりますが `screen` の時ほどひどいものではありません。 `ebook` をオプションに指定するのがオススメです。

もし `ebook` も許容できない場合は `default` を指定してください。

## 参考サイト

- [Compress PDF files with ghostscript](https://gist.github.com/firstdoit/6390547)
システム運用業務改善への二歩目

## はじめに
* 前回、システム運用改善のタスク（案）を列挙したところまで対応しました。
    * [システム運用業務改善への第一歩はこちら](https://qiita.com/yuta_k0911/items/310bb7105731ef996f1d)
* 今回は、その続きとして何をやったか？を書きます。
    * 弊社が利用しているアーキテクチャの情報が載っていますが、適宜ご自分の環境に読み替えてください

## 次のアクション
* 改善点を以下の3つにカテゴライズし、具体的なタスクを整理した。
	1. 可視化
	2. モニタリング
	3. 標準化/リファクタリング
* 改善は連動して行くので、1から順番に対応して行くことが好ましい。

## ポイント
* 「場渡りな運用」ではなく、「再現性を持った運用」を実現するための改善を行う。
	* 特にルールとフローの可視化・明文化を軸に置く（運用の拠り所を作る、という文化を根付かせ、定型化する）
* 標準化を行なったのちに効率化・自動化を実践していく
	* まずはプロセスをあるべき姿に持っていき、そこから生産性向上をアプローチする
* 可視化は、インフラエンジニア2年以上のスキル・経験を持った人が理解できるレベルで作成する
	* ログイン方法、コマンドの詳細な説明などは割愛し、ポリシー・検討内容、手順に特化していくイメージ

## 改善点（例）
### 可視化
* 情報の可視化
	* 設計ポリシーの明文化
		* （例）ホスト名、playbook、IPアドレス発番
	* 業務フローの可視化
		* （例）依頼対応、障害対応、稟議、購買
	* 手順の可視化
		* （例）手作業の業務、playbookのレビュー運用
	* 一覧もの整理
		* （例）サーバ管理表、IPアドレス管理台帳、NW構成図
	* Readmeの拡充
		* （例）前提条件の拡充（所要時間など）、書方の定義（更新ルールなど）
* 業務の可視化
	* 手順のログ共有と蓄積
		* （例）ターミナルログ取得の徹底と格納
	* ノウハウの一元化と整理
		* （例）Github にリンク集を整理
	* DC対応Tips
		* （例）入館、ラッキング、キッティング、トラブル対応
* 情報セキュリティの可視化　※詳細は後述

### モニタリング
* モニタリング環境の整備
	* KPI
		* （例）QCD目標、SLA
	* 作業状況
		* （例）JIRAダッシュボード
	* インシデント
		* （例）JIRAダッシュボード
* システム状況分析
	* ノウハウの整理
		* （例）Datadog、Cloudera Manager、OMSA、vSphere Client
* 業務状況分析
	* JIRAチケットの分析
	* インシデント情報の分析
	* 障害再発防止策の分析
* 情報セキュリティモニタリング　※詳細は後述

### 標準化/リファクタリング
* 設計の標準化
	* ベストプラクティスの整理
* 業務ツール刷新
	* インフラ
		* （例）Jenkins　×　ansible
	* 管理ツール
		* （例）confluence
* 新アーキテクチャへの追随
	* OS
	* MW
	* ツール
* playbookの共通化
    * `モジュール`と`実行`のplaybookを明示的に分割する
* playbookの再現性向上
* 障害対応スピード向上
	* 検知〜分析
	* 分析〜対応
	* 再発防止〜記録
		* （例）JIRAに障害情報のプロジェクトを作成して、情報を記録
コンソールに入門しよう💻

おはようございます！　Advent Calendar言い出しっぺの響音カゲです。

今回はCLIについて、どんな便利なことができるのか？　そんなに怖がらなくてもいいよ！　みたいなことを書きます。

黒い画面、プログラマーでも苦手意識ある人もいると思います。特にゲーム系目指してる学生で、Windowsしか触ってきませんでした！　って人とかは、

* エディタはVisual Studio
* ビルドはUnityがやってくれる
* Git操作はSourceTreeしか使ったことない

って人が少なからずいて、中にはコンソール見るだけで手を上げて退散って人もいるかと思います。

**黒い画面が怖い理由は「何をやったらいいか分からない」に尽きると思います。**

しかし、想像に反して`help`コマンドとエラーメッセージを読むかググればどうにかなることがほとんどです。ちょっとずつCLIに慣れていきましょう。

# CLIってそもそも何？

CLI(Command Line Interface)はその名の通り、コマンドでデータの入出力を行うインターフェースのことを指します。それに対して、非プログラマーが使うほとんど全ての画面はGUI(Graphical User Interface)です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152713/cf211a65-21e1-b1b1-99f1-726479ee2879.png)

では、なぜプログラマーはわざわざGUIがあるにも関わらず、CLIを使うのでしょうか？

## CLIを使う理由1: コマンドを組み合わせられる

GUIのソフトを組み合わせるのはとても難しいです。例えば、メモ帳とPowerPointを組み合わせることは基本的にできません。

それに対して、CLIのソフトはコマンドの入出力を簡単につなぎ合わせて、組み合わせることができます。
例えば、ファイルの中身を表示する`cat`コマンドと、後ろ10行を切り出すコマンド`tail -n 10`を組み合わせる場合は`|`(パイプ)を使います。

```bash
> cat Makefile | tail -n 10
composer:
ifndef COMOPSER
        cd src; ./install_composer.sh
endif

.PHONY: gvm
gvm:
ifndef GVM
        cd src; ./install_gvm.sh
endif

```

この結果をさらに`grep c`で、cを含む部分だけを抽出することもできます。

```bash
> cat Makefile | tail -n 10 | grep c
composer:
        cd src; ./install_composer.sh
        cd src; ./install_gvm.sh
```

このように、コマンドを知っていれば知っているほどたくさんの組み合わせが使えるようになります。

GUIはそのソフトのできる範囲内のことしかできませんが、CLIの場合は「組み合わせ爆発」により、色々な用途に合わせて組み合わせることができます。これは「検索」や「自動化」にとても役立ちます。

## CLIを使う理由2: 自動化できる
例えば、ファイルを開いて中に日付を追記し保存するということをしましょう。

GUIの場合、

1. メモ帳を開く
2. ファイルを開く
3. 日付を追記する
4. ファイルを保存する

とします。

それに対して、CLIでは

```bash

date >> file.txt
```
と書けます。

GUIの場合、マクロなどで自動化できるかもしれませんが時間を指定して動かすことは難しいでしょう。

それに対して、CLIの場合は時間を指定して動かすためのDaemonという仕組みととても相性が良いです。というのも、Daemonはコマンドを時間などのきっかけで実行する、ということをするだけだからです。

コマンド化するまでが大変ですが、逆に一度コマンド化してしまえば二度と同じ作業をせずに済みます。ほとんどの場合、1ヶ月もあれば元が取れます。

## CLIを使う理由3: プログラマー向けのソフトはそもそもCLIが多い
世界で最も有名なバージョン管理ソフト`git`や、C言語のコンパイラ`gcc`や`clang`は全てCLIのソフトです。

Webフロントエンドでは、パッケージ管理ソフト`npm`や`yarn`🐈もCLIのソフトですし、`create-react-app`や`vue`(vue-cli)や`ng`(Angular v4)もCLIです。`jest`や`gcloud`もCLIのソフトですね。

これらにはGUIのインターフェースがある場合もありますが、元々CLIで使うことを想定されているので不具合があったり遅かったりします。

例えば、GitにはSourceTreeやGitKraken🦑といったGUIのクライアントがありますが、これらは結局内部でGitのコマンドを叩いているだけなので少し遅く、不安定なときもあります。

もちろん、GUIの方がログが見やすいなどの利点もあります。しかし、CLIのソフトはCLIのまま使ったほうが本来の力を発揮できることが多いですので、両方使えるようになっておくことに越したことはありません。

また、トラブルが発生したときはCLI操作を余儀なくされる場合も多いです。

# まとめ

CLIの利点は

* コマンドを組み合わせられる
* 自動化できる
* プログラマー向けのソフトと相性が良い

という点が挙げられます。ぜひちょっとずつでも慣れていきましょう🙋

次回: 初心者のためのターミナル環境構築(Win・Mac・Linux対応)
次々回: 使う順！　初心者向けコマンド一覧
Elasticsearchの削除したインデックスの実データ削除について

## 1.はじめに
　Elasticsearchのインデックスでは、シャードの内部にLuceneのインデックス構成をとっており、ドキュメントの削除が行われてもすぐにファイルを削除することはせずに、一定のタイミングでマージ処理によって変更・削除をファイルに反映している。
　そのためマージ処理が実行されるまでは一時的にデータが肥大化してしまうので、マージ処理について調整できるものがないかを調査した。

## 2.Luceneのインデックスについて
　Luceneのインデックスでは、複数のドキュメントをまとめてLuceneセグメントに格納しており、セグメントは一度作成されたら中身のドキュメントを編集したり削除したりすることのないImmutableなファイルとなる。
　ドキュメントに削除があった場合、セグメントに削除マークを付与し、一定のタイミングでマージ処理を実行してセグメントの変更・削除を反映させている。

## 3.Mergeについて
　マージ処理では、小さなセグメントをより大きなセグメントにマージしたり、削除マークのついたドキュメントを削除したりしている。
　マージ処理は、他のマージ処理や検索などの処理とハードウェアリソースを調整してMerge schedureingで自動実行される。

## 4.Merge schedureingについて
　マージ操作を必要に応じて自動実行する。
　マージ処理は別々のスレッドで実行され、スレッド数の上限に達した状態で、それ以上マージ処理を実行しようとする場合は、マージスレッドが使用可能になるまで待機する。

　マージに使用するスレッド数については、設定を動的に変更することが可能である。

### マージスレッド数の設定
- **設定名**：index.merge.scheduler.max_thread_count
- **内容**：単一のシャード上で動作するマージ処理に使用するスレッド数の最大値
- **デフォルト**：
　SSDに最適化された設定(CPUの数に応じて1～4が設定される)
　Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2))
- **注意点**：
　デフォルトではSSDに最適化された設定になっているが、
　SSDを使用せずHDDなどのように回転するディスクを使用する場合は1を設定する必要がある。
　(並列IOが出来きないドライブはマルチスレッドで処理できないためだと思われる)
- **変更方法**：
　動的変更が可能である。そのため、update-index-settings APIを使用して動的に変更することが出来る。

```json:リクエスト例(リファレンスに例がなかったので書き起こしました)
PUT /{index}/_settings
{
    "index" : {
        "index.merge.scheduler.max_thread_count" : 2
    }
}
```

## 5.調査結果
　マージ処理はMearge sceduringによって必要に応じて自動実行されており、その条件を設定したり頻度を明示的に変更することは出来なさそうだった。

　マージ処理に使用するスレッド数を変更することは可能ですが、デフォルトでSSDに最適化されているので、一時的にデータ量が多くなってしまいますが、Elasticsearchが自動的に消してくれるのを待つのがよいのかと思われます。

　スレッド数はどの程度まで変更してもよいのかが難しいですが、効果的に変更できればマージスレッド使用可能待ちを減らすことができ、マージ処理の実行頻度が向上する可能性はあるかもしれないです。



## 6.参考
### 1.Elasticsearch 6.2のリファレンス - Merge
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index-modules-merge.html
### 2.あなたの知らないElasticsearch設定トップ5 - 5番に記載があります
http://acro-engineer.hatenablog.com/entry/2017/12/05/120000
### 3.Elasticsearch実践ガイド P.225

## 7.補足_Elasticsearchのインデックスの構成
Elasticsearchではインデックスファイルを構成する際に、
下記のようにしてLuceneのインデックスの構成をとっている。(粒度の大きい順)

- Elasticsearchインデックス：
　複数のシャードで構成されている。

- シャード：
　Luceneインデックスに該当するもの。

- Luceneインデックス：
　複数のLuceneセグメントから構成されている。

- Luceneセグメント：
　ドキュメントが格納されている。一度作成されたら中身のドキュメントを編集したり削除したりすくことのない変更されないファイルとなる(immutable)。ドキュメントが削除される場合はセグメントに削除マークがつけられる。
【Rails】セレクトタグの選択肢は確認できるが、選択できないようにする。

#select_tag
[ドキュメント](http://railsdoc.com/references/select_tag)
選択ボックスを生成
#options_for_select
[ドキュメント](http://railsdoc.com/references/options_for_select)
配列・ハッシュから選択肢を生成する
#今回作成したいHTML
```html
<select name="select" id="select">
  <option selected="selected" disabled="disabled" value="blank">選択 ▼</option>
  <option disabled="disabled" value="value1">key1</option>
  <option disabled="disabled" value="value2">key2</option>
</select>
```
<img width="146" alt="スクリーンショット 2018-11-30 16.40.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/262029/28f2bd40-f527-bd53-fccb-2b105ced595b.png">⇦選択ボックスがあって
<img width="180" alt="スクリーンショット 2018-11-30 16.40.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/262029/e4d60bfe-634b-89d1-5185-4b3702dc10fe.png">⇦選択肢は見れるけど選択はできない
別に全部選択できないようにする必要がないって場合でも
ちょっと手を加えれば一部だけ選択ができないとかでもできる。
#slimで書く
erbでもいいんだけど最近slimで書く機会が多くてね...

```slim
- choices = [['選択 ▼','blank'],['key1','value1'],['key2','value2']]
= select_tag :select,
  options_for_select(choices, selected: 'blank', disabled: choices.map(&:last))
```
ドキュメントには`:selected`が指定できるのは書いてあるけど
`:disabled`が指定できるのは書いてない。
`disabled="disabled"`にしたい項目のvalueを配列で指定すると
その項目は選択することができなくなる。

#ちなみに

```slim
- choices = [['選択 ▼','blank'],['key1','value1'],['key2','value2']]
= select_tag :select,
  options_for_select(choices, selected: 'blank'),
  disabled: true
```
とすると
<img width="126" alt="スクリーンショット 2018-11-30 16.49.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/262029/787121a7-8481-ee32-4a07-c3afd9a7ad24.png">
セレクトボックスそのものが無効になり、選択肢を確認することすら不可能になる。
(厳密には開発者ツール使えば見れるけど)

終わり。
DockerでSwagger UIを起動してAPI仕様書をブラウザに表示する手順

# 1.はじめに
DockerでSwagger UI使用する際、DockerのコンテナにVolumeなどの設定を適切に行わないと、任意のAPI仕様書を参照させることが出来なかったため、Swagger UIにてAPI仕様書を参照できるまでの手順を記載する。

# 2.前提条件
Dockerが使用できる状態であること。

# 3.Swagger UIのコンテナを取得する
## 3-1.DockerHubからコンテナを取り込む
下記のコマンドを実行して、swagger-UIのコンテナをDockerに取り込む。

```sh
$ docker pull swaggerapi/swagger-ui
```

## 3-2.Swagger UIのコンテナを起動する
下記のコマンドを実行してswagger-uiのコンテナを起動する。

```sh
$ docker run -d -p 80:8080 swaggerapi/swagger-ui
```

※ -dオプションはバックグランド実行のオプション。実行時にコンテナのIDを表示してくれる。

## 3-3.サンプルページにアクセスする
下記のURLにブラウザでアクセスして起動確認をする。

```
http://{仮想マシンのIPアドレス}/
```

# 4.任意のAPI仕様書を参照する
## 4-1.マウントするディレクトリについて
SwaggerUIでは、HTTPで取得したドキュメントを参照してAPI仕様書をレンダリングする。
HTTPリクエストで参照が可能な場所にAPI仕様書が設定されている必要がある。SwaggerUIのコンテナではNginxがHTTPサーバとしてコンテナ内で動作するため、Nginxのドキュメントルートに任意のAPI仕様書をマウントすることで、Swagger UIからAPI仕様書が参照できるようになる。

## 4-2.Nginxのドキュメントルートについて
Nginxでは下記のディレクトリにドキュメントルートが設定されている。

```
/usr/shere/nginx/html
```

## 4-3.ドキュメントルート上に任意のディレクトリをマウントしてコンテナを起動する
DockerのコンテナではVolumeを設定することで、ホストマシンの任意のディレクトリをコンテナ上のディレクトリにマウントすることが出来る。
これを活用し、Nginxのドキュメントルート上にディレクトリをマウントすることで、任意のディレクトリを参照出来るようにする。
VolumeはDocker run コマンドのオプションで指定が可能。

``` フォーマット
$ docker run -d -p 80:8080 -v {マウントしたいホストマシンのディレクトリ}:/usr/share/nginx/html/{マウント先の任意のディレクトリ(api}とか)} -e API_URL={マウント先の任意のディレクトリ}/{API仕様書のファイル} swaggerapi/swagger-ui
```

※ -eオプションで設定しているAPI-URLの環境変数は、Swagger UIの画面を開いたときに初期値として参照するURLです。

※ 同じポートで多重起動は出来ないため、起動中のコンテナがある場合は起動コマンドを実行する前にstopコマンドなどで停止する

```
docker stop {コンテナID}
```

## 4-4.Swagger UIで任意のAPI仕様書を表示する
下記のURLにブラウザでアクセスして設定した任意のAPI仕様書が参照できることを確認する。

```
http://{仮想マシンのIPアドレス}/
```

# 5.参考情報

## 5-1.Dockerのよく使うコマンド
- Docker コマンドリファレンス
http://docs.docker.jp/engine/reference/commandline/

## 5-2.Swagger UIの
- SwaggerUIのインストール手順(公式ドキュメント)
https://swagger.io/docs/open-source-tools/swagger-ui/usage/installation/

## 5-3.Nginxのディレクトリについて
- nginxの所有者・グループ・パーミッション
https://gakumon.tech/nginx/nginx_permission_main.html

## 5-4.OpenAPI(Swagger)について
- SwaggerでRESTful APIの管理を楽にする
https://qiita.com/disc99/items/37228f5d687ad2969aa2
- 開発効率を上げる！Swaggerの記法まとめ
https://tech.starttoday-tech.com/entry/swagger_yaml
さくらサーバ(ビジネスプロ)で、担当者ごとにFTPSアクセス可能なファイルをドメイン単位で制限する

みなさんこんにちは。本記事では、以下のようなリスクへの対策を行う手順を書いてみたいと思います。
 
### 想定するリスク

FTPSクライアントアプリを使用してドメインAに関する作業をしているAさんが、うっかりドメインBのファイルを削除してしまい、ドメインBのサイトのデータが消えてしまった
 
### 対策

Aさんが、もしうっかり操作ミスしてしまったとしても、ドメインBのデータを削除できないように、AさんのアカウントからはドメインAに関するファイルが格納されたサブディレクトリ配下にしかアクセスできないように設定する
 
### 前提

・企業でさくらのレンタルサーバを契約しており、複数の担当者で作業を行っている
・さくらのレンタルサーバーのプランは「ビジネスプロ」
・複数のドメインのサイトを運営している
 
### 手順

#### 1．ドメインを設定する

 
1−1. 他社で取得したドメインの場合は、予めネームサーバー設定を、以下にする必要があります。
 
ns1.dns.ne.jp
ns2.dns.ne.jp
 
※操作方法については、ドメインを取得したサービスのマニュアルをご確認ください。
 
詳細、及び最新の情報については、以下のページをご確認下さい。
 （参考）[【ドメイン設定】他社で取得・管理中のドメインを利用 – さくらのサポート情報]( https://help.sakura.ad.jp/hc/ja/articles/206053782--ドメイン設定-他社で取得-管理中のドメインを利用 )
 
1-2. さくらのレンタルサーバのドメイン設定を行う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44791/6bbc2255-d084-72be-cfd9-c2f73d1c94bc.png)

マルチドメインの指定フォルダに、ドメインAで使用するディレクトリを指定します。wwwディレクトリ直下ではなく、下位のサブディレクトリを指定する必要がある点に注意してください。
 
#### 2．ユーザを作成する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44791/70576132-642b-6e68-92a2-6f50053d832d.png)
 
コントロールパネルの「ユーザ管理」の中にある「新しいユーザの追加」から作成できます。
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44791/e3aa0fb1-cb38-db49-50f0-f0159ceba0cc.png)

利用設定の「FTPを利用する」にチェックを入れて、アクセスできるドメインを設定します。
 
#### 3．ファイル転送アプリより接続する

以下は FileZilla の設定画面例です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44791/54b7b070-3e64-d350-aae8-537dfe50fa00.png)

※ユーザ名が、「ユーザ名＠アクセスを許可したドメイン」になることにご注意ください。
 
このように設定を行うことにより、FTPSで接続するアカウントを、ユーザーごとにドメイン単位で制限することができます。そして、これにより、Aさんが、間違ってドメインBのサイトのデータを削除してしまう、というような事態を防止することができます。



以上です。今回の記事が、みなさまのお役に立てましたら幸いです。
JIRAウォッチノウハウ：ポップアップでスマートウォッチング

#はじめに
JIRAのチケット更新をウォッチする方法で、画面上にポップアップを出してウォッチする方法をご紹介します。
イメージはこちら。
![１．ポップアップイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/215534/f1c289fb-9309-793f-212c-8a42bfbc40f1.png)


#自己紹介
システムエンジニア
某大手SIerに勤務
組織にJIRA・Confluenceを導入しています

#このTipsを考えた背景
JIRAのチケットが更新されたかどうかは、JIRAの基本機能では主に下記の方法があります

- 連携しているConfluenceの右上の通知窓
- 更新日を使ったフィルタや並び替え
- ダッシュボードのアクティビティストリームガジェット
- メールによる通知

これらは、特定のページやメーラーを見に行く能動的な動作が必要でした。
また、JIRAの変更なのにConfluenceで見る、というのもちょっと不思議な感じがしますね。

ましてや、メールから脱却しようとしているのに、結局メール通知なの？というのも問題です。

もっと簡単に、変更をウォッチする方法があれば便利なのになぁ、という声は周りからも上がっていました。

# 実現方法
実現するにはたった２ステップの設定だけです！

1. ダッシュボードの「アクティビティストリームガジェット」を設定する
1. RSS Feed Reader を使って、画面にポップアップ表示できるようにする

以下、それぞれの設定方法をご紹介します。

### Step1：ダッシュボードの「アクティビティストリームガジェット」を設定する
ダッシュボードのガジェット追加で「アクティビティストリーム」を選択する
![２－１．ガジェット選択画面.png](https://qiita-image-store.s3.amazonaws.com/0/215534/c15d7218-356c-2f08-84e9-b5a7a17138bd.png)

ウォッチする設定は下記のようなものがある
![２－２．アクティビティストーリーム設定画面.png](https://qiita-image-store.s3.amazonaws.com/0/215534/604bc1be-1e72-d75c-bc9c-d6bc8c91f9a8.png)


### Step2：RSS Feed Reader を使って、画面にポップアップ表示できるようにする
アクティビティストリームには、RSSフィードへ渡すURLを作成する機能があります
![３－１．RSSフィードボタン.png](https://qiita-image-store.s3.amazonaws.com/0/215534/fd54c5e2-8e05-4f1b-c68e-92456c1665d4.png)

事前に、ブラウザにRSS Reader をインストールしておきましょう
さまざまなプラグインがありますが、ここではChromeプラグインの「RSS Feed Reader」で説明します。
![３－２．RSSプラグイン.png](https://qiita-image-store.s3.amazonaws.com/0/215534/b52e4b98-8adf-cbb2-64b8-87edc2b5ab4e.png)

インストールすると、ブラウザヘッダ部にこんなマークが表示されるようになります
![３－３．RSSプラグインインストール.png](https://qiita-image-store.s3.amazonaws.com/0/215534/2c61b7c5-da52-2d44-6253-c5b52af25fe3.png)

設定にはサインアップを求める画面が表示されますが、無視して使うこともできます
![３－４．RSSリーダー初起動.png](https://qiita-image-store.s3.amazonaws.com/0/215534/59efd2a0-7b47-17dd-d965-1ade09a475b8.png)

インストールできた状態で、アクティビティストリームのRSSフィードのボタンを押してみましょう。すると、こんなポップアップが表示されるようになります。
Subscribeを押してください。これで購読可能になりました！
![３－５．RSSフィード購読.png](https://qiita-image-store.s3.amazonaws.com/0/215534/c0a12d79-fe7f-4eb1-87ce-a2f544b17247.png)


あとは、ポップアップ通知の設定です。feederのセットアップ画面を開き、下記のような設定を行います
![３－６．RSSリーダーポップアップ設定.png](https://qiita-image-store.s3.amazonaws.com/0/215534/e23f7c4a-fe2c-dd28-80e4-d4a373768477.png)

これで、ポップアップ表示が可能になりました！ぜひ、JIRAスマートウォッチング生活をお楽しみください。
![１．ポップアップイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/215534/f1c289fb-9309-793f-212c-8a42bfbc40f1.png)


#注意事項
###設定の限界
アクティビティストリームで設定できる条件には限界があります
ウォッチしているチケット、メンションされたチケット、などは、今の機能では条件にできないようです
これはぜひ機能改善を願いたいところです。

###設定変更の同期
アクティビティストリームの条件を変更した場合は、RSSフィードの再設定が必要です
RSSフィードのURLが変更されるためです
よくよく見ると、URLのパラメータに条件式が含まれているのが分かると思います。

#さいごに
このTipsを使い始めてから、JIRAの情報キャッチが驚くほど早くなりました。
読んでいただいた方のお役に立てば幸いです。
【C#】ProjectEuler 14,15,16問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
#11問目
正の整数に以下の式で繰り返し生成する数列を定義する.
n → n/2 (n が偶数)
n → 3n + 1 (n が奇数)

この数列はどのような数字からはじめても最終的には 1 になると考えられているが, まだそのことは証明されていない(コラッツ問題)
さて, 100万未満の数字の中でどの数字からはじめれば最長の数列を生成するか.
注意: 数列の途中で100万以上になってもよい

```CSharp
private void button14_Click(object sender, EventArgs e)
        {
            int Count = 0;
            int MaxCount = 0;
            long CurrentValue = 0;
            int MaxCountNumber = 0;
            for (int i = 1; i < 1000001; i++)
            {
                CurrentValue = i;
                Count = 1;
                while (CurrentValue != 1)
                {
                    if (CurrentValue % 2 == 0)
                    {
                        CurrentValue /= 2;
                        Count++;
                    }
                    else
                    {
                        CurrentValue = (3 * CurrentValue) + 1;
                        Count++;
                    }
                }
                if (MaxCount < Count)
                {
                    MaxCountNumber = i;
                    MaxCount = Count;
                }
            }
            label1.Text = "Answer = " + MaxCountNumber;
        }
```
1000000以下の数字に対して、1でない間は数列の定義の通りに計算し、1になるまで計算できた回数をカウントして答えとしました。
#15問目
20X20の格子経路の最短経路数を求めよ

```CSharp
 private void button15_Click(object sender, EventArgs e)
        {

            long Denom = 1;
            long Numer = 1;

            for (int i = 40; i > 20; i--)
            {
                Denom *= (i - 20);
                Numer *= i;
                for (int j = 2; j < 6; j++)
                {
                    if (Numer % j == 0 && Denom % j == 0)
                    {
                        Numer /= j;
                        Denom /= j;
                    }
                }
            }
            label1.Text = "Answer = " + Numer / Denom;
        }
```

40 C 20を2から6で約分しながら計算しました。
#16問目
2の1000乗の値の、各位の数字の和を求めよ

```CSharp
        private void button16_Click(object sender, EventArgs e)
        {

            BigInteger Number = 1;
            for (int i = 1; i < 1001; i++)
            {
                Number *= 2;
            }
            string NumberString = Number.ToString();
            int SumEachNumber = 0;
            for (int i = 0; i < NumberString.Length; i++)
            {
                char EachNumber = NumberString[i];
                SumEachNumber += (EachNumber - '0');
            }
            label1.Text = "Answer = " + SumEachNumber;
        }
```

2を1000乗して、文字列にした後、一文字ずつint型に変換して合計しています。2の1000乗はかなり大きな値になるので、扱えるのか疑問でしたが、BigInteger型を用いることで扱うことができました。
railsでサーバーを立ち上げた後にコンソールのみ消してしまった!!

#はじめに
ずぶの素人なので何か指摘があればよろしくお願いいたします。
勉強環境として使っているものに使用しているので実際に運用している環境(サービスとか)で行った際の責任は持てませんのであしからず。

#環境
Cloud9(Amazonのサービスのひとつ)

#状況

➀以下のコマンドを打ってサーバーを立ち上げる

```:console01

$ rails server
```

➁コマンドを打ったターミナルを消してしまった
→[Control+C]できない…orz


#対処

➀新たにターミナルを出します。
[Alt+T]

➁以下のコマンドを打ちます

```:console02
$ rails server
```

➂以下のようなコメントが出ます

```:console02
=> Booting Puma
=> Rails 5.1.6 application starting in development 
=> Run `rails server -h` for more startup options
A server is already running. Check /home/ec2-user/environment/toy_app/tmp/pids/server.pid.
Exiting
```

➃コメントの中に記載している

`/home/ec2-user/environment/toy_app/tmp/pids/server.pid.`
を開きます
→PIDが記載されています。

➄取得したPIDを使ってKillコマンドを実行
例)
取得したPIDが`114514`の場合

```:console02
kill 114514
```

➅The END!

プロセスを消したので再度起動しましょう。

#結論
コンソールをむやみに消さないようにしましょう！

---
#参考
・PIDについて
→[プロセスID (PID)とは](https://wa3.i-3-i.info/word11040.html)

・Cloud9について
→[AWS Cloud9 とは](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/welcome.html)
Spacemacs で counsel-gtags を使う

Spacemacs の補完インタフェースとして Ivy を利用しているが、gtags の layer は Helm 用しかないので、counsel-gtags を使えるようにする。

layer を新規に作るほど精通していないので、use-package で追加して、Spacemacs 風のキーバインドを定義する。

```elisp
(use-package counsel-gtags
  :ensure t
  :commands counsel-gtags-mode
  :hook
  ((clojure-mode . counsel-gtags-mode))
  :config
  (spacemacs/set-leader-keys-for-minor-mode 'counsel-gtags-mode
    "gt" 'counsel-gtags-find-definition
    "gr" 'counsel-gtags-find-reference
    "gs" 'counsel-gtags-find-symbol
    "g," 'counsel-gtags-go-backward))
```

今のところうまく動作しているように見える。
C++ Builder XE4 > Indy > UDP通信 > Send() > 「モジュールXXXのアドレスXXXでアドレスXXXに対する読取り違反が起きました」 > 「#Socketエラー #10065ホストへのルートが存在しません」 

```txt:動作環境
C++ Builder XE4
Indy 10.6.0.4975
```

### エラー概要

UDP通信をするソフトにおいて、下記のエラーが発生していた。

> モジュールXXXのアドレスXXXでアドレスXXXに対する読取り違反が起きました

調べていくと、下記の条件で発生することが分かった。

- 特定のWindows 7 PCにおいて発生
    - 発生しないWindows 7 PCもある
- PC起動してから、一度もEthernetケーブルを挿していない
    - **一度Ethernetケーブルを挿すと、以後、ケーブルを抜いてもエラーは出なくなる**

### エラー詳細

IndyのIdUDPClientのSend()において発生する。

try, catchでエラーを見て以下の情報を得た。

- エラーメッセージ
    - #Socketエラー #10065ホストへのルートが存在しません
- エラーのクラス名
    - EIdSocketError

### 対処

Send()をする部分をtry, catchで対処する

```cpp
while(!Terminated) {
	try {
		Form1->IdUDPClient->Send(acmd, m_enqSJIS);
	} catch (Exception &exc) {
		// 以下の条件で発生するエラーの対処
		// A. 起動してから一度もEthernetケーブルを挿していない
		// B. 特定のPC(Window 7のうち特定のPC)において発生する
		if (exc.ClassName() == L"EIdSocketError") {
			continue;
		}
	}

	// 正常な場合の処理 (省略)
}
```
(レポート)N-Agile(仮) #3 ゴールを共有するインセプションデッキ～われわれはなぜここにいるのか～

# はじめに
社内アジャイルコミュニティ「N-Agile(仮)」の第3回目企画として、[N-Agile(仮) #3 ゴールを共有するインセプションデッキ～われわれはなぜここにいるのか～](https://nri-agile-community3.peatix.com/view)を実施しました。
今回はそのレポートです。

![IMG_1744.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/c60cea34-270f-803b-1750-2d3e4ce7988a.jpeg)

# N-Agile(仮)とは
NRI社内でのアジャイルを実践する／したい人たちが集まり、とにかく色んなことを「やってみよう」という趣旨のコミュニティです。今回のインセプションデッキで、コミュニティの形の片鱗が見えてきました。

# インセプションデッキとは
10個（テンプレによっては11個）の質問に回答していき、プロジェクト/プロダクトのゴール・ビジョンを共有・決定したり、チームの動き方の指針を決めるための活動です。
アジャイルなプロジェクトでよく利用され、プロジェクトの最初にチームの中で行われたり、顧客と一緒に作ることで合意形成に利用したりします。

以下のページが参考になります。
・[5分でわかった気になるインセプションデッキ](https://www.slideshare.net/TakaoOyobe/5-45195080)
・[Scrumプロジェクト開始のベストプラクティス #RSGT2018](https://slide.meguro.ryuzee.com/slides/90)

# イベントレポート
インセプションデッキを体験いただくワークショップでしたが、すべての質問に回答していく時間はとれなかったため、以下の2つの質問におのおの回答する形式をとりました。
・われわれはなぜここにいるのか
・エレベーターピッチ

質問に回答する際の対象は、「このコミュニティの存在」または「自身の今従事しているプロジェクト」のいずれかです。今回は7名の参加者のうち、5名は前者を、2名は後者を選んで作成・共有しました。
皆思い思いの「われわれはなぜここにいるのか」を共有いただきましたが、ほかの人の意見を聞くことで、自分にはない観点や情報が出てきたり、「取り入れたい！」と思う情報が出てきます。共有するだけでも価値がある活動だということを再認識できました。

共有の様子
![IMG_1924.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/7d37b98e-c722-3963-eb16-c9a2e02979e8.jpeg)
![IMG_1925.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/622e6943-4c73-bf82-d48a-d7d835596902.jpeg)

「われわれはなぜここにいるのか」を共有したあとに、皆の出した情報を踏まえて、「エレベーターピッチ」にチャレンジ。これも、自分ひとりでは出てこない観点で、かつ大事だなと思うものが出て来るという体験ができました。

「われわれはなぜここにいるのか」が黄色、「エレベーターピッチ」がオレンジ。
![IMG_1927.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/6073262c-034e-f7a7-eb51-59006e92882d.jpeg)

最後にふりかえりを実施して、フィードバックを全員にもらって終了です。
今後につながるよいフィードバックをいただけました。
![IMG_1926.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/5a929357-46f8-abb6-de83-6e1109340ccc.jpeg)

# 今後の予定
年内開催分は予定が確定しています。
直近二回は以下のイベントです。
[12/07(金) N-Agile（仮） #4 コミュニケーションを高める心理的安全性ゲーム～チームに大事な「心理的安全性」を考える～](https://n-agile-community4.peatix.com/view)
[12/14(金) N-Agile（仮） #5 価値観ババ抜き大会 in 東京](https://peatix.com/event/576174/view)
興味のある方は、ぜひご参加ください！
また、社外の方も、生暖かく応援のほどよろしくお願いいたします。

![IMG_1929.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/e0d3d4af-1b3d-aa92-e5fe-c2af567c310d.jpeg)
Googleの20%ルールに学ぶ、iRidgeの「Flyhigh Friday」とは

# はじめに
[iRidge Advent Calendar 2018](https://qiita.com/advent-calendar/2018/iridge) の4日目の記事です。

この記事では、iRidgeの「**Flyhigh Friday**」という取り組みの紹介をします。

# Flyhigh Fridayってなに？

普段の業務とは離れて自分の興味のある技術やスキルアップを図りたい技術を習得するための時間として考えられた取り組みです。

個人目標を達成しやすくしたり、チームを超えた社員の交流を促進したりする目的があります。

進め方はよくあるもくもく会のスタイルです。
開始時間になったら全員集合して取り組むことを宣言し、最後に取り組んだ成果を発表します。

<img width="1057" alt="スクリーンショット 0030-11-22 18.24.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/160547/97b3f316-6304-638e-887a-3872498510da.png">

この取り組みは毎週金曜日の決まった時間帯に毎週行われるので、 **金曜日に高みに登る** という意味で **Flyhigh Friday** と名付けられました。

<img width="266" alt="スクリーンショット 0030-11-22 18.18.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/160547/4bcdf4f0-5737-8af8-fc5d-662ddd935222.png">

<img width="338" alt="スクリーンショット 0030-11-22 18.19.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/160547/74b7e312-352a-8893-7ec6-f6596533b686.png">

社内では省略して **FF** とよく呼ばれます。

<img width="203" alt="スクリーンショット 0030-11-22 18.19.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/160547/155d28ef-1e54-7218-e36c-ba43e3e65894.png">

そして、FFの参加者は **光の戦士** と呼ばれます。

<img width="250" alt="スクリーンショット 0030-11-22 18.23.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/160547/d50bdead-12b3-0374-de06-67c532a86b65.png">

毎週開催されるFFの様子です。

![Image from iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/160547/e2a22457-d72a-a002-23bc-0fac70cf60ec.jpeg)

# Googleの20%ルール

> 「従業員の勤務時間中の一定時間を、通常の職務を離れて従業員自身が取り組みたいプロジェクトに費やすことができる」というものだ。

> 「Gmail」「AdWords」「Docs」といった多くのサービスを生み出してきた

FYI: https://innova-jp.com/google-20-rule/

Flyhigh Fridayと似たような取り組みでGoogleの20%ルールという制度があります。

Google以外にも株式会社ゆめみでは 「[10%ルール](https://www.yumemi.co.jp/ja/company/welfare)」、 株式会社LIFULLでは「[クリエーターの日](https://lifull.com/company/bctw_japan/)」という名称で似たような取り組みが行われているみたいです。


# 1日FF

基本的には毎週金曜日に行われるのですが、1日FFと言って1日社外で取り組むこともあります。

![Image from iOS (5).jpg](https://qiita-image-store.s3.amazonaws.com/0/160547/4d6059cd-1bde-6041-ab6b-0f6094aaebbe.jpeg)

渋谷のワーキングスペースで取り組む社員の様子です。

![Image from iOS (6).jpg](https://qiita-image-store.s3.amazonaws.com/0/160547/6059a20f-6daf-17c3-8e9f-8ccabf9404df.jpeg)


FFの成果などは今回の[iRidge Advent Calendar 2018](https://qiita.com/advent-calendar/2018/iridge)でも紹介されます！お楽しみに！