OmniAICreator/Qiita-1.07M huggingface dataset:
FuelPHPのマイグレーションファイルによるマイグレーションで列名を変更する方法

コマンドラインから列名を変更するマイグレーションの情報は探せばすぐに見つかるのですが、
マイグレーションファイルによるマイグレーションで列名を変更するやり方がすぐに見つかりませんでした…

この場合以下のように記載すればOKです。

```php
<?php

namespace Fuel\Migrations;

/**
 * foo_tableのbarの列名をhogeに変更する
 */
class Modify_rename_bar_foo_table
{
	public function up()
	{
		\DBUtil::modify_fields('foo_table', array(
			'bar' => array('constraint' => 11, 'type' => 'int', 'name' => 'hoge'),
		));
	}

	public function down()
	{
		\DBUtil::modify_fields('foo_table', array(
			'hoge' => array('constraint' => 11, 'type' => 'int', 'name' => 'bar'),
		));
	}
}
```

注意する点として
`'bar' => array('name' => 'hoge'),` と列名だけ記載した場合はエラーになります。
横着して変更したいものだけ書くとエラーになります。
列名だけ変更する場合でも全ての情報を含めてあげましょう。
CUI 環境で Selenium と Headless Chrome を使用する場合の Tips

# CUI 環境で Selenium と Headless Chrome を使用する

## 環境

* Ubuntu Server 16.04.02
* Python 3.5
* Selenium 3
* Chrome 59

## 使用方法

前提として Chrome がすでにインストール済み。

#### Headless Chrome を使用するために、オプションを指定します

```python:example.py
options = webdriver.ChromeOptions()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--window-size=1200x600')
```

#### 普通に起動するより高速に起動させるために`Service`を起動する

```python:example.py
# サービスの起動
service = Service(executable_path='/usr/local/bin/chromedriver')
service.start()
# Chrome に接続
driver = webdriver.Remote(service.service_url, desired_capabilities=options.to_capabilities())
```

あとはいつもどおり、Slenium を実行するだけです。

### Selenium のメソッドを使用するとエラーが発生する場合

CUI 環境では以下のエラーが発生する場合があります

```bash:error.log
selenium.common.exceptions.WebDriverException: Message: unknown error: an X display is required for keycode conversions, consider using Xvfb
  (Session info: headless chrome=59.0.3071.86)
  (Driver info: chromedriver=2.29.461571 (8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5),platform=Linux 4.8.0-49-generic x86_64)
```

私は、`sendKeys()` メソッドを実行した際に発生しました。
これは、`sendKeys()` ではなく JavaScript で文字の入力等を行うことで回避できます。
この他のエラーが発生した場合も JavaScript を実行することで回避可能だと思われます。

#### 例：

```python:example.py
# driver.get_element_by_css_selector('hoge').sendKeys('fuga') は例外が発生
def _set_value_for_element(selector: str, value: str):
        return 'document.querySelector("{selector}").setAttribute("value", "{value}")'.format(selector=selector, value=value)

driver.get(url)
# sendKeys() を実行すると例外が発生するので、JSを実行する
driver.execute_script(_set_value_for_element(user_name_selector, user_name))
driver.execute_script(_set_value_for_element(user_password_selector, user_password))
driver.find_element_by_css_selector(login_button_selector).click()
```
Picodom触ってみた


## Picodomとは

[picodom/picodom](https://github.com/picodom/picodom)

vdomでページを操作できるたった1kbのjsライブラリです。メソッドもvdomを組み立てる`h`、差分反映の`patch`の２つしかありません。

## Hello Picodom

以下は[jsFiddle](https://jsfiddle.net/nju33/awpkyzgj/)から実際に動作確認できます。
（jsFiffleなので直接読み込んでますが、pkgで入れる場合は`import`にするなりしてください）

```js:hello-picodom.js
/** @jsx h */
const {h, patch} = picodom;
let element = null;
let oldNode = null;

function render(newNode) {
  element = patch(
    document.body,
    element,
    oldNode,
    newNode
  );
  oldNode = newNode;
}

function view(state) {
  return (
    <div>
      <h1>{state}</h1>
      <input
        oninput={e => render(view(e.target.value))}
        value={state}
        type="text"
      />
    </div>
  )
}

render(view("Hello Picodom!"))
```

`view`で作った新しい`vdom`を`patch`へ渡して差分だけ更新してもらう感じです。
多分これより少し複雑な処理だとしても、この状態が基本みたいな感じになるのかなと思います。

## FizzBuzzCounter

`class`で書いたらどんな感じになるだろと思ったので、`FizzBuzz`言うカウンターを作ってみました。こちらも[jsFiddle](https://jsfiddle.net/nju33/5r2zyonv/)で動作確認できます。

```js:fizz-buzz-counter.js
/** @jsx h */
const {h, patch} = picodom;

class FizzBuzzCounter {
  constructor(state) {
    this.state = state;
    this._element = null;
    this._oldNode = null;
  }

  _increase() {
    return () => {
      const newState = Object.assign({}, {
        count: this.state.count + 1
      })
      this._update(newState);
    }
  }
  
  _decrease() {
    return () => {
      if (this.state.count === 1) {
        return;
      }
      
      const newState = Object.assign({}, {
        count: this.state.count - 1
      })
      this._update(newState);
    }
  }

  _update(newState) {
    this.state = newState;
    this.render();
  }

  _createView() {
    const result = (count => {
      if (count % 3 === 0 && count % 5 === 0) {
        return 'FizzBuzz';
      } else if (count % 3 === 0) {
        return 'Fizz';
      } else if (count % 5 === 0) {
        return 'Buzz';
      }
      return count;
    })(this.state.count);
    return (
      <div class="counter">
        <div class="buttons">
          <button onclick={this._increase()}>+</button>
          <button
            class={this.state.count === 1 && 'disabled'}
            onclick={this._decrease()}>-</button>
        </div>
        <div class="result">{this.state.count} : <span style={{color: 'orange'}}>{result}</span></div>

      </div>
    )
  }

  render() {
    const newNode = this._createView();
    this._element = patch(
      document.body,
      this._element,
      this._oldNode,
      newNode
    );
    this._oldNode = newNode;
  }
}

const fizzBuzzCounter = new FizzBuzzCounter({count: 1});
fizzBuzzCounter.render();
```

内容はHelloPicodomのものと対して変わってないです。`<button/>`のイベントが起きると、`state`を更新して再度`render`しています。

jsxの属性値辺りはReactとちょっと違うしWarningみたいなものも無いので、ちょっっとはまりました。例えば、ページの一部分や`rollup`と一緒に使って、何かコンポーネントなパッケージを作りたい時にサイズも小さいのでいいんじゃないかと思います。

もうしばらく、state管理ライブラリとの相性辺りもついでに試してみたいと思います。

## 関連

- [picodom + mobx](http://qiita.com/nju33/items/546f8b3216207c59be18)
macOS Sierraでコロンとセミコロンを入れ替える

macOS Sierraでコロンとセミコロンが入れ替えられなくて困っているVimmerの皆さん！特に特別なアプリケーションを入れずともコロンとセミコロンを入れ替えることができましたよ。

ご存知の通り、現状macOS SierraではKarabinerが動作しません。移行措置として用意されたKarabiner Elementsは使えるのですが、残念ながらコロンとセミコロンが入れ替えられません。これは一部のVimmerにとっては辛いです。
僕も困っていたのですが、macOSというかCocoaの仕組みとしてキーバインディングの変更ができるので、それを使って入れ替えることができました。

具体的には、`~/Library/KeyBindings/DefaultKeyBinding.dict`に下記の行を追加すればOKです。

```
{
";" = ("insertText:", ":");
":" = ("insertText:", ";");
}
```

ちなみに反映にはアプリケーションの再起動が必要になる場合があるようです。再起動しちゃうのが早いかも。

この方法は下記のリンクで発見しました。
https://github.com/tekezo/Karabiner-Elements/issues/26#issuecomment-304770126

キーバインディングについてのApple公式ドキュメントはこちら
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/EventOverview/TextDefaultsBindings/TextDefaultsBindings.html

こちらにも解説と幾つかサンプルがあります。
http://xahlee.info/kbd/osx_keybinding.html

余談ですがキーリピートの速度もコマンドラインから変更できます。これで、キーリピートのためにKarabiner Elementsを入れる必要もなくなります。

https://apple.stackexchange.com/a/83923
iOS Safariでswipe直後にscrollするとposition fixedの位置がずれる

## 状況
- windowTopの位置によって画面上部にFixするナビをクラスで制御  

```javascript:fixnav.js
var headerTop = $('#headerWrap').offset().top;
$(window).on('scroll', function(){
  var windowTop = $(window).scrollTop();
  if(headerTop <= windowTop) {
    $('#header').addClass('fixed');
  } else {
    $('#header').removeClass('fixed');
  }
});
```

- 同時にそのナビはSwipeでコンテンツの切り替えも行う
- Swipeが終わる前にFixイベントが発動するとナビゲーションが変な位置に固定される
- ずれている要素の`offset().top`をコンソールで確認するとは正常な位置で取れている
- Inspectorで要素を確認すると正常な位置にいる

## 予想
レンダリングの問題?
swipeイベントと`position:fixed`が取れた瞬間の要素のレンダリングが間に合ってない？

## 結果
position:fixedをかけている要素にpositionを指定してあげるとなおった！
原因はよくわからないけど、CSSでレンダリングの位置をちゃんと指定してあげないといけないのかな。。。
ちなみに`top:0`では同じ現象が発生するので、ダメでした。。

```css:header.css
#header {
  position: relative;
  top: 1px;
  margin-top: -1px; //レイアウト調整用
}
```
【iOS 11】【Core ML】pip install coremltools でエラーになった場合の対処法

[Core ML Tools の公式ページ](coremltools 0.3.0 : Python Package Index : https://pypi.python.org/pypi/coremltools) によると、

```
$ pip install -U coremltools
```

これだけでインストールできるとのことでさっそく実行してみると、以下のようなエラーが出ました。

```
Collecting coremltools
  Could not find a version that satisfies the requirement coremltools (from versions: )
No matching distribution found for coremltools
```

みんな遭遇してるらしく、Twitter検索で以下のツイートを見つけました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">If you have problems running coremltools on Sierra, grab the Python 2.7 Anaconda: <a href="https://t.co/SS01j99wri">https://t.co/SS01j99wri</a> and do a pip install after that.</p>&mdash; Brad Larson (@bradlarson) <a href="https://twitter.com/bradlarson/status/872545192028635138">2017年6月7日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

（余談ですがGPUImageの作者の方ですね）

というわけで

```
$ pyenv versions
```

で入ってるPythonのバージョンを確認して、

```
  system
  2.7.11
  3.5.1
* anaconda3-2.5.0
```

バージョンを切り替え。

```
$ pyenv global 2.7.11
```

再度実行。

```
$ pip install -U coremltools
```

うまくインストールできました。

> Successfully installed coremltools-0.3.0 numpy-1.13.0 protobuf-3.3.0 setuptools-36.0.1 six-1.10.0
VisualStudioCodeの日本語化

# VisualStudioCodeの日本語化
VSCodeは日本語に対応していて自動で日本語表示になるのだが、たまにアップデートをすると英語表記に
変わってしまい設定を変えないといけなくなる。
その場合の手動での設定方法を説明する。

## 日本語モードでVSCodeを開く
以下のオプションをつけて開くことで日本語モードで起動できる。
```$ code . --locale=ja```

## デフォルト言語を日本語に設定する
VSCode上で「Ctrl+Shift+P」を押してコマンドパレットを開く
``` >Configure Language ```
と入力すると```locale.json```が開く

```json
{
	// VSCode の表示言語を定義します。
	// サポートされている言語の一覧については、https://go.microsoft.com/fwlink/?LinkId=761051 をご覧ください。
	// VSCode の再起動に必要な値を変更します。
	"locale":"ja" ←ここが ja 以外になっていたら ja にすることで日本語設定に出来る
}
```

ここで```locale```を```ja```に設定するとデフォルト言語が日本語になる。
Goでコマンドライン引数と環境変数の両方からflagを設定したい

Goで実装したプログラムでオプションをコマンドライン引数から取るには標準の `flag` パッケージを使いますが、値を環境変数からも読みたいことがあります。(特に Docker で動かす場合)

https://github.com/namsral/flag を使うと便利です。標準の flag を置き換える形で、import 1行で対応できます。

```go
package main

import (
	"fmt"

	"github.com/namsral/flag"
)

func main() {
	var age int
	var fooBar string
	flag.IntVar(&age, "age", 0, "age of gopher")
	flag.StringVar(&fooBar, "foo-bar", "hoge", "hoge")
	flag.Parse()

	fmt.Println("age:", age)
	fmt.Println("foo-bar:", fooBar)
}
```

```
$ go run main.go -age 1 -foo-bar baz
age: 1
foo-bar: baz

$ AGE=2 FOO_BAR=BAZ go run main.go
age: 2
foo-bar: BAZ

$ AGE=2 go run main.go -age 3
age: 3
foo-bar: hoge
```

環境変数と引数で両方指定すると、引数が優先になります。

configファイルを作って、そこから読むこともできます。

```go
flag.String(flag.DefaultConfigFlagname, "", "path to config file")
```

```
$ cat example.conf
# comment
age=4
foo-bar=XYZ

$ go run main.go -config example.conf
age: 4
foo-bar: XYZ
```

[追記]

[Re: Goでコマンドライン引数と環境変数の両方からflagを設定したい](https://mattn.kaoriya.net/software/lang/go/20170609110526.htm)

mattnさんから標準の flag だけで同様のことをする方法を教えていただきました。依存を減らしたい場合にはこちらの方法がお勧めです。
Windows10でエクスプローラで表示中のフォルダでWindows Sybsystem for Linuxのbashを実行する

[エクスプローラで表示中のフォルダでコマンドプロンプトを開く](https://www.google.co.jp/search?q=エクスプローラ+コマンドプロンプト)というのは、皆様、何らかの方法ですでに実践されていると思います。右クリックメニューに追加するのはよくある方法の一つですが、任意のフォルダを表示中にアドレスバーに cmd と入力する、というのも、案外使われている方法ではないかと思います。

では「エクスプローラで bash と入力したら、そのフォルダで bash が起動するだろうか」と思って試してみたら、普通に起動しました。

![bash_from_explorer.gif](https://qiita-image-store.s3.amazonaws.com/0/149350/ed5705d0-9e45-196e-e7f0-6fd648483747.gif)

もちろん、コマンドプロンプトの場合と同様に、右クリックメニューに機能追加する方法もできるようですが、エクスプローラから手打ちで bash と入力する方法は、Windows Subsystem for Linuxがインストール済みなら任意の環境で設定変更不要で使える方法なので重宝すると思います。

なお、Bash on Windows を 1507 (Anniversary Update) から使い始めている場合はこの方法で起動しない場合があるようです。その場合は ```lxrun.exe /uninstall /full``` してから再度インストールすれば良いようです。
jupyter notebookを自動で立ち上がらないバグの直し方


####jupyter自動立ち上げのバグの対象法を初学者向けに説明しているページが見つからなかったのでまとめてみました。



jupyterを起動しようとターミナルにいつものように

```
jupyter notebook
```
と入力すると、

```
open location”メッセージを認識できません。 (-1708)
```

とのエラーメッセージが表示されてしまう現象がしばらく前から。表示されるURLを直接たたけば対処できるのですが、それ以外の現時点での対処方法をまとめます。

（以下Chromeを使っている場合です）


#1.　「.bash/profile」 にコードを追加する方法

まずは、ファイルを確認（このステップは特に必要ないですが、念のため）

```
cd
```
とターミナルでうってホームディレクトリへ移動

```
ls -al
```
で特殊なファイルを含めたホームディレクトリ内のファイルを確認すると、

```
 .bash_profile
```
があるはず！なのでこのファイルにこれからコード追加します。

適当なテキストエディタ等でファイルを開けばOK。
Finderを開きホームディレクトリのフォルダ内で、
「command + shift + .」を使って隠しファイルを表示し、
「.bash_profile」をテキストエディタ等を使って開きます。

<img width="833" alt="スクリーンショット 2017-06-09 08.15.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/9a0f5bf4-2fd4-8429-7cad-ccc10c6349f4.png">



今回は、Atomで開きました。

<img width="800" alt="スクリーンショット 2017-06-09 08.16.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/a391988e-9a7e-d92e-5336-fe3d1dbc37ea.png">


このファイルの最後に

```
export BROWSER=/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
```
を追加します。

<img width="796" alt="スクリーンショット 2017-06-09 08.17.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/7c61b386-f5a1-ce66-3e13-501d669c6525.png">

そして、保存。
管理者の名前とパスワードを入力を求められます。

<img width="829" alt="スクリーンショット 2017-06-09 08.17.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/26faf051-0f78-1691-f208-22f9be0b7262.png">


これで保存し、ターミナルを再起動してJupyterを立ち上げればバグはなおっているはずです:blush:

bashではなく、zshを使っている場合は、「.zshrc」を同様に書きかえればOKです。

##2.　「~/.jupyter/jupyter_notebook_config.py」にコードを追加する方法【追記あり】

続いて、別の方法も念のため。
ターミナルで

```
cd
```
とうって、ホームディレクトリへ移動。

```
cd ./.jupyter
```
でフォルダー「.jupyter」へ移動し、

```
ls -al
```
でフォルダ内のファイルを確認。「jupyter_notebook_config.py」があればOK.
なければ作ります。

作る方法は、ターミナルに

```
jupyter notebook --generate-config
```
と打つだけです。

これで、「jupyter_notebook_config.py」ができたので編集します！

Finderを開いて、隠しファイルを「command + shift + .」で表示。
フォルダー「.jupyter」の中に、「jupyter_notebook_config.py」があるので、1.の方法と同様にテキストエディタ等で開きます。

![スクリーンショット 2017-06-09 09.41.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/186100/2f86ea1d-f13c-1d00-8363-3294e558fd28.jpeg)

このファイル内に以下の一行を付け足せばOK!

```
c.NotebookApp.browser = u'chrome'
```
<img width="805" alt="スクリーンショット 2017-06-09 17.22.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/be1260e2-0d68-965e-f350-87a9b84df32e.png">

こんなかんじです。
これで保存し、ターミナルを再起動してJupyterを立ち上げればバグはなおっているはずです:blush:

【追記】
もし、これでなおらなかった方は代わりに以下の一行を試してみてください
（私は再び自動で立ち上がらなくなり、以下の一行で再びなおりました）

```
c.NotebookApp.browser = u'open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome %s'
```

ちなみにsafariに指定したい場合は、

```
c.NotebookApp.browser = u'Safari'
```
となります。


>「chrome」ではなく「Google Chrome」をとするとエラーメッセージが表示されたとの投稿もありました。
また、safariの場合、「u'Safari」はダメで、「'Safari'」でなおったという投稿もありました。
>https://github.com/jupyter/notebook/issues/2438#issuecomment-301736816










参考サイト：　https://github.com/jupyter/notebook/issues/2438#issuecomment-301736816
Swift4のCodableでISO8601の日付をデコードする


コメントでdecoderにdateDecodingStrategyを設定すると良いと教えてもらいました。が、フォーマットがISO8601の拡張だからなのか.iso8601ではデコードできなかったので以下のように行いました。

```Swift
struct A: Codable {
    let createdAt: Date?
    let deletedAt: Date?
    
    private enum CodingKeys: String, CodingKey {
        case createdAt = "created_at"
        case deletedAt = "deleted_at"
    }
}

let data = """
{
"created_at": "2017-03-20T16:31:05.000Z",
"deleted_at": null
}
""".data(using: .utf8)!

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
let decoder: JSONDecoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)
do {
    let a = try decoder.decode(A.self, from: data)
    print(a)
} catch {
    print(error)
}
```

--

### 旧版

Swift4のCodableですが、Date型もCodableに準拠しています。しかしその[実装](https://github.com/apple/swift/blob/4654a230fb67fc8ba34348c1f5f3758292223260/stdlib/public/SDK/Foundation/Date.swift#L288)を見るとDoubleからのデコードしか対応していません。ISO8601の文字列では実際にデコードしようとしてもエラーになってしまいます。

この場合おそらくinit(from:)を記述して独自にデコードする必要があると思われます。しかしinitの中でStringからDateへの変換処理を記述するのは避けたいところです。出来れば変換処理は色々な個所で利用したい。ので変換するための仕組みを作ってみました。

```Swift
protocol CodingTransformerProtocol {
    associatedtype From
    associatedtype To
    
    func transform(_ from: From) throws -> To
}

struct DateTransformer: CodingTransformerProtocol {
    static let formatter: DateFormatter = {
        let result = DateFormatter()
        result.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        return result
    }()
    
    func transform(_ from: String) throws -> Date? {
        return DateTransformer.formatter.date(from: from)
    }
}

extension KeyedDecodingContainer {
    func decode<Transformer: CodingTransformerProtocol>(with transformer: Transformer, forKey key: Key) throws -> Transformer.To where Transformer.From == String {
        return try transformer.transform(try decode(String.self, forKey: key))
    }
    
    func decodeIfPresent<Transformer: CodingTransformerProtocol>(with transformer: Transformer, forKey key: Key) throws -> Transformer.To where Transformer.From == String, Transformer.To: ExpressibleByNilLiteral {
        guard let decoded = try decodeIfPresent(String.self, forKey: key) else { return nil }
        return try transformer.transform(decoded)
    }
}
```

CodingTransformerProtocolに準拠したDateTransformerを作成して、以下のように利用します。

```Swift
struct A: Codable {
    let createdAt: Date?
    let deletedAt: Date?
    
    private enum CodingKeys: String, CodingKey {
        case createdAt = "created_at"
        case deletedAt = "deleted_at"
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        createdAt = try container.decode(with: DateTransformer(), forKey: .createdAt)
        deletedAt = try container.decodeIfPresent(with: DateTransformer(), forKey: .deletedAt)
    }
}

let data = """
{
"created_at": "2017-03-20T16:31:05.000Z",
"deleted_at": null
}
""".data(using: .utf8)!

let decoder: JSONDecoder = JSONDecoder()
do {
    let a = try decoder.decode(A.self, from: data)
    print(a)
} catch {
    print(error)
}
```

より簡単な方法があれば教えてほしいです…
UIAlertController メモ

# UIAlertController生成
```swift
let alert = UIAlertController(title: "アラートのタイトル", message: "アラートのメッセージ", preferredStyle: UIAlertControllerStyle.alert)
```

# アラートにテキスト入力フォームを追加
```swift
alert.addTextField(configurationHandler: nil)
```

# アラートにボタンを追加
```swift
let okButton = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { (action: UIAlertAction!) in
    //ボタンを押した時の処理
})
alert.addAction(okButton)
```

# アラートを閉じるキャンセルボタン
```swift
let cancelButton = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)
alert.addAction(cancelButton)
```

# アラートを表示
```swift
self.present(alert, animated: true, completion: nil)
```
Vim で 2つの textobj の対象を入れ替える operator つくった

[ブログ記事](http://secret-garden.hatenablog.com/entry/2016/06/08/214642)からの転載です。
つくりました。
と、いっても最初に公開したのは2年ぐらい前なんですが。

## [プラグイン]

```vim
NeoBundle "osyo-manga/vim-operator-swap"
```

* ソースコード：https://github.com/osyo-manga/vim-operator-swap

## [使い方]

`<Plug>(operator-swap-marking)` で対象の `textobj` を設定し、`<Plug>(operator-swap)` で対象の `textobj` と入れ替えます。

![swap](https://cloud.githubusercontent.com/assets/214488/15874646/1630faf6-2d3f-11e6-8415-140c0566a79d.gif)

## [設定例]

```vim
nmap <C-m> <Plug>(operator-swap-marking)
nmap <C-p> <Plug>(operator-swap)
```

## [operator-highlighter と組み合わせる]

[昨日つくった operator-highlighter](http://secret-garden.hatenablog.com/entry/2016/06/05/003257)を利用して『`<Plug>(operator-swap-marking)` 時に対象の `textobj`』をハイライトさせます。
operator をつなげるのには [operator-sequence](https://github.com/thinca/vim-operator-sequence) を利用します。

```vim
noremap <expr> <C-m> operator#sequence#map("\<Plug>(operator-swap-marking)", "\<Plug>(operator-highlighter)")
noremap <expr> <C-p> operator#sequence#map("\<Plug>(operator-swap)", "\<Plug>(operator-highlighter-clear)")
```

![swap2](https://cloud.githubusercontent.com/assets/214488/15874649/204ab8ec-2d3f-11e6-9f52-8a20d6c5b6be.gif)
monacaバックエンド マネジメント API をPHPで呼ぶ

##ユーザー登録

```PHP
<?php

$data = [
   "jsonrpc"=> "2.0",
   "method"=> "User.create",
   "params"=> [
     "username"=> "yamada",
     "password"=> "password"
   ],
   "id" => 1
];

$header = [
    'X-Monaca-Backend-Management-API-Key: ************** ' // APIキー
];

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, 'https://cloud.monaca.mobi/manage/json-rpc/************'); //　エンドポイント
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl);
curl_close($curl);

$result = json_decode($response, true); 

var_export($result);
```
##ユーザー取得
ユーザー名からidを取得する

```PHP
<?php

$username = 'yamada';

$data = [
   "jsonrpc"=> "2.0",
   "method"=> "User.list",
   "params"=> [
     "page"=> 1,
     "itemsInPage"=> 100,
     "sortProperty"=> "_username",
     "sortOrder" => "asc",
     "nameFilter" => $username
   ],
   "id" => 1
];

$header = [
    'X-Monaca-Backend-Management-API-Key: ********** '
];

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, 'https://cloud.monaca.mobi/manage/json-rpc/***********');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl);
curl_close($curl);

$response = json_decode($response);
$result = $response->result;

$id = "";
for ($i = 0; $i < $result->totalItems; $i++) {
    if ($result->items[$i]->_username == $username) {
        $id = $result->items[$i]->_id;
        break;
    }
}
echo $id;
```

ネットを探してもサンプルが少なかったので。
はじめよう、Kotlin（導入編）

導入編　★イマココ
[基本編](http://qiita.com/SYABU555/items/7cc5909c119ec9ab0288)　
[上級編](http://qiita.com/SYABU555/items/c6d828b4c29c545a58f3)

# はじめに

2017年のGoogle I/O で、Kotlinが正式に
Androidの開発言語として発表されました。

![Screen Shot 2017-06-08 at 16.04.24.png](https://qiita-image-store.s3.amazonaws.com/0/85214/4e0643a4-d4f0-c106-c8dc-435efb039b30.png "Screen Shot 2017-06-08 at 16.04.24.png")

その導入の簡単さと、Javaとの親和性、
既存プロジェクトへの導入リスクの低さ、
可読性等々、感動する場面がたくさんあったので
ここにまとめていきたいと思います。

# Kotlin？
## なにそれ
KotlinはIntelliJを出しているJetBrainsが開発した
新しいオブジェクト指向プログラミング言語です

Javaと100％相互運用可能で、
後発言語のSwiftのような型推論やラムダ式が採用されていますが
Java開発者にすぐに受け入れられるよう設計されています。

https://kotlinlang.org/

## メリット
**既存のJavaプロジェクト（およびAndroidプロジェクト）と共存が可能**
従来のソースはJava、一部のソースだけKotlinを採用、
なんてことも普通にできちゃいます。

また、プログラミング速度も個人的にはかなりブーストされるので
可動性も相まって、みんながハッピーになれる言語かと思います。

## デメリット
思いついたら書きます。
ほんとに、ない。

# 導入
IntelliJとAndroidStudio、２つ紹介します

## IntelliJ
**最新のIntelliJでは必要ありません**

`設定 > Plugin > Install JetBrainsPlugin... > Kotlin`
スクショはすでにInstall済みなのでUpdateと表示されていますが、
ここがInstallになっているのでInstallして再起動しましょう。

**以上**

![Screen Shot 2017-06-08 at 16.18.08.png](https://qiita-image-store.s3.amazonaws.com/0/85214/72993e12-526e-f4a8-567c-fcf856797a10.png "Screen Shot 2017-06-08 at 16.18.08.png")

## AndroidStudio
### Kotlinプラグイン導入
**3.0からは必要ないそうです**
IntelliJと同じです。

###プロジェクトに導入
プロジェクトを開いた後に
`Tools > Kotlin > Configure Kotlin in Project`
を選択すればOK

基本的には以上ですが、
**ビルド時に自動生成するライブラリを使用している場合は
次のステップも必要です。**

![Screen Shot 2017-06-08 at 16.25.20.png](https://qiita-image-store.s3.amazonaws.com/0/85214/675ea937-b40d-ebf9-ec1e-8d2809dd42f9.png "Screen Shot 2017-06-08 at 16.25.20.png")


###kapt追加
これはOptionalです。
DataBindingなどのライブラリを使用している場合、
ビルド時に生成されるライブラリのクラスファイルを利用してプロジェクトをビルドしています。

これをKotlinでも利用するためには一工夫必要です。

アプリのgradleに以下を追加
今回はよく使う４つのライブラリの例を出してみました。


```groovy:build.gradle
dependencies {
		:
	  (省略)
		:

    // DataBinding
	kapt "com.android.databinding:compiler:x.y.z"

    // Orma
    kapt "com.github.gfx.android.orma:orma-processor:x.y.z"

    // Dagger2
    kapt "com.google.dagger:dagger-compiler:x.y.z"
        
    // Icepick
    kapt 'frankiesardo:icepick-processor:x.y.z'
    
		:
	  (省略)
		:
}
```

```groovy:build.gradle
kapt {
    generateStubs = true
}
```

# Kotlin変換
IntelliJやAndroidStudioを使っていると、
一発でJavaコードをKotlinコードへ変換できちゃいます。

やり方は非常に簡単。
`Code > Convert Java File to Kotlin File`

![Screen Shot 2017-06-08 at 16.47.00.png](https://qiita-image-store.s3.amazonaws.com/0/85214/6b8ad275-ad66-1bbe-a19a-e3d4569cc8ef.png "Screen Shot 2017-06-08 at 16.47.00.png")

こんな長ったらしいコードが

![Screen Shot 2017-06-08 at 16.46.22.png](https://qiita-image-store.s3.amazonaws.com/0/85214/35a1d2c8-5094-d791-603a-3462a0590280.png "Screen Shot 2017-06-08 at 16.46.22.png")

一瞬でこんなことに

![Screen Shot 2017-06-08 at 16.48.44.png](https://qiita-image-store.s3.amazonaws.com/0/85214/ef1729a4-3066-beb3-114d-25107a9511fe.png "Screen Shot 2017-06-08 at 16.48.44.png")
Swift4のCodableでフラットなJSONからネストしたオブジェクトにデコードする


init(from:)で独自のデコード処理を記述することが出来ます。以下のコードでフラットなJSONからネストしたオブジェクトにデコードすることが出来ます。

```Swift
struct User: Codable {
    struct Address: Codable {
        let street: String
        let city: String
        let state: String
    }
    let name: String
    let address: Address
    
    private enum CodingKeys: String, CodingKey {
        case name
    }
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        address = try Address(from: decoder)
    }
}

let data = """
{
"name": "rizumita",
"street": "1-2-3 Foo",
"city": "Bar",
"state": "Baz"
}
""".data(using: .utf8)!

let decoder: JSONDecoder = JSONDecoder()
do {
    let user: User = try decoder.decode(User.self, from: data)
    print(user)
} catch {
    print(error)
}
```
AWS CloudTrailのeventSource一覧

先日、CloudWatchに統合したCloudTrailのログストリームをSNSに流す際にサブスクリプションフィルタを利用する機会がありました。
`eventSource`というエントリでサービスごとにフィルタリングすることで、いい感じに必要なストリームのみを抽出出来ることがわかったのですが、
サービス名と`eventSource`の対応一覧を確認できるページが見つからなかったので、一覧をまとめました。
(全サービスを網羅しているわけではありません)




| サービス名 | イベントソース |
|------------|----------------|
|CloudFormation|cloudformation.amazonaws.com|
|CloudTrail|cloudtrail.amazonaws.com|
|CloudWatch|monitoring.amazonaws.com|
|CloudWatchLogs|log.amazonaws.com|
|CodeCommit|codecommit.amazonaws.com|
|DynamoDB|dynamodb.amazonaws.com
|Glacier|glacier.amazonaws.com|
|EC2|ec2.amazonaws.com|
|IAM|iam.amazonaws.com|
|Lambda|lambda.amazonaws.com|
|S3|s3.amazonaws.com|
|SES|ses.amazonaws.com|
|SNS|sns.amazonaws.com|
|SQS|sqs.amazonaws.com|
|RDS|rds.amazonaws.com|
|ログインなど|signin.amazonaws.com

と、列挙してみて分かるように基本的にはサービス名.amazonaws.comとなっています:star:
sympyで「コンピューターでの微分」を参考にした

(参考)「コンピューターでの微分」
http://qiita.com/namitop/items/55536bbbd5f92d18b2a0

```python
from sympy import *
var('x')
y=0.01*x**2 + 0.1*x
yd=diff(y,x)
print(type(y),y)
print(type(yd),yd)
input={x:5}
print(yd.subs(input))
input={x:10}
print(yd.subs(input))
print('-----------------------------')
print(diff(0.01*x**2+0.1*x).subs([(x, 5)]))
print(diff(0.01*x**2+0.1*x).subs([(x,10)]))

# <class 'sympy.core.add.Add'> 0.01*x**2 + 0.1*x
# <class 'sympy.core.add.Add'> 0.02*x + 0.1
# 0.200000000000000
# 0.300000000000000
# 0.200000000000000
# 0.300000000000000
```
－－－－－－－－－－－－－－
【補足】(2017/06/12)リンクが途中で切れています。
(参考)Wolfram|Alpha: Computational Knowledge Engine＞derivative 0.01*x**2 + 0.1*x
http://www.wolframalpha.com/input/?i=derivative+0.01*x**2+%2B+0.1*x
0.1 + 0.02 x
(参考)Wolfram|Alpha: Computational Knowledge Engine＞derivative 0.01*x**2 + 0.1*x,x=5
http://www.wolframalpha.com/input/?i=derivative+0.01*x**2+%2B+0.1*x,x%3D5
0.2
(参考)Wolfram|Alpha: Computational Knowledge Engine＞derivative 0.01*x**2 + 0.1*x,x=10
http://www.wolframalpha.com/input/?i=derivative+0.01*x**2+%2B+0.1*x,x%3D10
0.3
Python vs Ruby 『ゼロから作るDeep Learning』 まとめ

## Python vs Ruby 『ゼロから作るDeep Learning』

- [Python vs Ruby 『ゼロから作るDeep Learning』 1章 sin関数とcos関数のグラフ \- Qiita](http://qiita.com/niwasawa/items/6d9aba43f3cdba5ca725)
- [Python vs Ruby 『ゼロから作るDeep Learning』 2章 パーセプトロンによる論理回路 \- Qiita](http://qiita.com/niwasawa/items/73f604f956d043671f39)
- [Python vs Ruby 『ゼロから作るDeep Learning』 3章 ステップ関数、シグモイド関数、ReLU関数のグラフ \- Qiita](http://qiita.com/niwasawa/items/42c3ed816ddffc14d770)
- [Python vs Ruby 『ゼロから作るDeep Learning』 3章 3層ニューラルネットワークの実装 \- Qiita](http://qiita.com/niwasawa/items/139311850632a599caa2)
- [Python vs Ruby 『ゼロから作るDeep Learning』 4章 損失関数 \(loss function\) の実装 \- Qiita](http://qiita.com/niwasawa/items/eae7e1f27cda8ac7abbb)

## 参考資料

- [O'Reilly Japan \- ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/)
- [GitHub \- oreilly\-japan/deep\-learning\-from\-scratch: 『ゼロから作る Deep Learning』のリポジトリ](https://github.com/oreilly-japan/deep-learning-from-scratch)
- [Ruby/Numo::NArray](http://ruby-numo.github.io/narray/)
- [Numo vs numpy · ruby\-numo/narray Wiki · GitHub](https://github.com/ruby-numo/narray/wiki/Numo-vs-numpy)
- [GitHub \- ruby\-numo/gnuplot: Gnuplot wrapper for Ruby/Numo](https://github.com/ruby-numo/gnuplot)
ghqとgit aliasのある生活

[ghq](https://github.com/motemen/ghq)を使うとリポジトリ管理社会がほんの少し滑らかになりますが、どうもgit関連のコマンドが二つに分裂してしまった気がして精神が安定しなかったので、gitのエイリアスでどうにかしてみました[^1]。

あなた[^2]は以下のように設定しました。これで何ができるのかを見ていきます。


```bash:.gitconfig
[alias]
	get = !ghq get -p
	cd = "!ghq look `ghq list | fzy $(echo $1 | awk '{if($1!=\"\") print \"-q\" $1}')` ; :"
	list = !ghq list
	root = "!exec $SHELL ; :"
```

##`git get`: クローン

```bash:.gitconfig
[alias]
	get = !ghq get -p
```

普通です。`-p`をつけるとSSH接続してくれます。

##`git cd`: 指定したリポジトリに移動

```bash:.gitconfig
[alias]
	"!ghq look `ghq list | fzy $(echo $1 | awk '{if($1!=\"\") print \"-q\" $1}')` ; :"
```

どこからでも移動できます。

ghqだけだとリポジトリ名をフルで指定する必要がありますが、ここでは[fzy](https://github.com/jhawthorn/fzy)の曖昧検索を利用して、適当な入力でも移動できるようにしてみました。大抵の場合、`git cd`のあとに検索クエリを指定してEnterを二回押せば移動できます。

##`git list`: リポジトリ一覧

```bash:.gitconfig
[alias]
	list = !ghq list
```

普通です。ghqで管理しているリポジトリを一覧表示してくれます。

##`git root`: 作業リポジトリのトップに移動

```bash:.gitconfig
[alias]
	root = "!exec $SHELL ; :"
```

はい。ghq関係ないですね。ただトップに移動するだけなら`.bashrc`に`git-root`のような孤独なエイリアスを書いたりする必要はありません。シェルはリフレッシュしてしまいますが……。

##`git unget`: リポジトリを削除

おまけです。

```bash:.gitconfig
[alias]
	unget = "!REPO=`ghq list | fzy $(echo $1 | awk '{if($1!=\"\") print \"-q\" $1}') | tee /dev/tty` ; if [ -n \"$REPO\" -a -e \"$(ghq root)/$REPO\" ] ; then REPO=\"`ghq root`/$REPO\" ; else exit 1 ; fi ; if [ -n \"$(git -C \"$REPO\" -c status.color=always status --short | tee /dev/tty)\" -o -n \"$(git -C \"$REPO\" log --branches --not --remotes --simplify-by-decoration --decorate --oneline --color=always | tee /dev/tty)\" ] ; then read -rp \"These changes will be deleted permanently. OK? [yN]\" yN ; case \"$yN\" in [Yy]*) : ;; '' | [Nn]* | *) echo Aborted. ; exit 1 ;; esac ; fi ; for i in `seq 3` ; do if [ -n \"$(realpath --relative-to=\"$REPO\" . | awk '! /^\\.\\./')\" ] ; then cd `dirname $REPO` ; fi ; rm -rf \"$REPO\" ; REPO=`dirname $REPO` ; if [ -n \"$(ls -A \"$REPO\")\" -o \"$(ghq root)\" = \"$REPO\" ] ; then break ; fi ; done ; echo Deleted. ; :"
```

長すぎる。

ghqで管理しているリポジトリの削除を試みます。変更や未プッシュのコミットがあった場合は[yN]で確認を取ります。削除したことによって親ディレクトリが空になった場合、それも削除してくれます。三回`rm -rf`するか`ghq root`に達した場合には中断するようになっているので、あなたのホームディレクトリを破壊したりしません。たぶん。

万が一使う場合は、神経症者になったつもりで、このスクリプトが何をやっているのか必ず具に確認してからにして下さい。

こちらに似たようなソリューションがあります。というか参考にしました。

- [ghq で管理しているリポジトリを複数選択して消す ghq-unget コマンド書いた - Qiita](http://qiita.com/uasi/items/dae9b180680e90950cb1)

#おわり

[^1]: ghqはsvnなどもサポートしているので本当はよくないのですが、個人的にはgitしか使っていないので……。
[^2]: 筆者のことです。
ゲーム開発を受注しようぜ＜その５＞　定期的に成果物を提出しようぜ

例えば、

- グーグル・ドライブ
- Git Hub

に　成果物を　提出する。

**Git Hub** の方には Unityのプロジェクト が丸ごと入っていて、
ダウンロードすることで Unityエディターで開くことができる。

ゲームを直接ダウンロードできるわけではないが、Unityの使い方を知っていれば　再生ボタンを押せばいい。

![20170609a2.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/593c7949-695b-6be0-7231-f9f4ff7a33a0.gif)


**グーグル・ドライブ** の方には　設計図などが置いてある。

# 更新履歴を書く

- **作り方に悩んでいるなどの理由により、作業が止まっていない**

など **進捗が進んでいる** ということが分かるのが重要で、どちらかというと **更新履歴 とか、見たくもない方の書類**。

変わったとこだけ　教えて欲しいという素朴な欲求も分かるんで　そうする。

よく変わっている場所を挙げていく。

## 設計図（PNG画像、PUソース）

こういう画像と、

![20170609s3.png](https://qiita-image-store.s3.amazonaws.com/0/159417/5dc5fe66-fd2e-06e8-51ac-dea355f72e36.png)

（この図を作るツール：「PlantUMLをインストールしようぜ」 http://qiita.com/muzudho1/items/25c229a60559b0aa2bc4 ）

こんなソース。
![20170609s4.png](https://qiita-image-store.s3.amazonaws.com/0/159417/e499f53b-bca3-ee5c-ddba-b037aa74291c.png)

先週の設計は何だったのか、というぐらい　毎週　変わっている。

**変えたファイルの名前（ファイルへのパス）を　更新履歴に記入する。**

毎週分の　設計図を残しておけば　ある意味　更新履歴ではあるんだが
それだと　何が消えて、何が増えたか　追いかけられないので、それを　補足することになる。

結局　実装と設計図の　照らし合わし作業で　２、３時間　これやってる気がするんで、提出日の半日は潰れると見ておいた方がいい。


## Unityの設定のいじったところ

これは Git Hub の履歴では見れないので（見れるのかもしれないが）テキスト・エディターでメモっておく。

# おわりに

実験中のコードを　提出すると、それが使い物にならないことが分かったときに　廃棄することになるはずで、ドキュメントを書く手間が増えることが　予想できる。

そこで　デバッグ用のコードは削除してから　提出しているんだが、
ドキュメントを書かなくて済む工夫、
プリプロセッサ定義文をさらに上回る　メタ　なプログラミングもあれば　いいのかもしれない。
oracle 改行を含むinsert文をchr(10)でまとめる

c++でまとめてみたw  ひまだなぁ。

```cpp:main.cpp
#include <fstream>
#include <iostream>
#include <string>
#include <iterator>
using namespace std;

int main(int argc,char *argv[]) {
    if(argc<2){
        cerr<<"set the param" <<endl;
        return -1;
    }
    ifstream ifs(argv[1]);
    string str;
    if (ifs.fail()) {
        cerr << "失敗" << endl;
        return -1;
    }
    while (getline(ifs, str)) {
        if(str[0]=='-' && str[1]=='-'){
            cout <<  str <<endl;
            continue;
        }
        if(str[0]=='R' && str[1]=='E' && str[2]=='M'){
            cout <<  str <<endl;
            continue;
        }
        if(*str.rbegin() != ';') {
            str=str + "'|| chr(10) ||'";
            cout <<  str ;   //ここが味噌かな
        }else
            cout <<  str <<endl;
    }
    return 0;
}
```
確率論 ~離散型と連続型~

#離散型

高校までの数学で確率を扱っていく場合、
ある事象に対して、それが起こる確率が定まっていました。

例えば、

```math
サイコロを\;1\;回投げたときに、1\;の目が出る確率を求めよ。
```

この場合、それぞれの目が出る確率は $\frac{1}{6}$ と決まっています。

#連続型

では、次のような場合はどうでしょうか？

```math
ダーツを\;1\;回投げたとき、\;0\;点となる確率を求めよ。\\
ただし、\;[0,\;1]\;区間の刺さったところが点数となり、\\
必ず\;[0,\;1]\;区間に刺さるものとする。
```

この場合、点数の取り方は、
$0,\;1,\;0.1,\;0.12345,\;0.77777777,\;......$
など、無限個も存在するわけです。

そんな中で、ピンポイントに $0$ 点を取りうる確率は $0$ に等しいのです。

このように、前者は断続した事象を扱っているため、離散型確率空間、

後者は連続な事象を扱っているため、連続型確率空間と呼びます。

<hr>

高校までの離散型確率空間から、連続型確率空間まで拡張することで、
確率を扱える世界がぐんと広がります。

先ほどの例を再び持ち出すと、

```math
[0,\;0.5)\;に刺さる確率を求めよ。
```
このように、ある範囲にまたがる確率も扱うことができます。
bash でUNIX時間を出力するメモ（エポックミリ秒）

## 現在のUNIX時間（エポックミリ秒）を出力

```bash
$ date +%s%3N
1496918153734
```

## UNIX時間（エポックミリ秒）から ISO 8601 形式の UTC 時刻を出力

エポックミリ秒の末尾 3桁の手前にドットを付加する（エポック秒以降に小数点を入れる）

```bash
$ date "+%Y-%m-%dT%H:%M:%S.%3NZ" --utc -d @1496918153.734
2017-06-07T22:35:53.734Z
```
【Gradle】【checkstyle】Eclipseから「Gradleプロジェクトのリフレッシュ」でCheckstyleのアクティブ設定が外れる場合の対処法

こちらのサイトを参考にしました。
http://irtakt.hatenablog.com/entry/2014/05/04/233312

環境によって、発生したりしなかったりするらしいのですが、
EclipseのプロジェクトのプロパティでCheckstyle⇒「このプロジェクトでCheckstyleをアクティブにする」にチェックしたのに、
「Gradleプロジェクトのリフレッシュ」[^ref]を実行するとチェックが外れてしまう場合の対処法です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/0ddd7f23-7ea5-7c9c-fa61-12fafaf7a5f9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/78e1d504-fa0a-ab52-5d9c-170b38048406.png)

で、チェックが外れる

# 原因

原因は、「Gradleプロジェクトのリフレッシュ」でgradleのeclipseプラグインが呼ばれ、
「.project」ファイルが再構築され、CheckstyleのbuildCommandとnatureが外れてしまうためです。

http://gradle.monochromeroad.com/docs/userguide/eclipse_plugin.html

# 対処

build.gradleファイルに以下の記述を足します。

```groovy:build.gradle
apply plugin: 'eclipse'

eclipse {
    project {
        natures 'net.sf.eclipsecs.core.CheckstyleNature'
        buildCommand 'net.sf.eclipsecs.core.CheckstyleBuilder'
    }
}
```

---

これで、「Gradleプロジェクトのリフレッシュ」[^ref]した際に「.project」ファイルにCheckstyle用のbuildCommandとnatureが記述され、EclipseのCheckstyleアクティブ設定を常にONにすることができます。

下記は作成された「.project」ファイル

```xml:.project
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<!-- ・・・・ -->
	<buildSpec>
		<!-- ・・・・ -->
		<buildCommand>
			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
		<!-- ・・・・ -->
	</buildSpec>
	<natures>
		<!-- ・・・・ -->
		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
		<!-- ・・・・ -->
	</natures>
</projectDescription>

```

[^ref]: または `gradle eclipse` 実行。
プロジェクトマネジメントに関する読書メモ

## はじめに

役職としてPMをやってるわけじゃないのだが、「プロジェクトマネジメント難しすぎでは？」という普遍的な問題にぶちあたった。

具体的には
・見積もりの不確実さ
・職種間でのこぼれタスクがポロポロ出る
・度重なる仕様変更

世間の人はどうやってプロジェクトをマネジメントしてるのか、知りたくて色々読んだメモ

## スクエニの元CTOの方が書いたスライド
http://www.jp.square-enix.com/tech/openconference/library/2011/dldata/PM/PM.pdf

「プロジェクトは基本失敗する。なので失敗を早めに検知してどう軌道修正するか考えよう！」というのが目から鱗だった。
ここに全くたどり着けていないが、ひとつの理想形だと思う。

## デジタルゲームの技術 開発キーパーソンが語るゲーム産業の未来
https://www.amazon.co.jp/gp/product/B00FOJ0CX2/ref=oh_aui_d_detailpage_o00_?ie=UTF8&psc=1
こちらもスクエニの元CTOの方のインタビュー記事がある。
上記スライドの凝縮版だが、対話形式なのでサクッと読みやすい。

## 曖昧性とのたたかい
https://www.amazon.co.jp/dp/B00DIYRKQW/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

SIとしての契約のコツなどが多め。

## 最短で達成する 全体最適のプロジェクトマネジメント
https://www.amazon.co.jp/gp/product/B009HP45XM/ref=oh_aui_d_detailpage_o07_?ie=UTF8&psc=1

チーム内でも使っている2点見積もりやバッファの概念について。
「50%を越えたら黄色信号」「バッファは基本的に使い切る」という観点が自分には無かったので学びが大きかった。
と同時に、バッファ管理の難しさも感じさせられた・・・

## マンガでわかるプロジェクトマネジメント
https://www.amazon.co.jp/gp/product/B00LAZPL6C/ref=oh_aui_d_detailpage_o08_?ie=UTF8&psc=1

全く開発プロジェクトに関わった事がない人は、読むといいかも。
そうでないなら、飛ばしてもOK

## アート・オブ・プロジェクトマネジメント ―マイクロソフトで培われた実践手法
https://www.amazon.co.jp/gp/product/4873112990/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1

ほとんど読めてないが、読了した後輩によるとかなり良書らしい。
コピペでできるUIImageView


Swift1や2と変わっているところがあってコピペでできないことが多かったのでメモ



```
do {
    // 読み込むファイルのURLを指定して表示
    let url : NSURL = NSURL(string: "https://hogeimag" + mediaHensuu)!

        // URL を指定して実際にファイルを NSData として読み込みます。
        let imageData : NSData = try NSData(contentsOf:url as URL,options: NSData.ReadingOptions.mappedIfSafe)
        // 読み込んだ NSData を UIImage へ変換します。
        let img : UIImage! = UIImage(data:imageData as Data)
        //imageViewに画像を表示
        imageView.image = img

} catch {
    print("failed create¥ image")
}
```

オプションの説明
 NSData.ReadingOptions
 mappedIfSafe: 安全で可能なら、ファイルを仮想メモリに入れる。
 uncached:
 alwaysMapped:
 https://developer.apple.com/reference/foundation/nsdata.readingoptions


非同期で読み込むにはSDWebImageなどを使うと楽です。


```
//画像の幅
imageWidth = img.size.width
//画像の高さ
imageHeight = img.size.height

```
【webpack】(現時点で)ES2015 (ES6)のままminifyする方法

---
**※この記事は2017年6月に書いた記事です。**

[【webpack】(2018年2月25日現時点で)ES2015 (ES6)のままminifyする方法](https://qiita.com/ota-meshi/items/8d30743fd72f8389628c)を新しく書いたのでこちらを参照したほうが幸せになれると思います。
こちらの結論は、[webpack](https://webpack.js.org/)`v4.0.0`使えということになります。  

残念ながら[webpack](https://webpack.js.org/)`v4.0.0`には出来ないという方は、
[【webpack】(2018年1月現時点で)ES2015 (ES6)のままminifyする方法](https://qiita.com/ota-meshi/items/9e9bfcbfab00e109494f)も書いているので参照されると幸せになれると思います。
以下、記事の概要です。

今（2018年1月）は[uglifyjs-webpack-plugin](https://www.npmjs.com/package/uglifyjs-webpack-plugin)を個別にインストールして
（[webpack](https://www.npmjs.com/package/webpack)からuglifyjs-webpack-pluginへの依存だとバージョン古いので）
`uglifyOptions: {ecma: 6}`等のオプションをつけるのがスマートな様子です。
https://www.npmjs.com/package/uglifyjs-webpack-plugin#uglifyoptions

---


# 初めに[webpack](https://www.npmjs.com/package/webpack)標準のminifyツール

[webpack](https://www.npmjs.com/package/webpack)でminifyする場合、通常は[webpack](https://www.npmjs.com/package/webpack)の中のUglifyJsPluginを利用しますね。
(minifyにはAggressiveMergingPluginとかも使いますけど、今回は重要じゃないので詳しいことは端折ります)
ただしこの場合ES5でjavascriptを記述するか、ES5へのトランスパイルが必須になります。

```js:webpack.config.js
const webpack = require("webpack");

module.exports = {
  // ・・・
  plugins: [
    new webpack.optimize.UglifyJsPlugin()
  ],
  // ・・・

  module: {
    loaders: [
      {
        // ・・・
        loader: 'babel-loader',
        query: {
          presets: ['es2015']
        }
      }
    ]
  }
}
```

これは、[webpack](https://www.npmjs.com/package/webpack)標準が依存している[uglify-js](https://www.npmjs.com/package/uglify-js)というライブラリが、ES2015をサポートしていないため
ES5での記述か、トランスパイルが必須になっています。

# [uglify-js](https://www.npmjs.com/package/uglify-js)のES2015サポート版[uglify-es](https://www.npmjs.com/package/uglify-es)

最近（たぶん）、[uglify-js](https://www.npmjs.com/package/uglify-js)のES2015サポート版[uglify-es](https://www.npmjs.com/package/uglify-es)というパッケージがリリースされました。

これを使えば、ES2015でのminifyができそうですが、現時点で[webpack](https://www.npmjs.com/package/webpack)の標準Pluginには無さそうです。

[switch to uglify-es · Issue #33 · webpack-contrib/uglifyjs-webpack-plugin · GitHub](https://github.com/webpack-contrib/uglifyjs-webpack-plugin/issues/33)

# webpackの[uglify-es](https://www.npmjs.com/package/uglify-es)プラグイン

たぶん公式じゃないと思うのですが、[uglify-es-webpack-plugin](https://www.npmjs.com/package/uglify-es-webpack-plugin)というのがあるようです。
[github](https://github.com/noBlubb/uglify-es-webpack-plugin)
[npm](https://www.npmjs.com/package/uglify-es-webpack-plugin)

これを利用すれば、ES2015のままES5トランスパイスせずminifyできるようです。

## npm install

```bash
npm -D install uglify-es-webpack-plugin
```

## webpack.config.jsの記述

```js:webpack.config.js
const UglifyEsPlugin = require('uglify-es-webpack-plugin');

module.exports = {
  // ・・・
  plugins: [
    new UglifyEsPlugin(),
  ],
  // ・・・
}
```

---

で、[webpack](https://www.npmjs.com/package/webpack)実行したら、ES2015のままminifyされたjsが生成されました。

細かい設定は動くかどうかすらわかりませんが、SourceMapを出すぐらいは出来そうな印象を受けました。

（ES2015でminifyしてもIEは動かないですけどね。）
おやすみツイートの「おやあり」を自動的に返信

#やりたいこと
おやすみとツイート
↓
おやすみ的なリプが来る
↓
それに「おやあり」と自動的に返信する

---
<img width="607" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/156669/1bc6376e-2096-bdf8-fa4e-f1e3027b42dc.png">
↑これを自動化したい
#コード

##ライブラリ
[TwitterOAuth](https://github.com/abraham/twitteroauth/tree/master/src)
↑これを使った

```php:code.php
<?php
// OAuthライブラリの読み込み
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
//認証情報
$consumerKey = "<Your consumer_key(API Key)>";
$consumerSecret = "<Your consumer_secret(API Secret)>";
$accessToken = "<Your access_token>";
$accessTokenSecret = "<Your access_token_secret>";
//自分のスクリーンネーム
$screen_name = "<Your screen_name>";

//接続
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

//リプライを10件取得
$res = $connection->get("statuses/mentions_timeline", array("count" => "10"));

//リプライを取り出し
for ($i=0; $i < count($res); $i++) {
  //リプライにおやすみが含まれていたら
  if(strpos($res[$i]->text,'おやすみ') !== false){
    //自分のツイートじゃなかったら
    if ($res[$i]->user->screen_name !== $screen_name) {
      //おやありとリプ
      $rp = $connection-  >post("statuses/update", array("status" => "@".$res[$i]->user->screen_name."
    おやあり！","in_reply_to_status_id" => $res[$i]->id));
      //ファボる
      $fav = $connection->post("favorites/create", array("id" => $res[$i]->id));
    }
  }
}
```

<font color="red">**↓※コメント欄に別のコードあり↓**</font>

#CRON設定
CRONで2分ごとに実行
<img width="512" alt="ss2.png" src="https://qiita-image-store.s3.amazonaws.com/0/156669/56600c4d-71fa-7b28-9158-477b3727723b.png">
(さくらのレンタルサーバの例)

#まとめ
これで、寝るって言ったけどおやありって返信しないといけないから寝れないみたいなことがなくなる。
[python]argmaxの挙動

argmaxはaxisで指定した次元のもっとも大きいものの要素番号を出力する。

```tmp.py
import numpy as np

array = [[2,3,4],
         [5,6,4],
         [3,2,1],
         [2,1,3]]
array = np.array(array)

print(np.argmax(array, axis=0)) # [1 1 0]
print(np.argmax(array, axis=1)) # [2 1 0 2]
```

## 出力の解説 axis=0のとき
`print(np.argmax(array, axis=0))`では、
[2,5,3,2][3,6,2,1][4,4,1,3]が対象になる。
そのため"5","6","4"がピックアップされる。
それぞれの要素番号が[1 1 0]である。

## 出力の解説 axis=1のとき
`print(np.argmax(array, axis=1))`では、
[2,3,4],[5,6,4],[3,2,1],[2,1,3]が対象になる。
そのため"4","6","3","3"がピックアップされる。
それぞれの要素番号が[2 1 0 2]である。


## ちなみに、
axisを指定しない場合は4になる。
これはなんでか調べてないです。

```tmp.py
print(np.argmax(array) #=> 4
```
コンパイルが終わったらスマートフォンにプッシュ通知する方法 (Pushover/ntfy)

時間がかかるコンパイルが終わったら音が鳴るといいな、
と思っていろいろ探してたらスマホに通知が飛んでくるアプリがあった。
iPhone では **Pushover**、Andorid では **ntfy** がいいみたい。

- **ntfy** 
 - [Android アプリ](https://play.google.com/store/apps/details?id=me.mcomella.notificationmanager)
 - 解説サイト：[Linuxのコマンドラインやスクリプトからスマホにプッシュ通知する。（ntfyというツールの紹介）](http://qiita.com/kjtanaka/items/8b0c90d28909e50e4a6d)
 - 無料
- **Pushover**
 - [iOS アプリ](https://itunes.apple.com/jp/app/pushover-notifications/id506088175)
 / [Android アプリ](https://play.google.com/store/apps/details?id=net.superblock.pushover)
 - [サイト](https://pushover.net/)
 - アプリ有料 600 円 (７日間トライアル無料)
 - 解説サイト：このブログを読んでね

私は iPhone なので **Pushover** の設定の仕方を下記に書きます。
使用までにwebサイトでいろいろ登録が必要です。
うちの環境は Ubuntu + iPhone/iPad です。

1. https://pushover.net/ に**ユーザー登録**します。メールアドレスとパスワードが必要です。
2. 受信確認メールの URL にアクセスします。
3. **ユーザーキー**と**アプリケーションキー**という２つの鍵が必要になります。
4. ユーザーキーはユーザー登録したら https://pushover.net/ の右上の Your User Key に表示されています。これを覚えておきます。
5. https://pushover.net/ の一番下に **Create an Application/API Token** というのがあるので、そこをクリック。
6. **アプリ名**を考えて登録します。たぶん pushover ユーザー全員に対してユニークな名前を入力する必要があるんじゃないかと思います。私はどうでもよかったので自分の名前的なものを入れました。
7. 終わると **API Token/Key** が表示されます。これも覚える。
8. たとえば下記のような ```mypush``` という名前のスクリプトを書きます。

```
#!/bin/bash
curl -s\
 --form-string "token=AAAAAAAAAAAAAAAAAAAAAA"\
 --form-string "user=UUUUUUUUUUUUUUUUUUUUUUU"\
 --form-string "message=$1" https://api.pushover.net/1/messages.json
```

```AAAAAAAAA``` の部分がアプリケーションキー、```UUUUUUUUU```の部分がユーザーキーを入れるところです。
分かりにくいですね。
どっちもトークンって呼んでるなら```token```って言うのやめろ。

あとは ```mypush``` を実行すれば通知が飛んできます。
音を変更しとくといい感じです。
Windows でも wincurl とかが使えるんじゃないでしょうか。
有料なのが嫌な人は自分でサーバーとスマホアプリを書けばいいと思います。
bootstrapでth, tdの幅、widthをいい感じに設定する方法

th tdの設定方法

###1、thの項目を決めて、幅を適当にいい感じに調整する。（そのものずばりの幅ではなく割合になるっぽい）

                <thead>
                <tr>
                    <th style="width: 40px"> No.</th>
                    <th style="width: 200px"> AA</th>
                    <th style="width: 250px"> BB</th>
                    <th style="width: 300px"> CC</th>
                    <th style="width: 600px"> DD</th>
                    <th style="width: 200px"> EE</th>
                    <th style="width: 600px"> FF</th>
                    <th style="width: 250px"> GG</th>
                </tr>
                </thead>


#### ２、Chromeの検証を使って各thの実際の幅をみてメモ。

#### ３、その幅通りにthにwidthを設定する。

                <tbody>
                    <tr>
                        <td style="width: 35px">1</td>
                        <td style="width: 98px">2017/05/06</td>
                        <td style="width: 120px">AAAA</td>
                        <td style="width: 144px">BBBB</td>
                        <td style="width: 271px">CCCC</td>
                        <td style="width: 99px">DDDD</td>
                        <td style="width: 272px">EEEE</td>
                        <td style="width: 123px">FFFF</td>
                    </tr>
                  </tbody>
Swift4 CodableでJSONが扱いやすくなる？

# はじめに
Codableを利用するとJSONが扱いやすくなるようなので、
試してみました。

もうSwiftyJSONやObjectMapperなどのライブラリも不要になりそうです。

## 試してみる

### 1. JSONデータを用意する

```json:テストデータ(JSON)
{
    "dateString":"2017-06-08 14:43:28 +0000",
    "weeks":[
             "sunny",
             "sunny",
             "cloudy",
             "cloudy",
             "cloudy",
             "rainy",
             "snowy"
　　　　　　　　]
}
```

### 2. 構造体を定義する
構造体にCodableを実装する

```swift:Forecast.swift
struct Forecast: Codable {

    enum WeatherType: String, Codable {
        case sunny, cloudy, rainy, snowy
    }

    var dateString = ""
    var weeks: [WeatherType]
}
```

### 3. JSONをパースする
decodeの第一引数にデータ型を指定すると、ドットでアクセスできるようになります。
簡単ですね。

```swift:デコードする

    if let path = Bundle.main.path(forResource: "forecast", ofType: "json") {

        let jsonData = try! Data(contentsOf: URL(fileURLWithPath: path))

        let jsonDecoder = JSONDecoder()
        let forecast = try! jsonDecoder.decode(Forecast.self, from: jsonData)

        //ドットでアクセスできる
        print(forecast.dateString)

        _ = forecast.weeks.map {
            print($0)
        }
    }
```

```:出力結果
2017-06-08 14:43:28 +0000
sunny
sunny
cloudy
cloudy
cloudy
rainy
snowy
```

## [おまけ]　JSONのエンコードのサンプル

```swift:
    let forecast = Forecast(dateString: Date().description,
                                weeks: [.sunny, .sunny, .cloudy, .rainy, .snowy])
    let jsonEncoder = JSONEncoder()
    let jsonData = try! jsonEncoder.encode(forecast)
    let jsonString = String(data: jsonData, encoding: .utf8)
    print(jsonString ?? "unwap json")

    /// {"weeks":["sunny","sunny","cloudy","rainy","snowy"],"dateString":"2017-06-08 15:11:21 +0000"}
```
JavaScriptのObject.〇〇()を理解する

## Object.keys()ってなんね

そのままだけど、Objectに格納されているkeyを取り出してくれる

```js
const obj = {
  name: "aaa",
  age: 23,
  gender: "F",
  key: "value",
};

Object.keys(obj); // => ["name", "age", "gender", "key"]
```

## Object.assign(第1引数, 第2引数)ってなんね

状態を持たないオブジェクトに対してassign()を用いることで第1, 第2引数を入れる

```
Object.assign(第1引数, 第2引数)
------ ------
|       |_____ 被らなかったら追加、被った場合は上書き
|_ 状態持たない

※assign()の第1引数でnullが入る場合がある際は空のオブジェクト {} を定義しないとエラーになる

```