OmniAICreator/Qiita-1.07M huggingface dataset:
Desktop : OpenCV Draw Circle

<h5>Goal</h5>
OpenCV Draw Circle.

```OpenCV_Draw_Circle.java
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import org.opencv.core.Point;


public class OpenCV_Draw_Circle {

    static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;

    /**
        *  Launch tha application.
        */
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try{
                    OpenCV_Draw_Circle window = new OpenCV_Draw_Circle();
                    window.frmjavaSwing.setVisible(true);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

    /**
        * Create the application.
        */
    public OpenCV_Draw_Circle(){
        init();
    }

    /**
        * Init the contents of the frame.
        */
    private void init(){
        Mat source =  paint();
        BufferedImage image=matToBufferedImage(source);

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv µe¶ê½m²ß");
        frmjavaSwing.setBounds(100, 100, 300, 300);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(5, 5, image.getHeight()+10, image.getWidth()+10);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);
    }

    public Mat paint(){

        Mat source = new Mat(250,250, CvType.CV_8UC3, new Scalar(255,255,255));
        Point pt1=new Point(125,125);
        Imgproc.circle(source,pt1,58,new Scalar(255,55,220),6);
        return source;
    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}
```
<h5>Result</h5>
![opencv_draw_circle.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/d051d241-b1b9-94d6-1464-1ecccecfabb3.jpeg)
Apple Store にスクリーンショットでリジェクトされた話

またリジェクトやー！(・´з`・)
分かれば簡単なのですが、先が見えないトラブルはつらいです。

# アップルから送られてきたメッセージ

>**Guideline 2.3.3 - Performance - Accurate Metadata**
>We noticed that your screenshots do not sufficiently reflect your app in use.
>Specifically, your 12.9-inch iPad Pro (3rd Generation) screenshots do not display the app in the correct device frame.

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/9132dadc-89bd-d20d-ea41-04d58edc53a8.png' width=70%>
アプリ情報のスクリーンショットが悪いみたいです。

# 原因

iPad のスクリーンショットに iPhone を貼り付けていたのが原因でした。前回審査を通っていたので油断しました。iPhone Xs Max という謎の機種や、私のアプリは16:9なので黒身が入ること、iPadの第2世代と第3世代のサイズが同じことなどでハマりました（要はいいわけです）

# スクリーンショット

ベゼルあり、ベゼルなしがポイント。

|![2019-0525-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/9e659f19-68be-308b-6ad0-637c6a92fc93.png)|![2019-0525-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/5770cdfd-f69c-c8b5-0447-d214043e3db3.png)|![2019-0525-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/63ac022b-9689-e88b-e7a8-60de7eb308be.png)|![2019-0525-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/263337aa-84a4-0d9b-0c9f-856eb702ea4f.png)|
|:---|:---|:---|:---|
|Xs Max|6s Plus|iPad Pro 第3世代|iPad Pro 第2世代|
|6.5-inch|5.5-inch|12.9-inch|12.9-inch|
|2688x1242|2208x1242|2732x2048|2732x2048|

# まとめ

変に使いまわすのではなく、４機種作る方がいいかもしれません。再審査は時間がかかりますよね。リジェクトが2回来ると、もう私のそうめんの心が折れてしまいます。大した情報ではないですが、何か役に立てるかと思い投稿しました。
私なりにDB(RDB, NoSQL)を解釈してみた

# はじめに
機械学習でデータの取り扱いでSQLを学び初めていろいろと用語やらDBの種類が現れたため少しまとめて見ました。
まだRDBとMongoDBしかさわれていないためその他のDBはあまり書けていない状況です。

# DB
膨大なデータを管理する。
では、データの管理とはなにを指すかというとデータの整合性と永続性を担保するという認識です(現状は)。

DBは下記の概念を元にデータを管理しているようです。

- ACID
    - 原子性
        - 必ずデータを操作した際に操作が完了した状態もしくは操作が行われていない状態のどちらかのみを保証する
    - 一貫性
        - データの処理が整合性(データのルール)を保つころとを保証する
    - 独立性
        - 実行中の処理がその他の処理から見れないことを示す
    - 永続性
        - データが失われない事を示す

# CAP定理
webサービスを想定して作られた分散化データベースの定理

- 整合性
    - クライアントは常に同一のデータを見る
- 可用性
    - クライアントは読み出し書き出しができる
- 分断耐性
    - 物理ネットワークが分断されても(DBサーバー複数台で構築)間違った結果が発生しない

上記性質はすべて完璧に満たすことは出来ず各DBでどれか重視して作られている

# RDB vs NoSQL
- RDB
    - 集合と関連のデータのみ扱う
    - SQL準拠のクエリを使い操作する
    - 検索性が高い
    - 水平スケーリング（カラムの数を操作すること)が苦手

- NoSQL
    - Not + Only + SQL」が名前の由来。
    - ドキュメント型、グラフ型、キー値型、列指向型等のデータモデルが存在する。
    - 導入のモチベーションはRDBで解決できないことを解決するため。(RDBの問題の章に詳細を記載)
    - データモデルによって性質が変わる(データモデルの章で概要を記載)
  

# データモデル
| データモデル | DB名 | データモデル概要 | 
|---|---|---|
| RDB | MySQL, PostgreSQL... | 集合(行列データ)と関連(リレーショナル)でデータを扱う |
| ドキュメント型 | MongoDB | 階層構造を待たない。データをドキュメントという単位で保持して各ドキュメントにIDが振られる。スキーマレス(データベースの構造を定義しなくてよいということ)
| グラフ型 | Neo4j | グラフ理論に基づいて設計されている
| キー値型 | Hibari |キーと値の1:1でデータを表現する|
| 列指向型 | Bigtable, HBase | レコードとカラムの概念があるがRDBと違い事前にカラムを定義しなくてもよい キーと値は1:多の関係を取る

# RDBの問題
- 大量のデータ処理(T,PByte級のデータ)
- DBの水平スケールアウトが苦手
- データモデルが固定されている

# MongoDB
- ドキュメント型NoSQLデータベース
- スキーマレスでBSON形式(JSON形式に似た形をとっている)でデータを保持(これを動的スキーマと呼ぶらしい)
- 上記の性質のおかげで複雑な階層関係を持てる
- Web APIとの相性がよい
- MongoDBの格納の仕方()はMySQLの概念で変換した位置づけ
    - データベース->コレクション(テーブル)->ドキュメント(レコード)
- コレクション内のドキュメントは独立しておりドキュメント毎に定義を変えられる
- 各データに固有IDの自動付与(インデックスの種類も選択できるらしい)

※詳しくは下記リンク先の方がすごく丁寧にまとめてくださっています
[MongoDB超入門](https://qiita.com/suguru03/items/c7eb44ed90c7e79bbedc)

# 参考文献
- [実務で役立つデータベースの活用法](https://www.slideshare.net/SoudaiSone/ss-50411947)
- [GCIデータサイエンティスト育成講座演習コンテンツ 公開ページ (第8〜10章)](https://weblab.t.u-tokyo.ac.jp/gci_contents/)
- [JSON入門](http://www.tohoho-web.com/ex/json.html)
- [MongoDB超入門](https://qiita.com/suguru03/items/c7eb44ed90c7e79bbedc)

# まとめ
ちょっと学んだ第一声としては難しい!!
これ難しい!!！！
けどデータのモデリングが扱いたい形にハマったらさぞ気持ち良いだろうと初心者ながら勝手に妄想

DBの選定は都度どういったデータをどのように扱うかを考えるのがまず第一歩だと理解しました。
どれも実際に触ってみて各DBの性質を少しでもわかっているとDBの選定に役立つかもですね。
僕は機械学習の勉強もしているのでその傍らでデータセット毎にDBに突っ込んで扱ってみたら以外と楽しめそうですね。
では、また。
【PHP】オブジェクト指向を学ぶ[その]3

#オーバーライド
継承した親クラスのメソッドやプロパティを書き換えると言うもの。

とりあえずコード。

```index.php
<?php

//クラス定義
class Self_Introduction{

    // プロパティー
    // 変数定義
    private $name;
    private $age;


    // インスタンスが生成されると同時に処理が走る
    public function __construct($name, $age){
        $this->setName($name);
        $this->setAge($age);
    }

    private function setName($name){
        $this->name = $name;
    }

    private function setAge($age){
        $this->age = $age;
    }

    function getName(){
        return "私の名前は{$this->name}です。<br>";
    }

    public function getAge(){
        return "年齢は{$this->age}才です。<br>";
    }

    public function getIntroduction(){
        return "私の名前は{$this->name}です<br>年齢は{$this->age}才です。<br>";
    }
}

class Sub_Introduction extends Self_Introduction{

    private $blood;
    
    public function __construct($name, $age, $blood){
        parent::__construct($name, $age);
        $this->setBlood($blood);
    }

    private function setBlood($blood){
        $this->blood = $blood;

    }

    public function getBlood(){
        return "血液型は{$this->blood}です。<br>";
    }

    public function getIntroduction(){
        return "{$this->getName()}{$this->getAge()}{$this->getBlood()}";
    }

}

// インスタンス生成
$USER = new Self_Introduction('太郎', 35);
$user = new Sub_Introduction('太郎', 35, 'A型');

echo $USER->getIntroduction();
//私の名前は太郎です
//年齢は35才です。


echo $user->getIntroduction();
//私の名前は太郎です。
//年齢は35才です。
//血液型はA型です。
```
`getIntroduction();`に注目してください。
`getIntroduction();`は親classでも子classでも使用されています。

ですが、子classで`getIntroduction();`を呼び出し出力結果を見るとちゃんと上書きされているのが分かります。

このように継承した親クラスのメソッドやプロパティを書き換えることを`オーバーライド`と言います。

#静的メンバ
次は静的メンバです。
静的メンバはプロパティやメソッドをひっくるめた言い方

プロパティやメソッドを静的メンバにするとクラスの外からプロパティやメソッドを使えるようにすること。

使用方法
・**`public`**をつける
・**`static`**をつける
です。

コードを見ていきます。

```index.php
class Foo{

    public static $age = 20;
    public $name = '花子';

    public static function HOGE(){
        return '静的メンバです';
    }
    
}

echo Foo::$age; //20
echo Foo::$name //出力されず
echo Foo::HOGE(); //静的メンバです

//インスタンス生成
$foo = new Foo();
echo $foo->age; //NULL
echo $foo->name; //花子
echo $foo->HOGE(); //静的メンバです



```
結果はこのような感じになります。

まず上から見ていきます。
`echo Foo::$age`・・・インスタンスを作成していなくても呼び出せていますね。これが静的メンバです。
`echo Foo::$name`・・・では$nameはと言うと呼び出せていません。このプロパティはインスタンスを生成して初めて使えるものです。
`echo Foo::HOGE();`・・・次はメソッド。これもちゃんと呼び出せています。ですが、メソッドに限りstaticにしていなくても呼び出せてしまうので注意が必要です。

次はインスタンスを生成して呼び出してみます。
`echo $foo->age;`・・・これは呼び出せません。と言うのも静的メンバはclassに属しているものであってインスタンスに属しているものじゃないからです。
`echo $foo->name;`・・・これは当たり前ですが呼び出せます。
`echo $foo->HOGE();`・・・これも呼び出せてしまうので注意が必要です。
インスタンス生成しても静的メンバはそのインスタンスの中には入っていない。

こう見るとインスタンスを生成しなくても呼び出せる静的メンバは関数みたいですね。

以上。

**※「ここ間違っている」や「こんなことも覚えておいた方がいい」と言うものがあれば是非教えてください**
PythonをWindowsの関数電卓代わりに使う 

## 概要
* windows標準の関数電卓やExcelは工学系にとって使いづらい。
* Pythonを関数電卓として使うと便利。

## はじめに

複雑な数式を扱う工学系の学生や電気/機械設計エンジニアにとってwindows標準の関数電卓は使いづらくありませんか。計算式の途中を間違えると最初からやり直しですし、変数も使えないうえ、複素数も扱えません。
Excelであれば実数と虚数でセルを分けて計算できるため少しマシですが、直感的ではなく扱いづらいですし、何よりスマートでないです。
代わりとして、Pythonを用いればすべての問題を解決できます。

## 比較

### 例題
私は回路設計エンジニアで、複素数を扱います。例えば以下のような計算が日常的に現れます。

```math  
\Gamma = \left | \frac{Z_{L}-Z_{0}}{Z_{L}+Z_{0}} \right | \\
Z_{L}=52.35+39.54j \\
Z_{0}=76.89-20.87j
```

これを例に計算をおこないます。
  
### Windowsの関数電卓を用いる場合
Γの計算をwindowsの関数電卓で行う場合、手順は以下のようになります。
1.実部のみを計算

```math  
(52.35-76.89)/(52.35+76.89)≒-0.120
```  

2.虚部のみを計算

```math  
(39.54-20.87)/(39.54+20.87)≒0.485
```  

3.絶対値を計算

```math  
\sqrt{(-0.120)^2+(0.485)^2}≒0.499
```  

これらを手打ちするのはかなりハードです。同じ数字を何度も打つので時間がかかりますし、途中で打ち間違えに気が付いても修正できません。

### Pythonを用いる場合

先ほどと同じ計算をPythonでおこないます。Pythonが標準で複素数をサポートしているので楽に計算ができます。

```python
#変数に代入する。
zl = 52.35+39.54j
z0 = 76.89-20.87j

#計算する。
gamma = abs((zl-z0)/(zl+z0))
print(gamma)
```  
実行結果 : 0.4993364571001565

こちらの計算方法は直感的で、打ち間違えの修正も簡単です。
効率や簡単さの点からPythonの圧勝です。

## 起動時にmathライブラリをimportする

Pythonのコンソールを開いてすぐの状態では、対数や三角関数などの基本的な計算がサポートされていません。Pythonを日常的に使う場合には不便なので、起動時に[mathライブラリ](https://docs.python.org/ja/3/library/math.html)をインポートします。

```python:calc.py
from math import *
```

``` .bat(dos):calc_lancher.bat
@echo off
python -i calc.py
```

calc_lancher.bat実行後の計算例:
!['計算例'](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338182/06cd844e-15e7-2077-3343-1a48763c3633.png)



複素数を扱う場合はmathライブラリの代わりに[cmathライブラリ](https://docs.python.org/ja/3/library/cmath.html#module-cmath)をimportしてください。

このバッチをキーボードの電卓キーに登録すると、いつでも簡単に開けて便利です。
RailsなしでRSpecのspec（テスト）を実行する方法

RSpecは、Rubyのテストフレームワークです。Ruby on Railsと組み合わせて使用されることが多いため、「Railsのテストフレームワーク」と紹介されることも多いですが、**ピュアRubyのみ（Rails未導入）でも使用することができます。**

## [準備] Gemのインストール
RSpecのgemをインストールします。※Railsのインストールは不要です。

```
$ gem install rspec
```

## rspec+ファイル名 で実行する

たとえば、以下のRubyファイルがあったとします。

```sample.rb
def greeting
	"Hello,World!"
end
```
```sample_spec.rb
require "./sample.rb"

describe "greeting" do
    it "returns Hello World!" do
        expect(greeting).to eq "Hello,World!"
    end
end
```
sample_spec.rbのspecを実行するには、以下のコマンドでOKです。（sample_spec.rbが配置されているディレクトリに移動しておくことを忘れずに！）

```
$ rspec sample_spec.rb

#=> 実行結果
.
Finished in 0.00628 seconds (files took 0.37104 seconds to load)
1 example, 0 failures
```
## 1つのファイルにまとまっていても実行できる

実処理とspecが1つのファイルになっていても実行できます。

```sample.rb
# 実処理
def greeting
	"Hello,World!"
end

# テストコード
require "./sample.rb"

describe "greeting" do
    it "returns Hello World!" do
        expect(greeting).to eq "Hello,World!"
    end
end
```

```
$ rspec sample.rb

#=> 実行結果
.
Finished in 0.00628 seconds (files took 0.37104 seconds to load)
1 example, 0 failures
```

## 簡単なプログラムならMinitestを使うのもアリ

Rubyにはデフォルトで**Minitest**というテストフレームワークが備わっています。

**MinitestはGemのインストール無しで利用できる**ので、今回紹介した例のような簡単なRubyプログラムをテストするのであれば、わざわざGemをインストールしないと使えないRSpecを使うメリットはあまりないかもしれません。。。

簡単なRubyプログラムをRSpecでテストする機会は多くないかもしれませんが、ご参考までに。
Android Pie対応するときにTextViewの改行の行間でハマった話

## targetSdkVersionを28にした

[Android 9 へのアプリの移行](https://developer.android.com/about/versions/pie/android-9.0-migration?hl=ja) を読んで
compileSdkVersionとtargetSdkVersionを28に変更してビルド実行、ビルド通ったし動作確認するかー
と動作確認していたときに「android:lineSpacingMultiplier」を設定している箇所を開いた際に
アレ？行間広くなってね？
と思って調べたときにハマったので記載

## 問題の表示
実際の表示を確認するためにTextViewのHello Worldを改行付き文字に置き換えただけの
Empty Activityで作成したプロジェクトを用意し検証

<table border="0">
<tr>
<td>Android 8のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/83be165d-e203-8a22-7220-4621dad270e4.png"></td>
<td>Android 9のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/2c368b88-34f8-ca91-6715-689ee67a1de4.png"></td>
</tr>
</table>

TextViewの内容

```xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="君がッ\n泣くまで\n殴るのを\nやめないッ！"
    android:lineSpacingMultiplier="1.5"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
```
明らかに行間が開いている！

## 不具合では？思って調査してみると…

調査してみるとgoogle issue trackerに似たような話が…
どうやら不具合ではなく想定通りの動作らしく
fallbackLineSpacingをfalseにすれば戻ると言う事なので実際に試してみる

google issue tracker
https://issuetracker.google.com/issues/122554779

※Android DevelopersのfallbackLineSpacingの記載箇所
https://developer.android.com/reference/android/widget/TextView.html#attr_android:fallbackLineSpacing

## 実際に試してみた結果
```xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="君がッ\n泣くまで\n殴るのを\nやめないッ！"
    android:lineSpacingMultiplier="1.5"
    android:fallbackLineSpacing="false"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
```

<table border="0">
<tr>
<td>Android 8のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/97294665-7331-3e7e-7aee-ea41691d12e4.png"></td>
<td>Android 9のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/c31f516e-f2c4-2486-a4ad-d7e3148759ae.png"></td>
</tr>
</table>

android:fallbackLineSpacingにfalseを設定すると行間が同じになった！

## 関係ありそうな箇所を見てみる
fallbackLineSpacingの箇所をみてみるとこのようなコードになっていたので
PieからデフォルトがfallbackLineSpacingがtrueになる様子

```java
mUseFallbackLineSpacing = context.getApplicationInfo().targetSdkVersion >= VERSION_CODES.P;
```

fallbackLineSpacingの説明をGoogle先生の翻訳にかけてみると下記の内容になるのでtrueが設定されている場合には行間が増えてしまうっぽい？

翻訳後の内容
「テキストの表示に使用される代替フォントの上昇および下降を尊重するかどうか。trueの場合、使用されてしまうフォールバックフォントは、使用されている行の上昇および下降を増やす可能性があります。」

## Android 9 へのアプリの移行を読んだけど…

今回この事象にぶつかってからどうしたら解決できるのか情報を漁り、この方法を発見したが見つけるまで苦労した…
この辺りの事は特に記載が無い気がする（見逃しているだけ？ or 自分が無知なだけ？）
android:fallbackLineSpacingにfalseを設定すれば行間を合わせられそうだが…他の方法とかあるんだろうか…
東大松尾研 データサイエンス講座  SQLが絡む章のみのPython環境構築(ローカル用)　

# 経緯
東大松尾研データサイエンス講座で強いエンジニアになるぞと息巻いてgoogle Colaboratryで、学習を進めていってました。
...が、SQLの章(第8〜10章)で突然SQLのランタイムが選択できないトラブルかつColabo上でどう環境構築すればいいか勉強不足でこれならローカルで一旦環境つくって進めようという経緯の元この記事を書きました。


#環境
- ubuntu 16.4 LTS
- mysql
- pyenv
- python3.7.3
- Jupyter notebook

# MySQL導入
- [Linuxインスール手順](https://qiita.com/kojionilk/items/bdace886c3664d75c5f7)

# MongoDB導入
- [Linuxインストール手順](https://docs.mongodb.com/manual/administration/install-on-linux/)
- [macインストール手順](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/)
- [windowsインストール手順](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/)
- 
# pyenv導入
下記リンクを参考に導入しました。
[pyenv と pyenv-virtualenv をインストールする](https://qiita.com/shigechioyo/items/198211e84f8e0e9a5c18)

# pyenv使い方
|コード|処理内容|
|:--|:--|
|pyenv vesion|現在の仮想環境確認|
|pyenv vesions|構築した仮想環境確認|
|pyenv install --list|インストールできる環境確認|
|pyenv install {python version}|pythonをインスール|
|pyenv virtualenv {python version} {環境名}|指定したpython versionをベース構築したい環境を作成|
|pyenv global {環境名} | 使用したい環境を有効にする|


# 導入パッケージ

```java:python-package
jupyter
matplotlib
seaborn
numpy
pandas
pymysql
scipy
```

# 参考URL
- [pyenv と pyenv-virtualenv をインストールする](https://qiita.com/shigechioyo/items/198211e84f8e0e9a5c18)
- [MySQLをjupyter notebookのkernelに入れる方法](https://blog.aidemy.net/entry/2017/08/08/194608)

#まとめ
現状はSQLが絡む章はローカルそれ以外はColaboratoryで快適進めることができています。
では、また。
Janomeを使って品詞の出力頻度を調べる。

# Janomeをインストールする

```
$ pip install janome
```

# 読み込んだテキストファイルを形態素解析して、名詞をカウント

```sample.py
from janome.tokenizer import Tokenizer
import zipfile
import os.path, urllib.request as req
import sys
from sys import argv
import time 

# テキスト読み込む
input_file_path = sys.argv[1]
part_of_speech = sys.argv[2]
f = open(input_file_path,'r',encoding = 'utf-8')
txt = f.read()

# 形態素解析オブジェクトの生成
t = Tokenizer()

# テキストを一行ずつ処理                    
word_dic = {}
lines = txt.split("\r\n")
for line in lines:
    malist = t.tokenize(line)
    for w in malist:
        word = w.surface
        # 品詞
        ps = w.part_of_speech
        # 名詞だけカウントする
        if ps.find(part_of_speech) < 0: 
            continue
        if not word in word_dic:
            word_dic[word] = 0
        word_dic[word] += 1

# 頻出単語を表示                                                                                    
keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
for word, cnt in keys[:50]:
    print("{0}({1}) ".format(word, cnt), end="")
```

```
$ python sample.py ファイル名 品詞
``` 

出力結果（名詞）

```
仕事(176) こと(155) 1(151) の(143) 円(134) ((129) 外(118) 利用(117) ,(113) 税(112) detail(107) https(106) jp(106) ://(104) chiebukuro(98) co(97) yahoo(96) 検査(92) 人(89) =(80) お客様(79) 名(75) 000(72) サービス(70) &(70) 人材(69) 当社(68) 場合(68) 2(64) 数(62) q(61) 会社(60) |(60) 私(59) よう(58) 採用(55) 精神(54) ]((54) ご(52) 時間(52) 何(51) qa(51) %(51) お(50) question(49)
```

出力結果（形容詞）

```
いい(37) ない(35) 良い(27) なく(14) 辛い(14) 無い(11) 欲しい(9) 問題(8) 若い(7) 甘い(6) 少なく(5) 大きく(5) 悪い(5) 仕方(5) 辛く(5) 良く(5) 高い(4) 楽しく(4) 多い(4) 新しい(4) すごく(4) 多く(4) 難しい(4) 怖い(4) 少ない(3) 悪く(3) 無く(3) 強く(3) 早く(3) 遅く(3) ふさわしい(3) 楽しい(3) 難い(3) なし(3) 低い(3) よく(3) 永く(2) ほしい(2) 悪かっ(2) 大きい(2) 少なから(2) 限り(2) 等しく(2) うまく(2) 暑い(2) 忙しい(2) しょうが(2) づらい(2) つらい(2) 酷い(2)
```

# 参考
[形態素解析のライブラリ「Mecab」と「Janome」を使ってみよう - 日々の学びのアウトプットするブログ](https://ushinji.hatenablog.com/entry/2017/11/23/161031)
Autodesk Inventor API Hacking (firstTimeとは何ぞや)


# 1. fistTimeとは何ぞや
AddInが有効化される時に呼ばれる関数の引数についてです。

```C#
public void Activate(Inventor.ApplicationAddInSite addInSiteObject, bool firstTime)
```

この第2引数のfirstTimeですが、どのように扱えば良いのか、という話しです。

結論を言うと、firstTimeは常に`true`です。

API Helpなどを見ると、firstTime == `true`の場合はコントロールを登録して、`false`の場合はしないとあります。
これは、Ribbonインターフェースより昔のインターフェース(ボタンとパネルのやつ)での話で、このインターフェースは既に廃止されています。
将来、Ribbonに代わるインターフェースが出てきたときに、このfirstTimeに意味が出てくることがあるかもしれませんが、現時点ではfistTime == `false`で呼ばれることはありません。


# 99. 親の記事に戻る
[Autodesk Inventor API Hacking (概略)](https://qiita.com/yamarah/items/cee08eb8f2b7aecbda83)
Dockerで名前をつけていないvolumeを削除する

Dockerで特定のコンテナが使っているvolumeを消す時に`docker volume rm <Volume名>` で消すことができますが、Volumeに名前をつけてない場合、どのDockerコンテナで使っているかわからず削除に迷ったのでまとめておきます。

## 環境
macOS: 10.13.6
docker: 18.09.2

## Volume名を確認
`docker volume ls` でVolume名を確認できますが名前をつけていないとhash値で表示されます。

```shell
docker volume ls
DRIVER              VOLUME NAME
local               24e0853786a7e954875ccfbfaa8b230535e31cc9257883918b4c7b41f837f094
local               619f0e516ca2506d6129b4b0e61f1685d6bf868f1165b6d7535e532a793014c9
local               950c020c36d49386417e12053277ea3bea1d6198de1dede52942530e26a6d62e
local               adad36583c083e30f82560a6b1420527ab593360f05da2e4eb03b10266f60318
local               ba52e56e07d33e91990c30de4a437e50bd0af3f948e6fbc2b5c9f4a25af09e0d
　・　　 　　　　　　　　　・
　・　　 　　　　　　　　　・
　・　　 　　　　　　　　　・
local               hoge_data1
local               hoge_data2
```

hoge_data1のように名前をつけていれば、どのコンテナで使っているのかわかるので `docker volume rm hoge_data1` のように削除してあげればOKですが、hash値だとどのコンテナで使っているかわからない、、、
なので別の方法でコンテナとVolumeの対応を探す必要があります。

## docker inspect
`docker inspect <container ID>` でコンテナの詳細情報を確認でき、Volume名も確認できます。
以下の例だと`Mounts`の`"Type": "volume"`の箇所がvolumeに関する情報になり、
`e01b1984250560b6f648f688e8a941e15949349feeabd5896fa8f80194486f0f` がvolume名になります。
このあたりの見え方はバージョンや使っている環境で多少変わってくるかもしれません。

```json
[
    {
        "Id": "f2292235330978eb3ab546ee453312a635bff66a12ce55f36e8a693a79f4faed",
        "Created": "2019-05-26T03:47:04.0594156Z",
        "Path": "docker-entrypoint.sh",
           ・
           ・
           ・

   　　"Mounts": [
            {
                "Type": "volume",
                "Name": "e01b1984250560b6f648f688e8a941e15949349feeabd5896fa8f80194486f0f",
                "Source": "/var/lib/docker/volumes/e01b1984250560b6f648f688e8a941e15949349feeabd5896fa8f80194486f0f/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
```

## docker volume rm
volume名を確認できれば、`docker volume rm` で削除してあげれば完了です。

```
$ docker volume rm e01b1984250560b6f648f688e8a941e15949349feeabd5896fa8f80194486f0f
```


## 参考
https://qiita.com/gekkoukisi/items/bb24d3b6ab24c0ce1bfb
ソフトウェア・システムのテストとは

###テストとエビデンス
ソフトウェアの製造やシステムの構築を納品する場合、
テストを実施する必要があります。

####テストの目的
* 要件通りに動くか
* 不具合が無いか

####テストの準備
* テストケースの作成
* テストデータの用意
* テスト環境の構築

####テストケースとは
ソフトウェアやシステムを実際に動かした場合に
どのような動作をするのかは納品前に把握しておかなければなりません。

処理する対象のデータや操作者の操作方法により、
また、機器の停止など障害により
意図しない動作が発生する可能性があります。

意図しない動作に対して受容や回避が出来ない場合は、
修正する必要があります。

上記のため、様々な場合を想定してテスト項目を洗い出します。

####網羅性
処理の選択や処理対象のデータにより
分岐、すなわち使用される機能又はハードウェアが変わってきます。

もしも、それぞれのコーディングや構築方法に誤りがあると、
正しい結果にならなくなる懸念があります。

そのため、全てのパターンがそれぞれ最低1回ずつテストできるよう、
テストケースを洗い出します。

####障害テスト
正常系（正常に稼働中の状態）と障害系（障害が発生した直後および復旧中）について実施します。障害が発生する可能性がある箇所を列挙し、障害箇所毎にテストを実施します。

####テストデータとは
ソフトウェアやシステムというものは、
あるデータを処理するためのものと言っても過言ではありません。

テストを実施する場合においてもデータが必要になりますが、
プライバシー保護や防犯の観点から、本番用のデータは利用させてくれません。

そこでテストデータ、すなわち実在の事物を指し示しない、または特定の意味を持たない羅列を用意します。

####エビデンス
すなわち報告結果に誤りが無いことを証明する記録を採ります。
これをエビデンスと呼んだりします。

####エビデンスの種類
* ログファイル
* 画面キャプチャ

####ログファイル
サーバやクライアント端末、ネットワーク機器等は、
処理や異常発生を後から確認できるよう、
記録を残していることが多いです。
その動作を "logging" 「ログ出力」「ログを吐き出す」などと呼び、
記録されたファイルをログファイルと呼びます。

ログファイルはテキストエディタで人間が容易に読めるテキストであり、
内容としては、イベント発生時刻、影響度、エラーコード、イベント内容等が行ごとに並びます。

ユーザがCLI (Command Line Interface)でログインし、コマンドを実行した場合の、
コマンド入力及びコマンド実行結果をテキストファイルに保存したものも、ログファイルと呼ばれます。
CLIは、CUI (Characteristic User Interface)、プロンプト画面、コンソール画面、Telnet画面とも呼ぶこともあります。

####画面キャプチャ
テストを行った際の、テスト用端末の画面を画像として記録します。
エビデンス画像、画面キャプチャ、スクリーンショット、PrintScreenなど、
呼び方は特に決まっていないように思います。
スクリーンショットの記録方法については、別記事で紹介します。
obnizとkintoneで物理ボタンアンケートを作ってみた

# はじめに

巷で人気のobnizとkintoneをつなげてみました。
前々からいろいろやってはいたのですが、今回は動画も使って記事化してみます！

# obniz とは

> obniz
> https://obniz.io/ja/

**「現実をソフトウェア化する」**
しれっともの凄いこと言っている気がするのですが、
つまるところ**Webの知識でマイコンが操作できる**感じです!webエンジニアとしてはものすごく使いやすい(^^)

実際にobnizをいじっていて一番驚きだったのが、
**クラウド上にプログラム配置してそれをobnizが読み込んでマイコン操作できる** ってこと。
クラウド上にあればどこでも良くて、<font color="red">**kintone上**</font> に配置することも可能！！
-> つまり k
￥intone JavaScript API が利用できる！！

やべーですよね。夢広がります！！

# 今回作ったもの

obnizにつないだボタンを押すとkintoneへレコード登録する仕組みを作ってみました。
ボタンを3つ用意して、アンケート的なノリです！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">obnizでアンケート <a href="https://t.co/0TQdnIPRh8">pic.twitter.com/0TQdnIPRh8</a></p>&mdash; BB@サブ (@BB_File) <a href="https://twitter.com/BB_File/status/1132451068846125056?ref_src=twsrc%5Etfw">2019年5月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 構成図

超シンプルです。

<img width="833" alt="layout.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153051/6259cbde-e315-bb3a-2425-4cc20021a2b1.png">

# コード

[GitHub](https://github.com/RyBB/obniz-iot-vote)で共有してます。

```javascript:vote.js
(() => {
  'use strict';

  const obniz = new Obniz('{YOUR_OBNIZ_ID}');

  const text = ['使う！！', '使いたい！', '使わない'];
  const postRecord = val => {
    const params = {
      app: kintone.app.getId(),
      record: {
        '{YOUR_KINTONE_FIELD_CODE}}': {
          value: val
        }
      }
    };
    return kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params)
      .then(resp => 'POST成功')
      .catch(err => 'POST失敗');
  };

  kintone.events.on('app.record.index.show', (event) => {
    obniz.onconnect = async () => {
      obniz.display.clear();

      // ボタンの設定
      const buttons = [
        obniz.wired('Button',  {signal:0, gnd:1}),
        obniz.wired('Button',  {signal:2, gnd:3}),
        obniz.wired('Button',  {signal:4, gnd:5}),
      ];

      // ボタンにイベントを紐付ける
      buttons.forEach((val, index) => {
        val.onchange = async pressed => {
          if (!pressed) return;
          const msg = await postRecord(text[index]);
          obniz.display.print(msg);
          obniz.wait(1000);
          location.reload();
        };
      });
    };
    return event;
  });
})();

```
## kintoneへの配置

obnizのライブラリ, jquery と上記コードを以下のように配置します。

順番 | ファイル/ライブラリ
:-:|:-:
1|https://js.cybozu.com/jquery/3.4.0/jquery.min.js
2|https://unpkg.com/obniz@2.0.3/obniz.js
3|vote.js(上記コード)

## 一押しポイント

ボタン押したらレコード登録部分

```javascript
val.onchange = async pressed => {
  ...
  await postRecord(text[index]);
  location.reload();
  ...
};
```

Web上で動くので `location.reload();`がそのまま使える！！

# さいごに

これでマイコンが動くってすごくないですか！？
まるでWebライブラリを扱っているように、ハードウェアの処理を書くことができます！！

それでは！≧(+･` ཀ･´)≦
【解決】Your Yarn packages are out of date!   Please run `yarn install` to update.

`yarn install`すると`Your Yarn packages are out of date! Please run yarn install to update.`（あなたのヤーンパッケージは古くなっています！更新するには yarn install を実行してください）の解決策。エラー文通り`yarn install`したんだけど、なんだこれイタチごっこじゃん、、、

## エラー文

```console
========================================
  Your Yarn packages are out of date!
  Please run `yarn install` to update.
========================================


To disable this check, please add `config.webpacker.check_yarn_integrity = false`
to your Rails development config file (config/environments/development.rb).


yarn check v1.16.0
error Lockfile does not contain pattern: "bootstrap@^4.3.1"
error Lockfile does not contain pattern: "jquery@^3.4.1"
error Couldn't find an integrity file
error Found 3 errors.
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.
```

# 解決策

node_modulesを削除

```console
$ rm -rf node_modules/
```

yarn.lockファイルを削除

```console
$ rm -rf yarn.lock
```

yarnをインストール

```console
$ yarn install
```

yarnをアップグレード

```console
$ yarn upgrade
```

あとはサーバー起動できれば

```
$ rails s
```

以上です！

https://qiita.com/nakki/items/4fa58cb6ff4d6c24c2d2
https://classic.yarnpkg.com/en/docs/cli/upgrade/
https://motomichi-works.hatenablog.com/entry/2020/04/23/115936
gulp基本知識まとめ

#はじめに
この記事はgulpを全然使えない筆者がgulpについて学んだことをメモするための記事です。少しずつ更新していくのです。

#gulpとは？
タスクランナーツールだよ。npmを使ってgulp
同じようなツールにgluntもあるがこちらは書くコードの量が多くなったり、やや古いということもありgulpを選んだよ。

#インストールするやつ
###gulp-cli
なんの機能かは調べてもよくわからなかったけどとりあえずグローバルでインストールするよ。グローバルでインストールする必要ない、gulp-cliをそもそもインストールする必要すらないとする意見もあるよ。諸説あるね。その記事読んでも理解できなかったからとりあえずインストールしようね。理屈は使った後で補足するから待ってろ

###gulp
とりあえずこれがなきゃ始まらないね

###gulp-minify-css
cssを圧縮するらしいよ。

###gulp-sass
sassで書いたものをcssに変換するために必要だよ。

###gulp-imagemin
画像を圧縮するやつだよ。

###gulp-changed
srcとdestのディレクトリ内の変更されたファイルだけストリームに流すよ。
#python で 例外 ( runtime error ) を発生させる  raise RuntimeError('message')

```
>>> raise RuntimeError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: oops!
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2012








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
python



FX

https://qiita.com/haminiku/items/a032d94e4f0d862df2b2

機械学習　gem利用方法

https://employment.en-japan.com/engineerhub/entry/2018/11/09/110000

基本文法

https://qiita.com/Fendo181/items/a934e4f94021115efb2e

```:len()
文字数カウント
```

```:str()
文字列に変換する
```

```:type()
型の判別
```

```:input()
gets
```

```:論理型
2 * 5 == 10
```

```:変数定義
number = "Hello World"
```


```
 dict = {"title": "ワンパン"}
  print(dict)

  print(dict["title"])
```

```:if
if value > 4:
 print("hello")

elif value == 3:
 print("ddd")

else:
 print("eveneing")
```

```:関数
def number_count():
  print("5")
  print("6")
  print("7")
  print("8")
  print("9")
  print("10")
```

```:文字列メソッド

startswith()
find()
rfind()
count()
capitalize()
title()
upper()
lower()
replace()
format
"a is {}".format("a")
→"a is a" 
"a is {0} {1} {2}".format(1,2,3)
→ a is 1 2 3
```


```:配列
pencil_case = ['apple', 'banana', 'parble']

追加
append

範囲

pencil_case[0:1] 
→'apple', 'banana'


pencil_case[:1]
→最初から1まで

pencil_case[1:]
→1から最後まで
 
```

```:クラスメソッド
 class クラス名:
    @classmethod
    def メソッド名(cls):
```

```:インスタンス作成
post = Post()
  post.write_post()
  post.show_post()

```

```:インスタンスメソッド
class クラス名:
    def メソッド名(self):
      # 処理
```

```:インスタンス変数定義
class クラス名
    def sample(self):
      self.text = "hoge"
```

```:イニシャライザー
class クラス名:
      def __init__(self, 引数):
          self.引数 #インスタンス変数の宣言。引数の値が変数の中身になる。
          print("クラス名のインスタンスが生成されました")


  インスタンス = クラス名() 

```

ゲッターセッター

http://tarao-mendo.blogspot.com/2017/07/essential-python-8.html

```:継承

class 子クラス名(親クラス名):

class Post:

class PostDetail(Post):

```
WindowでVagrant環境VM has become 'inaccessible' エラーを出します

最近、WindowsでVagrant環境をvagrant upをすると、下記のエラーを出しています。忘れずように、メモしておりましょう。

エラー

```
Your VM has become "inaccessible". Unfortunately, this is a critical error with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBox and clear out your inaccessible virtual machines or find a way to fix them.
```

解決方法："C:\Users{user}\VirtualBox VMs{vm-id}" で二つファイルがあります。

```
{vm-id}.vbox-prev
{vm-id}.vbox-tmp
```
"{vm-id}.vbox-tmp"　ファイル名から "{vm-id}.vbox" に変更した後、 再度起動に"vagrant up"を実行して行きましょう。
VScodeでLaTeXをタイプセットする時の設定

# 概要
VScodeで$\rm\LaTeX$をタイプセット（コンパイル）する際に，`settings.json`を工夫することでより便利にする方法です．
（個人的な備忘録を兼ねています．）
# setting.jsonの内容

## bibtexを使用する場合
ptex2pdf→pbibtex→ptex2pdfが必須となります．

```json:settings.json
{
    "latex-workshop.latex.tools": [
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "-interaction=nonstopmode",
                "%DOC%"
            ],
            "name": "Step 1: ptex2pdf"
        },
        {
            "command": "pbibtex",
            "args": [
                "%DOCFILE%",
                "-kanji=utf8"
            ],
            "name": "Step 2: pbibtex"
        },
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "-interaction=nonstopmode",
                "%DOC%"
            ],
            "name": "Step 3: ptex2pdf"
        },
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "-interaction=nonstopmode",
                "%DOC%"
            ],
            "name": "Step 4: ptex2pdf"
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "ptex2pdf+pbibtex",
            "tools": [
                "Step 1: ptex2pdf",
                "Step 2: pbibtex",
                "Step 3: ptex2pdf",
                "Step 4: ptex2pdf"
            ]
        }
    ],
}

```

## bibtexを使用しない場合
`\label{}`と`\ref{}`の対応付けのために2回タイプセットを行っています．

```json:settings.json
{
    "latex-workshop.latex.tools": [
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "-interaction=nonstopmode",
                "%DOC%"
            ],
            "name": "Step 1: ptex2pdf"
        },
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "-interaction=nonstopmode",
                "%DOC%"
            ],
            "name": "Step 2: ptex2pdf"
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "platex*2",
            "tools": [
                "Step 1: ptex2pdf",
                "Step 2: ptex2pdf"
            ]
        }
    ],
}
```

# 参考:settings.jsonでコメントアウトをする方法
VScodeの`settings.json`は、jsonc仕様なので`/* */`でコメントアウトが出来ます．

```json:settings.json
/*
hoge
*/
```
カルマンUD分解フィルター（例）

```{r}

#kalman U-D decomposition filter

library(dplyr)

n=5

H=sample(c(1:10),n,replace=T)

x=rnorm(n,mean=4,sd=3);y=2*x+9

#initial conditions

x=rep(1,n);P=diag(1,n)

R=5

times=10000

for(j in 1:times){

f=P%*%(H)   

a=H%*%f+R  

K=f/c(a)

x=x+K*(y-H*x)

P_past=P
  
P=P-K%*%t(f)

print(sum(abs(K)))

#print(P-P_past)



}

plot(c(1:n),y,type="o",col=2,ylim=c(min(c(H*x)+mean(y)-mean(H*x),y),max(c(H*x)+mean(y)-mean(H*x),y)),xlab="samples",ylab="values",main=paste0(cor(c(H*x)+mean(y)-mean(H*x),y)))

par(new=T)

plot(c(1:n),c(H*x)+mean(y)-mean(H*x),type="o",col=3,ylim=c(min(c(H*x)+mean(y)-mean(H*x),y),max(c(H*x)+mean(y)-mean(H*x),y)),xlab="samples",ylab="values",main=paste0(cor(c(H*x)+mean(y)-mean(H*x),y)))

#=>K

P%*%H/c(H%*%P%*%H+R)

f_mat=matrix(sample(1:10,n^2,replace = T),ncol=n)

G_mat=matrix(sample(1:10,n^2,replace = T),ncol=n)

x_vec=f_mat%*%x

P_bar=f_mat%*%P%*%t(f_mat)

```
【Java初心者】JavaBeansとSessionの違い

>JavaBeansとSessionってどっちも値を保持できるけど違いってなんですか？

これを聞かれてうまく答えることができなかったのと、調べても比較しているサイトがあまり出てこなかったのでここにまとめたいと思います📗

<h1>対象読者</h1>

- Java初心者(私もここです)
- なんとなくJavaBeansとSessionを使っていた

<h1>JavaBeansの長所、短所</h1>
<h3>長所</h3>
- getter,setterで入ってきた値を操作することができる

```java:JavabeansData.java

/* --------------------------------
今後の説明のために一通りコードを記載しています。
---------------------------------*/

public class JavaBeans implements Serializable { //永続化

  //カプセル
  private String name = "";
  private int age = "";
  private String tel = "";
  private String gender = "";
  private Date birthday = null;

  JavaBeans(){}//コンストラクタ

  //標準
  public String getName(){
    return name;
  }
  public void setName(String name){
    this.name = name;
  }

  /*省略*/

  //変更
  public void setBirthday(Date birthday){
    //空文字ならnullを代入
    if(birthday == ""){
      this.birthday = null;
    }
    this.birthday = birthday;
  }
  
}
```

- インスタンスに値を保持することで値の出し入れが簡単

```java:javabeans.java
//インスタンス生成
JavaBeansData jbd = new JavaBeansData();

//インスタンスに登録
jb.setName(name);
jb.setAge(age);
jb.setTel(tel);
jb.setGender(gender);
jb.setBirthday(birthday);

//呼び出し
jb.getName();
jb.getAge();
jb.getTel();
jb.getGender();
jb.getBirthday();
```

<h3>短所</h3>

- 別のクラスに値を運ぶことができない

JavaBeansのみだと呼び出す際に毎回値の初期化を行ってしまうので永続化を行っていても値の持ち運びができない

```java:javabeans2.java
///初期化されてしまう
JavaBeansData jbd = new JavaBeans();

jdb.getName();//値が初期値
```


<h1>Sessionの長所、短所</h1>

<h3>長所</h3>
別のクラスに値を持ち運べる

```java:session2.java
//セッションの呼び出しでリクエストスコープから値を毎回取得するので初期化されない
HttpSession session = request.getSession();
```

<h3>短所</h3>

- たくさんの値を出し入れするのは不向き

```java:session.java
//セッションスタート
HttpSession session = request.getSession();

//登録
session.setAttribute("name", name);
session.setAttribute("age", age);
session.setAttribute("tel", tel);
session.setAttribute("gender", gender);
session.setAttribute("birthday", birthday);

//呼び出し
session.getAttribute("name");
session.getAttribute("age");
session.getAttribute("tel");
session.getAttribute("gender");
session.getAttribute("birthday");
//セッションだと冗長的
```

- 値の操作ができない

<h1>まとめ</h1>

- 保持する値を操作したい
- 沢山の値を保持したい

上記のような場合は**JavaBeans**を使用

- 値をどこにでも持ち運びたい
- 持ち運ぶ数が少ない

上記のような場合は**Session**を使用

それぞれの長所短所を理解した上での使い分けが非常に大事ですね✨

<h1>補足</h1>
>沢山の値を保持したいけどどこにでも持ち運びたい!!

という事が多々あると思います。
その場合は、**JavaBeans**を**Session**に入れましょう❗

```java:hoge.java

//インスタンス生成
JavaBeansData jbd = new JavaBeansData();

//インスタンスに登録
jb.setName(name);
jb.setAge(age);
jb.setTel(tel);
jb.setGender(gender);
jb.setBirthday(birthday);

//セッションスタート
HttpSession session = request.getSession();

//JavaBeansのインスタンスをセッションに登録
session.setAttribute("jbd",jbd);
```

```java:hoge2.java
//セッションスタート
HttpSession session = request.getSession();

//JavaBeansメソッドを扱えるようにセッションをキャスト
JavaBeansData jbd = (JavaBeansData)session.getAttribute("jbd")

jbd.getName();//保持された値が表示される
```
GCPの無料枠でWordPressを起動して運用するまでの備忘録 3

### 背景
前回 Wordpress を立ち上げました。

- [GCPの無料枠でWordPressを起動して運用するまでの備忘録 2][1]
[1]:https://qiita.com/pooh_ichi/items/187517e3d99a10342ea2

今回は独自ドメインを設定します。
### 独自ドメインの設定

- [Google Cloud Platform (GCP) で独自ドメインを設定する][2]
[2]:https://qiita.com/tomy0610/items/adc839be9d100c0daf96
こちら ↑ を参考に進めさせて頂きました。

#### インスタンスの外部 IP アドレスを確認
ナビゲーションメニュー > カテゴリ「ネットワーキング」の「VPC ネットワーク」 > 「外部 IP アドレス」を選択
![domain01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236301/11c83964-71ea-7b72-5ef7-6e3cfc0022a7.jpeg)
外部 IP アドレスを確認しておく。
#### DNS の設定
ナビゲーションメニュー > カテゴリ「ネットワーキング」の「ネットワークサービス」 > 「Cloud DNS」を選択
![domain02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236301/6389f4aa-87bf-c6cb-a809-6801c6c23f14.jpeg)
ゾーンを新規に作成する。
![domain03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236301/c7c396ae-890a-6bd3-4c3a-780d73366f02.jpeg)
ゾーン名は適宜。みなさん、どんな名前にしているんでしょう？
DNS 名は、取得している独自ドメイン名を入力。
DNSSEC 「DNS セキュリティ」はオンにしておきます。
ゾーンが作成されたら、「レコードセットの追加」を押下して、「A」レコードの IPv4 アドレスに、先ほど確認した IP アドレスを入力します。
![domain04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236301/a57a72b6-e1ba-19ea-4256-11bb79d5269b.jpeg)
![domain05.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236301/e5235829-d6b2-8e21-6eee-8e82143166ff.jpeg)
### 独自ドメインを Google Domains に移管

- [その独自ドメイン、Googleに移管してみない？Google Domainsが日本から利用可能になっていたのでドメインを移管してみた。)][2]
[2]:https://www.makkyon.com/2018/01/03/google-domains-add/#WHOIS
ここからはこちら ↑ を参考に、お名前.com で管理していたドメインを Google Domains に移管しました。
#### Google Domains 側での設定
![domain06.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236301/8def0679-e6a6-dcb5-e249-c7e5eedbad3b.jpeg)
「Google Domains のネームサーバーを使用する」がデフォルトなので、Google Domains 側のネームサーバーを使用した方が良かったのかもしれませんが、今回は GCP 側を先に設定していたので「カスタムネームサーバーを使用する」にチェックを入れ、編集で「ネームサーバー」に GCP 側のネームサーバー名を入力する。
### ドメイン名で繋がるか確認する。
ネームサーバーの変更の反映はある程度時間がかかるため、適宜時間を置いてから疎通の確認をします。
その前に docker-compose を停止させて、保存用ディレクトリの中身を一度全て削除する。
`$ cd ghidorah_wordpress/`
`$ docker-compose down`
`$ sudo rm -r ./.data`
`$ sudo rm -r ./html`
docker-compose の再起動
`$ docker-compose up -d`
Web ブラウザから独自ドメインに対してアクセスしてみる。
http://www.papa-asobo.com
Top ページが表示されれば、成功です。
### まとめ
次回はいよいよ WordPress のプラグインの設定をします。
RailsアプリのRSpecセットアップ方法

#はじめに

Rails初心者です。
RSpecを初めて触るので、初めに行うRSpecのインストール〜アプリケーション設定について、備忘録としてまとめます。

既存アプリに追加する前提です。
1から作る場合は、こちらが参考になります。
[Railsアプリ作成手順まとめ](https://qiita.com/libertyu/items/c53df983605025145626)

バージョン管理

```
ruby 2.7.0
rails 5.1.6
```

#RSpecセットアップ

##①RSpecインストール
###1-1 Gemfileに`rspec-rails`を追加

```ruby:Gemfile
group :development, :test do
  # 元からあるコードは省略

  gem 'rspec-rails', '~> 3.6.0'

end
```

###1-2 bundle実行

```console:terminal
$ bundle install
```

##②テストデータベース確認

###2-1 テスト用データベース確認

・SQLiteの場合

```config/database.yml
test:
　<<: *default
database: db/test.sqlite3
```
・MySQL・PostgreSQLの場合

```config/database.yml
test:
　<<: *default
database: アプリ名
```
があるはずなので確認。

もし書いてなければ、
`config/database.yml`に上記のようなコードを追加
↓

```console:terminal
$ bin/rails db:create:all
```
でテストデータベース作成。

※余談ですが、 `rails` と `bin/rails` の違いについては、
こちらが分かりやすいです。
[Rails 4.1以降のコンソールコマンドは必ず bin/ を付けなきゃいけないの？](https://qiita.com/jnchito/items/c5a0848144203dce6e26)

##③RSpec設定
###3-1 RSpecインストール

```console:terminal
$ bin/rails generate rspec:install
```

これにより、

・RSpec用の設定ファイル（`.rspec`）
・私たちが作成したスペックファイルを格納するディレクトリ（`spec`）
・RSpecの動きをカスタマイズするヘルパーファイル

の３つが作成されます。

###3-2 testディレクトリの削除

RSpecではspecディレクトリのspecファイルに書いてくので、Railsアプリケーション作成時に作られたtestファイルたちを削除します。

```console:terminal
$ rm -r ./test
```

###3-3 デフォルトの形式→ドキュメント形式へ変更

必須ではないですが、RSpecの出力結果を見やすくします。

`.rspec`ファイルに下記を追加。

```ruby:.rspec
--require spec_helper
--format documentation
```

###3-4 `binstub`インストール

アプリケーションの起動時間を早くする`Spring`を追加します。

```ruby:Gemfile
group :development do

  # 元からあるコードは省略

  gem 'spring-commands-rspec'

end
```

```console:terminal
$ bundle install
```
↓
新しい`binstub`を作成

```console:terminal
$ bundle exec spring binstub rspec
```
実行すると、
`bin`ディレクトリ内に`rspec`という実行用ファイルが作成されます。

##④正常にRSpecがインストールできてるか確認

###4-1 コマンド実行


```console:terminal
$ bin/rspec


Running via Spring preloader in process 28279
No examples found.

Finished in 0.00074 seconds (files took 0.14443 seconds to load)
0 examples, 0 failures
```
このように出力されていれば成功です。

##⑤テストファイル自動作成設定

###5-1 ファイル作成に応じてテストファイルを作成

`rails generate`コマンドのようにジェネレータを使うと、
現時点で既に、
デフォルトの`Minitest`ファイルが`test`ディレクトリには作成されず、
`RSpec`ファイルが`spec`ディレクトリに作成されます。
特に設定は不要です。

###5-2 不要なテストファイルが作成されない設定

あとは、
不要なファイルが自動で作成されないように
`config/application.rb`に設定を加えます。

```config/application.rb
require_relative 'boot'
require 'rails/all'

Bundler.require(*Rails.groups)

module Testapps # 自分が作成したアプリ名
  class Application < Rails::Application
    config.load_defaults 5.1

    # 元からあるコードは省略

    config.generators do |g|
      g.test_framework :rspec,
       fixtures: false, # テストDBにレコード作成するファイルの作成をスキップ（初めだけ、のちに削除）。
       view_specs: false, # ビューファイル用のスペックを作成しない。
       helper_specs: false, # ヘルパーファイル用のスペックを作成しない。
       routing_specs: false # routes.rb用のスペックファイル作成しない。
    end
  end
end
```
上のコードでは、
モデルスペックとコントローラスペックが
デフォルトで自動作成されるようになっています。

他に自動作成してほしいファイルがあれば、
上の該当するコードは書かなくて良いです。

#参考

[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp/read)
[現場で使える Ruby on Rails 5速習実践ガイド](https://book.mynavi.jp/supportsite/detail/9784839962227.html)

とても分かりやすいです。
引き続き勉強していきます。
（動画にまとめた）AWS DeepRacerの学習と実際の走行【勉強会：DeepRacerハンズオン＆走行会の記録】

## DeepRacerハンズオン＆走行会

IoTラボ様主催の「DeepRacerハンズオン＆走行会」
- AWS DeepRacerについて知り、実際に走らせる会です -
https://iotlab.connpass.com/event/128169/

こちらに19年5月25日に参加しました。

そのときの記録を7分ほどの動画にまとめました。

twitterの動画は2分ほどしか表示できないです。

7分のフル動画はこちらから見れます。
https://youtu.be/Tt_Raj5bbRo


以下。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">アマゾンの自動運転AIを学ぶための<br>カメラ付きラジコンカー「DeepRacer」の勉強会<br>（IoTラボ様主催）に参加しました。<br>そのときの記録を7分ほどの動画にまとめました。<br><br>twitterに入りきらないので7分動画はこちら<a href="https://t.co/smOpcXkV1Z">https://t.co/smOpcXkV1Z</a> <a href="https://t.co/g1IcZ1kE9Z">pic.twitter.com/g1IcZ1kE9Z</a></p>&mdash; すぐる (@Neuro_educator) <a href="https://twitter.com/Neuro_educator/status/1132477583600132096?ref_src=twsrc%5Etfw">2019年5月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


7分のフル動画
https://youtu.be/Tt_Raj5bbRo


とても勉強になり、楽しいハンズオンでした。
IoTラボ様、ありがとうございました！
Django のインストールからプロジェクト作成まで

##概要
Django(Pythonフレームワーク)でプロジェクト作成からプロジェクト起動まで。


##実行環境
CentOS 7.6
Django 2.1.7
Python 3.7.0
##プロジェクト作成手順
###Djangoインストール
インストールコマンド

```
pip install Django
```

###プロジェクト作成
```
django-admin startproject project_name
```
コマンドを実行すると下記のような構成でプロジェクトが作成される。

```
project_name
├── project_name
│   ├── __init__.py
│   ├── settings.py — プロジェクトの設定
│   ├── urls.py — パスの設定
│   └── wsgi.py — wsgiサーバの設定
└── manage.py — Djangoの様々なコマンドを実行する
```
###起動確認
これだけで下記のコマンドを実行するとDjangoプロジェクトが起動できる。

```
python manage.py runserver 0.0.0.0:8000
```
http://localhost:8000

##終わりに
Python環境があれば数分でプロジェクト作成までできてしまうのがすごいですね。

##参考
Djangoチュートリアル
https://docs.djangoproject.com/ja/2.1/intro/tutorial01/
読み込んだテキストファイルをmecabで分かち書きし、結果をテキストファイルとして出力する。

# やったこと
1. 文字列を分かち書きをし、結果をテキストファイルで出力する
2. 読み込んだテキストファイルの文字列を分かち書きし、テキストファイルで出力する

## 分かち書きをする

```owakati_1.py
# mecab 大文字小文字に注意
import MeCab
# datetime
import time
# 引数取得
import sys
from sys import argv

#引数の取得
input_file_name= sys.argv[1]

# 解析対象テキストファイルのインポート
open(input_file_name,'r') as f:
	mecab = MeCab.Tagger("-Owakati")
	text = mecab.parse('解析文字列はこちらです。')
	mecab.parse('')

#ファイル実行開始時刻を取得
timestr = time.strftime('%Y%m%d-%H%M%S')

#出力ファイル名
out_file_name = "ochasen_" + timestr +  ".txt"
with open(out_file_name, 'w') as f:
	f.write(text)
```

## 読み込んだテキストファイルの文字列を分かち書きし、テキストファイルで出力する

```owakati_2.py
# mecab 大文字小文字に注意
import MeCab
# datetime
import time
# 引数取得
import sys
from sys import argv

# 引数の取得
input_file_name= sys.argv[1]

# 解析対象テキストファイルを開く
f =  open(input_file_name,'r')
# ファイルを読み込む
data = f.read()
# 分かち書きのみ出力する設定にする
mecab = MeCab.Tagger("-Owakati")
text = mecab.parse(data)
mecab.parse('')

#ファイル実行開始時刻を取得
timestr = time.strftime('%Y%m%d-%H%M%S')

#出力ファイル名
out_file_name = "ochasen_" + timestr +  ".txt"
with open(out_file_name, 'w') as f:
	f.write(text)
```

実行する

```shell-session
$ python owakati_2.py input.txt
```

# 最新辞書を使う＆品詞も出力する。

```owakati_3.py
# mecab 大文字小文字に注意
import MeCab
# datetime
import time
# 引数取得
import sys
from sys import argv

print('実行中…')
# 引数の取得
input_file_name= sys.argv[1]

# 解析対象テキストファイルを開く
f =  open(input_file_name,'r')
# ファイルを読み込む
data = f.read()
# 分かち書きのみ出力する設定にする
mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
text = mecab.parse(data)
mecab.parse('')

#ファイル実行開始時刻を取得
timestr = time.strftime('%Y%m%d-%H%M%S')

#出力ファイル名
out_file_name = "ochasen_" + timestr +  ".txt"
with open(out_file_name, 'w') as f:
	f.write(text)
print('ファイル出力完了 ファイル名：'+ out_file_name)
```

[[Python]MeCabで誰でも簡単に分かち書きをする方法 | エンジニアの眠れない夜](https://sleepless-se.net/2018/08/24/python-mecab-wakatigaki/)
[Python: テキストファイルの読み込み - read()、readlines()、readline()メソッド | Yukun's Blog](https://yukun.info/python-file/)
[Macでmecabを使う。 - Qiita](https://qiita.com/nolty/items/3a2e2e4f15c42206a9f9)
ssh-keygenの主なオプション

##ssh-keygen（鍵作成）の主なオプションは以下

| -1 | 鍵ファイルをSSH1からSSH2の形式に変換する |
|:--|:--|
| -t | 鍵タイプ指定する（rsa／dsa） |
| -i | 鍵ファイルの情報を表示 |
| -l | 公開鍵の情報（種別、指紋、コメントなど）確認 |
| -C | 鍵のコメント新規作成 |
| -b | 鍵の長さ指定（最低値は768bit、初期値は2048bit） |
| -p | 秘密鍵のパスフレーズ変更|
| -c | 鍵のコメント指定 |
| -f | ファイル指定|

e.g)以下のコマンドを実行すると、

```shell
$ssh-keygen -t rsa -b 2048 -f hoge_file_name
```

/home/[user名]/.sshディレクトリに
・鍵タイプrsa
・鍵の長さ2048
・秘密鍵：hoge_file_name,公開鍵：hoge_file_name.pubという名前で
鍵が作られる。
new_html, index_htmlと_form_htmlとshow_html画像投稿機能

はじめまして
駆け出しエンジニアです

今日は私がめっちゃ苦戦した画像投稿機能のことをお伝えします。

まず、最初に私が習ったのはフォーム作るときnew_htmlとindex_htmlのviewを
生成することだったんですけど

これでは画像が投稿できない！ということに気づきました。

画像投稿で検索かけると、とりあえず_form_htmlとshow_htmlが必要みたい？

でどうやったらこの_form_htmlとshow_htmlを反映させることができるのか、、

コマンドは、
rails g scaffold　でした！！
これをやると、
MVCやテーブルの記述やファイル作成、
index・show・new・edit・create・update・destroyアクションが生成されます！！

但し！MVCについて理解していない人は何がどうなっているかわからなくなってしまうので

理解したあとに
頑張りましょう！！
php 基本


### 学習したいこと

- 起動
- php ruby 
- laravel rails
- リファレンス
https://php.net/

### php基本メソッド

```:実行タグ

<?php
?>
```


```:echo 
 → puts
```
```:;
閉じたぐ必要
```

```:php -a
irb
```

```:基本メソッド

.　=　+ 文字連結


var_dump() = boolean判定
var_dump(1 < 20);

変数　= $変数名 = 格納する値;

定数 = $変数名 = 格納する値;


式展開 = {$hello}

fgets(STDIN); = gets（ユーザーの入力まち）

```


```:配列
$data = [キー1 => 値1, キー2 => 値2, ...];

$data = ['title' => "ワンパンマン"];
echo $data['title'];

例）

$posts = ["aa" => "ワンパン", "bb" => "ばか"];

echo $posts["aa"];

→　ワンパン
```

```:if

if (条件式) {
  // 条件式が真(true)のときに実行する処理
}
```

```:関数

function say_hello() {
  echo "Hello World";
}

// 関数の実行
say_hello();
```

```:while

$sum = 0;
$number = 1;
while ($number <= 10) {
  $sum += $number;
  echo $sum;
  $number += 1;
}
```


```:class
class クラス名 {
  // プロパティやメソッドの定義
}

$post = new Post();

```


```:クラスメソッド

class Post {
  public static function get_post_count() {
    return 0;
  }
}

$post = new Post();  // Reviewクラスのインスタンスを生成
var_dump($post);

echo Post::get_review_count(), PHP_EOL;


```

コンストラクタもあるみたい

```:ララベル環境設定

phpbrew
PHP
Composer（PHPのパッケージ管理システム） bundler

```

```:composer作成

composer create-project laravel/laravel アプリケーション名 バージョン

rails new
```

```:コントローラー
php artisan make:controller コントローラ名
```

```:モデル作成
php artisan make:model モデル名
```

```:サーバー起動（rails s）

php artisan serve
```

```:マイグレート
php artisan migrate
```

```:基本ディレクトリ構成
web.php（Routing）

Route::get('tweets', 'TweetsController@index');

layout.blade.php（application.html.erb）

```