OmniAICreator/Qiita-1.07M huggingface dataset:
PythonからMeCabを使う

#はじめに
　[pirka](https://pirka-ai.tech)を作ってる最中に形態素解析をJanomeでさせてたらフリーズしたので、mecab-pythonで高速に解析できるプログラムを作った。紹介する。
#環境
　PC:Raspberry Pi 3 Model B+
　OS:Raspbian GNU/Linux 9.4 (stretch)
#必要なモジュールのインストール
　ターミナルを開いて以下のコマンドを入力する。

```console

$ sudo pip3 install mecab-python3
```
#作ったプログラム
　こんな感じ。

```python3:
import MeCab

def tokenizer(text):
	t = MeCab.Tagger("")
	t.parse("")
	m = t.parseToNode(text)
	tokens = []
	while m:
		tokenData = m.feature.split(",")
		token = [m.surface]
		for data in tokenData:
			token.append(data)
		tokens.append(token)
		m = m.next
	tokens.pop(0)
	tokens.pop(-1)
	return tokens

tokenizer("ぼんやりとした花曇りの白い空。百人が乗った車輛、千人を運ぶ列車、その千本が流れる街。") #『小説　君の名は。』より
```
　これで実行する。

```console
$ python3 analyzer.py
[
['ぼんやり', '名詞', 'サ変接続', '*', '*', '*', '*', 'ぼんやり', 'ボンヤリ', 'ボンヤリ'], 
['と', '助詞', '格助詞', '一般', '*', '*', '*', 'と', 'ト', 'ト'], 
['し', '動詞', '自立', '*', '*', 'サ変・スル', '連用形', 'する', 'シ', 'シ'], 
['た', '助動詞', '*', '*', '*', '特殊・タ', '基本形', 'た', 'タ', 'タ'], 
['花曇り', '名詞', '一般', '*', '*', '*', '*', '花曇り', 'ハナグモリ', 'ハナグモリ'], 
['の', '助詞', '格助詞', '一般', '*', '*', '*', 'の', 'ノ', 'ノ'], 
['白い', '形容詞', '自立', '*', '*', '形容詞・アウオ段', '基本形', '白い', 'シロイ', 'シロイ'], 
['空', '名詞', '一般', '*', '*', '*', '*', '空', 'ソラ', 'ソラ'], 
['。', '記号', '句点', '*', '*', '*', '*', '。', '。', '。'], 
['百', '名詞', '数', '*', '*', '*', '*', '百', 'ヒャク', 'ヒャク'], 
['人', '名詞', '接尾', '助数詞', '*', '*', '*', '人', 'ニン', 'ニン'], 
['が', '助詞', '格助詞', '一般', '*', '*', '*', 'が', 'ガ', 'ガ'], 
['乗っ', '動詞', '自立', '*', '*', '五段・ラ行', '連用タ接続', '乗る', 'ノッ', 'ノッ'], 
['た', '助動詞', '*', '*', '*', '特殊・タ', '基本形', 'た', 'タ', 'タ'], 
['車輛', '名詞', '一般', '*', '*', '*', '*', '車輛', 'シャリョウ', 'シャリョー'], 
['、', '記号', '読点', '*', '*', '*', '*', '、', '、', '、'], 
['千', '名詞', '数', '*', '*', '*', '*', '千', 'セン', 'セン'], 
['人', '名詞', '接尾', '助数詞', '*', '*', '*', '人', 'ニン', 'ニン'], 
['を', '助詞', '格助詞', '一般', '*', '*', '*', 'を', 'ヲ', 'ヲ'], 
['運ぶ', '動詞', '自立', '*', '*', '五段・バ行', '基本形', '運ぶ', 'ハコブ', 'ハコブ'], 
['列車', '名詞', '一般', '*', '*', '*', '*', '列車', 'レッシャ', 'レッシャ'], 
['、', '記号', '読点', '*', '*', '*', '*', '、', '、', '、'], 
['その', '連体詞', '*', '*', '*', '*', '*', 'その', 'ソノ', 'ソノ'], 
['千', '名詞', '数', '*', '*', '*', '*', '千', 'セン', 'セン'], 
['本', '名詞', '接尾', '助数詞', '*', '*', '*', '本', 'ホン', 'ホン'], 
['が', '助詞', '格助詞', '一般', '*', '*', '*', 'が', 'ガ', 'ガ'], 
['流れる', '動詞', '自立', '*', '*', '一段', '基本形', '流れる', 'ナガレル', 'ナガレル'], 
['街', '名詞', '一般', '*', '*', '*', '*', '街', 'マチ', 'マチ'], 
['。', '記号', '句点', '*', '*', '*', '*', '。', '。', '。']
]
```
　全ての項目をリストにした。ここから品詞や読みを取得できる。
#終わりに
　Janomeが重すぎて困っていたときに「MeCab速いよ」と教えてくださった東京工業大学の方、ありがとうございます。
Ruby 2.6 で 0.step.step は何を返すか

ある記事に，30 分以上かけて長大なコメントを書いてたら，なんか操作を誤って画面遷移（前画面に戻る）してしまい，すぐに元に戻したのにコメント投稿欄が空になってしまい，どうやっても取り戻せなかった（どういう作り方をしたらこうなるんだ？）。
腹いせにくだらない記事を投稿することにした。

# 問題

Ruby 2.5 では，

```rb
0.step.step
```

は NoMethodError になる。

Ruby 2.6 だとどうなるか？

なお，CentOS 7 で rbenv を使ってインストールした Ruby 2.6.0-preview3 だと期待どおりの動作だったが，macOS の rbenv でインストールした 2.6.0-preview3 だと，なぜか Ruby 2.5 と同じ結果（NoMethodError）になった
そんなことってあるの？？？

# 答え：1

Ruby 2.5 では `Numeric#step` や `Range#step` は `Enumerator` を返していた。

Ruby 2.6 では `Enumerator::ArithmeticSequence` というものを返すように変更されるらしい。
変更といっても，これは `Enumerator` の下位クラス。

arithmetic sequence というと何やら難しい概念のような気がしてしまうが，なんのことはない，等差数列のこと。

確かに，`step` って等差数列の各項について何かするものだものな。
（正確に言えば，ブロック付きだと実際に何かするし，ブロック無しだと何かするための `Enumerator` を返す）

`0.step` は引数が無いので，公差（増分）が 1 の無限数列だよね。

で，`Enumerator::ArithmeticSequence` の `step` メソッドは公差を返すので，答えは 1 というわけ。

`0.step.step` は同じメソッド名が重なってるけど，一つ目の `step` と二つ目の `step` は全然違う働きをするわけだ。

「だから何なんだよ。べつにおもしろくねーよ」
「いやだから，最初に言ったようにこの記事は腹いせに投稿したものであってだな」
Mac版QGIS(Openlayers plusgin)をProxy環境で利用する時の注意事項

Qiita初投稿。至らぬ点はご了承ください。

地図が専門というわけではないのですが、時折仕事でQGISを触ることがあります。
従来Windows環境で利用していたのですが、Mac環境に移行することになり、詰まったため備忘録として書き留めておこうと思います。
類似の事象でお困りの方がいましたら参考にどうぞ。

なお、QGISってなんだ、という方は[qiitaの他の記事](https://qiita.com/tags/qgis)などを参照ください。

この記事が有用なのは

- Mac版QGIS（Mac OS Sierra 10.12.6 / QGIS 2.18.25)
- Openlayers plugin(1.4.8)
- ネットワーク環境がProxy必須。
 - かつ、この ネットワークProxyが認証を必要としない。

という方になります。

--- 

[QGIS公式サイト](https://www.qgis.org/ja/site/forusers/download.html)からダウンローダーをダウンロードして、手順に従い

1. GDAL
2. NumPy
3. matplotlib
4. QGIS

の順番でインストールを実行します。

すべてのインストールが正常に完了し、QGISを起動。

[QGIS > Preferences > ネットワーク]と進み、「ウェブアクセスにプロキシを使用する」にチェックを入れて、必要なプロキシ情報（「ホスト」「ポート」）を入れます。

その後、[プラグイン > プラグインの管理とインストール...]を選択し、OpenLayers pluginをインストールします。

が、この時（またはプラグインのレイヤーを追加して、画面を読み込もうとした際）、「プラグインは壊れています」「Pythonのエラーが発生しました」というようなメッセージが表示され、描画に失敗。
OpenstreetMapでもGoogleMapでも、地図を描画することができませんでした。

結構ハマって試行錯誤する間、なんパターンかエラーメッセージがあったのですが、最終的に解決のポイントになったのは、ネットワーク環境のプロキシ設定をする際、 **認証が必要ないプロキシであっても、認証情報を設定する** というのが決め手でした。

とういことで、先程のプロキシ情報を入力する画面で、なんでもいいので、ユーザ／パスワードの項目を適当な文字列で埋めてください。
ユーザのみ設定してもだめで、パスワードまで必要でした。

その上で、 Command+Q を押して、一度完全にソフトウェアを終了して、設定を反映し直して再起動してみてください。
ウィンドウを閉じるだけではうまく設定が反映されなかったので、必ずドックからアイコンが消えているのを確認して再起動を行うことが必要なようです。


以上で、Mac版QGISでも、無事OpenLayer pluginが使えるようになりました。

--- 

事象から考えるとどこかのバグだとは思うのですが、QGIS本体なのかプラグイン側なのかの判断がつかなかったので、プロジェクトへのコミットなどは出していません。
どなたか事象の再現と問題箇所の特定ができる識者の方におまかせしたいと思います。
Stream#reject が欲しいと切に願う

まあ実際は切に願うほどではないんですけど、

```java
List.of("a", "", "b").stream()
    .reject(s -> s.isEmpty())
    .collect(Collectors.toList());
// => ["a", "b"]
```

みたいに書きたいわけです。

## でも実際はそんなものは無いわけで...

`Stream#filter` を使って書くわけです。

いろいろと書いてみると...

### 実装する関数で否定を返す

```java
List.of("a", "", "b").stream()
    .filter(s -> !s.isEmpty())
    .collect(Collectors.toList());
```

まあシンプルな実装なら悪くないんですけど、複雑な条件とかだと頭混乱しちゃいます。

あとシンプルな条件でも、ぱっと見で `!` を見逃すケースが怖いですよね。

### Predicate#negate を使う

```java
List.of("a", "", "b").stream()
    .filter(((Predicate<String>) (s -> s.isEmpty())).negate())
    .collect(Collectors.toList());

// う～んんんキャストうざい！
Predicate<String> emptyText = s -> s.isEmpty();
List.of("a", "", "b").stream()
    .filter(emptyText.negate())
    .collect(Collectors.toList());
```

`Predicate#negate` 自体はすごくやりたいことを実現できているんですが、キャストがががが... :scream:

### 否定条件を返すメソッド作る

```java
// 元の条件の否定条件の Predicate 返す
private <E> Predicate<? super E> not(Predicate<? super E> p) {
    return p.negate();
}
```

こういうの作って、

```java
List.of("a", "", "b").stream()
    .filter(not(s -> s.isEmpty()))
    .collect(Collectors.toList());
```

うん！悪くない！

ただ、`not` をユーティリティーとかにしてしまうと、`StreamUtils.not` みたいになって記述が長くなってしまうのがオシイ感じです。

### ラップしてしまえ！

```java
public class StreamWrapper<T> {

    private final Stream<T> stream;

    // private constructor
    private StreamWrapper(Stream<T> src) {
        this.stream = src;
    }

    // make instance
    public static <T> StreamWrapper<T> of(Stream<T> src) {
        return new StreamWrapper(src);
    }

    // Stream#filter をラップ
    public StreamWrapper<T> filter(Predicate<T> p) {
        return this.of(stream.filter(p));
    }

    // Stream#collect をラップ
    public <R, A> R collect(Collector<T, A, R> c) {
        return stream.collect(c);
    }

    // ...他にもいっぱいラップ

    /**
     * このストリームの要素のうち、指定された述語に一致<b>しない</b>ものから構成されるストリームを返します。
     * <p>
     * これは中間操作です。
     *
     * @param predicate
     *            各要素を含めるべきか判定する目的で各要素に適用する、非干渉でステートレスな述語
     * @return 新しいストリーム
     */
    public StreamWrapper<T> reject(Predicate<T> predicate) {
        return this.of(stream.filter(predicate.negate()));
    }

}
```

こういうの作って、

```java
StreamWrapper.of(List.of("a", "", "b").stream())
    .reject(s -> s.isEmpty())
    .collect(Collectors.toList());
```

やったね！

（~~まあ、`reject` ごときのためにこんなに手間のかかることしないけれど...~~）



### 実装クラス作ってしまえ！

~~Ｊ・Ｍ・Ｔ（実装・マジ・手間 :innocent:）~~



## なかなかに手間のかかる子 Stream API

 いざ「こういう中間操作欲しい！」ってなってもなかなか拡張するのには骨が折れます。

Java9 で `takeWhile` `dropWhile` `ofNullable` とか追加されて便利になっていますが、`zip` など主要っぽい機能は実装されていない（`reject` も）ので必要に応じて拡張してみてはいかがでしょう？ :yum:
【Android】RxBinding Tips

## detaches

ActivityやFragmentなどが破棄された場合にボタンのクリックイベントをキャンセル
する用にしたい場合。


```kotlin
        private val disposable = CompositeDisposable()
        ...
        fun bindEvents() {
           disposable += buttonReload.clicks()
                   .takeUntil(buttonReload.detaches())
                   .observeOn(AndroidSchedulers.mainThread())
                   .subscribe { reloadData() }
        }

        override fun onDestroy() {
           super.onDestroy()
           disposable.dispose()
        }

```

↑`takeUntil(buttonReload.detaches())` を入れることで
buttonReloadがdetachされてもreloadDataが呼ばれないようにしている。

detachesに関しては[こちら](https://github.com/JakeWharton/RxBinding/blob/4988b4faeb77860e1079b485b60a994340e78dd4/rxbinding/src/main/java/com/jakewharton/rxbinding3/view/ViewAttachesObservable.kt#L35)で実装されている

ちなみにclicklistenerの解除はいらない。
[ここ](https://github.com/JakeWharton/RxBinding/blob/4988b4faeb77860e1079b485b60a994340e78dd4/rxbinding/src/main/java/com/jakewharton/rxbinding3/view/ViewClickObservable.kt#L55)でdisposeされたらsetOnClickListenerにnullを設定している。

※ 2019/02/15 追記
ちなみにRecyclerViewなどのViewHolderでButton等のクリックを

```kotlin
  override fun onBindViewHolder(holder: XXXRecyclerViewHolder, position: Int) {
        ...
        disposable += holder.button.clicks()
                .takeUntil(holder.button.detaches())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { clickedListener?.onClicked(item) }
  }

  override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {           
      super.onDetachedFromRecyclerView(recyclerView)
      disposable.dispose()
  }
```
こんな感じで `takeUntil(holder.button.detaches())` なんてしてしまうと
スクロールした時に簡単にdetachされてしまい、二度とボタンが押せなくなるので注意
(こんなアホな事をするのは自分だけかもですが...)
buddypressのアクティビティにphpで書き込む


#ユーザーのアクティビティに

そのユーザーの更新をするには
***bp_activity_post_update()***を使う

```
$args = array( 
    'content' => 'コメント', 
    'user_id' => 2 
); 

$activity_id = bp_activity_post_update( $args  );
```


#グループのアクティビティに


***groups_post_update()***を使う

```

$arr = array( 
    'content' => "てす", 
    'group_id' =>11 );
$aa = groups_post_update($arr);

```

#ただ、それだけ
アクティビティに書けるだけです。
もっといろいろあるはずだけれど、今回はここまで
Vue + Nuxt + FirebaseでSPA(その1)

## 環境構築
- 1 firebaseでプロジェクト追加
- 2 vue+nuxtのセッティング

https://firebase.google.com から初めます
右上の Go to console をクリックします。

- 新規プロジェクトを作成
- プロジェクト名・国名を入力

## プロジェクトをローカルで起動
```
npm install -g firebase-tools
```
```
firebase login
```

## login後projectを作成
https://console.firebase.google.com/ で「新規プロジェクトを作成」をクリックしてプロジェクト作成

<img width="1080" alt="スクリーンショット 2018-11-14 17.04.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/95172/3c124d20-5b7d-765c-c3e8-429135027b2e.png">

## firebase init
```

$ firebase init

     ######## #### ########  ######## ########     ###     ######  ########
     ##        ##  ##     ## ##       ##     ##  ##   ##  ##       ##
     ######    ##  ########  ######   ########  #########  ######  ######
     ##        ##  ##    ##  ##       ##     ## ##     ##       ## ##
     ##       #### ##     ## ######## ########  ##     ##  ######  ########



You're about to initialize a Firebase project in this directory:

Before we get started, keep in mind:

  * You are initializing in an existing Firebase project directory

? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choices. Hosting: Configure and deploy Firebase Hosting
sites

=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we'll just set up a default project.

i  .firebaserc already has a default project, skipping

=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to be uploaded with firebase deploy. If you
have a build process for your assets, use your build's output directory.

? What do you want to use as your public directory? public
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
? File public/index.html already exists. Overwrite? Yes
✔  Wrote public/index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!
```

## firebase serve
http://localhost:5000/ にアクセスすると、このようなwebページが開かれているはずです。

## firebaseのコードを貼り付け
public/index.html の</style>と</head>の間に貼り付けましょう

## firebase deploy
```
$ firebase deploy

=== Deploying to 'storyproject-4e200'...

i  deploying hosting
i  hosting[storyproject-4e200]: beginning deploy...
i  hosting[storyproject-4e200]: found 10 files in public
✔  hosting[storyproject-4e200]: file upload complete
i  hosting[storyproject-4e200]: finalizing version...
✔  hosting[storyproject-4e200]: version finalized
i  hosting[storyproject-4e200]: releasing new version...
✔  hosting[storyproject-4e200]: release complete

✔  Deploy complete!

Hosting URL: https://storyproject-4e200.firebaseapp.com
```

画面には、deployしました。が表示されるようになります。

続きはまた記載いたします。
swiftで画像の大きさを変える

kaoというimage viewを置いて、


kao.bounds.height = 2


という記述で画像の大きさを変化させようとしたが、
「Cannot assign to property: 'height' is a get-only property」
というエラーが出て、思い通りに動かなかった

検索してみると
https://stackoverflow.com/questions/39109224/self-image-frame-width-20-give-get-only-property-error

「
get-only means you can only read this property (for example to compare with something), but not change. To set width you need this:

self.image.frame.size.width = foo
」

とのこと

bounds.heightは現在の高さを得ることができるが、ここに何か数を指定して、高さを変更することができないみたい

frameの方で変更しないといけないみたいだ
kao.frame.size.height = 2
で上手いこといった。


*kao.bounds.size.height = 2でも同じように動いた！

boundsが悪いわけではないようだ。

大きさ指定するときはsizeを入れておかないといけないみたいだ！


もっと調べてみると
https://ja.stackoverflow.com/questions/22273/cgrectの上手な書き方

とのこと
nginx: [warn] duplicate MIME type "text/html" を解決

[公式ドキュメント](http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_types)、gzip_typesの項目を見ると、`text/html`タイプのレスポンスは常に圧縮されるとのこと。

だもんで、nginx.confの`gzip_types`から`text/html`を削除。

解決。
Snakemake:入力ファイルの拡張子の表記ゆれに対応する

## 概要

snakemakeのワークフローの書き方でちょっとハマったのでメモ。

バイオインフォマティクスで使われている塩基配列データの保存形式に、FASTA形式というものがあります。これを保存するときは拡張子に`.fasta`を使うことが多いのですが、`.fa`とする場合もあります。

Pythonベースのパイプライン作成ツール[snakemake](https://snakemake.readthedocs.io/en/stable/getting_started/installation.html)のワークフローを書くときに、このような表記ゆれに両方対応させる書き方を以下にメモしておきます。

## Snakefileの書き方

`bwa index` を実行するサンプルです。

以下のように書くと、正規表現でどちらの表記の入力ファイルでも対応できます。

```
rule sort:
    input:
        "{sample}.{ext,(fasta|fa)}"
    output:
        "{sample}.{ext}.bwt"
    shell:
        "bwa index {input}"
```

## 実行

```
snakemake hoge.fasta.bwt 
```

or

```
snakemake hoge.fa.bwt 
```
## 追記

こう書いたけど、結局configで渡しちゃったほうが楽な気がする。。
buddypressのグループにオリジナルのタブ（ページ）を追加する。

探しても、なかなか見つからなくて苦労したので
備忘録も兼ねて
# 何処にコード追加するか？

/wp-content /pluginsの直下にbp-custom.php
を置きこの中にかく。
**buddypressのfunction.php**
という事
この辺は
[BuddyPressのユーザーページにオリジナルページを追加しよう | ITかあさん](http://www.kaasan.info/archives/2452)
が詳しいので割愛


# コードは？

上のＵＲＬのは**プロフィールページにオリジナルページ**のため、
そのままではうまく動かない。

```bp-custom.php

  add_action( 'bp_setup_nav', 'bpcodex_add_group_tabs');//ユーザーメニュー追加の独自関数をセット  
function bpcodex_add_group_tabs() {

    //グループの時だけ
    if ( ! bp_is_group() ) {
        return;
    }
	global $bp;

	$tab_args = array(
		'name'            => '新しいタブ',
		'slug'            => 'newtab',
		'parent_slug'     => $bp->groups->current_group->slug,
		'parent_url'      => bp_get_group_permalink( $bp->groups->current_group ),
		'screen_function' => 'newtab',
		'position'        => 1,
		);
	bp_core_new_subnav_item( $tab_args );
}

function newtab() {  
add_action( 'bp_template_title', 'newtab_title' );//カスタムユーザーページに見出し  
add_action( 'bp_template_content', 'newtab_content' );//カスタムユーザーページに表示したい内容  
bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'groups/single/plugins' ) );//テーマファイルの呼び出し

}  
  
//これでカスタムしたユーザーページにタイトルが表示される（はず？）
function newtab_title() {  

echo "TITLE";
}  
  
//これでカスタムしたユーザーページに表示したいコンテンツ  
function newtab_content() {  
echo "content";
   include_once "buddypress/custom_user/newtab_content.php";     
} 

```

プロフィールページに追加する場合と違うのは
1.**bp_core_new_subnav_item()**の引数（parent_slug,parent_url）

2.**bp_core_load_template()**の行の***apply_filters***の第２引数が違っている。

```
bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'groups/single/plugins' ) );//テーマファイルの呼び出し

```
プロフィールの場合、第２引数が*'members/single/plugins'*
グループの場合、**'groups/single/plugins'**

これでとりあえず動くようにはなった


# 備考）ユーザーによって見せないようにするには、

1.メンバーかどうかで変えるには、
   ***groups_is_user_member()***を使う。

```
function bpcodex_add_group_tabs() {


	global $bp;
	if (groups_is_user_member($bp->loggedin_user->id, $bp->groups->current_group->id) ) {

		//省略
	}

}

```

2.グループ管理者（とwordpress管理者）のみ

　***bp_is_item_admin()***を使う
　権限者のみ見えるようにする（メンテページとかで使う）
  	
```
	if( bp_is_item_admin() ){

		//省略
	}
```


# まだまだ全然把握できてない（Ｔ＿Ｔ）
###まだ出来ていない、わかっていない事
1. タイトルが出ていない
    - newtab_title()の内容が出力されると思っていたが、うまく出てこない
2. サブタブが作れていない
    - 同じ***bp_core_new_subnav_item()***で作れると思っているが、うまくいかない

英語の情報を探して回ったけれど、理解が届かず
誰か教えて（Ｔ＿Ｔ）
Keras , LSTM：return_sequencesとreturn_stateの違い

##はじめに
KerasのRecurrentLayerにおける引数return_sequencesとreturn_stateの違いの認識が曖昧だったので,忘備録として書き残しておきます.
詳細は参考文献.

##return_sequences
`return_sequences=True`で出力系列を返す.

```python
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# モデルの定義
inputs1 = Input(shape=(3, 1))
lstm = LSTM(1, return_sequences=True)(inputs1)
model = Model(inputs=inputs1, outputs=lstm)
# インプットデータの成型
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# 予測
print(model.predict(data))
```
入力のshapeが(3, 1)(timestepが3)なので, <b>各timestep毎の隠れ層の出力</b>(入力系列に対する出力)が以下のように返される.

```
[[[-0.02243521]
  [-0.06210149]
  [-0.11457888]]]
```
LSTMを複数重ねるときや,各出力を組み合わせて使うときなどに用いるらしい.

##return_state
`return_state=True`で出力とともに最後の状態を返す.
隠れ層の最後の出力とともに,<b>cellの(最後の)内部状態</b>`state_c`を返す.

```python
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# モデルの定義
inputs1 = Input(shape=(3, 1))
lstm1, state_h, state_c = LSTM(1, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])
# インプットデータの成型
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# 予測
print(model.predict(data))
```

```
[array([[ 0.10951342]], dtype=float32),
 array([[ 0.10951342]], dtype=float32),
 array([[ 0.24143776]], dtype=float32)]
```

出力はそれぞれ,
-LSTMの隠れ層の最後の出力.
-LSTMの隠れ層の最後の出力(return_sequencesとreturn_stateを組み合わせて出力するときに有用(詳細は引用文献)).
-LSTMの隠れ層の最後の状態.
LSTMの最後の状態を他のLSTMの初期状態として用いるときなどに利用する.(ただしセルの数は等しい必要がある)

>引用
[Understand the Difference Between Return Sequences and Return States for LSTMs in Keras](https://machinelearningmastery.com/return-sequences-and-return-states-for-lstms-in-keras/)
[Keras Documentation](https://keras.io/ja/layers/recurrent/)
Swift プロパティ

# プロパティ
- 型に紐付いた値
- 型が表すものの属性の表現などに使用される

```swift
struct 構造名 {
var プロパティ名: プロパティの型 = 式 // 再生可能なプロパティ
let プロパティ名: プロパティの型 = 式　// 再生不可能なプロパティ
}
```
プロパティは型のインスタンスに紐付くインスタンスプロパティと、その型そのものに紐付くスタティックプロパティに分類される。
## インスタンスプロパティ 
- 型のインスタンスに紐付くプロパティ
- インスタンスごとに異なる値を持たせることができる
- varやletで定義したプロパティは、デフォルトではインスタンスプロパティとなる

```Swift
struct MyNameIs {
    var name = "TERADA"
}

let myNameIsEng = MyNameIs()
var myNameIsJpn = MyNameIs()
myNameIsJpn.name = "寺田"

let englishName = myNameIsEng.name //TERADA
let japaneseName = myNameIsJpn.name //寺田
```

## スタティックプロパティ

- 型自身に紐付くプロパティ
- インスタンス間で共通する値の保持などに使用

宣言方法
プロパティ宣言の先頭にstaticを追加。スタティックプロパティにアクセスするには型の前に.とスタティック名を付けて型名.スタティックプロパティ名のように書く

```swift
struct Greeting {
    static let signature = "Sent from iPhone"
    
    var to = "Terada"
    var body = "Hello!"
}

func print(greeting: Greeting){
    print("to: \(greeting.to)")
    print("body: \(greeting.body)")
    print("signature: \(Greeting.signature)")
}

let greeting1 = Greeting()
var greeting2 = Greeting()
greeting2.to = "Kunio"
greeting2.body = "Hi!"

print(greeting: greeting1)
print("---")
print(greeting: greeting2)

```
```
to: Terada
body: Hello!
signature: Sent from iPhone
---
to: Kunio
body: Hi!
signature: Sent from iPhone
```
AWS - SQSでキューの中のメッセージを全件取得できない

SQSをRubyで操作している。

APIを用いてSQSのキューの中のメッセージを取得しようとしている。

receive-messageを用いているがなぜか4件中1件しか取得できない。
調べたところポーリング時間を長くすればいいと分かったのだが、できない、、、、

これはポーリング時間を長くするための戦いの記録である。

##コード

```ruby

require "aws-sdk"
require "json"
require "pry-rails"
#aws アカウントの設定
sqs = Aws::SQS::Client.new()

#sqsからデータをロード
## キューに入れたmessage達を取得
queue_url = ENV['AWS_SQS_DEVELOP_CATEGORY_KEY']
receive_message_result = sqs.receive_message(
  queue_url: queue_url,
  wait_time_seconds: 5,
  max_number_of_messages: 10
)
```

**wait_time_seconds: 5**でポーリング時間を正しく設定できていると思ったのだが、そんなことなかった。
さて、、、

##仕組みの理解

かなり検索しても原因が分からなかったので根本を理解していないといけない系の問題と判断。ここからsqsのシステム説明に入ります。

参考になったのは[こちらのQiita記事](https://qiita.com/tomoya_ozawa/items/dc0286cdb30763eab174)。SQSについての基本的なことが書かれている。

これを読んでみると、
*SQSは全て取得できることを保証しない*
とある。結構いい加減なのか？

ロングポーリングに関しても、ポーリング時間不足で起こる空のメッセージ受信を防ぐための物のようで、今回の問題は解決しなさそう。

## 進展

探していたところ、以下の記述を[Document](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)内にて発見

> If the number of messages in the queue is small (fewer than 1,000), you most likely get fewer messages than you requested per ReceiveMessage call. If the number of messages in the queue is extremely small, you might not receive any messages in a particular ReceiveMessage response. If this happens, repeat the request.

訳すと、「キュー内のメッセージがとても少ないと特定のメッセージを取得できない可能性があるので、その場合はリクエストを繰り返してください。」と書いてある。

#結論

SQSの仕様？で少なすぎるメッセージは希望件数取得できないみたい。なのでメッセージの取得、削除を繰り返して全件取得を繰り返すことにする。


```ruby
#メッセージ取得
receive_message_result = sqs.receive_message({
    queue_url: queue_url,
    attribute_names: ["All"], # Receive all available built-in message attributes.
    message_attribute_names: ["All"], # Receive any custom message attributes.
    max_number_of_messages: 10, # Receive up to 10 messages, if there are that many.
    wait_time_seconds: 5
})
while !receive_message_result.messages.nil?
  receive_message_result.messages.each do |message|
    #　〜〜〜操作〜〜〜
    # 操作後のメッセージ削除
    sqs.delete_message({
      queue_url: queue_url,
      receipt_handle: message.receipt_handle
    })
  end
  # 再度メッセージ取得
  receive_message_result = sqs.receive_message({
      queue_url: queue_url,
      attribute_names: ["All"], # Receive all available built-in message attributes.
      message_attribute_names: ["All"], # Receive any custom message attributes.
      max_number_of_messages: 10 # Receive up to 10 messages, if there are that many.
    })
end
```

こんな感じにすることにした。
もっといい方法があれば教えてください。


終わり
Image Classifier with Create ML

#Introduction 
**Create ML** is an Apple's Framework in which for easy Machine Learning Model Training on Macs. You can extract meaningful insights, or finding relationships between numbers. **Create ML** harnesses the machine learning infrastructure built into the software. 

#Dataset
We will prepare our dataset to test with create ML, in this article I will create **image classification** to classify between cats and dogs and tigers. Here is my [dataset] (https://github.com/SreyPichh/Image_Classification/tree/master/dataset). You can add as many images with as many labels as we want, but for simplicity, I will be building an image that recognize cats, dogs, and tigers. When you open the folder, you will see two more folders, *Testing data* and *Training data*.  

#Create ML Playgrounds & Training data
In Xcode playgrounds for training, evaluating machine learning models.s
![Screen Shot 2018-11-14 at 12.18.55 AM.png](https://qiita-image-store.s3.amazonaws.com/0/279562/cb3649c5-3aae-816a-cb8f-2b6c899a9216.png)

It is crucial that you select the Blank template under macOS because **create ML** framework isn't support for iOS playground.

**Snippet Code**

```swift
import CreateMLUI

let builder = MLImageClassifierBuilder()
builder.showInLiveView()
```

That is it and make sure you enable *Live View feature in Xcode Playground* and you will able to see the visual interface.

 **Demo**
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/279562/91393752-7033-ffc1-1b6a-bdae7ba37eab.gif)

I have create sample project, and here is the [source code](https://github.com/SreyPichh/Image_Classification), You can check it out.
JavaScriptでHTMLのdate 型 input 要素を作る

# 概要
　先日、HTML・CSS・JS（それとWebGL）を用いたアプリケーションを開発する際に、日付毎に描画が変わる機能が必要になりました。その時に作成したものがこちらになります。

# HTMLコード
まずは、自分の作りたい場所に要素を配置して・・・

```html:code.html
<body>
    <input type="date" id="today">
</body>
```


# JavaScriptコード
そこに入れたい内容をJS側で準備するだけ

```JavaScript:code.js
//Dateオブジェクトの宣言
var date = new Date();

//上から日、月、年の宣言
var day = date.getDate();
var month = date.getMonth();
var year = date.getFullYear() - 1;

//1~9月の場合は'01'~'09'表示になるようにする
if(month < 10) month = "0" + month;

//年を１月から前の年の12月にする場合の処理
if(month == 0){
    month = "12";
    year = year - 1;
}

//月と同じように1~9日は'01'~'09'表示になるようにする
if(day < 10) day = "0" + day;

//HTMLのdate型は「年-月-日」の形で構成される為、'-'を付け加えて形にする
var today = year + "-" + month + "-" + day;

//htmlで定義した"today"に挿入
document.getElementById("today").value = today;
```

以上で完成です。

# 参考
Dateについて詳しく知りたい方はこちらの方の記事が参考になります

- [Dateは地雷原](https://qiita.com/jkr_2255/items/304b6326c7fc54e0aaa2 "Dateは地雷原")
RTABMAPの使い方


#RTABMAPの使い方
前回の記事ではIntel Realsense d435を使ってSLAMをやってみました。
インストール方法等はこちら
https://qiita.com/k65c1/items/0d9039c021ecbb26b04e
今回はサンプルを使って具体的な使い方を見ていきます。

#サンプルファイルで動かしてみる。
まずはDEMOのrosbagファイルをここからダウンロードします。
https://docs.google.com/uc?id=0B46akLGdg-uadXhLeURiMTBQU28&export=download
次のコマンドで、DEMOを立ち上げます。
ターミナル１

```
roslaunch rtabmap_ros demo_robot_mapping.launch
```

ターミナル2

```
rosbag play --clock demo_mapping.bag #ダウンロードしたディレクトリで
```

すると以下のようなGUIが立ち上がります。
![図1-min.png](https://qiita-image-store.s3.amazonaws.com/0/196598/60da7d85-5087-9c10-345c-ceafb9308850.png)

このサンプルではロボットが部屋の中をSLAMしながら進んで、マッピングをしていきます。
これだけでもみていて楽しいですね。

#RTABMAPのシステム構造
RTABMAPのシステムの基本的な構造は以下のようになっています。

![Screenshot from 2018-11-14 17-06-28-min.png](https://qiita-image-store.s3.amazonaws.com/0/196598/5b2fdbd3-744b-b5ee-d34b-9179be0be2a4.png)

まずカメラによるvisual odometry、Lidarによるicp odometryなどによりオドメトリを計算し、それをSLAMのノードに送信します。そして、SLAMのノードでは、RGB画像、深度画像をsubscribeして、一定の周期でマップに登録していきます。
このサンプルではレーザーによるオドメトリのみでカメラのオドメトリは使われていません。

#使い方
それでは具体的な使い方を見ていきます。
まずGUIの見方から。

![Screenshot from 2018-11-14 16-54-49-min.png](https://qiita-image-store.s3.amazonaws.com/0/196598/16af3324-e65f-48e5-b0ef-2f8feda1d9e0.png)

左上の画像にはvisual odometryの特徴点が表示されます。
このサンプルではレーザーのみのオドメトリのため特徴点は表示されていません。



その下のLoop closure detectionの下には、現在最新のノードの画像、その下にはLoop closureの最も一致度の高いノードの画像が表示されています。
Loop closureが検出されたときにはここが緑色で表示されます。
Loop closureが検出されたが、閾値を超えなかったときなどは赤色で表示されます。

そして右側には3Dマップが表示されています。このマップをよく見ると、点と線でつながっていることがわかると思いますが、この点はノードと呼ばれています。

そして各ノードは以下の情報を持っています。
ID
姿勢
画像、レーザーなどのセンサーデータ
他のノードとの関連情報（近くのノード、Loop closureが検出された他のノードなど）

この情報を積み重ねて、マップを作っていきます。
そしてここで、rtabmapを終了させてみます。
するとマップのデータベースが保存されます。（デフォルトではホームディレクトリ下の~/.ros/rtabmap.db）

このデータベースの情報を見るには

```
rtabmap-databaseviewer　~/.ros/rtabmap.db
```

で確認することができます。
するとこのようなviewerが立ち上がり、さっき作ったマップのデータを見ることができます。

![database-min.png](https://qiita-image-store.s3.amazonaws.com/0/196598/0d057bb2-38cc-39ef-b91e-226e7b4b5997.png)

今回はここまでとします。
リクエスト等あればコメント欄までおねがいします。

次回はrtabmapの詳しい構造を論文から見ていきます。
https://qiita.com/k65c1/items/0e9918cc94cc531a5295

#参考にしたサイト
rtabmap_ros - ROS Wiki
http://wiki.ros.org/rtabmap_ros
XcodeをインストールしないでCommand Line Toolsだけをインストール

#はじめに
Command Line Toolsをインストールする方法として、Xcodeからインストール、ADCからCommand Line Toolsのパッケージをダウンロードしてインストール、xcode-selectコマンドでインストールの3種類がある。ここでは、xcode-selectコマンドでインストールする方法を解説する。

#セットアップ方法

```text:Command
$ xcode-select --install
```

コマンドを実行すると、GUIのダイアログが開くので、インストールボタンをクリック
<img width="492" alt="スクリーンショット 2018-11-14 16.55.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/54439/92a5e6f5-98b9-e801-78eb-153f3d7db80f.png">



余談だが、xcode-selectはXcodeを入れなくても、もともとmacOSに入っているコマンドです。

#リファレンス
- [How to Install Command Line Tools in Mac OS X (Without Xcode)](http://osxdaily.com/2014/02/12/install-command-line-tools-mac-os-x/)
Python3のメソッド(第一引数にself必須)とスタティックメソッド（引数不要）の違いを検証してみた

クラス内で定義されている関数（メソッド）に、引数に「self」があるものと無いものがあるので違いを調べてみた。

#メソッドの第一引数にある「self」ってそもそも何？
「self」自体は引数の名前に過ぎず、他の名称でもいい。
Pythonではメソッドの第一引数は「self」が必須であり、自身のクラスのインスタンスを受け取るとコーディング規約で決まっているらしい。
他の言語から来た人には不評な一方、このおかげでだいぶ便利になっているらしい。

参考：https://coreblog.org/ats/translation-of-why-explicit-self-has-to-stay/
>Pythonのメソッド引数に書く「self」はしばしば，他言語からのPython移民を中心に「ウザイ」「キモイ」「消えてなくなれ」と攻撃の対象となることが多いのです。

#「self」のあり・なしの違いは？
メソッドの第一引数に「self」が必須なのに、引数なしのメソッドがあるのは何故なのか？
結論から言うと「self」があるのは普通のメソッド、無いのはスタティックメソッド。
さらに第一引数に「cls」が必要なクラスメソッドというのもあるらしいが今回は省略。
参考：http://nihaoshijie.hatenadiary.jp/entry/2018/06/08/200823

| メソッドの種類     | 第一引数     |宣言          | 呼び出し元         |インスタンスオブジェクト|クラスオブジェクト|
|:------------------|:------------|:------------|:------------------|:----------------------|:----------------------|
| 普通のメソッド   　 |self         |なし         |インスタンスのみ　　 |操作できる             |操作できる              |
| クラスメソッド 　   |cls          |@classmethod |インスタンス・クラス |操作できない            |操作できる              |
| スタティックメソッド|不要         |@staticmethod |インスタンス・クラス|操作できない            |操作できない            |

#そもそも「クラス」と「インスタンス」ってなんだっけ？
クラスは設計書で、インスタンスは設計書をもとに作られた実体。
例：クラス→車の設計書　インスタンス→設計書を元に実際に製造された車

#普通のメソッドとスタティックメソッドってどう使い分けるべき？
- 普通のメソッド
　→現在のガソリンの残量を取得するメソッド。ガソリンの残量は製造された車（インスタンス）ごとに残量が違うから
- スタティックメソッド
　→タイヤの数を取得するメソッド。タイヤの数は設計書（クラス）で決められており、製造された車（インスタンス）に依存しないから。

つまり
タイヤの数を知りたいだけならわざわざ実際に車を製造しなくていいよね？
→普通のメソッドだと第一引数「self」に製造した車を渡さなきゃいけない
→スタティックメソッド使おう！
ってことらしい。
※追記：よく考えてみたらこれも正確じゃない。タイヤの数をクラス変数として持たせている場合は、スタティックメソッドだとアクセスできないのでクラスメソッドを使う。
タイヤの数を固定値で返す場合はスタティックメソッドでOKだけど、それだとクラスの意味がない。
クラスもインスタンスも参照しないメソッドならクラスに入れる必要がない。
つまりスタティックメソッドはいらない子・・・？。

#スタティックメソッドで「@staticmethod」を宣言しないとどうなるの？
クラスから呼び出したときは問題なし。
インスタンスから呼び出したときに普通のメソッドだと解釈され、第一引数が自クラスのインスタンスじゃないのでエラーになる。
以下、検証結果。

```python
# スタティックメソッドの検証。
# クラスの定義
class test:
    # 宣言あり、引数なしのスタティックメソッド。→インスタンスから呼び出しても動く。
    @staticmethod
    def myfunc1():
        print("func1")

    # 宣言無し、引数なしのスタティックメソッド。→インスタンスから呼び出すとエラー。
    def myfunc2():
        print("func2")

    # 宣言あり、引数ありのスタティックメソッド。→インスタンスから呼び出しても動く。
    @staticmethod
    def myfunc3(msg):
        print(msg)

    # 宣言無し、引数ありのスタティックメソッド。→インスタンスから呼び出すとエラー。
    def myfunc4(msg):
        print(msg)

# インスタンスの作成
t = test()

# 宣言あり、引数なしのスタティックメソッド。→インスタンスから呼び出しても動く。
test.myfunc1()  # クラスからの呼び出し→func1
t.myfunc1() # インスタンスからの呼び出し→func1

# 宣言無し、引数なしのスタティックメソッド。インスタンスから呼び出すとエラー。
test.myfunc2()   # クラスからの呼び出し→func2
t.myfunc2() # インスタンスからの呼び出し→エラー

# 宣言あり、引数ありのスタティックメソッド。インスタンスから呼び出しても動く。
test.myfunc3("func3")   # クラスからの呼び出し→func3
t.myfunc3("func3")  # インスタンスからの呼び出し→func3

# 宣言無し、引数ありのスタティックメソッド。インスタンスから呼び出すとエラー。
test.myfunc4("func4")   # クラスからの呼び出し→func4
t.myfunc4("func4")  # インスタンスからの呼び出し→エラー
```
Raspberry PiとPythonで複数のUSBカメラを取り扱う方法

Raspberry Pi Advent Calendar 2019の11日目の記事です。前日は[tera1707](https://qiita.com/tera1707)さんの[RaspberryPi3にI2Cサーマルカメラ(サーモグラフィ)をつなげて温度を画像化する](https://qiita.com/tera1707/items/dbdc42cc06db6c1a2588)でした。興味深いのでいつかやってみたいと思います。

さて。あるプロジェクトで、Raspberry Pi(以下ラズパイ)から複数台のUSBカメラで静止画を撮影する必要がありました。そのときにプログラムからカメラを指定する方法でつまづきましたので解決方法を記しておきます。

## 環境
Raspberry Pi 3 モデルB
ロジクール C270 HD WEBCAM(×2台)

2台のUSBカメラはラズパイに4ヵ所あるUSBのいずれかに刺さっている状態です。まずカメラがOSに認識されているかを調べてみましょう。

```
$ ls /dev/video*
```

普通なら次のようにデバイスファイルの一覧が出るはずです。ただし、video0とvideo1はそれぞれ特定のカメラとひも付いているわけではありません。

```
/dev/video0  /dev/video1
```

## Pythonで撮影する
ラズパイでカメラ撮影をする方法はいくつもありますが、OpenCVライブラリをここでは利用します。なければインストールを。

```
$ pip install opencv-python
```

ではさっそくプログラムから撮影してみましょう。最小のコードを書くとこうなります。

```python
import cv2

cam = cv2.VideoCapture(0)
ret, im = cam.read()
```

VideoCaptureインスタンスのreadメソッドで撮影を行いますが、コンストラクタに渡す数はカメラのインデックスであり、上記で一覧出力した`/dev/video0  /dev/video1`に含まれる整数がそれに該当します。ここでやっかいなのが、0と1は様々なタイミングですり変わります。つまり、0を指定すればカメラAだ、のようにできればシンプルなのですがそれは難しいようです。そこで、USBのどこに接続されているカメラかを調べることでこれを解決します。ここではLinuxでカメラに関する多機能ユーティリティツールであるVideo4Linuxを利用します。

## Video4Linuxのインストール

```
$ sudo apt-get -y install v4l-utils
```

いまほしい情報は、`/dev/video0  /dev/video1`と2台のカメラの紐づけであり、これはいくつかの方法があります。

## シンボリックリンクを利用する

```
ls -l /dev/v4l/by-path
```

シンボリックリンクにUSBのバス情報が含まれているので、矢印右辺と紐づけできます。

```
lrwxrwxrwx 1 root root 12 Nov 14 15:17 platform-3f980000.usb-usb-0:1.2:1.0-video-index0 -> ../../video0
lrwxrwxrwx 1 root root 12 Nov 14 15:17 platform-3f980000.usb-usb-0:1.4:1.0-video-index0 -> ../../video1
```
## v4lを利用する
次の方法は、以下のコマンドを利用します

```
v4l2-ctl --list-devices
```
すると、以下のようにデバイス情報、バス情報、インデックスをペアとして、一覧を出力してくれます。

```
UVC Camera (046d:0825) (usb-3f980000.usb-1.2):
        /dev/video0

UVC Camera (046d:0825) (usb-3f980000.usb-1.4):
        /dev/video1
```

## Pythonからsubprocessで呼んでみよう
subprocessを使えばPythonから上記の情報を得ることができます。

```python
import subprocess

cmd = "v4l2-ctl --list-devices"
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
ret = p.communicate()[0]
ret = ret.split("\n")
ret = filter(None, ret)
print(ret)
```

出力は次の通り

```
['UVC Camera (046d:0825) (usb-3f980000.usb-1.2):', '\t/dev/video0', 'UVC Camera (046d:0825) (usb-3f980000.usb-1.4):', '\t/dev/video1']
```

## おまけ：カメラのシリアル番号を取得する
上記出力のデバイス情報である`046d:0825`を使って、カメラのシリアル番号を取得することができます。

```
$ sudo lsusb -v -d 046d:0825 | grep -i serial
```

以下のような8桁のシリアル番号が取得できるため、使いようによっては便利かと思います。

```
  iSerial                 2 10763230
  iSerial                 2 B9D5A4E0
```
AWS Amplifyのユーザー認証でユーザー名の代わりにメールアドレスを使用する

##はじめに
<a href="https://qiita.com/oliverSI_/items/ffb73c9ae76ab2382bef">AmplifyとReactを使用して爆速でユーザー認証画面を実装する</a>の内容に沿ってユーザー認証を実装すると、メールアドレスの他にユーザー名が必須となり、ログイン時にもユーザー名の入力が必要になる。そこで、メールアドレスでログインできるようにしたい。

参考： https://github.com/aws-amplify/amplify-js/issues/1634

##手順
設定ファイルの作成

```
amplify add auth
```

pushする前に、amplify/backend/auth/{your-project}/{your-project}-cloudformation-template.ymlにUsernameAttributesを追記する。

```
Type: AWS::Cognito::UserPool
    Properties:
      UsernameAttributes:
       - "email"
      UserPoolName: !Ref userPoolName
```

```
amplify push
```

push後は変更が効かないので注意が必要。
Ruby on Rails5でデータ更新者( userstamp, created_by, updated_by )を追加する方法

Rails.version => "5.2.1"
RUBY_VERSION => "2.5.1"
deviseのset_current_user使用
しっくりくるgemが見当たらなかったのでハードコードで実装。


current_userがモデルから参照できなかったので、Userモデルのクラスメソッドに追加

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # ... その他色々

  before_action :set_current_user
  def set_current_user
    User.current_user = current_user if current_user
  end
end
```

データ更新前にcurrent_userを埋めるconcern。
user.idでも良いけど、user.emailの方がデータ追いやすいのでemailを埋めてる。

```app/models/concerns/userstamps_concern.rb
module UserstampsConcern
  extend ActiveSupport::Concern

  included do
    before_create :update_created_by
    before_update :update_updated_by
  end

  def update_created_by
    self.created_by = current_user_email
    self.updated_by = current_user_email
  end

  def update_updated_by
    self.updated_by = current_user_email
  end

  def current_user_email
    User.current_user.try(:email) || 'system'
  end
end
```




Hogeモデルにcreated_by, updated_byを追加する場合

```app/models/hoge.rb
class Hoge < ApplicationRecord
  include UserstampsConcern
  # ... その他色々
end

```
```db/migrate/20181111111111_create_hoges.rb
class CreateHoges < ActiveRecord::Migration[5.2]
  def change
    create_table :hoges do |t|
    	# ... その他色々
      t.timestamps
      t.string :created_by, null: false
      t.string :updated_by, null: false
    end
  end
end
```

やっつけで作ったので、改善箇所があれば教えてください。
データ更新者を埋めるのって、システム運用する上でマストな気がするんだけど、皆どうしてるの？
ParaViewによるデータ可視化（簡易）

科学技術計算に携わっていると、計算結果の三次元情報を可視化したい場面に出くわすことがあります。その際に利用できる汎用オープンソースソフトウェアとしてParaViewが有名ですが、豊富な機能に対応していることもあってか「ちょっと触ってみる」ことが容易でない印象です。
ここでは、私が触ってみた時に必要だったことを簡潔にまとめました。

参考資料：[XMLベースのvtk形式に関する覚書](https://qiita.com/hsimyu/items/a8fba8866c5f5c2d8b78)

# 非構造格子用XMLフォーマット：拡張子 .vtu

データ点が等間隔一様メッシュ上にない場合が非構造格子です。

```xml:sample.vtu
<?xml version='1.0' encoding='UTF-8'?>
<VTKFile xmlns='VTK' byte_order='LittleEndian' version='0.1' type='UnstructuredGrid'>
<UnstructuredGrid>
<Piece NumberOfCells='6' NumberOfPoints='7'>
<Points>
<DataArray NumberOfComponents='3' type='Float32' Name='points' format='ascii'>
  0   0   0
  1.0 0   0
  0   0.9 0
  0   0   0.93
  0.7 0   1
  1   1   1
  0.6 0.5 0.8
</DataArray>
</Points>
<PointData>
<DataArray NumberOfComponents='1' type='Float32' Name='temperature' format='ascii'>
  100.0 200.0 350.0 800.0 140.0 750.0 100.0
</DataArray>
<DataArray NumberOfComponents='1' type='Float32' Name='density' format='ascii'>
  40.0 90.0 55.0 10.0 99.0 3.0 70.0
</DataArray>
<DataArray NumberOfComponents='1' type='Float32' Name='density_bin' format='binary'>
HAAAAAAAIEIAALRCAABcQgAAIEEAAMZCAABAQAAAjEIcAAAA
</DataArray>
</PointData>
<Cells>
<DataArray type='Int32' Name='connectivity' format='ascii'>
  0    1
  0    2
  0    3
  1    2    3
  4    5
  6
</DataArray>
<DataArray type='Int32' Name='offsets' format='ascii'>
  2 4 6 9 11 12
</DataArray>
<DataArray type='UInt8' Name='types' format='ascii'>
  3 3 3 5 3 1
</DataArray>
</Cells>
</Piece>
</UnstructuredGrid>
</VTKFile>
```

`NumberOfPoints`でデータ点の数を、`NumberOfCells`で表示要素の総数（点、線、面等の数の和）を指定します。

`<Points><DataArray>...</DataArray></Points>`の中でデータ点の座標を指定し、`<PointData><DataArray>...</DataArray></PointData>`では、各データ点での物理量を与えます。どちらも`NumberOfPoints`個のデータを指定します。
バイナリ形式でのデータ記述もできます`<DataArray ... format='binary'>`。Fortranのバイナリ出力はデータの前後にデータサイズ（バイト単位）を付加するので、その形式をそのままBase64に変換した結果を記述します。`density`と`density_bin`には同一データをそれぞれ`ascii`と`binary`形式で格納しました。バイナリ形式を利用する利点の一つはファイルサイズの削減です。この例では、データの（10進数表記での）桁数が少ないのでバイナリの方がサイズが大きくなってしまいましたが、精度を一杯に利用した数値では、バイナリ形式の方がコンパクトです。それ以上に重要な利点は、データの解釈（パース）に要する時間が短くなることです。テキストデータは記述の自由度が高いので、それら値をParaViewが解釈する必要があり、特にデータ量が多くなるとこの負荷を無視できません。バイナリ形式はパースする必要がないので読み込み負荷が軽く、特に動画再生時の表示速度に良い影響を及ぼします。

`<Cells>...</Cells>`内で、上記のデータ点を使って表示要素（点、線、面等）を指定します。
`<DataArray Name='connectivity'>...</DataArray>`では、表示要素を構成するための点の並びを指定します。点の場合はその点の番号を、線分の場合は両端の二点、三角形の場合は三つの頂点を指定します。点の番号は0始まりです。この例では要素毎に改行していますが、改行は区切りではありません。区切りを指定するのは次の`<DataArray Name='offset'>...</DataArray>`です。最後の`<DataArray Name='types'>...</DataArray>`で表示要素を選択します。点は`1`、線分は`3`、三角形は`5`です。`offset`と`types`は`NumberOfCells`個ずつ並びます。

`connectivity`の列から`offset`番目（1始まり）までの並びをとってきて、`types`で指定された要素を表示する動作を、データがなくなるまで繰り返します。
![triangle.png](https://qiita-image-store.s3.amazonaws.com/0/159352/d52599ec-083f-133b-6551-1ac647d4c401.png)
PyCharmのInvalid VCS root mappingsワーニングを出さなくする方法

## 解決方法

1. メニューのHelpを開く
2. [Notification]で検索
3. [Vcs Important Messages]の[Poup]を[No popup]にする（下図）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103491/d9449d5b-3243-b0ae-93a5-23339c311743.png)


## 備考
VCSはバージョン管理システムのこと。
「matplotlib を日本語に対応させる」系記事の補完

# はじめに
世に星の数ほどある matplotlib 日本語対応系（豆腐解消系）の記事ですが、それらを見て設定したはずなのに上手くいかないことがたまにあります。
ググっても対処法がすぐに見つからなかったものをまとめます。

# 実行環境
- CentOS 7.3
- Python 3.6.5
- matplotlib 3.0.2

# pyenv-virtualenv におけるフォントファイルの置き場所がわからない
日本語対応フォントをダウンロードして所定の場所に置くときに、環境デフォルトの `matplotlibrc` を探しに行きます。
このパスの近くに `fonts/ttf/` ディレクトリがあるので、フォント ttf ファイルをコピーして設置します。

```python:python
import matplotlib
matplotlib.matplotlib_fname()
```

ただし、**既に `~/.matplotlib/matplotlibrc` を作成している場合、上記コマンドでデフォルトパスが表示されず**、ttf ファイルってどこに置けばいいんだっけ... となります。
特に pyenv-virtualenv 環境で、環境構築に詳しくないけど便利だから使ってる（私です）みたいな場合、とにかく見つかりません。

pyenv-virtualenv 環境を使っている場合、ttf ファイルは以下ディレクトリに置きましょう。

```
~/.pyenv/versions/<pyenv name>/envs/<virtualenv name>/lib/python<version>/site-packages/matplotlib/mpl-data/fonts/ttf/
```

# 自分で作成した matplotlibrc が参照されない
フォントの指定を `matplotlibrc` 内で行うのですが、環境デフォルトのファイルを編集することはあまり推奨されず、ホームディレクトリ以下に `~/.matplotlib/matplotlibrc` を作成して、その中にフォントの指定を記載します。
普通はデフォルトの `matplotlibrc` ではなく `~/.matplotlib/matplotlibrc` を優先して参照するようになっているのですが、何かの影響で**デフォルトの `matplotlibrc` を参照したままになってしまう**ことがあります。

`matplotlibrc` は**環境変数 `MATPLOTLIBRC` で指定されたディレクトリ**以下を探しに行くので、確認してデフォルトのままになっている場合は `~/.bashrc` などで明示的に指定しましょう。

```bash:bash
echo $MATPLOTLIBRC
```

```bash:~/.bashrc
# 想定したパスと違った場合、以下を追記
export MATPLOTLIBRC=$HOME/.matplotlib
```

# キャッシュが削除されない
さあ設定が終わってプロットしてみるぞ！と意気込んだものの、まだグラフタイトルに豆腐が鎮座していて「うわ...」ってなること、よくあります。
フォントの設定を済ませたらフォントのキャッシュファイルを削除する必要があるのですが、**それっぽいファイルが色んな所にあって**、消しても消しても設定が反映されません。

消すべきキャッシュファイルは以下コマンドで確認できます。
示されたディテクトリ以下のファイルを削除しましょう。

```python:python
import matplotlib
matplotlib.get_cachedir()
# ~/.cache/matplotlib などが返ってくるので、そこ以下のファイルを削除する
```

# おわりに
筆者は良く pyenv-virtualenv で環境の切り分けを行っているのですが、毎度「matplotlib 日本語」でググっているので、自分の備忘95%でまとめました。
お役に立つことがあれば幸いです。

# いつもたどり着くページ
http://kaisk.hatenadiary.com/entry/2015/02/15/215831
[論文メモ] Inductive Representation Learning on Large Graphs

"Graph Convolutional Neural Networks for Web-Scale Recommender Systems"を理解するために読む。

# 情報
- [Inductive Representation Learning on Large Graphs](https://arxiv.org/abs/1706.02216)
- この記事の画像は上記論文からの転載。

# 簡単にまとめると
- GraphへのDLのアプローチの多くは、学習時にすべてのノードの情報が必要としており、学習時に未知のノードへの推論の適用はできないものが多い。
- この論文で紹介するGraphSAGEは未知のノードのembeddingを計算することができる。
- 学習時に各ノードのembeddingを学習するのではなく、近傍の情報からembeddingを計算するためのaggregate関数を学習する。

# 1 Introduction
- グラフ構造は推薦システムや多くのタスクで有用であることが示されてきた。
- しかし、既存の多くのアルゴリズムは学習時に全てのグラフ構造を必要としており、未知のnodeに対して推論することはできない。
- この論文で提案するGraphSAGEは個々のノードに対するembeddingを学習するのではなく、ノードの近傍から特徴を集約する関数群を学習させる。
- 教師なし学習としてembeddingを学習させることもできるし、特定の課題への教師あり学習をさせることもできる。

# 2 Related work
### Factorization-based embedding approaches

- これらの方法は新しいノードに対するembeddingを計算するのコストが高いものが多い。

### Supervised learning over graphs

- 既存の方法はグラフやサブグラフの分類を試みているが、この論文では個別のノードの分類を考える。

### Graph convolutional networks 

- 既存の多くの方法ではスケールしない。大規模なグラフには適用できない。全体のLaplacianを必要とすることが多い。


# 3 Proposed method: GraphSAGE
## 3.1 Embedding generation (i.e., forward propagation) algorithm
![スクリーンショット 2018-11-14 9.47.00.png](https://qiita-image-store.s3.amazonaws.com/0/199247/fd5363bc-5cf3-2b7d-6c96-0d5d119862f0.png)

- embeddingを計算するアルゴリズムについて説明する。
- 上記のアルゴリズムで使われている $\text{AGGREGATE}_k$ と $W^k$ は学習済みとする。
- AGGREGATE関数はノードの近傍から情報を集約する。
- Wはモデルの異なる層の情報を伝搬するために使われる。
- このアルゴリズムでは、イテレーションを繰り返すことで、各ノードは近傍のノードの情報を集約していく。さらに各ノードは近傍より遠いノードの情報も得ていくことになる。
- 入力として、グラフ構造とノードの特徴量が与える。
- 学習時に入力とするのはグラフ構造の一部であり、推論時に新しいノードも含んだグラフ全体を与える。

### Relation to the Weisfeiler-Lehman Isomorphism Test

### Neighborhood definition
- 一定のサイズの近傍を用いる。
- 近傍はイテレーションごとにサンプリングする。
- $N(v)$ は $\\{u \in V : (u, v) \in E \\}$から一様に選択する。

## 3.2 Learning the parameters of GraphSAGE
- 近いノード同士は似たrepresentationを持つように、遠いノード同士は異なるrepresentationを持つようになるように損失関数を定める。

$$ J_g(z_u) = - \log(\sigma(z_u \cdot z_v)) - Q E_{v_n \sim P_n(v)}\log(\sigma(-z_u \cdot z_{v_n}))$$


- 特定のタスクのみでrepresentationを利用する場合、上記の教師なしの損失関数を置き換えることもできる。またcross-entropy lossなどを使うこともできる。


## 3.3 Aggregator Architectures
- 文章や画像などと異なり、ノードの近傍は自然な順序を持たない。
- Aggregate関数は順序に依存せず対象であることが望ましい。

### Mean aggregator
$$h_v^k \leftarrow \sigma(W \cdot \text{MEAN}(\\{h_v^{k-1}\\} \cup \\{h_u^{k-1}, \forall u \in N(v)\\}))$$

### LSTM aggregator
- LSTMはsymmetricではないので、ランダムな順序のノードに適用する。

### Pooling aggregator
$$\text{AGGREGATE}_k^{\text{pool}} = \max( \\{ \sigma(W_{pool} h_{u_i}^k + b), \forall u_i \in N(v) \\} )$$

# Experiments
### Experimental set-up
- 活性化関数としてRELUを使う。
- $K=2$
- 近傍のサンプルサイズ$S_1=25$、$S_2=10$
- コードなどは下記で公開されている
    - http://snap.stanford.edu/graphsage/

## 4.1 Inductive learning on evolving graphs: Citation and Reddit data
### Citation data
- 2000-2004年のデータを使って学習し、2005年のデータでテストを行った。
- Arora et al のアプローチで300次元のword2vecを使ってアブストラクトを処理し、各ノードの特徴量とした。
![スクリーンショット 2018-11-14 16.12.21.png](https://qiita-image-store.s3.amazonaws.com/0/199247/50da5b7f-a277-68b8-39f1-b09b9435a2e2.png)
EntityFrameworkからのDBアクセス時のみ処理速度が遅くなる問題への対処

覚書。というか投げやり。

理由としてはいくつか。

①パッチが当たってない。
　対処：下記URLから拾って適用
　　https://support.microsoft.com/ja-jp/help/3212523/fix-a-memory-leak-occurs-when-sql-server-procedure-cache-consumes-too

②ARITH ABORT がOFFになっている
　対処：DBに対して下記クエリをぶん投げる。
　　ARITH ABORT ON;

③コンテキストの遅延書き込みが無効になっている
　対処:dbContextをContextの変数名として、以下をC#コードのコンテキスト生成時に追加。
　　dbContext.Configuration.LazyLoadingEnabled = true;
プロキシサーバを複数通す場合のmod_rpafの設定

## 実現したいことおよび背景

Apacheにて動作しているWebサーバ環境にて
Webアプリケーション側で、`REMOTE_ADDR` 環境変数を見てアクセス制御していたり
Apacheのログ（`%h`）を使ってIPアドレス出力して、それを元に集計したり
アクセス制限したり（fail2banなど）している環境での話。

このような環境で、例えば前段にL7ロードバランサ入れたいとか
プロキシタイプのWAFを入れたい、とかなった場合。

そのままだと、`REMOTE_ADDR` 環境変数は、Apacheから見て直近のクライアントである
これらプロキシサーバのIPアドレスになってしまい
上記に記載したようなアクセス制限等が正しく動かなくなってしまう。
そこで、 `REMOTE_ADDR` を クライアントIPに書き換えるミドルウェアを入れて解決する。

なお、前提として Apache2.2系の話。2.4系は別のものがあるらしいが詳しくは知らない。

## mod_rpaf とは

オリジナルは Thomas Eibner という方が作った Apache モジュール。
上述のとおりプロキシサーバを経由するようなシステムにて
クライアントIPを `X-Forwarded-For` ヘッダから取得して `REMOTE_ADDR` に差し替えるという動作をする。
詳細はこちらの記事に詳しい。
https://heartbeats.jp/hbblog/2012/03/mod-rpaf.html
（本記事ではインストール方法や基本的な使い方には触れないので、この記事を参照してほしい）

ちなみに「rpaf」は「reverse proxy add forward」の略らしい。

なお、オリジナルの方のサイトはすでにアクセスできない状態になっている。
その後、mod_rpafは複数名の方が forkしている模様。
この記事で取り上げるmod_rpaf は、上記 HEARTBEATS 社ブログにある以下のものを指す。
https://github.com/ttkzw/mod_rpaf-0.6

## プロキシサーバを複数通す場合の設定

この記事の本題。

プロキシサーバが間に１つしか挟まない場合は
上述HEARTBEATS社のブログにある設定ですべてこと足りる。

だが、複数のプロキシサーバを経由する場合は、もう少し追加の設定が必要になる。
具体的には：

* 経由するプロキシサーバのIPアドレスを `RPAFproxy_ips` に追加
  * 複数エントリは空白区切りで列挙
*  `RPAFrecursive On` の設定を追加

こうすると、`REMOTE_ADDR`には、`X-Forwarded-For` ヘッダの
複数のIPアドレスを、末尾から順にたどり、
`RPAFproxy_ips` に登録されていない 最初のIPを返すようになる。
（設定Offだと、単純に `X-Forwarded-For` の末尾のエントリを返す）

### 例

|No|サーバ等|outboundのIPアドレス|
|---|---|---|
|1|クライアントIP|192.0.2.10|
|2|プロキシサーバA|10.0.0.20|
|3|プロキシサーバB|172.16.0.30|
|4|Webサーバ|192.168.0.40|

として、1→2→3→4 と経由する場合。
（上記には本質ではないので記載してないが、No2のプロキシはグローバルIPを持っていて
　No2～No4 は プライベートネットワークに閉じているとする）

まず、なにも設定しないとWebサーバが受け取る`REMOTE_ADDR`、`X-Forwarded-For`は以下のようになる。

`X-Forwarded-For`: 192.0.2.10,10.0.0.20
`REMOTE_ADDR`： 172.16.0.30  （No.3のもの）

次に、mod_rpafを導入、`RPAFrecursive`を Off または設定しないと以下のようになる

`X-Forwarded-For`: 192.0.2.10,10.0.0.20
`REMOTE_ADDR`： 10.0.0.20  （No.2のもの。`X-Forwarded-For` の末尾エントリ）

そして、`RPAFrecursive On`と`RPAFproxy_ips` に `10.0.0.20 172.16.0.30`を設定すると以下のようになる。

`X-Forwarded-For`: 192.0.2.10,10.0.0.20
`REMOTE_ADDR`： 192.0.2.10  （No.1のもの。`X-Forwarded-For` で RPAFproxy_ipsに含まれない、もっとも末尾にあるエントリ）
GCR(Google Container Registry)を高速で安価なDockerのプライベートリポジトリとして利用する(?)

## モチベーション

dockerイメージをgcrからpullするだけなら `gcloud docker pull/push` を利用するのが一番手軽で良いと思いますが、稀にgcloudコマンドをインストールせずにdockerコマンドのみある環境で [GCR](https://cloud.google.com/container-registry/) の認証を行いたい場合もあると思います。
そんな人のための記事になります。  

追記 : GCRを高速なプライベートリポジトリとして利用できるので、嬉しい人は多いかもしれない。ということでタイトルも変更。

## 事前準備

- gcloudコマンドインストールした端末を用意する
- gcpのプロジェクトは作成しておく

そのぐらい、gcloudインストールしたくないとはいっても、認証のトークンを取得するためにどこかの端末にインストールし、 `gcloud auth login` は済ませて置く必要があります

## 認証のトークンを取得する

以下のコマンドを実行し、出力されるトークン（割と長めな文字列）をメモしておく。

```bash
gcloud auth print-access-token
```

## GCRにdocker loginする

以下のようなコマンドで `docker login` する

```bash
docker login -u oauth2accesstoken -p {先程のトークン} https://asia.gcr.io
```

`Login Succeeded` と表示されればOK

## 試しに docker push/pull してみる

### Dockerfileを配置し、コンテナをbuildする

Dockerfileは以下のように

```Dockerfile
FROM alpine
CMD echo "hello! ore-dayo!"
```

Dockerfileを配置したディレクトリで以下のコマンドでdocker buildを行う

```bash
docker build -t asia.gcr.io/{project id}/oreore .
```

### コンテナをdockerコマンドでpushしてみる

以下のコマンドを実行

```bash
docker push asia.gcr.io/{project id}/oreore
```

問題なし。  
GCPのコンソールからGCRないにpushしたイメージが見えているはず。

### コンテナをdockerコマンドでpullしてみる(runする)

事前にbuildしたイメージは消しておく。

```bash
docker rmi {containerのid}
```

コンテナを実行する

```bash
docker run --rm asia.gcr.io/{project id}/oreore
```

コンテナイメージのpullが完了した後に、 `hello! ore-dayo!` と出れば成功。


これで gcloud をインストールしていない環境でも GCR からイメージをpush/pullできそう。

enjoy!
viエディタ基礎

#主旨

開発をしているとどうしても避けて通れないviエディタについて、まとめてみました。

#viエディタを使う意味
1. UNIX系OSには必ずインストールされている
    そのため、レンタルサーバーなど自由にアプリケーションのインストールが出来ない場合でもvimは入っている。
3. サーバーの管理者権限がなくても扱える。
    そのため、緊急事態ですぐに使える。逆に、FTPの場合は管理者権限が必要。
5. マウス操作不要
    テンキーやショートカットがたくさんあるため、マウス操作なしでも高速に操作が可能。ただし慣れが必要。


#モードの切り替え
"i", "Esc", ":"を押して、モードを切り替えます。

ノーマルモード
↓（"i"を押す）
インサートモード(入力可能な状態）
↓（"esc"を押す）
ノーマルモード
↓（":"を押す）
コマンドモード（ファイルを保存、終了するためのモード）

#コマンド
|キー入力内容|意味|
|:-:|:--:|
|x|1文字消す|
|dd|1行消す|
|●yy|●行コピーする（yankする）|
|p|yankしたものを貼り付ける|
|a|次に1文字入力する（インサートモード）|
|i|現在位置に入力する（インサートモード）|
|o|次の行の先頭から文字を入力|
|shift + d|カーソル位置から最後まで削除|
|h,j,k,l|左下上右　に移動|
|:w|上書き保存|
|:q|保存せずに終了（保存しなくてよいか確認が出る）|
|:wq|上書き保存して終了|
|:q!|保存せずにとにかく一発で終了|

他にもありますが、主だったものは以上です。