OmniAICreator/Qiita-1.07M huggingface dataset:
貿易統計（国連）から、読み取れること（2）　

# 目的　
貿易統計のデータを使って、日本の輸出が増えてもいい品目と輸出国を探します。
(まだ途中です。。。。)
## データ
[2014の国連の貿易統計](https://toukeibiz-my.sharepoint.com/:u:/g/personal/tadashi_toukei_biz/ERNXsg1WS8VDvART_5FOxxIB8XJvv0bbyBsLivro7kzf6A?e=Wkqd6g)をまずはアップです。

データの形式は、sqlite3 なので、sqlite のクライアントがあればすぐに使えます。CSVからのインポートの手間はないです。

sqliteのクライアントは[前々処理：サクサク使うSQL(準備)](https://qiita.com/zanjibar/items/acb7f5c1d06fe800b963) の記事を参考にしてください。CSVのインポートの作業は、国連の貿易統計では必要ありません。

データには、いくつかSQLテーブルが含まれています。使うものから説明していきます。

hs07_2014 国連のデータ
https://atlas.media.mit.edu/en/resources/data/ のデータを加工しています。
多国間データです。

|column|type|説明|
|---|---|---|
|year|TEXT|2014だけです。|
|origin|TEXT|輸出元|
|dest|TEXT|輸出先|
|hs07|TEXT|HSコードです。６桁 2007年版のHSコードなんで、07になっています。桁とは関係ないです。|
|export_val|REAL|輸出額　ドル|
|import_val|REAL|輸入額　ドル|

とりあえず日本からの輸出を集計してみます。

```sql
select sum(export_val) as Value from 
hs07_2014 
where origin = 'jpn' 
```
まず、検証してみましょう。貿易のデータは食い違うことがしばしばあります。
[貿易統計　世界 年度別](http://www.customs.go.jp/toukei/suii/html/data/d41fa.csv)　からのデータと付け合わせます。円ドルが、106円なのでまあよしです。

|結果(ドル)|貿易統計（1000円）|レート|
|---|---|---|
|700494955079.218|74667047830|約106円/ドル|

## 練習（いちご）
まずは、ピンポイントでいきましょう。
２０１８年冬期オリンピックのカーリングで、女子チームがいちごを食べているのが話題になったので、いちごを調べてみます。
いちごのHSコード（貿易コード）は、081010 です。HSコード　いちごでググるとすぐにみつかります。

```sql
select sum(export_val) as Value from 
hs07_2014 
where origin = 'jpn' and
hs07='081010'
```
結果は、5123537.29　ドル　５億円くらいでしょうか？　あまり多くありませんね。
[貿易統計のデータ](http://www.customs.go.jp/toukei/srch/index.htm?M=01&P=1,1,,,,,,,,4,1,2014,0,0,0,2,081010,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,20)では,435585(千円）なので、少し食い違いますが、極端にずれていないのでいいでしょう。

2017年のデータが、ym_2017 のテーブルにはいっているのでみてみましょう。
hs6 は、６桁のHSコードの意味です。exp_imp は、輸出入です。1が輸出、2が輸入です。
文字列なので、検索の指定のときは、'1'のようにします。

```sql
select sum(Value) as Value 
from ym_2017
where hs6='081010' 
and exp_imp='1'
```
結果は、1798530（千円）なので、約１８億円です。結構のびています。

では、世界のいちごの輸出ランキングをみてみましょう。country_names　から、
国名を取得して表示するSQL文です。

```sql
select c.name,sum(export_val) as Value from 
hs07_2014 v,country_names c
where hs07='081010'
and v.origin = c.id_3char
group by origin 
order by Value desc
limit 30
```

日本はかなり低いですね。

|順位|国|金額（ドル）|
|---|---|---|
|1|Spain|644852162.21|
|2|United States|462490434.25|
|3|Mexico|379354183.87|
|4|Netherlands|270990257.36|
|5|Belgium-Luxembourg|163326755.21|
|6|Egypt|101160115.16|
|7|Greece|60120021.42|
|8|Morocco|58601790.56|
|9|Germany|51896828.64|
|10|Portugal|43769106.58|
|11|Italy|43334781.98|
|12|Poland|31327981.21|
|13|France|30320605.09|
|14|South Korea|28845839.78|
|15|Lithuania|26613271.65|
|16|Turkey|19383274.8|
|17|Jordan|12166262.72|
|18|Serbia|11546347.16|
|19|Australia|11455728.07|
|20|Ireland|11184090.3|
|21|Belarus|6347812.74|
|22|New Zealand|6022905.45|
|23|United Kingdom|5725176.56|
|24|Bulgaria|5346816.73|
|25|Japan|5123537.29|
|26|Moldova|5104081.35|
|27|China|3486814.08|
|28|Austria|2975724.93|
|29|Ethiopia|1775101.27|
|30|Sweden|1580940.34|
CloudFlare経由でのNginxが受け取るIPを正しいものにする方法

### ■ 起因
Webサーバを構築する際にCDNを使って、サーバの負荷を下げる際にCloudFlareを使うことがあると思うのですがの際、CloudFlare→Nginxを経由するとアクセスログのIPがすべてCloudFlareのIPになってしまい、正しいリクエストIPがわからなくなってしまいます。その際の解決策について、この記事で説明します。

### ■ 解決策
2つ行うことはあります。

#### ステップ1
今回は、Nginxの**HttpRealipModule**を利用します。そのため、まずNginxにHttpRealipModuleの「--with-http_realip_module」が入っているか確認します。

```bash
$ nginx -V
```

```bash:e.g
$ nginx -V
nginx version: nginx/1.13.12
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
built with OpenSSL 1.0.2o  27 Mar 2018
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-http_image_filter_module --with-http_geoip_module --with-http_perl_module --add-module=./extensions/ngx_cache_purge --add-module=./extensions/nginx-ct --add-module=./extensions/ngx_brotli --add-module=./extensions/passenger/src/nginx_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -I/usr/local/openssl/include' --with-ld-opt=-L/usr/local/openssl/lib
```

#### ステップ2
ステップ1で、**HttpRealipModule**の「--with-http_realip_module」が入っていることが確認できたら、NginxのconfにCloudFlareのIPを記載していきます。

```bash:nginx.conf
    # Cloudflare
    set_real_ip_from 103.21.244.0/22; 
    set_real_ip_from 103.22.200.0/22; 
    set_real_ip_from 103.31.4.0/22; 
    set_real_ip_from 104.16.0.0/12; 
    set_real_ip_from 108.162.192.0/18; 
    set_real_ip_from 131.0.72.0/22; 
    set_real_ip_from 141.101.64.0/18; 
    set_real_ip_from 162.158.0.0/15;
    set_real_ip_from 172.64.0.0/13; 
    set_real_ip_from 173.245.48.0/20; 
    set_real_ip_from 188.114.96.0/20; 
    set_real_ip_from 190.93.240.0/20; 
    set_real_ip_from 197.234.240.0/22; 
    set_real_ip_from 198.41.128.0/17; 
    set_real_ip_from 2400:cb00::/32; 
    set_real_ip_from 2600:4700::/32; 
    set_real_ip_from 2803:f800::/32; 
    set_real_ip_from 2405:b500::/32;
    set_real_ip_from 2405:8100::/32; 
    set_real_ip_from 2c0f:f248::/32; 
    set_real_ip_from 2a06:98c0::/29; 
    real_ip_header CF-Connecting-IP;
```

1点注意点として上記のCloudFlareのIPは変わるので下記のページに記載があるIPを適用するようにしてください。
https://www.cloudflare.com/ips/


参考 : https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx-
【Powershell】親スコープの変数を子スコープから書き換える

# そもそもPowershellのスコープとは

**スコープとは、変数の有効範囲である。**
スコープの種類は次の通り。 

- global 
  - スクリプトファイル内・外であっても、どこからでも読み書きできる。
- script
  - 同一スクリプトファイルに限り、どこからでも読み書きできる。
- local
  - 現在スコープからの読み書き、子スコープからは読み取りのみできる。
  - 同一スコープ、子スコープから読み書き可能と書いているサイトが多かったが、挙動的には子スコープからは読み取りしかできないように見えた。もしかすると間違っているかも。
- private
  - 現在のスコープ内からのみ読み書きできる。

# 失敗例
下記の場合、関数と主処理でスコープが異なるので、値を更新できない。
(参照はできる)

```powershell:sample_fault.ps1
# 変数に文字列を追加する関数
function Add-Str(){
    # 変数に"bar"を追加
    $STR += "bar"
}

# 変数に"foo"を設定
$STR = "foo"

# 関数を呼び出し
Add-Str

# 変数STRは更新されていない
# "foo"が表示される
Write-host $STR
```


実行結果

```
foo
```


## 対処1(変数にスコープを定義する)
変数のスコープをgrobalもしくはscriptに定義してあげれば、子スコープからも値を更新できる。
わざわざスコープを変数に書かないといけないのがめんどくさい。

```powershell:sample_success1.ps1
# 変数に文字列を追加する関数
function Add-Str(){
    # 変数に"bar"を追加
    $script:STR += "bar"
}

# 変数に"foo"を設定
$script:STR = "foo"

# 関数を呼び出し
Add-Str

# 変数STRは更新され、"foobar"が表示される
Write-host $script:STR
```


実行結果

```
foobar
```

## 対処2(ドットソース形式で処理を呼び出す)
ドットソースで処理を呼び出すと、呼出元と呼出先の変数のスコープが同一となる。
下記の場合は、関数Add-Strを呼び出すときに「. 」を追加すればOK。

```powershell:sample_success2.ps1
# 変数に文字列を追加する関数
function Add-Str(){
    # 変数に"bar"を追加
    $STR += "bar"
}

# 変数に"foo"を設定
$STR = "foo"

# 関数を呼び出し
. Add-Str

# 変数STRは更新され、"foobar"が表示される
Write-host $STR
```

実行結果

```
foobar
```


## 参考サイト
http://mtgpowershell.blogspot.jp/2010/11/blog-post_28.html
http://dev.knowlbo.co.jp/entry/2016/12/08/132431
Python3によるシーザー暗号の暗号化、復号の実装

###【概要】
タイトル通りシーザー暗号の暗号化、復号をPython3にて実装しました。

###【経緯】
CTFやってみようと思い、[CpawCTF](https://ctf.cpaw.site/questions.php?qnum=6)の中でシーザー暗号に関する問題があったため実際に実装してから挑戦してみました。
そのためCpawCTFのネタバレを含みますので、ご注意ください。

###【シーザー暗号とは】
[Wikipedia - シーザー暗号](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7) より引用
>
シーザー暗号は単一換字式暗号の一種で、平文の各文字を、辞書順に3文字分シフトして暗号文を作る暗号である。

###【暗号化コード】
```python
# -*- coding: utf-8 -*-

# 暗号化する文字列
encryptionStr = "{abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ}"
# 暗号化から除外する文字列
excludeStr = "{}_"
# 暗号化した文字列の結果を格納
result = ""
# アルファベットをずらす数
SHIFT_COUNT = 3

for c in encryptionStr :
    # 除外する文字列ならば変換せず、そのままにする
    if excludeStr.find(c) != -1 :
        result = result + c
        continue
    
    # 暗号化する処理
    if ord('a') <= ord(c) <= ord('z') :
        result = result + chr(abs(((ord(c) + SHIFT_COUNT - ord('a')) % 26)) + ord('a'))
    else :
        result = result + chr(abs(((ord(c) + SHIFT_COUNT - ord('A')) % 26)) + ord('A'))

print (result)
```

######実行結果
`{defghijklmnopqrstuvwxyzabc_DEFGHIJKLMNOPQRSTUVWXYZABC}`

###【復号コード】
```python
# -*- coding: utf-8 -*-

# 復号する文字列
encryptionStr = "{abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ}"
# 復号から除外する文字列
excludeStr = "{}_"
# 復号した文字列の結果を格納
result = ""
# アルファベットをずらす数
SHIFT_COUNT = 3

for c in encryptionStr :
    # 除外する文字列ならば変換せず、そのままにする
    if excludeStr.find(c) != -1 :
        result = result + c
        continue
    
    # 復号する処理
    if ord('a') <= ord(c) <= ord('z') :
        result = result + chr(abs(((ord(c) - SHIFT_COUNT - ord('a')) % 26)) + ord('a'))
    else :
        result = result + chr(abs(((ord(c) - SHIFT_COUNT - ord('A')) % 26)) + ord('A'))

print (result)
```

######実行結果
`{xyzabcdefghijklmnopqrstuvw_XYZABCDEFGHIJKLMNOPQRSTUVW}`
Anaconda Navigator が起動しなかった。

自宅で使っているWindows環境でAnaconda Navigatorが起動しなかった時の対処法。

# 症状
Anaconda Navigatorを起動すると次のエラー

```
Navigator Error
An unexpected error occurred on Navigator start-up

Main Error
could not determine a constructor for the tag 'tag:yaml.org,2002:python/unicode'
  in "C:\Users\fuga\AppData\Local\ContinuumIO\binstar\config.yaml", line 1, column 1
```

# 対処
当該ファイルを削除(退避)してからAnaconda Navigatorを起動。これで直りました。

# 参考
[could not determine a constructor for the tag 'tag:yaml.org,2002:python/unicode'](https://github.com/ContinuumIO/anaconda-issues/issues/8568)

```
remove a corrupt configuration file.
```
サーバ管理を任せしたいのでsudoできるwheelなどの自分と同じグループに所属させる

# こんにちは
「サーバ管理を任せたいsudo権限とか持ったユーザ追加を追加した」かったです。
「じゃあ`sudo`グループに追加すればいいじゃん」って話なんですが、ディストリビューションの種類とか、入っているミドルウェアの種類とかで「だいたい自分が管理していることをやってもらいたいな」っていう場合にグループを指定するのが面倒でした。

例えばウェブ系のサーバだと下記のように`wheel`以外にも`mysql`や`nginx`、`kusanagi`（ウェブサーバだとKUSANAGI最高です！）といったグループに追加してあげたいです。

```bash
$ id
uid=1002(yousan) gid=1002(yousan) groups=1002(yousan),0(root),4(adm),10(wheel),48(apache),991(mysql),992(nginx),1001(kusanagi)
```

# 自分と同じユーザに追加させる

@sak39 くんに自分と同じグループに所属させる場合。
（ただし自分ユーザ名と同じグループを除く）

```bash
$ groups | tr ' ' '\n' | grep -v `whoami` | xargs -I{} sudo usermod -aG {} sak39
```

結果です。

```bash
$ id sak39
uid=1008(sak39) gid=1008(sak39) groups=1008(sak39),0(root),4(adm),10(wheel),48(apache),992(nginx),991(mysql),1001(kusanagi)
```

うまくいってますね。

| コマンド | 意味 |
|---------|-----|
| groups | 所属グループをスペース区切りで表示 |
| tr | 文字の置換 | 
| grep -v `whoami` | 自分自身のユーザグループを除く |
| xargs -I{} | 行ごとに動作させる |
| usermod -aG | グループに追加 |

## 変数化
対象ユーザ名が後ろに来ているので、前に変数で取ったほうが使いやすいかもです。

```
$ USER=sak39 groups | tr ' ' '\n' | grep -v `whoami` | sudo xargs -I{} usermod -aG {} ${USER}
```

これで今まで面倒だった、「存在しないグループ」に追加しようとするとエラーになっちゃうのが解消されますね。

```bash
$ sudo usermod -aG apache,http someuser
usermod: group 'http' does not exist
```

快適なサーバライフを送っていきます。


# 参考
https://qiita.com/takc923/items/da1c32f3a622dc1c5489
AWS Lambda向けEC2のnodeのバージョンを更新する

# はじめに
使い捨てのAWS Lambda（node.js）の実行環境をEC2に構築するときのメモです。

AWS Lambdaの実行環境は、１〜２年に1度、利用できるnode.jsのバージョンが追加されます。
今年も、４月にv8.10.0が利用できるようになりました。

AWS EC2にLambdaと同じバージョンのnode.jsをインストールする場合、代表的なインストール方法は次のようになります。

- ソースからmakeでインストール
- linux用のバージョン管理ソフト(yum etc.)を使ってインストール
- node.js用のバージョン管理ソフト（nvm etc.）を使ってインストール

このうちの**yum**でインストールしたときのメモです。

EC2はAmazon Linux AMI バージョン (AMI 名: amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2)を利用しました。

# インストール

```
$ sudo yum install nodejs-8.10.0 npm --enablerepo=epel
```

（備考）　ソースやnvmからインストールしたnode.jsは事前にアンインストールしておきます。

# 確認

```
$ node -v
v8.10.0
$ npm -v
v6.0.1
```

# 更新対象から除外

nodejsを`sudo yum update` の対象から除外しておきます。

```/etc/yum.conf
exclude=nodejs
```

# （備考）アンインストール

私の場合、前回、ソースからインストールしたので、yumによるインストールの前に、ソースからインストールしたnode.jsのアンインストールを実施しました。また、アンインストールしただけだと、node.jsのパスを誤認識する状況になってしまったので、EC2のインスタンスを再起動しました。

```
$ cd nodeのソースコードのディレクトリ
$ make uninstall
```
【Unity】Googleスプレッドシートを使ってゲーム内パラメータを調整できるようにしてみた

# あらすじ
2018年5月　<a href = "https://www.oculus.com/go/">Oculus Go</a> を買いました。

「Oculus Goヤベェ。　いつでもどこでもVRできる。
しかもUnity使えば簡単に開発できるじゃん！ レッツVR開発ライフ！」

ワクワクした思いで、UnityでOculus Go開発を始めました。

# VRはPC上でのテストプレイが厳しい
VRコンテンツですが、 PCの画面で見たときとVRで見た時とでは
**印象が異なります**。

VR空間でどのような体験になるかはVRに入らないと詳しくは分からないわけです。

つまり、**PCだけではテストプレイができない**。

テストプレイをするためには、OculusGo用にプロジェクトをビルドしてOculusGoを被ってVRに入る必要があるわけです。

# いちいちビルドして確認するのめんどくせぇ。 F***!
実機確認するため何度もビルドすることになるんですが、これが手間になります。

Unityエディタ上で値を変更
→ビルド
→ **数分間待機**
→ OculusGoをかぶる
→ Unityエディタ上で値を変更
→ビルド
→ **数分間待機**
→ OculusGoをかぶる

これがなかなか時間を食います。

このボールをちょっと遅くしたらどうなるんだろう！みたいな小さい変更を確認するのにもビルド数分待つ必要がある。

**めんどくさい**

# Googleスプレッドシートが使えそう
ここで、Unite2018に行った時に拝見した講演を思い出しました。

<a href ="https://www.slideshare.net/UnityTechnologiesJapan002/unite-tokyo-2018-96364555">【Unite Tokyo 2018】「リトルチャンピオンズ」癖になるアクションゲームの開発事例</a>

ここではGoogleスプレッドシートを使う例やCustomAttributeを使ってツールを自動作成する例が紹介されていました。（スライド資料には載っていませんが、ステージエディタで作成したデータをGoogleスプレッドシートにアップしているという話がありました）

そして私は気が付きました。<br>

**「これ、OculusGoの開発にも使えるんじゃね？」**

# Googleスプレッドシート　→　OculusGo
まず、Googleスプレッドシートに値を入力。 
入力した値をOculusGoで取得。
シートのどの値を取得するかなどはCustomAttributeで設定。

うん、これは簡単につくれそう。

サクッと作ってみました。

# SpreadSheet-Load-Attribute
そして、作ったものがコレになります。

「SpreadSheet-Load-Attribute」
https://github.com/rngtm/SpreadSheet-Load-Attribute


## 使い方
たとえばこんなGoogleスプレッドシートがあったとします。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/ccb094d5-b8f0-d962-d2d4-5dd4aa9bc7d7.png" height = 100>

以下のようなクラスを書くと、メンバ変数の値をGoogleスプレッドシートの値で上書きすることができます。　非常にシンプルですね（自画自賛）

```Sample.cs
    [GetSheet]
    public class TestBehaviour : MonoBehaviour
    {
        [GetSheet("光速度")] private int _lightSpeed;
        [GetSheet("重力加速度")] private float _gravity;
```

[GetSheet]を付けた変数の値がGoogleスプレッドシートの中身の値に置き換わります。 


>_lightSpeed = 299792458
> _gravity = 9.81


**クラスに[GetSheet]をつけ忘れると値が変わらないので注意が必要です。**

## 特徴
・シーン開始に最初から配置されているオブジェクトの値を変更
・現時点では、シーン開始から遅れて動的に生成されるオブジェクトには対応していません

## 感想
一度ビルドしてしまえば、あとはGoogleスプレッドシートの値を変更するだけで簡単にゲームバランスの調整ができます。　

**良さそうです。**

## 注意
SpreadSheet-Load-Attributeではシーンに存在する全オブジェクトを取得して
リフレクション経由でコンポーネントの変数の書き換えを行っているため、**重いです**。

リリースビルドには含めないほうが良いでしょう。

あくまでデバッグの用途としてお使いください。

## 環境
Windows 10
Unity2017.3.0f2

# 参考URL
Googleスプレッドシートからの数値の取得は下記ブログを参考にさせていただきました。 わかりやすい情報に感謝。
http://toriden.hatenablog.com/entry/2018/04/05/024844
ビット演算でマスク処理

#ビット演算でマスク処理

「ビット演算て何に使うん？」と思っていて仕事で使ったのでメモ．

##1. 0-63の数を32個１周期としてみる
0-63の数を32個1周期でみたらどうなんのか？って話．要は32から63までの数が0-31の間のどのインデックスに相当してくれるかって話[^1]． 


```C
void main()
{
	int array64[64]; // 0-63の数が入る配列の宣言
	int array32[64]; // 32個１周期としてみるための配列の宣言

	for (int i = 0; i < 64; i++) {
		array64[i] = i;
		array32[i] = array64[i] & 0x1F; // 0x1F = 31d = 0001 1111b　とビットAND演算する⇒マスク処理
		printf("元の数＝%d，32個1周期＝%d\n", array64[i], array32[i]);
	}
	return;
}
```

実行結果は下記の通り．

```result
元の数＝0，32個１周期＝0
元の数＝1，32個１周期＝1
元の数＝2，32個１周期＝2
元の数＝3，32個１周期＝3
元の数＝4，32個１周期＝4
元の数＝5，32個１周期＝5
元の数＝6，32個１周期＝6
元の数＝7，32個１周期＝7
元の数＝8，32個１周期＝8
元の数＝9，32個１周期＝9
元の数＝10，32個１周期＝10
元の数＝11，32個１周期＝11
元の数＝12，32個１周期＝12
元の数＝13，32個１周期＝13
元の数＝14，32個１周期＝14
元の数＝15，32個１周期＝15
元の数＝16，32個１周期＝16
元の数＝17，32個１周期＝17
元の数＝18，32個１周期＝18
元の数＝19，32個１周期＝19
元の数＝20，32個１周期＝20
元の数＝21，32個１周期＝21
元の数＝22，32個１周期＝22
元の数＝23，32個１周期＝23
元の数＝24，32個１周期＝24
元の数＝25，32個１周期＝25
元の数＝26，32個１周期＝26
元の数＝27，32個１周期＝27
元の数＝28，32個１周期＝28
元の数＝29，32個１周期＝29
元の数＝30，32個１周期＝30
元の数＝31，32個１周期＝31
元の数＝32，32個１周期＝0
元の数＝33，32個１周期＝1
元の数＝34，32個１周期＝2
元の数＝35，32個１周期＝3
元の数＝36，32個１周期＝4
元の数＝37，32個１周期＝5
元の数＝38，32個１周期＝6
元の数＝39，32個１周期＝7
元の数＝40，32個１周期＝8
元の数＝41，32個１周期＝9
元の数＝42，32個１周期＝10
元の数＝43，32個１周期＝11
元の数＝44，32個１周期＝12
元の数＝45，32個１周期＝13
元の数＝46，32個１周期＝14
元の数＝47，32個１周期＝15
元の数＝48，32個１周期＝16
元の数＝49，32個１周期＝17
元の数＝50，32個１周期＝18
元の数＝51，32個１周期＝19
元の数＝52，32個１周期＝20
元の数＝53，32個１周期＝21
元の数＝54，32個１周期＝22
元の数＝55，32個１周期＝23
元の数＝56，32個１周期＝24
元の数＝57，32個１周期＝25
元の数＝58，32個１周期＝26
元の数＝59，32個１周期＝27
元の数＝60，32個１周期＝28
元の数＝61，32個１周期＝29
元の数＝62，32個１周期＝30
元の数＝63，32個１周期＝31
```
0-63の数が0-31の数に変換され32個1周期の数になっていることがわかる．
$2^n-1$は2進数表現で1ビット目から$2^n-1$を表すビットまで全て立っている[^2]．そのため，ビットAND演算立っているところまででマスクできる[^3]．

[^1]: 日本語不自由でごめんなさい．トレーニングします．
[^2]: やっぱりうまく説明できなかったので例を示す．$2^1-1=1=0001_{(2)}, 2^2-1=3=0011_{(2)},2^3-1=7=0111_{(2)}, 2^4-1=15=1111_{(2)}$
[^3]: コメントを頂いた通り、符号付きのオペランドに対してビット演算をすることは避けたほうがよいらしい。ビットシフト演算子を使う場合の予期せぬ動作はイメージできる。しかし、ビットAND演算子を用いた場合の予期せぬ動作がイメージできないのでもう少し調べてから追記したい。
OpenOfficeのCalcでF7がスペルチェックになるのがうざすぎたので対策

カタカナ変換といえばF7。

なのにOpenOfficeさんはここに謎のショートカットを割り当てやがってます。

キレそう。

消し去りましょう。


## お前を消す方法

メニューの Tools > Customize... からCustomize窓を開く。

Keyboardタブで、F7が「Spelling」になっているのをクリック。
右側のDeleteボタンをクリックして割当を解除。

続けて、使わなさそうなキーをクリック。
下の機能一覧からSpellingを選択（僕は⌘7に割り当てました）。
右側のModifyボタンをクリック。

なお、SpellingはCategoryでEditを選ぶと、Functionの下から2番めに出てきます。

<img width="577" alt="スクリーンショット 2018-05-26 14.06.37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/214031/aebf43ff-ff8c-385f-97cf-c0c8ce07e975.jpeg">

**新たな割当を行わないまま閉じると、OpenOfficeさんが親切心を発揮してもとの設定に戻してくれます。**

OpenOffice「Spellingがショートカットに登録されてないと不便やろ……デフォルトのF7に戻しておいたで！」

殺意がマシマシになるので注意が必要です。
Android端末でSketchのUIデザインをプレビューできるアプリ「Crystal」が便利な話

Crystal言語の記事ではありません。

ややQiitaの趣旨とずれるかもしれませんが、一部のフロントエンドエンジニアにとってはスマホ端末でUIデザインをプレビューすることがあるかもしれません。

SketchのUIデザインはデフォルトではAndroid連携できませんが、「Crystal」というアプリを使うだけで一瞬でプレビューできるようになります。


これです。<img width="783" alt="スクリーンショット 2018-05-26 13.53.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/255971/aa6c851c-23a8-959b-8753-9000ea23085b.png">
https://crystal.smithy.productions/

使い方はスーパーシンプルで、Android上でアプリを立ち上げると自動で自分のPCを表示してくれるので、タップ。
Sketchに通知が来て、CrystalをAuthorizeしますかみたいなことを聞かれるので、許可をします。
それだけで、Android上に、現在Sketchで開いているUIが同期されてプレビューできます。

世の中便利になったものです。

駄文失礼しました。
public private [SerializeField]　宣言について

Unityのpublic、private、 [SerializeField]宣言について考えて見た。

Unityスクリプト上でpublicで変数を宣言した場合、自動的にinspectorにて公開される。
また変数に[SerializeField]で宣言した時も同じ結果を見られる。

一般的に変数を作る時、可能な限り最低限に接近できるレベル(private)を持つようにしないといけないが、色んな意見がある中一つの理由として他のクラスで作成されたコードによって変更される可能性があるからである。

public変数宣言でUnityが自動的にinspectorに公開してくれる便利さに頼るより、干渉されないようにprivate宣言後、[SerializeField]で公開する方がいいかもしれない。

privateの目的とは違うが、いちいちスクリプットを探してバグを修正するよりはいいと思う。


Unityの公式レファレンスの見ると[SerializeField]はほとんど使用しないでpublic変数の宣言をすすめているが多くのプログラマーはよくないと行っている。

また、Unite２０１５Europeではpublic宣言がprivate宣言よりいい性能を出すかもしれないという意見も出ている。


>[Unite２０１５Europe](https://www.youtube.com/watch?v=4lAam8Marns&feature=youtu.be&t=7m00s)
>[Unity レファレンス](https://docs.unity3d.com/jp/530/ScriptReference/SerializeField.html)
Reverse Integer --プログラミングの練習のメモ

#Reverse Integer
問題：https://leetcode.com/problems/reverse-integer/description/

![スクリーンショット 2018-05-26 13.37.07.png](https://qiita-image-store.s3.amazonaws.com/0/194855/486b62d8-a78f-3921-9995-7ab756f367ff.png)


##考え方：
例：123=>321、1459=>9541
それを達成するため、具体的な例で考えてみる
与えられた数字が1459の時、とりあえず、まず１の位の数9をゲットしたいですよね、
そのあとに、145から５をゲット、以下同様のようにゲットしていくと、最終的に9541が出てくるんじゃないかと

```
1459=>9,145 
145=>5,14
14=>4
=>1 
->9541
```
ここで、重要なのは、どのように9と145を与えられた数字1459から分割していくか、
それを以下の式で簡単に求めることができます

```
1459%10=9 #与えられた数字の1の位の数
1459/10=145 #次の計算に持っていける
```
ということで、このように9，5，4，1をゲットできることができます
それらをどのように正しい桁数で足していくか

```
1459=>9,145  # a=9,ans=9
145=>5,14    # a=5,ans=95=9*10+5
14=>4		  # a=4,ans=954=95*10+4
=>1 		  # a=1,ans=9541=954*10+1
->9541
```
ここで、ansを返す結果とすると、毎回の計算で、
ans(n)=ans(n-1)*10+a(n)

になっていることがわかる。したがって、これに沿ってコードを書きましょ〜


```python

def reverse(tar):
    target=tar
    ans=0
    a=0
    while(target%10!=0):#ループの終了条件
        a=target%10
        ans=a+ans*10
        target=int(target/10)#整数であること
    return ans
b=reverse(123)
print(b)#321

	
```

また、コードについて改善すべき点がありましたら、ぜひ教えてください
VMware Workstation で TCPForward の権限がなくなった

Vagrant を用いて VMware Workstation 14 Pro で VM を起動したとき、以下のエラーが発生し、```vagrant ssh```できなくなりました。
かなり時間をつかってしまったので以下備忘録です。

```
C:/Users/foo/.vagrant.d/gems/2.3.4/gems/vagrant-vmware-workstation-4.0.25/lib/vagrant-vmware-workstation/driver.rb:2072:in `win_set_forwarded_port': Port forward registry set failure. (RuntimeError)
OUT:
ERR: Failed to add NAT port entry: Access is denied.
```

また、複数VMを起動して Ansible で provisioning もVMを一個新規起動するたびに止まってしまいます。
いろいろ調べてみると、レジストリの VMnetLib の vmnet - NAT - TCPForward の権限がなくなっています。

<img width="158" alt="vmware-vmnet-nat-tcpfwd.png" src="https://qiita-image-store.s3.amazonaws.com/0/122952/44dee990-3682-9b03-79e4-832af781ced8.png">

<img width="270" alt="TCPForward-cannot-be-opened.png" src="https://qiita-image-store.s3.amazonaws.com/0/122952/d78d066e-a5d5-7f45-64f7-8ebf04f54371.png">

権限を付与することもできなかったので、調べてみたところ、以下の対処法で実行ユーザに TCPForward の full control 権限を付与することができました。

[[Guide] How to Take Ownership (Permission) of a Registry Key in Windows?](
https://www.askvg.com/guide-how-to-take-ownership-permission-of-a-registry-key-in-windows/)

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\VMware, Inc.\VMnetLib\VMnetConfig\vmnet8\NAT\TCPForward (vmnet8は環境によって番号が異なります) の Full Control 権限を実行ユーザに与えればいいはずです。
DM200 Linux のキーボードの不具合

[キーボードしかないpomera DM200でも快適X Window環境](https://qiita.com/alt-core/items/6b16f12ed196bcba1b58) という記事で pomera DM200 に Debian Linux を導入して快適に使っているのですが、ヘビーにテキスト入力につかっていると、どうしても気になることがあります。

それは、「しゅ」と入力したつもりが「しゃう」と入力され、「さい」と入力したつもりが「さ８い」と入力されるという問題です。

~~まだ解決策を見つけられていませんので、問題の共有のみです。修正方法についての情報をお待ちしております。~~
暫定的な回避方法を実施中です: [DM200 Linux のキーボードの不具合の暫定回避 - Qiita](https://qiita.com/alt-core/items/a47612b58a2b274b8f2c)

# 症状
ある4キーの組み合わせにおいて、そのうち3つのキーを同時押しすると、もう1つのキーも押されたことになってしまう。

例えば、「A」「S」「H」「U」がその組み合わせの一つであり、S H U と順番に指を離さず３キー押すと、shau と入力され、押していない A が入力される。

発見している組み合わせは以下の通りだが、他にも多数の組み合わせが存在している。

- AS8I
- ASRD
- ASTY
- ASUH
- AS;[
- AS\\(方向キー上)
- SDQ4
- SDXC
- DRTY
- TYHU
- TY8I

## 発生場所

X上でも、コンソール上でも同様に発生する。

# pomera の標準エディタでのワークアラウンド
pomera の標準のエディタ上でも、SHIの3キーロールオーバーでは「し」と直ちに入力されるが、SHAと3キーロールオーバーした場合はSを離したタイミングで「しゃ」と入力されるため、同じ不具合（あるいはハードウェア仕様）をソフトウェア側でハンドリングしていると思われる。

具体的には、該当するキーの3キーの組み合わせの押し下げによって、4キーが同時に押されたような入力が来た時には入力を無視し、キーが離されて2キー同時入力以下になったタイミングで、まだ認識していないキーを入力されたことにしているようである。

このワークアラウンドにより、日本語入力での実利用上は、全く違和感のないテキスト入力が可能となっている。

この症状はpomeraのシステムソフトウェア1.3でも1.4でも確認している。
値にnull値が入っていたせいでJavascrpitで配列が文字列として認識された件

## 何をやろうとしていたのか。
htmlのデータ属性に埋め込んでいた配列をjQueryのdata()メソッドで取得し、console.logで表示。
以下コード

```js:word.js

var words = $(".word__wrapper").data('word');
        console.log(words);
        console.log(words[index]);
```

```erb:index.html.erb
<div class="word__wrapper" data-word='<%= @words.pluck(:id, :face, :image, :flip) %>'>
</div>
```

## 問題
２台のマックで全く同じコードを走らせたが、１方は配列型として取得でき、一方は文字列として認識された。

###　配列型として認識された時のdata属性の中身
<img width="522" alt="スクリーンショット 2018-05-26 12.56.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/d8905948-a27b-2c83-d118-d112a885587d.png">

###　文字列として認識された時のdata属性の中身
<img width="1071" alt="スクリーンショット 2018-05-26 13.02.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/2bed32a5-e767-5f68-a24e-e4b2561abdad.png">

## 結論
文字列として認識された時に使用していたPCのデータベースにおいて、imageカラムのデフォルト値がNULLになっていた。
それが理由でなぜか配列として認識してもらえなかった。

## 解決策
<img width="507" alt="スクリーンショット 2018-05-26 13.04.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/98737afd-ad27-707a-cb7a-10a44db7b1df.png">

↓
<img width="503" alt="スクリーンショット 2018-05-26 13.05.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/1a534d94-323c-0e23-89a4-a408c42709db.png">

以上で配列型として認識された。
React-navigation v1 => v2へのアップデート

react-navigation のアップデートをしたのでその記録

## XXXNavigator() を createXXXNavigator に変更

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206623/10b89a2d-8ecf-dcdc-ebf8-181b557e0d11.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206623/e003e6f3-a845-d42e-9a41-d4646880caa9.png)

TabNavigatorはcreateBottomTabNavigator とcreateMaterialTopTabNavigatorになっている模様
createTabNavigatorも使えるが今後廃止予定 (yellowboxにエラーが出る)

## 積み重ねたい画面ではnavigatin.navigate()ではなくnavigation.push()を使うように変更
https://reactnavigation.org/docs/en/stack-actions.html

```
The following actions are supported:

Reset - Replace current state with a new state
Replace - Replace a route at a given key with another route
Push - Add a route on the top of the stack, and navigate forward to it
Pop - Navigate back to previous routes
PopToTop - Navigate to the top route of the stack, dismissing all other routes
```

navigateも使えますが、挙動が変わっているの注意。

## 複数のナビゲーションは明確に使えなくなったのでその修正
https://reactnavigation.org/docs/en/common-mistakes.html

## Drawer関係の修正
結構かわったっぽい(自分は使用していないので未確認)

## 所感
ReplaceやPopなど便利なapiが追加されたのは嬉しい。navigate時の連打対応なども簡単に。

が、ちょっともっさりした感もある?? (特にandroidで顕著)
githubでもちょこちょこissueが上がっているが、、どうなるやら


## appendix
https://reactnavigation.org/blog/
operator<だけで、比較演算子も等値演算子も

## はじめに
`std::rel_ops`や`boost::operators`を使うことで、演算子の実装の手間を省くことができます。実装の手間を省くことができるというのはDRY原則からしても、とても素晴らしいことです。
通常、これらを利用する場合`operator <`と`operator==`を実装してくれれば、残ってる奴らは全部やっとくよ！というものですが、実は`operator <`だけで、すべて済みますという話です。

## mix-inの実装
`boost::operators`と同じですが、まず比較演算子の実装です。

```c++
template <typename T>
class Operators {
public:
    friend bool operator >(const T& lhs, const T& rhs) { return rhs < lhs; }
    friend bool operator<=(const T& lhs, const T& rhs) { return !(lhs > rhs); }
    friend bool operator>=(const T& lhs, const T& rhs) { return !(lhs < rhs); }
};
```

この`Operators`を継承することで、`operator <`を実装しとけば`operator >`も`operator<=`も`operator>=`も使えるようになるということです。

## 等値演算子も追加しちゃう
実は`a < b`か`b < a`なら`a != b`なので、これを利用することで等値演算子も追加できます。

```c++
template <typename T>
class Operators {
public:
    friend bool operator >(const T& lhs, const T& rhs) { return rhs < lhs; }
    friend bool operator<=(const T& lhs, const T& rhs) { return !(lhs > rhs); }
    friend bool operator>=(const T& lhs, const T& rhs) { return !(lhs < rhs); }

    friend bool operator!=(const T& lhs, const T& rhs) { return (lhs < rhs) || (rhs < lhs); }
    friend bool operator==(const T& lhs, const T& rhs) { return !(lhs != rhs); }
};
```

こいつ継承することで、`operator <`を実装しとけば、加えて`operator==`も`operator!=`も使えるようになります。

## なんでboostとかに用意されてないわけ？
問題が仮にあったとして、選択肢としてこんな感じのmix-inクラスを持っておくのは、いいことだと思いますと前置きした上で、ちょっとした雑談を。

### パフォーマンスから考える
`operator==`も`operator!=`も、それなりにパフォーマンスが必要なケースが多く、関数を引きまわすとパフォーマンス上よくはありません。(実際にバイナリになったときに影響が出るかどうかは置いといて)
ですので、`operator==`はシンプルにフィールド比較するくらいが精神衛生上も良いかもしれません。

### ユースケースから考える
演算子添加のユースケースとしては以下が考えられます。

1. 等値演算子だけ実装して、比較演算子は実装しない
1. 比較演算子だけ実装して、等値演算子は実装しない
1. 比較演算子も実装して、等値演算子も実装する

個人的には、テストも書きたいので1は必要というケースがもっとも多い気がします。
そのあと`std::set`の要素や、`std::map`のキーにしたいときには、`operator <`を実装して、せっかくなのでboost::less_than_comparableをついでに継承することがありますね。これが3のケースですね。
2から3という状況は、うーん…たしかにあまりないかもしれませんね。結局、これがないのは、そこまで需要がないということなんでしょう。

## まとめ
便利です。
pip curl issue

When I run this command "curl https://bootstrap.pypa.io/get-pip.py | sudo python", I get this error "Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst'
Consider using the `--user` option or check the permissions."


I found this article https://stackoverflow.com/questions/12277716/permission-denied-error-when-trying-to-install-pip-in-mac-os-x-lion

and tried like this instead "curl https://bootstrap.pypa.io/get-pip.py | sudo python", it worked!

Installing collected packages: pip, wheel
  Found existing installation: pip 9.0.1
    Uninstalling pip-9.0.1:
      Successfully uninstalled pip-9.0.1
Successfully installed pip-10.0.1 wheel-0.31.1
React Nativeで使えるデータベースを7種類比較【2018年5月版】

React Nativeアプリの開発にあたって、データベースの選択肢を比べてみました。
私自身使ったことがないものばかりなので、気になる点はぜひお気軽にコメントしてください！

# Realm
オープンソースのモバイル向けデータベース。RDBとKVSの両方をサポートしているそう。
標準でクライアント間をリアルタイムに同期することができる。
https://realm.io/jp/docs/javascript/latest

# Firebase
Googleの提供するモバイルバックエンド。
Firebase Realtime Databaseを使ってローカル・リモート間をリアルタイムに同期できる。

React Native向けのSDKが提供されている
https://github.com/invertase/react-native-firebase

# redux-offline
reduxのstateを永続化してデータベースとして用いるためのライブラリ。
redux-persistの機能に加え、ローカルのDBのデータを利用する裏側でリモートのAPIの呼び出し、リトライ、コミット、ロールバックなどが可能。

https://github.com/redux-offline/redux-offline
[Introducing Redux Offline: Offline-First Architecture for Progressive Web Applications and React Native](https://hackernoon.com/introducing-redux-offline-offline-first-architecture-for-progressive-web-applications-and-react-68c5167ecfe0)

# redux-persist
reduxのstateを永続化してデータベースとして用いるためのライブラリ。
リモートとデータを同期する場合、自前でコードを書くか[redux-optimist](redux-optimist)などのライブラリを併用する必要がある。
https://github.com/rt2zz/redux-persist

# AsyncStorage
React Nativeが公式で提供しているデータベース。
https://facebook.github.io/react-native/docs/asyncstorage.html

直接触らずにラッパー経由でアクセスしたほうがラクらしい。redux-persistもラッパーの一つ。
reduxとは無関係なラッパーもいくつかある。
https://github.com/sunnylqm/react-native-storage
https://github.com/jasonmerino/react-native-simple-store

リモートとデータ同期したければ、[PouchDBとのアダプター](https://github.com/stockulus/pouchdb-react-native)を被せることでCouchDBと同期させる手段もある。

# SQLite
React Native向けのSQLite。いくつか実装がある。
https://github.com/andpor/react-native-sqlite-storage
https://github.com/andpor/react-native-sqlite-storage
https://github.com/almost/react-native-sqlite

AsyncStorage同様、[PouchDBとのアダプター](https://github.com/litehelpers/Cordova-sqlite-storage)の実装がある。

# MongoDB
ドキュメント指向のNoSQLデータベース。React Nativeアプリのローカル上で利用可能。
https://github.com/antoniopresto/react-native-local-mongodb

# その他
* CoreData: iOS限定になってしまうため今回は除外しました。
* Couchbase: 情報が少なかったので除外しました...すみません！

# 参考
[How to select the right React Native database](https://hashnode.com/post/right-database-to-build-hybrid-applications-with-react-native-cja3wkjri02n1mqwtkjsuc7pj)
[Which Database should you choose for Your React Native Application?](https://dev.to/purvak_pathak/the-database-selection-guide-for-react-native-3kfm)
https://github.com/jondot/awesome-react-native
Googleスプレッドシートに並べた二択クイズをGoogleフォーム化する

#概要

訳あって、大量の二択クイズを整理し、その正解率をはかるためGoogleフォームを使おうという話になりました。うまく正解の選択肢の位置もバラけさせたい。
どうにか楽に処理できないかなぁと思い、スプレッドシートからやったろということでこの記事を書きました。

#作業
##与えられるファイル
![クイズ一覧スプレッドシート.PNG](https://qiita-image-store.s3.amazonaws.com/0/220092/ca918c68-eee6-3c93-9bcb-1fd15cb05dac.png)

AF列はメタデータで、ほしいのはBCDE列です。
B列には問題、C列には正答、D列には誤答、E列には解説が書かれています。

ツールタブからスクリプトエディタを開き、`Makeform`関数を作ります

```javascript:コード.gs
function Makeform() {
  var ActiveSheet = SpreadsheetApp.getActiveSheet();
  var lastRow = ActiveSheet.getLastRow();
  var quizdata = [];
  //クイズデータの読み取り
  quizdata=ActiveSheet.getRange(1,2,lastRow,4).getValues();

  //フォームに書き込み
  
  //var form = FormApp.create('二択クイズやろう');
  var form = FormApp.openById('xxxxxxPleaseYourFormIDxxxxxxxxxxx');
  
  for(var i = 0;i<quizdata.length;i++){
    var choices;
    var item = form.addMultipleChoiceItem();//ラジオボタン設置
    //選択肢をランダムに
    if(Math.random()<0.5){
      choices=[
        item.createChoice(quizdata[i][1],true),
        item.createChoice(quizdata[i][2],false)
      ];
    }else{
      choices=[
        item.createChoice(quizdata[i][2],false),
        item.createChoice(quizdata[i][1],true)
      ];
    }
    item.setTitle(quizdata[i][0]).setChoices(choices);//選択肢を付けて作成
    item.setPoints(1);//一問一点
    item.setRequired(true);//選択強制
    item.setFeedbackForCorrect(FormApp.createFeedback().setText(quizdata[i][3]).build());
    item.setFeedbackForIncorrect(FormApp.createFeedback().setText(quizdata[i][3]).build());
    
  }
  
  
  Logger.log(quizdata);
}
```

これを実行すると、簡単に二択クイズフォームが作れました。
なんか承認がうんたら～みたいなエラーに困ったらここが参考になります。
[Google Apps Scriptの初回実行に必要となる承認手順](https://www.virment.com/step-allow-google-apps-script/)
行を増やせば何問も解かせることができるようになるはず。

![フォーム.PNG](https://qiita-image-store.s3.amazonaws.com/0/220092/bcbdbf47-8b5d-fc75-01ff-a2db6dc4f555.png)

![送信結果フィードバック.PNG](https://qiita-image-store.s3.amazonaws.com/0/220092/2cd89993-1878-8bc9-bf88-85a3ca356256.png)

いい感じにできました。
SDユニティちゃん v1.01 を Blender v2.79 でそれっぽく Import したい

# この記事は？
SDユニティちゃんを Unity で確認後、 Blender 2.79 で Import しようと FBX ファイルを読み込んだ結果、以下のようにエラーメッセージと共に顔だけが取り込まれたように見える人

エラーメッセージ|顔だけ表示される
--- | ---
<img alt="unity-chan-bug1.png" src="https://qiita-image-store.s3.amazonaws.com/0/84122/cdc34df8-d7c1-df37-402a-63acf7d6ee24.png">|<img alt="unity-chan-bug5.png" src="https://qiita-image-store.s3.amazonaws.com/0/84122/e485c632-8ed8-6d28-490b-fc740d1c961c.png">

# 対象者
SDUnity ちゃんを Blender 2.79 に Import したい人

# バージョン
## Unity
2018.1

## SDユニティちゃん
v1.01

## Blender
2.79

# 課題を分解 
Unity では問題なく表示される FBX を読み込んでいるのにエラーによって身体が表示されない
というのが課題ではない。

拡大してみるとわかるが、顔パーツだけが原寸サイズで正しく取り込まれていないだけなのだ

顔なしSDユニティちゃんの様子
<img width="948" alt="unity-chan-bug3.png" src="https://qiita-image-store.s3.amazonaws.com/0/84122/021a26b3-f667-1a6b-c5b9-edb15f701a62.png">

# 解決方法
正しいデータを取り込む必要があるのだが、先人の知恵を借りると
https://qiita.com/YuukiOgino/items/720eab5a27a911b28a44

SDユニティちゃんは FBX の再作成が必要らしい orz

以下も合わせて読んだところ、どうやら顔のサイズさえ調整できればよさそうなのでやってみる
http://reo.hatenablog.jp/entry/2016/02/25/044828

まだボーンはおかしいですが、以下のようにパラメータを設定することで顔がモデルのあるべき位置に収まりました。
<img width="1070" alt="unity-chan-bugfix1.png" src="https://qiita-image-store.s3.amazonaws.com/0/84122/12a966c0-7dc3-1eb5-f10a-b63294797362.png">

とはいえ、エラーが出たモデルを読み込んでいるのは健全ではないので、よりよい読み込み方法があれば追記していきたいと思います。



# Special Thanks
![](http://unity-chan.com/images/imageLicenseLogo.png)
この作品は[ユニティちゃんライセンス条項](http://unity-chan.com/contents/license_jp/)の元に提供されています
CentOS7.4+Apache2.4+Laravel5.5メモ

Vagrant を使用する。synced_folder でドキュメントルートを設定する場合、httpd はスタートしていない場合があった。自動的に再起動するスクリプトを設定しておく。

```:zsh
vagrant init bento/centos-7.4
vi Vagrantfile
```

```:Vagrantfile
+   config.vm.network "private_network", ip: "192.168.33.10"
+   config.vm.synced_folder "./code", "/var/www/html/code", mount_options: ['dmode=777','fmode=777']

+  config.vm.provision "shell", run: "always", inline: <<-SHELL
+      sudo systemctl restart httpd.service
+  SHELL
```

Laravel では mod_rewrite や public/.htaccess などを使用するため AllowOverride の設定変更が必要。

```/etc/httpd/conf/httpd.conf
# Further relax access to the default document root:
-<Directory "/var/www/html">
+<Directory "/var/www/html/code/public">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
-    AllowOverride None
+    AllowOverride All
```

ドキュメントルートを調整

```
-DocumentRoot "/var/www/html"
+DocumentRoot "/var/www/html/code/public"
...
# Further relax access to the default document root:
-<Directory "/var/www/html">
+<Directory "/var/www/html/code/public">

```

timezone を変更していないと migration ファイルなどのタイムスタンプがずれる場合がある。

```
-    'timezone' => 'UTC',
+    'timezone' => 'Asia/Tokyo',
```

debugbar を追加。

```
composer require barryvdh/laravel-debugbar --dev
```

mod_rewrite がうまく動いていないと以下のようなエラーがでる。

<img width="945" alt="スクリーンショット 2018-05-26 11.45.34.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/115844/c7fe85f2-5ecc-c828-5eb3-ca23dfb7d567.jpeg">
crontabを利用したサーバ再起動時の処理

# 目的
xserverなどのレンタルサーバでメンテナンスのための再起動時に、自分の利用しているプロセスも起動させたい

#方法
crontabが利用できたので
`@reboot`をつかてシェルを叩くようにした

xserverの場合、管理画面からは`@reboot`は設定できないので、直接cronに書く

#結果
xserverの場合、メンテナンスでサーバ再起動されても、無事にredisのプロセスを起動させることができた。

#他
また、サーバ再起動通知ために同じ方法でメール送信するようにしました。
実機で動作検証時の際にロック画面に音楽の情報や再生・停止などの制御ができなくなる問題

iOS 10よりも前の場合は特に問題なかったが、iOS 10になってからロック画面への音楽情報の表示や、再生などの制御が実機でできない。
なぜかシミュレーターではちゃんと表示や再生制御ができる。

以下のようにセッションを定義しているとできないらしい。

```objc:AVAudioSessionSetting_NG.m
AVAudioSession *session = nil;
session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback
         withOptions:AVAudioSessionCategoryOptionMixWithOthers |
                     AVAudioSessionCategoryOptionDuckOthers];
```

正しくは、以下。

```objc:AVAudioSessionSetting_OK.m
AVAudioSession *session = nil;
session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback];
```

裏でこそこそ仕様が変わるのはAppleの御家芸だけれど、シミュレーターがちゃんとシミュレートしてくれないからどこに原因があるのか、最初、さっぱりわからなかった…。お陰様でApple Developersに年会費払ってなかったのが原因かと思って年会費まで払ってしまった。金返せAppleめ…💢
PhotoshopとSwipeGeneratorでアニメーションを作る １

# SwipeとSwipeGeneratorについて
 SwipeとSwipeGeneratorの説明やインストールについては以下のページを参照してください。
[PhotoshopからSwipeを作成するSwipeGenerator](https://qiita.com/isamua/items/4d328b587434d111e495)


# 画像を動かす、拡大、縮小

SwipeGeneratorでは、レイヤーグループを２つ入れ子にした中に素材を配置することにより、ページに配置した画像を動かしたり、拡大、縮小することができます。
実際に作成したSwipeのサンプルはこちらです。

http://to-kyo.to/~isamu/swipe_sample_move/

# レイヤーグループの構成
このSwipeに使ったレイヤーの構造はこのようになっています。

<img width="451" alt="スクリーンショット 2018-05-26 8.54.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/25071/dba44dbb-893d-cf3e-bc3d-88ea35b5b845.png">


１階層目のレイヤーグループがページをまとめるグループ、２階層目のレイヤーグループが各ページです。各ページには、スマートオブジェクトで画像が配置されています。


### ページ内の素材の配置

各ページの素材の配置はこのようになっています。わかりやすくする為に背景を青にしていますが、実際は透明です。

#### 1

![swipe_sample_movie1.jpg](https://qiita-image-store.s3.amazonaws.com/0/25071/da330bc0-5486-3df3-a7ac-f79d67f164a1.jpeg)

#### 2

![swipe_sample_movie2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25071/5075ab76-c52c-c3e2-6dfe-8caf44bcb29b.jpeg)

#### 3

![swipe_sample_movie3.jpg](https://qiita-image-store.s3.amazonaws.com/0/25071/e6a0e174-28b3-52cd-0932-a711d3a8f77d.jpeg)

#### 4

![swipe_sample_movie4.jpg](https://qiita-image-store.s3.amazonaws.com/0/25071/ddb57694-72e5-ee24-e539-7ac57f2c67ab.jpeg)



各素材はスマートオブジェクトの形式でおいています。同じグループのページ内のスマートオブジェクトは、そのidが同じであれば次のページでも同じ素材として扱われるので、ページ間で同一のオブジェクトの位置や大きさを変えることにより、Swipeで動きを表現したりや素材を拡大、縮小されるように扱われます。

そのため、上記例では、page1に素材を配置してからレイヤーグループごとpage2にコピーして、page2の素材を動かしたり、大きさを変えて配置しています。

# 関連
[PhotoshopとSwipeGeneratorでアニメーションを作る 2](https://qiita.com/isamua/items/c6cf8d41d14f20e98001)
rails consoleが起動しないエラー（Usage: rails new APP_PATH [options]）

# 問題の事象
githubからクローンしたレポジトリ上で、rails consoleを起動しようしたら下記のエラーが出て起動しない。

# エラー内容
```terminal
$ rails -c
Usage: rails new APP_PATH [options]
~~~以下略~~~
```

# 試したこと
- `rails -v`でのバージョン確認。

```terminal
$ rails -v
Rails 5.2.0
```

- `rails new APP_PATH [options]`時の`APP_PATH`にディレクトリを移動

-> だいたいこれで解決してる。

```terminal
$ cd /APP_PATH
$ rails -c
Usage: rails new APP_PATH [options]
```
# 根本的に間違っていた。
...これはおかしい。
そもそもrailsで作られているのか？と思い仕様書を確認。

レポジトリの仕様書をもう一度見たら、railsではなく**angular**でした。。。

というオチ。
コマンドラインからISOイメージをDVDに書き込み、Linuxのブートメディアを作成する

# 概要
Linuxのブートメディア（DVD）を作成する。

Linux環境での操作を想定している。今回は、Ubuntu 16.04を使った。


# 手順

1. 使いたいISOイメージを取得する

2. 空のDVDメディアをDVDドライブに挿入し、下記を実行する。

```shell
sudo apt install growisofs

growisofs -dvd-compat -Z /dev/dvd=/path/to/ubuntu-ja-17.10.1-desktop-amd64.iso
```

注意：`/dev/dvd`のあとのイコールを忘れると、ブートメディアにならない。
Javaで標準入力を読み込む

この記事は「ベストプラクティスを自らしめす」というよりは、「ベストプラクティスがよくわからんので、とりあえずQiitaに書いておけば、詳しい人が教えてくれるだろう」という他力本願的な動機に基づいています(´・ω・｀) インターネットの集合知にすがってみるテスト。

まずインターネット上のブログ記事などでよく見つかるのがBufferedReaderを利用するもの。

```java
var stdin = new BufferedReader(new InputStreamReader(System.in));

// 標準入力を1行ずつ読み出す。
String line;
while ((line = stdin.readLine()) != null) {
    doSomething(line);
}

// 標準入力から与えられる値が数値の場合は自ら変換する必要がある。
while ((line = stdin.readLine()) != null) {
    int i = Integer.valueOf(line);
    doSomething(i);
}

// streamにつなげやすい。
stdin.lines().forEach(System.out::println);
stdin.lines().mapToInt(Integer::valueOf);
```

この方式のメリット・デメリットを簡単にまとめると、

- ネット上でサンプルが見つけやすい。この「サンプルが豊富」というのは実務プログラミングでは意外とばかにならない。
    - ただし後述するScannerに比べると、タイプ数が多く、スクリプトレベルのプログラミングだと、やや面倒。
    - コンストラクタを2回書くあたりは、理解していても、美しいとは言い難い(´・ω・｀)
- Java8より導入されたStreamへつなげやすい。
- バッファリングしているので、高速に動作しそう(未確認)
- 検査例外IOExceptionを処理する必要がある。ちょっとしたスクリプトレベルだとこれはちょっぴり邪魔くさい。

ところで個人的な話をすると、Javaで標準入力を使うのは競技プログラミングが9割。要は「ちゃっちゃと書いて、ちゃっちゃと動かしたい」という場合が多い。また競技プログラミングにありがちなのが「1行目は数値で、2行以降は文字列」というような入力形式で、こういうときにはさまざまな型の入力を手早くさばく必要があります。こういう場合にはScannerのほうが便利であると感じることが多いように思います。

```java
var stdin = new Scanner(System.in);

// 標準入力を1行ずつ読み出す。
while (stdin.hasNextLine()) {
    var line = stdin.nextLine();
    doSomething(line);
}

// たとえば次のような入力があるとする ---> 1000 10.005 HOGE
// このような複雑な入力でも比較的処理しやすい。
int i = stdin.nextInt();
double d = stdin.nextDouble();
String s = stdin.nextLine();

// Streamにはややつなげづらい。mapToObjなどを利用するには、ひと工夫必要になる。
stdin.forEachRemaining(System.out::println);
```

こちらについても、メリット・デメリットをまとめておきます。

- とにかく多機能。複雑な入力を処理しやすい。
    - ただ「多機能すぎてよくわからん」と思わなくはない。競技プログラミングならともかく、実務ではそれほど複雑な入力があるかと問われると疑問。
- 検査例外を投げないため、「ちゃっちゃと書いて、ちゃっちゃと動かしたい」という場合には便利。
- Streamにはつなげづらい。ConsumerはともかくFunctionを利用しづらいのはつらい。
- バッファリングしているのかは実装依存。多分していない(未確認)

***

こう書くと、両者ともにメリット・デメリットがあるようです(当たり前)。ちょっとしたスクリプトレベルのプログラミングだと後者のほうが楽ちんですが、前者のほうが現代的というのは間違いない。実務的なプログラミングでは前者を採用するのがよさそうですね(´・ω・｀)
How to Install Windows7 64bit to Biostar H110M-BTC

#Connecting
(1)Use Ps2 keyboard and mouse.
(2)Connect CD or DVR drive to SATA connector 2.
(3)Connect SDD or HDD drive to SATA connector 1.

# Bios Settings
  Windows7 installer doesn't boot or freezes on normal bios settings.
So change bios settings like this.
(1)Press [Del] key on Bios screen at startup.
(2)Select [Boot] tab.
(3)Set [CSM Support]->Enable
(4)Set [Boot option filter]->[UEFI and Legacy]

Then, Windows7 installer can boot up.

I'll continue this guide,plese wait.
my donate address
RavenCoin:RCubEdQ1ZeDQXYaKvHDipt5RE3Ct6Fjuz7
Eth:0x6be251128bd29842d0ff82faf4248cfa34b0b9aa
BitCoin: 31svovVFtXt35ynueDXBLeTHKcbQH7xaJ4
openpyxlでvlookupぽいことをやってみる

#目的：B列のフラグが1の行だけを抜き出し、新たなシートに書き出す。
##環境：Python 3.6、openpyexl 2.5.3
##前提：ExcelはA列からM列まで、ブック名はdata.xlsx、シート名はSheet1、新しいシートには4行目から値を入れていく
##制約条件として、列指定のアルファベットをAからアスキーでインクリメントしているため、Ｚ列までしか処理できないことがある。

```python:

import openpyxl as op

book = op.load_workbook('data.xlsx')　#ブック読み込み
sheet = book['Sheet1']
book.create_sheet(title="new")　　#新しいシート作成
sheet_new = book["new"]

y = 3   #新しいシートの初期貼り付け行-1

for row_num in range(2, sheet.max_row): # 先頭行をスキップ
    Report_flag = sheet.cell(row=row_num, column=2).value　#B列の値取り出し

    a = []
    if Report_flag == 1:　　　#B列の値が1の時
        y += 1

        """row_num行の値を取得"""
        abc = ord("A")          #Aの asciiコード
        for i in range(13):
            v = sheet[str(chr(abc))+ str(row_num)].value　#row_num行の値取得
            a.append(v)　　　#リストに追加
            abc += 1            #asciiコードインクリメント

        """新しいシートに貼り付け"""
        abc = ord("A")          #Aの asciiコード
        for j in range(13):
            sheet_new[str(chr(abc)) + str(y)].value = a[j]
            abc += 1            #asciiコードインクリメント

book.save("new.xlsx")

```


我ながら変数yの処理がいけていない。
Unity 参考動画リスト




## unity安原祐二氏の講演動画一覧

### Unity新規参画者向け
- 【Unity道場 XRスペシャル in Panasonic （社内セミナー）】こんなに違う！Unityアプリケーション講座
    - https://www.youtube.com/watch?v=VP_d3p_6v50
- [Unity道場 札幌スペシャル]プロが教える脱初心者スクリプト術！
    - https://www.youtube.com/watch?v=FqjM9oujyNE
- 【Unite Tokyo 2018】さては非同期だなオメー！async/await完全に理解しよう
    - https://www.youtube.com/watch?v=yBNFQfviKQY

### 実践テクニック
- ［Unite 2016 Tokyo］ハードウェア性能を引き出して60fpsを実現するプログラミング・テクニック
    - https://www.youtube.com/watch?v=VNVDtUT_4rs
        - giuhub : https://github.com/unity3d-jp/AnotherThread
- 【Unite 2017 Tokyo】スマートフォンでどこまでできる？3Dゲームをぐりぐり動かすテクニック講座
    - https://www.youtube.com/watch?v=6EtTI5xC524&t=1283s
        - github : https://github.com/unity3d-jp/WaveShooter
- 【Unity道場 博多スペシャル 2017】クォータニオン完全マスター
    - https://www.youtube.com/watch?v=uKWLPU8gfIY
- 【Unity道場 2018】物理シミュレーション完全マスター
    - https://www.youtube.com/watch?v=U5oiO6DebZE
- 【Unity道場 札幌スペシャル2 2017】乱数完全マスター
    - https://www.youtube.com/watch?v=VfJAgRZ338k&t=1s
- 誘導ミサイル完全マスター
    - https://www.youtube.com/watch?v=t_4MbV2zIwg
- Unity道場 2019.2 シェーダを書けるプログラマになろう #1 シェーダを理解しよう
    - https://www.youtube.com/watch?v=wUx_Y9BgC7k
- Unity道場 2019.2 シェーダを書けるプログラマになろう #2 シェーダを理解しよう
    - https://www.youtube.com/watch?v=-Ki1Q2CAqEc
- Unity LearningMaterials
    - https://learning.unity3d.jp/speaker/yuji-yasuhara/
    - 内容追加されてます。これは実務に影響する範囲なので確認しておいた方がいいかも。
        - ゲーム制作に使う数学を学習しよう [part4 浮動小数点数]
        - https://www.youtube.com/watch?v=u7C7KdY8-bc
- 【CEDEC2018】CPUを使い切れ！Entity Component System（通称ECS）が切り開く新しいプログラミング (2019/08/15追加)
     - https://www.youtube.com/watch?v=T8lGD__aSm8
- たのしいDOTS〜初級から上級まで〜 - Unite Tokyo 2019
    - https://www.youtube.com/watch?v=ydHbtssCrMw
- 敵キャラ行動の実装テクニック
    - https://www.youtube.com/watch?v=bP6U4WHBXcY
- メインループ マニアック解説〜これからのTime.deltaTime〜 - Unityステーション
    - https://www.youtube.com/watch?v=TP7N57r5Tqw
オブジェクト指向 問題

##目的
オブジェクト指向の知識から実際にコードを書いて体感する練習問題。
前提
・Javaを使用。
・回答にはいろいろやり方がありそのうちの一つとして記入。


##★課題1
以下の仕様を満たす車クラスを作成し、メインクラスから beep メソッドを呼び出しなさい。

〇車クラス
  ・beep メソッド
      "ブーブー" という文字列が標準出力される。

##★課題2
課題1の車クラスを拡張し、increaseRider メソッドを呼び出しなさい。

〇車クラス
  ・beep メソッド
      "ブーブー" という文字列が標準出力される
  ・increaseRider メソッド
      乗車人数を増やすメソッド。
      "新しい人が乗車して、現在〇人乗車中です" と標準出力される（〇は具体的な人数）。

##★課題3
課題2の車クラスを拡張し、increaseRider メソッドを引数つきで呼び出しなさい。

〇車クラス
  ・beep メソッド
      "ブーブー" という文字列が標準出力される
  ・increaseRider メソッド
      乗車人数を増やすメソッド。
      第一引数に乗車人数をint型で指定できる。
      "新たに〇人が乗車して、現在〇人乗車中です" と標準出力される（〇は具体的な人数）。

##★課題4
課題3の車クラスを必要に応じて拡張し、現在の乗車人数を取得できるようにしなさい。

##★課題5
課題4の車クラスを拡張し、乗車人数を減らす降車メソッドを実装しなさい。
このメソッドの引数として降車人数を指定できるようにすること。
ただし、乗車人数がマイナスにならないように注意すること。

##★課題6
課題5の車クラスを拡張し、ドアのロック及びアンロックをできるメソッドを実装しなさい。
また、ドアがロックされているときは乗車及び降車ができないようにすること。
ドアがロックされているときに乗車及び降車しようとした場合、"ドアがロックされています" の文字列を標準出力すること。

##★課題7
課題6の車クラスを拡張し、乗車できる最大人数を4人に設定しなさい。

##★課題8
課題7の車クラスを複製し、乗車できる最大人数を20人に設定しなさい。

##★課題9
最大4人乗車可能な課題7のクラスと、最大20人乗車可能な課題8のクラスをリファクタリングしなさい。
必要に応じてスーパークラスやインターフェースなどを定義すること。
変数名/関数名の命名規則とガード

###**命名規則**
・変数名 … 基本的に名詞からはじまる
　　∟真偽値 … 問いかけ/可能形
　　　　男（male）か否か
　　　　　boolean male = true;   // BAD
　　　　　boolean isMale = true; // GOOD
　　　　書き込まれたか？
　　　　　boolean isWrited = true;
　　∟それ以外 … 名詞から

・関数名 … 動詞からはじまる

###**ガード**
それ以降もう処理する必要のない条件分岐なら returnで強制終了させる。
**return 2つの効果**
　∟値を返す。
　∟処理をそこで終わらせる。

```java:java
void xxxx() {
  if (this.isLocked == true) {
    System.out.println("ロックがうんぬん");
  } else {
    ...
    ..
    ...
  }
}
void xxx() {
  if (this.isLocked == true) {
    System.out.println("ロックがうんぬん");
    return;
  }
```
僕らのKaggle奮闘記~Home Credit Default Risk編~#0

不甲斐なくもまだSVM, ニューラルネットワークについて書き終えていないのですが…とりあえず一旦そのことは忘れて、ついに僕もKaggleコンペに参加し始めたので、記録がてらその過程を書いていこうと思います。

#0. Kaggleとは
そのKaggleってなんなんだ！という方も多いと思います。まずはそのような方に向けて、Kaggleというのはどういうものなのか、何ができるのか、何のためにやるのかについて僕の言葉ではなくネットに載っていた言葉で説明します。（僕も良くは分かっていない）

>Kaggleですが、本サイトへ行くと一番上に書かれていますが「The Home of Data Science & Machine Learning」（データサイエンスと機械学習の家）と題されている通り、世界中の機械学習・データサイエンスに携わっている約40万人の方が集まるコミニティーです。
Kaggleでは、企業や政府などの組織とデータ分析のプロであるデータサイエンティスト/機械学習エンジニアを繋げるプラットフォームとなっています。単純なマッチングではなく、Kaggleの最大の目玉とも言える「Competetion（コンペ）」がKaggleの特徴の一つです。
Competition（コンペ）は、企業や政府がコンペ形式（競争形式）で課題を提示し、賞金と引き換えに最も制度の高い分析モデルを買い取るという、最近でいう一種のクラウドファンディングに近いような仕組みとなります。
-[Kaggleとは？機械学習初心者が知っておくべき3つの使い方](https://www.codexa.net/what-is-kaggle/)

この説明によると、どうやらKaggleというのは**「データサイエンティストのためのオープンコミュニティー（コンペ付き）」**だと言うことができそうです。そしてKaggleの最大の魅力はやはり複数並列開催されているコンペティションでしょうか。なんといったってそのコンペ優秀者には小さい額ではない賞金が出るのです。僕が今参加しているものだと$70,000。wow!

このKaggleはワールドワイドであり、コンペ主催者は全世界の企業や政府となります。しかし中には僕たちにも身近な企業が主催しているものもあったりするので、そのような場合は腕がなってしまいますね。（まだやってないのですが）
例えば以下の図にあるようなMercariなど。

<img width="729" alt="スクリーンショット 2018-05-26 1.46.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/145067/aa9832d7-7310-f7a1-9c34-363b6d265d72.png">

それではKaggleの基本情報についてはここまでにして、以下ではKaggleコンペについてについて書いておきます。

#1. コンペ参加ステータス
コンペ参加における基本事項を箇条書きで記します。
###参加コンペ
Home Credit Default Risk
###コンペ概要
Home Credit strives to broaden financial inclusion for the unbanked population by providing a positive and safe borrowing experience. In order to make sure this underserved population has a positive loan experience, Home Credit makes use of a variety of alternative data--including telco and transactional information--to predict their clients' repayment abilities.

要約：既存の様々なデータから顧客の借金返済能力を予測したい
###チーム
sakigakeman
oginoma
###ルール
・一つのコンペで上位20%以内に入らなければ次のコンペに進むことはできない
・20%という数値に対し変更は金輪際ない
・二ヶ月以内に入らなかった場合は一律罰金2000円(学生応援価格)
等

###環境
python
jupyter notebook

では今回はとりあえずここまでにして、次記事で1stミーティングの内容をアップします。
Ethereum ブロックチェーンの現在のブロック高を取得

```js
const Web3 = require('Web3');
var web3 = new Web3('https://mainnet.infura.io');
web3.eth.getBlockNumber()
.then(console.log);
```

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ethereum_ブロックチェーンの現在のブロック高を取得