OmniAICreator/Qiita-1.07M huggingface dataset:
javascriptのStrategyパターン

# Strategy パターン
Strategyパターンは、必要に応じて計算法を切り替えることが容易になり、アルゴリズムを実行時に選択することができるデザインパターンです。
オブジェクト指向における再利用のためのデザインパターン。



# クラス図
![figure6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255229/140cb069-2e9f-a89e-14d9-fd8f8bbde625.png)

# 例
```Javascript
/*Strategy*/
var levelOBJ = {
    "A": function(money) {
        return money * 4;
    },
    "B" : function(money) {
        return money * 3;
    },
    "C" : function(money) {
        return money * 2;
    } 
};
/*Context*/
var calculateBouns =function(level,money) {
    return levelOBJ[level](money);
};
/*Client*/
console.log(calculateBouns('A',10000)); // 40000

```

# ユースケース
主に切り替えや追加・拡張を容易にする処理
例えば、ユーザーの選択に合わせて難易度の切り替えや国によって為替レートの変換

# 参考
1.zeng tan.2015. Design Pattern And Development Practice Of JavaScript
puppeteer チートシート

# はじめに
スクレイピングをする際に、puppeteerを使ってみたら
という声をいただいたので、メモをしながら触ってみたいと思います。

## [Puppeteer](https://github.com/GoogleChrome/puppeteer)とは
NodeでヘッドレスChromeを操作できるパッケージ
→　動的ページのスクレイピングなどにとても便利

## 環境とインストール
```terminal
❯ node -v
v12.6.0

❯ yarn -v
1.17.3

❯ yarn add puppeteer
yarn add v1.17.3
```

## hello world
```js:test.js
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
  console.log("スクリーンショットを保存しました");
})();
```

## よく使う(今回使った)method
[APIドキュメント](https://github.com/GoogleChrome/puppeteer/blob/v1.18.1/docs/api.md)

### Puppeteer
|name|meaning|
|---|---|
|launch()|ブラウザの起動|

### Browser
|name|meaning|
|---|---|
|newPage()|新規ページ生成|

### Page
|name|meaning|
|---|---|
|goto('URL')|URLにアクセス|
|$(selector)|tagやcssセレクタでの絞り込み|
|focus(selector)|tagやcssセレクタでの絞り込み(一つ目のエレメントを取得)|
|type(selector, value)|セレクターに入力|
|click(selector)|セレクターをクリック|
|waitForNavigation(waitOptions)|オプションのタイミングまで待つ|
|screenshot({path: 'path.png'})|path名でスクリーンショットを保存|

## サンプル
アマゾンで商品を検索してみる

```js:test.js
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.amazon.co.jp/');
  await page.type('#twotabsearchtextbox', 'Nature Remo mini');
  await page.click('input[type="submit"][value="検索"]');
  await page.waitForNavigation({waitUntil:"networkidle0"});

  await page.screenshot({path: 'example.png'});
  await browser.close();
})();
```
![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395295/32114acb-0c33-a971-29fe-1b993fa28512.png)
IPAの試験の話

いい加減何かしら書いておこう。
システムアーキテクト試験の話は、どこかにまとめておきたいと思っていたので

### なぜ受けたか
秋の試験で受けたいものがなかったのです。
社会人になったし、レベル4を一つぐらいとりたいよなーっていうのはあった。
資格手当ももらえるし、という打算もあり。

秋に受けられる試験は、
- ITストラテジスト
- システムアーキテクト
- ネットワークスペシャリスト
- ITサービスマネージャ
- 情報処理安全確保支援士

組み込みよりで、去年の春ESを受けて、
午後にでわずかに足らずに落ちたのもあり。
（そのESは今年も午後2で1点足らずに落ちた模様）

分野が一番かぶっているし、論文系受けたことないし、
まぁ受けてみるかーっていう軽いノリでした。

### 勉強
ぶっちゃけした記憶がない。
社会人2年目だったし、ほぼ1人プロジェクトしか携わっていないし、
受かる気なんてさらさらなかった。

午前は知識の埋め込みなのは共通なので、暗記するとして
午後は適当に聞いたことある話を適当に書けばいいかと。
実体験なんて何にもないのだから、空想で埋めるしかない、と。

### 結果
受かってた。
全部埋めたのがよかったのだろうか。
空想でしかないのに。

### 結論
文章を書くのが嫌いでないのであれば、そこまで心構えは必要ない試験だと思う。
こういうサイトにものを書いている人たちならば大丈夫だとおもう
``システムアーキテクトというものが何をするべき立場なのか``を理解して、文章を書ければ受かる。
私はこう思う。

### そして
今年は何を受けようか考え中。なにがいいのだろう。
Android 9.0でReactNativeのReloadが失敗する

## 現象
Android Studioのエミュレータを利用してReact Nativeの開発する際に
エミュレータのOSがAndroid 9.0 (Pie)だとソース変更後のReloadで以下のエラーが発生する。

　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153582/1e7cd1f8-05e6-4462-1608-7fccf9e464c1.png" width=50%>

## システムの構成要素
* React Native 
 * react-native-cli: 2.0.1
 * react-native: 0.59.9
* Android エミュレータ
 * Android Studio: 3.4.2
     * Hardware: Pixel 3
     * System Image: Pie 28 x86_64 Android9.0(Google APIs)

## 原因
Reload時にhttp通信でMetro Bundlerへのアクセスを行うが、
Android 9.0(APIレベル28)からHTTP通信がデフォルト無効になっているため。

## 対応方法
特定のIPアドレスのみホワイトリストに登録し、HTTP通信を許可する。

1. AndroidManifest.xml を編集する。

    ``` XML:./android⁩/app⁩/src⁩/main⁩/AndroidManifest.xml
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="jp.test.com.app"
        xmlns:tools="http://schemas.android.com/tools"
        >
　　
        <application
            android:allowBackup="false"
            android:networkSecurityConfig="@xml/network_security_config"> <!-- ← この設定を追加 -->
        </application>
    </manifest>
    ```

2. network_security_config.xml を編集（なければ新規作成）する。

    ``` XML:./android/app/src/main/res/xml/network_security_config.xml
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
      <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">192.168.1.3</domain> <!-- ← ここにローカルのIPアドレスを指定する -->
      </domain-config>
    </network-security-config>
    ```

3. Android StudioでCrean Projectし、フルビルドする。
4. react-native bundleを実行する。
5. reacr-native run-androidを実行する。

これでReload出来るようになっているはず。

[【参考】stackoverflow - [react-native]could not connect to development server on android](https://stackoverflow.com/questions/42064283/react-nativecould-not-connect-to-development-server-on-android/56744301#56744301)
apkが64bit対応しているか確認する方法(Android Studioを使用しない場合)

#apkが64bit対応しているか確認する方法(Android Studioを使用しない場合)
　Andoid Studioを使ってのapk 64bit確認方法は別記事でも出ているので、対象外とします。
　今回はapkファイルからzipにすることで64bit対応しているか確認してみます。

##64bit対応可否
　Googleでは2019年8月1日以降、Google Playで公開するアプリは全て64bitに対応しなければならないと規定しました。
　これを見ると「私のアプリも対応しなければならないの？」と思う人がいるかもしれませんが、対象となるのはネイティブコードを使用している人のみです。ネイティブコードとはJNIを使用してC/C++でVMより下のレイヤーのLinuxレイヤーで動作するソースコードをアプリ内に組み込めるものです。
　簡単に言うと、.soファイルを使用しているかしていないかで判断でき、使用している場合は64bitに対応する必要があると考えて下さい。

##確認手順
1.apkをzipに変換する
2.zipを展開する
3.展開した中のlibフォルダを開く

以下から対応しているプラットフォームによって必要なものが変わります。
[ARM]
armeabi-v7aとarm64-v8aの両フォルダがあるのを確認する。
 ※armeabi-v7aフォルダしかない場合は64bit未対応

[x86]
x_86とx_86_64フォルダがあるのを確認する。
　※x_86フォルダしかない場合は64bit未対応

上記ご確認してください。

##64bit化対応について
通常はGoogle公式のやり方を見るのが一番わかりやすいかと思います。
https://developer.android.com/distribute/best-practices/develop/64-bit?hl=JA

もしわからない場合は直接ご連絡か、この記事にコメントください。
jQuery書く前の下準備

この記事ではjQueryを書く前の下準備として、HTMLにどういった下準備をするべきかを記事にまとめました。

自身が業務をする上での備忘録として活用することを目的としています。

初心者がまとめた記事なので、間違った認識をしている可能性があります。
間違い等がございましたら、ご指摘いただけると幸いです。

#jQueryを書くための下準備
まずはじめにjQueryを書くための下準備にどういったものがあるのかまとめてリストアップしてみました。

- HTMLの作成
- HTMLにjQueryを読み込ませる

それでは次から各項目について触れていこうと思います。

#HTMLの作成
そもそも動きのあるWebサイトを作成するために使われるJavaScriptのライブラリの1つがjQueryです。
そのため、動きをつけたいWebページが存在しなければ、jQueryを書くことができません。

まずはHTMLの作成を行います。


#HTMLにjQueryを読み込ませる
次に作成したHTMLファイル上でjQueryを使えるようにするためにHTML内にjQuery.comからURLをコピーしてきて、headタグ内に埋め込みます。

jQueryを読み込ませるための方法はいくつかありますが、今回はheadタグまたはbody閉じタグ直前に直接URLを貼り付ける方法をまとめています。

- [jQuery.com](https://jquery.com/)を開く
- 画面右上あたりにある`Download` ボタンをクリック
- CDNの中にある[https://code.jquery.com](https://code.jquery.com)を開く
- 最新版の`minified` をクリック
- scriptタグの中にあるsrc`https://code.jquery.com/jquery-3.4.1.min.js` をコピー
- headタグ内またはbody閉じタグ直前にペーストする

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
<body>

</body>
</html>
```

#scriptタグを挿入する位置に決まりはある？
特に決まりはないようですが、一般的にはheadタグ内に入れておくパターンとbody閉じタグの直前に埋め込むパターンの2パターンあるようです。

ドットインストールのjQuery入門＃02ではbodyタグの閉じタグの直前が一般的と説明していますし、実際のWebページのHTMLを見るとheadタグ内に埋め込まれているページも目にします。

## body閉じタグ直前に埋め込むメリット
- ページの読み込み速度が速い

HTMLは上から下へ読み込まれるため、JavaScriptで重い処理を行っていたとしてもbody閉じタグの直前で読み込みが行われていればページの読み込みが遅くなるリスクを回避することができるわけです。

## headタグ内に埋め込むメリット
- HTMLの解析よりも先にJavaScriptファイルを読み込める

HTMLを解析するよりも先にJavaScriptファイルを実行しなくてはならないケースがあり、そういったときはheadタグ内に埋め込む必要があります。
また、JavaScriptが軽い処理であればページの読み込み速度に影響してくる心配もありません。

#まとめ
これでjQueryを書く前の下準備が終了しました。

自身が業務でjQueryを使用する際にHTMLに何を埋め込まなくちゃいけないんだっけ？
埋め込むsrcはどこに埋め込んだ方がいいんだっけ？
と、悩んだ際に確認するために記事にまとめてみました。

Scriptタグの埋め込み位置に関しては、適材適所のようなのでどちらが正しいというものでもないようです。

間違い等があればご指摘いただけると幸いです。
【初学者向け】golangのioutilについてまとめてみた。

golangでは、ファイルを読み書きする時には[ioutil](https://golang.org/pkg/io/ioutil/)というパッケージ機能を使うのが一般的です。
iouitlについて、少しまとめてみました。

###想定読者
golang初学者(メソッドの引数とか戻り値とか、:=の意味はソースを見てわかるレベル)

###ioutilって何？
「io」はデータの読み書き、「util」はutility(有用性)の略です。
つまり、データの読み書きに必要な機能をまとめたパッケージです。

一つ一つの機能を組み合わせてエラーハンドリングとか実装できない(そもそも忘れちゃう)プログラマでも
簡単にファイルの読み書きができるような機能をioutilというパッケージでを用意してあげたよ！便利でしょ！って感じ。

##どんな機能があるの？
###ファイルの生成機能(WriteFile)
```golang:ioutil.go
func WriteFile(filename string, data []byte, perm os.FileMode) error {
...
}
```

ファイルの生成には、WriteFileファンクションを使います。

ファイル名を第一引数、ファイルの中身を第二引数、ファイルに対するパーミッションを第3引数に渡します。
パーミッションについては、Windowsは特に気にしなくてよいようです。(適当に0を渡す)

例えば、HELLO WORLDという文字が書かれた、sample.txtを生成したい場合には、第一引数に"sample.txt"、第二引数に"HELLO WORLD"を[]byteに変換したものを渡せばよいです。


```golang:main.go
err := ioutil.WriteFile("sample.txt", []byte("HELLO WORLD"), 0)
if err != nil {
    log.Fatalln(err)
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/7360aefa-4c61-5247-5699-f5bd8e5e8c7e.png)


"HELLO WORLD"がどうしてbyte配列(72とか69とか)になるの？って人は[こちら](https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/network/conversion_table.html)を参照。(僕は知りませんでした...)



###ファイルの読取機能(ReadFile)
```golang:ioutil.go
func ReadFile(filename string) ([]byte, error) {
...
}
```
ファイルを読み込むときには、ReadFileファンクションを使います。
引数はファイル名一つだけですが、[]byteが戻り値なので、こちら側でstringに変換する必要があります。


```golang:main.go
//main.goの同階層にあるsample.txtを参照
data, _ := ioutil.ReadFile("sample.txt")
//main.goの1階層上にあるfileフォルダの中にあるsample.txtを参照
data, _ := ioutil.ReadFile("../file/sample.txt")

//戻り値の[]byteをstirngに変換
fmt.Println(string(data))
```
Leetcode #516: Longest Palindromic Subsequence

```swift
func longestPalindromeSubseq(_ s: String) -> Int {
    let length = s.count
    if length == 0 {
        return 0
    }
    var dp = Array(repeating: Array(repeating: 0, count: length), count: length)
    var s = Array(s)
    
    for l in 1...length {
        for i in 0...(length-l) {
            let j = i + l - 1
            if i == j {
                dp[i][j] = 1
                continue
            }
            if s[i] == s[j] {
                dp[i][j] = dp[i+1][j-1] + 2
            } else {
                dp[i][j] = max(dp[i+1][j], dp[i][j-1])
            }
        }
    }
    return dp[0][length-1]
}
```
調査という仕事に必要な技術(スキル)

* 調査の目的を把握する
* 問題と課題を把握する
* 課題に優先度づけをする
* 課題の期日を把握する
* 途中で報連相する
* 調査結果を報告する時は、自分の考えを添える
* 調査の目的に立ち返る

## 調査の目的を把握する

「自分はなぜこの調査をする必要があるのか」を把握する。

* 調査A「この調査に意味はない。ただ時間を潰す為だけにある」
* 調査B「機能X / 機能Y どちらを次のリリース候補とすべきかの判断材料を持ちたい。なので機能の利用統計を調査する」

同じ時間を使うならば、どちらの調査をやりたいだろうか。

目的がわからない場合は依頼者へ「なぜやるのか」と聴く。

## 問題と課題を把握する

目的を土台にして、問題と課題を設定する。

[問題と課題の違い、洗い出し方の詳細は別の記事]( https://qiita.com/ymatsukawa/items/314ffcff7a6db0c8f189) に書いてある。

付け加えて大事なのは「設定した問題と課題に誤りがないか」である。

**立場や役割が何であろうが**、設定した問題と課題を他の人(特に依頼者)にレビューしてもらう。

調査やり直しの大半は、問題と課題の設定誤りが原因だ。

## 課題に優先度づけをする

課題には優先度の高いもの、低いものがある。

* 優先度の高い課題
  * 知見もなく応用も利かないので、文献調査や実験をする
  * 知見のある人に聞き込みをする必要がある
  * 結果を得るために単純に時間がかかる(場合によっては優先低になる)
  * etc.
* 優先度の低い課題
  * これまで得られた知見を応用すれば、数分で片付く
  * 目的から外れる
  * etc.

各々分類して先に調査すべきものを見極める。

優先づけが正しいかどうかも、他の人(特に依頼者)にレビューしてもらう。

ここで優先順を誤ると、時間を浪費する。

## 課題の期日を把握する

調査に限らないが、課題に期日を決めて取り組む。

決まっていない場合は、依頼者に聴く。

時間はカネだ。浪費を許すな。

## 途中で報連相する

「10 個の課題に関して、結果をまとめて報連相する」 というのは

「100ファイルの差分をまとめてコードレビュー依頼する」

と同様のことだ。そんなコードレビューをレビューワーとしてやりたいだろうか。

区切りをつけて報連相することを奨める。やる目安を掲載しておく。

* 一つの課題を解決したら報告する
* 一日調査して、どの課題が解決しそうかしなさそうかの目処を連絡する
* 課題解決の困難さが見え始めたら連絡、期限の相談する
* etc.

## 調査結果を報告する時は、自分の考えを添える

「こういうことが分かりました」

それは結果報告の資料やコメントを見れば分かる。

報告から分かる自分なりの考えを添えて、報告を一段階レベルアップする。

* 課題は解決するのか、しないのか
  * する場合はどういう手立てを今後踏むべきか
  * しない場合は代替案がないのか
* その数値は良い値なのか、悪い値なのか
  * 良い値を継続するには現状の仕組みで良いのか
  * 悪い値を改善するには策が考えられるのか

## 調査の目的に立ち返る

調査の目的を忘れない。目的に立ち返れば調査すらしなくて良い場合がある。

```
依頼者: 機能A を実現したいんだけど、機能A が使うライブラリBの操作方法を調査してくれないか。
あなた: はい。ちなみに、なぜ機能A が必要なのか、目的を教えてもらえますか。
依頼者: 投稿者のデータを特定ユーザーにメール送信させたいんだ。
あなた: なるほど。ちなみに、それは半年ぐらい前に作った 内部向けメーラー機能Z で流用できないでしょうか。
依頼者: そういえばそんなのあったな。。ライブラリBのことは横に置いてくれ。内部向けメーラー機能Z ってどんな仕様だったか教えてくれるか。
```
ファインチューニングでBatch Normalizationを学習させる実験(Batch Normalizationの効果)

# Batch Normalizationだけをファインチューニングで学習させる

githubでBatch Normalizationレイヤー＋全結合層だけを学習しているコードを見たので意味があるんだろうか？検証してみた。

お題は、[ファッションサーチファンネル](https://funnel-service.com/)（ファッション画像検索エンジン）を運用するために使っている「男物？女物？」を判定するモデルです。

モデル構築のコード。

```
    base_model = InceptionV3(
        include_top=False,
        weights="imagenet",
        input_shape=None
    )

    # 全結合層の新規構築
    x = base_model.output
    x = GlobalAveragePooling2D()(x)
    x = Dense(1024, activation='relu')(x)
    predictions = Dense(ccount, activation='softmax')(x)

    # ネットワーク定義
    model = Model(inputs=base_model.input, outputs=predictions)
    
    
    for layer in model.layers[:249]:
        layer.trainable = False

        #ここ
        if layer.name.startswith('batch_normalization'):
            layer.trainable = True
    
    # 250層以降、学習させる
    for layer in model.layers[249:]:
        layer.trainable = True
```

コードの内容としては・・・
InceptionV3を読み込んで、全結合層をお題に合わせて作り、trainableをFalseにしたりTrueにしたりしている
（249までフリーズするがbatch_normalizationは学習する）

教師データは
男物1173枚、女物1436枚
validation画像は10％にした。


## Batch NormalizationレイヤーのtrainableをTrue

上記のコードで学習

![mnist-tutorial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/c423e5a0-ff88-f409-676a-a5fc9b6b848d.png)

val loss 0.070が一番小さい値だった。

## Batch NormalizationレイヤーのtrainableをFalse

実験内容として「#ここ」とある部分を削除しているだけ

![mnist-tutorial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185049/f40e640f-ce28-6df9-2f73-8444b777fa35.png)

val_lossは0.160が一番小さい値だった

# 結果


trainableをTrueにすると精度が上がる

|Batch Normalizationレイヤーの・・|val loss|
|-----|----|
|trainableをTrueにすると|0.070|
|trainableをFalseにすると|0.160|
rails5のプロジェクトをHerokuにデプロイしたときにCould not detect rake tasksとなる

# 開発環境
ruby 2.4.4
rails 5.2.3

# 起こったこと
rails5のプロジェクトをHerokuにデプロイするときに以下のエラーが起きる

```
#ターミナル
git push heroku master
```
と打ち込んでデプロイしようとしたら

```
remote:        Bundle completed (45.17s)
remote:        Cleaning up the bundler cache.
remote: -----> Installing node-v10.15.3-linux-x64
remote: -----> Detecting rake tasks
remote:
remote:  !
remote:  !     Could not detect rake tasks
remote:  !     ensure you can run `$ bundle exec rake -P` against your app
remote:  !     and using the production group of your Gemfile.
remote:  !     Activating bundler (2.0.1) failed:
remote:  !     Could not find 'bundler' (= 2.0.1) - did find: [bundler-2.0.2]
remote:  !     Checked in 'GEM_PATH=vendor/bundle/ruby/2.4.0', execute `gem env` for more information
remote:  !
remote:  !     To install the version of bundler this project requires, run `gem install bundler -v '2.0.1'`
remote:  !
```

# 対処法
エラーメッセージを見るとbundlerのバージョン2.0.1が見つからないらしい。
そこでbundlerのバージョン2.0.2をローカルでインストールしてみる。

```
gem install bundler -v 2.0.2
```

忘れずにbundlerのアップデートもしておく。

```
bundle update --bunlder
```

あとは変更があったのでgitにコミットしてからHerokuにデプロイする。

```
git add -A
git commit -m "update bundler"
git push heroku master
```

これでうまくいきました！

### 参考ページ
https://qiita.com/satouwork0316/items/a738392bcab03bac657a
ターミナルにブランチを表示する


```$git branch -a```をしなくても､ターミナルにブランチが表示されるようにしたい｡
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333998/e33ea078-3e9e-70b0-cf4b-17217a6ac3fa.png)



以下を.bashrcファイルに書き込みすればOK

```source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ '```

#手順
###.bashrcファイルの開き方
```$code .bashrc```
###.bashrcに追加で記述
```source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ '```

###.bashrcの内容を読み込み
```$source .bashrc```

###完了！


参考
https://bottoms-programming.com/archives/terminal-branch-name.html
(下の記事では､$が改行されないバージョン)
https://qiita.com/lemtosh469/items/334ff76366e054a3a3aa
C++ Builder 10.2 Tokyo + Windows10 > Geometry > フォームサイズ設定ではまる > (Height, Width)でなく(ClientHeight, ClientWidth)で設定する

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
Windows 10 v1903
```

### 概要

- フォームのHeight, Widthを指定
    - => 期待していたサイズよりも小さい
- フォームのClientHeight, ClientWidthを指定
    - => 期待していたサイズになる


### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Shape1->Width = 500;
	Shape1->Height = 500;

	this->Height = Shape1->Top + Shape1->Height + 10;
	this->Width = Shape1->Left + Shape1->Width + 10;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
	Shape1->Width = 500;
	Shape1->Height = 500;

	this->ClientHeight = Shape1->Top + Shape1->Height + 10;
	this->ClientWidth = Shape1->Left + Shape1->Width + 10;
}
//---------------------------------------------------------------------------
```


### 実行例

Height, Widthでの設定
![2019-07-21_16h25_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/159ce1ef-3c8f-58e1-2ab4-98821e012383.png)

ClientHeight, ClientWidthでの設定
![2019-07-21_16h26_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/9f23e780-6ecc-d608-38f7-2aa99b78ee27.png)

### 備考

:thinking: 

Windows 7 + XE4では(Height, Width)で問題なかったような。

### 関連

- [C++ Builder 10.2 Tokyo > Forms > Height > Windows 10: 実行タイミングによって異なる | Windows 7, 8.1: 実行タイミングによらず同じ > FormShow時とFormShow後](https://qiita.com/7of9/items/fcd4e85d87857e513393)
- [winAppDev > Link > Windows 10 > invisible border > 1px: visible, 8px: invisible](https://qiita.com/7of9/items/cca6839d914ce52897d9)
- http://docwiki.embarcadero.com/Libraries/Rio/ja/Vcl.Forms.TForm.Height
- http://docwiki.embarcadero.com/Libraries/Rio/ja/Vcl.Forms.TForm.ClientHeight
    - 注記: 訳がおかしい
        - > たとえば、フォームの ClientHeight は、Height プロパティ値からタイトル バー、サイズ変更したボーダー、スクロール バーの高さを引いたものにすることができます。 
            - 誤: にすることができます。
            - 正: です。
- http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.Forms.TForm.ClientHeight
    - > For example, the ClientHeight of a form is the value of the Height property minus the height of the title bar, resize border, and scroll bars. 


### XE4 + Windows 7

XE4 + Windows 7でも同じ実装を試した。
同じ結果になった。

自分が勘違いしていたようだ。
Tinderビジネスモデル

#目的
####経営思想をもち、発想力を養い、価値のある人間になり、楽しそうなるため。

#ゴール
- 「もっとこうしたらいい」という意見が理屈的に出てくる
- データサイエンスを用いてやりたいことが5つ以上決まる
- 尊敬できるビジネスに5つ以上出会える

#具体的な進め方 （60分）
1. ざっくりどんなサービスかを知る　
2. なぜそのサービスが必要なのかを知る　
3. シェア1.2.3位を知る
4. 1.2.3位のサービスの競争点を知る
5. なぜそのランキングになっているのかを考察して自分なりに答えを出す
6. 3位のサービスを上げるにはどうすればいいかを考える
7. アウトプットしてレビューをもらう(もらえれば) 

| 進め方|やる事 |時間|
|:-----------------:|:------------------:|:------------------:|
|１|ざっくりどんなサービスか知る|10分|
|２|なぜそのサービスが必要なのかを知る|10分|
|３|そのサービスの業界シェア1.2.3位を知る|3分|
|４|シェア1.2.3位の競争店を知る|10分|
|５|なぜそのランキングになっているのかを考察して自分なりの答えを出す|10分|
|６|3位のサービスを上げるにはどうすればいいかを考える|10分|
|７|アウトプットする|7分|

#1. ざっくりどんなサービスか知る

## Tinderとは
>Facebookを利用し、位置情報を使った出会い系サービスを提供するアプリケーションソフトウェア、「デートアプリ」で、相互に関心をもったユーザー同士の間でコミュニケーションをとることを可能にし、マッチしたユーザーの間でチャットすることができるようにするもの。ただし、Tinder 社の広報担当副社長ロゼッテ・パンバキアン (Rosette Pambakian) は、「出会い系サービスではなく社会的なつながりを作り出すサービス」であると述べている

利用ユーザーは1000億人

>2015年1月、Tinder は、「画像と一過性 (images and ephemerality)」を組みこんだメッセンジャー・サービス「Tappy」を開発した Chill を買収した。


## Tinderのビジネスモデル
課金システムがあり、ユーザーによって課金レベルを変えられる。


例えば
- Tinder Select (VIP　Tinderから招待されるか、モテるか)
- 月々18~29歳で10ドル
- 月々30~　倍近くの20ドル

#2. なぜそのサービスが必要なのかを知る
- 出会いを求める男女を結びつけるため
- 仕事が忙しい人に対して


#3. そのサービスの業界シェア1.2.3位を知る
1. タップル
2. Pairs
3. ハッピーメール
4. Tinder
5. Omiai
6. With
7. クロスミ―

#4. シェア1.2.3位の競争点を知る
## 1位タップルについて
###コンセプト
スマートフォン向け恋活婚活マッチングアプリである。コンセプトは「趣味でつながる恋活サービス」
###特徴
 - 自分の興味関心に近い感性を持つ異性と接点を持てる
 - 公的身分証による本人確認
 - 24時間体制のサービス関し
 - 恵比寿と銀座に初対面の来客者同士が交流するほか、タップルでマッチングした会員の初デートの場として提供されている
 - 270万DL
    - 月額制（2317~）

## 2位Pairsについて
###コンセプト
マッチング文化を作ること。Pairsが自然な選択肢として根付くようにする
###特徴
 - 月額制（3480~）
 - マッチングしたらメッセージ
 - 女性は課金なし
 - 会員数1000万人
 - FaceBookによる個人認証

## 3位ハッピーメールについて
###コンセプト
日本最大級の会員数!!出会い探しならハッピーメール理想の結婚相手や恋人と出会える。
優良の出会い・恋愛マッチングサイトです
###特徴
 - 出会えた確率74.5%
 - 累計登録数2000万
 - アフィリエイト
 - ポイント制
 - 女性は男性とのやり取りは無料
 - プロフィール閲覧50円、メール送信50円、掲示板閲覧10円
 - 20年の老舗
 - さくら多い
 - ハッピーパーティー（恋活・婚活パーティー）

#5. なぜそのランキングになっているのかを考察して自分なりの答えを出す
 - ランキング的に、ポイント制よりも月額制の方が多い
 - 単純にアフィリエイトが逆効果になってる
 - デザイン性
 - 交流の後にできることが違う
 
#6. 3位のサービスを上げるにはどうすればいいかを考える
 - 公式アプリのサムネを変えるべき
 - 20年間の土台があるなら、アフィリエイトで広告をする必要はない。
 - ハッピーパーティーをもっとハードル下げてマッチング率を上げた方がいい
 - ポイント制により、ポイントゲッターがいる。
 - アフィリエイトに出すよりオフラインでの交流の可能性

### 時間効率が悪くなるのがオフラインでのマッチングだが、さくらに出会うよりまし。また、一気に出会えるのでハッピーパーティーをより活性化するべき。ハッピーパーティー＞アフィリエイトにお金を変えて、ハードルを下げるほうが面白いと思った。
USBブートに対応していない Raspberry Pi を USB ストレージから起動する（microSD併用）

# USBブートに対応していない Raspberry Pi を USB ストレージから起動する（microSD併用）

##これはなに
USBブートに対応しないraspberry piを、USBストレージから起動する方法。
microSDを併用するので、ほとんど使い道はないと思われる。

##Raspberry Piのモデルを確認する
```

$ cat /proc/device-tree/model
Raspberry Pi 2 Model B Rev 1.1
```
MODEL B Rev 1.1 は USB ブートに対応していません。

##手順
1. microSD カード（容量の小さいものでよい）を、FAT32でフォーマットする。
2. [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/](https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/) より、bootcode.binをダウンロードし、microSDにコピーする。
3. microSDに、timeout という中身なしのファイルを作成する
4. microSDと、起動したいUSBストレージをraspberry Piにつないで、電源オンする。
Leetcode #124: Binary Tree Maximum Path Sum

```swift
func maxPathSum(_ root: TreeNode?) -> Int {
    if root == nil {
        return 0
    }
    var answer = Int.min
    helper(root, &answer)
    return answer
}

private func helper(_ node: TreeNode?, _ answer: inout Int) -> Int {
    if node == nil {
        return 0
    }
    let left = max(0, helper(node?.left, &answer))
    let right = max(0, helper(node?.right, &answer))
    answer = max(answer, left + right + node!.val)
    return max(left, right) + node!.val
}
```
Heroku×CloudflareでHTTP Origin Header didn't match request.base_urlというエラーがでる


## 経緯
Herokuの無料プランで作ったアプリをリリースしたかったため、schedulerで30分ごとにcurlでアクセスするように設定した。
その後お名前.comでドメインを取得し、Cloudflareで設定を完了して上手く新ドメインでページが表示されたが、CRUDに関する操作でエラーが出るようになってしまった。

## エラー文
HTTP Origin header (https://ドメイン名) didn't match request.base_url (http://ドメイン名)

エラーコードは422
CSRFとかに関係のある時に出るらしい

## 解決法
Cloudflareにログインし、Cryptタブの設定をFlexibleからFull (Strict)に変更する

<img width="1074" alt="スクリーンショット 2019-07-21 16.11.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241228/8a72fe4e-bac8-3bb8-b38b-8868911e9b00.png">

僕の場合はこれで解決しましたが、他の原因からこのエラーが出ている可能性もあります


## 参考
https://zeph.co/heroku-http-origin-header-request-base-url
チャレキャラに参加した話

#初投稿！まずは自己紹介

久留米高専に片道2時間ほどかけて通学してます。

趣味は音ゲーです。(CHUNITHM虹レ、Arcaea11.5)

授業でC言語やってます(現在2重ポインタ)

PICマイコンでライントレースプログラム書いてます(仕様変更によりオジャンになったので書き直し)

##ブログ書こうと思ったきっかけ
ボブネミミッミというアニメに　
>行動力の化身

という言葉があります。
まさしくこれです。
##本題
6月にあった小規模なアイデアソンにクラスの人と参加して残念な結果に終わり、
反省を踏まえてチャレキャラという福岡の開発イベントに参加しました。


[公式サイト](https://challecara.org)


そして昨日、第一回目のイベントが博多と小倉で行われました。


16,17歳で構成された久留米高専チームは最年少でした。


チャレキャラのSlackに入り、"#メンターに質問しよう"チャンネルを見ると
様々な分野で活躍するエンジニアさんのすごくつよそうな会話が…
頑張ろう……


アイデアソンの反省から事前にチームメイトと入念な話し合いを繰り返していて
作りたいものはある程度定まっていたので会場ではひたすらアイデアを煮詰めていました。



そしてメンターさんに相談タイム。(チャレキャラではこのイベントを「健康診断」と表現)

健康診断ではjavascriptでReactというフレームワークを使うことをオススメされ即決定。
その後メンターさんと雑談。

システム障害で枝が切れた話、conflictで悲しい思いをした話、特定のブラウザーでアプリが思うように動かない話など
エンジニアならではの会話で盛り上がりました。


イベントの最後のスライド発表ではチームメンバーの小籠包さんの描いた[進研ゼミ風の漫画](https://docs.google.com/presentation/d/10_OUcowNq8hiZsyUHXGtXtVfGpNTUIg7GePSDG_OK38/edit?usp=sharing)が
とても分かりやすくて自分たちの思い描くアプリ像をよく伝えられたと思います。

プレゼンが終わってくつろいでいると小倉会場に向けたプレゼンに抜擢されてしまい慌ててもう一度プレゼン。*緊張しました…*

そして懇談会へ、大量の:pizza:がテーブルに並び元高専生の方々と高専トーク。
寮や留年、進路などの話題ですごく盛り上がりました。

クラスメイトの虎太郎がこの前優勝したハッカソンの社長が高専卒現大学生と知ってびっくり…
高専って色々な進路があるんだなぁ…

あだ名をつけるのが得意という社長から<b>厨二</b>というあだ名をもらったのでtwitterのIDにさせて頂きました:innocent:

楽しい:pizza:パーティーも終わり、帰りに白メガネつよつよ高専生のクボ太郎さんといろいろな話をしました。
チャレキャラが終わったら北九州高専さんとの交流イベントしたいです!!!(サイバーエージェントさんも協力してくれそう…？)

すごく有意義な一日になりました。
これからはアプリ開発に向けて頑張っていきたいです！！！！！！！！

##作る(予定の)もの
学校のクラス内での利用を想定した匿名チャットツール(3コマ漫画を参照)
Reactで実装予定
チームメンバー全員がほぼweb言語未経験の状態なのでまずはjavascriptを学習する予定
(メンターさん曰く、対応していないブラウザーのためにもバージョンはES5がオススメ)

###最後に
めちゃくちゃ長くなりました…

初投稿です。

つたない文章やタイポなどは大目に見てほしいです…

ここまで読んでくださった方ありがとうございました
アプリ完成に向けてがんばります！
iMacのターゲットディスプレイモードで真っ黒になる問題

## 概要
iMac(2014 Mid)を家ではmacbook proのサブディスプレイとして使い続けているのだが、数年前から、`cmd + F2`を押しても真っ黒になるようになった。よくみたら、うっすらと画面が映っているから輝度が最小に固定されている状態になっているのかなと思う。

英語でググるといくつか解決策が出てくるが、根本的な解決策はない模様。
めっちゃ不便。モニター買うか悩む。

あと、Apple公式の回答で治った試しがない。
SMCリセットうまくいかない。

応急処置的に、自分が1度でも成功した解決策を載せる。

### iMac側でログアウトして`cmd + F2`
毎回ログアウトするのはだるいけど、iMac側でログアウトしてから`cmd + F2`やるとほぼ100%成功している。
HDD時代のiMacなので、ログアウト＆ログインに多少時間かかるのが難点。

### iMac側でログアウトしたあと、ログインして輝度を一段階上か下に調整してから`cmd + F2`
↑に比べて面倒ではあるけど、iMacで音楽流しながら使えたりとか、iMacで処理を走らせながら使えるなどのメリットがある。
一時期は毎回うまくいっていたが、最近失敗することが多くなった。

### ターゲットディスプレイモード中にサンダーボルトケーブルをぶち抜く
ターゲットディスプレイモード中にケーブルをぶち抜いて再度繋いでやり直すとうまくいく時がある。不思議。

### `cmd + F2`連打する
連打してるとたまにうまくいくことがある。


## まとめ
個人的に、 「iMac側でログアウトして`cmd + F2`」に落ち着いている。成功率が高いし、古いiMacのスペックで何かやることはほぼないので。音楽もApple TVでテレビから流してるし。

あと、一応書いておくとターゲットディスプレイモードは **iMac(Late 2014)以降では使えません**。
対応機種： https://support.apple.com/ja-jp/HT204592
ターゲットディスプレイモード、新しいiMacでも早く復活してくれ。。。
【VBA】VBEおすすめ設定

#VBEのおすすめ設定
「ツール」→「オプション」から諸々の設定を変更できます。

##機能の設定
「編集」タブにある「コードの設定」を変更します。⇩のような設定にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466711/b67f3805-c7ae-124e-69b6-86be599fc32a.png)

##色・フォントの設定
「エディターの設定」タブの内容を変更します。

- コードの表示色

| ﻿ | 前景 | 背景 |
|:---------|:---------|:---------|
| 標準コード	|黄色 | 黒<br /> |
| コメント	|灰色 | 黒<br /> |
| キーワード	|水色 | 黒<br /> |
| 識別子	        |白　 | 黒 |


- フォント：**Meiryo UI（日本語）**
- サイズ　：**10**
ラズパイ　ＵＳＢ接続

ＵＳＢ２．０　３２Ｇが　爆安だったので　ラズパイに接続することに。
以下の手順でＵＳＢのパーテイション作成

#■①■Windowsで　Exfat　フォーマット

#■②■パーテイション作成
$sudo cfdisk /dev/sda 
個人的には　cfdisk が好き
以下でもよい。
$sudo fdisk /dev/sda

以下でパーテイションを作成。
sda1 20g
sda2 9.3g

Write　を忘れず。
　cfdisk は、更新しますかと聞いてきた場合、yes とする。

#■③■フォーマット
$sudo mkfs.ext4 /dev/sda1
$sudo mkfs.ext4 /dev/sda2

#■④■パーテイションのＵＵＩＤを記録
$sudo blkid /dev/sda1

```
/dev/sda1: UUID="xxxxxxxxxxxxxxxxxxxxx" TYPE="ext4" PARTUUID="xxxxxx-01"
```

$sudo blkid /dev/sda2

```
/dev/sda2: UUID="xxxxxxxxxxxxxxxxxxxxx" TYPE="ext4" PARTUUID="xxxxxx-02"
```

$ls /dev/disk/by-uuid/ で　シンボックリンクができていることを確認。

#■⑤■マウント設定
１）マウントポイント設定
$sudo mkdir /usb
$cd /usb
$sudo mkdir  21g
$sudo mkdir  10g 

２）マウント
$sudo nano /etc/fstab
以下を追加。

```tab:fstab
UUID="xxxxxxxxxxxxxxxxxxxxx"  /usb/21g ext4 defaults,noatime 0 0
UUID="xxxxxxxxxxxxxxxxxxxxx"  /usb/10g ext4 defaults,noatime 0 0
```

リブート
$df -h で確認

#■⑨■補足
mariadb backup とかに使用しています。
■すべてのＤＢのbackup
$chmod -R 755 /usb/21g
$mysqldump --user=root --password=xxxxxxxx --all-databases| gzip > /usb/21g/all-databases.sql.gz

■ちなみにRecoveryは
$gzip -d /usb/21g/all-databases.sql.gz 
$mysql --user=root --password=xxxxxxxx <all-databases.sql

ディレクトリをＵＳＢにコピーとかもしてます。
===いつでもラズパイをVerUpできるように。
簡単な文字列フォーマットチェック C++

#事の起こり
C++を用いて文字列のフォーマットチェックを行いたいけど、for文を用いて一文字ずつチェックするのは面倒。そんな面倒を解決するため、正規表現を用いたフォーマットチェックについて学習したので自分のための忘備録を残すことにしました。

#電話番号のフォーマットチェックについて考えて見よう

突然ですが、皆さん。次の3つの文字列の内、「電話番号」に該当するものを選んでみてくだい。

①999-9383-38391
②999-3393-9856
③90933-480-222

正解は②番です。簡単ですね。しかしここで、②が電話番号である条件について考えてみましょう。答えは次の通りです。

(1) 数字と'-'合わせてぴったり13桁
(2) 3文字目が'-'
(3) 8文字目が'-'
(4) 3,8文字目以外は必ず数字である。かつ、その数値は'0'以上'9'以下である。

以外と複雑ですね。 この条件の通りにフォーマットチェックして文字列が携帯電話番号か否かを判定する関数は次のようになります。(あくまで、私が考える方法なので読み飛ばしてもらって結構です。)

```cpp
bool judge_tell_num(string tell_num){
    int num = 0;

    if(tell_num.length() == 13){//(1)ぴったり13桁か否か?
        for(int i = 0;i<=tell_num.length();i++){//一文字ずつ条件判定
            if(i==3 || i ==8){//(2),(3)3文字目と8文字目が'-'か否か?
                if(tell_num[i] == '-'){
                    num++;
                }else{};
            }else{//(4)3,8文字以外は数字か?
                if(tell_num[i] >= '0' && tell_num[i] <= '9'){
                    num++;
                }else{};
            }
        }
    }else{//13桁でなければfalseを返す。
        return false;
    }

　　//13桁それぞれが指定の条件を満たしていたら、trueを返す。
    if(num == 13){
        return true;
    }else{
        return false;
    }
}

```
汚いコードですよね。条件判定の順番を工夫すればもっと読みやすく、無駄なく書けるはずです。
**本当は、誰が読んでも理解できるようにフォーマットチェックの処理を書きたい。でも、フォーマットチェックに時間をかけたくない。そんな時は、正規表現とregexオブジェクトを使えば楽に分かりやすくフォーマットチェック処理が書けます。**

#正規表現とregexオブジェクト用いてフォーマットチェックをしよう
いきなりですが、正規表現を用いて先ほどの電話番号を表現すると次のようになります。

・携帯電話(999-3393-9856など)の番号の正規表現
**① \d\d\d-\d\d\d\d-\d\d\d\d または ② \d{3}-\d{4}-\d{4}**

「\d」がたくさん並んでますね。この「\d」は正規表現において「数字」を表しています。「\d{n}」はn個の連続する「数字」を表しています。「-」はそのまま「-」を表します。要は、
         **「3つの数字の連続」-「4つの数字の連続」-「3つの数字の連続」が携帯電話番号の正規表現である**
と言うことを意味しているわけです。ここまで、表現できれば後は簡単で、文字列がこの正規表現に合っているか調べれば、その文字列が携帯電話番号であるかが判別できます。C++ではこのような正規表現を用いた判別をregexライブラリで行うことができます。次のコードがその一例です。(\d{3}-\d{4}-\d{4}がR"()"で括られているのは\d{3}-\d{4}-\d{4}が生文字リテラルであることを表すためです。)

```cpp
#include <iostream>
#include <regex>
using namespace std;
int main() {
    string tell_num = "099-9999-9999";//電話番号
    regex format (R"(\d{3}-\d{4}-\d{4})");//regexオブジェクトで正規表現を用いた一般化
    bool result=regex_match(tell_num,format);//フォーマットチェックの結果を返す
    if(result == true){
        cout << "電話番号 形式OK" <<endl;
    }else{
        cout << "電話番業 形式 NG" <<endl;
    }
```

このコードの`regex format (R"(\d{3}-\d{4}-\d{4})")`は`regex 変数名 (正規表現)`と言う構文になっていて、要はformatが指す正規表現は\d{3}-\d{4}-\d{4}であることと言う意味です。(極端な話、`int a`とかとかの変数宣言と一緒です)
次の`regex_match(tell_num,format)`は`regex_match(対象文字列,正規表現)`と言う構文になっていて、対象文字列が正規表現で表したフォーマットと一致している時、tureを返し、そうでない時にfalseを返すと言うregexライブラリで提供される関数です。そして、この関数の戻り値から、任意の文字列が携帯電話番号であるかを判別しています。

こんな感じで、正規表現とregexを用いて簡単に携帯電話番号か否かの判別を行えるようになりました!!!便利ですね。

#まとめ
C++で文字列のフォーマットチェックをする時は、我流の処理を書くより正規表現とregexオブジェクト使った方がはるかに楽だと感じました。今回の例では「数字」を表す「\d」しか正規表現を紹介していませんが、数字を表す以外にも「任意の文字」を表す「.」など様々な正規表現が存在するので興味のある方は調べてみてください。また、regexライブラリには文字列の検証を行う**regex_match**以外にも正規表現に従った文字列の置換を行う**regex_replace**や正規表現で文字列中の部分文字を検索する**regex_iterator**など様々な便利な関数が提要されていますので、こちらも調べてみると役に立つと思います。
Gitをインストールする方法(Windows)

就職先が決まり、Gitのインストール方法を確認するために前回は[Gitをアンインストールする方法(Windows)](https://qiita.com/RisaWatanabe417/items/beb2cbeb82da3dc3fb1e)をまとめました。

今回は逆にインストールする方法についてまとめます。

# Gitの公式ページからインストール
[Gitの公式ページ](https://git-scm.com/)からインストールします。
<img width="959" alt="コメント 2019-07-19 151915.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/dbb89d5e-abf3-ed80-a4de-99ab0f66027b.png">
トップページの`Downloads` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/89632068-3c51-6a06-a8fd-4ce8b8aebb7e.png)
クリックしたらOSの選択をします。
今回はWindows版をダウンロードします。
<img width="685" alt="コメント 2019-07-19 152523.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/38e52ba2-b622-a1f1-aa3f-50aebfe4fa30.png">
`Windows` をクリックすると自動的にインストールが開始されます。
インストールが始まらない場合は、`click here to download manually` をクリックします。
<img width="385" alt="コメント 2019-07-19 152922.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/54044e3c-c36c-ba04-9e61-f45a9a2656e0.png">
インストールは初期設定のままで問題はないので`Next>` をクリックします。
<img width="386" alt="コメント 2019-07-19 153911.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/2fc60fe5-3f10-60df-46fc-b2a061f5a241.png">
インストール先を選択し、`Next>` をクリックします。
今回はCドライブを選択しました。

- Select Components(Gitのインストール項目の確認)
- Select Start Menu Folder(フォルダー名を確認)
- Choosing the default editor used by Git(エディタの確認)
- Adjusting your PATH environment(コマンド実行ツールの確認)
- Choosing HTTPS transport backend(HTTPS接続設定を確認)
- Configuring the line ending conversions(改行コードの設定を確認)
- Configuring the terminal emulator to use with Git Bash(Git Bashのエミュレーターを確認)
- Configuring extra options(拡張オプションを確認)
- Configuring experimental options(試験的なオプションを確認)

上記の項目はデフォルトで選択されている状態で大丈夫です。
すべて`Next>` をクリックします。

細かい設定に関しては、git configコマンドで変更可能です。
<img width="388" alt="コメント 2019-07-19 154825.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/8384254d-5618-a2cd-2166-24c21214ea54.png">
`Finish` をクリックしたらインストール完了です。

# インストールできたか確認しよう
WindowsであればWindows Power Shellまたはコマンドプロンプトで`git --version`を実行します。
Gitのバージョンが表示されれば、インストールが正常に完了していると判断してください。

Windows Power Shellであれば、`Windowsキー` ＋`X` →`I`で出てきます。
<img width="359" alt="コメント 2019-07-21 150304.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/851e818f-daa7-d9d0-79da-26f501a9f880.png">

コマンドプロンプトであれば、`Windowsキー` を押したあとに`cmd` をうつと出てきます。
<img width="355" alt="コメント 2019-07-21 150423.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/cd7bcbff-1d98-18c5-a035-1d277ec99893.png">

# まとめ
インストールする際に表示される選択項目は基本的にはデフォルトのままで問題ないので簡単でした。
こういったインストール方法をまとめた記事は多くありますが、実際に自分の手でまとめると理解度も増すと思いQiitaにまとめてみました。

間違え等あればご指摘いただけると幸いです。
多次元配列を一次元化する

多次元配列であるリストまたはarrayを一次元化する。
理想は下のようなコードがあればいい。

```python:Flatten.py
F = [[1, 2, 3], [4, 5], [6], [7, 8, 9, 10]]

def flatten():
    pass

print(flatten(F))
#=>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

調べてみると、Numpyに似たような関数を見つけることができた。

```python:np.ravel.py
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print(np.ravel(A))
#=>[1 2 3 4 5 6 7 8 9]
```
または

```python:np.flatten.py
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
A = np.array(A)

print(A.flatten())
#=>[1 2 3 4 5 6 7 8 9]
```
実際にもとの多次元配列で試す。

```python:np.ravel.py
F = [[1, 2, 3], [4, 5], [6], [7, 8, 9, 10]]

np.ravel(F)
#=>array([list([1, 2, 3]), list([4, 5]), list([6]), list([7, 8, 9, 10])],dtype=object)
```
このように一次元配列にすることができなかった。np.flattenでも同様な結果となってしまった。
Numpyのこれらの関数は行列のベクトル化で使われるのだろう。


そこで最後にsum関数を使ってみる。
sum関数は組み込み型とNumpyの2種類がある。

```python:sum.py
F = [[1, 2, 3], [4, 5], [6], [7, 8, 9, 10]]

sum(F, [])
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

np.sum(F, axis=0)
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

このようにsum関数を使えば多次元配列の一次元化をすることができた。
大きな多次元配列を扱うとき、組み込み型のsum関数を使うとメモリ不足のせいかフリーズしてしまった。しかしNumpyのsum関数は比較的早く処理できた。

例として、１００個のベクトルが合わさった全部で５０００万以上の要素のある多次元配列では約３７秒で処理を終えた。

したがって、一次元化する時はNumpyのsum関数をすすめる。
Gitをアンインストールする方法(Windows)

就職先が決まり、Gitのインストール方法を再確認しようと思い、一度Gitのアンインストールをすることにしました。

機械音痴な私は、日頃から下手にPCの設定をいじらないようにしています。

今後、エンジニア職につくことになり、プログラムのアンインストール方法は知っていて当たり前の知識だと思いますので、自身の備忘録として記事にまとめました。

Gitのインストール方法はこちらをご覧ください。
[Gitをインストールする方法(Windows)](https://qiita.com/RisaWatanabe417/items/fafefed8aed20d157519)

#　疑問点
- Gitがどこにダウンロードされているのか分からない
- マウス右クリックしたら出てくる削除でアンインストールが完了するの？
- アンインストールが正常にできたか確認する方法は？

ネットで調べてた方法だとコントロールパネルを開くとGit version 1.8.1.2-preview20130201といったようなプログラムが出てくると記載されていましたが、コンパネを端から端まで何度も確認しましたがありませんでした。
何でないんだ？と不思議に思い記事の更新日を見ると2019年5月。
最近更新されているんです。

PCごとに表示のされ方が違うのでしょうか？

今回は私もPCで行ったアンインストールの方法をまとめました。

# Gitをアンインストールしよう
アンインストールの一連の流れとしては下記の通りです。

`スタート` →`コントロールパネル` →`プログラム>プログラムのアンインストール` →`すべてのコントロールパネル項目` →`プログラムと機能` →`Git version 2.18.0` →`アンインストール` 
<img width="959" alt="コメント 2019-07-19 143258.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/4c0f4f73-5390-5fa0-69e4-c63bfe15cc81.png">

アンインストールしたい「Git version 2.18.0」上で右クリックすると`アンインストール(U)` と出てくるので、クリックします。

クリックし、アンインストールするプログラムで間違いなければ`Yes` を選択し、アンインストールを実行します。

<img width="959" alt="コメント 2019-07-19 144129.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463391/fdfa4dac-72fe-4034-f0e9-2601d6cf42e9.png">

アンインストールの実行をはじめて数秒ほどで`プログラムと機能` の画面上からGitのプログラムが消えたことが分かります。

# アンインストールされているか確認
正常にアンインストールされているか確認する方法を紹介します。
WindowsであればWindows Power Shellまたはコマンドプロンプトで`git --version`を実行します。
Gitのバージョンが表示されなければ、Gitのアンインストールが正常に行えたと判断してください。

Windows Power Shellであれば、`Windowsキー` ＋`X` で出てきます。
コマンドプロンプトであれば、`Windowsキー` を押したあとに`cmd` をうつと出てきます。

# まとめ
今までプログラムを自分1人でアンインストールをしたことがなかったのですが、実際にやってみると大した作業ではないですね。
昔はデスクトップのアイコンを削除すればアンインストールされているものだとばかり思ってましたが、それは間違いだと大学時代にはじめて知ったときは衝撃でした。

こちらの記事はあくまで自身の備忘録としてまとめた記事です。
SPA、SSR、プリレンダリングの違いをまとめてみた

Nuxt.jsを使い始めましたが、SPAとSSRの違いをあまり理解していなかったので、それぞれの動作と違いをまとめました。
SSRについて調べる過程でプリレンダリング(事前描画)についても学んだことも一緒にまとめています。

普段の業務ではコードそのものに目が行きがちですが、動作の違いやメリット/デメリットをしっかり理解した上で技術選定をすることが必要だと感じます。


間違っている点があればマサカリください!

## HTML/CSS/JacaScriptのみ
シンプルにHTML/CSS/JacaScriptのみで動くアプリケーションの場合

### 動作の流れ
![Group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267607/79af084e-e1fc-933b-3361-5a4068dcb1b8.png)

1.クライアント側からHTTPリクエストが送られる
2.サーバーがhtmlファイルを生成
3.サーバーからレスポンスとしてHTML/CS/JSが返ってくる
4.ブラウザ側でhtmlファイル内のJSを実行。ここにAjaxなど再度サーバーとの通信が必要な処理が含まれていた場合は、再度サーバーへリクエストを送る。

### デメリット
- 変更がない部分(ヘッダーなど)のHTMLも毎回サーバーから送信されるので処理に時間がかかる

## SPA(Single Page Application)
ページ遷移をすることなく、同一のページ内でコンテンツのみを切り替えるアプリケーション

### 動作の流れ
#### 初回のページ読み込み
![Group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267607/e1c172ec-4d2e-4a4f-5ff5-a8b19985003a.png)

先ほどと同様に、クライアントからのリクエストに応じてサーバーからHTML/CS/JSが返ってくるので、クライアント側(ブラウザ)でjsを実行してページを表示します

#### 2回目以降
![Group 2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267607/60046462-c6fa-ec95-fa7d-3cdd20164dd4.png)

1.クライアント側から差分の更新に必要なデータのみのリクエストが送られる
2.サーバー側でjsonデータを用意
3.レスポンスとしてjsonやXML形式でデータが返ってくる
4.ブラウザ側のjsで差分のみを更新してHTMLを生成する

先ほどとの一番の違いは、クライアント側の操作によって新たに必要となった**差分のデータのみ**をHTTPリクエストで要求することです。
この際のリクエストにはAjaxなどが使われ、サーバーからのレスポンスもjsonデータなどです。

### メリット
- 2回目以降は差分のデータのみを要求するので処理が早い


### デメリット
- JSのコードが増えるので初回のページ表示は遅くなる

## SSR(Server Side Rendering)
SPAではブラウザで行われていたJSの実行とHTML生成をサーバー側で行う技術

### 動作の流れ
![Group 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267607/cbd6fd6b-b090-9e87-9379-77cc6cb0e2b9.png)


1.クライアント側からリクエストが送られる
2.サーバーが更新後のHTMLを生成してクライアントに返す
3.ブラウザ側でHTMLを表示する

AjaxなどでHTTPリクエストを送信する部分はSPAと同様です。SPAとの違いはHTMLをクライアント側(ブラウザ)ではなくサーバーで行う点にあります。

### メリット
サーバー側でHTMLを生成するので

- ページ表示が早い(SPAの欠点である初回読み込みの遅さも無い)
- ユーザーの通信環境に左右されにくい

### デメリット
- サーバー側の負担が増える
- Node.jsを実行できるサーバーが必要になる
- フロントエンド側でのエラーハンドリングが重要になる(不適切なエラーハンドリングがサーバー全体に影響を及ぼす)

## プリレンダリング(事前読み込み)
ビルド時にindex.htmlのような1つのHTMLファイルを生成するのではなく、ページごとにHTMLファイルを生成する技術

### 動作の流れ
![Group 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267607/45b33c18-ec2c-a0e2-ea76-c8b3890286ef.png)


1.クライアント側からリクエストが送られる
2.ビルド時にあらかじめ作られていたHTMLをサーバーが返す
3.レスポンスとしてHTMLを受け取り、ブラウザ側でページを表示する

[Vue SSR ガイド](https://ssr.vuejs.org/ja/)でSSRとの比較がされています。
SSRとの大きな違いは、クライアントからのリクエスト時にサーバーを使用してHTML生成をするか、ビルド時にHTMLファイルを生成するかです。

### メリット
- 静的なページへ遷移するのと同様の動作なので高速
- SSRのようなNode.jsが動作するサーバーは不要

### デメリット
- ページ数が多い場合はビルド時のHTMLが増えるので向いていない

## 参考
[Vue SSR ガイド](https://ssr.vuejs.org/ja/)
[ユーザー体験を向上させるサーバーサイドレンダリングJavaScript — 歴史と利点](https://medium.com/@sundaycrafts/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BD%93%E9%A8%93%E3%82%92%E5%90%91%E4%B8%8A%E3%81%95%E3%81%9B%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0javascript-%E6%AD%B4%E5%8F%B2%E3%81%A8%E5%88%A9%E7%82%B9-df68cd7cd991)
[プリレンダリングを用いてVue.jsのSPAをビルドする導入から設定まで](https://www.ritolab.com/entry/182)
[SPA(Single Page Application)の基本](https://qiita.com/takanorip/items/82f0c70ebc81e9246c7a)
Gradle Wrapperの導入と更新のーと

- Gradle 5.5.1
- https://docs.gradle.org/current/userguide/gradle_wrapper.html

GradleはWrapperを使う。Gradle Wrapperは手元にGradleがインストールされていなくてもGradleを使えるようにするもの。

# 導入

手元にGradleをインストールしてから。

```
gradle wrapper
```

# 更新

手元のGradleを更新してから。

```
gradle wrapper
```

導入と同じ。

## 手元にないバージョンに更新

ドキュメントに書いてるやり方。

```
./gradlew wrapper --gradle-version 5.5.1
```

これで変わるのは `distributionUrl` くらいなので、直接 `gradle/wrapper/gradle-wrapper.properties` を書き換えてももいい。

`--gradle-version` では `gradlew.bat` とかは更新されない。Gradlew Wrapperが更新された状態で `./gradlew wrapper`したら更新される。
Rails 部分テンプレートについて　メモ

#部分テンプレートとは
部分テンプレートを作成することで
ビューのレイアウトの構造が同じである部分を共通化することで
コーディングをシンプルにすることができる。
ビューファイルごとに記述するコードの量を減らすことができる。


###部分テンプレートの作成
部分テンプレートの作成は共通して使用するコードを
記述したビューファイルを作成する。
作成する際は、名前の頭に_（アンダーバー）をつける
決まりがある。

###部分テンプレートの使い方
部分テンプレートの作成ができたら、部分テンプレートを使用する
箇所でメソッドを使い、呼び出してあげる必要があります。

####renderメソッド
部分テンプレートを使用するにはrenderメソッドを使って呼び出します。

以下記述例（部分テンプレート名　_sample.html.erbの場合）

~~~erb:xxxx.html.erb
<%= render partial: "sample", locals: { tweet: "hello!" } %>
~~~

・partial
partialには部分テンプレートのファイル名を指定します。ただし_(アンダーバー)は記述しないので注意。
部分テンプレートファイルが呼び出すビューファイルと別のフォルダにある場合は、
partial: "samples/hello"のようにファイルの場所を指定します。

・locals
localsは部分テンプレートにある変数に対して指定の値を渡すために使います。
上記の例だと部分テンプレートに記述されているtweetという変数には"Hello!"を代入するように
指定していることになります。


#おわりに
共通のビューというとappliction.html.erbがあるが
これはビューファイル全体に共通するコードを記述する場所であり
ビューファイルが読み込まれる際は、appliction.html.erb
が呼ばれ、その上で処理ごとのビューファイルが読み込まれる。

###表示画面のイメージ
・部分テンプレートあり
appliction.html.erb + ビューファイル（部分テンプレート）

・部分テンプレートなし
appliction.html.erb + ビューファイル
PDFで "Preserve Vector Data" が効かないっぽい → "Individual Scales" にする

Xcode 11 beta4（おそらくはXcode 10でも？）でPDFを用意して、ちゃんと "Preserve Vector Data" にもチェックを入れてるのに画像がなんかぼやけてた。

どうしてだろうとしばらく色々試したところ、 Scalesが "Individual Scales" になってないとダメっぽい。"Single Scale"だとダメー。

<img width="315" alt="Screen Shot 2019-07-21 at 3.30.19 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311658/c09da269-0efd-d199-96a7-0053da92e202.png">

## 追記：

と思ったけどこれで直ってるのは**iOS13だけ**で、iOS12以前でも直すためには以下のように書かなくてはいけなかった (Xcode 11 beta4)：

```swift
imageView.image = nil
imageView.image = UIImage(named: "image-name")
```

まずコードで画像を指定しないといけない。Storyboardじゃダメ。そしていったん `image`を`nil` にしないといけない。なんだこれは🤦🏻‍♂️
JavaFXをDockerで実行するには

# TL; DR

[VcXsrv](https://sourceforge.net/projects/vcxsrv/)をインストールし、下記をDockerfileに追記しましょう。

```dockerfile:Dockerfileに追記するコマンド
ENV DISPLAY host.docker.internal:0.0
RUN apt-get install openjfx
```



# はじめに

JavaFXアプリケーションをDockerコンテナ内で実行したい！

そう思う方は多いと思います。
私もその1人です。

その際に、いくつかの問題点にぶつかりました。

* openjdkのベースイメージだけだとビルドが通らない
* どうやってコンテナ内のGUI画面をコンテナ外に出すのかわからない

ここでは、上記の問題を解決します。



# openjdkのベースイメージだけだとビルドが通らない

openjfxパッケージをインストールする必要があります。

OracleJDKとOpenJDKに分割されたJava9以降、OpenJDKにJavaFXのパッケージは含まれなくなりました。
本来であれば、openjdkパッケージおよびopenjfxパッケージをサラのベースイメージに導入すべきですが、openjdkが公開しているベースイメージに、openjfxパッケージは含まれていません。

Dockerfileに下記のような記述が必要となります。

```dockerfile:openjfxパッケージのインストール
RUN apt-get install openjfx
```

綺麗に書く場合は、次のように書くとよいでしょう。

```dockerfile:openjfxパッケージを綺麗にインストール
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      openjfx \
    && \
    rm -rf /var/lib/apt/lists/*
```

> OpenJFX can not be used anymore · Issue #323 · docker-library/openjdk
> https://github.com/docker-library/openjdk/issues/323
>
> rburgst/java8-openjfx-docker: openjdk8 container including openjfx
> https://github.com/rburgst/java8-openjfx-docker



# どうやってコンテナ内のGUI画面をコンテナ外に出すのかわからない

コンテナ内部の画面は、コンテナ内部にしか表示されません。
ということは、コンテナ外部から見ることは、通常であれば不可能ということになります。

しかしそこはDocker、何もしていないわけではありません。
コンテナ内部のGUI画面をコンテナ外部に出力する方法があります。

詳細は、下記Webページを参照してください。


## VcXsrvのインストール

[VcXsrv](https://sourceforge.net/projects/vcxsrv/)をインストールします。

このソフトウェアは、X-Serverのエミュレータのようなものらしく、WSLのGUIアプリを表示できたりするものです。

> WSLとVcXsrvでLinuxのGUIをWin10で表示する
> https://www.usagi1975.com/201903021706/


## 環境変数DISPLAYの設定

環境変数DISPLAYは、コンテナ内部のx window systemが表示するGUI画面の出力先です。
これを、 `host.docker.internal:0.0` と設定してあげましょう。

```dockerfile:環境変数DISPLAYの設定
ENV DISPLAY host.docker.internal:0.0
```

> Docker for windowsのコンテナ内でGUIアプリを実行 - FILES=0
> https://fileszero.kimurak.net/2019-04-18-docker-and-gui-on-windows/
>
> DISPLAY - なんなんなん行く？
> https://sites.google.com/site/teyasn001/ubuntu-12-10/huan-jing-bian-shudisplay
>
> ローカルからリモートのXサーバにウィンドウを飛ばす - Qiita
> https://qiita.com/kkk627/items/8db34266722488eae412


---

まとめると、以下のような仕組みとなります。

1. コンテナから `host.docker.internal:0.0` に画面を出力
1. コンテナ外部のVcXsrvが `host.docker.internal:0.0` の受信先
1. VcXsrvが画面上にGUI画面を出力



# おわりに

僕の作成したJavaFXアプリはGradle製ですので、下記のような作りとなります。

```dockerfile:例
FROM gradle:5.5-jdk11

ENV DISPLAY host.docker.internal:0.0

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      openjfx \
    && \
    rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/morichan/retuss.git

WORKDIR retuss

RUN gradle build

CMD ["gradle", "run"]
```

参考にしてみて下さい。

> docker-images/retuss-docker at master · Morichan/docker-images
> https://github.com/Morichan/docker-images/tree/master/retuss-docker
>
> Morichan/Retuss: Real-time Ensure Traceability between UML and Source-code System
> https://github.com/Morichan/Retuss
rails devise ログアウトできなかった時の対処法

Railsを使ったアプリケーションの開発を行なっていて、認証をdeviseという超便利なgemに任せるという方は、多いのではないでしょうか。
今回、そんなdeviseを利用中に、"ログアウト"機能がうまくいかず、デバックに少し時間がかかったので、こちらにその方法を残しておきます。

環境： Rails 5.1.7 , ruby 2.4.1 

最初、

```
 $ rails routes
```

とすると、

>
 destroy_admin_session DELETE /admins/sign_out(.:format)      admins/sessions#destroy

と書いてあるので、以下のようにしました。

```
<%= link_to 'ログアウト', destroy_admin_session_path, method: :delete %>
```

すると、、、、


<img width="784" alt="スクリーンショット 2019-07-21 14.52.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/12399385-ceb0-964b-2f1f-aaa68121357a.png">

と出ました。

【解決策】

application.jsに `require jquery_ujs`を追加すればいけました。(このアプリケーションでは、bootstrap4を導入しています。)

```:app/assets/javascript/application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
//= require jquery_ujs
```

bootstrap4導入していない方は、

```:app/assets/javascript/application.js
//= require jquery3
//= require jquery_ujs
```
でいけるはずです。

参考： https://stackoverflow.com/questions/6965876/ruby-on-rails-devise-users-sign-out-not-working

以上です！
[備忘]自作モジュールimport時のPath取得(Jupyter系も含め)

# 内容
通常の書き方も忘れそうなので

- 通常の書き方(備忘)
- jupyter特有の書き方(備忘)
- importにおいての`__init__.py`(初心者向け)

## 通常の書き方
Cだとコンパイルの時にincludeするヘッダファイルとか直接相対Pathとかで指定できた気がしますが、
Pythonでは以下のように書く必要があるようです。

```.py
import sys, pathlib
# currentの親ディレクトリのパスを取得
current_dir = pathlib.Path(__file__).resolve().parent
# モジュールのあるパスをsys.pathにappendして通す,今回目的のmodule群のディレクトリは一個上の階層にあるので/../
sys.path.append(str(current_dir) + '/../')
# 今回の目的のモジュール群とその関数を__init__.pyでsignalfuncディレクトリ内モジュール群とその関数全てimportしている
from signal_func import *
from exec_func import *
```

## jupyter系での書き方
通常の書き方だと`NameError: name '__file__' is not defined`と怒られるので以下のように書き換えます。

```.py
import sys, os
from pathlib import Path
# signalfuncなどのある親ディレクトリのパスを取得,これはJupyter系特有の書き方
current_dir = os.path.join(Path().resolve())
# モジュールのあるパスを追加
sys.path.append(str(current_dir) + '/../')
from signal_func import *
from exec_func import *
```

## importにおいての `__init__.py`
`__init__.py`には様々な役割がありますがモジュールのimportにおいては便利な役割を持っています。
例えば今回のsignal_funcディレクトリ内は以下のような大量のモジュールファイルを持っておりそれぞれ様々な関数を内包しています。

![スクリーンショット 2019-07-21 14.49.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318424/533c637d-c2ea-3b17-8766-80af981268e7.png)

importにおいて`__init__.py`はそのディレクトリがimportされた時に実行されるファイルになります。
つまり`from signal_func import *`を行った時点でsignal_funcディレクトリ内の`__init__.py`が実行され各分析モジュール(bband.pyとか)に内包された全ての関数(bband_buy_func(),bband_sell_func()とか)を*でimportしそのまま呼び出せる様にしているということになります。

実際にjupyter上でimportしたsignal_funcを実行すると…
![スクリーンショット 2019-07-21 15.14.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318424/fac6f890-177f-b244-8b86-1bcfb781182b.png)

pathlibで取得しsysに追加(通した)したpath先のsignal_funcディレクトリの`__init__.py`がモジュールとして呼ばれています。
Splunkの_timeの中はepochだけど、strftimeで変換したら文字列だよ

##　概要
表題そのまま

## 検証

```Splunk:SPL
| makeresults
| eval time=_time-1.000000000
| eval Time=strftime(time,"%Y-%m-%dT%H:%M:%S.%9Q")
| eval dur = _time - time
```

いつもの`makeresults`から、自動的に_\_time_が作られるので１秒前の時間を_time_として
_TIME_を見やすい形で作る。
_dur_で差分確認

# 結果
![QIITA1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/d7ee0be6-611e-bd8f-4b19-72d9b46a9c68.png)

_time_がepochになっているのがよくわかり、差分である_dur_も9桁・ナノセコンドを表せてる。

# 実験

```Splunk:SPL
| eval dur2 =_time - Time
```

![Qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/efc1b0dd-77db-a56d-9b95-8525d1817c62.png)
_dur2_がでない。

```Splunk:SPL
| makeresults
| eval time=_time-1.000000000
| fieldformat Time=strftime(time,"%Y-%m-%dT%H:%M:%S.%9Q")
| eval dur = _time - time
| eval dur2 = _time - Time
```
![Qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/e4b59e99-0713-79b9-fd2a-29768984666b.png)

`eval`じゃなきゃいけるかとおもったらダメだった。

## 結言
_\_time_の中はepochなので`eval`とかで他のフィールドに代入しちゃうと人間がよくわからない値になっちゃうけど、計算はそのままやってしまわないといけないってことですね。
`convert`とか`relative_time`とか。

:sweat: **R**みたく、_$date1_ - _$date2_　で差分が綺麗にでてくれないかしら
Leetcode #437: Path Sum iii

```swift
func pathSum(_ root: TreeNode?, _ sum: Int) -> Int {
    if root == nil {
        return 0
    }
    return helper(root, sum) + pathSum(root?.left, sum) + pathSum(root?.right, sum)
}

private func helper(_ node: TreeNode?, _ target: Int) -> Int {
    if node == nil {
        return 0
    }
    
    var result = 0
    if node!.val == target {
        result += 1
    }
    result += (helper(node?.left, target-node!.val) + helper(node?.right, target-node!.val))
    return result
}
```