OmniAICreator/Qiita-1.07M huggingface dataset:
seabornのheatmapでy軸が足りなくて、annotが活用できない

## 2019/11/25追記
matplotlib3.1.2がリリースされて、解決されてました！
バージョンを上げましょう〜

## はじまり
セル内に数値を表示してくれる**annot**が使いたくて、matplotlibからseabornに移ろうと思いました。
以下のコードで確認をしていたところ…

```python
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

flights_long = sns.load_dataset("flights")
flights = flights_long.pivot("month", "year", "passengers")

fig, ax = plt.subplots(figsize=(6, 6))
sns.heatmap(flights, annot=True, fmt="d", linewidths=.5, ax=ax, square=True)
```

![index_pre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206914/27e63d0e-d8b5-0553-6b21-9b8aa31c473a.png)

y軸の端が足りなくて、数値が切れてしまいました。

## 結論
調べてみてもいい答えを探し当てることができなかったので、応急処置としてylimを定義することで回避しました。
追加したのは、最後の1行のみです。
一般的な表記として、`ax.set_ylim(${y軸の要素数}, 0)`とすれば、切れるのは回避できます。

```python
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

flights_long = sns.load_dataset("flights")
flights = flights_long.pivot("month", "year", "passengers")

fig, ax = plt.subplots(figsize=(6, 6))
sns.heatmap(flights, annot=True, fmt="d", linewidths=.5, ax=ax, square=True)
ax.set_ylim(len(flights), 0)
```

![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206914/66c24c8b-9310-e757-7481-e72fcac3de82.png)
pythonで継承とsuper()を使って派生クラスをinitしてみよう

次のようなクラスを作りたいと考えたとします。

- 親クラスのクラス変数に`5`を持つ
- 親クラスのクラスメソッドでは、親子両方のクラス変数を使って何か適当な計算を行い、その結果を返す
    - 適当な計算の中身は、親クラス変数の`5`と子クラス変数のxを足してその和に`2`をかける、というものにしました。
    - 今回、親クラスのインスタンス化については考えないことにします。

まずは親クラスのクラス変数と、そのクラスメソッドを書いてみます。

```動作確認してません.py
class Parent:
  def __init__(self, child_num):
    self._parent_num = 5
    self._child_num = child_num

  def calc(self):
    result = (self._parent_num + self._child_num) * 2
    return result
```

子クラスについても書いてみます。子クラスのクラス変数は仮に`3`と`4`にしてみましょう。
継承をすると、親クラスと同じメソッドは子クラスで宣言しなくても使えるので、`calc`メソッドの定義は必要なさそうです。
しかし、`3`と`4`については親との差分なので、次のような記述が必要になるかもしれません。

```動作確認してません.py
class Child_A(Parent):
  def __init__(self):
    self._child_num = 3

class Child_B(Parent):
  def __init__(self):
    self._child_num = 4
```

ところが、これで`Child_A().calc()`を実行するとエラーになってしまいます。
エラーの原因は`self._parent_num`が定義されていないというものになるはずです。

親で定義されているはずなのに、定義されていないなんてエラーが出るのはなぜ？
これは、子で改めて`__init__`を定義したせいで、親の`__init__`が上書きされてしまったからなんですね。
`self._parent_num`を定義しているのはあくまでも親の`__init__`ですので、子のほうで上書きしてしまうと未定義のままになってしまうわけです。

となると、次のように書くしかないのでしょうか？

```動作確認してません.py
class Child_A(Parent):
  def __init__(self):
    self._parent_num = 5 # この同じ内容を何度も書かなければいけないのか？
    self._child_num = 3

class Child_B(Parent):
  def __init__(self):
    self._parent_num = 5 # この同じ内容を何度も書かなければいけないのか？
    self._child_num = 4
```

この書き方であればエラーは起こらないでしょうが、あまり良い方法とは言えません。
子クラスが何十個も必要になったり、あとから`self._parent_num`の値を変えたくなったり、そもそも親クラスのクラス変数がたくさん定義されているような場合になると目がくらんでくるでしょう。

**そこで役に立つのが`super()`というわけです。**
公式ドキュメントの記述はこちらになります。
[super([type[, object-or-type]])](https://docs.python.org/ja/3/library/functions.html?highlight=super#super)
しかし、公式の内容はあまりに網羅的・あまりに詳細なので、パッと理解するにはいささか複雑すぎます（もちろん、しっかりとした理解を得るためにはそういった記述が必要になります）。
ここでは、現在問題にしているケースでの使い方に絞って見ていくことにします。

`super()`とは、少なくともここで問題にしているケースにおいては、**親クラスのメソッドを実行してくれるもの**として役に立ってくれます。
次のようなクラス定義について考えてみましょう。

```動作確認してません.py
class Child_A(Parent):
  def __init__(self):
    super().__init__(3)
```

とても不思議なクラス定義が現れました。
しかし、しっかり読んでみれば話は簡単です。
`super()`とは、少なくともここでは、親クラスのメソッドを実行してくれるものとして役に立ってくれるものでした。
そのため、子クラスの中で実行した`super().__init__(3)`というコードは、親クラスの`def __init__(self, child_num)`の引数`child_num`に対して`3`を渡してインスタンス化するという処理を実行してくれるコードとなっているのです。
結果として`Child_A`クラスの中の`__init__`そのものは親クラスとは異なる（上書きされた）内容となっていますが、その中では親クラスの`__init__`と全く同じ処理を通ってくれています。
それゆえ、`super()`を使わなかった場合に未定義となっていた`self._parent_num`も`Child_A`の中からしっかりと参照できますし、`self._child_num`の値にも`3`が代入されている状態で利用することができます。

従って、子を子をいくつも作りたい場合は次のようなコードを書くと幸せになれるでしょう。

```動作確認してません.py
class Parent(object): # object型を継承
  def __init__(self, child_num):
    self._parent_num = 5
    self._child_num = child_num

  def calc(self):
    result = (self._parente_num + self._child_num) * 2
    return result

class Child_A(Parent):
  def __init__(self):
    super().__init__(3)

class Child_B(Parent):
  def __init__(self):
    super().__init__(4)
```

おや！注意深い方は、親クラスの方にも何か変更が加えられているのに気が付くでしょう。
実は、`super()`を使って親クラスのメソッドを実行したいなら、親クラスは`object`型を継承している必要があります。
最初のコードでは`object`型を継承するように書いていませんでした。例えの説明に必要なかったので。
実装してみるときはお気を付けください。それでは。
JavaScript本格入門 勉強メモ

[JavaScript本格入門](https://www.amazon.co.jp/dp/477418411X/ref=cm_sw_r_tw_dp_U_x_wxAJCbT3GGKT9)(ISBN 978-4774184111)で基礎からJavaScriptを勉強するシリーズです。各セクションで興味深かったり、学んだ内容を自分なりに整理してまとめています。
ここは各セクションのまとめページです。

| タイトル | 概要 |
| --- | --- |
| [Chapter1 Hello JavaScript！](https://qiita.com/tkymeno2/items/06edc460533f482a2462) | ECMAScriptって？|
| [Chapter2 変数と定数について](https://qiita.com/tkymeno2/items/1b624bf2b721eea151df) | varを使うべき？let使うべき？などを簡単にまとめました |
| [Chapter3 Symbolオブジェクトについて](https://qiita.com/tkymeno2/items/bdf2e9609d64616b9aed) | Symbolオブジェクトを使ったことがなかったので調べて使い道をまとめました |
| [Chapter4 関数について](https://qiita.com/tkymeno2/items/93b3699fb0a691f8eac0) | アロー記法だったりfunction命令だったりぱっとしてなかったところを勉強しました |
| [Chapter5-1 setterとgetterについて](https://qiita.com/tkymeno2/items/d82b5372eb8484d32336) | アクセサーメソッドの実装を行ってみました |
| [Chapter5-2 イテレータ](https://qiita.com/tkymeno2/items/aa2b514449ce67499c21) | for...ofとイテレータを使って便利なループを実装します |
| [Chapter7 非同期処理の設計・実装](https://qiita.com/tkymeno2/items/13adabeaef2773fad874) | 非同期処理や同期処理を実装する方法を学びました |
| [Chapter8 コーディング規約](https://qiita.com/tkymeno2/items/e02fe36daded6439402c) | JavaScriptの有名どころのコーディング規約について調べ、ソースコードを自動チェックする環境を準備してみました |
[ssh]Too many authentication failures for... のエラー

sshしようとしたら認証失敗回数が多すぎた旨のエラーが。
他にも同じ記事はたくさんあるので備忘録

```
$ ssh hogehoge.xxxxx.co.jp
Received disconnect from 1xx.2.xyy.xxx: 2: Too many authentication failures for myusename
ssh_exchange_identification: Connection closed by remote host
```

複数の鍵情報を登録していて、登録された鍵を順番に見ていくうちに認証の制限回数に達してしまってエラーが出ている。
つまり鍵の登録数が多すぎるとこのエラーが出てしまう。

### 解決法1: identitiesOnly yes 
~/.ssh/config に、

```
identitiesOnly yes
```

を追記すれば良いという記事が多かったのですが、これってたしか指定された秘密鍵のみを使用するよう指定するオプションですよね。

```
IdentityFile ~/.ssh/id_rsa
```

みたいに秘密鍵の指定もいるのでは？？と思ったのですが違うのでしょうか。。
~~そもそもみんなちゃんとHostごとに秘密鍵を指定していることが前提なのかもしれない ずぼらでしていなかった そりゃ怒られる~~


### 解決法2: ssh-agentに登録している鍵を消す
あとssh-agentに登録している鍵を消してしまう。
自分はちゃんと秘密鍵指定をしていなかったので、こっちで対応した。
登録していなかった分持ち回した鍵が多すぎたのかもしれない。。

```
ssh-add -D
```

### 多謝
[configを書くことでsshを便利で簡単にしよう！](https://koejima.com/archives/583/)
[sshで「Too many authentication failures for ...」が出た場合の対処法](https://tkuchiki.hatenablog.com/entry/2013/02/20/104609)
[ssh接続でToo many authentication failuresが出る](https://qiita.com/kiyodori/items/971ef06969bbb2b50aaa)
VuetifyのDatepickerの値が消えない

VuetifyのDatepicker、すごく便利なんだけど、`v-text-field`と一緒に使った時によく使う`clearable`で値が消えないなーと思っていたメモ。


## 何したのか
`v-text-field`に`@click:clear="date = null"`を追加した。


コードは公式サンプルを利用
https://vuetifyjs.com/en/components/date-pickers#date-pickers-formatting-date-using-external-libs

```vue
<template>
  <v-menu
    v-model="menu1"
    :close-on-content-click="false"
    full-width
    max-width="290"
  >
    <template v-slot:activator="{ on }">
      <v-text-field
        :value="computedDateFormattedMomentjs"
        clearable
        label="Formatted with Moment.js"
        readonly
        v-on="on"
        @click:clear="date = null" // ←を追加
      ></v-text-field>
    </template>
    <v-date-picker
      v-model="date"
      @change="menu1 = false"
    ></v-date-picker>
  </v-menu>
</template>
```

## 消えなかった理由
`v-text-field`を普通に使ってるだけなら`clearable`オプションを追加するだけでいいけど、他の要素と組み合わせて使う時`readonly`をつけてる。多分これが原因。
見た目部分だけは消せるけど、v-modelで紐付けられた値に変更後の値を返さないよーってなってるはず。


以上！
Logstash入門

# Logstashとは
Logstashは、Elastic社が提供するリアルタイムのパイプライン機能を備えたデータ収集管理ツールのことです。
オープンソースであり、ELK（ElasticSearch、Logstash、Kibana）スタックの一部です。Logstashは、大量かつ多様なデータを利用して、分析を促進します。

## Logstashキーコンセプト、および、内部アーキテクチャ
### Event Object
Logstashパイプラインにおけるデータ・フローをカプセル化Logstashの主目的です。 Logstashは、入力データを格納し、フィルタ段の間に作成された余分なフィールドを追加するには、このオブジェクトを使用しています。
Logstashは、イベントを操作するために、開発者にイベントAPIを提供しています。このチュートリアルでは、このイベントは、データイベント、ログイベント、ログデータ、入力ログデータ、出力ログデータなどのログのような様々な名前で呼ばれています。

<img width="349" alt="logstashPipeLine.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364234/13eff050-4ccb-e066-06ef-37d8567fa087.png">

### LogstashPipeline
入力から出力にLogstashにおけるデータフローステージの備えます。入力データは、パイプラインに入力され、イベントの形で処理されます。次いで、ユーザまたはエンドシステムの望ましい形式で出力先に送信します。

### Inputs
さらなる処理のためLogstashのデータを取得するために使用されLogstashパイプラインの最初の段階です。 Logstashは、異なるプラットフォームからデータを取得するために、様々なプラグインを提供しています。最も一般的に使用されるプラグインのいくつかは - File, Syslog, RedisのとBeatsです。

### Filters
これは、イベントの実際の処理が行わLogstash、中盤です。開発者は、受け付けた入力イベントのためのイベントと基準のフィールドを区別するためのシーケンスを作成するLogstashによって事前に定義された正規表現パターンを使用することができます。
Logstashは望ましい構造にイベントを解析して変換する開発者を支援するために、様々なプラグインを提供しています。最も一般的に使用されるフィルタプラグインのいくつかは -  Grok, Mutate, Drop, Clone とGeoIPです。

### Outputs
これはLogstashの中期段階で、イベントの実際の処理が行われます。開発者はLogstashによる事前定義済みのRegex Patternsを使用して、イベント内のフィールドと受け入れられた入力イベントの基準を区別するためのシーケンスを作成できます。
Logstashは、開発者がイベントを解析して望ましい構造に変換するのに役立つさまざまなプラグインを提供します。最も一般的に使用されているフィルタープラグインのいくつかは -  Grok、Mutate、Drop、CloneそしてGeoipです。


すごい簡単な構造の概要になりますが、以上になります。
また今度Logstashパイプラインの例で説明したいと思います。


### Logstashのインストール手順
https://www.elastic.co/guide/jp/logstash/current/installing-logstash.html


### 参考
こちらを参考に自分の思いを記載させていいただきます。
https://www.elastic.co/guide/jp/logstash/current/introduction.html
リモートリポジトリのブランチとローカルのブランチの状態を強制的に一致させる方法

コードレビューのときにfeatureブランチをローカルに落としたいときや、ローカルでブランチのマージ作業をしたいときなど、リモートリポジトリとローカルのブランチの状態を強制的に一致させたいときがあります。

そのようなときに行う手順をまとめました。

## 手順

```
### リモートリポジトリの最新情報を取得
$ git fetch

### 対象ブランチにチェックアウト
$ git checkout {ブランチ名}

### 強制的に最新のコミットの状態にする
$ git reset --hard origin/{ブランチ名}
```

## 補足: 対象ブランチにチェックアウトする方法について
リモートリポジトリのブランチにローカルでチェックアウトする方法でよく紹介されている方法は以下です。

```
$ git checkout -b {ブランチ名} origin/{ブランチ名}
```

しかし、以下の方法でもチェックアウト可能です。[^git-checkout]

```
$ git checkout {ブランチ名}
```

もし、ローカルにチェックアウトする対象のブランチと同じブランチ名がある場合、`git checkout -b` ではエラーになってしまいます。
例えば、`master`というブランチ名がローカルにすでにある場合、`git checkout -b master origin/master`とするとエラーになります。

`git checkout`の方法ですと、すでに同じ名前のブランチ名がある場合は単純にチェックアウトするだけになりますし、同じ名前のブランチ名がなければリモートリポジトリのブランチをチェックアウトしてくることが可能になります。

ですので、`git checkout`の方法を利用するほうがオススメです。

[^git-checkout]: [How do I check out a remote Git branch?](https://stackoverflow.com/questions/1783405/how-do-i-check-out-a-remote-git-branch)
【Ruby】配列に入ったテーブルのデータを、特定のカラムを指定して並び替える

#やりたいこと
通常テーブル内のデータの並び替えをする際は
`モデル名.order('カラム名 desc')`等で簡単に実行できます。
しかし今回はテーブル内全体のデータを対象とせずに、あらかじめ特定の条件に合ったレコードのみ配列に入れてあることを前提とします。
例えば以下のような感じ。

```
users = [
  #<User:0x000056357bd5c9b8>
  id: 2
  name: "たろう",
  age: 16,
  copuntry: "Japan",
  #<User:0x000056357bd5c710>
  id: 6
  name: "はなこ",
  age: 17,
  copuntry: "US",

　 ・
　 ・
　 ・
]

```
この配列に対して並び替えを行いたいが、orderメソッドはそもそもモデルを対象にしか使用できません。
今回は配列にデータを入れてしまっているので、配列のデータの並び替え、しかも特定のカラムの値を対象に並び替えたいです。

#試行錯誤の履歴(必要ない方は飛ばしてください)
配列の並び替えだからsort_byメソッドだろうと予測はつきました。
https://ref.xaio.jp/ruby/classes/array/sort_by_bang
###●sort_byメソッドの使い方
こちらのRubyリファレンスをそのまま抜粋すると、使用方法は以下のような感じ。

```test.rb
animals = ["mouse", "cat", "hippopotamus", "giraffe"]
p animals.sort_by {|anim| anim.size }

#出力結果 ==> ["cat", "mouse", "giraffe", "hippopotamus"]
```
配列animalsの要素を、字数順に並べています。
この配列の場合は、配列の要素が単純なので問題はないんですが、
今回は配列の要素(１つのレコード)のさらに中の、カラムの値を指定して並び替える必要があるので、少し躓いてしまいました。

###●そもそも配列に保存されたデータ形式はどうなっているのか
そもそも配列にしたデータは、カラムを指定して特定の要素を呼び出せるのかが不安でした。
配列にしちゃってる時点で、nameやage等のカラム名をカラムとして認識してくれるのかわかりませんでした。

しかし、改めてよく配列を見てみると`#<User:0x000056357bd5c9b8>`とある。。
これは、"ちゃんとテーブルのデータとして一つ一つ保存している"に違いない！ということで
試しにコンソールで以下を実施してみました。

```console
users[0][:name] 

# 配列usersの１番目のデータを取得し、さらにそのnameカラムを指定してみる
# 出力結果==> "たろう"
```
ちゃんと拾えました！
データを配列に入れた際、ただの文字列として保存されるのではなく、テーブルのデータとして認識して保存されてるんですね。
多分超基本なんでしょうが、私は今回でやっと認識できました。。
基本すぎてすみません。。配列に関しての理解がまだまだでした。

#結果
以上のように色々と試行錯誤した結果、とてもシンプルに実行することができました！
例えばこの記事の一番上の配列usersに対して、ageカラムの値で並び替えしたい場合は、

```test.rb
users.sort_by(&:age)
```
これだけです！
こうすると、ageの値が小さい順にデータを並び替えることができます。
sort_byメソッドの引数にageを指定するだけでした。
簡単すぎます。
SpringBootでキューを使いたかった

## SpringBootでキューに処理を積む流れ

1. pomにlombokを追加
2. mainメソッドを持つクラスにスレッドプールのBeanを作成+@EnableAsyncをつける
3. 非同期処理を作成する。対象メソッドに@Async("スレッド名")をつける
4. 呼び出しは一般的なメソッドと違いはない

## pom

```
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>provided</scope>
  </dependency>
```


## Applicationクラス

```
@SpringBootApplication
@EnableAsync
public class Application {

    省略

    /**
     *
     * @return キューを使用するためのスレッドプール
     */
    @Bean("Thread1")
    public Executor taskExecutor() {

        final Logger log = LoggerFactory.getLogger(Quuhelper.class);

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //スレッドを並列でいくつ立てるか
        executor.setCorePoolSize(1);
        //キューがマックスになったときにスレッドの数をいくつまで増やすか
        executor.setMaxPoolSize(2);
        //キューはいくつまで積むか
        executor.setQueueCapacity(500);
        executor.initialize();
        return executor;
    }
}
```


## 処理部分

```
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;



@Slf4j
@Service
public class Quuhelper {

    static final Logger log = LoggerFactory.getLogger(Quuhelper.class);

    /**
     * テスト
     */
    @Async("Thread1")
    public void heavyTask() {
        try {
            log.info("start task");
            TimeUnit.SECONDS.sleep(10);
            log.info("end task");
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}
```


## 非同期処理呼び出し元(ControllerやService)

```
    @Autowired
    private Quuhelper quuhelper;

    @GetMapping(path = "/test")
    public void test() {
        quuhelper.heavyTask();
    }
```

参考  
[Spring 非同期タスクの同時実行数を制限する](https://qiita.com/kimullaa/items/59546ea68681673bd7e9)
Visual Studioの便利機能(自分用メモ)

#前書き
私は現在(2019年)大学2年生で情報系の大学に所属しています。
私が大学生活の中で学んだプログラミングに関する便利な機能などをメモ書きしてある、自分用メモです。私は主に開発環境として主にvisual studio, android studioを使ってます。「他のIDEでも、それできるよ？？」などのコメントは控えていただくと幸いです。あくまでも自分メモなので。
書いてあることがわかりにくいかもしれませんが、ご了承ください。
現在勉強中の言語:C/C++/Java/Python/
#本題
Visual Studioでの便利な機能をいくつか紹介していきます。

###>変数の一括編集
- 1 適当なコードを書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417709/ff7ace61-81ed-7550-c985-459c4aec347c.png)

- 2 一括編集したい変数名にカーソルをあわせて一度クリックします。
そしたら「Ctrl + F」を押します。
すると、以下の写真の右上に表示されてるボックスが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417709/f15c1727-2884-9335-621f-b7d2f50592e6.png)

- 3 出てきたボックスに、現在の変数名が書かれてます。
 変数名の右にある下矢印を押したら新たなボックスが出てきます。
 そこに、新しい変数名を入力してください。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417709/83ceb6b3-f3a3-28ec-8b7a-1701af9d9be9.png)

- 4 新しい変数名を入力し終えたら、先ほどの写真の赤矢印のところをクリックします。(すべて置換する場合)
 以下のようなダイアログが表示されたら変数名の一括編集が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417709/6e7f3f1b-cce4-7b54-2d0b-bcbbcb615c9b.png)

#####※注意
例えば、「p」という変数名を「p1」と変更したい場合先ほどの操作を行うとすべての「p」がつくコードの後に「1」が追加されてしまいます。
要するに、「printf…」などのコードが「p1rintf」となってしましますので注意が必要です。(できるだけ変数名は、英単語を使うなど他人が見てもわかりやすい変数名を使いましょうｗ)
RでBigQueryに接続する(bigrquery)

# パッケージをインストール・読み込み
```r
install.packages("bigrquery")
library(bigrquery)
```

# バージョンによって関数が使えたり使えなかったりして困った
r-version 3.3.3

```r
project <-'プロジェクト名'
sql <- "SELECT * FROM データセット名.テーブル名 "
data <- query_exec(sql, project = project, useLegacySql = FALSE)
```
r-version 3.6.1

```r
sql <- 'SELECT * FROM データセット名.テーブル名'
tb <- bq_project_query('プロジェクト名', sql)
customer_repeater_restaurants <- bq_table_download(tb)
```
【初心者】pythonで０から Project Euler を解いてみた 2

久々の投稿になってしまいました…
最近、誕生日前なのにバイトを詰め込まれとてもとてもとても疲れている私です。:fearful:
とゆうことでProject Euler2問目解いていきましょう！！
### Euler2問目
>
フィボナッチ数列の項は前の2つの項の和である. 
最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
>
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202

では、解いていきましょう！
###プログラム

```python
a,b = 1,2
#aは最初の項,bは２項目として定義します
c = 2 
#bの最初の値を入れるために２にしています
while b < 4000000:
#bが4000000になるまで実行します
    a,b = b,a+b 
#a = b,b = a+bにします（同時に）     
    if b % 2 == 0: 
#bが2で割り切れるつまり偶数の時に実行します。
        c += b
#cという箱にフィボナッチ数列かつ偶数のｂという数を足していきます
    print(c)
#足されてきたものを全て表示します 
```
今回はプログラムにも中にコメントしました
作っているときに分かりやすくどこでなにをしているのかわかるようにしたかったからです
難しかったところはa,b = b,a + bを分けてはいけないところですこれはコンピューターの中で計算するタイミングの差で同時にしないと答えが変わってきます
他は割とわかりやすいコードでできました
###おわり
今回も頑張ってとけました
みなさんも楽しくプログラミングしましょう！！
それでは私はバイトに行くとします。:scream:おつかれさまでした
0.1ぐらいから始めるProjectEuler@python

どもども、とある学生です。
課題でProjectEulerをやりつつブログに成果等々をまとめることになったのでやっていきます。
Cを少し触ったことがある程度で、数学は全然できませんが頑張っていきます。
非常に遅いペースになるとは思いますが、生暖かい目で見守ってください。
【初心者】pythonで０から Project Euler を解いてみた

####~初めに~
私は今までプログラムを全くやったことがなくpythonの練習としてProject Eluerを解いています。なのでコードが長くなったりまとまっていないところが多いです。

<b>
この記事は初めてpythonをやる人や興味があるけどわからない人のためのこんな感じだよっていう記事です</b>


プログラムできる人が読んだら「なんだこれ」みたいな所も多々あると思いますがその人は「こうしたらどうや」みたいなことを言ってもらえると私が<u>とてもとても喜びます</u>


ブログも初めてなのでブログの書き方で意見がありましたらそれもご指摘お願いします。私が泣いて喜びます

####Euler 1問目
> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
>
[http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201]

まず私は頭をフル回転させてどう解くか考えました

1. 1000未満3の倍数と5の倍数と１５の倍数をそれぞれ出す
1. 出した倍数を使い<br>
【３の倍数　+　５の倍数　－　15の倍数】の計算
この計算をうまくできれば答えはでるなと思いプログラムを書き始めました
####プログラム
このコードは私がほぼ全部考えたコードです

```python
AA = 0
BB = 0
CC = 0
for A in range(1000):
    A  *= 3
    A < 1000
    if A < 1000:
        AA += A
        print(AA)
for B in range(1000):
     B  *= 5
     B < 1000
     if B < 1000:
        BB += B
        print(B)
for C in range(1000):
     C  *= 15
     C < 1000
     if C < 1000:
        CC += C
        print(CC)

print(AA + BB - CC)
```

これから全くプログラミンがわからない人のための私のできる限りの説明をはじめはす。<b><u>いらねぇーよって人は飛ばしてください！！</u></b>

まず、AA,BB,CCは箱みたいな物でここに計算したものを詰めていきます

for A in range(1000):は
for 繰り返しのループと呼ばれるもの
A in はAというものをみたいな感じで
range(1000) は０～999回繰り返す文です
なのでfor A in range(1000):を日本語っぽく言うと<br>「Aという物を1000回繰り返す」って感じです

A *= 3 は３の倍数を出すためのプログラムでAに毎回３をかける文です

if A < 1000: はもしAが1000未満の時に実行しますって文です

AA　+＝　A で用意しておいてAAに３の倍数のAを毎回足していきますという文

print() は実行したときに結果を見せてくれるコードです

今回のコードはこんな感じです
とてもとても簡単なコードで作りました！！が長いです
0から始めたのでこれが私の精一杯でした
####まとめ
今回私は自分で考えて答えがでた時はものすごい達成感でした！

なので皆さんも自分で考えていろんなものを作ってください！

あと、わからないところが出てきたらわかる人にすぐ聞いた方がいいですよ！

調べても私は知りたいところがよくわからなかったりしましたなので周りの少しわかる人に聞いたらわかりやすく自分の聞きたい所をちゃんと解説してくれました。

なので恥ずかしがらず周りの人やネットの人々に聞いてみるのがいいとおもいます！！
ぜひ、みんなで頑張りましょう！！
【初心者】pythonで0からProject Euler解いてみた 3

こんにちは！！
最近、7payが問題があり使えなくなりましたね
私、セブンのバイトMANなのですが支払い方法多いと大変なので少し良かったです(笑)
バーコード決済はとても便利でいいと思いますが危険性もあるなーと感じた一件でした。
それではPoject Euler解いていきましょう！！:heart_eyes:
###3問目
13195 の素因数は 5, 7, 13, 29 である.
600851475143 の素因数のうち最大のものを求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203
今回は素因数分解していけばいいかなーって思いました。
ただ、素数ってプログラムとても面倒でプログラミング初めての私にはできなそうだったのでやり方を変えました
###プログラム

```python

a = 600851475143
i = 0
while i in range(10000):
    #iを10000までループする
    i += 1
    #iを毎回1ずつ足していく
    if a % i == 0:
        #a ÷ iをしたとき割り切れたら実行
        print(i)
        #割り切れた時の割った数を表示する

```
私はこのように作りました。
最後に出力されたものが答えです。
ただ、このプログラムはあまりよくはないです。
なぜなら**range(10000)のところの根拠がない！！**
ここがアカンのでこのプログラムは完成ではないです。
**なにか意見やこうしたらええんやで！！みたいなのも募集です**
私は皆さんの力も借りつつこのブログを完成させたいと思っています:kissing_heart:
pandasのDataFrameを可視化する

# pandasのDataFrameを可視化する

## 概要

* `pandas`の`DataFrame`の内容をexcelのように見るために、`dfgui`が便利
* `dfgui`は`DataFrame`を引数で呼び出すだけで以下のことができるようになる。

	* `DataFrame`の内容を表形式で見ることができる
	* 表示させる列を選択できる
	* 列毎にfilterをかけることができる
	* 二次元プロットを描画できる
	* ヒストグラムを描画できる

## `dfgui`について

[dfgui](https://github.com/bluenote10/PandasDataFrameGUI)は`DataFrame`を読み込んで可視化するためのモジュール。

`pandas`の`DataFrame`はよく使用しているが、例えば大きなcsvを読み込んだりした時、ざっとどんなデータが入っているのか見て確認したいような時、どうしたらいいんだろうと思っていた。それこそエクセルのように表形式で見られたらいいのに…と。

そこで、今回紹介する`dfgui`は、`DataFrame`形式を引数に渡すだけでエクセルのような表で見られるだけでなく、様々な機能も素早く提供してくれる、痒いところに手が届くモジュール。

### インストール

以下のコマンドでインストール可能

```
pip install git+https://github.com/bluenote10/PandasDataFrameGUI
```

### 依存関係

* pandas/numpy
* matplotlib
* wx

wxは入っていないことがあるかもしれず、またpipでインストールする時に自動でインストールされない。そのため自分でインストールする必要がある。ここは少しハードルがあるかも(特にwindows環境では)

## 使用方法

### 基本的な使い方

以下のような単純極まる使い方でok.

```
import dfgui
dfgui.show(df)
```

### DataFrameの可視化

* 基本画面。

	* 列をダブルクリックでソートできる
	* セル上を右クリックでクリップボードに値をコピーできる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277647/a2106a62-87e9-0dc4-ae63-7a3f6a0111c6.png" width=50%>


### 列の表示選択

* `Columns`をクリックすると表示したい列を選択することができる

	* デフォルトでは全てが選択されている状態となっている

* 非表示にする列をクリックすると色が消えて、即座に`Data Frame`タブでその列が表示されなくなっている。

* <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277647/b6e7ac52-0cf4-da3c-722d-c55902eabc1e.png" width=50%>

	* この時は`HRU`が表示されない

### フィルター

* `Filters`タブをクリックすると、各列でのフィルターを定義できる。

* まずフィルターを定義する列をコンボボックスから選択する

* そして条件式をその右のテキストボックスに定義する。

* `_`(アンダースコア)がコンボボックスで選択した列を示す。

* 例えばHRUが1のものを絞り込みたい場合は以下のようにする

```
_ == 1
```

<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277647/7aaddac7-3b70-6aff-89ce-5fa40a6955f8.png" width=50%>

* 範囲を付けたい時も可能

```

(_ > date(2014,1,1) ) & ( _ < date(2014, 1, 10 ) )


```

* <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277647/78938c17-a294-87a8-a8fd-f34743a7f680.png" width=50%>


	* ここの例はdatetime型である列を対象にしたので、date関数でdatetime型で比較する必要がある

		* `import datetime`とかしなくても`date`が使えるのが少し不思議だが。

* フィルター文の書き方は、`_`を使用する以外は通常のpandasのフィルターに準拠する形になる。

### ヒストグラム

* `Histogram`タブで、選択した列のヒストグラムを描画可能

	* ヒストグラムの幅は変更できないようだ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277647/fe00acfe-e3c8-8a1c-2c43-eb9ccc14cb28.png" width="50%">


### 散布図

* `Scatter Plot`で二軸の散布図を描画できる。
* 二つのコンボボックス(一つ目がx軸、二つ目がy軸)から列を選ぶと描画される。

* 画像ファイルとして保存もできる
* `matplotlib`と同様に拡大したりできる。
* 描画領域の設定などもできる。
* 軸名の表示や線の体裁変更などはできないようだ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277647/66d3d93e-354f-d358-d4f6-a74c93dc8219.png" width="50%">

## 終わりに

ちょっと内容を確認したいんだけど、という時にかなり便利なモジュールだと思う。

機能を限っているお陰で動作も素早い。

pandasの`DataFrame`が好きになれそう。
ASP .NET MVC でモデルの自動バリデーションを無効化する

コントローラに入る前にバリデーションしていただくのは非常に有用で嬉しいけれども。
APIを作るにあたって、レスポンスを揃えられないな、と悩んだ。

# 結論
Startup.csの以下を編集する

ここを

```C#
services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
```

こう

```C#
services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
        .ConfigureApiBehaviorOptions(options => { options.SuppressModelStateInvalidFilter = true; });
```

# 参考
https://docs.microsoft.com/ja-jp/aspnet/core/web-api/index?view=aspnetcore-2.2#automatic-http-400-responses
Google Cloud Storage を CloudFlare で SSL化する

# 概要

Google Cloud Storage を

- カスタムドメイン（独自ドメイン）で使う
- ロードバランサーを使わずSSL化（https）する
- CloudFlare を使う


# 方法

分かりきっている内容だと思いますので、メモ程度です。

## バケットの作成

- 必ず「ドメイン名」で作成する（例 gcs.example.com )
- ドメイン名で作成すれば、[CNAMEリダイレクト](https://cloud.google.com/storage/docs/request-endpoints?hl=ja#cname) が使える
- ドメイン名で作成するには「ドメインの所有者の証明」が必要（案内が出るので、従う）
- ドメイン所有者の証明は、「ドメインプロパティ（DNSレコードに書き込む形式）」で行わなければならない

## CNAMEリダイレクト（CloudFlareの設定）

- [CNAMEリダイレクトを参考に設定する](https://cloud.google.com/storage/docs/request-endpoints?hl=ja#cname)
- CNAMEリダイレクトとは `gcs.example.com` というバケットを作ったら `c.storage.googleapis.com` をCNAMEに設定することで gcs.example.com でアクセスできるようになること
- CludFlareにCNAMEを追加（ gcs, c.storage.googleapis.com )

この時点で、ファイルを置いてみてアクセスできるかチェックする。 http://gcs.example.com/test.png という具合でカスタムドメインでアクセスできるかチェックする。

## SSL化する（CloudFlareの設定）

- CloudFlare のプロキシをオンにする（オレンジ色にする）
- これによりSSLが可能になる
- ただし「Full」か「Full(Strict)」モードだと動かない（Google Cloud Storageは、 httpしか受け付けないので）
- Page Rules の設定で、 gcs.example.com の SSL は「Flexible」で通信するようにルールを追加する（こんなのがあるなんて、便利）

以下のような状態になる。

```
ブラウザ <--SSL--> CloudFlare <--http--> Google Cloud Storage
```

## 補足

Google Cloud Storage からのデータはブラウザに向かって一方向で、個人情報もない。なので、Flexible でも問題ないと考えられる。
Cisco-ios-configをtextfsmでパースする

Cisco-iosの[show ip eigrp topology all-lins]の結果を、textfsm+ntc-templatesでパースする。

- textfsmでパースエラーが出たので、デバック出力を追加したモジュールを作成
- デフォルトのテンプレート[cisco_ios_show_ip_eigrp_topology.template]が未対応だったので、修正

[ntc-templates](https://github.com/networktocode/ntc-templates)
[textfsm](https://github.com/google/textfsm/wiki/TextFSM)
[Gist](https://gist.github.com/harasakih/3bf8ed64fbfdd036fabfe4e848d1a04a)

# textfsm
エラートレースを参考に、呼出前にテンプレート、入力ファイルの内容をSTDERR出力する。

```py:
    for line in lines:
      print >> sys.stderr, "DBG1:" , line
      self._CheckLine(line)
 
    for rule in self._cur_state:
      matched = self._CheckRule(rule, line)
      print >> sys.stderr, "DBG2:" , line , "->" , rule
      if matched:
        for value in matched.groupdict():
          self._AssignVar(matched, value)

        print >> sys.stderr, "DBG3:" , rule
        if self._Operations(rule):
```

diff結果

```text:
$ diff textfsm.py.org textfsm.py
1c1
< #!/usr/bin/python2.4
---
> 
853a854
>       print >> sys.stderr, "DBG1:" , line
872a874
>       print >> sys.stderr, "DBG2:" , line , "->" , rule
876a879
>         print >> sys.stderr, "DBG3:" , rule
```


# ntc-templates
- ADV_ROUTEが```Conected, Rstatic(nn/mm)```に対応していなかたので、修正
- ```P ip/maskl, xxx successors, FD is yyy, serno nn```にも対応

```conf:
# Value List ADV_ROUTER (\d+\.\d+\.\d+\.\d+\s+\(\d+\/\d+\))
Value List ADV_ROUTER ((\d+\.\d+\.\d+\.\d+\s+\(\d+\/\d+\))|\w+|(\w+\s+\(\d+\/\d+\)))

Start
  # Matches a route and captures if ${TAG} is use for the route and then moves to Gateway section
  ^${CODE}\s+${ROUTE}/${MASK},\s+${SUCCESSORS}\s+successors,\s+FD\s+is\s+${FD},\s+tag\s+is\s+${TAG} -> Gateway
  ## -- hiroshi : tag -> serno
  ^${CODE}\s+${ROUTE}/${MASK},\s+${SUCCESSORS}\s+successors,\s+FD\s+is\s+${FD},\s+serno\s+${TAG} -> Gateway

Gateway
  ## -- hiroshi
  # These are the same as above and capture the next set of routes
  ^${CODE}\s+${ROUTE}/${MASK},\s+${SUCCESSORS}\s+successors,\s+FD\s+is\s+${FD},\s+tag\s+is\s+${TAG}
  ^${CODE}\s+${ROUTE}/${MASK},\s+${SUCCESSORS}\s+successors,\s+FD\s+is\s+${FD},\s+serno\s+${TAG}
```


```text:
$ diff cisco_ios_show_ip_eigrp_topology.template.org cisco_ios_show_ip_eigrp_topology.template
9c9,13
< Value List ADV_ROUTER (\d+\.\d+\.\d+\.\d+|\w+)
---
> # 0.0.0.0 (fdval/adval)
> # Connected
> # Rstatic (fdval/adval)
> # Value List ADV_ROUTER (\d+\.\d+\.\d+\.\d+\s+\(\d+\/\d+\))
> Value List ADV_ROUTER ((\d+\.\d+\.\d+\.\d+\s+\(\d+\/\d+\))|\w+|(\w+\s+\(\d+\/\d+\)))
20a25,26
>   ## -- hiroshi : tag -> serno
>   ^${CODE}\s+${ROUTE}/${MASK},\s+${SUCCESSORS}\s+successors,\s+FD\s+is\s+${FD},\s+serno\s+${TAG} -> Gateway
29a36
>   ## -- hiroshi  
30a38
>   ^\s+via\s+${ADV_ROUTER}${OUT_INTERFACE}?
34a43,44
>   ## -- hiroshi
>   ^${CODE}\s+${ROUTE}/${MASK},\s+${SUCCESSORS}\s+successors,\s+FD\s+is\s+${FD},\s+serno\s+${TAG}
```
CSSの基本～コメントアウト、余白追加など

#CSSの基本
コピペして使ってください。
HTMLの基本構造、コメント、リンク、画像、リストを記載。

###基本構造

```css:sample.css
h1 {
  color: red;
}
```

###コメント、色指定、サイズ指定など

```css:sample.css

/*コメント*/

/*色、サイズ等の指定*/
h1 {
  /*色*/
  color: #ff0000;
  /*フォントサイズ*/
  font-size: 10px;
  /*フォント種類*/
  font-family: serif;
  font-family: "Avenir Next";
  /*背景色*/
  background-color: #dddcdd;
  /*縦、横サイズ*/
  width: 200px;
  height: 100px;
}
```

###class、idなどの指定
```css:sample.css
/*classにCSSを設定*/
.sample {
}
/*idにCSSを設定*/
#sample {
}
/*class内のリストにCSSを設定*/
.sample li{
}
/*複数のセレクタに同じCSSを設定*/
h1, p{
}
```

###リストを横並びにする
```css:sample.css
li {
  /*リストの黒点をなくす*/
  list-style: none;
  /*リストを横並びにする*/
  float: left;
}
```

###余白をつける
```css:sample.css
.logo{
  /*paddingは内側の余白*/
  /*上10px、右20px、下30px、左40px*/
  padding: 10px 20px 30px 40px;
  /*上下20px、左右40px*/
  padding: 20px 40px;

  /*marginは内側の余白*/
  /*上下20px、左右40px*/
  margin: 20px 40px;
  /*上20px*/
  margin-top: 20px;
}
```

###ボーダー線
```css:sample.css
.border {
  border-bottom: 2px solid #dee7ec;
}
【Python】 プロジェクトオイラー　Problem 6

####<i>最初の10個の自然数について, その二乗の和は,</i>

**1²+2²+...+10²＝385**

####<i>最初の10個の自然数について, その和の二乗は,</i>

**(1+2+...10)²＝3025**

####<i>これらの数の差は 3025 - 385 = 2640 となる.</i>

####<i>同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.</i>

problem5は**[こちら](https://qiita.com/projecteuler/items/15479b99ef38ae936fde)**から

この問題はfor文を使って、100までの値それぞれを二乗したり足していったりすればできるはず。

とりあえずfor文の形は

```python
for a in range(1,101):
    print(a)
```
これで1から100までが出てきたので

まず**二乗の和**からやってみる

```python
b = 0
for a in range(1,101):
    b += a * a
print(b)

338350
```
bという変数の中に1から100までの値の二乗を足していった

多分あっているはず

次は**和の二乗**に挑戦してみる

```python
b = 0
for a in range(1,101):
    b += a
    c = b * b
print(c)

25502500
```
まず、変数bにaをひたすら足していって、1から100の和を作った

そしてその和であるbを、二乗したものをcとしました

これも多分あってるかな

最後に二つを合わせる

```python
b = 0
c = 0
for a in range(1,101):
    b += a * a
    c += a
    d = c * c
print(d - b)

25164150
```
http://kingyojima.net/pje/006.html

あってるーー

problem8は**[こちら](https://qiita.com/projecteuler/items/bcbbda987d8225fee04f)**から

problem8はまだ解けていません！！！
標準エラー出力(stderr)を一時ファイルを介さずに変数に入れる

# はじめに
エラーログを取りたいなどの目的で使う場合もありますが，一部のコマンド，実行ファイルではなぜか目的の出力を標準エラー出力(stderr)から出してくる場合がある．

例えば imagemagick の `compare` コマンドで metric の出力を得たい場合に通常のように

```shell
METRIC=`compare -metric PSNR file.png file.jpg diff.png`
```

などとしても metric はそのまま端末に表示されて `METRIC` には何も代入されない．
先述したとおり， `compare` コマンドの metric はどういうわけか標準エラー出力から出されるためである．

# 解決策

標準エラー出力のみを変数に入れたい場合は以下のようにする．

```shell
ERR="$(実行コマンド 2>1& > /dev/null)"
```

これで標準出力は `/dev/null` に捨て，エラー出力のみを ERR に代入することができる．

(なんで標準出力から結果を出さないんだよ！)
Proxy経由でWatson Assistantに接続する方法（JavaScript）

#はじめに
アプリケーションからProxy経由でWatson Assistantに繋ぎたい。
本来はAssistantサービスのインスタンス化時にProxyの設定を入れれば可能らしいが、うまくいかない。
どうもSDKのバグのようで、現在fix申請中だが、SDKを修正することで解決したのでその方法について記載する。

#環境
Watson Assistant V1 2019-02-28
Node.js 12.5.0


#tunnelのinstall
```npm
npm install tunnel
```
#SDKの修正
npm install ibm-watsonするとインストールされるnode_modules/ibm-cloud-sdk-core/lib/requestwrapper.jsに以下のコードを追加する。


先頭に

```requestwrapper.js
var tunnel = require("tunnel");
```

axios_1.default.createに

```requestwrapper.js
var agent = tunnel.httpsOverHttp({
         proxy: {
             host: 'XXX.XXX.XXX.XXX',
             port: YYYY,
         },
     });

     axiosConfig.httpsAgent = agent;
     axiosConfig.proxy = false;

     this.axiosInstance = axios_1.default.create(axiosConfig);
```
#参考情報
[createSession from Assistant V2 is not working behind http proxy](https://github.com/watson-developer-cloud/node-sdk/issues/900)
[IBM Cloud API Docs　Watson Assistant v1](https://cloud.ibm.com/apidocs/assistant)
Ren'Py の実行中に rpa を削除する

実行中に rpa を削除するという暴挙をした時のメモ

# 結論

## `init python` ブロック で削除する
この場合 rpa 内のスクリプトが読み込まれてしまっているので、再起動または終了する必要がある。

**1.** persistent に削除フラグを保存してスクリプトの再読み込み

```py
persistent.uninstall = True
renpy.save_persistent()
renpy.utter_restart()
```

**2.** `init python` ブロックで persistent の削除フラグが立っていたら、 rpa と persistent の削除フラグを削除

```py
import os
try: os.unlink(config.basedir + "/game/*.rpa")
except: pass
persistent.uninstall = False
renpy.save_persistent()
```

**3.** 終了・または再起動
終了の場合は `renpy.quit()`、再起動ならタイトル表示後に `renpy.utter_restart()`
タイトル表示後で再起動処理を挟める場所が思いつかないので、終了してしまうのが一番早いと思う。


# スクリプトの実行タイミング

## 起動時

- `python early` ブロックconfig は使える
- `init * python` ブロック (* の数値が小さい順)
- `translate * python` ブロック (* は現在の言語)
  + リソースがロードされ、以降リソース入り rpa はロックされて削除できない

## タイトルへ戻った時

- `translate * python` ブロック (* は現在の言語)

## `renpy.change_language(*)` 時

- `translate * python` ブロック (* は変更後の言語)

## `renpy.utter_restart()` 時
起動時と同じ
※ `renpy.utter_restart()` はタイトル前に実行すると無言で落ちる

## `renpy.reload_script()` 時
起動時と同じだが、`translate * python` ブロックがなぜか 3 回くらい呼ばれる
あと画面にリロード中であることがデカデカと表示される
※ `renpy.reload_script()` はタイトル前に実行すると無言で落ちる

## `renpy.full_restart()` 時
タイトルへ戻った時と同じ
※ `renpy.full_restart()` は `python early` ブロック、`init * python` ブロックで実行すると落ちる。`translate * python` ブロック では落ちない。

## `renpy.quit(relaunch=True)`
そもそも再起動されない。ソースコードを読む限り、起動時と同じはず。
【PowerShell】更新時刻が一定期間過ぎたファイルを削除する

# 過去ファイル抽出処理

###### FileUtility.ps1
```powershell
<#
.Synopsis
 期間の過ぎたファイル情報項目を抽出します。
.DESCRIPTION
 期間を指定して、一定期間過ぎたファイル情報項目を抽出します。
.EXAMPLE
 dir C:\Users -File -Recurse -Include *.log | Fetch-PastItems -Span 7.00:00:00
.EXAMPLE
 cd C:\Users
 dir -File -Recurse | ago 7.0:0
.INPUTS
 1. ファイル情報のコレクション
 2. 期間
.OUTPUTS
 該当するファイル情報のコレクション
.LINK
 [Time​Span] https://docs.microsoft.com/dotnet/api/system.timespan/
#>
function Fetch-PastItems {
    [Alias("ago")]
    [OutputType([IO.FileSystemInfo[]])]
    param (
        # ファイル情報のコレクション
        [Parameter(ValueFromPipeline, Mandatory)]
        [IO.FileSystemInfo[]]
        $Items,
        # 期間
        [Parameter(Mandatory, Position=0, HelpMessage = "期間を入力してください。")]
        [TimeSpan] $Span
    )
    Begin {
        $ago = [DateTime]::Now - $Span
    }
    Process {
        $Items | ? LastWriteTime -lt $ago
    }
    End {
    }
}
```

---
# 使用方法

###### Main.ps1

```powershell
cd $PSScriptRoot
. .\FileUtility.ps1

## C:\Users\ ディレクトリで 30 日以上経過している .log ファイルを削除する場合
dir C:\Users\ -File -Recurse -Include *.log | ago 30.00:00:00 | del
```

---
# ヘルプ表示
```powershell
Get-Help ago -full

名前
    Fetch-PastItems

概要
    期間の過ぎたファイル情報項目を抽出します。

構文
    Fetch-PastItems -Items <FileSystemInfo[]> [-Span] <TimeSpan> [<CommonParameters>]

説明
    期間を指定して、一定期間過ぎたファイル情報項目を抽出します。

パラメーター
    -Items <FileSystemInfo[]>
        ファイル情報のコレクション

        必須                         true
        位置                         named
        既定値
        パイプライン入力を許可する   true (ByValue)
        ワイルドカード文字を許可する false

    -Span <TimeSpan>
        期間

        必須                         true
        位置                         1
        既定値
        パイプライン入力を許可する   false
        ワイルドカード文字を許可する false

    <CommonParameters>
        このコマンドレットは、次の共通パラメーターをサポートします: Verbose、
        Debug、ErrorAction、ErrorVariable、WarningAction、WarningVariable、
        OutBuffer, PipelineVariable、および OutVariable。詳細については、
        about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216)
        を参照してください。

入力
    1. ファイル情報のコレクション
    2. 期間

出力
    該当するファイル情報のコレクション

    -------------------------- 例 1 --------------------------

    PS C:\>dir C:\Users -File -Recurse -Include *.log | Fetch-PastItems -Span 7.00:00:00


    -------------------------- 例 2 --------------------------

    PS C:\>cd C:\Users

    dir -File -Recurse | ago 7.0:0


関連するリンク
    [Time​Span] https://docs.microsoft.com/dotnet/api/system.timespan/
```

---
# 参考サイト

- [コメントベースのヘルプの作成](http://suyamasoft.blue.coocan.jp/PowerShell/Tips/Comment_Based_Help/index.html)
- [Time​Span](https://docs.microsoft.com/dotnet/api/system.timespan/)
agora.io クイックスタートガイド Electron用

#概要
agora.ioにElectron用のSDKが公開されました。
コードはjavascriptで書きますが、利用するSDKのベースはNativeのものを利用できるので機能や安定性がすぐれています。

この記事では以下のサンプルのビルドを紹介します。
[サンプル](https://github.com/AgoraIO-Community/Agora-Electron-Quickstart)
フレームワークはReactを採用しています。


#ビルド方法
1.上記サンプルプロジェクトをダウンロード
2.ファイルの展開
3.プロジェクトのルートフォルダへ移動
4.パッケージの追加

```shell
$ npm i
```

5.setting.jsにAPP IDを追記

```javascript:setting.js

export const APP_ID = '****'
…
```

6.実行

```shell

$ npm run dev
```

以上で終わりです。非常に簡単ですね。


#アプリの画面
ボイスチェンジャーやビデオの設定があります。
<img width="1478" alt="スクリーンショット 0001-07-09 12.34.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/81cf1ae1-a777-84f1-457f-58375bb445f5.png">

その他にも画面共有やRTMPでの配信機能などが含まれています。
<img width="1478" alt="スクリーンショット 0001-07-09 12.36.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/08a242ad-2ed5-5e18-2100-9eb004d6ac21.png">

#関連リンク
・[Electronのサンプルコードはどこにありますか？](https://vcube-support.zendesk.com/hc/ja/articles/900002197503)


#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=b4775e83394de3f6a7f8)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=b4775e83394de3f6a7f8)
【python】TensorFlowで構築したモデルをexeで実行出来るようにする

pythonコードを単体で動くexeにしたいとき、**pyinstaller**が便利だったのでメモ。

## やりたかったこと
TensorFlowで構築したモデルを、PCに詳しくない人にも使ってもらえるようにしたい。

TFモデル構築・保存
→hd5ファイルを呼び出して推論するpyファイルを作成
→そのpyファイルをexe化
→exeファイルをローカルに置くだけでwindows上で使えるように
というイメージ

## 環境
Windows 10 64bit
Anaconda (python 3.5)

## インストール
pyinstallerはpyファイルをコマンド一発でexeファイルに変換してくれる便利なやつ

```
pip install pyinstaller
```

## exeファイル作成コマンド
--onefileオプションを付けるとexe単体で実行出来るようになる

```
pyinsaller PATH/hogehoge.py --onefile
```

## 出てきたエラー
### ライブラリが見つからないよエラー
conda環境で実行したファイルをexe化したためか、以下のようなエラーが出た。

```
OSError: Python library not found: libpython3.5m.so.1.0, libpython3.5mu.so.1.0, libpython3.5.so.1.0
```

その場合は**conda環境のライブラリが置いてあるパスを共有ライブラリ検索パスに追加**する。（私の場合は/home/USER_NAME/anaconda3/lib だった）

### 出来たファイルが実行出来ない？
いくつかの手順を踏んで無事ファイルが出来た...！と思いきや、何故かexeファイルが実行出来ない。
ここで初めて気付くが、コマンド実行していたのがlinuxだった。実はwindowsで使用するためのexeは、**windowsOSでの作成が必須**らしい。ということでwindowsPCに切り替えて実行。無事exeファイル化出来ました。

### とにかくexeのファイルサイズが大きい
無事に出てきたexeファイルだったが、今度は「ファイルサイズ、大きくない...？」問題が出てきた。
ということで色々調べていると、同じことを考えている人がいた。先人の知恵ありがたい...

*[Anaconda] Pyinstallerで生成される実行ファイルを数百MB -> 数十MBに削減する方法*
(https://qiita.com/napinoco/items/068ce8ef6ef4309966b1)

しかし、結論、**今回はファイルサイズをうまく小さくすることが出来なかった**。というのも、今回はTFで比較的複雑な演算をしており、上記リンクにあるような解決策をそのまま応用することが厳しそうだったためである。これについては他にやり方がないか調査中。

### pyファイルでのファイルの呼び出し方
exeファイルを配布することを考えると、**絶対パスをベタ書きだとファイルの呼び出しエラー**が出てしまう。今回はpyファイル内で自分のパスを取得して、そこを基点にファイルを呼び出す形式を取った。
Array<Object> な値を reduceしてObjectにする


# はじめに
例えば、以下のようなSQLでDBからレコードを取得してきた場合

```sql

SELECT
  a,
  SUM(CASE WHEN case = 'b'  THEN 1 ELSE 0 END) AS b,
  SUM(CASE WHEN case = 'c'  THEN 1 ELSE 0 END) AS c
FROM table
GROUP BY a
;
```

戻り値はこんな感じで取得できたりする。

```javascript

src = [{ a: 1, b: 2, c: 3 }, { a: 10, b: 20, c: 30 }]
```

group by a ごとの集計（SQL結果そのまま）と
group by しない合計を出したい場合を考えた時に、
単純にSQLを２発投げることもできるが、JS側で足し算すればいいじゃん？とも思った。
（ただし、足し算するレコードが多い場合は、SQLでやった方が早い気もする。
　今回は100〜200レコードしか取得されない前提。）

JavaScriptのArrayには強力なメソッドがいくつもあり、
その中の一つ、reduceがかなりいい仕事をしてくれるのだが

```javascript
[1,2,3].reduce((p,c)=>{
  return p + c 
})
// 6
```

Object同士の足し算だとポンコツな結果が返ってくる（いや、ポンコツなのは仕様を理解できていない自分なのだと思うが）

```javascript
[{a:1},{a:2},{a:3}].reduce((p,c)=>{
  return p + c 
})
// {a:6} を期待するが、実際はこれ
// [object Object][object Object][object Object]
```

どうやら、Objectの場合は、ちょっと工夫が必要らしい

```javascript
[{a:1},{a:2},{a:3}].reduce((p,c)=>{
  return {a:p.a + c.a}
})
// {a:6}
```

# 結論
>※追記 コメントでこのような書き方もあると教えていただきました！
だいぶスマートですね！

>```javascript
>
src = [{ a: 1, b: 2, c: 3 }, { a: 10, b: 20, c: 30 }]
keys = ["a","b","c"]
keys.map(k=>(
    {[k]:  src.map(e=>e[k]).reduce((p,c)=>(p+c))}
)).reduce((p,c)=>({...p,...c}))
```

で、完成したのがこれ。

```javascript
/**
 * Array[Object]型の全要素を足し上げし、
 * Object型で返す。
 * @param {Array<Object>} src
 * @return Object
 */
reduceObjectArray(src) { // src = [{ a: 1, b: 2, c: 3 }, { a: 10, b: 20, c: 30 }]
  let result = {}
  Object.keys(src[0]).forEach((name) => {
    result[name] = src.reduce((p, c) => {
      return p + c[name]
    }, 0)
  })
  return result // result = { a: 11, b: 22, c: 33 }
};
```

関数名があれだが

# 解説
```javascript
Object.keys(src[0]).forEach((name) => {
```

で、要素名（今回はaとbとc）分繰り返し、

```javascript
    result[name] = src.reduce((p, c) => {
      return p + c[name]
    }, 0)
```

で、resultという連想配列（let result = {}で定義）に
１要素ずつreduceした結果を入れていく。
パーティションのオンライン・マージ機能を試す（Oracle Database 18c）

# パーティションの作成
　大規模なテーブルを分割して管理するパーティショニング機能は、Oracle Database Enterprise Editionの優勝オプション（Partitioning Option）です。パーティショニング機能ははテーブルを列値によって分割します。分割された単位をパーティションと呼びます。
以下の例はPART1テーブルを列c1で４つのパーティション（p1, p2, p3, p4）に分割しています。列値の範囲（RANGE）で分割を行います。パーティションは独立したセグメントを構成するため、USER_OBJECTSビューを参照すると、別々のIDを割り当てられます。


```
SQL> CREATE TABLE part1 (c1 NUMBER, c2 VARCHAR2(10)) PARTITION BY RANGE(c1)
  2  (
  3    PARTITION p1 VALUES LESS THAN (1000000),
  4    PARTITION p2 VALUES LESS THAN (2000000),
  5    PARTITION p3 VALUES LESS THAN (3000000),
  6    PARTITION p4 VALUES LESS THAN (4000000)
  7  );

Table created.

SQL> SELECT OBJECT_ID, OBJECT_NAME, SUBOBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME='PART1';

 OBJECT_ID OBJECT_NAME                    SUBOBJECT_NAME
---------- ------------------------------ ------------------------------
     73258 PART1                          P3
     73259 PART1                          P4
     73257 PART1                          P2
     73256 PART1                          P1
     73255 PART1                          NULL
```

# パーティションのマージ
　複数のパーティションをまとめて一つにする操作をマージと呼びます。マージ操作はテーブルの構成変更となるため、テーブルに対するトランザクションが継続中の場合は実行できません。下記の例では各パーティション内のレコードを更新していますが、確定（COMMIT）していません。この状態で、ALTER TABLE MERGE PARTITIONS文を実行すると、ORA-00054 resource busy and acquire with NOWAIT specified or timeout expiredエラーが発生します。

```

SQL> UPDATE PART1 SET c2='UPDATE' WHERE c1 IN (500000, 1500000, 2500000, 3500000);

4 rows updated.

SQL> ALTER TABLE part1 MERGE PARTITIONS p1, p2 INTO PARTITION p0;
ALTER TABLE part1 MERGE PARTITIONS p1, p2 INTO PARTITION p0
            *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
```

Oracle Database 18cではマージ操作をオンラインで実行できるようになりました。実行方法はALTER TABLE MERGE PARTITIONS文にONLINE句を指定するだけです。下記の例ではONLINEを指定してパーティションp1とp2をパーティションp0にマージしています。パーティションp0には新しいオブジェクトIDが付与されていることがわかります。

```
SQL> ALTER TABLE part1 MERGE PARTITIONS p1, p2 INTO PARTITION p0 ONLINE;

Table altered.

SQL> SELECT OBJECT_ID, OBJECT_NAME, SUBOBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME='PART1';

 OBJECT_ID OBJECT_NAME                    SUBOBJECT_NAME
---------- ------------------------------ ------------------------------
     73255 PART1                          NULL
     73276 PART1                          P0
     73258 PART1                          P3
     73259 PART1                          P4
```

　パーティションのオンライン・マージ機能は、サブ・パーティションのマージでも指定することができます。[SQLリファレンス・マニュアル](https://docs.oracle.com/cd/E96517_01/sqlrf/ALTER-TABLE.html#GUID-552E7373-BF93-477D-9DA3-B2C9386F2877) にも記載があります。パーティションのマージ機能は、RANGEパーティションまたはLISTパーティションとその組み合わせ（コンポジット）の場合のみ実行できます。

以下の例はHASHパーティションのマージを行おうとしていますがエラーになっています。

```
SQL> CREATE TABLE part2 (c1 NUMBER, c2 VARCHAR2(10)) PARTITION BY HASH(c1)
  2  (
  3     PARTITION p1,
  4     PARTITION p2,
  5     PARTITION p3,
  6     PARTITION p4
  7  );

Table created.

SQL> ALTER TABLE part2 MERGE PARTITIONS p1, p2 INTO PARTITION p0;
ALTER TABLE part2 MERGE PARTITIONS p1, p2 INTO PARTITION p0
            *
ERROR at line 1:
ORA-14255: table is not partitioned by range, list, composite range, or
composite list method

```
yarn install時にfseventsでエラーが発生する場合

node v12.6.0

`yarn install`を行なった際に、`fsevents`のパッケージで上手くいかず、延々とエラーを吐く場合の対処法です。

## nodeのバージョンを下げる
今回はバージョン12.6.0のnodeを仕様していたので、成功している例の多いバージョン9.11.0に変更して`yarn install`を行います。

```
$ brew install nodebrew
$ nodebrew install-binary v9.11.0
$ nodebrew use v9.11.0
```

```
$ node -v
v9.11.0
```

バージョン変更が上手くいかない場合はパスがちゃんと通っているかなどを確認してみてください。
Rails6 のちょい足しな新機能を試す49（consumes? 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第48段。 今回は、 `consumes?` 編です。
Rails 6 では、 `ActiveSupport::Multibyte::Chars.consumes?` を使うと `DEPRECATION WARNING` が表示されるようになります。(私は自分で使ったこともないし、使われているところを見たことも無いのですが...)

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# 簡単なスクリプトを作る

今回は、動作確認用の簡単なスクリプトを書いて確認します。


```bin/consumes.rb
#!/usr/bin/env ruby
require 'active_support/core_ext'

puts '--- DEPRECATED WARNING ---'
p ActiveSupport::Multibyte::Chars.consumes?('あ')

puts '--- NO DEPRECATED WARNING ---'
p 'あ'.is_utf8?
```

# Rails 6 では

実行すると `DEPRECATION WARNING` が表示されます。


```shell
$ bin/duration.rb
--- DEPRECATED WARNING ---
DEPRECATION WARNING: ActiveSupport::Multibyte::Chars.consumes? is deprecated and will be removed from Rails 6.1. Use string.is_utf8? instead. (called from <main> at bin/consumes:5)
true
--- NO DEPRECATED WARNING ---
true
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try049_deprecated_consumes


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Deprecate ActiveSupport::Multibyte::Chars.consumes?](https://github.com/rails/rails/pull/34215)
プログラミング初学者におすすめしたいCoursera/edXのPython講座 "Python for Everybody"

#初投稿！というわけで。
Qiita初投稿には、自分が本格的にプログラミングを学び始めるべく利用したCoursera/edXのMOOCを紹介したい。

#Python for Everybody
- [Python for Everybody (Coursera)](https://www.coursera.org/specializations/python)
- [Python for Everybody (edX)](https://www.edx.org/course/programming-for-everybody-getting-started-with-python) <-こちらはなぜか講座が一部見つからないのでCoursera版がオススメ。

ミシガン大学のDr. ChuckことDr. Charles R. Severance氏によるPythonの講座群。基礎的な構文やデータ構造から始め、徐々にウェブスクレイピングやSQLを利用したデータベースの操作まで、５つの講座を通してマスターしていく。また、講義中に出てくるプログラムの例なども、Google Geocoding APIやTwitter APIを利用した実用的なものが多い。

#講座の（個人的な）メリット
- **構文などの説明が一つ一つはっきりとしており、具体例を使用して説明しているので直感的にわかりやすい。**
    - 講義のビデオも構文ごとに分けられているので、復習などがしやすい。
- **練習問題の説明もわかりやすく、学習内容を復習するにはちょうどいい難しさである。**
    - 万が一わからなければサンプルコードの解説を見るもよし、フォーラムで聞くもよし。
- **講座内で利用するテキストやソースコードなどは全て無料で公開されている。**
    - 動画はちょっと、という人にはDr. Chuckの講座準拠のテキストもオススメ。
    - [PY4E Textbook & Materials](https://www.py4e.com/)
        - なんとここからオーディオブック形式で講義をダウンロードすることもできる。
- **有料APIなどは、学習の範囲内であればDr. Chuckが自ら用意してくれた代用APIが無料で使えるので、心配せずに学習に利用することができる。**
    - 後半になってくるとXMLやJSONをAPIを通して取得しparsingする単元が出てくる。
        - ご本家のAPIは有料だったりするのでこれは嬉しい。

#講座の（数少ない）デメリット
- **日本語未対応。**（2019/07/09現在）
    - 自分は特に問題なかったが、英語が結構理解できないとわからないと思う。

#Coursera/edXとは言ったけど、、、
実はDr. Chuckがご自身で再録画した講義を本人のYouTubeチャンネルにすべて投稿している。もちろんテキスト準拠。（なので修了証欲しい方はCourseraで受けてね）
- [Python for Everybody YouTube Playlist](https://www.youtube.com/playlist?list=PLlRFEj9H3Oj7Bp8-DfGpfAfDBiblRfl5p)

#受講した感想
講座内で見たり書いたりするコードは実用的なものが多く、Pythonがいかにパワフルな言語であるかを改めて実感させてくれた。もちろん他の言語で同じことはできることかもしれないが、初学者がこれだけ実用的なことができるとなると、いい自信になるのではないだろうか。実際、この講座を受講し終えていろんな技術や言語にチャレンジしている自分がいる。プログラミングにチャレンジしたい、Pythonわかりたいという人には是非この講座をオススメしたいと思う。
onsenui(angular2+)で、Test(karma)で、Template parse errorsになった時の対応

Angular(V.7)でプロジェクト作成し、Onsen-uiのDocumentの通りに、ons-naviを実装。

See: https://ja.onsen.io/v2/guide/angular2/#angular-2


app.component.htmlは、下記内容。このコンポーネント対象に単体テストしたい。

```
<ons-navigator [page]="initialPage"></ons-navigator>
```

karmaでテスト実行すると、ons-navigator, ons-pageなんて知らないといわれる。

```
Failed: Template parse errors:
Can't bind to 'page' since it isn't a known property of 'ons-navigator'.
1. If 'ons-navigator' is an Angular component and it has 'page' input, then verify that it is part of this module.
2. If 'ons-navigator' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.
3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component. ("&lt;ons-navigator [ERROR -&gt;][page]="initialPage"&gt;&lt;/ons-navigator&gt;"): ng:///DynamicTestModule/AppComponent.html@0:15
'ons-navigator' is not a known element:
1. If 'ons-navigator' is an Angular component, then verify that it is part of this module.
.
.
.
```

で、上記のメッセージの「2. add 'CUSTOM_ELEMENTS_SCHEMA'」 してやる。

```
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
```

TestBedの構成時に、schemasを追加。

```
describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
      schemas: [
        CUSTOM_ELEMENTS_SCHEMA,
      ],
    }).compileComponents();
  }));
```

メッセージに書いてある通りって言えば、それまでなんですが、小ネタという事で。
【Git】指定したリモートブランチ（remote branch）でrebaseする方法


例えばoriginの `develop` ブランチでrebaseしたい場合は

`git pull --rebase origin develop`

コンフリクトした場合はコンフリクトを解消してから

`git add` で修正ファイルをステージングして
`git rebase -continue` でrebaseを続行する
LiveData + Coroutine + RetrofitでAPI呼び出しを簡潔に実装する

#はじめに
LivedataがCoroutineに対応したので、
これらを利用してretrofitを用いたAPIの呼び出しを書きました。

#使用ライブラリ
```app.gradle
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha02"
implementation "com.squareup.retrofit2:retrofit:2.6.0"
```

#実装
GitHubのAPIを用いてユーザー情報を取得するサンプルです。
ModelやDIの実装については割愛させていただきます。

###API定義
```Kotlin:GithubApi.kt
interface GithubApi {
  @GET("/users/{user}")
  fun getUser(@Path("user") loginName: String): LiveData<GithubUser>
}
```
Retrofitを用いたAPI呼び出しの定義部分。返り値の型をLiveDataにしています。

###API呼び出し
```Kotlin:GithubRepository.kt
class GithubRepository(val githubApi: GithubApi) {
  fun getUser(loginName: String) = liveData {
    emitSource(githubApi.getUser(loginName))
  }
}
```
上で定義したAPIの呼び出しです。
liveDataブロック内で受け取るliveDataを処理します。
emitSource()するとliveDataに値が流れ込みます。

###LiveDataの取得
```Kotlin:GithubViewModel.kt
class GithubViewModel(application: Application, private val repository: GithubRepository) : AndroidViewModel(application) {
  fun getUser(loginName: String) = repository.getUser(loginName)
}
```
あとはViewModelやFragmentなどでLiveDataとして値を取得できるので、
observeしたりdatabindingに値をセットしたりして利用します。

以上、Coroutine対応したLiveDataを用いてAPI呼び出しを実装する例を書きました。

#参考
[Lifecycle | Android Developers](https://developer.android.com/jetpack/androidx/releases/lifecycle)