OmniAICreator/Qiita-1.07M huggingface dataset:
Kotlinでdata classでMyBatisをつかう

Kotlin Advent Calendar15日目の記事です。昨日は[sckmさん](https://qiita.com/sckm)の[Scratchファイルを使って気軽に実行可能なコードを保存する](http://scache.hatenablog.com/entry/2018/12/14/161749)でした！Scratchいいですね！月曜から使っていきたいと思います。

今日はKotlin + O/R MapperのMyBatisで、SQLクエリの結果をマッピングするモデルクラスをdata classにする方法について簡単にご紹介します。

KotlinのO/R MapperといえばExposedが有名ですが、SQLを直接書きたいためMyBatisを使っています。

モデルクラスなのでぜひぜひdata classにしたいですよね！
ですが、data classはイミュータブルで、コンストラクタの引数にすべてのプロパティの値を渡す必要があるため、そのままではMyBatisのモデルクラスとしては使えません。MyBatisはリフレクションを使ってモデルクラスをインスタンス化するため、引数なしのコンストラクタが必要なためです。

そこで[No-arg compiler plugin](https://kotlinlang.org/docs/reference/compiler-plugins.html)です。No-args compiler pluginは、引数なしのコンストラクタを合成してくれるプラグインです。Java/Kotinからはそのコンストラクタは使えませんが、リフレクションにより引数なしのコンストラクタが使えるようになります。アプリケーションコードからは普通のdata classとして使えるので安全です。

`build.gradle`に

```gradle
buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: "kotlin-noarg"
```

か

Grade Plugin DSLで

```gradle
plugins {
  id "org.jetbrains.kotlin.plugin.noarg" version "1.3.11"
}
```

して

```kotlin
annotation class Data
```

のようにアノテーションを定義して、そのアノテーションを`build.gradle`に追記します。

```gradle
noArg {
    annotation("com.my.annotation.Data")
}
```

そして定義したアノテーションをモデルクラスにつけるだけです。

```kotlin
import com.my.annotation.Data
@Data
data class User(
    val id: Int? = null,
    val name: String
)
```

ちなみにこのクラスのインスタンスを作り、insertするとDBで採番されたidがdata classに入ります。

```kotlin
val user = User(name = "foo")
insert(user)
user.id != null  // true, DBで採番されたidが入る!
```

イミュータブルとは、という気持ちにもなりますが、スーパー便利です。

以上です！Kotlin最高！この知見は同期のスーパーエンジニアが教えてくれました。ここで感謝の意を表します。
世界で最も偉大なコミックAPIで素晴らしい物を作る


#東京コミコンの話
いきなりですが、これを読んでる皆さんは東京コミコンに行かれましたでしょうか？
熱心なアメコミジャンキーの私も当然のごとく行ったのですが、昨今のアメコミ人気には毎年驚かされます。

特に今年のMarvelのグッズストアは、人が殺到しすぎて入場規制がかかったりして大変でした。

私のような典型的なコミックのオタクとしては、映画やグッズからコミックの方にもハマってくれないかなーと思うのですが、値段が高いことや、事前知識を必要とする部分が多くあることから、それらほどの盛り上がりを見せてないことが残念です。（それでも私がコミックを読み始めた頃に比べると大分良くなった方なんですけどね）

そんなわけで、なんとかコミックの知識を普及するためのものがないかなーと思っていたのですが、そんなところにMarvelの[ディベロッパーポータル](https://developer.marvel.com/)なるものがあり、そこで **Marvelのコミックの情報を取得できるAPI**が存在するという噂を聞きつけたので、それの使い方を紹介します。

#MarvelAPIの使い方
##1.ディベロッパーポータルを開く
先ほどの、[ディベロッパーポータル](https://developer.marvel.com/)のページを開くと、いきなり「CREATE AWESOME STUFF WITH THE WORLD'S GREATEST COMIC API (世界で最も偉大なコミックAPIで素晴らしい物を作る)」と「俺たちが世界で最も偉大なコミックを作ってるぜ！」と言い切る姿勢でウルトロンからお出迎えされます。
![スクリーンショット 2018-12-13 21.48.26.png](https://qiita-image-store.s3.amazonaws.com/0/152335/c883eb3b-fe93-b778-9685-5c1e805feded.png "スクリーンショット 2018-12-13 21.48.26.png")

GET STARTEDボタンをクリックし、次に進みます。

##2.アカウントを作る
次のページに進むと、サインインのページが出てきます。
今回はアカウントがないものとして、「Create a Marvel Insider Account」をクリックして次に進みます。
![スクリーンショット 2018-12-13 21.49.17.png](https://qiita-image-store.s3.amazonaws.com/0/152335/38fbace4-ed64-8065-73a7-f1e933abb90b.png "スクリーンショット 2018-12-13 21.49.17.png")

誕生日やメールアドレスなどの入力フォームが出てくるので、入力して登録しましょう。

##3.利用規約に同意する。
登録すると、利用規約が出てくるので、よく確認しましょう。
特に、有料アプリや、アプリ内課金をするような収益化を目的としたアプリで使用する場合は、Marvelに連絡を取る必要があることなどはよく確認しておいたほうがよさそうです。（そもそも連絡を取って許可がもらえるのだろうか・・・？）

##4.自身のDeveloperページを確認する
利用規約に同意すると、自身のページが表示されるので、Keyを確認して、実際の自分のアプリに組み込みましょう。
![スクリーンショット 2018-12-13 21.57.34.png](https://qiita-image-store.s3.amazonaws.com/0/152335/a9d05d91-c965-b579-7d67-c8ad7112455d.png "スクリーンショット 2018-12-13 21.57.34.png")

##5.APIの動作を確認する
実際のAPIの動作を確認するためのページもディベロッパーポータルに用意されています。
[Interactive Documentation](https://developer.marvel.com/docs)を開くと、実際にAPIをテストで実行できるドキュメントを確認することができます。
これは上記の登録をしなくても確認することができるので、登録なしでどういったAPIがあるかを知りたいときにでも使えます。

以下のようにAPIの一覧を確認できます。
![スクリーンショット 2018-12-13 22.12.36.png](https://qiita-image-store.s3.amazonaws.com/0/152335/736671b6-819d-f2a1-1715-9e194e6234a2.png "スクリーンショット 2018-12-13 22.12.36.png")

開くと各APIのリクエストやレスポンスの情報が記載されています。
![スクリーンショット 2018-12-13 22.12.51.png](https://qiita-image-store.s3.amazonaws.com/0/152335/17be5e48-e6b4-85a9-ecdf-b5bbc2517444.png "スクリーンショット 2018-12-13 22.12.51.png")

Try it out!ボタンをクリックすると、Response Bodyに実行した結果が表示されます。
1009610はスパイダーマンのcharacterIdです。
![スクリーンショット 2018-12-13 22.15.27.png](https://qiita-image-store.s3.amazonaws.com/0/152335/d175a7ec-5c32-6776-f70c-33b0f0a9edd0.png "スクリーンショット 2018-12-13 22.15.27.png")


こうやって、必要なAPIを探して実際のアプリに必要なものを実装していくといいと思います。

###注意
実際に使用する際には、すべてのAPIで、APIキーに加えて、タイムスタンプ(ないし、毎リクエストごとに変更される長い文字列)とハッシュ(タイムスタンプ、秘密キー、APIキーを結合してMD5化した文字列）を送る必要があります。

以下がその使用例です。

```
http://gateway.marvel.com/v1/public/comics?ts=1&apikey=1234&hash=ffd275c5130566a2916217b101f26150
```

#まとめ
・MarvelAPIなるものがある。
・なんか色々情報が取れてすごい。
・アメコミ面白いから読んでみて欲しい。
合成数列の和を求める - Sass

# お題

## 【ルール】

### 入力として正の整数 N を与えたら 4 から始まる 合成数 の数列の 1 番目から N 番目までの合計を出力してください

### N は最大で 100 とします

これに、Sassで挑みます。

# やってみた

<p data-height="265" data-theme-id="0" data-slug-hash="GPZEmb" data-default-tab="css,result" data-user="sasanquaneuf" data-pen-title="used sass add to codepen" class="codepen">See the Pen <a href="https://codepen.io/sasanquaneuf/pen/GPZEmb/">used sass add to codepen</a> by sasanquaneuf (<a href="https://codepen.io/sasanquaneuf">@sasanquaneuf</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

```html:html
<input id="textbox" onkeyup="output.className = 'n_' + textbox.value;"></input>
<div id="output"></div>
```

```sass:sass
$composite: 4

@for $i from 6 through 133
	$c: 0
	@for $j from 2 through 13
		@if $i % $j == 0
			@if $i != $j
				$c: 1
	@if $c == 1
		$composite: append($composite, $i)

$sum: 0
@for $n from 1 through 100
	$sum: $sum + nth($composite, $n)
	.n_#{$n}:after
		content: "#{$sum}"
```

# 感想

本当は、cssで合成数がだんだん透明になって、seleniumとかでだんだん透明になった数たちを画像として保存して、それをOCRかけて読めた数字を足して計算する、みたいなことをしたかった。
時間があまりになくて、こんなしょぼい結果になってしまったので、ちょっと申し訳ない感じですね。。。

ただ、Sassの勉強にはなりました！（ちょっとしたのは書いたことあるけど、変数や関数をある程度使って書いたのは今日が初めて）
Tableauで使用可能なオンラインストレージのファイルをLinuxから更新する

仕事上、とあるサイトから毎日エクセルファイルをダウンロードしてTableauのデータソースとして使用しなければならなくなりました。
すんなり行けると思ったのですが、いろいろ苦労したので共有したいと思います。

Tableauだけでできないかとおもいましたが、どうやらできない様子。Tableau Desktopで抽出ファイルの更新をサポートしていますが、Windowsです。バッチファイル作ってスケジューラ登録して、24時間365日動かすことはしたくありません。。。
そして、Tableau ServerもWindows Serverです。ここでもやりたくないです。
tabcmdはLinux上で動作させることができますが、tabcmdでは更新スケジュールを動かすことはできてもローカルファイルから抽出更新してパブリッシュができないようです。(もしできるようなら教えてください)

ということで、長い旅の始まりになります...

最初は、AWSのS3にファイルを保存してAthena経由でTableauに入れてやれば楽ちん！とおもって試してみたのですが、思った通りにできませんでした。
やったことは、xlsx2csvでcsvファイルに変換してS3に保存してからAthenaでデータセットを作成したのですが、データセル内に改行された項目があったため、これは正式にサポートしておらず前処理が必要になるということで面倒なので却下。

そこで、Tableauはオンラインストレージを複数サポートしています。
対応しているオンラインストレージは、Box, Dropbox, Googleスプレッドシート, OneDriveです。
これらを使用するのであればわざわざcsvファイルに変換する必要がありません。
BOXは、Linux環境のコマンドラインツールがそろっていないのと、webdav経由でマウントして使えるのですが、これが2019年にはサポートされなくなるので継続的に利用できないので却下。
DropBoxは基本同期になるのでそれはしたくないので却下
OneDriveですが、https://github.com/skilion/onedrive でとりあえずできそうな雰囲気でした。
ところが、任意フォルダーでの同期をかけると、<ファイル名>-<ホスト名>.xlsxとなってどんどんファイルが増えていきます。
https://github.com/skilion/onedrive/issues/338
の問題で、https://github.com/abraunegg/onedrive を使用しても結局は同じ結果になり、却下。

ということで、最後の頼みの綱。Googleスプレッドシートです。
google driveを使えるようにすればよいので、https://centossrv.com/gdrive.shtml を参考にgdrive を入れました。
gdrive upload だけで行けるだろうと思ったら、File IDが異なる同じファイル名が大量生産されました。だめなんですね。。。
そして、一旦ファイルを消してuploadする方法をとりました。これで行けるだろうとおもったら、こんどはTableau Server側から抽出失敗のメールが。
そう、TableauのデータセットもFile IDを見ているようでファイルがなくなった状態になってしまいました。
ということで最終的に落ち着いたのは、
gdrive update <ファイルID> <更新するファイル名>
で、無事更新されるようになりました。

tabcmdですべてできれば何の問題もなかったのに...
dev.to が β 版ダークモード(Night Mode)を公開し始めたようだ

## はじめに

表示速度が爆速で有名なプログラマ向け記事投稿サイト、[dev.to](https://dev.to/)。

その[dev.to](https://dev.to/) が **β 版ダークモード(Night Mode)を公開し始めたようです。** 

簡単に内容を紹介していきます。

## tl;dr

[dev.to](https://dev.to/) にアクセスした後、おもむろに Webブラウザの開発者ツールを開き、Console から以下のコマンドを実行しましょう。

```javascript
document.body.className = 'night-theme';
```

するとこの状態から…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/d7ededb2-e335-5242-11c7-998befd4b21e.png)


**ダークモードに変貌します！！！**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/9a1f9777-050c-bcb1-d189-abf9922036c8.png)


直接 DOM の body class をいじって切り替えるあたり、β版っぽさというか隠しコマンド感があって良いですね…！

## 詳細について

以下の記事で紹介されていました。簡単に内容を要約します。

[Previewing dev.to's Upcoming Night Mode - DEV Community 👩‍💻👨‍💻](https://dev.to/somedood/previewing-devtos-upcoming-night-mode-44j)

* Night Mode はかねてよりあった要望だ
* ずっと backlog の issue に残っていたが、[@rkichenama](https://dev.to/rkichenama) の [PR](https://github.com/thepracticaldev/dev.to/pull/1104) によって動き始めた
* 残念ながら、CSS スタイル自体は未完成。単純に色を反転しただけの状態で、画像もグレースケールになってしまう状態
* しかし、何もない状態よりはずっと良い。Night Mode が利用できるようになったことを嬉しく思う
* 現在テストできないわけではない。β版 Night Mode として、ここから、今すぐにテストすることが可能だ！

すでにこの記事上でも[PR](https://github.com/thepracticaldev/dev.to/pull/1104)上でも、フィードバックが多数飛んでいます…！

## 終わりに

Contributer がダークモードの PR を出し、未完成でも β版として公開していく dev.to チーム。アップデートの勢いを感じますね。

実際にダークモードを試してみてフィードバックを出してみるのも良いかも知れませんね。
Docker for WindowsでVolume相対パス指定

参考
[Volume相対パス指定でもdocker runがしたい！](https://qiita.com/KentoDodo/items/24117025924d64998110)

参考先の相対パス指定をWindowsでやりたい

>なお、万が一、環境変数$PWDが設定されていないOS上で実行する場合は、上述の$PWDを$(pwd)に置き換えてください。

Windowsだと$(pwd)でもダメすよね

```
$ docker run -it -v %CD%¥temp:/temp original_ubuntu
```

%CD%でいけました
作成中のbaserCMS用メールプラグインの紹介

[baserCMS Advent Calendar 2018](https://adventar.org/calendars/3481) 参加記事です。

今日は作成中のbaserCMS用のメールプラグインを紹介します。

このプラグインは数ヶ月前に作成を開始していたのですが、ここ最近開発できておらず、このままだといつまでたっても完成しそうになかったので自分にプレッシャーをかける意味で今回記事にしました。

個人的にメールプラグインにあると嬉しい機能を実装しているので特徴を紹介します。

## 1. 入力フォームのカスタマイズ性が高く、管理画面でHTMLを設定できる
<img src="https://qiita-image-store.s3.amazonaws.com/0/326577/8547424e-896a-b59c-60ec-a056154ff203.png" width="500">

↓ こうなります

<img src="https://qiita-image-store.s3.amazonaws.com/0/326577/15c886ed-19e8-3d53-7ad7-42f457d92614.png" width="500">

- ひとつのテキストボックスに入力した内容がそのままメールフォームになります。

## 2. メールフィールドに対して柔軟なルール設定をおこなえる

<img src="https://qiita-image-store.s3.amazonaws.com/0/326577/d2ef4449-c276-07bf-d0cc-2db86ec3d447.png" width="500">

 - フィールド一つ一つに対して、変換やバリデーション処理を設定できます。
 - 今は変換処理の中にURLエンコードなど、必要なさそうな処理も混じっているので項目は変更予定です。

## 3. AJAX送信なので置く場所を選ばない
- 送信ボタンを押した時点で画面遷移なくメールが送信されます。
- 固定ページやブログ記事内など好きな箇所にメールを設置できます。


他にも連続送信制限や送信者情報の閲覧機能など便利な機能を実装しています。

完成したら[baserマーケット](https://market.basercms.net/)や[GitHub](https://github.com/seto1)で公開するのでお楽しみに!

---
2019/2/9 [GitHub](https://github.com/seto1/CraftForm)で公開しました。
TV番組表を取得してみたい

私は小さい頃からテレビが大好きでした。
今でも朝起きればテレビを付ける、、
特に真剣に見ていなくてもテレビは点ける、、
というテレビっ子です。

とう事で、TV番組表をAPIとかで取得出来ないのかなと思い調べて見ました。
※勿論無料で（笑）

## NHKのAPI

アカウントを作成すれば1日の上限回数はありますが、無料で利用出来るようです。

https://api-portal.nhk.or.jp/

## 日テレのAPI

日テレのアプリ用APIで、番組情報等のコンテンツが取得出来るようです。

こちらも会員になれば、日テレの番組情報は取得出来るかもしれません。

http://www.ntv.co.jp/mobile/

実は現在利用出来そうなAPIはこれしか見付からなかったので、
他の手段が無いか調べて見ました。
※ 後、各テレビ局の番組情報が知りたいというのもありますし。

## RubyのGem

nowtvというRubyのGemを発見しました。

https://github.com/dtan4/nowtv

ただ、こちらは現在利用出来ないようです。

と私の検索能力と根気では、ここまでしか発見出来なかったので、
他のエントリーの方が沢山記載されている
TV番組表のHPからスクレイピングする方法が手っ取り早いという結果になりました。

↓超雑なプログラム作成(python)

```python:tvnow.py
import requests
from html.parser import HTMLParser

class Parser(HTMLParser):

    def __init__(self):
        HTMLParser.__init__(self)
        self.start = False

    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        if tag == 'dl' \
           and "class" in attrs \
           and attrs['class'].startswith('table-chanel'):

            print("~~~~~~~~~~~~~~~~~~~~~~~")
            self.start = True

    def handle_endtag(self, tag):
        if tag == 'dl':
            self.start = False

    def handle_data(self, data):
        if self.start and len(data.strip()) > 0:
            print(data)

def main():
    r = requests.get('https://tvtopic.goo.ne.jp')
    parser = Parser()
    parser.feed(r.text)
    parser.close()

if __name__ == '__main__':
    main()
```

う〜ん、、、
単純に現在放送中のTV番組を標準出力しているだけですが、
まぁ取得は出来ましたと・・

という事で、TV番組表は素直にHP見るか、
TVのEPG見て確認がベストですね。
※昔は新聞かテレビジョン(雑誌)でしたが（笑）
[cocoa][swift]Cocoa.swift のご紹介！

<p>Cocoa勉強会 関東はアクティブでなくなりました。<br />
そこで有志で始めたのが、Cocoa Studyです。<br />
<a href="https://cocoa-study.connpass.com">Cocoa Studyのconnpassページ</a></p>

<p>当初は、MLとFacebookで募集した小規模な活動で、最初は渋谷の電源カフェで。この電源カフェが入居していたビルが壊されるということになって無くなったので、池袋でFORESTというコワーキングスペースを見つけて活動するようになりました。<br />
さらに共同で運営されている方が他の地域でも開催したいということになり、松戸でも開催するようになりました。<br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 関東のconnpassページ</a></p>

<p>また、少し遅れて組織的に変わろうとしていてNPO法人MOSAへの参加のお誘いがあり、何かイベントをやって欲しいということになって、定期的にMOSA関係者が集まれる場をということで、MOSA自習室を始めました。<br />
<a href="https://mosa.connpass.com">MOSAのconnpassページ</a></p>

<p>その結果、月に池袋と松戸で勉強会。それとMOSA自習室と三つのイベントを運営することになってしまいました。<br />
そして、団体がCocoa勉強会とMOSA。場所が池袋と松戸。勉強会とMOSA自習室では内容も変えようとしたのですが、運営者と参加者が同じということもあり、同じ内容となってしまいました。<br />
さらに、参加者にとって、団体が異なったり、名称が異なるなんて、どうでもよくて気にしていないということなので、どうしたものかということになってしまいました。</p>

<p>そこで、名称が意味不明だったのをAKIBA.swiftさんと合同で勉強会を開催することになったタイミングで BUKURO.swift と変更することにしました。<br />
ただ、池袋以外で開催していという意見もあって、そちらは、関東.swift 勉強会と名乗ることになりました。<br />
まだ、混乱は続いていますね。</p>

<p>今年になって、MOSAはNPO法人を解散して、任意団体に戻りました。<br />
任意団体になったタイミングでThe Bash in Tokyoというイベントを行ったのですが、その際に勉強会メンバーから、交流会でなく、勉強会をやりたいという希望をもらったのと、アクティブでなくなった団体の名前を継承しなくてもということになり、新たな出発ということで名称を Cocos.swift に変更しました。<br />
今回は一本化できました。</p>

<p>活動内容は、現在のアプリケーション・プログラミング業界の状況を反映した内容にしています。でも、勉強会であるとうことはハッキリと説明するようにしました。</p>

# Cocoa.swift について
<ul>
<li>ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催してます。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>プログラムに関する知識や経験を共有を目的としています。</li>
<li>会の活動内容や発表資料、サンプルコードは公開を前提としています。</li>
</ul>

# 発表者へのお願い
<ul>
<li>発表を希望される方は申し込み時のconnpassアンケートでお申し込みください。</li>
<li>事前に資料のリンクをconnpassに登録していただけますと嬉しいです!</li>
</ul>

<p>会員管理しない。会費を徴収しない。ということから、会場はコワーキングスペースで場所代を各自支払うという形態にしています。</p>

<p>先生と生徒という形でなく、各自が勉強したことを伝えあうという形式となっています</p>

<p>次回は来年1月に開催されますので、興味を持たれた方は是非！<br />
池袋でお待ちしています！</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/111294/">Cocoa.swift 2019-01</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
大規模機械学習の話

# はじめに
いちおう，機械学習の分野に関する内容です．
そして，完全に備忘用になってます．

# 大規模機械学習
英語ではLarge scale machine learningとなる．
大量の学習データを使ってバッチ学習させようとすると，計算量がとんでもないことになる．併せて，学習データ自体がメモリに展開できないということもある．

# 計算処理に工夫

```math
\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
```
これは，回帰モデルを勾配降下法を使って，パラメータ$\theta_j$を更新させる式である．
$m$の値が，400,000,000や1,000,000,000などの学習データを用意していた場合，そのまま計算するのは現実的ではない．そこで一工夫を加える．
注目するのは$\sum$の部分である．この合計処理は，結果的にすべての数値を足せば良いのだから，分割して部分的に合計を出して，そのあとに最終結果を出しても同じになる．そうすれば，並列処理の話に持ち込めるようになる．
かりに，$m = 400$とおいて4つに分割すると，

```math
\begin{align}
&\sum_{i=1}^{400}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} \\
= &\sum_{i=1}^{100}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} + \sum_{i=101}^{200}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} \\
&+ \sum_{i=201}^{300}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} + \sum_{i=301}^{400}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} \\
\end{align}
```

という風になる．分割した部分を別々のPCで計算させて，その結果を1台のPCに集めて，最終結果を求める．こうすることで，$\sum$の部分の計算時間を4分の1に減らすことが出来る．

単一PCでゴリゴリ計算させる方法と分散して計算させる方法のイメージはこんな感じだろう．
![単一コンピュータでの学習.png](https://qiita-image-store.s3.amazonaws.com/0/165030/381ce47c-6e1b-cc01-af05-d1ef36128941.png)
![複数台コンピュータでの学習.png](https://qiita-image-store.s3.amazonaws.com/0/165030/ee7c786e-c22c-1ee4-6a74-5055644924db.png)

これは，Map-Reduceのアイディアでもある．
このやり方は，1台のPCでマルチコアを使った並列プログラミングで実現することも可能である．しかし，マルチコアで計算させる実装はライブラリ内ですでに実装されていることもあるため，確認が必要とのこと．

# まとめ
大量データを使って学習させようとするとき，$\sum$など計算自体が分割できるものがあれば，工夫して複数台で計算させるというMap-Reduceの方法がある．（これを実装しているフレームワークはHadoopが有名なのかな？）
複数台に分散させるときは通信のオーバーヘッドがあるため，単純にN分の1にならないことが多い．また，1台でマルチコアを利用する場合でも，使用言語のライブラリですでに実装されいるか確認しておく必要がある．
Django でデータベースを sqlite3 から MariaDB に切り替える

sqlite3 をデータベースとして使っている既存の Dejango プロジェクトのデータベースを MariaDB に切り替える方法です。

サンプルとして次のものを使いました。
[django-csv-sample](https://github.com/naritotakizawa/django-csv-sample)

1) まずは、クローンします。

```bash
git clone https://github.com/naritotakizawa/django-csv-sample
```

2) db.sqlite3 を削除します。

```bash
cd django-csv-sample/
rm db.sqlite3
```

3) MariaDB に ユーザーとデータベースを用意します。

>user: django
>password: tiger123
>データベース: project_csv

4) project/settings.py を編集

```py:project/settings.py
（省略）
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'project_csv',
        'USER': 'django',
        'PASSWORD': 'tiger123',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
                'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
                },
    }
}
（省略）
```

5) migrate

```bash
python manage.py migrate
```

6) 開発サーバーを起動

```bash
python manage.py runserver
```

7) ブラウザーで http://127.0.0.1:8000/ にアクセス

8) 例えば次のファイルをインポート

```csv:in01.csv
102,おはようございます
103,こんにちは
104,こんばんは
105,さようなら
106,さようなら
```

このソフトの問題として、
>行数の長いcsv の後に、行数の短いcsv をインポートすると、
元のファイルに上書きという形で表示されます。

9) データベースの設定を確認する方法

```text
$ python3 manage.py shell
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.conf import settings
>>> print(settings.DATABASES)
{'default': {'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_csv', 'USER': 'django', 'PASSWORD': 'tiger123', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"}, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'NAME': None, 'MIRROR': None}}}
>>> 
```
液晶ディスプレイを自分で修理した…い

## 概要

昨日、ジャンクで買ったディスプレイが届きました。

買ったディスプレイはこちら。

>【中古液晶モニタ】【22インチワイド光沢液晶】FUJITSU VL-22WM1D/1680×1050（WSXGA+）+ステレオスピーカー搭載/アナログ＆デジタル・２入力系統対応 
VL-22WM1D 
http://amzn.asia/d/aZbWrUL

通電確認のみしているとのことでしたが、届いて症状を見てみると

**1. 電源を付ける**
**2. 2 - 3分くらいはちゃんと映った後、突然ブツッと切れる**
**3. その後電源を落として再度起動しても一瞬だけ映った後すぐに消える**
**4. 何回か3. を繰り返してると何回かに一回は2-3分だけ映るようになる、でもすぐ消える**

<br>
**、、、ぶっ壊れとる。これじゃ使い物にならん！！！**
（まぁそもそもジャンクだし賭けみたいなところありましたが）

ということで、今回もまたハードウェア方面で記事書きます。

理由は以下の通りです。

* 状況整理のため
* ジャンクで通電確認だけしてるディスプレイはこういう問題があるかもしれんやでって共有のため
* 解決策教えてほしいっす、、、

<font color="red">※ハードウェア方面に関してはド素人が書いた記事です。ご容赦ください！！</font>

## 具体的な問題点の洗い出し

今わかっているのはこんなところ。

* 接続ケーブル及び接続PCなどが正常に起動しているかの確認はできているため、問題がディスプレイにあること。
* 起動時に後ろから光を当ててみたりしたが画面に表示はされなかったため、バックライトの問題ではない。

ということで、とりあえず具体的にどこが悪いのか？がわからないので、ちょっと開けていきます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/257767/172a376b-1edd-a1ee-1824-ef95b31443e7.jpeg" width="70%">

なんか写真反対ですな、まぁいいや

足場がとりあえず邪魔なんで外します。

足外すのは工具なしで行けました(^▽^)/

なんからくちんに終わる予感（いやそれを予感するのはまだ早いわ）

![2018-12-15 08.41.14.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/b23beda2-2db7-e062-34c3-c20e98b27744.jpeg)

ほいで、足場に近いほうに8個ネジがあるので全部外して、カバーを外します。

![2018-12-15 08.47.05.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/e9b7d529-1721-c794-d177-322822b65b88.jpeg)

**でーん。**

いや、今のところ前やったiPhoneの分解より全然単純ですぞ！！！

あ、ちなみに前の記事はこれです。

>【iPhone7】フロントパネル交換自分でやってみた(1) ～フロントパネル外す編～ 
>https://qiita.com/banana5388/items/00a2b5f03c2991a171dc

で、とりあえず基盤に接続されてるケーブルを全部外して

![2018-12-15 08.50.16.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/9c85948b-0204-37d8-7fd3-54b51be24bec.jpeg)

VGAとDVIのコネクタのネジ外して

![2018-12-15 08.53.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/efdd95b5-5af5-2582-65b1-41d4e57bd62d.jpeg)

**基盤外れました～**

![2018-12-15 08.56.12.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/145ef8bf-f09a-f600-9c28-c6020752f55d.jpeg)

で、こっからが本題。

ネットで探していた記事だとコンデンサとかインバーターの不良でこういったことになるみたいなことが書かれていたんですが

見た感じ大丈夫そうですねぇ、、、見た感じだとわからないのかな？

ひっくり返してこれが裏側。

![2018-12-15 08.56.39.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/1cca0531-25fe-5573-4893-9b7573827ad3.jpeg)

きったねぇすね毛映ってますねごめんなさい！！！

裏側を見る前に疑っていたのは、はんだが黒ずんでるとか、なんか浮いてるとか、そういうところ。

でも見た感じなさそう…うーん？

### ただ、ちょっとだけあやしいところがある。

**それがこちら。**

![2018-12-15 09.31.32.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/b6dad1ba-7004-3e44-c4de-61fe2c5373b3.jpeg)

なんかモニタを起動するとここから変な音がして消えてるんですよね。

起動すると「ぶぉーん、、、」で消えるときに「プツッ」っていって消えています。

まぁ本当にここが問題かって言われると微妙なんですが。

## とりあえず、結論

このサイトによると、なんかケーブルとかにも問題ありみたいなことも書かれていたり。

https://net-shitsuji.jp/pc/repair/contents/chart.html

>3.画面が突然消える

>モニタと本体を接続しているケーブルを取り替えてみてください。改善しなければモニタそのものの故障の可能性があります。

ケーブルも一応見てみましたが、問題があるかどうかの切り分けが難しい。

![2018-12-15 10.24.02.jpg](https://qiita-image-store.s3.amazonaws.com/0/257767/228113ea-ef40-403d-58c2-6320d0b04e72.jpeg)

見た感じ悪いところはなさそうでした。

うん、、、

ひとまず、**今日秋葉原にでも行ってまた使えそうなジャンクディスプレイでも漁るかなーって感じです**←おい

根本解決はしてないので、周りの知識人に聞いて解決したらまた更新したいなって思います！

ではまたー。
Spring BootのExceptionHandlerでExceptionがthrowされたControllerのMethodが知りたい

# 1. やりたいこと

- ExceptionHandlerで例外処理を設定する
- どのControllerのどのMethodで例外が発生したかを知る

# 2. バージョンや条件など

- Java 11
- Spring Boot 2.1.1.RELEASE

# 3. やったこと

- ExceptionHandlerアノテーションを付けたメソッドのパラメータに`HandlerMethod handlerMethod`を追加する

```java:MyExceptionHandler.java

@ExceptionHandler(MyException.class)
public ResponseEntity<String> myExceptionHandler(
    MyException exception,
    HandlerMethod handlerMethod) {

    // 省略
}
```
- HandlerMethodについては [Javadoc](https://docs.spring.io/autorepo/docs/spring/5.1.3.RELEASE/javadoc-api/org/springframework/web/method/HandlerMethod.html) を参照
- `getMethod()`や`getMethodAnnotation(java.lang.Class<A> annotationType)`が使えそう

# 4. ドキュメント

- [Spring Docs - 1.3.6. Exceptions > Method Arguments](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/web.html#mvc-ann-exceptionhandler-args)
- [Javadoc - org.springframework.web.bind.annotation.ExceptionHandler](https://docs.spring.io/spring-framework/docs/5.1.3.RELEASE/javadoc-api/org/springframework/web/bind/annotation/ExceptionHandler.html)
- Spring Docsに書いてあった。Javadocには書いてなかった。`Principal`とかも書いてないね。

おわり。
Angularを使った業務アプリの環境


#はじめに
Angularで業務用Webアプリを構築していますが、各種Tipsを自分用としてまとめていきます。
ちなみに私は社内SEでWebアプリのプログラマーではありませんので、プロから見ると拙い部分もあろうかと思いますが、そこは目をつぶっていただけると幸いです(笑)

###環境
既存システムのリソースを活かして、最小限のコストで行うことを目指しました。

|名称|用途|備考|
|:---------------------|:-----------|:----------------------------|
|[Angular6](https://angular.io/) |フレームワーク|TypeScriptはC#に似ているので<br>学習コストが高くなかったのと、<br>フルスタックであることを評価して採用|
|[Angular Material](https://material.angular.io/) |UI・UXライブラリ|無料で非常に便利|
|[ASP.net Core2](https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.2&tabs=visual-studio-code )|サーバーサイド|WebAPI(C#)|
|MSSQL|DB|既存のリソース(本番環境)|
|IIS|Webサーバ|既存のリソース(本番環境)|
|[WebStorm](https://www.jetbrains.com/webstorm/)|IDE|有料だが非常に便利|
|[VSCode](https://code.visualstudio.com/)|IDE|WebAPI構築で使用|
|[Docker](https://www.docker.com/)|テスト環境|テスト環境でのDB環境で使用|
|[Azure Data Studio](https://docs.microsoft.com/ja-jp/sql/azure-data-studio/what-is?view=sql-server-2017)|テストツール|DockerでMSSQL環境を構築する場合は便利(無料)|
|[Postman](https://www.getpostman.com/)|テストツール|WebAPIのテスト用ソフトウェア(無料)|
|開発用PC||会社支給のMacBook Pro<br>VMWareでWin10を搭載|

WebStormは自腹です。VSCodeは優秀ですが、有料のIDEはさすがに使いやすいです。あと、初めてDockerを使ってみました。便利なのは間違いないのですが、ローカルにテスト用MSSQL環境を構築する従来の手法と比べて、劇的に良くなったかといえばそこまでは・・・というのが率直な感想。
Angular Materialについては、これはぜひ使うべきと思いました。無料というところがいいのと、機能が豊富でこれだけでやりたいことは今のところ事足りるからです。
TipsについてはAngularMaterialとWebAPIが主になるかと思います。
【css】単位が異なる値（pxや％など）を使って、高さや幅を指定する方法

cssで、単位が違う値を用いて、高さや幅を指定する方法をご紹介します。

イメージは下図の？？？を求める感じです！
<img width="790" alt="スクリーンショット 2018-12-15 9.56.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/314351/a6a9097c-969a-6eba-df64-6a1266c90a58.png">

## calcを使おう！
関数`calc`を使うと、単位が異なる値同士で計算できます！

```
height: calc(50% - 90px));
```

## サンプルソース

```index.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>saｍple</title>
    <link rel="stylesheet" href="css/style.css" />
  </head>
  <body>
    <header></header>
    <main></main>
    <div class="box"></div>
    <footer></footer>
  </body>
</html>

```

```css/style.css

html,
body {
  overflow: hidden;
  height: 100%;
}

header {
  height: 50px;
  background-color: pink;
}
main {
  height: 50%;
  background-color: yellowgreen;
}

.box {
  height: calc(50% - 90px);
  background-color: skyblue;
}

footer {
  height: 40px;
  background-color: pink;
}


```

画面の図がこちら。わかりずらくて、すみませんｗ
![スクリーンショット 2018-12-15 10.13.03.png](https://qiita-image-store.s3.amazonaws.com/0/314351/840ff610-aca5-f9ee-c077-3890b51030b7.png)

ピンク色のヘッダーとフッターはpx指定、そして黄緑色のメインは％指定しています。

目的はdivタグ(boxクラス)の高さをbodyタグ内に収まるようにすること。`calc`を使って調整できました。

参考になれば幸いです！

## 参考URL
- [calc() - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/CSS/calc)
- [CSSで計算式を可能にするcalc()ファンクション - W3G](https://w3g.jp/blog/css3_calc_function)
Uipath Activities使い方 (随時更新)

##### Copy file
Path : コピーしたいファイルのパスを記述(フルパス推奨)
Destination : コピー出力先パス名(ファイル名まで記述する必要有り)
Overwirte : チェックをつけると上書きする
※コピー先ファイルがすでに存在する場合に、チェックをつけないとエラー(IOException)

##### dictionary
エクセルファイルからdictionaryに値を設定した際に、Valueを空で設定した場合
Valueを空のkeyを呼び出しても大丈夫。
->nullになっているのだろうか？
Djangoの使い方　2（モデルの作成（データベース設定）~Django 管理サイト(admin)の設定)

[Djangoの使い方](https://qiita.com/ha_se/items/bb1ba4af6608d69eeb61)の続編です。Django 2.1.2

### 前回までやったこと
##### Djangoのインストール、開発用サーバーの立ち上げ
##### アプリケーションの作成、簡単なビューの作成とURL対応付け

## Databaseの設定
モデルを作成するにあたって、先にデータベースの設定をしておきます。
### setting.pyで設定する

`mysite/setting.py` を開く
（setting.pyはDjangoの設定ファイル）
デフォルトではSQLiteになっている。他のDBに変更もできるが、ここで詳細は触れない。

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```

### Databaseのテーブルを作成
ターミナルから
`python manage.py migrate`
と入力する。

setting.pyのINSTALLED_APPSの設定を参照し、データベース設定に従って、Databaseのテーブルを作成しました。`db.sqlite3`などツリーが増えています。

<img width="602" alt="スクリーンショット 2018-12-18 14.10.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/178483/64c2dabf-1a10-f0b1-351b-a11e99f4b670.png">


## モデルの作成
データベースに格納するオブジェクト（属性と振る舞い）のこと。モデルの設定は作成したアプリケーション名のディレクトリの中にある`models.py`で行う。今回は、`polls/model.py`に設定を書く。

### クラスの追加
例えばpollにquestionとchoiceという2つのモデルを作成する場合、polls/model.pyにクラスを2つ追加する。

```
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
```

### パスの追加
モデルを作成したら、プロジェクトにパスを追加する。

`polls/app.py`に設定された`PollsConfig`をプロジェクトに含めるため、`mysite/setting.py`の`INSTALLED_APPS`にパスを追加する。

```
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```

`polls`だけでも問題ない。
追加した `polls.apps.PollsConfig`　は、
pollsディレクトリにあるapp.pyのなかにあるPollsConfigということ。

### モデルの有効化
設定したモデルとデータベースを有効化する。

####変更したモデルのマイグレーション作成
`python manage.py makemigrations polls`
####データベースに変更を適用
`python manage.py migrate`

## Django Admin (Django管理サイト）
### 管理ユーザーの作成
スーパーユーザーを作る
ターミナルから、`$ python manage.py createsuperuser`　と入力する。
ユーザー名、emailアドレス、パスワードを設定して、と言ってくるので、好きなのを入力する。
User: admin
email: admin@admin.com
password: admin
みたいな感じでOK。ただしパスワードが短いぞ、と怒られる（8文字以上推奨）が、設定できる。

### 管理サイトへのアクセス
もし開発サーバーを起動していなかったら、再度起動する。

```
# 開発サーバーの起動
$ python manage.py runserver

```

`http://127.0.0.1:8000/admin/` にアクセスしてログインする。

<img width="1349" alt="スクリーンショット 2018-12-14 11.44.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/178483/ab1d6442-23a8-aa08-275d-572d2ffbe755.png">

先ほど設定したスーパーユーザーのユーザー名とパスワードを入力して、管理画面に入る。

### Pollアプリをadmin上で編集可能にする
現状、管理画面でPollsアプリの編集ができないので、編集可能にするため、`polls/admin.py`の編集をする。

```
# polls/admin.py
from django.contrib import admin
# Questionのインポート
from .models import Question
# これで管理画面でQuestionの編集ができるようになる
admin.site.register(Question)
```

<img width="1399" alt="スクリーンショット 2018-12-17 11.29.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/178483/7c058ca0-ca47-135f-96cf-2cc643e78d73.png">
Django初心者の忘備録(仮想環境の構築〜Projectの作成まで)

#環境
Python 3.7.0
Django 2.1
Anaconda 4.5.4
MacBook Airを利用

#目的
Djangoチュートリアルが一通り終わったので、Django初心者である自分の復習も兼ねての忘備録。

#参考
Djangoチュートリアル(https://docs.djangoproject.com/ja/2.1/intro/tutorial01/)

#仮想環境の構築
プロジェクト用のディレクトリを作って、そこで仮想環境を構築。

```Terminal
   $ python3 -m venv 仮想環境名 
```
もしくは

```Terminal
   $ python -m venv 仮想環境名 
```
でも大丈夫。違いはpythonのバージョンを指定するかしないかだったはず。

仮想環境を構築したら以下のコマンドで仮想環境の起動。

```Terminal
   $ source activate 仮想環境名 
```
ちなみにWindowsだとactivateだけでOkみたい。

仮想環境名を忘れた場合は

```Terminal
   $ conda info -e 
```
で構築した仮想環境の確認ができる。（Anacondaインストールしている場合のみ）
#Projectの作成
```Terminal
   $ django-admin startproject Project名
```
プロジェクトを作成すると、
<pre>
- your_project_name/
    - manage.py
    - your_project_name/ 
        - _____init_____.py
        - settings.py
        - urls.py
        - wsgi.py
</pre>
上記のようなディレクトリが作成される。

projectの作成に成功したらprojectのディレクトリに移動してサーバーを起動させて動作を確認する。

```Terminal
   $ python manage.py runserver
```
とりあえずはここまで。

続き:[Django初心者の忘備録2(Applicationの作成〜Viewの作成まで)](https://qiita.com/Soichi888/items/66a337b2796eeecf9c97)
SFTPでchrootしつつ、他のアカウントを見せない方法

#SFTPでchrootしても他のアカウントが見える
chrootしているのだから他のアカウントが見えることはない。そう思ってました。しかし実際にやってみると見えてしまうのです。パーミッションの設定次第では、他のアカウントのファイルにアクセスも可能です。
SFTPのchrootの設定方法をググるとたくさんページが見つかるのですが、この問題を解決する方法を書いているブログは見つけられませんでした。今回その対策方法を見つけたので、こちらに残していきたいと思います。もし他に良い解決策がありましたらご指摘いただけると嬉しいです。

前提とする環境
CentOS 6および7。

#SFTPの困った仕様
SFTPでchrootするには、chrootするディレクトリのオーナーがroot:rootでなくてはなりません。（しかもパーミッションは755？） たとえば /home/hogehoge と /home/hugahuga という２つのユーザーにchrootしたSTFPでアクセスできるようにするには、/home をchrootするディレクトリとして指定しなければなりません。
そうすると /home 以下にはhogehogeとhugahugaという2つのディレクトリがあるので、SFTPでログインするとこの2つのフォルダが現れてしまいます。パーミッション次第ではアクセスもできてしまうんですよね。パーミッションを適切に設定すれば良い問題でもありますが、そうもいかないのが実情です。

#解決方法
SFTPでchrootしつつ、他のアカウントを見せないようにするために、ホームディレクトリを以下のように変更しました。

変更前
/home/hogehoge
/home/hugahuga

変更後
/home/chroot/hogehoge/hogehoge
/home/chroot/hugahuga/hugahuga
/home/chroot/dev

/chroot はあっても無くてもどちらでもいいです。ポイントはホームディレクトリの上の名前も同じアカウント名になっている点です。この理由は後ほど説明します。3つ目のdevはSFTPのログを取得するためのものなので、不要なら作らなくてもいいです。ホームディレクトリを移動したので、usermodコマンドでホームディレクトリの設定を変更しておきましょう。

```
# usermod -d /home/chroot/hogehoge/hogehoge hogehoge
# usermod -d /home/chroot/hugahuga/hugahuga hugahuga
```

#/etc/ssh/sshd_configの設定
/etc/ssh/sshd_config の設定は以下のように行いました。

```
# override default of no subsystems
#Subsystem	sftp	/usr/libexec/openssh/sftp-server
Subsystem	sftp	internal-sftp

Match Group ftponly
  X11Forwarding no
  AllowTcpForwarding no
  ChrootDirectory /home/chroot/%u
  ForceCommand internal-sftp -f authpriv -l info
```

この設定ではグループがftponlyの場合、SFTPのみ許可しchroot化します。ChrootDirectoryの %u はユーザー名に置き換わるので、たとえばユーザーhogehogeがログインした場合は /home/chroot/hogehoge/ がルートになります。ユーザーhugahugaなら /home/chroot/hugahuga がルートです。ルートには書き込めないので1つ下のディレクトリに移動する必要がありますが、他のアカウントを見えなくさせることは成功です。
vsftpdなんかはchrootしてもホームディレクトリがルートになるのに、なんでSFTPではこんな仕様になってるんでしょうね？

#SFTPのログを取る（CentOS 6）
sshd_configを設定しただけでは、誰がどのファイルを転送したのかといったログは取得できません。ログを記録するために /etc/rsyslog.conf に以下の行を加えます。

```
$AddUnixListenSocket    /home/chroot/dev/log
```

sshd_config のForceCommandのオプション -f authpriv -l info がログを出力するための設定で、ログが不要ならこのオプションは付けなくてかまいません。そして rsyslog.conf の設定により /home/chroot/dev の下にログを取るためのソケットが作成されます。これでsshdとrsyslogdをrestartすれば、/var/log/secure にログが出力されると思います。
CentOS 7ではこの方法ではログがとれず、よくわかりません。

参考にしたページ
[OpenSSH の Chroot 機能を利用して SFTP のログ取得してみた](http://www.kurobuti.com/blog/?p=5831)
ステーブルコインの種類法定通貨担保型、仮想通貨担保型、無担保型の性質

# ステーブルコインとは
* ボラティリティが低く、価格が法定通貨などとほぼ等しく安定する暗号資産。
* 法定通貨担保型、仮想通貨担保型、無担保型の三つの種類がある。


## 法定通貨担保型
* 法定通貨とペッグした通貨
* 価格の変動を抑えられるが、トラストレスではない
* 例 LCNEM,Tether, Petro

## 仮想通貨担保型
* 仮想通貨とペッグした通貨
* トラストレスだが価格の上昇の抑制が難しい
* 例　MakerDao

## 無担保型
* 担保を無しに価値の一定を図る通貨（シニョリッジシェア）
* トラストレスだが、価格の下降の抑制が難しい
* 例 Basis
Macで隠しファイル・フォルダを表示する方法

# Macで隠しファイル・フォルダを表示する方法

## Finderでの表示・非表示をコマンドで切り替える

```
Command + Shift + .
```

## ターミナルで非表示ファイル・フォルダを含めて全て表示する

```bash
ls -a
```
class_eval の中で定数を定義したときのスコープ

この記事は[Okinawa.rb Advent Calendar 2018](https://qiita.com/advent-calendar/2018/okinawarb)の16日目の記事です。

class_eval の中で定数を定義したときのスコープですが、オープンクラスしたときと違ってブロックの外側のスコープで定義されます。

> class_eval {|mod| ... } -> object
>  ブロックが与えられた場合には、定数とクラス変数のスコープはブロックの外側のスコープになります。
https://docs.ruby-lang.org/ja/2.5.0/method/Module/i/class_eval.html

オープンクラスの場合

```ruby
class Foo
end

class Foo
  BAR = 'baz'
end

puts Foo::BAR
```

```console
$ ruby foo.rb
baz
```

class_eval の場合

```ruby
class Foo
end

Foo.class_eval do
  BAR = 'baz'
end

puts Foo::BAR
```

Ruby 2.4 までは警告が出るものの実行できます。

```console
$ ruby foo.rb
foo.rb:8: warning: toplevel constant BAR referenced by Foo::BAR
baz
```

Ruby 2.5 以上だとエラーになります。

> Ruby 2.5.0 リリース
> トップレベルの定数検索は削除されました。[Feature #11547]
https://www.ruby-lang.org/ja/news/2017/12/25/ruby-2-5-0-released/

```console
$ ruby foo.rb
Traceback (most recent call last):
vending_machine2.rb:8:in `<main>': uninitialized constant Foo::BAR (NameError)
Did you mean?  BAR
```
JAWS-UG AI #9 にいってきた

# はじめに
おはようございます。初老インフラエンジニアです。歳を取りすぎて夜寝れなくなってきました。老化つらい。「病気か!？」ってくらい何もかも忘れてしまうので、忘れる以上のなにかを覚えるべく日々の勉強はかかせません。
ということで、まったく門外漢の [JAWS-UG AI #9](https://jawsug-ai.connpass.com/event/112218/) にいってきた報告です。

# ブレインズテクノロジー 中澤さんの Machine Learning at the IoT Edge (たぶん.)

[この講演](https://www.youtube.com/watch?v=D0XySEVBUZE&feature=youtu.be&fbclid=IwAR3goqXpWX1kH7LDlcHeXVdefnCHeNIzvY9V3pLCepjNF2RBUgDK39jn1tc)の抜粋を日本語でおこなってくれました。

工場で機械学習をつかって異常検知をする仕組みをつくったという話ですが、AWS IoT Edgeをうまくつかって、モデルのデプロイなんかを簡単におこなえる部分がポイントかとおもいます。おもしろかった話としては以下です。()内は自分の感想

- Edgeは強力なPC。(greenglass結構リソースつかうので、IoTで想像する貧弱なリソースだと結構つらい )
- 工場には異なる機能を持つ機械が沢山ある。手で調整はかなり厳しい
- 異常検知(anomaly detection)は高価な製品に対して有効。(安ければ、捨ててしまうという選択肢で十分な場合がおおい)
- 中国リージョンでIoT関連リリースされてないサービスがある
- こないだのソフトバンク障害のような大規模なネットワーク障害でも工場は止められない

前処理の話とかアノマリー検知って結構奥がふかそうで面白そうでした。この会社の製品のImpulseを買えば簡単にできるのかもしません。

# mixi 古城さんの 「ゲーム運営と機械学習」

XFLAGというブランドでゲームを提供しているmixiさん
[ファイトリーグ](https://fight-league.com/news/)というゲーム のチューニングに機械学習つかっているという話とその中で、SageMaker RLという強化学習のβサービスをつかった感想の話でした。
資料みつけられませでしたが、覚えている限りで箇条書きしていきます。

## チューニングの話

- ファイトリーグは対戦型のソシャゲ
- 不正防止のため、クライアントはUIのみでエンジンやデータは全てサーバ側にある。行動履歴もとれる
- 定期的にキャラクターが追加される。キャラクターには能力の他にスキルがあり、戦略の幅を広げている
- 戦略の幅をひろがりすぎて、想定外の戦略でゲームバランスが崩れるリスクがある
- すごい検証チームがいるが、人の限界に達している
- このリスクを機械学習で回避する
- トップレベルの人たちに近い行動を機械が行えるらしい
- 当初キャラクターをパラメータの一つとしていたが、スキルに変更した。スキルはテキストがあり、説明が比較的提携なので特徴量抽出がしやすい
- 古城さんは、インフラ+ソフトウェア開発の人で、機械学習はじめて半年くらいとのこと

うーん、肝心なことがなにもかけてない。

## SageMaker RL β
- [ここらへんの話](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-rl-managed-reinforcement-learning-with-amazon-sagemaker/)を実践したという理解 
- トップレベルの人達を超える行動をさせたい
- どんどん変わってる。コードを読んで理解する気概が必要。ベータだし仕方ない
- 自分で作ったコードの並列化が難しい

ムラサメ・フォーとか思いだしますよね(それは強化人間)。強化学習がなんだかよくわかってないのではずしてるかもです。
たのしそうに話しているのが印象的でした。

# AWS 宇都宮さんの 「機械学習系リリース re:Cap 」 

[この資料](https://www.slideshare.net/AmazonWebServicesJapan/reinvent-2018-ml)をベースにはなされていたとおもいます。

P.24 の AWS Machine Learning Service Stackが個人的にはヒットしていたのですが、slideshareだと上のほうみずらいですね。そのうち直ることを期待。

ポイントをおさえた淡々とした話し方がよかったです。初老的にはなんとなく理解できた気になれました。

# AWS SUNIL MALLYA さんの 「DeepRacer 紹介」

たぶん、ここらへんの話の抜粋です。
https://www.youtube.com/watch?v=M1U_cyAUtU8

本物のDeepRacerを駅前の100円ショップで買ってきたテープでつくった急造コースで走らせていました。
英語苦手なので勘違いしている点おおいかもですが以下抜粋の抜粋

- Deep Learningを勉強するための教材という位置付
- みた感じ  DeepRacer = TAMIYAのラジコン + Ubuntu + DeepLens
- Racerといってましたが走ってる姿はとっとこハム太郎という感じでかわいかった。
- 動作時にネズミの鳴き声のような音がするのはステッピングモーターの音。タイムスライス切ってそれ毎に出力をしているせいと理解。
- 強化学習って報酬だけあたえたら勝手に学習するんですね。謎すぎです。
- 報酬はコースにいると+。コース外が-が基本らしいが、センターラインに近いと+みたいなことも与えられるらしい。
- 入力はカメラ1系統ですが、USBもってるので増やすことは可能(っていってたきがする)
- 出力は6種類(右、左、加速、減速、、あとわすれた)。
- シミュレーション環境で学習して、実世界にモデル転送して動かすそうです。かっこいい。
- 物理環境を完全にシミュレートできないので不思議な動きをする(現状摩擦とかない)

DeepRacer、ルンバに似たかわいさがありました。画像の入力と報酬だけで動くというのが不思議というか納得できないというか複雑な感情でした。もしかして:老害?

あまり質問する人がいないのが印象的でした。まぁ、このシーズンに忘年会によばれることもなく勉強会にくる人間のコミュ障率はたかそうなので仕方ないことかもしれません。自分は言ってはいけないことを言ってしまうタイプのコミュ障なので質問はしたのですが、英語力がたりませんでした。残念でした。

# おまけ

会場入口で受付してた人のレベル高すぎな気がしました。HPCと運用の相談があれば、今度しにいこうかとおもいます。
IBM CloudでNetScalerとFortiGateを組み合わせるときの注意点

# 経緯

IBM Cloudでは負荷分散装置としてNetScaler（以下NS)を、Public VLANのファイアウォールとしてFortiGate Security Appliance（以下FSA）をオーダーすることができますが、NSの設定でかなり悩んだのと、FSAとの組み合わせで外部からの通信がNSにうまく到達できなかったので、試行錯誤の末たどり着いた対応方法をメモします。

# ここで想定する構成

アカウントのPublic VLANの前面にFSAを配置し、NSはPublic VLANのVirtual IPでトラフィックを受信し、Private VLANのサーバを負荷分散する構成です。また、NSは冗長構成です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/46079321-b4c3-b4a2-521c-6db693b6296b.png)

# FSA

FSAは事前にオーダー済とします。FSAはオーダー直後の状態で、Public VLANとのInboundとOutboundが全て許可されていますので、外部からPublic VLAN上のIPと通信が可能になっています。

# NetScaler

## オーダー

冗長構成のため1台ずつ、計2台オーダーします。オーダー時にVirtual IP用のスタティックIPを合わせてオーダーすることになりますが、2号機のスティックIPは**使いません**。なぜなら、フェイルオーバー時には1号機に指定したVirtual IP（スタティックIP）が2号機に引き継がれるからです。もったいないですがスタティックIPをオーダーしないという選択ができないのであきらめましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/9560cacc-b8c1-f9de-0d00-1a410abec629.png)

## 初期設定

High Availability構成等、初期設定をします。ググれば情報は多いのでここでは割愛します。

## Virtual Serverの作成

Virtual Serverの作成をします。一般的な部分は割愛しますが、ここでのポイントは、Virtual IPに1号機（プライマリ機）に割り当てられたスタティックIPを指定することです。

使えるスタティックIPはNSのデバイスの詳細から確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/28fd33cd-f444-4bd2-594c-cf95dac19b98.png)

ここから選んでVirtual IPとして設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/b3792f4e-1f47-1173-2dbd-35320acf5b7e.png)

## 動作確認

では早速動作確認してみましょう、と言いたいところですが、できません。先ほど指定したVirtual IPは現在Public VLANでは通信できない状態となっています。

# FSA

## ルーティング設定

通信できない原因ですが、Virtual IPとして指定したスタティックIPのルーティング先をFSAが認識できていないため、のようです。そのため、手動でルーティングを追加します。

その前に、スタティックIPの設定を確認します。ポータルのサブネット一覧から確認すると、スタティックIPは特定のIPアドレスに対して経路指定されていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/568de54e-f102-a693-4cd4-f30f35b124ef.png)

このIPアドレスをゲートウェイとして、ルーティングを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/81bdcfa0-5408-c040-df46-311ec156ea16.png)

* Destination IP/MaskはスタティックIP
* DeviceはFSAのPublic VLAN側のインターフェース（-insideという名称）
* GatewayはスタティックIPに紐づいた経路のIPアドレス

## 動作確認

はい、これで外部からVirtual IPに到達できるようになったはずです。疎通確認やNSがフェイルオーバーしても問題ないことを確認してください。

# なぜこれで動くのか

正直、うまく説明できませんし、これが唯一の解とも思っていません。IBM Cloud Infrastructureのネットワークは独特ですし、NSもかなり独特なネットワークの考え方をしています。詳しい方教えてください。
STOPボタンが出たら、なるべく瞬時に押すゲームを作りました

クソアプリアドベントカレンダー 15日目を担当します！@Yuta_Fujiwaraです。

## STOPボタンが出たら、なるべく瞬時に押すゲームを作りました

[STOP CLOCK](https://stopclock.netlify.com)
https://stopclock.netlify.com


![img.png](https://qiita-image-store.s3.amazonaws.com/0/147291/0fe98e06-ebdc-2b33-bca2-aeccd76fe062.png)

### STOP CLOCKのイメージ

![ezgif-3-75238a8e8b7b.gif](https://qiita-image-store.s3.amazonaws.com/0/147291/6a416b0f-b482-4ec0-5913-eeedbe52e10d.gif)

### TOP
<img width="1268" alt="スクリーンショット 2018-12-15 8.05.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/805c7ed0-3ff2-33c5-5210-0d3f13e4e6be.png">

### 殿堂入り画面

<img width="1275" alt="スクリーンショット 2018-12-15 8.10.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/ddbb0557-b5a8-98a2-dd7f-eb6334604b2a.png">


## STOP CLOCKの概要

個人開発が趣味で『なんとかCLOCK』というシリーズモノを作る癖があり、そのシリーズの第４弾です⏰

* 1分間に1回STOPボタンが出てくるので、そのボタンをなるべく速く押してね！
という、ゲームです。
* 速く押した人10名まではデイリーの殿堂入りとして、名前とアイコンを残すことができます。
* 参加している人数もリアルタイムでわかります。
* STOPボタンが出る前に押したらSTOPボタンが出ません（連打禁止）


自分でも作りながら何が面白いのかわからなくなってきたので、親友に見てもらったら『何が面白いの理解できない』と言われたので、これは本当のクソアプリかもしれません...。みなさんも使ってみて感想を呟いてください🙇‍♂️

## 使っている技術

STOP CLOCKは以下の技術を採用しています。

* **Netlify** - ホスティング
* **Firebase** - データストア
* **Vue.js** - フロントエンド
* **SemanticUI** - UI
* **Gitlab** - バージョン管理

### システム構成

システム構成についてはサーバレスな構成にしてみました。

![システム構成.png](https://qiita-image-store.s3.amazonaws.com/0/147291/92105e70-7aee-e600-ba71-ad90bf88990e.png)

### 新しく使ってみた技術 - Netlify

今回はホスティングに**Netlify**を使ってみました。

#### CI自動化が簡単
Gitlabとも連動しており、pushされたイベントをトリガーにして、自動でリリースしてくれるCI周りの設定もとても簡単で驚きました。

#### 無料で使える

Gitlab×Netlifyで**無料**でサービスを公開できて、しかもバージョニングもできるという、開発者に優しい世界が出来上がってますね。本当にありがたいです。

独自ドメイン、SSLなども無料で設定することができます。

#### 参考にした資料

Netlifyについては技術書店で[@nabettu](https://twitter.com/nabettu)さんが書かれた『**ゼロから始めるNetlify**』を読んで勉強させてもらいました🙏（とてもわかりやすかったです！）

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Amazonのwebサービス本に便乗して「ゼロから始めるNetlify」も値下げします！<br>git管理しているサイトがあったら速攻でサイト公開出来る便利なサービスNetlifyの、たくさんある機能をとにかく使い倒す本です。ご一緒にどうぞ！<br>webサービスもこれでサッと公開出来ます。<a href="https://t.co/xyCNz78SUW">https://t.co/xyCNz78SUW</a></p>&mdash; nabettu🍲渡邊達明 (@nabettu) <a href="https://twitter.com/nabettu/status/1061387728766418944?ref_src=twsrc%5Etfw">2018年11月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## まとめ

みなさんもSTOPボタンを押して殿堂入りを目指してみてください！
そしてツイートしていただけるとうれしいです🙏

よろしくお願いします！

[STOP CLOCK](https://stopclock.netlify.com)
https://stopclock.netlify.com
Template Method(テンプレートメソッド)パターン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/db0965ff-f01e-08f8-45fd-23d9d71433aa.png)

1つずつデザインパターンをまとめ

## 総論
パターンそのものと使い所を理解する

## Template Method(テンプレートメソッド)パターン
抽象メソッドのアルゴリズムを変更するパターン。
基底クラスに骨格となるメソッド(テンプレートメソッド)と、抽象メソッド(テンプレートメソッドにまとめられるメソッド)を定義し、具象クラスで抽象メソッドをオーバーライドすることで変更に対応するパターン。

## Template Methodのテンプレート

```super.rb
class スーパークラス

  def initialize(args)
    @args1 = args[:args1]
    @args2 = args[:args2]
  end

  def テンプレートメソッド
    抽象メソッド1
    抽象メソッド2(@args1)
    抽象メソッド3
  end

  # 例のためいくつかのパターンを定義
  def 抽象メソッド1
  end

  def 抽象メソッド2(arg)
    標準実装
  end

  def 抽象メソッド3
    raise 'Called abstract method 抽象メソッド3'
  end
end
```

```sub.rb
require './main'

class サブクラス < スーパークラス
  def 抽象メソッド1
  end

  def 抽象メソッド2(arg)
  end

  def 抽象メソッド3
    オーバーライド
  end
end
```
```main.rb
require './sub'

class Main
  @サブ変数 = サブクラス.new(args1 => 値1, args2 => 値2)
  @サブ変数.テンプレートメソッド
end
```
### 使い所
〇〇を△△毎に□□したい
例) レポートをフォーマット毎に出力したい

- 「レポートクラス」がスーパークラス、「レポートを出力」をテンプレートメソッドとして定義  
- 「レポートを出力」時に行う基本ステップを抽象メソッドとして定義し、「レポートを出力」内で呼び出すようにする
  - 出力スタート
  - ヘッダ出力
  - ボディ出力スタート
  - ボディ出力
  - ボディ出力終了
  - 出力終了
- HTMLレポート、プレーンテキストレポート、XMLレポートクラスをサブクラスに定義
- サブクラス内で基本ステップのメソッドを定義し、個々の実装でオーバーライド
- 使用したいレポートクラスをインスタンス化し「レポート出力」を呼び出し
- 各フォーマットにあった文字列が出力

### 特徴
- オブジェクト指向における、継承、ポリモーフィズムを活用したもの
  - 継承 -> サブクラスでテンプレートメソッドが呼べる
  - ポリモーフィズム -> 抽象メソッドのロジックがサブクラス毎に変わる
- デザインパターンの基本系
- 不変と可変に分離したもの

### 考え方 
- テンプレートメソッドとは抽象メソッドをまとめたメソッド
- 抽象メソッドとはアルゴリズムが何をするのかを定義したメソッド  
- スーパークラスの抽象メソッドでは高レベルの処理を制御する
- スーパークラスの抽象メソッドは実装が空でも良い
- サブクラスの抽象メソッドはオーバーライドするか標準機能のままか選択余地がある(定義は必須)
- スーパークラスの抽象メソッドが空のメソッドをサブクラスでも空で定義したものはフックメソッドと呼べる
- DDDで考えると、テンプレートメソッドはドメインが担うビジネスロジックに相当しそう
- DDDで考えると、抽象メソッドはビジネスロジック内の処理ステップに相当しそう
- オブジェクトを初期化するinitializeメソッドも既存のinitializeをオーバーライドしているのでテンプレートメソッドといえる

## 手順
1. 実現したい業務命令を担うべきクラスを検討し作成
2. 業務命令をテンプレートメソッドとして定義
3. 業務命令によって行う基本の処理ステップを抽象メソッドとして定義
4. 抽象メソッドのアルゴリズムを実装
5. 呼び出して実行結果を確認

### ポイント
- 1.の時点で業務命令に汎用性がない場合、スーパクラスかサブクラスかはそこまで意識しなくても良い。  
- 業務命令によって実現するものの種類が複数になり、2.、3.を改めて汎用性があるか検討することで、より適切なテンプレートメソッドや、抽象メソッドを定義できる。
- そのためテストを作成した方が良い。
- ただ、ある程度の抽象精度や仕様が不変でないとメインの実装へのオーバーヘッドが大きくなり過ぎてしまうため、最低限の設計が固まってから作成するのが良さそう
- 「今必要なことだけ行う」を徹底する(解決したい問題に絞って単純なコードを書いていく)

## 実例
- WeBrickのGenericServerクラス
- initializeメソッド

## 用語整理
- 基底クラスとほぼ同義
  - 抽象基底クラス
  - 抽象クラス 
  - スーパークラス
  - 親クラス
  - AbstractClass  

->不変なものといえる

- 具象クラスとほぼ同義
  - サブクラス
  - 子クラス
  - ConcreteClass

->可変なものといえる

## 書籍情報
Russ Olsen, Rubyによるデザインパターン
https://amzn.to/2PFKt6m

## 雑感
プログラミング自体がシステムを作成するための操作を抽象的に言語化したもので、オブジェクト指向やデザインパターンは更に設計手法を抽象化したものであり、更にそれを解釈ベースで言語化するのは大変と感じる。
キャプチャ数が動的に変化する正規表現の具体例

この前[たのしいRuby](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC5%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797386290)を買いまして、絶賛勉強中です。
問題演習中にはまったところがあったのでまとめておこうと思います。

# アルファベットとハイフンから構成される文字列を、ハイフンで区切って単語部分についてcapitalizeする
splitすることで簡単にできます。

``` rubypractice_342.rb
def word_capitalize_split(str) # str = "ruby-php-Python-COBOL-JavaScript-javA"
  nstr = []
  result_split = ""
  nstr = str.split(/-/) # ハイフンで分割し配列に格納
  nstr.each do |word|
    result_split << word.capitalize + "-" # 単語をCapitalizeしハイフンと一緒に文字列に入れる
  end
  return result_split.chop # "Ruby-Php-Python-Cobol-Javascript-Java"
end
```

しかし、この問題は正規表現クラスの章末問題でした。なので正規表現でも解いてみましょう。（実はもっと簡単にできたりしないかな・・・）


```rubypractice_342.rb
def word_capitalize_regexp(str) # str = "ruby-php-Python-COBOL-JavaScript-javA"
  count = 0
  str.each_char do |n| # 単語の中のハイフンの数を数える
    if n == "-"
      count += 1
    end
  end

  if count > 0
    separator = "(.+)"
    for i in 1..count
      separator << "-(.+)" #ハイフンの数だけセパレーターに追加する
    end

    Regexp.new(separator) =~ str # ハイフン区切りで単語をキャプチャ
    result = $1.capitalize # 一つ目のキャプチャした単語をCapitalize
		# ex.1 ハマったところここから
    for i in 2..count + 1
      result << "-" + eval('$'+i.to_s).capitalize # 二つ目以降のキャプチャした単語をCapitalize
    end
		# ex.1 ここまで
    return result # "Ruby-Php-Python-Cobol-Javascript-Java"
  else
    return str.capitalize
  end
end

```
ここで、メソッドに渡される文字列strにはハイフンがいくつ入ってくるかわからないので、キャプチャする単語数も動的に変化する点が問題となりました。
例えば、strにくる単語は"ruby-JavaScript-javA"かもしれないし、"ruby-php-Python-COBOL-JavaScript-javA"かもしれないという感じです。separatorは"(.+)-(.+)-(.+)"や"(.+)-(.+)-(.+)-(.+)-(.+)-(.+)"でええやろ、となったのですが・・・

# evalによるコード評価
最初はex1部分は下のように書いてありました。

```rubypractice_342.rb
    for i in 2..count + 1  
      result << "-" + "$#{i}".capitalize  
    end  
 
```

しかし、この場合の結果は"ruby-php-Python" => "Ruby-＄2-＄3"となってしまいます。
どうやら、＄２や＄３が文字列オブジェクトではなくリテラルとして処理されてしまっているようです。
そこで、このリテラルがRubyのコードとして評価してもらえるよう、evalメソッドを使用します。

```rubypractice_342.rb
    for i in 2..count + 1
      result << "-" + eval('$'+i.to_s).capitalize # 二つ目以降のキャプチャした単語をCapitalize
    end
 
```
これにより、文字列部分がプログラムとして実行され、想定どおりに結果が得られます。

# 参考
[Rubyでメタプログラミングことはじめ](https://qiita.com/iguchi1124/items/a2a64f27e6dabbac1301)
elm-webpack-loader のエラーに色を付ける

## elm-webpack-loader のエラー脱色問題

`elm make` コマンド一つでバンドルまでしてくれるんだから webpack とか要らないよね？と思いきや、なんやかんやで webpack が必要になってしまうと [elm-webpack-loader](https://github.com/elm-community/elm-webpack-loader) とかを使うことになります。
しかしここで問題が。

**Elm の親切なコンパイルエラーが...真っ赤！？**

で、でも create-elm-app を使うとちゃんと色がほら。ん？
https://github.com/halfzebra/create-elm-app/blob/master/scripts/utils/formatElmCompilerErrors.js
なんということでしょう。自前で色をつけています。
そして残念ながら、ここの部分のコードはユーティライズされていません。


## 重要な部分を切り出す

というわけで、formatElmCompilerErrors.js から不要な部分を全て削ぎ落として本質的な部分だけを抜き出してみました。ざっくりこうです。

```js
const chalk = require("chalk");
const ctx = new chalk.constructor({ enabled: true });
const error = ctx.bold.red;
const filename = ctx.cyan;

function stripRedundantInfo(error) {
  console.log(error);
  return (
    error
      // .replace(/Module build failed.*\nError.*\n/gm, "")
      .replace(/Error: Compiler process exited with.*\n/gm, "")
      .replace(/\[=+\]\s-\s\d\s\/\s\d[\r\n\s]?/gm, "\n")
  );
}

module.exports = function formatWebpackMessages(messages) {
  const errors = messages.errors;
  const warnings = messages.warnings;
  return errors.length > 0
    ? {
        errors: errors
          .map(x =>
            x
              // .replace(/(--\s[A-Z\s]+-+\s.*\.elm\r?\n)/g, filename("$1"))
              .replace(/(--\s[A-Z\s]+-+\s.*\.elm\r?\n)/g, filename("\r$1"))
              .replace(/(\n\s*)(\^+)/g, "$1" + error("$2"))
              .replace(/(\d+)(\|>)/g, "$1" + error("$2"))
          )
          .map(stripRedundantInfo),
        warnings: warnings
      }
    : messages;
};
```
みんな大好き（？） `chalk` を使っていますね。
コメントアウト部分は、筆者環境で表示が崩れていたのでそれぞれ一つ下のコードで修正しています。

次は、それを使う側のスクリプトです。

```js
const webpack = require("webpack");
const chalk = require("chalk");
const formatElmCompilerErrors = require("./formatElmCompilerErrors");
const formatWebpackMessages = require("react-dev-utils/formatWebpackMessages");
const config = { "🎃👽🧠🧙‍♂️🧜‍♀️" }
const compiler = webpack(config);
compiler.watch(
  {
    aggregateTimeout: 300,
  },
  (err, stats) => {
    const messages = formatElmCompilerErrors(
      formatWebpackMessages(stats.toJson({}, true))
    );
    const isSuccessful = !messages.errors.length && !messages.warnings.length;
    if (isSuccessful) {
      console.log(chalk.green("Compiled successfully!"));
      console.log();
    }
    if (messages.errors.length) {
      console.log(chalk.red("Failed to compile.\n"));
      console.log(messages.errors.join("\n\n"));
      return;
    }
    if (messages.warnings.length) {
      console.log(chalk.yellow("Compiled with warnings.\n"));
      console.log(messages.warnings.join("\n\n"));
    }
  }
);
```

`module.exports = config` ではなく、 `compiler = webpack(config)` を使う必要があります。あとはなんかゴニョゴニョしているうちにできます。
とりあえず `watch` を使ってみましたが、 dev server とか使いたい人はさらにゴニョゴニョしてください。