OmniAICreator/Qiita-1.07M huggingface dataset:
SQL文を整形する


# はじめに

コマンドラインからSQL文を整形できるツールを探していましたが、
あまり気に入ったものがなく困っていました。

以下のURLを見ると、HibernateのBasicFormatterImplクラスを使えば、
かんたんにSQL文を整形できることがわかりました。

- [Looking for an embeddable SQL beautifier or reformatter](http://stackoverflow.com/questions/312552/looking-for-an-embeddable-sql-beautifier-or-reformatter)


# Groovyの場合

Groovyの場合は非常に簡単で、１つのスクリプトファイルで実現できます。

```groovy
/**
 * 標準入力からSQL文を読み取り、整形したSQL文を標準出力に出力します。
 */

@Grab(group='org.hibernate', module='hibernate-core', version='5.2.3.Final')
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;

def formatter = new BasicFormatterImpl()

String original = System.in.text
String formatted = formatter.format(original)
println formatted
```

以下のように実行します。

```sh
echo "SELECT * FROM HOGE WHERE HOGE.FUGA = :fuga" | groovy sql-formatter.groovy
```

このように表示されます。

```txt
    SELECT
        * 
    FROM
        HOGE 
    WHERE
        HOGE.FUGA = :fuga 
```

# Javaの場合

依存ライブラリをMaven等で設定しておけば、Groovyとほぼ変りません。
少々コードが冗長に見えますが、起動速度はこちらのほうが速いです。

```java
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

public class SqlFormatter {

    public static void main(String[] args) throws IOException {
        Reader reader = new InputStreamReader(System.in);
        Writer writer = new OutputStreamWriter(System.out);

        int c;
        StringBuilder sql = new StringBuilder(1024);
        while ((c = reader.read()) != -1) {
            sql.append((char) c);
        }
        String original = sql.toString();
        String formatted = new BasicFormatterImpl().format(original);
        writer.write(formatted);
        writer.flush();
    }
}

```

# 全ソースコード

以下に配置しています。

- https://github.com/sambatriste/sql-formatter
jbuilderの使い方

何かと使う、JSON。
そしてRailsには、このJSON作成を簡単にしてくれる、Jbuilderというものが備わっています。
今回はこのJbuilderを使って、どのようにJSONを形成していくのかをまとめます。


##基本編(固定の値を返す)

```JS:
//{ key1: value1 }の形
json.set! :key1, 'value1'


json.key1 'value1'
```

```JS:
//{ key2: { key3: value3 } }の形
json.set! :key2 do
  json.set! :key3, 'value3'
end


json.key2 do
  json.key3 'value3'
end
```

```JS:
//{ key4: { key5: { key6: value6 } } }の形
json.set! :key4 do
  json.set! :key5 do
    json.set! :key6, 'value6'
  end
end

json.key4 do
  json.key5 do
    json.key6 'value6'
  end
end
```

こんな感じで、入れ子にしたい場合はdo~endの組を増やしていけばOK。

##中級編(モデルから値を取得し、JSONにして返す)

```JS:
//{ column1: value1, column2: value2 }の形
json.(@item, :column1, :column2)
```

```JS:
//{ key3: [{'column3': 'value3', 'column4': 'value4'},{'column3': 'value5', 'column4': 'value6' }] }の形
json.key3 @items do |item|
  json.column3 item.column3
  json.column4 item.column4
end
```

```JS:
//key5: { column5: value5, column5: value6 } の形
json.set! :key5 do
  json.(@item, :column5, :column6)
end
```

```JS:
//インスタンスのプロパティをkey、valueに使用する形  key6":{ property1: property2 }
json.key6 do |json|
  json.set! @item.property1, @item.property2
end
```

こんな感じ。
JSONに含む値を増やしたい場合は、基本的にcolumn◯の欄に色々追加していけばOK

##上級編

```JS:
//配列の形 [{ column1: value1, column2: value2 }, { column1: value3, column2: value4  }]

json.array! @items do |item|
  json.column1 item.column1
  json.column2 item.column2
end
```

```JS:
//単一インスタンスを全てJSONに {c1:v1, c2:v2, c3:v3 .........}
json.merge! @item.attributes
```


これで大体のことは出来るはず！
他に何か便利な使い方あったら教えて下さい。
RSpec3のvalidationテストで「undefined method `have' 」エラーを回避する

結論から書くと書き方が変わってしまったようです。
[https://github.com/yujinakayama/transpec](https://github.com/yujinakayama/transpec)の
> Conversion of `have(n).errors_on(:attr)` is not supported. 
 
の箇所に現在の書き方がかいてあります。

## 以前の書き方

```ruby
it 'full_nameがなければ無効' do
  profile = Profile.new(
      full_name: nil
  )
  expect(profile).to have(2).errors_on(:full_name)
end
```

## 現在の書き方

```ruby
it 'full_nameがなければ無効' do
  profile = Profile.new(
      full_name: nil
  )
  profile.valid?
  expect(profile.errors[:full_name].size).to eq(2)
end
```

## 参考
- [https://github.com/yujinakayama/transpec](https://github.com/yujinakayama/transpec)
TOPへ戻るボタン


デモ：http://codepen.io/mo4_9/pen/YGZVOL

DOM1つ`#js-gototop`でTOPへ戻るボタンをつくる

```css:style.css
$color-main: skyblue;
$tsize: 14px;

#js-gototop{
  position: fixed;
  cursor: pointer;
  right: 35px;
  bottom: 80px;
  z-index: 1;
  width: 45px;
  height: 45px;
  border: solid 1px $color-main;
}
#js-gototop::before{
  content: 'TOP';
  color: #fff;
  font-size: 14px;
  position: absolute;
  left: 55%; transform: translateX(-50%);
  bottom: 2px;
}
#js-gototop::after{
  content: '';
  display: block;
  margin: -8px auto 0;
  width: 0; height: 0;
  border-top: $tsize solid transparent;
  border-right: $tsize solid transparent;
  border-bottom: $tsize solid #fff;
  border-left: $tsize solid transparent;
}
```

閾値を越えたらボタンを表示

```javascript:Gototop.js
export default class Gototop {
  
  constructor (opts = {}) {

    this.$btn = opts.$btn || $(document.createElement("div"));
    this.isSP = opts.isSP || false;

    this.initListener();
  }

  initListener() {

    this.onScroll();
    this.onClick();
  }

  onScroll() {

    const THRESHOLD = 500;
    this.$btn.hide();

    $(window).on('scroll', () => {
      if (this.isSP) return;

      const scrollTop = $(window).scrollTop();
      if (scrollTop > THRESHOLD) {
        this.$btn.fadeIn();
      } else {
        this.$btn.fadeOut();
      }

    })
  }

  onClick() {

    this.$btn.on('click', () => {
      $('html,body').animate({
        scrollTop: 0 + 'px'
      }, 1000);
    })
  }
  
};
```
zlibをインストール（ソースからビルド）for RockyLinux 9.x

##はじめに
OS標準で入っているケースが多いzlibですが、OSの最小インストールなど状況によってはインストールされていないことがあります。
今回は、ソースからコンパイルしてインストールする方法をメモしておきます。
RockyLinuxは、RHEL互換OSのためAlmaLinuxなどのRHEL互換OSであればどれも同様に対応可能です。
2024年12月現在、zlibの最新版は「1.3.1」となります。

##環境
| プロダクト | バージョン |
|:-:|:-:|
|  zlib | 1.2.13 |

##プログラム入手先
http://www.zlib.net/

##インストール方法

```bash:インストール方法
cd /usr/local/src
wget https://www.zlib.net/zlib-1.3.1.tar.gz
tar xvzf zlib-1.3.1.tar.gz
cd zlib-1.3.1
./configure
make -j 8
make install
```

これで完了です。
自分用htmlメモ

#`<p>`タグ　一般的な段落
子要素及び子孫に段落を構成する要素を入れてはならない
`<div>,<p>,<ol>,<ul>,<table>,<pre>,<blockquote>`など

#`<ul>`タグ　非序列リスト
`<li>~</li>`で囲まれたリスト項目を箇条書きにするときに使う
`<ul>`タグの子要素は必ず`<li>`タグ

#`<a>`タグ　アンカーリンク
通常`<a href="hoge.html">リンクテキスト</a>`のように使う

```index.html
<ul>
  <li><a href="http://www.sbcr.jp" target="_blank">ホーム</a></li>
</ul>
```

外部リンクは上のように。
`target`属性を`target=_"blank"`とすると別のタブ、別のウィンドウで表示する


#`<img>`タグの書き方

```index.html
<h1><a href="index.html"><img src="images/logo.png" width="217" height="89" alt="KUJIRA cafe"></a></h1>
<ul>
```

上のように、<img>タグを使う。`src`と`alt`は必須
srcに画像のパスを指定する。外部リンクの時と同じ

#文字実体参照
`&copy;`が&copy;になるなど。
エスケープシーケンス的なもの。

#`<div>`タグ
要素をグループ化する。それ自体は表記になんの影響も与えないが、CSSでの編集を効率化できる。

#id,class
`id`は同一ドキュメントで１回まで
`class`同じドキュメントで何度でも

CSSやJSから参照するときに使われる

```index.html
<body>
<div class="wrapper">
  <h1 id="logo"><a href="index.html"><img src="images/logo.png" width="217" height="89" alt="KUJIRA cafe"></a></h1>
  <ul id="nav">
    <li><a href="http://www.sbcr.jp" target="_blank">ホーム</a></li>
    <li><a href="about.html">店舗案内</a></li>
    <li><a href="access.html">アクセス</a></li>
    <li><a href="menu.html">メニュー</a></li>
    <li><a href="contact.html">お問い合わせ</a></li>
  </ul>
  <div>
    <img src="images/keyvisual.jpg" width="900" height="362" alt="">
  </div>

  <h2>News</h2>
  <p>5月30日、『ここでしか飲めない！おいしいうれしい満喫カフェ』に掲載されました。</p>
  4月18日、KUJIRA cafeがオープンしました。ここ九寺楽の町で、
  皆さんが気軽に立ち寄れる、ゆったりと
  時間を過ごせる落ち着いた場所にしたいと思っています。</p>

  <div id="footer">
    <p>&copy;Copyright KUJIRA cafe. All rights reserved.</p>
  </div>
</div>
</body>
```

#コメント
<!-- コメント -->

#`<br>`タグと`<strong>`タグ
`<br>`  改行
`<strong></strong>`  重要
CSSを適用しない限り、太字で表示される。]

#ページの特定の場所にリンクする
```index.html
<h2 id="news">News</h2>
```

```about.html
<a href="index.html#news">News</a>
```

なお、`about.html`内でリンクするときは
`<a href="#news">News</a>`のようにする。


#テーブル
`<tr>~</tr>`が一行。
`<td>~</td>｀は通常のカラム
`<th>~</th>`は見出しカラム

一つの`<tr>`に含まれるカラムの数は`<table>`内のすべての`<tr>`で同数にする。

```access.html
<table>
  <tr>
    <th>住所</th>
    <td>〒199-9999 東京都新宿区１丁目(<a href="access.html">地図</a>)</td>
  </tr>
  <tr>
    <th>電話番号</th>
    <td>09-9280-2611</td>
  </tr>
  <tr>
    <th>営業時間</th>
    <td>10:00~22:00</td>
  </tr>
  <tr>
    <th>定休日</th>
    <td>水曜日・日曜日</td>
  </tr>
  <tr>
    <th>ご予約</th>
    <td>席のご予約を承っております。<br>
      貸切パーティは15名様から承っております。詳しくはお電話、もしくは<a href="contact.html">お問い合わせ</a>をご利用ください</td>
  </tr>
  </table>
```

#`<ol>`タグ

`<ol>`タグは序列リストを意味する。以下の例だと上から1. 2. 3. 4.が行頭につく。

```access.html
<ol>
    <li>駅東口を出ます。</li>
    <li>駅前商店街を国道999号線方面へ向かいます。</li>
    <li>国道999号線を渡り直進します。</li>
    <li>銀行ATMの角を左に曲がり2軒目の1階です。</li>
  </ol>
```
rainloopのインストール for CentOS 7.2

##はじめに 
今までWebMailといえば、SquirrelMailがメジャーで、新しい環境ではRoundCubeが有名でした。しかしGmailの登場と共に、Webインターフェースのリッチ化が進みユーザーからもGmailのようなインターフェースを望まれる機会が増えてきました。そのニーズにこたえるのが「rainloop」です。
現在の最新バージョンは、「1.10.4.183」です。

##導入条件
rainloopは、PHP5.3以上が必要となります。

##検証環境
| 製品 | バージョン |
|:-:|:-:|
| Apache  | 2.4.23  |
| PHP  | 8.1.2  |

##インストール

###ダウンロードして展開
```
cd /usr/local/src
mkdir rainloop
cd rainloop
wget http://repository.rainloop.net/v2/webmail/rainloop-community-latest.zip
unzip rainloop-community-latest.zip
mkdir /docs
mv rainloop /docs/

#権限設定をする
cd /docs/rainloop
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
```

###Apacheに設定する

```
vi /usr/local/apache2/conf/httpd.conf
```

```:httpd.conf
DirectoryIndex index.php
Alias /rainloop /docs/rainloop
```

Apacheを再起動

```
/usr/local/apache2/bin/apachectl restart
```

これで、設定は完了です。
あとは、ブラウザーでサーバーのIPアドレスで開きます。

管理者用画面は、「/?/admin」をつけてアクセスします。
http://サーバーのIP/rainloop/?/admin

|項目|値|
|--|--|
|初期管理者ユーザー|admin|
|初期パスワード|12345|

![image](https://qiita-image-store.s3.amazonaws.com/0/85495/ebaa2c2f-0765-ea1f-50dc-ab6c5a33c793.png)


言語の設定とパスワードを変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/6ea1624f-a5c7-2160-1477-778f9a92ae90.png)


パスワードのデフォルトは「12345」ですので、それを任意のパスワードに変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/dbd90295-c8ff-9fe6-380f-17ef137ddd37.png)

次にユーザーがIMAPでアクセスできるサーバーを設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/62a3a506-f3c9-661d-78db-c2ba9b54a605.png)

これで設定は終わりです。
ユーザー側のアクセスサイト「http://サーバーのIP/rainloop/」でログインし、
IMAPアカウントでログインすることで、通常のメールを読むことが可能となります。
RailsでLTSV形式でLogを出す

Gemとかあるのかもしれないけど、とりあえず自分で作ったものを使ってる

```ruby
module Utils
  class FormattedLogger
    class << self
      def create(path, taggers=nil)
        unless File.exist?(File.dirname(path))
          FileUtils.mkdir_p(File.dirname(path))
        end
        logger = Logger.new(path, taggers)
        logger.formatter = proc do |severity, datetime, progname, msg|
          log = []
          log << "pid:#{$PROCESS_ID}"
          log << "level:#{severity}"
          log << "datetime:#{datetime}"

          file_caller = caller.find { |item| item.include?("#{Rails.root}/app") }
          if file_caller.present?
            filename, line_num = file_caller.match(/(?<path>.*):(?<line_num>\d+)/).tap do |path_and_line_num|
              break [
                path_and_line_num['path'].gsub("#{Rails.root}", ''),
                path_and_line_num['line_num']
              ]
            end
            log << "filename:#{filename}"
            log << "line_num:#{line_num}"
          end
          case msg
          when Hash
            msg.each do |key, val|
              log << "#{key}:#{val}"
            end
          else
            msg_divided_uuid = msg.match(/^\[(.*)\](.*)/)
            if msg_divided_uuid
              log << "uuid:#{msg_divided_uuid[1]}"
              log << "message:#{msg_divided_uuid[2].strip}"
            else
              log << "message:#{msg}"
            end
          end
          "#{log.join("\t")}\n"
        end
        ActiveSupport::TaggedLogging.new(logger)
      rescue StandardError
        logger = ActiveSupport::TaggedLogging.new(ActiveSupport::BufferedLogger.new(STDERR))
        logger.level = ActiveSupport::BufferedLogger::WARN
        logger.warn(
          "Rails Error: Unable to access log file. Please ensure that #{path} exists and is chmod 0666. " \
          'The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.'
        )
        logger
      end
    end
  end
end

```

lib配下に置くと、 `config/application.rb` の読み込み中だとまだ読み込まれていないみたいなので、下記のような記載が必要

```
require File.expand_path('../boot', __FILE__)
$LOAD_PATH.push(File.join(File.dirname(__FILE__), "../lib")) ## 追加

require 'rails/all'
require 'utils/formatted_logger'　## 追加

module TestApp
  class Application < Rails::Application
    ## 追加する
    config.logger = Utils::FormattedLogger.create(config.paths['log'].first, 'weekly')
  end
end
```
iPhoneを横画面にした状態でキャプチャしようとして詰んだ話

今回も自分用
たぶんこれでなんとかなる

##やりたいこと

横画面にした時、カメラのViewの隣にTextViewを置きたい

![IMG_0966.PNG](https://qiita-image-store.s3.amazonaws.com/0/137949/1c548d19-7746-700c-e6e0-e15c0d7a227e.png)


スクショなのでちょっとわかりにくい
無事完成した


##参考にした記事
wift - iOSでビデオカメラを使用時、端末の向きに対応
http://qiita.com/flowtumn/items/9ad3c5554e5ade62a4eb

[Swift]AVFoundationでカメラを使う
http://qiita.com/ShinokiRyosei/items/f70c83a3ab4d22d00ebc


##詰んだ箇所
横画面にした時レイアウトがガバった![IMG_0959.PNG](https://qiita-image-store.s3.amazonaws.com/0/137949/0ee84485-1322-64c1-6adc-6db87b7c4252.png)


##原因
画面回転時にAVCaptureVideoPreviewLayerのサイズを横画面時のUIViewのサイズに合わせてなかった

普通に考えて設定し直さないとダメだよな…


##解決策
```swift:ViewController.swift
//画面の回転にも対応したい時は viewWillTransitionToSize で同じく向きを教える。
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        
        coordinator.animate(
            alongsideTransition: nil,
            completion: {(UIViewControllerTransitionCoordinatorContext) in
                //画面の回転後に向きを教える。
                if let orientation = self.convertUIOrientation2VideoOrientation(f: {return self.appOrientation()}) {
                    self.myVideoLayer.connection.videoOrientation = orientation
                    //ビューのサイズを再設定
                    self.myVideoLayer.frame = self.myCameraView.frame
                }
            }
        )
    }

```
UE 4.13 で作ったレベルを Android デバイス上で動かしてみた

UE 4.13 で作ったレベルを Android デバイス上で動かそうと思ったときの覚書です。

#公式ドキュメントはあるものの……

Android 開発のスタートアップガイドは UE4 の公式ドキュメントに用意されています。

[Android クイックスタート](
https://docs.unrealengine.com/latest/JPN/Platforms/Android/GettingStarted/index.html)

しかし、今回はこの手順は使いませんでした。
というのも……

* Unity を使う上で、Android SDK などのツール群を既に入れていた。
* 過去に公式ドキュメントどおりにやっても「Launch」のデバイス一覧に Android デバイスが列挙されなかったことがあった。

などの理由があったためです。

ですので、今回は公式ドキュメントに頼らずにやってみることにしました。

#今回やった手順

今回はこちらのサイトを参考にさせていただきました。

[UE4でAndroidアプリをビルドするには](https://framesynthesis.jp/tech/unrealengine/android/)

手順はすべてこのサイトに載っているとおりにやっています。
今回インストールしたものの一覧と、バージョンを下記に載せておきます。

|インストールしたもの|バージョン|
|:--|:--|
|JDK|8u102(windows x64)|
|Android Studio|2.2|
|Android SDK|Android 5.0(Lollipop)|
|Android NDK|13.0.3315539|
|Apache Ant|1.9.7|

#躓いたところとその解決策
この手順に従って「Launch」ボタンを押せば Android デバイス上でアプリが動くはずでしたが、自分の環境ではエラーが発生して動きませんでした……。

アウトプットログを調べてみたところ、以下のようなエラーが大量に発生していました。

```
LogPlayLevel: Error: Target id 'android-19' is not valid. Use 'android.bat list targets' to get the target ids.
```

**「android-19」**というのは、**「Project Settings」**にある**「Platforms - Android SDK」**の項目**「NDK API Level」**で設定している値です。
![ue413_android_00.png](https://qiita-image-store.s3.amazonaws.com/0/43814/32952ed5-fb1e-eebe-c831-7009ffb5de08.png)


この項目についてネットで調べてみたところ、AnswerHub で以下のような質問が見つかりました。

[AndroidのSDK API Levelの設定値について](
https://answers.unrealengine.com/questions/263269/android%E3%81%AEsdk-api-level%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%80%A4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html)

これを見たときに**「SDK と NDK の API レベルが合ってないのでは？」**と思い、**「NDK API Level」**の値を「Android 5.0」の API レベル「21」に合わせて**「android-21」**に変更してみました。

その結果、無事に Android デバイス上で動くようになりました！

#補足
##「android-19」で動かなかった理由
この理由はいたって簡単。

**「Android 4.4」の SDK をインストールしていなかった**

でした。

**「Project Settings」**にある**「Platforms - Android SDK」**の項目**「SDK API Level」**に**「matchndk」**を指定すると、「NDK API Level」に設定されている値を元に「SDK API Level」の値を決めていたみたいです。
![ue413_android_02.png](https://qiita-image-store.s3.amazonaws.com/0/43814/3692d363-9140-c8b7-88b8-ee881c0933e9.png)


今回の**「android-19」**の場合、**「SDK API Level」**に**「Android 4.4」**が指定されるような値になっていたらしく、「Android 4.4」の SDK がインストールされてない環境ではエラーになっていた、ということらしいです。

ちなみに、「Android 4.4」の SDK をインストールしたら、「android-19」でも動くようになりました。

##「Launch」のデバイス一覧に Android デバイスが表示されなかった理由
この理由もいたって簡単。

**「Project Settings」にある「Platforms - Android SDK」の項目「Location of ～」に値が設定されていなかった**
![ue413_android_01.png](https://qiita-image-store.s3.amazonaws.com/0/43814/d74e51f2-6c83-f06e-cbad-9743c07cb4dc.png)


でした。

ただし、この表示にも段階があるようで……

* **「Location of Android NDK」**を設定すると、**「No Devices Found」**になる。
* **「Location of Android SDK」**を設定すると、デバイスが表示される。

と言った挙動になってました。

##環境変数について
UE4 の公式ドキュメントに以下のようなものがあります。

[Android ゲームの開発のリファレンス](https://docs.unrealengine.com/latest/JPN/Platforms/Android/Reference/index.html)

ここを見ると

**TADP をインストールしていない場合、環境変数が正しく設定されているか確認する必要があります。**

と言った記述がありますが、今回試した際はこれらの環境変数がなくても動いていました。
（ドキュメント自体は 4.9 時代のものなので、仕様が変わったのではないか？と思われます。）
Windows 10(開発者モード)のsshdを停止させる方法

Windows10でBash on Ubuntu on Windowsを使うには、開発者モードへの切り替えが必要ですが、その際、sshd(SshProxy, SshBroker)がサービスとして追加されてしまうようです。

# 弊害
SSHを用いて外部からアクセスできるようになるため、セキュリティ面でのリスクとなってしまいます。

#対策
管理者権限でコマンドプロンプトを起動し、以下のコマンドを入力することで、サービスを停止させます。

```bat
sc stop SshProxy
sc config SshProxy start= disabled
sc stop SshBroker
sc config SshBroker start= disabled
```

#参考文献
* [Windows10 Anniversary updateで知らぬ間にSSHdが起動している : やすひでぶろぐ](http://yasuhide.blog.jp/archives/48155574.html)
* [Windows 10で始めるBash (8) インターネットショートカットファイルを作成する - エキサイトニュース(3/4)](http://www.excite.co.jp/News/it_biz/20160822/Cobs_496783.html?_p=3)
Firebase CLIの deploy でstorageのRulesもデプロイする設定

firebase-cliはホスティングだけではなくセキュリティルールもファイルで管理してデプロイする機能があります。
この機能のおかげでセキュリティルールをバージョン管理することができます。

firebase initでプロジェクトを作る時に何故かdatabaseのセキュリティルールしか聞かれないし `database.rules.json` しか作られません

ストレージのルールはデプロイできないのかなと思ったのですがコードを読むとストレージのセキュリティルールもデプロイできそうだったので 試したらできました。

まず適当な名前でストレージのセキュリティルールを書いたファイルを作ります。
今回は`storage.rules`という名前で作成しました。

```text:storage.rules
service firebase.storage {
  match /b/firebase-demo.appspot.com/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}
```

バケットネームは適宜読み替えてください

そして以下の`firebase.json`を書き換えます。

```json:firebase.json
{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "app",
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

これに`storage`を追加します。

```json:firebase.json
{
  "database": {
    "rules": "database.rules.json"
  },
  "storage": {
    "rules": "storage.rules"
  },
  "hosting": {
    "public": "app",
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

後は `firebase deploy`でデプロイが可能です。

# まとめ

そのうちドキュメントに追加されるかもしれませんが（もしかしたらどっかにあるのかもしれないけど） とりあえずこんな感じで
Android StudioでAndroid Bootstrapを使うメモ

## メモ
モジュールを追加(1)して、フォルダに必要なファイルを入れる(2)(3)


## 参考
(1)AndroidのボタンデザインにはBootStrapを使おう！(使い方) | Android開発・エラー置き場 
http://android.tecc0.com/?p=127

(2)[Android Tips] 2つの Android Bootstrap で爆速開発！ ｜ Developers.IO
http://dev.classmethod.jp/smartphone/android/android-bootstrap/

(3)Android Studioでassetsフォルダを追加する - 日々精進
http://anton0825.hatenablog.com/entry/2014/11/27/000000
Open VPNに突然繋がらなくなったMacユーザー

El Capitan以降のアップデートで、System Integrity Protection(SIP)により突然VPNに繋がらなくなることがあります。SIPをdisabledにすると直ります。

解決方法は、
1. ターミナルから csrutil status と打って、enabled となっていることを確認する。
2. 再起動して起動音の後に、command + Rを長押しで、リカバリメニューに入る。
3. ユーティリティからターミナルを開いて、csrutil disable; rebootと打つ。
4. 起動後、ターミナルから csrutil status と打って、disabled となっていることを確認する。
AndroidのテザリングにRaspberry Piから接続する


/etc/wpa_supplicant/wpa_supplicant.confを下記のように設定する

~~~
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
  ssid="my_ssid"
  psk="my_passwd"
  proto=RSN
  key_mgmt=WPA-PSK
  pairwise=CCMP
  auth_alg=OPEN
}
~~~


[参考URL](http://raspberrypi.stackexchange.com/questions/30236/wpa-supplicant-conf-for-android-hotspot)
Railsにbootstrap-sassを導入

Railsに、bootstrap-sassを導入する手順をメモ。基本ドキュメントに書いてある通り。
参考URL: [Bootstrap for Sass](https://github.com/twbs/bootstrap-sass) 

##① gemのインストール
1. Gemfileに以下の記述を追加
```gem 'bootstrap-sass', '~> 3.3', '>= 3.3.7'```

2. インストールの実行
```bundel install```

##② application.cssに記述を追加
1.```app/assets/stylesheets/application.css```を ```application.scss```にリネーム
2.```application.scss```に以下の記述を追加

```
@import "bootstrap-sprockets";
@import "bootstrap";
```

以上。
【TechShop Tokyo】大判プリンターのカット

# 手順1 紙をセット

マーカーが機械に対して並行になるように紙をセットします。

![pre01.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/96ae07d1-17d9-4d19-f44f-1b9cfea72d1d.jpeg)

固定ロールの一番最後のものが、紙の端に来ている事を確認します。

![pre03.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/7d05c62f-52de-083f-7d30-14948a4cb1c8.jpeg)

レバーを引いて固定します。

![pre01_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/b1ac17d7-b87a-7118-8fac-4a2fa518f0bc.jpeg)

上のボタンを押してババを計測します。

![pre02.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/fb0e340a-ab3e-7af1-5746-10e222c61b5f.jpeg)

計測に成功すると画面のアイコンをクリックする事で、長さが取り込まれます。

![pre02_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/1cbe35be-50c6-cef9-2ee9-9858a022f10e.jpeg)

# 原点合わせ

上下左右キーを押して原点合わせをおこないます。

![pre04.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/8788a615-c8db-552e-efa8-e13851adbf50.jpeg)

金のカット口と、マーカーの角が合わさるようにします。マーカーの内側のギリギリのところに金のカット口の先端がくるとOKです。

![pre05.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/06587a58-6de3-3d36-5aab-d5decc3c1fcb.jpeg)

Enterを押して、原点を決定します。

![pre06.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/026cd6b1-d3a5-1441-40e7-ecd980c5e7cf.jpeg)

# カット開始

送信ボタンを押すと、マーカーの認識が始まり、認識に成功するとカットが始まります。

![pre07.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/9ad6ccf7-d272-1d6d-5020-67740ca54c7c.jpeg)
subvolume沢山

![VirtualBox_openSUSE_08_10_2016_18_25_57.png](https://qiita-image-store.s3.amazonaws.com/0/33063/1ec2ee51-a6c8-7325-7646-65844880df79.png)

@/boot
@/boot
@/home
@/opt
@/tmp
@/usr/local
@/var/crash
@/var/lib/libvirt/images (option "no copy on write")
@/var/lib/mailman
@/var/lib/mariadb (option "no copy on write")
@/var/lib/mysql (option "no copy on write")
@/var/lib/named
@/var/lib/pgsql (option "no copy on write")
@/var/log
@/var/opt
@/var/spool
@/var/tmp
snapperの出力はずれるね

```
henrich@x121e:~> snapper ls
種類 | # | 前 # | 日付                            | ユーザ | クリーンアップ | 説明                | ユーザデータ
-------+---+-------+-----------------------------------+-----------+-----------------------+-----------------------+-------------------
single | 0 |       |                                   | root      |                       | current               |                   
single | 1 |       | 2016年09月12日 06時20分54秒 | root      |                       | first root filesystem |                   
single | 2 |       | 2016年09月12日 06時54分04秒 | root      | number                | after installation    | important=yes     
pre    | 3 |       | 2016年09月12日 08時08分29秒 | root      | number                | zypp(zypper)          | important=no      
post   | 4 | 3     | 2016年09月12日 08時08分36秒 | root      | number                |                       | important=no      
henrich@x121e:~> LANG=C snapper ls
Type   | # | Pre # | Date                     | User | Cleanup | Description           | Userdata     
-------+---+-------+--------------------------+------+---------+-----------------------+--------------
single | 0 |       |                          | root |         | current               |              
single | 1 |       | Mon Sep 12 06:20:54 2016 | root |         | first root filesystem |              
single | 2 |       | Mon Sep 12 06:54:04 2016 | root | number  | after installation    | important=yes
pre    | 3 |       | Mon Sep 12 08:08:29 2016 | root | number  | zypp(zypper)          | important=no 
post   | 4 | 3     | Mon Sep 12 08:08:36 2016 | root | number  |                       | important=no 
```
![Terminal - henrich@x121e:~_002.png](https://qiita-image-store.s3.amazonaws.com/0/33063/8c2a31ad-1328-32a1-1daf-472f7055e478.png)
![Terminal - henrich@x121e:~_001.png](https://qiita-image-store.s3.amazonaws.com/0/33063/eabf27ee-a9d0-4430-db19-63b894dae640.png)
gulp.watchのタスクのあるプロジェクトをGitで管理するときに気をつけたいこと

やっぱりどう考えてもQiitaが日本で一番好き。tattです。

昨今のwebのモダンな開発環境では、タスクランナーにgulp、バージョン管理にGitを導入されて、ワンチャン狙ってる方も多いかと思います。
gulp.watchの甘い誘惑に見事に引っかかってしまったので、甘い言葉にはもうだまされないぞ！

「gulpとGitを併用するプロジェクトで気をつけたいこと -2016 夏の面影-」、tatt開催しまーす！！！


# 環境
OSX 10.10.5
Git 2.9.3
gulp 3.9.1


# gulp.watchの甘い誘惑
タスクランナーでgulpを導入されてる方のほとんどは、このタスクを使ってるケースが多いのではないでしょうか。
sass→cssのコンパイル、JavaScriptのバンドル、BrowserSyncなどを`ファイル変更をwatch`させて自動で変更差分をブラウザに反映させてたりしますよね。
この`ファイル変更をwatch`、いいですよね！
ですが、watchタスクを止めずに`$ git checkout branch_name`で別ブランチにcheckoutするとどうでしょうか。

はい、`branch_name`配下のファイルがwatchされてしまい、さっきまでのブランチとの差分があった場合、したくもないコンパイルが走りますよね。
`$ git checkout file_name`で戻せますが、面倒ですよね。

# ブランチの切替時にgulpをstopさせる
単純に、`$ git checkout branch_name`前にgulpタスクをstopさせれば良い。

## ヒューマンエラーは防げない
ターミナルやitermなどでgulpのタスク実行とは別のタブでgitコマンドを実行させてしまった…など、ヒューマンエラーは防止が難しいケースがあるかと思います。

# シェルスクリプトの関数を利用する
お使いの`.bash_profile`や`.bashrc`、`.zshrc`などに

```
# gulpをとめてからgit checkoutする
function gcheckout () {
  killall gulp && git checkout $1
}
```

としておけば、

```
$ gcheckout branch_name
```
これで、gulpタスクをstopさせた後にブランチ切り替えができます。

## 新規ブランチ作成への応用

```
# gulpをstopしてから(新規ブランチ)にgit checkoutする
function gnewbranch () {
  killall gulp && git checkout -b $1
}
```

としておけば、

```
$ gnewbranch branch_name
```
これで、gulpタスクをstopさせた後に新規ブランチを作成し切り替えます。

# まさかり募集
もっと良い方法をご存知であればお願いします。。

# THANX & BIG UP‼︎‼︎
* [シェルスクリプトで関数を利用するシェルスクリプトで関数を利用する](http://qiita.com/kaw/items/034bc4221c4526fe8866)
TensorFlow > cuDNN v4.0のアンインストール / cuDNN v5.1のインストール

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
```

http://qiita.com/7of9/items/94c33411891decfdd8d4
にて出たエラーの対応。

経緯としては

- TensorFlow v0.8とCUDA v7.5, cuDNN v4をインストール
- TensorBoardが表示されない問題対応のため、TensorFlow v0.11をインストール
- 上記リンクのエラーが出ることに気づいた

cuDNNのバージョンを上げてみる。

### cuDNN v4 のアンインストール

uninstallの方法は検索してもはっきりしなかった。
インストールと反対の方法をとってみた。

```
$sudo rm /usr/local/cuda/include/cudnn.h

$ls /usr/local/cuda/lib64/libcudnn*
/usr/local/cuda/lib64/libcudnn.so    /usr/local/cuda/lib64/libcudnn.so.4.0.7
/usr/local/cuda/lib64/libcudnn.so.4  /usr/local/cuda/lib64/libcudnn_static.a

$ sudo rm /usr/local/cuda/lib64/libcudnn*

```

### cuDNN v5.1のインストール

```
$ tar xvzf cudnn-7.5-linux-x64-v5.1.tgz 
cuda/include/cudnn.h
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.5
cuda/lib64/libcudnn.so.5.1.3
cuda/lib64/libcudnn_static.a
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
$ ls -l /usr/local/cuda/lib64/libcudnn*
-rwxr-xr-x 1 root root 60696704 10月  9 11:18 /usr/local/cuda/lib64/libcudnn.so
-rwxr-xr-x 1 root root 60696704 10月  9 11:18 /usr/local/cuda/lib64/libcudnn.so.5
-rwxr-xr-x 1 root root 60696704 10月  9 11:18 /usr/local/cuda/lib64/libcudnn.so.5.1.3
-rw-r--r-- 1 root root 59715990 10月  9 11:18 /usr/local/cuda/lib64/libcudnn_static.a
```
Xaml (WPF) の中に C# script を記述する その2

[前の記事](http://qiita.com/gaya_K/items/64f2de71d1e7b525e956) に少し手を加えました。

作成したソースは [GitHub](https://github.com/gayaK/ScriptOnXaml) で公開しています。

今回は、`TriggerAction` に加えて `IValueConverter`, `ICommand` も実装してみました。
Converter と Command はマークアップ拡張にできるので、ワンライナーで書くのがいいと思います。

# 使用例

## [ScriptCommand](https://github.com/gayaK/ScriptOnXaml/blob/master/ScriptOnXaml/ScriptCommand.cs)
バインドした `ComandParameter` を `Prm` としてスクリプト内で扱えます。

この例ではクリック時にウィンドウを最大化させます。

```xml
<Window Name="wnd">
  <Button Command="{script:ScriptCommand 'Prm.WindowState = WindowState.Maximized'}"
          CommandParameter="{Binding ElementName=wnd}" />
</Window>
```

## [ScriptConverter](https://github.com/gayaK/ScriptOnXaml/blob/master/ScriptOnXaml/ScriptConverter.cs)
変換前の値を `Value` としてスクリプト内で扱えます。

この例ではウィンドウが最大化しているときにボタンを無効にします。

```xml
<Window Name="wnd">
  <Button IsEnabled="{Binding ElementName=wnd,
                              Path=WindowState,
                              Converter={script:ScriptConverter 'Value != WindowState.Maximized'}}" />
</Window>
```

## [ScriptAction](https://github.com/gayaK/ScriptOnXaml/blob/master/ScriptOnXaml/ScriptAction.cs)
バインドした `Arg1` ～ `Arg4` をスクリプト内で使えるようになってます。
ちなみに `Arg0` は `TriggerAction<>.AssociatedObject` です。

この例では入力状況によってメッセージボックスの内容を変化、
さらにボタンの文字列をクリック回数によって変更しています。

```xml
<TextBox Name="tbFirstName" />
<TextBox Name="tbFamilyName" />
<Button Content="Click">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <script:ScriptAction Arg1="{Binding ElementName=tbFirstName}"
                           Arg2="{Binding ElementName=tbFamilyName}">
        static int i = 0;
        Arg0.Content = string.Format("Clicked ({0})", ++i);

        if (string.IsNullOrWhiteSpace(Arg1.Text))
        {
          MessageBox.Show("Please enter your first name.");
          Arg1.Focus();
        }
        else if (string.IsNullOrWhiteSpace(Arg2.Text))
        {
          MessageBox.Show("Please enter your family name.");
          Arg2.Focus();
        }
        else
        {
          MessageBox.Show(string.Format("Hello {0} {1}!!", Arg1.Text, Arg2.Text));
        }
      </script:ScriptAction>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>
```
TensorFlow > E tensorflow/stream_executor/cuda/cuda_dnn.cc:368] Loaded runtime CuDNN library: 4007 (compatibility version 4000) but source was compiled with 5103 (compatibility version 5100).   > cuDNN v5.1インストールで解消

http://blog.brainpad.co.jp/entry/2016/02/25/153000
のコードを勉強中。

gpuの設定を自分が使う`with tf.device("/gpu:0"):`に変更した。

実行すると以下のエラーがでた。

```
$ python sample02.py 
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
name: GeForce GTX 750 Ti
major: 5 minor: 0 memoryClockRate (GHz) 1.202
pciBusID 0000:01:00.0
Total memory: 2.00GiB
Free memory: 1.56GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 750 Ti, pci bus id: 0000:01:00.0)
E tensorflow/stream_executor/cuda/cuda_dnn.cc:368] Loaded runtime CuDNN library: 4007 (compatibility version 4000) but source was compiled with 5103 (compatibility version 5100).  If using a binary install, upgrade your CuDNN library to match.  If building from sources, make sure the library loaded at runtime matches a compatible version specified during compile configuration.
F tensorflow/core/kernels/conv_ops.cc:526] Check failed: stream->parent()->GetConvolveAlgorithms(&algorithms) 
中止 (コアダンプ)
```

cuDNN 4を使うようにする、とあるが調査中。
https://github.com/tensorflow/tensorflow/issues/3079
> PeterDrake commented on 1 Jul
> Telling it to use cuDNN 4 did the trick! Thanks!


http://qiita.com/7of9/items/ccba0e0945b475cf1f3a
においてTensorFlow v0.8ではTensorBoardが表示されなかった。
TensorFlow v0.11に上げたことにより、CuDNNとの互換性が崩れたようだ。

CuDNNのバージョンを上げるか、上記リンクの対処をするか。

### 対策

http://qiita.com/7of9/items/b10d92ebe3e1f79f31c2
の記載の通りcuDNN v4をアンインストールして、cuDNN v5.1をインストールしたらエラーが出なくなった。
Laravel 5.3の認証関連機能で新規登録・ログイン・ログアウト後のリダイレクト先を指定する方法


## やりたいこと

* php artisan make:authで認証関連機能を生成すると、新規登録・ログイン後は「/home」へ、ログアウト後は「/」へリダイレクトされるが、これを変更したい。


## 前提
*　php artisan make:authで作成した認証関連機能であること

## 参考

* [Larave 5.2と5.3でphp artisan make:authした時に生成される認証関連機能のControllerにだいぶ差異があって困惑した話](http://qiita.com/LowSE01/items/ba2403e056d7a9151504) 


## 設定方法

### 新規登録後のリダイレクト先を変更する

* RegisterControllerの$redirectToプロパティを変更する

	``` php:app/Http/Controller/Auth/RegisterController.php
	<?php
	
	namespace App\Http\Controllers\Auth;
	
	//...
		
	class RegisterController extends Controller
	{
	
		//...
		
		protected $redirectTo = '/redirect/path/to/after/regist/';	//ここを変更	
	
		//...
		
		public function __construct()
		{
			//環境別に切り替えるロジックなどが必要な場合、__construct内で指定してもOK
			$this->redirectTo = your_function('/redirect/path/to/after/regist/');
			
			// ...
		}
	
		//...
	}
	
	```

### ログイン後のリダイレクト先を変更する

* LoginControllerの$redirectToプロパティを変更する

	``` php:app/Http/Controller/Auth/LoginController.php
	<?php
	
	namespace App\Http\Controllers\Auth;
	
	//...
		
	class LoginController extends Controller
	{
	
		//...
		
		protected $redirectTo = '/redirect/path/to/after/regist/';	//ここを変更	
		
		//...
		
		public function __construct()
		{
			//環境別に切り替えるロジックなどが必要な場合、__construct内で指定してもOK
			$this->redirectTo = your_function('/redirect/path/to/after/regist/');
			
			// ...
		}
	
		//...
	}
	
	```

### ログアウト後のリダイレクト先を変更する

* LoginControllerでlogout()メソッドをオーバーライトする
	
	``` php:app/Http/Controller/Auth/LoginController.php
	<?php
	
	namespace App\Http\Controllers\Auth;
	
	// ...
	
	use Illuminate\Http\Request;
	
	class LoginController extends Controller
	{
		//...
		
		//AuthenticatesUsersトレイトで定義されたlogout()をオーバーライト。
		//最終行のreturn redirect();の内容を変更する。
		public function logout(Request $request)
		{
			$this->guard()->logout();
	
			$request->session()->flush();
	
			$request->session()->regenerate();
	
			return redirect('/redirect/path/to/after/regist/');
		}
	}
	
	```
borgWarp > このタグについて

タグの説明。

numerical light scattering simulationの計算コードを少し速く処理できるようにしたい。

どれくらい速くかというと

- supercomputerで3ヶ月かかっている計算をPC上で数時間にしたい
   - 時間だけの単純計算: 3month * 30day * 24h / 3h = 720倍
   - supercomputerと10万円のPCの性能比率: 不明だが100倍くらい?

もうひとつ条件として

- 粒子数をふやしたい
   - ぶどうの房のような形状を考える
   - 上記の結果は粒子数が1000程度
   - 粒子のサイズは`波長 /2pi`程度
   - 粒子数を100万個にしたい
   - 粒子数を2倍にすると、だいたい計算時間は10倍くらいかかる
   - 粒子数による比率
        - 100万個 / 1000個 = 1000
        - log2(1000) = 10
        - 10 * log2(1000) = 100
   
上記の合計で720 * 100 * 100 = 7,200,000倍くらい速くできればいい。
(メモリの制限は検討されてない）。

2008年の3月に目標として立てて、下準備ばかりしているが、自分のライフワークとしていつか成し遂げたいと思う。

Voyagerが最高速ワープスピードで75年かかるデルタQuadrantに飛ばされたのと状況は似ているかもしれない。

FPGA, GPGPU, CNN, TensorFlow, Weta DigitalのSH cacheの概念、T-Matrix, SH-Matrixの概念、など使えそうなものはどんどん使う。

僕より数億倍頭のいいあの人らがもっとスマートな方法を開発するだろうが、自分は自分のやり方でやってみようかと思って8年7ヶ月が経過した。
彼らの開発に上乗せできる方法を開発できれば、成果が上がりやすい。

### 計算間違い

- 粒子数をふやしたい
   - ...
   - 粒子数による比率
        - 100万個 / 1000個 = 1000
        - log2(1000) = 10
        - 10 * log2(1000) = 100

は間違いで
  
- 粒子数をふやしたい
   - ...
   - 粒子数による比率
        - 100万個 / 1000個 = 1000
        - log2(1000) = 10
        - 10 ^ log2(1000) = 100億

720万倍 * 億。

。。。
とりあえず720万倍だけ目指すことにした by やる気のない7of9
Tensorflow > TensorFlowを遊び倒す！ 2-1. MNIST For Experts > コードの間違い

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
```

http://blog.brainpad.co.jp/entry/2016/02/25/153000
に記載のコード。

```
    return tf.nn.max_pool(x,
                          ksize=[1, 2, 2, 1],
                          strides=[1, 2, 2, 1],　# 真ん中2つが縦横のストライド
                          padding='SAME')
```

のコメント#の前に全角の空白があるので、そのまま実行するとエラーになる。

> $ python sample02.py 
>  File "sample02.py", line 36
>    strides=[1, 2, 2, 1],　# 真ん中2つが縦横のストライド
>                         ^
>SyntaxError: invalid syntax


全角の空白を半角空白に変えたらエラーがなくなった。


> もし応用編の要望や間違いがあった場合は、弊社Twitterアカウントの@BrainPad_PRまでご連絡をお願いいたします。

twitterアカウントは取らない方針なので、連絡手段は不明。
TensorFlow > cross_entropyの定義 > tf.reduce_sum()の使い方の違い > インデックス１の総和の平均 / すべての総和


http://blog.brainpad.co.jp/entry/2016/02/12/163100
と
https://www.tensorflow.org/versions/r0.11/tutorials/mnist/beginners/index.html
にてTensorFlowを勉強中。

braindPadさんのコードとtensorflow.orgのコードでreduce_sum()の使い方が若干違っている。

```txt:atBrainPad
# 誤差関数の交差エントロピー誤差関数を用意
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
```

```tensorflow.org
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
```

後者の方ではインデックス1で総和をとった値のリストから平均を取る。
前者の方ではすべての値の総和を取る。

この違いが結果にどう影響するかは未消化。
Cloud9ワークスペースにimagemagickを導入するためのメモ

Cloud9でRailsアプリケーションを開発中に、画像アップロード機能追加のために[paperclip](https://rubygems.org/gems/paperclip/versions/4.3.6)を導入しようとすると、[imagemagick](http://www.imagemagick.org/script/index.php)が見つからないよ！と怒られたので解決方法をメモ。

参考URL: [Install Imagemagick](https://community.c9.io/t/install-imagemagick/3608)

##環境
 - Cloud9のRubyワークスペース
 - Ruby　バージョン2.3.0
 - Rails バージョン4.2.5

##ライブラリのアップデート
```
sudo apt-get update
```
##コマンド実行
```
sudo apt-get install imagemagick
```
以上.無事に[imagemagick](http://www.imagemagick.org/script/index.php)の導入が完了し、[paperclip](https://rubygems.org/gems/paperclip/versions/4.3.6)が正常動作するようになりました。
zshの地味に便利なファイル名グロブ(glob)


zshを使い始めて、これは便利だと感動したファイル名グロブ(ワイルドカードを使ってファイル名のパターンマッチを行う)

## **

`**` は、`*` `*/*` `*/*/*` ... と任意の回数繰り返したパターンを表し、つまり、サブディレクトリを再帰的にtxtファイルを探して指定することになる。

```zsh
% grep 検索文字列 **/*.txt
```

## {,}

複数の文字列をOR条件のように指定する場合に使用。`{}`の中にマッチさせたい文字列をカンマ区切りで指定して使う。

```zsh
% grep 検索文字列 README_{en,ja}.txt
# grep 検索文字列 README_en.txt README_ja.txt と同じ

% mv src/dir/{tmp,file}.txt
# mv src/dir/tmp.txt src/dir/file.txt と同じ

% grep 検索文字列 **/*.{css,html} 
# grep 検索文字列 **/*.css **/*.html と同じ
```

`{,}`は正確にはファイル名グロブではなくブレース展開と呼ばれる。ファイル名グロブは存在するファイル名に置き換わるが、ブレース展開はファイルとして存在するかは関係なく、単純に文字列として展開する。

## 事前に展開して確認
`Tab`でファイル名グロブが展開されて実際のファイル名に置き換わる。

```zsh
% rm *.txt #ここでTabを押す
% rm README.txt file1.txt file2.txt #問題なければそのままEnter
```

元のワイルドカードに戻す場合は`Ctrl`+`x``u`(Ctrl+xの後、Ctrlを離してuを押す)

```zsh
% rm *.txt #ここでTabを押す
% rm README.txt file1.txt file2.txt #ここでCtrl+x uを押す
% rm *.txt
```

これなら、rmなど取り返しのつかないコマンドを実行する時も確認しながら実行できますね。

### 参考
WEB+DB PRESS vol.83 「zsh大活用」
VirtualBox で cloud-init を使う

# VirtualBox で cloud-init を使う
CentOS などの cloud image を VirtualBox から利用する際に cloud-init を使ってログインパスワードの設定などを行う方法をまとめる。[^1]

## イメージファイルを vdi 形式に変換
OpenStack 等で動作する仮想マシンイメージは http://cloud.centos.org/centos/7/images/ から入手できる。例えば以下のコマンドで raw 形式のイメージファイルを VirtualBox の仮想ディスクの vdi 形式に変換する。

```VBoxManage convertdd CentOS-7-x86_64-GenericCloud-1608.raw CentOS-7-1608.vdi```

## cloud-init の設定内容を iso イメージにする
以下の内容で `meta-data`, `user-data` の２つのファイルを作成

```file:meta-data
instance-id: host0001
local-hostname: host0001.example.com
```

```file:user-data
#cloud-config
password: 3Ggpx4Qiy
ssh_pwauth: True
chpasswd: { expire: False }

ssh_authorized_keys:
-  public key の内容をここに書く
```

以下のコマンドにより、上記の2ファイルで構成される iso イメージを作成

```
genisoimage -output init.iso -volid cidata -joliet -rock user-data meta-data
```

## VirtualBox の Storage 設定で iso イメージを指定
VirtualBox で新規に仮想マシンを作成後、 "Machine" > "Settings..." のメニューから "Storage" をクリックし、 Optical Drive として iso イメージファイルを設定する。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/50585/4f560e51-2400-0d55-8db7-c3958ecbb220.png)

これで CentOS の cloud image を VirtualBox で利用できるようになる。

### OpenStack 環境への移行
パッケージ追加・設定などを行ってカスタマイズした仮想マシンイメージを OpenStack 等で利用するには、 `qemu-img` コマンドで vdi 形式から直接 qcow2 形式に変換すればよい。

```
qemu-img convert -f vdi -O qcow2 CentOS-7-1608.vdi CentOS-7-1608.qcow2
```

[^1]: 多くの cloud image はデフォルトで SSH パスワード認証を無効化しているため、 VirtualBox でイメージを起動してもログインすることができません。
Bluemix：簡易ETLサービスDataWorks、改め、DataConnect！（名前が変わった＋ちょっと機能増えた）

DataWorksという名前だったサービスが**DataConnect**に名前が変わったみたい。
![スクリーンショット 2016-10-09 9.03.20.png](https://qiita-image-store.s3.amazonaws.com/0/119378/478443f7-5f63-5d25-c649-dd2312a3aa40.png)

（どんなサービスかの紹介は以下記事を参照）
http://qiita.com/azzeten/items/a0b604c67d993387ff5e


機能も、、というか今まで超不便だったところが改良されてました。
いままで、ジョブの定義を一度保存して実行すると、それが編集できなくなっていました。なので「ちょっとここだけ変えたい・・」という場合でも、イチから定義をし直さなきゃいけなかったのが、面倒でした。とても。

それが改善されています。
Activity（定義したジョブ一覧）の画面にいって、各ジョブの詳細を見るボタンをクリックすると（下図 [ 1 ]）、Editボタンが追加されています！

![スクリーンショット 2016-10-09 9.01.03.png](https://qiita-image-store.s3.amazonaws.com/0/119378/719a4efe-748a-0a6a-e884-6410f7a131cb.png)

Editをクリックすると、以下のようにまた定義をし直せる画面に飛びます。
超地味（というか今まで何故できなかった？）ですが、すごく嬉しいです。。

![スクリーンショット 2016-10-09 9.01.37.png](https://qiita-image-store.s3.amazonaws.com/0/119378/e5c1c482-fd2f-e7ae-918c-d2fbcb7268e3.png)
ラズベリーパイ3 Model Bに3.5インチのLCDタッチパネルをつけてみた

#目的
+ データが消失した時用の備忘録
+ LCDモニタの利便性(安さ？)につられて購入した人達の少しでも参考になれば
+ 自分の認識の確認

こんな感じで情報を流していきたいと思います。

#LCD(Liquid Crystal Display)とは
+ 液晶ディスプレイのこと
+ 有機ELやプラズマディスプレイと比較して、応答速度が遅い、視野角が狭いなどの欠点がある。
+ しかし、価格や使用用途の広さなどの点から、最も普及している薄型ディスプレイである。

#実行環境(実際に操作を行う環境)
+ Windows 10

#注意
+ この記事を参考にして実際にモニタをつけようと思う人は自己責任でお願いいたします。

#使用機器
+ [Raspberry Pi 3 Model B スターターキット](https://www.amazon.co.jp/dp/B01G8EZSCQ/ref=sr_ph?ie=UTF8&qid=1475863462&sr=1&keywords=%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A43)
+ [cocopar Raspberry pi 2B/3B用 3.5インチ タッチスクリーン TFTモニタLCD ](https://www.amazon.co.jp/gp/product/B00U6YCIT6/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)　－－　今回の主役
+ 有線のキーボードとマウス
+ PC
+ microSDカードをPCに接続する機器 －－ [このあたり？](https://www.amazon.co.jp/s/ref=nb_sb_noss_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=microSD%E3%82%AB%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC)

#必要なもの
+ [LCDモニタの使用方法とリソース](https://www.dropbox.com/s/4m4ki2xmr4tpkym/3.5inch%20RPi%20LCD.7z?dl=0)　－－　上のLCDのリンク先の商品の説明のところにあるリンク先と同じです。1GB以上あるので注意！！！
+ 折れない心

#LCDの設定
現在(2016/10/09)では、アップデートしても特にLCDに出力されなくなるといったことはないので、アップデートします。

``` 
$ sudo apt-get update 
```

1. 今回使用するLCDはRaspberry Pi 3 のGPIO(剣山みたいなところ)に直接接続するもので、接続してみると画面が白くなります。白くなるのは、まだ設定ができていないからなのでそれの設定を行います。
2. 設定するための必要なファイルを[上のリンク](#必要なもの)からdropboxのファイルをダウンロードし、[7-zip](https://sevenzip.osdn.jp/download.html)で解凍します。


![解凍後.PNG](https://qiita-image-store.s3.amazonaws.com/0/110736/813d3e26-a375-90af-7492-46e2e3c09fb0.png)
解凍したもの－－中に3.5inch RPi LCDフォルダがあります


![内部.PNG](https://qiita-image-store.s3.amazonaws.com/0/110736/8f2c6042-e80e-1def-2de1-32ecc1af1ef1.png)
その中－－Documentフォルダ内に導入方法、softwareフォルダ内にイメージファイルを書き込むソフトがあります。


![ソフトウェアフォルダ内.PNG](https://qiita-image-store.s3.amazonaws.com/0/110736/7b8f2396-9794-819f-7619-6aa145e6c9b5.png)
上の画像に表示されているソフトウェアフォルダ内の実行ファイル(Win32DiskImager.exe)を起動


![イメージファイル書き込み.PNG](https://qiita-image-store.s3.amazonaws.com/0/110736/5cfd2011-0daa-2689-16a7-c3b2ee26284e.png)
起動後の画面、Image Fileグループの中のテキストボックスには3.5inch RPi LCDフォルダのIMAGEフォルダ内に入っているファイルを選択します。
Deviceは実際にRaspberryPiに接続するmicroSDカードを選択してください。
Image FileとDeviceを設定後、画面下のWriteと書かれているボタンをクリックすると、書き込まれていきます。
そのまま少し待ちます。
書き込みが完了すれば、Win32 Disk Imagerの画面を閉じて、microSDカードをRaspberryPiに接続して起動すると、動くと思います。



---
######最後ですが、Documentフォルダのpdfを見た方がわかりやすいと思うので、そちらを参考にしてもらうといいと思います。



#参考にしたサイト
[LCDとは](http://www.weblio.jp/content/LCD) －－　 英和辞典・和英辞典 - Weblio辞書
Tensorflow > ImportError: No module named input_data > input_data.pyを取得して置く

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
TensorFlow GPU版 v0.11
```

```
# -*- coding: utf-8 -*-
# Author: takami.sato

import tensorflow as tf
import input_data
...
```

上記で始まるMNISTのサンプルを実行しようとすると以下のエラーが出る。

```
ImportError: No module named input_data
```

対応としては input_data.py をダウンロードして置く、らしい。
http://stackoverflow.com/questions/33664651/import-input-data-mnist-tensorflow-not-working

> answered Nov 12 '15 at 5:01
> Salvador Dali
> All you need to do is to download the [input_data.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/input_data.py) and put it this.
既存のマイグレーションからスキーマ定義を流用する

# 背景
テーブルを DROP する migration をつくることになった。
`def up` 内では単に `drop_table` できる。
しかし、`rake db:rollback` でテーブルを再作成できるようにしたい場合、`def down` 内にスキーマの情報が必要になる。
スキーマはテーブルを作ったときや更新したときの migration ファイルに既に書いているので、コピペせずに定義を流用したい。

# どうやるか
```ruby
require_relative "20101010101010_create_foo"
require_relative "20111111111111_add_bar_to_foo"

class DropFoo < ActiveRecord::Migration
  def up
    drop_table :foo
  end

  def down
    CreateFoo.change(:up)
    AddBarToFoo.change(:up)
  end
end
```

## 注意が必要なこと

- `change` メソッドを使って `:up` や `:down` を渡す。`up` や `down` というメソッドも生えているが、トランザクションは発生せずに `nil` が返ってくる様子。
- `ActiveRecord::Migrator` で指定の migration を実行することもできるが、こうすると `schema_migrations` テーブルも更新され、migration 自体を実行したことになってしまう。中身だけ流用したい場合はこの方法が良さげ。
- 当然だが、`rake db:rollback` しても中に入っていたデータまで戻ってくるわけではない。
Tensorflow > link > TensorFlowを遊び倒す @ BrainPad

Convolutional Neural Network関連で探して見つけた。　
株式会社ブレインパッドの佐藤貴海さんによる記事。
http://blog.brainpad.co.jp/entry/2016/02/12/163000

サンプルコードを実行しながら学習できそう。

1-1. MNIST For ML Beginners
2-1. Deep MNIST for Experts
　　2-2. Variables: Creation, Initializing, Saving, and Restoring
3-1. TensorFlow Mechanics 101
4-1. Convolutional Neural Networks
...
Tensorflow > link > Gentlest Introduction to Tensorflow Part 2 > Stochastic/Mini-batch/Batch Gradient Descent

SoonHin Khorさんによる関数近似のTensorflow Tutorial。

Gentlest Introduction to Tensorflow: Part 2
https://www.youtube.com/watch?v=Trc52FvMLEg&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=34


14:00頃から3つのGradient Descentについて説明。

- Stochastic Gradient Descent
- Mini-batch Gradient Descent
- Batch Gradient Descent

Stochasticは対語に「Deterministic」という用語がある。
Deterministicは「決定論的」。１００回、同じ条件で実行すると１００個の同じ結果を得る。
Stochasticは「確率論的」。１００回、同じ条件で実行しても１００個が同じ結果とは限らない。
Geometrical opticsなどのraytracingコーディングを試行した時に出てきた。raytracingのコードはもう忘却の彼方であるが。


以下の３つの違いはビデオを見ると正確だが以下の感じ（<font color=red>間違っているかもしれない</font>)

- Stochastic Gradient Descent
  - ランダムに選択したデータで学習
- Mini-batch Gradient Descent
  - ある範囲のデータ(Mini-batch)で学習
  - 入力と出力の位置により異なるMini-batchを使う
- Batch Gradient Descent
  - すべてのデータ(Batch)で学習
Tensorflow > link > Gentlest Introduction to Tensorflow > Placeholderの名前付け > ,name = 'y-input')

SoonHin Khorさんによる関数近似のTensorflow Tutorial。

Gentlest Introduction to Tensorflow
https://www.youtube.com/watch?v=dYhrCUFN0eM&index=33&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH

13:59頃にPlaceholderの名前についての説明がある。

```
cost = tf.reduce_sum(tf.pow((y_ - y), 2))
y_ = tf.placeholder(tf.float32, [None, 1])
```

上記の場合、Placeholder名は勝手に`Placeholder_[番号]`となる。

自分で名前付けしたい場合はnameの指定をする。

```
cost = tf.reduce_sum(tf.pow((y_ - y), 2))
y_ = tf.placeholder(tf.float32, [None, 1], name='y-input')
```

TensorBoardでのGraph表示時にわかりやすくなるとか。
Tensorflow > link > Gentlest Introduction to Tensorflow > Errors: Missing Placeholders > You must feed a value value for placeholder tensor 'Placeholder_1' with dtype float

SoonHin Khorさんによる関数近似のTensorflow Tutorial。

Gentlest Introduction to Tensorflow
https://www.youtube.com/watch?v=dYhrCUFN0eM&index=33&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH

13:00頃に以下のようなエラーの説明がある。

> y should be y_
...
> `W tensorflow/core/common_runtime/executor.cc:1076] 0x229e510 Computer status: Invalid argument: You must feed a value value for placeholder tensor 'Placeholder_1' with dtype float`
...
> `[[Node: Placeholder_1 = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]`


今の自分はまだ上記の部分は未消化。

http://stackoverflow.com/questions/33810990/how-to-feed-a-placeholder
browserifyを使っていて "fs.readFileSync is not a function" で怒られる

Electron + gulp + browserify + babel + react みたいな環境で開発していたらハマりました。

メインプロセスとレンダラープロセス間で通信をしようと思い、
レンダラープロセス側のJSで Electron を require した。

すると、アプリケーションで以下のようなJSのエラーが発生。

```
fs.readFileSync is not a function
```

調べたところ、 browserify の require と npm のrequire がこんがらがってる。的な記事が見つかりました。

エラーで出ている fs モジュールは Electronモジュール内で require しているため、以下のような対処で解決した。

```
const electron = require 'electron';
↑ これを

const electrn = window.require 'electron';
↑ これに
```

詳細は後日追って...。
Tensorflow > link > Gentlest Introduction to Tensorflow > 関数近似のTutorial

Tensorflowで関数近似を検討していて見つけたSoonHin Khorさんによる動画。

Gentlest Introduction to Tensorflow
https://www.youtube.com/watch?v=dYhrCUFN0eM&index=33&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH

### 15:20あたり > Tensorflow Tutorialとの比較

GoogleによるTensorflow Tutorialとこのビデオの人によるGentlest Tensorflow Tutorialの比較がある。

一部を抜粋すると

- Gentlest Tensorflow Tutorial
  - Purpose: Find house price (Float32)
  - ...
  - cost: Square of difference
  - gradient descent batch size: Single sample x,y
- Tensorflow Tutorial
  - Purpose: Classify image
  - ...
  - cost: Entropy-based
  - gradient descent batch size: 100 samples each batch

このビデオではイメージ分類でなく、y = Wx + b形式の関数近似をしている。
技術英語 > Watch the endpoints. / Mind the gap.

@ Code Complete (No. 14066 / 36077)

> Watch the endpoints.

http://eow.alc.co.jp/search?q=watch
> `2 ～に注意する［気を付ける］

<hr>
1999年にLondonのTubeに乗っていた時によく耳にした

> Mind the gap.

だいぶ意訳 「段差に足をひっかけないように」

<hr>
元文章の前後の文を含めると

> Watch the endpoints. Make sure you've covered the case at the top end of each stair-step range.