OmniAICreator/Qiita-1.07M huggingface dataset:
IntelliJ IDEAの厳選ショートカット(2個)

IntelliJ IDEAを使う時にはとりあえず厳選ショートカット2つだけは覚えておく、または覚えてもらうと少しだけ幸せになれます。インクリメンタル検索系は見栄えも良くインパクトがあるため、知らない人に教えてあげると結構使うようになります。

- IntelliJ IDEA Community Edition 2017.1で確認しています。
- ショートカットはWindows版のものです。

# 対象者
- IntelliJ IDEAは未経験または初心者
- EclipseやVisualStudioなどのIDEを利用した経験がある（自動補完など）
- ソースコードをダラダラ探し回ることが多い

# 超厳選ショートカット(2個)
どちらも検索/ナビゲーション関連のショートカットです。また、どちらもインクリメンタル検索で動作します。
最近のVim, Emacs, Atomを多少使いこなしている人であれば、似たような操作を日常的に使用しているかもしれません。

## `Shift + Shift`: 全て検索
一つだけしか教えられないのであればこれだけ教えます。
JetBrainsのHadi Hariri氏が「起動時にタブが無い画面で`Shift + Shift`とかを紹介してるのに使ってる人が少ないよね。誰もドキュメントなんて読まない証拠だよね」みたいなことを言って拗ねていたので、意外と知らない人が多いのかもしれません。

- プロジェクト内のファイル名、クラス名、シンボル名(変数、メソッド等)をインクリメンタル検索する。
- 検索文字を入力する前は最近アクセスしたファイル(Recent Files)が候補として表示される。
- ここからクラス検索(`Ctrl + N`)ショートカットを押すことにより、より詳細な検索に移行することが可能。なお親切にショートカットキーを表示してくれるため、必要な時にそのショートカットキーを叩けばよい。

## `Ctrl + Shift + F`: grep検索
Unix環境メインで作業する人はこちらの方が便利に感じるかもしれません。

- プロジェクト内の各種ファイルのテキストに対してgrep検索(インクリメンタル検索が有効)する。
- 検索結果をカーソル移動またはマウスクリックすると、瞬時に該当ファイルの中身を表示する。
- 大小文字区別、正規表現、単語単位のオプション指定が可能。
- 日本語の文字列も検索可能。


# 個人的にお気に入り
個人的に気に入っているショートカットです。

## `Ctrl + Alt + 左右キー`: ナビゲーションのUndo/Redo
- 関連するメソッド、クラスを`Ctrl + 左クリック`等のナビゲーション操作で移動していく場合、そのナビゲーション箇所を行き来する。
- 様々なクラス、メソッドの参照にジャンプして行き来する場合に便利。
- 例えばメソッドA,B,C,Dとジャンプして、D,C,B,Aと確認しながら戻りたい時などに利用する。

## `Ctrl + P`: メソッドのパラメータ一覧表示
- 現在カーソル上にあるメソッドのパラメータ一覧をポップアップ表示する。
- オーバロードされているメソッドの場合は、各パラメータ一覧を表示する。


## `Ctrl + Q`: クラス/メソッド/変数のドキュメント表示
- 現在カーソル上にあるクラス/メソッド/変数の定義情報およびドキュメントをポップアップ表示する。

## `Ctrl + w`: 拡張選択
- カーソル上にある単語を選択した状態にする。
- 再びショートカットの実行を続けていくと、メソッドの引数一覧、メソッド、ステートメント、ブロックという形で選択された箇所が拡張していく。

## `Alt + Enter`: 修正候補表示
- エラーまたは推奨の波下線が表示されてる箇所に対する自動修正候補を表示する。
- 修正候補を選択してEnterを押すと、自動的にその修正を試みる。


#(おまけ) 厳選ショートカットの根拠
下記3点の問題への貢献度の大きさをもとに選びました。

- 思考が阻害される。
- 時間がかかる。(場合によって数十秒〜数百秒)
- 作業時間のバラツキが大きい。

上記の３点を考えた場合、例えばBuild/Runをキーボードショートカットではなくマウスで行うようなケースはそれほど大した問題ではありません。マウスに慣れている人は無意識にBuild/Runボタンをマウスでクリックできるため思考を阻害されることはありませんし、作業時間も2~3秒程度と短くで安定します。これはマウスで右クリックして選択するような作業（Refactoring, Find Usage, Go To等）についても同様です。

しかしソースコード検索、ナビゲーションに関わるものは話が異なります。プロジェクト事に構成等が異なるため、手動でJavaパッケージを開いたり、ソースコードを開いていくのは2~3秒どころか数十秒かかる場合もあります。そしてよほどのことがない限りはこの作業を無意識に行うのは難しいため思考が阻害されることになります。こういったところこそ、優先的に解消または軽減すべきだと思います。

もちろん好きな人は３点を意識することなく、キーボードショートカットを好きなだけ覚えて効率化を進めましょう。ちなみに私はVim大好きです。
Node.jsのrequestモジュールを使用してattachments付きでSlackに投稿するサンプル

内容はタイトルのとおりです。
:warning: : attachmentsを`JSON.stringify()`してから渡す

## サンプル

```js:slack-post.js
'use static';
const request = require('request');

let slack_endpoint = "https://slack.com/api/chat.postMessage";
let payload = {
  form: {
      token: '<slack_api_token>',
      channel: 'bot-test',
      username: 'test-bot',
      attachments: JSON.stringify([
        {
          "color": "#36a64f",
          "pretext": "node.jsのrequestモジュールを使用してattachments付きで投稿",
          "author_name": "daikiojm",
          "author_link": "http://qiita.com/daikiojm",
          "title": "テスト投稿",
          "text": "テスト投稿の内容"
        }
      ])
  }
}
request.post(slack_endpoint, payload, (error, response, body) => {
  if (error) {
    console.log(error);
  } else {
    console.log(body);
  }
})
```

## 結果
![SnapCrab_NoName_2017-6-7_22-0-36_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/79414/70ad05e4-8261-f873-f494-bc948dcbe157.png)

attachmentsできれいに整形されたメッセージが投稿される:zap:
JavaScriptにおける配列の空要素除去filterパターン


nullやundefinedなどのfalsyな要素を除去し新しい配列を取得するには`filter`を使うのは知られている。
filterはtrueとなる要素のみの新しい配列を生成する関数であるが、いくつかパターンがある。

## filter(v => v)

```js
const arr = [1, 2, 3, null, 5, undefined, false, 7]
const x = arr.filter(v => v)
console.log(x) // [ 1, 2, 3, 5, 7 ]
```

よく見る。

## filter(v => !!v)

```js
const arr = [1, 2, 3, null, 5, undefined, false, 7]

const y = arr.filter(v => !!v)
console.log(y) // [ 1, 2, 3, 5, 7 ]
```
`!!`でBooleanに変換する。
個人的にはあまり好きではない。

## filter(Boolean)

```js
const arr = [1, 2, 3, null, 5, undefined, false, 7]

const z = arr.filter(Boolean)
console.log(z) // [ 1, 2, 3, 5, 7 ]
```

このパターンを採用しているライブラリはBabelやrollupなど

https://github.com/babel/babel/blob/5cc1cbf3bc4ea8b93b48e9338c544d7cd6cefdb8/packages/babel-types/src/index.js#L415
https://github.com/rollup/rollup/search?utf8=%E2%9C%93&q=filter%28+Boolean+%29&type=

## ベンチマーク

```js
const { Suite } = require('benchmark')

const suite = new Suite()

const arr = [1, 2, 3, null, 5, undefined, false, 7]

suite
  .add('filter(v => v)', function() {
    arr.filter(v => v)
  })
  .add('filter(v => !!v)', function() {
    arr.filter(v => !!v)
  })
  .add('filter(Boolean)', function() {
    arr.filter(Boolean)
  })
  .on('cycle', function(event) {
    console.log(String(event.target))
  })
  .on('complete', function() {
    console.log('Fastest is ' + this.filter('fastest').map('name'))
  })
  .run({ async: true })

// filter(v => v) x 1,128,274 ops/sec ±1.22% (87 runs sampled)
// filter(v => !!v) x 1,121,664 ops/sec ±0.75% (89 runs sampled)
// filter(Boolean) x 1,122,628 ops/sec ±1.26% (90 runs sampled)
// Fastest is filter(v => v),filter(Boolean)
```

優劣なし。

## まとめ
好み。
日本語キーボードで英語配列を使う [keyhac]

# keyhacでUS配列風に変更する設定

日本語キーボードなのに英語配列を使うなんて、わけわからないことをしてるか？
新しく仕事で使うことになったPCがUS配列だったんです。意識高いですよ。
ソースコードはみんなvimで書いてるらしい。自分はまだvimレベル2くらい。

仕事用のPCは自分の力じゃ変えられないので、体のほうをUS配列に合わせることに。
プライベートで使ってるPCを日本語配列なのに、英語配列風にして使います。

```
# 英語配列化（MacBook用）
kmg = km.defineWindowKeymap()
# S-2 => @
kmg[ "Shift-2" ] = "OpenBracket"
# S-6 => ^
kmg[ "Shift-6" ] = "Plus"
# S-7 => &
kmg[ "Shift-7" ] = "Shift-6"
# S-8 => *
kmg[ "Shift-8" ] = "Shift-Quote"
# S-9 => (
kmg[ "Shift-9" ] = "Shift-8"
#@ S-0 => )
kmg[ "Shift-0" ] = "Shift-9" 
# S-- => _
kmg[ "Shift-Minus" ] = "Shift-(94)"
# ^ => =
kmg[ "Plus" ] = "Shift-Minus"
# S-^ => +
kmg[ "Shift-Plus" ] = "Shift-Semicolon"
# [ => \
# S-[ => |
#km.replaceKey( "CloseBracket", "(93)" )
## 半角/全角 => `
#kmg[ "(243)" ] = "S-(192)"
#kmg[ "(244)" ] = "S-(192)"
# S-半角/全角 => ~
#kmg[ "S-(243)" ] = "S-(222)"
#kmg[ "S-(244)" ] = "S-(222)"
# ~はとりあえず元の位置に
kmg[ "Ctrl-Plus" ] = " Shift-Plus"
# Ctrl-1 => `
kmg[ "Ctrl-1" ] = "Shift-OpenBracket"
# @ => [
# S-@ => {
km.replaceKey( "OpenBracket", "CloseBracket" )
# [ => ]
# S-[ => }
km.replaceKey( "CloseBracket", "BackSlash" )
# S-; => :
kmg[ "Shift-Semicolon"  ] = "Quote"
# : => '
kmg[ "Quote" ] = "Shift-7"
# S-: => "
kmg[ "Shift-Quote"  ] = "Shift-2"
# } => Enter この位置には何もないけど。
km.replaceKey( "BackSlash", "Return" )
```

チルダ(~)とバッククォート(`)に関してはキーがないのでとりあえずで置いてみた。
バックスラッシュキー(\、|)に関してもどこに配置場所がないので、悩んでる。

# HENTAIキーバインド

ついでに。

セミコロンをエンターにしてる。セミコロンはCtrl+セミコロンで出せる。
Ctrl+Iでカタカナ変換、Ctrl+＠でアルファベット変換。Ctrl+HJKLで移動できるようにしてる程度のHENTAI。

```
    if 1:
        keymap_global["Ctrl-N"] = "Back"
        keymap_global["Ctrl-Quote"] = "Fn-Delete"
        keymap_global["Ctrl-I"] = "Fn-F7"
        #keymap_global["Ctrl-OpenBracket"] = "Fn-F10"
        keymap_global["Ctrl-CloseBracket"] = "Fn-F10"
        keymap_global["Semicolon"] = "Enter"
        keymap_global["Ctrl-Semicolon"] = "Semicolon"
        keymap_global[ "Ctrl-H" ] = "Left"                # Move cursor left
        keymap_global[ "Ctrl-J" ] = "Down"                # Move cursor down
        keymap_global[ "Ctrl-K" ] = "Up"                  # Move cursor up
        keymap_global[ "Ctrl-L" ] = "Right"               # Move cursor right
        keymap_global[ "Ctrl-Shift-H" ] = "Shift-Left"                # Move cursor left
        keymap_global[ "Ctrl-Shift-J" ] = "Shift-Down"                # Move cursor down
        keymap_global[ "Ctrl-Shift-K" ] = "Shift-Up"                  # Move cursor up
        keymap_global[ "Ctrl-Shift-L" ] = "Shift-Right"               # Move cursor right
        #keymap_global[ "Ctrl-CloseBracket"  ] = "Escape"
        keymap_global[ "Ctrl-BackSlash"  ] = "Escape"
```
ABAP Development Guidelines Best Practices

#Need to condider
When I created ABAP Development Guidelines, I saw much information.
Following pages were very useful.

#Helpful Links
##### [Development Guidelines for Greenfield Implementation in sync with SAP Custom Code Management](https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=448470908)
This page is custom code management rather than development guidelines.  

##### ["Best Practice Guidelines for Development - Practical tips" from DSAG](https://www.dsag.de/fileadmin/media/Leitfaeden/Leitfaden_Best_Practice_Guide_eng/files/assets/downloads/publication.pdf)
##### ["Best Practice Guidelines for Development - Useful tips" from DSAG](https://www.dsag.de/sites/default/files/dsag_recommendation_abap_development.pdf)
DSAG always gives us very helpful information.  The doc is brilliant.

##### [SAP official guidelines](https://archive.sap.com/kmuuid2/c0f0373e-a915-2e10-6e88-d4de0c725ab3/SAP%20Guidelines%20for%20Best-Built%20Applications%20That%20Integrate%20with%20SAP%20Business%20Suite.pdf)
Its contents are not only ABAP but also BW, PI and other areas.

##### [Github](https://github.com/larshp/abapOpenChecks)
The static check, which can be integrated with code inspector.  Though I haven't import the checks, the contents were helpful.

#####[ABAP Help](http://help-legacy.sap.com/abapdocu_740/en/index.htm)
Needlsess to say, every ABAP engineer reads this help document.  "ABAP - Programming Guidelines " was so helpful when creating our guidelines.
NVDIA GPUのチューニング

# NVDIA GPUのチューニング
めもめも

#### 1. GPUの設定を永続化させる
```
sudo nvidia-smi -pm 1
```

#### 2. Auto Boost 機能を無効にする
```
sudo nvidia-smi -auto-boost-default=0
```

#### 3. CUDAコアクロックを最大値に固定する
```
sudo nvidia-smi -ac 1300,875
```

※ 設定する値はGPUの種類により異なる
※ GPUの種類によって、CUDAコアクロックを固定出来ない事がある
PHPerだけどAWS STSを活用してSaaSをマルチテナント化した

本記事は[cloudpack あら便利カレンダー2017](https://cloudpack.github.io/benri2017/)の06/07(水)の記事です。


`AWSアカウント：プロジェクト = １：ｎ` なSaaSをβでリリースしてたけど、本番稼働にあたってAWSの請求情報わけられないじょん！
っていうヤバさを解決したい人生でした。

## 経緯

```
S3(Web) - EC2(API) - Device Farm
ユーザ認証：Cognito User Pools/DynamoDB
```

1. ひとつのアカウント内のDevice FarmをSaaSで提供したい
2. こんな感じのアーキテクチャ構想で組んで、これでいけるぜ！ってなった
3. Device Farmには複数のProjectを立てることができる
4. Cognitoに登録したユーザとProjectのヒモ付はDynamoDBで行っている
5. サービスの課金形態的に、Projectごとの利用時間を計算する必要がある
6. そんなことすっかり忘れてた!!
7. 四則演算絶対やりたくない == ズレたときに燃えるのが目に見えてる
8. Device Farmを別のアカウントにわけちゃおうぜ！！


## どうやって実現したか
AWSには、他アカウントのリソースにアクセスする仕組みが用意されているため、それを使って実現しました。
STSの仕組みについては[こちら](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)を参考にしてください。

1. Cognitoのログインユーザーを特定して
2. それをキーにDynamoDBからRoleのARNをひいて
3. そのアカウントのDeviceFarmClientを取得する

こうすることで、

- 請求情報はクライアント毎のアカウントに紐づくため請求処理も楽ちんに！！（ログインして請求情報見るだけ）
- 今までプログラム上で「このProjectはこのユーザと紐付けて...」みたいな認証処理が不要に!! == セキュアに！

みたいなメリットが得られました！便利だね！すごいね2017年！


## 結論

AWS STS AssumeRoleつかったクロスアカウントアクセスは便利


## コードのっけておきます

なんとなくstaticなSingletonで実装しました。

```php:呼び出し側.php
<?php

use App\AwsClient;

$arn = ''; // なんかしらとってくる
$DeviceFarmClient = AwsClient::DeviceFarm($arn);

return $DeviceFarmClient->listProjects()->toArray();
```

```php:呼び出され側.php
<?php

namespace App;

use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient;
use Aws\Credentials\AssumeRoleCredentialProvider;
use Aws\DeviceFarm\DeviceFarmClient;
use Aws\Sts\StsClient;

class AwsClient
{
    private static $DeviceFarm;

    private function __construct()
    {
    }

    final function __clone()
    {
        throw new \Exception('__clone() is not allowed'); 
    }
    
    public static function DeviceFarm($arn = null)
    {
        if (!self::$DeviceFarm) {
            $assumeRoleCredentials = new AssumeRoleCredentialProvider([
                'client' => new StsClient([
                    'region' => 'us-west-2',
                    'version' => 'latest'
                ]),
                'assume_role_params' => [
                    'RoleArn' => $arn,
                    'RoleSessionName' => 'service-' . time(),
                ]
            ]);

            self::$DeviceFarm = new DeviceFarmClient([
                'region' => 'us-west-2',
                'version' => 'latest',
                'credentials' => $assumeRoleCredentials
            ]);
        }

        return self::$DeviceFarm;
    }
}
```

参考：http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#assume-role-credentials
#PlayFramework Sessionを使ってみる

## Session とは
Play でアプリケーションを開発するときに使えるデータ保存スペース。
複数のHTMLリクエストをまたいでデータを保持したい場合、この Session を使うことで実現することができる。ユーザログイン機能の実装とか、前ページの入力結果を次ページに使いたいときとか。（これはリクエストパラメータでもいいよね）
これの便利なところが、いったんセッションに保存された値はそのユーザの1セッション中は最後まで保持されるという。
## 使い方を見ていく
### Session に値を保存する
以下のようにして値を保存する。

```
Ok(_____).withSession("key" -> "value")
```

さらに加えて値を保存したい場合は、追加するように書く。

```
Ok(_____).withSession(request.session + ("key" -> "value"))
```

### Session から値を取り出す
以下のようにして値を取り出す。

```
request.session.get("key")
```

この結果は`Option`型になるので、`getOrElse`を使うように。
【C#】 日付操作まとめ

~~メモレベルですので悪しからず。~~


##特定の日付から曜日を取得する方法

```
using System;
public class Date
{
   public static void Main()
   {
      DateTime date = new DateTime(2016, 6, 7);
      Console.WriteLine((int) dateValue.DayOfWeek);
   }
}
```

結果
3

##曜日の数値

| Left align       |       Right align |  
|:-----------------|------------------:|
|日曜日             |                 0 |  
|月曜日             |                1 |  
|火曜日             |                 2 |  
|水曜日             |                 3 |
|木曜日             |                4 |  
|金曜日             |               5 | 
|土曜日             |                6| 




---------------

##最終日の取得方法

```
 int date  = DateTime.DaysInMonth(2010,10);
 Console.WriteLine(date);
```

結果
31

----


##現在の年を取得する

```
    // 必要な変数を宣言する
    DateTime dt = DateTime.Now;
    // 年間積算日を取得する
    int year = dt.Year;

```

Yearの部分をDayやMonthに変更すると現在の日付け、月が取得できます

----
## 月数を加算または減算

```
    // 日付と時刻を格納するための変数を宣言する
    DateTime dtBirth = DateTime.Parse("2016/06/15");

    // 6 ヶ月加算する
    dtBirth = dtBirth.AddMonths(6);
```

6の部分を「-3」と入力すると3カ月減産することができます。


###参考
- [DateTime.DaysInMonth メソッド](https://msdn.microsoft.com/ja-jp/library/system.datetime.daysinmonth(v=vs.110).aspx)
- [DateTime.AddMonths メソッド](https://msdn.microsoft.com/ja-jp/library/system.datetime.addmonths.aspx)
- [DateTime.AddYears メソッド](https://msdn.microsoft.com/ja-jp/library/system.datetime.addyears.aspx)
git diffについて

# git diffで＋と－がどっちがどっちかわからなくなるから、一度確認する

git logの状態

```bash
$ git log 
commit eb59cf6d61d2c9b2a106d0d64cca976cad2efc44
Author: kohei.shimadutsu
Date:   Wed Jun 7 20:12:10 2017 +0900

    third commit

commit 85448e9a9477f077a4904a48eb467585eb4f5015
Author: kohei.shimadutsu
Date:   Wed Jun 7 20:11:44 2017 +0900

    second commit

commit f90d4dd80c16d7fa7f7b9cc9ed6827b0f4319170
Author: kohei.shimadutsu
Date:   Wed Jun 7 20:10:49 2017 +0900

    initial commit

```

## git status 

README.mdに変更があります。

```bash
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
```


## git diff

git diffの後ろに何も指定しなければ、コミットされていない状態のファイルとHEADの差分が表示され、＋が追加された部分になります。

```bash
$ git diff
diff --git a/README.md b/README.md
index e4bfe52..a931f63 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 # README.md
 ## second commit
 ### third commit
+uncommited
```

## git diff [commitハッシュ]

git logで2番目に表示されたハッシュ値を指定する。

```bash
$ git diff 85448e9a9477f077a4904a48eb467585eb4f5015
diff --git a/README.md b/README.md
index bd1f0c8..a931f63 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 # README.md
 ## second commit
+### third commit
+uncommited
```

## git diff [commitハッシュ1]..[commitハッシュ2]

git logで2番目, 1番目に表示されたハッシュ値を指定する。

```bash
$ git diff 85448e9a9477f077a4904a48eb467585eb4f5015..eb59cf6d61d2c9b2a106d0d64cca976cad2efc44
diff --git a/README.md b/README.md
index bd1f0c8..e4bfe52 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
 # README.md
 ## second commit
+### third commit
```

未コミットの差分が表示されなくなりました。

## [再び] git diff [commitハッシュ]

`git checkout .` で未コミットの`README.md`に変更内容を取り消します。

もう一度、ハッシュ値を一つだけ、`git log`で2番目に表示されたハッシュ値を指定してみます。

```bash
$ git diff 85448e9a9477f077a4904a48eb467585eb4f5015
diff --git a/README.md b/README.md
index bd1f0c8..e4bfe52 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
 # README.md
 ## second commit
+### third commit
```

上と同じ結果になりました。

## git diff [commitハッシュ]..HEAD

変更がない状態での `git diff [commitハッシュ]` と `git diff [commitハッシュ]..HEAD` が同じであるということです。


## 脱線したので、元の話に戻って。

```bash
git diff [commitハッシュ1]..[commitハッシュ2]
```
は、
`[commitハッシュ1]`に比べて、`[commitハッシュ2]`の内容が`＋`(追加)か、`－`(削除）されているということ。

コミット間の比較をすると、何に対して、追加、削除されてるのか、いつも訳が分からなくなるので、確認できて良かった。
JavaScript プロパティアクセスメソッド

他言語では、プロパティという言葉は、ゲッターとかセッターというメソッドを通してアクセスする変数のようにみえるけど、そうじゃないもの、として扱われているのですが、

JavaScriptは、そのあたりが、ちょっとグダグダなので、そうなってません。

単なるオブジェクトにぶら下がるpublic変数のことが、プロパティと呼ばれたりします。
変な話ですが、別にそこで混乱する事もないとは思います。目くじら立てることもないです。

そんな事よりも、prototype継承などで混乱させられる罠が満載ですので、そんなのは小さな問題です。

ただ、他言語から移植するときなどに、プロパティとプロパティアクセスメソッドが利用できないと、移植に苦労することになると思いました。

Nameプロパティに代入するときに、
setNameメソッドが呼ばれて欲しいときがあり、

Nameプロパティを読み取るときに
getNameメソッドが動作して欲しいときがあります。

移植時とかにNameプロパティへの入出力を、setName/getNameに書き直せば別にいいとは思いますが、
なんか書き方として、かっこ悪いです。

ということで、きれいなコード書きたいのに、書けないかな、と悩みがあり、
プロパティアクセスメソッドなんて、JavaScriptではできないんじゃないの？たぶん。
と思って、スタックオーバーフローで聞いたら、すぐに答えをもらいました。

すばらしい解答をいただきました。

[JSのプロパティ入出力時にアクセスメソッドを動かしたい - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/35359/js%e3%81%ae%e3%83%97%e3%83%ad%e3%83%91%e3%83%86%e3%82%a3%e5%85%a5%e5%87%ba%e5%8a%9b%e6%99%82%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92%e5%8b%95%e3%81%8b%e3%81%97%e3%81%9f%e3%81%84)

答えを頂いた上で、自分が書いたコードを載せておきます。

```JavaScript
var common = {};
(function () {
  var _ = common;

  _.Rect = function (top, left, height, width) {
    if (!(this instanceof common.Rect)) {
      return new common.Rect(top, left, height, width);
    }
    this.top = top;
    this.left = left;
    this.height = height;
    this.width = width;
  
    var getRight = function() {
      return this.left + this.width;
    };
    var setRight = function(value) {
      this.width = value - this.left;
    };
    var getBottom = function() {
      return this.top + this.height;
    };
  
    Object.defineProperty(this, "right", {
      get: getRight,
      set: setRight
    });
    Object.defineProperty(this, "bottom", {
      get: getBottom 
    });
  };

}());
```

> var rect1 = common.Rect(1,1,1,1);
> rect1.top
> rect1.left
> rect1.height
> rect1.width

に加えて、

> rect.right
> rect.bottom

を使用することができます

例では、getRightは、プロパティアクセスメソッドらしく、プライベートメソッドにしていますが

パブリック属性として外部に公開する書き方もできますし
(リンク先のStackOverFlowみて)

読み取り専用プロパティ、書き込み専用プロパティ、にもできるようです。

ES5なので、主要なブラウザでは全て対応していると思われます。

これで、クラスを作るときは、よりかっこよく書けるものを作れるでしょう。
参考にしてください。

素晴らしい回答くださった、StackOverFlowのBLUEPIXYさん。ありがとうございます。
HerokuでImageMagickのconvertができるまで

# やりたいこと
Node.jsのwebアプリで、アップロードされたaiファイルやpsdファイルをjpgに変換して表示する機能を作ったのですが、Herokuへのデプロイでハマったので解決方法と共にメモします。

画像変換にはImageMagickを、[imagemagick](https://www.npmjs.com/package/imagemagick)というライブラリを経由して利用しました。
（今回の問題はNode関係なくどの言語でも共通だと思います）

## 開発環境では
ローカルの開発環境 (macOS) では、
`brew install imagemagick`
でImageMagickをインストールし、またaiファイルを変換するためにGhostscriptをインストールしました。
`brew install ghostscript`

ターミナルで `convert sample.ai sample.jpg` を実行すると画像が変換できたことが確認できます。
psdファイルの場合は、flattenオプションをつけないと各レイヤーごとのファイルが出力されてしまいます。
`convert sample.psd -flatten sample.jpg`

簡単。

# Herokuにデプロイ
さて、デプロイです。
HerokuのサーバーでもImageMagickとGhostscriptをインストールする必要があります。Herokuではdynoが起動するたびにインスタンスがリセットされてしまうので、build packsという仕組みで必要なツールをビルドのたびにインストールします。

## ImageMagick
ImageMagickのビルドパックは公式からは提供されていませんが、カスタムビルドパックを作ってる人がいるのでこれを利用します。

`heroku buildpacks:add https://github.com/ello/heroku-buildpack-imagemagick`

これでImageMagickのカスタムビルドパックの追加が完了です。これでHeroku上でImageMagickが使えるはず・・・と思いきや、デプロイして`heroku run magick -version`を実行してみると、

`bash: magick: command not found`

とエラーが帰ってきます。ImageMagickがインストールされていない・・・？

散々情報を集めたり試行錯誤を繰り返す中、convertコマンドを使った時には別のエラーが吐かれていることに気づきました。曰く、

`convert: error while loading shared libraries: libgvc.so.6: cannot open shared object file: No such file or directory`

このlibgvc.so.6というのを調べてみると、Graphbizというプログラムに関わるものらしい。Graphbizのビルドパックも追加してみます。

`heroku buildpacks:add https://github.com/weibeld/heroku-buildpack-graphviz.git`

デプロイし直して再度`heroku run magick -version`を実行すると、ちゃんとバージョン情報が返ってきました。convertコマンドも使えました。これでImageMagickの基本的な機能は使えるはずです。

# Ghostscript
aiファイルの変換には、Ghotstscriptのインストールが必要なので、これもビルドパックでインストールします。

ここでまたハマりました。
[nurvetemamのheroku-buildpack-ghostscript](https://elements.heroku.com/buildpacks/nurveteam/heroku-buildpack-ghostscript) を入れてconvertを実行したところ、
`Unrecognized switch` 云々というエラーが。ググっても手がかりがないので難儀しましたが、[bvirletのheroku-buildpack-ghostscript](https://elements.heroku.com/buildpacks/bvirlet/heroku-buildpack-ghostscript)を使うようにしたら直りました。
`heroku buildpacks:add https://github.com/bvirlet/heroku-buildpack-ghostscript.git`

# 感想
herokuは便利だけど、デバッグが大変。ImageMagick関連は意外と情報が少ない。
Rails | rails console で ルーティングのパスを確認する

`app.xxx_path` と書けば良い。

# 例

```
$ rails console
```

```rb
[16] pry(main)> app.root_path
=> "/"
[17] pry(main)> app.summaries_path
=> "/summaries"
[18] pry(main)> app.summaries_path(1)
=> "/1/summaries"
```

# 環境
- Rails 5.1

# 参考

- [Rails: Check output of path helper from console - Stack Overflow](https://stackoverflow.com/questions/2846247/rails-check-output-of-path-helper-from-console)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
dockerコンテナのログ収集の為にFuelPHPのログを標準出力に


dockerコンテナで動いているFuelPHPのログをawslogsを使ってCloudWatchに飛ばしたくて、出力先をファイルから標準出力に変更したメモ。
FuelPHPのバージョンは1.7。

## デフォルトのログ出力
ログの設定はfuel/app/config/config.php。
`log_path`で指定したフォルダ配下に年月日別にフォルダが作成されてログが吐き出される。
logs/2017/05/01/01.phpみたいな形式。

日付フォルダに分けられるの面倒臭い！
ってだけなら`log_file`でファイル名を指定すればいいみたいです。

```
'log_path'         => APPPATH.'logs/',
'log_file'         => 'app.log',
```

設定を読んでloggerを設定しているのはfuel/app/core/classes/log.phpのinitialize()。

## 拡張クラスの作成

initialize()を上書きする為にLogを継承したクラスを作成。

fuel/app/classes配下にlog.phpを配置。

```
<?php

class Log extends \Fuel\Core\Log
{
    public static function initialize()
    {
		$stream = new \Monolog\Handler\StreamHandler('php://stdout', \Monolog\Logger::DEBUG);
		$formatter = new \Monolog\Formatter\LineFormatter("%level_name% - %datetime% --> %message%".PHP_EOL, "Y-m-d H:i:s");
		$stream->setFormatter($formatter);
		static::$monolog->pushHandler($stream);
    }
}

```
StreamHandlerの指定をphp://stdoutにしました。

## 作成したクラスをAutoloaderに設定

fuel/app/bootstrap.phpの設定を変更。

```
Autoloader::add_classes(array(
	// Add classes you want to override here
	// Example: 'View' => APPPATH.'classes/view.php',
	'Log' => APPPATH.'classes/log.php',
));
```

## 確認
docker-compose logsで標準出力されているか確認してみる。

```
➜ docker-compose logs
app_1        | INFO - 2017-06-07 18:22:53 --> Fuel\Core\Request::__construct - Creating a new main Request with URI = "login"
app_1        | INFO - 2017-06-07 18:22:53 --> Fuel\Core\Request::execute - Called
app_1        | INFO - 2017-06-07 18:22:53 --> Fuel\Core\Request::execute - Setting main Request
```

一応できた。
一般的な方法じゃないかもしれない。

**備考**
nginxのdocker imageの設定を見て
ログファイルの出力先を/dev/stdoutもしくは、/proc/self/fd/1の
シンボリックリンクにすれば良いかと思って試したけど、
Hander用にファイル読み込むところでPermission denied。
Tips : [Python] bedgraphで指定領域の平均値を算出する


　以下のようなbedgraph ファイルを読み込んで指定した領域でのみ何らかの処理を行うとします。

```txt:example.bedgraph
chr1	10084	10104	2
chr1	10104	10124	4
chr1	10124	10164	6
chr1	10164	10184	11
chr1	10184	10204	14
chr1	10204	10224	16
chr1	10224	10244	14
chr1	10244	10264	15
chr1	10264	10284	14
chr1	10284	10304	17

```

　例えば領域での平均値を算出するならば、以下のようなスクリプトがかけます。

```py3:averageBedgraph.py（訂正版）
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

"""
Bedgraphファイルから指定した領域の平均値を算出する。
"""
__version__ = "1.00"
__date__ = "7 Jun 2017"

import sys

def averageBedgraph(filename, chromosome, start, end):
    """
    @function   averageBedgraph();
    Bedgraphファイルから指定した領域の平均値を算出する。
    @param  {string} filename :  入力ファイル名
    @param  {string} chromosome :   染色体番号
    @param  {int}    start : 開始位置
    @param  {int}    end :   終了位置
    """

    total = 0
    with open(filename) as lines:
        for line in lines:
            c, s, e, v = line.split()
            if c != chromosome:
                continue
            s, e, v = int(s), int(e), int(v)
            if s <= start and end <= e:
                total += (end - start) * v
            elif s <= start < e:
                total += (e - start) * v
            elif start < s and e <= end:
                total += (e - s) * v
            elif s < end <= e:
                total += (end - s) * v
            elif end < s:
                break
    print('average : %s' % (total / (end - start)))
    print('done')

if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)

    if (argc != 5):   # Checking input
        print("USAGE : python3 averageBedgraph.py <INPUT_FILE> <CHROMOSOME> <START> <END>")
        quit()

    averageBedgraph(str(argvs[1]),str(argvs[2]),int(argvs[3]),int(argvs[4]))
quit()
```

　実行例

```text:bedfileの指定領域の平均値を算出する
$ python3 averageBedgraph.py example.bedgraph chr1 10150 10250
```


```text:標準出力
average : 12.74
done
```


　特記すべきこともない泥臭いやり方ですが、わざわざ組むのが面倒な方はお使いください。

　あと、このようなbedgraph などの処理に長けたツールなどがありましたらご教授いただけるとありがたいです。
　車輪の再発明をしていても仕方がないので・・・。お願い致します。

　以上です。ありがとうございました。


　2017/06/09 追記
　掲載していたコードの訂正を行いました。
　訂正をしていただいた[shiracamus](http://qiita.com/shiracamus)様には改めまして深く感謝申し上げます。
BottomSheetDialogFragment で FragmentTransition#replaceを行う



## はじめに
- BottomSheetDialog内でFragmentTransaction#replace 行いたい人が対象です。
- designサポートライブラリへの依存設定が必須です。(23.2以降)
- 利用するケースとしてはBottomSheetDialogFragment内にリストを表示して、リストの項目タップ時にさらにリストを表示する、など再帰的に表示したいパターンなどが考えられます。(それ外に無い気もします...)


## 先に結論
- よくあるサンプルのようにsetupDialogをOverrideするのではなく、onCreateView, onViewCreateをOverrideしましょう。

## コード

```xml:layout_bottom_sheet.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:background="@android:color/transparent"
                  android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="ぼとむしーと"/>

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</layout>

```

```java:MyBottomSheetDialogFragment.java

public class MyBottomSheetDialogFragment extends BottomSheetDialogFragment implements MyBottomSheetListener {

    public static MyBottomSheetDialogFragment newInstance() {
        return new MyBottomSheetDialogFragment();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        LayoutBottomSheetBinding mBinding = DataBindingUtil.inflate(inflater, R.layout.layout_bottom_sheet, container, false);
        return mBinding.getRoot();
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        showStubFragment();
    }

    @Override
    public void onClick() {
        showStubFragment();
    }

    private void showStubFragment() {
        Fragment fragment = new StubFragment();
        getChildFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .commit();
    }

    public static class StubFragment extends Fragment {

        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            Button button = new Button(getActivity());
            // replace確認用
            button.setText("next" + DateFormat.format("yyyy/MM/dd kk:mm:ss", System.currentTimeMillis()));
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Fragment fragment = getParentFragment();
                    if (fragment instanceof MyBottomSheetListener) {
                        ((MyBottomSheetListener) fragment).onClick();
                    }
                }
            });

            return button;
        }
    }
}

```

```java:MyBottomSheetListener.java
public interface MyBottomSheetListener {
    void onClick();
}
```
raspberry pi上のpython3にpygameを入れる際のエラーを解決

ラズパイ上のpyenvなどで3系を使用している際、pygameを`pip install pygame`でやっても以下のようなエラーになることがあります。

```
Collecting pygame
  Using cached pygame-1.9.3.tar.gz
    Complete output from command python setup.py egg_info:
   
    
    WARNING, No "Setup" File Exists, Running "config.py"
    Using UNIX configuration...
    
    /bin/sh: 1: sdl-config: not found
    /bin/sh: 1: sdl-config: not found
    /bin/sh: 1: sdl-config: not found
    
    Hunting dependencies...
    WARNING: "sdl-config" failed!
    Unable to run "sdl-config". Please make sure a development version of SDL is installed.
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-vvaj67he/pygame/
```

そんな時は以下手順で必要なものを入れましょう。

```
sudo apt-get install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev
sudo apt-get install libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
```

あとは普通に`pip install pygame`でいけると思います。
logrotateの頻度をweeklyにするとローテトタイミングが日曜、月曜、日曜とずれる問題

# 前提

* logrotateをweeklyに設定すると、実行タイミングがぶれる。

# 事象

* 月曜日、日曜日、月曜日、日曜日と実行タイミングがずれる
* 6日後、8日後、6日後とログローテトされるタイミングがずれる

# 原因

* bugで[issue](https://github.com/logrotate/logrotate/issues/93)が登録されて今は解決しています。

# 解消バージョン

* [バージョン3.12.2](https://github.com/logrotate/logrotate/commit/bd2638856dbbb6c0a47beb85fe8a8a628160772e)へのコミットで解消しています。(2016/12/8)
* APTには登録されていないので、githubから自分で持ってくる必要があります。
　* APTのlogrotateは[最終更新が2015/9/1](http://changelogs.ubuntu.com/changelogs/pool/main/l/logrotate/logrotate_3.8.7-2ubuntu2/changelog)で止まっています。
自分用FTPコマンドメモ

Webサイト作ってサーバあげようと思ったけどFTPクライアントがいいの見つからないのでコマンドでやろうとしているぞメモ。


#①上げたいサーバへ接続する

```
ftp [ftpサーバアドレス]
```
※ID、PASSが求められる

#②アップロード

```
put [ファイル名]
```

複数ファイルのときは`mput`を使う。

```
mput [ファイル名] [ファイル名]...(ワイルドカード可)
```

`mput`したときに`anpqy?`と聞かれるときがある。

|anpqy|説明|
|:-----------------|:------------------|
|a|全てのファイルを許可する。|
|n|このファイルの処理をしない。|
|p|対話モードOFF。今後処理するかどうか問い合わせない。|
|q|処理を中止する。|
|y|このファイルは処理する。|

pで対話モードをオフにしたが戻したい場合は`prompt`を使う。

#③サーバから出る

```
exit
```

#その他
* linuxコマンドは使える
* ローカルに対してコマンドを使う場合は「!」を付ける(`!pwd`など)
WordPress Bogo をカスタム投稿タイプでも使う

# Bogo とは

https://ja.wordpress.org/plugins/bogo/

WordPressで多言語サイト運用するならこのプラグインが便利。
カスタム投稿タイプでも使うにはちょっとしたカスタマイズが必要

# コード

プラグインで `bogo_localizable_post_types` というフィルターフックが用意されてるのでそれを使えばOK。
`$localizable` に投稿タイプ名が配列で入るので、加える。

```php:my_localizable_post_types1.php
<?php
/**
 * Support custom post type with bogo.
 *
 * @param array $localizable Supported post types.
 * @return array
 */
function my_localizable_post_types( $localizable ) {
	$localizable[] = 'custom_post_type_name';
	return $localizable;
}
add_filter( 'bogo_localizable_post_types', 'my_localizable_post_types', 10, 1 );
```

複数のカスタム投稿タイプを追加する場合は `$localizable[] = 'custom_post_type_name';` の複数行記述すればよいが、いちいち投稿タイプを書くのは面倒という場合は `get_post_types()` 使えばよい。
https://developer.wordpress.org/reference/functions/get_post_types/

例は `public` なカスタム投稿タイプを全て追加するコード。

```php:my_localizable_post_types2.php
<?php
/**
 * Support custom post type with bogo.
 *
 * @param array $localizable Supported post types.
 * @return array
 */
function my_localizable_post_types( $localizable ) {
	$args = array(
		'public'   => true,
		'_builtin' => false
	);
	$custom_post_types = get_post_types( $args );
	return array_merge( $localizable, $custom_post_types );
}
add_filter( 'bogo_localizable_post_types', 'my_localizable_post_types', 10, 1 );
```
3.0.0-alpha以降のAndroidプラグインはGoogleのmavenリポジトリで取得する必要がある


Googleの出してるリリースノート＋ドキュメント、きちんと読もう！（自戒）

## 概要

Google I/O 2017で発表されましたが、Googleからmavenリポジトリが提供され、いくつかのプラグインなどはここからダウンロードする形になりました。

- [Google I/O 2017で驚いたところ(Android多め) - Qiita](http://qiita.com/takahirom/items/e0eea409a8fedf430184#developer-keynote)
- https://youtu.be/EtQ8Le8-zyo?t=1036

すでにこの提供は始まっていて、`3.0.0-alpha1`以上のandroid-toolsのgradleやサポートライブラリなど、いくつかの最新版のプラグインはもうjcenterでは提供されておらず、mavenリポジトリから取得しなければいけません。


- [com.android.tools.build.gradle](https://bintray.com/android/android-tools/com.android.tools.build.gradle)
- [Migrate to the New Plugin | Android Studio](https://developer.android.com/studio/preview/features/new-android-plugin-migration.html)
- [Add Build Dependencies | Android Studio](https://developer.android.com/studio/build/dependencies.html#google-maven)

## コードサンプル

```gradle:rootProject/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        
        // 追加
        maven {
            url 'https://maven.google.com'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha3'

        classpath 'com.google.gms:google-services:3.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
```

```gradle:app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

// 追加
repositories {
    maven {
        url 'https://maven.google.com'
    }
}

android {
	// 以下、省略
```

以上です。

## 追記

「全てのプロジェクトでgoogleリポジトリ読み込める対象にするぞ！」っていう話であれば、 `allprojects`内にて設定してしまえばいいと思います。
また、mavenのurl指定ではなく `google()` でも読み取れるみたいですね。

```gradle:rootProject/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha3'

        classpath 'com.google.gms:google-services:3.1.0'
    }
}

allprojects {
    repositories {
        google() // 追加
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
```
私的 Coda2 キーボードショートカット設定

自分的にこういうショートカットにすると手に馴染むなーという感じで設定しています。
ちなみに[Top 20 Secrets of Coda 2](https://panic.com/blog/ja/top-20-secrets-of-coda-2/)にある通り、システム環境設定アプリの キーボード / アプリケーション から色々追加できます。

![ks_0612のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/20734/7d6f70d7-4a37-cc03-b54c-e8b0b7ffab33.png)


# タブまわり
- 「次のタブを表示」 : SHIFT+COMMAND+RIGHT
- 「前のタブを表示」 : SHIFT+COMMAND+LEFT
- 「書類」: OPT+COMMAND+D (Dockを自動的に隠す機能は無効化する)
- 「ターミナル」: OPT+COMMAND+T
- 「ブック」: OPT+COMMAND+B
- 「MySQL」: OPT+COMMAND+S

ファイルタブ内も、矢印キーとコマンドで結構移動する（⌘↑でディレクトリ階層を上がる、⌘←でトップディレクトリまで上がる）ので、ストレスなくタブ移動したい結果こうなった。

ターミナルとMySQLは頻繁にタブで開くのでショートカットキーを割り当てたい。

# サイト
- 「サイトを閉じる」 : SHIFT+COMMAND+W

サイトを開く自体は⌘↓で開けるのですが、閉じるがなかったので。⌘Wでタブを閉じれるので、その系譜的なアレで設定した。

※随時更新予定
ウインドウのリサイズとスクロールの開始と終了を通知するオブジェクト

requirements: CoffeeScript, Backbone.js, Underscore.js

_.debounceメソッドを使うと、簡単にイベント実行を間引きできるので、それを活用して簡易的なモジュールを作ってみた。

このモジュール（＝コンストラクター）は、ウインドウがスクロールしだすと`scroll:start`、スクロールが終わると`scroll:end`、リサイズしだすと`resize:start`、リサイズが終わると`resize:end`イベントをそれぞれトリガーする。

```coffeescript:screen.coffee
module.exports= class extends Backbone.View
  WAIT= {start: 100, end: 500}
  el: window
  events:
    scroll: ->@trigger "_scroll"
    resize: ->@trigger "_resize"
  initialize: (opts= {})->
    opts= _.defaults opts, 
      wait: _.defaults (opts.wait ? {}), WAIT
    @wait= opts.wait
  listenScroll: ->
    @listenTo @, "_scroll", _.debounce ->
      @trigger "scroll:start"
    , @wait.start, immediate= on
    @listenTo @, "_scroll", _.debounce ->
      @trigger "scroll:end"
    , @wait.end
  listenResize: ->
    @listenTo @, "_resize", _.debounce ->
      @trigger "resize:start"
    , 100, immediate= on
    @listenTo @, "_resize", _.debounce ->
      @trigger "resize:end"
    , 100

  stopListeningScroll: ->
    @stopListening @, "_scroll"
  stopListeningResize: ->
    @stopListening @, "_resize"
```

このモジュールをアプリ側からrequireして使う：

```coffeescript
screen= new (require "screen.coffee")
  wait: end: 1000
someView.listenTo screen, "scroll:end", someView.toggle
```

みたいに。

```
HomesteadでCakePHPを実装


## 「/etc/nginx/sites-available/example.homestead.app」を下記に編集

```
server {
    listen   80;
    server_name example.homestead.app;

    # root directive should be global
    root   /home/vagrant/Code/example/app/webroot;
    index  index.php;

    access_log off;
    error_log /var/log/nginx/example.homestead.app-error.log error;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }
}

```

* NgineXを再起動

```
sudo xginex -s reload
```
NetCDF > Error: NC_UNLIMITED size already in use  -54 > NF90_DEF_DIM()にて次元を0にしていた

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
gcc version 4.9.2 (とgfortran): Software Collections (SCL) で有効にした状態
NCAR Command Language Version 6.3.0
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
NetCDF v4.4.1.1 / NetCDF (Fortran API) v4.4.4 
WRF/WPS v3.9
```

WRF(Weather Research and Forecasting Model)に関して。

WRFのデータをもとに処理を行う「とある」ソフトウェアの最新版を試していた。
ビルドはできたが、実行した時に以下のエラーがある。

```
nc_create_header_outfile: Setting up receptor point dimensions
 Error: NetCDF: NC_UNLIMITED size already in use                                                 -54
```

問題の箇所をデバッグprintで特定していくと以下にたどり着いた。

```
  ncret = NF90_DEF_DIM(ncid,'receptors',numreceptor,ncrepid)
  call check_ncerror(ncret)
```

エラーの原因はnumreceptorが0になっていることのようだ。

同じソフトウェアの旧バージョンにおいては設定ファイルにおいてnumreceptorを0としていても動作していた。
NF90_DEF_DIM()を使うようになったのは最新版のソフトにおいて。
このあたりで動作検証抜けがあるのかもしれない。

### 関連リンク

エラーコード
http://www.unidata.ucar.edu/software/netcdf/docs/nc-error-codes.html

以下の情報にて設定値に問題があると気づいた。
https://www.myroms.org/forum/viewtopic.php?f=16&t=1270
> But the old standard input file that I was using did not have
this parameter so that ROMS tried to assign unlimited dimension to 
'frc_adjust'.
Structをomitemptyする方法


↓こんなStructがあったとして、JSONに変換した時に`OrderItem`プロパティが空だったら、JSONから省略したい。

``` go
HogeSales struct {
	IsDirty 	bool		`json:"-"`
	Id 			string      `json:"Id,omitempty"`
	Amount 		int		 	`json:"Amount,omitempty"`
	OrderItem	OrderItem	`json:"OrderItem,omitempty"`
}
```

`json.Marshal(HogeSales)`　でJSONに変換した時に `"OrderItem": {}` となることを防ぐ方法。
このOrderItem項目すら消したい場合。

ちなみに `omitempty` される条件は下記

```
false, 0, any nil pointer or interface value, and any array, slice, map, or string of length zero
```

そう、Struct型である以上、Omitされない。。。

対処方法は簡単 `Pointer` にして `nil` を入れておけばOK

``` go
HogeSales struct {
	IsDirty 	bool		`json:"-"`
	Id 			string      `json:"Id,omitempty"`
	Amount 		int		 	`json:"Amount,omitempty"`
	OrderItem	*OrderItem	`json:"OrderItem,omitempty"`
}

func (h *HogeSales) Clear() {
	h.OrderItem = nil
}
```
失敗しないプロジェクト管理-リリース作業１２の注意

1. コマンドレベルで迷うポイントがないこと

2. まちがったサーバに接続してないか、間違ったインスタンスに接続してないかなど”うっかりミス”防止手順が入っていること

3. リリース前イメージをバックアップすること

4. 実行結果のエビデンスを保存すること

5. (忘れがちなポイント)ファイルのパーミッション・権限、トリガ・ビューの有効・無効、初期データの忘れ。シーケンスのカウントアップ忘れなど特注

6. 設定ファイルか今回更新したファイルを少なくともいずれか１つについて、更新日やサイズをチェックしてそもそもアップしたモジュールが本当に新バージョンか、手順をまちがってファイルが古いままになっていないかも確認すること

7. 実行時間について考慮されており、タイムスケジュールが作られていること
長いSQLの実行、重いファイルの転送に注意

8. 切り戻し手順および切り戻し判断基準・ポイントを確立していること

9. ディスク、表領域などキャパシティについて考慮されていること

10. 最後に本番環境における動作確認（画面、ログなど）も行うこと

11. 予定時間を超過したときの対応方針をきめておき、バッチプログラムのスケジュールを把握しておく

12. 翌日の体制について明確か、夜中のバッチに依存するものは金曜日か土曜日作業として翌日確実に確認できる体制になっているか。
失敗しないプロジェクト管理-リリース判定チェック（システム観点）

|項目|内容|
|----|---|
|全体構成|通信するサーバ、クライアント、メール、インターネット等サービスとその目的が明確になっていて通信経路が確保されている。構成・依存している全てのリソースを担当者が把握。ソースファイルが適切にバージョン管理・ソース保存されている。参照している、参照されている、影響をうけるシステムが明確になっている。ログファイルのありかも明確になっている。変更範囲（機能、ファイル、データ）が詳細レベルで明確になっている|
|標準準拠 |設計・運用ポリシーに原則準拠しており、準拠していないところは運用担当と合意されている。(耐障害、セキュリティ、監視時間、時刻同期・DNS、パッチ適用、監視、バックアップ、ソフト、ディレクトリ) |
|移行手順  |リリース日程・手順が明確で、作業場所・時間が適当であり、きりもどし手順が確立されている。事前告知も考慮されている。事前準備が完了しているまたは確実に完了する見込みである。すべての手順が網羅されていること。 過去に実績のある手順を採用しているか、初めての手順の場合は、リハーサルにより確認されていること。次ページの１２のチェックポイントをクリアしていること。|
|障害対策 | 運用中に想定される、緊急対処手順がすべて確立・確認されている（サービス再起動など）。リリース・環境変更後、障害対処後の動作確認手順が確定している。必要なバックアップがされており、リカバリ手順が検証され、目標回復時間確保が確認できている。 |
|自動運用 |バックアップ・バッチジョブの全自動化が原則完了しており、動作検証されている。エラー発生などの事象が監視により捕捉できる状態である。バックアップは２時間以内、夜間バッチは合計２時間以内で終了する。 |
|定常運用 |アカウント追加・更新・削除など定常的に発生しそうな業務フローが確定しており、週当たり1人日未満の工数である。 |
失敗しないプロジェクト管理-リリース判定チェックポイント(業務観点）

|項目|内容|
|------|-------|
| 顧客窓口|顧客からの問い合わせ（窓口となるアドレス・TEL等、人員、対応方法)について考慮済み。メール送信・エラーなど想定されるユーザ問い合わせについて対応方針が合意されている。マニュアルなどの準備。| 
|事前調査 | リリース対象範囲・内容について業務部門に十分な告知が行われ、関係者間利害も調整され、ユーザのアプリケーション操作スキルも問題ない状態にユーザテストも行われている。 |
|事後対応 |機能追加など今後の社内からの要望をあげる先が明確。問題管理方式および今後の要望をあげる人・受ける人・進め方がきまっている。運用中のユーザ部門からの問い合わせ窓口が決まっている。コンティジェンシープラン（切り戻し後の業務継続方針）が確認されている。 |
|品質確認| システムテスト、ユーザテスト、（負荷テスト）の結果より、業務面システム面ですべての必要な機能があることが確認されている。(新規リリースおよび大幅機能変更）サービス時間中のCPU平均負荷１０％未満が見込める。または、データベースアプリケーションについては100秒以上のSQLがない(または10万件以上のテーブルにfullscanがない)ことが確認できているメール送信数、ディスク容量についてキャパシティ的に問題ないことが確認されており、初期リリースから1年間はディスク増が不要である。目標レスポンス時間に達している。|
|既知障害   |残障害および、リリース後すぐに発生しそうな障害見込みがない。仮にある場合は影響範囲が明確かつ業務に支障がないことがユーザ部門および運用部門と合意されている。監視エラー発生数が、1日あたり10未満である。|
|障害調査 |  既知のアプリケーションの重大障害について、ログファイルが出力され監視されているなど検知・調査する手段がある。メール配信エラー・遅延についても検知・調査する手段がある。開発担当窓口が明確である。|
失敗しないプロジェクト管理-Webサービスレベル例


|対象システム| 顧客向けWebサイト| 
|-----------|-----------------|
|サービス保証時間|平日 最大9:00-20:00|
| 稼働率基準 | 保証時間内99.5%以上| 
|インフラ運用方針 |システム全般にわたりミドルウェアのバージョン統一。セキュリティパッチ随時適用|
| 障害対策 | フロント2重化以上 DBの2重化|
| バックアップ世代数 |  5世代 |
|データ・ファイル消失(震災などによるiＤＣ障害除く)|24時間分まで(シングルポイント障害 12時間)|
|障害による停止時間(震災などによる有明ＩＤＣ障害除く)|48時間まで(シングルポイント障害 12時間)|
|ディザスタリカバリ(震災対策)|○データ損失最大48時間分 約3ヶ月で業務復帰|
失敗しないプロジェクト管理 - Webシステムテスト観点



- エラー画面表示 stacktraceが表示されたり、apacheやtomcatのバージョンを類推できる画面が表示されないか 
- ３秒ルール すべてのページレスポンスが３秒以内にあるかどうか 
- 画面競合動作 同一の編集画面・データを二人で並行して操作したときの競合排除ロジックの確認 
- ボタン連打 同一ボタンを２回連続クリックできないようになっているか。 
- 項目データフル入力 画面内の全項目（テキスト、テキストエリア）について項目の長さ目いっぱいにデータをいれてみる。 
- メール送信 想定されるすべてのメール送信はチェック。（テスト中は社外に送らないよう注意） 
- 全リンク 画面内の全リンク・ボタン等を一通りぜんぶチェック 
- 戻る・リロード Webシステムはユーザのあらゆる行動について想定しておく必要がある。 
- 途中ページ呼出 通常の遷移ではいきなり入ってこれないページにbookmarkやURLの推定などにより参照してみる。 
- 脆弱性 専門の会社に委託するのが望ましいが、xssとＳＱＬインジェクション、クロスサイトリクエストフォージェリは、比較的ソースチェックや簡易テストでリスクを十分回避できる。基本ソフトは原則最新バージョンに。 
- 負荷テスト インターネットに公開し、かつデータベースや重いコンテンツがあるページについて重点的に。RDBをつかったＷｅｂシステム開発は特にデータベース周辺にボトルネックが発生しやすい 
- 過去データ 移行・リリース前に作られたデータについての挙動確認。古いデータは過去の不具合の影響などで想定外の値が入っている可能性もある 
マルチブラウザ 当該システムでサポートするブラウザ
失敗しないプロジェクト管理 PM忘れ物チェック

筆者の過去の経験上、ＩＴプロジェクトにおいて後で顕在化するリスク、わかりやすく言えば”忘れモノ"の例をまとめます。ぜひ参考に。
•ステークホルダー（上司、経営層)への中間報告
•少数（地方、別ブラウザなど)のユーザへの配慮
•移行(データ、システム、業務)
•移行前のデータを、移行後のシステムで参照・編集したときの動作
•(HTTPS)証明書の購入
•脆弱性・セキュリティへの配慮(設計/テスト)
•高負荷時の対応、サーバへの負荷が高い処理の洗い出し
•障害時のエスカレーションフロー
•バックアップリカバリの練習
•監視の設定
•開発中のシステムを参照しているレポート・ＢＩシステムへ配慮
失敗しないプロジェクト管理 PMBOK 9の知識エリアから-品質管理

ポイント１：ちゃんと毎回同じ基準を作ってだんだんブラッシュアップする

ポイント２：後で見ないドキュメントは作らない

ポイント３：セキュリティとパフォーマンスを後回しにしない

品質において気をつけるべきポイントは技術・システム方式が変わってもほとんど変わらない

システムの品質とは、、、

  - 同じ入力には同じ正しい結果を必ず返すこと

  - 結果を返すのが用途から考えて十分に速いこと

  - (悪意も含めた）すべてのアクションを想定したシステムになっていること
Splash画面でpostDelayedして一定時間画面を表示する

```Kotlin:SplashActivity.kt
class SplashActivity : AppCompatActivity() {

    private val handler = Handler()
    private val runnable = Runnable {
        // write code that you want to delay. for example,
        startActivity(NextActivity.createIntent(this))
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)
        handler.postDelayed(runnable, 500)
    }

    override fun onStop() {
        super.onStop()
        handler.removeCallbacks(runnable)
    }
```

`onPause()`もしくは`onStop()`で`removeCallbacks`してあげないと、delay中にアプリを終了した場合に一定時間経ってアプリが勝手に立ち上がるという怪現象が起きます。気をつけましょう。👾

## Is the splash screen necessary?
「postDelayedしてまでSplash画面を表示する必要があるか？」という検討は必要です。
今回は、毎起動時に同じ時間delayする画面を表示することでテンポよく画面遷移したいという理由で実装しました。

## How much delay time the best?
個人の体感ですが、500〜1000msがベストだと思います。

## Links
- Androidでスプラッシュ画面を作る方法  
http://qiita.com/glayash/items/646e5c0d5de82cfc17bc
失敗しないプロジェクト管理：PMBOK 9の知識エリアから7-調達・コスト管理

- 代表的な調達すべきもの：ハード、ソフト、開発、テスト要員etc
- 会社によっては時間がかかるので早めに動く
- 開発会社に委託した場合も、必ずどういう人員配置でやっているかをスケジュールで確認
- 開発中・テスト中はもちろん、要件定義の途中でも常に開発者と情報交換しておく
- 保守をどうするかは契約にいれておく
- 仕様変更も”当然あるもの”として見積にも考慮し、開発側にも伝えておく
- ドキュメントは”後で”はやらない
- 開発会社のＰＭと相性があわないときはやめる。＝＞契約以外の信頼関係が重要
- なるべくコンペはやらないほうがいい＝＞たいがい大プロジェクトで新規取引先になる。(リスク要員のひとつ"新しい人")
失敗しないプロジェクト管理：PMBOK 9の知識エリアから5-スケジュール管理

ポイント１：ＷＢＳは先のことまで細かく作らない。

ポイント２：週単位で管理する

ポイント３：最後に何もしない”2週間”を作ること

 

- 要件定義は2ヶ月以上
- テストは開発と同期間以上は必ずかける。
- スケジュール表は大事に保存して次回に生かす
- 各担当は自分が何をやるべきかを明確に
- エンジニアの見込みの3倍期間がかかる
- 詳細さよりも網羅性
- テストは必ず自分でもやる
- 詳細なテスト仕様書はつくらない
- 徹夜はさせても、自分はしない
- 見積には開発者も参加させる
失敗しないプロジェクト管理：PMBOK 9の知識エリアから4-リソース(要員)管理

## 最初に取り組むべきはキーパーソンの不足の洗い出し。

プログラマーやＳＥだけではありません。プロジェクトにおいて重要な登場人物は、、
•プロジェクトオーナー(プロジェクトの発案者や業務担当責任者など）
•ステークホルダー（経営層、メンバーの上司、その他プロジェクトの進捗について影響がありそうな人）

には十分注意を払いましょう。特に経営層などが知らないうちの進捗していたものが途中でひっくり返るというのはよくある話です。

メンバーとしては
•ユーザ部門のメンバー（要件定義やテストに参加）
•開発側のメンバー（プログラマーやＳＥ、開発やテストも）

各自自分のミッションを明確にしてもらうことが重要です。
失敗しないプロジェクト管理：PMBOK 9の知識エリアから3-コミュニケーション管理


# 1.だれとコミュニケーションをとるべきかが重要


コミュニケーションリスクで大きいのは、経営層がタッチしてないこと、要件定義でのメンバーが足りないこと。役割とミッションは必ず明確にしておく あとでひっくり返されるのは最悪なのでかならずステークホルダー（社長や部門長など）に計画を承認。

# 2.人によってコミュニケーションの仕方をかえる
たとえば、ステークホルダーのうち経営層などへ見せるプロジェクト計画は1枚でいいです。経営陣には簡潔でポイントをおさえた説明、議事録はとっても意味はありません。途中で気が変わるのは当たり前のつもりで接しつつ、発注前承認などの重要なチェックポイントは意識してもらいましょう。

プロジェクトオーナーやユーザ部門の意見はとりあえず聞くだけは聞いてください。めんどくさがらず聞iいてください。でもきちんとそれが目的に合致しているか考えさせてください。UMLや詳細な要件定義書を作ってもいいです、トラブル防止のため議事メモを活用するのもいいでしょう。またWBSや課題管理表などはどうしても”きっちりしたプロジェクト管理をやりたい”人をほど詳細な資料を作ってきてしまいますが、見てる人は”あー、すごい資料だけよくわからないなあ"と思われてるかもしれません。ポイントだけ抜き出してメンバーに理解しやすくするということも考えてください。またそれだけ苦労しても、確定した要件に、不足や変更がある程度あることは織り込んでおきましょう。

開発側メンバーへのプロジェクト後のフォローを最後にしっかりやりましょう。参加メンバーにモチベーションがないのは当たり前と考えてください。

## 3.定例会議は必ず
プロジェクトメンバー、顧客、委託先との定例会議は必ず実施しましょう。週１回でいいです。議事はかならず取るようにしてください。

あまりプロジェクトマネジャーが話題がないと思っても週に一回は定例やりましょう。みんなが集まってこそ新しい発見や、会議のときじゃないと話しづらいという人もいます。作業を割り込まれるのを嫌がるかたもいらっしゃいます。定例会議はリスクの洗い出しにも絶好の機会なのでぜひうまく活用しましょう。
失敗しないプロジェクト管理：PMBOK 9の知識エリアから2-リスク管理

#リスク(＝プロジェクトを失敗に導く可能性のある要因)

##１．早めに見つけて早く対策をとること

代表的なリスクポイント
•新技術導入による開発工数、パフォーマンスの不安、人員不足
•検収・リリース条件の不明
•スコープのぶれ（仕様がぶれるのは不可避）
•ステークホルダーの不参加などにより、後半でのプロジェクトの方針転換、中断等
•新しい取引先、リソース導入による想定外の遅延、トラブル

とにかく早めに手を打つことが大切。内容によってはすぐには対処できないものがあれば「いつ対処するか」を早めに決めればよい。

##２．自分にも他人にもミスがないことを前提としないこと

自分と同じレベルを他人に要求しないこと。リスクを検討するのもメンバーと協力して。

最後に予算と期間は少なくとも２割増ししておきましょう。どんなに頭を振り絞っても未来におこる想定外のトラブルは予測できません。それに備えてバッファを準備。これはゴールドラット博士の「ザ・ゴール」でも紹介されたTOC理論をプロジェクト管理に応用した考え方でもあります。

## ３．おおむね原因は“新しいモノと人”である。
失敗しないプロジェクト管理：PMBOK 9の知識エリアから1-統合・スコープ管理

# スコープ=プロジェクトの範囲と目的/ゴールイメージ

## 1.全員で確認し認識をあわせること
プロジェクトオーナーも、メンバーも、あたなも同じ認識であることを繰り返し確認しましょう。 重要なのはスコープを変えないことではなくて範囲をしっかりつかまえて、周知すること。目的と関係ないことを“やらない”ことも重要です。 たとえば、プロジェクトを進めていると"マニュアル作って"とか "会社のホームページも変えたい"、とか”やらないこと"を意識てしないとタスクはいくらでも増えていくものなので注意が必要です。本当に”目的"にあっているのか、いまやるべきなのかはよく考えましょう。

## 2.詳細さよりも網羅性
プロジェクトのゴールに向かってタスクを詳細化することは必ず必要です。このとき詳細さよりも網羅性（MECEの考え方）が重要です。 初期段階で詳細にスコープ決めようという考えは捨てましょう。よくプロジェクトの初期から詳細なWBSを作って、Ａ３用紙で印刷しても数枚におよぶ資料を作ったりするのを見受けられますが他人が理解できない資料作りは無意味です。タスクの洗い出しは大項目、スケジュールはせいぜい週レベル、などみんながついてこられるくらい少しずつ詳細化していきます。

## 3.計測可能で本質的な目標を設定すること
「計測しないものは改善されない」 この言葉は長年ビジネスの現場でとても実感しています。できれば"予定通りリリースする"、ではなくビジネス上の成功が何かを決めて必ず振り返ることができる目標をたてるのがよいでしょう。プロジェクトの目的は、忘れなさそうで結構忘れるものです。またプロジェクトを進めるに当たり何が大切か、スピードか、品質か、コスト（初期or運用)か何を大切にするかをプロジェクトオーナーから十分ヒアリングして、自らも納得し、全員(要件定義やテストに参加する人などプロジェクトにかかわる人すべて)で確認しましょう。プロジェクトの途中でいろんな意思決定をする場面があります。これはそのときの判断基準になります。