OmniAICreator/Qiita-1.07M huggingface dataset:
開発環境を構築するのに使ってるAnsibleのplaybook.yml

## 方針

### playbook.ymlを一つ実行すれば環境構築が済むようにする

以前はChef Solo + Berkshelfで開発環境構築を行っていたが、以下のようなことが手間になりAnsibleに移行した。

* レシピを実行できる環境を作るまでが手間
* レシピのソースを読まないとカスタマイズがしずらいのと、どう動いてるかが分かりづらい

### Vagrant + VirtualBoxで動かす

最近は開発環境にDockerを使うという選択肢もあるが、init.dやsystemdで起動するものがapt-get installしただけだと動かなくて別途設定が必要なこともありVirtualBoxを使っている。

Vagrantの場合に以下のように設定を追加しておくと、初回にvagrant upした時にansibleが実行されるので便利。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end
```


## ソース

https://github.com/f96q/vagrantfile

```yaml:playbook.yml
- hosts: all
  become: yes
  vars:
    user: ubuntu
  tasks:
    - name: Set timezone
      timezone: name=Asia/Tokyo

    - name: Add docker key
      apt_key: url=https://download.docker.com/linux/ubuntu/gpg state=present

    - name: Add docker repo
      apt_repository: repo='deb [arch=amd64] http://download.docker.com/linux/ubuntu {{ansible_distribution_release}} stable' state=present

    - name: Add heroku key
      apt_key: url=https://cli-assets.heroku.com/apt/release.key state=present

    - name: Add heroku repo
      apt_repository: repo='deb http://cli-assets.heroku.com/branches/stable/apt ./' state=present

    - name: Install packages
      apt: name={{item}} state=present update_cache=yes
      with_items:
        - language-pack-ja
        - zsh
        - screen
        - emacs-nox
        - silversearcher-ag
        - mysql-server
        - redis-server
        - elasticsearch
        - imagemagick
        - ruby
        - ruby-dev
        - nodejs
        - nodejs-legacy
        - npm
        - phantomjs
        - python-pip
        - libxml2-dev
        - libmagick++-dev
        - libmysql++-dev
        - libpq-dev
        - docker-ce
        - heroku

    - name: Add docker group
      user: name={{user}} append=yes groups=docker

    - name: Install docker-compose
      pip:
        name: docker-compose

    - name: Start services
      action: service name={{item}} state=started enabled=yes
      with_items:
        - mysql
        - redis
        - elasticsearch
        - docker

    - name: Install awscli
      pip: name=awscli state=present

    - name: Install bundler
      gem: name=bundler user_install=no state=present

    - name: Install yarn
      npm: name=yarn global=yes state=present

    - name: Execute chsh zsh
      command: chsh ubuntu -s /bin/zsh

    - name: Execute git clone dotfiles
      become_user: '{{user}}'
      git: repo=https://github.com/f96q/dotfiles.git dest=/home/{{user}}/dotfiles accept_hostkey=yes

    - name: Setup dotfiles
      become_user: '{{user}}'
      command: bash setup.sh chdir=/home/{{user}}/dotfiles
```
LaravelとjScrollで、Infinite Scrollをやってみた

Twitterなどでよく実装されている、下にいくと無限にデータが読み込まれるアレ。
今回はLaravelとjScrollというjQueryのプラグインを使ってやってみました。

![infinite-scroll.gif](https://qiita-image-store.s3.amazonaws.com/0/178137/1d52463d-12d6-1763-6608-776f8dc57e53.gif)

# 環境
- Laravel 5.2(Blade利用)
- jQuery 1.12.4
- jScroll 2.3.9

# コーディング
## Controller
```php:ScrollController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App\Post;

class PostController extends Controller
{

    public function scroll()
    {
        $post_list = Post::orderBy('post_no')->paginate(15);

        return view('scroll', compact('post_list'));
    }
}
```


## View
ここでのミソは`{{$post_list->links()}}`を`$('#infinite-scroll')`の中にしっかり入れておかないと動作しないということ！
これをミスって1時間くらいドツボにハマったのでご注意を。。。

また、検索機能なんかをつけている場合、
`{{$post_list->appends(['hoge' => $hoge])->links()}}`
とすれば検索結果を引き継ぐことができます。

```php:scrollView.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta name="viewport" content="width=device-width">
    <meta charset="UTF-8">
    <title>LaravelとjScrollで、Infinite Scrollをやってみた</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/material-design-iconic-font/2.2.0/css/material-design-iconic-font.min.css">
</head>
<body>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jscroll/2.3.9/jquery.jscroll.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $('ul.pagination').hide();
    $('#infinite-scroll').jscroll({
        autoTrigger: true,
        loadingHtml: '<div class="col-xs-12 text-center"><i class="zmdi zmdi-spinner zmdi-hc-spin zmdi-hc-3x"></i></div>',
        padding: 0,
        nextSelector: '.pagination li.active + li a',
        contentSelector: '#infinite-scroll',
        callback: function() {
            $('ul.pagination').remove();
        }
    });
});
</script>

<div class="container">
    <div id="infinite-scroll">
        <ul>
            @forelse ($post_list as $post)
                <li>
                    <b>[{{$post->title}}]</b>
                    <br>
                    {{$post->content}}
                </li>
            @empty
                <li>投稿はまだありません。</li>
            @endforelse
        </ul>
        {{$post_list->links()}}
    </div>
</div>

</body>
</html>
```

# 所感
自分で仕込もうとすると、ちょっとめんどうな処理ですが、プラグインでここまでサクッと出来るとは思いませんでした。
コントローラーなんて2行で済んでますし、めちゃめちゃ簡単ですね。。。

日本語のリファレンスが意外と見つからなかったので、今回書いてみました！

# 参考文献
- [Implementing Infinite Scroll Pagination Using Laravel & jScroll](https://laraget.com/blog/implementing-infinite-scroll-pagination-using-laravel-and-jscroll)
- [jScroll github](https://github.com/pklauzinski/jscroll)
相対importを使ったPythonファイルをPyCharmで実行する

相対importを使ったPythonファイルをPyCharm上で実行しようとして、うまく動かないって経験ありませんか？

# TL;DR

- Program: `$ModuleSdkPath$`
- Parameters: `-c "import os,runpy;runpy.run_module('.'.join(r'$FilePathRelativeToSourcepath$'.replace(os.sep,'.').split('.')[:-1]),{},__name__,1)"`
- Working directory: `$Sourcepath$`

Sources Rootを適切に設定したうえで、上の設定でExternal Toolsを追加してください。

# 解決したい問題

例えば、`my_pkg`という自作のパッケージ内で下のようなファイルを作ります。

```py3:my_pkg/foo.py
x = 42
```

```py3:my_pkg/bar.py
from .foo import x

if __name__ == '__main__':
    print(x)
```

ここで my_pkg/bar.py をPyCharmで開いて単純に Run すると以下のような例外が発生します。

```
/usr/bin/python3 /tmp/my_pkg/bar.py
Traceback (most recent call last):
  File "/tmp/my_pkg/bar.py", line 1, in <module>
    from .foo import x
ModuleNotFoundError: No module named '__main__.foo'; '__main__' is not a package

Process finished with exit code 1
```

# 原因
理由については、[こちら](http://qiita.com/ysk24ok/items/2711295d83218c699276) の記事などで詳しく説明されています。
結論だけ言えば、`-m`オプションをつけて、モジュールの完全修飾名 (`my_pkg.bar`) を指定して実行するとうまく動きます。

```bash
# ERROR!!
/usr/bin/python3 /tmp/my_pkg/bar.py

# OK
cd /tmp
/usr/bin/python3 -m my_pkg.bar
```

つまり、どうにかしてPyCharmに`-m`オプション形式で実行させれば良いわけです。

# 解決策 1. 愚直に Edit Configuration settings する

下の画像のように設定すると`-m`オプション形式で実行させることができます。
しかしこの方法には、**実行したいファイルごとに毎回この設定をしなければならない** という極めて深刻な問題があります。

![edit_configurations.png](https://qiita-image-store.s3.amazonaws.com/0/154890/c5ba9fdc-bcc7-75fb-91c6-5def079a1934.png)

![edit_configurations2.png](https://qiita-image-store.s3.amazonaws.com/0/154890/c6cc666c-159d-ad9b-c2d7-1aab12dabb68.png)

# 解決策 2. External Tools を使う
PyCharm には、外部の実行ファイルを扱う機能が備わっているので、これを利用します。
少し面倒ですが、一度設定するだけで全てのプロジェクトで使えるようになるのが利点です。

## External Tools の新規作成
メニューバーの File → Settings → Tools → External Tools と進んで新しい External Tools を追加してください。

![external_tools.png](https://qiita-image-store.s3.amazonaws.com/0/154890/5f9f6c81-d170-6749-7e7e-0eca749852e5.png)

![external_tools2.png](https://qiita-image-store.s3.amazonaws.com/0/154890/21cab982-2f1e-608c-00f4-ffe54d6d6732.png)

Tool settingsの部分は以下のように設定してください。

- Program: `$ModuleSdkPath$`
- Parameters: `-c "import os,runpy;runpy.run_module('.'.join(r'$FilePathRelativeToSourcepath$'.replace(os.sep,'.').split('.')[:-1]),{},__name__,1)"`
- Working directory: `$Sourcepath$`

## Sources Rootの設定
あとは `my_pkg` の親ディレクトリを右クリックして、Sources Rootとして登録すればOKです。

![external_tools3.png](https://qiita-image-store.s3.amazonaws.com/0/154890/815fd163-a454-4e81-8fd7-127c84cd2a86.png)

## 実行
`bar.py`を開いた状態で、メニューバーの Tool → External Tools → python -m をクリックしてください。
きちんと実行できたら成功です。頻繁に使うようであれば、ショートカットキーを割り当てておくと便利です。
[Unity] 文字コード(=読み込むファイルが文字化けする問題)

#概要
Unityのデフォルトファイル形式はUTF-8らしい。
サクラエディタやExcelの場合、デフォルトはSJISだと思う。この文字コードの違いが文字化けを生む。

エディタでセーブするとデフォルトがSJISなので、Unityで読み込むと文字化けしているはず。
Unityで生成したテキストエディタで開こうとすると文字化けするという逆の問題もあると思う。

自分で事前にデータを用意する場合UTF-8でセーブすることを忘れずに。

##エディタ/Excel -> Unity
サクラエディタでUnity用のデータをセーブする際は以下の設定でセーブできる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154265/52e3d4bb-ef5c-d30a-8bf5-b639deb46ee2.png)

Excelも似たような設定があったはず。
もしくは一度csv(SJIS)でセーブして、サクラエディタなどで再度UTF-8に変換する手もある。

##Unity -> エディタ/Excel
Excelの場合は[データ]->[テキストファイル]で外部ファイルを読み込めばOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154265/b1a08ca8-ee06-8369-924a-a0dfbd5fd4ba.png)
はじめてのKotlin:データクラスの操作～toString()/componentN()～

　ここではデータクラスのデフォルト関数である **toString()** 関数と **componentN()** 関数について説明します。
# toString()関数
　**toString()** 関数はデータクラスのオブジェクトを文字列に変換します。
　変換した文字列は **データクラス名( プロパティ名=値, ・・・・ )** の書式となります。
## toString()関数のコード例

```kotlin:toString()関数のコード例
data class モール( val 名称: String, val 所在地: String )

fun main( args: Array<String> ) {
  val イオン洛南 = モール(
      名称 = "イオン洛南ショッピングセンター", 
      所在地 = "京都府京都市南区吉祥院御池町31番地" )

  println( イオン洛南.toString() )

  println(
    モール( "イオンモール北戸田", "埼玉県戸田市美女木東1-3-1" ).toString()
  )
}
```
```text:実行結果
モール(名称=イオン洛南ショッピングセンター, 所在地=京都府京都市南区吉祥院御池町31番地)
モール(名称=イオンモール北戸田, 所在地=埼玉県戸田市美女木東1-3-1)
```

## componentN()関数
　**componentN()** 関数は、データクラスのN番目のプロパティの値を返します。
　たとえば、１番目のプロパティは**component1()** 関数、２番目のプロパティは**component2()** 関数により取得することができます。
## componentN()関数のコード例

```kotlin:componentN()関数のコード例
data class 女優(
  val 出身地: String, val 氏名: String, val 年齢: Int, val 所属事務所: String
)

fun main( args: Array<String> ) {
  val 悦ちゃん = 女優( "大阪府", "平尾 菜々花", 11, "テアトルアカデミー大阪校" )

  val 氏名 = 悦ちゃん.component2()
  val 年齢 = 悦ちゃん.component3()

  println( "・氏名：${氏名}ちゃん・年齢：${年齢}才" )
  println(
    "\t・出身地：${悦ちゃん.component1()}・所属事務所：${悦ちゃん.component4()}"
  )

  print(
    "・氏名："
      + 女優( "東京都", "松岡 茉優", 22, "ヒラタオフィス" ).component2()
      + "さん"
  )
  println(
    "・年齢："
      + 女優( "東京都", "松岡 茉優", 22, "ヒラタオフィス" ).component3()
      + "才"
  )
}
```

```text:実行結果
・氏名：平尾 菜々花ちゃん・年齢：11才
　　　・出身地：大阪府・所属事務所：テアトルアカデミー大阪校
・氏名：松岡 茉優さん・年齢：22才
```
※実行結果を引用ではなく、テキストボックスにしました。
Springを始める時にmavenの設定でハマったこと

## 環境
macOS Sierra
maven 3.5.0
IDE STS 3.8.4


## エラー内容
STSでSpringプロジェクトを作成した時に、以下のようなビルドエラーが出る。

```
Archive for required library: '~/.m2/repository/org/hibernate/hibernate-core/4.2.1.Final/hibernate-core-4.2.1.Final.jar' in project 'ProjectName' cannot be read or is not a valid ZIP file
```

(missing file) ではないのでファイルは存在している（実際にフォルダを探すと確かに存在している）が、ファイルが壊れていて読み取りできません、的なメッセージ。
Mavenでいろいろなライブラリを読み込んでいますが、なぜかこのファイルだけがエラーになるという不可解な状態。



## 試したこと１

いろいろ調べてみると似たような事象は多いものの、これだ！という解決策は見つからず。
わかったことは、SpringではなくMavenの問題であることが多いらしい。
ファイルが壊れているということで対象を一度削除して maven で取得し直してみる。

1.　hibernate-core を削除

```rm -r ~/.m2/repository/org/hibernate/hibernate-core```

2.　プロジェクトをアップデート

プロジェクトを右クリックして Maven > Update Project...
hibernate-core が再作成されたことを確認してビルド


結果は、何も変わらず。
```rm -r ~/.m2/repository```で丸ごと削除して試しても変わりませんでした。

## 試したこと2

原因がよくわからないので、とりあえずMavenの設定を確認してみます。

1.　ローカルリポジトリ
初期状態のままなので、ローカルリポジトリは ```~/.m2/repository``` ですが。
念のため、```${インストールした場所}/maven/conf/settings.xml```の```<localRepository>```を設定しておきます。

```xml:settings.xml
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <localRepository>/Users/${ユーザー名}/.m2/repository</localRepository>
```

この状態で一度プロジェクトをアップデートしてビルドしてみたところ、なぜかエラーが解消されていました。
結局何が原因だったのかよくわかりませんが、一応解決できたので、同じところでつまづかないようにメモしておきます。



## 参考

Maven のバージョンは違いますが、こちらを参考にさせていただきました。
http://qiita.com/opengl-8080/items/226dd39bd02e41b9de28
非再帰で再帰的にシュトラッセンのアルゴリズムを適用した場合の速度の比較

行列積の高速化を行いたかったので試した
正方行列の同士の積の速さを調べた
再帰関数は遅そうなのでとりあえず非再帰にした

#**ソースコード**
https://github.com/2a3oiUA3zfDtr3py/Misc/tree/master/Strassen_test

#**環境**
ディストリ Gentoo
linux 4.12.0
gcc 6.4.0
コンパイルオプション O3 のみ

#**結果**
サイズが500〜700くらいでシュトラッセンのアルゴリズムが優位になる
適用回数を増やしすぎると遅くなる

| | 0(通常版) | 1 | 2 | 3 | 4 | 5 |
|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
| **1024** | 8.004014 | 5.214240 | 4.795226 | 4.853635 | 4.749052 | 6.112296 |
| **768** | 2.436310 | 2.250368 | 2.108333 | 2.306208 | 2.312872 | 3.133664 |
| **512** | 0.630759 | 0.658321 | 0.667544 | 0.657491 | 0.850998 | 1.256109 |
| **386** | 0.268798 | 0.284696 | 0.312598 | 0.312704 | 0.433152 | 0.698134 |
| **256** | 0.075986 | 0.089913 | 0.087577 | 0.114589 | 0.173926 | 0.308808 |

自分が扱いたいサイズが64*64なのでシュトラッセンのアルゴリズムによる高速化は望めない…
Laravelのnpm run devでエラーが出るようになった

http://qiita.com/horikeso/items/39beb56b81b321a03f31
こちらでうまくいっていたnpm run devが本日試したらエラーが出るようになっていた。

```
# npm run dev

> @ dev /home/public/app
> npm run development


> @ development /home/public/app
> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js

 95% emitting

 ERROR  Failed to compile with 1 errors                                                                                              00:30:18

 error  in ./resources/assets/js/components/Example.vue

Module build failed: Error: Cannot find module './lib/beautify'
    at Function.Module._resolveFilename (module.js:485:15)
    at Function.Module._load (module.js:437:25)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at /home/public/app/node_modules/js-beautify/js/index.js:74:27
    at Object.<anonymous> (/home/public/app/node_modules/js-beautify/js/index.js:80:7)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/home/public/app/node_modules/vue-loader/lib/template-compiler/index.js:4:16)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at loadLoader (/home/public/app/node_modules/loader-runner/lib/loadLoader.js:13:17)
    at iteratePitchingLoaders (/home/public/app/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at runLoaders (/home/public/app/node_modules/loader-runner/lib/LoaderRunner.js:362:2)
    at NormalModule.doBuild (/home/public/app/node_modules/webpack/lib/NormalModule.js:182:3)
    at NormalModule.build (/home/public/app/node_modules/webpack/lib/NormalModule.js:275:15)
    at Compilation.buildModule (/home/public/app/node_modules/webpack/lib/Compilation.js:149:10)
    at factoryCallback (/home/public/app/node_modules/webpack/lib/Compilation.js:337:12)
    at factory (/home/public/app/node_modules/webpack/lib/NormalModuleFactory.js:241:5)
    at applyPluginsAsyncWaterfall (/home/public/app/node_modules/webpack/lib/NormalModuleFactory.js:94:13)

 @ ./resources/assets/js/components/Example.vue 6:2-212
 @ ./resources/assets/js/app.js
 @ multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
```

issueが上がっていたのでいつか直るかもしれません
https://github.com/JeffreyWay/laravel-mix/issues/1198
https://github.com/beautify-web/js-beautify/issues/1247
とりあえず
devDependenciesに
"js-beautify": "1.6.14"
を追加したら通りました。

js-beautifyが壊れて動かなくなったようです。
vue-loaderがjs-beautifyを使っていてエラーになっていたようです。
vue-loaderの方がjs-beautifyを使わない修正を入れたようなのでvue-loaderを更新すればよいみたいな流れになりそうです。

**追記：2017/09/19**
**devDependencies**に
**"vue-loader": "^13.0.5"**
を追加で対応する方法でも問題なく動作しました。
Chromeで「要素を検証」からブラウザのキャッシュを消す

主に更新ボタン長押しの「スーパーリロード(Empty cache and hard reload)」でキャッシュが消せない。さらに設定からキャッシュ消すと消したくないサイトのキャッシュまで消えてしまうので他の方法を探している人むけです。

# 場所

要素を検証→「Application」→「Clear storage→」「Clear Site data」

<img width="849" alt="Screen Shot 2017-09-19 at 1.00.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/165335/89c6f358-2789-cba1-1301-9c7eb85dedaf.png">

ここです。
PSoC5でI2C極小OLED、SSD1306を使う

# はじめに
Amazonで売っている小型のOLEDディスプレイをPSoC5LPで動かしました。
Arduinoで動かしてもよかったのですが、ライブラリを使うとどうしてもメモリが足りなかったのでPSoCで使いたい！
ということでちょっと調べてやってみました。
githubにあるライブラリを使ってPSoC4で動かしてから、PSoC5用に改良していきます。

# OLEDについて

今回使ったのは128x32のサイズのもの
Amazonで500円ぐらいで手に入ります。
![oled](https://images-na.ssl-images-amazon.com/images/I/4145ZF2HrIL.jpg)

# PSoC4で動かす
githubにSSD1306をPSoC4PioneerKit用に変更したものを公開しているのでそれを使います。
このライブラリはAdafruitグラフィックスライブラリをPSoC用に変更したものになっています。
>https://github.com/derkst/Cypress-PSOC-OLED

PSoC4PioneerKitで使うならばそのままでいいのですが、今回はPSoC5で使いたいので移植する必要があります。


# PSoC5LP用に改良する
PSoC4にはSerial Communication Block (SCB)というコンポーネントが乗っていて、そいつをUARTやSPIやI2Cのモジュールとして使っています。
一方PSoC5にはI2C単体のモジュールがあるのでSCBの変わりにそれを使います。
とはモジュールの仕様が多少異なっているため手を加えなければなりません。
IssueにはPSoC5での実装についてコメントがありました。
>For PSoC 5 use byte to byte transfer instead of MasterWriteBuf. PSoC 5 API can send only 256 bytes per one MasterWriteBuf call.

PSoC5のAPIでは一度に256byteしか送信できないからbyte to byteを使え！ってことですね。
データシートを見ると
SCBは
uint32 SCB_I2CMasterWriteBuf(uint32 slaveAddress, uint8 * wrData, __uint32 cnt__ , uint32 mode)
I2Cは
uint8 I2C_MasterReadBuf(uint8 slaveAddress, uint8 * rdData, __uint8 cnt__ , uint8 mode)
となっていてPSoC5のAPIでは一度に256byteしか送信できないことがわかります。
そこでPSoC5では`uint8 I2C_MasterWriteByte(uint8 theByte)`を使って手動で送るように変更してやります。
具体的にはssd1306.cのstatic uint32 display_write_buf関数内の

``` c:
I2COLED_I2CMasterWriteBuf(_i2caddr, buf, size, I2COLED_I2C_MODE_COMPLETE_XFER);
while( 0u == (I2COLED_I2CMasterStatus() & I2COLED_I2C_MSTAT_WR_CMPLT) );
```

の部分を

```c:
status = I2COLED_MasterSendStart(_i2caddr, I2C_WRITE_XFER_MODE);
if(I2COLED_MSTR_NO_ERROR == status)
{
    for(i = 0; i<size; i++)
    {
        status = I2COLED_MasterWriteByte(buf[i]);
        if(status != I2COLED_MSTR_NO_ERROR)
        {
            break;
        }
    }
}
I2COLED_MasterSendStop();
```
と変更してやります。

# 完成
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PSoC5でAmazonにあるSSD1306のOLED動いた <a href="https://t.co/LAWXQNx09K">pic.twitter.com/LAWXQNx09K</a></p>&mdash; ringo (@Malus_Mill_) <a href="https://twitter.com/Malus_Mill_/status/909773140988911616">2017年9月18日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

sampleを動かしているところです。
以上の変更でPSoC5でSSD1306を使うことができます。

# 終わりに
当初の目的はロガーの表示機がほしいなと思って作り始めたけど、Arduinoじゃメモリ足りないしなぁ。。。ということでやってみましたが、キャラクタ液晶と違ってなんでも表示できるのは楽しいですね。
今後は日本語フォントの実装とかできたらいいなと思います。
iPhoneで撮った写真のExif情報をMacで消し去る方法

# Exif情報とは
iPhoneで写真を撮った時に自動で追加されるメタ情報。
いろんなことに役立ちそうだが、最近筆者の周りでは勝手に画像の向きを変えたりファイルを重たくする悪ガキ。

# 検索して出て来た解決策1
Exif情報を消し去ってくれるアプリの宣伝等が数件ヒットしたので使うと良さそうです。

### メリット
多分いっぱい一気に消せたりする

### デメリット
入れるの面倒

# 検索して出て来た解決策2
プレビューアプリ使って、pngにフォーマット変換したらExif消えるよって書いていました。

### メリット
Apple純正

### デメリット
作業量が多い

# 今使っている解決策
ラインを経由して画像を保存。

### メリット
圧倒的に楽

### デメリット
画像が劣化
lagomのサンプルを動かしてみる


※雑多なメモなので誤りがあるかもしれませんことをご了承ください

# lagomってなに？

「まさマイクロサービスのフレームワークだ！！」と[公式サイト](https://www.lightbend.com/lagom-framework)にでかでかと書かれているが、マイクロサービスがそもそもよくわかってないのでそこはスルー。触ってみた感じだとCQRS+ESな仕組みを宣言的に実装出来るしくみじゃないかな〜って印象。

# とりあえず動かしてみる

まずはここに書いてある通りにやってみる。
[https://www.lagomframework.com/get-started-scala.html](https://www.lagomframework.com/get-started-scala.html)

ブラウザで[http://localhost:9000/api/hello/World](http://localhost:9000/api/hello/World)にアクセスしたら「Hello, World!」って表示されるはず。 

# 他のサンプルは？

サンプルコードを読めば書いてある通り、Postメソッドで「Hello」の部分を変更できる。例えば、以下のコマンドを実行して

```bash
curl -H "Content-Type: application/json" -X POST -d '{"message":"Goodbye and Goodnight"}' http://localhost:9000/api/hello/Kenny
```

[http://localhost:9000/api/hello/Kenny](http://localhost:9000/api/hello/Kenny)にアクセスしたら、メッセージが「Goodbye and Goodnight, Kenny!」に変わっている（どうでもいいけど、著者はにわかプロレスファン）

ちなみに変わっているのはKennyのときだけ（[http://localhost:9000/api/hello/World](http://localhost:9000/api/hello/World)にアクセスしたら、「Hello, World!」って表示される）多分、裏で動いているCassandraサーバーに記録してるんだと思う。

あとは、wscatっていうWebSocketのクライアントをインストールして、以下のコマンドを実行して文字列を入力するとレスポンスを返してくれる。

```
wscat -c ws://localhost:9000/stream
connected (press CTRL+C to quit)
> Doilux
< Hello, Doilux!
> Kenny
< Goodbye and Goodnight, Kenny!
```

# どこに実装されているの？

前述のWebSocketじゃないやつはhello-lagom-apiサブプロジェクトの`HellolagomService.scala`にインターフェースが定義されていて、hello-lagom-implの`HellolagomServiceImpl.scala`に実装が書かれている。

WebSocketのやつはhello-lagom-stream-apiサブプロジェクトの`HellolagomStreamService.scala`にインターフェースが、hello-lagom-stream-implサブプロジェクトの`HellolagomStreamServiceImpl.scala`に実装が書いてある。
`.*Loader.scala`にアプリケーションの設定が、ある程度決まった記述で書かれているんだと思う。

# 次は？？

[ドキュメント](https://www.lagomframework.com/documentation/1.3.x/scala/Home.html)が充実しているので、とりあえずドキュメントを読みながら色々試すのがいいと思います（私もそんな感じで色々試しています）

他にはこの記事が役に立ちました。
[たけぞう瀕死ブログ](http://takezoe.hatenablog.com/archive/category/Lagom)
GitLabでユーザのプロジェクト作成数の上限を変更する

# Postgresを操作する

```shell-session
sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -d gitlabhq_production
```

## ユーザのプロジェクト作成上限を変更する

- GitLabのバグのようだが、ユーザのプロジェクト作成数の上限が変更できない。
  - どんな値を入力しても0になってしまう。

- 現在の上限数を確認

```sql
psql> select name, projects_limit from users;
```

- 上限数を変更

```sql
psql> update users set projects_limit=10000;
psql> commit;
```

### psqlのコマンド
| コマンド         | 説明                           |
|------------------|--------------------------------|
| \l               | データベースの一覧             |
| \d               | テーブル一覧                   |
| \d テーブル名    | テーブルの項目(フィールド)確認 |
| \i sqlファイル名 | SQL(スクリプト)ファイルの実行  |
| \q               | psql切断                       |
[PHP]header関数でリダイレクト

24歳、初心者です。

ruby on railsではredirect_toでリダイレクト出来るけどPHPではどうやってリダイレクトするんや・・・と思って目の前の箱で検索をかけてみたら答えが返ってきたので、備忘録がわりに書いておきます。

####そもそもリダイレクトとは何か？
>ユーザーの入力を待たずにコードで他のURLへ移動する機能です。
「詳細！PHP7+MySQL入門ノート」より引用


####PHPでリダイレクトするには？
→PHPでリダイレクトするにはheader関数であるheader()を使います。

下記のようにLocationに続けて移動先のURLを記載します。注意しなければならないのは相対パスではなく、
http://www.test.com/　
のような絶対パスのURLを指定します。


```
<?php
header('Location: http://www.test.com/');
exit();
?>
```

リダイレクトの際は残りのコードは実行せずにページを移動したい場合は直後にexit()を実行します。

今ならまだURLは簡単に覚えられますが、その内滅茶苦茶長いURLを指定しなければならない日が来るでしょう。そんな時にスーパーグローバル変数の$_SERVERを使ってURLを表す事が出来るみたいです。


例えば、

```
<?php
header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])'./test.php');
exit();
?>
```
```
①$_SERVER['HTTP_HOST']
②dirname($_SERVER['PHP_SELF'])
```
①サーバーのホスト名を表しています。例えば,localhostとかですね。
②現在のファイルのディレクトリを取得できます。ですが['PHP_SELF']では脆弱性が発見されており、代わりに['SCRIPT_NAME']を使ったほうが良いそうです。

$_SERVER変数を使うことによって、長いURLを簡略化出来る他にも、開発環境から運用サーバーに移動してURLが変わってしまった場合にも対処できます。

参考書籍
「詳細！PHP7+MySQL入門ノート」
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 序章2 パターン

# パターン
第二部のモデル駆動設計の各構成要素は、「パターンランゲージ」として構成されている。先に登場した「ユビキタス言語」もパターンの一つですし、第三章以降でも活用されています。

> これらの標準パターンを共有すれば、設計に秩序がもたらされ、チームメンバが互いの仕事を理解しやすくなる。標準パターンを使うことで、ユビキタス言語も成長する。(第二部序章より)

パターンとして言語化することで、抽象的なこともお互いに共有することができ、仕事がしやすくなります。
「[リファクタリング](www.amazon.co.jp/dp/427405019X)」や、「デザインパターン」など、この業界では既にパターンランゲージはおなじみなものになっていますね。

「レイヤ化アーキテクチャ」はドメインを、ソフトウェアシステムにおけるその他の大量の関心事から分離することで、設計とモデルのつながりを明確にします。

「エンティティ」や「バリューオブジェクト」などは、特定の区分に従って、モデル要素を定義することで、モデル要素の意味が鮮明になり、実際に実装できるモデルを作れるようになります。

## パタン・ランゲージ
ちなみに、パターンランゲージの大元になっている「[パタン・ランゲージ](www.amazon.co.jp/dp/4306041719)」の著者であり、建築家であるChristopher Alexanderは実は日本でもパタン・ランゲージを活用した建築を残しています。

埼玉県入間市にある「[東野高等学校](http://eishin.ac/school-life/facilities/)」の校舎です。

実は、以前自分が住んでいたところ、または、実家からも近くいつか書籍を読んで訪れようと思っていたのですが、機会がなく未だ行けていません。。。

書籍も1万円以上ですし・・・

ということで、図書館で借りて読んで、実家に帰ったときにでも訪れてみようかなと思っています。

## ラーニング・パターン
また、日本でも慶應義塾大学湘南藤沢キャンパスの井庭先生を中心に「パタン・ランゲージ」を作成するプロジェクトが活発で、「[ラーニング・パターン](http://learningpatterns.sfc.keio.ac.jp/)」や「[プレゼンテーション・パターン](http://presentpatterns.sfc.keio.ac.jp/)」など実際、学習に役に立つパターンが紹介されています。

特にドメイン駆動設計は、ドメインに関する学びが重要視されていますから「[ラーニング・パターン](http://learningpatterns.sfc.keio.ac.jp/)」が結構役に立つのではないかと考えています。

例えば、「[No.16 動きのなかで考える](http://learningpatterns.sfc.keio.ac.jp/No16.html)」などは、実装しながら、ドメインを学び、モデルを変更させていくパターンとしてピッタリのパターンですよね。

「[No24 小さく生んで大きく育てる](http://learningpatterns.sfc.keio.ac.jp/No24.html)」などは、まずは小さくはじめて、反復によってドメインを育てていくパターンとして、これもピッタリです。

学びで迷ったらこのラーニング・パターン。オススメです。
scaffoldとは？

なんとなくでscaffoldを使っていたため、ちゃんと理解せねばと思い本記事を書いています。

#scaffoldってなんだ？
railsでは、`rails g`コマンドでコントローラーやモデルを作成し、ルーティングでページを繋げる操作が必要です。
Webアプリケーションに必要なこれらの操作を一度に自動で組み立ててくれるのがscaffoldです。
scaffoldの本来の意味は足場です。足場を作ってその上に自分の作りたいものを組み上げていくイメージでしょう。

#scaffoldの使い方
hogeappを作りましょう。
`$ rails new hoge`
hogeapp内に入ります。
`$ cd hoge`
早速、scaffoldを使ってみましょう。
`$ rails g scaffold fuga title:string content:text`
fugasコントローラーやfugaモデルができています。

マイグレーション後にサーバを立ち上げましょう。
`$ rake db:migrate`
`$ rails s`

ブラウザより`localhost:3000/fugas`にアクセスするとtitleとcontentに入力ができ、保存が可能になっています。
上記の手順を踏むだけで、簡単なアプリが完成してしまうところがrailsの凄い所です。
[メモ]C# のDirect2D対応サンプル (外部リンク)

#.NETの描画パフォーマンスを上げる件
.NETでDirect2Dを使用して描画する時に役立つ非常に良いサンプルを発見。
https://www.newtone.co.jp/producttc_dnjp00.html
→「Windows Forms で画像生成能力を上げるには（PDF）」
→ サンプルは次のURLからダウンロードできます。 のリンク

- wpf vs System.Drawing vs Direct2D(SlimDX) のサンプル
- 描画手段を抽象化した簡単なクラスライブラリが入っていて本当にすぐ理解できる
- 自作ライブラリのベースに使える

## 気が付いたこと
- 試した環境は Windows 10 64bit
- SlimDXをnugetから入れるとx86版しか入らないしうまく起動できない。公式HPからx86とx64を両方インストールしてGACに登録する必要があった。たぶん個別に設定いじる方法もあるけど今回はちゃっちゃとインストーラ走らせた方が良い。
- 上記のサンプルにはDirect2Dのポリゴン生成部分にバグがあり、すごいメモリリークする。下記のように、geomをDisposeさせるコードを追加する。

```csharp
[CanvasDirect2D.cs オリジナル]
private PathGeometry GetPathGeometry(Point[] points)
{
  PathGeometry result = null;
  if (points.Length > 1)
  {
    result = new PathGeometry(g.Factory);
    GeometrySink geom = result.Open();  //<----geomがDisposeされていない
    geom.SetFillMode(FillMode.Winding);
    geom.BeginFigure(points[0], FigureBegin.Filled);
    for (int i = 1; i < points.Length; i++)
    {
      geom.AddLine(points[i]);
    }
    geom.EndFigure(FigureEnd.Closed);
    geom.Close();
  }
  return result;
}
```

```csharp
[CanvasDirect2D.cs 修正後]
private PathGeometry GetPathGeometry(Point[] points)
{
  PathGeometry result = null;
  if (points.Length > 1)
  {
    result = new PathGeometry(g.Factory);
    using(GeometrySink geom = result.Open())  //usingを追加
    {
      geom.SetFillMode(FillMode.Winding);
      geom.BeginFigure(points[0], FigureBegin.Filled);
      for (int i = 1; i < points.Length; i++)
      {
        geom.AddLine(points[i]);
      }
      geom.EndFigure(FigureEnd.Closed);
      geom.Close();
    }
  }
  return result;
}
```
GHCのforallと多相性への対処


GHCの`forall`には一見複数の意味があるように思われます:

* 関数シグネチャの`forall`
* `RankNTypes`による`forall`
* `ExistentialQuantification`による`forall`

けどまあ基本的な考え方は同じで問題ないと思ってます。



# 関数シグネチャの`forall`

Haskellで関数の型シグネチャに現れる変数は、暗黙に量化されます。

```haskell
id :: a -> a
```

という関数は正確には`forall`を用いて以下のように表現されます（`forall`明示には`ExplicitForAll`か、それをimplyする言語拡張を指定する必要があります）

```haskell
id :: forall a. (a -> a)
```

この変数`a`が具体化されるのは関数適用時です。

```haskell
main = putStrLn $ id "Hello, type variables!"
```

ここで関数`id`を`"Hello, type variables!"`に対して適用すると、その適用に応じて型変数が具体的な型に具体化されます。ここでは`String`と推論されます。
次のコードでは`id`を`String`と`Integer`に対して適用しています。

```haskell
main = do
  putStrLn $ id "Hello, type variables!"
  print $ id 42
```

こうして複数の型に対応する関数を一つにまとめられることがparametric polymorphismの利点でした。

さて他の言語でジェネリクスでは型変数を`<>`やら`[]`やらで囲んで導入すると思いますが、それらの型変数が具体化するタイミングは皆知っていることでしょう。クラスの頭に付いていたらオブジェクト生成時に具体化、メソッドの頭に付いていたらメソッド呼び出し時に具体化されます。
ランク1の型の`forall`はそれと同じものです。

次のコードはscalaです。scalaでは`[]`を用いて型変数を導入します。

```scala
object Main {
  // 型変数 T, S の導入
  def map[T,S](f: T => S, seq: Seq[T]): Seq[S] = {
    seq match {
      case Nil => Nil
      case x +: xs => f(x) +: map(f, xs)
    }
  }

  def main(args: Array[String]) = {
    // mapの呼び出し時にT, Sは具体化される
    // ここでは[Int,String]と明示
    val result = map[Int,String]({ n: Int => n.toString }, Seq(1,3,4,5))
    println(result)
  }
}
```

Haskellでは冠頭の`forall`が省略できてしまうので、型変数の導入が曖昧に見えてしまうかもしれません。

```haskell
mapList :: (a -> b) -> [a] -> [b]
mapList f [] = []
mapList f (x:xs) = f x : mapList f xs

main = print $ mapList show [1,3,4,5]
```



# `RankNTypes`による`forall`

言語拡張`RankNTypes`を指定すると、任意のランクの型をもつ関数を定義出来ます。例えば`forall`が付いた関数を渡す高階関数を定義できます。

```haskell
{-# LANGUAGE RankNTypes #-}

main = putStrLn $ f show 42 True

f :: forall a b. (Show a, Show b)
  => (forall s. Show s => s -> String)
  -> a -> b -> String
f toString a b = toString a ++ " " ++ toString b
```

型変数`a`, `b`が具体化されるのは`f`の関数適用の時、`s`の具体化は引数で渡した関数`toString`を適用する度に行われます。
比較のために全ての`forall`を冠頭部に持ってきた関数を見てみます。

```haskell
-- これは型エラー
g :: forall a b s. (Show a, Show b)
  => (Show s => s -> String)
  -> a -> b -> String
g toString a b = toString a ++ " " ++ toString b
```

この関数は型エラーが発生します。`g`を関数適用した時点で`a`, `b`, `s`は全て決定するのに、`a`と`b`と`s`は同じ型とは限らないため`toString`の型は矛盾します。
これはランク2のケースですが、ランクがいくつでも考え方は同様です。つまり、`forall`が冠頭に来た関数の適用時に型変数は具体化します。



# `ExistentialQuantification`による`forall`

言語拡張`ExistentialQuantification`を指定すると、型定義の右側だけに現れる型変数を使うことが可能です。

```haskell
data ShowType = forall a. Show a => ST a
```

これも考え方は同じです。つまり、値コンストラクタ`ST`を呼び出す際に型変数`a`が決定されます。そして型の上に`a`は現れません。そういう型です。


# まとめ

型変数の具体化がどこで行われるべきかを正確に理解すると、多相性への対処も容易になるでしょう。またRank1で説明したように他の言語でのジェネリクス等の理解も深まるでしょう。
list_headの小さなサンプルメモ

# 前提

```
ubuntu# uname -a
Linux ubuntu 4.4.0-93-generic #116-Ubuntu SMP Fri Aug 11 21:17:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
ubuntu# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
```

仕組みはよく分かってないので、後から調べる。
とりあえずLinuxのコード読んでてよくわからなかったので、最小限の動くコードのみメモ（メモリの開放処理も無し）。

# コード

```c:kure.c
#include <linux/module.h>       /* MODULE, THIS_MODULE */
#include <linux/moduleparam.h>
#include <linux/kernel.h>       /* printk() */
#include <linux/errno.h>        /* error codes */
#include <linux/list.h>         /* list_*() */
#include <linux/slab.h>         /* kmalloc() */

MODULE_AUTHOR("kuredev");
MODULE_LICENSE("Dual BSD/GPL");

struct kurest
{
        int no;
        struct list_head list_head_;
};

struct kurest data1 = {
        .no = -1,
};

static int kure_init(void)
{
        printk(KERN_ALERT "Listtest init\n");
        struct kurest *data2, *data3;
        struct list_head *ptr;
        struct kurest *entry;
        INIT_LIST_HEAD(&data1.list_head_);

        data2 = kmalloc(sizeof(struct kurest), GFP_KERNEL);
        data2->no = 2;
        list_add(&data2->list_head_, &data1.list_head_);

        data3 = kmalloc(sizeof(struct kurest), GFP_KERNEL);
        data3->no = 3;
        list_add(&data3->list_head_, &data1.list_head_);

        list_for_each(ptr, &data1.list_head_){
                 entry = list_entry(ptr, struct kurest, list_head_);
                 printk("no: %d\n", entry->no);
        }

        return 0;
}


static void kure_exit(void)
{
        printk(KERN_ALERT "Listtest exit\n");
}

module_init(kure_init);
module_exit(kure_exit);
```

```file:Makefile
KERNEL_DIR = /lib/modules/$(shell uname -r)/build
BUILD_DIR := $(shell pwd)
VERBOSE   := 0
obj-m := kure.o
all:
        make -C $(KERNEL_DIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules
clean:
        rm -rf  *.o *.ko *.mod.c *.symvers *.order .tmp_versions .kure.*
```


# 実行
```
# make
# insmod kure.ko
# tail /var/log/syslog
Sep 18 23:12:16 ubuntu kernel: [23064.945863] Listtest init
Sep 18 23:12:16 ubuntu kernel: [23064.945869] no: 3
Sep 18 23:12:16 ubuntu kernel: [23064.945870] no: 2
Sep 18 23:12:21 ubuntu kernel: [23069.543457] Listtest exit
```

# 参考

linuxカーネルが提供するリストの使い方について - mmitouの日記 http://d.hatena.ne.jp/mmitou/20120626/1340731801
RaspberryPiの可搬型UPSとして使えるモバイルバッテリー捜索


RaspberryPi Zero Wを購入したのだが、どうも電源周りが不安。

最初、USB充電ポート×2が付いている電源タップから電源をとっていたら、もう一個のポートでスマホの充電を始めたらラズパイの電源が落ちてしまった。
確かに安物電源パットで分配までしたら不安定になるのは当然かと反省。

その後は1ポートで専用の電源アダプタを使用しているものの、やはりちょっと不安。
不意な瞬停でファイルが破損することもあるということと、
ラズパイゼロで小型なんだから持ち運んでもOKなものにしたいということで、
ノートパソコンやスマホの内蔵バッテリーよろしく、
モバイルバッテリーを繋げればいいんじゃないかと思い立った。

つまり **ラズパイ用可搬型無停電電源装置(UPS)を探そう** と言うことだ。

もちろん、本来のUPS用ボード等もある([UPS PIco](http://www.furutaka-netsel.co.jp/utility/upspico.html) や [Rapsberry pi用 ミニUPS](http://www.galileo-7.com/?pid=98460387))のだけど、それだけで基板増やすのもどうしようかな、ということで手軽にできそうなモバイルバッテリーで検討することにした。


さて、そんなわけで、探していたモバイルバッテリーの条件は以下の通り。
##■ラズパイ用可搬型UPS条件

1. モバイルバッテリー自身がコンセントから充電されている状態で、その間ラズパイへの給電もし続ける。
2. 充電中に外してもラズパイへの給電が瞬停しない。
3. 充電してない状態(持ち運んでいる想定)から、モバイルバッテリーを充電してもラズパイへの給電が瞬停しない。
4. ラズパイが低電力状態(私の環境ではラズパイに何も接続しない状態で100mA)でも自動的に停止しない。

ということで、とりあえず **いかなるときも給電は止めないこと** が条件。
1は当然のように追っかけ充電ができるかということ。どうも対応していないのが多いらしい。
2、3の条件は、家での使用←→持ち運んで使用 がシャットダウン無しでできること、というのと、
家での使用中に、停電が発生したときに大丈夫か(まさしくUPSとしての用途)、という条件。
4も意外と曲者。低消費電流状態と判断されると電源を切られる。本末転倒になるのでこれも必須。

手持ちのモバイルバッテリーの検証結果。
#○成功

##1.cheero Power Plus 10400mAh DANBOARD Version
http://amzn.to/2x81oJr
俗に言うダンボーバッテリーの初代。
1. ○
2. ○
3. ○
4. ○


#×失敗
##2.RAVPower 6700mAh 急速充電 モバイルバッテリー(RP-PB060)
http://amzn.to/2w2Gh7K
小型なのに大容量でコストパフォーマンスも良い。
1. ○
2. ×充電状態から非充電状態になると給電が一瞬停止する
3. ○ 
4. ○


##3.ROMOSS モバイルバッテリー 10000mAh ACプラグ内蔵
http://amzn.to/2hcZD3Y
ACアダプタ内蔵なので、コンセントに直接させるので便利なやつ

1. ○
2. ×充電状態から非充電状態になると給電が一瞬停止する
3. ○ 
4. ○

##4.メーカー不明 モバイルバッテリー 5200mAh LEDライト付き
確かヤマダ電機で買った気がする、パッケージ捨てちゃってて調べてもヒットしない謎バッテリー。形としては2のRAV Powerのやつに似てる。
1. ○
2. ×充電状態から非充電状態になると給電が一瞬停止する
3. ○ 
4. ○

#■結果
条件を満たしていたのは1個だけで、他は残念な結果に。
というか、条件を満たしているのがあっただけでも僥倖だろう。

どうも、充電から非充電になるときに瞬断が発生するものが多い様子。
つまり **いつもは家でコンセント接続しているけど、持ち運ぼうとしてコンセントから外したとき瞬断する。** ということ。
まぁ持ち運ぶときはシャットダウンしろよ、ということか。

条件をすべて満たしていたのは予想外にもダンボーバッテリー。
なお、cheero Power Plus自体も更に先代があるらしく、ダンボーバッテリーとしては初代だけれど、cheero Power Plusとしては2代目とのこと。ややこしい。(初代はスライドスイッチ付きだったみたい)
買ったのが2013年なので既に購入できないという悲しい結果に。

なかなか瞬断まで気にしている人はいないらしく、このあとのダンボーバッテリーのバージョンでは大丈夫なのかがわからない。
しばらくこのダンボーバッテリーを大切に使っていこう。

なお、Webを検索してようやく同じ考えの方の記事を見つけた。

[パナソニックのモバイルバッテリー搭載ＡＣ急速充電器はIoT機器のUPSとして使えるかも]
(https://kitto-yakudatsu.com/archives/2669)


**パナソニック モバイルバッテリー搭載AC急速充電器 5,000mAh ホワイト QE-AL201-W** 
http://amzn.to/2xtlRID
これが瞬断しないようなので次点候補。惜しむらくはACアダプタ内蔵ですごく大きいこと。
とは言え、今のところ瞬断なしという情報が確認できているのはこれくらいなので、仕方ないのかもしれない。
 ※9/22 あとで無くなっても嫌なので買いました。

***
#■余談
それにしても、RaspberryPi Zero W、無負荷状態で約100mAhと思ったよりは燃費が良さそう。10000mAhなら2~3日くらいは保つということか?
今度放置してどのくらい保つかそちらも検証してみようと思う。

##■追記
ダンボーモバイルバッテリーのラズパイ耐久試験結果。
![20170923_105936.jpg](https://qiita-image-store.s3.amazonaws.com/0/199149/7b2de5d3-8413-b5dc-684c-b8dfa928d2e8.jpeg)
ラズパイ消費電力100mAh(起動させてただけ)にて実施したところ、42時間で停止。
**4482mAh** という結果に。
・・・あれ、10400mAhなのに随分減っている。
3.7x10400=384480
38480/5=7696mAh
くらいにはなるはずなんだけど。ヘタってきているのか?

ちなみに、ダンボーバッテリー自体の充電を測定してみた結果がこちら。
![20170924_115724.jpg](https://qiita-image-store.s3.amazonaws.com/0/199149/b60fead2-c148-4195-277c-3b4a9c258b38.jpeg)
**8886mAh** でした。時間もほぼぴったり1Ahでの充電。

このバッテリー、入力が1Ahで頭打ちなので、出力側の消費が1A以上だったら充電が追いつかずに止まることになる。
基本的にはラズパイゼロ(W)辺りの低消費電力なやつで使うことを前提にしたほうが良いだろう。
UnityでGradient EditorをGUIで使うには

#Gradient Editorはこういうやつ
![gradient.png](https://qiita-image-store.s3.amazonaws.com/0/27032/e9aca5b3-da1b-1692-ba9f-8ac41be8dcc9.png)

グラデーションを作るのに非常に便利で特定の用途にはすごく役に立ちます。
普通のGUIには用意されてないため使うには少し回りくどいやり方をしなければならないです。

#PropertyField
EditorGUILayout.PropertyFieldはSerializedPropertyを渡すことで最適なGUIを表示してくれます。
これを使うことでEditorGUIやGUIに用意されていないものも表示できます。
[PropertyFieldのリファレンス](https://docs.unity3d.com/jp/540/ScriptReference/EditorGUILayout.PropertyField.html)

#実装

```csharp
public class GradientData : ScriptableObject {
    public Gradient gradient = new Gradient();
}

public override void OnInspectorGUI()
{
    // 本来はメンバ変数などにインスタンスを一つだけ保持しておく 
    GradientData data = CreateInstance<GradientData>();
    SerializedObject serializedGradientData = new SerializedObject(data);
    SerializedProperty gradientProperty = serializedGradientData.FindProperty("gradient");

    EditorGUI.BeginChangeCheck();
    // PropertyFieldでGUI表示
    EditorGUILayout.PropertyField(gradientProperty);
    // 変更があったらApplyして変更を適用する必要がある 
    if (EditorGUI.EndChangeCheck())
    {
        serializedGradientData.ApplyModifiedProperties();
    }
}
```
SpringFrameworkによる開発環境構築（ローカル環境編）

# 概要
SpringFrameworkによる開発環境構築をしてみる。はじめてなので試行錯誤。
ざっくりと以下構成で構築。とりあえずローカル環境を構築。

- ローカル環境
 - IDE：STS(Spring Tool Suite)
 - ビルドツール：Gradle
 - ServletContainer：Tomcat8
 - webサーバ：Pivotal tc Server
 - 静的解析ツール：CheckStyle（コーディング規約）、FindBugs（バグパターンチェック）、cobertura（テストコードカバレッジ）
- 開発環境
 - ビルドツール：Gradle
 - webサーバ：Apache2.4
 - ServletContainer：Tomcat8
 - CIツール：Jenkins、Capistrano（デプロイ） 
- ステージング環境 
 - webサーバ：Apache2.4
 - ServletContainer：Tomcat8
- 本番環境 
 - webサーバ：Apache2.4
 - ServletContainer：Tomcat8

# ローカル環境構築方針
とりあえずIDEはSTS(Spring Tool Suite)を使う。
buildにはGradleを使ってPivotal tc Serverとか言うのをwebサーバとして使って動作確認。
念のためbuild実行時に静的コード解析を色々行いたい。
あとはGitでソース管理してpushpushや。

# とりあえずGradleのお勉強
Gradleで何が出来るのかちょっくら調べてみる。
https://spring.io/guides/gs/gradle/

gradleをインストールするとgradleコマンドが打てるらしい。
build.gradleファイルに以下１行つけるとgradle buildが実行出来るようになってjavaの実行クラスができる！！

```gradle:build.gradle
apply plugin: 'java'
```
あとは以下みたいな感じで打つとgradleインストールして無くても./gradlew的なコマンドでビルドしたり出来るらしい

```zsh:zsh
gradle wrapper --gradle-version 2.13
```

# Gradleを用いたSTSによる簡単なアプリの開発（ローカル環境）
以下参考にGradleを用いた簡単なアプリを作成。無事HelloWorld表示やで
https://javaworld.helpfulness.jp/post-296/

tcserverが動かないんとこでぶつかったが以下で乗り越える
http://kenjimorita.jp/sts-servers-where-is-server/
https://github.com/pivotal/homebrew-tap

# ビルド時に静的解析出来るようにやってみる
## checkstyleでコーディング規約チェック
以下参考に設定
http://maku77.github.io/gradle/checkstyle.html
↑STSの設定の仕方で相当苦労
edit configurationのargumentsのprogram argsに「--rerun-tasks」指定しないと「up-to-date」とか言ってもっかいやってくれずにbuild successとか出ちゃって相当悩んだ
http://engineer-blog.cyber-z.co.jp/entry/2014/06/12/153346

## find bugsでコードバグチェック
ココらへんを見てざっと設定
http://qiita.com/toastkidjp/items/180e69d49cbdccb7d3fe#findbugs

## JaCoCoでテストコードのカバレッジ確認
以下参考に実行
http://qiita.com/mychaelstyle/items/74baa62b7bf2fe81e309
https://docs.gradle.org/current/userguide/jacoco_plugin.html#applyJacoco
『小中学生からはじめるプログラミングの本』のスクリプト

[『小中学生からはじめるプログラミングの本』](http://amzn.to/2xsqFxP) のメモ

インデント等，本に書かれているように書きます．
p.14

```html:wa.html
<script>
 a=1;
 b=1;
 while(a<10000){
  a++;
  b=b+a;
 }
 document.write(b);
</script>
```

p.15

```html:you.html
<script
 src="http://maps.google.com/maps/api/js">
</script>
<script>
 navigator.geolocation.getCurrentPosition(
 function(a){b=new
  google.maps.LatLng(a.coords.latitude,
  a.coords.longitude);new
  google.maps.Marker({position:b, map:new
  google.maps.Map(document.getElementById("c"),
  {zoom: 17, center:b})});
});
</script>
<div id="c" style="width:100%; height: 100%">
</div>
```

p.129 図10−2

```py3
def bmicheck(shintyou, taijuu):
    bmi=taijuu/((shintyou/100)**2)
    message="BMIは%.1fです。"
    if bmi>=25:
        message=message+"肥満です"
    print(message % bmi)

bmicheck(170,60)
bmicheck(170,80)
```
eclipseでSpring Bootで開発を始めるまで2

前回はeclipseでSpringbootをインストールするところまで行いましたので、続いてプロジェクトを作っていきましょう。

### 2.プロジェクトを作成する
いくつかやり方があると思いますが、以下の方法を紹介します。

・パッケージ・エクスプローラで右クリックし、メニューを出し[新規]-[プロジェクト]をクリック
・ツールバーのメニューから[ファイル]-[新規]-[プロジェクト]をクリック

以下の画面が開くと思います。
<img width="527" alt="スクリーンショット 2017-09-18 22.36.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/62b4d7c5-86f7-2a9b-12c8-c4c84ff13fb4.png">

次にフィルターに「Spring」と入力します。
<img width="532" alt="スクリーンショット 2017-09-18 22.38.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/3206b2cd-2a1b-afd1-4bbd-efa0306f5b9a.png">


「Boot」まで入れるとヒットしなくなりました。なんでかな・・・？
きっと、フォルダ内のコンテンツのみ検索しているのでしょう・・・
<img width="522" alt="スクリーンショット 2017-09-18 22.40.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/cbbc1f2a-8a4c-9aa7-ab6b-c2c0f23c233b.png">


さて次ですが、先ほど検索結果に表示されたSpring Bootの「Spring Boot スタートアップ・プロジェクト」をクリックして次へを押すと以下の画面が起動します。
ここでパッケージ名やJavaのバージョンなどを選んでいき、次へをクリックします。
名前の項目はデフォルトでは空白ですが必須項目のため、今回はとりあえず「Kakeibo」と入れてみました。
※ここで「成果物」に値を入れておかないとあとで「プロジェクト・ビルド・エラー: 'artifactId' is missing.	pom.xml」というエラーが発生します。
<img width="553" alt="スクリーンショット 2017-09-18 22.51.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/d37a8c76-a741-81f1-7304-8d09c30de2a1.png">


ここでテンプレートの選択ができます。自分の使用するプロジェクトに合わせて選んでみましょう。
今回はよく使うであろう「Web」だけを選択してみました。
これで完了を押して終わりです。
<img width="553" alt="スクリーンショット 2017-09-18 22.52.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/7fe8ea1c-b3da-de7d-2153-e4eebd6b6949.png">

私の環境では「プロジェクト構成がpom.xmlの最新ではありません」というエラーが発生しましたが、パッケージ・エクスプローラでプロジェクトを右クリックして、[Maven]-[プロジェクトの更新]を選択し、そのままOKをしたところエラーが消えました。
これでプロジェクトの作成は完了です。

↓最終的にはこのような感じになります。↓
<img width="357" alt="スクリーンショット 2017-09-18 23.13.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/81ada45b-6902-66a0-383e-089e8e027636.png">
JUnit4でよく使うやつ個人用まとめ

# はじめに

[JUnit実践入門](https://www.amazon.co.jp/JUnit%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%8A%80%E6%B3%95-WEB-PRESS-plus/dp/477415377X)があれば何も問題ないんだけど、手元にない時が多いのでよく使う奴だけまとめておく。

# 基本

```java
@Test
public void test1() {
	String actual = "hoge";
	String expected = "hoge";
	assertThat(actual, is(expected));
}

@Test
public void test2() {
	String actual = null;
	assertThat(actual, is(nullValue()));
}

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}
```

`@Test`のアノテーションを付けたメソッドが実際のテストメソッド。`assertThat()`で期待値と実際の値を比較する。例では`is()`とか`nullValue()`を使ってるけど、他にも`not()`とかを使ったりする。

`@Before`は`@Test`の各メソッドが実行される前に、`@After`は`@Test`の各メソッドが実行された後に毎回実行される。DBへの接続と切断とか、各テストに共通する処理があればここで書いてやればいい。

`@BeforeClass`はすべての`@Test`メソッドが実行される前に一度だけ、`@AfterClass`はすべての`@Test`メソッドが実行された後に一度だけ実行される。`@BeforeClass`はテスト用のパラメータをプロパティファイルとかから拾ってくるときとかに使ってる。`@AfterClass`はあんまり使ってない気がする……。

例では`@Before`とかに何も書いてないけど、ここにも`assertThat()`でテストを記述できる。各処理の前、後での状態をテストしたりとかもできる。

# テストを複数に分ける場合

```java

@RunWith(Enclosed.class)
public class JUnitTest {

	public static class TestClass1 {
		@Before
		public void setUp() throws Exception {
			// TestClass1用の前処理
		}

		@After
		public void tearDown() throws Exception {
			// TestClass1用の後処理
		}

		@Test
		public void test() {
			String actual = "hoge";
			String expected = "hoge";
			assertThat(actual, is(expected));
		}
	}
	
	public static class TestClass2 {
		@Before
		public void setUp() throws Exception {
			// TestClass2用の前処理
		}

		@After
		public void tearDown() throws Exception {
			// TestClass2用の後処理
		}

		@Test
		public void test() {
			String actual = "fuge";
			String expected = "fuge";
			assertThat(actual, is(expected));
		}
	}

}
```

各テストで前処理とかが異なる場合はテストクラスに`@RunWith(Enclosed.class)`を付けたうえでインナークラスを作ればいい。
例では`TestClass1`と`TestClass2`で異なる前処理、後処理を実行できる。
便利なんだけど`@RunWith(Enclosed.class)`っていうアノテーションの書き方を毎回忘れる。

# 同じようなテストを繰り返す場合

```java

@RunWith(Theories.class)
public class JUnitTest {

	@DataPoints
	public static String[] actualValues = {"hoge", "fuge"};

	@Theory
	public void test(String actualValue) {
		int actual = actualValue.length();
		int expected = 4;
		assertThat(actual, is(expected));
	}

}
```

入力や出力の形式が同じようなテストが複数ある場合はある程度まとめてやったほうがすっきりする。
テストクラスには`@RunWith(Theories.class)`を指定し、テストメソッドには`@Test`ではなく`@Theory`を指定する。テストの入力や出力なんかは`@DataPoints`の配列にまとめておき、`@Theory`のメソッドの引数には`@DataPoints`で指定した型の値を指定しておけば、`@Theory`のメソッドが実行された際に`@DataPoints`の配列の個数だけテストが実行される。
python書籍のサンプルプログラム配布サイトの一覧

python書籍
データ分析のための機械学習入門: Pythonで動かし、理解できる、人工知能技術
http://www.sbcr.jp/support/13678.html
サイバーセキュリティプログラミング - pythonで学ぶハッカーの思考
https://github.com/yuki540net/cyber-security-python
パーフェクトPython
http://gihyo.jp/book/2013/978-4-7741-5539-5/support
いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで
https://book.impress.co.jp/books/1116101151
Python機械学習プログラミング 達人データサイエンティストによる理論と実践
https://github.com/rasbt/python-machine-learning-book/tree/master/code
実践力を身につけるPythonの教科書
https://book.mynavi.jp/supportsite/detail/9784839960247.html
Pythonによるスクレイピング&機械学習 開発テクニック
http://www.socym.co.jp/support/s-1079
みんなのPython第四版
http://coreblog.org/ats/stuff/minpy_support/samplecodes04/
しんせつなPythonプログラミング超初心者が初心者になるための本
http://www.shuwasystem.co.jp/support/7980html/4805.html
Pythonプログラミングのツボとコツがゼッタイにわかる本
http://www.shuwasystem.co.jp/support/7980html/4868.html
Python入門［2&3対応］
http://www.shuwasystem.co.jp/support/7980html/2655.html
Pythonスタートブック
http://gihyo.jp/book/2010/978-4-7741-4229-6/support
Pythonプロフェッショナルプログラミング 第2版
http://www.shuwasystem.co.jp/support/7980html/4315.html
独習Python 〜1日でプログラミングに強くなる〜
https://github.com/gothedistance/python-book
基礎 Python
https://book.impress.co.jp/books/1115101060
スラスラわかるPython
http://www.shoeisha.co.jp/book/download/9784798151090/detail
Pythonエンジニア ファーストブック
https://github.com/pyfirst
はじめてのPython AIプログラミング
http://www.shuwasystem.co.jp/support/7980html/4485.html
Pythonデータサイエンス ─可視化、集計、統計分析、機械学習─
http://www.ric.co.jp/book/contents/book_1058.html
詳解 ディープラーニング
https://github.com/yusugomori/deeplearning-tensorflow-keras
Pythonクローリング＆スクレイピング ―データ収集・解析のための実践開発ガイド―
http://gihyo.jp/book/2017/978-4-7741-8367-1/support
Pythonデータサイエンスクックブック
――対話型コンピューティングと可視化のためのレシピ集
https://github.com/ipython-books/cookbook-data


その他
Dive Into Python 3 日本語版
http://diveintopython3-ja.rdy.jp/index.html
ゼロからはじめるPython
http://news.mynavi.jp/series/zeropython/001/
Python でデータサイエンス
http://pythondatascience.plavox.info/
macOS Sierraクリーンインストール時の作業記録


# 久々のクリーンインストール
High Sierraのリリースも近づく中、HomeBrew環境が色々なインストールでカオス状態となったりの状態のため、整理し直そうと決心。
→ High Sierra環境にアップデートし、Python・Rodeo環境構築周りを追記しました。

まずはTimeMachineで現状をフルバックアップ。


# トラブりながらも何とかインストール完了
作成しておいたSierraのUSB起動ディスクからクリーンインストールを開始。
だが、Appleマーク画面のプログレスバーがフルになっても、そこから先に進まない。
別のUSBメモリでディスクを作り直しても、結果は同じ。

仕方がないので、El CapitanのUSB起動ディスクでクリーンインストール。
そこからApp Store経由でSierraアップデートするも、Appleマーク画面でSierraのダウンロードに失敗の表示が出てインストール中止。
もともとApp StoreでのSierraダウンロードは途中で失敗することがあり、それが再発した模様。

App Store経由は諦め、USB起動ディスク作成時にTime Machine保管してあった、`macOS Sierraインストール.app`を復元して、そこから無事クリーンインストール完了。


# 各アプリのデータ復元
クリーン度を保つために、移行アシスタントで余分なファイルまで戻さないよう、最小限の設定ファイルのみバックアップから個別に復元。

## Mail
Mail環境の復元は以下を参照
[macOS Sierra 標準メールアプリの全データバックアップと移行方法]
(http://blog.skeg.jp/archives/2016/11/mail-backup-sierra.html)


## メモ

```
~/Library/Containers/com.apple.Notes/Data/Library/Notes/
```


## iWeb

```
~/Library/Application Support/iWeb/
~/Library/Preferences/com.apple.iWeb.plist
```


## Kobito

```
~/Library/Containers/com.qiita.Kobito/
```


## MacNote3

```
~/Library/Application Support/MacNote3/
```


## Delicious Library 3

```
~/Library/Containers/com.delicious-monster.library3/
```


## Mactracker

```
~/Library/Application Support/com.mactrackerapp.Mactracker/
~/Library/Preferences/com.mactrackerapp.Mactracker.plist
```


## WebPatrol

```
~/Library/Application Support/com.macfeeling.WebPatrol/
~/Library/Preferences/com.macfeeling.WebPatrol.plist
```

## ユーザーフォント

```
~/Library/Fonts/
```


# 開発環境の再構築

## Xcode
App Storeから再ダウンロード。
Open Developer Tool -> More Developer Tools...から以下のCommand Line Toolsを再インストール。

```
Command_Line_Tools_macOS_10.12_for_Xcode_9.dmg
```

## Homebrew
[Homebrew公式サイト](https://brew.sh/index_ja.html)
上記からHomebrewをインストールして更新。この時点の環境をTime Machineバックアップしておく。

```
$ brew update
$ brew upgrade
```

## R
CRANからRをダウンロード&インストールすると、 `brew doctor` でWarning出まくりになるようなので、以下を参照して、RとRStudioをインストール。
[Mac OS X に Homebrew で R をインストールする](http://blog.amedama.jp/entry/2016/10/12/211749)
(追記) `/usr/local/Celler` のpermissionを変更

```
$ sudo chown -R $(whoami) /usr/local/Cellar
```

(追記2) X11依存のため、XQuartzをインストール
[XQuartzプロジェクト](https://www.xquartz.org/)

(追記3) plotでの文字化け対策
[RStudio for Mac OS X で日本語のプロットが上手くいかない場合の対処法](http://blog.0093.tv/2011/05/rstudio-for-mac-os-x.html)

(追記4) RStudioの更新

```
$ brew cask reinstall rstudio
```


## Python
Python3.6バージョンのAnacondaをダウンロード
https://www.anaconda.com/download/

~~ただし、直にAnacondaを入れるとHomebrew環境を壊すようなので、以下を参考に、先にpyenvから。
[pyenvを知らない僕がhomebrewの入ったmacにanaconda環境を構築した時のメモ](http://baikichiz.hatenablog.com/entry/2017/01/06/163942)~~

↑でもやはりWarningが出たので↓に変更。
[HomebrewとAnacondaの相性の悪さについて](http://yaritakunai.hatenablog.com/entry/2017/08/18/181000)

pyenvを経由せずanaconda直インストールのため、`.bash_profile` は以下の設定。これで `brew doctor` も静かになった。

```
export PATH="$PATH:/anaconda3/bin"
alias brew="env PATH=${PATH/\/anaconda3\/bin/} brew"
```

## Rodeo
続いてYhatからRStudioライクなIDEであるRodeoをダウンロード&インストール
https://www.yhat.com/products/rodeo

起動時にシステムの python2 を読みに行ってライブラリが無いと怒られるので、`I USE A DIFFERENT COMMAND FOR PYTHON` ボタンをクリックし、`python3` を指定。
以上でインストール完了。
RNN TensorFlow を実践


下記のURLの通りに試してみました。
https://deepage.net/deep_learning/2016/09/17/tflearn_rnn.html
![passenger.png](https://qiita-image-store.s3.amazonaws.com/0/160387/ee8dcec7-8ad0-0a23-4e4c-57afa79bd7e5.png)

＋実践の意味も含めて、csvのファイル箇所を変更し下記のデータを作成
詳細は割愛しますが週単位のデータから予測値を出しています。

![passenger_1.png](https://qiita-image-store.s3.amazonaws.com/0/160387/72bf5a3e-e3c3-d2ac-03a8-d3dd443f3694.png)


こうして考えると親しみがわきますね。