OmniAICreator/Qiita-1.07M huggingface dataset:
Git使ってて困ったこんな時


## :astonished: ブランチの派生元間違えた!!
本当はdevelopブランチから切らないといけないのに、masterブランチからfeature/hogeブランチを切ってしまった:cry:
もう３回くらいコミットしてしまった...(´；ω；｀)ﾌﾞﾜｯ　ブランチ作りなおしてcherry-pickするか.......
こんなとき!!

```bash
$ git log --graph --all --decorate --oneline

* 08733a5 (HEAD -> feature/test) test 1
* e7872a3 (master) master 2
| * 09140ba (develop) develop 1
|/  
* 8c001b5 master 1
```

↑の例では、masterブランチからfeature/testブランチが切られていますが、これをdevelopブランチの`HEAD`から派生させるようにします。

```bash
$ git rebase --onto develop master feature/test
First, rewinding head to replay your work on top of it...
Applying: test 1

$ git log --graph --all --decorate --oneline
* 17f14a6 (HEAD -> feature/test) test 1
* 09140ba (develop) develop 1
| * e7872a3 (master) master 2
|/  
* 8c001b5 master 1

```
developブランチの`HEAD`から`feature/test`ブランチが派生しています :tada: 

## :astonished: PullRequestをMergeしたけど取り消したい!!

```bash
$ git revert -m 1 [commit-hash]
```
`-m`はmainlineの意でどちらの親コミットを採用するかを決定するもので、1を指定するとマージ先を残す(マージ元の変更点はRevert)。

## :astonished: stash popしたものを再度applyしたい!!

```:bash
$ git stash pop
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (a851cb4046b262e0406d604c3f3aa66df789530d)

$ git checkout .
$ git fsck
Checking object directories: 100% (256/256), done.
dangling commit 1cb1f44731ccbccdd8109bda42ebbdaa1c8cb407
dangling blob e0fac643666921c86891292ad5d1689ad67b7347
dangling commit a851cb4046b262e0406d604c3f3aa66df789530d ← コイツ

$ git stash apply a851cb4046b262e0406d604c3f3aa66df789530d
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")
```
OS X にてアプリケーションを Dock に表示させず、かつバックグラウンドで起動にする

```LSUIElement``` と ```LSBackgroundOnly``` を ```Info.plist``` にそれぞれ ```true``` で記述すれば良いらしい。


# 例

```Something``` という ```/Applications``` にインストールされたアプリケーションでは

```console
$ defaults write /Applications/Something.app/Contents/Info LSUIElement -bool true
$ defaults write /Applications/Something.app/Contents/Info LSBackgroundOnly -bool true
```
すごくたまーにPython使う人用の備忘録【APIアクセス JSONやXMLパース 引数のパース シェルコマンド 正規表現】

手軽にAPIにアクセスしたい時とかに使いたいのでメモとして残しておきます
時々しかPython使っていないので突っ込みどころが結構あると思いますので、なにか間違いやこうしたほうがいいなどありましたらよろしくお願いします。


# APIでJSONアクセス

```py
# -*- coding:utf-8 -*-

import json, requests

url = 'http://maps.googleapis.com/maps/api/directions/json'

params = dict(
    origin='Chicago,IL',
    destination='Los+Angeles,CA',
    waypoints='Joplin,MO|Oklahoma+City,OK',
    sensor='false'
)

resp = requests.get(url=url, params=params)
data = json.loads(resp.text)
# IDEで補完を効かせるため
if 0: assert isinstance(data, dict)
print data["status"]

```



# APIでXMLアクセス

```py
import requests, xml.etree.ElementTree as etree

url = 'http://maps.googleapis.com/maps/api/directions/xml'

params = dict(
    origin='Chicago,IL',
    destination='Los+Angeles,CA',
    waypoints='Joplin,MO|Oklahoma+City,OK',
    sensor='false'
)

resp = requests.get(url=url, params=params)
text = resp.text.encode('utf-8')

data = etree.fromstring(text)
# IDEで補完を効かせるため
if 0: assert isinstance(data, etree.Element)
print data.find("status").text
```


# 引数パース

```py
import argparse
parser = argparse.ArgumentParser(description='サンプルコマンド')
parser.add_argument('arg1', help='Application package name(s)')
parser.add_argument('--a', dest="a", help='Application package name(s)')

args = parser.parse_args()
arg1 = args.arg1
print arg1
a = args.a
print a
```

入力

```
python test.py example --a b
```

出力

```
example
b
```

# コマンドラインを呼び出して正規表現でその文字列の中から抽出
```py
import subprocess
from subprocess import PIPE
import re

system_dump_command = ["adb", "shell", "dumpsys", "activity", "activities"]
system_dump = subprocess.Popen(system_dump_command, stdout=PIPE, stderr=PIPE).communicate()[0]
running_package_name = re.search(".*TaskRecord.*A[= ]([^ ^}]*)", system_dump).group(1)
print running_package_name
```


adb shell dumpsys activity activitiesというコマンドから以下のような文字列が出てきて

```
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
  Stack #0:
    Task id #1
    * TaskRecord{#1 A=com.android.launcher U=0 sz=1}
      numActivities=1 rootWasReset=false userId=0 mTaskType=1 numFullscreen=1 mOnTopOfHome=false
      affinity=com.android.launcher
```

正規表現で

```
com.android.launcher
```
を取り出しています。
Rails - コントローラで生成したデータをJSで利用したい。

いろいろ方法があるうちの一つ。
今後も便利に使えそうなのでメモ。

## Controller

コントローラでデータを準備し、テンプレートに渡す目的でインスタンス変数に格納する。

```rb:movings_controller.rb
  #...
  def show
    #...
    @itemNameSuggestions = Ingredient.select(:category).pluck(:name),
    @roomSuggestions     = Room.select(:name).pluck(:name),
    @categorySuggestions = @moving.moving_items.select(:category).distinct.pluck(:category)
  end
  #...
```

## Template

ID付きの空タグを作り、data属性にコントローラから受け取ったデータを書き込む。

```haml:show.html.haml
= content_tag :div, "", id: "suggestions", data: { items: @itemNameSuggestions,
  rooms: @roomSuggestions, categories: @categorySuggestions }
```

## JS

IDでタグを探し、dataメソッドでデータを取り出す。

```coffee:moving_items.coffee
jQuery ->

  $('#moving_item_name').autocomplete
    source: $('#suggestions').data('items')

  $('#moving_item_room').autocomplete
    source: $('#suggestions').data('rooms')

  $('#moving_item_category').autocomplete
    source: $('#suggestions').data('categories')
```

# 参考資料

- [Passing ruby variables to javascript function in rails view](http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view)
Rails備忘録 

- 複数のラジオボタンを使いたい時

```
class User < ActiveRecord::Base

  enum test: { foo: 1, bar: 2, piyo: 3 }

end
```

モデルで定義した`enum`は`form_for`で使えるみたいです。

```
<%= form_for(@user) do |f| %>
  <%= f.radio_button :test, :foo, label: "設定1", inline: true %>
  <%= f.radio_button :test, :bar, label: "設定2", inline: true %>
  <%= f.radio_button :test, :piyo, label: "設定3", inline: true %>
<% end %>
```

true・falseで使うラジオボタンしか知らなかったので、とても勉強になりました。
leaflet.js openstreetmapの地図にc3.jsでsvg円グラフを描画

# jsfiddle
http://jsfiddle.net/yasu47b/7uxf40ce/

# 参考

http://www.nofuture.tv/diary/20141010.html#p03
http://jsfiddle.net/rmACm/2/

# 利用モジュール
jquery, leaflet.js, d3.js, c3.js

# html

```html
<div id="map"></div>
```

# css

```css
#map {
    
    height: 400px;
}

.svg-marker div{
    -webkit-transform: translateX(-50%) translateY(-35px);
    width: 150px;
    height: 150px;
}
```

# js

```js
$(function () {
    var map = L.map('map').setView([34.839378, 134.694097], 15);
    var tileLayer = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
        maxZoom: 19
    });
    tileLayer.addTo(map);

    tileLayer.on("load", function () {
        var myIcon = L.divIcon({
            className: 'svg-marker',
            html: '<div id="chart"></div>',
            iconSize: null,
            iconAnchor: null
        });

        
        
        L.marker([34.839378, 134.694097], {
            icon: myIcon
        }).addTo(map);
var chart = c3.generate({
    bindto: '#chart',
    data: {
        // iris data from R
        columns: [
            ['data1', 30],
            ['data2', 120],
        ],
        type : 'pie',
        onclick: function (d, i) { console.log("onclick", d, i); },
        onmouseover: function (d, i) { console.log("onmouseover", d, i); },
        onmouseout: function (d, i) { console.log("onmouseout", d, i); }
    }
});

    });
});
```
package.jsonのjsnext:mainフィールド


reduxのpackage.jsonに`jsnext:main`という項目があっておそらくbabelでコンパイルする前のソースを指定しているっぽい感じだった。

```js:package.json
 "main": "lib/index.js",
 "jsnext:main": "src/index.js",
```

調べてみると[es6-module-transpiler-npm-resolver](https://github.com/caridy/es6-module-transpiler-npm-resolver)がたぶん最初っぽい感じがする。（一番最初のリリースが2014年10月なので、そこまで6to5がはやってない頃かな？）。ES6 moduleで書いているJSファイルを指定するフィールドみたい。

BrowserifyやWebpackは`jsnext:main`に対応していないが、上記のes6-module-transpiler-npm-resolverの作者が作っている[grunt-bundle-jsnext-lib](https://github.com/caridy/grunt-bundle-jsnext-lib)や[rollup](https://github.com/rollup/rollup)というbundlerは`jsnext:main`に対応しているっぽい。（rollupのほうは[Wiki](https://github.com/rollup/rollup/wiki/jsnext:main)にも書いている）

ググってもTwitterで調べてもあんまり情報が出てこないのでたぶん流行ってない感じがするけど、現状のコンパイル後のものを`main`に指定する方式だとその当時のBabelのバージョンやコンパイルオプションに依存してしまうので、確かに`jsnext:main`みたいなのがあってもいいのかなーと思った。

他に情報をお持ちの方がいらっしゃいましたら教えてください〜
独立性の高い機能を追加するときには

開発に参加したプロジェクトの中で、新たに独立性の高い機能を実装するときには、以下の点を心がけたいと思う。

####**・独立性の高い処理だけをプロトタイピングして、動作を検証する。**
　この時点では、アルゴリズムの検証がしやすい言語とライブラリの組み合わせを使う。
　
>　私の場合だとMATLABやpythonといったインタプリタ系の言語を使うことが多い。そのアルゴリズムが目的の動作をしていることをグラフィカルに検証できるライブラリを十分にもっていることが重要で、実際に実装するアルゴリズム自体よりも、その動作が期待したものであることを示すためのコードの方が圧倒的に多い。

####**・独立性の高い処理のうち、移植先で使う機能だけをターゲットの言語で再実装する。**
移植先では使わず、テストや動作確認のための機能は、移植しなくてよい。

>　私の場合だと、実装したアルゴリズムだけをターゲットの開発言語で行い、検証を楽にするツールはpythonなどのインタプリタ言語やバッチ、シェルスクリプトを使うことが多い。たとえば、１つのファイルに対する処理を行う機能をコマンドライン引数を受け取って処理をするように作っておき、それをインタプリタ言語内でsystem()関数で動作させるようにする。このようにすると、ターゲットの開発言語によるソースコードは簡潔にできるので、ソースコードを不必要にいじって、コードの信頼性を損なうことがなくなる。

####**・検証用の処理は無理に移植しない。**
　本番の実装には必要ではない検証用の処理は、無理にターゲット言語に移植しない。


####**・独立性の高い処理は独立したファイルにする。**
　独立したファイルにすることで、目的ごとに別ファイルになるので、その独立性の高い機能をいつ誰が更新したかがSVNで明確になる。また、ファイルごとの分担の所在が明らかになる。
> プロトタイプ実装で、実際にアルゴリズムの有用性を確かめていくなかで、プロトタイプ実装をメンテナンスしやすいように、リファクタリングをしていく。プロトタイピング実装の初期版では、動作の検証をするためのコードとアルゴリズム自体とが混在になっている。それを分離していき、不必要なライブラリのimport, #includeをなくしていく。そうすると、何が独立性の高い処理であって、どう設計すべきなのかが見えてくる。
>その後。プロトタイピング実装のリファクタリングで検証した設計を、ターゲット言語で実装する。そうすることで、いきなりターゲット言語で設計を行うよりも自信をもって設計を進めることができる。

####**・プロトタイピング言語では不要で、ターゲット言語では重要な部分を反映させる。**
> C++言語では、関数の引数にconst修飾子がつけられるものにはつける。
引数に渡す変数は参照渡しをする。値渡しをすると不必要な大量のデータのコピーを生じるので、参照渡しにする。ポインタ渡しにすると参照渡しよりも注意深いコーディングが必要になるので、参照渡しで十分なときは参照渡しにすることが多い。

####**・ターゲット言語での関数・メソッドの戻り値を何にするか？**

> MATLABやPythonのようなインタプリタ言語では、関数が複数の変数を返すことができる。そのため、引数には入力値、出力値は必ず戻り値にするコーディングが可能になっている。C/C++言語では、関数やメソッドの戻り値が単一のデータ構造に限られるので、ポインタ渡しや参照渡しで関数やメソッドの引数で出力値を受け取ることが多くなる。そうはいっても、出力をcv::Mat型の関数の戻り値で受け取るようにすると、利用するコードの記述が簡単になる利点が多い。
cv::Mat somefunc(const cv::Mat &img);
で宣言してあると、
cv::imwrite("junk.png", somefunc(cv::imread("lena.jpg"));
のような記述が可能になる。
その分、1行での処理の内容が濃くなり、コードの理解がしやすくなる。
メモリの確保と解放の部分をほとんど意識しなく済むようになり、アルゴリズムに集中できる。

> 従来のIplImageの場合だと、IplImage型のポインタ変数を宣言したときに、IplImage型のポインタがNULLである場合、領域の確保がしてある場合、領域に値が設定してある場合、既に存在するIplImage型への参照である場合などがあり、プログラムのあちこちに、処理が分散していると、IplImage型の領域の解放し忘れるパターンを生じていたりした。

####**・その独立性の高い処理に固有の名前空間を導入する。**
 固有な名前空間を使うことで識別子が他のソースコードとぶつかることがなくす。追加になったモジュールを使う側、モジュール自体の両方でusing 名前空間;を書かない。

####**・公開するインタフェースを絞り込む。**
　追加モジュールの公開するインタフェースを絞り込む。
  そのファイル内でしか呼び出されない関数にはstatic宣言をつける。

####**・公開するインターフェースに十分なドキュメンテーションコメントを書く。**
> 私の場合　Doxygenを使ってドキュメンテーションコメントを書く。

####**・単体テストしやすくしておく。**
　通常動作させるためのメインのプログラムの他に、テスト用のプログラムを生成するプロジェクトファイルを作っておく。追加実装の機能が意図した動作をするものであるかどうかのテストを、小規模なプログラムで動作できるようにしておく。
　必ずしも最初はCppUnitに代表される単体テストのフレームワークに載らないかもしれないが、それでも、通常動作のプログラムとは別の小規模なテストプログラムでテストできるので、プログラムのテストがしやすくなる。

####**移植先のインタフェースを見直す**
移植先のソースコードのどの部分で、追加機能を使うのか、移植先のソースコードをじっくり見直そう。すんなり合うインタフェースがない場合には、１つの関数が、あまりにもたくさんのことをしすぎていて、「関数の抽出」を必要としている可能性がある。



こういったことで、追加機能の実装をトラブルなしに遂行したい。


--

付記：
[快適なC++生活のためにスクリプト言語を使おう　pythonで検証してからのC++実装](http://qiita.com/nonbiri15/items/5a7b24d2e2693bc4c4e5)
Polymer.dart のデータバインディングでの型が変わった

[1年前に作った Polymer.dart アプリケーション](http://qiita.com/k_ui/items/12e3067795d299c02778) が、最新の Google Chrome で動かなくなっていたので、動くように修正した。ついでに Polymer.dart などの依存パッケージのアップデートをしていたらハマッたのでメモ。

端的に描いてしまうと Polymer.dart の `<input type="number">` でバインディングされる型が変わった。

具体的には:

* Polymer.dart 1.5.x では `<input type="number">` でバインディングされる型が他の `type` 属性値と同様 `String` だった。
* Polymer.dart 1.6.x では `<input type="number">` でバインディングされる型が `int` になっている。


実行例（エントリポイントは省略）:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~my_app.html
<link rel="import" href="packages/polymer/polymer.html">
<polymer-element name="my-app">
  <template>
    <table>
      <tr>
        <th><label for="number-input">input type="number"</label></th>
        <td><input id="number-input" type="number" value="{{foo}}"></td>
      </tr>
      <tr>
        <th><label for="text-input">input type="text"</label></th>
        <td><input id="text-input" type="text" value="{{foo}}"></td>
      </tr>
      <tr>
        <th>型情報:</th>
        <td>{{foo.runtimeType.toString()}}</td>
      </tr>
    </table>
    <script type="application/dart" src="my_app.dart"></script>
  </template>
</polymer-element>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~my_app.dart
library my_app;

import 'package:polymer/polymer.dart';

@CustomTag("my-app")
class MyAppElement extends PolymerElement {
  MyAppElement.created(): super.created();
  @observable String foo;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

これを Google Chrome で動かしてみる。

### Polymer.dart 1.5.5+4

![Screenshot from 2015-08-17 22:47:56.png](https://qiita-image-store.s3.amazonaws.com/0/755/53a4273c-bef8-4eec-6bdc-b891b02150ee.png)

![Screenshot from 2015-08-17 22:48:47.png](https://qiita-image-store.s3.amazonaws.com/0/755/34d35ef0-71d1-8863-efea-3ddb85a5e4b2.png)

### Polymer.dart 1.6.0

![Screenshot from 2015-08-17 22:51:57.png](https://qiita-image-store.s3.amazonaws.com/0/755/d28720f9-2f1a-a121-2b38-4a7eaf61cfbc.png)

![Screenshot from 2015-08-17 22:52:13.png](https://qiita-image-store.s3.amazonaws.com/0/755/259f3582-69a8-3646-bc75-b18f7507b77c.png)

![Screenshot from 2015-08-17 22:52:30.png](https://qiita-image-store.s3.amazonaws.com/0/755/a39d06c0-6101-44af-5064-7304bb88ea5b.png)

![Screenshot from 2015-08-17 23:11:37.png](https://qiita-image-store.s3.amazonaws.com/0/755/de45e9d8-7278-289f-3e6c-899ba445b01e.png)

`String foo` なのに、`foo.runtimeType.toString()` が `int` になったり、`double` になったりしている。

* [デモ](http://kui.github.io/polymer-dart-ignore-binging-type/)
* [ソースコード](https://github.com/kui/polymer-dart-ignore-binging-type)

Changelog で言及されてる？
------------------------

これかな:

> The transformer has been heavily refactored and may behave slightly differently.
> [polymer 0.16.3+3 | Pub Package Manager](https://pub.dartlang.org/packages/polymer) から引用

つらい
------

つらい。

加えて、以前からそうだったけど、Polymer.dart は今回の `String foo` で定義してるのに `int` がバインディングされるように、警告もなく型を破ってくるのでつらい。
EC-CUBE3をカスタマイズするならWikiを見るべし

今まで全く気づかなかったのでメモ。

https://github.com/EC-CUBE/ec-cube/wiki

EC-CUBEは公式サイトから飛べるドキュメントやリファレンスの類が無い（あっても分かりづらい？）ので、
デザイン変えるにも機能いじるにもすごく難儀する。
2系なら巷に情報が割と転がってるのでどうにかなるけど、3系はマジで情報が無くて開発者泣かせ。

で、どっか使える情報無いか…と思ってたらこんなとこに。
（githubのWikiを見るってOSS界隈では常識なんですかね、知らなくてごめんなさい）

ディレクトリ構造とか色々書いてあるのでとりあえず此処を見ながらいじってみようと思った。
デーモン化したWEBrickのpidを取得する

```rb
require 'webrick'

@log = open("pid", "w")

s = WEBrick::HTTPServer.new(
  :Port          => 3000,
  :ServerType    => WEBrick::Daemon,
  :StartCallback => Proc.new {
    @log << $$
    @log.close
  }
)
s.start
```

:StartCallback の中で $$ を参照すれば取得できる。pidファイルなどに書き出してやれば良い(๑˃̵ᴗ˂̵)و
【Ruby On Rails】Twitter BootStrapの導入

昨日Ruby On Railsを始めたばかりの初心者ゆえ、間違ってたらごめんなさい。
## 動作環境
OS：centOs6
ruby 2.2.2p95
Rails 4.2.3

## Gemfileの編集

```ruby:Gemfile
gem 'therubyracer' # javascript runtime。lessをコンパイルするために必要
gem 'less-rails' # Railsでlessを使えるようにする。Bootstrapがlessで書かれているため
gem 'twitter-bootstrap-rails' # Bootstrapの本体
```

## bundleインストール

`bundle install --path ./vendor/bundle/`
 
bundle installしてGemfileに書かれた情報を元に必要なgemパッケージをインストールする

## application.jsの修正

//= require twitter/bootstrap`

```ruby:application.js
//= require twitter/bootstrap`
```
↓

```ruby:application.js
//= require bootstrap`
```

require twitter/bootstrapのパスを修正。
bundle installするとapplication.jsが更新されますが、どうやらrequireのパスが違うっぽい？
requireは
/app/assets/javascripts/***.js.coffee
の.js,.coffeeを除いたファイル名で読み込めます。


## 参考
RailsにTwitter Bootstrapの導入と簡易な使い方
http://ruby-rails.hatenadiary.com/entry/20140801/1406818800#twitter-bootstrap-install1
データベースクラスを作成するぞ - vol.4

#まえがき
今回は、渡ってきたバラメータから
プリペアドステートメントを実行する、
そのメソッドの中身を考えてみる。

普通に考えると…
>1. sql文作成
>2. それをprepare
>3. ステートメントに値を渡す
>4. execute で Let's GO!!
>5. fetchで取得

それをザックリとコードにすると…

```php:コード例
$sql = 'sql文';
$stmt = $pdo->prepare($sql);
$stmt->bindValue('値とか型の指定など');
$stmt->execute();
$result = $stmt->fetchAll();
```

で、これを前回のコードと混ぜ混ぜするなら…

#作成中DBクラスのコード(一部抜粋)
```php:DBクラス
// 例えば `users`テーブルの 
// `name`フィールド内、
// `tarou`というユーザーを取る。

// $action = 'SELECT * ';
// $table = 'users';
// $where = array('name', '=', 'tarou');
// が、それぞれ渡ってきたとする。

public function action1($action, $table, $where = null) {
    // 便宜上、色々カット!!
    // 前回、最終的に分解されたものは、

    // *1
    $sql = "{$action} FROM {$table} WHERE {$field} {$operator} {$value}";

    // となるが `$value` は `$sql` とは分けて、次に渡す。
}

public function action2($sql, $value) {
    $stmt = $this->_pdo->prepare('$sql');

    // ↑↑ こんな感じで実行したい。しかし、この $sql の中身は
    // $sql('SELECT * FROM users WHERE name =') なので
    // (*1) の $sql の最後に『"?"』をいれ、疑問符プレースホルダを用いる。

    // *2
    $stmt->bindValue(1, $value, PDO::PARAM_STR);

    // *3
    // この bindValue() 実行時点で値が決定するので、
    // ('SELECT * FROM users WHERE name = tarou')
    // というsql文が確定->発行。

    $stmt->execute();
}
```
##解説やら疑問やら…
いつも bindValue() する時には、
パラメータ名で指定ばかりだったので、
PHPマニュアルを拝見してビックリ!?

>[PHPマニュアル - PDOStatement::bindValue](http://php.net/manual/ja/pdostatement.bindvalue.php)

(\*2)では、**疑問符プレースホルダ** を用いた場合、
bindValue() の第一引数で **インデックス番号** での
指定できるようになります、と。(へぇ～～～

現状のコードでは、普通に'1'と記述していますが、
変数を作成して、ループで回してインクリメント。
ってな使い方で、複数の指定が可能になる。…はず。

#あとがき
ちょっと疑問があるので、ココにメモメモ…。

* ~~PDO::PARAM_STR~~ と ~~PDO::PARAM_INT~~ はどっちがベター？
* ( ↑↑ bindValue と bindParam の勘違いww )
* もしくは文字列判定、数値判定して処理分け？
* さらに、複数の条件指定の方法は？
* さらにさらに、条件指定なしの場合には？

うーむ…とりあえず続きは帰ってから。
既に通知された拒絶理由と同一である旨の通知(特許法第50条の2)について

# 特許法第50条の2の条文

（既に通知された拒絶理由と同一である旨の通知）

* **第五十条の二**　審査官は、前条の規定により特許出願について拒絶の理由を通知しようとする場合において、当該拒絶の理由が、他の特許出願<font color="#9b9">（当該特許出願と当該他の特許出願の少なくともいずれか一方に第四十四条第二項の規定が適用されたことにより当該特許出願と同時にされたこととなつているものに限る。）</font>についての前条<font color="#9b9">（第百五十九条第二項<font color="#b99">（第百七十四条第二項において準用する場合を含む。）</font>及び第百六十三条第二項において準用する場合を含む。）</font>の規定による通知<font color="#9b9">（当該特許出願についての出願審査の請求前に当該特許出願の出願人がその内容を知り得る状態になかつたものを除く。）</font>に係る拒絶の理由と同一であるときは、その旨を併せて通知しなければならない。

## 説明

本規定は、参考先のページに書かれているように、分割出願の補正制限の規定である。すなわち、先にした特許出願に対して通知された拒絶理由と同じ拒絶理由が、先の特許出願から分割した新たな特許出願にも存在する場合、新たな特許出願の補正に制限が加わる(17条の2第5項柱書)というもの。

## 2つの特許出願

条文中の文言に「当該特許出願」と「当該他の特許出願」とがあるように、これは2つの特許出願の関係についての規定。また、「少なくともいずれか一方に44条2項の適用がされたことにより、当該特許出願と同時にされたこととなっているもの」に限ると規定している。44条は分割出願の規定であるから、「当該特許出願」を甲、「当該他の特許出願」を乙とすると、下記3+1パターンが考えられる。(青本P.195)

1. 甲が乙の分割出願である場合→甲に44条2項が適用され、甲と乙が同時に出願されたこととなっている
2. 乙が甲の分割出願である場合→乙に44条2項が適用され、甲と乙が同時に出願されたこととなっている
3. 甲、乙が同じ出願に基づく分割出願である場合→甲と乙に44条2項が適用され、甲と乙が同時に出願されたこととなっている
4. 元の出願を分割し、さらに分割したものが甲と乙である場合→3のパターンに同じ。この場合、分割出願をさらに分割しても、結局大本の出願と同時に出願されたこととなっている

## 50条の2の通知がされるタイミング

* 50条(査定前の審査において拒絶理由を通知するとき)
* 159条2項(拒絶査定不服審判において拒絶理由を通知するとき)
* 174条2項(拒絶査定不服審判の確定審決に対する再審において拒絶理由を通知するとき)
* 163条2項(前置審査において拒絶理由を通知するとき)

## 結論(趣旨)

先の出願に対する拒絶理由を解消しないまま分割出願するな。(→出願人に対し原出願等の審査において通知された拒絶の理由を十分に精査することを促す)

# 参考

* https://www.jpo.go.jp/tetuzuki/t_tokkyo/shinsa/pdf/bunkatu_kizyun/02.pdf
* http://www.taiyo-nk.co.jp/topics/revision/revision3.html#two
【Git】tag関連コマンド

**20190503追記**

- わかりにくい表現を修正しました
- tag作成コマンドのバリエーションを一つ増やしました

**追記ここまで**

gitのtag関連のコマンドです。


# tagとは
リポジトリのある時点(コミット)に印(わかりやすい名前)をつけることができます。
リリース毎にtagをきる、といった形で使われます。

# tag関連コマンド

## tagを作成する(軽量版のタグ)
軽量版のタグは、単にコミットに別名をつけるようなものです。
別名以外の情報を持ちません。

```bash
$ git tag <タグ名>              # 現在のブランチの最新のコミットに対してtagを作成
$ git tag <タグ名> <ブランチ名>  # 指定したブランチの最後のコミットに対してtagを作成
$ git tag <タグ名> <コミット>  # 指定したコミットに対してtagを作成
```

## tagを作成する(注釈付きのタグ)
注釈付きのタグは、タグを付けた人の名前や、メールアドレス、作成日時、メッセージなどを情報として持つことができます。

```bash
$ git tag -a <タグ名>                 # エディタが表示されメッセージを編集することができる
$ git tag -a <タグ名> -m <メッセージ>  # メッセージもコマンド内で付けられる
```

## tagの情報を表示
tagの情報は以下のコマンドで表示することができます。

```bash
$ git show <タグ名>
```


## tagを削除する

```bash
$ git tag -d <タグ名>
```

## tagの一覧を表示する
アルファベット順に表示されます。

```bash
$ git tag
```

## tagをリネームする
編集したいタグと同じ時点に別なタグを作成する⇒もとのタグを削除する、という流れで作成します。

```bash
$ git tag <新しくつけたいタグ名> <編集したいタグ名>

#EX)
$ git tag newTag oldTag  # oldTagと同じコミットにnewTagというタグが新しくできる
$ git tag -d oldTag      # もともと存在したタグを削除する
```

## tagの作成をリモートに反映

```bash
$ git push <リモートリポジトリ> <タグ名> 　# 指定したタグを指定したリモートリポジトリに反映
$ git push <リモートリポジトリ> --tags  　# ローカルのすべてのタグを反映
```

## tagの削除をリモートに反映

```bash
$ git push <リモートリポジトリ> :<タグ名>
```

gitのpushは以下のような構文です。

```bash
$ git push <リモートリポジトリ> <(ローカルの)ブランチ名など>:<(リモートの)ブランチ名など>
```

「:」の前に何も書かないことによって、(ブランチの場合)リモートのブランチを空のブランチで上書きする形になり、削除できます。


# その他
ほかにもgitコマンド関連記事書いています。
[Git初心者に役立つ「よく使うコマンド集」](http://qiita.com/chihiro/items/fc94e5de02fd37328040)
[Git初心者に役立つ「よく使うコマンド集」②](http://qiita.com/chihiro/items/b69f1051b7bca6361e01)
[Git初心者に役立つ「よく使うコマンド集」③](http://qiita.com/chihiro/items/c5b64d89c2cf061ba497)
サクラエディタの保存時にタグジャンプ用のtagsファイルを自動生成する

vimであれば保存時に自動的にtagsファイルを作るようなプラグインがありますが、サクラエディタの場合は無さそうだったのでマクロで何とかしてみました。

1. サクラエディタ本体を最新版に
-------------
古いのでも動くとは思いますが、まずは最新版に更新。
使っていない人もこの機会に。
http://sourceforge.net/projects/sakura-editor/files/sakura2/

2. ctagのWindows版を配置
-------------
以下のURLからWin32版(バイナリのみ)をダウンロードして展開し、sakura.exeと同一ディレクトリにctags.exeを配置します。
http://hp.vector.co.jp/authors/VA025040/ctags/

3. 保存した際、自動的にタグファイルを生成するためのマクロを配置
--------------
サクラエディタのディレクトリの下に `macros`ディレクトリを作成して、以下の内容を `saveWithTags.js`として保存します。
幾つかの項目は環境に合わせて変更を。

* sakuraDirectory：サクラエディタ本体が配置されているディレクトリの絶対パス
* targetDirectories：タグ生成対象のディレクトリリスト（円マークのエスケープを忘れずに）
* options：基本的に変更する必要は無いが、特殊な拡張子の場合は`-h`や`--language-force`を追加

```js:saveWithTags.js
//	サクラエディタ本体のディレクトリ(この直下にsakura.exe, ctags.exeが必要)
var sakuraDirectory = "D:\\UtilitySoft\\sakura";

//	対象のディレクトリ
var targetDirectories = ["D:\\temp\\dummy", "D:\\temp\\dummy2"];

//	ctags用オプション
var options = "--excmd=number --append --exclude=tags";

var ctagPath = sakuraDirectory + "\\ctags.exe";

var WshShell = new ActiveXObject("WScript.Shell");

if(typeof(Editor) != "undefined") {
	for(var i = 0; i < targetDirectories.length; i++) {
		if(Editor.GetSaveFilename().indexOf(targetDirectories[i]) != -1) {
			Editor.FileSave();
			var tagFileOption = "-f " + targetDirectories[i] + "\\tags";
			WshShell.Run([ctagPath, options, tagFileOption, Editor.GetSaveFilename()].join(" "), 0);
		}
	}
} else {
	for(var i = 0; i < targetDirectories.length; i++) {
		var tagFileOption = "-f " + targetDirectories[i] + "\\tags";
		WshShell.Run([ctagPath, "--recurse", options, tagFileOption, targetDirectories[i]].join(" "), 0);
	}
}
```


4. 保存した際にマクロを実行するように設定
--------------
サクラエディタを起動して、設定(O) → 共通設定(C) → マクロを開き、「マクロ一覧」に手順3で作成したmacrosディレクトリを指定します。

リストから空いている番号の欄を選択し、以下の値を入力します。

* 名前(N)：saveWithTags
* File：saveWithTags.js
* 「ファイル保存前(S)」にチェック

**「設定(A)」を押して保存してから** 設定画面を閉じます。
＃これを忘れるとOKボタンを押して設定画面を閉じても保存されない

5. サクラエディタを再起動
--------------
既に開いているウィンドウには反映されない気がするので、念のため。

6. 全ファイルに対するタグ生成を実行
---------------
ここまでの手順で保存時に自動的にタグファイルが作られるようになりました。
とはいえ既存ファイルを全て保存しなおすのは手間のため、全ファイルに対するタグ生成を行います。

このマクロファイルはサクラエディタ外から呼ばれた場合、全`targetDirectories`の全ファイルに対してタグ生成を行うため、コマンドプロンプトで以下のコマンドを実行するとtagsをまとめて作ることができます。

```
cscript D:\UtilitySoft\sakura\macros\saveWithTags.js
```

SVNのフックスクリプト辺りに仕込んでおくとSVN Update時にも自動実行できそうですね。

幸せなタグジャンプライフを！
オブジェクト指向と関数型とimplicitと

```scala
case class Configuration(val n: Int)

class Printer(conf: Configuration) {
  def print(String str) = {
    println(this.makeStr(str));
  }
  def private makeStr(String str): String = {    // ①
    str * conf.n                                 // インスタンス変数confの値を使ってる
  }
}
```

普通にオブジェクト指向っぽく書くと、①のPrinter.makeStrみたいにインスタンス変数の状態を使って処理をすることがよくあると思うんだけど、関数型でよく言われる参照透過性的に、これはあまりよろしくない。たぶん、好まれるのは

```scala
private def makeStr(str: String, conf: Configuration): String
```

みたいに、インスタンス変数で持ってるのにもかかわらず、呼び出しもとから、ちゃんとConfigurationをわたしてあげる形が関数型的には好まれる。
ただ、これって、すごく冗長で、オブジェクト指向と関数型って相性あんまよくないんじゃないのかなーとか思ってた。(これだけを取り上げて相性よくないは言いすぎだけど・・・)
でも、Scalaはimplicit使うとこれを解決できる。この解決方法がいい手法なのかどうかは正直わからないけど・・・

上の例のPrinterをimplicit使って書き直すと

```scala
class Printer(implicit val conf: Configuration) {
  def print(String str) = {
    println(this.makeStr(str));
  }
  private def makeStr(String str)(implicit conf: Configuration): String = {
    str * conf.n
  }
}
```

こうすると呼び出しもとのprintからわざわざconfを渡す記述をしなくても暗黙でconfが渡されし、たぶん参照透過性的にも悪くない。

## 結論
implicitって、よく暗黙的型変換を例にして語られることがあるけど、他にもいろんな使い方がある。
正直、implicit使いまくるのあんま好きじゃないけど・・・
google_oauth2でredirect_uri_mismatch

## 現象
```
Error: redirect_uri_mismatch

The redirect URI in the request: https://sample.com:80/users/auth/google_oauth2/callback did not match a registered redirect URI.
```

## 原因
protcolがhttpsなのにportが80を指定している
リバースプロキシをやっていて、nginxからapacheにリクエストを渡すときは80に渡しているから？

## 対策
callback_urlはここで定義されている
https://github.com/intridea/omniauth/blob/master/lib/omniauth/strategy.rb#L431

「parameterとしてredirect_uriを指定して渡す」でとりあえず対応した

``` ruby
user_omniauth_authorize_path(:google_oauth2, redirect_uri: Settings.omniauth.redirect_uri)
```

config/settings/production

``` ruby
omniauth:
  redirect_uri: 'http://sample.com/users/auth/google_oauth2/callback'
```

## 追記
redirect_uriをhttpsで指定するとredirect_uri_mismatchが発生する
chromeやsafariでposition: fixed;が効かない場合


position: fixedを使っているのに何故か位置が正しい位置に固定されない場合、
親要素にtransform系のプロパティが使われていないか疑うと良いです。

おそらく、GPUを使ったレンダリングによって、子要素のposition: fixedに影響を引き起こしていると考えられます。
google play servicesのGAライブラリ（V4）を使わない

#はじめに
GCMを使うためにいれていたplay-servicesのライブラリに
去年くらいにGAライブラリが入っているのに気づいたけど、ビルドがうまくいかない。
V4に移行するまでもない、とりあえず動かすよ！という方法

#設定
```:build.gradle
dependencies {
    compile 'com.google.android.gms:play-services-gcm:+'
//    compile 'com.google.android.gms:play-services:+'//
    compile files('libs/libGoogleAnalyticsServices.jar')
}
```
#参考
https://developers.google.com/android/guides/setup

#さいごに
V4への移行が出来るようになったら
コメント部分を有効化、上下の行を消せば良いはず
gitの使い方(初心者向け)


#リモートリポジトリのクローンを作成する方法
今までSourceTreeでgitを使っていましたが、コマンドラインでgitを使いたくなったので、覚えた方法をまとめました。
そんな状況での投稿なので、初心者向けレベルの情報です。
まだそんなに使っていませんが、SourceTreeはメモリを消費しますし重いので、マージするようなGUIのほうがわかりやすい場合以外はCLIを使ったほうが良いと感じました。

###前準備
`$ sudo yum install -y git` などで
gitクライアントをインストールしておく。

###リモートリポジトリのクローンを作成する方法
初めてローカルにレポジトリを持ってくるときの方法です。

```
$ cd /home/ec2-user
$ mkdir <Directory-Path>
$ git clone <Repository-Name> <Directory-Path>
```

###リモートリポジトリの変更を取得する方法
```
$ cd /home/ec2-user/Book
$ git fetch
$ git pull
$ git status
```

###リモート・リポジトリに変更をpushする方法
`$ git commit -a` するとvim画面が開くので
コメントを書いて保存したら
`$ git push` する。

##もし分からなくなったら
`$ git status` をすると有用なヒントを教えてくれる。

##備考
初めての投稿なので、Qiitaのお作法に合っていないところがあるかもしれません。解り次第修正していきたいと思います。
Railsで入力の確認画面を出すときの定石

## よくあるお問い合わせフォームみたいので、ユーザーの入力を一度確認画面みたいな感じで表示してから送信したい時・・

- ユーザーが問い合わせの入力
- 「確認」ボタンをクリック
- 入力した項目を一度確認画面に表示（入力とほとんど一緒）
- 「送信」ボタンをクリック
- 実際にモデルとして保存

という流れをRailsで実装する時の定石

## Model

- Question

```app/models/question.rb
  validates :title, presence: true
  validates :name, presence: true
  validates :content, presence: true
  
  validates_acceptance_of :confirming
  after_validation :check_confirming

  def check_confirming
    errors.delete(:confirming)
    self.confirming = errors.empty? ? '1' : ''
  end
```

ここではDBに保存する値は、 title, name, content とする。（必須入力）
``` validates_acceptance_of ``` はRailsの機能。

[validates_acceptance_of - リファレンス - - Railsドキュメント](http://railsdoc.com/references/validates_acceptance_of)

confirmingはDBに保存しなくて大丈夫。

ポイントは次の２点

- validate_accepttance_ofが指定してあるので、confirmingの値が存在するかのバリデーションチェックが発生
- 一度validationした後に ```after_validation``` で指定されているメソッドがコールされる。この時confirming以外にエラーがない場合は、チェック済として値をセット

## Controller

### 応答するコントローラーメソッド

RESTに従う

- 新規質問入力画面を表示 : QuestionsController#new (GET)
- 確認ボタンクリックに応答 : QuestionsController#create (POST)
- 入力内容を確認する画面を表示 : QuestionsController#new (GET)
- 送信ボタンクリックに応答 : QuestionsController#create (POST)

ポイントはmodelのconfirmingのバリデーション機能で、上手いことページ遷移を発生させてるとこ。

```app/controllers/questions_controller.rb
class QuestionsController < ApplicationController

  def new
    @question = Question.new
  end

  def create
    @question = Question.build(question_params)
    
    respond_to do |format|
      if @question.save
        format.html { redirect_to @question, notice: '質問を送信しました。' }
      else
        # 一度目の「確認」ボタンクリック時は、confirmingがセットされていないのsaveでエラーが発生しこっちに来る
        # ただし、ここに到達した時点で model の after_validation 後なので、confirmingはセットされている状態で new アクションへ
        format.html { render action: 'new' }
      end
    end
  end

  private
  
  def question_params
    params.require(:question).permit(:title, :name, :content, :confirming)
  end
end
```

## View

同じフォームで ```confirming``` 値の有無で、画面表示を分岐させる。
（入力項目と確認項目はinputか単なるテキストかの違いだけで、ほぼ同一なので、一緒のテンプレートにある方がわかりやすい）

(simple_form gemを使っている)

``` app/views/questions/_form.html.haml
= simple_form_for @question do |f|
  - if @question.confirming.blank?
    .form-inputs
      = f.input :name, label: 'お名前'
      = f.input :title, label: 'ご質問'
      = f.input :content, label: 'ご質問内容'
    .form-actions
      = f.button :submit, '内容を確認する'
  - else
    %table.table
      %tr
        %th お名前
        %td= @question.name
      %tr
        %th ご質問
        %td= @question.title
      %tr
        %th ご質問内容
        %td= @question.content
    
    .form-inputs
      = f.hidden_field :name
      = f.hidden_field :title
      = f.hidden_field :content
    .form-actions
      %p この内容でご質問メールを送信します。よろしいですか？
      = f.button :submit, '送信する'
  
  = f.hidden_field :confirming  
```

２回目の「送信」ボタンでは、ユーザー入力のパラメータはhiddenで渡す。
Kallithea関連URL


* [Kallithea](https://kallithea-scm.org/)<br>公式サイト

## ドキュメント
* [Kallithea Documentation](http://docs.kallithea-scm.org/en/latest/)<br>ドキュメント
* [RhodeCode Enterprise 3.4.1 documentation](https://docs.rhodecode.com/RhodeCode-Enterprise/index.html)<br>Kallitheaのフォーク元であるRhodeCodeのドキュメント

## 開発

* [リポジトリ](https://kallithea-scm.org/repos/)
* [Issue tracker on BitBucket](https://bitbucket.org/conservancy/kallithea/issues?status=new&status=open)
* [Weblate](https://hosted.weblate.org/projects/kallithea/kallithea/)<br>翻訳
Rails4 で form_for が multipart にならない

「Rails4 の form_for は multipart: true を省略可能」という記事がある。
http://qiita.com/akishin/items/32e17717b1cff149572d

```erb
<%= form_for(@post) do |f| %>
<%= f.file_field :image %>
<% end %>
```

と書くとうまくいく。

だが、こんな風に。

```erb
<%= form_for(@post) do |f| %>
<%= file_field :post, :image %>
<% end %>
```

この場合だと f. を通して書かないと、ダメだ。
関連付けがされないようで、普通のフォームになってしまう。

この場合はちゃんと multipart を指定すること。

```erb
<%= form_for(@post, html: { multipart: true }) do |f| %>
<%= file_field :post, :image %>
<% end %>
```








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
reveal.js で作成したスライドをdecktapeでPDF化する

[reveal.js](https://github.com/hakimel/reveal.js/)はHTMLもしくはmark-downで記述した内容をスライドのように見せるためのライブラリです。HTMLなのでWEBにupしてしまえば閲覧可能な状態にはできるのですが、やはり[slideshare](https://slideshare.net)にもupしたいということもあります。

[reveal.js](https://github.com/hakimel/reveal.js/)のREADMEにはブラウザのエクスポート機能を用いたPDF化の方法が紹介されています。しかしこれが結構なフラワーパークで、あれがあれであれな感じです(つまりちゃんと出ない)。そこで今回は、別の方法として紹介されている [decktape](https://github.com/astefanutti/decktape) を使ってPDF化を試してみます。

# decktape とは...

HTML5 プレゼンテーションフレームワーク用のPDF生成するためのツールです。
フォントの埋め込み、選択可能なテキスト、ハイパーリンク、SVGグラフィックスオブジェクト、ファイル圧縮などの機能をサポートしています。

https://github.com/astefanutti/decktape

# インストール

とりあえずgit cloneします。

```
$ git clone --depth 1 https://github.com/astefanutti/decktape.git
Cloning into 'decktape'...
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 31 (delta 7), reused 14 (delta 0), pack-reused 0
Unpacking objects: 100% (31/31), done.
Checking connectivity... done.

```

ディレクトリを移動します。

```
$ cd decktape 
```

phantomjsを使うのでphantomjsをインストールします。

```
$ curl -L http://astefanutti.github.io/decktape/downloads/phantomjs-osx-cocoa-x86-64 -o bin/phantomjs
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   178  100   178    0     0    287      0 --:--:-- --:--:-- --:--:--   962
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 16.7M  100 16.7M    0     0  1096k      0  0:00:15  0:00:15 --:--:-- 1844k
$ chmod +x bin/phantomjs
$ 
```

## PDFを出力

ではPDFを出力します。phantomjsを使ってdecktape.jsを実行します。第一引数にはHTML5 Presentationフレームワーク名を指定します。今回はreveal.jsを使っているのでrevealを指定しました。どれを指定するかはusageで確認できます。第二引数にはスライドがあるURLまたはファイル名を指定します。第三引数は出力するファイル名です。

```
$ bin/phantomjs decktape.js reveal "http://127.0.0.1:8000/freedom_hill/20150816/#/" test.pdf
Loading page http://127.0.0.1:8000/freedom_hill/20150816/#/ ...
〜省略〜
http://127.0.0.1:8000/bower_components/threejs/examples/js/controls/TrackballControls.js:8 in global code
Loading page finished with status: success
Reveal JS DeckTape plugin activated
Printing slide #/47     (52/48) ...
Printed 52 slides
$ 
```

出力できました。52/48と分子が分母より多いのは、スライド内にfragmentなどの指定をしているとHTMLの1ページが2ページになるからです。

出力した結果をslideshareにuploadしておきました。
http://www.slideshare.net/TakesxiSximada/ss-51770003
Spring bootでfaviconを変える

Spring bootに初めて触ってまだ3ヶ月程度の素人です。日本語の情報が少ない分野なので、英語サイトを調べて解決した事は小ネタとして投稿していこうかなと思ってる次第であります。

# Springマークのfavicon

さて、Spring bootで (*) web apiを作成してbrowserから叩いてみると、緑の葉っぱのspringアイコンがfaviconとして自動的に付いてきます。

(*) Spring一般かもしれませんが…。

![image](https://qiita-image-store.s3.amazonaws.com/0/32424/7a009d7d-8852-560c-fbc7-b64fc2a8ca96.png)

これって、万が一Spring bootに脆弱性が見つかった場合「さぁ私はSpring bootですから脆弱性突っついてください！」と言わんばかりな状況になってしまう訳です。

# faviconを差し替えよう

今回は、

- Hello world!と返すだけのcontrollerを用意
- そのアドレスを叩いた際に、任意のfaviconが表示されるようにする

という事をします。Controllerのコードは下記のようなシンプルなものです。

``` SampleController.java
@Controller
@EnableAutoConfiguration
class SampleController {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }

}
```

## 任意のfavicon.icoを配置する

[このスレ](https://stackoverflow.com/questions/20673230/spring-boot-overriding-favicon/20834742#20834742?newreg=fd6f1700a60c424bb92788747aea58ca)によると、
```main/resources```配下に```favicon.ico```を配置する (spring boot 1.2.0以降であれば、```main/resources/static```) とfaviconが置き換わるようです。

早速試してみると、おお、確かに変わりますね！！

そして、http://localhost:8080/favicon.ico へアクセスすると、確かに配置したfaviconが返ってきます。

## spring.mvc.favicon.enabledをfalseにする

こちらは「差し替え」ではありませんが、葉っぱマークをfaviconとしない、という目的は達成できるということでご紹介。

```main/resources/application.yml``` に下記を追記することで、http://localhost:8080/favicon.ico を叩いてもNot found(404) になります。

``` application.yml
spring:
    mvc.favicon.enabled: false
```

# だがしかし、、、

Firefox、Safariはちゃんとfaviconが変わったのにChromeだと変わらない…。シークレットモードでやっても変わらず…。

ググると「Chromeのfaviconがおかしくなった」というコメントがいくつか出てくるのでそれ関連かなぁ…。まぁ、追々見てみます。

# まとめ

Spring bootでfaviconを置き換える方法をご説明しました。簡単で何よりです。

上記で触れましたstack overflowの[このスレ](https://stackoverflow.com/questions/20673230/spring-boot-overriding-favicon/20834742#20834742?newreg=fd6f1700a60c424bb92788747aea58ca)では、Configurationをinjectionする方法などが触れられています。分かり次第、日本語でまとめてみようかなぁと思ってますー。
systemd で gotty を手軽にデーモン化する


本日話題になってた [gotty](https://github.com/yudai/gotty) 。
github からバイナリ落として

```bash
$ ./gotty -w -p 3000 bash
```

のようにタイプするだけで tty をブラウザ越しにシェアできて便利。
もちろん `-w` つけてると閲覧者に操作を許可してしまうので実際に立ち上げる際には注意が必要。

使いやすさに惹かれたので軽くデーモナイズしてみることにした。
利用するのは RHEL7 や CentOS7 で採用されてる systemd 。

もともと SysV みたいにスクリプトを記述してあれこれするタイプのものでは無いと思うのだけれど、
さらにお手軽に試したい場合などは `systemd-run` コマンドが使える。


```bash
$ sudo systemd-run --unit=gotty ./gotty -w -p 3000 bash
```

これだけで新規の service unit が `gotty.service` という名前で立ち上がるようになる。

```bash
$ systemctl list-units | grep gotty
gotty.service                                    loaded active running   /home/centos/./gotty -w -p 3000 bash
```

`--unit` オプション付け忘れると自動生成された名前になってしまうので探しにくくなるかもしれない。
まぁ `list-units` を `grep` すればほぼ問題無いとは思うけど。

終了させるときは通常の unit と同様に

```bash
$ sudo systemctl stop gotty
```

でOK。
もちろん再開させる場合も

```bash
$ sudo systemctl start gotty
```

でよくなる。

いちいち unit ファイル書いて読み込ませて〜な作業が必要ない一時的なデーモンであれば十分だと思う。
ECMAScriptのジェネレーターでCyanのcallccを再現してみた

[JavaScript の ジェネレータ を極める！](http://qiita.com/kura07/items/d1a57ea64ef5c3de8528) の記事に触発されて、継続を捕まえる的なことが出来るのか試してみた。

[Cyan の callcc](http://www.geocities.jp/takt0_h/cyan/doc/ref/about-continuation.html) をシミュレートすることを目標に作ってみました。
継続よくわかってないので根本的に変なところあるかもしれません。

Cyan で

```
1 + 2 * callcc^(x){ cont = x; 0 } - 3
```

のようにすると、`cont` には　`^(x){ 1 + 2 * x - 3 }` に相当する関数が代入されます。
従って、これを呼び出すと以下の様な結果になります。

```
say cont(4)  #=> 6
```

Cyan は見慣れない人が多いと思うので JavaScript 風の文法にすると以下の様な感じ。

```js
1 + 2 * callcc(function(x){ cont = x; return 0; }) - 3;
// cont には function(x){ return 1 + 2 * x - 3; } 相当の関数が代入される
console.log(cont(4)); // => 6
```

といっても、流石に上記は想定通り動かないので、ここでジェネレーターの出番。
ジェネレーターと `yield` を使ってうまいことやってみます。

```js
/** callcc を使いたい部分を囲うための関数。F# でいうコンピューテーション式ビルダーの役割 */
function useCallcc(gf) {
    // ジェネレーター関数からジェネレーターを取得
    var g = gf();
    // 継続を実行するための関数
    var cont = function(arg) {
        // 継続を呼び出す（＝1つめの yield 式に引数を当て込んで2つ目の yield まで実行する）
        return g.next(arg).value;
    };
    // 最初の yield まで進めて yield 式の関数を取得（継続を捕まえる関数）
    var f = g.next();
    // 継続を捕まえる関数の引数に継続を渡す
    f.value(cont);
}
```

上記のような補助関数を用意して、以下のように書けます。
`callcc` は `yield` に置き換わり、さらに式全体を `yield` で評価する必要があります。

```js
var cont;
useCallcc(function* () {
    yield 1 + 2 * (yield function(x) { cont = x; }) - 3;
});

console.log(cont(4));
```

ジェネレーター関数をある関数（ここでいう `useCallcc`）に渡してあげることで `yield` の意味合いを色々と変えて応用するというのがジェネレーターの活用方法の鉄板ですね。

[非同期処理を直列的に書く場合もこんな感じのことをします。](http://qiita.com/kidach1/items/d997df84a0ede39d76ad#%E7%9B%B4%E5%88%97%E5%87%A6%E7%90%86%E6%8E%A1%E7%94%A8)

つまり [F# のコンピューテーション式](http://bleis-tift.hatenablog.com/entry/computation-expression) みたいなもんです（←よくわかってない）。

マサカリお待ちしています。
Heroku 起動遅い

Herokuにアップロードし、公開したアプリの起動が遅い。
料金設定変更により、Freeは実験用にしか使わないほうが良さそう。
https://blog.heroku.com/archives/2015/5/7/heroku-free-dynos

####Freeプラン
・30分アクセスがなければDynoがSleepする
・1日6時間以上スリープする必要がある


#料金設定変更
設定画面でHobbyにしました。
7$/monthだからいいか。
![スクリーンショット 2015-08-17 21.16.20.png](https://qiita-image-store.s3.amazonaws.com/0/59795/7d738a82-4173-5c5f-a29b-4e95cb747de0.png)
（個人メモ）引数でファイル名を指定し、有無をチェックするようなケース

# 意図

Rubyでいろいろ実施するときに、引数で使用するファイルを指定したりすることが多いかな。って。

# ざっとこんな感じ

<pre>
# 第一引数が、入力するファイル名とする

unless ARGV[0] == nil
 
 #この辺りに、指定したファイルが正しいものかを判定する
 #処理を記述する。
 if FileTest.exist?(ARGV[0])
 	puts("ok hirakeru")
 else 
   puts "ファイル #{ARGV[0]} ないです"
   exit(1)
 end
 
else
 puts "引数で、入力ファイルが与えられていません"
 exit(1)
end

puts "ファイルあり"

</pre>

# 実行ケース

## 引数がない（判定対象がない）
<pre>
$ ruby argv.rb
引数で、入力ファイルが与えられていません
</pre>

## 指定したファイルがない
<pre>
$ ruby argv.rb notfound.log
ファイル notfound.log ないです
</pre>

## 指定したファイルが存在する
<pre>
$ ruby argv.rb result.txt
ok hirakeru
ファイルあり
</pre>

# 細かい解説

## 第一引数が存在するかどうかを判定する

第一引数が存在しないが成り立たない　＝　存在する　と
存在しないが成り立つとき　＝　存在しないとき　で切り分けている。

<pre>
unless ARGV[0] == nil
</pre>



## 第一引数（ファイル）が存在するときの処理

第一引数で指定したパスのファイルが存在するか否かを判定しています。
存在するときには、if直下の文字を出力しています。
存在しないときには、指定したパスのファイルが存在しないと警告して
異常終了しています。

<pre>
 if FileTest.exist?(ARGV[0])
    puts("ok hirakeru")
 else 
   puts "ファイル #{ARGV[0]} ないです"
   exit(1)
 end
</pre>

## 第一引数（ファイル）が与えられていないときの処理（異常終了）

対象ファイル名が与えられていないときには、
最初のunless文の判定部分が真になるのでelse以下の処理に移動する。

そして、異常内容を表示して強制終了する。

<pre>
else
 puts "引数で、入力ファイルが与えられていません"
 exit(1)
end
</pre>

<pre>
unless ARGV[0] == nil
</pre>

# 最後に、正常なら判定部分の後の処理に到達する

ほぼ　蛇足です。
<pre>
puts "ファイルあり"
</pre>


# 余談

これからこのような処理を多用するので、デザインパターンのようなものを確立したかった。

この処理ってメソッドなどにして、そのメソッドの引数にプログラム実施時の第一引数部分などのパスに相当するものを与える。

与えられたパスに相当する対象物が存在すれば正常判定などを返す
そうでなければ警告を表示して異常終了。って
webviewの残像の消し方

ハイブリッドアプリ用にjavascriptで画面全体をスライドみたいに次々切り替える部分(※)を実装していて
Android2.3系の端末で前の画面表示が残像が部分的に残る不具合があったのでメモ

※スライドはcssのdisplay:none ⇔ block プロパティ切り替えるだけの簡単なもの
　アニメーション等は無し

#原因
画面表示切替ロジックだけでは画面の一部分だけしか再描画のトリガーが走らず、
→結果、残像が残っていた。

↓こちらの解説が詳しいです。
http://qiita.com/tkdn/items/5be7ee5cc178a62f4f67


#対応策
画面表示ロジックの後に画面全体に再描画のトリガーを促すための処理を追加。


```css:style.css
.redraw{visibility:hidden;}
```

```js:slide.js

//切り替え時
$('html').addClass('redraw');

//スライド切り替え処理
//(中略)

$('html').removeClass('redraw');


```

今回はcssのクラスでvisibility(表示・非表示)プロパティを切り替えて再描画を促しましたが、visibilityがhiddenになるとどうしても一瞬消えて見えなくなるので
それだと困る場合はopacity(透明度)を微妙に変えるだけでも代用できます。

```css:style.css
.redraw{opacity:0.99;}
```
※透明度を99%⇔100%と切り替えることで再描画のトリガーが走る。



### 21'10/21 追記
tailwindcssのハンバーガーメニューの開閉でバーコード状の動作残像が残る症状がiPhoneでも発生。
この手法で消えることが確認できたが、この場合は残像が発生するCSSの色プロパティを透明にするなどの見直しが良さそう。
TheanoをMac OS X 10.10にインストールする方法 　（pyenv, anacondaを使用）

# インストールしたマシンの環境
* OS: Mac OS X 10.10.4
* CPU: 2.6GHz Intel Core i7
* メモリ: 16 GB 1600 MHz DDR3
* brewインストール済み。

# やることリスト

1. pyenvをインストールする
2. pyenv経由でanacondaをインストールする
3. pip経由でtheanoをインストールする

#  1. pyenvをインストールする

デフォルトのpythonだと何かと問題が起きるので、適したバージョンを入れるためにpyenvをいれます。

## pyenvとは？
* pythonのバージョン管理システム。
* rubyでいうところのrbenv。
* バージョンのみならず、便利なパッケージも一緒くたになった版もインストールできる（今回はこれを使う）

## 手順

### 手順リスト
1-1. brewを入れる
1-2. pyenv-rehashを入れる
1-3. .bash_profile or .zshrcの編集

### 1-1. brewを入れる
see : http://brew.sh/

### 1-2. pyenv-rehashを入れる
pyenv-rehashというパッケージを入れると付随して、pyenvもインストールされる。

```
$ brew install pyenv-rehash
```

### 1-3. .bash_profile or .zshrcの編集
以下を追加。pyenvの場所を知らせる。

```
export PYENV_ROOT=/usr/local/opt/pyenv
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```

# 2. pyenv経由でanacondaをインストールする

科学計算用のパッケージも同時によしなにインストールしてくれるanacondaを使います。

## anacondaとは？
* python + pythonで提供されている科学計算用のライブラリ群が一緒になったものの名称

## 手順

### 手順リスト
2-1. anacondaをインストール
2-2. anacondaで入れたpythonが使われるようにする

### 2-1. anacondaをインストール
```
$ pyenv install anaconda-2.1.0
```

### 2-2. anacondaで入れたpythonが使われるようにする
```
$ pyenv global anaconda-2.1.0 # anacondaに入っているpythonをシステムのデフォルトのpythonに指定する
$ pyenv local anaconda-2.1.0 # そのフォルダでのみ、anacondaに入っているpythonが指定されるようにする
$ pyenv rehash
```
とやったあとに、以下を打って、```/usr/local/opt/pyenv/shims/python``` が指定されていれば完了。
もしされていなかったら、ターミナルを再起動してみる。

```
$ which python
```

# 3. pip経由でtheanoをインストールする
最後にお目当てのtheanoをインストールします。
一点、はまりポイントがあるので注意。

## 手順
### 手順リスト
3-1. theanoをインストール
3-2. pyparsingをダウングレードする

### 3-1. theanoをインストール
本来なら、numpyやscipyとかもろもろ入れながら設定しなければならないが、
anacondaを入れたことでそのあたりはよしなにやってくれているので、いきなりtheanoをいれればおｋ。

```
$ pip install theano
```

### 3-2. pyparsingをダウングレードする
theanoをpythonからimportしようとするとエラーがでる。

```
>>> import theano
Couldn't import dot_parser, loading of dot files will not be possible.
```
2015-08-17時点で入るanacondaに最初から入っているpyparsingはv2.0.1で、これが原因とのこと。
v1.5.7を使えばいいらしいので、v1.5.7をインストールする


```
$ pip install pyparsing==1.5.7
```

これで問題なくtheanoが使えるようになる。

> 参考: [pydot and graphviz error: Couldn't import dot_parser, loading of dot files will not be possible](http://stackoverflow.com/questions/15951748/pydot-and-graphviz-error-couldnt-import-dot-parser-loading-of-dot-files-will?rq=1)


# まとめ
* pyenvをインストールした
* anacondaをインストールした
* theanoをインストールした
* はまりどころはpyparsingのバージョンのみ。簡単。
ImageMagickを使ってサムネイル画像を作成する方法

#ImageMagickを使ってサムネイル画像を作成する



##hoge.png(400x340)の画像をもとにfoo.png(150x150)を作成する。

縦横比は変えずに短い方の辺が150pxになるまでサイズを縮小し、その後長い方の辺が150pxになるように切り出しする。

横長の画像の場合


```
convert -resize 'x150' -gravity 'north' -crop '150x150+0+0' hoge.png foo.png
```


縦長の画像の場合

```
convert -resize '150x' -gravity 'north' -crop '150x150+0+0' hoge.png foo.png
```

#参照

http://wp.bug.org/archives/299
iOS AutoLayout参考資料

* [(Apple公式) Auto Layout ガイド](https://developer.apple.com/jp/documentation/AutolayoutPG.pdf)

* [Auto Layoutは結構理解するの大変だよねメモ](http://qiita.com/yimajo/items/9bfd25005c1312638b8e)

* [Xcode 5 / Auto Layout – 特集カテゴリー](http://qiita.com/yimajo/items/9bfd25005c1312638b8e)
Vagrantで立ち上げたWebサーバーにブラウザからアクセスする方法

久しぶりに使おうと思ったらやり方を忘れていたのでメモ

※vagrant up までは省略

設定ファイル Vagrantfileの、デフォルトで記載されている以下の１行のコメントアウトを外す

```
config.vm.network "forwarded_port", guest: 3000, host:3000
```

Vagrantの便利な機能に、port forwardingというのがあり、

http://localhost:3000 でアクセスすると、仮想環境のポート3000にアクセスしてくれるといったもの。

基本はこれで事足りるはず。

同じLAN内のマシンと連携させたりするため、
プライベートIPを割り振りたい場合は、以下の２行をコメントアウトする

```
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "public_network"
```
CentOS6.6(x64)FTPインストールと接続（iptables設定）

rootになる。

インストール

    yum -y install vsftpd

設定

    cd /etc/vsftpd/
    cp -prf vsftpd.conf vsftpd.conf.org
    vi vsftpd.conf


下記のように設定する。

    anonymous_enable=NO
    ascii_upload_enable=YES
    ascii_download_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    ls_recurse_enable=YES

ユーザ追加

    echo "yamato" >> /etc/vsftpd/chroot_list

IPアドレス制限

    echo "vsftpd:ALL" >> /etc/hosts.deny
    echo "vsftpd:ALL" >> /etc/hosts.allow

iptablesの設定

    iptables -vnL
    vi /etc/sysconfig/iptables
    -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
    /etc/init.d/iptables restart

SELinux

    setenforce 0

起動

    /etc/rc.d/init.d/vsftpd restart
ghc-mod+stackなHaskell開発環境の為のghc-modラッパー書いた

[前回のghc-mod+stackネタ](http://qiita.com/belliture/items/d2bb5326e427f1e32163)から試行錯誤を重ね、既存のHaskell開発環境にそのままghc-mod+stackを組み込めるghc-modラッパーを書きました。

* https://github.com/belliture/ghc-mod-stack-wrapper

## 嬉しいポイント

* 既存のghc-modに対応している開発環境で使えます。プラグインを書き換えたりとか不要です。
* cabal configureが不要です。`stack path --dist-dir`が指すディレクトリの中にあるsetup-configへのシンボリックリンクを、ghc-modが参照するパスに自動で作成します。

## 参考

* [Haskell開発環境の構築 (Windows編)](http://qiita.com/td2sk/items/9e4b49a4a31b7138d3ad)
* [stackでghc-modを使う試行錯誤のメモ](http://qiita.com/hiratara/items/15aba2534b16c2af8a02)
slim使ってみた

## 参考

* [Ruby - Sinatraとhaml,slim - Qiita](http://qiita.com/YOUG_XX/items/92a6e0a35bb7e3d84890) を実践してみた

### 環境準備

```bash:
mkdir views
touch test.rb　views/index.slim　Gemfile
```

```ruby:Gemfile
source "https://rubygems.org"

gem "sinatra"
gem "slim"
```

```bash:
bundle install --path=vendor/bundler
```

### ソースの準備

```rb:test.rb
require 'sinatra'
require 'slim'

get '/' do
        @arr01 = [0,1,2]
        @has01 = {:id => '1',:value => 'sample' }
        @has02 = [{:id => '1', :value => 'sample1'},
                  {:id => '2', :value => 'sample2'}]
        slim :index
end
```


```haml:views/index.slim
doctype html
html
 head
  title Slim Example
 body
  h1 スリムテスト

  - unless @arr01.empty?
   table
    - for item in @arr01
     tr
      td= item

  - unless @has01.empty?
   table
    tr
     td= @has01[:id]
     td= @has01[:value]

  - unless @has02.empty?
   table
    - for item in @has02
     tr
      td= item[:id]
      td= item[:value]
```

* インデントがタグのくくり。


### 実行

```bash:
bundle exec ruby test.rb -o 0.0.0.0 -p 3000
```

* http://localhost:3000/ にアクセス

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7f3f5998-df4d-392f-067f-2effb9835526.png)


## HTML2slim

* [HTML2slim](https://html2slim.herokuapp.com/)

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e0217bba-9190-5344-1b2b-a851dc3f0080.png)


## 書式

* [Slim入門をして書き方を練習をしました - Qiita](http://qiita.com/pugiemonn/items/b64171952d958dc4d6be)

* `/`でコメントアウト
* 長いテキストなど、改行してテキストを書くにはパイプ `|` を使用
* [Middleman で Slimを使って、render partialしたい時 - Qiita](http://qiita.com/mm36/items/fd5208f053150782e649) `==` で部分テンプレートにして読み込める。
EntityFrameworkで使うPackage Manager Consoleコマンド集

# よく使うPackage Manager Consoleコマンドの備忘メモ

## 指定したプロジェクト名にEntityFrameworkパッケージを取り込む
```lang:指定したプロジェクト名にEntityFrameworkパッケージを取り込む
Install-Package EntityFramework -ProjectName [プロジェクト名]
```

## CodeFirstMigrationを有効化
```lang:CodeFirstMigrationを有効化
Enable-Migrations -ProjectName [DataModelプロジェクト名] -StartUpProjectName [スタートアッププロジェクト名]
```
DataModelプロジェクトとスタートアッププロジェクトが同じならStartUpProjectNameの指定は不要

## CodeFirstMigrationを有効化
```lang:CodeFirstMigrationを有効化
Add-Migration [移行を識別するための名前] -ProjectName [DataModelプロジェクト名] -StartUpProjectName [スタートアッププロジェクト名]
```
初回はInitialCreateを使うようにする

## データベースに反映する
```lang:データベースに反映する
Update-Database -ProjectName [DataModelプロジェクト名] -StartUpProjectName [スタートアッププロジェクト名]
```

## 指定した時点の状態に巻き戻す
```lang:指定した時点の状態に巻き戻す
Update-Database -TargetMigration: [巻き戻したい移行を識別するための名前] -ProjectName [DataModelプロジェクト名] -StartUpProjectName [スタートアッププロジェクト名]
```

## 一番最初の状態に巻き戻す(全てなかったことにする)
```lang:一番最初の状態に巻き戻す(全てなかったことにする)
Update-Database -TargetMigration: $InitialDatabase -ProjectName [DataModelプロジェクト名] -StartUpProjectName [スタートアッププロジェクト名]
```
Crystal: コンソールに出力したい


```rb
# 文字列を出力
print "Hello World!\n"

# 文字列と改行を出力
puts "Hello World!"

# 文字列をフォーマットして出力
printf "Hello %s!\n", "Crystal"
```

```text:出力結果
Hello World!
Hello World!
Hello Crystal!
```

## 不明点

`print`, `puts`, `printf`はどのオブジェクトに定義されているメソッドなのか？