OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerでjenkins(+SSL)

##イメージ取得
```
docker pull jenkins/jenkins:lts
```
LTS版を使う
##起動
```
docker run -d -p 18080:8080 -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home --name jenkins --restart=always jenkins/jenkins:lts --prefix=/jenkins
```

--prefix指定でサブディレクトリ化してnginxによるリバースプロクシsslできるようにする。

##ディレクトリ作成
```
mkdir /data/jenkins_home
chown -R 1000:1000 /data/jenkins_home
```

##nginx

```
 upstream jenkins_server {
   server 127.0.0.1:18080 fail_timeout=0;
 }

  server {
    listen       80 default_server;
    listen       [::]:80 default_server;

(中略)
  }

  server {
    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    #jenkinsサーバ
    location ~ /jenkins {
      proxy_read_timeout 300; # Some requests take more than 30 seconds.
      proxy_connect_timeout 300; # Some requests take more than 30 seconds.
      proxy_redirect     off;

      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_set_header   Host              $http_host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   Host $host;
      proxy_set_header   Authorization "";

      proxy_pass         http://jenkins_server;

      access_log  /var/log/nginx/jenkins_access.log;
      error_log   /var/log/nginx/jenkins_error.log;
    }

```

もしかしたら最初のトークン認証が終わるまではクロームブラウザではアクセスできないかもしれない。その場合はFirefoxで認証だけ行う。
【バグ】ChromeでCSSアニメーションがうまく描画されない

# やりたいこと

裏表に文字が書かれたカード(`div#card`)に回転するアニメーションを付ける。
![fixed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320683/a58f0995-a801-031b-2ead-e4a518037086.gif)


# 症状

裏面(`div.back`)がうまく描画されない。
![bug.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320683/dd76ac72-5eab-445a-8e5a-623cffb431b9.gif)


## 発生条件

`backface-visibility: hidden`を指定している要素に対して回転アニメーションをつけると発生。

Blinkのバグと思われる。

- Chrome 76.0.3809.132
- Opera 63.0.3368.66
では発生。

- Firefox 68.0.2
では発生せず。


# 対策

`@keyframes`内で`z-index: auto`などを明示的に指定することで再描画を促す。

```css:CSS
@keyframes rotate {
  from {
    z-index: auto;  /* これを追加 */
    -webkit-transform: rotate(0);
    transform: rotateY(0);
  }
  to {
    -webkit-transform: rotate(360deg);
    transform: rotateY(360deg);
  }
}
```


# サンプルコード

<details>
<summary>HTML/CSS</summary>
<div>

```html:HTML
<div id="card">
  <div class="front">Front</div>
  <div class="back">Back</div>
</div>
```

```css:CSS
#card {
  width: 300px;
  height: 100px;
  perspective: 1000px;
}

.front,
.back {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  color: white;
  font-size: 60px;
  text-align: center;
}

.front {
  background-color: teal;
  -webkit-animation: rotate 4s linear infinite;
  animation: rotate 4s linear infinite;
}

.back {
  background-color: orangered;
  -webkit-animation: rotate 4s linear -2s infinite;
  animation: rotate 4s linear -2s infinite;
}

@keyframes rotate {
  from {
    z-index: auto;  /* これを追加 */
    -webkit-transform: rotate(0);
    transform: rotateY(0);
  }
  to {
    -webkit-transform: rotate(360deg);
    transform: rotateY(360deg);
  }
}
```
</div>
</details>
Bigqueryで2番目に小さい(大きい)数字を出す方法

## 概要
Bigqueryで2番目に小さい数字を出すSQL。
2番目と書いたが何番目でも出せる。

## 背景
ユーザーID単位で初回CV日から2回目CVまでの日数を出すという作業が発生したのですが、
サブクエリ使ったり、window関数使ったりするのが面倒で集計関数で1発で出せないかなぁ
と考えたのがきっかけ。

## 結論
配列を使えば万事解決。

## 実例
下記のようなIDとコンバージョン日が入ったサンプルテーブルをイメージしてください
![](https://gyazo.com/759b3fad40e0dd3583e58dbe61254bce.png)

### SQL

```sql
with table as (
select * from UNNEST([
  STRUCT(1 as id, "2019-1-1" as cv_date),
  (1,DATE("2019-1-1")),
  (1,DATE("2019-1-2")),
  (1,DATE("2019-1-3")),
  (1,DATE("2019-1-4")),
  (1,DATE("2019-1-5")),
  (1,DATE("2019-1-6")),
  (1,DATE("2019-1-7")),
  (2,DATE("2019-1-1")),
  (2,DATE("2019-1-4")),
  (2,DATE("2019-1-5")),
  (2,DATE("2019-1-8")),
  (2,DATE("2019-1-10")),
  (2,DATE("2019-1-11")),
  (3,DATE("2019-1-1"))
])
)

select 
  id,
  array_agg(distinct cv_date order by cv_date)[SAFE_OFFSET(0)] first_date,
  array_agg(distinct cv_date order by cv_date)[SAFE_OFFSET(1)] second_date
from 
  table
group by 
  id
```

### 結果
![](https://gyazo.com/b766b12084b1145e88d8a23cc675efe5.png)


## 解説
- array_aggを使ってid単位で配列を作成。その際、日付単位でユニークにしてかつcv_dateでソートします。 
    - ※今回はdistinctしていますがここは必要に応じて消してください。
- 作成した配列に対して `SAFE_OFFSET` もしくは`SAFE_ORDINAL` でアクセスします。SAFEでないと指定した数字が範囲外の場合エラーになります。  
    - ※ここでN番目を指定してください。


## 所感
- 配列めっちゃ便利だなぁ
- 他の集計値も一緒に出せるのは嬉しい
- 配列作成する時にlimitを書くと少し速くなったような気がするが気のせいかもしれない
    - `array_agg(distinct cv_date order by cv_date limit 2)[SAFE_OFFSET(1)]`
transition-timing-functionの変な曲線をGUIで自作する

![TimingFunction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133977/7a36f931-dd24-54e1-cf9a-19a968c231bd.png)

出典: [transition-timing-function－CSS3リファレンス](http://www.htmq.com/css3/transition-timing-function.shtml)

この変な曲線を皆様がお持ちのブラウザで自作します。


## 作成
Google ChromeかFirefoxを起動します。（以下画像は全てFirefoxのものになります）
デベロッパーツールを開きます。
インスペクタータブを選択します。
`transition`が設定されている場所をstyle/ルールから探します。

![123456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133977/8612b0f8-f832-7f80-9c2a-44fbbd2cfc03.png)

画像の`ease-in-out`の横の変なアイコンをクリック。
すると`transition-timing-function`の曲線が表示されたパネルが開きます。

![2456789.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133977/b9b05e34-841f-9658-29ac-96dfd802b9c3.png)

画像の黒いまるポチをグリグリ動かすとお好みの曲線が作成できます。

![456789.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133977/b4e95c58-12f5-8d67-1680-8a721b9513ac.png)

パネルを閉じるとあ〜ら不思議
`ease-in-out`が`cubic-bezier(0,1.54,1,-0.59)`に変わってるじゃありませんか。

```
-webkit-transition-timing-function: cubic-bezier(0,1.54,1,-0.59);
```

これで`-webkit-transition-timing-function`の出来上がりです。

あとはこれをCSSに書くだけ。

```css:style.css
.test {
  transition: 1s cubic-bezier(0,1.54,1,-0.59);
}
```
Githubを使って、異なる２つのPCでソースを共有する際の注意点

# この記事の概要
・Githubを用いたソースコード管理に関する内容
・git操作時のエラーについての解決策のメモ
・gitの仕組み（リモートリポジトリとローカルリポジトリ、ブランチを切る、git add,commit,pushの流れ等）がある程度は分かる人向け


# 結論
GitHubを使って、異なる2つのPCでソースを共有する際、
`refusing to merge unrelated histories` というエラーが発生する場合があり、
その解消には、
`git merge --allow-unrelated-histories origin/master` をする必要がある

# 詳細の記述

##前提
拠点Aと拠点Bで、それぞれ別々のPCを使って、同一のソースコードを管理する、というシチュエーション

## 前提に基づく具体的な作業内容・発生したエラーおよびその対処方法
１）拠点AのPCで、Githubに新規リポジトリを作成
２）拠点AのPCで、Gitの管理下に置きたいディレクトリに移動
３）README.mdに、echo hogehoge（＝空でない何らかのファイルを作成する行為）
４）`git init`
５）`git add -A`  (全てをadd）
６）`git commit -m "first commit"`  (コミットメッセージつきのcommit実行）
７）`git remote add origin git@github.com:ユーザー名/リポジトリ名.git`　
　（１）で作成したリモートリポジトリをローカルのフォルダと関連づける）
８）`git push origin master` （README.mdをリモートリポジトリにpush）
９）ブラウザでGithubの該当リポジトリページを開いて、README.mdが表示されればOK

拠点Bにて、
１）拠点BのPCで、Gitの管理下に置きたいディレクトリに移動
※このときディレクトリ内には、リモートリポジトリにpushしたいファイル群があることとする
２）`git init`
３）`git remote add origin git@github.com:ユーザー名/リポジトリ名.git`　
　（１）で作成したリモートリポジトリをローカルのフォルダと関連づける）
４）`git add -A`
５）`git commit -m "first commit from B"` (コミットメッセージつきのcommit実行）
６）`git push origin master`
！！エラー発生！！

```
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

※対象のリモートリポジトリの内容を、拠点Bのローカルに反映させることを先に実行しなくてはならない
７）`git pull origin master`（リモートリポジトリの最新の内容をローカルにpull）
８）`git push origin master`（ローカルの内容をリモートリポジトリにpush）
！！エラー発生！！

```
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
hint: Updates were rejected because the tip of your current branch is behind
```
※拠点Bのローカルのmasterブランチが、リモートリポジトリよりも古い（ビハインド）のでpushできない
９）もう一度、git pull origin master（リモートリポジトリの内容をローカルに反映させる）
！！エラー発生！！

```
fatal: refusing to merge unrelated histories
```
※２つの無関係なヒストリー同士をmergeさせることはできない
※こちらの記事に詳しくあるが、gitの仕様であるとのこと
https://qiita.com/takanatsu/items/fc89de9bd11148da1438
※エラー解消のためには、２つ（リモートリポジトリとローカルリポジトリ）の無関係なヒストリーをmergeするコマンドを入力する必要がある
１０）`git merge --allow-unrelated-histories origin/master`
実行結果

```
Merge made by the 'recursive' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
```

（リモートリポジトリにあったREADME.mdが拠点Bのローカルとmerge。拠点Bのローカルには、６）でpushしようとしていたファイル群と、README.mdが一緒にある状態になった）
１１）`git push origin master`（ローカルの内容をリモートリポジトリにpush）

```
Enumerating objects: 121, done.
Counting objects: 100% (121/121), done.
Delta compression using up to 4 threads
Compressing objects: 100% (102/102), done.
Writing objects: 100% (120/120), 187.77 KiB | 4.69 MiB/s, done.
Total 120 (delta 9), reused 0 (delta 0)
remote: Resolving deltas: 100% (9/9), done.
To https://github.com/ユーザー名/リポジトリ名.git
   fb77a79..3423825  master -> master
```

１２）ブラウザでGithubのリポジトリページを開いて、拠点Bのローカルのファイル群が表示されていれば、リモートリポジトリに拠点Bのローカルのファイル群をpush成功

# あとがき
あまり一般的でないシチュエーションかもしれませんが、
もし詰まった方がいれば、その参考になれば幸いです。
JavaScriptでunixtimeから日時へ変換するやり方のメモ

#やりたいこと
「1567566215」みたいな感じのunixtime状態から、「2019/9/4」とか「9/4」（月日のみ抽出）みたいな日時の表記に変換すること。

#やり方
```javascript:test.js
// Dateがミリ秒なので1000倍が必要
let dateTime = new Date(unixtime * 1000);

// .toString()や.toLocaleDateString()、.toLocaleTimeStringでうまくいく
// 以下、unixtime = 1567566215 でのサンプル
console.log(dateTime.toString()); // => Wed Sep 04 2019 12:03:35 GMT+0900 (日本標準時)
console.log(dateTime.toLocaleDateString()); // => 2019/9/4
console.log(dateTime.toLocaleDateString('ja-JP').slice(5)); // => 9/4
console.log(dateTime.toLocaleTimeString()); // => 12:03:35
console.log(dateTime.toLocaleTimeString('ja-JP')); // => 12:03:35
```
年月日のうち月日のみを抽出するやり方を調べたけどいい感じのが見つからず、.slice()が簡単な気がきました。
getMonth()とかを使おうとすると複雑になるし、これのために何か読み込むとかも嫌だし。。

####注意
(1) sliceのところでLocaleで'ja-JP'指定しているのは、sliceの位置を固定するためです。
(2) ただ、(1)のせいでLocal Timeを扱うのがちょっと不便。。

#参考
[Dateオブジェクト｜JavaScript プログラミング解説](https://so-zou.jp/web-app/tech/programming/javascript/grammar/object/date.htm)
[Date｜MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)
ABC126

https://atcoder.jp/contests/abc126/tasks

#A - Changing a Character
##正解
```c++
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int N,K; cin >> N >> K;
    string S; cin >> S;
    
    S[K-1]=tolower(S[K-1]);
    cout << S;
}
```
#B - YYMM or MMYY(もう一回)
##正解
```c++
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int S; cin >> S;
    int L=S/100; //R=上2桁
    int R=S%100; //L=下2桁
    
    if (1<=L && L<=12){
        if (1<=R && R<=12) cout << "AMBIGUOUS";
        else cout << "MMYY";
    }else{
        if (1<=R && R<=12) cout << "YYMM";
        else cout << "NA";
    }
}

```
##改善点(int型 or string型)
4桁の数字を入力する際に**Sを文字列として扱った**。その際、どのような場合分けによって条件を満たせるか考えたが積んだ…
**Sをint型**として捉えると、**簡単に上2桁と下2桁**に分けられ、場合分けがしやすくなることは盲点だった

#C - Dice and Coin

##正解
```c++
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int N,K; cin >> N >> K;
    double sum=0;
    int cnt=0;
    
    for (double i=1; i<=N; i++){
        int now=i; 
        while(now<K){
            now=now*2;
            cnt++;
        }
        sum+=(1.0/N)*pow(0.5,cnt);
        cnt=0;
    }
    cout << fixed<< setprecision(12) <<sum<< endl;
}
```

##自分の誤答
```c++
#include<bits/stdc++.h>
using namespace std;

int main(){
    int N,K; cin >> N >> K;
    double sum=0;
    int cnt=0;

    for (double i=1; i<=N; i++){
        while(i<K){
            i=i*2;
            cnt++;
        }
        sum+=(1.0/N)*pow(0.5,cnt);
        cnt=0;
    }
    cout << fixed<< setprecision(12) <<sum<< endl;
}
```
##改善点(iの変化を止めたい&fixed << setprecision(12))
①iの値を1→2→3→....→Nとしたいのに、自分の誤答のプログラムではwhileのブロックでiが使われているので、そのブロックが終わったとき、iが2倍以上に変化して困る。
そんな時には、**新たな変数(now)**でwhileブロックで処理すればiの値は変化しないので、問題なし！
②**fixed << setprecision(12)**と打つことで、printf文で桁数を指定しなくても済む！
Mac用 Laravelをインストールする

Composerを使ったLaravelのインストールの仕方を紹介します。
Mac向けに書いておりますのでWindowsの方とは方法が異なります。

## ０. Homebrewインストール

Homebrewがなければインストールします。
インストールされている方は次に進んでください。

- 公式サイト：[Homebrew](https://brew.sh/index_ja)

### 0-1. インストール

``` shell
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### 0-2. バージョン確認

``` shell
$ brew -v
```

``` shell
Homebrew 2.1.11
```

## １. Composerインストール

### 1-1. Composerをインストール

``` shell
$ brew install composer
```

### 1-2. Composerのバージョンを確認

``` shell
$ composer -v
```

入力後、下記のようなのが出力されるはずです。

``` shell
　  ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-08-02 20:55:32
```

## ２, Laravelインストール

### 2-1. Laravelインストーラーをダウンロード

``` shell
$ composer global require "laravel/installer"
```

- 確認

``` shell
$ cd ~/.composer/vendor/bin
$ ls
```
``` shell:~/.composer/vendor/bin
laravel@
```

### 2-2. 端末で、Laravelコマンドが実行できるようする  
端末で、laravelコマンドが実行できるように、`~/.composer/vendor/bin` ディレクトリーへPATHを通してください。

``` shell
$ export PATH="$PATH:/Users/<UserName>/.composer/vendor/bin"
```

デフォルトでパスを通す場合は、`~/.bashrc`や`~/.bash_profile`に上記のコマンドを記述する。
記述後は編集したファイルに対して`source`コマンドを実行する。

``` shell
$ source ~/.bashrc
$ source ~/.bash_profile
```

### 2-3. バージョン確認  
Laravelコマンドが打てるようになったのでバージョンを確認します。

``` shell
$ laravel -v
```

``` shell
Laravel Installer 2.1.0
```

インストールが完了したらあとは指定したディレクトリにLaravelプロジェクトを作成します。

## ３. Laravelプロジェクト作成

ここまでくればあとはLaravelコマンドを叩けば良い。

### 3-1. 作業用ディレクトリに移動する
今回はデスクトップに作成します。

``` shell
$ cd ~/Desktop
```

### 3-2. ファイルを作成する

``` shell:~/Desktop
$ laravel new laravel_sample
```

`laravel new <ディレクトリ名>`をすると、必要なパッケージが全て揃って、Laravelがインストールされます。

## 4. 動作確認

### 4-1. 作成したディレクトリに移動

``` shell:~/Desktop
$ cd laravel_sample
```

### 4-2. ローカル開発サーバーを起動

``` shell:~/Desktop/laravel_sample
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

ブラウザで`http://127.0.0.1:8000`にアクセスします。

<img width="838" alt="スクリーンショット 2019-09-05 18.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381808/44c8b8a3-3900-25a3-1aef-b8189c639c68.png">

上記の画面が出れば成功です。

### 4-3. 任意のポートで起動する

デフォルトでポート8000が設定されていますが、既に使用済みであるか、この方法で複数のサーバーを建てたい場合は、対象のポート番号を指定します。
その場合は、`--port`引数を使えばいいだけです。

``` shell
$ php artisan serve --port=8080
Laravel development server started: <http://127.0.0.1:8080>
```

## さいごに
あとは作成した作業ディレクトリでLarabelを使い開発するだけ！
楽しいLarabelライフを！

---

参考資料：[Laravel 4.2 Laravelクイックスタート](https://readouble.com/laravel/4.2/ja/quick.html)
言語処理100本ノックやってみる　19

#19. 各行の1コラム目の文字列の出現頻度を求め，出現頻度の高い順に並べる
各行の1列目の文字列の出現頻度を求め，その高い順に並べて表示せよ．確認にはcut, uniq, sortコマンドを用いよ．

```py
from itertools import groupby
fname = 'hightemp.txt'

# 都道府県名の読み込み
lines = open(fname).readlines()
kens = [line.split('\t')[0] for line in lines]

# 都道府県で集計し、(都道府県, 出現頻度)のリスト作成
kens.sort()    # goupbyはソート済みが前提
result = [(ken, len(list(group))) for ken, group in groupby(kens)]

# 出現頻度でソート
result.sort(key=lambda ken: ken[1], reverse=True)

# 結果出力
for ken in result:
    print('{ken}({count})'.format(ken=ken[0], count=ken[1]))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/72ac0ef2-0b7a-b708-66ba-88da75ab9eb8.png)
②イテレーターとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/e2ea3709-5fac-5281-8787-4f55c2794712.png)
https://qiita.com/anmint/items/37ca0ded5e1d360b51f3
compactMapValuesの戻り値をそのまま再代入しようとしたらハマった

書き方ミスって偶然見つけました。
Swift5で試してます。

`compactMapValues`を使ってvalueがnilのペアを弾こうとしたのですが、その過程で躓いて気づきました。

## 次のコードのアウトプットを予想できますか？

次のコードを実行すると、2つ目のprintでは
`["a": Optional("a"), "c": Optional("c")]` が返ってきそうな気がしますが
実際はちょっと違っていました。

```swift
var hoge: [String: String?] = ["a": "A", "b": nil, "c": "C"]
let fuga = hoge.compactMapValues({$0})
print(fuga)

hoge = hoge.compactMapValues({$0})
print(hoge)
```

```結果.
["a": "A", "c": "C"]
["b": nil, "a": Optional("A"), "c": Optional("C")]
```
`"b": nil` が復活しています。


ちなみに `fuga` の型を `[String: String?]` にしても同じことが再現します。
つまり再代入は無関係です。

そして直接printに渡した場合は起きません。

```swift
print(hoge.compactMapValues({$0}))
```
```結果.
["c": "C", "a": "A"]
```

なので恐らく、`[String: String]`から`[String: String?]`へのキャスト時に内部の変換において何かミスってるのかもしれませんが、詳しくは分かりません。
Djangoをインストールしてアプリケーションを作成する

基本的な内容を備忘録として残します。

Pythonは既に入っている前提です。

## Djangoをインストール
```
pip install django
```

## Djangoでプロジェクトを作成
Djangoのプロジェクトを作成したいディレクトリで以下コマンドを実行

```
django-admin startproject sampleSite(任意のプロジェクト名)
```

## アプリケーションを作成する
まずは作成したプロジェクトに移動

```
cd sampleSite
```

これができたら以下を実行

```
python manage.py startapp sampleapp(任意のアプリ名)
```

## データベースを扱うなら以下のコマンドが必要
manage.pyのあるディレクトリで実行

```
python manage.py migrate
```

## 一旦ディレクトリ構造を整理
ここまでの作業でこんな感じの構造になってます

```
sampleSite
  —manage.py
  —sampleapp
  -db.sqlite3
  —sampleSite
```

一番上のsampleSiteは名前変更しても問題無いそうです。

プロジェクト名とかぶるから変えても良いかも知れないです。
[Java]サーバーサイドでhtmlから渡されたパラメータを取り出す方法

## Java側でパラメータを取り出す方法
Html側の入力項目で
idとvalueを以下の様に設定した場合、

```html

<input type="hidden" name="param1" value="1" />
```

Java側で、以下の様に記述すれば、変数 `pamam' へ値が設定される。

```java

String param = request.getParameter("param1");
```
windows10でadbが起動しなかったのはmicrosoft万歳だった件

数か月触れずにいたAndroid Studio。

```
>adb start-server
* daemon not running; starting now at tcp:5037
could not read ok from ADB Server
* failed to start daemon
error: cannot connect to daemon
```
みたいなエラーが発生し、Android Studioからのエミュレータ接続、adbコマンドによる実機接続ができなくなった。前回使用時には発生していなかった現象である。

どないなっとんのか、netstatで見てみる。

```
  TCP         192.168.xxx.xxx:5037       40.90.189.152:https    ESTABLISHED
```
なんやこれ。Wiresharkとかで見ると、数分おきに通信しているように見える。

調べてみると、以下のようなサイトを発見。
[windows10の無用な通信を停止させる方法　2](http://blog.livedoor.jp/push_gci/archives/37237725.html　)

> client.wns.windows.com　　40.90.189.152

なんだかよくわからないが、microsoftの関係者と通信をしているようだ。よりにもよって5037ポートで。ちなみにブラウザでそのようなサイトは開いていない。
詳細はリンク先を参照のこと。

実機にインストールするのが目的だったので、以下の要領で応急措置。

```
adb -P 5038 install -r app-release.apk
```

__まいくろそふと、ばんざい！！！__


2019/09/07 追記：
以下の記事を参考に、ルータに禁足事項を設定してみた。激おこ。
[Windows プッシュ通知サービス (WNS)を拒否する](https://eglsoft.hatenablog.com/)

svchostがやってることなのでいたちごっこだと思うが、5037の不如意な占有という事態は避けられている。
HUAWEIのこと、他人事じゃないねM$さん。
EC2にログインできなかったときに参考にする記事一覧

# はじめに
EC2インスタンスにSSH接続ができない状況があったので、その一覧を以下に記述します。


# 内容
## 【インスタンスを作り直してやる処理】

1. インスタンスにアタッチされているEBSのスナップショットを作りバックアップ
2. 作業用インスタンスを作成する
3. 作業用インスタンスに、対象インスタンスのEBSをアタッチとマウント

※参考：https://qiita.com/keisuke_kimura/items/a7c79f4ab3a954a41780

## 【「/etc/ssh/sshd_config」のAllowUsersを設定してやる処理】

1. 「less /var/log/secure」で「not allowed because not listed in AllowUsers」ログを確認
2. 「sudo less /etc/ssh/sshd_config | grep "AllowUsers"」でAllowUsersを確認
3. viでAllowUsersを消す、もしくは追加したいユーザを追加する

※参考：https://qiita.com/toshihirock/items/897776cfa620c3231737

##【homeディレクトリのパーミッションが所有ユーザー以外に書き込み権限があるとアクセスが拒否対処】

1. 「less /var/log/secure」で「Authentication refused: bad ownership or modes for directory /home/hoge」ログを確認
2. StrictModesをnoに設定

```
$ vim /etc/ssh/sshd_config
StrictModes no
```

※参考：http://teketeke55.hatenablog.com/entry/2012/02/02/165238


## 【「Failed to add the host to the list of known hosts」といわれる場合の対処】

1. オーナー変更

```
sudo chown username /Users/username/.ssh/known_hosts
```

2. 権限変更


```
sudo chmod 600 /Users/username/.ssh/known_hosts
```

※参考：https://teratail.com/questions/59913
【UiPath】パブリッシュ後のロボット実行のログをアクティビティ単位で取得する方法

#困っていること、気になること
　UiPath Studioからの実行、デバッグ時のログには表示されるアクティビティ単位での開始/終了ログが、パブリッシュ後のロボットの実行時(ロボットトレーから実行、Orchestratorから実行など)には表示されない

#対処方法
　１．UiPath Robot(ロボットトレー)を開き、「Orchestratorの設定」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/7e38ac7e-74fc-be3e-408f-919a7a01b28a.png)

　２．ロボットログのレベルを「Infomation」から「Verbose」へ変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/dcb8459f-9736-cf32-a612-05a49cb95a18.png)

※詳細は[UiPathの公式ドキュメント](https://docs.uipath.com/robot/lang-ja/docs/robot-logs#section-execution-logs-logging-level)を参照

#注意点
　1アクティビティの実行やシーケンスへの出入りで開始/終了の2行記載されるので、繰り返しの回数やアクティビティ数が多いロボットはログが膨大になるので注意！

#…というよりは
本番リリースされたはずのロボットから都度ログを全て出す必要があるのかといわれると微妙なところ…
パブリッシュ後の初回リリースなどで一時的にログレベルを下げてあげるのはありだとしても、パブリッシュ後どうしても監視したいアクティビティの稼働確認はTry-Catchと「LogMessage」アクティビティを使ってログを吐き出すようにしたほうが良いと思います。
Amazon DLM を使用してAmazon EBS スナップショットライフサイクルを自動化する

#説明#

[Amazon EBS スナップショットライフサイクルの自動化](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/snapshot-lifecycle.html#dlm-limits)
で、Amazon EBS スナップショットを作成する。

また、CloudWatch イベントWindowsを使用して作成することもできるが今回は割愛する。
[チュートリアル: CloudWatch イベント を使用した、自動化された Amazon EBS スナップショットのスケジュール](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/TakeScheduledSnapshot.html)

#設定#

「ライフサイクルマネージャー」を起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/72566002-4638-deb2-1f0a-98a798ca605d.png)


Name:test というタグをターゲットとし、リソースタイプ：VolumeとInstance 両方につけてやってみよう。


**リソースタイプ：Volume**
スナップショットが作成されたら、test で作成されるようにする。

このポリシーでは、UTC 09:00 から 12 時間ごとにタグ付けされたすべてのボリュームのスナップショットが作成されます。
最大 2 個のスナップショットがターゲットボリュームに保持されます。
保持されている最も古いスナップショットは <= 24 時間前以降のものです。

IAM ロールはデフォルトロールを使用。
スナップショットを作成、削除、記述するアクセス許可と、ボリュームを記述するアクセス許可を持つ IAM ロール。
AWS からデフォルトロール AWSDataLifecycleManagerDefaultRole が提供されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5c422646-5460-bc24-8600-3ff10237e937.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b0a36d49-b273-f362-ab7c-5c42b9f21687.png)


**リソースタイプ：Instance**
スナップショットが作成されたら、testtest で作成されるようにする。

リソースタイプ以外は基本的にリソースタイプ：Volumeと同じとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9f69687b-71cc-0547-fed3-77dd329b401b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/bbb69d48-8a1b-037c-f43f-ae6c35ac8737.png)


**確認**

リソースタイプ：Volume 、test のスナップショットができあがっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b8bc475c-0dc5-f0f3-75fe-921972584113.png)

リソースタイプ：Instance　、testtest も作成されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0f3b248a-ad0e-0242-dacc-1324adc30640.png)


#クロスリージョン#
[Amazon Data Lifecycle Manager で、ポリシーを介したスナップショットコピーの自動化が可能に](https://aws.amazon.com/jp/about-aws/whats-new/2019/12/amazon-data-lifecycle-manager-enables-automation-snapshot-copy-via-policies/)

- リージョン間でスナップショットをコピーできるようになりました。

![スクリーンショット 2020-12-30 17.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/204cc9a1-394e-f7cc-3557-d339c36d3fe6.png)

#クロスアカウント#

- アカウント間でもスナップショットをコピーできるようになりました。

![スクリーンショット 2020-12-30 17.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0cf6aab3-d39e-5155-16e8-6cfd76780302.png)
ReNom -LSTMによる時系列データの異常検知-

#ReNom -LSTMによる時系列データの異常検知-
ReNom URL↓
https://www.renom.jp/ja/notebooks/tutorial/time_series/lstm-anomalydetection/notebook.html


シミュレーションに用いたデータは、
UCR(University of California, Riverside)のEamonn Keoghの論文
[HOT SAX: Efficiently Finding the Most Unusual Time Series Subsequence. In The Fifth IEEE International Conference on Data Mining.](http://www.cs.ucr.edu/~eamonn/discords/)
で使われているデータ。
この論文ではSAX(Symbolic Aggregate approXimation)とよばれる、time series discordsを検出する手法を提案している。

※ 論文Fig１の心電図データの正常な部分をLSTM学習に用いている


#データ１（論文Fig1)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/a0a0a07f-3bf9-78f8-e705-0014f19a3d59.png" width=60%>
##データ1-1　（心電図の𝑉1誘導シグナル？）
###学習
100個の時系列データから、次の1個の観測値を予測している。下図は学習に使った部分のデータ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/d9ef3402-4039-12d2-697c-c6042a0e6eb2.png" width=60%>
**学習曲線**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/e4484ed3-3247-ce5d-1030-0095e3a1324e.png" width=60%>

###検出結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/a66b2a01-2cad-5d0a-5c2f-14d8a541a7ce.png" width=60%>
検出できたが、一部、正常な部分も異常として検出されている。

##データ1-2　（心電図のⅡ誘導シグナル？）
###学習
time 5000〜9000を学習させた。
下図は学習に使った部分のデータ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/32f66590-4919-1406-3dd2-192ab720d077.png" width=60%>
**学習曲線**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/45d97f6d-2682-ecd4-7615-2599f9392aec.png" width=60%>
###検出結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/37e85479-5999-458a-056d-9705f79523bb.png" width=60%>
検出できた。

#データ2（論文Fig12)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/150ec9dd-a35d-e395-5638-21f7931ffc72.png" width=60%>
###学習
上図におけるtime 4600〜9600を学習させた。
下図は学習に使った部分のデータ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/d9a6551b-aaff-f00b-1523-1157d1ea1dc2.png" width=60%>

**学習曲線**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/126fada8-34fc-c891-b0f8-0eb33d7931de.png)

###検出結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/68cadc68-5f02-863d-ad25-aae162d9589e.png)
1st Discord、2nd Discordは検出できている。3rdはどうなんだろう...

#データ3（論文Fig13)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/13d3dee2-0352-2620-637e-10eef35ed69d.png)
###学習
上図におけるtime 0〜1000を学習させた。
下図は学習に使った部分のデータ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/67a7149e-b037-523a-567e-1e97d7c3c8bb.png)
**学習曲線**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/e9b6d1eb-138c-2401-fa32-532fc0100272.png)

###検出結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487846/dd3ebe0f-f057-ef08-b39d-6f274f7240ab.png)
検出できた。
相対パス・絶対パス

#目的
今日からRubyの学習に入りました。
概要と言うこともあり、簡単かな？とも思ったのですが、相対パスと絶対パスの理解にとても時間をかけてしまいました。
これをより深く理解するために以下のようにまとめてみました。



#絶対パス
・ルートディレクトリから指定するパス。
・cd /から始まる
・**郵便**

例：
$ cd /Users/Desktop

#相対パス
・現在いるディレクトリ(カレントディレクトリ)から指定するパス。
・カレント＝今
・**電話**
※カレントディレクトリより上のディレクトリに移動することはできない。

例：
$ cd Users/Desktop




絶対パス、相対パスはそれぞれ郵便・電話に例えることができる。

郵便は特定の住所にいくつかのディレクトリ（郵便局）を経て到達するが、電話は特定の住所に直接連絡することができるため。

（医学で言うホルモンと神経伝達物質の違いと似てます）


ちなみにlinuxコマンド「ls」は、
輸送（移動）可能な郵便局（及び住所）を教えてくれます。
言語処理100本ノックやってみる　18

#18. 各行を3コラム目の数値の降順にソート
各行を3コラム目の数値の逆順で整列せよ（注意: 各行の内容は変更せずに並び替えよ）．確認にはsortコマンドを用いよ（この問題はコマンドで実行した時の結果と合わなくてもよい）．

```py
fname = 'hightemp.txt'
lines = open(fname).readlines()
lines.sort(key=lambda line: float(line.split('\t')[2]), reverse=True)#①key=〇〇〇でどのようにsortさせたいか指定できる！

for line in lines:
    print(line, end='')
```

#参考記事
①lambda式とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/37dee203-bb3a-cf81-efc5-1e1962e5d31c.png)
次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/cb86aa06-4971-6d3f-6297-63fe01b50ba8.png)
次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/d68b49cc-25dd-aafd-7e37-97be3fb17f48.png)
スポットインスタンスを利用して、SageMaker でのモデル作成コストを最大90％削減する

# はじめに
今回は2019年8月28日に発表された、AWS SageMaker によるモデルトレーニング時のスポットインスタンス利用についてご紹介いたします。

**※注意※**
本稿はモデルトレーニング時のスポットインスタンス利用についてご紹介する内容です。
実際にスポットインスタンスを利用する手順や利用した結果を見たい方は以下の記事をご覧ください。

[**スポットインスタンスを利用して、SageMakerのモデルトレーニングをしてみた**](https://qiita.com/NendaiHiroki/items/af745b2b8020e732ee57)

# SageMakerのモデルトレーニングにスポットインスタンスを利用する。

### スポットインスタンスとは
スポットインスタンスとは、AWS クラウド内の使用されていない EC2 リソースを**最大90%安く利用できる**サービスです。
今まで SageMaker のモデルトレーニング時には、オンデマンドインスタンスと呼ばれるインスタンスが利用されおり、オンデマンドインスタンスでは、いわゆる通常料金の支払いが発生していました。
ですが、今回のアップデートで、スポットインスタンスを利用したモデルトレーニングを行うことが可能になり、いままでモデルトレーニングのインスタンスで発生していた料金を最大90％節約できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/00caa9f2-bc9e-08a4-01bc-9acf8a826b31.png)

### スポットインスタンス中断時について
スポットインスタンスは安く使えるという反面、[ある一定条件下](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-interruptions.html#interruption-reasons)でインスタンスを中断するという性質があります。
本来であれば、中断に備えて[いくつかの準備](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-interruptions.html#using-spot-instances-managing-interruptions)をしておくことが必要です。
ですが、AmazonSageMaker のモデルトレーニングでスポットインスタンスを利用する際は、スポットインスタンス中断時に、トレーニングジョブを中断し、適切なスポットインスタンスを再度取得、モデルトレーニングを再開、続行のプロセスを自動で行います。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ed609aa0-0d36-1ea8-8c8f-0b8dba959a91.png)

### どういった場合にスポットインスタンスを利用して、モデルトレーニングを行うのか
スポットインスタンスを利用すれば、料金は安くなり、中断時のプロセスも自動でやってくれて、使わない手はないと思われる方がいるかもしれません。
ですが、1つ**注意点**があります。それは**実行時間**です。  
スポットインスタンス利用時のモデルトレーニングでは、中断時のプロセスが発生する可能性があります。
このプロセスにより、通常のオンデマンドインスタンスでのトレーンング時間に加えて、指定したインスタンスのリクエスト、中断時のプロセス時間がかかります。  
このことから、スポットインスタンスの利用は、モデルトレーニングに重要な時間制限がない場合に限ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/cc07fb81-0a33-289b-bad2-08995a6a2204.png)

# おわりに
今回はモデルトレーニング時のスポットインスタンス利用についてご紹介しました。
次回は実際にスポットインスタンスを利用したモデルトレーニングを行い、どれだけ節約できるか確認します。

[**スポットインスタンスを利用して、SageMakerのモデルトレーニングをしてみた**](https://qiita.com/NendaiHiroki/items/af745b2b8020e732ee57)
ClaspでGoogle Apps Scriptのローカル開発環境を構築する

Google Apps Script（以下GAS）、便利ですよね。
仕事でG Suite使ってるのであれば、ちょっとした作業の自動化だったり、ツールの開発をサクッとできて便利です。
コードをブラウザで書いてすぐに実行できるのもありがたいです。
その反面、ソースコードの管理が疎かになったりするので、ローカルで開発したいというニーズもあったりするみたいです。

そこで、Googleが提供しているCLIツール、[Clasp](https://developers.google.com/apps-script/guides/clasp)を使って、Web上のソースとローカルのソースの同期を取って、
自分の好きなエディタで書いたり、Gitでソース管理したりできるようにしようと思います。

#環境
OS: Windows10 Pro Education
エディタ: VSCode(Version 1.38)

# Claspを導入する
Node.jsをインストールし、以下のコマンドを実行する。
https://nodejs.org/ja/

```powershell
# npmコマンドが実行できるか確認
npm --version

# Claspインストール
npm install -g @google/clasp

# Googleアカウントでログイン
# ブラウザが起動するので画面に従ってログイン、アクセスを許可する。
# クレデンシャルファイルとして、~/.clasprc.jsonが作成される。
clasp login
```

# ローカル開発環境の構築
ついでに、普段Java Scriptを書くことがないので、それっぽい環境を構築します。
VScodeを使う前提で、必要なモジュール、拡張機能を入れていきます。

```powershell
# Eslint、Prettierをインストール
npm install -g eslint
npm install -g prettier
```

その後、VScodeの拡張機能、「Eslint」、「Prettier」をインストールします。
これで構文チェックやフォーマットしてくれます。

# Claspを使ってみる
まずは適当なGASプロジェクトを作ります。適当なコードを書きます。
`コード.gs`を、`main.gs`にリネームしました。
ファイル > プロジェクトのプロパティ
でスクリプトIDを確認してください。このIDを使います。

```powershell
# GASプロジェクトを取得
clasp clone [YOUR_SCRIPT_ID]

# 実行結果
# Cloned 2 files.
# └─ main.js
# └─ appsscript.json
```

これでローカルで編集可能です。なぜかgsだった拡張子がjsになります。
一度cloneしてしまえば、Gitと同じようにpull,pushができます。
スクリプトIDは`.clasp.json`に保持されます。

```powershell
# ローカルの変更をリモートに反映
clasp push

# リモートの変更をローカルに反映
clasp pull
```


# 最後に

僕の職場ではGASを「ガス」って読んでいたんですけど、この前「ギャス」って呼ぶ人に出会いました。
皆さんはどっち派ですか？
MySQLで文字化け Windowsのワナ CSVインポート

CSVファイルからDBにインポートしたくて、試してみた

WindowsのコマンドプロンプトからSELECT文を発行してみると。。。
なんと日本語が文字化けorz

DB,TABLE,my.iniでUTF-8を指定しても文字化け。。。
CSVファイルもUTF-8に変換したのに。。。

もう心が折れかけてる矢先に・・・
下記リンクを発見。

ダメ元で試すと・・clear

参照元：https://qiita.com/na3ksg/items/76415ffe6b9084f5df50

実際にデータはUTF-8で入っていて、コマンドプロンプト上での表示が
合わなかったみたい。
コマンドプロンプトはCP932なんだってね
mujoco_pyの使用例

# はじめに
[公式ドキュメント](https://openai.github.io/mujoco-py/build/html/index.html)を読んでも使い方がよくわからないことが結構あったので、サンプルコードを読んでmujoco_pyの使用例をまとめた。

# 使用例
## シミュレータのインスタンスを作る
```python
import mujoco_py
model = mujoco_py.load_model_from_path(fullpath)
sim = mujoco_py.MjSim(model, nsubsteps=n_substeps)
```

## シミュレータの状態を取得する

```python
state = copy.deepcopy(sim.get_state())
```
## ビュアーからレンダー結果を見る
```python
viewer = mujoco_py.MjViewer(sim)
viewer.render()
```
## ビュアーには写さずRGB画像としてレンダー結果を受け取る
```python
viewer = mujoco_py.MjRenderContextOffscreen(sim, device_id=-1)
viewer.render()
data = viewer.read_pixels(width, height, depth=False)
```
## ビュアーを閉じる
```python
viewer = None
```
## 微小時間dtを得る
```python
dt = sim.model.opt.timestep * sim.nsubsteps
# timestepは1stepあたりにかかる時間で、nsubstepsはステップ中に呼ばれるサブステップ数
```
## 微小時間dtからFPSを求める
```python
FPS = int(np.round(1.0 / dt))
```
## シミュレーションをリセットする
```python
sim.set_state(initial_state)
sim.forward()  # xpos, qposを変更したら呼ぶ必要がある
```
## シミュレーションを進める
```python
sim.step()
```
## 関節を制御する #1
```python
for i in range(action.shape[0]):
    sim.data.ctrl[i] = action[i]
```
## 関節を制御する #2
```python
sim.data.set_joint_qpos('object0:joint', object_qpos)
```
## `site`タグのついたパーツのタスク空間中の位置と速度を取得する
```python
pos = self.sim.data.get_site_xpos('hoge_site')
velp = self.sim.data.get_site_xvelp('hoge_site')
velr = self.sim.data.get_site_xvelr('hoge_site')
```
## 関節変位と速度を得る
```python
for name in sim.model.joint_names:
    qpos = sim.data.get_joint_qpos(name)
    qvel = sim.data.get_joint_qvel(name)
```
## パーツの名前をIDに変換する
```python
# from body name to id
body_id = sim.model.body_name2id('robot0:gripper_link')
xpos = sim.data.body_xpos[body_id]
    
# from site name to id
site_id = self.sim.model.site_name2id('target0')
pos = sim.model.site_pos[site_id]
```
## モーションキャプチャの位置を設定する
```python
sim.data.set_mocap_pos('robot0:mocap', gripper_target)
sim.data.set_mocap_quat('robot0:mocap', gripper_rotation)]
```
# サンプルコード
* [OpenAI Gym fetch_env.py](https://github.com/openai/gym/blob/master/gym/envs/robotics/fetch_env.py)
* [OpenAI Gym robot_env.py](https://github.com/openai/gym/blob/master/gym/envs/robotics/robot_env.py)
JavaScript(wavesurfer.js)を使ってローカルにある音声ファイルの波形を表示

## #1 tl;dr
- Web Audio APIをそのまま利用した記事はたくさんあったのですが、今回は使わず、もっと手軽に表示してくれるライブラリであるwavesurfer.js([参考](https://wavesurfer-js.org/))を使用
- この記事で実現する機能
    - 簡単にローカルファイル読み込み & 読み込んだ音声の波形を表示
    - ZOOM機能
    - start/pause ボタン


## #2 wavesurfer.jsについて

- web audio api上にHTML5 Canvasを用いて作られるカスタマイズ性のあるwaveform visualization
- この記事で紹介するコードを動かすと下図のようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168978/c6c880cf-e165-513f-a0ea-5e62a46f39f7.png)

## #3 HTML file
- CDNを用いているのでこのままコードコピペでOK

```html:index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>wavesurfer sample</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/wavesurfer.js/3.0.0/wavesurfer.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>
</head>

<body>
    <input id="audio_file" type="file" accept="audio/*" />

    <div id="waveform"> </div>

    <div style="text-align: center">
        <div id="menu">
            <button id="btnStartPause" class="menubutton">start/pause</button>

        </div>
        <p class="row">
            <div class="col-xs-1">
                <i class="glyphicon glyphicon-zoom-in"></i>
            </div>

            <div class="col-xs-10">
                <input id="slider" type="range" min="1" max="200" value="1" style="width: 100%" />
            </div>

            <div class="col-xs-1">
                <i class="glyphicon glyphicon-zoom-out"></i>
            </div>
        </p>
    </div>

    <script src="app.js"></script>
</body></html>
```

## #4 Javascript file
- これもコピペ

```javascript:app.js
var wavesurfer = WaveSurfer.create({
    container: '#waveform',
    waveColor: 'hotpink',
    progressColor: 'orange',
    scrollParent: true
});

audio_file.onchange = function () {
    let files = this.files;
    let file = URL.createObjectURL(files[0]);

    var slider = document.querySelector('#slider');

    slider.oninput = function () {
        var zoomLevel = Number(slider.value);
        wavesurfer.zoom(zoomLevel);
    };
    wavesurfer.load(file);
};

wavesurfer.on('ready', function () {
    wavesurfer.play();
});

$("#btnStartPause").click(
    play = function () {
        wavesurfer.playPause();
    }
);

```

## #5 感想
- 細かい機能はライブラリ依存になってしまうため、例えばzoom機能においてx軸の拡大/縮小はできるが、y軸はできない
    - github見てもわかる通り最近でも頻繁に更新されているため今後追加される可能性あり
- 細かいことは気にせずにとりあえず表示したい人にオススメなライブラリ
Cognos Analytics 11 でのデータ量制限設定の動作

#Cognos のデータ量制限
レポート実行時に大量過ぎる行を取得して、Cognosサーバーのリソースを長時間占有してしまう事を防ぐため、結果セットの容量に制限をかけたい、というのは常にある要件です。

これに関して、Cognos 10 BIの時に以下の記事を書きました。

**Cognos BI でデータ量の制限をする方法**
https://qiita.com/shinyama/items/2989ef0f6947597ae672

パッケージがCQMの場合はFramework Managerのガバナー、DQMの場合はqsMaxCrossjoinOrderOfMagnitude を使う、という内容でしたが、マニュアル等のどこにも記載は見当たらないのですが、Cognos Analyticsでやってみると、どうも動作が変わっているようなので共有しておきます。

#Cognos Analyticsでのデータ量制限
どちらもDQMモードでの結果を記載しますが、まず前提として、Framework Managerで作成するモデルには、クエリーサブジェクトのみで作成される「リレーショナルモデル」と、ディメンションなどの階層構造を持つ「DMRモデル」があります。

**qsMaxCrossjoinOrderOfMagnitudeの設定が有効になるケース**
DQMモードで、DMRモデルのパッケージを使用している場合のみ有効のようです。
Cognos 10 BIでは、DQMのリレーショナルモデルでもこの設定が効いたのですが、Cognos Analyticsでは効かなくなっているようです。

**Framework Managerのガバナーが有効になるケース**
DQMモードで、リレーショナルモデルの場合、Framework Managerのガバナーで指定される「取得した行の最大数」などの設定が効くようになりました。
Cognos 10 BIではCQMしか効きませんでしたが、変わりましたね。

検証はCognos Analytics 11.0.13で試してみた結果です。
Cognos Analytics の最初のバージョンからこの動作なのか、途中のバージョンからなのかわかりませんが、少なくとも今後のプロジェクトで使用されるバージョンでは、こちらの動作を前提に考える事になると思います。

一応ご使用前には、実機でご確認頂ければと思います。

#DQMのガバナーで実行時間の制御は不可
追記ですが、Framework Managerのガバナーに「クエリー実行時間の上限 (秒): 」がありますが、DQMの場合は効きません。あくまで「取得した行の最大数」のみが有効となりますのでご注意下さい。
[Python3] ファイル名一括変更(桁合わせ連番ver)

ざっくりと。

# Python3でファイル名を一括変更する方法(連番)

○○.jpg(.txtとか拡張子は何でも)が一杯入っているフォルダに、以下のpyファイルをおき、実行します。

```python:rename_files.py
import glob
import os

files = glob.glob("*.jpg")
for i, old_name in enumerate(files):
    # ファイル名の決定
    new_name = "新しい名前_{0:03d}.jpg".format(i + 1)
    # ファイル名の変更
    os.rename(old_name, new_name)
    # 変更の表示
    print(old_name + " → " + new_name)

```
新しいファイル_001.jpg、新しいファイル_002.jpg...と桁合わせした連番になります。


ディレクトリとか拡張子が違うときは

```python
files = glob.glob("*.jpg")
```
を変えればいいです。



変更後のファイル名は

```python
# ファイル名を決定する
    new_name = "新しい名前_{0:03d}.jpg".format(i + 1)
```
をいじれば変えられます。

これをベースにいろいろいじればファイル名は好きなように変えられそうです。

拡張子を誤って変えてしまう可能性があることに注意ですかね。
eclipse で「Post Startup 中に内部エラーが発生しました。」が出た場合の対処法

![port.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185260/aaf5ecd5-9a9c-0f07-4d84-8e605ac11924.jpeg)

↑のメッセージが出た場合にはエクリプスの作業ディレクトリ
「.metadata/.plugins/org.eclipse.core.runtime/.settings/」の中にある
「server.core.prefs」系のファイルを削除するか修正すれば治る。

phpの場合には以下のファイル名
org.eclipse.php.server.core.prefs
CircleCI Orbsでデプロイ承認ボタンを作ってSlackに通知させる

## 概要
以前、[CircleCI OrbsでECS Fargateのデプロイを自動化](https://qiita.com/takemotto/items/f304c05e41bf0e94b696)という記事を書いたのですが、
この仕組みだと特定のブランチにマージしたタイミングで自動デプロイが走ってしまいます。


本番環境だけは、`マージ＝デプロイ` でななく、任意のタイミングでデプロイしたいってこともあると思うので、
CircleCI Orbsを使ってそのあたりを制御したい思います。

イメージとしては、特定のブランチにマージした段階で
![スクリーンショット 2019-09-05 14.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/eb3d0b0d-faf3-b517-d606-baa3679ab35c.png)
と言うようなSlack通知が来て、`Visit Workflow`のリンクを踏むと
<img width="507" alt="スクリーンショット 2019-09-05 14.26.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/bf701733-3070-4f15-e917-89992d89cdfb.png">
が表示され、`Approve`をクリックすると、デプロイできるという仕組みが作れます。


## 前提条件
* CircleCIとGithubのインテグレーションは設定しておく

## 設定
[前回](https://qiita.com/takemotto/items/f304c05e41bf0e94b696#circleciconfigyaml-%E3%81%AE%E8%A8%AD%E5%AE%9A)のconfig.yamlを基に設定してみます。
前回からの差分のみコメントを入れてます。

```yaml

version: 2.1
orbs:
  aws-ecr: circleci/aws-ecr@1.0.0
  aws-ecs: circleci/aws-ecs@0.0.6
  slack: circleci/slack@3.3.0 # (1)circleci/slack 設定

executors:
  docker_build:
    machine:
      docker_layer_caching: true

workflows:
  build-and-deploy:
    jobs:
      - build
      - aws-ecr/build_and_push_image:
          executor: docker_build
          name: 'build-staging'
          account-url: AWS_ECR_ACCOUNT_URL
          region: AWS_REGION
          repo: '<ECRのリポジトリ名>'
          tag: "${CIRCLE_SHA1}"
          path: ./
          dockerfile: Dockerfile-staging
          requires:
            - build
          filters:
            branches:
              only:
                - staging
      - slack/approval-notification: #(2)Slack通知用jobを追加
          message: "<Your APP NAME>ステージング環境へのデプロイを承認してください。"
          color: "#F5E911"
          requires:
            - build-staging
      - approval-deploy: #(3)承認用jobを追加
          type: approval
          requires:
            - build-staging
      - aws-ecs/deploy-service-update:
          requires:
            - build-staging
            - approval-deploy #(4) approval-deployで承認されるないと走らない
          family: '<Fargateのタスク定義名>'
          service-name: '<Fargateのサービス名>'
          cluster-name: '<Fargateのクラスタ名>'
          container-image-name-updates: 'container=<タスク定義で設定したコンテナ名>,image-and-tag=${AWS_ECR_ACCOUNT_URL}/<ECRのリポジトリ名>:${CIRCLE_SHA1}'
          filters:
            branches:
              only:
                - staging
```

ざっくり解説すると、

* (2) でSlack通知用の詳細設定を入れて
* (3) でさきほどの例で示した承認ボタンを作ります。
* (4) でデプロイするんですが、`requires`に`approval-deploy`を入れてるため、承認ボタンが押されるまではデプロイが走りません。

(2)に関しては、メンションもつけることが可能なので詳細は、[オフィシャルドキュメント](https://circleci.com/orbs/registry/orb/circleci/slack)を参考にしてください。

基本的に当該リポジトリへの権限がある人しか承認ボタンを押せないとと思うので、
ある程度はセキュリティは担保できるかと。ちなみに誰が承認したかも分かります。

## 参考文献
この記事は以下の情報を参考にして執筆しました。

[CircleCIのManual Approval機能を試した](https://yoshitaku-jp.hatenablog.com/entry/2019/03/07/080000)
非圧縮TIFF画像から星景写真を合成するアプリtiffcomp

## 概要
学部1年生の頃に開発したソフトウェアの書き起こしです．

星景写真：**星と地上の景色が一緒に写っている写真**
（星を流すもの，流さないものがあるが，ここでは流すものを扱う）

![R-aps-2263-3177.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286106/8200721a-42b6-a4c3-d4c0-796933662fa1.jpeg)

星景写真の撮影法の1つに，比較明合成という方法があります．カメラを三脚に固定し，同じ構図で数百枚の写真を撮って，ソフトウェアで各ピクセルの輝度のmaxをとり1枚の画像にするという方法です．

合成語に手直しすることを考えると，jpgファイルより，データ量の大きいrawまたはtiffファイルで合成する方が好ましいです．
しかし，rawやtiffでこの合成を行うソフトウェアは，有償のプロプライエタリなソフトウェアしか見当たりませんでした．気に食わなかったので，自らOSSとしてソフトウェアを作成しました．


## アルゴリズム
ヘッダ等の，ピクセル以外のデータについては，1枚目のデータをそのまま利用するものとする．そのため，1枚目の全データを出力ファイルとして出力し，それからピクセルデータの合成・書き込みを行う．

また，画像データ1枚は数十MBほどのサイズであり，愚直に全ての画像データを同時にメモリに載せることはできない．各画像ファイルに対して処理をするのではなく，各ピクセルに対して処理を行うことでこれを解決する．

```
Input 画像ファイル a0, a1, ... , an
Output 画像ファイル out

a0 の全データを out としてwriteする．

ピクセルについて，左上から右下まで繰り返し：
    p番目のピクセルに注目しているとする．
    a0~anのp番目のピクセルの数値を読み込み，輝度が最大となるピクセルの値を得る．
    最大値をoutのp番目のピクセルに書き込む．
```

## ソースコード
当時はC言語しかまともに使えなかったので，Cで書きました．
https://github.com/ryhoh/tiffcomp

### 使い方

```shell-session
$ ./a.out (画像1のパス) (画像2のパス) ...
```

## まとめ
非圧縮なtiffファイルで比較明合成ができるようになりました．このソフトウェアのおかげで当時は捗りました．
写真から遠ざかっていたため長らく放置状態でしたが，Thetaで遊ぶようになったので，また使う機会があるかもしれません．
webpack-dev-serverで立ち上げたMacのローカルサーバーにiPhoneからアクセスを可能にする

# はじめに
趣味でWEBアプリを開発中している時、
今までローカルではMacBookのブラウザのみでのチェックをしていて、
iPhoneからの確認はグローバルサーバーにアップしてから確認をしていました。

でも、iPhoneで確認しながら微調整をしたい場合、
いちいちアップして修正してみたいの繰り返すのは大変なので、
ローカルからiPhoneで確認できる方法を調べました。

ネットにて色々先人の方々が指南してくれていたのですが、
私が今回サーバーを立ち上げていたwebpack-dev-serverを考慮したやり方はパッと見つからなかったので、まとめておきます。

#前提条件
MacBookとiPhoneは同一ネットワーク（Wi-Fi）内に接続してください。

# MacBook側の操作
まず、MacBookのIPアドレスを確認します。
MacBookのIPアドレスは「システム環境設定」→「ネットワーク」で確認することができます。
![IMG_6284.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458187/e2808df5-3755-f057-9d35-75701e4e1c1a.jpeg)
上図の赤線が引いてあることに記載されています。

今回は仮にIPアドレスが「192.168.10.1」ということにして以下進めていきます。

確認したIPアドレスをpackage.jsonに追記します。

```package.json
"scripts": {
    "start": "webpack && webpack-dev-server --mode development --host 192.168.10.1",
```
この状態でnpm startを叩くと、
デフォルトでは

```
Project is running at http://localhost:8080/
```
となっていたところが、

```
Project is running at http://192.168.10.1:8080/
```
という表記に変わります。

以上で、MacBook側の操作は終了です！

# iPhone側の操作
safariやGoogle Chrome等のブラウザを開き、URLの部分に
`http://192.168.10.1:8080`
と入力します。

以上で、iPhone側の操作は終了です！

私はこれで接続することができました！
以上です！
（ドットインストール）Java8入門_感想

全43回の動画をひととおり見た。

難しく感じたのは主にこのへん。
・methodのoverload
・classの継承
・パッケージ
・ラムダ式

入門書や基礎知識系サイトを読んでから改めて見てみようと思う。

実装に関する話は全く出てこなかったので、
次は【Androidレイアウト入門】の動画を見てみつつ実装を学びたい。

レイアウトとデータベース・リストについて勉強して、
一旦（モチベーション維持のために）自分用に買い物リストアプリか何かを作ってみられればいいかな。
GAS 日付処理メモ

GASでの日付処理はたくさんの記事がネットにあるが単純に文字列からDATE型に変換する方法の調査に時間がかかったため、メモ
こちらの記事が最も端的でした。

https://zukucode.com/2017/04/javascript-string-date.html
VueのFunctional Componentsに親で付与したCSSを読み込む方法

以下のように Vue の Functional なコンポーネントを親から呼び出します。

```vue:AppButton.vue
<template functional>
  <button class="app-button">
    <slot />
  </button>
</template>

<style lang="scss" scoped>
.app-button {
  background: red;
}
</style>
```


```vue:親コンポーネント
<template>
  <AppButton class="button-test">ボタン</AppButton>
</template>

<script>
import AppButton from '~/components/AppButton'

export default {
  components: {
    AppButton
  },
}
</script>

<style lang="scss" scoped>
.button-test {
  margin: 10px;
}
</style>
```

このとき、親で定義した`.button-test`は**読み込まれません**。

詳しくは [vue\.js: functional componentとscoped css \- ぬまのそこ](http://namazu-tech.hatenablog.com/entry/2018/09/17/013041) あたりの記事が参考になるのですが、執筆時点ではこの記事の対処法は動作しませんでした。

そこでもう少し調べると、以下のように書けば良いことが分かりました。

```vue:AppButton.vue
<template functional>
  <button class="app-button" :class="data.staticClass">
    <slot />
  </button>
</template>

<style lang="scss" scoped>
.app-button {
  background: red;
}
</style>
```

これで親で定義した class が読み込まれたかと思います。以下の issue に感謝。

["class" and "style" attributes have no effect on functional SFC components · Issue \#7985 · vuejs/vue](https://github.com/vuejs/vue/issues/7985)
サーバーへのログインをshellscriptを使用して自動化する

会社で開発用のサーバー等にログインするためのログイン専用の.ttlファイルを貰ったけど、
「いやワイMacだからそのファイル動かせんわ...」と思い、shellscriptに書き直す羽目に。

ShellScript完全初心者なので、まあ適宜修正しつつ動かせたらええわって感じで作成してみましたんご。

このShellScriptの流れとしては以下のようになっています。
1. 踏み台サーバーにssh接続しログイン
2. その後、踏み台サーバーから任意のサーバーにログインする


# ShellScriptで踏み台サーバーに自動ログインする
自動とか付けるとなんとなくカッコいい感じするけど全くそんなことはなく、ただコマンドを書いて勝手に実行してくれているだけ...

まず設定だけを書いていきます。

```shell
HOSTADDR='10.100.10.30'   # 踏み台IP
USERNAME='username'       # USER
FILE='~/hoge/key.pem'     # 保有している秘密鍵のPATH
```

その後、expectコマンドを使用して応答に応じてコマンドを投げます。
### expectコマンドとは
コマンドの返答に応じて、自動的にコマンドを対応してくれる便利なやつらしい
[expectコマンド：参考資料](https://qiita.com/Dace_K/items/06e6ce232b77ff242d5a)

以下の書式で使用する感じ。

```shell
expect -c "
set timeout 5
spawn [実行したいコマンド]
"
```
上記の[実行したいコマンド]の部分にssh接続のコマンドを書いていけば飯田健吾。
$USERNAMEとかは上記で設定した変数を参照している。

```shell
expect -c "
set timeout 5
spawn ssh -i $FILE $USERNAME@$HOSTADDR
"
```
ここまでの記述で実行すると踏み台サーバーまでのログインを実行出来ますンゴ。

```shell
#!/bin/sh

####################################
# hoge-web-serverにログインするためのシェル
####################################

HOSTADDR='10.100.10.30'   # 踏み台IP
USERNAME='user-name'      # USER
FILE='~/Work/key.pem'     # 鍵

expect -c "
set timeout 5
spawn ssh -i $FILE $USERNAME@$HOSTADDR
"
```

ただここまでは踏み台までしか入れず。
実際にWebサーバーなり、DBサーバーなり入りたいところがあるはずです。

なので踏み台サーバーにログインしたら、該当のWebサーバーに入りたいと思います。

## 踏み台サーバーから別サーバーに自動ログインする

踏み台サーバーから別サーバーにログインする際にも鍵は必要だと思いますが、~./ssh/とかに鍵を置く場所があると思うので、そこに鍵を置いている前提で話が進みます。

再度expectコマンドを用いて、踏み台サーバーにログインした後に行きたいサーバーを指定してあげればいいだけ。

expectの部分は実際にどんな値が来るかによって変更が必要なので、ここは適宜で修正してくだちい。

### sendコマンドとは
コンピューター側に入力項目を受付させるコマンドですね。
上で使用している`spawn`とは違い、命令を送るわけではなく、あくまでユーザー側が任意の値をコンピューター上に送るコマンドになります。（合っているはずや）

またsendコマンドの後に\nを書いている理由は「命令終わり！！　Enterパチーン」って感じで入力を終わらせてると思ってください。

### interactコマンドとは
命令が終わり次第、ユーザー側に入力応答を受け付けるコマンドです。（ニュアンス合っているか不安なんやけど）


```shell
expect \"$\"
send \"ssh hoge-web-server\n\"
interact
```

これで踏み台サーバー→別サーバーに自動でログインをする機能が出来ました！
全体像は以下。

```shell
####################################
# hoge-web-serverにログインするためのシェル
####################################

HOSTADDR='10.100.10.30'   # 踏み台IP
USERNAME='username'       # USER
FILE='~/Work/key.pem'     # 鍵

expect -c "
set timeout 5
spawn ssh -i $FILE $USERNAME@$HOSTADDR
expect \"$\"
send \"ssh hoge-web-server\n\"
"
```

終わり！！！
まだWindowsの人でも使用できるか動作確認していないのでちょい微妙ですが、Macの人はとりあえず動きますー！
GCP アップデート (8/30-9/5 2019)

### Composer: [Aug 30, 2019](https://cloud.google.com/composer/docs/release-notes#august_30_2019)
- Composerがシドニー(australia-southeast1)とモントリオール(northamerica-northeast1)で使えるようになったよ。

### BigQuery: [Aug 30, 2019](https://cloud.google.com/bigquery/docs/release-notes#aug_30_2019)
- データセットをリージョン間でもコピーする機能がベータになったよ。

### Dataflow: [Sep 3, 2019](https://cloud.google.com/dataflow/docs/resources/release-notes-service#september_3_2019)
- バッチパイプラインでキーの偏りを検知してメッセージを出力してくれるhot key detectionがBeam 2.15.0以上で使えるようになったよ。

### Compute: [Sep 3, 2019](https://cloud.google.com/compute/docs/release-notes#september032019)
- 1-megamemとn1-ultramemマシンタイプがm1-megamemとm1-ultramemにリネームされたよ。
- M1マシンタイプが台湾、ロンドン、ムンバイで使えるようになったよ。

### Dataproc: [Sep 3, 2019](https://cloud.google.com/dataproc/docs/release-notes#september_3_2019)
- サブマイナーバージョンが出たよ。
  - 1.1.120-debian9, 1.2.83-debian9, 1.3.43-debian9, 1.4.14-debian9, 1.3.43-ubuntu18, 1.4.14-ubuntu18

### BigTable: [Sep 3, 2019](https://cloud.google.com/bigtable/docs/release-notes#2019-09-03)
- 書き込みリクエストの例と説明のドキュメントがリリースされたよ。

### Istio on GKE: [-](https://cloud.google.com/istio/docs/istio-on-gke/release-notes#istio_103-gke0)
- ISTIO-SECURITY 003と004を修正した1.1.13がリリースされたよ。

### Compute: [Sep 4, 2019](https://cloud.google.com/compute/docs/release-notes#september042019)
- ゾーナルリソースを予約する絹おがGAになったよ。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
CWLで、location と path なら、location を使ったほうが良い

# 概要

`location` を使ったときは、いろいろ良しなにやってくれるのだが
`path` を使うと、はまりがち
`--make-template` したときにはまりがち。
これが、 `path` を出力してくるので、それに従う人が多い

# 結論

`path`や`location`ではまったら仕様を確認しよう。

# たとえば

`location` は相対パスがかける
`path` では、相対パスがかけない（と、思っていたが、処理系依存の可能性あり）

URLも、`location` にはかける

`path` はファイルシステム側の話になるはず、それも、 `location` なら、 `file:///`でいけるので。

TODO: 仕様を確認する