OmniAICreator/Qiita-1.07M huggingface dataset:
（初心者向け）GitHub Pagesで自作のホームページを公開してみる。


## 自作のホームページを簡単に公開

htmlやCSSを学んで使ってみたいものの、公開するために自分でサーバーを用意するのは面倒。。。
ということで、今回は無料でホスティングできるサービス、<b>[Github Pages](https://pages.github.com/)</b>を利用してみた。

###### （てか、このリンクだけで簡単にできるなーと後から見て思いました。。汗）

## GitHubのアカウントを用意

まだアカウントを持っていない人はこちらでサクッと
[GitHubアカウント作成とリポジトリの作成手順](https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)

## 公開用のリポジトリを作成

新規のリポジトリを作成します。アクセス権限は外部に公開するんでPublicにしましょう。
リポジトリの名前は今回は「myPage」にしました。

![スクリーンショット 2019-04-23 18.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/3d4d1ffe-56d5-c5aa-33f5-c782c80b3998.png)


リポジトリが完成。今はまだ何もないので、「新しくファイルを作成するか、ファイルをアップロードしてね。」なんて言われてます。


![スクリーンショット 2019-04-23 18.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/c95a6eb3-29ec-3793-c50a-75a66cf11ba9.png)

## ローカルディレクトリにmyPageのリポジトリをクローン

コマンドプロンプトから、作成したリポジトリをローカル環境にクローンします。
```git clone [作成したリポジトリのURL]
```

もちろんまだクローンしたディレクトリには何もファイルがありません。
表示させたいホームページとしてサンプル用のindex.htmlを作成しておきます。
こんな感じ


```HTML:index.html
<html>
<head>
<meta charset="utf-8">
<title>Welcome to myPage</title>
</head>
<body>
Hello World!
</body>
</html>
```


クローンしたディレクトリの直下に置いておく。

## SourceTreeによるリポジトリの管理

せっかくだから、<b>[SourceTree](https://ja.atlassian.com/software/sourcetree)</b>のGUIを使ってリポジトリを管理してみる。

<b>SourceTree</b>はGitの無料クライアントアプリで、Gitのコマンドがよく分からんという人でも簡単に扱えると思います。

インストール方法はこちらから
[SourceTreeのダウンロードとインストール方法](http://proengineer.internous.co.jp/content/columnfeature/6983)

![スクリーンショット 2019-04-23 18.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/ab515a4e-ccde-ebe7-070b-493b1ea7acb9.png)

[既存のローカルリポジトリを追加]
より、先程クローンしたディレクトリを追加する。


![スクリーンショット 2019-04-23 18.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/56bbf807-aa33-e50f-e2c5-8394b44120b6.png)


管理中のリポジトリとして追加されましたね。


myPageのリポジトリを選択してやると、

![スクリーンショット 2019-04-23 18.32.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/a565e881-2a93-da8d-7383-d29cef347e08.png)

ちゃんと作成したindex.htmlがリモートリポジトリとの差分として反映されているのが分かります。
早速コミットしてあげましょう！

![スクリーンショット 2019-04-23 18.34.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/e66cc97b-3a79-d507-3d51-b9e61dea72cc.png)

ちゃんとGitHub上でもコミットが確認できました。

## GitHub Pagesの設定


では、公開したいページをコミットできたので、GitHub Pagesの設定に移りましょう。

リポジトリの右上にあるSettingsのタブを選択します。
中程の「GitHub Pages」の項目からSourceを選択します。

[None] -> [master branch]を選んであげましょう。

![スクリーンショット 2019-04-23 18.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/16c2cee2-75ec-257d-fa01-94342e1941ca.png)


あとは、Web上で
``https://[アカウント名].github.io/[リポジトリ名]
``
と入力してやると、、、

![スクリーンショット 2019-04-23 18.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389003/9a53143a-259a-57b1-0bcb-fbddd58e3438.png)

先ほど作成したindex.htmlが表示されましたね！

SourceTreeでコードを修正→コミット。GitHub上で確認。。。
差分管理もバッチリですね。

もちろん、GitHub上でコードを修正していくことも可能です。


## つぶやき

HPを作成・公開するためにトライアルでGitHub Pagesを使ってみました。
ただ、当人はhtmlの知識もCSSの知識もまだまだ不足している模様です。。。
【Swift学習まとめ】 変数と定数

自分の学習の振り返りとしてこれからちょくちょく投稿していきます。
まだまだ内容としては不足していると思うので、今後も学習を進め内容を充実させていきたいと思います。

#変数とは
任意のデータをコンピュータのメモリ内に一時的に格納する機能です。
コンピュータ内に用意する箱のようなものとしてイメージすればわかりやすいかとおもいます。

主な特徴
・値を後から上書きできる

**変数の宣言の書式**
**var 変数名 : 型 = 値**
<img width="373" alt="スクリーンショット 2019-04-24 17.36.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396155/8fcac792-fa61-9c66-b940-72529b9e8c1c.png">

#定数とは
変数と同様にデータを一時的に格納する機能です。
変数との違いとしては、値を後から変更することができません。

主な特徴
・値を上書きできない

**定数の宣言の書式**
**let 定数名 : 型 = 値**
<img width="352" alt="スクリーンショット 2019-04-24 17.52.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396155/d8437bbc-2ed5-9f09-f1a0-9de9516254c2.png">


#参考文献
[](https://www.amazon.co.jp/絶対に挫折しないiPhoneアプリ開発「超」入門-【Xcode-完全対応-Informatics-IDEA/dp/4797398558/ref=sr_1_1?__mk_ja_JP=カタカナ&keywords=swift&qid=1556158650&s=gateway&sr=8-1
GitリポジトリのURLごとに、pre-commit hook を用いて自動で Author を切り替える

## なにこれ

業務での開発時は会社用の Author を利用しつつ、業務時間に個人のGitHubリポジトリをいじったり、OSSを触ったりする機会もあるので、ドメインごとに自動でAuthorを切り替えたいと思い。
なにかしら方法あるのではとググってみたら、以下に先達の通った道がありました。

[GitリポジトリのURL毎に自動でコミット時のGithubアカウントを切り替える](https://qiita.com/ry023/items/a8f08f73301214fb85d9)
[githooks を使って会社とプライベート用の Author を自動変更するようにしたった](https://reboooot.net/post/automatically-change-author/)

思い切り参考にさせていただきつつ、一部バグってたり、想定どおり動かないところを少し修正しました。
誰かの参考になるかもなので、コードを残しておきます。

※ 会社ドメインが複数必要だったので、ドメイン複数置いてます

## 修正後

```shell
#!/bin/sh

### Account config (Need to modify as your own)

GITHUB_DOMAIN="github.com"
GITHUB_NAME="tatsuroro"
GITHUB_EMAIL="me@userdomain.com"

GHE_DOMAIN="your-company-github.com"
GHE_DOMAIN_2="your-company-2-github.com"
GHE_NAME="tatsuro.nakamura"
GHE_EMAIL="tatsuro.nakamura@your-company.com"

###

raw_url="$(git config remote.origin.url)"
if echo "$raw_url" | grep https; then
  # for https
  remote_domain=$(echo $raw_url | sed -E 's/^.*(https):\/\/([^/]+).*/\2/g')
else
  # for ssh
  remote_domain=$(echo $raw_url | sed -E 's/^.*(ssh):\/\/([^/]+).*/\2/g')
fi

case "$remote_domain" in
  "$GITHUB_DOMAIN" )
    NAME=$GITHUB_NAME
    EMAIL=$GITHUB_EMAIL
    ;;
  "$GHE_DOMAIN" )
    NAME=$GHE_NAME
    EMAIL=$GHE_EMAIL
    ;;
  "$GHE_DOMAIN_2" )
    NAME=$GHE_NAME
    EMAIL=$GHE_EMAIL
    ;;
  * )
    echo "unknown remote domain $remote_domain"
    exit 0
    ;;
esac

FAIL=false

if [ "$(git config --local --get user.name)" != $NAME ]; then
  git config --local user.name $NAME
  echo "changed user.name to $NAME"
  FAIL=true
fi

if [ "$(git config --local --get user.email)" != $EMAIL ]; then
  git config --local user.email $EMAIL
  echo "changed user.email to $EMAIL"
  FAIL=true
fi

if $FAIL;then
  echo "try again!"
  exit 1
fi
```

git hooks の設定手順などは参考URLに詳しいので、そちらを参照のこと。


## 追記

.gitconfig の `IncludeIf` を使って [user] の差分をインクルードするのがより簡単そうだった

Ref:
https://git-scm.com/docs/git-config#_example
https://blog.web-apps.tech/gitconfig-secret/
paizaでc

#概要

paizaでCやってみた。
エンディアン判定してみた。

#サンプルコード


```
#include <stdio.h>

int main(void)
{
    int i = 1;
    if (*(char *) &i)
    {
        printf("litlle!!");
    }
    else
    {
        printf("big!!");
    }
}

```

#成果物

https://paiza.io/projects/5PGPpx_qJMiqJ-t3wrLF9Q


以上。
アプリモダン化ガイド

## はじめに
デジタルトランスフォーメーション（DX）！モダン化！アジャイル！
最近よく聞きますよね。
アジャイルとDXはイメージつくのですが、モダン化が全然イメージ出来ない。。

モダン化ってつまりどういうことよ。。最新のFramework使ってるし既にモダン開発してるよね？と思っていたのですが、どうやらそういうことではないらしいです。
IBMが出している [IBM Application Modernization](https://www.ibm.com/cloud/garage/files/app-modernization-field-guide.pdf)というガイドでアプリモダン化のOverViewを勉強したのでまとめます。

## アプリモダン化って何が嬉しいの？
アプリをモダン化すると・・・

1. **デジタルトランスフォーメーションを加速させる！**<br>
アプリのモダン化は、新しい価値を生み出し素早く届けていこう、そのためにはビジネスをITで変えていかないと・・という背景から進んでいる。つまり、結果的にDXのスピードを高めることに繋がる。
2. **デベロッパーエクスペリエンスを変える！**<br>
コンテナ化とクラウドネーティブへの対応により、すばやくアプリ/サービスを開発することが可能になる。
3. **デリバリー速度を高める！**<br>
結果的に素早いデリバリーが実現される・・。


## モダン化のススメ方
もちろん最初は既存アプリの評価や、優先順位づけ等の作業から始まるのですが、この辺はとばします。
具体的にモダン化とは既存のアプリをどう変えていくのかってとこだけみていきます。
ざっと読んだところ、大きく５つのステップがあるようです。

1. モダン化の基盤を創る
2. 開発体験をモダン化する
3. コンテナ化
4. API化、統合
5. マイクロサービス
6. リファクタリング

順に概要を見ていきます。

## 1. モダン化の基盤を創る#
***Kubernetesなどのコンテナプラットフォームがアプリモダン化の基盤となります。***

コンテナオーケストレーションはモダン化のファーストステップ。
復元性とセキュリティーを持った協力な基盤が不可欠です。



## 2. 開発体験をモダン化する

***開発者に、すばやく、賢く、エンドtoエンドの開発体験を。***

**コンテナ化されたデプロイメント**
アプリのデプロイは軽量なコンテナで行う。
Cloud上でも、Local環境でも簡単に開発環境を再現することが出来ることが重要。

**素早いイテレーション**
開発フェーズに関わらず、常にリアルタイムでパフォーマンスを観察しながら、修正〜デプロイをすばやく行おう。
＃イテレーション: 開発のサイクルのこと

**DevOpsパイプラインを作ろう**
自分たちにあったDevOpsパイプラインをつくる。

## 3. コンテナ化
***アプリをDockerイメージに・・・次は？***

アプリケーションをDockerImageにするのがコンテナ化、ひいてはモダン化への道ですが、多くのアプリケーションはコンテナ向けに最適化されていません。
コンテナ向けに設計されたアプリとそうでないものだと、ロードバランシング、アプリの状態管理、モニタリング方法が大きく異なります。
結果的に、アプリの一部を改修する必要がでてきます。

ここは避けられないステップぽいですね。
(コンテナ向けに最適化されたアプリはなんぞや、というのを勉強したい。)


##5. API化、統合##
***既存のシステムから、ビジネスの価値を解放させよう。***

既存のアプリをAPI化。
API化することで再利用可能なアセットへと進化し、新しい価値を生み出すことが可能。

これはイメージしやすいが、API化するとセキュリティーとか大変そう。。
一応ガイドには以下の文言が。。（具体的な内容は書いてない。）

- 管理<br>
セキュリティー/パフォーマンス/可視性を高めるため、APIを管理下におく。

 ⇒IBMの**API Connect**とか、Azureの**API Management**とかも触ってみたい。

## 6. リファクタリング
***賢く、モダン化***

リファクタリングはメンテナンスが大変なコードを、より良いコードに改良することです。
**- 生産性**
アプリをマイクロサービスにすることで開発の生産性を向上し、素早いリリースを実現します。
細かい単位で実装していくので、完成した部分からリリースすることが可能です。

⇒これは機能単位でアジャイル開発していこう。ってことかな。

**- 拡張性**
拡張性のあるアーキテクチャーへのリファクタリングは、少しずつ完了していくべきです。
オペレーション効率を高めると同時に、ビジネスとしての価値を与えることが重要

⇒モダン化したいシステムの規模にもよるだろうけど、無理だと思わず出来るところから少しずつ進めようってことかな。

**- コンテナ**
まずはモノリシックなシステムをLibertyとともにコンテナ化します。
その後で、ビジネス単位でマイクロサービス化したソリューションをコンテナに追加していきます。

⇒追加していけるように、基盤部分を取り急ぎコンテナ化しようってことかな。


## まとめ
アプリモダン化といえばマイクロサービスとコンテナ化なのかなと思いました。
そもそもモダンの意味は、
>現代的であること。今風でしゃれていること。また、そのさま。

らしいので、今ホットなTechを使ってしゃれてたらいいのかと思います。
モダン開発、よりモダン化！のが断然大変そうですね。。
別アカウントのS3バケットからオブジェクトをダウンロードする

# やりたいこと
別アカウントS3バケットのオブジェクトに対し、
自アカウントのECSコンテナからデータのGETを行いたい

## 概要図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/4f50c2aa-6513-37f6-e7c3-1b2ad3ef097e.png)


## バケットポリシー
```json:src
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow to download from Other AWS Account Role",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:userid": "<ロールID>"
                }
            }
        }
    ]
}
```

# 以上です
【openFrameworks】チャンネル1でマイク入力するときの注意点

openFrameworksでのマイク入力でハマったことを、忘れないようにメモします。

## マイク入力で詰まったこと
oFのexampleにある`audioInputExample`を開いてビルド＆ランしても、全く反応しません。無反応です…。

原因はsetup関数内の初期設定にあります。こちらのコードをご覧ください。

```ofApp.h
settings.setInListener(this);
settings.sampleRate = 44100;
settings.numOutputChannels = 0;
settings.numInputChannels = 2;
settings.bufferSize = bufferSize;
soundStream.setup(settings);
```

`settings.numInputChannels`が`2`になっています。一方で自分のPCで入力を確認すると、`入力１`になっていたんです。
(確認方法はmacの場合、Audio Midi設定を開くことです)
<img width="629" alt="スクリーンショット_2019-04-24_17_35_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314351/a6ca2b02-3e07-b8f4-25d0-db2c8bcc0b7d.png">

`settings.numInputChannels=1'にすればできる…！！！

そう思って、コードを書き換えるものの、明らかに挙動が狂ってます…何かがおかしいのです…。
<img width="968" alt="スクリーンショット_2019-04-24_17_42_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314351/2c0d6675-d855-7054-3bbb-5fcb2c266de3.png">

## 原因は音声入力の処理だった！
原因は`settings.numInputChannels = 2`に合わせた処理が原因でした。

```ofApp.h

void ofApp::audioIn(ofSoundBuffer & input){
	
	float curVol = 0.0;
	int numCounted = 0;	

	for (size_t i = 0; i < input.getNumFrames(); i++){
        
        left[i]        = input[i*2]*0.5;
        right[i]    = input[i*2+1]*0.5;
        
		curVol += left[i] * left[i];
		curVol += right[i] * right[i];
		numCounted+=2;
	}
	
	curVol /= (float)numCounted;
	curVol = sqrt( curVol );
	
	smoothedVol *= 0.93;
	smoothedVol += 0.07 * curVol;
	
	bufferCounter++;

}
```

ここでのleft, rightの配列は入力チャンネルが２つだからこそ、実装できる処理になります。今回は入力１なので、ここの処理を以下のように変更する必要があります。

```ofApp.h

void ofApp::audioIn(ofSoundBuffer & input){
	
	float curVol = 0.0;
	int numCounted = 0;	

	for (size_t i = 0; i < input.getNumFrames(); i++){

        /////////
        //変更箇所
        /////////
        left[i]        = input[i]*0.5;
		curVol += left[i] * left[i];
		numCounted++;
        //////
	}
	
	curVol /= (float)numCounted;
	curVol = sqrt( curVol );
	
	smoothedVol *= 0.93;
	smoothedVol += 0.07 * curVol;
	
	bufferCounter++;
}
```

すると、処理が思ったような動きになってるはずです！
![mg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314351/02bc175b-d455-7bf9-22f7-6c3d1d9cd406.gif)

##　最後に
PCによっては、マイク入力が初期から`2`になっており、サンプルのように動かせば問題ありません。

ただ私のように一部のPCは、マイク入力が`1`のまま固定され、入力2に変更できない可能性があります。

そういう場合は、上記のやり方をお試し頂ければ幸いです！
twitter widget の横幅が mobile safari でバグるのを js で直す

#  結論
```javascript
window.twttr = {_e: [
  (t)=>{
    t.events.bind(
      'rendered',
      (e)=> e.target.style.width=`${e.target.parentElement.clientWidth}px`
    );
  }
]}

```

# 経緯
mobile safari が iframe の width 指定をうまく処理できないバグらしい。
回避するために、無意味なCSS指定を追加するといいらしいのだが、どうも私の手元ではうまくいかなかった。まったく同じコードなのにリロードするたびに結果が変わる (多分同時に貼ってる別のウィジェットとの順序とかの影響) ので強引に Javascript で直すことにした。

twitter widget は公式に完了イベントを補足できるように作られている。これを利用するにはまず既存の widgets.js 読み出しを以下のコードに書き換え、

```javascript
  window.twttr = (function (d,s,id) {
    var t, js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;
    js.src="//platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs);
    return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });
  }(document, "script", "twitter-wjs"));
```
さらに、以下のようにしてイベントハンドラを登録する。

```javascript
twttr.ready(function (t) {
  t.events.bind("rendered", function (event) {
    event.target.style.width = "100px"
  });
});
```
というようなことが https://developer.twitter.com/en/docs/twitter-for-websites/javascript-api/guides/javascript-api に書いてある。
ところでこの twttr.ready って何？と思うまでもなく、 twttr._e に配列をセットして関数を詰めておけばいいということは容易にわかる。どうせ1つしか関数登録しないし、ready関数いらんよな、ということで冒頭のコードになる。 widgets.js は script タグで普通に読み込めばOK.
LINE botのリッチメニューの初期表示を設定したい

# LINE botのリッチメニューの初期表示

LINE@ では無くAPIで作成したリッチメニューをデフォルトで表示したりしなかったりするには

リッチメニュー作成時のオプションの`selected`を`true`or`false`で設定できます。

[LINE developer using-rich-menus](https://developers.line.biz/ja/docs/messaging-api/using-rich-menus/#create-a-rich-menu)
↑元の例は上記リンクより

```php
curl -v -X POST https://api.line.me/v2/bot/richmenu \
  -H 'Authorization: Bearer {channel access token}' \
  -H 'Content-Type:application/json' \
  -d \
  '{
    "size":{
        "width":2500,
        "height":1686
    },
    "selected":false, // true（初期表示）, false（初期非表示）
    "name":"Controller",
    "chatBarText":"Controller",
    "areas":[
        {
          "bounds":{
              "x":551,
              "y":325,
              "width":321,
              "height":321
          },
// .....etc
```

## 参考資料
[LINE Messaging APIからリッチメニュー画像サイズを変更する](https://dev.classmethod.jp/etc/line-messaging-api-rich-menu-tutorial/)
springdatajpa

[springdatajpa]
https://www.slideshare.net/masatoshitada7/spring-data-jpa-jsug

https://dev.classmethod.jp/server-side/java/spring-data-jpa_search/

blog.enjoyxstudy.com/entry/2016/12/26/000000

https://www.javainterviewpoint.com/spring-data-jpa-many-to-many/

[twitterクローン実装]
https://web-dev.hatenablog.com/entry/spring-boot/dev-web-app/check
7zip > CPUスレッド数 4/8 >6つのスレッドの負荷が高い

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1809
7zip 18.05(x64)
Intel Core i7-6700 CPU @ 3.40GHz
```

### 設定

- CPUスレッド数 4/8
- バックグラウンド処理

### CPUの負荷

![bfb0e83b2aec8c75.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/ad0e4907-e9ef-0484-bf50-a65bb8e91acf.png)

4スレッドの処理としたのではあるが、6つ?のスレッドの負荷が高い。

思ったような振舞いではない。

2スレッドくらいにしておかないと、同じ環境で動かすVMWareのゲストOSなどのパフォーマンスが落ちそうである。
Android4系でClassNotFoundExceptionが発生して起動できない件

# 前提
- cocos2d-x 2系
- Android４系で動作するもの
- antからgradleに移行した際に発生
    - ビルド自体はできている
    - Android5系以上は特に問題なく動作
    - 結論Multidex周りの問題であったが、build.gradleの記載やAndroidManifestの記載は問題なかった
- build.gradleにて、以下の値でビルドするとAndroid4系でも動作した
    - debuggable = false
    - minifyEnabled = true  
（minifyEnabledの指定により、未使用メソッドが削除されてdexファイルが1つに収まっている可能性があるとのこと）　＠2019/4/25コメント反映
    - proguardの指定あり

# 問題
何故かAndroid4系だけ、class自体は存在しているにも関わらず、以下のようにClassNotFoundExceptionが発生して起動直後にcrashする事象が発生した。

```
java.lang.ClassNotFoundException: Didn't find class "xxx" on path: /data/app/xxx.apk
```

# 解決方法
Applicationを継承しているクラスのOnCreateに、以下のようにMultiDexをインストールするように明記。
（Multidexの対応が不足していた）

```java:XXXApplication.java

public class XXXApplication extends Application
{
    ~
    @Override
    public void onCreate()
    {
        MultiDex.install(this);    // ★ここ追記
        super.onCreate();
    }
    ~
}
```

対応済のものは以下であったが、上記と合わせて対応したことで問題なく動作した。

```build.gradle
android {
    ~
    defaultConfig {
        multiDexEnabled true
    }

    dexOptions {
        javaMaxHeapSize "16g"
    }
    ~
}
dependencies {
    ~
    implementation 'com.android.support:multidex:1.0.3'
    ~
}
```

# Multidexって？
1dexファイルに対して、メソッドの総数が65,536(64K)の制限があり（ビルドエラーになる）、アプリの規模が大きくなっているこのご時世、余裕で超える状況が多々ある。
ただ、複数のdexファイルに分ければ制限を回避することができるができるので、分けても動作する仕組みとしてMultidexがあるという理解。

# 参考資料
- [64K を超えるメソッドを使用するアプリの設定](https://developer.android.com/studio/build/multidex?hl=ja)
- [java.lang.ClassNotFoundException for android 4.1.2](https://stackoverflow.com/questions/41531460/java-lang-classnotfoundexception-for-android-4-1-2)
- [Caused by: java.lang.ClassNotFoundException - multidex not work properly
](https://stackoverflow.com/questions/47700670/caused-by-java-lang-classnotfoundexception-multidex-not-work-properly)
特定のブランチでだけリモート名を省略した git push コマンドを禁止する

## 状況

リモート名とブランチ名を省略した `git push` コマンドは、（git config の `push.default` 設定によるが）適切なリモートとブランチを補ってプッシュを実行する。たとえば upstream が origin/foo ブランチに設定された foo ブランチで `git push` を実行すると origin/foo にプッシュする。

この挙動を特定のブランチでだけ禁止したい。具体的には、誤操作を防ぐために master ブランチでだけ `git push` を禁止して、明示的な `git push origin master` だけを許可したい。

## 解法

リモート名を省略した場合に補われるリモートを存在しない名前にすればよい。 `branch.<name>.pushRemote` を以下のように設定する。

```
git config branch.master.pushRemote 'dont-push-master!!!'
```

`git push` すると存在しないリモートにプッシュしようとして期待通りエラーになる。

![スクリーンショット 2019-04-24 17.03.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/735/4472933a-6a91-257a-5b65-a1c3f34cb656.png)
odomフレームの解説

# ROSの自己位置推定の/odomの意味

## 概要

みなさんROSのamclパッケージで自己位置推定したことありますか?
自己位置推定すると大体

```
/map -> /odom -> /base_footprint(ロボットの現在位置)
```
という構成でtf treeが構築されると思います。
今回このうち`/odom`フレームってなんだ?って度々疑問を覚えたのでそのメモ兼解説をします。

> ここで言及する**自己位置推定**とは周辺の環境地図がすでに作成されている状態で環境地図内におけるロボットの現在位置を推定する行為を言います。マップを作成しながら自己位置を同時に推定するSLAMとは少し違うので注意してください。

## Odometryについて

自己位置推定は本来LaserScanが無くても実行可能です。そのやり方はIMUから得られる(角)加速度を2回積分すれば現在位置になります。簡単ですね!
この方法で取得する現在位置を**Odometry**といい、amclにおいてOdometryの示す位置は`/odom`座標系に存在することになっています。`nav_msgs/Odometry`のメッセージ型には位置の他に速度と推定値の共分散が含まれます。
この処理を実装すると

```
/odom -> /base_footprint
```
の関係性が構築されます。`/odom`フレームとは`/base_footprint`フレームの位置を決める上での原点であり、Odometry値の基準だから`/odom`という名前になっているわけです。

ただしこの方法は目を瞑ったまま歩いていることと同じなので、環境地図の存在する`/map`座標系と連携する方法がありません。そこで`/map`と`/odom`のギャップを埋める方法として`amcl`パッケージが提供するパーティクルフィルターを用います。
ここまでの操作でやっと

```
/map -> /odom -> /base_footprint
```
の関係が構築されるわけです。

シミュレータ環境においてSLAMを実行した場合Odometryの計測誤差は基本0であるはずなので、`/map`と`/odom`は大体同じ位置に存在します。理想的な環境だからこその挙動です。
逆に実環境ではセンサーに乗るノイズが大きいので`/odom`フレームが若干揺れ動くはずです。そうでないなら自己位置推定のシステムが間違っているか、とてもすごい自己位置推定システムで誤差が全く存在しないかのどちらかです。

## IMUを使わない自己位置推定について

世の中にはIMUを搭載していなくても自己位置推定する不思議なデバイス(ZED stereolabs等)が沢山存在します。
自己位置推定の基本原理は上記の通りで、違う点は取得する画像やPointCloudからフレーム間の移動距離を求めている点です。フレーム間の移動距離を常に求めてその値を積算していけば同じようにOdometryとして利用可能です。
このやり方はIMUが必要無いというメリットがありますが計算コストがとても高いのでリアルタイムで動かすことが辛いです。移動距離の計算アルゴリズムを最適化する、GPU等のハードウェアの暴力を利用するといった手法を取らなければなりません。
HTC Vive等のVRヘッドセットはカメラ+IMU+外部センサーという構成で自己位置推定を行っています。
IMUは誤差が積算する欠点を大きく上回って毎フレームの計算リソースが少なくて済むという利点があるため、IMUで取れるOdometry値を補正するというやり方が多いです。自己位置推定をするシステムをハードから自作する場合できるだけIMUは搭載してあげてください。

## まとめ

1. 現在位置`base_link`はIMUの情報を元に計算される。この値はOdometryという意味を持つので基準フレーム名に`/odom`という名前を用いている。
2. LaserScan等のセンサーから得られる周辺情報を元にOdometryを補正する。その補正値は`/map`→`/odom`への変換であり、`/odom`以下の座標系全体に影響を及ぼす。理想的な環境ではノイズが乗らないので`/map`→`/odom`の変換値は0になる。
ES6の新機能 [随時更新予定]






①　テンプレートリテラル


テンプレートリテラルを使うことで正しく早くコードを書くことができるようになりました。




```js

let firstName = 'John';
let lastName = 'Smith';
const yearOfBirth = 1990;

function calcAge(year) {
    return 2016 - year;
}


// ES5
console.log('this is ' + firstName + ' ' + lastName + '. He was born in ' + yearOfBirth + ' . Today, he is' + calcAge(yearOfBirth) + 'years old.');


// ES6 ( テンプレートリテラル ) 
console.log(`this is ${firstName} ${lastName}. He was born in ${yearOfBirth}. Today he is ${calcAge(yearOfBirth)} years old.     `);
```

②　文字列で追加された新しいメソッド

```js

let firstName = 'John';
let lastName = 'Smith';
const yearOfBirth = 1990;

function calcAge(year) {
    return 2016 - year;
}

// ES5
console.log('this is ' + firstName + ' ' + lastName + '. He was born in ' + yearOfBirth + ' . Today, he is' + calcAge(yearOfBirth) + 'years old.');

// ES6 ( テンプレートリテラル ) 
console.log(`this is ${firstName} ${lastName}. He was born in ${yearOfBirth}. Today he is ${calcAge(yearOfBirth)} years old. `);


// 新しく加わった文字列のメソッド
const n = `${firstName} ${lastName}`;
console.log(n.startsWith('j'));
console.log(n.endsWith('Sm'));
console.log(n.includes('oh'));
console.log('${firstName}',repeat(5));
```

出力結果


<img width="702" alt="スクリーンショット 2019-04-24 17.26.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311533/b96fc92a-09e7-4dc6-cd25-337a6b900e75.png">





③アロー関数

3つの方法があります。


1, 最初は1つの引数と1行のコードが置かれ最も簡単な形式。
2,別の引数を追加するとかっこを使用すること
3,複数のコード行を追加すると末尾に中括弧とreturnキーワードを使用する必要があること。



例文
私たちは2つの出生年の配列を持っており、これらの年のそれぞれの年齢を計算する


```js


const years = [1990, 1965, 1982, 1937];

// ES5
var age5 = years.map(function(el) {
    return 2016 - el;
});
console.log(ages5);

// ES6
const ages6 = years.map(el => 2016 - el);
console.log(ages6);

```


出力結果

ES6で追加されたアロー関数を使うと少ない行で綺麗にコードが書けるようになります。

<img width="700" alt="スクリーンショット 2019-04-24 17.51.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311533/250729e9-fad9-9def-82bd-7d49867e1415.png">






## 引数が2つ以上ある場合は、実際にかっこを指定する必要がある。その例を書いてみます。

```js


const years = [1990, 1965, 1982, 1937];

// ES6
let ages6 = years.map(el => 2016 - el);
console.log(ages6);

ages6 = years.map((el, index) => `Age element ${index + 1}: ${2016 - el}. `);
console.log(ages6);





```







#### 勉強になる記事

(https://qiita.com/raccy/items/487e62a253d65cc9fee6)[本当にvarは駄目な子なのか？]

(JavaScript初級者のためのコーディングガイド)[https://qiita.com/raccy/items/bf590d3c10c3f1a2846b#_reference-910e146d28f2c4d8f5f5]
フーリエ変換

# はじめに

簡単に言うと、ある波形データにどの周波数成分がどのくらいあるのかを解析するための手法で、
総当たりで調べる離散フーリエ変換と、高速に計算するための高速フーリエ変換がある。

## 離散フーリエ変換

```C#
public static Complex[] DFT(Complex[] input)
{
	int fs = 1800; // サンプリング周波数

	var output = new Complex[input.Length];
	for (int i = 0; i < input.Length; i++)
	{
		double re = 0, im = 0;
		for (int j = 0; j < input.Length; j++)
		{
			re += input[j].Real * Math.Cos(2 * Math.PI * i * j / fs);
			im += input[j].Real * -(Math.Sin(2 * Math.PI * i * j / fs));
		}
		output[i] = new Complex(re, im);
	}
	return output;
}
```

## 高速フーリエ変換

```C#
public static Complex[] FFT(Complex[] input, int bitSize)
{
	var dataSize = 1 << bitSize;
	var reverseBitArray = BitScrollArray(dataSize);

	var output = new Complex[dataSize];
	for (int i = 0; i < dataSize; i++)
	{
		// バタフライ演算のための置き換え
		output[i] = input[reverseBitArray[i]];
	}

	// バタフライ演算
	for (int stage = 1; stage <= bitSize; stage++)
	{
		var butterflyDistance = 1 << stage;
		var numType = butterflyDistance >> 1;
		var butterflySize = butterflyDistance >> 1;

		var w = Complex.One;
		var u = new Complex(Math.Cos(Math.PI / butterflySize), -Math.Sin(Math.PI / butterflySize));

		for (int type = 0; type < numType; type++)
		{
			for (int j = type; j < dataSize; j += butterflyDistance)
			{
				int jp = j + butterflySize;
				var temp = output[jp] * w;
				output[jp] -= temp;
				output[j] += temp;
			}
			w *= u;
		}
	}

	return output;
}

// ビットを左右反転した配列を返す
private static int[] BitScrollArray(int arraySize)
{
	var result = new int[arraySize];
	var halfSize = arraySize >> 1;

	result[0] = 0;
	for (int i = 1; i < arraySize; i <<= 1)
	{
		for (int j = 0; j < i; j++) result[j + i] = result[j] + halfSize;
		halfSize >>= 1;
	}
	return result;
}
```

### 窓関数

#### 矩形窓
MAMPでWebサーバー構築するまで(備忘録)

# MAMPとは
Macintosh, Apache, MySQL, PHPの略らしい。
簡単にウェブサーバー構築できるアプリケーションだという理解。まあ確かに自分でやるとApacheとかPHPとかそれぞれ調べてインストールして設定して面倒だしなあ…。

別々にインストールするよりもまとめてやった方がバージョンの違いとかで齟齬がないような気がしたので使ってみた。簡単だと思ったら意外につまづいたのでほぼ自分用備忘録です。あしからず。

環境
Mac OS Mojave 10.14.1
MAMP Version 5.3 (367)

# インストールする
公式サイトからダウンロードしよう。
https://www.mamp.info/en/

インストーラがダウンロードできたら指示に従ってぽちぽちやったらインストール完了する。
大したことはないのであんまり詳しくは書かない。

# 設定する
これもいろんな人がわかりやすく書いてるからそんな説明しない。
このへんが参考になる。
https://qiita.com/kuro-wassan/items/1cb32995acc07a4b4cc6
筆者は複数サーバーを構築したかったのでこれも。
https://qiita.com/tsukishimaao/items/cab4caa065d901608856

# ポート番号について
ポート番号はデフォルトで、Apache:8888 Nginx:8888 MySQL:8889
<img width="528" alt="スクリーンショット 2019-04-24 16.06.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404657/5a6eb208-95c8-ffeb-1861-bb7eb0d38757.png">

Set Web & ~のボタンを押すと、Apache:80 Nginx:80 MySQL:3336
<img width="526" alt="スクリーンショット 2019-04-24 16.06.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404657/9717239f-286c-8d49-9001-676d83c92694.png">
多くのサイトではこちらの設定を適用することを推奨されている。
作ったサイトを表示するときのURLが上なら http://localhost:8888 、下なら http://localhost になるというくらいの違いしか今の所認識していない。
とりあえず指示に従って80の方にしてたらあとあとうまくいかなかったので後述します。

先に言うと、最終的にうまくいったのは、Apache:80 Nginx:7888 MySQL:3336でした。
<img width="528" alt="スクリーンショット 2019-04-24 16.06.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404657/b2a881dd-bf4c-bcf9-2aa9-815a8eb075b3.png">

# apache起動しない問題
上記参照記事にしたがって設定してたら最初はうまくいったけどなぜか途中からApacheのみが起動しなくなった。(MySQLとCloudは起動する)
Start Serversボタンで起動しようとしたら、Apache couldn't be started. Please check your MAMP installation and configuration. というエラーを吐いてそれ以上の情報をくださらないので参った。
のでとりあえずエラー文をコピペしてググる。
## 段階 1
原因として考えられるのはMAMP内のapacheではなくMac標準のapacheとポート番号が競合しているという可能性。80番ポートを使用しているものが他にあるか確認するコマンドが以下。

```
netstat -an | grep *.80
```

なにかプロセスがあれば

```
kill <プロセス番号>
```
でキル。もしくはアクティビティモニタを起動してhttpdで検索、該当プロセスをキル。
で、動くはずなんだけどなぜか動かなかったのでさらにいろいろやってたら8888番ポートに戻せば起動できた。

## 段階 2
8888番ポートに戻したら戻しっぱなしではなくいろいろ設定を変更しなきゃならんらしい。
apache自体の設定は/Applications/MAMP/conf/apache/httpd.confにある。が、これはMAMPの設定(Preferences)をいじったら勝手にポート番号も変更してくれるのでいじらなくて大丈夫。(便利！)
問題はバーチャルホストの設定ファイル/Applications/MAMP/conf/apache/extra/httpd-vhosts.confである。こちらは手作業で変更しなきゃなのでポート番号変更したら忘れずにこっちも変更。

```httpd-vhosts.conf
NameVirtualHost *:80
```
を

```httpd-vhosts.conf
NameVirtualHost *:8888
```
に変更。さらに、

```httpd-vhosts.conf
<VirtualHost *:80>
```
を

```httpd-vhosts.conf
<VirtualHost *:8888>
```
に変更。
これでうまくいくはず！がうまくいかなかった…。

## 段階 3
いろいろ調べていたらApacheとNginxのポート番号は違う方がいいとのことだった。ちなみにMAMPでは同時に起動することはできないらしい。いろいろなサイトでなぜかNginxのポート番号を7888にするといいと書いてあったので7888にしてみた。紆余曲折あって一瞬このポート番号でうまくいったのですが結局起動できなくなったので段階4に続く。
最終的に7888じゃなくても起動するような気はするけどこれでうまくいっているのでそのままにしている。

## 段階 4
結論から言うと凡ミスでした。のでここは読まなくていいです。
httpd.confの設定をいじるときに、コメントアウトしてはいけない所までコメントアウトしていたらしい。しょーもない。
なので段階1だけで解決する人は解決すると思います。わざわざ8888番ポートに変えなくてもいいけどMac標準のApacheもそれはそれで使いたいひととかは変えてもいいんじゃないかなと思いました。

# 終わりに
しょうもない凡ミスが原因ではあったけど回り道して得たものもあるし結果オーライだったと思う。我々を悩ますエラーの多くはなんてことないタイプミスとかそんなんだと思います。タイピングは丁寧にやりましょう。
ここまででやっとウェブサーバー構築できたのでこれからいろいろ試してみたい。また発見があったら記事にできたらいいなあ。


Qiita初投稿なので至らない点があっても温かい目で見守ってもらえると幸いです。


(2019/10/10追記)
タイプミスがどうこうとか言っておきながらめちゃくちゃ誤字あったのので訂正しました。恥ずかし…。
pythonのフレームワークpyramidでSQLAlchemyを使ってHello World!!

# pyramidフレームワーク

DBのORマッパーであるSQLAlchemyを使用したHelloWorldの例です

## python3の仮想環境

```
python3 -m venv env3
source env3/bin/activate
```

## pipのアップグレード

```
pip install --upgrade pip
```

## ライブラリのインストール
```
pip install pyramid
```

## 使用できるテンプレート

```
Available scaffolds:
  alchemy:  Pyramid project using SQLAlchemy, SQLite, URL dispatch, and Jinja2
  starter:  Pyramid starter project using URL dispatch and Jinja2
  zodb:     Pyramid project using ZODB, traversal, and Chameleon
```

## プロジェクト作成の雛形を確認

```
pcreate --list-templates
```

## プロジェクトの作成
通常のプロジェクト

```
pcreate -t alchemy hello
```


## プロジェクトのインストール

```
cd hello
pip install -e .
```

## DBのスキーマ生成

```
cd hello
initialize_hello_db development.ini
```

## 起動

```
pserve development.ini
```

## 起動確認

![スクリーンショット 2019-04-24 16.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/dccc2336-f9ce-ed60-ec01-bd032baf661c.png)
【Java】packageとimportによる複数ファイルでの開発

まとめるほどもない気もするが…
#複数のファイルでの開発#
複数のファイルで開発を行う場合、**import文**で他のファイルのクラスを使うことができる。クラスが増えてくると、**パッケージ**でまとめる。

 - `import`：パッケージとクラスを指定して読み込む。`package`の次に記述する。
 - `package`：文頭に記述する。パッケージを指定する。

ここでは`test.main`と`test.sub`という二つのパッケージにそれぞれ`Main`クラスと`Sub`クラスを入れている。

```Main.java
package test.main;

import test.sub.Sub;

public class Main{
	public static void main(String[] args){
		Sub.hello();
	}
}

```

```Sub.java
package test.sub;

public class Sub{
	public static void hello(){
		System.out.println("Hello World!");
	}
}
```

`Main.java`で`Sub.hello()`を詳しく書くと`test.sub.Sub.hello()`。これを`import`で略しているという認識。

フォルダの構成は
<img width="618" alt="スクリーンショット 2019-04-24 15.49.31 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391872/8988c859-6780-f192-406f-42e677d47a56.png">
という感じ。

カレントディレクトリを`cd`というフォルダにして

```
java test.main.Main
```
と打つことで`Main`クラスを使うことができる。

作業ファイルがカレントディレクトリになくともクラスパスを`java`コマンド時に指定するか、あらかじめOSに登録しておくかすれば、あとはクラスローダーがやってくれる。


#API#
Javaにあらかじめ添付されている多数のクラス群を**API (Application Programming Interface)**という。
(別にjava以外のところでも言うけど)
代表的なところでは

- `java.lang`：Javaに欠かせないクラス群。
- `java.util`：プログラミングを便利にする。
- `java.math`：数学関係。
- `java.net`：ネットワーク通信関係
- `java.io`：ファイルの読み書きなど、データの逐次処理に関わる。

使う時は

```java
// 例１
int r = new java.util.Random().nextInt(1);

// 例２
Thread.sleep(3000);
```
という書き方。これは、

 - 例１
    - パッケージ：`java.util`
    - クラス；`Random`
    - メソッド：`nextInt`
 - 例２
    - パッケージ：`java.lang`
    - クラス：`Thread`
    - メソッド：`sleep`


こんな風に認識しても良い。
`Thread`という部分を略さずに書くと`java.lang.Thread`になる。
`java.lang`というパッケージは頻出なので略して書ける。
なお、`nextInt(1)`は0〜1の乱数発生、`sleep(3000)`はプログラムの3秒停止というメソッド。

#参考書籍#
[スッキリわかるJava入門第２版]
(https://www.amazon.co.jp/dp/B00MIM1KFC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
6章 Pp.222-259
python3.Xのファイルをpyinstallerで実行ファイル化(.exe化)したらめっちゃ再帰した

# はじめに
pythonファイルを実行ファイル(exe化)にしたい！
そんなあなたのための記事です．

## 環境
OS：windows 10 Education
pythonバージョン：python3.6.5(anaconda)

## やること

やることはざっとこんな感じです．
1. pyinstallerのインストール
2. 実行
3. .specの書き換え
4. .specでビルド
5. ディレクトリの作成
6. コピー
7. .specでリビルド

## 起きること
### めっちゃ再帰する  

```console
maximum recursion depth exceeded while calling a Python object
```

というエラー文が出ます．
出なければ何も問題はありません(たぶん)．

### PyQt5がない

```console
Cannot find existing PyQt5 plgin directories Paths checked: ディレクトリパス
```

というエラー文が出ます．
でなければ何も問題はありません(たぶん)．

# 解決策

やることの詳細を交えて，問題の解決策を書いていきます．

### めっちゃ再帰する

この2つの記事を参考にしました．
[参考1](https://qiita.com/narupo/items/e25ac05a9065c0bd9c03)・[参考2](https://stackoverflow.com/questions/38977929/pyinstaller-creating-exe-runtimeerror-maximum-recursion-depth-exceeded-while-ca)

1. [pyinstallerのインストール](https://techacademy.jp/magazine/18963)

```console
pip install pyinstaller
```
だけです

2. 実行

```console
pyinstaller pyファイル名 --onefile --noconsole
```

　※--onefile：パッケージを丸っと1つのファイルにする，与えないとどうなるかやってないからわからない
　※--noconsole：実行時にコンソール画面を出さない，与えないとコンソールの黒い画面が出てきます．
　　プログラムからの出力としてコンソール出力を想定しているなら，与えないほうが良いです．
　これは実行すると【めっちゃ再帰するね】というエラーが出ます．
　そこで次の2つです．

　3. .specの書き換え
　2.の手順でpyファイル名.specが生成されていますのでそれを開きます．
　一番上に`# -*- mode: python -*-`とあります．
　二行目，三行目に次の二行を足します．

```python
import sys
sys.setrecursionlimit(10000)
```

　4. .specでビルド

```console
pyinstaller pyファイル名.spec
```
　**※ビルドするのは.specファイルです．**

### PyQt5がない

後半は[この記事](https://qiita.com/tatsuruM/items/cd657f25022c93d0284f)を参考にしました．  
5. ディレクトリの作成
　4.で【PyQt5がないからディレクトリパスを確認しろ】と出たら確認してみましょう．
　本当にありません．
　なければ作るまでです．
　指定されたと通りにフォルダを作成していきます．  
6. コピー
　中身がないと困りますので，コピーします．
　anacondaのライブラリからプラグインを持ってきます．
　`Anaconda3\**\Library\plugins`に必要なファイルたちがいそうです．
　※`\**\`の部分は人やバージョンによって違うかもしれません．
　自分の場合`C:\Users\ユーザ名\Anaconda3\Library\plugins`のファイルを
　`C:\qt64\qt_1544645195969\_h_env\Library\plugins`に持ってきました．  
7. .specでリビルド
　これでうまく行くはずです．リビルドしてみましょう．

```console
pyinstaller pyファイル名.spec
```
　**※ビルドするのは.specファイルです．**
　コンソールに

```console
Building EXE from EXE-00.toc completed  successfully
```
的な出力が出れば完了です．


# おわりに

参考にした記事の作者の皆様，ありがとうございました．
両方をまとめた記事がなかったので，備忘録も兼ねて書いてみました．
誰かが救われればと思います．

# おわらない

生成したexeファイルを他のPCで動かすと．．．

<b>動かない</b>

というトラブルが発生しました．

そこはQiitaさん．
ソリューションはちゃんとありました笑
[ここです！本当にありがとう](https://qiita.com/napinoco/items/068ce8ef6ef4309966b1)

## 原因
1．Intel MKLが悪さをしている
2．Pandasが悪さをしている

## 対処法
1.anacondaの仮想環境作成時にライブラリを指定
2．pyinstaller走らせる時にコマンドを追加する

[ここの解決方法その2](https://qiita.com/napinoco/items/068ce8ef6ef4309966b1)に書いてあります．
Quantxでのprintデバッグを便利にしてみる

こんにちは、イナズマです。今日は[Quantx](https://factory.quantx.io/)のアルゴリズム…ではなく、アルゴリズムを作成する際のデバッグを便利にするtipsを紹介していきたいと思います。
初心者の方でもわかるよう、プログラムも軽く解説したいと思います。

# Quantxでのデバッグについて
Quantxではprint関数が使えません。代わりに`ctx.logger.debug()`という関数が提供されています。この関数は引数をログに出力してくれます。この画像の下部の「ログ」という部分に出力されています。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227269/65c4f76e-1877-f2ab-bdb0-03e8e281a784.png)
だいたいprint関数と同じですね。

# ctx.logger.debugの不便なところ
個人的にこの関数にいくつか不便なところを感じたので改善を試みよう、というのが今回の記事です。

## 関数名が長い
`ctx.logger.debug`って長くないですか?printだとたった5文字です!!ということで`prints`という関数を定義してしまいましょう。(`print`という名前でも動くのですが、組み込み関数の方の`print`とかぶってしまうため一応`prints`という名前で定義します)

```py
# prints関数をhandle_signals内で利用する場合はhandle_signals内で定義する。
def handle_signals(ctx, date, current):
    def prints(arg):
        ctx.logger.debug(arg)

    # 下に処理が続く
```

```py
# 使い方
prints(変数名)
```

こうすれば`prints`でログに出力できるようになります。引数は当然、文字列でも数値でも辞書でもなんでも大丈夫です!!

handle_signals内で`prints`関数を使う分にはこれで問題ないのですが、`initialize`関数内で利用する場合は`initialize`関数内でも定義する必要があります。

## 任意の数の引数を渡したい!!
組み込み関数である`print`は、複数の引数を与えた場合、空白で区切って表示してくれます。

### 例

```py
print(1, 'abc', -3.5)
```

### 出力

```
1 abc -3.5
```

`ctx.logger.debug`でも複数の引数を与えたらすべて表示してほしいですよね!ということで任意の数の引数(可変長引数)を受け取れるようにしてみます。定義する場所は、先程と同じところです。

### 定義

```py
# *を使うと可変長引数を受け取れる。引数はtuple型。
def prints(*args):
    for i in args:
        ctx.logger.debug(i)
```

### 使い方

```py
prints(1, 'abc', -4.3) # 任意の個数の引数を与える
```
まんま`print`関数と同じですね。

### 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227269/97fb5687-71f5-0cc5-b21a-87dca9a496a2.png)

(`handle_signals`関数は日ごとに何度も呼び出されるため何度も出力されます。)


#### 余談
余談ですが`ctx.logger.debug`に複数の引数を与えてもなにも出力されません。(されないはずです…)エラーもでません。
なので、`ctx.logger.debug(*args)`のような記述ではうまくいかないはずです。
なにか知ってる人いましたら教えてください。

## 変数ごとに改行が入るのは嫌だ!!
さて、現状の`prints`関数では複数の引数を渡した場合、それぞれが改行されて出力されてしまいます。(上の出力の画像参照)
改行区切りではなく、空白区切りで出力したい方は次のように`prints`関数を書き換えてみましょう!!

```py
def prints(*args):
    # tupleのすべての要素にstr()を適用し、文字列型にする。
    str_args = map(str, args)
    # 文字列型が要素のオブジェクトの要素すべてを空白区切りで連結する。
    s = ' '.join(str_args)
    ctx.logger.debug(s)
```

### 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227269/3b6ab3a5-d710-bfe1-deea-160353fc0203.png)

```py
def prints(*args):
    ctx.logger.debug(' '.join(map(str, args)))
```

やってることは変わってません。最終的には、こんな感じの自作prints関数を僕は使っています。有用に感じたらぜひ使ってみてください!!(ちなみにですが、この関数のデメリットとしてコードが数行長くなることと、日毎に関数を定義し直されるので処理が多少重くなるかも知れないです>_<)
それではまた。
Spark+AI Summit 2019 レポート

#はじめに
サンフランシスコで開催のSpark+AI Summit 2019に参加することができたのでレポートをあげていきます。
![IMG_0255.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/64c565e0-e5eb-6282-d7d8-ba587487c66e.jpeg)
#Spark+AI Summmit 2019
BigData界隈で今をときめくApache Sparkを開発したDatabricks社によるカンファレンス（ざっくり）

[イベントページ](https://databricks.com/sparkaisummit/north-america)
>Welcome to the largest data & machine learning conference in the world. It's a unique experience for developers, data engineers, data scientists, and decision-makers to collaborate at the intersection of data and ML. Attendees will learn about the latest advances in Apache Spark and ML technologies like TensorFlow, MLflow, PyTorch as well as real-world enterprise AI best practices.

#会場の様子

今日は初日で発表はなく、トレーニングのみなので人は少なめかも？
![IMG_0259.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8b617f8e-4a83-17b8-b8f9-b4fb007cab6a.jpeg)

チェックイン後はいい感じのリュックがもらえます。
![MicrosoftTeams-image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/236404dc-fbcd-f3e3-856d-049af62c4ecf.png)



ルーム情報
![MicrosoftTeams-image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/724adf8e-b9d1-3261-99d7-8336721e5c5c.png)

私はMACHINE LEARNING IN PRODUCTION: MLFLOW AND MODEL DEPLOYMENTに参加してきました。
公式の内容は下記
>**MACHINE LEARNING IN PRODUCTION: MLFLOW AND MODEL DEPLOYMENT**
>In this course, data scientists and engineers learn best practices for putting machine-learning models into production. It starts with managing experiments, projects, and models using MLflow, then explores various deployment options, including batch predictions, Spark Streaming, and REST APIs. Finally, it covers monitoring machine-learning models once they have been deployed into production.

*Prerequisites*

- Python (numpy, pandas, sklearn)
- Background in machine learning and data science
- Basic knowledge of Spark DataFrames (recommended)

*Topics Covered Include*

- Course Overview and Setup
- Experiment Tracking
- Packaging ML Projects
- Model Management
- Batch Deployment
- Streaming Deployment
- Deployment REST
- Monitoring

この写真では結構空いていますが、この後ほぼ満席になりました。
![IMG_1199.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d82a880a-2b4a-25d6-8043-34113b7fc2df.jpeg)
途中で講師が会場の参加者に対して、データサイエンティストorデータエンジニア のどちらか, 使用しているクラウドを聞いていましたが、参加者はデータサイエンティストが多く、クラウドはAWSを利用されている方が多い印象でした。



ランチタイムにはご飯も出ます。映えしない盛り方は仕様です。
![IMG_1201.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0c79d725-0d99-09ed-14df-6d04fbeb17ac.jpeg)

VIPラウンジにはちょっとしたお菓子も
![IMG_1208.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/78484b55-9988-fa6c-24c0-71de15c7bd2f.jpeg)

9:00～17:00のトレーニング後は、Meet UPと称して、全体で会食が開催されていましたが、私はMeet UPには参加せず、アジア太平洋地域の参加者としてカクテル＆軽食会に招待いただきました。
かなり恐れ多い気持ちでDatabricks社の方々や他の参加者の方々とお話させていただきましたが、拙い英語にも親切に対応いただいて貴重な時間となりました。


KeyNoteはかなり重要な発表を行うらしく明日も楽しみです。
本日はここまで。

#今後の更新予定


下記のような内容を更新予定です
Spark+AI Day1 MACHINE LEARNING IN PRODUCTION: MLFLOW AND MODEL DEPLOYMENTの内容について
Spark+AI Day2＆Day3 KeyNoteおよびセッションの内容を簡単に


*レポートは私のリスニングスキルに依存するため高度に意訳される場合がございます
PHPでStripeからのWebhooksを受けつける


```composer.json
{
    "require": {
        "stripe/stripe-php": "^6.29"
    }
}
```

```php
<?php
\Stripe\Stripe::setApiKey(getenv('STRIPE_SECRET_KEY'));
\Stripe\Stripe::setClientId(getenv('STRIPE_CLIENT_ID'));

//
// Webhook の署名を確認する
// https://stripe.com/docs/webhooks/signatures#verify-official-libraries
//
$endpoint_secret = 'whsec_...';

$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;

try {
    $event = \Stripe\Webhook::constructEvent(
        $payload, $sig_header, $endpoint_secret
    );
} catch(\UnexpectedValueException $e) {
    // Invalid payload
    http_response_code(400); // PHP 5.4 or greater
    exit();
} catch(\Stripe\Error\SignatureVerification $e) {
    // Invalid signature
    http_response_code(400); // PHP 5.4 or greater
    exit();
}

//
// $eventに対しての処理を行う
//

$event_json = json_decode($payload);

$event_id = $event_json->id;
try {
    $event = \Stripe\Event::retrieve($event_id);
} catch(\Stripe\Error\InvalidRequest $e) {
    // Invalid payload
    http_response_code(400);
    exit();
} catch(\Stripe\Error $e) {
    // Invalid payload
    http_response_code(400);
    exit();
}

if ($event->type == 'customer.created') {
}

if ($event->type == 'customer.subscription.deleted') {
}

if ($event->type == 'customer.subscription.updated') {
}

if ($event->type == 'invoice.payment_succeeded') {
}

http_response_code(200);
```
【Python】SwiftのextensionみたいなことがPythonでやりたい

# はじめに
**この記事は主に Python3 について取り扱っています．Python2 ではお話が変わってくるかもしれません**

みなさんSwiftのextension(拡張メソッド，プロパティなど)ってご存知でしょうか？

まずは以下をご覧ください．

```swift
class Person {
    var name = ""

    init(name: String) {
        self.name = name
    }
}

extension Person {
    func say_hello() {
        print("Hello, my name is " + self.name)
    }
}

var p = Person(name: "Tom")
p.say_hello()
```

出力

```
Hello, my name is Tom
```


このように既存のクラスに対してメソッドとかを直接拡張することができます．
まあこの程度なら最初からPersonにsay_hello()実装すればよくね？って思うわけです．

ところがこんなこともできます．

```Swift
import Foundation

extension String {
    func remove_spaces() -> String {
        return self.replacingOccurrences(of: " ", with: "")
    }
}


print("hello world !".remove_spaces())
```

出力

```
helloworld!
```

そうです，既存のクラスでもextensionすることができます．

# Python でもやりたい！

以下のようにしてそれっぽく出来ます．

```python
class Person():
    def __init__(self, name):
        self.name = name

   
def ex_func(self):
    print("Hello, my name is", self.name)


Person.say_hello = ex_func

p = Person("Tom")

p.say_hello()
```

出力

```
Hello, my name is Tom
```

やったぜ。

じゃあこれもきっと......

```python
def ex_func(self):
    return self.replace(" ", "")
    
str.remove_spaces = ex_func

print("hello world !")
```

あるぇ？？

```
TypeError: can't set attributes of built-in/extension type 'str'
```

built-inクラスは拡張できないようです．

# 禁断の果実
## まずはやってみよう
forbiddenfruitというライブラリをインストールしましょう．

```
pip install forbiddenfruit
```

```python
from forbiddenfruit import curse
def remove_spaces(self):
    return self.replace(" ", "")

curse(str, "remove_spaces", remove_spaces)
print("hello world !".remove_spaces())
```

やったぜ。

```
helloworld!
```

## 使い方
### 登録

```
curse([built-inクラス], [登録名], [メソッドとか])
```

禁断の果実とか呪うとかなんだか恐ろしいライブラリですね．


### 解除

```python
from forbiddenfruit import reverse

reverse([built-inクラス], [登録名])
```

どういう仕組みなんだこれ......

# extension の難点

こうして見るとなかなかに便利で可読性が上がりそうな extension ですが，多用するのはあまり良くないと思います．
とりわけPythonは任意のタイミングで付与することができ，さらに**既にインスタンスを生成済みのオブジェクトにまで影響を及ぼす**ためです．

また以下のような難点も有ります．
extension はある意味クラスを継承せずとも，新たなメソッドやプロパティなどを追加できます．
しかし，**他人からしたら知らないメソッドなどをいつでも追加できてしまう** というのは可読性を下げうる欠点となりえます．

ある人にとっての `remove_spaces` は**半角スペースを削除するメソッド**であっても，ある人にとっては**全角スペースを削除するメソッド**として想定しているかもしれません．
同じ `str`，同じ意味の名前のメソッドで挙動が異なると多くの人は混乱するでしょう．

このような混乱を避けるためにbuilt-inクラスに関しては拡張できないように制限されているのかもしれませんね．


# 参考
- [clarete/forbiddenfruit: Patch built-in python objects](https://github.com/clarete/forbiddenfruit)
pythonのフレームワークpyramidでのHello World!!

# WEBフレームワークのpyramid

Djangoが有名ですが、今回はpyramidでのHello Worldを記事にします

## python3の仮想環境

```
python3 -m venv env3
source env3/bin/activate
```

## pipのアップグレード

```
pip install --upgrade pip
```

## ライブラリのインストール

```
pip install pyramid
```

## 使用できるテンプレート確認

```
Available scaffolds:
  alchemy:  Pyramid project using SQLAlchemy, SQLite, URL dispatch, and Jinja2
  starter:  Pyramid starter project using URL dispatch and Jinja2
  zodb:     Pyramid project using ZODB, traversal, and Chameleon
```

## プロジェクト作成の雛形を確認

```
pcreate --list-templates
```

## プロジェクトの作成
通常のプロジェクト

```
pcreate -t starter hello
```


## プロジェクトのインストール

```
cd hello
pip install -e .
```

## 起動

```
pserve development.ini
```

## 起動確認

![スクリーンショット 2019-04-24 16.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/aa3e6a29-9d3f-405a-23d2-84ab4beb4f3e.png)
AzureでNode.jsアプリケーションを動かすには結局何がいいのか？

Herokuで動かしていたNode.jsアプリケーションを、Microsoft Azureで動かそうとチャレンジ。
Microsoft Azureはいろんな機能があるので、開発したアプリケーションを大きく展開するのにはいいよなと思ったのがきっかけ。
選択肢が多いと言う事は、いろんなことができるということなんだけど、何がベストなのかという点で考えると迷う幅が大きい。
私なりにいろいろと考えて見て、2019年4月現在だとこれがいいんじゃないかという話です。

# 選択肢
Node.jsアプリケーションをAzureで動かすには、以下の選択肢があります。

| サービス | 考察 | 評価 |
|:---|:---|:---:|
| Virtual Machines | WindowsかLinuxのサーバーを立てるという方法。Jenkinsをインストールして、CI/CDできるようにするなら選択肢とあり。ただ、今の流行かという観点で考えると私的にはない。 | × |
| App Service | ドキュメント上ではNode.jsをサポートしているように記載されているが、構成するときにNode.jsの選択肢はない。ドキュメントをよく読むと、デプロイするファイルをzipで固めて、転送、解凍するんだとか。そんなのいやです。 | × |
| Kubernetesサービス | DockerのKubernetesサービスのAzure版。将来的に大きく展開する事になれば採用する価値大。Azure Dev Spacesと言うサービスもプレビュー版として公開されており、将来的に見てもかなりいい。ただ、開発段階で使うには高すぎる。 | △ |
| コンテナーインスタンス | 気軽にDockerイメージを動かすのに最適。今、流行のDockerを気軽に利用したいなら、これ。ただ、無料ではないので、ある程度の費用は覚悟する必要あり | ○ |

# コンテナーインスタンスを使う
Dokcerイメージをビルドして、Azureのコンテナーレジストリにpushしておくと、リポジトリの対象タグから、「実行インスタンス」を選択すれば、コンテナーインスタンスとして使えるようになります。
これは、すごく便利です。
ただ、環境変数を使うとか、コンテナーレジストリを「管理者ユーザー」を「有効」にすると、やや扱いが面倒になります。
でも、普通にあり得る話だと思いますので、そのネタについては、こちらに纏めました。

[AzureコンテナーインスタンスでNode.jsアプリケーションを動かそう](https://qiita.com/kmatae/items/9c07bbe5bd165c2927f8)

こう言うのって、「できるか」「できないか」もあるのですが、「やりたいか」とか「やってみたい」とか「面白そう」っていう、エンジニア魂に火が付くものがいいですね。
React NativeのTextInputのonChangeTextにReact hooksのuseReducerを使う

## はじめに

React hooksにuseReducerというフックがありますが、様々な用途に使えます。今回はその一例として、React NativeのonChangeTextに利用する例を紹介します。

## コード

```javascript
const changeTextReducer = (_, text) => ({
  text: text.toUpperCase(),
  toolong: text.length > 10,
});
```

このようにreducerを準備します。毎回新しい値で書き換えるので、第一引数は捨てます。今回は、文字列を大文字に変換し、文字列の長さのチェックを追加しました。その他のバリデーションロジックを追加することもあるかと思います。

（何も変換処理をしないのであれば、reducerを使う意味はありません。）

```jsx
const MyComponent = () => {
  const [t1, setText1] = useReducer(changeTextReducer, { text: 'HELLO' });
  const [t2, setText2] = useReducer(changeTextReducer, { text: 'WORLD' });
  return (
    <View>
      <Text style={{ color: t1.toolong ? 'red' : 'black' }}>
        {t1.text}
      </Text>
      <Text style={{ color: t2.toolong ? 'red' : 'black' }}>
        {t2.text}
      </Text>
      <TextInput value={t1.text} onChangeText={setText1} />
      <TextInput value={t2.text} onChangeText={setText2} />
    </View>
  );
};
```

コンポーネントではこのように使います。一つのreducerを複数のフックで使い回すことができます。

## デモ

https://snack.expo.io/Sk7ZFK6qV

(執筆時点では、ExpoはReact hooksに対応していないため、上記デモではponyfillを用いています。）

## おわりに

残念なことに、この書き方はReact Nativeでしか使えません。Web (React DOM)では、onChangeハンドラにはイベントが渡ってきてそのスコープ内で値を取り出さないといけないようです。
Workflow Meetupに初参加したよ。

ペンギンだよ。ゲノム解析よりのバイオインフォに興味があるよ。
中の人の正体は隠してないけど、積極的にオープンにしてないよ。
#Workflow Meetupって何？
https://github.com/manabuishii/workflow-meetup/wiki/Workflow-Meeup%E6%A6%82%E8%A6%81
『ワークフローシステム、再現性、自動化、アノテーション、自然言語処理、画像処理、AIの利用など、関連する様々な事柄について、知見を交換したり、技術を高めるための研究会です』
ということで、
簡単にバイオインフォ的な一連の解析処理（パイプライン）をみんなで楽に作れるパイプラインMakerみたいなのないかしらと探していたら、CWL(Common Workflow Language)の存在を知って、紛れ込んでみた。
#Common Workflow Languageって何？
https://www.commonwl.org/
https://qiita.com/manabuishiirb/items/9028086a93855c97d995
昨日（比喩的表現）知ったばかりなのでまったくわからない……
 - パイプラインを、「入力がこれで、ツールはこれつかって、出力をここに出すとか」をYAML（か JSON)で実行するための仕様と実行系
 - "Language"というより、一種の設定ファイル的な印象
 - 何でもCWLで書き換えれる（事前処理から最終結果まで）とイメージするより、特に処理が固まって定型化してる部分を、再現性があり、他者にも解りやすい文法で表現するところに利がありそう
  - 出力結果に応じた条件分離とか今の所CWLでできない事もままある。
#今日（文字通りの意味で）知った事ある？
- snakemake https://github.com/joemphilips/Translate_Snakemake_Tutorial
 - python3ベースのパイプライン作成ツールらしい
  - [x] pythonはcondaで何か入れるためにしか使った事ない
  - [x] makeは make allとmake cleanのために（ 
- EDAM Ontology http://edamontology.org/page
 - バイオインフォで扱われるデータや用語の定義（オントロジーの）データベース
 - 例えばmappingした時によく出てくるBAMファイルはこう定義されている　http://bioportal.bioontology.org/ontologies/EDAM/?p=classes&conceptid=http%3A%2F%2Fedamontology.org%2Fformat_2572&jump_to_nav=true
 -  何に使うかというと、BAMファイルはバイナリとか、数値はintとかよりもっときっちりフォーマット定義したい時に書く（ように見えた）
- Rabix Composer http://rabix.io/ 
 -  CWLをGUIで記述して実行できるツール。webアプリでなくて、Mac/Win/Linux用がある
- Seven Bridges Genomics  
 - ゲノム研究（特に医療関係）向けのクラウド型のプラットフォームを提供している会社。
 - https://twitter.com/oraryotas/status/1042610297322782720

## cwl-runner 使って見た
- cwl-runnerは、中の実行エンジンに関わらずCWLを実行するようにするラッパーだよ
 - ふるーいMacのpython2.7系にpip入れて（参考：https://qiita.com/tom-u/items/134e2b8d4e11feea8e12 ）
`pip install cwlref-runner` しても、単純に入らなかったのでくじけたよ。
  - デベロッパーツール入れないとだめかしら。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), 
missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```
 

 - 現時点の実体は現時点ではcwltoolと同一だよ
 - 明示的に--rm-tmpdirオプションつけてもディレクトリが消えないのは現時点で**バグ**だよ
C/C++言語の細かい事

#constと定数について
constはreadonlyの意味。書き換え不可能であることを示します。

しかしCコンパイラには細かい仕様があります。
それは、int型に関しては**定数**として解釈してよいというものです。

```c:サンプル
const int value1; // intに関しては定数最適化解釈をしてもよい
const float value2; // readonlyでしかない。定数ではない
```

#ファイルローカルリンケージ
翻訳単位毎に別の変数と解釈する。
const は　externは付かない


---
続く。。。