OmniAICreator/Qiita-1.07M huggingface dataset:
Python2.7で class C: と class C(object): の違いに大ハマりした話

# 旧スタイルのクラス定義というものを知っていますか

Python2 系では、`class C:` と `class C(object):` が異なる挙動をするということを知らずに、大ハマりしました。

参考:
- https://docs.python.jp/2.7/reference/datamodel.html#new-style-and-classic-classes
- https://stackoverflow.com/questions/4015417/python-class-inherits-object

## 旧スタイルのクラスの違い
```class C:``` や ```class C():``` のように、object からの継承を省略すると、Python 2.1 以前と互換の旧スタイルのクラスとなります。

```python
>>> class OldStyle:
...   pass
... 
>>> old = OldStyle()
>>> type(old)
<type 'instance'>
>>> dir(old)
['__doc__', '__module__']
```

```python
>>> class NewStyle(object):
...   pass
... 
>>> new = NewStyle()
>>> type(new)
<class '__main__.NewStyle'>
>>> dir(new)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
```

旧形式は instance 型、新形式は、object から派生する class 階層下という違いなのですが、私がハマったのは、旧形式では、さりげなくデコレータが動かないこと。

## @property の setter が動かない
```python
class NewStyleClass(object):
  def __init__(self):
    self._v = 0

  @property
  def v(self):
    print "get"
    return self._v

  @v.setter
  def v(self, value):
    print "set"
    self._v = value

class OldStyleClass:
  def __init__(self):
    self._v = 0

  @property
  def v(self):
    print "get"
    return self._v

  @v.setter
  def v(self, value):
    print "set"
    self._v = value
```
```python
>>> new = NewStyleClass()
>>> new.v
get
0
>>> new.v = 100
set
>>> new.v
get
100
>>> old = OldStyleClass()
>>> old.v
get
0
>>> old.v = 100 # ← setter が呼ばれていない
>>> old.v       # ← 上書きされて getter が行方不明に
100
```

中途半端に getter が動いている分、たちが悪いです。。。

## Python3 では新形式に統一
Python3 では、両方の書き方で新形式の振る舞いになりますので、安心です。

しかし、それ故に、Python3 向けのコードでは `class C:` 形式で書かれているため、望ましい書き方はそっちなのかと勘違いし、Python 2.7 向けのコードをリファクタリングして動かなくなるという悲劇が。

# 結論
Python2.7 では class を書くときには object を明示的に継承しましょう。
変数名を変数にする方法 - Javascript

# 結論

```js

var associativeArray = {};
var collect_variable = "変数の名前"
associativeArray[""+collect_variable] = "valuae";

/*
*
*
*
*/
console.log( associativeArray[""+collect_variable] ); 

```

# 検証

[paiza.ioで実行](https://paiza.io/projects/APUH_H8N_vAthTDRzcpLcQ?locale=en-us)

```js 
process.stdin.resume();
process.stdin.setEncoding('utf8');

var associativeArray = {}; //オブジェクトを用意
var collect_variable = "変数名です" //変数名にしたい変数を""の中に定義
var dummy_variable = "ダミー" //変数名が変数であることを証明するためのダミー（意味はない）

associativeArray[""+collect_variable] = "valuae"; //作った変数（ここでは[変数名です]という文字列が変数名になる）を変数名として、変数にvaluaeという値を代入

console.log("変数の値を出力");
console.log( associativeArray[""+collect_variable] ); //変数の値を出力、valueと出力される
//console.log( associativeArray["変数名です"] ); でも同じ結果が得られる

console.log("変数名が変数であることの証明");
console.log( associativeArray[""+dummy_variable] ); //ダミーなんて変数名はないので、undefinedと出力される
```

# swiftで書き換えると

Swiftだったらディクショナリーを使って、こう書きます

```swift

//: Playground - noun: a place where people can play

import UIKit

var dictionary: Dictionary<String, Any> = [:]
let collect_variable = "変数名です" //変数名にしたい変数を""の中に定義
let dummy_variable = "ダミー"
dictionary[collect_variable] = "valuae"; //作った変数（ここでは[変数名です]という文字列が変数名になる）を変数名として、変数にvaluaeという値を代入

print(dictionary[collect_variable]!) //変数の値を出力、valueと出力される
//print(dictionary["変数名です"]!) でも同じ結果が得られる

print(dictionary[dummy_variable]!) //ダミーなんて変数名はないので、ここでエラーになる
//Fatal error: Unexpectedly found nil while unwrapping an Optional value

```

# 参考

[How to do associative array/hashing in JavaScript
](https://stackoverflow.com/questions/1208222/how-to-do-associative-array-hashing-in-javascript)[【JavaScript】連想配列のkeyとvalueの取得](https://qiita.com/glaytomohiko/items/852ea64bcfc1e4fc1b51)
秋月電子の BLE モジュール AE-TYBLE16 を Hack

秋月電子の「太陽誘電　小型ＢＬＥモジュール基板」AE-TYBLE16
![IMG_20180208_235137.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/ad8bb459-c283-35fb-1c46-fc7559c70e3b.jpeg)

このモジュールは太陽誘電の EYSGJNAWY-WX を搭載している。

https://www.yuden.co.jp/jp/solutions/ble/product/
EYSGJNAWY-WX はマイコンとシリアルでつながって BLE通信 が行える。

しかしながらこれに搭載しているNordic nRF51822 はCortex-M0のARMコアであり、これを再プログラムして自分のアプリを実行できる。


# 書き換えたら技適ってどうなるの?

技適はファームウェア込で取得されるので、ファームを変更すると新たに技適を取り直す必要がある。しかしながら例えばAPIを分離し、APIライブラリをコールして使うのであれば技適の範囲内になるように工夫することができる。その場合はAPIライブラリを呼ぶアプリ部分は書き換えてもOKになる。

検索すると

> 工事設計認証番号  001-Ａ05676 
> 工事設計認証を受けた特定無線設備の型式又は名称  ＥＹＳＧＪＮ 

とある。

EYSGJNはバリエーションがあり、ユーザーアプリを実行することのできるものがある。そのうち、WXのついていないEYSGJNZWYが、ハード的にEYSGJNAWY-WXと同じっぽい。

そして、EYSGJNZWYはユーザプログラムを書き込むことができる。となるとEYSGJNZWYはAPIライブラリのようなものが存在するのだろう。

そして、EYSGJNとして一括で技適を取得しているということはEYSGJNシリーズのハードウェア＋APIライブラリのようなものの組み合わせが技適の前提条件なのだろう。

とするとそのAPIライブラリのようなものを使う限りにおいては技適は再取得しなくてもいいということになる。


# 書き換えの方法は？

ここらへん、APIライブラリを使うSDKとか公開していないかな？

秋月電子のパッケージにはこんな紙がついている。

![IMG_20180209_003321.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/8725cd83-4d13-d610-37c8-3370788f954e.jpeg)


うーむ、ここにアクセスするとなにかわかるかも知れないけれど、それを元に開発してもQiitaに公開なんてできなくなりますね。

オープンソースハードウェアの開発などをするにはこの縛りは回避したいので、この方法は辿らずに、別のルートで攻める。

# オープンなやり方で

さて、似たモジュールとして台湾 RAYTAC の nRF52 を使ったシリーズがある。それを試した資料はここ。
「BLEモジュール MDBT42」 https://qiita.com/nanbuwks/items/d26447c0bfa28b1d05df

このやりかたが使えないかな？

# Softdevice

NordicのnRFシリーズには Softdevice というのがある。Softdevice は先のAPIライブラリのようなもので、それを使う上においては各種認証はキープされる。

MDBT42 も Softdevice を使う前提で、技適クリアしながらユーザアプリを作ることができる。先の「BLEモジュール MDBT42」も、 Softdevice を使ってArduino開発環境でアプリを開発するやり方。

さて、太陽誘電の EYSGCNZWY の APIライブラリ が Softdevice なのか、太陽誘電のオリジナルなのか？　もし Softdevice なら、MDBT42 と同じ方法が使えることになる。

調べてみると、digikey にあるデータシートに記述がありました。

https://www.yuden.co.jp/wireless_module/document/datareport2/jp/TY_BLE_EYSGJNAWY_WX_BriefDataReport_V1_3_20170925J.pdf


https://www.yuden.co.jp/wireless_module/document/datareport2/jp/TY_BLE_EYSGJNZ_DataReport_V1_8_20171215J.pdf

これらによると、やはり両方共Softdeviceを用いているようです。特に EYSGJNZWY は S120 V2.1.0 を使用していると明示してありました。



## Softdevice と アップデート

ただしSoftdeviceも随時アップデートされている。厳密に考えれば技適を取得したバージョンのSoftdeviceと1バイトでも異なれば技適が通らないのではないか？　という疑問があるが、実際にはこういったもののupdateは許容されているようだ。

## 実際の書き換え

このように、ピンを立ててみました。
![IMG_20180209_001010.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/4c02c3c0-da71-419c-8f53-07973cd4d5f9.jpeg)
ピンを立てたところは電源、GND,SWDI,SWDCとP004です。

「BLEモジュール MDBT42」 https://qiita.com/nanbuwks/items/d26447c0bfa28b1d05df
と同じように環境設定、配線をします。

以下のように設定をしました。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/b45646a2-4250-cc7d-f302-507d05103523.png)


Lチカのコード

```

void setup() {
  pinMode(4, OUTPUT);
}

void loop() {
  digitalWrite(4, HIGH);
  delay(1000);
  digitalWrite(4, LOW);
  delay(1000);
}
```
Lチカできました。

![IMG_20180209_002618.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/5e86bd98-0dbe-32ea-25c0-a855a10182ee.jpeg)
gitでPermisson Errorが出たので--localでname/emailを設定したのに改善しない場合の対応

# 環境

- Windows10
- SourceTree 2.3.1.0 / GitBash
- GitHub

# 発生した事象

1. GitHubで別アカウント管理してるリポジトリにPushしようとしたらPermission Error
2. エラーログには普段使っているアカウント名が表示されている
3. そういえば設定変更してなかったので、git config --localでアカウントを切り替えてPushしようとしたら再度Permission Errorが発生
4. エラーログには何故か切り替え前のアカウント名が表示されている
5. why?

# 原因と解決策

git-credential-helperが有効になっており、name/emailがWindowsの資格情報で管理されていた。
それによりhttpsでGitHubへアクセスした際に--localの設定を使うまえにhelperで切り替え前アカウントの情報が参照されていた模様。
下記の方法でhelperが使う内容を変更すれば解決した。

1. 「コントロールパネル」→「ユーザーアカウント」→「資格情報マネージャ」を選択する
2. 「汎用資格情報」部分の「git:https://github.com」を選択する
3. 「編集」リンクを押下して切り替え後アカウントの設定を入れる

# 雑記

そういえば、SourceTreeで最初にアクセスした時に認証ダイアログが出て入力したような気がするが、その時にhelper用のWindows資格情報が設定されていたのかな。
sedでキモオタ平野語録を生成する

```sh
yuis@DESKTOP-UHU8FSH:/mnt/c/ContaCam$ echo "かわいいなぁだいちくん" | sed -e "s/./\0゛/g"
か゛わ゛い゛い゛な゛ぁ゛だ゛い゛ち゛く゛ん゛
```
複数のgithubアカウントを使ってみたら、push時に403エラーになった(for mac)

いつもは使っていないアカウントでpushしたらこんなエラーがでた。

```
$ git push origin master
remote: Permission to user1/hogehoge.git denied to user2.
fatal: unable to access 'https://github.com/user1/hogehoge.git/': The requested URL returned error: 403
```
user1でpushしたいのにuser2になっている。。
configの見直しをしても全然だめだったが、キーチェーンアクセス設定を見直したら解決した。

### 不要アカウント情報を削除
アプリケーション => ユーティリティ => キーチェーンアクセスを起動
github.comの項目から user2 アカウントの情報を削除する。

ただ、この後pushするとまたuser2でキーチェーン管理されてしまうので
gitの設定をOFFにしておく。

### キーチェーンアクセスで管理しないようにgitの設定をOFF

```
git config --show-origin --get credential.helper
```

で返ってきた結果のパスに gitconfig があるのでそこに
helper = osxkeychain
って書いてあるから、これを消す！

### 注意事項
- Homebrew経由でインストールした場合のみ対象となります。<br>
- ファイル名が　/Applications/Xcode.app/Contents/Developer/usr/share/git-core/ の場合Xcode経由でインストールしています。この場合は直接ファイルがいじれないようです。<br>
[複数gitが存在する場合に優先順を変更する](https://qiita.com/kasyuu/items/8329c41dd35540ea3c1b)
- Windows環境の方はこちらが参考になるかも
[gitでPermisson Errorが出たので--localでname/emailを設定したのに改善しない場合の対応](https://qiita.com/FrozenVoice/items/6feefe50d24925be7738)

- その他動作への検証はしていませんので、自己責任でお願いします。

ただ、これやると毎回ID/PW求められるようになっちゃいますので要注意。
git pushで403のエラーが返ってくる問題

## はじめに
- gitのpush時のエラーに関してです。
- 自分はとある事情で二つ目のgithubアカウントを作成しました。
- そのアカウントでリモートリポジトリを作成後cloneしてきて`Initial commit`したあとにpushしようとしたら、、、まさかのエラーがでました。涙

```
remote: Permission to<username(new)>/<repositoryname>.git denied to <username(old)>.
fatal: unable to access 'https://github.com/<username(new)>/<repositoryname>.git/'
: The requested URL returned error: 403
```

- 上記のようなエラーです。
- 自分の考えとしては、ユーザ名とメールアドレスが間違っているのだと思いました。
- globalに設定しているものを見てしまっていて、権限がないのだと思いました。
- ですので、localの設定(`.git/config`)を変更してやろうと思いました。

```
git config --local user.name "username(new)"
git config --local user.email "email(new)"
```

- 失敗
- 次に調べるとどうやらグローバルの設定(`~/.gitconfig`)を見てしまっているような気がしました。
- しかし、グローバルの設定を設定し直しても変わりませんでした。。涙

## 解決方法
- 解決方法した方法は、リモートのURLにユーザ名を入れることです。
- 具体的にどういうことかというと
- 普通のリモートのURL

```
https://github.com/<username>/<repositoryname>.git
```

- ですが、これを変更します。

```
git remote set-url origin https://<username(new)>@github.com/<username(new)>/<repositoryname>.git
```

- 上記のような感じです。
- `github.com`の前に自分のユーザ名を入れて`@`で区切るといった感じです。
- こんなやり方があったんですね、、知らなかった
- これをやってからpushをすると、パスワードが求められます。
- 正常なパスワードを入力すると無事にpushができました！！！
ParcelでReasonMLを体験する

facebookが開発しているOCamlライクなAltJSである **ReasonML** という言語があります。
強力な型、イミュータブルを特徴としていて、堅牢なフロントエンドを書くときに良さそうです。

公式のチュートリアルがあるのですが、Node.jsでの動作が主軸で、フロントエンドの開発については詳しく触れられていません。
https://reasonml.github.io/docs/en/quickstart-javascript.html

ありがたいことにParcelがReasonMLに対応しているので、**設定ファイルなし**でReasonMLを体験できます！

## 動作確認環境

- OS: Archlinux
- Node.js: v8.9.4
- npm: v5.6.0

## インストール

適当なディレクトリを作成して、

- bs-platform(ReasonMLのビルドツール)
- parcel-bundler

をローカルにインストールします。

### bs-platform

```sh
$ mkdir parcel_reason 
$ cd parcel_reason
$ npm init -f
$ npm install bs-platform --save
```

### ReasonMLプロジェクトの初期化

bs-platformが用意しているbsbコマンドでReasonMLプロジェクトの初期化を行います。
（bsconfig.jsonの生成、package.jsonの生成、フォルダの作成など）

```sh
$ npx bsb -init . -theme basic-reason
```

### parcel

`bsb -init`によってpackage.jsonも初期化されてしまうので、このタイミングでParcelをインストールします。

```sh
$ npm install parcel-bundler --save
```
（各バージョンは2018年2月11日時点で、parce-bundlerが`1.5.1`、bs-platformが`2.1.0`でした）

## ソースコード

必要最低限のhtmlファイルを用意します。

```html:index.html
<!DOCTYPE html>
<html>
<head>
<script src="src/index.re">
</script>
</head>
<body>
</body>
</html>
```

srcディレクトリにReasonMLファイルを作成します。

```ocaml:src/index.re
Js.log("hello world!");
```
## 実行

Parcelを起動し、ブラウザで`localhost:1234`にアクセスして、デベロッパツールを開くとコンソールに`hello world!`が出力されています！

```sh
$ npx parcel
```

## アンインストール

npmでローカルにインストールしているので、フォルダごと削除すればアンインストールできます。

```sh
$ cd ../
$ rm -rf parce_reason
```

## ハマったこと

Parcel自体のバグではないのですが、テキストエディタのsafe-writeという機能で、HotModuleがうまく動作しませんでした。
下記に各エディタごとの対応方法が書いてあるので、必要に応じて設定すると良いと思います。
https://en.parceljs.org/hmr.html#safe-write
npm ライブラリを travis-ci でテストして Coveralls でカバレッジを計測する

[travis-ci](https://travis-ci.org/) と [Coveralls](https://coveralls.io) を使って自動テストとカバレッジの計測を行えるようにしてみた。
[starhoshi/rescue\-fire](https://github.com/starhoshi/rescue-fire) このレポジトリで実際に動かしている。

## Test

今回は yarn と jest を使う。

```
yarn run jest --coverage
```

このコマンドだけでテストとカバレッジの出力が同時にできて便利。

## [travis-ci](https://travis-ci.org/)

目的のレポジトリを ON にして

![スクリーンショット 2018-02-11 0.11.05.png](https://qiita-image-store.s3.amazonaws.com/0/5678/ec13ff62-30b0-a659-aa89-adf64169e87b.png)

`Build only if .travis.yml is preset` を ON。

![スクリーンショット 2018-02-10 21.35.30.png](https://qiita-image-store.s3.amazonaws.com/0/5678/b49f6d64-cc16-8ce7-0541-dd3f581cce76.png)

これで下準備は完了なので、レポジトリに `.travis.yml` を作る。

package.json と yarn.lock があると勝手に yarn install をしてくれる。`dist: trusty` にするとデフォルトで yarn が install 済みの Ubuntu を使えるっぽい。

```yaml
language: node_js
node_js:
  - node
dist: trusty
sudo: false
cache: yarn
script: yarn run jest --coverage
```

まずこれで travis-ci でテストが動かせるようになった。

* 参考
  * https://docs.travis-ci.com/user/languages/javascript-with-nodejs#Travis-CI-supports-yarn
  * [Travis CIでYarn\(pkg\)を使う設定 \(node\.js\) \- Qiita](https://qiita.com/noriaki/items/b83850358a747a01f68a)

## [Coveralls](https://coveralls.io)

travis と同様に、目的のレポジトリを ON にする。

![スクリーンショット 2018-02-11 0.24.18.png](https://qiita-image-store.s3.amazonaws.com/0/5678/c3488dab-e005-97b6-c471-4c2c88e6d18d.png)

travis でテストしたカバレッジ結果を Coveralls に投げる必要があるので、ライブラリを追加する。

```
yarn add --dev coveralls
```

最後にカバレッジ結果を投げるように .travis.yml を修正する。Token などは設定する必要がなく、勝手にやってくれるっぽい。

```yaml
script: yarn run test --coverage && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
```

これで travis, Coveralls の設定は終わり。

* 参考
    * [Jest \-\-coverage : help · Issue \#126 · nickmerwin/node\-coveralls](https://github.com/nickmerwin/node-coveralls/issues/126)

## おわり

上記の手順をした後に git push するとテストが回り、カバレッジが集計される。

travis, Coveralls それぞれのバッジも設定できるので、 README に貼っておくと見栄えが良い。

![スクリーンショット 2018-02-11 0.32.43.png](https://qiita-image-store.s3.amazonaws.com/0/5678/124135f3-d17c-303d-ed12-5b21c5b24c7a.png)
https://github.com/starhoshi/rescue-fire
flatpak on Ubuntu16

### What's the flatpak
アプリケーションのビルド／配布／インストール／実行を提供するフレームワーク
Flatpak is a technology for building, distributing, installing and running applications. It is primarily targeted at the Linux desktop, although it can also be used as the basis for application distribution in other contexts, such as embedded systems.

### How to Install
```bash
$ sudo add-apt-repository -y ppa:alexlarsson/flatpak
$ sudo apt update -y
$ sudo apt install -y flatpak
$ sudo apt install -y flatpak-builder
```

### Helloworld with flatpak
```bash
# add remote repository
$ flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# check repository and contents
$ flatpak remotes
$ flatpak remote-ls

# install the runtime and the SDK,
$ flatpak install flathub org.freedesktop.Platform//1.6 org.freedesktop.Sdk//1.6

# check runtime
$ flatpak list
Ref                                             Options       
org.freedesktop.Platform.VAAPI.Intel/x86_64/1.6 system,runtime
org.freedesktop.Platform.ffmpeg/x86_64/1.6      system,runtime
org.freedesktop.Platform/x86_64/1.6             system,runtime
org.freedesktop.Sdk/x86_64/1.6                  system,runtime

# create hello.sh
$ cat hello.sh
#!/bin/sh
echo "Hello world, from a sandbox"
sleep 30
echo "Goodbye, from a sandbox"

# add manifest which describes build information for app
$ cat org.flatpak.Hello.json 
{
    "app-id": "org.flatpak.Hello",
    "runtime": "org.freedesktop.Platform",
    "runtime-version": "1.6",
    "sdk": "org.freedesktop.Sdk",
    "command": "hello.sh",
    "modules": [
        {
            "name": "hello",
            "buildsystem": "simple",
            "build-commands": [
                "install -D hello.sh /app/bin/hello.sh"
            ],
            "sources": [
                {
                    "type": "file",
                    "path": "hello.sh"
                }
            ]
        }
    ]
}

$ ls
hello.sh*  org.flatpak.Hello.json

# build app with json configuration
$ flatpak-builder app-dir org.flatpak.Hello.json

# verify the build
$ flatpak-builder --run app-dir org.flatpak.Hello.json hello.sh

# commit the app in the repository(local at example)
# we need this before install and run application.
$ flatpak-builder --repo=repo --force-clean app-dir org.flatpak.Hello.json

# register local repository as tutorial-repo
$ flatpak --user remote-add --no-gpg-verify tutorial-repo repo

# install app from local repository
$ flatpak --user install tutorial-repo org.flatpak.Hello

# now we can run the app
$ flatpak run org.flatpak.Hello

```
### flatpak processes
flatpakでアプリ起動すると以下のプロセスが起動している。
```bash
/usr/lib/flatpak/flatpak-session-helper
/usr/lib/flatpak/xdg-document-portal
/usr/lib/flatpak/xdg-permission-store
/usr/lib/flatpak/flatpak-bwrap
/usr/lib/flatpak/flatpak-dbus-proxy
```
この辺のプロセスが担う役目はなんとなくわかるが、詳細はまた時間があるときに調べる。。。
https://github.com/flatpak/flatpak/wiki/Sandbox
この辺がドキュメントとしては良さそう。。

### Reference
[Welcome to Flatpak](http://docs.flatpak.org/en/latest/index.html)
[flatpak-docs](https://github.com/flatpak/flatpak-docs/blob/master/docs/index.rst)
iTerm2で現在の画面の状態を保存して起動時設定する

## はじめに
macの方はiterm2を使っている方は多いのではないでしょうか。
その中で、起動し直した時にタブの分割をするのは面倒ではないでしょうか。
タブの状態を保存して起動時にその保存した状態に自動でしてくれたら嬉しくないですか。
今回はその設定をする手順をメモしました。

## 現在の画面の状態を保存する
- `window`→`Save Window Arrangement`
- 名前を入力するように求められるので現在の状態の名前を付ける(適当でいい)

## 起動時設定する
- `Preferences`→`General`→`Startup`で`Open default Arrangement`を設定
- `Preferences`→`Arrangements`で、起動時設定したい`Arrangement`で`Set Default`を設定

以上で、画面の状態を保存して起動時設定できました。
参考になれば嬉しいです。
SwiftFormat に関するメモ

## swiftformatとは？
* 文字通り swift で書かれたコードのフォーマットを整えるためのツール。
* コードの書き方に対して自分流の儀式を頑なに持ち続ける人は相容れないかもしれない。あるいは統一の必要性を感じない人にも意味はなさそう。
* 整形対象は多岐に渡るので細かいカスタマイズが可能。
* 個人的には次のようなスタンスで利用している：
    * コーディングスタイルには興味がないが、統一することには興味がある。
    * スペース・改行・空行の付加／削除・{ } の形式・self の有無についてファイル間での違いがほとんどなくなるので、書き方のブレが大きい自分の場合は重宝している。
    * ``MARK: - XXXX`` の書き方を間違った場合も修正されるのがありがたい。

## 使い方
* 入手方法や詳細については開発者の [GitHub (nicklockwood/SwiftFormat)](https://github.com/nicklockwood/SwiftFormat) を参照。
* オプションや引数についての解説は避けるが、基本的には実行フォルダを指定するのみ。指定フォルダ下にある全ての .swift ファイルに対して実行される。
* Xcode では Build Phases に Run Script を足すなどして自動で実行するようにしておくと楽。
* 個人的には self. をつける/つけないで迷うことが多いので、コードを書くときはあえて self. をつけないようにしておいて、self. の付加は swiftformat に任せるという怠惰な使い方をしている。

## 使用例
私の現在のオプションは以下の通り：

```
swiftformat --elseposition next-line --comments ignore --self insert --trimwhitespace nonblank-lines --stripunusedargs closure-only --disable strongOutlets ${SRCROOT}
```
* --elseposition next-line : else の前で改行する。
* --comments ignore : コメント内の整形はしない（インデントがなくなるため）。
* --self insert : self. が必要な場所には追加する。
* --trimwhitespace nonblank-lines : 空行以外で不要なスペースを削除。
* --stripunusedargs closure-only : クロージャでのみ使用しない引数を _ に置き換える。
* --disable strongOutlets : @IBOutlet のあとの weak を削除しない。weak を削除するのはアップルの最近の方針らしいので保留した。
東大松尾研「Deep Learning基礎講座演習コンテンツ」自主学習方法メモ

[東京大学の松尾研究室が無料公開している「Deep Learning基礎講座演習コンテンツ」の自主学習方法](http://karaage.hatenadiary.jp/entry/2018/01/31/073000)

手元のPC with Ubuntu 16.04 LTS (+ GeForce 1080) で試した際のメモ。なお、私はnotebook内でやっていることの中身は基本的に一切理解してない。それらしい結果は出ているけど正確かは知らない。

 * Anaconda不使用
 * Ubuntu標準のPython 3.5
    * pyenv使ってやろうとしたら非本質的なところでハマりまくったので生
    * ~/tensorflow にvirtualenvを経由して環境を用意するというTensorflow公式のドキュメントに基づく
    * TensorFlowのドキュメント不親切だな色々。
 * tensorflow-gpu 1.5.0 で動作した模様。CUDAは9.1ではなく9.0
    * Docker不使用。生
 * tensorflowの他 numpy, pandas, scikit-learn, scikit-image, h5py等が必要
    * Anacondaならtensorflowを除けば多分全部入っている。5.0.1だとPython 3.6まわりで警告がでてる気がするけど。
    * h5pyはchap11でkerasのVGG16をダウンロードした後にはじめて問題になるので先に入れる。import文からは予想できない。
 * chap05 の tensorboard.py は自分でファイルを作らないとエラーになる
 * chap11 で日本語を図に載せる関係でTakaoPGothicの準備をする場所があるがUbuntu 16.04 LTSなら ``sudo apt install fonts-takao`` する方が良いと思う
 * リンク切れ画像が各所にある気がする

CPU版であれば、virtualenv作成後、以下を実行すれば、一通り演習を進められるはず

```shell-session
(tensorflow)$ pip install tensolflow numpy keras jupyter pandas scikit-learn scikit-image h5py 
```
Cordova環境の構築メモ

Cordovaを入れて動かせるように環境構築をします。
2018.02月に実施しました。

##①nodebrewの設定

nodebrew(ノードブリュー)とはnode.jsのバージョン管理ツールです。
https://github.com/hokaccha/nodebrew#install のページにある[Install]の項目を実施し、インストールします。

**nodebrewのインストール**
nodebrewをインストールします。

```terminal
$ curl -L git.io/nodebrew | perl - setup
```

##②node.jsの設定

node.jsをインストール、設定をしていきます。

https://github.com/hokaccha/nodebrew#install のページにある[Usage]の項目の箇所です。

**node.jsのインストール**
下の入力内容にある\<version>の箇所には自分が入れたいバージョンを指定します。
特に無ければ\"stable"としましょう。
>stable:安定板
>latest:最新版

```
$ nodebrew install-binary \<version>
```

**バージョン確認**

インストールされたバージョンを確認します。

```
$ nodebrew ls
```

**バージョン設定**
使用するバージョンを設定します。
\<version>にはバージョン確認で確認したバージョンから指定して下さい。

```
$ nodebrew use \<version>
```

**設定内容確認**
使用するバージョンが設定されているか確認します。

```
$ node -v
```

##③Cordovaのインストール
http://cordova.apache.org/docs/en/latest/guide/cli/index.html のページを参考にインストールします。

**Cordovaのインストール**
Cordovaをインストールします。

```
$ sudo npm install -g cordova
```

**バージョン確認**
インストールされたCordovaのバージョンを確認します。

```
$ cordova -version
```

とりあえずこれでCordovaを使用できるようになりました。
dein.vim 触ってみた

# NeoBundle からdein.vimへ移行してみた

Neobundleは今後はバグフィックスのみになるとのこと

https://github.com/Shougo/neobundle.vim

Note: Active developement on NeoBundle has stopped. The only future changes will be bug fixes.

Please see Dein.vim -- A faster, well-tested plugin manager for Vim and Neovim. It can do everything NeoBundle does, including asynchronous installs.

なので私も合わせて移行してみた、

READMEに記述されているが、

下記手順

vimファイルを格納先を作成する。

```bash
mkdir ~/.cache/dein
```

git hubからdein.vimを取得してくる。

install.shを取得

```
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
```

install.sh をパスを指定して実行

```
sh ./installer.sh ~/.cache/dein/
```

これで、.vimrcに記述する、vimshellが吐き出される、
パスはinstall.shを設定したものが出力される。

便利！

```bash
vi .vimrc
```

```vim
syntax on
colorscheme molokai
set tabstop=4
set shiftwidth=4
set encoding=utf-8
set incsearch
set ignorecase
set smartcase
set hlsearch
set backspace=indent,eol,start
" コピペさん
set clipboard=unnamed,autoselect

if &term =~ "xterm"
	let &t_SI .= "\e[?2004h"
	let &t_EI .= "\e[?2004l"
	let &pastetoggle = "\e[201~"

	function XTermPasteBegin(ret)
		set paste
		return a:ret
	endfunction
	inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif


"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/home/ami/.cache/dein//repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('/home/ami/.cache/dein/')
  call dein#begin('/home/ami/.cache/dein/')

  " Let dein manage dein
  " Required:
  call dein#add('/home/ami/.cache/dein//repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here:
  call dein#add('Shougo/neosnippet.vim')
  call dein#add('Shougo/neosnippet-snippets')
  call dein#add('tpope/vim-endwise')
  call dein#add('tomtom/tcomment_vim')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------

```

これでとりあえず、

Ruby でコーディングする時に、def とか入力すると自動で、 endが入力されたり、
自動でインデントがあったりと、便利である。
Cloud Functions for Firebase 覚書き

Cloud Functions for Firebase に関する個人的な/初歩的な備忘録です.

---

## ローカルでFunctionsのAPIをテストする

`$ firebase serve --only functions`でテスト用ローカルサーバが起動する.
`$ firebase serve --only functions,hosting`とすればHosting用のサーバも起動する.

- ローカルでのFunctionsのAPI呼び出しは手元の環境のNode.js上で実行されるため、実際にFirebase Functionsの本番環境で使用されているNode.jsとバージョンが異なる場合は微妙な相違に注意する必要がある. [*](#asyncawait%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84)
- `$ firebase serve`だとFunctionsのAPI呼び出しは本番環境のものが使用されることに注意

> 参考：

> - ローカルでの関数の実行  |  Firebase  
> https://firebase.google.com/docs/functions/local-emulator?hl=ja




## Hostingのドメイン上でFunctionsのAPIを呼ぶ

`firebase.json`の`rewrites`を書き換えることでFirebase Hosting上のページから同一ドメインのURLでFunctionsのAPIを呼べる.
例えば以下のようにすると`https://<Hostingのドメイン>/api/helloWorld`へのアクセスでFunctions側の関数`helloWorld`が呼ばれる.

```firebase.json
{
  "hosting": {
    ...
    "rewrites": [
      {"source": "/api/helloWorld", "function": "helloWorld"},
      ...
    ]
  },
  ...
}
```

`$ firebase serve --only functions,hosting`でローカルサーバを起動した際にも、ローカルのHosting用アドレス`http://localhost:5000/api/helloWorld`でFunctionsのAPIをテストできる.
HostingとFunctionsとで同一ドメインなためCORSの問題が発生しなくて済むことや、ローカルのテスト環境とデプロイした本番環境とで`/api/helloWorld`で共通してAPI用URLを呼べるため便利.

> 参考：

> - Firebase HostingとCloud Functionsの連携 ｜ Developers.IO  
> https://dev.classmethod.jp/cloud/firebase-hostingcloud-functions/


##async/awaitが使えない

今現在 (2018/02/10) Functionsで使われているNode.jsのバージョンが古いため、ピュアなJSのコードでは`async`や`await`が使えない. また`Object.values()`など他にも地味に使えないものがある.

これらの機能を使うには素直にトランスパイラを通す必要がでてくる.

> 参考：

> - functions-samples/es2017-transpile at master · firebase/functions-samples · GitHub  
> https://github.com/firebase/functions-samples/tree/master/es2017-transpile
作業効率を上げるかもしれない簡単スクリプトを見てほしい(AutoHotkey)

#作業効率を上げるかもしれない簡単スクリプトを見てほしい(AutoHotkey)
by neokix

ほとんどは以前Webで公開したものですが，あまりアクセスがないのでこちらでも公開することにしました．悲しいけれど役に立つ，そんなスクリプトたちです．

##全角殺し
全角で記入されてしまうキーボード上部の数字をNumpadに置き換えて，全部とにかく半角で入力されるようにするもの．

```autohotkey:killing_full_caps
1::Numpad1
2::Numpad2
3::Numpad3
4::Numpad4
5::Numpad5
6::Numpad6
7::Numpad7
8::Numpad8
9::Numpad9
0::Numpad0
\::NumpadSub
```

##ファーストスクロールベイビー
シフトを押しながらスクロールを回すと，10回分スクロールされるだけのスクリプト．しかし時々役に立つ．

```autohotkey:fast_scroll_baby
+WheelDown::
	Send, {WheelDown 10}
	return

+WheelUp::
	Send, {WheelUp 10}
	return
```

##一覧表示

AppsKeyを押すと展開中のプログラムをいっぺんに表示，続けて押すと順に選択していく．

```autohotkey:view_all
AppsKey::
	If (A_PriorKey = "AppsKey")
		{
		Send, {Right}
		}
	else
		{
		Send, #{Tab}
		}
	return
```

##登録YouTubeでBGM再生
あらかじめ登録したYouTubeのURLを流すだけのスクリプト．

```autohotkey:YouTube_jukebox
!Y:: ;Alt+Yで登録
	vyoutubeurl := clipboard
	IfNotInString, vyoutubeurl, youtu ;もしクリップボードにyoutuの文字列があれば
		{
		Msgbox,,お知らせ,登録作業を中断しました, 1
		}
	else,
		{
		Filedelete, youtubeurl.txt
		FileAppend,%vyoutubeurl%, youtubeurl.txt　;同じディレクトリ内にtext作成
		MsgBox,, ,%vyoutubeurl%を登録しました, 1 
		}
	return

!^Y::
runyoutube:
	vrunyoutube =
	FileReadLine, vrunyoutube, youtubeurl.txt, 1
	Run, %vrunyoutube%
	WinWait, ahk_class Chrome_WidgetWin_1
	sleep, 5000
	SoundSetWaveVolume, 0.2 ;音量の設定．お好みで解除されたし．
	WinMinimize, A
	return

```

##Wasdを十字キーに変えるスイッチ
Pauseを押すと，WasdモードのGuiが表示され，Wasdキーが十字キーにかわる．エクセル入力に便利かもしれない．もう一度押すと解除される．

```autohotkey:wasd_mode
Pause::
	IfWinNotExist, wasd_mode
		{
		Progress, b zh0 fs15 x300 y925 ctffffff cw123456, wasd_mode on!, , wasd_mode, Segoe UI Black
		}
	else
		{
		Progress, off
		}
	return

#IfWinExist, wasd_mode
	a::Left
	s::Down
	w::Up
	d::Right
#IfWinExist,
```
※Progressを使うものに修正しました．(2018年02月13日)

駄スクリプト失礼しました．
もしなにか改造とか面白いものが見つかったらぜひコメントでおしえてください．
皆さんのスクリプトももっと見てみたいです．

では．
Rubyでグラフを描画してみる

## はじめに
Rubyでグラフを描画してみたいと思い、gemを探したところ、[gruff](https://github.com/topfunky/gruff)を見つけた。
その使い方を自分のメモ程度ですが、まとめてみたいと思う。

## [gruff](https://github.com/topfunky/gruff)とは
Rmagickを利用したグラフ描画用のgemです。
最終的にグラフを画像ファイルとして出力される。

## [gruff](https://github.com/topfunky/gruff)を使ってみる
**gemをインストール**

```
gem install 'gruff'
```

**rubyファイルを作る**

```ruby:gruff-example.rb
require 'gruff'
g = Gruff::Line.new
g.title = "Gold Medal in Winter Olympics"
g.labels = { 0 => 'Nagano(98)',
             1 => 'Salt Lake City(02)',
             2 => 'Torino(06)',
             3 => 'Vancouver(10)',
             4 => 'Sochi(14)',
           }
g.data :Japan, [5, 0, 1, 0, 1]
g.data :USA, [6, 10, 9, 9, 9]
g.data :Germany, [12, 12, 11, 10, 8]
g.write('gruff-example.png')
```

**実行する**

```
ruby gruff-example.rb
```

**実行結果**
同一ディレクトリにpngファイルが生成される

![gruff-example.png](https://qiita-image-store.s3.amazonaws.com/0/181383/b1881587-66f0-43e1-c49a-ea76c911dcbe.png)

## メソッドの紹介

①　それぞれのグラフのデータ
　　これの数がグラフのデータの数になります。

```ruby:gruff-example.rb
#　色は、なしでも可

g.data :データ名, 数値の配列, 色  
```

②　marginを空けるなら

```ruby:gruff-example.rb
# pxは書かない
g.margins = 数値
```

③ 背景やフォントの色を指定するなら

```ruby:gruff-example.rb
g.theme = {
  :colors => 色の配列,
  :marker_color => 色,
  :background_colors => 色,
  :font_color => 色
}
```

④ themeをテンプレから指定するなら

```ruby:gruff-example.rb
g.theme_keynote

g.theme_37signals

g.theme_rails_keynote

g.theme_odeo

g.theme_pastel

g.theme_greyscale

```


## グラフの種類
**棒グラフ**

```ruby:gruff-example.rb
g = Gruff::Bar.new
```

<details><summary>実行結果</summary>![gruff-example.png](https://qiita-image-store.s3.amazonaws.com/0/181383/e56449f3-b398-bf2b-4409-46805a36a10b.png)</details>

**エリアグラフ**

```ruby:gruff-example.rb
g = Gruff::Area.new
```
<details>
<summary>実行結果</summary>
![gruff-example.png](https://qiita-image-store.s3.amazonaws.com/0/181383/11af289f-27f2-38fd-a1cb-4b2b08775f61.png)
</details>

**横棒グラフ**

```ruby:gruff-example.rb
g = Gruff::SideBar.new
```
<details>
<summary>実行結果</summary>
![gruff-example.png](https://qiita-image-store.s3.amazonaws.com/0/181383/27a86d42-555e-fd17-7e7a-a9ac41d63dfd.png)
</details>

**円グラフ**

```ruby:gruff-example.rb
g = Gruff::Pie.new
```
<details>
<summary>実行結果</summary>![gruff-example.png](https://qiita-image-store.s3.amazonaws.com/0/181383/25c99354-f3a2-afd0-dfbe-9100b34095f7.png)
</details>

他にも色々ある [こちらへ](https://github.com/topfunky/gruff/tree/master/lib/gruff)

## 終わりに
これでいろんなグラフをかけそう。
でも、日本語対応してないから

```ruby:gruff-example.rb
g.font = '適当なフォント名.ttf'
```
を指定しなあかんのが、ちょっとめんどくさいかも

読んでいただきありがとうございます。

参考にさせていただいた記事
- [Gruffでグラフ！格好いいグラフを簡単に生成](http://d.hatena.ne.jp/onering/20080520/1211251687)
俺的ROSとは

#はじめに
この記事ではROSについての研究を1年間行った私によるROSの説明を致します。
間違った情報もある可能性があるためご注意ください。
万が一間違った情報があっても報告していただかなくて結構です。

#ROSとは
ROSとはRobot Operating Systemの略称であり、ロボット開発のための様々なライリブラリを提供しているオープンソースソフトウェアである。

もっと簡単に言うと**ロボットを開発するときに便利なツールが無料で提供されている。**
ROSのほとんどの研究がこれを理由に用いています。
私はルンバしか使わなかったので1つも利用しませんでしたが...

##動作環境
OSはROSのバージョンによって変わります。
indigoならubuntu14.04
kineticならubuntu16.04
**とにかくubuntu**です。
windowsでは動作しません。

言語は基本的に**pythonかC++**です
高性能なロボットを動かすならC++
それ以外ならpythonっていうイメージがありますね。

##基本的な通信方法
通信方法について説明する前に用語の説明

![ROS.png](https://qiita-image-store.s3.amazonaws.com/0/221456/49fe7c94-dd7d-58a6-d8d4-8500c0ede374.png)

+ Publish：いわゆるメッセージの送信。出版する。
+ Subscribe：いわゆるメッセージを受信する。購読する。
+ Node：プログラム、もしくはソフトウェア
+ Topic：通信の仲介役
+ Master：通信の監視役、管理者

ROSでは**非同期通信**というものが行われています。
非同期通信における一番重要なものがTopicです。
ノードからノードへメッセージを送信したい場合、必ずこのTopicを介して行われます。

つまり、
１．ノードがメッセージをTopicにPublishする
２．Topicの更新が行われる
３．ノードに登録されているTopicが更新されるとSubscribeする
という流れです。


#おわりに
かなり大雑把にROSについて説明しました。
次回はROSのメリットについて説明しようと思っています。
当然ですけど何にでもROSを使えばいいってわけじゃないんです。
あいつにも苦手なことはたくさんあるんです。
Google スプレッドシートで他のスプレッドシートを参照する

`IMPORTRANGE` 関数を使う。

使用例:

    IMPORTRANGE("https://docs.google.com/spreadsheets/d/abcd123abcd123", "シート1!A1:C10")

スプレッドシートの URL は ID (スプレッドシートキー、URL の 'abcd123abcd123' の部分) のみでも OK。
使用時に元のスプレッドシートへのアクセス許可をあたえる必要がある。

参考:

- [IMPORTRANGE - ドキュメント エディタ ヘルプ](https://support.google.com/docs/answer/3093340)
- [Googleスプレッドシートで別のスプレッドシートのセルを参照する方法 | 株式会社LIG](https://liginc.co.jp/186744)
Macで最優先のネットワークインターフェイスの取得方法

Macはシステム環境設定で優先するネットワークインターフェイスを変更することが出来きます。
最優先のデバイスは、接続中のデバイスの中で、優先度が最も高いデバイスが選択されます。

これをコードで取得したかったため、調べてみると、SystemConfigurationフレームワークを使えば可能だと分かりました。

```Swift
import Foundation
import SystemConfiguration

var processName = ProcessInfo.processInfo.processName as CFString
var dynamicStore = SCDynamicStoreCreate(kCFAllocatorDefault, processName, nil, nil)

var ipv4Key = SCDynamicStoreKeyCreateNetworkGlobalEntity(
    kCFAllocatorDefault, kSCDynamicStoreDomainState, kSCEntNetIPv4)
if let ipv4Interface = SCDynamicStoreCopyValue(dynamicStore, ipv4Key) as? [CFString: Any] {
    if let primaryInterface = ipv4Interface[kSCDynamicStorePropNetPrimaryInterface] as? String {
        print("PrimaryInterface: \(primaryInterface)")
    }
}
```

## 2018/02/10 22:40 追記
「kSCEntNetIPv4」を「kSCEntNetIPv6」にしたらどうなるかが気になったので、試してみると、同じようにプライマリインターフェイスが取得できました。

それと、システム環境設定で順番を明示的に変更したときや、プライマリインターフェイスを切断したときに、直ぐに反映されるのかも試してみると、直ぐに反映されました。

試したOSは、macOS 10.13.3 High Sierraです。
Cloudera QuickStart VMs(CDH)でHadoop on Windows - Part-1

#はじめに
[HortonworksのHDP](https://jp.hortonworks.com/products/data-platforms/hdp/)を試そうと思いましたが、PCではリソース不足で試せなかったので[CDH(Cloudera's Distribution including Apache Hadoop)](https://www.cloudera.com/products/open-source/apache-hadoop/key-cdh-components.html)を使ってみることにしました。
HDPもCDHもHadoop周辺のシステムを組み合わせたHadoopディストリビューションです。
HDFS, Hive, Hbaseあたりはどちらでも利用できます。

Part-2は[こちら](https://qiita.com/tworks55/items/62efe9f3af176d78efa1)
Part-3は[こちら](https://qiita.com/tworks55/items/ea552f51b308833efeaf)
Part-4[はこちら](https://qiita.com/tworks55/items/288aae7c32e7a68d1ee1)

#1. 前提
以下の環境で動作した内容を記述しています。

Windows 10 Home (64bit)
VirtualBox 5.2
CDH 5.12

#2. CDHの起動
[https://www.cloudera.com/](https://www.cloudera.com/)からVMのzipファイルをダウンロードし、任意のフォルダに展開します。
VirtualBoxでovfファイルをインポートし、あとは普通に起動するだけ使えるようになります。
メモリの割り当ては4Gとなっていますので、HortonworksのHDPより少ないメモリで正常に起動します。
※HDPは6Gくらいでも動きが怪しくなりました。

起動してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/c0e60ff0-3086-b3e1-4633-6f899de29e5d.png)

CentOSを使用しているようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/9be6ee84-4c20-01f7-bd60-00b94f7f656e.png)

起動中
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/2c40f0f2-bbdf-2e42-47ee-e9e32cdd546a.png)

起動するとGUIが立ち上がり、すぐにTutorialが開始できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/8669a4da-d1e2-295c-5ff0-6ab0444f928d.png)

#3. SSH接続
VirtualBox内のコンソールで作業するのは少し辛いので、VirtualBoxでPort forwardingの設定をし、自分のPCからPuttyなどでCDHにSSH接続できるようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/e372bc25-d21c-6ff9-bc60-43aaa2b5eb65.png)

ここではPort22に対しPort2222で接続できるようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/7f1ce51f-584d-f9c7-b4c0-c84bdc1e86ec.png)

Puttyで以下のようにLocalhost:2222を接続先に設定し、user id=cloudera, password=clouderaで接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/3b389baf-8bba-d6c4-07dd-77bf937007ca.png)

以下のようになれば接続成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/adda7c98-d745-6025-a605-83b5b5e1b36e.png)

#4. ブラウザで接続
自分のPCからブラウザでCDHに接続するのは簡単です。
[http://localhost:8888](http://localhost:8888)をブラウザに入力すると、Hueに接続できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/75160e76-7edc-e0cb-f8b8-67c34dc5c8b0.png)

user id=cloudera, password=clouderaでログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/3bdeaae8-96a9-39dc-b695-2cec441d94cb.png)

[http://localhost](http://localhost)に接続するとTutorialのページが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/44415f44-59ec-1135-d78a-86f80654c193.png)


Part-1はここまでにします。

Part-2は[こちら](https://qiita.com/tworks55/items/62efe9f3af176d78efa1)
Part-3は[こちら](https://qiita.com/tworks55/items/ea552f51b308833efeaf)


#参考URL
http://datasciesotist.hatenablog.jp/entry/2014/05/10/225809
https://blog.cloudera.com/blog/2014/01/how-to-create-a-simple-hadoop-cluster-with-virtualbox/
http://www.mwsoft.jp/programming/hadoop/cdh4_virtualbox.html
Pythonでサンプル画像生成アプリを作る

# はじめに
ある日のこと、こんなやりとりが発生しました。

フロントエンドメンバー：「今、デザインの時に使う画像が[placeholder](https://placeholder.com/)を使ったグレーなシンプルなやつなんですが、もっとリアルな画像にしたい。」

僕：じゃあやりましょう!

ということでPythonでサンプル画像を作る方法です。

# 開発環境
開発環境は下記です。

* Python 3.6
* Flask 0.12.2
* Pillow 5.0.0


# API設計
:categoryはdogやhumanなど写真のカテゴリーです
:sizeは「100x100」というようなテキストです。

|URL|メソッド|レスポンス|内容|
|:---:|:--:|:---:|:--:|
|/images/categories|GET|JSON形式|取得できるカテゴリー一覧の取得|
|/images/:category|GET|Content-type=Image|指定したカテゴリーのオリジナル画像の取得|
|/images/:category/:size|GET|Content-type=Image|指定したカテゴリーのリサイズ画像の取得|

# 開発時に悩んだところ
## テキストの描画
画像にテキストを描画する部分はPillowを使えばとっても簡単でした。
たった数行で画像にテキストを印字できます。fontも選べるのですごく便利ですね。

```python
from PIL import Image, ImageDraw, ImageFont

img = Image.new("RGB", (512, 512), (128, 128, 128))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("font/example.otf", int(img.size[1]/10))
draw.text((0, 0), text, font=font, fill=(255, 255, 255, 100))
```

## レスポンス部分
レスポンス部分の実装をどうするかが一番悩みポイントでした。
実際にはioモジュールのBytesIOを使ってバイナリストリームを使いました。
Flaskでレスポンスを作る際にはflaskモジュールにあるhelpersのmake_response関数を使って最終的なレスポンスデータを作成します。

```python
buf = BytesIO()
img.save(buf, 'jpeg')
response = helpers.make_response(buf.getvalue())
```
# できたもの
URLで指定したサイズに変更した画像がGETできます。
![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/199445/0a13b27a-a1eb-4ae4-4eca-8d579d6ed8a6.gif)

これをどこかのサーバに立てれば好きな画像のリサイズしたものがすぐに手に入ります。画像はランダムで取得されるようにしているので種類を増やせば、色々な種類の画像が手に入ります。（何かのリストを表示する時にランダム性があると嬉しいと言われたため）

あとはhtmlに下記のように書けばOK!

```html
<img src="http://xxx.xxx.xxx.xxx/images/human/300x200">
```

# ソースコード
ソースコードは[こちら](https://github.com/yujikawa/sample_image_maker)です。
angular のwebpack部分をカスタマイズする




django上のtemplate下にindex.htmlをstatic下に*.bundle.jsを配置したいと思いまして
Angularの設定項目を探したところng ejectをしなさいという記事を見つけたので
やってみたところ
webpack絡みのコマンドはng * では提供されなくなりますよ
npm *を使ってくださいね、という話ですね。
備忘録ですね。

`ng eject`

```
==========================================================================================
Ejection was successful.

To run your builds, you now need to do the following commands:
   - "npm run build" to build.
   - "npm test" to run unit tests.
   - "npm start" to serve the app using webpack-dev-server.
   - "npm run e2e" to run protractor.

Running the equivalent CLI commands will result in an error.

==========================================================================================
Some packages were added. Please run "npm install".
```

しかしながらindex.htmlと*.bundle.jsを上手く分けれなかったので
Angularは諦めてVuejsでやることにした。
備忘録 Intune 管理対象アプリ


Office365＋IntuneでiOSデバイスを利用する上で、条件付きアクセスとアプリケーション保護ポリシーはなかなか便利。

Intune管理対象アプリ
https://www.microsoft.com/ja-jp/cloud-platform/microsoft-intune-apps


しかし、ActiveSyncで使えていたメモとタスクに対応するアプリがないのが惜しいところ。Onenoteでメモは代替えできる~~が、タスクはPlannerでは代替えできるものではないし。Outlookに統合されるか、別アプリを展開して欲しい。~~To-Doが展開されたので、タスク管理もこれで素直に移行できそう。




前回の投稿から、あれこれ増えてた。気になったのはこの3つ。

■Microsoft To-Do
個人のタスク管理なら、Plannerよりこっちがおススメ。モバイルからの利用なら、Outlookアプリ内でなく、単独アプリでぱっと使えるのはメリットだと思う。

■Microsoft Invoicing
支払い・請求管理。日本未展開っぽい。Dynamicsいれるまでもないような小規模をターゲットにしてんのかな。
https://products.office.com/en-us/business/microsoft-invoicing/invoice-software

■VMware Workspace ONE
認証基盤でEMM製品なので競合関係にあるんじゃ？と思っているけど、管理対象アプリとして構成できるようになっていた。
https://blogs.vmware.com/jp-euc/2018/07/vmware-workspace-one-graph.html

SaaSで対応しているアプリが増えるのはありがたい。AdobeとかSalesforceとか、対応してくれないかしら。
git version 2.16.1 インストール Windows版

Windowsにgit version 2.16.1をインストールする手順です。
# git 入手
以下からWindows版gitを入手する。
https://gitforwindows.org/

2018/02/06 時点で以下のバージョンが最新となっている。
git version 2.16.1

# インストール
ダウンロードしたexeを実行する。

## Information
![001.png](https://qiita-image-store.s3.amazonaws.com/0/235844/cae79b75-cd53-0156-8633-834b6a798a91.png)

[Next]をクリック

## インストール先
![002.png](https://qiita-image-store.s3.amazonaws.com/0/235844/ca9fa925-7b81-bfc7-e6e7-a5a2abdf399b.png)

インストール先はデフォルトで問題ない。
[Next]をクリック

## コンポーネント選択
![003.png](https://qiita-image-store.s3.amazonaws.com/0/235844/88beb71e-abf5-6282-7dce-6b4e369d7699.png)

[Next]をクリック

## スタートメニュー
![004.png](https://qiita-image-store.s3.amazonaws.com/0/235844/dbad7476-87ab-5151-2fd9-955cdaf00e37.png)

[Next]をクリック

## エディタ選択
![005.png](https://qiita-image-store.s3.amazonaws.com/0/235844/96d7e195-bf6d-bed6-e498-6ae2a4592148.png)

好みのエディタを選択してください。
vimを選択しました。
[Next]をクリック

## 環境変数
![006.png](https://qiita-image-store.s3.amazonaws.com/0/235844/79d6c577-757b-1efb-765b-b24955f8e33a.png)

Git bashの方が使いやすいのでデフォルトにしました。
コマンドプロントでgitコマンドとUnixツールを使いたいなら3つ目を選択。
[Next]をクリック

## SSL/TLSライブラリ
![007.png](https://qiita-image-store.s3.amazonaws.com/0/235844/f3437ea8-714c-f1fb-0a96-e3607a2e6e65.png)

[Next]をクリック

## 改行コードについて
![008.png](https://qiita-image-store.s3.amazonaws.com/0/235844/cc6f93b2-81f7-d8f5-ec0d-ea9c98642114.png)

<dl>
  <dt>Checkout Windows-style, commit Unix-style line endings</dt>
  <dd>チェックアウト時に改行コードはCR LFに変更され、コミット時には全てLFに変換される。</dd>
  <dt>Checkout as-is, commit Unix-style line endings</dt>
  <dd>チェックアウト時は改行コードについては何もしない、コミット時には全てLFに変換される。</dd>
  <dt>Checkout as-is, commit as-is</dt>
  <dd>改行コードについては何もしない。</dd>
</dl>

Windows環境では改行コードがCR LFになっており、LFと混同する。
またLinux環境でLFでコミットしたファイルをWindowsで取得するとCR LFになってしまう。
リポジトリ毎に改行コードを設定することも可能であるが、一律変換しないを選択して
Windows上でもLFでファイルを管理した方がトラブルが少ない。

![008_1.png](https://qiita-image-store.s3.amazonaws.com/0/235844/3e8afcf5-b11c-02eb-8ac0-6583b06d8e75.png)

[Next]をクリック

## ターミナル
![009.png](https://qiita-image-store.s3.amazonaws.com/0/235844/bfe08dd3-c339-43b2-1d19-345f9539e410.png)

コマンドプロントを利用したい場合は、Use Winodws' default console windowを選択
[Next]をクリック

## オプション
![010.png](https://qiita-image-store.s3.amazonaws.com/0/235844/4ff20839-36fb-cd54-6b82-54bb7b0770dc.png)

<dl>
  <dt>Enable file system caching</dt>
  <dd>git status時などでの応答速度を改善するfscacheキャッシュを有効にするかしないかオプション</dd>
  <dt>Enable Git Credential Manager</dt>
  <dd>GitHub等にアクセスする際の二段階認証に対応するかのオプション</dd>
  <dt>Enable symbolic links</dt>
  <dd>シンボリックリンクの使用/不使用のオプション</dd>
</dl>

シンボリックリンクも使用可能にしておいた方が便利です。
[Next]をクリック

## インストール
![011.png](https://qiita-image-store.s3.amazonaws.com/0/235844/e155f8b1-45fe-73d3-e40d-1bd1f3fa57be.png)

## インストール完了
![012.png](https://qiita-image-store.s3.amazonaws.com/0/235844/7ea130c9-6e5b-ba8d-9d54-099c9ba59d1d.png)

# バージョン確認
```bash
$ git --version
git version 2.16.1.windows.4
```

---
お疲れ様でした。
Wizardモノイドとその仕組み

GHC 8.0からIO型がMonoidのインスタンスになりました。これを利用した便利なテクニックを、Gabriel Gonzalezさんが[The wizard monoid](http://www.haskellforall.com/2018/02/the-wizard-monoid.html)としてブログで紹介されています。

Wizardの意味は魔法使いですが、ソフトウェアをインストールする時とかに出てくるインストール[ウィザード](https://kotobank.jp/word/%E3%82%A6%E3%82%A3%E3%82%B6%E3%83%BC%E3%83%89-988)のような対話形式で作業を誘導してくれるソフトウェアのことでもあります。WizardモノイドのWizardは後者の意味で使われています。

Wizardモノイド
-----------
まず元の記事の流れに沿ってWizardモノイドを紹介したいと思います。以下のような例を考えてみましょう。

```hs
main :: IO ()
main = do
    -- 最初に全ての情報を入力してもらう
    putStrLn "名前は?"
    name <- getLine

    putStrLn "年齢は?"
    age <- getLine

    -- 最後に全てのアクションを実行する
    putStrLn ("名前: " ++ name)
    putStrLn ("年齢: " ++ age)
```

この短いプログラムには

* 名前を聞いて最後に名前を表示する
* 年齢を聞いて最後に年齢を表示する

という明らかなパターンがありますが、それぞれの「聞く」と「表示する」が入れ子になっているせいでうまく分割できません。そこで登場するのがWizardモノイドです。Wizardモノイドを使うと以下のように書けます。

```hs
import Data.Monoid ((<>))

name :: IO (IO ())
name = do
    putStrLn "名前は?"
    x <- getLine
    return (putStrLn ("名前: " ++ x))

age :: IO (IO ())
age = do
    putStrLn "年齢は?"
    x <- getLine
    return (putStrLn ("年齢: " ++ x))

runWizard :: IO (IO a) -> IO a
runWizard request = do
    respond <- request
    respond

main :: IO ()
main = runWizard (name <> age)
```

名前と年齢それぞれの処理をうまく分離することが出来ています。どの部分がWizardモノイドになっているのかを敢えて型で定義すると以下のようになると思います。

```hs
type Wizard a = IO (IO a)
```

Wizardモノイドによってコードを分割したことで処理をまとめることが出来るようになりました。

```hs
import Data.Monoid ((<>))

prompt :: String -> IO (IO ())
prompt attribute = do
    putStrLn (attribute ++ "は?")
    x <- getLine
    return (putStrLn (attribute ++ ": " ++ x))

runWizard :: IO (IO a) -> IO a
runWizard request = do
    respond <- request
    respond

main :: IO ()
main = runWizard (prompt "名前" <> prompt "年齢")
```

もし追加で好きな色を尋ねたくなったら以下のように修正すればいいだけですね。

```hs
main :: IO ()
main = runWizard (prompt "名前" <> prompt "年齢" <> prompt "好きな色")
```

入力→出力のパターンだけでなく、アクション→アクションのパターンなら何でも入れ子に合成できるのでWizardモノイドは意外と使い道が広くて重宝しそうです。

Wizardモノイドの仕組み
-------------------
それではなぜWizardモノイドがIOの入れ子の合成を実現できているのか見ていきましょう。その秘密はIOのMonoidのインスタンスにあります。IOのMonoidのインスタンスは以下のように[定義されています](https://hackage.haskell.org/package/base-4.10.1.0/docs/src/GHC.Base.html#)。

```hs
instance Monoid a => Monoid (IO a) where
    mempty = pure mempty
    mappend = liftA2 mappend
```

`liftA2`は

```hs
liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c
```

と[定義されている](http://hackage.haskell.org/package/base-4.10.1.0/docs/Control-Applicative.html#v:liftA2)関数です。`mappend`の定義を分かりやすく書き下すと以下のようになります。

```hs
mappend action1 action2 = do
  result1 <- action1
  result2 <- action2
  pure (result1 <> result2)
```

要はアクションを一つずつ実行して得られた結果を結果の型のMonoidインスタンスの`mappend`で合成するという処理になります。これを踏まえると先の例の `name <> age` は以下のような処理になっているはずです。

```hs
do
  response1 <- name
  response2 <- age
  pure (response1 <> response2)
```

`name` と `age` の実装を思い出すと `response1` と `response2` はそれぞれ名前と年齢を表示する処理になっているはずです。

`runWizard` は `name <> age` を実行したあとさらに最後の `response1 <> response2` を取り出して実行するという処理を行っています。これで「聞く」と「表示する」の処理を入れ子にする流れを追うことができましたね。
PHPの日付書式まとめ

なんか書き始めてから、ほとんどPHPの話題に触れていない。間にちょいちょい違う言語を挟んではいるものの、本業ではPHP書いてるんですがね・・・

だが、長いこと書いてる割に、なぜか日付（時刻）の書式とか、すぐ忘れる。
だって使うのは大抵

```php
date('Y-m-d H:i:s');
```

なんですよ。9割方これで済むといっても過言ではない。（言い過ぎ）
たまーに、「2018/02/04」の0いらねって言われて、あれ？ってなる。
そんな、たまに使うけど忘れがちな書式とか、まとめておこうと思います。

# 前提条件
- MacOS High Sierra 10.13.3
- PHP7.1.7

今回は書式の確認だけなので、Docker環境は使いません。
（１個前のvim起動しない件は、これやりたかっただけなんですよ・・・）

# 日付の書式
以下、今日が2018/2/4の場合です。

## 2018-02-04
さっきも書いたけど

```php
date('Y-m-d');
```

「/」で区切りたかったらY/m/dにすればいいだけのお話。
「-」か「/」か「.」のどれかを区切り文字にする・・・くらいのバリエーションですかね。


## 2018年2月4日
0いらねって言われるのは、たいてい日本語表記の時ですね。

```php
date('Y年n月j日');
```

nは、なんとなく覚えてるんですが、jを覚えてない・・・なぜだ。

## 18-02-04
最近あんまりお見かけしないが、年を2桁で出すときが、ごく稀に。

```php
date('y-m-d');
```

これは割と覚えてるな。

## 平成30年2月4日
ほんとこれ滅多にないし、前回使ったのは、数年前、提出用の印刷物を元号で・・・みたいなお仕事でしたか。
もちろんPHPには書式として存在しないので、自分で工夫する必要があります。
（日本でもユーザー多いんだし、設定してるtimezoneでよろしくやってくれるのが公式に現れてもいい頃だと思うわけですよ・・・）

# 曜日の書式
曜日もなー。日本語圏に優しくないよなー。

## Sun

```php
date('D');
```
正直、あんまり使わない。なんかカッコつけたページに出す時くらい


## 7または0
いきなり数字きてなんのこった？と思うけど、英語圏以外の人は、きっとこの数字使いまくりだと思うのですよ。

月曜日=1,火曜日=2・・・日曜日=7

```php
date('N');
```

日曜日=0,月曜日=1・・・土曜日=6

```php
date('w');
```

これね、何が困るって日曜日しか違いがないので、ちゃんと動いてたのに、誰か休日出勤したら変だった・・・みたいなことが起きかねないところですかね？
テストでサーバー日付いじったりするところまでやる会社は良いのですが、うっかりミスしないように、毎回マニュアル見て確認しちゃうやつなんですよ・・・


## (日)、日曜日
これもあれだ。元号と同じで公式で存在しないのです。公式がそろそろ・・・（以下略）

# 時間の書式
時刻は24時間と12時間表記２パターンあるので、割と忘れがちな12時間パターンを併記

## 09:07:03
これは日付とセットで出すときによく使うやつです

24時間表記の場合

```php
date('H:i:s');
```

12時間表記の場合

```php
date('h:i:s');
```

## 9:07:03
時間の頭に0がつかないパターン。

24時間表記の場合

```php
date('G:i:s');
```

12時間表記の場合

```php
date('g:i:s');
```

Gってなんの略・・・な感じで全然覚えられないやつです。

## 9時7分3秒
日本ではアリなこの表記。海外ではないんですかね？分と秒に0をつけないことって・・・
まぁ、幸いなことに、最近はあまりこういうご要望は頂かないので0つけて出してますが。


```php
date('G') . '時' . (int)date('i') . '分' . (int)date('s') . '秒';
```

無理やりすぎる・・・

```php
sprintf('%d時%d分%d秒', date('H'), date('i'), date('s'));
```

どっちにしても美しくないな・・・w
色々書きようはあるけど、すっきりしないどころか何だかわからなくなるので、あまり奇抜なアイデアはやめておくのが無難なところですかね。

# 番外編
## RSSのpubDate

```
Sat, 10 Feb 2018 19:55:00 +0900
```

こういうやつ、入ってますよね？

```php
date('r');
```

こんなやつあるのに、和暦は・・・（以下略）

RSS自体が色々決まり事があるので、よその人に迷惑かけないように仕様を確認しましょう。
その昔、他社のRSSを読み込んでDBに入れるお仕事で、文法エラーたっぷりのRSSを配信されて、悲しいエラー通知を受け取る側だったのでw

和暦は1行ですっきり出すことができない＆だいぶ長くなったので、また今度。
PythonでMySQLを操作するRESTを作る

# 概要
前提として、本記事はpythonでDB操作をする初心者さん向けです。

PythonのORマッパーであるPeeweeを使って、簡単なREST APIを作ります。
とりあえずここでは、GETで取得したURLからIDを取り出し、MySQLに接続して指定のデータを取り出す方法を示します。
同様の記事はQiitaにもたくさんありますが、個人的にハマったポイントを加えて解説します。

# 使用モジュール

* peewee (MySQLを操作するためのORマッパー)
* Flask (WEBサーバー)

# インストール
pipでいくつかのモジュールをインストールします。

```
$ pip install flask peewee PyMySQL
```
peeweeからMySQLへ繋ぐためにはドライバーが必要なため、前述の使用モジュールに加えて**「PyMySQL」を入れています**。（これが意外と解説記事には書かれていなくてハマります。。）


# ソースコード
下記に例を示します。
この例では　/items/(itemのID) をGETで受け取ったとき(例：http://[ドメイン]/items/101)
result(取得結果)とdata(結果データ)をJSONデータ形式で返します。

```server.py
from flask import Flask, jsonify, abort, make_response
import peewee as pe

db = pe.MySQLDatabase('db_name', user='user_name', password='password',host='host_name')

class UnknownField(object):
    def __init__(self, *_, **__): pass
    
# モデル共通
class BaseModel(pe.Model):
    class Meta:
        database = db

# データテーブルのモデル
class Items(BaseModel):
    id = pe.IntegerField()
    itemUrl = pe.CharField()
    itemData = pe.TextField()
    insertDate = pe.DateTimeField()

    class Meta:
        db_table = 'itemDdata' # テーブル名を指定

api = Flask(__name__)

# itemの詳細情報を取得
@api.route('/items/<int:id>', methods=['GET'])
def getItemData(id):
    itemCodeList = []
    db.connect()
    try:
        data = Items.select(Items.itemData).where(Items.id == id)
	       # SQL文で言うと "SELECT itemData FROM itemData Where id = (GETで受け取ったID)"
        
    except Items.DoesNotExist:
        db.close()
        abort(404)

    result = {
        "result": True,
        "data": data.itemData
    }
    db.close()
    return make_response(jsonify(result))

@api.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

if __name__ == '__main__':
    api.run(host='0.0.0.0',port=80,debug=False) #host=0.0.0.0を指定することで外部からアクセス可能になる
```

# 解説
FlaskはWEBサーバーとして動作しており、外部からのリクエストを受け付けます。
サーバーを起動するときはrunメソッドを実行しますが、host記述を省略すると自動的に自身(127.0.0.1)を指定します。
ただしここにハマりポイントがあり、**実はこの形だと外部からのリクエストを受け付けません。**外部リクエストを受け付けるには、host='0.0.0.0'を明示的に指定する必要があります。

peeweeはORマッパーですが、sqlを操作するにはまず**「モデル」を作り、それに対して操作を記述する**必要があります。
上記ソースでは「Items」クラスを作って、各カラムのフィールドタイプを指定し、db_tableで対象のテーブルを指定しています。
指定できるフィールドタイプの一覧はこちら。
http://docs.peewee-orm.com/en/latest/peewee/models.html#field-types-table

#まとめ
今回は簡易説明のためGETのみの解説としましたが、ここまで分かれば他もわりと簡単だと思います。
記事にも書きましたが、改めて個人的にハマったポイントは

* PyMySQLのインストールが必要
* Flaskは自身を指定する場合でも記述を省略せずhost='0.0.0.0'を指定
* Peeweeはまず「モデル」を作って、テーブル名はdb_tableで指定

です。この記事が誰かの手助けになれば幸いです。

### 追記(2018/2/15)
db.connect()とdb.close()を追加しました。
RESTを受け付けるサーバーの場合、通常はwebサーバーは起動したままとなり待ちの状態となるのですが、起動したときにDB接続しただけではリクエストを受け付けたときにDB接続がタイムアウトしている可能性があるので、リクエスト受付時に接続、切断するようにしました。

# 参考記事
* [Peewee公式ドキュメント](http://docs.peewee-orm.com/en/latest/)
* [Flask公式ドキュメント](http://flask.pocoo.org/)
* [PythonのORMのPeeweeを使ってデータベースを操作してみる](https://qiita.com/mima_ita/items/9d4e1d0afac1865acdbb)
* [Flaskのサーバーはデフォルトだと公開されてない](https://qiita.com/tomboyboy/items/122dfdb41188176e45b5)
* [peewee（備忘録）](https://qiita.com/igarashi7979/items/1b3cd00ce70abc6bb06b)
* [Connecting to a MAMD mySQL database using peewee](https://teamtreehouse.com/community/connecting-to-a-mamd-mysql-database-using-peewee)