OmniAICreator/Qiita-1.07M huggingface dataset:
xcodeでitunesconnectにアップする際に「ERROR ITMS-90032: "Invalid Image Path - No image found at the path referenced under key 'CFBundleIconFile': 'Icon-57.png'"」とでたら


xcodeから、iosアプリをこれからアップするぞ！って時に、下記エラーで帰れなくなった時の対処方法。

```

ERROR ITMS-90032: "Invalid Image Path - No image found at the path referenced under key 'CFBundleIconFile': 'Icon-57.png'"

```

ターゲットバージョン、iOS8.0で作っているアプリで、
そもそもアイコンサイズに下記のようなサイズを設定するところがないはずなのに、
「**icon-57.png**」。。。そのなサイズない。。！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/8799b760-b688-adf9-375e-2df334439ed1.png)


ですが、icon-57でgrep検索すると、、
plistにひっかかります。
こやつを、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/fac1bad7-66b1-b50a-af35-85c8d2a8f80e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/38b34bf7-2061-97a0-1a38-a0bcb8723208.png)


**デリート！**





xcodeで、無事にitunesにコネクトにアップできました。。！！

ぬおっ！
CentOS7 に Nginx 入れてdocker コンテナにプロキシする

# 前提
[前回の記事](https://qiita.com/zoe302/items/307327da5c75628daadb)の続き的なコンテンツ

サーバは CentOS7
docker コンテナでWEBサーバがすでに起動している。
ホストサーバ上に複数 docker コンテナでWEBサーバが起動しており、それらをホストサーバのバーチャルホスト経由でプロキシし、それぞれがどのポートにいるかを意識せずにブラウザから見えるようにしたい。
docker コンテナ上の WEBサーバは開発環境であることを想定し、basic 認証をかけたい。

## Nginx インストール&自動起動設定
```bash
sudo yum install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
```
## ポートリッスンできてるか確認
```bash
# ミニマムインストールで入ってなかったのでインストール
sudo yum install lsof
sudo lsof -i :80
----
COMMAND  PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
nginx   8754  root    6u  IPv4 3613680      0t0  TCP *:http (LISTEN)
nginx   8754  root    7u  IPv6 3613681      0t0  TCP *:http (LISTEN)
nginx   8755 nginx    6u  IPv4 3613680      0t0  TCP *:http (LISTEN)
nginx   8755 nginx    7u  IPv6 3613681      0t0  TCP *:http (LISTEN)
----
```

## 外部から見えるようにする
```bash
# firewall 80, 443アクセスできるようにする
sudo firewall-cmd --add-service=https --zone=public --permanent
sudo firewall-cmd --add-service=http --zone=public --permanent
# ブラウザから nginx の index.html が見えることを確認
```

## htpasswd 設定
```bash
sudo mkdir -p /etc/nginx/htpasswd
sudo echo "ユーザ名:$(openssl passwd -apr1 パスワード)" > /etc/nginx/htpasswd/ユーザ名
sudo chown -R nginx:nginx /etc/nginx/htpasswd
sudo chmod 600 /etc/nginx/htpasswd/ユーザ名
sudo chmod 700 /etc/nginx/htpasswd
sudo vim /etc/nginx/nginx/conf
```
```nginx:/etc/nginx/nginx/conf
# (省略)
http {
    auth_basic           "private site";
    auth_basic_user_file /etc/nginx/htpasswd/ユーザ名;
# (省略)
```
```bash
sudo nginx -s reload
```
ブラウザから basic 認証がかかっていることを確認

## プロキシ
```nginx:/etc/nginx/conf.d/hoge.conf
upstream hoge.fuga.com {
    # docker コンテナが10080でポートフォワーディングしてるとする
    server 127.0.0.1:10080 weight=1;
}

server {
    listen       80;
    server_name  hoge.fuga.com;

    access_log  /var/log/nginx/hoge.fuga.access.log  main;

    location / {
        proxy_pass http://hoge.fuga.com;
    }
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```
```bash
# 設定ファイルチェック
sudo nginx -t
# 設定読み込み
sudo nginx -s reload
# hoge.fuga.com にブラウザ上からアクセスして見れればOK(hostsに設定するのを忘れずに)
```
docker コンテナが増えたら プロキシ の部分を設定すればOK
Pythonでparse_args後、ハイフンからアンダーバーに置き換わる。

Gitに上がっているredashのソースを読んでいるうちに
arikfr氏が書いたre:dash結果をCSVでメールで送信するスクリプトを見つけた。

https://gist.github.com/arikfr/a730451c01d1dd326412

ソースを追っていて、「なんでこーなるの？」って所があったので
メモ代わりにここに残す事にした。
ちなみにPythonは他のプログラム同様「なんとなく読める」程度のレベル。
Pythonで何かを作ったことはない。

# 疑問

``` 2行目
Example execution:

python mailer.py --query-id 2226 --query-api-key 6764573853b4065aac3258b8c7bc561dc4179092 --org-slug default \
                 --smtp-username "..." --smtp-password '...' --smtp-host 'smtp.mailgun.org' \
                 --sender 'Arik <arik@redash.io>' --to 'arik@redash.io'
                 --subject "Test" --body-html-file html --body-text-file text
```


``` 66行目
    parser = argparse.ArgumentParser(description='Mail Re:dash CSV query by email.')
    parser.add_argument('--smtp-username')
    parser.add_argument('--smtp-password')
    parser.add_argument('--smtp-host')
    parser.add_argument('--sender', help='From (sender) address')
    parser.add_argument('--to', help='To address(es)', nargs='+')
    parser.add_argument('--bcc', help='Bcc address(es)', nargs='*', default=[])
    parser.add_argument('--subject', help='Subject line.')
    parser.add_argument('--body-html-file', help='Body html file path.')
    parser.add_argument('--body-text-file', help='Body text file path.')
    parser.add_argument('--org-slug', help='Query id to export')
    parser.add_argument('--query-id', help='Query id to export')
    parser.add_argument('--query-api-key', help='API key for the query')

    args = parser.parse_args()
```

``` 82行目
    query_csv = get_query_csv(args.org_slug, args.query_id, args.query_api_key)
```

あれ？
--query-api-key で受け取ったのが、query_api_keyになっている。
ちゃんと動くの？


# サンプルスクリプトを作って試してみる

``` test.py
import argparse

parser = argparse.ArgumentParser(description='Sample code for python.')
parser.add_argument('--username')
parser.add_argument('--query-id', help='Query id to export')
parser.add_argument('--query-api-key', help='API key for the query')

args = parser.parse_args()

print(args.username)
print(args.query_id)
print(args.query_api_key)

```

``` 実行結果
$ python ./test.py  --username tsukada --query-id 123 --query-api-key abcd123
tsukada
123
abcd123
$ 
```
あら。普通にウマく行った。parse_argsを行うとハイフンがアンダーバーに変換されるのか。

試しにパースされた後、ハイフンで受け取ろうとした。

``` ダメなtest.py
import argparse

parser = argparse.ArgumentParser(description='Sample code for python.')
parser.add_argument('--username')
parser.add_argument('--query-id', help='Query id to export')
parser.add_argument('--query-api-key', help='API key for the query')

args = parser.parse_args()

print(args.username)
print(args.query_id)
print(args.query-api-key)
```

``` ダメな結果
$ python ./test.py  --username tsukada --query-id 123 --query-api-key abcd123
tsukada
123
Traceback (most recent call last):
  File "./test.py", line 12, in <module>
    print(args.query-api-key)
AttributeError: 'Namespace' object has no attribute 'query'
$
```

ということでちゃんとパース後はハイフンからアンダースコアに置きかえないとコケる。
Hello World以来のPython、地道に頑張ろう。
【React Native】eslint導入

#1. eslintインストール
```
npm i eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-watch babel-core babel-eslint babel-preset-airbnb babel-preset-react-native -D
```

#2. package.jsonのscriptsに追加
```
"lint": "esw ./src/**",
"lint-watch": "esw -w --changed ./src/**",
"start-ios": "react-native run-ios && npm run lint-watch",
"start-android": "react-native run-android && npm run lint-watch"
```



### package.json
```
{
	"name": "app",
	"version": "0.0.1",
	"private": true,
	"scripts": {
		"start-ios": "react-native run-ios && npm run lint-watch",
		"start-android": "react-native run-android && npm run lint-watch",
		"lint": "esw app/**",
		"lint-watch": "esw -w --changed app/**",
		"start": "node node_modules/react-native/local-cli/cli.js start",
		"test": "jest"
	},
	"dependencies": {
		"react": "16.0.0-alpha.12",
		"react-native": "0.47.1"
	},
	"devDependencies": {
		"babel-jest": "20.0.3",
		"babel-preset-react-native": "3.0.0",
		"eslint": "^4.5.0",
		"eslint-config-airbnb": "^15.1.0",
		"eslint-plugin-import": "^2.7.0",
		"eslint-plugin-jsx-a11y": "^6.0.2",
		"eslint-plugin-react": "^7.2.1",
		"eslint-watch": "^3.1.2",
		"jest": "20.0.4",
		"react-test-renderer": "16.0.0-alpha.12"
	},
	"jest": {
		"preset": "react-native"
	}
}
view raw
```
# 3. ESLint 設定ファイル作成
ファイル名　：.eslintrc
ファイルパス：プロジェクトルート

```
{
  "parser": "babel-eslint",
  "extends": "airbnb",
  "plugins": ["react", "jsx-a11y", "import"],
  "rules": {
    "react/jsx-filename-extension": ["off"],
    "linebreak-style": ["off"],
    "no-undef": ["error"],
    "react/sort-comp": ["off"],
    "react/prefer-stateless-function": ["off"]
  },
  "globals": {
    "it": 0,
    "expect": 0,
    "describe": 0,
    "navigator": 0
  }
}
```

## ディレクトリ構成
![スクリーンショット 2017-12-21 22.13.37.png](https://qiita-image-store.s3.amazonaws.com/0/170662/8caa858f-f7ed-d353-34c8-d77c360c0a4b.png)

# 完成
こんな感じでコンソールに表示される
![スクリーンショット 2017-12-21 22.16.56.png](https://qiita-image-store.s3.amazonaws.com/0/170662/b6b3d357-069b-3d5d-a94b-2b7e2baca283.png)

# 参考
https://medium.com/@jamiehalvorson/react-native-eslint-setup-63d02076261
筋トレメニューから筋力がついたことで、自分のプログラミング学習メニューを振り返った

# 筋トレをはじめたきっかけ

仕事の繋がりで@K-BOYに出会いました。
SILVER GIMのアンジェラサグラの記事を見て一目で彼女に惚れました。
当時は妊娠中でしたが、助産院からかるい運動を進められていました。
出産後にアンジェラサグラを目指そうと思い、K-BOYに聞いて良さそうなバーベルやダンベルをamazonで購入しました。
しかし、それらはたまにしか稼働することがありませんでした。
自分はどの重量でどの回数やるのが良いのかよくわからなかったからです。
産後は自重トレーニングをたまにする程度でした。
近所に[筋トレ専門ジム](http://powerlifting.co.jp/)があると分かったので産後６ヶ月から通い始めました。現在３ヶ月目になります。
コーチが目標に合わせて回数や負荷を設定してくれるので、日々進化している感じがとても楽しいです。

# 痩せるためのメニュー

筋肉を増やすには、ぎりぎりきついくらいの負荷を少ない回数でやると効率が良いみたいです。
痩せたい場合は、ちょうどいい負荷を回数多く、１５回〜２０回を3セットなどで継続すると、筋肉肥大せず、耐久力が伸び痩せやすくなるそうです。
また、メニューは、下半身、背中、お腹の順でやると良いとコーチに教わりました。
バーベルスクワット、ランジ、ダンベルプレス、ラットプルダウン、シーテッドロー、サイドベント、クランチ、レッグレイズ、トルソーを週2通ってやっています。
バーベルスクワットは、女性モデルでも自分の体重くらいならすぐに持ち上げられるようになると教わりました。
ジムに通いはじめてまだそれほど経っているわけではありませんが、筋力がついて細くなったと言われたり嬉しい効果がでてきています。

# プログラミングを上達するメニュー

いま時代、Webプログラミングを学びたい人は多いと思います。
Webプログラミングでは単純なプログラミング言語の学習だけに限らず、HTMLマークアップや、CSSなどのデザイン、MySQLなどのDB周り、それらツールが自動化されているSaasやAWSなどのクラウドサービスまでやっていくと勉強にはきりがありません。
どの言語やツールをどれくらい勉強すればプログラミングが上達するのかは、よくわからないと思います。
私はもともとホームページでHTMLを書いたりしていて、仕事でJavaをやって、その後JavaScriptやPHP、インフラ構築や監視を経験し、PythonやReactJS、AWSでさまざまなサービスを利用するという経験をしてきました。
経験の中でなんとなく最初の頃よりはプログラミングが上達したなあと感じています。

# 決まったメニューと変わっていくメニュー
筋トレでコーチに作ってもらったメニューで私は痩せはじめています。筋トレはある意味確立された分野なのかなと思っています。コーチに作ってもらったメニューをこなしているとどんどん上達している感じがします。

一方でWebプログラミングはどんどん新しい技術が生まれたり、なかなか確立されていない感じがします。

Webプログラミングの学習メニューというのは、あまり決まっていないのが普通だと思います。プログラミングを教わろうとしても人によって勧める言語や言うことが違ったりしますよね。

筋トレとWebプログラミングを考えた時に、筋トレは確立された分野であり、Webプログラミングはあまり確立されていない分野だと思いました。

Webプログラミングの学び方は人それぞれですが、基礎を大事にしつつも、その時代に合った技術をどんどん使っていけばいいのかなと思います。その足跡が振り返れば自分の学習メニューになっていて、それはこれがベストかはわからないけれど前向きに考えていけばいいのかなと感じています。
複数のパッケージをまとめて composer update したい

# 前提条件

弊社ではCakePHPでWebアプリケーションを開発しているのですが、フレームワーク自体のバージョンアップを定期的に行なっています。

つい最近、バージョンアップを行なった時に、

```
composer update cakephp/cakephp
.
.
.
composer update cakephp/bake
.
.
.
composer update cakephp/hoge
.
.
.
composer update cakephp/hogehoge
.
.
.
```
**「あああああ、もうめんどくさい」**
「一発で行けないのか？」

と思い、調べたところ、やっぱりありました。

# やり方

> You can also use wildcards to update a bunch of packages at once:

```
php composer.phar update vendor/*
```
参考：https://getcomposer.org/doc/03-cli.md#update

 

 
 
つまり、


cakephp配下のライブラリをまとめてバージョン最新化したいときは・・・

```
php composer.phar update cakephp/*
```

そう、たったこれだけで、`cakephp`配下のライブラリ全てが対象となり、最新バージョンがあったら更新されることになります。

簡単だなー


# おまけ

ご興味ある方は昔書いたブログもご覧ください。

[CakePHP での composer install と composer update の運用方法](http://yourmystar-engineer.hatenablog.jp/entry/2017/07/07/220721)
【React Native】ビルドエラーとその解決策

![No bundle URL present..png](https://qiita-image-store.s3.amazonaws.com/0/170662/a3062975-a766-0a94-6ced-d0033d4b5d37.png)



## 1. エラー
```
No bundle URL present.

Make sure you're running a packager server or have included a .jsbundle file in your application bundle.

RCTFatal
__28-[RCTCxxBridge handleError:]_block_invoke
_dispatch_call_block_and_release
_dispatch_client_callout
_dispatch_main_queue_callback_4CF
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
__CFRunLoopRun
CFRunLoopRunSpecific
GSEventRunModal
UIApplicationMain
main
start

```

#### ！！解決策！！
1. キャッシュのクリア

```
./node_modules/react-native/scripts/packager.sh --reset-cache
```
＊ビルドを停止してから実行すること。

## 2. エラー
```
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 8.816 secs
Could not install the app on the device, read the error above for details.
Make sure you have an Android emulator running or a device connected and have
set up your Android development environment:
https://facebook.github.io/react-native/docs/android-setup.html
```
#### ！！解決策！！
1. Android Studioの下記の項目の設定画面のパスを確認
```
Appearance & Behavior > System Settings > Android
```

2. 環境変数を定義する。
```
export ANDROID_HOME=/Users/userName/Library/Android/sdk (userNameは任意)
```

## 3. エラー
```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:installDebug'.
> com.android.builder.testing.api.DeviceException: No connected devices!

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 20.689 secs
Could not install the app on the device, read the error above for details.
Make sure you have an Android emulator running or a device connected and have
set up your Android development environment:
https://facebook.github.io/react-native/docs/android-setup.html
```

#### ！！解決策！！
1. 仮装端末確認(初回のみ)
```
android list avd
// 実行結果
Virtual Devices:
    Name: Nexus_5X_API_27
  Device: Nexus 5X (Google)
    Path: /Users/******/.android/avd/Nexus_5X_API_27.avd
  Target: Google Play (Google Inc.)
          Based on: Android API 27 Tag/ABI: google_apis_playstore/x86
    Skin: nexus_5x
  Sdcard: 100M
```
2. 仮装端末起動(端末起動していない時)

*android toolsの中にあるemulatorを使用する。

android/sdk/tools/emulator
```
./emulator @Nexus_5X_API_27
```
リモートサーバに標準入力からスクリプトを流しつつ引数も指定する

Bash の `-s` オプションを使って標準入力からスクリプトを流し込みます。

```sh
cat <<'EOS' | ssh ore-no-server bash -s -- aaa bbb ccc
uname -n
echo "$@"
EOS
```

`-s` オプションが無いと `aaa` がファイル名だと思われてしまいます（引数が無いなら `-s` は無くても良い）。

これを応用して1つのスクリプトをローカル＆リモートで実行させてみたり。

```sh
#!/bin/bash
if [ $# -eq 0 ]; then
    # local
    ssh ore-no-server bash -s -- aaa bbb ccc < "$0"
    ssh ore-no-server bash -s -- AAA BBB CCC < "$0"
else
    # remote (ore-no-server)
    uname -n
    echo "$@"
fi
```
Wordの数式入力で行列、連立方程式、微係数

# はじめに
知っている人も多いと思いますが、Wordの数式入力ではTeXコマンドが使えます。
しかしTeXとは異なる入力の仕方もあるので、自分が躓いた所を書きたいと思います。

# 基本的な使い方
円記号+コマンドを書いた後に、スペースを押すと変換されます。
例)¥alpha + [SPACE]

![alpha.gif](https://qiita-image-store.s3.amazonaws.com/0/35426/f6a8206d-2d61-b0da-aa64-c125eb7bb2a5.gif)

Ctrl+Zで変換を戻せます。以後ではスペースを省略して書いています。

# 行列
¥matrixと打つと■が出現します。■()でブロックが一つできます。カッコ内に@を足すと行が増えます。&を足すと列が増えます。@と&の順番は関係なく、何個でも足せます。
![matrix.gif](https://qiita-image-store.s3.amazonaws.com/0/35426/fff60520-323b-814a-03bf-42f3cb1516cb.gif)

# 3x3の行列
![matrix33.gif](https://qiita-image-store.s3.amazonaws.com/0/35426/31827b6b-ac59-1a87-5163-b6380f0f63bf.gif)


# 連立方程式
¥closeが右括弧の代わりになります
![Dec-21-2017 21-45-51.gif](https://qiita-image-store.s3.amazonaws.com/0/35426/a4699f96-2d94-39ae-d757-7b8d0bb55731.gif)


# 微係数
¥openが左括弧の代わりになります
![Dec-21-2017 21-48-27.gif](https://qiita-image-store.s3.amazonaws.com/0/35426/62390d1e-9a25-8891-9dfb-b56bd2b03ab7.gif)
[Angular] Version クラスでバージョンを確認する

Version クラスを利用すると使用している Angular のバージョンを確認できる。
Version クラスについては [本家の API リファレンス](https://angular.io/api/core/Version) を参照。

## バージョン確認のためのコード

### クラス
```typescript:app.component.ts
import { Component, AfterContentInit, AfterContentChecked, ContentChild } from '@angular/core';

// Angular のバージョン情報を取得するための import
import { VERSION } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  /**
   * Angular のバージョン情報を確認するためのプロパティ
   *
   * @private
   * @memberof AppComponent
   */
  public versionInfo = VERSION;

  constructor() {}
}
```

### テンプレート

```html:app.component.html
<div class="informationArea">
  <table class="informationTable">
    <caption>
      使用している Angular のバージョンは...
    </caption>
    <tr>
      <th>full</th>
      <th>major</th>
      <th>minor</th>
      <th>patch</th>
    </tr>
    <tr>
      <td>{{versionInfo.full}}</td>
      <td>{{versionInfo.major}}</td>
      <td>{{versionInfo.minor}}</td>
      <td>{{versionInfo.patch}}</td>
    </tr>
  </table>
</div>
```

### 結果

![angular_version.png](https://qiita-image-store.s3.amazonaws.com/0/193342/453d1702-260f-1fc3-9bf4-fcb8fce399ea.png)

Angular のバージョンが **4.4.6** であることが確認できた。


## angular/cli で確認

angular/cli のバージョンも確認してみると...

```:バージョン確認
$ ng -v
    _                      _                 ____ _     ___
   / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
  / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
 / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
/_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
               |___/
@angular/cli: 1.3.0
node: 9.2.1
os: win32 x64
@angular/animations: 4.4.6
@angular/common: 4.4.6
@angular/compiler: 4.4.6
@angular/core: 4.4.6
@angular/forms: 4.4.6
@angular/http: 4.4.6
@angular/platform-browser: 4.4.6
@angular/platform-browser-dynamic: 4.4.6
@angular/router: 4.4.6
@angular/cli: 1.3.0
@angular/compiler-cli: 4.4.6
@angular/language-service: 4.4.6
```

Version クラスを使った確認結果と同じバージョンであることが確認できた。

## 使いどころ

アプリで使用している Angular のバージョンを画面のフッターに明示したい､といったケースにおいて､この方法だと動的にバージョンを取得できるので便利だと思う｡

## 参考
* [本家の API リファレンス - Version](https://angular.io/api/core/Version)
MS Access の データを mdbtools で見る

マイクロソフト　Access の データ　(*.mdb) を、Linux で取り扱う方法です。

mdbtools を使います。

Arch Linux へのインストール方法

```bash
yaourt -S mdbtools
```

Ubuntu 17.10 へのインストール方法

```bash
sudo apt install mdbtools
```

*.mdb ファイルのバージョンを表示

```bash
mdb-ver test_a.mdb
```

実行結果

```text
JET4
```

スキーマを表示

```bash
mdb-schema test_a.mdb
```

実行結果
ちゃんと、日本語も表示されました。
![mdb-schema_dec21.png](https://qiita-image-store.s3.amazonaws.com/0/179446/d1e1efb1-ec79-257c-cb0b-21fd3a53b9c7.png)

MySQL 用のスキーマを表示

```bash
mdb-schema test_a.mdb
```

実行結果
![mdb-schema_dec2201.png](https://qiita-image-store.s3.amazonaws.com/0/179446/11941e57-2406-2326-4eb7-74b4c878f36c.png)


テーブルの一覧

```bash
mdb-tables -1 test_aa.mdb
```

テーブルを、CSV で出力

```bash
mdb-export test_aa.mdb table_aa
```

テーブルを MySQL 用に出力

```bash
mdb-export -D "%Y-%m-%d %H:%M:%S" -H -I mysql test_aa.mdb table_aa
```

参考にしたページ
[Using mdbtools on *nix to convert Microsoft Access to MySQL](https://www.codeenigma.com/community/blog/using-mdbtools-nix-convert-microsoft-access-mysql)
[mdb-export.txt](https://github.com/brianb/mdbtools/blob/master/doc/mdb-export.txt)
[Crystal] 「ハッシュ」っぽい型

[「配列」っぽい型](https://qiita.com/arcage/items/366134c1cd6a1527f9a5)に続いて「っぽい型」シリーズ第二弾（おそらく打ち止め）です。

上の記事では**Array**っぽい型をいくつかご紹介しました。**Array**ほどではないにしろ，**Array**と並ぶコレクション界の雄「**Hash**」にも1つだけ「っぽい型」が存在します。

# NamedTuple(**T)

**NamedTuple**は，`NamedTuple.from`に**Hash**を与えて生成できるほか，`{key: value, ...}`というリテラル構文を持っています。後者の構文は，Rubyではシンボルをキーとした**Hash**のリテラル構文ですが，Crystalでは`{:key => value}`と`{key: value}`が異なる型（前者は**Hash**，後者は**NamedTuple**）のオブジェクトになるので注意が必要です。

```crystal
# 両方とも同じ結果
p named_tuple = NamedTuple(name: String, age: Int32).from({:name => "John", :age => 32})
p named_tuple = {name: "John", age: 32}
#=> {name: "John", age: 32}
```

**NamedTuple**は「キーに**Symbol**型しか使用できず，一旦生成されたら一切の変更がきかない不変な**Hash**」のように見えます。また，やはりジェネリック型の一種ですが，型引数をキーと一緒に値の数だけすべて指定する（100個値があれば，キーと型引数の指定が100組必要）という少し変わった特徴があります。

**Tuple**が各要素の型を内部的に保持していたように，**NamedTuple**もあるキーに対応する値の型を内部的に保持しています。そのため，`#[]`で取得した値に対して，その型に固有のメソッドをそのまま使用できます。

```crystal
name = named_tuple[:name]

p name.upcase
#=> "JOHN"
```

**Hash**の場合は，複数の型の値を含んでいると`#[]`で取得した値の型が**Array**の要素と同様のユニオン型になってしまいます。そのため，値の型に固有なメソッドを使用するためには，`if`文などによる型の特定が必要です。

```crystal
hash = {:name => "John", :age => 32}
name = hash[:name]

p name.upcase
#=> Error in line 4: undefined method 'upcase' for Int32 (compile-time type is (Int32 | String))

if name.is_a?(String)
  # ここでは name は必ずString型
  p name.upcase
  #=> "JOHN"
end
```

**NamedTuple**も**Tuple**と同様にメソッドの引数周りでよく目にします。Crystalではダブルスプラット（`**`）を使ってメソッドの引数を定義すると，可変長の名前付き引数を指定することができるようになります。この際，メソッド側で引数を受け取るのが**NamedTuple**オブジェクトです。

```crystal
def foo(**args)
  p typeof(args)
end

foo(a: 1, b: "2")
#=> NamedTuple(a: Int32, b: String)
```

また，**NamedTuple**を使ってメソッドに対して複数の引数を1度に指定することもできます。

```crystal
def bar(a: Int32, b: String)
  p a
  p b
end

args = {a: 1, b: "2"}

bar(**args)
#=> 1
#   "2"
```

# 【おまけ】ハッシュっぽい型のリテラルっぽい生成法

配列**っぽい**型ではリテラル**っぽい**オブジェクトの生成が可能であったように，**Hash**のように何らかのキーに対して値を設定できる型も,リテラル**っぽい**特殊な構文でオブジェクトを生成することができます。

この時必要になるのは，引数を取らないコンストラクタと`#[]=`メソッドです。

たとえば，内部に**Hash(String, Int32)**型のインスタンス変数をもち`#total`で値の合計を求められるラッパクラス**AdderHash**を考えてみましょう。

```crystal
class AdderHash
  @hash = {} of String => Int32

  def total
    @hash.values.reduce { |t, i| t + i }
  end

  # 未定義のメソッドは全て @hash に移譲
  forward_missing_to @hash
end
```

実装から想定される基本的な使い方はこんな感じです。

```crystal
add_hash = AdderHash.new

add_hash["a"] = 1
add_hash["b"] = 2
add_hash["c"] = 3

p add_hash.total
#=> 6
```

この型も引数を取らないコンストラクタと`#[]=`メソッドが使用できる[^1]ので，そのままで以下のようなリテラル**っぽい**構文を利用できます。

[^1]: **AdderHash**自体には`#[]=`が定義されていませんが，未定義のメソッドを`forward_missing_to`マクロで全てインスタンス変数`@hash`に移譲しているので，そちらの`#[]=`が使用されます

```crystal
add_hash = AdderHash{"a" => 1, "b" => 2, "c" => 3}
p add_hash.total
#=> 6
```
enumerateで要素ごとのインデックスを表示しよう

iteratableなオブジェクト(list, tupleなど)の要素ごとのインデックスを表示するには[enumerate]が便利です。

[enumerate]:https://docs.python.jp/3/library/functions.html#enumerate

# [enumerate]
どう便利かと言うと例えばこんな感じのデータ達に対して

```py3:対象データ
names = ["Suzuki", "Tanaka", "Kato", "Suzuki", "Kato"]
```
わざわざ数え上げするためだけの変数`counter`を用意せずとも

```py3:変数counterを使う方法
counter = 0
for name in names:
	print(counter, name)
	counter += 1
"""
0 Suzuki
1 Tanaka
2 Kato
3 Suzuki
4 Kato
"""
```
[enumerate]を使えばもっとスッキリ書けます。

```py3:enumerateを使う方法
for counter, name in enumerate(names):
	print(counter, name)
"""
0 Suzuki
1 Tanaka
2 Kato
3 Suzuki
4 Kato
"""
```
以上です、お疲れ様でした。

#　参考
 - ライブラリーリファレンス
  - [enumerate](https://docs.python.jp/3/library/functions.html#enumerate)
ZYBOでxillinux-2.0を動かすまで＃３（Ubuntu16.04使用）

[前回のつづき](https://qiita.com/machatan/items/eccaa0b3bc30099b3253)

**いきなり余談だが**
ボード交換や連携先や接続先のことなどを想定してMACアドレスを固定しておきたい場合はSPIフラッシュにあらかじめ書いておくといいらしい。
私的には全く用のない話（V2Vではやらなくもない）だが一応読むとu-bootプロンプトで環境変数を設定しておくらしい。

```u-boot起動
xillinux-uboot> set ethaddr 00:11:22:33:44:55
xillinux-uboot> saveenv
Saving Environment to SPI Flash...
Erasing SPI flash...Writing to SPI flash...done
```

ちなみにSPIフラッシュに設定してある環境変数は次のようにしてみることができる。

```
# env print
```

u-bootでsdbootと入力するとsdカードから起動する。

```
xillinux-uboot> sdboot
```

もろもろ表示のあと1分ほどで下記の表示となる。

```
Ubuntu 16.04 LTS localhost.localdomain ttyPS0
localhost login: root (automatic login)
Last login: ～～～～～～～～ on tty1
Welcome to the Xillinux distribution for Zynq-7000 EPP.
You may communicate data with standard FPGA FIFOs in the logic fabric by
writing to or reading from the /dev/xillybus_* device files. Additional
pipe files of that sort can be set up by configuring and downloading a
custom IP core from Xillybus’ web site (at the IP Core Factory).
For more information: http://www.xillybus.com.
root@localhost:˜#
```

自動でrootログインする仕様。
ここまで来ればPL部の回路にも/dev/xillybus_*でアクセスできるようになっているのでcatやtaill -fなどで回路の状態を確認できる。

**SDカードのファイルシステム領域を拡張する**
ラズパイでは自動、またはraspi-configのメニューから設定するがxillinuxでは手動なだけでやることは同じ。

```
root@localhost:˜# fdisk /dev/mmcblk0
Command (m for help): d
Partition number (1-4): 2
Command (m for help): n

Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended

Select (default p):
Using default response p

Partition number (1-4, default 2):
Using default value 2
First sector (32130-15523839, default 32130):
Using default value 32130
Last sector, +sectors or +size{K,M,G} (32130-15523839, default 15523839):
Using default value 15523839
Command (m for help): w

The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16:
Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

root@localhost:˜# shutdown -r now ＃＃念のためリブート

リブート後

root@localhost:˜# resize2fs /dev/mmcblk0p2
```

あとは普通のUbuntuと同じように使いやすい環境を作っていく。
sshdはすでに2.0ではインストール済みのため、一般ユーザを作って/etc/sudoersに追加しておけばOK

ちなみに再起動はGUIなら右上のボタンからでもよいしSHUTDOWNコマンドでも、または下記のように

```
# halt
```
としてもよい。

**やっとスタートラインに立つ**
これでXillybusを使える状態になったのでLinuxから各種IPを使ってみたり、ドライバをインストールしてみたりと楽しくなってくる予定。
その時に読むのが
[「Linuxホストを使用してXillybusを使用するには(PDF：英文)」](http://xillybus.com/downloads/doc/xillybus_getting_started_linux.pdf)
だということです。

。。。。。そのうち読む。


Yoctoも整理したいのでこれもそのうちに。
jethroブランチでbitbakeしてみたらxorg.confがないといわれたがディレクトリ作っておいてやれば普通にcore-image-satoで焼けた。

早く自分で作ったIPcoreとかを動かしてみたいがソフト屋には色々と先が長いな。

とりあえずここ見たり
[「Zybo」をUbuntuからプログラムする](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0475?page=1)

[新約聖書](http://www.shuwasystem.co.jp/products/7980html/4753.html)読んだり

[買ってきたけど読んでないＣ級本](http://shop.cqpub.co.jp/hanbai/books/48/48091.htm)

でも読んでみようかな。
ZYBOでxillinux-2.0を動かすまで＃２（Ubuntu16.04使用）

**起動用SDカードを作成**

さて、[前回までで](https://qiita.com/machatan/items/18ec40e819bd254a15ee)bitstreamが出来上がったのでここから起動用のSDカードを作成する。
ダウンロードしておいたSDカードのイメージを用意しておく。
http://cloud.xillybus.com/xillinux-2.0-beta.img.gz

ダウンロードしておいたイメージファイルを解凍して

```
# gunzip xillinux-2.0-beta.img.gz
```

ddコマンドで書き込むが、SDカードのデバイス名を事前に確認しておく。
このマシンだと/dev/mmcblk0になっているが/var/log/messagesログを見るなりsyslogを見るなりfdisk -lなり
色んな方法で確認できるので好みの方法で確認。
参考：（https://wiki.ubuntulinux.jp/UbuntuTips/Hardware/HowToKnowDeviceFileName）

デバイス名がわかったら早速ddコマンドでイメージからカードを作成する。

```
# dd if=xillinux-2.0-beta.img of=/dev/mmcblk0 bs=512
```

ちゃんと書き込めたか確認しないといやだという神経質な貴兄はcmpコマンドで確認する。

```
# cmp xillinux-2.0-beta.img /dev/mmcblk0
cmp: EOF on xillinux-2.0-beta.img`
```

SDカードに書き込んだらPCに挿し直すとbootとRootの2つのパーティションがマウントされる。

マウントしたらそのままbootパーティションのほうにbootPartitionKitのbootfiles配下の2ファイルをコピーする。

```
・boot.bin
・devicetree.dtb
```

また、前回の投稿で作成したbitstream「xillydemo.bit」もbootパーティションにコピーする。

これでbootパーティションには計4つのファイルがある状態になる。

```
・uImage　　　（Kernelバイナリ）
・boot.bin　　（初期ブートローダ）
・devicetree.dtb（デバイスツリーBobファイル）
・xillydemo.bit（PL部プログラムファイル）
```

**いよいよ起動**

これで起動用SDカードの準備は完了。
UbuntuからアンマウントしてZYBOにSDカードをセットする。
ACアダプタがあればそこから給電してもよいし、USB給電ならラズパイ３用の2.5A電源がそのまま使える。
今回はラズパイ用の電源が余っていたのでこれを使うことにする。
ZYBOのJ15ピンがUSB側に接続されており、JP5（ブートモード）がSD側に接続されていることを確認する。

USBは1ポートしかないのでHUB経由でマウス・キーボードを接続し、モニタはHDMI,VGAどちらでもよいので挿しておく。
準備ができたら電源をオンするとメッセージが出てきてターミナルログインの画面となる。

rootでログインしたらstartxしてみるとxillinuxのGUIデスクトップが表示されれば完了。

ここまでできたら、次はネットワークの設定と端末からボードのメモリにアクセスしてみる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/207819/da035f64-e57c-46c4-9eea-111f54a23a06.jpeg" width="50%">
[次回につづく](https://qiita.com/machatan/items/4b97e1429c659fee8669)
【FileMaker】次のバージョンで実装してほしい個人的熱望機能

次のバージョンで実装してほしい個人的熱望機能。
それは、スクリプトなどで使う関数の属性をプルダウンなどで出して欲しい、というところです。

例えば、GetContainerAttributeの属性名なんて、たくさんあるし、綴り間違えたくないですよね。
<img width="799" alt="1222_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/a00aabd7-b2f7-ecfc-b449-fee99e2fd86d.png">

そんな時、例えばExcel Macroのエディタのように、
<img width="326" alt="1222_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/383b5afb-ae1c-363e-4b1a-a34cc337b4e8.png">
ピローンと出て欲しいわけですよ、属性が。

せっかく、スクリプト右で関数をクリックした時に説明が下にぴろっと出てくれるのですから、計算式でもぴろっと出て欲しい。

何かのお高いツールを使えば出てくるんでしょうか。。。
でも、FileMaker単体で実装されて欲しい。
せめて、Advancedバージョンでもいいから〜！
たのみまーす、FileMakerさん！
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十四章 モデルの整合性を維持する6 顧客/供給者の開発チーム

# これまでの十四章
- [第四部 戦略的設計 第一四章 モデルの整合性を維持する](https://qiita.com/YasuhiroKimesawa/items/6e8e5503a05ce9515a79)
- [境界づけられたコンテキスト](https://qiita.com/YasuhiroKimesawa/items/901ac764340275b93d61)
- [継続的な統合](https://qiita.com/YasuhiroKimesawa/items/6a58743c90c5b707c29d)
- [コンテキストマップ](https://qiita.com/YasuhiroKimesawa/items/626384c84145870ec5af)

##  
- [共有カーネル](https://qiita.com/YasuhiroKimesawa/items/7895d8c28137bd34008a) 

# 顧客/供給者の開発チーム

例えば、供給者(上流チーム)が作成するAPIを顧客側(下流チーム)が使用するようなパターン。

顧客側は同じ社内の別チームだったり、別々の企業で進められるプロジェクトであることもある。
よくあるのは、複数の全く別のコミュニティに対して適用されるパターン。
モデルもツールセットも異なるので、共有カーネルのようにコードを共有することができません。

このパターンを採用すると、顧客側は「顧客」という役割なので、供給者に要望（クレーム？）を出すことができるし、供給者はその要求を最優先で対応する必要があります。

# 顧客/供給者の開発チームのあるある

そうなると、政治的な力関係がある場合、こんな問題が起きます。

- 顧客側が変更に対する拒否権を持っている。
- 変更を要求するのに手続きが面倒。
- 下流のシステムを壊してしまうと不安になり、上流側が抑制されてしまう。
- **影響力のある顧客は上流のプロジェクトを成功させる上で重要な要求を出すこともあるが、同様に、その要求によって上流の開発が阻害されるかもしれない**
- **上流が富者で下流が貧者の場合、下流チームが要求を実現してもらうために、上流チームに懇願しなければならない**

最後の２つは力関係によってそうなるなということが凄くよくわかります。

# 解決策

**イテレーションプランニングに下流のチームの代表を参加させて直接議論すること**が解決策になります。そうすることで、下流側が必要とする作業を上流がしてくれるか、延期するかその場で決定でき、下流側がそれに影響されて遅延することはなくなります。
手続きも不要。顧客側が強く言ってくることもないし、上流が不安に思うこともなくなります。

ただし、顧客が一つのチームだけとは限りません。その際に必要なのは、顧客の要求に対してバランスを取っていきながら、下流の要求を優先して対応していきます。
これによって、富者・貧者の関係や影響力のある顧客の関係を解消していきます。(それが難しいといえば、難しい)

もうひとつは、**受け入れテストを共同で開発する**ことです。
開発したテストは上流側のテストスイートに追加し、継続的な統合の一部として実行されるようにします。

# Evansの経験

最後にEvansの経験談が載っていますね。

上流のメンバーが自分たちの役割は顧客に仕えることであると考え、こうした関係が非公式に組織され、２人のプロジェクトマネージャーが個人的仲が良い。こうしたケースは常にうまくいっていたとのことです。なるほど！

**逆に上流チームを動機づけるものが何もない場合は非常に難しい・・・**と。。。
NARUHODO・・・
MapDの本気を見た

前回Uberの[deck.gl](https://qiita.com/Masutani/items/c591f8fac24e2e4d3b69)を使って、そのサクサク度合いにオールドGISユーザは度肝を抜かれていたのですが、まだまだ開発者向けのnode.js 断片のようで、気軽にデプロイして、デイリーに分析環境として使うにはハードルが高すぎます（JSの知識はHTML4の時点で止まっているオジサン）

オープンソースのGPGPUベースデータ分析プラットフォームのMapDというものがあり、deck.glと同様、大量のIoTデータに対して、インメモリのデータハンドリングとビジュアライゼーションを提供する今どき環境です。

本当に仕事に必要なのか、大きな疑問はあったものの、deck.glのやっぱりコレジャナイ感満点で欲求不満になっていた、似非Dサイエンティストの刹那的かつ即物的な欲望を満たすためにMapDをトライしてみました。

# MapDとは

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/639bd7d5-87b2-0339-b08a-b96de2f72003.png)


[MapD](https://www.mapd.com/)は、MITのTodd Mostakが2012年にデータベース教育の一環として始めたGPUベースのDB,可視化環境です。
2013年にMapD Technologies, Inc.をマサチューセッツ州で創業。2014年にNVIDIAなどから本格出資を得て、各種分野への採用を経て、今年になってオープンソース版を提供し始めています。

[デモページ](https://www.mapd.com/demos/)を見るのが一番早いと思いますが、１Gポイントを超えるデータをWebベースの地図にオーバーレイでき、しかもBIツールなどと同様に各ポイントがセレクタブルかつ属性によってシェイプを変更できるという、にわかには信じられないパフォーマンスを誇ります。

昔OpenGLでGPSトラックを1億点ほど表示して、今どきPCのレンダリング能力の高さを知ってはいましたが、これがクリッカブル、エディタブルなものとして使えるようになるとは驚きです。

# パフォーマンス

NYCのタクシーデータを表示してみました。表示するまでは少し待ちますが、ひとたびレンダリングされた後は、まったくストレスなく動きます。（それなりのGPU環境ですが）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/e65360d4-bb3d-5349-3d30-fc715aa8f853.png)

百万点を超えると、ArcGISやTableauなどでも、ほとんどマップは動かなくなりますが、MapDだと、まったくディレイを感じさせない動きをします。
直感でしかないですが、GPU上のメモリにフィットした場合（このデータは１．５GBでぎりぎり乗っていると思われる）は最高のパフォーマンスを発揮していると思われます。（ビデオメモリは４GB)

# 分析例

ダッシュボードは以下のように、地図とグラフを併用でき、お互いが相互スライス可能になります。ここでは、ピックアップポイントとドロップポイントの地図、時系列、トリップの距離と時間の関係などを表示しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/8eeb8c77-ab06-7f86-c355-efb35f41de3f.png)

ピックアップポイントと時間帯を限定するスライシングをしてみました。以下はマンハッタン中央から昼間出発したタクシーの行き先です。ビジネスマンや観光客などマンハッタン内での移動で閉じていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/f4181ff4-c837-0aee-187b-57c9a80e73c9.png)

同じセントラルパーク主変から、真夜中に出発したタクシーを選択すると、行き先が郊外の住宅地に向かうエリアに大きく広がることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/5854befd-9152-c5af-76a4-92a149d4c506.png)

こんなビッグデータについて、通常なら、メッシュ状に切ったODに対して、OD流量を定義したマトリックスを作成して、とかになり、集計が非常に煩雑になり、かつ時系列なども考慮するなら、大きなデータ圧縮効果も見込めないので、そもそもGISを使ってもインタラクティブ解析は無理であることが、予想できます。

インタラクティブかつBigDataというものが、クエリーエンジンとこのBI型フロントエンドで手軽に使える、既存のBIツールの基本機能と、SQLによる柔軟な処理体系、正直、これさえあればほかの環境はいらないと言っても過言ではないですね。

課題は安定性と、集計データの二次利用でしょうか。おそらく今後拡充されてくると思います。
react-native初学者が学習を始める前に知っておくべき6のtips

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

##1 Expoとreact-native-cliの正しい選択。

まず2つの違いは簡易版か、本格版かということ。
Expoは環境構築にかかる時間がほぼゼロで、エミュレーターをPCにインストールすることなくスマホにExpoというアプリをインストールするだけで開発を開始できる。しかもreact-nativeの機能を全て使える。パフォーマンスも悪くない。
初学者が触るならこれだ。
しかし、jsのみで開発をしなければならないという制約があり、使用できるプラグインに大きな制限がかかる。が、通常のアプリではExpoで十分！特にスタートアップは、Expo一択。
react-native-cliを使うのは出来れば止めよう。非常にライブラリが壊れやすい。
しかし、ios、androidのライブラリが使えるので手触り感を重視する場合はcliを使ってもいい。

結論　Expoで開発しよう。Expoで必要十分。cliで開発するとネイティブの機能を制限なしに使えるが、cliはxcodeを頻繁に触る必要がある。
expoは証明書を用意する必要なく、プッシュ通知も、コードプッシュもデフォルトでついてくるので、まず、expoから業務で使い始めることを強くお薦めする。

##2 IDE

割りと色々ある。が、atomにnucluidプラグインを入れる以外の選択肢はない。
facebook公式IDEであり、機能が増えていくし、メンテナンスもされ、最新のreact-nativeにももちろんfacebookが対応してくれる。
と思って使い初めたが、結論から言うとめっちゃゴミだった。使いにくい、重い、バグが多い。の三重苦。

結局軽くて、typescript, flowと相性抜群なvscodeに落ち着いた。デバッグはreact-native-debuggerではなく、chromeのdevtoolを使用する。chromeの標準機能で、ブレークポイントを設定出来、debuggerとコード内に記述することで　コードがストップする。

react nativeはエラー表示が難解なので、pritterというコード自動整形プラグインも必須。

2018年でjsを書く人の1/2はvscodeを使っているそうです。事実軽いし、機能も豊富です。

結論 vscodeかjetBrain社のide.オススメはvscode.

##3 navigation 画面の切り替えについて

今は公式がオススメしている react navigationで一択だろう。若干扱いづらさを感じることもあるが、情報量が桁違いに多く、何と言ってもメンテナンスが止まることがない。Expoが公式で採用しているのもポイント
何よりも素晴らしいのがjsだけで構築されたライブラリだということ。他のライブラリと違い、objective-cやjavaで書かれた箇所がない。

react-native-router-fluxというゴミを使うのはやめよう。(単純に情報量が少ない)

RNAF = お手軽、記述量多い（複雑なことは出来ない）
react navigation = 大規模向け(公式推し)

結論 まあreact navigationを使っておけば間違いがない。

##4 デザイン

デザインはnativeBaseを使うのがお手軽。bootstrapとほぼ思想が一緒で、webからの人は、一番ラクに開発できる。むしろreact-nativeよりnativeBaseの機能を使ったほうが開発が早い。オープンソースなのもポイントが高い。
リストを使うと、デザインが崩れてしまう時があるので、その時はreact-nativeのScrollViewを使うといい。
ただリストが微妙なので、リストは使わない。ラジオボタンも微妙なので使わない。

似た様なものとしては、準公式が開発する、react-native-elementがある。デザインのライブラリではreact-nativeのプラグインの中で頭一つ抜けて良い。拡張しやすく、elementの名の通り、ワンポイントだけ使いたいという時に優れている。

UIライブラリはまだまだ品質が低いので、react nativeに慣れた人ほど、UIライブラリは使わなくなる傾向がある。

##5　Redux必要ない
react naitveは小規模アプリやプロトタイプ制作に使われることが多く、reduxは大規模向けなので適していない。
unstatedという、とても実践的で、シンプルなライブラリがあるので、これを強くオススメする。
超軽量state管理ライブラリで、テストもしやすい。
また、context Apiというreact 公式のstate管理のやり方もあり、こちらはさらにシンプルで学習コストが低い。
小規模なアプリを爆速で開発する。これがreact nativeの強みだ。
そのため、スケールはしやすいが、プロトタイプの完成が遅くなるreduxは適していない。

ただ、reduxとreact nativeの相性は抜群なので、redux経験者はreduxを使った方が開発は早い。
おそらく個人開発ではreduxは必要ないのでお気軽にreact native入門しちゃいましょうー

##6 react-nativeへの幻想

開発速度は早い。

が、androidとios両方書けるから開発速度が二倍だーやったーと思うのは早計だ。
片方のみのOSで発生するバグ、プラグインの不安定さ、情報量の少なさ、頻繁なreact-nativeバージョンアップの手間がある。結局、周辺機能が揃ってない。(flutterとか、ionicとかと比べると最高に揃ってるけど)

二週間に一度のバージョンアップなど、キャッチアップは大変だ。
更に学習コストがとてもとても高い。多分今一番学習に時間が掛かるフレームワークだ。
react + redux + ios + android + react-native
どの知識も必要になるし、プロジェクトによってはフロントエンドの技術（関数型プログラミングとかtypescriptとか）が必要になる。

ただ、react出身者はすぐに馴染める。（テストツール、デバックツール、ES6とreactは共通のため。）
つまり、react習熟者ならvue.jsを学ぶよりReactNativeを学習する方が、学習コストは低い。
axios, redux-saga, three.jsなど、reactで使えるものの全てがreact nativeで使える。
最初からjs in cssだし、babelやwebpackから解放される。特にbabelをいほぼじらなくて良いのは大きい。
エディターも今まで使っていたのでいいし、デバッガもchromeを使っている人はそのまま持ち越せる。デザインパターンも設計の仕方もreactそのものだ。テストはjestやchaiで書ける。cliコマンドですら、reactそのままだ。

*react経験者ならReactNtiveはほぼ学習コストなしに習得出来る*


声を大にして言いたい。
react-nativeは最高だ。
誰よりも愛してる。
react-native今年のクリスマスは君と過ごす。

えっっ？？？
Java Silver SE8の勉強方法 

Stylez Advent Calendar 2017の22日目です。
当初はAngularのアプリでも1つ作ってみようと思っていたのですが、全然時間が取れず、公式チュートリアル全部やったくらいで今止まってます。。。

# はじめに
弊社は新人教育として、社内勉強会を行っているのですが、そろそろJava Silverの取得に向けての勉強が始まろうとしています。
そこで、新人たちの何かしらの役に立てばと思い、去年自分が受けたときの勉強方法とかをひとまず書き残しておきます。

# 勉強方法
巷で有名な黒本を買って、ひたすら問題を解いては解説を読むスタイルで進めました。
大体は仕事終わって帰ってきて、元気があるときに1〜2時間くらい勉強する感じでした。

10章、11章の模試はやってません。。。

- 1周目
とりあえず1〜9章まで全部やる。
わからなさすぎて2週間以上かかりました。

- 2周目
また1〜9章まで全部やる。
明らかにわかる問題にはチェックをつけておく。
分からない問題と、正解したけど正解の理由がちゃんと言えないものにはチェックをつけない。
このとき7割ほどわからない問題でやばさを感じる。しかも、終わったのが受験日当日朝10時くらい。

- 3周目
2周目でチェックをつけられなかった問題を解く。
意外に覚えてて、チェックついてないうちの3割くらいは完全に正解の理由がわかる状態に。
受験日当日朝11時半。ちょーあせる。

- 4、5周目
いまだにチェックのついていないものを2周。
このとき、1周するのに1時間かからないくらいになる。
家を出るまでうおおおおって2周しました。

# 試験結果
正解率　：77%（全77問 65%以上で合格）
勉強期間：1ヶ月
勉強時間：25時間くらい
受験日　：2016年7月頃の夜18時くらい

# 当時の実力
業界1年目、プログラム歴半年
Javaは新人研修で3ヶ月やった程度で業務ではやったことなし。
良書の「スッキリわかるJava入門」は一通り終えていて、簡単なWebアプリならなんとか作れる感じ。
IT系の資格はITパスポートのみ。
とりあえず、ちょーひよっこ。

# まとめ
新人でも業務でJavaをやったことなくても、初心者用のJavaの本を一通りやって、黒本を勉強しておけばJava Silverはわりとなんとかなります。
Java Goldはちょっと業務でもやってないと厳しそうなので受けれてないです。
ていうか、Java9の試験もそろそろくるんですかね。。。Javaはちょっともう辛いんですけど…。
IBMiCmdをShiftJis対応してみた

#IBMiCmdをShiftJis対応してみた
notepad++でIBMiCmdという[plugin](https://github.com/WorksOfBarry/IBMiCmd)が存在します。
notepad++でRPGやCLを編集しコンパイルまで出来るのですが残念ながら文字化けしてしまいます。
FTPでソースのやり取りをしているようなので、ShiftJis対応してみました。

###インストール
notepad++をダウンロードしてインストールします。私は「NotePad++ EUC-JP対応版」を使用しています。
[ここ](https://github.com/ymurata1967/IBMiCmd/releases/)からIBMiCmd.dllをダウンロードしてpluginフォルダにコピーして下さい。

###設定
起動すると、
![ibmicmd01.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/6b929bf5-1cbb-d287-591a-1cffa5a11143.png)

と表示されるので、環境に応じた値を入力します。
![ibmicmd02.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/1bf44bbd-712d-1064-9393-c8e0429e9aeb.png)
Host Nameは正しく名前解決が出来るようにしておいて下さい。
＃IPアドレスでも構いません。

###ソースの取得
「プラグイン」→「IBMiCmd」→「Member Lising」
![ibmicmd03.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/794aec6c-dffc-5960-03d0-40f5939ef972.png)
ライブラリ・ソースファイルを入力します。
ここで、画像のようになってしまったら「IBMiCmd」→「Livrary List」をチェックして下さい。
SYSTOOLSというライブラリがライブラリリストとカレントライブラリに設定されていますね。このライブラリが接続しているAS400に存在しないと画像のエラーが出る様です。

この画面からライブラリリストの除く事が出来ないようなので、直接設定ファイルを編集します。

インストールしたフォルダ以下に
\plugins\Config\IBMiCmd\systems\AS400.cfg
を編集します。（もちろんファイル名は環境によります。）

notepad++を再起動すると、反映されています。
![ibmicmd04.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/b3d111b0-fdfe-5ebc-8d2d-42873bdeb461.png)

ソースの一覧が取得できました。
![ibmicmd05.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/1a78b6b3-ace3-96e1-6f03-15a861c52fba.png)
※ただし、SYSTOOLSはIBMiCmdで使用しているかもしれません。存在しているならそのままが無難かと思います。

###ソースの編集
![ibmicmd06.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/e7365708-3316-95b7-3782-90829bb577e1.png)
編集したいソースを右クリックで「edit」を選択します。
![ibmicmd07.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/101a97d6-a840-1360-326d-feb917e13c47.png)
日本語も文字化けせず取得できました。

ソースを編集し、保管すると即AS400に反映されます。
なお、ソースメンバーのレコード変更日付は全て０リセットされます。

###コンパイル
あらかじめ、「IBMiCmd」→「Erroro Listing」で画面を開いておいて下さい。
![ibmicmd08.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/b6dd4085-45e0-992a-38e5-0b0811fac25e.png)

「IBMiCmd」→「Command Bindings」
コンパイル対象はRPGなので、MBR_CRTBNDRPGをダブルクリックします。
![ibmicmd09.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/8cfd2357-6e95-8c03-f3c9-7e434ea964d7.png)

コンパイルが終わると、先ほどの「Erroro Listing」の画面に自動遷移します。
エラーの例
![ibmicmd10.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/df6cf234-befe-aa51-05cd-10b838544757.png)
エラーが無い例
![ibmicmd11.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/dc530a20-c9d0-0bd6-63b5-a320d0112380.png)

エラーの場合、エラー箇所をダブルクリックするとソースのエラー箇所に自動で移動します。

まだあまり使いこんでいませんが、よさそうですね。
新規Androidアプリをリリースしようとしたら審査が通らなかった話

## 概要
現在仕事で携わっているサービスはユーザがコンテンツを作るいわゆるCGM系なのですが、そのAndroidアプリをリリースする際になかなか審査が通らなかったという話です。

結論から言うと **「18+のレーティングは一部の国の特定カテゴリのみ」** でしか設定できません。

## アプリ公開に向けて申請しました
現在作成しているアプリのアプリ内課金を検証するために一旦アルファ版として Google Play に公開する必要がありました。Google Play Console から必要最低限の情報を設定して、いざアルファ版リリース（ポチっ）！とドキドキしながら待っていたら1時間後ぐらいに Google からメールが届きました。

> **ポリシーの問題：** お客様のアプリはコンテンツのレーティングのガイドラインに違反しているため、不承認となりました。

ええっ…

## レーティングを上げてみました
冒頭で述べたように現在携わっているサービスはユーザが投稿したコンテンツを提供するサービスなので、エロやグロなどの表現はわりと扱われやすいです。なので「コンテンツのレーティング」という項目の質問で、エロやグロを意識してレーティングが高めになるように設定しました。

その結果18+のレーティングとなったので「これなら審査通るでしょ」と安心して再申請しました。そして1時間後に Google からメールが来たので見てみると

> **ポリシーの問題：** お客様のアプリはコンテンツのレーティングのガイドラインに違反しているため、不承認となりました。

ぽかーん

## 申し立てをしてみました
それから2回ほどレーティングを調整して再申請してみたのですがことごとく **ポリシーの問題** が原因で審査が通りませんでした。「もう少し具体的に言ってくれよ！」という思いをぐっとこらえて同様のケースがないか調べたのですがどれも試行済みで詰み状態になりました。

最終的 Google に問い合わせをして明らかになったのですが以下の理由で審査が通らなかったようです。

> アプリのコンテンツのレーティングが ’18 歳以上の成人のみ（Adults Only）’と設定されています。現在、英国、アイルランド、フランスの特定のギャンブル アプリに限って「Adults Only」レーティングを許可しています。

なる…ほど…？

## 最後に
その後レーティングを調整して17+にしたところ、數十分でステータスが公開に変わり、無事アプリをリリースすることができました。めでたしめでたし。
CMakeのツールチェインで変数を扱う際の注意点

たとえば、CMakeに対応したプロジェクトを持って来た際に、もとのCMakeLists.txtを弄らずに外部から変数（CMAKE_CXX_FLAGSなど）を与えたいとします。

```
cmake . -G "Generator" -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
```
みたいな。

そんな時に活躍するのがこのcmake-toolchainsの機能ですが、この時set()を用いて変数を設定する際に気をつける必要があります。

```
set(CMAKE_CXX_FLAGS_DEBUG “${CMAKE_CXX_FLAGS_DEBUG} /MTd”)
```

このままでは実際に反映されません。CACHE指定をつけましょう

```
set(CMAKE_CXX_FLAGS_DEBUG “${CMAKE_CXX_FLAGS_DEBUG} /MTd” CACHE STRING “description")
```

変数の設定がキャッシュされるのでちゃんと有効化されます。
最高ですね
Hash#to_proc と Method#to_proc


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの22日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は`Hash#to_proc`と`Method#to_proc`を紹介します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第10章まで読み終わっていること。

## Hash#to_proc と Method#to_proc

10.5.2項ではシンボルが`to_proc`メソッドを持つことを説明しました。`to_proc`メソッドを持つオブジェクトは他にも存在します。ここではハッシュの`to_proc`メソッドとMethodクラスの`to_proc`メソッドを紹介します。

### ハッシュの場合

Ruby 2.3からはハッシュも`to_proc`メソッドを持つようになりました。ハッシュをProcオブジェクトに変換すると、実行時に第1引数に渡された値が元のハッシュのキーに一致した場合にハッシュの値を返します。一致するものがなければ`nil`が返ります。

```ruby
hash = { japan: 'yen', us: 'dollar', india: 'rupee' }

# to_procを使わない場合
without_to_proc = proc { |key| hash[key] }
without_to_proc.call(:japan)
#=> "yen"
without_to_proc.call(:italy)
#=> nil

# to_procを使う場合
with_to_proc = hash.to_proc
with_to_proc.call(:japan)
#=> "yen"
with_to_proc.call(:italy)
#=> nil
```

これにより、キーの配列からハッシュの値をマッピングしたりする際に簡潔に書けるようになります。

```ruby
hash = { japan: 'yen', us: 'dollar', india: 'rupee' }

[:japan, :india, :italy].map { |country| hash[country] }
#=> ["yen", "rupee", nil]

[:japan, :india, :italy].map(&hash)
#=> ["yen", "rupee", nil]
```

ちなみに、上のコードは`values_at`メソッドを使っても同じ結果が得られます。（ただし、メソッドのレシーバがキーの配列ではなく、ハッシュになります。）

```ruby
hash.values_at(:japan, :india, :italy)
#=> ["yen", "rupee", nil]
```

### Methodオブジェクトの場合

Rubyではメソッドの定義についてもMethodオブジェクトという形でオブジェクト化することができます。たとえば以下は`shuffle`というメソッドを定義し、それをMethodオブジェクトとして取得するコード例です。

```ruby
def shuffle(str)
  str.chars.shuffle.join
end

method_shuffle = self.method(:shuffle)
#=> #<Method: Object#shuffle>
```

Methodオブジェクトも`to_proc`メソッドでProcオブジェクトに変換することができます。実行時の引数はそのまま元のメソッドの引数になり、元のメソッドが実行されます。

```ruby
proc_shuffle = method_shuffle.to_proc
proc_shuffle.call('Ruby')
#=> "bRyu"
```

これを利用すると、`&`とMethodオブジェクトを組み合わせてブロックを利用するメソッドの引数にすることも可能です。

```ruby
def shuffle(str)
  str.chars.shuffle.join
end

# ブロックの中で普通にメソッドを呼び出す場合
['Ruby', 'Java', 'Perl'].map { |name| shuffle(name) }
#=> ["uybR", "Jvaa", "elrP"]

# &とMethodオブジェクトを使う場合
['Ruby', 'Java', 'Perl'].map(&method(:shuffle))
#=> ["ybRu", "aJva", "Prle"]
```

コードとしては少しトリッキーなので、日常的に使うことはあまりおすすめできませんが、Procオブジェクトの面白い利用例の1つと言えそうです。

## 次回予告

次回はProcのカリー化について説明します。
テスト駆動開発でお試しする Pharo Smalltalk・目次

新訳版『テスト駆動開発』の第Ⅰ部の多国通貨をネタに Smalltalk を学ぶシリーズです。

テスト駆動開発を生んだ Smalltalk 環境でのプログラミングに興味を持ったり、実際に体験していただくきっかけになれば幸いです。

目次
- [第1回 はじめてのレッド、イエロー、グリーン](https://qiita.com/sumim/items/fa41066c57d211814ff9)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture01/TDD-Money.package)
- [第2回 等価性チェックと乗算の実装](https://qiita.com/sumim/items/8dad7cd261a37aa075db)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture02/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/9b8fabf82b38c1d57ddfb1a6fad626641030a085)
- [第3回 Dollar の単純な複製を Franc に仕立てる](https://qiita.com/sumim/items/264d7cb7446850e13372)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture03/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/dcc1b90c29ef48ed2b6f2e53eedd19c0e06207a2)
- [第4回 スーパークラス Money を作る](https://qiita.com/sumim/items/74795eaad23fafbdb2fd)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture04/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/7693ba314817182772f8ab676b507d2b1b1c01a1)
- [第5回 Money の具象クラス化と Dollar、Franc の廃止](https://qiita.com/sumim/items/b8ddc1d432ca5e0aaab5)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture05/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/1a2ac9b967f230d3baa8ad73594d56716e98562a)
- [第6回 Moneyの乗除算で通貨換算](https://qiita.com/sumim/items/07f543956904c3cfcf2d)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture06/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/10794f9e942c516b4441a926dd12e659679b8e49)
- [第7回 MoneyBagに異種通貨同士の加算を保持](https://qiita.com/sumim/items/16b84a2f875a5aa10555)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture07/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/5589df41136d51cc733ed11cd51e7f7f47e12b83)
- [第8回 MoneyBagを少しだけBagらしくする](https://qiita.com/sumim/items/fb55c8a3ed8b8704cfa7)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture08/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/d2b5a8d87a5f13e7d78c4af4bbe8dcda87d931f2)
- [最終回 MoneyやMoneyBagがらみの乗加算をダブルディスパッチに変える](https://qiita.com/sumim/items/ec12c201118b77303e96)　[[この時点のコード]](https://github.com/sumim/tdd-money/tree/lecture09/TDD-Money.package)　[[前の回からの差分]](https://github.com/sumim/tdd-money/commit/ae7fe404caafdfe3bdeb0775319b53c176bee698)
[Java] Cobertura+interfaceのdefaultメソッドの組合せでカバレッジレポートが作れなかった件

表題のまんまなのですが…
時間を無駄にしてしまって悔しい経験をしたのでシェアしたいと思います。

Coberturaのカバレッジレポート生成が途中でエラーになってしまいました。

色々調べているうちに、
・Coberturaは大分前に開発が止まっている
・ラムダ式が追跡できない
という情報を見つけました。

該当ソースはラムダ式は使っていませんでしたが、interfaceのdefaultメソッドを使っていたので、試しに別な実装方法に変えてみたら、上手く通りました。

これに気づくのに数時間を費やしてしまいました…

＜参考リンク＞
[CoverageツールのCoberturaが開発が止まっている件について](https://qiita.com/AHA_oretama/items/f9d7dcbd7bc73dde0b53)
[Coberturaで追跡できないコード](https://tesshu.com/java/cant-be-tracked-in-cobertura)

本日の教訓。
**Coberturaを使うなら、Java 8以降に追加された機能は使うな。**
【一応自己解決済】ファイル内の行に対して重い処理をする時になるべく高速化したい！

元々某質問コミュニティに投げようと思った内容でしたが、とりあえず自己解決できたのでこっちに持ってきます。

# 要件
大量の行（およそ100万行）があるファイルの内容を精査してTrue,Falseの結果を返す、という事をやりたいのですが、100行の中に非常に多くの重複があり、実は1万項目だけ処理すればよい場合があります。

要件は以下の通りです。

0. Trueになった行の総数（重複含む）が知りたい
0. 一度精査した内容が次の行以降で見つかった場合、処理はせず当該箇所と同じ結果を返したい

# サンプル
簡単ですが、以下のようなテキストファイルを用意します。

``` sample.txt
aaa
aa1
a1a
aaa
1aa
1aa
aa1
``` 
↓

``` result.txt
2,aaa,[1,4]
2,aa1,[2,7]
1,a1a,[3]
2,1aa,[5,6]
```

# 私の考え
単純に書けば

``` try1.py
count = 0
for fileline in file.readlines():
    count += 1
    if fileline.find('1') > -1:
        if not (ここで重複チェック):
            (なんかすっごい複雑で重たい処理)
            print '%d %s' % (count, fileline)
```
で、とりあえず要件は満たせそうなのですが、重複チェックをどうやってやるべきか悩んでいます。
馬鹿正直にやるなら

``` try1.pyの続き
def checker(fileline, checklist):
    for list_row in checklist:
        if line == list_row:
            return True

    checklist.append(fileline)
    return False
```
みたいな関数なりを作って比較させれば良いのでしょうが、結局ファイル内の全件チェックが前提であることと、forの中でforを回すというのが個人的にはイケてない感じがすごくあります。

# 私の実装
が、他に方法も思い当たらないのでとりあえず実装したのが以下。

``` try2.py
f = open('sample.txt', 'r')

def checker(fileline, filerow, checklist):
    list_cnt = 0
    for list_row in checklist:
        if fileline == list_row[1]:
            checklist[list_cnt][0] += 1
            checklist[list_cnt][2].append(filerow)
            return True
        list_cnt += 1

    checklist.append([1, fileline,list()])
    checklist[list_cnt][2].append(filerow)
    return False

count = 0
checklist = list()

for fileline in f.readlines():
    count += 1
    if not checker(fileline, count, checklist):
        checklist.append((なんかすっごい複雑で重たい処理)の結果)
        print '%d %s' % (count, fileline.strip())

print checklist
#for row in checklist:
#    print row[]  #細かいものが欲しい場合
```

上記のような出力は確かに得られるんだけど……う～ん。
絶対他にいい方法があるはず。
AngularJSからFlask APIを呼んで、No 'Access-Control-Allow-Origin...で怒られた時の対処法

どうもmiyachi（[@_38ch](https://twitter.com/_38ch)）です。
ローカルで起動していたFlask APIをAngularから呼ぶと、以下のようなエラーがでて、レスポンスを取得できなかった。

```
No 'Access-Control-Allow-Origin.Origin 'null' is therefore not allowed access.' header is present on the requested resource error
```

調べてみると、JavaScriptが別のドメイン/プロセスでホストされているHTTPリクエストを送ろうとすると出るエラーらしい。
Flask側で **CORS (Cross-Origin Resource Sharing)**を有効にしてあげる必要がある。

「Flask cross origin」でググると丁寧に書いてある。

**インストール**

```
pip install -U flask-cors
```

**使い方**

```python:main.py
# -*- coding: utf-8 -*-
from flask import Flask, jsonify, abort, make_response
from flask_cors import CORS # <-追加
import json

api = Flask(__name__)
CORS(api) # <-追加

@api.route('/', methods=['GET'])
def sample():

    result = {'result': 'Success!!'}

    return make_response(jsonify(result))

@api.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

if __name__ == '__main__':
    api.run(port=3000)
```

```javascript:controller.js
var app = angular.module('myApp', []);
app.controller('myController', ['$scope', '$http', function($scope, $http) {

  var req = {
    method: 'GET',
    url: 'xxxxxxxxxxxxxxxxx'
  }

  $http(req).success(function(data, status, headers, config) {
    console.log(data);
  }).error(function(data, status, headers, config) {
    console.log(status);
  });
}]);
```

こんな感じでちゃんとAngularにレスポンスが返ってきました。
結構お手軽。


**参考記事：**
No 'Access-Control-Allow-Origin.Origin 'null' is therefore not allowed access.' header is present on the requested resource error(https://stackoverflow.com/questions/39912283/no-access-control-allow-origin-origin-null-is-therefore-not-allowed-access)

Flask-CORS(http://flask-cors.readthedocs.io/en/latest/)
さくらvps（CentOs7）の接続の仕方と一般ユーザーを作成する方法

初めてVPSの構築を試みていろいろ苦労したので、メモメモ。。。
詳しい解説は「[ネコでもわかる！さくらのVPS講座 〜第一回：VPSてなんだろう？〜](https://knowledge.sakura.ad.jp/7938/)」を参照。。。

#前提条件
さくら会員ページから「CentOs」はインストール済み

#接続
```Terminal.app
ssh root@IPアドレス
```

# 一般ユーザーを作成

```Terminal.app
# adduser ユーザー名
adduser hoge

# 新しいユーザーのパスワードを設定
# passwd ユーザー名
passwd hoge
```

# 一般ユーザーでのログイン

```Terminal.app
# ssh 作成したユーザー名@IPアドレス
ssh hoge@IPアドレス
```