OmniAICreator/Qiita-1.07M huggingface dataset:
Rで混合ガウスモデル実装 (ギブスサンプリング)

# <font color="DarkSlateBlue">記事の目的</font>
Rで混合ガウスモデルのギブスサンプリングを実装します。
For文をできるだけ使用せず、早く学習するようにしました。
参考: [ノンパラメトリックベイズ 点過程と統計的機械学習の数理](https://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%83%99%E3%82%A4%E3%82%BA-%E7%82%B9%E9%81%8E%E7%A8%8B%E3%81%A8%E7%B5%B1%E8%A8%88%E7%9A%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%B0%E7%90%86-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4-%E4%B8%80%E8%AA%A0/dp/4061529153)

# <font color="DarkSlateBlue">目次</font>

<table>
<tr><td><font color="DarkslateBlue">No.<td><font color="DarkslateBlue">目次
<tr><td><font color="DarkslateBlue">1</font><td><a href="#1-モデルの説明">モデルの説明</a>
<tr><td><font color="DarkslateBlue">2<td><a href="#2-データとライブラリ">データとライブラリ</a>
<tr><td><font color="DarkslateBlue">3<td><a href="#3-実装">実装</a>
<tr><td><font color="DarkslateBlue">4<td><a href="4-確認">確認</a>
</table>

# <font color="LimeGreen">1.</font> <font color="DarkSlateBlue">モデルの説明</font>

![IMG_0196.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/fdcfc321-68c2-337b-2988-8229c7725766.jpeg)


# <font color="LimeGreen">2.</font> <font color="DarkSlateBlue">データとライブラリ</font>
データはirisのデータセットを使用します。

```R:
X <- iris[,1:4]
D <- ncol(X)
N <- nrow(X)
library(mvtnorm)
library(MCMCpack)
library(cluster)
```

# <font color="LimeGreen">3.</font> <font color="DarkSlateBlue">実装</font>
```R:
library(mvtnorm)
library(MCMCpack)
#(1)Kを求める
K <- 3
#(2)muを乱数で初期化
set.seed(100)
mu <- matrix(rep(apply(X,2,mean),each=K)+rnorm(K*D,0,0.1), nrow=K)
#(3)
a0 <- 1
b0 <- 1
alpha0 <- 1
#(4)
pi <- rep(1/K, K)
t <- 1
#(5)(ⅰ)-(ⅳ)を繰り返す
max.iter <- 5
a <- a0 + N*D/2
for(s in 1:max.iter){
  #(ⅰ)zのサンプリング
  tmp <- t(apply(mu, 1, function(x) dmvnorm(X, x, diag(D)/t)))*as.vector(pi)
  z <- apply(tmp, 2, function(x) which.max(rmultinom(1,3,x)))
  #(ⅱ)mu(µ)のサンプリング
  n <- tapply(z, z, length)
  x.k <-  apply(X, 2, function(x) tapply(x, z, mean))
  mu <- t(apply(cbind(x.k, n), 1,
                function(x) rmvnorm(1, x[D+1]*x[1:(D)]/(x[D+1]+1), diag(D)/(t*(x[D+1]+1)))))
  #(ⅲ)t(τ)のサンプリング
  b <- b0 + sum(unlist(apply(X, 2, function(x) tapply(x, z, function(x) (x-mean(x))^2))))/2 +
    sum(as.vector(n/(2*(1+n)))*((x.k%*%t(x.k))*diag(K)))
  t <- rgamma(1, a, b)
  #(ⅳ)pi(π)のサンプリング
  alpha <- alpha0 + n
  pi <- rdirichlet(1, alpha)
}
```

# <font color="LimeGreen">4.</font> <font color="DarkSlateBlue">確認</font>
左が正解で、右が実装の結果です。

```R:
library(cluster)
par(mfrow=c(1,2))
clusplot(X, iris[,5], color=TRUE, shade=FALSE, labels=4, lines=0)
clusplot(X, z, color=TRUE, shade=FALSE, labels=4, lines=0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/5fea99f0-22b8-eaa5-71d4-d5700dd94069.png)
BigSurでopenFrameworksをBuildするために必要なこと2つのこと

BigSurにアップグレードして、3ヶ月位経ちました。まぁ、多少使っていたライブラリとかソフトウェアとかが同様に使えないことはありましたが、概ね満足してたんですが、ただ一つ失敗したなぁと思っていたのが、openFrameworksが全く使えなくなってしまったことです。

ですが、つい先日メインコミッターの@ofTheoさんがIssueとフォーラムにworkaroundを投稿されていて、試したらBigSurでもビルドがちゃんと通るようになりました。

### GitHub Issue
https://github.com/openframeworks/openFrameworks/issues/6599#issuecomment-726992730

近いうちに、patch-release branch / 0.11.1としてリリースされるとのことです。
ただ、やるべき事自体は難しくないので、今すぐに使いたい方はご自身で下記を試すことをお勧めします。

#### 環境
- macOS 11.0.1(20B29)
- Xcode Version 12.2 (12B45b)


## Step1 libfmodex.dylibをUpdate
libfmodex.dylib
https://forum.openframeworks.cc/uploads/short-url/xYYPPDoARUoUJR6w6vPh0JW1c4A.zip

自分の場合は、0.11.0を使っているので、入れ替えるファイルのパスは以下でした。
`of_v0.11.0_osx/libs/fmodex/lib/osx/libfmodex.dylib`

## Step2 Run scriptをUpdate
Build Phases>Run Script（2つ目）の６行目を下記に変更します。
![1_ysKVjmequfZL1PrDZddfUw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24723/2b8c12e0-6f84-3684-e5f8-97e9d53a1188.png)


```zsh
install_name_tool -change @rpath/libfmod.dylib @executable_path/../Frameworks/libfmodex.dylib "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME";　
```

あとは、通常通りBuildすれば、openFrameworksのアプリケーションが起動するはずです。


フォーラムのリンクも載せておきます。
https://forum.openframeworks.cc/t/building-in-macos-11-0-big-sur/36581/7


~~フレンドリーversionがダウンロード可能になったみたいです。~~
~~BigSur/Apple M1 friendly version of 0.11.0 ~~
~~https://forum.openframeworks.cc/t/building-in-macos-11-0-big-sur/36581/38~~

### nightly builds (02/08/2021)
nightly buildsがダウンロード可能です。👉 of_v20210208_osx_nightly.zip
https://openframeworks.cc/ci_server/nightlybuilds.html
Rustで区分値を扱う

# 目的
区分値をenumで扱いたい。区分値は例えば公開区分、公開(00101)、非公開(00102)、権限区分、一般(00201)、管理者(00202)のように最初の3桁が区分の種類を表し、残り2桁がその区分値の値を表します。

# マクロ
よい感じのマクロがあります。[string_enum](https://crates.io/crates/string_enum)
以下の機能を実装してくれます。

* pub fn as_str(&self) -> &'static str
* impl serde::Serilaize
* impl serde::Deserilaize
* impl FromStr
* impl Debug
* impl Display

# 足りないもの
Defaultが欲しいのでこれだけ自作します。

# コード
```rust:Cargo.toml
[package]
name = "kbn"
version = "0.1.0"
edition = "2018"

[dependencies]
serde = "1.0.117"
serde_derive = "1.0.117"
serde_json = "1.0.59"
string_enum = "0.3.0"
```

```rust:main.rs
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
#[macro_use]
extern crate string_enum;

#[derive(StringEnum)]
pub enum PublishKbn {
    /// `00101`
    Public,
    /// `00102`
    NonPublic,
}

impl Default for PublishKbn {
    fn default() -> Self {
        PublishKbn::Public
    }
}

#[derive(StringEnum)]
pub enum AuthKbn {
    /// `00201`
    Normal,
    /// `00202`
    NonPublic,
}

impl Default for AuthKbn {
    fn default() -> Self {
        AuthKbn::Normal
    }
}

#[derive(Debug, Deserialize, Serialize, Default)]
pub struct MyStruct {
    publish_kbn: PublishKbn,
    auth_kbn: AuthKbn,
}

fn main() {
    let json = json!({
        "publish_kbn": "00101",
        "auth_kbn": "00202",
    });
    let res: MyStruct = serde_json::from_value(json).unwrap();
    println!("{:?}", res);
}


```
[SQL]データの横持ちと縦持ちを入れ替える

こんなテーブルがあるとする(mst_dog)

|id|dog_1|dog_2|dog_3|dog_4|coloer_1|coloer_2|coloer_3|coloer_4|
|-----------|------------|------------|------------|------------|------------|------------|------------|------------|
|1|柴犬|コーギー|チワワ|ダックス|黒|ノーマル|茶色|黒白|
|2|シェルティー|コリー|狆|秋田犬|ノーマル|黒白|黒白|茶色|
|3|チャウチャウ|ボルゾイ|ゴールデン|ダックス|紺|プラチナブロンド|金|茶色|

こんなカラムをこんな風に取得したいとき。

|dog|coloer|
|------------|------------|
|柴犬|黒|
|コーギー|ノーマル|
|チワワ|茶色|
|ダックス|coloer_4|
ETC...

UNIONを使ってもよいんだけれども。。。

```sql:get_dog.sql
WITH DOGLIST AS (
   SELECT dog_1 as dog , coloer_1 as coloer FROM mst_dog
   UNION ALL
   SELECT dog_2 as dog , coloer_2 as coloer FROM mst_dog
   UNION ALL
   SELECT dog_3 as dog , coloer_3 as coloer FROM mst_dog
   UNION ALL
   SELECT dog_4 as dog , coloer_4 as coloer FROM mst_dog
)
SELECT * FROM DOGLIST 
```

dog_の数が多いまたはカラム拡張された場合にしんどいので
こんな書き方もできるよ。

```sql:get_dog.sql
WITH DOGLIST AS (
        SELECT
            unnest ( 
                ARRAY [
                dog_1
                ,dog_2
                ,dog_3
                ,dog_4
                ]
            ) AS dog
            , unnest ( 
                ARRAY [
                coloer_1
                ,coloer_2
                ,coloer_3
                ,coloer_4
                ]
            ) AS coloer 
        FROM
            mst_dog
)
SELECT * FROM DOGLIST 
```
CROS JOIN よりも見やすいからこっちのが自分はすきです。
ブックマークレット(JavaScript)で湯婆婆を実装してみる

書いたあとで見つけたんですが、同じjs実装で圧倒的にスマートな例が別の湯婆婆のコメント欄にありました。
https://qiita.com/TD12734/items/743e90fb867fee8c562e#comment-5abe544380a4b2d29af3
上記、@shinji709様のコードが先となりますorz

## はじめに
「[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)」のフォロワーネタです。
[JavaScript版](https://qiita.com/hato-poppo/items/670d5186c2807a5f51b4)は既出なので、ブックマークレットにしました。

ブックマークレットは昔ゲーム・オブ・スローンズの画面が（演出上）暗くて見えにくい事にイライラして、アマプラの動画の輝度を調整するChromeExtensionを作ろうとした時にちょっと勉強した記憶があります。
（輝度調整のChrome拡張機能は既にあった）

## コード
```javascript
javascript:(function(){let n=window.prompt("契約書だよ。そこに名前を書きな。");if (!n.trim()) n=null;window.alert(`フン。${n}というのかい。贅沢な名だねぇ。`);n=n.substr(Math.floor(Math.random() * Math.floor(n.length)), 1);window.alert(`今からお前の名前は${n}だ。いいかい、${n}だよ。分かったら返事をするんだ、${n}!!`)})()
```
適当なサイトなどでブックマークを作り、リンク先を上記コードに置き換えるとブックマークレットとして動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186361/4eedf588-f7e1-a910-42e9-36e651ec9cba.png)
faviconを湯婆婆に変えるとよりそれっぽくなるかもしれません。

### 注記
ブックマークレットは、開いているページ内容（タブ）に影響します。
（文字列置換ブックマークレットとかありますよね）
**Chromeの「新しいタブ」など、サイトではなくChromeシステム配下のページではJavaScriptは動作しない**ようです。
参考：http://mk.miko.jp/blog/archives/4497
yahooやqiitaなど適当なサイトを開き、そのタブで実行してください。

## コードの解説
```javascript
// ブックマークレットは今開いているサイトのスコープと干渉するので即時関数にする
(
  function(){
    let n=window.prompt("契約書だよ。そこに名前を書きな。");

    // 名無しの場合は異常終了させるためにnullを代入。Cannot read property 'substr' of nullで落ちます。
    if (!n.trim()) n=null;
    window.alert(`フン。${n}というのかい。贅沢な名だねぇ。`);

    // 抽選。先に抽選すればダイアログ2個で済みますが、あえて分けました。
    n=n.substr(Math.floor(Math.random() * Math.floor(n.length)), 1);
    window.alert(`今からお前の名前は${n}だ。いいかい、${n}だよ。分かったら返事をするんだ、${n}!!`)
  }
)()
```

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186361/291532f0-ac36-30fe-7df6-dbbb8a21b931.png)


## 最後に
大昔にいじったDelphiとか引っ張り出そうかと思いましたが流石にめんどうでやめましたｗ
データカタログを使う（データクラス 基本編）

##データクラスとは
データクラスとは、データフィールドやテーブルの列など、データ資産に含まれるデータの種類を記述するものです。データクラスは、データベースの列のタイプと混同されがちなのですが、データベースの列のタイプは、vachar型やint型など、文字列や数値型を表すものに対して、データクラスはその列に、口座番号や誕生日など、どのような種類のデータが入っているのかを表現するものです。

データクラスは、カタログに登録したい、もしくは登録されているデータ資産の品質を確認するために利用します。例えば、本来であればこのテーブルのこの列には、クレジットカード番号が入っていなければならないのに、違うコード体系の番号が入っているとそのデータは信用できませんよね？そういうデータの中身をチェックするのに、データクラスは用いられます。

データカタログの製品によっては、デフォルトで予め設定されているものもあります。例えば、Cloud Pak for Data(CP4D)のWatson Knowledge Catalog(WKC)では、約150のデータクラスが事前に定義されています。いくつか例をご紹介します。

<details><summary>Email Address</summary>Eメールアドレスを定義したデータクラ</details>
<details><summary>Date of Birth</summary>誕生日を定義したデータクラス</details>
<details><summary>Internet Protocol Address</summary>IPアドレスを定義したデータクラス</details>

製品コードがきちんと入力されているかチェックしたいなど、事前に定義されているデータクラスだけでは対応できない場合があると思います。その場合は、管理したいコード体系などを表現するデータクラスを作成することができます。

##新しいデータクラスの作成方法
ここでは、IBM Cloud Pak for Data(CP4D)のWatson Knowledge Catalog(WKC)を例に、新しいデータクラスの作成方法をご紹介します。
CP4Dにログインした直後の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/07089994-5af0-aea6-3eef-b43af5b8f16e.png)
左上にあるメニューボタンを押して、ガバナンス -> データクラスを選択します。
![スクリーンショット 2020-11-12 11.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/17a2239d-265b-8c3d-eadd-2a72032c4f1b.png)
右上にある新規データ・クラス -> 新規データ・クラスの作成を押します。なお、今回はご紹介しませんが、データクラス定義のファイルインポートも対応しています。

データクラス名とそのデータクラスが属するカテゴリーを選択します。また、そのデータクラスの定義を記入し、ドラフトとして保存を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/49a45372-a812-6b41-ecf6-4d3d34e3ec72.png)
データクラスがドラフトとして保存されました。CP4DのWKCは、データクラスは**公開済**と**ドラフト**の状態で管理されます。**ドラフト**の状態場合、ユーザーには見えない状態となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/2fc21f96-c9ab-0f4e-60a3-6183822d3608.png)
データクラスの例も追加することができます。例のエリアにある+ボタンを押します。
サンプルを記入し、追加ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/d4588387-4177-e599-fbbb-77696ad77897.png)
例が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/a69157db-16d0-7a0e-2a45-100008bff7f7.png)
データクラスは、1次カテゴリーとしてメインのカテゴリーの他に、複数のカテゴリーに２次カテゴリーとして保存することができます。
また、これ以外にも、**親データクラス**や**従属データクラス**を設定することができます。ここではブランクのままにします。
さらに、突き合わせ方式があります。これは、データ資産の品質チェックをするときに利用するものですが、ここでは、修正することなく、**自動突き合わせなし**のままにしておきます。
自動突き合わせ方式の設定は、データクラス 応用編でご説明したいと思います。

必要な情報を設定したら、右上にある公開ボタンを押します。
コメントを残して、公開するボタンを押すと、データクラスがドラフト状態から公開済みとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/87ae443e-2ba3-73a3-9cc2-a0217503582c.png)
デフォルトの設定では、公開ボタンを押すと、そのまま公開済みになりますが、CP4DのWKCのワークフロー機能を利用すれば、適切な承認プロセスを経て、データクラスを公開するようなフローを作成することもできます。

以上で、データクラスを作成いたしました。
データカタログを使う（分類 基本編）

##分類とは
分類とは、簡単に言うと、カタログに登録するデータ資産にラベリングするための機能です。一見、タグにもよく似ていますが、タグは自由な意味を付与して、利用するものに対して、分類は、主に、機密レベル(Restricted,Confidentialなど）、ビジネス重要度(Critical,Important）や個人情報の機微性などを表現するために用いられます。例えば、以下のような分類です。
####機密レベル
+ 極秘
+ 部外秘
+ 社外秘

####ビジネス重要度
+ 最重要
+ 重要
+ 有用

データカタログの製品によっては、デフォルトで予め設定されているものもあります。例えば、Cloud Pak for Data(CP4D)のWatson Knowledge Catalog(WKC)では、以下の分類が事前に定義されています。

<details><summary>Personally Identifiable Information</summary>個人を特定できる情報（PII）とは、特定の個人を識別できる可能性のあるあらゆるデータと定義されています。ある個人と別の個人を区別するために使用できる情報はすべて、PIIと見なされます。</details>
<details><summary>Sensitive Personal Information</summary>機微な個人データとは、人種または民族的な出自、政治的意見、宗教的信条またはその他の類似した性質の信条、労働組合への加入、身体的または精神的な健康状態または状態、性生活、または個人の犯罪歴または犯罪容疑歴に関する情報で構成される個人データと定義されています。</details>
<details><summary>Confidential</summary>機密データとは、何らかの形で危殆化した場合に、そのデータが属する機関および/または個人に重大かつ/または長期的な危害をもたらす可能性のあるデータをいいます。</details>

##新しい分類の作成方法
ここでは、IBM Cloud Pak for Data(CP4D)のWatson Knowledge Catalog(WKC)を例に、新しい分類の作成方法をご紹介します。
CP4Dにログインした直後の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/07089994-5af0-aea6-3eef-b43af5b8f16e.png)
左上にあるメニューボタンを押して、ガバナンス -> 分類を選択します。
![スクリーンショット 2020-11-11 14.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/682d2442-993c-9a01-c590-09f0fca400e5.png)
右上にある新規分類 -> 新規分類作成を押します。なお、今回はご紹介しませんが、分類のファイルインポートも対応しています。

分類名とその分類が属するカテゴリーを選択します。また、その分類の定義を記入し、ドラフトとして保存を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/af32fdfb-9bc1-76e4-4f39-38c6a489def9.png)
分類がドラフトとして保存されました。CP4DのWKCは、分類は**公開済**と**ドラフト**の状態で管理されます。**ドラフト**の状態場合、ユーザーには見えない状態となっています。
分類は、1次カテゴリーとしてメインのカテゴリーの他に、複数のカテゴリーに２次カテゴリーとして保存することができます。
これ以外にも、**親分類**や**従属分類**を設定することができます。ここではブランクのままにします。

必要な情報を設定したら、右上にある公開ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/946ad285-4fc3-9b79-ace7-076e3a90b2c5.png)

コメントを残して、公開するボタンを押すと、分類がドラフト状態から公開済みとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/4a3b2efc-1fec-5303-34b2-488b540ef987.png)
デフォルトの設定では、公開ボタンを押すと、そのまま公開済みになりますが、CP4DのWKCのワークフロー機能を利用すれば、適切な承認プロセスを経て、分類を公開するようなフローを作成することもできます。

以上で、分類を作成いたしました。
【Azure Synapse Analytics】serverless SQL pool の照合順序を変更し文字化けを防ぐ

# はじめに

Azure Synapse Analytics の serverless SQL pool のデフォルトの照合順序は **「SQL_Latin1_General_CP1_CI_AS」** です。これは、以下の T-SQL を実行することにより確認できます。

```sql
SELECT name, collation_name FROM sys.databases
```
![20201115_synapse_collation_01_collation.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/d8034b77-896f-1a55-0ad7-a24c61ad3a76.jpeg)

この照合順序のままですと、日本語が含まれたファイルを取り扱う場合に不便が生じます。具体的には、以下のようにUTF-8 でエンコードされた CSV ファイルを serverless SQL pool でクエリ実行すると、日本語の部分が文字化けします。

```csv
ID,Name,Grade,Birthday
1,鈴木,2,2003年2月24日
2,田中,1,2004年5月16日
3,佐藤,2,2003年4月15日
4,山田,3,2002年6月20日
5,加藤,3,2002年10月1日
6,中村,2,2003年8月28日
7,三浦,1,2004年12月3日
```

![20201115_synapse_collation_02_collation.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/ad6176b3-05ea-a17b-9b1a-c0e602bc5957.jpeg)

## 照合順序の変更

これを防ぐには、serverless SQL pool の照合順序を変更する必要があります。日本語対応しているものであれば何でもよいですが、例えば「Japanese_XJIS_100_CI_AI_SC_UTF8」に変更するには以下の T-SQL を実行します。

```sql
ALTER DATABASE <dbname> COLLATE Japanese_XJIS_100_CI_AI_SC_UTF8
```
![20201115_synapse_collation_03_collation.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/b501d8eb-437a-c68f-59c2-5589c70263fa.jpeg)

変更後にクエリを実行すると、文字化けせずに結果が返されることが確認できます。
![20201115_synapse_collation_04_collation.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/c7723170-c684-7d33-6b7d-2f4c6b96c3ec.jpeg)

## 所感

今回の件はオンプレの SQL Server などではよくある話題であり知っていればどうということはないのですが、サーバーレスであると内部の仕組みに対する意識が薄れがちになるのでよい教訓となりました。
【Java】部分文字列/要素を検索（AOJ12 - リング）

AIZU ONLINE JUDGE の教材を使って勉強していきます
行いたい操作や文法をまとめ、
実際にその文法を使ってAOJを解答した例を載せています

#indexOfで部分文字列を検索
* **indexOfメソッド**
* 文字列に含まれる部分文字列を検索
    * ヒット場合は、文字列のインデックス番号を返す（先頭0）
* **lastIndexOfメソッド**は文字列の後ろから検索
    * 最初に見つかった位置のインデックスを返す

```java

public class Main {
    public static void main(String[] args){

		String str1 = "Penpineappleapplepen";
		String str2 = "pineapple";
 
		int result = str1.indexOf(str2);
 
		if (result != -1) {
		    System.out.println(str2 + "発見!");
			System.out.println(str2 + "が見つかった位置:" + result);
		} else {
			System.out.println(str2 + "は見つかりませんでした。。。");
		}
	}
}
```

```java
pineapple発見!
pineappleが見つかった位置:3
```

#indexOfで複数要素を検索
* 第2引数を指定して複数の要素を検索する
* indexOfメソッドの第2引数で検索開始位置指定
* 文字がヒットしたらその次のインデックスを第2引数に指定し、続きから残りの文字列を検索

```java
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
    public static void main(String[] args){

		String str1 = "Penpineappleapplepen";

        int result;
        for (int i = 0; i < str1.length(); i++) {
            result = str1.indexOf("p", i);
            if (result != -1) {
                i = result;
                System.out.println("pを " + result +" 番目に発見した！");
            }
        }
	}
}
```

```java 
pを 3 番目に発見した！
pを 8 番目に発見した！
pを 9 番目に発見した！
pを 13 番目に発見した！
pを 14 番目に発見した！
pを 17 番目に発見した！
```

#リング（ITP1-8）
>図のようなリング状の文字列 s の任意の位置から、時計回りに連続した文字をいくつか選んで、文字列 p が作れるかを判定するプログラムを作成してください。
Input
１行目に文字列 s が与えられます。 ２行目に文字列 p が与えられます。
Output
p が作れる場合は Yes と、作れない場合は No と１行に出力してください。
Constraints
* 1≤pの長さ≤sの長さ≤100
* 文字列は英小文字からなる
Sample Input 1
vanceknowledgetoad
advance
Sample Output 1
Yes


```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        String s=scan.next();
        String p=scan.next();
        s+=s;
        if(s.indexOf(p)>=0)System.out.println("Yes");
        else System.out.println("No");
        scan.close();
    }
}
```
Git でマージされたリモートブランチを削除 (mac)

mac のシェル環境(zsh)から、マージされたリモートのGitブランチを削除するコマンドです。

## コマンド

```sh
git branch -v -r --merged origin/develop | grep -v -e master -e develop -e test | sed -e 's/origin\///g' | cut -d' ' -f 3 | xargs git push -d origin 
```

読みやすく複数行にすると

```sh
git branch -v -r --merged origin/develop | \
grep -v -e master -e develop -e test | \
sed -e 's/origin\///g' | cut -d' ' -f 3 | xargs git push -d origin 
```

## コマンドの各パーツ

### マージされたブランチを一覧で出力

```shell
git branch -v -r --merged origin/develop
```

ここでは origin/develop にマージされたブランチを出しています。

### 消してはいけないブランチを除外

```sh
grep -v -e master -e develop -e test
```

master, develop, test を含むブランチを消してはいけないものとして除外しています。

ここまで繋げて実行すると、対象となるブランチを見ることができます。

### ブランチ名の変換

```sh
sed -e 's/origin\///g'
```

表示されるブランチに `origin` が付いていますからその部分を消します。

### ブランチ名の抽出

```sh
cut -d' ' -f 3 
```

最終コミットのメッセージが出ていますので、それを除外します。

### リモートブランチ削除

```sh
xargs git push -d origin 
```

## その他

不要になったブランチは削除しましょう。