OmniAICreator/Qiita-1.07M huggingface dataset:
STM32F103でHIDデバイス

STM32_Arduino の bootloader を書き込むと使えるようになるUSBデバイス。実装されているのはシリアル通信のみだったが USBHID ができるようになった。キーボードやマウスを模した動作ができるようになる。

2020/03/10追記: 上記は2018年の初稿当時の状況。

# 使うライブラリ

以下のやり方を試しました。

-  arpruss版USBHID 初稿当時に実現していた方法
-  STM32_Arduino 標準のライブラリを使うやりかた。ardruss版USBHIDの機能を STM32_Arduino が取り入れたようだ。(2020/03/10追加)

# arpruss版USBHID

https://github.com/arpruss/USBHID_stm32f1

コレを見ると、MIDIやMass storageもできるとある。
夢がひろがりんぐ

上記サイトからダウンロード。今回はZIPでダウンロードした。


展開して、Arduinoスケッチを保存するところに展開する。

今回は、ポータブル環境だったので以下に展開した。

.../(ポータブル環境ディレクトリ)/hardware/Arduino_STM32-master/STM32F1/libraries


ZIPを展開すると USBHID_stm32f1-master という名前のフォルダができるが、それを USBHID_stm32f1 というフォルダ名に変更し、上記の設定になるように変更する。


```

#include <USBHID.h>

void setup() {
  USBHID_begin_with_serial(HID_KEYBOARD);
  Keyboard.begin();
}

void loop() {
 
    Keyboard.println("Hello,world.");
    delay(5000);
}

```

とすると、5秒おきに Hello,World が出力できた。

# STM32_Arduino 標準のライブラリを使うやりかた

以下のようなスケッチを書いて実行。

```

#include <USBComposite.h>
USBHID HID;
HIDKeyboard Keyboard(HID);
 
void setup() {
  HID.begin(HID_KEYBOARD_MOUSE);
  delay(2000);
}

void loop() {
  Keyboard.println("Hello!");
  delay(5000);
}
```

5秒おきにHello!が出るようになった。
Thunderbirdで選択したメッセージの最初のテキストをクリップボードにコピー

keyconfigなどのコマンドとして使う。

```javascript:
if (gFolderDisplay.selectedMessage) {
    MsgHdrToMimeMessage(gFolderDisplay.selectedMessage, null,
                        function (aMsgHdr, aMimeMessage) {
                            var getFirstPlaintext = function f(ms) {
                                for (var i = 0; i < ms.length; i++) {
                                    if (ms[i].contentType == "text/plain") {
                                        return ms[i].body;
                                    } else if (ms[i].contentType.startsWith("multipart/")) {
                                        var t = f(ms[i].parts);
                                        if (t) {
                                            return t;
                                        }
                                    }                           }
                            };
                            var t = getFirstPlaintext(aMimeMessage.parts);
                            if (t) {
                                Components.classes["@mozilla.org/widget/clipboardhelper;1"]
                                    .getService(Components.interfaces.nsIClipboardHelper)
                                    .copyString(t);
                            }
                        } );
}
```
Pardotにおける独自ドメイン設定+SSL

[Pardot](https://www.salesforce.com/jp/products/pardot/overview/)は[Salesforce](https://www.salesforce.com/jp/)が提供するマーケティングオートメーションツールです。

Pardotではフォームやランディングページなどが簡単に作成できるようになっていて、独自ドメイン[^1]も利用できます。ただし、[独自ドメイン+SSL](http://help.pardot.com/customer/ja/portal/articles/2126640-pardot-url%E3%82%92http-%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E5%8F%8A%E3%81%B3ssl%E5%AF%BE%E5%BF%9C%E3%81%AB%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88?b_id=11139)は使えないため、従来は「https://go.pardot.com 」とデフォルトのドメインを利用せざるを得ませんでした。

そんな中、2018年2月1日から対応するよ、という嬉しいニュースがありました。

https://www.pardot.com/blog/introducing-ssl-vanity-domains/
![2018-02-12_19h43_39.png](https://qiita-image-store.s3.amazonaws.com/0/47737/df390f47-70d5-0531-3ed3-940f1c4096c6.png)

2月1日以降になっても設定方法とかの情報がないのですが…トラッカードメインの検証済ドメインのメニューに「デフォルトHTTPS」というのがあるので、これをONにするだけで良さそうです。

![2018-02-09_15h52_48.png](https://qiita-image-store.s3.amazonaws.com/0/47737/411285c0-8b55-5210-0f65-bbf1e0e37466.png)

![2018-02-09_18h16_57.png](https://qiita-image-store.s3.amazonaws.com/0/47737/3b03624a-1622-ff74-4e06-6792a46f72f8.png)

実際に試してみたところHTTPSになって独自ドメイン＋SSLとなりました。SSL証明書はLet’s Encryptのものが付与されていました。上記の記事にもLet's Encrptのが付くと書いてあったので、これで問題なさそうです。

![2018-02-09_18h20_46.png](https://qiita-image-store.s3.amazonaws.com/0/47737/83e997ee-5d74-f897-4680-ed3132e4e784.png)

[^1]: Pardotでは[トラッカードメイン(Tracker Domain)](http://help.pardot.com/customer/ja/portal/articles/2128543-setting-up-tracker-subdomain-cname-)と呼ぶようです。
arduinoでPCのロック/ロック解除用デバイスを作った

# やったこと
PCのロック/ロック解除(パスワード入力)がめんどくさいのでワンタッチでロック/ロック解除できるUSBデバイスを作った。
Windows用。Arduino Microを使用。

# 仕様
- PC側にはUSBキーボードとして認識される
- 左のボタンを押すとPCのロック(Windowsキー+'L'キー押下)を行う
- 右のボタンを押すとPCのロック解除(パスワード文字列入力+エンターキー押下)を行う

# 配線図
![Untitled Sketch_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/211743/ac8f4d89-b4f5-11a7-bc06-c3c1c2b3b6e5.png)

# ソースコード
注意：
ピンモードはかならずINPUT_PULLUPにすること。
それ前提の配線にしてあるので。

``` arduino
#include "Keyboard.h"

void setup() {
  pinMode(3,INPUT_PULLUP);
  pinMode(4,INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  if (digitalRead(3) == LOW ) {
    Keyboard.print("password"); //login
    Keyboard.press(KEY_RETURN);
    Keyboard.releaseAll();
    delay(100);
    while(digitalRead(3) == LOW);
  }
  else if( digitalRead(4) == LOW) {
    Keyboard.press(KEY_LEFT_GUI); //lock
    Keyboard.press('l');
    Keyboard.releaseAll();
    delay(100);
    while(digitalRead(4) == LOW);    
  }
}
```

# 問題
当然ながら誰でもPCにログインできてしまうので、セキュリティ的にはガバガバである。
なので離席するときはこのデバイスを持ち歩かないといけない。
その内、本人確認した上でロック/ロック解除できるようにしたい。
Karabiner-ElementsでCaps Lockキーをかな/英数トグルに使用

最近のMac OSではCapsキーを使って日本語モードと英数モードの切り替えができたりするんですが，そのためには日本語IMで「ひらがな」と「英字」の両方がオンになっていないとダメだったり（日本語IMの英字モードだとウムラウトなんかがうまく入力できない）して今ひとつでしたが，Karabiner-Elementsが入力モードの判別に対応してくれたおかげで自分がやりたいことができるようになりました。

以下の設定ファイルでは，「caps lock」キーを単独で押した場合に「ひらがな」モードと「U.S.」モードの切り替え，それ以外の場合は左「control」キーとして動作するようにしています。左「control」キーは「caps lock」キーとして動作します。

また，設定ファイルの後半では，日本語入力時以外にスペースキーをシフトキーがわりに使用できるようにしています。日本語入力時「以外」としたのは，このところ日本語入力にはLacailleによる親指シフト入力を使用しているためです。

需要があるかどうかはわかりませんが，せっかくなのでここに公開しておきます。

```
{
  "title": "ひらがな-U.S.トグル",
  "rules": [
    {
      "description": "caps lockを左コントロールに（単体で押した場合には英数・かなキーを送信する）",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "left_control",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
               "key_code": "caps_lock"
            }
          ]
        },
        {
            "conditions": [
              {
                "type": "input_source_unless",
                "input_sources": [
                  {
                    "language": "ja"
                  }
                ]
              }
          ],
          "type": "basic",
          "from": {
            "key_code": "caps_lock",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "left_control"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "japanese_kana"
            }
          ]
        },
        {
            "conditions": [
              {
                "type": "input_source_if",
                "input_sources": [
                  {
                    "language": "ja"
                  }
                ]
              }
          ],
          "type": "basic",
          "from": {
            "key_code": "caps_lock",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "left_control"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "japanese_eisuu"
            }
          ]
      }
    ]
  },
  {
  "description": "日本語モード以外でスペースキーを左シフトに（単体で押した場合はスペースを送信する）",
  "manipulators": [
    {
        "conditions": [
          {
            "type": "input_source_unless",
            "input_sources": [
              {
                "language": "ja"
              }
            ]
          }
      ],
      "type": "basic",
      "from": {
        "key_code": "spacebar",
        "modifiers": {
          "optional": [
            "any"
          ]
        }
      },
      "to": [
        {
           "key_code": "left_shift"
        }
      ],
      "to_if_alone": [
        {
           "key_code": "spacebar"
        }
      ]
    }
  ]
}
  ]
}
```
[備忘録]Unity で始める C# Animationとかセーブとか

**アニメーション機能の概要**
①GOの位置などの値を徐々に変化させるパラメーターアニメーション
②スプライト画像を高速に切り替えて再生するパラパラアニメーション
③３Dモデルを関節部分で動かして歩いたり飛んだりさせるモーション

アニメーションデータを管理するファイルには、アニメーションクリップとアニメーターコントローラーの２種類がある。**アニメーションクリップ**は１つのアニメーションのデータが記録されたもので、アニメーションデータの本体通っても良い。
**アニメーターコントローラー**は複数のアニメーションクリップを管理し、タイミングに応じてGoに適用する。例えば、走る、ジャンプする、武器をふるなど。それらここのアニメーションをクリップにしておいて、アニメーターコントローラーで切り替えて使う。

アニメーションウィンドウはウィンドウタブから選択できる。
アニメーションを作成すると、自動的にクリップとコントローラーの２種類が自動で生成される。

**GO→アニメーターCO→アニメーターコントローラー→アニメーションクリップ**というつながり。

アニメーションにキーを追加するときは、プロパティの横のひし形をクリックすること。

---
クリアしたステージの情報を記録する方法
通常の変数ではプログラムを消すと情報が消えてしまうので。ファイルのように終了後も残すためにUnityでは**PlayerPrefs**という仕組みがある。これを使うと、各OSの特定の位置にデータを保存してくれる。使い方は簡単。↓

```csharp
PlayerPrefs.SetInt ("Test", 100); //Testというキーで書き込み
int v = PlayerPrefs.GetInt("Test"); //testというキーで読み出し
```
第二引数はキーがない場合のデフォルト値

---
ステージクリア後に自動的に特定の場所に戻りたい
→**Invokeメソッド**
MonoBehaviourクラスから継承している。第一引数に指定した名前のメソッドを、第２引数で指定した時間後に呼び出す、
OGP画像をテキストから自動生成するツールをGoで作った

===

題名の通りなんですが、こういう画像を作るシンプルなツールをGo (golang) で作った話になります。

パッケージ名は **text2img** としました。（[github](https://github.com/Iwark/text2img)）

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/54274/ee303992-d4f0-70bb-f859-e2b2436f8ac3.jpeg "qiita.jpg")

## 背景

[会社の技術ブログ](https://tech.sc0ville.com)に投稿する記事を書いている際、OGPに用いる画像を自動生成できたら良いなーと思い、サッと作ってみました。


## 特徴

以下のような特徴があります。

* Go製なのでWindowsでもMacでもLinuxでも、環境を選ばずに使える。
	* [github](https://github.com/Iwark/text2img/releases)でバイナリの配布をしています。
	* Goがインストールされている環境ならば`go get`でも。
* フォントサイズは、テキストが画像の幅（デフォルトではOGPの画像に最適とされる1200px）に収まるように自動調整
* 背景色・文字色は良い感じの組み合わせになるように自動選択
	* 指定することも可能

## 使い方

バイナリまたは`go get github.com/Iwark/text2img`でインストールしたら、次のように使うことができます。

```
$ text2img -fontpath="font.ttf" -output="test.jpg" -text="text2img generates the image from a text"
```

上記画像では、フリーフォントの[M+ FONTS](http://mplus-fonts.osdn.jp/about.html)さんのフォントを使用させていただいています。素敵。

## Goのコードから使う場合

[github](https://github.com/Iwark/text2img)の方にも使い方が書いてありますが、次のように使えます。


```go
package main

import (
  "image/jpeg"
  "os"

  "github.com/Iwark/text2img"
)

func main() {
  path := "fonts/font.ttf"
  d, err := text2img.NewDrawer(text2img.Params{
    FontPath: path,
  })
  checkError(err)

  img, err := d.Draw("text2img generates the image from a text")
  checkError(err)

  file, err := os.Create("test.jpg")
  checkError(err)
  defer file.Close()

  err = jpeg.Encode(file, img, &jpeg.Options{Quality: 100})
  checkError(err)
}
```


１月に[AWS LambdaがGoをサポート](https://aws.amazon.com/jp/about-aws/whats-new/2018/01/aws-lambda-supports-go/)しましたし、ブログの記事をアップした際にLambdaでタイトルを画像に変換して、自動的にS3にアップロードされるようにすると良いかなーと考えていたり、いなかったり。

良ければ、使ってみてください。
Hyperapp事始め

# Hyperappはじめました

JavaScriptライブラリです。
軽量、早い、簡単がそろったお気に入りのライブラリです:smile:
HyperappのREADMEにあるサンプルを動かすまでをやりました！
Githubにもコミットしております:tada:
https://github.com/guppy0356/hello-hyperapp

yarn + parcel + hyperappなのでよろしければcloneして動かしてみてください:smile:

# READMEにあるサンプルを動かすまで

## パッケージ
JSXを使う為にBabelが必要なのでインストール

```bash
yarn add --dev parcel-bundler babel-preset-env babel-preset-react
```

本命、Hyperappをインストール

```bash
$ yarn add hyperapp
```

## .babelrc
```
{
  "presets": ["env", "react"],
  "plugins": [["transform-react-jsx", { "pragma": "h" }]]
}
```

## index.html
```html
<!DOCTYPE html>
<html>
  <head>
      <title>Hello, Hyperapp</title>
  </head>
  <body>
      <div id="app"></div>
      <script src="index.js"></script>
  </body>
</html>
```

## index.js
```js
import { h, app } from "hyperapp"

const state = {
  count: 0
}

const actions = {
  down: () => state => ({ count: state.count - 1 }),
  up: () => state => ({ count: state.count + 1 })
}

const view = (state, actions) => (
  <main>
    <h1>{state.count}</h1>
    <button onclick={actions.down}>-</button>
    <button onclick={actions.up}>+</button>
  </main>
)

const main = app(state, actions, view, document.body)
```

## 動かしてみる
```
yarn run parcel index.html
```

# おわりに
JavaScriptあたりはかなり動きが激しいので、ついていけない著者ですがなんとか動くとこまでいけました。
難しいですが、視野が広がってチャレンジすることはいいですね:smile:
[Appium]iOSシミュレーターでテストしようとしたら"Could not get Xcode version."というエラーが表示されたときの対処

最近、Appiumに手を伸ばし、徐々にテスト実行の自動化進めています。
いろんな人にテストスクリプトを作成するきっかけを持ってもらおうと、
日々、Appiumの環境構築をお手伝いしているのですが、
ちょくちょく引っかかるエラーがあったので、対処法を残しておきます。

##今回実行した環境
OSバージョン: mac book pro 10.13.3

##現象：iOSシミュレーターでAppiumを実行するとエラーが出る 

Androidシミュレーターでは、Appiumの実行ができるところまでいっても、
iOSシミュレーターだけで動かないケースがありました。

その際に出ていたエラーがこちら。

```sh
Original error: Could not determine Xcode version: Could not get Xcode version. /Library/Developer/Info.plist does not exist on disk.
```

もちろん、Xcodeはインストールしているのですが……

ためしに、ちゃんとAppiumがiOSシミュレーターで動いているPCで以下のコマンドをたたき、Xcodeのパスを調べてみました。

```sh
$ xcode-select -print-path
/Applications/Xcode.app/Contents/Developer
```

一方、正しく動かないPCでは、全然異なるパスが表示されていました。

どうやら、Xcodeのディレクトリを変更する必要があるそうです。

##対処

以下のコマンドをたたくとディレクトリが変更されます。

```sh
$ sudo xcode-select -switch /Applications/Xcode.app
もしくは
$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
```

上記を実行後、改めてパスを調べると、正常に動作しているPCと同じパスが表示されました。

この状態でAppiumを実行するとiOSシミュレーターも自動で立ち上がりテストスクリプトが走りました。

###参考
[Appium Error: Could not get Xcode version](https://stackoverflow.com/questions/32724616/appium-error-could-not-get-xcode-version/33673511)
Cloud9からHerokuへデプロイする方法

<h1>Cloud9からHerokuへデプロイする方法</h>

<p>Cloud9上で編集したファイルをHerokuへデプロイを試みたがなかなかうまくいきませんでした。例としていくつかあげると以下かと思われますが、ご参考までに。

- ruby、gem、railsなどのバージョンがあっているか
- そもそもアプリの形になっているか（静的HTML, CSSなどのみだとうまくデプロイできません)
- DBの設定はHeroku上の設定とあっているか

これらの解決に結構時間がかかったため、最速でアプリを開発するために最適な道なのか疑問です。。。

参考<a href=https://qiita.com/jhorikawa_err/items/84a0f4a7f40f5914ad1a>
Ruby on RailsをCloud9からHerokuへデプロイするセットアップ覚書</a>
<a href=https://qiita.com/fk_2000/items/f9667bce3f435b160678#_reference-a1046e4dcbc16caf600a>Ruby on RailsをCloud9からHerokuへデプロイする</a>
RloginのChat Scriptのサンプル

# RloginのChat Scriptとは

RloginにもTeratermのTTLマクロのように、Rloginの操作の自動化や、機能を拡張するための専用の開発言語がある。

Rloginでは、ScriptとChat Scriptの2種類がある。
実行できるタイミングと、開発言語が異なり、
前者は任意のタイミングで実行でき、teratermにおけるTTLマクロのようなある程度しっかりしたプログラミング言語になっている。
Chat Scriptは対象のログイン直後にしか実行できず、受信文字列と送信文字列を指定し、指定した文字列を受信した場合に、特定の文字列を送信するというシンプルな開発言語なので、凝った操作はできない。

Chat Scriptの主な用途としてはログイン直後に別のサーバにsshでログインする、
いわゆる踏み台経由でのログインなどで使用される。

---

# Chat Scriptの導入

Chat ScriptはRloginのエントリ画面から、Chat Scriptの欄を開くと編集できるようになる。

![](http://nanno.dip.jp/softlib/man/rlogin/image210.jpg)


通常、Rloginの編集画面から編集することになるが、編集画面の使い勝手が悪く、正直面倒。


そのためRloginではテキストエディタを介して、ChatScriptを編集する機能が用意されている。

編集画面で、右クリックするとコピーと貼り付けのメニューが表示されるので、コピーを選択し、テキストエディタに貼り付けすることでができる。

テキストエディタで編集した内容を、再度Rloginに貼り付けると設定を反映することができる。
![](http://nanno.dip.jp/softlib/man/rlogin/image204.jpg)

---

# ログイン後に別のサーバにログインするサンプル

下記が、テキストエディタに貼り付けした内容になっている。

ifで指定した正規表現文字列に合致したときに、thenに指定した文字列を実行するというシンプルな作りになっている。
orは一般的なプログラミング言語におけるelse ifにあたる。

PASSWORDとLOGIN_HOSTの箇所を自分のログインしたいサーバに変更すれば、
任意のサーバに踏み台経由でログインできるようになります。

```shell
if "\[.+ ~\]# " then "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@LOGIN_HOST\r"
  if "Are you.+yes/no.+? " then "yes\r"
    if "root@.+password:.+" then "PASSWORD\r"
      if "\[root@.+]# " then "uname -a; date\r"
      fi
    fi
  or "root@.+password:.+" then "PASSWORD\r"
    if "\[root@.+]# " then "uname -a; date\r"
    fi
  or "\[root@.+]# " then "uname -a; date\r"
  fi
fi
```
Ruby on Rails 環境構築 (Mac)

macでRuby on Railsでアプリケーションを作るための環境構築を行います。以下の手順で進めます。

```
1. Homebrewのインストール
2. rbenvのインストール
3. rubyのインストール
4. Railsのインストール
5. アプリケーションの作成，Railsサーバーの起動
```

## Homebrewのインストール
HomebrewはmacOS用のパッケージを管理してくれるシステムです。まずHomebrewへのパスをbash_profileに追記して再読み込みします。

```linux-config
$ echo 'export PATH="/usr/local:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

以下のコマンドでHomebrewをインストールします。

```linux-config
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

入ったかどうかを確かめます。

```linux-config
$ brew --version
```

## rbenvのインストール
rbenvはRubyのバージョンを管理し、状況に応じてバージョンを切り替えてくれるものです。
先ほどのHomebrewを使ってインストールします。

```linux-config
$ brew install rbenv ruby-build
```

ruby-buildは`rbenv install`コマンドを提供するパッケージです。

入ったかどうか確かめます。

```linux-config
$ rbenv --version
```

rbenvへのパスを通します。

```linux-config
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

## rubyのインストール
先ほどのrbenvを使ってrubyをインストールします。まずは利用可能なrubyのリストを表示します。

```
$ rbenv install -l
```

リストの中から入れたいバージョンを指定してインストールします。

```
$ rbenv install 2.5.3
```

インストールしたrubyを確認します。

```
$ rbenv versions
> * system
>   2.5.3
```

インストールしたバージョンに切り替えます。
`global`はシステム全体に適用され、`local`は現在のディレクトリのみに適用されます。

```
$ rbenv global 2.5.3
$ rbenv local 2.5.3
$ rbenv versions
>   system
> * 2.5.3

$ ruby -v
> ruby 2.5.3
```


## Railsのインストール

```
$ gem install rails -v '5.2.0'  # バージョンを指定してインストール
```

これでRailsの開発環境が整いました。
実際にアプリケーションを作成してみましょう。

## アプリケーションの作成
Railsのアプリケーションを新規作成します

```
$ rails new myapp
```

このコマンドにより作成された`myapp`ディレクトリに移動します

```
$ cd myapp
```

ローカル(自分のPC上)でアプリケーションサーバーを立ち上げます

```
$ bin/rails s
```

ブラウザで http://localhost:3000 にアクセスしてみましょう

<img width="1285" alt="スクリーンショット 2019-06-09 16.52.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145075/98db280e-cb3c-a3d2-d21e-9f3e7e32bf34.png">

このように表示されたら成功です！
TensorflowでRNNを構築する際にValueErrorが出たときの対処法

# 環境
Windows 10
Python 3.6.2
Tensorflow 1.5.0

# エラー内容
TensorflowにてRNNを構築して、実行時に下記のエラーが出ました。

* コード

```python:error.py
n_hidden = 20
n_batch = tf.placeholder(tf.int32)
cell = tf.nn.rnn_cell.BasicRNNCell(n_hidden)
initial_state = cell.zero_state(n_batch, tf.float32)
```

* エラー

```python
ValueError: prefix tensor must be either a scalar or vector, but saw tensor: Tensor("Placeholder_2:0", dtype=int32)
```

# 対処
`zero_state`に渡している`n_batch`のshapeが未指定ということらしいです。
以下のように対処します。

```
n_batch = tf.placeholder(tf.int32, shape=[])
```

# 参考
[BasicLSTMCell zero_state() raise error in TF1.2 but works in TF1.1](https://github.com/tensorflow/tensorflow/issues/10213)
eb initで指定したプロファイルと違うアプリ/環境が表示される

結論：`~/.aws/config`のプロファイルの認証情報が、全く意図してないアプリ/環境の情報だった。

IAMで新しい認証情報を作り直して解決、非常に初歩的なミスだけど、だからこそ気づきにくいのかもしれません。

同じミスで時間を浪費して欲しくないので、（恥ずかしいけど）共有してみました。
ラズパイでPython（CUI)のプログラムを自動で起動する

ラズパイの自動起動のやり方はいくつか方法はある。
そのうちpythonのスクリプト（CUIもの）を自動で起動する方法の忘備録
pythonスクリプトは/home/pi/python.py
Raspbianのバージョンは8.0

CLI環境で行われるときは、/etc/rc.localで読み込みの最後に実行してしまうパターン

```shell:/etc/rc.local
python3 /home/pi/python.py

exit 0
```

GUI環境で行われるときは、autostartで実行してしまうパターン
１．次のフォルダに移動する
/etc/xdg/autostart　（すべてのユーザの環境下で実行する場合）
$HOME/.config/autostart　（特定のユーザの環境下で実行する場合）

２．次のファイルを作成し保存する

```shell:~/.config/autostart/python.desktop
[Desktop Entry]
Type=Application
Name=window
Exec=lxterminal -e "python3 /home/pi/python.py"

```
-bash: /dev/null: Permission denied と出たときの対策

誤操作でrm -f /dev/null などとしてしまうと、
ファイル自体は存在したままだが、ファイルのパーミッション(属性)が変更され、デバイスファイルでなくなるので、エラーが出る。

MAKEDEV で再作成してやることで、復旧する。


```shell

$ rm -rf /dev/null 

$ ls -l /dev/null 
# パーミッションの先頭がcではなく、-になっている
# cはスペシャルファイルを示し、デバイスファイルには基本的にcがつく
-rw-r--r-- 1 root root 0 Jan 24 03:57 /dev/null

# デバイスファイルの再作成を実施
$ /sbin/MAKEDEV /dev/null

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Jan 24 03:59 /dev/null
```

http://satooon.jugem.jp/?eid=6


http://server-helper.doorblog.jp/archives/5101087.html
meteorをupdateしようとしたらerrorになったときの対応

表題のとおり、meteorのversionを「1.5.2.1」から最新のversion「1.6.1」にupdateしようとしたら下記のエラーでできなかった。

```
$ meteor update
=> Errors while initializing project:         
                                              
While loading package fourseven:scss@3.13.0:
error: Command failed:
.meteor/packages/meteor-tool/.1.6.1.2kivhi++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/bin/npm
rebuild --update-binary
Cannot download
"https://github.com/sass/node-sass/releases/download/v3.13.0/darwin-x64-57_binding.node": 

HTTP error 404 Not Found

Hint: If github.com is not accessible in your location
try setting a proxy via HTTP_PROXY, e.g. 

export HTTP_PROXY=http://example.com:1234

or configure npm proxy via

npm config set proxy http://example.com:8080
gyp info it worked if it ends with ok
gyp verb cli [
'.meteor/packages/meteor-tool/.1.6.1.2kivhi++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/bin/node',
gyp verb cli
'.meteor/packages/fourseven_scss/.3.13.0.k2xwnj++os+web.browser+web.cordova/plugin.compileScssBatch.os/npm/node_modules/meteor/compileScssBatch/node_modules/node-gyp/bin/node-gyp.js',
gyp verb cli   'rebuild',
gyp verb cli   '--verbose',
.
.
.

```

meteorでsassが使えるようになるpackage「fourseven:scss」のversionを上げればerrorがなくなりました。

```
$ meteor remove fourseven:scss
$ meteor add fourseven:scss@4.5.4
$ meteor update
```

[「fourseven」のGithub](https://github.com/fourseven/meteor-scss)

おそらく「fourseven:scss」に限らず、他のpackageでも同じようなエラーになることがあるので、そのときはpackageのversionを上げてからupdateするのがいいかと。
/etc/sudoers.dのサンプル

/etc/sudoers.dに配置するファイルのサンプル。

```shell

# Substitute Userの設定
# http://www.uetyi.com/server-const/entry-304.html#where

# GGGグループのユーザはsudo実行時にrootのパスワードを指定
Defaults:%GGG runaspw

# sample
#  user1,user2,%group1  host1,host2=(change_user1,:change_group)  command1,command2
#  user1,user2,%group1  host1,host2=(change_user1,:change_group)  NOPASSWD: command1,command2
%GGG ALL=(ALL) ALL
```
rmコマンドによる誤削除を避ける方法



* chattrでディレクトリを削除できないようにする
ただし、他のファイルの削除もできなくなり、ログローテーションなど使えなってしまう

* --preserve-root オプションをつける
つけると、rm -rf /　を実行しても削除できない
/は防げるが、/*が防げない。
また、最近のLinuxでは既にデフォルト設定で有効になっている。

* rm-safeパッケージまたは、独自のシェルを作成でラッパーシェルを作る

rmを別のシェルスクリプトに替えて、実行したときに、-fを使っても必ず削除前に確認をするようにする
ただし、rmコマンド以外のfindなどでの削除に対応できない。
PHPUnit

こんなのは一々メモするほどでもないけど、公式マニュアルに沿って PHPUnit をインストールし、
使ってみたので備忘録をば。

## インストール
[公式マニュアル][a]に載っている通り、取得・権限付与・bin に移動・バージョン確認の順に実施してい
く。

```
$ wget https://phar.phpunit.de/phpunit-6.5.phar
$ chmod +x phpunit-6.5.phar
$ sudo mv phpunit-6.5.phar /usr/local/bin/phpunit
$ phpunit --version
PHPUnit 6.5.6 by Sebastian Bergmann and contributors.
```

※版数以外は公式ままです。執筆時の安定版は 6.5 だったので、6.5 をインストールしました。

次に、テスト対象のプログラムを用意します。

```php:restaurant-check.php
<?php
function restaurant_check($meal, $tax, $tip) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    return $total_amount;
}
?>
```

そして、テスターとなるプログラムを用意します。

```php:RestaurantCheckTest.php
<?php

include 'restaurant-check.php';

class RestaurantCheckTest extends \PHPUnit\Framework\TestCase {

    public function testWithTaxAndTip() {
        $meal = 100;
        $tax = 10;
        $tip = 20;
        $result = restaurant_check($meal, $tax, $tip);
        $this->assertEquals(130, $result);
    }

}
?>
```

後は、`phpunit` を実行するだけです。

```
$ phpunit RestaurantCheckTest.php
PHPUnit 6.5.6 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 179 ms, Memory: 8.00MB

OK (1 test, 1 assertion)
```

テストは成功しています。

以上。

<!-- 以下、参考 URL -->
[a]: https://phpunit.de/manual/current/ja/installation.html
VS Codeにanacondaの仮想環境の適用（Windows10）

# はじめに
Anacondaで標準インストールされているspyderが何となく使いにくいと個人的に感じた。また、なるべく言語ごとにエディタやIDEを変えたくないということで、VS Codeでpython実行環境をつくろうと思いました。

anacondaで作成した仮想環境を適用する手順の備忘録として本記事を作成します。
※ anacondaで仮想環境を作成するところは本記事から省きます。

基本的には、以下を参考にさせてもらいました。ありがとうございます。
[Visual Studio CodeをPythonの開発環境として使ってみる](http://yaju3d.hatenablog.jp/entry/2016/12/31/234931)


# 環境
* Windows10 Home 64bit
* Anaconda 4.4.0
* VS Code 1.18.1

# 本編

1. ワークスペースの作成  
適用したい仮想環境を用いるプロジェクトフォルダにワークスペースを作成する。
2. setting.jsonを編集  
f1を押して、ワークスペースの設定を開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/141505/61f7ca71-0193-7d2e-70f2-46b9f000daf4.png)

ワークスペースの設定の検索窓に以下の変数を打ち込むと出てきますので、**"python.pythonPath"**、**"python.autoComplete.extraPaths"**、**"python.linting.pylintPath"** にそれぞれ仮想環境のパスを指定します。(pylintは設定しなくてもいいかもしれません。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/141505/b7d0aa8c-a4ab-f13c-d2bf-8ccc390db521.png)

```json


	"settings": {
		"python.pythonPath": "C://Users\\hoge\\Anaconda3\\envs\\fuga\\python.exe",
		"python.autoComplete.extraPaths": [
			"C:/Users/hoge/Anaconda3/envs/fuga/Lib/site-packages"
		],
		"python.linting.pylintPath": "C:/Users/hoge/Anaconda3/envs/fuga/Scripts/pylint"
	}

```

以上で、環境ができました。これで仮想環境ごとにVSCodeで実行ができるようになりました。
新たに別のワークスペースを作るときは、ワークスペースファイルに直接記述したほうが楽ですね。
Java SE8 Silver 合格体験記

#はじめに
先日、Java SE8 Silver （正式には Java SE 8 Programmer I ）に合格しましたので、勉強内容などをメモしておきます。


#試験勉強開始前のスペック
・Ruby技術者認定試験 Silver 持ち
・昔（10年前）C言語を一通りやったことがある

Javaには触ったことがありませんでしたが、Rubyと通じるところが多く
（RubyがJavaをベースにしているのでしょうが）、
基本的な文法はすんなり頭に入ってきました。


#勉強内容
合計時間は約 40h

##試験対策
紫本（20h強）
　　三種類ある定番本のうち、唯一の解説＋練習問題形式本
　　解説３周、練習問題３周、模擬試験２周やりました。
　　実質的な試験勉強はこれ一冊のみとなります。
　　ネット上の模擬試験とかもやりたかったのですが、
　　「紫本付属の模擬試験が完璧になってから」
　　と思っていたら受験日を迎えてしまいました。

##Javaの基礎
Paiza Java 入門 + スキルチェック問題（13h）
　　目的は一通りの基礎文法の確認と軽いコーディング練習。
　　Paizaの入門講座はプログラミング初心者向けのため、
　　飛ばし飛ばしやりました。
　　　（注：追記）失念していましたが、有料会員じゃないと入門講座でも全部は見れないようです。
　　スキルチェック問題はRubyで解いたことのあるC級問題を
　　５～６問解いてみました。やはり文法をさらったくらいでは
　　コードを書けるようにはなっておらず、
　　ライブラリの調査や解いた後の復習で相当時間を使いました。
　　　　正直、試験に受かるだけならコードが書けないままでも何とかなったかもな、と思いますが、
　　　　資格を取るためだけに試験を受けるわけではないので、、、
　　
Java言語プログラミングレッスン上・下（結城浩著）（5h）
　　詳しめのJava本選びにあたってネット上で色々と調べたのですが、
　　これ、という一冊を判断できず、
　　「まぁ、数学ガール好きだし…」
　　という阿呆な理由でこの本を購入しました。
　　試験勉強本番時のリファレンス代わりに使うつもりで、
　　流し読みで済ませましたが、
　　紫本の解説でそれなりに何とかなったため、
　　開く機会がありませんでした。
　　落ち着いたらゆっくり読み直したいと思います。


#試験申し込み時
よく言及されていますが、Oracleのアカウント作りなどがかなり面倒でした。これから試験を受けようと思っている方は事前に解説サイト（[こちら](http://blog.livedoor.jp/zzzaaawwwaaa/archives/5611428.html)など）を確認しておくことをお勧めします。特に、事前に手続きをしておかないと試験結果が確認できないため、忘れないようご注意ください。


#試験本番について
　模擬試験のときも感じていましたが、コードの間違い探し問題などは一問にそれなりの労力が必要なため、解答を終えた時点（７７問解くのに90分強かかりました）でかなり疲労困憊になってしまい、見直しに集中できませんでした。体力に自信のない方は前日はちゃんと睡眠時間を確保しておいた方がよいでしょう。
　試験結果は正答率 82%で、何とか合格できました（合格ラインは 65%）。紫本の練習問題、模擬試験と同等レベルの問題が大半でしたので、一冊みっちりやれば、まぁ大丈夫かなと思います。
BeautifulSoupを利用して取得したデータの、下層の不要なタグを除去する方法

#BeautifulSoupを利用して取得したデータの、下層の不要なタグを除去する方法

BeautifulSoupを利用して取得したデータが、不要なタグまみれだというケースは多々あるかと思います。
idやclassが指定されていれば除去は大変ではないのですが、特にid、classが指定されていないページも未だに多いです。

例えばこんな場合

```python3
text = '' \
       '<div id="title">' \
           '<span>株式会社パイソンホールディングス' \
               '<span>[東京都]' \
                   '<span>(港区)</span>' \
               '</span>' \
           '</span>' \
       '</div>'
```

企業名のみ取得したいところですが、spanタグが入れ子になっていてなかなか思うようにいきません。

```python3
from bs4 import BeautifulSoup

text = '' \
       '<div id="title">' \
           '<span>株式会社パイソンホールディングス' \
               '<span>[東京都]' \
                   '<span>(港区)</span>' \
               '</span>' \
           '</span>' \
       '</div>'

bsobj = BeautifulSoup(text, 'lxml')
company_name = bsobj.find('span')

print(company_name)
# <span>株式会社パイソンホールディングス<span>[東京都]<span>(港区)</span></span></span>

print(company_name.text)
# 株式会社パイソンホールディングス[東京都](港区)

```

`.contents`を利用すると取得したタグと、下層のタグを切り分けてくれます。
ですので、`.contents[0]`を利用すれば、不要な下層タグを除去したデータを取得できます。

```python3
from bs4 import BeautifulSoup

text = '' \
       '<div id="title">' \
           '<span>株式会社パイソンホールディングス' \
               '<span>[東京都]' \
                   '<span>(港区)</span>' \
               '</span>' \
           '</span>' \
       '</div>'

bsobj = BeautifulSoup(text, 'lxml')
company_name = bsobj.find('span')

print(company_name.contents)
# ['株式会社パイソンホールディングス', <span>[東京都]<span>(港区)</span></span>]

print(company_name.contents[0])
# 株式会社パイソンホールディングス
```
VMwareのサービス自律運用機能


アプリ開発者にとってはVagrant（仮想化はVMwarePlayerではなくVirtualBox）が主流なのでしょうが、今後サービスのクラウド化にともなって運用も自動化され、アプリとインフラのエンジニアの壁はなくなり「サービス開発＆運用エンジニア」という流れになると思っています。

ということでAWS, Azureも提供しているVMwareの自律運用機能について簡単にメモしておきます。（MicrosoftはHyper-VというVMwareに対抗する仮想技術を持っているので、AzureにVMwareを載せるにあたっては微妙な言い回しをしていますが。。。）
## VMwareの4つの自律運用機能
1. VMware vMotion（仮想マシンを停止せずに別の物理サーバに移動）
2. VMware HA（物理サーバ障害時にそこで稼働していた仮想マシンを移動）
3. VMware DRS（物理サーバの負荷の偏りを仮想マシン移動によって平均化）
4. VMware DPM（負荷状況によって仮想マシンを移動して物理サーバの電源オフ＆オン）

では、ひとつずつ簡単に。
　
　
#### 1. VMware vMotion
![VMware-vMotion.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/2b94d2f2-4b70-1b5b-6ccd-f6b834a929ff.jpeg)
VMwareの物理サーバ（ESXiサーバ）上で稼働しているLinuxやWindowsなどの仮想マシンを停止せずに別の物理サーバに移動します。ネットワークをはじめサーバダウン時間はほぼゼロです。（1秒未満）
どのように実現しているかは下記のサイトが参考になりました。
http://d.hatena.ne.jp/takaochan/20080412/1207934961
これがVMware技術の土台になります。
　
　
#### 2. VMware HA（High Availability）
![vm_img04.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/7f99182c-9a18-7785-e4c6-42a586b145f4.jpeg)
いわゆるクラスタです。障害でダウンした物理サーバ上で動いていた仮想マシン群を別の物理サーバに移動させてサービスを続行させます。物理サーバがダウンした時点で当然そこで稼働していた仮想マシンもダウンしますが、すみやかに別の物理サーバ上でRebootされます。
　
　
#### 3. VMware DRS（Distributed Resource Scheduler）
![vm_img02.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/f06f564a-df66-8ef5-820f-e4b91862e866.jpeg)
ある物理マシンの負荷が他の物理マシンに比べて高い場合、負荷の原因となっている仮想マシンを別の物理マシンに移動させて物理マシンの負荷を平均化させます。仮想マシンは上記の**vMotion**を使用して稼働したまま移動するので基本的に「サービス断なし」になります。この機能は仮想マシンを起動する際にどの物理サーバで稼働させるかの判断にも使用されます。
　
　
#### 4. VMware DPM（Distributed Power Management）
![vm_img03.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/90ddf424-33c8-2db6-2516-af70777790ef.jpeg)
サービス全体の負荷状態から「物理マシン数を減らせる」と判断された場合、ある物理マシン上で稼働している仮想マシンを別の物理マシンに移動させて、空いた物理マシンを電源オフします。逆に「物理マシン数が足りない」と判断された場合は、物理マシンを電源オンしてそこに仮想マシンを移動させます。もちろん**vMotion**を使用して稼働したまま移動するので基本的に「サービス断なし」になります。
これは状況次第でクラウドサービスの課金など運用コストに大きく影響します。
　
　
## 今後のサービス運用
ということで今後の流れとして、少なくとも物理マシン切替などの作業は自動化されいわゆるオペレータは必要なくなるかもしれません。一方、上記の自律運用機能の障害発生時には「サーバしかわからない」「ネットワークしかわからない」「アプリしかわからない」というエンジニアではなく、サーバ＆ネットーワーク＆アプリすべてを把握し、かつ上記VMwareの機能にも精通したエンジニアが必要となってくるかもしれません。
　
　
## おまけ：ところで現状
ところでこれらのVMwareの機能、かなり以前から提供されていて私の現場環境でも使用可能なのでが、現状どうかというと**HAだけしか有効にしていません**。
おまけに手動による**vMotion**も事前にユーザ許可が必要ですし、やる時は結構ビクビクだったりします。つまりはまだちょっと「理屈では」「マニュアル上は」という感じで若干不安定という印象を持ってます。
ただ今後これらの技術・機能が安定してきて実例・実績が増えてくれば、ごく当たり前になってくると思います。
　
　
## もうひとつおまけ
実はもうひとつ「**VMware FT（Fault Tolerance）**」というのがあるのですが仮想サーバの移動を利用するのではなく「メモリを含めてまったく同じ状態で稼働している物理マシンを用意しておいて、障害時は瞬時にそちらに切り替える」というものです。今回の話の流れだとちょっと支流な感じがするので割愛。**VMware HA**は物理マシン障害時にいったん仮想マシン群がダウンしますが**VMware FT**は「サービス断なしのクラスタ」というイメージです。これについてはまた別の機会に。
Android開発リファレンスサイト

# リファレンス

#### 壁紙の解像度
- http://minto.tech/android-kabegami-size/

#### 背景画像の変更
- http://furudate.hatenablog.com/entry/2013/06/10/233922

#### 画像を配置する
- https://akira-watson.com/android/imageview.html
- https://akira-watson.com/android/imageview_scaletype.html
 - https://b-risk.jp/blog/2016/02/android_design/
#### TextView
- http://www.adakoda.com/android/000071.html

#### TextView行間
- https://qiita.com/endoidou/items/2cf14bd71723328401d9
- 

#### ボタンを置く

#### 下にボタンを置く
- http://www.ore-memo.com/822.html

#### 画面遷移
- https://akira-watson.com/android/activity-1.html


#### imageButtonの使い方
- http://www.programing-style.com/android/android-api/android-image-button/
- http://falco.sakura.ne.jp/tech/2012/11/android-imageview-%E3%81%A7%E7%B8%A6%E6%A8%AA%E6%AF%94%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%A6%E6%8B%A1%E5%A4%A7%E7%B8%AE%E5%B0%8F%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F/
- https://akira-watson.com/android/imagebutton.html
- https://techacademy.jp/magazine/3618
- http://y-anz-m.blogspot.jp/2010/01/android-button.html
- http://human-ook.com/tips/archives/38

#### Toast(トースト)を使う
- http://www.adakoda.com/android/000086.html

#### クリップボード
- https://qiita.com/CUTBOSS/items/97669c712449510fe7f0

#### csvファイルの読み込み
- https://qiita.com/MII-CHANG/items/94fad3a778377a18ccf5


#### GitHubとの連携
- https://dev.classmethod.jp/smartphone/android/android-studio-git-integration/



*更新情報*
- 2018/2/8 作成
- 2018/2/12 作成
GitHubPagesにGoogle Analyticsを設定

## GitHubPages を作る
ここ参照しながら作る
- https://qiita.com/tiwu_official/items/d7fb6c493ed5eb9ee4fc
- https://techacademy.jp/magazine/6445

## Google Analytics を登録
GitHubPagesを作ったら、このURLからGoogle Analytics を登録。
- https://analytics.google.com/analytics/web/provision/?authuser=0#provision/SignUp/

Googleアカウント持ってたら誰でも無料で登録できます。
## トラッキングID を作成
### 初めてGoogle Analytics登録した人

ログインした流れでトラッキングID作成までいく。
こんなページです。↓
<img width="813" alt="スクリーンショット 2018-02-12 16.34.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/119773/c45ee334-4a61-257e-310b-11e4339a71e5.png">

ウェブサイトの名前、ウェブサイトの URLを貼り付ける。

### すでにGoogle Analyticsを登録したことある人

管理 > 新しいプロパティを作成して下のボタンをクリック > 完成
<img width="173" alt="スクリーンショット 2018-02-12 16.41.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/119773/96c694ab-557d-ea70-674d-9baf1514b7a5.png">

## グローバル サイトタグ（gtag.js） を貼り付ける

作成されたグローバル サイトタグ（gtag.js）をコピーして、GitHubPagesの`<head></head>`の中の1番上にペースト。

ちゃんと`commit`して`push`しましょう。


## トラッキングのチェック

ちゃんと設定できてるかチェックしましょう。
さっきコピーしたグローバル サイトタグ（gtag.js）の少し上に、`テスト トラフィックを送信`というボタンがあるので、それをクリック。

このボタン
<img width="195" alt="スクリーンショット 2018-02-12 16.49.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/119773/8d6f298a-056c-b02b-a772-86522c2990fb.png">


そしたら、リアルタイムユーザーが1になってるはずです。
<img width="234" alt="スクリーンショット 2018-02-12 16.53.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/119773/5c13ce35-750c-d8b2-0d7f-c12baa95dcea.png">

[注意]
ユーザーのチェックは、Google Analyticsの左側のレポートのリアルタイムで見てください
ASCII, S-JIS, UTF-8

# ASCII
- 半角英数を1Byte(8bit)で表現
    - 実際は、7bitしか利用していない
- 代表的なコード

| 文字 | コード(16進数) | 備考 |
|:--:|:--:|:--:|
|LF|0A|Unix系の改行
|CR|0D|windowsの改行(CRLF)
|SP|20|空白
|0|30|
|\|5C|**文字化けの原因**
|a|61|
|DEL|7F|ASCII最大コード

# S-JIS
- ASCIIを拡張している
    - 半角英数のみを見るとASCIIと同じ文字コードとなる
- 半角カナは1Byte
    - ASCIIと被らないように8bit目を利用している
- 漢字は2Byte
    - 1Byte目は、ASCIIと半角カナと被らないコードを利用
    - 2Byte目は、ASCIIと半角カナと被ることもある
        - この仕様が、文字化けの原因となる。
- 文字化け
    - /がエスケープ文字の意味を持つ言語で、2Byte目が/の漢字を利用した場合、/が消えてしまう。
        - 例：「申」「十」「表」

# UTF-8
- ASCIIを拡張している
    - 半角英数のみを見るとASCIIと同じ文字コードとなる
- S-JISの文字化け対策
    - 漢字の2Byte目が、ASCIIと半角カナと被らないコードを利用しているため、/による文字化けはおこらない
Slackの絵文字アンケートを初期化するbotをGASで作った話

Slackでアンケートを実施しようと思った場合、Pollyなど便利なものもありますが素朴に[絵文字でリアクションする](https://get.slack.help/hc/ja/articles/206870317-%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%A7%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%99%E3%82%8B)多いと思います。

こんなときアンケート文章を書いた人が絵文字を1票ずつ用意することが私の周りではよく見かけられます。
しかしそうすると用意した人自身は投票に参加できない不便があると思い、文章中に絵文字があると1票ずつ投票して初期化をしてくれるbotを作りました。


#使ったもの
・Google Apps Script (GAS)
・Outgoing WebHooks
・Bots

#実装手順


##Slack App
まずはSlack AppのBotsとOutgoing WebHooksを
https://washilabo.slack.com/apps
から検索し導入しましょう。
その後 https://[チーム名].slack.com/apps/manage/custom-integrations からそれぞれ設定します。

###Bots
- API Token:

ここに表示されている文字列を後で作成するGASのソースコード中の `'XXXXXXXXXXXXXXXXXXXXXXXX'` 部分にコピペします。

- Customize Name:
- Customize Icon:
- Full Name:

これらは、Slack上で表示されるものなので必要に応じて適宜設定しましょう。

このBotが絵文字に投票して初期化してくれます。

###Outgoing WebHooks
- Channel:　Anyとすることで全てのチャンネルを対象にできます。
- Trigger Word(s): このBotを利用するとき文章に含めるキーワード。ここでは仮に `:question` とします
- URL(s):　ここに後でGAS公開時に表示されるURLをコピペしましょう。
- Token:　ここに表示されている文字列を後で作成するGASのソースコード中の `'YYYYYYYYYYYYYY'` 部分にコピペします。

指定したChannelでTrigger Word(s)が含まれた文字列が入力されるとそのメッセージ情報がURL(s)先のGASにTokenと共に送信されます。

##GAS
次に新しくGASファイルを作成しましょう。
詳しい説明は割愛しますがGoogle Driveのページから[新規]→[その他]から作成することができます。
作成したら以下のコードを貼り付けましょう。

```javascript
function addReaction(channelId,timestamp, emoji) {
  var url = 'https://slack.com/api/reactions.add';
  var TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXX';// botsのTOKEN
  UrlFetchApp.fetch(url, {
    "method" : "post",
    "payload" : {
      token: TOKEN,
      channel: channelId,
      timestamp: timestamp,
      name: emoji
    }
  });
}

// doPostが自動的に呼ばれます。eがSlackから送られてきたメッセージ情報になります。
function doPost(e) {
  var WEBHOOKS_TOKEN = "YYYYYYYYYYYYYY";// Outgoing WebHooksのTOKEN

　// URLさえわかるとこのスクリプトにアクセスできてしまうが
  // このTOKENが一致するかどうかで自分のSlackからのアクセスか判断できる。
  if (WEBHOOKS_TOKEN != e.parameter.token) {
    return;
  }
    
  var channelId = e.parameter.channel_id;
  var timestamp = e.parameter.timestamp;
  var text = e.parameter.text.substr(1); // トリガー文字列を除去しておく
  var reg = /\:["']?([a-zA-Z0-9_\-]+)["']?\:/g; // :XXXX: :YYY: などコロンで囲われた絵文字文字列を抽出する正規表現
  while ((m = reg.exec(text)) != null) {
    addReaction(channelId, timestamp, m[1]);
  }
}
```
その後、[公開]→[ウェブアプリケーションとして公開]を選び、
[アプリケーションにアクセスできるユーザー]で[全員(匿名ユーザーを含む)] を選びます。
[導入]を押すと公開が完了し、URLが表示されます。
このURLをOutgoing WebHooksの設定のURL(s)にコピペして更新しましょう。


その後、Slack上の任意のチャンネルで
`:question みなさん :one: :two: :three: のどれかに投票してください。` のように書いてみましょう。
数秒以内に導入したBotが
:one: :two: :three: に投票して初期化してくれるはずです。
ディレクトリ内のテキストファイルの改行コードをLFに統一（nkfコマンド）

こんにちは
[nkf](https://osdn.net/projects/nkf/) コマンドを使ってディレクトリ内のファイルの改行コードを```LF```に統一しました（文字コードも）。

* 誤動作していたコマンドも正常に動くようになりました（diff など）。

```console
$ nkf --guess * | grep -e MIXED\ NL -e CR | awk -F: '{print $1}' | xargs nkf -Lu -d --overwrite
$ nkf --guess * | grep -e EUC-JP -e Shift_JIS | awk -F: '{print $1}' | xargs nkf -Lu --overwrite
$ nkf --guess * | awk '{$1=""; print $0}' | sort | uniq
 ASCII
 ASCII (LF)
 BINARY
 UTF-8 (LF)
```
Cordovaプロジェクトの作成・実行のメモ

Cordovaのプロジェクトを作成していきます。
iOSとAndroidの実行環境を整備します。

##①Cordovaプロジェクトを作成する

http://cordova.apache.org/docs/en/latest/reference/cordova-cli/index.html#cordova-create-command を参考にしてプロジェクトを作成していきます。

**CordovaPJの作成**
Cordovaのプロジェクトを作成します。
まず、Terminalからプロジェクトを作成したい箇所に移動して、以下のコマンドを実施します。

```
$ cordova create path [id [name [config]]] [options]
```

→Creatig a new cordova project.
　と出力され、フォルダが作成されます。

**プラットフォームの追加**
作成したCordovaプロジェクトに移動し、iOSとAndroidのプラットフォームを追加します。
iOSのプラットフォームの追加は以下のコマンドを実施します。

```
$ cordova platform add ios
```

Androidのプラットフォームの追加は以下のコマンドを実施します。

```
$ cordova platform add android[@version]
```

今回は以下を入力しています。

```
$ cordova platform add android@7.0.0
```

##②iOSでの確認

iOSのエミュレータを起動して確認をします。
プロジェクトをビルドするためには、XCodeが必要となります。

**コマンドライン用のXCodeをインストール**
コマンドライン用のXCodeをインストールするために以下のコマンドを実施します。

```
$ xcode-select --install
```

また、コマンドラインでXCodeのライセンスに同意するために、以下を入力します。

```
$ sudo xcodebuild -license
```

いろいろ聞かれますが、同意して下さい。

補足）初回ビルドの際、XCodeのコンポーネントがインストールされていませんでしたので、XCodeを起動し、コンポーネントをインストールしました。

**エミュレータによる確認をする**
iOSのエミュレータを起動し、動作確認をします。

```
$ cordova emulate ios
```

##③Androidでの確認

Androidのエミュレータを起動して確認をします。
homebrewを使用します。

**JDKのインストール**
homebrewでJDKをインストールします。

```
$ brew cask install java
```

最新のJDKでないものが欲しい場合は、caskroomのバージョンを確認し、インストールします。
例を以下に記載します。

```
$ brew tap caskroom/versions
```

**JDK7のインストール**

```
$ brew cask install caskroom/versions/zulu7
```

補足）前までは「brew cask install java7」でインストールできましたが、JDKのダウンロードにOracleのアカウントが必要になったあたりか使えなくなったみたいです。

パスの設定は忘れずに実施して下さい。

**AndroidStudioのインストール**
AndroidStudioをインストールします。
こちらもパスの設定は忘れずに実施します。

```
$ brew cask install android-studio
```

**エミュレータによる確認**
AVDを指定してエミュレータを起動します。

```
$ cordova emulate android
```

補足）私の環境だと権限の関係でエラーとなりました。そのため、以下のコマンドを実施してから再度、ビルド→エミュレートしました。

```
$ chmod +x /cordovaプロジェクト名/platforms/android/gradlew
```

一旦、これでiOSとAndroidでの動作環境ができました。
IBM Cloudを使いこなすために役立つslackコミュニティまとめ

# IBM Cloud を使いこなすために役立つslackコミュニティまとめ
今年思い起こせば初投稿です。
2017年、飛び込んでしまえっ！と勢いでノミネートしたIBM Champion cloudが、
評価頂き、2018 IBM Champion cloudに任命いただきました。

IBM Championについてはもう少しまとめたものを後日公開したいと思います。

ここ最近IBM Cloud周りのユーザーコミュニティそして、IBM自身がコミュニティとしてもつslack workspace（コミュニティという表現で本記事は書きます）が非常に多くなってきました。
日本語で質問できるところはまだ多くないのですが、
watson language translatorやgoogle翻訳などをつかってチャレンジしてみてはいかがでしょう。

英語力に全く自身の無い私にも親切に回答いただいて、涙出て来そうになるくらいです。
(IBMの中の人と直接話せる、改善につながる！）

公式で持っているコミュニティについてはIBMのホームページに「Join Slack Community」としてあるリンクを元に転載しています。
※ここからのリンクで問題ある場合はご指摘いただければ訂正／取り下げ致します。

## 日本語QAで困ったらまずここへ。
### BMXUG Slack
BMXUG (Bluemix User Group)、現IBM cloudのユーザー会です。
generalや個別のトピックでチャンネルがあるので質問してみてください。
IBM Champion cloudの32名のうち大半がここに集結してますので、
何かヒントが得られるかもしれません。

BMXUG Slack
https://goo.gl/forms/sa8eHJLD6KlmD5sV2

### Node-RED 日本ユーザー会 slack
Node-RED日本ユーザー会の運営メンバー主宰slackで、
generalなどで活発に活動されています。

IBM Champion cloudのメンバーや、IBMerの方もいらして
日本語でも安心して回答いただけてます。
ドキュメントの日本語化プロジェクトもあり（最近私は活動できてないのですが・・・）、
ユーザー会サイトの日本語ドキュメントはここから生まれています。

Node-RED 日本ユーザー会 slack
https://nodered-slack.herokuapp.com/

## 英語コミュニティだけど、チャレンジ！
### Node-RED 本家slack
Node-REDの英語コミュニティです。
今年に入って日本語チャンネルがユーザー会有志で作成され、
開発コミュニティとの連携をますます期待してます。

Node-RED 
https://nodered.org/slack

### OpenWhisk Community
OpenWhiskの開発コミュニティで、IBMerもたくさん。

Apache FOUNDATIONのprojectとなってからは
さまざまなプラットフォームの方が参加しています。

もちろん、IBM Cloud Functionの問い合わせもコチラでできます。
https://openwhisk.apache.org/slack.html

## IBM 公式　（英語だけど、チャレンジ！！）
英語力が不安な僕でも翻訳アプリを使いながら１つ１つ聞いていくと、
丁寧に返答していただけます。根気よくチャレンジしてみてはいかがでしょう！？

### IBM Cloud Container Service
私はkubernets関連の利用が多いのでもっぱらここで良く聞いています。
Ticketよりも早く、Kubernetesのドキュメントを書かれている方をはじめ、
開発者などが参加していて、直接回答いただいています。

Webをよーくよーく見れば書いてあった、なんていう情けない話でも
快く答えていただけて、感謝感謝です。

Containers @ IBM
https://bxcs-slack-invite.mybluemix.net/

### IBM Watson Developer Community
Watson全般の開発者が集うコミュニティです。
日本人の参加者のお名前と思わしき方も数名見受けます。

まだまだwatson初心者の私は質問よりもwebinarsチャンネルのROMが多いですね。

Watson Developer Community
http://wdc-slack-inviter.mybluemix.net

### IBM Cloud Developer Console for Apple
IBM Cloud + iOSな方の開発コミュニティ
Swift言語+Watson CoreMLなどを始めたiOSアプリの開発はこちら

Swift@IBM
https://swift-at-ibm-slack.mybluemix.net

### IBM Cloud DevOps 
Dev Ops / CI/CD ToolChainの話題はコチラ

https://ic-devops-slack-invite.us-south.devops.cloud.ibm.com/

# まとめ
個人で入っているIBM Cloud関連のworkspaceだけでも6ワークスペースありました。
日本語で扱えるチャンネルもありますが、英語のチャンネルもたくさんあります。
英語の苦手な方でも、チャレンジしてみると答えが帰ってくるかもしれません。

IBM Cloudでの「こまった」から「出来た！」へ変わる１つのきっかけになってもらえれば幸いです。

また「こんなのあるよ」という情報おまちしています！
HW-01FのSIMロック解除 by macOS

# 0. 概要
この記事は、 Mac で HW-01F の SIM ロックを解除する際の試行錯誤を書いたものです。
実際には、手持ちの HW-01F は既に SIM ロック解除済だったので、AT コマンドで SIM ロックの状態を取得しただけで終わりました。
Mac から HW-01F に接続する際、いろいろ躓いたので情報共有します。

# 1. HW-01Fへの接続
まずは、MacのUSBポートにHW-01Fを接続して、ターミナルを起動。`ls`コマンドでデバイスを検索。

```sh
MacBook-Air:~ user01$ ls /dev/ttyUSB*
ls: /dev/ttyUSB*: No such file or directory
MacBook-Air:~ user01$ 
```
んん？デバイスが存在しない？？？
どうやら「ttyUSB*」という名前はLinuxのデバイスで使われるもので、Macでは「tty.*」という名前が使われるらしい。
気を取り直して、再度デバイスを確認。

```sh
MacBook-Air:~ user01$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port	/dev/tty.MyiPhone6s-WirelessiAP #
MacBook-Air:~ user01$ 
```
やっぱりない...ドライバが無いからかな？と思い、Google先生に聞いてみると[Docomo](https://www.nttdocomo.co.jp/support/utilization/application/xi/com_set/driver/card/hw01f/index.html)のサイトで発見。
しかし、最新の macOS (10.13.3, 2018/02/11時点) 用ドライバがない。Huaweiのサイトにも macOS 10.13.3 用ドライバは見つからず...しょうがないので、Docomoが公開している macOS 10.12 版をインストールすると...

```sh
MacBook-Air:~ user01$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port	/dev/tty.MyiPhone6s-WirelessiAP
/dev/tty.HUAWEIMobile-Pcui
MacBook-Air:~ user01$ screen /dev/tty.HUAWEIMobile-Pcui
```
無事に`tty.HUAWEIMobile-Pcui`が出てきた！

# 2. HW-01FのSIMロック解除

早速、`screen`コマンドで HW-01F(tty.HUAWEIMobile-Pcui) に接続してみると、

```
MacBook-Air:~ user01$ screen /dev/tty.HUAWEIMobile-Pcui

^RSSI:27

^HCSQ:"LTE",63,58,166,30

^RSSI:27

^HCSQ:"LTE",63,58,166,30
```

なんか変な文字列が3秒ごとに出力される....
どうも出力されている RSSI という文字列は、受信信号強度（RSSI:Received Signal Strength Indication, Received Signal Strength Indicator）の略で、HCSQ列に表示されている内容は「Signal, RSSI, RSSP, SINR, RSRQ」の情報らしい...どちらもルータの電波状況っぽいので今は気にしない。
気を取り直して、SIMロック解除用のATコマンドを実行してみると

```sh
MacBook-Air: user01$ screen /dev/tty.HUAWEIMobile-Pcui

at[Enter]
OK

AT^CARDLOCK?[Enter]
CARDLOCK: 2,10,0
OK
```
1行目は、ATコマンドの動作確認、2行目はCARDLOCKコマンドでSIMロックの状態を表示している。CARDLOCKコマンドの出力結果の意味を調べてみると...
>
AT^CARDLOCK
Usage :
-> AT^CARDLOCK? give information like this :
^CARDLOCK: 1,10,0 ………… locked,10 is your lock counter
^CARDLOCK: 2,10,0 ………… unlocked

すでに、SIMロック解除済みやん！！！
ということで、`Ctl+a, k, y`でコンソールを kill して、今回のSIMロック解除の旅は終わりました。

# 3. 感想
今回の作業では、SIMロック解除作業よりも、ATコマンドの準備/理解の方が大変だった。
ATコマンドが使いたくなれば、DC-unlockerというツールを使っても良いのかもしれない。


# 4. 参考にしたリンク様
- HW-01FのSIMロック解除について
 - [HW-01FのSIMロック解除](http://tenerapc.sblo.jp/article/179676484.html)
 - [自力でSIMロック解除成功! (Aプランでも使用可)
](https://king.mineo.jp/my/denjin/reviews/item/28770)
 - [イーモバイル D02HW SIM ロック解除](https://www.500yen.com/archives/215) 
- ATコマンドの解説
 - [SORACOM を使って学ぶ AT コマンド - 1.入門編](http://bearmini.hatenablog.com/entry/at-command1)
 - [SORACOM を使って学ぶ AT コマンド - 2. 準備編](http://bearmini.hatenablog.com/entry/at-command2)
 - [L-02Cを最初からUSBモデムで認識させる／手動でAPN登録する](http://trtr.hatenablog.jp/entry/2014/11/27/011913)
 - [MacのTerminalでCOMポート通信](https://qiita.com/k-yamada-github/items/c12bafc64f9868f8c85c)
 - [【シリアル接続】Mac でシリアルコンソールを利用してみた](https://qiita.com/kobaboy/items/2e15805cf485de3ddf79)
SystemConfigurationフレームワークを使ってMACアドレスを取得する

MACアドレスを取得する方法には、いろいろな方法がありますが、今回はmacOSのSystemConfigurationフレームワークを使って取得する方法を試してみました。
なお、iOSでは現在はMACアドレスを取得することができないようになっているので、この方法も使えません。

## 手順

SystemConfigurationフレームワークを使って取得するには、次のような手順を踏みます。

1. `SCNetworkServiceCopyAll`関数を使って`SCNetworkServiceCopyAll`の配列を取得する。
2. `SCNetworkServiceGetEnabled`関数を使って有効かどうかを判定する。無効なときはパス。
3. `SCNetworkServiceGetInterface`関数を`SCNetworkInterface`を取得する。
4. `SCNetworkInterfaceGetHardwareAddressString`関数を使ってMACアドレスを取得する。
5. BSDネーム（「en0」とか）が必要なときは、`SCNetworkInterfaceGetBSDName`関数で取得する。

途中ループがあって、回りくどいのですが、SystemConfigurationフレームワークがなかった頃に使っていたIOKitを使った方法よりもシンプルなコードになります。

## コード例

```swift
import Foundation
import SystemConfiguration

func printMACAddress() {
    let processName = ProcessInfo.processInfo.processName
    guard let pref = SCPreferencesCreate(kCFAllocatorDefault, processName as CFString, nil) else {
        print("ERROR: Failed to create the SCPreferences object")
        return
    }
    
    guard let netServices = SCNetworkServiceCopyAll(pref) as? [SCNetworkService] else {
        print("ERROR: Failed to obtain network services")
        return
    }

    // 有効なサービスの名前、インターフェイスのBSDネームとMACアドレスを出力する
    for netService in netServices {
        if SCNetworkServiceGetEnabled(netService) {
            if let netInf = SCNetworkServiceGetInterface(netService) {
                var serviceName = SCNetworkServiceGetName(netService)
                var bsdName = SCNetworkInterfaceGetBSDName(netInf)
                var hwAddr = SCNetworkInterfaceGetHardwareAddressString(netInf)
                
                print("\(serviceName): \(bsdName), \(hwAddr)")
            }
        }
    }
}

printMACAddress()
```

## 他の方法

他にも次のような方法でもできました。

* `sysctl`関数を使った方法
* ソケットを使った方法
* IOKitを使った方法
ASP.NET Core 2.0でのTwitter認証とAccessTokenとAccessTokenSecretの取得

調べてもネット上に情報がなかったのでメモ...((φ(￣ー￣〃)ﾉ□、 ﾒﾓﾒﾓ♪

ASP.NET Core 2.0でのTwitter認証は基本的にASP.NET Identityを使うのが楽で

https://github.com/aspnet/Docs/blob/master/aspnetcore/security/authentication/social/twitter-logins.md

この通りで、MSのサンプルプログラムもあるので悩ま無いのだけど

例えば認証時に認証ユーザのAccessToken/AccessTokenSecretを取得したいような場合には

ツイッター認証の設定時にTwitterOption.EventsOnCreatingTicketにFuncを設定して

```csharp

 services.AddAuthentication().AddTwitter(twitterOptions =>
            {
                twitterOptions.ConsumerKey = Configuration["Authentication:Twitter:ConsumerKey"];
                twitterOptions.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"];
                twitterOptions.Events.OnCreatingTicket = async context =>
                {
                    var identity = (ClaimsIdentity)context.Principal.Identity;
                    identity.AddClaim(new Claim(nameof(context.AccessToken), context.AccessToken));
                    identity.AddClaim(new Claim(nameof(context.AccessTokenSecret), context.AccessTokenSecret));
                };
            });
```

このようにしてIdentityのClaimを追加して

OAuthのコールバックを受け取るActionで

```csharp

ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
var accessToken = info.Principal.Claims.FirstOrDefault(x=> x.Type == "AccessToken")?.Value;
var accessSecret = info.Principal.Claims.FirstOrDefault(x => x.Type == "AccessTokenSecret")?.Value;

```

こんな感じで取得できます。
SVM多クラス分類モデルの精度を上げる方法

#この文書の主旨
この文書は、サポートベクターマシンを用いた多クラス分類モデルの精度を向上させ方について、筆者が試行錯誤した内容をメモしたものです。特定のライブラリや問題に依存するノウハウではなく、広く汎用的なノウハウを共有したいと考えています。

内容については、筆者の経験に依存しているので、必ずしも一般化できるものではないかも知れません。同じことについて試行錯誤している方に読んでいただき、ノウハウを共有したいと考えています。本文書で言及していない良いアイデアがあればコメント欄にて教えて下さい。

#学習用データ
###データ量
モデルの構築に使用する学習データの量とモデルの精度は、概ね比例の関係にあります。モデルの精度を向上させる上で、学習データの追加は手堅いアプローチのひとつです。

###特徴量の選択
ヒトの発想を元に様々な特徴量を用意してモデルを構築するのも良いですが、手に入る全ての特徴量をインプットしてみて結果を観察するほうが、手早く精度の良いモデルが出来ると思います。

###学習データの種類
学習データの追加によって、モデルの精度向上を目指す上では、どのような学習データを追加するかも重要になります。追加する際は、モデルが誤答したデータを優先しましょう。正答したデータのみを追加した場合、交差検定では精度が向上する一方で、未知データに対する汎化性能が落ちる場合があります。注意しましょう。

#評価用データ
###クラスの分布
予測の対象となるデータにおいて、クラスがどのように分布になっているかを把握しましょう。また、学習データセットは、その分布に近いものを用意しましょう。例えば、裏か表かを予測する二値分類モデルを作る際に、予測の対象となるデータセットにおいて、裏３：表７の分布になっていることが明らかな場合、学習データセットもそれと同じ分布にしましょう。

#パラメータ決定
###交差検定と汎化性能
交差検定で得られた精度と、未知データの精度において精度の差が出ることが往々にしてあります。この誤差は小さくする方法として、学習データ量を多くすることが有効なアプローチのひとつです。