OmniAICreator/Qiita-1.07M huggingface dataset:
MacからターミナルでAIXに接続する

仕事用PCがWindowsからMacに変わった際、すぐにTera Termでやっていたように快適に操作できなかったので、やったことのメモ。

## deleteキーが効かない

「delete」キーを押して戻ろうとしても「^?」となってしまう。

```bash
trinity:/# ls^?^?^?^?
ksh: ls^?^?^?^?:  ������܂���B
trinity:/#
trinity:/#
```

Macでは「fn」＋「delete」が「Backspace」であるが、それでもダメ。

```bash
trinity:/# ls^[[3~^[[3~^[[3~^[[3~
ksh: ls^[[3~^[[3~^[[3~^[[3~:  ������܂���B
trinity:/#
```

ターミナルアプリの場合は、
ターミナル > 環境設定 > プロファイル
で設定できます。エンコーティングの設定もここ。

![terminal1.png](https://qiita-image-store.s3.amazonaws.com/0/86449/7554424b-0692-ec1d-2077-8d10e82018e8.png)

iTerm2の場合は
iTerm2 > Preferences > Profiles > Keys
にあります。

![iterm1.png](https://qiita-image-store.s3.amazonaws.com/0/86449/c3efcd93-cb57-94ab-e242-2d94a6ef2e9e.png)

エンコーディングはここ。

![iterm2.png](https://qiita-image-store.s3.amazonaws.com/0/86449/62001ed3-bbf7-d363-1b08-8e9109674280.png)

参考
[OS X のターミナルで AIX にログインして [delete] を押すと「^?」と表示される](http://d.hatena.ne.jp/yohei-a/20090410/1239317216)
[iTerm2でMacのdeleteキーをbackspaceにかえる](http://qiita.com/hirokidaichi/items/92632bc8b15086839fd3)

## viでエラー

viでファイルを開いたときに、エラーメッセージがでて上手く編集できない。

```bash
trinity:/etc# vi hosts
ex: 0602-108 XTERM-256COLOR は認識できない端末タイプです。
  [継続するにはリターン・キーを押してください]

[open モードを使用]
"hosts" 56 行、2027 文字
                         # IBM_PROLOG_BEGIN_TAG
                                               # This is an automatically generated prolog.
```

これには2つ対処方法がある。

### ターミナルの設定変更による対応

ターミナルアプリの設定でターミナルの宣言を変更する。

![terminal2.png](https://qiita-image-store.s3.amazonaws.com/0/86449/3fb6bd53-63c1-d4a3-c49f-dae874c00391.png)

![iterm3.png](https://qiita-image-store.s3.amazonaws.com/0/86449/9f897ba2-c4dd-4717-6f1c-f1d7c7fc7507.png)

### .bash_profileによる対応

Mac側の.bash_profileでターミナルを宣言することでも対応できる。

```bash
export TERM=xterm
```

参考
[MacのターミナルにてSolaris上のviでxtermエラーが出るときの対処](http://scribble.washo3.com/mac/mac%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%AB%E3%81%A6solaris%E4%B8%8A%E3%81%AEvi%E3%81%A7xterm%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE.html)
[Mac OSXでSunOS（Solaris）にリモートアクセスした時，viが使えない](http://watt1006.hatenablog.com/entry/2012/11/09/164408)

## プロファイルの使い分け

Linuxに接続することもあるので、AIX接続用にプロファイルを分けて上記の設定を用意しておくと、起動時に使い分けができてよいと思われる。

![iterm4.png](https://qiita-image-store.s3.amazonaws.com/0/86449/91b65118-bc40-05ad-7ad8-e39ae68d81bb.png)

![iterm5.png](https://qiita-image-store.s3.amazonaws.com/0/86449/5e4c21f8-1ead-bac9-3d36-800e8a56a6ab.png)
アプリが勝手に起動する？非同期処理後にContext.startActivity呼び出しは注意

AndroidでActivityの起動は`Context.startActivity`メソッドにIntentを渡して行うと思います。  
この処理を非同期処理後に実行しているとアプリがバックグラウンドにいても、本処理が呼ばれて勝手Activityが起動します。  
ユーザからすると勝手にアプリが起動するので煩わしく感じるかもしれません。  
特に、起動時にSplashのActivityが表示されて、その後にメインのActivityが表示される構成で、この振る舞いをしがちなので、注意が必要です。
Enumerizeの値のクラスにカスタムクラスを利用する

enumerize-2.1.0で試しています。

`value_class`というREADMEに記載されていないオプションを利用すると、Enumerizeの値のクラスを`value_class`で指定したクラスに差し替えることができる。[^1][^2][^3]

[^1]: けっこう前から使ってたけど知らなかった。。
[^2]: https://github.com/brainspec/enumerize/blob/v2.1.0/lib/enumerize/attribute.rb#L14
[^3]: https://github.com/brainspec/enumerize/blob/v2.1.0/test/attribute_test.rb#L22

```ruby

# Enumerize::Valueを継承するとi18n関連のメソッドもついてくるので便利
class Role < Enumerize::Value
end

class User
  extend Enumerize

  enumerize :sex, in: [:male, :female]
  enumerize :role, in: [:user, :admin], value_class: Role
end

User.sex.values.first
# => "male"

User.sex.values.first.class
# => Enumerize::Value

User.role.values.first
# => "user"
User.role.values.first.class
# => Role  <- value_classで指定したクラスになっている。
```

べんりっぽい。

### リッチなvalue_classを作る

Enumerize::Valueのコンストラクタを確認してみると次のようになっている

```ruby
# https://github.com/brainspec/enumerize/blob/v2.1.0/lib/enumerize/value.rb#L9
def initialize(attr, name, value=nil)
end
```
`attr`は`Enumerize::Attribute`のインスタンス。`name`, `value`は`enumerize :role, in: [:user, :admin]`で言う所の`in:`の値が入る。実装はこんな感じ

```ruby
# https://github.com/brainspec/enumerize/blob/v2.1.0/lib/enumerize/attribute.rb#L15
@values = Array(options[:in]).map { |v| value_class.new(self, *v) }
```

この実装からすると、`in:`に配列の配列を渡すことによって、valueにいろんな情報を持たせるとこができそうだ。
試しにJava TutorialのEnumのサンプル[^4]をEnumerizeで実装してみる。

[^4]: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

```ruby
class Planet < Enumerize::Value
  VALUES = [
    # name       value  mass        radius
    [ :mercury,  1,     3.303e+23,  2.4397e+6  ],
    [ :venus,    2,     4.869e+24,  6.0518e+6  ],
    [ :earth,    3,     5.976e+24,  6.37814e+6 ],
    [ :mars,     4,     6.421e+23,  3.3972e+6  ],
    [ :jupiter,  5,     1.9e+27,    7.1492e+7  ],
    [ :saturn,   6,     5.688e+26,  6.0268e+7  ],
    [ :uranus,   7,     8.686e+25,  2.5559e+7  ],
    [ :neptune,  8,     1.024e+26,  2.4746e+7  ],
  ]

  G = 6.67300e-11

  attr_reader :mass, :radius

  def initialize(attr, name, value, mass, radius)
    @mass = mass
    @radius = radius

    super(attr, name, value)
  end

  def surface_gravity
    G * mass / (radius * radius)
  end

  def surface_weight(other_mass)
    other_mass * surface_gravity
  end
end

class Hoge
  extend Enumerize

  enumerize :planet,
            in: Planet::VALUES, default: :earth, value_class: Planet,
            predicates: { prefix: true }

  def initialize(planet)
    self.planet = planet
  end
end

Hoge.new(:jupiter).planet_jupiter?
# => true

Hoge.new(:jupiter).planet.class
# => Planet

earth_weight = 175
mass = earth_weight/Hoge.planet.find_value(:earth).surface_gravity

Hoge.planet.values.map do |planet|
  [planet, planet.surface_weight(mass)]
end
# => [["mercury", 66.10758266016366], ["venus", 158.374842472183], ["earth", 175.0], ["mars", 66.27900720649755], ["jupiter", 442.84756696175464], ["saturn", 186.55271929202416], ["uranus", 158.3972598931494], ["neptune", 199.20741268219018]]
```
うまくいってる。
npm + Riot.jsで全部やる

# まえがき
最近いろいろやっています。
とりあえず流行ってるっぽいフロント技術に触れてみたりとか。
本当にいろいろありすぎてちょっと疲れてきてますが、私にとってはこれだ！となってテンション上がってきているのがnpm (run) + Riotです。

# やること
全部やる、と書いていますが、実際にやることはフロントエンドとしてはもはや定番の以下項目です。

- jsはbabelを使用してes2015で書く
- cssは好きなプリプロセッサを使う（私はstylus）
- ファイルはwatchして自動ビルド
- ビルドされたらライブリロード

※ここに記述するのは、とりあえずriotいれてみたら上記のことが数分で出来てしまったため、テンション上がって書残す、雑なメモです。

# 準備

## モジュール編
必要なモジュールをnpmでインストールします。
以下に私が入れたモジュールを記述致しますが、cssプリプロセッサは好きなものを入れてください。

```
  "dependencies": {
    "babel-core": "^6.24.1",
    "babel-preset-es2015-riot": "^1.1.0",
    "browser-sync": "^2.18.8",
    "riot": "^3.4.1",
    "stylus": "^0.54.5"
  },
```

## ソースファイル編
これはRiotの公式をご覧ください。（私はまだガイドの序盤・・・）
http://riotjs.com/ja/

tagファイルの記述するscriptタグとstyleタグは以下のようにします。

```
<script type="es6">
  ...

<style type="stylus">
  ...
```

## package.json編
npm run scriptを書きます。

```
  "scripts": {
    "start": "npm run riot & npm run server",
    "riot": "node_modules/.bin/riot tags js/tags --type es6 --style stylus -w",
    "server": "node_modules/.bin/browser-sync start --server --files 'js/**/*.*'"
  },
```

ライブリロードのトリガーとするファイル群をここでは ```js/**/*.*``` としていますが、環境に合わせて変更してください。

# 実行
```
npm start
```
ターン！！！！！！！

ターン！すると今回やりたかったことが出来ているはずです。

## あとがき
最近プロジェクト毎にgulpを書くのが辛くなってきて、npm run scriptに触れてみたんですが、これは楽々でした。
そして今回Riotをやろうと入れてみたら、もう内部に全部組み込まれているじゃありませんか！
AltJSやCSSプリプロセッサの使用は当たり前になってきていて、モジュールもそのように組まれているんですね。
ありがたい限りです。
iOSでCache.dbにデータを保存させない

## 背景

* iOSアプリのセキュリティ診断を受けた時に次のような指摘を受けました。

>
Cache.dbにWebAPIリクエストに使っているメールアドレス、パスワードのキャッシュが残っている。
パス：<Application_home>/Library/Caches/<bundleId>/Cache.db


端末に平文でメールアドレス、パスワードが残っているのはよろしくないというご指摘です。  
もちろん通信はHTTPSを使いで暗号化していますが、Cache.dbには平文で残ってしまいます。

## 解決方法

先に結論ですが、アプリ起動時に次の処理を実行することで、Cache.dbにデータを残さないように実装できました。

```swift
URLCache.shared.diskCapacity = 0
URLCache.shared.memoryCapacity = 0
```

以下では、解決に至るまでに行ったことを記載します。

## Cache.dbの確認

本当に平文で残っているのか確認します。

### Cache.dbファイルを探す

* Simulatorでアプリ起動
* Xcode > Windwos > Devices から対象SimulatorのIDを確認
* Simulatorのデータがある下記に移動  
`~/Library/Developer/CoreSimulator/Devices/<確認したSimulatorのID>/`
* 更にその下にあるアプリ一覧のディレクトリに移動  
`./data/Containers/Data/Application/`
* アプリのUUIDを特定する方法はわからなかったのでこのディレクトリ配下でアプリのbundleIdを検索

これでCache.dbが見つかりました。  
なお、アプリのUUIDは一定時間経過すると変更されるので注意してください。  

### Cache.dbの中身を確認

* sqliteでCache.dbを開く
* テーブル一覧、スキーマ一覧を確認
* スキーマ名から`cfurl_cache_blob_data`テーブルの`response_object`スキーマを疑う
* `cfurl_cache_response`テーブルを検索し、対象リクエストの`entry_ID`を取得
* 取得した`entry_ID`で`cfurl_cache_blob_data`テーブルを検索
* `response_object`スキーマの型はBLOBなので以下のクエリを使用

```
select entry_ID, hex(response_object) from cfurl_cache_blob_data where entry_ID = 1;
```

* 得られたデータを文字列に変換

これで指摘された値を確認することが出来ました。

## 補足1: NSURLRequest.cachePolicyで制御できないか

* [こちらの記事](http://qiita.com/ryounagaoka/items/b637562568ce747e7249)にあるようにcachePolicyにNSURLRequestReloadIgnoringLocalCacheDataを設定するとキャッシュを無効にできます。
* ただしこの設定はリクエストにキャッシュを使用しないだけで、Cache.dbにデータは残ります。


## 補足2: WebViewのキャッシュは影響を受けるか

* 少しパスは違いますが[こちらの記事](http://qiita.com/tenntenn/items/eab6d12b6ca1f228659b)にあるようにCache.dbにはWebViewのキャッシュも残るという記事がいくつかあります。
* 今回のアプリはWKWebViewを使用しましたが、指摘されたCache.dbにWebViewのキャッシュは書き込まれていませんでした。
* そのため、WebViewのキャッシュに関しては今回の対応で影響を受けないと判断しています。

## 参考にしたページ

* [http://stackoverflow.com/questions/9712551/finding-a-saved-file-on-the-simulator/26241363#26241363](http://stackoverflow.com/questions/9712551/finding-a-saved-file-on-the-simulator/26241363#26241363)
* [http://qiita.com/tenntenn/items/eab6d12b6ca1f228659b](http://qiita.com/tenntenn/items/eab6d12b6ca1f228659b)
対githubでも、git mirrorを上手にやる

# gitのmirror便利っぽい

gitは複数のremote repositoryを扱えるが`--mirror`オプションでミラーリングも行える。

レポジトリaaaaaをミラーリングして、bbbbbというレポジトリ名で運用したいときは、

```shell-session:設定
$ git clone --mirror git@github.com:aaaaa/aaaaa.git
$ cd aaaaa.git/
$ git remote add --mirror=push other git@github.com:bbbbb/bbbbb.git
```

```shell-session:同期
$ git remote update
$ git push other
```

便利っぽい。


# github のmirrorでびっくりするところ

ただ、githubの場合はちょっとびっくりすることがあって、
プルリクエストが存在するgithubレポジトリをcloneした後、pushするとこんなwarningが出る。

```shell-session:warning出る
$ git push other
* [new branch]      hoge -> hoge
! [remote rejected] refs/pull/1/head -> refs/pull/1/head (deny updating a hidden ref)
! [remote rejected] refs/pull/1/merge -> refs/pull/1/merge (deny updating a hidden ref)
```

ぶっちゃけ実害はないのだが、warningは気になる。
このwarningが起きる原因は、githubがプルリクを保持するためのrefsを保持しているが、
これはreadonlyでpushするときは上書きできないからのようだ。
git-show-refすると、手元にrefsとして存在しているのがわかる。

```shell-session:refs/pullがいる。
$ git show-ref
c96b935f0f260aefae0aae4dec11adc79da948bf refs/heads/hoge
f911ddb5423cb616795f0445dd0ee82ae78d26d8 refs/heads/master
c96b935f0f260aefae0aae4dec11adc79da948bf refs/pull/1/head
9e76fd5f566430c5cd53e761a3869b4971e5b78a refs/pull/1/merge
```

# 対策

まず、git remote updateのときに取ってくるrefを限定してやればよい。
ブランチだけ取ってきたければ、以下のように設定すれば良い。

```shell-session:追加設定
$ git remote set-branches origin 'heads/*'
```

すると、レポジトリのconfigはこんな感じになる。
fetchするブランチをフィルタする効果があるようだ。

```config:aaaaa.git/config
[core]
        ....
[remote "origin"]
        url = git@github.com:aaaaa/aaaaa.git
        mirror = true
        fetch = +refs/heads/*:refs/heads/*
[remote "other"]
        ....
```

ブランチとタグを取ってきたければ、以下のように設定すれば良い。

```shell-session:追加設定2
$ git remote set-branches origin 'heads/*' 'tags/*'
```

ただ、ローカルに出来てしまった、refs/pullは、これでは消えないので、
以下のコマンドで消せばよい。

```bash:refs/pullを消す
git for-each-ref --format="ref=%(refname)" --shell refs/pull | \
while read entry
do
  eval $entry
  git update-ref -d $ref
done
```

再度試せば、warningが出なくなる

```shell-session:OK!
$ git push other
Everything up-to-date
```

# 最初から上手にやるには。

git cloneの時にオプションが指定できるので、こんな感じ。
ただし、mirrorオプションは自動でfetch=refs/*:refs/*を追記してしまうので、mirrorオプションの代わりにbareオプションを使った上で、--configオプションで自力でmirror=trueする。

```shell-session:mirroringレポジトリの作成
$ git clone --bare --config remote.origin.fetch='+refs/heads/*:refs/heads/*' --config remote.origin.mirror=true git@github.com:aaaaa/aaaaa.git
$ cd aaaaa.git/
$ git remote add --mirror=push other git@github.com:bbbbb/bbbbb.git
```

```shell-session:同期
$ git remote update
$ git push other
```


# ぼやき

git cloneの`--mirror`オプションは`--config`に`remote.origin.fetch=...`が追加されたら、`--bare`と同じ挙動をしたらいいんじゃないかとおもう。

```
git clone --mirror --config remote.origin.fetch='+refs/heads/*:refs/heads/*' git@github.com:aaaaa/aaaaa.git
```
だと、
生成されるconfigは以下のようになってしまって、初回の自動fetchのときに結局refs/pullが入ってしまう。

```config:aaaaa.git/config
[core]
        ....
[remote "origin"]
        fetch = +refs/heads/*:refs/heads/*
        url = git@github.com:aaaaa/aaaaa.git
        fetch = +refs/*:refs/*
        mirror = true
[remote "other"]
        ....
```
R {dplyr} 0.5.0 新関数

### case_when関数
dplyrをversionを新しくしたついでに何が追加されたかみていると
case_when関数というものが追加されてので使い方を確認しておく([URL](https://cran.r-project.org/web/packages/dplyr/dplyr.pdf))。

例えば

```
case_when(
  iris$Species == "setosa" ~ "1",
  iris$Species ==  "versicolor" ~ "2",
  iris$Species == "virginica" ~ "3" 
)
```
と書くと実行結果は以下の

```
 [1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"
 [26] "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"
 [51] "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2"
 [76] "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2"
[101] "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3"
[126] "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3"
```

ようになる。また、

```
case_when(
  iris$Sepal.Length < 5.5 ~ "1",
  iris$Sepal.Length < 6.5 ~ "2",
  iris$Sepal.Length >= 6.5~ "3" 
)
```

以下のように実行結果がなる。

```
  [1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "2" "2" "1" "1" "2" "1" "1" "1" "1"
 [24] "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "2" "1" "1" "2" "1" "1" "1" "1" "1" "1" "1" "1" "1"
 [47] "1" "1" "1" "1" "3" "2" "3" "2" "3" "2" "2" "1" "3" "1" "1" "2" "2" "2" "2" "3" "2" "2" "2"
 [70] "2" "2" "2" "2" "2" "2" "3" "3" "3" "2" "2" "2" "2" "2" "2" "1" "2" "3" "2" "2" "2" "2" "2"
 [93] "2" "1" "2" "2" "2" "2" "1" "2" "2" "2" "3" "2" "3" "3" "1" "3" "3" "3" "3" "2" "3" "2" "2"
[116] "2" "3" "3" "3" "2" "3" "2" "3" "2" "3" "3" "2" "2" "2" "3" "3" "3" "2" "2" "2" "3" "2" "2"
[139] "2" "3" "3" "3" "2" "3" "3" "3" "2" "3" "2" "2"

```

カテゴリー変数を作るには便利な関数だと思う。ただし、返り値がリストで帰ってきているのが注意点ぐらいだと思う。
UI勉強会: インターフェースデザインの実践教室 II部 デザイン(1)

## 10章 スケッチとプロトタイプ

大まかな全体構造を、費用をかけずに考える

フローダイアグラム
　ユーザーの手順を書く。重要なものに絞った方がよい
絵コンテ
　分岐を無視し、インタラクションの詳細に焦点を当てる
↓
スケッチ
　いきなり細かいプロト作成をしないで、ラフに各画面の基本デザインを感がる
↓
ワイヤーフレーム
　枠組み、大きさを考える。テキストも考え始める
↓
モックアップ
　視覚系の細部を考える

> プロトタイプツールでモダンでビジュアルにやらなきゃ！（形から入ろうとする）
> 変更が追いつかない
> 面倒でパワポに戻る。レガシーでインビジブルな生活
> プロトタイプツールでモ(無限ループ)
> とならないために箇所を絞ったり工夫は要るだろう

## 11章　ペーパープロトタイプテスト

スケッチ、ワイヤーフレーム or モックアップを用意する
上記で見えた問題点を中心にテストするタスクを選定する
　※小チームが広範囲にやるのはお勧めしないと書かれている
　※しかし余裕があればとても有用だとも書かれている
ペーパープロトタイプを作る
　・使いそうな画面を漏れなく用意する
　・周辺のUI要素も並べる
テスト準備
　・3-4人
　・テストとテストの間に2hくらい空けて、場合により問題点を即修正
　・録画してメモを取り、メモには時間をつけると再生が省力化できる
テスト実施
　・コンピューター役がプロトタイプ画面を更新する
　・ファシリテーターはヒントを与えて影響してしまわないように注意
　・質問は頻繁にせずテスト後まで待つ方がよい

> こうしたほうがいいよと提案してもいやこうじゃないと、となれば従うわけだけど
> それは業務を熟知したあなたがたの感覚であって、
> 世に出してみたら意見が違ってやっぱり戻して・変えてというパターンは多い

## 12章 リアリズム

記号はリアルにしすぎない
実物を再現するとメンタルモデルを形成しやすい
やりすぎ注意 デジタルの自由度も活かそう

> 最近のアイコンが全部ボタンに見えて押してしまうんだけど
> たまに違う

## 13章 ナチュラルUI

ものに対して直接操作するデザインは分かりやすい
ジェスチャー(スワイプなど)にはただちにフィードバックを
取り消し操作も考慮する
　→ナチュラルUIで実現するには？
　→現実世界に倣う・普及しているアプリを参考にする・ユーザビリティテストで反応を調べる

## 14章 フィッツの法則

移動時間、距離、対象の大きさの関係を定義したもの
- クリックしやすくしたいものは大きく、そうでないもの（破壊的操作など）は小さく
- 端はとてもクリックしやすい(タッチパネルは違う)
- カーソル移動に長辺を合わせるとクリックしやすい(横移動なら横長）
- 小さい対象物同士は間を空ける

> 左上のハンバーガーメニュー何とかならないかね
> 親指の付け根が痛い(右手方手持ち)

## 15章 アニメーション

### 目的
- 状態変化に気付かせるために使う
- メンタルモデルを構築してもらうために使う

### 注意
- 重要でないものに使わない

### その他ポイント
- 移動距離がある（目安自身の半分)ときはものを伸ばしたりぶれさせたりすると効果がある
- 誇張もあり
- 加速減速もあり

> 13章と併せ控えめ・効果的に使いたいところ。

## 16章 一貫性

- 何をするかすぐにわかれば、要素の見た目を同一にする必要はない
- 動作は、標準的なもの(OSなどの)との一貫性を持たせる
　ユーザーは既知のメンタルモデルを適用するから
- 標準と違う動作をするものは、標準と違うデザインにする

## 17章 発見可能性

### ユーザーが機能を見つけられるか、について
- 隠す要素を決め、重要な要素にウェイトを付ける
- いつ見せるかも考慮。特定の場面だけ使う機能はダイアログ、など

### 見せ方
- 色や大きさ
- メンタルモデルに合致するような置き場所
- 検索機能を提供する
- アニメーション

> あれもこれもに応えざるを得ない結果、並べれば分かりにくい・ひっこめれば気付かないの繰り返し(ジレンマ)

## 18章 集中を妨げない

- 緊急でないことで割り込み・意思確認をしない
- 次の操作が明らかならユーザーの代わりに決定する
- できなければなるべくまとめて意思確認する

## 19章 取り消し機能

- 警告は読まれないことが多い
- 取り消せたほうがよい
- 実装できないときは、実行遅延で一時的な取り消しを可能にする

## 20章 モード
アプリケーションやウィンドウの状態

- 自明でないものは混乱を招く→視覚効果・アニメーションで補う
- 予期せぬものは混乱を招く
　　割り込んできたモーダルダイアログのデフォルト動作、など
- 解除方法が不明なものは混乱を招く
- 上記に注意してモードを使うと使い勝手は良くなる
- 疑似モード(キーを押している間だけ、といったユーザーに意識させ続けるもの)も視野に入れる

> 凝ったjs求められて作ってても混乱することしばしば
ファイルを引数に取るコマンドにWeb上のファイル（URL）を開いて読ませる

bash, zshのProcess Substitutionという仕組みを使うと、コマンドにリモートファイルを読み込ませることができます（素のshじゃできませんよ！）。

Process Substitutionとは

```bash
command2 <(command1)
```

と記述すると、

```bash
command1 > temp_file
command2 temp_file
rm temp_file
```

と書いたのと同等の実行結果になる仕組み（環境次第で一時ファイルではなく一時名前付きパイプが使われるかも知れません）。これを使うと、`diff`コマンドにWebページを比較させるとかが一時ファイルなしに書けるようになります。

```bash
diff <(curl http://... ) <(curl http://... )
```

逆に、URLへ出力（POST）させることもできる
--
Process Substititionには上記と逆の書き方もできます。

```bash
command1 >(command2)
```

と記述すると、

```bash
command1 temp_file
command2 < temp_file
rm temp_file
```

と同等。一方curlコマンドは標準入力をPOSTできます。 http://qiita.com/hash/items/eb7bb707b36852bdfb95
だから、最初のより見た目ごちゃつくものの、

```bash
tee >(curl http://... -X POST -d @-)
```

これで出力先をファイルでなくURL POSTにできます。
flamingoを使ってPCサイトをスマホサイトに最適化してみた 1/4

## ◆はじめに

昨今、SEO(Search Engine Optimization)やMFI(Mobile First Index)という言葉をよく耳にするようになってきました。 
しかし、PCサイトとは別にスマホサイト作るのも運用するのもってだるいわ〜って思っている方はいませんか？ 
そこでflamingoというサービスを利用し、実際にPCサイトをスマホサイトに最適化してみようと思います。

## ◆そもそもflamingoって？

flamingoは既存のPCサイトをレスポンシブウェブのように同一URLでマルチデバイスに最適化されたUI/UXに対応させるための開発・運用プラットフォームです。

もっと簡単に言うと、PCサイトと同じURLでスマートフォンやタブレットなど、閲覧する端末によって表示させるソースコードを変えることができるサービスです。

## ◆flamingoのメリットは？

・サイトへのアクセス数が多いほど、flamingoでの変換に向いています。 
・PCに影響されないHTMLの作成ができます。 
・HTMLやCSSだけでなく、JavaScriptも編集可能です。 
・管理画面などのUIがわかりやすい、見やすい、操作しやすい！ 

その他にも
・スマホに必要のない情報は読み込まない 
・既存のPCサイトに変更を加えると、スマホサイトに手を加えることなく内容が変更される。 
といったことがメリットに挙げられるでしょう。

## ◆リリースまでの流れ
flamingoでリリースするまでのザックリとした道のり

1.アカウント登録 
2.flamingoにPCサイトを登録 
3.PCサイトにflamingoスイッチャーを入れる 
4.エディタ画面でソースコードを編集 
5.リリース 

## ◆とりあえず、登録してみる
まずは、登録。  
[flamingo](https://cp.flamingo.gomobile.jp/)

![login.png](https://qiita-image-store.s3.amazonaws.com/0/170776/5a814ec4-38ea-78ea-0cfb-5d112a74448b.png)

登録は『***名前***』『***メールアドレス***』『***電話番号***』の3つが必須になっています。 
他にも、***Google+***でログインも可能になります。

今回はフリーアカウントでスマホサイトを作成します。
フリーアカウントの場合、既存のPCサイトを1つだけ最適化できます。

## ◆flamingoCPでできること
ログイン後に表示されるページがflamingoCPです。  
![flamingo_CP.png](https://qiita-image-store.s3.amazonaws.com/0/170776/afe9e0ce-5cef-d96c-5047-cf3ffba909e7.png)

flamingoCPでは、***アカウントやプロジェクトの管理***、***モバイルウェブサイトを配置、公開***することができます。

フリーアカウントだとPCサイトを1つだけなので、開発したスマホサイトのソースコードをWeb上に表示させる等の管理ができる画面といったところでしょうか。

複数人が関わるようなもう少し大きなPCサイトになりますと、アカウントの管理ができたり、複数のPCサイトが関わるのであれば、それぞれのサイト(プロジェクト)管理が行うことができます。 
既存のPCサイトが1つでプロジェクトが1つに、2つのPCサイトでプロジェクトが2つになるということです。

※アカウントの管理とは？ 
例えば、『Aさんにはソースコードを編集する権限は与えないで、閲覧のみに。』とか『Bさんにはソースコードの編集権限を与えるが、リリース(Webサイトにアップする)権限は与えない』とかとか....。 
人によって様々な権限を与えたり、与えなかったり刷ることが可能です。 
複数人で開発する場合は大変便利な機能です。
## ◆とりあえず、PCサイトを登録してみる
flamingoにログインをし、表示されたflamingoCPを確認すると『プロジェクトを作成』というボタンが右下にあります。このボタンからPCサイトを登録します。
表示されたページには、タイトル、説明、ウェブサイトのURLなどが書かれています。
それぞれを記載し、『完了』ボタンを押します。
![flamingo_CP2.png](https://qiita-image-store.s3.amazonaws.com/0/170776/c88d1505-1270-601e-9c00-1e9b391a7245.png)

## ◆flamingoスイッチャーをPCサイトに入れてみる
新しいプロジェクトを登録した後に、JavaScriptが表示されているページに遷移します。このページでは、PCサイトにflamingoスイッチャーが挿入されているかをチェックします。 
flamingoを利用するためにはまずこのスイッチャーをPCサイトの***html内のheadタグ***に挿入する必要があります。
このページに表示されているJavaScriptをPCサイトのhtmlにコピペすることが、最適化の第一歩です。
![flamingo_CP3.png](https://qiita-image-store.s3.amazonaws.com/0/170776/3235bddd-39d7-59ea-1269-6eea836fcd4f.png)

***
今回はここまで。 
次回は、早速開発していきます。
IBActionの引数が邪魔だと思ったら

UIButtonやUIControlなどのIBActionを紐付けすると引数が自動でついてくる。

``` swift
    @IBAction private func Tap(_ sender: Any) {
        ...
    }
```
しかし、UIButtonではこの引数は大半使わないしできるなら消したい。

そういうときは以下のようすると自動で引数がつかなくなります。

Interface BuilderからIBActionを紐付けするときに`Argument`の項目を`None`にする
<img width="275" alt="スクリーンショット 2017-04-12 11.31.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/69901/bee63af6-b2af-104a-ea7e-c68c243b88f8.png">


※`UIGestureRecognizer`ではこの方法は使えませんでした。
PRS-0/1/2 のコード規約概要


## PSR 0/1/2 の関係性

- PSR-0 「名前空間に関する規約」
- PSR-1 「名前空間 クラスについては、PSR-0に準拠すること」
- PSR-2 「PRS-1のコーディングスタイルに準拠すること」

## PSR-0

- 名前空間は`\<Vendor Name>\(<Namespace>\)*<Class Name>`とすること
- 必ずトップレベルのベンダー名を持つこと。
- 名前空間のセパレータ `\` をディレクトリ区切りとして、適切にファイルシステムからクラスを読み込める状態であること
- 拡張子は`.php` とする。

## PSR-4

- PSR-0 との併用が可能
- クラスには インターフェイスやトレイト及び同様の構造を含む。
- `_` に特別な意味を持たせることをやめる。
- クラス名は全て大文字小文字を区別すること。

## PSR-1/2

### 命名規則

- アンダースコアはじめの変数名は禁止
- 変数名はスネークケースも、キャメルケースもどっちもOKだけど、適切なスコープ内での統一はとること
- クラス名は 先頭大文字のキャメルケース
- クラス定数は アンスコ 区切りの大文字で
- メソド名は 先頭小文字のキャメルケース


### 制御構造 

- 制御構造の開始時には スペースを一つ開ける(`if (true) {`)
- 制御構造の `{` は同じ行に記述する。
- 制御構造の `}` は最終行の次の行に記述する。
- `else if` ではなく `elseif` で
- `break`しないswitch 文には その旨を明示的にコメントする。

````
<?php
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
} else {
    // else body;
}
````


````
<?php
foreach ($iterable as $key => $value) {
    // foreach body
}
````

````
<?php
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}
````

### クラス

- アクセス修飾子(public/protected など)は必須
- abstract / final はアクセス修飾子の前
- static はアクセス修飾子の後
- 制御構造の`()`と異なり、メソドや関数呼び出しの`()`の前にはスペースをけてはいけない。
- メソドや関数呼び出しの引数リストが複数行に渡る場合、インデントを付けて１行に一つの引数を定義する。閉じカッコは最後の引数の次の行に１行で記述する。

- クラス、メソドの `{` は次の行に記述する。
- メソドの引数リストは `hoge($arg1, &$arg2, $arg3 = [])` のように `,` の後ろにスペースを添えて記述する
- 引数が多い場合は、最初の引数から行を変え、インデントを付けて１行に一つの引数を定義する。 ブロックの開始行は `){`とする。

- extends と implements は同じ行に記述する。
- implements のリストは、インデントを付与して 複数行に分割することも可。ただしその場合１行に一つのインターフェイスを記述する。

````
class Hoge extends Piyo implements
    \Fooable,
    \Barable
{
````

### レイアウト

- 名前空間定義の後には空行を挟む
- use 定義ブロックの後にも空行を挟む


### その他

- 文字コードは utf8 でBOMなし
- 改行コードは LF
- インデントはスペースで4つ分
- ファイル最後には必ず空行
- PHPのみが書かれたファイルでは ?> を省略する。
- クラス、関数などの宣言ファイルと、処理系のファイルは分ける
- 一行に複数のステートメントは禁止
- 予約後は `true`など小文字で表示する。


## 出展

http://www.php-fig.org/psr/psr-0/ 
http://www.php-fig.org/psr/psr-1/ 
http://www.php-fig.org/psr/psr-2/ 
http://www.php-fig.org/psr/psr-4/
[Visual Studio Code][Windows] 端末をGit Bashに設定する

VSCodeの統合端末を `Git Bash` に設定する方法メモ（最近のアップデートで自動設定の確認もでるようになった気はしますが）

# 設定方法

`"terminal.integrated.shell.windows"` を以下のように設定します。
(`git-bash.exe` は別にウィンドウが表示されるので、 `bin/bash.exe` の方を指定して下さい。

```json:端末のユーザー設定の追加
    "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe"
```

# 設定後

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/3b4fb0f8-086a-0f84-14fb-0fb94cc263bd.png)

# 参考
[Terminal with Git bash · Issue #7690 · Microsoft/vscode](https://github.com/Microsoft/vscode/issues/7690)
Selenium環境構築メモ (ruby, ubuntu)

Selenium 環境を作るためのメモ

# 環境
- Ubuntu 16.04 (AWS EC2)

# 構築
```bash
sudo apt-get install ruby ruby-dev build-essential chromium-chromedriver xvfb
sudo ln -s /usr/lib/chromium-browser/chromedriver /usr/local/bin
sudo gem install --no-ri --no-rdoc headless selenium-webdriver
```
adbでAndroidの言語の設定画面を開く


こんにちはsekitakaです。

多言語対応したアプリを開発しているときは、ちょいちょい言語を切り替えてアプリの動作を確認したい時がありますよね。
Xcodeは起動時に言語を設定するオプションがあるのですが、Android Studioにはそういった設定が見当たりません。
設定アプリをいちいち探して言語の設定まで移動するのも、頻繁にやる操作としては面倒ですね。

今回は少しでも言語切り替えを楽にするためのコマンドの紹介です。
以下のコマンドでダイレクトに言語の設定画面が開けます。

```
adb shell am start -a android.settings.LOCALE_SETTINGS
```
絵文字が格納できないのでmysqlのテーブル単位で文字コードを変更したい

絵文字の入った文章をmysqlに格納しようとしたらエラーが出てしまった。
データベースの文字コードを変更したい。

##デフォルトの確認
```
mysql> show variables like "%char%";

+--------------------------+------------------------------------------------------+
| Variable_name            | Value                                                |
+--------------------------+------------------------------------------------------+
| character_set_client     | utf8mb4                                              |
| character_set_connection | utf8mb4                                              |
| character_set_database   | utf8mb4                                              |
| character_set_filesystem | binary                                               |
| character_set_results    | utf8mb4                                              |
| character_set_server     | utf8mb4                                              |
| character_set_system     | utf8                                                 |
| character_sets_dir       | /usr/local/Cellar/mysql/5.7.13/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------+
8 rows in set (0.00 sec)
```
ちゃんとutf8mb4になってる。。

##絵文字を格納したいテーブルの文字コード確認
```
mysql> show create table t_name\G

*************************** 1. row ***************************
...
...
DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
```
utf8になっていた！

#このテーブルの文字コードをutf8mb4に変更
```
mysql> alter table t_name convert to character set utf8mb4;

Query OK, 180 rows affected (0.08 sec)
Records: 180  Duplicates: 0  Warnings: 0
```

確認する

```
mysql> show create table t_name\G

*************************** 1. row ***************************
...
...
DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
```

無事に変更され、絵文字も格納できました。
Raspbian(Raspberry Pi 3)にビルドせずにPhantomjsを入れる

PaspbianでRubyのCapybaraを使いたかった。
自分でビルドすると数日かかる人もいるそうで、ビルドすると下記のような警告が出る。

```
~/phantomjs $ ./build.py 
----------------------------------------
               WARNING
----------------------------------------

Building PhantomJS from source takes a very long time, anywhere from 30 minutes
to several hours (depending on the machine configuration). It is recommended to
use the premade binary packages on supported operating systems.

For details, please go the the web site: http://phantomjs.org/download.html.

Do you want to continue (Y/n)? n
```

なのでビルド済みのものを導入する。

## 配布元

[phantomjs-on-raspberry/rpi-2-3/wheezy-jessie/v2.1.1 at master · fg2it/phantomjs-on-raspberry](https://github.com/fg2it/phantomjs-on-raspberry/tree/master/rpi-2-3/wheezy-jessie/v2.1.1)

## 手順

```
sudo apt-get install libfontconfig1 libfreetype6 libpng12-0
curl -o /tmp/phantomjs -sSL https://github.com/fg2it/phantomjs-on-raspberry/releases/download/v2.1.1-wheezy-jessie/phantomjs
sudo mv /tmp/phantomjs /usr/local/bin/phantomjs
sudo chmod a+x /usr/local/bin/phantomjs
```

## 動いた

```
$ phantomjs --version
2.1.1
```
Swift3で画面の向き変更を通知する

# Swift3で画面の向き変更を通知する

## 今回の目標
画面の向きが変更された場合にその変更を検知する

## 開発環境
- Xcode：8.2.1
- 言語：Swift 3
- OS：MacOS

## 画面の向き変更の通知のやり方
通知メソッドの中に端末の向きが変更された際に呼び出すもの(```UIDeviceOrientationDidChange```)があるので、それを利用します

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

override func viewDidAppear(_ animated: Bool) {
        // #selectorで通知後に動く関数を指定。name:は型推論可(".UIDeviceOrientationDidChange")
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.changeDirection), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 
    }

func changeDirection(notification: NSNotification){
    print("向きが変更されました")
}
```
ON_UPDATE_COMMAND_UI_RANGE

### 定数の定義

```test.cpp
#define ID_TEST1		30001
#define ID_TEST2		30002
#define ID_TEST3		30003
#define ID_TEST4		30004
#define ID_TEST5		30005
```

### メッセージマップ

```test.cpp
BEGIN_MESSAGE_MAP(COnUpdateCommandUiRangeDlg, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &COnUpdateCommandUiRangeDlg::OnBnClickedButton1)
	ON_COMMAND_RANGE(ID_TEST1, ID_TEST5, &COnUpdateCommandUiRangeDlg::OnCommandRange)
	ON_UPDATE_COMMAND_UI_RANGE(ID_TEST1, ID_TEST5, &COnUpdateCommandUiRangeDlg::OnUpdateCommandUiRange)
END_MESSAGE_MAP()
```

### 宣言

```test.h
afx_msg void OnCommandRange(UINT nID);
afx_msg void OnUpdateCommandUiRange(CCmdUI* pCmdUI);
```

### メッセージの送信

```test.cpp
void COnUpdateCommandUiRangeDlg::OnBnClickedButton1()
{
	SendMessage(WM_COMMAND, ID_TEST1);
}
```

### メッセージの処理
1回のSendMessageでON_COMMAND_RANGEとON_UPDATE_COMMAND_UI_RANGEの2回処理される

```test.cpp
void COnUpdateCommandUiRangeDlg::OnCommandRange(UINT nID)
{
	switch (nID)
	{
	case ID_TEST1:
		MessageBox(_T("OnCommandRange_ID_TEST1"), _T(""));
		break;
	}
}

void COnUpdateCommandUiRangeDlg::OnUpdateCommandUiRange(CCmdUI* pCmdUI)
{
	switch (pCmdUI->m_nID)
	{
	case ID_TEST1:
		MessageBox(_T("OnUpdateCommandUiRange_ID_TEST1"), _T(""));
		break;
	}
}
```
path.ymlの相対パス対応(3.1-α)

EC-CUBE3.1では、path.yml内のパスの記述が、相対パスに変更されます。

3.0.xでは、以下のように、絶対パスで生成されていました。

```path.yml
...

public_path_realdir: '/path/to/ec-cube/html'
image_save_realdir: '/path/to/ec-cube/html/upload/save_image'
image_temp_realdir: '/path/to/ec-cube/html/upload/temp_image'
user_data_realdir: '/path/to/ec-cube/html/user_data'

...

```

そのため、サーバ移行時や、開発環境から本番環境へ反映する際など、path.ymlを書き換える必要がありましたが、3.1からはすべて相対パス化され、パスの差異を意識する必要がなくなります。

3.1では、`%ROOT_DIR%`という変数で生成され、configのロード時にルートディレクトリに展開されます。

```path.yml
...

public_path_realdir: '%ROOT_DIR%/html'
image_save_realdir: '%ROOT_DIR%/html/upload/save_image'
image_temp_realdir: '%ROOT_DIR%/html/upload/temp_image'
user_data_realdir: '%ROOT_DIR%/html/user_data'

...

```

## 関連情報
- issue: https://github.com/EC-CUBE/ec-cube/issues/864
- pull request: https://github.com/EC-CUBE/ec-cube/pull/2234
Outlook2016にアドレス帳をインポートするやり方

をメモらせて頂きます。
```
ほげほげ殿,fuga@moi.co.jp,
```
とのcsvをインポートしようとしたが
ファイル使用中などのエラーが出て読み込めず。

これは一行目に項目を入れないとイケナイと予想したので
　https://www.ikt-s.com/windows-live-mail-outlook2016/
　予想元↑
項目の先頭に
```
名前,メールアドレス,
ほげほげ殿,fuga@moi.co.jp,
```
として
「名前」を「姓」にドラッグする
してインポート。
でそれっぽく出来るけど
連絡帳のグループ分けって出来ないのでしょうか？

名前の先頭に
```
名前,メールアドレス,
SOI社：ほげほげ殿,fuga@moi.co.jp,
```
ってやるしかないのでしょうか？

とメモ失礼します。
jsdoでconvnetjs その6

#概要
論理回路のプレイグランドを作ってみた。
or,and,xor,nor,nandを学習させる。
パーセプトロンの数と学習回数を指定。
時間とロスを表示する。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/C/e/C/CeCv.jpg?t=1491953446)

#成果物
http://jsdo.it/ohisama1/CeCv
指定したキーワードに着色してログなどを見やすくするフィルタ処理をperlで書く

# ログは色付けしたほうが見やすいけど、grep --colour は使いやすくないと思う

ログファイルをコンソールやターミナルで読むのは案外めんどくさいと思いませんか？ たとえばこんなふうにログを表示した時に文字が全部同じ色だから見づらいと思うのですよ。これは TeraTerm を使っているので URL だけは着色されていますが、それ以外の情報を流し見で把握することは難しく、多少なりとも「読む」努力が必要です。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/a7432af0-51d5-fd18-a0d8-612f63f864bb.png)

かといって grep --colour すると、指定したキーワードが色付けされるものの、キーワードが出現する行だけが抜き出されてしまいます。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/4faa8a8e-2dc2-f906-f1e1-92e4c67d2920.png)

しかし自分にとって色分けしたい状況は、tail -f でログをリアルタイムに流しつつ、その中で注意が必要と思われる箇所を労せずに認識したい、などの状況が多いのです。そうすると、出力はキーワードを含む行だけではなく、すべてを出して欲しいのです。

また複数のキーワードを着色しつつも色分けしたい。ここで最近の開発ツールやエディタを考えてみると、コードシンタックスに合わせて色付けしてくれるのが普通の動作ですが、それにくらべるとログの閲覧は微妙にイケてないです。

そこで、以下の要件で動作するスクリプトをサクッと作ってみました。

- 標準入力から与えられた文字列を対象にして、マッチした文字列部分に着色する。
- 文字列は複数指定可能とする。
- キーワードごとにそれぞれの色を変えて表示する。
- マッチしなかった行はそのまま素通しする。

この実装で実際に NONE や DIRECT の文字だけを着色したのがこちらのスクリーンショットです。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/aee876cb-00d8-03ac-3ccb-cccc038d7dc5.png)

# 実装

perl で 20 行程度のカンタンな実装です。本質的な部分は10行程度。

```perl:logcolored.pl
#!/usr/bin/perl
#
# 標準入力から渡された文字列の中に、
# このスクリプトへの引数で渡された文字列が含まれる場合は
# 着色して出力するスクリプト

$| = 1;

if ( $#ARGV > 5 ) {
  print "Please use within 6 keywords. abort.\n";
  exit 1;
}

while( <STDIN> ) {
  for ( my $i = 0 ; $i <= $#ARGV ; $i ++ ) {
    my $color=sprintf "%dm", $i + 31;
    s/$ARGV[$i]/\033\[1;$color$&\033\[0m/gi
  }
} continue {
  print $_;
}
exit 0;
```

gist にも上げました。

https://gist.github.com/kazinoue/0671d82f596519359b135638e33ccb69

# 使用例

## 着色したい文字列は6つまで指定可能

引数で6つまでの文字列を指定可能です。7つ以上の指定はエラーになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/3e8f7c10-efa4-765a-9e03-4d1ae9fa8733.png)

6つに制限しているのは、エスケープシーケンスの基本色8色のうち、黒と白を除外した6色で出し分けているからです。また、色は引数の位置によって自動的に決まります。ここらへんの仕様上の制限は最小限の実装で済ませるためなのですが、逆にキーワード毎に色を明示できないという不便さを伴っています。これは気が向いたらそのうち仕様を変えるかも。（たとえば TCP_MISS:red のような指定ができるようにするとか。）

## 正規表現も使えます

マッチングしたい文字列には正規表現が使えます。たとえばこんなふうに。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/0242c5a9-4be3-896f-7c6c-324c0ba50e5b.png)

そして正規表現が使えることににより、複数のキーワードを "キーワード1|キーワード2" のように指定することもできます。こうすると複数の文字列を同色でまとめられますから、7つ以上のキーワードに色を付けることもできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/4444c395-e29d-7bf2-f234-5f5d1b4f8b7d.png)


しかし "[0-9]" みたいな指定を２つめ以降のキーワードに指定すると出力が壊れます。これはエスケープシーケンスによる色指定の追加を行単位て個々の引数について実施していることが原因です。すでにエスケープシーケンスが設定済みの箇所に対して "[0-9]" にマッチした部分に更なる着色を行うと、そりゃ壊れて当然ですよねー。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/b56d8e36-c4fe-8c76-f6ec-3d53a8263dd6.png)

ただし、どうしてもこういう指定を行いたい場合は最初のパラメータに記述すれば大丈夫です。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/3bf9acd4-a04a-c7a6-1ff9-35f6e4e9bb4f.png)

このようにログのフォーマットによらず文字列のパターンマッチで着色するフィルタを利用すれば、ログを読む努力をせずに色だけで流し見できます。ログの視認性が向上しますから、いろいろ捗ると思います。
Custom Taxsonomy の色々

##taxonomyページの一覧テンプレート

    taxonomy-area-tokyo.php
    taxonomy-area.php
    taxonomy.php
    archive.php
    index.php

##taxonomyページのオブジェクト表示

```ruby:qiita.rb
$term_object = get_queried_object();
var_dump($term_object);

***

object(WP_Term)[4405]
  public 'term_id' => int 20
  public 'name' => string 'belt' (length=4)
  public 'slug' => string 'belt' (length=4)
  public 'term_group' => int 0
  public 'term_taxonomy_id' => int 20
  public 'taxonomy' => string 'gruff_bark' (length=10)
  public 'description' => string '' (length=0)
  public 'parent' => int 0
  public 'count' => int 2
  public 'filter' => string 'raw' (length=3)
```

##single.phpで属するtaxonomyを取得
色々あるけどこれがいいかも

```ruby:qiita.rb
$tax = get_the_taxonomies()

***

array (size=1)
  'arr' => string 'Arr: <a href="http://test.dev/orders/arr/belt">belt</a>。' (length=77)

***

var_dump(key(array_slice($tax, 0, 1, true)));

```

termを調べる場合はそのまま下記で

```ruby:qiita.rb
$post_term = get_the_terms($post->ID, $first_tax_key);

***
array (size=1)
  0 => 
    object(WP_Term)[4438]
      public 'term_id' => int 20
      public 'name' => string 'belt' (length=4)
      public 'slug' => string 'belt' (length=4)
      public 'term_group' => int 0
      public 'term_taxonomy_id' => int 20
      public 'taxonomy' => string 'arr' (length=10)
      public 'description' => string '' (length=0)
      public 'parent' => int 0
      public 'count' => int 5
      public 'filter' => string 'raw' (length=3)
***

$post_term[0]->name;

```

最初からget_the_term()で良くない？と思いがちだけど
get_the_terms( $id, $taxonomy );は taxonomyが必須になっている
複数のtaxonomyを運用していて、POSTがどのtaxonomyに属しているか調べるには上記が必要

##taxonomyページ条件判定

```ruby:qiita.rb
<?php is_tax( $taxonomy, $term ); ?>
```

##特定のtermの記事だけ取得する時の$argsの書き方

```ruby:qiita.rb
$args = array(
	'tax_query' => array(
		array(
			'taxonomy' => 'genre',
			'field' => 'slug',
			'terms' => 'jazz'
		)
	)
);
$postslist = get_posts( $args );
```
[Laravel Eloquent] クエリスコープのreturnに0やfalseを返すように記述してもBuilderインスタンスが返ってきてしまう

## 前提
+ Laravel5.4  
[参考情報](https://laracasts.com/discuss/channels/laravel/scope-query-unable-to-return-false-zero-instead-eloquent-builder-returns-an-object?page=1)は1～2年以上前なので、おそらく5.1LTSなど古いバージョンでも同じ仕様だと思われる。(未確認)

## 現象
> スコープはいつもクエリビルダインスタンスを返します。

上の記述は[日本語版ドキュメント](https://readouble.com/laravel/5.4/ja/eloquent.html#local-scopes)の記載である。
しかし、返り値に任意の値を渡せばクエリビルダインスタンス以外の値を返すことができる。

```php:たとえばこういうことができる
public function scopeRenderHogeHogeJson($query)
{
    $json = $query->get();

    /** JSONを加工するいろいろな処理 */
    
    return $json;
}
```

コントローラーやBladeでの記載量を気軽に減らすことができるため多用していたが、
```count()```を使ったクエリスコープが予期せぬ動きをした。

```php:アンチパターン的クエリスコープの記述
public function scopeCountNew($query)
{
    return $query
        ->whereBetween('created_at', [Carbon::today()->subDay(), Carbon::now()])
        ->count();
}
```

```php:アンチパターン的Blade側の記述
    @if($query->countNew())
        新着{{$query->countNew()}}件
    @endif
```

上記の処理、```count()```の件数が1件以上であれば期待通り動くが、
0件のときは```ErrorEXception```が発生する。

## 結論から言うと

> nickcl commented on 11 Aug 2014
> I can't think of any use case where you'd want to return anything (other than the builder object) from a scope.

引用元：https://github.com/laravel/framework/issues/5405

つまり、scopeで```$query```以外の値を返してはいけない。

先の例では、あくまでクエリスコープではクエリビルダを返すべきであって、

```php:正しいクエリスコープの書き方
public function scopeNew($query)
{
    return $query
        ->whereBetween('created_at', [Carbon::today()->subDay(), Carbon::now()]);
}
```

```php:正しいBlade側の記述
    @if($query->new()->count()) // そもそもBlade内に条件式を書くべきでないという説もある
        新着{{$query->new()->count()}}件
    @endif
```

という実装をすべきであったのだ。

## Builderインスタンス以外の返り値を記述しても期待通りの値が帰ってくる例

```php
public function scopeRet1
{
    return 1;
}

public function scopeRetTrue
{
    return true;
}

public function scopeRetObj
{
    return collect([1, 2, 3]);
}

//int(1)
Hoge::ret1()
//true
Hoge::retTrue()
//Collection[1, 2, 3]
Hoge::retObj()
```

あらゆるパターンを試したわけではないが、だいたいの値は問題なく返ってくる。

## 期待通りの値が返ってこない例
```php
public function scopeRet0
{
    return 0;
}

public function scopeRetFalse
{
    return false;
}

public function scopeRetNull
{
    return null;
}

//Builder
Hoge::ret0()
//Builder
Hoge::retFalse()
//Builder
Hoge::retNull()
```

PHP的に偽と評価される値を返すことはできない。
スコープの値が偽の場合、自動的にBuilderインスタンスがセットされる。

## おわりに
フレームワークの「お作法」を無視すると痛い目見ます。
とはいえ、```scopeErrorMessage()```などを定数代わりに使うとわりと便利なので、小さいプロジェクトだと使っちゃうかも。

## 参考情報
+ [LALACASTS 「Scope Query unable to return false (zero) instead Eloquent Builder returns an object」](https://laracasts.com/discuss/channels/laravel/scope-query-unable-to-return-false-zero-instead-eloquent-builder-returns-an-object?page=1)
+ [GitHub #5405](https://github.com/laravel/framework/issues/5405)
WordPressのフロントページに設定したページのIDを取得

特定の固定ページの情報を取得する場合、次のように`get_page_by_path`を使うことができます。

```php
$page = get_page_by_path('company');  // スラッグが companyの固定ページを取得
```

しかし、固定ページを「フロントページ」に設定している場合、スラッグが存在しないためこのファンクションが使えません。といって、「by_path」というファンクション名に惑わされて、次のように指定しても正常に動作しません。

```php
$front_page = get_page_by_path('/'); // 悪い例
```

正解は、`get_option`を使って、次のように取得するようです。

```php
$front_page_id = get_option( 'page_on_front' ); // IDのみが取得される
```

`get_option`では、この他にもさまざまな情報が取得できるようです。

- [Option Reference « WordPress Codex](https://codex.wordpress.org/Option_Reference)
技術英語 > or, doesn't do it [in quite the right way] / to a considerable extent

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 3316 / 12833)

> or, doesn't do it **in quite the right way**.

意訳1「かなり正しい方法で」
いまいちな意訳。

Google翻訳「非常に正しい方法で」
Google翻訳「tout à fait le droit chemin」

意訳2「まったく正しい方法で」


<hr>

https://www.merriam-webster.com/dictionary/quite
> :  to a considerable extent : 

意訳「かなりの度合いで」
lightline.vim on urxvt-unicode + Ricity Diminished for Powerline

urxvt 上で lightline.vim を powerline フォントを使って利用しようとしてはまったので整理

# 原因
- パッチ済みフォントを提供しているサイトでパッチ適用スクリプトが変更され、コードポイントが変わった
- フォントを再インストールしたが、キャッシュがあり、古いフォントが参照されていた

# 解決
- Ricty Diminished の提供元からフォントをダウンロード
- Powerline パッチ適用フォントの作成(fontforge from Homebrew on Mac)
- 古いフォントの削除
- フォントキャッシュのクリア
- OS 再起動
- フォントのインストール

## 参考
> [vim,iTerm2で★とか■とか※とかがずれるのでなんとかした](http://qiita.com/macoshita/items/f7e0f5eda02f45736b52)

# 状況
- 同じフォントファイルを利用して Mac 上の　iTerm2， Windows 7 の MobaXterm では問題なく利用できている．
- Linux 上の urxvt ではシンボルが □ になる．
- フォントは https://github.com/mzyy94/RictyDiminished-for-Powerline からダウンロードしたもの
- 英数字，日本語は Ricty Diminished になっているので，フォント指定は間違っていないはず
- git clone https://github.com/powerline/fonts.git のフォントを使えば問題なく利用できる．
- Mac， Windows 上だと \u2b80 でいいが， Linux 上だと \ue0b0 でないと表示されない．
- ホストPC(Mac)から scp でコピーしたから同じファイルのはず
- ホストPC(Mac)から ssh でログインして vim を起動すると文字化けするので，フォントのコードポイント違っている？

## 現状うまく動いている設定

```
URxvt.background: #ffe4c4
URxvt.scrollBar: false
URxvt.allow_bold: false
!URxvt*letterSpace: 1
URxvt.perl-ext-common:      default,clipboard,url-select,keyboard-select
URxvt.url-select.launcher:  chromium
URxvt.url-select.underline: true
URxvt.keysym.M-u:           perl:url-select:select_next
URxvt.keysym.M-Escape:      perl:keyboard-select:activate
URxvt.keysym.M-s:           perl:keyboard-select:search
URxvt*font: xft:Ricty\ Diminished\ for\ Powerline:style=Regular:size=12:antialias=true
URxvt.font:              xft:Ricty\ Diminished\ for\ Powerline:size=12:antialiase=true:hinting=true
URxvt.boldFont:          xft:Ricty\ Diminished\ for\ Powerline:bold:size=12:antialiase=true:hinting=true
URxvt.italicFont:        xft:Ricty\ Diminished\ for\ Powerline:italic:size=12:antialiase=true:hinting=true
URxvt.bolditalicFont:    xft:Ricty\ Diminished\ for\ Powerline:bold:italic:size=12:antialiase=true:hinting=true
```
HTMLのTableをExcelに出力するJavaScript

# 概要

管理システムや業務システムを作っているとウェブに`table`タグで表示したものをCSVやExcelで出力したい場面が出てきます。
以前は、サーバーサイドで出力処理を書いていたのですが、「いや、表示したものそのまま出せばサーバーサイドの実装しなくてよね？」ってことで、いろいろ試行錯誤しながらやってみました。

ちなみにこの手のJavaScriptライブラリはあるにはあるのですが、複数のシートに出力するのに対応してなかったりします。
今回は複数の`table`をシートに分けて1つのブックとして出力できるようにしています。

# Sheet.js

http://sheetjs.com/

これはかなり使えそうです。
これを使うと、HTML上の複数のテーブルを1つのExcelブック内にシートに分けて出力することができます。
出力形式は`.xlsx`。

デフォルトではそういった関数はないので、少し独自でコードを書く必要はありますが、比較的簡単に実装できます。

## 必要なファイル

SheetJSは`.xls`と`.xlsx`に対応したものがありますが、後者のものから`dist/xlsx.full.js`または`dist/xlsx.full.min.js`を読み込みます。
ファイルとしてダウンロードさせるには[FileSaver.js](https://github.com/eligrey/FileSaver.js/)が必要ですので、これも読み込んでおきます。
（サンプルコードやデモはCDNから取得）

## 実装

この辺りを参考に作ります。

- https://github.com/SheetJS/js-xlsx#html-table-input
- https://github.com/SheetJS/js-xlsx#writing-workbooks

```html:index.html
<button type="button" id="dl-xlsx">Download XLSX</button>
<h3>東京都区一覧</h3>
<table class="table-to-export" data-sheet-name="東京都区一覧">
  <thead>
    <tr><th>番号</th><th>特別区</th><th>推計人口</th><th>面積</th><th>人口密度</th></tr>
  </thead>
  <tbody>
    <tr><td>01</td><td>千代田区</td><td>59,441人</td><td>11.66km2</td><td>5,100人/km2</td></tr>
    <tr><td>02</td><td>中央区</td><td>147,620人</td><td>10.21km2</td><td>14,460人/km2</td></tr>
    ...
    <tr><td>23</td><td>江戸川区</td><td>685,899人</td><td>49.90km2</td><td>13,750人/km2</td></tr>
  </tbody>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.9.10/xlsx.full.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>
<script src="export-xlsx.js"></script>
```

```js:export-xlsx.js
document.getElementById('dl-xlsx').addEventListener('click', function () {
  var wopts = {
    bookType: 'xlsx',
    bookSST: false,
    type: 'binary'
  };

  var workbook = {SheetNames: [], Sheets: {}};

  document.querySelectorAll('table.table-to-export').forEach(function (currentValue, index) {
    // sheet_to_workbook()の実装を参考に記述
    var n = currentValue.getAttribute('data-sheet-name');
    if (!n) {
      n = 'Sheet' + index;
    }
    workbook.SheetNames.push(n);
    workbook.Sheets[n] = XLSX.utils.table_to_sheet(currentValue, wopts);
  });

  var wbout = XLSX.write(workbook, wopts);

  function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) {
      view[i] = s.charCodeAt(i) & 0xFF;
    }
    return buf;
  }

  saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}), 'test.xlsx');
}, false);
```

サンプル作りました。
[demo](http://tom-gs.com/demo/test/excel_export/)

# 2021.10.13 追記

PHPで書かれたDBアドミニストレーションツール[Adminer](https://www.adminer.org/)にExcelエクスポート機能をつけるプラグインを作って見ました。ほぼほぼJavaScriptになってますが。

- [adminer-dump-xlsx](https://github.com/tomgoodsun/adminer-dump-xlsx)

本家に提案してみたんですが、まだ掲載はされていないみたいです。
user.configファイルを[部分的に]暗号化するシンプルな方法


# 動機は何でも構わないんですが…
user.configファイルの中身が剥き出しってどうよ？
って思ってしまったのが運の尽きで…

折々に手法を凝らして工夫してきましたが、まぁ帯だったり襷だったり褌だったり。

そんな中でも、一番のお気に入りを披露しちゃおうと思います。

# 特徴
* プログラム本体側では通常のプロパティアクセスを行うだけでオッケー
* `.cs`ファイルを増やすだけで暗号化対応完了
* `user.config`ファイルを別ユーザ・別パソコンにコピーしても正規ファイルとは認められません
* 残念ながら`string`型のプロパティにしか対応できません…<br/>=ここが部分的

# 実装
```csharp:Settings.Crypto.cs
using System;
using System.Security.Cryptography;
using System.Text;

namespace TestSettings.Properties {
	internal sealed partial class Settings {
		public override object this[string propertyName] {
			get {
				if(!(base[propertyName] is string)) {
					return base[propertyName];
				}

				try {
					return Decrypt(base[propertyName]);
				}
				catch {
					return Settings.Default.Properties[propertyName].DefaultValue;
				}
			}

			set {
				if(base[propertyName] is string)
					try {
						base[propertyName] = Encrypt(value);
					}
					catch {
						base[propertyName] = Settings.Default.Properties[propertyName].DefaultValue;
					} else
					base[propertyName] = value;
			}
		}

		byte[] entropy = { 141, 238, 28, 197, 169, 105, 209, 230 };

		object Encrypt(object text) {
			return Convert.ToBase64String(ProtectedData.Protect(Encoding.UTF8.GetBytes(text as string), entropy, DataProtectionScope.CurrentUser));
		}

		object Decrypt(object text) {
			return Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(text as string), entropy, DataProtectionScope.CurrentUser));
		}
	}
}
```

* `namespace`はプロジェクトに合わせて下さい
* エントロピーは適当に変えていただいて構いません

肝は`Settings`クラスのインデクサを`override`してるとこですね。で、ここで暗号化/復号化をしちゃってるので、プロパティを使う側は全く無意識で`user.config`内は暗号化されちゃっていると云う感じ。

# 配置方法
クラスファイルは、↓此処の位置に配置するのが宜しいかと…
（`Properties`フォルダ配下）
![image](https://qiita-image-store.s3.amazonaws.com/0/136132/d8018754-ff36-37c9-fb07-b084bcf0a504.png)

# やってみる
![image](https://qiita-image-store.s3.amazonaws.com/0/136132/9ae64058-68ba-f57e-707d-c1dcc676d185.png)
こんな感じの設定をして…

```csharp:Program.cs
using System;

namespace TestSettings {
	class Program {
		static void Main(string[] args) {
			Console.WriteLine(Properties.Settings.Default.TestString);

			Properties.Settings.Default.TestString = "とほほ…";
			Properties.Settings.Default.Save();

			Console.WriteLine(Properties.Settings.Default.TestString);
			
			Console.ReadKey();
		}
	}
}
```

このプログラムの初回実行では、
![image](https://qiita-image-store.s3.amazonaws.com/0/136132/85e58d6b-8348-c98a-93dc-a0c1966e54b1.png)

この時、`user.config`の中身は、
![image](https://qiita-image-store.s3.amazonaws.com/0/136132/bae6dc79-a326-b412-8a9f-878c86672e9a.png)

暗号化されてるでしょ？
で、二回目の実行では、
![image](https://qiita-image-store.s3.amazonaws.com/0/136132/b6317857-034d-f6c4-e62d-41da74f8e856.png)

ちゃんと、復号化も出来ている様で、めでたい。

# 心残り
* アプリケーションスコープのプロパティを事前暗号化しておきたい時には、この方式は全く馴染みません
* 暗号化には`DPAPI`を使ってるので、他のユーザとか他のパソコンにこの`user.config`を持って行ったとしても復号化には失敗する（筈）<br/>此処の検証ができていないのが残念（単なるめんどくさがり、と云うだけですが）
* 上記のケース等の様に復号化に失敗した場合は、設定画面で指定した既定値が復活するようになっています<br/>`user.config`の中身を改竄した場合も同様
* `string`以外も暗号化したい場合はどうしたらいいんだろう？<br/>違うアプローチが必要そうなので、何かが下りてくるまで熟考したい
ssh_configの複数ホストにコマンド同時実行


Ansibleとかchefでもできますが、軽く設定できてssh_configの設定を使えるといいなと思って書きました。

こんな感じで使えます。

ssh-exec FILTER COMMANDS

```
ssh-exec ec2_site sudo apt-get update
```

.bash_rcに追記

``` shell
ssh-exec () {
    local FILTER=$1
    shift
    local COMMAND=$@
    grep -r "^Host" ~/.ssh/* | awk '{print $2}' | grep $FILTER | xargs -P5 -I% ssh % $COMMAND
}
```

Bashで動作確認済みです。
ReactとRiotでonChangeの挙動の違い


Reactをやっているときは何気なしに`onChange`と書いていましたが
よくよく試してみるとReactの挙動は他と違ったのでメモ程度に残しておきます。

## React

```js:my_input.js
import React from 'react';
import ReactDOM from 'react-dom';

class MyInput extends React.Component {
	handleChange(e) {
		console.log(e.target.value);
	}
	render() {
		return (
			<div>
				<input type="text" id="form_input" onChange={ this.handleChange.bind(this) }/>
			</div>
		);
	}
}

ReactDOM.render(<MyInput />, document.querySelector('#myform'));
```

inputタグに`onChange`でイベントを動かしてみると入力すると直後に内容がコンソールログに出力されることがわかると思います。
このあたりはReduxFormとか使うと想像つきやすいですがReactはstateで状態を管理していくので素でかくとこういう書き方はすると思います。

## Riot

```js:my_input.tag
<MyInput>
	<input type="text" id="form_input" onChange={ handleChange } />
	<script>
		this.mixin(riot.util.dom);
		
		handleChange() {
			console.log(this.$('#form_input').value);
		}
	</script>
</MyInput>
```

Reactのサンプルと同じように`onChange`イベントをはってるだけですが、動かしてると入力後は反応がありません。動くタイミングが少し違いフォーカスが外れた場合にコンソールログに出力されます。
入力された情報を直後に取得したい場合は、`onKeydown`とかで取得する必要があるようです。

*2017/04/12追記

`onInput`でReactと同様の動きになるということで試してみました。

```js:my_input.tag
<MyInput>
	<input type="text" id="form_input" onInput={ handleInput } />
	<script>
		this.mixin(riot.util.dom);
		
		handleInput() {
			console.log(this.$('#form_input').value);
		}
	</script>
</MyInput>
```

変わったのは`onChange`が`onInput`になっただけです。
確かにReactと同じ動きになりました。

## jQuery

jQueryはどうだったかなと思って一応確認してみました。

```html:jquery.html
<input type="text" id="form_input"/>
<script>
	$(document).ready(function() {
		$('#form_input').on('change', function() {
			console.log($(this).val());
		})
	});
</script>
```

挙動としてはRiotと同じになりました。フォーカスが外れたときにイベントが反応するようです。

*2017/04/12追記

Riotと同じように`input`で同じ動きになります。

```html:jquery.html
<input type="text" id="form_input"/>
<script>
	$(document).ready(function() {
		$('#form_input').on('input', function() {
			console.log($(this).val());
		})
	});
</script>
```

余談ですが`addEventListener`でも同じでした。

```html:pure.html
<input type="text" id="form_input"/>
<script>
	var el = document.querySelector('#form_input');
	el.addEventListener('input', function() {
		console.log(el.value);
	});
</script>
```

## 感想

だからどうした。というかんじですなんですがそれぞれのライブラリの特徴というか思想が違うので挙動が違うのでしょうがReactからRiot、逆もそうですが似たような書き方で挙動が違う場合があるので注意が必要なところがもっとあるのかもしれません。