OmniAICreator/Qiita-1.07M huggingface dataset:
yumがepelのmirrorにつながんねーよと怒ってる時の対処法

# 事象
新しくインスタンスを建てたので、yumでパッケージをアプデしようとしたところ

```
# yum -y update && yum -y groupinstall "Development Tools"
読み込んだプラグイン:fastestmirror, langpacks
base                                                     | 3.6 kB     00:00     
epel/x86_64/metalink                                     | 5.2 kB     00:00     
epel                                                     | 4.3 kB     00:00     
http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
他のミラーを試します。
epel                                                     | 4.3 kB     00:00     
http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
他のミラーを試します。
epel                                                     | 4.3 kB     00:00     
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
他のミラーを試します。

```

という表示になった。
最初はNWの問題かと思い応答を確認したが特に問題はなく、
よくエラーを見たら `repomd.xml does not match metalink for epel` と書かれているため、
どうやらサーバには繋がっているもののメタリンクの整合性が取れないということでエラーが出ているようだった。

# 対処
http://monakaice88.hatenablog.com/entry/2016/10/30/101409

にかかれていた方法を使い解決。

`/etc/yum.repos.d/epel.repo`について以下のように変更

```
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
```
ぼくはいかにして遅く不安定だった自宅のネットを150Mbpsまで高速化したのか

ぼくは仕事でリモートデスクトップを使うことが多く、pingの応答速度も通信速度もかなり重要です。速度遅い（22時とかだと1Mbpsを切ることもあった）、ping遅い（100msはザラ）、パケットロス多発（50%以上のパケットが葬り去られることもあった）というひどい環境でしたが、いろいろ調べながら改善しました。

現在、自宅のネット環境はWi-Fiにもかかわらずこの速度が出ています。

```
------ BNRスピードテスト (ダウンロード速度) ------
測定サイト： http://www.musen-lan.com/speed/ Ver5.6001
測定日時： 2016/12/16 11:40:49
回線/ISP/地域： 
--------------------------------------------------
1.NTTPC(WebARENA)1： 84.35Mbps (10.53MB/sec)
2.NTTPC(WebARENA)2： 152.86Mbps (19.10MB/sec)
推定転送速度： 152.86Mbps (19.10MB/sec)
```

この記事では、主にWi-Fiの品質低下の原因になりそうなことをまとめ、「どこをチェックしていったか」「何をしたか」を書いてみます。専門分野ではないので、おかしなことを書いていたらコメントか編集リクエストをください。

この記事は Shinosaka.wifi じゃなかった、 [Shinosaka.rb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/shinosakarb) の16日目の記事です。

## 電波の種類

対応していない古い機器はつなげないかもしれませんが、5GHzのIEEE802.11nを使いましょう。手持ちのプリンタは対応していなかったので、2.4GHz帯の電波と両方出せるTime Capsuleを使い、機器によって接続先を切り替えています。2.4GHzは電子レンジとかと干渉しやすく、遅いです。

## チャンネル

周囲のWi-Fiの電波を見ながら、あまりかぶっていないChannelを明示的に指定します。周辺のWi-Fiの調査には[WiFi Explorer](https://itunes.apple.com/jp/app/wifi-explorer/id494803304?mt=12)を使いました。

ぼくはTime Capsuleユーザーなので、Airmacユーティリティで設定しました（すげー速くなったから、最速の動物のFalconという名前になっていますｗｗｗ厨二っぽくてごめんｗｗｗ）。

<img alt="" src="https://qiita-image-store.s3.amazonaws.com/0/19478/757b6a14-5021-cc95-e0d1-4097c0ac28ba.png">

## 有線・別のルーターで試す

これでも遅い場合、Wi-Fiではなく有線や別のルーターで試して原因の切り分けをします。

## 回線事業者・プロバイダ

これでも遅い場合、回線事業者やプロバイダを疑います。NTTのフレッツ光とかの場合、フレッツ光はそのままに、PPPoEの設定をいじるだけで工事不要でプロバイダだけ切り替えられます。

基本的に速度に問題があると問い合わせても、「ベストエフォート」という言葉を盾にとくに改善はしてくれないので時間の無駄です。遅いと感じたらすぐ解約するのがポイント。大手だから安心とかは全く関係ない。Oから始まる某大手は遅いことで有名だったりします。また、品質の保証がないくせに最低利用期間はあったり、ええ商売しとるなーと思います。

地域によって異なると思うので一概におすすめプロバイダは言えないのですが、最低利用期間が（少）なく、PPPoEのIDが即発行され、試験的に使いやすい良心的プロバイダは下記くらいと思います。

- [GMOとくとくBB](http://gmobb.jp/)
- [BB.Excite](http://bb.excite.co.jp/)

プロバイダは遅いところが多く、契約解除料を万単位ではたいてたくさん渡り歩きましたが、今では快適です。

## ぼくの出した結論

- どうしても遅いならプロバイダ即解約しろ（問い合わせるのは時間の無駄）
- 最低利用期間もある中でのプロバイダ選びはもはやガチャ
ややこしいコマンドを覚えられないので、簡単に叩けるようにエイリアス作っておく


## エピソード

ruby on rails でチーム開発を始めたのですが、
他人の作成したプロジェクトを落としてきて、

rails s したら

```
The 'rails' command exists in these Ruby versions:
  2.0.0-p647
```

って怒られ。
いや、僕のサンプルプロジェクトはrails sできるぞ！rails は入ってるはず！と思いましたが、

色々調べてたら、rubyのバージョンを複数使ってるとrubyバージョン各々にgemが必要なようで。
rails sするとシステムのデフォルトが使われるっぽい。
僕の場合

* global -> 2.0.0
* project -> 2.2.2

プロジェクトフォルダ内部にある方を使うときは```bundler exec rails s```で起動しないとダメだったらしく。


でも、こんなややこしいコマンド無理。
明日には忘れる。
が、今後も絶対使いまくる...

そうだ！エイリアス作ろ！

エイリアス、今までは環境変わったらデフォルトコマンド叩くハメになるし、デフォルトを覚えたほうがいいだろと思ってたけど、これは無理！

長々と書きましたがいざ本題へ。


## aliasを書き連ねる定義ファイルを作成する

.bashrcを編集

```
vi ~/.bashrc
```

* 書き方

```
alias エイリアス名='コマンド'
```


```.bashrc
alias railsup='bundler exec rails s'
```

こいつを追加

エイリアス名に半角スペースはつけられない模様（怒られ済み）

## ログイン時にのみ実行されるbash_profileを編集

bash_profileを編集

```
vi ~/.bash_profile
```


```.bash_profile
# .bashrc
source ~/.bashrc
```

こんな感じで追加。


## 適用

```
source ~/.bash_profile
```

fooo!　railsup コマンド使える！

または、

```
exit
```

してログアウトし、ログインし直してもOK。

自分の.bashrcさえ、適用させれば他環境でも大丈夫そうだね。

もうこれからは、エイリアス作りマクロ。


## thanks 
// .bash_profile .bashrc
http://qiita.com/magicant/items/d3bb7ea1192e63fba850

// alias
http://qiita.com/YusukeHigaki/items/67a17995c8a4e1329d11

// rails command 
http://qiita.com/Azunyan/items/e22f1e9f2ba238bc72d0
tmux で $TERM_PROGRAM が受け継がれず iTerm2 かどうか判別がつかなくて困った時の解決法

macOS 環境では，`$TERM_PROGRAM` という環境変数にターミナル名が入っています．

- Terminal.app

```sh
$ echo $TERM_PROGRAM
# => Apple_Terminal
```

- iTerm2.app

```sh
$ echo $TERM_PROGRAM
# => iTerm.app
```

普段は気にする必要はないのですが，24bit 色サポートが iTerm のみなので Vim の設定で現在のターミナルを知る必要が生じました．

僕は日頃から tmux を常用しているのですが，ここで問題が1つあります．tmux は環境変数をクリアしてしまい，iTerm2 上であっても tmux 起動後は `$TERM_PROGRAM` が `Apple_Terminal` になってしまいます．これは iTerm2 が起動時に行っている `$TERM_PROGRAM` の上書きが行われないためです．なので，.tmux.conf に明示的に「`$TERM_PROGRAM` を tmux 起動後のシェルに forward してね」という設定を書く必要があります．tmux は ssh 関連の環境変数や `$DISPLAY` などいくつかはデフォルトで環境変数をセットしてくれますが，それ以外は手で .tmux.conf に指定する必要があるようです．

tmux 内のシェルにセットされる環境変数を起動時や attach 時に更新するには `update-environment` にスペース区切りの環境変数を指定する必要があります．デフォルト値を壊すといけないので `-a` オプションを使って追記します．

```
set -ga update-environment " TERM_PROGRAM"
```

セットされている環境変数は下記のコマンドで一覧できます

```
$ tmux show-environment
```

これで Vim の設定も下記のように書けば良くなりました．

```vim
if has('termguicolors') && $TERM_PROGRAM ==# 'iTerm.app'
    let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
    let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
    set termguicolors
endif
```
BigQueryのStandardSQL/LegacySQLの切り替え

# BigQueryのSQL文法

BigQueryのSQL文法には、以下の2つが存在しています。

1. BigQuery独特の文法(Legacy SQL)
2. 標準SQL(Stadard SQL)

BigQueryでは、サービス当初から、FROM句にカンマ区切りでテーブルを並べるとUNIONになる等の、かなり特殊な方言をもつ独特の文法のSQL(Legacy SQL)が使われていましたが、2016/11/30のバージョンアップで、標準SQL(Standard SQL)が正式リリースされ、従来のSQL文法および標準SQLが両方共利用可能となりました。

# SQL文法の切り替え方法

2つの文法は、クエリー実行時に以下の方法で切り替えることができます。

## (1) APIアクセス時に configuration.query.useLegacySql に true/false を指定する

WebUI からSQLを実行する場合は、[Show Options] の [SQL Version] の [use Legacy SQL] をチェックする(デフォルトでチェックされている)と従来の文法(Legacy SQL)で実行され、チェックを外すと標準SQL(Standard SQL)で実行されます。

![bq_show_options.png](https://qiita-image-store.s3.amazonaws.com/0/111934/e4ee6636-524e-4ec6-0e6e-9d2f6d95d3d8.png)

## (2) 実行するSQL自体にコメントを付ける

実行するSQLの先頭に以下の2つのコメントをつけると切り替えることができます。

* #legacySQL
* #standardSQL

WebUI からSQLを実行する場合でも、SQLの入力エリアにこのコメントを付けた状態で記述すると、(1)で説明した[use Legacy SQL] のオプションの設定にかかわらず、コメントで指定した方の文法で実行されます。

![bq_standard_sql.png](https://qiita-image-store.s3.amazonaws.com/0/111934/e16049f6-8f71-a41c-e3e2-224fb8852083.png)

# 最後に

オンラインマニュアルの該当箇所に上記の説明がありますので、あわせて確認しておくほうがいいかもしれません。

[Enabling Standard SQL] (https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql)
VyOSの設定をコマンドでエクスポート→インポートする

# 目的
設定ファイルの一部をコピーしたり、ループで回したい。

# 方法
## エクスポート
操作モード(operational mode) 設定モード(configuration mode)どちらでもいい。
`/opt/vyatta/sbin/vyatta-config-gen-sets.pl /config/config.boot`

結果

```
set service dns forwarding cache-size '0'
set service dns forwarding listen-on 'eth0'
set service dns forwarding listen-on 'eth1'
...
```

## インポート
適当にファイルを作成し、実行する。

```bash

#!/bin/vbash
source /opt/vyatta/etc/functions/script-template
 
set service dns forwarding cache-size '0'
set service dns forwarding listen-on 'eth0'
set service dns forwarding listen-on 'eth1'

commit; save
```

# 参考
+ [Vyattaの設定をコマンド形式でエクスポートする方法](http://qiita.com/khayama/items/a63aae63ed020eb60680)
AndroidのActivity、Fragmentのビルダーパターンを考え直す in Kotlin


いつもActivityやFragmentのビルダーパターンを作っていると不便だと感じる点も少なくないです、特に

## 現状のビルダーパターン

ActivityやFragmentなど、値を受け取る場合はStaticな関数を作って受け取る値の型などを明示することが、一般的なパターンとなっています。
また、こうするとKEYの値なども1つのファイル内のみで完結します。

### Activity

Activityの場合は、Intentの作成時に、このビルダーパターンを使用します。

```SampleActivity.kt
class SampleActivity : Activity() {

	companion object {
		private const val KEY_SAMPLE = "sample"
	
		fun createIntent(context: Context, sample: Sample): Intent =
			Intent(context, SampleActivity::class.java).apply {
				putExtra(KEY_SAMPLE, sample)
			}
	}
	
	//// パースなど

}
```

### Fragment

Fragmentの場合は、インスタンスの作成時に、このビルダーパターンを使用します。

```SampleFragment.kt
class SampleFragment : Fragment() {

	companion object {
		private const val KEY_SAMPLE = "sample"
	
		fun createInstance(sample: Sample): SampleFragment =
			SampleFragment().apply {
				arguments = Bundle().apply {
					putSerializable(KEY_SAMPLE, sample)
				}
			}
	}
	
	//// パースなど

}
```

### 問題点

それぞれのFragmentの機能などが1つのClass内に閉じ込められて、お互いが疎な状態となっています。しかし、ActivityでもSampleを使用し、FragmentでもSampleを使用する場合や、ただFragmentに値を渡す場合など同じKeyを定義しなくてはいけず冗長になりがちです。

せめて、Keyの値だけでも、共有したいですよね。

## 新しいビルダーパターン

新しいパターンでは、KotlinのExtentionを使用します。なので、JavaではUtilクラスを作ることになってしまいますが、そこは置き換えて考えてください。
方針としては、ActivityとFragment共通で1つのConstantsファイルを持つようにし、Constantsファイルが全ての依存を受け持つようにします。

```SampleActivity.kt
class SampleActivity : Activity() {

	companion object;
	
	override fun onCreate(savedInstanceState: Bundle?) {
	    super.onCreate(savedInstanceState)
		val sample: Sample = parseSample()
	}

}
```

```SampleFragment.kt
class SampleFragment : Fragment() {

	companion object;
	
	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val sample: Sample = parseSample()
        
    }

}
```

```SampleConstants.kt
// Scene Key
private object Key {
	const val SAMPLE = "sample"
}

// Instance Builder
fun SampleActivity.Companion.createIntent(context: Context, sample: Sample): Intent =
        Intent(context, SampleActivity::class.java).apply {
		 	putExtra(Key.SAMPLE, sample)
        }

fun SampleFragment.Companion.createInstance(sample: Sample): SampleFragment =
        SampleFragment().apply {
            arguments = Bundle().apply {
                putSerializable(Key.SAMPLE, sample)
            }
        }

// Parser
fun SampleActivity.parseSample(): Sample =
		 intent.getSerializableExtra(Key.SAMPLE) as Sample

fun SampleFragment.parseSample(): Sample =
		 arguments.getSerializable(Key.SAMPLE) as Sample
```

簡単に解説をすると、まずKeyの値を定義します。この時、privateにするとファイルプライベートとなるため、他のクラスからは参照できません。
次に、それぞれのActivityとFragmentのCompanionObjectにExtentionで、ビルダーメソッドを作成します。
最後に、Parserを使用して、値のパースをします。

### More Tips
今回はキーの値が増えるためやりませんでしたが、ただFragmentに値を渡すだけであればActivityに渡す値もBundleとしてあげることで、Parserとビルダーの一部を共通化出来ます。
いままでだと、ActivityにBundleで値を渡した際に、値を使用したくなった際にFragment側を見に行く必要があり、参照関係が汚くなりがちでした。
ですが、今回はConstantsが全ての値の参照を管理し、スコープも1つ閉じ込めることが出来ました。

最近の画面ごとに、必要な依存をまとめる設計には相性がいいと思いますので、よければ参考までに試してみてください！
MacのLaunchPadの行数・列数を変更するコマンド

macOSでLaunchPad↓の行数や列数を変更するコマンドです。

![スクリーンショット 2016-12-16 11.33.21.png](https://qiita-image-store.s3.amazonaws.com/0/889/6c348829-8534-ea56-cc48-da18f78792be.png)

# 列数を10に変更する

```
defaults write com.apple.dock springboard-columns -int 10
killall Dock
```

# 行数を5に変更する

```
defaults write com.apple.dock springboard-rows -int 5
killall Dock
```
Ruby gem メモ

# はじめに
下書きがいっぱいになった＆公開したら良いじゃんというのをうけ公開する。

Railsの方のメモと結構ごちゃごちゃになってる
http://qiita.com/uchiyu/items/ed1dfe20fd9745268010

メモなので新しいことがあると更新していく

# CarrierWave
画像保存用のgem
主な使われ方は、viewから画像をアップロードして保存する。
今回は、ファイルを一度ローカルにrubyscriptで保存した後、
そのファイルを開いて保存した。
一度、仮で保存したファイルはCarrierWaveで再保存する際に勝手に消してくれる。
デフォルトの画像の保存場所は、`public/uploads`下

```rb
u = User.new
u.avatar = params[:file] # Assign a file like this, or

# like this
File.open('somewhere') do |f|
  u.avatar = f
end

u.save!
u.avatar.url # => '/url/to/file.png'
u.avatar.current_path # => 'path/to/file.png'
u.avatar_identifier # => 'file.png'
```

githubのこの部分を活用
この処理の前にスクレイピングした画像をtmp/に保存する処理を挟んでいる。

http://www.workabroad.jp/tech/1118
https://github.com/carrierwaveuploader/carrierwave

# RubyでWeb上の画像などを保存
画像などは、バイナリで指定して開く必要あり
一回目のopenで保存先のファイルを開き、二回目のopenで画像を開き保存している。

```rb
require "open-uri"
require "FileUtils"

def save_image(url)
  # ready filepath
  fileName = File.basename(url)
  dirName = "/var/tmp/hoge/"
  filePath = dirName + fileName

  # create folder if not exist
  FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)

  # write image adata
  open(filePath, 'wb') do |output|
    open(url) do |data|
      output.write(data.read)
    end
  end
end
```

http://himaratsu.hatenablog.com/entry/ruby/img_dl
http://uxmilk.jp/22830

#### ファイルのIO
http://qiita.com/naotospace@github/items/bd0a5295e540e27936b3

# whenever
Cron設定をソース管理するgem
初期はdevelopで実行されておらず、コマンドで指定する必要があった。
http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/

タスクはおそらく順次実行

# 地図関連
# Google Maps for rails
Google Mapをrailsから簡単に表示加工できるgem

表示させるサンプル
http://qiita.com/jacoyutorius/items/a107ff6c93529b6b393e
公式
https://github.com/apneadiving/Google-Maps-for-Rails

# geocoder
地名から緯度経度を抽出するために活用
http://qiita.com/asukiaaa/items/42c9287d09872be1df63

#### 自分で実装する場合のサンプル
http://kaorumori.hatenadiary.com/entry/20110324/1300948544

# スクレイピング
anemoneでクローリングした後で、nokogiriでスクレイピングという流れがきれい
今回はクローリングするページにjsが使用されていたため、nokogiriでクローリングの処理を実装している
# ライブラリの選択
ページによって使用するgemの組み合わせ
http://qiita.com/mmmm/items/545e0aec82e6949ebb0a

# Nokogiri
スクレイピング用のgem
css()とかsearch()で簡単に検索をかけられる。
http://shgam.hatenadiary.jp/entry/2013/11/09/192509
http://d.hatena.ne.jp/otn/20090509/p1
http://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/
http://cockscomb.info/scrape_kishocho_with_ruby_and_nokogiri/

# sinatra
Webページを簡単に作成できる
ルーティングとページを書くだけで簡単に動くWebアプリケーションが作成可能
http://qiita.com/k-ta-yamada/items/9e35c5f8b31862267e01

# capistrano
デプロイの自動化ツール
いろいろなサービスのデプロイなどの手順が「Capistranoの設定」という形に統一できる
http://labs.gree.jp/blog/2013/12/10084/

# serializers
手早くjsonを生成できる
http://qiita.com/kakkunpakkun/items/1c23b936d13f08a42752

# sniffer
HTTP requestを簡単に解析できるGem
https://github.com/aderyabin/sniffer

# waterfall
開発手法のウォータフォールとは別
以下の画像のように，あるコマンドからchainとdamで処理を分けていける
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96838/400f1d2e-4301-387d-d2f8-2258a3fdcd30.png)

https://blog.rubyroidlabs.com/2017/11/waterfall-gem/
Ruby メモ

# はじめに
下書きがいっぱいになった＆公開したら良いじゃんというのをうけ公開する
メモなので新しいことがあると更新していく

# Rubyの命名規則
ここを参考にしてる
http://qiita.com/takahashim/items/ccfd489c9b26f15b7193

# Rubyにおけるドット記法，二重コロン記法
違い
レシーバ::メソッド → 定数呼び出しが可能
レシーバ.メソッド → 定数呼び出しはデフォルトでは不可能

http://qiita.com/ktarow/items/772014a4f0d48905f3ef

ドット記法でもアクセスメソッドを定義することで呼び出しは可能になる
http://www.rubylife.jp/ini/class/index6.html


# クラスメソッドとインスタンスメソッド
クラスに生やすかインスタンスに生やすか
クラスメソッドは`self.メソッド`で宣言
http://qiita.com/tbpgr/items/56eb65c0ea5882abbb07

# Rubyでのクラス変数、インスタンス変数、クラスインスタンス変数の違いについて
http://simanman.hatenablog.com/entry/2013/03/11/210756

# モジュールとクラス
http://qiita.com/fukumone/items/2dd4d2d1ce6ed05928de
http://qiita.com/ionis_h/items/5f26248ea4e154cce424

# クラスのto_json
オプションの引数(*a)は必要
http://shokai.org/blog/archives/6124

# 配列のコピーについて
後半に記述
http://qiita.com/sue738/items/92228f0ae0518bf0a693

# ボッチ演算子
https://jobs.forkwell.com/refactorings/50
# &: でオブジェクトに生えたものにアクセス
http://blog.livedoor.jp/sasata299/archives/51382454.html

# hashのキー
シンボルと文字列で区別してる
http://qiita.com/QUANON/items/169c73425a6bc50dee51

# injectとeach_with_object
http://qiita.com/Kta-M/items/c9781e09d96601687767

# エラー処理
begin - rescueとraise
http://qiita.com/murata0705/items/6ae346bd04197fb2e36a

# yieldについて
引数で渡された処理や関数を実行
http://qiita.com/merrill/items/0a77df7f61d0d6b8e875

#  自己代入などについて
`||` `||=`など
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html

# オープンクラス refinements
http://blog.fenrir-inc.com/jp/2014/07/refine.html
http://qiita.com/yustoris/items/77fd309178dcdd13b5cd

# case
caseはrubyでのswitch
`case when else`でかける
Cと違ってwhenを並べても処理が下に流れていかない

# オープンクラス
http://www.ruby.or.jp/ja/tech/development/ruby/tutorial/090_class_extension.html
railsで使う時
http://qiita.com/k-yamada@github/items/707687449da75da4c78c
[Linux][ls] lsでファイルごとに改行して表示 (ls -1)

いままでsed/awkとかで頑張っていたけれども、実はそんなことをしなくてもよかった。

`-1` オプションでファイルごとに１行で表示ができる。

```text:ls_helpより-1オプション
 -1                         list one file per line
```

# 使用例

`-1` オプションの使用例、ついでに `-v` オプションで辞書順ではなくバージョン順(自然順）ソートにできる。

```console:使用例
$ touch file{0..10}

$ ls
file0  file1  file10  file2  file3  file4  file5  file6  file7  file8  file9

$ ls -1
file0
file1
file10
file2
file3
file4
file5
file6
file7
file8
file9

$ ls -1 -v
file0
file1
file2
file3
file4
file5
file6
file7
file8
file9
file10
```
ひとは何故Disneyツムツムをプレイするのか

※本記事に技術的な内容はありません。

スマホゲームをプレイされている方でしたら誰でもおそらく一度はどこかで目にしたことがあるであろうDisneyツムツムというゲームの分析をしてみましたという記事です。
1000万点を出すような方もザラに居ますし、スキルを鬼活用して1回で1時間プレイする方も居る世界なので、分析が甘かったり「見てる世界が低いね〜」という形になっていましたらスミマセン。
ちなみに著者のハイスコアは582万点、スコアを狙う時のマイツムはデール(Lv22)です。

# Disneyツムツムとは
LINE社が2014年1月29日にサービス開始したゲームです。Disneyキャラクターのぬいぐるみである「ツムツム」を3つ以上つなげて消すというシンプルなゲームです。
マネタイズはルビーという仮想通貨とプレミアムボックスというガチャになりますが、サービス開始以来追加され続けたプレミアムツムでツムツム一覧ページのページ数が凄いことになってしまっているのはご愛嬌。そろそろ縦スクロール表示に移行したりするのでしょうか。
ちなみにぬいぐるみの方のツムツムが先にあり、それがゲーム化されたという順番でございます。ゲームのぬいぐるみ化では無いんですね。

さて本題。
#何故、人はDisneyツムツムをプレイするのか？
ユーザーのプレイモチベーションをスコアを例に見ていきたいと思います。（※便宜上、イベントやカードは無視しています）

### 開始〜10万点
繋いで消えるのが楽しい。ミッキーのスキルが楽しい。フィーバー中の演出もなんだか素敵だ。ハートが尽きる前にレベルが上がってハートが補充されるので、それもちょっと得した気分で嬉しいですね。
ユーザーレベルが上がるとスコアボーナスも増えていくので、プレイヤーの腕が上達しなくても点数は上がっていきます。Win-Winの関係ですね。何がだ。

### 〜100万点
所持するツムの数も徐々に増えてきて、色んなスキルを試すのが楽しい、どれが高いスコアになるだろうと探し始めます。おやどうやらこれは思ったよりも沼が深いぞ？と気付き始めます。
このあたりまではまだユーザーレベル、ツムのレベル上昇が頻繁にあると思うので、やっていくだけでじわりじわりとスコアが上がっていきます。

### 〜200万点
100万点を超えると、ランキングで他のユーザーと戦っているという感覚が強くなってきます。マイツムがある程度決まり、ボムを使うタイミングやスキルを使うタイミングもこだわりが出てきます。
なかなかハイスコアが伸びない日々が続き、ふとした出来心でアイテムを全使用なんてしてみたところ、あっさりと200万点の大台を越します。「そうか、みんなこんな手を使っていたわけか…くっ…！」

### それから
ランキングボードにはまだまだ上の点数が見えると思いますが、高い点数が出るのはどうやら運の要素も大きいということにも気付きます。というわけでここからはひたすら自分との戦いとなってきます。自分に合うツムと出会えるか、アイテムとルビー利用でどこまでブーストできるか、あとは運。
アイテムを使うにもプレミアムBOXを買うにもコインが必要なのでひたすらコイン集めの日々となります。コイン稼ぎ用のツムを手に入れると一回のプレイで1000〜2000コインを稼げるようになるので、平均して20回プレイすれば1回プレミアムBOXをゲットすることができる計算に。こうなると人は毎日プレミアムBOXを2個ゲットすることが日課になり、電車の中ではツムツムに集中するあまり吊革につかまりそびれ、隣の人の冷たい視線を浴びることになります。
「ハイスコアを狙う回」と「コインを集める回」が明確に区別されるようになり、プレイスタイルや人によっては使用するツムも変わってきます。「拙者、ツムツムのことなら一日の長がありましてね」というプライドも出てきます。「下から上に繋げるとボムが下にたまりにくいので良い」など聞いてもいないアドバイスを始めます。

##ユーザーモチベーションの偏移
まとめますと、
1. ユーザーはゲーム初期から「繋げて消す楽しさ」を体感でき、
2. スコアボーナス等も付加要素としてモチベーションを保ちつつ繰り返しプレイし、
3. ツムを集める/スキルを選ぶ楽しさを知り、
4. プレイの工夫を始め、
5. 最終的に自分のプレイスタイルを発見し、己との戦いに突入していく
という流れになります。

## いかがでしたでしょうか
Disneyツムツムは当時のLINEのゲームのノウハウを詰め込んだ非常に優秀なゲームだと思います。後に発表されたマーベルツムツムはDisneyツムツムが行き詰まっている点を考慮された設計が見えますが、己との戦いに没頭できるのは断然Disneyツムツムでしょう。これから電車の中でDisneyツムツムをされている方が居ましたら、彼/彼女もまた己と戦っているのだなと思っていただければ。
こちらからは以上です。
【Python入門】ブール演算子(and・or・not)の使い方

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Python入門】ブール演算子(and・or・not)の使い方](http://programming-study.com/technology/python-bool/)


#【Python入門】ブール演算子(and・or・not)の使い方

Pythonにはさまざまな演算子が存在し、あらゆる計算や構文に使われています。その中でも、主にif文の条件式でよく使われる演算子としてブール演算子というものがあります。ブール演算子は論理演算子とも呼ばれており、if文の条件分岐において、複雑な条件式を記述する際に使用されます。

今回は、ブール演算子の使い方について説明します。

目次
1 [andについて](##andについて)
2 [orについて](##orについて)
3 [notについて](##notについて)
4 [and、or、notを組み合わせる](##and、or、notを組み合わせる)
5 [ブール演算子の優先順位](##ブール演算子の優先順位)

##andについて

andは論理積とも呼ばれるブール演算子です。andの基本的な構文は以下の通りです。

```
条件式1 and 条件式2
```

andは左右に条件式をとり、両方の条件式の結果がTrue（真）の場合のみ、真を返します。どちらかが偽の場合は偽を返します。andを使うことで、複雑な条件のif文を短く記述することができます。

例えば、数字が格納されたリストの中から、100以上200未満の数字だけを取り出したいとします。andを使わない場合は、以下のようなif文になります。

```
list = [30, 256, 125, 167, 45, 401]
 
for number in list:
    if(number >= 100):
        if(number < 200):
            print(number)
```

実行結果

>125
167

この例はリストも短く条件もそこまで複雑ではありませんが、それでもif文を2回使っています。条件が複雑になればなるほどif文が増えてしまい、コードが見づらくなってしまいます。そんな時にandを使うと、とても短く記述することができます。

```
list = [30, 256, 125, 167, 45, 401]

for number in list:
    if(number >= 100 and number < 200):
        print(number)
```

実行結果

>125
167

この場合、numberが100以上かつ200未満の時だけandがTrueを返し、if文の中身が実行されます。andを使うことで、if文が一つ減り、コードがスッキリしました。

##orについて

orは論理和とも呼ばれるブール演算子です。orの基本的な構文は以下の通りです。

```
条件式1 or 条件式2
```

andは2つの条件式の両方がTrueの時だけ式全体がTrueになりましたが、orは2つの条件式のうちどちらか一方がTrueであれば、式全体がTrueになります。

さきほどの例を使うと、数字が100以下もしくは200以上のものを表示する、といった時に使われます。

```
list = [30, 256, 125, 167, 45, 401]
 
for number in list:
    if(number < 100 or number >= 200):
        print(number)
```

実行結果

>30
256
45
401

この例ではnumberが100未満、もしくはnumberが200以上のどちらか一方の式がTrueなら、式全体がTrueになるので、if文の中身が実行されます。

##notについて

notは否定とも呼ばれるブール演算子です。notの基本的な構文は以下の通りです。

```
not 条件式
```

notは条件式がTrueの場合に、式全体がFalse（偽）になります。さきほどの例を使うと、偶数ではない数字だけを出力する、といった時に使われます。

```
for number in list:
    if(not number % 2 == 0):
        print(number)
```

実行結果
>125
167
45
401

##and、or、notを組み合わせる

ここまでand、or、notの3種類のブール演算子を紹介しましたが、これらの演算子を組み合わせてより複雑な条件式を作ることもできます。

例えば、300より小さい数字かつ3で割り切れないもの、という条件式は以下のようになります。

```
list = [30, 256, 125, 167, 45, 401]
 
for number in list:
    if(number < 300 and not number % 3 == 0):
        print(number)
```

実行結果
>256
125
167

##ブール演算子の優先順位

Python言語の演算子には優先順位があります。例えば、+（和）と*（積）が同時にある場合は*が優先されます。

```
answer = 2 * 3 + 7
print(answer)
```

実行結果

>13

ブール演算子にも、同じように優先順位があります。ブール演算子の中ではnotが一番優先順位が高く、and、orと続きます。そのため、ブール演算子を組み合わせて使う場合は優先順位に気をつけないと、思った通りに動いてくれないことがあります。

例えば、「100未満または200以上」でなおかつ「偶数」を取り出すとします。

```
list = [30, 256, 125, 167, 45, 401]

for number in list:
    if(number < 100 or number >= 200 and number % 2 == 0):
        print(number)
```


実行結果

>30
256
45

一見正しそうな条件式ですが、なぜか偶数ではない45も出力されてしまっています。これは、andのほうがorよりも優先順位が高いため、条件式が「200以上かつ偶数、または100未満の数字」に変わってしまうからです。この式を正しく実現させるためには()を使って優先順位を変更するようにしましょう。

```
list = [30, 256, 125, 167, 45, 401]

for number in list:
    if( (number < 100 or number >= 200) and number % 2 == 0):
        print(number)
```


実行結果

>30
256
TeraTermでのショートカット起動

windows環境でサーバーへssh接続する際、TeraTermを使用しています。
毎回ログイン内容を入力するのが面倒なので、ショートカット起動を利用しました。

#環境
windows 7
Tera Term Version 4.92

#ショートカット起動方法
1.TeraTermのショートカットをデスクトップに作る
2.作成したショートカットのTeraTermを右クリックしてプロパティを表示。
3.ショートカットタブを選択
![ショートカット.png](https://qiita-image-store.s3.amazonaws.com/0/130708/1f6c2665-902f-816d-14b1-7b9995479ea3.png)

4.「リンク先」の欄にショートカット起動の内容を入力
▼publickeyでログインの場合
"teraterm exeファイルの格納先" サーバのIPアドレス /auth=publickey /user=ログインユーザー名 /keyfile=秘密鍵のパス

例：
"C:\Program Files (x86)\teraterm\ttermpro.exe" 00.000.0.0 /auth=publickey /user=hoge-user /keyfile="C:\workspace\ssh\hoge_key.pem"


これでショートカット起動の完成です！
管理は楽になりますが、取り扱いには注意が必要です。
Cordova CLIでiOSのアプリをパッケージングする方法

# 前提
Cordovaのバージョンは、6.1.1

---

# 事前準備
## 契約
以下のどちらかの契約が必要

* Apple Developer Program  
App Storeでアプリを公開するために必要
* Apple Developer Enterprise Program  
企業内でアプリを配布するために必要

## 証明書
アプリケーションを署名するために必要な証明書は、開発用と配布用がある
証明書の作成方法は、説明を省略

### 開発用
* iOS App Development

### 配布用
* App Store and Ad Hoc(App Storeで配布する場合)
* In-House and Ad Hoc(企業内で配布する場合)

---

# App IDの用意
Apple Developerのページで作成するアプリのApp IDを作成する
App IDにはIDとアプリで使用するサービス（APNsなど）を設定する

---

# Provisioning Profileの用意
Apple DeveloperのページでProvisioning Profileを作成する
Provisioning Profileには、以下の情報を設定する

* 作成するアプリの種類（開発用か配布用）
 * 配布用では、In House, Ad Hocのどちらかを選択
* App ID
* アプリを署名する証明書
* アプリをインストールするデバイス（開発用の場合）

作成したProvisioning Profileは、Macにダウンロードして、インストールする
※ダウンロードしたファイルをダブルクリックすると、以下の場所にインストールされる
　~/Library/MobileDevice/Provisioning Profiles

---

# build.jsonの用意
cordova CLIでアプリをパッケージングするために、build.jsonを用意する
build.jsonには、使用するProvisioning Profileと、アプリを署名する証明書を設定する

```
{
	"ios": {
		"debug": {
			"codeSignIdentity":"iPhone Developer: Hogehoge",
			"provisioningProfile":"5887fa9c-2243-43b9-a67b-45362839e807"
		},
		"release": {
			"codeSignIdentity":"iPhone Distribution: Poipoi",
			"provisioningProfile":"20814821-880a-4117-bb90-5e61ed87cfd1"
		}
	}
}
```

* codeSignIdentity - キーチェーンアクセスで証明書を開いたときに表示される名前を指定
* provisioningProfile - Provisioning ProfileのGUIDを指定  
Provisioning ProfileのGUIDは、以下のコマンドで確認できる  
表示されたファイル名の拡張子を除いた値が、GUID

```
find ~/Library/MobileDevice/Provisioning\ Profiles/ -type f -print0 | xargs -0 grep "App ID"
```

---

# ビルド
cordova buildを実行してアプリをパッケージングする。
__ipaファイルを作成する場合は、--deviceオプションを指定する必要があります。__
__Emulator用にビルドした場合は、ipaファイルは作成できません。__

* 配布用のipaファイルを作成

```
cordova build --release --device
```


* 開発用のipaファイルを作成

```
cordova build --debug --device
```
[CloudStack] 仮想マシン起動時にロードバランサーに自動で join する

# 概要
CloudStack で新規 VM デプロイ時にロードバランサーに自動で join する。

# 必要なもの
仮想マシンテンプレートに以下をインストールしておく。
 - cloud-init
 - [CloudStack CLI (cs)](https://github.com/exoscale/cs)
   　(credential の設定もやっておく)

また、既存の LoadBalancerRule の ID を確認しておく。

```
$ cs listLoadBalancerRules | jq -r '.loadbalancerrule[].id'
2cef1457-36d4-43fc-9694-c83dde6e60a1
```

# VM デプロイ
UserData に以下のスクリプトを設定して cloud-init で起動時に実行されるようにする。

```bash
#!/bin/bash
LoadBalancerRule=2cef1457-36d4-43fc-9694-c83dde6e60a1
virtualmachineid=`curl http://data-server/latest/meta-data/vm-id`

cs assignToLoadBalancerRule id=$LoadBalancerRule virtualmachineids=$virtualmachineid
```

※meta-data から自身の virtualmachineid を取得して、既存のロードバランサーにアサイン

VM 削除でロードバランサーから自動で切り離しされる。
flexboxを試す

初投稿します。
本当に今更ながら、食わず嫌いでずっと`float&clearfix`派の私が`flexbox`を試します。

## 食わず嫌いなので対応状況を確認
http://caniuse.com/#search=flexbox

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/133465/39117382-b316-b325-c02b-eae1f7ba8d62.png)

ブラウザの対応状況を確認。
最低でもIE10用の`-ms-`とAndroidブラウザ用の`-webkit-`はつけたほうが良さそうだ。

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/133465/020fb56c-f499-a2eb-1941-7900368c3c57.png)

known issuesを見てみると....

![スクリーンショット 2016-12-15 20.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/133465/5814c5b0-c0ce-9831-5168-a0b91dd8c717.png)
~~_うん。使わないほうが良さそうだ_~~





## でも、とりあえず、作ります。
親となる空divを作ります。

~~~
<div class="daddy">

</div><!-- END daddy -->
~~~

親の中に子divを量産します。

~~~
<div class="daddy">
  <div class="child one">太郎</div><!-- END child -->
  <div class="child two">次郎</div><!-- END child -->
  <div class="child three">三郎</div><!-- END child -->
  <div class="child four">四郎</div><!-- END child -->
  <div class="child five">五郎</div><!-- END child -->
  <div class="child six">六郎</div><!-- END child -->
</div><!-- END daddy -->
~~~

スタイルを当てていきます。


~~~
▼横並びに必要な記述
.daddy{
   display: -webkit-flex;
   display: -ms-flex;
   display: flex;
}
~~~


~~~
▼装飾に必要な記述
.daddy{
  background: #915c8b;
  padding: 20px;
}
.child{
   background: #333;
   margin-right: 10px;
   padding: 15px;
   font-size: 20px;
   color: #fff;
   text-align: center;
}
~~~


ドーン。できた。

![スクリーンショット 2016-12-15 21.23.38.png](https://qiita-image-store.s3.amazonaws.com/0/133465/d077604e-d449-b664-10e6-9a88963581b3.png)


おー。
今までの自分なら`.daddy`に`clearfix`を入れて、`.child`に`float:left`を入れてたのですが、もうその煩わしさもなくなるんですね。IEを除けば...
RStudio / difference > Data Viewer (View()で開いた値の更新) > ファイル再読込み時 > View(sig)は再読込みする / View(sig[c(101:ncol(sig))])は再読込みしない

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

RStudioの左上のData Viewer([というらしい](https://support.rstudio.com/hc/en-us/articles/205175388-Using-the-Data-Viewer))に表示される表の値について。

DataViewerに表を表示する場合、以下の表示方法でファイル再読込み時の処理が異なる

- View(sig)
   - 別ファイル読込み時に表の値が**更新される**
- View(sig[c(101:ncol(sig))])
   - 別ファイル読込み時に表の値が**更新されない**

複数ファイルを順次確認するときに「A」のパターンだと確認が早い。

「B」のような表示の場合、`View(sig[c(101:ncol(sig))])`を再実行する必要がある。メモリ上に残ったものをそのまま表示し続けるのだろう。

### Reload
(追記 2016/12/21)

~~以下の手順でReloadできることに気づいた。こちらの方が簡単。~~

- ~~Data Viewerにおいて表示される`sig[c(101:ncol(sig))]`のタグを選択~~
- ~~右クリック > Reload 選択~~

Reloadしても望みのデータは読込まれなかった。

`View(sig[c(101:ncol(sig))])`を再実行するのが確実だろう。
PHP・JS学習者向け対応表 PHP <=> JavaScript/jQuery

を、調べた都度、覚書としてゆるーく作っていこうと思います。

本人の学習用なので雑や不確かな情報もありますが、わずかでも役立てれればいいと思い公開していきます。
他力本願的なところも見え隠れしますが、情報提供による追加/修正も随時していきます
※簡易関数もありかな、と考えてます


| 説明 | <sub>▼</sub>PHP | javascript/jquery | メモ |
|:-----------|:------------|:------------|:------------|
| 変数の空判定 | ! empty() | notEmpty() 独自関数[[参照](http://qiita.com/ssmxgo/items/cfe75a15b414f6a78e48)] |  |
| 正規表現による一致・検索 | preg_match()<br>preg_match_all() | str.match()<br>regexp.exec 独自関数[[参照](http://stabucky.com/wp/archives/6123)] |  |
| 正規表現による置換 | preg_replace() | str.replace() |  |
| 文字列の置換 | str_replace() | 同上 |  |
| 文字列の一部分取得 | substr() | str.substr() |  |
| 文字列のバイト数 | strlen() | str.lenght |  |
| 文字列の両端の空白削除 | trim()<br>ltrim()<br>rtrim() | str.trim / jQuery.trim(str)<br>str.replace(/^\s+/, "")<br>str.replace(/\s+$/, "")<br>独自関数[[任意の文字他](http://ezolab-blog.net/blog-entry-41.html#ex-toc-uid1003)] |  |
| URLエンコード | urlencode() | encodeURI(URI) |
| URLデコード | urldecode() | decodeURI(encodedURI) |
-----------
配列系

| 説明 | <sub>▼</sub>PHP | javascript/jquery | メモ |
|:-----------|:------------|:------------|:------------|
| キーを基準にして配列の共通項を計算 | array_intersect_key() | | |
| 配列にcallback関数 | array_map() | jQuery.map() |
| 配列同士の結合 | array_merge()<br>array_merge_recursive() | | |
| 他の配列の値をもとにソート | array_multisort() | | |
| 末尾要素を取得 | array_pop() | | |
| 要素を逆順にして返す | array_reverse() | | |
| 指定値を検索しキー取得 | array_search() | | |
| 先頭要素を取得 | array_shift() | | |
| 場所を指定して取得 | array_slice() | | |
| 重複した値を削除 | array_unique() | | |
| ユーザー関数の摘要 | array_walk()<br>array_walk_recursive() | | |
| 配列のポインタが指す値 | current() | | |
| 文字列を分割し配列化 | explode() | | |
| キー名を変数名とした変数作成 | extract() | | |
| 配列を結合し文字列化 | implode() | | |
| 指定値が含まれているか判定 | in_array() | | |
| 配列であるかを判定 | is_array() | | |
| 配列を複数変数に代入 | list() | | |
僕が入れてるTimemachine除外設定

これはバックアップ除外に入れんだろーってやつまとめました。


```
# パッケージ群, docker, vmのイメージは除外
~/.gradle
~/.npm
~/.ivy2
~/.m2
~/.rbenv
~/Library/Caches/Homebrew
~/Library/Containers/com.docker.docker
~/.vagrant.d/boxes

# 復元できそうなのは除外
~/Dropbox
~/Google Drive

# iPhoneの復元バックアップ用ディレクトリはお好みで
~/Library/Application Support/MobileSync

# imapで紐つけたアカウントしか登録されてないので除外
~/Library/Mail

# キャッシュっぽいので除外
~/Library/Application Support/Spotify
~/Library/Application Support/Dash
```

なお、デフォルトの除外リストはここに入ってる
`/System/Library/CoreServices/backupd.bundle/Contents/Resources/StdExclusions.plist`

TimeMachine自体の設定ファイルはこれ。plistだけどテキストベースじゃないみたい。
Xcodeとか使えば触れる。
`/Library/Preferences/com.apple.TimeMachine.plist`
Load時にsceneに追加されたノードの取得方法

#日々低下する記憶力への明日への自分メモとして

pipelineのツールを作ってたりすると
import時やload時に追加されたノードをすぐに取得し処理をかけたいことが多々あります。
今までであれば、既存のノードのリストを事前に作って比較したりして非常にパワープレイなことを
していましたが（－－；；

ふとドキュメントを眺めていると

--------------------------------------------------------
returnNewNodes(rnn)
開く、読み込み、loadReference、とリファレンス操作の戻り値を制御するために使用します。現在のシーンに追加された新規ノードのリストを返す file コマンドを強制的に発行させます。
--------------------------------------------------------

！？
まさかこんな便利なフラグが。。
ってかfileのフラグ多すぎてまともに見てすらいな。。
すみません

```python:maya
import maya.cmds as cmds

file = "C:/user/test.mb"
print cmds.file(file,o=True,rnn=True,f=True)
[u'TurtleBakeLayerManager', u'TurtleDefaultBakeLayer', u'TurtleRenderOptions', u'TurtleUIOptions', u'bindPose1', u'groupId2', u'groupParts2', u'polySphere1', u'sceneConfigurationScriptNode', u'skinCluster1', u'skinCluster1GroupId', u'skinCluster1GroupParts', u'skinCluster1Set', u'tweak1', u'tweakSet1', u'uiConfigurationScriptNode', u'|joint1', u'|joint1|joint2', u'|joint1|joint2|joint3', u'|pSphere1', u'|pSphere1|pSphereShape1', u'|pSphere1|pSphereShape1Orig']

```

あぁー感動し過ぎて鼻水が出てしまいます。
ただ返されるノードは階層もくそもないので
ひと手間加える必要があるかと思いますが
大分処理の軽減化がされるかと思います。
dockerグループに入ってるユーザーのはずなのにdockerの制御コマンドを実行できない

多くの場合はsystemdからdocker -H fd://で起動されていると思うので、ソケットのパスを調べてDOCKER_HOSTにそれを設定するとよい。

```
$ cat /usr/lib/systemd/system/docker.socket 
[Unit]
Description=Docker Socket for the API
PartOf=docker.service

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
```

```
$ DOCKER_HOST="unix:///run/docker.sock" docker run hello-world
```
Listの要素の並び替えをImmutable.jsを使ってシンプルに書く話

この記事は[Opt Technologies Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opt-technologies)の15日目です。
（色々手が回っておらず、ちょっとしたポエム的な記事になります、ご容赦ください。。。）


## 問題

Drag ＆ Dropでlistの順番を並び替えるUIをよく見かけると思います。
このとき、選択した要素をlist内で別のindexに格納するものを、これまでこのように書いていました。

```ts:before
fucntion exchangeSortList<T>(targetList: T[], sourceId: number, targetId: number): T[] {
  return sourceId < targetId ?
    [...targetList.slice(0, sourceId), ...targetList.slice(sourceId+1, targetId+1), targetList[sourceId], ...targetList.slice(targetId+1, targetList.length)] :
    [...targetList.slice(0, targetId), targetList[sourceId], ...targetList.slice(targetId, sourceId), ...targetList.slice(sourceId+1, targetList.length)];
```

正直`exchangeSortList`と書かれていても何をやっているのかよくわかりませんね。。。
これは、Immutable.jsの力を借りればこのように書けます。

```ts:after
fucntion exchangeSortList<T>(targetList: Immutable.List<T>, sourceId: number, targetId: number): Immutable.List<T> {
  const target = targetList.get(sourceId);
  return targetList.remove(sourceId).insert(targetId, target);
```

記述量も少ないし、何をやっているか一目瞭然かと思います。
金額の小数計算にfloatとdoubleは使ってはいけない

アカウンティング・サース・ジャパンの開発でトラブった箇所をメモっていこうとおもう。
以前開発を海外の外注に出していて、安易にfloatやdoubleを使用して計算している箇所があり、自分でゴリっと修正した時のお話です。

#金額の小数計算にfloatとdoubleは使用禁止
基本的にfloatやdoubleなどの２進浮動小数点数の型は金額計算で使ってはいけない。どうしてか？それは小数点計算において正確に
計算できないからだ。

どういうことかというと

```java
float a = 1.03;
float b = 0.42;

System.out.println(a-b)
```

```
0.6100000000000001
```

となります。正確な金額出せない・・・。

#金額の小数計算にBigDecimalを使用
正確に金額を計算したい場合はBigDecimalを使用します。

```java
import java.math.BigDecimal

BigDecimal a = new BigDecimal("1.03");
BigDecimal b = new BigDecimal("0.42");

BigDecimal c = a.subtract(b);
System.out.println(c.toString());
```

```
0.61
```

BigDecimalは計算符号で記述できないのでとにかく見にくいし、めんどいと思われてしまうらしい。

#BigDecimalの罠
ここでBigDecimalを使うと大丈夫かというと罠がある。
BigDecimalでの初期代入を間違えるとせっかくBigDecimalで正確に計算しようとしているのに意味がなくなってしまう。
どういうことかというと小数を代入する時に数値で代入してはいけないということである。文字で代入しないといけない。

```java
BigDecimal rate1 = new BigDecimal("0.1");
BigDecimal rate2 = new BigDecimal(0.1);
```

これのちがいである
前者は文字列の引数で渡されるので正確に計算できる。
後者は0.1はdouble引数のコンストラクタに流れるので一旦２進浮動小数点扱いとしてから代入してしまう罠だ気をつけろ！
double引数のコンストラクタ自体いらない、コンパイルエラーにして欲しいと思ってしまう。

#最後に
外注がいたる所でfloatやdoubleを使用していて直すのが面倒だったのか小手先対応で誤差を是正しようと怖い端数処理をしていた。びびった。
　完全な正確性を求めない画面構成の割合計算や座標計算ではプログラムしやすい計算も早いので手軽に使用してしまうdoubleやfloatではあるが金額を扱うシステムを構築する人にとっては”金額にdoubleやfloatは使用禁止”を初めから知っておきたい常識である。あとで１円で泣くことになるからね。

そんなオフショアもやめ完全内製化とした弊社は現在システムを一緒に作ってくれる仲間を募集中です。
TypeScriptプロジェクトをECMAScript標準に合わせていく話


この記事は[Opt Technologies Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opt-technologies)の9日目です。

[webpack 2.2-rcが出ました](https://medium.com/webpack/webpack-2-2-the-release-candidate-2e614d05d75f#.nrtziquif)ね！

（記事がめっちゃ遅れたのはこの時を待っていたからなんです！。。。嘘ですすみません＞＜）

webpack2のtree shakingはES Modulesで書かれていないと適用されないのではと風の噂で聞いた（真偽は知らない。。。）ので、この機会にcommonjsスタイルを撲滅しようとしてみました。

内容が薄い＆あまり参考になるものではない、のはご容赦ください。

## 現状の問題

僕の現在のプロジェクトでは、いろんな書き方が混在していました。。。

```js
import A = require('A')
const A = require('A')
import A from 'A'
```

さらには、react-routerの型定義ファイルが良くないのか、僕のTypeScript力が足りないのか、型合わせがうまく行かずに困っていて妙なハックをしていました。（`RouterContextProps` という型が欲しいのになんか全然取れなかった）

とりあえず開発はできているものの、webpack2対応や、今後ES Modulesの書き方に統一していって変な悩みをなくしていこうということで、ガッとやってしまいました。

### ゴール

tsconfigのmodulesをcommonjs -> es6にすること（targetはes5のまま）。
後述の話で出てきますが、`noImplicitAny`も消したくなかったので変なハックが入っています。

```json
{
  "compilerOptions": {
    "module": "es6",
    "target": "es5",
    "noImplicitAny": true,
    ...
  }
}
```

### やったこと

これまで、こんなコードが入ってました。

```
const {Button} = require('react-materialize')
```

現在、react-materializeの型定義は存在しないので、

```
import {Button} from 'react-materialize'
```

などと書くと `module 'react-materialize' not found`などと言われるため、これまで上記のようにかいていました。それをなんとか読み込ませたい。
わかめさんの[こちらの記事](http://qiita.com/vvakame/items/fc7e37d0296c63f41f4f#%E5%9E%8B%E4%BB%98%E3%81%91%E3%81%AA%E3%81%97%E3%81%AE%E6%B0%97%E8%BB%BD%E3%81%AAimport%E5%8F%A5)などではnoImplicitAnyを外せばいける、などと書かれていましたが、それも嫌だったので別の方法で対応しました。

```ts:allowImportAsAny.d.ts
//型定義ないやつを読み込めるようにする。
declare module "fetch-mock";
declare module "react-router";
declare module "react-materialize";
declare module "react-select";
```

このような型定義ファイルを自作して逃れました。なお、`react-router`は型定義が壊れているように見える（リンクを失念しましたが、DefinitelyTypedにもissueが上がってる）ので、落ち着くまでは型なしにしました。

## webpack2対応もやってみた

ついでにwebpack2.2-rcも試してみました。（お仕事のではまだマージされてない）

普通のwebpack.conf.jsはほぼ変更無く動いたのですが、karmaでのwebpackの設定が一苦労いりました


```js:元のコード
webpack: {
    resolve: {
        extensions: ['', '.ts', '.js', ".tsx"]
    },
    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: "ts-loader"
        }],
        postLoaders: [{
            test: /\.js/,
            exclude: /(__test__|node_modules|bower_components)/,
            loader: 'istanbul-instrumenter'
        }]
    }
},
```

```js:直したコード
webpack: {
    resolve: {
        extensions: ['.ts', '.js', ".tsx"]
    },
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: "ts-loader"
            },
            {
                test: /\.js/,
                exclude: /(__test__|node_modules|bower_components)/,
                query: {esModules: true},
                loader: 'istanbul-instrumenter-loader'
            }
        ]
    }
},
```

僕らのプロジェクトではistanbulでカバレッジを取っているため、そちらの設定が手間取りました。
書いてて気づいたのですが、 [postLoadersの書き方変更](https://webpack.js.org/guides/migrating/#module-preloaders-and-module-postloaders-was-removed)ちゃんとやってないですね。。。まぁ動いてるから良いのかな。。

## その他

ついでに、lodashやobject-assgnに依存していた箇所をcore-jsを使う形に変えました。これもECMAScript標準に合わせて行こうということで。

## まとめ

JSはいろんな書き方できてしまいますが、なるべくECMAScript標準に寄せれるように適宜調整していきたいです。
OSMstatsから読み解くマッパーコミュニティの現状

この記事は [OpenStreetMap Advent Calendar 2016 (12/15用)](http://qiita.com/advent-calendar/2016/osmjp) として投稿しました。

# OSMstatsから読み解くマッパーコミュニティの現状

## About OSMstats

OSMstats は世界中の OpenStreetMap ユーザーコミュニティ活動量が毎日どのように行われているのか、定量的な統計情報を整理して、見える化するサービスです。
運営は altogetherlost.com & Pascal Neis (neis-one.org) チームが行っています。

http://osmstats.neis-one.org/

![](https://cloud.githubusercontent.com/assets/416977/21245764/de400168-c367-11e6-8296-921a64aef0c7.png)


## 何がわかるの？

様々な情報が可視化されていますが、主に次の情報が便利です。

* OpenStreetMapユーザーアカウント総数の時間遷移
* 日別のアクティブマッパー活動量
* 国別のアクティブマッパー数

これらの情報を、それぞれ見てみましょう。

## OpenStreetMapユーザーアカウント総数の時間遷移
### OSMstatsトップページを開く
これは簡単です。OSMstatsのトップページを開くだけです。

* http://osmstats.neis-one.org/

### Number of registered OSM members
左上の Number of registered OSM members の情報を見ます。2016/12/15 の時点では、3,285,076ユーザーアカウント、約330万マッパーによって今のOpenStreetMapはデータ更新されています。但し、この数字は現時点で有効なアカウント数であり、過去に作ったっきり使われていないアカウントや作業の目的によって複数アカウントを使い分けている人も含まれていますので、実際の人間としてマッパー数はこの数字よりも小さくなります。
![](https://cloud.githubusercontent.com/assets/416977/21246123/0eec134a-c36a-11e6-8bf8-74255a345c6a.png)


### グラフの時間軸を少縮尺にする
横軸を時間軸に、縦軸をユーザーアカウント数でプロットした二次元グラフを見てみましょう。また、2012年から現在までの遷移を見てみましょう。

![](https://cloud.githubusercontent.com/assets/416977/21246258/e91c06b0-c36a-11e6-860a-d9d72cf0197c.png)

### ユーザー数の増加傾向に変化
このグラフをよく見ると、ユーザー数の増加傾向に何度か変化が起きていることが読み取れます。一つは、2012年6月前後からの増加（①）。二つ目は2013年4月前後からの増加（②）、そして最近も 2016年4月からの増加傾向（③）。さあ、ここからその背景を、、、と書きたいところですが、この問いは青山学院大学の古橋ゼミの課題に使うのであえてここでは問題提起のみに留めます。後日学生達の分析を追記公開します。
![](https://cloud.githubusercontent.com/assets/416977/21246547/d04e4d62-c36c-11e6-93c8-cf9b2b9bbaed.png)


## 日別のアクティブマッパー活動量
上記のユーザー増加数の中身を判断するには、実際にマッピングを行っているユーザー数である No. of daily active members overall と比較することが大事です。これは日別のアクティブマッパー数のグラフで、例えば 2016年4月からの増加傾向は、ユーザー数が増えているだけでなく、連動してアクティブマッパー数も同じタイミングで増え始めています。
![](https://cloud.githubusercontent.com/assets/416977/21246832/8abfd39a-c36e-11e6-9bf3-4c9128b118f5.png)


## 国別のアクティブマッパー数
 
最後に、国別のアクティブマッパー数を比較してみましょう。先程までは世界全体の傾向を追っていましたが、OSMstats上に並ぶ Countries タブリンクから表示を切り替えると、各国ごとの集計表が登場します。時差もあるので、２日くらい前に設定したほうが正しく表示されることが多いです。2016/12/14時点では日本は世界でTOP10のポジションにいます。

* http://osmstats.neis-one.org/?item=countries&date=14-12-2016 （例： 2016/12/14の集計結果）

![](https://cloud.githubusercontent.com/assets/416977/21246963/49107048-c36f-11e6-8290-e6748273fc92.png)


今度は、Japan をクリックして、日本のアクティビティ（実際には日本エリア内でのマッパーアクティビティであり、日本人だけでなく遠隔からのアームチェアマッピングも加算されています）を見てみましょう。

![](https://cloud.githubusercontent.com/assets/416977/21247013/b86ba548-c36f-11e6-847c-253dc3cb6dfc.png)

日本でも 2016年4月から、アクティブマッパー数が増えているように見えますが、これはグローバルなOpenStreetMapのマッパー数の増加傾向と関連性があるのでしょうか？それとも日本独自の現象でしょうか？いずれにしてもこのような定量的な数値を元に、世界と日本のマッパーコミュニティがどのように変化しているのか、マクロな視点でのコミュニティ分析も大事な見方です。
公開 NTP サーバー

## プロバイダー提供 NTP サーバー
あまり当てにならないプロバイダーシェア順 [^provider]

| プロバイダー | URI | IPアドレス |
|---|---|---|
|[OCN](http://www.ocn.ne.jp/business/customer/set_up/tech_1.html)| `ntp-tk01.ocn.ad.jp` <br> `ntp-tk02.ocn.ad.jp` <br> `ntp-os01.ocn.ad.jp` | `202.234.233.106` <br> `202.234.233.109` <br> `210.145.255.76` |
|Yahoo! BB| `ntp.bbtec.net` | `219.188.200.128` |
|[So-net](http://faq.so-net.ne.jp/app/answers/detail/a_id/3495/kw/ntp)| `ntp.so-net.ne.jp` <br> `ux02.so-net.ne.jp` | |
|BIGLOBE| `ntp01.tk.mesh.ad.jp` <br> `ntp02.tk.mesh.ad.jp` <br> `ntp03.tk.mesh.ad.jp` |  |
|[ぷらら](https://www.plala.or.jp/support/manual/internet/setup/)| `ntp1.plala.or.jp` (東日本) <br> `ntp2.plala.or.jp` (西日本) |  |
|eo|  |  |
|au one net|  |  |
|[@nifty]()|  |  |
|[ASAHIネット](http://asahi-net.jp/support/guide/etc/0000.html)| `ntp.asahi-net.or.jp` |  |
|[WAKWAK](http://www.wakwak.com/support/g_internet/server_wakwak.html)| `ntp1.wakwak.com` <br> `ntp2.wakwak.com` | `211.9.226.25` <br> `211.9.227.25` |
|DION| `ntp02.dion.ne.jp` <br> `ntp03.dion.ne.jp` |  |
|USEN| `ntp01.usen.ad.jp` <br> `ntp02.usen.ad.jp` <br> `ntp03.usen.ad.jp` |  |
|[さくらインターネット](https://help.sakura.ad.jp/hc/ja/articles/206228721)| `ntp1.sakura.ad.jp` | `210.188.224.14` |

## その他の NTP サーバー
* ntp.nict.jp [^nict]
* jp.pool.ntp.org [^ntp.org]
    * 0.jp.pool.ntp.org
    * 1.jp.pool.ntp.org
    * 2.jp.pool.ntp.org
    * 3.jp.pool.ntp.org
* ntp.jst.mfeed.ad.jp [^mfeed]
    * ntp1.jst.mfeed.ad.jp (210.173.160.27)
    * ntp2.jst.mfeed.ad.jp (210.173.160.57)
    * ntp3.jst.mfeed.ad.jp (210.173.160.87)
* ntp.ring.gr.jp [^ring]
    * ntp0.ring.gr.jp
    * ntp1.ring.gr.jp
    * ntp2.ring.gr.jp
* time.google.com [^google]
    * time1.google.com
    * time2.google.com
    * time3.google.com
    * time4.google.com
* time.aws.com [^aws]
* ats1.e-timing.ne.jp [^e-timing]
* s2csntp.miz.nao.ac.jp [^nao]

## ニュース
* 2016/11/23 [ntpdに複数の脆弱性、US-CERTが発表 | Think IT（シンクイット）](https://thinkit.co.jp/news/bn/11020)
* 2016/07/09 [2017年の元日は1秒長い--“うるう秒”として「8時59分60秒」登場 － インターネットコム](https://internetcom.jp/201251/leap-second-will-be-added-to-new-years-day-2017)
* 2016/06/06 [時刻同期デーモン「ntpd」に脆弱性 | マイナビニュース](http://news.mynavi.jp/news/2016/06/06/143/)
* 2015/10/23 [時刻同期のNTPに複数の脆弱性--HTTPS接続のバイパスなどを誘発 - ZDNet Japan](http://japan.zdnet.com/article/35072380/)
* 2014/12/22 [ニュース - 時刻同期サービス「ntpd」に重大脆弱性、細工パケット一撃でサーバー乗っ取りも：ITpro](http://itpro.nikkeibp.co.jp/atcl/news/14/122202355/)
* 2005/01/21 [福岡大のNTPサーバがアクセス集中で悲鳴 - ITmedia ニュース](http://www.itmedia.co.jp/news/articles/0501/21/news059.html)

## 参照文献
* http://wiki.nothing.sh/page/NTP
[^provider]: https://www.m2ri.jp/news/detail.html?id=8
[^nict]: http://jjy.nict.go.jp/tsp/PubNtp/
[^ntp.org]: http://www.pool.ntp.org/zone/jp
[^mfeed]: http://www.jst.mfeed.ad.jp/
[^ring]: http://www.ring.gr.jp/ring/ntp.html.ja
[^google]: https://developers.google.com/time/
[^aws]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html#configure-time-sync
[^e-timing]: http://www.e-timing.ne.jp/product/timestamp/open-server/
[^nao]: http://www.miz.nao.ac.jp/vlbi/ntp.html
Jupyter Notebookで実行に影響のない警告（ワーニング）を非表示にする方法

# はじめに

Jupyter Notebookで原因不明のエラーのような警告が表示されるようになって、でも結果には何の影響もない警告で、どうにかしようとあくせくするも表示を消せない時に「臭いものには蓋をする」方法です(-_-;)

# サンプルコード

以下のコードを警告（ワーニング）が発生する前に記述します。

```py:
import warnings
warnings.filterwarnings('ignore')
```

警告が表示されなくなった！！
...あとで必ずきちんと直すぞ、きっと、たぶん、いつか(^_^;)
zabbix3.0　予測関数を試してみる（その1）

# はじめに

zabbix3.0の新機能として魅力的な予測監視。
でも近似曲線なんて良くわからないしといつもlinearばかり使用しています。

他のfitも使ってみたいけど知識が無いと難しいので、実際にグラフを作って動作を見てみました。

理系知識が無い、文系の自分が納得できる結果が得られたられしいです。(^^)


# 環境

Zabbix-server：zabbix 3.0.3
agent OS：solaris10
※DISK使用率の変動が大きいのがたまたまsolarisだっただけで他意はない

ログの書き込みが常時あり、毎日AM1:00になったら切り回しと圧縮が行われ、DISK使用率が戻ります。
サーバ内には圧縮されたファイルが残るので、毎日微増している状態。
単純の予測するとピーク時に閾値を超えてしまうので近似曲線をうまく使って監視をしてみたいです。

# DISK使用率の推移をグラフ化してみる

![2016-12-15_103607.png](https://qiita-image-store.s3.amazonaws.com/0/149632/26784e54-410e-32da-2723-b63a3bd4a11a.png)

上記が監視対象サーバのDISK使用率の動きです。

まずは何も考えずに全てのfitで値を取得してみます。zabbixの設定としては、

```
forecast("vfs.fs.size[/,pused]",24h,0,12h,"各fitを指定",value)
```

でそれぞれのfitを別々のアイテムで取得します。
直近1日のデータをもとに12時間後に達するであろうDISK使用率の予測値、のはず。

そして結果です。

![2016-12-15_103716.png](https://qiita-image-store.s3.amazonaws.com/0/149632/f3233435-1d7d-f46c-6020-abe164b569e6.png)

大きく2パターンのグラフになった。

linearとexponentialとpolynomialN（今回は1）
logarithmicとpower

# 結果から近似曲線を選別する

### まずはそれぞれの特徴を確認

* logarithmic

対数近似は、変化率が急激に増加または減少した後でほぼ一定になるようなデータに最もよく適合する曲線

* power

累乗近似は、測定値が特定の比率で増加するようなデータに適した曲線

* exponential

指数近似は、値が増加するにつれてその増加率が大きくなるデータ、または減少するにつれてその減少率が小さくなるデータに適している

* polynomialN

多項式近似は、変動の大きなデータに適している (膨大なデータから損益の分析を行う場合など)。

* linear

線形近似は、線形性のある単純なデータ集合に最も適合した直線を作成する場合に使用する

### 今後の展開

* データに合わなそうな近似曲線を対象から除外

最初から予想していましたが、powerのように一定比率で増加する類ではないので調査対象から外します。
次にexponentialも対象から外します。こちらも値の増減によって比率が増していくようなタイプみたいなので、今回のデータサンプルにはあっていないと思われます。

以上の2つのfitを対象から外す替わりに、取得条件を変えたグラフを追加します。

1つ目は、polynomialNをデータ対象期間をもう少し長くしてみる
2つ目は、polynomialNをデータ対象期間をもう少し短くしてみる

を加えてグラフの変化を見てみたいと思います。
次回情報が採取されるまでお待ちください。


# 勉強させていただいたサイト

[Zabbix 3.0 の予測機能についての数学的考察](http://qiita.com/qryuu/items/d4d7754a3361a78c8ee4)

[microsoftさんのサポートページより](https://support.office.com/ja-jp/article/%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E3%2581%25AB%25E6%259C%2580%25E9%2581%25A9%25E3%2581%25AA%25E8%25BF%2591%25E4%25BC%25BC%25E6%259B%25B2%25E7%25B7%259A%25E3%2582%2592%25E9%2581%25B8%25E6%258A%259E%25E3%2581%2599%25E3%2582%258B-1bb3c9e7-0280-45b5-9ab0-d0c93161daa8?ui=ja-JP&rs=ja-JP&ad=JP)
BEMについて少し。

この記事はOIC ITCreate Club Advent Calendar 2016 16日目の記事です。

http://www.adventar.org/calendars/1484


# はじめに
ITCreate Club Advent Calendar 2016 16日目を担当させていただきます、@t-kusakabeです。
前回Sassについての記事を書かせていただいたので今回はBEMについて書かせいただこうと思います。

# BEMにってなに？
BEMとは、Block、Element、Modifierの頭文字をとったフロントエンド設計方法のひとつです。
通常CSSを書く時、適当にclass名をつけたりデザイン重視になりすぎる事でHTML上のclass名が何をしているのかわからない、又はCSSを書いた本人しか理解できない状態になりがちです。(僕だけかもしれませんが...)
BEMは厳格な命名規則を設ける事で、長期的でかつ再利用しやすいCSSを記述するための設計方法です。

# BEMの構成要素
Block、Element、Modifierの3つでBEMは構成されています。(頭文字をとっているので当然ですね)

Blockとは要素の大元になる部分です。後述するElementやMOdifierはこのBlockに属する事になります。

ElementはBlockを親とする要素です。全てのElementはある特定のBlockに属します。

ModifierはBlock、Elementに対して装飾を行う要素です。

[![https://gyazo.com/db3e0c9a2f2ea0e08faae933b6564989](https://i.gyazo.com/db3e0c9a2f2ea0e08faae933b6564989.png)](https://gyazo.com/db3e0c9a2f2ea0e08faae933b6564989)


# 命名規則
BEMには厳しい命名規則があります。

+ BlockとElementをつなぐときは、アンダースコア2つでつなぐ (Block__Element)
+ Modifierにつなぐ場合は、ハイフン2つでつなぐ (Block--Modifier, Element--Modifier)

基本的にはこの二つを守っていればokです。

実際に試してみましょう。
全ての要素はBlockに属するのでまずBlockを定義します。
今回はfooというBlockを作成することにします。
(わかりやすくするために適当にCSSを当てています)

```sample.html
<!DOCTYPE html>
<html>
  <head>
    <title>sample</title>
    <link rel="stylesheet" type="text/css" href="sample.css">
  </head>

  <body>
    <div class='foo'>
    </div>
  </body>
</html>
```

[![https://gyazo.com/c92babe4eadcfe1f299621b277612458](https://i.gyazo.com/c92babe4eadcfe1f299621b277612458.png)](https://gyazo.com/c92babe4eadcfe1f299621b277612458)

---

次にElementを定義します。Blockという塊の中にある要素なのでBlockの中に定義します。ElementとBlockを繋げるときはアンダースコア2つでつなぐのでfoo__barとします。

```sample.html
<!DOCTYPE html>
<html>
  <head>
    <title>  </title>
    <link rel="stylesheet" type="text/css" href="sample.css">
  </head>

  <body>
    <div class='foo'>
      <div class='foo__bar'> 
      </div>
      <div class='foo__bar'> 
      </div>
      <div class='foo__bar'> 
      </div>
    </div>
  </body>
</html>
```

[![https://gyazo.com/22e60653c4bd7cab8facd6cb768f72da](https://i.gyazo.com/22e60653c4bd7cab8facd6cb768f72da.png)](https://gyazo.com/22e60653c4bd7cab8facd6cb768f72da)

---

次にModifierです。Modifierを繋げるときはハイフン2つで繋げるので、foo__bar__redになります。

```sample.html
<!DOCTYPE html>
<html>
  <head>
    <title>  </title>
    <link rel="stylesheet" type="text/css" href="sample.css">
  </head>

  <body>
    <div class='foo'>
      <div class='foo__bar'> 
      </div>
      <div class='foo__bar foo__bar--red'> 
      </div>
      <div class='foo__bar'> 
      </div>
    </div>
  </body>
</html>
```

[![https://gyazo.com/4395fc1c9791bacd69693b96324898e8](https://i.gyazo.com/4395fc1c9791bacd69693b96324898e8.png)](https://gyazo.com/4395fc1c9791bacd69693b96324898e8)

# Sassと組み合わせる
普通にBEMを使うだけだと,class名が長くなるだけなので不便です。
しかし、Sassの `&` と組み合わせることで長いclass名を省略することができます。

```test.css
.foo {
}

.foo__bar {
}

.foo__bar--red {
}
```

通常のCSSがSassと組み合わせると...

```test.scss
.foo {
  &__bar {
    &--red {
    }
  }
}
```

class名を短縮できる！！！
SassとBEMを組みわせることで、わかりやすく再利用しやすいCSSが書けるようになります。


# まとめ
BEMを使うことでclass名だけで何をしているのかある程度わかるのでチーム開発にも最適です！
興味を持たれた方は是非勉強してみください。