OmniAICreator/Qiita-1.07M huggingface dataset:
テンプレートリテラルでテンプレートリテラル以外のことをする


ES6の[Template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)を眺めてて思ったんだけど、このタグってやつ、ただの関数呼び出しじゃね？

「javascript 関数」でググって一番上に出てきた[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Functions)で試してみよう。

```js
	function square(strings, ...values){
		return values[0] * values[0];
	}

	var x = 10;
	hoge = square`${x}`;

	console.log(hoge); // 100
```

普通に動いた。

```js
	function myFunc(strings, ...values){
		values[0].make = "Toyota";
	}

	var mycar = {make: "Honda", model: "Accord", year: 1998};
	myFunc`${mycar}`;
	console.log(mycar); // {make: "Toyota", model: "Accord", year: 1998}
```

タグ関数は値を返さなくてもいいし、文字列以外を返しても呼び出し側では普通に受け取れる。
やっぱりただの関数だこれ。

```js
	function myFunc(strings, ...values){
		return values.reduce((x,y)=>x+y);
	}

	var a = 42, b = 21, c = 7;
	console.log(myFunc`引数の${a}数の${b}合計${c}は`); // 70
```

せっかくだから何か面白い使い道を考えてみようと思ったが特に思いつかなかった。
TensorFlowをWindows 10環境へインストール

最新版のTensorFlowをWindows 10へインストールする際のバージョンをまとめました。
以下の手順でOKですが、ところどころ躓きます。
https://www.tensorflow.org/install/install_windows

# CUDA Toolkit
最新の、[CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit) 8.0対応です。

# CuDNN
[CuDNN](https://developer.nvidia.com/cudnn)の最新版は6.0ですが、TensorFlowには5.1までの対応です。6.0,5.1はlibファイルは異なりますが、includeなどは5.1で上書きすることになります。

# Visual Studio
CUDA関連のプロジェクトが、最新の2017でのコンパイルは対応していないようですので、2015を入れます。
MSDN Subscriptionをお持ちのリッチな方はSubscriber Downloadから、そうでない方は、以下のサイトに示されるように[Visual Studio Dev Essentials](https://my.visualstudio.com/Benefits?wt.mc_id=o~msft~vscom~devessentials-hero~30569&campaign=o~msft~vscom~devessentials-hero~30569)に参加して、ダウンロードします。
[以前のバージョンの Visual Studio をダウンロード](https://www.visualstudio.com/ja/vs/older-downloads/)

# Anaconda
[Anaconda](https://www.continuum.io/downloads)でPythonを入れるのが一番簡単です。最新版は4.4.0、Python 3.6対応です。

# Python
最新のAnaconda に含まれるPythonが3.6ですが、TensorFlowは3.5までの対応なので、以下のようにconda環境での処置が必要です。

``` conda create -n tensorflow python=3.5 ```

これで、サンプルを動かせるところまではいけます。
Onion OmegaでFreeBSD

たまたま転がり込んで来た[Onion Omega](https://github.com/OnionIoT/wiki/blob/master/Documentation/Hardware/Omega-Hardware.md)を今更ながらFreeBSDで使えるようにしてみました。OmegaはmipsなAtherosのわりと新しめのAR9330というSOCを使っていて、RAM 64M/Flash 16Mなので私のターゲットの中では結構リッチな方です。世の中的にはOmega2が使われ初めていて、一周遅れで自分らしいなと妙に納得したりしています。

![Onion.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/6551b7c9-27dd-c98b-1583-ec9c498f7c64.jpeg)


AR9330はAR9331と同じものでAP121と呼ばれているものではないかと思われます。

![OnionOmega.png](https://qiita-image-store.s3.amazonaws.com/0/104066/d4348d00-7d25-0653-08d3-04342af7396f.png)

私はオペレーションはMacなので、ドーターボードについているUART USBデバイス変換のSiLabsのチップのドライバつかってシリアルコンソールにアクセスします。

こちらにfreebsd-wifi-buildでのビルド方法があるので、これを参考にZRouterでビルドできるようにしてみました。

https://github.com/freebsd/freebsd-wifi-build/wiki/Onion-Omega

上記のビルドスクリプトをみると、TP Linkタイプのイメージを作成する必要がありmktplinkfwコマンドを利用しているようです。この[イメージはU-Boot](http://qiita.com/yamori813/items/3b14661f08a08aacbc33)といいつつ別のものになってしまっているようです。ZRouterにもmktplinkfwコマンドは入っていたのですが、古いもののようなので、freebsd-wifi-buildからソースをコピーしてビルドできるようにしてみました。

mktplinkfwはshare/mk/converters/ではなくMakefileに直接書いてあったので、調整してとりあえずビルドできるようにはなったのですがlzma errorが起きて起動できません。いろいろ試して再起動した後にはerrorが起きないようなので、試す時は常に再起動するようにしました。

ところがOKが出るのですが、そこから進みません。よくよく調べてみるとAR933xは他のAR7/9系とは別のuartのコードが用意されていて、これを使う必要がありました。AtherosのSOCで100のSwitchを内蔵しているチップはAR724x -> AR933x -> AR934xとなっていますが、なぜAR933xだけ別物になってしまったのでしょうか。。。

最初のログが出るまでのデバッグはなにも見えない中でCPUがどうなっているか想像してのデバッグで、無の世界で禅の修行している気分になります。

これでやっとブートログが出ました。ちょっと前にAR9340もいじっていたので、簡単にできるかと思ったら、一日近くかかってしまいました。

実際イメージを焼くには上のページの処理にeraseを実行する必要もありました。

後はhintsをsys/mips/confを参考に調整してみました。

このSOCではEthernetインターフェースのargeは二つありますが0がSwitchのPHY4に接続されていて外に出ています。

USBも正常に認識されています。

GPIOも沢山あるのでBitbangでI2CやSPIも使えます。

~~objcopyがbinutilからelftoolchainに変わってから、[おかしくなっている](http://qiita.com/yamori813/items/2de64d0d5a1e85c253f3)ので、古いバイナリを発掘して使っています。~~2018/01に直りました。

もちろん技適がないのでWIFIは確認していません。:)

とりあえずmrubyを入れてイメージを作ってみました。RAMもFlash大きいので、いろいろできそうです。

カーネル起動だけ

```
setenv ipaddr 10.10.10.102;setenv serverip 10.10.10.3
tftpboot 0x80600000 Onion_Omega.bin
bootm
```

焼き直し

```
setenv ipaddr 10.10.10.102;setenv serverip 10.10.10.3
tftpboot 0x80020000 Onion_Omega.bin
erase 0x9f020000 0x9f7fffff
cp.b 0x80020000 0x9f020000 $filesize
```

u-bootの環境変数が保存できないので、毎回入力が必要でちょっと不便です。

このブートは圧縮して入っていて128Kと小さくなっています。16MのFlashが付いているのにちょっと不思議な気もします。追記：このブートはu-boot_mod由来で、このプロジェクトが小さめに作るポリシーだったようです。

とりあえず半分だけ消しています。イメージが大きくなった場合は0x9fff0000まで広げられます。
ナウマンを Docker で立ち上げてデプロイするまで

# はじめに
Web 版マストドンクライアントとして登場した[ナウマン](https://naumanni.com)は誰でも簡単にサーバにデプロイすることができます。実際に立ててみたところ非常に簡単に構築できましたが、ところどころつまづくポイントがあったのでメモとしてデプロイまでの作業をまとめたいと思います。

Docker で立ち上げた理由ですが、はじめは Docker なしでビルドして Nginx で配信してみましたが、不具合なのか、僕の設定に不備があったのかわかりませんが、はじめのウェルカム画面（`/welcome`）が表示されない（ルーティング的にエラーになってしまう）現象が発生したので、Docker で立ち上げることにしました。ウェルカム画面が表示されなくても支障はなさそうですがなんとなく嫌だなというのと、結局 Docker で立ち上げるのが一番お手軽なので Docker で紹介します。

# デモ
デプロイするとこんな感じのサイトが立ち上がります。

[naumanni.mastodon.noraworld.jp](https://naumanni.mastodon.noraworld.jp)

自分のサーバにデプロイする前にどんな感じになるのか確認したい方は参考にしてください。

ちなみにナウマンは、マストドンの API を叩いてタイムライン等を取得するので、**そのサーバで起動しているマストドンとは別のインスタンスのアカウントも利用できます**。そのサーバでマストドンを運営してなくても他のインスタンスにアカウントがあれば使えます。

# インストール
ソースコードを GitHub からクローンして Docker コンテナを立ち上げます。

```bash
$ git clone https://github.com/naumanni/naumanni
$ cd naumanni
$ docker pull naumanni/naumanni-standalone
$ docker run -dit -p 127.0.0.1:8080:80 naumanni/naumanni-standalone
```

公式の README を見ると Docker コンテナを立ち上げるときに `-d` オプションをつけていない（2017/06/05 現在）ので標準入力を Docker に持って行かれてしまうのと、`8080` ポートで外からアクセスされる可能性があるので、README の例とは少し違います。

これですでにナウマンが起動しています。ナウマンを起動したのと同じサーバで `curl 127.0.0.1:8080` を実行してナウマンのフロントの HTML が返ってくれば OK です。

ちなみにすでに `8080` ポートを別のアプリケーションで使用していた場合は `docker run` するときの Docker 側のポート番号（`8080`）を変更してください。

:warning: 2017/06/05 現在リリースされているタグは `0.1.1` と `alpha-0.1.2` の 2 つですが、どちらも `openpgp.worker.js` が生成されないバグが修正される前のリリースなので、デプロイするとしたら、バグが修正された直後の状態か、`master` の最新版を使用してください。上記の例では `master` の最新版を使用しています。

[openpgp.worker.js が生成されてない。](https://github.com/naumanni/naumanni/issues/19)

# デプロイ
Nginx を使ってデプロイします。以下の設定を Nginx の設定ファイルに追加します。

```nginx
server {
    listen       80;
    server_name  ナウマンで使用するドメイン;

    charset    utf-8;
    try_files  $uri/index.html $uri;

    location / {
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_pass        http://127.0.0.1:8080;
    }

    client_max_body_size  100m;

    error_page  404          /static/error/notfound.html;
    error_page  503          /static/error/maintenance.html;
    error_page  504          /static/error/delay.html;
    error_page  403          /static/error/forbidden.html;
    error_page  500 501 502  /static/error/error.html;
}
```

必要最小限の部分だけを載せています。ログや SSL の設定等は、各々必要であれば追加してください。Docker を起動する際にポート番号を変更した場合は、`proxy_pass` のポート番号も変更するのを忘れずに。

設定ファイルにミスがないかチェックします。

```bash
$ sudo nginx -t
```

エラーがなければ Nginx を再起動します。

```bash
$ sudo nginx -s reload
```

`ナウマンで使用するドメイン` にアクセスしてナウマンのウェルカムページが表示されれば完了です。お疲れさまでした。
Perl入学式で使える?最小の開発環境

低スペックのノートパソコンで、Perl入学式(2017)をどうにかこなす方法はないかと熟慮に熟慮を重ねて、現時点での解を作ってみました。

- 仮想化環境は Virtual Box
- Linux環境は CentOS6.9 32bit
- ターミナルは RLogin
- エディタは Notepad++

Linux仮想マシンのメモリが256MBで収められるので、メモリ1GB程度のPCでも、これで何とかなるかな～という感じです。

# Linux仮想マシン

ストレージは3GBの可変サイズに設定。インストール時は少し多い目(512～768MB)のメモリを割り当てた状態で、CentOS6.9のminimumインストールを実行します。
インストールを完了後に、メモリを256MBに削減してください。
なお、素の状態ではperlが入っていなかったので、`$yum install perl` でインストールを実施。この先のカリキュラムによっては他にもインストールが必要になるかもしれませんが、とりあえずこのまま進めましょう。

なお、ネットワーク関連は以下のように設定。

```shell:/etc/resolv.conf
nameserver 192.168.1.1
```

```shell:/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
HWADDR=[特に変更しない]
TYPE=Ethernet
UUID=[特に変更しない]
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.56.129
NETMASK=255.255.255.0
```
仮想化環境側では、ネットワークアダプタを以下のように設定してください。

- アダプタ１をブリッジアダプターに設定。
- アダプタ２にホストオンリーアダプターを設定。

# ターミナル

パスワードを覚えてくれる方が楽だし、外に出ないのでRLoginを使うと便利。
[RLoginダウンロード](http://nanno.dip.jp/softlib/program/rlogin.zip)
[RLogin説明](http://nanno.dip.jp/softlib/man/rlogin/)

# エディタ

viでソースを書くのがダルいので、sftp拡張があるエディタとして [Notepad++](https://notepad-plus-plus.org/)がお勧めです。

[プラグイン]メニューから、[NppFTP] → [Show NppFTP Window]を選び、表示されたウインドウから[Settings]→[Profile settings]を選ぶと、以下のダイアログが開きます。

![20170605_204259#00.png](https://qiita-image-store.s3.amazonaws.com/0/116241/9b258b0a-0f28-8254-3418-a22f7ed88110.png)

ここでIPやログインIDとパスワードを設定すると、ディレクトリ一覧が表示され、新規のディレクトリの作成やファイルの作成が簡単にできます。

# あとがき

一応、ovaファイルを用意しているので、差し支えなければそのうち配布したいなあ、と思っています。
tensorflow の簡単なサンプル

tensorflow をインストールした直後にインストールが出来ているか簡単に確認するプログラム

元のプログラムは、こちら
http://qiita.com/mochizukikotaro/items/7624b81af498317a0865

このプログラムを、アップデートし、python3 にも対応しました。

```py3:tf_sample_square_error.py
#! /usr/bin/python
#
#	tf_sample_square_error.py
#
#					Aug/07/2023
# ------------------------------------------------------------------
import sys
import tensorflow.compat.v1 as tf

tf.disable_v2_behavior()
sys.stderr.write("*** start ***\n")

input_x = [[1.],[5.]]
input_y = [[4.],[2.]]

x = tf.placeholder("float", [None, 1])
y_ = tf.placeholder("float", [None, 1])

a = tf.Variable([1.], name="slope")
b = tf.Variable([0.], name="y-intercept")
y = tf.multiply(a, x) + b

init = tf.global_variables_initializer()

# 誤差関数
loss = tf.reduce_sum(tf.square(y_ - y))

# トレーニング方法は、勾配降下法を選択
train_step = tf.train.GradientDescentOptimizer(0.03).minimize(loss)


with tf.Session() as sess:
	sess.run(init)
	print('初期状態')
	print('誤差' + str(sess.run(loss, feed_dict={x: input_x, y_: input_y})))
	print("slope: %f, y-intercept: %f" % (sess.run(a), sess.run(b)))

	for step in range(100):
		sess.run(train_step, feed_dict={x: input_x, y_: input_y})
		if (step+1) % 20 == 0:
			print('\nStep: %s' % (step+1))
			print('誤差' + str(sess.run(loss, feed_dict={x: input_x, y_: input_y})))
			print("slope: %f, y-intercept: %f" % (sess.run(a), sess.run(b)))
#
sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```

警告を出さないように実行するには、

```bash
export TF_CPP_MIN_LOG_LEVEL=2
./tf_sample_square_error.py
```

実行結果

![square_error_jun05.png](https://qiita-image-store.s3.amazonaws.com/0/179446/affaaf4f-ffb6-f578-ba8c-6a2d4b6670f9.png)


tensorflow がインストールしてない時の実行結果

```text
$ ./tf_sample_square_error.py 
Traceback (most recent call last):
  File "./tf_sample_square_error.py", line 9, in <module>
    import tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'
```

Arch Linux での tensorflow のインストール方法

```bash
sudo pacman -S python-tensorflow
```

## 確認した環境

```text
$ uname -a
Linux shimizu 6.4.8-arch1-1 #1 SMP PREEMPT_DYNAMIC Thu, 03 Aug 2023 16:02:01 +0000 x86_64 GNU/Linux

$ python --version
Python 3.11.3
```

```text
$ python
Python 3.11.3 (main, Jun  5 2023, 09:32:32) [GCC 13.1.1 20230429] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> tensorflow.__version__
'2.13.0'
```
【Swift】インクリメンタルサーチのリクエスト数を減らす

# インクリメンタルサーチ(incremental search)とは

検索バーに文字を入力する度に自動的に検索が行われる検索方法のことを指します。
インクリメンタルサーチという名前は知らなくてもどういう検索方法かは誰もが知っていると思います。

# `UISearchBar`による検索

`UISearchBarDelegate`に`searchBar(_:textDidChange:)`というメソッドがあります。
このメソッドは`UISearchBar`に入力された文字列が変更される度に呼ばれます。
よって次のようにAPIを叩くのが一般的かと思います。

```swift
class ViewController: UIViewController {

    ...

}

extension ViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        // send a request to API and show the response
    }
}

```

しかし、これでは、文字が入力される度にAPIにリクエストを送ってしまうので、無駄なリクエストが多くなってしまいます。
具体的には、「あいうえお」と入力すると、5回連続でAPIにリクエストを送ってしまいます。
これではサーバにかかる負荷も大きくなってしまいますし、ユーザ体験もよろしくありません。

# 解決方法

上のコードを次のように修正します。

```swift
class ViewController: UIViewController {

    ...

    var timer: Timer?

    ...

}

extension ViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        self.timer?.invalidate()
        self.timer = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(self.search), userInfo: nil, repeats: false)
    }

    func search() {
        // send a request to API and show the response
    }
}

```

こうすると、`searchBar`の文字列に変更が連続で生じたときでも、0.3秒以内の連続入力であれば、最終的に入力した文字列に対してのみ検索を行う(APIにリクエストを送る)ことができます。
A-Frameを使って360度動画再生コンテンツを作ったので、WebVRが今どんな感じなのかをまとめ。

[cloudpack あら便利カレンダー 2017](https://cloudpack.github.io/benri2017/) 4日目の記事です。

# 経緯
VRで360度動画を閲覧するビューワーみたいなのを作ろうとなった。
ゲームとかじゃないのでWebVRがいいんじゃない、という話になった。
Web開発の知見も使えるし。
ってことで調べるとA-Frameという素敵なフレームワークに出会った。
これいい！ってなったのでこの記事書きました。

# まず「Web VR API」と「WebVR」は違う
ややこしい言葉ですがこんな認識です。
WebVR => ブラウザで見れるVRコンテンツ(Web VR APIを使うかどうかに限らない)
Web VR API => ブラウザから対応端末の情報を取得できるAPI

## Web VR API
- 利用端末 Oculus RiftやHTC Vive
- ブラウザ ChromiumとFirefox Nightly
- HMD端末の情報を取得

## WebVR(Web VR APIは使わない)
- いわゆるハコスコVR
- コンテンツはWebGLで頑張る
- 端末情報はHTML5 API経由でスマホジャイロセンサー取得して頑張る

__今回はスマホでブラウザからアクセスして箱に指すだけで楽しめるものについて取り扱います__

## WebVRコンテンツを作る
対応ブラウザはAndroid Chrome, iOS Safari,Chromeとしました。

# フレームワーク
選択肢としてメジャーなのは以下
- React VR
- A-Frame
- Three.jsでごりごり書く

# 今回はA-Frameを利用
- HTMLタグで要素を置いていく
- VR表示（2画面のやつ）はA-Frameがデフォルトで装備

入門記事はネットにいっぱいあるので割愛しますが、
360度パノラマ動画を再生するのに必要なコードは以下だけ

```HTML
<a-scene>
  <a-assets>
    <video id="video" autoplay loop="true" src="sample.mp4">
  </a-assets>
  <a-videosphere src="#video"></a-videosphere>
</div>
```

実行するとこんな感じ
<img style="max-width:400px;" src="https://qiita-image-store.s3.amazonaws.com/0/35271/19c8a137-c29c-ffda-3e74-2f1b82f5d096.png">

他にもデフォルトで利用できる開発ツールなどは結構びっくりします。ブラウザで表示して[ctrl+alt+I]するだけ。
<img style="max-width:400px;" src="https://qiita-image-store.s3.amazonaws.com/0/35271/c0a7e3c8-0a92-3073-a711-21bef0eef8f6.png">
[A-Frame Inspector](https://aframe.io/docs/0.5.0/introduction/visual-inspector-and-dev-tools.html#a-frame-inspector)

# iOSにおけるvideo再生まわりの仕様
結局上記で何やっているかというとHTMLのvideoタグのソースをThree.jsのテクスチャとして球状に貼り付けて再生したり停止したりするのですが、iOSのvideoタグ対応は現状まだまだ制限が厳しかったです。

- インラインvideo再生 => これは問題なし
- 動画コントロール => 基本ユーザのタッチアクションがないと何も出来ない
- 
_補足1 音のない動画、videoタグにmuted属性を指定しているとコントロール可能_
_補足2 ちなみに上記問題は「ホームへ追加」して再生すると全部解決します_

## 解決作
1. 最初にスプラッシュ画面みたいなの作ってタッチさせる
2. 裏側でvideoを再生してすぐ停止しとく
3. あとは動画リソースはvideoタグのattributeを書き換えて随時videoElement.play()とかする
で解決しました。現状これが一番妥当かなと思ってます。

# アドレスバー出ちゃう問題(フルスクリーン表示を実現する方法)
基本Safariで表示して、スマホを横にするとアドレスバー消えてフルスクリーンになるのですが
以下条件で消えないことを確認してます。
- iPhone5,SEのSafari
- iOSのChrome

## 解決策
まだこれっていうのは見つかってません！！！
すみません。。
いい解決策知ってるよ！ってかたは是非教えて欲しい。。。

ざーっとWebVRコンテンツに関して調査したことを並べていっただけになりましたが、
開発のハードルが下がっていることは間違いなく、またVRコンテンツ作るの楽しいです。
まだの人は是非試してみてください。

今後、WebVR APIとHMD端末を使ったコンテンツやコントローラどうするかについても知見がたまれば共有していきたいと思います。
続編はまた次回に。
プッシュ通知　メモ

p12ファイルがどのバンドルIDと紐づいているかを確認するには？　下記コマンドを叩く

openssl pkcs12 -in ****.p12



■プッシュ通知の参考URL
http://qiita.com/kanacha/items/7983188abf3ee64e49a7

https://growthpush.com/threads/164
RxJavaで並行非同期処理の待ち合わせ

並列で走らせた非同期処理を、最終的には同期を取って次の処理に進みたい場合あるよね。
アプリだと、起動時のマスターデータの読み込みとか、他にはバナーとリストとインフィード広告の読み込みとか。

RxにはObservable.zipっていう機能があります。
複数のストリームが全部終わるの待てる仕組み。

引数に渡すObservable型が違っていても問題ないってのがナイス！
なので、マスターデータの待ち合わせなんかも楽ちん。

```java:マスターデータの取得例
Observable.zip(
                ApiUtil.getPrefecturesObservable(userDataManager.getmUserId()),
                ApiUtil.getCitiesObservable(userDataManager.getmUserId()),
           ApiUtil.getMiddleCategoriesObservable(userDataManager.getmUserId()),
                new Func3<Prefectures, Cities, MiddleCategories, String>() {

                    @Override
                    public String call(Prefectures prefectures,
                                       Cities cities,
                                       MiddleCategories middleCategories) {

                        // データ更新に失敗した場合
                        if (prefectures.result == null || prefectures.result.size() == 0) {
                            return FAILED_GET_MASTER_DATA;
                        }
                        if (cities.result == null || cities.result.size() == 0) {
                            return FAILED_GET_MASTER_DATA;
                        }
                        if (middleCategories.result == null || middleCategories.result.size() == 0) {
                            return FAILED_GET_MASTER_DATA;
                        }

// 各種データのDB保存（データ取得が全て正常な場合のみ保存する）
                        new PrefectureDao(StartActivity.this).init(prefectures.result);
                        new CityDao(StartActivity.this).init(cities.result);
                        new MiddleCategoryDao(StartActivity.this).init(middleCategories.result);
                        new ArticleViewHistoryDao(StartActivity.this).init();
                        
                        return SUCCESS_GET_MASTER_DATA;
                    }
                })
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .compose(HogeActivity.this.<String>bindToLifecycle())
                .subscribe(new ApiObserver<String>(StartActivity.this){
                    @Override
                    public void onError(Throwable e) {
                        handleError(e);
                        // エラー処理
                    }

@Override
                    public void onNext(String result) {
                        if (result.equals(SUCCESS_GET_MASTER_DATA)) {
                            // データ完全時の処理
                        } else {
                            // データ不完全時の処理
                            // 全体のやり直しな感じ
                        }
                    }
                });
```
シリアルに投げてた通信を並列でやれるから、時間短縮になるのはもちろん、途中で失敗した場合はロールバックみたいな、トランザクション的な書き方も簡単。
javascriptのint, uint計算

# javascriptでint, uintで計算をやる方法のまとめ。

javascriptで32bit整数(int, uint)で計算する方法。
intは`-2147483648`～`+2147483647`。
uintは`0`～`4294967295`。

## bit演算

jsではbit演算の結果は32bit符号有り整数(int)になる。

```js
let a = 0xffff; // (+65535)
let b = 0x00ff; // (+255)

// and演算
console.log(a & b); // 0x00ff (+255)
// or演算
console.log(a | b); // 0xffff (+65535)
// xor演算
console.log(a ^ b); // 0xff00 (+65280)
// not演算
console.log(^a); // 0xffff0000 (-65536)
```

※not演算の補足
`0xffff`は`0x0000ffff`なので、bit反転すると`0xffff0000`となり負数になる。

## シフト演算

```js
let a = 0x0000ffff; // (+65535)
let b = 0xffff0000; // (-65536)

// 左シフト
console.log(a << 8); // 0x00ffff00 (+16776960)
console.log(b << 8); // 0xff000000 (-16777216)
// 符号維持右シフト
console.log(a >> 8); // 0x000000ff (+255)
console.log(b >> 8); // 0xffffff00 (-256)
// 0埋め右シフト
console.log(a >>> 8); // 0x000000ff (+255)
console.log(b >>> 8); // 0x00ffff00 (+16776960)
```

##応用

javascriptではbit演算を行うとその戻り値は32bit符号有り整数(int)になる。
ただし0埋め右シフトは例外で、32bit符号無し整数(uint)になる。

```js
let bignum = 0xffffff000000; // (+281474959933440)

// 32bitに切り詰められて、符号有り
console.log(bignum | 0); // 0xff000000 (-16777216)
// 32bitに切り詰められて、符号無し
console.log(bignum >>> 0); // 0xff000000 (+4278190080)
```

32bit同士の数値の演算として[`Math.imul`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/imul)が用意されており、サポートされているブラウザでは利用できる。

```js
let a = 0x40000000; // (+1073741824)
let b = 0x3fffffff; // (+1073741823)
// 普通に掛け算すると誤差が生じる
console.log(a * b); // 0xfffffffc0000030 (+1152921503533105200)
// Math.imulを利用すると戻り値が32bit符号有り整数になる
console.log(Math.imul(a, b)); // 0xc0000000 (-1073741824)
// 0埋め右シフトと併用することでuintとして演算できる
console.log(Math.imul(a, b) >>> 0); // 0xc0000000 (+3221225472)
```
Coda2のファイルタブからファイルをCoda2で開く方法

ファイルを選んで、Command+:arrow_down_small:(下矢印キー)

ref: https://stackoverflow.com/questions/24015943/how-to-test-if-string-contains-another-string-in-phpunit

P.S. サイドバーを表示しないとだいぶ軽くなることに気付いた。
Androidアプリの実行速度計測テンプレ

**「計測できないものは改善できない。」** by T.K.Kato

```java:速度計測コード
long startTime = System.nanoTime();
~計測したい処理~
long endTime = System.nanoTime();

// ミリ秒単位で表示
Log.d(TAG, "経過時間　" + ((endTime - startTime) / 1000000) + "(ms)");
```

引用元
[黒帯エンジニアが教えるプロの技術 Android開発の教科書](https://www.amazon.co.jp/dp/B01H4ONR9K/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[備忘録]GenymotionをアップデートしてAndroidStudioから見えなくなった時の確認


忘れるのでメモ。
実行時、エミュレーターは立ち上がってるのに、見えない場合、
以下を確認して合わせる。

1.AndroidStudioのPreferencesのAndroidSDKの位置を見る。
2.GenymotionのSettings（ADB）で、AndroidSDKの位置を見る。
  ->GenymotionのDefaultになっているなら、AndroidStudioの位置と合わせる。
少し突っ込んだfullcalendarの使い方(ajax)

#fullcalendarの使用する方法

簡単な設置方法やオプション等は色々落ちてるので、割愛。
ここでは少し突っ込んだ使い方を説明しています。

##phpでDB取得→ajaxで同期する##

ポイントを簡単に箇条書きで。

-  base_urlはあらかじめbody内に等で仕込んでおくと便利。`input type = "hidden"　value="base_url()"`
- ajaxでurlにアクセスする。phpでDBを取得する。取得した値をphp側で返却して`events: json.cal_data,`としたら良い。



```js:fullcalendar.custom.js
var base_url = $('#base-url').val();

//ここまで
get_calendar_data('project/sample.php');

function get_calendar_data(url) {
	var now = $('#now').val();
	//検索ボックス
	$.ajax({
		type: "POST",
        //
		url: $('#base-url').val() + url,
		data: {
			"now": now,
		},
		dataType: "json",
	}).then(function (json) {
		$('#pm_calendar').fullCalendar('destroy');//破棄
		$('#pm_calendar').fullCalendar({
			header: {
				left: 'prev,next',
				center: 'title',
				right: '',
			},
	}, function () {
		alert("読み込み失敗");
	});
}

```



```php:sample.php
$form = $this->input->post();
$now = (int) $this->input->post('now');
$cal_data = $this->Project_model->get_calendar_data($end, $form);
$start = strtotime(date('Y/m/1 00:00:00', $now));
$end = strtotime(date('Y/m/t 23:59:59', $now));

$json = array(
			'form' => $form,
			'cal_data' => $cal_data,
			'start' => $start,
			'end' => $end,
			'now' => $now,

		);
		echo json_encode($json);
```


```php:Project_model.php
public function get_calendar_data($start, $end, $form) {
		if (!empty($form)) {
			$this->create_where_query($form);
		}
		$this->db->where('date >= ', $start); //
		$this->db->where('end_date <= ', $end); //
		$calendar_list = $this->db->get('calendar')->result_array();

		$data = array();
		foreach ($calendar_list as $calendar) {
			$data[] = [
				'flag' => 1,
				'place' => $project['place'],
				'id' => $project['id'],
				'title' => $project['name'],
				'start' => d($project['date'], 'Y-m-d 00:00:00'),
				'end' => d($project['end_date'], 'Y-m-d 23:59:59'),
				'allDay' => false,
			];
		}
		return $data;
	}

```
###php側の処理

- $nowを取得しておくことによって、prev,nextボタン押した時の処理が楽。
（ここではprev処理は書いてない）
- 取得したDBはcal_detaに入ってる。
-modelは欲しいデータ全部取ってきたらいいと思います。
(データベースにflagを入れる事によって、後々色を変えたりとか出来るようにした。)
- 最終的にjsonで送ったらオケ。


コピペしてから削ったりしてるので、定義してない変数とか引数あったらすいません。
Visual Studio / WPF > LINQ > LINQクエリの結果をバインドする(1)

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

http://gushwell.ldblog.jp/archives/52329600.html
を元に学習中。

DataTemplate を使っているが、DataTemplate を使わない状態が気になったので試してみた。

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170605_t1927_linq
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var colorInfos = from color in typeof(Colors).GetProperties()
                             select new
                             {
                                 Name = color.Name,
                                 Color = color.GetValue(null, null)
                             };
            listBox1.ItemsSource = colorInfos;
        }
    }
}

```

```MainWindow.xaml
<Window x:Class="_170605_t1927_linq.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170605_t1927_linq"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox Margin="15,15,15,45" Name="listBox1"/>
        <Border VerticalAlignment="Bottom"
                BorderThickness="1" BorderBrush="Gray">
            <ContentControl
                Content="{Binding SelectedItem, ElementName=listBox1}"/>
        </Border>
    </Grid>
</Window>

```

![2017-06-05_19h35_48.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0e403723-d929-08b2-1956-c1b2fd0aab2a.png)

上記の状態に対して、DataTemplate で見栄えを変えているようだ。
ZttpでシュッとHTTPリクエストを作成する

[Laravel News](https://laravel-news.com/zttp-guzzle-wrapper)で紹介されていたので、試しに実装してみました。

## インストール
```bash
$ composer require kitetail/zttp
```


## 使ってみる
```php
  private function requestTest($uri)
  {
    $token = 'hogehoge';
    
    $response = Zttp::withHeaders(['Authorization' => $token])->post($uri,[
    	'key' => 'value'
    ]);
    info('Test ZTTP', $response->status());
  }

```

deleteとかpatch、putもいける


```php
$response = Zttp::withHeaders(['Authorization' => $token])->delete($uri);
```

便利！


## 参考
https://packagist.org/packages/kitetail/zttp
AWS CLIでCUIからSQLちっくにDynamoDBを参照する冴えた？方法

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

現在、バックエンド寄りのなんでもエンジニアのため、基本的にputtyを利用してデータを集計したり、お問い合わせのデータを参照したりしています。
MySQLのデータであればSQLを使えばいいのですが、DynamoDBは参照が面倒。SQL感覚で(条件のjsonを外部ファイルとかにしないで)データをひっぱりたい。
わかってしまえば楽なのですが、検索した範囲ではあまりわかりやすいものがひっかからなかったので、メモしておきます。

# 結論
```bash
aws dynamodb query \
  --table-name udata \
  --projection-expression "uid,name" \
  --key-conditions '{"uid":{"ComparisonOperator":"EQ", "AttributeValueList":[{"N":"1234"}]}}'
```
- udata テーブルから
- uid = 1234 のレコードの
- uid と name を取得する。

## 取得結果
```bash
$ aws dynamodb query \
> --table-name udata \
> --projection-expression "uid,name" \
> --key-conditions '{"uid":{"ComparisonOperator":"EQ", "AttributeValueList":[{"N":"1234"}]}}'
{
    "Count": 1,
    "Items": [
        {
            "name": {
                "S": "hoge"
            },
            "uid": {
                "N": "1234"
            }
        }
    ],
    "ScannedCount": 1,
    "ConsumedCapacity": null
}
```

## テーブル構造
以下のようになっており、今回参照したいattributeはstring型のnameです。

```bash
$ aws dynamodb describe-table --table-name udata
{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "uid",
                "AttributeType": "N"
            },
            {
                "AttributeName": "rday",
                "AttributeType": "S"
            }
        ],
        "KeySchema": [
            {
                "KeyType": "HASH",
                "AttributeName": "uid"
            },
            {
                "KeyType": "RANGE",
                "AttributeName": "rday"
            }
        ],
        # 関係ない項目については省略
    }
}
```

## 嵌った場所
とにかく `--key-conditions` の書き方に尽きます。
**[公式リファレンス](http://docs.aws.amazon.com/cli/latest/reference/dynamodb/query.html)**ちゃんと読めばもう少し早かったかもしれません。

# 終わりに
何度もCUIからDynamoDBを参照しようと調べて実現しては忘れてを繰り返しているので、私的な備忘録代わりに。
bashのライトなスクリプトでリスト食わせてDynamoDB見るような時にも役に立ちます。

それではまた次の投稿でお会いしましょう。
おしまい。
Jestのクイックリファレンス

# 概要
Jest関数のクイックリファレンスです。
基本的なものを中心としており、モック機能には触れていません。
すべてを網羅しているわけではありませんので、詳しくは [公式](https://facebook.github.io/jest/docs/expect.html) を参照してください。

## A === B
```js
test('toBe', () => {
  expect(A).toBe(B);
});
```

## A !== B
```js
test('not.toBe', () => {

});
```

## A === NULL
```js
test('toBeNull', () => {
  expect(A).toBeNull();
});
```

## A !== NULL
```js
test('not.toBeNull', () => {
  expect(A).not.toBeNull();
});
```

## A === undefined
```js
test('toBeUndefined', () => {
  expect(A).toBeUndefined();
});
```

## A !== undefined
```js
test('toBeDefined', () => {
  expect(A).toBeDefined();
});
```

## A == true
```js
test('toBeTruthy', () => {
  expect(A).toBeTruthy();
});
```

## A == false
```js
test('toBeFalsy', () => {
  expect(A).toBeFalsy();
});
```

## A >= B
```js
test('toBeGreaterThanOrEqual', () => {
  expect(A).toBeGreaterThanOrEqual(B);
});
```

## A > B
```js
test('toBeGreaterThan', () => {
  expect(A).toBeGreaterThan(B);
});
```

## A <= B
```js
test('toBeLessThanOrEqual', () => {
  expect(A).toBeLessThanOrEqual(B);
});
```

## A < B
```js
test('toBeLessThan', () => {
  expect(A).toBeLessThan(B);
});
```

## A === B (連想配列の比較）
```js
test('toEqual', () => {
  expect(A).toEqual(B);
});
```

## A !== B (連想配列の比較）
```js
test('toEqual', () => {
  expect(A).not.toEqual(B);
});
```

## A === B (少数を含む比較)
```js
test('toBeCloseTo', () => {
  expect(A).toBeCloseTo(B, 比較少数桁);
});
```

## A に B (正規表現)が含まれる
```js
test('toMatch', () => {
  expect(A).toMatch(B);
});
```

## A（配列）に B (配列)が含まれる
```js
test('toContainEqual', () => {
  expect(A).toContainEqual(B);
});
```

## A（配列）に Bが含まれる
```js
test('toContain', () => {
  expect(A).toContain(B);
});
```

## A (オブジェクト)に B (オブジェクト)が含まれる
```js
test('toMatchObject', () => {
  expect(A).toMatchObject(B);
});
```

## A.length === B
```js
test('toHaveLength', () => {
  expect(A).toHaveLength(B);
});
```

## A.length !== B
```js
test('not.toHaveLength', () => {
  expect(A).not.toHaveLength(B);
});
```

## A に B プロパティが存在する
```js
test('not.toHaveLength', () => {
  expect(A).toHaveProperty(B);
});
```

## A に B プロパティが存在しない
```js
test('not.toHaveLength', () => {
  expect(A).not.toHaveProperty(B);
});
```

## A で例外が発生した
```js
test('toThrow', () => {
  expect(A).toThrow();
});
```

## A で発生した例外の Throw が B である
```js
test('toThrowError', () => {
  expect(A).toThrowError(B);
});
```
Tips : [Bash] bedファイルの列を削除する


　bash の```cut```コマンドで大丈夫です。

```bash
cut -f [残したい列番号] [元ファイル] > [出力ファイル]
```

実行例
--

　このファイルの染色体番号, start, end 以外を削除します。

```txt:test.bed(Narrow_Peaks_format)
chr1	237660	237810	.	0	.	23	16.8566	-1	-1
chr1	521500	521650	.	0	.	29	27.4601	-1	-1
chr1	564900	565050	.	0	.	110	22.4094	-1	-1
chr1	565400	565550	.	0	.	126	24.6019	-1	-1
chr1	565900	566050	.	0	.	252	101.191	-1	-1
chr1	566460	566610	.	0	.	39	20.1563	-1	-1
chr1	566760	566910	.	0	.	115	20.1563	-1	-1
chr1	567520	567670	.	0	.	177	77.7582	-1	-1
chr1	568400	568550	.	0	.	101	27.8303	-1	-1
chr1	569040	569190	.	0	.	164	40.6964	-1	-1
```

　入力

```bash:bedの列を削除（抽出）する
cut -f 1,2,3 test.bed > out.bed
```

　出力

```txt:out.bed(bed3_format)
chr1	237660	237810
chr1	521500	521650
chr1	564900	565050
chr1	565400	565550
chr1	565900	566050
chr1	566460	566610
chr1	566760	566910
chr1	567520	567670
chr1	568400	568550
chr1	569040	569190
```

　以上です。ありがとうございました。
UIButtonのタイトルは、setTitleよりもsetAttributedTitleのほうが強い

タイトルの通り。

例えば

```objc
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[button setAttributedTitle:@"タイトル1" forState:UIControlStateNormal];
[button setTitle:@"タイトル2" forState:UIControlStateNormal];
```
とすると、表示されるのは@"タイトル1" 。
@"タイトル1"と@"タイトル2"が重なって表示されるわけではなく、
あくまで```setAttributedTitle```したものしか表示されない。

だから、一度```setAttributedTitle```したあとに```setTitle```で文言を変えたい場合は、

```objc
[button setAttributedTitle:nil forState:UIControlStateNormal];
```
を忘れずに！
Macの暇具合を調べる方法

Macが暇そうな時にだけスクリプトを動かしたかった。
こんな感じで、画面の明るさ、アイドル時間、通信量を調べられる。

```ruby

require "open3"

module IsMacIdle
  module_function
  def idle_time
    `ioreg -c IOHIDSystem`.scan(/HIDIdleTime" = (\d+)/)[0][0].to_f / 1000_000_000
  end

  def brightness
    `ioreg -c AppleBacklightDisplay`.scan(/"brightness"[^}]+=(\d+)}/)[0][0].to_f
  end

  def net_traffic(sec = 1)
    Open3.popen3("netstat -i -w #{sec}") do |i, o, e, th|
      o.gets
      o.gets
      a = o.gets.split.map(&:to_i)
      th.kill
      {in: a[2], out: a[5]}
    end
  end
end

if __FILE__ == $0
  p IsMacIdle::brightness
  p IsMacIdle::idle_time
  p IsMacIdle::net_traffic
end

```

https://github.com/ymmtmdk/is_mac_idle
FlaskとPyPDF2を使ってPDFをテキストへ変換するWebアプリを作成する

オライリー本の「退屈なことはPythonにやらせよう」が届いたので
Flaskを使って、ローカルからアップロードしたPDFファイルをテキストへ変換するアプリケーションをザックリ書きます。

```
pip install PyPDF2
```

準備はこれくらいです。

#実態

別段変わったことはしてないです。

```index.py
import os
import PyPDF2
from flask import Flask, render_template, request, redirect, url_for, send_from_directory, session
from werkzeug import secure_filename
app = Flask(__name__)

UPLOAD_FOLDER = './uploads'
ALLOWED_EXTENSIONS = set(['pdf'])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['SECRET_KEY'] = os.urandom(24)

def allowed_file(filename):
    return '.' in filename and \
        filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

@app.route('/')
def index():
    return render_template('pdf.html')


@app.route('/show_pdf', methods=['GET', 'POST'])
def show_pdf():
    if request.method == 'POST':
        send_data = request.files['send_data']
        if send_data and allowed_file(send_data.filename):
            filename = secure_filename(send_data.filename)
            send_data.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            pdf_file_obj = open('uploads/' + filename, 'rb')
            pdf_reader = PyPDF2.PdfFileReader(pdf_file_obj)
            page_obj = pdf_reader.getPage(0)
            result = page_obj.extractText()

            return render_template('pdf.html', result=result)


@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

if __name__ == '__main__':
    app.debug = True
    app.run()
```

```pdf.html
{% extends "base.html" %}
{% block content %}
<form method="post" action="{{ url_for('show_pdf') }}" enctype="multipart/form-data">
  <input type="file" id="send_data" name="send_data">
  <input type="submit" value="送信">
</fomr>
<div>
  {% if result %}
  {% for i in result %}
    {{ i }}
  {% endfor %}
  {% endif %}
</div>
{% endblock %}
```

#動かしてみる

今回はPagesで作成したテンプレートを使ってみます。

<img width="443" alt="スクリーンショット 2017-06-05 17.37.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/808addac-870c-e026-a9b4-ab28b302ec43.png">


こんな感じのPDFファイルをローカルに test.pdf として書き出します。

<img width="254" alt="スクリーンショット 2017-06-05 17.38.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/264add94-69c4-822c-a2aa-b110972e1adb.png">


アプリケーション画面は簡素です。とりあえずアップロードしてみます。

<img width="1203" alt="スクリーンショット 2017-06-05 17.38.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/1803af57-a203-64c9-788c-7157184d8e90.png">

色々やらないといけないことがありますね・・・。
iMacにて、apache-sparkをIntelliJ IDEA で動かすとき SPARK_LOCAL_HOSTNAMEを要求される

iMacで apache-sparkのプログラムをIntelliJ IDEAで組んでいたとき、
実行時に hostname がどうたらこうたらというエラーに遭遇した。

色々とネットで検索すると

export SPARK_LOCAL_HOSTNAME=127.0.0.1
export SPARK_LOCAL_IP=127.0.0.1

と設定しないとだめな場合があると言う。

上記の設定を環境変数に設定すると、すんなりと実行できた。
windowsでは問題なかったので、macのみの現象かもしれない。
【IoT】多言語翻訳メガホンの仕組み

#多言語翻訳メガホンとは
日本語を英語、中国語、韓国語などに翻訳する機能を搭載したメガホン。
メガホンに日本語で話しかけると、音声認識して登録パターンから検索し、翻訳してくれる。
メガホンに搭載されたタッチパネルから拡声したい内容を選択可能。
主に駅や空港、展示会場などで活躍している。普通のメガホンとしても利用可能。

#仕組み・特徴
本体にWi-Fiが搭載されており、インターネットに接続することで下記のようなことが可能。
- ソフトウェアのアップデート
- クラウドサービスに接続して独自の定型文を追加できる。

![メガホンヤク.jpg](https://qiita-image-store.s3.amazonaws.com/0/185261/8b806a1b-c1bc-7711-1df7-70ecc3d43fdb.jpeg)
クラウドサービスを利用しなくとも、約300の定型文が登録されている。
使い方次第で約1800パターンの文章が利用可能。


#なぜ翻訳メガホンに注目したか
2020年東京オリンピックが開催予定であり、多くの外国人観光客が増えてくることが予想されます。
そこで、外国語を話せない場合に、自動で翻訳してくれる存在があると便利ですよね。
まるで、ドラ○もんの「ほ○やくこ○にゃく」みたいでとても便利です。
このメガホンは、日本の「おもてなし」の精神が体現されているといっても過言ではありません。
リアルタイムでの翻訳は、現在ではできませんが(クラウドサービスの使い方次第では可能かも)
近い未来、外国語を学ばずに外国人との会話ができることになるでしょう。

#蛇足になりますが...
ウェアラブル音声翻訳デバイス「ili」というものが存在します。
これが一番「ほ○やくこ○にゃく」に近いでしょうか。
「日本語→英語」「英語→日本語」の2台を持ち合わせれば、ある程度会話が成り立つそうです。
「Swift3.0のcore dataでCRUD!」の補足

[Swift3.0のcore dataでCRUD! - Qiita](http://qiita.com/sasurai_usagi3/items/e47fd82c3cb116c8e953)の補足。

### モデルクラスの自動生成でエラーが出るんだけど
エンティティからモデルクラスを自動生成する前に、まずエンティティを選択する。

![select entity](https://i.stack.imgur.com/4YsTQ.png)

Data Model inspector タブを開く。

![Data Model inspector](https://i.stack.imgur.com/mdcbr.png)


`Codegen`の`Manual/Node`を選ぶ。この後でメニューバー＞Editor>Create NSManagedObject Subclassを行う。

参考：[stackoverflow](https://stackoverflow.com/questions/40351449/invalid-redeclaration-in-auto-code-generate-nsmanagedobject-subclass-swift-3)
秋月のサーボモータ

# SG90サーボモータ
　買ったまでは良かったが、使うあてがなく放置されていたマイクロサーボモータを動作させてみた。Raspberry PIだとGPIOが出ているから、易しい部類。ただ、どの線がVccなのか、GNDなのか、PWM信号入力なのかが説明がないから、私もまた忘れると思うので、とりあえず書いておきます。

| 線の色       | 用途                                                              |
|:------------:|:----------------------------------------------------------------:|
| 黄            | PWMを与える（Highレベルの電圧を掛けた時間でサーボモータの回転角が変わる） 　　|
| オレンジ      | Vcc(定格は4.7V。ただまぁ、5V入れても壊れることはないけど）       　   |
|　茶　         | GND                                                           　　 |

なので、オレンジをRaspberry Piの2,4番ピン、茶色を6番ピン、黄色をPWM出力（ハードウェアタイマに頼るんだったらGPIO18番（12番ピン）に入れてあげると回せます。
touch時に空のファイルではなくテンプレートから作成する

`touch`コマンドは基本的には、新しいファイルの作成に使われている。

しかし、`touch`は空のファイルを作成するのであまり便利ではない。
例えば、`license`ファイルをプロジェクトに含め忘れたので後から追加したいとする。
そのとき叩くのは、`touch license`もしくは、既存のプロジェクトから`license`を探して`cp`をする。

ここで思い至るのは、licenseファイルの内容はほぼ変わることがない。だいたい以下のような感じである。

```
The MIT License (MIT)

Copyright (c) akameco <akameco.t@gmail.com> (akameco.github.io)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
(略)
```

となると、これをテンプレートとしてtouchの代わりにこれを新しいファイルとして作成した方が良さそうだ。

そこで、`touch`の代わりに`touch-alt`を使う。

[![touch-alt](https://github.com/akameco/touch-alt/raw/master/media/logo.png)](https://github.com/akameco/touch-alt)

```
$ npm i -g touch-alt
```

[![touch-alt](https://raw.githubusercontent.com/akameco/touch-alt/master/media/demo.gif)](https://github.com/akameco/touch-alt)



[akameco/touch-alt: Create from a template instead of a new file](https://github.com/akameco/touch-alt)

使い方はtouchと同じだが、touchの本来の機能であるタイムスタンプ更新の機能はない。
自分はほぼ使わないので`alias touch=touch-alt`を`.zshrc`に追記した。

使い方は`touch`と同じだ。
だが、`--add`もしくは`-a`フラグで新しいテンプレートを追加できる。
追加されたファイルは`~/.touch-alt`以下に保存される。


```sh
$ touch-alt --add license
```

後は、`touch`の代わりに`touch-alt`で`license`を作成するだけだ。

```sh
$ touch license
$ cat license

$ rm license
$ ls -la ~/.touch-alt
.             ..            license
$ touch-alt license
$ cat license
The MIT License (MIT)

Copyright (c) akameco <akameco.t@gmail.com> (akameco.github.io)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
(略)
```

もちろん、テンプレートがないファイルは空ファイルを作成する。

## まとめ
自分はわりとyeomenでテンプレートを作成することが多いが、既存のプロジェクトにわりといつも使う設定を持ってきたいときに便利であると思う。
例えば、`.babelr`cや`.eslinrc`、`.editorconfig`などがそれだ。
これらを`touch -a .eslintrc`としておくことで、`touch .eslintrc`をするだけでプロジェクトに追加できる。


[akameco/touch-alt: Create from a template instead of a new file](https://github.com/akameco/touch-alt)

実際のところ、すでにテンプレートが保存してあればそれをコピーしてくるだけのスクリプトだが、この手のスクリプトはどうやってもtestの方が行数が増えるのが面倒なところだった。

```
$ touch-alt --help

  Create from a template instead of a new file

  Usage
  $ touch-alt <source>
  $ touch-alt --add <source>

  Options
  -a, --add         Create new template file
  -o, --overwrite   Overwrite by template

  Example
  $ touch-alt .editorconfig
```
Canvasで文字列を描画する時に長かったら勝手に改行してほしいし長過ぎたら省略したかったのでやってみた

通常Canvasで文字列を描画する場合は[Canvas.drawText](https://developer.android.com/reference/android/graphics/Canvas.html#drawText(java.lang.String, int, int, float, float, android.graphics.Paint))を使います。

```java
canvas.drawText(text, x, y, paint);
```

この方法は**文字列中に改行があっても無視します**。また、文字列が長くて描画領域に収まらない時に勝手に折り返すような親切な機能はありません。
つまり、確実に1行しかなく表示する文字列の長さが予想できる場合にしか使えないということです。

改行されていたら改行表示したいし、Canvasをはみ出るくらい長い時は折り返したい。そういう場合は[StaticLayout](https://developer.android.com/reference/android/text/StaticLayout.html)を使います。

```java
// 最初にStaticLayoutを作る。widthは描画領域の幅。1行の文字列がこの幅を超えると、自動で折り返す。
StaticLayout staticLayout = new StaticLayout(text, paint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, true);

// staticLayout.drawで描画する。座標を指定できないので、まずCanvasの座標を動かしてから描画している。
canvas.save();
canvas.translate(x, y);
staticLayout.draw(canvas);
canvas.restore();
```

ここまでで要望の一つである**勝手に改行してほしい**は実現できます。しかしこの方法ではもう一つの要望である**長過ぎたら省略してほしい**はできません。

どうれば実現できるかいろいろやり方を考えたのですが、最終的に**StaticLayoutを作成した後に行数をチェックして、オーバーしている場合は文字列の末尾を削除して「…」を付けるというのを指定行数以内に収まるまで繰り返す**という力技で実装することにしました…

```java
// タイトルが長すぎる場合は2行で収まるようになるまで短くする
StringBuilder sb = new StringBuilder(text);
while (true) {

  staticLayout = new StaticLayout(sb, paint, width - 16, Layout.Alignment.ALIGN_NORMAL, 1, 0, true);

  if (staticLayout.getLineCount() > 2) {
    // 最後の二文字を削除して、… を付ける
    sb.delete(sb.length() - 2, sb.length());
    sb.append("…");
    continue;
  }

  break;
}
```

この方法の欠点は**極端に入力文字列が長い場合はループを抜けるまでに多数の`StaticLayout`を作らなければいけなくて時間がかかる**ことです。割と重大な欠点な気がするのでこの方法はあまりおすすめしません。が、他に良いやり方が思いつかず……なんか良い方法があったら教えてください！
IBM Planning Analytics Local 2.0の紹介(Cognos TM1の後継製品)

##Planning Analytics Local 2.0の紹介
Cognos TM1の後継製品である、Planning Analytics Local 2.0の簡単な紹介です。

https://www.ibm.com/support/knowledgecenter/SSD29G_2.0.0/com.ibm.swg.ba.cognos.tm1_ug.2.0.0.doc/c_tm1_ug_pref_intro.html#tm1_ug_pref_intro

TM1には元々、クラウドでのみ動作する「TM1 Cloud」と、オンプレで動作する「TM1 10.1、10.2」がありましたが、図のようにTM1 Cloudは「IBM Planning Analytics(略してIPA)」、TM1 10.2の後継は「Planning Analytics Local 2.0(略してPAL)」となりました。
今までCognos TM1 10.1や10.2を使用されていた方は、今後はPALをインストールして頂き、後継製品としてご使用頂く事になります。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/014be6b8-f25b-fdd1-f508-dafc8dde3bdf.png)

PALになって、最も変わったところは、UIのところです。
これまでの「TM1 Web」「TM1 Application」「TM1 Architect」「Operations Console」はPALでも現時点では使用できますが、「Workspace(通称PAW)」がUIとして追加され、今後はPAWに統合されていく方針です。
「Perspectives」として親しまれてきたExcelのUI機能も、現時点ではPALで使用可能ですが、今後はPlanning Analytics for Excel(PAx)に統合されます。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/44d8a0b6-9f1e-556f-4c3a-a3e369c719eb.png)

PAWはブラウザベースのツールです。
TM1サーバーにアクセスし、Cube ViewやWebSheetのオープンだけでなく、Viewのグラフ表示への変換や画像・図形・テキストの挿入、Cubeやディメンション自体の作成など、様々な事が可能です。
画面の雰囲気を見て頂くとわかりますが、Watson AnalyticsやCognos AnalyticsのUIの雰囲気が踏襲されたものになっています。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a33571aa-d133-d6db-a0fa-24e2894fc0d6.png)

PAxは以下のイメージです。
右側のペインからドラッグ&ドロップで、Viewのオープンなどできます。
また、PAxはPerspectivesで使用できた関数の85%が継続使用できるよう、引き継がれているようです。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b3e68663-7bd7-3c31-d760-117c7228e5b6.png)

こちらは、自分の環境内でPALを実装してみた時の概念図です。
PAWを動作させるためには、Docker VMを起動して、その上にPAWのサービスを起動させる必要があります。
このDocker VMを正常に動作させるためには、最低限8GBのメモリーは必要ですので、見積もり時にご注意下さい。
また、PAxはPAW経由でTM1サーバー類にアクセスとなりますので、PAx利用の際には、PAWの実装を予定しておくようお願いします。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/da242991-5f5b-f3ae-6503-b601f7c65c51.png)

今後、PAWやPAxの詳しい機能を紹介していきますので、ご期待ください。
符号化コマンドとしての StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

Base64 と Base32 だけだけど、入力時のデコード、出力時のエンコード処理が可能

### 符号化コマンドとしての StreamRelay.jar

`C:\>type a.txt
HelloWorld
C:\>StreamRelay.bat -localport 0 -remoteport 0 -localinputfile a.txt -RemoteRequestBase64 -remoteoutputfile a.txt.out
C:\>type a.txt.out
SGVsbG9Xb3JsZA==
C:\>StreamRelay.bat -localport 0 -remoteport 0 -localinputfile a.txt.out -LocalRequestBase64
HelloWorld`

### 符号化アルゴリズム

- Base64
- Base32

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Rでデータフレームを転置すると行列になる

# データフレーム→（転置）→行列

Rでデータフレームの行列を縦横入れ替え（転置）すると行列になることに気づきました

転置後のオブジェクトに対して「オブジェクト名$列名」して怒られたので気が付きましたが、それが無かったら一生気がつかなかったかもしれません
人生で幾度となく転置してきたのに...

90度回転するだけでしょうと気軽にtをタイプしてきた自分はなんと浅かったのでしょう

- おなじみ iris the data.frame

```R
> class(iris)
[1] "data.frame"
```

- irisを転置すると行列になる

```R
> iris.t <- t(iris)
> class(iris.t)
[1] "matrix"
```

- とりあえずas.data.frameをかませれば転置したデータフレームが得られます

```R
> iris.t <- as.data.frame(t(iris))
> class(iris.t)
[1] "data.frame"
```

きっともっとスマートなやり方があるはずです
Google OAuth2.0 認証のポリシーが変わったらしい（2017/05/11発表）

ある日、既存で動いていたアプリが新たにクライアントIDを発行してみたら動かなくなった。
うちのアプリではGoogle API Client LibraryのPHP版を使ってます。

どうやらOAuth認証でエラーになっているらしく、

    400. エラーが発生しました。
    
    エラー: invalid_scope
    
    このアプリは次のスコープへのアクセスの確認が完了していません: {invalid = [https://mail.google.com/,https://www.googleapis.com/auth/gmail.readonly,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.compose]}。サポートについてデベロッパーにお問い合わせください。デベロッパーの方は、このプロジェクトで上記のスコープが必要な場合は、プロジェクトへのアクセス権限があるアカウントにログインして、もう一度お試しください。必要でない場合は、サポートについてデベロッパーにお問い合わせください。
    
    Request Details
    client_id=xxxxxxx.apps.googleusercontent.com

というページが出るように。（ユーザ側）

なぜだ。なぜなんだ。
調べた。頑張って調べた。

やっと見つけた原因がコレ。2017/5/11付けで発表された記事。

https://developers.googleblog.com/2017/05/updating-developer-identity-guidelines.html

説明はGoogle翻訳に任せるとして。
要約すると、「Googleがレビューして承認したら認証できるようになるよ」ってことらしい。

つまり、Developer Consoleから新たにクライアントIDを発行する度に、使用するスコープに対する説明責任が問われる、ということのようです。

Gmail APIを使っているのだけれども、注釈が書いてあった。
https://developers.google.com/gmail/api/auth/about-auth

そこに書いてある通り、以下の2通りの方法で解決ができた。
（承認はまだ通ってないけど②で即反映だった）

①OAuth Developer Verification Formで承認を受ける
https://support.google.com/code/contact/oauth_app_verification

②Allow Risky Access Permissions By Unreviewed Appsのフォーラムに参加する
https://groups.google.com/forum/#!forum/risky-access-by-unreviewed-apps

一手間増えたわけですが...とりあえず情報に辿り着くまでにかなり苦労したのでシェアしときます。
マメに記事チェックしてろよ！っていうツッコミはなしで。

この件について何か他にも情報や訂正等があったら教えて頂けると嬉しいです。
それでは。
Visual Studio / WPF > IDE > ListBoxのGridViewColumnHeader.ClickはIntellisenseに表示されない

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

http://gushwell.ldblog.jp/archives/52306698.html
を元に学習中。

ListBoxにおいてGridViewColumnHeader.Clickの指定をしようとしていたが、Intellisenseでは候補が表示されない。
自分の環境では使えない機能だろうかというと、使えた。

https://stackoverflow.com/questions/896294/get-headerclick-event-of-a-wpf-listview
の
Matt Hamilton May 22 '09 at 4:36のコメント
> Events that apply to children like that won't show up in Intellisense - the editor can't know which ones you might want to use!

子要素のイベントに関しては候補を出せないとのこと。

Intellisenseで表示されないのであれば、こういうキーワードがある、と記憶しないといけない。
tensorflowのHelloWorldをもう一度やりたかったのだが,,,


[前回のリンク](http://qiita.com/knight0503/items/e47695b84d89f4e9a40d)
# やりたかったこと
tensorflowにおいて簡単なことをしてみようと思い
とりあえずもう一度tensorflowが動くか試してみようと思い
Hello Tensorflowを出力しようとしたのだが

```
import tensorflow as tf
```
においてエラーが出てしまう。

pyenvのglobalに設定しているのがわるいのかな？とか思って色々試してみるのだが
全てエラー

# 結論

→pathの指定がしてなかったのかな,,,
くだらないことで躓いてしまった。

それとmatplotlibを入れようとしたらエラーがでて困ったので
以下のサイトで対応

http://qiita.com/katryo/items/918667f28301fdec89ba
よく使う linux コマンド

### サーバー内のデータをローカルPCに転送
ディレクトリを転送したい場合は-rを付ける
``scp -r pancake@XXX.XX.XX:sendlocal ~/Desktop/receiveXXX.XX.XX``
.ssh/config で ssh接続を管理している場合は、設定したホスト名そのまま使えます
``scp -r pk:sendlocal ~/Desktop/receiveXXX.XX.XX``

### 同内容の行上位 20を出力
```cat test.log|sort |uniq -c |sort -nr |cat -n  |head -n20```
#### sort
行の並び替え / デフォルトはアルファベット順
-n ・・・ 数値としてソート
sort ・・・ 逆順でソート
sort -rn ・・・ 数値として逆順でソート
#### uniq
「ソート済み」のファイルから重複した行を削除
-c ・・・ 行表示の際、行の数も表示
#### cat
ファイルまたは標準入力の内容をそのまま標準出力に出力
-n ・・・ 行番号も表示
#### head
ファイル先頭を表示
-n ・・・ 行数指定
#### tail
ファイル末尾を表示
-n ・・・ 行数指定
-f ・・・ リアルタイム出力

### 中間ディレクトリも同時作成
-p オプションを使う
```mkdir -p /[ディレクトリ名]/[ディレクトリ名]```

### シンボリックリンクを貼り直す
```ln -snf [リンク先] [設定したいディレクトリ名]```

### ユーザを追加する
``` useradd shiricom```

### screen
[こっちにまとめていた](http://qiita.com/yulily@github/items/42e4398a0217f62c8b3d)

### そのた
[awk](http://qiita.com/yulily@github/items/34f8cabd4641021251d5)