OmniAICreator/Qiita-1.07M huggingface dataset:
スクリーンセーバの起動を抑制する - Arduino Pro Micro(の互換機)を使用

#はじめに
うちの会社のPCは10分でスリーンセーバが起動してしまう。その度にパスワードを入力して解除するのが面倒なため、スクリーンセーバを抑制するためだけのキーボードを作成した。

簡単に書くと
"Arduino Pro Microで一定間隔でSHIFTキーを押す"
だけのことです。

2018/02/22 : プログラムミス修正しました


#用意するもの
##Arduino Pro Micro(の互換機)
![DSD_2018.JPG](https://qiita-image-store.s3.amazonaws.com/0/211703/2c4ae451-b041-37e1-efb6-72002299bf82.jpeg)

HIDとして動作するArduino Pro Microかその互換機を用意する。IOは使用しないので半田付けは不要です。

##USBケーブル
Pro Microを接続するのに使います。

#プログラム
Arduinoのサンプルスケッチを参考に、一定間隔でSHIFTキーを押下します。

```C++:AntiScreenSaver.cpp
//
// 2018/02/21 First Edition
// 2018/02/22 R1 AntiScreenSaverCountのカウントアップ忘れ修正
#include "Keyboard.h"

unsigned long uptime;
unsigned long uptimeLastKey;
unsigned long AntiScreenSaverCount;

void setup() // initialize the buttons' inputs:
{
    uptime = millis();
    uptimeLastKey = uptime;

    AntiScreenSaverCount = 0;
    
    // initialize mouse control:
    Keyboard.begin();
    Keyboard.releaseAll();
}

void SendShiftKey(bool bRight)
{
    Keyboard.press(bRight?KEY_RIGHT_SHIFT:KEY_LEFT_SHIFT);
    delay(50);
    Keyboard.release(bRight?KEY_RIGHT_SHIFT:KEY_LEFT_SHIFT);
    uptimeLastKey = millis();
}
void loop() {
    uptime = millis();
    if( (uptime - uptimeLastKey) > 420000L )    // 7分
    {
       SendShiftKey( AntiScreenSaverCount % 2 );   // 右SHIFT,左SHIFTを交互に押下
       AntiScreenSaverCount ++;  // R1
    }
    delay(50);
}
```

左シフトだけにするとこいつが表示されてしまうので、右左交互に押下するようにしています。
![SHIFT5kai.png](https://qiita-image-store.s3.amazonaws.com/0/211703/63f8fef2-d293-b1a4-38d1-c5a57f81f863.png)

#起動
Arduinoに書き込み、ターゲットのPCに接続すればスクリーンセーバ抑制が図れます。キー入力時にもSHIFTキーを押下していますが、私は不便していません。

お使いの環境に合わせてキー押下間隔を調整してください。

#注意
CtrlやAltはキーとの組み合わせで別の機能が起動してしまうのでお勧めしません。

#最後に
うちの会社はUSBポートを使用禁止ですがキーボード、マウス等のHIDはOKです。これもキーボードの一種なので問題ないハズですが、ちょっとという向きには下記もお試しください。

[スクリーンセーバの起動を抑制する - vbsバージョン](https://qiita.com/tlab/items/91aea996f68667b0a0ee)
[スクリーンセーバの起動を抑制する - mpgバージョン](https://qiita.com/tlab/items/90b6fbb4c75ec1bdceda)
スクリーンセーバの起動を抑制する - mpgバージョン

#はじめに
うちの会社のPCは10分でスリーンセーバが起動してしまう。その度にパスワードを入力して解除するのが面倒なため、スクリーンセーバを抑制するのに動画を流すことにした。

簡単に書くと
"真っ黒なMPGを流す"
だけのことです。

[スクリーンセーバの起動を抑制する - Arduino Pro Micro(の互換機)を使用](https://qiita.com/tlab/items/c83981ab5a13b858a7da)
[スクリーンセーバの起動を抑制する - vbsバージョン](https://qiita.com/tlab/items/91aea996f68667b0a0ee)

の二つを紹介しましたが、ハードもvbsも禁止されている場合に有効な方法です。

#動画を作る
お使いのPCにWindows Movie Makerがあればそれを使用します。なければ御自由なソフトをお使いください。
![WindowsMovie Maker.png](https://qiita-image-store.s3.amazonaws.com/0/211703/2a2744c5-92a1-9f45-025d-dc23f6f17d3d.png)
タイトル画面を挿入して、スクリーンセーバを起動させたくない時間分の長さに設定します。画面では3600秒(=1時間)

![Setting.png](https://qiita-image-store.s3.amazonaws.com/0/211703/dec321f8-e13f-d3bd-a260-6200cf40bf71.png)
容量が小さくなるよう設定します。上記はMovie Makerの最低設定です。

1時間の映像で251KBに収まりました。

#使用する
Media Playerで再生するだけです。

![Movie.png](https://qiita-image-store.s3.amazonaws.com/0/211703/58e642b1-c44b-757c-3be9-eff5d0e95da1.png)

画面が黒いので目立ちません。

#おわりに
Movie Playerが確実にスクリーンセーバをブロックしてくれます。
会社のPCにムービーメーカが無くても、200kb程度、4時間でも1MB以下ですので会社のPCに入れる方法はあるはずです。
スクリーンセーバの起動を抑制する - vbsバージョン

#はじめに
うちの会社のPCは10分でスリーンセーバが起動してしまう。その度にパスワードを入力して解除するのが面倒なため、スクリーンセーバを抑制するためのVBScriptを作成した。

簡単に書くと
"VBScriptで一定間隔でSHIFTキーを押す"
だけのことです。

#用意するもの
VBScriptはMicrosoft Officeが必要でしたっけ?
VBSが動作する環境が必要になります。

#プログラム
##起動プログラム
```VBS:起動.vbs
'
' "シフトキーを押すvbaを一定間隔で呼び出しするスクリプト
'
Option Explicit

WScript.Echo "Shift Key.vbsを開始します。"

'起動用のオブジェクトを生成
Dim objWsh
Set objWsh = WScript.CreateObject("WScript.Shell")
Dim I

For I = 1 To 20
	'vbsを実行
	objWsh.Run """d:\Shift_Key.vbs""",,true
	WScript.Sleep 1000*60*7.0
Next

WScript.Echo "Shift Key.vbsを終了します。"

```

#シフトキーを押下するスクリプト
```VBS:Shift_Key.vbs
'
' シフトキーを押すだけのスクリプト
'
Set objShell = WScript.CreateObject("WScript.Shell")

objShell.SendKeys "+"
```

#起動
上記プログラムではShift_Key.vbsをDドライブ直下に置いていることを想定しています。起動.vbsはどこでもOKです。

起動には、起動.vbsをダブルクリックしてください。
起動時と終了時にメッセージを表示していますが、これが無いと動作しているのかすら分からなくなります。

###起動.vbsとShift_key.vbsを分けている理由
一緒にしてしまうと(ループの中にシフト押下処理を入れると)、ジョークソフトとしてウィルス対策ソフトに隔離される可能性があるためです。

#注意
これはSHIFTキーを連打するのと同じなのですが、あのダイアログは表示されません。
<あのダイアログ>
![SHIFT5kai.png](https://qiita-image-store.s3.amazonaws.com/0/211703/1b98426f-088d-197f-3a8b-32672bdbd95d.png)


#おわりに
関連

[スクリーンセーバの起動を抑制する - Arduino Pro Micro(の互換機)を使用](https://qiita.com/tlab/items/c83981ab5a13b858a7da)
[スクリーンセーバの起動を抑制する - mpgバージョン](https://qiita.com/tlab/items/90b6fbb4c75ec1bdceda)
PostgreSQLでバイナリファイルを扱う

ファイルをサーバに格納する方法のひとつとして、DBMS（ここではPostgreSQL）に格納する方法を調べました。
今回、格納したいデータは数MB程度小さいので、ファイルシステムに格納するより、DBの方が管理が簡単そうだし、メモリ上も問題ないかと思いましたので。

要件は、
・バイナリデータ（PDFファイルやWordファイルを想定）を読み書きできること。
・Java（MyBatis）から読み書きできること。
・SQL（psql）から読み書きできること。テストデータ等を気軽に作れるように。
・単体試験用に、バイナリデータがDBUnitのXML形式で保存できること。

# PostgreSQLにおけるデータ型
bytea型と、ラージオブジェクトの2つがあるようです。

### bytea型
byteaは普通の型。1GBまでOKなようです。
https://www.postgresql.jp/document/9.6/html/datatype-binary.html
上記公式サイトでは最大サイズが読み取れなかったのですが、Let's Postgresの説明にありました。（下記記事は違う主旨なのですけどね）
https://lets.postgresql.jp/documents/technical/text-processing/1

汎用ファイルアクセス関数を用いると、SELECT文などでファイルシステム上のファイルを読むことが可能で、そのデータをINSERTすれば、DBに格納できます。
https://www.postgresql.jp/document/9.6/html/functions-admin.html#FUNCTIONS-ADMIN-GENFILE
サンプルがLet's Postgresに載っていました。
https://lets.postgresql.jp/documents/technical/gen_data/1

### ラージオブジェクト
ラージオブジェクトは、何か特別な格納のされ方になるようです。
こちらも、Let's Postgresに解説されています。
https://lets.postgresql.jp/documents/technical/large_objects

公式サイトにも、1セクション使って解説が載っています。OS上のファイルのインポート・エクスポートも説明があります。
https://www.postgresql.jp/document/9.6/html/largeobjects.html

### で、どちらにする？
今回格納したいデータは数MB程度小さいので、簡単そうなbyteaにします。
ラージオブジェクトは別テーブルに格納されるようなので、バックアップしたり、テストデータを用意したりといった作業が面倒なのかなと思いました。

# ではbyteaを使ってみよう
早速使ってみましょう。

## SQLでファイルを読み込み、テーブルにINSERT
DBにテーブルを用意します。特別なことはなく、格納するカラムの型を「bytea」とするだけでした。

続いて、Windowsのファイルシステム上にあるファイルを、SQLでテーブルにINSERTしてみます。
ファイルは、データベースクラスタのディレクトリに格納する必要があるとのことなので、まずファイルリストを取得してみます。

```
select pg_ls_dir('.');
```

こんなリストが取れます。私の環境では「C:\Program Files\PostgreSQL\9.4\data」にあるディレクトリとファイルの一覧に一致します。

```
"base"
"global"
"pg_clog"
"pg_dynshmem"
"pg_hba.conf"
"pg_ident.conf"
"pg_log"
"pg_logical"
"pg_multixact"
"pg_notify"
"pg_replslot"
"pg_serial"
"pg_snapshots"
"pg_stat"
"pg_stat_tmp"
"pg_subtrans"
"pg_tblspc"
"pg_twophase"
"PG_VERSION"
"pg_xlog"
"postgresql.auto.conf"
"postgresql.conf"
"postmaster.opts"
"postmaster.pid"
```

それでは、「postgresql.conf」をテーブルに読み込んでみます。
pg_read_binary_file関数で、ファイル内容をbytea型で取得することができます。

```
SELECT pg_read_binary_file('postgresql.conf') 
```

これをINSERT文に渡してあげればOKです。例えば、id(integer)とbigdata(bytea)というカラムを持つdataテーブルにINSERTするときは、下記のようにSELECTした結果をINSERTすればいいです。ここでは便宜上、idの値は固定的に1としていますが深い意味はありません。

```
INSERT INTO data (id, bigdata)
SELECT 1, pg_read_binary_file('postgresql.conf') 
```

## SQLでテーブルからSELECTしファイルに書き出し

先ほどINSERTしたデータを、ファイルに書き出すには、COPYコマンドがいいのかな？ ここでは、ファイル名を固定で指定していますが、テーブルにINSERTするときに、ファイル名を格納するカラムを作っておいて、その名前で書き出せば復元できますね。

```
copy ( select bigdata from data )
  to 'c:\home\output.dat' (format binary)
```

MyBatisからの操作はこれから調べていきます。
OpenCVで画像から回転矩形領域を切り出す

OpenCVでは画像内の矩形領域をcv::Rectを使うことで切り出すことができます．

```cpp
cv::Mat src; // 元画像
cv::Rect roi(cv::Point(256, 156), cv::Size(50, 200));
cv::Mat subImg = src(roi); // 切り出し画像
```

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/18588/9f2da2f9-816c-10df-3f8c-a5fea8e48cde.png)

しかし回転した矩形領域を切り出したい場合，OpenCVには回転矩形を表すcv::RotatedRectがありますが，cv::Rectのようにそのままcv::RotatedRectを指定ことはできません．

画像からcv::RotatedRectで回転矩形領域を切り出す方法について[この記事](http://answers.opencv.org/question/497/extract-a-rotatedrect-area/)で紹介
されていたので，こちらを参考に説明します．


## 画像からRotatedRectを切り出す方法
まず画像全体を一度回転してから，矩形領域を切り出すという処理が必要になります．

手順としては以下の通りです．
1. 回転矩形の角度から回転行列を求める．
2. 回転行列を用いて元画像全体を回転させる．
3. 回転した画像から矩形領域を切り出す．

```cpp
cv::Mat src; //　入力画像
cv::RotatedRect rect(cv::Point(256, 256), cv::Size(50, 200), 45); // 回転矩形
cv::Mat M; // 回転行列
cv::Mat rotated; // 回転された元画像
cv::Mat cropped; // 切り出された画像

float angle = rect.angle;
cv::Size rect_size = rect.size;
if (rect.angle < -45.) {
    angle += 90.0;
    std::swap(rect_size.width, rect_size.height);
}

// 回転矩形の角度から回転行列を計算する．
M = cv::getRotationMatrix2D(rect.center, angle, 1.0);
// 元画像を回転させる．
cv::warpAffine(src, rotated, M, src.size(), cv::INTER_CUBIC);
// 回転した画像から矩形領域を切り出す．
cv::getRectSubPix(rotated, rect_size, rect.center, cropped);
```

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/18588/eddde705-f809-4d47-2e33-f0dc0f52ab01.png)

## (おまけ) cv::RotatedRectを描画する
cv::Rectの描画はcv::rectangleでできますが，cv::RotatedRectの描画はcv::rectangleではなく，cv::polylinesやcv::fillPolyを使います．

### 塗りつぶさない場合 - cv::polylines()
```cpp
cv::Point2f vertices2f[4];
rect.points(vertices2f);
std::vector<cv::Point> vertices;
for (int i = 0; i < 4; ++i) {
    vertices.push_back(vertices2f[i]);
}
const cv::Point* pts = (const cv::Point*) cv::Mat(vertices).data;
int npts = cv::Mat(vertices).rows;
cv::polylines(src, &pts, &npts, 1, true, cv::Scalar(0, 255, 0), 3);
```

### 塗りつぶす場合 - cv::fillConvexPoly()
```cpp
cv::Point2f vertices2f[4];
rect.points(vertices2f);

cv::Point vertices[4];
for (int i = 0; i < 4; ++i) {
    vertices[i] = vertices2f[i];
}
cv::fillConvexPoly(src, vertices, 4, cv::Scalar(0, 255, 0));
```


## 参考
* [Extract a RotatedRect area](http://answers.opencv.org/question/497/extract-a-rotatedrect-area/)
* [Draw rotated rectangle in opencv c++](https://stackoverflow.com/questions/43342199/draw-rotated-rectangle-in-opencv-c)
我が家でも よりシンプルにGoogle Homeで子供の朝支度を促してみる

# はじめに
@hideo-works さんの記事に影響されてGoogle-Homeを即買いした2児の父です。
https://qiita.com/hideo-works/items/db25a748889d47d5eff2
我が家でも毎朝、「はやくごはんたーべーてー」「トイレ行ったーのー」「はーやーく靴下はーいーてー」と言った悲哀に満ちた声が響いているので、少しでも違った展開をと思い導入に至った次第です。

ただ、GoogleスプレッドシートとFirebaseは使わなくてもよいかなと思いました。
よりシンプルに ラズパイ → (1) → Google Homeだけにまとめました。
時間、曜日に応じて実行してもらう仕組みがあればよい。  
Node.jsでスケジューラ作るのはめんどくさそう。。。
そうだ、僕らにはcronがある。
# Raspberry Pi
まずは、Node.jsを実行するシェルスクリプト。cronで実行するのでnode実行するのもフルパスにするかシェルの中でPATHに追加する必要があります。

```sh:index.sh
#! /bin/sh
cd `dirname $0`
/usr/local/bin/node index.js $*
```

あとはこれをcronから呼び出します。

```
$ crontab -l
# +------------ 分 (0 - 59)  
# | +---------- 時 (0 - 23)
# | | +-------- 日 (1 - 31)
# | | | +------ 月 (1 - 12)
# | | | | +---- 曜日 (0 - 6) (日曜日=0)
# | | | | |
# * * * * * 実行されるコマンド
40 7 * * 2,5 /home/pi/google-home/index.sh "今日は燃えるゴミの日です"
20 7 * * 3 /home/pi/google-home/index.sh "今日はビニールゴミの日です"
20 7 * * 2,5 /home/pi/google-home/index.sh "今日は缶、ペットボトル、ビンのゴミの日か燃えないゴミの日です"
30 6 * * 1-5 /home/pi/google-home/index.sh "○○さん、起きていますか？ラジオ体操の時間です"
15 7 * * 1-5 /home/pi/google-home/index.sh "○○さん、おいしい朝ご飯は食べ終わりましたか？"
45 7 * * 1-5 /home/pi/google-home/index.sh "○○さん、トイレにはもう行きましたか？"
```

# 落とし穴
* cronのデフォルトのタイムゾーンが世界標準時になっているので東京にする必要がありました。7時に鳴らしたいのに22時に鳴っちゃってた。  
https://qiita.com/munaita_/items/7bf0e786a1a431230691

```:/etc/crontab
CRON_TZ=Asia/Tokyo
```
* [Raspberry Piでcronを使用する際には](http://wizqro.net/raspberry-pi%E3%81%A7cron%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E5%AE%9A%E6%9C%9F%E7%9A%84%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/)postfix入れないと動いてくれないみたい。

```
sudo apt-get install -y postfix
```

# おわりに
我が家の3歳は好感触。「おーけーぐるぐる」とのこと。
我が家の6歳は嫌らしい。「お父さんお母さんに加わって、うるさいこと言ってくるのが増えた」とのこと。
Google-Homeにしゃべらせる言葉選びがむずかしい。
[GAE/Datastore] エンティティのsliceプロパティを条件に検索する

# したいこと
こんな感じのArticleエンティティがデータストアに保存されてて、

```go
type Article struct {
   Title string           `datastore:"Title"`
   Tags  []*datastore.Key `datastore:"Tags"`
}
```

**keyのsliceプロパティ**に対して検索をかけたい！

# 参考
**[公式ドキュメント Datastore Reference 「Types and Property Classes」](https://cloud.google.com/appengine/docs/standard/python/datastore/typesandpropertyclasses#ListProperty)**

# Filterでいける
```go
q := datastore.NewQuery("Article").Filter("Tags =", key)
```

「<font color="ORANGE">**対象slice内に指定した要素が存在すればOK**</font>」という基準で取ってくる。
railsでテーブル作成と同時にインデックスを貼る


表題の通り。

下記のように書く。

https://github.com/colorbox/favoreyo/blob/master/db/migrate/20180221111302_create_tweets.rb

```rb
class CreateTweets < ActiveRecord::Migration[5.1]
  def change
    create_table :tweets do |t|
      t.string :tweet_id

      t.timestamps

      t.index :tweet_id, unique: true
    end
  end
end
```


参考
[activerecord - How to Create a New Table With a Unique Index in an Active Record / Rails 4 Migration - Stack Overflow](https://stackoverflow.com/questions/21635825/how-to-create-a-new-table-with-a-unique-index-in-an-active-record-rails-4-migr)
Android KTXを使ってみた〜systemService編〜

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Java:open jdk 1.8.0_152
* Kotlin 1.2.10
* Android Studio 3.0.2
* CompileSdkVersion:26
* MinSdkVersion:21
* TargetSdkVersion:26
* BuildToolsVersion:26.0.2
* gradle:4.0.0
* Android KTX:0.1

# Android KTXとは
AndroidアプリのKotlinコードを簡潔に快適に記述できるように設計された拡張機能です。
提供元は*Google*です。オフィシャルのライブラリーになります。
※この記事を書いている時点（2018/02/08）では、プレビュー版のため、今後、APIの変更も予想されます。ご注意ください。

# 参考
Android Develpers Blog
https://android-developers.googleblog.com/2018/02/introducing-android-ktx-even-sweeter.html

Github
https://github.com/android/android-ktx/

API reference
https://android.github.io/android-ktx/core-ktx/

# 目標
Android KTXを利用したSystemServiceの取得で、従来の記述方法との違いを確認する。

# 準備
Android KTXを使用するために、下記をbuild.gradleに追記してください。

```groovy:build.gradle（一部省略）
repositories {
    google()
}
dependencies {
    implementation 'androidx.core:core-ktx:0.1'
}
```

## 注意点
Android KTXはcompileSdkVersionが27になっていなければ使用できません。
また、compileSdkVersionを27にする場合、その他のライブラリもバージョンを上げる必要があります。
結果的に以下のような形になります。

```groovy:build.gradle（一部省略）
android {
   compileSdkVersion 27
}
repositories {
    google()
}
dependencies {
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'androidx.core:core-ktx:0.1'
}

```


# 実装
## 今回の例
ノーティフィケーションを表示するときに使用するNotificationManagerを取得する。

## NotificationManagerの取得
NotificationManagerの取得は１行だけなので、一気に確認していきます。
以下のようになります。

```kotlin
// KTXでの書き方
val ktxManager = systemService<NotificationManager>()

// 従来の記述方法
val manager = this.getSystemService(android.app.Service.NOTIFICATION_SERVICE)
                                                                as NotificationManager
```
システムが提供するサービスの型を指定するだけで取得できるのは簡潔に書けていいですね。
台車型倒立振子の非線形運動モデル

台車型倒立振子の運動方程式をNewton-Euler法で導出します．モデルは，川田昌克 編著の「倒立振子で学ぶ制御工学（森北出版株式会社）」を参考にしました．

## Free-Body-Diagramと物理パラメータの定義

下の図が，台車型倒立振子に働く力やトルクを示したものです．また，台車型倒立振子の物理パラメータを表で示しました．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/233384/9dbb4dbb-f975-c229-a18c-bb71b267162d.png)

| 台車の質量 | 振子の質量 | 振子の重心まわりの慣性モーメント | 重力加速度 |
|:---:|:---:|:---:|:---:|
| $m_c \, \rm [kg]$ | $m_p \, \rm [kg]$ | $J_p \, \rm [kg \cdot m^2]$ | $g \, \rm [m/s^2]$ |

| 台車の粘性摩擦係数 | 振子の粘性摩擦係数 | 振子の軸から重心までの長さ |
|:---:|:---:|:---:|
| $\mu_c \, \rm [kg/s]$ | $\mu_p \, [\rm kg \cdot \rm m^2/s]$ | $l_p \, \rm [m]$ |

台車の位置は $y$ 軸から台車の中心までの距離とし，$x_c \, \rm [m]$ と定義します．また，振子の角度は鉛直方向から時計回りを正とし，$\theta \, \rm [rad]$ と定義します．$f_c$ の力で台車を押し，左右に動くと振子には水平方向に$ H \, \rm [N]$，鉛直方向に $V \, \rm [N]$ の力が加わります．同時に作用反作用の法則より，台車にも水平方向に $H \, \rm [N]$，垂直方向に $V \, \rm [N]$の力が加わります．

## 運動方程式の導出

Free-Body-Diagram をもとに運動方程式を導出していきます．まずは台車と振子のそれぞれの運動方程式を記述します．台車の水平方向の運動方程式は，粘性摩擦を考慮して次のようになります．

```math
m_c\ddot{x}_c=f_c-\mu_c\dot{x}_c-H \tag{1}
```

振子の水平方向，鉛直方向の運動方程式はそれぞれ

```math
\left \{
\begin{array}{l}
m_p\ddot{x}_p=H
\\
m_p\ddot{y}_p=V-m_pg
\end{array}
\right. \tag{2}
```

となります．また，重心まわりの回転の運動方程式は，次のようになります．

$$
J_p\ddot{\theta}=-\mu_p\dot{\theta}+Vl_p\sin \theta-Hl_p\cos\theta \tag{3}
$$

これで台車と振子の運動方程式が得られたのですが，振子の座標である $x_p$ と $y_p$ は振子の角度 $\theta$ を用いて書き換えることができます．

```math
\left \{
\begin{array}{l}
x_p=x_c+l_p\sin \theta
\\
y_p=l_p\cos \theta
\end{array}
\right. \tag{4}
```

$x_p, \, y_p$の１階微分と２階微分を計算すると，それぞれ式$(5), \, (6)$になります．

```math
\begin{equation}
\left \{
\begin{array}{l}
\dot{x}_p=\dot{x}_c+l_p\dot{\theta}\cos \theta
\\
\dot{y}_p=-l_p\dot{\theta}\sin \theta
\end{array}
\right.
\end{equation} \tag{5}
```

```math
\begin{equation}
\left \{
\begin{array}{l}
\ddot{x}_p=\ddot{x}_c+l_p(\ddot{\theta}\cos \theta-\dot{\theta}^2 \sin \theta)
\\
\ddot{y}_p=-l_p (\ddot{\theta} \sin \theta+\dot{\theta}^2 \cos \theta)
\end{array}
\right.
\end{equation} \tag{6}
```

式$(2)$に式$(6)$を代入すると，$H, \\, V$は次のように表されます．

```math
\begin{equation}
\left \{
\begin{array}{l}
H=m_p\ddot{x}_c+l_p(\ddot{\theta}\cos \theta-\dot{\theta}^2 \sin \theta)
\\
V=-m_pl_p\ddot{\theta}\sin \theta-m_pl_p\dot{\theta}^2\cos \theta+m_pg
\end{array}
\right.
\end{equation} \tag{7}
```

式 $(7)$ を，台車の水平方向の運動方程式である式 $(1)$ と，振子の重心回りの回転方向の運動方程式である式 $(3)$ に代入して $H, \, V$ を消去して式変形すると，最終的に台車型倒立振子の非線形モデルが得られます．

## 台車型倒立振子の非線形モデル

>```math
\left \{
\begin{array}{l}
(m_c+m_p)\ddot{x}_c+m_pl_p\ddot{\theta}\cos \theta=-\mu_c\dot{x}_c+m_pl_p\dot{\theta}^2\sin \theta+f_c\\ 
\\
m_pl_p\ddot{x}_c\cos \theta+(J_p+m_pl_p^2)\ddot{\theta}=-\mu_p\dot{\theta}+m_pgl_p\sin \theta
\end{array}
\right.
```
Yii 2 + Bootstrap 4 の ActiveForm 周りの修正

Bootstrap 4 になってフォーム周りの .has-error とかがなくなって、かつ .help-block が .invalid-feedback とかになったわけで、Yii 2 の ActvieForm 周りも修正していかないといけないわけで、そのへんの話しを。

## 環境

Yii 2.0.14
Bootstrap 4.0.0

## ActiveForm 周りの修正

何も修正しないと、バリデーションエラー時に以下のような HTML になる:

```html
<div class="form-group field-foo-bar required has-error">
    <label class="control-label" for="foo-bar">Bar</label>
    <input type="text" id="foo-bar" class="form-control" name="Foo[bar]" aria-required="true" aria-invalid="true">
    <div class="help-block">error message...</div>
</div>
```

これは Bootstrap 3 に合わせたもの。Bootstrap 4 では使えない。どうするか？

Yii 2.0.14 で修正が入って、いい感じにできるようになっている。それが以下:

```php
<?php $form = ActiveForm::begin([
    'validationStateOn' => ActiveForm::VALIDATION_STATE_ON_INPUT,
    'errorCssClass' => 'is-invalid',
    'successCssClass' => 'is-valid',
    'fieldConfig' => ['errorOptions' => ['class' => 'invalid-feedback']],
]) ?>
```

Html は以下のようになる:

```html
<div class="form-group field-foo-bar required">
    <label class="control-label" for="foo-bar">URL</label>
    <input type="text" id="foo-bar" class="form-control is-invalid" name="Foo[bar]" aria-required="true" aria-invalid="true">
    <div class="invalid-feedback">error message...</div>
</div>
```

エラーの状態を示す css class をどこに追加するかを [validationStateOn](http://www.yiiframework.com/doc-2.0/yii-widgets-activeform.html#$validationStateOn-detail) プロパティで指定できる。これでフォームのボーダーとエラーメッセージが赤色になる。ちなみにラベルは赤くならなくなるけど、まぁいいでしょう...。

他のフォームでも使えるように設定ファイルに値を書いておこう:

```config/web.php
$config = [
    // ...
    'container' => [
        'definitions' => [
            // ...
            yii\widgets\ActiveForm::class => [
                'validationStateOn' => yii\widgets\ActiveForm::VALIDATION_STATE_ON_INPUT,
                'errorCssClass' => 'is-invalid',
                'successCssClass' => 'is-valid',
            ],
            yii\widgets\ActiveField::class => [
                'errorOptions' => ['class' => 'invalid-feedback'],
            ],
        ],
    ],
];
```

## リンク
- [Bootstrap 4 - Form Validation](https://getbootstrap.com/docs/4.0/components/forms/#validation)
- [yii\widgets\ActiveForm](http://www.yiiframework.com/doc-2.0/yii-widgets-activeform.html)
- [yii\widgets\ActiveField](http://www.yiiframework.com/doc-2.0/yii-widgets-activefield.html)
dictionary に対して filter()

こんにちは。
dictionary に対して ```filter()``` を行う関数を作りました[^1]。

[^1]: 標準ではずばりこのような関数は用意されていないようです。

```python
>> def filter_dict(f, d):
>>     return {k:v for k,v in d.items() if f(k,v)}
>> 
>> d = {1:2, 3:4}
>> filter_dict(lambda k,v: v==2, d)
{1: 2}
```

他にも各種の方法があるようです（下記例[^2]）。

```python
>> {k:v for k,v in d.items() if v==2}
{1: 2}
>> dict([(k,v) for k,v in d.items() if v==2])
{1: 2}
>> dict(filter(lambda kv: kv[1]==2, d.items()))
{1: 2}
>> {k:v for k,v in filter(lambda kv: kv[1]==2, d.items())}
{1: 2}
```

[^2]: コメントを頂いたものも追加しました。
Google 画像検索から画像を直接開くUserScript

（2018/02/22追記）
もうあった
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1107173.html

----
# 前書き
気が付いたら、Google 画像検索の検索結果から、「画像を開く」ボタンがなくなっていた。
あと久々に手を動かしたくなったので、UserScript を作ってみた。

# 導入
インストールは、[ここ](https://raw.githubusercontent.com/horihiro/showImage/master/dist/showImage.min.user.js)から。

動作確認は、Windows10 / Firefox 58.0.2 / Greasemonkey 4.2 でのみ。

# 使い方
検索結果の画像をクリックすると出てくる、黒いバルーン？の左の大きい画像をクリックする。
すると、別ウィンドウでクリックした画像が開く。

<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/0d57489e-44ed-7ad5-5d1c-c43a754dfcb0.png" width="500px">


それだけ。
Open MPI > サンプルプログラムのコンパイル > 成功 x2 + 失敗 x1 

```txt:動作環境
CentOS 6.8 (64bit)
on VMWare workstation
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
```

### 関連
[openmpi > ./configure ... > "/lib/cpp" fails sanity check > g++コマンドがない](https://qiita.com/7of9/items/aa8a7a56c106a5b6db99)

## OpenMPIの動作確認

### 成功

OpenMPIをインストールした環境でMPIのコードを実行しようとした。

https://github.com/open-mpi/ompi/blob/master/examples/ring_c.c
は実行できた。

```bash
$ mpic++ ring_c.c 
$ ./a.out 
Process 0 sending 10 to 0, tag 201 (1 processes in ring)
Process 0 sent to 0
Process 0 decremented value: 9
Process 0 decremented value: 8
Process 0 decremented value: 7
Process 0 decremented value: 6
Process 0 decremented value: 5
Process 0 decremented value: 4
Process 0 decremented value: 3
Process 0 decremented value: 2
Process 0 decremented value: 1
Process 0 decremented value: 0
Process 0 exiting
```

### 失敗1 > 成功

[OpenMPIのCentOSへのインストールから実行まで](https://qiita.com/chojuku/items/f800cfc98811e2d0bda6)
のhello.cppはコンパイルの段階で以下のようになった。

```bash
$ mpic++ hello.cpp 
hello.cpp: In function ‘int main(int, char**)’:
hello.cpp:10:34: error: ‘rank’ was not declared in this scope
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
                                  ^
hello.cpp:11:34: error: ‘size’ was not declared in this scope
   MPI_Comm_size(MPI_COMM_WORLD, &size);
                                  ^
```

(追記 2018/02/22)
記事元に修正が入りました。
修正後のコードはビルドおよび実行できました。

```bash
$ mpic++ hello.cpp
$ ./a.out 
rank = 0
size = 1
```

### 失敗2

[MPIの環境構築や基本コマンドのまとめ](https://qiita.com/kkk627/items/49c9c35301465f6780fa)
のsample.cは以下のようになった。

```bash
$ mpic++ sample.c 
sample.c: In function ‘int main(int, char**)’:
sample.c:12:44: error: cannot convert ‘char**’ to ‘char*’ for argument ‘1’ to ‘int MPI_Get_processor_name(char*, int*)’
   MPI_Get_processor_name(name, &name_length);   // ホスト名の取得　
                                            ^
```

### 備考

とりあえずring_c.c は実行できる状態なので、作業を進める。

2年前にセットアップした時は何でチェックをしたかは記載漏れしている。

- [WRF > CentOS6.8 > WRF3.6.1 setup: 失敗 / WRF3.7.1 setup: 成功 (-O2にすること) / WPS3.7.1 setup: 成功](https://qiita.com/7of9/items/8ff328ed1c144d659335)
STM32duino 環境のトラブルシューティング

# Mac

## libusbが無いエラー

```

brew install libusb
```
## Invalid DFU suffix signature
?? 未解決

# linux

## dfu-util: No DFU capable USB device available

install.shを実行する

## "Please select a Port before Upload"エラー

Linux以外でも発生するかもしれないエラー。

preferences.txtの以下の項目が空白になっているために起こる。

```

serial.port=
```
STM32をST-Linkなどで書く場合、シリアルポートを使わないので本来はここが空白でも良いように思えるが、実際にはエラーが起こる。
過去に一度でもノーマルのArduinoなどで設定すれば、この項目は埋まるのでエラーが起こらなくなるが、STM32duinoではじめてArduinoを使うときなどはここでひっかかる場合がある。
適当にシリアルポートが付属しているArduinoなり何なりをUSBポートに接続し、一旦使用シリアルポートをArduino開発環境に覚え込ませればいいのだが、そういったシリアルポートを持ったデバイスがない場合、preferences.txtを直接編集して、

```

serial.port=/dev/ttyACM0
```
などとすれば良い。

## No DFU capable USB device available

```

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Waiting for /dev/ttyACM0 serial...dfu-util: Cannot open DFU device 1eaf:0003
dfu-util: No DFU capable USB device available
Done
```
となった場合。

## libusb-1.0.so.0 が無いエラー

```

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libusb-1.0.0:i386

```

## (Permission denied) opening ST-Link/V2 device 001:012 などと出る

hardware/Arduino_STM32-master/tools/linux64のinstall.shを実行し、ST-Linkを挿し直す


# Windows

## unsupported major.minor version "arduino"

Javaのバージョンの競合。

## カスペルスキーやNortonがUSBデバイスをブロックする場合がある

badusbのサンプルプログラムが動作しないだけではなく、bootloaderからの書き込みについても障害？　（検証中）
gradle の mybatis-generator-plugin で、MapperAnnotationPlugin が無いって言われる

gradle の mybatis-generator-plugin 使ったとき、mybatis の generatorConfig.xml に plugins 定義に

```xml
<plugin type="org.mybatis.generator.plugins.MapperAnnotationPlugin" />
```

を書いても見つからないってエラーになるときは

dependencies で mybatis-generator-core の version 上書く

```gradle:build.gradle
dependencies {
 ...
 mybatisGenerator group: 'org.mybatis.generator', name: 'mybatis-generator-core', version: '1.3.6'
}

```

以上です

また、ほかのも上書ける

```gradle:build.gradle
dependencies {
 ...
 mybatisGenerator group: 'mysql', name: 'mysql-connector-java', version: '5.1.45'
 mybatisGenerator group: 'tk.mybatis', name: 'mapper', version: '3.4.2'
｝
```
cronの権限周りで躓いたので覚え書き

**crontabはユーザーごとに設定されている。**
**crontabで実行したコマンドはcrontabの権限で実行されている。**

## ユーザー別に設定したcrontabがまとめられているディレクトリ
各ユーザーから`crontab -e`で設定したcronは以下のディレクトリにある各ユーザー名のファイルで確認することが出来る。
`/var/spool/cron/`
現状ログインしているユーザーのcrontabの設定の確認だけであれば
`crontab -l`で確認出来る。

## ユーザー別の実行ログがまとめられているディレクトリ
`/var/spool/mail/`

## まとめ
cronが動かない場合は、cronが何を実行しようとして、そのcrontabの所有者権限は誰なのか確認した方が良い。
その他crondが起動しているか、ファイルはフルパスで指定されているか、も確認したほうが良い。

* [クーロン(cron)をさわってみるお](https://qiita.com/katsukii/items/d5f90a6e4592d1414f99)
*  [cronの設定方法](https://qiita.com/hikouki/items/e744b3a4d356d2af12cf)
Open MPI > ./configure ... > "/lib/cpp" fails sanity check > g++コマンドがない

```txt:動作環境
CentOS 6.8 (64bit)
on VMWare workstation
```

Xeon上のWRF3.9環境と同じものをVMWare上で構築中。

https://qiita.com/7of9/items/0dd38bfe6c9ed15622ac
のOpen MPIのconfigureでエラーが出た。

```bash
$ ./configure --prefix=/usr/local/openmpi-2.1.1_gcc492 CC=gcc CXX=g++
...
configure: error: in `/home/yasokada/INSTALL_OPENMPI_211/openmpi-2.1.1':
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
```

参考: https://askubuntu.com/questions/509663/c-preprocessor-lib-cpp-fails-sanity-check

g++のインストールを忘れていた。

```bash
$ g++
bash: g++: command not found
```

devtoolset-3でv4.9.2を使うので、以下の方法でインストールをする必要がある。

```bash
$sudo yum install devtoolset-3-gcc-c++
```

セットアップメモに記載を忘れていた。
AWSの初歩の初歩をまとめました(操作方法から料金まで)

## ことの始まり
業務でAWSを使うことになり、勉強をはじめました。
インフラ・サーバー系の知識はやんわり知っている程度です。
ある程度体系的にまとめられている書籍を参考にして勉強しています。


## AWSを操作する手段
- ブラウザ(マネジメントコンソール)
- SDK
- 各種OSコマンドライン

### リージョン
- AWSがサービスを提供している拠点のことを指す
- 複数のリージョンを利用したシステム構成をマルチリージョンと言う
- リージョン選択は、AWS上で稼働するシステムを利用するユーザーに近いリージョンを選ぶ
- 遠いリージョンだとレスポンスが遅くなる
- だから普通にやる分は東京リージョンで良い

### アベイラビリティゾーン(AZ)
- データーセンターの概念に近い
- 一つのAZが複数のデーターセンターで構成させている
- 各リージョンにAZが存在している
- 複数のAZを利用したシステム構成をマルチAZ構成と言う
- 可用性や耐障害性からマルチAZが推されている

### VPN
- Virtual  Private Network
- 仮想的な専用回線サービス

### VPC
- Virtual Private Cloud
- AWS上にプライベートなネットワーク空間を構築するサービス
- VPSを利用すると、論理的なネットワーク分離が可能
- ルートテーブルや各種ゲートウェイの追加設定も可能

### Direct Connect
- データセンタやオフィスのネットワークと、AWS間を専用線で接続するサービス
- VPNより高速で安定した通信環境が必要な場合に利用する
- 例えば、WEBサーバーはAWSでDBはオンプレミスといったハイブリット構成の場合、サーバー間の通信には高速かつ安定したネットワークが必要になる

## AWSアカウントの考え方
- 一つのAWSアカウントの中に複数の環境を作って管理するのか
- 複数のAWSアカウントを作成し環境を完全に分離するのか
- この方針決めがAWSをどのように管理するのかの分岐点

### 単一アカウント
- 単純だから初心者には良い
- しかし、実際の運用現場では、開発環境のみ利用可能で本番環境を操作する権限がないユーザーが管理が必要になる
- 後述のIAMを使う手もあるが、サーバー単位の操作権限まで制御するのは手間がかかる
- 不可能ではないが、リソース単位での権限付与が必要

### IAM
- Identity and Access Management
- 権限の制御を行うユーザー管理機能

### 複数アカウント
- メリットは環境単位でアカウントを分離できる
- 例えば、開発用と本番用のアカウントを分離することにより、ユーザーを分離できる
- 一方で分離することでアカウント管理や環境構築に負荷がかからないか？と言う疑問に対しては
- 手動だと確かにそうだが、AWSには環境構築を自動化する機能やツールを提供している
- 僕が読んだ書籍では、複数アカウントを推している

## AWSの監査証跡
- 監査証跡とは、処理のプロセスとかを時系列に沿って保存された記録のこと
- システム監査人がそれを追跡する
- AWSにおける監査証跡の対象は大きく分けて二つ

#### AWS自体の操作状態・履歴
・AWS ConfigとAWS CloudTrailっていうサービス
・この二つのサービスでほぼ全てのAWSのサービスの監査証跡を取得できる

#### AWS内のリソース
- インスタンスとかDBインスタンスとかが対象
- オンプレミスと同じやり方で取得

## AWSの料金
- 時間ベース
- 回数ベース
- 容量ベース
- このうち3つか、組み合わせの重量課金
- Simple Monthly Calculatorっていう簡易見積もりツール

##　参考
Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)
2018/01/20発刊
Azure Text AnalyticsをPythonから使ってみた

AzureのCognitive ServicesのText Analytics APIでは文章からセンチメント（感情のネガポジ度的なもの）、キーフレーズ、言語の種類を検出できます。

SDK提供されていて各種言語から利用することができます。
今回はPythonから呼び出して使っています。

# 前提条件

- Azureアカウントの作成
- [Cognitive Services 試用エクスペリエンス | Microsoft Azure](https://azure.microsoft.com/ja-jp/try/cognitive-services/?api=text-analytics) からサブスクリプションキーを取得

# スクリプト

[Python Quickstart for Azure Cognitive Services, Text Analytics API | Microsoft Docs](https://docs.microsoft.com/en-us/azure/cognitive-services/Text-Analytics/QuickStarts/Python) を参考にやってみました。

センチメント分析の場合は以下のようなコードになります。

```python

import requests
from pprint import pprint

# サブスクリプションキーとAPIのURLを指定
subscription_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
text_analytics_url = "https://westcentralus.api.cognitive.microsoft.com/text/analytics/v2.0/sentiment"

documents = {'documents' : [
  {'id': '1', 'language': 'en', 'text': 'I had a wonderful experience! The rooms were wonderful and the staff was helpful.'},
  {'id': '2', 'language': 'es', 'text': '¡Tuve una experiencia maravillosa! Las habitaciones eran maravillosas y el personal fue servicial.'},  
  {'id': '3', 'language': 'zh-Hans', 'text': '我有一个美好的经历！房间很棒，工作人员很有帮助。.'},  
  {'id': '4', 'language': 'ja', 'text': '私はすばらしい経験をしました！部屋は素晴らしかったしスタッフも助かりました。'}
]}

headers   = {"Ocp-Apim-Subscription-Key": subscription_key}
response  = requests.post(text_analytics_url, headers=headers, json=documents)
sentiments = response.json()
pprint(sentiments)

```

こんな結果が返ってきます。英語、スペイン語、中国語、日本語でそれぞれセンチメント値がscoreとして帰ってきています。

```json
{'documents': [{'id': '1', 'score': 0.9552919864654541},
               {'id': '2', 'score': 0.6087863445281982},
               {'id': '3', 'score': 0.7710065841674805},
               {'id': '4', 'score': 0.43333786725997925}],
 'errors': []}
```

# 感想

日本語でいろんな文章で試してみましたが現時点(2018年2月)では想定しているネガ/ポジ値がなかなか出ません。Google翻訳とかで日本語から英語に翻訳してから、Text Analytics APIにかけるとかやればそれなりの結果が出そうです。
Jupyter-PHPって何? HackerrankにPHPで挑戦したい人必見!! Windows10にインストールしてみた!!

## はじめに
インターン先でプログラミングを勉強している文系学生。

「HackerrankやるならJupyter-PHPをインストールしようよ!!」

え、何それ?

##Jupyterインストール
とりあえずインストールすっか!!
社員さん曰く、jupyterをインストールする必要がありそう?

PCはwindows10 64bit
「jupyter windows　インストール」で検索検索ゥ!!

お、良さそうなサイト発見。
[Windowsに「Jupyter Notebook」をインストールして手軽にPythonを使い始める方法](http://did2memo.net/2017/07/09/python-anaconda-jupyter-notebook-windows/)

何々、Anacondaをインストールした方が楽と?
じゃあ、Anacondaのページにジャーンプ!!

[Anacondaインストールページ](https://www.anaconda.com/download/)
![スクリーンショット (2).png](https://qiita-image-store.s3.amazonaws.com/0/218398/4bc6e14f-7454-ee25-4420-004fac57e795.png)

インストールが終わったら、[サイト](http://did2memo.net/2017/07/09/python-anaconda-jupyter-notebook-windows/)の指示通りに進めて…


![スクリーンショット (3).png](https://qiita-image-store.s3.amazonaws.com/0/218398/8faac1fa-e088-5af4-2f2c-9901a5637929.png)


キタコレ!!

Ctrl+Enterで実行してくれるんだ。
これは便利!!

##Jupyter-PHPのインストール
「インストール終わりました!!」
「いや、Jupyterだけやん。Jupyter-PHPもインストールせんと」
(あと何が必要なの…?)

まぁ、とりあえず検索。

参考になりそうな神サイト発見!!
[Jupyterでphpを使えるようにする in Windows 10](http://theartofzero.php.xdomain.jp/jupyter%E3%81%A7php%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B-in-windows-10-1461/)

ありがてぇありがてぇ…

7つの手順で進めるみたいだけど、Jupyterはもうすでにインストールしてるから残るは6つ!!
1つずつやっていこう!!

### 1.php環境の構築
 XAMPPでphp環境を設定するみたいだけど、既に設定済み。
 一応バージョンだけ確認しておくか。
>Window PowerShell
>>C:\Users\ユーザー名>php -v
>>PHP 7.2.0'


7を超えてれば大丈夫でしょ。

### 2.composerのインストール
プロジェクト管理ツールみたい。
[Composer ドキュメント日本語訳](https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/00-intro.html)でダウンロードすればいいみたい。
インストーラ使えば、PATHも設定してくれるのか。
便利―。

### 3.PsySHのインストール
JupyterでPHPを使うためには、PsySHとやらが必要なのか。
composerのインストーラーでインストールしたら、次のコマンドをWindows PowerShellに打てば良いのか。
>$ composer g reruire psy/psysh:@stable

お、処理が始まった
>$ psysh

これを打ったら、「何か入力してくれ」みたいな`>>>`が出てきたけど何だろう?
既にあるってことかな?
とりあえず'exit'。

### 4.PHP-ZMQ extensionをインストール
[zmq 1.1.3](http://pecl.php.net/package/zmq/1.1.3/windows)に行って、`7.2 Thread Safe(TS)x86`をインストールすればいいのか。

`libzmq.dll`はあったけど、`libsodium.dll`がない…。
まぁ、ないならどうしようもないか。
`libzmq.dll`だけ`C:\xampp\php`に入れておこう。

`php_zmq.dll`を`C:\xampp\ext`に…
って、`C:\xampp\ext`がないし。
`C:\xampp\php\ext`の中に入れておこう。

次は、php.iniファイルの編集ね

`C:\xampp\php`のphp.iniを開いて、
>extension=php_zmq.dll

これを書く。

### 5.jupyter-php-installerのインストール
お、ついにここまで来たか。
[jupyter-php-installer](https://litipk.github.io/Jupyter-PHP-Installer/)で、`Download PHAR installer]`からダウンロードね。
`C:\ユーザー\ユーザー名`に置いておこう。

Windows PowerShellで、
>php ./jupyter-php-installer.phar install

打つこと数分…
>The Jupyter-PHP kernel has been successfully installed

お!!　良いねぇ良いねぇ!!

>C:\ユーザー\ユーザー名> cd .jupyter-php

を打ってみると、ちゃんと移動できた!!

次は、Jypyter NotebookでPHPがあるのかを確認するのね。
![スクリーンショット (4).png](https://qiita-image-store.s3.amazonaws.com/0/218398/999d419d-928b-1504-9f1e-479cb53c047c.png)
できてるできてる!!

さてさて、ちゃんと動くかなー?
![スクリーンショット (5).png](https://qiita-image-store.s3.amazonaws.com/0/218398/cd796cb6-5627-f50c-adcd-ab39c0ac5f56.png)
完璧ですね!!


### 6.Jupyter-PHPカーネルのインストール
これなくても動くよね?
というか、インストールしてみたら、カーネルが動いてなかったから、やらないほうが良いかも。


## まとめ
「お、良いじゃない!! よく頑張ったね」
やったー!!

今回は、PHPでHackerrankに挑戦しやすくなるJupyter-PHPをインストールしました!!

これからどんどんチャレンジしていくぞ!!
IBDesignableがウザい

機能自体は良いが色々とウザい。
簡単なViewを作るのに2、3時間費やしてしまったのでメモをアップする。

* InterfaceBuilder(以降IB)表示時にビルドがかかり非常に重くなる
* 普通のViewでは不要な考慮が色々必要
* IB上でエラーが起きても原因が分かりづらい
* IB上でエラーが起きるとXcodeがおかしくなることがある

# IBを開くびにビルドがかかる

IBDesignableを修正してIBを開くとビルドがかかる。
IB上でフォントサイズを変えるだけでビルドがかかる。

メニューの “Editor” > “Automatically Refresh Views” のチェックを外すと自動でビルドがかからなくなる。
IB上で手動でViewをリフレッシュしたい場合、メニューの “Editor” > “Refresh All Views” を実行。

# 画像リソースを使えない
`#imageLiteral` で画像を参照するとIB上でクラッシュする。
`UIImage(named: "xxxxx”)` の形でUIImageを作ってもIB上では画像が表示されない。

IBDesignableでプログラムから画像を指定する場合、Bundleを動的に作って指定してやる必要がある。

```Swift
let bundle = Bundle(for: type(of: self))
let image = UIImage(named: "pulldown_arrow", in: bundle, compatibleWith: nil)
```

# エラーの原因が分かりづらい

エラーが出た場合、とりあえずIB上で問題のViewを選択して、メニューの “Editor” > “Debug Selected Views” を実行。
すると問題のViewがデバッガー付きで実行されるので、エラー箇所で停止してエラーの原因を確認することができる。

# init で色などを設定してもIB上に反映されない

`init` でbackgroundColorなどを設定しても、initが実行された後にIBで設定された色に上書きされてしまいIB上では反映されない。（通常起動なら反映される）

```Swift:ダメな例
class RedView: UIView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    
    func setup() {
        backgroundColor = UIColor.red
    }
}
```

これを回避するには IB の設定が終わった後に、色などの設定を行う必要がある。
IBの設定時に `prepareForInterfaceBuilder` が呼ばれるので、これをoverrideして対応することができる。

```Swift:いける例
class RedView: UIView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setup()
    }
    
    func setup() {
        backgroundColor = UIColor.red
    }
}
```
ただし、`prepareForInterfaceBuilder` は通常の実行時は呼ばれないので、`init` でも同じ設定をする必要がある。
JavaScriptでメソッドのnullチェック

外部ライブラリを使うときとか、メソッドがあるかないかわからない時にかます

```javascript
    //NG
    if(fuga){
        //ReferenceError: fuga is not defined
    }
    
    //OK
    if(typeof fuga !== 'undefined'){
        //メソッドがあればtrue       
    }
```

Twitterで教えてくれた人ありがとうございます
【Swift4】AutoLayoutのStackViewを使ってボタンを等間隔に並べる

## 実行環境
【Xcode】Version 9.2
【Swift】Version 4.0.3

## 概要
`storyboard`の`StackView`を使って、ボタンなどのアイテムを均等に並べる方法。

## 方法
アイテムを適当に並べます。
<img width="389" alt="a.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/2a3534c9-8e7f-f589-4ea5-b3efae2ea177.png">

並べたアイテムを全て選んで、AutoLayoutツールバーにある`StackView`を選択します。
<img width="446" alt="b.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/342f3b37-f4af-15f9-76b2-b7a766026af5.png">

`StackView`を選択すると、こんな感じにくっつきますが気にしない。
<img width="391" alt="c.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/f75a6bf3-90e2-028e-fafe-fc3cdccf5b17.png">

その状態で、ユーティリティエリアにある`Distribution`から`Fill Equelly` を選びます。
<img width="324" alt="d.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/f5a82417-db4f-e91c-cfbd-9843e8079612.png">

あとは`StackView`に対していい感じに制約をかけてあげれば完成！
（今回は上下左右中央と両端からの距離を0にしています）
<img width="309" alt="e.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/e814986a-f8df-affd-7ebd-211301d68c74.png">

## 完成形
<img width="1291" alt="f.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/70eaba75-6a37-a74f-5fc8-86b97df5957e.png">
VScodeでLinter pylint is not installedとなる。

VScodeインストールしました。

Running VS Code on Linux
https://code.visualstudio.com/docs/setup/linux

インストール後、
Ctrl+shift+xでPythonの拡張機能をインストール。

`Linter pylint is not installed`

というのが出ましたが、インストールしてあげればいいみたいです。

いざインストール。

No installers available to install pylint.

むむ・・・、pylintをいれるためにはpipが入ってないとインストールできないようです。
コンソールでpipを入れてあげましょう・・・。

`sudo apt install python3-pip`
Swiftでマウスとキーボードのイベント制御

https://qiita.com/uasi/items/546600ca60c1b131012c
https://qiita.com/asus4/items/a2517aed8dc7e4773c34
http://sonson.jp/blog/2006/04/04/macosx/
キーボードとマウス制御について色々を参考になりましたが、コードはObjective-Cばかりなので、今回はswiftの書き方についてまとめます。

#キーを押す

```swift
//キーダウン
func keyboardKeyDown(key: CGKeyCode) {

        let source = CGEventSource(stateID: CGEventSourceStateID.hidSystemState)
        let event = CGEvent(keyboardEventSource: source, virtualKey: key, keyDown: true) 
        event?.post(tap: CGEventTapLocation.cghidEventTap)
        print("key \(key) is down")
    }

//キーアップ 
func keyboardKeyUp(key: CGKeyCode) {
        let source = CGEventSource(stateID: CGEventSourceStateID.hidSystemState)
        let event = CGEvent(keyboardEventSource: source, virtualKey: key, keyDown: false)
        event?.post(tap: CGEventTapLocation.cghidEventTap)
        print("key \(key) is released")
    }
```
定義したらこんな風にすぐに使えます。

```swift
keyboardKeyDown(key: 0x60) //0x60はF5キーのコード
keyboardKeyUp(key: 0x60)
```
ちなみにmacの英字鍵盤のCGkeyCodeはこちら：
[macos - Where can I find a list of Mac virtual key codes? - Stack Overflow](https://stackoverflow.com/questions/3202629/where-can-i-find-a-list-of-mac-virtual-key-codes/16125341)

##コマンドなどを入れる場合は

```swift
let cmd_c_D = CGEventCreateKeyboardEvent(nil, 0x08, true); //0x08はCキー command+cを押す
CGEventSetFlags(cmd_c_D, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, cmd-c-D);

let cmd_c_U = CGEventCreateKeyboardEvent(nil, 0x08, false); // command+cを離す
CGEventSetFlags(cmd_c_U, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, cmd_c_U);
```

#マウスのクリック制御

```swift
//左のクリックダウン
guard let mouseDown = CGEvent(mouseEventSource: nil,
                        mouseType: .leftMouseDown,
                        mouseCursorPosition: CGPoint(x: 200, y: 300),
                        mouseButton: .left
                        ) else {return}
mouseDown?.post(tap: .cghidEventTap)

//左のクリックアップ
guard let mouseUp = CGEvent(mouseEventSource: nil,
                      mouseType: .leftMouseUp,
                      mouseCursorPosition: CGPoint(x: 200, y: 300),
                      mouseButton: .left
                      ) else {return}
mouseUp?.post(tap: .cghidEventTap)
```

#マウスの移動

```swift
func moveMouse(_ dx:CGFloat , _ dy:CGFloat){
  //つい先のマウスの位置を獲得
  var mouseLoc = NSEvent.mouseLocation  
  mouseLoc.y = NSHeight(NSScreen.screens[0].frame) - mouseLoc.y;
  //新しい位置の計算
  let newLoc = CGPoint(x: mouseLoc.x-CGFloat(dx), y: mouseLoc.y+CGFloat(dy)) 
  print("moving \(dx) \(dy)")
  //カーソルの移動
  CGDisplayMoveCursorToPoint(0, newLoc) 
    }
```
Kubernetes & GKE チートシート

# Kubernetes

## kubectl の操作対象を確認する

```
kubectl config current-context
```

## 設定ファイルを登録または更新する

```
# 設定ファイルを指定して登録する
kubectl create -f ${YAML_FILE}

# 設定ファイルを更新する
kubectl replace -f ${YMLA_FILE}

# ディレクトリ単位でまとめて登録更新する
kubectl apply -f ${DIR_OR_FILE}
```

## pod を表示する

```
# 一覧を表示する
kubectl get pods [--all-namespaces]

# 詳細を表示する
kubectl describe pod ${POD_NAME} [-n ${NAMESPACE}]
```

## pod にログインする

```
kubectl exec -it ${POD_NAME} sh
```

## ログを確認する

```
# 起動中のログを表示
kubectl logs ${POD_NAME}

# tail -f のようにストリームで表示
kubectl logs -f ${POD_NAME}

# 前回起動時のログを表示
kubectl logs -p ${POD_NAME}
```

## なんらかのイベントが発生しているか確認する

```
kubectl describe pod,statefulset,daemonset,deployment,node --all-namespaces | grep Events:
```

* `Events: <none>` 以外が表示されたら grep をやめて確認する。



# GKE

## CLI でログインする

```
gcloud auth application-default login
```

## GKE の基本情報を取得する

```
# プロジェクトの一覧
gcloud projects list

# クラスタの一覧
gcloud container clusters list
```

## GKE クラスタを kubectl の操作対象にする

```
# プロジェクトを切り替える
gcloud config set project ${PROJECT_ID}

# kubectl の操作対象を GKE に切り替える
gcloud container clusters get-credentials [-z ${ZONE}] ${CLUSTER_NAME}
```

## GKE クラスタのダッシュボードを表示する

* `kubectl proxy` で GKE クラスタに接続する
* `http://localhost:8001/ui` にアクセスしてダッシュボードの表示

## Google Container Registry に docker イメージをアップロードする

```
# イメージの作成
docker build -t gcr.io/${PROJECT_NAME}/${IMAGE_NAME}:${TAG}

# 既存イメージへ GCR 用のタグをつける
docker tag ${IMAGE_ID} gcr.io/${PROJECT_NAME}/${IMAGE_NAME}:${TAG}

# イメージをアップロードする
gcloud docker -- push gcr.io/${PROJECT_NAME}/${IMAGE_NAME}:${TAG}
```

* `gcr.io` の部分はアップロード先のホスト名で変更可能。詳細は[公式ドキュメント](https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=ja)を参照。

## 静的外部IPアドレスを使って外部にサービスを提供する

```
# 静的外部IPアドレスを作成する
gcloud compute addresses create ${STATIC_IP_ADDR_NAME} --global

# 作成した静的外部IPアドレスの実際のIPアドレスを確認する
gcloud compute addresses describe ${STATIC_IP_ADDR_NAME} --global
```

* [公式ドキュメント](https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip#step_2b_using_an_ingress)に従って Ingress を設定して作成した静的外部IPアドレスでサービスを提供する。

## 内部ロードバランサーを提供する

* [公式ドキュメント](https://cloud.google.com/kubernetes-engine/docs/internal-load-balancing?hl=ja)に従って設定した Service を公開する。
* これだけでサービス名ベースで負荷分散をしてくれる内部ロードバランサーが起動する。








# Minikube

## Minikube を起動する

```
minikube start
```

## Minikube クラスタを kubectl の操作対象にする

```
kubectl config use-context minikube
```

## docker コマンドで Minikube 環境を利用する

```
eval $(minikube docker-env)
```

## ホストから Minikube に接続する

* Service で spec.type が NodePort のものはポートが解放され、ホストから接続できる。
* `minikube service`
Java8ストリーム、ラムダ式まとめ

### Java8ストリーム、ラムダ式まとめ

#### 次の現場がJava8なので、復習もかねてよく使用したコード例を中心にまとめる。

参考
http://www.ne.jp/asahi/hishidama/home/tech/java/stream.html

1. 基本
    1. List.forEach

        ```
        List<Integer> list = Arrays.asList(1,2,3);
        list.forEach(System.out :: println);
        ```

        これは以下と同じ

        ```
        List<Integer> list = Arrays.asList(1,2,3);
        for(int i: list){
        	System.out.println(i);
        }
        ```

    1. Map.forEach

        ```
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"a");
        map.put(2,"b");
        map.forEach((k,v) -> System.out.println(v));
        ```

        これは以下と同じ

        ```
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"a");
        map.put(2,"b");
        for(Entry<Integer, String> entry : map.entrySet()) {
          System.out.println(entry.getValue());
        }
        ```

1. 頻出
    1. Stream.collect(Collectors.toMap()) ListからMap作成

        ```
        class Employee {
          private int id;
          private String name;

          public Employee(int id,String name){
            this.id = id;
            this.name = name;
          }

          public int getId() {
            return this.id;
          }

          public String getName() {
            return this.name;
          }
        }

        List<Employee> list = Arrays.asList(new Employee(1,"佐藤"),new Employee(2,"大木"),new Employee(3,"田中"));
        Map<Integer,String> map = lists.stream().collect(Collectors.toMap(Employee::getId,Employee::getName));
        ```

    1. Stream.map() List内で処理を行う

        ```
        List<Integer> list = Arrays.asList(1,2,3);
        List<Integer> list2 = list.stream().map(i -> i * 2).collect(Collectors.toList());
        ```

    1. Stream.filter() 絞込み

        ```
        List<Integer> list = Arrays.asList(1,2,3);
        list.stream().filter(i -> i < 3).forEach(System.out :: println);
        ```

    1. Stream.sorted ソート

        ```
        List<Integer> list = Arrays.asList(1,3,2);
        list.stream().sorted(Comparator.comparing(i -> i)).forEach(System.out :: println);
        ```

1. まあまあ使う
    1. Stream.of() ストリーム作成

        ```
        Stream<Integer> stream = Stream.of(1,2,3);
        ```

    1. Stream.anyMatch() 一致するデータがあるかチェック

        ```
        List<Integer> list = Arrays.asList(1,2,3);
        boolean m = list.stream().anyMatch(i -> i == 2);
        ```

        上記に似たものとして、(全ての値が一致)allMatch、(全ての値が一致しない)noneMatchがある。

    1. List.stream().flatMap(l -> l.stream()) List内Listを一つにまとめる

        ```
        List<List<Integer>> list = Arrays.asList(Arrays.asList(1,2,3),Arrays.asList(4,5,6));
        List<Integer> list2 = list.stream().flatMap(l -> l.stream()).collect(Collectors.toList());
        ```
スペース区切りの文字列をsplitして整数の配列にしたい

問題を解いていて調べたのでメモ

```
"1 2 3 4 5".split(" ").map(&:to_i)
=> [1, 2, 3, 4, 5]
```
理解が正しければ下と同じこと

```
"1 2 3 4 5".split(" ").map { |num|
  num.to_i
}
```
Zendesk APIでUsersを簡単に取得する方法

# はじめに
業務でZendeskを利用しているのですが、トラブルシューティングの際にコマンド一つで知りたくなるものです。WebにアクセスせずにAPIでユーザー情報を取得する方法です。

# Zendesk API Searchを使う

こちらの[Core API #Search](https://developer.zendesk.com/rest_api/docs/core/search
) を使います。

```
.../api/v2/search.json?query={search_string}
```
```{search_string}```には、ユーザーID、名前、作成日などを指定できます。[Search Reference](https://support.zendesk.com/hc/en-us/articles/203663226)で詳しい記法が載っていました。

# 事前準備
Zendeskの管理画面に行き、APIトークンを取得します。
Zendesk公式のドキュメント>> [APIトークンを作成して管理する](https://support.zendesk.com/hc/ja/articles/115002555167#creating_and_managing_api_tokens)

画面はこちら
<img width="1095" alt="スクリーンショット 2018-02-21 08.39.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/100494/fa2a9f0f-aad1-7cff-50cc-5a7302f3df24.png">


# サンプル リクエスト

```shell
curl "https://{subdomain}.zendesk.com/api/v2/search.json" \
-G --data-urlencode "query=type:user {search username}" \
-v -u {email_address}/token:{api_token}
```

- ユーザー情報を取得するので、type:user
- {search username}には、検索したい名前を入れよう  例. テスト太郎
- {email_address}には、Zendeskのエージェントであるメールアドレス
- {api_token}には、前述のAPIトークン

# サンプル レスポンス
取得できたEmail、ユーザーIDは適当に書き換えましたが、このようなJSON形式の文字列で取得できます。

```json
{
    "count": 1, 
    "facets": null, 
    "next_page": null, 
    "previous_page": null, 
    "results": [
        {
            "active": true, 
            "alias": "", 
            "chat_only": false, 
            "created_at": "2014-01-16T15:54:53Z", 
            "custom_role_id": null, 
            "default_group_id": null, 
            "details": "", 
            "email": "xxxxxx@xxxxx", 
            "external_id": null, 
            "id": 0000000000, 
            "last_login_at": "2018-02-07T06:25:56Z", 
            "locale": "ja", 
            "locale_id": 67, 
            "moderator": false, 
            "name": "テスト",
            ...//以下、省略

```

# プロキシ経由で実行する場合
次のコマンドを実行してから、リクエストするといいです。

- 変数 ```http_proxy``` にはプロキシサーバーを指定 

```shell

export http_proxy=http://...
export https_proxy="${http_proxy}"
export HTTP_PROXY="${http_proxy}"
export HTTPS_PROXY="${http_proxy}"
```

# さいごに
cURLコマンドを使って、すぐ確認することができそうです。
Macのスクリーンショットで保存される画像の拡張子を変更する方法（jpg,gif）

Macには標準でスクリーンショット（スクリーンキャプチャ）の機能が搭載されています。
ディスプレイ全体をそのまま画像として保存する方法や画面の一部を任意で保存する方法があります。

このスクリーンショット画像ですが、デフォルトの拡張子は.png形式となっています。
画面説明や共有のためにキャプチャするのであれば問題ありませんが、ブログやWebサイトで利用したい場合は、ちょっと容量が大きいのが気になります。
そこで、できればjpgで保存されるようににしたいと考える人も多いのではないでしょうか。

今回は新しいMacを買ったらまずは設定しておきたいスクリーンショットのデフォルト拡張子を変更する方法を紹介します。

jpgの需要が高いと思いますが、ほかの拡張子にも変更できるので合わせて紹介します。

## Macでスクリーンショットをとる方法
### 画面全体
shift + command (⌘) + 3

### 任意の範囲
shift + command + 4 で十字型のポインタが表示されるので、ドラッグして範囲を選択。

### ウインドウのみ
shift + command + 4 を押したあとにスペースキーを押す。
十字型のポイントがカメラマークに変わるので、任意のウインドウ上でクリック。

## jpg形式で保存する
まずは、ブロガーやライターには必須の、jpg形式に変更する方法です。

ターミナルを起動したら、

```
defaults write com.apple.screencapture type jpg
```

を入力してEnterを押します。
その後に、SystemUIServerを再起動するため下記を入力してEnter。

```
killall SystemUIServer
```

これで、スクリーンショットで保存される画像のファイル形式が.jpgに変更されます。

## git形式やその他の拡張子で保存する
jpg形式のほかにも、gif形式やその他の拡張子に変更することも可能です。
対応している拡張子は

- jpg
- png
- bmp
- pdf
- gif
- tif
- pict
- jp2
- psd
- sgi
- tga

変更方法は、

```
defaults write com.apple.screencapture type　変更したい拡張子
```
とするだけです。

### 例：gif形式に変更

```
defaults write com.apple.screencapture type gif
```

と入力してEnter。
つぎに、SystemUIServerを再起動するため、

```
killall SystemUIServer
```

と入力してEnter。


## デフォルト拡張子に戻す
デフォルトの拡張子（png形式）に戻すには、下記を順番に入力してEnter。

```
defaults delete com.apple.screencapture type
```

```
killall SystemUIServer
```

## まとめ
以上です。
ブログとかメディアをやっているとスクリーンショットを利用することが多いと思いますが、pngのままだと容量が大きいのがネックです。
TinyPNGで圧縮してもいいのですが、複数枚あるときは正直面倒くさい・・・。

ぜひ参考にしてみてください。
[Python][Ruby] hex string (16 進文字列) のエンディアンをビッグエンディアンからリトルエンディアンに変更する

![ビッグエンディアンとリトルエンディアン.png](https://qiita-image-store.s3.amazonaws.com/0/6697/57e7304d-d1bb-58ce-7c54-7085a2005652.png)

# 考え方

hex string は 2 文字で 1 バイトを表すので、単に文字列の並びを逆順にしてしまうと異なるバイト列になってしまう。str から bytes に変換してから逆順にすると上手くいく。

# 方法

## Python

### 方法 1

```py
import binascii

hex_be = 'f0148c'
bytes_be = binascii.unhexlify(hex_be)
bytes_le = bytes_be[::-1]
hex_le = binascii.hexlify(bytes_le).decode()
hex_le  # '8c14f0'
```

### 方法 2

@shiracamus さん、いつもコメントありがとうございます :pray:

```py
hex_be = 'f0148c'
bytes_be = bytes.fromhex(hex_be)
bytes_le = bytes_be[::-1]
hex_le = bytes_le.hex()
hex_le  # '8c14f0'
```

## Ruby

```rb
hex_be = 'f0148c'
bytes_be = Array(hex_be).pack('H*')
bytes_le = bytes_be.reverse
hex_le = bytes_le.unpack1('H*')
hex_le # '8c14f0'
```