OmniAICreator/Qiita-1.07M huggingface dataset:
PythonAnywhereにてpip installしたい

## はじめに
私の記事では毎度お馴染みの自作競艇予想サイト、「[きょう、ていの良い
予想はあたるだろうか。](https://youhaveniceboat.pythonanywhere.com)」に自然言語処理的な機能を追加しました。
本記事では、PythonAnywhereにていざ実装！となった段階で起きたトラブルをまとめています。

## Localでは動くが、PythonAnywhere上で動かない！！
Local環境での動作検証を終え、万を辞してPythonAnywhere上のファイルを差し替え、更新!!しかし、ここでエラーが起こりました..
errorlogを確認すると、どうやらjanomeがinstallされていないことが原因の様でした...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/662e55b4-05ab-1a05-177b-ebe8136ce575.png)

## 意外と簡単だったpip install
PythonAnywhere上の環境にも「pip install janome」的なことを実施すればいいので、その方法を探した所、あっけなく見つかりました。
以下、その手順となります。

<b>①Consoleタブに移動し、Bash consoleをクリック</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/0f56752d-272c-7cfb-006c-5fb446c17cea.png)


<b>②開かれたら、pip install --user janomeと打ち込む</b>
他のmoduleをinstallしたい場合も同様ですね。
（下図はすでにinstallした後のものです..)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/5130e289-b9c6-b0c0-ac98-ac99883331e7.png)


<b>③"pip list"と打ち込んで入力されていることを確認！</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/94a08dbb-d280-4244-8baa-058323a3a2ad.png)

## おわりに
無事、PythonAnywhere上でも動作できるようになりました！！めでたしめでたし。janomeをinstallして何をしたのかは、私の別記事を読んでいただければ幸いです..。


[公式サイト](https://help.pythonanywhere.com/pages/InstallingNewModules/)にも解説が載っていましたので、こちらもご参考に。
git pushの指定先を変更する方法


##チーム開発用

チーム開発用に順番に説明していきます。

####①今まで使っていたgithubのリポジトリをコピー

![スクリーンショット 2020-09-01 22.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625856/50d56592-c7e0-89f3-e921-0956e3b42c7b.png)

```
$ git clone コピーしたurl
```

何もブランチを指定しなければmasterブランチがcloneされます。
branchを指定してcloneしたければ以下のコマンド

```
$ git clone -b クローンしたいブランチ名 コピーしたurl
```

####②クローンできたらディレクトリを移動しコマンドでpush先を確認

```
$ git remote -v
```

####③push先が今井さんのリポジトリになっているので変更
![スクリーンショット 2020-09-01 22.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625856/8951d1fa-2c8e-064b-a706-a30ac631e54b.png)

まずは変更したいpush先のurlを確認します。
下のは松本のリポジトリです。今井さんのコピーして作りました。
![スクリーンショット 2020-09-01 22.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625856/64bf0566-0714-65ab-1f0a-feba352bc11f.png)
画像はurl消してありますが実際にアクセスしてコピーしてきてください！
コピーしたら以下のコマンドでpush先のurlを変更できます

```
$ git remote set-url origin コピーしたurl
```
変更できたか確認

```
$ git remote -v 
```
![スクリーンショット 2020-09-01 22.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625856/8cfa9dc7-4b92-47e4-7f0e-305770dd3d0a.png)

これで次から設定したリポジトリのurlへpushされます
JavaでListを降順ソートし非破壊で新たにListを生成する

## 概要
表記の件、AtCoderの問題を解く時に必要になったのでメモ書きで残します。Javaで実装しようとした時にいくつか方法は挙げられると思いますが、個人的に一番短く書けると感じる実装を記載します。

## 対応方針
* [Java: Sort an unmodifiable list](https://stackoverflow.com/questions/1797550/java-sort-an-unmodifiable-list)に非破壊でListを返す実装方法がいくつか書いてありますが、今回はStream APIを使うものを採用します。
* 降順ソートは、[Comparatorの使い方・作り方](https://javazuki.com/articles/comparator-usage.html)で紹介されている`reverseOrder()`を使います。

## 実装サンプル
下記のように入力する数字の数と、数字のリストを入力し、

```
4
2 2 1 3
```

入力した数字リストを降順に出力するサンプルです。

```Sample.java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

import static java.util.Comparator.reverseOrder;

public class Sample {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        List<Long> inputList = new ArrayList<Integer>();
        for(int i = 0; i < n ;i++) {
            inputList.add(sc.nextInt());
        }
        // ここがソートの該当箇所
        List<Integer> sortedList = inputList.stream().sorted(reverseOrder()).collect(Collectors.toList());
        for(int a: sortedList) {
            System.out.println(a);
        }
    }
}


```

【2020/9/2追記】@swordoneさんからコメント頂きました。immutable保証まで行う場合はソート部分は下記のようになります。

```java
List<Integer> sortedList = inputList.stream().sorted(reverseOrder())
                                    .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
```
【制御工学#1】-カスケード構成のメリット~"位置制御器のみ"と"位置制御器+速度制御"はどちらが良いのか~

#概要
制御工学分野のカスケード構成についてまとめた。
具体的には"位置制御器のみ"と"位置制御器+速度制御"はどちらが良いのかについて。
結果、速度制御があったほうが制御帯域が広がり応答性が上がることを確認した

#カスケード構成とは
カスケード構成とはフィードバック制御において、メジャーループとマイナーループによって構成される構成である。
モータ制御で例えると
メジャーループ：位置制御ループ
マイナーループ：速度制御ループ
下図参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/c88a267e-736a-eef0-b6ac-4b085fb09d78.png)


#使用ソフト
scilab ver6.02

#速度制御器ありなしの位置応答の比較
"位置制御器のみ"でのモータ位置応答と"位置制御器+速度制御器"での位置応答を比較してみた

<速度制御なし>
速度制御器の制御ブロック図とシミュレーション結果を示す。
(https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/388f2786-23ff-2edb-7228-4b375e73081b.png)


左―黒：位置指令(ステップ指令) 緑：位置応答　　右－緑：位置PID出力　黒：速度応答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/596dd31d-efe7-72b4-1977-3a9beed8bc32.png)


<速度制御あり>
位置制御器+速度制御器の制御ブロック図とシミュレーション結果を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/5006d9a4-384e-8639-2e25-42608ec0352f.png)



左―黒：位置指令(ステップ指令) 緑：位置応答　　右－緑：位置PID出力　黒：速度応答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/8b9edebd-8a0a-9d6e-6463-9213d2c983c0.png)

**わかったこと**
速度制御器ありでは位置応答が位置指令に追従している


#速度制御器ありなしのボード線図比較
"位置制御器のみ"でのモータ位置応答と"位置制御器+速度制御器"でのボード線図比較してみた
ここでのボード線図は位置指令から位置応答までの周波数応答を見ている

<速度制御なし>
bode(Gc,1e-1,1e+5)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/3bddeb07-5060-0dd1-bbe2-f5fcbea01adc.png)![image.png]


<速度制御あり>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/99fec979-fa87-112e-3c99-3b3d8019b691.png)
**わかったこと**
ボード線図より速読制御ありのほうが減衰する周波数が高い。つまりは指令値の周波数が高くても応答が減衰しない

#結論
上記結果より
速度制御があったほうが制御帯域が広がるため制御性能が上がる
【Python】matplotlibを日本語対応させよう

# 概要
matplotlibは標準フォントでは日本語に対応していないので・・・

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/46a72bf0-1369-6c48-6d77-fb14258f77fa.png" width=500px>
こんな感じで文字化けしてしまいます。
これを
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/8c5a9d2c-43e9-297f-76df-41abdd606b22.png" width=500px>
こうなるようにしていきましょう。

# 環境
```
# OS version
ProductName:	Mac OS X
ProductVersion:	10.15.6
BuildVersion:	19G2021

# Python version
Python 3.8.5
# matplotlib version
matplotlib==3.3.0
```


# 手順

## 1. フォントのダウンロード
まずお好みでフォントをダウンロードします。
今回は[IPAフォント](https://ipafont.ipa.go.jp/index.html)を使用します。

## 2. ダウンロードしたttfファイルをフォントフォルダへ移動する
matprotlibのフォントフォルダにttfファイルを移動させます。
パスは環境にもよりますが以下を参考に。

**/usr/local/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf**

lib(ライブラリ)フォルダが見つからない場合はFinderの移動タブからライブラリを選択、あるいは表示タブの表示オプションから常に表示するようにできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/430f6779-f397-162a-495b-7f2ce61d7763.png" width=500px>
こんなフォルダにたどり着くはず。

## 3. matplotlibrcを編集する
先程のttfフォルダの2つ上位のフォルダ(mpl-dataフォルダ)にあるmatplotlibrcを開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/bb4c37d0-0d34-4374-7cd0-667eece274b6.png" width=500px>

"#font.family sans-serif" という記述を探して・・・
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/f02806f6-73fc-0819-feac-e796cff0d329.png" width=500px>
下の行に"font.family IPAexGothic"と追記します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/a4ef4857-27f1-f4eb-3429-4877d5855f8d.png" width=500px>

これで設定は完了です！

フォントが正常に表示されることを確認してください。

# 「そんなフォントないよ！」というエラーが起こる場合
以下のエラーが起こる場合

```
UserWarning: findfont: Font family ['IPAexGothic'] not found. Falling back to DejaVu Sans.
```
フォントのキャッシュが残っている可能性が考えられます。

/Users/ユーザー名/.matplotlibフォルダ内にある"fontlist***.json"を消して、
JupyterNotebookを再起動させてください。
.matplotlibフォルダは隠しフォルダなので表示されない場合は"Shift+Cmd+.(ドット)"を試してみてください。

# おわりに
Anaconda環境での日本語化方法はググれば出てくるのですが、純粋なPython環境での例が出てこなかったので自分の経験を基にまとめてみました。
お役に立てていれば幸いです。
【初学者向け】HTML～よく使うタグ要素～｜使い分けや注意点

![website-3374825_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700417/15e4dad2-2eb9-ea19-a54b-a53f6de0b5bd.jpeg)
HTMLタグの中には```<article>```や```<aside>```のように使い分けの判断に困るタグが存在します。これらのタグの理解は、**SEOを重視する上で非常に重要です。**今回は**使用頻度の高いタグの使い分けや注意点**について解説しました。



---
![header-nav.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700417/f6882b1b-7a73-50b7-cb5b-97d8661d1147.png)
###```<header>```の解説
**タグの要素：**フロー・コンテンツ/パルパブル・コンテンツ
**使用例：**ページのヘッダー/導入部分
**解説：**基本的にヘッダーに使用。```<h>タグ```を必ず入れ子にする必要はない。
###```<nav>```の解説
**タグの要素：**セクショニング・コンテンツ/フロー・コンテンツ/パルパブル・コンテンツ
**使用例：**目次/パンくずリスト
**解説：**基本的に導入関連のリンクのまとまりには```<nav>```を使いましょう。

---

![figure-figcaption.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700417/eca24d61-4cb5-e750-db9e-dba2718c55ae.png)
###```<figure>```の解説
**タグの要素：**セクショニング・ルート/フロー・コンテンツ/パルパブル・コンテンツ
**使用例：**自己完結するコンテンツ（主に注釈のついた写真や図）
**解説：**どこのセクションに設置しても問題ないコンテンツに使用します。
###```<figcaption>```の解説
**タグの要素：**フロー・コンテンツ
**使用例：**写真のキャプション（注釈）
**解説：**```<figure>```の中のみに使用すると考えて問題ありません。

---

![article-aside-section.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700417/273a893a-f8d1-905a-4134-064dd06e0d0c.png)
###```<article>```の解説
**タグの要素：**フロー・コンテンツ/セクショニング・コンテンツ/パルパブル・コンテンツ
**使用例：**記事の一覧/HP内のブログエリア/ユーザーのコメント欄
**解説：**内容が完結しているコンテンツに使用します。完結しているのであれば、入れ子も可能。
###```<aside>```の解説
**タグの要素：**フロー・コンテンツ/セクショニング・コンテンツ/パルパブル・コンテンツ
**使用例：**脚注や用語解説などの補足情報
**解説：**厳密な定義がないので使用は感覚次第。サイドバーに使われたり使われなかったり。
###```<section>```の解説
**タグの要素：**フロー・コンテンツ/セクショニング・コンテンツ/パルパブル・コンテンツ
**使用例：**大見出しや中見出しごとの、まとまりのあるコンテンツ
**解説：**理解が非常に難しいタグ。**基本的には、テーマがある程度一貫しているコンテンツをまとめる際に使います。**以前は```<div>```でまとめていたコンテンツを、HTML5が導入されてからは```<section>```でまとめることが増えました。

---

![other.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700417/142559ca-f3b6-d784-6e07-81128ad317b7.png)
###```<samp>```の解説
**タグの要素：**フロー・コンテンツ/フレージング・コンテンツ/パルパブル・コンテンツ
**使用例：**「○○で**エラーが出ました**と出た場合」のような操作方法の解説に使用（太文字部分が```<samp>```）
**解説：**フレージング・コンテンツなので、段落や見出し、その他```<p>```などの中に使用しましょう。
###```<kbd>```の解説
**タグの要素：**フロー・コンテンツ/フレージング・コンテンツ/パルパブル・コンテンツ
**使用例：**キーボードの入力を表現する際に使用
**解説：**```<samp>```のキーボード入力版と考えるとイメージしやすいかと思います。フレージング・コンテンツなので、見出し等の中に記述しましょう。
###```<ins>```の解説
**タグの要素：**フロー・コンテンツ/フレージング・コンテンツ/パルパブル・コンテンツ
**使用例：**後から追加された文章に使用
**解説：**実はSEOには影響しないので、現状は使わなくてもOKなタグです。

---

![summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700417/421087dd-74d0-c88f-2dee-36d62e4d175e.png)

今回紹介してきたタグのほとんどが、SEOにおいて非常に重要視されています。```<article>```や```<section>```といったタグはHTML5以降、導入されたタグで上位表示されているサイトでも使用していないことがあります。これらのタグはクローラーがサイトの構造を理解しやすくなるので、新規サイトを立ち上げる際は、必ず導入するようにしましょう。
[Scala] 読み込んだファイルをメモリに展開

## 環境

macOS Catalina
Scala2.12.x
play2.6.x

## やりたいこと

- アプリケーション内の計算式で利用する係数をファイルに持っておきたい。
- アクセスあるごとにファイルIOをしていると処理速度が遅くなるので、初回アクセス時のみファイルIOしたい。

## ソリューション

- conf/配下にファイルを配置
- 初回アクセス時にファイルを読み込んで、値をシングルトンオブジェクトに保持する。（メモリに展開する）


## シングルトンオブジェクトとは

同じプロセス内で、一つしか存在しないオブジェクトのこと。
一度作成されると同じプロセス内では、一度作成されたオブジェクトが使いまわされる。


Scalaでは、以下のようにobjectを定義するとシングルトンオブジェクトを定義できる。

```scala

case class SingletonSample(name: String)

object SingletonSample {
  val singletonSample = SingletonSample("singleton")
}

SingletonSample.singletonSample

```

一度しか作成されないので、現在時刻などを管理するオブジェクトには使えない。（使ってもいいが、オブジェクトが作成された時刻が保持されるだけ）

```scala
case class DateObj(time: OffsetDateTime)

object Date {
  val now = DateObj(OffsetDateTime.now)
}

Date.now  //いつアクセスしてのも、オブジェクトが作成された時刻しか保持していない

```



## 実装例


```scala
case class FileData(file: List[String])

object FileData {

  val file: FileData = FileData(
    allCatch withApply {t: Throwable =>
      logger.warn(s"$t")
      logger.warn("ファイル読み込みできませんでした。")
      Nil
    } apply {
      Source.fromInputStream(getClass.getClassLoader.getResourceAsStream("file.tsv")).getLines().toList
    }

  )
}

FileData.file

```

上記例では、ファイル全体をいったんオブジェクトに格納しているが、後々検索などをするのであれば、検索しやすいようにMapでデータを持つなどの加工はした方が良い。

## 参考

- https://qiita.com/shoheiyokoyama/items/c16fd547a77773c0ccc1
Browserify with Babel 7 の環境を構築する


# TL; DR

インストール：

```terminal
$ npm install --save-dev browserify babelify @babel/core @babel/preset-env
```

```json:.babelrc
{
    "presets": ["@babel/preset-env"]
}
```

実行：

```terminal
$ ./node_modules/.bin/browserify main.js -t babelify -o bundle.js
```


# 概要

Babel + Browserify の環境作りにトライしてみたのですが、愚直に `browserify` と `babelify` だけインストールすると babel のコアモジュールがなくて実行できなかったり、コアモジュールを探してみると npm に `babel-core` と `@babel/core` があったりして、なかなか紛らわしいです。

色々とハマって時間を無為に消費したので、この記事で第２の私が現れるのを予防します。

Babel と Browserify の概要については下記のリンクを参照するとよいです。

- [What is Babel?（公式）](https://babeljs.io/docs/en/)
- [賢く使う Browserify](https://app.codegrid.net/entry/browserify-1)

# 結論

`babelify` を使用するためには、追加で babel のコアモジュールをインストールする必要があります。
そして、使用する Babel のバージョンが 7 か 6 かによって、必要なコアモジュールは異なります。

- Babel 7 : `@babel/core`
- Babel 6 : `babel-core`

GitHub の [README.md](https://github.com/babel/babelify) を見ると、ちゃんと書いてあります。:cry:

最新版の `babelify` は Babel 7 ベースなので、

```terminal
$ npm install --save-dev browserify babelify @babel/core @babel/preset-env
```

を実行すればよいです。

一緒にインストールしている `@babel/preset-env` は、ECMAScript の文法を Babel に認識させるために必要なプラグインのセットです。
かつては `preset-es2015` のように ECMAScript 規格ごとにモジュールが分かれていたりしたようですが、今は `preset-env` に一本化されたようなので、これだけ入れておけばよいようです。

使用する preset を指定するために、`.babelrc` を作成して、以下のように書いておきます。

```json:.babelrc
{
    "presets": ["@babel/preset-env"]
}
```

これで環境は整ったので、あとは実行するのみです。
以下のコマンドで `main.js` を Babelify & Browserify して `bundle.js` を出力します。

```
$ ./node_modules/.bin/browserify main.js -t babelify -o bundle.js
```

`package.json` に以下のように書いておくと `npm run build` で実行できて便利です。

```json:package.json
  "scripts": {
    "build": "browserify main.js -t babelify -o bundle.js"
  },
```

# ついでにミニファイする（おまけ）

[tinyify](https://github.com/browserify/tinyify) というプラグインを入れると、Browserify のついでにミニファイしてくれます。便利。

インストール：

```terminal
$ npm install --save-dev tinyify
```

実行：

```
$ ./node_modules/.bin/browserify -p tinyify main.js -t babelify -o bundle.js
```
python3.7でdictが格納順を保持するようになったが、pprint出力は自動でソートされる

pythonのアップデートのきっかけになったので記念に投稿。
現在進行形でアップデートが進んでる言語なんですね。

- 参考にしたサイト
  - https://qiita.com/tonluqclml/items/db797d9ad03604ae489c
  - https://note.nkmk.me/python-collections-ordereddict/
  - https://note.nkmk.me/python-pprint-pretty-print/

ちなみに、動作確認は Python3.7.3 -> Python3.8.5 です。

# python3.7以上は```dict```が格納順を保持する
めっちゃ便利！
しかし、```pprint```で出力をする場合、```pprint```が **出力前にソートをする** 仕様のせいでいまいち恩恵が薄い。


```python:test1.py
from pprint import pprint

d = {1: 10, 9: 90, 3: 30, 7: 70, 5: 50}
print(d)
pprint(d)
```
```python:out1
{1: 10, 9: 90, 3: 30, 7: 70, 5: 50}
{1: 10, 3: 30, 5: 50, 7: 70, 9: 90}
```
1個ずつ代入した場合も同じ。

```python:test2.py
from pprint import pprint

d2 = {}
d2[0] = 0
d2[8] = 80
d2[2] = 20
d2[6] = 60
d2[4] = 40
print(d2)
pprint(d2)
```
```python:out2
{0: 0, 8: 80, 2: 20, 6: 60, 4: 40}
{0: 0, 2: 20, 4: 40, 6: 60, 8: 80}
```

# python3.8以上で```pprint```に```sort_dicts=False```指定ができる
python3.8から、```pprint```に```sort_dicts```オプションが追加されたらしい。
デフォルトは```sort_dicts=True```になっているので、順序を保持したいなら```False```指定が必要。

```python:test3.py
from pprint import pprint

d = {1: 10, 9: 90, 3: 30, 7: 70, 5: 50}
print(d)
pprint(d, sort_dicts=False)
```
```python:out3
{1: 10, 9: 90, 3: 30, 7: 70, 5: 50}
{1: 10, 9: 90, 3: 30, 7: 70, 5: 50}
```
mac sass installがうまくいかなかったりうまくいったり

https://brew.sh/
ここ、日本語に切り替えると、homebrewのsearchが全く動作しないというバグ。
Englishにすると、homebrew searchが使えます。

で、sassを検索すると

```
sass/sass/sass
```

がでてくるので、

```
brew install sass/sass/sass
```

でインストールできました

うまくいかなかったら、　rubyのバージョンが新しすぎるので、バージョンを戻すと良いです。

```
rbenv install 2.5.0 
```
Angulartics2を使ってSPAサイトにAdobe Analyticsを導入するときの手順と注意点

# はじめに

SPA形式のWebサイトに対して、Adobe AnalyticsなどのWeb行動計測ツールを入れるのは
今までのWebサイトの導入時と違い、ちょっと調整や技術調整が必要になります。

> 理由として、ページのリフレッシュが起きない事による今までの仕組みの違いがあります。

SPA形式のWebサイト制作をするに当たっては、AngularやReact、Vueなどいくつかのフレームワークが存在します。
今回はそのうちの一つ、Angularで作ったSPAサイトに対してAdobe Analyticsを導入する時に使えるAngulartics2というパッケージについて少し考慮するべきポイントをまとめました。

[angulartics/angulartics2: Vendor\-agnostic analytics for Angular2 applications\.](https://github.com/angulartics/angulartics2)

# Angulartics2について
Angulartics2は、AngularでSPAアプリケーション開発をする際に様々な分析ソリューションを簡単に入れられるようにする為のPackageです。Adobe Analyticsを始め、他の製品にも多く対応しています。

以下はAngulartics2のgitページより。
![スクリーンショット 2020-09-01 20.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443/5995db3a-30a7-6d9f-b2b9-66cb74fd85dc.png)


# Angulartics2を使ってAdobe Analyticsを導入する方法

Angulartics2を使ってAdobe Analyticsを導入する簡単な方法ですが、サポートしてるリストにもあるタグマネージャーのAdobe Launchを導入し、Adobe Launch経由でAdobe Analyticsを入れるのが一番簡単です。


## Angularアプリケーションコードに追加

Angulartics2の導入自体についてはAngulartics2の以下のページを参照してください。
なお、事前にAdobe LaunchでPropertyを作成し、タグマネージャーのJavaScriptコードを吐き出してください。

[angulartics2/src/lib/providers/launch at master · angulartics/angulartics2](https://github.com/angulartics/angulartics2/tree/master/src/lib/providers/launch)

1. ベースとなるHTMLに対してAdobe LaunchのScriptタグを入れる
2. Angularアプリケーションに対して上記に記載されているコードを導入


## Adobe Launchの設定を追加

設定したAdobe LaunchのPropertyに対して設定を行います。
Angulartics2ではページ遷移のルーティング処理が入った時とカスタムリンククリック処理が入った時に自動でAdobe Launch側で設定できるDirect Ruleをコールするような形となります。

| Direct Call名 | 概要 |
|:-:|:-:|
| pageTrack | ページのルーティング処理をした時に実行(PV数を加算)  |
|  eventTrack | クリック等の任意のユーザーアクションが行われた時に実行  |

上記の様なDirect Call名が実行されるので、Adobe Launch側で設定をします。

Adobe LaunchのRule設定画面(pageTrackの時)
![スクリーンショット 2020-09-01 21.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443/e0bd1795-92e5-cf45-03b0-1897b9639b81.png)


これで基本的にルーティング処理(ページ遷移)がされる度にこのRuleが動くので、このときにAdobe Analyticsが動くようにActionの設定をすれば計測することが可能です。

![スクリーンショット 2020-09-01 21.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443/32776c18-277d-fbf7-9b83-f05bbfb16e49.png)


# 注意点について

上記のような形でSPAサイトでも簡単にAdobe Analyticsを導入することは可能です。
しかし、いくつか計測実装をするときに注意しておく必要があるポイントがあります。

## アプリケーション内で保持する情報を計測する場合

SPAのアプリケーション内で保持している様々な情報を取得するときには注意が必要です。例えば...

- ECサイトなら表示している商品IDや表示カテゴリ、検索キーワード…
- 検索サイトなら検索している条件情報など…

のように、アプリケーションの内部で保持しているような情報を取得したい場合には、window Object配下に必要なデータをDataLayer形式等で書き出してもらう必要があります。
この書き出しタイミングは必ず、pageTrackが実行されるよりも前に書き出す必要があります。
Angularアプリケーションの書き方によってはタイミングが前後してしまう場合があり、必ず動作させてタイミング通りにデータがとれるかは確認をしてください。
[SwiftUI]Textの右寄せが難しい

このような`Text`の右寄せが意外と分かりにくく難しかった。

![スクリーンショット 2020-09-01 19.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/110e3f5b-d359-a74b-cd83-27d7f6f56adb.png)

## うまくいったコード

`Text`単体ではできませんでした。ZStackでラップして実現しました。

```swift
struct ContentView: View {
    var body: some View {
        HStack(spacing: 16) {
            ZStack {
                Text("タイトル")
                    .frame(width: 120, alignment: .trailing)
                    .foregroundColor(.gray)
                    .background(Color.init(white: 0.9))
            }
            Text("テキスト")
                .frame(maxWidth: .infinity, alignment: .leading)
                .background(Color.init(white: 0.8))
        }
        
    }
}
```

ポイントは、右寄せしたいTextをZStackの中に入れ、
`.frame(width: 120, alignment: .trailing)`
のように幅固定で右寄せにしました。


## 参考
https://stackoverflow.com/questions/56443535/swiftui-text-alignment
FlutterでFirebaseを使うときのFirebase.initializeApp()の呼び方

#目的
Firebaseのバージョンが更新されたため、FlutterでFirebaseのパッケージを使用する前にFirebase.initializeApp()を呼び出す必要があります。
呼び出さずにビルドすると`[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()`こんなエラーが出てしまいます。
Firebaseパッケージを使う前にどうやってFirebase.initializeApp()を呼び出そうか迷っていたので、もし同じく迷っている人がいれば参考にしてください！

きれいな呼び出し方がわからないので、ひとまず思いつく呼び出し方を残しておきます。
もっと良い方法があれば教えて下さい！

#環境
Firebase.initializeApp()を呼ぶ必要があるのはfirebase_coreの0.5.0バージョン以降です。

```pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^0.5.0
```

#Firebase.initializeApp()の呼び方
ではFirebase.initializeApp()の呼び方を3つ紹介していきます。

##１つ目(FutureBuilderを使う方法)
最初はFutureBuilderを使う方法です。
StatelessWidgetのままFirebaseをイニシャライズできるのでおすすめです。
この方法では、イニシャライズに失敗したときとイニシャライズ中のWidgetを用意する必要があります。
今回の例では
エラー時は真っ白の画面にして
完了まではLoading()という読み込み中用のWidgetを表示しています。

```main.dart
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

void main() => runApp(App())

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: Firebase.initializeApp(),
      builder: (context, snapshot) {

        // エラー時に表示するWidget
        if (snapshot.hasError) {
          return Container(color: Colors.white);
        }

        // Firebaseのinitialize完了したら表示したいWidget
        if (snapshot.connectionState == ConnectionState.done) {
          return MyHomeApp();
        }

        // Firebaseのinitializeが完了するのを待つ間に表示するWidget
        return const CircularProgressIndicator();
      },
    );
  }
}
```

##2つ目(initStateで呼び出してsetState()するやり方)
２つ目はFirebaseパッケージを使う前にinitStateでイニシャライズしてsetState()でbuild()し直す方法です。
このWidget内でinitStateのFirebase.initializeApp()が完了する前にFirebaseパッケージを使う処理を書いているとエラーになってしまうので注意してください。

```main.dart
@override
void initState() {
  Firebase.initializeApp().whenComplete(() {
    setState(() {
      print('initilize completed');
    });
  });
}
```

##3つ目(main()を非同期にしてイニシャライズしてからアプリを表示する方法)
3つ目はmain関数でFirebase.initializeApp()を呼んで、完了してからrunAppをするやり方です。
Firebase機能をたくさん使うアプリではrunApp関数より前にイニシャライズしてしまうのが良いと思います。

WidgetsFlutterBinding.ensureInitialized()は最初に書いておかないとエラーになってしまうので気をつけてください。

```main.dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
```


#さいごに
アプリ起動時にFirebase.initializeApp()をしたいケースは多いと思います。
できるだけきれいなコードで書いて、なおかつUXを下げないような処理にしたいですね。
【備忘録】MATLABでカンマ区切りテキストをcsvで保存する。

MATLABには配列やテーブルをcsvなどで保存するために、csvwriteやwritematrixなどの関数が用意されている。
ただし、書き込む配列は$m\times n$のサイズでなければならず、以下のような異なる成分数の行が連結されたようなコンマ区切りcsvは作れない。(もしできるなら教えてください)

```
a,1
b,2
c,3,4,5,6
d,7,8,9
```

この時は、MATLABで以下のようにテキスト配列を作成し、

```MATLAB
testtext = ['a', ',', num2str(1), newline
            'b', ',', num2str(2), newline
            'c', ',', num2str(3), ',', num2str(4), ',', num2str(5), ',', num2str(6), newline
            'd', ',', num2str(7), ',', num2str(8), ',', num2str(9)];
```

fopen, fprintf, fcloseを使ってcsvに書き込むと、異なる成分数の行が混在したcsvを作れる。

```MATLAB
fid = fopen('test.csv','w');
fprintf(fid, testtext);
fclose(fid);
```

上の例ではテキストを全て作成してからcsvに書き込んだが、fprintfをループに入れて一単語ずつ書き込んでも良い。
【Code With Me】Jetbrains IDEで始めるコード共有でペアプロ生活

# はじめに
**Code With Me**というJetbrains向けの共同開発機能が2020/08/27にEarly Accessとして公開されました

> 要するにIntelliJ向けVSCode Live shareみたいなものです

[公開及び配布を行なっているコメント](https://youtrack.jetbrains.com/issue/IDEABKL-708#focus=Comments-27-4365766.0-0)

上のコメントによると

|日付|内容|
|:--|:--|
|2020/08/27|JetBrains IDEs v2020.2.1向けのCode With Me EAPプログラムを開始|
|2020/09|Code With Me EAPがJetBrains IDEs v.2020.2.x向けのMarketplaceからインストールできるようになる|
|2020/12|Code With MeがJetBrains IDEs v2020.3のメジャーリリースに同梱されるようになる|

とのこと。

すこし動画撮ってみました
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Code With Meいい感じで動くな <a href="https://t.co/4N7gW1HqyF">pic.twitter.com/4N7gW1HqyF</a></p>&mdash; しゅう (@syu_chan_1005) <a href="https://twitter.com/syu_chan_1005/status/1300769544902901761?ref_src=twsrc%5Etfw">September 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# インストール
> ここをしっかり書いてしまうとあまりEAPの意味を理解せず使ってしまうかもしれないので簡単にしか書きません

1. [公開及び配布を行なっているコメント](https://youtrack.jetbrains.com/issue/IDEABKL-708#focus=Comments-27-4365766.0-0)よりアンケートに回答し、メールを受け取る
2. メールにURLがあるので、アクセスし、自分が使いたいIDE用の`**_codeWithMe-plugin-**.zip`をダウンロード
3. IDEを開き設定の`Plugins`から`歯車マーク`->`Install plugin from disk...`を選択し、DLしたzipを選択する

また、現在対応しているIDEは

- IntelliJ IDEA
- PhpStorm
- PyCharm
- WebStorm
- AppCode
- RubyMine
- CLion

の7個です。

# 機能
## 概要
基本的にはVSCode Live shareに似ています。
共有したプロジェクトのコード閲覧や、ホストのマシン上でBuild/Run、ホストマシンのTerminal操作などが行えます。

## コードの共有
Code With MeではURLを発効し、それを相手に伝えることで共同編集が可能になります。

IDEを開くと新しく`Code With Me` menuが表示されます。

![Main menu bar](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/29d59e3d-a7cf-ec50-bf82-07e28a35cc55.png)

![menu items](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/9ff9c7e3-9a57-1073-c9d0-888b44de935a.png)

このメニュー内から`Enable Access and Copy Invitation Link`を選択すると、`https://code-with-me.jetbrains.com/****`のようなURLが生成され、クリップボードにコピーされます。

このリンクを共有すると`IntelliJ Client`とう新しいソフトウエアがインストールされ、共同編集することができます。

また、IntelliJ Clientから新規に接続をしようとするとホストマシン上で下のようなダイアログが表示され、共同編集を拒否することも可能になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/00ed2d14-9a24-e45c-5c67-86b17dce641f.png)


共有が開始されると、Main toolbarに接続しているユーザーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/bd394e18-d6bc-d0bf-c254-fee5ecb983c1.png)

## コードの編集
同じファイルの同時編集はもちろん可能です。
コード保管も表示され、Indexesはホストマシンのものを使うため、比較的軽量です。
ただし、IntelliJ Clientという新しいソフトウェアを導入するためKeymapやPostfix Completionなどは標準のものしかなく、すでにインストールされているIDEやホストから引き継がれることもありません。

また上記のメニュー画面のスクリーンショットにもありますが、
`Jump To`(選択したユーザのキャレット位置まで移動する), 
`Follow`(選択したユーザのキャレット位置を追従する)(1方向),
`Full sync mode`(選択したユーザとキャレット位置を完全に共有する)(双方向)
などの機能もあります。

また、以上の機能を利用しているときにはキャレット位置やWindowに枠線等が付き、わかりやすくなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/775268e5-0036-75c7-be82-d7c7db7354b1.png)

# おわりに
まだまだ対応しているIDEは少ないですが、EAPながら軽快に動作します。
しかし、この`Code With Me`は2020.2.1以上でなければホストができないため、Android Studioなどではまだ動作しません。(Canaryリリースがされていないだけでビルドされている形跡はありますが、、、)

2020/12の正規リリース後に、Android Studioなどへの対応や、チャット機能などがつくと嬉しいですね。
また、他プラグインによる拡張が可能になればVSCode Live shareのように拡張されていくと思うので楽しみですね。
nginxでIP直打ちを拒否る

# 今回やりたいこと
サイトアクセスでipアドレス直打ちを拒否したい。
# 使用しているwebサーバ
nginx
# 情報収集
[IP直でのアクセスをnginxで禁止する](https://ik-fib.com/2019/07/nginx-ip-direct-access-block/)
[Nginxの設定(www, https, IP)](https://qiita.com/ryota-sakamoto/items/9e901f00a001bf5ccad7)
[HTTPリクエストのヘッダフィールド「Host」について](https://qiita.com/katu_/items/42bc1bce5daa1be7748f)
confでip直接続を防ぐのね
# confファイルの編集
server情報を保持しているconfファイルを修正します。
nginxをデフォルトで使用している場合、/etc/nginx/conf.d/default.confに記載します。
以下を追記

```
server {
    listen      80 default_server;
    server_name _;
    return 444;
}

server {
    listen              443 ssl default_server;
    server_name         _;
    ssl_certificate     ****fullchain.pem;
    ssl_certificate_key ****privkey.pem;
    return 444;
}
```
※default_server指定が既存のserverに指定されている場合は削除する。
nginx起動
```sudo service nginx reload```
```sudo service nginx restart```
# 接続確認
![2020-09-01_11h22_25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/e53bc601-219a-9075-1c95-785e763360ad.jpeg)
httpでもhttpsでも直打ち拒否！
イエイ！

今回はここまで。
ありがとうございました。
【初心者でもわかる】レスポンシブサイト作成時のCSSを切り分ける方法（@media screen）

# どうも7noteです。レスポンシブサイト作成時にCSSを切り分け方について

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/mediascreen/
NoSQLに分類されるデータベース

応用情報技術者平成30年春期 午前問30

ビッグデータの基盤技術として利用されるNoSQLに分類されるデータベースはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/50593db6-ccf4-9850-8c7b-0f9b7403bb7e.png)


１、NoSQL(Not only SQL)は、
データへのアクセス方法をSQLに限定しないデータベース管理システムの総称で、長い間決まったように使用されてきた関係データベース管理システム以外のDBMSという意味で用いられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4d100d81-9e92-139a-e5fa-12716c4ee3c2.png)


RDBMSはデータを扱う際のコストも高くなり、ビッグデータなどの高頻度で膨大なデータを扱う場面ではパフォーマンス面での劣化が現れてきました。
NoSQLは、スキーマレスで軽量なのでデータの参照や追加を低コストで実行できます。さらにスケーラビリティ（＝拡張性）にも優れるため大量に蓄積されていくデータを扱うのに適しています。

NoSQLには大まかに分けて4つのタイプがあります。
　・キー・バリュー型
　　1つのキーに1つの値を結びつけてデータを格納する
　・カラム指向
　　行キーに対してカラム（名前と値の組み合わせ）を結びつけて格納する
　・ドキュメント指向
　　XMLやJSONなどの構造でデータを格納する
　・グラフ指向
　　グラフ理論に基づいてデータ間の関係性を表現する


NoSQLはトランザクションをサポートせず「結果整合性」という考え方に基づいてデータ処理を行います。結果整合性とは、即座にデータが反映されることを前提とせず、結果的に(実際に読み込まれる時までに)一貫性が保証されていればよいという考え方です。NoSQLは、このアプローチに基づき一貫性の保証を弱めることでスケールアウトを容易にしています。

・スケールアウトとは、コンピュータシステムの性能を増強する手法の一つで、コンピュータの台数を増やすことでシステム全体の性能を向上させること。 処理を並列化、分散化できるシステムで適用される。




２、各種類NoSQLデータベースの詳細：
　　１）、　キー・バリュー型
RDBのようなテーブルや関係性を定義せず、キーとバリューという組み合わせからなるシンプルなデータモデルです。
データが増えるにつれて表が縦の方向に伸びていくイメージです。
データモデルが単純であることからデータを容易に分割可能なことから、スケールアウトに最適なのが特徴です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/91cc9cfe-3a6e-2579-936e-49e707f8f2b9.png)

　　２）、カラム指向型
上記のキーバリュー型にカラムの概念を持たせたデータモデルです。
行に付与されたキーが複数のカラムを持つことができます。
カラム数はRDBのように固定ではなく、動的に追加していくことができます。
RDBを利用していると異質に思えるかもしれませんが、ほかの行には存在しないカラムを持つ行を作ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fc018227-b53f-4051-fcc5-4e5e39b1ec8f.png)


　　３）、ドキュメント指向型
JSONやXML形式で記述されたドキュメントの形でデータを管理することができます
各ドキュメントは階層構造を持たず、相互の関係を横並びに管理します。
RDBのように固定されたデータ設計が不要なことから「スキーマレスである」と言われます。

例は、ブログの投稿履歴とメールの送信履歴をドキュメント指向型データベースに記録したとします。
これらは全く異なる性質のデータですが「投稿日と送信日が2018/9/18のデータ」と指定することで、関係するデータが取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a859376f-1826-ad2e-13df-cfa4b728825f.png)


　　４）、グラフ型
データとデータ感のつながりを管理できるデータモデルです。
グラフ型のデータベースには以下の構成で表現されます。
　・ノード
　・リレーションシップ
　・プロパティ

例えば、FaceBookの友達関係をグラフ型で表現すると以下のようになります。
・Aさんというアカウントが存在します（ノード）
・AさんはBさんと関係があります（リレーションシップ）
・AさんとBさんは友達同士です（プロパティ）
・この基本構造を拡張していくと「Aさんの友達であるBさんの友達」や「Aさんと友達になってから
・3年以上経過したアカウント」といった検索も可能になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/166fa9a8-3f18-4085-6e53-f50c11e113bd.png)


３、オブジェクト指向データベースの説明
関係データモデルをオブジェクト指向データモデルに拡張し，操作の定義や型の継承関係の定義を可能としたデータベース

４、データウェアハウスの説明
経営者の意思決定を支援するために，ある主題に基づくデータを現在の情報とともに過去の情報も蓄積したデータベース

５、データディクショナリやリポジトリの説明
データ項目の名称や形式など，データそのものの特性を表すメタ情報を管理するデータベース



参照：

https://www.ap-siken.com/kakomon/30_haru/q30.html


https://www.db-siken.com/kakomon/27_haru/am2_18.html


【超入門】RDBとNoSQLの違いに着目！NoSQLに求めるものとは？
https://tech-blog.rakus.co.jp/entry/20180919/nosql/bigdata
Heroku上のRailsアプリにNewRelicを導入する

## 導入方法
### アドオンを追加
- HerokuのダッシュボードからNewRelicアドオンをProvision
    - コマンドラインから行う場合は`$heroku addons:create newrelic:wayne`

この時点で`NewRelicアカウントの作成`、`各種環境変数のセット`が自動で行われています。

### 設定方法が記載されている画面に移動
- アドオン一覧画面からNewRelicをクリックし、NewRelicのサイトに移動
    - コマンドラインから行う場合は`$ heroku addons:open newrelic`
- `Get Started`をクリック
![new_relic_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/c7d0ca08-2266-6d88-b7cb-4fb6bf4489a4.png)
- `Ruby`をクリック
![ 2020-09-01 20.38.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/7b14e21c-a5e5-7679-1dba-4160aad11c8f.png)

### アプリとの接続
表示される画面に従って設定
![ruby_new_relic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/2d8e71c0-e2e8-7611-3b01-426734c07952.png)

1. アプリ名を入力
2. `newrelic_rpm`のgemをインストール
3. 設定ファイルをダウンロードし、`config`ディレクトリ直下に設置(NEW_RELICのライセンスキーが直書きされているので環境変数にしまった方が良い)
4. Herokuにデプロイ(+デプロイ後のサイトにアクセスしてトラフィックを作る。)
5. データを取得

もう一度Herokuのアドオン一覧画面に戻り、NewRelicのアドオンをクリックすると、パフォーマンス監視のダッシュボード的な画面に移動できるようになっているはずです。

## その他
- 古いドキュメントには「環境変数にアプリ名をセットしろ」と書かれているけどなくてOK(設定ファイルに書かれているから)
- 間違えてgemをdevelopmentグループに記述してしまって1時間以上詰まった。。。
- NewRelicのアカウント、メールアドレスはHerokuに登録しているメールアドレスがセットされている。パスワードは不明なので、ログイン画面からパスワードリセットを選択して再設定しました。

## 参考
- [Ruby agent and Heroku | New Relic Documentation](https://docs.newrelic.com/docs/agents/ruby-agent/installation/ruby-agent-heroku)
- [New Relic APM | Heroku Dev Center](https://devcenter.heroku.com/articles/newrelic)
- [Herokuの無料dynoをスリープさせないで24時間稼働させる4つの方法 | Casual Developers Note](https://casualdevelopers.com/tech-tips/how-to-prevent-idling-of-free-dyno-on-heroku/)
netbeans 12.0 macにインストール for openjdk

# netbeans 12.0 install

https://netbeans.apache.org/download/nb120/nb120.html

拡張子 dmgをダウンロード

# openjdk

homebrew に任せましょう。
そのあと
シンボリックリンクを作成（ショートカットみたいなやつ）

```
brew install openjdk
sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

```

```
 java --version
```
最新バージョンならOK


あとは、ダウンロードしたnetbeansをインストールできるようになっているので、インストールしましょう。


# メモ sassがうまくいかないときの設定

```
/Applications/NetBeans/Apache NetBeans 12.0.app/Contents/Resources/NetBeans/netbeans/etc/netbeans.conf

vi netbeans.conf

netbeans_default_options="........  -J-Dnb.sass.libsass=true" 最後に  -J-Dnb.sass.libsass=trueを追加

```
同じドメイン内でWordpressとWebシステムの両方を共存させる設定をやってみました。


WordPressとWebシステムを同一ドメインで共存させるということをやる機会がありましたのでやったことをメモで残しておきます。
WebシステムとWordpressはAWSのEC2で別々のサーバとして動作しており、/mediaへのアクセスはwordpressの方へ捌くということをやっております。
Webシステムの方は既に稼働済でwordpressの方へ新規で構築し、ロードバランサ側でアクセスを捌く設定追加を行っております。

# 動作のイメージ
hogehoge.comにアクセス → Webシステムの方へアクセス
hogehoge.com/media → Wordpressの方へアクセス

# やったこと
やったことは大きく二つ

- ロードバランサ(ALBの設定)
    - リクエストの入り口
    - Webシステム、Wordpressのどちらかにアクセスを振り分けるリバースプロキシのような役割
- Apacheの設定
    - 受け付けたリクエストを内部で処理するようにドメインとパス書き換える
        - /mediaというパスを排除し、インスタンス内(localhost)で処理を捌くように書き換え
        - 見かけ上(ブラウザに表示されている)は大元のリクエストURLをそのまま使用できるようにする


# 対応内容
## ロードバランサの設定
- wordpress用のターゲットグループを作成し、wordpressのインスタンスを紐付ける
- ロードバランサの作成を行い
  - パスが`/media*`の場合はwordpress用のターゲットグループに転送するように設定する

## Apacheの設定
`/etc/httpd/conf/httpd.conf`を編集し、下記を追加

- URLの書き換えを行うのでモジュールの読み込み、設定の有効化を行う

```
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine on
```

- `/var/www`の`AllowOverride none` となっている部分を`AllowOverride All`に変更する。
  - こちらは.htaccessによる設定の上書きを許可するための設定。今回の設定に関わる内容というよりはWordpress側の設定になるかも

```
<Directory "/var/www">
    AllowOverride All
    .
    .
    .
</Directory>
```

- リバースプロキシの設定
    -  /mediaでアクセスがきた場合にlocalhostとしてアクセスを捌くように設定
    - ProxyPassReverse の設定はリダイレクトによるアクセスがきた場合に捌く設定
        - どちらも必要なので両方書いておく必要あり

```
ProxyPass /media http://localhost/
ProxyPassReverse /media http://localhost/
```

- URLの書き換えを行う。Wordpressのインスタンス上では/mediaから始まるパスでアクセスを捌くわけではないので/mediaを除外したパスとなるようにURLの修正を行う。
- この際にURLの見かけ上はドメインはそのままで/mediaを含むURLでアクセスを捌きたいので/〇〇でドメインを含めずに指定する必要がある。
- `RewriteRule ^/media/$ /media [R=302,L]`では/media/でピンポイントでアクセスがきた場合にリクエストがうまく捌けず403エラーになってしまうようだったので/mediaに書き換えてリダイレクト してしまうように設定
    - ここはもっといいやり方はある気がする...

```
RewriteRule ^/media/$ /media [R=302,L]
RewriteRule ^/media/(.*)$ /$1
```

以上こんな感じでwordpressとWebシステムの共存ができました。
メモリながらやっていなかったのでちょっと漏れがあるかもしれないけどポイントはこんな感じになると思う。
データディクショナリ(DD)、ビュー、スキーマ(schema)

応用情報技術者平成30年春期 午前問29

関係データベース管理システム(RDBMS)のデータディクショナリに格納されるものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5877516d-152c-8f85-1d24-5ff413ca7e5d.png)


１、データディクショナリ(DD)は、データベースのメタデータやデータ定義情報を効率よく管理する情報の保管庫です。データディクショナリは、他のデータベースと同じく表とビューで構成されていて次のような情報が格納されています。

　・概念スキーマ、外部スキーマ、内部スキーマとそれらの変換定義情報
　・表、ビュー、インデックス、その他オブジェクトの定義情報
　・参照制約、検査制約の定義情報
　・ユーザ情報
　・アクセス権と機密保護に関する情報


・DDに格納されるのは、DBMSが管理するファイルの定義情報です
・表の実データは1つ以上の別個のファイルとして保存されています。
・インデックスの内容は別個のファイルとして保存されています。

２、ビューは、
1つ以上の基礎となる基底表(DBに実データを持つ表)または他のビューから何らかの関係データベース演算によって得られた結果(導出表)に名前を付けたものです。仮想的な表なので実表とは異なり実際のデータは持っていません。


３、スキーマ(schema)は、
データの内容，データの論理構造，記憶形式や編成などデータベースの構造を記述したものです。

ANSI/X3/SPARCではスキーマを、概念スキーマ，外部スキーマ，内部スキーマの3つのグループに分ける提案を行い、これを3層スキーマアーキテクチャといいます。


データベースの概念スキーマ、外部スキーマ、内部スキーマ　の詳細：
・内部スキーマは、
概念スキーマをコンピュータ上に具体的に実現させるための記述である。データファイルの配置やインデックスなどが該当する。

・概念スキーマは、
内部スキーマと外部スキーマの間に位置し、エンティティやデータ項目相互の関係に関する情報をもつ。テーブルやリレーションなどが該当する。

・外部スキーマは、
個々のプログラム又はユーザの立場から見たデータベースの記述である。ビューなどが該当する。
データの利用者からの見方を記述したもの。SQLのビューが外部スキーマに該当する。



参照：
https://www.ap-siken.com/kakomon/30_haru/q29.html


https://www.fe-siken.com/kakomon/24_haru/q29.html

データベースの概念スキーマ、外部スキーマ、内部スキーマ
https://qiita.com/lymansouka2017/items/615dac8890e39a4da86e
アスキーアートでfizzbuzzする。

今回、超絶技巧プログラミングという素晴らしい本を読んだのでアスキーアートでFizzBuzzをしてみました。
四角の中に0x6d61という文字を書いています。結構見づらい…

```ruby
eval(%w(1.upto(100)do|n|s=n;if(n%15==0);s="FizzBuzz
";e    lsi f(n% 5==   0);s="Buz z";els   if(n% 3==0
); s="F izz "; end ;puts(s);end ;;;; ;;;;;;;;  ;;;;
;; ;  ; ;;;; ;;;;;     ;;;;;    ;;;;     ;;;;; ;;;;
;; ;;;; ;; ;; ;;;; ;;; ;;; ;;;; ;;;; ;;; ;;;;; ;;;;
;;;   ;;; ;;;; ;;;;   ;;;;;;   ;;;;;;   ;;;;;; ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;)*"")
```
#解説

簡単にコードを解説していきます。まず```%w```部分でfizzbuzzのメインコードを
配列に分解してます。%wは```%w(wei wei wei)```と書くと[ "wei,"wei","wei"]に変換できます。
この仕組みのおかげでコードに空白を含めることが出来ます。次に`*""`の部分で配列を再度結合して文字列にしています。
この段階での最終コードは以下になります。

```ruby
"1.upto(100)do|n|s=n;if(n%15==0);s=\"FizzBuzz\";elsif(n%5==0);s=\"Buzz\";elsif(n%3==0);s=\"Fizz\";end;puts(s);end;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
```
最後にこれをevalで実行しています。

このrubyプログラムを作成するために以下のコードを書きました。
ほぼ「超絶技巧プログラミング」のコードを参考にしています。

```ruby
ascii = """
###################################################
###    ### #### ###   ######### ######   ##### ####
## #### ### ## ### ############ #### ########  ####
## #  # #### #####     #####    ####     ##### ####
## #### ## ## #### ### ### #### #### ### ##### ####
###   ### #### ####   ######   ######   ###### ####
###################################################
 """
puts ascii.length
code = <<'END'
1.upto(100) do |n|
s = n;
if(n%15==0);
  s="FizzBuzz";
elsif(n%5==0);
  s="Buzz";
elsif(n%3==0);
    s="Fizz";
end;
puts(s);
end;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
p code.length
code = code.split.join
code = 'eval(%w(' + code + ')*"")'
code = ascii.gsub("#") { code.slice!(0,1)}
puts code
```

流れとしてはcodeを空白なしの一行にしevalを連結してアスキーアートの#をcodeで置き換えています。
注意する点はアスキーアートと実行したいコードの長さが一緒じゃなければいけないので上のコードでは
;でパディングしてます。

最後にpaizaのlinkをおいておきます。
[FizzBuzz](https://paiza.io/projects/uP0PzM1qfIXVgxt8R4fIZQ "Paiza")
ノートパソコンのデータを Ubuntu で起動して救出してみた

# 作業の対象機種

- DELL Inspiron 1525（Windows Vista）

小生のノートPCでなく身内のものです。
リカバリディスクもないので、パスワード不明でログイン不能のまま何年も放置されていました。
電源を入れると Vista のログイン画面にはたどり着くので、ハードウェアは再利用可能のはずです。
Vista は再利用の予定はないので、MS Office のドキュメントなどを救出後は Linux 機に転用しようと思います。

再利用の前に、今のノートPCの保存データをダメ元で救出を試みることにします。
無論、HDD が暗号化されている場合はデータの救出は不可能なので、そのままフォーマットして OS をクリーンインストールすることになります。
今回の対象機は暗号化はされていないようなので、DVD ドライブから起動できれば、HDD の内容を USB メモリに退避できます。

# 作業手順

▼参考にさせていただきました
[起動できなくなったWindowsのデータをUbuntuで取り出す](https://www.pc-koubou.jp/magazine/8146)


## 準備：Linux (Ubuntu) の入った DVD-RW を用意する

起動可能な Linux 入り DVD-RW を作成します。今回は Linux ディストリビューションとして Ubuntu を利用することとします。
参考サイトのリンク先には Ubuntu 18.04、Ubuntu 20.04 が掲載されていますが、64bit版だと、今回のノート機が起動しないです。
そこで、Ubuntu 16.04.5 の32bit版を使用します。

作業のため、ログインできなくなったノートPCとは別に、インターネット接続と DVD-RW の書き込みが可能なPCを用意します。
[Ubuntu の公式サイト](http://old-releases.ubuntu.com/releases/16.04.5/) からダウンロードした ubuntu-16.04.5-desktop-i386.iso を新品の DVD-RW に書き込みます。
エクスプローラから .isoファイルを右クリック→ディスク イメージの書き込み で、Windowsディスク イメージ書き込みツールが起動します。

![dvd-rw-writing_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/1b3c10e5-c868-bffa-f7aa-946a34dd4196.png)


動作は確認していませんが、更に古いものが必要な場合は、[Ubuntu の公式サイト](https://www.ubuntulinux.jp/News/ubuntu1404-ja-remix) から、Ubuntu 14.04 の i386版 iso ファイル (ubuntu-ja-14.04-desktop-i386.iso) が利用可能です。


## ノートPCの起動優先順を変更

1. F2キーを押しながら、ノートPCの電源ON で、BIOSのメニューが起動します。
  機種によって、BIOSのメニューを出す方法とメニュー内容は異なります。
2. BIOS のメニューから「System」-「Boot Sequence」を選択し、起動の優先順を 内蔵HDD優先から DVD ドライブ優先に変更します。
3. DVD ドライブが空のまま、一旦再起動します。内蔵HDD の Windows Vista のログイン画面になります。
4. ここで DVD ドライブに Linux 入り DVD-RW を入れて更に再起動します。
   GUI画面の表示まで10分以上かかりました。

## データ救出

1. Ubuntu が起動出来たら、画面の左にある「Files」を起動します。
2. 「Files」のウィンドウ左下にある「OS」というのが、Windows入り内蔵HDDを指しているようです。
3. USB メモリを装着すると、認識されて、内容が表示されました。
4. ノートPCの HDD から USB メモリに必要なデータをコピーします。今回は、「C:\Users\アカウント名\」以下をドラッグ＆ドロップでコピー。
5. いくつかコピーに失敗するフォルダがありますが、すべてスキップ。
6. USB メモリを外します。
7. デスクトップ右上のメニューから「Shut Down...」を実行します。DVD-RW が排出されます。
8. .iso ファイルの書き込みに使用していた 作業用PC に USB メモリを装着し、データが救出できているか確認。

以上、作業完了です。
【Rails】フォーム内で、異なるモデルのデータを送信したい

1:1の関係のモデル同士を関連づけ、フォームにそれぞれのモデルデータを同時に送信できるようにしたい。
つまり、formメソッド内で、2つのデータモデルを扱えるようにするのが今回の目的になります。

今回は、UserモデルとUser_profileモデルを1:1の関係性にして、formメソッド内でどちらのユーザー情報も同時に編集できるようにします。

#M

```ruby:マイグレーションファイル
class CreateUserProfiles < ActiveRecord::Migration[6.0]
  def change
    create_table :user_profile do |t|
      t.string :twitter_url
      t.string :program_lang
      t.string :image
      t.references :user, foreign_key: true
      t.timestamps
    end
  end
end
```

`t.references :user, foreign_key: true`
外部キーを設定することで、UserモデルとUser_profileモデルを紐付けます。

```shell

$ rails db:migrate
```

```models/user_profile.rb
class Prof < ApplicationRecord
  belongs_to :user
end
```

```models/user.rb
class User < ApplicationRecord
  has_one :user_profile
  accepts_nested_attributes_for :user_profile
end
```

`accepts_nested_attributes_for :user_profile`は、ネストされるフォームデータに備えてのものになります。
具体的には、ストロングパラメータ時に`{ user: { user_profile_attributes: { program_lang: 〇〇, twitter_url: 〇〇, image: 〇〇 } } }`という形でまとめることができます。

#C

```users_controller.rb
def create
  @user = User.new(user_params)
  @user.build_user_profile
  if @user.save
  ・・・
  end
end

private

def user_params
  params.require(:user).permit(:name, :email, :password, user_profile_attributes: [:id, :program_lang, :twitter_url, :image])
end
```

ここで、注目すべきなのが`@user.build_user_profile`。
あらかじめuser_profileモデルのインスタンスの作成をしていないと、View側のフォームが表示されません。


#V

```ruby:edit.html.erb
.container
  = form_with model: @user, local: true do |form|
    = form.fields_for :user_profile do |prof|
      .form-image
        = prof.file_field :image

    .form-group
      = form.text_field :name
      = form.text_field :email

    = form.fields_for :user_profile do |prof|
      .form-group
        = prof.text_field :program_lang
        = prof.text_field :twitter_url

    .row
      = form.submit "編集"
```

フォームの中にさらに別のモデルデータを認識してくれるのが、`fields_for`。
フォームの中にフォームを作ることで、`編集ボタン`を押すだけでまとめてサーバー側にデータを送信してくれます。
Prism コードサンプル学習：01-BootstrapperShell

# Prism コードサンプル学習：01-BootstrapperShell

## Prismとは

以下を参照ください。
<https://www.fenet.jp/dotnet/column/tool/1715/>

上記の中で、以下が主な特徴と捉えればよさそうです。

- ViewModel実装の補佐
- DI コンテナ（依存性の注入）
- InteractionRequest
- EventAggregator

## はじめに

本記事は、以下のコードを参考に作成した記事になります。
Prismを使ってどう作るのか、だけでなくてライブラリの作りがどのようになっているかも併せて理解したいと思っています。
なお、サンプルはレガシーのコードが残っているようで、一部のクラスはObsolute属性が付与されていますのでお気を付けください。

- <https://github.com/PrismLibrary/Prism>
- <https://github.com/PrismLibrary/Prism-Samples-Wpf>

## 01-BootstrapperShell

本サンプルではBootstrapperと呼ばれるクラスを用いてアプリケーションを立ち上げるようです。

```csharp
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var bootstrapper = new Bootstrapper();
            bootstrapper.Run();
        }
    }

    class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void InitializeShell()
        {
            Application.Current.MainWindow.Show();
        }
    }
```

ポイントとしては以下でしょうか。

- BootstrapperではPrismライブラリアセットを登録している
- プロパティとしてIUnityContainer型のContainerをメンバとして所持しており、これがDIコンテナとしての役割をはたしている
- 何が注入されているかは[ここ](https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Unity.Wpf/Legacy/UnityBootstrapper.cs#L107)を見ると分かりやすい（デフォルトのコンフィグレーションを利用した場合）
- CreateShell()ではそのアプリケーションのシェルかメインウインドウを登録し、Rum()メソッドの中でInitializeShell()が呼び出される

Prismのお約束として、Bootstrapに立ち上げ時に必要なことを書くのが重要そうです。
ひとつひとつのモジュールについては、以降のサンプルで学ぶことになりそうなのでここまでとします。

## おわりに

今回は起動時にPrismライブラリアセットを登録しているBootstrapperクラスを読みました。
次回、02-Regionsについて見ていこうと思います。
長穴減速を解く



![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) ある界隈ではメジャーな技術だけど、解説書が少ない。

## やること
サーボモーターのパワーを外部的に減速しトルクを稼ぐという長穴減速という技があります。
今回はその減速比を解きます。
ちなみに「減速」というのは例えばモーターの回転数に対して間にギアなどを挟み最終的な回転数を下げてそのかわりトルク（力、ねじり強さ）を上げていくような仕組みのことです。

## そもそも長穴減速とはどんな機構か

![SS 895b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/1b397ad5-f3d1-2ea2-9634-953515d8b921.png)

図のように、モーターの軸に固定され末端にスライダピンがついたリンクAと、そのピンを受け末端がフリーの回転軸に留められたリンクBがあるとします。
リンクAのスライダピンは円を描く回転運動になり、リンクBはスライダを上下するピンに従って左右に揺動します。
このとき、モーターの回転量とフリー回転軸の回転量には差が生じるため、これを減速機として利用することができるというわけです。
つい長穴減速という名前で読んでしまいますが、<b>「揺動スライダクランク機構(oscillating slider crank mechanism)」</b>というのが正式名称のようです。


## 上記の長穴減速を図示する

![SS 901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/e5dd6dbb-2565-ed09-5bf9-1043c34322da.png)

図のようにリンクAの長さをa、モーター軸からフリー軸までの長さをb。また、リンクAの角度をθ1、リンクB(図ではcの線)の角度をθ2としてみます。

θ2の角度を任意の角度にしたい場合にθ1を何度動かすべきかというのが、ロボットを動かす上で知りたい情報となります。


## 迷わずこれを使うべき。減速比が常に1/2となるa=b型。

![SS 897.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/66067237-a9d4-6f13-3b9d-a5d31f691bfd.png)

aの長さとbの長さが同じ場合にかぎり、特殊な挙動になります。
辺a,辺bからなる三角形は二等辺三角形となり、また外角の定理より、
常にθ1 = 2*θ2の関係が成り立つようになります。
つまり減速比も角度に限らず常に1/2となります。
特別な事情がない限り、この減速比で設計してしまうのが一番よいでしょう。


## やむを得ず他の減速比で使う場合

正弦定理で解いていきます。
正弦定理とは、
三角形ABCの外接円の半径をRとしたとき、

```math
\frac{a}{\sin A}=\frac{b}{\sin B}=\frac{c}{\sin C}=2R\\
```
が成り立つという公式です。

これを今回の機構にあてはめると、

![SS 901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/e5dd6dbb-2565-ed09-5bf9-1043c34322da.png)

```math
正弦定理より
　\\
\frac{a}{\sin\theta_2}=\frac{b}{\sin\theta_3}\\
　\\
\sin\theta_3=\frac{b\sin\theta_2}{a}\\
　\\
\theta_3=\arcsin(\frac{b\sin\theta_2}{a})\\
　\\
外角の定理より　\\
　\\
\theta_1=\theta_2+\theta_3\\
　\\
よって\\
　\\
\theta_1=\theta_2+\arcsin(\frac{b\sin\theta_2}{a})\\
```

となり、θ2の角度とa,bの長さからθ1が求まります。

## 逆にサーボ角度からリンク角度を求める場合

θ1を決めてからそれに応じたθ2を求める場合には、タンジェントを使います。
（他の方法の方がよいかも？）

![SS 902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/08281298-7795-82e4-d6f4-a38d69baa181.png)


```math

\tan\theta_2=(\frac{a \sin\theta_1}{a \cos\theta_1+b})\\
　\\
\theta_2=\arctan(\frac{a \sin\theta_1}{a \cos\theta_1+b})\\
```

となります。たぶん。

## 謝辞
関先生、正弦定理を使った解法を教えていただきありがとうございました。

## 次回
これをProcessing3上でシミュレーションできるプログラムを備忘のために記事にしておこうと思います。
[次回記事：長穴減速をProcessingでシミュレート](https://qiita.com/Ninagawa_Izumi/items/6992e184f6772dbe48ad)

へんなところがあったらご指摘ください。
SeqIO.writeでのRuntimeError: generator didn't stop after throw()

```python

from Bio import SeqIO
from Bio.SeqRecord import SeqRecord

temp_rec = SeqRecord( "ATTGTG", id="label", description="" )
SeqIO.write( temp_rec, "output.fasta", "fasta" )
```

という感じに書くと
`*** RuntimeError: generator didn't stop after throw()
`となる。

これはSeq()を忘れているのが原因。

```python

from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord

temp_rec = SeqRecord( Seq( "ATTGTG" ), id="label", description="" )
SeqIO.write( temp_rec, "output.fasta", "fasta" )
```

とすればよい。
入門 Kubernetes

オライリーの「入門 Kubernetes」を読んだのでメモ

# 概要
Kubernetesの開発者が自ら、Kubernetesがどのような思想で作られていて、どのように活用するといいのかについて解説しているので、Kubernetesへの理解が深まる

Kubernetesは何を実現するために作られているのか解説されている第1章はとても面白く読めた

# 以下気になったところをつらつらと
- マイクロサービス、ひいてはkubernetesは、サービスだけでなくチームをスケールさせるもの
- MySQLとWordpressを1つのPodにデプロイする**のでは無い**

# 併せて読みたい
翻訳者の用意されたスライドで、（翻訳者曰く）原著に不足している図が補完されるとのことで、本書を読むときに理解の助けになると思う
https://speakerdeck.com/doublemarket/20180609-gcpug-hiroshima-number-4
[機械学習] irisデータセットをSVMで分類しleave-one-out交差検証で分類精度を算出する

#はじめに
大学院の研究でSVM(support vector machine)という教師ありデータ群に対して機械学習で分類を行う手法を扱おうと思っており，折角なので記事にしていきます．また今回はサンプル数がそこまで多くない機械学習を想定しているためleave-one-out交差検証という手法で訓練データとテストデータを分割しようと思います．

#実装環境
・Google Colaboratory

#データセット
使用したのは機械学習入門でよくみるirisデータセットです．サンプル数が150で4つの特徴量（sepal length, sepal width, petal length, petal width）をもち，それぞれに花の種類（setosa, versicolor, virginica）のラベルが付与されているものになります．

#コード
```python

from sklearn import svm
from sklearn.model_selection import LeaveOneOut
import numpy as np
from sklearn.datasets import load_iris

iris = load_iris()  # irisデータセットを読み込む

attribute=[]  # 初期化
label=[]  # 初期化

for x, y in zip(iris.data[], iris.target[]):
  data.append(x)
  target.append(y)

data = np.array(data)  # numpy行列に変換
target = np.array(target)  # numpy行列に変換

loo = LeaveOneOut()  # LOOCVのインスタンス生成
clf = svm.SVC(gamma="scale")  # SVMのインスタンス生成

entire_count = loo.get_n_splits(data)  # テスト回数取得
correct_answer_count=0  # 推定が正解だった数初期化

for train_index, test_index in loo.split(data):  # loo.split(data)で訓練データとテストデータを分割
    data_train, data_test = data[train_index], data[test_index]
    target_train, target_test = target[train_index], target[test_index]
    clf.fit(data_train, target_train)  # 学習させる
    result = clf.predict(data_test)  # テストデータからラベルを予測する
    if result == target_test:  # ラベルと元々のラベルが一致していれば+1
        correct_answer_count += 1

rate = (float(correct_answer_count) / float(entire_count))  # 正解率を計算
print(str(rate))  # 正解率を出力
```
```
出力
0.9666666666666667
```
#終わりに
コードについてはライブラリをそのまま使えば簡単に実装できますね．推定精度は96.7%となりました．leave-one-out交差検証のデータ全体から一つをテストデータとして，その他全てを学習に用いるという特性上，サンプル数によっては時間がかかってしまうという弱点があるみたいです．しかし，今回はサンプル数が150だけだったため気になりませんでした．