OmniAICreator/Qiita-1.07M huggingface dataset:
51歳からのプログラミング　備忘　google.maps の infowindow要素の階層

infowindowの要素を操作したいのだけれど、jqueryで捕らえられない。

->非同期処理を参照したことが原因でした。

infowindowのコメントまで深い！13階建てですな。

```html
<div id='map_area'> // mapのロード場所
  <div>
    <div class='gm-style'>
      <div>
        ( <div class='gm-style-pbc'><p class='gm-style-pbt'> )
        <div>
          <div>
            <div>
              <div>
                <div class='gm-style-iw-a'>
                  <div class='gm-style-iw-t'>
                    <div class='gm-style-iw gm-style-iw-c'>
                      <div class='gm-style-iw-d'>
                        <div id='comment'>
```
Pythonでソートアルゴリズムの再発明をしてみる: コムソート

# 概要
* Pythonでソートアルゴリズムを再発明してみるだけ
* 今回はコムソートについて
* 参考サイトのサンプルコードをできるだけ見ずに実装する
* とりあえず昇順ソートのみの対応とする

# コムソートの概要
* バブルソートでは要素が1ずつしか移動しないので遅い…せや！離れた要素同士で入れ替えしたろ！ -> コムソート
* バブルソートを改良したシンプルなアルゴリズムだが、条件が良ければバブルソートとは比較にならないくらい速い
* 離れた要素同士で入れ替えを行うことで「だいたいソートされた状態」にし、その後バブルソートと同等の処理を行って「完全にソートされた状態」にするみたいな感じ
* 不安定ソート

## 基本的な手順
1. ソート対象のリストのサイズをもとにギャップ（比較する要素同士の距離）を決める（2回目以降は前回のギャップをもとにする）
2. 先頭要素とギャップ分離れた要素を比較し、大小関係が逆なら入れ替える
3. 比較する要素両方を1つ右にずらしながら手順2を繰り返す。ギャップ分離れた要素の位置がリストの末尾を超えたら繰り返しを止める
4. 手順1〜3を繰り返す。繰り返すたびにギャップは小さくなっていく
5. ギャップが1になったら、隣り合う要素同士で比較、入れ替えを行う。入れ替えが発生しなくなるまで繰り返す
6. 手順5で入れ替えが発生しなくなったらソート完了

# ソース
```python
import random

def comb_sort(lst):
    # ギャップの計算に使うための初期値
    gap = len(lst)

    # 入れ替えが発生したかどうかのフラグ。ギャップが1の場合に参照する
    swap_occurred = False

    # 手順全体を繰り返すためのループ
    # まずはギャップが1になるまで繰り返す（ギャップを縮めながらループする）
    # ギャップが1になっても、入れ替えが発生しなくなるまでは繰り返す必要があるため、
    # ギャップが1の場合はswap_occurred（入れ替えが発生したかどうか）も見ている
    # ギャップが1で、かつ入れ替えが一度も発生しなくなったらループを抜ける（= ソート完了）
    while gap > 1 or swap_occurred:
        swap_occurred = False
        # ギャップを求める。1.3で割るのが理想的とされているみたい
        gap = int(gap / 1.3)
        # 計算結果が0になったらギャップを1にする
        # これにより、ギャップが1になってからもループが継続する（swap_occurredがFalseになるまでは）
        if gap < 1:
            gap = 1
        
        # リストを走査するためのループ
        # 比較、入れ替え対象の要素がリストの範囲外になったらループを抜ける
        i = 0
        size = len(lst)
        while i+gap < size:
            if lst[i] > lst[i+gap]:
                # 大小関係が違うため入れ替え
                lst[i], lst[i+gap] = lst[i+gap], lst[i]
                # swap_occurredにTrueを設定するのはここだけなので、swap_occurredは
                # 「ギャップが特定の値の間、入れ替えが一度でも発生したかどうか」という意味の値になる
                # ギャップが2以上の場合は無視されるが、ギャップが1の時にループを継続するかどうかがここで決まる
                swap_occurred = True

            i += 1


lst = list(range(10))
random.shuffle(lst)

print("ソート前: " + str(lst))

comb_sort(lst)

print("ソート後: " + str(lst))
```

# 参考サイト
* https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A0%E3%82%BD%E3%83%BC%E3%83%88
* https://en.wikipedia.org/wiki/Comb_sort
Rails ActiveStorageのvariantでrails_blob_path - NoMethodError: undefined method `signed_id'

# 問題

例えば条件に応じてグレースケールに加工した画像のpathだけを取りたい場合、通常のように`rails_blob_path`を使うとエラーになる

```rb
# NoMethodError: undefined method `signed_id' が出る
Rails.application.routes.url_helpers.
  rails_blob_path image.variant(type: :grayscale).processed, only_path: true


```

# 解決方法
https://github.com/rails/rails/issues/32500

variantを使った場合、`rails_representation_path`を使う必要がある。

```rb
Rails.application.routes.url_helpers.
  rails_representation_path image.variant(type: :grayscale).processed, only_path: true
```
TypeScriptのtscコマンドがnot foundになる

# tl;dr
TypeScriptをグルーバルでnpmインストール(`npm install -g typescript`)した後、tscコマンドを実行しようしても、「command not found」となる場合の対処法です。

# 原因
グローバルのnpmフォルダにパスが通っていないだけです。

# 対処
まず、`npm list -g`でnpmのグローバルインストールのパスを確認します。
あとは、パス設定するだけです。

windows10の場合、**コントロールパネル > システムとセキュリティ > システム > システムの詳細設定** を開き、「環境変数」ボタンを押し、環境変数の**Path**に上記で確認したパスを追加します。
Twilio通話ログでClient宛の「TO」が表示されない場合

Twilioの通話ログを見ていたら、こんな怪現象がありました。

<img width="1278" alt="スクリーンショット 2019-06-08 14.09.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24333/af67885b-f7b5-20ce-62cd-719dca4d6fd5.png">

Client宛の通話で、ちゃんと成功してる(Completed)のに、
なぜかTOが「-」になってて、宛先のクライアント名が分からないのです。



原因は、クライアント名を`kebab-case`で付けていたからでした。
`snake_case`や`camelCase`のクライアント名は、ちゃんと表示されます。

公式ドキュメントにも書いてありますね。。
[クライアント名に指定できる文字列に制限はありますか？ – Twilio for KDDI Web Communications](https://cloudapi.zendesk.com/hc/ja/articles/360000022161-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%90%8D%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E5%88%B6%E9%99%90%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B-)

> Twilio Clientのクライアント名に指定する文字列には、以下の制限があります。
使用可能文字：半角の英数字とアンダースコア(_)
使用可能文字数：1,000文字以内

ハイフン使えないなら通話成立前にエラーにしてくれればいいのに、
「通話は成功するのにログにだけ表示されない」という罠でした。。。
【jQuery】.text()と.html()の違い

## サンプル
https://jsfiddle.net/3ho7wsjf/

<img width="884" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/3b6e886e-5786-af64-e31a-9e0d11b21e17.png">

## 説明
### $elm.text()
$elmの子孫要素のテキストノードのみ取得。
タグは取得しない。

### $elm.html()
$elmの子孫要素の全てHTMLを取得。
タグも取得する。

### $elm.text(str)
$elmにstrをテキストノードとして設定。
タグは反映されない。

### $elm.html(str)
$elmにstrをHTMLとして設定。
タグは反映される。

##参考
[jQueryのtext()とhtml()の違い](http://www.koikikukan.com/archives/2012/09/05-015555.php)
コンピュータの仕組みを勉強しながらC言語やろうぜ！　#1

# みんなC言語大好き？
大嫌い？　あっそ．

C言語はコンパイル型のプログラミング言語です．コンピュータは機械語しか処理できません．プログラミング言語を含む自然言語から機械語へ翻訳することを**コンパイル**と呼びます．コンパイルするソフトウェアのことを**コンパイラ**と呼びます．

# C言語の導入方法

開発環境やコンパイラはいろいろあります．それらの種類を簡単にまとめます．**あまりにも種類が多くて導入が面倒くさいので**，オンライン・コンパイラを使います．以下は完全に蛇足なので導入したい人はどうぞ．

## オンライン・コンパイラ

オンライン上でコンパイルできるシステムです．Googleで調べるとたくさん出てきます．

個人的におすすめできるのが，このコンパイラです．

https://www.onlinegdb.com/online_c_compiler

Paizaでもいいのですが，なぜか動かないことがあるので正直つらいです．以下完全に蛇足なので，本格的に導入したい人はそれぞれ調べてみてください．

## 統合開発環境

統合開発環境とは，楽に開発するためのソフトウェアです．コンパイルからデバッグ，テストまでありとあらゆることをサポートしてくれます．主な統合開発環境としては以下のものが挙げられます．

* Visual Studio
* Visual Studio Code
* XCode

Macを使っている場合はXCodeが主流ですが，WindowsではVisual Studioが主流です．Linux使っている人はvimを推してくることがあります．

## コンパイラ

* Visual C++
* Intel C++ Compiler
* gcc

Visual Studioを使うと自動的にVisual C++を使うことになります．Intelに課金するともっと速くて省メモリなプロセッサに最適化されたプログラムをコンパイルできるようになります．Linux使っている人はgccを使うことになります．

# 最初のプログラム

最初のプログラムと言えば「Hello, World」なのですが，そもそも画面に文字を表示するというのは様々な説明をすっ飛ばしています．あまりよくはありません．ここで長々と`printf`について説明するよりも早く筆を置きたいので，最も簡単な何もしないC言語のコードを示します．

```c
int main() {
    return 0;
}
```

このプログラムを実行すると，`Program finished with exit code 0`とコンソールに表示されます．「プログラムは終了コード0を伴って終了しました」という意味です．

このプログラムには`return`文しかありません．`return`文では関数が終了したことを呼び出し元に通知します．`main`関数の呼び出し元はOSです．なので，OSに`main`関数が終了したことを通知しています．

`return`文の文末にセミコロン`;`がありますが，これはプログラムの実行単位ごとにつけることになっています．最初はどこでつければいいのかわからないと思うので，基本的に1つの実行単位ごとにつける，ということを覚えてください．

## main関数

main関数とは，プログラムの開始地点を表す関数です．

```c
int main() {
```

この行ではmain関数が始まることを宣言しています．中括弧`{`，`}`はC言語を使うと頻繁に見ることとなります．だいたい，ここからここまで，という意味です．一つのくくりを表しています．

`int`というのは終了コードが整数型になることを示しています．`main`の隣に`()`がありますが，この括弧は関数の引数です．

$$ f(x) = y$$

みたいな数学的な関数がありますが，$x$のことを引数（ひきすう）と呼びます．この場合では`()`となっていて引数が存在しないので，「`main`関数は引数を取らず，終了コードを整数で返す」と解釈できます．

## 終了コード

`main`関数は整数型の終了コードを返すと翻訳しましたが，終了コードとは何でしょう？

終了コードというのは，プログラムがOSに対してどのように終了したのか通知するためのコードです．一般的に`0`が正常終了ですが，必ずしも`0`が正常終了とは限りません．プログラムをどう作るかによって何が正常で何が正常ではないか決めることができます．

せっかくなので，以下のプログラムを入力してください．

```c
int main() {
  return 5 + 15;
}
```

終了コードを電卓代わりに使っていますが，$5 + 15 = 20$ ですよね？　実際に実行すると，`Program finished with exit code 20`とコンソールに表示されます．

ところが，Paizaのオンライン・コンパイラでこのコードを実行するとエラーが発生します．Paizaでは終了コード`0`を返したプログラムは正常終了と解釈しているので，`0`以外の数値を`main`関数で返すとエラーが発生します．

## OSとプログラムの終了

OSはプログラムの終了を`main`関数で`return`された数値をもとに判断しています．逆に言えば，プログラムの終了をOSに通知するには，`main`関数で数値を`return`すればいい，ということがわかります．例題はほぼ何もしないプログラムということですね．

# おわりに

これで何もしないC言語のプログラムを書けるようになりました．`return`される数字を弄れば電卓の代わりになります．`return`文の数字を弄って好きな計算をさせてみましょう．足し算`+`，引き算`-`，掛け算`*`，割り算`/`などの演算子が使えます．

```c
int main() {
    return 5 * 5 + 10;
}
```
[Django]settingsにDEBUG=Trueを定義してても、テスト実行するとDEBUG=Falseになってしまう罠

Djangoやってると、settingsを本番環境用とか開発環境用とかローカル環境用とかそれぞれ分けて、そこに環境変数を定義する、というケースがあったりする。
んで、本番環境では `DEBUG=False` にして、他の環境では `DEBUG=True` にしていることが多いと思う。

大抵の場合、それで問題が起こることはないのだが、Djangoの仕様でテスト実行の際は`DEBUG=False` を記述しているsettingsファイルを利用して実行したとしても、`DEBUG=True` に切り替わってしまう。
これによって引き起こる問題とは

```python:
from django.conf import settings

hoge = 'hoge'
if settings.DEBUG:
    hoge = 'fuga'
```

みたいなコードを書いている場合に想定外のことが発生してしまう。
例えば、環境によって外部APIにリクエストを送る際に、本番用と開発用でトークンとかエンドポイントを分けているケースでこのような条件分岐をしていると、テスト実行で本番用のAPIにリクエストを送ってしまうという事故が発生する。(そういう場合だとそもそも mock とか使えって話だが)

解決方法としては以下の３つがパッと思いつく。

### 1. `setup()`でsettings.DEBUGをオーバーライドする
一番単純な方法

```python:hogehoge_test.py

class HogehogeTestCase(TestCase):
    def setUp(self):
        settings.DEBUG = True
```

こうしておくと、テスト実行を `DEBUG = True` で行うことができる

### 2.そもそも `if settings.DEBUG` みたいなことを書かない
これが一番良いと思う。
わざわざ、settingsを環境用に分けているのであれば

```settings_prd.py
HOGE = 'hoge'
```

```settings_dev.py
HOGE = 'fuga'
```

のようにsettings内で環境変数を定義して以下のように呼び出せばいい

```python:
from django.conf import settings

hoge = settings.HOGE
```

### 3. `--debug-mode` のオプションを付けてテスト実行する
[[Django]DjangoのテストをDEBUG=Trueで実行する](https://qiita.com/tnnsst35/items/cbe06d81bc8fb3c9c4ab)を参照
Django1.11以降はテスト実行の際に `--debug-mode` のオプションを付けることによって `DEBUG=True` で実行できるそうな
ただ、いちいちつけるの面倒であるし、オプションつけ忘れることによって事故るのが目に見えるので、個人的には使わないと思う
Qiita 投稿　備忘録

　本文では反映されないように説明では全角を使っていますが、実際に書く際は半角でお願いします。

##見出しの出し方
　＃の数1～6で見出しの大きさが変わる。

>#見出し
>##見出し
>###見出し
>####見出し
>#####見出し
>######見出し

##引用
　＞を頭につけることで縦に線が出る。10個以上付けられることが確認できた。
 >引用

##コード表示
 スペース4つからコード表示できる。コード上部に1行空きがないと普通の文字で出力される。

    int
    if
##コード一部抜き出し
　` (バッククォーテーション)(Shift + @)で挟む 

 `else`

##字体
 ＊（アスタリスク）、＿（アンダーバー）1つで挟むと　_italic(イタリック体)_表示となる。

    *for*
    _for_
 2つで挟むと__strong(強調)__表示される。

    **for**
    __for__

 ~（波線）2つで挟むと~~打消し線~~表示になる。

    ~~for~~


##字の色
　定型文で`Red`のところを色の名前に変えると色が変わり、`ここ`を変えると文字が変わる。

    <font color="Red">ここ</font>

####結果
 <font color="Red">ここ</font>

[色一覧](https://qiita.com/twipg/items/d8043cd4681a2780c160)


##リンクの貼り方
　直接打ち込むことでもリンクとなる。
　https://qiita.com/
　
　次に[名前](URL）とすることで好きな文字をリンクにできる。
　[Qiita](https://qiita.com/)


##コードを指定して書き出す
 ~を３つ続けて書く。
拡張子を書きその次の行からコードを書いていくとコードとして色分けがされる。


~~~
 ~~~(ファイル名).(拡張子) 
コード
 ~~~　下にも3つ
~~~


~~~swift:ContentView.swift
import SwiftUI
struct ContentView: View{
@State private var a = 0
}
~~~



------
順次書き足していきます。
【論文メモ】Attend and Rectify: a gated attention mechanism for fine-grained recovery

注意：この文書は荒いメモなので、細かい内容に関してはご自身で元論文に当たってください。

- 論文リンク
    - https://arxiv.org/abs/1807.07320
    - [ECCV2018](http://openaccess.thecvf.com/content_ECCV_2018/papers/Pau_Rodriguez_Lopez_Attend_and_Rectify_ECCV_2018_paper.pdf)

- 公式実装：主著者による実装
    - https://github.com/prlz77/attend-and-rectify
    
# 概要
CNNにAttentionの仕組みを導入して、Fine-grained recognitionを実現する手法。
CNNの各段階（入力層に近い段階から、出力層に近い段階まで）の各段階でAttention機構を導入し、入力層に近い段階ではテクスチャのような情報を、出力層に近い段階では大域的な情報を抽出して、分類に役立てる。
また、各段階で得られた情報のうちどれを重視するのかも、Attention機構によって重みつけして処理している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/19b4ea15-f51b-21d3-4b28-2c2317fdcbce.png)

以下の4点が、本手法の利点として挙げられている。

- 全ての段階に適用する処理は同一のものであるため、モジュール化し使いまわせる
- 任意のベースアーキテクチャに適用可能
- ベースアーキテクチャに追加で必要なメモリと計算コストが少ない
- 実装が簡単



# 手法
本手法では、以下の3つのサブモジュールが、ローカル（CNNの段階）でも、グローバルでも使われる。

- attention head $\mathcal{H}$: 特徴量マップから複数のAttentionマップを作成する
- output head $\mathcal{O}$: 特徴量マップとAttentionマップから、仮説（分類のスコア）を計算
- confidence gates $\mathcal{G}$: 複数のAttentionマップの信頼性を計算して重み付けし、最終的な仮説とする。

いずれのサブモジュールも1層のConv層とAvgPooling、内積計算などからなる単純な計算しか含んでおらず、パラメータ数も多くは無い。

## ローカルな仮説の算出
以下にCNNの各段階に対する処理のうちの、1つの段階を示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/b8ebc8c9-3a87-41c0-6ac3-94064dfaff9e.png)

入力されている$Z^l$は、CNNの$l$段階目の特徴量マップという意味である。

1. Attention head: 入力された特徴量マップを元に$K$枚のAttentionマップが作成される。
1. Output head: 特徴量マップと$K$個のAttentionマップを元に、それぞれのAttentionマップに対応する$K$個の仮説を算出する。この時、AvgPoolingが行われるので、マップの大きさに依存しない出力結果となる。
1. Attention gates: 特徴量マップと$K$個のAttentionマップを元に、$K$個のAttentionマップに対する信頼度（$K$次元）を計算する。Output headと同様、AvgPoolingによってマップの大きさに非依存の計算となる。
1. Output headで得られた $K$個の仮説に対して、Attention gatesで得られた$K$次元の信頼度をかけて足し合わせ、$l$段階目の仮説を得る。

なお、$K$をAttention Width（AW）と呼ぶ。

## グローバルな仮説の算出
以下にグローバルな分類スコアの算出を示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/dd77ddef-d79e-f832-1020-756191dea05d.png)

グローバルな仮説の算出も、ローカルな仮説の算出と同様のサブモジュールから成り立っている。

- 入力$Z^L$はCNNの最終層で得られる特徴量マップである。
- output headは存在しないが、代わりに、各段階の仮説とCNNの最後に得られる仮説${output}_{net}$が追加の入力として存在する。

以下に計算手順を示す。

1. Attention head: ローカルでは$K$枚のAttentionマップを作成するが、グローバルでは$N+1$枚のAttentionマップを作成する。
2. Global Attention gates: $N+1$個のAttentionマップから、それぞれに対応する$N+1$個の信頼度を作成する。
3. N個の各段階、およびCNNの最後に得られる仮説の合計$N+1$個の仮説に対して、Global Attention gatesで得られた信頼度による重み付き合計を算出し、最終的な仮説とする。

なお、$N$をAttention Depth（AD）と呼ぶ。

# 実験
実験では、ベースアーキテクチャとしてWide-ResNetを使用している。
以下にCIFAR-10、CIFAR-100での既存手法との比較を示す。表中の数値はError rateである。なお、訓練はイチから行なっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/17f223a1-84d7-5b6e-4fc3-3df3ff98aabe.png)

ベースラインとなっているWRN（Wide-ResNet）とほとんど実行速度に違いが無いが、精度はきっちり上がっている。
比較的浅くても（Depth=28）それなりの精度が出ている。

# 議論
図.6にAttention Maskの可視化が示されているが、AttentionMaskは色々なところで計算しているので、どの部分の可視化なのかが今ひとつわからない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/87eb70c2-ef20-62fc-fb1f-16e1edbf6b08.png)

# 感想
ちょっと前に読んだものをまとめてみた。
GooglePlayのリリースノートで64ビット要件に準拠していませんと警告が出た場合の対処法


## はじめに

Unity2017.4を使ってアンドロイドゲームアプリをリリースしようとしたところリリースノートに上記のような警告文が表示されており、
解決方法を見つけるのに苦労したので共有します。


## 全体の流れ
Unity2017.4.16以降でファイルを64bitで生成するにはビルド設定を変更するだけで大丈夫です。  


## 解決方法  
  
Unityを開いてFile > [Build Settings] > [Player Settings] パネル > [Settings for Android] > [Other settings] > [Configuration]に移動します。
<img width="175" alt="File.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432792/eaa68eea-931b-d251-eca5-5a3d79f7b68c.png">
<img width="470" alt="playersetting.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432792/430d11ba-82e1-9b01-f0fd-f18231bd4c17.png">
<img width="316" alt="snapping.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432792/9baf798c-32a8-575b-2280-f54fb95445ee.png">

[Scripting Backend] を [IL2CPP] (赤い線の部分)を設定し、[Target Architectures] の [ARM64] チェックボックスをオンにします(赤い線の部分)。その後にビルドをし直してください。
<img width="300" alt="Other setting.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432792/c609217e-4054-5738-9b94-2dc07aa0f173.png">

今リリースノートに置いているapkファイルを、上の手順を実行してできたファイルに置き換えると警告が消えてリリースができるようになります。


2019年8月1日から、Google Playで公開するアプリは64ビットアーキテクチャをサポートする必要があるそうです。
Unityはビルドの設定を変更しないと通常は64bitでは生成されません。Unity2017.4.16以降であればこのようにビルド設定を変更することで64bitライブラリが生成できるようになっているようです。


### 参考にした記事
https://developer.android.com/distribute/best-practices/develop/64-bit?hl=JA
tcserverのポート番号を変更する方法

<img width="1440" alt="スクリーンショット 2019-06-08 12.57.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104179/2821010a-55a1-cebe-bfcf-f99ebad630f3.png">

JavaEEのタブ（右上）をクリック
左下から3番目のサーバータブをクリック
tcserverをダブルクリックすると上記画面がひらけます。

ポート番号
http:8009
https:8443

上記の8009を開いているポート番号に変更してあげれば完了です。
論文集のタイトル一覧スプレッシートを作りたかったのでスクレイピング

##論文のタイトル一覧が欲しかった

IEEEとかの学会にでると、論文集がもらえます。
その論文集のタイトル一覧とがあればいいなーと思ったのでスクレイピングしました。

##実行環境
次に実行環境を示します。

| Soft and Hard       |       バージョン | 
|:-----------------:|:------------------:|
| Windowds 10 Pro         |              17763.316 build |  
| python         |              2. 7|

##code
ライブラリは、beautifulSoupを使用しました

```python

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup as bf
import csv

def getHtml(file_name):
  file = open(str(file_name))
  html = bf(file,'lxml')
  file.close

  return html

def getTitle(html, cvlist):

 for t in html.find_all("", class_="pTtl"):
  csvlist = []
  text=t.get_text()
  text = text.encode('utf-8')
  csvlist.append(text)
  writecsv.writerow(csvlist)

if __name__ == "__main__":

   html = getHtml('index.html')
   f = open("output.csv", "w")
   writecsv = csv.writer(f)
   f.close()
```

## まとめ
今後も使うと思うので、もっと使いやすいように改良していきたいと思います。
macOS Catalina beta をあるMacでインストールしてから，他のデバイス含め全てのリマインダーの同期が取れなくなった

##Apple IDに登録しているデバイス
- Mac Book Air
- Mac Book Pro
- iPhone XS
- iPad Pro

##問題再現手順
1. Mac Book AirにmacOS Catalina betaをインストール
2. Mac Book Airでリマインダーを開く  
   この時点で他のデバイスと同期を取りたい場合はそれら全てをベータ版の最新OSに変えるよう指示される．
3. それぞれのデバイスでリマインダーの内容を変更する

##問題対処ログ
[ここ](https://support.apple.com/ja-jp/HT203521)の指示に従って操作を進めたが改善せず，`Mac`>`カレンダーおよびリマインダーを更新する`>`1. カレンダー App を開きます。`のところまできて以下のようなエラーログが出る．

<img width="532" alt="スクリーンショット 2019-06-08 12.46.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314588/c6b4bc15-c7c4-4e0c-ca34-9a9b628b5999.png">

どうやって直せば良いのかわからない．
[AE]　シャイプレイヤーの破線について

#破線数をきっちりn個にしたい！！

線分をいつも適当にこんぐらいだろ！って感じでやってたけど、きっちりやりたいと思ったので、色々試した結果この式で行ける事が判明。

```jsx
Math.PI*(content("グループ 2").content("楕円形パス 1").size[0]/2)/(effect("スライダー制御")("スライダー"))
```
円周率*外周（半径）/n個
オフセットも真ん中にしたい場合は

```jsx
Math.PI*(content("グループ 2").content("楕円形パス 1").size[0]/2)/(effect("スライダー制御")("スライダー"))/2
```
なるほどな。

![Honeycam 2019-06-08 12-10-35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178061/5e400b2a-4300-f8d8-bc34-7da9b1a76664.gif)
goa v3のインストールからとりあえず実行出来るかの確認まで

# goa v3のインストールからとりあえず実行出来るかの確認まで
v3のインストール兼実行方法が載ってない気がしたので。
あくまでインストールと、公式のGetting Startedを実行してみる手順を纏めた物、後自分がハマった所。
## 必要なの

- go 1.11以降(モジュールを使用する為)  

    また、httpだけでなく、gRPCを使用する場合は下記も必要になる。
    今回は無しでいきます。

- [protocバイナリ](https://github.com/google/protobuf/releases)
    - protoc-gen-go

        ```
        go get -u github.com/golang/protobuf/protoc-gen-go
        ```

## インストール

**GO111MODULE=onはこの後も必要なのでbashrcにでも。**

```sh
$ export GO111MODULE=on
$ go get -u goa.design/goa/v3
$ go get -u goa.design/goa/v3/...
```

## チュートリアル
公式の[Getting Started](https://goa.design/learn/getting-started/)より。
今回はcalcというのを作ります。
**`go mod init`を忘れずに。**

```sh
$ mkdir -p calc/design
$ cd calc
$ go mod init calc
$ go get -u goa.design/goa/v3
$ go get -u goa.design/goa/v3/...
$ vim design/design.go
```

<details><summary>design.goにこのコードを書く</summary><div>

```go
package design

import (
	. "goa.design/goa/v3/dsl"
)

var _ = API("calc", func() {
	Title("Calculator Service")
	Description("Service for adding numbers, a Goa teaser")
    Server("calc", func() {
        Host("localhost", func() {
            URI("http://localhost:8000")
        })
    })
})

var _ = Service("calc", func() {
	Description("The calc service performs operations on numbers.")

	Method("add", func() {
		Payload(func() {
			Field(1, "a", Int, "Left operand")
			Field(2, "b", Int, "Right operand")
			Required("a", "b")
		})

		Result(Int)

		HTTP(func() {
			GET("/add/{a}/{b}")
		})

	})

	Files("/openapi.json", "../../gen/http/openapi.json")
})
```

</div></details>

上記コードをdesign.goに書いた後に、calcディレクトリにて下記コマンド**2つを実行する。**

```sh
$ goa gen calc/design
$ goa example calc/design
```

色々生成された後に、**一度下記のようにcalc.goの内容を書き変える。**

```go
func (s *calcsrvc) Add(ctx context.Context, p *calc.AddPayload) (res int, err error) {
  return p.A + p.B, nil
}
```

その後ビルドする。**calc.goの内容を書き変えるのを忘れずに。**

```sh
$ go build ./cmd/calc && go build ./cmd/calc-cli
```

無事ビルドが終わったら実行。

```sh
$ ./calc
```

同時にサーバー側だけでなくクライアント側(clc-cli)も作成してくれている。 
勿論`curl`等でもいいが、下記でサーバーへのリクエストが出せる。

```sh
$ ./calc-cli --url="http://localhost:8000" calc add --a 1 --b 2
3
```

### 注意点
自分が詰まった所とかとか。

- モジュールを使用しているので、必ずgoのバージョンが1.1以上である事。
   - Ubuntuのaptだと1.0か何かでダメだったのでsnapにした。
   - GO111MODULE=onを環境変数に入れるのを忘れない事。
- `go mod init`を必ずしている事
    - これ忘れて`go get ~`してもずっとエラーでインストール出来なかった。
- `goa gen`コマンド等を実行しているディレクトリが間違えていないか。
- calc.goを書き変えるのを忘れないようにねー。
    - 確か足した結果はそのままだと返ってこない筈。
- このサンプルでは、公式のコードを削ってhttpのみにしているが、gRPCが入っている場合は必要なのにあるgRPCに必要な物を入れる事。
AWS Sysops試験 合格しました！(2019年6月)

前回の記事から2週間で資格取得することに成功しました！

前回記事
https://qiita.com/KiyoGino/items/0270d0ab3289ec3c5ff0

今回は前回の反省を生かして合格するために何をしたかを書いていきたいと思います。

#前回の振り返り

一言言えることはSysopsの試験をナメていました。

ソリューションアーキテクト余裕だったからと、この感じで勉強していれば受かるとの噂を聞き、余裕で大丈夫と思い込んでいたのです。

それで受かれるのはおそらく、問題の改訂がある前に受かった人だけでしょう。

改定後にもしそれで受かったのなら運が良かったと思うべきだと思います。

＜前回やっていた学習＞
AWS WEB問題集で学習しようを三周
ホワイトペーパーを読む
ソリューションアーキテクト極める
（2週間）

結果として前回は合格できませんでした。


#今回の取り組み

まず前回の反省をしました。
それを生かして、やらなければならないことそれはSysops用の対策でした。

受験時の記憶を頼りに必要な情報や学習をPickupし、それに絞り2週間学習に取り組みました。

＜学習内容(読んだ資料)＞
・下記のサービスのBlackBeltを読み込んだ
s3
Trusted Advisor
Organizations
Powershell
IAM
IAM2
guard duty
cost explorer
cloudformation
cloudwatch
config
cloudtrail
service catalog
AWS support
AWS shield
devicefarm ※これは出ないのでおまけです。


<この中でも特に理解が必要なのが>
TrustedAdvisor
IAM ※特に重要
costexplorer
Cloudformation ※特に重要
cloudwatchの他サービスとの連携
config
cloudtrail
service catalog
WAF

だと思います。

この辺を深く理解していないと全く太刀打ちできない試験になっています。
逆に本番環境でしっかりと、運用側の経験が数年ある方は割と簡単に感じるのかもしれません。


＜学習内容(問題集)＞
別にディスっているわけではないですが、個人的にはAWS Web問題集では全く受かる気がしませんでした。
もし購入するなら他の問題集をお勧めします。

※営業妨害だと言われるのが心配なので一言付け加えますが、これは個人的な意見ですので皆さん鵜呑みにしないでください。

今回使用した問題集はすごく良かったのですが、なんか軽いノリで教えるのも癪なので内緒にしておきます。
上記だけはお勧めしておきます。




# 今回のまとめ
最終的に一言でまとめると、AWSの試験は科目別の対策をしっかりやることが大切だということを学びました。

非常に良い経験になりましたので、今回の記事はこれくらいにします。
ここからは負ける気は無いので9月までに5冠達成します。

達成しましたら、また記事にしますので誰かの参考になればと思っています。
ラズパイの消費電力計算してみた

#ラズパイの消費電力を計測してみた

※前回の記事のアカウントに紐づけたGoogleアカウントを誤って削除してしまったのでログインできなくなるという大問題に陥りました。

今回新しくアカウント作りましたがこのアカウントで書いていきます。よろしくお願いします

ラズパイを使う上で２４時間つけっぱなしやサーバー用途として使う人も多いはず。
となるときになるのが消費電力です。
なので今回は、ラズパイの消費電力についてまとめてみます。


###・用意したもの
・RaspberryPi 3 ModelB
・DCDCコンバータ　３A（降圧）
<img src="https://qiita-image-store.s3.amazonaws.com/0/375392/a88d13b6-f867-be93-75ef-52e74e8a22bd.jpeg" alt="写真" width="193" height="130">
↑こちらの都合で用意しました。
・ACアダプタ（12V2A）５Vの電源でもいいです。
・デジタル電圧電流計
<img src="https://qiita-image-store.s3.amazonaws.com/0/375392/5bbbe8f3-ae93-85b6-9231-a438962b63a3.jpeg" alt="写真" width="193" height="130">
・ピンヘッダ用ジャンパ線（あると便利）

###Let's make!
まずはACアダプタを改造します。
はじめに先っぽのコネクタとか端子は切り落として、導線だけにしてください。
あとは皮膜を向いて線をむき出しにすればOK

次にDCDCコンバータの調整？です。
これは大須で1000円で売ってました。
最大出力３Aなのでラズパイにも対応です。
同じようなやつが秋月電子とかで売ってると思います。
こういうやつね↓
http://akizukidenshi.com/catalog/g/gK-05437/

端子ターミナルの入力側に先程改造したACアダプタの線をさしてドライバで締めます。
＋ーを間違えると壊れますｗ
出力側にテスターを接続してから、ACアダプタを差します。
基板上のボリュームを回してだいたい５V〜5.1Vの間で調整してください。

今回購入したものは電圧メーター付きでとても使いやすかったです。


次に電圧電流計の接続です。
これも秋月とかで売ってますね。
電流計のアンペア数は10Aでいいです。100Aとかありますがそんなに要りません

このキットは色々種類があるので解説しづらいです。
要点としては
・メーター電源はDCDCから供給
・電流計の前に負荷（ラズパイ）をつなぐ←まれにこれだとだめなものもあるので注意

キットの取説とか見ながら接続してください。

一応ですが秋月のこの商品の場合の接続法を書いておきます
http://akizukidenshi.com/catalog/g/gM-09738/

この商品はGND内部接続なので気をつけないとショートします。

１.メーター電源はラズパイと同じ電源（５V）
※電源の細い黒線は使わないのでカット
２.メーターの前にラズパイを接続（説明のPDFどおりに）
といった感じです。

今回作ったものは最終的にこうなりました
<img src="https://qiita-image-store.s3.amazonaws.com/0/375392/6254a30b-fc1c-e7d5-a747-7b865cf68e19.jpeg" alt="写真" width="300" height="200">


一番左のコネクタがGPIOに刺さる汎用コネクタとなっています。
コネクタじゃなくてピンヘッダ用のジャンパ線でいいですが

接続するGPIOの場所は、ラズパイを手に持ち右側にUSB、LANポート
手前にHDMIの向きで左上のピンの１，２個目が５Vの入力、3個目がGNDです。
絶対に極性を間違えないように注意です。


##結果
アイドル時（デスクトップ）で0.3A
負荷マックスで１Aギリ超えない程度
ネットサーフィン時でマックス0.5〜0.6A
YouTube動画（1080p視聴）でマックス0.7〜0.8A

この数字に5をかければ消費電力です。
アイドルで1.5W
負荷かけても５Wならかなりエコですね。

このまま検証していて気づいたのですが、
負荷をかけると一気に消費電力が上がって意外と一瞬で下がります。

瞬間的に1A超えることもあります。
なのでスマホの充電器（1A）だと落ちるのですね...

##謎？？？

これだと2.5Aも要るのかと思った人も多いはず。
ネットで調べてみるとこんな情報があり、

システム用で1.2A
USBサポートで1.3Aが割り当てられているとのこと

なのでどんだけ負荷かけても1.2Aは超えません。
ただしUSB機器を使えばかなり増えます。

・やってみたことその1
スマホの充電

iPhone８で検証しましたが約0.5A上昇しました。この状態で負荷マックスにしたら1.5Aいきました。

またiPhoneは1アンペアで充電されるはずですが、恐らくパソコンと認識しているのでUSB2.0の理論値で充電されてるものだと思います。

その2
　USBメモリを差しまくる
割と電気食うUSBメモリを4つ差してみました。
結果は0.4A上昇。
書き込みとかやりまくったら0.6Aくらい行くときもありました。

なのでその点も踏まえて2.5Aということがわかります。

##まとめ
ラズパイはエコ。
サーバーにはもってこいのエコ性能


おまけ
2.5Aも要らない
最低1.5Aでイケる
（個人の見解です）
DockerコンテナにホストのAWSアクセスキーを渡す方法

## 課題

DockerコンテナからAWSのAPIにアクセスしたい場合、ホストがEC2ならIAMロールが使える。
しかしホストがローカルのMacの場合は、アクセスキーとシークレットアクセスキーを、どうにかしてコンテナに渡す必要がある。

## 結論

aws cliのconfigure getサブコマンドを使う。
具体的には下記のようにする。

```bash
#!/usr/bin/env sh
AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)

docker run --rm \
 -e AWS_REGION=ap-northeast-1 \
 -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
 -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
 (略)
```

このようにすればコンテナ内のAWC CLI指定の環境変数にアクセスキー等が格納されるので、そのままaws cliコマンドなどが使える。
プロファイルが複数ある場合は下記のようにして切り替えることもできる。

```bash
AWS_ACCESS_KEY_ID=$(aws --profile (プロファイル名) configure get aws_access_key_id)
AWS_SECRET_ACCESS_KEY=$(aws --profile (プロファイル名) configure get aws_secret_access_key)
```

参考
[get — AWS CLI 1\.16\.174 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/configure/get.html)

[AWS CLI の設定 \- AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#config-settings-and-precedence)
UseKeychainが設定されているMacのssh configをLinuxで使い回す

## 課題

Dockerコンテナ内でMacのSSH設定を引き継ごうと思い、ボリュームマウントで対応したものの、Macでしか使えないUseKeychainが邪魔をしてエラーとなってしまう。

## 結論

IgnoreUnknownオプションを使う。
具体的には下記のようにする。

```
IgnoreUnknown UseKeychain
  UseKeychain yes
```

参考
[Technical Note TN2449: OpenSSH updates in macOS 10\.12\.2](https://developer.apple.com/library/archive/technotes/tn2449/_index.html)
Viewにビジネスロジックは書かない

自分がエンジニアバイトをしているところでは週1回Rails勉強会をしています。今回はそのやったところのまとめを残しておきます。
前回([コントローラに書くコードを意識する](https://qiita.com/sumin/items/064df38548e63cb64f5c))からの続きです。
参考書：[現場で使える Ruby on Rails 5速習実践ガイド]
(https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)

## Viewの役割
Viewはプレゼンテーション層もしくはユーザー・インターフェース層とも呼ばれています。役割としてはユーザーとコンピュータをつなぐ役割をしています。具体的にはページの表示、ページ遷移、ユーザーが入力、操作したことをコンピュータに伝えるのが役割です。このユーザーがページを見るためのコード、入力のためのフォームのようにユーザーとコンピュータを繋ぐためにViewに書かれたコードをプレゼンテーションロジックといいます。

## Viewにビジネスロジックが混ざることの問題点
- Viewに同じビジネスロジックが重複してしまい、変更範囲が広くなり変更にコストがかかってしまう。
→ Modelに記述しておけば変更時は一箇所だけになるので管理が楽になる。

- Viewを介してテストを書く必要が出てくるので、同じビジネスロジックの場合全てテストするのは手間がかかる。
→ Modelに書けばテストは一つですむ。

- デザインが頻繁に変更される場合、ビジネスロジックにその変更による影響がでることがある。

なのでViewとModelの関係はModelからデータを受け取るだけにしておきたい。
CodeBuildでnginx:alpineをビルド時にエラーが発生した話

# はじめに
２０１９年６月５日頃から今までDockerのビルドがCodeBuild上で上手く動かなくなってしまった。

# AWS CodeBuildでDockerfileをビルド時にこんなエラーが出た

```
adduser: group 'www-data' in use 
The command '/bin/sh -c adduser -D -H -u 1000 -s /bin/bash www-data' returned a non-zero code: 1
```

# 原因
調べてみるとDockerHubのnginxが最近バージョンが上がってその影響かもしれない
[Dockerのnginxイメージ提供元](https://hub.docker.com/_/nginx/)

元々はLaradockのDockerfileを参考に作ったので[Laradock](https://github.com/laradock/laradock/pull/2162/commits/8417ed2710e3491f1e74b796e032844d38ea8216)の方も見てみると２日前に該当箇所が変更されていた
CodeforcesのWriter公募に応募する

~~元記事(ブログ) → https://codeforces.com/blog/entry/49569
全部は書ききれないので大事な部分だけ取り出して説明します。~~

[2021/03/12 追記] Writerの基準が2021/01/01に変更されたので、それに合わせてこの記事も大幅に改訂しました。
出典の記事(ブログ) → https://codeforces.com/blog/entry/85259
#Writer要件
~~Codeforcesのコンテストに規定回数参加する必要があります。必要な回数は色に応じて決まります(強いほど必要な回数が少なくなる)。~~

~~|色|必要な回数|
|:-:|:-:|
|青|25回|
|紫|15回|
|橙|5回|
|赤|規定なし|
|過去にwriterをしている|規定なし|~~

Writerの要件は「レーティングが橙以上」または「過去にwriterをしている」です。[2020/01/01以降]
#Writer報酬
コンテストを作るとコンテストの種類に応じた報酬がもらえます。

~~|種類|金額|
|:-:|:-:|
|Div.1 + Div. 2|250ドル + *50ドル|
|Div. 2|150ドル + *50ドル|
*期限内に仕事が問題無くできた場合、追加で貰うことができます。~~

[2020/01/01以降]

|種類|金額|
|:-:|:-:|
| Global |800ドル|
|Div.1 + Div. 2|400ドル|
|Div. 2|200ドル|
*writerのミスによってコンテストに何か問題が起きた場合、報酬が最大50ドル減るかもしれません。
#コンテストの提案をするには
Writer要件を満たしている場合、右のパーソナルメニューに「propose a contest/problems」というリンクが追加されます。
そこの注意書きを良く読み、コンテスト or 問題を応募しましょう。
###参考
(画像は2019/06/07時点のものです。)

Writer要件を満たしてない時のパーソナルメニュー(紫、コンテスト参加回数11回)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270275/372bc8f7-f929-50e9-115d-4451ad63c8be.png)

Writer要件を満たしてる時のパーソナルメニュー(橙、コンテスト参加回数12回)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270275/e1bc81ae-2582-e25a-007c-7e9e92d1346a.png)
２点から等距離にある点の軌跡（数学II）

最近，十分性の証明を省略してはいけないのではないかという風潮があるので、しっかり書いてみることにします。

## 問題
2点$\text{A}(-1,\,5)$，$\text{B}(7,\,-1)$から等距離にある点$\text{P}$の軌跡を求めます。

## 解答
$\text{P}(x,y)$とおくと，$\text{AP}=\text{BP}$より，$$\text{AP}^2=\text{BP}^2$$$$\therefore (x+1)^2+(y-5)^2=(x-7)^2+(y+1)^2$$$$\therefore 2x+1-10y+25=-14x+49+2y+1$$$$\therefore 16x-12y-24=0$$$$\therefore 4x-3y-6=0$$よって，点$\text{P}$は直線$4x-3y-6=0$上にあることがわかりました。しかし、直線全体を動くかどうかはわかりません。
そこで，点$\text{P}(a,b)$が直線$4x-3y-6=0$上の点であるとすると，$$4a+3b-6=0\cdots\text{①}$$が成り立ちます。このとき，
$$\begin{aligned}[t]
\text{AP}^2-\text{BP}^2
&=(a+1)^2+(b-5)^2-(a-7)^2-(b+1)^2\\\
&=2a+1-10b+25+14a-49-2b-1\\\
&=16a-12b-24\\\
&=4(4a-3b-6)\\\
&=0\quad(\therefore\text{①})
\end{aligned}$$$$\therefore \text{AP}^2=\text{BP}^2$$$$\therefore \text{AP}=\text{BP}$$
となるので、直線$4x-3y-6=0$上どこに点$\text{P}$をとっても$\text{AP}=\text{BP}$となります。
以上より、点$\text{P}$の軌跡は直線$4x-3y-6=0$全体を表します。除かれる点などはありません。
ASCIIコードを調べる

```
$ man ascii
（一部を抜粋）
       Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
       000   0     00    NUL '\0' (null character)   100   64    40    @
       001   1     01    SOH (start of heading)      101   65    41    A
       002   2     02    STX (start of text)         102   66    42    B
       003   3     03    ETX (end of text)           103   67    43    C
       004   4     04    EOT (end of transmission)   104   68    44    D
       005   5     05    ENQ (enquiry)               105   69    45    E
       006   6     06    ACK (acknowledge)           106   70    46    F
       007   7     07    BEL '\a' (bell)             107   71    47    G
       010   8     08    BS  '\b' (backspace)        110   72    48    H
       011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
       012   10    0A    LF  '\n' (new line)         112   74    4A    J
       013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
       014   12    0C    FF  '\f' (form feed)        114   76    4C    L
       015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
       016   14    0E    SO  (shift out)             116   78    4E    N
       017   15    0F    SI  (shift in)              117   79    4F    O
       020   16    10    DLE (data link escape)      120   80    50    P
       021   17    11    DC1 (device control 1)      121   81    51    Q
       022   18    12    DC2 (device control 2)      122   82    52    R
       023   19    13    DC3 (device control 3)      123   83    53    S
       024   20    14    DC4 (device control 4)      124   84    54    T
       025   21    15    NAK (negative ack.)         125   85    55    U
       026   22    16    SYN (synchronous idle)      126   86    56    V
       027   23    17    ETB (end of trans. blk)     127   87    57    W
       030   24    18    CAN (cancel)                130   88    58    X
       031   25    19    EM  (end of medium)         131   89    59    Y
       032   26    1A    SUB (substitute)            132   90    5A    Z
       033   27    1B    ESC (escape)                133   91    5B    [
       034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
       035   29    1D    GS  (group separator)       135   93    5D    ]
       036   30    1E    RS  (record separator)      136   94    5E    ^
       037   31    1F    US  (unit separator)        137   95    5F    _
       040   32    20    SPACE                       140   96    60    `
       041   33    21    !                           141   97    61    a
       042   34    22    "                           142   98    62    b
       043   35    23    #                           143   99    63    c
       044   36    24    $                           144   100   64    d
```

octで定義されている文字が出力される。

```python:python
>>> print('"\5"')
""
>>> print('"\41"')
"!"
>>> print('"\101"')
"A"
```
ROS2の共有ライブラリを使用したプログラムの作成 before Foxy Fitzroy

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084#%E7%92%B0%E5%A2%83)

[ROS2における共有ライブラリ](https://qiita.com/NeK/items/fb5dac0158497c1ff77f)で作成した共有ライブラリを使用する方法について．
他のROS2プログラムとの違いは，CMakeLists.txtでtarget_include_directoriesを使うことのみ．

# 準備

```bash:terminal
$ cd ~/ros2_studies_ws/
$ ros2 pkg create minimal_comp_user
```

# 共有ライブラリを使用したプログラム
作成物:[github.com](https://github.com/nek009/minimal_comp_user)

- src/minimal_comp_user_main.cpp

## プログラム

```c++:minimal_comp_user_main.cpp
#include <rclcpp/rclcpp.hpp>
#include "minimal_comp/minimal_comp_node2.hpp"

int main(int argc, char * argv[]){
  rclcpp::init(argc,argv);
  rclcpp::spin(std::make_shared<minimal_comp::MinimalCompNode2>());
  rclcpp::shutdown();
  return 0;
}
```

### 概要
共有ライブラリのMinimalCompNode2を呼び出している．
パッケージ名をnamespaceにしていたので呼び出しは6行目のようにminimal_comp::MinimalCompNode2となる．

# package.xmlとCMakeLists.txt
関係する部分のみ抜粋．

## package.xml

```xml:package.xml
<package format="2">
  <build_depend>rclcpp</build_depend>
  <exec_depend>rclcpp</exec_depend>
  <test_depend>rclcpp</test_depend>

  <build_depend>minimal_comp</build_depend>
  <exec_depend>minimal_comp</exec_depend>
  <test_depend>minimal_comp</test_depend>
```

### 説明
rclcppパッケージとともに共有ライブラリのパッケージ(minimal_comp)を記述．

## CMakeLists.txt

```CMakeLists.txt
find_package(rclcpp REQUIRED)
find_package(minimal_comp REQUIRED)

add_executable(minimal_comp_user
  src/minimal_comp_user_main.cpp
)
ament_target_dependencies(minimal_comp_user
  rclcpp
  minimal_comp
)

target_include_directories(minimal_comp_user
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

install(TARGETS
  minimal_comp_user
  DESTINATION lib/${PROJECT_NAME}
)
```

### 概要
他のROS2と基本的に同じで，パッケージを見つけるfind_packageやターゲットと必要となるソースファイルの指定，インストール先などを記述．
共有ライブラリを使用する上で必要となるものがtarget_include_directoriesとなる．

### 説明
共有ライブラリなど自分のパッケージディレクトリにない外部のヘッダファイルにアクセスするために12～16行目が必要となる．
12行目に今回作成するターゲット名を書く．13～16行目は他でも同じ書き方になるのでコピペ．

# ビルド・実行

## ビルド
```bash:terminal
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install --packages-select minimal_comp_user
$ . install/setup.bash
```

共有ライブラリがビルドしてあるものとする．まだしていなければ，--packages-selectに共有ライブラリのパッケージも一緒にしていしてやる．

## 実行

```bash:terminal
$ cd ~/ros2_studies_ws/
$ . install/setup.bash
$ ros2 run minimal_comp_user minimal_comp_user
```

# 共有ライブラリと作成プログラムが同一パッケージの場合
ここでは共有ライブラリとROS2プログラムが異なるパッケージの場合を作成した．
この時，共有ライブラリのパッケージ(minimal_comp)をfind_packageで指定し，ament_target_dependenciesでminimal_compを指定した．


共有ライブラリとROS2プログラムが同一パッケージの場合は，find_packageを書く必要がなく(自身のパッケージ名だから書けない)，~~ament_target_dependenciesではライブラリ名(add_libraryの名前)を指定すればよい．~~ 共有ライブラリ分だけtarget_link_librariesに書く(その他のrclcppなどはament_target_dependenciesに書く)．例えば以下の通り．

```CMakeList.txt
target_link_libraries(hoge
  fuge # 同一パッケージの共有ライブラリ名(add_libraryの名前)
)
ament_target_dependencies(hoge
  rclcpp
)
```


[公式githubの共有ライブラリにかかわるexmaple](https://github.com/ros2/examples/tree/master/rclcpp/minimal_composition)のCMakeLists.txtが参考になる．
Visual Studio 2019に正規表現の補助機能が増えてた話

# 概要

Visual Studio 2019が出て、[IntelliCode](https://docs.microsoft.com/ja-jp/visualstudio/intellicode/overview)とか[Live Share](https://visualstudio.microsoft.com/ja/services/live-share/?rr=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fvisualstudio%2Fide%2Fwhats-new-visual-studio-2019%3Fview%3Dvs-2019)とかの華のある機能にワクワクしてましたが、ふとお仕事のコードを見てたらノーマークなところに面白い機能が増えていたのでご紹介。

発表あったっけ、と探してみたら[.Netブログに載ってました。](https://devblogs.microsoft.com/dotnet/visual-studio-2019-net-productivity/)C#とVisual Basicが対象のようです。

# 機能の内容

- シンタックスハイライト
- 入力補完
- 文法チェック

## シンタックスハイライト

Regexクラスのコンストラクタの引数で指定した文字列がハイライトされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/ee045f2a-5a10-3088-19f5-b2d847bd6d25.png)

Regexクラスのstaticメソッドで、引数が`string pattern`の箇所もハイライト対象のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/d2e7d845-28e0-4cc1-fa54-560b1d12ebc7.png)

直前のコメントで`language=regex`を指定した文字列も対象です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/7cb3948c-398c-506e-7d8a-3750be799c65.png)

`\number`、`\k<name>`形式の名前付き前方参照を指定した場合、参照している正規表現の位置が強調表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/7331f9db-bc7a-adbd-3db8-8d8e49778bbe.png)

## 入力補完

シンタックスハイライトの対象箇所で入力を始めるか、ctrl + spaceショートカットで使用可能な正規表現が一覧で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/6c85a3f7-4ae0-bb1f-cc82-9604590679fb.png)

`(`や`[`、`\`を入力すると後に続く正規表現が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/009c4f6f-2755-aaaa-e416-a515424eae68.png)

選択するとテンプレートが入力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/b123f196-3e76-7cbb-f0ab-f352f0905775.png)

## 文法チェック

正規表現の構文エラーがあった場合、エラー箇所とエラーの内容が「RE0001 正規表現の問題」として表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/30332d26-cd60-bc3e-a8a4-7439ed9f53d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213432/96a99933-c715-f325-0eff-8e26b9c91ac5.png)
C言語初心者がポインタについて勉強してみた

C言語のポインタの覚書

入力した２つの整数を交換する関数。ポインタを使用。
※参考書：新・明解C言語　入門編　サンプルコードより引用

```Swap.Test.c
#include <stdio.h>

int swap(int* px,int* py)           //int 型のpx,pyのポインタの箱を用意する
{
	int tmp = *px;	                //tmpにpxのポインタを格納
	*px = *py;	                    //pxのポインタにpyのポインタの値を格納
	*py = tmp;		               	//pyのポインタにtmpの値を格納（pxとpyを交換した)
}
int main(void)
{
	int na, nb;				//int型の箱na,nb

	puts("２つの整数を入力してください。");	
	printf("整数A:"); scanf("%d", &na);		//入力した値をアドレスnaに送る	
	printf("整数B:"); scanf("%d", &nb);		//入力した値をアドレスnbに送る

	swap(&na,&nb);					  	     //整数Aのアドレスと整数Bのアドレスを交換

	puts("２つの整数を交換しました。");			
	printf("整数A：%d\n", na);			//na,nbのアドレスにある値を出力
	printf("整数B: %d\n", nb);
}
```

※ポインタとはアドレスを格納するための変数である。
● &na、&nbは値(na,nb)のアドレス
● \*pxはポインタの変数(ここではnaのアドレスが入っている)、
　\*pyはポインタ変数（ここではnbのアドレスが入っている）

int* pxはポインタ(\*px)を入れるための引数
int* pyはポインタ(*py)を入れるための引数

1.&na,&nb（アドレス）に入力した値を送る
2.swap(int* px, int* py)で&na、&nb(アドレス）を受け取り*px,*py（ポインタ）に送る
3.*px,*py（ポインタ）は&na,&nb（アドレス）の引数なのでそのまま代入される
4.na,nbを出力すると&na、&nb（naのアドレス、nbのアドレス）に格納されている値が交換されている

つまり、*pxはnaのアドレスが格納されていて、*pyはnbのアドレスが格納されているというイメージになります
ログが見れないマネージドサーバでphpのエラーを可視化する

マネージドサーバは便利だが、ログが見えないサービスもある。
エラーがあるときはしんどい。
そんな場合は、phpのソースに次の２行を加える。
ブラウザに警告やエラーが表示される。

```
ini_set( 'display_errors', 1 );
ini_set( 'error_reporting', E_ALL );
```

こんな風に使う。

```
<?php
ini_set( 'display_errors', 1 );
ini_set( 'error_reporting', E_ALL );
```

警告やエラーが可視化された。
![スクリーンショット 2019-06-08 11.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/b9626382-7138-b7af-f731-c0aef8330108.png)

これでどこを調査すれば良いか範囲を絞れる。
.bashrcを更新した時に、sourceコマンドやターミナル再起動だけでは永久に反映されない話

# 環境

- macOS Mojave 10.14.5

# 概要

.bashrcを更新した時に、**ターミナルを再起動しただけではシェルの設定は反映されない。**
必ず以下のコマンドを叩いて、シェルの設定を反映させる必要がある。

```
$ source ~/.bashrc
```

sourceコマンドについては以下に詳細な説明が書いてあります。
[【 source 】コマンド／【 . 】コマンド――シェルの設定を即座に反映させる - IT](https://www.atmarkit.co.jp/ait/articles/1712/21/news015.html)

# 追記

上記だけだとターミナルを再起動した時にまたsourceコマンドを叩かないといけないため、「.bash_profile」にも同様のコマンドを記載しておく必要があります。

```~/.bash_profile
source ~/.bashrc
```

これで、再起動しても「.bashrc」に記載した内容が反映されるようになります。
（~~途中でミスってlsコマンドすら使えなくなって地味にハマりました。。~~）

「.bashrc」と「.bash_profile」に関しては以下の記事が参考になります。
[本当に正しい .bashrc と .bash_profile の使ひ分け - Qiita](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)
Anacondaでの仮想環境の作り方・使い方　Ver. 2019.10

# はじめに

## 記事の趣旨
googleで「Anaconda 仮想環境」で検索したときにヒットする情報が古いものばかりなので、現在公式サイトで配布されている **Anaconda 2019.10** における仮想環境の作り方をまとめておきます。

## 想定読者
* Python環境としてAnaconda(Anaconda 2019.03~2019.10)を利用している(OS不問)
* Anacondaにおける「仮想環境」とは何かを知っている

## 注意点
しつこいようですが、この記事は**Anaconda 2019.10時点における**仮想環境の作り方についてのものです。
将来の更新でこの手順が使えなくなる可能性は大いにあるので、未来から来た方はご注意を。

# 事前準備

## condaモジュールの最新化
* 処理にあたってcondaモジュールを最新版にアップデートする。
  * Windows + Git bashでAnaconda **2019.03**を使おうとする 場合、本手順必須。配布されているバージョンのcondaモジュール(4.6.11)で、バグが発生することが報告されています([参考:github内Issueページ](https://github.com/conda/conda/issues/8506))。

```bash
$ conda update conda
```

## 初期設定
* 各種シェルの起動時に、Anacondaの設定が走るようにする。
* 以下のコマンドを、今後condaコマンドを実行する予定のあるシェル上で実行する。
* 
```bash
$ conda init <シェル名>
```

    * `<シェル名>`には、コマンドを実行しているシェルの名前のうち、最も適しているものを以下から入力する。
        - bash (含git bash)
        - cmd.exe (コマンドプロンプト)
        - fish
        - tcsh
        - xonsh
        - zsh
        - powershell
* シェルを再起動し、画面上に`(base)`と表示されたら成功

# 仮想環境の使い方

## 新規作成

```bash
# 実行のための最低限のモジュールだけ入っていればいい場合
$ conda create -n <仮想環境名> python=<pythonバージョン>
# インストール時にbase環境に入っていたもろもろのパッケージ含めた環境を作りたい場合
$ conda create -n <仮想環境名> python=<pythonバージョン> anaconda
```

## 仮想環境一覧の取得
```bash
$ conda info -e
# conda environments:
#
base                  *  D:\conda
py27                     D:\conda\envs\py27
py36                     D:\conda\envs\py36
```
## 仮想環境の有効化
```bash
$ conda activate <仮想環境名>
```
* 画面上の表記が`(<指定した仮想環境名>)`に変われば成功
* 過去バージョンではここが「OSによってコマンドが変わる」とか「同名コマンドがあるからシェル芸で対処しなくちゃいけない」とか言われていたが、全OS共通でこの独自コマンドを使うようになった模様

## 仮想環境の無効化
```bash
$ conda deactivate
```
* 画面上の表記が`(base)`に変われば成功

## 仮想環境の削除
```
$ conda remove -n <仮想環境名> --all
```

# 更新履歴

* 2019/12/31
  * Anaconda Ver 2019.10でも同様の手順が使えたため、タイトル等を更新
[EC-CUBE4]画面「ご注文内容のご確認」で支払い手数料の表記の最適化

# 環境

- EC-CUBE4.0.2
- PHP 7.1

# 課題
標準の表記だと表示される金額の意味がわからない。
"決済手数料"と明記するか、そもそも0円なら表示しないようにしたい。
![](https://i.gyazo.com/0de7490979bb59946a36f7c51ff5cf4d.png)

# 対処方法
管理サイトのページ管理から対応するテンプレートの記述を変更します。

## 編集対象のテンプレート
![](https://i.gyazo.com/f98d714c903495bd1394acf56a227580.png)

## 変更箇所と内容
144行目の`({{ charge|price }})`と記載されている場所を変更します。
![](https://i.gyazo.com/36ac56bff3cb44ff0acdc5f22ed874f4.png)

### "決済手数料"と明記する

```
(決済手数料:{{ charge|price }})
```

**表示例**
![](https://i.gyazo.com/484f23bf5ba7df633ae90555d6839c37.png)

### 決済手数料0円の場合は表示しない

```
{% if charge > 0 %}(決済手数料:{{ charge|price }}){% endif %}
```

**表示例**
![](https://i.gyazo.com/26925856292627c653364697fd2dabc5.png)

# 参考
EC-CUBE4のテンプレートエンジンはTwigです。上記の構文は以下で確認できます。
[Documentation - Twig - The flexible, fast, and secure PHP template engine](https://twig.symfony.com/doc/2.x/)
pythonでChrome内のsqliteから閲覧履歴を抽出する！

Chromeの閲覧履歴って、Historyというsqliteファイルにまとまっているようです。

私のWindows10/64のChromeは、'C:\Users\(ユーザ名)\AppData\Local\Google\Chrome\User Data\Default\History'というフォルダにHistoryが格納されていました。

次のコードで閲覧履歴を抽出してファイルに保存できます。History(sqlite)内のurlsとvisitsという2つのテーブルにクエリをかけるプログラムです。コード内の「(ユーザ名)」の部分は、適宜変更してください。

注意点ですが、<font color = red>Chrome起動中はHistory(sqlite)ファイルがロックされている</font>ため、次のプログラムはchromeが起動していないときに動かしてみてください。

```
##### IMPORT
import sqlite3
from contextlib import closing
from datetime import datetime

##### CONST
db = r'C:\Users\(ユーザ名)\AppData\Local\Google\Chrome\User Data\Default\History'
filePath = './result.txt'

##### IMPLEMENTATION
with closing(sqlite3.connect(db)) as conn:
    c = conn.cursor()
    select_sql = "select visits.id, urls.url, urls.title, visits.visit_time,visits.from_visit from visits inner join urls on visits.url = urls.id"
    with open(filePath, mode='a', encoding='utf-8') as f:
        for row in c.execute(select_sql):
            timestamp = datetime.fromtimestamp(row[3]/1000000-11644473600)
            strLine =str(row[0])+','+row[1] + ', ' + row[2] + ', ' + str(timestamp) + ', ' + str(row[4])+'\n'
            print(strLine)
            f.write(strLine)
        f.close()



```
(PRIVATE)(教育用) pythonによるデータ解析のための基礎

(private 用)
### 最低限の基礎知識 & 解析に使用する知識

チェックボックスがないのは見出し、あるのは演習

チェックボックスがあるものに対して

```
わかりそう → 答えてみる＆やってみる

わからない → 「わからないんでググります」といい調べて答えをだしてみる

（5分くらい)調べてもわからない → 「調べてわからないっす」という
```

# 1. 環境構築
- [x]  anaconda インストール
- [x]  jupyter notebook の起動
    - [x]  python 3 ファイルの新規作成

# 2. 基本スクリプトの実行
- 代入、演算、標準出力
    - [x]  変数に値を代入して基本的な演算ができる
    - 変数に主に代入されるのは数値、文字列、boolean
        - [x]  boolearn とは何か
    - [x]  変数の中身を標準出力で確認する

# 3. numpy の利用
- [x]  numpy とは
- [x]  numpy を import する
- Array 操作
    - [x]  Array とは何か
    - 配列
        - [x]   `['a','b','c']` という配列を変数 `arr1` に代入
    - 行列
        - [x]  以下のような行列を変数 `arr2` に代入
            
            $$
            \begin{bmatrix}
            1 & 2 & 3 \\\ 
            4 & 5 & 6 \\\
            7 & 8 & 9
            \end{bmatrix}
            $$

       - Array 演算
           - [x]  `arr2` と `2` との和、差、積、商、を`arr3` ~ `arr6` に代入（行列とスカラーの演算とは）
           - [x]  `arr2` と `arr3` の積を `arr4` に代入し、結果を確認する（Array 同士の積とは)
        - ランダムな配列、行列
            - [x]  numpy の `random.rand(n)` を利用して生成
            - [x]  生成したランダム配列の値の合計、平均、標準偏差、分散、最大値、最小値を numpy の関数を用いて求める 
            - [x]  同様にランダムな行列を生成
            - [x]  生成した行列の行ごとに上記の値を算出

# 4. pandas の利用
- [x]  pandas とは何か
- [x]  pandas から Series と DataFrame を import する
- Series と DataFrame
    - Series
        - [x]  Series とは何か
        - [x]  `arr1` に `['A','B,','C']` というインデックスをつけたものを `ser1` に代入する
        - [x]  `ser1` において、`Index = 'B'` の値を出力する
    - DataFrame
        - [x]  DataFrame とは何か
        - DataFrame の作成、編集
            - [x]  `arr1` に `['A','B,','C']` というインデックスをつけたものを `df1` に代入する
            - [x]  `df1` に `['a','b','c']` というカラムをつけたものを `df2` に代入する
            - [x]  `df2` の 2~3 行目だけ取り出したものを `df3` に代入する
            - [x]  `df3` の新しい行に `arr1` を追加する
            - DataFrame の結合
                - [ ]  `df2` の右に `df3` を結合
        - データの入出力
            - [x]  `df3` を `sample_1.csv` というファイル名で作業ディレクトリ内に保存する
            - [x]  `df4` に `sample_1.csv` の中身を読み込んだものを代入する
- [x] pandas 自体を import するだけでも Series, DataFreme は利用できるが、どう違うのか（この場合どのように DataFrame を呼び出すのか)
    - 以下の二行の違い

```python:ex.ipynb
import pandas
from pandas import DataFrame, Series
```

# 5. 波形の図示
> (応用)は必須じゃないけど今後研究で使えるのがあるかもしれないので暇な時に

- matplotlib
    - [x] matplotlib とは(何ができるライブラリ？)
    - [x] matplotlib のインポート
    - [x] sin波をプロットしてみよう（丸投げ）
        - 図示したsin波に対して色々注文を投げます
    - 測定データの csv ファイルを読み込んでプロットしてみよう(TBD)
    - （応用）複数のグラフを同時に出そう
        - [x] ひとつの窓に複数のグラフをプロット
        - [x] それぞれに窓を用意してプロット
    - （応用）いろんなグラフをプロットしよう(TBD)

# 6. 照合
(TBD)

# 7. 機械学習の利用
(TBD)
Some Scripts

Get Selected Finder Items
Run Shell Script

```bash
if [[ -d "$1" ]]; then
    open -a Terminal "$1"
elif [[ -f "$1" ]]; then
    open -a Terminal "`dirname "$1"`"
fi



export HISTCONTROL=erasedups
export HISTSIZE=10000
shopt -s histappend

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
PS1='\[\e[1;34m\]\D{%b%d %T} `pwd`>\[\e[0m\] '

alias g='grep -r --color=yes -n'

gp()
{
    git add . && git commit -a -m "$1"  && git push
}
gc()
{
    git add . && git commit -a -m "$1"
}
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
Tesseract OCR の使い方 (c++)

次と同じことを c++ で行いました。
[Tesseract OCR の使い方](https://qiita.com/ekzemplaro/items/f7dc38bb2a35be9f9f10)

次のページの Basic example を改造しました。
[API examples](https://github.com/tesseract-ocr/tesseract/wiki/APIExample)

プログラム

```c++:example01.cpp
// ----------------------------------------------------------------
/*
        example01.cpp

                                                Jun/08/2019
*/
// ----------------------------------------------------------------
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

int main()
{
    char *outText;

    tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
    if (api->Init(NULL, "jpn")) {
        fprintf(stderr, "Could not initialize tesseract.\n");
        exit(1);
    }

    Pix *image = pixRead("hensel_gretel.png");
    api->SetImage(image);
    // Get OCR result
    outText = api->GetUTF8Text();
    printf("OCR output:\n%s", outText);

    // Destroy used object and release memory
    api->End();
    delete [] outText;
    pixDestroy(&image);

    return 0;
}

// ----------------------------------------------------------------
```

```text:Makefile
example01: example01.cpp
        clang++ -o example01  example01.cpp -ltesseract -llept
clean:
        rm -f example01
```

コンパイルして実行

```text
$ ./example01 
Warning: Invalid resolution 0 dpi. Using 70 instead.
OCR output:
大 き な 思 の す ぐ 近 く に 、 本 と り か お か み さ ん と 侑
た ち と 一 細 に ほ ん で い ま し た 。 畑 の チ は ヘ ン ゼ ル で な
の 子 は ダ レ ー テ ル と い う 名 前 で し た 、 本 こ り に は ほ 
```
正規化と標準化の違いについて

# 元データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/9bb00daa-f8a0-0846-83b5-14f520319935.png)
## OHLC
![debug_calc_obs_ohlc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/61aa6d9f-32c9-6397-8a6f-4573b4edc0e9.png)
## Volume
![debug_calc_obs_volume.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/8979922a-e4e5-9095-f931-1dc6af32b948.png)
## MACD
![debug_calc_obs_macd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/ffb76605-a577-41a2-a059-9159664ff7a3.png)
## 目的変数
{翌日の終値} - {本日の終値} = -2070.0
# 正規化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/f6014b73-3833-e155-035d-fa792e0a6c5a.png)
## OHLC
![debug_calc_obs_ohlc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/aebdd51f-2010-c084-28f4-9d0dd9df5140.png)
## Volume
![debug_calc_obs_volume.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/cddd723a-ded0-7e62-9658-a045cea8033b.png)
## MACD
![debug_calc_obs_macd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/8bfa0e1c-faf7-8d07-ada3-269ffcc384d4.png)
## 目的変数
-0.13930013458950202
# 標準化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/f547581e-6e09-94c3-629f-005e9221075d.png)
## OHLC
![debug_calc_obs_ohlc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/fd5a412b-d58a-964a-82bd-5b28f3d9468b.png)
## Volume
![debug_calc_obs_volume.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/13e5a904-c45b-67cd-6dfc-8afebcb1b482.png)
## MACD
![debug_calc_obs_macd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/3cd0f65a-ecd5-1e2a-172c-6a23bc31c4cd.png)
## 目的変数
-0.632751004495941