OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS6.3でZeroConf(mDNS)する

**CentOS滅びろ（挨拶）**

背景
---
開発環境として渡されたイメージファイル(現用サーバのリカバリディスク)がCentOS 6.3。
知ってたけど、とりあえず滅びて欲しい。

VirtualBoxで作った仮想マシンに入れて動くようにはなったが、IPなんとかしたい。
mDNSしよっと。

avahiを入れる
--
`sudo yum install nss-mdns`
なんか入ったっぽい。
yumのなんかはメンテされてたっぽい？

`sudo /etc/init.d/avahi-daemon start`
動かない。
CentOS滅びろ。

弄る
----
init.dのスクリプトじゃ何が起きてるかわからんので、daemonをverboseな感じに直接起動させる
`sudo avahi-daemon --debug`

出てきたエラーで適当にぐぐって
`sudo vi /etc/avahi/avahi-daemon.conf`

```
enable-dbus=no
disallow-other-stacks=yes
```
で動くようになった。

kernel古いせいでdbus無いし、SO_REUSEPORTもないと。

hostname
---
`hostname`でlocalhost.localdomainって返ってくるんだが、、、

CentOS6.3では
`/etc/sysconfig/network`で`HOSTNAME=xxx`だって。
ついでに`/etc/hosts`にも併せて追記だって。


確認
---
pingして通ったらOK。

osxからは`dns-sd -B _ssh._tcp .`とかでbrowseできるようだ
最速でGoのAPIサーバを公開する方法

#はじめに
![Go-Logo_Fuchsia.jpg](https://qiita-image-store.s3.amazonaws.com/0/119359/39e68ff7-4206-8ee6-8377-6817813b84fa.jpeg)
Web系の開発やってるとサクッとWebAPIサーバ建てたい・・・！けどめんどくさいことは抜きにしたい！というときありますよね？

コールバック先を指定したいけどいい感じの公開サーバがないときとか・・・
どっかのサーバからリクエスト流してもらって中身確認したい時とか・・・
シンプルに開発中のサーバを一回公開したいとか・・・

この投稿ではサクッとコマンド１発でWebAPIサーバが起動する、丸投げ系テンプレートを紹介します。

#動作環境
1. MacBookPro2016 Mojave
2. go version go1.10.3 darwin/amd64
3. Python 3.6.5

#事前に
1. [AWSのアカウント](https://aws.amazon.com/jp/)を作成する。
2. [EBコマンド](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html)を事前にインストールする。

#リポジトリ
テンプレート置き場
https://github.com/muff1225/goserver-saisoku

#プロジェクトの構成
ファイルの構成は以下のようになっています。

```
.
├── .elasticbeanstalk
│   └── applicationconfig.yml
├── README.md
├── application.go
├── bin
│   └── application
└── deploy.sh
```

#起動方法
リポジトリからダウンロードもしくはforkして、プロジェクトの中のdeploy.shを実行します。

```
. deploy.sh
```


#解説
deploy.shの中身は以下のようになっています。

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

# building to deploy the application for EB.
go build -o bin/application application.go

# validating have been installed eb command in this machine.
eb --version
if [ $? -ne 0 ]; then
    echo "Please install eb command before running this script.(https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html)"
fi

# EB status check for the next command.
eb status saisoku
if [ $? -ne 0 ]; then
    # create new one
    eb init goserver
    eb create saisoku
    eb open
else
    # deploy new app
    eb deploy saisoku
    eb open
fi
```

1. `go build -o bin/application application.go`でアプリケーションをビルド
2. 環境がない場合は`eb create`でサーバ立ち上げ。(`elasticbeanstalk /applicationconfig.yml`を使って初期化します。)
3. 環境がすでにある場合は、`eb deploy`でビルドしたアプリケーションをデプロイします。

# このテンプレートを元にアプリケーションを修正する場合
ElasticBeanstalkのルールとしてgolangサーバを建てる場合、開けるポートは5000番、アプリケーションの実行ファイルは`bin/application`にするようにしなければなりません。
このルールさえ守れば、アプリケーションを修正して、`deploy.sh`でデプロイまで実行可能です。


#最後に
このテンプレートを使えば、サクッと自分が自由に使える環境を構成できます。(HTTPSじゃないですけど)
快適な開発をやっていきましょう！
AOJ day 3: Tanghulu

While most people associate PureScript with row types, capabilites of Symbols has grown with each release of PureScript, to the point that now we have a Symbol Cons type class now in PureScript 0.12.x to split a known symbol to its head and tail. These Symbol type classes let us apply dependently-typed techniques using statically defined type-level strings.

## "We don't need Peano Numbers in PureScript"

Of course, any demonstration of dependently-typed techniques would not be complete without some obnoxious sized list demo, so I wrote about one using the type class `Prim.Symbol.Append`:

<https://qiita.com/kimagure/items/522fa4dd4abdcc313c8e>

The gist of this post is that when we look at the definition of the type class and its functional dependencies, we can treat this like addition of two numbers to a sum:

```hs
class Append (left :: Symbol) (right :: Symbol) (appended :: Symbol)
  | left right -> appended
  , right appended -> left
  , appended left -> right
```

That is,

```
a <> b == c
  | a b -> c
  , b c -> a
  , a c -> b
```

And so with `"." <> ".." == "..."` and the fundeps above, we can get to work making arithmetic work for symbols of period `"."`. Amazing!

We'll get more into how to use Symbol for more fun things in future posts.
AOJ day 2: Psc-Package

Psc-Package is a tool for PureScript based on package sets -- that a given package should only have one version. This means that for any package that depends on `purescript-effect`, they will all only use `purescript-effect` at the given version, and will be validated to work with it when the package set is verified for consistency.

And while you could read some literature on why Bower was used as a default for PureScript projects (such as in Harry's blog here: <https://harry.garrood.me/blog/purescript-why-bower/>), it would be more productive to talk about how Psc-Package works and how you can use it today.

## "Making a new library and using it in your own Psc-Package set"

In this post, I go through how you can have your own fork of package sets that you can update with your packages.

<https://qiita.com/kimagure/items/c37b228e80318d4158f0>

Since I wrote this post, I've written some dependencies for an alternative package set solution I have called "Spacchetti" (as in, a *packet* of *spaghetti*). In these guides, I have a quick explanation of what Psc-Package is and how it uses package sets:

<https://spacchetti.readthedocs.io/en/latest/intro.html>

In a future post, I'll go more into how Spacchetti works by utilizing a programming language called Dhall to generate package set JSON.

You may also be interested in this post about upgrading a Bower project to Psc-Package: <https://qiita.com/kimagure/items/0d9354900d7a7dbd3864>

You might also want to read about how you can implement your own Psc-Package: <https://qiita.com/kimagure/items/625070775da70b37b67e>
[AWS re:Invent 2018] Registration と SWAG と 会場の雰囲気

[docomo Developer support](https://dev.smt.docomo.ne.jp/)の赤塚です．

[AWS re:Invent 2018](https://reinvent.awsevents.com/)が始まりましたので，参加レポートを随時記載していきたいと思います．

# 1. AWS re:Invent とは？

説明が分かりやすかったので下記のブログから引用させていただきます．

> 「エンジニア」が参加する「学習型カンファレンス」です。AWS の新技術やトレンドの基調講演となる Keynote をはじめに、AWS Certification のハンズオンセミナーや Bootcamp といった実地体験型セッション、AWS サービスを用いての事例紹介のセッションが豊富に開かれます。セミナー/セッション以外でも GameDay(パフォーマンスチューニング大会)や Pub Crawl(ダンスパーティ)といったお祭り要素が高いイベントもあります。

[AWS re:Invent の歩き方(1.申し込みと事前準備編)](https://tech-blog.fancs.com/entry/2016/11/30/AWS_re%3AInvent_2016_%E7%8F%BE%E5%9C%B0%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%281_%E6%BA%96%E5%82%99%E3%81%8B%E3%82%89%E5%BD%93%E6%97%A5%E3%81%BE%E3%81%A7%29)

# 2. Registration

私は並ぶのが嫌だったので朝7時にVenetianにてRegistrationしました．

朝7時のVenetianの雰囲気．まだ空いてるからこの時間がおすすめ．並ばなくていい．

![003.png](https://qiita-image-store.s3.amazonaws.com/0/262328/9456002c-4ab3-a790-d8bd-82873770dedf.png)

空港にもRegistrationのデスクが設置されていたので，そちらでもRegistrationが可能でした．

# 3. SWAG

## 3.1. AWS re:Invent 登録者全員がもらえるグッズ

パーカーのサイズを確認する試着コーナー．

![004.png](https://qiita-image-store.s3.amazonaws.com/0/262328/bed2bb9a-bb06-de06-4c33-37c8808ad93b.png)

グッズ

![005.png](https://qiita-image-store.s3.amazonaws.com/0/262328/ad22c127-5d07-5fc3-3f57-51a6728b23ac.png)

## 3.2. セッション評価した人がもらえるグッズ

セッションを評価することでバッチがもらえる模様

![001.png](https://qiita-image-store.s3.amazonaws.com/0/262328/48028f1a-d4ca-2af4-0c66-6cd509bcbcb3.png)
![002.png](https://qiita-image-store.s3.amazonaws.com/0/262328/0f64591e-c3e8-0a5f-df9d-190f05e66858.png)

早速もらった1日目

![008.png](https://qiita-image-store.s3.amazonaws.com/0/262328/f86f9aed-e2ec-96dd-5b95-ba65a2f16902.png)


## 3.3. AWS認定者がもらえるグッズ

coming soon.

# 4. 会場雰囲気

Venetian 朝7時．　（朝７時なので空いている．昼になると凄く混む）

![006.png](https://qiita-image-store.s3.amazonaws.com/0/262328/80cfabb1-3abb-6c00-5b95-b5526c9785cb.png)
![009.png](https://qiita-image-store.s3.amazonaws.com/0/262328/84d3092a-8405-3f36-2cfe-c95048eb33f0.png)
![007.png](https://qiita-image-store.s3.amazonaws.com/0/262328/abdd8842-2346-bfac-60d1-5f1d0e105bc8.png)
![008.png](https://qiita-image-store.s3.amazonaws.com/0/262328/c2b831c2-e8b5-c9b3-e75a-cb3439430c6a.png)

Venetianの壁　（自由に書いていい）

![007.png](https://qiita-image-store.s3.amazonaws.com/0/262328/5af0e417-85b4-9c3d-5027-620e9cdbd796.png)

Monday Night Live (すごく人が多い）

![006.png](https://qiita-image-store.s3.amazonaws.com/0/262328/3e719eb7-c093-52ce-c145-f2abbe5967e9.png)

とにかく食べ物がいたるところにある(基本食べ物に困らない)

![010.png](https://qiita-image-store.s3.amazonaws.com/0/262328/741d03b8-e672-b23f-db3c-152492d7b004.png)
![009.png](https://qiita-image-store.s3.amazonaws.com/0/262328/5b47b541-e21d-772a-d25f-0c9b67a971a7.png)
![011.png](https://qiita-image-store.s3.amazonaws.com/0/262328/44d5d28e-0288-dc53-8edb-3fa9232e7b2b.png)
pip 18.1 から setup.py の install_requires に URL が書けるようになった

`pip` コマンドのヴァージョン `18.1` から `setup.py` に記述する `setuptools.setup` 関数の `install_requires` 引数に、依存パッケージの URL を直接記述できるようになったようです。

`18.0` 以前も PyPl 以外の場所から依存パッケージを取得する場合 `requirements.txt` には URL を記述できましたが、`setup.py` で同じようなことをすると、[色々と面倒](#180-以前の場合)でした。

`install_requires` 引数の要素には、通常 PyPl のパッケージ名（+ヴァージョン指定）を書きますが、今回の変更で、 `install_requires` の要素に以下の記述ができるようになりました:

```
(パッケージ名) @ (URL)
```

下記の例は `gitlab.com` に置いた `osoken/private-package` というリポジトリにある `private-package` というパッケージに依存したパッケージの `setup.py` の一部です:

```python:setup.py
# -*- coding: utf-8 -*-

from setuptools import setup

setup(
    ... (中略) ...
    install_requires=[
        'private-package @ git+ssh://git@gitlab.com/osoken/private-package.git'
    ]
)
```

URL には、この例のような VCS のリモートリポジトリの URL や、下記のようなアーカイブの URL が書けます:

```
pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686
```

この変更は [PEP 508](https://www.python.org/dev/peps/pep-0508/) に従ったもののようで、記述できるものの文法もここに載っています。

PyPl 外のパッケージが混ざっていたとしても、大体の場合は `requirements.txt` に書いて `pip install -r requirements.txt` したり、特定のパッケージだけ手動で依存関係を解消したりすれば問題にはなりませんが、今回の変更で `setup.py` だけで統一的に依存関係が解消できるようになりました。ただ、上記の記述が混じった `setup.py` は `pip 18.0` 以前のヴァージョンではエラーになってしまうので、使える状況を選ぶ状態ではあると思います。

## 参考文献

- [Un-deprecate `--process-dependency-links` until an alternative is implemented · Issue #4187 · pypa/pip](https://github.com/pypa/pip/issues/4187)
- [setup.pyのdependency_linksの書き方 - 今川館](http://imagawa.hatenadiary.jp/entry/2015/02/01/190000)
- [PEP 508 -- Dependency specification for Python Software Packages | Python.org](https://www.python.org/dev/peps/pep-0508/)

---

以下、付録:

## 18.0 以前の場合

`pip 18.0` 以前では `install_requires` 引数に書いたパッケージ名に対応する URL を `dependency_links` 引数に書く必要がありました。この書き方にも[いくつか細かいルール](http://imagawa.hatenadiary.jp/entry/2015/02/01/190000)があり、更にこの `setup.py` を使う際にも `pip install` コマンドに `--process-dependency-links` というオプションを渡さないとうまく動かない (しかも `DEPRECATION` の警告が出る) という状態でした。

```python:setup.py
# -*- coding: utf-8 -*-

from setuptools import setup

setup(
    ... (中略) ...
    install_requires=[
        'private-package'
    ],
    dependency_links=[
        'git+ssh://git@gitlab.com/osoken/' +
        'private-package.git#egg=private_package-1.0.0'
    ]
)
```
【Python】レトロゲームエンジンPyxel

Pythonのレトロゲーム用ゲームエンジンPyxelのメモです。
⇒ https://github.com/kitao/pyxel

インストールから使い方まで、分かりやすくREADMEが書かれているため、そちらを見れば大体分かります（日本語もあり
⇒ https://github.com/kitao/pyxel/blob/master/README.ja.md

READMEにも画像が載っていますが、以下はサンプルのジャンプゲーム（pyxel/examples/02_jump_game.py）です。
　![02_jump_game.gif](https://qiita-image-store.s3.amazonaws.com/0/140207/126eab1e-1f62-5b96-7be0-bd613add573c.gif)

##仕様

* Windows、Mac対応 (Linux版は開発中)
* Python3によるコード記述
* 16色固定パレット
* 256x256サイズ、3画像バンク
* 256x256サイズ、8タイルマップ
* 4音同時再生、定義可能な64サウンド
* 任意のサウンドを組み合わせ可能な8ミュージック
* キーボード、マウス、ゲームパッド
* 画像・サウンド編集ツール

パレット数とか、画面サイズとか和音数とかレトロゲームを意識した仕様になっています。

##アプリケーションの作成方法
フレームの更新処理と描画処理を定義して、pyxel.run()するだけです。
シンプル。

```python:
import pyxel

class App:
    def __init__(self):
        pyxel.init(160, 120)
        self.x = 0
        pyxel.run(self.update, self.draw)

    def update(self):
        self.x = (self.x + 1) % pyxel.width

    def draw(self):
        pyxel.cls(0)
        pyxel.rect(self.x, 0, self.x + 7, 7, 9)

App()
```

##描画API
ドット、ライン、矩形、円、BLT等の11種のAPIで描画が可能です。
シンプル。
![03_draw_api.gif](https://qiita-image-store.s3.amazonaws.com/0/140207/3c81a038-0d60-8f93-ec70-2bf3b9c43087.gif)
##サウンドAPI
5種のAPIでサウンド再生が可能です。
シンプル。
![04_sound_api.gif](https://qiita-image-store.s3.amazonaws.com/0/140207/6ac339b9-7c5e-55c1-0440-e9a1e5c43468.gif)
##専用エディタ
ドット絵やサウンドの作成ツールも同梱されいます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/140207/c227f977-ad1d-aa76-7ce2-890b9cb2e3c7.gif" width="40%"> <img src="https://qiita-image-store.s3.amazonaws.com/0/140207/d3cc7f0d-5960-db0c-61b1-a98d3c1a99ba.gif" width="40%">
<img src="https://qiita-image-store.s3.amazonaws.com/0/140207/7e2b2abc-0859-fea0-4950-6237f34ee58b.gif" width="40%"> <img src="https://qiita-image-store.s3.amazonaws.com/0/140207/b0209076-5fb9-0b77-1a17-7eeb486242c4.gif" width="40%">
眺めていたら、久々にゲームを作りたい気持ちがわいてきました。

以上。
Nodejs ファイルpath指定方法はrequireとfs.readFileで違う

#結論
- rootFolder
    - |---- Folder1
        - |---- target.json
        - |---- readJSON.js
        
上記のディレクトリ構造で、target1.jsonの内容を読み込むコードは下記の通り

```target.json
{ "hoge" : "fuga" }
```

```readJSON.js
var fs = require("fs");

var use_require_json = require('./target.json');
console.log(use_require_json.hoge); //=> "fuga"

var use_readFile_json = JSON.parse(fs.readFileSync('./Folder1/target.json', 'utf8'));
console.log(use_readFile_json.hoge); //=> "fuga"
```

##ポイント
【Point1】
requireを使用する場合は、自ファイルと読込対象ファイルの相対pathを指定 
 例の場合、 readJSON.js と同ディレクトリに target.json があるので 
`./target.json` 
でOK

【Point2】
readFile(readFileSync) を使用する場合は、自ファイルがどこにあるかに関わらずrootからのpathを指定
例の場合、 target.json のrootからのpathである
`'./Folder1/target.json'`
を指定する

#検証環境
・cloud9 + heroku
・node: 8.9.4
・npm: 5.6.0
・環境によって変わる可能性あり
Arrayで使いたいメソッドがObserverになっていて使えない問題の対処法

## 現象
### mapがない！！😇
<img width="636" alt="スクリーンショット 2018-11-27 1.06.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/264910/2f63179d-1672-64e8-d1f2-2c583d44f770.png">

## 概要
Nuxt.jsで色々ごちゃごちゃやってたときにググっても解決方法が出てこず詰まってしまった。
やりたいことは意外と単純で、mapメソッドを使いたかっただけなのだが思いの外しんどかったのでメモ

## 筆者が取得しようとしたArrayがObserverになってしまっていたケース

```javascript:assets/js/profile/skill.js
export default {
  language: {
    javaScript: {
      name: 'JavaScript',
      framework: ['Vue.js', 'Nuxt.js', 'React.js', 'AngularJS', 'jQuery']
    }
  }
}
```

```javascript:index.vue
import skill from '~/assets/js/profile/skill.js'
```
こんな感じで持ってきた中の、`framework`がObserverとなります。
`index.vue`内で指定するときは`skill.language.framework`ですね。

## 対処法
- Array.prototype.関数名.callを使う
    - 本来使えないメソッドを使えたりできるやつらしい、あまり使ったことがない
- ↑の第一引数をObjectでキャストする
    - これをしないと`TypeError: Array.prototype.map called on null or undefined`が発生してしまう

## コード
おそらくmapの部分を書き換えれば他のメソッドも動作すると思います。
xxxの部分はobserverになっているArrayを入れてください。

```javascript
      const arr = Array.prototype.map.call(Object(xxx), value => {
        // process
      })
```
linq.js メモ



会社でlinq.jsを使っているので紹介とよく使うライブラリのメモ

## LINQとは？
LINQとは統合言語クエリ (LINQ: Language-Integrated Query)の略で
C＃言語などに使われる配列操作を簡単にすることができものです。
簡単に言うとforeachの上位互換です。

linq.jsはそのLINQをjavaScriptに移植したライブラリです。
[http://neue.cc/reference.htm]()

## 使い方
```
# install
npm install linq 


#import
import linq from 'linq'
```

## よく使うメソッド


### データ
```
const user = new Object(
    [
        {'id': 1, 'name': "tanaka", 'age': 24 },
        {'id': 2, 'name': "takahasi", 'age': 31 },
        {'id': 3, 'name': "suzuki", 'age': 29 },
        {'id': 4, 'name': "satou", 'age': 35 },
    ]
);

let user2 = new Object();
```

### フィルター処理 [where]
```
const where = linq.from(user).where(x => x.age < 30).toArray()
console.log(where);
/* [{id: 1, name: "tanaka", age: 24},
** {id: 3, name: "suzuki", age: 29}]
*/
```

### 配列のすべての値に関数を適用したものを取得 [select]
```
const select = linq.from(user).select(x => x.age + 1).toArray()
console.log(select);
// [25, 32, 30, 36]
```


### 配列の先頭を取得 [first]
```
const first = linq.from(user).first()
console.log(first);
// {id: 1, name: "tanaka", age: 24}
```

### 先頭から何個か取得 [take]
```
const take = linq.from(user).take(2).toArray()
console.log(take);
/* [{id: 1, name: "tanaka", age: 24},
**  {id: 2, name: "takahasi", age: 31}]
*/
```

### 幾つかを飛ばして残りを取得 [skip]
```
const skip = linq.from(user).skip(2).toArray()
console.log(skip);
/* [{id: 3, name: "suzuki", age: 29},
**     {id: 4, name: "satou", age: 35}]
*/
```

### 先頭から条件を満たさなくなるまで取得(一度でも条件を満たさなくなったらストップ) [takeWhile]
```
const takeWhile = linq.from(user).takeWhile(x => x.age < 30).toArray()
console.log(takeWhile)
//{id: 1, name: "tanaka", age: 24}
```

### 条件を満たす最初の要素を取得する なければデフォルト(第二引数)を取得 [firstOrDefault]
```
const firsrOrDefault = linq.from(user).firstOrDefault(x => x.age < 30, 0)
const firsrOrDefault2 = linq.from(user).firstOrDefault(x => x.age < 10, 0)

console.log(firsrOrDefault);   //{id: 1, name: "tanaka", age: 24}
console.log(firsrOrDefault2);  //0
```

### 要素数数える [count]
```
const count = linq.from(user).count()
console.log(count)  //4
```

### すべての要素が条件をみたすならtrue [all]
```
const all = linq.from(user).all(x => x.age > 20)
console.log(all);  //true
```

### 一つでも要素が条件をみたすならtrue [any]
```
const any = linq.from(user).any(x => x.name === 'suzuki')
console.log(any);  //true
```
### リストが空か [any]
```
console.log(linq.from(user).any());   //true
console.log(linq.from(user2).any());  //false
```

### 最大値,最小値,平均値  [max, min, average]
```
console.log(linq.from(user).max(x => x.age) )  //35
console.log(linq.from(user).min(x => x.age) )  //24
console.log(linq.from(user).average( x => x.age)) //29.75
```

### ソート [orderBy,orderByDescending]
```
//（昇順）
console.log(linq.from(user).orderBy(x => x.age).toArray());
//（降順）
console.log(linq.from(user).orderByDescending(x => x.age).toArray());
```

## まとめ
* laravel使っている人はモデルにLINQが使われているので使いやすい。
* ネストが深くなるのを防げる
* 可読性アップ！
* スタイリッシュに書ける

皆さんも是非使ってみてください
[AWS]インスタンスタイプの違い(覚え方)

# はじめに
AWSのソリューションアーキテクトアソシエイツ資格を勉強している中で、インスタンスタイプの違いがどうしても覚えられないので、自分なりの覚え方を模索しました。
以下、かなり薄っぺらいですが、おいおい調べていきます。

# インスタンスタイプ（一覧）
「Amazon EC2 インスタンスタイプ」
https://aws.amazon.com/jp/ec2/instance-types/
インスタンスタイプの比較サイト
https://www.ec2instances.info
　※参考ページ
　https://dev.classmethod.jp/cloud/aws/ec2instances-info/

# 汎用（Tx/Mx）
CPU・メモリ・ネットワークの各リソースのバランスが良い。
TxシリーズはCPUのバースト機能があるため、突発的なピークがあるシステムに有効。
自分の現場でも標準的に使われているのはm4.large

「とりあえず」のTx、「まあまあ」のMxと覚える。

# コンピューティング最適化（Cx）
コンピューティング集約型ワークロードのために最適化（バッチサーバみたいにまとめて処理を行う系のサーバに最適ということ？）。
専用EBSの帯域幅が広め（あとでもう少し詳しく調べる）。

「コンピューティング」のCxと覚える。（そのまんま）

# メモリ最適化（Rx/Xx）
メモリが大きいタイプなので、大規模なアプリケーションやDB（特にインメモリDB）サーバに最適。
（RxとXxの機能面での違いはあまり無さそう？）

Rxは「メモリ＝RAM」で良いだろうけど、Xの方はどうしよう。（宿題）

# 高速コンピューティング（Px/Gx/Fx）
GPU搭載型のインスタンス。

Fxはフィールドプログラマブルゲートアレイ (FPGA) というのを持っている（それが何なのかは宿題）。
Gxはそのまま「GPU」だから。
Pxは新しいから「Performanceに優れるGPU」みたいに覚える。

# ストレージ最適化（Hx/Ix/Dx）
ストレージ容量が大きいタイプ。

Dxは「Disk」。
Ixは「I/Oが優れている＝SSDを使っている」。
Hxは「HDD」、もしくは「Disk性能がHigh」とでも覚える。
Unityメモ：Androidのアプリをビルドしたい

# ビルドするまでの手順
1. Unityの「Android Build Support」を入れておく
1. SDKのインストール　https://developer.android.com/studio/
    1. Android SDKのパスを覚えておく
    1. Android Studio を立ち上げて、Configure > SDK Manager > Android SDK > Android SDK Location で確認可能。
    1. ショートカットを作っておくとよい
1. JDKのインストール(Script Backendがmonoの場合)
    1. https://www.oracle.com/technetwork/java/javase/downloads/index.html
    1. https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
    2. Unityのバージョンによって要求バージョンが異なるので適宜アーカイブから探してダウンロード。例えばUnity 2018.2なら「jdk-8u191-windows-x64.exe」
2. NDKのインストール(Script BackendがIL2C++の場合)
    3. https://developer.android.com/ndk/downloads/
    4. Unityのバージョンにより要求NDKバージョンが異なるので https://docs.unity3d.com/ja/2018.2/Manual/android-sdksetup.html 辺りを見ましょう。例えばUnity 2018.2なら「Android NDKバージョンr13b（64-bit）」です。
1. パッケージ名の入力
2. ビルド

# Android実機にインストールするまでの手順
Android Debug Bridge（adb）の準備

1. adb自体はSDKをインストールした時点で入っている。
1. Google USB Driver をインストールする
    1. Android Studio を立ち上げて、Configure > SDK Manager > Android SDK > SDK Toolsの項目にあるのでチェックをしてApply
2. Android実機をPCに接続する
    3. 認識しない場合はデバイスマネージャから「Android ADB Interface」として登録
4. コマンドプロンプトからadb install [ファイルパス]でインストールできる。

# 注意点
* JDK及びNDKのバージョンについて
 * Unityのバージョンによって対応するバージョンが異なります。すでにアーカイブに無いバージョンの事もあり、近しいパッチバージョンを適宜選択する必要もあります。参照のリンクに飛ぶと対応バージョンの記載があります。ドキュメントの左上のバージョン表示がお使いのバージョンであることを確認した上でお確かめください。
* adb installコマンドの落とし穴
 * 注意として、例えばdドライブにあるapkファイルをインストールする時はdドライブに移動してからじゃないとインストールできません。ずっと待たされる上に進行しないのでバグのような気もします。

# 参照
https://docs.unity3d.com/ja/2018.2/Manual/android-sdksetup.html
ReadyNAS102のHDDをサルベージする

# はじめに
　NETGEARのReadyNAS102がファームウェア更新時に吹っ飛んでしまい起動しなくなりました。ReadyNASのディスクはbtrfsという話を聞いたことがあったので別のLinux環境にマウントしてデータをサルベージしました。

環境：Ubuntu 18.04LTS、サルベージ対象のHDDを接続し/dev/sdbで見える状態

## btrfs
```
# apt install btrfs-tools
```
 対象のHDDをmountしようとしたら
mount: unknown filesystem type 'linux_raid_member' 
のメッセージが出てマウント不可。-t btrfsのオプションを付けても同様。
ReadyNAS102では2TBのHDDを2本使用していたのでRAID1構成なのでは？と推測しRAID環境を用意する。

## RAID環境
```
# apt install mdadm
```
/dev/md0のRAIDを構成する1台として/dev/sdb3(救出対象)を選択するが、RAID1構成では2台のHDDが必要なので強制的に1台で動かす。

```
# mdadm —assemble /dev/md0 —force —run /dev/sdb3
```

うまく行かなかったときには以下でやり直し。

```
# mdadm --stop --scan
```

## マウント

```
# mount /dev/md0 /mnt
```
これでOKだがbtrfsであることを確認するため以下を実行。こちらもOK。

```
# mount -t btrfs /dev/md0 /mnt
```


## 参考

[ReadyNAS OS 6 デスクトップストレージシステム ハードウェアマニュアル PDF](https://www.netgear.jp/support/manual/RN100-300-500/RNOS6DesktopHWUM_JP_22Oct13.pdf)
[Re: OS6 Data Recovery - How to Mount BTRFS Volumes - NETGEAR Community](https://community.netgear.com/t5/ReadyNAS-in-Business/OS6-Data-Recovery-How-to-Mount-BTRFS-Volumes/m-p/895584/highlight/true)

[btrfsを構成するディスクが壊れてからRMAで交換発送するまで
 - Chienomi](https://chienomi.reasonset.net/archives/livewithlinux/841)

[個人でmdadmを利用する時によく使うコマンド一覧](https://qiita.com/upsilon2@github/items/3e81de70c3fb95e5d57a)
[RAID1の片肺ディスクをマウントしたい - ナナの旦那と猫7匹の日記](https://nananeko.ti-da.net/e7460552.html)
[RAID1(ミラーリング)のデータをディスク1つから復旧する - Memorandum](http://tatsunode.hatenablog.com/entry/2014/09/02/213111)


[mount(8) - Section: Linux Programmer's Manual (8)](http://linuxjm.osdn.jp/html/util-linux/man8/mount.8.html)
正則化

# はじめに
最初に読んだ時めっちゃ意味わからんかったです・・・・。
よってそこで、勉強しながらメモ的な感じで僕レベルでも理解できるように理論だけを書き残しておきます。

## おさらい（コスト関数と重み更新）

$\hat{y}$はモデルによって予測される値で、

```math
\hat{y} = f(x)= W^t x\\

\\
W: 重みベクトル\\
x: 特量量ベクトル\\
```

によって求められます。
この重みを求めることによって、重みに対する法線ベクトルが境界線になります。

そこでイテレーションによって重みを更新して最適な重みを推定する必要がありました。
そこで出てくるのがコスト関数。

```math
E(w) = \frac{1}{2} \sum_{i=1}^{n} (y_i - \hat{y_i})^2\\
\\
E(w): コスト関数\\
\hat{y}: 予測値 \\
y: 実測値
```

このコスト関数は残差を示しているので、コスト関数が最小になるように重みを更新していきます。
そのためにはコスト関数を推定したいパラメータwで微分する必要があります。しかしながら、E(w)はf(x)という関数を含んでいる合成関数なので偏微分する必要がありました。

```math
\frac{∂E(w)}{∂w_j} = \frac{∂E(w)}{f(x)} ・ \frac{∂f(x)}{∂w_j}\\

\\
\\
\frac{∂E(w)}{f(x)} = \frac{1}{2}\sum_{i=1}^{n} \frac{∂}{∂f(x_i)}(y_i^2 - 2y_i\hat{f(x_i)} + f(x)^2)\\
= \sum_{i=1}^{n}(f(x_i) - y_i)\\\\

\frac{∂f(x)}{∂w_j} = \frac{∂}{∂w_j}(w^T x) =  \frac{∂}{∂w_j}(w_0 x_0 + .... + w_j x_0 + ... ) = x_j\\
\\

\frac{∂E(w)}{∂w_j} = \frac{∂E(w)}{f(x)} ・ \frac{∂f(x)}{∂w_j} = \sum_{i=1}^{n}(f(x_i) - y_i)・x_j\\
```

これによって$w_j$を推定することができます。
推定には、学習率をかけたものを用います。

```math
w_j := w_j - \eta E(w_j)
```

という話でした！

## 正則化

しかしながら何次元にも及ぶ重みのためパラメーターが大量に増えた時にオーバーフィットしてしまうということがあります。
そこで正則化というものを定義します。

正則化にはL1, L２正則化というものが一般的です。

```math
L1 = R(w) = \frac{λ}{2}\sum_{i=1}^{n}|w_i| \\
L2 = R(w) = \frac{λ}{2}\sum_{i=1}^{n}(w_i ^2)\\
```

それぞれLasso(L1)、Ridge(L2)といい、L2の方がよく使われるみたいですね。
ここで定義した正則化項(R(w))を更新式に加えると不思議なことに過学習を防ぐことができます。


```math
E(w) = \frac{1}{2} \sum_{i=1}^{n} (y_i - \hat{y_i})^2 + R(w)\\ 
```

このように定義します。
すると、wが大きくなり場合、正則化項によりコスト関数は増大します。
すると**wはあまり大きくならず、かつ残差の少ないパラメータ**として推定できるようになります。


このことがなぜ、過学習を防ぐことに寄与するかというと、ものすごく極端な例ですが、
$w_j = 0$となったします。すると

```math
f(x) = w^T x = w_0 x_0 + .... + w_j x_j + .... w_n x_n\\
= w_0 x_0 + .... + 0 + .... w_n x_n\\
```

となり、次元が消失します。
といった具合に正則化項は過度にパラメーターを適合させなくなるといった役割があります。
PureScript初心者のメモ（二次元配列から値を取り出す）

```haskell
value = [[1, 2, 3], [4, 5, 6]] :: Array (Array Int)
```

から```value[0][0] ≒ (Just 1)```を取り出したいときにどう書くべきか困ったのでメモ

## 0. 結論

```haskell
index2 :: forall a. Array (Array a) -> Int -> Int -> Maybe a
index2 v i j = do
  dim1 <- index v i
  index dim1 j

index2 value 0 0  -- (Just 1)
```

以下はそれに至った流れです
## 1. ドキュメントを見つつとりあえず型を合わせた
関数型プログラミングを知らない人がドキュメント見ながら考えた結果こうなった

```haskell
index (maybe [] identity $ index value 0) 0
```

不要な空配列が出てきてしまったので書き直してみる

## 2. bindを使う
indexの型が Array a -> Int -> Maybe a なので、flipを使って先にインデックスを与えると Array a -> Maybe a となり、bindでつなげられて空配列が消せた
flipが入ったために少し読みづらくなっているが、途中結果を変数に保存すれば解決する

```haskell
index value 0 >>= flip index 0
```

## 3. do記法を使う
do記法を使ったら途中結果を変数に保存しなくても読みやすくできた

```haskell
do
  firstArray <- index value 0
  index firstArray 0
```

Maybeのおかげで、この見た目でも配列の長さを超えた場合のエラー処理ができています

```haskell
do
  firstArray <- index value 3
  index firstArray 0  -- Nothing

do
  firstArray <- index value 0
  index firstArray 3  -- Nothing
```
Hadoop metrics MemorySeconds と vCoreSeconds の意味


Hadoop のジョブは実行中にそれが割り当てられているメモリ量やコア数をリアルタイムに確認することは可能。

メモリ量　Allocated Memory MB 
コア数　Allocated CPU VCores

ただし、ジョブが終了するとそれぞれの値は N/A(API レスポンスでは -1 固定)になってしまい、後からどの程度のリソースを利用していたのかをここからトレースすることが出来ない。
![hadoop_resource.png](https://qiita-image-store.s3.amazonaws.com/0/63951/f2c122b2-8107-fcb6-21ee-5cc559323196.png)

そこで、その他の Hadoop metrics として、MemorySeconds と vCoreSeconds というものがある。
それぞれの意味は
1. MemorySeconds - そのジョブが割り当てられたメモリの総量 × ジョブの実行時間(単位はMB)
2. vCoreSeconds - そのジョブが割り当てられたコアの総量 × ジョブの実行時間

つまり、それぞれの値をジョブの実行時間で除算してあげることで、割り当てられたメモリやコアの平均値を算出することが可能。
この実行時間には、Accepted など Running 以外のステータス時間も含まれている可能性があるため、正確な値の算出にはならないかもしれないが、目安にはなる（全くトレース出来ないより良い）。

allocatedMBPerSeconds = memorySeconds / elapsedTime
allocatedVCoresPerSeconds = vcoreSeconds / elapsedTime
![hadoop_resource2.png](https://qiita-image-store.s3.amazonaws.com/0/63951/901af5e1-d894-f09e-1755-5820fb322d02.png)
android studio emulator　 host doesn't support requested feature: CPUID.80000001H:ECX.abm  とは？

特に関係なさそうですが念の為環境を記述
ubuntu 18.04
android studio 3.2.1


エミュレーター: qemu-system-x86_64: warning: host doesn't support requested feature: CPUID.80000001H:ECX.abm [bit 5]

android 9.0をターゲットにして仮想デバイスを作成すると上のような警告でました。
警告だけで特に問題なく動きますが警告は減らしておいて損はないと思いましたので
警告の意味と改善の仕方をまとめました。

色々調べた結果　VT-xサポートできないよって言われているようです。
なのでF2でbioを立ち上げてVirtualization Technologyの設定項目でVT-xを有効にしてあげることで解消することができるようです。

ちなみに、VT-x はインテルの仮想化支援技術で、x64 世代の CPU からサポートされている技術で、Core2Duo からサポートされいるのでCore2Duoより以前はサポートされていないです。
windowsの環境でHyper-Vをオンにしているとマイクロソフトが提供している仮想化技術を使ってしまうのでBIOS で VT-x を有効に設定しても使えないことがあるらしいです。

以下参考URL
Android Studio Emulator Error In Linux
https://stackoverflow.com/questions/52055978/android-studio-emulator-error-in-linux

vt-x-を有効にしたく-て-3-日程できなかったのだが、windows
http://picworld.jp/2016/03/28/vt-x-%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%9F%E3%81%8F-%E3%81%A6-3-%E6%97%A5%E7%A8%8B%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A0%E3%81%8C%E3%80%81windows/
ブラウザの開発ツールでHTMLのタグをまるっと削除する方法

# Chrome と FireFox
※. 説明画像はChromeですが同様の方法でFireFoxもまるっと削除できます。
![スクリーンショット 2018-11-26 23.20.59.png](https://qiita-image-store.s3.amazonaws.com/0/159761/ad962455-24ca-9c47-d483-fe14a2fbf380.png)
![スクリーンショット 2018-11-26 23.30.36.png](https://qiita-image-store.s3.amazonaws.com/0/159761/d17564b3-1d54-45b1-3e47-da67523ea42c.png)
![スクリーンショット 2018-11-26 23.31.31.png](https://qiita-image-store.s3.amazonaws.com/0/159761/fe2e1d03-ddec-8e27-2548-a75309c75fd0.png)

- [HTMLタグspan・divなど追加 | ビバ★りずむ](https://bibabosi-rizumu.com/beginner-element/#toc14)

# IE11
1. 要素を選ぶ
2. [DOM Explore]タブのHTML上で右クリックして[要素の削除]を選ぶ
3. まるっと消える

- [マイクロソフト中の人が徹底解説！InternetExplorer 11 F12 開発者ツールの新機能 | HTML5Experts.jp](https://html5experts.jp/osamum_ms/1928/#dom)
いい加減覚えたい！RailsアプリでローカルのPostgreSQLが起動していないときの復旧手順

## 背景
`rails s` を実行し、ローカル環境のURLにアクセスすると、 
ごくたまに `PG::ConnectionBad` というエラーを見ることがあります。 
ローカル環境で `PostgreSQL` と `Rails` の接続が上手くいかないことが原因なのだと理解しているのですが、毎回復旧手順をググっているなと思い観念してまとめます。 

## 前提
- `postgresql` のバージョン `10.5`

```ruby
$ brew info postgresql
postgresql: stable 10.5 (bottled), HEAD
Object-relational database system
https://www.postgresql.org/
```

## 発生事象
`rails s`　を実行して、サーバー起動し、 
開発環境URLにアクセスすると以下のような画面になる！
`Rails側` と `ローカルのPostgreSQLの接続` が上手くいってないっぽい...

![スクリーンショット 2018-11-26 18.39.46.png](https://qiita-image-store.s3.amazonaws.com/0/222024/8122499a-0972-84aa-8977-c72e7f4ca2a4.png)

## 手順1 : psコマンド

`ps aux | grep 確認したいプロセス名` で現在の起動状態を確認する

```
$ ps aux | grep postgres
fuqda   2272   0.0  0.0  4286184    904 s000  R+    6:42PM   0:00.00 grep --color=auto postgres
```
`grep --color=auto postgres` とだけ表示されている場合は、
先ほどのコマンドのプロセスだけが見つかったということなので　`postgres` 本体は動いてないことを確認 :skull: 

## 手順2 : tailコマンド

`tail` コマンドで `postgres` が起動された時に作られるファイルの存在を確認する

```
$ tail /usr/local/var/postgres/server.log
2017-12-18 17:18:51.032 JST [31764] FATAL:  lock file "postmaster.pid" already exists
2017-12-18 17:18:51.032 JST [31764] HINT:  Is another postmaster (PID 31311) running in data directory "/usr/local/var/postgres"?
```

`lock file "postmaster.pid" already exists` が表示されたので、 
`postgres` が正常に終了した場合に消される、プロセスが存在することを表すファイルが残ってしまっていることがわかる

## 手順3 : rmでゴミファイルを消す

とりあえずそのゴミファイル(`postmaster.pid`)を消す

```
$ rm /usr/local/var/postgres/postmaster.pid
```

## 手順4 ： launchctlコマンドでpostgresql.plistファイルをロードし直す

```
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

```
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

## 手順5 : psコマンドで再度postgresの起動を確認

```
$ ps aux | grep postgres
fuqda   2569   0.0  0.0  4287208    936 s000  S+    6:44PM   0:00.01 grep --color=auto postgres
fuqda   2533   0.0  0.0  4449164   1644   ??  Ss    6:44PM   0:00.00 postgres: bgworker: logical replication launcher
fuqda   2532   0.0  0.0  4304096    924   ??  Ss    6:44PM   0:00.00 postgres: stats collector process
fuqda   2531   0.0  0.0  4449164   1856   ??  Ss    6:44PM   0:00.00 postgres: autovacuum launcher process
fuqda   2530   0.0  0.0  4449164   1108   ??  Ss    6:44PM   0:00.00 postgres: wal writer process
fuqda   2529   0.0  0.0  4449164   1160   ??  Ss    6:44PM   0:00.00 postgres: writer process
fuqda   2528   0.0  0.0  4449164   1060   ??  Ss    6:44PM   0:00.00 postgres: checkpointer process
fuqda   2523   0.0  0.1  4449420  17012   ??  S     6:44PM   0:00.04 /usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres
```

これでOK
Elasticsearch 6.5 Backup and Restore

# Elasticsearch Backup and Restore

Elasticsearch でバックアップとリストアをさくっとやる方法です。
ちなみにElasticsearchではsnapshotというのが正解ぽいですが、面倒なんでバックアップで。

OS コマンドラインは Ubuntu 16.04/18.04 あたり準拠です。

## 1. Backup

### 1.1. バックアップ PATH の追加

バックアップディレクトリを [elastcsearch:elasticsearch] のユーザ権限で予め作成しておきます。

バックアップ（スナップショット）が吐かれる場所の設定です。
S3とかに吐き出すモジュールとかもあるので、そのうち書きたいと思います。

```/etc/elasticsearch/elasticsearch.yml
#
# Path to snapshot
#
path.repo: ["<path to backup>"]
```

### 1.2. 再起動しよう

バックアップ PATH の反映しましょう。

```
> systemctl restart elasticsearch.service
```

### 1.3. バックアップのレポジトリ設定

バックアップ（スナップショット）のレポジトリ設定しておきます。
この際に、バックアップ PATH がないと（確か）怒られます。

```
> curl -XPUT localhost:9200/_snapshot/<レポジトリ名> -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "<path to backup>"
  }
}'
```

### 1.4. バックアップしよう

全部取るように書いてあるので、* のとこを indices 名にすれば、それが取れるはずです。はず。
`,`区切りとかにすればその分の indices が取れるはずです。はず。

```
> curl -XPUT localhost:9200/_snapshot/<レポジトリ名>/<バックアップ名>?pretty&wait_for_completion=true -H 'Content-Type: application/json' -d '{
    "indices": "*",
    "ignore_unavailable": "true",
    "include_global_state": false
 }'
```

### 1.5. バックアップしたやつをドナドナする

適当にバックアップディレクトリを tar とかで固めて、リストアしたいサーバとかに持ってきましょう。
もちろん、持ってかなくてもそのサーバだけで使ってもOKです。

## 2. Restore

バックアップしたので、リストアもしとかないとってことで、リストアします。

### 2.1. リストア側にバックアップ PATH を追加

バックアップディレクトリを [elastcsearch:elasticsearch] のユーザ権限で予め作成しておきます。

1.1 と同じです。

```/etc/elasticsearch/elasticsearch.yml
#
# Path to snapshot
#
path.repo: ["<path to backup>"]
```

### 2.2. 再起動してみる

1.2 と同じですね。

```
> systemctl restart elasticsearch.service
```

### 2.3. バックアップのレポジトリ設定

1.3 と同じ・・・

```
> curl -XPUT localhost:9200/_snapshot/<レポジトリ名> -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "<path to backup>"
  }
}'
```

### 2.4. リストアしよう

リストアしてみます。

```
>  curl -XPOST localhost:9200/_snapshot/<レポジトリ名>/<バックアップ名>/_restore
```

## 3. おまけ

レポジトリとかバックアップの一覧とか見るには。

### 3.1. レポジトリ一覧

```
> curl -XGET localhost:9200/_cat/repositories?v
id       type
snapshot   fs
```

### 3.2. バックアップ一覧

レポジトリ名：snapshot の場合

```
> curl -XGET localhost:9200/_cat/snapshots/snapshot?v
id             status start_epoch start_time end_epoch  end_time duration indices successful_shards failed_shards total_shards
snapshot_1    SUCCESS 1531294342  07:32:22   1531294427 07:33:47     1.4m     395              1955             0         1955
snapshot_2    SUCCESS 1542699331  07:35:31   1542699561 07:39:21     3.8m     880              4396             0         4396
```

## 4. 参照

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html
ループ処理の進捗を確認するためにプログレスバーを表示する

# はじめに
先日、pythonでデータの整形をする際、for分を回す場面があったのですが、予想以上に処理が重く6分程度かかるforを回していました。長い処理をさせると、フリーズしているのでないか不安になりますので、プログレスバーを表示させたいと思いました。

# 参考
- https://github.com/tqdm/tqdm/blob/master/README.rst

# 手順
`tqdm`モジュールを使用します。

```python
from tqdm import tqdm
import time

for i in tqdm(range(365)):
    # ここに処理を書く

# 下記のようなプログレスバーが表示される
#  55%|█████▌    | 202/365 [04:57<04:03,  1.50s/it]
```
下記でも同じことが実現できます。

```python
for i in trange(365):
    # ここに処理を書く
```
`tarange`は`tqdm(range(i))`の最適化されたインスタンスです。


forループでは要素と同時にインデックスを取得したい場合があります。`enumerate`を使用する場合は、`enumerate(tqdm(...))`と書きます。`tqdm(enumerate(...))`ではないようです。

```python
for i,j in enumerate(tqdm(range(100))): # iがenumerate、jがrange
    # ここに処理を書く
```

ネストのループにも対応しています。

```python
from tqdm import trange
from time import sleep

for i in trange(10, desc='1st loop'):
    for j in trange(5, desc='2nd loop', leave=False):
        for k in trange(100, desc='3nd loop'):
            # ここに処理を書く
```
`desc`はプログレスバーのプレフィックスです。`leave`をTrueにするとループが終わるまでプログレスバーが進み続けます。

pandasの`apply`にもプログレスバーを表示させることができます。

```python
import pandas as pd
import numpy as np
from tqdm import tqdm

df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))

# Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm`
# (can use `tqdm_gui`, `tqdm_notebook`, optional kwargs, etc.)
tqdm.pandas(desc="my bar!")

# Now you can use `progress_apply` instead of `apply`
# and `progress_map` instead of `map`
df.progress_apply(lambda x: x**2)
# can also groupby:
# df.groupby(0).progress_apply(lambda x: x**2)
```

jupyter notebookを使用している場合は、グラフィカルなプログレスバーが表示されます。

```python
from tqdm import tnrange, tqdm_notebook
from time import sleep

for i in tnrange(10, desc='1st loop'):
    for j in tqdm_notebook(xrange(100), desc='2nd loop'):
        sleep(0.01)
```
Concourseって何？

そもそもこのカレンダーの題材であるConcourseとは何なのかを説明します。
🙆話すこと

* Concourseの概要や特徴

🙅話さないこと

* Concourseの用語(Resource, Job, Task, etc.)の詳細な説明
* 他CI/CDツールとの詳細な比較

## Concourseとは
GitHub: [concourse/concourse: Concourse CI](https://github.com/concourse/concourse)	
Doc: [Concourse CI - Docs](https://concourse-ci.org/)	

Concourseは、Goで書かれたパイプラインベースのCI/CDツールです。
Cocnourseの特徴をまとめていきます。
詳細は[Concourse CI - Docs](https://concourse-ci.org/) をご覧ください。

### Configration As Code
パイプラインをコードとして管理することができます。
以下が例です。

```yml:pipeline.yml
resources:
- name: booklit
  type: git
  source: {uri: "https://github.com/vito/booklit"}

jobs:
- name: unit
  plan:
  - get: booklit
    trigger: true
  - task: test
    file: booklit/ci/test.yml
```
このようなコードをgit等にpushしておくと、チームメンバーの誰でもパイプラインを構築、編集することができます。

### Fancy Visualization
WebUIでパイプラインが可視化されます。
下図がConcourseのWebUIです。

![concourse-gif](https://cdn-images-1.medium.com/max/800/1*X6r-1g6RYCymUsrVjtbQhA.gif)
[Concourse Pipeline UI Explained – Concourse CI – Medium](https://medium.com/concourse-ci/concourse-pipeline-ui-explained-87dfeea83553) 

パイプラインの進行状況、失敗箇所がわかりやすいです。
(あとかっこいい、なんとなく画面を出しておくとドヤれそう)


### CI Under Source Control
`fly`というcliが提供されています。
`fly set-pipeline`コマンドでpipelineをconcourseにsetします。

```
$ fly -t ci set-pipeline -p booklit -c pipeline.yml
```

この特徴の利点は気軽にパイプラインの開発ができるというところです。
大抵のciツールはgit等と連携し、コミットし、そのコードがマージされるまでパイプラインに反映されることはありません。
パイプラインが正常に動作するようになるまで、ひたすらコミット/PRを量産した経験ないですか？
Concourseでは、手元のコードを元にパイプラインをsetできるため、開発を柔軟に行うことが可能です。

### Reproducible, Debuggable Builds
全てはコンテナ上で実行されるため、まっさらな環境での動作が保証されています。
(実行に必要なDockerImageも任意のものを指定することができます。)
これによりスノーフレーク化されたサーバをなくすことができるということが利点の1つとされています。(参考: [パイプラインベースのCI/CDツール、Concourseとは？ \| Think IT（シンクイット）](https://thinkit.co.jp/article/11556))

また、実行コンテナに入ることが可能であるため、パイプラインのデバッグが容易です。

多くのCIツールは、実行の失敗のログを見ることは可能ですが、実行環境で任意のコマンドを実行することはできません。

### Rapid Local Iteration
パイプラインをConcourseにsetしなくても、手元で動作を検証することが可能です。
`fly execute`というコマンドを利用するのですが、今回は説明を省きます。

都度都度commitをしたり、gitにpushしたりする必要がないし、ビルドログの汚染を防ぐこともできます。

### Bring Your Own Integrations
Concourseには複雑なプラグインシステムは存在しません。
しかし、単一の強力な抽象概念があります。
それが`Resource`と呼ばれるものです。
このResourceは、指定したリソースの変更を監視したり、リソースを取得, 更新することができます。

Resourceにはビルドインされたものとカスタムされたものがあります。
ビルドインResourceは以下のようなものがあります。

* [concourse/git-resource: tracks commits in a branch of a Git repository](https://github.com/concourse/git-resource)
* [concourse/docker-image-resource: a resource for docker images](https://github.com/concourse/docker-image-resource)
* etc.

これらはビルドインされているため、Concourseのバージョンによって使用できるバージョンが決まっています。

カスタムResourceも非常に豊富です。例としては以下のようなののがあります。

* [cloudfoundry\-community/slack\-notification\-resource: Concourse CI resource for sending notifications to Slack\.](https://github.com/cloudfoundry-community/slack-notification-resource)
* [spring\-io/artifactory\-resource](https://github.com/spring-io/artifactory-resource)
* [concourse/concourse\-pipeline\-resource: Concourse resource for interacting with concourse pipelines](https://github.com/concourse/concourse-pipeline-resource)
* etc.

もちろん自分で実装することもできます。
そのガイドについて後半のアドベンドカレンダーでまとめるつもりです。

## まとめ
ConcourseはパイプラインベースのCI/CDツールです。
見やすくかっこいいUI、パイプライン自体の開発が柔軟、周辺Componentの開発も容易なことが特徴です。
Railsアプリケーションでレコードを任意の順番にソートする

RailsアプリケーションでDBから取得したデータを意味を持った順番としてソートしたい時はorderメソッドだけでは対応できないことがあります。

例えば、商品(item)に関連するモデルのステータス定義が以下のようになっているアプリケーションがあるときに、「発売予定」というステータスを追加して、表示順を「発売予定→販売中→売り切れ」にするという対応を行う場合です。

```item.rb
class Item < ApplicationRecord
  enum status: {
    on_sale:  0,　   # 販売中
    sold_out: 1,　   # 売り切れ
  }
end
```

##ステータスの値を直す
そもそもステータスが後ろにしか追加できない設計になっているものがよくないため、enumのvalueを１区切りにせずに最低でも10区切りにして間に差し込めるようにしておくことがより良い実装です。

このようにしておけば「発売予定→販売中→売り切れ」のソートに対応することは容易にできます。

```item.rb
class Item < ApplicationRecord
  enum status: {
    plan_to_sell: 5,  # 販売予定
    on_sale:  10,　    # 販売中
    sold_out: 20,　    # 売り切れ
  }
end
```

ですが、運用されているサービスを停止せずにこのような変更を行ってしまうとサービスのデプロイの最中に商品が購入されてステータスが変更されてしまったときに不具合が発生してしまう恐れがあります。


## Gemを使う
[order_as_specified](https://github.com/panorama-ed/order_as_specified)というGemを使うと、以下のような定義なら

```item.rb
class Item < ApplicationRecord
  extend OrderAsSpecified

  enum status: {
    on_sale:  0,　    # 販売中
    sold_out: 1,　    # 売り切れ
    plan_to_sell: 2,  # 販売予定
  }
end
```

```ruby
Item.order_as_specified(status: [2, 0, 1])
```

とすることで「発売予定→販売中→売り切れ」に並び替えて取得することができます。
ハッシュでeach.with_indexしたいです。

# ハッシュでeach.with_indexしたい時

## 結論(本項目より後はポエムです)
```Ruby
hash = { a: 1, b: 2 }
hash.each.with_index(1) do |(key, value), index|
  # do something
end
```
で ok :ok_hand: 
( 1周目中 →　index = 1 とする時)

## 経緯
`array.each.with_index` 
を半年弱Rubyを触っていたのに知らず（バカ）、
他人のコードを見ていて知り、一目惚れしました。。。
(それまでは、ループ外でcountを宣言して、都度 += １ していました)

最近知ったことはすぐ使いたくなる質なので
絶対使いたいと思って居たところで、
いざHashをeachするときに使おうと思ったら使えずに困ったときの話です。


```Ruby
# 知ってる
array = [1, 2, 3]
array.each do |v|
  # do something
end

# 知ってる
array.each.with_index do |v, index|
  # do something
end

# 知ってる
hash = { a: 1, b: 2 }
hash.each do |key, value|
  # do something
end

# という流れから、hashにeach.with_indexする場合を予想 
hash.each.with_index do |key, value, index|
  # do something
end
```

だろうと思った。

→　 `hash.each.with_index` が思うように動かない :cry: 
→　なんかvalueがおかしいしindexもおかしいしなんならkeyもおかしい :sob: 

とりあえず、適当に動作確認しました。

```Ruby
a = {:key => ['va','lu','e']}

# ()で囲わないと、1つ目の引数にhashをflattenしたみたいなやつが来る
a.each.with_index do |k,v,i|
  p k
  p v
  p i
end
#=>
[:key, ["va", "lu", "e"]] 
0
nil
```

なんかよくわからないですが、 `a.each.with_index do |k,v,i|` が間違えていることだけはわかったので、
とりあえず`Hash each with index` でググって一番上のページを見ましたら解決しました。
(記事下部に参考サイトとしてリンクを貼らせていただきました)

```Ruby

# やりたかったこと
a.each.with_index do |(k, v),i|
  p k
  p v
  p i
end

#=>
:key
["va", "lu", "e"]
0

# with_index(offset = 0)なので、1から数えたいときはoffsetに1を渡す
a.each.with_index(1) do |(k, v),i|
  p k
  p v
  p i
end
#=>
:key
["va", "lu", "e"]
1
```

## 蛇足(考察など)
```Ruby
a.each do |k|
  p k
end
# =>
[:key, ["va", "lu", "e"]]
```
落ち着いて見直すと
`k, v` を( )で囲わなかったときはこれと同じ挙動を示している。
多分( )で明示してここまでが引数だよと教えないと、
`|k, v, i|` の場合、kで諦めてしまうんだと思う。
そういう流れHashについてはｋで諦めたので、本来iに入れたかったものがvに入る。
だからvが0でiがnilになってる。（予想）
[Enumerator#with_index]
(https://docs.ruby-lang.org/ja/latest/method/Enumerator/i/with_index.html)
を見ると
`with_index(offset = 0) {|(*args), idx| ... } -> object`
となっているし、多分、index以外の引数はカッコで括る必要がありそう。

ただ、そもそもなぜ `hash.each do |k|` で kにflattenなやつが来るのか分かっていない。
多重代入への理解が無いせいで理解ができないのかもしれないので、
詳しくはまた調べてわかったら追記しようと思う。

### 追記
> ただ、そもそもなぜ `hash.each do |k|` で kにflattenなやつが来るのか分かっていない。

Hash#eachはkey,valueを渡す。
この時受け手が1つだと、たくさん渡された値を配列にして受け手が受け取る
flattenみたいなやつ思ってたやつは以下のような流れで出てきた奴だった。

```ruby
hash = {:a => ['b', 'c']}
a = :a , hash[:a]
p a
#=>  [:a, ["b", "c"]]
```
index以外を( )で括る必要があるのは、正確にはhashだからではなく、
index以外の引数が複数あるからで、
複数あるなら( )でくくって渡すのが括弧で括るのがwith_indexの仕様のようだった。

## 参考にさせていただいたサイト様
[ハッシュからeach_with_indexでkeyとvalとindexを取り出す。](http://bismar.hatenablog.com/entry/2012/12/01/215111)
(こちらはeach_with_indexの話ですが、each.with_indexも同じみたいです)
each.with_indexだとoffsetを渡せるので、ちょっと強いかなと思ってます。

## 謝辞
仔細な説明をくださった　scivola さん、
記事の修正をくださった　jnchito さん。
ありがとうございました。
ローカルにRailsチュートリアル開発環境を作る

# Railsチュートリアルの開発環境をローカルで構築
ローカル開発環境でRailsチュートリアルを復習する際に、少しハマってしまいました。
うまく行ったサンプルアプリの作成方法を備忘録として残して置こうと思います。
ここでは第１章のhello_appをローカルで作成してみます。

## rbenvとbundleを利用してアプリを作成
ruby環境を汚さずにrailsアプリを作成していきます。
rbenvとbundleのインストールやrailsアプリの作成方法は以下を参考にさせていただきました。

・rbenv インストールから Bundler を使用した Rails のローカルインストールと起動まで
https://qiita.com/egopro/items/aba12261c053eecd6d19

・Rails開発環境の構築（rbenvでRuby導入からBundler、Rails導入まで）（Macport編）
https://qiita.com/emadurandal/items/a60886152a4c99ce1017

まずは適当なディレクトリを作成します。

```
$ mkdir ~/environment
$ cd ~/environment
```

次にbundleでrailsをインストールするためのGemfileを作成します。

```
$ bundle init
```

vimなどのテキストエディタで先程のbundle initで作成されたGemfileを編集します。
最後の行をコメントアウトして、railsのバージョンを指定してあげます。
railsチュートリアルでは5.1.6を利用しています。

```
frozen_string_literal: true
  
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
↓
gem "rails", "5.1.6"
```

サンプルアプリを作りましょう！
--skip-bundle等を忘れずに！

```
$ bundle exec rails _5.1.6_ new hello_app
$ cd hello_app
```

できたhello_appはほとんど何も入ってません。
作成されたhello_appの直下にあるGemfileの中身をRailsチュートリアルのGemfileリストに置き換えて
再びbundle installしましょう！

```ruby
source 'https://rubygems.org'

gem 'rails',        '5.1.6'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.6.4'

group :development, :test do
  gem 'sqlite3',      '1.3.13'
  gem 'byebug', '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

```
$ bundle install --path vendor/bundle
```

無事にインストールが終わったら、rails sでYay! You’re on Rails!
チュートリアルの道は険しいけれどがんばろう！

```
$ bundle exec rails s
```
日付でfor文を回す方法

# はじめに
データ分析をしていると、日付をイテレーションして処理をしたいことがあります。日付データで`range`ってどうやるんだ？と思ったので調べました。

# 手順
最初は少し戸惑ったのですが、下記のような基本的な書き方をすればいいのだとわかりました。

最初の日付と最後の日付の差分日数をとり、rangeでイテレータを生成します。forを回すときに、`timedelta`を使用して、最初の日付に足していくことで、日付ごとの処理をすることができます。

```python
from datetime import date, timedelta
d1 = date(2017,4,1)
d2 = date(2018,3,31)

for i in range((d2 - d1).days + 1):
    date = d1 + timedelta(i)
    # dateを使った処理
```


---
*2018/12/3(月)追記*
c-yanさんに下記のようなアドバイス頂きましたので追記します。
ジェネレータ化することで再利用しやすい形になりました。

```python
from datetime import date, timedelta

def date_range(start, stop, step = timedelta(1)):
    current = start
    while current < stop:
        yield current
        current += step

for date in date_range(date(2017, 4, 1), date(2017, 4, 5)):
    # dateを使った処理
      print(d)

# 2017-04-01
# 2017-04-02
# 2017-04-03
# 2017-04-04
```
---
座標から国コードを取得する方法

# はじめに
座標（緯度、経度）からその地点の国情報を知りたいときに、標準APIだけでできないか調べてみました。

いままでは現在位置から国を判別したいときに、Google Reverse Geocodingを使用していましたが、
有料化になったため、代替案がないかを知りたかったからです。

# 実装
CoreLocation FrameworkにCLGeocoderクラスに逆ジオコーディングできるメソッドがあります。

``` ObjC
    CLGeocoder *geocoding = [[CLGeocoder alloc] init];
    CLLocation *location = [[CLLocation alloc] initWithLatitude:35.169688 longitude:136.899713];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [geocoding reverseGeocodeLocation:location preferredLocale:locale completionHandler:^(NSArray< CLPlacemark *> * __nullable placemarks, NSError * __nullable error) {
        CLPlacemark *placemark = placemarks.firstObject;
        NSLog(@"country:%@", placemark.country);
        NSLog(@"isoCountryCode:%@", placemark.ISOcountryCode);
    }];

```

# 参考
[reverseGeocodeLocation(_:completionHandler:) - CLGeocoder | Apple Developer Documentation](https://developer.apple.com/documentation/corelocation/clgeocoder/1423621-reversegeocodelocation)
[ios - Find city name and country from latitude and longitude in Swift - Stack Overflow](https://stackoverflow.com/a/44032075)
Vue.jsのプロジェクトでeslintのバージョンをv3→v4に上げようとしてハマったこと

## 起こったこと

他のチームから引き継いだVue.jsのプロジェクトで、`node_modules`内の各ライブラリのバージョンを上げる作業をしました。
（最新はv5ですが、他ライブラリとの依存の関係でv4までしか上げられず。）

とりあえず`package.json`の`eslint`を"^4.0.0"に上げ、また他の`eslint`系の既存ライブラリたちも適宜バージョンを上げました。


```json:package.json（devDependencies内、eslint関連のライブラリのみ抜粋）
    "eslint": "^4.0.0",
    "eslint-config-standard": "^10.2.1",
    "eslint-friendly-formatter": "^4.0.1",
    "eslint-loader": "^2.1.1",
    "eslint-plugin-html": "^5.0.0",
    "eslint-plugin-import": "^2.14.0",
    "eslint-plugin-node": "^8.0.0",
    "eslint-plugin-promise": "^4.0.1",
    "eslint-plugin-standard": "^3.1.0",
```

`eslint`コマンドを実行したところ以下のエラーが発生。

```
> 1 | <!-- COMMENTCOMMENTCOMMENTCOMMENTCOMMENT -->
    | ^
  2 | <template>
  src\components\foo\FooBar.vue:1:1
  <!-- COMMENTCOMMENTCOMMENTCOMMENTCOMMENT -->
   ^

✘ 1 problem (1 error, 0 warnings)

Errors:
  1  http://eslint.org/docs/rules/null
    at emitError (C:\Users\miyashiiii\MyProject\node_modules\webpack\lib\NormalModule.js:123:22)
    at printLinterOutput (C:\Users\miyashiiii\MyProject\node_modules\eslint-loader\index.js:128:9)
    at Object.module.exports (C:\Users\miyashiiii\MyProject\node_modules\eslint-loader\index.js:248:3)
 @ ./node_modules/extract-text-webpack-plugin/dist/loader.js??ref--6-0!./node_modules/vue-style-loader!./node_modules/css-loader??ref--6-2!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/login/StressLogin.vue?vue&type=style&index=0&id=c950f03c&scoped=true&lang=css&
 @ ./src/components/foo/FooBar.vue?vue&type=style&index=0&id=c950f03c&scoped=true&lang=css&
 @ ./src/components/foo/FooBar.vue
 @ ./node_modules/babel-loader/lib??ref--2!./node_modules/vue-loader/lib??vue-loader-options!./src/components/top/TopManager.vue?vue&type=script&lang=js&
 @ ./src/components/top/TopManager.vue?vue&type=script&lang=js&
 @ ./src/components/top/TopManager.vue
 @ ./node_modules/babel-loader/lib??ref--2!./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=script&lang=js&
 @ ./src/App.vue?vue&type=script&lang=js&
 @ ./src/App.vue
 @ ./src/main.js
```

1行目でいきなり怒られているあたり、`.vue`ファイルを`.vue`ファイルとして扱ってくれていない……？
というかeslint系のライブラリにvueっぽいものが入ってないけど、いままでどうやってvueを扱っていたんだ？

## 対処

いろいろ調べているうちに行き着いた`eslint-plugin-html`のGithubに[それっぽいissue](https://github.com/BenoitZugmeyer/eslint-plugin-html/issues/103)がありました。

スーパーざっくりまとめると、「`eslint-plugin-html`って、Vue.jsのプロジェクトだと`eslint-plugin-vue`と競合しない？v5からは.vueサポートするのやめない？」みたいな話っぽい。
（Vue.jsの知見も英語の知見もないので、間違っていたら教えてください。）

確認すると、今回`eslint-plugin-html`のバージョンは３系から５系に上げているためvue非対応となっていた。

そのため、`eslint-plugin-vue`を`package.json`に追加し、[README](https://www.npmjs.com/package/eslint-plugin-vue)を参考にもろもろの設定をしたら無事にlintが通りました。
（今までvueファイルはhtml部分以外lintかけていなかった……？）

既存プロジェクトの改修等で同じような現象が発生した方の参考になれば幸いです。