OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】Tweepyで特定単語が含まれたツイートをいいね、RTするやつ

#やること
・新規アカウントの取得
・Twitter apiをつかう
・Tweepyのインストール
・Pythonでツイッターの検索
・単語が含まれるツイートを自動RT、いいね
・一定数リストに追加されたアカウントをフォロー

#大体参考の通りに進めた
[【Python】 Tweepyで、ツイート・フォロー・リムーブ・検索・画像投稿する方法をまとめてみた](https://qiita.com/kkdmgs110/items/d4fa5de0187f25d1d6f7)

RTを取り消すのはここから
[Twiter APIを使ってRetweetを取り消す処理](http://pg-kura.hatenablog.com/entry/20120328/1332949548)

#ここからやったこと
検索ワード含むツイートをリストに100件取得してその中からランダムで一つリツイートいいね

```python:like_RT.py
import urllib.request
from requests_oauthlib import OAuth1Session
import requests
import tweepy
import os
import random
# 各種キーをセット
# ******に各自の数値を入力
CONSUMER_KEY = '******'
CONSUMER_SECRET = '******'
ACCESS_TOKEN = '******'
ACCESS_SECRET = '******'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
#apiを取得
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
#APIインスタンスを作成
api = tweepy.API(auth)
my_id = "search_words"

#Hello, world!と投稿するテスト
# api.update_status('Hello, world!')

word = "******" #検索する単語
count = 100
search_results = api.search(q = word, count = count) #q: 検索ワード, count: 検索ツイート数

#ユーザー名を取得しそのユーザーのツイートにいいねとフォロー
result = random.choice(search_results)
username = result.user._json['screen_name']
user_id = result.id #ツイートのstatusオブジェクトからツイートidを取得
print(user_id)
user = result.user.name #ツイートのstatusオブジェクトからuserオブジェクトを取り出し名前を取得する
print(user)
tweet = result.text #ツイート内容を取得
try:
    api.create_favorite(user_id) #いいね
    print(user)
    print("をいいねしました")
    api.retweet(user_id) #RT
    print(user_id)
    print(tweet)
    print("をRTしました")
except: #重複してRT,いいねができないためエラーを出すので例外
    print("もうすでにいいねかRTしてます")
print("##################")

```
Blenderで手軽に人型3Dモデルを作れるManuelBastioniLAB使ってみた

##ManuelBastioniLAB
Blenderには便利なアドオンがいくつかあって、そのうちの1つ
ManuelBastioniLABは人型3Dモデルを簡単に作れるアドオン

他にも家が簡単に作れるものなど、知らないだけで他にもいっぱいあると思うので調べてみてほしい。

[一覧をバーっとのせてくれているサイト](https://sites.google.com/site/tomo0web/home/blender-lab/blenderaddonpicturebook)や、[オススメを紹介してくれているサイト](http://t0rry.hateblo.jp/entry/2018/01/01/000000)などがあるので
「"Blender" "アドオン" "オススメ"」で検索検索ぅ！

##バージョン
Blender ver.2.79bを使用

英語に弱いので日本語設定済みです。
ちなみに言語は海外の動画も参考にしたい人は英語にしておくのがオススメ。
すぐ設定変えれるので私は適宜変更という１番覚えられないやり方をしている気がする...。

とにかく以後日本語前提で進めていきます！

##手順
####①[ここ](http://www.manuelbastioni.com/download.php)でManuelBastioniLABをダウンロード
とりあえず最新のバージョンをとってこれば大丈夫なはず
<br>
####②BlenderでアドオンとしてManuelBastioniLABを使えるように設定する
アドオンのいれ方は基本共通なので、他のものを入れる際も以下を参考にしてください。

1. Blenderを開く
2. ユーザー設定を開き(上部メニューバーのファイル>ユーザー設定)、アドオンを選択
3. ファイルからアドオンをインストールを押して、最初にダウンロードしたものを選ぶ
4. アドオンのページにCharacters:ManuelBastioniLABが表示されるのでチェックをつける
 <img width="500" alt="スクリーンショット 2018-07-19 13.01.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/249053/19cc651a-bbb6-a394-7d69-1e9ad36cdc96.png">

5. 設定手順は以上。最初の画面に戻り、左メニューバーの１番下にManuelBastioniのタブが出ていれば完了
<img width="50" alt="スクリーンショット 2018-07-19 13.01.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/249053/aed30fef-78b4-7987-44a5-9585e28abaee.png">

<br>
####③人を作る
あとは各項目に沿って人を作るだけ。
もし細かく設定してモデルを作ったら詳細も別の記事に書きたいと思います。今回は簡単に概要だけ。
<br>
**人を生成する**(禁忌の錬金術...)
最初にベースとなるモデルを選び(アジア人女性〜エルフの男性まで様々！)、Init Characterを押すと人型のモデルが生成されます。

<img width="250" alt="スクリーンショット 2018-07-19 15.15.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/249053/09c7c721-99ca-cafc-b462-e209ab62daa9.png">

<br>
**体格の調整**
大雑把でおk！という人は
→１番上に表示されるCharacter_age(年齢)、Character_mass(体重...というより体脂肪率っぽい?)、Character_tone(筋肉)を設定

細かく設定したい人は
→下に並んでる項目のうち「Body,face and measure parameters」で体の各パーツを細かくいじることができます


**肌質の確認**
肌の付いた状態で確認したい人は、下のアイコンからレンダーを選択すると肌の状態までチェックできます
<img width="300" alt="スクリーンショット 2018-07-19 15.23.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/249053/d1ebbd1e-5940-e1e2-2188-a27e9fe5ba84.png">


**髪**
髪は自分で作るのが１番自由度が高いですが、そんなんめんどくさいという方のためにデフォルトで用意された髪型があります。

髪を設定すると体のパーツの調整ができなくなります！終わってからやること！

設定するにはまず、Finalize toolsの「Finalize with textures and backup」をおしてファイナライズする必要が。
<font color="red">ファイナライズについて注意書きあり！後述読んでから押してね！</font>

これが完了すると下の画像のようなAFTER-CREATION TOOLSというメニューが出てきて、ここのAssets modelの項目にある髪型を選ぶと、人型モデルに髪型が適用されます。
<img width="314" alt="スクリーンショット 2018-07-19 15.28.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/249053/088464ab-60ce-8628-7664-290e729359a8.png">

２度目になりますがこれを行なってしまうと体のパーツの調整ができなくなります。注意してください。
<br>
#####<font color="red">！ファイナライズの注意点！</font>
ファイナライズでは、人のモデルのテクスチャを書き出しています(多分。検証中...)
これがないとモデルに肌色がついてないまま使う羽目に...しっかり保存先を覚えておきましょう。
モデルをUnityで使いたいという人はこの時の保存先をUnityプロジェクトのAssets内にしてしまうのがいいかも。
これはよし、完成！ってなってから押してください！！押すと戻れないので、その前に保存すべし。


<br>
####④Unityでモデルを動かす
[BlenderのManuelBastioniLABで作ったモデルをUnityにインポートする](https://qiita.com/haruno/items/f32ae4129d3b62844b9d)書きました！
動かすというより、Unityにいれて動かす準備をする段階まで、について書いています。

以上！
Suspend on LANのような何か

本当はTCP/IPのプログラムを書くべきかもしれないが、とりあえずSystemdを使ってそれっぽいことができたのでまとめておくことにした。

# TL;DR

基本方針はSystemdにroot権限でsuspendさせるようにする

1. Systemdにinotifywaitで特定ファイルの書き込みを監視させるプログラムを置く
2. SSHで指定されたファイルにコマンドを書き込む
3. コマンドに応じて指定された処理を実行

SSHで特定ファイルに'suspend'と書けばサスペンドできるようになる目論見

# inotifywaitで特定ファイルの書き込みを監視する

```bash:cmdwatch
#!/bin/bash

reqfile="てきとうなファイル"

while :
do
    inotifywait -e modify -e close_write $reqfile
    comreq=`cat $reqfile`
    if [ "$comreq" = "suspend" ]; then
        sudo systemctl suspend
    elif [ "$comreq" = "kill" ]; then
        break
    elif [ "$comreq" = "test" ]; then
        echo test
    fi
done

echo finish

```

コマンドリクエスト用のファイルに書き込みがあったら内容を確認してコマンドに応じた処理が走るようになっている
ファイルは特定ユーザのみが読み書きできるようにしておくとrootまたは特定ユーザのみが書き込みできるようにできるので意図しないユーザがコマンド実行することはない

# systemdでデーモン化

```bash:/etc/systemd/system/rootcmd.service
#Root commnader

[Unit]
Description=Watch commands, root execution.

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/cmdwatch
Type=simple

[Install]
WantedBy = multi-user.target

```

ユーザをrootにするとcmdwatchで実行するコマンドがrootで実行されることになる

# 使いみち

macOSやwinなどでssh環境が整えてあれば以下のコマンドでサスペンドできるようになる

```
ssh -i 鍵ファイル user@server "echo suspend > 指定したファイル"
```

これをmacOSならAutomator、winならbatファイルとして保存しておけばダブルクリックでサスペンドできるようになる
べんり。
データ用のサーバPCが８台のHDDを使っていて音がうるさいのと電気がもったいないのでこんなことをすることになった

# 参考

- [Systemdを使ってさくっと自作コマンドをサービス化してみる - Qiita](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)
- [inotify-toolsでファイルやディレクトリを監視する - Qiita](https://qiita.com/stc1988/items/464410382f8425681c20)

# そのほか

cmdwatchって名前をつけたけど、コマンド監視だけじゃなくて実行もするからネーミングとしてはよくなかったかもしれない
LaravelでのForm要素についてメモ

HTML5である程度の入力制御を行えるようになってきたのは良いけど、段々複雑化してきた気がする。

とりあえずlaravel/collectiveの機能を使ってinput[type="tel"]やらinput[type="number"]やらを作成する時いつも忘れるのでメモ

```
<?php

Form::input('type名', 'name名', old('name名'), [attributes])

```
patternを定義した場合、パターンに該当しない文字を入力した場合、submitは行えずエラー吹き出しが出る。
これをpattern定義以外受け付けないようにするには、別途jQueryライブラリを読ませた方が良いと思われる。

ただ、所詮クライアント側で入力チェックした所で、サーバ側で結局入力チェックするから二度手間なんだけどね。
Docker ポートフォワードをひとつ増やす

とてもハマったのでメモです。

```
ディレクトリ構成
・A(Nuxt.js/ポート3000)
・B(Laravel/ポート80)
```

同じリポジトリ内のAとBを、それぞれ別のポート番号を割り振りたい

Kitematic上でポートフォワーディングをひとつ増やす

```
Aディレクトリ用
port 80
localhost:1122

Bディレクトリ用（今回追加）
port 3000
localhost:1123
```

saveすると、Dockerの構成が変わる
`/bin/bash` から `sh` に変わり、これまで使えていたコマンドが使えなくなる

```
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES
XXXXXXXXXXXXX        testAB             "sh"                XX seconds ago      Up 29 seconds       0.0.0.0:1122->80/tcp, 0.0.0.0:1123->3000/tcp   testAB
XXXXXXXXXXXXX        another_pj         "/bin/bash"         XX months ago       Up 21 hours         0.0.0.0:13306->3306/tcp                        another_pj
```

以下を再インストールしました

```
php
composer
nuxt
```

手順のメモ

```
//Aディレクトリへ移動
//php7.1を入れる
yum -y install \
  php71 \
  php71-cli \
  php71-common \
  php71-devel \
  php71-fpm \
  php71-gd \
  php71-intl \
  php71-mbstring \
  php71-mysqlnd \
  php71-pdo
//composerを入れる
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
//ビルドインサーバー動いた
php artisan serve --host 0.0.0.0 --port=80
```

```
//Bディレクトリへ移動
//nuxtをインストールする
npm install --save nuxt
//エラーで言われたコマンドを叩く
npm i npm@latest -g
//もう一度
npm run dev
//node_modules/node-sass/vendorがないってエラーがたくさん出る
//インストール
npm rebuild node-sass
//もう一度
npm run dev
```
初めてのAndroid Studio

#内容
**・Androidの基礎知識**
**・Android Studioのインストール**
**・プロジェクトの作成**


#Android Studioのインストール
下記のリンクからダウンロード可能です。
**https://developer.android.com/studio/**
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3234393237372f37323765666436662d363533302d656634662d356665382d6539316163356231643432322e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/249277/bd4ecc0c-7fd2-6f44-867a-ec32ba674e4a.png)

緑色の[Android Studio][FOR WINDOWS]をクリック→ダウンロード
ライセンス条項の同意にチェックを入れダウンロード。
記載された手順に従いインストールすることができます。

#プロジェクト作成手順
**1.プロジェクト作成ウィザードを起動**
　　　　　　　↓
**2.プロジェクト基本情報を入力**
　　　　　　　↓
**3.作成アプリのターゲットを選択**
　　　　　　　↓
**4.テンプレートの選択**
　　　　　　　↓
**5.アクティビティの情報を入力**
上記の内容入力後[Finish]をクリック
![スクリーンショット 2018-04-12 18.58.36.png](https://qiita-image-store.s3.amazonaws.com/0/249277/60f5d152-74e2-cd0b-32fc-d5f723ca55dd.png)
プログラム作成中の表示**↑**
#Android Studioの新しいプロジェクトの作成は
[File]メニュー→[New]→[New Project]
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3234393237372f36623331626438352d323365352d313532372d373962622d3038336438653461626436382e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/249277/3ec09be2-a8de-6f92-ba2a-795739a406d5.png)
react-native(iOS) で Date() まわりの処理が、リリースビルド の時のみおかしいことがある

# 現象
`const someDate = new Date('2018-07-01 11:22:33')`
みたいな処理がデバッグビルドでデバッガー動かしながらでは動くのに、実機リリースビルドでは動かない(日付が入らない?)

# 確認したversion
RN 0.50.4 ちょっと古い
iOS

# 原因
https://github.com/facebook/react-native/issues/15819#issuecomment-351415843

リリースビルドではJavaScriptCoreを使用していが、それが対応していない形式の日付文字列だとだめな模様

# 取り急ぎの解決策
momentを使う


# その他
最新のRNのversionだとどうなんでしょう。。未確認。

ここ以外にもJSCoreの挙動の違いによる不具合とかはいろいろありそう。
Swiftで端末のロケールや暦法設定に左右されずに常に固定のフォーマットで時刻表示する方法

Swiftでフォーマットを指定して時刻を表示するためにDateFormatterを使いますが、localeやcalendarといったプロパティの設定があり、また端末側でもロケールや暦法が設定できるため混乱しがちですが、常に同じフォーマットで表示できれば良いのであれば以下のコードでOKです。

これは公式ドキュメントで紹介されています。
https://developer.apple.com/documentation/foundation/dateformatter

```swift
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
formatter.locale = Locale(identifier: "en_US_POSIX")

dateLabel.text = formatter.string(from: Date())  // 2018/07/19 12:05
```
tensorflow の GraphDef を JSON 形式でシリアライズ/デシリアライズする

## 背景

protobuf のバイナリ/テキスト形式を使いたくない.
onnx も protobuf 形式でつらい.

ちょっとしたグラフをいじるプログラムを書きたいとしても...

* C++ では protobuf リンクが面倒である.
* python でも protobuf モジュールインストールが面倒である.
* python で `import tensorflow` が遅くてつらい.

JSON で扱うことで, たとえばグラフの解析やテスト用データ生成を, C++ json.hpp https://github.com/nlohmann/json でヘッダーオンリーライブラリで処理したり, python 標準の json モジュールだけで処理したい.

## JSON 形式でダンプする.

tensorflow の `GraphDef` オブジェクト(Protobuf オブジェクト?)であれば, `MessageToJson` で Protobuf の JSON 形式にシリアライズできます. 

```
from google.protobuf.json_format import MessageToJson

from tensorflow.core.framework import graph_pb2
graph_def = graph_pb2.GraphDef()

...

# to JSON
j = MessageToJson(graph_def)

with open("output.json", "w") as o:
    o.write(j)
```

テンソル値などのバイナリデータは base64 でエンコードされます.
たとえば Const は以下のような感じの JSON になります.

```
{ "node": [
	{
	  "attr": {
	    "dtype": {
	      "type": "DT_FLOAT"
	    },
	    "value": {
	      "tensor": {
	        "dtype": "DT_FLOAT",
		"tensorContent": "AACAPwAAAEDNzAxAAACAQA==",
		"tensorShape": {
		  "dim": [
		    {
		      "size": "4"
		    }
		  ]
		}
	      }
	    }
	  },
	  "name": "const1",
	  "op": "Const"
	}
	]
}
```

## JSON を処理する

普通の JSON なので, いろいろ簡単に料理できます!(レイヤーの名前を変えたりとか, 解析とか)

## Tensorflow で JSON データを読み戻す.

`JsonToMessage` は何故か無い.
`JsonStringToMessage` は C++ レイヤーではあるようですが, python binding では無いようです...

https://github.com/google/protobuf/issues/1690

`google.protobuf.json_format.Parse` を使います.

```
import tensorflow as tf
from google.protobuf import json_format
from tensorflow.core.framework import graph_pb2

with open(sys.argv[1], "r") as f:
    graph_def = json_format.Parse(f.read(), graph_pb2.GraphDef())

    with tf.Session() as sess:
        tf.import_graph_def(graph_def)
``` 

Voila! めでたく JSON から復元できました.

# TODO

* **優秀な Protobuf -> JSON 若人が, 人類史上最速で育成されるスキーム**を確立する旅に出たい.
* glTF のように, JSON で定義された業界標準の機械学習フォーマット本当にはよ!
Cognito UserPoolsのユーザをtsvファイルにエクスポートする

タイトルのままです。users.tsv にエクスポートします。

```bash
/bin/bash <<'SCRIPT'
while : ; do
  aws cognito-idp list-users --user-pool-id ap-northeast-1_XXXXXXXXX $tokenopt | tee tmp | jq -r '.Users[] | [.Username,.Enabled,.UserStatus,.UserCreateDate,.Attributes[].Value] | @tsv' >> users.tsv
  token=`jq -r '.PaginationToken' tmp`
  if [ "$token" == "null" ]; then break; else tokenopt="--pagination-token $token"; fi
done
rm tmp
SCRIPT
```
CloudWatchからS3のBucketごとのデータサイズを確認する手順

# 概要

S3の消費ファイルサイズを確認するために以前はAPIを叩く必要がありましたが、最近は **設定無し** でCloudWatchにS3データ量のメトリクスが保存されてます。なので今すぐAWS Management Consoleから消費データサイズを知ることができます。知らないうちに便利になってたんですねー。

# 手順

* AWS Management Consoleから Cloud Watch のページを開く。
* 左側のメニューからメトリクスを選択する
* データ量を確認したいS3 Bucketの BucketSizeBytes 行をチェックする。
* 表示間隔を 1週間 にする。(1日ごとにしかメトリクスを取得しないのでデフォルトの3時間ではなにも表示されない。)



![スクリーンショット_071918_025124_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/529/b5d2cded-4a47-542b-331a-a267e9657a1b.jpeg)

以上です。
rsync ファイルリストを指定してコピー

# rsync コマンドにファイルのリストを渡してバックアップ等行う方法

`--files-from` オプションを使う。

`rsync -a --files-from=<your_file_name> <source_dir> <target_dir>`


- `<your_file_name>`：ファイルのリストを格納したファイル
- `<target_dir>`：バックアップ先のディレクトリ
- `<source_dir>`：コピー元（ファイルリストに記載のファイル）のディレクトリ（絶対パスでファイルリストを記載した場合には，`/`（ルート）から始まるのでここは`/`を指定する。相対パスの場合は然るべきディレクトリを指定。）

# 使用例（bashスクリプト）

```do_rsync.bash
#!/bin/bash -eu

###
# Please give the appropriate file and disk paths
# of each file list and the mounted disk
# to the variables, file_name=@@@ and disk_name=@@@, respectively.
###

# USAGE:
#      nohup bash do_rsync.bash > log.txt &

###  SETTING  ###

file_name=/home/hnishi/bak3_20180716/disk1/filelist_201806_disk1.txt
disk_name=/media/HDD1_4TB

###  HARD CODE  ####################
# You do not need to change the codes below
echo  "USAGE:    nohup bash do_rsync.bash > log.txt &"
echo You selected
echo list: $file_name
echo disk: $disk_name

file=$(rev <<< $file_name |cut -d"/" -f 1|rev)
disk=$(rev <<< $disk_name |cut -d"/" -f 1|rev)
log_name=log_do_rsync_${file}_${disk}.txt

echo
echo The log appears as a file
echo $log_name

date > $log_name
echo list file: $file_name   >> $log_name
echo disk path: $disk_name   >> $log_name

rsync --partial --itemize-changes -auR --files-from=${file_name} / $disk_name >> $log_name

#cat $file_name |xargs -P 2 -I {} rsync --partial --itemize-changes -auR {}  $disk_name >> $log_name ## catで渡す場合

date >> $log_name

echo
echo
echo successfully finished
```

# 補足

- `cat`コマンドで開いてパイプで渡す方法(`cat <your_file_name>|rsync <target_dir>`)でもできるが，`--files-from` オプションを使った方が早いことを確認した。
$_SESSIONは何のために使うの

##セッションとは？

セッションは**Webサイトにアクセスして行う一連の行動**のこと。

この**一連の行動**をこちらで定義しておくことで、その間（セッション中）webサーバーはデータを保持したままにしてくれる。

例えば、ログインからログアウトまでを１セッションと考えることで、その間はログインしたままにしておくことができる。
ページを移動しても、いちいちログインしなおさずに済む。
バリデーション調べている間に覚えたこと

今やっているお問い合わせフォームの作成でもそうやけど、phpは基本的に正規表現をよく使う。

##$_SEVER変数

phpが稼働しているwebサーバーの色々な情報をはじき出してくれる。
サーバー変数は連想配列から取り出すので、**`$_SEVER('キー名')`**のような感じ。
特に、前のページで`post`,`GET`などで、飛ばしてきたデータを使いたい場合は、
**`$_SEVER('REQUEST_METHOD')`**のような感じ。
これで、前のページから飛んできたものが、`POST`とか`GET`とか種類を判別できる。

```php

if($_SEVER['REQUEST_METHOD']==='POST'){

～～～～～

}

```

上は、もし前のページからpostが飛ばされているのなら、以下のものを実行するという意味。

##header関数

バリデーションで、前回ページに飛ばす際に必要だった。

```php

  if(! isset($name)) {
            echo '名前が記入されていません。';
            header('Location:http://nishimura.pg-bootcamp.com/input.php');
            exit;
        }

```

SESSIONを保持したまま前回ページに飛ばすことができなかった。
そもそもできないのか。


##preg_match

```php

echo preg_match("/c[aeiou]t/" , "I love my cat")

```
peg_matchは第一引数の指定が、第二引数でどれだけ該当しているかどうかチェックしてくれる。
この場合、第一引数の`"/c[aeiou]t/"`はcで始まりtで終わる。2文字目は[aeiou]のどれか。これが該当する単語がいくつあるかを調べてくれる。
この場合、該当するのは第二引数のcatだけなので1と結果が呼び出される。
teratailで見つけたバリデーションの例では、

```php

$pattern = '/\A([a-z0-9_\-\+\/\?]+)';
  $pattern .= '@([a-z0-9\-]+\.)+[a-z]{2,6}\z/i';


  if(!preg_match($pattern ,$email)){
    $err = '';
  }else{
    $err = 'メールアドレスの形式が違います。';
  }

```

何かがあった。上記で`$pattern`に変数を入れて、下記で、`$pattern`に該当しない`$email`ははじき出すように設定している。

##$issetと$!emptyの違い

```php

         : isset() : !empty()
-----------------------------
未定義   :  FALSE  :  FALSE   一致　
NULL     :  FALSE  :  FALSE   一致　
FALSE    :  TRUE   :  FALSE   不一致
空文字   :  TRUE   :  FALSE   不一致
空配列   :  TRUE   :  FALSE   不一致
0        :  TRUE   :  FALSE   不一致
'0'      :  TRUE   :  FALSE   不一致
'0a'     :  TRUE   :  TRUE    一致　
unset後  :  FALSE  :  FALSE   一致　

$hoge_back=0a

```

わかりやすかったので他サイトから引用。
`$isset`は変数が示す先が、`Null`かどうかだけを調べている。
`$!empty`は〃、`Null`かどうかかつ、0かどうかを調べている。

>http://d.hatena.ne.jp/tatakauashi/20080529/1212030859

##$err

エラー時のメッセージを格納する。

##return文

##サニタイズ化

消毒するといういみ。
入力フォームなどで、無効な数値を入力された際に、予期せぬフォームプログラミングの動作を防ぐもの。




##エラーメッセージ諸々

###Notice: Undefined variable:
意味：未定義の変数がある
解決策：変数をちゃんと定義する

###Notice: Undefined index:
意味：グローバル変数に値が格納されていないのによぼうとしてる
解決策：定義しなおす。ページ移動した際におきやすい。
（自分の場合字が間違ってただけ…）

##思ったことメモ

###引き値より戻り値のほうが便利？
引き値と戻り値の違いがいまいち理解できなかったけど、できたような気がする。
それから思ったのは、戻り値のほうが便利ちゃうか。

>お世話になったサイト達
http://life-collections.com/dev/programming/php_validation_check
https://teratail.com/questions/136429
https://gray-code.com/php/make-the-form-vol5/
Collectionを文字列にキャストした場合の挙動

マニュアルには特に書いていないのだけれどもJSONとして出力される。

```laravel/framework/src/Illuminate/Support/Collection.php
    /**
     * Convert the collection to its string representation.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->toJson();
    }
```

後輩がjson_decodeにCollectionを渡して配列にする処理書いてて、突っ込みどころが満載であるもののエラーにもならずに正常に動作してたので不思議に思って調べたらこうだった。
ディリクレ分布、ディリクレ過程


#モチベーション
ディリクレ過程混合モデルによるクラスタリングを理解したい。
LDAとかでもディリクレ分布は使うし、今勉強するしかねえ
## 今回取り組む範囲
ディリクレ分布の理解
ディリクレ過程の理解
まずはこれらの表面をなぞる。

##ディリクレ分布
- wiki
ディリクレ分布（ディリクレぶんぷ、英: Dirichlet distribution）は、連続型の確率分布である。ベータ分布を多変量に拡張して一般化した形をしており、そのため多変量ベータ分布とも呼ばれる。ディリクレ分布の確率密度関数は、同時に発生することのない $K$  個の事象がそれぞれ$\alpha_{i}-1$回発生したときに、各事象の起こる確率が ${\displaystyle x_{i}}$である確率を与える（ただし、${\displaystyle \alpha_{i}}$は整数である必要はない）。つまり、試行の回数が無限大なら各事象の発生の相対頻度は ${\displaystyle x_{i}}$になるが、試行回数が有限だと、そこにずれが生じる。そのずれを表すモデルである。

- wikiを要約
ベータ分布は二項分布の共役事前分布
ディリクレ分布は多項分布の共役事前分布
ディリクレ分布はベータ分布の一般化=多変量ベータ分布  
"同時に発生することのない $K$  個の事象がそれぞれ$\alpha_{i}-1$回発生したときに、各事象の起こる確率が ${\displaystyle x_{i}}$である確率を与える"のイメージ
<img width="709" alt="スクリーンショット 2018-07-19 13.15.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/270013/57fc99db-097a-cf75-93f2-49c44f038edf.png">
引用元: https://www.slideshare.net/stjunya/ss-29629644

とりあえずふんわりとだけど理解できた。
次はディリクレ過程


##ディリクレ過程(Dirichlet Process)

- そもそもディリクレ過程って何者?  
基底測度と呼ばれる確率分布から離散分布を生成する確率過程。  
イメージ図  
<img width="378" alt="スクリーンショット 2018-07-19 13.33.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/270013/b42fa5e8-546b-2656-7542-a44ea7e95109.png">  
引用元: http://chasen.org/~daiti-m/paper/ieice10npbayes.pdf  
基底測度が1次元上連続分布の場合、生成される離散分布は無限次元の多項分布。
つまり無限次元のディリクレ分布と言える。  
__要約:ディリクレ分布の確率分布__
- 用途  
離散分布を生成する。  
イメージ:ディリクレ過程サイコロを振ると離散分布が生成される。

#まとめ
- ディリクレ分布
 - 多項分布の共役事前分布
 - 多変量ベータ分布
- ディリクレ過程
 - 離散分布を生成する確率過程
 - 無限次元のディリクレ分布

今回はここまで、次は、クラスタリングに触れるとこまで書きたいけど、ノンパラメトリックベイズか続パタ読んでからになりそう
##参考文献
http://proc-cpuinfo.fixstars.com/author/takashi-osawa/
sre_parse.parse keyword 




sre_parse.parse returns tree of automaton for regular expression. 
Since there are no document, this note was taken.
(python 2.7)

```  
import sre_parse
tree=sre_parse.parse(Regex)
print(tree)
```

- LITERAL


```
('literal',　<char code> )
>>> sre_parse.parse(r'a')
[('literal', 97)]
```




- NOT_LITERAL　

```
('not_literal', <char code> )
>>> sre_parse.parse(r'[^a]')
[('not_literal', 97)]
```

- ANY

```
('any', None)
>>> sre_parse.parse(r'.')
[('any', None)]
```
- AT

```
('at', <type of position> )
>>> sre_parse.parse(r'^1')
[('at', 'at_beginning'), ('literal', 49)]
```

- IN

```
('in', [　] )
>>> sre_parse.parse(r'[abc]')
[('in', [('literal', 97), ('literal', 98), ('literal', 99)])]
```

- NEGATE

```
('negate', None)
>>> sre_parse.parse(r'[^1234]')
[('in', [('negate', None), ('literal', 49), ('literal', 50), ('literal', 51), ('literal', 52)])]
```


- SUBPATTERN (note: python3 has different format) 

```
('subpattern',( <match number>, [] ))
 >>> sre_parse.parse(r'(ab)c')
[('subpattern', (1, [('literal', 97), ('literal', 98)])), ('literal', 99)]
```


- RANGE

```
 ('range',( <start char code>, <end char code> ))
>>> sre_parse.parse(r'[1-9]')
[('in', [('range', (49, 57))])]
```

- MAX_REPEAT/MIN_REPEAT 

```
('max_repeat', (<min repeat>, <max repeat number>, [] )
>>> sre_parse.parse(r'a{5,8}')
[('max_repeat', (5, 8, [('literal', 97)]))]
```

- BRANCH

```
('branch', (None, [ [], [] ] ))
>>> sre_parse.parse(r'abc|def')
[('branch', (None, [[('literal', 97), ('literal', 98), ('literal', 99)], [('literal', 100), ('literal', 101), ('literal', 102)]]))]
```

- CATEGORY

```
('category', <category type> )
>>> sre_parse.parse(r'\d')
[('in', [('category', 'category_digit')])]
```

- GRPUPREF

```
('groupref', <group reference number> )
>>> sre_parse.parse(r'(?P<abc>12)3(?P=abc)')
[('subpattern', (1, [('literal', 49), ('literal', 50)])), ('literal', 51), ('groupref', 1)]
```

- ASSERT_NOT

```
('assert_not', (<match number>, []))
>>> sre_parse.parse(r'1(?!12)')
[('literal', 49), ('assert_not', (1, [('literal', 49), ('literal', 50)]))]
```
Xamppでサブドメインを作る

この頃のPHPとかの仕事ってドメインルートにソースをドチャーってする
パターンがおおいよね？
ドメインルートにドチャーってする必要があるならRubyの方が良いと思うのは
わたしだけですかねぇ～。
phpの良さである、自由さを殺すなら別の言語の方がもっと楽じゃねぇ～かな～と。

**とは言っても仕事はありがたくさせて抱きます。**
**が！！サブドメインを作る必要があるので、ここに方法をまとめておきます**

#Xamppでサブドメインを作る

前提条件
* サブドメインのドキュメントルートは【htdocs】の中にしない。
* ドキュメントルートは【C:/xampp/test/】とする。
* サブドメインのURLは【test.localhost】とする。

##Xamppのバーチャルドメインの設定ファイルを変更

対象ファイル
`C:\xampp\apache\conf\extra\httpd-vhosts.conf`

変更部分

```conf
##20行目
- ##NameVirtualHost *:80
+ NameVirtualHost *:80
```

一番下に以下を追加

```conf
<VirtualHost *:80>
	DocumentRoot "C:/xampp/htdocs"
	ServerName localhost
</VirtualHost>

<VirtualHost *:80>
	DocumentRoot "C:/xampp/test/"
	ServerName test.localhost
</VirtualHost>
<Directory "C:/xampp/test">
   Options Indexes MultiViews FollowSymLinks
   AllowOverride All
   Require all granted
</Directory>
```

##Hostsファイルに追記

対象ファイル

`C:\Windows\System32\drivers\etc\hosts`

以下を追加

```conf
127.0.0.1       localhost
127.0.0.1       test.localhost
```

##アパッチの再起動
文系にもわかるIBM Cloudライトアカウント登録方法

# はじめに


IBM製品の勉強をしたいと思ったところからはじめた個人の記録帳です。
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。

私は文系の大学卒業後IT業界に飛び込んだこともあり、サーバ？クラウド？IoT？AIなどなどイメージすらつかない状態でした。そんな私が記載するので、ITとは？といったような人向けの説明になるように心がけて説明させていただきます！興味があるけどどこからIBM Cloudのアカウントを作ればいいのか・・・と困っている。そのような方の役に立ててもらえたら嬉しいです。ビギナーの中でもさらにビギナーの方向けです。

# IBM Cloudのライトアカウントの登録方法
登録する前に、必要になるものは、メールアドレス（G-mail/IBM社員はNoteアドレス可）のみです。
今まではアカウントを作成する時にクレジットカード等で登録する必要があったのですが、今はクレジットカードの紐付けの必要がありません。つまり気づかないうちに課金される事がないので、安全・安心してクラウド（PaaS）のサービスを使用できます。
※IBM社員は2018年7月1日付けで課金制度に変更がありました。サービスによっては部門に課金されるようになっておりますので、社内のレター等でご確認ください。ここでは詳しく述べません。


**step１：IBM HPよりアカウント登録の画面にアクセス**
以下URLよりアクセスしてください。
URL：https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/


**step2:ライト・アカウントを今すぐ登録**
IBM Cloud ライト・アカウントの登録は”ライト・アカウントを今すぐ登録”をクリックしよう！

![スクリーンショット 2018-07-19 11.50.34.png](https://qiita-image-store.s3.amazonaws.com/0/272413/bb143c13-3a45-b135-ea60-7454050c9d52.png)

![スクリーンショット 2018-07-19 13.18.47.png](https://qiita-image-store.s3.amazonaws.com/0/272413/668e638a-1496-5e6e-8764-0ba308ef7e93.png)


**step3:登録に必要な内容を入力**

Eメール、名前、性、国または地域、パスワードを入力する。入力が終わったらスクロールさせる。

![スクリーンショット 2018-07-19 13.22.32.png](https://qiita-image-store.s3.amazonaws.com/0/272413/70baf887-539f-f0b3-cabb-e0384126d0b4.png)

するとアカウント作成ボタンがあるのでクリックする。
![スクリーンショット 2018-07-19 13.27.01.png](https://qiita-image-store.s3.amazonaws.com/0/272413/c21a34bd-539a-7085-1a2d-0922f9752c0b.png)

※この時アカウント作成ボタンがグレーアウト、ボタンのクリックができない時はいずれかの入力（Eメール、名前、性、国または地域、パスワード）に誤りがある場合なので、Step３をやり直してください。

※アカウントの作成が無事完了すると、下記のようなEメールを確認するように表示されます。
![スクリーンショット 2018-07-19 13.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/272413/c50a659d-cd79-6f75-3c0a-c47001e1fbd3.png)

**step4:登録したメールをチェック**

step3で登録したEメール宛にIBM Cloud no-reply@bluemix.net sendgrid.softlayer.comよりメールが届いているはずです。ですので、受信ボックスから送られてきたメールを探してください。メールを開くと、メール本文にConfirm Accountと記載があるので、クリックしてください。
![スクリーンショット 2018-07-19 13.36.03.png](https://qiita-image-store.s3.amazonaws.com/0/272413/ac7c83ec-ac74-980b-7c5b-48765f265ed0.png)

クリック後にボタンに埋め込まれていたURLリンクより、IBM Cloudアカウントの作成に成功した！と表示されてば、アカウントの登録は完了です！！
![スクリーンショット 2018-07-19 13.38.03.png](https://qiita-image-store.s3.amazonaws.com/0/272413/fec1bbd8-b50e-e8e5-3962-fc813cf76c7f.png)

お疲れ様でした！！！Cloudの世界へようこそ！！
LaravelでDBからstdClassで取得したオブジェクトにプロパティが含まれているか調べる方法

# 問題点

例えば以下のような文があったとします。

```php:example.php
$result = DB::table('test_table')
                   ->select('hoge', 'fuga', 'piyo')
                   ->where('id', 123456)
                   ->get();
```

これで取得できる値はhoge, fuga, piyoのカラムの値が取得できるはずなのですが、
過去のDBのカラム追加などで値が含まれていないレコードが取得される場合があり、
その場合矢印演算子でプロパティにアクセスすると例外を吐いて落ちてしまいます。

ですのでproperty_existsなどで存在の有無を調べる必要があるのですが、Laravelで取得されるオブジェクト配列はstdClassで動的に作成されているためproperty_existsでは調べることができませんでした。

# 解決法

```php:example.php
$result = DB::table('test_table')
                   ->select('hoge', 'fuga', 'piyo')
                   ->where('id', 123456)
                   ->get();

$properties = get_object_vars($result[0]);
echo (array_key_exists('piyo', $properties) ? $result[0]->piyo : "no data");
```

# その他
根本的にstdClassでの取得を止められるなら設定変えてしまうのも手段の一つです。

[Laravelで、DBやEloquentクラスでsqlを実行してget()したけど、結果がstdClassになっちゃった場合 - It's now or never. @chocopie116](http://chocopie116.hatenablog.com/entry/2014/03/23/Laravel%E3%81%A7%E3%80%81DB%E3%82%84Eloquent%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7sql%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%91%E3%81%A9%E3%80%81stdClass%E3%81%AB%E3%81%AA%E3%81%A3)


# 参考
[php - Property exists but property_exists() return false; - Stack Overflow](https://stackoverflow.com/questions/43011189/property-exists-but-property-exists-return-false)
[php stdClass check for property exist - Stack Overflow](https://stackoverflow.com/questions/20385664/php-stdclass-check-for-property-exist)
Chromeのオートコンプリートの背景色を消す

## 動機
autocomplete属性をoffにしてるにも関わらず入力が補完された。
そのせいで、ラベルにオートコンプリートの背景色が被さってしまいラベルの一部が隠れるような状態になった。
ちょっと検索しても出てくる情報はbox-shadowで背景色を隠すものがほとんどでそうなるとデザインを変更しないといけなくなるためこの方法は使えない。
で、さらに調べて以下の方法で背景色を変更できることを確認した。

## 対処法
```css
@keyframes onAutoFillStart { from {} to {}}

input:-webkit-autofill {
    animation-name: onAutoFillStart;
    transition: background-color 50000s ease-in-out 0s;
}
```

やってることとしては、Chromeでオートコンプリートが発生した要素については`-webkit-autofill`という属性が付くのでその要素に対してアニメーションを使用して背景色の変更を行なっている。
background-colorに対して!importantを使用しても変更できなかったが、上記の方法だとなぜかできた。

とりあえず、これで背景色については消すことができる。
Windows 10 もしくは Windows 11 の調子が悪い時にクリーンアップするコマンド

Windows 10 の調子が悪い時にクリーンアップするコマンド
==============================
#履歴
2022/5/19 winget 追加

# 背景
Insider Preview に参加している場合は、やはり数度に一度はずれを引くこともあります。そうでなくても、様々なソフトウェアをインストールしますから、*快適*に使うためには、OSのクリーンインストールをしたくなることもあるかと思います。

Windows自身もその進化とともに、様々な修復機能があります。それを一気にやってしまうコマンド達です。

# 前提
- `.bat` ファイルに
- `[管理者]` として実行
- Windows 10 1709 以降。Windows 11 も OK

winget についてはこちらを:
> winget コマンド ライン ツールは、現時点では Windows 10 1709 (ビルド 16299) 以降でのみサポートされています。

https://docs.microsoft.com/ja-jp/windows/package-manager/winget/

# 注意点
- 全て自己責任でwww

# コード

```cmd
@Microsoft Updateキャッシュクリア
net stop wuauserv
SET TARGET_PATH=C:\WINDOWS\SoftwareDistribution\
FOR /F %%1 IN ('DIR /AD /B %TARGET_PATH%') DO FOR /F %%2 IN ('DIR /AD /B "%TARGET_PATH%%%1\"') DO rmdir /S /Q %TARGET_PATH%%%1\%%2\
FOR /F %%1 IN ('DIR /AD /B %TARGET_PATH%') DO rmdir /S /Q %TARGET_PATH%%%1\
del /S /Q %TARGET_PATH%*.*
net start wuauserv

@コンピューターがActive Directory にて管理されている場合のみ
gpupdate /force

dism /Online /Cleanup-Image /StartComponentCleanup /ResetBase
dism /online /cleanup-image /restorehealth
sfc /scannow

wsreset

cleanmgr

set devmgr_show_nonpresent_devices=1
start devmgmt.msc

winget upgrade --all --accept-package-agreements
```
PyCallを使ってmatplotlibをRubyで読み出し、CGIでグラフを動的に描画する

# はじめに

Webサイトでグラフを表示する必要が出てきたのですが、Rubyではなかなか便利なツールが見つけられなかったので、PyCallを使ってmatplotlibで描画したグラフを表示できないか試してみました。

Pythonの例でも一度ファイルに保存して利用するものが多かったのですが、ここではファイルを経由せずに利用する方法をまとめます。

# 開発環境

- Ubuntu 16.04.4 LTS
- Ruby 2.3.1p112
- Python 2.7.12
- PyCall 1.0.3

# インストール

以下のコマンドで関連ソフトウェアをインストールします。

```
sudo apt install python-pandas
sudo apt install ruby-dev
sudo gem install pycall
sudo gem install pandas
```

pandasと一緒にmatplotlibがインストールされるので以降の説明では、上記の手順が実行されていることを前提として説明をいたします。

# スクリプトの作成

## グラフ描画

以下のスクリプトを作成します。

```rb:index.cgi

# PyCallの読込
require 'pycall'

# matplotlibの読込および設定
matplotlib = PyCall.import_module('matplotlib')
matplotlib.use('Agg')

# pyplotの読込
plt = PyCall.import_module('matplotlib.pyplot')

# グラフの生成
plt.plot([1,3,2,4])

# グラフの出力
puts "Content-type: image/png\n\n"
plt.savefig(STDOUT, format:'png')
```

作成したら以下のコマンドで実行権限を与えます。

```
chmod a+x index.cgi
```

## HTTPサーバ

上記のスクリプトをお試しで動かすため、HTTPサーバもRubyで作ってしまいます。

[参考サイト](http://sugilog.hatenablog.com/entry/20090712/1247370225)

以下のスクリプトを作成し、index.cgiと同じ場所に保存します。

```rb:server.rb
require 'webrick'
module WEBrick
  module HTTPServlet
    FileHandler.add_handler('rb', CGIHandler)
  end
end
server = WEBrick::HTTPServer.new({
  :DocumentRoot => '.',
  :CGIInterpreter => WEBrick::HTTPServlet::CGIHandler::Ruby,
  :Port => '8080',
})
['INT', 'TERM'].each {|signal|
  Signal.trap(signal){ server.shutdown }
}
server.start
```

# 動作確認

以下のコマンドでHTTPサーバを起動します。

```
ruby server.rb
```

次にブラウザを起動し、localhostにアクセスします。

http://localhost:8080

以下のようなグラフが表示されれば成功！

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/17316a32-b929-6c7c-e23d-8c2fcea8fc67.png)

できた！

# CSVファイル利用

より実践的に、CSVファイルを読み込んでグラフを描画するサンプルを示します。

```py:csv.rb
#!/usr/bin/env ruby

# PyCallの読込
require 'pycall'
require 'pandas'

# Pandasの読込
pd = Pandas

# matplotlibの読込および設定
matplotlib = PyCall.import_module('matplotlib')
matplotlib.use('Agg')

# pyplotの読込
plt = PyCall.import_module('matplotlib.pyplot')

# CSVファイルの読込
df = pd.read_csv("sample.csv")
df.index = df.pop("x")

# グラフの生成
df.plot()

# グラフの出力
puts "Content-type: image/png\n\n"
plt.savefig(STDOUT, format:'png')
```

CSVファイルのサンプルを用意します。

```
 x, y
 1, 3
 3, 5
 4,10
 6, 2
 7, 1
 9, 7
10, 4
```

同じようにブラウザを起動し、localhostにアクセスします。

http://localhost:8080/csv.rb

以下のようなグラフが表示されれば成功！

![csv.rb.png](https://qiita-image-store.s3.amazonaws.com/0/114240/5506363b-9fe6-e29a-5390-ff347128efb8.png)


できた！
EC2で自身のPublicIPを知る方法

# Motivation
オートメーションとかでEC2自身のIPをhostnameに設定できたらいいなー。と思って調べたけど、環境変数にもいないし、どうやって調べたらいいのかなー。と思ったらどうやらメタデータを取得するAPIがあるようでした。

# EC2の中でPublicIPを取得する
EC2にsshして、

```shell
curl http://169.254.169.254/latest/meta-data/public-ipv4
```

これで取得できます。
各インスタンスで起動時のshellでこれを使ってhostnameを変更するとか色々使えそうですね。

ちなみに、他のメタデータも色々取れます。

```shell
[hoge ~]$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
iam/
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
product-codes
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
```

以上、快適なEC2生活を。
【簡単？】CircleCI 1.0から2.0への移行

結構前ですが、当社のサイトVegewelをElasticBeanstalkで自動デプロイするためにCIを導入したという話を書きました。CircleCIです。
https://qiita.com/hardreggaecafe/items/995ad9a278e80c903e42

このCircleCIですが、CircleCIの方に簡単に設定をした後にリポジトリのルートディレクトリにcircle.ymlを置くというものです。個人的にはJenkinsよりもユーザフレンドリーに感じています。

で、使っている人は既にご存知だと思いますが、2017年あたりからCircleCIの2.0が出てきて、こちらの方を推してくるようになり、ついには2018年8月31日までに移行せよという強制命令が出されるまでになりました。
1.0時代に悩みながら以下のようなyamlファイルを作った経験とDocker知識が必須となる２．０への抵抗感から避け続けてきたのですがそうも行かなくなったのでなんとか対応しました。

``` yaml:circle.yml
machine:
  python:
    version: 2.7.6

dependencies: # EB CLIをCircleCIサーバ上にインストール
  pre:
    - pip install awsebcli

database: # 勝手にCircleCIのデータベースへの操作が行われるような記載がされるのでなにもしないように以下を記入
  override:
    - exit 0

test: # 勝手にCircleCIのテストの操作が行われるような記載がされるのでなにもしないように以下を記入（テスト必要ならここに記載）
  override:
    - exit 0

deployment:
  staging:
    branch: staging　# BitBucketブランチ名
    commands:
      - eb deploy vegewel-staging
  production:
    branch: master　# BitBucketブランチ名
    commands:
      - eb deploy vegewel

```

CircleCIでは移行ツールというものを用意しています。ドキュメントはこちら。

https://circleci.com/docs/2.0/configuration-reference/#branches

基本的にcircle.ymlを.circleciというディレクトリを作成してその下にconfig.ymlを作った上で2.0に対応した設定を記述します。
この2.0に対応したconfig書くのが大変なのでツールがあるのですが、複雑な設定が書いてあったりするとあまり役には立たないようです。当方のcircle.ymlに関しては一見それらしいconfigが書かれて、これをリポジトリにあげてもエラーにならなかったけど、期待したデプロイ作業は行われず残念な結果となりました。

ちなみにツールの使い方としてはこちらです。
https://circleci.com/api/v1.1/project/github/bar/foo/config-translation
bar にはユーザー名、foo にはプロジェクト名を入れます。 vegewel の場合はbitbucket使ったので以下のようになります。 
https://circleci.com/api/v1.1/project/bitbucket/frembassy/vegewel/config-translation

これで作成したconfigをガッツリ手直しして上記と同等の内容にしたのがこちらです。

``` yaml:.circleci/config.yml
version: 2
jobs:
  build:
    working_directory: ~/frembassy/vegewel
    parallelism: 1
    shell: /bin/bash --login
    environment:
      CIRCLE_ARTIFACTS: /tmp/circleci-artifacts
      CIRCLE_TEST_REPORTS: /tmp/circleci-test-results
    docker: # ここにDockerで作成するサーバ環境を記載（自動生成されるはず）
    - image: circleci/build-image:ubuntu-14.04-XXL-upstart-1189-5614f37
      command: /sbin/init
    steps:
      - run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS
      - run:
          working_directory: ~/frembassy/vegewel
          command: pip install awsebcli
      - run:
          working_directory: ~/frembassy/vegewel
          command: rm -f frembassy/vegewel/.rvmrc; echo 2.5.0 > frembassy/vegewel/.ruby-version; rvm use 2.5.0 --default
      - checkout # ソースのチェックアウトは必須（用意されているコマンドらしい）
      - run: # 以下デプロイ実行シェルでブランチ識別して動かしている
          name: Deploy
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              echo "Deploy production"
              eb deploy vegewel
            else
              echo "Deploy staging"
              eb deploy vegewel-staging
            fi


workflows: # 実際のデプロイはこのセクションで行われる
  version: 2
  build-n-deploy:
    jobs:
      - build:
          filters:　# ブランチ単位で実行可能にできる
            branches:
              only:
                - staging
                - master
```
大きく違うのはDockerでLinuxの仮想環境（テストなどを書くのであればDBの内容なども記載すべし）を記載するあたりかなと思います。自分のPCにDocker入って無くても問題ありません。
CircleCIにデプロイ準備のための仮想環境を作るという体裁にすることが大事なので、ローカル環境も合わせないといけないわけではないです。

以上、お役に立てば幸いです。
Unityで「MapFileParser.sh: Permission denied」と表示されて、ビルドが完了しない

Unityでゲームを作成し、iOS用に書き出し、Macでビルドする時に、以下のコメントが出て、ビルドが完了できない事象が発生しました。

> /Users/ユーザー名/Library/Developer/Xcode/DerivedData/Unity-iPhone-xxxxxxxxxxxxxxxxxxxxxxx/Build/Intermediates.noindex/Unity-iPhone.build/ReleaseForRunning-iphoneos/Unity-iPhone.build/Script-033966F41B18B03000ECD701.sh: line 2: /Users/ユーザー名/フォルダ名/プロジェクト名/MapFileParser.sh: Permission denied

原因はどうやらファイルの実行権限が付与されていないことにあるようです。
以下のサイトを参照して、権限を付与すると無事ビルドできました。
[Unity開発：XCodeでビルド出来ない](http://winmemorandum.blogspot.com/2016/07/unityxcode.html)

権限の確認と権限の付与は、以下のサイトを参照しました。
[Linuxの権限確認と変更（超初心者向け）](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)
polyglotをインストールして自然言語処理環境を作る for Mac

すんなりとはいかなかったのでインストール方法をメモしておきます。

```bash
pip3 install polyglot

brew install icu4c
brew link icu4c
echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

pip3 install pyicu

pip3 install pycld2
pip3 install morfessor
```

icu4cを入れた後、icuのコマンドにパスが通っていないと、pyicuのインストールでエラーになるようです。

あとはpolyglotコマンドを実行してみてモジュールが無いというエラーが出たらそれをpip3 installすると動きました。



polyglotのサイト
http://polyglot.readthedocs.io/en/latest/index.html
各Cloud Functions で使える言語比較(2018年7月)

FaaS (Function as a Service) と呼ばれるクラウドに用意された関数実行環境(＝Cloud Functions)について、各クラウドベンダーで使用できる開発言語を比較してみました。

## 比較クラウドベンダー

* AWS - [Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html)
* Microsoft - [Azure Functions(2.x系)](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-node#node-version-and-package-management)
* Google - [Cloud Function](https://cloud.google.com/functions/docs/writing/)(Firebase Functions も同じ)
* IBM - [Cloud Functions](https://console.bluemix.net/docs/openwhisk/openwhisk_actions.html#openwhisk_actions)

## 比較表

* 2018/7/25 - [What happened at Google Cloud Next ‘18](https://www.blog.google/products/google-cloud/next18-recap/) に伴い追記

| 言語＼ベンダー      | AWS Lambda | Azure Functions(2.x プレビュー) | Google Cloud Functions | IBM Cloud Functions |
|---------------------|------------|----------------------|--------------------------------------------|---------------------|
| Node.js(JavaScript) | :heavy_check_mark: v8.10      | :heavy_check_mark: v8.9.4               | :heavy_check_mark: v6.14.0 / v8.11.1(β)                                    | :heavy_check_mark: v8                  |
| Python              | :heavy_check_mark: 3.6        |                      | :heavy_check_mark: 3.7.0(β) | :heavy_check_mark: 3.6.5               |
| Java                | :heavy_check_mark: 8          | :heavy_check_mark:                    |                                            | :heavy_check_mark: 8                   |
| C#(.NET Core)       | :heavy_check_mark: 2.0        | :heavy_check_mark:                    |                                            |                     |
| Go                  | :heavy_check_mark: 1.x        |                      |                                            | :heavy_check_mark:                    |
| PHP                 |            |                      |                                            | :heavy_check_mark: v7.1.18             |
| Swift               |            |                      |                                            | :heavy_check_mark: 4.1                 |
| Docker              |            | :heavy_check_mark:                    |                                            | :heavy_check_mark:                    |

(バージョンが書かれていないのは公式Webサイトで情報を得られなかったもの)

Node.js(JavaScript) はすべてのベンダーでサポート済み。
次に多いのは Java、その次が C#(.NET Core) になりました。
Java はマルチプラットフォーム前提ですが、 .NET Core も Linux や macOS などの非Win環境をフルサポートしているため、FaaS の実行環境が Windows でない場面でも使うことができます。

簡潔な処理だけを FaaS にまかせて、複雑な処理はホスティングしたアプリケーションサーバーやバッチサーバに行わせるのが一般的でしたが、サーバーレス、マイクロサービス化の流れが強くなってきているので、FaaS でやりたい事も増えつつあります。
その場合 JavaScript(TypeScript) ではツラい場面も増えると思われるので、他の(希望する)言語が使えるかは重要な要素になってきます。

ベンダー別に見ると、AWS は基本的な言語をひととおり抑えてますね。
意外にも IBM の対応言語の多さよ。特に **サーバーサイド Swift** をサポートしているのはなかなか野心的ですね。

あと、言語ではないのですが表には Docker という項目を入れています。
これは、関数が呼び出されたときに、Docker コンテナを起動して任意の処理を行わせる、というもので、要するに何でもアリです。
この機能は Azure と IBM がサポートしていて、主にバッチ処理的な使い方ができそうです。

クラウドサービスを使う開発が当然のようになっている現在ですが、さらに素のインスタンス(EC2とか)をどれだけ **使わないか** がポイントになってきていると思うので、FaaS が重要な役割を占めるようになってきています。

今後も折をみて内容を更新します。
JavaScript:関数を合成する関数

[前にもやりました](https://qiita.com/ttatsf/items/b89794392273ff1e5405)が、今回は違うアプローチで任意の数の関数を合成する関数composeを作ってみます。
# 二つの関数を合成する
まんまですが:

```js:
const compose2 = (f2, f1) => x => f2( f1( x ) );
```
二個の関数 f2, f1 と x を引数にとって、xにf1を適用してその結果にf2を適用する、ってことです。
# 三つの関数を合成する
これもまんまです。

```js:
const compose3 = (f3, f2, f1) => x => f3( f2( f1( x ) ) );
```
3個の関数 f3, f2, f1 と x を引数にとって、xにf1を適用してその結果にf2を適用してその結果にf3を適用する、ってことです。
# n個の関数を合成する
類推すればこんなイメージになると思います。ちゃんとしたコードじゃないですが。

```js:
const composeN = (fn, ... ,f2,f1) => x => fn( ... f2( f1( x ) ) ... ); 
```
n個の関数 fn, ... , f2, f1 と x を引数にとって、xにf1を適用してその結果にf2を適用して...という風にfnまで順に関数を適用していく、ってことです。 

これで何個の関数を合成する関数でも書けるようになりました。
compose5 でも compose100 でも自由自在です。
え?そんな関数、書きたくない? 長ったらしいわりに使い回しが効かず全然便利じゃない? そうですよね....

#任意の個数の関数を合成するには?
簡単です。残余引数とreduceRightを使えばよい。
# [残余引数rest parameters](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope/rest_parameters)
引数を ( ...fs ) と書くと、関数定義内で引数を fs という名前の配列として扱えます。"..."は何かの省略のてんてんではなく、れっきとした構文要素です。

```js:
const compose = ( ...fs ) => x =>(配列fsとxを使ったなにかの処理)；
```
みたいな感じで書けます。

# [reduceRight](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight)
残余引数を使って引数が配列で扱えるようになったので、配列のメソッドがそのまま使えます。
reduceRightはreduceの右から版です。配列の最後の方から適用されていきます。あとはreduceと同じ。
この場合は、初期値 x に配列の要素(=関数)を適用しその結果にまた次の要素を適用していくので、アキュムレータをacc、配列 fs の要素を f として、コールバック関数を```(acc, f) => f(acc)```としとけば良い。

```js:
fs.reduceRight( (acc, f) => f(acc), x )
```
# まとめると...
 
```js:
const compose = ( ...fs ) => x => fs.reduceRight( ( acc, f ) => f( acc ) , x );
```
できたー。

# ちなみに：他のやりかただと...


```js:
//再帰:
const composeR = (...fs) => x =>
  fs.length === 0 ? x
  : composeR( ...fs.slice( 0, -1 ) )( fs[ fs.length - 1 ]( x ) )
;

//for loop:
const composeFor = (...fs) => x => {
  let acc = x;
  for(let i = fs.length-1; i >= 0; i--) acc = fs[i](acc);
  return acc;
};
pytorchの学習の際のデータcsv作成

[Data Loading and Processing Tutorial](https://pytorch.org/tutorials/beginner/data_loading_tutorial.html#sphx-glr-beginner-data-loading-tutorial-py)に使われているcsvを作成する方法の備忘録になります．

# pytorchにおけるデータ入力
[公式のチュートリアル](https://pytorch.org/tutorials/beginner/data_loading_tutorial.html#sphx-glr-beginner-data-loading-tutorial-py)によると，csvファイルによって入力することになっています．
チュートリアルで使用されているのは画像名と特徴量をまとめたものになっています．
今回は，画像名とクラスをまとめたものにしています．
こんな感じ．

```csv:data.csv
001.jpg,1
002.jpg,1
003.jpg,0
004.jpg,0
```

まずはこの形の csv を作っていきます．

# フォルダ構造
画像は次のフォルダのように格納されています．
data/
　├ positive/
　│　├ 001.jpg
　│　├ 002.jpg
　│　└ ...
　│
　└ negative/
　　　├ 003.jpg
　　　├ 004.jpg
　　　└ ...

# csv作成
基本的に，glob で画像名を取得して，csv に書き込む形です．
トレーニングデータをまとめたtrain.csvと，テストデータをまとめたtest.csvを作成します．
今回は， train : test = 7 : 3 にしました． 

```py:mkdata.py
    import csv
    import glob
    import numpy as np
    from sklearn.model_selection import train_test_split


    x = glob.glob(normalimg_path)
    positive = glob.glob(positiveimg_path)
    print(len(normal))
    print(len(positive))

    y = np.zeros_like(normal, dtype=int).tolist()
    positive_y = np.ones_like(positive, dtype=int).tolist()

    x.extend(positive)
    y.extend(positive_y)

    (X_train, X_test,
    y_train, y_test) = train_test_split(
        x, y, test_size=0.3,
    )
```

ここまでで，train, testができましたので，あとはcsvに書き込むだけです．

```py:mkdata.py
    with open('val.csv', 'w', newline='') as f: 
        writer = csv.writer(f)
        for data in zip(X_test, y_test):
            print(data)
            writer.writerow(data)   

    with open('train.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        for data in zip(X_train, y_train):
            print(data)
            writer.writerow(data)   
```

tran.csv, test.csvができました．

# 次回
次回は，実際に学習までやる予定です．
MSX PSG (2)

参考
[1章 PSGと音声出力 - テクハンwiki](http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=1%BE%CF+PSG%A4%C8%B2%BB%C0%BC%BD%D0%CE%CF)

```psg1.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app -bnpsg1 psg1.c
*/

void gicini()
{
#asm
	call	$0090		; GICINI
#endasm
}

void wrtpsg(char reg, char data)
{
#asm
	ld	ix, 0
	add	ix, sp
	ld	e, (ix+2)	; data
	ld	a, (ix+4)	; reg
	call	$0093		; WRTPSG
#endasm
}

const int *jiffy = (int *)0xfc9e;

void main()
{
	gicini();

	*jiffy = 0;
	wrtpsg(8, 8);

	while (*jiffy < 30) ;
	wrtpsg(8, 0);
}
```

```psg2.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app -bnpsg2 psg2.c
*/

#include <stdio.h>

#define BYTE unsigned char
#define WORD unsigned int
#define HIWORD(w) (w>>8)
#define LOWORD(w) (w&0xff)
#define _countof(arr) (sizeof(arr)/sizeof(arr[0]))

void gicini()
{
#asm
	call	$0090		; GICINI
#endasm
}

void wrtpsg(char reg, char data)
{
#asm
	ld	ix, 0
	add	ix, sp
	ld	e, (ix+2)	; data
	ld	a, (ix+4)	; reg
	call	$0093		; WRTPSG
#endasm
}

const BYTE *jiffy = (BYTE *)0xfc9e;

void main()
{
	const WORD data[][2] = {
		{ 0x1ac, 32 },
		{ 0x17d, 32 },
		{ 0x153, 32 },
		{ 0x140, 32 },
		{ 0x11d, 32 },
		{ 0x0fe, 32 },
		{ 0x0e3, 32 },
		{ 0x0d6, 32 }
	};

	gicini();

	for (int i = 0; i < _countof(data); i++) {
		WORD tone = data[i][0];
		BYTE len  = data[i][1];
		wrtpsg(0, LOWORD(tone));
		wrtpsg(1, HIWORD(tone));

		BYTE start = *jiffy;
		BYTE shift = start & 0x80;
		BYTE end = (start ^ shift) + len;
		wrtpsg(8, 8);

		printf("%02x %02x\n", start, end);
		while ((*jiffy ^ shift) < end) ;
		wrtpsg(8, 0);
	}
}
```

![WMSX Screen (4).png](https://qiita-image-store.s3.amazonaws.com/0/257554/93cba119-d4b7-02df-8bc9-fad38d1f3a0c.png)

```psg3.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app -bnpsg3 psg3.c
*/

#define WORD unsigned int

void gicini()
{
#asm
	call	$0090		; GICINI
#endasm
}

void wrtpsg(char reg, char data)
{
#asm
	ld	ix, 0
	add	ix, sp
	ld	e, (ix+2)	; data
	ld	a, (ix+4)	; reg
	call	$0093		; WRTPSG
#endasm
}

int gttrig(char num)
{
#asm
	ld	a, l		; num
	call	$00d8		; GTTRIG
	ld	l, a
	ld	h, 0
#endasm
}

const WORD *jiffy = (WORD *)0xfc9e;

void main()
{
	gicini();

	for (;;) {
		wrtpsg(0, 0);
		wrtpsg(8, 12);
		*jiffy = 0;
		for (int i = 0; i < 16; i++) {
			wrtpsg(1, i);
			WORD wait = *jiffy + 2;
			while (*jiffy < wait) ;
		}
		wrtpsg(8, 0);
		while (! gttrig(0)) ;
	}
}
```

```psg3.bas
10 sound 0,0
20 sound 8,12
30 time=0
40 for i=0 to 15
50  sound 1,i
60  wa=time+2
70  if time<wa goto 70
80 next
90 sound 8,0
```
heap

```
public class CustomResultHandler implements ResultHandler {

    private ArrayList<HashMap<String,String>> recordList;
    private CallbackInterface callbackClass;
    private int MAX_COUNT= 100;

    public CustomResultHandler() {
        super();
        this.recordList = new ArrayList<HashMap<String,String>>();
    }

    @Override
    public void handleResult(ResultContext resultContext) {

        recordList.add((HashMap<String, String>) resultContext.getResultObject());

        if(recordList.size() == MAX_COUNT) {
            System.out.println("Invoking Callback method");
            callbackClass.processData(recordList);
            recordList.clear();
        }


    }

    public ArrayList<HashMap<String,String>> getRecordList() {
        return recordList;
    }

    public void setRecordList(ArrayList<HashMap<String,String>> recordList) {
        this.recordList = recordList;
    }

    public Object getCallbackClass() {
        return callbackClass;
    }

    public void setCallbackClass(CallbackInterface callbackClass) {
        this.callbackClass = callbackClass;
    }


}
```

```
public interface CallbackInterface {

    public void processData(ArrayList<HashMap<String,String>> recordList);

}
```

```
public class CallbackImpl implements CallbackInterface {

    @Override
    public void processData(ArrayList<HashMap<String, String>> recordList) {
        System.out.println("Callback operation invoked for list size: " + recordList.size());

    }

}
```

```
public ArrayList<HashMap<String, String>> getAllUsers(CustomResultHandler objCustomResultHandler) {
        //set the custom result handler in sql session
        sqlSession.select("com.memoryleak.poc.persistence.UserMapper.getAllUsers", objCustomResultHandler);

        return userMapper.getAllUsers(objCustomResultHandler);
}
```

```
public static void main(String[] args) {
        
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        
        UserService userService = (UserService) context.getBean("userService");
        
        CustomResultHandler objResultHandler = new CustomResultHandler();
        CallbackInterface objCallback = new CallbackImpl();
        objResultHandler.setCallbackClass(objCallback);
        
        System.out.println("Users List: " + userService.getAllUsers(objResultHandler));
        
        
         
}
```
jQuery フォームsubmit時にreturn false;したのにとまらないよ。。

困ったけど解決したのでメモ
フォームをsubmitする時に未選択があったら
処理を止めたかったんです。

最初は

```javascriptt:qiita.js
$("#dubmitBtn").on("click",function(){
	checkSubmit();
});

function checkSubmit(){
  // ごにょごにょ
  return false;
}
```

と書いていたのですが止まらない！
はまった、、
呼び出し元のの関数にfalseを返しただけなのでは、、？

```javascriptt:qiita.js
$("#dubmitBtn").on("click",function(){
	if(checkSubmit() == false){
		alert("チェックされてない項目があります");
		return false;
	}
});
```
これでいけました！