OmniAICreator/Qiita-1.07M huggingface dataset:
PaloaltoのGlobalProtectでFailed to find PANGP virtual adapter interfaceが出た時の対処

# 概要
GlobalProtectを使おうとしたら**Failed to find PANGP virtual adapter interface** と表示されて
接続できなかったときの対応方法が書いています。
うまくいくと、接続できるようになります。

# 前提条件
- 前まで接続できていたのに、ある日突然接続できなくなった。
- windowsであること

# 準備
GlobalProtectをインストールするための.msiファイルを用意する。

# 対応
## WMIサービスを止める
winキー + Ｒキーを押して表示される*ファイル名を指定して実行*ダイアログにservice.mscと入力して実行。
*Windows Management Instrumentation* というのがあるので右クリック→停止を選択して止める
## フォルダー配下のファイルの削除
*C:\Windows\System32\wbem\Repository* 配下のファイルをすべて削除します。
WMIサービスが止まっていないと削除できません。
## レジストリの削除
*HKEY_LOCAL_MACHINE > Software > Software*　と
*HKEY_LOCAL_MACHINE > HKEY_CURRENT_USER > Software*　に
ある*Palo Alto Networks* というフォルダを削除
## GlobalProtectのアンインストール
アンインストールしましょう。
## 再起動する
ＰＣを再起動しましょう
## GlobalProtectの再インストール
用意した.msiのファイルを実行してインストールしましょう。
## WMIサービスが起動していることを確認
winキー + Ｒキーを押して表示される*ファイル名を指定して実行*ダイアログにservice.mscと入力して実行。
*Windows Management Instrumentation* というのがあるので起動していることを確認します。
## 接続してみる
これで接続できるはず！
# 参考
https://live.paloaltonetworks.com/t5/Management-Articles/Error-Failed-to-find-PANGP-virtual-adapter-interface-when/ta-p/65259
面接でレガシーIT企業かどうかを見分けるための質問集

#目的
　IT企業の面接では人事部の人だけでなく開発部の人が同伴していることが多いので、疑問を持ったことはなんでも聞いてみましょう。うまく行けば、その企業が保守的なのか、革新的なのか知ることができます。

#質問例

##質問：多い時で1つの関数[^1]に何行くらいのコードを書きますか？
###レガシーIT企業の模範回答
　**「2000[^2]ステップ[^3]くらいは当たり前かな！」**
###理由
　レガシーIT企業ではステップ数が多いと評価されるという文化があるので。
　特に自称腕利きは、「1日で○○ステップ書いた！」というよくわからない自慢をしてくることが多いです。
###補足
　データベース関係をウリにしている企業なら関数をSQL文に置き換えてもいいかもしれませんね

##質問(新卒)：何年働くとプログラマからシステムエンジニアになれますか？

###レガシーIT企業の模範回答
　**「うちは最初からシステムエンジニアをやってもらいます。[^4]」**
###理由
　レガシーIT企業ではコーディングを外注に出しているので、プログラマのまま年次を進めるというキャリアパスが存在しない可能性が高いです。
###補足
　中途採用の場合もキャリアパスに関する質問をしたほうがいいと思います。

##質問：バージョン管理には何のツールを使用していますか？

###レガシーIT企業の模範回答
　**「VSS[^5]かな、要は使う側が何をしたいかということですよ。」**

###理由
　レガシーIT企業は枯れた技術を好みます。
###補足
　VSS → Subversion → Gitの流れが比較的ポピュラーなバージョン管理システムの移り変わりだと思います。

##質問：CIツールの導入はされていますか？

###レガシーIT企業の模範回答
　**「うちでは導入してないね」**

###理由
　レガシーIT企業は新しいツールの導入に慎重なので。
###補足
　模範回答以外の回答例としては、「Jenkins使ってる」、「Redmine使ってる」、「自動テストやってる」などの回答が考えられます。

##質問：社内勉強会のような、社員のITスキルが向上する施策はなにか実施されていますか？

###レガシーIT企業の模範回答
　**「教育は基本的にOJTだね、心配しなくても先輩が優しく教えてくれるから大丈夫！」**

###理由
　レガシーIT企業は頭数と規則によってプロジェクトを乗り切ろうとするので、個人にプログラミングスキルを求めていません。社内にもIT技術に興味がない人が多く、勉強会を開催できる土台が作られていません。

#終わりに
　あとでなにか思いついたら追加します。こういうのもあるよというのがあればコメント欄にお願いします。

[^1]: メソッドは専門用語なので関数といいましょう。
[^2]: 数が多いほど加点されます。
[^3]: ステップ数という言葉が出ると加点されます。 
[^4]: 年数が少ないほど加点されます。
[^5]: 古ければ古いほど高得点です。
gulpfile.jsの書き方確認。改

先日sassをコンパイルした際に、gulp-combine-media-queries、メディアクエリをcssの下の方に整えるプラグインを入れていたんですが・・・・
cssを見てみたら整えられてない！なんで！？

先輩に教えていただき、問題解決とアドバイスをいただいたので、共有させていただきます・・・・。


20190401追記：
保存するたびにsassは以下全てコンパイルしてましたが、更新かけたやつだけコンパイルする都合があったのでgulp-changedを入れました。

```js:gulpfile.js

var gulp = require('gulp');
var sass = require('gulp-sass');
var plumber = require('gulp-plumber');
var changed = require('gulp-changed');//20190401追加
var sourcemaps = require('gulp-sourcemaps');
var cmq = require('gulp-combine-media-queries');//@media
var runSequence = require('run-sequence');
var DEST = './css/';//20190401追加

//sass
gulp.task('sass',function(){
    return gulp.src('sass/*.scss')
    .pipe(sourcemaps.init())
    .pipe(plumber())
    .pipe(sass({style : 'expanded'}))
    .pipe(sourcemaps.write())
    .pipe(changed(DEST))
    .pipe(gulp.dest(DEST));
});
//media
gulp.task('cmq',['sass'], function () {
  return gulp.src('css/*.css')
    .pipe(cmq({
      log: false
    }))
    .pipe(gulp.dest('css'));
});
//監視
gulp.task('watch', function () {
    gulp.watch('sass/*.scss', ['cmq']);
});
gulp.task('default', function(callback) {
    runSequence('sass', 'cmq', callback);
});

```

##runSequence
まずコマンドで`gulp`と叩いた時に実行されるやつ！
新しく追加したこちらのプラグイン
`var runSequence = require('run-sequence');`
gulpタスクの実行順序を指定できるものです。

defaultタスクに
`runSequence('sass', 'cmq', callback);`
で、左から順に処理をしてくれます。

```js
gulp.task('default', function(callback) {
    runSequence('sass', 'cmq', callback);
});
```

function()←の中にcallbackと書かないとエラーになるので忘れずに！

左から順の指定をしてますが、特に順番を気にしないタスクの場合は
` runSequence(['sass', 'cmq'], callback);`
というように並列化したいタスクは配列で書きます。




##return gulp

これがすごい大事だそうで・・・・`gulp watch`で実行されるやつを修正しました。

```ruby:gulpfile.js

var gulp = require('gulp');

gulp.task('sass',function() {
    console.log('先にやって欲しい処理');
});
gulp.task('cmq',function() {
    console.log('後にやって欲しい処理');
});

gulp.task('watch', function () {
    gulp.watch('sass/*.scss', ['sass','cmq']);
});

```
前はこういう書き方だったんですけど、ターミナルみたらどうやらcmqを先に処理し終わってsassを実行してる感じでした。なんだと・・・・


というわけでそれぞれのタスクに`return gulp`をつけてタスクの処理を返す、
さらにメソッドの第2引数を使います。

```ruby:gulpfile.js

gulp.task('sass',function(){
    return gulp.src('sass/*.scss')
    .pipe(sourcemaps.init())
    .pipe(plumber())
    .pipe(sass({style : 'expanded'}))
    .pipe(sourcemaps.write())
    .pipe(gulp.dest('css'));
});

gulp.task('cmq',['sass'], function () {
  return gulp.src('css/*.css')
    .pipe(cmq({
      log: false
    }))
    .pipe(gulp.dest('css'));
});

gulp.task('watch', function () {
    gulp.watch('sass/*.scss', ['cmq']);
});

```

`gulp.task('cmq',['sass'], function () {`
これが**sassタスクが終わったらcmqタスクを実行**、ということになるらしいです。
これはreturnつけて処理を返してるのでちゃんと動きます。


前の記事を書いてる時は処理の順序を気にせず書いていたので、いざcmqができてないとわかった時は焦りました・・・
こうして学んでいくんだなぁ・・・。
Ruby の i18n を単独で使う

# はじめに

[i18n](https://github.com/svenfuchs/i18n) という gem は，Ruby on Rails アプリの多言語化のために使われているが，Rails 専用というわけではない。こいつを Rails とは無関係に単独で使うにはどうすればよいか。

えー，お急ぎの方は次の節へ飛んでください。

本家の [README](https://github.com/svenfuchs/i18n/blob/master/README.md) にはあまり情報が無い。[リポジトリー](https://github.com/svenfuchs/i18n) にはサンプルファイルも見当たらない。

**いっぱしのプログラマーならまずソースを読む**ところだが，いっぱしではないので安直なほうへ流れることにした（いやその前に定石として [テスト](https://github.com/svenfuchs/i18n/tree/master/test) を読もうとしたんだけど，どこを見ていいか分からず 20 秒で挫折）。

えー，「Ruby の I18n を単独で使う」でググります。
tbpgr さんのブログ記事「[Ruby | i18nをRuby単独で利用する](http://tbpgr.hatenablog.com/entry/20131124/1385309806)」が見つかる。
これに従ってやってみる。

ただ，この記事には不可解な点があった。i18n に翻訳ファイルを与えるところが

```rb
I18n.load_path = []
Dir.glob("../locale/*.yml").each do |f|
  lang = []
  lang << f
  I18n.load_path << lang
end
```

になっているのだ。
`lang` って変数は何をやっているのだろう？　これって

```rb
I18n.load_path = Dir.glob("../locale/*.yml").map{|path| [path]}
```

でよいんでは？　それとも転記ミスで，本当はもう少しややこしいコードだったのかな。

そもそも，`I18n.load_path=` って，配列の配列を与える必要があるのか？

まあともかくやってみたら動いたので，とりあえずよし。

で，試した結果をもとに以下を書いていくことにする。

# i18n は何をするもの

ウェブアプリケーションに限らず，アプリケーションを多言語化したい。

出てくる文言すべてにキーワードか何かを割り当てておき，言語ごとにキーワードと文言の対照表を編集しておくのだ。

アプリケーション上では，何か表示したいときにそのキーワードを指定する。どこかに言語のスイッチがあって，それによって実際に出てくる文言が変わる，と。

平たく言えばそういう仕組み。

# i18n の使い方

## インストール

まず i18n をインストール。

```bsh
gem install i18n
```

## 翻訳ファイルの設置

翻訳ファイルを YAML 形式で用意。拡張子は `.yaml` はダメで，`.yml` にしなければならない。
拡張子でファイルの種類を見分けているようなので，たぶん YAML 形式以外のフォーマットにも対応してるんだと思う。

とりあえずちょっと試すだけなので，全言語を一つのファイルに収めることにする。規模が大きくなったら言語ごとに別のファイルにしたほうがいい。

```yaml:translation.yml
ja:
  orei: おおきに
ko:
  orei: 감사합니다
ru:
  orei: Спасибо
en:
  orei: Thank you
```

これで準備完了。

## 使う

```rb
require 'i18n'

I18n.load_path = ["translation.yml"]

I18n.locale = :ja
puts I18n.t("orei") #=> おおきに

I18n.locale = :ko
puts I18n.t("orei") #=> 감사합니다
```

ちょー簡単。拍子抜けするくらいだ。

load_path は配列の配列にする必要はなかった（しても中で `flatten` される）。

実際のアプリケーションでは言語ごとにファイルを分けるだろうから，それらのファイルへのパスの配列を渡せばいいだろう。

`I18n.locale=` に渡すのは文字列でもシンボルでもいい。

翻訳データは入れ子にもできる。例えば ja のところを

```yaml
ja:
  foo:
    bar: ばあ
```

と書いておけば，

```rb
I18n.locale = :ja
puts I18n.t("foo.bar") #=> ばあ
```

で呼び出せる。

# おわりに

i18n にはきっといろんな機能があるんだろうし，知るべきこともいろいろあるんだろうけど，とりあえず当初の目的は果たせた。

# おまけ（i18n）

「i18n」というのは，「internationalization」の略で，先頭の「i」と末尾の「n」の間に 18 字あることから，このような略し方にされているようだ。日常的に使う英単語の中では，20字はかなり長いほうだ。

似たような略語として「L10N」（localization）もある。

なんで「i18n」が小文字で「L10N」が大文字かというと，[Wikipedia「国際化と地域化」](https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%A8%E5%9C%B0%E5%9F%9F%E5%8C%96) によれば，大文字の I（アイ）と小文字の l（エル）が互いに紛らわしいから避けたということらしい。

CIA（米国中央情報局）あたりでは counterintelligence（防諜活動）のことを「c17e」なんて略すんだろうか。
Watson音声認識(STT:Speech to Text)をSwiftアプリで使ってみた。

iPhoneに話しかけたら音声認識するSwiftサンプルアプリを、IBM BluemixのWatsonにあるSpeech to Text (STT)サービスを使って試してみました。iOS 10で[Speech Recognition API](https://developer.apple.com/videos/play/wwdc2016/509/)が出たのでiOSに限っては、そちらが本命ですが、コード量が少なくシンプルなので、iOS 9しばりとかハッカソンなどで「声で認識するアプリ」をパパッと作る用途にはイイかもしれません。[Watson Developer Cloud iOS SDK](https://github.com/watson-developer-cloud/ios-sdk)を用います。(ちなみにWatsonを使わないApple版のサンプルは[こちら](https://developer.apple.com/library/content/samplecode/SpeakToMe/Introduction/Intro.html#//apple_ref/doc/uid/TP40017110))

![STT.png](https://qiita-image-store.s3.amazonaws.com/0/75507/c7c26c69-09f3-997c-e913-bc33d7fd801f.png)

#### 少し解説
サンプルにはRecorded Audio, Streaming Audio, Custom Capture Sessionsとある。
1. Recorded Audio - 録音済みの音声ファイルを使う。
2. Streaming Audio - マイクに話しかけてリアルタイムに音声認識。
3. Custom Capture Session - 独自の`AVCaptureSession`で `AVCaptureAudioDataOutput`を使う。これは音声データのイコライザーを画面に表現したり、音声データを保存したり、用途多数。

作り方は、以下の通り。

#### 1. サンプルプロジェクトのチェックアウト
GitHubからSpeech to Text Demo (Swift)をクローン。

```bash
$ git clone https://github.com/watson-developer-cloud/speech-to-text-swift.git
```

プロジェクトを[Carthage](https://github.com/Carthage/Carthage)でビルド。

```bash
$ carthage update --platform iOS
```

#### 2. サンプルプロジェクトの修正
 1. SpeechToTextV1.frameworkのリンク切れを直してあげる。前のCarthageのビルドが完了していたら /Carthage/Build/iOSフォルダにビルドされているので、これを使う。
/ios-sdk/Examples/SpeechToText/Carthage/Build/iOS/SpeechToTextV1.framework

 2. Credentials.plist ファイルを作ってあげる。これはBluemixへの認証情報なので、SpeechToTextUsernameキーとSpeechToTextPasswordキーは、自分のBluemixアカウントに紐付いたSpeech To Textサービスの管理画面に設定されているService Credentialsを書き込む。

```xml:Credentials.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>SpeechToTextUsername</key>
	<string>70c5833dc-a53a-ca94-6c9ee-f89a23dd3ggg</string>
	<key>SpeechToTextPassword</key>
	<string>0bUzR0Hmkv1g</string>
</dict>
</plist>
```

#### 3. 日本語に対応させる
TranscriptionSettingsのmodelを追記してあげると、日本語を聞き取ってくれる。

```swift:ViewController.swift
// configure settings for streaming
var settings = TranscriptionSettings(contentType: .L16(rate: 44100, channels: 1))
settings.model = "ja-JP_BroadbandModel"
```

#### 4. 実行結果
Start Streamingボタンを押してiPhoneに話しかけると、文字が表示される。日本語の聞き取りについては、ちょっとビミョーなので、これは調整できるのだろうか...? あとサンプルのソースコード内では削ってしまっているが、本当は確証の度合いも出ているので、これを使うのかも。単語よりも長文で話しかけた方が文脈があるので、精度は高まる？！


#### もっと詳しいことは

IBM Speech to Text service:

* [Watson Developer Cloud iOS SDK](https://github.com/watson-developer-cloud/ios-sdk)

* [IBM Watson Speech to Text - Service Page](http://www.ibm.com/watson/developercloud/speech-to-text.html)
* [IBM Watson Speech to Text - Documentation](http://www.ibm.com/watson/developercloud/doc/speech-to-text/)
* [IBM Watson Speech to Text - Demo](https://speech-to-text-demo.mybluemix.net/)

尚、Androidについては、こちらの記事が参考になります。
[IBM WatsonのSpeechToTextで「Androidのマイクから音声を拾って文字を起こす」アプリを作った](http://qiita.com/LyricalMaestro0/items/c934018a9733d4227b35)
CUDA > Compute Capabilityを表示する実装

```txt:動作環境
GeForce GTX 750 Ti
Windows 8.1 pro (64bit)
Visual Studio Community 2013 (以下、VS)
CUDA 7.5
```

http://qiita.com/7of9/items/c89d00eca4b71b09b048
においてSMが扱えるスレッド数の上限がCompute Capabilityによって変わるというのを知った。

Compute Capabilityが何かはWebで調べれば出てくるが、CUDAの練習をかねて表示してみた。

### 情報

参考 [stackoverflow](http://stackoverflow.com/questions/6689129/cuda-how-to-check-for-the-right-compute-capability)
> In the runtime API, cudaGetDeviceProperties returns two fields major and minor which return the compute capability any given enumerated CUDA device.

cudaGetDeviceProperties()についての参考 [www.cs.cmu.edu](https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/html/group__CUDART__DEVICE_g5aa4f47938af8276f08074d09b7d520c.html)

### 準備

http://qiita.com/7of9/items/e9c185351803d9794db5
を参考にCUDAをビルドできるslnを用意する (160910_computeCapabilityとした)。

### 実装と実行

以下のコードを実装した。

```kernel.cu

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void addKernel(int *c, const int *a, const int *b)
{
//    int i = threadIdx.x;
//    c[i] = a[i] + b[i];
}

int main()
{
	cudaDeviceProp prp;
	cudaError_t cudaStatus;

	cudaStatus = cudaGetDeviceProperties(&prp, /*device=*/0);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaGetDeviceProperties failed!");
		return 1;
	}

	printf("Compute Capability=%d.%d\r\n", prp.major, prp.minor);

	cudaStatus = cudaDeviceReset();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaDeviceReset failed!");
        return 1;
    }

    return 0;
}
```

```txt:結果
C:\CudaDev\160910_compueCapability\Debug>160910_compueCapability.exe
Compute Capability=5.0
```

> GeForce GTX 750 Tiはわれら四天王の中でも最強 

GTX1080欲しい。
Spring(Spring Boot)でのLocaleのデフォルト値


`LocaleContextHolder.getLocale()`で、デフォルトのロケールを取得できます。

```java
package com.sample.config;

import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

@Component
public class MyMessageSource extends ResourceBundleMessageSource {

    /**
     * 指定されたベース名のメッセージリソースの内容を全て返す。
     * デフォルトのLocaleを用いる。
     * @param basename
     * @return
     */
    public Map<String, String> getAllMessage(String basename) {
        return getAllMessage(basename, LocaleContextHolder.getLocale());
    }

    /**
     * 指定されたベース名、指定されたLocaleのメッセージリソースの内容を全て返す。
     * @param basename
     * @param 
     * @return
     */
    public Map<String, String> getAllMessage(String basename, Locale locale) {
        Map<String, String> map = new HashMap<>();

        ResourceBundle bundle = getResourceBundle(basename, locale);
        bundle.keySet().stream()
            .forEach(key -> { map.put(key, getStringOrNull(bundle, key)); });

        return map;
    }
}
```

デフォルトのロケールは、RequestHeader内の`Accept-Language`で決まります。
値が`ja,en-US;q=0.8,en;q=0.6`となっているとき、`LocaleContextHolder.getLocale()`の結果は`"ja"`になります

![locale_1.png](https://qiita-image-store.s3.amazonaws.com/0/68978/0f7ec840-481e-c3d8-822e-5aed175e7464.png)

送信する`Accept-Header`の値は、ブラウザで制御できます。
GoogleChromeの場合は、[設定]->[言語と入力の設定]から設定できます。

![locale_2.png](https://qiita-image-store.s3.amazonaws.com/0/68978/9159aa50-745c-d40f-1761-8e5ff1eed9fb.png)

設定画面には言語設定が並んでいます。
先ほど送信されていた`ja,en-US;q=0.8,en;q=0.6`と、上から順の「日本語」「英語（アメリカ合衆国）」「英語」の並びが対応しているように見えますね。

![locale_3.png](https://qiita-image-store.s3.amazonaws.com/0/68978/195ed023-eb04-72a2-b112-a341e987cdbf.png)

ドラッグ＆ドロップで、並び替えることができます。

![locale_4.png](https://qiita-image-store.s3.amazonaws.com/0/68978/84e8cc2f-d628-d27c-7fbe-647dbb572eb2.png)

もう一度同じリクエストをしてみると、`Accept-Header`の値を変えることができていることがわかります。
「英語」「英語（アメリカ合衆国）」「日本語」としたので、値は`en,en-US;q=0.8,ja;q=0.6`になりました。
これで`LocaleContextHolder.getLocale()`の結果は`"en"`になります。

![locale_5.png](https://qiita-image-store.s3.amazonaws.com/0/68978/e8aca90e-7a18-089d-1eba-c8405477378c.png)
Laravel5.3 Mysqlの設定

#Mysqlの設定

初期のmysqlアカウント
```
vagrant ssh
$ cd ~/Code/Laravel
$ php artisan migrate:install
$ mysql -u homestead -p
$ Enter password:secret
mysql> show databases;
mysql> use homesetad;
mysql> show tables;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| homestead          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.10 sec)
```
/config/database.php　の編集
databse,username,passwordなどを編集する

```
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
```

$ mysql -u ユーザー名 -p
[Swift] FunctionとComputed Propertyの使い分けの基準

Swiftでプログラミングをしていると、引数なしのFunctionを使うかComputed Propertyを使うかで迷う時があります。

その判断基準がKotlinのコーディング規約にあったので引用します。

[Kotlin: Coding Conventions](https://kotlinlang.org/docs/coding-conventions.html#functions-vs-properties)

> Functions vs properties
In some cases functions with no arguments might be interchangeable with read-only properties. Although the semantics are similar, there are some stylistic conventions on when to prefer one to another.
> 
> Prefer a property over a function when the underlying algorithm:
> 
> - does not throw
> - is cheap to calculate (or cached on the first run)
> - returns the same result over invocations if the object state hasn't changed

以下の条件に当てはまる場合は、functionよりpropertyを使う方がよい。

- 例外を投げない
- 計算量が少ない（または初回実行時にキャッシュされる）。
- オブジェクトの状態が変化していない場合、何度呼び出しても同じ結果を返す。

## 補足

コメントで教えて頂きましたが、Swift API Design Guidelinesにも以下の記述がありました。

>>https://swift.org/documentation/api-design-guidelines/#general-conventions
- **Document the complexity of any computed property that is not O(1).** People often assume that property access involves no significant computation, because they have stored properties as a mental model. Be sure to alert them when that assumption may be violated.

> **(O(1)ではないcomputed propertyではその旨をドキュメント(コメント)に明記すること。** プロパティアクセスは一般的に計算コストが安価だと見なされるので、そうでない場合はその旨の明記が必要である。)



# 参考

- [Swift functions vs computed properties](http://programmers.stackexchange.com/questions/304077/swift-functions-vs-computed-properties)
Slim で autofocus のような論理属性を書く

[Slim](http://slim-lang.com/) で autofocus などの論理属性を書く方法をまとめた。

# 論理属性って？

例えば，ページのロード時に，特定の入力欄にオートフォーカスさせたいとき，HTML で以下のように書く。

```html:HTML
<input type="text" name="keyword" autofocus>
```

また，チェックボックスにチェックを入れておきたいなら

```html:HTML
<input type="checkbox" name="accept" value="yes" checked>
```

などと書く。

これらの属性は「論理属性」（boolean attributes）と呼ばれており，何かが「有効」か「無効」かを指定する。ちょっと変わっているのは，属性値で有効／無効を切り替えるのではなく，属性が書かれていれば有効，そうでなければ無効となる点だ。

論理属性にはほかにも `disabled`，`multiple` などがある。

# Slim でどう書く？

もちろん，Slim コード中に上記の HTML タグをじかに書くことはできるが，Slim の文法に従うならどう書けるだろう？

「`autofocus`」の部分が問題だ。このように，値を与えず属性名だけを書くには，**属性部分を括弧で囲む**必要がある。

```slim:Slim
input(type="text" name="keyword" autofocus)
```

属性部分を囲む `( )` を attribute wrapper と呼ぶようだ。属性囲み記号とでも呼べばいいのかな？

`( )` のほかにも `[ ]` と `{ }` が使える。つまり，以下のようにも書ける。

```slim:Slim
input[type="text" name="keyword" autofocus]
```

```slim:Slim
input{type="text" name="keyword" autofocus}
```

# 別の書き方

ところで attribute wrapper を使わない書き方もできる。

そのために，HTML の論理属性についてもう少し知ろう。

実は以下の三つの書き方ができる。このうち，どれを使っても `autofocus` が有効になる。

```html:HTML
<!-- 空の属性値を与える -->
autofocus=""

<!-- 属性名をそのまま属性値にもする -->
autofocus="autofocus"

<!-- 属性名のみ -->
autofocus
```

1 番目，2 番目の書き方を使うと，Slim では以下のように書ける。

```slim:Slim
input type="text" name="keyword" autofocus=""
```

```slim:Slim
input type="text" name="keyword" autofocus="autofocus"
```

ちなみに `autofocus=` の右に書いた `""` とか `"autofocus"` ってのは，Ruby の式（いまの場合は文字列リテラル）だ。

# もう一つの書き方

さらにもう一つの書き方を紹介しよう。このやり方は，とくに式の値の真偽で論理属性の有効／無効を切り替えたいときに便利だ。

〈式 `ex` の値が真なら `autofocus` を有効にし，偽なら無効にする〉という Slim コードは，ここまでの知識だけ使っても，以下のように書ける。

```slim:Slim
input type="text" name="keyword" autofocus=(ex ? "" : nil)
```

`ex` が真なら `autofocus` に空文字列が与えられるから

```html:HTML
<input type="text" name="keyword" autofocus="">
```

になる。

`ex` が偽なら `autofocus` に `nil` が与えられるが，Slim の規則では属性値が偽のとき，属性そのものが無くなるから，

```html:HTML
<input type="text" name="keyword">
```

になる。

だけど，`(ex ? "" : nil)` はちょっと複雑すぎやしないか？

実は Slim では，属性値として `true` を与えると，論理属性の有効化とみなしてくれることになっている。
気を付けてほしいのは `"true"` という文字列ではなく Ruby のオブジェクト `true` だということだ。そして，真なら何でもいいわけではなく，`true` でなければならない。

この規則を使うと，

```slim:Slim
input type="text" name="keyword" autofocus=!!ex
```

と書ける。

`!!ex` という Ruby の式は，二重否定により `ex` の真／偽を `true`/`false` にしてくれるものだ。



# 参考

以下はいずれも Slim のリファレンス。

- [Boolean attributes](http://www.rubydoc.info/gems/slim/frames#Boolean_attributes)
- [Attributes wrapper](http://www.rubydoc.info/gems/slim/frames#Attributes_wrapper)

# 追記（2016-09-15）　論理属性と紛らわしいもの

論理属性は，値に `true`/`false` を持つ列挙型の属性とは**違う**ことに注意しよう。紛らわしいね。

たとえば，スペルチェックを利かすかどうかを制御する `spellcheck` 属性は論理属性ではなく列挙型属性であり，値として `true` または `false` を取る。

この場合，Slim では以下のように**文字列**の `"true"` または `"false"` を与えてやらねばならない。

```slim:Slim
textarea name="comment" spellcheck="false"
```
【VBA】入力規則（Validation）の1004について

ハマってかなり時間を取られたので、忘れないようにメモ。

すでに入力規則が設定されているセルについて、
今設定されている入力規則を破棄し、新たな入力規則を設定しようとしたところ、
.Addの行で
「1004：アプリケーション定義またはオブジェクト定義のエラーです」
が発生。
ググったりした結果、どうやら実行前に対象のセルをSelectしてからすると出なくなると多数。
…ですがやはりうまくいかず。

	Cells(7, 8).Select
	With Selection.Validation
	    .Delete
	    .Add Type:=xlValidateList, _
	        AlertStyle:=xlValidAlertStop, _
	        Operator:=xlBetween, _
	        Formula1:="=プルダウンリスト"
	    .IgnoreBlank = True
	    .InCellDropdown = True
	    .InputTitle = ""
	    .ErrorTitle = ""
	    .InputMessage = ""
	    .ErrorMessage = ""
	    .IMEMode = xlIMEModeNoControl
	    .ShowInput = True
	    .ShowError = False
	End With


【結果】
今回の件、入力規則を再設定する対象のシートが保護されていることが問題でした。
ググったときにもシート保護してるとうまくいかないかもというのは見かけていましたが、
自分は、シート保護下でもマクロの処理だけは可能な

    ActiveSheet.Protect UserInterfaceOnly:=True, Password:="XXXXX"

を使用していて、その問題はこれで大丈夫だろうと…

コイツが原因でした。

これを処理の最初にシートの保護解除・最後に保護をかけ直すことで解決できました。

	ActiveSheet.Unprotect Password:="XXXXX"
		
		～ 処理 ～
		
	ActiveSheet.Protect Password:="XXXXX"
Arduino のウォッチドッグタイマが失敗してハングする

# ~ 問題 ~
先日購入した Arduino MEGA2560 を長期稼働させていると定期的にハングアップしている。デバッグで Serial 出力しているので位置は特定できる。どうもウォッチドッグタイマ(以下WDT)が異常のようだ。

WDTリセットがかかるタイミングで **必ずハングする** 。プログラムを見てもおかしいところは見当たらない。というのもWDTカウント開始とWDTカウントクリアしか関数がない。 **リセットボタンを押してもハングしたまま** 。とても困る。

# ~ 答え合わせ ~
実は純正品 Arduino ではハングしない。コピー品がまずい。しかしハードウェアコンパチであるので性能差はない。

原因は AVRマイコン の方にある。実はこいつ  **WDTリセットがかかった後、WDTカウント解除しない** 。純正品のブートローダーは上手い具合に起動と同時にWDTカウント解除してくれていたのだ。

ブートローダーは Arduino がもう一台あれば Arduino IDE から更新できる。さあ書き換えよう。
- [ArduinoISP (英語)](https://www.arduino.cc/en/Tutorial/ArduinoISP)

# ~ 余談 ~
Arduino MEGA2560 がとても高価なためサインスマートから購入して使っていた。安い。今度は Arduino UNO の CH340 のUSBシリアル通信チップが載ったバージョンだ。安すぎる。

異常系のテストをあれほどしておけと...
CUDA > PTX > Parallel Thread Execution object code > intermediate device independent representation / new target code can be generated on the fly

Youtubeの[CUDA Programming Basics Part I](https://www.youtube.com/watch?v=ylZcK0SMOfE&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=1)のビデオの1:35に出てきたPTXについて。

> And the GPU code is compiled into PTX, or Parallel Thread Execution object code.

2:12ころのリスニング (間違っているかもしれない)。

> PTX object code is intermediate device independent representation that is then compiled to particular device. CUDA executable can contain PTX code in addition to target code. So the new target code can be generated on the fly when the executable is run on the device different from what was compiled for. 

on the fly
http://eow.alc.co.jp/search?q=%22on+the+fly%22
> `6 ... 臨機応変に

PTXの説明は以下などある。
https://en.wikipedia.org/wiki/Parallel_Thread_Execution
Android Studioで特定のショートカットキーが効かない時

#対処法1　(1文字ショートカットに、2文字目を設定する場合)
##1.ショートカットキーの設定を変更(1文字ショートカットのみ)
1.1.File/ Settings...　でSettings画面を開く

1.2.KeyMapのショートカットキー検索(ショートカットの検索の右隣にあるボタン)で、ショートカットを検索する
※First Strokeのみ入力
(検出されない場合は、ショートカットキーの設定忘れ。ショートカットキーを設定した時に、OKかApplyを押下せずに設定ウインドウを閉じた場合などに、よく発生する。)

1.3.ショートカットキーの設定を変更する
・右クリック/　Remove (ショートカットキー)
で、現在のショートカットキーを消す

・Add Keyboard Shotrcut
で、ショートカットキーを割り当てる
※First StrokeとSecond Strokeに同じキーを割り当てておくなど。
(この場合は、ショートカットキーの2度押しでショートカットを呼び出せる)
※First Strokeのみ設定する場合は、他のショートカットキーと衝突しないように注意。

#対処法2　(衝突しているショートカットをすべて解除する場合)
##1.ショートカットキーが衝突している項目の検出
1.1.ショートカットキーの押下後、すぐにスクリーンショット(PrintScreen)を取る

1.2.ペイントなどに貼り付けて、一番下の方を見る

1.3.Prefix Key Pressed. ・・・と表示されている場合は、
表示された項目が、ショートカットキーの1番目のキーが他と衝突しているので、
ショートカットキーの設定を変更する。(=> 手順2)
##2.ショートカットキーの設定を変更(衝突しているものすべて)
2.1.File/ Settings...　でSettings画面を開く

2.2.KeyMapの検索欄で、手順1.3で表示された項目を検索する
※First Strokeのみのショートカットと、Second Strokeも設定されているショートカットが混在する場合は、ショートカットキーの検索(First Strokeのみ)では、Second Strokeが設定されているものが表示されない。(手順1で、スクリーンショットを取った理由)

2.3.ショートカットキーの設定を変更する
・右クリック/　Remove (ショートカットキー)
で、使いたいキーとFirst Stroke(1番目のキー)が衝突しているものを消す

・Add Keyboard Shotrcut
で、他のショートカットキーを割り当てる

必要に応じて、手順2.2～2.3を繰り返す。

#原因
ショートカットの1番目のキーが、他のショートカット(2番目のキーも設定あり)と一致している場合、2番目のキー待ちとなるので、1番目のキーのみ設定したショートカットが呼び出せないため。
yieldとstreamを行き来する

# yieldとstreamを行き来する

coやaaなどyield + generator + Promiseによってcallback地獄から開放された、やった!
となったはいいけどPromisifyで囲めるものはいいけど__既存のStreamのコード__を書き直して入れるの面倒でない?
と思ったので、yieldの中でstreamを使いやすいようにパッケージにしました。

__[aa-util](https://www.npmjs.com/package/aa-util)__
__[github](https://github.com/uzuna/aa-util)__

[![NPM](https://nodei.co/npm/aa-util.png)](https://nodei.co/npm/aa-util/)


ちなみにasync-awaitのライブラリは[aa](https://www.npmjs.com/package/aa)を使います
aa.Channel()が愛しい。
詳細はLightSpeedC氏の投稿へ。
> [ES.next async/await + Promise で解決できる事、とES6 generators (yield) + Promise + npm aa (async-await) で解決できる事](http://qiita.com/LightSpeedC/items/95e3db59276e5d1d1a0d)


## aa-util


aa-utilでは__Array__と__Generator__をStreamに変換できます。

例文内では `const au = require('aa-util')` で読み込まれているとしてください。

* stream生成    :  `au.stream.a2s(Array)`で配列をStreamでくるんだものが返ってくるので今までどおりpipeできます
* stream結果受取 : `au.stream.reduce`でstreamの結果が配列になって返ってきます

### Array/Generator -> Stream

```js
const au = require('aa-util')

function *main(){
	const target = [0,1,2,3,4,5]
	
	// Arrayの場合
	const stream = yield au.stream.a2s(target); // array-> stream

	// Generatorの場合
	const g = function *(){
		yield* target
	}
	const stream = yield au.stream.g2s(g());



	// pipe your custom stream
	stream.pipe(stream_A)

	// get stream result
	const result = yield au.stream.reduce(stream_A);

	// result = [0,1,2,3,4,5]
}
```

### Stream -> Result

ちょっとまって!　別の形で受け取りたいんだけど。
という時には第二引数に自分で__Reducer(Transform)__を指定できます。
自分で好きにreduceして`flush(cb)`が呼ばれたときに一度だけpushしてください。

```js
const stream = require('stream');

function *main(){
	const target = [0,1,2,3,4,5]
	const g = function *(){
		yield* target
	}
	const stream = yield au.stream.g2s(g());
	
	// set custom reducer to second argument
	const result = yield au.stream.reduce(stream, sumStream());

	// result = 15
}

// すべての値を加算して返す
function sumStream(){
	return stream.Transform({
		objectMode:true,
		transform:function(chunk, env, cb){
			// 自前のreduce処理を書く
			if(this._stack === undefined){
				this._stack = 0
			}
			this._stack += chunk
			cb()
		},
		flush: function(cb){
			this.push(this._stack) // 結果を返す
			cb()
		}
	})
}
```


### おまけ

yieldでも呼べるしcallbackでも呼べると便利なのでは?
という思いつきから `au.promise.wrap` も作りました。 ~~でもあんまり使ってない~~

```

// yield でうごかす
function *main(){
	const time = 100
	const result = yield proc(time)
}

// call backで動かす
proc(time, (err, result)=>{
	console.log(err, result)
	done();
})

// cbにFunctionが入っていたらaaでラップしてcbに値を返す
// cbに何もなければmain(opt)をそのまま返す
function proc(opt, cb){
	return au.promise.wrap(main(opt), cb)
	function *main(arg){
		return yield wait(arg)
	}
}

function wait(arg){
	return new Promise((res, rej)=>{
		if(arg > 1500) return rej(new Error("over >1500"))
		if(arg > 500) return res(new Error("over >500"))
		setTimeout(()=>{
			return res(`wait:${arg}`)
		}, arg)
	})
}

```


それでは、よりよいnodejsライフを
CUDA > Link > Youtubeビデオ 

CUDA関連のビデオで入門に良さそうと思ったもの。
(全部英語です)。

### CUDA Programming Basics PartI / Part II

[PartI](https://www.youtube.com/watch?v=ylZcK0SMOfE&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=1)
[PartII](https://www.youtube.com/watch?v=G5-iI1ogDW4&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=2)

- 2009年頃のNVIDIAのビデオ
- 時間が短いので、ちょっとした時間で見れる

### [CUDA Programming Model Overview](https://www.youtube.com/watch?v=aveYOlBSe-Y&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=3)

- 12分
- 2012年以前のもの

### [GPU programming for beginners (HPC and GPU Webinar Series)](https://www.youtube.com/watch?v=BPjgwRftoNo&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=5)

- 1時間ほどある
- 説明が詳しい

### [What Are CUDA Cores?](https://www.youtube.com/watch?v=JFhG9UntZs4&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=6)

- Tutorialとは違うがCUDAのコアについて
- 980Tiと1080の比較などしている
- 発音はきれいだが早口で数値がたくさん出るので疲れている時に見るのはしんどい

### 他のもの

2015年、2016年頃のもので手ごろな長さ(10分前後)のTutorialを探したが自分に合いそうなものはなかった。

1時間のもので2015年以降の良いTutorialも探している。
CUDA > Link > SMが扱えるスレッドの上限 > (512,512,64) or (1024,1024,64: compute capability >=2.0) 

http://qiita.com/7of9/items/e42ac9fa09378c18c1d7
においてスレッドの上限について未消化だった。

以下を見つけた。
http://stackoverflow.com/questions/5062781/cuda-max-threads-in-a-block

> by
answered Feb 22 '11 at 2:59
Pavan Yalamanchili
Maximum threads in X direction: 512 (1024 for compute capability >= 2.0)
Maximum threads in Y direction: 512 (1024 for compute capability >= 2.0)
Maximum threads in Z direction: 64

compute capabilityというのはyoutubeで見たGPUの世代のようなものなのだろう。
CUDA > uint3型 / dim3型

```txt:動作環境
GeForce GTX 750 Ti
Windows 8.1 pro (64bit)
Visual Studio Community 2013 (以下、VS)
CUDA 7.5
```

http://gpu.fixstars.com/index.php/CUDA_%E6%96%87%E6%B3%95_2
を読んでいて出てきたuint3とdim3について。

> それぞれ3要素の整数ベクタ型(uint3あるいはdim3型)になっている理由は後述します。

http://gpu.fixstars.com/index.php/CUDA_%E6%96%87%E6%B3%95_1
> 複数のスカラ型変数(int, float, etc...)をまとめた型で、まとめる数に応じて、int3, float4等と記述します。
...
> 一点、dim3型という特別なベクタ型が存在します。 これはuint3型と同じなのですが、カーネル実行時のグリッド及びスレッドブロックの数を指定する際に利用します。
CUDA > Link > スレッドとブロックの数による処理時間

CUDA 7.5のサンプルコード関連で調べているうちに以下を見つけた。

http://gpu.fixstars.com/index.php/CUDA_%E6%96%87%E6%B3%95_2
> 1つのマルチプロセッサ(SM)で同時に扱えるスレッド数には制限がある。

~~SMのスレッド制限数の情報は未消化。~~

それを探しているうちに以下を見つけた。
http://www.gdep.jp/column/view/3

> 手元にあるカーネルをいろいろなブロック数、スレッド数の組み合わせで１００回ずつ実行した結果の平均を下に示しました。

ブロック数とスレッド数による時間がどういう感じがつかめる。

Fermiがどうたらというのは今後もっと分かってから追及することにする。
ESP-WROOM-02の技適について調べてみた

ESP-WROOM-02の技適について調べてみました。

ESP-WROOM-02には206-000519という技適番号(正式には工事設計認証番号)が記載されているのですが、総務省にある技適番号の検索で見つからないのが気になったので調べてみました。

# 調査結果
* 技適番号の先頭の206は認証機関をあらわします。
* ２０６は、登録外国適合性評価機関（ＭＲＡ法※第29条）として[EMCC](http://www.emcc.de/)が評価したことを意味します。
* 登録外国適合性評価機関（ＭＲＡ法※第29条）の直近の結果は総務省の下記ページで公開されています。
 * http://www.soumu.go.jp/main_sosiki/sogo_kiban/r7brjwh9kch7_02.html
 * そして、「本ページにおいて公表しているものより以前のものについては、[技術基準適合証明等を受けた機器の検索](http://www.tele.soumu.go.jp/j/sys/equ/tech/giteki/index.htm)において検索することができます」との記載があります。あちゃー。
* EMCCの認証情報は下記のPDFで公開されています。
 * http://www.soumu.go.jp/main_content/000401770.pdf
* このPDFにESP-WROOM-02の記載を発見！

<img width="1514" alt="ESP-WROOM-02 of http://www.soumu.go.jp/main_content/000401770.pdf" src="https://qiita-image-store.s3.amazonaws.com/0/42120/eb8d3c89-1fd6-e28f-fd4c-78a2f10bb112.png">

* 要は総務省の検索システムに、登録外国適合性評価機関の直近の情報が反映されていないってことみたいです。



# 参考
* 秋月電子通商にESP-WROOM-02の技適の資料があります。
 * http://akizukidenshi.com/download/ds/espressifsystems/Certificate-ESPWROOM02-Telec.pdf
Mochaで特定のケースを実行する方法

grepオプションを指定することで、describeやitの文字列でフィルタしたテストケースのみ実行できる。

mocha -g 'pattern'

https://mochajs.org/#usage

npmのscriptsのtestから実行する場合

npm test -- -g 'pattern'

https://docs.npmjs.com/cli/run-script
[Watson] Dialog Serviceの廃止について

[Dialog Serviceの公式ドキュメント](http://www.ibm.com/watson/developercloud/doc/dialog/)によると、

- 新規インスタンスの作成受付停止： 2016年9月8日から
- 既存インスタンスのサービス提供： 2017年8月9日まで

だそうです。

代替サービスとして[Conversation Service](http://www.ibm.com/watson/developercloud/doc/conversation/index.shtml)への移行がアナウンスされています。
【メモ】fpingのエラーメッセージ

fpingのDestination unreachable(宛先到達不可)メッセージについて

下記の「ICMP Host Unreachable」がunreachable(宛先到達不可)メッセージ

```
]# /usr/sbin/fping -C3 2>&1 </tmp/test.tmp 
127.0.0.1       : [0], 96 bytes, 0.03 ms (0.03 avg, 0% loss)
192.168.xxx.101 : [0], 96 bytes, 0.02 ms (0.02 avg, 0% loss)
127.0.0.1       : [1], 96 bytes, 0.06 ms (0.04 avg, 0% loss)
192.168.xxx.101 : [1], 96 bytes, 0.02 ms (0.02 avg, 0% loss)
ICMP Host Unreachable from 192.168.xxx.xxx for ICMP Echo sent to 192.168.xxx.102
ICMP Host Unreachable from 192.168.xxx.xxx for ICMP Echo sent to 192.168.xxx.102
127.0.0.1       : [2], 96 bytes, 0.02 ms (0.03 avg, 0% loss)
192.168.xxx.101 : [2], 96 bytes, 0.02 ms (0.02 avg, 0% loss)

192.168.xxx.102 : - - -
127.0.0.1       : 0.03 0.06 0.02
192.168.xxx.101 : 0.02 0.02 0.02
```

fping_2.4b2-to-ipv6.orig.tar.gzのメッセージと付き合わせた対応表

| code | エラー | 意味 | fpingメッセージ|
|:-----------|------------:|:------------:|:------------:|
|  0 | network unreachable | そのネットワークに転送できない | ICMP Network Unreachable |
|  1 | host unreachable | そのホストに転送できない | ICMP Host Unreachable |
|  2 | protocol unreachable | そのプロトコルに転送できない | ICMP Protocol Unreachable |
|  3 | port unreachable | そのポートに転送できない | ICMP Port Unreachable |
|  4 | fragmentation needed but the Do Not Fragment bit was set | フラグメンテーションが必要なのに禁止フラグがたっている | ICMP Unreachable (Fragmentation Needed) |
|  5 | source route failed | そのソースルートでは実行できない | ICMP Unreachable (Source Route Failed) |
|  6 | destination network unknown | 宛先ネットワークが不明 | ICMP Unreachable (Destination Network Unknown) |
|  7 | destination host unknown | 宛先ホストが不明 | ICMP Unreachable (Destination Host Unknown) |
|  8 | source host isolated (obsolete) | 発信元ホストが孤立 | ICMP Unreachable (Source Host Isolated) |
|  9 | destination network administratively prohibited | 宛先ネットワークが管理者によって転送禁止となっている | ICMP Unreachable (Communication with Network Prohibited) |
| 10 | destination host administratively prohibited | 宛先ホストが管理者によって転送禁止となっている | ICMP Unreachable (Communication with Host Prohibited) |
| 11 | network unreachable for this type of service | このサービスタイプではそのネットワークに転送できない | ICMP Unreachable (Network Unreachable For Type Of Service) |
| 12 | host unreachable for this type of service | このサービスタイプではそのホストに転送できない | ICMP Unreachable (Host Unreachable For Type Of Service) |
| 13 | communication administratively prohibited by filtering | フィルタリングのため管理者によって通信が禁止されている | ICMP Unreachable (Communication Administratively Prohibited) |
| 14 | host precedence violation | ホストの優先度違反 | ICMP Unreachable (Host Precedence Violation) |
| 15 | precedence cutoff in effect | 優先度によるカットオフ中 | ICMP Unreachable (Precedence cutoff in effect) |
CUDA > CUDA 7.5 Runtime > GPU使用の加算サンプルコード / CUDA実行solutionのベースとして

```txt:動作環境
GeForce GTX 750 Ti
Windows 8.1 pro (64bit)
Visual Studio Community 2013 (以下、VS)
CUDA 7.5
```

CUDAのサンプルを試そうとしたところ、VSのTemplateにNVIDIAというフォルダを見つけた。
その中にはCUDA 7.5のCUDA 7.5 Runtimeというのがあるようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b2b0d1d7-aec7-1ad7-eba2-dbcffe0f17cf.png)

GPUでの加算処理を使った例をビルド・実行できる。

```txt:結果
C:\CudaDev\160910_cudaRuntime\Debug>160910_cudaRuntime.exe
{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}
```

### 使用機能のマインドマップ

mindmupにて機能をマップしてみた。
https://atlas.mindmup.com/yasokada/cuda_runtime_160910/index.html

昨日からゴールドセイント(年会費払った)なので、マップの半年公開の制限はない。

### CUDA実行solutionのベース

VSにてCUDAのソースを実行しようとしてよくわからなかった。

上記のCUDA 7.5 Runtimeをもとにプロジェクトを作成すると簡単にCUDAを実行きる。

CUDA実行solutionのベースとして使えると思う。
Ruby Kaigi 2016 2日目 お弁当のアレ

おはようございます。昨日(?)は3時過ぎまで飲んでたから眠い…。

## Bento Sponsor
Ruby Kaigiでは、3日ともお弁当が出ます。スゴイ！
お弁当にはスポンサーが付いていまして、1日目は[株式会社Aimingさま](http://aiming-inc.com/ja)、2日目は[永和システムマネジメント アジャイル事業部様](http://agile.esm.co.jp/)でした。ありがとうございます。
(公式サイトにはbento sponsorは2社しか書いてないけど3日目はどうなんだろう？）

## 2日目のお弁当のアレ
で、2日目。お弁当にこんな広告が付いていました。
http://agile.esm.co.jp/news/2016-09-09-rubykaigi2016-bento-wrapping-paper.html

```
                eval(
               %w( put
             s(([   2*7,
            2*31     ,1,3
           *3*5       ,2*2
          *2*2          *3].
         map{            |c|c
        .to_          s(5*7
       ).gs        ub("1    ","
      \s")      .upca        se}.
     zip(     [2*5*           61*1
    801,    2*5*3              931,
   811*   1871,                 2*11
  *350  27,7*                    11*1
 259* 20389                       *764
171].map{|c|c.to_s(2*2*3*3)}))*""))*"")
```
なんとこのまま実行できて、英語のメッセージが出力されます。しゃれとんしゃー！
何が出るかは実行してみてください。

## せっかくなので解説してみよう
よく出来ているので、何が起こっているのか感謝を込めて解説してみようと思います。

### Array#*
まず、一番外側は`eval`なので、その中身はRubyのコードの文字列になるのは想像できます。でも、よく見ると `puts`が途中で改行されていたり、`to_          s`とメソッドの途中にスペースが入っていたりと、パット見、おや？となります。
それを解決している第一のミソが、`Array#*`です。これ、`Array#join`と同じです。
なので、`%w()`でスペースや改行で区切られた各文字列が結合されて一つの文字列になります。

つまり、evalの中身はこうなります。

```
puts(([2*7,2*31,1,3*3*5,2*2*2*2*3].map{|c|c.to_s(5*7).gsub("1","\s").upcase}.zip([2*5*61*1801,2*5*3931,811*1871,2*11*35027,7*11*1259*20389*764171].map{|c|c.to_s(2*2*3*3)}))*"")
```
### Fixnum#to_s
次に、一見文字列がないのになぜ文字列が出力されるのか問題です。
そこで登場するのが第二のミソ、`Fixnum#to_s`です。このメソッドに引数として数値を渡してやると、何進数として表示するかが指定できます。36を渡すと、`0,1,...,9,a,...,z`が使われる36進数に！これで任意のアルファベットが出力されます。

```
[2*7,2*31,1,3*3*5,2*2*2*2*3].map{|c|c.to_s(5*7).gsub("1","\s").upcase}
#=> ["E", " R", " ", " A", " D"]
```
36進数でもスペースは出せないので、`gsub("1","\s")`で`"1"`をスペース(`"\s"`)に変換していますね。

```
[2*5*61*1801,2*5*3931,811*1871,2*11*35027,7*11*1259*20389*764171].map{|c|c.to_s(2*2*3*3)}
#=> ["njoy", "uby", "with", "gile", "evelopment"]
```

### ラストスパート
ここまでを展開すると、

```
puts(["E", " R", " ", " A", " D"].zip(["njoy", "uby", "with", "gile", "evelopment"])*"")
```

あとは順当に、

```
puts([["E", "njoy"], [" R", "uby"], [" ", "with"], [" A", "gile"], [" D", "evelopment"]]*"")
```

で、またjoinして…というわけでめでたくメッセージがでてきます。

## まとめ
おいしく楽しいお弁当でした！
ごちそうさまでした:pray:
Makerville knit という技適マーク付きWi-Fiボードについて

Wi-Fiのボードとして Makerville Knit を買ってみたら技適付きだったので、簡単に紹介してみます。

自分はMarvell 88MW300搭載のボードが欲しかったので、Makerville Knitを買ってみました。

![knit.jpg](https://qiita-image-store.s3.amazonaws.com/0/42120/f46a12ff-d6ca-d18a-2ac8-2e0c6fb6c20e.jpeg)


# Makerville knit について
* https://makerville.io/knit/
* https://github.com/Makerville/knit
* Wi-Fi + ARMマイコンなボード
* 1個 15USD(送料は3USD)で購入可能。発注から、だいたい一ヶ月ぐらいで届きました。
* インド在住の人が設計、販売
* Marvell 88MW300を搭載
* USBシリアルのチップを搭載
* モジュールはAzurewave AW-CU300
* 技適マークがついてた。 番号は201-152863。 (でも総務省の技適のページで該当の番号が見つからないのですが…。 どうやら、登録外国適合性評価機関で認証された機器の場合は総務省にある検索結果に表示されないみたいです。http://www.soumu.go.jp/main_content/000416996.pdf には載ってました。 )
* Wi-Fiは11n対応で、AP, STAをサポート
* Cortex M4F 200MHz
* 512KB SRAM
* 4MB SPI FLASH  XIPをサポート
* GPIO
* UART
* I2C
* PWM
* SPI
* I2S
* ADC 16bit
* DAC 10bit

# 88MW300のSDKについて
* https://github.com/marvell-iot/aws_starter_sdk
* gccで開発可能
* FreeRTOS + LwIP の構成
* Wi-Fi関連のライブラリはバイナリ提供


# ESP8266との比較
## good
* ARMなので色々できる
* RAMが512KB

## bad
* ESP8266より価格が高い

# RTL8710との比較
## good
* 技適がついてる
* XIP (eXecute In Place)をサポートしているので、SPI FLASHにあるコードをそのまま実行できる。なのでRAMを有効に使える。
* DACとADCが付いてる。

## bad
* RTL8710より価格が高い



あと、技適付きな88MW300のボードとしては太陽誘電のモノもあります。digikeyで買えますが、評価ボード WYSACVLXY-XX EVALUTION BOARD が 142USDとお高いです。
R > 入門してみた

```txt:動作環境
MacOS X El Capitan
```

> xx君、彼（後輩）にはRをやってもらおう。

ということを言われたので、後輩がRをやることになった。
自分もRをやることになるのだろう。

入門してみた。

セットアップに関しては以下の記事が参考になりました。
情報感謝です。
http://qiita.com/hujuu/items/ddd66ae8e6f3f989f2c0

記事の通りx,yのデータをグラフプロットしてみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6f604572-4c22-9bb7-f22c-23428e8b20e8.png)
OpenSTF を使ってリモートテスト環境を自宅に構築する

# OpenSTF とは

[OpenSTF](https://github.com/openstf/stf) とは、OSS で開発が進められている Android 端末をブラウザで操作・管理するためのパッケージです。
OpenSTF を立ち上げたサーバに各種 Android 端末（ハンドセット端末、ウェア端末など）を接続することで、OpenSTF を介してリモートから端末の操作やデバッガのアタッチなど、テストに必要なあれこれが利用できるようになります。

# OpenSTF サーバを作ろう

今回は、自宅等の環境で OpenSTF サーバを作ることを前提に考えます。

Ubuntu で OpenSTF を構築する場合は、[Ubuntu 14.04 LTS 上での手順](https://gist.github.com/yasuyk/bbaa28568c497d95ff92566efc4ecc3c)に従いますが、Ubuntu 16.04 LTS 上でも問題なく動作します。

環境が整ったら、以下のように OpenSTF をインストールします。

```
$ npm install -g stf
```

この後、rethinkdb と adb を立ち上げ、stf を起動します。

```
$ rethinkdb &
$ adb start-server
$ stf local --public-ip <ip_addr>
```

`--public-ip`には任意の IP アドレスを入力します。クライアント PC からはこの IP アドレスを打ち込んでアクセスすることになります。

# VPN で OpenSTF サーバを公開する

OpenSTF を公開する際、いくつか気をつけるべきポイントがあります。

1. ファイアウォールの設定で OpenSTF の使用するポートのほか、Android のデバッガが使うポートも開放する必要がある
2. OpenSTF にはパスワードによるユーザ認証の機能がないため、そのままインターネット上に公開してしまうともれなく接続している端末をインターネットに大公開してしまう

1.は Ubuntu であれば、ufw の設定と、ルータ側の設定を変更します。
2.については、VPN 上でのみ公開するようにすれば、VPN にアクセス可能な人だけが OpenSTF を使える状態にできます。

VPN を利用する場合は、[OpenVPN を Ubuntu でセットアップする手順](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-16-04)を参考にすると良いでしょう。

この他、必要に応じて SSH サーバを立てたり、DDNS の設定をしたりすれば無事に公開できます。

# 使用感

OpenSTF サーバをアメリカ国内にたてて、T-Mobile の LTE ネットワークから VPN 経由で OpenSTF を Nexus5X から使用した場合、画面が操作に追随するまでに数秒を要しています。ネットワーク環境が強くなれば、この遅延は改善されるものと思います。
ちなみに、OpenSTF サーバ自身は以下のようなスペックで構成されています。

- CPU: Intel Core 2 Duo P7550 2.26GHz 
- Mem: 3.8GiB
- Disk: SSD 1TB
- OS: Ubuntu 16.04 LTS 64bit 

同ネットワークあるいはサーバ自身が OpenSTF を使う場合でも多少の遅延はありますが、問題なく動いています。
技術英語 > Creating access routines is the [workhorse approach] to getting around problems with global data. / dangle a carrot (before the horse)

@ Code Complete (No. 11392 / 36077)
> Creating access routines is the <font color=red>workhorse approach</font> to getting around problems with global data.

http://ejje.weblio.jp/content/workhorse
> `3 役に立つ機械[車(など)].

http://ejje.weblio.jp/content/get+around
> (障害を)迂回する


意訳「アクセスルーチンを作るのはグローバルデータがらみの問題を回避するのに有効な手段だ」。

<hr>
関連して思い出したのは

dangle a carrot (before the horse)

http://eow.alc.co.jp/search?q=dangle+a+carrot

馬の前にニンジンをぶらさげたら、馬がそのニンジンに向かって動いてくれる、という意味。

いい話をちらつかせて、人をやる気にする、というような使い方。

検索してもいい訳が見つからなかったので、自分が昔読んだものの記憶から。English Express 2000年ころ?。
JSで時間をおいてから次の処理を行いたいとき

入力した文字のブラウザ反映を遅らせたいときなどにjavascriptでどのようにしたらいいかというときのJS初心者によるメモです。


```js:
window.setTimeout( 関数名, 500 );  //set delay
```

単位時間[ms]で待ち時間を設定し、上では500[ms]としています。
関数が引数を持たない場合上のように書けますが、引数を持つ場合以下のように書きます。

```js:
window.setTimeout( function() { 関数名(x) }, 500 );
```
VagrantでCentOS立ち上げ　コマンド　自分用メモ

※初期設定方法は省略。ここでも見て。
[今日からすぐできる！VagrantとVirtualBoxを使ってローカル開発環境を構築する方法【初心者向け】](http://techacademy.jp/magazine/6304)

# 終了および開始用コマンド

##仮想マシン立ち上げ
terminal上から、CentOSを設定した、Vagrantのフォルダに移動して
`vagrant up`

## 仮想マシンの状態確認
`vagrant status`

## 再起動
`vagrant reload`

##　ログイン(SSH接続)
`vagrant ssh`

## サーバー実行
`sudo service httpd status`

## ログアウト
`exit`

## CentOSの停止
`vagrant suspend`

あとは普通にterminalを終了させればいい。
テクスチャにcanvasを使用


r78

デモ：https://mo49.github.io/qiita/20160908/texture-canvas.html


テクスチャにcanvasを渡してマテリアルのmapに設定（要点はこれだけ）


```javascript
const boxGeometry = new THREE.BoxGeometry(10, 10, 10);
this.cube = this.createMesh(boxGeometry);
this.scene.add(this.cube);

・・・（中略）・・・

createMesh (geom) {
  const canvasMap = new THREE.Texture(this.canvas); // canvas要素を読み込む
  const mat = new THREE.MeshPhongMaterial({side: THREE.DoubleSide});
  mat.map = canvasMap;
  const mesh = new THREE.Mesh(geom, mat);

  return mesh;
}
```

mapを更新し続けることで、リアルタイムにお絵描きが反映される。

```javascript
render () {
  this.cube.material.map.needsUpdate = true;
}
```



> 参考
http://literallycanvas.com/
Deep PredNetの学習済みモデルを走らせる

過去８回でパソコンを自作した後に、Ubuntu14.04、CUDA、cuDNN、chainer、dqn、LIS、Tensorflow、OpenAIGymを順次インストールし、最後にOpenAIGym上でA3Cのコードを走らせた。
http://qiita.com/masataka46/items/1a63b8747e83012a1ff4

A3Cを走らせる際にTheanoとKerasをインストールしたので、それを使ってW.Lotter氏らのPredNetを走らせてみる。Literatureはこちら。
https://arxiv.org/abs/1605.08104
HPはこちら
https://coxlab.github.io/prednet/
日本語の解説としてはochiai氏がまとめてくれている。
http://karasunoblog.blog20.fc2.com/blog-entry-46.html
GitHub上のコードはこちら。
https://github.com/coxlab/prednet
ざっくり言うと、「CNNやLSTMなどを階層構造にまとめて一瞬先の未来を予測しましょう」というモデル。

##PredNetを入れる
適当なディレクトリを作ってgit cloneする。

```
git clone https://github.com/coxlab/prednet.git
```

##訓練データをゲットする
READMEの指示に従って訓練データ（評価データも含む？）を引っ張ってくる。

```
cd prednet
python process_kitti.py
Traceback (most recent call last):
  File "process_kitti.py", line 7, in <module>
    from bs4 import BeautifulSoup
ImportError: No module named bs4
```

上記のようなエラーが表示された。BeautifulSoupという得体の知れないものが必要らしい。とりあえずそれを再度実行。

```
sudo pip install BeautifulSoup4
・・・
python process_kitti.py
Traceback (most recent call last):
  File "process_kitti.py", line 11, in <module>
    import hickle as hkl
ImportError: No module named hickle
```

今度はhickleというものが足りないらしい。pipで入れて、再度実行。

```
sudo pip install hickle
・・・
Successfully installed h5py-2.6.0 hickle-2.1.0
python process_kitti.py
```

途中、BeautifulSoup4関係でWarningが出てたが、ダウンロードは問題ないみたい。ただし、160GBすべてダウンロードするのに42時間かかった。

##評価用のモデルやデータも入手する
同様に評価用のモデルやデータも入手する。

```
./download_models.sh
./download_data.sh
```

##学習済み評価モデルを走らせる
何も考えずに

```
python kitti_evaluate.py
```

としたところ、以下のようなエラーが出た。

```
AssertionError: ('The following error happened while compiling the node'
・・・
'AbstractConv2d Theano optimization failed: there is no implementation available supporting the requested options. Did you exclude both "conv_dnn" and "conv_gemm" from the optimizer? If on GPU, is cuDNN available and does the GPU support it? If on CPU, do you have a BLAS library installed Theano can link against?'
```

なんだかいろいろ書いている。optimizationがうまくいかなかったらしい。optionで何かを指定したが、利用可能なものがなかったとも書いている。

「GPUやcuDNN使うなら互換性がなく、CPU使うならBLASがない」などと言っている。cuDNNもCUDAもちゃんとインストール出来てるが、CUDA8.0とかcuDNN5.0にtheanoが対応してないのか不明。

そもそも引数でGPUとか指定していないが、どっちを使おうとしているのかもわからない。kitti_evaluate.pyにはCPUやGPUに関して書かれていない。設定ファイルで指定しているのだろうか？

そこで調べたところ、このサイト
http://takatakamanbou.hatenablog.com/entry/2014/08/26/150629
には「THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python ・・」のような書き方をしているので真似してみる。

```
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python kitti_evaluate.py
```

するとうまくいった。この画像は出力の１つ。
![plot_47.png](https://qiita-image-store.s3.amazonaws.com/0/116706/4e214009-984f-6743-4ef2-15c6d52eb4d9.png)
上側実際の画像と下側予測画像を比べると、結構合っているようだ。速く動くものは速い速度で、ゆっくり動くものは遅い速度で移動させている。
Kindle previewer 3でepubをmobiに変換したが保存先が分からないとき

# Kindle previewer 3でepubをmobiに変換したが保存先が分からないとき

変換済みの .mobi ファイルをGUIから探すことはできないようです。最初に変換した時にダイアログボックスが出現し、変換済みファイルへのリンクが表示されますが、これを逃すとどこにあるんだかなかなか分かりません。

答えは

`C:\Users\yourusername\Documents\My Kindle Books`

です。変換後のファイル名は

`originalname-2016-Sep-09-12-05-00-pm.mobi`

という感じです。ですのでオリジナルのファイル名でファイル検索をしたら見つかるはずです。
flyCapture SDK(Point Grey製CCDカメラ) をpythonで

# はじめに

flyCapture SDKはPoint Grey製のCCDカメラ用のSDKです．
公式にwindows，linuxをサポートしており，言語としてはC/C++/C#をサポートしているようです．今回は個人的な好みからC++を使いたくなかったのでC++以外の言語での環境構築を目指しました．
結果から先に書きますと，C#は1時間ほど格闘して諦めました．pythonは非公式のライブラリを使うことでubuntu上では動作させることができました．以下環境構築の備忘録です．

# 環境

 * パソコン (windows 10 64bit)
 * ubuntu 14.04 on VMWare
 * visual studio 2015
 * python 2.7
 * Flea2カメラ(IEEE1394接続)
 * Flea3カメラ(usb3.0接続)

今回はwindowsのパソコンにカメラを接続しています．ubuntuに関しては，IEEE1394カードの関係上，別のPCを使えなかったのでVMWare上に用意しました．**が，VMWareではIEEE1394接続のカメラを扱えません．**ということで，最終的にFlea3のカメラを使いました（それなら別のubuntuPCを使えばよかったわけですが，結果的にVMWare上のubuntuでも扱うことができまました．）

# 失敗した方法

以下失敗した方法です．コメントをいただけると嬉しいです．

## Cしゃーぷ
SDK公式にサポートされているはずなので簡単に扱えると思ったのですが，うまくいきませんでした．
導入自体は.exeを落としてきてインストールします．問題はどのDLLを参照に追加すればうまくいくのかが分からなかったという点にあります．
``FlyCapture2Managed_v140.dll``を追加するとサンプルコードのビルド自体はできましたが，実行すると「依存関係にあるdllが読み込めない」的な???エラーが出ます．いろいろPATHに追加してみたり参照に追加してみたりしましたが，諦めました．どうも"FlyCapture C#"で調べてもあまりドキュメントが出てきません．素直にC++で書けってか？？
**ただしC#は絶対うまくいくはずです．なぜなら公式にサポートされているはずなので．
誰か教えてください...**


## python on Windows

順番的にはubuntuで成功してからwindowsでも動かそうとしました．この時「まぁubuntuで動いたしいいか」と思っていたのは事実です（）
まず，SDKは公式にはpythonをサポートしていません．そこで公開されている非公式のラッパーライブラリを使わせていだたくことにしました．ライブラリはいくつか(後述)ありますが，windowsで動きそうだったのは``pyFly2``です．理由は``setup.py``にwindows用の記述があったからです．
ということでREADME通りに導入していきましたが，``error: Unable to find vcvarsall.bat``というエラーに引っかかりました．これ自体はflyCaptureとは関係なく，コンパイルが必要なライブラリで出るエラーです．ということで``VC++ 9.0``を入れたりいろいろ試しましたが，``ValueError: [u’path’]``というエラーのところまでいって諦めました．この問題は調べればたくさん出てくるので頑張れば解決できそうですが，コンパイルできてもライブラリが動くかどうかはもう1ステップ先の問題なのでここに時間を割くのは無駄である（と自分に言い聞かせました）．


# python on Ubuntu（成功した方法）

私が採用した方法です．ubuntu上にpython用ラッパーライブラリを導入しました．まだ，サンプルを走らせたり/読んだりしただけですが扱いやすそうです．

## ラッパーライブラリ
"python flyCapture"でググるとすぐに以下の2つのライブラリが見つかります．

1.  [jordens/pyflycapture2](https://github.com/jordens/pyflycapture2)
2.  [kbrafford/pyfly2](https://github.com/kbrafford/pyfly2)

pyflycapture2を先に試したのですが，サンプルコードの，カメラの設定を転送するところ？でエラーが出ました．よく分からなかったのですが，pyfly2がうまく動いたのでとりあえずこちらを使わせていただくことにしました．

## 導入手順

### SDKの導入
基本的に[導入手順](https://www.ptgrey.com/tan/10548)に従っていけば簡単です．注意点としては以下の記述です．
>For specific details about using FlyCapture and Linux with a USB 3.0 camera, see [TAN2012007](https://www.ptgrey.com/tan/10685) Using Linux with USB 3.0.

USBのバッファサイズ?を2MBから1000MBに変更するように書いてありますが，これをやらないで一定の解像度(転送データサイズ)を超える設定でキャプチャしようとするとプログラムが異常終了してしまいます．私はこれに気づかずに苦労しました(ページの一番最初に書いてありましたが...)
おそらくIEEE1394のカメラなら問題ないのだと思います(が，上記の事情で試していません)

``$ flycap``でちゃんとキャプチャできれば成功です．ちなみにVMWareでマウント(?)したUSBデバイスでもちゃんとキャプチャできました．

### pyfly2の導入
ubuntuでの導入はgitでクローンしてREADME通りにやれば動きました．
ちなみに``setup.py``に記述するSDKのpathは，普通に入れていれば修正不要なようです．また，DLLのコピーは意味があった？やらなくても動いていたような・・・？

# おわりに

pyfly2のサンプルを少し読んでみましたが，``example_opencv_integration.py``がドンピシャで欲しいやつって感じです．numpyで取得できればあとは何でもやり放題です．あとは設定の変更や同期等の方法が問題です．pyfly2がAPIをどの程度ラッピングしているのか(C APIを全部ラッピングしている??)，気になるところですが...

# [追記]実際に使ってみて

gain等のパラメータの設定は可能でしたが，解像度(とおそらくフレームレート)の設定には問題があります．enum型で指定するのですが，最大解像度が``_1600x1200Y16``です．今使用しているのはflea3シリーズのカメラで最大解像度が``2000x2000``以上ありますので，指定することができません．数値で直接指定できるようなメソッドがあればいいのですが...
おそらくラッパー開発時のSDKのバージョンが古いだけでちょっと変更すれば対応できる気もするのですがそこを頑張る気力は...まぁ解像度を動的に変更する必要がある場面はあまりないと思うので公式サンプルのアプリケーションから変更すればよいかなと．