OmniAICreator/Qiita-1.07M huggingface dataset:
コンボ攻撃

以下の作業は[この記事](https://qiita.com/Getabako/items/4d636f3d1c3017a0824e)のことを一通りやってからやって下さい♪
設定のやり方が分からないっていう人もそちらに書いてあるので参考にして下さい♪
※Animatorのattack1→Exitの矢印はコンボ攻撃をやるなら削除して下さい。

アニメーションの読み込み、アニメーションの名前の変更、アニメーションの遷移の設定
![combo1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/f7c11e12-5bed-a595-c8fb-34f30b24aad3.png)

アニメーションの遷移の条件の設定
![combo2.png](https://qiita-image-store.s3.amazonaws.com/0/214359/39e7b9d6-59b4-e3ad-57fc-5cdbb526e4e8.png)

```Combo.cs
using UnityEngine;
using System.Collections;

public class AttackTest : StateMachineBehaviour
{

    
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.SetBool("Attack", false);
    }
       override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        if (Input.GetKeyDown(KeyCode.Z))


        {
            animator.SetBool("Attack", true);
        }
    }
    
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.SetBool("Attack", false);
    }
    
}
```

Comboスクリプトの貼り付け
![combo3.png](https://qiita-image-store.s3.amazonaws.com/0/214359/0f37844f-0a11-93c3-3b35-23c67d76595a.png)

攻撃中のみ判定を表示するスクリプトの作成
[この記事](https://qiita.com/Getabako/items/4d636f3d1c3017a0824e)で作成した剣の当たり判定に貼り付けます。
既に貼り付けている場合は追記部分を追記して下さい

```GetAnimationInfo.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GetAnimationInfo : MonoBehaviour
{

    public GameObject obj;
    private AnimatorStateInfo stateInfo;
    private Animator anim;

    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

        stateInfo = anim.GetCurrentAnimatorStateInfo(0);
        if (stateInfo.IsName("Base Layer.attack1") || stateInfo.IsName("Base Layer.attack2") || stateInfo.IsName("Base Layer.attack3"))//追記部分
        {
            obj.SetActive(true);
        }
        else
        {
            obj.SetActive(false);
        }}}
```

攻撃ボタンを押した回数によって攻撃が変わります
![combo攻撃.gif](https://qiita-image-store.s3.amazonaws.com/0/214359/c3425b80-2244-5538-2c2f-b61b73c12236.gif)

[目次に戻る](https://qiita.com/takasaki19841121/items/55daf89bbd2e0998a16c)
SmartGit > Ubuntu 16.04 LTSにセットアップ | JREを使う

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

SmartGitはWindows上の開発環境で使うGitクライアントになっている。
Linux上でも使いたいと思うようになった。

### 関連情報

- [SmartGitのインストールと使い方 (Ubuntu 14.04)](https://ry0.github.io/blog/2015/06/06/smart-git/) by Ry0 Noteさん
- [Ubuntu 18.04 LTSに複数のJDKをインストールする方法](https://qiita.com/SUZUKI_Masaya/items/a4eb06e826bf56541537) by @SUZUKI_Masaya さん

JREを使うようだ。

### セットアップ

Ry0 Noteさんの情報のまま実行するとエラーとなった。
(oracle-java8-installerの部分）。

以下とすることでエラーなくセットアップできることを確認した。

```bash
$sudo add-apt-repository ppa:webupd8team/java
$sudo apt-get update
$sudo apt-get install default-jre
$sudo add-apt-repository ppa:eugenesan/ppa
$sudo apt-get update
$281 sudo apt-get install smartgit
```

セットアップ後、`/usr/bin/smartgit`に実行ファイルがある。

### 注意点

JRE(Java Runtime Environment)を使用する。

JREのメンテナンスとsmartgit利用の利点を検討する。
Solrをsunspotで起動しようとするとOperation not permittedになる

↓起動してほしい

```
$ bundle exec rake sunspot:solr:start
rake aborted!
Errno::EPERM: Operation not permitted
/Users/sakadon/.rbenv/versions/2.4.1/bin/bundle:22:in `load'
/Users/sakadon/.rbenv/versions/2.4.1/bin/bundle:22:in `<main>'
Tasks: TOP => sunspot:solr:start
(See full trace by running task with --trace)
```

↓PIDファイルには死んでもらう

```
$ rm solr/pids/development/sunspot-solr-development.pid 
```

↓治る

```
$ bundle exec rake sunspot:solr:start
Successfully started Solr ...
```
[HomeKit対応仕様] Philips Hue ホワイトグラデーション シングルランプ 


<img src="https://qiita-image-store.s3.amazonaws.com/0/7883/ddd409f2-d2b4-a9de-c1c2-b2c11ec53d39.png" height=300 />

<a target="_blank" href="https://www.amazon.co.jp/gp/product/B01MSITPT1/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B01MSITPT1&linkCode=as2&tag=tokorom-22&linkId=a335872d8b17c6b4c0ddb7cb4ce3c4c1">[Amazon] Philips Hue(ヒュー) ホワイトグラデーション シングルランプ</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=tokorom-22&l=am2&o=9&a=B01MSITPT1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## 主なサービス

|`HMServiceType`〜 | 説明 |
|--- | ---- |
|`Lightbulb` | 電球 |

## 主なキャラクタ

|`HMCharacteristicType`〜 | 説明 | フォーマット | 書き込み |
|--- | ---- | ---- | ---- |
|`PowerState` | 電源の状態 | bool | 可 |
|`ColorTemperature` | 色温度 | int | 可 |
|`Brightness` | 明るさ | int | 可 |

## 概要

スマートIoT照明のパイオニアであるPhilips Hueのランプの非カラー版です。
非カラーといっても、蛍光灯のような白色から白熱電球のようなオレンジ色の温かみのある色まで調整できます。

カラー版では`Hue`、`Saturation`、`Brightness`の３つのキャラクタを変更することでランプの色を変えますが、この非カラー版では`ColorTemperature`という１つのキャラクタを変更することで色味を調整します。

なお`HMCharacteristicTypeColorTemperature`はiOS 11で新規追加されたキャラクタです。

もちろん`PowerState`キャラクタで点灯/消灯を操作することもできます。

## ColorTemperatureのmetadata

| プロパティ | 実際の値 |
| ---- | ---- |
|`format` | int |
|`units` | |
|`minimumValue` | 153 |
|`maximumValue` | 454 |
|`stepValue` | 1 |
|`validValues` | |
|`maxLength` | |
|`manufacturerDescription` | Color Temperature |

## ColorTemperatureのvalue

`value`プロパティは153から454の範囲で設定できます。
この写真の左側のランプが153を、右側のランプが454を設定した時の実際の色味です。

## ColorTemperatureを更新するサンプルコード

```swift
let service = home.servicesWithTypes([HMServiceTypeLightbulb])?.first
let candidates = service?.characteristics.filter { $0.characteristicType == HMCharacteristicTypeColorTemperature }

guard let colorTemperature = candidates?.first else {
    return
}

colorTemperature.writeValue(454) { error in
}
```

## まとめ

キャラクタの`value`の更新が視覚的にわかりやすく、また、`true`/`false`だけでなく数値の`value`を書き込み可能な製品としてPhilips Hueをオススメしていますが、実用的にはカラー版でなくこちらのホワイトグラデーション シングルランプで必要十分ではないでしょうか。

値段的にはカラー版の半額程度になりますので、すでにPhilips Hueのブリッジをお持ちのかたの追加ランプとしては順当かと思います。

## iOS 11 Programmingについて

この記事は「iOS 11 Programming」の **第12章 HomeKit入門とiOS 11における新機能** の中の **12.4.2 HomeKit 対応製品利用実例** への追加コンテンツ的位置付けにもなっています。
この製品がサポートするサービス（`HMService`）やキャラクタ（`HMCharacteristic`）の表など、全てこの書籍に合わせた形で掲載しております。

「iOS 11 Programming」にご興味のあるかたは是非、以下リンクからご参照ください。

<a target="_blank" id="purchase" style="text-decoration:underline; color:#1DA1F2;" href="http://peaks.cc/tokorom/iOS11">
iOS 11 Programming
<img src="https://s3-ap-northeast-1.amazonaws.com/peaks-images/project002_cover.jpg" height=200 />
</a>
kotlinのコードをさくっと試したい


# 概要
この前までnodeだったり主にjs書いてたので、さくっと試すのはchromeの`developer tool` でコードを書いてさくっと確かめるのが可能だったが
kotlinでさくっと試したいコードが有るときにいちいちプロジェクト作ってやるのがめんどい
Android開発のため手元の環境はAndroidStudio... 今書いているプロジェクトのコード内にサンプルコードを書くのも気が引けるし…
かと言って新規プロジェクト作ってやるほどでも無いし、ましてやAndroidのAPI使わないコード試したいだけなのにわざわざAndroidStudioで新プロジェクト作る意味ないし…
ということでREPLの環境を整えておく

# install
公式ドキュメントに書いて有ることをただやってるだけなのでこちらを読めば分かる内容です

http://kotlinlang.org/docs/tutorials/command-line.html


Homebrewは入っているのでHomebrew経由でのインストールを行う

brewをアップデートし、kotlinコマンドを使えるようにインストール
```
$brew update
$brew install kotlin
```

# use
kotlinでREPLをやる
kotlinをインストールするとkotlinc-jvmというコマンドが使用可能になる

```
$ kotlinc-jvm
Welcome to Kotlin version 1.1.61 (JRE 1.8.0_152-release-915-b08)
Type :help for help, :quit for quit
>>> 1+2
3
>>> println("hello")
hello
>>>
```

`1+2`
`println("hello")`
とかやってみた

# 感想
うーんと正直対話型じゃなくていいやｗ
わざわざIDE使わなくてもさくっとテストしたいときは`kotlinc`でいいかな

# 追記
さくっとならこっちでいいか
https://try.kotlinlang.org/
Boostnote v0.8.17からレイアウトが変わった？


ローカルメモにBoostnoteを愛用してます！
Kobitoも使ってますが、そこは臨機応変に・・・

そして、今朝アプリ開きupdateの情報があり（だいぶ前に出てたけど無視してた）、
updateしてみると、記事一覧の表示域が変わり、不明な余白が出来ていました。（私だけ？）

![2017-11-27_11h14_44.png](https://qiita-image-store.s3.amazonaws.com/0/214582/bbb3ecc0-28a4-c4ea-1a5f-10465dd6bbfa.png)

見づらいし、編集しづらくなった。

どこかのエディタは設定からcss修正できたよーな、できないよーな。
Boostnoteではとりあえず出来なそうだったので、アプリを探る。

Viewタブ - [Toggel Depeloper Tools] Chromeの開発者コンソールが表示されまし。

cssで領域を制御しているみたいです。

.MarkdownNoteDetail__body___browser-main-Detail-
↑こやつが記事領域みたい・・・

![2017-11-27_11h26_14.png](https://qiita-image-store.s3.amazonaws.com/0/214582/88592c39-4a7d-3a2f-58bb-5335178bc4ec.png)
![2017-11-27_11h53_39.png](https://qiita-image-store.s3.amazonaws.com/0/214582/554b5f49-9302-6b5e-1521-5b3e7ac74f97.png)
なんだこの無駄なmarginはと思ったら、max-widthが設定されてた。

私の場合は、以下がアプリディレクトリが読み込み元でした。
C:\Users\ [ユーザ名] \AppData\Local\boost\app-0.8.17\resources\app

調べてみると、```app/compiled/main.html```が、画面構成に利用されており、
```app/compiled/main.js```のcssが適用されていそうだ。
![2017-11-27_11h35_45.png](https://qiita-image-store.s3.amazonaws.com/0/214582/6d17c616-6e9f-073a-9f95-1417971870e5.png)
（なぜ、jsでcss書き出してるんだろ。。。処理を深く読んでないからわからないけど）

CSSでなんとかなりそー！
どーせローカルだしBoostenote自分好みに拡張できそうだから、なんとなくcustomディレクトリ作成して修正してみた！

``` html:app/compiled/main.html
 ~~~ 106行目辺り ~~~ 
      : '../compiled/main.js'
    var scriptEl = document.createElement('script')
    scriptEl.setAttribute('type', 'text/javascript')
    scriptEl.setAttribute('src', scriptUrl)
    document.body.appendChild(scriptEl)
</script>
  # customcss include 追加
  <link rel="stylesheet" href="../custom/lib/custom.css">
  <style>
    .ace_search {
      background-color: #d9d9d9;
    }
  </style>
```

適当に領域を拡張 (デフォルトcssを上書き)

``` html:app/custom/lib/custom.css
/* Boostenote body 拡張 */
.MarkdownNoteDetail__body___browser-main-Detail-{
    margin-left  : 15px ;
    margin-right : 60px ;
    max-width    : 100% ;
}

```


修正し Viewタブ - [Relode]で良い感じに記事Body領域が広がった
![2017-11-27_11h50_17.png](https://qiita-image-store.s3.amazonaws.com/0/214582/6b12496e-2528-a506-fdd3-a0d019cb7450.png)

うーん。満足。

時間があるときに付加機能でもつけようかなー

※ この手法はアプリを直に修正しているため、オススメできません。自己責任でお願いします。他に良い方法あれば教えてください。
Cognos クロス集計で数値の入っているセルのみドリルスルーを設定する

#概要
以前、ドリルスルーを設定した際のパフォーマンスの劣化の原因を説明するため、こちらの記事を投稿しました。
**Cognos BI ドリルスルー使用時のパフォーマンス上の注意点**
https://qiita.com/shinyama/items/2fa81dfd42689eb1b407

平たく言えば、「ドリルスルーポイント分だけ、パラメーターで指定された値を繰り返し持つ」という、Cognosのレポートの仕様によるもので、これは以下の様なクロス集計をドリルスルー元とした場合でも同じです。

この場合、クロス集計は4列x5行で20セルありますので、ドリルスルーポイントも20個となり、「Fax」という文字の情報が、20回繰り返されてレポートに保持されます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/6af0d3d8-d75c-ef0b-d3f9-b9287f1fbe9a.png)

お気づきの通り、「2010年」の「Mountaineering Equipment」は、データがNULLで入ってないですが、このブランクセルにもドリルスルーは内部的には設定されていて、「Fax」という文字を保持します。

一般的なクロス集計では、このような空白のセルは多いですので、この空白セルからドリルスルーを排除できたらパフォーマンスが向上できる、というのが今回の内容です。

#手順
やり方は簡単です。
クロス集計のセルの中に「条件ブロック」を入れています。

ブロック変数の条件がYesの時、ドリルスルーが設定された「Quantity」が配置されています。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e819b579-436e-35ec-fef8-17fdbfa7c3be.png)

条件がNoの時、ドリルスルーは設定されていない、そのままの「Quantity」が配置されています。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e933bac8-0891-001b-10a5-69f632ed9616.png)

コンディション・エクスプローラーで、ブール値変数として、以下の定義を置いています。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/82dddf95-99be-c7da-cff2-5c59a86f64ec.png)

非常に単純ですが、クロス集計が「遅い」「ドリルスルーを設定している」「空白セルが多い」という環境では、非常に効果がありますので、是非覚えておいて頂ければと思います。
GASの正規表現で起こったエラー

```js
//正規表現
var reg_a=/<a [^>]+>(.*?)<\/a>/g;                           // aタグ抜き出し
var reg_span_sg=/<span id=\"msg_[0-9]*\"+>(.*?)<\/span>/g;  // span id="msg_数"抜き出し
var reg_a_text=/<a [^>]+>([^<]*)<\/a>/g;                    // aタグ
var reg_href=/(http[^"]*)/g;                                // hrefの値
var reg_text=/>(.*)(?=<\/a>)/i;                             // テキスト部分（>が入っちゃう）
var reg_threadNum=/[^\d]./g;                                // 小数以下スルー、数値部分だけ抜き出し
```




# "正規表現の後のフラグが無効です"

MacでHTMLタグを抜き出す正規表現を打った所`正規表現の後のフラグが無効です`と言われてエラーが出た。

`var reg_span_sg=/<span id=\"msg_[0-9]*\"+>(.*?)<\/span>/g;`


原因
`バックスラッシュ`が`円マーク`になっていた。

`円マーク`はWindowsで使われる区切り文字なので他のOSでは使えない(場合が多い)
`バックスラッシュ`にしましょう。

Mac OS XをJISキーボードで使っている場合、バックスラッシュ（\）の入力は
optionキーを押しながら、¥キーを押すと`バックスラッシュ`を入力できる
LINQって便利だけど考えて使わないといけない(戒め)

##LINQって最高だと思う
初投稿になります。間違いや勘違いがあればご指摘いただけましたら幸いです。

c#を書き出して一年程度なのですが、LINQってすごく便利だなと感じております。

LINQを多少使えるようになったばかりのころは
使えるところでは極力使えるようにしていました。

その際に職場の上司に指摘されたことを書きたいと思います。

##それLINQ使わなかったら1回のループですむよね？

たとえばdoubleのリストから最大値、最小値、平均値を求めたい場合

```c#
List<double> doubleList = "doubleのList";
//1回目ループ
var max = doubleList.Max();
//2回目ループ
var min = doubleList.Min();
//3回目ループ
var average = doubleList.Average();
```

みたいな取り方をしていたのですが、
これは3回ループしています。

下記ならば1回のループで済みます。

```c#
List<double> doubleList = "doubleのList";
var max = double.NaN;
var min = double.NaN;
double sum = 0;
// ここで1回すだけ
foreach (double d in doubleList)
{
    if (double.IsNaN(max) || max < d)
        max = d;
    if (double.IsNaN(min) || min > d)
        min = d;
    sum += d;
}
var average = sum / doubleList.Count();
```

上記のソースでNaNチェックを毎回することを考えると

```c#
List<double> doubleList = "doubleのList";
// NaNチェックを避けるため1つ目の値をいれておく
var max = doubleList.First();
var min = doubleList.First();
double sum = 0;
// ここで1回すだけ
foreach (double d in doubleList)
{
    if (max < d)
        max = d;
    if (min > d)
        min = d;
    sum += d;
}
var average = sum / doubleList.Count();
```

みたいな書き方したほうがいいと思います。


もちろんデータの数が1000件とかならLINQの方が簡潔でいいと思いますが、
何百万件、何千万件というデータを扱う場合は気を付けようと思います。

でもこれってどれぐらいの件数からLINQを使うべきでないのかのラインって
計測してみないとわからないですね。
また、休日にでも計測してみたいと思います。
Firebase Functions 上に GraphQL サーバーを実装する

この記事は１ヶ月後の自分のネタ切れにつきアドベントカレンダーの記事ということになりました

## Why

SPA や モバイルアプリ だととりあえず Firebase Functions に graphql エンドポイントを一個マウントして金で殴ってスケールさせるところからスタートするのがいいと思います。金の弾丸というやつです。

この環境は、query と mutation は実装できるけど、 Cloud Functions のライフサイクルの都合上、 wsバックエンドのsubscription は実装できません。そこは Firestore とか使ってなんとかできるんでいいかって感じ。

自分の用途としては、Firestore の write系は一律禁止、 read 系は firebase.rules で制御しつつ subscribe して、リアルタイムではない複雑な問い合わせやロジック検証付きの副作用を GraphQL に寄せる、みたいな使い方を想定してます。

## この記事で解説しないこと

- firebase にデプロイする手順
- graphql スキーマ定義やリゾルバの実装方法
- webpack や npm install や package.json

## functions 定義

これだけ。

```js:functions/index.js
const functions = require('firebase-functions')
const express = require('express')
const { graphqlExpress } = require('apollo-server-express')
const bodyParser = require('body-parser')
const { makeExecutableSchema } = require('graphql-tools')

const schema = makeExecutableSchema({
  typeDefs: [/* Your schema.graphql */],
  resolvers: {/* Your resolver */}
})

const server = express().use(
  bodyParser.json(),
  graphqlExpress({ schema, context: {} })
)

exports.graphql = functions.https.onRequest(server)
```

makeExecutableSchema でどのようにgraphqlサーバーを実装するかは別途調べてください。
https://github.com/apollographql/graphql-tools
https://github.com/mizchi-sandbox/play-graphql-server

## クライアントから graphql へ リクエストを送る

firebase deploy でデプロイ(略)

Firebase の rewrite ルールに graphql function を指定

```json:firebase.json
{
  "functions": {
    "source": "functions"
  },
  "hosting": {
    "rewrites": [
      {
        "source": "/api/graphql",
        "function": "graphql"
      }
    ]
  }
}
```

`firebase serve` などでローカルサーバーの実行

ApolloClient からリクエスト

```js:src/graphqlClient.js
import 'isomorphic-fetch'
import { ApolloClient } from 'apollo-client'
import { HttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
import gql from 'graphql-tag'

const client = new ApolloClient({
  link: new HttpLink({ uri: 'http://localhost:5000/api/graphql' }),
  cache: new InMemoryCache()
})

client.query({
  query: gql`<your query>`
}).then(ret => {
 console.log(ret)
})

```

注意:2017/11/27 現在、このビルドエラーを踏んだのでapollo-linkへのワークアラウンドが必要 https://github.com/apollographql/apollo-link/issues/248

## TODO

- あとでサンプルプロジェクトを公開
- Firebase Auth との認証系を作る
- 認証トークンを使って Firestore を殴る

https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js
ECRでタグの付け替え


一度タグ付けたけど、別のタグにしたくなった時のやり方。
AWSのCLIコマンド長くてすぐ忘れるのでメモ。

# 環境
aws-cliのバージョンは以下。

```shell-session
$ aws --version
aws-cli/1.11.124 Python/2.7.14 Darwin/17.2.0 botocore/1.7.43
```

# 参考
- [AWS CLI を使用してイメージにもう一度タグを付ける](http://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/retag-aws-cli.html)


# やりかた
公式ドキュメントに書いてあるように、新しいタグを付けてから古いタグを消すだけ。
現時点ではマネジメントコンソール上からはできなそうだった。

## 新しいタグを付ける

```shell-session
$ MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=2017.02 --query images[].imageManifest --output text)
$ aws ecr put-image --repository-name amazonlinux --image-tag 2017.03 --image-manifest "$MANIFEST"
$ aws ecr describe-images --repository-name amazonlinux
```

## 古いタグを消す
以下のbatch-delete-imageを使った。
http://docs.aws.amazon.com/cli/latest/reference/ecr/batch-delete-image.html


```shell-session
$ aws ecr batch-delete-image --repository-name amazonlinux --image-ids imageTag=2017.02
```

# 感想
`batch-delete-image` とかAWSの命名結構ブレがある気がする。
他にもっと良い方法もあるかもしれない。
ErgoDoxを１０ヶ月ほど使って気づいたこと

# 重要かも 2018年1月30日

知ってる人にはあたりまえかもしれませんが、
茶軸を選んだところ、音が結構うるさいので、オフィスには向かないようです。
o-ringしましたがあまり効果がなかったです。

静音赤軸がよさそう。

# 概要

ErgoDox を使いはじめて１０ヶ月ほどたったので、その感想

# まとめ

まず、使い続けていられるので、自分にはあっていたようです。

# 気づいたこと１

はじめの１週間程度は、毎日数回配置換えをおこなっていた。
その後３ヶ月は、月１くらいでの変更になっていて
その後はほとんど変更していない（と、おもう）

# 気づいたこと２

１０ヶ月ほどたって、はじめてきづいたのが
自分は手には、少し大きいので活用できていないキーがあるということに気づきました。
とくに親指でおすであろう、キーのいくつかが結構つかっていない。
人差し指でおすであろうキーもいくつか使っていない気がします。

そこに割り当てているキーは、どっかのレイヤーに割り当てているので、特に困っていないので、きづかなかったようだ

物理的にどのキーを押しているかなどの情報をとっておくと、より効率のよい配置ができそう。

ダブルクォーテーションとか、アンダースコアとかは、複数の場所に割り当てている。そういうことができるのも便利だとおもう。

# 気づいたこと３

結構重たい。
持ち運んでみようとおもったけど、結構重たいので、持ち運んだことはない。

# どこになにを配置したかわからないか？

最初のころは、どのレイヤーになにがあったか、わからなくなったので、
そのへんは、どこに何を配置したのかをPDFに出力するツールを作って対応した。
そのうち覚えたので全くみなくなった。


# 人からきいた話

どうも半年くらいで、やめるという人もいるような話をきいた。
たしかに、試せるなら数ヶ月ためしたほうがよいだろうなぁとはおもった。
GPS > GPS リアルタイムトラッキング 方法の考察（その２）

これは以下の記事の改定です。（2017/11/27
ハードウェアの情報にしぼりました。

[GPS > GPS リアルタイムトラッキング 方法の考察](https://qiita.com/sugasaki/items/2e769c5c5a2ee4b9df94)


# はじめに

## 背景
やりたい事：３日間連続してGPSトラッキングしてデータをクラウドへ送信
遠隔地でGPS装置の場所を地図で確認（対象者は複数）

以下検討内容

# ハードウェア

## さくらのIoT + Arduino + GPS

* 値段：8000円
* 制御用のArduinoとシールド(5,000円)が必用
* 物が大きくなりそうなのがネック
* GPSは別途必用

[さくらインターネットが提供するIoTプラットフォームサービス、sakura\.io ｜ さくらの通信モジュール](https://sakura.io/product/module_lte.html)
[さくらインターネットが提供するIoTプラットフォームサービス、sakura\.io ｜ さくらの通信モジュール](https://sakura.io/product/arduino.html)


## 3GIM

* 小さい、軽い、電力消費小さい
* Arduinoでの動作前提
* GPS付
* 値段：27,000円
* 3GIM制御用のArduino、またはIoTab（メーカー試作段階）が必用
* サンプルはまだまだ少ない。

[3GIM V2\.2（3Gフレキアンテナ付き） \- スイッチサイエンス](https://www.switch-science.com/catalog/3432/)
[3gim\_v2 \[3GIM Wiki\]](https://3gim.wiki/doku.php?id=3gim_v2)

## 3GPi 

* Raspberry Piでの動作前提
* GPS付
* 3GPi 制御用のArduino、またはIoTab（メーカー試作段階）が必用
* 値段：30,024円
* スターターキット（Raspberry Pi同梱）：69,120円

[3GPi Ver\.2（ラズベリーパイ用3G通信モジュール、Raspberry Pi 3 Model B 対応） \| MechaTracks](http://mtx.theshop.jp/items/5227015)
[どこでも3分！ラズパイIoTスタータキット「anyPi」 \| MechaTracks](http://mtx.theshop.jp/items/6646642)




## micro:bit + 何か

* GPSは使えるが、送る手段がない
* micro:bit→iPhoneへBLE
* Bluetoothはよく切れるので心配
* 再接続がめんどい

## iPhone 単体

* みんな持ってる（将来の展開に強そう）
* 電池持つかが不安
* 実機有りだが普段使いしてるので、
　　実験と併用できるか？
* アプリを作り込む時間があるか？
* GPSの精度に疑問。
　　（自分の携帯だけかもしれないが精度悪い）
* 実機テストでやれば、ストアに上げなくてもOK?

## Windows Phone

* アプリが少ない分、消費電力が小さそう。
* C#で簡単に作れそうだ
* 実機テストでやれば、ストアに上げなくてもOK?

## Android
* ここもターゲットに入れるならXamarinで開発要？* * * 
* 実機もっていない
* 中古でやすいの転がってそう
Immutable.RecordとPropTypesを組み合わせて実行時に型チェックを行う

React＋Fluxを使っているが、Recordにデータチェックを追加したい衝動に駆られたので、Immutable.Recordを拡張してみた。
可変データのバリデーションとしてはまだ不十分だが、マスターデータなどのベースとしては使えるんじゃなかろうか（React+Flux初心者なのでおかしなことをやっているかもしれない）


```Record.js
import PropTypes from 'prop-types';
import Immutable from 'immutable';


export function createRecordClass(scheme) {
  const name         = scheme.className;
  const propTypes    = scheme.propTypes;
  const defaultProps = scheme.defaultProps || {};

  let record = {};
  for (let key in propTypes) {
    record[key] = defaultProps[key];
  }

  return class extends Immutable.Record(record) {
    constructor(data) {
      PropTypes.checkPropTypes(propTypes, data, 'Record', name);
      super(data);
    }
  }
}

```

```HogeMasterRecord.js
import {createRecordClass} from './Record'
import PropTypes from 'prop-types';

const scheme = {
  className: "Hoge",
  propTypes: {
    id:   PropTypes.string.isRequired,
    name: PropTypes.string.isRequired,
  },
  defaultProps: {
    id: ''
  }
};

export default class HogeMasterRecord extends createRecordClass(scheme) {
  hoge() {
    console.log("hoge");
  }
}
```

``` Main.js
import HogeMasterRecord from './HogeMasterRecord'

// badkeyでwarningが表示される
let record new HogeMasterRecord({id: '123', badkey: ''};
record.hoge();
record.get('id');
```
[TIPS]Windowsで、あるポート番号をListenしているプロセスを調べてkillする

## あるポート番号をListenしているプロセスを調べる

1. netstatコマンドで一覧取得する
1. findで絞り込む(grepのような機能)

**例**
ポート番号 **8080** をListenしているプロセス(PID)を調べる

```shell-session

>netstat -ano | find ":8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       8220
  TCP    [::]:8080              [::]:0                 LISTENING       8220
```

上の**8220** がプロセスID(PID)となる

## 該当のプロセスをkillする

**例**
PIDが 8220 のプロセスを killする

```shell-session
>taskkill /F /PID 8220
成功: PID 8220 のプロセスは強制終了されました。
```
pythonで言語処理するためのライブラリインストール方法（Mecab/Cabocha）

- 英語だと、`nltk`ライブラリを活用すればいいし、そもそも英語は単語ごとに区切られているので、単語をそのまま特徴ベクトルに変換して機械学習すればいい。
- 日本語の場合は、
 - `nltk`ライブラリで扱える範囲が限定されている
 - 形態素解析（＝単語ごとに分割して、品詞タグを付与）して、
 - 構文解析（＝文節ごとに区切って係り受けの関係を付与）するのが必要

ということで、日本語を扱う上でのライブラリのインストールめもです。
日本語の場合、下記のツールが利用できます。

- 形態素解析
  - MeCab、JUMAN++、kuromoji、など
- 構文解析
 - CaboCha、KNP、など

今回の投稿は、
形態素解析として、MeCab
構文解析として、CaboCha　をpythonから利用するためのインストールメモです。

実際にこれらのツールをpythonで利用する場合のコードサンプルはこちら
-> [pythonで日本語文の感情分析（＋言語処理の基礎）](
https://qiita.com/matsu0228/items/0323f299d03f5b07efdc#2%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90)

## 検証環境

```
$ cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

$ python -V
Python 3.5.4
```

## install

### mecab

- ref: https://github.com/taku910/mecab

```
git clone https://github.com/taku910/mecab.git
cd mecab/mecab
./configure  --enable-utf8-only
make
make check
sudo make install
```

- check following

```
/usr/local/etc/mecabrc
/usr/local/bin/mecab
/usr/local/bin/mecab-config
```

### ipa-dic

- dic for mecab

```
cd ../mecab-ipadic
./configure --with-charset=utf8
make
sudo make install
```

- check

```
$ echo 'MeCab はフリーソフトウェアです' | mecab
```

### mecab for python

- use pip install

```
pip install mecab-python3
```

- in tha case that  error occurred when you use form python.

```
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
```

- check libraly path and fix it.

```
ldconfig -p | grep 'mecab'

echo '/usr/local/lib' >> ./mylib.conf
sudo cp  mylib.conf /etc/ld.so.conf.d/
sudo ldconfig

ldconfig -p | grep 'mecab'
```

- usage: https://github.com/SamuraiT/mecab-python3/blob/master/bindings.html

## NEologd 

- 新しい単語を認識するための辞書です。たとえば、この辞書を使えば「攻殻機動隊」を１語の名詞であると認識できます。

- https://github.com/neologd/mecab-ipadic-neologd

## Cabocha

- CRF++

```
 wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ" -O CRF++-0.58.tar.gz
 $ tar zxfv CRF++-0.58.tar.gz
 $ cd CRF++-0.58
 $ ./configure
 $ make
 $ sudo make install
```

- Cabocha

```
$ wget "https://googledrive.com/host/0B4y35FiV1wh7cGRCUUJHVTNJRnM/cabocha-0.69.tar.bz2" -O cabocha-0.69.tar.bz2
$ tar jxvf cabocha-0.69.tar.bz2
$ cd cabocha-0.69
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

- Cabocha for python

```
$ cd cabocha-0.69/python
$ vim setup.py
def cmd2(str):
#   return string.split (cmd1(str)) この行を削除
    return cmd1(str).split() # この行を挿入

$ sudo python setup.py build_ext
$ sudo python setup.py install
$ sudo ldconfig
```

実際にこれらのツールをpythonで利用する場合のコードサンプルはこちら

-> [pythonで日本語文の感情分析（＋言語処理の基礎）](
https://qiita.com/matsu0228/items/0323f299d03f5b07efdc#2%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90)
window.openで開いたウィンドウを右のモニターに出す

Firefox Quantum (ver57) ubuntu 17.10 で確認

## 方法1. 開くときに座標指定

```html:a.html
<script>
function wopen(url){
        //現在使用しているモニターの横幅を取得
        var left = window.parent.screen.width;
        //開く (width,heightを右モニターより大きい値だとモニタ内に全体表示してくれる)
        window.open(url,'pop2','width=1600,height=1600,left='+left+',top=0,scrollbars=1');
}
</script>
<a href="javascript:void(0);" onClick="wopen('http://localhost:8000/b.html');">開く</a>
```

```html:b.html
hi
```

## 方法2. 開いてから移動

```html:a.html
<script>
function wopen(url){
        //現在使用しているモニターの横幅を取得
        var left = window.parent.screen.width;
        //開く
        window.open(url,'pop2','top=0');
}
</script>
<a href="javascript:void(0);" onClick="wopen('http://localhost:8000/b.html');">開く</a>
```

```html:b.html
<script>
var left = window.parent.screen.width;
window.moveTo(left,0);
</script>
<body>
hi
</body>
```
開発未経験者がWEBエンジニアを目指す-4

#phpで今やっていること
(継承、独自プロパティ、メソッド)

ドリンクにホットやアイスのタイプを持たせたい。(一部のコード掲載します)

```drink.php
require_once('menu.php');　　　//menu.phpを呼び出している

class Drink extends Menu {  //子クラスを定義し親クラスを継承
  private $type;　　        //独自のプロパティを追加

  public function getType() {  //独自のメソッドを定義
    return $this->type;        //$typeの値を返す
   }
  public function setType($type) {  //独自のメソッド、引数$type
    $this->type = $type;  //インスタンスのtypeプロパティを$typeに代入
   }
}
```

```data.php
$coffee = new Drink('COFFEE',・・・);
$coffee->setType('ホット'); //Drinkクラスのインスタンスなので、Drinkクラスのメソッドが呼び出せる。
$curry = new Menu('CURRY',...);
$curry ->setType('ホット');  //親クラスのインスタンスからは呼び出せない。(Menuクラスのインスタンスだから)
```

##メモ
・子クラスで定義したメソッドやプロパティは親クラスから呼び出せない。
・子クラスでメソッドが定義されていなければ、親クラスのメソッドが呼び出される。
・これから行うが、クラスによって処理がわけれる(instanceof)

・他、コンストラクタ,クラスメソッド等、頭の中で整理しきれていない、、
・急に特別なメソッドやif分、for文等があれ？ってなるときがある。(←要復習)

引き続き勉強進めます。
R並べ替え


options(encoding = "utf-8")
library(tm)
library(data.table)
library(zoo)
library(dplyr)
library(xlsx)

root<-("c:/Users/kohei/R/BEAT/")
setwd(paste0(root))

infile<-("beat.csv")

dat.all <- fread(paste0(root,infile), encoding = "UTF-8")

dat.all[is.na(dat.all)]<-0

check_list<-dat.all$Message

excl_list<-read.csv("excl_list.csv",header = F)

for (i in 1:length(excl_list)){
  dis_list<-grep(excl_list$V1[i],check_list)
  if(length(dis_list)!=0){
    for (i in 1:length(dis_list)){
      list<-dis_list[i]
      dat.all[list,]<-NA
    }
  }
}

dat.all_excl<-na.omit(dat.all)


pickup_list<-read.csv("pickup_list.csv",header = F)

for(i in 1:length(pickup_list)){
  
}

  dis_list<-grep(excl_list$V1[i],check_list)
  if(length(dis_list)!=0){
    for (i in 1:length(dis_list)){
      list<-dis_list[i]
      dat.all[list,]<-NA
    }
  }
}

for (i in 1:length(excl_list)){
  dis_list<-grep(excl_list$V1[i],check_list)
  if(length(dis_list)!=0){
    for (i in 1:length(dis_list)){
      list<-dis_list[i]
      dat.all[list,]<-NA
    }
  }
}

dat.all_excl<-na.omit(dat.all)


options(encoding = "utf-8")
library(tm)
library(data.table)
library(zoo)
library(dplyr)
library(xlsx)

root<-("c:/Users/kohei/R/BEAT/")
setwd(paste0(root))

infile<-("beat.csv")

dat.all <- fread(paste0(root,infile), encoding = "UTF-8")

dat.all[is.na(dat.all)]<-0

check_list<-dat.all$Message

excl_list<-read.csv("excl_list.csv",header = F)


for (i in 1:length(excl_list)){
  dis_list<-grep(excl_list$V1[i],check_list)
  if(length(dis_list)!=0){
    for (i in 1:length(dis_list)){
      list<-dis_list[i]
      dat_pickup<-dat.all[list,]
    }
  }
}




created_time<-dat.all_excl$CreatedTime
created_time <- strptime(created_time, "%Y-%m-%d %H")

created_time <- as.character(created_time)

tail(created_time)

created_frame  <- as.data.frame(table(created_time))

#http://www.motorcycleshows.com/sites/motorcycleshows.com/files/SOC%20Template.pdf
#http://www.eicma.it/en/visit/exhibitor_list/

拡散希望
YOSHIKI
MIYABI
名無しさん
刀剣乱舞
闇遊戯
遊戯
遊戯王
名無し
ヒト型ロボット
桃山
パラド
ゆるぼ
運営チーム
EXILE
プリキュア
美肌
東京喰種
将棋ジャーナル
モンスト
ヒト
パチンコ
ビタミン
VRゴーグル
リフレク
バンやろ
ビットコイン
ネフェルピトー
ビートストリーム
スタンビート
ビートマニア
ビートプレス
エネルギービート
ブラストビート
ドレミファビート
ビートルズ
ビートダウン
ツービート
ビートメイカー
オフビート
ビートウォッシュ
ビーフェス
キラキラビート
ジュエルビート
REFLEC BEAT
Bitcoin
BEAT LINKS
BEAT Audio
Jewel Beat

mediatype_list<-dat.all.csv$MessageType
mediatype_table<-table(mediatype_list)
#write.xlsx(mediatype_table,"mediatype.xlsx")

title_list<-dat.all.csv$Title
title_count<-as.data.frame(table(title_list))
title_count_decreasing<-title_count[order(title_count$Freq,decreasing = TRUE),]
View(title_count_decreasing)

check_title_list<-dat.all.csv$Title
excl_title_list<-read.csv("excl_title_list.csv",header = F)

for (i in 1:length(excl_title_list$V1)){
  dis_list<-grep(excl_title_list$V1[i],check_title_list)
  if(length(dis_list)!=0){
    for (i in 1:length(dis_list)){
      list<-dis_list[i]
      dat.all.csv[list,]<-NA
    }
  }
}
dat.all.csv<-na.omit(dat.all.csv)
LoadLibraryで126エラーが出たとき、原因となっているファイル名を知る方法

#Error 126 (ERROR_MOD_NOT_FOUND：指定されたモジュールが見つかりません。)
LoadlibraryでDLLをダイナミックにロードする時のロード失敗です。失敗したファイル名は教えてくれません。ロードしたいDLLそのものがロードできないのなら話は簡単ですが、ターゲットDLLが別のDLLをロードしようとして失敗した場合、解決に手間取ることがしばしばあります。

#方法
LoadLibraryを使わずLibファイルをリンクしてDLLをロードするコンソールアプリケーションを作ります（暗黙的リンク）。実行するとWindowsはアプリケーション開始時にDLLロードに失敗し、失敗の原因となったDLLを表示します。DLLからDLLを呼んでいる場合も含めて失敗したファイル名を教えてくれます。

**※この方法は、**ロードするDLLのLIBファイルがあって暗黙的リンクできる**場合だけしか使えません。**
#実施例
下の例はエラーを起こすDLL内の関数"registerDLL"を呼びだしています。

```c:ConsoleApplication1.cpp
#include "stdafx.h"

void __stdcall registerDLL();

int _tmain(int argc, _TCHAR* argv[])
{
	registerDLL();
	return 0;
}
```
リンクするLibファイルの名前とディレクトリをリンカに設定して、暗黙リンクとします。

実行するとファイル名の書かれたエラーポップアップが表示されます。
![err.png](https://qiita-image-store.s3.amazonaws.com/0/112029/019f345f-46e6-eaef-214d-e6bf46b4ef98.png)
あれれ、これデバッグモードやんか！
Halideによる画像処理まとめ

#Halideでプログラミングするための入門記事
* [Halide入門とOpenCVとの比較] (https://qiita.com/fukushima1981/items/193c4ae03b2ea3b4f98e)
 * チュートリアルとOpenCVとの比較．
* [OpenCVによるHalideプログラミングの開発支援](https://qiita.com/fukushima1981/items/61e226f0c7987f9aa970)
* [Halideによるポイントオペレータの実装] (https://qiita.com/fukushima1981/items/20122ef9c711c2f59c65)
 * cast, saturating_cast, clamp, min, select
* [Halideによる2次元FIRフィルタの実装](https://qiita.com/fukushima1981/items/c17688848ad6348ad579)
 * BoundaryConditions, RDom, sum, fast_exp
* [Halideによる画像境界の取り扱い（BoundaryConditions）](https://qiita.com/fukushima1981/items/cb74323e13f3a26cb67d)
 * BoundaryConditions
* [Halideによるプログラムのパフォーマンス計測] (https://qiita.com/fukushima1981/items/c6b3d693e2d989c1f2cc)
* [HalideにおけるバッファHalide::Buffer<T>の操作（HalideとOpenCVの相互変換）](https://qiita.com/fukushima1981/items/d529c0117b226c7d82b9)
 * Buffer
 
##Todo
書く予定のもの．これだけあればだいたいかけるようになる？

* VisualStudioによるセットアップとHello world
* 拡大縮小
* 畳み込みのセパラブル実装
* ヒストグラム
* IIRフィルタ
* スケジューラーのチューニング
* Generatorインターフェイス

#日本語チュートリアル
* [Halideによる画像処理プログラミング入門 (Fixstars Corp.)](https://www.halide2fpga.com/halide_programming_tutorial/)
 * まずはここを読むと理解が深まる．非常に詳細．
* [Halideによる画像処理について(ピクシブ)](https://speakerdeck.com/saturday06/halideniyoruhua-xiang-chu-li-nituite)
 * 上記よりも手軽に読める．
* [Halide, Darkroom – 画像処理並列化のためのソフトウェア（Denso IT Laboratory）](https://tech.d-itlab.co.jp/programming/567/)
 * 出た時期が一番早かった．
* [Halide 〜画像処理を高速化する〜(Orizuru)](https://orizuru.io/blog/img-processor/halide/)
#その他日本語情報
* [Visual Studio 2015でHalideを始める](http://atkg.hatenablog.com/entry/2017/04/22/182931)
* [Halide事始め](http://nebuta.hatenablog.com/entry/2013/08/04/135932)
* [「Halide」高速な画像処理作成ためのC++組み込み型プログラミング言語](http://derivecv.tumblr.com/post/70538301269)
* [Halide勉強会](https://halide-ug.connpass.com/event/91556/)
 * 公開されている資料が参考になります．


#公式チュートリアル
* [公式](http://halide-lang.org/tutorials/tutorial_introduction.html)
 * 公式チュートリアルだけで書けるようになるのはかなり大変．
* [一部翻訳](https://gist.github.com/cia-rana/103f73cec79a4b7c36459405581f9531)

#サンプルコード
* [Fixstersによるサンプルコード](https://github.com/fixstars/Halide-elements)
最近Webサイトやアプリを使ってイラッとしたUI/UX

最近Webサイトやアプリを使っていて遭遇した、ちょっとイラっとした点をまとめました。
一ユーザーの意見というか愚痴なんですが、アプリを開発している人の参考になればと思います。

# 非同期読み込みに失敗してもわからないサイト

最近のWebサイトではデータを非同期で読み込むものが増えてきましたが、読み込み失敗時のエラーハンドリングが行われていないサイトが結構あったりします。
なかにはローディングマスクが表示されたまま操作不能になる場合もあります。

ユーザーがエンジニアであればデバッグコンソールを開いてエラーが発生していることに気づきますが、一般人はそんなことはせずに「このサイト使えねー」で終わってしまいます。

非同期読み込みではちゃんとエラーハンドリングをして、メッセージを表示するなり、リトライするなり対策しましょう。

# 非同期読み込みで位置がずれるボタン

非同期読み込みを行なっているWebサイトで、読み込み完了前後でリンクやボタンの位置がずれる事があります。

Qiitaでいうと投稿ページ右側のSNSシェアボタンとユーザープロフィールの部分です。
特にSNSボタンの部分はめまぐるしく動きます。

これのせいでユーザープロフィールと見ようとしたらフォローしてしまったりとか、ブコメ見ようとしたらPocketに保存してしまった、という事故が発生します。

位置を固定するなど、何かしら工夫がほしいところです。

# 間違いやすい投稿フィールドと検索フィールド

最近のアプリでは検索フィールドが常に表示されている画面レイアウトが定番になっています。
しかしSNSアプリでは投稿フィールドも表示されているため、間違えて検索ワードを投稿してしまうことがあります。

アプリ開発者もこの点は意識しているようで、大抵のアプリは投稿フィールドと検索フィールドの位置を離したレイアウトになっています。(検索フィールドは上部、投稿フィールドは下部というパターンが多い)

それでも、あまり使っていないアプリをたまに使った時に間違ってしまう事があります。

SNSアプリでは検索フィールドの表示はやめるなど、一般的なアプリと違うレイアウトでもいいのではないでしょうか。

# 期間限定メニューがメニューページに載っていないサイト

**2017/11/26現在の情報を元に記載しています。**

[かっぱ寿司]:https://www.kappasushi.jp/
[スシロー]:https://www.akindo-sushiro.co.jp/

例えば[かっぱ寿司]のサイトにはナビゲーションバーに「期間限定フェア」と「メニュー」があります。
「期間限定フェア」のページではキャンペーン中の期間限定メニューが載っていて、現在は「本ずわい蟹」などのメニューがあることがわかります。
しかし「メニュー」のページには期間限定メニューは載っていません。

これでは「メニュー」ページを見た人にせっかくのキャンペーンメニューが気付いてもらえない可能性があります。

```:かっぱ寿司のページ構成
- TOP
  - 期間限定フェア : 期間限定メニュー
  - メニュー      : 通常メニューのみ <- ここだけ見た人には期間限定メニューに気付かない
```

これに対して[スシロー]はどうでしょうか。

スシローもナビゲーションに「キャンペーン」と「メニュー」があり、これはかっぱ寿司と同じです。
しかしスシローのサイトでは「メニュー」のページ内のトップにキャンペーン中のメニューも載っています。
これならメニューを見た人には確実にキャンペーン中のメニューを知ってもらう事ができます。

```:スシローのページ構成
- TOP
    - キャンペーン : 期間限定メニュー
    - メニュー    : 期間限定メニュー + 通常メニュー <- ここだけ見ても期間限定メニューを知ってもらえる
```

サイトを開発・運営する立場で考えたら、ほぼ固定の通常メニューと頻繁に更新するキャンペーンメニューは別ページのほうがメンテしやすいかもしれません。
しかし、ユーザー視点で考えれば、全メニューが1箇所で確認できるほうがいいに決まってます。
こういうところはユーザー視点を第一に考えて開発するように心掛けたいですね。

# Windowsアプリ:タイトルバーの境界がわからない

Windowsではウィンドウのタイトルバーをドラッグすることでウィンドウの移動ができます。
しかし、最近のアプリではタイトルバーとその下のメニューバーなどの間に境界線がなく、ドラッグできる領域が明確にわからないものがあります。

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/35192/99c0a3aa-96e4-b086-65b9-abdd8b8e72a3.png">


上の画像でいうと、「表示」の右のエリアです。

アプリによってはこの領域でもドラッグできるように作り込んでいるので、これを見習ってほしいです。

# Slack:スレッドに新規メッセージがあっても気づきにくい

[スレッド]:https://get.slack.help/hc/ja/articles/115000769927-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B

Slackには[スレッド]という機能があって、メッセージに対する返信をグループ化して表示するようになっています。
スレッドを使うと、１つのチャネルで複数の会話が進行していても会話の流れをわかりやすい、という効果があります。

<img width="297" src="https://qiita-image-store.s3.amazonaws.com/0/35192/dab9b2f2-8c9c-f862-2a31-b18d6fb32560.png">


しかしスレッドに新しいメッセージがあっても気づきにくいという欠点もあります。

理由としては

- スレッドの返信メッセージはメインのタイムライン画面には表示されない
- スレッドをフォローしないと新規メッセージがあっても通知されない

などがあるようです。

この辺り、何かしら改善されることを期待しています。

# Windows:再起動後のアップデートが。。。

Windowsのアップデートで再起動後にアップデートが実行されてすごい時間掛かることがあります。
以前はなかったと思うのですが、Windows８あたりからこのタイプのアップデートが行われるようになりました。

朝会社に着いてPCの電源入れたらアップデートが開始されて作業できないとか、すごい殺意が湧いてきます。。。

シャットダウン前の更新処理 -> 再起動　-> 再起動後の更新処理 -> シャットダウン みたいにやってくれると嬉しいんですけどねぇ。。。
組合せ最適化で不等式を解く

Advent Calendar 21日目の記事 [組合せ最適化でひとりにしてくれを解く](https://qiita.com/SaitoTsutomu/items/727493d0437807b28c9d)
Advent Calendar 23日目の記事 [組合せ最適化で波及効果を解く](https://qiita.com/SaitoTsutomu/items/2eab3212beb3bf17ceb7)

## これなに

**不等式**を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題
* 各白マスには1からnまでの数字が1つだけ入ります
* 各横行および各縦列には同じ数字が入りません
* 連続する2つのマス目の間に不等号がある場合，それらのマス目に入る数字は不等号の示す大小関係を満たさなければいけません

下記は、左が問題で、右が答えです。この問題の解は複数あります。

![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/inequality.png)

### 入力パラメータ

`data`にヒントが入っているとします。

```py3:python
import numpy as np
from pulp import LpProblem, lpSum, lpDot, value
from ortoolpy import addvars, addbinvars
data = """\
. 1 . 3 .
         
. 3<. . .
         
.<. . . 5
V   A    
2 . . . .
    A   A
.<.<4<.>.""".splitlines()
n = (len(data)+1)//2
```

## Pythonで解く

数理モデルを作成し、解きましょう。

### 変数
* v：各位置がどの数字か (1)
* r：各位置の数字 (2)

### 制約
* $v_{ij}$は1つの数字のみ (3)
* rをvで表現 (4)
* 縦または横に同じ数字が入りません (5)
* 数字が指定されていれば、その数字になること (6)
* 不等号があれば、その関係を満たすこと (7)

```py3:python
m = LpProblem()
v = np.array(addbinvars(n, n, n)) # (1)
r = np.array(addvars(n, n)) # (2)
for i in range(n):
    for j in range(n):
        m += lpSum(v[i,j]) == 1 # (3)
        m += lpDot(range(n), v[i,j]) + 1 == r[i,j] # (4)
        m += lpSum(v[i,:,j]) == 1 # (5)
        m += lpSum(v[:,i,j]) == 1 # (5)
        c = data[i*2][j*2]
        if c.isdigit():
            m += v[i,j,int(c)-1] == 1 # (6)
for i in range(n - 1):
    for j in range(n):
        c = data[i*2+1][j*2]
        if c == 'A':
            m += r[i,j] <= r[i+1,j] - 1 # (7)
        elif c == 'V':
            m += r[i,j] >= r[i+1,j] + 1 # (7)
for i in range(n):
    for j in range(n - 1):
        c = data[i*2][j*2+1]
        if c == '<':
            m += r[i,j] <= r[i,j+1] - 1 # (7)
        elif c == '>':
            m += r[i,j] >= r[i,j+1] + 1 # (7)
m.solve()
```

### 結果の表示

```py3:python
print(np.vectorize(value)(r).astype(int))
>>>
[[5 1 2 3 4]
 [4 3 5 1 2]
 [3 4 1 2 5]
 [2 5 3 4 1]
 [1 2 4 5 3]]
```

解けていることが確認できます。

以上
組合せ最適化でひとりにしてくれを解く

Advent Calendar 20日目の記事 [組合せ最適化でビルディングを解く](https://qiita.com/SaitoTsutomu/items/251de8ae14a142ccfb3d)
Advent Calendar 22日目の記事 [組合せ最適化で不等式を解く](https://qiita.com/SaitoTsutomu/items/ed0fe93f9f765262b890)

## これなに

**ひとりにしてくれ**を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題
* 盤面に並んでいる数字のうちいくつかを黒くぬり、タテでもヨコでも同じ列に同じ数字が複数個入らないようにします
* 黒マスをタテヨコに連続したり、黒マスで盤面を分断してはいけません

![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/hitori.png)

### 入力パラメータ

`data`にヒントが入っているとします。

```py3:python
import numpy as np
from itertools import chain, product
from pulp import LpProblem, lpSum, value
from ortoolpy import addbinvars, unionfind
data = np.array([list(s) for s in """\
18626753
31118222
83247651
37583314
54467182
71432535
22834475
22314465""".splitlines()]).astype(int)
nn = len(data)
```

## Pythonで解く

数理モデルを作成し、解きましょう。

### 変数
* v：0:number, 1:black (1)

### 制約
* 黒以外の数字は縦横に重複しないこと (2)
* 黒は連続しないこと (3)
* 黒で分断しないこと (4)

```py3:python
m = LpProblem()
v = np.array(addbinvars(nn, nn)) # 0:number, 1:black (1)
for i, j in product(range(nn), range(nn)):
    for x in [v[i,:][data[i,:] == j+1], v[:,i][data[:,i] == j+1]]:
        m += lpSum(x) >= len(x)-1 # (2)
for e in chain((v[1:,:] + v[:-1,:]).flat, (v[:,1:] + v[:,:-1]).flat):
    m += e <= 1 # (3)
while True:
    m.solve()
    r = np.vectorize(value)(v)
    if unionfind.isconnected(1-r):
        break
    m += lpSum(v[r==1]) <= r.sum() - 1 # (4)
```

### 結果の表示

```py3:python
data[r==1] = 0
print(data)
>>>
[[1 8 0 2 6 7 5 3]
 [3 0 1 0 8 0 2 0]
 [8 3 2 4 7 6 0 1]
 [0 7 5 8 3 0 1 4]
 [5 4 0 6 0 1 8 2]
 [7 1 4 0 2 5 3 0]
 [2 0 8 3 4 0 7 5]
 [0 2 3 1 0 4 6 0]]
```

解けていることが確認できます。

以上
組合せ最適化でビルディングを解く

Advent Calendar 19日目の記事 [組合せ最適化で数コロを解く](https://qiita.com/SaitoTsutomu/items/3b61cf7232cfac25bff3)
Advent Calendar 21日目の記事 [組合せ最適化でひとりにしてくれを解く](https://qiita.com/SaitoTsutomu/items/727493d0437807b28c9d)

## これなに

**ビルディング**を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題
* 各数字はそのマスに立てられるビルの高さを表します。
* 各横行に同じ数字は入りません。
* 各縦列に同じ数字は入りません。
* 盤面の外側の数字はその数字の書かれている場所から盤面を眺めたときに同じ横行(または縦列)に見えるビルの数を表します。

下記は、左が問題で、右が答えです。

![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/building.png)

### 入力パラメータ

`data`にヒントが入っているとします。

```py3:python
import numpy as np
from pulp import LpProblem, lpSum, lpDot, value
from ortoolpy import addvar, addvars, addbinvars
data = """\
   33  
 ..... 
 .....5
2.....1
3.....3
 .....2
  5 13 """.splitlines()
n = len(data)-2
```

## Pythonで解く

数理モデルを作成し、解きましょう。

### 変数
* v：各位置がどの高さか (1)
* r：各位置の高さ (2)
* u：各方向別の数字のある各列ごとに  (3)

### 制約
* $v_{ij}$は、1つの高さのみ (4)
* rをvで表現 (5)
* 縦または横に同じ高さがないこと (6)
* 上下左右から見たときにuの合計が「数字-1」(すなわち、高くなるときにｕ==1とします) (7)

```py3:python
m = LpProblem()
v = np.array(addbinvars(n, n, n)) # (1)
r = np.array(addvars(n, n)) # (2)
def add(m, c, p, q, y, x):
    if not c.isdigit():
        return
    k = int(c)
    u = addvars(n-1) # (3)
    m += lpSum(u) == k - 1 # (7)
    vmx = r[p,q]
    for i in range(1,n):
        vnx = r[p + y*i][q + x*i]
        m += vmx + n * u[i-1] >= vnx + 1 # (7)
        m += vmx + 1 <= vnx + n - n * u[i-1] # (7)
        vtm = addvar()
        m += vmx <= vtm # (7)
        m += vnx <= vtm # (7)
        vmx = vtm
    m += vmx <= n # (7)
for i in range(n):
    for j in range(n):
        m += lpSum(v[i,j,:]) == 1 # (4)
        m += lpDot(range(n), v[i,j]) + 1 == r[i,j] # (5)
        m += lpSum(v[i,:,j]) == 1 # (6)
        m += lpSum(v[:,i,j]) == 1 # (6)
    add(m, data[i+1][  0],   i,   0,  0,  1)
    add(m, data[i+1][n+1],   i, n-1,  0, -1)
    add(m, data[  0][i+1],   0,   i,  1,  0)
    add(m, data[n+1][i+1], n-1,   i, -1,  0)
m.solve()
```

### 結果の表示

```py3:python
print(np.vectorize(value)(r).astype(int))
>>>
[[2 5 1 3 4]
 [5 4 3 2 1]
 [4 3 2 1 5]
 [1 2 5 4 3]
 [3 1 4 5 2]]
```

解けていることが確認できます。

以上
rgの使い方メモ

# Install

https://github.com/BurntSushi/ripgrep/releases からダウンロード

```bash:補完させるようにする
cp -a /path/to/ripgrep-0.7.1-x86_64-unknown-linux-musl/complete/rg.bash-completion /etc/bash_completion.d/
```

# Usage

```bash:再帰検索
rg [keyword] [directory(DEFAULT: ./)]
```

```bash:grep代わり
echo hogehogefugafugapiyopiyo123hogefugapiyo | rg hoge
```

```Bash:大文字小文字無視
rg -i [keyword]
```

```Bash:単語単位で検索
rg -w [keyword]
```

```bash:抽出ではなく強調だけ
echo -e "aaa\nbbb\nccc" | red bbb bbb
```

```bash:検索対象を決める
rg -g '*.py' [keyword] # Pythonファイルから検索
rg -g '!*.py' [keyword] # Pythonファイル以外から検索(!が展開されてしまうためダブルクオーテーションは使えません)
rg -tpy [keyword] # rg -g '*.py' [keyword]
rg -Tpy [keyword] # rg -g '!*.py' [keyword]
```

```bash:-tの設定追加
rg --type-add 'foo:*.{foo,foobar}' # -tfooで.fooと.foobarにマッチするようになる
```

```bash:find代わり
rg -g '*.py' --files # Pythonファイルの検索
rg --files | rg '.*\.py' # Pythonファイルの検索
```

# 応用


```bash:sed代わり

red(){ #この関数を作らないとゼロマッチの時に何も出力されない
    arg="$(cat -)"
    echo "$arg" | rg "$1" -r "$2" -C 9999999999999999999
}

echo -e "hoge\nfuga\npiyo"  | rg ".*g" -r G
# Ge
# Ga
echo -e "hoge\nfuga\npiyo"  | red ".*g" G
# Ge
# Ga
# piyo
echo hogehogefugafugapiyopiyo123hogefugapiyo | red '(h.*?e).*(p.*?o)' '$1 and $2' # "$1 and $2" とダブルクオートで囲ってしまうと$1が普通に変数として展開されてしまうのでダメ
# hoge and piyo
```
【Zsh】aliasのaliasが書きたい

# 動機

定番のalias。

```zsh
case "$OSTYPE" in
  freebsd*|darwin*)
    alias ls='ls -F -G -w';;
  linux*)
    alias ls='ls -F --color=auto';;
esac
```

共通しているオプションがあるので、下のように書きたい。

```zsh
alias ls='ls -F'

case "$OSTYPE" in
  freebsd*|darwin*)
    alias ls='ls -G -w';;
  linux*)
    alias ls='ls --color=auto';;
esac
```

しかしこれでは単にaliasを上書きしているだけなので、最初のaliasは跡形もなく消えます。

```shell-session
$ alias ls='ls -F'
$ alias ls='ls --color=auto'
$ alias ls
ls='ls --color=auto'
```

# 案1. 変数を使う

```zsh
ls=ls
ls="$ls -F"
ls="$ls --color=auto"
alias ls="$ls"
unset ls
```

愚直です。何をしているかは分かりやすいです。

# 案2. evalを使う

```zsh
alias ls=ls
eval alias $(alias ls)"' -F'"
eval alias $(alias ls)"' --color'"
```

ちょっと黒魔術的です。

## 関数化

```zsh
_alias() { echo alias $(alias $1 || echo "'$1=$1'")"'${2:gs/\'/"'\\''"/}'"; }

eval $(_alias ls ' -F')
eval $(_alias ls ' --color')
```

aliasが存在しない場合の処理やらなんやら追加したら長くなったので関数化しました。
黒魔術度が増しました。
google cloud pubsub で大量データのやり取りをしてみた

google cloud pubsubを試した。

publisherとして、10万件連番のデータを送った。結果、22件程度抜けが発生した。どこにバグが有るのかよくわからない。十分テストする必要がありそうだ。

# 追記

pub/subへのpublishをflunetdの[fluent-plugin-gcloud-pubsub-custom](https://rubygems.org/gems/fluent-plugin-gcloud-pubsub-custom)に任せた所、50万件送信中、一件の抜けもなくなった。
一旦pub/subに取り込まれたものが抜けることとは無いが、自前で、publishするときにはretryを含めた処理が必要なのだろう。


# サンプルコード

https://gist.github.com/shibacow/c625de61349dd37c641318b824b6d880

pub.py,sub.py,common.py,.envを落としてきて同じ場所に置く。
.envは環境に応じて書き換える。

```
TOPIC='[TOPIC_NAME]' <-生成したトピック名
GOOGLE_CLOUD_PROJECT='[PROJECT_ID]' <- プロジェクトID
SUBSCRIBE='[SUBSCRIBER_NAME]' <- トピックから作ったサブスクライバー
MONGO_DB='MONGO_DB_NAME' <- mongoにデータを貯めるので、mongoを入れる
JSON_KEY='PATH_TO_JSON_KEY' <- サービスアカウントのjsonキー(pubsubへの権限を与えておく)
```

# テスト方法
pub.pyでデータをpublishする。
sub.pyでそのtopicからデータを取得しmongoに入れる。
check.pyでcountが連番であるか調査する。

```shell-session
./pub.py --part 10 --size 5000
```
partはcountを複数回するのでそれを識別するためのもの。sizeは送信するメッセージの個数

```shell-session
./sub.py
```
でデータを取ってくる。

```shell-session
./check.py --part 10
```
check.pyでcountが連番になっており欠けが無いか調査する。

# テスト結果

次の番号が、一つ前の数値から1以上離れていた(つまり欠けが発生している)。

```
INFO:root:part=10 size=89989
INFO:root:13652
INFO:root:28995
INFO:root:29891
INFO:root:31986
INFO:root:33931
INFO:root:36939
INFO:root:37590
INFO:root:41001
INFO:root:46992
INFO:root:50001
INFO:root:52974
INFO:root:61001
INFO:root:66001
INFO:root:70966
INFO:root:84001
INFO:root:86001
INFO:root:88001
INFO:root:90990
INFO:root:94001
INFO:root:97001
INFO:root:99001
```
AIで競輪予想 その2

#環境準備編
以下の順番で環境設定を行っていきます。
1.AWS（EC2）にubuntuを立ち上げる
2.MySql（5.6.16-1~exp1 (Ubuntu)）のインストール
3.Pythonのインストール
4.seleniumのインストール

##3.Pythonのインストール
タイミングよく、わかりやすい記事がUPされていました。
[AWS上のUbuntu 16.04 LTSにpipやPython3.6をインストール](https://qiita.com/TKYK38/items/2a73696a9d8f1f856f68)
このとおりインストールを進めます。

##4.seleniumのインストール
こちらも参考になるページが。
[EC2 UbuntuでGoogle Chromeをヘッドレス実行してスクリーンショットを採取する手順](https://qiita.com/shinsaka/items/37436e256c813d277d6d)
このとおりインストールをしてみたいと思います。

今日はここまで。おやすみなさい。
Scalaにおけるカリー化(Currying)サンプル

# コード例

立方体の体積を計算するメソッドの例。
3辺の長さを(Int)で3つ受取り、乗算して(Int)で返却する `cubicVolume` があるとします。

### 特にカリー化を考慮しない場合  
引数を3つ定義し、呼び出しも数値を渡してやります。

```scala
scala> def cubicVolume(x: Int, y: Int, z: Int): Int = x * y * z
cubicVolume: (x: Int, y: Int, z: Int)Int

scala> cubicVolume(2, 3, 4)
res0: Int = 24
```
### カリー化を行う場合

１. 
まず、引数は`()`でバラバラに定義します。

```scala:1
scala> def cubicVolume(x: Int)(y: Int)(z: Int): Int = x * y * z
cubicVolume: (x: Int)(y: Int)(z: Int)Int
```

２. 
次に、`cubicVolume`に 第一引数の`(2)`を与え、更に後続の引数のためにプレースホルダー`_`を付けて`cubicVolume_X`に代入します。 そうすると、`val cubicVolume_X`は、「Intを受け取って、「(Int => Int)という関数」を返す関数となります。

```scala:2
scala> val cubicVolume_X = cubicVolume(2)_
cubicVolume_X: Int => (Int => Int) = $$Lambda$...
```
３.
次に、 `cubicVolume_X`に第二引数の`(3)`を与えて`cubicVolume_XY`に代入します。
そうすると、`val cubicVolume_XY`は、「Intを受け取ってIntを返す関数」となります。

```scala:3
scala> val cubicVolume_XY = cubicVolume_X(3)
cubicVolume_XY: Int => Int = $$Lambda$...
```

４.
最後に、`cubicVolume_XY`に第三引数の`(4)`を与えて`cubicVolumeResult`に代入します。
`cubicVolume_XY(4)`はなにやら処理をして、数値を返します。 何やら処理、というのは、 `x * y * z` の計算結果です。
ようやく24という数値が返ってきました。

```scala:4
scala> val cubicVolumeResult = cubicVolume_XY(4)
cubicVolumeResult: Int = 24
```

# 何が起こっているのか

カリー化を行う場合、イメージ的には以下のような処理になっているようです。

```scala
scala>   def cubicVolume(x: Int): (Int) => ((Int) => Int) = {
     | 
     |     def cubicVolume_X(y: Int): (Int) => Int = {
     | 
     |       def cubicVolume_XY(z: Int): Int = {
     |         // Intを受け取って、Intを返す
     |         return x * y * z
     |       }
     |
     |       // Intを受け取って、Intを返す関数、つまりcubicVolume_XYを返す
     |       return cubicVolume_XY _
     | 
     |     }
     |
     |     // Intを受け取って、(Int => Int)を返す関数、つまりcubicVolume_Xを返す
     |     return cubicVolume_X _
     |   }

cubicVolume: (x: Int)Int => (Int => Int)



scala> val x = cubicVolume(2)
x: Int => (Int => Int) = $$Lambda$...

scala> val xy = x(3)
xy: Int => Int = $$Lambda$...

scala> val xyz = xy(4)
xyz: Int = 24
```

# curried メソッドを使う例

Scalaにはcurriedというメソッドがあり、これは複数の引数をまとめてカリー化した関数を返してくれます。

```scala
// 先程と同じ、ごく普通のメソッド
scala> def cubicVolume(x: Int, y: Int, z: Int): Int = x * y * z
cubicVolume: (x: Int, y: Int, z: Int)Int

// メソッドを関数に
scala> val c = cubicVolume _
c: (Int, Int, Int) => Int = $$Lambda$...

// カリー化した関数を返す
scala> val cubicVolumeCurried = c.curried
cubicVolumeCurried: Int => (Int => (Int => Int)) = scala.Function3$$Lambda$...

scala> val cubicVolume_X = cubicVolumeCurried(2)
cubicVolume_X: Int => (Int => Int) = scala.Function3$$Lambda$...

scala> val cubicVolume_XY = cubicVolume_X(3)
cubicVolume_XY: Int => Int = scala.Function3$$Lambda$...

scala> val cubicVolumeResult = cubicVolume_XY(4)
cubicVolumeResult: Int = 24

```

# 参考にさせて頂きました

http://daybreaksnow.hatenablog.jp/entry/2013/10/02/185902
http://aroundthedistance.hatenadiary.jp/entry/2015/06/12/191051


※ イメージを掴むためと、理解が追いついていないため表現が厳密でない箇所があるかもしれません。
ダウンロードしたファイルの「ブロック解除」をコマンドで

* ブラウザ等でインターネットからダウンロードした実行ファイル(zip等のアーカイブ内のものも含む)は、そのままダブルクリックで実行しようとすると警告が出る。（「セキュリティの警告」や「SmartScreen」等）
* エクスプローラーでファイルのプロパティから「ブロック解除」や実行を「許可する」などのチェックをして解除する事ができる。
* この情報は「代替データストリーム」に書き込まれているため、直接編集すればコマンドライン等でも解除できる。

```ps1:確認
C:\>more < a.zip:Zone.Identifier
[ZoneTransfer]
ZoneId=3
```

```ps1:解除(空白で上書きしてるだけ)
C:\>echo.>a.zip:Zone.Identifier
```

※バッチとかで一気にできるよ、という話。（streamsコマンドとか別に無くてもOK）

参考：[Tech TIPS：Windows 10で、ダウンロードしたファイルのブロック設定を解除する - ＠IT](http://www.atmarkit.co.jp/ait/articles/1603/11/news050.html)