OmniAICreator/Qiita-1.07M huggingface dataset:
WRF > setup > error: expected identifier or ‘(’ before ‘int’ > 対処: mpicc -DMPI2_SUPPORTにする

```txt:動作環境
CentOS 6.8 (64bit)
on VMWare workstation
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
```

WRF v3.9をVMWare上のCentOS6.8上に構築中 (2年前の環境構築の再現)。

### error:

WRFのem_realをcompile実行中に下記のようなエラーが出た。

```bash
In file included from buf_for_proc.c:63:0:
/usr/local/openmpi-2.1.1_gcc492/include/mpi.h:194:32: error: expected identifier or ‘(’ before ‘int’
 #define ompi_fortran_integer_t int
                                ^
...
In file included from c_code.c:27:0:
/usr/local/openmpi-2.1.1_gcc492/include/mpi.h:194:32: error: two or more data types in declaration specifiers
 #define ompi_fortran_integer_t int
                                ^
/usr/local/openmpi-2.1.1_gcc492/include/mpi.h:220:18: note: in expansion of macro ‘ompi_fortran_integer_t’
 #define MPI_Fint ompi_fortran_integer_t
                  ^

```

ompi_fortran_integer_tをint_tとしているだけの実装でエラーが出ている。

以下のオプションでの回避策が有効なのだろうか?
https://stackoverflow.com/questions/10716528/openmpi-compiling-error-mpicxx-h-expected-identifier-before-numeric-constant


### mpicc -DMPI2_SUPPORT

下記にも似たような質問がある。
http://forum.wrfforum.com/viewtopic.php?f=5&t=3660

以下としてみた。

```configure.wrf
DM_CC           =       mpicc -DMPI2_SUPPORT
```

```bash
$ ./compile em_real >& log.compile_180223_t0938
```

```bash
$ tail log.compile_180223_t0938 
 
--->                  Executables successfully built                  <---
 
-rwxrwxr-x. 1 wrf wrf 36481595 Feb 23 01:39 main/ndown.exe
-rwxrwxr-x. 1 wrf wrf 36350423 Feb 23 01:39 main/real.exe
-rwxrwxr-x. 1 wrf wrf 35996995 Feb 23 01:39 main/tc.exe
-rwxrwxr-x. 1 wrf wrf 39996106 Feb 23 01:38 main/wrf.exe
 
==========================================================================
```

成功した。

### 再確認

http://forum.wrfforum.com/viewtopic.php?f=5&t=7093
を再度見ると、WRFのDM_CCとWPSのDM_CCの指定を混同していたようだ。

```configure(WRF)
DM_CC           = mpicc -DMPI2_SUPPORT
```

```configure(WPS)
DM_CC           = mpicc
```
仕事で学んだ単語/用語ざっくり

<p data-height="1500" data-theme-id="0" data-slug-hash="oEVZJm" data-default-tab="html,result" data-user="kshimoji" data-embed-version="2" data-pen-title="oEVZJm" class="codepen">See the Pen <a href="https://codepen.io/kshimoji/pen/oEVZJm/">oEVZJm</a> by k.shimoji (<a href="https://codepen.io/kshimoji">@kshimoji</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
俺言語 その6

#概要

俺言語をやってみた。
arduinoに実装してみた。

#写真
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/07f469dd-53b6-ea79-a5b4-021a20813f94.png)



#サンプルコード
1から101まで、プリント。

```
10 a=0
20 a=a+1
30 ?=a
40 #=a<101*20
#=1
```

以上。
ビットコインエクスプローラー(ウォレットコマンド:ec-new)

# ビットコインエクスプローラー(ウォレットコマンド:ec-new)

原文(https://github.com/libbitcoin/libbitcoin-explorer/wiki/)

## bx ec new

エントロピーから、Base16の楕円曲線秘密鍵を作成する。

```
Usage: bx ec-new [-h] [--config VALUE] [SEED]                            

情報：エントロピーから、Base16の楕円曲線秘密鍵を作成する。

オプション (named):

-c [--config]        コンフィギュレーションファイルを指定 
-h [--help]          コマンドの説明を表示

引数 (任意):

SEED                 新しいキーのために、BASE16エントロピーを指定。
                     すくなくとも、128bitの長さをしてい、
                     指定しない場合は、STDINから読み込む。                     
```

#### Example 1

```
bx ec-new baadf00dbaadf00dbaadf00dbaadf00d
```
```
8ed1d17dabce1fccbbe5e9bf008b318334e5bcc78eb9e7c1ea850b7eb0ddb9c8
```

#### Example 2

パイプから読み込み

```
echo baadf00dbaadf00dbaadf00dbaadf00d | bx ec-new
```
```
baadf00dbaadf00dbaadf00dbaadf00d 
8ed1d17dabce1fccbbe5e9bf008b318334e5bcc78eb9e7c1ea850b7eb0ddb9c8
```

#### Example 4

シードが短いため、エラー

```
bx ec-new baadf00dbaadf00d
```
```
The seed is less than 128 bits long.
```
AWSで不正利用され80000ドルの請求が来た話

<h1>はじめに</h1>
初めまして、気づけば年度末ですね。新年度よりエンジニアとして就職する@koyama9876です。

これは私が昨年の秋からにかけてやらかしてしまったことに対する記事です。
これが皆様のAWSを利用するにあたっての注意すべき点ぐらいに思ってもらえると幸いです。

<h1>事の発端</h1>
事の発端については私が学校の卒業研究で画像認識を活用したWEBサービスを開発するためにAWSに登録しRekognitionを使用していました。
その際にプロジェクトの管理をGitHubで行っていたのですが私の手違いでAWSのアクセスキーとシークレットアクセスキーの双方をpublic公開したうえでリポジトリにpushしてしまったことから始まります。
その際に関連付けされていたAWSの子アカウントにはEC2の全権限を割り振っていたのですが手違いでpushしてしまった各種アクセスキーを不正に利用されてしまったのが今回の直接の原因になります。

<h1>発覚</h1>
まずAWSに登録していた携帯の番号に国際電話がかかっており留守番電話がかかっていましたが気づかずスルー
その後AWSの請求ページを見た際に明らかに異常な金額が表示されており発覚
詳しく確認してみるとEC2の全リージョンで限界までインスタンスが構築・稼働されていました。
時期的にも仮想通貨のマイニングにしようされたのかなぁと思いつつも即座にサポートに不正使用されていた旨を連絡。
サポートに指示されたようにEC2の全インスタンスを削除・GitHubのリポジトリは削除し、子アカウントのアクセスキーを殺す等考えられる対処を行った後に「不正利用分を免責してもらえないでしょうか」という旨をサポートに送信しました。

<h1>その後</h1>
ベーシックプランだったため１か月ほどたった後サポートから免責できたという旨の連絡を受けどうにかかいけつすることができました。
「免責できなかったら80000ドルなんて払えないからどうしよう」と内心死にたくなってたぐらいだったのでどうにか解決できてよかったです。

<h1>最後に</h1>
今回の一件で開発スケジュールを大幅に狂わせてしまったチームの皆さん大変申し訳ございません。
またAWSのサポートの方々には足を向けて寝れないほど感謝しています。
<strong>本当にAWSサポートの方々ありがとうございました。</strong>

私自身は新年度からエンジニアとして就職しますがGitHubとAWSの利用には細心の注意をもって開発していきたいです。
またこの記事を閲覧している皆様は私のような愚行を行わないように少しでも気を付けてもらえると幸いです。

ではまた別の記事で。

<h1>追記</h1>
この一件が発覚した後の対策

・子ユーザーに割り振るポリシーを最低限の物にする
・ソースファイルに各種キーをベタ書きせず別ファイルに分離する
・各種キーが書かれたファイルは.gitignoreでpushされないように隔離する
・そもそも公開する気がないリポジトリは非公開にする

一番手っ取り早いのは４つ目ですがGitHubでは非公開リポジトリは有料アカウントでないとできないので基本的には３つ目までのことを徹底すれば各種キーが流出することはないと思います。
もし何らかのミスで流出してしまった場合はGitHubやAWSのサポートから流出してるという旨の警告が来るはずなので警告が来た場合は早い段階で対応を行うことでこの一件のような不正利用を防ぐことができると思います。
Angularで作るER DIAGRAM TOOL - 第三回　ngx-bootstrap の BsDropdownModule と CollapseModule によるnavbarの実装

##（１）bootstrapのテンプレートをもとにnavbarを作成する

■bootstrap - navbar
https://getbootstrap.com/docs/4.0/components/navbar/

上記を参考に、
/src/app/navbar/navbar.component.html を修正
https://github.com/dog-ears/er-diagram-tool/commit/a733232fa89b2e9759f8b47bfb181b90f03fc105#diff-017b6e710461134e5b4c9fd34aeabe7c

メニューは、下記で作成
ER-DIAGRAM-TOOL
- Edit
-- Create Model
- Export
-- Export JSON
- Setting
-- Data Setting

bootstrapのjsを読み込んでいないので、
このままだとドロップダウンが動きません。

なので、ngx-bootstrapを読み込みます。



##（２）ngx-bootstrap - Dropdowns の読み込みと適用

■ngx-bootstrap - Dropdowns
https://valor-software.com/ngx-bootstrap/#/dropdowns

モジュールに ngx-bootstrap - Dropdowns を追加する

/src/app/app.module.ts
https://github.com/dog-ears/er-diagram-tool/commit/811ffc799c21a55775d59b626891537ab0358cfb#diff-fc6b22833aeaf77f8440c4970ade705e

・BsDropdownModuleをインポート
・imports に BsDropdownModule.forRoot() を追加

/src/app/navbar/navbar.component.html を修正
https://github.com/dog-ears/er-diagram-tool/commit/811ffc799c21a55775d59b626891537ab0358cfb#diff-017b6e710461134e5b4c9fd34aeabe7c

・不要な属性を削除
・上位liに「dropdown」追加
・ドロップダウンを開くaタグに「dropdownToggle」追加
・ドロップダウンで開く内容のdivタグに「*dropdownMenu」を追加

これでドロップダウンが動くようになりました。

しかし、スマホ用の Collapse がまだ動かないので、
こちらも読み込みます。



##（３）ngx-bootstrap - CollapseModule の読み込みと適用

■ngx-bootstrap - Collapse
https://valor-software.com/ngx-bootstrap/#/collapse

モジュールに ngx-bootstrap - CollapseModule を追加する

/src/app/app.module.ts
https://github.com/dog-ears/er-diagram-tool/commit/5d3c8998478751b64ab961db5302bc8aef2ccdb3#diff-fc6b22833aeaf77f8440c4970ade705e

・CollapseModuleをインポート
・imports に CollapseModule.forRoot() を追加

/src/app/navbar/navbar.component.ts を修正
https://github.com/dog-ears/er-diagram-tool/commit/5d3c8998478751b64ab961db5302bc8aef2ccdb3#diff-12468dba4acc93d6788c4f72b2b89a70

・メンバ変数 isCollapsed を追加

/src/app/navbar/navbar.component.html を修正
https://github.com/dog-ears/er-diagram-tool/commit/5d3c8998478751b64ab961db5302bc8aef2ccdb3#diff-017b6e710461134e5b4c9fd34aeabe7c

・メニュを開閉するボタンに  (click)="isCollapsed = !isCollapsed" を追加。
これにより、クリックで isCollapsed が切り替わります。

・開くメニュー側に [collapse]="isCollapsed" を追加

これで、スマホ用のメニューが開くようになりました。
次回は、いったんnavbarの作成から離れて、
データサービスの作成を進めていきます。
Oracle 定数 プラットフォームによる違いをなるべくこのPACKAGEで吸収しておきたい。

```PL/SQL:CONST
CREATE OR REPLACE PACKAGE CONST
--
-- 定数
--
--   プラットフォームによる違いをなるべくこのPACKAGEで吸収しておきたい。
--
-- history
--   1999/05/01 v1.0
--   2018/08/04 v1.1  ちょと追加
--
IS
-- DIRECTORY SEPARATOR  -- ネーミングがこれで良いかは各自の判断に委ねる
    FUNCTION DIRECTORY_SEPARATOR RETURN VARCHAR2 ;

-- TAB タブ
    FUNCTION TAB RETURN VARCHAR2 ;

--  改行 New Line
    FUNCTION NL RETURN VARCHAR2 ;

--  CR
    FUNCTION CR RETURN VARCHAR2 ;

--  LF
    FUNCTION LF RETURN VARCHAR2 ;

    FUNCTION MKDIR RETURN VARCHAR2 ;  -- mkdir

    FUNCTION TAIL RETURN VARCHAR2 ;  -- mkdir tail

-- OK/NG
    FUNCTION OK RETURN VARCHAR2 ;  -- OK
    FUNCTION NG RETURN VARCHAR2 ;  -- NG

END CONST ;
/
SHOW ERROR PACKAGE CONST

CREATE OR REPLACE PACKAGE BODY CONST
IS
-- DIRECTORY SEPARATOR
    FUNCTION DIRECTORY_SEPARATOR RETURN VARCHAR2 IS
    BEGIN
--      RETURN('/') ;  -- UNIX, Linux
        RETURN('\') ;  -- Windows
    END DIRECTORY_SEPARATOR ;

-- タブ
    FUNCTION TAB RETURN VARCHAR2 IS
    BEGIN
        RETURN(chr(9)) ;
    END TAB ;

--  New Line
    FUNCTION NL RETURN VARCHAR2 IS -- New Line
    BEGIN
--      RETURN(chr(10)) ;              -- UNIX, Linux
        RETURN(chr(13) || chr(10)) ;   -- Windows
    END NL ;

--  CR
    FUNCTION CR RETURN VARCHAR2 IS -- CR
    BEGIN
        RETURN(chr(13)) ;
    END CR ;

--  LF
    FUNCTION LF RETURN VARCHAR2 IS -- LF
    BEGIN
        RETURN(chr(10)) ;
    END LF ;

    FUNCTION MKDIR RETURN VARCHAR2 IS  -- mkdir
    BEGIN
--    RETURN('mkdir -p ') ;  -- UNIX/Linux 既にディレクトリが存在していてもOK
      RETURN('mkdir ') ;     -- Windows 
    END MKDIR ;

    FUNCTION TAIL RETURN VARCHAR2 IS  -- mkdir tail
    BEGIN
--      RETURN(NULL) ;           -- UNIX/Linuxではパラメータなし
        RETURN(' > NUL 2>&1') ;  -- Windows
    END TAIL ;

-- OK/NG
    FUNCTION OK RETURN VARCHAR2 IS -- OK
    BEGIN
        RETURN('OK') ;
    END OK ;

    FUNCTION NG RETURN VARCHAR2 IS -- NG
    BEGIN
        RETURN('NG') ;
    END NG ;

END CONST ;
/
SHOW ERROR PACKAGE BODY CONST
-- ↓PUBLIC SYNONYM に
CREATE OR REPLACE PUBLIC SYNONYM CONST FOR CONST ;
-- ↓実行権をPUBLICにし、インスタンスの全スキーマから実行可能に
GRANT EXECUTE ON CONST TO PUBLIC ;
```

```SQL:実行例
COLUMN ANS FORMAT A10
SELECT CONST.DIRECTORY_SEPARATOR
    || CONST.TAB || 'X'
    || CONST.LF  || 'X' AS ANS
FROM DUAL ;

ANS
----------
\       X
X
```
参考
[エスケープシーケンス](https://www.shift-the-oracle.com/plsql/escape-sequence-string.html)
[ASCIIコード表](http://www.k-cube.co.jp/wakaba/server/ascii_code.html)
俺言語 その5

# 概要

俺言語をやってみた。
仕様を、決めてみた。

# 俺言語の仕様。

間単に言うと、javascript,arduino,avrで動く、教育用のtoy言語。

対話形式で、一行ずつ解釈するインタープリター。
行番号を持ち、分岐できる。
文は、代入文のみ。
行は、行番号、スペース、代入文。
行番号は、１から２５５まで。
変数は、a,b,c,d,e,f。
数値は、０から２５５まで。
\+ - * / で加減乗除。
%は、剰余。
$は、乱数。０から９。
0は、ソースリスト。
ソースは、256バイト。
= < > で論理式、値は０と1を取る。
文は、左から順に評価される。2+5*6は、42となる。
＃は、プログラムカウンター
if文は、#=a<100*20でaが100より小さいなら、行20に飛ぶ
？は、プリント文。
行番号無しなら、ダイレクト実行。
100 a=0で、インサート
100で、デリート
100 a=100で、エディット

```
5 a=0　　　　　 変数aを初期化
10 #=$<3*60　　乱数が３以下なら、行６０へ飛ぶ。
20 ?="zun "　　zunをプリント
30 a=a+1　　　 変数aをインクリメント
40 #=a>4*90　　変数aが４より、大きいなら、行９０へ飛ぶ。
50 #=10　　　　 行１０へ、飛ぶ。
60 ?="doko "　　dokoをプリント
70 a=0　　　　 変数aを初期化
80 #=10　　　　行１０へ、飛ぶ。
90 ?="doko ki yo shi!!"　　doko kiyoshiをプリント
#=1　　ダイレクトに、行１へ、飛ぶ。
```

# 開発の進め方

javascriptで、プロトタイプ作って、arduinoで動かして。
avrには、アセンブラで書く。

# 成果物
http://jsdo.it/ohisama1/g6dw

以上。
話題になっているAlibaba Cloud を触ってみる

# Alibaba Cloud とは
公式サイトが日本語化されているので詳細はそちらを見ていただくのが良いですが、Alibabaグループのクラウド基盤を一般ユーザーが使えるようにしている感じでしょうか？
実際に巨大なEコマースでの利用実績からサービスかされているのは興味深いですよねー

> - Alibaba Cloud 公式サイト 
    - https://jp.alibabacloud.com/

私がAlibaba Cloud を知ったのは、やはりこのすごい成長率があったという記事でしょうか

> - ガートナー社、クラウド市場の調査結果にてAlibabaが世界第3位に | SBクラウド株式会社 
    - https://www.sbcloud.co.jp/2017/10/11/gartner20170927/

触れる機会ができたので、スローペースにはなりますが触っていこうかと

# 日本語版でサインアップ
日本語のページがあるので以下の日本語ページにて日本語でサインアップできます

> - Alibaba Cloud 公式サイト 
    - https://jp.alibabacloud.com/

今なら `無料トライアル` を実施しており

> ![FireShot Capture 047 - Alibaba Cloud 公式サイト - https___jp.alibabacloud.com_.png](https://qiita-image-store.s3.amazonaws.com/0/106798/57cfdddb-0539-2aeb-930d-c6946af81878.png)

`30,000円` 分のクーポン付き！！ これなら気軽に無料トライアルできますねー

> ![FireShot Capture 048 - Alibaba Cloud 無料トライア_ - https___jp.alibabacloud.com_campaign_coupon-freetrial.png](https://qiita-image-store.s3.amazonaws.com/0/106798/e4d6833d-60c4-c788-b22b-df45cc66ab52.png)

実際のアカウント登録は特に詰まるところもなく、画面の指示通りに進んでいけばOKです。

# ログインしてみる
アカウント登録が済んだら、実際にログインしてWebコンソールを覗いてみました

> ![Image 2018-02-21 10-13-17.png](https://qiita-image-store.s3.amazonaws.com/0/106798/7a352878-3348-a097-5594-2c9dfd9232b3.png)

サービスの一覧は

> - クラウドコンピューティングサービス - Alibaba Cloud
    - https://jp.alibabacloud.com/product?spm=a21mg.146019.907453.dnavproducts0.2b242867Ht3CVY

となっていて、思ってたより少ない感じがしますが・・・日本リージョンだからなのかなぁ？
とはいえ、基本的なサービスである **Elastic Compute Service (ECS)** などは
普通に利用できるようなので、いろいろできそうですねーFaaSの基盤はないのか？日本だけなのか・・・

# 中国リージョンのアカウント
やっぱり気になる本国リージョンのアカウント・・・こちらもログインできるアカウントでWebコンソールを見てみました。

> ![Image 2018-02-21 10-28-49.png](https://qiita-image-store.s3.amazonaws.com/0/106798/324d154d-1790-1c56-7f9b-1cfdd6a164bd.png)
![Image 2018-02-21 10-29-40.png](https://qiita-image-store.s3.amazonaws.com/0/106798/90877e15-4e17-4725-d82c-927ae289738f.png)
![Image 2018-02-21 10-30-02.png](https://qiita-image-store.s3.amazonaws.com/0/106798/6c50bf74-b8de-dcc7-70c1-36ccb6115940.png)
![Image 2018-02-21 10-30-27.png](https://qiita-image-store.s3.amazonaws.com/0/106798/cf4c9b59-d018-30aa-595a-aeb6126b85a0.png)

Webブラウザの画面で３倍ぐらいの量のサービスが出てきました・・・
` Function Compute`の表記もあるのできっとFaaSの基盤に違いない。
画面によっては中国語？のみの表記になったりするので、当分は日本のアカウントで良いかなぁーと

# まとめ
- 日本のリージョンのサインアップは簡単でした
- 無料トライアルクーポンの金額が大きいので気軽に試せる
- 日本リージョンのサービスはちょっと少なめで基本的なサービス中心
- 本国のサービス量はかなりの数
- 日本にも今後本国のサービス類が来るのが楽しみ

以上になります。
Reduxは不要ではないか？


僕の本職はサーバーサイドなのですが、半年くらいReactとReduxを使ったフロント部分を触ったので、書きたいと思います。

先にReact.jsについてですが、本家がチュートリアルをしっかりと用意しており、学習コストも高くなく、悪くないものだなと思いました。

しかし、Reduxが入った途端、めっちゃ複雑になった印象があります。chromeのプラグインを入れて開発するのが普通とか言われたのですが、そんなものを使わないと作業できないくらいに複雑で辛いなぁという印象です（Javascriptは、console.logがあれば、ほぼ開発できる気がします。）

ここから先は、こんなこと考える人も居るんだなぁ程度で見てください。Reduxが好きな人はすごく嫌な記事かもしれません。その場合は、ここでそっ閉じしてください。

### Reduxはモダンだから採用した
---

これよく聴くのですが、本当に辞めてほしいです。jQueryも最初の頃はモダンだと言われてました。今では、レガシーとか言われています。数年したらほとんどのOSSがレガシーと言われているこの世の中で、モダンかどうか？という理由で採用するのは、辞めてほしいです。

また、モダンじゃないと外野に文句言われるという強迫観念じみたものを感じている人が居る気がします。

大規模システムでもなければ、１つのシステムの開発に関わる人数は、10人未満がほとんどだと思います。そのような中で、ネットに居るその他大勢の外野が何というか？を、気にするのは間違っていると思います。

今現在ソースに触れる人たちの技量に合った技術を導入すれば良いと思います。個人的には、jQueryしか使えない人たちが多い現場なら、素直にjQueryで行けば良いと思います（みんなで行けると判断したら、新しい技術に移行すれば良いと思います。ちゃんと取り替えられる設計で実装していれば、それなりのコストで移行できるはずです。）

### Reduxはフルスタックとは言わないまでもレイヤーを跨ぎ過ぎている
---

僕がシステム設計する場合、レイヤー構造を強く意識して設計します。Webシステムの場合、ざっくりと下記で考えます。

* View層
* Controller層
* Model層
* Repository層
* Infrastructure層

上から下に流れていくイメージです。
（余談ですが、Model層は特定のフレームワークとか使わずにピュアな言語仕様で書きたいです。）

シンプルなActionのみを使った場合、Repository層から下の層ぐらいで終わります。

しかし、Reduxのミドルウェアの機能を使い出すと、API呼び出しなど、Controller層の役割まで行う状態になってしまいます。そこまでガッツリと入り込まれると、ただでさえ複雑なReduxが、将来的に取り外し不可能なデカイ負債となってしまいます。

### ReduxはReactのstateの管理という名目でデータを保持しますがDBとの２重管理になる
---

DBが更新された際に、stateも更新しないとズレてしまうわけですが、その２重管理はバグの温床となります。２重管理して得られるリターンと言えば、API呼び出しを減らせることだと思うのですが、そこまでパフォーマンス的に厳しいサイトが多いのでしょうか？

TwitterとかFacebookならアクセス数が派手なので分かります。ですが、向こうは開発人数も多いし、ユニットテストなどもあると思います。ほとんどのサイトは、そこまでアクセス数も多くないしユニットテストも書いてないような気がします。

シングルページアプリケーションでも、画面が大きく変わったらサーバーにデータを取りに行ってから描画すれば良いし、React.jsには、stateの情報を次の画面に渡す方法もあります。そんな感じの実装でも十分に足りるのでは無いでしょうか？

### モジュールの依存関係が多くReact.jsのバージョンをなかなか上げられなかった
---

時間が来れば解決するのでしょうが、かなり依存モジュールが増えてしまってnpmがエラー出してました。（これに関しては、npmも悪い気がします。モジュール管理の仕方をNode.jsのV0.8くらいのやり方に戻してほしいなぁと思います）

また、自分の過去の開発を振り返ってみても、言語のバージョンアップする際に、自分達で書いたソースコードは割りと修正無しでバージョンアップできたが、フレームワークが対応してないとかで大変な思いをしたことが多かったなぁと思います。

### 実際に業務委託の方がお手上げだった
---

作業に入ってもらった業務委託の方が、お手上げしました。最終日近くに、僕がReduxを抜いて、React.jsだけにした部分を見てもらったのですが、これなら開発出来ると言っていました。（僕も、Reduxあるバージョンが辛すぎて、出来る部分のみReact.jsオンリーにしました。。）

こういうことを言うと、「作業できないやつが悪い」的な文句を言う人も居るかと思いますが、僕は違うと思います。僕が見てきた中で、システム開発で同じ人がずっと見るということは少なく、だいたいが別な人にバトンタッチしたりして、日々運用されています。

そのような状態で企業の目線で見ると、ハイレベルなエンジニアにしか開発・運用できないシステムは、欠陥品と目されると思います。僕の大好きなアーマードコアでも、個人が使うネクストよりも、凡人でも運用出来るアームズフォートという兵器のほうが良いと言っていました。

> 代替可能な多数の凡人によって制御され、ハードウェアとして安定した戦力を約束する。アームズフォートは、正に企業の望むソリューションであり事実としても、その戦力は平均的なネクストを遥かに凌いでいた。

ARMORED CORE for Answerより引用

完璧に言っています。間違いないですね(・∀・)

### まとめ
---

Reduxは複雑だと思います。データを保持するにしてもクラスとか書いてシングルトンにでもすれば良いと思います。シンプルが一番です。

僕のQiitaでも度々紹介していますが、[シンプルさの必要性](http://eed3si9n.com/ja/simplicity-matters)というRich Hickeyさんの記事があるので、一読していただければ幸いです。
JavaScriptで null, undefined, ''(空文字), 0 を簡単にチェックする方法

## **条件式で対象をチェックするだけでOK**

```js
if (チェックしたい対象) {
   /*
    * 対象が null, undefined, ''(空文字), 0 などでない場合に実行されます
    */
}
```

JavaScript の条件式は真偽値以外も入れることができます。
そして、「条件式で真偽値以外の型を評価する場合、強制的に Boolean に型変換する」というルールがあります。
**false、0、""、null、undefined および NaN は false とみなされ、それ以外は true とみなされます。**


## **例**

### **undefined や null チェック**

例えば、`Array.prototype.find ` は値が見つからなかった場合、`undefined` を返します。
値が undefined なオブジェクトのプロパティにアクセスすると例外が発生します。
以下の例では変数 lang が null や undefined 出ない場合のみプロパティにアクセスすることができます。

```js
const languages = [
    { name: 'JavaScript' },
    { name: 'PHP' },
    { name: 'Python' },
]

const lang = languages.find(l => l.name === 'Ruby');
if (lang) {
    console.log(lang.name);
}
```

また、オブジェクトを引数にとる関数はしばしば null 例外を発生させます。
しかし、一度条件式を通すことでこの典型的な例外を防ぐことができます。

```js
// ショートサーキット評価も利用可能
const greeting = (lang) => lang && `Hello ${lang.name} !!`
console.log(greeting(null));
```

### **0 チェック**

JavaScript で 0 が false とみなされることは厄介な問題です。
しかし、配列が要素を持つ場合のみ実行したい場合、この性質が役に立ちます。

```js
// 配列 languages が null や undefined でないかつ、１つ以上の要素を持つ場合に真とみなされる。
if (languages && languages.length) {
    
}
```

### **空文字チェック**

フォームの検証ではユーザーが入力したテキストが空でないかチェックしたい場面がよくあります。
以下の例ではテキストボックスの入力が空やスペースのみの場合に偽とみなし、false を返します。

```js
const txt = document.getElementById('txtBoxId').value

const isVlaid = (str) => !!str.trim()
console.log(isValid(txt))

// ※注 document.getElementById は要素が見つからな場合 nullを返します。
// 上記の例では value に直接アクセスしていますが、必要な場合、検証を行ってください。
```
gitignore_globalを作成する on OSX

# はじめに
　OS Xで作業しているとDS_Storeという隠しファイルが生成されてしまいます．GitHubでファイル管理をするときにこのファイルは邪魔なのですが，全部のリポジトリの.gitignoreファイルに.DS_Storeを追記するのはあまりスマートではありません．
　今回は.gitignore_globalを作成して.DS_Storeのように迷惑なファイルを無視するように設定したいと思います．

# gitignore_globalとは
　.gitignore_globalとは，Gitで管理する全てのフォルダに適用される.gitignoreのようなファイルです．このファイルを作成して，常に無視したいファイルを追記することでGitの管理下から除外できます．

#gitignore_globalの作成方法
　はじめに，ホームディレクトリに.gitignore_globalを作成します．

```zsh
touch ~/.gitignore_global
```

　次に，.gitignore_globalに無視したいファイルを追記します．

```.gitignore_global
.DS_Store
```

　最後に，.gitignore_globalを有効化します．ターミナル上で

```zsh
git config --global core.excludesfile ~/.gitignore_global
```

と実行するか，直接``~/.gitconfig``に

```.gitconfig
[core]
    excludesfile = /Users/<username>/.gitignore_global
```

と追記します．

これで，Git管理において.DS_Storeが表示されなくなりました．

# おわりに
　.gitignore_globalファイルを作成して.DS_Storeを無視できました．
MacのCLionで標準入力からEOFを送る

# 環境
+ macOS 10.12.6
+ CLion 2017.3

# 結論
**⌘+D** を押す

※ショートカットはPreference->Keymapから変更可能

# バグ？仕様？

```cpp
vector<string> vec;
string buf;

while (cin >> buf)
    vec.push_back(buf);

for (auto s : vec)
    cout << s << endl;
```

```
a
b
c
^D

Process finished with exit code 0
```
コンソールで`⌘+D`を押しても正常終了するが標準出力には表示されない？

# 解決方法

+ `⌘+Shift+A`
+ `Registry...`
+ `run.processes.with.pty`のチェックを外す

```
a
b
c
^D
a
b
c

Process finished with exit code 0
```

無事表示されるようになりました


# 参考
https://youtrack.jetbrains.com/issue/CPP-5704#u=1453840538340
Rのデータフレーム。Factor 関数。引数に変数を使用。

Rのデータフレームの話。
factor 関数の第１引数に「変数を使用した列指定」をしたかったが、なかなか成功しなかったため、メモ。ベクトルとデータフレームの違いがおそらくポイント。

列名"ABC"を変数に格納。
group_key <- "ABC"

A:成功例
df[group_key] <- factor(df[,group_key], levels = c(1,0), labels = c("word1","word2"))

B:不成功例
df[group_key] <- factor(df[group_key], levels = c(1,0), labels = c("word1","word2"))
df[group_key] <- factor(df$group_key, levels = c(1,0), labels = c("word1","word2"))

参考リンク
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/42.html
http://bioinfo-dojo.net/2017/08/10/r-subset/(こちらはサブセットに関するリンク、上記の考え方がsubset関数を使うときにも役に立ちそう）
pip3 listでエラーが出ないようにする


### まず
`pip3 list`
とすると、
>DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.

とエラーが出る。

### 解決法
`pip3 list --format=legacy`または、
`pip3 list --format=columns`

にすればok。
エラーメッセージにあるように、設定ファイル(`pip.conf`)に記す方法もある。

### 最後に
内容薄くてすみません。不慣れなのでテスト感覚で投稿。
CythonをWindows10で使う準備

#概要
Windows10でCythonを使うための準備を紹介する．
下記のURLを参考にした．
#環境
Windows10 x64
Python 3.6.4 64bit　Anaconda
Jupyter notebook
Visual Studio なし
#方法
Visual Studio Community 2015でVisual C++ 2015用の共通ツールをインストール．
このときオプションで，Windows SDK 10のみ追加する．

メモ帳で以下のcfgファイルを作りdistutils.cfgという名前で保存する．

```
[build]
compiler = msvc
```

これを（anacondaのインストールフォルダ）/Lib/distutils/に置き，Pathを通す．
#参照したURL
[1] http://thinkami.hatenablog.com/entry/2016/06/06/225903
オセロで強化学習をする【vs ランダム君】

タイトル通りランダム君を相手に強化学習をしてみました。

networkに与える入力値のサイズは8*8*3
一層目には自分の石の情報
二層目には相手の石の情報
三層目には合法手の情報
を0と1のみで表現しています。

network構造は
フィルターサイズが108のcnnを12層
ユニットサイズが512の全結合層が5層となっています。
活性化関数はprelu(マイナスの値を自動で学習してくれる関数)
活性化の前にbatch_normalizationを挟んでいます。
出力層は64個のsoftmax関数です。
学習時のドロップアウトはcnnと全結合共に0.5です

学習で使うデータはランダム君との対局データをそのまま使います。
勝った試合はその試合中にとった全ての行動を正解とし、その行動がより出やすくなるように勾配下降します。
負けた試合は反対に、その行動が出にくくなるように勾配下降します。
正解ラベルの与え方はごく単純でmnnistでお馴染みのone_hot_labelを与えるだけです。

その行動をより出しやすくしたい時[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
その行動を出にくくしたい時[1, 0, 1, 1, 1, 1, 1, 1, 1, 1]
今回は64個の出力値なのでこれの64個版のone_hot_labelになります。

また、不正な手を指さないように、
合法手の中で出力値が最も大きいものを指し手として採用しています。

また強化学習をする際は、通常ランダム行動を取り入れますが、今回はなしにしました。

学習のグラフ↓
![6f3741db2700a942ceb8db61c0cd6c27.png](https://qiita-image-store.s3.amazonaws.com/0/240088/59dc1f0c-78ee-3440-f049-d3ec1598317b.png)

ランダム君との対局という事で、勝率にばらつきはあるものの、8割ぐらいは勝てるようになっているのがわかります。

他に、以下のような事も試しましたが、これと言った効果はありませんでした。

・経験再生
リストなどに局面のデータと、行動した時のデータを保存しておき、
一定のタイミングでミニバッチ学習として再度する手法

経験再生はディープラの強化学習で肝となる手法というイメージでしたが
1000試合毎に直近1000試合分のデータを用いて再度学習させてみたもののこれと言った効果はありませんでした

・負けた時のみ学習させる
8割近くで止まってしまうのはnetworkが慢心してしまうからじゃね？と思ったので
負けた時のみ、その行動が出にくくなるように学習をさせてみましたが、勝率が6割~7割になってしまい性能が悪くなりました。
やはり勝った時のコツも教えてあげるのが大事なようです。

ランダム行動もさせてもみましたが、結果は同じでした。

とにもかくにも、dqnのようなやや複雑な式を組まなくてもそれなりに学習出来る事がわかりました。

次はゼロからの状態でランダム君に100%勝てるようしたいなーと思ってます。
R python 違い

データフレームについての違いを記述
コンパクトで素晴らしいページ、メモ。

https://pythondatascience.plavox.info/python%E3%81%A8r%E3%81%AE%E9%81%95%E3%81%84/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0
win10ユーザーがPythonSDK(NAOqi for Python)を導入した話

#<b>はじめに</b>
最近Pepperに携わることになりChoregrapheで遊んでいたが、もっと自由にPepperを開発したいと思ったのでPythonSDKを入れてみた。

#<b>ハマったこと</b>
PepperはPythonの2系対応なので、私の既存の3系環境と共存させることを目標にしていた。windows環境下ではどちらかのPythonを仮想化する必要があると思い取り組んだが、naoqiのパスが通らない。他にもいろいろ探していると、仮想化しなくてもAnacondaで2系3系を共存させられるとの記事を見つけを取り組むもやはりnaoqiのパスが上手く通らない。アルデバランの公式ドキュメントをよく見ていると、対応OSにwin10の名が抜け落ちていた……(最初からよく見とけよｗｗ)
ということでwindowsのFallCreatorsUpdateから正式に導入された「**WSL(Windows Subsystem for Linux)**」という技術を使って解決に至った。

#<b>導入の流れ</b>
###<b>WSLを用いてwindows環境にLinuxを導入する</b>
Windows PowerShellで
`Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux`
と打つと再起動を提案されるので、windowsを再起動する。
Microsoft StoreからUbuntuを入手(Linuxディストリビューションに関してはお好きなものを) Ubuntu起動後の各種設定は**[こちら](https://linuxfan.info/wsl-setup-guide)**より

###<b>Linux環境下にPython2.7環境を導入する</b>
まず、Gitを有効化するためにUbuntu環境上で以下コマンドを打つ
`~$ sudo apt install git`
pyenvからAnacondaのインストールに関しては**[こちら](https://www.fukuta-blog.com/install_anaconda/)**より
**※Anaconda導入の際に必ずanaconda2-\*.\*.\*verを指定すること**
###<b>PythonSDKの導入</b>
まず、以下サイトから、https://community.ald.softbankrobotics.com/en/resources/software/language/en-gb 
ADEのアカウントの作成した後、SDKを落とす。<img width="504" alt="sdk.png" src="https://qiita-image-store.s3.amazonaws.com/0/216564/1ddf7871-3ceb-b0e5-f03a-b2ced7be5d84.png">

先ほど落としたフォルダをUbuntu上に解凍したいので、再びUbuntu環境下に戻り
`~$ tar xvzf /mnt/c/Users/(username)/Downloads/pynaoqi-python2.7-2.4.3.28-linux64.tar.gz`
のようにコマンドを打つと現在のカレントディレクトリに解凍される。(windows上で落としてきたパスに**/mnt/**をつけ忘れないように注意)

さらに、パスを通すため以下コマンドを打つ

```
# pathを.bashrcに登録
~$ echo 'export PYTHONPATH=${PYTHONPATH}:/home/(自分のユーザ名)/pynaoqi-python2.7-2.4.3.28-linux64' >> ~/.bashrc
~$ echo 'export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:/home/(自分のユーザ名)/pynaoqi-python2.7-2.4.3.28-linux64' >> ~/.bashrc
# .bashrcの再読込
~$ source ~/.bashrc
```

###<b>挙動確認</b>

```
~$ python
>>> import naoqi
```

とnaoqiをインポート出来れば成功！！！お疲れ様でした。


#<b>参考サイト</b>
######Anacondaの仮想化について
https://qiita.com/supersaiakujin/items/50def6f33b79f9a61b18
######Anaconda共存について
http://whitecat-student.hatenablog.com/entry/2016/12/28/193156
######アルデバラン公式ドキュメント
http://doc.aldebaran.com/2-4/dev/python/install_guide.html
######WSLについて
https://www.buildinsider.net/enterprise/wsl/01
http://www.clear-code.com/blog/2017/11/8.html
######naoqi導入について
https://qiita.com/ayafuji/items/00ae5a079802a6c0441c
CSSでutilクラスを使うべきかどうかについての雑感

CSSのutilクラスを使うコードをたまに見かけたり、utilクラスどうですかって聞かれることがあるので、日頃思っていることを雑にメモして置きます。

## 結論
個人的にはあんまり好きでないです。使わないですむなら使わないほうがいいんじゃないかと思っています。

（言いたいことは[morishitterさんの記事](http://morishitter.hatenablog.com/entry/2015/01/30/144247)に既によくまとまってたりしますが、あえて書きます。）


## 理由
主に2つあります。（ちょっと似たような理由だったりします）
### 1.何故そのクラスがついてるのかあんまり良くわからない。

たとえば下記のようなコードと

```jsx
<div className="l-panel u-mt-32 u-mb-24">
  <div className="u-cf u-mb-12">
    <div className="u-flt-r">
      <label className="u-inline-block u-fw-b u-mr-12">....
```

以下のようなコードがあった時

```jsx

  <div className="health_checkup_category_header">
    <div className="category_title">{props.categoryName}</div>
    <div className="checkup_dates">
```

どちらのほうがメンテしやすいかという話ですが、僕は後者のほうがメンテしやすいと思います。

理由は、後者のほうが実装意図が明確だからで、何に対してそのクラスをつけた（何を一塊とみなしてレイアウトしたか）がひと目で分かるからだと思います。

CSSのクラス名は単に適当な名前を与えているのではなく、情報設計に対して名前を与えていると思うので、適切な名前を与えておいたほうが良いと思います。

### 2.それはもはやstyleべた書きとあまりかわらない。

詳細度が違うので、厳密には違いますが、それってstyle書いてるのとあんまり変わらなくね？って思っています。

これって

```jsx
<div className="u-mt-32 u-mb-24">
```

要は

```jsx
<div style={{marginTop: "32px", marginBottom: "24px"}}>
```

みたいに。というか単に読みにくく省略しただけでは、という気さえします。

アプリケーションコードを書いている時に、謎に省略した変数とかを使ったりしないと思うのですが、CSSについても同じようにしておいたほうがいいのではないかと思います。

## とはいえ面倒？

とはいえ、現実的にはいちいちCSSかくの面倒だったり、特に命名考えるの面倒だったりということあると思います。そんなにいろいろCSSのクラス名思いつかねーよみたいな。

あと、コンポーネントを汎用化したいが、それを配置するためにutil使いたいとか言うケースもあると思います。

個人的には、そういう場合のためにプロジェクトで配置用のクラス名のルールを持っておけばいいのではないかなと思います。`<componentName>Wrapper`とか`<componentName>Layout`という名前にするという決まりだけ作っておいて、そのコンポーネントを使う時は、使う側のコンポーネントに簡単な配置用のクラスだけを定義するというのがいいかなと思っています。こうしておけば、何に対してデザインを当てているかがわかるし、どういう意図（今回はコンポーネントを配置しようとしている）ということが明確になると思います。

CSSってクラス名考えるのが一番大変な時があるので、一定のルールを作っておくのはオススメです。
ステータスコード（500エラーとか）

#ステータスコードとは
WEBサイトアクセス時に500エラーとか、503エラーになどが出てきて、アクセスできなかったということはないでしょうか？
それらのことをステータスコードというのですが、解説していきます。

200：OK：正常終了
300：Found：リダイレクト
403：Forbidden：禁止（アクセス権限がない）※1
404：Not Found：ページが見つかりません 
500：Internal Server Error ：内部サーバエラー（ソースコードに不具合など）
503：Service Unavailable：一時的にサーバーにアクセスできない（過負荷など）


502とかも有名らしいですが、明日以降

※1 403エラーが出るとそのファイルが存在するということがわかるので、存在するということがバレたくない場合は404を出すようにする

#参考
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)　https://www.amazon.co.jp/dp/4774142042/ref=cm_sw_r_tw_dp_U_x_KBGUAbJ8M0VGS
docker execとdocker cpを使ってdockerを動かすシェルスクリプトを書いた時の話

# 概要
DBコンテナとしてdockerを使用していて、コンテナ外からDBを操作するシェルスクリプトを書いたらいい感じでした。
そこでコンテナ外からdockerを操作する上で重要なコマンドとなるdocker execとdocker cpについてメモしておきます。
逆に、基本的にdocker外からはこの二つのコマンドだけでdockerに実行してほしい処理はできるかと。
その他、ポイントもメモしておきます。

# docker exec
```
$ docker exec CONTAINER-NAME COMMAND
```

###例1
```
$ docker exec -it xxxxx /home/username/xxxx.sh
```

###例2
```
$ docker exec -u 1000 xxxx /home/username/sqllib/db2start 
```
例2だとルートユーザーで実行できるます。
linuxデフォルトのコマンド以外は、絶対パスでコマンドを呼び出さないとうまくいきませんでしたので、それも例2のようにやるとうまくいきます。

# docker cp
## docker外からdocker内に
```
$ docker cp HOST_PATH CONTAINER-NAME:CONTAINER_PATH
```

## docker内からdocker外に
```
$ docker cp CONTAINER-NAME:CONTAINER_PATH HOST_PATH 
```

# ポイント

## 1.実行したい処理はできるだけdocker内に記述した方が楽
後述の通り、dockerは権限周りでよく突っかかるので、決まった処理などはできるだけdocker内にシェルスクリプトとして置いておくと楽でした。
理想系は、docker外からは`docker exec` `docker cp` `chmod`の３つのコマンドしか使用しない状態だと思います。

## 2..docker内にcpするファイルはchmodを忘れずに
dockerは権限で突っかかりがちなので、docker内にコピーするファイルはchmodで適宜権限を変更してください。

## 3. (DBを操作する場合)sqlファイルをdocker cpにコピー& docker内に配置したシェルで実行すると楽
DBコンテナの場合は、sqlファイルはdocker内で実行することになります。sqlコマンドが固定ならdocker内にずっと格納しておけば良いですが、可変の場合はsqlファイルをdocker cpするようにしておくと楽でした。
以下実際のコマンド例です。

```docker_sql_sample.sh

# sqlファイルの権限変更
chmod 755  SQL_FILE.sql
echo 'copy sql file to docker..'

# Docker にsqlファイルをコピーし、dbに反映
docker cp SQL_FILE.sql CONTAINER_NAME:home/USER_NAME

# echo 'applying sql setting to db..'
docker exec -u 1000 CONTAINER_NAME home/USER_NAME/SQL_FILE.sql > /dev/null

echo 'completed'
```


## 4. docker内でディレクトリ移動してコマンドを実行するときは下記のように
```
$ docker exec some_container "bash -c cd DIRECTORY_PASS && command"
```
Amazon Linux 2017.09 に td-agent が上手くインストールできなくてやったこと

## 公式ドキュメント通りにやるとうまくいかない
https://docs.fluentd.org/v1.0/articles/install-by-rpm#amazon-linux
こちらのリンク先にあるように、自分のAmazon Linuxのバージョンは 2017.09 で Amazon Linux1のほうなので、

```
curl -L https://toolbelt.treasuredata.com/sh/install-amazon1-td-agent3.sh | sh
```

こんなコマンドを試すわけですが、肝心のパッケージがNotFoundだみたいな返事で、それなのに completed! みたいなこと言われてムカつくわけです。

## 解決方法

で色々調べ回ったところ、いきてるパッケージの直リン見つけました。以下のコマンドでうまくいきました。

```
sudo yum install http://packages.treasuredata.com.s3.amazonaws.com/3/amazon/1/2017.09/x86_64/td-agent-3.1.1-0.el2017_09.x86_64.rpm
```

## まとめ
~~公式ドキュメントというかスクリプトにはちゃんとしてもらいたいです。~~
(追記: 2018-03-02)
コメント欄での通り、上記問題の原因は分かっておりませんが、検証などきっちり対応してくださってます。へんなこと書いてすみません。
ラズパイの純正カメラモジュールが動かなくて困った話


使用機材
--------

raspberrypi3 
赤外線カメラモジュール camera v2.1 

問題点
------

ラズパイの純正カメラモジュールを正確に挿して、raspi-configでカメラモジュールを有効にしたのに以下のエラーが出て動きませんでした…

```
mmal: camera component couldn’t be enabled 
mmal: main: Failed to create camera component
mmal: Failed to run camera app. Please check for firmware updates
```

色々調べて動くようになったのでメモ

解決方法
--------

まず、以下のコマンドを実行して再起動する。

```
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
```

私の場合、それでも動かなかったため、以下のコマンドを実行して再起動。

```
sudo apt-get install --reinstall libraspberrypi0 libraspberrypi-{bin,dev,doc} raspberrypi-bootloader
sudo reboot
```

これやったらうまくいった。
Herokuのbuildpackについて

Herokuのbuildpackを使おうと思ったので、そのメモ

# コマンド
## 現在のbuildpackを確認する

```
heroku buildpacks
```

## buildpackの追加

```
heroku buildpacks:add --index [どの順番に適用するか] [URL] -a [適用するアプリ名]
```

## buildpackの削除


```
heroku buildpacks:remove [URL] -a [適用するアプリ名]
``` 

## bulldpackの全削除

```
heroku buildpacks:clear -a [適用するアプリ名]
```
ゆるふわに始めるバスケの分析

スポナビのボックススコアにpandasのread_html()を使うことで簡単にデータを取得できます

# 環境
docker上にjupyterコンテナを起動すると楽

```
$ docker -v
Docker version 17.12.0-ce, build c97c6d6

$ docker-compose -v
docker-compose version 1.18.0, build 8dd22a9

$ cat docker-compose.yml
version: "3"
services:
  jupyter:
    image: jupyter/datascience-notebook
    ports:
      - "8888:8888"
    volumes:
      - jupyter_data:/opt/conda
      - jovyan_data:/home/jovyan
    container_name: jupyter
volumes:
  jupyter_data:
  jovyan_data:
```

# ボックススコアの取得
スポナビのバスケページからボックススコアのURLを入手します
2017-18シーズン現在では
http\://sportsnavi.ht.kyodo-d.jp/basketball/stats/[b1|b2|b3]/score/[試合通し番号]/box/[h|a]/
最後の[h|a]でホームチーム、アウェイチームのボックススコアが選択できます

pandasのread_html()で取得

```python
import pandas as pd
tables = pd.read_html('http://sportsnavi.ht.kyodo-d.jp/basketball/stats/b1/score/1818/box/a/', flavor='bs4')
```

tables[0]で得点が、tables[1]で選手別の成績が取得できる

<img width="1276" alt="bleague-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/231123/d21dd5da-3f9a-e933-8a51-511af7dc6d3d.png">
npm install すると証明書エラーが起きた

エラーが出て困っていたけど、解決法が分かったのでメモ。

# 困っていたこと
npmインストールしようとすると証明書エラーが出てうまくいかなかった

```powershell:この解決策もあるけども
npm config set strict-ssl false
npm install
npm config set strict-ssl true
```

# 原因
ウィルス対策ソフトが原因でした。
当方の端末では eset SMART SECURITY 8 を使用していたのだが、SSLプロトコルフィルタリングモードが悪さをしていたみたい。


```:変更する項目
詳細設定
　┗ Webとメール
　　　┗ プロトコルフィルタリング
　　　　　┗ SSL

　SSLプロトコルチェック > SSLプロトコルでカプセル化されたプロトコルの設定 > SSLプロトコルフィルタリングモード　の値を
　SSLプロトコルを検査しない(N) にすると解決する。

```
kerasでモデル作成

kerasでCNN 自分で拾った画像でやってみる
https://qiita.com/haru1977/items/17833e508fe07c004119

KerasでMNISTの数字認識をするプログラム
http://aidiary.hatenablog.com/entry/20161109/1478696865

今更ながらKerasでCIFAR-10の画像認識をやってみた - 学習編 -
https://qiita.com/neriai/items/18105f8f63a6cc0fe555

Keras チュートリアル
https://qiita.com/sasayabaku/items/64a01363bcd5c44feb0b
HTTPについておさらいしてみた Part1

普段フレームワークやブラウザにお任せしている部分を含め、HTTPプロトコルを理解することによって、もしもの時により良い対応が行えるのでおさらいしておきます。

## 参考サイト
ぶっちゃけ、この二つ読めば沢山書いてます。
[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP)
[Wiki](https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol)

## HTTPとは
MDNより抜粋
>Hypertext Transfer Protocol (HTTP) は HTML などのハイパーメディアドキュメントを転送するための、アプリケーション層プロトコルです。

つまり、HTMLなどのドキュメントを転送するための仕組み。
OSI参照モデルの「アプリケーション層」に位置します。

>HTTP は多くの場合 TCP/IP 層をベースにしますが、任意の信頼性があるトランスポート層プロトコル、すなわち UDP のように暗黙のうちにメッセージを捨てることがないプロトコルで使用することもできます。

どうやらTCPだけでなく、UDPを使用することも可能らしいです。

## HTTPの基本方針
MDNより抜粋

### HTTPはシンプル
>HTTPは全体的にシンプルで人間が読めるように設計されています。 HTTPメッセージは人間が読んで理解することができ、開発者によるテストを容易にしています。また、初心者に対する複雑さも軽減します。

### HTTPは拡張可能
>HTTP/1.0で導入されたHTTPヘッダーによって、プロトコルの拡張や実験が容易になりました。新しい機能であっても、クライアントとサーバーが新たなヘッダーの意味について単純な合意があれば導入できます。

HTTP/0.9のときはGETメソッドしかサポートしていなかったらしいです。
つまり、現在のHTTPも当時から見ると拡張されているということになります。

### HTTPはステートレスであるがセッションレスではない
>HTTPはステートレスです。同じコネクション上であっても、連続的に実行される 2つのリクエスト間に関係性はありません。

ステートレスなので、ユーザーの状態をサーバー側で常に管理するわけではありません。
昔、ハンバーガーショップを例として説明しているサイトがあり、とても分かりやすかったので例として上げます。

**[ステートフル]**
1. 客：ハンバーガーセットください
2. 店員：セットのドリンクは何になさいますか？
3. 客：コーラで
4. 店員：店内でお召し上がりになりますか？
5. 客：持ち帰りで
6. 店員：合計、２５０円です。

**[ステートレス]**
1. 客：ハンバーガーセットください
2. 店員：セットのドリンクは何になさいますか？
3. 客：ハンバーガーセットをコーラでお願いします。
4. 店員：店内でお召し上がりになりますか？
5. 客：ハンバーガーセットをコーラで持ち帰りでお願いします。
6. 店員：合計、２５０円です。

ステートフルはユーザー側の状態を保持しているため、
「ハンバーガーセット」
「コーラ」
「持ち帰り」
の状態を保持しています。

それに対し、ステートレスは保持していないため、
リクエストをする際に追加された情報を全てサーバーに送るような形になります。

上記の通り、HTTPは基本的にステートレスですが、ステートフルを実現することも可能です。

>しかし HTTP の核心がステートレスであっても、 HTTP Cookie によってステートフルなセッションを実現できます。ヘッダーの拡張性を利用して、ワークフローに HTTP Cookie が追加されれば、それぞれの HTTP リクエストが同じ状況や同じ状態を共有するためにセッションを作成できるようになります。

例外として、Cookieを使用することでステートフルを再現することも可能です。
但し、改ざんの可能性も考えて使用することをお勧めします。
[参考サイト(IPA)](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/403.html)

ASP.NETの場合、ビューステートとか言う概念があったけど、今も使われているのかな・・・？

## HTTPとコネクション
>コネクションはトランスポート層で制御されますので、HTTPの範囲から根本的に外れています。HTTPは下層のプロトコルがコネクションベースであることに依存はせず、信頼性がある、つまりメッセージを失わないこと（少なくともエラーを表示すること）だけを要求します。

要はリクエストが送れたか、結果はどうだったかなどの情報をやり取りするためにコネクションが必要で、
実現するには下層のトランスポート層を使用するらしいです。
説明しませんでしたが、OSI参照モデルについては基礎なので調べてください。

とりあえず今回はここまで。
基本的にMDNに書いてある内容を掘っていくつもりなので、次回はキャッシュについて書こうと思います。
Raspberry Pi 3 でSDカードなしのネットワークブートをする

[前回の記事](https://qiita.com/ysugi/items/ee88eed56e0234028228)で，`bootcode.bin`というファイル一つあれば全モデルのRaspberry Piでネットワークブートできることを紹介しました．

しかし，実はRaspberry Pi **3** ではSDカードがなくてもネットワークブートできます．`bootcode.bin`の同機能がRaspberry Pi 3 のboot ROMに搭載されているためです[^1]．今回はこの手順を紹介します．

本記事は以下のページから情報を抜粋してるだけのただのメモです．

* https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net.md
* https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net_tutorial.md


## 手順

### ネットワークブート機能を有効にする

boot ROMのネットワークブート機能はデフォルトで無効にされているため，有効にします．Raspberry PiにはOTP (One Time Programmable) メモリがあり，これを書き換えます．

機能を有効にするためにはSDカードが必要です．SDカードをマウントし，そのディレクトリで以下のコマンドを実行してください:

```
$ wget https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin
$ wget https://github.com/raspberrypi/firmware/raw/master/boot/start.elf
$ wget https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat
$ echo 'program_usb_boot_mode=1' >config.txt    # 上書きしてるので注意！
```

ここでSDカードをアンマウントし，Raspberry Pi 3に差し込みます．このRaspberry Pi 3に電源を入れて数秒待つと，OTPメモリが書き換えられ，boot ROMのネットワークブート機能が有効になります．**これが終わったらSDカードは抜いておきます**．

### サーバ側の設定

Raspberry PiのネットワークブートはPXEブートと同じなので，DHCPサーバとTFTPサーバが必要です．今回は元記事に合わせてDnsmasqを使います．
また，NFS rootをします．

詳しくは元記事を見てください．

#### NFS

NFSサーバ系のパッケージ (曖昧) をインストールして，`/etc/exports`を以下のようにして `exportfs -rav` を実行．

```conf:/etc/exports
/srv/nfs 10.11.12.0/24(rw,async,no_root_squash,no_subtree_check)
```

`/srv/nfs`とかに既存のRaspbianイメージ (第2パーティション) を展開します．イメージは http://downloads.raspberrypi.org/raspbian_lite/images/ に転がってます．マウント方法とかは https://linuxconfig.org/how-to-mount-rasberry-pi-filesystem-image などを参考にしてください．

#### Dnsmasq

設定は下のような感じ．

```conf:/etc/dnsmasq.conf
port=0
log-dhcp
enable-tftp
tftp-root=/srv/tftp
dhcp-range=10.11.12.100,proxy
pxe-service=0,"Raspberry Pi Boot"
```

`/srv/tftp`にはRaspbianでいうところの`/boot`にあるファイルを全て置きます．上記で説明したRaspbianイメージ (の第1パーティション) から持ってきてください．`cmdline.txt`に関しては以下のようなことを**追記**してください．`${}`で囲まれたところは適宜変更してください．

```conf:cmdline.txt
root=/dev/nfs nfsroot=${NFSサーバのIPアドレス}:/srv/nfs rw ip=auto nfsrootdebug rootwait
```

### 起動

Raspberry Pi 3に電源を接続してしばらく待てば起動すると思う……
うまく起動しないときはブロードキャストアドレスにpingし続けたり，`/var/log/daemon.log` でサーバのログを見たり，ディスプレイを接続して起動ログを見たりしてみてください．
それでも無理ならコメントください．

## まとめ

Raspberry Pi **3**はSDカードさえなくてもネットワークブートができます．便利ですね．
私のユースケースだと，[`config.txt`は条件分岐ができる](https://www.raspberrypi.org/documentation/configuration/config-txt/conditional.md)んですが，これとネットワークブートと組み合わせることでOSの切り替えが非常に楽になりました．

ちなみに今回のOTPメモリの書き換えで，USBメモリからの起動もできるようになりました．興味のある方は試してみてください．


[^1]: ただし，ARPパケットが飛び交うネットワークでないと正しく起動しないなど，いくつかのバグがあります．
localForageをnpm install するとエラーが起きた

エラーが出て困っていたけど、解決法が分かったのでメモ。

# やりたかったこと

```powershell:code
npm install localforage
```
なぜか下記のエラーが出てinstallできない。


```:code
Error: Can't find Python executable "python", you can set the PYTHON env variable.
```

#解決策
[Windowsでnpm installしてnode-gypでつまずいた時対処方法](https://qiita.com/AkihiroTakamura/items/25ba516f8ec624e66ee7) に書いてある方法で解決。
具体的には下記を実行。


```powershell:code
npm install --global windows-build-tools
```
エラトステネスの篩　

```python:qiita.py
n=100
ans=[0]*(n+1)#0は素数候補
ans[0]=ans[1]=1#1は素数でない
i=2
while i*i<=n:
    j=2
    while i*j<=n and ans[i]==0:
        ans[i*j]=1
        j+=1
    i+=1
v=[]
for i in range(n):
    if ans[i]==0:
        v.append(i)
print(v)

#>>>[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
```
最後のところはvに入れなくても良い

```python:test.py
 for i in range(n):
    if ans[i]==0:
        print(i)
```
Processing - 12 - rectと二重forを使った描画

<img width="497" alt="スクリーンショット 2018-02-20 17.38.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/a3374e4b-76db-f3b6-2a96-c17e6b488724.png">



```java:
void setup () {
  size (500, 500);
  background (255);
  noStroke ();
  noLoop ();
}

void draw () {
  for (int n = 0; n < 8; n++) {
    for (int i = 0; i < 10; i++) {
      fill(0,       0+n*20,  i*20, 125);
      rect(i*40+50, 50+n*50, 35,   35);
    }
  }
}


```
プルリクエストを段階的に出してレビューしやすくしよう！



一つの機能を実装する際に、プルリクエストを分割して出すことでレビュアーの負担を減らそうという提案です。
下記の図のイメージです。

<img width="1052" alt="スクリーンショット 2018-02-22 23.04.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/7694/73881fc8-a2e1-1f67-d4e5-5430fec5b871.png">


## 背景

プルリクエストを程よい粒度で分割できれば良いので、わざわざこんな回りくどいことをせず、基本的には直接masterブランチなりに適度にプルリクエストを出せば良いと思います。

図の例のようにUIだけ実装している時などに、masterにマージすると変な状態のコードがリリースされてしまってマズいという場合があり、そういう場合のプルリクエスト運用の提案になります。

デプロイ可能な単位でmasterにマージしたいが、プルリクエストは適度に分割したい、という感じです。

どの開発現場でも起きうる結構普遍的な問題なのかと思っているのですが、調べてみたら今回のような具体的な手法みたいなのがあまり見当たりませんでした。
これ絶対既に誰かやってると思ったんですが... :thinking: 

私が知らないだけで、

- 既にこのやり方に名前がついていたり
- もっとスマートなやり方があったり
- 「うちではこんな感じにやっていて、いい感じに回ってるよ！」

などの情報があれば是非教えてください！



## やってみた

まだこれから試していく、という段階です。
1回だけこのフローでプルリクを出したのですが、レビュアーの方には「やりやすくて良かった」という旨の言葉を頂けました。

また、この案では最初に空コミットをするので、このWIPパターンと組み合わせてプルリクを出したりしました。

[Work in ProgressパターンによるPull Requestを利用した開発フロー](https://qiita.com/numa08/items/b676e38e3dbabfd39d18)


## 調べてみた

こういうやり方は既に世に出回っているだろうと調べたメモを書いておきます。

### 参考1

[「巨大プルリク1件vs細かいプルリク100件」問題を考える（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_02_07/51095)


> 10 lines of code = 10 issues.
500 lines of code = "looks fine."
Code reviews.


記事内で↑こちらのツイートが引用されていましたが、私も身に覚えがありますし、こういったことが起きないように巨大なプルリクエストはできるだけ避けたいと考えています。

具体的には下記のアプローチが書いてありました。

- 「早期」かつ「頻繁に」
- 粒度を小さくする
- 作業のスコープを絞る

上部の図の例だと、ui と api というスコープ分割してレビューがしやすくなり、分割されたことでプルリクの粒度も小さくなっています。


### 参考2

[なぜあなたのPull Requestは読まれないのか](https://qiita.com/SpicyCoffee/items/b580afe3a86fabf61b1c)

記事内で `Issueの単位とPRの単位は違う` ということを書かれています。
これは巨大プルリクを減らすためには良い考え方だなと思いました。
漠然とそうあるべきだよなーみたいなことは思っていた気がしますが、ちゃんと明文化しておくことが大事だなと思いました。

細かい方法はやり方は私の案のものと異なりますが、概ね同じようなアプローチなのかなーと思って読みました。



## まとめ

巨大なプルリクはレビュー辛い :joy:
【Swift4】 UIActivity: 「PDFを作成」 (Create PDF) を実装する。

UIActivityViewControllerの「PDFを作成」(英語版では、Create PDF)というメニューを実装してみました。
UITextViewのテキストをPDF化します。テキストのサイズが画面からはみ出ていても、すべてPDFにしてくれます。
![Simulator-Screen-Shot---iPhone-SE---2018-02-22-at-23.38.10.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/e13736c2-9d56-b511-41e1-8fd727e1be5c.gif)

↓右上のアクションボタンを押すと・・・
![Simulator-Screen-Shot---iPhone-SE---2018-02-22-at-23.38.17.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/c26641e4-586a-f46f-c2ad-f7299d2f7076.gif)

UITextViewのインスタンスを「var myText:UITextView!」、
右上のアクションボタンを「var actionButton:UIBarButtonItem!」とします。

```swift

import UIKit
import Accounts

class ViewController: UIViewController {
    
    @IBOutlet var myText:UITextView!
    @IBOutlet var actionButton:UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        myText.text = "こんにちは！\nこのアプリは\nUITextViewを\npdfで保存できます\n\n\n\n\n\n"
    }
    
    @IBAction func myAction(){
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, self.view.bounds, nil)
        let pdfContext = UIGraphicsGetCurrentContext()
        myText.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: myText.contentSize)
        UIGraphicsBeginPDFPageWithInfo(myText.frame, nil)
        self.myText.layer.render(in: pdfContext!)
        UIGraphicsEndPDFContext()

        let activityItems = [myText.text,pdfData] as [Any]
        let activityVC = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
        self.present(activityVC, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
Djangoのmodelで同一モデルから2個以上Foreignkeyを設定する方法

#転載元ブログ情報

自分のブログからの転載です
http://k-mawa.hateblo.jp/entry/2018/02/22/183711

#同一Modelから2個ForeignKeyをひとつのModelに張りたいとき

時々あります（よね？！^^） 例えば下記のようなSNSでフォロワー・フォロー関係のモデルを作りたい時。フォローする人もユーザーモデルオブジェクトだし、フォローされる人も同じユーザーモデルになるわけです。

models.py

```
class Follower(models.Model):
    follow_user = models.ForeignKey(User, on_delete=models.SET_NULL)
    followed_user = models.ForeignKey(User,  on_delete=models.SET_NULL)
```

これをそのままmakemigrations→migrateしようとするとエラーになります。

#解決策

エラー時にヒントが英文で出ているのですが、related_nameを使えばOK　フィールドごとに競合せずにDBに登録されるようです^^

models.py

```
class Follower(models.Model):
    follow_user = models.ForeignKey(User, on_delete=models.SET_NULL, related_name='follow_user')
    followed_user = models.ForeignKey(User,  on_delete=models.SET_NULL, related_name='followed_user')
```
Git commit 時のメールアドレスをディレクトリによって使い分ける

複数の組織に属していてレポジトリによって git commit 時のメールアドレスを使い分けたい場合がある。

これまでは `~/.gitconfig` で設定したデフォルトではないメールアドレスを使いたいレポジトリごとに `git config user.email=project-specific@example.com` のようにメールアドレスを設定していた。
レポジトリごとに設定しないといけないので結構面倒だ。

特定のメールアドレスを使うレポジトリは決まったディレクトリ以下に置くことが多いので、親ディレクトリレベルでメールアドレスを設定できたらいいな、と思っていた。
これ絶対やり方あるよな、と思いたって検索したら出てきたのでメモ。

[Conditional include](https://git-scm.com/docs/git-config#_conditional_includes) を使うと、特定条件を満たす場合のみ別の config を include することができる。
条件として `.git` ディレクトリの場所を指定できる。例えば `gitdir:/foo/bar/` の場合は `/foo/bar/` 以下に `.git` ディレクトリがあれば include される。

というわけで仕事用のメールアドレスを設定したかったので、次のようにした。

```
[includeIf "gitdir:~/gitWorkspace/for/work/"]
        path = ~/.gitconfig.work
```

のように `~/.gitconfig` に書いておき、 `~/.gitconfig.work` に

```
[user]
        email = work@example.com
```

のように書いた。

git config の内容は最後に出てきたものが優先されるので、 `includeIf` をデフォルトのメール設定より下に書くことにより、仕事用のディレクトリにチェックアウトしたものだけ仕事用のメールアドレスになる。
AdSense 自動広告

2018年2月21日グーグルさんが機械学習のパワーを使ってサイトに広告を自動的に配置する自動広告をリリースしました。

AdSense 自動広告はページ単位の広告と同じ広告コードを使うため、そのコードがすでにあるページではタグを再設定する必要はありません。AdSense の [自動広告] ページで、お客様のページに表示したいフォーマットをお選びいただくだけで準備は完了です。

**自動広告**

1. 運用が簡単: サイトの各ページに同じ広告コードを 1 回実装するだけで設定が完了し、残りの作業は Google にお任せいただけます。
2. 自動的に最適化: 広告収益とユーザー エクスペリエンスの両方に効果が見込める場合に限って、広告が表示されます。
3. 全体的な増収に効果的: 単独でも、既存の Google 広告と併用してもご利用いただけます。サイトの中に広告収益に適した新しい場所があれば、自動広告で検出されます。

**参照**
[Introducing AdSense Auto ads](https://adsense.googleblog.com/2018/02/introducing-adsense-auto-ads.html)
[VS Code]Crystal用tasks.json




```json:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "crystal",
            "args": [
                "build",
                "${workspaceRoot}/src/${workspaceRootFolderName}.cr"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "panel": "new"
            },
            "problemMatcher": {
                "owner": "crystal",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.+):(\\d+):(\\d+):\\s+(\\d+):(\\d+)\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "endLine": 4,
                    "endColumn": 5,
                    "severity": 6,
                    "message": 7
                }
            }
        },
        {
            "label": "run",
            "type": "shell",
            "command": "crystal",
            "args": [
                "run",
                "${workspaceRoot}/src/${workspaceRootFolderName}.cr"
            ],
            "presentation": {
                "panel": "new"
            },
            "problemMatcher": []
        },
        {
            "label": "test",
            "type": "shell",
            "command": "crystal spec",
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "presentation": {
                "panel": "new"
            },
            "problemMatcher": [
                {
                    "owner": "crystal",
                    "fileLocation": [
                        "relative",
                        "${workspaceRoot}"
                    ],
                    "pattern": {
                        "regexp": "^(.+):(\\d+):(\\d+):\\s+(\\d+):(\\d+)\\s+(warning|error):\\s+(.*)$",
                        "file": 1,
                        "line": 2,
                        "column": 3,
                        "endLine": 4,
                        "endColumn": 5,
                        "severity": 6,
                        "message": 7
                    }
                },
                {
                    "owner": "crystal",
                    "fileLocation": [
                        "relative",
                        "${workspaceRoot}"
                    ],
                    "severity": "error",
                    "pattern": {
                        "regexp": "^.*panicked\\s+at\\s+'(.*)',\\s+(.*):(\\d+)$",
                        "message": 1,
                        "file": 2,
                        "line": 3
                    }
                }
            ]
        }
    ]
}
```