OmniAICreator/Qiita-1.07M huggingface dataset:
GAS & Slack & スプレッドシートで全自動進捗どうですか

#全自動進捗どうですかを作った
##書いてる人のプロフィール
・ qiita初投稿
・ 学生
・ GASには触れたことがなかった
・ 数人のチームのリーダになったので全自動進捗どうですかを作った。
##作りたいもの
→毎日新しいシートがフォーマットどおりに作られる(GAS)
→slackに通知が行く(slackのremind)
→みんな書き込む
##実装
###スプレッドシート
formatになるシートを適当に作る
こんな感じ![進捗どうですか.png](https://qiita-image-store.s3.amazonaws.com/0/191334/9a136c15-4013-9fed-9e1d-c564bca4a111.png)


###GAS
スプレッドシートのツール→スクリプトエディターでGASを書けるようになる
そこで

```js
function main() {
    //"format"と名前がついたシートを取得する
    var sheet = SpreadsheetApp.getActive().getSheetByName('format');
    //その日の日付で新しいシートにフォーマットをコピーする
    var now = new Date();
    var stri =now.toDateString();
    SpreadsheetApp.setActiveSheet(sheet);
    SpreadsheetApp.getActiveSpreadsheet().
    duplicateActiveSheet().setName(stri);
}
```
タイマーマークからプロジェクトのトリガーを追加できるので
![Screenshot 2017-10-30 15:04:35.png](https://qiita-image-store.s3.amazonaws.com/0/191334/b924806d-cadb-4a71-54be-c5e904091ea6.png)


こんな感じで毎日1回実行するようにする。
###slack

```
/remind #cannelname 進捗どうですか{googleスプレッドシートの編集可能URL} every weekday at 19:00
```

これで毎日自動的に新しいシートがフォーマットと同じように作成されて＃slackchannelに通知がいくようになる。
拙作VSCodeExtention「RegexAssembler」の紹介


 最近こんなのあったらいいなと思い、ありそうだなーと思いつつも探してみるとそのようなものはなかったため、勉強がてらに作成したVSCodeのExtentionの紹介をします。
# RegexAssemblerとは
 正規表現を自動生成してくれるExtentionです。ソース等はこちら。
https://github.com/5hyn3/vscode_regex_assembler
https://marketplace.visualstudio.com/items?itemName=shyne.regexassembler
# インストール
 本Extentionは内部でnpmのモジュールに依存しているため、先に以下のモジュールを導入してください。
```
npm
regex-trie(npm package)
```
導入後、VSCode上の拡張機能タブの検索欄にRegexAssemblerと入力し、ヒットしたExtensionをインストールしてください。

# 使い方
このExtentionを導入すると、エディタ上で右クリックをした時に表示されるコンテキストメニューに以下の項目が追加されます。(Add TextとAdd Single Line Textは文字列を選択している場合にのみ表示されます。)

- Add Text
- Add Single Line Text
- Assembler Regex
- Clear Text

それぞれの使い方を紹介します。
## Add Text
選択範囲に存在する文字列をExtentionに登録します。
## Add Single Line Text
選択範囲に存在する文字列をExtentionに登録します。但し、こちらは改行コードを挟む度に別の文字列として登録します。
複数の文字列を一気に登録する場合に使ってください。
## Assembler Regex
登録した文字列から正規表現を生成します。生成した正規表現はVSCode上の情報メッセージ上に表示されるので、そこからコピペするなりして使ってください。
## Clear Text
登録した文字列を全て消去します。

# 余談
![84092f7394858563ed56f347fb92c9cc.png](https://qiita-image-store.s3.amazonaws.com/0/105287/8ce164f6-4d13-31fe-3665-5331c340c351.png)
こういう場所に堂々と自分の作成したものが並ぶというのはなんというか、気持ちがいいですね！
OpenCV等のPythonコードの覚書

## 前提
* Python3初心者なので、忘れてしまう書き方のメモ
* できるだけPEP8準拠

## 標準
#### 無限ループ
```py3:python
while True:
  break
```
#### if文ノットイコール
```py3:python
if not test == 0:
  break
```

## OpenCV
### VideoCapture関連
#### 総フレーム数の取得
```py3:python
# noinspection PyArgumentList
video = cv2.VideoCapture('test.mp4')
count = video.get(cv2.CAP_PROP_FRAME_COUNT)
print(count)
```
### GUI関連
#### ウィンドウサイズ可変
```py3:python
cv2.namedWindow("Frame", cv2.WINDOW_GUI_EXPANDED | cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow("Frame", 640, 530)
```
#### 閉じるボタン押下の判定
```py3:python
if cv2.getWindowProperty("Test", cv2.WND_PROP_VISIBLE) == 0:
    break
```
### 画像関連
#### create black image
```py3:python
import numpy as np
image = np.zeros((480, 640, 3), np.uint8)
```

## 参考
https://qiita.com/takahiro_itazuri/items/e740f0a1b5165fafa6ac
https://algorithm.joho.info/programming/python/opencv-videocapture-mp4-movie-py/
https://docs.opencv.org/3.0.0/d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b
https://stackoverflow.com/questions/35003476/opencv-python-how-to-detect-if-a-window-is-closed/37881722#37881722
TextViewのリンク化いろいろ

# リンク化できるものを全てリンクにする
XMLなら、

```xml
android:autoLink="all"
```
コード内で書くなら、

```java

textView.setAutoLinkMask(Linkify.ALL);
```
を指定することで、メールアドレス、URL、電話番号、住所(日本語非対応)をリンクにできる。```Linkify.EMAIL_ADDRESSES```や```Linkify.WEB_URLS```のようにして、メールアドレスやURLだけを個別に指定することも可能。
https://developer.android.com/reference/android/widget/TextView.html#attr_android:autoLink

# 特定のサイトのみリンク化する
Linkify.MatchFilterを使ってパターンにマッチしたURLのみをリンク化する。以下はYoutubeのみを許可した例。

```java
Linkify.addLinks(textView, Patterns.WEB_URL, null, new Linkify.MatchFilter() {
    @Override
    public boolean acceptMatch(CharSequence charSequence, int start, int end) {
        String url = charSequence.subSequence(start, end).toString();
        Pattern pattern = Pattern.compile("^https?://((www\\.)?youtube\\.com|youtu\\.be)/");
        Matcher matcher = pattern.matcher(url);
        return matcher.find();
    }
  }, null);
```


# 特定のワードがあったらリンク化する
Linkify.TransformFilterを使ってパターンにマッチしたワードをリンク化する。addLinksでスキームを指定すると先頭に追加してリンク化できる。以下は@付きのテキストがあったらTwitterリンクにする例。

```java
Pattern pattern = Pattern.compile("@([A-Za-z0-9_-]+)");
String scheme = "http://twitter.com/";

Linkify.addLinks(textView, pattern, scheme, null, new Linkify.TransformFilter() {
    @Override
    public String transformUrl(Matcher matcher, String s) {
        return matcher.group(1);
    }
});
```

# aタグをリンク化する
HTMLクラスのfromHtmlを使うことで、aタグをリンク化できる。クリックできるようにするには、LinkMovementMethodをセットする必要がある。
https://developer.android.com/reference/android/text/Html.html

```java
textView.setText(Html.fromHtml("<a href=\"https://qiita.com/\">qiita</a>"));
textView.setMovementMethod(LinkMovementMethod.getInstance());
```
※from.HtmlはAPIレベル24以上ではdeprecetedになっているので、ヘルパークラスなどを作ると良いよという記事があった。
https://stackoverflow.com/questions/37904739/html-fromhtml-deprecated-in-android-n

```java
@SuppressWarnings("deprecation")
public static Spanned fromHtml(String html){
    Spanned spanned;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
       spanned = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
    } else {
       spanned = Html.fromHtml(html);
    }
    return spanned;
}
```

## 追記(2021/04/26)
上記に記載した、aタグのリンク化におけるSDKバージョンによる分岐ですが、[HtmlCompat](https://developer.android.com/reference/androidx/core/text/HtmlCompat)の登場により不要となりました。
`HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);` のように呼び出すことで、バージョンの差異を気にすることなく利用できます。
https://developer.android.com/reference/androidx/core/text/HtmlCompat

# はまったこと
Linkify.addLinksを設定した後にsetMaxLinesを指定するとリンク化が無効になってしまう。動的に行数を変化させているViewの場合には、setMaxLineの後にかけるなどの注意が必要。
Quasar を使ってちょっとしたモバイルアプリを作ってみる。(2/2)

前回の記事（
https://qiita.com/Satachito/items/2fada395c301fd4ec4bf
）でちょっとした web アプリを作って見た。

ここからは quasar の謳い文句の一つのソースで、Web、マルチプラットフォームデスクトップアプリ、モバイルアプリなどが作れる、っていうのを追ってみる。

作業環境は OSX。

でもって、<h1>_*超簡単！*_</h1>

# electron でデスクトップアプリを作ってみる。
http://quasar-framework.org/guide/electron-wrapper.html

### web アプリをビルドしておく。

```
cd <folder_name>
quasar build
```

### electron で wrap する。

```
quasar wrap electron
cd electron
npm install
```

### electron で osx 用のモジュールをビルドする。

```
cd <folder_name>/electron
quasar build darwin
```

\<folder_name\>/electron/dist/Quasar Electron App-darwin-x64
の下にアプリができるので、実行してみる。

![SS11.png](https://qiita-image-store.s3.amazonaws.com/0/73493/5f14e182-21a3-cc38-bb84-ccc73471a7d8.png)




### electron で Mac AppStore 用のモジュールをビルドする。

```
cd <folder_name>/electron
quasar build mas
```


### electron で Linux 用のモジュールをビルドする。

```
cd <folder_name>/electron
quasar build linux
```


### electron で Windows 用のモジュールをビルドする。

wine という署名プログラムが必要なので、brew でインストールする。

```
brew install wine
```

そして
```
cd <folder_name>/electron
quasar build win32
```


# Cordova でモバイルアプリを作ってみる。
http://quasar-framework.org/guide/cordova-wrapper.html

## 準備

### Cordova のインストール

```
npm install -g cordova
```
### Cordova でラップする

```
cd <folder_name>
quasar wrap cordova
cd cordova
```

## iOS アプリ

```
cordova platform add ios
cordova run ios
```

シミュレータが立ち上がってアプリが動作する。

![SS14.png](https://qiita-image-store.s3.amazonaws.com/0/73493/9d647289-2f45-6183-05e9-43aee84ed77d.png)

以下のフォルダにプロジェクトが生成されている。

![SS15.png](https://qiita-image-store.s3.amazonaws.com/0/73493/f0650b6f-aea8-5108-4af1-a7290d1f7ba1.png)
【Firefox】Ctrl-tab でタブ切り替えするときにプレビューを表示する

Firefox で `Ctrl-tab` は、「次のタブ」へ移動するショートカットです。
しかし、タブをたくさん開いているときは、次のタブへ移動する前にタブ一覧のプレビューを表示したいことがあります。
ちょうど、Windows でアクティブウィンドウを切り替えるときに、 `Alt-tab` を押したような挙動[^1]ですね。

実は Firefox では config をいじるとこの挙動を設定することが出来ます。
(スクリーンショットを撮るのが困難だったため、設定後のイメージ画像なしです。すみません。。。設定してから `Ctrl` を押したままで `tab` キーを押してみれば、どういうことなのか一発でわかると思います。むしろなぜ最初からこの挙動になっていないのか疑問に思うくらいです。)

# 設定方法
1. アドレスバーに `about:config` と打ち込み、移動してください。このとき、注意が表示されますが、特にめんどくさい挙動をいじるわけではないので、今回は「OK」を押してください。
2. `browser.ctrlTab.previews` でフィルタをかけてください。
3. `browser.ctrlTab.previews` をダブルクリックし、値を `false` から `true` に変更してください。

以上で設定は完了です。

# 参考
- https://support.mozilla.org/ja/questions/955292#answer-423264
    - この記事はまんまこれを和訳しただけです。

[^1]: Mac では `Command-tab` を押した時の挙動
CloudGarageにWindows10をインストールしてみた

インストールが目的のため、真新しいことはありません。
また「技術的に可能」は「ライセンス的に問題なし」とは異なりますのでご注意を
[VPSやクラウドにWindowsをインストールするのはライセンス違反なのか？](https://qiita.com/CloudRemix/items/dfa484c48a4e02da1a9a)

#追記
しらとり様が同様の記事を作成済みです。
[CloudGarageでWindows10/Server2016を導入してみる](http://mera.azusariot.info/2017/10/cloudgaragewindows10server2016.html)
上記の方が詳しく丁寧です。この投稿は参考程度に。

##目次

 - インストールディスクの用意
 - イメージのアップロード
 - OSのインストール
 - 初期設定

##インストールディスクのセットアップ
まずはWindowsのインストール用イメージを用意しましょう。

CloudGarageではISOイメージが持ち込めるためISOファイルからインストールができますが、そのままではドライバがなくディスクを認識しません。あらかじめドライバを組み込んだインストール用イメージを作成します。
![alt](https://qiita-image.cloudremix.net/CloudGarage-DiskDriver.jpg)

ドライバ自体は[Windows Virtio Drivers - FedoraProject](https://fedoraproject.org/wiki/Windows_Virtio_Drivers)からISOファイル形式でダウンロード可能です。
しかしCloudGarageではインストール中にディスクイメージの入れ替えができないため、一度展開して再度イメージ化も必要となります。

ISOイメージの展開は7-Zip、イメージ化はImgBurnでできます。
注意点としてはイメージ化の際、ブートディスクにする必要があります。
ImgBurnではあれば`Advanced`の`Bootable disc`を設定するだけです。
詳しい方法→[.log : さくらのVPSへWindows7をインストールする(Virtio有効)](http://sysy.livedoor.biz/archives/34100331.html)

##イメージのアップロード
作成したイメージをCloudGarageにアップロードします。
CloudGarageにISOファイルを持ち込むにはhttpでアクセスできるとこにアップロードする必要があります。~~httpsは不可のためオンラインストレージは使用できません。レンタルサーバ等を用意してください。~~httpsも使えるようです。しかしオンラインストレージの利用は難しそうです。

 - Googleドライブ → ダイレクトリンク不可
 - Dropbox → 容量不足
 - OneDrive → CloudGarageで取得エラー

アップロード自体は`登録ISOイメージ` → `ISOイメージを取得する`からします。
OSタイプに**Linux**と表記されていますが問題ありません。いけます。
![alt](https://qiita-image.cloudremix.net/CloudGarage-ISO-Image.jpg)

##OSのインストール
イメージが準備できたら、いよいよインスタンスを作成します。
といっても特に面倒なことはなく、`保存イメージ`からアップロードしたイメージを選択するだけです。
実際に運用する場合は、ポートを閉じておくと幸せになれます。
SSHキーの設定やrootパスワードはスキップです。

インスタンスを起動してインストールプロセス（マウスが使えます）を進むとインストール場所でストップとなります。
ここは用意したドライバ（`viostor\w10\x86\`）を使用します。50.0GBの超高速SSD領域の出現です。
![alt](https://qiita-image.cloudremix.net/CloudGarage-Disk.jpg)

その後もプロセスを進めます。そしてネットワーク接続でまたストップです。
ここの場合もドライバがないので機能が使えないというパターンですが、今回はインストールが面倒＆インストール直後が激重になるためスルーします。
![alt](https://qiita-image.cloudremix.net/CloudGarage-Network.jpg)

その後は指示に従いセットアップするだけです。

##初期設定
インストールが完了すれば勝ったも同然です。
残りのドライバとTeamViewerをインストールしましょう。

インストール状態であればDVDドライブにインストール用イメージがマウントされているため、ドライバの保存先を選択します。
デバイスマネージャを開くと2つのドライバ（ネットワーク、メモリ）がインストールされていないので、それぞれ`NetKVM`と`Balloon`を選択しましょう。
※[http://d.hatena.ne.jp/kvm/20081016/1224171825](http://d.hatena.ne.jp/kvm/20081016/1224171825)
![alt](https://qiita-image.cloudremix.net/CloudGarage-DeviceManager.jpg)

TeamViewerはリモート操作に使用します。
付属のコンソールは不安定で、高負荷になるとフリーズ→エラーとなる＆キーボード入力の相性が悪いため別のアクセス手段を用意する必要があります。Windowsのリモートデスクトップが第一候補ですが、CloudGarageでは任意のポート開放ができないため全開放となり大変危険です。そのためFW越しに使えるTeamViewerを使います。
セットアップは省略。

#おまけ
ディスク速度（CrystalDiskMark）。相変わらず異常。
![alt](https://qiita-image.cloudremix.net/CloudGarage-CrystalDiskMark.jpg)

タスクマネージャー。メモリ使用量は600MBほど。1GBでも十分いける。
クロック周波数は1.70GHz？
![alt](https://qiita-image.cloudremix.net/CloudGarage-TaskManager.jpg)

Intel：Broadwell、Family：06、Model：3D＝**Core M 5Yxx**？？？
参考：[a4lg.com | x86 ファミリーとモデル一覧](http://a4lg.com/tech/x86/database/x86-families-and-models.ja.html)
![alt](https://qiita-image.cloudremix.net/CloudGarage-CPU-Z.jpg)

#一言
2コア以上のプランを使うと吉。
Animatorで現在再生中のステートの長さを取得する際の注意点

Animatorから現在再生中のステートの長さを取得する際に少しハマったのでメモ

# バージョン
Unity 2017.1.1f1

# Animator.GetCurrentAnimatorStateInfo
[GetCurrentAnimatorStateInfo](https://docs.unity3d.com/ja/current/ScriptReference/Animator.GetCurrentAnimatorStateInfo.html)で、現在のStateの情報([AnimatorStateInfo](https://docs.unity3d.com/ja/current/ScriptReference/AnimatorStateInfo.html))を取得できます。
AnimatorStateInfoからはlengthが取得できますので、これで長さがわかります。
が、AnimatorStateInfoから取得できるlengthは、AnimatorのspeedやBlendTreeの評価が終わった後の値になっているようです。
どういうことかというと、Stateに1秒のAnimationClipが設定されている場合、
例えば、Animator.speedや、StateのSpeedが0.5になっていると、lengthは2になり、
両方に0.5ずつ設定されていると、4になります。
0になっていると、Infinityになります。

BlendTreeの場合は、ブレンド具合で変化します。
1秒と2秒のアニメーションを0.5でブレンドした場合、1.5といった具合になります。

各種speedを変更しない運用や、speedが反映されている情報が欲しい場合はこちらで問題ないと思いますが、
lengthを使って何か処理を行う場合は、Infinityがどうかチェックする必要がある場合があるかと思います。

# Animator.GetCurrentAnimatorClipInfo
speed等が影響していない長さが欲しい場合は、[GetCurrentAnimatorClipInfo](https://docs.unity3d.com/ja/current/ScriptReference/Animator.GetCurrentAnimatorClipInfo.html)でClipの情報([AnimatorClipInfo](https://docs.unity3d.com/ja/current/ScriptReference/AnimatorClipInfo.html))を取得します。
AnimatorClipInfoからclipのlengthを参照すれば取得できます。
BlendTreeの場合、GetCurrentAnimatorClipInfoの第2引数にListを渡せば、現在ブレンドに使用されているClipの情報が取得できます。
sshをrsa認証にしたら、ログインできなくなった

#macからubuntuのsshのsettingしたらログインできなくなった
以下のような文章がでた

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/xxxxxxxxxxx/.ssh/xxxx' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxxxxxxxxxx/.ssh/xxxx": bad permissions
Permission denied (publickey).
```

#解決策
```
cd ~/.ssh
sudo chmod 600 xxxx 
sudo chmod 600 xxxx.pub
#↑設定したキーの名前
```
XAMMPでApache起動しない問題

# XAMMPでApacheが立ち上がらない・・・

久しぶりにXAMMPでApacheを起動しようとしたら以下のようなエラーが出て立ち上げることができない。

![SnapCrab_NoName_2017-10-30_1-23-11_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/2ee3ce43-f6a9-5d11-932e-a8491d8479c5.png)

この行が怪しい「Port 80 in use by "Unable to open process" with PID 4!」

訳すと「ポート80番はプロセスID4番で使用されているから使えないよ！」ということ。

# 原因究明

コマンドプロンプトで「netstat -nao」と打ち込む。

![SnapCrab_NoName_2017-10-30_1-30-46_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/2ded39a1-3ac9-e34c-8270-0d4f74c3bb36.png)

どうやら80番はPID4に使われている。

PID4が何か調べるために「tasklist」と打ち込む。

![SnapCrab_NoName_2017-10-30_1-32-9_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/bb9874bc-a952-8ca0-615f-8832387c0309.png)

Systemに使われている・・・
前まで普通に使えていたのだが、とりあえず定番のSkypeを疑う。

見事に持っていかれている。

![SnapCrab_NoName_2017-10-30_1-36-21_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/51a91518-ca26-f788-9f36-a00723448fec.png)

# 対処法

譲り合いの精神で今回はXAMMP側の設定を変更する。
`C:\xampp\apache\conf\httpd.conf`を編集。

以下の2箇所を変更する。

`Listen 80`
↓
`Listen 81`

`ServerName localhost:80`
↓
`ServerName localhost:81`

今回は81番が空いていたので81を使いましたが適宜空いているポートを使用する。

# 無事起動することに成功

![SnapCrab_NoName_2017-10-30_1-43-15_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/3959356e-47ad-2c32-962c-e33863d8db7e.png)
ここがツラいよAWS OpsWorks

皆さんAWSのOpsWorksはご存知でしょうか？

僕が現場で開発しているサービスではアプリケーションのデプロイやサーバー構築の自動化として[OpsWorks](https://aws.amazon.com/jp/opsworks/)を使用しています。

OpsWorksを使用している理由としては、サーバー構成管理ツールChefによりEC2インスタンスの設定、デプロイ、および管理を自動化が可能であること、つまり環境一式を自動構築できることにあります。
要件に応じて柔軟に環境構成を変更できる、Elastic BeanstalkとCloudFormationの中間の特性を持った新たなサービスとなっています。
またローカル環境も同じChefクックブックによりVagrantを利用して構築出来ることも利点の一つです。

しかし・・！OpsWorksを長く利用している内に、「ここが辛いなあ・・」というストレスフルな点が少しずつ出てきたので、その辛みをこの記事にまとめることにしました。

#どこがツラいか
##デプロイがツラい
デプロイ時間は3〜4分で不満はあるものの工夫次第で改善出来る余地はありますが、一番嫌なのは本番環境と検証環境のデプロイで結果の差異が出ることです。
検証環境ではデプロイが普通に成功するけど、本番環境だと失敗した！なんてことがたまにありました。
理由はDBマイグレーションやフロントエンドビルド等様々です。
もちろん開発者により出来る限り差異を無くすことは出来ますが、検証環境と本番環境を完全に同じ状態することは保証されません。

更にアプリケーションを配置後に何らかの理由で失敗すると、そのリリースディレクトリは削除されず残ったままとなります。
すると何度もデプロイ失敗し続けた後に何が起こるか？
inodeが枯渇します(涙)
そうなってしまうとOpsWorksデプロイがいつまで経っても完了せず、1時間経ったくらいにようやく失敗というステータスになります(涙)

ちなみにデプロイも含めてOpsWorksのコマンド実行は**強制終了させることは出来ません**。
AWSサポートセンターに過去に質問をしたところ以下の回答から分かるように強制終了の機能は無いとのことです。

```
恐れ入りますが、現在のところ OpsWorks では setup/configure/deploy などレシピの適用中に、強制的に適用を終了させる機能は提供してございません。
また、AWS CLI におきましても、強制停止などのオプションはございません。
```

従ってこのエンドレスフォーエバーモードに入ると、あと1時間待たなきゃいけないのかという絶望を味わうことになります(_ _)
嗚呼、哀しきかな。

##インスタンス立ち上げや構成変更がツラい
OpsWorks上でインスタンスを起動すると、必ずSetupというライフサイクルイベントに登録されたChefレシピが実行されます。
http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/workingcookbook-events.html
そしてこのSetupがとにかく時間がかかる。
完了まで約20分は待たなければなりません。
実行時間はレシピの内容とボリュームにもよりますが、僕が開発しているサービスでは主に以下を実行しています。
- ロードバランサーへのインスタンスの解除・紐付け
- ユーザー設定
- PHP・Nginxインストール
- その他諸々パッケージインストール
- logrotate設定
- アプリケーションデプロイ

インスタンス立ち上げならまだ良いのですが、セキュリティパッチを当てたい時などのちょっとしたサーバーの構成変更もこのSetupコマンドを実行しなければならず、立ち上げと同じ様に時間が掛かってしまいます。うーん、ストレスフル。

##ローカル環境構築がツラい
OpsWorksを使用している以上必然的にローカル環境もChefを使って仮想マシンで環境を構築することになります。
これも数十分時間が掛かります。Chefを使っている以上実行時間の遅さは切り離せません。
更に辛いのがプロビジョニングの成功がホストOSやChef実行関連の各ライブラリ・ツールのバージョンにかなり依存します。
Macで成功してもWindowsだと失敗する。またVagrantのバージョンが~ならBerkshelfのバージョンは~でそしてさらにこのライブラリのバージョンは~でないと失敗するということがざらにあります。
本来はそんなことは気にせずPCでも同じ様に気軽に環境を構築したいんですよ。
でもそれは叶いません。

##Chefがツラい
個人的にChefは既に廃れており、これから更に技術の市場価値は低くなっていくだろうと予測しています。
市場価値の低い技術を継続して利用してもエンジニアとしての成長は望めません。
どこかで転換を図らなければいけません。


#まとめ
OpsWorksは単純で小規模なアプリケーションならまだ良いですが、複雑で大規模なアプリケーションを構築しようとするとChefクックブックのボリュームが必然的に大きくなり、実行時間も長くなる上に運用の手間が増えます。
少なくとも僕の現場のサービスはもうOpsWorksでは耐えきれなくなっているので、Dockerへの移行を検討しています。

もしOpsWorksを利用しようという方はこの辛みに注意して下さい。
character-level CNNによる悪性URLの検出について考える。

#はじめに。

卒業論文を書くためにcharacter-level CNNについて勉強しているのでそのついでに自分なりにまとめてみて理解を深めようと思います。
間違い等あると思いますのでよければ指摘お願い致します。

#そもそもCNNとは？
CNN(Convolutional Neural Network)の略で、畳込みを利用したニューラルネットワークになります。
CNNについての詳しい説明は色んなサイトで行われているので省きますが、主に画像の識別に長けています。

Convolution層（Conv層）とPooling層（Pool層）が並んでおり、Conv層とPool層の間に活性化関数が入ることが多いです。

Conv層は入力のデータに対して様々なフィルターを使い畳み込み演算を利用して特徴の畳込みを行います。
そしてPool層が重要な特徴は残しつつデータを縮小し扱いやすくします。
Conv層とPool層を繰り返していき、最後に全結合層にて特徴量から判定を行います。

畳み込みを利用することによって、例えば手書きの○と☓を判定するときに多少ずれていても判定することが可能になります。ピクセル単位での判定ではなく、あるまとまった範囲ごとの判定になるからです。

#character-level CNNとは
今まで主に画像で使われていたCNNを文字レベルで行おうというものです。
文字をなんらかの形で数値化して多次元の行列に埋め込み、それをCNNすることである特徴が得られるということです。
今までの自然言語処理というのは主に単語レベルに分けて単語間のつながりを見たりしていましたが、character-levelCNNでは単語に分ける必要がなく、そのままの文字列を入力データとするだけでいいので、実装が簡単になります。

#そもそも何故悪性URLの検出について考えるのか。
悪性URLの検知は手作業でのラベル付けやユーザからのフィードバックを得たり、ハニーポットを利用してURLを集めるたり様々な方法で得られたURLを用いてブラックリストを作成しそれを用いて悪性かどうかを検知する方法であった。このブラックリストを用いる方法は誤検知率は低いが、新規に現れたURLに対してはあまり効果がない。
そこでcharacter-levelCNNを用いてURLが悪性かどうかを自動的に判断することによって、新規に現れる悪性URLに対しても検知可能にすることが出来るようになるのでは？ってこと。

#悪性のURLを判断するために
悪性のURLを判断するための教師データとしては例えば1のラベルが付いたものを悪性のURL、０のラベルが付いたものを良性のURLとして学習させます。
character-levelCNNは分類器であるため、ラベルの付いた教師データが必要となります。とはいっても良性のURL（つまり普通のURL）のリストを手に入れるのは比較的簡単ですが、悪性のURLリストを手に入れるのは結構難しいです。
また良性と悪性の教師データの数は同数程度がいいとされているので大量の悪性URLのリストを手に入れる必要があります。

#現在考えている実装方法
kerasを用いてモデルを作成する。
フィルターサイズを(2,3,4,5,6,7)に設定してフィルターサイズの回数分、conv層とpool層を繰り返す。

入力には一文字一文字をord関数を使ってコードポイントを表す整列を返します。その整数を入力値として用いる。

0を良性のURL、１を悪性のURLとしてラベル付けする。

学習させる。
っていう感じですかね。

#character-level CNNには夢が詰まっている。

character-level CNNは単語のつながりを見るわけではないので日本語だろうが英語だろうがフランスだろうがなんだろうが分類することが可能です。
Qiitaで見た方は日本語の作家の４人でクラス分けを行いそれを分類するということを試されていました。

今現在、Twtterのプロフィール紹介文からネットビジネス系か一般人か調べるものを作成していますが、ライブラリが充実しているので自分で書くプログラミングは２００行あればかけてしまいます。

#まとめ
大量のデータを集めることができれば、character-level CNNでの悪性URL検知は可能。
python3でslackbotの作成(その4:send,react編)

#前回
[その3:リプライ編](https://qiita.com/thimi0412/items/93c57a924896c1cf3c03)
前回はメンションを送るとリプライが返ってくるところまで作成しました。
今回はチャンネルに誰かが特定のワードを発言したら、botが発言するようにして行きましょう。

#ディレクトリの構成
slack_bot/
 ├─ plugins/
 │   ├─ \_\_init\_\_.py
 │   ├─ bot_listen.py         <font color="Red">今回書き込むファイル</font>
 │   └─ bot_mention.py
 ├─ run.py
 └─ slackbot_settings.py

#発言してみる
```python3:bot_listen.py 
from slackbot.bot import listen_to
import datetime

@listen_to('何時')
def saytime(message):
    d = datetime.datetime.today()
    message.send(str(d))
```
何時?と発言すると時刻を発言してくれます。
botを招待したチャンネルで発言してみましょう。
<img width="366" alt="スクリーンショット 2017-10-30 1.07.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/f2ede431-7c69-6299-2d1f-2110c73371cf.png">
返ってきましたね。後に気づいたのですが"何時ですか"と発言しても返ってきます。
<img width="320" alt="スクリーンショット 2017-10-30 1.10.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/7647d866-ed1c-559d-e9a8-8f428c6d35f3.png">
どうやら文字列の部分一致で判定しているようですね。

#message.react()を使ってみる
message.react()はコメントに対してリアクションをとってくれる関数です。
bot_listen.py に追加で記述して行きましょう。

```python3:bot_listen.py 
@listen_to('いいですか')
def reaction(message):
    message.react('+1')
```
<img width="313" alt="スクリーンショット 2017-10-30 1.14.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/1d2c21ee-48cd-0dde-b3ed-e9a5a48636ed.png">
いいねしてくれましたね。
デフォルトでは👍ですがリアクションも変えられるようです。

#おまけ
@AKB428 さんが作成した放映中のアニメ作品の情報を取得できる[APIAnime RESTful API](https://qiita.com/AKB428/items/64938febfd4dcf6ea698)を利用させていただき、アニメのタイトルを返してくれる関数を作って行きたいと思います。
またbot_listen.pyに追加して記述して行きます。

```python3:bot_listen.py 
import urllib.request
import json
import random

@listen_to('アニメ')
def anime(message):
    d = datetime.datetime.today()
    url = 'http://api.moemoe.tokyo/anime/v1/master/'

    #四季を定義
    spring = [4,5,6]
    summer = [7,8,9]
    autumn = [10,11,12]
    winter = [1,2,3]

    #現在の月からリクエストを設定
    if int(d.month) in spring:
        month = '/2'
    elif int(d.month) in summer:
        month = '/3'
    elif int(d.month) in autumn:
        month = '/4'
    else :
        month = '/1'

    #url結合
    url = url + str(d.year) + month
    print(url)
    response = urllib.request.urlopen(url)
    content = json.loads(response.read().decode('utf8'))
    message.send('\"' + content[random.randint(0, len(content)-1)]['title'] + '\"' +'が面白い')
```
アニメは春アニメ、夏アニメといったように4つに分かれているようです。
初めて知った(;￣Д￣) クールとかは知ってるけど...
冬が1春が2といったようになっています。この記事を書いている頃は秋なので4ですね。三月のライオンとか発言してくれるのかな？
一様リクエストがそのクールのアニメ作品を全てとってくるのでその中からランダムで作品名を一つ返すようにします。
<img width="320" alt="スクリーンショット 2017-10-30 1.30.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/7eef1154-e8b5-6325-569e-ae63b47380df.png">
お！聞いたことのあるアニメがきましたね(見てないけど)。
#今回はここまで
次回はこのbotを常駐させるようにHerokuを使って行きましょう。
Power PC Cross Compile Settings for CentOS 6.9 on Virtual Box / CentOSでPower PC用のアセンブラ環境の作り方

57 yum install epel-release
58 yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
59 yum install yum-utils
60 yum-config-manager --enable remi-php70
61 yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el`rpm -q --whatprovides /etc/redhat-release --qf '%{version}\n'`.rf.x86_64.rpm
62 sudo yum update
63 wget http://ftp.gnu.org/gnu/binutils/binutils-2.29.1.tar.bz2
64 yum groupinstall "Development Tools"
65 yum groupinstall "Base"
66 yum install wget gcc gcc-c++ pcre-devel zlib-devel make openssl-devel libxml2 libxml2-devel libxslt-devel libxslt libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel gperftools-devel flex　jemalloc
67 yum install wget gcc gcc-c++ pcre-devel zlib-devel make openssl-devel libxml2 libxml2-devel libxslt-devel libxslt libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel gperftools-devel flex　jemalloc

68 yum install --enablerepo=epel gperftools
69 wget http://http://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz
70 wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz

sudo mkdir -p /opt/cross
100 sudo chmod 777 /opt/cross
101 export PATH="/opt/cross/bin:$PATH"

106 tar xvf binutils-2.29.1.tar.bz2

Download gcc-4.9.4 from 
http://ftp.gnu.org/gnu/gcc/?C=M;O=D and tar
107 tar xvf gcc-4.9.4.tar.gz　


----
cd gcc-4.9.4
151 wget http://ftpmirror.gnu.org/gmp/gmp-6.0.0a.tar.xz
152 wget http://ftpmirror.gnu.org/mpfr/mpfr-3.1.2.tar.xz
153 wget http://ftpmirror.gnu.org/mpc/mpc-1.0.2.tar.gz

154 for f in .tar; do tar xf $f; done
155 ls

156 ln -s mpfr-3.1.2 mpfr
157 ls -s gmp-6.0.0 gmp
158 ln -s gmp-6.0.0 gmp
159 ln -s mpc-1.0.2 mpc

or

yum gmp-devel mpfr-devel mpc-devel

*if you get a following error once you hit below.

root#../../gcc-4.9.4/configure --prefix=/opt/cross --target=powerpc-elf

<Error>
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify

---

$ mkdir powerpc-elf
$ cd powerpc-elf

$ mkdir binutils
$ cd binutils
$ ../../binutils-2.29.1/configure --prefix=/opt/cross --target=powerpc-elf

$ make -j2

$ sudo make install

$ cd ..

$ mkdir gcc
$ cd gcc
$ ../../gcc-4.9.4/configure --prefix=/opt/cross --target=powerpc-elf
$ make -j2 all-gcc
$ sudo make install-gcc


[root@localhost gcc]# powerpc-elf-gcc -nostdlib -g -O sample.c

ignore below WARN.

/opt/cross/lib/gcc/powerpc-elf/4.9.4/../../../../powerpc-elf/bin/ld: WARN: cant find Entry Symbol_start. Use default 01800080.


[root@localhost gcc]# powerpc-elf-objdump -S a.out

then you can get a result.

Well Don't forget update your .bash_profile files.

Because You will have to type Export Path again if you reboot machine without update.

>101 export PATH="/opt/cross/bin:$PATH"

Anyway, Please let us know if something wrong XD.

We will update this article as soon as we can !
CentOS に最新版の tmux をソースからインストールする

作業メモ。

# 検証環境

bento/centos-7.3
vagrant ユーザーで作業。
https://qiita.com/guttally/items/229e02ed2ffbe7c51ea4 に沿って git をインストールした状態。

# 手順

tmux の README を参考にする。

## 依存ライブラリのインストール

```bash
sudo yum install -y automake libevent-devel ncurses-devel
```


## ソースの取得

/usr/local/src の所有者は作業ユーザー (vagrant) に変更してある。

```bash
$ cd /usr/local/src
$ git clone https://github.com/tmux/tmux
$ cd tmux
$ git tag
... 最新版のタグを確認
$ git checkout 2.6
```

## ビルド・インストール

```
$ sh autogen.sh
$ ./configure --prefix=/usr/local
$ make -j4
$ sudo make install

$ which tmux
/usr/local/bin/tmux

$  tmux -V
tmux 2.6
```
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第八章 ブレイクスルー

# ブレイクスルー

> リファクタリングをすることで得られる収穫は、労力に正比例するものではない(第三部 第８章より)

リファクタリングは通常、小さく行い、僅かな収穫を得ることでレガシーとなっていくことを防いでいきます。
しかし、
> 最も重要な洞察の中には、突如として現れて、プロジェクト全体に衝撃を与えるものもあるのだ。(第三部 第８章より)

急に視界が開ける瞬間、ドメインの複雑さが消滅し、用途の広さ、説明の容易さが急激に増大する瞬間。それが、ブレイクスルーです。

なので、ここで言っているブレイクスルーはテクニックではなく、出来事。
ブレイクスルーを目指そうとして、できるものではないのです。
経験したことがある人でないと、実感が沸かないのではないかなと思う章でもあります。

とはいえ、ブレイクスルーが起こる土壌は必要。
小規模なリファクタリングを連続して行うことで、徐々に深いモデルが姿を表し、視界が明確になっていく。こういう環境がブレイクスルーには必要です。

# ブレイクスルーを目指さない

ブレイクスルーは出来事なので、意図して起こるものではないです。なので、無理に引き起こそうとしても、分析麻痺に落ちいって終わりです。納期もあります。

まずは基本に忠実に小さなリファクタリングを繰り返していくことが大事です。知識を噛み砕き、ユビキタス言語を育成し、重要なドメインを探求し、しなやかに改良していき、モデルを蒸留していく。
これまで読んできた内容と、これから読んでいく内容を実践してはじめてブレイクスルーが起こる土壌が生成されていきます。
カンマ区切りの数値入力を制限する必要がないぞ！



[filter_input](http://php.net/manual/ja/function.filter-input.php)

これの第二引数の部分なのですが。

[フィルタフラグ](http://php.net/manual/ja/filter.filters.flags.php) に `FILTER_SANITIZE_NUMBER_FLOAT` なるものを発見。

```php

<?php

$price = filter_input(INPUT_POST, 'price', FILTER_SANITIZE_NUMBER_FLOAT);

```

このように使います。

すると、ユーザーがテキストボックスに `10,000` のように入力しても、ちゃんと、10000が `$price` に代入されるんですね〜。

ユーザーの入力に対して、「カンマを入れちゃダメよー」ってする必要がないという話でした。
ざっくばらんメモ_12：kaggle


###kaggle seguro
[code](https://github.com/festa78/kaggle_seguro)
[このサイト](https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/)を参考に，xgboostのパラメータチューニングを引き続き行う．
一部修正を加えつつ，一通り通しでやってみたが，
結果LB0.269 -> 0.236へ下がってまう．
どこかでチューニングのやり方が間違っているように思える．
ひとまず公式の評価指標がNormalized Giniなのでそれに合わせてみる．
しかし結果のsubmissionが上手く行かず．
エラーとしては出力のレンジが[0, 1]に収まっていないというもの．
たしかにobjectiveをlinear regeressionでの学習をしていた事に気づいた．
ここをobjectiveをlogitstic regressionに切り替えて利用．
しかし結果はLB0.131で通常のrmsエラーより半減してしまった．
AtCoder Beginner Contest 076

2017年10月28日のAtCoderの記録。言語はpython 3です。

#概要
問題：[AtCoder Beginner Contest 076](http://abc076.contest.atcoder.jp/)
私の回答一覧：[自分の結果](http://abc076.contest.atcoder.jp/submissions/all?user_screen_name=Linus)
制限時間：100分
5分でA、7分でB、28分でCを完答した。
翌時解き直してDを完答。これ、400点の問題にしてはなかなか難しいと思う。

パフォーマンス：なし
レート：1400(レート変動の対象外)

#A問題
2*G-Rを出力。

#B問題
毎回の操作で、加算と2倍のうち小さい方を選べば良い。

#C問題

模範解答どおり。
文字列から部分を取り出すときに、全体の端から指定したいときは単に[:3]や[3:]と書けばよい。これはrubyには無い便利なやり方だな。

「本当は正しいアルゴリズムではないが、テストケースが不十分なためACとして通ってしまう」という現象、俗に言う「嘘解法」が発生したらしい。
「tを配置すると制約が発生するので、その分をaで埋められなくなり辞書順で後ろになってしまう。従って、tを最も後方に配置できるものが正解である」という考え方は、一見正しそうだ。しかし
s' = "z?"
t = "z"
のときに、この解法はtを最後に配置して"zz"を出力してしまう。
正解は"za"である。
したがって、文字列tが配置の方法のうち、辞書順が一番前のものを調べる必要がある。

```python
s0 = (input())
t = (input())

flag = False #解の候補が見つかったか否かのフラグ。

ans = ""
lt = len(t)
for i in range(len(s0)-len(t) + 1):
	flag2= True
	for j in range(lt):
		if s0[i+j] != t[j] and s0[i+j] != "?":
			flag2 = False
			break
	if flag2:
		flag = True
		temp = s0[:i] + t + s0[i+lt:]
		temp = temp.replace('?', 'a')
		if ans == "" or temp < ans: #この行を抜かすと「嘘解法」になる
			ans = temp

if(flag == False):
	print ("UNRESTORABLE")
else:
	print (ans)
```

#D問題

模範解答どおり……だとTLEになって通らなかった。
詳細な説明はカッとなって画像に書いたので参照してほしい。
![ABC076d-small.jpg](https://qiita-image-store.s3.amazonaws.com/0/102027/a3f4bfdb-562b-3076-e76c-c9a3aaec6604.jpeg)


計算量は高々400万程度で、結構余裕で間に合うはずなのに
浮動小数点の演算を少し削ったり、if文を削除してみたけど処理時間は殆ど変わらなかった。
小手先の変更では制限時間内には終わらないので、計算量をちゃんと落とす必要がありそうだ。

グラフ中で、橙色の点線は区間の先頭で1本増えるが
その後は増えることはあり得ない。
従って、区間の先頭以外では、橙色の点線の最小値は「直前の値+0.5」である。
これにより計算量は半分に減少する。
この変更を入れたら何とか通ってくれた。

C++(のような速い言語)でも通すのに苦労した人も少なくないようだ。

```python
n = int(input())

tt = list(map(int, input().split()))
v = list(map(int, input().split()))

time = sum(tt);
INF = 999999
border = [0] *(n+1)
start_v = [0] *(n+1)
end_v = [0] *(n+1)

temp = 0
for i in range(n):
	temp += tt[i]
	border[i+1] = temp
	start_v[i] = v[i]
	end_v[i+1] = v[i]

t = 0
idx = 0
ans = 0
vlast = 0
v0 = 0
new_interval = False
limitation_front =0 # 最初の計算に必要

# print (border)
while t < time :
	t += 0.5
	new_interval = False

	#直接制約
	v0 = v[idx]
	if t == border[idx+1]:
		idx += 1
		new_interval = True
#		v0 = min(v0, v[idx])

	if(not new_interval):
		limitation_front += 0.5
		if v0 > limitation_front:
			v0 = limitation_front
	
	if new_interval: 
		limitation_front = INF
		for j in range(n+1):
			if border[j] <= t:
				#前の時刻からの制約
				temp = end_v[j] + (t - border[j])
				if v0 > temp:
					v0 = temp
				if limitation_front > temp:
					limitation_front = temp
			else:
				break
			#print (limitation_front)

	for j in range(n+1):
		if border[j] >= t:
			#後ろの時刻からの制約
			temp = start_v[j] + (border[j] - t)
			if v0 > temp:
				v0 = temp

	#print(v0)
#	ans += 0.5 * (vlast + v0) / 2
	ans += (vlast + v0)
	vlast = v0

ans /= 4.0
print (ans)
```
[ReactiveProperty] ReadOnlyReactiveCollection使用時にObservableCollection<T>.Moveの更新が反映されない場合の対応

ReactiveProperty使用時に、Add, Deleteは反映されるのに ObservableCollection<T>.Move だけは ReadOnlyReactiveCollection に反映されなくて困ったので対応方法のメモ

# TL;DR

第二引数に `Scheduler.CurrentThread` を指定するのを忘れないこと。
 
```csharp
moveSupportedCollection.ToReadOnlyReactiveCollection(s.ToCollectionChanged<string>(), Scheduler.CurrentThread);
```

# 本家の実装例
以下のようになっている。

```csharp:ReadOnlyReactiveCollectionTest.cs#L174
        [TestMethod]
        public void MoveTest()
        {
            var s = new MoveSupportCollection<string>();
            s.Add("a");
            s.Add("b");
            var target = s.ToReadOnlyReactiveCollection(s.ToCollectionChanged<string>(), Scheduler.CurrentThread);

            target.Is("a", "b");
            s.Move(1, 0);
            target.Is("b", "a");
        }
```
[ReactiveProperty/ReadOnlyReactiveCollectionTest.cs at bd5ac52f0f9c561b2caac8844048398f1c178423 · runceel/ReactiveProperty](https://github.com/runceel/ReactiveProperty/blob/bd5ac52f0f9c561b2caac8844048398f1c178423/Test/ReactiveProperty.Tests/ReadOnlyReactiveCollectionTest.cs#L174)

# 原因

TODO: 分かり次第更新予定

# 参考
[referencesource/observablecollection.cs at master · Microsoft/referencesource](https://github.com/Microsoft/referencesource/blob/master/System/compmod/system/collections/objectmodel/observablecollection.cs)
↑ 途中もしかして ObservableCollection はMoveでは通知がされないのかと勘違いしましたが、当然ながら通知される実装になっています。
CentOS に最新版の git をソースからインストールする手順

作業メモ。

# 検証環境

bento/centos-7.3
vagrant ユーザーで作業。

# 手順

## 必要なものをインストール

### パッケージ

git のリポジトリを引っ張ってくるために git が必要になるので，一旦 git も yum でインストールする。

```bash
$ sudo yum install -y autoconf curl-devel gcc git perl-ExtUtils-MakeMaker

$ which git
/usr/bin/git

$ git --version
git version 1.8.3.1
```

### zlib-devel

git のビルドで必要になる zlib-devel をインストール。
参考ページ: https://qiita.com/shadowhat/items/867d9e06bc42cf862b9a


/usr/local/src が root の所有になっているけれど，make install 以外は root で作業したくないので，予め /usr/local/src を vagrant の所有にしておく。

```bash
$ sudo chown vagrant:vagrant /usr/local/src
$ cd /usr/local/src
$ wget http://zlib.net/zlib-1.2.11.tar.gz
$ tar zxvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
```

## git のリポジトリをクローン

```bash
$ cd /usr/local/src
$ git clone https://github.com/git/git
$ cd git
$ git tag
... 最新のタグを確認してチェックアウト
$ git checkout v2.9.5
```

## yum でインストールした git を削除

チェックアウトまでできたら現行の git は削除する。
git の向き先が /bin/git に残っているので，削除後にシェルを再起動しておく。

```bash
$ sudo yum remove -y git
$ exec $SHELL -l
```

## git のインストール

```bash
$ make configure
$ ./configure --prefix=/usr/local
$ make -j4
$ sudo make install

$ which git
/usr/local/bin/git

$ git --version
git version 2.9.5
UnityActionの拡張メソッドを書いてみた


拡張メソッドというものを使うとより効率的にコードを書けるようになるらしい。
ということで試しにUnityActionの拡張メソッドを書いてみる。
## 1. 拡張メソッド使用前

特定の動作が終わった後callbackを呼ぶメソッド

```cs:Sample.cs
using UnityEngine.Events;

public class Sample
{
    public void Hogehoge(UnityAction callback = null)
    {
        // callbakを持ったメソッドを作るたびにnullチェックするのが不便
        if (callback != null)
        {
            callback();
        }
    }
}
```

## 2. 拡張メソッドを定義

下記のようなクラスでUnityActionに対して拡張メソッドを追加する

```cs:ActionTest1.cs
using UnityEngine.Events;

public static class SampleExtention 
{
    // 拡張メソッドを定義しnullチェックをここで行う
    public static void Call(this UnityAction action)
    {
        if (action != null)
        {
            action();
        }
    }
    else
    {
        Debug.Log("必要であればactionがnullの時の処理を追加");
    }
}
```

## 3. 拡張メソッド使用後

上記拡張メソッドを使うと下記のように書くことができる

```cs:SampleAfter.cs
using UnityEngine.Events;

public class SampleAfter
{
    public void Hogehoge(UnityAction callback = null)
    {
        // 拡張メソッドがnullチェックを行ってくれるので使用する側ではnullチェック不要
        callback.Call();
    }
}
```

enumとか拡張メソッド定義すればかなり便利になりそう。
また思いついたら何か書きます。

> 参考
[Unity標準クラスにメソッドを追加する方法](http://tsubakit1.hateblo.jp/entry/20131201/1385909300)
eZ Publish でデバッグ情報を出力する

eZ Publish 4.x または Legacy でデバッグ情報を出力したい場合は以下のように INI ファイルを設定する。

## INI 設定

### 基本設定
```ini:site.ini.append.php
[DebugSettings]
DebugOutput=enabled
DevelopmentMode=enabled

[TemplateSettings]
Debug=enabled
```

### 使用テンプレート出力
```ini:site.ini.append.php
[TemplateSettings]
ShowUsedTemplates=enabled
```
ページのレンダリングに使用されている全てのテンプレートファイル名を出力してテーブル表示する。

![](https://doc.ez.no/var/doc/storage/images/media/images/packed-javascript-and-css-files/123520-1-eng-GB/packed-javascript-and-css-files_doc.png)

### ShowXHTMLCode
```ini:site.ini.append.php
[TemplateSettings]
ShowXHTMLCode=enabled
```

### SQL デバッグ出力
```ini:site.ini.append.php
[DatabaseSettings]
SQLOutput=enabled
```

### 特定の IP アドレスでデバッグ出力
```ini:site.ini.append.php
[DebugSettings]
DebugByIP=enabled
DebugIPList[]
DebugIPList[]=192.0.0.42
DebugIPList[]=192.0.0.0/27
```

### 特定のユーザーでデバッグ出力
```ini:site.ini.append.php
[DebugSettings]
DebugByUser=enabled
DebugUserIDList[]
DebugUserIDList[]=14
DebugUserIDList[]=70
```

### デバッグリダイレクト
```ini:site.ini.append.php
[DebugSettings]
DebugRedirection=enabled
```

### Regional Debug
```
[RegionalSettings]
Debug=enabled
```
If debug is enabled eZ publish will display information about the locale files that are loaded. You need to turn on Debug globally to see debug output.

### Regional DevelopmentMode
```
[RegionalSettings]
DevelopmentMode=enabled
```
Development mode makes eZ publish translate all untranslated string using bork mode. This can be handy when spotting untranslated text.

### ShowMethodDebug
```ini:site.ini.append.php
[TemplateSettings]
ShowMethodDebug=enabled
```
Sets if debug information about called functions and operators should be displayed.

## デバッグ用テンプレートファンクション
* {debug-accumulator}
* {debug-log}
* {debug-timing-point}
* {debug-trace}

## デバッグ用エクステンション

### eZDebug extension

#### 追加されるテンプレートオペレーター
* eZDebug()
* objDebug()
* addTimingPoint()
* numQueries()
* getDefinedvars()

#### 使用例
```smarty
{concat('Current node: ',$node.node_id)|eZDebug()}
 
{'ASSERT  FAILED: WE SHOULD NEVER BE HERE!'|eZDebug('error')}
 
{$unknown_object_here|objDebug()}
 
{concat('Queries executed so far: ',numQueries())|eZDebug()
```

#### スクリーンショット
![eZDebug extension スクリーンショット](http://projects.ez.no/var/plain_site/storage/images/ezdebug_template_operator/52426-10-eng-GB/ezdebug_template_operator.png)
http://projects.ez.no/ezdebug_template_operator
https://github.com/gggeek/ezdebug

## 関連記事
* [開発時に eZ Publish のキャッシュをオフにする](https://qiita.com/bezeklik/items/87c68adc005fd57ea128)
* [eZ Publish で詳細なシステム情報が確認できるエクステンション「ggsysinfo」](https://qiita.com/bezeklik/items/e7441ce6bc28ef4f7871)

## 参照
* https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Configuration-files/site.ini/DebugSettings
* https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Configuration-files/site.ini/TemplateSettings
* https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Template-functions/Debugging
Thunderbird のアドオン開発（準備編）

Thunderbirdで今まで使ってたアドオンが使えなくなった！
もう更新もストップしてしまった！！

って時に、やっぱ自分で作れるようになった方が手っ取り早いよね、ってことで、調べることにしました。
まずは開発環境（というより動作確認環境です）の準備から。
ちなみに、執筆時点のThunderbirdのバージョンはV52.4.0です。

# 開発用プロファイルの作成
基本的にWindows10での操作をベースに説明します。

開発用プロファイルの作成は、ウインドウズキー＋Rを押して「ファイル名を指定して実行」を開き、以下を入力します。

```
thunderbird -ProfileManager
```

そうすると、こんなのが開きます。
![2017-10-29.png](https://qiita-image-store.s3.amazonaws.com/0/179043/d43c5a67-019c-1881-a90a-c8182709a017.png)
すでに作成済みですが、「新しいプロファイルを作成(C)...」てやつをクリックして、作成します。
フォルダを指定する際、プロファイル名のフォルダは自動作成してくれないので注意してください。
また、「今後このプロファイルを使用する(S)」というところにチェックがあると、最後に使用したプロファイルで立ち上がるようです。

作成したら、起動してみましょう。
するとこんな感じになるはず。
![2017-10-29 (1).png](https://qiita-image-store.s3.amazonaws.com/0/179043/f59554c9-a628-9726-54bf-8ea21c0154fb.png)
※すでにアドオンが入っているので、画面右下にバージョン情報が表示されています。

これでプロファイルが複数になったため、通常の起動時には最後に使用したプロファイルで立ち上がるか、あるいはチェックを外していれば先ほどのプロファイルの選択ダイアログが表示されるようになります。
それは面倒なので、いつもので起動した後、開発用のプロファイルで立ち上がるように別途ショートカットを作成します。

# 開発用プロファイルのショートカットの作成
通常のThunderbirdのショートカットをコピーして好きなところに貼り付け、ショートカットのプロパティを開き、リンク先を編集します。
具体的には、以下のように引数を追加します。

```
"C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe" -no-remote -P Development
```

![2017-10-29 (3).png](https://qiita-image-store.s3.amazonaws.com/0/179043/a5fee591-698d-7ae9-4966-4fef4c529b8c.png)

ショートカットをリネームすれば、より分かりやすいですね。
# 開発用アドオンの追加
本当は[こちら](https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment#Recommended_development_preferences)を参考に、メニューバーから [ツール] -> [オプション] -> [詳細] -> [一般] -> [設定エディター(C)...] と移動して about:config を編集したかったのですが、なぜか項目がなかったのでアドオンで対応しました。

ちなみにabout:configはこれです。
![2017-10-29 (4).png](https://qiita-image-store.s3.amazonaws.com/0/179043/e133e1b1-ef4a-7050-910b-a25b8cbe6b7d.png)

メニューバーから [ツール] -> [アドオン] をクリックして、アドオンマネージャーを開きます。
![2017-10-29 (5).png](https://qiita-image-store.s3.amazonaws.com/0/179043/2739e696-e21f-d5ea-8685-6a575e329a59.png)
拡張機能のところにすでに追加されていますが、いずれもそのままでは入らないため、ダウンロードしてきて強制的にインストールします。

インストールには、左側ペインの「アドオン入手」からちょっと下の右にある「すべてのアドオンを見る」からダウンロード可能です。
![2017-10-29 (6).png](https://qiita-image-store.s3.amazonaws.com/0/179043/f855b5a1-01f9-dba9-81cc-799d7f2f894b.png)

例えば「DevPref」を検索すると、こんな感じになります。
![2017-10-29 (7).png](https://qiita-image-store.s3.amazonaws.com/0/179043/d71a09a6-6a83-aa1d-3877-f5e51d8a7ad9.png)

ですが、名前の部分をクリックすると、「強制ダウンロード」がありますのでダウンロードできます。
![2017-10-29 (8).png](https://qiita-image-store.s3.amazonaws.com/0/179043/63081d6e-6936-89f8-f1e4-47f3e4bd1fb9.png)

ダウンロード後は、アドオンマネージャの拡張機能のところにドラッグアンドドロップすればOKです。
DevPrefを入れる際はなんか文字が出ますが、読まずに閉じてしまったのでどういう事が書いてあったのか分かりません・・・

DefPref、DOM Inspector、Version in Add-on barのどれもこの方法でないとインストールできません。


# 終わりに
さて、これでとりあえず環境は作れたはずです。たぶん。
次はコーディングのやり方ですが、ここで絶賛ハマリ中でして、続かないかもしれません・・・
作ってる人がいるんだからできるはず！　と思ってますが、あんまり英語が得意ではないのと、情報が古かったりして今と違ったりするのでどうしていいやら・・・

# 参考
この記事を執筆するにあたって、以下のサイトを参考にさせていただきました。ありがとうございます。（むしろ、ただの焼き直しっぽいかも・・・）

Mozilla Thunderbird アドオンの作り方 ～ 開発環境の準備 - Open MagicVox.net
http://www.magicvox.net/archive/2014/03161644/

正直このサイトを見ながら作れば作れるかも？(笑)
あくまで自分のログの意味合いも込めて執筆させていただきました。
MSTARデータセットの利用

# はじめに
MSTARは，AIシステムの開発における有用なデータセットと言える．ここでは，MSTARの利用方法およびデータ加工のためのサンプルコードについて記事にする．

# MSTARとは
SAR(合成開口レーダ)画像の有名なデータセットである．
![1__2s1 (53).JPG](https://qiita-image-store.s3.amazonaws.com/0/199443/7639fa2a-486e-ddcf-2124-d03a2fb8e9b4.jpeg)
図：2S1のレーダ画像

# 入手方法
１．下記でアカウントを作る
https://www.sdms.afrl.af.mil/index.php?collection=registration
２．データをダウンロードする
＊一般的にSARデータによる分類・識別に関する研究では，MSTAR Public Data Productsを使う．
　以下をダウンロードする．
　MSTAR Clutter (CD1, CD2);
　MSTAR Target Chips (CD1);
　MSTAR/IU Mixed Targets (CD1, CD2)
　MSTAR/IU T-72 Variants (CD1, CD2)

# 使い方
各ファイルの目標は次のとおりになっている．
MSTAR Clutter： ターゲットなしの雑音画像
MSTAR Target Chips： T72, BMP2, BTR70
MSTAR/IU Mixed Targets：BTR60, 2S1, BRDM2, D7, T62, ZIL131, ZSU23
MSTAR/IU T-72 Variants： 異なる型番のT-72タンク
＊フォルダ内の(数字)_DEGはオフナディア角を示す．
＊複素画像と強度画像がある．
![figA.png](https://qiita-image-store.s3.amazonaws.com/0/199443/96cf7201-7e8f-931a-7df1-037069f9a4e4.png)
![figB.png](https://qiita-image-store.s3.amazonaws.com/0/199443/b88b3d52-c64c-4c92-2d3e-fcfa013f921a.png)

# データの加工
次のコードでデータセットファイルを作成してみた．

```ruby:ImageChanger.py
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 29 15:20:09 2017

"""
from PIL import Image
import numpy as np

num = 100 # 使用する画像枚数
typenum = 2 # 目標種類数

# 適当に事前割り当てを作成（仮処置）
imgset = np.zeros((num * typenum, 200**2))

for m in range(typenum):
    for l in range(num):
        # 元となる画像の読み込み
        img = Image.open('%s__ (%s).jpg' %(m + 1, l + 1))
        print('%s__ (%s).jpg' %(m + 1, l + 1))
        img = np.array(img)
        
        # 画像ベクトル生成
        k = 0
        tmp = img[k]
        for k in range(len(img) - 1):
            tmp = np.r_[tmp,img[k + 1]]
        imgvec = tmp
        
        # ゼロ埋め（仮処置）
        nnn = 200**2 - len(imgvec)
        imgvec = np.r_[imgvec, np.zeros((nnn - 1,)), m + 1]
        
        imgset[l + m * 100] = imgvec
        print(imgvec)
        imageData = imgset
        
np.savetxt('test.txt', imgset[0:3, 0:4], delimiter = ',')
```

注）jpgの画素数がばらばらなので少し扱いづらい


・なんでわざわざtxtファイルにしているのか？
⇒下記でtxtでデータセットを作っているため．愚直に真似してみた．train生成にはまだ成功していない．．．
https://qiita.com/tommyfms2/items/c3fa0cb258c17468cb30
・なんなんだこの吐き気のするコードは？
⇒ごめん．

# まとめ
MSTARはつかえる．
日記アプリのMVP化工程記録・1

# 目的
勉強用自作アプリのMVP化工程を記録しておこうと思う。
まずは単機能として動くところまで出来たので、
この先の機能拡張の前にアーキテクチャをMVPとして書き直しておく。

# なぜMVP化？
日記機能のアプリなので、当然ローカルDBは必須。
今回はRealmを選択して開発に挑んだ。

# 現在のクラス構成
![UML図1.png](https://qiita-image-store.s3.amazonaws.com/0/204267/fec8aa17-3bfb-54b0-e7dd-c6137c5b7fd9.png)

# 問題点
基本的なRealmの実装はHelperに書いているが、
データ操作のかなりの部分がFragmentに侵食している。このまま進めると膨張することが目に見えている。

# これから
MVP化なので、当然PresenterをViewとModelの間に設置する事になる。
Fragmentで実装しているロジック部分を書き出せるはず。
あと、同時に行うかは分からないが、RxJavaも導入したい。

# GitHub
https://github.com/poin-settia/Diary
本記事は[MVP用のパッケージ切り](https://github.com/poin-settia/Diary/commit/91978694d8e923daf256389694da545ba1b013e6)を行った時点で執筆した。
Gitで環境ごとのブランチを作成する

# やりたかったこと
- 環境設定をブランチごとにコミットしたい

### ブランチを分けたい３環境
- 開発環境　→　ローカル環境の設定を管理するブランチ
- テスト環境　→　テスト環境の設定を管理するブランチ
- 本番環境　→　本番環境の設定を管理するブランチ

### 対応前のブランチ
- master →　develop　→　test
 - master → 本番環境で利用
 - develop（masterから派生） → ローカル開発環境で利用
 - test（masterから派生） → テスト環境で利用
 
# 問題点
 - 各ブランチに環境設定をcommitするとブランチ間のマージで毎回差分がでる
 
# 原因
- 作業の流れとブランチ構成が合っていなかった

### 作業の流れ
開発　→　テスト　→　リリース
develop →　test　→　master

### ブランチの流れ
master　→　develop →　test

# 対応
- 作業の流れに合わせてブランチを作成し直す（develop →　test　→　master　とする）

1. masterブランチからdevelopブランチをチェックアウト
2. developブランチにて開発環境の設定を編集しcommit
3. developブランチからtestブランチをチェックアウト
4. testブランチにてテスト環境の設定を編集しcommit
5. testブランチをmasterブランチにマージ
6. masterブランチにて本番環境の設定を編集しcommit
7. 以降、はdevelopブランチで開発　→　testブランチにマージ → masterにマージ　の順序で作業することで環境設定まわりで差分が発生しなくなる

# その他
- 今使っているブランチ構成
 - develop　→　開発環境用のブランチ
 - feature / hotfix（developから派生、develop／masterに合流） → 機能、障害ごとの開発環境用のブランチ
 - master（developから派生） → 本番環境用のブランチ
 - test（masterから派生） → テスト環境用のブランチ（本番環境をベースにして、テストしたいfeatureのみをマージして利用している。毎リリースごとにmasterから作り直し）

- GitFlowを参考にしていたが、日々リリースがある場合developブランチの状況把握、整合性の確保が難しくなった
- GitHubFlowを参考にしfeatureからdevelopへのマージはredmineを利用しPullRequest形式にしてリリースすることで対応している

# 参考
[GitFlow](https://jeffkreeftmeijer.com/git-flow/)
[GitHubFlow](https://gist.github.com/Gab-km/3705015)
kotlinの型と変換


#kotlinで使える型
###数値
| 型       |       ビット幅 |   
|:-----------------|------------------:|
| Double             |             64 | 
| Float           |            32 | 
| Long             |              64 | 
| Int             |                32 | 
| Short             |            16 |
| Byte          |           8 | 

またkotlinでは型を宣言しなくとも実行できるが

```
val a = 1F + 3
```
や

```
val a = 1L + 3
```
などでFloat+IntやLong+Intなどの計算ができる。
*Float型は`f`or`F`でタグ付けをする。

###文字
| 型       |       ビット幅 |   
|:-----------------|------------------:|
| Char             |             8 | 
###文字列
| 型       |       ビット幅 |   
|:-----------------|------------------:|
| String             |             可変 | 
###真偽値
| 型       |       ビット幅 |   
|:-----------------|------------------:|
| Boolean             |             一般に8 | 
###配列
| 型       |       ビット幅 |   
|:-----------------|------------------:|
| Array             |              | 

#型変換
###文字列から数値
```
 val t : String = "123"
 val i : Int = Integer.parseInt(t)
```
###数値から文字列
```
val a : Int =  32
val s : String = a.toString()
```
###数値から数値
```
val b  : Float= 3.0F
val f : Int = b.toInt()
```
数値からの数値への変換は全ての数値型への変換をサポートしています

- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
Windows10にPuttyをインストールする方法


- 環境
    - OS : Windows10 Pro 64bit
    - Putty : Release 0.73

# 1. ダウンロードする
1. [Puttyのサイトへ行く](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
2. ダウンロードする
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/bee6ae20-d89b-9509-8314-9201835e54b6.png)

# 2. インストールする
1. ダウンロードしたものを起動してひたすら画面通りに進む
    - ![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/68636c0a-0b79-4ba6-dc96-28ec2b0edc1c.jpeg)
3. インストール先を指定する
    - ![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/3e6e199d-ba12-686a-0ff3-561460646bca.jpeg)
1. ![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/c4781dd4-b0b8-5283-7455-654c85289dd0.jpeg)
2. ![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/92a77591-d869-73e8-d9b1-2e461722793d.jpeg)

# トロイの木馬版があるので注意する
> 今回報告された、トロイの木馬版PuTTYを見分けるのは比較的簡単です。トロイの木馬版は、Aboutダイアログのバージョンナンバーに**「Unidentified build, Nov 29 2013 21:41:02」**と表示されるからです。
> [【注意喚起】トロイの木馬版 PuTTY が流行中との情報 | ソフトアンテナブログ](https://www.softantenna.com/wp/windows/trojanized-putty/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/c6793c11-7e20-ac78-afef-5850c55c6eee.png)
ReactにRailsのコントローラーからの処理を送り込む

ReactをRailsのviewに使うとき、Railsのコントローラーでの処理結果などをReact内に使いたいときがある。
例えば、ログイン中のユーザー名をReactコンポーネント内で表示したいときとか。当然、Reactに直接current_user.nameなどを記載しても動かない。
そこで、current_user.nameを一旦、\<div>で囲んで、どこかのhtml.erbに送り込む。

```react.html.erb
<div id="user_name" data="<% current_user.name %>></div>
```

これを、React側から取得する。

```React.js
const username = $("#user_name").attr('data');
```

$("#user_name").attr('data')の部分は、「idがuser_nameである\<div>のdata属性の内容を取得する」、という意味。こうしてあげると、current_user_nameをusernameとしてreact内で利用できる。
Atomにatom-pairパッケージを入れてペアプログミング

## 概要
自分（東京）と友人（大阪）でペアプログラミングしたいと思い、[atom-pair](https://atom.io/packages/atom-pair)を使ってみました。

先にざっとまとめ
-　導入がめちゃくちゃ簡単
-　画面共有ではなく誰でも編集可能
-　最大20人まで（そんなにいるのか）

## Atomエディタのインストール
[公式サイト(https://atom.io/)](https://atom.io/)
まずは公式サイトからAtomを手に入れる。

## atop-pairパッケージのインストール
方法は2パターン。

* Atomエディタのコマンドパレット``Command+Shift+P``から``Install Packages and Themes``で``atom-pair``を検索してインストール
* ターミナルから``apm install atom-pair``と実行してインストール

## ペアリングの開始

招待する人
1. コマンドパレットから``AtomPair: Start A New Pairing Session``を選択する。
2. セッションIDがクリップボードにコピーされた旨のメッセージが出る。
3. 何かしら（Slackとか）で招待したい人にセッションIDを共有する。

招待された人
1. コマンドパレットから``AtomPair: Join a pairing session``を選択する。
2. ウインドウが表示されるのでセッションIDを入力する。


しばらくすると、招待された側には招待した側のウインドウが共有されます。
招待した側には、誰かが参加した旨のメッセージが表示されます。

以上

なんて簡単なんでしょう。

## ペアリングの終了
1. コマンドパレットから``AtomPair: Disconnect``
2. 接続が切れた旨のメッセージが表示されます。

これまた簡単。

## 使ってみた感想など
* 違うネットワークでも使えるのが便利
* 東京〜大阪でタイムラグはほぼなかった、ストレスがないのが一番
* プログラミング以外でもアイディア次第で用途が広がりそう（最大20人だし）
* 議事録とかコードレビューとか、同時編集できるのでホワイトボード代わりにブレインストーミングとかにも使えそう（最大20人だし）
* まあ普段は自分SublimeTextなんですけどね。
* SublimeTextでも違うネットワークで使えるパッケージあるのかな（←知っている方は教えていただけると嬉しいです）
* Qiita初めて投稿してみたけど難しい。。

## [追記] 2017/11/25
Atom開発元のGitHubが[Teletype for Atom](https://teletype.atom.io/)をリリースしました。
こちらの方が分かりやすく説明してくださっています。
[【リアルタイム共同編集】Atomで出来るようになったってよ](https://qiita.com/k-waragai/items/a372800c262f56fe688a)
Pythonで画像切り抜きGUIを作成してみた

# 概要
題名の通り、Pythonで画像切り抜きGUIを作成してみました。

#環境
- OS : WIndows 10
- Python version : 3.6.3

# 使用したライブラリ
- PyQt5 : GUI作成
- PIL : 画像の切り抜き & 保存
- Tkinter : 画面サイズを取得するために一時的に使用

# 動作
説明するよりも見て頂いた方が早いと思うので、動画をYoutubeにUPしました。
文字が非常に小さく見えづらいので、高画質かつ全画面表示で見て頂けると助かります。

https://youtu.be/2Bee8OGyn1A

# ソースコード
修正を加えた後に、GitHubにUPする予定です。