OmniAICreator/Qiita-1.07M huggingface dataset:
Karabiner-Elementsめも


SierraにしてKarabinerが動かなくなり、本気で後悔をしました。
**が、本家の進化によりだいたいできるようになりました** (2018.09.30追記) 開発者の方々の神対応に感謝しています。
 
## Karabinerでやってたこと

* <kbd>Shift</kbd> + <kbd>Space</kbd> でIMEのOn/Off トグル
* <kbd>CapsLock</kbd> キーを <kbd>Command</kbd> キーに変更
* `¥` を `\` に変更
* <kbd>Command</kbd> + <kbd>q</kbd> を長押ししないとウインドウを閉じないようにする
* キーリピートを早めにする　


## 設定方法

### CapsLock→Command

Simple Modificationでルールを追加するだけです。簡単！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74571/45e67eee-f09a-9f6c-b144-d356d3cb41e3.png)

### `¥` を `\` に変更

Simple Modificationではできませんでした。
Complex Modificationのほうで、Add Ruleして、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74571/1a8d43c6-cb8d-bc70-c9f6-23a508739e86.png)

こいつをおして、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74571/58298dca-2fb4-7a7a-006c-27e510231ce1.png)

importして、enableします。

### Shift+Spaceで英数<=>かなトグル

これができるようになったのはマジで感激です。

```
open ~/.config/karabiner/assets/complex_modifications/
```

して、そこに
https://gist.githubusercontent.com/keik/07884ef00455dfd9acfba7cb57831d5e/raw/745efcb2ac4b14d068b67a0607a39c6fe05a6ce7/japanese.json
このJSONを入れて、

Complex ModificationでAdd ruleで

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74571/1024378a-a75a-f2b1-0091-d757f6fce046.png)

こいつをenable

　

## Karabiner-Elements使わないでも、OSの設定でもできる


### キーリピートを早めにする

Karabiner-Elementsじゃなくて、defaultsコマンドでやってみる

```bash:キーリピート設定
defaults write -g InitialKeyRepeat -int 12
defaults write -g KeyRepeat -int 3
```

参考：https://github.com/markandrewj/Karabiner-Elements/blob/391b860aa4e4091c2617024ef2afef4da75fcefe/examples/key_repeat.md

　

# 2018/09/30現在できてないこと

### Command + q

若干あきらめ（苦笑
AppDelegateをいじってUITabBarを実装できたけど、どう動いてんのか良くわかってない状態

#UITabBarをコピペ実装

下記参照記事のコピペ↓

UITabBarController - Swiftサラリーマン
http://swift-salaryman.com/uitabbarcontroller.php

iOS】AppDelegate.swiftってなにしてんの？
http://qiita.com/SoyaTakahashi/items/cc8f48af792c353cd9f3




```swift


import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    internal var window: UIWindow?
    private var myTabBarController: UITabBarController!
   
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        
        //UIViewControllerをタブ数分作成してUITabViewControllerに埋め込む
        
        //変数firstViewにViewController()を代入してインスタンス化。型に:UIViewControllerを指定してるので: UIViewControllerとなる
        let firstView: UIViewController = ViewController()
        
        //同上
        let secondView: UIViewController = tabBarControlle()
        
        //UIViewControllerとしてインスタンス化したclass firstViewにドット技法を使ってtabBarItemでアクセス
        //その際、カッコの中でTabBarを生成する。カッコの中の引数の詳細は
        //tabBarSystemIteという名前の”何か"にUITabBarSystemItemという型を指定してTabBarを定義してfeaturedは良くわかってなくて、tag: 1は多分タブの識別番号
        firstView.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.featured, tag: 1)//アイコン
        
        
        //同上
        secondView.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.bookmarks, tag: 2)
        
        
        
        //変数viewArrに先ほど生成したタブを配列化する
        let viewArr = NSArray(objects: firstView, secondView)
        
        
        //UITabBarController()をインスタンス化    
        myTabBarController = UITabBarController()
       
       
        //ここら辺良くわかってない
        myTabBarController?.setViewControllers(viewArr as! [UIViewController], animated: false)self.window!.rootViewController = myTabBarController
        
        
        
        //.windowとmakeKeyAndVisibleが良くわかってない
        self.window!.makeKeyAndVisible()

        
        
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        
        print("アプリ閉じそうな時に呼ばれる")
        
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        print("アプリを閉じた時に呼ばれる")
        
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
       print("アプリを開きそうな時に呼ばれる")
        
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        print("アプリを開いた時に呼ばれる")
        
    }

    func applicationWillTerminate(_ application: UIApplication) {
        print("フリックしてアプリを終了させた時に呼ばれる")
        
    }
}

```
The command "./gradlew build connectedCheck" exited with 127.の解決法

# 環境
- Windows

# 状況
Travis-CIでAndroidプロジェクトを動かしている。
`The command "./gradlew build connectedCheck" exited with 127.`が出て failed になってしまう。
そもそも、Buildが出来ていないらしい。

# 原因
gradlew の改行コードが Windows の CRLF になっており、gradlew がうまく動かない。LF に直すと動く。

# 対処法
コマンドラインで以下のコマンドを実行すると解消
`cat gradlew | tr -d '\r' > gradlew`

# 参考文献
- [Travis CI - Android Project Build Failing](http://stackoverflow.com/questions/27122194/travis-ci-android-project-build-failing)
- [逆引きUNIXコマンド/改行コードを変更したい](http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%81%84.html)
intellij で maven のプロキシを設定する

intellij で maven をプロキシ配下で使用する場合、maven の VM 起動オプションにプロキシ設定を行う必要がありました。

IntelliJ IDEA ⇒ Preferences ⇒ Build, Execution, Deployment ⇒ Build Tools ⇒ Maven ⇒ Importing にて、VM options for importer に以下を追記します。

```
-DproxySet=true -DproxyHost=プロキシホスト -DproxyPort=プロキシポート
```
after_commitはdestroy時にも走る

当たり前の話ですが、after_commitはすべてのcommit後に走るのでもちろんdestroyの時も走ります。

ここが考慮漏れしており以下のエラーが出ました。

`RuntimeError: Can't modify frozen hash`

これはdestroyで削除済みのhashに対してafter_commitで操作しようとしたために起こりました。

以下のように対処しました。

```
after_commit :set_user_id, on: :create
```

on: :createをつけることによりcreate時のみしか動かなくしました。これで解決です。

### 参考
http://apidock.com/rails/ActiveRecord/Transactions/ClassMethods/after_commit
【TIPS】Datadogでアラートメッセージを条件によって出し分けをする


Datadogでアラート通知する際、ステータスによって通知本文を出し分けする方法。
Datadogでは、通知に使えるテンプレート変数というものが用意されていて条件毎のメッセージの出し分けに対応していました。とても便利!!

##主なテンプレート変数のまとめ

|変数名|条件|
|---|---|
|#is_alert|アラートトリガ時にマッチ|
|#is_recovery|リカバリ時にマッチ|
|#is_no_data|datadog-agentからデータが一定時間来ない時にマッチ<br>(if data is missing for more than "" minutesをNotifyにした場合にきく|
|#is_match|タグ変数(host.role,url.name,カスタムしてるタグetc)|

##サンプル

####【設定箇所】
[Monitors]→[4 Say what`s happening]

####【サンプルの条件】
- 通知先は共通(@slack-[チャンネル名])
- アラート時(is_alert)に、さらにurl.nameというタグ毎に条件判定(is_match)を行い、条件毎に異なるメッセージを発報
- no_data時は、datadog-agentの状態確認するメッセージを出力
- 復旧時(is_recovery)は共通のメッセージを出す

```
@slack-[チャンネル名]

{{#is_alert}}
{{#is_match "url.name" "http://10.0.3.188"}} 
テストサービスで異常を検知しました。 {{url.name}}
{{/is_match}}
{{#is_match "url.name" "http://10.0.3.189"}} 
ダミーサイトエラー {{url.name}}
{{/is_match}}
{{/is_alert}} 

{{#is_no_data}} 
監視が停止しています。datadog-agentが動いている事を確認してください。
{{/is_no_data}} 

{{#is_recovery}}
復旧しました。 {{url.name}} 
{{/is_recovery}}

```

![Monitors___Datadog.jpg](https://qiita-image-store.s3.amazonaws.com/0/40850/e0873db1-611d-0a8a-c65c-80d4e5b95ea5.jpeg "Monitors___Datadog.jpg")


Datadog 最近触り始めたけど中々使いやすい。

##参照

https://docs.datadoghq.com/ja/monitoring/#section
[iOS] プッシュ通知を導入したらCircleCIのUnitTestで失敗した

## 概要

iOSアプリにFirebaseのプッシュ通知を導入したところ、急にCicleCIのテスト（Xcode build and run tests）で失敗するようになってハマったので、解決するまでやったことのまとめです。

## 環境

- XCode7.3

## エラー内容
CircleCI上ではエラー内容が出てなかったので原因が分からなかったのですが、ローカルでbuild&testを実行してみたところ、以下のエラーが出ている事が分かりました。

```shell-session
$ xcodebuild -workspace '{アプリ名}.xcworkspace' -scheme '{アプリ名}' clean build test -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= PROVISIONING_PROFILE=

・・・

2016-09-08 07:30:34.535 XCTRunner[6174:22447] Running tests...\
07:30:35.399 XCTRunner[6174:22454] _XCT_testBundleReadyWithProtocolVersion:minimumVersion: reply received\
07:30:35.403 XCTRunner[6174:22453] _IDE_startExecutingTestPlanWithProtocolVersion:16\
2016-09-08 07:30:46.670 XCTRunner[6174:22447] Failed to background test runner within 10.0s.\
** TEST FAILED **\
```

上記エラーをググると下記のリンクに辿り着きました。
https://bitrise-io.github.io/devcenter/ios/frequent-ios-issues/

どうやら、UITest中にプッシュ通知の許可を促すダイアログが表示されていてテストに失敗していたようです。

## 対応

先ほどのリンクに書かれている通り、Unitテストであるか判定を行い、Unitテストでなければプッシュ通知の設定を行うように修正を行いました。

```swift
let unitTestMode = NSProcessInfo.processInfo().environment["XCTestConfigurationFilePath"] != nil
if !unitTestMode {
   // プッシュ通知の設定
}
```

以上の対応で無事にビルドが成功するようになりました！
Increments PM Meetup #2 に参加してきたのでメモ #IncrementsMeetup


2016/10/04 にIncrements様主催の PM Meetup その第二回めが開催され、運良く参加できたので、そのメモを残す。(Increments様だけにQiitaで残すのがいいよね！）
意訳になってるところがあるかもしれませんがご容赦を。

# 及川さん (@takoratta)　IncrementsにおけるPM
* #1 とは別の内容

## チームとメンバーの役割
* プロダクトチームにおいてPMとメンバーは対等
* 最終決定はチーム内コンセンサスを得ながらPMが実施

### PMの役割
* プロダクトを成功に導く＝PMの役割
* 何をいつつくるのか、どうして作るひつようがあるのか、を決めること。
* PRD (=Product Requirements Document)を用いる

### エンジニアの役割
* どのように実装するかはエンジニアが決定し進める
* github issues での議論でデザイン(設計)を決定

### デザイナーの役割
* 何を作るか考える
* UX/UI/frontend実装も担当
* かつてはデザイナーがPMを兼任

## PRD
* PRDはQiita:Teamにテンプレがあるので埋めていく
* 暗黙の了解を明文化することで認識の齟齬を埋めていく
* 何をするかはどうやって決めるか？　誰でも提案できる
* チームで決めたロードマップに沿って進めるのが基本

### PRDの実例
* 四半期に1回1Week HackWeekを実施
* スライドモード by mizchi

## リモートワークとPM
* 普段1/3も出社しない
* フルリモートが許可されている
* ハングアウト、テキストベースのコミュニケーション
* 面倒でも文字におこすことで同じ情報が複数名で共有できる


# 海野さん (@yaotti)　Qiita:Team のPMについて
## Qiita:Teamについて
* Incrementsのビジョン：「ソフトウェア開発をよくすることで、世界の進化を加速させる」
* 継続的な情報共有　日報、議事録、機能アイディア、PRD
* ソフトウェア開発は不確実性が高い業務。ゴールがいつも不鮮明。これをやれば絶対正解というのがない
* 不確実性をハッキリさせていくためにQiita:Teamを使ってほしい

## Qiita:Team のPM
* コアメンバー5名+横断的に活躍するフロントエンドやインフラ
* プロダクトのコンセプト、主要ストーリーの設定やブラッシュアップ
* プロジェクトやissueの立ち上げ、進行サポート
* ユーザーヒヤリングやアンケートの実施

### プロダクトチームマネジメント
* 1on1
* 属人性はなるべく排除。マイクロマネジメントはしない（=自律的に動きやすい環境を作る)
* よいやり方を求めて改善を続ける

## PMのためのツール
* Qiita:Team
* GitHub
* ZenHub
* Slack
* Google SpreadSheet
* Re:dash
* Trello
* mural

## リモートワーク
* 多くのエンジニアが自宅やカフェで業務
* ビデオ or テキスト
* 同期的 or 非同期的
* 対面/画面越し


# 質疑応答タイム
以下、敬称略。

## Q. 日ごろからメンバーの様子をどのようにキャッチアップしているか
* 海野: 毎日スタンドアップMTGしてディスカッションしている＋1on1実施
* 及川: ものおじするひとが少ないのであまり苦労してない。オープンなチームを作り維持することが大事

## Q. プロダクトマネジメントとプロジェクトマネジメントを意識的にわけてる？あいまい？役割分担はどんな感じ？
* 小さいチームだとスクラムとかアジャイルとか教科書通りにはいかない。あまり形にはこだわらない。
* スケジュール的なプレッシャーは少なくしている。よりよいものをきちんとユーザに届けていくことを続ける。

## Q. PMはどれくらい技術にコミットしているか？
* 海野: プロトタイプとか手ごろな修正系はやる
* 及川: 実はほとんどrubyわかんない。ほとんどコミットしてない。ドキュメントがひどいので整備を続けている

## Q. いまだにCEOがコード書いているのはなぜ？
* やりたくてしょうがないときもあるし、早くフィードバックがほしいときとか・・・こういう開発が好き
* PMでしか出せない価値があるのが基本は優先されているが、バランスよくやっている

## Q. PRDを作る前の経営判断はどれくらいやりこんでいるか
* 健全な成長を続けることがユーザに価値を届け続けられる源泉。
* よいプロダクトを作り自然な広告媒体として成立することが大事。
* エンジニアが多く使うプロダクトなので、エンジニアが嫌だということは基本やらない。
* 最優先はユーザに愛され続けること

## Q. 事業側と作り手側の利害が一致しなかったときの対策は？
* Increments はあまりずれてこなかった。開発メンバーがかなり多いのでずれにくい。

# 感想
* 「ユーザに愛されるプロダクトで価値を発信し続ける」というのは繰り返されてて、まぁその通りだよねーと思った。
* Qiitaはエンジニア向けなプロダクトなので、事業側と作り手側の利害がズレにくいのは、プロダクトの性質も関係していそう。
Xcode8のXCTestでアラートの任意のボタンを押す

# Xcode7のXCTestでは...

```Swift
app.alerts.collectionViews.buttons["hoge"].tap() 
```

# Xcode8のXCTestでは...

```Swift
app.alerts.buttons["hoge"].tap() 
```

- `collectionViews`を挟むと、XCUIElementQueryがアラートのボタンを見つけてくれなくなっているようだ

# 試しに（lldb）でpoすると...
- `po app.alerts.collectionViews.buttons`だと`Output:`が出ない

```Swift
(lldb) po app.alerts.collectionViews.buttons
    t =   320.73s     Use cached accessibility hierarchy for hoge
    t =   320.74s     Find: Descendants matching type Alert
    t =   320.75s     Find: Descendants matching type CollectionView
Find: Target Application 0x6080000afd20
  Output: {
    Application 0x600000776b00: {{0.0, 0.0}, {414.0, 736.0}}, label: 'fuga'
  }
  ↪︎Find: Descendants matching type Alert
    Output: {
      Alert 0x6000007777c0: traits: 72057602627862528, {{72.0, 237.7}, {270.0, 261.0}}, label: '退会'
    }
    ↪︎Find: Descendants matching type CollectionView
      ↪︎Find: Descendants matching type Button
```

- `po app.alerts.buttons`だとちゃんと見つけてくれる

```Swift
(lldb) po app.alerts.buttons
    t =   116.83s     Use cached accessibility hierarchy for hoge
    t =   116.84s     Find: Descendants matching type Alert
    t =   116.85s     Find: Descendants matching type Button
Find: Target Application 0x6080000afd20
  Output: {
    Application 0x600000776b00: {{0.0, 0.0}, {414.0, 736.0}}, label: 'fuga'
  }
  ↪︎Find: Descendants matching type Alert
    Output: {
      Alert 0x6000007777c0: traits: 72057602627862528, {{72.0, 237.7}, {270.0, 261.0}}, label: '退会'
    }
    ↪︎Find: Descendants matching type Button
      Output: {
        Button 0x6000007786c0: traits: 8589934593, {{72.0, 366.0}, {270.0, 44.0}}, label: '退会する'
        Button 0x600000778e40: traits: 8589934593, {{72.0, 454.7}, {270.0, 44.0}}, label: 'キャンセル'
      }
```

ネット上にある、XCTestのコードでは`app.alerts.collectionViews.buttons["hoge"]`が結構多いけど、たぶん、Xcode8では正常に動かないと思う
re:dashの各種統計値を取得するSQL


デフォルトで用意されているData sourceの「re:dash metadata」で取れる各種統計値です。


### 日別のクエリ数、閲覧数
```sql
SELECT 
  to_date(to_char(created_at,'YYYY-MM-DD'),'YYYY-MM-DD') AS created_at,
  SUM(CASE WHEN action = 'execute' THEN 1 ELSE 0 END) AS execute,
  SUM(CASE WHEN action = 'view' THEN 1 ELSE 0 END) AS view
FROM events
WHERE 
  created_at BETWEEN NOW() - interval '6 month' AND NOW()
GROUP BY 1
ORDER BY 1
```

### ダッシュボード別閲覧数(queryへのリンク付き)
```sql
SELECT
  '<a href="/dashboard/' || d.slug || '" target="_blank">' || d.name || '</a>' AS name,
  COUNT(e.id) AS cnt,
  COUNT(DISTINCT e.user_id) AS uu_cnt
FROM events e 
INNER JOIN dashboards d ON CAST(e.object_id AS INTEGER) = d.id
WHERE 
  e.action = 'view' AND e.object_type = 'dashboard'
  AND e.created_at BETWEEN NOW() - INTERVAL '2 week' AND NOW()
GROUP BY 1
ORDER BY 2 DESC
```

### 月別query作成数

```sql
SELECT
  to_char(created_at, 'YYYY-mm-01') AS month,
  COUNT(id) AS cnt
FROM queries
GROUP BY 1
ORDER BY 1
```

### スケジュールされたquery数(時間別、data source別)

```sql
WITH cal AS (
  SELECT t1.schedule, ds.id, ds.name
  FROM (
    SELECT schedule
    FROM queries
    WHERE schedule LIKE '__:__'
    GROUP BY 1
  ) AS t1, data_sources ds
), q AS (
  SELECT
    qs.schedule,
    qs.data_source_id,
    COUNT(qs.id) AS cnt,
    SUM(qr.runtime) AS runtime
  FROM queries qs
  INNER JOIN query_results qr ON qs.latest_query_data_id = qr.id
  WHERE qs.is_archived = false AND qs.schedule LIKE '__:__'
  GROUP BY 1,2
)

SELECT
  to_char(to_timestamp(to_char(CURRENT_DATE - interval '1 day','YYYY-MM-DD ') || cal.schedule,'YYYY-MM-DD HH24:MI') + interval '9 hour', 'HH24:MI') AS schedule,
  cal.name,
  q.cnt,
  q.runtime
FROM 
  cal 
  LEFT OUTER JOIN q ON q.data_source_id = cal.id AND q.schedule = cal.schedule
ORDER BY 1
```

グラフ化は適当にやってください。
nodejs  exports 和 module.exports 的区别

https://cnodejs.org/topic/5231a630101e574521e45ef8

https://www.sitepoint.com/understanding-module-exports-exports-node-js/

http://weizhifeng.net/node-js-exports-vs-module-exports.html

http://zihua.li/2012/03/use-module-exports-or-exports-in-node/

http://hellobug.github.io/blog/javascript-variable-assignment/
Xcode 8 - files missing from working copy 的原因和解決辦法

## 情境

目前的專案是使用 Xcode 8 和使用 Git 作為版本控管。
發生情境是，我有搬移檔案，找不到的檔案在不同的實體目錄下，

這時候 Xcode 就會提出警告

> xxx files missing from working copy

這樣子。

但是這時候去專案裡面的 `Target/Build Phases/Compile Sources` 區塊裡面看，
路徑也的確是更改過的；

事實上也都是沒有問題的，所以也可以 build 起來。

那是哪邊有問題呢？

## 搭配版本控制的錯亂

用錯誤訊息喂了一下 Google ，看了幾篇後發現這可能是 Xcode 8 的問題（據說在 GM 版的時候就已經有人跑出來問了）

因為在有版本控制下移動檔案，對版本控制來說原本的檔案就已經不在了。可能就變成是 Xcode 的 Source Control 工具沒有辦法找到原本的檔案，接著就會跳出像是那樣子的警告。

## 解決辦法

可以加入新的、和舊的檔案的路徑。這時候版本控制就會知道這個檔案目前是 `RENAME` 的狀態：

```
git add original/path/to/file
git add new/path/to/file
```

或是直接把整個工作目錄的變更全部加入 stage

```
git add .
```

這時候把需要移動的檔案加入 stage 中，版本控制透過差異比對就會知道你這個檔案其實已經換到其他位置去了。

這時候回到 Xcode 中再重新 build 一次，這個找不到檔案的警告就會消失了。
hubot-slackのためのDockerfile (debian)

##ディレクトリ詳細

```bash
hubot-slack
  |
  ├──scripts    # このディレクトリ以下にhubotの応答用スクリプトを用意
  ├──tools      # このディレクトリ以下に応答内容に応じて実行されるスクリプトを用意
  └──Dockerfile # docker buildで使用 
```

#Dockerfile

```bash
FROM node:latest

MAINTAINER XXXX <xxxxx@xxx.com>

# package update
RUN apt-get update && \
    apt-get -y install -y git-core redis-server vim

RUN adduser --disabled-password --gecos "" hubot && \
    chown -R hubot:hubot /home/hubot  && \
    echo "hubot ALL=(ALL)       ALL" >> /etc/sudoers && \
    mkdir /root/packages && \
    cd /root/packages && \
    wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && \
    chmod +x jq-linux64 && \
    cp -p jq-linux64 /usr/bin/jq

RUN npm install -g coffeelint
RUN npm install -g yo generator-hubot
RUN npm install hubot-slack hubot-proxy-loader --save

USER hubot
WORKDIR /home/hubot
RUN mkdir test && \
    mkdir test/tools && \
    cd test && \
    yo hubot --owner hoge --name testbot --description "hubot for hoge" --adapter slack && \
    jq ' .-["hubot-heroku-keepalive","hubot-pugme","hubot-shipit"]' external-scripts.json > new-external-scripts.json && \
    jq ".[$(jq -s '.[] | length' new-external-scripts.json)]|= .+\"hubot-proxy-loader\"" new-external-scripts.json > new2-external-scripts.json && \
    mv new2-external-scripts.json external-scripts.json && rm -f new-external-scripts.json && rm -f hubot-scripts.json

COPY tools/ test/tools
COPY scripts/ test/scripts

ENV HUBOT_SLACK_TOKEN xxxx-123123-234434ssssss
ENV HUBOT_SLACK_CHANNELMODE whitelist
ENV HUBOT_SLACK_CHANNELS temporalchatroom

WORKDIR /home/hubot/test
CMD bin/hubot --adapter slack

LABEL version="0.0.1"
```

- jqを新たにインストール
- jqでexternal-scripts.jsonを編集してアドオンを必要に応じて取捨選択
- slackのTokenはslack上で発行したものを書く
- COPYで必要なものをコピーしてくる

##docker buildとdocker run

```bash
docker build -t your-repo-name/image-name:0.0.1 --force-rm=true --no-cache=true .
docker run --name testbot -d -t your-repo-name/image-name:0.0.1
```

## 注意点

- コピーするcoffeeスクリプトにシンタックスエラーがあると、`docker run`後にコンテナが`Exited(127)`などのステータスになり動かない。
- WORKDIRで決めたディレクトリより上の階層を`RUN`の中で言及するとbuild時にエラーになり怒られる。
さくらのクラウドでサーバを管理する(2)

一つ前の記事はこちら
[さくらのクラウドでサーバを管理する(1)](http://qiita.com/sato-w-m/items/578cb588462fcc32a669)

##シンプル監視
サーバ作成時にシンプル監視を有効にした場合はこちらに表示されているはずです。
また、後からシンプル監視を追加した場合にも該当していれば表示されるかと思います。
これはサーバの監視と言うより、サービス監視に用いた方が有効かなと思っています。
![サーバシンプル監視.png](https://qiita-image-store.s3.amazonaws.com/0/140995/34375209-cf27-457a-10f2-3db902512ff3.png)

##アクティビティ
CPUとNIC、ディスクの利用状況が簡単に把握出来ます。
(なぜかメモリはないんです)
NICとディスクを追加した場合は追加した分も表示されます。
一覧性が悪いので応答がなくなってしまって電源を強制的に落とす場合にちょっと確認するくらいの用途で利用出来るかなといった感じです。
![サーバアクティビティー.png](https://qiita-image-store.s3.amazonaws.com/0/140995/b35c8c99-18ff-14e5-5281-ed040eea4c3d.png)

##コンソール
コンソールはVPSなどとほとんど同じです。
WindowsやGUIでのインストールを選択した場合はGUIで表示されます。
反応はあまりいいとは言えませんが、WindowsでもネットワークIFのIP設定くらいならすぐにできます。
「リモートスクリーンに接続」ではvncファイルがダウンロード出来るので試しに使ってみてもいいかもしれません。
(一度も接続に成功したことがないのでお勧めはしません。)
![サーバコンソール.png](https://qiita-image-store.s3.amazonaws.com/0/140995/b32056ec-3961-73ed-73a2-14053a3055ca.png)

##まとめ
 - サーバ一覧では稼働状態がすぐに把握出来る
 - サーバの編集は停止状態でないと行えない作業が多い(というかほとんど)
 - コンソールは万能ではないのでなるべく使わない様に作業したい
 - 停止状態であればプラン変更からCPUとメモリの組み合わせを変えることも可能
 - 同じくディスクを付け替えることで初期化したりOSを入れ替えたりも可能
 - サーバのクローンは稼働状態でも可能だがネットワークIFを追加していたりディスクを追加していたりする場合には慎重に
 - サーバの削除は停止状態で行う。ディスクの削除も同時に行うことが可能でディスクだけ残すことも可能
Webpackで外部ライブラリをまとめたJSファイルを作る

Webpackで外部ライブラリも実装コードもひとまとめにすると、非常にビルド時間が長くなります。それを解決する手段は多々ありますが、Bowerとnpm両方で対応可能な方法について説明します。

※文中のjQueryはnpmにもありますが、敢えてBowerのパッケージしかないと仮定します。

# Bowerのモジュール

WebpackとBowerは相性がよくないため(諸説ありますが）、Bowerのモジュールもnode_modules以下にインストールして、Webpackから特別なことをしなくてもロードできるようにします。

まず、.bowerrcをプロジェクトルートに配置します。私は好みで`@bower`以下に配置されるようにしています。

```.bowerrc
{
  "directory": "node_modules/@bower/"
}
```

`$ bower install jquery`

これでjqueryがnode_modules/@bower/jquery以下に配置されます。

# npmのモジュール

npmでそのままインストールして、その名前でrequireが可能です。

# グローバル上にエクスポートするためのJSファイル作成

以下のファイルをWebpackの設定のエントリに追加します。

```export.js
//BowerのjQueryを読み込む場合
window.$ = require("@bower/jquery/dist/jquery");

//npmのangularを読み込む場合
//window.angular = require("angular");
```

webpack.config.jsは以下の通りになります。

```webpack.config.js
module.exports = {
	entry: "./export.js",
	output: {
    	path: "../../dist",
		filename: "vendor.js"
	},
	resolve: {
		extensions: ["", ".js"]
	}
};
```

これらのファイルをsrc/vendor以下に配置します。

# 使う側のコード

使う側は特に意識せずにrequireすれば問題ありません。webpack.config.jsのexternalsの設定で、
jqueryが参照された時にグローバルに存在する$を返すようにします。

```webpack.config.js
module.exports = {
	entry: "./main.js",
	output: {
    	path: "../../dist",
		filename: "bundle.js"
	},
	resolve: {
		extensions: ["", ".js"]
	},
	externals : {
		"jquery" : "$"
	},
};
```

```main.js
var $ = require("jquery");
console.log($(document));
```

これらのファイルをsrc/main以下に配置します。

# ビルド

src/main及びsrc/vendor以下でwebpackを実行するとdist以下にbundle.jsとvendor.jsが作成されます。

あとは、dist以下にindex.htmlを作成して開いてみましょう。

```index.html
<html>
<script src="vendor.js"></script>
<script src="bundle.js"></script>
</html>
```

vendor.jsを必ず先に読み込む必要があります。

# 応用

style-loader、css-loader、sass-loader、file-loaderなどを駆使すると、CSSやアセットなどもセットになったパッケージを取り込むことも可能です。

私はjQuery、AngularJS、MaterializeCSS、babel-polyfillを取り込んでみましたが、Uglifyで縮小すると600Kbちょいのサイズになりました。
さくらのクラウドでサーバを管理する(1)

さくらのクラウドでサーバを作成した後、コントロールパネルでどんな操作が可能かみていきたいと思います。

##サーバ一覧
サーバ一覧ではどれだけの数のサーバが存在していて稼働状況などを把握出来ます。
チェックボックスは一括して電源を入れたり削除したりするときに利用します。
ステータスが細長いバーで示されるのでわかりづらいようですが、何台も並んでいる中で色が違うとすぐにわかります。
星マークは、、、使い道がよくわかりません。
IPアドレス表示はグローバル接続の場合に球体(地球？)がつきます。
サンドボックスなのでIPアドレスはダミーです。
サーバ作成時にグローバル接続を選択した場合はここに表示されているIPアドレスでSSH接続、リモートデスクトップ接続が可能です。
![サーバ一覧.png](https://qiita-image-store.s3.amazonaws.com/0/140995/88d8b2cb-b123-ce04-a171-aaaef10275d5.png)

##サーバ
サーバ一覧でサーバ名をダブルクリックすると詳細を確認出来ます。
リソースIDは課金の単位でもあります。
名前はサーバの電源が入っている状態でも変更出来ます(ホスト名とは異なり、あくまでもコントロールパネル上の名称です)
![サーバ.png](https://qiita-image-store.s3.amazonaws.com/0/140995/c37d89d1-3d67-93fd-f186-347faf562162.png)

##NIC
NICではネットワークIFを確認、追加、削除出来ます。
サーバ作成時に設定した接続先がグローバルかローカルかで接続先の表示が変わります。
IFの追加削除、接続先変更はサーバの電源がオフの状態でないとできません。
接続先の変更などは該当のIF行の一番右にある逆三角形をクリックして表示されるメニューから実行出来ます。
また、IFの追加は「＋追加」ボタンから可能です。
ネットワークIFは全部で2個までなので追加出来るIFは一つだけになります。
![サーバNIC.png](https://qiita-image-store.s3.amazonaws.com/0/140995/a920acf7-fd32-863f-40a4-bc174f304fd0.png)

##ディスク
ディスクは独立して精算されるリソースなのでサーバとは別のリソースIDが付与されています。
サーバと同時に新規ディスクを作成した場合はサーバと同じ名称になります。
ソースの表示はサーバ(ディスク)作成時に選択したソースが表示されているはずです。
一番右側の逆三角形をクリックするとサーバからディスクを取り外せます。
ただし操作が可能なのは電源がオフの状態のみです。
ディスクは最大で3台まで接続可能です。
ここで追加したディスクはCentOSの場合、/dev/vda、/dev/vdb、/dev/vdcという風に認識されます。
![サーバディスク.png](https://qiita-image-store.s3.amazonaws.com/0/140995/d7ced1d7-3b15-7ae8-2cdd-485555e7577c.png)

##ISOイメージ
ISOイメージはオフィシャルに提供されているものに加え、
あらかじめゾーン単位でアップロードしておいたイメージを選択できるようになっています。
![サーバISOイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/140995/df3f5c72-bf56-24cd-4203-2bf7fd36a36c.png)

画像を貼り付けると内容のわりに長くなってしまうので次回に続きます。
rake db:migrate で rake aborted!になる(rake のバージョンが違う)場合の解決法

# rake logdb:migrateを実行
```ruby:
$rake logdb:migrate

rake aborted!
Gem::LoadError: You have already activated rake 11.2.2, but your Gemfile requires rake 10.5.0. Prepending `bundle exec` to your command may solve this.
```
要求されているrakeのバージョンが違う模様。

# バージョンを指定してrakeを実行
```ruby:
$ rake _10.5.0_ db:migrate
```
毎回バージョンを指定するのは面倒くさい・・・。

# 使用しないrakeのバージョンをuninstallする
```ruby:
$ gem uninstall rake

Select gem to uninstall:
 1. rake-10.4.2
 2. rake-10.5.0
 3. rake-11.2.2
 4. All versions
> 3
Successfully uninstalled rake-11.2.2
```
すぐ忘れるfish script syntax

# これは備忘録

更新予定：随時

## script arguments

コマンドラインから与えられた引数の値は`$argv`配列（indexは1から始まる）を参照することで得られる。

> argv, an array of arguments to the shell or function. argv is only defined when inside a function call, or if fish was invoked with a list of arguments, like fish myscript.fish foo bar. This variable can be changed by the user.
>
> "Special variables" / http://fishshell.com/docs/current/index.html

```hoge.fish
#!/usr/bin/env

echo $argv[1]
```

```
$ ./hoge.fish "fuga"
fuga
```

## loop with command

コマンド実行結果を元にループ処理する場合

- https://fishshell.com/docs/current/commands.html#string
- http://stackoverflow.com/questions/19638400/fish-equivalent-to-for-loop-with-evaluation

```loop.fish
#!/usr/bin/env fish

for i in (ls *.mp4)
    mv $i (string replace .mp4 .m4a $i)
end
```

```
$ ls *.mp4
hoge.mp4
fuga.mp4
bar.mp4

$ ./loop.fish

$ ls *.m4a
hoge.m4a
fuga.m4a
bar.m4a
```

上記の処理に限っては、Finderだけで一括変換できるが、わかりやすい例として挙げておく。

## Operators for files and directories

下記の`-e`んとこのスイッチリスト

```
if test -e /var/path/hoge.log
 echo 'available'
end
```

```
-b FILE returns true if FILE is a block device.
-c FILE returns true if FILE is a character device.
-d FILE returns true if FILE is a directory.
-e FILE returns true if FILE exists.
-f FILE returns true if FILE is a regular file.
-g FILE returns true if FILE has the set-group-ID bit set.
-G FILE returns true if FILE exists and has the same group ID as the current user.
-L FILE returns true if FILE is a symbolic link.
-O FILE returns true if FILE exists and is owned by the current user.
-p FILE returns true if FILE is a named pipe.
-r FILE returns true if FILE is marked as readable.
-s FILE returns true if the size of FILE is greater than zero.
-S FILE returns true if FILE is a socket.
-t FD returns true if the file descriptor FD is a terminal (TTY).
-u FILE returns true if FILE has the set-user-ID bit set.
-w FILE returns true if FILE is marked as writable; note that this does not check if the filesystem is read-only.
-x FILE returns true if FILE is marked as executable.
```
WakaTime APIを使わずにコードを書いた時間を取得する

# TL;DL
https://wakatime.com/share/embed

# WakaTimeとは
https://wakatime.com/
コードを書いた時間を計測するサービス。
使用するエディタにプラグインを導入することで計測してくれます。

# 導入手順

## アカウント作成
https://wakatime.com/signup
githubアカウントでもログインできます。

## エディタ/IDEにプラグインを導入
サインアップすると、エディタを選択する画面が表示されます。
(https://wakatime.com/editors でも確認できます。)
10/5現在、なんと、35種類のエディタに対応しているようです！有名どころのエディタ/IDEのほとんど押さえられてるので、ほとんどの方が使えるのでは！

## コードを書いて、ダッシュボードをみる
実際にコードを書いて
https://wakatime.com/dashboard
を見ると、時間や言語、エディタ、プロジェクトが表示されます。

# embed
WakatimeにはAPIが用意されていますが、embed機能もあり、過去7日間もしくは1ヶ月間のコーディングアクティビティ、言語などのデータをSVG, PNG, JSON形式で取得することができます
https://wakatime.com/share/embed

## JSONを取得する
FormatをJSONに設定すると、以下のような形式のURLが発行されるので、ダウンロードするなり、cURLで叩くなりできます
https://wakatime.com/share/@3afe21fa-0000-41fb-a13e-18d20a7d14d8/b1fd17f4-0000-4fd6-acf8-c38f9ddc0345.json
※データは動的ではないため、ライブのデータが欲しい場合はAPIを使いましょう。
過去10時間以内に変更されたファイルの一覧を表示

### 要旨
find コマンドのオプションは多くて覚えられないのでメモ：

過去10時間以内に変更されたファイルの一覧を表示するワンライナー

```bash
$ find . -type f -mmin -600 -ls | grep -vE '(.git|vendor|cache)'
1620576      4 -rw-rw-r--   1 vagrant  vagrant      1430 10月  5 10:31 ./app/Console/Commands/Ec2.php
202280504    4 -rw-rw-r--   1 vagrant  vagrant       676 10月  5 14:28 ./app/Console/Kernel.php
202256454    4 -rw-rw-r--   1 vagrant  vagrant      1416 10月  5 14:27 ./app/Providers/AppServiceProvider.php
134811661   12 -rw-rw-r--   1 vagrant  vagrant      9530 10月  5 14:36 ./config/app.php
202572472 1036 -rw-rw-rw-   1 vagrant  vagrant   1055244 10月  5 14:26 ./storage/logs/laravel.log
```

### find のオプション
- .
    - 検索開始ディレクトリ
- -type f
    - ファイルのみ（ディレクトリは表示しない）
- -mmin -600
    - 過去600分以内
- -ls
    - ls -l 形式で表示

- | (パイプ）以降（ここは find とは無関係）
    - パス名に .git, vendor, cache が含まれるものを除く（適宜お好みで）

### あとがき
今回の環境は CentOS7 ですが、日本語環境での ls -l 実行時に日付が"99月99"になって "日" が表示されないという、coreutils（？） のバグが直る日は来るのでしょうか？（『RHELでユーザー登録している正規ユーザーさんからの、正式なバグ報告がないと直せないんすよ～』みたいなことを、むかし誰かが呟いていたような気もしますが…。）
Android Studio 2.2へのアップデートで起こる『Ignoring InnerClasses attribute…』エラー


# 起こるエラー

Android Studioを2.2、gradleを2.2に更新した状態でProguardをかけてビルドすると、こんなエラーがたくさん出るようになってしまった。

```
Error: warning: Ignoring InnerClasses attribute for an anonymous inner class
(android.support.v4.app.ActivityCompat$1) that doesn't come with an
associated EnclosingMethod attribute. This class was probably produced by a
compiler that did not target the modern .class file format. The recommended
solution is to recompile the class from source, using an up-to-date compiler
and without specifying any "-target" type options. The consequence of ignoring
this warning is that reflective operations on this class will incorrectly
indicate that it is *not* an inner class.
```

こんなエラーが、数千のクラスに対して発生。

内容的としては、新しい環境でビルドをやりなおせ！ってことなんだろうけど、mavenCentralからなど、他の人が作ったライブラリーを使ってるのがほとんどなので、ビルドし直して使うのはあまりやりたくはないし、現実的ではない。

# 対処法

これをproguard-rules.proに追加してください。
`-keepattributes EnclosingMethod`

EnclosingMethodに対して、Proguardをかけないっていう設定です。
InnerClassesに手をつけないでくれるので、問題なくビルド・難読化ができるようになるというわけです。
これをつけてビルドし直すと、ごそっとエラーがなくなります。

## 参考リンク

[What is the “Ignoring InnerClasses attribute” warning output during compilation?](http://stackoverflow.com/questions/3308010/what-is-the-ignoring-innerclasses-attribute-warning-output-during-compilation)
【GAS】Slackから特定のチャンネル内の投稿内容をすべて取得してスプレッドシートに取り込む

　下のスクリーンショットのようにセルB1にチャンネル名を入力しておき、スクリプトを動かすと、セルA3からずらずらっとメッセージなどの情報が出てきます。

![スクリーンショット 2016-10-05 14.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/139134/a292073d-cfc7-3c31-b743-bb1f6c5d2030.png)

　APIにはチャンネル名ではなく、チャンネルIDを渡さなければならず、最初面食らいました。よってまずチャンネルIDとチャンネル名の一覧を取得し、そこからチャンネルIDを探してという流れになります。

　また、返ってくるJSONデータも投稿内容によっていろいろな項目があってそのすべては把握できていません。なのでその辺は割りとテキトーなことになっていますし、その意味ではタイトルは「すべて」取得と書いていますが厳密にはすべてではありません。
　
　詳細は省きますがトークンはリンク先から取得できたと思います。
　https://api.slack.com/web


```js:コード.gs
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();

function getSlack() {

  // チャンネルリストを取得
  var token = "取得したトークン";
  var url = "https://slack.com/api/channels.list?token="+token+"";
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  var data = JSON.parse(json);
  
  // 対象となるチャンネル名から対応するチャンネルIDを探し出す
  var channel_name = sh.getRange(1,2).getValue();
  for (var i=0; i<data.channels.length; i++) {
    if (data.channels[i].name == channel_name) {
      var channel_id = data.channels[i].id;
      break;
    }
  }
  
  // 取得したチャンネルIDをもとにチャンネル内のすべてのメッセージを取得
  var url = "https://slack.com/api/channels.history?token="+token+"&channel="+channel_id+"";
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  var data = JSON.parse(json);
  
  // スプレッドシートに取り込む

  // 最終行取得
  var lr = sh.getLastRow();
  // 初期化
  if (lr > 2) sh.getRange(3,1,lr-2,sh.getLastColumn()).clear();
  // 出てきそうな項目名を予め列挙しておく(この辺は必要に応じて加減すればよいでしょう）
  var item = [
    "file",
    "text",
    "type",
    "user",
    "ts"
  ];
  // 2次元配列化
  var ary = [];
  var ary2 = [];
  for (var i=0; i<data.messages.length; i++) {
    for (var j=0; j<item.length; j++) {
      ary.push(data.messages[i][item[j]]);
      // もしundefinedなら空欄に直す
      if (!ary[j]) {
        ary[j] = "";
      }
    }
    ary2.push(ary);
    ary = [];
  }
  // スプレッドシートに転記
  sh.getRange(3,1,ary2.length,item.length).setValues(ary2);
}
```

　実際の運用ではチャンネル名とIDやユーザー名とIDなどは別シートに予めリスト化しておき、そこから拾うような感じになるでしょうか。また、応用すれば更新されたデータのみを毎日自動でチェックとかもできるでしょう。
Reminders.appで選択中のリマインダーをAppleScriptから取得する苦肉の策


* Reminders.appのAppleScript辞書には選択中のリマインダーを取得するコマンドがない
	* AppleScriptに対応したアプリケーションではFinderのように`selection`などで取得できるものが多い
* GUI Scriptingを用いて選択中のリマインダーを無理矢理に取得する
	* GUI Scriptingを使っているので誤動作する可能性が少し高い
	* リマインダーの優先順位を変更するため、選択中のリマインダーをきちんと取得できなかったり元の優先順位が狂ってしまうこともある
	* **(2016-10-06 追記) Reminders.appでの見た目と取得したリストの順番が異なる**


```AppleScript:selectedReminders.scpt
my selectedReminders()
--> {reminder id "x-apple-reminder://BC1CD75A-071E-4093-9DF8-39F293B79BA7"}

on selectedReminders()
	set now to current date
	activate application "Reminders"
	tell application "System Events"
		set frontmost of process "Reminders" to true
		keystroke "1" using {command down}
		keystroke "z" using {command down}
	end tell
	tell application "Reminders"
		set reminderList to reminders whose modification date ≥ now
	end tell
	if reminderList = {} then
		tell application "System Events"
			keystroke "z" using {command down, shift down}
		end tell
	end if
	return reminderList
end selectedReminders
```

## 更新履歴

* 2016-08-30: GUI Scriptingを用いて優先順位を操作する方法で作成
* 2016-09-01: 選択中のリマインダー以外を取得してしまう不具合を修正
* 2016-09-01: Reminders.appで1つもリマインダーを選択していない場合に対応
よく忘れるMySQLの時々すること

#はじめに

久しぶりに投稿します。最近は、めっきりMySQLばかりを使っています。
おかげでいろいろ覚えることができた。。。
と思ったら、忘れるんです、いろいろと。

自分の備忘録を共有します。

## インストールから始めよう

### CentOS 6.8でのインストール事例です。

```
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum install -y http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
yum install -y mysql mysql-server mysql-devel
```

## よく行うこと　その１　rootのパスワードを設定しましょう
```
 # service mysqld start
 # mysql -uroot -p
 > use mysql
 > UPDATE user SET Password=PASSWORD('new password') WHERE User='root';
 > FLUSH PRIVILEGES;
 > exit
 # service mysqld restart
```

## よく行うこと　その２　ユーザーの作成と権限

### 全権限をあたえる簡単な方法
```
 > GRANT all ON *.* TO 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
```

### 特定のテーブルに権限をあたえる簡単な方法
```
 > GRANT all ON データベース名.テーブル名 TO 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
```

## よく行うこと　その３　リモートから操作を可能にする

私の場合、[MySQL workbench](https://www-jp.mysql.com/products/workbench/)をよく使うので、
開発中はサーバーにリモート接続してデータの追加・変更・削除を行います。
そのための条件として、最低限行うことは次のとおりです。

### 特定のテーブルに権限をあたえる簡単な方法
```
 > GRANT all ON データベース名.テーブル名 TO 'ユーザー名'@'自分のPCのIPアドレス' IDENTIFIED BY 'パスワード';
```

MySQL workbenchでは、MySQLのポートを開けずに行う方法があります。
SSH接続でMySQLに接続します。
そのため、開発中でもMySQLのポート3306を閉じて行うことができるので安全性が高まります。

MySQL workbench [Menu] -> [Database] -> [Manage Connection]　を選択します。

![mysql_ssh.png](https://qiita-image-store.s3.amazonaws.com/0/57930/539b576c-0751-83b1-8805-9b7e479be9d5.png)


# おわりに

基本的なことですが、忘れるんです。。。
毎回、ネットでググっています。
そうすると、読んだことがあるページばかりが出てきます。
「あぁ～、読んだわ、ここのページ」と心の中で思いつつ、
仕事してます、はい。
Macの標準機能で好きなメニューに好きなショートカットを設定する方法

環境：MacOSX El capitan (10.11.5)

はじめに
---
[Mac標準「プレビュー」の意外と知られていないTips](http://qiita.com/mtmtkzm/items/160d5bac95d4d4aaea0e)のブコメに

> 「サイズを調整」にキーボードショートカットがついてないのは不幸せ．
> http://b.hatena.ne.jp/issm/20160929#bookmark-302501447

っていうのがあってそれできるよ。Macならね（ふるい
というわけで書いてみた。

やり方
---
はじめにショートカットを登録したいアプリのメニューを確認する。
ここではプレビューの「サイズを調整」にショートカットを登録する。
<img width="1164" alt="161005-0004.png" src="https://qiita-image-store.s3.amazonaws.com/0/43054/6a5f49e0-1c65-7dd0-3682-c2c24c767f81.png">
実際にメニューを見てみると「サイズを調整」ではなく「サイズを調整…」になっていることがわかる。最後の三点リーダ（？）みたいなのは「。」を3つ打つと出てくる。


次にシステム環境設定を開いて「キーボード」を選択。「ショートカット」タブをひらく。
![161005-0001.png](https://qiita-image-store.s3.amazonaws.com/0/43054/064ccb68-bb7e-4113-bd1b-a0dfc3a1c2a1.png)
画面中央付近にある＋マークを押して、
![161005-0003.png](https://qiita-image-store.s3.amazonaws.com/0/43054/620632e7-8ce4-bd92-5bae-40b5bdecbc59.png)
ダイアログに
+ 「アプリケーション」に「プレビュー」
+ 「メニュータイトル」にさっき調べた「サイズを調整…」
+ 「キーボードショートカット」に好きなキー
を入力して「追加」ボタン

これで登録したショートカットキーでサイズを調整が呼び出される。
お試しください。
NetCDF > Can't open module file 'netcdf.mod' > /usr/includeにnetcdf.modをシンボリックリンクして対応 / -Iの定義追加で対応

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

WRF(Weather Research and Forecasting Model)関連。

### 問題

上記のシステムにてWRFの出力ファイルを処理するシステムをインストールしようとしていた。

Fortran90プログラムをmakeした時に以下のエラーが出ていた。

```
  use netcdf              ! netcdf module
                                         1
Fatal Error: Can't open module file 'netcdf.mod' for reading at (1): No such file or directory
make: *** [netcdf_output_mod.o] Error 1
```

Makefileのデフォルトでは以下となっている。

```
NETCDF = /usr
...
	FFLAGS    = -I${NETCDF}/include $(GNU_FFLAGS) $(FPP_FLAGS)
	LDFLAGS   = -L${NETCDF}/lib $(GNU_LDFLAGS)
```

netcdf.modとnetcdf.incを検索したところ、以下の場所に見つかった。

```
/usr/lib64/gfortran/modules/netcdf.mod
/usr/include/netcdf.inc
```

本来はこれら2つが同じ場所(`/usr/include`)にあることでmakeできるのではないかと思う。

## 対応1 > シンボリックリンクを作る

`/usr/include`に移動してシンボリックリンクを貼って対応した。

```
$ cd /usr/include
$ sudo ln -fs /usr/lib64/gfortran/modules/netcdf.mod .
```

これでnetcdf.modが見つからないというエラーはなくなり、コンパイルが完了した。

これで問題がないかは様子見をする。

netcdf.modとnetcdf.incが別々の場所にある理由は未消化。WRFのインストールではyumでinstallしただけだったと思う。

他の作業で何か失敗している可能性はある。

参考 http://www.gfd-dennou.org/arch/gtool/gtool4-tools-library/gtool4-tutorial/trmm/doc/netcdf_ifc.html
> もしも生成された モジュールファイルが /usr/local/netcdf-ifc/include/ に移動されなかった場合, 主導で移動する.

```
# cd /usr/local/src/netcdf-3.5.0/src/f90/
# cp NETCDF.mod /usr/local/netcdf/include/
# cp TYPESIZES.mod /usr/local/netcdf/include/
```

## ファイルの場所

https://www.rpmfind.net/linux/RPM/fedora/23/x86_64/n/netcdf-fortran-devel-4.4.2-1.fc23.x86_64.html
を見ると

> Files
>
>/usr/bin/nf-config
>/usr/include/netcdf.inc
>/usr/lib64/gfortran/modules/netcdf.mod

とあり、netcdf.incとnetcdf.modは異なるディレクトリに置かれるようだ。

## 対応2 > makefileを変更

/usr/includeにシンボリックリンクを貼らない場合。

/usr/lib64/gfortran/modules/にincludeパスが通ればいいので、`-I`オプションを追加してもいい。

```
NETCDFMOD = /usr/lib64/gfortran/modules/
...
FFLAGS    = -I${NETCDFMOD} -I${NETCDF}/include $(GNU_FFLAGS) $(FPP_FLAGS)
LDFLAGS   = -L${NETCDF}/lib $(GNU_LDFLAGS)
```

シンボリックリンクを消して、上記のようにNETCDFMOD を追加してコンパイルができるようになった。
Localeから取得できる文字列一覧

Localeクラスには、言語コードや表示用テキストといったStringを取得するメソッドがたくさんあります。
何が返ってくるのかいつもわからなくなるので、`Locale.getDefault().getLanguage()` などで取った値をいくつかまとめておきます。


メソッド|日本語|英語（カナダ）|スペイン語|インドネシア語
:--|:--|:--|:--|:--
getLanguage()|ja|en|es|in
getISO3Language()|jpn|eng|spa|ind
locale.getDisplayName()|日本語 (日本)|English (Canada)|español (España)|Bahasa Indonesia (Indonesia)
locale.getDisplayLanguage()|日本語|English|español|Bahasa Indonesia
locale.getCountry()|JP|CA|ES|ID
locale.getISO3Country()|JPN|CAN|ESP|IDN
locale.getDisplayCountry()|日本|Canada|España|Indonesia
locale.toString()|ja_JP|en_CA|es_ES|in_ID


以上です。
Dockerコンテナが立ち上がらない

# Dockerコンテナがエラーで立ち上がらない
CIサーバ上でテスト実行時、ある日突然こんなエラーが出てコンテナが起動出来なくなっていた。  
`docker: Error response from daemon: devmapper: Thin Pool has 0 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior.`
  
# 容量エラー
もしかして結構不要なイメージとかコンテナとか溜まってるのかな・・・と思ったわけで、一旦確認してみる。
一部省略してるけどこんな感じだった。

```
$ docker info
Containers: 
 Running: 5
 Paused: 0
 Stopped: 160
Images: 30
Storage Driver: devicemapper
 Data Space Used: 105.4 GB
 Data Space Total: 107.4 GB
 Data Space Available: 2.0 GB
```  

# 不要なコンテナとイメージを削除する
## 停止中のコンテナを一括削除
`$ docker rm $(docker ps -aq --filter status=exited)`

## 不要なイメージを一括削除
`$ docker rmi $(docker images -aq --filter dangling=true)`

# ゴミ掃除後にもう一度容量を確認する
```bash
$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Storage Driver: devicemapper
 Data Space Used: 105.4 GB
 Data Space Total: 107.4 GB
 Data Space Available: 2.0 GB
```
変わらねえええええええええ！
サービスを再起動したり諸々試したけど何も変わらず。

# 結論
どうやらカーネル側のバグのようです。
https://github.com/docker/docker/issues/3182

# 解決方法
issueを見てもらうと分かる通り、遭遇した場合下記の方法で解消するようです・・・(これを解消と言っていいのか)。
 - Dockerを一度アンインストールする
 - `/var/lib/docker`ディレクトリ配下を全削除する

# 再現環境
最後に自分が遭遇した際の環境を晒しておきます。

```bash
$ docker -v
Docker version 1.11.2, build b9f10c9/1.11.2
$ uname -r
4.4.16-27.56.amzn1.x86_64
```
iOSでスクロールが効かなくなったバグ

## 結論

こいつを消したら直った

```css:css
-webkit-overflow-scrolling: touch;
```

## 詳細

上記が指定してある要素内で以下のようなcssを記述した場合、バグった。

* `display: none`　（jsで後々表示させる用）
* `position: absolute`
* `position: fixed`

私の場合は `html` に `-webkit-overflow...` が指定してあったため、
スクロールが効かなくなっていた。

本来 `-webkit...` は、 `overflow: scroll` の要素に指定することで、
スクロール時のカクつきをおさえるために利用されるものなのだけれど、
おまじない的に全体に使っていたのがよくなかったらしい。

↓ とも似た現象だったのだけれど、こちらでは解決しなかった。
http://glatchdesign.com/blog/web/css/998

`-webkit-overflow-scrolling: touch` は正しく使おう。
redirect_to で wrong number of arguments が出る原因と解決策


##問題

結構前に作ったRailsアプリを改造している時に、
redirect_toで「wrong number of arguments」というエラーが出た。

```ruby:sample.rb
def redirect_back_or(default)
	redirect_to(session[:forwarding_url] || default)
	session.delete(:forwarding_url)
end
```

どう考えても引数ひとつですよね・・・。

##解決策

tubolinksのバージョンが古かったのが原因。
2.3.0以上に更新したら解決する。

```ruby:Gemfile
gem 'turbolinks', '2.3.0'
```
Android Studio 2.2にアップデートして発生するGradle sync failed対応


# Gradleでビルドできない

Android Studio 2.2にアップデート後、gradleのバージョンも
`com.android.tools.build:gradle:2.2.0`
にアップデートすると発生します。
NDKのサポートのため、gradle-experimentalを使っていると、Gradle Sync時に `Gradle sync failed: Unable to load class 'com.android.builder.profile.Recorder$Property'.` のエラーが起こり、進まなくなってしまいます。

# GradleExperimentalをアップデートして対処

gradle-experimentalもアップデートすることで、エラーが解消します。

修正前
`classpath 'com.android.tools.build:gradle-experimental:0.7.2'`
↓
修正後
`classpath 'com.android.tools.build:gradle-experimental:0.8.0'`

## 参考リンク

[Failed to sync Gradle project - Android Studio 2.2](http://stackoverflow.com/questions/39587367/failed-to-sync-gradle-project-android-studio-2-2)
ES6 In Depth: let and const


> 此文来自[ES6 In Depth: let and const](https://hacks.mozilla.org/2015/07/es6-in-depth-let-and-const/).有所改编.


之前在[what's the ES2015](http://qiita.com/xiangzhuyuan/items/955792768d17df7f64b6)提到了[关于`let` 和` const`](http://qiita.com/xiangzhuyuan/items/955792768d17df7f64b6#let-%E5%92%8C-const-%E8%B5%8B%E5%80%BC).但是一带而过并没有深入, 现在我们重新回过头来看看他们具体的意义以及如何在实际使用当中规避一些错误.


- #问题1: 块没有很好地实现作用域
- #问题2: 循环中共享了变量

# `let` 来代替` var`

- `let` 定义的变量是 **块**级别的作用域
- 即使在全局通过` let` 定义的变量也不属于全局对象的属性
- 在循环中定义的临时变量会在循环时更新引用
- 用` let` 定义的变量需要在使用前声明
- 重复通过` let` 定义同名变量是语法错误的

# `const`

通过` const` 定义的变量其实就相当于你使用了` let`, 但是不能够再去赋值修改它的值.
Azure App Serviceを使ってWebサイトを公開する

このチュートリアルの内容は次の通りです。

1. Azure App Serviceを作成する
1. HTMLファイルを作成しOneDriveにアップロードする
1. OneDriveのファイルをApp Serviceにデプロイする  
デプロイの方法はいくつかありますが、今回はOneDriveを利用します

#### 1. AzureアカウントでAzure Portalにサインインする  
[https://portal.azure.com/](https://portal.azure.com/)
![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/55550/e5bf562a-d644-82c4-0f2d-d725e1d51ada.png)

#### 2. Web Appを新規作成する
左端のメニューで、[+ 新規]、[Web + モバイル]、[Web App] の順にクリックする
![クリップボード04.png](https://qiita-image-store.s3.amazonaws.com/0/55550/aa8f3406-c4f6-d946-7ea6-4478076794b3.png)

アプリ名、リソースグループ名を入力し、[作成]をクリック
![クリップボード05.png](https://qiita-image-store.s3.amazonaws.com/0/55550/7207440e-e81d-7a8b-7187-6c20323a6e6c.png)

しばらく待つとデプロイが完了し、通知メッセージが表示される
![クリップボード06.png](https://qiita-image-store.s3.amazonaws.com/0/55550/4b64028f-f91e-2a88-b1eb-02aac128bb7c.png)

#### 3. Web Appの確認
ダッシュボードを更新すると、作成したWebサイトが[すべてのリソース]に表示される
![クリップボード07.png](https://qiita-image-store.s3.amazonaws.com/0/55550/c4e49b8a-4653-dc6b-bf95-a552518d280c.png)

作成したWebサイトをクリックすると、Web Appの詳細が表示される
![クリップボード08.png](https://qiita-image-store.s3.amazonaws.com/0/55550/75f82085-f681-17f8-d8c6-7ee0ee2531df.png)

ブラウザでURLを開くと、AzureのWeb Appが作成されている
![クリップボード09.png](https://qiita-image-store.s3.amazonaws.com/0/55550/34202dfa-e3bf-bda4-ed57-11f229c94583.png)

#### 4. Webページの作成

このようなHTMLファイルを作成し、OneDriveにアップロードする
[https://onedrive.live.com/](https://onedrive.live.com/)

```html:index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>My website</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>
```

場所は、ファイル > Apps > Azure Web Apps > mytutorialsite のように
![クリップボード18.png](https://qiita-image-store.s3.amazonaws.com/0/55550/714b2a6e-551e-0751-6564-9e2d30e90d27.png)

#### 5. Webサイトのデプロイ
[デプロイ オプション]、[ソースの選択]をクリックし、[OneDrive]をクリックする
![クリップボード11.png](https://qiita-image-store.s3.amazonaws.com/0/55550/8dbde7e6-0818-7fab-9b6a-41f7f9793209.png)

OneDriveへのアクセス許可を要求されるので[承認する]をクリックする
![クリップボード12.png](https://qiita-image-store.s3.amazonaws.com/0/55550/b77f3a11-2a2d-16fe-b05b-136329962d67.png)

OneDriveへのアクセス許可を要求されるので[はい]をクリックする
![クリップボード13.png](https://qiita-image-store.s3.amazonaws.com/0/55550/4d2ef5c9-378b-1d1d-0554-d0a406c067a0.png)

[OK]をクリックする
![クリップボード14.png](https://qiita-image-store.s3.amazonaws.com/0/55550/a7ef1912-cdd7-286d-6ab1-d3e9b8469e7c.png)

WebサイトのファイルがOneDriveのファイルと同期される
![クリップボード19.png](https://qiita-image-store.s3.amazonaws.com/0/55550/7295a9a4-d190-7144-9fe5-22153a3bdb40.png)

#### 6. Webサイトの確認

おつかれさまでした
![クリップボード20.png](https://qiita-image-store.s3.amazonaws.com/0/55550/8549233c-9ab1-d600-75cf-ac198b9c8398.png)
【入門～中級向け】【R】Rを使った並列計算でスピードアップ！

#はじめに
　データ分析でRを使っていると、データ前処理・加工やループ計算で時間がかかったりすることもしばしばです。Rは計算処理が遅いといわれますが、単純な足し算などはベクトルを使って処理させれば計算時間を改善することもできますし、オリジナルな関数を使って計算を早くしたいという場合には、複数のCPUを使った「並列計算」によって計算時間を大幅に減らすことができます！

#準備
- R 2.14.0以上
- 必要なライブラリー　parallel（と、ここでは祝日データが必要なため、Nippon）

#目的（やりたいこと）
日付のリストを受け取って、もし平日ならそのまま、休日や祝日だと後の直近営業日のリストを返す処理を作成します。

#コード

```
#  libraries
library(Nippon)
library(parallel)

#  input data
date.List <- seq(as.Date("2016/1/1",format="%Y/%m/%d"),as.Date("2016/12/31",format="%Y/%m/%d"),by=1)

#  function
calcNormalDate <- function(date_)
{
  calc.Date <- as.Date(date_)
  n <- length(date_)
  for (i in 1:n){
    while(is.jholiday(calc.Date[i]) || weekdays(calc.Date[i]) %in% c("土曜日","日曜日"))
    {
      calc.Date[i] <- calc.Date[i] + 1
    }
  }
  return(calc.Date)
}


#  normal calc
system.time(new.date.List <- calcNormalDate(date.List))

#  parrallel calc
cl <- makeCluster(4)
clusterCall(cl,Sys.getpid)
clusterExport(cl,"is.jholiday")
system.time(new.date.List <- parLapply(cl,date.List,calcNormalDate))
stopCluster(cl)
```

#結果
- ノーマル処理　経過時間： 2.16 
- 並列処理　経過時間：  **0.88**

#解説
- インプットデータとして、2016/1/1から2016/12/31まで日付リストを作成します。
- calcNormalDate で目的の関数を作成します。
- cl <- makeCluster(4)で、ワーカープロセス数を指定して、クラスター生成します。ここでは4つです。
- clusterExport(cl,"is.jholiday")を入れとかないと、is.jholidayがないとエラーがでます。
- parLapply(cl,date.List,calcNormalDate)の2番目の引数にデータを入れて、3番目の引数にオリジナル関数を入れます。
- 祝日はNIPPONライブラリーを使っています。
 
#終わりに
他の言語（C++やJAVAなど）が使えるのであれば、それらで処理をさせたほうがいいと思いますが、そういったことができない場合にこの並列計算は役に立ちます。

#参考資料
『Rによるハイパフォーマンスコンピューティング』（著：福島真太郎、出版：ソシム株式会社）がおすすめです。
Makefile > 引数を使ってビルド条件を切替える > MAKECMDGOALDS 

```txt:動作環境
CentOS 6.8
GNU Make 3.81
```

某ソフトのインストール方法のメモに以下のような記載がある。

```
make -f makefile.xxx mpi  for MPI+OPENMP hybrid run
make -f makefile.xxx omp  for OPENMP parallel run
make -f makefile.xxx serial for a serial run
```

mpi, omp, serialを切替えてmakeできるようだ。

makefile.xxxを見ると以下のような記載がある。

```
...
ifeq ($(MAKECMDGOALS),serial)
	FC=$(FCSER)
	MAIN=$(BASENAME)_serial
        FFLAGS2=$(FFLAGS)
        LDFLAGS2=$(LDFLAGS) 
endif
ifeq ($(MAKECMDGOALS),omp)
	FC=$(FCOMP)
	MAIN=$(BASENAME)_omp
        FFLAGS2=$(FFLAGS)
#        LDFLAGS2=$(LDFLAGS) -lpthread 
        LDFLAGS2=$(LDFLAGS) 
endif
ifeq ($(MAKECMDGOALS),mpi)
	FC=$(FCMPI)
	MAIN=$(BASENAME)_mpi
        FFLAGS2=$(FFLAGS) -I${MPI_ROOT}/include
        LDFLAGS2=$(LDFLAGS) -lpthread -L${MPI_ROOT}/lib -lmpi
endif
...
```

今は詳細を追わないが、条件を変えてmakeするときに使えそうな構文だ。
PythonでECHONET Lite家電を操作

# はじめに
pythonでECHONET Liteによる家電操作のサンプルコードを載せます。
※ECHONET Lite（ISO/IEC 14543-4-3）国際規格

やりたいことは
1. 家電製品のON,OFF制御
2. 家電機器の動作状態の取得

Ruby版は[RubyでECHONET Lite家電を制御する](http://qiita.com/miyazawa_shi/items/4c645315262d5cf5b015)にありますので　そちらを見てください。

※　以下のサンプルプログラムは空気清浄機をターゲットにしています。
　　エアコンや照明を制御したい場合は、上記のRuby版に詳しく書いてあるので、そちらを参考にしてください。

# 環境
●　空気清浄機（ECHONET Lite対応）
　⇒　[Sharp KI-EX100](http://www.sharp.co.jp/kuusei/products/kiex100.html)
●　Windows 7
●　Python 2.7.11

## 動作状態をONにする
ip　= "192.168.○.○"の部分は各自の機器のIPをしてしてください

```python:ON_send.py
# coding: utf-8
import socket

ip = "192.168.2.166"
ECHONETport = 3610

message = "1081000005FF010135016101800130"
msg = message.decode("hex")

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(msg, (ip, ECHONETport))
```

##動作状態をOFFにする

```python:OFF_send.py
# coding: utf-8
import socket

ip = "192.168.2.166"
ECHONETport = 3610

message = "1081000005FF010135016101800131"
msg = message.decode("hex")

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(msg, (ip, ECHONETport))
```
上記のプログラムで違うのは
7行目の　message　変数の中だけ

ONの時
message = "1081000005FF010135016101800130"

OFFの時
message = "1081000005FF010135016101800131"


# 動作状態の確認を行う
家電機器の動作状態のリクエストを送信するプログラムと
家電機器から動作状態を受信するプログラムにわけて説明します。

##送信プログラム
```python:get_send.py
# coding: utf-8
import socket

ip = "192.168.2.166"
ECHONETport = 3610

message = "1081000005FF0101350162018000"
msg = message.decode("hex")

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(msg, (ip, ECHONETport))
```
##受信プログラム
```python:receive.py
# coding: utf-8
import socket

port = 3610
bufsize = 4096

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", port))
data = sock.recvfrom(bufsize)
print data[0].encode('hex')
print data
sock.close()

```
上手に受信が出来れば以下のようなメッセージが表示されるはず
正しい情報は1行目です。
2行目は16進数にエンコードされていないので、正しく表示されません。recvformを使うと送信元のIPがわかるので何かと便利ってことを伝えたかっただけです。
今回はテストのためにサンプルコードの11行目を入れましたが、必要ないコードなので消してください。

![図1.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/542a7d03-f3e5-d75a-9162-22aa5f38fb99.jpeg)


ちなみに、サンプルコードの9行目の
```
data[0].endode("hex")
```
はpython2系のみ動作するみたいです。なので3系は試していないので、16進数にするエンコード方法をご自身で探して実行してください。

3系とか2系とか何を言っているかわからなかった場合はコマンドプロンプトもしくはターミナルで以下を実行
```
$ python --version
```
表示が
python 2.○.○　の場合は　2系です
python 3.○.○　の場合は　3系です