OmniAICreator/Qiita-1.07M huggingface dataset:
【技術書】独学プログラマー  第4部, 第5部

はじめに
--
どんなことが書かれているかをまとめただけで、内容は多くありません。
([第3部](https://qiita.com/giwasuke/items/e44d1f400bc205c90528)はこちら)


目次
--
1. 第21章 データ構造
2. 第22章 アルゴリズム
3. 第5部 ピックアップ

第２１章 データ構造
--

- データ構造とは、情報をとりまとめて格納するためのフォーマットのこと。これまでに学んできた組み込みのデータ構造（データ型）であるリスト、タプル、辞書などがそれに当たる。本章では、さらにスタックとキューを学ぶ。
- **スタック**はLIFO（ラストイン・ファーストアウト）
- **キュー**はFIFO（ファーストイン・ファーストアウト）
- それぞれの仕組みを理解するために、クラスを自ら定義して動作を見ているが、実際は提供されているデータ構型（リストなど）やクラスを使う。スタックとキューについては既知のため飛ばす。
- スタックとキューについて[この記事](https://qiita.com/saba/items/107c4237206e31acdbef)がよくまとめられているので引用とする。

第２２章 アルゴリズム
--

- アルゴリズムとは、特定の問題を解決するための、再現可能な一連の手順のこと。
- よく知っているアルゴリズムがPythonで書かれているだけなので省略。

第5部 ピックアップ
--

- 1つの関数には1つのことだけをさせよう。
- 強力なIDEを使おう。IDLEを使い続けることは推奨しない。著者はPyCharmを使う。開発に役立ち、重宝される機能がいくつもある。
- ブロガーのHenrik Warneより。「素晴らしいプログラマーと酷いプログラマーの違いの１つは、ロギングしているか、そして、プログラムの異常が起きたとき容易にデバッグするツールを持っているかだ」。
- ほかの人が利用するプログラムにはテストを書くべきだ。「テストされていないコードは、壊れているコードだ」と。確認するのは、「設計と開発の要求に一致することであり、全ての入力に正しく反応すること、関数が適切な時間内で動作すること、十分に使いやすいこと、想定した環境にインストーできて実行できること、そして関係者が望む結果が得られること」
- 多くのプログラミングの面接では、データ構造とアルゴリズムに焦点を当てている。この２つの分野に精通しておくとよい。より良いプログラマーになるのにも役立つ。
- プログラミングをしていくうえで、すべてを知っている必要はない。なぜなら、そんな人はいないから。謙虚な姿勢を保ち、分からないことはしつこく学ぼう。それを継続すれば、素晴らしいプログラマーになっていける。
- 必読とも言える本がいくつか紹介されている。
- 本質を探る努力をしよう。先に理論から、ではなく、まずプログラミングをして、本質が知りたいと強く思ってから探るとよい。調べたり、シンプルで簡単なものを自分で作ってみるとよい。作ったら、積極的に公開しよう。
- 最初は難しいのかもしれないが、ほかの人のコードを読むことに、できるだけ多くの時間を費やそう。これは、プログラマーとして上達するのに最適な方法だ。そしてたくさん学びを得よう。
- [「ハッカーになろう」](https://cruel.org/freeware/hacker.html)を読む。


感想
--
読み終えることができた。
Python文法の基礎が固まり、スクレイピングにワクワクしたり、バージョン管理など知っておくべきことを効率よく学べた。
Qiitaにまとめた記事を読んでたまに復習しようと思う。
(2)Android 網羅的単体テスト編 - 網羅率測定（備忘録）　

(1) Android 網羅的単体テスト編-> https://qiita.com/hal319/items/a8b1d52ac0cfb36f4cee
(2) 網羅率測定-> 現在ココ
(3) github・CircleCI統合（作成中）
(4) AppiumでUI部分実装（作成中）




code coverageはちとメンドウなようだ

# Code Coverage Tool準備
まず下記のどちらを選ぶかだ。2020年7月時点では

- Jacoco
- IntelliJ Code Coverage

どうもKotlinの場合はJacocoがハンドルできないという。とりあえず自動テストに特化したところの確認なので、一番簡単そうなJava　& Jacocoで進めてみる。build.gradleに以下のdebugセクションを加えてみる。

```
debug{
            testCoverageEnabled true
        }
```

![Screen Shot 2020-07-26 at 9.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/a04a1318-df67-69dc-7da7-2a0ae9190aad.png)

#一番簡単な網羅（命令網羅）

テストするソースは「Android 網羅的単体テスト編」と同様で。

```
package com.example.empty;
public class calc {
    public int plus(int a, int b) {
        int c = a + b;
        return c;
    }
    public int div(int a, int b){
        int c = a/b;
        return c;
    }
}
```

単体テストは

```
public class calcTest {
    private calc mcalc;

    @Test
    public void plus() {
        mcalc  = new calc();
        assertEquals(0, mcalc.plus(0,0),0 );  //Added test code

    }
}
```
単体テストを実行すると、なんとなくplus(int a, int b)だけテストされるのは想定できる。

```
$ ./gradlew createDebugCoverageReport
```
を実行すると。![Screen Shot 2020-07-26 at 9.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/a8bdeece-d52e-443b-d199-a356c5fb61b3.png)
ちょっと深いフォルダーの先に、網羅率のリポートが作成される。

![Screen Shot 2020-07-26 at 9.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/660ddb3e-e83b-7e68-7fb6-4afd0b952959.png)

plus(int, int)の部分は100%網羅されている。それでは分岐網羅がちゃんと動いているかみてみましょう。

# 分岐網羅
数年前までは分岐網羅はJacocoはサポートしてなかったような気がするので、分岐網羅が動いているか見てみる。開発者の方は命令網羅と分岐網羅の差はただたんに１０％程度網羅率が違うという評価を下す場合があるが（一般的なソフトウェアの場合分岐のほうが10%程度低くなる）、テスト屋さんにとっては命令網羅というのは品質保証上なんにも役ににたたない。なぜなら一番重要なテスト手法である、境界値テストがちゃんとされているか否かの判断基準は命令網羅ではもてないためである。

すこし乱暴だが、以下のようにテストされる関数を変更してみる。分母にゼロが来た場合にはそのままreturn 0で抜けてしまう。

```
public class calc {
    public int plus(int a, int b) {
        int c = a + b;
        return c;
    }
    public int div(int a, int b){
        if (b == 0){
            return 0;
        }
        else {
            int c = a / b;
            return c;
        }
    }
}
```

テストコードとしては、以下のようなものを追加してみる。2/1 =2 という正常処理ケース。

```
public class calcTest {
    private calc mcalc;

    @Test
    public void plus() {
        mcalc  = new calc();
        assertEquals(3, mcalc.plus(2,1),0 );  //Added plus test code
        assertEquals(2, mcalc.div(2,1),0 );  //Added div test code

    }
}
```



結果としては、以下のようになる。
![Screen Shot 2020-07-26 at 10.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/5be83a20-304b-cb0b-432e-99f1836fea11.png)

div関数の分岐が50%網羅されていることになる。ここでCxtyという数値がある、Cyclomatic Complexity(またはMcCabe数とも言う)。関数の複雑をだしてくれるのはすごいステキ。分岐網羅すべきテストケース数とCxtyというのは同じである。Cxtyが高ければ単体テストを作るコストの比例的にあがる。



# 参考にしたweb
https://thom.hateblo.jp/entry/2016/02/28/182648
http://replication.hatenablog.com/entry/2016/05/26/071409
https://wadada420.hatenablog.com/entry/2019/01/27/223100
https://qiita.com/keidroid/items/adc4f065b84d8a2cd17a
NestJS 環境毎の設定ファイルの読み込み

# NestJS 環境毎の設定ファイルの読込
新規プロジェクト作成は下記参照
　https://qiita.com/akasatana12345/items/81d6aade0fd43c045716

## モジュールのインストール
　`npm i --save @nestjs/config`

## package.jsonの編集
下記追記

```typescript:package.json
    "start:local": "NODE_ENV=local nest start --watch",
    "start:develop": "NODE_ENV=develop nest start --watch",
```

## 設定ファイルの作成
ルートディレクトリ直下に下記ファイルを新規作成する。
・env/local.env
・env/develop.env

## 設定ファイルに環境毎の定数を設定

```typescript:env/local.env
TEST_CONFIG="test local config"
```

```typescript:env/develop.env
TEST_CONFIG="test develop config"
```

## 実装
```typescript:src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true, // 全てのmoduleで使用できるように
      envFilePath: `env/${process.env.NODE_ENV}.env`, // NODE_ENVの値によって読み込むファイルを変更する。
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
```

```typescript:src/app.controller.ts
  @Get('config')
  getConfig() {
    return this.appService.getConfig();
  }
```

```typescript:src/app.service.ts
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class AppService {
  // コンストラクタ追加
  constructor(private configService: ConfigService) {}

  getHello(): string {
    return 'Hello World!';
  }

  // サービスの関数追加
  getConfig(): string {
    return this.configService.get<string>('TEST_CONFIG');
  }
}
```

## 確認
ローカル環境で実行

　`npm run start:local`

![スクリーンショット 2020-07-26 10.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296391/23f407ec-7014-90ba-231a-7339210b7eaa.png)

開発環境で実行

　`npm run start:develop`

![スクリーンショット 2020-07-26 10.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296391/bad2a0a1-34bc-89df-5a5c-5175d0f558ea.png)

## まとめ
環境毎に設定ファイル読み込みを分けてみた。
実際はpackage.jsonにNODE_ENVを設定するのではなく、環境変数で設定する。

上記プロジェクトのソース
　https://github.com/kyosuke12345/nest-config-test

下記記事をみたところ、推奨がされていないっぽいけど、とりあえずこれでよいか。
　https://qiita.com/luigiii/items/af083bafc01e6be5930d
なんか他に方法がある場合はどなたか教えてください！
Julia言語のよく使う基礎的な関数一覧

#はじめに
自分にとっての、雑な忘備録です。
細かい使用例やオプションは[Juliaでの調べ方いろいろ(Qiita)](https://qiita.com/I_ppp/items/9b660fe123bd5c5af174)を参考に確認しましょう。
(Jupyterでは関数名の後で[Shift]+[tab]のDoc表示がお手軽です)

---
###数値演算系
どの言語でもありがちなやつ、説明なしで列挙
　`sum`,`round`,`ceil`,`floor`,`round`,`sin`,`cos`,`tan`,`sinh`,`cosh`,`exp`,`max`,`min`

#####その他数値演算系
|関数名|説明|
|---|---|
|`maximam(a)`|配列`a`の最大値を返す|
|`minumun(a)`|配列`a`の最小値を返す|

###配列関連
|関数名|説明|
|---|---|
|`zeros((T,)m;...)`|全て(型`T`)`0`の配列`[m;...]`を返す|
|`ones((T,)m;...)`|全て(型`T`)1の配列`[m;...]`を返す|
|`rand((T,)m;...)`|型`T`(配列等可)の乱数で埋められた配列`[m,...]`を返す|
|`fill(x;m;...)`|変数`x`で埋められた配列`[m;...]`を返す|
|`similar(a)`|配列`a`と同じ型の配列(初期化なし)を返す|
|`copy(a)`|配列`a`のシャローコピーを返す|
|`deepcopy(a)`|配列`a`のディープコピーを返す|
|`reshape(a,m;...)`|配列`a`のサイズを`[m;...]`に変更したものを返す|
|`Array{T}(undef,m;...)`|型`T`の配列`[m;...]`(初期化なし)を返す|


古いversion(0.6とか)から挙動が変わってきた

###行列関連
|関数名|説明|
|---|---|
|`Vector{T}(undef,m)`|型`T`の配列(1次元)`[m]`(初期化なし)を返す|
|`Matrix{T}(undef,m,n)`|型`T`の配列(2次元)`[m,n]`(初期化なし)を返す|
|`transpose(a)`|配列`a`の転置を返す|
|`adjoint(a)`|配列`a`のエルミート共役を返す(`a'`の方が楽)|
|`inv(a)`|配列`a`の逆行列を返す|
配列と表を分けたけど、使う上で区別はないです。


###型関連
|関数名|説明|
|---|---|
|`typeof(x)`|変数`x`の型を返す|
|`length(a)`|配列`a`の要素数を返す|
|`size(a)`|配列`a`のサイズを返す|
|`dims(a)`|配列`a`の次元数を返す|
|`convert(T,x)`|数値`x`を型`T`に変換|
|`parse(T,s)`|テキスト`s`を数値型`T`に変換|
|`"$(x)"`|変数`x`をテキストに変換（関数とは違うけど）|

###ファイル操作
|関数名|説明|
|---|----------------|
|`cd(p)`|ディレクトリ`p`に移動|
|`pwd()`|親ディレクトリを返す|
|`readdir(p;join=true)`|ディレクトリ`p`内のファイル・フォルダ名一覧を返す|
|`joinpath(p1,p2,...)`|パスの結合|
|`isfile(p)`|`p`がファイルであるかの判定|
|`isdir(p)`|`p`がフォルダであるかの判定|
|`cp(src,dst;force=true)`|`src`を`dst`にコピー(強制)|
|`mv(src,dst;force=true)`|`src`を`dst`に移動(強制)|
|`rm(p;force=true,recursive=true)`|ファイル`p{の削除(強制)(再帰的)|
|`touch(p)`|ファイル`p`が存在しなければ作成|
|`mkdir(p)`|フォルダ`p`の作成|
|`mkpath(p)`|パス`p`までのフォルダの作成|
unix系のコマンドそのままが多数


###入出力(IOストリーム)関連

|関数名|説明|
|---|---|
|`print((io,)s)`|(ストリーム`io`に)テキスト`s`の出力|
|`println((io,)s)`|(ストリーム`io`に)テキスト`s`の出力し改行|
|`open(p;"r" or "a" or "w" or...)`|ファイル`p`のIOストリームを(各読取りモードで)返す|
|`write(io,s)`|パス・ストリーム`io`にテキスト`s`を書き込み、そのバイト数を返す|
|`readline(;io)`|(パス・ストリーム`io`を)1行読み込む・標準入力では入力待ち|
|`readlines(io)`|パス・ストリーム`io`の各行を配列で返す|
|`close(io)`|ストリーム`io`を閉じる|

`open`は下の様に`do ～ end`すると、最後`close`される。

```julia
open(p) do io
  処理(io,...)
end
```


###文字列操作
|関数名|説明|
|---|---|
|`join(s1,s2,...)`|テキストの結合|
|`split(s,dlm)`|テキスト`s`を`dlm`で配列に分割(`dlm=""`で1字づつ)|
|`uppsercase(s)`|テキスト`s`を大文字に|
|`lowercase(s)`|テキスト`s`を小文字に|
|`contains(s,r)`|テキスト`s`に`r`(正規表現可)が含まれるか判定|
|`occursin(r,s)`|テキスト`s`に`r`(正規表現可)が含まれるか判定|
|`findfirst(r,s)`|テキスト`s`の`r`(正規表現可)が含まれる最初の箇所を返す|
|`findlast(r,s)`|テキスト`s`の`r`(正規表現可)が含まれる最後の箇所を返す|
|`findall(r,s)`|テキスト`s`の`r`(正規表現可)が含まれる全ての箇所を返す|
|`replace(s,A=>B,...;count=n)`|テキスト`s`内の`A`を`B`に(`n`回まで)変える|
テキスト操作に限らない関数多数

---
ひとまずこんな所
`julia 1.4.2`で確認
HTML5のフォームバリデーションをSPAの中で使う方法

最近、素のHTMLやCSSをなるべく活用することに興味があります。
こういったベースの技術の方がフレームワークよりも息が長いので、一度学んだことを長期間役に立てることができるためです。

※もちろんフレームワークも使うときは使います。例えばNuxt.jsは大好きです。

今回は、HTML5のフォームバリデーション機能を、Nuxt.jsで構築したSPAの中で使ってみたいと思います。

#課題
HTML5のフォームバリデーションは、通常はformのsubmitを実行したタイミングで実施されます。
でも、SPAではformをsubmitしません。
どうしましょう...

#解決策
form.reportValidity() を使います。
これは、submitせずにバリデーションだけをかけるためのメソッドです。

※2020年7月時点のMDNによれば、**IE以外の**全ての主要ブラウザでサポートされているようです。安心して使えますね。
　https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reportValidity

#コード例
```vue:VInputItem.vue
<template>
  <form>
    <label>
      数量
    </label>
    <input
      type="number"
      v-model="quantity"
      min="0"
      max="999"
      @chenge="onChengeInput"
    />
  </form>
</template>

<script>
export default {
  data() {
    return {
      unitprice: 0,
      quantity:  0,
    }
  },
  methods: {
    onChangeInput(event){  
      this.$el.reportValidity()
    },
  },
}
</script>
```


#ポイント
この例では、直近のform要素を取得するために`$el`を使っています。
`$el`はVue.jsでルート要素を取得するためのプロパティです。
このサンプルコンポーネントでは、template直下のルート要素がformなので、それを一発で取得できています。

※コンポーネント内の要素の構造によっては、`$refs`を用いて参照する方法もあると思います。
国際会計基準

応用情報技術者令和元年秋期 午前問76

国際的な標準として取り決められた会計基準であり，資本市場の国際化に対し，利害関係者からみた会計情報の比較可能性や均質性を担保するものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a38d1da7-8d37-67f1-5206-6d74115bdc35.png)


AP試験では、概念出題が多いですね。。。。

**IFRS**(International Financial Reporting Standards，国際財務会計報告基準)は、独立民間非営利の基準設定機関であるIASBが世界共通で利用できる会計基準を目指して設定している基準であり


**GAAP**
Generally Accepted Accounting Principlesの略。企業の財務会計の作成と報告を行うルールである企業会計原則のことです。


**IASB**
International Accounting Standards Boardの略。IFRSを設定している独立民間非営利の基準設定機関である国際会計基準審議会です。


**SEC**
Securities and Exchange Commissionの略。米国証券取引委員会のことです


参考
https://www.ap-siken.com/kakomon/24_aki/q76.html
【TypeScript/JavaScript】一定条件になるまでループする

## for (;;) + break 版

```typescript
let num = 0

for (;;) { 
  num += 1
  const ok = num >= 10
  if (ok) break
}

console.log(num) // => 10
```

## do ... while 版

```typescript
let num = 0
let ok = true

do {
  num += 1
  ok = num < 10
} while (ok)

console.log(num) // => 10
```

or

```typescript
let num = 0
let ok = false

do {
  num += 1
  ok = num >= 10
} while (!ok)

console.log(num) // => 10
```

## 参考

[ループと反復処理](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loops_and_iteration#do...while_statement)

## 備考

`while (true) + break` は、以下の eslint のルールに抵触するため断念。
https://eslint.org/docs/rules/no-constant-condition
Rust: MongoDB のデータを削除 (Delete)

```text:Cargo.toml
[package]
name = "mongodb_delete"
version = "0.1.0"
edition = "2018"


[dependencies]
mongodb = "1.0.0"
tokio = "*"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	mongodb_delete/src/main.rs

					Jul/26/2020
*/
// --------------------------------------------------------------------
use std::env;
use mongodb::{
	bson::doc,
	error::Result,
	Client
};

#[tokio::main]
async fn main() -> Result<()> {
	eprintln! ("*** 開始 ***");
	let args: Vec<_> = env::args().collect();
	let key_in = &args[1];

	eprintln!("{}",key_in);

	let client =
		Client::with_uri_str("mongodb://localhost:27017").await?;

	let coll = client
		.database("city")
		.collection("saitama");

	let delete_result = coll.delete_many(
		doc! {"key": key_in}, None,
		).await?;

	println!("Deleted {} documents", delete_result.deleted_count);

	eprintln! ("*** 終了 ***");

	Ok(())
}
 
// --------------------------------------------------------------------
```

実行

```text
$ cargo run t1162
    Finished dev [unoptimized + debuginfo] target(s) in 0.29s
     Running `target/debug/mongodb_delete t1162`
*** 開始 ***
t1162
Deleted 1 documents
*** 終了 ***
```

参考ページ
[Quick Start: Up and Running with Rust and MongoDB](https://developer.mongodb.com/quickstart/rust-crud-tutorial)
Githubでフォークしたリポジトリを自動でupstreamに追従してくれる wei/pull の導入

### 解決したい課題

Githubでフォークしたリポジトリのコピーは、upstreamに追従しないとどんどん遅れていきます。
自作のツールや、自分がコミッターになっているOSSプロジェクトを除いて、年に1回プルリクエストを送る程度のリポジトリは放置している間にかなり古くなってしまったり。そんなことはありませんか？

### Pullを導入してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/2edd7813-1c85-3feb-4ee0-99e9fd0d2780.png)

https://github.com/wei/pull

Pullはそんな悩みを解決してくれるかもしれないbotです。

導入は簡単でGithubにログインした状態で [ココ](https://github.com/apps/pull) のページのボタンを押してインストールするだけです。導入したら、数時間おきに、自動的にupstreamの変更をマージしてくれるようになります。すぐにマージされなくても1日ぐらい気長に待つと、upstreamに追従されているはずです。

### おわりに

まだ使い始めなので細かいことはわかりませんが、いまのところ調子よく動いてくれています。
Jacksonで良い感じに整形してシリアライズする

JavaでJSONにシリアライズしたいときはJSON-Bだと力不足なのでJacksonを使う事が多いのだけど、いつも書き方忘れるのでメモ。

# 整形せずにシリアライズする

データ交換用に整形せずにシリアライズするパターン。通常はこれ。

```java
var item = Map.of("parent", Map.of("child", List.of("a", "b", "c")));
var json = new ObjectMapper().writeValueAsString(item);
```

結果

```json
{"parent":{"child":["a","b","c"]}}
```

# 整形してフォーマットを綺麗にしたい場合 その1

画面出力や設定ファイル用にフォーマットを整えたい場合. INDENT_OUTPUTを使う

```java
var item = Map.of("parent", Map.of("child", List.of("a", "b", "c")));

var mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);

var json = mapper.writeValueAsString(item);
```

結果

```json
{
  "parent" : {
    "child" : [ "a", "b", "c" ]
  }
}
```

# 整形してフォーマットを綺麗にしたい場合 その2

さらに要素の配列を改行付きで表示したい場合。要素が長い時とか用。PrettyPrinterとSYSTEM_LINEFEED_INSTANCEを使う。

```java
var item = Map.of("parent", Map.of("child", List.of("a", "b", "c")));

var printer = new DefaultPrettyPrinter();
printer.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);

var json = new ObjectMapper().writer(printer).writeValueAsString(item);
```

結果

```json
{
  "parent" : {
    "child" : [
      "a",
      "b",
      "c"
    ]
  }
}
```
Rust: MongoDB のデータを更新 (Update)

```text:Cargo.toml
[package]
name = "mongodb_update"
version = "0.1.0"
edition = "2018"


[dependencies]
mongodb = "1.0.0"
tokio = "*"
chrono = "0.4"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	mongodb_update/src/main.rs

					Jul/26/2020
*/
// --------------------------------------------------------------------
use std::env;
use mongodb::{
	bson::doc,
	error::Result,
	Client
};
use chrono::{Local, Date};

#[tokio::main]
async fn main() -> Result<()> {
	eprintln! ("*** 開始 ***");
	let args: Vec<_> = env::args().collect();
	let key_in = &args[1];
	let population_in = &args[2];
	eprintln!("{}",key_in);
	eprintln!("{}",population_in);

	let client =
		Client::with_uri_str("mongodb://localhost:27017").await?;

	let coll = client
		.database("city")
		.collection("saitama");

	let pp_in : i32 = population_in.parse().unwrap();

	let date_mod: Date<Local> = Local::today();
	println!("{}", date_mod);

	let update_result = coll.update_one(
		doc! { "key": key_in },
		doc! {
		"$set": {"population": pp_in, "date_mod": date_mod.to_string()}
		},
		None,
		).await?;
	println!("Updated {} document", update_result.modified_count);

	eprintln! ("*** 終了 ***");

	Ok(())
}
 
// --------------------------------------------------------------------
```

実行

```text
$ cargo run t1163 8235100
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target/debug/mongodb_update t1163 8235100`
*** 開始 ***
t1163
8235100
2020-07-26+09:00
Updated 1 document
*** 終了 ***
```

参考ページ
[Quick Start: Up and Running with Rust and MongoDB](https://developer.mongodb.com/quickstart/rust-crud-tutorial)
ワークサンプリング法

応用情報技術者令和元年秋期 午前問75

ワークサンプリング法はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/70055f65-7d39-f799-4a9f-d0bff29c4e83.png)


**ワークサンプリング法**は、ある時点での観測対象が作業内容のどの状態にあったかという瞬間観測を何回か行い、観察記録の回数の割合から各作業時間がどのくらいであるかを統計学的に推定する方法です。

つまり、目的は推定、見積もりですね。難しいですね。私は、定義しらなく、名称だけから推測で、実績のサンプリングと思ってしまた。

**PTS法(規定時間標準法)**
作業動作を基本動作にまで分解して，基本動作の時間標準テーブルから，構成される基本動作の時間を**合計して作業時間**を求める

**実績資料法**
作業票や作業日報などから各作業の実績時間を集計し，作業ごとに**平均して標準時間**を求める

**ストップウォッチ法(時間観測法)**
実際の作業動作そのものをストップウォッチで数回反復測定して，**作業時間を調査**


参考　https://www.ap-siken.com/kakomon/01_aki/q75.html
ビッグデータ分析の手法の一つであるデシジョンツリー

応用情報技術者令和元年秋期 午前問74

ビッグデータ分析の手法の一つであるデシジョンツリーを活用してマーケテイング施策の判断に必要な事象を整理し，発生確率の精度を向上させた上で二つのマーケティング施策a，bの選択を行う。マーケティング施策を実行した場合の利益増加額(売上増加額－費用)の期待値が最大となる施策と，そのときの利益増加額の期待値の組合せはどれか。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/366f418c-61fb-9764-4223-6bc750e64dea.png)



１、デシジョンツリーの途中にある意思決定の分岐点("□"部分)で「追加費用を払うべきか否か」を決定してから、マーケティング施策を選ぶという2段階で計算します。
これは大事ですね。Leafから逆に計算をして、どのルートがいいかを徐々に決められるですね。

実は、ルートごとで計算して、増加額が最も大きいのルートも答えですね。


参考
https://www.ap-siken.com/kakomon/30_haru/q75.html
mysqlにretrosheetの情報を登録する環境を作った

## 前提

- macOS 10.14.6
- pipenv 2020.6.2
- mysql 14.14 Distrib 5.7.29

## Chadwickのインストール

[Chadwick: Software Tools for Game-Level Baseball Data — Chadwick 0.7.2 documentation](http://chadwick.sourceforge.net/doc/index.html)
[chadwickbureau/chadwick: Chadwick tools for manipulating baseball data](https://github.com/chadwickbureau/chadwick)

DiamondWare形式で記述されているファイルをパースするためのツール。
py-retrosheetが使用するのでインストールしておく。

githubページ上のreleaseから最新のzipファイルをダウンロードして展開。
ターミナル上で操作しコマンドをインストールする。

```bash
cd /path/to/chadwick_dir
./configure
make
make install
```

## py-retrosheetの環境構築

[wellsoliver/py-retrosheet: Python scripts for Retrosheet parsing](https://github.com/wellsoliver/py-retrosheet)

```bash
# py-retrosheetをローカルにクローン
git clone git@github.com:wellsoliver/py-retrosheet.git
cd py-retrosheet

# schemaをDBに適用する（予めretrosheetという名前でDBを作っておく）
cd sql
mysql -u root retrosheet -p < schema.sql

# config.iniファイルを作る
cd ../scripts
cp config.ini.dist config.ini
vim config.ini # [database]の項目を自身の環境に合わせて修正

# python2の実行環境と必要なライブラリのインストールを行う
cd ..
pipenv --python 2.7
pipenv install sqlalchemy mysqlclient
```

## retrosheetの情報を登録する

```bash
# 欲しい年の情報をmysqlに登録する
cd scripts
pipenv run python download.py -y 2019
pipenv run python parse.py -y 2019
```
Maven Publish PluginでAndroid Libraryのソースコードを公開する

# 概要
[Maven Publish Plugin](https://docs.gradle.org/current/userguide/publishing_maven.html) で Android Library のソースコードを添付する方法です。

# build.gradle.kts(差分のみ)
以下、既に Maven Publish Plugin を利用している場合向けの、差分のみを示したコードです。
※ 各値は自身の環境に合わせてください

```kotlin:build.gradle.kts
tasks {
    val androidSourcesJar by creating(Jar::class) {
        archiveClassifier.set("sources")
        from(android.sourceSets["main"].java.srcDirs)
    }
}

afterEvaluate {
    publishing {
        publications {
            create<MavenPublication>("maven") {
                artifact(tasks["androidSourcesJar"])
            }
        }
    }
}
```

# build.gradle.kts
build.gradle.kts の全体像のサンプルです。

```kotlin
plugins {
    id("com.android.library")
    kotlin("android")
    id("kotlin-android-extensions")
    kotlin("kapt")
    `maven-publish`
}

android {
    compileSdkVersion(29)

    defaultConfig {
        minSdkVersion(23)
        targetSdkVersion(29)
        versionCode = 1
        versionName = "1.0"
        consumerProguardFiles("consumer-rules.pro")
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }

    buildFeatures {
        dataBinding = true
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

tasks {
    val androidSourcesJar by creating(Jar::class) {
        archiveClassifier.set("sources")
        from(android.sourceSets["main"].java.srcDirs)
    }
}

dependencies {
    implementation(project(":kotlin"))
    implementation("androidx.constraintlayout:constraintlayout:1.1.3")
}

afterEvaluate {
    publishing {
        publications {
            create<MavenPublication>("maven") {
                from(components["release"])
                artifact(tasks["androidSourcesJar"])
                groupId = "com.example"
                artifactId = "lib-android"
                version = "0.0.1-SNAPSHOT"
            }
        }
    }
}
```

# 実行

## ◆ mavenLocalにpublishする
```
./gradlew publishMavenPublicationToMavenLocal
```

## ◆ 任意のフォルダにpublishする
```:任意のフォルダを指定する差分
afterEvaluate {
    publishing {
        repositories.maven {
            // $projectDir だとモジュールの build 直下。
            // $rootDir なら root モジュール直下
            url = uri("$projectDir/repo")
        }
    }
```

```
./gradlew publishMavenPublicationToMavenRepository
```
※ `./gradlew publish` を利用すると余計なファイル群が生成されてしまって原因調査にちょっとハマった、、、。
インターネット広告の効果指標として用いられるコンバージョン率の説明

応用情報技術者令和元年秋期 午前問73

インターネット広告の効果指標として用いられるコンバージョン率の説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/14013208-9c1e-472c-f01f-5d4e6b274713.png)



コンバージョン率は、広告を経由してサイトに訪れた者のうち、どの程度が成約（商品購入や申込み）に至ったかを示す指標です。インターネット広告の費用対効果を計るために使用します。例えば、広告が100人にクリックされて、その広告から来訪した利用者の商品購入が2回あればコンバージョン率は「2回÷100回＝2%」となります。

**コンバージョン（Conversion）**とは、変換、転換、交換といった意味を持つ英単語である。 マーケティングの分野においてはCVとも略され、ECサイト上で獲得できる最終的な成果のことを指す言葉である。

**CTR**(Click Through Rate，クリック率)：Webサイト上で広告が表示された回数に対して，その広告がクリックされた回数の割合

**CPA**(Cost Per Acquisition)：Webサイト上の広告から商品購入に至った顧客の1人当たりの広告コストを示す指標

**ROAS**(Return On Advertising Spend)：Webサイト上の広告に掛けた費用の何倍の収益をその広告から得ることができたかを示す指標

参考
https://www.ap-siken.com/kakomon/01_aki/q73.html
Vue(Nuxt.js)でスライドショーを自作する【ライブラリ使用無し】

下記の画像のようなスライドショーをVue(Nuxt.js)で自作する方法です。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/fe818b8b-12a1-9f39-9f8a-48f2f2d00ded.gif)

## Vue(Nuxt.js)でスライドショーを自作する

```vue:slide.vue
<template>
  <div class="slide">
    <div class="slide__wrapper">
      <div
        v-show="index === page"
        v-for="(image, index) in images"
        :key="index"
        class="item"
      >
        <img :src="image" class="item__image" />
        <span v-show="index === page" class="item__label">{{ index + 1 }}</span>
      </div>
      <div class="slide__right-btn" @click="nextPage"></div>
      <div class="slide__left-btn" @click="prevPage"></div>
    </div>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  data() {
    return {
      page: 0,
      images: [
        'https://via.placeholder.com/500x300/0000FF/808080',
        'https://via.placeholder.com/500x300/e6e6fa/808080',
        'https://via.placeholder.com/500x300/ffb6c1/808080',
        'https://via.placeholder.com/500x300/fff0f5/808080',
        'https://via.placeholder.com/500x300/00ffff/808080',
        'https://via.placeholder.com/500x300/ffd700/808080'
      ]
    }
  },
  methods: {
    nextPage() {
      if (this.page + 1 >= this.images.length) {
        this.page = 0
        return
      }
      this.page++
    },
    prevPage() {
      if (this.page <= 0) {
        return
      }
      this.page--
    }
  }
})
</script>

<style lang="scss" scoped>
.slide {
  padding-top: 200px;
  &__wrapper {
    position: relative;
    width: 500px;
    height: 300px;
    margin: 0 auto;
  }
  &__right-btn {
    position: absolute;
    right: 0;
    top: 0;
    width: 50%;
    height: 100%;
    z-index: 10;
  }
  &__left-btn {
    position: absolute;
    left: 0;
    top: 0;
    width: 50%;
    height: 100%;
    z-index: 10;
  }
}

.item {
  position: relative;
  &__label {
    position: absolute;
    top: 4px;
    left: 4px;
    background-color: #fff;
    width: 30px;
    height: 30px;
    line-height: 30px;
    border-radius: 50%;
    text-align: center;
    z-index: 999;
  }
}

</style>

```

## 解説

```
v-for="(image, index) in images"
```
dataのimagesをループして、スライドショーに使う画像を生成しています。

```html
 <div class="slide__right-btn" @click="nextPage"></div>
 <div class="slide__left-btn" @click="prevPage"></div>
```
2つのエリアをdivで作り、右側をクリックすると次へ、左側を押すと前へ戻る仕様にしています。

```
 v-show="index === page"
```
v-showを使って一致する画像のみを表示させることで、スライドショーのように画像を切り替えることができます。

```javascript
this.page++
this.page--
```
クリックイベント毎にpageの値を変化させます。

```javascript
if (this.page + 1 >= this.images.length) {
  this.page = 0
  return
}
```
最後の画像になったら最初の画像に戻しています。

```html
<span v-show="index === page" class="item__label">{{ index + 1 }}</span>
```
v-forでは配列のindexも取得できるので、画像のラベルに取得したindexを使用しています。

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/fe818b8b-12a1-9f39-9f8a-48f2f2d00ded.gif)
アカウントアグリゲーションの特徴

応用情報技術者令和元年秋期 午前問72

フィンテックのサービスの一つであるアカウントアグリゲーションの特徴はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/544b69c9-3003-ff00-9cbf-a0663d3d0a02.png)


**FinTech（フィンテック）**とは、
FinTech（フィンテック）とは金融（Finance）と技術（Technology）を組合せた造語で、ITを活用して金融、決済、財務サービスなどの世界にもたらされるイノベーションのことをいいます。特に、近年ではクラウドやスマートフォン（スマホ）といった最新のITを活用して、金融機関が従来提供してこなかったようなサービスをベンチャー企業が提供することが多くなってきました。
特に、米国を中心とするベンチャーキャピタル市場において、FinTech（フィンテック）関連のスタートアップ企業への投資が注目を集めています。

**アカウントアグリゲーション**(Account aggregation) は、複数の金融機関の口座取引情報を1つのコンピュータ上に一括表示できるサービスです。サービスを提供するWebサイトやスマホアプリなどに複数の口座情報等と認証情報(ID・パスワード等)を登録しておくことによって、普通口座、証券口座、クレジットカード、電子マネー、店舗ポイントなどの異なる場所に分かれている資産や取引状況を全部まとめて閲覧することが可能となります。アグリゲーション(aggregation)は、集約・集合という意味をもちます。

**資金移動サービス**
資金決済法の改正により、100万円以下であれば資金移動業者（登録業者）に限りコンビニや旅行代理店の窓口、インターネット、携帯電話などで、国内だけでなく海外へも振込や送金ができるようになりました。

**電手決済サービス**
電手決済サービスとは、三菱UFJ銀行が提供する電子記録債権を用いた決済サービス ※多分UFJ限らないですね。

**エスクローサービス**
エスクロー（escrow）とは、第三者寄託という意味です。
エスクローサービス(escrow service)とは、物品などを売買する際に取引の安全性を保証する仲介サービス。 売買の当事者以外の第三者が決済を仲介して、代金を一時的に預かる。 インターネットオークションなどで、出品者（売り手）と落札者（買い手）との間の代金支払いや商品受け渡しを仲介するサービスを指すことが多い。



From　https://www.ap-siken.com/kakomon/01_aki/q72.html
https://www.billingsystem.co.jp/service/fan_13.html
【Rails+EC2+puma】rails s -e productionは問題ないのに、rails s -dで起動するとエラーになる

## 環境
Rails: 6.0.2.2
ruby: 2.7.1
Puma: 4.3.5

EC2+Nginx+puma
pumaのソケット通信を利用


## 発生した問題
作成したアプリケーションをEC2へデプロイしました。
本番環境での起動も問題なかったのでデーモンで起動しようとしたのですが、pumaがうまく起動していないようで、ブラウザからアクセスすると「We're sorry, but something went wrong.」の文字が...

```bash
$ rails s -d -e production
=> Booting Puma
=> Rails 6.0.2.2 application starting in production
=> Run `rails server --help` for more startup options
```

うまく行っていれば下記のように表示されるはずです。

```bash
=> Booting Puma
=> Rails 6.0.2.2 application starting in production
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.3 (ruby 2.7.1-p83), codename: Mysterious Traveller
* Min threads: 0, max threads: 16
* Environment: production
* Daemonizing...
```

## 原因
「We're sorry, but something went wrong.」が表示されるのでRailsサーバーは起動しており、pumaに到達しているのでNginxの設定には問題なさそうでした。
そこでpumaにあたりをつけて調べてみると、pumaはローカルホストで起動していました。  

```bash
$ ps -alx | grep "puma"
puma 4.3.3 (tcp://0.0.0.0:3000)
```

なるほど、pumaの設定ファイルが悪いんだな、ということでconfig/puma.rbを書き換えてあーじゃない、こーじゃないとやっていたのですが、ここで気づきました。 
config/puma.rbと同じ階層にpumaフォルダがあるぞ...?

中を確認するとproduction.rbファイルが...
そう、本番環境用の設定ファイルを作成していたことをすっかり忘れていたのです。。。

## 解決方法
原因が分かってしまえば簡単な話です。
config/puma/production.rbを編集して解決しました。
ファイルの設定を載せておきます。

```bash:config/puma/production.rb
environment "production"

# UNIX Socketへのバインド
bind "unix://#{Rails.root}/tmp/sockets/puma.sock" # socketの設定
daemonize # デーモン化
```

一応Nginxの設定もpuma関連部分だけ載せておきます。

```bash:/etc/nginx/conf.d/app_name.conf
upstream app_server {
  server unix:/var/www/rails/app_name/tmp/sockets/puma.sock fail_timeout=0;
}
```

これでサーバーを起動したところ、問題なくデーモンで起動しました。
設定ファイルにdaemonizeを追加すると-dをつけなくても自動的にデーモンで起動するようです。便利ですね。

```bash
$ rails s -e production
=> Booting Puma
=> Rails 6.0.2.2 application starting in production
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.3 (ruby 2.7.1-p83), codename: Mysterious Traveller
* Min threads: 0, max threads: 16
* Environment: production
* Daemonizing...
```

「Daemonizing...」頂きました。
おつかれさまでした。

## あとがき
こんな初歩的なミスを記事にするかは迷ったのですが、似た記事が見当たらなかったので一応書いてみました。
本番環境でも問題なくrailsサーバーは起動するのに、デーモンでの起動だけうまくいかないと言うのも原因の特定を難しくしていたと思います。
そもそも「rails s -d -e production」のコマンドは正しかったのでしょうか...?
config/puma/production.rbには元々bindの設定は書いていたので上記コマンドでもうまく起動しそうなもんですが...

知識が足りないので完全な原因究明とはなっていないのが気になるところですが、それは追々と言うことで...
（勉強しないと。。。）

詳しい方いましたら、是非コメントをお願いいたしますm(_ _)m
Splunkのデータ取り込み設定ファイルについて

https://community.splunk.com/t5/Splunk-Search/Why-am-I-unable-to-filter-logs-using-props-conf-amp-transforms/m-p/510981/highlight/true#M143114

で回答したので、忘備録として。

ここらへんきちんと勉強するとなると、
https://www.splunk.com/ja_jp/training/certification-track/splunk-enterprise-certified-architect/overview.html
なのかな

#資料
- https://docs.splunk.com/Documentation/Splunk/latest/Admin/Configurationparametersandthedatapipeline

これ　だと記事にならないので、少し追記

- https://docs.splunk.com/Documentation/Splunk/latest/Indexer/Howindexingworks

にSplunkのデータ取り込みの流れが載っている。

![Datapipeline](https://docs.splunk.com/images/b/b7/Datapipeline_60.png)

Splunk Freeだと

![Indexer](https://docs.splunk.com/images/e/e0/Horizontal_scaling_new2_60.png)のIndexer(IX)とSearchHead(SH)が一緒なので、UniversalForwarder(UF)から直でいいけど、Splunk Cloudとか、仕事で使うとなるとIXとSHが別になってくる。

その時、どこに`.conf`ファイルを設定すればいいのかが[最初のリンク](https://docs.splunk.com/Documentation/Splunk/latest/Admin/Configurationparametersandthedatapipeline)

#SEDCMDとTRANSFOMS

https://community.splunk.com/t5/Getting-Data-In/Syslog-and-field-extraction-regex/m-p/513653#M87098

でやってみて、SEDCMDのほうがTRANSFORMSより早い

また`transforms.conf`のREGEXの後、FORMATでフィールドと値を指定してあげないと抽出ができなかった。

`props.conf`のEXTRACTだとそんなことないんだけど。今回は使えなかったので仕方なし。

#参考

- https://qiita.com/odorusatoshi/items/5a703b9befc253ab7deb
Splunk>Answersで取り込みに問題が合った時に外国の人だろうが提示している、すごい資料。ありがとうございます。

- https://www.macnica.net/splunk/faq/tech_faq.html/
nullqueueの設定の時はいつもお世話になるmacnicaさんの資料。ありがとうございます。


- https://conf.splunk.com/files/2017/slides/splunk-data-life-cycle-determining-when-and-where-to-roll-data.pdf

この.conf資料はindexerの設定について。

- https://www.aplura.com/assets/pdf/onboarding_cheatsheet.pdf

これもちょっと違うけど、sourcetypeとか取り込み時から変更したい時などの便利な設定内容

- https://www.aplura.com/assets/pdf/props_conf_order.pdf

これは、どこでなんの設定をするのかのチートシート

- https://www.aplura.com/assets/pdf/Splunk_Best_Practices.pdf

同じ会社のbest Practice
ということで
https://www.google.com/search?q=splunk+site%3Ahttps%3A%2F%2Fwww.aplura.com%2Fassets%2Fpdf%2F&oq=splunk+site%3Ahttps%3A%2F%2Fwww.aplura.com%2Fassets%2Fpdf%2F
はいろいろと見ていくと便利そう

:sweat:という理解なんですけど、間違っていましたらコメントお願いします。

#番外
https://docs.splunk.com/images/2/25/Splunk-8.0.0-Indexer_ja-JP.pdf
一応、日本語のマニュアル。

一通り載っているんだけど、
調べたい　→　google →　[splunk>docs](https://docs.splunk.com/Documentation) →　難しい英語はDeepL
の方が早いし、便利なんですよね。
RPA(Robotic Process Automation)の説明

応用情報技術者令和元年秋期 午前問71

RPA(Robotic Process Automation)の説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/210ad7aa-8699-6bd3-af8e-01213253f8a0.png)

**RPA**(Robotic Process Automation)は、これまで人間が行ってきた定型的なパソコン操作を、コンピュータ上で動作する**ソフトウェア**の力で自動化するものです。具体的には、ユーザ・インターフェース上の操作を認識する技術とワークフロー実行を組み合わせ、表計算ソフトやメールソフト、ERP（基幹業務システム）など複数のアプリケーションを使用する一連の業務プロセスをオートメーション化します。主に間接部門の業務を効率化するために使用されます。

つまり、RPAはソフトウェアロボットとは言えますね。ハードウェアと関係ないから、作業ロボット、PC作業、自動車自動運転、生活ロボットなどはRPAではありません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5c0cd814-7677-4fcf-8df1-3863ccf630d8.png)


From　https://www.ap-siken.com/kakomon/01_aki/q71.html
https://www.fe-siken.com/kakomon/01_aki/q62.html
https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%9C%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%BB%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
初心者のためのpandas基礎⑦index、columns操作

#pandasとは
Pythonにて、構造化データ（テーブル型のデータ）を扱うためのライブラリです。ファイルの読み込みやその後の加工・抽出処理などを簡単に行うことができ（SQL的な感覚で行うことができ）、機械学習などのデータの前処理で必須となるライブラリです。
他項目への目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/e1d7d0e939f58e7301ea)になります。

#はじめに
本記事では、index、columns操作です。
pandasでは、テーブル型（スプレッドシート型）のデータを扱うため、行と列という概念が必要となります。最初はあまり意識しなくても良いのですが、この理解がないと躓く場面があるので、簡単にまとめます。
行がindexで、列がcolumnsです。Excelというと｢縦の1,2,3,,,｣がindexで、｢横のA,B,C,,,｣がcolumnsです。
これらは値ではないことがポイントで、扱い方がことなります。columnsは感覚的に理解できますが、indexも値ではないということをしっかり意識しましょう。


#考え方
まずはライブラリをインポートします。pandasにpdという名前をつけてimportします。

```python:
import pandas as pd
```
サンプルはタイタニックのデータで試してみます。タイタニックがわからない人は｢kaggle タイタニック｣で調べて下さい。

```python:
dataframe = pd.read_csv('train.csv')
```
CSVデータを読み込んだ場合は、indexにはゼロからの連番、columnsにはcsvのヘッダ部分の項目名が設定されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/8449b774-f4c7-4e89-899f-cd411b87502e.png)

実際にコマンドで確認してみましょう。`.index` `.columns`で確認ができます。

```python:
dataframe.index
```

```python:OUT
RangeIndex(start=0, stop=891, step=1)
```


```python:
dataframe.columns
```

```python:Out
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
```

indexにもcolumnsにも`index object`が設定されます。`index`が最も一般的なobjectです。`RangeIndex`は連番型のobjectです。他にも`CategoricalIndex` `DatetimeIndex`があります。
#indexの付け替え
あまりやることはないですが、indexの付け替えが可能です。Name(名前)をindexとします。データフレームの中身を置き換える場合は、`inplace = True`とします。わからない人は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/c418e360ce9319f2af06)を参照。

```python:
dataframe.set_index(['Name'], inplace = True)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/1843e13c-4b9c-4780-567c-f2e2c42daf4a.png)

戻すことも可能です。↑を戻してみましょう。

```python:
dataframe.reset_index(inplace = True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/427a386f-db0a-b82c-74b5-5c456a7909ee.png)

#ラベル名変更
ラベル名を変更します。こちらはわかりにくい名前のラベルを変更したり、Joinの準備のためなどに使います。
Sexを｢性別｣、Ageを｢年齢｣に変更します。

```python:
dataframe.rename(columns = {'Sex':'性別','Age':'年齢'},inplace = True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/e45c09a5-e88e-7f63-2884-aeba7142035b.png)

他にも`.transpose`を用いたindexとclumnsの入れ替えやindexの多層化などが可能です。

以上です。

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
gitの基本コマンド

#gitの基本
gitは、作業ディレクトリ→ステージング→ローカルリポジトリ→リモートリポジトリの4つの領域に分けることができる。
この内、作業ディレクトリ、ステージング、ローカルリポジトリの3つはローカル環境（自分のパソコンの中）で管理されている。
![Untitled (Draft)-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680000/8fe3732c-4fb4-ea43-527f-e88e52c12e42.jpeg)

#主なgitコマンド

##git init
```terminal
git init
```
- リポジトリを新しく作成する。
- ファイルの中に.gitという隠しフォルダが作られる。

##git add
```terminal
git add
```
- 作業ディレクトリからステージングに移動させる。
- addの後ろにファイルを指定できる。
 - git add -A (gitで管理していないファイルも含めてすべてのファイルが対象になる。）
 - git add . （今いるディレクトリのすべてのファイルが対象になる。）
 - git add 【ファイル名】　（ファイル名に指定したファイルが対象になる。）

##git commit
```terminal
git commit　-m"【コメント】"
```
- ステージングからローカルリポジトリに移動させる。
- -mの後ろにコメントを付ける。

##git remote
```terminal
git remote add origin 【githubで作成したリポジトリのURL】
```
- ローカルリポジトリとリモートリポジトリを紐付ける。

#git push
```terminal
git push origin master
```
- ローカルリポジトリにあるファイルをリモートリポジトリに移動させる。
TLO(Technology Licensing Organization)の役割

応用情報技術者令和元年秋期 午前問70

TLO(Technology Licensing Organization)の役割として，適切なものはどれか。

ア、TLO自らが研究開発して取得した特許の，企業へのライセンス
イ、企業から大学への委託研究の問合せ及び申込みの受付
ウ、新規事業又は市場への参入のための，企業の合併又は買収の支援
エ、大学の研究成果の特許化及び企業への技術移転の促進


１、**TLO**とは、技術移転機関の略称です。
大学や高等専門学校等における研究成果を特許化し、それを民間事業者に技術移転する法人のことです。
大学等における技術に関する研究成果の民間事業者への移転の促進に関する法律(通称、TLO法)に基づいて、承認・運用が行われており、2019年現在34機関が承認されています。

TLOは、大学等と民間事業者の間に立ち、大学の研究成果を特許化し、それを民間企業にライセンスしてそのロイヤリティを大学等に還元します(下図参照)。TLOの役割は「大学の研究成果を特許化し、又は企業への技術移転を支援し、産学の仲介役を果たす」ことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/97c6463a-4d01-ede8-a209-bedc1d093cfb.png)

・ロイヤリティー（英: royalty）とは、
特定の権利を利用する利用者が、権利を持つ者に支払う対価のことで、主に特許権、商標権、著作権などの知的財産権の利用に対する対価をいう。 特に、著作権に対する対価は印税ともいう。

参照：
https://www.ap-siken.com/kakomon/01_aki/q70.html


ロイヤルティー
https://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%A4%E3%83%A4%E3%83%AB%E3%83%86%E3%82%A3%E3%83%BC#:~:text=%E3%83%AD%E3%82%A4%E3%83%A4%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BC%EF%BC%88%E8%8B%B1%3A%20royalty%EF%BC%89%E3%81%A8,%E5%AF%BE%E4%BE%A1%E3%81%AF%E5%8D%B0%E7%A8%8E%E3%81%A8%E3%82%82%E3%81%84%E3%81%86%E3%80%82
【Redmine】ユーザ一覧画面で姓・名の順にカラムを変更するカスタマイズ

## できること
Redmineの管理画面にて、 **名・姓** の順に表示されるテーブルカラムを **姓・名** の順に変更します。
管理者しか見ないですが、日本人の名前を日本語で登録していると地味に気になるところかなと…

## コード
```js
/*
ユーザ一覧画面で姓を名の前に表示するカスタマイズ
*/
$(function() {
  $('#content > div.autoscroll > table > thead > tr > th:nth-child(3)').insertBefore('#content > div.autoscroll > table > thead > tr > th:nth-child(2)');
  $('#content > div.autoscroll > table > tbody > tr').each((idx, element) => {
    $(element).children('.lastname').insertBefore($(element).children('.firstname'));
  })
});
```
【NumPy】 ravel は ほどく という意味。flatten との違いも紹介

numpy の ravel 、日本語だと "ラベル" って発音になっちゃって 
"label" と混同しちゃいがちですが、正しくは "ravel" です。

で、 <b>ravel の意味は "ほどく" とか "ほぐす"</b> といった意味があります。

行列をほぐして一列にするみたいなイメージでしょうか。おもしろいですね。

せっかくなので ravel の使用例を見てみましょう。
ついでに ravel と動作が似ている flatten も見てみましょう。

# ravel の使用例

```python
a = np.array(([1, 2], [3, 4]))
  # array([[1, 2],
  #        [3, 4]])

a.ravel()
  # array([1, 2, 3, 4])

a.flatten()
  # array([1, 2, 3, 4])
```

# ravel と flatten の違い

簡単に言うと、 ravel は参照渡しで flatten は値渡しです。
使う際は基本的に ravel でいいと思います。

詳しくは以下のサイトがよくまとまっていました。

[Differences between Flatten() and Ravel() | Numpy
](https://www.geeksforgeeks.org/differences-flatten-ravel-numpy/)

> a.ravel（）：
（i）元の配列の参照/ビューのみを返す
（ii）配列を変更すると、元の配列の値も変化することがわかります。 
（iii）Ravelはメモリを占有しないため、flatten（）より高速です。 
（iv）Ravelはライブラリレベルの関数です。 

> a.flatten（）：
（i）元の配列のコピーを返す
（ii）この配列の値を変更した場合、元の配列の値は影響を受けません。 
（iii）Flatten（）は、メモリを占有するため、ravel（）よりも比較的低速です。 
（iv）Flattenはndarrayオブジェクトのメソッドです。
対比学習関係メモ


# Momentum Contrast for Unsupervised Visual Representation Learning

Kaiming He Haoqi Fan Yuxin Wu Saining Xie Ross Girshick Facebook AI Research (FAIR)

- https://arxiv.org/abs/1911.05722
- 2019年
- dictionary look-up として対比学習を行う
- 移動平均エンコーダを利用


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/5fb9fef5-103c-220a-0c26-6359843cf454.png)


- 2つのエンコーダを使う。
- 左のエンコーダでクエリを、右のエンコーダで対比対象をエンコードする。右の方はミニバッチごとに古いものを押し出す形で入れ替えていく。こうすることで、バッチサイズと保持しておく対比対象の量を切り離す事ができる。

- 左のエンコーダは普通にロスでアップデートする(左)
- 右のエンコーダ(モーメンタムエンコーダ)は、左のエンコーダのパラメータの値を取り込む形で更新する。もとの値の割合を99.9%, 残りの0.1%を左のエンコーダの値ぐらいで混ぜる。つまり非常にゆっくりと左のエンコーダを追従していく。
- これは、右のエンコーダが急激に変化すると、ディクショナリの中のキーのコンシステンシが保てなくなるから。実際に実験して、そのことを示している。混ぜる割合もかなり保守的にしないと行けないらしい。





# Dimensionality Reduction by Learning an Invariant Mapping


Raia Hadsell, Sumit Chopra, Yann LeCun

http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf

CVPR2006

- 対比学習のベースとなった？論文 表現学習というよりは、次元削減の観点で書かれている。
- RrLIM (Dimmensionality Reduction by Learning and Invariant Mapping) を提案

- Data Augment で作ったものをsimilarとして、別のデータをdissimlarとする。similarを近づけるように、dissimilarを遠ざけるようにloss を与える。

- バネモデルで直感的な説明をしている。

- Siamese architectureにも言及している。何が違うんだろう。

http://yann.lecun.com/exdb/publis/pdf/chopra-05.pdf

を見てもほとんどおなじに見えるなあ。。

# Learning a Similarity Metric Discriminatively, with Application to Face Verification

http://yann.lecun.com/exdb/publis/pdf/chopra-05.pdf

- 2005年の論文
- saimese architecture 。同じ人の写真と別人の写真を使ってネットワークを訓練。2005年にベースになるCNNがあったのか。。
- ネットワークの名前はシャム双生児からきてるんだけど、コンプライアンス的にそろそろやばい感じがするなあ。

# Unsupervised Feature Learning via Non-Parametric Instance Discrimination

https://arxiv.org/pdf/1805.01978v1.pdf

MoCoの論文からメモリバンクのコンテクストでrefer されている。2018年の論文

- インスタンスレベルのクラス分類をNCEをつかって行う。インスタンスのrepresentation を長さ128のベクタにしてL2正規化、すべてのサンプルが均等に分散するように学習する。
- 個々のインスタンスの特徴量をメモリバンクに保持
- 下流タスクはKNNでやる。128のベクタ表現
- Data Augmentation は使っていない。すべてのインスタンスを等価に扱っている。みにくいアヒルの子定理からするとうまく行かないはずだが、それなりに上手く行っているようにみえるのはなぜか。いや、失敗例を見るとかなりおかしなことにもなっているようだ。CNNを使っているので、その時点である程度のバイアスは入っているとも言えるのか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/fc519a87-b499-2ea0-67b2-754630274ef8.png)


- NCEの解説 
 -  https://www.kdnuggets.com/2019/07/introduction-noise-contrastive-estimation.html

 - すごくわかりやすかった。もともとはWord2vec系の単語数が爆発的になるネットワークの最終段のsoftmaxが計算量的に無理なので、そこをサンプリングで置き換える技術らしい。やっていることは、ノイズ分布Qを仮定して、それで負例をサンプリングして対比ロスを計算すると。なるほど、こうつながるのか。。
売り手側でのマーケティング要素4Pと、買い手側での要素4C

応用情報技術者令和元年秋期 午前問68

売り手側でのマーケティング要素4Pは，買い手側での要素4Cに対応するという考え方がある。4Pの一つであるプロモーションに対応する4Cの構成要素はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4c811f2c-fae3-c05d-03be-b0131052f372.png)

売り手側でのマーケティング要素4Pとは、
　　**Product（製品、サービス、品質）**
　　**Price（価格、割引、コスパ）**
　　**Place（流通、立地、流通範囲、品揃え）**
　　**Promotion（販売促進、宣伝、広告）**
のことです。4Pとは逆に買い手側の視点である4Cとは、
　　**Customer value（顧客価値）**
　　**Customer cost（顧客コスト）**
　　**Convenience（利便性）**
　　**Communication（コミュニケーション・対話）**
の4つです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0aa306a3-6f80-1e21-c105-a68da6aaf4d7.png)


From:
https://www.ap-siken.com/kakomon/25_aki/q68.html
https://www.fe-siken.com/kakomon/28_aki/q68.html
Laravel 認証機能 (インストール編)

#認証機能の追加
Laravel6から仕様が変更され、追加手順が変わったようですね。
→ここではLaravel7で操作しています。

##手順概要
1. ライブラリ「laravel/ui」をインストール。
1. 認証機能に必要なファイルをダウンロード。

##手順詳細
1.ターミナル(コマンド)から、ライブラリ「laravel/ui」をインストール

```
composer require laravel/ui
```

2.ターミナル(コマンド)から、認証機能に必要なファイルをダウンロード

```
php artisan ui vue --auth
```

認証機能に必要な更新が行われます。
→ファイルの追加、編集。
![06edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646252/ddc59e8c-ccea-6b33-754d-6801ed9e0717.png)

3.更新に成功すると、右上に「LOGIN」「REGISTER」が追加されます。

[追加前]
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646252/e310ee3c-4b5a-111e-e9d3-252b9f63472c.png)

[追加後]
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646252/dbb251d1-bcae-ef22-8aa8-861bb2665048.png)
プロダクトポートフォリオマネジメント（PPM）における負け犬、問題児、花形、金のなる木の説明

応用情報技術者令和元年秋期 午前問67

プロダクトポートフォリオマネジメント（PPM）における“花形”を説明したものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b975ed24-adda-997f-ba42-700038d4614a.png)

**負け犬**(dog) … [成長率：低、占有率：低]
成長率・占有率がともに低く、新たな投資による利益の増加も見込めないため市場からの撤退を検討するべき分野

**問題児**(problem child) … [成長率：高、占有率：低]
成長率は高いが占有率は低いので、花形製品とするためには多額の投資が必要になる。投資が失敗し、そのまま成長率が下がれば負け犬になってしまうため、慎重な対応を必要とする分野

**花形**(star) … [成長率：高、占有率：高]
占有率・成長率ともに高く、資金の流入も大きいが、成長に伴い占有率の維持には多額の資金の投入を必要とする分野

**金のなる木**(cash cow) … [成長率：低、占有率：高]
市場の成長がないため追加の投資が必要ではなく、市場占有率の高さから安定した資金・利益の流入が見込める分野


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/aee528a0-3ba7-fb77-cef7-23ddba071b3c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f45c8c01-221d-5a8f-02c5-c6879e98f287.png)


From https://www.ap-siken.com/kakomon/21_aki/q69.html
https://xtech.nikkei.com/it/article/COLUMN/20120629/406348/
OpenTelemetryのバックエンドにElastic APMを利用する

# はじめに

以下の投稿でOpenTelemetry+Zipkinの組み合わせを試してみました。

- [JavaアプリケーションをOpenTelemetry（+Zipkin）で計測してみる](https://qiita.com/mkyz08/items/34d1861134fcdb3f8f7e)

今回はOpenTelemetryのバックエンドをElastic APMとした場合の設定方法を確認してみます。

前回のOpenTelemetry+Zipkinでは以下の構成でした。
Open Telemetry Agentに同梱されているZipkin Exporterを使用して、トレースデータをZipkin Serverへ送信しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/2ea41c4e-b27b-d7a7-1daa-a1dbf1c5f118.png)

OpenTelemetry+Elastic APMでは以下の構成になります。OpenTelemetry AgentにElastic Exporterがないので、一旦OpenTelemetry Collectorを経由してElastic APMへ送信しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c7271353-bc69-5b61-23de-42eb2235e07b.png)

今回の構成での設定は以下のElastic公式サイトを参考にしました。

- [OpenTelemetry integration](https://www.elastic.co/guide/en/apm/get-started/current/open-telemetry-elastic.html)

設定は以下の手順になります。

1. OpenTelemetry Collectorの構築
1. OpenTelemetry Agentの設定
1. APMサーバーの構築

このうち、APMサーバーの構築は以前に投稿した以下の環境を利用しています。

- [JavaアプリケーションをElastic APMで計測してみる](https://qiita.com/mkyz08/items/dfcb4785f9444b04a574)


# OpenTelemetry Collectorの構築

まず、OpenTelemetry Collectorを構築します。
以下のサイトを参考にして実施していきます。

- [OpenTelemetry Receiver](https://github.com/open-telemetry/opentelemetry-collector/blob/master/receiver/otlpreceiver/README.md)
- [Elastic Exporter](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/master/exporter/elasticexporter)

以下からモジュールをダウンロードします。
今回はJavaアプリケーションはローカルのWindowsから実行しているのでotelcol_windows_amd64.exeをダウンロードしました。

- [Release](https://github.com/open-telemetry/opentelemetry-collector/releases)

次にCollectorの設定ファイル（config.yaml）を作成します。今回は以下のように設定。

```yaml:config.yaml
exporters:
  elastic:
    apm_server_url: "http://[APMサーバのIPアドレス]:8200"
    secret_token: "ESS_TOKEN"
receivers:
  otlp:
    protocols:
        grpc:
  otlp/withendpoint:
    protocols:
        grpc:
            endpoint: 127.0.0.1:55680
processors:
  batch:
    timeout: 1s
    send_batch_size: 1024
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [elastic]
```

最後に作成した設定ファイルを指定してCollectorを起動します。

```
>otelcontribcol_windows_amd64.exe --config config.yaml
```


# OpenTelemetry Agentの設定

以下を参考にOpenTelemetry Agentを設定します。

- [OpenTelemetry Instrumentation for Java](https://github.com/open-telemetry/opentelemetry-java-instrumentation)

アプリケーションのVM引数には以下のようにCollectorのエンドポイントを設定します。

```
-javaagent:opentelemetry-javaagent-all.jar -Dota.exporter=otlp  -Dotel.otlp.endpoint=127.0.0.1:55680 
```

また、サービス名を表示するためOTEL_RESOURCE_ATTRIBUTE環境変数にサービス名を設定しています。
※ただし、これだとサービス名が表示されませんでした。原因不明。
　→OTEL_RESOURCE_ATTRIBUTEではなくOTEL_RESOURCE_ATTRIBUTESが正しいみたい。修正したらサービス名が表示できました。

```
OTEL_RESOURCE_ATTRIBUTES=service.name=myservice
```

設定が終わったら、アプリケーションを起動。


# Kibanaでトレースを表示

最後にトレースデータをKibanaで表示すると、Agent側がElasticだったときとほぼ同様のトレースが表示されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/a3a61c5a-e8f9-0a61-dcb0-d845d1f441eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/b06ed79c-f726-5b97-6b4e-06d12b141970.png)
Twicasのチャット取得

コメントビューア用。
OAuthが要るようなAPIは使わず、未登録で取得できるコメントを取得。
あくまで執筆時点の情報です。仕様が変わる可能性もあるのであしからず。


## ユーザの配信URL
- `https://twitcasting.tv/{ユーザID}`
  - 例: `https://twitcasting.tv/pasta04`

## 手順

1. ユーザIDを元に、動画ID(movieID)を取得
  - リクエスト
      - GET `https://frontendapi.twitcasting.tv/users/{ユーザID}/latest-movie`
  - レスポンス
 
      ```json
      {
          "update_interval_sec": 4,
          "movie": {
             "id": {movieID},
             "is_on_live": true  // 配信中かどうか
           }
      }
      ```


2. 動画IDを元に、チャットのURLを取得
    - リクエスト
        - POST `https://twitcasting.tv/eventpubsuburl.php`
        - body(form-data)
            - movie_id: {movieID}
    - レスポンス

      ```json
      {
         "url": "wss://s202218134036.twitcasting.tv/event.pubsub/v1/streams/{movieID}/events?token={なんやかんや}&n={なんやかんや}"
      }
      ```

3. チャットURLにWebSocketで接続する

1メッセージで複数コメントが取得できることがある。
ただの空配列が受信できることもある。
WebSocketでpingメッセージを送る必要は無さそう。

受信できるメッセージは以下の型。


- コメント

```js
{
    "type": "comment",
    /** コメントのIDっぽい */
    "id": number,
    /** コメント */
    "message": string,
    "createdAt": number,
    /** 投稿ユーザ情報 */
    "author": {
        /** Twicas内でのIDっぽい。乱数みたいなので見てもしょうがない。 */
        "id": string,
        /** ユーザの表示名 */
        "name": string,
        /** TwitterアカウントのScreenName */
        "screenName": string,
        /** アイコン画像のURL */
        "profileImage": string,
        "grade": number
    },
    "numComments": number
}[]
```

- ギフト

```js
{
    "type": "gift",
    "message": "",
    "item": {
        /** アイテム名。お茶とか */
        "name": string,
        /** アイテム画像URL */
        "image": string,
        "effectCommand": ""
    },
    /** コメントのauthorと同じ */
    "sender": {
        "id": string,
        "name": string,
        "screenName": string,
        "profileImage": string,
        "grade": number
    }
}[]
```