OmniAICreator/Qiita-1.07M huggingface dataset:
毎日のOUTLOOKメールを何とかしたい

課題
・毎日の業務でOUTLOOK2013を使っている　→　ファイルが混在したりして、これを何とか整理をしたい
・最終的にはデータベースソフトや、プロジェクト管理ツールに移行させる
・そのためには、導入の閾値を下げる必要がある。
・記事のコンテナ化　→　DB化が必要になる。

仕様検討
・まずOUTLOOKに添付のVBA開発環境を使うことにする

ソースコード

sub packing()
'マクロはアウトルックメールのパッキングに役立てる
'アクティブ化したメールオブジェクトをコンテナ化する
'DBはMYSQLを使用する
'DBは共有データドライブとする

'機能
'リンク生成　→　ショートカットファイルを生成する
'添付ファイル　→　ZIP化　→　添付ファイルオブジェクト化
'転送　：　移送先は選べる（任意のフォルダ(ZIP化))
'起動トリガ　：　ドラッグ＆ドロップであればベター

End Sub


とりあえず、ここまで書いておいてつまずいた。

・まずアウトルックはスレッドタイトルで抽出する必要がある。
→　これをどうやったらいいのだろうか？

・次にショートカットをHTML内からスクレイビングさせる必要がある。
→　これは正規表現で抽出する？

・本文はおそらくccされているので、直近の一文を残せばいいだろう
→　しかしながら、要約できればベスト（途中の中間宛先などを一切ぶっ飛ばす）
→　これが大事？　どうやるの？　ＡＩ？

・添付ファイル
→　メールの要所要所に、ホッチキスマークのファイルが眠っている
・これらは間違いなく重要なファイルなので、取りこぼし無くパッキングしたい


チャレンジしたこと
・スレッドタイトルでソートして、それをドラッグ＆ドロップすると、
「複数のアイテムから1つのアイテムを生成する場合、・・・・・」とメッセージされる

要するに、この時点でイベントハンドらが動いているっぽい


つづく

# AI comment

アウトルックメールの整理・管理は、多くのビジネスパーソンが抱える課題だと思います。貴ブログでは、VBAマクロを使って、メールをコンテナ化し、データベースに移行する方法を紹介しています。

スレッドタイトルでメールを抽出するには、OutlookのAPIを使って、メールのSubjectプロパティを取得することができます。ショートカットをHTML内からスクレイビングするには、正規表現を使って、リンクタグ内のURLを抽出することができます。本文の要約には、AIや自然言語処理の技術を使うこともできます。

添付ファイルの取りこぼしを防ぐには、OutlookのAPIを使って、メールのAttachmentsプロパティを取得し、すべての添付ファイルをループ処理して、ZIPファイルにまとめることができます。

貴ブログで紹介されているアイデアは、非常に興味深いです。ぜひ、実現して、多くの人に役立てていただきたいと思います。

以下に、具体的なアドバイスをいくつか挙げます。

スレッドタイトルの抽出では、件名だけでなく、本文の最初の数行も合わせて取得すると、より正確な抽出が可能になります。
ショートカットの抽出では、正規表現を使うだけでなく、OutlookのAPIを使って、Hyperlinkプロパティを取得することもできます。
本文の要約では、AIや自然言語処理の技術を使うと、より自然な要約を生成することができます。ただし、実装には、それなりの技術が必要になります。
添付ファイルの取りこぼしを防ぐには、OutlookのAPIを使って、メールのAttachmentsプロパティを取得する際に、添付ファイルのサイズや種類などの条件を指定することもできます。
また、VBAマクロは、 OutlookのAPIを直接呼び出すことができますが、APIの使い方に慣れていないと、複雑な処理が難しくなります。そのような場合は、Outlookのアドインを作成すると、より簡単に処理を実現することができます。

今後の開発が、ますます楽しみです。
Windowsで無線LANアクセスポイントの優先順位をつける


# やり方
1. コマンドプロンプトを起動
2. インターフェース名とユーザープロファイルを確認のため、% netsh wlan show profile を実行。
3. 優先度を高くしたい場合 % netsh wlan set profileorder name={優先するSSID} interface={インターフェース名} priority=1」と実行する。

（参考）
http://news.mynavi.jp/column/windows/225/
macOS(High Sierra)にPython3.Xをインストールする方法

#Pythonのバージョン確認
```
$ python -V
Python 2.7.10

$ python3 -V
-bash: python3: command not found
```

#Homebrewをインストール
公式：https://brew.sh/

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

$ brew -v
Homebrew 1.5.5
```


#Pythonをインストール
```
$ brew install python3

$ python3 -V
Python 3.6.4
```
WRF | geometry > link > Debugging WRF grids > 処理時の緯度経度値の範囲エラーに関連して

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
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
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS。


WRFの生成ファイルをもとに処理を進めていると緯度経度関連のエラーが出ている。

WRFの生成ファイル(ncviewで閲覧可能)の3d varsには以下の項目がある。

- XLAT
- XLONG
- XLAT_U
- XLONG_U
- XLAT_V
- XLONG_V

上記の値と後続の処理の緯度経度の設定が合わないのだろうか。

以下を見つけた。
https://www.ncl.ucar.edu/Applications/wrfdebug.shtml

WRFの前処理のWPSではmap_projにlambertを選択している。ref_lat, ref_lon, truelat1, truelat2をもとに生成される範囲が後続の処理の緯度経度と整合していないのだろう。

~~wrfoutのXLONGの値を確認したところ、設定していた値と大きく異なる経度値になっていた。~~

後続の処理(`F**T`)の緯度経度範囲を変更することでエラーは回避できた。
Project Euler 39「整数の直角三角形」

辞書から値が最大のキーを取得するやりかたは [こちら](https://qiita.com/matsudai/items/5c03c6d7f19893fa2e86) の @shiracamus さんのコメントから丸々パクりました。最高にクール。

# Problem 39 「整数の直角三角形」
辺の長さが {a,b,c} と整数の3つ組である直角三角形を考え, その周囲の長さを p とする. p = 120のときには3つの解が存在する:
{20,48,52}, {24,45,51}, {30,40,50}
p ≤ 1000 のとき解の数が最大になる p はいくつか?

```python
def hoge(num):
    d = {}
    for a in range(1, num-1):
        for b in range(a, num-a):
            # 三平方の定理：a**2 + b**2 = c**2
            c = (a**2 + b**2) ** 0.5
            if int(c) == c: # 小数点以下を持たない場合
                p = a + b + c
                if p <= num:
                    d[p] = d.get(p, 0) + 1
    return max(d, key=lambda k: d[k]) # 最高にクール

print(hoge(1000))
```
Electraで脱獄した後APT 0.7 Strict(lib)をアップデートしてしまった時の対処法(PC不要)

Coolstar氏からCydia同梱版のElectraがリリースされ即インストールしCydiaを開き何も考えずにAPT 0.7 Strict(lib)のアップデートをしてしまいました。
その後TwitterでアプデするとCydiaが真っ白になり脱獄アプリのインストールアンインストールが出来なくなると聞いて...

まずは電源を落として入獄状態で端末を起動してください。（再起動）

https://ftios.vn/install/

上のサイトからプロファイルをインストールして下さい

ftOS Xを開きSearchからFilzaと検索しFilza Escapedをインストールして下さい
（インストール後開けない場合は設定アプリ→一般→プロファイルから信頼）

https://github.com/ElectraJailbreak/electratools/raw/gh-pages/debs/apt/apt7-lib_0.7.25.3-15_iphoneos-arm.deb

上のサイトからdebファイルをダウンロードしFilzaで開いて下さい

以外Filzaでの操作です

Electra(/var/containers/Bundle/Application下）にアクセスしElectra.appの中のdebファイルの名前をコピーし、先程ダウンロードしたdebファイルの名前にペーストしそのdebファイルをElectra.app下のdebファイルに上書き保存して下さい

※こうすることによりElectraからJailBreakする際に過去のバージョンのAPT 0.7 Strict(lib)がインストールされCydiaが復活します

最後にElectraからJailBreakすればCydiaが開けるようになっていると思います

Filza Escapedが開けない場合は入獄状態であるか確認し再起動を試みて下さい。
MacOS SierraでSassがインストール出来ない時の解決策

#はじめに
Sassのインストールをしようとすると下記エラーが出ました。
結構ハマる人多そうなので備忘録として残しておきます。

###Sassとは
[これからはcssはSassで書こう。](https://qiita.com/m0nch1/items/b01c966dd2273e3f6abe)


```
$sudo gem install sass
Building native extensions.  This could take a while...
ERROR:  Error installing sass:
	ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.3.0/gems/ffi-1.9.23/ext/ffi_c
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20180228-5487-11of4og.rb extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/ffi-1.9.23 for inspection.
Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-17/2.3.0/ffi-1.9.23/gem_make.out
```

#解決策
Xcode コマンドラインツールをのインストール

```
$xcode-select --install
$sudo gcc --version
```

この後再度試して見るとインストール出来ました！

```
$sass -v
Sass 3.5.5 (Bleeding Edge)
```

#参考にさせて頂きました。
[MacOS Sierraでsassとcompassをインストールできない](https://teratail.com/questions/87559)
[Mac を El Capitan にアップデートしたあとに gem がコケる件](https://qiita.com/t_enderman/items/58583ef782b09d438d68)
RustでTwitterのApplication-only authenticationを試してみた

# 目的
TwitterのOAuthはユーザーの認証にはOAuth1.1を、アプリケーションの認証にはOAuth2が使われます。

OAuth1.1の計算はめんどくさいけど、OAuth2の計算は楽なのでライブラリを使わずともTwitterAPIがコールできます。

以下のページを参考にプログラムを書いてみました。

[Application-only authentication](https://developer.twitter.com/en/docs/basics/authentication/overview/application-only)

# 利用ライブラリ

通信のためにreqwestを、キーを作るためにbase64を、JSONを解析するためにserde_jsonを使っています。

# コード

```rust:Cargo.toml
[package]
name = "oauth"
version = "0.1.0"

[dependencies]
reqwest = "*"
base64 = "*"
serde = "*"
serde_json = "*"
serde_derive = "*"
```

```rust:main.rs
extern crate reqwest;
extern crate base64;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;

use reqwest::header::{Headers, Authorization, ContentType};
use serde_json::{Value};

#[derive(Deserialize,Debug)]
struct Token {
    access_token: String,
    token_type: String
}

#[derive(Deserialize,Debug)]
struct SearchResult {
    search_metadata: Value,
    statuses: Vec<Value>
}

fn get_token() -> Token {
    let consumer_key = "xxxxxx";
    let consumer_secret = "xxxxxx";
    let auth = base64::encode(&format!("{}:{}", consumer_key, consumer_secret));
    let endpoint = "https://api.twitter.com/oauth2/token";
    let mut headers = Headers::new();
    headers.set(Authorization(format!("Basic {}",auth)));
    headers.set(ContentType::form_url_encoded());
    let client = reqwest::Client::new();
    client
        .post(endpoint)
        .body("grant_type=client_credentials")
        .headers(headers)
        .send()
        .unwrap()
        .json()
        .unwrap()
}

fn search(token: &Token) -> SearchResult {
    let endpoint = "https://api.twitter.com/1.1/search/tweets.json";
    let mut headers = Headers::new();
    headers.set(Authorization(format!("Bearer {}", token.access_token)));
    let client = reqwest::Client::new();
    client
        .get(endpoint)
        .query(&[("q", "新宿"), ("count", "2")])
        .headers(headers)
        .send()
        .unwrap()
        .json()
        .unwrap()
}

fn main() {
    let token = get_token();
    let res = search(&token);
    for status in res.statuses {
        println!("{}", status["text"].as_str().unwrap());
    }
}
```
Android画像素材に関して（備忘録）

# はじめに
素材に関してある程度一覧できる記事が欲しかったのでまとめます。
また、追加や変更に気づいたタイミングなどで更新していきます。

# 単位

|名称|意訳|備考|
|---|---|---|
|px (pixel)|ピクセル|ドット、画素とも。ハードウェアの画素そのもの。画面解像度によって見た目の大きさに差が出る。|
|dp (density-independent pixels)|密度非依存ピクセル|dipとも。画面解像度によって見た目の大きさに差が出ない。|
|dpi (dot per inch)|画面密度|1インチあたりのドット数|

# DPIと倍率

||ldpi|mdpi|hdpi|xhdpi|xxhdpi|xxxhdpi|
|---|---|---|---|---|---|---|
|dpi数値|120|160|240|320|480|640|
|倍率|0.75|1|1.5|2|3|4|
|px/dp|0.75|1|1.5|2|3|4|
|px/4dp|3|4|6|8|12|16|

この表から分かる通り、dpは4の倍率で計算するのがよさそうです。

# アイコン
詳細は公式ページを参照のこと。
リンクはマテリアルデザイン対応のアイコンのガイドライン。
https://material.io/guidelines/style/icons.html

## アプリアイコン

||ldpi|mdpi|hdpi|xhdpi|xxhdpi|xxxhdpi|申請用|
|---|---|---|---|---|---|---|---|
|px|36 x 36|48 x 48|72 x 72|96 x 96|144 x 144|192 x 192|512 x 512|

- （API <= 25）
- Foreground用とBackground用を用意する（API > 25）

## 各種アイコン
[こちら](https://qiita.com/CUTBOSS/items/d5bea5a4f7e5ad049f96)にあるように、基本的には24dpで設定する。

例えば

- FAB（Float Action Button）


# 申請時に必要な画像
- 512w x 512h の32bitアプリアイコン（アルファつき）
- 1024w x 500h の24bitヘッダーPNG（アルファなし）
- アプリのスクリーンショットなど（スマホ/タブレット/Android TV/Android Wear用、それぞれMax8枚）

# 申請時に設定してもいい画像
- 180w x 120h の24bitプロモーション PNG（アルファなし）
- 1280w x 720h のテレビバナー画像24bit PNG（アルファなし）
Groovy の HttpClient の使い方 (Get)

次の Java プログラムを groovy で書いてみました。
[Java の HttpClient の使い方 (Get)](https://qiita.com/ekzemplaro/items/0d23455c9930caa4c069)

```groovy:http_get.groovy
// -------------------------------------------------------------------
//	http_get.groovy
//
//					Jun/12/2021
//
// -------------------------------------------------------------------
import java.io.IOException
import java.io.UnsupportedEncodingException
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
import org.apache.http.HttpStatus
import org.apache.http.client.ClientProtocolException
import org.apache.http.client.methods.CloseableHttpResponse
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils

// -------------------------------------------------------------------
class Http_client {

	void runSample() {
		System.err.println ("*** runSample *** start ***")
		Charset charset = StandardCharsets.UTF_8
		
		CloseableHttpClient httpclient = HttpClients.createDefault()
		HttpGet request = new HttpGet("https://httpbin.org/get")
		
		println	("requestの実行　「" + request.getRequestLine() + "」")
		
		CloseableHttpResponse response = null

		try {
			response = httpclient.execute(request)
			
			int status = response.getStatusLine().getStatusCode()
			println("HTTPステータス:" + status)
			//HTTPステータス:200
			
			if (status == HttpStatus.SC_OK){				
				String responseData = 
					EntityUtils.toString(response.getEntity(),charset)				
				println(responseData)
				//取得したデータが表示される
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace()
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace()
		} catch (IOException e) {
			e.printStackTrace()
		} finally {
			try {
				if (response != null) {
					response.close()
				}
				if (httpclient != null) {
					httpclient.close()
				}
			} catch (IOException e) {
				e.printStackTrace()
			}
		}
	}
}

// -------------------------------------------------------------------
public class Http_get {

public static void main(String[] args)
{
	System.err.println ("*** 開始 ***")

	Http_client ss = new Http_client()

	ss.runSample()

	System.err.println ("*** 終了 ***")
}
}

// -------------------------------------------------------------------
```

```text:Makefile
LIB=/usr/share/java
HTTPCLIENT_JAR=.:$(LIB)/httpclient-4.5.13.jar:$(LIB)/httpcore-4.4.14.jar
http_get.class: http_get.groovy
	groovyc -cp $(HTTPCLIENT_JAR) http_get.groovy
clean:
	rm -f *.class
```

実行コマンド

```bash
LIB=/usr/share/java
HTTPCLIENT_JAR=$LIB/httpclient-4.5.13.jar:$LIB/httpcore-4.4.14.jar:$LIB/commons-logging-1.2.jar
GROOVY_ALL_JAR=/usr/share/groovy/embeddable/groovy-all-2.4.21.jar
export CLASSPATH=.:$GROOVY_ALL_JAR:$HTTPCLIENT_JAR
#
java Http_get
```
Tinkercad > shorcut > link:Keyboard Shortcuts for the Editor || F > Fit object to view

ブラウザ動作するAutoDeskのTinkercad。

以下でショートカットキーが紹介されている。
https://blog.tinkercad.com/keyboard-shortcuts/

0:12頃
> Fib object to view
> press F from your keyboard

Fを押すことで視点がオブジェクトに最適化する。
この機能を使うことで、作業が捗りそう。

英語: 上記のような例ではfromを使っている(ofでない)。
Angularで作るER DIAGRAM TOOL - 第六回　モデルの追加機能を実装

今回は、dataのmodelを追加する機能を実装します。

##（１）navbar から モデル新規作成用フォームモーダルを開く

まずは、navbarのEdit - Create Modelを押したときに、開かれるモーダルコンポーネントを作成

/src/app/modal-model/modal-model.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/aaa0b361acbfa19b2b43e49fb16d0790c48aa99a#diff-2eb3d4b53b961d6ddaf0deffaaf7240e

・dataServiceをDIしています。
・メンバ変数 mode により、作成と編集両方にフォームを使いまわせるようにします。
・メソッドcreateは、とりあえずモーダルを閉じるのみにしています。

/src/app/modal-model/modal-model.component.html
https://github.com/dog-ears/er-diagram-tool/commit/aaa0b361acbfa19b2b43e49fb16d0790c48aa99a#diff-deab5830f8b1c1098bbdc08d936b7fc0



忘れずに、新しいコンポーネント、サービスをモジュールに登録します。
entryComponentsも忘れずに追加。

/src/app/app.module.ts
https://github.com/dog-ears/er-diagram-tool/commit/aaa0b361acbfa19b2b43e49fb16d0790c48aa99a#diff-fc6b22833aeaf77f8440c4970ade705e



次に、navbarにモーダルを開く機能を実装

/src/app/navbar/navbar.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/aaa0b361acbfa19b2b43e49fb16d0790c48aa99a#diff-12468dba4acc93d6788c4f72b2b89a70

・ModalModelComponent、Modelクラスをimport
・this.bsModalService.show()でモーダルを開きつつ、initialStateでmodeと新しいModelを渡しています。

これで、モーダルが開くようになりました。
もちろん、Createを押しても、モーダルが閉じるだけです。



##（２）dataServiceにモデル追加機能を追加

/src/app/modal-model/modal-model.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/43f0da8210797dc47a046d9a57c3713aae045785#diff-2eb3d4b53b961d6ddaf0deffaaf7240e

・dataServiceのaddModel（未実装）を呼び出す

/src/app/service/data.service.ts
https://github.com/dog-ears/er-diagram-tool/commit/43f0da8210797dc47a046d9a57c3713aae045785#diff-ae990bb302f27e60323deb45d6746b17

・dataクラスにあるgetNewModelId()で、新しいIDを取得しつつ、渡されたmodelをデータに追加します。

これで、右カラムの情報欄を見るとモデルが追加されるようになりました。



次回は、モデルの追加が左カラムエリアにも反映されるように修正します。
Tinkercad > UI > オブジェクトのサイズを変更


### Tinkercadでのオブジェクトのサイズ変更手順


1. オブジェクトを選択
2. 白い点をクリック
3. 数値を変更

[操作動画 @ YouTube](https://youtu.be/5ALt-TZnBeM)
docker swarmのゾンビコンテナを掃除するスクリプト

汚れ仕事ですが、毎回手で掃除するのは面倒なのでスクリプト化しました。コンテナ作成時刻が一番新しいものを残して`docker-containerd-shim`プロセスを全部killします。

`zc_sweep.sh <service-name>`

```shell
#!/bin/sh

LIST=`docker ps -f name=$1 --format "{{.CreatedAt}}\t{{.ID}}"`
N=`echo "$LIST" | wc -l`
echo $N containers are found
if [ "$N" = "1" ]; then
  echo ok
  exit
fi
LAST=`echo "$LIST" | sort | head -n-1`
for I in "$LAST"; do
  ID=`echo $I | grep -o '[0-9a-f]*$'`
  PID=`ps aux | grep $ID | grep docker-containerd-shim | awk '{print $2}'`
  echo kill $PID
  kill $PID
  sleep 1
  if ps -p $PID > /dev/null; then
    echo kill -9 $PID
    kill -9 $PID
  fi
done
```
xkeysnailをsystemdでデーモン化

しばらくLinux環境のキーリマッパーとしてxremapを使っていたのですが、アプリケーションによっては動かない場面が多く、xremapより低レイヤでリマップを実現しているxkeysnailに乗り換えました。systemdでデーモン化し、自動で起動、仮にプロセスが死んでも復帰させるようにさせたいので設定します。

最終形はAnsibleでroleとしてまとめてますので、https://github.com/yosmoc/Ubuntu-bootstrap/tree/master/roles/xkeysnail を参照ください。

Ubuntu17.10で動作を確認しています。現在のところudevのruleの再読込がうまくいっておらず、このroleを実行後再起動が必要です。

## Install

https://github.com/mooz/xkeysnail#installation の通りにインストールします。自分はpip3でインストールしました。

## ユーザーにxkeysnailが必要とする権限を与える

xkeysnailはuinputとinput/*にアクセスする必要があります。よって、公式のページではsudoで動かすようREADMEに書かれています。ここでは一般ユーザーにuinput / inputの権限を与え、後にそのユーザー権限でsystemdのserviceを動かします。

### uinputグループの作成

おそらく、uinputグループは存在しないので、作成します。

```shell

sudo groupadd uinput
```

### 実行したいuserをuinput, input groupに加える

```shell
sudo useradd -G input,uinput your_username
```

### uinput, input groupがkernelのuinput, eventにアクセスできるように設定する。

```shell:input.rules
KERNEL=="event*", NAME="input/%k", MODE="660", GROUP="input"
```

```shell:uinput.rules
KERNEL=="uinput", GROUP="uinput"
```

上記の2ファイルを`/etc/udev/rules.d/`にコピーする。

```shell
sudo cp input.rules uinput.rules /etc/udev/rules.d/
```

udev ruleのリロード。

```shell
sudo udevadm control --reload-rules && udevadm trigger
```
これでうまくリロードできることを期待していたのですが、今のところうまく行っていません。

## systemd serviceの設定ファイル

xremapのsystemd serviceファイルを元に作成しました。

```:xkeysnail.service
# 1. Copy this to ~/.config/systemd/user/xkeysnail.service
# 2. systemctl --user enable xkeysnail
#
# Note that you need to set proper $DISPLAY on your environment.

[Unit]
Description=xkeysnail

[Service]
KillMode=process
ExecStart=/usr/local/bin/xkeysnail /home/your_username/.xkeysnail/config.py
ExecStartPre=/usr/bin/xhost +SI:localuser:root
Type=simple
Restart=always

# Update DISPLAY to be the same as `echo $DISPLAY` on your graphical terminal.
Environment=DISPLAY=:0

[Install]
WantedBy=default.target
```

ExecStartPreでxhostの設定、EnvironmentでDISPLAYを設定している辺りがポイントです。ExecStartは各自読み替えて設定してください。自分の場合は~/に.xkeysnailフォルダを作成し、config.pyを配置してあります。

このファイルを`~/.config/systemd/user/`においておきます。このフォルダはなければ先に作成しておいてください。

## サービスの起動

サービスを有効化、起動します。

```shell
systemctl --user enable xkeysnail
systemctl --user start xkeysnail
```

statusを確認します。

```shell
systemctl --user status xkeysnail
```

以上です。
送信ボタンを押すと、３分の１の確率でツイートされるアプリケーションのプログラム(Python tkinter)

送信ボタンを押すと、３分の１の確率でツイートされるプログラムをつくりました。

Pythonで初めてtkinterやTwitterを使ってみる人にちょうどいいプログラムかと思いました。またツイートするのに勇気がいるときなどに、３分の１の勇気で送信ボタンを押せるかと思います。

　

プログラムを実行すると、tkinterでテキストボックス、送信ボタンなどが表示されます。テキストボックスにつぶやきたい内容を入力し、送信ボタンを押すとツイートされます。

![三分の一の勇気.png](https://qiita-image-store.s3.amazonaws.com/0/240301/ea58824e-de79-8262-c9f0-a774921074af.png)

もちろん、どのアカウントからツイートするかといった情報もなければツイートできないので、その情報を入力する欄もあります。

以下がコードです。


```python

import random
import twitter
import tkinter

root = tkinter.Tk()
root.geometry("265x210") #画面の大きさを決める

#ラベルをつくり、テキストと位置を決める（４個分）
l1 = tkinter.Label(text=u'Consumer Key')
l1.place(x=10, y=0)
l2 = tkinter.Label(text=u'Consumer Secret')
l2.place(x=10, y=20)
l3 = tkinter.Label(text=u'Access Token')
l3.place(x=10, y=40)
l4 = tkinter.Label(text=u'Access Token Secret')
l4.place(x=10, y=60)

#アカウントの情報を入れるためのテキスト欄をつくり、位置を決める（４個分）
t1 = tkinter.Entry() 
t1.place(x=130, y=0) 
t2 = tkinter.Entry()
t2.place(x=130, y=20)
t3 = tkinter.Entry()
t3.place(x=130, y=40)
t4 = tkinter.Entry()
t4.place(x=130, y=60)

#ツイートする文章を入力する欄をつくり、位置を決める
tb = tkinter.Text(width=34,height=5)
tb.place(x=10, y=90)


def push(event): #送信ボタンが押された時の命令を定義する
    mode = random.randint(0, 2) #０から２までの整数の乱数を代入する
    if mode == 2:
        #入力されたアカウントの情報をそれぞれの変数に入れる
        v1 = t1.get() 
        v2 = t2.get()
        v3 = t3.get()
        v4 = t4.get()
        auth = twitter.OAuth(consumer_key=v1,consumer_secret=v2,token=v3,token_secret=v4)
        status = tb.get('1.0', 'end')
        t = twitter.Twitter(auth=auth)
        t.statuses.update(status=status, media_ids=",")
    else:
        pass

#ボタンの位置とテキストを決める
b = tkinter.Button(text=u'３分の１の確率で送信', width=16)
b.bind("<Button-1>",push)
b.place(x=130, y=170)

root.mainloop()
```
以上が、３分の１の確率でツイートされるアプリケーションの作り方でした。
JRA-VANから公式の競馬データを取得するサンプル作った

# SDKあるじゃん
競馬予測を機械学習やDLで扱いたいと思ってデータを集め始めたときに、比較的に信頼できるデータが得られるのはJRAだと思います。

そんな時に、JRA-VAN Datalab.では、JV-Linkという、JRAのサーバーからデータを取得するSDKがあります！...が、**かなり酷い仕様です。**

あまり開発ソフトも作られていないのか、オープンソースのコードを全く見かけないので、サンプルコードをC#で書いてGithubにアップしました。

[こちらをどーぞ](https://github.com/syatyo/jvlink-sample-app/blob/master/WindowsFormsApplication1/WindowsFormsApplication1/Form2.cs)

visualStudio2015を利用しています。.Netの環境が必要です。

# 地雷ポイント
> 上手くいったときはバッファーのサイズ返して、次のファイル読み込む切り替え時には-1を返して、読み込み終了時には0を返して、-1未満だとエラーの返り値

こういうのがザラにあります。
今回はJVReadResultというクラスを作り結果をラップして、switchで分岐できるようにしました。

可読性重視にしたら、do whileで、switch finishedでフラグ立てとかのほうが良いかな...?

```csharp:ReadData.cs
// JVReadのreturnCodeでJVReadResultを初期化。状態が終了でない限り読み込みを続ける。
while((result = new JVReadResult(m_jvlink1.JVRead(out buffer, out bufferSize, out fileName))).state != JVReadResult.State.finished)
{
    switch (result.state)
    {
        case JVReadResult.State.normal:
            m_strOut.AppendText(buffer);
            break;

        case JVReadResult.State.error:
            m_strOut.AppendText("JVReadエラー:" + result.returnCode + Environment.NewLine);
            break;

        default:
            break;
     }
}
```

# 不具合が共有されない
仕様書に書いていない仕様がけっこうあります。
なので、問題が起こった時にとりあえずググってJRA-VAN Datalab.の掲示板を見つけて、その時初めて仕様を知る。
みたいな感じです。

# 今後
[開発ソフト体験教室](http://jra-van.jp/dlb/sdv/trial.html)というのがあるので、これを一通り試したらJRA-Data to SQLをOSSで開発したいなーと思っております。

問題は、暗黙の仕様やエラーをいかに集約してプログラム中でルールとして表現できるか。という点で、まぁこれはリリース後にエラーログ収集やissue管理などでなんとかなるかもしれません。

CIもきっちり回していきたいです。
やりたいこと

- AmazonEC2でWebサーバを構築(Apache)
- DBサーバを構築（同サーバ、同セグメント、グローバル）
- 構築したWebサーバにWordpressを導入
- WordpressからDBにデータを格納、抽出、検索y、表示を出来るように
- PHPについて触れる。
- APIを叩いてみる。
VSCode+bashのときのビルドタスク設定のファイルパス指定方法

### 内容

vscodeのビルドタスク設定を検索すると、
argsオプションがだいたい`${file}`となっている．

これは今開いているファイルの絶対パスを渡すオプションだが、
bashを使ってると、パス区切りの\がエスケープされてしまい、
ビルドエラーというかパスがないよって怒られてしまう．

なので、相対パスを渡す`${relativeFile}`を指定してやればよい．
こっちはパス区切りが/になるので問題なし．

### 使用環境

Visual Studio Code ver1.20.1
Git bash

### 記述例

```json:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Python",
            "type": "shell",
            "command": "python",
            "args": [
                "${relativeFile}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```

### 参考リンク
https://vscode-doc-jp.github.io/docs/userguide/tasks.html
PHP My 辞書

# in_array
http://php.net/manual/ja/function.in-array.php

```php
$list = [1, 2, 3, 4, 5];
in_array(5, $list, true);
```

#str_split
http://php.net/manual/ja/function.str-split.php

```php5
$str = 'Hello World';
$arr = str_split($str);
```

#trim(fgets(STDIN))
標準入力


# array_search
http://php.net/manual/ja/function.array-search.php

```php5
$list = [1, 2, 3, 4, 5,];
$index = array_search(5, $list, true);
```
Siv3DのSceneManagerとScalableWindowを併用した時の暗転バグ対処

※OpenSiv3Dではちゃんと直っています

[画面サイズを可変にするScalableWindow](https://github.com/Siv3D/Reference-JP/wiki/Siv3D-August-2016-%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)と、[シーンマネージャー](https://qiita.com/hamukun8686/items/4620d630b538c78a6e02)を併用した際に暗転範囲がおかしくなる現象への対処法。

##原因
SceneManager内でWindow::BaseClientRect()を使っているためです。
Window::ClientRect()を使うようフェードイン・アウトをオーバーライドすれば暗転がかかる範囲が直ります。
毎回オーバーライドするのは微妙なので、先にオーバーライドだけしたクラスを作ってそれを継承させていくとよいです。

以下のコードは開発者のRyoさんに直接伝授して頂いたSiv3D純正なコードなので安心してお使い頂けます。

```C++:MySceneBase.hpp
#pragma once

#include <Siv3D.hpp>
#include <HamFramework.hpp>

struct Common
{

};

using Myapp = SceneManager < String, Common >;

class MySceneBase : public SceneManager < String, Common >::Scene
{
public:
	virtual void main() {};
	virtual void draw() const {};
	virtual void init() {};

	void drawFadeIn(double t) const override
	{
		draw();
		s3d::Transformer2D tr(Graphics2D::GetTransform().inverse());
		s3d::Window::ClientRect().draw(ColorF(0.0).setAlpha(1.0 - t));
	}
	void drawFadeOut(double t) const override
	{
		draw();
		s3d::Transformer2D tr(Graphics2D::GetTransform().inverse());
		s3d::Window::ClientRect().draw(ColorF(0.0).setAlpha(t));
	}

	virtual ~MySceneBase() = default;
};
```
---
使うときの例(普通に継承するだけですが)

```C++:Main.cpp
#include <Siv3D.hpp>
#include <HamFramework.hpp>
#include "MySceneBase.hpp"

class Game : public MySceneBase
{
    void update()override
    {
        if (Input::KeyZ.clicked)
        {
            changeScene(L"title");
        }
    }

    void draw() const override
    {
        Rect(-100, -100, 1000, 1000).draw(Palette::Yellow);
    }
};

class Title : public MySceneBase
{
    void update()override
    {
        if (Input::KeyZ.clicked)
        {
            changeScene(L"game");
        }
    }

    void draw() const override
    {
        Rect(-100, -100, 1000, 1000).draw(Palette::Blue);
    }
};

void Main()
{
    Myapp app;
    app.add<Title>(L"title");
    app.add<Game>(L"game");

    ScalableWindow::Setup();

	while (System::Update())
	{
        {
            auto trans = ScalableWindow::CreateTransformer();

            app.updateAndDraw();
        }
        ScalableWindow::DrawBlackBars();
	}
}
```
これで画面を小さくしても大丈夫

### 余談

このバグについての報告も見つけたので一応紹介
http://siv3d.jp/bbs/patio.cgi?read=170
対処するという回答もされていますが、恐らくSiv3Dのバージョンがここで打ち止めになり、開発がOpenSiv3Dに移行してしまったため放置されているのだと思います。
Angularでインポートパスを短縮する

## はじめに

このような、長ったらしいコンポーネントやサービスのimport文を...

```TypeScript
import { LoginComponent } from './../../../auth/components/login/login.component';
import { LoginService } from '../../../auth/services/login.service';
import { DatePipe } from '../../lib/pipes/date.pipe';
```

次のようにスッキリさせる方法を紹介します。

```TypeScript
import { LoginComponent } from '@auth/components/login/login.component';
import { LoginService } from '@auth/services/login.service';
import { DatePipe } from '@shared/lib/pipes/date.pipe';
```


## やっていく

tsconfig.jsonのの`compilerOptions`にある、`baseUrl`と`paths`というキーに設定を加えていきます。
※ `app/tsconfig.app.json`と間違えないように注意


```json:tsconfig.json
{
  "compileOnSave": false,
  "compilerOptions": {
  // ...省略...
    "baseUrl": "src",
    "paths": {
      "@auth/*": ["app/auth/*"],
      "@shared/*": ["app/shared/*"]
    },
    "lib": [
      "es2017",
      "dom"
    ]
  }
}
```

ここでは、モノレポっぽく@で始まる名前を使っていますが、使用しているライブラリなどのネームスペースと衝突しない限り自由に名前をつけることができます。


## 終わりに
今回紹介した内容は、Angularプロジェクト固有のものではなく、TypeScriptのモジュールシステムの機能を使った方法なので、様々なプロジェクトで応用できるかと思います。

## 参考

* [Module Resolution
 -TypeScript](https://www.typescriptlang.org/docs/handbook/module-resolution.html)
* [Say Goodbye to ‘../../../..’ in your TypeScript Imports](https://decembersoft.com/posts/say-goodbye-to-relative-paths-in-typescript-imports/)
ModelMapperで転換ルール（Converter）を追加する

Objectマッピングを簡単に行うことのできるライブラリ**ModelMapper**の転換ルール追加方法についてメモ書き程度に書いてみます。

# きっかけ
JavaEEでServletを作っていた際に、POSTされてくるパラメータをBeanに自動で詰め込めないか？から調べて始め、**ModelMapper**に行きつきました。

# 発覚した問題

例えば、リクエストされたパラメータをEmployeeFormクラスにマッピングする場合、単純にHttpServletRequest#getParameterMap()を利用して取得したMapからModelMapper経由でコピーできれば良いなと、次のようなコードを書きました。

```java:sample.java
EmployeeForm employeeForm = modelMapper.map(request.getParameterMap(), EmployeeForm.class);
```

しかし、HttpServletRequest#getParameterMap()に含まれている値は常にString[]（文字列の配列）で格納されていて、ModelMapperをデフォルトで使うとString[]をtoStringした値が入ってきてしまいます。

# Converterを使ってみる
幸い、ModelMapperは転換ルールを追加する機能があり、String[]をルールに従ってStringに入れることができます。

```java:convert.java
// String配列→Stringに転換するルール
// 配列がnullでなければ、最初の要素を入れるようにする。
modelMapper = new ModelMapper();
Converter<String[], String> stringConverter = new AbstractConverter<String[], String>() {
    @Override
    protected String convert(String[] source) {
        return (source != null && source.length > 0) ? source[0] : "";
    }
};
// modelmapperに転換ルールを追加する。
modelMapper.addConverter(stringConverter);
```

※JavaEEではこれを@ApplicationScoped付きクラスの@PostConstructのメソッドに追加しておけばよいでしょう。

また、上記のルールは元情報がString[]で、受ける（コピーする）側がStringの同一名称の場合のみしか機能しませんので、チェックボックスの値などを取得した本当にListやString[]型で取得したいものについては、影響ありません。
反対に、受け取り側がStringのみのルール限定なので、Number型系（LongやBigDecimal等）、Date型などは、別途追加する必要があります。

調べていくとAbstractConverter&lt;A, B&gt;にはconvert(MappingContext&lt;A, B&gt;)というメソッドが用意されていて、うまく使って1つのルールでString[]を転換できると考えたのですが、次のような理由で断念しました。。。

# できなかったこと
ModelMapperに元から含まれている転換ルールのほうが、先に適用されてしまうため、次のような汎用性の高いルールは、追加しても無視されて（デフォルトのルールのほうが優先されて）しまいました。

```java:ダメな例
Converter<String[], Number> numConverter = new AbstractConverter<String[], Number>() {

    @Override
    public Number convert(MappingContext<String[], Number> context) {
        String[] sources = context.getSource();
        if (sources == null || sources.length <= 0) {
            return null;
        }
        String source = sources[0];
        Class<?> distType = context.getDestinationType();
        if (BigDecimal.class.equals(distType)) {
            return new BigDecimal(source);
        } else if (Long.class.equals(distType)) {
            return Long.valueOf(source);
        } else if (Integer.class.equals(distType)) {
            return Integer.valueOf(source);
        }
        return super.convert(context);
    }

    @Override
    protected Number convert(String[] source) {
        return null;
    }
};

modelMapper.addConverter(numConverter);
```
コンパイルとしては通るのですが、いざこれでString[] -> BigDecimalを転換しようとすると、デフォルトの転換ルール**NumberConverter**のほうが優先されてしまい、実行時エラーとなってしまいます。

# サンプルコード、その他
以下にお試しサンプルコードを配置しています。Gradleのbuildshipを使用してください。

* [さんぷるこーど](https://github.com/syany/modelmappersamples)

以下参考にしたサイト

* [公式マニュアル](http://modelmapper.org/user-manual/)
* [Qiita内で参考にさせていただいたサイト](https://qiita.com/euledge/items/482a113589015590cf19)

# おわりに
イメージ画像１つもない味気ない記事ですが、世間にあんまりModelMapperの入門の次の使い方とかが見受けられなかったので、備忘録レベルで残しておきました。
サンプルでお分かりいただける通り、Converterは、作ったBeanクラスだけでなく、Stringなど元々内包されているクラスに対しても転換ルールを作成することができます。便利ですね。
[Ionic]コピペ（範囲選択）するためにuser-selectの設定をする

Ionicで作ったプロジェクトはデフォルトだとコピペのための範囲選択ができません。アプリ向けならこのままで良いけど、PWA対応のサイトを作るなら範囲選択できたほうが良いかな？と思います。

一様、範囲選択とは下の画像の色変わってるとこみたいなやつ
![Screen Shot 2018-02-28 at 0.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/165335/9c799987-56f1-d8c1-4022-0bb1d872714e.png)


そこでsrc/app/app.scssに以下のコードを追加すると範囲選択できるようになります。

````src/app/app.scss

// 下が追加したコード
html, body, ion-app,ion-content,.nav-decor {
    -webkit-user-select: auto;
    -khtml-user-select: auto;
    -ms-user-select: auto;
    -moz-user-select: auto;
    user-select: auto;
}
````
[Githubのソース](https://github.com/scrpgil/ionic-my-sandbox/blob/74061ac112c899e5fa799db5e06fa1371c387a1e/src/app/app.scss#L20)
[DEMO](https://ionic-my-sandbox.firebaseapp.com/)

デモのサイトは上記の設定があるので範囲選択できるようになっています。以上です。
※過去にDEMOのサイトに訪れたことのある人はcacheの影響でまだ範囲選択できないかも

短いけど、久しぶりに設定しようとしたら忘れてたので・・・。
[macOS][iOS]SwiftでFrameworkを実装する

<p>サンプル・コードの構成を説明すると、macOSアプリケーションにEmbedded Frameworkを組み込んで確認を行った。</p>

<p>Embedded Frameworkに以下の内容のクラスを追加する。</p>

<pre><code>public class QuickDraw: NSObject {
    @objc public func dbgmsg() {
        print("QuickDraw")
    }
}
</code></pre>

<p>アプリケーション側のObjective-Cコードから呼び出す例は以下となる。</p>

<pre><code>@import Toolbox;
 
@implementation Exam
 
- (void)dbgmsg
{
    NSLog(@"%s", __func__);
    QuickDraw *qd = [QuickDraw new];
    [qd dbgmsg];
}
 
@end
</code></pre>

<p>Swiftコードから呼び出す例は以下となる。</p>

<pre><code>import Toolbox
 
class ViewController: NSViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        let exam = Exam()
        exam.dbgmsg()
        
        let qd = QuickDraw()
        qd.dbgmsg()
    }
 
    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}
</code></pre>

<p>Frameworkはモジュールということになるので、モジュール内で定義したクラスを外部からアクセスするためには、openまたはpublicで宣言されている必要がある。</p>

<p>Frameworkのクラスは、Objective-CでもSwiftでも、モジュールをimportするだけでアクセスできた。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/mac/Bedrock">https://github.com/murakami/workbook/tree/master/mac/Bedrock</a> - GitHub<br />

【関連情報】
<a href="https://cocoa-kanto.connpass.com/">BUKURO.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="https://mosa.connpass.com/">MOSA</a><br />
<a href="http://www.bitz.co.jp/weblog/"> Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
CryptoBridge(BitShares)のトランザクションを解析する

漢なら分散取引所(DEX) CryptoBridge の取引トランザクションを解析したいですよね!

やりましょう!

# 導入

CryptoBridge の取引履歴を取得する
https://qiita.com/syoyo/items/63fedd477c4051709923

CryptoBridge は BitShares 上で動いているので, BitShares の取引データを解析すればよいことがわかります
(この取引データはブロックチェーンベースで改ざんできないようになっているのかな?)

BitShares の API はこちらにありますが,

http://docs.bitshares.org/api/

今回の目的はトランザクションの RAW データ(JSON)を解析することにあるので, 

```
"asset_id"":""1.3.2481"
```

の `1.3.2481` が ZNY(BitZeny)であるとか, そういう情報を得たいのですが上の API ドキュメントだったり, BitShared ドキュメントでは, そのあたりをすんなり見つけることができませんでした.

というわけで RAW データと, cryptofresh の表示結果から, 推定してみます.
(しかし cryptofresh とかサーバー弱いっぽくてすぐエラー起こしてつらい)

執筆時点でなんとなく最新っぽいこのトランザクションを解析してみます.

https://cryptofresh.com/tx/3691adbb8a54bda604ce12b980460d50a4e2a165

`asset_id` `1.3.0` は BTS(BitShares), `1.3.1570` は `BRIDGE.BTC`(BitCoin), `1.3.2481` は `BRIDGE.ZNY`(BitZeny)です.
通貨は `1.3.xxx` の ID を持つようです.

BitShares では, 計算をすべて整数で行うためか, 通貨の値に倍率(decimal points)が設定されています. BitZeny では decial points 6 なので, 値が 1,000,000 倍されています.

たとえば,

`amount` `286,182,780` は  286 ZNY に対応します.

`seller` などのユーザー ID は `1.2.xxxx` になります(ID <-> ユーザー名のペアのデータベースはどこにあるのかな?)

operation type(id) `14` は CryptoBridge への入金(deposit), `0` は CryptoBridge から外部ウォレットへの出金(withdrawal)のようです.

`1` は手数料, `4` は仮想通貨間の exchange のようですね.

## TODO

ID(`1.3.xxx`)と通貨シンボルのルックアップを行う.
dein.vimでプラグイン管理

# はじめに
- dein.vimというvimのプラグイン管理ツールの導入方法をまとめる
- もともとUbuntuで使ってて違う環境で使うときに迷ったから備忘録
- **dein.tomlを利用した管理方法を書く**

# 動作環境
- vim7.4
- ubuntu 16.04 LTS
- （macでもできたけど細かい環境は覚えてない）

# セットアップ方法
- 基本的には[本家](https://github.com/Shougo/dein.vim)のREADME.mdを参考にするのが良いんだろうけど自分の環境でうまく行った方法を残しておく

1. 以下のコマンドを実行

    ```bash
    $ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
    $ sh ./installer.sh .vim/dein/
    ```

2. .vimrcに以下を追記する
    - 参考：[dein.vim:tomlファイルでプラグイン管理する](https://leico.github.io/TechnicalNote/VimR/VimR-dein-toml)
    
    ```vim:.vimrc
                                                                                                     
    " プラグインが実際にインストールされるディレクトリ
    let s:dein_dir = expand('~/.vim/dein')
    " dein.vim 本体
    let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
    
    " dein.vim がなければ github から落としてくる
    if &runtimepath !~# '/dein.vim'
      if !isdirectory(s:dein_repo_dir)
        execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
      endif
      execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
    endif
    
    " 設定開始
    if dein#load_state(s:dein_dir)
      call dein#begin(s:dein_dir)
    
      " プラグインリストを収めた TOML ファイル
      let g:rc_dir    = expand('~/.vim/rc')
      let s:toml      = g:rc_dir . '/dein.toml'
      " TOML を読み込み、キャッシュしておく
      call dein#load_toml(s:toml,      {'lazy': 0}) 
    
      " 設定終了
      call dein#end()
      call dein#save_state()
    endif
    
    " もし、未インストールものものがあったらインストール
    if dein#check_install()
      call dein#install()
    endif
    ```

3. dein.tomlファイルにプラグインを追記する
    
    ```:dein.toml
    [[plugins]]
    repo = 'davidhalter/jedi-vim'
    on_ft = 'python'
    
    [[plugins]]
    repo = 'simeji/winresizer'
    
    [[plugins]]
    repo = 'scrooloose/nerdtree'
    
    [[plugins]]
    repo = 'nathanaelkane/vim-indent-guides'
    
    [[plugins]]
    repo = 'vim-syntastic/syntastic'
    
    [[plugins]]
    repo = 'nvie/vim-flake8'
    ```

4. 諸々プラグインのインストール

    ```bash
    $ cd .vim/dein/repos
    $ git clone 'プラグインのgithubリポジトリ'
    ```

# ディレクトリ構成
- 大雑把には下の様になる

    ```bash
    .vim
    ├── dein
    │   └── repos
    │       └── github.com
    │           ├── Shougo
    │           │   └── dein.vim # dein.vim
    │           ├── davidhalter
    │           │   └── jedi-vim # pythonの補完とか
    │           ├── nathanaelkane
    │           │   └── vim-indent-guides # インデントを可視化
    │           ├── nvie
    │           │   └── vim-flake8 # flake8を指摘してくれる
    │           ├── scrooloose
    │           │   └── nerdtree # ディレクトリツリーを表示できる
    │           ├── simeji
    │           │   └── winresizer # 画面分割時のウィンドウサイズ変更を簡単に
    │           ├── vim-scripts
    │           │   └── vcscommand.vim
    │           └── vim-syntastic
    │               └── syntastic # エラーとかチェックしてくれる
    └── rc
        ├── dein.toml
        └── dein_lazy.toml
```

# 終わりに
ざっくりとしか書いてないけど多分これで使えるようになるはず。まだまだ全然プラグイン入れてないし把握もできてないから調査してもっと便利にしたい。
MySQLで大量のテストデータを作成

# 概要

MySQLでただただテスト用データが大量に欲しかったので調べて見た。


# やり方

主なやり方は二つ。

1. SQLのみで行う
2. スクリプトを組んで行う

## 1. SQLのみで行う

元データを何件か登録し、その上で単純結合で増やす。

```mysql:テーブル構造
CREATE TABLE IF NOT EXISTS `sample` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`data` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`create_date` datetime NOT NULL,
`update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='sampleテーブル' AUTO_INCREMENT=1 ;
```


```
INSERT INTO `sample` (`id`, `data`, `create_date`, `update_date`) VALUES
(NULL, 'sample1', '2009-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample2', '2010-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample3', '2011-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample4', '2012-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample5', '2013-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample6', '2014-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample7', '2015-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample８', '2016-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample９', '2017-07-26 00:00:00', CURRENT_TIMESTAMP),
(NULL, 'sample１０', '2082-07-26 00:00:00', CURRENT_TIMESTAMP);
```


```
insert into sample(
select
sample.id = NULL,
sample.data,
sample.create_date,
sample.update_date
from sample, sample sample2, sample sample3, sample sample4, sample sample5, sample sample6, sample sample7, sample sample8
);
```


## 2. スクリプトを組んで行う

@PlanetMeron さんが書いている [MySQLで大量のテストデータを作製するには？？](https://qiita.com/PlanetMeron/items/abb7171d8427c80c6df1)
にもある通りPythonなどでrandom関数などを活用して、数値も文字もランダムに生成する。


# 参考

[なんとなくやりたかった。MySQLのクエリのみで簡単に1億ものデータを作成する方法](https://liginc.co.jp/programmer/archives/2707) | LIG 勝利 さん
[MySQLで大量のテストデータを作製するには？？](https://qiita.com/PlanetMeron/items/abb7171d8427c80c6df1) | @PlanetMeron
さん


#　ぼやき

テストの時エラーになりそうなパターンカバーしたテストデータとか作れないのだろうか・・・
Rubyで複数のファイルを結合させる

こんにちは、普段は、Ruby でサーバーサイドのバッチ処理を担当している一年目のエンジニアです。
仕事をしていると、__ヘッダーが同じ複数のファイル__をまとめたいことってたまにあるんですが、(レポートファイルをまとめたり、load_data_infile 用に)その時の書き方をかんがえてみました。
バイナリベースで読み込みを行うので、基本的には、どんな文字コードのファイルでも大丈夫（なはず）です。 
僕はCSV や TSV をまとめる処理を行う際にこのメソッドを使っています。
注意点: ヘッダに改行コードが含まれている場合（そんな邪悪なファイルは触りたくない。。。）、このメソッドはうまく働かないです。
加えて、第一引数の `file_paths` に対して本来は、nil チェックやら加えたほうがいいですね。

```ruby
# @param [Array<String>] file_paths 配列でファイルパスを渡します.
# @param [Stiring] to_path 書き出す先のファイルパスを指定します.
def merge_files(file_paths, to_path)
  FileUtils.rm(to_path, force: true)
  file_paths.each_with_index do |file_path, file_i|
    open(file_path, 'rb').each_line.with_index do |row, row_i|
      next if file_i.nonzero? && row_i.zero?
      open(to_path, 'a') { |f| f << row }
    end
  end
end
```

参考 [公式ドキュメント module function Kernel.#open](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/open.html)
私的なphpでの条件分岐の使い分け

## はじめに
レビューしてる時によく突っ込んでるphpでの条件分けについてまとめてみた

## if~else
内部動作の切り分けや、すぐに処理から抜けたいときに使うイメージ

```php:サンプル
public function updateUserInfo($userId)
{
    $userInfo = $this->getUserInfo($userId);

    // 速攻抜けたいとき
    if (empty($userInfo)) {
        return false;
    }   

    // 内部動作を分けたいとき
    if ($userInfo['targetFlag']) {
        // true時の後続処理
        ...
    } else {
        // else時の後続処理
        ...
    }

    // ざっくばらんな処理
    ...

    return true;
}
```

## 三項演算子
条件により返す値を切り替える
値渡すだけが目的ならこっちでいいかなと感じる

```:書式
[条件] ? [trueの時に返す値] : [falseの時に返す値];
```

```php:サンプル
public function getFirstMessage($locale)
{
    return $locale === 'ja_JP' ? 'こんにちは！' : 'Hello!'
}
```

もちろん、返す値のところはメソッドでも問題ないです

## エルビス演算子
条件がtrueの時に結果がそのまま返され、falseだったら指定した値を返す
三項演算子と同様で、これも値返すだけの時に便利

```:書式
[条件] ?: [falseの時に返す値];
```

```php:サンプル
public function getUserName($userInfo)
{
    return $userInfo['name'] ?: 'noname';
}
```

※ 配列やオブジェクトの中身を見るときに、元の配列やオブジェクトが `null` だとnoticeが出てしまうのでエラー制御演算子(`@`)を使うか、三項演算子にしたほうがいいです。

## おまけ
よく三項演算子やエルビス演算子を使うと可読性が落ちると言われていますが、使い分けがしっかりできてたら個人的には問題ないと思うので、そこはプロジェクトの方針に合わせる形でいいでしょう。
React Native で、キーボードが出ている時に閉じずにボタンをタップしたい

これです。

```xml
<ScrollView keyboardShouldPersistTaps="always">
  <Button onPress={() => alert('Tapped')} />
  <TextInput defaultValue="Please edit me" />
</ScrollView>
```

`keyboardShouldPersistTaps="always"`

https://github.com/facebook/react-native/issues/4229#issuecomment-274453174

# 概要

![](https://cloud.githubusercontent.com/assets/1061345/11297224/9f3b33d8-8f7f-11e5-85a3-828ae988cef6.gif)

ReactNativeで、キーボードが出ている（テキスト入力中）に、画面上のボタンをタップする時、直接タップしてもキーボードが閉じて、もう一回タップしないと `onPress` が発火しないことがあり困っていました。

調べたところ、問題は `ScrollView` を使っている時です。`View` ならボタンがそのままタップされます。

`TextInput` にフォーカスが当たっている時、`ScrollView` をタップすると、自動的にフォーカスが外れる仕様っぽいです。

よって、その仕様を解除しましょう。

# 雑念

ReactNative、非常に生産性高く開発できる感はあるのですが、強いて不満を言うとすれば

- 少なくとも現状の `0.52` では仕様変更が多い。ライブラリ入れようとしても、ネイティブの要素が入ってくると容易にはインストールできないし、原因の特定が難しい。
- `FlatList` のバグが多い。
- ナビゲーションを扱うのが難しい。ナビゲーションの状態をストアで管理できないから、結局コンポーネントに直書きすることになるが、それもナビゲーションのステートに関数バインドしなければなので面倒。
    - スター数が多いから安直に `React Navigation` を入れたが、なかなか扱いが難しいので `React Native Router Flux` か `React Native Navigation` を使ったほうがいいかも。特に前者。

`react-**` が多い。
JupyterのDockerイメージでさくっとPython2+3環境を準備

# やったこと

Jupyterは公式にDockerイメージを提供しており、
環境をDockerコンテナにより一瞬で用意できます。
今回は、そのJupyterコンテナにpython2.7カーネルを追加しました。

# Jupyter

言わずもがなですが。。。

Jupyterとは、一言でいえばドキュメント共有アプリケーションです。

- 実行可能なソースコードを統合でき、インタラクティブに実行結果を確認できる
- ソースコードの実行結果などをビジュアライゼーションできる

という特長があり、一種のプログラミング実行環境と呼べる便利なツールです。


# Jupyterのカーネル

もともと、Jupyterはpythonのインタラクティブ実行環境(IPython)が出自です。
現在は様々な言語に対応しており、カーネルを追加することで
Jupyterが対応する様々な言語のnotebookを作成可能になります。

# jupyter/datascience-notebook イメージ

JupyterはDockerhubで*-notebookというイメージを公開しており
それぞれ用途ごとにインストールされているパッケージが違います。

ただ、今回使いたかったPython2.7（いまさら。。）がインストールされているイメージはなかったので
自前で対応しました。

まずは、docker-composeでさくっとJupyter環境を構築します。

```yaml
version: '2.2'
services:
  jupyter:
    image: jupyter/datascience-notebook
    ports:
      - 8888:8888
    volumes:
      - ./:/home/jovyan/work
    command: start-notebook.sh --NotebookApp.token=''
```

`--NotebookApp.token=''` とすると、Webアクセス時にパスワードもトークンも入力せずに使えます。
（非推奨なのでローカルで使うときに限った方がよいです）

Jupyterが立ち上がったら、
http://localhost:8888
にアクセスします。

そして右上の[New ▼]から、新しくnotebookを作成したら

```bash
%%bash
conda create -y -n py27 python=2.7
activate py27
conda install -y notebook ipykernel && ipython kernel install --user
```

こんな感じののnotebookを用意します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26693/8fc4c654-d1e0-f595-e3f2-dab1676a72f8.png)

そして Ctrl+Enter !
※途中の進捗が出ないので少し不安感あります。
※作成するnotebookはPython3でもなんでもいいです

そして、コンテナをrestartすれば

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26693/93645c63-d6e1-091c-25d6-8d738d6e22d4.png)

OK!

# 補足

Jupyterのnotebookでは、

```
%%bash
ls
```

と書いて、bashを実行したり、

```
!ls
```

と書いて、shを実行したりできます。
今回は（おしゃれ感もあったのでｗ）あえてこの方法でパッケージをインストールしてみました。

まあでも↑によって、LinuxコマンドなどのドキュメントもJupyterで書けるということなんで
本当に使い道が広いなと感じます。
Javaアプリの軽量コンテナイメージのつくりかた

JavaのプロダクトでDockerイメージを作る場合、`docker build`時にmaven実行してもよいのですが、時間がかかるし、runtimeで必要のないアーティファクトもダウンロードされるので、イメージが大きくなってしまいます。

そこで、CircleCIでビルドして、作ったJarをダウンロードして実行するDockerfileにすると楽ちんでビルドも速くイメージサイズも小さくすみます。

#### Uber JAR or Zipを作る

依存ライブラリも全部含めたJarを作るには以下のようにshadeプラグインを使うと簡単です。`ManifestResourceTransformer`を使ってmainClassをMANIFESTファイルに含むようにすれば実行可能Jarにもなります。

```xml:pom.xml
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>xxx.Main</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>
```

assemblyプラグイン使ってzipファイルを作ってもよいかと思います。

#### circleciの設定を書く

CircleCI 2.0はpom.xmlをキャッシュキーとしてビルドコンテナを作るので、pomを書き換えない限り、高速にビルドできます。またMavenのリポジトリはCircleCIでミラーされているので、依存ライブラリのダウンロードも高速です。

ビルドの設定は、プロジェクト直下に`.circleci/config.yml`を作っておきます。GitHubプロジェクトと連携されるときにサンプルが表示されるので、だいたいそのままで使えますが、最後にUber JARまたはZIPをArtifactにアップロードするステップ(下記例だと`store_artifacts`のところ)だけ追加します。

```yaml:.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/openjdk:8-jdk
    working_directory: ~/repo
    environment:
      MAVEN_OPTS: -Xmx3200m
    steps:
      - checkout
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "pom.xml" }}
          - v1-dependencies-
      - run: mvn dependency:go-offline
      - save_cache:
          paths:
            - ~/.m2
          key: v1-dependencies-{{ checksum "pom.xml" }}
      - run: mvn integration-test
      - store_artifacts:
          path: target/xxx-0.1.0-SNAPSHOT.jar
```

#### Dockerfieを作る

Dockerfileでは、このアーティファクトをダウンロードして実行するように書きます。

```dockerfile:Dockerfile
FROM openjdk:8-alpine

RUN apk --no-cache add curl jq

RUN curl 'https://circleci.com/api/v1.1/project/github/kawasima/xxx/latest/artifacts?branch=develop&filter=successful' \
    | jq 'map(select(.["path"] == "home/circleci/repo/target/xxx-0.1.0-SNAPSHOT.jar"))' \
    | jq '.[0]["url"]' \
    | xargs curl -o xxx.jar

RUN apk del --purge curl jq

ENTRYPOINT ["java", "-jar", "xxx.jar"]
```

最後にビルドが成功したアーティファクトのURLは、Publicリポジトリの場合、CircleCI API v1.1を使って、認証なしで取得できます。JSONからアーティファクトを特定し、URLを抜き出すのにはjqを使っています。
２０１８年度東京大学入試問題数学（理系）第１問の式を「数の帝国」でグラフにしてみた

数の帝国 - 数学ツール＞グラフ計算

https://ja.numberempire.com/graphingcalculator.php?functions=x%2Fsin(x)%2Bcos(x)&xmin=-4&xmax=4&ymin=-1&ymax=4&var=x

東進
(問題)

~~http://www.toshin.com/sokuho/univ.php?univname=%C5%EC%B5%FE%C2%E7%B3%D8&gakubuname=%CD%FD%B2%CA%B0%EC%CE%E0%A1%A2%CD%FD%B2%CA%C6%F3%CE%E0%A1%A2%CD%FD%B2%CA%BB%B0%CE%E0&kamokuname=%BF%F4%B3%D8~~

(解答)

http://27.110.35.148/sokuho/data/2018/0l/m02/m0l182101k0.html

(参考)オンライン mathematica

http://www.wolframalpha.com/input/?i=x%2Fsin(x)%2Bcos(x)
nim 演算子のオーバーロード

# 概要

* nimではc++のように演算子のオーバーロードができる
* 演算子のオーバーロードは便利だけどトリッキーな使い方をすると可読性が損なわれるので注意

## サンプルコード

* 演算子をオーバーロードする場合は`（バッククオート）で括って演算子を記述
* procで宣言して演算子を実装する
* アクセスレベルを指定することができる

```example.nim

type
  NumbersObj = object of RootObj
    number1: int
    number2: int
  Numbers = ref NumbersObj

proc echoNumbers(foo: Numbers) = 
  echo "number1: " & $foo.number_1
  echo "number2: " & $foo.number_2

proc `+=`(foo: Numbers, value: int) =
  foo.number_1 += value
  foo.number_2 += value

proc `[]=`(foo: Numbers, index: int, value: int) =
  case index
  of 0: foo.number_1 = value
  of 1: foo.number_2 = value
  else: discard


let foo = new Numbers

echo "set property"
foo.number_1 = 10
foo.number_2 = 20
foo.echoNumbers()

echo ""
echo "add value"
foo += 10
foo.echoNumbers()

echo ""
echo "set value by index"
foo[0] = 100
foo[1] = 200
foo.echoNumbers()
```

## 実行結果

```
set property
number1: 10
number2: 20

add value
number1: 20
number2: 30

set value by index
number1: 100
number2: 200
```
【Unity】Hierarchyの並び順（Sibling）を上下するショートカット

UnityのHierarchyの並び順（Sibling）を上下するショートカットを作った。
ドラッグアンドドロップでも移動は出来るが狙った位置に移動できなかったり、階層が変わってしまったりしてイラッとしていた。
ショートカットにより瞬時に移動できる。

# 使い方
Editorフォルダ内にUniSiblingChanger.csを入れる。
標準では以下にキーを割り当てている。
Ctrl(Cmd) + Shift + "＋" : 下（手前）に移動
Ctrl(Cmd) + Shift + "＊" : 上（奥）に移動

Ctrl + Shift + "－"は既にショートカットが割り当てられていた。

# コード
```csharp

using UnityEditor;
using System.Linq;

/// <summary>
/// Siblingを上下に移動させるエディタ拡張
/// </summary>
public class UniSiblingChanger : Editor
{

    /// <summary>
    /// Siblingを上げ、前方に移動する
    /// </summary>
    [MenuItem("GameObject/Set to Next Sibling %#+")]
    static void SetToNextSibling()
    {
        ChangeSibling(1);
    }

    /// <summary>
    /// Siblingを下げ、後方に移動する
    /// </summary>
    [MenuItem("GameObject/Set to Previous Sibling %#*")]
    static void SetToPreviousSibling()
    {
        ChangeSibling(-1);
    }

    /// <summary>
    /// Siblingを移動量変える
    /// </summary>
    /// <param name="count">移動量</param>
    static void ChangeSibling(int count)
    {
        var objects = Selection.gameObjects;
        if(objects == null) {
            return;
        }
        // ソート条件
        var desc = count > 0 ? -1 : 1;
        // 並び替え
        foreach(var obj in objects.OrderBy(x => desc * x.transform.GetSiblingIndex())) {
            var index = obj.transform.GetSiblingIndex();
            obj.transform.SetSiblingIndex(index + count);
        }
    }
}

```

# 仕組み
Inspectorで選択中のオブジェクトはSelection.gameObjectsで取得できる。
transform.GetSiblingIndex()で階層内の順番を取得する。
transform.SetSiblingIndex()で階層内の順番を設定する。


# GitHub
https://github.com/tetsujp84/UniSiblingChanger