OmniAICreator/Qiita-1.07M huggingface dataset:
Bluemix (SoftLayer) の Object Storage に ISO ファイルを認識させるアップロード方法

#参考
- [Custom Content-Types in CloudBerry S3 Explorer: How to Add](https://www.cloudberrylab.com/blog/how-to-add-custom-content-types-with-cloudberry-s3-explorer/)
- [日本語WInodws ServerのISOイメージをBoot From Imageからマウント](http://qiita.com/osonoi/items/724101510e8c23f50d7e)

#問題
CloudBerry Explorer を使った Object Storage (Swift API) へのアップロードだと、ISOが認識されない
![qiita_iso_upload_01.png](https://qiita-image-store.s3.amazonaws.com/0/101361/4428136e-dc02-e180-2c4b-881912d6d7b1.png)

#ちなみに
curl コマンドを使った Object Storage (Swift API) へのアップロードだと、ISOが認識される
![qiita_iso_upload_00.png](https://qiita-image-store.s3.amazonaws.com/0/101361/7a668581-2fc3-9e31-fc52-a5e3d09dd740.png)

#必要な設定
CloudBerry Explorer でカスタムコンテンツタイプを設定します。
<img width="650" alt="qiita_iso_upload_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/227df269-7629-d4d8-da89-caabf7166389.png">
<img width="471" alt="qiita_iso_upload_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/01691085-931f-5e85-9d19-dd34e0ade867.png">
<img width="389" alt="qiita_iso_upload_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/8b397603-3024-7765-61d1-491f0cbd42a3.png">

拡張：　```.iso```
コンテンツタイプ：　```application/x-iso9660-image```

#結果
上記の設定により、認識されることで、ISOテンプレートとしての取り込みやISOブートなどの機能が使えます。
![qiita_iso_upload_05.png](https://qiita-image-store.s3.amazonaws.com/0/101361/895258c8-681d-6405-a751-4cbbbc317233.png)
JavaScriptで非推奨(deprecated)なものはFlowTypeでは存在しない(not found)のエラーになる

# 概要
JavaScriptで非推奨(deprecated)なものはFlowTypeでは存在しない(not found)のエラーになる。
もしかしたら**エラーになるものがある**が正しいかもしれませんが現状では判例としては1つだけです。
同じような事象が発生した場合のための調査の手がかりとして残します。

# 具体例
例えばDate.prototype.getYearが該当します。
https://msdn.microsoft.com/ja-jp/library/x0a9sc10(v=vs.94).aspx

次のようなエラーになります。

```
150:         && lhs.getYear() === rhs.getYear()
                    ^^^^^^^ property `getYear`. Property not found in
150:         && lhs.getYear() === rhs.getYear()
                ^^^ Date
```

## 解決策
上記のgetYearの解説ページには次のようにあります。
> この方法は使用されなくで、下位互換性のみを目的として提供されます。 代わりに、getFullYear メソッドを使用してください。

なので、getYearの代わりにgetFullYear を使用するようにすればエラーにならなくなります。


# その他
追加情報等あればコメント等いただけると助かります
優秀だけどもう少し気の利いたメッセージが欲しかった
※欲張りすぎ？
Linuxで外付けUSB HDD(NTFS)をマウントする際のメモ

# はじめに
NTFSフォーマットのUSB HDDをLinuxに接続して認識させようとした時にちょっとつまづいたのでその時のメモです。
ターゲットのLinuxマシンが外部のWebにつながっておらず(オフライン)、Linux用のSWのインストーラーをWindowsマシンで入手してUSB HDD経由でLinux環境に持っていく、みたいな状況を想定してます。

※環境: RHEL 7.2

# NTFS認識用パッケージ導入
通常NTFSのファイルシステムをマウントしようとすると"unknown filesystem type"で怒られます。
RHELでは標準でNTFSファイルシステム認識用のパッケージは提供されていないようです。
NTFS関連のパッケージはepelリポジトリで提供されていますが、ここではLinuxがWebと接続できない想定なので、以下のサイトから個別にダウンロードして適用する必要があります。
http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/n/

- ntfs-3g-xxx.el7.x86_64.rpm                         
- ntfs-3g-devel-xxx.el7.x86_64.rpm
- ntfsprogs-xxx.el7.x86_64.rpm

※このrpmファイルはどうやってLinuxに持っていくんだ？という話もありますが、それはDVDに焼くなりして、USBとは別の方法でどうにかこうにかやってもらうしかないです...

`rpm -ivh ntfs*` みたいな感じでパッケージをインストールしておきます。

# USB HDDのマウント
USB HDDはSCSIデバイスのような(sdax,sdbxみたいな)名前で認識されるようですが、何というデバイス名で認識されているのかをどうやって知るのかがちょっと戸惑いましたが、以下の記事が参考になりました。
http://mrs.suzu841.com/mini_memo/numero_13.html
dmesgコマンドを打つと、グワーっと大量のメッセージが出ますが、そこからHDDのメーカー名や"USB"というキーワードあたりから、認識されたデバイス名を確認します。
例えば、それがsdb1だったら、マウントポイントのディレクトリ(例: /mnt)を作成し、`mount -t ntfs /dev/sdb1 /mnt ` でマウント！
WordPress カスタム分類（タクソノミー）にデフォルトでチェックをいれたい

# 仕様
* カスタム分類（タクソノミー）にデフォルトでチェック入れておきたい
* 全部にチェクが入っていないときはアラート出す

WordPressの仕様上カテゴリーと異なり、デフォルトの値はそのままでは設定できないので。
（ただしプラグインを使えば出来るようになる）

# ソース
http://qiita.com/gatespace/items/e13b4537282386c6ff3f
上記の応用でjQueryベースで対応可能

```php
<?php
// カスタム分類（タクソノミー）の book の スラッグ blue がチェックされてるかどうか
add_action( 'admin_head-post-new.php', 'book_term_post_edit_required' ); // 新規投稿画面でフック
add_action( 'admin_head-post.php', 'book_term_post_edit_required' );     // 投稿編集画面でフック
function book_term_post_edit_required() {
	// book タクソノミーの blue タームのIDを取得
	$book_term = get_term_by( 'slug', 'blue', 'book' );
	$book_term_id = $book_term->term_id;
	// ここでIDの有無をちゃんとチェックした方がいいのだけどね。
?>
<script type="text/javascript">
jQuery(document).ready(function($){
	// load した時
	var term_check = $('#taxonomy-book input:checked').length;
	if ( term_check == 0 ){
		$('#in-book-<?php echo $book_term_id ?>').prop('checked',true);
		$('#in-popular-book-<?php echo $book_term_id ?>').prop('checked',true);
	}

	if( 'post' == $('#post_type').val() ) {
		$("#post").submit(function(e){ // 更新あるいは下書き保存を押したとき
			term_check = $('#taxonomy-book input:checked').length;
			if ( term_check == 0 ){
				alert('Bookにチェックを入れてください');
				$('.spinner').hide(); // spinnerアイコンを隠す
				$('#publish').removeClass('button-primary-disabled'); // #publishからクラス削除
				$('#in-book-<?php echo $book_term_id ?>').prop('checked',true);
				return false;
			}
		});
	}
});
</script>
<?php
}
```
現場からは以上です。
Node.js のsocket.ioでCan't set headers after they are sent


Node.jsでsocket.ioで「Can't set headers after they are sent」のエラーで詰まった。根本的なところが曖昧だけれども、とりあえず記載。 

nodeのバージョンはv6.11.0
socket.ioのバージョンは2.0.3 

#事象
エントリーポイントとなる、sever.jsにsocket.ioを使う処理を追加した。 
この状態で、「http:localhost:6677/controller」にブラウザでアクセスすると、「Can't set headers after they are sent」でエラーになる。  

■server.js

```js
var http = require("http");
var server = http.createServer();

//urlディスパッチャに使う
var url = require("url");

//htmlファイルの読み込みに使う
var fs = require("fs");

//socket.ioで使う
var io = require("socket.io")(server);



server.on("request",function(req, res){
    console.log("リクエストがあったよ");

    var incomingUrl = url.parse(req.url);

    console.log(incomingUrl.pathname);

    if(incomingUrl.pathname === "/controller"){

        fs.readFile("./client/controller.html","utf-8",(err,data)=> {

            if (err) {
                res.writeHead(404, {'Content-Type': 'text/html'});
                res.write('<head><meta charset="UTF-8"></head>');
                res.end("<h1>Not Found</h1>");
            }else{
                res.writeHead(200, {'Content-Type': 'text/html'});
                res.write(data);
                res.end();
            }
        });


    }else{
        res.writeHead(404,{'Content-Type':'text/html'});
        res.write('<head><meta charset="UTF-8"></head>');
        res.end("<h1>Not Found</h1>");
    }

});

//socket確認用のコード
io.sockets.on("connection",function (socket) {
    console.log("socket connection");

    socket.on("sendMessage",function (data) {
        socket.emit('test',data);
    });

});

server.listen(6677);
```
#原因
下記処理をserver.on("request",function(){})より前に行っているから。

```js
//socket.ioで使う
var io = require("socket.io")(server);

```

#根本的原因

「Can't set headers after they are sent」

上記エラーは、リクエスト処理に対して応答して結果を返しているのに、もっかい結果を返しちゃだめだよというもの。  
「http:localhost:6677/controller」にアクセスした場合、レスポンスはfs.readFile以下の処理しか動かないはずで、res.end()後にもっかいres.write()するようなことはないのにどうしてだろうと詰まった。  

コンソールに吐き出している、console.log(incomingUrl.pathname)の結果をみると、以下の内容が出力されていることが確認できた。  

```sh
リクエストがあったよ
/controller
リクエストがあったよ
/socket.io/socket.io.js
リクエストがあったよ
/socket.io/socket.io.js.map
```

「http:localhost:6677/controller」にアクセスした際に返却するcontroller.htmlでは、以下のようにsocket.io.jsを読み込むようにしている。  

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>レゴカーコントローラー</title>
</head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    <!--socket.ioを使うため-->
    <script src="/socket.io/socket.io.js"></script>
```

問題のコードは以下の挙動をする。第4項の動きはまずそうな気がする。

1. ブラウザから「http:localhost:6677/controller」にアクセス
2. server.jsの「server.on("request",xxxx)の処理が呼ばれて、controller.htmlをクライアント側に返却
3. クライアント側でcontroller.htmlを解析して、src="/socket.io/~"のjsファイルをサーバーに要求
4. server.jsの「server.on("request",xxxx)の処理が呼ばれるが、urlがsocket.ioなので該当するものがなく、Not Foundで返す。

ただ、var io = require("socket.io")(server)　の処理順を変更することで、第4項の処理が呼ばれなくなる理由がいまいちわからない。
pipelineでDockerを使おう

# JenkinsfileでDockerを使う
Docker Pipeline Pluginを使う
https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/index.html#docker-workflow

## :arrow_double_down: Dockerイメージの取得方法

ローカルにレジストリ等を立ち上げている場合は下記のような形で良いです

```groovy
image = docker.image('127.0.0.1:5000/hoge/fuga:latest')
image.pull()
```

DockerHub等にあるものは下記のように、URL指定などを省略できます

```groovy
image = docker.image('maven:3.3.3-jdk-8')
image.pull()
```

Dockerfileをgit等に突っ込んでる場合は下記のように build を使うと良いです
buildはカレントディレクトリのDockerfileを対象としビルドしてくれます

```groovy
checkout scm
image = docker.build('fuga:moge')
```

## :warning: Dockerビルドやイメージ取得に失敗した場合
Try, Catchで囲んでしまえばよしなにできます

```groovy
def image = null
try{
  image = docker.image('maven:3.3.3-jdk-8')
}catch(err){
  // error ...
}
```

## :thumbsup: Dockerイメージ内での処理記述
`inside`を使うことで、Docker内での処理を記述できます
ほぼ公式のサンプルままですが下記のように書きます

```groovy
image.inside {
  git '…your-sources…'
  sh 'mvn -B clean install'
}
```

つなげることもできます

```groovy
docker.image('maven:3.3.3-jdk-8').inside {
}
```

当然ですが、inside内で記述する内容は、jenkinsの環境ではなくdocker環境で実行されます

```groovy
image.inside {
  // Docker上で `sudo apt-get -y install wget` が必要
  sh "wget -q うにゃほにゃ"
}
```

gradleを使うんだったら以下のように権限追加が必要だったりします

```groovy
image.inside {
  sh "chmod +x ./gradlew"
  sh "./gradlew assembleRelease --stacktrace"
}
```
DynamoDB は空の値を登録できないけど DynamoDB document client のコンストラクタにオプションを渡すだけで空の値を NULL 型には変換できるよ？


## 前書き

DynamoDB は空の値を登録しようとすると `ValidationException` が発生してしまいます。しかし、DynamoDB は NULL 型をサポートしており、DynamoDB document client には空の値を NULL 型に変換するためのオプトイン機能が存在します。

**「んなこともう知ってるよハゲ！:anger:」**

という方は大丈夫なのですが、空の値を代入せずに済む仕様にしたり、空の値 (空文字) をスペースで登録したり、空の値を NULL 型に変換するためのオプトイン機能を自前で実装したり・・・という記事も存在します:scream:

**※ オプトイン機能未実装時に投稿された記事も多々有りましたので仕方ありません。**

DynamoDB を始める方がそういうものなのかと思ってしまわないようにここでご紹介したいと思います。

## どうやるの？

[Class: AWS.DynamoDB.DocumentClient — AWS SDK for JavaScript](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html "Class: AWS.DynamoDB.DocumentClient — AWS SDK for JavaScript")

> ## Constructor Details

> `new AWS.DynamoDB.DocumentClient(options) ⇒ void`

> Creates a DynamoDB document client with a set of configuration options.

> **Options Hash (options):**

> * params (map) — An optional map of parameters to bind to every request sent by this service object.
> * service ([AWS](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS.html).[DynamoDB](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html)) — An optional pre-configured instance of the AWS.DynamoDB service object to use for requests. The object may bound parameters used by the document client.
> * convertEmptyValues (Boolean) — set to true if you would like the document client to convert empty values (0-length strings, binary buffers, and sets) to be converted to NULL types when persisting to DynamoDB.

**`convertEmptyValues` オプションを true にして DynamoDB document client のコンストラクタに渡すだけです**:sunglasses:

[こちらの Issue](https://github.com/aws/aws-sdk-js/issues/833 "DynamoDB.DocumentClient should support empty string properties · Issue #833 · aws/aws-sdk-js") により、

> **jeskew** commented on 24 Jan

> **@brandonmbanks** Converting empty values to `null` is now an opt-in feature of the document client; you can pass a boolean `convertEmptyValues` option to the document client constructor to have it do so. I'll open a PR to improve the documentation of this feature.

> 空の値を `null` に変換することは document client のオプトイン機能になりました。`convertEmptyValues (Boolean)` オプションを document client のコンストラクタに渡すことで変換することができます。

[こちらの Pull Request](https://github.com/aws/aws-sdk-js/pull/1268 "Add a contructor option to convert empty strings, buffers, and sets to NULL types in DynamoDB document client by jeskew · Pull Request #1268 · aws/aws-sdk-js") が作成され、マージされたことによりオプトイン機能が使えるようになりました:sparkles:

> **jeskew** commented on 14 Dec 2016

> This change causes the document client's marshaller to render empty strings, buffers, and sets as `{NULL: true}` instead of `{S: ''}`, `{B: new Buffer('')}`, `{SS: []}`, respectively.

> /cc **@chrisradek**

> この変更により、document client の marshaller は、空の strings、buffers、および sets を `{S: ''}`、`{B: new Buffer('')}`、`{SS: []}` の代わりに `{NULL: true}` としてレンダリングします。
YAML入門


公式：http://yaml.org/

主に[dotinstall YAML入門](http://dotinstall.com/lessons/basic_yaml_v2)のまとめ

実際の使用例は[こちら](http://qiita.com/mo4_9/items/44dc67e59915bc5cf2fa#applicationyml%E3%81%A7%E5%85%A8%E4%BD%93%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E7%AE%A1%E7%90%86)


## シーケンス 配列


```yaml:フロースタイル
[red,blue,green]
```

```yaml:ブロックスタイル
- red
- blue
- green
```

```yaml:入れ子
- red
- blue
- # ここは空白
  - orange
  - pink
- green
```

## マッピング　ハッシュ（key/value）

```yaml
{site_name : site name, description: site description}
```

```yaml
# :で位置を揃えると美しい
site_name  : site name
description: site description
```

```yaml:入れ子
meta:
  title: page title
  description: description
```

## 組み合わせ

### 配列をもつハッシュ

```yaml
keywords: [keyword01, keyword02, keyword03]
```

### ハッシュの配列

```yaml
- name: sato
  age : 20
- name: suzuki
  age : 25
```

```yaml:インライン
- { name: sato, age: 20 }
- { name: suzuki, age: 25 }
```

## 改行

### 最後の改行を取り除く

```yaml
|-
  this
  is
  a
  pen.
```

### 最後の改行を取り除かない

```yaml
|+
  this
  is
  a
  pen.
```

## アンカー、エイリアス

&: アンカー（名前をつける）
*: エイリアス（参照する）

```yaml
- &taguchi
  name: taguchi
  score: 80
- &fkoji
  name: fkoji
  score: 90
  friends:
    - *taguchi
- name: dotinstall
  score: 100
  friends:
    - *taguchi
    - *fkoji
```

## ハッシュのマージ

```yaml
defaults: &defaults
  user: dbuser
  password: dbpassword
  database: myapp

development:
  <<: *defaults # マージ
  database: myapp_dev

test:
  <<: *defaults
  database: myapp_test

production:
  <<: *defaults
  database: myapp_prod
```

## YAMLでの書き方がわからないとき

`.to_yaml`メソッドを使う

```ruby
users = [
  {'name' => 'sato', 'age' => 20},
  {'name' => 'suzuki', 'age' => 30},
]

puts users.to_yaml
```

```yaml:結果（YAMLでの表記がわかる）
- name: sato
  age: 20
- name: suzuki
  age: 30
```

> 参考
[プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML)
ruby on rails hashの判定文

###1.エラーその１
```hoge.ruby
hoge.merge!(hash[i]) if hash.present?
```

→この方法だとhash[i]がnilっている時にエラーになる。
>no implicit conversion of nil into


###2.エラーその２

```hoge.ruby
hoge.merge!(hash[i]) if hash[i].present?
```

→この記述だと一見いけそうだが、やはりエラーになる

>undefined method `[]' for nil:NilClass


###3.良い書き方

```hoge.ruby
hoge.merge!(hash[i]) if hash.try(:[],i).present?
```

→これでtryをかけるのでhash[i]が無い時は実行されずエラーにならない
docker-composeでApache+PHP+MariaDBの環境構築

### やりたいこと
docker-composeを試しつつ、3系の書式(主にLongSyntaxでの記述)で書いてみたかったのでメモ

### 事前準備
Docker-Engineが1.13以降でないと3.3では動かない為、更新を行う

https://docs.docker.com/cs-engine/1.13/
の手順に従ってリポジトリを追加し、インストール

```
curl -fsSL 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | sudo apt-key add -
```

```
$ sudo add-apt-repository \
   "deb https://packages.docker.com/1.13/apt/repo/ \
   ubuntu-$(lsb_release -cs) \
   main"
```

```
$ sudo apt-get update
$ sudo apt-get -y install docker-engine
```

### ymlを記述

```:docker-compose.yml
version: "3.3"
services:
    php:
        build:
            context: ./php
            dockerfile: Dockerfile
        depends_on:
            - db
        volumes:
            - type: bind
              source: /var/vm/html
              target: /var/www/html
        ports:
            - target: 80
              published: 80
              protocol: tcp
              mode: host
    db:
        image: mariadb:10 #10.x latest
        volumes:
            - type: bind
              source: /var/vm/db
              target: /var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: ROOTPW
            MYSQL_USER: test
            MYSQL_PASSWORD: TESTPW
            MYSQL_DATABASE: testdb
        ports:
            - target: 3306
              published: 3306
              protocol: tcp
              mode: host
```

```:./php/Dockerfile
FROM php:7.1-apache
RUN apt-get update && apt-get install -y \
       apt-utils \
       zlib1g-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN docker-php-source extract \
    && docker-php-ext-install pdo pdo_mysql \
    && docker-php-ext-install zip \
    && docker-php-ext-install opcache
RUN pecl install apcu
RUN echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apcu.ini
```

### 雑感
単体で起動するよりもシンプルに記述が出来て素晴らしい…
ymlファイルの記述は3.2以降で冗長的に記述できるようになったようで
ドキュメント込みで残す場合には有りなのかな？

#### 修正
phpのオフィシャルコンテナではmysqlが有効でなかった為、コンテナのbuildを追加
Microsoft AzureでAsteriskサーバを立てる

## はじめに
前世代のクラシックVMでの構築は文献がいくつかあったのですが、現行のARMになってからの文献が無かったのでいろいろ調べてみました。

## 基本的には・・・
AzureでLinuxのVMをデプロイして
[AWS上にAsteriskサーバ構築して内線電話環境つくってみよう](http://qiita.com/ganezasan/items/05b16a2254f066f6bbdc)
の記事の通りにすれば稼働します。

**Azure特有の設定としてネットワークセキュリティーグループの受信セキュリティ規則に以下の２つの設定をします。**

- UDP 5060
- UDP 10000-20000　(rtp.confを変えた場合はそのポート)

#問題
**上のリンク先でも書かれていますが、コールはされても音声が聞こえません。**
（原因は本投稿と同じかどうかは不明ですが・・・）

#解決策
sip.confの[general]に以下の２行を追加します。

>externip=VMのパブリックIP (e.g. 10.12.34.56)
>localnet=10.0.0.8/255.255.255.0

``` sip.conf
[general]
context=default
port=5060
bindaddr=0.0.0.0
language=ja
externip=10.12.34.56
localnet=10.0.0.8/255.255.255.0

[201]
type=friend
defaultuser=201
secret=pass
host=dynamic
canreinvite=no

[202]
type=friend
defaultuser=202
secret=pass
host=dynamic
canreinvite=no

[203]
type=friend
defaultuser=203
secret=pass
host=dynamic
canreinvite=no
```
これで聞こえるようになりました。
パブリックIP部分はDNS名では名前解決されないようでしたので、VMのIPは固定にする必要がありそうです。
cordovaでhttpなcontent.srcをWebviewで表示

> 忘れてたのでメモ

config.xmlのcontent.srcにホスティングしているコンテンツを設定した場合（`http〜`なurlを設定した場合）アプリとのWebViewじゃなくて別ブラウザでコンテンツを表示しやがる件

## 対処

`config.xml`に`allow-navigation`を指定する

```
    <allow-navigation href="*" />
```
`href`はセキュリティ考えて適宜調整要
各国の一人あたりGDPのデータを取得する

Twitterで日本の一人あたりGDPについて話が出てて、ほんとかな？みたいに思ったので自分でグラフを作ることにしました。

# 定義の確認

一人当たりGDPとはGDPの総額をその国の人口で割った数

- [GDP (国内総生産)](https://ja.wikipedia.org/wiki/%E5%9B%BD%E5%86%85%E7%B7%8F%E7%94%9F%E7%94%A3)
 - 国内総生産（こくないそうせいさん、英:Gross Domestic Product、GDP）は、一定期間内に国内で産み出された付加価値の総額のことである。
- [付加価値](https://ja.wikipedia.org/wiki/%E4%BB%98%E5%8A%A0%E4%BE%A1%E5%80%A4)
 - 付加価値（ふかかち、英: added value）とは、ある「もの」(例･商品)が有している価値と、それを生み出す元となった〔もの〕(例･原料)の価値との差のことである。一般的に、何らかの〔もの〕を使って新しい「もの」を生み出すと、元々の〔もの〕より高価値な「もの」となる。このようにして高価値となることについて「価値が付加される」という意味合いで、「付加価値」と呼ばれる。

まあ、高校で習う内容ですね。

# GDPのオープンデータ

Wikipediaを見ていると、[国際通貨基金](https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E9%80%9A%E8%B2%A8%E5%9F%BA%E9%87%91)が出しているCSVファイルがありました。これを使ってみましょう。

## World Economic Outlook Database

- [World Economic Outlook Database April 2017](http://www.imf.org/external/pubs/ft/weo/2017/01/weodata/index.aspx)

```
The World Economic Outlook (WEO) database contains selected macroeconomic data series from the statistical 
appendix of the World Economic Outlook report, which presents the IMF staff's analysis and projections of 
economic developments at the global level, in major country groups and in many individual countries. 
The WEO is released in April and September/October each year.

World Economic Outlook (WEO）データベースにはWorld Economic Outlook reportの一連の統計情報データのうちマクロ経済的な
部分が含まれている。これはIMFの職員による分析と国際的なレベル（主要国のグループと多くの個々の国々）における
経済開発の予測を示すところのものである。WEOは毎年4月および9 or 10月にこれを発表する。
```

IMFの人が作ってるなら数字的に間違いはなさそうです

## World Economic Outlook Database 操作手順

### 2017年のトップページへ
- たぶん毎年場所が変わりそう
- 国別の統計がほしいので By Countries (country-level data)を選ぶ
![step1.png](https://qiita-image-store.s3.amazonaws.com/0/20634/153f6574-28b0-9762-961b-17591196f3b5.png)

### Select Country Group
- 興味があるのはG7のデータ(Major advanced economies)なので、それを選ぶ
![step2.png](https://qiita-image-store.s3.amazonaws.com/0/20634/b28ad3a6-961d-3419-880f-a56c86ea13f7.png)

### Select Countries
- とりあえず全部選択したままで進める

### Select Subjects
- ほしいのは１年ごとの国民一人あたりGDPなので、「Gross domestic product per capita, current prices
U.S. dollars」を選ぶ

![step3.png](https://qiita-image-store.s3.amazonaws.com/0/20634/3f0ee631-4cdc-7acf-2ce5-db8a93e960ff.png)

### Select Date Range
- ほしい年月を選ぶ、とりあえずフルでデータがほしいのでStart yearを1980年End Yearを2020年に指定

### できあがり
これでCSVファイルがダウンロードできます　→　[Your WEO Report](http://www.imf.org/external/pubs/ft/weo/2017/01/weodata/weoreptc.aspx?pr.x=82&pr.y=7&sy=1980&ey=2022&scsm=1&ssd=1&sort=country&ds=.&br=1&c=156%2C158%2C132%2C112%2C134%2C111%2C136&s=NGDPDPC&grp=0&a=)

## グラフ化

最初はGoogle Data Studioを使おうと思ったんだけど、結局LibreOfficeでグラフ化しちゃいました
Macのターミナル上(とVim上)で全角記号の幅がおかしい問題を解決する

## 背景
Macのターミナルを本格的に使用しはじめて、「ターミナル上で表示される全角記号の幅がおかしい」と気付きましたが、最近まで特に対応していませんでした。
しかし、Vimでファイルを編集している際に全角記号があると編集箇所がわかりにくい！とストレスが溜まるので解決策を調べて解決したお話です。

## 現象
Macのターミナル上やVim上では、全角記号の幅がおかしくなります。
![before.png](https://qiita-image-store.s3.amazonaws.com/0/62796/f73e99de-4326-1758-9ef6-7afe5797dd3d.png)

## 問題を解決するための設定

### 1. ターミナルの環境設定
ターミナル > 環境設定 > (デフォルトに指定しているプロファイルを選択して)し右ペインの詳細タブ >最下部の`Unicode 東アジアA(曖昧)の文字幅をW(広)にする`にチェック
(Vimを使用しない場合であれば、この設定だけで完了です)

![スクリーンショット 2017-07-18 11.08.40.png](https://qiita-image-store.s3.amazonaws.com/0/62796/7432db5b-d7e2-07b6-517e-ea0ab010eae1.png)

### 2. `.vimrc`の編集
`.vimrc`へ以下を追記する

```vim:.vimrc
"" Macのターミナルで全角記号の表示がずれる問題への対応                                       
set ambiwidth=double
```

#### Vimプラグイン`Yggdroot/indentLine`を使用している場合
私の.vimrcの場合、上記の設定をしてもカーソル行だけインデント表記がずれる、という問題が発生したのでその対応。
インデント視覚化の文字に全角記号を使用していると発生しました。

```vim:.vimrc
"" インデント視覚化に半角|を使用
let g:indentLine_char = '|'
```

## 結果
全角記号も正しく表示されるようになりました。
![after.png](https://qiita-image-store.s3.amazonaws.com/0/62796/bd677439-64e3-896c-b6a7-fa5189261060.png)

## おまけ
今回始めて知ったんですが、Qiitaのコードハイライトって`.vimrc`にも対応しているんですね。
マークダウンで ````vim:.vimrc` で記載するとコードハイライトされました。素敵！
JavaScriptのすべての関数はクロージャを定義します。(読書メモ)

過去に、JavaScriptにおけるクロージャの説明を書籍からメモしました。

- [クロージャを一言で表すと (読書メモ)](http://qiita.com/jun68ykt/items/58ea6085e1304c025836)
- [いよいよ「クロージャとは何か」という質問に答えよう。(読書メモ)](http://qiita.com/jun68ykt/items/88069b1c83e496b4ff16)

これらに続き、別の本で分かりやすい説明を見つけたので、メモしておきます。

以下、[徹底マスターJavaScriptの教科書](https://www.amazon.co.jp/dp/4797388641)より引用

> ## 8.6 クロージャ

>　JavaScriptのすべての関数はクロージャを定義します。クロージャはJavaScriptの強力な機能で、
これによって変数の隠蔽や永続化など、さまざまなことを実現できます。JavaScript はSchemeから
大きな影響を受けて言語仕様が決定されましたが、クロージャもSchemeから持ち込まれた機能です。

> ### [1] クロージャ（関数閉包）

>　**クロージャ（関数閉包）**とは、プログラミング言語における用語で、次のような関数とそのような関数
の機能を実現するデータ構造とを合わせたものをいいます。

> **「自分自身が定義された環境において、関数内の自由変数の名前解決を行う」**

　
　

　この本のクロージャの説明と事例は、とても分かりやすくてよかった。
どのくらい分かりやすいかといえば、

「ここから先、さらに理解を深めるには、JavaScriptインタプリタのソースを読むしかない」

と思えるぐらいに。
Windows > フォルダのタイムスタンプ付きでコピーする > robocopy F:\ C:\backup /s /dcopy:t > 日本語含むフォルダは日付がおかしくなる

```txt:動作環境
Windows 8.1 Pro (64bit)
```

エクスプローラーにてフォルダをコピーした時、フォルダの日時が変更されることに気づいた。

フォルダの日時をコピー元と同じにするにはrobocopyを使うようだ。

参考
http://var.blog.jp/archives/50075787.html

複数のフォルダを一緒にコピーするため以下のようにしてみた。

```
robocopy /MIR F:\ C:\backup\ *
```

> /MIR :: 完全なディレクトリ ツリーをミラー化します。

上記コマンドにてFドライブの内容をC:\backupフォルダ以下にコピーできた。
(ここで、Fドライブには1610や1611などの名前のフォルダがある)。

### 留意点1

**上記でコピーしたファイルをエクスプローラーにて「移動」した時点でフォルダの日時が変更されてしまう**。一時退避して、後でデータを元に戻すにはrobocopyコマンドだけ使うことになりそうだ。

### 注意1

**指定したコピー先フォルダに既存ファイルがある場合、そのファイルが消えるようだ。**

既存ファイルがあるフォルダはコピー先として指定しないこと。

~~`/MIR`オプションを使っているためにこのようになるようだ。
`/MIR`はやめて、`/DCOPY:DAT`の方が良さそうだ。~~
http://var.blog.jp/archives/50075787.html

```
robocopy /DCOPY:DAT F:\ C:\backup\ *
```

(追記 2017/07/18)
**上記の`/DCOPY:DAT`ではF:\以下にあるフォルダはコピーされなかった。**
結局、`/MIR`でコピーした。

### 注意2

コピー先のフォルダ名にて以下の違いが出た。

- C:\backupTest : コピー元と同じ日時のフォルダ
- C:\backupテスト: 処理時点の日時のフォルダ

日本語を含むフォルダ以下にコピーをすると日時が変わってしまうようだ。

## v0.2 > /s使用

@jTakasuRyuji さんの[コメント](http://qiita.com/7of9/items/1cc6b7a8e38810b44899/#comment-9c3c481a1143eea64ea8)にて「/s」と「/dcopy:t」オプションを教えていただきました。

情報感謝です。

/MIRよりも/sの方が良さそうです。

[*]の指定も不要のようです。

```
robocopy F:\ C:\backup /s /dcopy:t
```
「ライブラリーを上げようBOT」でバージョンアップに追随する健全な仕組み

ライブラリーは気がつかないうちに、新しいバージョンがリリースされていたりして取り残される。
バージョンアップ毎に毎回対応していれば良いのですが、一気に上げようとすると大抵動かなかったり、依存関係が壊れたりします。それで、ライブラリーのバージョンアップが上げられずにずっと放置されてしまうみたいなことありますよね。

ですが、プロジェクト内で使用している何百ものライブラリーのすべてのバージョンをチェックをするのは大変です。というか無理です。
なのでBOT化してバージョンアップ毎に小さく対応していける健全な開発を行いましょう。


## SlackBotを作った

ということで、Slackに各ライブラリーの現在バージョンと最新のバージョンが流れてくるようにしました。

![Artboard.png](https://qiita-image-store.s3.amazonaws.com/0/7132/7eb5ae03-cfd5-8429-1817-6509fcb6b65d.png)

対応してないと、毎週こいつが煽ってくる。


## 仕組み

node.jsの場合 `npm outdated` というコマンドが用意されており、
シェルスクリプトからSlackのWebhookに送っています。

```bash
npm install
outdated=`npm outdated`

if [ "${outdated}" = "" ] ; then
  echo ok
  exit
fi

# todo: webhookを取得して差し替えてください
WEBHOOKURL="https://hooks.slack.com/services/xxxxx/xxxxx/xxxxxxxxxxxxx"

curl -s -S -X POST --data-urlencode "payload={\"text\": \"*ライブラリー上げてなくない？*\r\n\`\`\`${outdated}\`\`\`\" }" ${WEBHOOKURL}
```

あとは、こいつをcronとかで回すだけ


## Jenkinsに設定
自分の場合はCIにJenkinsを使っているので、Jenkinsに載っけました。

ビルドトリガーで定期的に実行
<img width="943" alt="スクリーンショット 2017-07-18 10.13.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/7132/de3050f9-7786-8381-d14a-d74a865da003.png">
毎日くるとウザいので、週１にしています。

GitのRepositoryと先程のシェルスクリプトを設定すれば勝手に流れてくるようになります。
NATのこちら側ってどのように表現するのが良いのでしょうか？

お世話になっております。

インターネット側ではなく
NATのこちら側ってどのような表現するのが良いのか
メモるため投稿失礼します。

どなたかおすすめな表現方法をご教授頂けますとうれしく思います。
LaravelをCircleCIでテストしてGAEへ自動デプロイ

こんな感じ。

```
machine:
  timezone: Asia/Tokyo
  php:
    version: 7.0.4
  node:
    version: 6.3.0
  post:
    - npm install -g npm@3
  environment:
    APP_ENV: testing
    APP_KEY: "入力してください"
    DB_HOST: 127.0.0.1
    DB_CONNECTION: mysql
    DB_DATABASE: circle_test
    DB_USERNAME: ubuntu
    DB_PASSWORD: ""
    STORAGE_DIR: /tmp
database:
  override:
    - "php artisan migrate"
    - "php artisan db:seed"
test:
  pre:
    - echo "-----start test-----"
  override:
    - vendor/bin/phpunit
  post:
    - echo "-----end test-----"
deployment:
  staging:
    branch: develop
    commands:
      - cp app.yaml.staging app.yaml
      - gcloud config set project プロジェクト名
      - gcloud auth activate-service-account $ACCOUNT --key-file サービスアカウントのキーファイルパス
      - gcloud -q app deploy --version=staging
  production:
    branch: master
    commands:
      - cp app.yaml.production app.yaml
      - gcloud config set project プロジェクト名
      - gcloud auth activate-service-account $ACCOUNT --key-file サービスアカウントのキーファイルパス
      - gcloud -q app deploy
```
【FileMaker】テーブルオカレンスをデザインレポートでわかりやすく残す

今日は小ネタですが、日頃からやっていることです。

何かと言うと。

リレーションシップグラフでテーブルオカレンスを置くときに、オカレンスに色付けしていることです。
<img width="1175" alt="デザインレポート２.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/da8f97a6-b000-81c0-776b-b9dc1e323b1e.png">

どこで色付けするかというと、テーブルオカレンスを選択し、ウィンドウ下に展開される色をクリックすると、別の色を指定できます。
<img width="497" alt="デザインレポート５.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/fcb304b1-3470-f2f3-6293-3c822e77749f.png">

この例では、同じような分類やサンプルで色分けしていますが、実際の開発では、
・トランザクション
・マスタ
・共通のデータ保持やテンポラリ
などで色を決めていたりします。

ただ、やり方は各社様々なので、こういう枠で囲ったりせずにするチームもありますし、もっと細かく指定するチームもあります。
私が開発するときは、
・トランザクション→<font color="Blue">青</font>系
・マスタ→ <font color="Red">赤</font>系
・共通のデータ保持やテンポラリ→<font color="Green">緑</font>系
と分けていますが、サンプルを作るときは、適当です(^^;;
あとは、受注先によっては指定されていたりするので、それに合わせたりします。

これをしておくと、どの辺で便利かというと、見た目で何のテーブルかというのがわかるというのと、データベースデザインレポートを書き出すときに、その色で背景色を作ってくれるので、レポートも見やすくなります。

※データベースデザインレポートは、FileMaker Pro Advancedの機能です。

こんな↓感じですね。
<img width="1521" alt="デザインレポート３.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/26830a4f-45a4-03be-8c94-8c2555aa1678.png">

リレーションシップも指定したリレーションシップグラフで付けた色で展開してくれます。
<img width="1052" alt="デザインレポート４.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/d0015240-e31c-beb5-52b7-0e0d746a8723.png">

デザインレポート用途でなくても、リレーションシップグラフの見やすさ・理解のしやすさの為にも、色付けをしてみてくださいね。

では、FileMakerライフをお楽しみください。
ストーリーボードでUIを綺麗にレイアウトするネタ集

Storyboardのレイアウトで散々悩まされたので、ここにまとめてUI/Storyboard嫌いを克服したいと思います。


今回はこういったGoogleMapsのDetailView的なレイアウトを直してみましょう。

![Screen Shot 2017-07-16 at 11.47.55 AM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/5431b105-deda-b181-7150-ebc562ca064c.png)

上記のように、これにConstraintsをつけまくったのに、上手くいかないみたいなことありませんでしたか？

## 修正方法1. グループ化する
UIViewを新しく作って、まとまった情報はその下に入れましょう。
そうすると、細々した情報はUIViewの中だけでConstraintを作れるので、大きなレイアウト崩れはなくなる！
![Screen Shot 2017-07-16 at 1.17.52 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/6cf0a02e-5a27-d259-fcb6-27420d3fed21.png)


## 修正方法2: 画像をAspect Fillにする
Apiから画像を引っ張って来る場合、画像サイズがランダムなので、以下のようにStoryboardで**Aspect Fill**と**Clip to bounds**を選んでください。 [詳しくはこちら](http://qiita.com/Saayaman/items/a23519ff5a8ad287cf20)

![Screen Shot 2017-07-16 at 12.28.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/f75b0ebe-b056-0d82-eab0-8fcc045fd6b2.png)

## 修正方法 3. テキスト量がダイナミックに増えたり減ったりする場合のUILabelの制御

Apiなどで住所やタイトルを引っ張って来る場合は、テキスト量や最大テキスト量がわからないので、
以下のようにスペースを空けておくとよい。
![Screen Shot 2017-07-17 at 5.52.03 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/a3713cd8-7284-e56a-1510-fe1bdfc289b4.png)


どんどん増やしていきたいと思います！
Interface2017年8月号のお菓子認識プログラム実行時のIOErrorについて

# はじめに

Interface2017年8月号のお菓子認識記事におけるお菓子の音を判定するプログラム（eval_snack.py）を実行したところ、私の環境ではIOErrorとなりました。

結果的に回避できましたので、その方法の紹介です。


# 環境
- Raspberry Pi 3 
 - Linux raspberrypi 4.9.36-v7+ #1015 SMP Thu Jul 6 16:14:20 BST 2017 armv7l GNU/Linux
- USBマイク
 - [MXL USBバウンダリマイクロフォン AC-404](https://www.amazon.co.jp/gp/product/B001TGTDFM/)


# 発生事象

記事の通りもろもろ準備をして、P.39に従ってお菓子の音を判定するプログラム（eval_snack.py）を実行すると以下の通りIOErrorになりました。

```
$ python eval_snack.py -m result/snack.model
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused

ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused

Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
recording...
Traceback (most recent call last):
  File "eval_snack.py", line 152, in <module>
    main()
  File "eval_snack.py", line 133, in main
    data = stream.read(CHUNK)
  File "/usr/lib/python2.7/dist-packages/pyaudio.py", line 605, in read
    return pa.read_stream(self._stream, num_frames)
IOError: [Errno Input overflowed] -9981
```

# やったこと

- eval_snack.pyの104行目のCHUNKの値を1000から1024に変更
- eval_snack.pyの135行目もrecording finishに修正（エラーとは関係ありません）

エラーになった当初は「PulseAudio: Unable to connect: Connection refused」や「IOError: [Errno Input overflowed] -9981」の線からggりまして、pyaudioを再インストールするなど2日ほど悩んでおりました。結果的に録音の設定の問題だろうと考えまして、pyaudio動作確認を行ったサンプルプログラムとeval_snack.pyのコードを調べてみたという流れです。

マイクの設定を行って、pyaudioのサイトに示されている[サンプルコード](https://people.csail.mit.edu/hubert/pyaudio/docs/)がエラーなく実行できれば、準備に問題はないと思います。


# おまけ

当該記事のプログラムは、Macでも動作しました。
特に悩んだところはありませんが、Chainerのバージョンは1.24.0でないと動きませんでした。
Xcode 8 で自動生成される Core Data エンティティのソースファイル

# はじめに
- Xcode 8 からは、 NSManagedObject のサブクラス（以下エンティティと記述）が、自動生成できます
- 以前のように、メニューから [Editor] -> [Create NSManagedObject Subclass...] として生成する必要がありません
    - クラス定義をカスタマイズしたい場合には、自分で生成させることもできます
- 選択するオプションによって自動生成されるものが異なるので、そのまとめです

# 検証環境
- macOS Sierra 10.12.5
- Xcode 8.3.3

# サンプル
- エンティティ名: Product
    - 属性として name および price を持つ

<img width="1224" alt="datamodel.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/269e0c0a-bb75-db7f-f647-5abfdefea5f4.png">

# 自動生成されるファイル
- エンティティの Codegen プロパティにより、クラスとエクステンションのいずれか（もしくは両方）が生成されます

## クラス定義（A）
- プロパティの宣言などはない、クラス定義部分です

```swift:Product+CoreDataClass.swift
import Foundation
import CoreData

@objc(Product)
public class Product: NSManagedObject {

}
```

## エクステンション（B）
- フェッチリクエストを返すメソッドと、プロパティの宣言が追加されています

```swift:Product+CoreDataProperties.swift
import Foundation
import CoreData


extension Product {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Product> {
        return NSFetchRequest<Product>(entityName: "Product")
    }

    @NSManaged public var name: String?
    @NSManaged public var price: Int64

}
```

# 生成されたファイルはどこに？
- 以下の場所に生成されるようです

```bash
~/Library/Developer/Xcode/DerivedData/プロジェクト名-何らかの文字列/Build/Intermediates/プロジェクト名.build/Debug-iphonesimulator/プロジェクト名.build/DerivedSources/CoreDataGenerated/プロジェクト名/
```

# Codegen プロパティ値と自動生成されるファイルの組み合わせ

| Codegen の値 | 自動生成されるファイル | 備考 |
|:--|:--|:--|
| Manual/None | - | これまで通り、自分で作成する必要あり |
| Class Definition | A, B | 自分で作成する必要なし |
| Category/Extension | B | クラス定義だけは、自分で作成する必要あり |

# どう使い分けるか？
以下のような使い分けになりそうです

- エンティティのカスタマイズが必要: Manual/None, Category/Extension
    - `awakeFromInsert()` や `validateForInsert()` などをオーバーライドする場合など
- エンティティのカスタマイズが不要: Class Definition
gitのリモート、ローカルのマスター、デベロップ以外のマージ済みブランチを削除

gitのリモート、ローカルのマスター、デベロップ以外のマージ済みブランチを削除
利用例：```$ git sync```
編集ファイル：~/.gitconfig

```
[alias]
        delete-merged-remote-branches = !git branch -a --merged | grep -vE '^\\*|master$|develop$' | grep remotes/origin | sed -e 's% *remotes/origin/%%' | xargs -I% git push --delete origin %
        delete-merged-local-branches = !git branch --merged | grep -vE '^\\*|master$|develop$' | xargs -I % git branch -d %
        sync = !git pull --all && git delete-merged-remote-branches && git delete-merged-local-branches
```
[Monaca] iOSアップロードエラーについて

Monacaでは、有料プランからiOSアップロード機能を利用することができます。
iOSアップロード機能については、[Monaca 提供のアップロード機能](https://docs.monaca.io/ja/monaca_ide/manual/deploy/appstore/app_submission/)を参照してください。

リリースビルドをしたファイルをiTunes Connectへアップロードするためには、通常Application Loader等を使用してアップロードする必要があるため、Macが必要になります。

Monacaでは、このiTunes Connectへのアップロード機能を提供しているため、Windows PCの環境でもiOSアプリをリリースすることができます。

Monacaで提供しているiOSアップロード機能を実行した際、エラーによりアップロードに失敗する場合があります。

その中で多いエラーが下記になります。

```
Error: Unable to validate your application. Please sign in with an app-specific password. You can create one at appleid.apple.com.
```

このエラーは、iOSアップロードを実行する際に入力するApp IDに対し、

- 2ファクタ認証が設定されている。
- 通常のパスワードを入力している。

場合に出力されます。

App IDに2ファクタ認証が設定されている場合、iOSアップロードを実行する際に入力するパスワードには、`App用パスワード` を入力する必要があります。

App用パスワードの作成方法につきましては、[App用パスワードを使う](https://support.apple.com/ja-jp/HT204397)を参照してください。

iOSアップロード実行の際、正しいApp IDとパスワードを入力しているのにエラーになる場合は、対象のApp IDに2ファクタ認証が設定されていないか確認してみてください。

2ファクタ認証が設定されている場合は、`App用パスワード` を試してみましょう。
GCE + Rails + SendGrid でメール送信


* GCE = Google Compute Engine

## SendGridで
Setup guide > SMTP Relay と進んで、API keyを生成します（このキーがパスワードになります）。


## Railsで
enviroment.rb または 各環境の設定ファイルにsmtpの設定を追記します。default_url_optionsの設定も忘れずに。ここでコツなのはportに「2525(465や587ではなく)」を指定するところです。ドキュメントにあるとおり、GCEでは主要なメール送信用のポートが閉じられています。

``` config/enviroments/staging.rb
  config.action_mailer.default_url_options = {
    :host => 'yourdomain.com', :protocol => 'https'}
  ActionMailer::Base.smtp_settings = {
    :user_name => 'apikey',
    :password => 'yourpassword',
    :domain => 'yourdomain.com',
    :address => 'smtp.sendgrid.net',
    :port => 2525,
    :authentication => :plain,
    :enable_starttls_auto => true
  }
```

## 参考URL
https://sendgrid.com/docs/Integrate/Frameworks/rubyonrails.html
https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid
MySQLのプライマリーキーの型指定

# MySQLのプライマリーキー指定
MySQL以外でもほとんどのRDBシステムが行の一意性の確保のためにプライマリーキーの指定を強く推奨しています．
多くの場合，サロゲートキーとしてidカラムが作成されたり，論理的に一意性が保証できるキー(の集合)をプライマリーキーにします．
ではこのプライマリーキーの型指定はどうなっているでしょうか．
稀にですが，文字列型(`char`や`varchar`)を含むプライマリーキーを見かけることがあります．十分に検討された上での選択なら仕方がないですが，余程のことがない限りこれらは避けるべきです．

# MySQLのプライマリーキーに文字列型を使用すべきでない3つの理由

## 一意性の確保が面倒
MySQLは`auto_increment`を付けることで，データの挿入時に必ず現在入ってるどのレコードのIDよりも大きな値をなるべく連番になるよう自動で割り振ってくれます．
`auto_increment`はMySQLの再起動時に初期化されることでバグが生じる，という話がありますが外部キー制約を適切に貼っておけば問題ありません．
アプリケーション側で一意性のある文字列を生成するのは面倒ですしあまり意味がありません．

## 時系列が不明
よくレコードの生成された時間を知るために`created`のようなカラムをつけ`DEFAULT CURRENT_TIMESTAMP`を指定することがあります．このカラムを使えば「レコードの挿入された時系列」を知ることは容易です．
ですが，idを`auto_increment`にしていると時系列情報をidから辿れます．ソートする必要もなくseq_scanが可能です．
idを文字列にするとうまくやらない限りrandom I/Oが発生します．

## プライマリーキーはサイズが小さい方が良い
これが最大の理由です．

MySQLはインデックスを貼る際にB+木を作成します．プライマリーインデックスならばリーフノードには実データが格納され，セカンダリインデックスならリーフノードにはプライマリーキーのみが保存されます．
つまり，プライマリーインデックス以外のインデックスを使用する際は，B+木を利用してリーフノードのプライマリーキーを取得し，プライマリーインデックスを引き直して実データを取ってきます(実行計画に`Using index`と出る場合はプライマリーインデックスを引き直さないこともあります)．

なので，もしプライマリーキーのサイズが大きいと，インデックスはどんどん肥大していきます．
MySQLのint型は4Bytesですが，文字列はutf-8なら1文字で1~4Bytes持って行きます．`varchar`なら文字列長を格納するためにさらに1~2Bytes持って行きます．

また，idカラムは他のテーブルに外部キーとして使用される場合もあります．「このテーブルはサイズが大きくないからセカンダリインデックスの肥大化くらい気にしないよ」と思っていても，将来巨大なテーブルの外部キーに使用されれば，それは無視できないサイズになります．

たまに`int`型じゃ行が溢れちゃうよ！という声を聞きます．
`unsigned bigint`で最大で18446744073709551616件保存できます．サイズは8Bytesです．
ログテーブル以外は`unsigned int`の4294967296件で足りる気もしますが...

# まとめ
サロゲートキーとしてのidカラムには可能な限り`unsigned int`と`auto_increment`を使用しましょう．
もしcharやvarchar(textは論外です)がプライマリーキーに入るようならそれらはuniqueキーにしてサロゲートキーとしてidカラムを付けたほうがよくないか検討しよう．
埋め込んだ構造体のメソッドのレシーバは更新されない

Go では構造体の中に構造体を埋め込んで、オブジェクト指向でいう継承っぽいことができます。
そこで、各種処理で共通となるメソッドをベースとなる構造体に埋め込んで、埋め込み先の構造体で派生的な処理をさせることができれば楽かなと思ったができなかった、という話。

具体的には以下のようなコードを想定していました。

- https://play.golang.org/p/3tWhwJGQCH

```go
package main

import "fmt"

type TypeSwitcher interface {
	TypeSwitch(TypeSwitcher)
}

type A struct{}

// 呼び出し処理は共通
func (a *A) CallTypeSwitch1(ts TypeSwitcher) {
	ts.TypeSwitch(a)
}

func (a *A) CallTypeSwitch2(ts TypeSwitcher) {
	a.TypeSwitch(ts)
}

// 各構造体は好きに TypeSwitch の処理を実装したい
func (a *A) TypeSwitch(ts TypeSwitcher) {
	fmt.Println("not implemented")
}

type B struct{ A }

// 構造体B
func (b *B) TypeSwitch(ts TypeSwitcher) {
	switch ts.(type) {
	case *A:
		fmt.Println("type is A")
	case *B:
		fmt.Println("type is B")
	}
}

func main() {
	b1 := B{}
	b2 := B{}
	b1.CallTypeSwitch1(&b2) // type is A
	b1.CallTypeSwitch2(&b2) // not implemented
}
```

以上のコードを実行すると、以下のように出力されます。

```
type is A
not implemented
```

構造体Aを構造体Bに埋め込んでも、構造体AのメソッドのレシーバがBになることはなく、Aのまま実行されます。
なので、上記コードで実行している `CallTypeSwitch` メソッドは B構造体から実行されていても A 構造体のメソッドとして実行されます。

個人的に、構造体の埋め込みはついついオブジェクト指向の継承のように考えてしまいますが、実際には違うので注意が必要と思いました。
Rails使いこなしたい


未だ定まらないいいやり方。
現時点の私が良いと思っているRailsの使い方をメモる。


## 例
pokemonアプリ。
- monsters(ポケットモンスター）
- moves（技）
## nested resourcesのcontrollerの置き場所

### そのリソースに対する基本的なコントローラーであり、アプリに複数存在しない場合
#### 例

```
# routes.rb
resources :monsters do
  resources :moves
end
```

- app/controllers/monsters_controller.rb
- app/controllers/moves_controller.rb

#### 結論
```app/controller/``` 直下。

### 同一リソースに対するコントローラーが、アプリに複数ある場合
#### 例
全技リストと、特定のポケモンが覚える技。

```
# routes.rb
resources :monsters do
  scope module: :monsters do
    resources :moves
  end
end
resources :moves
```

- app/controllers/monsters_controller.rb
- app/controllers/monsters/moves_controller.rb
- app/controllers/moves_controller.rb

#### 結論
routingに合わせたファイル配置にするべき

- 規則が単純で追いやすい
- CRUDの処理結果の遷移先やら取得方法やらを頑張って書き分けなくてよい(一つのコントローラーに詰め込んだ場合と比べて)
- monsterをfindする処理を``` app/controllers/monsters/base_controller.rb```に共通化する余地がある
- その他、DRYにしたいならconcernsにまとめれば良い

- URL規則が変わったらいちいち引っ越すのがめんどくさそう
- 共通部分がconcernsに追い出せるとは言え、２つのActionができることが気に入らない気もする

## asset/javascriptsと同折り合いをつける
標準のgeneratorはviewと同じ配置ルールでjsのテンプレートを配置するくせに、globalに読み込むという地雷。

### Turbolinkを使う(全javascriptを一つにまとめる)
そんなにネイティブで画面遷移がしたくないならReactとか使えばいいじゃんと思う。
でもscaffoldに逆らわないことはrailsのレールに一番乗れているということでもある。

そもそも、ページ固有のjsなんて必要なのか。
globalで全jsロジックが読まれているのがそんなに嫌なのか。
cssだと普通にやっているのに。
cssと同じように、特定ページ固有のものは、id名なりclass名なりのnamespaceに気を使って、自動的に読み込まれればいいのではないか。

### Turbolinkを使わない(個別jsが読み込まれることもじさない)
まだ悩んでいるところ。一応妄想として、こんな感じにならないかなという案。
#### 例

```
# app/assets/javascripts/application.js
- require_tree .

# app/views/layouts/layout.html.erb
+ <%= yield :partial_javascripts %>

# app/views/monsters/new.html.erb
+ <%= content_for :partial_javascripts do %>
+   <%= javascript_include_tag 'new.js' %>
+ <% end %>

# app/assets/javascripts/monsters/new.js
+ monsters#newでの固有の処理
```

- bodyタグにcontrollerとactionのidを割り振って、条件分岐させるより全然いいと思う
- わざわざviewでincludeするのがダサい、どっかでrenderするviewを取得できればよいのに(controller-actionではなく)
- parcial_viewはどうするの
	- 考え中。parcial_viewが複数回呼ばれるケースに対応する必要がある

### Reactなどを使う
すべて解決では？
railsサーバーはAPIに徹して、フロントエンドサーバーを別に立てるという手法を聞くけど、もうrails-coreにwebpackerが入ったのだし、別にサーバー建てなくてもいいと思うんだ。

## おわりに
どうすれば幸せになれるんだ！
ChainerMN を Ubuntu 16.04 でビルドする

漢なら ChainerMN で大規模分散機械学習やりたいですね!

とりあえずビルドしましょう!

## Environment

* Ubuntu 16.04.2 64bit
* CUDA 8.0 64bit(`/usr/local/cuda`)
* virtualenv で python 2.7 環境がインストールされている

`CUDA_HOME` 環境変数に CUDA のパス(`/usr/local/cuda`)が設定されているものとします.

## MPI with CUDA

`CUDA` 有効の OpenMPI をビルドします. apt で入る
 OpenMPI と切り分けるために, `$HOME/local/openmpi` にインストールするものとします.

```
$ ./configure --with-cuda --prefix=$HOME/local/openmpi
$ make -j1  # 並列ビルドだとこけるときがある
$ make install
```

`LD_LIBRARY_PATH` に `$HOME/local/openmpi/lib`, `PATH` に `$HOME/local/openmpi/bin` を追加しておきます.

## NVIDIA NCCL

ChainerMN の installation doc そのままに従います.

https://chainermn.readthedocs.io/en/latest/installation/guide.html#nvidia-nccl

以降, `NCCL_ROOT/build` に NCCL のビルド成果物があるとします.

## Cython

pip で入れます.

```
$ pip install cython
```

## mpi4py

pip install だと apt でビルドされた MPI を仮定するようで, インストールはできるが mpirun 時にこけてしまうので, CUDA-aware MPI の mpicc で再ビルドします.

```
# $HOME/local/openmpi/bin の mpicc を使っていることを確認
$ which mpicc
$ python setup.py build
$ python setup.py install
```


## ChainerMN

そのまま pip install chainermn すると, CUDA のヘッダが見つからないとか言われます.

`nccl.c` のコンパイルに CUDA と NCCL が必要になります.
`CPATH` を設定すればいけるっぽいですが, なんか面倒だったのでソースからビルドし, `CUDA_HOME` と `NCCL_ROOT` を見るようにしました.

https://github.com/syoyo/chainermn/commit/d4b3273eb3cc5ec4d5310da237ea67b7545de4ed

```
$ python setup.py build
$ python install
```

Voala! これで ChainerMN をビルド + 動かす環境が整いました.

## TODO

* Chainer で実際の学習コードを書く
* InfiniBand + multiple GPU でマルチノード + 複数 GPU で学習させる
* GPU マイニングで活用している GPU を転用して, Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour にチャレンジしたい https://research.fb.com/publications/imagenet1kin1h/
* 優秀な機械学習若人が, ChainerMN を使うことにより, 人類史上最速で優秀な分散機械学習若人へと昇華するスキームを確立する旅に出たい.
別の秘密鍵を指定してgitにアクセス

`git` を使う際に、秘密鍵を利用すると思う。
例えば、いつも使っているものと別の鍵でgitにアクセスしたいときがある。（いやほとんどないけど）

ちょっと調べると `~/.ssh/config` を変える方法がすぐに出てくるが、結構面倒。

ということで簡単にやる方法を書いておく

```
ssh-add ~/.ssh/other_secret_key_file # other_secret_key_file が指定したい秘密鍵
```

便利です（滅多に使わないけど）
AWSのささやかなサービス

**IPアドレスを取得するサービス**です。
AWS Batchのドキュメントを眺めていたら、たまたま見つけました。

>ローカルコンピュータのパブリック IP アドレスが必要になります。このアドレスはサービスを使って取得できます。たとえば、次のサービスが提供されています。
http://checkip.amazonaws.com/

-_引用: [AWS Batchユーザーガイド](http://docs.aws.amazon.com/ja_jp/batch/latest/userguide/get-set-up-for-aws-batch.html#create-a-base-security-group "Qiita")_-
DockerfileのCMDでforeverからのhubotを起動

同様のことをしている資料だと動かないことが多々あったので記録しておきます。

```Dockerfile:Dockerfile
RUN npm install forever --save && npm install
CMD node_modules/forever/bin/forever -c coffee node_modules/.bin/hubot -a slack
```

`forever -c` で任意のunixコマンドを呼び出すことが出来ます。

`bin/hubot` はShellScriptで`node_modules/.bin/hubot`を呼び出しています。
`node_modules/.bin/hubot` はCoffeeScriptです。
各ファイルの中身をちゃんと確認せずデーモン化しようとして嵌まりました。
マッチした文字列の行を出力したい

# 目的
シェルコマンドのgrepのように、マッチした文字列の行を出力したい

# 環境
CentOS 7

# コード
- perlのgrep関数は期待した結果と異なる為、system関数を使ってシェルコマンドのgrepを呼び出す
- grepでマッチした文字列があれば、戻り値として0を回答する。以下の例であれば、$return_codeに0またはそれ以外の値が入る

```test.pl
use strict;
use warnings;
use utf8;

my $policy = "test";
my $return_code = system("grep $policy target.txt > data.txt");

if($return_code ne 0) {
	exit;
}
	print "次の処理を続ける"
```
bashでIFSを使わずにsplitする方法


## はじめに

こんな方法があるなんて知らなかった。
~~IFSなんていらなかったんだ！~~

[ここ](https://stackoverflow.com/questions/19606816/bash-awk-split-string-into-array?answertab=votes#tab-top)に載っていたのを模倣しただけです。
でも日本語の記事が見当たらなかったので書きました。

## 環境

* OS: macOS Sierra 10.12.4
* bash: GNU bash, version 3.2.57


## やりたいこと

文字列を指定したデリミタで分割して配列に格納したい。
いわゆるsplitです。

## まずは結論から

例えばパスからディレクトリの配列を得るにはこうなる。
split（というか置換してるだけ）の処理は一行。便利！

```bash:split-sub.sh
#!/bin/bash

path=$1;
declare -a a_dirs=();
a_dirs=${path//\// };

for dir in ${a_dirs[@]};
do
  echo $dir;
done

exit 0;
```

### 実行結果

```bash
$ ./split-sub.sh $(pwd)
Users
tommarute
script
split_test
```


## 今までの方法

よくあるIFSを使ったやり方。

```bash:split-ifs.sh
#!/bin/bash

function split() {
    local -a _dirs=();
    path=$1;
    c_ifs=$IFS;
    IFS=$2;
    _dirs=$(echo $path);
    IFS=$c_ifs;
    echo $_dirs;
}

main() {
    declare -a a_dirs=();
    a_dirs=($(split $1 '/'));

    for dir in ${a_dirs[@]};
    do
      echo $dir;
    done
    exit 0;
}

main $@;
```

### 実行結果

```bash
$ ./split-ifs.sh $(pwd)
Users
tommarute
script
split_test
```

## おまけ

今回書いた方法は、デリミタを空白に置換して配列に変換しているわけで、であればtrでもできるんじゃ。。

と思ってやってみたらできました。
気づかなかった。

```bash
#!/bin/bash

path=$1;
declare -a a_dirs=();
a_dirs=$(echo $path | tr '/' ' ');

for dir in ${a_dirs[@]};
do
  echo $dir;
done

exit 0;
```

### 実行結果

```bash
$ ./split-tr.sh $(pwd)
Users
tommarute
script
split_test
```

## おわりに

bashでIFSを使わずにsplitする方法について書きました。
今までIFS使って書いたコード全てリファクタリングしたい。

！！！ご注意！！！
この記事はあくまで私がIFSを使ったsplitより簡単だと感じた手法について書いたものであり、決してIFSを否定するものではありません。
SSRしてくれるホスティングサービス「Roast」

# Roastとは
1コマンドでデプロイできて更にSSR(サーバーサイドレンダリング)までやってくれるホスティングサービスです

https://www.roast.io/

# 主な機能
- サーバーサイドレンダリング
- デフォルトでSSL対応
- カスタムドメイン対応

# 使い方
## サンプルのindex.htmlを用意する
jsで「test」って表示するだけのものです

```html:index.html
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <h1>Hello,World</h1>
        <div id="container"></div>
        
        <script>
            document.getElementById('container').innerHTML = 'test'
        </script>
    </body>
</html>

```

ちなみにブラウザからページのソースを覗いてみると以下のようになっていてサーバーサイドレンダリングはされていません!

![1500302489865.jpg](https://qiita-image-store.s3.amazonaws.com/0/92480/8733a7c8-59d1-b390-3f3b-fa86e44ebf67.jpeg)

## roastインストール
npmでできます

```bash
$ npm i -g roast
```

## roastにデプロイ
index.htmlがあるディレクトリでコマンドを実行します

```bash

$ cd projectDir
$ roast deploy

  Roasting deploy from folder /Users/nagimaru/dev/projectDir

☕  Deploy roasted!

✨  https://pacific-ticket-xxxx.roast.io
```

表示されたURLを見てみましょう
![1500302536765.jpg](https://qiita-image-store.s3.amazonaws.com/0/92480/3fa0bd94-7516-9e1b-a2be-e437651c91ee.jpeg)
しっかりデプロイできてますね！
ページのソースも確認してみましょう。
![1500302515372.jpg](https://qiita-image-store.s3.amazonaws.com/0/92480/0e774a99-5e0b-4a56-d40b-261db27e7e54.jpeg)

しっかりサーバーサイドレンダリングしてくれているようです👍✨

# その他
とても簡単にデプロイできたかと思います！
サポートしているフレームワークはReact,Angular, Preact, Vue, Ember。
今後はバージョン管理や自動セキュリティヘッダーなどの機能もリリースされる予定だそうです

ちなみに有料のプランもあります！
デバイスフォントに長体をかけてみよう

とある案件でやったやつ。です。
デザイナさんの要望で長体かけたかったのだけど、画像にはできない。
ならばどうしよう、と考えた結果の実装例です。

## サンプル
こんな感じ。
![qiita_scale_sample_0717.png](https://qiita-image-store.s3.amazonaws.com/0/97513/b22a7572-52bb-b214-3d28-23a6fbd2736c.png)

現時点であまりこういう処理しているサイトを見かけないし、ちょっとイケてる感が出せますよね。
エンタメ系の案件以外ではあんまり出番が無さそうかもですが……。

見た目だけじゃなく、同じスペースでも文字を気持ち多めに詰め込めるというメリットもありますね。
スマホだと動作もたつくかなぁと思ったけど、全然そんなことはなかった。

## 実装方法
ソース例。

```html:HTML
<article class="article-narrow">
	<p>
		テキストは普通に入れてOK。<br>
		春日部ハル「メラメラって感じです！」
	</p>
</article>
```
```css:CSS
.article-narrow {
	width: 600px;
}
.article-narrow p {
	transform-origin: 0 0;  /* 要素の左上を基準に変形をかける */
	transform: scaleX(0.9); /* 長体率(%) / 100 */
	width: 111%;            /* 要素幅調整（下記参照） */
}
```
早い話が、対象の要素に`transform: scaleX(長体率(%) / 100)` と指定してやるだけです。
ただ、そのままだと幅が縮まってしまうので、幅を広げて調整するのがポイント。
scaleがかかった後に親要素の幅と等しくなるよう、
親要素の幅を基準に`(100 / (長体率(%)) * 100)%`をかけてあげるとよいでしょう。
※そのままだと読み辛いので、letter-spacing当てた方がよいと思います。

WebフォントでCondensedなフォントが使えればそれが一番良いんだけど。
※有料のWebフォントが使える案件なら、フォントワークスのUD角ゴとか使えば最高だとおもいます。


## 実際の適用例とか
……というやつを使って組んだ同人即売会のサイトがこちら→[アクアマリンドリーム](http://aquamarine-dream.info/)
実案件で使っても特に問題が出なかったので、趣味関係の案件でも使っていくスタイル。

サンプルテキストは WITCH NUMBER4 / SAKURA より。
ナナシスを聴いてください。
phpで問題を解いてみた

#問題
用意された配列の値のうち、１つにプラス1して、すべての値と乗算した場合
どの値にプラス1するのがもっとも**大きい結果**になるか

###例
0)
numbers = {1, 2, 3}
Returns : 12

1)
numbers = {1, 3, 2, 1, 1, 3}
Returns : 36
※数字は必ずしもユニークではない

2)
numbers = {1000, 999, 998, 997, 996, 995}
Returns : 986074810223904000
※
答えは非常に大きい数字になりますが、2の62乗を超えません

3)
numbers = {1, 1, 1, 1}
Returns : 36


#自分なりの回答

```php
<?php
$numbers = array(1,1,1,1);
$target1 = 0;
for ($y = 0; $y < count($numbers); $y++){
  $target2 = 1;
  $numbers[$y] = $numbers[$y] + 1;
  for ($i = 0; $i < count($numbers); $i++) {
      $target2  = $target2 * $numbers[$i];
  }
  $numbers[$y] = $numbers[$y] - 1;
  if($target1 < $target2){
      $target1 = $target2;
  }
}
echo $target1;
?>

```

これだと2重にループするので配列に1000個値が入ってきたときにとんでもない数ループする
そしてメソッド化していないため、テストするさいに、配列の中身を書き換える必要があるため
ソースを書き換えることになってよろしくない

#他の方の回答

```php

<?php
function check($arr) {
    asort($arr);
    $arr[0] += 1;
    return array_reduce($arr, function ($carry, $item)
    {
        $carry *= $item;
        return $carry;
    }, 1);
}

var_dump(check(array(1,2,3)));
?>

```

私の回答と違い、メソッド化してあるのでテストのさいにもコードを書き換えずテスト化
array_reduceを使用することによって、ループの数を私の回答から比べて半分に減らしている。


#まとめ
短いですがまとめると
私の回答はゴリ押しで誰でも思いつくような回答ですが、phpにはarray_reduceやarray_filter等便利な配列用の関数がいろいろあるので
どういう関数があるのか見ておいたほうが、私のような恥ずかしいコードを書かなくて済みますな。