OmniAICreator/Qiita-1.07M huggingface dataset:
JR西日本・近畿の指定路線の1分以上遅延のある電車を通知する

前回
https://qiita.com/k_kado__j_ichi/items/7081bc62618bef32eb0e
の続きです

beautiful soupに路線名とデータの一覧を作ってもらいます

```
> pip install bs4
```

https://www.train-guide.westjr.co.jp/area_kinki.html
の左側にあるメニューから路線名とリンク先を取得してjson用に書き換えます

``` .py
#jsonここにある
jsonbase = 'https://www.train-guide.westjr.co.jp/api/v3/'

#近畿各路線のjson特定
try:
    pages = requests.get('https://www.train-guide.westjr.co.jp/area_kinki.html')
    pages.raise_for_status()
    soup = bs4.BeautifulSoup(pages.content, "html.parser")
    for i in soup.select(".routeList_item-link"):
        linename = i['title']
        lineurl = i['href'].replace('.html','.json')
        line[linename] = lineurl
except:
    #何もせず終了する
    pass
url = jsonbase + line[args[1]] 
url_st = url.replace('.json','_st.json')

```

取れた近畿各路線名は以下の通りです

```
北陸線・琵琶湖線
JR京都線
JR神戸線・山陽線
赤穂線
湖西線
奈良線
嵯峨野線
山陰線
山陰線
おおさか東線
JR宝塚線
JR宝塚線・福知山線
JR東西線
学研都市線
播但線
舞鶴線
大阪環状線
JRゆめ咲線
大和路線
阪和線・羽衣線
関西空港線
```
のでオプションに路線名を指定すると遅延情報が返ってくるようにしました

```delaycheck.py

import json
import urllib.request
import requests, bs4
import sys

args = sys.argv

dictst = {}
dictline = {}
payloadstr = ''
line = {}

#jsonここにある
jsonbase = 'https://www.train-guide.westjr.co.jp/api/v3/'

#近畿各路線のjson特定
try:
    pages = requests.get('https://www.train-guide.westjr.co.jp/area_kinki.html')
    pages.raise_for_status()
    soup = bs4.BeautifulSoup(pages.content, "html.parser")
    for i in soup.select(".routeList_item-link"):
        linename = i['title']
        lineurl = i['href'].replace('.html','.json')
        line[linename] = lineurl
except:
    #何もせず終了する
    pass
url = jsonbase + line[args[1]]
url_st = url.replace('.json','_st.json')

#遅延取得
try:
    res = urllib.request.urlopen(url)
    res_st = urllib.request.urlopen(url_st)
    data = json.loads(res.read().decode('utf-8'))
    data_st = json.loads(res_st.read().decode('utf-8'))

    for station in data_st['stations']:
        dictst[station['info']['code']] = station['info']['name']
    for item in data['trains']:
        if item['delayMinutes'] > 0:
            stn = item['pos'].split('_')
            try:
                position = dictst[stn[0]] + '辺り'
            except KeyError:
                position = "どこかよくわかんない"
            payload = [item['displayType'], item['dest']['text'],'行き:',item['delayMinutes'],'分遅れ',position]
            payloadstr += ' '.join(map(str,payload)) + '\n'
    if not payloadstr:
        print(args[1] + 'に電車遅延はありません')
    else:
        print('【' + args[1] + 'の遅延情報】\n' + payloadstr)

except urllib.error.HTTPError as err:
    print('HTTPError: ', err)
except json.JSONDecodeError as err:
    print('JSONDecodeError: ', err)
```

```
>delaycheck.py JR神戸線・山陽線
```

出力結果

```
【JR神戸線・山陽線の遅延情報】
普通 新三田 行き: 1 分遅れ 新大阪辺り
普通 京都 行き: 1 分遅れ 元町辺り
普通 西明石 行き: 1 分遅れ 鷹取辺り
普通 新見 行き: 1 分遅れ 上郡辺り
```
あとは

```
> pip install slackweb
```

```.py
import slackweb
slack = slackweb.Slack(url="https://hooks.slack.com/services/~~~~~~~~~~")
.
.
.

    if not payloadstr:
        slack.notify(text = args[1] + 'に電車遅延はありません')
    else:
        slack.notify(text = '【' + args[1] + 'の遅延情報】\n' + payloadstr)
```
とかで毎朝通勤前にSlackに投げるとかLINEに投げるとか・・・
このままではアレなのでスマホから使えるようにするとかもうちょっと使い勝手を良くしたい
さくらのレンタルサーバー(ライトプラン)でもbuildしたい

ライトプランではSSHで接続できないのでソースコードから build することができない……ことはないのです。

**――そう、CGIならね！**

## はじめに

さくらが想定した使い方ではないので、すべて自己責任でお願いします。

## 危険なラッパーを作る

どんなスクリプトでもCGIとして動かせるラッパーを作ります。いうまでもなく危険なので build するときだけ置くようにしましょう。

```shell:danger.sh
#!/bin/sh

export USER=`echo -n $DOCUMENT_ROOT | awk -F/ '{print $3}'`
export HOME=/home/$USER
export QUERY_STRING=`echo $QUERY_STRING | awk '/^[[:alnum:]\._-]+$/ {print}'`

IFS=$'\n'
for line in `cat .htaccess`
do
    directive=`echo -n $line | awk '{print $1}'`
    if [ "$directive" = "SetEnv" ]; then
        export `echo -n $line | awk '{print $2"="$3}'`
    fi
done

echo "Content-Type: text/plain"
echo ""

exec ./$QUERY_STRING
```

CGIなので`USER`や`HOME`といった基本的な環境変数もセットされていません。使うことも多いので準備します。

`while`の中で .htaccess の`SetEnv`ディレクティブを読み込んで環境変数にセットしています。
CGIは`suEXEC`で実行される都合上、環境変数を親プロセスから引き継いでくれないため、.htaccess で `SetEnv` しても反映されません。それをここで無理やり反映させています。

## 危険な .htaccess の配置

標準では `.sh` のファイルはCGIとして認識されないので .htaccess で設定します。

```
<Files "*.sh">
    Options +ExecCGI
    SetHandler cgi-script
</Files>
```

上で説明したように`SetEnv`も使えます。

一般的なWebサーバ同様、さくらのレンタルサーバーでも .htaccess はブラウザでアクセスすることはできません。秘密の情報を書くならここに書くのが安全かもしれませんね。

(※`SetEnv`では、環境変数と値の区切りはスペースです)

```
<Files "*.sh">
    Options +ExecCGI
    SetHandler cgi-script
    SetEnv TOP_SECRET I_AM_A_CAT
</Files>
```

## 危険な方法で動かすスクリプトの用意

動作させるスクリプトの名前には英数字、アンダースコア(`_`)、ハイフン(`-`)、ピリオド(`.`)しか使えません。引数を与えることもできません。

スクリプト自体は`exec`で実行できるものならなんでもOKです。(条件さえそろえばバイナリもいけます)

テストはこんな感じにしました。

```shell:bomber.sh
#!/bin/sh
env
```

## 危険な実行

レンタルサーバーのコントロールパネルから「ファイルマネージャー」を使って危険なラッパーと動作させたいスクリプト、.htaccess をアップロードします。

危険なラッパーが`danger.sh`、スクリプトが`bomber.sh`という名前だったら、以下のURLにブラウザでアクセスします。

```
https://www.example.com/danger.sh?bomber.sh
```

## 危険な理由

……わかるな？

(追記: `QUERY_STRING`の文字チェックをするようになったので下のは動かなくなりました。よかったよかった)

```
https://www.example.com/danger.sh?ls
```
```
https://www.example.com/danger.sh?yes
```

## 危険でもやりたい人向けの注意点

CGIならではの注意点がいくつかあります

* 処理に時間がかかると強制終了(`KILL -9`)させられてしまいます。大きなものを build するのは難しいです。(Python 3.7 を入れようとしたら `make test` で止まった)
* 標準エラー出力はサーバのコントロールパネルから「アクセスログの確認」→「エラーログ」で見ることができます。ただし1000行までなので、長くなりそうな場合はリダイレクトしたほうがいいと思います。

* **終わったら消すのを、くれぐれも忘れずに！**

## 危険ついでのおまけ

せっかくなのでPerlでも書いてみました。

```perl:danger.pl
#!/usr/bin/perl

if ( $ENV{DOCUMENT_ROOT} =~ m|^(/home/([^/]+))/| ) {
    $ENV{HOME} = $1;
    $ENV{USER} = $2;
}
my $qs = $ENV{QUERY_STRING} if ( $ENV{QUERY_STRING} =~ m|^[a-zA-Z0-9\._-]+$| );

open(FIN, '<', '.htaccess');
while ( <FIN> ) {
    chomp;
    s/^\s*//;
    my @items = split(/\s+/);
    if ( $items[0] eq 'SetEnv' ) {
        $ENV{$items[1]} = $items[2];
    }
}
close(FIN);
print "Content-Type: text/plain\n\n";

exec("./$qs")
```

.htaccess のシェルスクリプトとPerlの両対応バージョンは、スマートに`FilesMatch`にしました。

```
<FilesMatch "\.(sh|pl)$">
    Options +ExecCGI
    SetHandler cgi-script
    SetEnv TOP_SECRET I_AM_A_CAT
</FilesMatch>
```

ここに掲載しているすべてのスクリプトは GitHub にも置いています。
https://github.com/keioni/qiita-sample/tree/master/201908_sakura_lightplan_hack
CSVファイルをSQL結果風に表示するシェルスクリプト

このシェルスクリプトを作った経緯は割愛します。

CSVをSQLのテーブルみたいに変換するだけのシェルスクリプトです。(中身ほぼawkです…)

```bash:csv_parse_sqldisplay.sh
#!/bin/bash

cat $1 | LANG=C awk -F, '
{
    column_max_length[NF]
    # NF=列数
    # NR=行数
    data[0][NF]

    for (col_num=1; col_num<=NF; col_num++) {
        data[NR][col_num] = $col_num
    }

    if (NR == 1) {
        for (i=1; i<=NF; i++) {
            column_max_length[i] = 0;
        }
    }

    for(i=1; i<=NF; i++) {
        if (length($i) >= column_max_length[i]) {
            column_max_length[i] = length($i)
        }
    }
}
function separator() {
    printf("%s","+")
    for (m in column_max_length) {
        for (j=0; j<column_max_length[m]+2; j++) {
            printf("%s","-")
        }
        printf("%s","+")
    }
    print("")
}
END {
    for (row=1; row<=NR; row++) {
        if (row == 1 || row == 2) {
            separator()
        }
        for (col=1; col<=NF; col++) {
            printf("|")
            space_num = column_max_length[col]-length(data[row][col])
            for (x=0; x<space_num; x++) {
                printf("%s"," ")
            }
            printf(" %s ", data[row][col])
        }
        print("|")
    }
    separator()
}
'
```

【実行方法】
引数にCSVファイルを与えて実行します。
※CSVに全角文字が入ると表示が崩れます。(良い方法があればコメントいただけると大変嬉しいです。)

```:実行例
[hoge@local: ~]$ sh csv_parse_sqldisplay.sh test_data.csv
+----+-------------+------------------+---------------+----------------------+--------------------+
| id | postal_code | prefectures_code |  phone_number |                email |          date_time |
+----+-------------+------------------+---------------+----------------------+--------------------+
|  1 |    855-0151 |               18 | 080-3454-3698 |   OK_LI5@example.com | 2012/5/14 23:24:45 |
|  2 |    884-9283 |               14 | 080-5785-8416 |     w4dIMm6@test.com |   1976/9/9 9:12:50 |
|  3 |    105-8176 |               08 | 080-6521-4194 |       i7z6FM@test.jp |  2013/6/17 0:42:10 |
|  4 |    946-3408 |               11 | 090-0974-2227 |   GmeWUoL@sample.org |  2006/6/4 18:54:44 |
|  5 |    540-4290 |               22 | 090-9204-0243 |    PiLueGZht@test.jp | 2001/7/14 15:59:58 |
|  6 |    608-6516 |               14 | 080-2702-9315 | T1siLNEbc@example.jp | 1980/7/14 18:36:40 |
|  7 |    077-4354 |               31 | 090-6172-4143 |      mLgwOL@test.com | 2008/5/12 20:48:12 |
|  8 |    139-6143 |               04 | 090-5286-6431 |    jMzp9O21@test.net | 1993/2/20 23:46:50 |
|  9 |    098-3460 |               41 | 080-5108-5681 |     bMnYW@sample.com | 1992/6/13 17:52:03 |
| 10 |    354-5744 |               02 | 090-8018-7223 |   Ipcjl@sample.co.jp |  2016/5/8 20:26:07 |
+----+-------------+------------------+---------------+----------------------+--------------------+
```
Oracle Master Sliver 12c に合格しました!!

ORACLE MASTER Silver Database 12cに合格しました
せっかくなので合格まで流れを残しておこうと思います。

#勉強時間#
* 学習期間：3ヶ月　※100時間以上は勉強したかな
<br>
私は業務でOracleDBをほとんど使用したことがないので、合格するまでにかなり<br>
時間がかかりました。実務でOracleDBを使用したことがない人は2ヶ月～3ヶ月は<br>
かかると思います。


#感想#
11gの白本や12cの黒本と似たような問題は出てきますが、選択肢に見たことの
ないような事柄が出てきて、悩むことがけっこうありました。試験を受けていて
問いの出し方が問題集と異なると分からなくなることがあるので、複数の問題集で
勉強してパターンを掴んでおく必要はあるかなと思います。

**ギリギリで合格でした😅😅😅**
![オラクル資格1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487273/44f53902-be9c-1d52-7262-27d342e81bb7.png)

#教材#
###テキスト###
下記の2冊はお勧めです。特に白本の方は参考書部分と解説が充実していました。
試験ではコマンド系の問題がかなり出てきたのでコマンド系の問題が多い黒本も
やっておいた方がいいと思います。

[**オラクルマスター教科書 Silver Oracle Database 12c**](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E6%95%99%E7%A7%91%E6%9B%B8-Silver-Oracle-Database-12c/dp/4798143561/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC+silver&qid=1566816239&s=gateway&sr=8-1)
[**ORACLE MASTER Silver DBA11g**](https://www.amazon.co.jp/%E3%80%90%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96%E6%9B%B8%E3%80%91ORACLE-MASTER-Silver-DBA11g-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B7/dp/4797361867/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=WULLMAW8J7MX&keywords=oracle+master+silver+12c&qid=1566815961&s=gateway&sprefix=oracle+master%2Caps%2C261&sr=8-3)

###ORACLE MASTER Silver Oracle Database 12c 試験対策ポイント解説セミナー###

類似問題が数問出てきたので必ず見ておいた方がいいと思います。
<https://www.youtube.com/watch?v=MdpYA4gkNRs>

###Web問題集###
類似問題がでたので、前日に軽く目を通した方がいいかな!!
問題数は少なかったような気がします。

[**ORACLE MASTER Silver Oracle Database 12cの攻め方**](https://www.atmarkit.co.jp/ait/series/8646/)
git checkoutを禁止してgit switch & git restoreを強制する養成ギブス git-switch-trainer

<img width="446" alt="スクリーンショット 2019-08-26 20.50.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54186/f9d526e9-de33-156c-f14e-f5ab86d4cf3c.png">


[git-switch-trainer](https://github.com/sonatard/git-switch-trainer)はgit checkoutの使用を禁止して、git switchとgit restoreに慣れるためのコマンドです。

switchとrestoreはcheckoutから分離した機能であり、コマンド名が作業を適切に表現するようになりました。
機能的には大きく変わらないため今まで通りcheckoutを利用しても問題ありません。
既存のユーザよりもこれから学ぶユーザへの学習ハードルを下げるための機能追加と考えると良いと思います。

既存ユーザの方でも新しいコマンドを使いたいという方はcheckoutの癖が抜けきれないと思うので、このツールを使うと矯正することができます。

## 準備

siwtchやrestoreはGit 2.23で利用できるようになります。

gitのバージョンを確認してください。

```shell
git --version
```

## git-switch-trainer

### インストール
```shell
go get -u github.com/sonatard/git-switch-trainer/
```

### 設定

使い方は `git` のaliasとして `git-switch-trainer` を設定するだけです。

`.bash_profile` に以下の1行を追加します。

```
alias git=git-switch-trainer
```

設定を読み込みます。

```bash
$ source ~/.bash_profile
```

## 使用例

```shell
$ git checkout master 
Error: Use git switch or git restore instead of git checkout.

// aliasを張っている場合も動作します。 gitをg、checkoutをcoとして登録している場合
$ g co master
Error: Use git switch or git restore instead of git checkout.
```

## 参考

```bash
# ブランチ変更
$ git checkout master
$ git switch master

# ブランチ作成
$ git checkout -b master
$ git switch -c master

# 他のブランチからファイルをリストア
$ git checkout master -- ./path/file
$ git restore -s master ./path/file
```

## おまけ
よりGitコマンドに詳しくなりたい方はこちらもどうぞ
[git objectを勉強するためのgit-object-trainerコマンド](https://qiita.com/sonatard/items/9c519611a154e8e35319)

こちらは日常業務に支障をきたすのでご使用はほどほどに
キー入力、マウス入力をIObservable<T>に変換して使う

#はじめに

キー入力ってUpdateに

```C#:
if(Input.GetKey(KeyCode.A)){
    //なんかの処理
}
```
とか
UniRxを使うときは

```C#:
Observable.EveryUpdate()
          .Where(_ => Input.GetKey(KeyCode.A))
          .Subscribe(_ => {
              //なんかの処理
          });

this.UpdateAsObservable()
    .Where(_ => Input.GetKey(KeyCode.A))
    .Subscribe(_ => {
        //なんかの処理
    });
```

みたいな感じだと思います。(?)
UniRxを使う場合はEveryUpdate等をいくつも書くことになって不便です。
ということで専用のストリームソースを作れるようにしました。

#InputをIObservableとして扱う
##用意するもの
UniRx
https://github.com/euglenach/InputAsObservable


##概要
対応しているメソッドは以下のものになります

 * GetKey,GetKeyDown,GetKeyUp
 * anyKey,anyKeyDown
 * Axis,AxisRaw
 * GetMouseButton,GetMouseButtonDown,GetMouseButtonUp
 * GetButton,GetButtonDown.GetButtonUp

##書き方

**名前空間: UniRx.Triggers**

###静的メソッド
```C#:例
InputAsObservable.GetKey(KeyCode.A).Subscribe(_ => Debug.Log("key:A")); //GetKey 

InputAsObservable.AnyKey.Subscribe(_ => Debug.Log("anyKey")); //anykey

InputAsObservable.Axis("Vertical").Subscribe(y => Debug.Log("Axis y:" + y)); //Axis

InputAsObservable.GetMouseButton(0).Subscribe(_ => Debug.Log("mouse0")); //GetMouseButton
```
###Componentの拡張メソッド
```C#:例
this.OnKeyAsObservable(KeyCode.D).Subscribe(_ => Debug.Log("key:D")); //GetKey 

this.OnAnyKeyAsObservable().Subscribe(_ => Debug.Log("anyKey")); //anykey

this.OnAxisAsObservable("Vertical").Subscribe(y => Debug.Log("Axis:" + y)); //Axis
```
こっちは、ComponentがDestroyすると自動で購読がDisposeされます。

#更新履歴
・2019/09/07 GetButton系メソッドにも対応しました
【小ネタ】2019年以降、GooglePlayの子供向けゲームアプリに○○を実装してはいけない

2019年のある日、GooglePlayに公開している子供向け(Designed for Families)アプリが子供向けから削除されました。

ダッシュボードは以下です。

<img width="800" alt="スクリーンショット 2019-01-16 20.54.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19692/d0bc77be-2757-8f2f-1ada-45452073fdc9.png">

メールは以下です。

<img width="800" alt="スクリーンショット 2019-01-16 20.10.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19692/2bb4b707-bbf5-a36d-eb1d-55b708bd49d0.png">

「Googleログイン処理があるのでだめ」とのことです。
審査ではなく公開中のものを削除されたので重要度が高そうでした。

「Googleログインなんてしていたかな？」と思って画面を見ると..

<img width="240" alt="screenshot1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19692/94547059-d3ba-9dc8-40b2-9513fa88b637.png"> <img width="240" alt="screenshot2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19692/a30f1894-102f-253b-5cb0-8bbfa848f87c.png"> <img width="240" alt="screenshot2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19692/cafb7f8e-47ab-e9b1-337b-4b10bb21a330.png">

たしかに実績やリーダーボードを出すためにゲームサービスにログインしていた！

デベロッパーポリシーセンター: ファミリー
https://play.google.com/about/families/#!?zippy_activeEl=families-policy#families-policy


> API と SDK: アプリが API や SDK を利用する場合、すべて正しく実装されている必要があります。
> 子供だけを対象としているアプリの場合、子供向けサービスでの使用が承認されていない API や SDK を利用することはできません。これには、Google ログイン（および、Google アカウントに関連付けられたデータにアクセスする各種 Google API サービス）や、Google Play ゲームサービス、OAuth テクノロジーを使用して認証や承認を行う各種 API サービスなどが含まれます。

泣く泣く子供向けアプリから除外しました。
(PlayゲームサービスのプラグインをUnityのAssetStoreで買ったのに。。)
(セットアップも大変だったのに。。)

<img width="800" alt="スクリーンショット 2019-01-16 20.59.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19692/40039924-9160-a678-dd68-ea59bbf79061.png">

Google Playのゲームサービスなので安心して実装していましたが
まさかの自社サービスを拒否するポリシー変更で驚きました。
子供向けアプリを開発中の方がいたら『Google Playゲームサービス』は実装しないように注意しましょう。

おわり。
【Unity(C#)】PerlinNoiseで電球切れ表現

##※長時間の閲覧にはお気を付けください
本記事には激しく点滅するGif画像が含まれております。
取り扱う内容の性質上、早送りでわかりやすくしておりますので、閲覧の際には十分にお気を付けください。

##ScriptとSphere
用意するのは数行のコードと`Sphere`、`PointLight(Realtime)`だけです。

Shaderで頑張ったライトよりは見た目が劣りますが、
一人称視点でそこそこ高い天井なら誤魔化しも効くかと思います。


##デモ
わかりやすくするために電球のスケールを10倍にしてます。

**※以下Gifあり**

![Blink.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/7e30bcad-b9f5-a6fc-e245-bac33e5d5673.gif)

見ての通り、`PointLight`を`Sphere`の下に置いただけです。

Materialの`Metallic`や`Smoothness`、`Reflestions`あたりのパラーメーターを調整して
照り返しを生み出して、実際は光源ではない`Sphere`に光の表現を追加しています。

##コード

```C#:点滅させたいポイントライトにアタッチ
using UnityEngine;

public class PerlinNoiseLight : MonoBehaviour
{
    [SerializeField]
    float maxIntensity;

    [SerializeField]
    float blinkSpeed;

    Light blinkLight;

    void Start()
    {
        blinkLight = this.gameObject.GetComponent<Light>();
    }

    void Update()
    {
        blinkLight.intensity = Mathf.PerlinNoise(Time.time * blinkSpeed, 0) * maxIntensity;
    }
}
```

##PerlinNoise

ランダムに点滅させたかったので`PerlinNoise`を使っています。
[全く意味が分かりませんでした](https://postd.cc/understanding-perlin-noise/)が、
>単純にランダムな値を返すものではなく、
入力値(xとy)の変化に合わせて徐々に変化するような乱数という事です。
端的に言えば、変化がなだらなかな乱数と言った感じでしょうか。[^1]

というのが特徴だそうです。

言われてみれば、ランダムな値として利用できているにも関わらず、
突然真っ暗になったり、真っ暗な状態からいきなりMax状態の明るさになったりしていませんね。

実験として、単純にランダムな値を入れるとどうなるか試してみます。

`Update`を下記のように変更します。

```C#

 void Update()
    {
        blinkLight.intensity = Random.Range(0, maxIntensity);
    }

```


**※以下Gifあり**
  
  


![Blink_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/195588d5-7335-c31c-b16a-320626c1bca8.gif)

なかなかクレイジーな状態になりました。

**PerlinNoise = 変化がなだらなかな乱数**という表現に合点がいきました。

「でも実際の電球って寿命が近いとこういう激しい点滅もするよな～？」と思ったので
組み合わせてみました。

```C#:点滅させたいポイントライトにアタッチ
using UnityEngine;

public class PerlinNoiseLight : MonoBehaviour
{
    [SerializeField]
    float maxIntensity;

    [SerializeField]
    float blinkSpeed;

    Light blinkLight;

    int flashAdjustValue = 7;

    void Start()
    {
        blinkLight = this.gameObject.GetComponent<Light>();
    }

    void Update()
    {
        if (blinkLight.intensity > maxIntensity / flashAdjustValue)
        {
            blinkLight.intensity = Mathf.PerlinNoise(Time.time * blinkSpeed, 0) * maxIntensity;
        }
        else //消えかけると激しく点滅
        {
            blinkLight.intensity = Random.Range(0, maxIntensity / 2);
        }

    }
}
```

よく見かける、**消えかけたと思ったら激しく点滅してまた消えかける**　みたいな状態を再現できたかと思います。

**※以下Gifあり**
  
![Blink_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/2300f247-3d5d-5bc8-9bbd-4a1ad6049b0a.gif)



あとは、ライトの傘や外枠を作ってあげればより自然な見た目になるかと思います。


もっときれいな点滅を再現するなら、
電球のオブジェクトはShaderで点滅させて、
スポットライトやポイントライトのIntensityも連動して点滅させる必要がありそうです。


[^1]: [引用元](http://kan-kikuchi.hatenablog.com/entry/What_is_PerlinNoise)
Splunkのreturnの結果がない時、結果なしとする。

##概要
サブサーチ結果を`return`で返す時、検索結果がない場合メインサーチは引数なしで検索してしまう。
それを防止する方法。

##結論
```Splunk:SPL
return あなたのサブサーチ結果フィールド名等
where search!=""
] `comment(“サブサーチの閉じかっこ”)` 
```

##解説
`isnotnull`が使えるかと思ったら、使えなかったので。

`return`については[Splunkサブサーチで検索期間を変化させる](https://qiita.com/toshikawa/items/38e57c6f2b0514db109b)を参照

ちょっと調べてみると`eval`（`where`も）の評価で
`isnull`：そのフィールドがない場合
`==""`:フィールドはあるけど値が入っていない場合
みたい。

Splunkチュートリアルのデータで確かめられる。

```Splunk:SPL
source="access_30DAY.log"
| where isnull(action)
```
なのでその逆、サブサーチ検索結果がある時のみメインサーチが動くようにしている。

:sweat: 画像がない・・・・

##結果がない時メッセージを表示する
```java:結果なし
...
| appendpipe [|stats count
| eval message="There is no result"
| where count = 0 | table message ]
```
`appendpipe`でこのように作ってあげると、メインサーチの結果がない場合、メッセージを表示してくれる。

意外のニーズはある。
Ruby 文字 を 出力 する ～puts "出力したい文字"～

# 目的

- Rubyで任意の文字をコンソールに出力する方法を知る

# 押さえるポイント

- 出力を行うメソッド(命令)は`puts`を使用する。
- 文字を表示するメソッドは`puts`以外にも`p` `print`などがある。
- 出力したい文字をダブルクオートで囲む

# 書き方の例

- 下記に汎用的な文字の出力方法を記したRubyファイルの内容を記載する。
※`>`はコンソール出力

``` ruby
puts "出力したい文字列"
>"出力したい文字列"
```

# より具体的な例

- 下記にコンソールに`miriwo`と出力する処理を記したRubyファイルの内容を記載する。

``` ruby
puts "miriwo"
>miriwo
```

# `puts`以外の出力メソッド

### `p`メソッド

- `p`メソッドを使用すると出力文字にダブルクオートを付けて出力する。
- `p`メソッドを用いてコンソールに`miriwo`と出力する処理を記したRubyファイルの内容を記載する。

``` ruby
p "miriwo"
>"miriwo"
```
### `print`メソッド

- `print`メソッドは実行後に改行が行われない。
- `print`メソッドを用いて`miriwoくん`と出力する処理を記したRubyファイルの内容を記載する。

``` ruby
print "miriwo"
print "くん"
>miriwoくん
```
LINEやFacebookやSlackアプリでURLプレビュー時にサイトへ飛ぶリクエストのUserAgent

を確認したのでメモ。
（確認方法：Android端末にインストールしている下記それぞれのアプリに、自サイトのURLを投稿して、自サイトのサーバ側でリクエストヘッダーを確認）

## LINE

投稿のURLプレビュー時にサイトへ飛ぶリクエストのUserAgent：

```
facebookexternalhit/1.1;line-poker/1.0
```

（参考）アプリ内部ブラウザ（WebView）でサイト表示時のUserAgent：

```
Mozilla/5.0 (Linux; Android 9; ANE-LX2J Build/HUAWEIANE-LX2J; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.111 Mobile Safari/537.36 Line/9.14.1/IAB
```
　
## Facebook

草稿および投稿のURLプレビュー時にサイトへ飛ぶリクエストのUserAgent：

```
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
```
　
## Slack

投稿のURLプレビュー時にサイトへ飛ぶリクエストのUserAgent：

```
Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)
```

以上
exe化できなかった

## 試したもの
- pyinstaller
- py2app (py2exeはwindows用？）
- fbs
- cx_Freeze

### pyinstaller

```sh
pyinstaller --hidden-import="sklearn.utils._cython_blas" --hidden-import="sklearn.neighbors.typedefs" --hidden-import="sklearn.neighbors.quad_tree" --hidden-import="sklearn.tree._utils" tkintertest.py --onefile
```
で実行すると、exeファイルは作成できた。しかし、一回のクリックで延々と実行される。

エラー：

```sh
Can not find path ./libtbb.dylib (needed by /usr/local/lib/python3.7/site-packages/numba/npyufunc/tbbpool.so)
```

liborsaをimportすると上記のエラーが発生する。
liborsaで使ったものは以下の通り。

librosa.load
librosa.effects.hpss
librosa.cqt
librosa.feature.chroma_cqt
librosa.amplitude_to_db
cloud functionsでfierstoreを扱う


こんな単純なところで少し詰まったんで...


###ダメだった例
```javascript
exports.testfunction = functions.https.onRequest((req, res) => {
    let tweets = []
    admin.firestore().collection('tweets').get()
        .then(function(querySnapshot) {
            querySnapshot.forEach(function(doc) {
                doc.data().id = doc.id 
　　　　　　　　　　//doc.data().id　はundefinedとなってしまう
                tweets.push(doc.data())
            });
    })
});
```
##いけた例
```javascript
exports.testfunction = functions.https.onRequest((req, res) => {
    let tweets = []
    admin.firestore().collection('tweets').get()
        .then(function(querySnapshot) {
            querySnapshot.forEach(function(doc) {
                let data = doc.data()
                data.id = doc.id
                tweets.push(data)
            });
    })
});

```
Java で順序付けできるクラスを書くちょっとした定石メモ

# はじめに
書籍「新・明解 Javaで学ぶアルゴリズムとデータ構造」第3章-3 2分探索 より、Java を書く上で覚えておきたい定石があったので二分探索についても含めて本記事にまとめてみました。

# Java による二分探索
Java は配列から二分探索を行うメソッドを標準ライブラリとして提供しています。
`java.util.Arrays` クラスに所属する `binarySearch` メソッドです。

参考: https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html

上記参考リンク先にあるように `binarySearch` メソッドは様々な要素型に対応できるよう、数多く定義されています。いずれも、昇順にソート済みの配列からキー値の要素を二分探索します ( 昇順ソートされていない場合の結果は定義されていません ) 。
配列内に検索キーがある場合は検索キーのインデックスを、存在しなかった倍は (-(挿入ポイント) - 1) を返します。

今回注目するのは次の二つです。

```java
static int binarySearch(Object[] a, Object key)
static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)
```

## static int binarySearch(Object[] a, Object key)
自然な順序で要素の大小関係を判定します。自然順序付けについては以下を参考にどうぞ。

参考: https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Comparable.html

上記参考リンク先の `Comparable` インターフェイスを実装している型の配列であれば、このメソッドを使って簡単に二分探索するコードを書くことができます。

## 自然順序付けのできるクラス定義のちょっとした定石
つまり、自作のクラスに関しても、この `Comparable` インターフェイスを実装すれば自然順序付けを定義することができ、このメソッドを使用することができるようになります。以下をちょっとした定石として覚えておくと良いでしょう。

```自然順序付けのできるクラス.java
public class Hoge implements Comparable<Hoge> {
    // フィールドやメソッドなど

    @Override
    public int compareTo(A c) {
        // this が c より大きければ正の値を、
        // this が c より小さければ負の値を、
        // this が c と等しければ 0 を返す。
    }

    @Override
    public boolean equals(Object c) {
        // this が c と等しければ true を、
        // this が c と等しくなければ false を返す。
    }
}
```

この時、「 `conpareTo` メソッドが 0 を返す時は `equals` メソッドが true を返し、 `compareTo` メソッドが 0 以外を返す時は `equals` メソッドが false を返す」というように整合性が取れるようにすると良いでしょう。

## static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)
このメソッドは、自然な順序では **ない** 順序で並べられた配列から二分探索する時に使用できます。ジェネリックなメソッドなので、配列の要素の方はなんでも OK です。

ただし、各要素の大小関係をどのように判定するのかをメソッドに通知しなければならなりません。そのために、第三引数に `java.util.Comparator` インターフェースを実装したクラスのインスタンスを渡します。

## コンパレータを定義するちょっとした定石
例えば、クラス Fuga のコンパレータは次のように定義できます。これもちょっとした定石として覚えておくと良いでしょう。

```クラス内部でコンパレータを定義.java
public class Fuga {
    // フィールドやメソッドなど

    public static final Comparator<Fuga> COMPARATOR = new Comp();

    private static class Comp implements Comparator<Fuga> {
        public int compare(Fuga d1, Fuga d2) {
            // d1 が d2 より大きければ正の値を、
            // d1 が d2 より小さければ負の値を、
            // d1 が d2 と等しければ0を返す。
        }
    }
}
```

`Fuga.COMPARATOR` を `binarySearch` メソッドの第三引数として渡すことで、定義したコンパレータを元に大小関係を判断して、 `Fuga` 型の配列の二分探索を行えます。
UbuntuにSAP Netweaver 7.52 Developer Editionをインストールする

### ■今回使用したPCスペック
・CPU　　AMD Athllon 5350
・メモリ　8GB
・SSD　　256GB
・OS　　  Ubuntu 18.04.3 LTS

### ■前提
- IPアドレスが固定されていること
- SAP Netweaver 7.52 Developer Editionがダウンロード済みであること

### ■ファイヤーウォール設定
```
sudo ufw status
sudo ufw allow 3200
sudo ufw reload
sudo ufw status
```

### ■hostsファイル設定
```
sudo nano /etc/hosts
```

・以下を記載
　※「vhcalnplci vhcalnplci.dummy.nodomain」の部分は固定

```
固定したIPアドレス vhcalnplci vhcalnplci.dummy.nodomain
```

### ■インストール
SAP Netweaver 7.52 Developer Editionを解凍し、フォルダ内にある「install.sh」を実行する。
20分ほどかかるので放置。

```
sudo chmod +x install.sh
./install.sh
```

### ■GUIインストール(Java)版
```
conn=/H/固定したIPアドレス/S/3200
```

### ■ログイン
| ID | パスワード | クライアント | 内容説明 |
|:-:|:-:|:-:|:-:|
| DEVELOPER  | Down1oad  | 001  | Developer User |
| BWDEVELOPER  | Down1oad  | 001  | Developer User |
| DDIC  | Down1oad  | 000/001  | Data Dictionary User |
| SAP*  | Down1oad  | 000/001  | SAP Administrator |

### ■ハードウェアキー更新
SAP*ユーザでログインしTr-CD：SLICENSEでハードウェアキーを取得する。

以下のURLにアクセスし、ライセンスファイルをダウンロードし、インストールする

https://go.support.sap.com/minisap/#/minisap
NPL – SAP NetWeaver 7.x (Sybase ASE) 

### ■サービス起動方法
```
su npladm
vhcalnplci:npladm 1> startsap ALL
```
ionic 3でbuttonがテキストっぽくなってしまう時の対処

##ionic3での記事です。ionic5、ionic4では確認していません。

#押せるけどボタンっぽくない何かが誕生してしまう...
↓
![スクリーンショット 2019-08-26 19.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280340/b8723fdc-3c99-a947-76e1-cb2a912c6e16.png)
#直す
参考になったのは<a href="https://stackoverflow.com/questions/53062332/ionic-3-not-applying-default-style-to-button">ここのページ</a>。

```html
<ion-button block color="primary">ボタンだよ</ion-button>
```

を

```html
<div padding>
          <ion-button block color="primary">ボタンだよ</ion-button>
</div>
```
【Mac向け】インターネットで集めた曲を自動的にiTunesに追加する方法


# はじめに
SoundCloudやBandcamp、Beatportなどを通じてインターネットから音楽をダウンロードすることが多い人はたくさんいることでしょう。しかし、iTunesで音楽を管理している場合、わざわざ落とした音声ファイルをiTunesにドラッグして追加するのは面倒ですよね。この記事ではダウンロードした音楽を自動的にiTunesに追加する方法を紹介します。

# 使うもの
- Webブラウザ
- Automator（標準で入ってるアプリ）
- カレンダー（標準で入ってるアプリ）

# 考え方
iTunesのライブラリが保存されている「iTunes Media」の中には「iTunesに自動的に追加」というフォルダがあります。iTunesは起動中に絶え間なくこのフォルダを監視しており、このフォルダに追加された音楽ファイルは瞬時にライブラリに追加されます。だったらこのフォルダに直接音楽を落とせば良いじゃないか、と考えたくなりますが、ダウンロードに時間がかかるファイルだとダウンロード中にiTunesがライブラリに追加しようとしてファイルを移動させるのでダウンロードが失敗してしまいます。そこで、いったん別のフォルダに音楽を保存し、定期的にそのフォルダの中身を「iTunesに自動的に追加」に移すという手順を取ります。2つめのステップはAutomatorとカレンダーをつかって自動化することが可能です。


# 手順
### ステップ1
一時的に音楽を保存するフォルダを作ります。場所はどこでもいいです。とりあえず名前は「download_music」としておきましょう。
### ステップ2
Automatorで新規にアプリケーションを作成します。次のようなダイアログでは「アプリケーション」を選択してください。
![スクリーンショット 2019-08-26 19.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479717/c39ac11c-f187-f37f-15d8-3e8d38092514.png)


下のようなワークフローを設定します。


```
指定されたFinder項目を取得 -> フォルダの内容を取得 ->  Finder項目を移動
```
- 「指定されたFinder項目を取得」ではdownload_musicを指定します。
- 「フォルダの内容を取得」で「見つかったサブフォルダからも取得」のチェックは入れても入れなくてもいいです。
- 「Finder項目を移動」で、保存先をお使いのiTunesライブラリのiTunes Media内にある「iTunesに自動的に追加」に設定します。
![スクリーンショット 2019-08-26 11.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479717/01e974b2-c1e1-67b0-9aab-f703bef6e7bc.png)

完成したら保存します。とりあえず名前は「add_to_itunes」としておきましょう。

### ステップ3
カレンダーを使ってステップ2で作ったプログラムが毎日動くように設定します。カレンダーを開いて新しくイベントを作成し、毎日繰り返されるように設定します。通知の設定で「カスタム...」を選ぶと「ファイルを開く」という選択肢が現れるのでこれをクリックします。開くアプリケーションを「その他...」から設定できるので、ステップ2で作ったアプリケーションを選択します。イベントの時刻は一日中（例えば下のように）に設定します。
![スクリーンショット 2019-08-26 11.16.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479717/a879481a-a2c5-a49c-ad2c-4d27bff0db74.png)



アプリケーションを作動させるイベントは毎日繰り返されるので、普段からカレンダーアプリを使ってる人にとっては少し目障りでしょう。従って、専用のカレンダーを作っておいて普段は表示させないようにしておくのが得策だと思われます。

以上で主なセットアップは完了です。

### ステップ4

あとはお好みのWebブラウザで音楽をdonwnload_musicに落とすだけです。音楽ではないファイルをdownload_musicに入れてしまわないように、ファイルをダウンロードするたびに保存先を聞かれる設定にしておきましょう。



# 補足
- 具体的にいつファイルの移動が実行されるのかは検証されていませんが、おそらく「イベントの開始時刻」が第一優先で、その時間にMacがスリープあるいはシステム終了している場合は「それ移行に最初にMacがアクティブになった時」だと思われます。


# 参考リンク
カレンダーを使ったアプリケーションの実行についてはこちらの記事が詳しいです。
http://gijutsubu.backstage.jp/?eid=87
React Player でロード時に指定位置から動画or音声再生させる方法


ページロード時にYoutubeの ?t=
みたいな感じで、指定の秒数から再生を始めるページの実装を想定しています。

React Playerというわりと利用ダウンロード数が高いコンポーネント採用し動画再生の実装しています。

React Player内で用意されている
seekTo関数を使うことで指定位置から再生可能みたいです。。

seekTo=
適当なイベント発生時にseekTo(位置(秒指定))をよぶことでジャンプ可能なかんすう。

コンポーネント生成時かプロパティに突っ込む方法で模索

```TypeScript

export class VideoQiitaPage extends Component<Props, State> {
    
    player: ReactPlayer | undefined;
    
    ref = (player:ReactPlayer) => {
        this.player = player;
        this.movePosition();
    }

    movePosition(position : number) { 
        let aaa: any = { type: 'seconds' };
        if (this.player){
            this.player.seekTo(position); 
        }
    }

    render() {
        return (
            <React.Fragment>
            <ReactPlayer
                ref={this.ref}
                url={'http://xn--hhro09bn9j8uh.com/movie/94neco/neco02_720.mp4'}
                controls
                />

```

むつかしいことではないですが、、、
サンプルや詳細をTypeScriptで説明しているサイトやドキュメントなく嵌りました。
プログラミング学習（二日目） ProgateでRuby On Rails　レッスン２

#今日学んだこと
##htmlファイルにRubyの埋め込み方と、変数の定義

#####拡張子を.html.erbとすると、htmlファイルにRubyのコードを埋め込める
erbとは「Embedded ruby(埋め込みRuby)」の略
具体的には<% %>で囲むと、ブラウザには表示されず、
<%= %>で囲むと、ブラウザに表示される。

また、Railsでは変数はビューファイルではなくアクションで定義するのが一般的。
アクション内で＠を先頭につけることによって、ビューファイルでも使えるようになる。
こんな感じ

```ruby:posts_controller.rb
def index
 @moneys=["yen", "us", "rupee"]
end
```

```:index.html.erb
<% @moneys.each do |money| %>
<%= money %>
<% end %>
```
##Railsでのデータベースの扱い方
データベースにデータを保存するには、テーブルを作る必要がある。（今回はpostsテーブルとする）
ちなみに縦の列を「カラム」、横の行を「レコード」という。

###postsテーブルを作成する手順
①データベースに変更を指示する「マイグレーションファイル」を作成する
②データベースに変更を反映

####マイグレーションファイルの作成方法
#####$rails generate model Post content:text
と入力。それぞれの意味は、
「Post」は「posts」テーブルを作成するために単数形で宣言。モデル名。
「content:」はカラム名
「text」はデータ型。この場合は、長い文字列を意味する。

そして上のコマンドで
アプリケーション名/db/migrate/　に、マイグレーションファイルができる。内容はまだ理解しなくていいらしい？

次に、
#####$rails db:migrate
で、マイグレーションファイルを使い、データベースに変更を反映してpostsテーブルを作る。
この時、「id」、「created_at」、「update_at」カラムが作られるが、意味は
「id」がデータベースに入れられた順につけられる番号
「created_at」がデータベースに保存された時間
「update_at」が更新された時間

ちなみに、データベースに反映されてないマイグレーションファイルが存在すると、マイグレーションエラーが起こるので注意。

####テーブルの操作方法
**$rails g model Post content:text**
で、postsテーブルを操作するためのPostモデル（モデルはクラス）が生成されるので、このPostモデルを使って操作する。
このモデル（クラス）は上記のコマンド時に
app/models/post.rb（ファイル名は単数形）
に生成される。

```ruby:post.rb
class Post < ApplicationRecord
end
```
このように「ApplicationRecord」を継承したクラスを**モデル**という。
このモデルを使ってテーブルを操作する。

##rails consoleの使い方
コンソールで
**$rails console**
と打つだけ。Rubyのコードを手軽に実行できるやつ。irbと似てる？。quitで終了。

##Postモデルを使い、データベースのpostsテーブルにデータの追加方法
①newメソッドで、Postモデルのインスタンスを生成。
②saveメソッドを使い、postsテーブルに保存

まず①から
rails console上でも.rbファイル上でもいいが、今回はrails console上で行う。

**$rails console**
　　　　・
　　　　・
**>post = Post.new(content:"Hello World")**
これはcontentが"Hello World"のPostインスタンスを生成し、変数postに代入している。
そして、②の保存は
**>post.save**
で行う。
saveメソッドが使える理由は、「ApplicationRecord」クラスを継承しているため。

###データベースからデータの取り出し方
**>post=Post.first**
**>post.カラム名**
で、一行目の指定してカラムのデータを取り出せる

**>post=Post.all**
で、postsテーブルのすべてのデータを配列として取得可能。

**>Post.all[0]**
で、idが1のレコードを取得可能。さらに
 **>Post.all[0].content**
で、idが1（一行目）のcontentカラムのデータが取得できる。

このデータの取得は、コントローラのアクション内でも利用可能。

##共通のレイアウトのまとめ方
Railsでは、「views/layouts/application.html.erb」に共通のHTMLを書いておける。
これの原理は、application.html.erbには**<%= yield%>**というコードがあり、各ビューファイルはこのコードに代入され、
application.html.erbの一部としてブラウザに表示されるので。

##link_toメソッド
link_toメソッドはRubyのコードで、**<%=%>**コードで記述する。そうするとHTMLのaタグに対応する。
**<%= link_to("投稿一覧", "/about") %>**
             ↓
`<a href="/about>投稿一覧</a>`


思ったより書く時間がかかったので、これからはもう少し端折ります。
Spring BootのHandlerInterceptorで実行されるControllerのクラス名やメソッド名を取得する

# 1. やりたいこと

- HandlerInterceptorで実行されるControllerのクラス名やメソッド名を取得する

# 2. バージョンや条件など

- Spring Boot 2.1.7.RELEASE

# 3. やったこと

```java:DemoInterceptor.java
public class DemoInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        // (1) HandlerMethodでない場合スキップ
        // jsとかだとorg.springframework.web.servlet.resource.ResourceHttpRequestHandlerになる
        if (!HandlerMethod.class.isInstance(handler)) {
            return true;
        }

        // (2) handlerをHandlerMethodにcastする
        HandlerMethod handlerMethod = HandlerMethod.class.cast(handler);

        // (3) 実行されるControllerのクラス名
        String beanTypeName = handlerMethod.getBeanType().getName();

        // (4) 実行されるメソッドのメソッド名
        String methodName = handlerMethod.getMethod().getName();

        // (5) ショートログメッセージ
        // 以下のようにFQCN#MethodName[Arguments]が取得できる
        // [example]
        // case1) No arguments
        // jp.gr.java_conf.pekokun.web.app.HelloController#say[0 args]
        // case2) 1 argument
        // jp.gr.java_conf.pekokun.web.app.HelloController#say[1 args]
        String shortLogMessage = handlerMethod.getShortLogMessage();

        // (6) メソッドのパラメータの情報も取得できる
        // handlerMethod.getMethodParameters()...

        return super.preHandle(request, response, handler);
    }

```

おわり。
履歴書とかスキルシートの提出は無くしてRUSUMEにして欲しい件

<img width="1440" alt="スクリーンショット 2019-08-26 18.56.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/40cab194-4065-5015-3e31-b62ebaee8685.png">
就職活動をしたり、SESの会社で働いていると付いて回るのが履歴書,スキルシート。
これを書くor打ち込むことほど無駄な事はない。
そこで考えた。[RESUME](https://www.resume.id/)という最強の履歴書兼スキルシートを活用すれば良いのではないかと。
なぜ僕がこのサイトを勧めるかについての理由を下記に書いておく。
[私のRESUME](https://www.resume.id/engineerhikaru)

## 無料
RESUMEは全て無料で使う事が出来る。
"無料"実に良い響だ。

## 使いやすい
RESUMEは半端ないほど簡単に設定する事が出来る。めちゃくちゃ直感的だ。
"はじめる"をクリックしたらソーシャルアカウントで登録/ログインし、後はスキルと経歴,リンクを設定していくだけ。30分程度で全て整えられるだろう。これをするだけで後は自分のページのURLを教えるだけでいいのだ。

## 見やすい
<img width="1440" alt="スクリーンショット 2019-08-26 19.09.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/67b408ae-07a9-5fad-69f0-9cc17c3f0622.png">
RESUMEは見る側としてもとても見やすい。
スキルも多少盛られている可能性は高いが、それでもなんとなく想像しやすい。

## 経験が積み重なる
RESUMEはWorkという記事を書く部分がある。
作品ができるor参加したプロジェクトをWorkで記録しておくだけでどんどん経験が重なる。

## エンジニアやデザイナーだけじゃない
スキルの部分があるため、エンジニアやデザイナーだけが使うものと思いがちだけど、スキルは入力で足す事もできるから、大型運転免許証,〇〇インストラクターなど様々な分野の情報が乗ってても良いと思う。
そんな感じで自分はこういう人間です！と表現したいならば[RESUME](https://www.resume.id/)を使わない手はないだろう。

> 人生とはレッスンの積み重ね。それは生きて実際に経験してみないと分からないものです。
Life is a succession of lessons which must be lived to be understood.
>> ヘレン・ケラー
初心者によるjavaScriptによるイベントリスナーについての学習

イベントリスナーとは、ウェブ上で起こるクリックやマウスオーバーなどのアクションである「イベント」に対して発動する処理のことです。

ボタンが押された時に処理を行う、などという場合は`addEventListener`を使う。

```JavaScript:
obj.addEventListener(イベントのタイプ, 関数, false)
```
こんな感じですね。
`addEventListener`の第一引数にはclickなどのイベントの種類、第二にはそれに対する関数です。第三に関しては今は割愛します。

従って仮に<button>要素があったとして、それをクリックしたらコンソールに文字列を表示するという場合は

```JavaScript:main.js
const button = document.querySelector('button');

button.addEventListener('click', () => {
  console.log('clicked!');
});
```
こうなる。
イベントタイプはダブルクリックやマウスオーバーなど多岐にわたって用意されているので、確認しておくと良いですね。

https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener


そしてイベントに関する情報を取得して、それを使うやり方です。
例としてマウスの座標を取得してリアルタイムに表示する。
htmlに適当に配置したdiv上でマウスが動いたら、その座標を取得することにする。



```JavaScript:main.js
const div = document.querySelector('div');

document.addEventListener('mousemove', e => {
  div.textContent = `${e.clientX}:${e.clientY}`;
});
```

ここでテキストによると「*関数の引数にオブジェクトを渡してあげると、イベントに関する情報をブラウザがセットしてくれる*」とのこと。よくわからない。。

そもそもこれは、「マウスが動いたらその座標を取得し、divに書き込む。」という処理。
だとしたらこのeにその座標情報が入り、それをテンプレートリテラル形式で読み込み、divに書き込むということなのだろうか。（間違っていたらすいません）

コードを見れば何をやってるかは理解できるのだが、「関数の引数にオブジェクトを～」の説明でこのコードを書くのは自分にはまだ難しそう。


ちなみに「*こういうときの引数名には慣習的に e がよく使われる*」とのこと。急に e が出てきても驚かないようにしたい。
【AWSをコードで操る】Python boto3でAWS EC2インスタンスを制御する

## tl;dr

MacでPythonをAWSを制御するためのプログラムの入門編です。
この記事ではEC2インスタンスをAWS EC2インスタンスを起動→停止します。

## 用意するもの・環境

- macOS Mojave 10.14.6
- Python 3.7(ANACONDA3)
- PyCharm 2019.2
- boto3

開発環境の構築は下記の記事を参考にしてください。

【これさえ読めばOK】MacでPythonを使って開発するための準備
https://qiita.com/ryoichiro001/items/35a232a430c41dd512fa

## AWS

AWSとはAmazon Web Servicesの略です。

AWSは公式サイトが充実しているので、下記を一読することをおすすめします。

アマゾン ウェブ サービス（AWS）とは？
https://aws.amazon.com/jp/about-aws/


## Boto3

AWSをPythonで制御するためのパッケージです。
AWSが公式に提供しています。

この記事ではEC2しか制御しませんが、他のAWSのサービスも制御することができます。


## 準備するもの

### Boto3インストール

pipコマンドでインストールできます。

```zsh

% pip install boto3
```

### AWSのAPIキー

AWSを外部プログラムから制御するのにAPIキーを用意する必要があります。

APIキーの取得
https://aws.amazon.com/jp/developers/access-keys/


APIキーとは下記のものです。

- アクセスキー ID (access_key_id)
- シークレットアクセスキー (secret_access_key)

これは公開しないようにしてください。

APIキーがあるとだれでも操作ができてしまいます。


## PythonでEC2インスタンスを起動→終了する

Boto3 で利用可能なサービスは下記の通りです。
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html

今回はEC2インスタンスを制御するので「ec2」を指定します。


### EC2インスタンスを起動する

```python

ec2 = boto3.resource('ec2')

# インスタンス作成
AMI_ID = 'ami-0c3fd0f5d33134a76' # AMI-IDを指定
SUBNET_ID = 'subnet-xxx'  # サブネットIDを指定(事前に作成しておく)

instances = ec2.create_instances(ImageId=AMI_ID,
                                 MaxCount=1, MinCount=1,
                                 InstanceType='t2.micro',
                                 SubnetId=SUBNET_ID)
```

ec2.create_instancesで起動ができます。

ec2.create_instancesには記載のパラメータ以外に下記が必要です。

- アクセスキー ID (access_key_id)
- シークレットアクセスキー (secret_access_key)
- 起動対象のリージョン

ですが、APIキーをプログラム中に記載するのは危険ですので、環境変数で管理した方が良いです。

サブネットは指定しない場合、デフォルトのものが使用されるらしいのですが、わたしの環境でうまくいきませんでした。
IDを指定すると問題なく起動しました。

### 環境変数

下記の環境変数に設定しておくと自動的にboto3が読み取ってくれます。
- アクセスキー ID (access_key_id) → AWS_ACCESS_KEY_ID
- シークレットアクセスキー (secret_access_key) → AWS_SECRET_ACCESS_KEY
- 起動対象のリージョン → AWS_DEFAULT_REGION

PyCharmを使うと実行するときに環境変数を指定できるので便利です。

![Run:Debug Configurations 2019-08-26 17-30-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/8478a986-98b9-475c-11aa-10f728101df4.png)

### AMI-ID

AMIとはAmazon Machine Imageの略で、EC2インスタンスはAMIを元にして作成します。
AMIには固有のIDがついていて、AWSコンソールから取得できます。

![AMI | EC2 Management Console 2019-08-26 17-49-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/0ff1539c-006a-fc84-403d-7956f371753d.png)

### インスタンスを終了する

```python

# インスタンスを終了する
tm = instance.terminate()
```

instance.terminateで終了できます。


## 実際のプログラム

EC2を起動して終了するプログラムをGitHubに公開しています。
https://github.com/ryotak/boto3_sample


## おすすめPython勉強法

Udemyの動画がおすすめです。

<a href="https://px.a8.net/svt/ejp?a8mat=356L0S+MMHRM+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F" target="_blank" rel="nofollow">現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル</a>
<img border="0" width="1" height="1" src="https://www17.a8.net/0.gif?a8mat=356L0S+MMHRM+3L4M+BW8O2" alt="">

## 参考サイト

Python boto3 でAWSを自在に操ろう ~入門編~
https://qiita.com/kimihiro_n/items/f3ce86472152b2676004

Pycharmからのスクリプト実行で環境変数PATHを指定する
http://y0m0r.hateblo.jp/entry/20131207/1386416022
Windows + MAMPでMySQLが起動しない場合の対処

Windows 環境にインストールした MAMP で、MySQL だけが起動できない事象が起こったので、その際に行った対処をメモとして残しておきます。

## 環境
- Windows 10 PRO
- MAMP 4.1.0

MAMP のインストール先は C:\MAMP (デフォルト)です。


## 原因
MAMP をインストールしたときにデフォルトで作成されている MySQL の設定ファイル (C:\MAMP\conf\mysql\my.ini) でバイナリロギングが有効になっています。
バイナリロギングが有効なときは、バイナリログのファイル名がインデックスファイル (C:\MAMP\db\mysql\mysql-bin.index) に記録されるようなのですが、インデックスファイルの中にバイナリログのファイル名以外の情報が混入してしまっていることが原因のようでした。

```mysql-bin.index
.\mysql-bin.000001
2019-08-26T09:36:52.354676Z 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
... (途中省略) ...
2019-08-26T09:36:52.926819Z 0 [Note] InnoDB: Loading buffer pool(s) from C:\MAMP\db\mysql\ib_buffer_pool
2019-08-26T09:36:52.926928Z 0 [Note] Plugin 'FEDERATED' is disabled.
.\mysql-bin.000002
mysqld: File '2019-08-26T09:36:52.926928Z 0 [Note] Plugin 'FEDERATED' is disabled.' not found (Errcode: 13 - Permission denied)
2019-08-26T09:36:53.372353Z 0 [ERROR] Failed to open log (file '2019-08-26T09:36:52.926928Z 0 [Note] Plugin 'FEDERATED' is disabled.', errno 13)
2019-08-26T09:36:53.373788Z 0 [ERROR] Could not open log file
mysqld: File '2019-08-26T09:36:52.926819Z 0 [Note] InnoDB: Loading buffer pool(s) from C:\MAMP\db\mysql\ib_buffer_pool' not found (Errcode: 2 - No such file or directory)
2019-08-26T09:36:53.374542Z 0 [ERROR] Failed to open log (file '2019-08-26T09:36:52.926819Z 0 [Note] InnoDB: Loading buffer pool(s) from C:\MAMP\db\mysql\ib_buffer_pool', errno 2)
2019-08-26T09:36:53.376252Z 0 [ERROR] Could not open log file
... (途中省略) ...
mysqld: File '2019-08-26T09:36:52.354676Z 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions' not found (Errcode: 13 - Permission denied)
2019-08-26T09:36:53.412055Z 0 [ERROR] Failed to open log (file '2019-08-26T09:36:52.354676Z 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions', errno 13)
2019-08-26T09:36:53.413720Z 0 [ERROR] Could not open log file
```
上記を見ると、「.\mysql-bin.000001」や「.\mysql-bin.000002」というようなログファイル本体のファイル名以外に、実行ログと思われるものが記録されていて、それらをバイナリログファイルとして開こうとしてエラーになっているようです。
試しに、ログファイル名以外の実行ログ的なものをエディタで削除してみたら、うまく起動できました。
そもそも、バイナリログのインデックスファイルに実行ログ的なものが書き込まれるのが正しいのか？は調査できていません。(スミマセン)


## バイナリログの使用目的は？
レプリケーションやリカバリに使用するみたいです。
詳しくはMySQLのマニュアルを参照してください。
<https://dev.mysql.com/doc/refman/5.6/ja/binary-log.html>


## 対処
手軽な開発環境として MAMP を利用しているだけで、MySQL のバイナリログを使用することはないと思うので無効にしてしまいます。

### バイナリロギングの無効化
C:\MAMP\conf\mysql\my.ini の中の下記の部分をコメントアウトして、バイナリロギングを無効にします。

```my.ini
#log-bin=mysql-bin
#binlog_format=mixed
#server-id = 1
```

### バイナリログの削除
C:\MAMP\db\mysql ディレクトリの中にある下記のファイルを削除します。

- mysql-bin.nnnnnn
- mysql-bin.index

### MAMP の再起動
MySQL Server の緑ランプが点灯すれば成功です！

## 最後に
個人的な感想ですが、バイナリログが必要な人は、MAMP を使用しないと思うんですが...
Xcodeアーカイブが途中で止まって進まない場合の対処法

Xcodeでアーカイブしようとすると、途中で停止したままフリーズしたような状態になってしまうことがあります。

いくつか原因があるようですが、私の場合は以下の方法で解決しました。

PROJECT の Build Settings から、「Swift Compiler - CodeGeneration」という項目を検索し、「Optimization Level」の「Release」を「No Optimization [-Onone]」にします。


＜参考ページ＞
https://stackoverflow.com/questions/52389664/xcode-10-not-being-able-to-archive-project
Railsのdeviseを使って複数のユーザー別でログインする方法

# はじめに
こんにちは！
本日はRailsのdeviseというGemを使って、ユーザー別にログイン画面を分けて実装する方法をご紹介いたします^^

ここでは生成するユーザーとして、PostWriter(記事書く人)とPostReader(記事読む人)を作っていきたいと思います！

**前提条件として、Railsの環境構築、deviseのインストール・設定(rails g devise:installコマンドなど)は終わっているものとします。**

# Modelを生成する
Modelをコマンドラインから実行していきます！
ちなみにgは`generate`の略になります。略語でも実行できるのとてもありがたいですね^^

PostWriterモデルを作成するにはこちらのコマンド
→ `$ rails g devise PostWriter`

PostReaderモデルを作成するにはこちらのコマンド
→ `$ rails g devise PostReader`

こちらはよく使用するコマンドである`rails g model モデル名`とよく似ていると思います。その要領で大丈夫です。モデルを作成したので、`rails db:migrate`を忘れずに!

# Controllerを生成する
続けてControllerを生成していきます！

PostWriterコントローラーを生成するにはこちらのコマンド
→ `$ rails g devise:controllers post_writers`

PostReaderコントローラーを生成するにはこちらのコマンド
→ `rails g devise:controllers post_readers`

ここではコマンド内で、`controller`ではなく、`controllers`と**s**がついていることに気をつけてください^^

# 設定ファイルを変更する
下記のコードがデフォルトだとコメントアウトされていると思いますので、こちらのコメントアウトを外します。
この行はdeviseのViewをカスタマイズするために設定するものとなります。設定ファイルを変更した際は、`rails s`などサーバーの再起動を忘れずに!

```
config.scoped_views = true
```

# Viewを生成する

PostWriterビューを生成するにはこちらのコマンド
→ `rails g devise:views post_writers`

PostReaderビューを生成するにはこちらのコマンド
→ `rails g devise:views post_readers`

# ルーティングを設定する

```
# config/routes.rb

Rails.application.routes.draw do
  devise_for :post_readers, controllers: {
    sessions: 'post_readers/sessions',
    passwords: 'post_readers/passwords',
    registrations: 'post_readers/registrations'
  }

  devise_for :post_writers, controllers: {
    sessions: 'post_writers/sessions',
    passwords: 'post_writers/passwords',
    registrations: 'post_writers/registrations'
  }
end

```

# それぞれのログイン画面を表示してみる
まずPostWriter(記事書く人)のログイン画面を表示してみましょう。(localhost:3000の部分はそれぞれの環境によって変えてください。)
URL：http://localhost:3000/post_writers/sign_in

次にPostReader(記事読む人)のログイン画面を表示してみましょう。
URL：http://localhost:3000/post_readers/sign_in

↓↓↓サンプル画像↓↓↓
![rails_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485469/76e4b2bd-9a20-efa8-a635-74d198a1f86a.png)


**エラーが出た場合**は、
・サーバーは起動しているか → `rails s`
・モデルを作成したのでmigrateする → `rails db:migrate`
・ルートが間違っているかも？ → `rails routes`

# 終わりに
以上がRailsのdeviseを使って複数のユーザー別でログインする方法でした。
プログラミングを勉強し始めて思ったのは、やはり知っていることが多いほど特をする。。
他の業界でも同じだと思いますが、この業界でも同様ですね^^
一つ知っているだけでコーディングのスピード感が全然違ってきます。それが積み重なっていった方が激強エンジニアや、つよつよエンジニアと呼ばれるのかもしれません笑
はじめ私は`rails routes`コマンドを知らず、エラー画面とひたすら向き合っていました。。。
環状二本鎖DNAのイラストをPythonで描く

# どうしても環状二本鎖DNAをキレイに描きたい
プレゼンの際、パワポに載せる図として環状二本鎖DNAのイラストが欲しい時がある。せっかくなのでPythonで描いてみる。

###major groove と minor grooveを区別して描く
![plot_out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/82586677-4b2a-3cc4-14d6-15e4009b4e34.png)

```python:circular_dsDNA_groove.py
#!/usr/bin/env python3

import math
import matplotlib.pyplot as plt

zigzag_num=24
zigzag_size=0.075
lw=1

fig=plt.figure(figsize=(5,5))
ax=fig.add_subplot(111)

# DNA1本目
x=[]
y=[]
for theta in range(3600):
    theta=theta/10
    i=math.sin(math.radians(theta * zigzag_num))
    mag= 1 + (zigzag_size * i)
    x.append(math.sin(math.radians(theta)) * mag)
    y.append(math.cos(math.radians(theta)) * mag)
ax.plot(x, y, color='k', linewidth=lw)

# DNA2本目
x=[]
y=[]
for theta in range(3600):
    theta=theta/10
    i=math.cos(math.radians(theta * zigzag_num))
    mag= 1 + (zigzag_size * i)
    x.append(math.sin(math.radians(theta)) * mag)
    y.append(math.cos(math.radians(theta)) * mag)
ax.plot(x, y, color='gray', linewidth=lw)

plt.savefig('plot_out.png', transparent=True)

```

###major groove と minor grooveは描きたくない場合
![plot_out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/69ed6147-7e3c-227f-840a-9936311562fc.png)

```python:circular_dsDNA.py
#!/usr/bin/env python3

import math
import matplotlib.pyplot as plt

zigzag_num=24
zigzag_size=0.075
lw=1

fig=plt.figure(figsize=(5,5))
ax=fig.add_subplot(111)

# DNA1本目
x=[]
y=[]
for theta in range(3600):
    theta=theta/10
    i=math.sin(math.radians(theta * zigzag_num))
    mag= 1 + (zigzag_size * i)
    x.append(math.sin(math.radians(theta)) * mag)
    y.append(math.cos(math.radians(theta)) * mag)
ax.plot(x, y, color='k', linewidth=lw)

# DNA2本目
x=[]
y=[]
for theta in range(3600):
    theta=theta/10
    i=math.sin(math.radians(theta * zigzag_num))
    mag= 1 - (zigzag_size * i)
    x.append(math.sin(math.radians(theta)) * mag)
    y.append(math.cos(math.radians(theta)) * mag)
ax.plot(x, y, color='gray', linewidth=lw)

plt.savefig('plot_out_circular.png', transparent=True)
```

# ついでに線状二本鎖DNAもキレイに描きたい
![plot_out_linear.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/40c04de5-9b61-5051-f7b6-285f0ed7c6dc.png)

```python:linear_dsDNA.py
#!/usr/bin/env python3

import math
import matplotlib.pyplot as plt

len=20
zigzag_size=0.8
lw=1

fig=plt.figure(figsize=(5,5))
ax=fig.add_subplot(111)

# DNA1本目
x=[]
y=[]
for i in range(10 * len):
    i=i/10
    x.append(i)
    y.append(math.sin(i*3.14*2) * zigzag_size)
ax.plot(x, y, color='k', linewidth=lw)

# DNA2本目
x=[]
y=[]
for i in range(10 * len):
    i=i/10
    x.append(i + 0.314)
    y.append(math.sin(i*3.14*2) * zigzag_size)
ax.plot(x, y, color='gray', linewidth=lw)

ax.set_ylim(-len, len)
plt.savefig('plot_out_linear.png', transparent=True)
```
# 環境
Ubuntu 18.04
Python 3.7.3
matplotlib 3.1.0