OmniAICreator/Qiita-1.07M huggingface dataset:
ド素人neovimの使い手になってみる。3.linuxでの構築

#最終ゴール

- Neovimのインストール
- プラグインの設定
- githubに設定ファイルをおいて、いつでも自分の設定にできる
- linuxでも、自分設定で使えるようにする

#この記事

- Neovimのインストール
- deinの導入設定

#前提
- vagrant + virtualboxにて仮想CentOS7.2の構築

# zシェルのインストール
```
sudo yum -y install zsh
chsh -s /bin/zsh
cp ../../vagrant_data/.zshrc .zshrc
```
この時、.zshrcの設定もする。
ここでログアウトしてから、再度入る。

# gitインストール

```
sudo yum -y install git
```

# Neovimのインストール

```
sudo yum install -y epel-release
sudo yum install -y python34-setuptools
sudo easy_install-3.4 pip
sudo curl -o /etc/yum.repos.d/dperson-neovim-epel-7.repo https://copr.fedorainfracloud.org/coprs/dperson/neovim/repo/epel-7/dperson-neovim-epel-7.repo 
sudo yum -y install neovim
pip3 install --upgrade neovim
```
upgrade時にエラーが出るが放置でOK

# deinの設定

```
mkdir ~/.cache/dein
~/.cache/dein
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
sh ./installer.sh ~/.cache/dein
```

# プラグインのインストール
```
export XDG_CONFIG_HOME="$HOME/.config"
mkdir $XDG_CONFIG_HOME
mkdir nvim
cp ../../../vagrant_data/init.vim nvim/
mkdir dein
cp ../../../vagrant_data/dein.toml dein/
cp ../../../vagrant_data/dein_lazy.toml dein/


#$XDG_CONFIG_HOME/nvim/init.vim
let g:cache_home = empty($XDG_CACHE_HOME) ? expand('$HOME/.cache') : $XDG_CACHE_HOME
let g:config_home = empty($XDG_CONFIG_HOME) ? expand('$HOME/.config') : $XDG_CONFIG_HOME

" dein {{{
let s:dein_cache_dir = g:cache_home . '/dein'

" reset augroup
augroup MyAutoCmd

    autocmd!
augroup END

if &runtimepath !~# '/dein.vim'
    let s:dein_repo_dir = s:dein_cache_dir . '/repos/github.com/Shougo/dein.vim'

    " Auto Download
    if !isdirectory(s:dein_repo_dir)
        call system('git clone https://github.com/Shougo/dein.vim ' . shellescape(s:dein_repo_dir))
    endif

    " dein.vim をプラグインとして読み込む
    execute 'set runtimepath^=' . s:dein_repo_dir
endif

" dein.vim settings
let g:dein#install_max_processes = 16
let g:dein#install_progress_type = 'title'
let g:dein#install_message_type = 'none'
let g:dein#enable_notification = 1

if dein#load_state(s:dein_cache_dir)
    call dein#begin(s:dein_cache_dir)

    let s:toml_dir = g:config_home . '/dein'

    call dein#load_toml(s:toml_dir . '/dein.toml', {'lazy': 0})
    call dein#load_toml(s:toml_dir . '/dein_lazy.toml', {'lazy': 1})
    if has('nvim')
       " call dein#load_toml(s:toml_dir . '/neovim.toml', {'lazy': 1})
    endif

    call dein#end()
    call dein#save_state()
endif

if has('vim_starting') && dein#check_install()
    call dein#install()
endif
" }}}

```

- neovimの起動

```
nvim
```

- 権限エラーが出た場合
- 
```
 sudo chown -R vagrant  .cache/
```
技術英語 > Python [makes frequent use of] iterators, for good reason. / not unheard of, but rare

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2143 / 12833)

> Python **makes frequent use of** iterators, for good reason.

続いての文章は

> They make it possible for you to traverse data structures without knowing how large they are or how they are implemented.

iteratorの場合、対象となるものの実サイズを知らずに順次処理するというイメージを現在は持っている。
そういう点からメモリ効率が良い、ということだろうか。

<hr>
関連して思い出したのは

unheard of 

http://stackoverflow.com/questions/2100428/prevent-access-to-javascript-based-website-or/2100442#2100442
> It is very rare that a site really needs JavaScript (**not unheard of, but rare**).

意訳「サイトが本当にJavascriptを必要というのは非常にまれだ (前例はなくはないが、まれだ)」

`unheard of `の前に`not`を使う用例をstackoverflowで見かける。
さくら

###空き容量確認

```
df -h
```


###ネームサーバ

```
ネームサーバー1	ns1.dns.ne.jp
ネームサーバー2	ns2.dns.ne.jp
```


###メモリの使用状況

```
free -m
```

###メモリの実際の使用量

```
（計算式） -/+ buffers/caches:
```


###ssh接続
```
ssh -i ~/.ssh/sshkey.pem root@<サーバのIPアドレス>
```
.indexOf()で配列のindexが取得できないとき

# indexOf()でindexが取得できない

```JavaScript
var array = ['hoge', 'huga', 'hoho'];
```

のような単純な配列は[.indexOf()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)で簡単に取得できますが

```JavaScript
var hash = [
  {number: 1, name: 'hoge'},
  {number: 2, name: 'huga'}
];
```
のような連想配列(ハッシュ)では、例えば「nameが'huga'である要素のindex」は取得できません。

#解決方法
[reactjs - Finding the array index of an object with Javascript/React.js - Stack Overflow](http://stackoverflow.com/questions/35823783/finding-the-array-index-of-an-object-with-javascript-react-js)を参考にしました。
日本語で書いておきましたがほぼ同じ内容です。
reactのコードの書き方での説明ですが難しくないです。

連想配列で「nameが'huga'である要素のindex」を取得したいときはまず

```JavaScript
function getIndex(value, arr, prop) {
    for(var i = 0; i < arr.length; i++) {
        if(arr[i][prop] === value) {
            return i;
        }
    }
    return -1; //値が存在しなかったとき
}
```

という、for文で繰り返し処理をする関数をつくって

```JavaScript
var index = getIndex('huga', hash, 'name');
```
とすると、目的のindexを取得することができます。

# 追記
2017/3/11
@ygknさんからコメントをいただきました。
[array.findIndex()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)を使うと簡単にindexが取得できるそうです！
ありがとうございます！

```
var index = hash.findIndex(({name}) => name === 'huga');
```
[Python][chardet] ファイルの文字コードの自動判別

Pythonで文字コードの自動判定ができないか調べて、できたのでメモ

`chardet` というパッケージを利用すれば簡単にできました。

[Usage — chardet 2.3.0 documentation](http://chardet.readthedocs.io/en/latest/usage.html)

# 使用例

```py3:test.py
from chardet.universaldetector import UniversalDetector

def check_encoding(file_path):
    detector = UniversalDetector()
    with open(file_path, mode='rb') as f:
        for binary in f:
            detector.feed(binary)
            if detector.done:
                break
    detector.close()
    print(detector.result, end='')
    print(detector.result['encoding'], end='')

def main():
    check_encoding('/path/to/sjis.txt')
    check_encoding('/path/to/utf8.txt')

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

```console:出力例
$ python test.py
{'encoding': 'CP932', 'confidence': 0.99}
CP932
{'encoding': 'utf-8', 'confidence': 0.99}
utf-8
```

大きめのファイルだと判別に若干時間がかかるようですので注意が必要です。
（上記の `UniversalDetetor` は判別ができ次第終了はするらしいです）

# 参考
[Pythonにおけるエンコーディング判定 - Qiita](http://qiita.com/morinokami/items/b6edc3b9cf31f4b8b7d1)
[Usage — chardet 2.3.0 documentation](http://chardet.readthedocs.io/en/latest/usage.html)
Vimみたいに画面分割とかできるターミナルアプリってどうやって作るの？

という疑問を持ったので、少し調べてみた。

#やってみた
ターミナルを分割して、ターミナルの任意の位置にカーソルの移動を行うサンプルアプリを作って見た。

動きとしてはこんな感じ

![ansi2.gif](https://qiita-image-store.s3.amazonaws.com/0/36379/c3fc9755-9d7a-2727-7611-c424d77a96cd.gif "ansi2.gif")


##実装
こんな感じで実装してます。

```rb:ansi.rb
# frozen_string_literal: true

# ターミナル幅、高さの取得
width, height = `tput cols`.to_i, `tput lines`.to_i
# 画面を改行で埋めて、カーソルの移動ができるようにする
height.times { puts "\n" }

sleep 2

# ターミナルの中央位置を取得
center = height / 2
# ターミナルの中央部を"="で埋めて擬似的に画面分割をさせる
print "\033[#{center};1H"
puts '=' * width

# ターミナルの先頭行へ移動
print "\033[1;1H"

sleep 2

# 先頭行に文字列を出力
puts 'HELLO WORLD'
sleep 2

# 擬似分割画面下部の先頭行へカーソルを移動する
print "\033[#{center + 1};1H"

# 擬似分割画面下部先頭行へ文字列を出力
print '1234567890'
sleep 2

# 擬似分割画面上部の先頭行へカーソルを移動する
print "\033[1;1H"

# カーソルを左から7番目の位置に移動させる
print "\033[7G"
sleep 2
# カーソルの右側にある文字列を削除する
print "\033[K"
sleep 2
# 文字色を指定して文字列を出力する
puts "\e[31mworld\e[0m"

# 終了後に画面をクリアさせるために、カーソルを画面外に移動
print "\033[1;1H"
print "\033[1A"

sleep 5
```

## 解説
結論から言うと、ANSIエスケープシーケンスを使ってカーソル位置の操作を行い、擬似的に画面分割をさせてる感じ。

どんなことやってるかはコメントで全部書いてあるけど、せっかくだしざっくりと説明を。


#### 1. 画面のクリア 
* ターミナルの高さいっぱい改行を挿入して、画面をクリア。

#### 2. 擬似画面分割
* `=` をターミナルの横幅いっぱいに出力し、擬似画面分割の境界を示す。

#### 3. 上画面の先頭行に文字列を出力
* ANSIエスケープコード `ESC[n;mH` を使用してカーソルを上画面の先頭行に移動
* `HELLO WORLD` の文字列を出力

#### 4. 下画面の先頭行に文字列を出力
* ANSIエスケープコード `ESC[n;mH` を使用してカーソルを下画面の先頭行に移動
* `1234567890` の文字列を出力

#### 5. 文字列の変更
* ANSIエスケープコード `ESC[n;mH` を使用してカーソルを上画面の先頭行に移動
* ANSIエスケープコード `ESC[nG` を使用してカーソルを左から7番目の位置(`WORLD` の `W` の位置)に移動
* ANSIエスケープコード `ESC[nK` を使用して、カーソルより右の文字列を削除
* ANSIエスケープコード `ESC[nm` を使用して、カラーコードを指定して `world` を出力

という感じ。


#まとめ
もっとちゃんと画面分割を表現したい場合は、プログラム内で擬似画面の管理を行う必要があるため、結構苦労しそう。

とはいえ、これができるとターミナルアプリの表現力がぐっと広がるので（あと個人的にとても楽しい）もう少し色々と試してみたい。

#参考
[蒼色工房 -blue studio-](http://www.mm2d.net/main/prog/c/console-02.html)
【手順】AWS CLIインストール（CentOS7）

# 前提
検証OS:　CentOS7.2

# AWS CLIとは
AWSサービスを管理するためのツールです。　
コマンドラインから、AWSの様々なサービスを利用することができます。　

# できること
- コマンドラインから、ELBのアクセスログを確認
- S3との連携（S３にコピーしたり、移動したり）
- SSL証明書をELBにアップロード  
などなど。。。



# 手順
1.　pip のウェブサイトからインストールスクリプトをダウンロードし実行します。

```
# curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
# python get-pip.py
```

2.　pip を使用して AWS CLI をインストールします。

```
# pip install awscli
```

完了！
```aws configure```をすると、初期設定ができます。
そして、/root/配下に、.aws/configが作成されます。
AWSで仮想MFAを紛失したので対応したメモ

# この記事の目的
AWSの1年間無料が終わったので、さてAWSをサクッと解約しよう
と思った矢先思い出したのが、諸事情によりiPhoneを交換したこと。
GoogleAuthenticatorを起動するとそこには空白しか存在しなかった。

## ので、MFAを解除してみた時の流れを
記憶が確かならば、勉強がてらに起動してたインスタンスが1個いた気がしたので
お金かかるのも嫌だし、AWSログイン時のフォーム(*)から問い合わせる。
(* Having problems with your authentication device? Click here とか書いてある)

## 電話番号を求められる

AWSに紐付いてた電話番号だよね？っていう確認すらしないまま投稿してますごめんなさい。
僕は普通に 080〜から始まる電話で、「日本」を選びました。

入力後
*Thank you. Your request for help with your AWS MFA authentication device has been received.*
って出てきた。

なんかメールでも来るんかいな？と思っていたら

## シアトルからの電話
家には諸事情からネット回線が無く、Wi-Fiを求めてカフェで作業してましたが裏目に出て普通に電話がかかってきた。

あっち「AWSのモノです。どうも」
わたし「どうも。日本語のサポートをお願いしたいんだけど」
あっち「わかった。で、今回どうしてこのrequestをしてきたの？(！？)」

英語で電話してくるの分かってたから日本語のサポートをお願いしたはずが。。。

とりあえず、前の携帯をなくしてしまって新しくしたからGoogleAuthenticatorがオワコンなんや助けてクレメンス
(Because, I lost my cell phone with google authenticator, and couldn't login to AWSとか言ったら通じた。)
とだけ簡単に言うと、おっけー、みたいな感じで色々英語で言われる。。。が早すぎてついていけない

## メアドだけでログインできるようになるまで

その後に、Mail address...的な言葉を言われたので
AWSにログインするためのメールアドレスを伝えるとPerfect,との返事。

その後、メアドにメール送ったけど確認できた？読み上げて？的なことを言われたので
ワンタイムパスワードを読み上げる。

その後、電話口から「もうログイン出来ると思うけど、試してみて」って感じで言われ
ログインし直すとダッシュボードが見える。そして2ドルほど徴収されることが決定されていた。

## 終わりに
普段2FAでGoogleAuthenticatorとかをきちんと使わない人は
無くした時のための策をねっておこう。
VO, DTO, POSO, DAO, Entity の違い

## はじめに
try! Swift ではじめてDTO、POSOという言葉を聞いて、Entityとの違いとかよくわからなかったので調べてみた。

すると、類似の用語が5つでてきた。

- VO (Value Object)
- DTO (Data Transfer Object)
- POSO (Plain Old Swift Object)
    - JavaだとPOJO (Plain Old Java Object)
- DAO (Data Access Object)
- Entity

いずれもシンプルに関連するデータをまとめたobjectだが、微妙に性質が異なる。

## VO (Value Object)
- getterのみ
- 不変

## DTO (Data Transfer Object)
- VO + setter
- 可変。外から変更可能
- 異なるレイヤー間（モデル層、ビュー層など）でデータを受け渡すのに使う

## POSO (Plain Old Swift Object)
- おそらくDTOと同じ。たぶん

## DAO (Data Access Object)
- DAO自体はデータを保持せず、DBにアクセスし、DTO/VOを返す

## Entity
- １つのオブジェクトでDTOとDAO両方の性質をかねる


## おわりに
ざっと調べた感じ、上記のように理解しました。
言語とか設計思想によっては、意味が異なってくるかもしれません。
間違ってたら教えてください。


### 参考
- [DAOとかVOとかDTOとか \- 人類みんなごくつぶし](http://d.hatena.ne.jp/muimy/20041015/1097789811)
- [DAOとかDTOとかVOとかEntityとか](http://daipresents.com/2009/dao_dto_vo_entity/)
- [Data Access Object \- Wikipedia](https://ja.wikipedia.org/wiki/Data_Access_Object)
- [Data Transfer Object \- Wikipedia](https://ja.wikipedia.org/wiki/Data_Transfer_Object)
- [データレイヤを分離する \| try\! Swift Tokyo 2017 \#tryswiftconf Day1\-9 \- niwatakoのはてなブログ](http://niwatako.hatenablog.jp/entry/2017/03/02/154103)
eZ Platform 1.8.0 インストール手順

## システム要件
[Step 0: Requirements & System Configuration](https://doc.ez.no/pages/viewpage.action?pageId=31429536)

|              |Debian|Ubuntu|RHEL / CentOS|
|--------------|------|------|---|
|**OS**        |8.x "Jessie"|16.04LTS|7.x|
|**Web サーバー**|Nginx 1.6<br>Apache 2.4|Nginx 1.10<br>Apache 2.4|Nginx 1.8<br>Apache 2.4|
|**DB サーバー** |MariaDB 10.0<br>MySQL 5.5|MySQL 5.7<br>MariaDB 10.0|MariaDB 10.1/10.0/5.5<br>MySQL 5.6|
|**PHP**       |PHP 5.6|PHP 7.0|PHP 7.0/5.6|

## 構築環境例
* CentOS 7.3.1611 (minimal)
* Apache 2.4.6 (base)
* PHP 7.0.16 (remi-php70)
* MariaDB Server 5.5.52 (base)
* eZ Platform 1.8.0

## インストール
### リポジトリの追加と有効化
```bash
yum install http://p80.jp/remi-release-7.rpm
yum install yum-utils
yum-config-manager --enable remi --enable remi-php70
```
### Apache, PHP, MariaDB, Composer のインストール
```bash
yum install mariadb-server memcached php php-{gd,intl,mbstring,mysqlnd,opcache,pecl-{apcu,memcached},process,xml}
sed -i.org 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php.ini
curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer
yum -y install git unzip && composer config -g repos.packagist composer https://packagist.jp && composer global require hirak/prestissimo
```
### データベースの作成
```bash
cat << "_EOF_" > /etc/my.cnf.d/ezplatform.cnf
[server]
character-set-server = utf8mb4
innodb_buffer_pool_size = 128M
[client]
default-character-set = utf8mb4
_EOF_
systemctl start mariadb && systemctl enable $_
mysqladmin create ezplatform
```
### ファイルのダウンロードと展開
```bash
curl -LO https://ezplatform.com/content/download/144/file/ezplatform-1.8.0.tar.gz
mkdir /var/www/ezplatform
tar xf ezplatform-1.8.0.tar.gz --strip=1 -C /var/www/ezplatform
```
### FirewallD の設定
```bash
firewall-cmd --permanent --add-service=http --add-service=https && firewall-cmd --reload
```
### Apache の VirtualHost の設定
```bash
cp /var/www/ezplatform/doc/apache2/vhost.template /etc/httpd/conf.d/ezplatform.conf
sed -i /etc/httpd/conf.d/ezplatform.conf \
-e 's/%IP_ADDRESS%:%PORT%/*:80/' -e 's/%HOST_NAME%/localhost/' \
-e '/ServerAlias/d' -e 's|%BASEDIR%|/var/www/ezplatform|' \
-e 's/%BODY_SIZE_LIMIT%/0/' -e 's/%TIMEOUT%/42/' \
-e '/#Require all granted/ s/#//';
systemctl start httpd memcached && systemctl enable $_
```
### eZ Platform のセットアップ
```bash
cd /var/www/ezplatform
yum -y install git unzip && composer install
secret (ThisEzPlatformTokenIsNotSoSecretChangeIt): $(curl -sS http://nux.net/secret | grep lead | cut -c17-56)
php -d memory_limit=-1 app/console ezplatform:install --env prod clean
chown -R root. /var/www/ezplatform
chown -R apache. /var/www/ezplatform/{app/{config,logs,cache},web}
chmod -R 664 /var/www/ezplatform/{app/{config,logs,cache},web}
chcon -R -t httpd_sys_script_rw_t /var/www/ezplatform/{app/{config,logs,cache},web}
find {app/{cache,logs},web} -type d | xargs chmod -R 775
```
### 管理画面の日本語化
```bash
composer require ezplatform-i18n/ezplatform-i18n-ja_jp
```
### Vim の Twig シンタックス追加
```bash
yum install vim-enhanced
curl -o twig.vim.tar.gz -L https://github.com/nelsyeung/twig.vim/archive/master.tar.gz
mkdir ~/.vim
tar xf twig.vim.tar.gz --strip=1 -C ~/.vim
```
Docker for mac のバージョンアップで com.docker.osx.hyperkit.linux failed to start のエラーが出た場合

以下の2つの修正方法をWebで見つけたのですがなおらず、
3つ目の修正方法でようやくなおりました。

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 修正方法1
Docker for mac をリスタートする。詳細は下記記事参照。

[Mac OS X x Docker で com.docker.osx.hyperkit.linux failed to start となるときの対処法](http://qiita.com/kazuki-ma/items/2261129e5ccfe100a6b4)

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 修正方法2
`rm ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2` を実行する

[Docker for Macで「com.docker.osx.hyperkit.linux failed to start Exit code 1」](http://hsuzuki.hatenablog.com/entry/2017/02/13/131025)

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 修正方法3
修正方法1と2で直らなかったので、最新版をインストールし直しました。
Ruby でバケットソートを書いてみた

## <i class='fa fa-code'></i> バケットソートとは？
>バケットソート（英: bucket sort）は、ソートのアルゴリズムの一つ。バケツソート、ビンソート（英: bin sort）などともいう。バケツ数 k 個使った場合、オーダーはO(n + k)となり、ソートする要素数nとk を無関係にできる場合線形時間ソートとなるが、要素間の全順序関係を用いるソートとは異なり、キーの取りうる値がk種類である、という入力により強い制限を要求するソートである。

[「バケットソート」 『フリー百科事典　ウィキペディア日本語版』- 2017年2月5日 (日) 16:26 14:49 https://ja.wikipedia.org/wiki/バケットソート](https://ja.wikipedia.org/wiki/バケットソート)

## <i class='fa fa-code'></i> コード
```ruby
require "prime"
module BacketArray
  refine Array do
    def backet_sort
      each_with_object(Array.new(size)) { |e, a| a[e] = e }.compact
    end
  end
end

class Test
  using BacketArray
  def self.go
    list = Prime.take(10).shuffle
    print list,"\n"
    print list.backet_sort
  end
end

Test.go
```

## <i class='fa fa-terminal'></i> 実行結果

```ruby
[11, 2, 3, 29, 7, 19, 13, 5, 23, 17]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
```
《WordPress》特定の投稿タイプの予約投稿を無効にする。(未来の日付でも即時投稿できるようにする)

## したいこと

記事を未来の日付で投稿すると通常なら予約投稿になりますが、未来の日付の投稿でも即時に記事が表示されるようにしてみます。

`function.php`に記述します。

## コード

```php

function disable_scheduled_posting_func( $data, $postArray ) {
  if ( ( $data['post_type'] == 'my_post_type' && $data['post_status'] == 'future') && $postArray['post_status'] == 'publish' ) {
    $data['post_status'] = 'publish';
  }
  return $data;
};
add_filter( 'wp_insert_post_data', 'disable_scheduled_posting_func', 10, 2 );

```

if文の`my_post_type`の部分に任意の投稿タイプを記述します。


```php

$data['post_type'] == 'your_post_type'

```



おわります。
fc command で指定範囲の履歴を表示

## <i class='fa fa-question'></i> fc コマンドとは
以前に実行したコマンドを表示、編集、再実行するユーティリティです。

## <i class='fa fa-flask'></i> 試行
```sh
$ echo 1
$ echo 2
$ echo 3
$ echo 4
$ echo 5
$ history -5
10085  echo 1
10086  echo 2
10087  echo 3
10088  echo 4
10089  echo 5

# 指定範囲のコマンド履歴を表示する
$ fc -l 10086 10088
10086  echo 2
10087  echo 3
10088  echo 4

# 任意のコマンドを呼び出す
$ fc -e - 10086
echo 2
2
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [fc (1p) - Linux Man Page](http://www.systutorials.com/docs/linux/man/1p-fc/)
『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その６)

<img width="300" alt="javathread.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/165994/9d302410-0471-96c1-f097-d46649d17209.jpeg">

#Balkingパターン
**balk**とは、やめて帰ること。野球のボークもbalk。Balkingパターンにも、Guarded Suspensionパターンと同様に、**ガード条件**が登場する。Balkingパターンでは、ガード条件が満たされなかったら、すぐに中断する。これが、実行できる状態になるまで待つGuarded Suspensionパターンとの違い。

エディタの自動保存機能みたいなものを考える。現在のデータの内容を定期的にファイルに書き込むという処理をするスレッドがいる。データの内容が更新されたときのみセーブする。データの内容に違いがあることをガード条件とし、違いがなかったらファイルに書き込む処理を行わずに帰る(balkする)。

(コード全体は本書を参照のこと)

```java
...
    public synchronized void change(String newContent) { 
        content = newContent; 
        changed = true; 
    } 
 
    public synchronized void save() throws IOException { 
        if (!changed) { // 変更されていなければ 
            return; // balkする
        } 
        doSave(); 
        changed = false; 
    }
...
```

##登場人物
GuardedObject役は、ガードされたメソッド(guardedMethod)を持っているクラス。ガード条件が満たされていればすぐに実行し、満たされていなければ実際の処理へは行かずに帰る。GuardedObjec役は、インスタンスの状態を変化させるメソッド(stateChangingMethod)を持つ場合がある。サンプルプログラムではDataクラスがこの役をつとめ、saveメソッドがguardedMethod、changeフィールドがstateChangingMethodに対応する。




##どんなときに使うのか

- あえて処理の必要がない場合
- ガード条件が満たされるのを待ちたくない場合
- ガード条件が満たされるのが最初の1回だけという場合。例えば初期化しているかどうかを調べ、初期化されていない場合に一度だけ初期化する場合。

```java
...
    public synchronized void init() { 
        if (initialized) { 
            return; 
        } 
        doInit(); 
        initialized = true; 
    }
```

initializedフィールドのように、「たった一度だけ状態が変化する変数」のことを、一般的に**ラッチ**(latch:掛け金)と呼ぶ。

##タイムアウト
BalkingパターンとGuarded Suspensionパターンの中間として、**ガード条件を満たすまで一定時間待つ**という対処方法がある。ガード条件を満たすまで一定時間まち、それでもまだ条件が満たされなかった場合にはbalkすると言った処理を、**guarded timed**あるいは**timeout**と呼ぶ。

```java
    obj.wait(1000) // 1000ミリ秒待つ
```

しかし、Javaには、**notify/notifyAllされたのかタイムアウトしたのかを区別する方法がない**。


---

関連
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その１)](http://qiita.com/yoshi-yoshi/items/83ecc4476904fa144577)
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その２)](http://qiita.com/yoshi-yoshi/items/792ed2e9dc09f63c5004#_reference-5f26b880e1c02b87a1d8)
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その３)](http://qiita.com/yoshi-yoshi/items/1d2c0e1279af4adb2e9b)
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その４)](http://qiita.com/yoshi-yoshi/items/3b642f91b27120cc4b15)
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その５)](http://qiita.com/yoshi-yoshi/items/427be45a8b0044083911)
PowerShellで、ログオンユーザが所属するグループの一覧を取得する

所属するグループ別に何かしたいときに使用します。
以下のサイトを参考にさせていただきました。

PowerShellで現在のユーザやグループなどのID情報を取得する方法
http://yomon.hatenablog.com/entry/2014/11/15/234529

```ps1:Get-Group.ps1
##--- main ---
cls

# ログオンユーザのID情報を取得する
$userinfo = [System.Security.Principal.WindowsIdentity]::GetCurrent()

# ユーザ名を取得する
Write-Host "ドメイン名\ユーザ名： " $userinfo.Name

# ユーザ名からグループを取得する
$userinfo.Groups | foreach `
  {
  # SIDを可読可能な形式に変換する
  $user_group = $_.Translate([System.Security.Principal.NTAccount]) 
  Write-Host "所属グループ： " $user_group
  # switch文等を使用して、実行したいことをここに記述します。
  }
#--- end ---
```
【手順】ダイジェスト認証

# やること
ApacheのDocumentRootで表示されるページに認証をかける


# 前提
検証OS： CentOS7
アパッチ： Apache2.4


# 手順
1.　パスワードファイルの生成

```
# htdigest -c 任意のパスワードファイル名 "領域名"　ユーザー名
例
# htdigest -c /etc/httpd/conf/.digestpass "Digest Auth" takahashi
```

- -c：　パスワードファイルを新規作成（その後ろにファイル名）  
- 領域名：　httpd.conf内の「Auth Name」と同様のものを指定する。「""」を忘れないこと！！
- ユーザー名：　ダイジェスト認証時に使用するユーザー名


2.　パスワードの設定

```
New password： 任意のパスワード
Re-type new password：　パスワードもう一回
```

3.　設定ファイルに追記

```
# vi /etc/httpd/conf/httpd.conf

下記設定を一番下に追記する。
<Directory "/var/www/html">
    AuthType Digest
    AuthName "Digest Auth"
    AuthUserFile "/etc/httpd/conf/.digestpass"
    Require valid-user
</Directory>
```

4.　アパッチの再起動

```
# systemctl restart httpd
```

5.　ブラウザ上で、サーバーのIPアドレスを入力して認証がかかっていることを確認する。  
ユーザー名：　手順１で作成したユーザー名
パスワード：　手順２で作成したパスワード
はてなブログで設定した記事のアイキャッチ画像がFacebookに正しく表示されなかったときに確認すること

タイトルの通りです。

1. はてなブログでは正しくアイキャッチ画像を設定している
2. どんなに待ってもFacebook投稿時のアイキャッチ画像が設定したものにならない

というパターンに自分もはまったので、解消方法を共有。

# 解消方法

https://developers.facebook.com/tools/debug/

ここに該当ページのURLを入れて「もう一度スクレイピング」ボタンを押下してください。
はてなブログ側で最適な画像を選択したうえで、設定したはずの画像が
アイキャッチとして表示されない場合は、何らかのエラーメッセージが見られるはずです。

Facebookの仕様として、ある程度の時間アイキャッチ画像の取得に時間がかかると、
自動的に他の最適だと思われる画像を探しいって表示するロジックがあるようです。

![スクリーンショット 2017-03-03 22.12.29.png](https://qiita-image-store.s3.amazonaws.com/0/102769/d0374bfa-4e9d-c461-0c05-8a4a1065642e.png)


似たようなことで嵌っていた人がいました。非常に参考になりました、ありがたい。
というかFacebookのアイキャッチ画像表示のロジックとかどこで知れるんだ？？？

http://www.wegirls.tech/entry/2016/09/06/193201
[Unityで学ぶC#] 6 bool 論理値

# 目次
1. 論理値とは
2. if文の条件として使う

---
# 1. 論理値とは

---
## 論理値とは
正しい，　誤り の2値のどちらかの値のことです．

|内容|プログラミングでの書き方|
|:---|:---|
|正|true|
|誤|false|

---
## サンプル
<img width="500" alt="スクリーンショット 2017-03-03 20.55.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/5ab3677d-98fb-ef57-654a-3cd65c663a40.png">
<img width="500" alt="スクリーンショット 2017-03-03 20.55.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/2a382286-4ffa-9bf1-a704-088ce0f358c8.png">

---
## 使うタイミング
条件を満たしているかを示すときに使う

1. 地面に着地しているか
2. 初めて話しかけたとき
3. クリア条件を満たしているか

---
# 2. if文の条件として使う

---
## bool実践
<img width="500" alt="スクリーンショット 2017-03-03 21.04.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/185cf2d2-f756-8d36-5c9e-f6bb14701c4f.png">

1. Startの上に`public bool flag = false;`と書く
2. Startの中に`Debug.Log(flag);`と書く

---

`public`をつけるとInspector上で`flag`の値を変更することができる．

![check.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/9a96b80d-631b-e764-6a45-62fc1ab3eeec.gif)

---

チェックをつけた状態で再生することで`flag`の値がTrueになっていることがわかります

<img width="500" alt="スクリーンショット 2017-03-03 21.55.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/4d823376-fb0a-1b20-30d0-df6033c40079.png">

---
スクリプトを次のように変更しましょう．

```csharp
void Start () {
	if (flag) {
		Debug.Log ("フラグが立ってる!");
	}
}
```

チェックがついているときだけ`Debug.Log`が呼ばれます．
<img width="500" alt="スクリーンショット 2017-03-03 21.59.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/43045948-5e4f-6390-c0fa-b9dda18066a9.png">

---
# おわり
初めてのMac。Windowsで使っていたソフトはMacではこれに移行した

# 概要

先日はじめてMacを買いました。

これまでWindowsで使っていたソフトにはMac版がないものも多く、
新しいものに乗り換えました。

どのソフトを、何に移行したかの対応表です。

# 対応表

## 開発系

|機能|Windows|Mac|
|---|---|---|
|ターミナル|[MobaXterm](http://mobaxterm.mobatek.net/)|[iterm](https://www.iterm2.com/)|
|IDE(エディタ)|[IntelliJ](https://www.jetbrains.com/idea/)|同じ|
|SCPクライアント|[WinSCP](https://winscp.net/eng/docs/lang:jp)|[FileZilla](https://ja.osdn.net/projects/filezilla/)|
|仮想マシン|[VirtualBox](https://www.virtualbox.org/)|同じ|
|プロキシ|[Charles](https://www.charlesproxy.com/)|同じ|
|tail|[Log Expert](http://www.log-expert.de/)|通常のtail|
|Diff|[WinMerge](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html)|[CompareMerge](https://itunes.apple.com/jp/app/comparemerge/id478570084?mt=12)|
|ガントチャート|[GanttProject](https://ja.osdn.net/projects/sfnet_ganttproject/)|同じ|
|SQLクライアント|[HeidiSQL](http://forest.watch.impress.co.jp/library/software/heidisql/)|[Sequel Pro](https://www.sequelpro.com/)|
|Hosts編集|[Hosts File Manager](http://softwarefactory.jp/ja/products/hostsfilemanager/)|[iHosts](https://itunes.apple.com/jp/app/ihosts/id1102004240?mt=12)|


## 便利系
|機能|Windows|Mac|
|---|---|---|
|ランチャー|[Orchis](http://forest.watch.impress.co.jp/library/software/orchis/)|[Alfred](https://www.alfredapp.com/)|
|IME状態表示|[SetCaretColor](http://www.vector.co.jp/soft/winnt/writing/se429127.html)|[ShowyEdge ](https://pqrs.org/osx/ShowyEdge/index.html.ja)|
|半角で打ってしまった文字を全角に変換|[りかなー](http://forest.watch.impress.co.jp/library/software/rikana/)|見つからず|
|IME|[ATOK](http://atok.com/)|同じ|
|キーボードカスタマイズ|[Keylay21](http://www.vector.co.jp/soft/winnt/util/se201151.html)|[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)|
|クリップボード拡張|[CLCL](http://www.nakka.com/soft/clcl/)|[Clipy](https://clipy-app.com/)|
|マウスジェスチャー|[マウ筋](http://www.vector.co.jp/soft/win95/util/se264166.html)|[BetterTouchTool](https://www.boastr.net/)||
定期的に弊社周辺の降水強度実測値を投稿するSlack bot

ついに弊社も全社Slack導入ですよプロデューサーさん！

## 課題
駅から弊社のある某タワーまでは、地下を通れば一度も外に出ることなく移動することができる。
つまり、雨が降っていても雨に濡れずに帰れる。これがべんり。

だけど運の悪い私は、雨が降っているときに限って地下からではなく1階から某タワーを出てしまう。
タワーを出てからはじめて気づく己の愚かさ。これがつらい。

## やりたいこと
弊社周辺の直近の雨量が分かるbotをつくる
そのbotの投稿を見て、つらい雨を回避したい

## どうやるか
1. Rubyで書く
2. [buildpack-ruby](https://github.com/heroku/heroku-buildpack-ruby)を使って[Heroku](https://www.heroku.com/)にデプロイ
2. [Heroku Scheduler](https://devcenter.heroku.com/articles/scheduler)を使って10分毎に定期実行
3. [Yahooの気象情報API](http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html)で弊社周辺の降水強度実測値を取得
4. Slack APIの[Incoming WebHooks](https://slack.com/services/new/incoming-webhook)で取得したWebhook URLに投げる

## 書いたもの
https://github.com/kusapan/weather-bot

## 動いてる様子
<img width="290" alt="スクリーンショット 2017-03-03 21.36.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/124854/e6cb50e7-b00e-df95-03a8-7cef642d13ca.png">

雨降ってないそうなので今日は1階から帰ります。

## まとめ
適宜改良します。
PhpStormで選択した文字列をクオートで囲む

PhpStormでプログラムを編集しているとき、ある文字列をシングルクオートなどで囲みたいことがよくあります。しかし、例えば次のような状態で、

```
abc
```

先頭にクオートを打ち込むと、補完されて

```
''abc
```

と2つ入ってしまいます。といって、文字列を選択した状態でクオートを打つと、

```
''
```

と消えてしまいます。そんな時、便利な設定がありました。

## Surround selection on typing quote or brace

「File→Settings→Editor→General→Smart Keys」にある、「Surround selection on typing quote or brace」をチェックして「OK」をクリックしましょう。

![Screen Shot 2017-03-15 at 17.27.14.png](https://qiita-image-store.s3.amazonaws.com/0/47327/52b27d5e-3b80-2d3f-500b-b3de1b97e43d.png)


この状態で、文字列を選択してクオートやかっこなどを打ち込むと、選択した文字列の前後に入力されるようになります。便利です。
今日やったこととショートカットキー

<h2>今日やったこと</h2>
<ul>
    <li>Sublime Text3のインストールとカスタマイズ</li>
    <li>ホストOS/ゲストOS</li>
</ul>

<br>

<h2>便利なショートカットキー</h2>

<h5>インデントをそろえる</h5>
「ctrlキー」＋「A」　→　「windowsキー」＋「shift] + 「R」
<br>
<h5>フォルダから開く</h5>
sublimetext上で、「windowsキー」＋「ctrl」＋「O」
ディレクトリ構造が把握しやすくなる。



<p>WindowsではそのままRubyを動かせないので、Vagrant, Virtualboxというツールを使って仮想環境というものを作りその中でRubyを動かしていく。</p>

<h5>Virtualboxとは</h5>
PC上に別のOSの環境を作ること
MacでDockerコンテナから同ホスト上に起動しているプロセスにアクセスする

# はじめに
開発を行う際、自身のPCに色々(e.g. Java, Docker, Redis, etc...)起動するかと思います。
その中でも、ローカルに起動したDockerコンテナから、同ホスト上に **Dockerを使わず** 起動したもアプリケーションにアクセスしたくなりました。
OSがCentOSやUbuntuであれば、
- [Docker コンテナ内からホストのIPアドレスを知る](http://qiita.com/jiz/items/ca584ac2012ba6955552)
- [Windows + VirtualBox + Docker で動作しているコンテナからホスト OS へのアクセス](http://takaya030.hatenablog.com/entry/2016/10/29/000647)
から分かるアドレスへアクセスできるのですが、どうも`Mac`だとうまく行きません。

筆者は基本`Mac`を使って開発しているので、「なんとかしたい」ということでなんとかしてみました。

## 環境
| 項目 | value |
|:-----------------:|:--------------------|
| 端末 | Mac Book Pro (13-inch, 2016, Four Thunderbolt 3 Ports) |
| プロセッサ | 3.3 GHz Intel Core i7 |
| メモリ | 16 GB 2133 MHz LPDDR3 |
| OS | macOS Sierra (ver.10.12.3) |
| Docker | Docker for Mac |

# 準備
## Dockerコンテナ
今回はDockerからホスト上のアプリケーションにリクエストを投げるので、特にWebサーバは起動しない単純構成とさせていただきます。
ということで、今回使用したDockerfileはこちらになります。

```Dockerfile
FROM ubuntu:16.04

RUN apt-get update -y && apt-get install -y dnsutils iproute2 iputils-ping curl
```

あとで使いますが、もう`build`して`run`しておきましょう。

```bash
$ docker build -t request-to-host .
$ docker run -it --rm request-to-host /bin/bash
```

## ホスト上アプリケーション
アクセスが確認できさえすれば良いので、今回は簡素なDjangoアプリケーションを立てておきます。

```bash
$ python install django
$ djang-admin startproject host
$ cd host
$ python manager.py runserver
===> Starting development server at http://127.0.0.1:8000/
```

# ホスト上のアプリケーションを求めて
さて、今回の本題です。
コンテナからホスト上アプリケーションにアクセスするためには、
まずコンテナからホストがどのように認識されているかを調べる必要があります。

## ipコマンド
[ここ](http://qiita.com/jiz/items/ca584ac2012ba6955552)や[ここ](http://takaya030.hatenablog.com/entry/2016/10/29/000647)にもあるように、コンテナからホストのアドレスを知るためには`ip`コマンドが使えます。

```bash
$ ip r
===> default via 172.17.0.1 dev eth0
===> 172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.2
```
上記の`default`にあたる部分にコンテナから見たホストのアドレスにあたります。

### これでホストに・・・
では実際にアクセスしてみます。

```bash
$ ping 172.17.0.1
===> PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
===> 64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.113 ms
===> 64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.107 ms

$ curl 172.17.0.1:8000
===> curl: (7) Failed to connect to 172.17.0.1 port 8000: Connection refused
```

pingは(どこかに)通るけどhttpリクエスト等は無理のようです。

## どうする
こいつですが、ふとnslookupをして問い合わせたserverに対してリクエストを投げるとうまくいきます。

```bash
$ nslookup 172.17.0.1
===> Server:    192.168.65.1   <---コレ
===> Address:   192.168.65.1#53
===> 
===> ** server can't find 1.0.17.172.in-addr.arpa: NXDOMAIN
```

```bash
$ curl --head 192.168.65.1:8000
===> HTTP/1.0 400 Bad Request
===> Date: Fri, 03 Mar 2017 12:17:18 GMT
===> Server: WSGIServer/0.2 CPython/3.6.0
===> Content-Type: text/html
```

`400`返ってきていますが、これは単にページが存在しないだけで、アクセス自体はできています。

ちなみに、ホスト側でも

```bash
Invalid HTTP_HOST header: '192.168.65.1:8000'. You may need to add '192.168.65.1' to ALLOWED_HOSTS.
[03/Mar/2017 12:17:18] "HEAD / HTTP/1.1" 400 59989
```
というように、リクエストが来ていることがわかります。

# おわりに
なぜMacだと`ip r`で取得できるアドレスではアクセス出来ないのかがよくわからなかった
(Hypervisorあたりの理由？？  **詳しい方教えてください** )ですが、
これでローカルに直接起動したRedisサーバ等にもアクセスして使うことができそうです。
【手順】DOS対策(mod_evasive)

#DOS対策手順（mod_evasive）

前提条件
============================
 - 検証OS: CentOS7
 - アパッチバージョン： httpd24u
 - アパッチが既にインストールされていること

#手順
1. 対象サーバーにログインして、rootにsu

2. モジュールの確認

``` 
# httpd -l
Compiled in modules:  
 core.c
 mod_so.c　　　　　　　　　　 ←これがあることを確認。ない場合はhttpd24u-develをインストールする
 http_core.c

# httpd -M | grep evasive
evasive20_module (shared)　　←これがないことを確認。ある場合はすでにDOS対策設定されている可能性高

```

3.epelからmod_evasiveをインストールする。

```
# yum install epel-release
# yum install --enablerepo=epel mod_evasive
```

4.任意のDOS設定を行う。

```
# vi /etc/httpd/conf.d/mod_evasive
DOSHashTableSize    3097　　　　　　　　　　　　              ←各子プロセスでのハッシュテーブルサイズ。大きくするとパフォーマンス向上するが、メモリを消費する。
DOSPageCount        2　　　　　　　　　　　    　             ←同ページへのリクエスト数のしきい値
DOSSiteCount        50　　　　　　　　　　　　               　　←同サイトへのリクエスト数のしきい値
DOSPageInterval     1　　　　　　　　　　　                 　←PageCountしきい値の計測間隔（秒）
DOSSiteInterval     1　　　　　　　　　　　　                 ←SiteCountしきい値の計測間隔（秒）
DOSBlockingPeriod   10　　　　　　　　　　　                　←IPアドレスを遮断する時間（秒）　遮断されている時間は403 (Forbidden)を返す。
DOSLogDir           "/var/lock/mod_evasive"　　←ログの排出先
#DOSWhitelist   127.0.0.1　　　　　　　　　　　             　←検出対象外とするIPアドレス
```

5.Apacheの再起動

```
# systemctl restart httpd
```

6.モジュールの確認

```
# httpd -M | grep evasive
evasive20_module (shared)　　←これがあることを確認。

```

7.動作確認

```
# cd /usr/share/doc/mod_evasive-1.10.1
# chmod +x test.pl
# perl test.pl　　　　　　　　　　　　　　　←実行結果が「200 OK」から、途中で「403 Forbidden」になれば完了。
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
```

# 参考
http://dev.classmethod.jp/cloud/aws/mod_evasive20/
http://www.frontier-line.org/lognote/?p=2884
http://makizou.com/1341/
【手順】コマンドラインからELBにSSL証明書をアップロードする

前提
=============
検証OS：Amazon Linux
SSL証明書、中間証明書、秘密鍵を所得済みでサーバー上に展開済み
ELBに証明書をアップロードする方法を記載する


作業手順
=============
1. AWSの管理画面からIAMを作成する。
> [サービス]→[IAM]→[ユーザー]→[ユーザーを追加]→[ユーザー名：任意の名前]→
> [プログラムによるアクセス]にチェック→[次のステップ：アクセス権限]→[既存のポリシーを直接アタッチします]→
> [IAMFullAccess]にチェック→[次のステップ：確認]→[ユーザーの作成]→[.csvのダウンロード]→[閉じる]
> 
> ※[ユーザーの作成]後に表示される、アクセスIDとシークレットキーは今後確認できなくなるので、
> きちんとメモするか、[.csvのダウンロード]を行うこと

2.  対象サーバにログイン後、root ユーザにsu

3. awscli のインストール

```
pip のウェブサイトからインストールスクリプトをダウンロードし実行します。
# curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
#  python get-pip.py
```

```
pip を使用して AWS CLI をインストールします。
# pip install awscli
```

4.　aws configureの実行

```
# aws configure
AWS Access Key ID [None]: 手順1で作成したアクセスキーID
AWS Secret Access Key [None]: 手順1で作成したシークレットキー
Default region name [None]: IAMユーザーのリージョン
Default output format [None]: 出力形式（json、text、table）、デフォルトはjson

/root/配下に.aws/configがあるか確認する
# ls -al /root/
```

5.　証明書をコマンドでアップロード

```
# aws iam upload-server-certificate --server-certificate-name アップロードする際の名前 --certificate-body file://証明書のパスを指定 --private-key file://秘密鍵のパスを指定 --certificate-chain file://中間証明書のパスを指定
```

```
アップロードされている証明書の確認
# aws iam list-server-certificates
```

```
アップロードされている証明書の削除
# aws iam delete-server-certificate --server-certificate-name 削除したい証明書の名前を指定
```


6.　AWSの管理画面で、ELBのSSL用リスナーを設定
>  [サービス]→[EC2]→[ロードバランサー]→[SSL証明書をuploadしたいELBにチェック]→
>  [リスナー（画面下部）]→[編集]→[追加]→
>  
|ロードバランサーのプロトコル|ロードバランサーのポート|インスタンスのポート|インスタンスのプロトコル|暗号|SSL証明書|
|:--:|:--:|:--:|:--:|:--:|:--:|
|HTTPS(セキュアHTTP)|443|HTTP|80|変更|手順5で指定した任意の名前（アップロードする際の名前）|


7.　ブラウザでhttps接続をして、エラーがなく表示がなければ完了。
Djangoの開発環境をDocker化してみた長所・短所

構築については[こちら](https://github.com/dockerfiles/django-uwsgi-nginx)を参考にしました
今回は、こちらの開発環境を使った感想について述べてみたいと思います

# 長所
  * Postgres環境を使い捨て出来る
    * 恐らく考えられる限り一番のメリットだと思います
    * 使い捨て出来る為、様々なWebサイトの検証をPostgresで行う事が出来る
  * OSに依存しない
    * WindowsでもMacでもLinuxでも中身は同じOSが動くので、Windowsでは動かないみたいなパターンが発生しにくいです

# 短所
  * 当たり前だが、そもそも今のフレームワークがあまりDockerと相性良くない
    * Dockerの設定を1からする必要性があったり、ローカルの開発環境環境を完全に無駄にしたりと、もうちょっと発展させられる余地があるように感じられます
  * ローカルの開発環境と比べると若干遅い
  * Docker自体があまり安定しているとは言えない
    * 私の環境では、Postgresがrestartingしたまま動かなくなり、stop→startしてもkillしても直らなかったので急遽ローカルの動作環境を構築させました
    * 環境構築が激しい開発環境との相性はあまり良くないのかもしれません
  * Docker自体の学習コストがやや高め

# 最後に
Dockerは優秀な技術です。問題は、WebフレームワークがDockerにそこまで適応してない所でしょうか

# 追記
エラーの原因はコンピュータをシャットダウンさせた際にPostgresが破損した模様
[こちら](http://stackoverflow.com/questions/29496020/postgres-error-invalid-magic-number-0000)を参考にして解析しました
typescript-eslint-parserの導入でハマった話


[typescript-eslint-parser](https://github.com/eslint/typescript-eslint-parser) を入れようとしてちょいちょいハマった
やんごとなき事情でJavaScriptとTypeScriptが混ざっている場合前提なので、TypeScriptオンリーであればここまで困らないと考えられる

# TL;DR

* jsとtsが混在している場合、に`--ext .js .ts`みたいにjsファイルも一緒に食わせると色々コケて上手く使えない
    * typescript用のコマンドにして、configを別途渡そう
* 一部のルールは上手く動かない
	* 仕方ないけどdisableしよう
* `// eslint-disable-line`とか`// eslint-disable-next-line`行単位の無効化が上手く動いてない
	* ファイル先頭での指定に切り替えていこう

# 詳細

## Typescript用に別途設定ファイルを用意する

だいたいこんな感じで`.eslintrc.js`があると思う。これをTypescriptオンリーなプロジェクトならこれを`typescript-eslint-parser`にしちゃうで良いが、混在のピロジェクトだとjsファイルを`typescript-eslint-parser`が上手くパースできず色々なルールでコケる（コケないルールもある）

```js
// .eslintrc.js 
module.exports = {
  :
  "parser": "babel-eslint",
  :
}
```

そのため、`.eslintrc`をextendしたconfigを別途作ると良い（typescriptとルール共有しなくていいなら別に化粧とかさせなくてもいだろう）

```js
// .eslintrc.typescript.js
const baseConfig = require("./.eslintrc.js")

const overrideConfig = {
  parser: "typescript-eslint-parser"
}

module.exports = Object.assign({}, baseConfig, overrideConfig)
```

当然package.jsonでの起動も別途設定になる。`-c`オプションでconfigを渡し直す

```json
// package.json
{
    "lint": "eslint javascripts/ --ext .js --fix",
    "lint:ts": "eslint javascripts/ -c .eslintrc.typescript.js --ext .ts --fix",
}
```

https://github.com/eslint/eslint/issues/3611
こちらの機能が実装されれば分割しなくてよくなりそうとのこと（ @mysticatea さんに教えていただきました！情報ありがとうございます！）

## 一部のルールは上手く動かないので除外する必要がある

ESLintのルールは当然Typescriptを考慮したものでないので、幾つか不都合のあるルールが存在するとのこと

https://github.com/eslint/typescript-eslint-parser/issues/77

このへんは惜しいが必要に応じてdisableにしていくしかない。自分の場合は`no-unused-vars`, `no-undef`をdisableする必要があった（インターフェース周りでどうしてもうまくいかない）
先ほどのeslintrc上書きを使って、ruleを打ち消してもいいかもしれない

```js
// .eslintrc.typescript.js
const baseConfig = require("./.eslintrc.js")

const overrideConfig = {
  parser: "typescript-eslint-parser"
  rules: {
   "no-unused-var": 0
  }
}

module.exports = Object.assign({}, baseConfig, overrideConfig)
```


ちなみに、typescript-eslint-parserのreadmeには[ESLintのルールのバグはこっちには報告しないでね](https://github.com/eslint/typescript-eslint-parser#reporting-bugs)とあるのでバグ報告する場合は注意

## eslint-disable-lineとかが動いてない
バグな模様

https://github.com/eslint/typescript-eslint-parser/issues/5

こういうのが動かない。

```js
console.warn(message) // eslint-disable-line
```

ファイル先頭に書く場合は動くので、そっちで代用

```js
/* eslint-disable no-console */
 :
 :
console.warn(message)
```

ちょっと不便だが致し方なし
【手順】Swap領域の作成方法（AWS, CentOS7.2）

前提
=============
検証OS：CentOS7.2

やること
=============
Swap領域の作成（今回は1024MB）
→Swap領域はMemoryと同サイズか2倍のサイズにするのが一般的。
/配下にSwap領域（swapvol）を作成する。
参考URL： [LINK](http://qiita.com/na0AaooQ/items/278a11ed905995bd16af) 

Swap領域作成手順
=============
1.サーバーにログインし、rootユーザーになる。

```
# su -
``` 

2.現在の容量の確認。

```
# df -h（Swap領域を作成する場所の空き容量を確認）
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G  3.7G   27G  13% /　　　　　　　←今回は/領域にSwap領域を作成するので、/の容量を確認
devtmpfs        477M     0  477M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   26M  471M   6% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000
```

```
# free（現在のSwap容量の確認）
              total        used        free      shared  buff/cache   available
Mem:        1014976      183228       73212       25736      758536      643972
Swap:             0           0           0　　　　　　　　　　　　　　　　　　　　　　　←現在のSwap容量の確認
```

3.Swap用ファイルの作成。

```
dd if=/dev/zero of=/swapvol bs=1M count=1024
```
4.パーミッションの変更。

```
# chmod 600 /swapvol 
```

5.Swap領域の作成。

```
# mkswap /swapvol
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=93e77ee9-9f33-42c9-8e62-10a45daec7a0
```

6.Swap領域を有効にする。

```
swapon /swapvol 
```

7.Swap領域が有効になったか確認。

```
# swapon -s
Filename                                Type            Size    Used    Priority
/swapvol                                file    1048572 0       -1
```

8.Swap領域の自動有効化設定。

```
# echo "/swapvol  swap        swap    defaults        0   0" >> /etc/fstab
```

9.現在の容量の確認（Swap領域が作成されたことを確認）。

```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G  2.7G   28G   9% /
devtmpfs        477M     0  477M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   26M  471M   6% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000
```

```
# free
              total        used        free      shared  buff/cache   available
Mem:        1014976      184284      103200       25736      727492      644840
Swap:       1048572           0     1048572
```

10.再起動後に、9.の手順を再度行い自動でSwap領域が自動で有効化されているか確認。


注意点
=============
AWSのインスタンスタイプのほとんどがSwap領域を持っていない。
参考URL： [LINK](http://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/)
Ubuntu16.04 でWi-fiが使えない時はまずアップグレードから

# 症状
- [初心者視点]Wifiをつなごうにもそもそも選択肢に出てこない
- [中級者視点]Wi-fiドライバが入っていない
- [上級者視座]略

初めての皆様ちなみにこんな状況でも有線は挿せば使えますよ.

まず, 以下を試したい

```
lspci -nnk | grep 0280 -A2
>>>>
01:00.0 Network controller [0280]: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter [168c:003e] (rev 32)
Subsystem: Lite-On Communications Inc QCA6174 802.11ac Wireless Network Adapter [11ad:0807]

```
OR

```
sudo lshw -class network
>>>>
  *-network               
       詳細: 無線インターフェース
       製品: Qualcomm Atheros
       ベンダー: Qualcomm Atheros
       物理ID: 0
.................
```
といった感じで結果がかえってきたとしたらご安心あれ． 解決する．
最近はインテルではなくクアルコムが使われるようになってきたんですかね．

# 原因
知らない人向けに書くならば, 今インストールしたPCに入っているWifiアダプターをUbuntuで使えていない, という状況.

# 解決
昔はドライバを入れて，，，などをしたのだろうが今はアプデするだけでおｋ.

```
sudo apt update; sudo apt upgrade;
```

なぜかというと`Ubuntu 16.04.2`にアップグレードするとクアルコムのアダプタに対応できてしまうからだ. スタックオーバーフローにはフォルダを作って, だのと書かれているがもう対応されている（驚き）

```
cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
```
こうなっている人にはWifiが使えないという問題すら起きないということだ.
[Unityで学ぶC#] 5 文字の変数

# 目次
1. 文字の代入
2. 文字の足し算

## まずはサンプル
<img width="500" alt="スクリーンショット 2017-03-03 20.29.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/b4b25714-10a0-ed30-e862-42d693b6aafd.png">
<img width="500" alt="スクリーンショット 2017-03-03 20.29.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/e2d1a151-fa9c-6092-56a4-435e8e6df283.png">

文字列を使うときは`string`を使います．
また，文字列を使うときは「"」で囲わないといけないというルールがあります．
文字列を「+」で足し算すると，つながります．

## 使うタイミングの例
1. スコアの表示
2. タグの比較
3. プレイヤー名の保存
[Unityで学ぶC#] 4 小数点を使う

## 目次
1. よく使う4つの変数
2. 四則演算

---
## よく使う数字の2つの型
|データ型|値|
|:--|:--|
|int| 整数|
|float|少数も含めた数字|
---

## int
<img width="500" alt="スクリーンショット 2017-03-03 19.34.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/32494f52-a1bc-3496-ba38-862bbbece882.png">
<img width="500" alt="スクリーンショット 2017-03-03 19.33.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/4f4a5e2f-e3d1-411a-1710-1cd5a05718f0.png">

整数の値を代入することができる．

---

## float
<img width="500" alt="スクリーンショット 2017-03-03 19.45.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/0d23b9e9-899f-f78f-5f1c-648b24703c89.png">
<img width="500" alt="スクリーンショット 2017-03-03 19.45.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/d60a8403-9822-f793-8fa2-e346969ef4ee.png">
浮動小数点数を代入することができる

---
# 計算
例を見て，使って覚えるのが一番早いと思うので，例をたくさんのせます．

---
## intの足し算
<img width="500" alt="スクリーンショット 2017-03-03 19.53.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/f02837c5-6d1a-9825-469c-62c09d3611c8.png">
<img width="500" alt="スクリーンショット 2017-03-03 19.53.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/f37b00e2-505d-bde0-3abe-a2e37d74afda.png">

1. まず`int hp = 0`でhpに0が代入される．
2. `hp = 10 + 20`次の行， =の右にある`10 + 20`が計算されてhpに代入される．

---
## floatの足し算
<img width="" alt="スクリーンショット 2017-03-03 19.58.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/b1c8c91c-413b-90c0-bd06-3607aac66b9c.png">
<img width="500" alt="スクリーンショット 2017-03-03 19.58.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/5cfad80b-02c1-b9a9-94bc-c155e2cadf1a.png">

1. num1 に 2.5が代入される
2. num2 に 3.7が代入される
3. sum に `num1+num2`の計算結果の6.2が代入される

---

## 足し算
<img width="500" alt="スクリーンショット 2017-03-03 20.17.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/096fd8a4-a3a0-2913-d0e2-cfcdff6fde94.png">
<img width="500" alt="スクリーンショット 2017-03-03 20.17.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/dff4ec38-089f-d044-ba20-aef4df32c21f.png">

`+=`で右の数値を左に加算という意味になります． 

---
## 計算の種類
|演算子|説明|
|:--|:--|
|a+b|aとbを足し算|
|a-b|aからbを引く|
|a*b|aかけるb|
|a/b|aわるb|
|a%b|aをbで割ったときの余り|
【WordPress】マルチサイトで別サイトのカスタムタクソノミーが使えないのかよ！ってはまったけどなんとかなった

##　解決方法

[WordPressマルチサイトでカスタムタクソノミーが使えない！？ \| Web技術Tips](http://www.doe.co.jp/hp-tips/2014/07/30/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84/)
firewalldでのポートの開け方と閉じ方

例えばIMAP4

#開ける

```
vim /etc/firewalld/services/imap4.xml                                
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>IMAP4</short>
  <description>The Internet Message Access Protocol version 4 (IMAP4) allows a local client to access email on
   a remote server in a secure way. If you plan to provide a IMAP4 service (e.g. with dovecot), enable this option.</description>
  <port protocol="tcp" port="143"/>
</service>
```
```
firewall-cmd --add-service=imap4 --zone=public --permanent
firewall-cmd --list-services --zone=public  --permanent
firewall-cmd --reload
iptables -L -n | grep 143
```

#閉じる

```
rm /etc/firewalld/services/imap4.xml
firewall-cmd --remove-service=imap4 --zone=public --permanent
firewall-cmd --list-services --zone=public  --permanent
firewall-cmd --reload
iptables -L -n | grep 143
```
jsdoでヒートマップ　その3

#概要
jsdoでヒートマップやってみた。
resasのproxyをnode-redで作ったところ。

#写真
![hh.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/c5e25d36-05f5-8160-d6e6-2bb8c6ed84c0.jpeg)

#説明
http getを受けて、func0でurlとかprefNameとかパースして、resasに対するrequestを組み立てる。
resasにリクエスト投げて、func1でクロスサイト対策して、httpを返す。以上。
Material Design通りにデザインしたはいいけど、どうやって実装するの？

Material Designのガイドラインって
マージンや、フォントサイズなどの数値は書いてあるけど
どうやって実装するか書いてないですよね。

実装方法まとまってるサイト見つけました。
http://www.materialdoc.com/components/
Material Designのカスタム方法まで…

さぁデザイナーもここ見てどんどんレイアウトしていこう！
Windows バッチの研究

##バッチとは
ここでいうバッチとは、CMD.exe のバッチファイルではありません。ここでのバッチの例としては、業務系アプリケーションなどで、営業時間終了後の夜間にその日の売り上げなどの集計を行うプログラムなどがあります。そして、毎日行う処理を日次、月末などに行う処理を月次などと言います。

たいていは CSV ファイルなどとしてサーバの共有フォルダなどにアップされたデータを夜間に一括処理することが多いです。月次だと、全国の支店支所からまとめて送られてきたその月の各種データを本社でまとめて処理して、統計データなどを作ったりします。

専用のプログラムを作らなくても、業務パッケージなどを導入していれば、そのカスタマイズでどうにかなるケースも多いと思われますが、開発に専用の開発ツールが必要でそのライセンス料がバカにならなかったり、その業務パッケージに精通した人が見つからなかったりでいい面ばかりでもないようです。


##Windows でのバッチ開発事情
バッチ処理は RHEL など Linux 系 OS が使われることが多いですが、Windows Server が使われることも割とよくあります。

Linux 系 OS では bash などといっしょに perl や Java が使われることが多いですが、昔ながらのやり方として bash + sed や + awk で頑張っているバッチプログラムもよく見かけます。また、bash でなく ksh や csh が使われることもあります。

Windows Server の場合、これらのツールは標準実装されていないので、Linux からの移植などを意識しない限り使われることはありません。ではどうするかというと次のようなケースが考えられます。

- Visual Studio (C# など) で作る。
- PowerShell で作る。
- WSH (VBScript) で作る。
- CMD.EXE で作る。
- その他のスクリプト言語 (ruby など) で作る。
- 組み合わせて作る。

「Visual Studio (C# など) で作る。」ですが、複雑な処理が多く含まれる場合はお勧めですが、バッチの場合、CSV の処理や SQL の実行など単純な処理が多いのでわざわざ C# を使うのは開発に時間がかかりもったいないです。

「PowerShell で作る。」ですが、.NET Framework のクラスが使えたり複雑な処理も可能で、単純な処理ならコマンドレット一発で済むので一番お勧めです。ただし、複雑な計算処理などが含まれる場合は、他の高機能言語と組み合わせる方がよいでしょう。

「WSH (VBScript) で作る。」ですが、COM ベースでテクノロジー的に古いので、これから２０年とか長く使うシステムにはお勧めできません。そうでないのなら、やや複雑な処理もこなせるのでよいのではないでしょうか。

「CMD.EXE で作る。」ですが、CMD.EXE だけでは大した処理はできないので、主にコマンド、例えば sqlcmd とか bcp とかを呼び出す程度でどうにかなるようなバッチ処理なら可能です。機能不足のために専用のコマンドを他の言語で作る必要が出てくるかもしれません。

「その他のスクリプト言語 (ruby など) で作る。」ですが、Windows Server にわざわざその言語をインストールしなければならず、管理者がいやがります。たいていは NG になると思います。

大部分は簡単な処理だが、複雑な処理が含まれるような場合は、言語を組み合わせて作るのがよいでしょう。例えば、PowerShell + VB.NET とか CMD + C# とかです。


##バッチの要件
以下の内容は Windows 特有という訳ではありません。

ふつう、バッチ処理は限られた時間に大量のデータを処理する必要があるので、処理スピードが求められます。それなら、全部 C 言語で作ったらどうかと思うかもしれませんが、処理時間の大半は SQL の実行なので C 言語で作ってもあまり速くなりません。よって、SQL のチューニングをしたり、一度コマンドを呼び出したらそのコマンドが一気にデータを処理するような作りにする方が重要です。

バッチ処理の最中はふつう人はおらずエラーが起こっても何かをしてやることができません。たまたまカミナリなどでエラーが起こったらリトライをするとか、エラーの原因を後で調査できるようにログを残すとかを考える必要があります。

１つの大きなプログラムとして実装すると、エラーが起こったとき、全部やり直すのに時間がかかることが多いです。よって、いくつかのジョブに分けて実行できるようにした方がよいです。そのようにいくつかのジョブに分けた場合、「スケジューラ」のようなシステムが必要になることが多いです。

夜間バッチの場合、無人のこともありますが、オペレータが常駐しているような場合は、エラーが起こったときに通知できるような手段を用意しておいた方がよいです。

バッチを実行すると、中間ファイルが作成されたり、テーブルにデータが書き込まれてディスク容量が圧迫されてきます。ただ、不要だからと言って古いデータを直ちに削除すると、エラーが発生したときの調査が難しくなります。これら中間ファイルや古いデータは、一定期間保持するようにした方がよいです。

ジョブは他のジョブと並列に動作する可能性があります。そのような場合、ひとつのオブジェクトを同時に使うことも有り得るので排他が必要か考慮する必要があります。


##データベースについて
データベースへのデータの書き込みは、SQL(INSERT文) を使って書くと時間がかかります。これは制約のチェックを行うためですが、SQL Server の場合、bcp コマンドを使って CSV ファイルをインポートすると高速に書き込みができます。SQL を使うなら、BULK INSERT を使うと高速にインポートできます。


##ログについて
ログはエラーが発生したときの調査に使うので、できるだけ単純なメカニズムで確実にログを残せるようにしなければなりません。１つのファイルに複数のジョブが書き込みを行う場合、ファイルがロックされて書き込みができないこともあり得ます。ジョブ（プロセス）ごとにログファイルを用意したほうがよいでしょう。


##タスクスケジューラ
本格的なスケジューラがない場合、Windows の機能として用意されている「タスクスケジューラ」が利用できる場合があります。これは、単に決まった時刻にジョブを起動できるだけなので、本格的なスケジューラに比べて機能的にかなり貧弱です。
jsdoでヒートマップ　その２

#概要
jsdoでヒートマップやってみた。
resasから、ajaxでデータ取って、geojsonのデータと合わせて、jsonを作るところ。

#作ったjson

```
[{"cityName":"山形市","ratio":0.38},{"cityName":"米沢市","ratio":0.46},{"cityName":"鶴岡市","ratio":0.52},{"cityName":"酒田市","ratio":0.57},{"cityName":"新庄市","ratio":0.51},{"cityName":"寒河江市","ratio":0.48},{"cityName":"上山市","ratio":0.61},{"cityName":"村山市","ratio":0.54},{"cityName":"長井市","ratio":0.49},{"cityName":"天童市","ratio":0.51},{"cityName":"東根市","ratio":0.24},{"cityName":"尾花沢市","ratio":0.68},{"cityName":"南陽市","ratio":0.51},{"cityName":"東村山郡山辺町","ratio":0.35},{"cityName":"東村山郡中山町","ratio":0.54},{"cityName":"西村山郡河北町","ratio":0.5},{"cityName":"西村山郡西川町","ratio":0.61},{"cityName":"西村山郡朝日町","ratio":0.64},{"cityName":"西村山郡大江町","ratio":0.56},{"cityName":"北村山郡大石田町","ratio":0.67},{"cityName":"最上郡金山町","ratio":0.64},{"cityName":"最上郡最上町","ratio":0.69},{"cityName":"最上郡舟形町","ratio":0.61},{"cityName":"最上郡真室川町","ratio":0.59},{"cityName":"最上郡大蔵村","ratio":0.77},{"cityName":"最上郡鮭川村","ratio":0.78},{"cityName":"最上郡戸沢村","ratio":0.73},{"cityName":"東置賜郡高畠町","ratio":0.48},{"cityName":"東置賜郡川西町","ratio":0.64},{"cityName":"西置賜郡小国町","ratio":0.53},{"cityName":"西置賜郡白鷹町","ratio":0.57},{"cityName":"西置賜郡飯豊町","ratio":0.6},{"cityName":"東田川郡三川町","ratio":0.52},{"cityName":"東田川郡庄内町","ratio":0.57},{"cityName":"飽海郡遊佐町","ratio":0.68}]
```

#成果物

http://jsdo.it/ohisama1/yJx6

#説明
Jquery v1.8.3を使って、ajaxでresasのデータ読み取って、下記のgeojsonのデータと合わせて
arrayにpushして、JSON.stringifyしてBlobして URL.createObjectURLしてダウンロードする。


```
var geo = {
"06207": "上山市",
"06341": "北村山郡大石田町",
"06213": "南陽市",
"06210": "天童市",
"06206": "寒河江市",
"06212": "尾花沢市",
"06201": "山形市",
"06205": "新庄市",
"06365": "最上郡大蔵村",
"06367": "最上郡戸沢村",
"06362": "最上郡最上町",
"06364": "最上郡真室川町",
"06363": "最上郡舟形町",
"06361": "最上郡金山町",
"06366": "最上郡鮭川村",
"06208": "村山市",
"06302": "東村山郡中山町",
"06301": "東村山郡山辺町",
"06211": "東根市",
"06426": "東田川郡三川町",
"06428": "東田川郡庄内町",
"06382": "東置賜郡川西町",
"06381": "東置賜郡高畠町",
"06202": "米沢市",
"06324": "西村山郡大江町",
"06323": "西村山郡朝日町",
"06321": "西村山郡河北町",
"06322": "西村山郡西川町",
"06401": "西置賜郡小国町",
"06402": "西置賜郡白鷹町",
"06403": "西置賜郡飯豊町",
"06204": "酒田市",
"06209": "長井市",
"06461": "飽海郡遊佐町",
"06203": "鶴岡市"
};
```