OmniAICreator/Qiita-1.07M huggingface dataset:
kerasで学習曲線(learning curve)を描画

# 学習曲線(learning curve)
こんなやつ（思いっきり過学習）（というかもはや学習してない）　↓
<img width="865" alt="スクリーンショット 2018-12-20 17.10.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/187750/e6fca5d3-c390-e427-231f-cdbdd33b0365.png">


# kerasで描画
まずは、下をインポート

```python
from livelossplot import PlotLossesKeras
```
あとは、model.fitの中に，

```python
callbacks=[PlotLossesKeras()]
```

を追加するだけ

## 例

```python
model.fit([x_train, x_train_X], y_train, epochs=30, batch_size=32, validation_data = [[x_val, x_val_X], y_val], callbacks=[PlotLossesKeras()])
```
Vueの単一ファイルコンポーネントにCSSのネイティブ変数を使う

# 目標物

![](https://i.imgur.com/BMV0JCb.png)

![](https://i.imgur.com/zTwqeKq.png)

独自コンポーネント`<hoge>`の`font_color`というタグに色を指定するとhogeという文字の色が変わるものを作って行きます。

# CSSのネイティブ変数とは

cssにはsassと同じように変数というものが存在します。

```css:style.css
.hoge{
    --color:red;
}
.hoge h1{
    color: var(--color);
}
```

この場合、h1は赤くなります。

![](https://i.imgur.com/oyjaZm7.png)

Chromeなどのブラウザで確認すると、確かに`.hoge h1{ }`のところのカラーが赤くなっています。



![](https://i.imgur.com/C0oKlzH.png)



基本的に注意するのは上の画像の通りです。

# Vueの単一ファイルコンポーネント

この記事を見ている人の多くは、もしかしたらVueについて私より、知見を深めた人かもしれません。それかVueについて最近学び始めた方かもしれません。Vueの魅力でもある単一ファイルコンポーネントについてはVueを使う人ならほとんど誰でも扱うものです。

コンポーネントとは日本語で部品という言葉です。Webサイトのページ内で共通するボタンのデザインや、記事のサムネイルも全てコンポーネントです。

単一ファイルコンポーネントのテンプレートは基本的に次のようになります。

```vue
<template>

</template>

<script>
export default {


}
</script>

<style>

</style>

```

`<template>`タグで囲まれたところにHTMLを書きます。`<template lang="pug">`と書くことでpugも扱うことができます。

`<script>`の中に汎用的なJavaScriptや`export default { }`の中にVue.jsを記述します。その気になればjQueryも記述することができます

`<style>`はスタイルを指定します。`<style scoped>`と書くとその単一ファイルコンポーネント内でしか効かないスタイルを指定でき、**スタイル汚染**を防ぎます。また`<template>`タグと同じように`<style lang="scss">`でscss記述ができますが、webpackで設定しないといけません。



# 本題

![](https://i.imgur.com/UB6eOvW.png)

フォルダの構成はこのようにします。

Index.jsにはimportでVueとhoge.vueを呼び出しておきます

```js
import Vue from 'vue';
import hoge from './components/hoge.vue';

new Vue({
  el: "#contents",
  components: {
    'hoge': hoge
  },
});
```

そしてindex.htmlでhoge.vueとscript.jsを呼び出します

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>hoge</title>
  </head>
  <body>
    <div id="contents">
      <main>
        <hoge font_color="red"></hoge>
        <hoge font_color="yellow"></hoge>
        <hoge font_color="#73e6c7"></hoge>
      </main>
    </div>
  </body>
  <script type="text/javascript" src="script.js"></script>
</html>

```

そして今回は以下のような単一ファイルコンポーネントファイル`hoge.vue`を作成します。

```vue:hoge.vue
<template lang="html">
  <div class="hoge" :style="{'--color': this.font_color}">
    <h1>hoge</h1>
  </div>
</template>

<script>
export default {
  props:{
    font_color: {}
  }
}
</script>

<style lang="scss">
.hoge{
  margin:30px;
  --color:red;
  h1{
    color: var(--color);
  }
}
</style>
```

`<div class="hoge" :style="{'--color': this.font_color}">`の部分、`:style={}`はvueのv-bindの機能を使っています。

`:style="{'プロパティ名':'値'}"`とすることでタグ内にCSSを指定する`style=プロパティ名:値`と同じ効果になります。v-bindで指定したメソッド名(ここでは`font_color)はpropsで登録しておいてあげましょう。

![](https://i.imgur.com/hy4lulL.png)

前述した通り、:styleの記述をタグ内にすることでHTMLのインライン記述と同じ効果になります。なので`:style="{'--color': this.font_color}"`と書き、`index.html`で

```html:index.html
<hoge font_color="red"></hoge>
<hoge font_color="yellow"></hoge>
<hoge font_color="#73e6c7"></hoge>
```

と記述することでコンパイルされたHTMLコードは以下のようになります

```html:index.html
<div class="hoge" style="--color:red">・・・</div>
<div class="hoge" style="--color:yellow">・・・</div>
<div class="hoge" style="--color:#73e6c7">・・・</div>
```

HTMLのインラインにstyleが記述されます。

今回は文字の色を変化させるだけでしたが、使いようによっては様々なインタラクションに適応させることができます。
githubのJavaEE TutialをEclipse上で動かす手順

# 対象
- はじめてJavaEEに触れる人
- JavaEEのチュートリアルを動かしてみたい人 

# 前提条件
- eclipse,gitがインストール済みであること
    - ※下記手順はEclipse4.8(photon)、git2.20windowsで実施

- JavaEEの機能、チュートリアルのコードについての説明は省略します。(勉強中なので…)

# 実施手順
### 1.githubからJavaEEチュートリアルをclone
コマンド
`git clone https://github.com/javaee/tutorial-examples`

### 2.glassfishダウンロード
https://javaee.github.io/glassfish/download
Web Profile版でOK

### 3.Eclipseにインポート
cloneしたプロジェクトをEclipseにインポートする。

[メニュー]-[インポート]-[Maven]-[既存Mavenプロジェクト]を選択
※チュートリアルはたくさんあるので、ここではWebに絞ってインポートする。

![import02.png](https://qiita-image-store.s3.amazonaws.com/0/313642/eedb9fd5-ca2a-fd67-b8d5-83ee251a894d.png)


### 4.GlassFish Toolsインストール
Eclipse上からGlassFish上にデプロイできるようプラグインを追加する。
※こちら参考にさせていただきました。
https://ittoybox.com/archives/677

[メニュー]-[ヘルプ]-[新規ソフトウェアのインストール]を選択
「追加」ボタンを押下してglassfish-toolsのurlを入力する。

![glassfish01.png](https://qiita-image-store.s3.amazonaws.com/0/313642/88277e5a-e5fd-ebd4-42a1-3e381c94246c.png)

![glassfish02.png](https://qiita-image-store.s3.amazonaws.com/0/313642/6c3295de-7700-63da-98f9-843a1a767c06.png)

追加後はEclipseを再起動する。

### 5.サーバ追加
Eclipseでサーバの設定を追加する。

[メニュー]-[ウィンドウ]-[ビューの表示]-[その他]-[サーバー]を選択
※GlassFishToolsのインストールに成功すると「GlassFish」が表示されます。

![server01.png](https://qiita-image-store.s3.amazonaws.com/0/313642/d00a2e18-db2f-2a04-e827-8d2f35851bc6.png)

インストールしたGlassFishのホームディレクトリとJavaのホームディレクトリを指定
![server02.png](https://qiita-image-store.s3.amazonaws.com/0/313642/0b88ea02-e3f8-31f6-4f96-96c7912e93d2.png)

任意のリソースを追加する。(追加できない時はサーバ作成後に再度実施)
![server04.png](https://qiita-image-store.s3.amazonaws.com/0/313642/90cdd3c2-6ca3-fb02-9bbf-a53d5df37488.png)

### サーバ起動
Eclipse上からGlassFishサーバを起動しアクセスする。
デフォルトは"http://localhost:8080/web/hello1"

![access01.png](https://qiita-image-store.s3.amazonaws.com/0/313642/c219d502-7446-3b26-746b-7826a1966f39.png)

テキスト入力後submitボタン押下
![access02.png](https://qiita-image-store.s3.amazonaws.com/0/313642/227b54fd-df1e-97e3-aaa4-f61bfbaacf48.png)


以上。
メモ：「３０日でできる！OS自作入門 」21日目

## OSも守ろう

1) 文字列表示APIを今度こそ
- 前回の hello2 は　CS のベースがあってなかったため,ちゃんと動作しかなった
- 0xfe8という特定の場所を取る方法でかいけつ

2) アプリケーションをC言語で作ってみたい
- アプリケーション用のAPIを作る

```llvm

[FORMAT "WCOFF"]				; オブジェクトファイルを作るモード	
[INSTRSET "i486p"]				; 486の命令まで使いたいという記述
[BITS 32]						; 32ビットモード用の機械語を作らせる
[FILE "a_nask.nas"]				; ソースファイル名情報

		GLOBAL	_api_putchar

[SECTION .text]

_api_putchar:	; void api_putchar(int c);
		MOV		EDX,1
		MOV		AL,[ESP+4]		; c
		INT		0x40
		RET

```

- C 言語でもプログラム

```c

void api_putchar(int c);

void HariMain(void)
{
	api_putchar('A');
	return;
}
```

- Cでコンパイルしたものはそのままはまだ使えないので、最初の６バイトをE8 16 00 00 00 CB に書き換える　

3) OS を守ろう１
- あるメモリを書き換えるだけて dir コマンドを破壊

4) OS を守ろう２
- セグメントと割り込みを守る
- アプリ専用のメモリを割り当てて、そこで実行させる
- （ここのアセンブリはまたじっくり読むことにする）

5) OS を守ろう３
- アセンブリで攻撃する方法はあった

6) OS を守ろう４
- 終了APIを追加
- アプリケーションに特定のINT命令を許可 (0x60のところ）

```
	set_gatedesc(idt + 0x40, (int) asm_hrb_api,      2 * 8, AR_INTGATE32 + 0x60);
```
- ちゃんと例外が投げられました

![スクリーンショット 2018-12-25 0.57.52.png](https://qiita-image-store.s3.amazonaws.com/0/109145/548fc47b-19d9-cecd-025f-743c30c27235.png)

今日はここまで。寝よう
windowsでanacondaの仮想環境を使う

## 基本

- 新しい仮想環境を作る。

```
conda create --name hogehoge
```

- 作成した仮想環境を確認する。

```
conda info --envs
```

- 作成した仮想環境に入る。

```
activate hogehoge
```

- 仮想環境から出る。

```
deactivate
```

仮想環境で作業するファイル群は，WindowsにインストールされたAnacondaフォルダの，envs以下にそれぞれ格納される。

`C:\Users\hnishi\Anaconda3\envs`

*注意

`C:\ProgramData` が，Anacondaのデフォルトのインストール先になっていることもあるようです（隠しフォルダ）（Anacondaインストール時にコンピュータの全ユーザが利用できるオプションを付けた時？）。


## 例

今回は[PyMOL](https://pymol.org/2/)を，Windows7のAnaconda仮想環境にcondaを使ってinsutallしてみます。

*注意
シュレディンガー社が，condaで提供しているPyMOLは，評価版です。

## 手順

- Anacondaのインストール
- Anaconda Prompt を開く  

以下のように表示されます。

```
(base) C:\Users\hnishi>
```

- 新しい仮想環境を作る。

```
conda create --name forpymol
```

- 作成した仮想環境を確認する。

```
conda info --envs
```

- 作成した仮想環境に入る。

```
activate forpymol
```

- 仮想環境の中でPyMOLをインストールする。

```
conda install -c schrodinger pymol
```

作成されるバイナリ（実行ファイル）は，WindowsにインストールされたAnacondaフォルダ以下に置かれます。

↓↓↓ 例

`C:\Users\hnishi\Anaconda3\envs\forpymol\PyMOLWin.exe`

- 仮想環境から出る。

```
deactivate
```
合成数列の和 Advent Calendar 2018 Julia編

この記事は「合成数列の和 Advent Calendar 2018」25日目になります。

## お題

https://qiita.com/advent-calendar/2018/composite-number

## 解答

[シクシク素数列 Advent Calendar 2018 Julia編](https://qiita.com/cia_rana/items/f639a4556e9ce90db9af) と同じ理由で今回も Julia 0.4 を使用しています。

```julia
filter(x->!isprime(x),(4:541).')[1:parse(readline())]|>sum|>print
```

[オンライン実行環境で見る](https://tio.run/##yyrNyUz8/z8tM6cktUijQtdOMbO4oCgzN1WjQlNHw8TK1MRQU09dM9rQqiCxqDhVoyg1MSUnMy9VQ1MztsauuDS3xg6oPK/k/39DAwMA)

解説は特にいらないくらいシンプルになりました。本当はリスト内包表記を使うともっとシンプルになるのですが、v0.4の時点ではその中で`if`文が使えず、仕方なく`filter`で代用して上記の形に落ち着きました。（なぜv0.5以降では標準ライブラリから `Primes.jl`を削除してしまったのか・・・）

## メモ
この問題は [ずんだ問題](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0) の番外編です
unityでスクリプトの外から変数の値を変える方法ー初心者用

#初めに
はじめましてネメシスというものです

今回はUnityで使用するスクリプトの変数の値を書き書き“φ(．．〃):writing_hand:して変えないで、UnityのEditor上で操作する方法を書いておきます。

#紹介
:point_up:まずはこんなスクリプトを書いて適当なオブジェクトに付けて見ましょう。

```ScriptA
using UnityEngine;

public class ScriptA : MonoBehaviour
{
    int num;

    private void Start()
    {
        Debug.Log(num);
    }
}
```

実行するとこんな感じです。

![cons01.png](https://qiita-image-store.s3.amazonaws.com/0/276381/a968985f-c16c-6916-985f-6b8b7da649a7.png)

ここでinspectorを見てみましょう。:point_down:
ScriptAの付近、覚えてていてくださいね？

![inspec01.png](https://qiita-image-store.s3.amazonaws.com/0/276381/343f7612-6083-586f-3e43-d31a31b89fc0.png)

それでは何も考えずにおまじないを書いてみましょう。
先程のScriptの```int num```の部分を、```public int num```に書き換えてみましょう。

```ScriptA
using UnityEngine;

public class ScriptA : MonoBehaviour
{
    public int num;

    private void Start()
    {
        Debug.Log(num);
    }
}
```

こうして保存してunityの画面に戻ると、、、？

![inspe02.png](https://qiita-image-store.s3.amazonaws.com/0/276381/2456e4c0-9d93-1ac6-618e-dee5b611f0a3.png)

**なんか増えてる！！**

この状態で実行してみましょう
![cons01.png](https://qiita-image-store.s3.amazonaws.com/0/276381/a968985f-c16c-6916-985f-6b8b7da649a7.png)

まだ変わりませんね。

それではNumの数字0を1に変えてみましょう！

![inspe03.png](https://qiita-image-store.s3.amazonaws.com/0/276381/cbf74b2d-f785-af70-5069-beb39e21dc9b.png)

これで実行すると、、、

![cons02.png](https://qiita-image-store.s3.amazonaws.com/0/276381/3908434a-d219-3e98-959e-79e7f2b67df3.png)

**1になった!!!**

こうしてプログラムを書き換えることなく変数を変えることに成功しました！
この機能はとても良く使う（使える）ので覚えておきましょう。
##　

ちなみに、もちろんですが、int以外の型でも使えます。
![inspe04.png](https://qiita-image-store.s3.amazonaws.com/0/276381/6e36e0f8-9033-a655-683b-8b5ef49872b5.png)

```public int num;```にしていましたが、
 ```public int num = 3;```とかにしておくと、変更する前の数値を指定できます。（デフォルトは0）

##

きっと中にはpublicを使うのが嫌な人もいるでしょう。
privateでいたい！！でもEditor上で編集したい！！！

そんな人におすすめなのがこちら
\\\ででんっ///
```SerializeField```

```
[SerializeField] int num;
```
こんな感じにかくとさっきまでの挙動とおなじになります。

#おしまい
何かの調整で、いちいち書き換え→ビルド→実行→確認→書き換え→....
みたいにならなくて済むのがとても大きいですよこれは。
エンジニアチーム作りの試行錯誤

# はじめに
本記事は[Goodpatch Advent Calendar 2018](https://qiita.com/advent-calendar/2018/goodpatch)の25日目の記事です。
株式会社グッドパッチ デザインDiv エンジニアUnit マネージャーの見習いを３ヶ月前からやっているnktnがエンジニアチーム作りの試行錯誤について紹介します。


# マネージャー見習いになるきっかけ
元々エンジニアとして開発業務に従事していまして、開発をしているときが一番楽しく、マネージメントへの興味が薄い方でした。
ただ、今回既存のUnitを運営するのではなく、新設して作るという話から、開発リーダーとしての経験を活かしながら、エンジニアが活動しやすい環境を作ることに興味が湧きました。
マネージメントの勉強をやっていないのでやり方が良くわからないし、自分で上手くいくのかという心配が大きかったのですが、周りに相談にのってもらえるいろいろな方々がいることが後押しになりました。


# ユニット結成初期
実は、結成初期には専任マネージャーを置くのかという話し合いがありました。
というのも、ヨーロッパ側がホラクラシーを利用して組織の管理体制を置いており、自チームでも今回小さく運営をテストしよう！ということで、ほんの少しの間だけユニットの中で簡易的に試用をしました。
結果的に、ホラクラシーの運用は部分的に活用することになったのですが、下記に経緯を記します。

## ホラクラシーの試用
※ホラクラシー自体は、[Video from Google Talk](https://www.holacracy.org/intro)にて内容が説明されています。

### やって良かった点
特に責任感・主体性の向上があったと感じています。
また、意見を言い合うことも活発になったと思います。
ここで得た責任感や主体性を向上できるように、チーム内の仕事は基本的に各自が中身も考えて実行までやるようになりました。

### やってみて合わなかった点
組織の管理自体を複数名でおこなうことは、承認フローの複雑化や曖昧性につながり、
一定規模の組織運営をすることを考えると、管理を一人に集約させる方が、今のところユニットを運営するには向いていることがわかりました。

### ホラクラシーの試用のまとめ
エンジニアリング組織をよりしっかりとしたものにするために、ホラクラシーなどを試用して既存の方法の変革を考えることは、いい部分・悪い部分が分かり、有意義なものだったと思います。
今後も色々な方法を、会社にあった範囲ややれる範囲でどんどん取り入れていきたいと思える経験でした。

# マネージャー見習い就任後のユニット運営
見習いということで、僕自身が上司から「目標設定のしかた」や「1on1のやりかた」などを教えてもらいながら、ユニット運営を始めました。ユニットの組織作りについて決めるべき内容や大事なことが何なのかを学びながら、大きく下記のようなことを実行しています。

## 自分たちは何者なのか、何を目指しているのかを決める
会社としては、明確化されているのですが
自分たちのチームの存在意義について、自分たちの言葉で語れるようになろうと考え、
特にどういった価値を提供できるのかを軸に、メンバーとワークショップをして目標を決めていきました。

## 1 on 1 
メンバーとのコミュニケーションの場として、1 on 1を設け、実施しています。
やり方に関する情報はたくさんあり、私自身としては[Google re:Work](https://rework.withgoogle.com/jp/)を参考にさせてもらっています。

### 目的
基本的に下記目的を中心に実施をしています。
- キャリア形成の支援
- 目標達成の支援

### 頻度
週1回 or 隔週1回 / 1回30分

### アジェンダ
- OKRの確認とすりあわせ
- Will / Can / Mustの確認
- メンバーの状況確認

### 気をつけていること
幸いにも内・外部のマネージャー研修を受けさせていただいているため
コーチング、ティーチング、フィードバックの考え方や実施方法については学ぶ機会が多くあります。
1 on 1では出来るだけコーチングのために、メンバーが話す割合を多くすることを意識しています。
また、働く上で何か支障になっていることがないかの把握や、環境の改善へのヒアリングも併せて行っています。
とはいえ、まだまだ内容の改善や質の向上は課題で、コーチングスキルを上げていきたいと考えています。


# これから
まだ３ヶ月といった期間で、実行できたものは少ないのですが
今後は下記を意識してマネージャー業務を行っていきたいと思っています。

- 見習いではなく、自分で責任を持ってマネージメントができるようになること
- 現状のチームパフォーマンスの計測と改善を行い、成果に繋げること
- メンバーの成長支援をおこない、各自のパフォーマンスがさらに発揮できるようにすること

このチームはデザインとテクノロジーが好きで、「より良くしたい」という気持ちが強い人たちが集まっています。
これからも試行錯誤が続きますが、マネージャーとして、チームのみなさんが力を発揮できるように、
そして、自分自身も成長できるように尽力したいと思っています。
AtCoder Unit Test を使って、動作確認を簡単に！

（これは [AtCoder関連サービス Advent Calendar 2018](https://adventar.org/calendars/2932) の25日目の記事です）

**AtCoder Unit Test** という、ブラウザの拡張機能を作りました。
これは、どういうものかというと「**AtCoder の問題ページから、自動でテストケースを生成するツール**」です。

* [AtCoder Unit Test – Get this Extension for 🦊 Firefox (ja)](https://addons.mozilla.org/ja/firefox/addon/ac-unit-test/)
* [AtCoder Unit Test - Chrome ウェブストア](https://chrome.google.com/webstore/detail/atcoder-unit-test/lmahhninbclefepjbcdfbcjnancipfmi)

現在の対応言語は、Java, Kotlin, C#, Python 3[^1] です。
その他の言語については [Pull Request をお待ちしています](https://github.com/YujiSoftware/ac-unit-test)。

[^1]: Kotlin は @da_louis さんから、Python 3 は、@frodo821 さんから Pull Request いただいて対応することができました。

## 動作確認を手動でやってますか？

AtCoder にコードを提出する前に、たいていの場合は動作確認をします。その時に、以下の手順でやるのが一般的です。

1. プログラムを実行
2. 問題ページから入力例をコピー&ペースト
3. 実行結果を目視で確認
4. １～３を入力例ごとに繰り返し

でも、これはめんどくさいです。
かといって動作確認なしで提出すると、WA を出してしまいがちです…。

## このツールを使うと

そんな手間が、このツールを使うとたったのこれだけになります！

1. 問題ページからテストコードをコピー&ペースト
2. テストを実行

以上。

これだけで、 **全部の入力例を一度に実行できて、しかも実行結果が正しいかどうかも一発で分かります。**
これで、うっかりミスで WA を出してしまうのを避けられます。

## 使い方

使い方は、とても簡単です。

拡張機能を入れた状態で、AtCoder の問題ページを開いて右クリックします。
すると「ユニットテストを生成」というメニューが追加されているので、それをクリック。
![キャプチャ](https://qiita-image-store.s3.amazonaws.com/0/205989/92ec7916-1f15-9329-fa92-f44095f196f8.png)

これで、以下のようなテストコードがコピーされます。
これをIDEに貼り付けます。

```java
import static org.hamcrest.CoreMatchers.is;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.junit.Assert;
import org.junit.Test;

public class MainTest {

	@Test
	public void 入力例_1() throws Exception {
		String input = 
			"25";
		String output = 
			"Christmas";

		assertIO(input, output);
	}

	@Test
	public void 入力例_2() throws Exception {
		String input = 
			"22";
		String output = 
			"Christmas Eve Eve Eve";

		assertIO(input, output);
	}

	private void assertIO(String input, String output) throws Exception {
		ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
		System.setIn(in);

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		System.setOut(new PrintStream(out));

		Main.main(new String[0]);

		Assert.assertThat(out.toString(), is(output + System.lineSeparator()));
	}
}
```

あとは回答を書いて、これらのテストを実行してみましょう[^2]。
すべて通ればOKです。安心して提出しましょう！
![テスト実行結果](https://qiita-image-store.s3.amazonaws.com/0/205989/1bae3690-7e1b-8708-b496-cb4b7e3bd6c1.png)

[^2]: ちなみに、eclipse であれば Quick JUnit プラグインを入れておくと便利です。Ctrl+9 でテストコードへの切り替え、Ctrl+0で実行ができるようになります。

## ちょっとした注意点

* C#
    * 問題を解くクラスの名前を Program にする必要があります。
* Python
    * 問題を解く関数の名前を resolve にする必要があります。
* Kotlin
    * 問題を解くメソッドの名前をパッケージ内で一意の名前にした上で、`main`はその関数を呼ぶのみの作りになっている必要があります。  
    また、生成されたテストコードの`abc000X()`をテスト対象のメソッドに書き換える必要があります。

```kotlin
fun main(args: Array<String>) {
    abc123A()
}

fun abc123A() {
    // 実装
}
```
            

## まとめ

ということで、ぜひ使ってみてください！

* [AtCoder Unit Test – Get this Extension for 🦊 Firefox (ja)](https://addons.mozilla.org/ja/firefox/addon/ac-unit-test/)
* [AtCoder Unit Test - Chrome ウェブストア](https://chrome.google.com/webstore/detail/lmahhninbclefepjbcdfbcjnancipfmi/publish-accepted?hl=ja)
Gromacs形式のトラジェクトリファイルをNAMD形式に変換する方法

Gromacs形式のトラジェクトリ (trajectory) ファイルをNAMD形式に変換する方法を記す。

Gromacs形式トラジェクトリ (.trr and .xtc)
↓
NAMD形式トラジェクトリ (.dcd)

## 使うツール

The **mdtraj**

- mdtrajツールに含まれるmdconvertを用いる。

[Command-line trajectory conversion: mdconvert — MDTraj 1.7.0.dev0 documentation](http://mdtraj.org/latest/mdconvert.html)

- Reference
McGibbon,R.T., Beauchamp,K.A., Harrigan,M.P., Klein,C., Swails,J.M., Hernández,C.X., Schwantes,C.R., Wang,L.P., Lane,T.J. and Pande,V.S. (2015) MDTraj: A Modern Open Library for the Analysis of Molecular Dynamics Trajectories. Biophys. J., 109, 1528–1532.

## condaを使ってインストール

- mdtrajツールのインストールをするためにAnaconda環境を構築する。pythonによって書かれているため，condaもしくはpipを用いる。

[Downloads - Anaconda](https://www.anaconda.com/download/)

- Windows 64bit, Python 3.7 version 用のインストーラを用いた。
- インストールできたら"Anaconda Prompt"を開く。（winsows key -> すべてのプログラムに表示される）
- ここでは，他のpythonパッケージと区別してバージョン管理等の行うために，Pythonの仮想環境の中でmdtrajをインストールする。
- create conda environment

```
conda create --name myenv1
```

- check created environments

```
conda info --envs
```

- activate the environment

```
activate myenv1
```

- myenv1の中でmdtrajをインストールする。

```
conda install -c omnia mdtraj
```

- mdtrajがインストールされたことの確認。

  - python interpreterを開き、`import mdtraj`でエラーが出ないことを確認。
  - また、Anaconda Promptにて、以下のコマンドでヘルプが表示されることを確認。

```
mdconvert -h
```

## 変換

- Gromacs形式の.xtcファイルを.dcd形式に変換する。

```
mdconvert -o md.dcd md.xtc
```

- 仮想環境を抜けるときは、以下のコマンドを使う。（deactivate the environment）

```
deactivate
```
凸凹のRSpec平らに均すshared_contextがマジ便利

この記事は[Okinawa.rb Advent Calendar 2018](https://qiita.com/advent-calendar/2018/okinawarb)の19日目の記事です。
昨日は @hanachin_ さんの[Re: 10分間隔で 10時〜23時台の配列をつくる](https://qiita.com/hanachin_/items/1a7b9ea0af62e5021c94)でした。

## 凸凹はつらい

みなさんのRSpec凸凹してませんか。

app以下のコードだとコードレビュー通らないぐらい凸凹しているコードもなぜかspecだと通ることが多い印象です。何を隠そうわたしも凸凹させたことがあります

え？凸凹って何かって? 凸凹の例はこういう感じです

```rb
RSpec.describe "動画が見れる", type: :system do
  context "ログインしている場合" do
    before do
      ログイン
    end

    context "クレジットカードを登録している場合" do
      before do
        クレジットカードを登録する
      end

      context "動画がある場合" do
        before do
          動画をつくる
        end

        it "動画が見れる"
      end

      context "動画がない場合" do
        it "動画がないと表示されている"
      end
    end

    context "クレジットカードを登録していない場合" do
      it "動画が見れない"
    end
  end

  context "ログインしていない場合" do
    it "動画が見れない"
  end
end
```

いろんな深さのネストがあります。凸凹してますね。
ネストが複雑すぎると読みづらい、どこに書けばいいかわかりづらい、exampleを実行するための前提条件がわかりづらいみたいな辛さが発生します。

## 凸凹になる原因

RSpecのdescribeやcontextはネストを深くしてもちゃんと動きます。
書けてしまうものはみんな書く。避けられない!

一方Gherkinはどうでしょう?
Featureの下にScenarioがあるだけ、文法が深いネストを許さない。
https://docs.cucumber.io/gherkin/reference/

## 凸凹の直し方

凸凹に書けてしまうので凸凹に書くのであれば、凸凹に書けないGherkinを真似してRSpecを書けば凸凹しないでしょう。

## 先程の例をshared_contextを使って書く

Gherkinでいう`Given`や`Background`に相当するStepを`shared_context`で宣言します。
あとはGherkinのように並べるだけ。


```rb
RSpec.describe "動画が見れる", type: :system do
  shared_context "ログインしている" do
    before do
      ログイン
    end
  end

  shared_context "クレジットカードが登録されている" do
    before do
      クレジットカードを登録する
    end
  end

  shared_context "動画がある" do
    before do
      動画をつくる
    end
  end

  describe "動画が見れる" do
    include_context "ログインしている"
    include_context "クレジットカードが登録されている"
    include_context "動画がある"

    it "動画が見れる"
  end

  context "動画がない場合" do
    include_context "ログインしている"
    include_context "クレジットカードが登録されている"

    it "動画がないと表示されている"
  end

  context "ログインしていない場合" do
    it "動画が見れない"
  end

  context "クレジットカードが登録されていない場合" do
    include_context "ログインしている"

    it "動画が見れない"
  end
end
```

平らになって読みやすくなりましたね。

## まとめ

わたしはappでは書かないようなネストをspecで書いてしまうことがあります。結果、RSpecが凸凹しすぎててつらくなることが少なからずありました。
わたしがGherkinでテストを書くとき深くネストすることはありません。なぜならGherkinの文法では深くネストした仕様を書けないからです。
Gherkinを真似して`shared_context`で前提条件を細かく分け`include_context`を並べて書くとわたしでもネストを減らして平らにできることがわかりました。

shared_context使ってRSpecのテストを平らにしていきましょう!

## Gherkin♡のまとめ

Gherkinの文法はネストできないのでべんり。
ネストしたRSpecのテストに疲れたらGherkinでテストを書きましょう。

```gherkin
# language: ja
機能: 動画が見れる
  シナリオ: 動画が見れる
    前提 ログインしている
    もし クレジットカードが登録されている
    かつ 動画がある
    ならば 動画が見れる

  シナリオ: 動画がない場合、動画がないと表示される
    前提 ログインしている
    もし クレジットカードが登録されている
    ならば 動画がないと表示されている

  シナリオ: ログインしていない場合動画が見れない
    もし ログインしていない
    ならば 動画が見れない

  シナリオ: クレジットカードが登録されていない場合、動画が見れない
    前提 ログインしている
    しかし 動画が見れない
```

Gherkinで書くと仕様とステップの実装を分離できます。
読みやすいし書きやすいですね。
Goでクリスマスツリーを表示する　

この記事はand factory Advent Calendar 2018 Day 25の記事になります。
前日は@yst_i の「[マルチモジュール 簡単なサンプル](https://qiita.com/yst_i/items/94343ddbc3f9ef3ed5a3)」でした。

# 概要
クリスマスなので、Goでクリスマスツリーをニョキッと生やすツールを作りました。
MacとLinuxでGoの環境があれば、たった以下の２コマンドであなたのCLI環境にツリーをお届けします。

```
go get github.com/gosagawa/xmastree
xmastree
```

オプションでサイズと速度を指定できます。モニタのサイズが許す限り大きいツリーを作れます。

```
xmastree -size=20 -speed=40
```

![xmastree.gif](https://qiita-image-store.s3.amazonaws.com/0/145904/9a25fe28-f67d-a9e3-8c9c-152843311fb0.gif)


# 解説

ソースはこちら
https://github.com/gosagawa/xmastree

なんて事はないプログラムなのですが、ちゃんやろうとすると結構な労力を要するように思いました。

## 対応した事
- 文字の色を変える
- 同じところでアニメーションさせる
  - これらを実現するためにエスケープシーケンスを使っています。Windowsだと動かないのはそのためです。
- Cliコマンドツールとして、オプションでサイズやスピードを指定できるように
- TravisCIとの連動
- readmeにGif動画を載せる

## 対応する前に力尽きた事
- テスト
  - 文字は即時で出力してしまっているが、テスト用に文字列として書き出せるようにしておくのが良いです
- コードを読みやすくする
  - パラメータ周りや表示部分が汚い
- もっとツリーらしく飾り付けをしたりとか。

## 一口解説、エスケープシーケンス
今回のツールを実現させるために"\033[xxxA" (xxxの部分は任意の数字)というエスケープシーケンスを用いています。これはxxx分カーソルを上に戻るといういうもので、これで書いて戻ってを繰り返して描画を行なっています。

```go
	for i := 0; i < size; i++ {
		if i != 0 {
			fmt.Printf("\033[%vA", maxHeight)
		}
		tree := newTree(i*2+5, i+1, 2, maxHeight)
		tree.display()
		time.Sleep(time.Duration(speed) * time.Millisecond)
		maxWidth = tree.MaxWidth
	}
```

また、以下定数で定義していますが各文字の色付けをエスケープシーケンスで設定しています

```go
const (
	// EscapeRed display red color
	EscapeRed = "\033[31m"

	// EscapeGreen  display green color
	EscapeGreen = "\033[32m"

	// EscapeYellow display Yellow color
	EscapeYellow = "\033[33m"

	// EscapeReset  reset color
	EscapeReset = "\033[0m"
)
```

# まとめ
ちょっとしたものですが、ちゃんと作り込もうとなるとそれなりに大変そうです。時間を区切って、何かこういうCLIツールを作るコンテストとかやると面白いかもしれませんね。
良いクリスマスを！

# 参考にしたもの、インスパイヤされたもの
- [golangでエスケープシーケンスを扱う(文字色、カーソル移動)](https://qiita.com/t0w4/items/a1b312693adb5e9d68c2)
- [【C言語】クリスマスツリーをコマンドラインで](https://qiita.com/drumath2237/items/28f48a9852f14cfe4458)
- [GithubやQiitaに載せるgif形式の動画を作成する方法](https://qiita.com/syamaoka/items/4d4054cd75df00460925)
合成数列の和(advent calendar2018,Nim)

今見ましたら、advent calendar 2018の合成数列の和、12/24が埋まっていませんでした。
また、Nimがないなあと思っていましたので、参加します。
イテレータに挑戦しようかと思いましたが、求められているのは合計だけですので、
普通にプロシージャで書きます。
初心者の素朴なコードですので説明はいらないでしょう。

```Nim
import os
import strutils
import math

proc sync(x:int): bool =
  result = false
  for i in 2..x.float.sqrt.int :
    if x mod i == 0:
      result=true

proc sumsync(b: int): int =
  var res=4
  var cou=1
  var sum=0
  while cou <= b:
    if sync(res):
      sum=sum+res
      inc(cou)
    inc(res)
  return sum

#echo sumsync(100)
```
React.lazy でお手軽 Code-Splitting

こんにちはフロントエンドエンジニアの山岸和利 ([@ykzts](https://twitter.com/ykzts)) です。お仕事では Ruby を書いていましたが、最近では Perl を書いています。

### `React.lazy` とは

[React v16.6](https://reactjs.org/blog/2018/10/23/react-v-16-6.html) から Code-Splitting のために `React.lazy` という API が追加されました。これまでも `import()` を使った Code-Splitting は可能でしたが、公式の API が追加されたことによって平易な記述ができるようになります。

`React.lazy` を活用することによって必要になるまでスクリプトファイルの読み込みが遅延されるため、ページの初期読み込み速度の改善が期待されます。

HTTP/1.1 では同一のホストから行える同時にできるリクエスト数が制限されていました。そのため webpack や Browserify のようなバンドラーツールを用いてスクリプトファイルは一つのファイルに結合することによって速度改善が見込めていました。

しかし HTTP/2 ではリクエストとレスポンスのストリームが多重化されていて並列して複数のリクエストが送れるようになりました。そのため不必要なスクリプトファイルの読み込みを遅らせることが速度改善のためには大事になってきます。

### コード例

```jsx:./src/Viewer.jsx
import React from 'react'
import Three from 'three'

export default class Viewer extends React.Component {
  /* ... */

  render() {
    return <canvas ref={this.canvasRef} />
  }
}
```

```jsx:./src/App.jsx
import React, { Suspense, lazy } from 'react'

const Viewer = lazy(() => import('./Viewer'))

export default class App extends React.Component {
  /* ... */

  render() {
    <Suspense fallback={<div>Loading...</div>}>
      <Viewer />
    </Suspense>
  }
}
```

Code-Splitting は [three.js](https://threejs.org/) のような使う箇所が限られているもののコード量が多いライブラリを使う場合に活きてきます。three.js を使う場合、ほかのリソースも読み込むかと思います。なので React コンポーネントの読み込みが多少遅れてもユーザに対しての違和感は少なくなるでしょう。

### 最後に

この記事は 2016 年に書かれた拙記事である [import()を使ったHTTP/2時代のフロントエンド実装](https://ykzts.blog/2016/12/23/dynamic-import/)の焼き直しです。2 年の間に HTTP/2 を使うウェブページの数もより増えました。React 本体にも Code-Splitting を強く意識した API が追加され、`import()` の活用事例も増えていくのではないでしょうか。

というわけでこちら [DeNA Advent Calendar 2018](https://qiita.com/advent-calendar/2018/dena) の 23 日目の記事でした。
メモ：「３０日でできる！OS自作入門 」20日目

## API

1) プログラムの整理
- ファイル検索の関数化
- 各コマンドの関数化、cmd_cls, cmd_dir, cmd_type, cmd_hlt とそれを実行する runcmd
- CONSOLEの構造体追加、sheetとカーソルなどの情報を持つ

2) 一文字表示API
- syscall 的な実装
- あるレジスタに値を入れて関数を呼び出す

```
[BITS 32]
  MOV AL, 'A'
  CALL 0xbe3
fin:
  HLT
  JMP fin
```
- 異常終了

3) 一文字表示API２
- far call は far ret (RETF)

4) アプリケーションの終了
- C から farcall 呼び出せるように関数を追加

![スクリーンショット 2018-12-25 0.02.28.png](https://qiita-image-store.s3.amazonaws.com/0/109145/4dc0a74f-f4d2-4fcb-7c87-fc8282d108e8.png)

5) OS バージョンが変わっても変わらない API
- GDT が余ってるので0x40 に登録
- CALL なんとかではなく、INT 0x40で呼び出せる

6) アプリケーションの名は自由に
- hlt と打ったら hlt.hrb を呼びだすじゃなくて、ファイルで呼び出せるようにする
- hlt.nas を hello.nas に　(hello.hrb)とコンパイルされる

![スクリーンショット 2018-12-25 0.10.39.png](https://qiita-image-store.s3.amazonaws.com/0/109145/d8df1c19-39ac-77f6-c6cf-dd301ddb46d8.png)

7) レジスタに気をつけよう
- 実は文字列 hello を表示するために、人文字ずつじゃなくて loop 形式にしたら、PUSHAD, POPAD使い必要あった。 おそらくECX が変わっちゃうから。

8) 文字列表示 API
- edx にサブ番号を入れで同じ　INT ０x４０で受け付ける、文字の表示も、文字列も表示できますね。
- サイズ指定ある文字列表示APIはまだ動いていない

今日は以上
ChromeOS/Chromebook　開発用マシン構築手順

Chromebookを換えたときのために手順を残す
順次追加していきます:muscle_tone2:
#前提
##バージョン
`76.0.3809.102`（Official Build）（64 ビット）
##キーボード
英字キーボード
##CPUアーキテクチャ
x86/x64
#ChromeOSの設定
- ChromeOSのアップデートを確認
- タッチパッドの速度を最速に設定
- スクロールを逆方向に設定
- キーボードの自動リピートまでの時間を短くする
- キーボードのコントロールとランチャーを入れ替える
- Linux(Crostini)モードを有効にする

#Linux(Crostini)の設定とパッケージのインストール
##ターミナルの設定
ターミナルがアクティブな状態で
`Shif+Ctrl+p`
##バージョンの確認
```
cat /etc/debian_version
```
##パッケージの更新
```
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade
```
##ホスト名の変更
```
sudo vim /etc/hostname
sudo vim /etc/hosts
```
##Guiアプリケーションでの日本語入力⇔英語入力の切り替え
###日本語フォントのインストール
```
sudo apt install fonts-noto-cjk
```
###fcitx-mozcのインストール
```
sudo apt install fcitx-mozc
```
###ChromeOSランチャーのfcitxをクリック
これをしないとInput Methodに「Keyboard English(US)」が追加されない（USキーボードの場合）
###Input MethodにMozcを追加
```
fcitx-configtool
```
![Screenshot 2019-07-27 at 13.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184922/992fe9ad-e53e-4c51-b91c-16d0fbb4dc36.png)
###環境変数の追記
```/etc/systemd/user/cros-garcon.service.d/cros-garcon-override.conf
Environment="GTK_IM_MODULE=fcitx"
Environment="QT_IM_MODULE=fcitx"
Environment="XMODIFIERS=@im=fcitx"
```
###ログイン時に読み込まれるよう設定の追記
```~/.profile
/usr/bin/fcitx-autostart > /dev/null 2>&1
```
`Ctrl+Space`で日本語入力⇔英語入力ができるが、IDE（JetBrainsやVisual Studio Code）とジェスチャーがかぶってしまいIDEで入力支援機能が使えない、、、、:pensive:要検討
##Visual Studio Codeのインストール
```
curl -L https://go.microsoft.com/fwlink/?LinkID=760868 > code.deb
sudo apt install ./code.deb
```
##Dockerのインストール
```
sudo apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce
```
##Docker Composeのインストール
```
# 別のバージョンのComposeをインストールするには、指定のバージョンで1.24.1を置き換える
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# バイナリに実行可能権限を適用
sudo chmod +x /usr/local/bin/docker-compose
```
##SudoなしでDockerを実行する(Visual Studio CodeのRemote Developmentでエラーになってしまうので)
```
sudo groupadd docker
sudo usermod -aG docker $USER
```
##こまごまとしたツールのインストール
```
sudo apt install terminator
sudo apt install screenfetch
sudo apt install tree
```
###Bashログイン実行されるよう設定の追記
```~/.bashrc
screenfech -t
```
iptablesでNATしてVPC内リソースにアクセスする

## はじめに

この記事は[Zenelo Advent Calendar 2018](https://qiita.com/advent-calendar/2018/zenelo)の22日目（完全に遅刻だけどね）の記事です。

## やりたいこと

外部ネットワークからVPC内のリソースにアクセスする。
例えば、

- ElastiCache
- RDS
- Elasticsearch

とか。

## どうやるの？

iptablesでNATでしょ！（nginxとかhaproxyとかでも全然いけると思う）

## 手順

### セキュリティグループの準備

- セキュリティグループ作成
    - 許可するネットワーク（例えば会社の拠点IPとか）からのみ特定ポート（RDSだったら`3306`、memcachedだったら`11211`とか）にアクセスを許可する
- アクセスしたいリソースのセキュリティグループのインバウンドに上記で作成したセキュリティグループを追加する

### EC2インスタンスの準備

- コンソールからEC2インスタンスを立ててElasticIPをつける

### iptablesでルーティング

- 上記で作成したEC2インスタンスにsshログインする
- iptablesコマンドが入ってなければインストール

```
sudo yum install iptables bind-utils tcpdump # 必要コマンドとついでにtcpdumpも入れたければ入れとく
```

- カーネルパラメータの設定

```
sysctl -w net.ipv4.ip_forward=1 # フォワーディングの有効化
vi /etc/sysctl.conf # 該当箇所を修正して設定を永続化
-> net.ipv4.ip_forward=0となっているところをnet.ipv4.ip_forward=1に修正する、なければ追記する
```

- 対象リソースのIP確認

```
nslookup <対象リソースのエンドポイント名（コンソールで確認しとく）>
```

- iptablesでルーティング設定
    - netfilterとかiptablesでのルーティングについて知りたければ下の補足へ

```
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport ３３０６ -j DNAT --to <上記で確認した対象リソースのIP>:３３０６ # RDSの場合
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 11211 -j DNAT --to <上記で確認した対象リソースのIP>:11211 # memcachedの場合
vi /etc/sysconfig/iptables # 永続化のために上記の設定を追記
```

### 疎通確認

- 外部ネットワークからtelnetなりcurlなりｍysqlコマンドなりでElastiIPへアクセス！応答が返ってくるはず
- NATサーバー上でtcpdumpするとNATしてる様子が見れますね

## 補足

- [Netfilterに関するエトセトラ](http://enog.jp/wp-content/uploads/2012/12/netfilter_etc_121221.pdf)
- [natテーブルを利用したLinuxルータの作成](http://www.atmarkit.co.jp/ait/articles/0505/17/news131.html)
【SQL】row_numberのないMySQLでユーザー変数を使わずに連番を振る

# はじめに
例えばoracleでは`row_number()`みたいな分析関数が用意されているのですが、MySQLでは`row_number()`がないので、サブクエリを使って連番を振ってみようと思います。

# サンプルデータ
適当に作った、テストの成績表を使います。

| 名前 | 科目 | 点数 |
|:--|:--|:-:|
|sato|Math|65|
|morita|Science|85|
|tahakashi|Math|45|
|ishii|English|75|
|ishii|Math|40|
|tahakashi|Science|60|
|shimizu|English|55|
|nakajima|English|70|

# 点数の高い順に並び替えて連番を振る
上記のサンプルデータを以下のように表示します。ひとまず科目は問いません。
学校だと、点数の高い順に掲示板に張り出されるアレです:sweat_drops:

| No. | 名前 | 科目 | 点数 |
|:--|:--|:--|:-:|
|1|morita|Science|85|
|2|ishii|English|75|
|3|nakajima|English|70|
|4|sato|Math|65|
|5|tahakashi|Science|60|
|6|shimizu|English|55|
|7|tahakashi|Math|45|
|8|ishii|Math|40|

## 実行したSQL
```SQL
select
  (select count(*)+1 from テストの成績表 where 点数 >x.点数) as 'No.'
  , 名前, 科目, 点数
from テストの成績表 as x
order by x.点数 desc
;
```

## 解説
「点数の高い順に」ということなので、`order by x.点数 desc`で並び替えます。
その時に、「自分より点数の高いレコードが何件あるか」を算出しているのがこのサブクエリです。

```SQL
select count(*)+1 from テストの成績表 where (比較対象の)点数 >x.(自分の)点数
```
１位の`morita / Science / 85`さんより点数の高いレコードは0件です。
そのため、「自分より点数の高いレコードの件数」に`+1`しないと、１から始まる連番にならないというわけです。
ポイントは、「再帰集合になっている」こと:star2:
`count(*)`する要素数が必ず１つずつ増えていくのが保証されるんです。
ちなみに、点数の低い順に連番を振りたければ、`where 点数 <x.点数`と不等号の向きを逆にします。

# 点数の高い順に並び替えて科目ごとに連番を振る
上記の例だと使いづらい:disappointed_relieved:せめて科目ごとに順位つけるよね・・・ってことで、以下のように表示してみます。

| No. | 名前 | 科目 | 点数 |
|:--|:--|:--|:-:|
|1|ishii|English|75|
|2|nakajima|English|70|
|3|shimizu|English|55|
|1|sato|Math|65|
|2|tahakashi|Math|45|
|3|ishii|Math|40|
|1|morita|Science|85|
|2|tahakashi|Science|60|

## 実行したSQL
```SQL
select
  (select count(*)+1 from テストの成績表
   where 科目 = x.科目 and 点数 > x.点数
  ) as 'No.'
  , 名前, 科目, 点数
from テストの成績表 as x
order by x.科目, x.点数 desc
;
```

## 解説
科目と点数で並べ替えたいので、ひとまず`order by x.科目, x.点数 desc`します。
「科目ごとに連番」とは、つまり「同じ科目の中で点数の高いレコードが何件あるか」とも言えるので、サブクエリ部分はこのようになります:arrow_down:

```SQL
select count(*)+1 from テストの成績表
where
  (比較対象の)科目 = x.(自分の)科目
  and (比較対象の)点数 > x.(自分の)点数
```
やってることは、さっきと同じです。科目が一致しているかどうかを見ることで、連番をリセットさせることが出来るというカラクリです:wrench:

# まとめ
`row_number()`が使えなくても、連番を振ることは可能です。
ただ、テーブルのスキャンが２回になるので、`row_number()`があるなら、素直に`row_number()`を使った方がパフォーマンスは上がります。

とはいえ、考え方の１つとして、知っておいてもいいのかなーと思います。

# おまけ
## 参考文献
### webサイト
SQLアタマアカデミー
第1回　連番の特性を利用してデータ操作をもっと自由に　SQLで連番を扱う
（2）行集合に連番を割り当てる
:link:　http://gihyo.jp/dev/serial/01/sql_academy2/000102

### 書籍
SQL実践入門 ──高速でわかりやすいクエリの書き方 WEB+DB PRESS plus
2015年4月11日発売
ミック　著
:link: http://gihyo.jp/book/2015/978-4-7741-7301-6

## サンプルデータ
今回のサンプルデータを生成したcreate table文とinsert文はこちら:arrow_down:

```SQL
create table testScore(name varchar(30), subject varchar(100), score integer);
insert into testScore(name, subject, score) values("sato", "Math", 65);
insert into testScore(name, subject, score) values("morita", "Science", 85);
insert into testScore(name, subject, score) values("tahakashi", "Math", 45);
insert into testScore(name, subject, score) values("ishii", "English", 75);
insert into testScore(name, subject, score) values("ishii", "Math", 40);
insert into testScore(name, subject, score) values("tahakashi", "Science", 60);
insert into testScore(name, subject, score) values("shimizu", "English", 55);
insert into testScore(name, subject, score) values("nakajima", "English", 70);
```
micro:bitでMerry Christmas!240個の テープLED(WS2812B)でクリスマスツリーをデコレーション

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/1c7cb2cd-cdec-fc77-5243-78b77dfa9b7f.png)

#内容
micro:bitでテープLED(WS2812B)の応用編、クリスマスツリーデコレーションしてみました
拡張機能でモジュールを追加するだけで簡単に利用することができます

#必要なもの
micro:bit
転送＆電源供給用ケーブル
テープLED(WS2812B) [一例@Amazon](https://www.amazon.co.jp/ALITOVE-LED%E3%82%A4%E3%83%AB%E3%83%9F%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-WS2812B-LED%E3%83%86%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%83%885050-150%E5%80%8B%E3%83%94%E3%82%AF%E3%82%BB%E3%83%AB%E5%A4%A2%E8%89%B2-%E9%98%B2%E6%B0%B4IP67%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88PCB/dp/B01N2NKK83/ref=sr_1_1_sspa?ie=UTF8&qid=1543622170&sr=8-1-spons&keywords=WS2812B%E3%80%805V&psc=1)
※WS2812B、5V、端子が3つものを選んでください。


#利用方法

-MakeCodeサイトにアクセスする
https://makecode.microbit.org/#editor

-高度なブロックをクリックする
![koudo.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/97d18fb6-1076-efff-797a-ed61a18ab2dd.jpeg)

-拡張機能ブロックをクリックする
![kakucho.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/f245600f-81f4-c363-7f06-138b14599dcd.jpeg)

-検索ダイアログで"neopixel"を検索し、該当画像をクリックし拡張機能を追加
![neo.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/249d3077-f30b-207e-862a-b367e5af8efd.jpeg)

-下記がテープLED(WS2812B)に関する基本ブロックとなります
![neomenu.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/438d76ef-153f-afd0-80bf-4837af7d8a6f.jpeg)

#ハードウェアの接続
GND -->　テープLEDのGNDへ
3V　-->　テープLEDの+5Vへ
P0　-->　テープLEDのDIN1へ
※注意！テープLEDは両端とも同じGND/3V/P0がありますが接続するのは矢印がある側からです！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/cedf203a-8caf-1b1f-8afc-02b75dc7c7a9.png)

下記の写真では抜き差しできるようにアダプターを自作しています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/692eb87b-6903-3379-d434-8c107fd30678.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/ee1fc482-d0d2-da50-ce07-81fb9b6a3e62.png)

#サンプルコード
240個のLEDが赤・緑・青の3色にランダムに光ります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/3fdad6c9-a8ab-11c5-9e22-931203f4dc21.png)

#動作動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">クリスマスツリー <a href="https://t.co/9vrUnDtKsb">pic.twitter.com/9vrUnDtKsb</a></p>&mdash; Takeshi (@hal2000_jp) <a href="https://twitter.com/hal2000_jp/status/1077219723882840064?ref_src=twsrc%5Etfw">2018年12月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
SwiftLintを使ってみよう〜空文字チェックのisEmpty〜

この記事は[**株式会社アイエンターAdvent Calendar 2018**](https://qiita.com/advent-calendar/2018/i-enter)の25日の記事です！
今回は空文字チェックについて学習したことをアウトプットしていきたいと思います。

## きっかけ　
案件でSwiftLintライブラリを使用し、導入後に生まれたエラーを修正するために`isEmpty`メソッドを使用しました。
まずそのエラーについて紹介いたします。

## エラー詳細
配列に要素がないことを確認するコードを追加します。

```ruby

if array.count > 0 { }
```
すると、以下のようなエラーが表示されました。
<img width="419" alt="スクリーンショット 2018-12-24 22.43.26.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/286432/b3f2442a-2746-62a2-9f44-c2174c61fc00.jpeg">
「要素が何もないことを確認する際はcount == 0よりもisEmptyを用いてチェックする」という内容です。
そもそもどうしてisEmpty`メソッドを使用することが推奨されるのでしょうか。

## countとisEmpty
結果のみ報告すると、**処理の速度**が関係しているそうです。
([[Swift] count == 0 より isEmpty を使うべき理由](https://qiita.com/a-beco/items/bf740ed9c8e4575e64b2))
コードを書くときは、パフォーマンスも考慮して書けるようになりたいですね！


## isEmpty == false と !isEmpty
さて、さらにswiftらしい書き方についてです。
冒頭に記載したエラーが出て、まず以下のように書き換えました。

```ruby

if array.isEmpty == false { }
```
先輩にレビューしていただき、以下のように修正いたしました。

```ruby

if !array.isEmpty { }
```

論理演算子を用いた書き方の方が非常にスッキリしましたね♬

####ちなみに・・・
isEmptyのtrue/false、どのような動きをするのか理解するまでに時間がかかりました。
今回の場合で考えてみると、array is Empty 「（日本語訳：）配列は空です」となりますので以下のように処理が通ります。

```ruby

if array.isEmpty {
  print("arrayの要素が何もない時に通る")
} else {
  print("arrayの中身が空ではない時に通る")
```
コードを理解して処理を適切に追加していきます。

## 参考にした記事
https://qiita.com/a-beco/items/bf740ed9c8e4575e64b2
https://qiita.com/kagemiku/items/80e6d905dc0059c342b3
【Ansible】SSHログインがパスワード認証かつrootログイン不可環境におけるPlaybook

# TL;DR

SSHログインが鍵認証ではなくパスワード認証の環境向け記事

- 人が手動でログインしてオペレーションする用途のユーザ: パスワード認証
- プログラム実行する際の実行ユーザ: 鍵認証
- 本記事の制約事項
  - 共通ユーザのパスワードはサーバ毎に共通
  - rootユーザのパスワードはサーバ毎に別(共通でも可)

上記のような環境下におけるAnsible専用のSSHユーザを作成しなくても良いという内容.

# 構成

```shell
playbook-dir
|-- ansible.cfg
|-- group_vars
|   |-- host1.yml
    |-- host2.yml
    |-- ...
|-- inventory
|-- roles
|   `-- common
|       `-- tasks
|           `-- main.yml
`-- site.yml
```

## コマンド

```shell
$ ansible-playbook -i inventory site.yml -u user-name -k
SSH password: (user-name のログインパスワード)
```

## site.yml

```yaml
- hosts: all
  become: true
  become_method: su
  roles:
    - common
```

要件に応じて個別にカスタマイズする.
一般ユーザでのログイン後にroot権限が必要な場合に```become_method: su```でrootユーザスイッチする.

## roles/common/tasks/main.yml

メインの処理はこれに記述する. 割愛.

## inventory

```ini
[host1]
192.168.0.1

[host2]
192.168.0.2

[host3]
...
```

サーバ毎に異なるrootパスワードを設けている場合、後述するパスワード記述ファイルと合わせてホスト名毎にセクションを分けてインベントリを記載する必要がある.
共通パスワードならセクションを分けても分けなくてもどちらでも良い.

## group_vars/host1.yml

```yaml
ansible_su_pass: ***
```

サーバ毎のrootパスワードを平文で記述する.
共通パスワードなら```all.yml```で良い(はず).
平文が気になる場合はvaultなどで暗号化すれば良い(はず... 未検証).


# 以上

弊社環境はログイン用一般ユーザ(個別)をLDAP管理にしているため、LDAPユーザのパスワードのみで全サーバへの共通ジョブを実行できてます.
自動実行したりJenkinsやrundeck等と統合する場合はこれじゃ運用回りませんね.
UnrealEngineのSoundSourceBusについて

#はじめに
[2017年5月、UnrealEngineが4.16にアップデートされた。](https://www.unrealengine.com/ja/blog/unreal-engine-4-16-released)
4.16の主要機能として、EarlyAccessではあるものの、UnrealAudioEngineが使用できるようになった。 


[NewAudioEngineが発表された当時は、](http://mozpaca.hatenablog.com/entry/20170514/1494754900)[Synthsisについての](https://www.plus-signal.com/single-post/2017/05/15/UE4-416%E3%81%AEPreview%E7%89%88%E3%81%AEAudio%E6%A9%9F%E8%83%BD%E3%81%AE%E6%89%80%E6%84%9F%E3%81%AA%E3%81%A9)[記事も発表された。](http://dfkfuturelab.hatenablog.com/entry/2017/05/16/081659)
[ヒストリア＝サンがインタラクティブオーディオをやったりもしていた。](https://www.slideshare.net/historia_Inc/2017unreal-audioengine)
[UE4.20にて録音機能が発表されたときは、](https://qiita.com/Polaris1080/items/1ba8e8a00132abe99ce5)[記事の内容が被るといったこともあった。](http://mozpaca.hatenablog.com/entry/20180622/1529665623)

そこから1年8ヶ月経った2018年12月、UnrealEngineは4.21にアップデートされている。
[海外では、たくさんのインディーズゲームで使われていて、ＡＡＡタイトルでも使われている。EpicGamesも、RoboRecallで使用しているらしいし、全プラットフォームのFortniteで最適化出来たら、デフォルトで有効にする予定らしい。](https://forums.unrealengine.com/development-discussion/audio/116874-new-audio-engine-early-access-quick-start-guide/page12)
しかし、日本では未だに採用タイトルの話を聞かないぐらいには、UnrealAudioEngineはマイナーな存在である。

そこで、アドベントカレンダーのネタとして、さらにマイナーなSoundSourceBusについて探求することにした。

#おやくそく
バージョン：4.21
.iniファイルを書き換えておくか、"-audiomixer"をコマンドライン引数に付けて起動すること。SoundUtilitiesPluginも有効にしておくこと。

#SoundSourceBusとは
サウンドを仕事にしている人や、バンドを組んでいる人には、理解できるはずだ。
**ミキサーでのミックスバスそのものであり、ミドルウェアでのＡＤＸ２・Ｗｗｉｓｅのバスと変わらない**
分からない人のために説明すると、そこに出力された音声を纏めてくれる機能である。

#パラメータについて
すぐに意味が分かるパラメーターや、Concurrency（並列処理）・Attenuation（減衰）については省略する。

| 名前 | 説明 |
|:----:|:----:|
| Source Bus Duration       | Busから出力される時間（秒数）。 |
| Auto Deactive when Silent | 出力が無いときに非アクティブ化。 |
| Sanple Rate Quality       | 周波数、Minだと高音域が別物に。 |
| Output to Bus Only        | Busだけに送信されるようにする。 |

#Post/Pre-Effect Bus Sendについて
+ Post-Effect Bus Send
  + SoundSubmix・SoundEffectが適応されてから出力される
+ Pre-Effect Bus Send
  + SoundSubmix・SoundEffectが適応されずに出力される

**注意点として、Post/Pre-Effect Bus Sendで出力されるSoundSourceBusが、同じレベル内に配置されて（読み込まれて）いなければ、SoundSourceBusに出力されない。**
対策としては、GameModeBaseにAudioコンポーネントを配置して、SoundSourceBusを読み込ませればよい。

#出力について
*SoundWaveとほとんど同等に扱える*
Audioコンポーネントでも出力可能だし、SoundCueに入れても出力可能である。
しかし、SynthSamplePlayerは、秒数が０秒のもの(∞)には対応していないらしく、出力することができない。
railsで動的にscopeを設定したい

#初めに
Railsでmodelにスコープを書くことがあるのですがスコープの数が多くなりすぎることがあります。

それで動的にスコープが定義出来たらと思って自分で試してみました。

#具体例

具体的な例として記事に言語の設定があるとします。

モデルはこんな感じ

![erdplus-diagram.png](https://qiita-image-store.s3.amazonaws.com/0/207921/0d53f190-01c2-0bb4-20c1-361daad82354.png)


そんでこのlangはinteger型でenumを使います

なのでmodels/article.rbには

```ruby:article.rb
class DataCollect < ApplicationRecord
    enum lang: {ja: 0, en: 1, ar: 2, de: 3,el: 4, eo: 5, es: 6, fr: 7}
end
```

こんな感じに設定します


これでarticleを作成するときにlangを設定してあげれはその記事の言語がわかるようになります。

#scopeを作成

scopeを作成するときに例えば

```ruby
Article.ja.all
```

で日本語の記事がとれるようにするためにはmodels/article.rbに


```ruby
scope :ja, -> {where(lang: :ja)}
```

とすれば実装できます。

しかし今回の例のように七個も言語があると

models/article.rbは

```ruby
scope :ja, -> {where(lang: :ja)}
scope :en, -> {where(lang: :en)}
scope :ar, -> {where(lang: :ar)}
scope :de, -> {where(lang: :de)}
scope :el, -> {where(lang: :el)}
scope :eo, -> {where(lang: :eo)}
scope :es, -> {where(lang: :es)}
```

と書かなくてはいけなくて結構邪魔になります。

もっと増えたらもっと邪魔になるわけでこれをもっと短く書きたい！


#class_evalを使ってみた

とりあえずclass_evalを使ってArticleのモデルにscopeを定義してみます。

使い方はこんな感じになりました。

```ruby 
Article.class_eval { scope ja, -> {where(lang: ja)}
```

これでscopeの設定ができるので後は配列を作ってループしたら出来上がり。

```ruby 
Lang = [ja, en, ar, de, el, eo, es, fr]

Lang.each do |l|
  Article.classs_eval { scope l, -> {where(lang: l)}
end 
```

これでOK

#もう少しいじってみる

もう少しいじってみることにして言語のファイルがconfig/localesにあるのですがそのファイルを見てscopeを定義してみたいと思います。

どういうことかというと

例えばconfig/localesに

```
en.yml
ja.yml
en.yml
```

というファイルがあったらそれを見てen,ja,enというスコープを作るということです。


config/localesのファイル名を取得するために

```ruby 
Dir.chdir("/mnt/c/users/owner/desktop/app_name/config/locales")
lang = Dir.glob("*").map {|l| l.match(/../)[0] }
```

こうすればconfig/localesのファイル名が取得できます。


これでconfig/localesにある言語化ファイルがある言語のスコープを作成できました

完成全体像はこちらです。

```ruby 

class Article < ApplicationRecord
    enum lang: {ja: 0, en: 1, ar: 2, de: 3,el: 4, eo: 5, es: 6, fr: 7}
end




Dir.chdir("/mnt/c/users/owner/desktop/latest_news/config/locales")
lang = Dir.glob("*").map {|l| l.match(/../)[0] }

lang.each do |l|
    Article.class_eval { scope l, -> {where(lang: l)}}
end 
```

逆にわかりにくいですね（笑）



おわり

メリークリスマス:snowman:
Seleniumでログインを含めてWebスクレイピングしてみた

## この記事は
Webでログインが必要なスクレイピングを簡単に紹介する。


## 環境
Centos 7.5.1804
ChromeDriver 2.35
Python 3.6.3

## 環境構築
ChromeDriverのインストールをよくまとめたところ
https://qiita.com/yuki-k/items/716bd05f087fc0f835bf

python seleniumインストール
https://selenium-python.readthedocs.io/installation.html

## 使用例
facebookにログインして鐘アイコンのHTMLを取得する。
![login.png](https://qiita-image-store.s3.amazonaws.com/0/247584/88098900-28e1-9b76-023d-83ed40f6ccab.png)

### facebookログインに使うHTML elementの属性を確認
ログインに使うEmailのinput element(`name="email"`)
![email.png](https://qiita-image-store.s3.amazonaws.com/0/247584/2b103da1-58b9-9827-cd84-13b8ddfe913e.png)

暗証番号に使うinput element(`name="pass"`)
![pass.png](https://qiita-image-store.s3.amazonaws.com/0/247584/6c37d745-cf5d-fed9-fc3b-05c4a63d6296.png)

ログインを実行に使うlabel element(`id="loginbutton"`)
![loginBtn.png](https://qiita-image-store.s3.amazonaws.com/0/247584/c2953dd3-47d3-3c5f-8986-63280c4c93c6.png)

### python全体コード
```
# coding: utf-8

import sys

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

if __name__ == "__main__":
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(executable_path='/chromedriverが/ある/パスを/書く', chrome_options=chrome_options)
    
    print('ログイン中')
    driver.get('https://www.facebook.com/')
    driver.find_element_by_name('email').send_keys('facebookログインemailを書く')
    driver.find_element_by_name('pass').send_keys('暗証番号を書く')
    driver.find_element_by_id('loginbutton').click()
    html = driver.find_element_by_name('notifications').get_attribute('outerHTML')
    print(html)
```

### コード説明
facebookログインページにアクセス

```
driver.get('https://www.facebook.com/')
```
HTMLのname属性がemailであるところに使用するメールをセットする

```
driver.find_element_by_name('email').send_keys('facebookログインemailを書く')
```
HTMLのname属性がpassであるところにメールの暗証番号をセットする

```
    driver.find_element_by_name('pass').send_keys('暗証番号を書く')
```
HTMLのid属性がloginbuttonであるところをclickする

```
driver.find_element_by_id('loginbutton').click()
```

HTMLのname属性がnotificationsであるところのHTMLを取得

```
html = driver.find_element_by_name('notifications').get_attribute('outerHTML')
print(html)
```

HTMLを取得したところの`print(html)`の結果
![login_console.png](https://qiita-image-store.s3.amazonaws.com/0/247584/0068515b-775c-7ec7-54f4-fa272f2a07d7.png)

### 以上
マイクロフロントエンドを調査した話

[Fringe81 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/fringe81)の24日目、本日はクリスマスイブですね！

秋に調査していたマイクロフロントエンド(Micro frontends)について書きます。

# マイクロフロントエンドとは
[[翻訳記事]マイクロフロントエンド マイクロサービスのフロントエンドへの応用](https://micro-frontends-japanese.org/)でサンプルアプリケーションを交えて詳しく書かれています。
詳細はそちらに任せて、ここでは僕が大事だと思ったポイントだけ述べます。

## マイクロサービスをフロントエンドまで拡張した考え方
近年SPAによって、フロントエンドとサーバサイドを切り分けて開発できるようになりました。
しかしプロダクトが成長すると分離したアプリケーションも肥大化し複雑化します。
そうすると、品質を担保したり生産性を上げることが困難になってきます。
分離してもしなくても抱える問題は変わらないですね。
そんな中でサーバサイドではマイクロサービスの考えで解決するのが、一つの手段として広まりつつあります。
勉強会やカンファレンス等に行っても、実際にマイクロサービスの事例が増えてきている実感があります。

一方フロントエンドではどうでしょうか？
SPAをどう実現するかのFWの話は多いのですが、設計論的なところの話はちょっと寂しいですね。
肥大化し複雑化するフロントエンドアプリケーションを解決する一つの可能性として考えられているのが、マイクロフロントエンドです。

マイクロフロントエンドは、__マイクロサービスで切り分けした各々のサービスに対してフロントエンド、つまりUIも含めてしまおうという考え方__です。
つまり、マイクロサービス化して構成した各チームにフロントも含めることになります。
モノリシックなSPAがサービス毎の部品の集合体になりそうな感じがしてきませんか？

## 技術的側面
SPAがサービス毎の部品の集合体になるということは、どのように実現することになるのかを考えていきます。

マイクロサービスではサービス毎に切り出すことができると各サービスは疎結合になるため、IFさえ揃えておけば中の実現技術は何でも良くなります。
あるサービスではGolangを使ったり、別のサービスではScalaを使ったり。IFだけはRESTやGraphQL等で揃えます。

マイクロフロントエンドも同様なことが実現できます。それが出来ないと魅力半減ですからね。
マイクロフロントエンドでは__Custom Elements__をIFとして使い、実装技術を隠蔽化してしまいます。
__DOM is API__と考えられているようです。

これにより、例えば以下のようにすることができます。

- AチームではReact
- BチームではElm
- CチームではElm

各チームが開発したアプリケーションを、Custom Elementsで統合して1つのアプリケーションにするという感じになります。
ここではCustom Elementsの詳細については触れませんので、知りたい方は別途調べてください。

各チームが独立しているため実装技術の分離ができます。疎結合ってやつです。
例ではBチーム・CチームがElmで同じ技術を使っていますが、疎結合を保つためにコードの共有もNGと考えられています。
もちろん状態もです。あくまで疎結合に拘ります。
こうなっていれば、各チームは実装技術を独立して選ぶことができるし、独立してデプロイも可能な感じがしてきますね。

このあたりの話が、最初に挙げた__[翻訳記事]マイクロフロントエンド マイクロサービスのフロントエンドへの応用__の中の[マイクロフロントエンドの根底にある考え](https://micro-frontends-japanese.org/#%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%81%AE%E6%A0%B9%E5%BA%95%E3%81%AB%E3%81%82%E3%82%8B%E8%80%83%E3%81%88)に書いてあります。

# なぜマイクロフロントエンドを調査したのか
ここでそもそもなぜマイクロフロントエンドを調査したのかを書いていきます。

調査の理由は、__プロダクトが成長してきてアプリケーションが肥大化し複雑化しつつある中で、品質を担保したり生産性を上げるための打ち手がないか__です。
これだけだとちょっとバクっとしているのでもうちょっと具体的なモノに落とてみます。
モノリシックなアプリケーションであるという前提での話です。

- 歪みが生まれないようにレビュー頑張る
- どうしても歪になってしまうところを、時間かけて頑張って最適解を探してしまう
- 人数増えるとレビュアーのレビュー負荷が増える
- 新規JOINしてきた開発者にも初めからそれなりの実装品質を求めてしまう
- ライブラリアップデートがアプリケーション全体になってしまって、影響範囲調査やリグレッションテストでコストかかる

プロダクトの規模が大きくなったときにありえそうなことだと思います。
成長しているプロダクトはやっぱりスピード感ある価値提供が大事です。
上記に対して打ち手を考えておかないと、品質のためにスピード感が失われる可能性があり、スピード感のために品質が失われていく可能性があります。
どちらも頑張ってやりきれず、結局巨大な泥団子ができてしまったなんてのはやりたくないですよね。

フロントエンドでも品質を各チームで担保できる仕組みがないかを探していました。
そういう仕組があれば、例えばあるチームの実装が腐ってきてどうにもならなくなったので作り直しします！となっても、モノリシックなアプリケーションよりもイージーにできそうな感じがしますよね。

# マイクロフロントエンドは導入できるのか？
私見ですが、マイクロフロントエンドを導入するのには以下が必要だと考えています。

__特定の領域やミッションに特化したチーム構成になっているか、またはチーム構成にすることができるか__

上記ができるのは、ある程度のドメインが見えていて開発の人数規模もそれなりの数になっていないと難しいと思います。
新規プロダクトや発展途上のプロダクトでは、ドメインが定まっていないと思うのでチーム化は難しそうです。
技術ドリブンで選定してしまった場合には、チームと実装にズレが発生した時の軌道修正が大変そうです。
少数の場合には、複数のチームにエンジニアは所属することになりチーム間で共通実装が使えないとかは辛そうです。

ある程度の規模感になった時に少しづつ剥がして適用していくのが良さそうな感じがしています。
その時のために、疎結合と高凝集を意識した作りにしておくことは大事ですね。

# まとめ
マイクロフロントエンドはまだ試行錯誤の段階で実績も多くはありませんが、肥大化・複雑化していくアプリケーションに対する一つの手段になる可能性があります。
興味を持った方はぜひ最初に挙げたリンク先でサンプルコードも見てください！

フロントエンドの世界では今後、設計・アーキテクチャなところが活発化していくんじゃないかと考えています。
HTMLって最初はエンジニアが書いた方が良い気がしてきた

#前置き
今年はいろいろと地獄だったので、「将来のエンジニアを助けたい」がテーマになりつつあります。
新規の機会があったら運用保守をしっかり考えて構築しようと強く誓いました(震え

#経緯
去年の記事ではCSSもいけるようになったよ！くらいのノリでしたが

[CSSをプログラム風に解釈したらアレルギーが治ってきた話](https://qiita.com/dq-ny/items/0bd5e0ccc3a4a14d1336)

今年は改修案件多く、その中でも自力で既存の諸々をレスポンシブに記述しなければならない事があり、
・marginとpaddingの使い方おかしくね？
・これはインラインに書くなよ…
・この安易absoluteが！！！
・階層構造変更によるstyle崩れ乙
などなど問題が大発生＼(^o^)／
だいぶ鍛えられました…
今では、これをこんな感じにレスポンシブで表示したい！というは自力でモーマンタイな感じです。
(SEOに強い記述とかはいまいちまだ分かってないですけどネ)

#本題
そんな中で苦労した事といえば、フロントサイドの制御との絡みで、元のHTMLを修正する必要にせまられるケースが多かった事です。
ざっくりと下記2ケースが大半だったように感じます。
・階層構造がフロント側の制御に適したものになっていない
　→だいたい安易absoluteが絡んでマス
・idとclassがフロント側から見た際に適切に設定されてなくて上手く制御できない
　→このclassはon・offで使いたいから別けてぇぇぇええええええ
　→直接セレクタ指定出来ねぇぇぇえええええ

そして思ったのが
「ここ動くから」とか「ここ繰り返すから」みたいな事を念頭においたうえでのコーディングってエンジニアの方が得意なのでは…？
という事です。
もちろん全てをエンジニアがやってしまうのではなく、制御に必要な最低限の枠だけを最初に作ってしまう的なイメージです。

工程のイメージとしては

ラフデザイン
↓
HTMLコーディング(場合によってはデザインとここが一緒になっている)
↓
組み込み

という流れが多いのではと思いますが、

ラフデザイン
↓
HTMLコーディング(エンジニアで動きを加味して大枠の記述)
↓
HTMLコーディング(詳細)
↓
組み込み

こうした方が手戻り少ないのではと思いました。
またエンジニアだったら、将来的にここはこうしておいた方がいいかも…みたいな事も分かったりしますしね。

#終わりに
HTMLコーディングも修正が発生した際の手戻りが半端ないので(特に改修で元がすごい事になっていた場合とか…)、あらかじめ動きを想定した階層であったりセレクタの指定が出来ていると、世界はとても平和になるのではと思います。