OmniAICreator/Qiita-1.07M huggingface dataset:
iMacrosでWebページの操作を自動化する

お疲れ様です！
GMOリサーチの石黒です！

システムを運用していると、Webページ上で繰り返し作業を行ないたいことがあります。

そんな時、Webページの操作をマクロ化できる、
便利なアドオンがありましたのでご紹介します。

---
#iMacrosを追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/404b654f-8d83-e8bf-6e6a-ba0ec15bac04.png)

firefoxのアドオンから探せます。
（現在のリンクはこちら：https://addons.mozilla.org/ja/firefox/addon/imacros-for-firefox/）

---

#iMacrosの使い方
---

##iMacrosの起動画面とテスト用サイト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/de5d6331-35f2-bd18-e856-8ed503a7cb72.png)
上図の右側はCakePHP3でbakeしたテスト用のサイトです。
iMacrosを起動すると上図の左側ように、サイドバーが表示されます。

---
##サイドバーの Rec タブを選択して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/85eea80f-3a34-ee54-80a6-4cf8299b8c71.png)

---
##Record スタート！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/d58ed4c6-9044-84a7-024a-8826a2779622.png)

新規登録操作を手動で実行し Record します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/2a7de73e-d5cc-ec4f-b244-2934f56f8373.png)

---
##Record 完了！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/57f83838-af79-671b-d4b3-758102e5e8fc.png)

Stopボタンを押して完了させます。

---
##Play
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/35d2e747-6d92-dd04-8b3c-f497b535a95a.png)

Play ボタンで実行！１件登録完了しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/796d5f31-58ab-86f1-7a55-36e50cd9edf5.png)
Play(Loop)というボタンで、[Max]回実行できます。
３件登録完了しました。

---
##Macroを保存
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/81a0566e-2d9b-49aa-86df-8e9a62e4de49.png)
作成したMacroには、名前をつけて保存できます。

---
##Macroを編集
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103853/c97dba35-4c6a-10e9-f28a-6e6a39bc9e54.png)
作成したMacroは編集することができます

---
#コマンド一覧
Macroを編集するときに使えるコマンドです。
http://wiki.imacros.net/Command_Reference

---
#まとめ
- 自動化できない作業の暫定対応として、使用してみてはいかがでしょうか
- Chrome版、IE版もあるらしいのですが、Chrome版は安定してなかったので、Firefox版がオススメです。
クリップボードの履歴をdmenuで補完して貼り付け

履歴機能を提供するソフトウェアはあるが、検索できないのとカスタマイズ性に優れていないので、下記のコマンドを作成した。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/103885/6826ad21-cf00-9cc9-1935-61f798bdbf8c.gif)

```bash:~/bin/save-xclip-history
#!/bin/bash

save(){
    local content="$1"
    (echo "$content" | file - | grep -q text) || return
    if ! grep -q -F -x -e "$content" ~/.xclip-history; then
        echo "$content" >> ~/.xclip-history
    fi
}
while true; do
    save "$(xclip -o -selection clipboard)"
    save "$(xclip -o -selection primary)"
    sleep 1
done
```

```bash:~/bin/dmenu_paste
#!/bin/bash

xdotool type -- "$(cat ~/.xclip-history | tac | dmenu -b -l 15 -p '>')"
```

`.xinitrc` に `save-xclip-history &` と書いておけば、自動で保存される。

呼び出しは、任意のキーに割り当てる。 awesome ではこんな感じ。

```lua:~/.config/awesome/rc.lua
    awful.key({ modkey,           }, "v", function () awful.util.spawn("dmenu_paste") end),
```
Windowsアプリケーション開発でWindows7関連で困ったこと

Windowsアプリケーションを作成したが、Windows7だけ想定の動きをしてくれず、大変困りました。
その時の覚書きです。

## 前提条件
- visual studio 2015で開発
- 言語はC#
- Windows フォームアプリケーション
- 対象OS
       - Windows7
       - Windows8
       - Windows10
- 確認環境
       - Windows7（modern.ie)
       - Windows8.1(modern.ie)
       - Windows10(実端末）

## Windowsアプリの内容
Windowsアプリ内でコマンド（schtasks）を実行し、タスクスケジューラにタスクを登録/削除/クエリしている

## 困ったこと
### 1.権限の問題
**問題**
schtasks /delete コマンドが実行エラーになる。

**原因**
Windows7端末だけ管理者権限が必要。

**対処内容**
アプリケーションの実行時、管理者に昇格（requiredAdministrator）して実行するよう変更する。

```app.manufest
<requestedExecutionLevel level = "requireAdministrator" uiAccess="false" />
```

### 2.コマンド差異の問題
**問題**
schtasks /query /tn "タスク名" /v /fo csv /nh がエラーとなる。
> エラー： /NH スイッチは LIST形式では使用できません

**原因**
Windows7だけ、CSV形式で/nhオプションが使えない。（どうしてかは不明）

**対処内容**
/nhオプションを外し、１行目を読み飛ばすことで対応

### 3.言語環境の問題
**問題**
日本語のタスク名が????に文字化けする
**原因**
コマンドプロンプトの言語コードがIBM437になっているため。(chcpで確認)
ただし、これは仮想マシン固有の問題かもしれない。（未確認）
**対処内容**
言語コードを932(Shift-jis)に変更してもInvalid code pageのエラーとなり変更ができなかった。
そこで以下２つを実行。

(1) まずは、こちらの記事を参考に日本語環境を設定する。
「[modern.IEのWindows 7で日本語の表示と入力をできるようにする](http://qiita.com/hnakamur/items/5f2f9e817dd0de60abb2)」
(2) 次に、システムロケールを英語から日本語へ変更する。
「[Windows7でcmd.exeを日本語化させる]
(http://sugamasao.hatenablog.com/entry/20120103/1325605600)」

この段階でchcpを実行すると、無事932になっていた！
SPA

SPA
===


SPA(Single Page Application)とは
-------------------------

* 単一ページによるWebアプリケーション
* ページはDOM(Document Object Model)の操作により切り替える。DOMはヘッダやフッターなど、階層構造のノードにアクセスする仕組み
* サーバとのやりとりはajaxやWebSocketを利用する
* URLは基本的に遷移しないため、遷移による遅延がなくなる

### SPAのメリット

* 通信量、遅延の低減
* デプロイがサーバへアップロードするだけ
* ネイティブアプリを上回る機能開発が進んでいる
* クロスプラットフォーム
* 近年HTML5/CSS3/JavaScriptのサポートと機能開発がかなり進んできている
* オンラインアプリの「脱オンライン」化。 クライアントサイドでの処理の実現

### SPAのデメリット

* 初期レンダリングに時間がかかる
* JavaScriptの高い技術が必要

### RIA　(Rich Internet Application )
パーソナルコンピュータ等のソフトウェアの分類の1つであり、ウェブブラウザなどのクライアントの機能を活かした、柔軟なインターフェースをもつウェブアプリケーションのことである

* 表現力の高さ：動画、音声などマルチメディアの活用
* デスクトップアプリケーションと同様なUI：リフレッシュすることなく、バックエンドでサーバとデータの送受信が可能
* ユーザーエクスペリエンス：インタラクティブな操作性
* アプリケーションと実行環境を含むソフトウェアの配布と更新が容易である
* 複数の異なるプラットフォームに対応する


RIAを実現するものとして従来はFlashなどのプラグイン方式が用いられてきたが、最近ではWebベースの形式つまり、SPAが用いられるようになっている。SPAがRIAに入るか、RIAとSPAが別物かは、調べた限りではどちらの考えもあるようだ。

利用されるフレームワーク
------------

ext.js,emben.js,knockout.js,batman.js,Cappuccine.js,Vue.js,React.js,BackBone.js,Knockback.js,Angular.jsなど

事例
--

* Google Maps
https://www.google.co.jp/maps

* Google Keep
http://www.google.com/keep/

* Offline Gmail
https://chrome.google.com/webstore/detail/gmail-offline/ejidjjhkpiempkbhmpbfngldlkglhimk?hl=ja

* Cordova(PhoneGap)を使ったネイティブアプリ事例
http://qiita.com/takeshy/items/18a902289c05de044d50
[ jQuery ] 要素に含まれている要素に対して共通の計算を行う

良く忘れるので、自分用にメモです。jQueryを使ってすべての要素に対して共通の計算を行う機会があったので、効率良い方法がないか検証してみました。

今回の例は、**要素中に含まれるすべての要素の高さの合計を計算するもの**になります。
親要素に高さが反映されないabsolute指定された要素などがある場合に使うことが多いと思います。

## jQueryで良くある書き方 ##

```js

var sum = 0;

$('#target > *').each(function(){

	sum += $(this).outerHeight(true);

});

console.log(sum);

```

上記の方法でも問題ないのですが、もう少しスマートに書きたいですね。そこでjavascriptのreduce関数を見つけました。

参考：[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)

## reduce関数を使った書き方

```js

var sum = $('#target > *').get().reduce(function(s, el){

	return s += $(el).outerHeight(true);

}, 0);

console.log(sum);

```

もっと良い方法があればコメント頂ければと思います。

備忘録エントリーでした！
TypeScriptでReduxのcombineReducerがstoreの型をあんまり考慮してくれない問題をもうちょっとマシにする

# TL, DR
* combineReducerの型がanyになっていて、正しくないものが許容されている。
* なのでここに補助的な自前の型を作ることでなんとかしようという試み
* 次期バージョン(redux 4〜)で公式にサポートされるので、待てるならば待って良い

# 詳細：combineReducerの現状の型の問題点
`combineReducer`は、下記のように定義されている。
https://github.com/reactjs/redux/blob/master/index.d.ts

```ts
export interface ReducersMapObject { [key: string]: Reducer<any> }
export function combineReducers<S>(reducers: ReducersMapObject): Reducer<S>;
```

返り値となるState型`<S>`を指定できるものの、`ReducersMapObject`が`Reducer<any>`とされているため、stateと違うredcerを入れてもエラーになってくれない

```ts
const fooReducer = (state: number) => {
  return state
}
const bazReducer = (state: string) => {
  return state
}

export interface CombinedState {
  foo: number,
  baz: string,
}

// こんな感じになっていてもエラーにならない
export const rootReducer = combineReducers<CombinedState>({
  foo: bazReducer,
  baz: fooReducer
})
```

なので、自前で型を作って対応する必要がある。

## combineReducerとstateを整合する型

適当にこんな感じで作った。

```ts

export type CombineReducerMap<S extends {}> = { [K in keyof S]: Reducer<S[K]> }
```

こんな感じで使う

```ts
export interface CombinedState {
  foo: number,
  baz: string,
}

// おかしなreducerの場合はこの変数がエラーとなる
const reducerMap : CombineReducerMap<CombinedState> = {
  foo: fooReducer,
  baz: bazReducer
}

export const someReducer = combineReducers<CombinedState>(reducerMap)

```

`combineReducers`自体の型を上書きする方が良さそうだったが、さくっとやれなかったので一旦これで妥協した。

## 補足

nextブランチでは既にこの問題は修正されているので、一旦我慢しておいてもそのうちなんとかなりそうな見込みである
https://github.com/reactjs/redux/pull/1413
https://github.com/reactjs/redux/blob/next/index.d.ts

# 最終的なサンプル

```ts
import { Reducer, combineReducers } from "redux"


export type CombineReducerMap<S extends {}> = { [K in keyof S]: Reducer<S[K]> }


const fooReducer = (state: number) => {
  return state
}
const bazReducer = (state: string) => {
  return state
}

export interface CombinedState {
  foo: number,
  baz: string,
}

const reducerMap : CombineReducerMap<CombinedState> = {
  foo: fooReducer,
  baz: bazReducer
}

export const rootReducer = combineReducers<CombinedState>(reducerMap)


// 下記はエラーになる
const invalidReducerMap : CombineReducerMap<CombinedState> = {
  foo: bazReducer,
  baz: fooReducer
}

```
Swift3でボタンを揺らす簡単なサンプル

# IBOutletで接続

```swift
@IBOutlet weak var Button: UIButton!
```
# viewDidLoad() 内で実行

```swift
UIView.animate(withDuration: 0.6,
                       animations: {
                        self.Button.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)
        },
                       completion: { _ in
                        UIView.animate(withDuration: 0.6) {
                            self.Button.transform = CGAffineTransform.identity
                        }
        })
        
```

# 参考

[Scale UIButton Animation- Swift](https://stackoverflow.com/questions/31320819/scale-uibutton-animation-swift)

[Swift3でボタンを揺らす簡単なサンプル](http://off.tokyo/blog/2017/05/26/scale-uibutton-animation-swift/)
grepで、正規表現でないただの文字列を検索する

正規表現じゃない文字列を検索したいときがある。

`$-[]` という文字列を検索したいとして、

perlでやると

```perl
cat hoge.txt | perl -nle 'print if $_ eq "$-[]"'
```

だけど、grepで

```perl
cat hoge.txt | grep -F -e '$-[]'
```

すれば良い。

https://stackoverflow.com/questions/3242873/grep-for-literal-strings
手軽に文字列をBase64へ変換する

# tl;dr
JSのwindow.btoa()を
chromeのconsole上で
実行すると変換した文字列が生成できる

# 背景
curlでgetする際にパラメータとして、IDとパスワードを要求されるのだが、
それを毎回base64化させないといけなかった。
もっと手元で気軽に叩けないものかと思っていたのだが、
chromeのconsole上で変換すれば、手数が減らせるのではないかと。

# 方法
1.chromeを起動する
2.F12でデバッグコンソールを出す
3.ウインドウ上でwindow.btoa('任意の文字列')を入力する
4.実行すると変換できている

# そもそも
変換するためだけにchromeを起動するのもどうかとと思っているので、
他の方法もっと楽な方法はないものか。
これのが効率的だぜ！というのがあれば、ぜひ教えて頂きたいです。
Mac の Slack クライアントの自動バージョンアップを outset で無効にする

バージョン 2.6 以上の Mac 用 Slack クライアント（Slack 2.6.2 でも確認）では U+0008 などの制御文字が挿入されてしまうため、旧バージョンを使う方法を記載する。
そのままの方法では、旧バージョンを入れても自動バージョンアップされてしまうので、自動更新を止められるバージョン（2.4.1）をインストールした上で、自動バージョンアップを無効にする必要がある。（squirrel を利用している他の App の更新も止まるので注意）

Slack 2.4.1 をダウンロード
https://downloads.slack-edge.com/mac_releases/Slack-2.4.1-macOS.zip

上記を解凍して `/Applications` にインストール（既に入っている Slack は削除しておく）

launchctl を制御するため outset を使う。

outset (outset-2.0.5.pkg) をダウンロード
https://github.com/chilcote/outset/releases

`outset-2.0.5.pkg` 実行してインストールする。

outset 用のスクリプト（launchctl の環境変数の定義をするだけ）
https://gist.github.com/grahampugh/bf07f3d2323f2a05c1fa524017678e04

```
$ wget https://gist.githubusercontent.com/grahampugh/bf07f3d2323f2a05c1fa524017678e04/raw/ff3edbb86ded9f902d7125a542efdf8610716815/disable-squirrel-updates.sh
--2017-05-10 21:55:00--  https://gist.githubusercontent.com/grahampugh/bf07f3d2323f2a05c1fa524017678e04/raw/ff3edbb86ded9f902d7125a542efdf8610716815/disable-squirrel-updates.sh
Resolving gist.githubusercontent.com... 151.101.72.133
Connecting to gist.githubusercontent.com|151.101.72.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 210 [text/plain]
Saving to: ‘disable-squirrel-updates.sh’

disable-squirrel-updates.sh                                         100%[===================================================================================================================================================================>]     210  --.-KB/s    in 0s

2017-05-10 21:55:00 (5.01 MB/s) - ‘disable-squirrel-updates.sh’ saved [210/210]
```

ダウンロードしたシェル `disable-squirrel-updates.sh` をログイン時に実行されるように配置する。

```
# 配置する
$ sudo mv disable-squirrel-updates.sh /usr/local/outset/login-every/

# 所有者を変更し、実行権限を与える
$ sudo chown root: /usr/local/outset/login-every/disable-squirrel-updates.sh
$ sudo chmod a+x /usr/local/outset/login-every/disable-squirrel-updates.sh

# outset でロードする
$ /usr/local/outset/outset --login
Processing /usr/local/outset/login-every/disable-squirrel-updates.sh
```

確認のため Mac を再起動する（※ Slack をログイン時に自動起動している場合は outset より早く起動されてしまうため OFF にする）  

launchctl の環境変数が変わっているのを確認する

```
$ launchctl getenv DISABLE_UPDATE_CHECK
1
```

※ boot-every なら自動起動していても大丈夫？（要調査）

[参考] Squirrel Updates, the Slack Mac App and User Environment Variables
https://macops.ca/disabling-squirrel-updates
iOS の App ID の Prefix を Team ID Prefix に変更する

# iOS App ID の Prefix を Team ID Prefix に変更したい

## 背景
2008年頃に作成した iOS の App ID は、ランダムな ID の Prefix が付与されていた。
それは特に問題でもないのだが、Mac OS のアップグレードなどで、Keychain の移行がうまくいかなかった場合、Xcode での Archive 時にエラーとなってしまう。
そして、今回この問題に遭遇してしまい、アプリの更新ができなくなってしまった。

## Technical Support Incident (TSI) で相談
もうすぐ iOS Developer Program の期限が切れると通知が届いたので、Technical Support Incident を使って iOS の App ID の Prefix の変更方法を訊ねた。2日ほどで以下の回答を得られた。

> Based on your request Apple Developer Technical Support believes that your question is answered by the documentation linked here:
> Technical Note TN2311
[Managing Multiple App ID Prefixes]
(https://developer.apple.com/library/content/technotes/tn2311/_index.html#//apple_ref/doc/uid/DTS40014135)

なお、TSI への相談料は年会費に含まれていて、年間2回までは無料なのだ。
ほとんど利用することがないが、プログラミング以外の問題の解決には役に立つと思う。

## Prefix の変更を実施

上記 URL 内での手順を以下に引用。この指示に従って作業した。

> 1. Log in to the iOS developer member center and navigate to "Certificates, Identifiers > & Profiles".
> 2. Once in there, navigate into the App IDs section inside of the Identifiers section.
> 3. Create a new App ID with the same wildcard bundle ID you are already using but using your Team ID based prefix as its prefix. By doing so, you will be associating your wildcard bundle ID with a new Team ID. It is okay to leave your old App ID associated with your wildcard bundle ID there and not delete it - it will be ignored going forward.
> 4. Edit all your provisioning profiles that are associated to the old App ID and update them to use the new App ID.
> 5. Go into all of the provisioning profiles that you have changed and regenerate them.
> 6. Go into Xcode and update your provisioning profiles. For directions about how to do that, see the "Refreshing Provisioning Profiles in Xcode" section in the App Distribution Guide.
> 7. Re-archive your app. Then, submit your new archive making sure to sign it with your new Team ID prefix based provisioning profile.

今回は、*(Radnom ID).com.example.AppName* の App ID を **(Team ID).com.example.AppName** に変更するのが目的である。よって、手順 3 に従い "(Team ID).com.example.*" の Team ID Prefix の Wildcard App ID を作成した。

次に、手順 4 の指示通り App Store 用 Distribution Provisioning Profile 内の App ID の項目を "(Team ID).com.example.*" に変更して保存した。

あとは、Xcode の Preferences の Accounts の画面で、"Download All Profiles" ボタンを押して、Product メニューから Archive を実行した。

以下のような警告が表示されるが、問題なく Archive したバイナリは iTunes Connect にアップロードできた。

> Potential Loss of Keychain Access - The previous version of software has an application-identifier value of ['(Random ID).com.example.AppName'] and the new version of software being submitted has an application-identifier of ['(Team ID).com.example.AppName']. This will result in a loss of keychain access.

iTunes Connect のストア情報内のバイナリの application-identifier の項目も **(Team ID).com.example.AppName** になっていた。期待通りの結果になった。

## おわりに

iOS の App ID の Prefix を変更する機会は、ほとんどないと思う。
しかし、いざ変更しようと思ったら、すぐには解決方法が分からなかった。
そのため、同じような状況に遭遇する開発者のために、備忘録も兼ねて記録しておく。
Choregraphe 2.5.5.5における［Diagram / Timeline］の挙動変化

　本記事は以下の環境で動作を確認しています。

| |バージョン|
|:---|:---|
|NAOqi|2.5.5.5|
|Choregraphe|2.5.5.5|
----
# この記事の内容
　NAOqi2.5.5では［Diagram / Timeline］ボックスの挙動が変化しておりますので、その挙動を紹介します。

#［Diagram / Timeline］ボックスの挙動変化
　NAOqi 2.4.3.28では入力が5つ以上ある（onStop入力を含む）［Diagram / Timeline］ボックスにおいて、onStopに入力があってもonStopped出力が発火しませんでした。

　具体的には、以下のようなボックスになります。
<img width="397" alt="fig1.png" src="https://qiita-image-store.s3.amazonaws.com/0/54394/ce4b979a-782f-e6c6-963d-ff1855ef61e9.png">

　NAOqi 2.5.5.5では入力が5つ以上存在するボックスでも、onStopに入力があった場合、onStopped出力が発火します。

## NAOqi 2.4.3.28と2.5.5.5の比較
　入力側のonStopにイベントを入力した場合のonStopped出力の動作は以下のようになります。
<img width="397" alt="fig1.png" src="https://qiita-image-store.s3.amazonaws.com/0/54394/ce4b979a-782f-e6c6-963d-ff1855ef61e9.png">

|   | NAOqi 2.5.5.5 | NAOqi 2.4.3.28 |
|:---|:---:|:---:|
|onStartやonEvent属性の入力が3つ以下|○|○|
|onStartやonEvent属性の入力が4つ以上|○|×|

## 既知の不具合
　この変更により、これまで正常に正常に動作していたロボアプリが正常に動作しなくなる場合があります。
　もしNAOqi 2.4.3.28からNAOqi 2.5.5.5にアップグレードしたあと、正常に動作しなくなったロボアプリがありましたら、［Diagram / Timeline］ボックスの動作を確認するとよいでしょう。
　大きく変更せず2.4.3.28と同様の挙動にしたい場合は、入力側のonStop属性をonEventやonStartに変更してください。
ハンドラの変更によるディスプレイ反応速度の改善

　本記事は以下の環境で動作を確認しています。

| |バージョン|
|:---|:---|
|NAOqi|2.5.5.5|
|Choregraphe|2.5.5.5|
----

# この記事の内容
　ロボアプリを作成した時、ディスプレイの反応が悪く感じたことがあるかもしれません。そんな時、少しの変更でディスプレイの反応速度を改善できますので、その方法をサンプルアプリを見ながらご紹介します。

# 改善方法
　ディスプレイに表示されているHTMLのonclick()ハンドラを、touchstartイベントを捕捉する方法に変更します。

## 1. HTMLを修正します。
jQuery を利用するため、以下のコードを挿入します。

```html:
<script src="/libs/qimessaging/1.0/jquery.min.js"></script>  <!--　←<head/>に追加-->
```

onclickハンドラを除去します。

```html:
<button id="target_button" onclick="funcRep();">ボタン</button>
```

　　↓

```html:
<button id="target_button">ボタン</button>  <!--　←変更-->
```

## 2. JavaScript側にハンドラを実装します。
HTMLの部品に対応するハンドラを追加します。

```js:
// タッチイベントによるハンドラ
$(function() {
  $('#target_button').on({
      'touchstart': function () {
          funcRep(); // 実行したい処理
      },
  });
});
```

# サンプルプログラム
　サンプルプログラムはGitHubよりダウンロードしてください。
　https://github.com/Atelier-Akihabara/pepper-tablet-event-example

　サンプルを実行すると以下のように表示されます。
<img width="367" alt="スクリーンショット 2017-05-12 14.07.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/54394/c5bc8a53-b63c-68cf-9302-8546b80b24db.png">

- ボタン［おそーい］をクリックすると「おそーい」とPepperが発声します。
- ボタン［早い］をタッチすると「早い」とPepperが発声します。
- 頭タッチで終了します。

# 比較
　実際にロボアプリを作成しonclickハンドラとtouchイベントを捕捉する実装を比較したいと思います。

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="viewport" content="initial-scale = 1, minimum-scale = 1, maximum-scale = 1" />
  <script src="/libs/qimessaging/2/qimessaging.js"></script>
  <script src="scripts/jquery-2.2.2.min.js"></script>
  <script src="scripts/jquery.qimhelpers.js"></script>
  <script src="scripts/main.js"></script>
  <link rel="stylesheet" type="text/css" href="stylesheets/app.css">
</head>
<body>
  <div class="mount">
      <button id="slow_button" class="button" onclick="slowRep();">おそーい</button><button id="fast_button" class="button">早い</button>
  </div>
</body>
</html>
```

　上記HTMLでは比較のためのボタンを2つ［おそーい］［早い］を表示させています。

```js:main.js
// タッチイベントによるハンドラ
$(function() {
  $('#fast_button').on({
      'touchstart': function () {
          $.raiseALMemoryEvent("SBR/Test/Tablet/FastTouch", 1);
      },
  });
});

// HTML onClickeによるハンドラ
function slowRep(){
  $.raiseALMemoryEvent("SBR/Test/Tablet/SlowTouch", 1);
}
```

　［おそーい］ボタンに対応するハンドラslowRep()と［早い］ボタン（id: fast_button）に対応するハンドラを用意します。

　サンプルプログラムをPepper実機に転送し実行すると、**［早い］ボタンはタッチするだけで反応する**のに対し、［遅い］ボタンでは明確にクリックされた時にみボタンが反応することが確認できます。

# ユーザビリティの向上
　反応速度の向上はユーザビリティ（使いやすさ）に直結するポイントですので、是非touchイベントでの捕捉も試してみてください。
ServiceNow初期設定 インスタンスを日本語化する

ServiceNowの開発者向けインスタンスは最初英語なので、日本語化してみる。
インスタンスのビルドタイプはIstanbul。

次の記事を参考にさせて頂きました（と言うより丸コピです）。
>『SNOW freaks - ServiceNow Developerインスタンスの日本語化』
http://snowfreaks.blog.jp/archives/1863664.html

# 日本語化プラグインの導入
インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/a9a9d783-00db-c390-dbb0-a89abbd275fa.png)

アプリケーションナビゲータの中から、System Definition → Pluginsを選択（<font color="red">赤枠</font>）。
（フィルタナビゲータ（<font color="blue">青枠</font>）に「**plugins**」と入力すると簡単です）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/902d6df0-57f0-56a1-8e32-79d48bbdf050.png)

アプリ内検索欄に「**\*Japanese**」と入力し、<font color="red">Enter</font>キー。
検索結果から「**I18N: Japanese Translations**」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/6653e32e-d129-ff26-1d45-1216bf118034.png)

続いて赤枠の位置にある「**Activate/Upgrade**」リンクをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/afac78ea-ce13-3499-fb79-b91581a8d5ff.png)

確認画面が出るので「**Activate**」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/6f8c591a-94ff-0fbe-8c2f-4733407fcde1.png)

終わるまで待つ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/e797d95b-54a6-161f-6d81-408b3d35efdb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/001ed532-3a68-a39c-d7f9-8b7657671b5f.png)

以上でプラグインの導入作業は終了です。

# インスタンスの言語設定を日本語に変更

<font color="red">※ 最初にページを再読み込みします（そのまま作業すると言語設定が出来ないので注意！）</font>

設定メニューを開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/4bc61824-da5b-51f7-bcee-2ba57efe8aa6.png)

言語を日本語に変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/b68e3d5c-80f0-fd8a-935f-09b6501e48ef.png)

以上で日本化作業は終了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

# 参考サイト
>『SNOW freaks - ServiceNow Developerインスタンスの日本語化』
http://snowfreaks.blog.jp/archives/1863664.html

# 関連記事
> - [ServiceNow初期設定 インスタンスのデフォルトの言語を日本語にする](http://qiita.com/Kisaragi13/items/27099408d3562eea6639)
> - [ServiceNow タイムゾーンを日本時間に変更する](http://qiita.com/Kisaragi13/items/176a222f7d1b9b987b3e)
ABAPer向け新しめ便利コマンド

#ある程度便利なコメンドが増えています
最近、ABAPを久々に書いたのですが、便利になったなぁと感じたコマンドのメモです。
NetWeaver7.40 SP2から使えます。

[SAP NetWeaver AS for ABAP 7.51 Innovation Package – Overview and Product Highlights](https://blogs.sap.com/2016/11/17/sap-netweaver-as-for-abap-7.51-overview-and-product-highlights/)に同じような情報ありました。他にも興味深い内容多かったです。

#変数のInline Declaration
変数定義をしながら、値の入れ込みができます。
https://help.sap.com/http.svc/rc/abapdocu_751_index_htm/7.51/en-US/abendata_inline.htm

```abap:Report.abap
* 以前の書き方
DATA lv_guid TYPE sysuuid_x16.
lv_guid = cl_system_uuid=>if_system_uuid_static~create_uuid_x16( ).

* 新しい書き方
DATA(lv_guid) = cl_system_uuid=>if_system_uuid_static~create_uuid_x16( ).
```

```abap:Report.abap
* こんな書き方もできます

SELECT *
FROM t000
INTO TABLE @DATA(lt_t000).

READ TABLE lt_t000
INTO DATA(ls_t000)
INDEX 1.
```

・汎用モジュール/メソッド側に合わせた動的なデータ定義ができるので、汎用モジュール/メソッドの**パラメータ参照データ型を変えても、勝手に追随**してくれます。そのため、保守性があがります。
・**コードが短くなって可読性向上**。
・データを入れ込む場所で変数定義するので、実際に**使う場所がわかりやすく**、変数が使われるスコープが短くなって可読性が向上します。


#内部テーブルへの行追加
ヘッダ領域なしに追加できます。
レンジテーブルに対して、特に便利です。

```abap:Report.abap
DATA lt_string TYPE TABLE OF string.

* 新しい書き方
lt_string = VALUE #(
( `1st Line` ) "1行目
( `2nd Line` ) ). "2行目

* 古い書き方
APPEND:
'1st Line' TO lt_string,
'2nd Line' TO lt_string.
```

```abap:Report.abap
DATA lt_range TYPE RANGE OF i.

* 新しい書き方
lt_range = VALUE #( BASE lt_range ( sign = 'I'
option = 'BT'
low = 1
high = 10 ) ).

* 古い書き方
DATA ls_range LIKE LINE OF lt_range.
ls_range-sign = 'I'.
ls_range-option = 'BT'.
ls_range-low = 1.
ls_range-high = 10.
APPEND ls_range TO lt_range.

```

・コードが短くなる
・ヘッダ領域の変数定義が不要
Composerで低いバージョンの依存テスト

# 対象読者

この記事は主に`composer`のパッケージを開発しているパッケージメンテナーのための記事です。

# 低いバージョンの依存テストの必要性

composerで作成したパッケージを他のパッケージから利用する場合`composer.lock`は無視されます。

https://getcomposer.org/doc/02-libraries.md#lock-file

>  this lock file will not have any effect on other projects that depend on it. It only has an effect on the main project.

通常与えられた条件の最新のバージョンがインストールされます。テストは最新の依存だけをテストすることになり。`^`や`~`で指定した最低のバージョンのテストは行われません。

これが問題になるのは、他のパッケージが特定のパッケージの低いバージョンのものに依存していて、また他のパッケージではその高いバージョンのみにある機能を使用している場合です。依存解決は低いバージョンで行われ、最新バージョンに依存したパッケージはエラーを引き起こしたりBugの元になったりします。

## 最低限のバージョンの依存のテスト

`--prefer-lowest`オプションで`composer update`すると`composer.json`で指定した範囲で最低のバージョンがインストールされます。

```bash
composer update --prefer-lowest --prefer-stable
./vendor/bin/phpunit
```

## Travis CIでのテスト

Travis CIでは以下の記述で複数のバージョンで最新の依存と最低バージョンの依存を取得します。

```
language: php
sudo: false
php:
  - 5.6
  - 7
  - 7.1
  - hhvm
env:
  matrix:
    - DEPENDENCIES=""
    - DEPENDENCIES="--prefer-lowest --prefer-stable"
before_script:
  - composer self-update
  - composer update $DEPENDENCIES
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3940/ace63bd3-777e-30f7-9701-9d9171b5c56c.png)

## まとめ

`composer.lock`を使ってバージョンをロックできるのは他から依存されることのないメイン（ルート）のパッケージだけです。多くの依存のあるパッケージの依存解決がスムーズになるように、最低バージョンの依存を指定します。

一般に最新のバージョンのパッケージの利用を勧めることは良いプラクティスですが、一方で互換性や対象を多くするために動作する最低限のバージョンをなるべく広く取るようにした方がいいでしょう。

パッケージメンテナーは動作する依存パッケージの最低限のバージョンを正しく表記する必要があります。

 * Composerで依存パッケージのcomposer.lockは使われるのか？ http://blog.a-way-out.net/blog/2014/12/30/composer/
 * Testing your composer dependencies with prefer-lowest https://evertpot.com/testing-composer-prefer-lowest/
サウンドレコーダーの代替としての StreamRelay.NET.exe


### ManagedDirectX (MDX) 利用版

DirectX(DirectSound) を使ってみた

Win32 限定の ManagedDirectX を利用して作ったプログラムが

- Plugins\Win32\stdioSoundRecordMDX.dll

### SlimDX 利用版

Win32/Win64 併用の [SlimDX](https://www.slimdx.org/)という DirectX のラッパーを利用して作ったプログラムが

- Plugins\Win32\stdioSoundRecordSlimDX.x86.dl_
- Plugins\Win64\stdioSoundRecordSlimDX.x64.dll

(ManagedDXと混じらないように拡張子を変えているので、こちらを使いたい場合は、ManagedDX側のDLLを削除して、こちらの拡張子を「dll」に変える)

ちなみに別途 SlimDXのランタイムをインストールする必要がある

### サウンドレコーダーの代替としての StreamRelay.NET.exe

`StreamRelay.NET.exe -LocalPort 0 -RemotePort 0 -RemoteOutputFile rec.wav -LocalSoundRecord 0`
これだけだと、ヘッダのないWave形式なので、
`SoundChange.exe rec.wav`
として、Waveファイルとして完成する

### マイク一覧

`StreamRelay.NET.exe -ListMicrophone`

### スピーカー一覧

`StreamRelay.NET.exe -ListSpeaker`

### 参考

NAudio版は[こちら](https://qiita.com/tomoki0sanaki/items/14233d101f970ee8bbd1)

[音声を再生したり、さらには録音したりするプログラムを何本か作った](https://qiita.com/tomoki0sanaki/items/98ec5cc02f82512736c4)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Chromeで外部プロトコルダイアログの設定をリセットする

## 現状(2019/11)のChromeに関して
バージョン77からprotocol_handlerの設定は利用できなくなったみたいです。
参考：https://support.google.com/chrome/thread/14193532?hl=en
細かい制御はできなくなりましたが、起動時の確認ダイアログを表示しないようにすることはレジストリを編集することで可能になります。
上記参考URLの回答にもありますが、Chromeのホワイトリスト定義レジストリに起動したいアプリを追加することで可能です。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\URLWhitelist]
"1"="追加したいURLスキーム://*"
```


### 以下、バージョン76以前のChromeの場合
mailtoなどのURLスキームで外部プログラムを起動する際、確認ダイアログにこのURLスキームに対して「起動する」「起動しない」の操作を記憶するチェックボックスが表示されます。
このチェックボックスをチェックした後、やっぱりチェックを外したいと思ってもどこから設定し直せばいいかが分かりません。

ネットで情報を探すと、「AppData\Local\Google\Chrome\User Data\LocalState」のファイルに記述されている、とあるのですが既にこの情報は古くなっているのか設定が見当たりません。

ですので自力で調べてみました。間違いがあれば指摘してください。
ちなみに私が使用しているのはバージョン 58.0.3029.110 (64-bit)です。
OS はWindows10 

1.「AppData\Local\Google\Chrome\User Data\Default\Preferences」をエディタで開く

2.対象となるURLスキームで文字列検索をすると、以下のような記述があります。

～"protocol_handler":{"excluded_schemes":{"myapp":true,"otherapp":false}～

"myapp"が対象のURLスキームだとすると、
- 常に起動するにしたい場合は「"myapp":false」
- 常にキャンセルしたい場合は「"myapp":true」
- 再度ダイアログを表示したい場合は"「myapp":true」のパラメータ自体を削除する

3.編集後ファイルを保存し、Chromeを再起動する

これで外部プロトコルリクエストのダイアログ状態を変更することができます

## 余談
本来ならこの設定はファイル編集ではなくて [コンテンツの設定]-[ハンドラ]-[ハンドラを管理] で設定できるように思えるのですが、登録されているハンドラは表示されていません
何か他の設定があるのだろうか・・・
crowi-plusを試してみた

# 経緯
社内Wikiがないので、いいツールが無いかと探していた。人気の記事にタイムリーに[crowi-plus](http://qiita.com/yuki-takei/items/5df9601039ccfc1df01f)が上がっていたので、ローカル環境に導入してみた。

# いろいろインストール
## Node.js 
[ここから](https://nodejs.org/ja/)バージョン6系をダウンロードしてインストール

## npm
Node.jsをインストールすると一緒にインストールされるが、バージョンが古いので再インストールする。インストールはnpm自身から行える

```bat
npm install -g npm
```

## yarn
`npm`コマンドを使ってインストールを行う

```bat
npm install -g yarn
```

## mongoDB
[ここから](https://www.mongodb.com/download-center)プラットフォームを選択して、ダウンロードする。
ユーザ登録を求められるが、今のところメールがくる気配もなし。認証メールもなかったので、適当に入力しても通る気がする。
ダウンロードはZIP形式ファイルを選択し、解凍。適当な場所に配置して、binフォルダにPATHを通す。
また、binフォルダと同階層に`logs`、`data`フォルダを作成する。

(2017/09/04追記)どうやらmongoDBのホームページが変わったようで、執筆時点のZIPファイルがなくなっていた。Win10なら64bitサーバ用でも問題なく動くようだ。
(2017/10/13追記)[ここ](https://www.mongodb.com/download-center/enterprise/releases)でWindows版が入手できるようになっていた。一番下にある。32Bit版は・・・ないのかな。。。

# crowi-plusのビルドと起動
適当なディレクトリに移動して、以下のコマンドを実行する。

```bat
git clone https://github.com/weseek/crowi-plus.git
cd crowi-plus
yarn
```

### mongoDBを起動する

```bat
mongod --dbpath c:\mongodb\data --logpath c:\mongodb\logs\mongodb.log
```
DB起動後はコマンドプロンプトが使用できないので、別のコマンドプロンプトを立ち上げてcrowi-plusを起動する

### crowi-plusを起動
ファイルのアップロードを許可するため、Windowsの環境変数に、
`FILE_UPLOAD=local`
を追加したうえで以下のコマンドを実行。

```bat
npm start
```

# crowi-plusへアクセス
ブラウザを立ち上げて`localhost:3000`にアクセスすればcrowi-plusが使える。

# ローカルに導入してみて
簡単に導入することができた。
自動化と、社内サーバへの導入を検討中
Android KotlinでRealmを使ってみる

# Realm

## 環境

Gradleにお任せなので必要な記述を足してsync now。
Realmは3.1.4が現時点で最新なのですがエラーが解消出来てないので一旦1.1.0で記述しています。

```
// Projectのbuild.gradle
buildscript {
    ...
    repositories {
        jcenter()
    }
    dependencies {
　　　　　　　　　　　　　　　　...
        classpath "io.realm:realm-gradle-plugin:1.1.0"
    }
    ...
}
```

```
// Appのbuild.gradle（他のapplyが並んでる所、最初のあたり）
apply plugin: 'realm-android'
```


## ライフサイクル

onCreateでインスタンスを取得して使い回し、onDestroyでcloseする。
そのため、Activityのメンバ変数として持ちます。


```
// 変数宣言
class MainActivity() : AppCompatActivity() {
    var mRealm:Realm? = null
    ...
}
```

```
    // インスタンス取得
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val realmConfig = RealmConfiguration.Builder(baseContext).build()
        val realm = Realm.getInstance(realmConfig)
        mRealm = realm
        ...
```

```
　　　　　　　　// close
    override fun onDestroy() {
        super.onDestroy()
        mRealm?.close()
    }
```

## Insert

TodoモデルをDBに書き込む。

TodoモデルはRealmObjectを継承して実装。
プレーンなgetter/setterはKotlinでは使いませんので実装しません。

```
open class Todo(
        open var name: String = "",
        open var status: Int = 0,
) : RealmObject() {}
```

transactionで括った中で処理を行います。
モデルは普通のnewでは無く、realmインスタンスのcreateObjectにて生成します。
copyToRealmにて書き込みします。

```
        realm.executeTransaction {
            val todoModel = realm.createObject(Todo::class.java)
            todoModel.name = todo
            todoModel.status = 0
            realm.copyToRealm(todoModel)
        }
```

## Read

Todo全件を取得する。
取得はtransaction不要。

```
val props: RealmResults<Todo> = realm.where(Todo::class.java).findAll()
```
サウンドレコーダーの代替としての StreamRelay.jar


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

Javaでは、[AudioInputStream](https://docs.oracle.com/javase/jp/1.4/api/javax/sound/sampled/AudioInputStream.html)とマイク入力がストリームになっている。
出力側はストリームになっていないが、OutputStreamを被せるのは、比較的簡単

### サウンドレコーダーの代替としての StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputMic -RemotePort 0 -RemoteOutputFile AudioSaveFile.pcm`

AudioSaveFile.pcm という生の音声データ(PCM形式)のファイルが出力される

同梱している**SoundFormatChangeクラス**を使って、PCM形式をau形式に変換できる
`java.exe SoundFormatChange AudioSaveFile.pcm AudioSaveFile.au`

### ネットワークと音声(音声チャット)

ネットワーク経由で、音声データをやり取りすれば、音声チャットっぽくなる
ただし、片方がイヤホンなどでハウリング対策をする必要があるでしょう

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 99 -RemotePort 0 -RemoteInputMic -RemoteOutputSpeaker`
と
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 99 -RemoteHost 192.0.2.1 -LocalInputMic -LocalOutputSpeaker`
で音声チャットができる

### ネットワークと音声(電話会議)

ネットワークと、音声と、ブローカーモードによって、電話会議っぽくなる

サーバ
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 99 -RemotePort 0 -RemoteInputMic -RemoteOutputSpeaker -Broker`

クライアント
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 99 -RemoteHost 192.0.2.1 -LocalInputMic -LocalOutputSpeaker`

### 参考

[音声を再生したり、さらには録音したりするプログラムを何本か作った](https://qiita.com/tomoki0sanaki/items/98ec5cc02f82512736c4)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Ruby でテキストファイルを2行ずつ処理する

## Enumerable#each_slice

指定した数ずつ処理することができる Enumerable#each_slice が用意されている。

instance method Enumerable#each_slice (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/each_slice.html

> n 要素ずつブロックに渡して繰り返します。
> 要素数が n で割り切れないときは、最後の回だけ要素数が減ります。
> ブロックを省略した場合は n 要素ずつ繰り返す Enumerator を返します。

## テキストファイルを2行ずつ処理する

サンプルコード。

```
# 2行ずつ処理する
File.open(ARGV[0]) do |file|
  file.each_slice(2) do |lines|
    puts "class: #{lines.class}"
    puts "size: #{lines.size}"
    puts "1: #{lines[0]}"
    puts "2: #{lines[1]}"
  end
end
```

処理用のサンプルとして、5行のテキストファイルを用意。

```
Alice
Bob
Carol
Dave
Ellen
```

実行結果。
ブロックに渡されるのは Array オブジェクト。

```
class: Array
size: 2
1: Alice
2: Bob
class: Array
size: 2
1: Carol
2: Dave
class: Array
size: 1
1: Ellen
2: 
```

## テキストファイルを3行ずつ処理する

each_slice メソッドに指定する数を3にするだけで3つずつ処理できる。

```
# 3行ずつ処理する
File.open(ARGV[0]) do |file|
  file.each_slice(3) do |lines|
    puts "1: #{lines[0]}"
    puts "2: #{lines[1]}"
    puts "3: #{lines[2]}"
  end
end
```
MYSQLストアドプロシージャ・イベントの設定サンプル・メモ

久しぶりにストアドプロシージャを書きました。
懐かしい！

### プロシージャ新規作成
```
DELIMITER //
CREATE PROCEDURE hello_procedure()
BEGIN
update master_table set delete_flg = 0 where id = 1;
END
//
DELIMITER ;
```

### プロシージャ削除
```
DROP PROCEDURE hello_PROCEDURE;
```

### プロシージャ編集
```
DELIMITER //
ALTER PROCEDURE hello_PROCEDURE()
BEGIN
update master_table set delete_flg = 1 where id = 1;
END
//
DELIMITER ;
```

### イベント設定（指定した日付、一回のみ実行）
```
CREATE EVENT hello_procedure
ON SCHEDULE AT '2017-01-01 00:00:00'
COMMENT 'hello_procedure event'
DO
call hello_procedure();
```

### イベント設定（デイリー実行）
```
CREATE EVENT hello_procedure
ON SCHEDULE EVERY 1 DAY STARTS '2017-01-01 00:00:00'
COMMENT 'hello_procedure event'
DO
call hello_procedure();
```

### イベント設定（マンスリー実行）
```
CREATE EVENT hello_procedure
ON SCHEDULE EVERY 1 MONTH STARTS '2017-01-01 00:00:00'
COMMENT 'hello_procedure event'
DO
call hello_procedure();
```
script コマンドの代替としての StreamRelay.jar

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

UNIX 系にはコンソールでのコマンド実行の履歴が取れる script コマンドというのがある

オプション「-LoggingFile」でログが取れるので、それを指定することで、代替となる

ただし、シェルの便利な機能が使えない

### script コマンドの代替としての StreamRelay.jar

`script outputLog.txt`
⇔
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort -1 -RemoteProgram cmd.exe -LoggingFile outputLog.txt` 

### 外部コマンド呼び出しのオプション

- -LocalEnvironment "name=value" : Environment for Bind Program
- -RemoteEnvironment "name=value" : Environment for Bind Program
- -LocalTempDir "path" : Temporary Directory for Bind Program
- -RemoteTempDir "path" : Temporary Directory for Bind Program

### ロギング時のオプション

- -Logging (標準出力へ出力)
- -LoggingFile "Filename" (ファイルへ出力)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
script コマンドの代替としての StreamRelay.NET.exe

UNIX 系にはコンソールでのコマンド実行の履歴が取れる script コマンドというのがある

オプション「-LoggingFile」でログが取れるので、それを指定することで、代替となる

ただし、シェルの便利な機能が使えない

### script コマンドの代替としての StreamRelay.NET.exe

`script outputLog.txt`
⇔
`StreamRelay.NET.exe -LocalPort 0 -RemotePort -1 -RemoteProgram cmd.exe -LoggingFile outputLog.txt`

### 外部コマンド呼び出しのオプション

- -LocalTempDirectory "DirectoryPath"
- -RemoteTempDirectory "DirectoryPath"
- -LocalArguments "args"
- -RemoteArguments "args"

### ロギング時のオプション

- -Logging (標準出力へ出力)
- -LoggingFile "Filename" (ファイルへ出力)
- -LoggingCharSet "ChasetName" (ログへ出力する際の文字コード)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
《WordPress》現在のページのカテゴリの関連情報を取得する


## WordPressでカテゴリの関連情報を取得

現在のページのカテゴリに関する情報を取得します。

```single.php

<?php

  $cat = get_the_category();
  $cat = $cat[0];

  $cat_name = $cat->name;

  $cat_id = $cat->cat_ID;

  $cat_slug = $cat->slug;

  $cat_term = $cat->term_id;

  $cat_termid = $cat->term_taxonomy_id;

  $cat_taxonomy = $cat->taxonomy;

  $cat_count = $cat->count;

  $cat_description = $cat->category_description;

  $parent_id = $cat->category_parent;

  $parent = get_category($cat->category_parent);

  $parent_catname = $parent->cat_name;

?>

```


## カテゴリアーカイブへのリンクを取得

上記のコードで取得したIDでアーカイブへのリンクを取得します。

```single.php

<a href="<?php echo esc_url(get_category_link($cat_id)); ?>"></a>

```

おわります。
MacbookでPowerpointのスライドショーを見せながら内容を修正する方法

# MacbookでPowerpointのスライドショーを見せながら内容を修正する方法

よくWindowsのPowerpointを使用していた頃、スライドショーを投影してお客様に見せながら自分のPCの方でフィードバックをリアルタイムで内容を更新していました。
Macbookに乗り換えたところ、やり方が分からなくて困っていたが、ついに最近方法が分かったので共有します。


## 1. スライドショーを起動する。
普通にスライドショーを起動します。
![](https://farm5.staticflickr.com/4201/34733451652_f4a07272f6_o.jpg)

Mission Controlで確認するとPowerpointのスライドショーだけで、編集画面が無い。

![](https://farm5.staticflickr.com/4272/34053907844_abc638eec7_o.jpg)

## 2. Dockから再度同じファイルを起動
Mission Controlで別のアプリを選択し、Dockが見える状態で、Powerpointのマークをクリックして、再度同じファイルを開く。
![](https://farm5.staticflickr.com/4252/34765107211_54f16e4663_o.png)

Mission Controlで確認すると同じファイルが編集モードとスライドショーモードで同時に立ち上がっている！スライドショーモードの方を投影の方に持って行けば、投影しながら内容を修正できる。
![](https://farm5.staticflickr.com/4268/34765138891_bba6e8bc48_o.jpg)
もしQiitaのログインページを自動テストするなら何を確認したらいいの？

# 概要
自動テストをしてくださいと言われた時、どんなケースがあってどう確認したらいいかと聞かれるので
シンプルなQiitaのログインページを元にまとめました。

[なかなか踏み出せないWeb画面の自動テストを導入する。](http://qiita.com/gctoyo/items/cb7217beab98bae92aee)
上記でも書いた通り、簡易なテストを目指すため **OAuthログイン** については除外しています。
# Qiitaログインページ テストケース
## 対象画面イメージ
![Qiitaログイン.png](https://qiita-image-store.s3.amazonaws.com/0/132495/8a92cade-1358-19de-5e94-25b765fc7dd2.png)
## 対象URL
```
qiita.com/login
```
## テスト項目
### 共通
|ケース|結果|備考|
|:--|:--|:--|
| タイトルの値 | ログイン - Qiita | URLと表示ページが一致していることの確認 |
| HTTPSアクセス時のステータス | 200 | |
| HTTPアクセス時のステータス | 301 | HTTPを許可しないページの確認 |
| Bodyの文字色 | #4a4a4a | スタイルシートの適用を確認 |
### 正常系
|ケース|結果|備考|
|:--|:--|:--|
| 新規登録のリンク先タイトル | 新規登録 - Qiita | |
| パスワードを忘れた場合のリンク先タイトル | パスワード再設定 - Qiita | |
| メールアドレスを利用したログイン | XXXXXX(ログイン後ページのユーザ名) | |
| ユーザ名を利用したログイン | XXXXXX(ログイン後ページのユーザ名) | |
### 異常系
|ケース|結果|備考|
|:--|:--|:--|
| ログイン失敗後メールアドレス欄 | 入力値と同じ | |
| ログイン失敗後パスワード欄 | 空 | |
| ログイン失敗後メッセージ | ユーザ名かパスワードが間違っています | 必要に応じて退会、存在しないユーザ、空入力などのバリエーションで実行 |

### その他
Qiita の ログイン機能に存在しているかは不明ですが、複数回ログインに失敗したときにアカウントロックが発生するようなケースなど
手動テストでの確認が大変なものは、早い段階で自動テストとして作成しておくほうがベターです。
さくらのクラウドハンズオン：Docker準備編

## 概要

さくらのクラウド上で仮想サーバを実行し、Docker および Docker Compose をセットアップします。


# 1. さくらのクラウドにログイン

## 1.1. ブラウザでコントロールパネルを表示

https://secure.sakura.ad.jp/cloud/  


## 1.2  接続情報を確認

配付資料に含まれるログイン情報を入力し、ログインします。

# 2. 仮想サーバの起動と接続

## 2.1 さくらのクラウドで仮想サーバを起動

　1. 【 さくらのクラウド(IaaS)】をクリックします。
　2. メニュー【 サーバ 】から【 追加 】をクリックします。
　3. ディスクイメージは【 CentOS 7.3 64bit 】を使います。
　4. 「サーバプラン」と「ディスクプラン」を選択します（※今回は変更しません）。
　5. 【 管理ユーザのパスワード 】で root パスワードを設定します。８文字以上の「アルファベット」「数字」「記号」の組み合わせが必要です。
　6. ホスト名を【 docker 】、作成数【 1 】として【 作成 】ボタンをクリックします。
　7. 確認画面では【 作成 】をクリックします。
　8. サーバ追加作業が完了するまで待ちます。起動後は【 閉じる 】をクリックします。
　9. メニューの【 サーバ 】をクリックし、作成したサーバ「 docker 」を確認します。

## 2.2. 仮想サーバへ接続

　1. IP アドレスを確認します。インターフェースを右クリックし【 IP アドレスをコピー 】します。
　2. Tera Term やターミナルなどを開き、対象サーバに SSH でログインします。

- ログイン時のIDは「root」、パスワードは作成時に入力したもの
- ターミナルでは「ssh -l root <IPアドレス>」か「ssh root@<IPアドレス>」

```bash:実行例
ssh -l root <IP_addr>
```

# 3. Docker Engine のセットアップ

## 3.1 安定版(stable)の最新バイナリをセットアップ

```
curl -sSL https://get.docker.com/ | sh
```

このコマンドを実行するだけで、Docker Engine CE(コミュニティ・エディション)のリポジトリを設定し、最新安定版の Docker Engine をセットアップします。

## 3.2. docker サービスの有効化とデーモン起動。

　1. サービスを有効化します。

```
systemctl enable docker.service
```

　2. docker デーモンを起動します。

```
systemctl start docker.service
```

　3. バージョン番号を確認します。

```
docker version
```

サーバを表す`Server:` のバージョンが表示されれば問題ありません。

### 4. チュートリアル

- [基礎編：コンテナとイメージのライフサイクルを理解](http://qiita.com/zembutsu/private/ca0fa7b874c8375be8a4)
- [応用：WordPress](http://qiita.com/zembutsu/private/26cb3a3d138d26c42bab)
- [応用：Zabbix Server](http://qiita.com/zembutsu/private/d03d79896a9e23657075)
- [応用：Mastodon](http://qiita.com/zembutsu/private/f1f1ede26102ba27fce2)


番外編：

- [Docker/Arukas入門ハンズオン](http://qiita.com/zembutsu/items/cc69f98bd2344c8b3317)
GCP/Google Source Repositoryでソースを管理する方法

#前提条件
- 実行環境はMacOSであること。
- MacにGoogle Cloud SDKがインストールされており、認証済みであること。


#MacにGitをインストールする。
https://git-scm.com/
Gitサイトより、[Mac用のインストールパッケージ](https://git-scm.com/download/mac)をダウンロードし、インストールする。
インストール方法はダウンロードした.dmgファイル内のReadmeを参照。

#GCPコンソールより、リポジトリを作成する。
####リポジトリ作成
GCPコンソールより、「Source Repositories」を開く。
サブメニューの「リポジトリ」より、任意のリポジトリ名を入力する。
サブメニューの「ソースコード」をクリックし、「ローカル Git レポジトリへの Cloud レポジトリのクローン作成 」を選択する。

####Mac（ローカル）にクラウドレポジトリのクローンを作成
MacのTerminalを起動し、任意のディレクトリに作成したクラウドレポジトリのクローンを作成する。
`gcloud source repos clone [repository name] --project=[projectID]`

####これでクラウドレポジトリとローカルレポジトリの接続が完了！

#ローカルで作成したソースをクラウドレポジトリにコミットする。
既にソースがある場合は、作成したディレクトリにソースを移動する。
####ソース作成、もしくは移動後、対象リポジトリに移動する。
`cd [repository name]`

####ファイルやディレクトリをインデックスに登録する。
`git add -A`

####追加した情報をコミットする。
`git commit -m "first commit"`

#####クラウドリポジトリにソースをPushする。
`git push -u origin master`

以上でローカルソースがGCPのSource Repositoriesにアップできます。

#GCP上のリポジトリから開発端末にソースを取得する。
GCPのコンソールより、[Source Repositories]>[リポジトリ]に遷移すると、
リポジトリ名とクローンURLが記載されているため、このクローンURLで取得コマンドを実行する。

`git clone [クローンURL]

#Appendix
gitコマンドの認証情報を保存するには、ホームディレクトリに［.netrc］ファイルを作成し、
初めてGitのPushやPullコマンドを実行した際に表示されるURLにブラウザでアクセスすると認証情報が表示されるため、その値を[.netrc]ファイルに記載することで、毎回ログインする必要がなくなる。
平文で保存されるため、暗号化が必要な場合はgpg等で暗号化する。
ターミナルの代替としての StreamRelay.NET.exe

### ターミナルの代替としての StreamRelay.NET.exe

.NET Frameworkは[System.IO.Ports.SerialPort](https://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport(v=vs.110).aspx)クラスにてシリアルポートを扱うことができてStreamで扱えるようになっている

よって、ポート番号を-4にすると、シリアルポートがストリームのソース(実体)となる

シリアルポート(COM9)へ接続する
⇔
`StreamRelay.NET.exe -LocalPort 0 -RemotePort -4 -RemoteCOMName COM9`

### オプション

- -LocalCOMName "ComPortName"
- -RemoteCOMName "ComPortName"
- -LocalBaudRate "BaudRate(9600)"
- -RemoteBaudRate "BaudRate(9600)"
- -LocalParity "Parity(None)" [None|Odd|Even|Mark|Space]
- -RemoteParity "Parity(None)" [None|Odd|Even|Mark|Space]
- -LocalDataBits "DataBits(8)"
- -RemoteDataBits "DataBits(8)"
- -LocalStopBits "StopBits(1)" [0|1|1.5|2]
- -RemoteStopBits "StopBits(1)" [0|1|1.5|2]
- -LocalDtrDisable
- -RemoteDtrDisable
- -LocalRtsDisable
- -Remote]RtsDisable

普通の括弧内が既定値で鍵括弧内は、他の指定可能な値

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
[SQL] 冗長なクエリーはこちら

## この投稿の主旨
　自分が作成したクエリーとそれを手直ししてもらったクエリーを比較したとき、自分のクエリーがとても冗長だったもので、その戒めのためにもこの投稿をしましたorz..

　問題となったのは、親子関係のあるデータ構成があり、１回のクエリーで親と子の両方を取得したい場合がありました。プログラム上では親のデータは１回しか参照しないにも関わらず、親と子の両方を取得するクエリーで子のレコードに必ず親のデータもくっついてきて、データ量が肥大化してました。

実際のデータ構成と近い形で以下に記載します。

## テーブル構成

* 以下のテーブル構成で親子関係を表す

| humansテーブル |
|---|
| id |
| name |

| human_relationsテーブル |
|---|
| parent_id |
| child_id |

humans 1 - n human_relations

### 例）パパと子ども3人の場合

**humans**

| id | name |
| --- | ---|
| 1 | パパ |
| 2 | 子ども1 |
| 3 | 子ども2 |
| 4 | 子ども3 |

**human_relations**

| parent_id | child_id |
| --- | ---|
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |

## 冗長なクエリーはこちら

// これだと子どものレコードに必ず親の情報がくっついてきて無駄になる

``` sql
SELECT
parent.id as parent_id, parent.name as parent_name, child.id as child_id, child.name as child_name
FROM humans parent
LEFT JOIN human_relations hr ON parent.id = hr.parent_id 
LEFT JOIN humans child ON hr.child_id = child.id
WHERE parent.id = :id
```

### 結果
| parent_id | parent_name | child_id | child_name |
| --- | --- | --- | --- |
| 1 | パパ | 1 | 子ども1 |
| 1 | パパ | 2 | 子ども2 |
| 1 | パパ | 3 | 子ども3 |


## スマートなクエリーはこちら

// これだと親と子どもが分離されて余計なデータがなく取得できる

``` sql	
SELECT humans.id, humans.name
FROM humans LEFT JOIN human_relations hr ON humans.id = hr.child_template_id
WHERE (hr.parent_id = :id OR humans.id = :id)
AND humans.deleted IS NULL
```

### 結果
| humans.id | humans.name |
| --- | --- |
| 1 | パパ |
| 2 | 子ども2 |
| 3 | 子ども3 |
| 4 | 子ども4 |
nkf の代替としての StreamRelay.NET.exe (文字コード変換)

StreamにReader/Writerを被せる事で、(文字コードを含む)文字列を扱うことができるので、入力の文字コードと出力の文字コードを異なるオプション指定をすれば、文字コード変換を行う事ができる

###オプション
使うオプションは、

全体設定は・・・

通信方向ごとに個別に設定したい場合は↓

- -InputRequestCharset
- -OutputRequestCharset
- -InputResponseCharset
- -OutputResponseCharset

レスポンスだけ文字コード変換したい。という時に使える

### 文字コード変換ツールとしての StreamRelay.jar

ShiftJISからEUC-JPへの変換

`nkf.exe -S -e input.txt > output.txt`
⇔
`StreamRelay.NET.exe -LocalPort 0 -LocalInputFile a.txt -InputRequestCharset Shift_JIS -RemotePort 0 -OutputRequestCharset EUC-JP -RemoteOutputFile output.txt`

### 文字コード一覧のオプション

``StreamRelay.NET.exe -ListCharset`

### 改行コードの変換もできるよ

netstreamスキームの以下のオプションで、改行コードの変換もできるよ

Streamのread中に変換を行う
- inputLf (CrLf→Lf)
- inputCrLf (Lf→CrLf)

Streamのwrite中に変換を行う
- outputLf (CrLf→Lf)
- outputCrLf (Lf→CrLf)

例えば
`-LocalProxy netstream:///?inputCrLf`
というオプションにすれば、「ローカル」と呼称する側の入力時に「Lf→CrLf」という変換処理を実施する
ということになる

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
nkf の代替としての StreamRelay.jar (文字コード変換)

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

InputStream/OutputStreamにReader/Writerを被せる事で、(文字コードを含む)文字列を扱うことができるので、入力の文字コードと出力の文字コードを異なるオプション指定をすれば、文字コード変換を行う事ができる

###オプション
使うオプションは、
- -LocalCharset
- -RemoteCharset

通信方向ごとに個別に設定したい場合は↓

- -LocalRequestCharset
- -LocalResponseCharset
- -RemoteRequestCharset
- -RemoteResponseCharset

レスポンスだけ文字コード変換したい。という時に使える

### 文字コード変換ツールとしての StreamRelay.jar

ShiftJISからEUC-JPへの変換

`nkf.exe -S -e input.txt > output.txt`
⇔
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile input.txt -LocalCharset Shift_JIS -RemotePort 0 -RemoteCharset EUC-JP -RemoteOutputFile output.txt`

### 文字コード一覧のオプション

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListCharset`

### 改行コードの変換もできるよ

このあたりのオプションで、改行コードの変換もできるよ

通信全体(リクエストもレスポンスも(上りも下りも))で改行コードの変換を行う
- -CRLF : Lf→CrLf
- -LF : CrLf→Lf

リクエストだけ改行コードの変換を行う
- -CRLFrequest : Lf→CrLf
- -LFrequest : CrLf→Lf

レスポンスだけ改行コードの変換を行う
- -CRLFresponse : Lf→CrLf
- -LFresponse : CrLf→Lf

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
localホストには接続できるが、ローカルで開発していたアプリに接続できない

#127.0.0.1:8000に接続できない！
書籍にしたがって順調？に進めていたが、開発中のアプリに接続できなくなった。
昨日まで接続できていたのに。。。
確認してみると127.0.0.1には接続できているようなので、特定のアプリケーションでの問題な気がする。。。

![スクリーンショット 2017-05-26 10.33.33.png](https://qiita-image-store.s3.amazonaws.com/0/167850/eea1bcf6-755c-e7a2-5b4f-78ec5c13e9ec.png)

#解決！！
問題はビルトインWebサーバーが起動していなかったため。

```
$ php app/console server:start
```

無事にアクセスできるようになり解決。パソコン再起動もしないでいじっていてビルトインWebサーバーの状況を気にしないでやっていたため起きた問題だと思われる。どこかのタイミングでタイムアウトしたんじゃないかと思っている。

ついでなのでコマンドをまとめておく。

```
ビルドインサーバーによるアプリケーションの起動
$ php app/console server:start

ビルドインサーバーの状態確認
$ php app/console server:status
起動している時の結果
Web server still listening on http://127.0.0.1:8000
起動していない時の結果
No web server is listening on http://127.0.0.1:8000

ビルドインサーバーの停止
$ php app/console server:stop
```
Watson IoT Platformで他のユーザーと共同開発をするための準備方法

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。

この記事では、Watson IoT Platformを使って、他のユーザーとアプリケーションを共同開発するための準備方法を説明します。
次を紹介します。

- Watson IoT Platformの使用量、請求料金の確認方法
- 他のユーザーとの共同作業用のスペースを作成
- 他のユーザーを開発者として追加

# 準備
Bluemixアカウントを持っていない場合は、[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)を参考に、Bluemixアカウントを作成してください。
他のユーザーは、Bluemixアカウントを持っている必要があります。

# Watson IoT Platformの使用量、請求料金の確認方法
Bluemixにログインしてください。右上のメニューより、管理＞請求及び使用量＞使用量、を選択してください。
もし、この項目がないようでしたら、この組織の管理者の役割が与えられていません。管理者にお問い合わせください。
使用状況ダッシュボードが開き、使用量が確認できます。

![screenshot-2017-05-25-08-34-53.png](https://qiita-image-store.s3.amazonaws.com/0/129990/1641900b-eef3-b4b4-eec9-d95b6344ee92.png)

同様に、メニューより、管理＞請求及び使用量＞請求処理、を選択すると、請求処理が開き、請求料金がわかります。

# 共同作業用のスペースを作成
他のユーザーと共同でアプリケーションを開発したい場合は、新しくスペースを作成します。
1. メニューより、管理＞アカウント＞組織、を選択すると、組織の管理が開きます。
2. 追加したい組織の`詳細を表示`リンクを選択します。
3. `スペースの追加`リンクを選択します。新規スペースの追加が開きます。
4. スペース名を記入し、新規スペースの追加ボタンを選択してください。

# ユーザーを開発者として追加
Bluemixにて、組織の管理者の方が、他のユーザーを開発者として追加する場合の手順を説明します。

右上のメニュー＞アカウント＞ユーザー、を選択してください。次の画面が開きます。
![screenshot-2017-05-25-08-45-52.png](https://qiita-image-store.s3.amazonaws.com/0/129990/8246042b-f270-fa26-9c7c-2b3607fb3ef9.png)
ユーザーの招待ボタンを選択してください。次のユーザーを招待する画面が開きます。

![screenshot-2017-05-25-08-54-02.png](https://qiita-image-store.s3.amazonaws.com/0/129990/1a3fbb40-ace1-dab4-c26a-67d5ef00b85e.png)

ここで、開発者のIBM ID（メールアドレス）を入力します。また、Cloud Foundaryアクセス権限にて、組織、地域、スペースを入力します。開発者の場合、スペースの役割で、`開発者`を選択します。ユーザーの招待ボタンを選択します。画面が変わり、`ユーザーの招待に成功しました`と表示されます。

# スペースの役割の設定(CLI)
ユーザーのスペースの役割をCLIにて設定する方法は、[Bluemix (bx) コマンド](https://console.bluemix.net/docs/cli/reference/bluemix_cli/bx_cli.html#bluemix_login?locale=ja)に説明があります。

スペースの役割の追加
`bluemix iam space-role-set USER_NAME ORG_NAME SPACE_NAME $SPACE_ROLE`

スペースのすべての役割の削除
`#!/bin/bash
for SPACE_ROLE in SpaceManager SpaceDeveloper SpaceAuditor; do
bluemix iam space-role-unset USER_NAME ORG_NAME SPACE_NAME $SPACE_ROLE
done`