OmniAICreator/Qiita-1.07M huggingface dataset:
異なるドメインへACLを保持したデータ移行方法

Windows Server 2008 R2のAD環境からWindows Server 2012 R2のAD環境へ、以下の要件のデータ移行を行う機会がありましたので、その手法をメモしておきます。

# 要件
####[要件1] ユーザ、グループを異なるドメインへ移行する。
####[要件2] ファイルやディレクトリを異なるドメインへ移行する。
####[要件3] 移行するファイルやディレクトリのACLは保持する。

#制約
####[制約1] 異なるドメイン間で信頼関係を結ぶことはできない。
####[制約2] 移行するデータはNAS(LinuxのSambaベース)で中継する。

#実現手順概要
異なるドメインへのデータ移行ではActive Directory 移行ツール(ADMT)を使用する方法が王道だと思いますが、異なるドメイン間で信頼関係を結ぶことができないという制約があり、ADMTは断念しました。
ADMTを使わずに、かつLinuxベースのNASを中継するため、要件3の実現にはACLの設定時にSIDの変換が必要になります。

+ (手順1) データ移行元のユーザ/グループのエクスポート
+ (手順2) データ移行先へユーザ/グループのインポート
+ (手順3) データ移行元のユーザ/グループのSID情報の取得
+ (手順4) データ移行先のユーザ/グループのSID情報の取得
+ (手順5) 手順3と手順4の成果物を利用して、同じユーザ/グループのSIDの変換テーブルの作成
+ (手順6) データ移行元のACL情報の取得
+ (手順7) 手順5と手順6の成果物を利用してACL情報の更新
+ (手順8) データ移行元からNASへのデータ移行
+ (手順9) NASからデータ移行先へのデータ移行
+ (手順10) 手順7の成果物を利用してACL情報の適用

#実現手順詳細
(手順1) 移行元ADサーバのコマンドプロンプトで以下のコマンドを実行します。
`> csvde -u -f user.csv -r objectCategory=user`
`> csvde -u -f group.csv -r objectCategory=group`

(手順2) 移行先ADサーバのコマンドプロンプトで以下のコマンドを実行します。
`> csvde -i -f user.csv`
`> csvde -i -f group.csv`

(手順3) 移行元ADサーバのコマンドプロンプトで以下のコマンドを実行します。
`> dsquery group | dsget group -dn -sid`
`> dsquery user | dsget user -dn -sid`

(手順4) 移行先ADサーバのコマンドプロンプトで以下のコマンドを実行します。
`> dsquery group | dsget group -dn -sid`
`> dsquery user | dsget user -dn -sid`

(手順5) 手順3と4の出力結果を元にSID変換テーブルを作成します。

|  ユーザ/グループ  |  移行元のSID  |  移行先のSID  |
| ---- | ---- | ---- |
|  CN=User_A,CN=Users,DC=Domain_A,DC=local  |  S-1-5-21-0123456789-0123456789-0123456789-1001  |  S-1-5-21-9876543210-9876543210-9876543210-1001  |
|  CN=User_B,CN=Users,DC=Domain_A,DC=local  |  S-1-5-21-0123456789-0123456789-0123456789-1002  |  S-1-5-21-9876543210-9876543210-9876543210-1002  |
|  CN=Group_A,CN=Users,DC=Domain_A,DC=local  |  S-1-5-21-0123456789-0123456789-0123456789-1501  |  S-1-5-21-9876543210-9876543210-9876543210-1501  |
|  CN=Group_B,CN=Users,DC=Domain_A,DC=local  |  S-1-5-21-0123456789-0123456789-0123456789-1502  |  S-1-5-21-9876543210-9876543210-9876543210-1502  |


(手順6) データ移行元サーバのコマンドプロンプトでACL情報の取得します。
`> cd <データ移行元ディレクトリ>`
`> icacls * /t /save <任意のディレクトリ>\acl.txt`

(手順7) 手順5と手順6の成果物を利用してACL情報の更新
acl.txtをコピーしacl_new.txtを作成します。
acl_new.txtをメモ帳で開き、手順5の変換テーブルに沿ってSIDを置換していきます。

| 置換前のSID  |  置換後のSID  |
| ---- | ---- |
| S-1-5-21-0123456789-0123456789-0123456789-1001  |  S-1-5-21-9876543210-9876543210-9876543210-1001  |
| S-1-5-21-0123456789-0123456789-0123456789-1002  |  S-1-5-21-9876543210-9876543210-9876543210-1002  |
| S-1-5-21-0123456789-0123456789-0123456789-1501  |  S-1-5-21-9876543210-9876543210-9876543210-1501  |
| S-1-5-21-0123456789-0123456789-0123456789-1502  |  S-1-5-21-9876543210-9876543210-9876543210-1502  |


(手順8) データ移行元のコマンドプロンプトで以下のコマンドを実行します。
`> robocopy \\<NASのIP>\共有フォルダ <移行元ディレクトリ> /mir /DCOPY:T`

(手順9) データ移行先のコマンドプロンプトで以下のコマンドを実行します。
`> robocopy \\<NASのIP>\共有フォルダ <移行元ディレクトリ> /mir /DCOPY:T`

(手順10) データ移行先のコマンドプロンプトで以下のコマンドを実行します。
手順7で作成したacl_new.txtをデータ移行先サーバの任意のディレクトリへ配置します。

`> cd <データ移行先ディレクトリ>`
`> icacls . /restore <任意のディレクトリ>\acl_new.txt`


なお、手順9でのデータ移行時に、robocopyコマンドを実行したユーザのデフォルトのACLが付与されるため、厳密に移行前と同じACLにはなりません。
今回のケースでは手順9の移行時に付与されたデフォルトのACLはそのまま付与して問題ないためそのままにしていますが、それが許容されないケースでは、icaclsコマンド等でACLの削除が必要になります。
Goのkickstartツールってないんです？作ってみました。

Goのkickstartツールってないんでしょうか？

ないみたいなので作ってみました。
といっても単純なものです。

# install

```bash
go get -u github.com/gokickstart/gokick
```

# 使いかた

```bash
gokick start github.com/m0a-mystudy/GAE-Chat github.com/m0a/sample
```


# やってること

以下の手順を自動化しただけです

1. ファイルのコピー ``github.com/m0a-mystudy/GAE-Chat`` => ``github.com/m0a/sample``
2. 内容の変更  ``github.com/m0a-mystudy/GAE-Chat`` => ``github.com/m0a/sample``
3. 内容の変更2 ``GAE-Chat`` => ``sample``
4. 内容の変更3 ``gae-chat`` => ``sample``
5. ファイル名の変更  ``GAE-Chat`` => ``sample``
6. ファイル名の変更  ``gae-chat`` => ``sample``


Goファイルとか関係なしに行っています。


## 利点

Makefileとかつかっていても内容をあわせて変えてくれます。
Yoとかと違ってtemplate自体がコンパイル可能なパッケージになります。

## 問題点
予期せぬ変更が行われる可能性があります。.gitも纏めてコピーするのでdiffがわかると思います。
適当にrevertすればいいかと。

## templateリポジトリ

``gokick list`` で ``github.com/gokickstart/templates`` の一覧を表示します。

```
gokick start goa-appengine m0a/someproject 
```
は

```
gokick start github.com/gokickstart/templates/goa-appengine github.com/m0a/someproject 
```

の省略形です。

``github.com/gokickstart/templates`` が充実すれば幸せになる気がします。
webpackでcoffeescript2を使おう(vueもあるよ)

とうとう待望のcoffeescript2が正式にリリースされました。
早速使ってみましょう。

## coffeescript2のインストール

普通にインストールすればいいです。

```shell-session
$ yarn add -D coffeescript
```

注意点としては2.0になった段階で`coffee-script`から`coffeescript`に名前が変わったことです。

`coffee-script`を既にインストールしていた場合は削除しておきましょう。

```shell-session
$ yarn remove coffee-script
```

coffee-loaderも0.8.0からcoffeescript2に対応しているので、すでに入っている場合はupgradeします。

```shell-session
$ yarn upgrade coffee-loader
```

なければインストール

```shell-session
$ yarn add -D coffee-loader
```


## babelのインストール

coffeescriptをupgradeするだけならこれで終わりなのですが、coffeescript2はes2015にコンパイルされるため、古いブラウザで動かすためにはbabel等で更にコンパイルする必要があります。

babelをインストールしましょう。
おそらくこれが最小構成です。

```shell-session
$ yarn add -D babel-core babel-loader babel-preset-es2015
```

`.babelrc`をプロジェクトのルートディレクトリに置きます。

```json:.babelrc
{
  "presets": ["es2015"]
}
```

webpackを書き換えて、babelを通してあげます。

```coffee:webpack.config.coffee
      {
        test: /\.coffee$/
        loader: 'babel-loader!coffee-loader'
      }
```

以上で終了！
おめでとう。

## vue-loaderの設定

ここから先はvue-loaderを使う場合だけの設定です。

webpack.configのvue-loaderの部分を書き換えてあげます。

```coffeescript:webpack.config.coffee
      {
        test: /\.vue$/
        loader: 'vue-loader'
        options:
          loaders:
            coffee: 'babel-loader!coffee-loader'
      }
```

上記の設定の場合vueファイルのlangを省略せずに書く必要があります。
(langはsublimeなどでハイライトするのに有用な情報なので省略しないのが吉)

```html:hoge.vue
<!-- langを省略しない -->
<script lang="coffee">
module.exports = {
  name: 'Hoge'
}
</script>
```

これでちゃんとコンパイルされるはずです。
お疲れ様でした！
【GoogleAppsScript】スプレッドシート操作(セルデータの取得偏)

Google Apps Script からスプレッドシートを操作する方法です。

#スプレッドシートの中の特定のシートを取得する

```js
var spreadsheet = SpreadsheetApp.openById('id');
var sheet = spreadsheet.getSheetByName('sheet_name');
```

`SpreadsheetApp.openById('id')`の`id`は、スプレッドシートのURL`https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit`の`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`の部分になります。
`openByUrl(url)`を使用すること、urlを使用してスプレッドシートを取得することもできます。
参考：[SpreadsheetApp](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app)


`getSheetByName('sheet_name')`の`sheet_name`は、取得したいシートの名前を指定します。
参考：[Spreadsheet](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet)

#シート内のすべてのセルのデータを取得する

```js
var data = sheet.getDataRange().getValues();
```

※`sheet`は「スプレッドシートの中の特定のシートを取得する」で取得したものです。
`getDataRange()`を使用することでデータが存在する範囲すべてにアクセスができ、その返り値の`Range`オブジェクトに対して`getValues()`を使用することで、二次元配列でシート内のデータを取得できます。

###(データが存在する範囲の中で)最も左上のセルの値を取得する
```js
var data = sheet.getDataRange().getValue();
```
`getValues()`の代わりに、`getValue()`を用いることで、最も左上のセルの値を取得できます。
参考：[Spreadsheet](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet), [Range](https://developers.google.com/apps-script/reference/spreadsheet/range)


#指定した範囲のセルの値を取得する
```js
var data = sheet.getRange("A1:B2").getValues();
```
`getRange`でアクセスする範囲を指定することができます。
上記の方法で、A1からB2までの範囲のデータすべてを取得することができます。
また、こちらでも`getValue()`を用いることで、A1からB2までの範囲のなかで最も左上のセルの値を取得できうます。
参考：[Spreadsheet](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet), [Range](https://developers.google.com/apps-script/reference/spreadsheet/range)
[Swift] UserDefaults に画像を保存するとフリーズした

##リリース後のアプリに、フリーズしたり落ちたりする現象が起きる

インストール直後はサクサクと動いているけど、しばらく使っているうちにフリーズし始めるようでした。画面遷移後や、他のアプリから戻ってきたタイミング、画像を保存するタイミングでフリーズすることが時々あり、その頻度は高まっていきます。すると、アプリを閉じることもできず何もできない、というひどい状況に･･･。そしてしばらく待つと落ちます。

常に同じタイミングでフリーズするという訳でもないので、原因を掴むのに時間を要してしまいました。


##解決策
色々と試した結果、以下を変更したことでフリーズすることはなくなりました。

####（変更前）UIImage を UserDefaults に保存
UserDefaults に３種類の型（String型、Int型、データ型にキャストした UIImage）が混在した Any 型の配列を、配列に入れて保存していました。

```swift
var menuArray = [[Any]]()
let img = UIImage(named: "example")!
let menu = ["menuA", 3, ["menuA", 3, UIImagePNGRepresentation(img)! as NSData] as [Any]
menuArray.append(menu)

let ud = UserDefaults.standard
ud.set(menuArray, forKey: "menuArray")
```

####（変更後）UIImage を DocumentsDirectory に保存

UIImage を DocumentsDirectory に保存して、そのファイル名のみを UserDefaults へ保存しました。さらに、Any 型の配列をやめて、辞書型に変更しました。

```swift

// ファイルを保存するURLを返す
func getDocumentsDirectory() -> URL {
  let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
  let documentsDirectory = paths[0]
  return documentsDirectory
}

// ファイルに画像を保存する
func saveImageToDocumentsDirectory(image: UIImage, name: String) {
  if let data = UIImagePNGRepresentation(image) {
      let filename = getDocumentsDirectory().appendingPathComponent(name)
      try? data.write(to: filename)
  }
}

let img = UIImage(named: "example")!
saveImageToDocumentsDirectory(image: img, name: "menuImageX.png")

var menuList = [[String: String]]()
var menu = ["name": "menuA", "point": "3", "fileName": "menuImageX.png"
]
menuList.append(menu)
```

## 結論
保存する画像枚数は、インストール時は10枚程度から始まり、ユーザーが保存すると何枚でも保存できます。ただ、アプリの内容からして、大体のユーザーは50枚以内に収まると思います。どの程度からフリーズしやすくなるかは分かりませんが、30枚程度でもフリーズしていたので、画像を UserDefaults に保存することは避けた方が良さそうです。



####（参考）
- [iOSアプリのファイル保存について](http://qiita.com/nnsnodnb/items/13642c4a8d55641f893e)

- [How to save a UIImage to a file using UIImagePNGRepresentation](https://www.hackingwithswift.com/example-code/media/how-to-save-a-uiimage-to-a-file-using-uiimagepngrepresentation)
 

- [Apple 公式リファレンス FileManager](https://developer.apple.com/documentation/foundation/filemanager)


- [[Swift3.0] パスとファイルURLの違いと相互変換の方法](http://joyplot.com/documents/2016/11/03/swift-fileurl-path/)

- [意外にパワフル！？NSUserDefaultsの書き込み、読み込み速度について](https://qiita.com/yuky_az/items/13dfc156db118db04f17)
[OSX][Swift]ウィンドウがアクティブかを判定する方法

ウィンドウが画面のトップにあるかを判定する方法。


参考コード

```example.swift
    public func isWindowActive() -> Bool {
        //ウィンドウ群を配列にて取得する
        let windows: NSArray = NSApplication.shared().windows as NSArray
        //サンプルのため、0番目のウィンドウを判定
        let window: NSWindow = windows.firstObject as! NSWindow

        return window.isKeyWindow  // true : トップにある, false : トップでない
    }

```


### 備考

画面が複数ある場合は「NSApplication.shared().windows」の中身を取り出した上でisKeyWindowプロパティを参照する。
Elixir プロジェクトを Docker 化して Heroku の worker として動かす

Heroku では昔ながらの git リポジトリ push でのデプロイの他に，Docker を利用した [Container Registry](https://devcenter.heroku.com/articles/container-registry-and-runtime) でデプロイが行える．

また， Heroku では HTTP リクエストを受けてレスポンスを返す Web dyno の他に，バックグラウンドで動く [Worker Dyno](https://devcenter.heroku.com/articles/background-jobs-queueing) を作ることができる．

今回， Elixir のアプリケーションを Docker コンテナに乗せて Heroku の worker として動かせるようにデプロイした．

Dockerfile は以下のとおり．気をつけるべきところにはコメントを入れた．

```Dockerfile
FROM elixir
MAINTAINER niku

# MIX_HOME は required ．こうしないと heroku に Deploy した後起動するときに，mix deps.get したはずのライブラリを見つけられない
# MIX_ENV は optional
# MIX_DEBUG は optional
ENV MIX_DEBUG=true \
    MIX_HOME=/root/.mix \
    MIX_ENV=prod

RUN mkdir /app
ADD . /app
WORKDIR /app

RUN mix local.hex --force && \
    mix deps.get && \
    mix compile

# https://devcenter.heroku.com/articles/container-registry-and-runtime#dockerfile-commands-and-runtime
# によると ENTRYPOINT も動作するので
# ENTRYPOINT ["mix"]
# CMD ["run", "--no-halt"]
# でも動くように思えるのだけど `run` command not found で動作しなかった．

# --no-halt を指定しないと起動直後にすぐ終了してしまう
CMD ["mix", "run", "--no-halt"]
```

と設定する．

Docker コンテナを worker として Heroku へデプロイするには

```console
% heroku container:push worker
```

というコマンドで行える．詳しくは [Pushing an image(s)](https://devcenter.heroku.com/articles/container-registry-and-runtime#pushing-an-image-s) に書いてある．

この組み合わせで [Eloido](https://github.com/niku/eloido) という Elixir 製 Bot アプリケーションを Heroku の worker として動かすことができた．

こんな感じ．

```console
% heroku ps
Free dyno hours quota remaining this month: 982h 50m (98%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== worker (Free): mix run --no-halt (1)
worker.1: up 2017/09/20 22:57:39 +0900 (~ 20h ago)
```

うまく動いている．
[Objective-C] クラスとインスタンス

Objective-Cを始めました。

クラスとインスタンスについて学んだことをまとめてみます。
まだ1週間しか経っていないので、間違い等あると思います。
ご指導の程よろしくお願いしますm(_ _)m

#まず基本

まず基本ですが、Objective-Cは以下の`import`文から始まります。

```
#import <Foundation/Foundation.h>
```

クラスや変数の宣言は、この下に書くか、.h(headerファイル)にまとめます。

#クラスの定義
```
@interface Dog : NSObject
{
@private
    int height;
    int weight;
}
@property int height, weight;
@end

@implementation Dog
@synthesize height, weight;
+(void)nakigoe
{
    NSLog(@"犬の鳴き声は一般的に「ワンワンです」");
}
@end
```

こんな感じで書きます。
変数を宣言する`interface文`と、メソッドを定義する`implementation文`の両方が必要です。
`@private`はカプセル化といい、これらのインスタンス変数へのアクセス権限を設定できます。
このようにカプセル化した変数はクラス外からアクセスできないため、アクセサメソッドというものを使って表示したり変更したりします。

#アクセサメソッド
```
-(int)getHeight
{
  return height;
}
-{int)getWeight
{
  return weight;
}
```
アクセサメソッドはこんな感じで書きますが、毎回これを書くのは冗長です。
`property`と`synthesize`という記述を使うことで、この記述を省略することができます。

#インスタンスメソッドを呼び出してみる
```
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Dog *dog_A = [[Dog alloc] init];
        
        [dog_A setHeight:100];
        [dog_A setWeight:500];
        
        NSLog(@"犬Aの高さは地面から%d、体重は%dです。",
              [dog_A height], [dog_A weight]);
        [Dog nakigoe];
    }
    return 0;
}

```
メソッドの呼び出しはこんな感じです！
メッセージ文というものを使って、実行します。
`[`レシーバ` メソッド名:引数]`という具合に書きます。

上のコードでは、`@property`で定義された4つのメソッドを呼び出しています。

`Dog *dog_A = [[Dog alloc] init];`
この記述で`Dog`のインスタンスを生成しています。
`alloc`はメモリ確保のメソッドらしいです。
`init`は初期化メソッドです。

`Dog *dog_A`
このアスタリスクがとても大事で、これはC言語のポインタという概念に通じるようです。
基本型と参照型というものがあるそうですが、今のところよくわかりません。

`main`関数、メモリ管理のための`@autorelesepool`、謎の`return 0`…………
この辺は意味不明ですね！ 今はそういうものだとしか分かりません。

#以上です！
もうちょっと色々あると思いますが、まとめきれそうにないので、いったん終わります。
Rubyからプログラミングを始めた自分としては、今まであまり意識せずにやってきたことが多いですが、Objective-Cではプログラミングの動く仕組みについて、さらなる理解が求められます。
時間はかかると思いますが、しっかりやっていこうと思います！
monorepo の ava で .babelrc の設定を共有する

`"babel": "inherit"` だと `packages/*/.babelrc` を置かないと見てくれなかったので、 明示的に 親の設定ファイルをextends する。

```package.json
  "ava": {
    "files": ["test/**/*.test.js"],
    "babel": {
      "extends": "../../.babelrc"
    },
    "require": ["babel-register"]
  },
```

```
$ ava

  1 passed
✨  Done in 1.74s.
```
Visual Stuio Code と Apache Cordova による爆速コーディング

## 自己紹介

* 氏名: 政倉 智 (まさくら とも)
* 所属: html5j 鹿児島
* 所属: codeArts 株式会社 (みんなゲーム遊んでね!)
* 趣味: バイクとか

----

## Cordova だるい!

----

1. HTML/CSS/JavaScript を書き換える
2. `cordova run` で実行する
3. 見て確認する

このビルドが意外と時間がかかる。だるい。

----

そんな人のために!

Visual Studio Code + Cordova Tools

----

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/036517b5-ee61-ac29-6220-4612db1d00eb.png)

https://marketplace.visualstudio.com/items?itemName=vsmobile.cordova-tools

----

* ブラウザーを使って Cordova をシミュレートしている
* ネイティブのビルドが走らない分すぐに起動する
* デバッガが使える!
* LiveReload も!
* Chrome DevTools を動かすと落ちるのはちょっと勘弁してほしい...

----

実はこのシミュレーター部分、単体でも配布されてます!

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/8df34057-c9f5-c933-a6fb-f69794cb177c.png)

https://github.com/Microsoft/cordova-simulate

----

* プラグインのシミュレートをそこそこしてくれる
* 自作プラグインでも、追加のコード書けばやってくれるらしい

----

本物とはそれなりに違うんだろうけど

手早くできてイイ!

----

ご清聴ありがとうございました!
NativeScriptでScrollViewのスクロールの速度を遅くする

# 概要

スクロールを伴うアプリはたいていListViewでやっちゃう事が多いと思うのですが、独自の巨大なコンテンツをスクロールさせたい時にはScrollViewを使うと思います。
で、わざわざScrollViewを使うからには、あまりヒュンヒュン慣性スクロールして欲しくない場合もありますね。

対応策として、独自にUIScrollViewなりScrollViewなりを拡張してカスタムすればいいんですけど、そこまでするほど暇じゃないって方向けの方法をご紹介しようと思います。

# Android

Javaはオブジェクト指向の模範生みたいな言語であると思いますが、さりげなくその概念をぶっ壊すリフレクションという仕組みが用意されています。
今回はこれを使います。

例として、

```xml
<ScrollView id="scrollView" orientation="horizontal"　～略～>
～略～
</ScrollView>
```

みたいにScrollViewが定義されてたとします。
orientationがhorizontalなので、実体はAndroidのHorizontalScrollViewとなります。
verticalを指定した場合はVerticalScrollViewになるのは火を見るより明らかで眩しいでしょう。

Androidはオープンソースという開発者がフライング感謝するようなプラットフォームなので、ソースを眺めていると、ScrollViewのスクロール量などを制御しているのは、OverScrollerというクラスなのがわかります。
このOverScrollerのインスタンスでsetFriction()メソッドの引数に大きな値を与えるほどスクロールがとろくさくなります。

んでは、さっそくリフレクションでいじりましょう。

```ts
let scrollView = page.getViewById('scrollView');
let ScrollViewClass = android.widget.HorizontalScrollView.class;
let scrollerField = ScrollViewClass.getDeclaredField('mScroller');
scrollerField.setAccessible(true);
let scroller: android.widget.OverScroller = scrollerField.get(scrollView.android);
scroller.setFriction(android.view.ViewConfiguration.getScrollFriction() * 3);
```

1行目でいじりたいScrollViewを取ってきます。
2行目では、いじりたいScrollViewの実体クラス、今回のケースではHorizontalScrollViewをいったん変数に入れています。
3行目からさっそく激しくリフレクるのですが、privateなインスタンス変数mScroller(OverScrollerクラス)を操作できるインスタンスをとってきてます。
4行目で、これからこのprivateな変数を丸裸にするぞと宣言します。Java環境によっては、そんな横暴は許されないといって落ちるのですが、Androidでは大丈夫でした。
5行目でやっとOverScrollerのインスタンスをゲットします。
6行目で目的のsetFrictionをやっているわけですね。今回は通常の3倍遅くしています。逆シャアです。

この方法ではmScrollerという変数名とOverScrollerというクラスを決めうちなので、将来的に使えなくなるかもしれません。
その時は、またAndroidのソースをなめ回して、SDKバージョンによって処理を分岐させれば良いと思います。

# iOS

iOSはUIScrollViewに専用のプロパティがあるので、それを使えば良いです。

```ts
let scrollView = page.getViewById('scrollView');
(<UIScrollView>scrollView.ios).decelerationRate = UIScrollViewDecelerationRateFast;
```
無駄にカッコいいプレゼン資料が作れる「マジックムーブ」の使い方

Keynoteでプレゼンするときのスライドで
ここぞってときに使うとめっちゃカッコいい **マジックムーブ** のご紹介
![keynote](https://qiita-image-store.s3.amazonaws.com/0/7132/7588d997-2d86-f59b-7e32-440d9b87bf5c.png)

## マジックムーブとは
```
「マジックムーブ」トランジションを追加すると、プレゼンテーションを再生するときに、あるスライド上の位置から次のスライド上の新しい位置へオブジェクトが動くエフェクトが作成されます。

https://support.apple.com/kb/PH16959?locale=ja_JP&viewlocale=ja_JP
```

簡単にいうと前後のスライドを自動で良い感じに繋げてくれる賢いやつ。
たとえば、

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/7132/9ae2aefd-193a-3b71-79f2-8821d484b9eb.gif)

![sample2.gif](https://qiita-image-store.s3.amazonaws.com/0/7132/646e8a15-d505-54c7-8fda-70217f00d46a.gif)

こんなのが簡単に作れたりする。
スライド間の共通部分を見つけ出しアニメーションで繋いでくれるエフェクト

## 使い方

スライド前とスライド後の２つのスライドを用意します。
![前](https://qiita-image-store.s3.amazonaws.com/0/7132/62642f1f-bdbd-7e3b-b6d2-3c6aef7e7df7.png)
![後](https://qiita-image-store.s3.amazonaws.com/0/7132/bb014880-2723-35ed-88c1-11e1537e68d4.png)

右上のアニメーションタブから、ページのトランジションの設定を**マジックムーブ**に変更するだけ。
![スクリーンショット 2017-09-21 19.01.28.png](https://qiita-image-store.s3.amazonaws.com/0/7132/3258ab31-cc54-7c81-8467-eb2f3745adbe.png)

たったこれだけ！

同じオブジェクト使う必要があるため、うまくいかないときは、１枚目のスライドからオブジェクトを２枚目にコピーするとうまくいきます。

２つ目のサンプルみたいにしたい場合は**マッチ**の部分を**単語ごと**、**文字ごと**に変更するとできます。
（ただし単語ごとは日本語じゃ動かない・・・）


## おわり
アニメーション後の位置とか調整するの面倒だけど、アニメーション前とアニメーション後のスライドを別に用意しておけば
こいつが勝手にやってくれるから、
単純にスライドインさせたいだけのエフェクトにも使えて超便利。

ただし、計算が重くページ切り替えに数秒待たされる場合がかかるときがあるので注意！
プレゼンするときは、１拍分くらいタイミング早めにスライドさせると丁度良い

あまりオブジェクトが沢山あるページにマジックムーブは使わないほうが吉.
Python で Domo のデータセットを削除する

データセットの作成方法は、こちら
[Python で Domo のデータセットを作成する](https://qiita.com/ekzemplaro/items/5b772b95e120e1e6dd3c)

ここで、表示された　dataset_id を使えば、作成されたデータセットを削除できます。

```py3
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	main_delete_dataset.py
#
#					Sep/21/2017
#
# ------------------------------------------------------------------
import	sys
import	requests
#
from get_access_token import get_access_token_proc
from delete_dataset import delete_dataset_proc
from domo_config import domo_config_proc
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
config = domo_config_proc()
access_token = get_access_token_proc(config)
#
dataset_id="4e7a793f-21d1-4afb-8d87-915267f7cf8g"
#
json_str = delete_dataset_proc(access_token,dataset_id)
#
print(json_str)
#
sys.stderr.write("*** 終了 ***\n")
#
# ------------------------------------------------------------------
```

```py3:delete_dataset.py
# -*- coding: utf-8 -*-
#
#	delete_dataset.py
#
#					Sep/21/2017
#
# ------------------------------------------------------------------
import	sys
import	requests
#
# ------------------------------------------------------------------
def delete_dataset_proc(access_token,dataset_id):
	sys.stderr.write("*** delete_dataset_proc *** start ***\n")
	headers = {"Authorization": "Bearer " + access_token
		}
	params = {
		"includeHeader": "true",
		}
#
	url_datasets="https://api.domo.com/v1/datasets/" + dataset_id
#
	try:
		rr=requests.delete(url_datasets,params=params,headers=headers)
		print(rr.status_code)
	except Exception as ee:
		sys.stderr.write(str(ee) + "\n")
#
	sys.stderr.write("*** delete_dataset_proc *** end ***\n")
#
	return rr.text
# ------------------------------------------------------------------
```

API の仕様はこちら
[Delete a DataSet](https://developer.domo.com/docs/dataset-api-reference/dataset#Delete%20a%20DataSet)
リポジトリが大きすぎて落ちてこないときの対処法（自分用）

# 経緯

Gitのリポジトリが巨大すぎてcloneが終わりませんでした。
多分これから先もう一回ぐらいはこういった事にぶち当たりそうなので自分用に対処法を残しておきます。

## 対処法

ソースツリーでは実行中の状態が見られませんし、たぶんエラー吐いて終了します。（以前経験あり）
コマンドライン上でクローンしてみたところ

```
remote: Counting objects: 74152, done.
remote: Compressing objects: 100% (36905/36905), done.
ceiving objects:   4% (2981/74152), 780.00 KiB | 76.00 KiB/s 
```

電波のアレもあるんでしょうが５分経って４％しか進みませんでした。
さすがに一時間以上も待ってられません。
(ちなみに私はこのタイミングで [Ctr] + [C] を押しました。)

そこで```--depth```オプションを使います。

**最初はdepth 1 で落とす。**
```$ git clone --depth 1 https://hogehoge.com/fuga.git```
すると

```
remote: Counting objects: 8791, done.
remote: Compressing objects: 100% (6122/6122), done.
remote: Total 8791 (delta 3110), reused 7578 (delta 2347)
Receiving objects: 100% (8791/8791), 59.64 MiB | 911.00 KiB/s, done.
Resolving deltas: 100% (3110/3110), done.
Checking out files: 100% (10687/10687), done.
```

リポジトリにもよりますがオブジェクトの数が8分の１くらいになりました。
これでも結構時間かかってしまったのですが終わらないことはなかったです。

**あとはひたすら差分を取る。**

```
$ git fetch --depth 10
$ git fetch --depth 50 # ここの値は要調整。サイズにもよりますが50~100くらいが良いかと思います。
...
$ git fetch --unshallow # これで完全なリポジトリになる。
```

### 参考ページ
こちらの記事を参考にさせていただきました。
https://qiita.com/butchi_y/items/cc0fe50acc47c1e3ab32
ansible sshpass error


## 環境

* macOS Sierra
* brewでansibleをアップグレード（2.2.2.0 -> 2.3.2.0）

## 症状

brewでansibleをアップグレードした直後、sshpass errorが発生した。

* アップグレードの前

```sh
% ansible local -m ping
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

% ansible web1 -m ping
web1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

* アップグレードの後、localでは問題がなかったが、sshで接続するサーバーではsshpass errorが発生した。

```sh
% ansible local -m ping
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

% ansible web1 -m ping
web1 | FAILED! => {
    "failed": true,
    "msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"
}
```

## 対応

* エラーメッセージで言われた通りsshpassをインストールする。
* brewで設置しようとしたら、sshpassがない！

```sh
% brew info sshpass
Error: No available formula with the name "sshpass"
We won't add sshpass because it makes it too easy for novice SSH users to
ruin SSH's security.
```

* ググって見たら、brewでも設置する方法があった。

```sh
% brew install http://git.io/sshpass.rb
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
No changes to formulae.

######################################################################## 100.0%
==> Downloading http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz
==> Downloading from https://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/sshpass/1.05
==> make install
🍺  /usr/local/Cellar/sshpass/1.05: 9 files, 40.8KB, built in 12 seconds
```

* もう一度、試して見た。

```sh
% ansible web1 -m ping
web1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

解決！

よくわからないけど、ansibleがバージョンアップされてsshpassを使う方式になったみたい。

探して見たら、こんな記事があった。

* [Ansible 2.3.1 – sshpass Error](http://everythingshouldbevirtual.com/ansible-2-3-1-sshpass-error)
Python で Domo のデータセットを作成する

access_token の取得は
[Python で Domo の アクセストークンを取得する](https://qiita.com/ekzemplaro/items/91ddb8a19f3ec861666f)

実行すると、dataset_id が表示されます。これは、データの挿入、データセットの削除に使うので、控えておいて下さい。


```py3
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	main_create_dataset.py
#
#					Sep/21/2017
#
# ------------------------------------------------------------------
import	sys
import	requests
#
#
from get_access_token import get_access_token_proc
from create_dataset import create_dataset_proc
from domo_config import domo_config_proc
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
config = domo_config_proc()
access_token = get_access_token_proc(config)
#
file_json="schema.json"
json_str = create_dataset_proc(access_token,file_json)
print(json_str)
#
sys.stderr.write("*** 終了 ***\n")
#
# ------------------------------------------------------------------
```

```py3:create_dataset.py
# -*- coding: utf-8 -*-
#
#	create_dataset.py
#
#					Sep/21/2017
#
# ------------------------------------------------------------------
import	sys
import	requests
#
from file_io import file_to_str_proc
# ------------------------------------------------------------------
def create_dataset_proc(access_token,file_json):
	sys.stderr.write("*** create_dataset_proc *** start ***\n")
	headers = {"Authorization": "Bearer " + access_token,
			"Content-Type": "application/json",
			"Accept": "application/json"
		}
	params = {
		"includeHeader": "true",
		}
#
	url_datasets="https://api.domo.com/v1/datasets"
#
	json_str = file_to_str_proc(file_json)
#
	try:
		rr=requests.post(url_datasets,params=params,data=json_str,headers=headers)
		print(rr.status_code)
		sys.stderr.write(str(rr.status_code) + "\n")
	except Exception as ee:
		sys.stderr.write(str(ee) + "\n")
#
	sys.stderr.write("*** create_dataset_proc *** end ***\n")
#
	return rr.text
# ------------------------------------------------------------------
```

```py3:file_io.py
# -*- coding: utf-8 -*-
#
#	python_common/file_io.py
#
#					Jul/31/2017
#
#
import	sys
import	string
#
# --------------------------------------------------------------------
def	file_to_str_proc(file_in):
	str_out = ""
	try:
		fp_in = open(file_in,encoding='utf-8')
		str_out = fp_in.read()
		fp_in.close()
	except Exception as ee:
		sys.stderr.write("*** error *** file_to_str_proc ***\n")
		sys.stderr.write(str (ee))
#
	return	str_out
# --------------------------------------------------------------------
```


```json:schema.json
{
  "name": "User_Datasets",
  "description": "Cities Sep/2017 PM 15:14",
  "rows": 0,
  "schema": {
    "columns": [
      {
        "type": "STRING",
        "name": "Id"
      },
      {
        "type": "STRING",
        "name": "City Name"
      },
      {
        "type": "LONG",
        "name": "Population"
      },
      {
        "type": "DATE",
        "name": "Date_mod"
      }
    ]
  }
}
```

API の仕様はこちら
[Create a DataSet](https://developer.domo.com/docs/dataset-api-reference/dataset#Create%20a%20DataSet)
AngularJSのBinding（=,<）の使い方について書いてみた

###バインディング
AngularJSのバインディングの種類は色々ありますが
今回はバインディングの基本である"=","<"について書いてみたいと思います。

###=について
"="はAngular1.5までの特徴である「双方向バインディング」を実現してくれます。
以下のコードはコントローラーからコンポーネントに値を渡してコンポーネントで渡された値を変更しています。

```equalController.js
this.variable1 = "hogehoge";
this.variable2 = "hogehoge";
```

```equalController.html
<equal-component param1="this.variable1" param2="this.variable2"></equal-component>
-------------------------------
コントローラー{{this.variable1}}
コントローラー{{this.variable2}}
```

```equalComponent.js
angular.module('myApp')
  .component('equalComponent', equalComponent);

class equalComponentClass {
  constructor() {
    this.param2 = "fugafuga" //ここでコントローラーから渡された値を変更
  }
}

equalComponentClass.$inject = [];

var equalComponent = {
  controller: equalComponentClass,
  templateUrl: 'component/equalComponent.html',
  binding: {
    param1: '=', //bindingの種類を指定
    param2: '=' //bindingの種類を指定
  }
}
```

```equalComponent.html
コンポーネント{{this.param1}}
コンポーネント{{this.param2}}
```

上記のようなコードを実装し、コントローラー側のhtmlを表示すると

```html
コンポーネントhogehoge
コンポーネントfugafuga
-------------------------------
コントローラーhogehoge
コントローラーfugafuga
```

このようにコンポーネントにコントローラーの値が渡され
コントローラーにコンポーネントで変更された値が反映されています。

###<について
"<"は双方向バインディングではなく、片方向バインディング（親→子）となります。
考え方は"="とほとんど同じ考え方で、呼び出し元から呼び出し先の一方向しか値の変更をしないです。

"<"があるなら呼び出し先から呼び出し元の">"もあるのではないかと思いますが、調べて見た所
サポートされていなかったので注意が必要です。（私は今まで使おうとした場面に遭遇した事はないです。）
Echo で net/http/pprof をマウントする

echo は DefaultServeMux を使っていないので手動でマウントする必要がある。

echo には echo.WrapHandler や echo.WrapMiddleware という便利なヘルパ関数が用意されてるのでそれを使えばいい。

```go
package main

import (
	"net/http"
	"net/http/pprof"

	"github.com/labstack/echo"
)

func main() {
	e := echo.New()

	pprofGroup := e.Group("/debug/pprof")
	pprofGroup.Any("/cmdline", echo.WrapHandler(http.HandlerFunc(pprof.Cmdline)))
	pprofGroup.Any("/profile", echo.WrapHandler(http.HandlerFunc(pprof.Profile)))
	pprofGroup.Any("/symbol", echo.WrapHandler(http.HandlerFunc(pprof.Symbol)))
	pprofGroup.Any("/trace", echo.WrapHandler(http.HandlerFunc(pprof.Trace)))
	pprofGroup.Any("/*", echo.WrapHandler(http.HandlerFunc(pprof.Index)))

	e.Start(":8080")
}
```

goroutine や heap などの Profile の取得は Index ハンドラに含まれているのでワイルドカードで流し込んでしまう。
phpspreadsheetでエクセル出力が動かない

#環境
centos7 php7.1 phpspreadsheetの環境
フォルダ構成
/var/www/html
　・info.php
/var/www/vendor
　・phpspreadsheetの中身
Webからの起動
http://ＩＰアドレス/info.php
/var/www/html/info.phpの内容
<?php
        require '../vendor/autoload.php';
        use PhpOffice/PhpSpreadsheet/Settings;
        use PhpOffice/PhpSpreadsheet/Reader/Xlsx as XlsxReader;
        use PhpOffice/PhpSpreadsheet/Writer/Xlsx as XlsxWriter;
        use PhpOffice/PhpSpreadsheet/Writer/Csv as CSVWriter;
        //include("/home/asdis/html/index.php")
        //include("/home/asdis/html/spdinfo.php")
        phpinfo();
?>
上記の処理でphpの表示画面が出ない
 require '../vendor/autoload.php';･････これはＯＫ
 use PhpOffice/PhpSpreadsheet/Settings;･････これがタメ？？
ここでのエクセル出力等を参考にしているのですが、どこかおかしい所はありますでしょうか
宜しくお願いします
Laravelでbootstrap4をwebpackでまとめる


bootstarp4では[Tether](http://tether.io/overview/repositioning/)を使っており、以下のようなエラーが出る。

```js
Uncaught Error: Bootstrap tooltips require Tether
```

## Tetherをnpmでインストール
```bash
$ npm install tether -S
```

## webpack.mix.jsを修正
以下を追加する。

```js:webpack.mix.js
/**
 * Add tether for bootstrap4
 */
mix.autoload({
    tether: ['Tether', 'window.Tether']
});
```

結果、webpack.mix.jsはこんな感じに


```js:webpack.mix.js
const { mix } = require('laravel-mix');

/**
 * Add tether for bootstrap4
 */
mix.autoload({
    tether: ['Tether', 'window.Tether']
});

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.react('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css')
   .version();

```


GitHubのissueではjqueryも読み込ませてますが、とりあえずこれがなくてもコンソールエラーは起きませんでした。もしかしたら必要なのかもしれません・・・
https://github.com/JeffreyWay/laravel-mix/issues/584#issuecomment-287445207
端末の Vim でも挿入モードで縦棒カーソルを使いたい

Neovim が端末版でも GUI 版と同様に挿入モード時にカーソルを|（縦棒）にしてくれるのが良いなぁというツイートをしたら Vim でのやり方を教えていただいたのでメモ．

![tmp.gif](https://qiita-image-store.s3.amazonaws.com/0/625/09db8bef-ad1a-bc3d-96cf-6736d5d56ce3.gif)


https://twitter.com/satoh_fumiyasu/status/910554613044015104

下記の設定を vimrc に書けばOK．

```vim
if has('vim_starting')
    " 挿入モード時に非点滅の縦棒タイプのカーソル
    let &t_SI .= "\e[6 q"
    " ノーマルモード時に非点滅のブロックタイプのカーソル
    let &t_EI .= "\e[2 q"
    " 置換モード時に非点滅の下線タイプのカーソル
    let &t_SR .= "\e[4 q"
endif
```

[Neovim は DECSCUSR を使ってカーソルの形状を変えている](https://github.com/neovim/neovim/issues/2583)ようなので，その制御シーケンスを使う．

Vim には `t_` で始まる名前の端末オプションがあって，その中に挿入モード開始時のオプション `t_SI` と終了時のオプション `t_EI`，置換モード開始時のオプション `t_SR`（それぞれ多分 Start Insert と End Insert, Start Replace の略）があるので，そこでカーソルの形を変えるシーケンスを追加する．

上記設定以外にも点滅させたり（`\e[1 q`, `\e[5 q`, `\e[3 q`）もできる．

手元のターミナル (iTerm2 と Terminal.app) でしか確認していないけれど，DECSCUSR をサポートしている端末では動くはず．
【FileMaker】経過年月日を求める

どの言語でもそうですが、日付計算は頭を使うことが多く、一回共通でスクリプトを書いたら、二度とそのスクリプトの中身を思い出せなかったりします。
また、練習問題で日付計算をたくさんやった、という方もいらっしゃるかもしれないですね。

そして、今回も「生後」を求める計算を実装したので、覚え書きとして記事にしておきます。

要は、開始と終了の「月」と「日」に注目する、ということです。
開始年月日の月日よりも終了年月日の月日が後の月（例：開始月8月、終了月9月）だった場合や、開始日が終了日よりも後の日（例：開始日10日、終了日1日）をスクリプトに重点的に組み込むのです。

# サンプル
いくつかの経過年月日のサンプルを以下に示します。
※from日付：開始年月日、to日付：終了年月日です。

|月条件|日条件|結果|
|:-----------------|:-----------------|:-----------------|
| from月 > to月|from日 > to日 | <img width="233" alt="filemaker_ymd1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/5ff7258c-fa94-21c5-3010-ece2c300fb25.png"> |
|from月 > to月|from日 < to日|<img width="243" alt="filemaker_ymd5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/c9463256-30cc-f53d-78ef-c6d8732e2cf4.png">|
|from月 < to月|from日 < to日|<img width="243" alt="filemaker_ymd2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/40a2b9ce-0b67-1055-74e1-3a6626794bec.png">|
|from月 < to月|from日 > to日|<img width="255" alt="filemaker_ymd6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/bb86e1c7-f640-8900-a6f2-4f006132abee.png">|
|from月 = to月|from日 < to日|<img width="236" alt="filemaker_ymd7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/e2880941-1dc2-af10-8a0a-8cf4742d0dbc.png">|

今回のサンプルでは、from日付当日は含んでいません。
もし、from当日も含む場合（9/10〜9/11を２日間と計算する場合）は、この経過年月日の日付に1日追加すればいいことになります。
また、from日付とto日付が反対に入っていた場合などのチェックは、フィールドのチェックかスクリプトなどで入れると、さらに確実になります。

# 計算式
計算式は、次のようになります。
<img width="985" alt="filemaker_ymd8.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/2937d45d-191e-75e2-fda4-cb0f714aaef9.png">

（１）年数、月数、日数を求める準備
月数と日数の場合、先に示したように、fromの方が値が大きかった場合は、意図的に-1（前月）をしてそれぞれの計算で月数を調整します。

（２）fromからtoまでの月数を求め、年数と月数を求める
月数を求める時は、（１）で出した調整分を加味します。

（３）年月よりも多かった分の日数を求める
to日付からfrom日付を引くのですが、そのまま引くと年月も含めた日数になってしまうので、引かれる側をto日付の年月に合わせて（日は、from日付のまま）減算をします。
この時も、（１）で求めた日の調整分を加味し、from日付の月 > to日付の月という場合には前月からの日数にして計算をします。

# 実装場所
今回は、テーブルの「経過年月日」という計算フィールドに実装しました。
共通部品として切り出す場合は、カスタム関数にすると便利です。


# まとめ
経過年月日は、他にも計算方法があると思いますが、今回の計算方法は、割と紙とペンで計算する方法に近いものになっています。
一つの方法として、その他のやり方も探して実装し、どれが効率的か、どれがメンテナンスが楽か、などを見極めて本番へ持っていってくださいね。
MacでESP32の開発環境をセットアップする（ESP-IDF編）

#はじめに
秋月電子のESP32開発ボード（ESP32-DevKitC）の開発環境をMacにセットアップする方法です。
基本的にはオフィシャルドキュメントどおりではあるのですが、パスが違ったりするので改めてまとめてみます。

#環境
* macOS Sierra 10.12.6

##開発ボード
このエントリーではESP32-DevKitCをそのまま使用する前提で記述しています。
http://akizukidenshi.com/catalog/g/gM-11819/

#1. Toolchainのセットアップ
##必要なツールのセットアップ
```sh
sudo easy_install pip
sudo pip install pyserial
```
##最新のバイナリをダウンロード
ここからダウンロード（2017/09/21現在）して、~/espフォルダに展開
https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-73-ge28a011-5.2.0.tar.gz

```sh
mkdir -p ~/esp
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-73-ge28a011-5.2.0.tar.gz
```
##パスを通す
以下のパスをbash_profileに記述（ESP-IDFのパスも先にセットしておきます）。

```bash:~/.bash_profile
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
export IDF_PATH=$HOME/esp/esp-idf
```

#2. ESP-IDFのセットアップ
##Gitから最新版を取得
```sh
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
```
※ 少し時間がかかります。

##サンプルで動作確認
Hello Worldのサンプルを動かして確認します。
###ソースのコピー
```sh
cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .
```
###ポートを設定
事前にポート名を調べておきます。秋月電子の開発ボードの場合はおそらく `/dev/tty.SLAB_USBtoUART` のはずですが、他のボード等の場合は `ls /dev/tty*` で調べておきます。

```sh
cd ~/esp/hello_world
make menuconfig
```
![project-configuration.png](https://qiita-image-store.s3.amazonaws.com/0/192936/07a9c843-05c1-b255-53a6-c18726ae147f.png)
こんなメニューが立ち上がるはずですので、以下の手順で `/dev/tty.SLAB_USBtoUART` を設定します。

Serial flasher config > Default serial port

これでターミナルでの開発ができるようになりました。

#参考
* http://espressif.com/en/products/hardware/esp32-devkitc/overview
* https://esp-idf.readthedocs.io/en/latest/get-started/macos-setup.html
オフラインリアルタイムどう書くF06の問題

問題はこちら->http://nabetani.sakura.ne.jp/hena/ordf06numit/

prologで解いてみました。
簡易的にリストでツリーを作りました。
やはり大きい数ではスタックオーバーフローしました。

```prolog
tree(Data,[]):-Data=<0,!.
tree(Data,List):-DL is floor(Data/2-10), DR is floor(Data*2/3),
                   tree(DL,L),tree(DR,R),List=[L,Data,R].

counter([],_,0):-!.
counter([L,D,R],N,C):-counter(L,N,C1),counter(R,N,C2),
                    C3 is C1+C2,(D==N->C is C3+1;C=C3).

solve(T,C,N):-tree(T,L),counter(L,C,N).

go([]):-!.
go([A,B,C,D|T]):-solve(B,C,N),write(A),write("->"),write(N),
               (N==D,Str=" ok";Str=" no"),write(" "),write(Str),write("\n"),go(T).

ston([],[]):-!.
ston([H|T],L):-ston(T,L1),number_string(N,H),L=[N|L1].

begin:-str(S),split_string(S,"\s,\n","\s",L),ston(L,L1),go(L1).

str("0       123,4   5
1       1,1     1
2       2,1     1
3       3,3     1
4       19,5    1
5       69,5    3
6       88,9    2
7       1,100   0
8       100,4   4
9       101,9   0
10      456,7   7
11      567,8   12
12      756,10  10
13      789,10  12
14      896,29  2
15      7764,6  664
23      592741,216      55"):-true.
```
2017.9.22追加

解を求めるだけならツリーを作らなくてもよいので、
時間はかかってもout of stackはなさそうですが、
prologらしさもでませんね。

```prolog
tree(D,_):-D=<0,!.
tree(D,N):-(D==N->(cou(C),C1 is C+1,assert(cou(C1)),retract(cou(C)));true),
             DL is floor(D/2-10), DR is floor(D*2/3),
                   tree(DL,N),tree(DR,N).

solve(D,N,C):-assert(cou(0)),tree(D,N),cou(C),retract(cou(C)).
```
2018.2.17追加
別のページ->https://qiita.com/drafts/f6747ae2001d8f39c05a/edit
で言及したメモ化プログラムです。
最初に普通の再帰(データベースは作らない）。

```prolog
tree(D,N,0):-D<N,!.
tree(D,N,1):-D==N,!.
tree(D,N,C):-
    DL is floor(D/2-10), DR is floor(D*2/3),tree(DL,N,CL),tree(DR,N,CR),
    C is CL+CR.

solve(D,N,C):-tree(D,N,C).

go([]):-!.
go([A,B,C,D|T]):-solve(B,C,N),write(A),write("->"),write(N),
               (N==D,Str=" ok";Str=" no"),write(" "),write(Str),write("\n"),go(T),!.

ston([],[]):-!.
ston([H|T],L):-ston(T,L1),number_string(N,H),L=[N|L1].

begin:-str(S),split_string(S,"\s,\n","\s",L),ston(L,L1),go(L1).
```
次にメモ化プログラム

```prolog
tree(D,N,_,0):-D<N,!.
tree(D,N,_,1):-D==N,!.
tree(D,N,F,C):-arg(D,F,V),
    (var(V)->(DL is floor(D/2-10), DR is floor(D*2/3),tree(DL,N,F,CL),tree(DR,N,F,CR),
    C is CL+CR,arg(D,F,C));C=V).

solve(D,N,C):-functor(F,x,D),tree(D,N,F,C).

go([]):-!.
go([A,B,C,D|T]):-solve(B,C,N),write(A),write("->"),write(N),
               (N==D,Str=" ok";Str=" no"),write(" "),write(Str),write("\n"),go(T).

ston([],[]):-!.
ston([H|T],L):-ston(T,L1),number_string(N,H),L=[N|L1].

begin:-str(S),split_string(S,"\s,\n","\s",L),ston(L,L1),go(L1).

str("0       123,4   5
1       1,1     1
2       2,1     1
3       3,3     1
4       19,5    1
5       69,5    3
6       88,9    2
7       1,100   0
8       100,4   4
9       101,9   0
10      456,7   7
11      567,8   12
12      756,10  10
13      789,10  12
14      896,29  2
15      7764,6  664
23      592741,216      55
24      913826,584      81
25      1234567,89      2293
26      10000000,1      19383507
27      12345678,9      3567354
28      6215879,358     2907
29      12345678,90     79419
30      5745432,1032    1287"):-true.
```
rbenvでruby2.4.2をインストール

# 作業環境
Mac OS X 10.11.6
ruby2.4.1 -> 2.4.2にします。

```zsh
$ rbenv version
2.4.1
```

# インストール手順

```zsh
$ rbenv install 2.4.2
ruby-build: definition not found: 2.4.2

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:

  brew update && brew upgrade ruby-build
```

2.4.2が見つからなかったので、homebrewのアップデートとかしていく。
（まあ、書いてある通りに実行すればOK。）

```zsh
# homebrewのアップデート
$ brew update
# ruby-buildのアップグレード
$ brew upgrade ruby-build
# rbenvで2.4.2をインストール
$ rbenv install 2.4.2
# rbenvで2.4.2を指定
$ rbenv global 2.4.2
```

以上。
[CakePHP] ローカル環境を作る

## 概要
MAMPを使ってローカル環境を作る際にCakePHPをインストール方法です。

## 1.PHPのバージョンをMAMPに合わせる
デフォルトではMacのPHPのバージョンを参照します。
ローカルにCakeを入れ、MAMPで環境を作る場合はMAMPのPHPのバージョンに合わせます。

### 現状の確認

#### バージョン
まずは現状の確認をします。
```
$ php -v
```

#### パス
現在の参照パスを確認します。
下記のコマンドを実行して「/usr/bin/php」と返ってきたら、場所をMAMPに合わせます。

```
$ which php
```

### 場所の変更
下記のコマンドを実行します。
```
$ vim ~/.bash_profile
```
下記の行を追記し、PHPの参照先をMAMPに変更します。
```
export PATH=/Applications/MAMP/bin/php/php7.1.1/bin:$PATH
```

### パスの変更の確認
ファイルをリロードします。
```
$ source ~/.bash_profile
```

PHPの場所を確認します。
```
$ which php
```




## 2.Composerのインストール

### 確認
すでにインストールされていないかの確認します

```
$ composer -V
```

### インストールと場所の変更
ファイルをダウンロードしインストールします。
次に格納先を変更します。

```
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
```
### インストールの確認
インストールが完了したか確認します。
```
$ composer -V
```

## 3.CakePHPのインストール

### ディレクトリの移動
MAMPのhtdocsにインストールしますので、ここに移動します。
```
$ cd /Applications/MAMP/htdocs
```

### 名前をつけてインストール
プロジェクトの名称をつけてインストールします。
```
$ composer create-project --prefer-dist cakephp/app プロジェクトの名称
```
インストールに時間がかかります。
[Y,n]?とでたらYを選択します。



## おそらく役立つ情報 
痒いところに手が届くかもしれない記事を書いています。
フォローしてくれるとやる気になります！

- Qiita　プログラミングに関する情報はこちら
http://qiita.com/nadonado


- Twitter　日々のつぶやきはこちら
https://twitter.com/hironado
iOS11で Grouped UITableView のセクションヘッダーに余分な高さが出る問題について

## これはなに

- ~~iOS10までは tableView の Header や Footer の高さを無くすために、0.1 や `CGFloat.leastNormalMagnitude` を `tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat` に返していました`~~
- ~~しかし、iOS11になるとそれでは高さが無くならないケースが出て困った~~
- **こちらはtableViewのセクションヘッダーやフッターの高さを無くす方法が変わったのではなく、下記の条件が組み合わさると起きるバグでした。** :bow:
  - `estimatedSectionHeaderHeight` が-1（おそらく、UITableViewAutomaticDimension）になっている
  - `tableView.tableHeaderView = UIView()` など tableHeaderView に何かViewを設定している

　自分のプロダクトでは、状態によって `tableView.tableHeaderView` が変更される画面だったため、ある状態のときに `tableView.tableHeaderView = UIView()` をして、tableHeaderViewに空のViewを設定しておりました。

## OSごとのデフォルト値の違い

- https://dev.classmethod.jp/smartphone/iphone/xcode-9-uitableview-self-sizing-by-default/

> Xcode 9（iOS 11 SDK）でUITableViewのSelf-Sizing（Auto Layoutによる高さの自動調整）がデフォルトになりました。

　したがって、それぞれのデフォルト値がiOS11で下記のように変更されています。

|| コード (iOS10/iOS11) | Interface Builder |
|---|:---:|:---:|
| estimatedSectionHeaderHeight | （0/**-1**） | 0 |
| estimatedSectionFooterHeight | （0/**-1**） | 0 |

　iOS10とiOS11で、estimatedSectionHeader（Footer）Heightのデフォルト値が違います。

　これにより、iOS10では無効であった、見積もりの高さがiOS11だと有効になることで今回のような余分な高さが、UITableViewに加算されて表示されてしまいます。 

## どうすればいいのか

- コードからUITableViewをAutoLayoutで組む場合、見積もりの高さが必要ない場合は、 `tableView.estimatedSectionHeaderHeight` や `tableView.estimatedSectionFooterHeight` に明示的に 0 を設定して見積もりを無効にしておく

## スクショで比較

before | after
|:--:|:--:|
<img width="375" alt="Image uploaded from iOS.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/37385/4f3b2ac3-af93-22de-9dba-ce964bba0212.jpeg"> | <img width="375" alt="Image uploaded from iOS.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/37385/95e62f5a-be44-aa9d-ef2b-28e4ca30f8fc.jpeg">

## 参考資料
- http://devhy.com/2017/06/07/23-iOS11-and-xcode9-adapt/
- https://qiita.com/usagimaru/items/9e821ec0c3d9028f8527
OSSのSIEMを調べてみた

#SIEM is 何？
Security Information and Event Managementの略で、わかりやすくいうと、ネットワークデバイスや、サーバの吐き出す各種のログを一元管理して、脅威を把握する製品で[IBM](https://www-01.ibm.com/marketing/iwm/dre/signup?source=mrs-form-3108&S_PKG=ov26882)とかのベンダーが、販売しています。
AIを使っている？[Cylance](https://www.cylance.com/ja_jp/home.html)を触ってみたいな・・・
##何でOSSで探してるの？
個人でOracle使おうとか私はあまり思わないけど、MySQLならちょっと触ってみようかなと思うこともあるから。
ちなみにDBは苦手です。
そのうち個人で運用している環境もOSSのSIEMで見てみようと思っています。
#ググってみた
SIEM OSSとかでググったら、FutureSIEMと、AlienVault OSSIMを見つけましたが、FutureSIEMの内容がよくわからず、[AlienVault OSSIM](https://www.alienvault.com/products/ossim)について検証していこうと思います。

投稿数分後追記
[Splunk](https://www.splunk.com/en_us/resources/video.ltc2VpbzpiffiI6q6mOCggCf7sYASHMt.html)を書き忘れていました。

他にお薦め等ありましたらご教示くださいmm
備忘録：CentOS7 最初にやること

# 概要

毎回忘れるので、備忘録として残しています。

# タイムゾーン変更

今のタイムゾーンを確認

```
$ sudo timedatectl

      Local time: Fri 2017-09-15 09:12:41 UTC
  Universal time: Fri 2017-09-15 09:12:41 UTC
        RTC time: Fri 2017-09-15 09:12:40
       Time zone: UTC (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

タイムゾーンを日本に変更

```
$ sudo timedatectl set-timezone Asia/Tokyo
```

再度タイムゾーンを確認

```
$ sudo timedatectl

      Local time: Fri 2017-09-15 18:12:55 JST
  Universal time: Fri 2017-09-15 09:12:55 UTC
        RTC time: Fri 2017-09-15 09:12:54
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

# ロケールを変更

今のロケールを確認

```
$ sudo localectl

   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
```

ロケールをja_JP.utf8に変更

```
$ sudo localectl set-locale LANG=ja_JP.utf8
```

再度ロケールの確認

```
$ sudo localectl

   System Locale: LANG=ja_JP.utf8
       VC Keymap: us
      X11 Layout: us
```

# SELinuxを無効にする

SELinuxの確認

```
$ getenforce

Enforcing
```

viで設定ファイルを開く

```
$ sudo vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

SELINUX=disabled に変更する

```
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled  # ← disabled に変更
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

サーバーを再起動する

```
$ sudo reboot
```

SELinuxが無効になったことを確認

```
$ getenforce

Disabled
```

以上
【Ruby】変数の復習編

#概要
Rubyまわりの復習のため、下記Rubyプログラムを実行した際、コンソールに表示される内容を予測する。

```
def rename(name)
  name = "#{name}エンジニア"
  
  return name
end

name = "Samurai"
rename(name)
puts name
```

#予測
先述のRubyプログラムを実行すると・・・

```
Samuraiエンジニア
```
上記のような結果が返ってくる。

#結果
```
Samurai
```
Rubyプログラムを実行したところ上記のような結果が返ってきた。

#理由
```
def rename(name)
  name = "#{name}エンジニア"
  
  return name
end
```
上記でrenameメソッドを定義している。rename(name)とあるので「nameという変数を用いてrenameというメソッドを実行せよ」という内容になる。

#なぜ“Samuraiエンジニア”ではなく“Samurai”と表示されたのか
ポイントは変数の種類、そして変数のスコープという考え方である。

スコープとは、変数を参照できる有効範囲のこと。スコープの範囲外からはその変数を見ることが出来ないため、参照しようと思っても出来ないのだ。

スコープは変数の種類ごとに異なる。

- グローバル変数・・・スコープはプロジェクト全体。<b>例）$global</b>
- インスタンス変数・・・スコープはインスタンス内。同一オブジェクトであればずっとデータを保持し続けることができる。<b>例）@name</b>
- クラス変数・・・スコープはクラス内。同一クラスのオブジェクト内であればOK。思わぬ上書きが発生する可能性あり。<b>例）@@name</b>
- ローカル変数・・・スコープはその変数が定義されたメソッド内。狭い。<b>例）name</b>

さて、ここで問題になっているプログラムを見てみると・・・

```
def rename(name)
  name = "#{name}エンジニア"
  
  return name
end

name = "Samurai"
rename(name)
puts name
```

ここで登場する<b>name</b>はローカル変数、つまりスコープは定義されたメソッド内である。

メソッド<b>rename(name)</b>の中で<b>name= "#{name}エンジニア"</b>と定義されてはいるものの、この<b>name</b>はメソッド内でしか参照されない。

よって、後半部分の・・・

```
name = "Samurai"
rename(name)
puts name
```
上記における<b>rename(name)</b>は出力結果に一切影響を及ぼさない。

結果は非常にシンプルで、<b>puts name</b>によって<b>name = "Samurai"</b>が呼び出されるだけなのである。

#補足
ちなみに、当初の私の予想通り<b>Samuraiエンジニア</b>と表示させたい場合、下記のようにプログラムを書き換えればOKである。

```
def rename(name)
  name = "#{name}エンジニア"
  
  return name
end

name = "Samurai"
name = rename(name)
puts name
```