OmniAICreator/Qiita-1.07M huggingface dataset:
メモ：MiniUPnPで家庭用ルータの外向きIPアドレスを知る

参考：[Linux/コマンド/upnpc](http://www.kuma-tech.com/puki/?Linux%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2Fupnpc)

ルータの外向きIPアドレスは、ルータの外のマシンにアクセスして取得するのが一般的だが、ご家庭ルータがUPnP IGD (Internet Gateway Device)に対応していれば、UPnPクライアントを使うことで外向きIPアドレスを取得できる。

http://miniupnp.free.fr/

apt-getでインストールする。

```
sudo apt-get install miniupnpc
```

```
$ upnpc -s
upnpc : miniupnpc library test client. (c) 2006-2010 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
 desc: http://192.168.1.XXX:51382/rootDesc.xml
 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Found valid IGD : http://192.168.1.XXX:51382/ctl/IPConn
Local LAN ip address : 192.168.1.XXX
Connection Type : IP_Routed
Status : Connected, uptime=48328s, LastConnectionError : ERROR_NONE
  Time started : Fri Jul 17 22:36:57 2015
MaxBitRateDown : 1000000000 bps   MaxBitRateUp 1000000000 bps
ExternalIPAddress = XXX.XXX.XXX.XXX
Bytes:   Sent: 28763112 Recv: 125978505
Packets: Sent:   167209 Recv:   178489
```

'ExternalIPAddress = 'のあたりをひっかけて取得すればいいようだ。
ただ、外向きIPアドレスを取得したいだけ場合は ```upnpc -s```よりも、一緒にインストールされる ```external-ip``` コマンドのほうが手っ取り早そうだ。
いくつかのサイトを参考にスクリプトを作る。

```get_extip.sh
#!/bin/sh
EXTIP=/usr/bin/external-ip
CAT=/bin/cat
SAVEFILE=$HOME/extip.txt
#PUSH=`dirname $0`/push.sh
PUSH=`dirname $0`/ifttt.sh

STR1=`$EXTIP`
if [ "$STR1" = "0.0.0.0" ]; then
    STR1="none"
fi
#echo $STR1

if [ -e "$SAVEFILE" ]; then
    STR2=`$CAT $SAVEFILE`
else
    STR2="none"
fi
#echo $STR2

if [ "$STR1" != "none" ]; then
    if [ "$STR1" != "$STR2" ]; then
        echo $STR1 > $SAVEFILE
        $PUSH "HOME IP = $STR1"
    fi
fi

echo $STR1
```

```ifttt.sh``` は、[以前の記事](http://qiita.com/spicemanjp/items/131531d09a4fb2874f20)で作ったもの。
定期的にcronで実行するようにした。/home/pi/extip.txtに変化があった場合はスマホ等にプッシュ通知される。
Macでストレスを無くす設定(スクショ影無効、.DS_Store作らない、警告ダイアログ無効など)

* Macで自分がとりあえずやる設定です
* Terminalで以下コマンドを一度流せばOK
* 再起動コマンドは省いているので、コマンド流した後はMacを再起動してください

# よく使う設定
```
# 隠しファイル表示
defaults write com.apple.finder AppleShowAllFiles -bool true

# スクリーンキャプチャの影無効
defaults write com.apple.screencapture disable-shadow -bool true

# ネットワークボリュームに.DS_Storeを作らない
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true

# ダウンロードしたファイルを初めて開く際に表示される警告ダイアログを無効
defaults write com.apple.LaunchServices LSQuarantine -bool false

# クラッシュリポーター無効
defaults write com.apple.CrashReporter DialogType none

# クイックルックでテキスト選択可能にする
defaults write com.apple.finder QLEnableTextSelection -bool true

```

# アニメーション無効系
```
# ツールチップ表示までのタイムラグをなくす
defaults write -g NSInitialToolTipDelay -integer 0

# フォルダを開くときのアニメーション無効
defaults write com.apple.finder AnimateWindowZoom -bool false

# ファイルを開くときのアニメーション無効
defaults write -g NSAutomaticWindowAnimationsEnabled -bool false

# Dockが表示されるまでの待ち時間を無効
defaults write com.apple.dock autohide-delay -float 0

# Dockを自動で隠すまでの待ち時間無効
defaults write com.apple.dock autohide-time-modifier -float 0
```

# 以下はお好みで
```
# Finderのタイトルバーにフルパスを表示
defaults write com.apple.finder _FXShowPosixPathInTitle -bool true

# Finderのフォルダへ移動のデフォルトフォルダを設定
defaults write com.apple.finder GoToField -string /etc

# デスクトップ上のアイコン表示を無効にする
defaults write com.apple.finder CreateDesktop -bool false
```

# ネタ元、元に戻す方法はこちら
Macの隠された設定を変更する84個のハック集 | Macとかの雑記帳
http://tukaikta.blog135.fc2.com/blog-entry-251.html
Swiftのreduceで集合の条件確認用関数を書いた

[Functional Snippet #5: Reduce · objc.io](http://www.objc.io/blog/2014/11/03/functional-snippet-5-reduce/)
に`all`の例があるのだか、
他にもRubyやlodashなどで良く使用する条件判定用の集合関数の簡易版を勉強がてら`reduce`関数を使用して実装してみました。[^1]
(コレクションの各要素に対して、クロージャーを評価する方式ではないです。)

実際は、クロージャーを評価する方式の
[pNre/ExSwift](https://github.com/pNre/ExSwift#array)とか、[ankurp/Dollar.swift](https://github.com/ankurp/Dollar.swift#every---every)が扱いやすいと思います。

- all

全ての要素がtrueかどうか

```swift
let all: [Bool] -> Bool = { $0.reduce(true, combine: { $0 && $1 }) }
all([true,true,true])  // true
all(Array(0...5).map { $0 % 2 == 0 }) // false
```

- any

一つでもtrueかどうか

```swift
let any: [Bool] -> Bool = { $0.reduce(false, combine: { $0 || $1 }) }
any([false,false,true])  // true
any(Array(0...5).map { $0 > 5 }) // false
```

- none

全てfalseかどうか

```swift
let none: [Bool] -> Bool = { $0.reduce(false, combine: { b1, b2 -> Bool in !b1 && !b2 }) }
none([false,false,false]) // true
none([true,false,false])  // false
```

- one

どれか一つだけtrueかどうか
(reduce使っていない‥)

```swift
let one: [Bool] -> Bool = { $0.filter({ $0 }).count == 1 }
one([false,false,true]) // true
one([false,true,true])  // false
```

### まとめ
`reduce`は、

1. 一時変数を使わない
2. 再帰で処理の実体が見易い

ので簡潔に記述できる。

[YOUたち!RubyでinjectしちゃいなYO!](http://melborne.github.io/2012/06/18/i-am-inject-lover-too/)
上記の記事でArrayの組み込みメソッドを再実装しているので、
SwiftのArrayの組み込みのメソッドも再実装してみようと思います。

[^1]: [module Enumerable (Ruby 2.2.0)](http://docs.ruby-lang.org/ja/2.2.0/class/Enumerable.html)
gceにローカルからgcloudで接続できなくなった場合、そうubuntuで。

# gceのVMにgcloudで接続できなくなった時
+ gcloudと書いてるけど、sshでも一緒かもしれない、きっと一緒だ
+ ubuntuと書いてるけど、きっと他のlinuxでも一緒かもしれない


## gcloudeで接続しようとして下記のエラーが出た場合
```
junk@junk-VirtualBox:~$ gcloud compute --project "custom-unison-XXXXX" ssh --zone "asia-east1-a" "main"
```

```
Warning: Permanently added '104.155.XXX.XXX' (ECDSA) to the list of known hosts.
Permission denied (publickey).
ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].
```

## 対応

１．ローカルPCの接続ユーザのhome下.ssh内の「google_compute_engine.pub」の**ファイル内容**をコピーする。
***※このキーはrsaの公開鍵です***

```
view ~/.ssh/google_compute_engine.pub
```

２．Webの[Compute Engine]の[VM インスタンス]から対象のVMをクリックしサーバの詳細設定を開く。

![image](https://qiita-image-store.s3.amazonaws.com/0/84915/86ee6e0c-eb71-82c3-2fa2-9fae376c8282.png)

４．そのサーバのsshに先ほどコピーした公開鍵のテキストを貼り付ける

![image](https://qiita-image-store.s3.amazonaws.com/0/84915/94b5fbce-1851-5830-d2b1-5303c0e65a0d.png)

５．[保存]をクリック



６．gcloudで接続してみる。

```
junk@junk-VirtualBox:~$ gcloud compute --project "custom-unison-XXXXX" ssh --zone "asia-east1-a" "main"
```


```
Warning: Permanently added '104.155.XXX.XXX' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 3.13.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sat Jul 18 02:47:16 UTC 2015

  System load:  1.09              Processes:           110
  Usage of /:   3.1% of 98.40GB   Users logged in:     1
  Memory usage: 20%               IP address for eth0: 10.240.67.98
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

New release '14.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Your Hardware Enablement Stack (HWE) is supported until April 2017.

Last login: Sat Jul 18 01:43:57 2015 from 121.110.XX.XXX
junk@main:~$ 
```
接続できるようになりました！
zshでオプション一覧の出力を分かりやすくする

[前の記事](http://qiita.com/mollifier/items/02eb36b5a58d119c2f1c)でも紹介したけど、zshですべてのオプションの設定を一覧表示したいときは、`set -o`コマンドを使う。

```
set -o
noaliases             off
allexport             off
noalwayslastprompt    off
alwaystoend           off
noappendhistory       off
autocd                on
autocontinue          off
noautolist            off
... 以下省略 ...
```

でもこれにはちょっと罠があって、先頭にnoが付いているオプションはon/offが逆になる。

例えばさっきの例では、「noaliasesがoff」と出力されている。

```
noaliases             off
```

これは、実は「aliasesオプションがon」であることを表している。つまり、先頭にnoと付いている場合は、先頭のnoを取り除いてon/offを逆にすると本来の意味になる。

これを頭の中で考えると分かりにくいので、コマンドで自動的に変換するようにした。このコマンドでOK。

```
% set -o | sed -e 's/^no\(.*\)on$/\1  off/' -e 's/^no\(.*\)off$/\1  on/'
```

これを呼び出したときの出力はこんな感じ。うまく変換できてる。

```
% set -o | sed -e 's/^no\(.*\)on$/\1  off/' -e 's/^no\(.*\)off$/\1  on/'
aliases               on
allexport             off
alwayslastprompt      on
alwaystoend           off
appendhistory         on
autocd                on
autocontinue          off
autolist              on
```

関数にするとすぐに呼び出せる。

```zsh
function showoptions() {
  set -o | sed -e 's/^no\(.*\)on$/\1  off/' -e 's/^no\(.*\)off$/\1  on/'
}
```

これで便利になるので、試してみてください!
tour of go メモ


#Struct Literals

```go:
type Vertex struct {
	X, Y int
}

var (
	v1 = Vertex{1, 2}  // has type Vertex
	v2 = Vertex{X: 1}  // Y:0 is implicit
	v3 = Vertex{}      // X:0 and Y:0
	p  = &Vertex{1, 2} // has type *Vertex
)

func main() {
	fmt.Println(v1, p, v2, v3)
}
```

##v1 = Vertex{1, 2}  と　p  = &Vertex{1, 2} の違い｡

>
If you say
p := Vertex{1,2}
>
Then you create a new Vertex structure and assign it to the variable p. p has type Vertex.
>
If you do
q := &Vertex{1,2}
>
create a new Vertex structure, take a reference to it, and assign that reference to q. 
q has type *Vertex. 
>
Just like having a Vertex and a pointer to a vertex are different, so is doing Vertex{1,2} and &Vertex{1,2}

>go-lang nuts より

#Array,Map関係

##array
>
Go's arrays are values....This means that when you assign or pass around an array value you will make a copy of its contents...
>
One way to think about arrays is as a sort of struct but with indexed rather than named fields: a fixed-size composite value.
>b := [2]string{"Penn", "Teller"}

> var [4]int -> [int] [int] [int] [int]
>http://blog.golang.org/

##slice
>Arrays..are a bit inflexible,..Slices, though, are everywhere. They build on arrays to provide great power and convenience.

> letters := []string{"a", "b", "c", "d"}

>A slice can be created with ...make. The make function takes a type, a length, and an optional capacity.
len -> length
cap -> capacity
>
var s []byte
s = make([]byte, 5, 5)
// s == []byte{0, 0, 0, 0, 0}

##Capacity and Length
Cap -> length of underlying array.
Len -> length of array. 

```go:

func main() {
    elements := []int{100, 200, 300}

    // Capacity is now 3.
    fmt.Println(cap(elements))

    // Append another element to the slice.
    elements = append(elements, 400)

    // Capacity is now 6—it has doubled.
    fmt.Println(cap(elements))

    // Create an empty slice.
    // ... Its length is 0.
    items := []string{}
    fmt.Println(len(items))

    // Append a string and the slice now has a length of 1.
    items = append(items, "cat")
    fmt.Println(len(items))

}
http://www.dotnetperls.com/

```
##append
test_array - []string{}

GO: append(test_array, "x", "y", "z") 
-> Ruby: test_array << ["x", "y", "z"]

###range and iteration
The range keyword is used with a for-loop. When we use range on a slice, all the indexes in the slice are enumerated.

```go
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
	for index, value := range pow {
		fmt.Println(index, value)
	}
	for _, value := range pow {
		fmt.Println(value)
	}
	for index, _ := range pow {
		fmt.Println(index)
          fmt.Println(index, _) // -> !!エラー!!
	}
}

```
VagrantでCentOS7を起動する時のエラーを消す方法


※ 検証環境

- Vagrant 1.7.2
- VirtualBox 4.3.22
- CentOS7（[利用したイメージ](https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box)）

以下のエラーを消す方法について

```
$ vagrant up
.
.
.
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

### 対応手順
synced_folder自体を使わない場合はその設定を消す。
下記設定をVagrantfileに追記するのみ。

```
config.vm.synced_folder ".", "/vagrant", disabled: true
```

あるいは対象サーバにログインして下記コマンドを実行してもエラーは解消されたと思う（多分）。

```
$ sudo /etc/init.d/vboxadd setup
```

※ 詳細は公式ドキュメントに書いてあるので参照
https://docs.vagrantup.com/v2/synced-folders/basic_usage.html
coding > #if 0 と if (false) { 

コードを実装していてある関数を使用しないとする時

```
#if 0
   MyFunc()
#endif
```
や

```
if (false) {
   MyFunc()
}
```
などの方法がある。

`#if 0`とした場合、コンパイラが完全に無視するので、MyFunc()をMyOtherFunc()に名前変更した時、コンパイルエラーが発生しない。結果として、あとで#if 0を#if 1などにした時にエラーが出て、「MyFunc()は何て名前に変更したっけ？」と混乱を生じる。

一方で、if(false)にしておけば、コンパイラはチェックしてくれるので、MyFunc()をMyOtherFunc()に名前変更した時には「その時点で」エラーが出てくれて修正忘れが防げる。
Cakephp3 + TCPDF でpdf作成

cake3とpdfで検索するとFriendsOfCakeのCakePdfってのがヒットするが、こいつが見事にCake3だと動いてくれない。どうも対応してないようだ。
ということでふつーにTCPDFでやることにした。

まず、composer.jsonに以下追加。

```json:composer.json
		"tecnick.com/tcpdf": "*"
```

更新かける

```bash
sudo composer update
```
続いてPdfController.phpをつくって

```php:src/controller/PdfController.php
<?php
namespace App\Controller;

use App\Controller\AppController;

/**
 * Pdf Controller
 *
 */
class PdfController extends AppController
{
	public function initialize()
	{
		parent::initialize();
		$this->loadComponent('RequestHandler');
	}

    /**
     * index method
     *
     * @return void
     */
    public function index()
    {
		$this->layout = false;
		$this->RequestHandler->respondAs('pdf', [
			// Force download
			//'attachment' => true,
			'charset' => 'UTF-8'
		]);
    }
}
```

あとビューも作る。

```php:src/Template/Pdf/index.ctp
<?php
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8');
$pdf->SetFont('kozgopromedium');
$pdf->AddPage();

$html = <<< EOF
<div>日本語テスト</div>
EOF;
 
$pdf->writeHTML($html, false, false, false, false, 'L'); 
$pdf->Output('sample.pdf', 'I');
```

とりあえずこれで十分だ。
IPアドレス末尾をLチカで表現する君作った

## download

* https://github.com/tukiyo/rpi-led-lastip.git

## 解説

[![動画](http://img.youtube.com/vi/EHFepy2fkIc/0.jpg)](https://www.youtube.com/watch?v=EHFepy2fkIc)

IPアドレスが 192.168.0.156 の場合、末尾の156を取得。
156を1文字づつLEDで以下のように表現。

* 赤点灯しながら、緑1回点滅
* 赤点灯しながら、緑5回点滅
* 赤点灯しながら、緑6回点滅

## Usage

```
sudo lastip.py
```

* rootユーザのcronに登録しておけばよさ気

## code

```py:lastip.py
import socket
import time

def get_my_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("gmail.com",80))
    ipaddr = s.getsockname()[0]
    s.close()
    return ipaddr

def write(filename, str):
    f = open(filename, 'w')
    f.write(str)
    f.close()

class LED:
    def __init__(self, num):
        self.name = '/sys/class/leds/led'+str(num)
        self.trigger = self.name + '/trigger'
        self.brightness = self.name + '/brightness'
        self.delay_on = self.name + '/delay_on'
        self.shot = self.name + '/shot'
    def on(self):
        write(self.trigger, 'none')
        write(self.brightness, '1')
    def off(self):
        write(self.trigger, 'none')
        write(self.brightness, '0')
    def heartbeat(self):
        write(self.trigger, 'heartbeat')
    def oneshot(self, second):
        write(self.trigger, 'oneshot')
        write(self.delay_on, str(second))
        write(self.shot, '1')

def num2led(num, led0, led1):
    led1.on()
    for var in range(0, num):
        led0.oneshot(200) #ms
        time.sleep(0.25)
        led0.off()
    led1.off()
    time.sleep(1)

if __name__ == '__main__':
    led0 = LED(0)
    led1 = LED(1)
    ipaddr = get_my_ip()
    ipaddr_last = ipaddr.split(".")[3]
    for num in list(ipaddr_last):
        num2led(int(num), led0, led1)
```
Tasks for JID analytics tools


A memorandum for development for [JID](http://j-decisionlab.org/) analytics system... :-D

I will develop and deploy the system.
The tasks as below should be processed paralell.

# Line1: Development the system

- [ ] Define the requirements
- [ ] Clarify what we use components for the system
- [ ] Build the system on GitHub

# Line2: Preparation the server
- [ ] Select VPS or own server
- If I select VPS:
	- [ ] Select VPS vendor
	- [ ] Build environment for the system
	- [ ] etc...
- else:
	- [ ] Select location where I set the server
	- [ ] Conclude contract of internet connection
	- [ ] Conclude static IP Address
	- [ ] Change DNS
- etc...
c++ builder XE4, 10.2 Tokyo > TComboBox->Items->Clear()時にItemIndexが-1にクリアされるようだ


```txt:動作確認
C++ Builder XE4
```

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	ComboBox1->ItemIndex = 2;

	int idx1 = ComboBox1->ItemIndex;

	ComboBox1->Items->Clear();
	ComboBox1->Items->Add(L"111");
	ComboBox1->Items->Add(L"222");
	ComboBox1->Items->Add(L"333");

	int idx2 = ComboBox1->ItemIndex;

	int nop = 1;

}
```
上記において idx1==2, idx2==-1となる。

Items->Clear()実行時にItemIndexが-1となる。

Itemsは書き換えたいけど、ItemIndexは保持したいという時は自分で元の値を代入しなおさないといけない。


### 10.2 Tokyo
(追記 2017/12/26)

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

10.2 Tokyoでも同じ動作となることを確認した。
Bluemix上のWatsonサービスの概要

# Bluemix上のWatsonサービスの概要

Bluemix上のWatsonサービスは、[IBM Watson Devloper Cloud](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/)にて詳しく説明されています。

サービスの概要をまとめてみました。[IBM Watson Devloper Cloud](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/)にて各サービスのDemoアプリを試してみると、それぞれのサービスの意味や目的がつかめるかと思います。

![Picture3.jpg](https://qiita-image-store.s3.amazonaws.com/0/86169/942287b3-050f-843e-8ed7-64288d23ae68.jpeg)
WordPressでカスタムフィードを作って、その出力に対してPHPUnitでテスト


WordPressで`add_feed()`を使ってカスタムなフィードを作った際に、たとえば期待した要素が追加されているかとかそういうのをPHPUnitで確認する方法。

テスト用のソースは以下のような感じ

```
/**
 * @runTestsInSeparateProcesses
 */
class YahooFeed_Test extends WP_UnitTestCase
{
	public function setUp()
	{
		parent::setUp();

		$this->factory->post->create_many( 25 );
	}

	public function tearDown() {
		parent::tearDown();
		$GLOBALS['wp_rewrite']->init();
	}

	/**
	 * @test
	 */
	public function do_feed()
	{
		$this->go_to( '/?feed=my-feed' );

		ob_start();
		load_template( ABSPATH . 'wp-includes/feed-rss2.php' );
		$feed = ob_get_clean();
		$xml = xml_to_array( $feed );

		$channel = xml_find( $xml, 'rss', 'channel' );
		$this->assertTrue( empty( $channel[0]['attributes'] ) );

		$title = xml_find( $xml, 'rss', 'channel', 'title' );
		$this->assertSame( get_option( 'blogname' ), $title[0]['content'] );

		$desc = xml_find( $xml, 'rss', 'channel', 'description' );
		$this->assertSame( get_option( 'blogdescription' ), $desc[0]['content'] );

		$link = xml_find( $xml, 'rss', 'channel', 'link' );
		$this->assertSame( get_option( 'siteurl' ), $link[0]['content'] );

		$pubdate = xml_find( $xml, 'rss', 'channel', 'lastBuildDate' );
		$this->assertSame( strtotime( get_lastpostmodified(  ) ), strtotime( $pubdate[0]['content'] ) );

		$items = xml_find( $xml, 'rss', 'channel', 'item' );
		$this->assertSame( intval( get_option( 'posts_per_page' ) ), count( $items ) );

		$enclosures = xml_find( $xml, 'rss', 'channel', 'item', 'enclosure' );
		$this->assertSame( intval( get_option( 'posts_per_page' ) ), count( $enclosures ) );
	}
}
```

## 解説

### `header()`対策

`load_template(ABSPATH . 'wp-includes/feed-rss2.php');`という部分でRSSフィード用のテンプレートを読み込んでいるが、この時にいきなり出力が始まってしまうので、出力バッファリングを使って変数に放り込む必要がある。

また、`@runTestsInSeparateProcesses`を入れておかないとワーニングが出てしまうので入れておくこと。

### ダミーの記事を自動的に放り込む

RSSフィードのテストをするには実際に記事を放り込む必要がある。

WordPressのユニットテスト用のフレームワークには件数を指定するだけで、ダミーの記事を放り込んでくれる便利な関数がある。

```
$this->factory->post->create_many( 25 );
```

### `go_to()`は超便利

たとえばプラグインの中で、`is_feed( 'my-feed' )`を使って条件分岐を行っている時に、以下のコードを入れることで、`$post`とか`$wp_rewrite`とかの値がこのURLに実際にアクセスしたのと同じ値になる。

```
$this->go_to( '/?feed=my-feed' );
```

ためしに以下のようなテストを書くとパスするはず。

```
$this->go_to( '/');
$this->assertSame( true, is_home() );
```

これは超便利!!

### `xml_find()`でXMLに期待した要素があるかチェック

たとえば以下のコードは、`rss\channel\title`といった具合にXMLを掘っていって、取得できたタイトルの値が`get_option( 'blogname' )`と一致しているかどうかをチェックしている。

```
$title = xml_find( $xml, 'rss', 'channel', 'title' );
$this->assertSame( get_option( 'blogname' ), $title[0]['content'] );
```

また、今回の案件では`<enclosure />`という要素を追加する必要があったので、以下のコードでそれがあることを確認している。

```
$enclosures = xml_find( $xml, 'rss', 'channel', 'item', 'enclosure' );
$this->assertSame( intval( get_option( 'posts_per_page' ) ), count( $enclosures ) );
```

### Rewrite対策

たとえば、`$this->go_to( '/feed/my-feed' );`みたいなことをいきなりやってもテスト用のWordPress環境はデフォルトのパーマリンク設定なので404になってしまう。

そんな時は`setUp()`に以下のようなコードをいれておくとオッケー。

```
update_option( 'permalink_structure', '/archives/%post_id%' );
$GLOBALS['wp_rewrite']->init();
flush_rewrite_rules();
```
Heroku Postgresで使うGUIクライアント。

# Pgadmin3 (http://www.pgadmin.org/download/macosx.php)
 ・無料
 ・遅い
 ・機能豊富
 ・OSXあるよ

# Pgweb (https://github.com/sosedoff/pgweb)
・無料
・速い
・Webベース
・GoとjQuery製
・HerokuボタンついてるのでHerokuアカウント持ってたらさくっとコピーできて最高ですね。ベーシック認証も簡単にかけれるし複数人で使うときなんかにいいんじゃないでしょうか。
　　
# Postico (https://eggerapps.at/postico/)
　・有料（4,000円、試用期間あり）
　・OSXアプリ
　・MySQL用のSequel Proみたいな感じだけどそこまで機能ないようなのでそんなもんに4000円なんて。

# 結論
 データビューア目的と、ちょちょっとSQL走らせるならpgweb、DBの詳細が見たい(関数、シーケンスの定義とか検索)ならPgadmin3で。
CSSマップをGoogleWebDesignerで作成

画像にクリッカブルCSSマッピングを作成するのに、GoogleWebDesignerが使えます。
HTMLのmapタグではソースが複雑になるし、修正はたいへんなので再作成となりますが、CSSであればマップの位置の修正も簡単だし、JSを使わなくてもhoverできます。

ただし、opactyは効かないので、rgbaで255,255,255,0.4のように指定します。
vbaで、性能を調べるコード(ミリ秒単位の経過時間)

vbaで、性能を調べるためのコード。
(指定区間の実行時間をミリ秒単位で出力)

#コード

標準モジュールに次のコードを実装する。
沢山ログを入れてしまって、ログがうるさいようなら、timestump_switchでログ出力を抑止できます。

```vb
Declare Function GetTickCount Lib "kernel32" () As Long

Private s_ts_start As Long
Private s_ts_switch As Boolean

Public Sub timestump_start()
    s_ts_switch = True
    s_ts_start = GetTickCount
End Sub

Public Sub timestump_print(Optional marker As String = "")
    If s_ts_switch = False Then
        Exit Sub
    End If
    Dim e As Long, t As Long
    e = GetTickCount
    t = e - s_ts_start
    Dim h As Integer, m As Integer, s As Integer, ms As Integer
    ms = t Mod 1000
    t = (t - ms) / 1000
    s = t Mod 60
    t = (t - s) / 60
    m = t Mod 60
    h = (t - m) / 60
    Dim msg As String
    msg = IIf(marker <> "", marker & ">> ", "") & _
            CStr(h) & ":" & CStr(m) & ":" & CStr(s) & "." & CStr(ms)
    Debug.Print msg
    s_ts_start = e
End Sub

Public Function timestump_switch(sw As Boolean) As Boolean
    timestump_switch = s_ts_switch
    s_ts_switch = sw
End Function
```

#テストコード

簡単なテストコードです。
timestump_switchは使ってない。
実際に使う時は、timestump_print()の引数markerを指定しないと、どこの区間の時間か分からなくなる。

```vb
Private Sub tes_timestump()
    timestump_start
    Dim idx As Long
    For idx = 0 To 5000000
    Next
    Debug.Print Time: timestump_print
    Dim idx2 As Long
    For idx = 0 To 10000000
        For idx2 = 0 To 30
        Next
    Next
    Debug.Print Time: timestump_print "END!!!"
End Sub
```


#実行結果

上記テストコードの実行結果。
（イミディエイトウィンドウに出力されます）

```vb
8:16:42 
0:0:0.297
8:16:47 
END!!!>> 0:0:5.781
```
LINQ > from / where / select

https://www.youtube.com/watch?v=1UqjUgcdq6g&index=4&list=PL90AF0EFFEF782D27
の2:00あたりのコードを参考にした。

```csharp
using System;
using System.Linq;

public void Main()
{
    int[] numbers = new [] { 3, 1, 4, 1, 5, 9, 2 };
    var result = 
        from n in numbers
        where n < 4
        select n;
    foreach(int i in result)
        Console.WriteLine(i);
}
```
http://volatileread.com/utilitylibrary/snippetcompiler?id=22786

```txt:output
3
1
1
2
```
Java8コードサンプル（for文禁止）

**※Java8練習用のコードのため、実用的であるかはあまり考慮していない**

# for文を使わない書き方

Java8から実装されたAPIを使って、for文を使わずにコードを書いた場合のサンプル。
Java8以前の書き方と比較するため、「Java7」にfor文を使ったコードを記載する。

## 指定回数の繰り返し

10回、一定の文字列を出力する。

- Java7

```java
for (int i=0; i < 10; i++) {
	System.out.println("Java!");
}
```

- Java8

```java
IntStream.range(0, 10).forEach(i -> System.out.println("Java!"));
```

他の言語の場合

- Scala

```scala
(0 until 10).foreach(i => println("Scala!"))
// or
(1 to 10).foreach(i => println("Scala!"))
```

- Groovy

```groovy
(0 ..< 10).each { println("Groovy!") }
// or
(1 .. 10).each { println("Groovy!") }
```


### 同じ文字の繰り返し

- Java7

```java
StringBuilder sb = new StringBuilder();
for (int i=0; i < 10; i++) {
    sb.append("*");
}
System.out.println(sb.toString());
```

- [Commons Lang](http://commons.apache.org/proper/commons-lang/)を使う

```java
String asters = StringUtils.repeat("*", 10);
System.out.println(asters);
```

> [StringUtils#repeat](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#repeat-java.lang.String-int-)


- Java8

```java
String asters = IntStream.range(0, 10)
                .mapToObj(i -> "*")
                .collect(Collectors.joining());
System.out.println(asters);
```

> この書き方は書けるというサンプルで、実際はやらない方がいいと思う


## 文字列長が一番多い文字列を返却

- Java7

```java
public String getMaxString(List<String> list) {

	String result = "";
	for (String str : list) {
		if (str != null && str.length() >= result.length()) {
			result = str;
		}
	}
	return result;
}
```

- Java8

```java
public String getMaxString(List<String> list) {

	return list
			.stream()
			.filter(str -> str != null)
			.reduce((str1, str2) -> str1.length() >= str2.length() ? str1 : str2)
			.orElse("");
}
```

## 作った値の合計を返却

- java7

```java
int sum = 0;
for (int i=0; i < 10; i++) {
    sum += i * 2;
}
```

- java8

```java
int sum = IntStream.range(0, 10).map(i -> i * 2).sum();
```

# インナークラスの実装

関数型インターフェイスとなるインターフェイスを持つクラスを、インナークラスで定義した場合。

## Thread#run()の実装

- Java7

```java
Thread t = new Thread() {
	@Override
	public void run() {
		for (int i=0; i < 10000; i++) {
			System.out.print("Nice!");
		}
	}
};
```

- Java8

```java
Thread t = new Thread(() -> {
	IntStream.range(0, 10000).forEach(i -> System.out.print("Nice!"));
});
```

- Java8（ThreadFactoryを使用した場合）

```java
ThreadFactory factory = Executors.defaultThreadFactory();
Thread t = factory.newThread(() -> {
	IntStream.range(0, 10000).forEach(i -> System.out.print("Nice!"));
	});
```
技術英語 > I was about to ask you the same question.

I was about to ask you the same question. (同じ質問をしようとしていた）

同じ疑問を持っていて、「質問しようとしていた」と言いたい時に使う。

関連して思い出したのは
You are not alone in that thinking. (その考えは君だけではないんだ)
mac osがアップデート途中で止まる際の解決法

## 遭遇した事象
mac os 10.10.4へアップデート時に再起動 > ログイン > 中央にappleのロゴとその下に横棒のインジケーターが表示され、1/3くらいいったところで、止まってしまい、それ以降進まない。

![IMG_20150718_002634.jpg](https://qiita-image-store.s3.amazonaws.com/0/46489/f8ecc939-162f-24f1-2a86-78e3bb26bea3.jpeg)

## 環境
- MacBook Air (13-inch, Early 2014)
- Mac OS 10.10.x -> 10.10.4へのアップデート

## 試したこと
**※ 以下、試すかどうかは自己責任にてお願いします。**

### 再起動でメモリリセット系のコマンドを試す
[Macの起動・スリープ・再起動・終了のキーボードショートカットまとめ（27種類）](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-start-up-reboot-shutdown-sleep-logout-with-mac-keyboard-shortcut.html)
ここの、*電源関係のキーボードショートカット* をひと通りためしたけど、改善せず。

### Single User Modeでゴミ箱を空にする
アップデート前、SSDメモリ容量が逼迫していたため、まさかそのせいかと思い、Single User Modeで下記を実行するも、改善せず。

Single User Modeで起動するには、強制終了後、

- 電源ボタンを押す
- ジャーンと鳴ると同時に`⌘+s`を押す
- 一瞬CUIぽいのがでて、背景黒に中心にappleロゴがでて、その下にインジケータがついてる画面が表示されれば、OK
- 自身のユーザでログインすると、read onlyモードでbashシェルに入る

```bash
# ディスクに異常がないかチェック
$ /sbin/fsck -fy
# 書き込み権限をrootに与えた状態でファイルシステムをマウント
$ /sbin/mount -uw /
# ゴミ箱を空にする
$ rm -rf /Users/(ユーザ名)/.Trash/*
$ reboot
```
※ ちなみに、Single User ModeではUSキー配列なので、*はJISキーだと8の位置にくる

参考：[ディスクユーティリティおよび fsck を使用して、起動時の問題を解決する、あるいはディスクをメインテナンスする](https://support.apple.com/ja-jp/HT203176)

### Single User Modeで`/Library/Updates`を削除
[ここ](http://stuff-like-that.com/setupmemo/troubleshooting/231.html)にあったように、`/Library/Updates`を空にしてみるが、改善せず。

```bash
$ /sbin/fsck -fy
$ /sbin/mount -uw /
$ rm -rf /Library/Updates/*
$ rm -rf /Users/(ユーザ名)/.Trash/*
$ reboot
```

### Single User Modeで`/var/private/`を削除
[ここ](http://forums.macrumors.com/threads/where-does-software-update-cache-its-downloads.491471/)で、

> Try inside /private/var/folders/lc/9r02gps93mz0vz3w6mj4gjqw0000gn/C/com.apple.SoftwareUpdate/content/downloads/

といっていたので、これはもしや `/private/var/folders/` が怪しいと思い、同ディレクトリ配下を全部削除してみた。

```bash
$ /sbin/fsck -fy
$ /sbin/mount -uw /
$ rm -rf /private/var/folders/*
$ rm -rf /Users/(ユーザ名)/.Trash/*
$ reboot
```

おぉ?おぉーーーーーーーーーー！アップデートが先に進んだ！
最後の`/private/var/folders/`が良かったのか、途中のプロセスも必要だったのか不明ですが、自分の場合はこれでアップデートが完了しました。

全く仕事中にこんなことがおきるのですから、たまったものじゃありません。
**バックアップは常にしておきましょう** (てか仕事中にアップデートするな)

どなたかの何かの足しになれば幸いです。
クライアント側でcanvasを使って画像をリサイズする

# 目的
ユーザに画像をアップロードしてもらうようなWebアプリで、画像の解像度が大きい場合はサーバ側でアップロードされた画像の解像度をリサイズして格納するような処理を実装することがあると思います。
サーバ側ではなく、クライアント側で画像をリサイズする方法を調べました。

# 機能
次のcanvasのメソッドを利用することでクライアント側で画像のリサイズができます。
[ctx.drawImage(srcImage, srcX, srcY, srcWidth, srsHeight, dstX, dstY, dstWidth, dstHeight)](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage)
第1引数に元画像(Imageオブジェクトや別のcanvasオブジェクトなどを指定可能)
第2, 3, 4, 5引数に元画像から切り取る領域を指定
第6, 7, 8, 9引数にリサイズ後の領域を指定

```js
var scale = 0.5; // 縦横を50%縮小
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var image = new Image();
var reader = new FileReader();
image.crossOrigin = "Anonymous";
image.onload = function(event){
    var dstWidth = this.width * scale;
    var dstHeight = this.height * scale
    canvas.width = dstWidth;
    canvas.height = dstHeight;
    ctx.drawImage(this, 0, 0, this.width, this.height, 0, 0, dstWidth, dstHeight);
    $("#dst").attr('src', canvas.toDataURL());
}
image.src = "https://lh3.ggpht.com/O0aW5qsyCkR2i7Bu-jUU1b5BWA_NygJ6ui4MgaAvL7gfqvVWqkOBscDaq4pn-vkwByUx=w300"; // 元画像
```

# デモ
http://jsfiddle.net/geekduck/nts6rojh/1/
Chromeでは右クリックして「新しいタブで画像を開く」を実行すると実際の解像度が縮小された画像表示されます。
![スクリーンショット 2015-07-18 3.46.57.png](https://qiita-image-store.s3.amazonaws.com/0/16039/f4d6f54e-91bc-aa29-aa56-8f3e85b84971.png)

# まとめ
クライアント側で画像をリサイズする方法を調べました。
この方法を利用すれば、ユーザが指定したファイルをクライアント側でリサイズし、その後サーバにアップロードするといった処理が可能になります。
Bonjourとavahi-daemonのびみょうな違い

raspiのサーバで`avahi-daemon`を走らせて、ホスト名を解決してもらいたい。

#windows(Bonjour)
`ssh user@hostname`とかできる。

#ubuntu(avahi-daemon)
```sh
$ ssh user@hostname
ssh: Could not resolve hostname hostname: Temporary failure in name resolution
```

とかキレられる。
→`user@hostname.local`としないとだめ。
Jupyterのショートカット

Jupyterのショートカット。意外にまとめたサイトを見なかったので、よく使うものを備忘録的に。

#esc を押してコマンドモード
Enter:セルの編集
L :行番号表示。再度押すと非表示
M: マークダウンモード
Y: コードモード
C:セルのコピー
V:コピーしたセルのペースト
K:上のセルに移動
J:下のセルに移動
A:上のセルの選択
B:下のセルの選択
DD:セルの削除
Space:スクロールダウン
Shift + Space: スクロールアップ

#セルの編集モードの時
Shift+Enter:セルの実行、次のセルへ移動
ctrl +Enter:セルの実行のみ

他には[こちら](http://sowingseasons.com/blog/jupyter-keyboard-shortcuts.html)にも英語の記事がありました。全部のショートカットは試していませんが、上のものは、自分で確認しています（ただし確認はMacでしかしてません）。ゴメンナサイ！

(escを押してコマンドモードに切り替わるというように記載を変えました 2015/07/18)
gceからgceへパスワードなしでｓｓｈで接続する。いつものubuntuで。

# GCEのVMから同じくGCEにパスワード無しでSSHで接続する。

+ タイトルにubuntuと書いてあるとおりVMはubuntu12.04だが、linuxならきっと他も一緒
+

## 環境を用意する
+ 今回はどちらもubuntu12.04です
+ ローカルもubuntu(14.04)です。

１．ローカルからgcloud computeで接続元VMに接続する。
　ググればすぐ出ます。

２．接続元VMでrsaのキーを生成する

```
junk@main:~/.ssh$ ssh-keygen 
```

```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/junk/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/junk/.ssh/id_rsa.
Your public key has been saved in /home/junk/.ssh/id_rsa.pub.
The key fingerprint is:
5d:91:44:65:2c:d3:9c:d6:ff:3f:c6:ec:4e:5f:70:12 junk@main
The key's randomart image is:
+--[ RSA 2048]----+
|         =+*o    |
|        . Boo    |
|         o ...E  |
|         . .  .. |
|        S .   o..|
|               +.|
|               .o|
|              oo+|
|              +=+|
+-----------------+
```
※上記はキーの一部を改変しております。予めご容赦ください。

３．生成されたキー(公開鍵)をコピーする
```
$ view /home/junk/.ssh/id_rsa.pub
```

キーファイルの中身は以下のようになってます。
※内容は改変しております。

```
ssh-rsa AAAAB3NzaC1yc2EBBBBBBAQABAAABAQDRsFM0Xbae/HOeDUAgshIkiIWVeN9AHpB6QXrdrdaChrvHKcy6swrqyvMYDwEFoRgLsE1IGGQoC+BOygNWZyrAmBz8lpjKsG0oWI0byDmf5qWdEyuNOQ3j2fccC3pJ3gNoyQUwDhFkf6I2j/7R0jlvhKPENguUHcSBYfBCtsgt1ePgBfrYFGtSZCM8TGKNM+FSP+dmLwW3I7u/umzT7o3oRBMzaGxMsaOHaFFFzC1vZNddCpsIF3Q8S+U2KlzWeJupoeDA6VqxyLKqQnms8TaBlmc25AaA69ZAbWQgSoFBNPgnukwjTqZzyfFCHBSNw7PT4gGVCzW+tyj0iXdU7JnO1 junk@main
```

これを全体コピーします。

４．ブラウザの[Compute Engine]から[VM インスタンス]を選択、接続先VMの名前リンクをクリックし、詳細画面に移動し下部のSSHキーの[編集]ボタンを押す。

![image](https://qiita-image-store.s3.amazonaws.com/0/84915/d567f4fc-b4a6-cab4-c620-cc722e91801c.png)

５．キーデータ全体を入力と出ているところに先ほどコピーしたキーファイルの中身をペイストする。

![image](https://qiita-image-store.s3.amazonaws.com/0/84915/35e3a11a-b513-7bf2-7f6f-b19606ff3bda.png)

６．[保存]ボタンを押す


## 動作確認
接続元から接続先にsshで接続してみる。

```
junk@main:~/.ssh$ ssh junk@worker1
```

```
Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 3.13.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Fri Jul 17 17:34:13 UTC 2015

  System load:  0.0               Processes:           85
  Usage of /:   0.9% of 98.40GB   Users logged in:     1
  Memory usage: 2%                IP address for eth0: 10.240.213.61
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

New release '14.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Your Hardware Enablement Stack (HWE) is supported until April 2017.

Last login: Fri Jul 17 17:15:41 2015 from 10.240.67.98
junk@worker1:~$ 
```

問題なくパス無しでssh出来ました！
＜ラズパイ＞ストリーミングサーバ化計画 その１


#初めに
**「DNLAで家中どこからでも、PCに入っている音楽を聴きたい！」**
**「Androidで外出先からリモートで音楽を聴きたい！」**
という思いから、ラズパイ＋NAS(IOデータ(LANDISK))で、ストリーミングサーバを作ってみるテストです。
（＋それを備忘録としてQiitaに残すテスト）

#構成

* ラズパイ
* NAS：IOデータ(LANDISK)
* owncloud (その２以降)
* BitTorrent Sync (その２以降)
* Ampache (その２以降)
* ddns
* and more!!(そのうち追記します)

#ラズパイ＋IOデータ(LANDISK)のNAS化

今回は第１弾として、ラズパイ＋IOデータ(LANDISK)でラズパイをNASサーバ化させるところの苦労話を記録します。

##CIFSでマウントしてみる
まずは、LANDISKがそもそもWindowsやMacとしかファイル共有できないようなので、CIFSでMountしてみる。

```
sudo mount -t cifs //192.168.xxx.yyy/disk /mnt/test -o iocharset=utf8
```

パスワードを聞かれるので、ラズパイのLoginパスワード、LANDISKの管理用パスワード、Windowsのログインパスワード...
何を入れても、Permission deniedが返され、マウント不可… :sob: 

```
mount error 13 = Permission denied
Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)
```

ちなみに、LANDISK側では、ユーザ制限はかけていない状態で、ラズパイのログイン用と同じID,PWを作成してもダメでした。

##smbclientでは動く…

ところで、smbclientでは、特にパスワード入力することなく、うまくアクセスできました。

```
pi@raspberrypi ~ $ smbclient //192.168.xxx.yyy/docs
Enter pi's password:（未入力）
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.33]
smb: \> ls
  .                                   D        0  Mon Apr 20 23:34:19 2015
  ..                                  D        0  Mon Apr 20 23:35:30 2015

                59480 blocks of size 33553920. 55095 blocks available
smb: \> exit
```

ということは、mountの仕方の部分で、認証関連が何か悪いっポイ…というところまで気づきました。

##これでいけたっぽい!!

いろいろ調べ、CIFSのマウントオプションにセキュリティモードを指定するとうまくいきました！ :smile: 

```
sudo mount.cifs //LANDISK-*****/share /mnt/nas --verbose -o user=pi,pass=,sec=ntlm,ip=192.168.xxx.yyy
```

具体的には、`sec=ntlm`と、セキュリティモードに「NTLM パスワードハッシュを用いる (デフォルト) 」を加えたことです。 
raspberry piではmount.cifsのsecパラメータの値が通常とは異なるのかもしれません…

##豆知識
* 日本語ファイル名の文字化け対策にUTF-8にするとよい
* uid,gidでmountする領域を、Linux側のユーザ、グループに指定することが可能
* 他にもいろいろ (See: man mount.cifs)

##最終的に
自動でマウントできるように/etc/fstabに以下のように登録。うまく動作することを確認しました。

```
//LANDISK-*****/share /mnt/nas cifs username=pi,pass=,sec=ntlm,ip=192.168.xxx.yyy,iocharset=utf8,rw,uid=1000,gid=1000,defaults 0 0
```

#その２に続く…
今になってもう一度調べてみたら、情報ある！ある！
先人たちの苦労を思い知りました…
48時間でSchemeを書こう/評価: 第二部３

# 参考URL
[48時間でSchemeを書こう/評価: 第二部](https://ja.wikibooks.org/wiki/48時間でSchemeを書こう/評価:_第二部)

#ソース
https://github.com/0zawa/scheme_in_48_hours/blob/master/evaluation_2.hs


#equal
型が違っても同じ評価値になるならば真を返すequal関数を実装します。
例としてString "2"とNumber 2の比較は真になります。

具体的にはこれまでに実装した、unpackNum,unpackStr,unpackBool
を対象のLispVal２つに適用して、
等しいものが一つでもあるか判定します。

方法として考えられるのはunpack系の関数をリストに入れて、
mapでLispValに適用する方法ですが、Haskellでは同じ型のものしか
リストに入れることができません。

そこで「言語拡張」を行い、異なる型でもリストにいれることが
できるようにします。

```hs
data Unpacker = forall a. Eq a => AnyUnpacker (LispVal -> ThrowsError a)
```

これでEqのインスタンスであるa型なら全て同じUnpacker型として
扱えるようになります。

AnyUnpackerはUnpacker型を作るためのコンストラクタです。

equal関数実装の前に、Unpackerで包んだunpack系関数を渡して、
２つのLispValが等しいかどうか判定する関数を定義します。

```hs
unpackEquals :: LispVal -> LispVal -> Unpacker -> ThrowsError Bool
unpackEquals arg1 arg2 (AnyUnpacker unpacker) = 
             do unpacked1 <- unpacker arg1
                unpacked2 <- unpacker arg2
                return $ unpacked1 == unpacked2
        `catchError` (const $ return False)
```

Unpackerに包まれた(LispVal -> ThrowsError a)を
取り出して、２つのLispVal、arg1,arg2に適用して、
それを比較して返します。
catchError関数は直前の処理の結果がLeft値のときには
直後の関数にLeft値を適用し、
Right値の場合はそのまま返します。

```hs
> catchError (Left 2) (Right)
Right 2
> catchError (Left 2) (Left)
Left 2
> catchError (Right 3) (Left)
Right 3
```

constは２つの引数をとり、２つ目の引数がどんな値でも
１つ目の値を返す関数です。

```hs
> const 2 1
2
> const 2 4
2
> const "abc" 2
"abc"
```

そのため

```hs
(const $ return False)
```
は、cathError経由でどんな値が渡されようと、
必ずreturn Falseを返します。

最後にequal関数を定義します。

```hs
equal :: [LispVal] -> ThrowsError LispVal
equal [arg1, arg2] = do
    primitiveEquals <- liftM or $ mapM (unpackEquals arg1 arg2) 
                      [AnyUnpacker unpackNum, AnyUnpacker unpackStr, AnyUnpacker unpackBool]
    eqvEquals <- eqv [arg1, arg2]
    return $ Bool $ (primitiveEquals || let (Bool x) = eqvEquals in x)
equal badArgList = throwError $ NumArgs 2 badArgList
```

まず、

```hs
mapM (unpackEquals arg1 arg2) 
                      [AnyUnpacker unpackNum, AnyUnpacker unpackStr, AnyUnpacker unpackBool]
```
の部分ですが、unpackEqualsにUnpacker以外を部分適用した状態にして
mapMでUnpackerのリストを順々に適用していきます。

結果としてThrowsError [Bool]が返るので、
その[Bool]に対しorを適用します。
[Bool]はThrowsErrorに包まれているので、中身に適用するために
liftM関数を使います。
結果として、primitiveEquals変数には真偽値が入ります。

次にeqv関数にarg1,arg2を適用します。

```hs
eqvEquals <- eqv [arg1, arg2]
```
eqv関数の結果はThrowsError LispValなので
eqvEqualsにはLispValが入ります。
env関数はLispValのBoolのみを返すので
envEqualsはBoolコンストラクタを適用した真偽値になります。

最後の

```hs
return $ Bool $ (primitiveEquals || let (Bool x) = eqvEquals in x)
```

の中の

```hs
let (Bool x) = eqvEquals in x)
```
ではLispValのBoolを外した真偽値を返しています。
その結果とprimitiveEqualsとのorを取って、
その結果をBoolコンストラクタに適用してreturnで
ThrowsError LispValにします。

リストの要素が２つ以外でequal関数を呼ばれた場合は
エラーにしています。

最後にprimitivesにこれまで作った関数を
追加して、評価:第二部を終了します。

```hs
              ("car", car),
              ("cdr", cdr),
              ("cons", cons),
              ("eq?", eqv),
              ("eqv?", eqv),
              ("equal?", equal)]
```
進捗どうですかブーム???に Perl でのりかかる

[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure](http://qiita.com/esehara@github/items/c57cafa57aa92dc1e3c2)
[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム](http://elephnote.com/blog/archives/936)
[「進捗・どう・です・か」をHaskellで書いてみた](http://qiita.com/lotz/items/b47913cb27052cf9e127)
[進捗どうですかブーム?にrubyでのっかってみる](http://qiita.com/kataware/items/edc8d0f02a16a21c47dc)
[進捗どうですかブーム??にPythonでのりかかってみる](http://qiita.com/hisatoshi/items/0ccca55168d58a940661)
[進捗どうですかブーム???にShellScriptで挑むフリしてExpectに逃げる]
(http://qiita.com/mpyw/items/e5a93e7195d8a8284a1f)

## とりあえず愚直に移植。
はい、普通すぎて何も面白くありませんね。

```Perl:shinchoku.pl
#!env perl

use utf8;
use strict;
use warnings;

binmode(STDOUT, ":utf8");
$|=1;

our @words =qw/進捗 どう です か/;
our $count = scalar @words;
our $end_word = qq/???/;

{
  my $length = 0;
  my $sorted = 0;
  my $last_idx = 0;
  while ( $sorted != $count -1 ) {
    my $idx = int(rand($count));
    my $word = $words[$idx];
    print $word;
    $length += length($word);
    $sorted = $idx > $last_idx ? $sorted +1 : 0;
    $last_idx = $idx;
  }
  print $end_word;
  $length += length $end_word;
  printf "\n%d文字で煽られました\n", $length;
}
```

もっと Perl らしさを前面に出したいですがどうするのが良いでしょう。
しばらく書いていなかったのでカンが鈍っていて困ります。



## 末尾再帰最適化 ver を書いてみた。

```Perl:shinchoku.pl
#!env perl

use utf8;
use strict;
use warnings;

binmode(STDOUT, ":utf8");

use Object::String;

package Object::String;

use overload qq/""/ => \&to_string;

package Object::Array;

use overload qq|<=>| => sub { $_[0]->size <=> $_[1]->size } ;

sub pick {
    my $self = $_[0];
    $self->elem(int(rand($self->size)));
}

# ここまでおまじない

package Main;

use Object::String qw/str/;
use Object::Array qw/Array/;

our $words = Array([qw/進捗 どう です か/])->map(sub{ str($_); });
our $end_word = str(qq/???/);

{
  my $length = 0;
  my $cache  = Array();
  my $calc;
  $calc = sub {
    print my $word = $words->pick;
    $length += $word->length;

    $cache->push($word);
    $cache->shift while $cache > $words;

    if ( "@{$words}" eq "@{$cache}" ) {
        return;
    } else {
       goto &$calc;
    }
  };
  $calc->();
  print $end_word;
  $length += $end_word->length;
  printf "\n%d文字で煽られました\n", $length;
}
```

~~配列のもうちょっと小綺麗なモジュールがあれば……~~
ちょっとマシになったけれど機能不足でおまじないが多くなってしまった。
[Parse]saveAll()に注意

またまた、ひょんな罠にハマったので、
注意喚起を兼ねつつ愚痴..(ry

## 結論

いきなりですが、深い話ではないのでさくっと

**リファレンスの`saveAll()`の説明には抜けがある！**

っていうことです。
リファレンスによると`Pase.Object.saveAll()`は
戻り値なしのvoidっぽい書き方されてるんですけど（今は....）
実際やってみると、他の操作どうよう`Promise`オブジェクトを返してきます

なので、これを拾わずに処理をすると、終わってしまったり、
エラーハンドリングができなかったりします

ま、`Pase.Object.destroyAll()`には、ちゃんとreturnの記載があるので、
そこで気づくべきなんですけど...

## 実際に遭遇した問題

Cloud.Codeでとあるジョブを登録して実行してたのです...

```js:main.js

Parse.Cloud.job("MyJob", function(request, response) {
    var Foo = Parse.Object.extend('Foo');
    var query = new Parse.Query(Foo);
    query.equalTo('bar', 'xxx');
    query.find().then(function(list) {
        // ここでlistをもとに何かParse.Objectの配列を作って
        var objects = [];
        // 保存をする
        
        // saveAll()がvoidだとおもってたので promise 作成
        var promise = new Parse.Promise();
        Parse.Object.saveAll(objects, {
            success: {
                return promise.resoleve('success');
            },
            error: {
                return promise.reject('error!');
            }
        });
    }).then(function(result) {
        // 正常終了
        response.success('fin');
    }, function(error) {
        // エラー終了
        response.error('error');
    });
});

```

とま、こんな感じで、リストを取得して、
それを編集して別のテーブル（クラス）へBulkInsertするっていう処理をしたかったのですが、
運良く（？）`saveAll()`でエラーがおきてたんですけど
なぜかsuccessの方を通るっていうね...

`saveAll()`が`Promise`オブジェクトを返すっていうなら、
話はかわってくるんですよね...
ちゃんとリファレンスをみてたばっかりに、こう書いてたのに！（しつこいｗ

## 結局はこう

```js:main.js

Parse.Cloud.job("MyJob", function(request, response) {
    var Foo = Parse.Object.extend('Foo');
    var query = new Parse.Query(Foo);
    query.equalTo('bar', 'xxx');
    query.find().then(function(list) {
        // ここでlistをもとに何かParse.Objectの配列を作って
        var objects = [];
        // 保存をする

        // saveAll()がPromiseを返すのでそのまま投げる
        return Parse.Object.saveAll(objects);
        
    }).then(function(result) {
        // 正常終了
        response.success('fin');
    }, function(error) {
        // エラー終了
        response.error('error');
    });
});

```

ただ返せばいい。そう...ただ返せば...orz

いや、なんだかんだいっても、重宝してますよ。Parse！！（笑）

## 参考

[Parse.Object - Parse JavaScript SDK Reference](https://parse.com/docs/js/api/symbols/Parse.Object.html#.saveAll)
くっそーーー！(｀；ω；´)
全角文字を半角文字に変換する


全角文字を使いこなす人頭良すぎる。
どうやって入力しているのか想像できない。

```vbnet
function zen2han(byval text)
    dim i, buf, ch
    i = 1
    buf = ""
    do while i <= len(text)
        ch = mid(text, i, 1)
        select case ch
        case "／" ch = "/" ' 意図的に使用される全角文字
        case "．" ch = "." ' 半角記号に見えて実は全角というパターン
        case "，" ch = "," ' 半角記号に見えて実は全角というパターン
        case "－" ch = "-" ' 半角記号に見えて実は全角というパターン
        case "―" ch = "-" ' 半角記号に見えて実は全角というパターン
        case "‐" ch = "-" ' 半角記号に見えて実は全角というパターン
        case "♯" ch = "#" ' 信じられないことに音楽記号を使ってくる人が居ます
        case "　" ch = " "
        case "！" ch = "!"
        case "”" ch = """"
        case "＃" ch = "#"
        case "＄" ch = "$"
        case "％" ch = "%"
        case "＆" ch = "&"
        case "’" ch = "'"
        case "（" ch = "("
        case "）" ch = ")"
        case "＝" ch = "="
        case "ー" ch = "-"
        case "～" ch = "~"
        case "＾" ch = "^"
        case "｜" ch = "|"
        case "￥" ch = "\"
        case "「" ch = "["
        case "」" ch = "]"
        case "｛" ch = "{"
        case "｝" ch = "}"
        case "｀" ch = "`"
        case "＠" ch = "@"
        case "＊" ch = "*"
        case "：" ch = ":"
        case "；" ch = ";"
        case "＋" ch = "+"
        case "＜" ch = "<"
        case "＞" ch = ">"
        case "、" ch = ","
        case "。" ch = "."
        case "？" ch = "?"
        case "・" ch = "/"
        case "＿" ch = "_"
        case "１" ch = "1"
        case "２" ch = "2"
        case "３" ch = "3"
        case "４" ch = "4"
        case "５" ch = "5"
        case "６" ch = "6"
        case "７" ch = "7"
        case "８" ch = "8"
        case "９" ch = "9"
        case "０" ch = "0"
        case "ａ" ch = "a"
        case "ｂ" ch = "b"
        case "ｃ" ch = "c"
        case "ｄ" ch = "d"
        case "ｅ" ch = "e"
        case "ｆ" ch = "f"
        case "ｇ" ch = "g"
        case "ｈ" ch = "h"
        case "ｉ" ch = "i"
        case "ｊ" ch = "j"
        case "ｋ" ch = "k"
        case "ｌ" ch = "l"
        case "ｍ" ch = "m"
        case "ｎ" ch = "n"
        case "ｏ" ch = "o"
        case "ｐ" ch = "p"
        case "ｑ" ch = "q"
        case "ｒ" ch = "r"
        case "ｓ" ch = "s"
        case "ｔ" ch = "t"
        case "ｕ" ch = "u"
        case "ｖ" ch = "v"
        case "ｗ" ch = "w"
        case "ｘ" ch = "x"
        case "ｙ" ch = "y"
        case "ｚ" ch = "z"
        case "Ａ" ch = "A"
        case "Ｂ" ch = "B"
        case "Ｃ" ch = "C"
        case "Ｄ" ch = "D"
        case "Ｅ" ch = "E"
        case "Ｆ" ch = "F"
        case "Ｇ" ch = "G"
        case "Ｈ" ch = "H"
        case "Ｉ" ch = "I"
        case "Ｊ" ch = "J"
        case "Ｋ" ch = "K"
        case "Ｌ" ch = "L"
        case "Ｍ" ch = "M"
        case "Ｎ" ch = "N"
        case "Ｏ" ch = "O"
        case "Ｐ" ch = "P"
        case "Ｑ" ch = "Q"
        case "Ｒ" ch = "R"
        case "Ｓ" ch = "S"
        case "Ｔ" ch = "T"
        case "Ｕ" ch = "U"
        case "Ｖ" ch = "V"
        case "Ｗ" ch = "W"
        case "Ｘ" ch = "X"
        case "Ｙ" ch = "Y"
        case "Ｚ" ch = "Z"
        end select
        buf = buf & ch
        i = i + 1
    loop
    zen2han = buf
end function
```
いろんなサービスのロゴリソースまとめ

だいたい、`サービス名 brand resources`とかでググれば出てくる。
随時、メモる用の投稿。

## YouTube
http://www.youtube.com/yt/brand/ja/downloads.html

## Facebook
https://www.facebookbrand.com/

## Twitter
https://about.twitter.com/company/brand-assets

## SoundCloud
https://soundcloud.com/press

## bandcamp
見つかんなかった。

## iTunes
見つかんなかった。
一応、Macでキャプった。
![itunes_logo.png](https://qiita-image-store.s3.amazonaws.com/0/8895/fa2adc79-dbe8-b2c3-2054-983879b44cdb.png)

## Spotify
https://developer.spotify.com/design/
Bluetooth 4.0 ver.の話

#Bluetoothとは
Bluetoothとは、数mから数十m程度の距離の情報機器間で、電波を使い簡易な情報のやりとりを行うのに使用されるもので、キーボード、マウスなどのOA機器や無線イヤホンなどが有名。

規格もあり、最新は4.2 ver.です。
>参考資料
https://ja.wikipedia.org/wiki/Bluetooth


#BLEとは
BLEはBlutooth Low Energyの略称であり、Bluetooth 4.0の拡張使用として策定されたものです。4.0以前のBluetooth企画とは互換性がありません。
>参考資料
http://e-words.jp/w/BLE.html

特徴としては以下があげられます。
・ボタン電池一個で数か月から数年稼働が可能
・低レイテンシー
・2.4GHzで通信
・同時接続数に制限なし（企画上は2の31乗）

BLEはiOS7.0、Android4.3から使用できます。

#iBeacon
BLEは、AppleがiOS7のフレームワークにおいてBLEを利用した位置情報の取得や端末特定を行い、個別の情報をやりとりする仕組みを実装したことがきっかけで普及しました。
プログラミングガイドの中でこの技術を総称して「iBeacon」と呼ばれます。

「iBeacon」は、iPhone／iPad／iPod touch（iOS端末）で「Beacon（ビーコン）」と呼ばれる電波を受信することで、数十cm～数十mという範囲（精度）でビーコンの発信器の位置を特定、確認することができます。

この機能を応用し、店舗に近づいたことを通知したり、実店舗内の案内情報を提供したり、入店したら割引クーポンを配ったりという用途に使用されています。
>estimoteというベンチャー企業が「Estimote Beacon」というiBeaconsに対応したデバイスを発表、実際の利用シーンを想定したシミュレーション動画が話題
https://youtu.be/sUIqfjpInxY

#iBeaconの使用例
2014年では「EPARK」がiBeaconを使用した来店促進サービスを開始。
iBeaconを使った勤怠管理システム「AR Stamper」の発表など、様々な用途に使用されています。
>**導入例**
http://o2o.abeja.asia/product/post-7282/

#AndroidでiBeacon
iBeaconはiOS特有の機能でありますが、Androidでも互換のプログラムを作成することが可能です。
実装はやや面倒ですが、AndroidでもiBeaconが使用できるライブラリがあるのでご参考ください。
>**AltBeacon**
http://altbeacon.org/

実装方法は[【AltBeaconの実装方法】](http://qiita.com/a_nishimura/items/2974fd0956c9e00b6bec)を参考にしてみてください。

#おわりに
BLEの使用並びにiBeaconを導入したサービスはすでに普及されています。
iBeaconを取り入れたサービスの幅は引き続き拡大していくことが予想されるので、注目を続けたいと思います。