OmniAICreator/Qiita-1.07M huggingface dataset:
Linux MintにRとよく使うパッケージとかをインストール

#Linux Mintって？

Ubuntu派生のディストロで、使いやすくてUIもよい。
Unityなんてなかった！！（本家Ubuntuでも18からGnomeに戻るらしい）

別にRedHat系でもOpenSuse系でもよいのだけれど、Linuxにすると、**RStudioServer**が使えて、色んな端末から同じ環境で計算ができるようになる。
やったネ！

ホントはDockerコンテナとか使うともっといいらしいのだけれど、こういうのはちょっとずつね。

#今回の動作環境
第7世代Intel CPUにLinux Mint 18.1

#RとRStudioServerのインストール

[ここ](https://www.rstudio.com/products/rstudio/download-server/)に書いてある通りにするだけ。
できたら[http://localhost:8787/](http://localhost:8787/)にアクセスしてみよう

英語は嫌だという人のために必要部をコピペしておくと

64bit版のLinux MintやUbuntu,Debianなら

```
$ sudo apt-get install r-base
$ sudo apt-get install gdebi-core
$ wget https://download2.rstudio.org/rstudio-server-1.0.143-amd64.deb
$ sudo gdebi rstudio-server-1.0.143-amd64.deb
```

を実行するだけ簡単！


#`needs`の導入

`needs`パッケージは複数パッケージの読み込みを容易にしつつ、存在しないパッケージを自動でインストールしてくれる優れもの。
詳しい紹介は[uriさん](http://qiita.com/uri/items/dd7c5cddbb6b0ae342c6)の記事を参照。

導入手順として[githubのページ](https://github.com/joshkatz/needs)には

```
install.packages("needs")
# for the dev version:
# devtools::install_github("joshkatz/needs", ref = "development")
library(needs)

# answer "yes" when prompted, and you will never have
# to type library or install.packages again. hooray.
```

と書かれているが、ターミナルに`$ R`と入力してRを立ち上げ、上記を実行しても失敗する。
エラーメッセージのコピーを忘れてしまって申し訳ないが、書き込み制限のある設定ファイルをいじるのが原因のようなので、`$sudo R`としてRをスーパーユーザーで立ち上げてやればよい。

#`tidyverse`の導入

みんな大好きtidyverseだが、いかんせん多数のパッケージの集合体であるために、依存関係が複雑なようだ。
R内でのパッケージの依存関係はもちろんのこと、OS側のソフトの依存関係にも注意が必要。
今回の環境では以下の順でコードを実行すると、うまく`tidyverse`を導入できた。

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential gfortran g++ libcurl4-openssl-dev libxml2-dev
$ R
> install.packages("readxl")
> install.packages("tidyverse")
```

上述の`needs`を早速使って"tidyverse"をインストールしたいところだが、`install.packages`のほうが、インストール過程の詳細なメッセージが見られるので、今回は後者を推す。

うまくいかなかった場合はメッセージを確認しよう。

RStudioServerをインストールした人は、Rコード部分はRStudioServer上でやってもいい。

```
/bin/bash: g++: command not found
```

のようなメッセージが出てきた場合は、システム側に不足なソフトウェアがある（上述の場合は`g++`)
大体の`tidyverse`インストール周りのトラブルはこのエラーに起因している。
一通りシステムに必要なソフトをインストールしたら、もう一度、`tidyverse`をインストールしてみよう。


```
Error in library.dynam(lib, package, package.lib) : 
  shared object ‘readxl.so’ not found
```

というようなメッセージがあれば、個別にRのパッケージをインストールしてみるといい（上述の場合は`readxl`）。

これで、だいたいRを快適に利用できるようになったはずだ。

#その他のパッケージの導入

このあたりはお好みで。

```
needs(data.table, pipeR)
```

`data.table`は、data.frameの拡張するもの。
他に、表形式ファイルを`base::read.csv`などよりも高速に読み込める`fread`や、`base::write.csv`などよりも高速に書き込める`fwrite`などの関数が用意されている。

`pipeR`はRでパイプラインを可能にするパッケージ。
`magrittr`とライバル関係（？）にあたるが、パフォーマンスなどの観点で`pipeR`の方が優れているらしい。
javascriptで非同期無限ループするときに即時関数つかう

即時関数使う方法毎回忘れるのでメモ。

```js
(function loop() {
  // do something
  setTimeout(loop, 1000);
})();
```

こっちならすぐ思い出すんだけどなぁ。即時関数をすぐ忘れる模様。

```js
var loop = function() {
  // do something
  setTimeout(loop, 1000);
};
loop();
```
Firebird3をソースからCentOS6にインストール

#CentOS6.9(64bit) / Firebird 3.0.2 (64bit) / source install
rpmがまだないようなので、tar.gzからインストール

CentOS6.9(64bit) は、ローカルにグノームデスクトップでインストール

###1. Firewall 3050port をopen
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3050 -j ACCEPT
/etc/init.d/iptables restart
###2. yumで必要なライブラリを取得
yum -y update
yum -y install libstdc++.so.5
yum -y install libstdc++.so.6
yum -y install libncurses.so.5
###3. libtommathをinstall
cd /usr/local/src
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
yum -y install libtommath-devel
###4. Firebird-3.0.2.32703-0.amd64.tar.gz  ( libtommathとbitを合わす)
cd /usr/local/src
wget https://sourceforge.net/projects/firebird/files/firebird-linux-amd64/3.0.2-Release/Firebird-3.0.2.32703-0.amd64.tar.gz
tar zxvf Firebird-3.0.2.32703-0.amd64.tar.gz
cd Firebird-3.0.2.32703-0.amd64
./install.sh!
![012_ok.png](https://qiita-image-store.s3.amazonaws.com/0/59472/248cad86-3c2c-aa78-cec2-0b81b0befcff.png)



**(libtommath とCentOS とFirebirdのビット数(64/32bit)は、合わせてインストールすると問題がなかった、混在にすると、
 /opt/firebird/bin/fbguard: error while loading shared libraries: libtommath.so.0: cannot open shared object file: No such file or directory
                                                           [失敗]
のようなエラーとなりました。
)**
![err_.png](https://qiita-image-store.s3.amazonaws.com/0/59472/e3caf11a-548e-e3bf-93c4-a32aca8bacea.png)
Node.jsのREPLでawaitする

## 追記

Node v10から --experimental-repl-await オプションを付けて実行するとawaitできるようになった:tada:
https://github.com/nodejs/node/issues/13209#issuecomment-385852791

---

Node.jsのREPLで非同期扱うのがめんどい。
PromiseもREPLでチェーンしていくのはだるい。
async/awaitはちょうどよさそうだけどREPLではasyncで囲まないといけないので使えない。

というのを解決してくれるツールがあった。
https://github.com/nfcampos/await-outside

binにPATHが通っていれば

```
$ await-outside
```

とすれば使える。
PATHが通ってなければ

```
$ node --require await-outside/repl
```

としても使える。
便利。
counter-incrementでリストではない要素にも連番を振る

#見出しにも連番を振りたいよね
見出しや段落などの要素に連番を振りたいときにはcounter-incrementプロパティが使えます。

![counter increment　サンプル.png](https://qiita-image-store.s3.amazonaws.com/0/10746/715895a8-b40b-0a4f-743d-a91b7309d152.png)


#counter-incrementプロパティとは
要素の数を数えるカウンター。counter-incrementプロパティはカウンターであり単体では表示できません。

数えたい要素に対してcounter-incrementプロパティでカウンターを作り、表示したい所にcontentプロパティのcounter()関数やcounters()関数でカウンターの値を挿入するという流れ。


#html
```html:html
<body>
	<h1>ページタイトル</h1>
	
	<h2>タイトル</h2>
	<p>じゅげむ　じゅげむ　ごこうのすりきれ　かいじゃりすいぎょの　すいぎょうまつ　うんらいまつ　ふうらいまつ</p>
	
	<h2>タイトル</h2>
	<p>くうねるところに　すむところ　やぶらこうじの　ぶらこうじ</p>
	
	<h2>タイトル</h2>	
	<p>パイポパイポ　パイポのシューリンガン　シューリンガンのグーリンダイ</p>
	
	<h2>タイトル</h2>
	<p>グーリンダイのポンポコピーのポンポコナーの　ちょうきゅうめいのちょうすけ</p>
</body>
```

#css

```css:css
body { counter-reset: number; } /* カウンター初期化 */

h2 { counter-increment: number; } /* h2をカウントするnumberという名前のカウンターを作る */
h2:before{ content: counter(number)" "; } /* h2の前にnumberの値と半角スペースを挿入 */
```

#その他気付いたこと
- コメント化されたhtmlの中にある要素は無視してカウントされる。
- リストではないのでcssでナンバリングする事で、htmlから「ナンバリングされた」という情報が抜けおちてしまうのだけど、構造化文書としてはどうなんだろう、こういうの。レシピとか手順とかだと順序の記載も大事な情報だと思うけど。
文字列はインデックスでアクセスできる

文字列が入っているはずの変数に対しふと、`console.log(foo[0])`としてみたら配列に入れる前なのに1文字目が出力されてしまった。

```javascript:javascript
var foo = "あいうえお";
console.log(foo[0]);	// => あ
```
意味がわからなくてデータの判別をしてみる。

```javascript:javascript
console.log(typeof(foo));	// => String
console.log(Array.isArray(foo));	// => false
```
データはちゃんと文字列で配列ではない。どういうこと？


#文字列はオブジェクト

MDN　String
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String#Character_access

>```javascript:javascript
>return 'ねこ'[1]; // "こ" が返される。
>```

文字列をオブジェクトとして扱い、インデックスでアクセスできるとの事。
[swift]メニューバーに常駐するカウントアップタイマーを作ってみた

# はじめに
意外とないかもしれないメニューバーに常駐するカウントアップタイマーを作ってみた
必要に駆られて超短期間で作ったバグあり、だめUIなものですがよろしければみてください

# 要件定義・必要な機能
- カウントアップ
- ストップ機能
- リセット機能
- メニューバーに常駐する
- UIなどは凝らないで短期間で作る
- とにかく使えればいい

# 出来上がったもの
[こちらの記事](http://www.clrmemory.com/swift/cocoa-menubar-application/)を参考に作りました

<img width="131" alt="スクリーンショット 2017-05-30 14.12.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/96484/ad141151-57d5-2798-7e66-6b52e8dfd71f.png">

<img width="131" alt="スクリーンショット 2017-05-30 14.12.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/96484/61cfb792-4fc9-82b2-7b29-eaaae4ac5b2a.png">

機能的にはすごく単純なものになりました
カウントは一秒単位でカウントしていますが、これはあまり更新頻度が高すぎるとチカチカして目障りだったからです

# 実装
# storyboard
基本的には参考元の記事を元に少し変えただけです
ウィンドウ画面は使うことはないだろうと思い消してあります
<img width="486" alt="スクリーンショット 2017-05-30 14.26.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/96484/31adb12d-78c8-2c06-d107-5d73d2a5fd18.png">

# info.plist
ここは参照元記事に書いてあることそのままなので、省略
# AppDelegate.swift

```AppDelegate.swift
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var menu: NSMenu!
    let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)
    var timer = Timer()
    var countTime = 0
    @IBOutlet weak var counterButton: NSMenuItem!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        self.statusItem.title = "00:00"
        self.statusItem.highlightMode = true
        self.statusItem.menu = menu

        let quitItem = NSMenuItem()
        quitItem.title = "Quit Application"
        quitItem.action = #selector(AppDelegate.quit(_:))
        menu.addItem(quitItem)
        
    }
    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
    func quit(_ sender: Any){
        NSApplication.shared().terminate(self)
    }
    @IBAction func countStart(_ sender: Any) {
        if counterButton.title == "START!"{
            counterButton.title = "STOP!"
            timer = Timer.scheduledTimer(timeInterval: 1,
                                         target:self,
                                         selector: #selector(AppDelegate.updateDisplayTime),
                                         userInfo: nil,
                                         repeats: true)
        }
        else {
            counterButton.title = "START!"
            timer.invalidate()
        }
    }
    @IBAction func countReset(_ sender: Any) {
        timer.invalidate()
        counterButton.title = "START!"
        countTime = -1
        self.updateDisplayTime()
    }
    
    func updateDisplayTime(){
        countTime+=1
        let s = countTime % 60
        let m = (countTime - s) / 60 % 3600
        self.statusItem.title = String (format: "%02d:%02d", m,s)
    }

}
```
このようになっています

# 終わりに
急いで特に何も考えることなく短い時間で適当に作ったものなので、ソースコードで書いたのは全てAppDelegateの中にあります
また、タイマーを押してストップなどのメニューを表示している場合でもカウントは止まってしまうなどの不具合も多いものです

しかし個人的には時間を測ることができ、必要な要件が満たせたので満足しています
時間を測るときには常に上のメニューバーに時間を表示できるからこれでいいのです！
CakePHP3 SoftDeleteTrait 論理削除を取得

## 概要

アソシエーション先のテーブルに SoftDelete プラグインが設定されている場合、
連結条件には ```~ JOIN Articles ON Articles.deleted IS NULL``` が付加される。

下記のように記述すると論理削除済みの Articles も含めて取得できる。

----

Model

```
class ArticlesTable extends Table
{
    /* 論理削除設定 */
    use SoftDeleteTrait;
    protected $softDeleteField = 'deleted';
}
```

Controller

```
class RecipesController extends AppController
{

    /**
     * {@inheritDoc}
     */
    public function beforeFilter(Event $event)
    {
        parent::beforeFilter($event);
        // モデルのロード
        $this->loadModel('Articles');
    }


    public function index()
    {
        // 論理削除を含めて取得
        $this->Articles->find('all', ['withDeleted']);
    }

    public function index2()
    {
        // アソシエーション先の論理削除を含める
        $this->Recipes->find()
            ->where(['column' => 'condition'])
            ->contain(['Articles' => function ($q) {
                return $q->find('all', ['withDeleted']);
            }]);
    }
}
```
phpとデータベースの接続

XAMMPのphpmyadminでデータベースを作成してローカルサーバとの接続方法が知りたいです。

<?php
  /*データベースの接続設定*/
  $server = "localhost";　何を入れるのか？
  $user = "root";　何を入れるのか？
  $password = "root";　何を入れるのか？
  $dbname = "member_test";　何を入れるのか？
  
  /*データベースに接続*/
  $conn = mysql_connect($server, $user, $password);
  mysql_select_db($dbname);
?>

「何を入れるのか？」の部分に入れるものは何でしょうか。
蟻本をpythonで: Sec. 2-4, データ構造

#page 73: Expedition (POJ 2421)

```py

# -*- coding: utf-8 -*-

from heapq import *

N = int(raw_input())
L = int(raw_input())
P = int(raw_input())
A = map(int,raw_input().split())
B = map(int,raw_input().split())

h = []

fuel = P
position = 0
ans = 0

A.append(L)
B.append(0)
N += 1

def solve():

    h = []

    fuel = P
    position = 0
    ans = 0


    for i in range(N):
        dl = A[i]-position

        while fuel - dl <0:
            if len(h) == 0:
                return -1
            fuel += -heappop(h)
            ans += 1
        fuel -=dl
        position = A[i]
        heappush(h,-B[i])

    return ans

print solve()

```

C++のSTLと異なり、pythonのheappop()は最小要素から出てくるので、符号を反転させて対応。


#page75: Fence Repair (PKU 3253) 再び

```py


# -*- coding: utf-8 -*-

from heapq import *

N = int(raw_input())
L = map(int,raw_input().split())

h = []

cost = 0

for i in L:
    heappush(h,i)

while len(h)>1:
    l1 = heappop(h)
    l2 = heappop(h)
    cost += l1 + l2
    heappush(h,l1+l2)

print cost

```

heapqによる解法。
最小要素から持ってくるのでpythonのheapqそのまま。計算量がO(L, n log n)。

#page85: 食物連鎖 (POJ 1182)

```py

# -*- coding: utf-8 -*-

from heapq import *
from unionfind import *

N = int(raw_input())
K = int(raw_input())
information = []
while 1:
    a = raw_input()
    if a == "":
        break
    information.append(map(int,a.split()))

u = unionfind(3 * N) 

ans = 0
for i in information:
    infclass = i[0]
    x = i[1]
    y = i[2]

    if x < 0 or x >=N or y <0 or y >=N or infclass <1 or infclass >2:
        ans +=1
        continue
    if infclass == 1:
        if u.issame(x, y+N) or u.issame(x, y+2*N):
            ans +=1
            continue
        else:
            u.unite(x, y)
            u.unite(x+N, y+N)
            u.unite(x+2*N, y+2*N)

    if infclass ==2:
        if u.issame(x, y) or u.issame(x, y+2*N):
            ans +=1
            continue
        else:
            u.unite(x, y+N)
            u.unite(x+N, y+2*N)
            u.unite(x+2*N, y)

print ans

```

いやはや面白い。
あえて要素を複製することでグループ分けの問題に落とし込めるので、Union-Findによって高速に処理できる。


#Sec2-4を終えて

プライオリティキュー、二分探索木、Union-Find木の導入と練習問題。

とりあえずheapqとunionfindのパッケージを使って書いてみた。

Sec2-5に行く前にそれぞれ自分で実装してみようと思う。
Model::updateAllなどで自前でクォート&エスケープする方法


CakePHP2のModel::updateAllでは値にクォートつけてくれません。

なので

```
$this->Item->updateAll(
	[
		'status' => 0,
		'modified' => date('Y-m-d H:i:s') // updateAllではmodifiedは自動更新されないので自分でセット
	],
	[
		'email' => ''
	]
);
```


こんな感じでmodified更新しようとかするとSQLエラーがおこります。

なので自前でクォートする必要があります。

この程度だったら

```
$this->Item->updateAll(
	[
		'status' => 0,
		'modified' => "'" . date('Y-m-d H:i:s') . "'" // updateAllではmodifiedは自動更新されないので自分でセット
	],
	[
		'email' => ''
	]
);
```

こなのでもOKですかね。


でもupdateAllに渡すのがPOSTされたパラメータとかだったらエスケープも必要ですよね。

で、エスケープについてググると```Sanitize::escape()```を使う方法がよくひっかかります。

ただ最近（2017/05/30現在）の公式ドキュメントだと DboSource::value()をつかえってなってるので、こっちを使った方がいいでしょう

```
$db = $this->getDataSource();
$value = $db->value($value, 'string');

```

そうして変更するとこうがいいですかね。

```
$this->Item->updateAll(
	[
		'status' => 0,
		'modified' => $this->getDataSource()->value(date('Y-m-d H:i:s')) 
	],
	[
		'email' => ''
	]
);
```

## まとめ
```Model::updateAll()``` には ```$this->getDataSource()->value()``` もセットでつかいましょう。
【JavaScript】テキストの変更時の処理、エンターキー押下時の処理【jQuery】

`<input type="text">`ってフォーカスが外れないとchangeイベント発生しませんよね？
でもそれってほとんどの人が望んでないと思うんです。
テキスト入力中に変更された(されてないかもしれない)イベントは以下のように取得します。
ついでにエンターキー押下時の処理も。

```js
$(function() {
     
    // テキスト変更時の処理
    $('#input').keyup(function(e) {
        // ここで処理する
    });
     
    // テキストでエンターキーを押されたときの処理
    $('#input').keypress(function(e) {
        if(e.keyCode === 13) {
            // ここで処理する
        }
    });
     
});
```
JAX-RS + RESTEasy で @Context で DI 可能なコンポーネントを自作する

&#xFF20;Context アノテーションで自作コンポーネントを DI 可能にするための方法です。

JAX-RS に準拠した Web アプリケーションで， HttpServletRequest や HttpServletResponse オブジェクトを使用したいときは， &#xFF20;Context アノテーションを使って以下のようにするのが一般的です。

```java
@Context
private HttpServletRequest httpServletRequest;
```

こうすることで，実行時には httpServletRequest にオブジェクトが格納された状態で使用可能になります。

こういった使い方ができるのは他に以下のようなものがあります。

- javax.ws.rs.container.ContainerRequestContext
- javax.ws.rs.container.ResourceContext
- javax.ws.rs.core.Application
- javax.ws.rs.core.HttpHeaders
- javax.ws.rs.core.Request
- javax.ws.rs.core.SecurityContext
- javax.ws.rs.core.UriInfo
- javax.ws.rs.core.Configuration
- javax.ws.rs.ext.Providers
- javax.servlet.HttpServletRequest
- javax.servlet.HttpServletResponse
- javax.servlet.ServletConfig
- javax.servlet.ServletContext

では，これを自作するにはどうしたらいいのでしょうか。JAX-RS の実装に RESTEasy を使っているのなら，以下の方法で簡単にできます。

```java:(1)
MyClass myObject = createMyObject();

Map<Class<?>, Object> contextDataMap = ResteasyProviderFactory.getContextDataMap();
contextDataMap.put(MyClass.class, myObject);
```

使うときは，次の通りです。

```java:(2)
@Context
private MyClass myObject;
```

例えば， (1) をフィルターで行い， (2) をコントローラーで利用するといった使い方ができますね。
Illustratorを使い始めた時に知りたかった初心者デザイナーオススメツール4選

こんにちは、@pompom0c0 です。
まとめ的な記事で申し訳ないのですが、
最近知ったWebアプリケーションで初心者デザイナーにぴったりのものがあったので3つほど紹介させていただきます:)

## 1. ベジエ曲線練習Webアプリ
The Bézier Game

http://bezier.method.ac/
	
ベジエ曲線を書く練習ができるWebアプリケーションです。ゲームをスタートすると、クリック+カーソル移動だけでベジエ曲線が書けます。
しかも、shiftキーを押しながらやると、45°90°などの角度を保ちながら線を書ける、などIllustrator同様のオプションも付いています…すごい…

## 2. カーニング調整練習Webアプリ

http://type.method.ac/

文字間の調整を練習できるWebアプリケーションです。先ほどのベジエ曲線練習Webアプリケーションと同じ会社からリリースされています。

## 3. 配色理論

http://hue360.herokuapp.com/
	
ノンデザイナーのための配色Webアプリケーションです。
配色センスないよ〜って方、怖いからとりあえずメインのカラーを決めて、カラーコードで相性のいい色を調べてそれなりに使ってみる。なんてことをしていませんか？(私のその中の1人です)
こちらのツールは輝度や色相から合う色を導き出すのにぴったりなツールとなってます。配色の本を読んで、得た知見を使って実際に配色してみるぞ！って時にすごく便利なんじゃないかな〜と思ってこちらもまとめに入れさせていただきました。
ちなみに、こちらは「ノンデザイナーのための配色理論」というイベント用にJavaScriptで作成されたみたいです。イベントのスライドはこちら。

https://www.slideshare.net/saucerjp/ss-14902681

## まとめ
技術習得の効率アプリケーションなんて素敵ですね。
いつかこんなアプリを自分で作れるようになりたいな…なんてワクワクしながらまとめました。
他にもいいな！と思ったものがあったら追加していきます:)
Route53で設定したドメインにS3バケットを紐付ける

# 概要
AWS Route53で設定したドメインにS3バケットを紐付けした祭の手順をメモとして残しておく

# 手順
## 1. ドメイン作成する
AWSコンソールからRoute53にてドメイン`tt.myinstance.com`を作成する

## 2. S3バケット作成する
- バケット名`tt.myinstance.com`で作成する
- static website hosting > このバケットを使用してウェブサイトをホストする

**注意! バケット名は、ドメイン名と同じ名前で作成しないと正しくルーティングされない**

## 3. route53設定でドメインへのアクセスをs3へ流す設定を行う
- Route53 > Hosted zones にて `tt.myinstance.com`を選ぶ
- Create Record Setを選択し下記を作成する

```
Name : tt.myinstance.com
Type : A
Alias : Yes
Alias Target にてs3バケットを選択
```

- http://tt.myinstance.com/ へアクセスして確認する

# その他
## バケット名とDNS名が一致しない場合のエラー

```
404 Not Found

Code: NoSuchBucket
Message: The specified bucket does not exist
BucketName: tt.sample.myinstance.com
RequestId: 44FADE51984F3BA3
HostId: CweorbvDrhO7ofSiNwGuZJ/HK1bij70hhjWtxptKeHRTJ/+cr7NgXf86wUiD+cEygjEYJqbiCwY=
```

# 参考記事
http://fujiike.hateblo.jp/entry/2015/09/14/191934
UISliderのタッチ領域を拡大する


```objc
static const CGFloat kExpandWidth = 50;

- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)track value:(float)value
{
    CGRect rect = [super thumbRectForBounds:bounds trackRect:track value:value];
    return CGRectInset(rect, -kExpandWidth, 0);
}
```
Railsの開発用DB(SQLIite3)をjupyter-notebookで触れるようにする

# ゴール
<img width="555" alt="sqlite_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/e7bae6e5-b233-2f65-80ed-d3e6e1ce2a65.png">
目標は上のようなノートが作れるようになることです。上のファイルは`note/test.ipynb`に置いていて

```bash
docker run -d -p 8888:8888  -v `pwd`:/home/jovyan/work  nnabeyang/jupyter-notebook start-notebook.sh --NotebookApp.token=''
```
でサーバーを起動したときに、`db/development.sqlite3`を参照してくれます。

```bash
.
├── Gemfile
├── app
├── bin
├── config.ru
├── db
│   ├── development.sqlite3
│   ├── migrate
│   ├── seeds.rb
│   ├── structure.sql
│   └── test.sqlite3
├── note
│   └── test.ipynb
│
...
```

# 環境構築

まずdockerを使って、公開されているjupyter-notebookのイメージを取ります。
railsアプリのルート位置にいるとして、次のコマンドを実行すると、イメージを取り、サーバーを起動するところまでしてくれます。

```bash
$ docker run -d -p 8888:8888  -v ~/rails_tutorial/money_log:/home/jovyan/work  jupyter/datascience-notebook start-notebook.sh --NotebookApp.token=''
```
ここの作業は時間がかかりますが、終わったら`http://localhost:8888`にアクセスします。このままでは'%%sql'を書いてもSQLを実行することができませんので、`ipython-sql`をインストールします。`jupyter-notebook`のページにある新規作成用のボタンを押すと、以下のように`Terminal`が表示されるので、そこをクリックします。
<img width="400" alt="terminal.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/b9912b5a-4261-2895-afb5-d2834d1d8349.png">
すると、ターミナルが開くので、`pip3 install ipython-sql`を実行します。
<img width="457" alt="pip3.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/25af0da4-d21a-1e3e-3ba6-8d07d253a5f8.png">
インストールし終えたらこれで、`note/test.ipynb`はSQL文を実行できるようになっているはずです。

あとは、このdockerイメージを今後も使えるようにしておけば目標達成です。まず今起動しているdockerのコンテナIDを`docker ps`して調べます(ここではコンテナIDが`afc4c5294130`だったとしましょう)。それを次のようにして後で参照しやすいようにしておきます。

```bash
$ docker commit afc4c5294130 nnabeyang/jupyter-notebook:170530
$ docker tag nnabeyang/jupyter-notebook:170530 nnabeyang/jupyter-notebook:latest

```
(当然ですが`nnabeyang/jupyter-notebook`などは適当に使いやすいように変更してください。)

今起動しているコンテナを`docker stop afc4c5294130`で止めてから、次のようにするとSQLが使えるjupyter-notebookが起動します。

```
docker run -d -p 8888:8888  -v `pwd`:/home/jovyan/work  nnabeyang/jupyter-notebook start-notebook.sh --NotebookApp.token=''
```
npmライブラリのBootstrap4をgulpで管理するとき


色々躓いたので備忘録。

最近npmでJSやCSSを管理するのが流行り？と感じたので、そっちへシフトしたときの構築です。

まず、gulpや諸々インストールされているものとして書きます。
また、browserify、vinyl-source-stream等は処理しているものとします。

## jQueryを先ずインストールします

```ruby:console
$ npm install jquery --save
```

`node_modules`ディレクトリ内に`jquery`ディレクトリがあればOK。

## 次にBootstrapをインストールします

```ruby:console
$ npm install bootstrap@4.0.0-alpha.6 --save
```

こちらも`node_modules`内に`bootstrap`ディレクトリがあればOK。

Bootstrap4を使うためにもうひとつ必要なものがあるので、そちらもインストールします。

### Tetherをインストール

```ruby:console
$ npm install tether --save
```

このライブラリがないと正しくコンパイルができないようです。

## gulpfile.js

以下のコードは当方の環境の設定なので、ディレクトリや構造は各々で設定をお願いします。

```javascript:gulpfile.js
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');

var config = require('../config.js');

// JavaScript
gulp.task('js', function() {
	return browserify({
		entries: ['js-dev/script.js']
	})
	.bundle()
	.pipe(source('bundle.js'))
	.pipe(buffer())
	.pipe($.uglify())
	.pipe(gulp.dest(config.paths.cmnDir+'js/'));
});
```


## JavaScriptでjQueryとBootstrapを読み込んでみる

まず、間違ったやり方で書くと、BootstrapがjQueryを認識しません。

```javascript:script.js
var $ = require('jQuery');
require('bootstrap');

$(function() {
	$('h1').css('color', 'blue');
});
```

上記の内容だと、`Uncaught Error: Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.`となりBootstrapが正しくIncludeされませんでした。

`var $ = require('jQuery')`を以下のように書き直します。

```javascript:script.js
window.jQuery = window.$ = require('jQuery');
window.Tether = require('Tether');
require('bootstrap');

(function($) {
	"use strict";
	
	$('h1').css('color', 'blue');
})(jQuery);
```

自分は、＄から書くより`jQuery`を使う癖がついてしまったので、こんな書き方してますがもちろん`window.$`のみでも問題ありません。

jQueryだけ使う場合は、最初の書き方で充分なんですけどね。
でも色々追加するときを考えると上記で書いたほうがいいかな。

## BootstrapのScssをインポートする

こちらはもう普通に`node_modules`ディレクトリから直接読み取りにいってます。

```scss:app.scss
@import "./node_modules/bootstrap/scss/bootstrap.scss";
```

ディレクトリまでの階層は各々調整してください。
自分の場合は、`public/assets/scss/`内に配置しているので、
`@import "../../../node_modules/　〜中略〜　/bootstrap.scss";`このような形になってます。
特定のコミットだけ取り込みたいとき


`cherry-pick` を使う。

#まずはどのコミットを取り込みたいのかをチェック

今回は `shono/master` のコミットを取り込みたいので、以下のコマンドでログをチェック。 

```
git log shono/master --oneline
```

##ログ

```
c4ajfel バナナの画像を追加
c4ekfda りんごの画像を追加
b0f272q Merge branch ...
```

「りんごの画像を追加」に戻したい。

#cherry-pickする

```
git cherry-pick c4ekfda
```

#参考
http://qiita.com/ta__ho/items/8204a22a53b02ee0817e
めっちゃわかりやすい
ドラッグ＆ドロップでコンテンツの配置を変えられるUIを作る (2)

[ドラッグ＆ドロップでコンテンツの配置を変えられるUIを作る (1)](http://qiita.com/pekoporin/items/65de9d1ee3adc9456b54)の続きです。

# グリッドを追加できるようにする（sample-3）

sample-2ではすでに配置されている要素しか利用できないため、新規にGridを追加できるように変更します。
左パネルに用意してある各ボタンがクリックされた場合に、新規Gridを画面中央に表示します。
それをドラッグして任意の位置に挿入することで、レイアウト追加が可能です。

Gridの移動に関する基本的な処理はBlockとほぼ同じです。
Gridの追加に必要な処理として、以下のような変更を行っています。

まずGridを構成するHTMLを、テンプレートとしてHTML内に用意します。
ここではscriptタグで囲んでいますが、今ならtemplateタグでもいいかもしれません。

```html
<script type="text/template" id="le-grid-template-col1">
    <div class="mdl-grid le-grid le-grid--1col">
        <div class="mdl-cell mdl-cell--12-col">
            <div class="le-block-edge"></div>
        </div>
        <div class="le-grid__menu">
            <span class="le-grid__menu_id"></span>
            <button class="mdl-button mdl-js-button mdl-button--icon le-grid-menu__delete">
                <i class="material-icons">delete</i>
            </button>
        </div>
    </div>
</script>
```

あわせて、html内に追加中オブジェクトの表示領域を用意します。
```class="le-object_unplaced"```のdivに対して、テンプレートを出力するようにしています。

```html
            <div class="le-object_unplaced"></div>
        </main>
    </div>
```

次に追加ボタンのクリックイベントを用意します。ここでは

- 上記テンプレートの取得
- テンプレートに付与するためのidを生成（idはGridにマウスカーソルを合わせた際のガイドにも表示）
- テンプレートの内容をhtmlに追加
- pepの設定

を行っています。

```js
$('.le-leftpanel-item__grid').on('click', function(e){
  var $temp = $($($(this).attr('data-template')).text());
  $temp.prop('id', Math.floor( $.now() ));
  $temp.find('.le-grid__menu_id').text($temp.prop('id'));
  $('.le-object_unplaced').show().html($temp);

  $('.le-object_unplaced .le-grid').pep({
    (中略)
  });
```

ドラッグ中の処理はBlock移動の場合と同一です。ドロップ時もほぼ同様ですが、

- Gridの配置先を選択Gridの下（inserAfter）とする
- 背景の削除
- pepのunbind（現時点では配置後の再移動は考慮していません）
- スタイルの除去
- 空であることを示すクラスの付与

を行っています。

```js
obj.$el.insertAfter(obj.activeDropRegions[0]);
$('.le-object_unplaced').hide();
$(obj.activeDropRegions).each(function() {
    $(this).removeClass(obj.options.droppableActiveClass);
});
$.pep.unbind(obj.$el);
obj.$el.attr({
    style: ''
});
// 空グリッドの場合セルに空クラスを付与
if(!obj.$el.find('.le-block').length){
    obj.$el.find('.mdl-cell').addClass('le-grid__empty');
}
```

動作させるとこんな感じになります。
（わかりづらいですが、最初に3カラムグリッドボタンをクリックしています）

![sample-3-01.gif](https://qiita-image-store.s3.amazonaws.com/0/57194/690b6946-fd8b-68bd-746e-9810643a4601.gif)

# ブロックを追加できるようにする（sample-4）

Gridと同様に、Blockも追加できるように修正します。
といってもほぼGridと一緒ですので、ソースも流用となっています。
異なる点としては、

- Blockは配置後も再移動できるようにするため、配置完了のタイミングで配置済みのすべてのBlockに対してpepのイベントを再バインドしている

となります。
細かい修正はありますが、割愛します。

[ドラッグ＆ドロップでコンテンツの配置を変えられるUIを作る (3)へ](http://qiita.com/pekoporin/items/9ee29df12fe8d15a84fb)
もくもく会という勉強法の紹介

[もくもく会](https://www.google.co.jp/search?q=%E3%82%82%E3%81%8F%E3%82%82%E3%81%8F%E4%BC%9A&rlz=1C5CHFA_enJP702JP702&oq=%E3%82%82%E3%81%8F%E3%82%82%E3%81%8F%E4%BC%9A&aqs=chrome..69i57j69i61j0l4.9494j0j4&sourceid=chrome&ie=UTF-8)という勉強会の定義は曖昧ですが、
ここでは自分の主催する会が近いので紹介します。

# もくもく会とは？
- 黙々と作業する
- 似たようなことをやっている人が近くで黙々していると、自分の黙々作業もはかどる

何か新しいことを学びたい、と思ってもなかなか腰があがらない。
場をかえてやるにしても孤独だとなかなか大変。
そんな時にこの会を活用してみてはどうでしょう？
という提案です。

# 運営するには？
- テーマを絞る
- 時間と会場だけ用意する　（例：10:00~18:00）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/7f1a3b98-6877-a83d-8f26-8299bb0e40b1.png)


- 参加時にアンケートで個々人の「やりたいこと」を明確にする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/8772e743-4122-406f-3e1b-f732a514554f.png)

- 開始時に自己紹介と「やりたいこと」を宣言する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/b56aceff-1798-88eb-2018-d7c5eb12b719.png)


テーマ決めは結構重要で、これによって集まる／集まらないもあります。

ですが自分のための勉強に時間を作ると同時に
自分が黙々する時に、仲間がいる感じがして気分が良いという効果があります。
（あと自己紹介もいろんな人がいるというのがあって面白い）

やる時期もいろいろで、参加者の都合（例えば4月とかだと学校関係の人は出にくいとか）の影響あったりします。

# ハッカソンとかと何が違うの？
- ハッカソンは競いあってしまうので、人を選びます。もくもく会は何も競わないので初めての人でも安心。
- 対人関係に慣れてない人でも参加できる。
- 黙々としていることが主なので、邪魔されないで作業できる。
- 関係無いことをはじめてしまっても問題ない（テーマに拘束されない）
- 関係無い話題に飛び火しても問題無い。
- とてもゆるいコミュニティが形成される。（裾野や懐が大きい、まだ海とも山ともつかない、名前のないようなものでも情報交換できる）

- アイデアソンやチームビルディング発表など手間のかかることは一切しません。
運営が楽です。


- 発表もない／やりたい人はしてもよい
自己紹介で足りないものがあるような場合や、何か今日の成果が発表できそうなら発表してもらいます。（強制はしない）

でも、なんだかんだ意見交換がもりあがったりします。

#どうやって人を集めるの？
他にもいろいろあるかと思いますが、自分は
[connpass](https://connpass.com/)とかおすすめです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/4ff6bcca-9e12-a07c-9a3b-3a378cd0a3a6.png)
[エフェクターミニハッカソン](https://effectorhack.connpass.com/)という体で
１７回ほど使わせてもらていますが、
記録も残るのでテーマの良し悪しとか改善点とか学べます。

- 参加者アンケートや出欠機能とかあったり、告知などの通知もやりやすい。　（誰が来たかの把握など楽）
- twitterアカウントなどで入れるので、匿名性もあります　（参加の敷居が低い）
- 参加者のアンケートの内容とかをCSVで出せるので便利　（期待とずれがあった場合の修正がきく）
- 後からでも参加枠や参加人数の変更が楽 (人気がですぎて人が集まりすぎた場合の会場変更など容易）

自分の場合は、何かあった時（体調不良など緊急時対応や忘れ物など）のために本名や連絡先の登録をお願いしています。


#失敗談
- 告知がまわらず、一人だけでやった会もありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/40d56f3f-d421-c90c-bb7e-c04a232f835a.png)

そういう時もあるくらいにゆるくやるのが良いと思われます。

- 単独でやるより、何かしら人気のある会と共同でやるのもおすすめです。（例：PureDataJapanと合同開催）

#おわりに

プログラムを学ぶにしても、何の目的で学びたいと思っているのかは、人それぞれです。
いろんな目的で、同じテーマに向かって学ぶ意思のある人たちがあつまると、良い方向に進んでいくと思います。
初学者の人から、専門の人まで対象が幅広い会になります。
誰が、先生／生徒、上か下かみたいなのもありません。（[ウェザーリポート](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%82%B6%E3%83%BC%E3%83%BB%E3%83%AA%E3%83%9D%E3%83%BC%E3%83%88)の音楽のように、誰がメロディーなのかとかないみたいな）

自分では気がつかないようなところでつまずいている人とか助けられると悦になれます。
（逆に教えてもらえる場合もお互いhappy、何がわからなかったかなど初心に戻れたりとか刺激もある）
→結果同じ志の人が増えていくので良い。
何がコミュニティ形成や成長を阻害しているかなどの生の声が聞ける。（Webとかからでは学べない）

そんなやり方の一つとして利用してもらえれば幸い。

#補足・・・
ここで紹介した[エフェクターミニハッカソン](https://effectorhack.connpass.com/)は「もくもく会」の亜種で、もくもく会の騒がしいバージョンというか、もくもくしている人と発表しているひとがごっちゃになった様式です。（故にミニがついたハッカソン）
ので、似ているけどちと違うかもしれないので注意ください。でも楽しい感じ。もくもくより少し刺激が多いみたいな感じ。
オフラインリアルタイムどう書く F05 を Pharo Smalltalk で

問題：http://nabetani.sakura.ne.jp/hena/ordf05rotblo/
実装リンク集：http://qiita.com/Nabetani/items/a6ed674166a151fd0a0a


Smalltalk 処理系は [Pharo](http://pharo.org/) を使いました。[Squeak](http://squeak.org/) でもコメントの通り一部修正すれば動きます。入力と出力をスペースで区切ったファイル（text.txt）を用意し、それへのパスも 'path\to\test.txt' 部分で指定する必要があります。

Pharo なら Playground、Squeak なら Workspace にコピペして前述の準備を終えたら、右クリックメニューから do it すると実行できます。text.txt の入力と望ましい出力の組を #assert: しているので出力はありません（不一致がなければそのまま終了します）が、solve value: 'a:00000/00110/00100/00100/00000' などと書いた式を右クリックメニューから print it することで個別の結果も得られます。


#コード
```smalltalk
solve := [:data |
   | map rotate result |
   map := (data allButFirst: 2) splitOn: '/'. "use #splitBy: on Squeak"
   rotate := data first caseOf: {
      [$a] -> [[:pt | pt rotateBy: #right centerAt: 2@3]].
      [$b] -> [[:pt | (pt rotateBy: #right centerAt: 2.5@2.5) asIntegerPoint]]}.
   result := (Array new: 5 withAll: '00000') deepCopy.
   [:exit | map doWithIndex: [:str :y | str doWithIndex: [:chr :x |
      ((map at: y) at: x) == $1 ifTrue: [
         | pos |
         pos := rotate value: x@y.
         ((1@1 extent: 5@5) containsPoint: pos) ifFalse: [result := nil. exit value].
         (result at: pos y) at: pos x put: $1
      ]
   ]]] valueWithExit.
   result ifNil: ['-'] ifNotNil: [result joinUsing: '/'] "use #joinSeparatedBy: on Squeak"
].

FileStream oldFileNamed: 'path\to\test.txt' do: [:file |
   [file atEnd] whileFalse: [
      | pair |
      pair := file nextLine splitOn: ' '. "use #splitBy: on Squeak"
      self assert: [(solve value: pair first) = pair second]
   ]
]
```
```test.txt
a:00000/00110/00100/00100/00000 00000/00000/00000/11100/00100
b:00000/00000/00000/00011/00011 -
a:00000/00000/00000/00011/00011 -
b:00000/00000/00100/00000/00000 00000/00000/01000/00000/00000
a:00000/00000/00100/00000/00000 00000/00000/00000/01000/00000
...
```

#解説
与えられたデータの最初の文字が a か b かで rotate の処理を切り替えています。なお、$x は Smalltalk の文字オブジェクトのリテラルです。


```smalltalk
rotate := data first caseOf: {
   [$a] -> [[:pt | pt rotateBy: #right centerAt: 2@3]].
   [$b] -> [[:pt | (pt rotateBy: #right centerAt: 2.5@2.5) asIntegerPoint]]}.
```

回転後のブロックの位置は、そのブロックの位置を左上原点の x-y 座標に見立てつつ、Smalltalk 組み込みの Point クラスの #rotateBy:centerAt: メソッドを使用することで手抜きをしています。ブロックが中心となる a の場合は整数座標、境界が中心になる b では 0.5 を減ずることで適切な結果が得られます。

結果を書き込む配列は '00000' を要素に持つ、サイズ 5 の配列を deepCopy して同一オブジェクトが 5個ある状態を解消しつつ作りました。

```smalltalk
result := (Array new: 5 withAll: '00000') deepCopy.
```

回転の先の座標が 5×5 の範囲をこえなければ result の対応する場所に $1 を書き込みます。はみ出した場合は result := nil し、exit value によって直ちにループを抜けます。

```smalltalk
| pos |
pos := rotate value: x@y.
((1@1 extent: 5@5) containsPoint: pos) ifFalse: [result := nil. exit value].
(result at: pos y) at: pos x put: $1
```

参考まで BlockClosure>>#valueWithExit の定義はこのようになっていて、ある種の継続渡しスタイル (CPS, Continuation-passing style) でループを抜けられるしくみになっています。

```smalltalk
BlockClosure >> valueWithExit 
   self value: [ ^nil ]
```
プログラミング言語Go読書会#10(6.3-7.2)[2017/05/24]

[Go読書会 #10](https://lancers-engineer.connpass.com/event/57767/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 6章 メソッド
  + 6.3 構造体埋め込みによる型の合成
  + 6.4 メソッド値とメソッド式
  + 6.5 例：ビットベクタ型
  + 6.6 カプセル化
+ 7章 インタフェース
  + 7.1 契約としてのインタフェース
  + 7.2 インターフェース型

## 話題に上がった話

### 6.3 構造体埋め込みによる型の合成

ここでは、構造体埋め込みによるメソッドの格上げ(promoted)と、一見のオブジェクト指向言語にある継承のように見えるこれは継承ではなく、派生クラスを作っているのでもないので気をつけること。とされている点が話題になりました。構造体が埋め込まれると、その構造体のメソッドがpromotedされて、埋め込まれた側の構造体のメソッドのように使えるようになりますが、これは、ラッパーメソッドが自動ではやされている為であり、違うものです。

この機能をうまく使うと、余計な記述をせずに、既存の機能をさもその構造体のメソッドであるかのように使うことができるので便利かつコードが読みやすくなります。

### 6.4 メソッド値とメソッド式

ここでは、特定のレシーバに結びつけている関数を生成する`メソッド値(method value)`と、特定のレシーバーに結びついてない`メソッド式(method expression)`がでてきました。メソッド式の方がちょっと特殊で以下のようになります。

```go
m := Hoge.method_name

m('レシーバーに値するもの', '本来の引数')
```

特定の構造体の紐付いたメソッドを別の構造体インスタンスに使用することができるようになります。


### 6.6 カプセル化

ここでは、Goでのカプセル化に使用される可視性の制御である`先頭が大文字であるかないか`と、実際にカプセル化がどのようなケースで役に立つかが話題になりました。いわゆる保守性を考えた場合に役に立つのと、実際に保守の際に役に立った例などが話されました。

### 7.1 契約としてのインタフェース

ここでは、PrintfとSprintfを例に出して、`契約の定義`としてのインタフェースの話が出てきました。いわゆるjavaなので出てくるinterfaceに近いものかなと、その定義されたinterfaceの関数を満たすものは別の型で置き換えることができるのでプログラミングの自由度がまします。慣れてないといまいちぴんとこない感じはするのですが、定義を合わせるだけで型が違う処理を共通化できたりするのですごく便利です。

### 7.2 インターフェース型

ここでは、構造体で出てきた埋め込みがインタフェースでもやれることが書かれていました。そして、単一メソッドしか定義してないインタフェースを組み合わせて、新しいインタフェースを定義すると保守性などの観点で便利じゃないかということが話題になりました。

ここまで呼んだところで、時間になりました。次回は `7.3 インターフェースを満足する`からです。
mysqlサーバのチューニング

#mysqlサーバのチューニング

my.cnfで最低限調整した方が良い設定項目をメモしておく。
この設定でクエリキャッシュも有効にしている。

innodb_buffer_pool_size = 512M
innodb_log_file_size=128M
key_buffer_size = 512M
read_buffer_size = 1M
sort_buffer_size = 1M
read_rnd_buffer_size = 4M
query_cache_type=1
query_cache_size = 128M
query_cache_limit = 2M

数値はすべて仮。

尚、innodb_log_file_sizeを調整した後、初回起動時にlogファイルを削除しておかないと起動エラーになるといった情報もあるが、それは5.6.8以前の模様。
再起動してもなんのエラーも発生しなかった。
下記にもその記述があり。
https://dev.mysql.com/doc/refman/5.6/ja/innodb-data-log-reconfiguration.html
Ruby で文字列が数字だけで構成されているか判定する (簡易ユニットテスト付き)

## ソースコード (judging_machine.rb)

```ruby
class JudgingMachine

  # 文字列が数字だけで構成されていれば true を返す
  def number?(str)
    # 文字列の先頭(\A)から末尾(\z)までが「0」から「9」の文字か
    nil != (str =~ /\A[0-9]+\z/)
  end

end
```

## テストコード (judging_machine_test.rb)

```ruby
require 'test/unit'
require './judging_machine'

class JudgingMachineTest < Test::Unit::TestCase
  def test_number?
    m = JudgingMachine.new
    assert_true(m.number?('1'))
    assert_true(m.number?('12'))
    assert_true(m.number?('012'))
    assert_false(m.number?(''))
    assert_false(m.number?('+1'))
    assert_false(m.number?('-1'))
    assert_false(m.number?('abc'))
    assert_false(m.number?('123abc'))
    assert_false(m.number?('abc123'))
    assert_false(m.number?("123\n"))
    assert_false(m.number?("123\n123"))
    assert_false(m.number?("123\nabc"))
    assert_false(m.number?("\n123"))
    assert_false(m.number?('１２３')) # 全角
    assert_false(m.number?('一二三')) # 漢数字
    assert_false(m.number?('ⅠⅡⅢ')) # ローマ数字
    assert_false(m.number?(nil)) # nil
    assert_false(m.number?(Object.new)) # 文字列じゃない
    assert_false(m.number?(Array.new)) # 文字列じゃない
  end
end
```

## テストの実行結果

19個のアサーションチェックが通った。

```
$ ruby judging_machine_test.rb 
Loaded suite judging_machine_test
Started
.

Finished in 0.001435 seconds.
----------------------------------------------------------------------------------------------------
1 tests, 19 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
----------------------------------------------------------------------------------------------------
696.86 tests/s, 13240.42 assertions/s
```

## 「=~」メソッドの挙動

文字列クラス String は正規表現で判定する。

instance method String#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/String/i/=3d=7e.html

> 正規表現 other とのマッチを行います。 マッチが成功すればマッチした位置のインデックスを、そうでなければ nil を返します。
> other が正規表現でも文字列でもない場合は other =~ self を行います。

ほぼすべての親クラスである Object クラスにも「=~」メソッドが定義されている。

instance method Object#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/Object/i/=3d=7e.html

> 右辺に正規表現オブジェクトを置いた正規表現マッチ obj =~ /RE/ をサポートするためのメソッドです。 常に nil を返します。
> この定義により、=~ が再定義されたオブジェクトでは正常にマッチを行い、 それ以外のものは nil を返すようになります。

## Ruby に標準搭載されているユニットテストのライブラリ

ちょっとした動作確認には標準で同梱されている test/unit ライブラリが便利。

library test/unit (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/library/test=2funit.html

> ユニットテストを行うためのライブラリです。
> このライブラリは 2.2.0 からbundled gem(gemファイルのみを同梱)になりました。

assert_true などのメソッドはこのあたりのリファレンスマニュアルに載っている。

Module: Test::Unit::Assertions — test-unit - test-unit
http://test-unit.github.io/test-unit/en/Test/Unit/Assertions.html

## 参考資料

- instance method String#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/String/i/=3d=7e.html
- 正規表現 (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html
- test-unit - a Unit Testing Framework for Ruby http://test-unit.github.io/
オラクルEBS標準API

#oracle EBS 標準API
忘れないようにメモ

様々なパッケージが用意されているがよく使うもの
###機能登録

```
  --機能登録・更新にはLOAD_ROWを使う
  FND_FORM_FUNCTIONS_PKG.LOAD_ROW (
      x_function_name           => '機能名' --必須
    , x_application_short_name  => NULL
    , x_form_name               => NULL
    , x_parameters              => NULL
    , x_type                    => 'タイプ' 
    , x_web_host_name           => NULL
    , x_web_agent_name          => NULL
    , x_web_html_call           => 'HTMLコール'
    , x_web_encrypt_parameters  => 'N'
    , x_web_secured             => 'N'
    , x_web_icon                => NULL
    , x_object_name             => NULL
    , x_region_application_name => NULL
    , x_region_code             => NULL
    , x_user_function_name      => 'ユーザー機能名'
    , x_description             => '摘要'
    , x_owner                   => NULL
    , x_custom_mode             => 'FORCE'
  );

```
【タイプ】
FORM　WWK　REST　WWL　MOBILE　DBPORTLET　WWW　SERVLET　PROCESS
INTEROPJSP　JSP　SEPLINE　JTFWEBPORTLET　INTERFACE　SB_INDIRECT_OP　SUBFUNCTION
WEBPORTLET　UNKNOWN　ADFX　WIDGET　FUNCTION　WWLG

###メニュー定義の・登録・更新

```
  FND_MENUS_PKG.LOAD_ROW (
      X_MENU_NAME           => 'メニュー名'
    , X_MENU_TYPE           => NULL
    , X_USER_MENU_NAME      => '2列目のメニュー名'
    , X_DESCRIPTION         => '摘要'
    , X_OWNER               => NULL
    , X_CUSTOM_MODE         =>  'FORCE'
  );

```

###職責定義の追加・更新

```
  FND_RESPONSIBILITY_PKG.LOAD_ROW
      (X_APP_SHORT_NAME               => 'アプリケーション短縮名'
      ,X_RESP_KEY                     => '職責キー'
      ,X_RESPONSIBILITY_NAME          => '職責名'
      ,X_OWNER                        => NULL
      ,X_DATA_GROUP_APP_SHORT_NAME    => 'アプリケーション短縮名'
      ,X_DATA_GROUP_NAME              => 'データグループ名'
      ,X_MENU_NAME                    => 'トップメニュー名'
      ,X_START_DATE                   => '有効日(自)'
      ,X_END_DATE                     => '有効日(至)'
      ,X_DESCRIPTION                  => '摘要'
      ,X_GROUP_APP_SHORT_NAME         => '要求グループのアプリケーション短縮名'
      ,X_REQUEST_GROUP_NAME           => '要求グループ名'
      ,X_VERSION                      => 'バージョン'
      ,X_WEB_HOST_NAME                => NULL
      ,X_WEB_AGENT_NAME               => NULL
      ,X_CUSTOM_MODE                  => 'FORCE'
      ,X_LAST_UPDATE_DATE             => NULL
  );
```
バージョン：[4],[W],[M]

###メニュー定義に項目の追加・更新
```
    FND_MENU_ENTRIES_PKG.LOAD_ROW(
        x_mode             => 'MERGE'
      , x_ent_sequence     => '項目の順番'
      , x_menu_name        => 'メニュー名'
      , x_sub_menu_name    => 'サブメニュー名' --機能かサブメニューどちらか 
      , x_function_name    => '機能名'
      , x_grant_flag       => 'Y'
      , x_prompt           => 'プロンプト'
      , x_description      => '摘要'
      , x_owner            => NULL
      , X_CUSTOM_MODE      => 'FORCE'
      , X_LAST_UPDATE_DATE => null
    );

```

###排他の追加・更新

```
　FND_RESP_FUNCTIONS_PKG.LOAD_ROW (
      X_APP_SHORT_NAME => 'アプリケーション短縮名',
      X_RESP_KEY       => '職責キー',
      X_RULE_TYPE      => '排他対象のタイプ（M,F）',
      X_ACTION         => 'メニューidまたは機能id',
      X_OWNER          =>　NULL
  );
 
```
初めてのECCUBE

#初めてのECCUBE
PHP、Symfony2の学習を終えて、初めてECCUBEを触ることになったので勉強がてら読んだ記事や気になったものをまとめていく。

#ECCUBEの概要

>日本企業の株式会社ロックオンが提供している、ECサイト構築パッケージの名称です。日本発で、シェアは国内NO.1のオープンソースのソフトウェア
引用元：https://www.kagoya.jp/howto/netshop/ec-cube/

本家サイトからダウンロードできる。
http://www.ec-cube.net/

#気になったことメモ
####テンプレートエンジン
HTMLソース(テンプレート)とPHP(プログラム)を分離し、デザイナーとプログラマが同時に開発を進められるらしい。触りながらチェックしたい。

####2系と3系の違い（テンプレートエンジン）
3.0系のアップデートに伴ってsmartからTwigに変更されている。そもそもPHPも独自のものからSymfony系統に変更されてた。だからsmartからTwigに変更されたんだろう。

####UIの違い
2系はPC／スマートフォン／フィーチャーフォンそれぞれ最適化された別々のテンプレートで管理してるらしい。うげ。管理画面もPCだけらしい。まじか。
3系はユーザー画面、管理画面ともにレスポンシブルみたい。そっちのがいいですよね。

####長所、短所
集客を独自で行う必要があるので、集客しやすいようなコードを埋め込んであげたほうがよい？？
![スクリーンショット 2017-05-30 12.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/167850/fcbb8a3f-098f-30ef-5827-3b4a279c924c.png)
本家サイトから図を転用

###EC-CUBE3はプラグインで拡張
>EC-CUBE2はプラグイン機能を前提とした設計ではありませんでした。
>引用元：[EC-CUBE3が公開されて1年が経過するので、EC-CUBE3の現状についてまとめてみようと思う](https://www.thank-u.net/blog/eccube/eccube3/)

「商品管理」「顧客管理」「受注管理」をコア機能として独立し、その他の機能はプラグインで実装する。そのため、プラグインによる機能追加・機能拡張が容易になったらしい。一方で要望と違うことを実現しようとするとカスタマイズが必要になる。この辺でカスタマイズの自由度が減っているのかも。

###実際のプラグイン
- 決済系
- デザインテンプレート系
- 機能拡張系

機能拡張系が100くらい用意されている。

#参考資料
https://www.kagoya.jp/howto/netshop/ec-cube/
http://www.eccube-school.jp/files.html
[今から始めるEC-CUBE　～ver2系と3系の違い編～](https://www.sidethree.co.jp/blog/4622/)
[EC-CUBE3が公開されて1年が経過するので、EC-CUBE3の現状についてまとめてみようと思う](https://www.thank-u.net/blog/eccube/eccube3/)

#スライドシェア
[Symfonyコンポーネントで生まれ変わるEC-CUBE](https://www.slideshare.net/shinichitakahashi790/symfonyeccube)
[EC-CUBE Ver2とVer3 どう違う？　構築と運用の実際](https://www.slideshare.net/ssuserd946d8/eccube-ver2ver3?next_slideshow=1)
[EC-CUBEユーザカンファレンス2016](https://www.slideshare.net/chihiroadachi3/eccube2016)
gitlabにSSH公開鍵を設定する


こんにちは、@pompom0c0 です。
gitlabからcloneするときに、HTTPからだとPermission denied (publickey)エラーが発生するので、
SSHの設定をしたときのまとめです。


## 1. 公開鍵と秘密鍵を生成
ホームディレクトリに.sshディレクトリを作成し、公開鍵と秘密鍵を生成します。

```
$ cd
$ mkdir .ssh
$ ssh-keygen
```

デフォルトの設定では、
公開鍵: ~/.ssh/id_rsa.pub
秘密鍵: ~/.ssh/id_rsa

と命名されています。秘密鍵は絶対に流出させないようにしましょう。
流出したら新しく作り直して、サーバーに登録した公開鍵も更新しましょう。

## 2. 秘密鍵をキーチェインに登録する(Mac限定)
Macの方がセキュリティが厳しいため、ログインする際に毎回パスワードを聞かれます。
キーチェインに登録すれば、パスワード入力を省略できるので、乗っ取られるリスクの少ない人はぜひ設定しましょう。

```
$ openssl rsa -in id_rsa -out id_rsa2
```

id_rsa2のファイルにパスワードが登録されたので、このファイルをid_rsaに名前変更します。
(元のid_rsaファイルは念のためにバックアップを取っておくと良いです。)

## 3. ファイルやディレクトリのアクセス権を変更
id_rsaの所有者に読み込みと書き込みの権限をつけます。

```
$ chmod 600 id_rsa
```

## 4. gitlabに公開鍵を設定
公開鍵をgitlabにコピー&ペーストします。この時、vimからマウス操作でやるとスペースなどが混入することが多いので、
pbcopyコマンドか、テキストエディタからコピーするといいです。

```
$ cat id_rsa.pub | pbcopy
```

gitlabのProfile Settings > SSH Keysに飛び、Keyに公開鍵を貼ります。
Titleはid_rsa.pubでも、なんでも大丈夫です。

![ssh-image01.png](https://qiita-image-store.s3.amazonaws.com/0/83113/741fa1b3-d7f1-58f7-5348-ddb507d6ed31.png "ssh-image01.png")


Add Keyを押して完成です。


## まとめ
HTTPでcloneもできなくはないのですが、SSHの方が安全ですし、
Permission denied (publickey)エラーが発生した時困ると思うので、早めに設定しておくことをオススメします:)

## 参考記事

ssh公開鍵認証設定まとめ
http://qiita.com/ir-yk/items/af8550fea92b5c5f7fca

Linuxコマンド集【 chmod 】 ファイルやディレクトリのアクセス権を変更する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230728/

Macな人は pbcopy が便利
http://qiita.com/mktakuya/items/c57a12b5b072a658acd0
Google Admin SDK でユーザーを登録する(python)

## はじめに
GSuite（GoogleApps）を利用してユーザー管理をしていて、大量のデータ投入をする必要がありました。データの読み出しなどの記事はチュートリアルでよく見たのですが、登録に関してあまり記事が無かったので、何かのお役に立てればと記事を書きます。

## コードを書く前に必要なこと
### プロジェクトの登録
[デベロッパーコンソール](https://console.developers.google.com/apis/library)からプロジェクト適当な名前で作成します。
![プロジェクトの登録.png](https://qiita-image-store.s3.amazonaws.com/0/81348/19ba01b9-dc89-1c51-1d44-6ada45138624.png)

ダッシュボードに戻って、作成したプロジェクトを選択し、APIを追加します。
![APIを有効にする.png](https://qiita-image-store.s3.amazonaws.com/0/81348/28cb6123-407a-7db7-9027-94efb28efd75.png)

「Admin SDK」を有効にして、認証キーを作成してください。
 - OAuthで認証情報を作成
 - アプリケーションの種類：「その他」で名前は適当に入れる
![AdminSDK1.png](https://qiita-image-store.s3.amazonaws.com/0/81348/fcab9dc4-246b-f34f-7af8-e8aa2494aea3.png)

認証キーが作成され、一覧に表示されるので、ダウンロードして適当な場所に保存します。
（コード例では：[自分のホームディレクトリ]/.test_secrets/ 配下に「client_secret_test.jso.json」として保存します）

だいたいこれで動かす準備ができました。

## 実際のコード
```python:create.rb
# -*- coding: utf-8 -*-

import os
import httplib2
from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

def main():
	try:
		import argparse
		parser = argparse.ArgumentParser(parents=[tools.argparser])
		flags = parser.parse_args()
	except ImportError:
		flags = None

	# 認証情報を格納するディレクトリ「.credentials」の設定。ディレクトリが無い場合は作成
	credential_dir = os.path.join(os.path.expanduser('~'), '.test_credentials')
	if not os.path.exists(credential_dir):
		os.makedirs(credential_dir)

	# 認証ファイルのパスを設定と読み込み
	credential_path = os.path.join(credential_dir, 'admin-directory_v1_test.json')
	store = Storage(credential_path)
	credentials = store.get()

	# 認証ファイルが無い場合は作成
	if not credentials or credentials.invalid:

		# 使用する機能の範囲を設定
		scopes = [
			'https://www.googleapis.com/auth/admin.directory.user',
		]

		# 認証キーの設定
		secret_dir = os.path.join(os.path.expanduser('~'), '.test_secrets')
		if not os.path.exists(secret_dir):
			os.makedirs(secret_dir)

		# 認証キーから認証処理を行うクラスのインスタンスを生成
		flow = client.flow_from_clientsecrets(
			os.path.join(secret_dir, 'client_secret_test.json'), scopes)

		# アプリケーションの名前
		flow.user_agent = 'User register Test Tool'

		if flags:
				credentials = tools.run_flow(flow, store, flags)
		else: # Python 2.6　互換用処理
			credentials = tools.run(flow, store)
		print('証明書を保存しました： ' + credential_path)

	# 認証を行う
	http = credentials.authorize(httplib2.Http())
	app_admin_service = discovery.build('admin', 'directory_v1', http=http)

	# 作成するユーザー情報を作成
	register_data = {
		'primaryEmail':'test-user@hoge.com',
		'name':{
			'givenName':'太郎',
			'familyName':'山田',
		},
		'suspended':False, # アカウント停止の状態にしない
		'password':'p-a-s-s-w-o-r-d',
	}

	# 登録実行
	results = app_admin_service.users().insert(body=register_data).execute()

	if(int(results['id']) > 0):
		print("googleアカウントを作成完了！")
	else:
		print("googleアカウントを作成に失敗しました")


if __name__ == '__main__':
	main()
```
プログラムを実行するとブラウザが立ち上がり、アクセス許可を求められますので、OKをクリックして実行します。
![許可リスエスト.png](https://qiita-image-store.s3.amazonaws.com/0/81348/31c476aa-9636-f6d1-5017-45482e97cdd3.png)

## 参考
[G Suite Admin SDK Directory API
](https://developers.google.com/admin-sdk/directory/v1/reference/users)
Gitのコミットに絵文字を使おう！

# ✨はじめに
みなさん, Gitを活用にしていますか？
コードのログを管理し, 大人数での作成などでもすごく効果的に使うことが出来ます。
その中でコミットをこまめにすることを忘れがちになってしまうと思います。
そこで効果的なのがコミットメッセージに絵文字を使うことです。

# 🚀絵文字コミット
この絵文字コミットはAtomが正式にEmoji Prefixとしてルール化したことで有名です。
まずそれぞれのコミットに対してそれを表すEmojiを定義します。
(自分が使っているのはこんな感じです)

|絵文字|文字列|意味|
|:---:|:---|---|
|:art:|art|コードのフォーマットや構造にテコ入れ|
|:rocket:|rocket|パフォーマンスを改善|
|:pencil2:|pencil2|ドキュメントを書いた時|
|:construction:|construction|作業中|
|:heavy_plus_sign:|heavy_plus_sign|機能を追加,完成|
|:heavy_minus_sign:|heavy_minus_sign|機能を削除|
|:speaker:|speaker|ログを追加|
|:mute:|mute|ログを削除|
|:bug:|bug|バグ修正|
|:white_check_mark:|white_check_mark|テスト関係|
|:lock:|lock|セキュリティ関係|
|:heavy_exclamation_mark:|heavy_exclamation_mark|更新やTag付|

そしてこれをコミットメッセージの前に**一つだけ**つけます
それだけです。

導入すると写真のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/4b19f816-22ec-c69b-6d3a-3479eb65f3c5.png)
([syuchan1005/SoundME](https://github.com/syuchan1005/SoundME)より)


これを導入する事によるメリットが多く存在します。

- コミットがきれいになる
例えば「機能の追加及びセキュリティの更新」をコミットしようとすると, それを表すEmojiはありません。
Emojiをつけるためにはコミットを分ける必要があります。
こうすることでわかりにくいコミットが減り, コミットの単位を揃えることが出来ます

- コミットが見やすくなる
そのコミットがだいたい何をしたかがわかりやすくなります。

などがあります

# 🎨便利に使うには
ターミナルでの操作には[参考ページ]内の[Emojiで楽しく綺麗なコミットを手に入れる]を見ていただけると丁寧に解説されています。

## Jetbrains系IDE(IDEAなど)での場合
まず, [EmojiPrefix](https://plugins.jetbrains.com/plugin/9725-emojiprefix)というPluginを導入します。
Projectのルートディレクトリに[.emojirc]というファイルを作成し, 書き込みます。

```text:書き込み例
art=コードのフォーマットや構造にテコ入れ
rocket=パフォーマンスを改善
pencil2=ドキュメントを書いた時
construction=作業中
heavy_plus_sign=機能を追加,完成
heavy_minus_sign=機能を削除
speaker=ログを追加
mute=ログを削除
bug=バグ修正
white_check_mark=テスト関係
lock=セキュリティ関係
heavy_exclamation_mark=更新やTag付
```
そして普通に[VCS] -> [Commit Changes]をクリックしコミットします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/8770d718-4093-37e6-f288-fad36cb38beb.png)
するとこんな感じでダイアログがでます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/1ab75b81-be9e-a6fb-69cd-0971bff0d217.png)
つけたいものを選択し(今回はrocket)[OK]をクリックします
するとしっかりEmojiつきでコミットされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/4ae9cf8d-39dd-daba-bb47-a613b90b6f3c.png)

# ✅さいごに
絵文字コミットは簡単にできる上, コミット力の向上も見込めるのでぜひ導入してみてください！

# 📝参考ページ
[Emojiで楽しく綺麗なコミットを手に入れる](http://goodpatch.com/blog/beautiful-commits-with-emojis/)