OmniAICreator/Qiita-1.07M huggingface dataset:
PHPでCSVをインポートする

#はじめに
PHPからデータをインポートするモジュールを記載。備忘録。
#フロントエンド
```html
<!DOCTYPE html>
<html>
<head>
	<title>CSV取込サンプル</title>
</head>

<body>
	<form action="csv_import.php" method="post" enctype="multipart/form-data">
		<input type="file" id="csvFile" name="csvFile">
		<input type="submit">
	</form>
</body>

</html>
```
###enctype="multipart/form-data"について
これを指定しなければ添付ファイルの情報が送信できず、input type="text"なんかと同じ扱いになる模様。
[こちら（enctype='multipart/form-data'ってなんだ？）](http://mugenup-tech.hatenadiary.com/entry/2014/08/28/100910)を参考にさせていただきました。
###input type="file"のデザインを編集できないの？
できるっぽいです。ただ、デフォルトだと弄れないっぽいので、標準をdisplay: noneにしてlabelでデザインしてあげるべきだとかなんとか。

```html
<label for="csvFile">
	<span id="filename">クリックしてファイルを選択してください</span>
	<input type="file" id="csvFile" name="csvFile">
</label>

<style>
form label input[type="file"]{
	display: none;
}
form label{
	display: block;
	width: 100%;
	height: 50px;
	line-height: 50px;
	text-align: center;
	background: #DDD;
	border-radius: 5px;
}
</style>
```
ファイル名を表示させたい場合はjQueryのお世話になる感じです。

```js
$(function(){
	$("#csvFile").on("change", function(){
		var file = this.files[0];
		if(file) $("#filename").html(file.name);
	});
})
```
#サーバーサイド

```php
<?php
	$filePath = "./files/" . $_FILES["csvFile"]["name"];
	if (move_uploaded_file($_FILES["csvFile"]["tmp_name"], $filePath))
	{
		chmod($filePath, 0644); // ファイルアップロード成功
	}else{
		// ファイルアップロード失敗
	}

	$objFile = new SplFileObject($filePath);
	$objFile->setFlags(SplFileObject::READ_CSV);
	$objFile->setCsvControl("\t" /* 区切り文字 */, "\"" /* 囲い文字 */);

	foreach ($objFile as $key => $line)
	{
		foreach ($line as $buf)
		{
			$buf = mb_convert_encoding($buf, "UTF-8", "sjis-win");
			$records[$key][] = $buf;
		}
	}
	echo "<pre>";
	print_r($records);
	echo "</pre>";
	foreach (glob("./files/*.csv") as $delFile) unlink($delFile); // ファイル削除処理
?>
```
実際はこの後の処理の部分（ファイルの存在判定・CSVデータチェックetc...）が入ってきます。
###move_uploaded_fileについて
一度クライアント側ファイルをサーバー上にアップロードする必要があります。いつもお世話になっているPHPマニュアル様によると、

```php
bool move_uploaded_file (/* string */ $filename , /* string */ $destination);
```
>この関数は、filename で指定されたファイルが (PHP の HTTP POST アップロード機構によりアップロードされたという意味で) 有効なアップロードファイルであるかどうかを確認します。 そのファイルが有効な場合、destination で指定したファイル名に移動されます。
>この種の確認は、アップロードされたファイルに関して何でもできる場 合には、その内容をユーザー、または同じシステム上の他のユーザーにさえ 暴かれる可能性があるため、特に重要です。

とのことです。アップロード後、アクセス権を変更してるのはこれでなんですかね。
###SplFileObjectについて
[マニュアル](http://php.net/manual/ja/class.splfileobject.php)の量的に紹介しきれなかったので簡単に。
[この辺（【PHP】その CSV 変換、本当に「fgetcsv」でいいの？）](http://blog.fenrir-inc.com/jp/2014/07/php-csv.html)を参考にさせていただきました。

```php
$objFile->setFlags(SplFileObject::READ_CSV);
```
ここで取り込んだ行をCSVとして読み込んでいます。

```php
$objFile->setCsvControl("\t" /* 区切り文字 */, "\"" /* 囲い文字 */);
```
ここで区切り位置と、CSVファイルの囲い文字を指定しています。
Tabとカンマ、どっちにも対応する方法がないか調べてみたんですが見当たらず...力技でやるしかないのかなぁ。サンプルはTabで区切るようにしています。

#おまけ
HTML5から実装されたらしいファイルのダウンロード処理。簡単。

```html
<a href="./files/download.csv" download="download.csv">ダウンロード</a>
```
node-webshotでベーシック認証サイトのキャプチャを取得する

下記ドキュメントを見れば一目瞭然ですが、customHeaderがoptionで指定できるようになっています。 
https://github.com/brenden/node-webshot#options

```js
const options = {
  screenSize: {
    width: 720,
    height: 360
  },
  shotSize: {
    width: 720,
    height: "all"
  },
 customHeaders: {
    Authorization: "Basic base64encodedstring"
 }
};

webshot(url, outputFile, options, (err) => {
  // 省略
}
```
pythonで立てたダミーSMTP サーバーにmailxでメールを送る。

pythonを使ったダミーのSMTPサーバは以下のコマンドで簡単に起動できます。
```
python -m smtpd -n -c DebuggingServer localhost:8025
```
しかし、このサーバに対しmailxでメールを送ろうとしたところ地味に手こずったので備忘録代わりに手順を書いておきます。
mailxはsendmailまたはpostfixなどのMTAにメールを送るので
sendmailまたはpostfixのリレーサーバに上記のダミーSMTPサーバを指定すると良いです。
私の環境ではpostfixが動いていたので
/etc/postfix/main.cfに以下の設定を追加しました。
```
relayhost = [127.0.0.1]:8025
```
そしてpostfixを再起動します。
```
sudo systemctl restart postfix.service
```
これで送信
```
echo "test" | mail -v -s "test" hoge@example.com
```
ダミーのSMTPサーバにメールが届くはずです。

※localhostにメールを送った場合、設定によりますが
自分のメールボックスにそのまま入ってしまうため
ダミーのSMTPサーバに届きません。ご注意下さい。

※CentOS7環境で試しています。
C++ Builder / Indy > TStreamの送信 > WriteStream()でなくWrite()のようだ

```txt:動作環境
C++ Builder XE4
```

関連 http://qiita.com/7of9/items/9fa80d146d3fab63a71b

TClientSocketの通信切断の症状の対処としてIndyのTCP/IP通信に実装を変更している。
読込みの方は動き出した。

書込み処理が失敗しているようだ。

### 失敗例

```Unit1.cpp
    char zbuf[50] = // 何かのバイナリデータ
    for(int idx=0; idx < len; idx++) {
	IdTCPClient1->IOHandler->Write(&zbuf[idx]);
    }
```

上記の送信方法では失敗していた。
理由としてはASCIIで扱えない>=128の値が入った時の処理に関連すると思われる。

### 成功例

以下で送信できたようだ。

読込みはReadStream()というAPIがある一方、書込みはWrite()のようだ。

```Unit1.cpp
#include <memory> // for unique_ptr

...
	std::unique_ptr<TMemoryStream> strm(new TMemoryStream());
	strm->Write(pkt, len);
	strm->Seek(0, 0); // 先頭に戻る
	IdTCPClient1->IOHandler->Write(strm.get(), len);
...
```

TClientSocketでの動作と同じ通信結果が得られるようになった。
稼働中のEC2インスタンスにIAM Roleを適用する方法

2月9日に嬉しいアップデートがありましたので
サクッと検証してみました。

それまではインスタンス作成時しかRoleを適用できませんでしたが
稼働中のインスタンスでもRoleの適用や変更が可能になりました。

# 前提
・AWC-CLIのアップデート必須
・コマンドの実行にEC2とIAMの操作権限が必要
・適用するIAM Roleは作成済みです。


# AWS CLI アップデート

```bash
  $ sudo pip install -U awscli
```

# IAM Role を既存インスタンスに適用

```bash
$ aws ec2 associate-iam-instance-profile --instance-id {インスタンスID} --iam-instance-profile Name={Role名}
```

# IAM Role をインスタンスから削除
 ・「AssociationId」の確認

```bash
$ aws ec2 describe-iam-instance-profile-associations
```

・インスタンスからIAM Roleを削除

```bash
$ aws ec2 disassociate-iam-instance-profile --association-id {AssociationId}
```

# IAM Role の付け替え

```bash
aws ec2 replace-iam-instance-profile-association --association-id {AssociationId} --iam-instance-profile Name={変更後のRole名}
```



AWS Blog
[New! Attach an AWS IAM Role to an Existing Amazon EC2 Instance by Using the AWS CLI](https://aws.amazon.com/jp/blogs/security/new-attach-an-aws-iam-role-to-an-existing-amazon-ec2-instance-by-using-the-aws-cli/?sc_channel=sm&sc_campaign=rolesforrunninginstances&sc_publisher=tw&sc_medium=social&sc_content=read-post&sc_country=global&sc_geo=global&sc_category=ec2&sc_outcome=launch)
WordPress ローカルから移し替える場合の変更箇所

データベースに関しては前回の記事を参照されたし
<a href="http://qiita.com/wonda/items/ee33ec26028e52cf9336">データベースを移動するときの注意点</a>


さらに、フォルダの名前を変更した場合はWordPressディレクトリ直下の.htaccessを編集する必要があります。


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

この中のRewriteBaseとRewriteRule

/wordpress/の中身を変更したディレクトリ名に直します。

ドメインの記述は必要ありません。

<br><br><br>

<a href="http://www.online-tutor.jp/">プログラミングのオンライン個別指導　ONLINE-TUTORスタッフ</a>
postfixでのメール送信環境を自力構築する

# はじめに

　私物WindowsPCでのHyper-V+DockerでのPHP開発環境構築がうまくいったので、業務で使っているMacの開発環境もVagrantからDockerに移行させようと画策していました。
私物PCでのHyper-V+Docker環境構築で散々苦しめられたので、構築そのものは全然楽だったのですが。。

　なんと**Docker公式のCentOS7イメージにはsendmailはおろかpostfixも入っていない！！**
Vagrantには入っていたのに！！
PHPMailerのsend()が失敗するので、なんでだろうとログを調べてみて判明したことでした。

というわけで、postfixでのメール送信環境(受信は今回やらない)構築のまとめを。
…sendmailは面倒そうなので、postfixで。。

一応Dockerタグ付けてはいますが、Dockerに限らず汎用的に使えるかと思います。

※以下はCentOS7を前提とします。

# postfix導入まで
[http://www.unix-power.net/centos7/postfix.html](http://www.unix-power.net/centos7/postfix.html)
めちゃくちゃここにお世話になりました。

## インストール
作業ユーザーはもちろんroot。
docker execしてる場合は最初からrootかと思います。

標準リポジトリからinstall可能なので、yum install。

```
# yum -y install postfix
```

~~`# ls /etc/ | grep postfix`して`postfix`が表示されていればインストール完了。~~
インストール完了したかどうかの確認には、`# rpm -qa | grep postfix`の方が良いですね。
ご指摘頂いた@miyuさん、有難うございます。

## 設定
　`/etc/postfix/`にある`main.cf`というファイルが設定ファイルです。
こいつに編集を加えていきます。

上記のサイトから編集箇所を引用させて頂きます。
引用注: 下記の項目を検索して、都度下記のように書き換えていきます。
>
```bash:/etc/postfix/main.cf
myhostname = mail.unix-power.net
mydomain = unix-power.net
myorigin = $myhostname
#inet_interfaces = localhost
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.0.0/16, 127.0.0.1
home_mailbox = Maildir/
```
> 引用元: [http://www.unix-power.net/centos7/postfix.html](http://www.unix-power.net/centos7/postfix.html)

※もちろんmyhostnameや、mydomainなどは自分の値に書き換えてあげてください。
自分の場合は、私物で持っているドメインを設定してみました。

　`smtpd_recipient_restrictions`は、既存のmain.cfには記載がありません。
ただ、明示的に設定しなくても、上記サイトに掲載されているルールが適用されるらしいので、今回は記載しませんでした。

## ディレクトリの作成

> メールの保存形式はMaildir形式が主流です。
> Maildir形式では各ユーザのホームディレクトリに1通づつメールが溜まっていきます。
> 引用元: [http://www.unix-power.net/centos7/postfix.html](http://www.unix-power.net/centos7/postfix.html)

ということなので、指定のフォルダを作成します。

```
# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/
```

## postfixを有効化して開始する

```
# systemctl enable postfix
# systemctl start postfix
```

# テスト送信

　ここまでで送信自体は出来るようになっているはずなので、テスト送信をしてみます。
※ちなみに、Dockerの場合は**予め25番ポートをexpose**しておきます。

```
# sendmail 送信先メールアドレス
```
そうすると、#が消えて自由入力になります。
FromやToなどを設定します。

```
From: 送信元として設定したいメールアドレス
To: メールを送信したい先のメールアドレス
Subject: 件名
本文
本文
.
```
最終行の`.`を入力しEnterすると、メールが送信されます。
(`.`を打つまではメールの本文を入力出来る)

これが成功していれば、PHPMailerもちゃんと動きます。(確認済み)

# 最後に
　postfixやsendmailがそもそもCentOSの標準機能だと思っていたので、結構メール送信1つ取っても大変なのだと思いました。。。
Vagrantはわざわざ入れてくれているのか。。。？
nanomsgのpub/subとtornadoを使うとハマる!!(俺が



お客様(=神様)から、websocketで受け取ったメッセージをnanomsgで引きずり回したい！と言われたらそういうコードを書くしか無い、我ら受託エンジニア。

websocetとnanomsgを両方使うならtornadoで非同期コードを管理したいな、と思うのは当然至極。
nanomsgは以下のコードでソケットのfile descriptorが取れるので、これをioloopにぶち込めばnon-blockingなコードが書けてウハウハだ!!
(nanomsgのドライバにはnnpyを使っている)

```
_socket.getsockopt(nnpy.SOL_SOCKET, nnpy.RCVFD)
```



と、[こんなコード](https://gist.github.com/shnjp/34d0b493772dad7659e4b009085152de#file-test_nanornado-py)を書いてみた。(長いのでgist)

topicを指定しない場合は

```
0.001: publish> even0
0.001: on_message
0.001: subscribe> b'even0'
1.006: publish> odd 1
1.006: on_message
1.006: subscribe> b'odd 1'
2.011: publish> even2
2.011: on_message
```

うまく動く。
気を良くして、topicを'even'に指定してみると...

```
0.001: publish> even0
0.001: on_message
0.001: subscribe> b'even0'
1.005: publish> odd 1
1.005: on_message
ERROR:tornado.application:Exception in callback (<__main__.Subscriber object at 0x109f87a58>, <function wrap.<locals>.null_wrapper at 0x10a8169d8>)
Traceback (most recent call last):
  File "/Users/shn/Documents/projects/mogemoge/.env35/lib/python3.5/site-packages/tornado/ioloop.py", line 887, in start
    handler_func(fd_obj, events)
  File "/Users/shn/Documents/projects/mogemoge/.env35/lib/python3.5/site-packages/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "test_pubsub.py", line 38, in on_message
    message = self._socket.recv()
  File "/Users/shn/Documents/projects/mogemoge/.env35/src/nnpy/nnpy/socket.py", line 85, in recv
    errors.convert(rc)
  File "/Users/shn/Documents/projects/mogemoge/.env35/src/nnpy/nnpy/errors.py", line 13, in convert
    raise NNError(error_no, msg)
nnpy.errors.NNError: Operation timed out
6.013: publish> even2
6.013: on_message
6.013: subscribe> b'even2'
```

アイエエエエ!? デッドロック!? デッドロックナンデ!?
結論から言うと、tornadoの中で、SUBソケットでrecvするときにtopic指定がある場合は、DONTWAITを指定しないとブロックする。
おそらく fdのフラグが立つ > nanomsg内でrecvするもtopic違いなので捨てる > 適合topicまで待ってしまう という挙動をしているのだろう。
なので、DONTWAITを付けてrecvを呼び出して、EAGAINの場合はスキップするというコードを書かないといけない

```
    def on_message(self, *args):
        print('{:.3f}: on_message'.format(elapsed_time()))
        try:
            message = self._socket.recv(nnpy.DONTWAIT)
            print('{:.3f}: subscribe> {!r}'.format(elapsed_time(), message))
        except nnpy.NNError as exc:
            if exc.error_no == nnpy.EAGAIN:
                print('{:.3f}: subscribe> got EAGAIN. skip...'.format(elapsed_time()))
            else:
                raise
```

ioloopがpollしているから大丈夫だろうと、blockingなrecv()を呼び出すとハマって子供が寝る時間に帰れなくなるよ、というお話でした。

tornado童貞なんでもっと良い書き方あったらおしえてくだちぃ
create-react-app で TypeScript の環境を作る

[create-react-app](https://github.com/facebookincubator/create-react-app) を使用すると React 環境が自動生成できるが JavaScript のソースとなる。
TypeScript 環境にするには `npm eject` で環境を壊し、自身での設定が必要だが `--scripts-version=react-scripts-ts` オプションを付けることで TypeScript 環境の自動生成が可能だったのでそのメモ。


# インストール
```
npm install -g create-react-app
```

# プロジェクト作成
```
create-react-app my-app --scripts-version=react-scripts-ts
cd my-app
```

# 実行
```
npm start
```

http://localhost:3000/ が自動的に開き「**Welcom to React**」という画面が開けば成功。
![image](https://qiita-image-store.s3.amazonaws.com/0/164850/d4e8e600-0718-bf12-0d58-04f960dd124f.png)
WordPress さくらサーバのMySQLが5.5であるためローカルからデータベースを移行できない問題について Unknown collation: 'utf8mb4_unicode_520_ci' 

ローカルのMySQL5.6へWordPressをインストールすると
カラムによっては照合順序がutf8mb4_unicode_520_ciに設定されている。

MySQL5.5(さくらレンタルサーバー)ではこちらは使用できないため、
エクスポートしたSQL文の中で「_520」を一括選択し、削除しておく必要があります。

これにより、無事レンタルサーバにもローカルからWordPressの移行が可能になります。


具体的には
`meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,

のような箇所を

`meta_key` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

と直す必要があります。


<br><br><br>





<a href="http://www.online-tutor.jp/">プログラミングのオンライン個別指導　ONLINE-TUTORスタッフ</a>
Link > -32(0xE0)をTCP/IPで受信した時に63(0x3F)になる事象

```txt:動作環境
C++ Builder XE4
```

http://qiita.com/7of9/items/9fa80d146d3fab63a71b
において、TCP/IPの受信方法をTClientSocketからIndy使用に変更していてうまくいっていない。

問題は`-32(0xE0)`や`c-22(0xEA)`といった値が`0x3F`として受信されてしまう部分。

以下に関連しそうな記事を見つけた。
https://social.msdn.microsoft.com/Forums/en-US/411ccdeb-63c3-4fda-8a6a-f86dd1352e4a/how-to-convert-the-byte-255-to-a-signed-char-in-c?forum=csharplanguage

> For example ASCII only allows byte values < 128, anything >= 128 will be converted to a '?'. 

byteで受信した文字列をsigned charに変換しようとして失敗している。

byteで受信した文字列はそのままbyteで扱うのがいい、とのことらしい。
iOSエンジニアがAndroid開発事始め

##まえがき
4年ほどiOSエンジニアしていて、最近Android開発を始めたAndroid新米です。最初にやったオレオレな設定を書いていきます。

##Android Studio Install

下記からインストールしました。
[Android Studio](https://developer.android.com/studio/index.html)

## Android Studio 設定変更

|Editer|
|---|
|Preference -> Editor -> General -> Appearance |

このように設定しました。
![スクリーンショット 2020-05-11 19.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/08592568-512a-afd0-ded3-18a37c69f8ab.png)

###最終行は改行する
Preference -> Editor -> General -> Ensure line feed at file end on Save

![スクリーンショット 2020-05-11 12.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/c25d2de8-6baa-2480-6dea-6307e2ab77b2.png)


### キーバインド 変更

Xcode のキーバインドをDownloadする
[IntelliJ-IDEA-Xcode-Keymap](https://github.com/pitzcarraldo/IntelliJ-IDEA-Xcode-Keymap)

xmlファイル移動する  

```
$ pwd
/Users/honda/Library/Preferences/AndroidStudio3.6/keymaps
```

記事を参考にキーボードを変更します。

|タイトル|ショートカット|
|---|---|
|Backspace|Ctrl + H|
|Delete|Ctrl + D|

[Android Stuido で Ctrl + H を Backspace に割り当てる](http://takatoshiono.hatenablog.com/entry/2014/10/03/195654)


## Optional

### Genymotion Install

会員登録が必要です。
[genymotion](https://www.genymotion.com)

こちらの記事を参考にInstallとpluginを導入しました。
[Genymotion + Android Studio on Mac](http://qiita.com/Sam/items/8d551f575b617fa0be7e)


### 折りたたみ無効

Preferences -> Editor -> Code Folding

[普段使っている道具を見直す〜Android Studio編〜](http://qiita.com/shikato/items/518eb763227db8acecf0#折りたたみ機能を無効にする)

### 開かれているファイルをプロジェクトツリー上で選択状態にする

設定ボタン選択後、AutoScroll from Sourceをcheck
![スクリーンショット 2017-02-14 17.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/15703/5012563c-ef02-4f79-a886-b7ce40043b9a.png)

### シンタックスハイライトを変更
デフォルトのシンタックスハイライトがどうしても気に入らないので...テーマを変えます。

[Atom One Dark](http://color-themes.com/?view=theme&id=5925cf63cc35aa1b00dba808)

### 設定方法
https://qiita.com/i35_267/items/cac5087685884707519e
Qt で影響の少ないタスクバー登録回避方法

#前提
今、Linux 上で Qt と C++ の勉強を開始したばかりです。Cの経験はありますが、Xアプリの経験はほとんどありません。
ディストリのKDEがQt4のようなので、Qt4で使っています。
(「grep libqt /proc/*/maps 2>/dev/null  | grep qt4」は表示されたけれど、「grep libqt /proc/*/maps 2>/dev/null  | grep qt5」は表示されませんでした。)

Qt5はまだ未経験です。
なお、Qiita初投稿なので、不備があったらスミマセン。

#困ったこと
次のようなアプリを作成中。
1.表示させるのはTreeView だけを持ったウィンドウ
2.タスクバーに登録しない
3.TreeViewにフォーカスをあてて起動する
4.フォーカス・アウトを検知する

1.は色々ありましたが問題なくできました。2.3.4.もそれぞれ単体なら何とかできました。
しかし、2.3.4.を同時に満たす方法が分かりませんでした。

2.を実現するために、setWindowFlags()で、「Qt::Popup」を指定した場合、他にフォーカスを移せないようで、4.が実現できません。

では、と「Qt::Tool」や「Qt::ToolTip」を指定すると、TreeViewにフォーカスが当たらない状態で起動してしまいます。ダメ元でsetFocusPolicy(Qt::StrongFocus)をしてみても、変わらず。

闇雲にほかも試してみました。「Qt::Desktop」を指定した時はびっくりしました。
Xアプリの基本が分かっていないのですが、詰んでいました。

#自分なりの解決策
仕方がないので、2.をQtではなく、X11の機能で実現する方法を調べて、ようやく解決です。
次のような関数を登録して使えば良いようです。
```
bool hoge_class::skipTaskbar(void){
	QX11Info	 xinfo		= x11Info();
	Display 	*display  	= xinfo.display();		// デフォルトディスプレイ
	Atom 		 win_type 	= XInternAtom(display, "_NET_WM_STATE", false);
	Atom 		 value 		= XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", false);
	Status 		 status 	=
			XChangeProperty( 	display,winId(), 
								win_type, 
								XA_ATOM, 32, PropModeReplace,
								(unsigned char *) &value,1);
	return true;
}
```
エラー処理は省略しています。
show()の直前に呼び出すようにしてみた所、setWindowFlags()で「Qt::CustomizeWindowHint | Qt::Widget」を指定しても、タスクバーに登録されず、TreeViewにフォーカスが当たった状態で起動され、フォーカスアウトも検知できました。

単純にタスクバーに登録させないAPIがQtに用意されていれば何の問題も無かったと思うのですが、なんとか解決しました（実はあるのかも知れません...）。

winId()関数を見つけられずに、appRootWindow()がそれだと思い込み、結果はまった事は内緒です。
ReactでHTML文字列をDOM要素として描画するコンポーネント


render内からpropsにhtmlの文字列を指定すると、DOM要素に変換してくれるReactコンポーネント。
`dangerouslySetInnerHTML`を使用すれば、html文字列をDOM要素に変換してくれる。


```
const HTMLComponent = (props) => {
	return(
		<span dangerouslySetInnerHTML={{__html: props.htmlstring}}></span>
	);
}
```
ffmpegで動画のスプライトシートを生成する

動画ファイルからパラパラ漫画用のスプライトシートを生成する方法です。
いつもやり方を忘れてしまうので備忘のため。

![スプライトシートのサンプル](https://qiita-image-store.s3.amazonaws.com/0/36521/9ca81f4b-8143-8f13-8c87-f210d6ce2c16.jpeg)


## コマンド
```bash
ffmpeg -i /path/to/movie.mp4 -vf fps=12,scale=600:-1,tile=24x1 -an -vsync 0 -qscale 2 -qmin 1 -qmax 5 ./sheets/%0d.jpg
```

~~※ jpg出力だと画質が著しく悪くなる可能性があるのでpng出力のが良いかも。~~

### 追記
`-qscale` オプションでjpgの画質設定が可能。詳しくは後述。

## `-i` オプション
入力ファイル。
素材となる動画ファイルを指定する。

## `-vf` オプション
ビデオフィルター。
エンコード時にかける効果を指定する。

### `fps` フィルター
1秒間あたりのフレーム数を指定する。

```bash
# 例） 秒間12フレーム
fps=12
```

### `scale` フィルター
1フレームあたりの画像サイズを指定する。

```bash
# width:height の書式で明示的にサイズを指定
scale=1920:1080

# 片方を `-1` にすると、もう片方の値と元の動画ファイルのアスペクト比にしたがって計算される
scale=600:-1
```

### `tile` フィルター
`fps` フィルターで指定した値にしたがって動画中のフレームをタイル状に並べる。

```bash
# 例）横24枚・縦1列に並べる
tile=24x1

# 例）横8枚・縦3列に並べる
tile=8x3
```

## `-qscale` `-qmin` `-qmax` オプション
エンコードの品質を設定する。
数値が小さい方が高品質。
`-qscale 2` で80%ぐらい？
最大値は `31`
`2` 〜 `5` ぐらいがちょうどよさげ。

```bash
# 平均品質を `2` として 最小を `1` 最大を `5` とする
-qscale 2 -qmin 1 -qmax 5
```

## その他のオプション
- `an` オプション： 音声を取り除く
- `vsync` オプション： おまじない
「アプリ名には、キーワードや記述子が含まれています」で、Rejectされたった



アプリ名のストア表示部分を　「アプリ名〜して〜を〜するアプリ」
のようにして、ストアで並んでいる際、パッと見でどんなアプリかわかりやすくするために説明を補足してたらrejectされました。

以下、Apple様からの通達。

```
Performance - 2.3.7 Your app name to be displayed on the App Store includes keywords or descriptors, which are not appropriate for use in
```

```
パフォーマンス -  2.3.7 App Storeに表示されるあなたのアプリ名には、キーワードや記述子が含まれています。
```


[guidline link]: https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_Jpn/Chapters/FirstSteps.html

[ガイドライン][guidline link]のアプリ名の選択のところにも確かにこう書かれてます。

```
・できるだけシンプルにする。 
説明文のような記述をアプリケーション名に付加しないでください。たとえば「My Weather - real-time radar, temperature, wind and cloud patterns」は長すぎます。単に「My Weather」とした方がよいでしょう。説明を記述する箇所は別にあります。
```

担当者によっては審査通過しますが、ガイドラインには沿ってないのでリジェクト理由にはなります。

一昔前までは、アプリ名のところにできるだけキーワード入れろってASO対策がありましたし、未だに説明が長めのはありますが、キーワードっぽいの入れずに、一言くらいにまとめた方が良さそうですね。


## While the icing on the cake
ストアの説明文ってあまり読まれないから、みんなアプリ名のところに説明入れるんですよね。

アプリ名はAppStoreでスクロールしてるだけで目に入りますし。

アプリ名が機能を表していれば説明はいらないと思うのですが、アプリ名の9文字以内で機能説明は難しいし、アプリ名を「写真を加工」とかにすると他との差別化ができない...

個人的にはAWAとかB612みたいなアプリ名は好きですし、アプリ名って呼びやすさ重視とか、あまり機能的な意味は含めないとかありますよね。

そう考えながら参考を探していたら、みずほ銀行が出しているPairってアプリが面白いと思いました。
「みずほ銀行　ペア口座アプリ~Pair~」
「ブランド名　説明~アプリ名~」という構成になってて、
みずほ銀行が出してる口座アプリだよって、ユーザに必要な情報を前に出してていいなと思いました。
これならアプリ名をユーザに押し付けないなと。

ただ、これができるのは企業ブランドがしっかりしているからこそなので、個人で出す時などには使えない...

なので、長い説明が使えなくなった現状、「短い説明-アプリ名」の構成が割りといいなと思ってます。
渋谷LT2/8

##今日のLT
プレゼンター:吉田さん
SESのバウンス対策について
<iframe src="//www.slideshare.net/slideshow/embed_code/key/uqXzisP3K0v5Qt" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/secret/uqXzisP3K0v5Qt" title="吉田Lt 20170208" target="_blank">吉田Lt 20170208</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kumaco">kumaco</a></strong> </div>

プレゼンター：亀田さん
CSSのデザインでよく遭遇する問題とその解決法
<iframe src="//www.slideshare.net/slideshow/embed_code/key/21DSwFvpkt53BT" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/secret/21DSwFvpkt53BT" title="亀田Lt 20170208" target="_blank">亀田Lt 20170208</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kumaco">kumaco</a></strong> </div>


##ゼロから作るDeep Learning第五回
話題はついに学習方法について
###今日のメモ
ニューラルネットワーク・ディープラーニングは人の介入が極力行われない
機械学習とディープラーニングの違い：特徴量を必要とするか否か
学習するときに特定のデータセットのみを学習させた場合他のデータセットに対応できないという状態を過学習と呼ぶ
損失関数：
ニューラルネットワークが最適なパラメータを探索するために指標とするもの。性能の悪さを示す指標。
注：良いところを増やしても終わりがないが、悪いところは減らした結果ゼロになるので計算しやすいために性能の悪さを指標とする

ニューラルネットワークの学習の際に、認識精度を“指標”にしてはいけない。 その理由は、認識精度を指標にすると、パラメータの微分がほとんどの場所で 0 になってしまうからである。
＊正解したときに0を出力ではなく、間違えたときにどれだけ違うのかが出力された方が性能がわかりやすい

###感想
やっと難しい数学の話から概念的な話に戻って来た、こっちの方がまだ理解ができる。
この勉強会を身のあるものにするためにせめて概念的というか理論的な内容は押さえておきたいところ。
Atom パッケージを導入とGitkrakenとは

# ATOM very useful and GUI editor

![atom.png](https://qiita-image-store.s3.amazonaws.com/0/164538/5b068845-561c-3584-809d-01ba75afd006.png)


I am sharing my Atom editor packages for Ruby on Rails development
You can export and import your packages with the following commands. 
Package List

You use the following:

```bash

apm list --installed --bare > package-list.txt

```

to create your package list and then 

```bash

apm install --packages-file package-list.txt

```

to install them.

Here are my packages
For import: Copy to the text file and use above's command.

```text
atom-beautify@0.29.17
auto-detect-indentation@1.3.0
autoclose-html@0.23.0
autocomplete-paths@1.0.5
autocomplete-plus@2.34.2
browser-plus@0.0.87
docblockr@0.9.1
emmet@2.4.3
file-icons@2.0.15
file-types@0.5.5
git-control@0.8.2
git-history@3.2.0
git-log@0.4.1
git-plus@7.0.7
git-time-machine@1.5.4
highlight-column@0.5.2
japanese-wrap@0.2.7
language-haml@0.24.1
linter@1.11.18
linter-coffeelint@1.2.1
linter-erb@1.0.3
linter-htmlhint@1.3.1
linter-js-yaml@1.2.6
linter-jshint@3.0.2
linter-rubocop@0.5.3
linter-ruby@1.2.4
linter-scss-lint@3.0.4
linter-slim@1.0.0
local-history@4.0.1
minimap@4.25.7
navigate@0.1.17
pigments@0.37.0
pretty-json@1.6.1
project-manager@3.3.3
rails-i18n-autocomplete@0.4.0
rails-open-rspec@1.2.0
rest-client@1.3.1
ruby-define-method@0.2.2
ruby-slim@0.2.0
symbol-gen@1.3.1
tabs-to-spaces@1.0.3
tree-view-git-status@1.3.0

```


# RSENSE

Ruby on Rails code library documentation tool. 

```bash

gem install rsense
start rsense
```

# GITKRAKEN

![gitkraken_icon.png](https://qiita-image-store.s3.amazonaws.com/0/164538/4f287170-7eaf-d72d-070f-5554f1e1479e.png)

Very useful GUI based GIT REPOSITERY application. Forget about commands. Also, you can use code merge tool as default gitkraken merge tool.

### Don't spend time for search commands!!!.
VisualStudioCode で MayaPython 向けの環境を構築してみる

#はじめに

Maya のスクリプトエディタがおまけ程度なので Visual Studio Code を使って MayaPython を書く環境ができないか模索してみた。


#手順

##インストール
###Visual Studio Code
まずは [Visual Studio Code](https://www.visualstudio.com/ja-jp/products/code-vs.aspx) をインストール。持ってる場合はもちろん省略。

###Python
Visual Studio Code には、Python 開発に便利な機能をまとめた
[Python](https://marketplace.visualstudio.com/items?itemName=donjayamanne.python) というエクステンションがあるのでインストールする。

Visual Studio Code 上で F1 を押して下記を入力してインストールする。

```
ext install python
```

###MayaPort
続いて Visual Studio Code で入力したスクリプトを Maya に送って実行する
[MayaPort](https://marketplace.visualstudio.com/items?itemName=JonMacey.mayaport) というエクステンションがあるのでインストールする。

```
ext install mayaport
```

##MayaPort の設定
まず先に MayaPort の設定を行う。自分は Python ファイルで作ったが、下記のファイルを用意する必要がある。

```userSetup.mel
commandPort -name "localhost:7001" -sourceType "mel" -echoOutput; 
commandPort -name "localhost:7002" -sourceType "python" -echoOutput;
```
```userSetup.py
import maya.cmds as cmds

cmds.commandPort(name=":7001", sourceType="mel")
cmds.commandPort(name=":7002", sourceType="python")
```

ファイルが用意できたら、下記の場所に userSetup ファイルを置く。
念のため Visual Studio Code は再起動する。準備はこれで完了。

```
Windows: <drive>:\Documents and Settings\<username>\My Documents\maya\<Version>\scripts
MacOSX: ~/Library/Preferences/Autodesk/maya/<version>/scripts.
Linux: ~/maya/<version>/scripts.
```

##MayaPort の動作確認

Maya を起動したのち Visual Studio Code に戻り、以下のようなテストファイルを用意する。
 
```connect_test.py
print "connected!"
```

F1 を押してコマンドパレットを開き、以下を入力して MayaPort を起動する。

```
mayaPort
```
これで準備スクリプトを送る準備が完了。あとはコマンドパレットの場合は以下を入力する。
※ショートカットキーによる実行も可能。それも併記する。

#### Python の場合
```
コマンドによる実行
sendPythonToMaya

ショートカットによる実行
CTRL+SHIFT+P (Mac)  ALT+SHIFT+P (Win)
```

#### MEL の場合
```
コマンドによる実行
sendMelToMaya

ショートカットによる実行
CTRL+SHIFT+M (Mac)  ALT+SHIFT+M (Win)
```

![vsc_mp_1.png](https://qiita-image-store.s3.amazonaws.com/0/56504/eb934342-f219-cc5d-3d0d-67fc2ab271f9.png)


##Python の設定

Python の設定を2つ変更します。

```
// 既定の設定を上書きするには、このファイル内に設定を挿入します
{
    "python.pythonPath": "/Applications/Autodesk/maya2015/Maya.app/Contents/bin/mayapy",
    "python.autoComplete.extraPaths": [
        "/Applications/Autodesk/maya2015/devkit/devkit/other/pymel/extras/completion/py"
    ]
}
```

####python.pythonPath
Python コマンドのパスを指定する。

```
MacOSX: /Applications/Autodesk/maya2015/Maya.app/Contents/bin/mayapy
```

####python.autoComplete.extraPaths
オートコンプリートに使うファイルの指定。これを設定することでMayaのコマンドに候補が表示されるようになる。

```
MacOSX: /Applications/Autodesk/maya2015/devkit/devkit/other/pymel/extras/completion/py
```




##MayaPort の動作確認
ただし maya.cmds の候補表示に時間がかかる... おそらく上記のディレクトリにある maya.cmds のファイルが異常に大きいためっぽい。

![vsc_mp_2.png](https://qiita-image-store.s3.amazonaws.com/0/56504/b6080adf-66cf-e16a-8f47-2ad81e36a0c5.png)
Maya を 英語UI で起動する

#はじめに

アトリビュートの確認や英語サイトを参考にするべく、一時的に Maya を英語版で起動するのがとても便利だったのでまとめておく。

#手順

## 実行コマンドの作成

まず実行コマンドを作成する。下記の例は 2017 の場合に限る。
maya のバージョンによって "maya2017" の部分を差し替えるとよい。

**Windows**

```bash:Maya2017_en.bat
SET MAYA_UI_LANGUAGE=en_US
"C:¥Program Files¥Autodesk¥Maya2017¥bin¥maya.exe"
```

**Mac**

```bash:Maya2017_en.command
export MAYA_UI_LANGUAGE="en_US"
/Applications/Autodesk/maya2017/Maya.app/Contents/bin/maya
```

## 実行権限の付与
必要であれば実行権限を変更する。

**Mac**

```
chmod +x ./Maya2017_en.command
```

## 起動
作成した実行ファイルをダブルクリックすると Maya の英語版が起動する。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/56504/b8f1a9f9-37c7-3026-ab0d-35e95a6bbf19.png)
Railsでprepared statementsの重複エラーが発生する

# 問題：Herokuで運用中のRailsアプリが500エラー

これまで特に問題のなかったRailsアプリがいきなり500エラーを出したり出さなかったりするようになりました。`heroku logs --app app-name -t`で観察していたら、prepared statementの重複が発生しているというログが出ていました。

## 原因：rack-timeoutが発動するとこうなる？

古い情報ですが、rack-timeoutが発動すると、こうなる場合があるらしいです。

- [Rails 3.2 frequent postgres prepared statement already exists errors](http://stackoverflow.com/questions/24458105/rails-3-2-frequent-postgres-prepared-statement-already-exists-errors)

prepared statementの名前はインクリメントされながら登録されていくのですが、新しいprepared statementが登録された後、使われる前にrack-timeoutによって殺された場合にインクリメント済みであることが周知されず、同じ数値でまた登録しようとしてしまい、エラーになるようです。

## Rails本体のPRを見る

- [Fix #1627: prepared statement pool can be corrupted by exception #17607](https://github.com/rails/rails/pull/17607)

この件については、複数のPRで結構話し合われているようです。
ただ、結論としては「`Rack::Timeout`による不具合なのだからRails側で対応するつもりはない」という感じでした。`Rack::Timeout`のコールバックなどを使って綺麗にすればいいという話のようです。

また、「prepared statementsを使わない設定にすればいいじゃない？大したオーバーヘッドでもないんだし」という意見もPRの議論の中にありました。デフォルトで使う設定だったのでその発想はなかった！

## 解決策(その1)prepared statementsを使わない設定にする

今回は、prepared statementsを使わない設定に変えてみました。

### ローカル環境編

database.ymlを編集し、`prepared_statements: false`を追加します。

```yml:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  prepared_statements: false
  
development:
  <<: *default
  database: hoge_development
  host: localhost
  
test:
  <<: *default
  database: hoge_test
```

### Heroku環境編

Herokuではアプリケーションサーバにunicornを使っているので、その設定を追加します。`config['prepared_statements'] = false`です。

```rb:config/unicorn.conf.rb
after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    config = ActiveRecord::Base.configurations[Rails.env] ||
        Rails.application.config.database_configuration[Rails.env]
    config['prepared_statements'] = false
    ActiveRecord::Base.establish_connection(config)
  end
end
```

### 注意！必ずテストすること！

これですが、設定をすれば何の問題もなくOK!というものではなく、Arelを使っているgemなどがある場合、エラーがガンガン起きたりしたので、必ず動作検証しましょう！

## 解決策(その2)※未検証 rack-timeout側で解決する

rack-timeout側で掃除する方法も考えついたので一応書いたのですが、~~動作検証する方法がわからなかったので、実は適用していません。~~2017-02-20追記 コメントで、いい方法を伺ったので、それを適用してみました。

rack-timeoutのバージョンは0.4.2です。

```rb:config/initializers/rack_timeout.rb
if defined?(Rack::Timeout)
  Rack::Timeout.service_timeout = 20
  Rack::Timeout.unregister_state_change_observer(:logger)

  Rack::Timeout.register_state_change_observer(:prepared_statements_clean) do |env|
    case env[Rack::Timeout::ENV_INFO_KEY].state
      when :ready
        env['rack-timeout-prepared-statements-clean'] = false
      when :timed_out
        env['rack-timeout-prepared-statements-clean'] = true
      when :completed
        if env['rack-timeout-prepared-statements-clean']
          # 再接続することで以前のprepared statementsのキャッシュを一掃する
          ActiveRecord::Base.connection.reconnect!
          # 以下の方法だと、重複しているprepared statementsだけが残ってしまうので意味がなかった…
          # ActiveRecord::Base.connection.instance_variable_get(:@statements).clear
        end
    end
  end
end
```

~~prepared statementsの情報は、それぞれのコネクションの`@statements`に蓄積されていくので、`Rack::Timeout`の処理が完了したタイミングでclearするようにしてみています。~~

これでいいのか、アドバイスが聞きたいので、もしおわかりになる方がおられましたら、コメントお願いします！

## まとめ

そもそもrack-timeoutが発動するような時間のかかる処理を減らしていくべきである、というのが正解だとは思います…。
MWS 商品のMerchant FBA 切り替え

## 何をやろうとしている？
MWSでマケプレで売ってる商品をFBAにぶっこんだり、その逆をやったりする。

# どのオペレーションを使う？
**オペレーション**：[SubmitFeed](http://docs.developer.amazonservices.com/ja_JP/feeds/Feeds_SubmitFeed.html)
**FeedType**：在庫フィード（[_POST_INVENTORY_AVAILABILITY_DATA_](http://docs.developer.amazonservices.com/ja_JP/feeds/Feeds_FeedType.html)）

# マケプレ→FBA

```xml:changeAFNFromMFM.xml
<?xml version="1.0" encoding="utf-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
    <Header>
        <DocumentVersion>1.01</DocumentVersion>
        <MerchantIdentifier>{$token}</MerchantIdentifier>
    </Header>
    <MessageType>Inventory</MessageType>
    <Message>
        <MessageID>{$i}</MessageID>
        <OperationType>Update</OperationType>
        <Inventory>
            <SKU>{$sku}</SKU>
            <FulfillmentCenterID>AMAZON_NA</FulfillmentCenterID>
            <Lookup>FulfillmentNetwork</Lookup>
            <SwitchFulfillmentTo>AFN</SwitchFulfillmentTo>
        </Inventory>
    </Message>
</AmazonEnvelope>
```

必須項目（Inventory要素の中の話）

* SKU

* SwitchFulfillmentTo

* FulfillmentCenterID

* Lookup


# FBA→マケプレ

```xml:changeMFNFromAFM.xml
<?xml version="1.0" encoding="utf-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
    <Header>
        <DocumentVersion>1.01</DocumentVersion>
        <MerchantIdentifier>{$token}</MerchantIdentifier>
    </Header>
    <MessageType>Inventory</MessageType>
    <Message>
        <MessageID>{$i}</MessageID>
        <OperationType>Update</OperationType>
        <Inventory>
            <SKU>{$sku}</SKU>
            <Quantity>{$qty}</Quantity>
            <SwitchFulfillmentTo>MFN</SwitchFulfillmentTo>
        </Inventory>
    </Message>
</AmazonEnvelope>
```

必須項目（Inventory要素の中の話）


* SKU

* SwitchFulfillmentTo

* Quantity

<br><br>
切り替え先によって必須項目が変わってくるんだなあ
理系が使ってもそれほど怒られないグラフをExcelで

*（Excel for Mac 2011 で動作確認しています。）*
 
自分の持ってるExcelが色々とポンコツすぎてめげそうです。前回の記事でも**影が消せない**とわめき散らしたのですが、要するにバージョンが合ってないんだと思います。ExcelVBAで想定しているグラフのプロパティが、うちのExcelには当てはまらない、ということが多いのだと思います。

けど現実問題として、VBAを美しくすることじゃなくて、グラフを美しくすることを優先したいわけです。

というわけで基本のグラフ設定からです。

##1 ファイルの準備
・新しいExcelブックに、お好きな散布図を作ります。散布図にも種類があるかもしれないですが、一番シンプルな無印の散布図がよいと思います。
・「名前を付けて保存」から「マクロ有効ブック」の形式で保存します。
 
##2 マクロの準備
・Excelの開発タブを表示します。やり方はGoogleに聞くと良いです。
[Windowsの場合](https://www.google.co.jp/search?q=Excel+%E9%96%8B%E7%99%BA%E3%82%BF%E3%83%96%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B+Windows) [Macの場合](https://www.google.co.jp/search?q=Excel+%E9%96%8B%E7%99%BA%E3%82%BF%E3%83%96%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B+Mac) [古いExcelの場合](https://www.google.co.jp/search?q=Excel+visual+basic+%E3%83%84%E3%83%BC%E3%83%AB%E3%83%90%E3%83%BC%E3%82%92%E8%A1%A8%E7%A4%BA)
・開発タブの「エディター」を押してVisual Basic Editorを開きます。
・「挿入」から「標準モジュール」を選びます。
<img width="178" alt="moduleadd.png" src="https://qiita-image-store.s3.amazonaws.com/0/26164/a682fd59-30b9-beda-9ec0-f19ecb7aa46a.png">

・現れた「Module1」をダブルクリックします。
<img width="224" alt="module1.png" src="https://qiita-image-store.s3.amazonaws.com/0/26164/63ab8b8b-9a52-3ae8-8687-955d25b8f5c1.png">


・現れたエディタに以下のプログラムをコピペします。

```

Sub SimpleGraph()
' 散布図を作成し、選択した状態で実行してください。
' 動作確認環境：Excel fo Mac 2011 散布図＞散布図（オプション無し）

    With ActiveChart

    .ChartArea.Height = 480
    .ChartArea.Width = 600
    .PlotArea.Height = 380
    .PlotArea.Width = 480
    .PlotArea.Top = 50
    .PlotArea.Left = 50
    .ChartArea.Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
    .PlotArea.Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
    .Axes(xlCategory).HasMajorGridlines = False
    .Axes(xlValue).HasMajorGridlines = False
    .Axes(xlCategory).MajorTickMark = xlTickMarkNone
    .Axes(xlValue).MajorTickMark = xlTickMarkNone
    
    End With

End Sub
 
```

##3 マクロの実行
・シートに戻り、グラフの外枠をクリックして選択状態にします。
・開発タブの「マクロ」を押し、SimpleGraphを選択して、「実行」を押します。

実行前
<img width="358" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/26164/663369a6-0672-de15-743d-dcd7f4adf537.png">

実行後
 <img width="619" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/26164/be4679ea-e836-cec4-b5b3-a4a5a9f7305a.png">

##4 設定を変えたいときは
・開発タブの「エディター」を押してVBAエディタを開き、マクロの中身を確認します。
・数値などを書き換えてください。
・その後、シートに戻り、グラフの外枠をクリックして選択し、開発タブの「マクロ」を押します。SimpleGraphを実行します。

思い通りの見た目になるまで繰り返します。

##5 さらに整えたいときは 
随時、以下の機能を実現するマクロを作る予定です。
・軸の名前を表示する
・キャプションを表示する
・軸のスケールを変える
・特殊な軸を設定する
・マーカーの見た目を変える
・近似曲線を追加する

##6 お急ぎの場合
・ひとまず手動で必要なものを追加します。
・その後、個々のアイテムをクリックして選択状態にし、今度は右クリックします。現れたメニューから書式設定を開きます。
・好きな設定を行ないます。

マーカーの色と形は「自動」ではなく自分の好きなものを選び、枠線、影などはすべて「なし」を選ぶと綺麗です。

軸のテキストのフォントを英語フォントに変え、フォントサイズを少し大きくすると綺麗です。
スケールの桁数も選べます。（「0」→「0.00」など）

軸の最大値と最小値は「自動」ではなく自分で設定すると捗るかもしれません。
反転した軸や対数軸も選べます。さらに、軸の交点を左下以外にすることもできます。

##7 今後の展望
早めに続きを書きます
Arduino IDE 1.8系でArduino M0を使うための設定

Arduino界の関が原の戦い（[Arduino LLC](https://www.arduino.cc/) vs [Arduino SRL](http://www.arduino.org/)）が無事和睦となり、我々が使うArduino IDEもバージョン1.8.0から統合されました。

※Arduino界の分裂についてはこちらの記事「[Arduinoの内部分裂について | スイッチサイエンス マガジン](http://mag.switch-science.com/2015/04/07/arduino-v-arduino/)」をどうぞ

このバージョン1.8.0では大きな変更が多々あり、いろいろ影響が出ています。

その中でも、Arduino M0・Arduino M0 ProがIDEをインストールした時点で選択できない（メニューに表示されていない）ので、そこら辺を解消する方法を備忘録として残しておきます。

# Arduino M0・Arduino M0 Proは別途ボードデータのインストールが必要

Arduino IDEバージョン1.8.0から、Arduino M0・Arduino M0 Proのボードデータは別途インストールが必要になりました。

Arduino IDEのメニューから[ツール]→[ボード]→[ボードマネージャ]を選択してボードマネージャーを開きます。使用したいボード（ここではArduino M0・Arduino M0 Pro）を検索し、検索にヒットしたボードデータをインストールします。これで従来通り、[ツール]→[ボード]でArduino M0・Arduino M0 Proを選択できるようになります。

![スクリーンショット 2017-02-13 16.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/55103/aecfc527-e9bf-abed-b1a9-550848792b2b.png)

この他にも変更点がわんさかあるので、それは別途記事としてまとめたいと思います:bow_tone1:
fluentdのdocker imageでfluent-plugin-bigqueryを動かす

ただfluentdのdocker imageにfluent-plugin-bigqueryをインストールしただけで`docker-compose run fluentd` すると以下のエラーが起きてfluentdが起動しません。

```
2017-02-14 02:06:20 +0000 [info]: starting fluentd-0.12.31
2017-02-14 02:06:21 +0000 [info]: gem 'fluent-mixin-config-placeholders' version '0.4.0'
2017-02-14 02:06:21 +0000 [info]: gem 'fluent-mixin-plaintextformatter' version '0.2.6'
2017-02-14 02:06:21 +0000 [info]: gem 'fluent-plugin-bigquery' version '0.4.0'
2017-02-14 02:06:21 +0000 [info]: gem 'fluent-plugin-buffer-lightening' version '0.0.2'
2017-02-14 02:06:21 +0000 [info]: gem 'fluent-plugin-td' version '0.10.29'
2017-02-14 02:06:21 +0000 [info]: gem 'fluentd' version '0.12.31'
2017-02-14 02:06:21 +0000 [info]: adding match in @mainstream pattern="docker.**" type="stdout"
2017-02-14 02:06:21 +0000 [info]: adding match in @mainstream pattern="**" type="file"
2017-02-14 02:06:21 +0000 [info]: adding match in @mainstream pattern="bigquery.**" type="bigquery"
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- bigdecimal/util (LoadError)
	from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
(中略)
2017-02-14 02:06:21 +0000 [info]: process finished code=256
2017-02-14 02:06:21 +0000 [warn]: process died within 1 second. exit.
```

`cannot load such file -- bigdecimal/util` と言われていることより、どうやらbigqueryがいないと思われます。

fluent-plugin-bigqueryのissueを見ると全く同じ症状のものがありました。

https://github.com/kaizenplatform/fluent-plugin-bigquery/issues/106

結論的には、fluentdのdocker imageで使われているalpineがイメージ容量削減のためruby-bigdecimalを組み込んでいないことが原因のようです。ここでfluentdのdocker imageのリポジトリを見たらこの問題に関連したPRがありました。

https://github.com/fluent/fluentd-docker-image/pull/31

これはfluent-plugin-bigqueryを動かそうとしたらbigdecimalで怒られるから追加したよ、というPRですが、closeされています。理由を見たらやはりイメージの容量を増やしたくないそうです。fluent-plugin-bigqueryがActiveSupportに依存しており、これがbigdecimalを使うから必要であって、そもそもActiveSupport依存は良くないのでfluent-plugin-bigquery側の問題である言及されています。

## 解決方法
fluentdのDockerfileでruby-bigdecimalをインストールするようにします。

ちなみに`docker-compose build`して `docker-compose run fluent`するとUnknown output plugin 'bigquery'って言われたのは以下より解決しました。
https://github.com/fluent/fluentd-docker-image/issues/21

Dockerfileは以下のようになりました

```
FROM fluent/fluentd
COPY fluent.conf /fluentd/etc/
USER root
RUN apk --no-cache --update add ruby-bigdecimal
USER fluent
RUN gem install fluent-plugin-bigquery
```

これで無事に動きました。
kintone 宿泊施設予約管理の試作

kintone で、宿泊施設の予約管理が出来ないか？という案件があったので、試作しました。
案件自体が無くなったので、覚書としてメモしておきます。

# 試作アプリの予約一覧画面


![2017-02-14_09h09_35.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5991d723-40c5-02d4-a1f1-8c76af2819d7.png)

- 複数の施設・部屋の予約対応
- 部屋の情報と現在の状態（清掃、チェックインなど）表示
- 日単位の予約　午後にチェックイン、午前にチェックアウトの前提
- ドラッグで予約を移動
- クリックで編集画面に遷移



# 予約操作例

![2017-02-14_09h25_11.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/756f8396-0f03-e1dc-335a-008f3f61c805.gif)

予約編集を、kintone 標準の編集画面で行っているが、少し使いにくい感じがする。
ダイアログ表示で、必要な項目のみメンテ出来るほうが手軽に使えそう。



# 使用したライブラリ

[FullCalendar](https://fullcalendar.io/scheduler/) の scheduler 

本番運用で使用する場合は、ライセンスの購入が必要


# 他のスケジューラ

予約管理に使えそうなライブラリを探してもなかなか無い

- [DayPilot for JavaScript Scheduler](https://javascript.daypilot.org/scheduler/)
- [dhtmlxScheduler ](https://dhtmlx.com/docs/products/dhtmlxScheduler/sample_timeline.shtml)
TomcatでJSP

#はじめに
Webアプリケーション開発の手始めに、ローカル環境でJSPを動かしてみたいと思いました。
環境構築に手間取ったので備忘録代わりにメモ。

#やりたかったこと
+ Javaを使ってWebページを出力してみたかった
+ まずはJavaとPHPの違いに慣れてみたかった

#JSP？Servlet？
どうやらJavaはPHPと違い、クライアント側を描画するJSPとサーバー側の処理をするServletに分かれている模様。

>サーバ側で動作するJavaアプリケーションを作成するにはサーブレットやJSPを使います。サーブレットとJSPは基本的に同じことを行いますが、サーブレットはJavaプログラムと同様に作成するのに対し、JSPはPHPのようにスクリプト言語のような記述します。そこで画面表示部分の作成にはJSPが適しており、データベースとの接続などバックエンドで動く部分はサーブレットで作成するのが適しています。
[サーブレット(Servlet) / JSP入門](http://www.javadrive.jp/servlet/)

PHPとは違う部分ですね。
とは言えこのご時世、JSPを直に触る機会なんてほとんどないんだろうなぁ…。
[この辺（2015年のJavaによるWeb開発）](http://qiita.com/icoxfog417/items/c14c6b0b339aca7d259c)を読んで勉強しないとなー。

#環境構築
どうやらWebコンテンツは基本的にApacheさんがやってくれるものの、JSP/Java Servletを実行するためにはTomcatさんの力が必要みたいです。
その辺りはXAMPPさんがいい具合に準備してくれてるので、サービスを起動するだけで使えてしまいます。さすが。
※XAMPPが導入されていることが前提となっています。

#手順
というわけで早速Webページを生成してみましょう。
##Tomcatの起動
![178.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/49b8b24a-1668-5e68-7559-096383449b0b.jpeg)
XAMPPのコンパネから「Tomcat」サービスをStartさせる。

##コンソールにつなぐ
![179.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/25fc74bc-65ec-69dc-3b49-5e67e521edfb.jpeg)
Webブラウザ上から、「http\://localhost:8080」と入力する。
上記画面が表示されればTomcatの正常起動が確認できる。

##ルートディレクトリにディレクトリを追加する
![180.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/dd084984-a52b-b875-1905-599708ef3912.jpeg)
デフォルトであれば「C:\xampp\tomcat\webapps」がルートディレクトリ。
ここに新しく「hellojsp」を作成した。

##hellojsp内にjspファイルを作成
ソースコード

```html
<%@
	page import="java.util.*"
	contentType="text/html; charset=utf8"
%>
<!DOCTYPE html>
<html>
<head>
	<title>JSP</title>
</head>
<body>
	<%
		java.util.Date nowTime = new java.util.Date();
	%>
	<h1>Hello, world! Now time is <strong><% out.print(nowTime); %></strong>.</h1>
</body>
</html>
```

##Webブラウザ上からサンプルページにアクセス
![181.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/5de86eed-93b3-4596-50ee-6f1c2de54439.jpeg)
作成した「http\://localhost:8080/hellojsp/index.jsp」にアクセスする。
サンプルページが表示されていることを確認する。

#所感
何の変哲もない設定でした。今思い返すと、どこでハマったんだ過去の自分…。
Tomcatのディレクトリ構成が理解デキテナカッタカラナノカナー（棒）
[この辺（Tomcatのディレクトリ構造を理解しよう）](http://www.searchman.info/java_eclipse/1030.html)が詳しく解説してくれてます。
さて、次はJava Servletかなー。
Angular + Typescriptをブラウザでデバッグしたい

## はじめに
Angularプロジェクトをブラウザでデバッグする際に、**<font color="red">TypescriptファイルにBreakPointを設定する方法</font>**がわからなかったので調べた。

### 環境
- Angular: 2.4.7
- angular-cli: 1.0.0-beta.28.3
- webpack: 2.2.0
- Google Chrome: 53.0.2785.116
- 各種設定ファイルは、Angular CLIでプロジェクト作成後、デフォルト設定のまま
- エディタはVisual Studio Code(1.7.2)を使用

## デバッグ方法
1. Angular CLIで雛形プロジェクトを作成した後、`ng serve`コマンドで開発ビルド&実行する
2. Chromeのdeveloper toolsを起動する
3. Sourcesタブを選択
![Kobito.XNYA9r.png](https://qiita-image-store.s3.amazonaws.com/0/80252/aa74abf1-2065-3dc2-acb5-80161a1805a0.png "Kobito.XNYA9r.png")

`webpack://`**<font color="red">配下にTypescriptファイルが配置されている</font>**のでBreakPointを設定することができる。

画像の例では、src/app/app.component.ts ファイルにBreakPointを設定している。
VNCで接続するためにRaspberryPiの解像度を修正する

# はじめに
RaspberryPiを利用するうえでVNCが便利なケースがあります。
ただし、デフォルトではVGA相当の解像度になって非常にツライ:frowning2:
そこでVNCで接続したときの解像度を変更する手順をまとめます。

# 解像度の設定

## 編集するファイル

```/boot/config.txt``` を編集して解像度を設定します。

## 編集の仕方

エディタとしてnanoを利用します。

```
$ sudo nano /boot/config.txt
```

nanoが操作しづらいと感じるのであれば、idle3をつかいましょう。
ほぼメモ帳のノリで使えます。

```
$ sudo idle3 /boot/config.txt
```

## 編集内容

ファイル内に以下の記述があるので修正します。
hdmi_group=2
hdmi_mode=(自分の解像度に合ったやつ)

行頭の```#```はコメント行であるという意味なので、変更するときには```#```を削除するか、
別の行でhdmi_groupとhdmi_modeを定義します。


http://elinux.org/RPiconfig#Video_mode_options 

上記リンク先のhdmi_group=2の解像度一覧を見ます。

## 編集例
以下の設定をします。
hdmi_mode=47   1440x900   60 Hz

idle3で設定を変更した後のキャプチャ。
![スクリーンショット 2017-02-14 10.13.13.png](https://qiita-image-store.s3.amazonaws.com/0/19483/29b09a8e-e490-007a-8e50-83d1c8692e7a.png)


# VNCの有効化
最近のRaspiだと設定画面から有効にするだけです。
MYSQLのrootパスワードを変更する(mysqladminコマンド)

### :large_blue_diamond:   環境 
* Windows7
* MySQL5.7

### :large_blue_diamond:   コマンドを打つ
`C:\Users\user> mysqladmin password 新しいパスワード -u ユーザー名 -p`

ex)rootユーザのパスワードをpasswordに変更する
```C:\Users\user> mysqladmin password newpassword -u root -p
Enter password:*****```
「Enter password」とパスワードの入力が求められるので、ここでは現在のパスワードを入力。
※パスワードをシングルクオーテーションで囲む必要はありません。
実はウェブプッシュ通知に画像とかバッジ(ステータスバーのアイコン)付けられるよ

言及している記事が全く見当たらないのですが、最近ウェブプッシュ通知を
表示するshowNotification()メソッドに色々オプションが追加されています。
その中でも特に有用と思われるのが、imageとbadgeオプションです。
ちなみにFirefox(ver.51)では使えません。

## badge オプション(Chrome53から利用可能)

これはAndroidデバイスのステータスバーに表示するアイコンを指定するものです。
このオプションを付けない場合はChromeのアイコンが表示されます。
どのサービスのプッシュ通知かすぐに区別できるようになるので便利です。

このオプションにはPNG形式の画像のURLを指定します。
サイズは96x96が推奨です。

## image オプション(Chrome56から利用可能)

画像のURLを指定することでプッシュ通知に画像を表示することができます。
スマホのネイティブアプリのプッシュ通知では以前からできましたが、ウェブプッシュ通知でもできるようになりました。
画像を投稿するようなサービスである場合、サムネイルなどを指定すると効果的かもしれません。

なお、こちらはPNG画像でなくてもかまいません。

スクリーンショット
http://imgur.com/a/sUd6e

## 参考
https://developer.mozilla.org/ja/docs/Web/API/ServiceWorkerRegistration/showNotification
https://blog.chromium.org/2016/12/chrome-56-beta-not-secure-warning-web.html
2017-02-14 C++ Builder XE4 / Socket > ReceiveBuf()では0x00を途中に含めた指定長さの文字列を受信する / ReadBytes()では0x00までの長さの文字列だけを受信する > ReadChar()試用 / ReadString() + memcpy()使用 > ReadStream()使用

```txt:動作環境
C++ Builder XE4
```

TClientSocketにて通信断が発生する状況の対処を検討している。
TClientSocketからIndyのTIdTCPClientに変更をしようとしている。

1. `ClientSocket->Socket->ReceiveBuf(void *Buf, int Count);`を
2. `IdTCPClient1->Socket->ReadBytes()`で置き換えようとした。

方法1の場合は、`hello<0x00>world`という文字列が来た時には、worldまで受信できた。
方法2の場合は、`hello<0x00>`までの受信となった。

受信方法を変更することになる。

## ReadChar()試用

### 変更点

IndyのSocketにはReadChar()があるようだ。

```Unit1.cpp
	char zbuf[50] = { 0 };
	char code;
	for(int idx=0; idx < len; idx++) {
		code = IdTCPClient1->Socket->ReadChar();
		zbuf[idx] = code;
	}
```

上記で読込みができた。

### トラブル

ReceiveBuf()を使っていた時は、20文字の読取りに対してGetTickCount()では0となるほどの速度で処理される。

一方で、ReadChar()を使うとfor()で20回まわして同じ処理で2940msecかかるようだ。
20文字でなく18文字までの読取りでは0msecで処理される。

20文字の読込みでは11文字目まではReceiveBuf()とReadChar()で同じ。12文字目以降は以下のように異なっている。

- ReceiveBuf()受信
   - `0xE0 0x00 0xEA 0x00 0x00  0x00 0x00 0x00 0x0F`
- ReadChar()受信
   - `0xFD 0xFD 0x00 0x00 0x00 0x00 0x0F 0x4C 0x43`

本来`0x0F`で終端するはずが、ReadChar()では18文字目で終端文字列を読込んでしまっている。
この部分がおかしい。

## ReadString()使用

### ReadString() + memcpy()

ReadChar()の繰返しでは読み落としが生じていると推測した。
別の方法としてReadString()を使うことにした。

ReadString()で受信するString型文字列をchar []型に変換する方法としてstrncpy()を試した。この場合、`0x00`が途中にあるとそこまでのコピーしかされない。

色々試したところ、memcpy()だと途中に0x00があっても、指定の長さを取得できることが分かった。

```Unit1.cpp
	AnsiString str = IdTCPClient1->IOHandler->ReadString(len);
	char zbuf[50] = { 0 };
	//strncpy(zbuf, str.c_str(), len);
	memcpy(zbuf, str.c_str(), len);
```

これでReceiveBuf()と同じ受信処理となった。

### トラブル

上記で受信できたと思ったが、20文字中の2文字 (`0xE0`, `0xEA`)が(`0x3F`, `0x3F`)として認識されてしまう問題が生じている。

## ReadStream()使用

ReadString()では128以上のコードが本来のコードでなく変換されてしまうことが分かった。
http://qiita.com/7of9/items/7bab0cf9f4311f1ebbd1

ReadString()でなく、ReadStream()を使ってみた。

```Unit1.cpp
	TMemoryStream *strm = new TMemoryStream();
	IdTCPClient1->IOHandler->ReadStream(strm, len);
	strm->Seek(0, 0); // 先頭に移動
	char zbuf[50] = { 0 };
	strm->ReadData(zbuf, len);
	delete strm;
```

こちらでは20文字すべて、ReceiveBuf()使用時と同じになった。

strmの定義にはunique_ptrを使うのが良い。
コンソールのメッセージに色付け(Logback)

# 見やすくなって良かったやつ

```logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="true">
  <property file="C:/appfiles/logback.properties" />

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <target>System.out</target>
    <encoder>
      <pattern>%-5r %d{yyyy-MM-dd HH:mm:ss} [%t] %highlight(%-5level) %cyan(%-40.40logger{36}) [%file:%line] %green(%msg) %n</pattern>
    </encoder>
    <withJasi>true</withJasi>
  </appender>
```
Raspberry pi 1 model bで、with pixel　その7

#概要
Raspberry pi 1 model bで、音声認識やってみた。

#ダウンロード
julius-master.zip
bccwj.60k.htkdic
jnas-tri-3k16-gid.binhmm
logicalTri

#環境
Raspberry pi 1 model b(element14)
raspbian 2016-11-25 jessie with pixel
sd_card MF-RUMSD08GL elecom
HDMI to VGA adapter(amazon)
usb keyboard(nec)
usb mouse(nec)
usb audio C-Media Electronics

#インストール

sudo aptitude install libasound2-dev

#コンパイル
./configre --with-mictype=alsa

make

#設定ファイル

test.conf

```
-w demo.dict
-v bccwj.60k.htkdic
-h jnas-tri-3k16-gid.binhmm
-hlist logicalTri
-n 5
-output 1
-input mic
-input alsa
-rejectshort 600
-charconv euc-jp utf8

```

demo.dict 
文字コード　EUC

```
0	[不明]	h u m e i
0	[蜜柑]	m i k a N
0	[リンゴ]	r i N g o
0	[ぶどう]	b u d o:
1	[0]	z e r o
1	[1]	i ch i
1	[2]	n i:
1	[3]	s a N
1	[4]	y o N
1	[5]	g o:
1	[6]	r o k u
1	[7]	n a n a
1	[8]	h a ch i
1	[9]	ky u:
2	[個]	k o
3	[が]	g a
4	[
]	silB
5	[
]	silE
```

#実行
export ALSADEV="plughw:1,0"
./julius　-C test.conf

#注意

```
Error: adin_alsa: cannot open PCM device "default" (No such file or directory)
failed to begin input stream
```

なら、ALSADEVを見直す。

```
WARNING: adin_thread_process: too long input (> 320000 samples), segmented now
Warning: input buffer overflow: some input may be dropped, so disgard the input
```

なら、lvを見直す。

#実験結果

```
pass1_best: リンゴ
pass1_best_wordseq: 0
pass1_best_phonemeseq: silB r i N g o silE
pass1_best_score: -4599.153320
sentence1: リンゴ
wseq1: 0
phseq1: silB r i N g o silE
cmscore1: 1.000
score1: -4599.153320

pass1_best: ぶどう
pass1_best_wordseq: 0
pass1_best_phonemeseq: silB b u d o: silE
pass1_best_score: -4249.588379
sentence1: ぶどう
wseq1: 0
phseq1: silB b u d o: silE
cmscore1: 0.696
score1: -4249.588379

pass1_best: 

pass1_best_wordseq: 4
pass1_best_phonemeseq: silB silB silE
pass1_best_score: -2813.666748
sentence1: 

wseq1: 4
phseq1: silB silB silE
cmscore1: 0.635
score1: -2813.666748

pass1_best: 蜜柑
pass1_best_wordseq: 0
pass1_best_phonemeseq: silB m i k a N silE
pass1_best_score: -2593.730957
sentence1: 蜜柑
wseq1: 0
phseq1: silB m i k a N silE
cmscore1: 0.994
score1: -2593.730957


```
「リンゴ」「ぶどう」「蜜柑」は、認識できた。
技術英語 > This guide will [walk you through] how to install and use ...

[PDFファイル:Program an AVR or Arduino Using Raspberry Pi GPIO](https://cdn-learn.adafruit.com/downloads/pdf/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins.pdf)

> This guide will **walk you through** how to install and use avrdude to program an AVR microchip or Arduino through its ISP pins with a Raspberry Pi.

装置の取説などでもwalk you throughの文面を見えた覚えがある。