OmniAICreator/Qiita-1.07M huggingface dataset:
CS-CART アカウント回りのSmartyコード


---
テンプレート作成時に便利なSmartyコード集（アカウント関連回り）を作りましたので共有します。(CS-CART Ver.4.3.6)

---

##ログイン中かどうか調べる
```
{if $auth.user_id}...{/if}
```

##アカウント情報に氏名がある場合は氏名、無い場合はメールアドレスを表示する。
```
{if $user_info.firstname || $user_info.lastname}
    <p>{$user_info.firstname} {$user_info.lastname}</p>
{else}
    <p>{$user_info.email}</p>
{/if}
```

##プロフィール更新ページへのリンク
```
 <a href="{"profiles.update"|fn_url}" rel="nofollow" >{__("profile_details")}</a>
```

##注文履歴ページへのリンク
```
<a href="{"orders.search"|fn_url}" rel="nofollow">{__("orders")}</a>
```

##返品リクエストページへのリンク（要返品管理アドオン）
```
 <a href="{"rma.returns"|fn_url}" rel="nofollow">{__("return_requests")}</a>
```

##所持ポイントを表示する（要ポイントアドオン）
```
<p>{$user_info.points|default:"0"}</p>
```

##ポイント獲得履歴ページへのリンク（要ポイントアドオン）
```
<a href="{"reward_points.userlog"|fn_url}" rel="nofollow">{__("my_points")}</a>
```

##ほしい物リストへのリンク（要ほしい物リストアドオン）
```
<a href="{"wishlist.view"|fn_url}" rel="nofollow">{__("wishlist")}</a>
```

##ほしい物リストに入っている商品の数を表示（要ほしい物リストアドオン）
```
{if $wishlist_count > 0}{$wishlist_count}{/if}
```

##サインアウトボタンを表示
```
<a href="{"auth.logout?redirect_url=`$return_current_url`"|fn_url}" rel="nofollow" class="ty-btn ty-btn__primary">{__("sign_out")}</a>
```

##サインアウト|サインイン|サインアップボタン
```
<div class="ty-account-info__buttons buttons-container">

    {if $auth.user_id}
    
    	 //SIGN OUT BUTTON
        <a href="{"auth.logout?redirect_url=`$return_current_url`"|fn_url}" rel="nofollow" class="ty-btn ty-btn__primary">{__("sign_out")}</a>
        
    {else}
    
		 //SIGN IN BUTTON
        <a href="{if $runtime.controller == "auth" && $runtime.mode == "login_form"}
                     {$config.current_url|fn_url}
                 {else}
                     {"auth.login_form?return_url=`$return_current_url`"|fn_url}
                 {/if}" 
                 {if $settings.Security.secure_storefront != "partial"}
                     data-ca-target-id="login_block{$block.snapping_id}"
                     class="cm-dialog-opener cm-dialog-auto-size ty-btn ty-btn__secondary"
                 {else}
                     class="ty-btn ty-btn__primary"
                 {/if}
                 rel="nofollow">{__("sign_in")}</a>
        
        // REGISTER BUTTON         
        <a href="{"profiles.add"|fn_url}" rel="nofollow" class="ty-btn ty-btn__primary">
        {__("register")}</a>
        
        //HIDDEN FLOATING LOGIN DIALOG BOX  
        {if $settings.Security.secure_storefront != "partial"}
           <div id="login_block{$block.snapping_id}" class="hidden" title="{__("sign_in")}">
               <div class="ty-login-popup">{include file="views/auth/login_form.tpl" style="popup" id="popup`$block.snapping_id`"}</div>
           </div>
        {/if}
        
    {/if}
    
</div>
```
Spring Tool Suite でアップデートエラーが出るときの解決法

STSを起動すると下の画像のようなエラーが出るときの解決法
基本的にEclipseの問題

![参考画像(http://alpha-music.sub.jp/wp/?p=96)](https://qiita-image-store.s3.amazonaws.com/0/124833/db5d7b60-813a-7a6e-6e04-d97fc95f3b22.png)
[参考画像](http://alpha-music.sub.jp/wp/?p=96)

##基本的にNo repository found containing のエラー
アップデートするときに、更新するファイルがあるかどうかを確認する。
しかし、その更新を確認するサーバー（リポジトリー）が見つからない。

##なんでそんなことが起こるか
ローカルにキャッシュしているサーバの情報が古いため

##どうしたらいいか
サーバーの情報（リポジトリーの参照先）を更新する。

1. 「Window」>「Preferences」を選択して設定画面を開く。
1. Install/UpdateのAvailable Software Sitesをクリック。
1. エラーメッセージが出てた名前のソフトをクリックしReloadボタンを押す。（エラー出てる分だけ）
![こんな感じ](https://qiita-image-store.s3.amazonaws.com/0/124833/3e55cd4e-f351-861a-fed7-c01029df3476.png)

こんな感じの画面

##参考
+ [Eclipseのアップデートエラー](http://alpha-music.sub.jp/wp/?p=96)
+ [Eclipseで No repository found containing が発生した場合](http://logroid.blogspot.jp/2012/05/eclipse-no-repository-found-containing.html)
Onsen UI Navigator React Component の pushPageメソッド

## NavigatorのpushPageメソッドでコンポーネントのpropsはどうして渡す？

こんな感じでコンポーネントオブジェクトと一緒に、propsで指定してあげれば渡るようです。

```js
this.props.navigator.pushPage({comp: Component, props: {userid: userid}});
```

最初はpushPageの第2パラメタかと思いましたが、こちらには遷移アニメーションのパラメタだけみたいです。凄ぇ地雷でした:bomb:

## 新たな問題発生(2016/08/12追記)

この方法でプロパティを渡しても、所謂Reactのpropsになっていない模様。親の状態をプロパティに設定して、setStatusメソッドを呼び出しても子コンポーネントには伝搬されない(子コンポーネントのcomponentWillReceivePropsが呼ばれない)。

react-onsenuiでは親に状態持たせるのが間違いなのかしら。それともなにか根本的に間違えているのだろうか。redux使えば解決するのかなぁ。
Windows10でBashを使ってみる２ (TensorFlowインストール)

#　コマンド プロンプトのコピペを有効にする
コマンドプロンプトのウィンドウのタイトル部分にマウスを合わせ、右クリックから「プロパティ」を選択
「編集オプション」のチェックボックスをすべてチェックする
![キャプチャ003.PNG](https://qiita-image-store.s3.amazonaws.com/0/135967/f261eaeb-82be-e353-d065-e2a26d179536.png)

# Pythonのバージョン確認
```Bash
$ python -V
```
Python 2.7.6がインストールされている
![キャプチャ001.PNG](https://qiita-image-store.s3.amazonaws.com/0/135967/3266a607-5a32-0d2b-5dc9-d7e9c9e559ce.png)

# Pythonの仮想環境(pip)をインストール
```Bash
$ sudo apt-get install python-pip python-dev
```
![キャプチャ002.PNG](https://qiita-image-store.s3.amazonaws.com/0/135967/d5a25e30-d28d-4a44-ed95-4459f1762605.png)

155 MBほど使用
「Y」を入力

# TensorFlowインストール
```Bash
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
```

# TensorFlow動作確認
pythonを起動する

```Bash
$ python
```

```Python
>>> import tensorflow as tf
>>> sess = tf.Session()
>>> a = tf.constant(2)
>>> b = tf.constant(3)
>>> sess.run(a+b)
5
>>>
```

Windows10でBashを使ってみる１
(http://qiita.com/rightoffreedom/items/3265eed2a3d2a207f594)
ローカルにないブランチをリモートから持ってくる時はPULLしない

ローカルにはまだないブランチをリモートから持ってきたい、という状況を考えます。
たとえば、誰かと共同で追加機能の開発をしていて、そのパートナーが作成したブランチをリモートを介して共有したい、というようなことです。
あるいは、一人で開発していても、複数の端末を用いている場合には同様の状態になります。

ローカルにないブランチをリモートから持ってくるときには `git pull` では駄目なようです。というのも、 `git pull` は `git fetch` からの `git merge FETCH_HEAD` と同じなので、引っ張ってきた新しいブランチの内容が自分が現在いるブランチにマージされてしまいます。そうではなく、ローカルに同名・同内容のブランチを作りたいわけです。

これを実現するには、`fetch`コマンドで、マージせずに情報を引っ張って、`checkout`します（Thanks: @tomohisaota さん）

    git fetch
    git checkout newbranch 


参考：[Pulling code from remote git branch, when it does not exist locally](http://stackoverflow.com/questions/8837980/pulling-code-from-remote-git-branch-when-it-does-not-exist-locally)
DB2でDBがないのにあると言われた話

開発環境構築のお手伝いをしている時にDB2でDBが作れない！という方に遭遇。
みんな作れているのになんでその環境だけ作れないのさ？と思い調査した時のお話。

# 環境
Windows7
DB2 Express-C 10.1.0.872

# CREATE DB実行時に発生したエラー
```
CREATE DB DB_NAME USING CODESET UTF-8 TERRITORY JP
SQL1005N  データベース別名 "DB_NAME"は、すでにローカル・データベース・ディレクトリーまたはシステム・データベース・ディレクトリーのどちらかに存在しています。
```

# 解析
いや、もうDBできてるんでしょ？
`db2 list db directory`してみる。
あれ？出てこない。

何かゴミが残ってるのかな？
`DROP DB DB_NAME`してみる。
```SQL1013N  データベース別名またはデータベース名 "DB_NAME"が見つかりませんでした。  SQLSTATE=42705```
DBは見つからない。

じゃあ作れるでしょ？もう一回
`CREATE DB DB_NAME USING CODESET UTF-8 TERRITORY JP`してみる。
同じ存在していますエラーが発生。
OK。状況は理解できた。DBがないのにあると言われる。トンチですか？

# 対応
`LIST DATABASE DIRECTORY ON C:`
するとカタログされていないがディスク上に存在するDB_NAMEが表示された。
（`C:`ドライブでなければ別のドライブにいたかもしれない）

一旦、`DB2 CATALOG DATABASE DB_NAME ON C:`でカタログしてあげると
`db2 list db directory`で表示されるようになったのでDROPしてからCREATE DBを実行して解決。

# 原因
エラーが発生した端末では過去に偶然、同名のDBを作成し削除した事があった模様。
（DB_NAMEは検証環境として誰でも思いつきそうな恐ろしく無難な名前だった）
もっとオリジナティ溢れる名前を指定しておけばこんな事にはならなかったのだろうな、
と思いつつも勉強になったので感謝。
Fragment周りで発生するjava.lang.IllegalStateException: Can not perform this action after onSaveInstanceState


[こちら](http://qiita.com/nein37/items/32613e9acd9558566c5e)や、[こちら](http://iti.hatenablog.jp/entry/2015/02/23/121110)に詳しい説明があるので基本的にはそちらを見ると良いです。

ただ、上記はちょっと長いので、ここでは一行＋画像でまとめておきます。ささっと知りたい時の参考になれば。
↓
**`onPause()`の次に実行される`onSaveInstanceState()`以降でFragmentを操作するとこの例外が発生するので、基本的には画面表示されている間（`onResume()`〜`onPause()`の間）にFragmentを操作すること。**


![d4eF5.png](https://qiita-image-store.s3.amazonaws.com/0/6061/a43b11aa-bb51-95f4-9068-b34a8d086be6.png "d4eF5.png")
Android WebViewのメモ

AndroidのWebViewを少し触る機会があったので備忘録。

# Layout上のWebViewを取得

```java
package com.example.sush.webviewtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    // WebViewの変数を宣言
    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // activity_main.xml
        setContentView(R.layout.activity_main);

        // Layout上の要素を取得
        findViews();

        // 指定のURLを読み込み
        webView.loadUrl("http://example.com/");
    }

    /**
     * Layoutから取得する関数を分けておくと便利そう
     */
    protected void findViews()
    {
        // activity_main.xmlには、webViewというIDで配置
        webView = (WebView) findViewById(R.id.webView);
    }

}
```

# JavaScriptを有効化する

デフォルトではJavaScriptが無効化された状態なので、有効化する場合には下記を実行する。

```java
webView.getSettings().setJavaScriptEnabled(true);
```

# 表示サイズが合わない（レスポンシブにならない）

レスポンシブデザインが正常に表示されない場合は下記を実行する。

```java
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
```

ページによっては下記も実行すると良い（らしい）。

```java
webView.setInitialScale(1);
```


# 右端に余白が存在する

スクロールバーを表示する幅を確保してしまい、WebViewの右端に余白ができてしまう事があるので、スクロールバーをWebView内に含めるように書きを実行する。

```java
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
```


# キャッシュを削除する

```java
webView.clearCache(true);
```


# アプリからWebViewのJavaScriptを実行する

```java
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // KitKat以上は専用の関数が用意されたみたい
    // 第二引数はコールバック
    webView.evaluateJavascript("foo()", null);
} else {
    // 以前は javascript: *** を呼び出せばOK
    webView.loadUrl("javascript:foo()");
}
```
Bash on Ubuntu on WindowsをUbuntu 16.04にアップグレードしてみる

# はじめに
[昨日紹介した記事](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)で導入したUbuntuは14.04でした。

これを無理矢理16.04にアップグレードしてみようという試みです。

人柱気質のある人以外には非常におすすめしないですが、まぁ一応できますよ程度に。

> 2016/12/18追記
> Windows 10 Insider Preview 14986においてデフォルトでUbuntu 16.04.1がインストールされるようになりました。
> 来春予定されている大型アップデートにも引き継がれる見通しです。

# アップグレード手順
とりあえずいつも通りのアップグレードコマンドを実行します。
クラッシュ防止のためのオプションが色々付いていますが気にしない。

```shell-session
LANG=C sudo do-release-upgrade -f DistUpgradeViewNonInteractive -d
```

途中でy/Nで答えさせるようなプロンプトが出ますが、これに答えるとフリーズします。
とりあえずyと答えてから、Ctrl-Cでアップグレードの実行を止めます。

>Configuration file '/etc/default/rcS'
> ==> Modified (by you or by a script) since installation.
> ==> Package distributor has shipped an updated version.
>   What would you like to do about it ?  Your options are:
>    Y or I  : install the package maintainer's version
>    N or O  : keep your currently-installed version
>      D     : show the differences between the versions
>      Z     : start a shell to examine the situation
> The default action is to keep your current version.
>*** rcS (Y/I/N/O/D/Z) [default=N] ? y

これだとアップグレードが終わらないので、再開させます。

```shell-session
sudo -S dpkg --configure -a
```

こちらは上記のようなプロンプトがあってもフリーズしないので、
安心して(?)アップグレードを続けることができます。

途中でエラーが出て止まったりしますが、
上記コマンドをたたいても何も反応がなくなるまで何回も実行してください。

最後に環境を整えて終了です。

```shell-session
sudo apt update
sudo apt full-upgrade
sudo apt autoremove
```

バージョンを確認してみると、確かにUbuntu16.04になっていることがわかります。

```shell-session
$ cat /etc/issue
Ubuntu 16.04.1 LTS \n \l
```

ちょっと怖いですが、とりあえず使えているのでよしとします...
CentOS7にpython3系のインストール

CentOS7にはデフォルトでpython2系が入っています。
python3を勉強用で使いたいので最新版をインストールしますが、python2系も共存させてどちらも使えるように設定します。

環境
CentOS Linux release 7.2.1511 (Core)

必要な依存関係をインストール

```
$ yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git
pyenvインストール

pyenvをインストールすることで複数のバージョンのpythonを共存させて簡単に切り替えることができます。


$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
bash_profileに環境変数を記述します。

$ vim .bash_profile
下記を追記
$ pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
bash_profileを反映。

$ source .bash_profile
python3系のインストール

インストールできるバージョンを一覧表示

$ pyenv install --list
3.5.1をインストール


$ pyenv install 3.5.1
pythonのバージョンを確認


$ python --version
Python 2.7.5
python3.5.1に切り替え


$ pyenv global 3.5.1
$ pyenv rehash
$ python --version
Python 3.5.1
利用可能なバージョンが表示


$ pyenv versions
  system
* 3.5.1 (set by /root/.pyenv/version)
systemに切り替えるとバージョンが2.7.5に戻ります。


$ pyenv global system
$ python --version
Python 2.7.5
```
"a SQL" と "an SQL" どちらが正しいか？

# 疑問
英語で SQL という単語を使う場合、単数形は "a SQL" と "an SQL" のどちらが正しいのか？

「えすきゅーえる」なので "an SQL" かと思いきや "a SQL" という表記も多い。
さっと調べてみた結果を整理してみます。

# 結論
どちらも正しい。

英語圏では SQL を "sequel" （しーくぇる）と読むこともあり、
"sequel" と読むなら "a SQL" 、
"ess-que-el" と読むなら "an SQL"
とするのが良いみたいです。


# Google検索
"a sql statement" と "an sql statement" を検索してどちらの方が件数が多いか調べてみた。

## 教育機関系
文法的に正しい使い方がされているだろうと思い教育機関系のドメイン ".edu" で検索。
あまり差はないが、若干 "a SQL" の方が多い。

["a sql statement" site:.edu](https://www.google.co.jp/search?q=%22a+sql+statement%22+site:.edu)
約 6,480 件 

["an sql statement" site:.edu](https://www.google.co.jp/search?q=%22an+sql+statement%22+site:.edu)
約 5,160 件 


## Oracle
データベースと言えばオラクル。
ということで oracle.com 以下を検索。

["a sql statement" site:oracle.com](https://www.google.co.jp/search?q=%22a+sql+statement%22+site:oracle.com)
約 20,900 件

["an sql statement" site:oracle.com](https://www.google.co.jp/search?q=%22an+sql+statement%22+site:oracle.com)
約 5,020 件

Oracle では SQL を 「しーくぇる」 と読むそうなので "a SQL" の方が多いですね。
http://docs.oracle.com/database/121/CNCPT/sqllangu.htm#CNCPT116
> SQL (pronounced sequel) is the set-based, high-level declarative computer language with which all programs and users access data in an Oracle database.


## MySQL
["a sql statement" site:mysql.com](https://www.google.co.jp/search?q=%22a+sql+statement%22+site:mysql.com)
約 506 件

["an sql statement" site:mysql.com](https://www.google.co.jp/search?q=%22an+sql+statement%22+site:mysql.com)
約 828 件

MySQLの読み方が「まいえすきゅーえる」なだけあって "an SQL" の方がやや多いです。
http://dev.mysql.com/doc/refman/5.7/en/what-is-mysql.html
> The official way to pronounce “MySQL” is “My Ess Que Ell” (not “my sequel”), but we do not mind if you pronounce it as “my sequel” or in some other localized way.

#SEQUEL?
SQL の元になった言語が SEQUEL (Structured English Query Language) というもので、その名残で SQL を "sequel" （シーケル、シークェル）と呼ぶ場合もある。

# 参考

[StackExchange - “An SQL Server database schema” or “a SQL Server database schema”?](http://english.stackexchange.com/questions/5265/an-sql-server-database-schema-or-a-sql-server-database-schema)
[StackExchange - Do you use “a” or “an” before acronyms?](http://english.stackexchange.com/questions/1016/do-you-use-a-or-an-before-acronyms)
Redis Clusterでデータをパターンで削除する

# 結論

正攻法はないのでスクリプトを書く

# 概要

Redisデータをパターンで削除する方法は [Redisのパターンに一致するキーを削除
](http://qiita.com/aki77/items/57bfd7f18c54ba60c0aa) などの記事で紹介されていますが（とはいえ正攻法ではない）、Redis Clusterを使用していると、keyのprefixが同じでもデータがノードに分散してしまって一気に参照や削除するのが難しくなります。

そもそもリリース環境でそんなことをすることはほぼないのですが、開発環境からRedis Clusterを使っているとちょっと困ります。
間違えてぶっ壊れたデータを保存してしまった場合にえいやっと削除したいときにどうするか。

# スクリプト

結果から言うと、こういうスクリプトを書くのが一番早いです。

```py:delete-pat
#! /usr/bin/env python

import sys
import commands

print sys.argv

# ノードは自分で設定してくだしあ
nodes = [
"localhost:10000",
"localhost:10001",
"localhost:10002"
]

pat = sys.argv[1]
for node in nodes:
    host, port = node.split(":")
    output = commands.getoutput("redis-cli -h {host} -p {port} -c keys {pat}".format(host=host,port=port,pat=pat))
    result = filter(lambda s:len(s) > 0, output.split("\n"))
    print host, port
    print result
    for key in result:
        print commands.getoutput("redis-cli -h {host} -p {port} -c del {key}".format(host=host,port=port,key=key))
```

こんなふうに使います

```sh
./delete-pat hoge:fuga:*
```

こちらからは以上です。
webを支える技術メモ（第１部）

web支える技術という本を読んで、ひとまず整理しようということで整理した。
まーほとんど書いてあることをまとめた感じだ。

# Webの技術

## WEBとは何か
###  すべての基盤
現在の生活の中でウェブは欠かせないものとなった。
例えばブラウザ上で、ニュースを読んだり、天気予報を見たり、amazonで物を買ったりと、すべてインターネットの向こう側にあるWebサーバーとやりとりしながら実現されている。

### ウェブの用途
* web サイト
> これはもっと身近な例。amazonやGoogle、FaceBook、また企業PRサイトなどのこと
> また特徴として、クライアント側（ブラウザ、使う側）からwebサーバーがどんなやりとりをしているかなど意識する必要がない

* ユーザーインターフェース
> 例えば、インターネットに接続されている、テレビ、プリンタなどのデバイス設定はブラウザでおこうことが多い。これらはすべてwebで繋がれている。

* プログラム用API
> APIはプログラムようのインターフェース。データフォーマットはXML,JSONなどのプログラムが解釈・処理しやすいもの。

## REST => architectural style of World Wide Web
RESTとはWEBのアーキテクチャスタイルのこと

### architectural style
別名、アーキテクチャパターンともいう。複数のアーキテクチャに共通する性質、様式、作法を指す言葉
> そもそもアーキテクチャとは？「システムやソフトウェアの構造のこと」などとよく言われる。また、設計思想などと言われることもある。

なぜアーキテクチャが必要か。
>  システムは具体的なアーキテクチャを持っていて、そのアーキテクチャ設計する際に闇雲に設計するより、指針や作法に従って設計した方が楽に設計できるし、安定性が増す。

### RESTの構成
#### クライアント/サーバ：ユーザーインターフェースと処理を分離する
webはHTTPというプロトコルでクライアントとサーバーが通信するクライアント/サーバーのアーキテクチャを採用している。
> クライアントはサーバーにリクエストを送り、サーバーはそれに対してレスポンスを返す

* 利点
> 単一のコンピュータ上で全てを処理するのではなくクライアントとサーバーに分離して処理できる\
> これにより、ゲームやスマホからでもアクセスができるようになる。

#### ステートレスサーバ：サーバ側でアプリケーション状態を持たない
ステートレストはクライアントのアプリケーション状態をサーバーで管理しないこと

* 利点
> サーバー側の実装を簡略化できる。

#### キャッシュ：クライアントとサーバの通信回数と量を減らす
キャッシュとは、リソースの鮮度に基づいて、一度取得したリソースをクライアント側で使い回す方法。

* 利点
> サーバーとクライアントの間の通信を減らすことでネットワーク帯域の利用や処理時間を収縮し、より効率的に処理できる

#### 統一インターフェース：インターフェースを固定する
URLで示したリソースに対する操作を統一した限定的なインターフェースで行う。
つまり全てのリソースが同じ[メソッド](http://kaihooo.com/http-method/)によって応答するという考え

* 利点
> * クライアントとサーバーの実装の独立性が向上する
> * 全体のアーキテクチャがシンプルになる

#### 階層化システム：システムを階層に分離する
システムをいくつかに階層に分離するアーキテクチャスタイルのことを階層化システム


#### コードオンデマンド：プログラムをクライアントにダウンロードして実行する
プログラムコードをサーバーからダウンロードしてクライアント側でそれを実行するアーキテクチャスタイル。JavaScriptがこれにあたる。

* 利点
> クライアントを後から拡張できる。あらかじめ用意した機能だけでなく、新しい機能を追加していける。

第１部であるwebの概要をまとめてみた。
まー整理を兼ねて自分用
Let's Encrypt で DNS-01を利用したSSL証明書の取得方法

## DNS-01 方式

Let’s EncryptでＳＳＬ証明書を取得する方法で、WEBサーバが1つのみ稼働させている時はHTTP-01方式として沢山紹介されています。
負荷分散させている場合などでは、ドメイン確認が出来ません。
そこで、Let’s Encryptでは、ドメイン認証方式による確認方法として、ＤＮＳ−０１方式が用意されています。

Let’s Encryptの[Automatic Certificate Management Environment(ACME)](https://letsencrypt.github.io/acme-spec/)の仕様には、ドメイン認証方式（DNS-01）がありますので、詳しい仕様についてはサイトを確認して下さい。

ここでは、サクッと認証とＳＳＬ証明書の生成方法だけを説明します。
※ ApacheやNginxなどのＳＳＬ証明書の設定方法は割愛してます。

## インストール＆セットアップ

現時点で、DNS-01方式のスクリプトが、公式で用意されていませんので、
クライアントはサードパーティ製のletsencrypt.shを使用します。
以下のgitより取得して下さい。
以降、`letsencrypt.sh`ディレクトリにて作業します

```
git clone  https://github.com/lukas2511/letsencrypt.sh
cd letsencrypt.sh
```

DNS認証では、Hookスクリプトでトークン認証を行います。
サンプルは`docs/examples/hook.sh`として、Hookスクリプトが用意されていますのでコピーします。

```
cp -pr docs/examples/hook.sh .
```

以下の通り、`deploy_challenge`メソッド部分を修正します。

```
vi hook.sh

function deploy_challenge {
    local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"

    echo "Set TXT record of _acme-challenge.$DOMAIN to $TOKEN_VALUE"
    read
}
```

## 証明書取得

letsencrypt.shを実行します。
hookスクリプトにより、`read`の箇所で停止し、認証用のトークンが表示されます。

```
./letsencrypt.sh -c -d hogehoge.com --challenge dns-01 -k ./hook.sh

Set TXT record of _acme-challenge.hogehoge.com to PMulhL3LmSiTgd00xORGZUNknemC0zPFWew7ToqcKm4
```

表示されたトークンを、TXTレコードとして、DNSに設定します。
上記の例では、 `_acme-challenge.hogehoge.com`をTXTキーとして、`PMulhL3LmSiTgd00xORGZUNknemC0zPFWew7ToqcKm4`を値に設定します。

DNS設定後は、反映にある程度時間が掛かると思いますので、1時間程度待つ必要があるでしょう。
その間、シェルのWindowを閉じないようにして下さい。
再度実行するとトークンが変更されますので、DNSレコードも再設定が必要です。

ある程度待ったら、Enterキーで実行を続け、以下の通り成功すればOKです。

```
 + Responding to challenge for kosokubus.ex-xyz.xyz...
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
```

成功すると、以下のディレクトリに認証キーなどが生成されます。
`letsencrypt.sh/certs/hogehoge.com/`

概ね、利用するのは、次のファイルです。

```
lrwxrwxrwx 1 root root   19 Aug  4 07:16 cert.csr -> cert-1470260375.csr
lrwxrwxrwx 1 root root   19 Aug  4 07:16 cert.pem -> cert-1470260375.pem
lrwxrwxrwx 1 root root   20 Aug  4 07:16 chain.pem -> chain-1470260375.pem
lrwxrwxrwx 1 root root   24 Aug  4 07:16 fullchain.pem -> fullchain-1470260375.pem
lrwxrwxrwx 1 root root   22 Aug  4 07:16 privkey.pem -> privkey-1470260375.pem
```

ここまで取得できれば、あとは各WEBサーバにファイルをコピーするなり、`ｒｓｙｎｃ`するなり好きに料理しましょう。
FormHelperのカスタマイズ

# 全体のテンプレートを変更する

テンプレートの作成

```config/customized_form.php
<?php
/**
 * 変更したいテンプレートのみ設定する
 */
return [
    'dateWidget' => '<ul class="list-inline"><li class="year">{{year}}</li><li class="month">{{month}}</li><li class="day">{{day}}</li></ul>'
];

```

テンプレート読み込み

```AppView.php
public function initialize() 
{
    $this->loadHelper('Form',['templates' => 'customized_form']);
}
```

CakePHP3のFormHelper標準のテンプレート一覧はこちら
[FormHelper template](http://book.cakephp.org/3.0/en/views/helpers/form.html#list-of-templates)


# 一時的に変更する

```php
$this->Form->templates(['dateWidget' => '<ul class="list-inline"><li class="year">{{year}}</li><li class="month">{{month}}</li><li class="day">{{day}}</li></ul>']);

echo $this->Form->date('datecol');
```
ggplot2 でプロット領域が文字化け(豆腐化)する(Mac)

**ggplot2** で日本語を使う場合は、基本的にコマンドの最後に `theme_gray(base_family = "HiraKakuPro-W3")` を加えれば良いが、プロット領域に日本語を表示しようとすると化けることがある。

 ```
soy <- read.csv
  ("http://web.ias.tokushima-u.ac.jp/linguistik/Book1.csv", fileEncod = "CP932")

library ("ggplot2")
ggplot (soy, aes (x = soy, y = source)) +  
   geom_text(aes(label = city)) +
   xlab("醤油") + ylab ("ソース") +
   ggtitle ("醤油とソースの消費量") + 
   geom_smooth(method = "lm") +
   theme_gray (base_family = "HiraKakuPro-W3")

```

![soy1.png](https://qiita-image-store.s3.amazonaws.com/0/99009/13a675ea-ac15-2e53-c4a5-163864cee88e.png)


これは `geom_text()` に明示的に`family`を指定しないといけないようである。多分。

```
ggplot (soy, aes (x = soy, y = source)) +  geom_text(aes(label = city), size = 6, family = "HiraKakuPro-W3") +
  xlab("醤油") + ylab ("ソース") + 
  ggtitle ("醤油とソースの消費量") + 
  geom_smooth(method = "lm") + 
  theme_gray (base_family = "HiraKakuPro-W3")
```

![soy2.png](https://qiita-image-store.s3.amazonaws.com/0/99009/9888c017-84f2-73cc-8dde-f02e06d79c6c.png)

徳島と岡山って、ソースを何に使っているのよ？
[WordPress] リライトルールが壊れたことを検知して自動復旧させる

WordPress を使用していて、原因不明で個別記事が404になることありませんか？
たまにあるんですよね...その際はパーマリンク設定で何も変更せずに更新してやれば解決するんですが、夜中とかに発生した時に人手を介して対応するのは辛いので、自動的に検知してよしなにやってほしいですよね。

そんな時は [wp-cli](http://wp-cli.org/) を使えばできます。
こんな感じのシェルスクリプトを cron で定期的に実行(5分に一度程度)しておけばいいんでないかな？

```bash:chk-wp-rewrite-rule.sh
#!/bin/bash
set -eux

# WordPress のインストールパス
wp_path='/path/to/wordpress'

# http ステータスコードを監視する記事ページのURL(削除されることのない記事のURLが良いです)
single_page_url='http://example.com/archives/1'

# http ステータスコードの取得
http_code=$(curl -Li ${single_page_url} -o /dev/null -w '%{http_code}' -s)

# http ステータスコードが 404 の場合、リライトルールとオブジェクトキャッシュの初期化
if [ "${http_code}" = "404" ]; then
    # 個別記事にアクセスできなくなって wp rewrite flush したことを slack なり、メールなりで通知したほうがいいかも
    wp --path=${wp_path} rewrite flush
    wp --path=${wp_path} cache flush
fi
```
textqlが超便利

### これは何？
- CSVファイルをSQLの構文で扱えるツール

ソースは[こちら](https://github.com/dinedal/textql)

### なにが良いのか
1. DB作らなくて良いので環境構築が楽
2. 軽快動作
3. パイプで他のコマンドに繋げられる

### 事前知識・必要スキル
- SQLの文法と使いかたを知っている
- コンソール上からコマンドを使って標準出力ができる
- CSVのフォーマットを知っている

ここまでで問題なければ、あっさり使えるはずです。

#### インストール
```
　brew install textql
```

### 使い方

試しにまずこんなCSVだったとします

```sample1.csv
id,name,age
1,"aaa",12
2,"bbb",13
3,"ccc",14
4,"cdc",15
5,"cee",16
6,"ffc",17
```

こんなコマンドを実行します

```
textql -header -sql "select * from sample1　where age=14" sample1.csv
```

出力

```
3,ccc,14
```

あっさり。




集計処理だって・・・

```
textql -header -sql "select　sum(age) from sample1" sample1.csv
```

出力

```
87
```

LIKEも勿論

```
textql -header -sql "select　＊ from sample1　where name like '%d%'" sample1.csv
```

出力

```
4,cdc,15
```

INNER JOINなんかも

```sample2.csv 
id,food
1,"🍛"
2,"tempra"
```

コマンド

```
textql -header -sql "select * from sample1 as s1 inner join sample2 as s2 on s1.id=s2.id" sample1.csv sample2.csv
```
出力

```
1,aaa,12,1,🍛
2,bbb,13,2,tempra
```

SQLに慣れている人はあっさり使えて軽快動作！

コマンドライン上で動くので、標準入出力を使ってパイプでつなげることもできます。
一番の魅力はここかもしれない。

冗長なので書いていませんが、GROUP BYやCOUNTも使えたので、
例えば、ちょっとした集計処理の必要に駆られた時などが出番です。

もちろん、パフォーマンスを気にするくらいのデータ量がある本気の集計にはDB使えよという話です。

#### 追記：

- パフォーマンスは調べていません。パフォーマンスを気にするようならDBを使うようにしましょう
- jsonv.shなるものがあり、JSONをCSVにしてくれるそうな。パイプでつなげるだけで夢が広がりますね


### 参照サイト
- dinedal/textql: Execute SQL against structured text like CSV or TSV : https://github.com/dinedal/textql
- archan937/jsonv.sh: A Bash command line tool for converting JSON to CSV : https://github.com/archan937/jsonv.sh
MSC-MOD20 > 解析用ツールの情報整理 

```
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
```

やりたいこと

- MSC-MOD20の通信プロトコルの解析
  - コマンド送信に対する受信までの時間(msec)の情報整理

自分が作ったlinemonitorを使うとタイミングを知ることはできる。
linemontorを使うには、以下のものが必要だろう。

- Raspberry Pi2 : 持っている
- USB-シリアル変換 x 2 : 持っている
- linemonitorソフト
  - 関連 http://qiita.com/7of9/items/028556c5a819a6a8de96
  - 関連 http://qiita.com/7of9/items/c600b69e2b5c2aaccb49
- UART 3.3VをRS-232Cレベルに変換するもの : 要情報整理
  - 関連 http://qiita.com/7of9/items/ad6e1822daec26792c13
  - 関連 http://qiita.com/7of9/items/7adbdb53f913e939a055

RS-232Cレベルを5Vの振幅でうまくいくかどうか。

セットアップが面倒なので、「40秒で支度しな！」はできそうにない。

Analog Discovery 2でUART通信のタイミングを知ることができれば、そちらの方が楽そうだ。確認してみよう。
あるいは、Analog Discovery 2でI2C通信をモニタして、時間範囲を従来のmsecオーダーからsecオーダーにして、応答待ちまでの時間を知ることができるだろうか。
noVNC

## novncで上のコントロールバーを消す

```sh
echo "<style>#noVNC_control_bar { display: none; }</style>" \
 >> /usr/share/novnc/vnc.html

echo "<style>#noVNC_status_bar { display: none; }</style>" \
 >> /usr/share/novnc/vnc_lite.html
```

## i3, firefox

https://i3wm.org/docs/userguide.html

* firefox
    * Control + Num
* Workspace
    * Alt + Num
* Fullscreen
    * Alt + F

## 起動

```sh
docker run -p 6080:6080 -v /dev/shm:/dev/shm -it tukiyo3/novnc
```

* http://localhost:6080/
    * user1 : password1
    * => nginx/htpasswd にて指定
* url
    * https://github.com/tukiyo/docker-novnc
    * https://hub.docker.com/repository/docker/tukiyo3/novnc


もしくは　VNCサーバーに直接接続

```sh
docker run -p 127.0.0.1:5900:5900 -v /dev/shm:/dev/shm -it tukiyo3/novnc
```


## ローカルのファイルを起動時に表示する方法

```sh
docker run -it -d \
 --restart=always \
 -p 127.0.0.1:5900:5900 \
 -e URL=file:///home/docker/index.html \
 -v /dev/shm:/dev/shm \
 -v $(pwd)/index.html:/home/docker/index.html \
 tukiyo3/novnc
```

```
vncviewer localhost
```

### docker-compose

```yaml:docker-compose.yml
novnc:
  image: tukiyo3/novnc
  restart: always
  links:
    - nginx
  ports:
    - "127.0.0.1:5900:5900"
  volumes:
    - /dev/shm:/dev/shm
  environment:
    - URL=http://nginx/index.html

nginx:
  image: nginx
  restart: always
  volumes:
    - ./index.html:/usr/share/nginx/html/index.html
```

* ./index.html を編集した後はnginxコンテナをリスタート

```sh:restart.sh
docker-compose stop nginx
docker-compose rm -f nginx
docker-compose up -d nginx
```
MSC-MOD20 > Iコマンド > microSDカード unmount時 > 4秒くらいしてから応答がある

```txt:動作環境
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
```

microSDカードモジュール MSC-MOD20について。

関連 http://qiita.com/7of9/items/1a4ceb8d32ddff8a6070
関連 http://qiita.com/7of9/items/2f0bc08b9ee83e1b7cbf

MSC-MOD20の癖を見つける。

## Iコマンドの応答

### microSDカード unmount時

SD初期化に使うIコマンドに関して、SD unmount時の応答が見られなかった。
http://qiita.com/7of9/items/2f0bc08b9ee83e1b7cbf

日本語、英語の取説を見ても、このあたりよく分からない。

状況を整理するため、MSC-MOD20をUART接続にして、実際にIコマンドを送信してみた。

```txt:結果
// 4秒程度の待ち
!11
```

確かに!11 (初期化に失敗しました。SDカードのCD信号がHまたはフローティングしている)の応答があった。

問題は以下。

- !11が返るまでに4秒程度かかる
- I2C通信時は0x00 (No Data Token)が返り、おそらくそのあとの4秒程度で!11が返る

I2Cで使う場合、0x00を受信しても、!xxを受信するまではリトライし続けることになるのだろうか。
そのリトライの最大タイムアウトを指定しないといけない。

取説に掲載されている以下の処理では0x00が返った時点でwhileループを抜けてしまうので、上記の処理には対応できない気がする。

```
void read_loop() {
  char b, data;
  
  do {
    b = Read_I2C();
    if((b != 0)&&(b!=0XFF)) {
      data = b;
    }
    if (b==0x0FF) {
      b = Read_I2C();
      if ((b!=0x00) && (b!=0xFF)) {
        // ここには絶対到達しない
      }else{
        switch(b) {
        case 0x00: data = 0; b=1; break;
        case 0xFF: data = 0xFF; break;
        }
      }
    }
  }while((b!=0));   
```
技術英語 > operators with [higher precedence] than multiplication / priority / unprecedented

@ Code Complete (No. 6458 / 36077)

> operators with higher precedence than multiplication

http://ejje.weblio.jp/content/precedence
> (時間・順序などが)先立つこと、先行、先任、上位、優先(権)

意訳「multiplicationよりも優先度が高いoperators」

<hr>
priorityとprecedenceの使い分けは未消化
http://www.eishakubun.com/priority.html

<hr>
precedenceと関係するのは

http://ejje.weblio.jp/content/unprecedented
> 先例のない、空前の、前代未聞の、新しい、新奇な

それに関連するのは unheard-of
http://qiita.com/7of9/items/812b2760daf8b9a3f600
Window 10 Anniversary Update を手動インストールして Subsystem for Linux を有効にする手順メモ

# はじめに

この記事は自分が試してみた作業のメモです。手順には Window Update 等システム設定の大きな変更が含まれます。もし参考にする場合はご注意ください。

# 1. Window 10 Anniversary Update の手動インストール

下記リンクの「Anniversary Update を入手する」からインストール。
https://support.microsoft.com/ja-jp/help/12387/windows-10-update-history?ocid=update_setting_client

# 2. 開発者モードを有効にする

「スタートメニュー」-「設定」-「更新とセキュリティ」-「開発者向け」-「開発者モード」を選択
（これをやっていないと Step 4 で怒られる）

# 3. Subsystem for Linux を有効にする

「スタートメニューを右クリック」-「コントロールパネル」-「プログラム」-「Windows機能の有効化または無効化」-「Subsystem for Linux にチェックを入れる」-「再起動」

# 4. 関連ファイルのインストール

再起動後にコマンドプロンプトを開いて bash の場所を確認

```
> where bash
```

（ここで C:\Windows\System32\bash.exe 以外が上に来ている場合は競合を解決する）

```
> bash
```

関連ファイルをインストールして良いか聞かれるので 'y' をタイプ
インストール後にユーザ名とパスワードをセットしたら環境設定終了。
（そのあと `apt-get` できるのまでは確認しました）

# 補足

Linux システムの実ファイルは `C:\Users\[ユーザ名]\AppData\Local\lxss\` 以下にあるようです。
heroku-buildpack-nodejs で devDependencies も npm install する

[`heroku-buildpack-nodejs`](https://github.com/heroku/heroku-buildpack-nodejs) では通常 `dependencies` だけが `npm install` され、`devDepencies` はされない。
つまり `--production` オプションでインストールされる。
(厳密には環境変数で制御しているように見えるけど詳細は調べ切れていない)

## 結論

以下の環境変数を指定すれば良い。

```
NPM_CONFIG_PRODUCTION=false
```

`NPM_CONFIG_` で始まる環境変数は `npm` では `configuration parameter` として扱われるようで、これで `npm install --production=false` と同じになる、ということらしい。
https://github.com/npm/npm/blob/master/doc/misc/npm-config.md

通常は `NODE_ENV` でも制御できるが、Buildpack 内で `NPM_CONFIG_PRODUCTION` がデフォルトで `true` になっていて、そっちが優先されていた。

## 何故これが必要だったか

[`browserify-rails`](https://github.com/browserify-rails/browserify-rails) を使って Rails アプリを使っていたところ、デプロイ時に `node_modules/.bin/browserify` が見つからないよ、というエラーが起きた。

```
       BrowserifyRails::BrowserifyError: Unable to run node_modules/.bin/browserify. Ensure you have installed it with npm.
       /tmp/build/vendor/bundle/ruby/2.2.0/gems/browserify-rails-3.1.0/lib/browserify-rails/browserify_processor.rb:77:in `ensure_commands_exist!'
       /tmp/build/vendor/bundle/ruby/2.2.0/gems/browserify-rails-3.1.0/lib/browserify-rails/browserify_processor.rb:30:in `call'
```

`browserify` はなんとなく `devDependencies` の方に指定していたが、そのままだと `browserify` がインストールされずにビルドに失敗するというもの。

別に割り切って `dependencies` の方に指定する、でもいい気はする。
複数音声のmp4ファイルの音声の音ズレを個別に調整する

複数言語の音声が入ったMP4の動画の音ズレを修正する方法。

```.sh
ffmpeg.exe -i "movie.mp4" -itsoffset 0.3 -i "movie.mp4" -itsoffset 0.4 -i "movie.mp4" -map 0:v -map 1:a:0 -map 2:a:1 -c copy "movie-audio-delayed.mp4"
```

これで一つ目の音声を0.3秒遅らせて、2つ目の音声を0.4秒遅らせる処理になる。
詳しくはStackoverflowの回答を参考に。

### 参考

http://stackoverflow.com/questions/9643348/delay-audio-with-ffmpeg
GitでIoT的なことをする。

IoTというとエッジデバイスでデータを集計してメッセージブローカーやIoTプラットフォームでうんぬんとかいうのを想像しますが、今回はそういうのを使わずにIoT的なことをしたいと思いました。

ちょうど下記のような記事を見つけまして。
[コンテンツ・アドレッサブルで多バージョン分散データベースNomsのAttic Labsが$8.1Mを調達](http://jp.techcrunch.com/2016/08/03/20160802attic-labs-noms-noms/?utm_content=buffera6a22&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)

**Noms**というのはGitにアイデアを得た分散DBということらしいのですが、じゃあ**逆にGitでIoT的なことができるのか？**ということで、普段使っている、GitだけでIoT的なことをやってみました！~~これぞサーバレスアーキテクチャですね。（嘘）~~

ここからGitの機能で、MacのLoad Averageを定期的にデータを取得し、Webブラウザでチャートを表示する過程を書いています。**ネタですので時間を無駄にしたくない人は気をつけましょう！**

## IoTのThings側

デバイス側はgitが使える、パワフルな環境じゃないといけません。とりあえずMacで、Load Average取ります。localで定期的にcommitするソースコードは以下です。

```
var child_process = require('child_process');
var fs = require('fs');


getUptimeLoop();

function getUptimeLoop() {
	getUptime(function(data) {
		fs.appendFileSync('data.txt', data[0] + "," + data[1] + "," + data[2] + "\n");
		git_cmd();
		setTimeout(getUptimeLoop, 10000);
	});
}

function getUptime(cb) {
	var exec = require('child_process').exec;
	var child = exec('uptime', function (error, stdout, stderr) {
		var index = stdout.indexOf('load averages:');
		var str = stdout.substr(index+15);
		var las = str.split(' ');
	    cb([Number(las[0]), Number(las[1]), Number(las[2])]);
	});
}


function git_cmd(cb) {
    child_process.execSync('git add data.txt');
    child_process.execSync('git commit -m "Added data"');
}
```

data.txtにLoad Averageの値をappendしていきます。それを定期的に`git add .`、`git commit`します。

動かす前に`git init`しておきます。
実際に動かすとこんな感じです。

![git-iot1.gif](https://qiita-image-store.s3.amazonaws.com/0/20848/38f4eea5-722a-97ca-1775-ad45fbde607b.gif)

## Internetへ！

できました。リモートにpushします。今回はGithubで。

https://github.com/syuhei176/git-iot

remoteリポジトリを追加します。

```
git remote add origin git@github.com:syuhei176/git-iot.git
```

`git push`は１日に一回くらいの想定です。今回は手動で。gh-pagesブランチにpushします。

```
git push origin gh-pages
```

pushされました。

<img width="755" alt="スクリーンショット 2016-08-04 1.10.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/f67ebd2e-a066-66b3-3241-4d44ac6f251d.png">


data.txtのhistoryがぎっしり。

<img width="1005" alt="スクリーンショット 2016-08-04 1.13.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/16eff339-2d32-7763-d839-261d29e1b664.png">

## データを可視化

gh-pagesブランチにpushしているのでGithubページが使えます。htmlとjsを書けば、貯めたデータをブラウザでチャート化できます。


<img width="581" alt="スクリーンショット 2016-08-04 9.25.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/0b42f889-45de-06d3-14ba-8f9ac332362c.png">


出来上がったチャートのURLはこちら：https://syuhei176.github.io/git-iot/

## まとめ

なんとIoTプラットフォームもメッセージブローカーも何も使わずに、デバイスからデータを取ってWebで可視化できました。今回は完全にネタですので。はい、どうもすみません！

注) Githubに迷惑をかけないようにしましょう
【Access】GUIDを使用してVBAから参照設定を行う

Accessで開発したツールを配布したら相手と自分のオフィスのバージョンが異なり、
起動時に参照設定のエラーが出ちゃうっていう
Access開発でまれによくあるやつの対処。

使用者のPCごとに毎回手動で参照設定を変えるのは面倒なので
VBAでバージョン判定して参照設定を。

参照設定をVBAから行う方法は２つ。

* ライブラリのフルパスを指定(AddFromFile)
*  GUIDを指定(AddFromGuid)

フルパスを指定する方法は複数人に配布するには不向きなので、
今回はGUIDを指定して設定する方法。

## GUIDを調べる

必要な情報はGUIDとそのバージョン（メジャー＆マイナー）。
ついでにオフィスのバージョンも確認。

```vba
Sub survey_guid()

    Dim Ref As Reference

    Debug.Print "VERSION:" & Application.Version
    
    For Each Ref In References
        Debug.Print "NAME:" & Ref.Name & " GUID:" & Ref.Guid & " MAJOR:" & Ref.Major & " MINOR:" & Ref.Minor
    Next
    
    Set Ref = Nothing

End Sub

```

結果
![GUID.JPG](https://qiita-image-store.s3.amazonaws.com/0/41356/a2b26adb-03fd-8329-f727-94a00a3a80ce.jpeg)

実際の参照設定と見比べるとこんな感じ。
![reference.JPG](https://qiita-image-store.s3.amazonaws.com/0/41356/ca4c4ed9-6490-1a18-3ffc-12f90f84eced.jpeg)
参照設定のウィンドウと同じ順番で出力されている。
（英語OSに日本語Officeをインストールしている関係で一部文字化けしています。）

今回VBAで参照設定したいのはADO Ext.XX とExcel object Library。
2つの画面から各ライブラリのGUIDとそのメジャーバージョン・マイナーバージョンが特定できる。

ADO
NAME:ADOX GUID:{00000600-0000-0010-8000-00AA006D2EA4} MAJOR:6 MINOR:0

Excel object Library
NAME:Excel GUID:{00020813-0000-0000-C000-000000000046} MAJOR:1 MINOR:7

画面と結果はOffice2010。

使用される可能性のあるOfficeのバージョンでそれぞれ同様の調査をする。

## 参照設定

上記で取得したGUIDとバージョンを使用して参照設定。
今回はAccess起動時に開くフォームのForm_Loadイベントに記載し、
office2010と2007の利用者がいる場合を想定。

```vba
Private Sub Form_Load()
    Dim Ref As Reference
    Const strADO As String = "{00000600-0000-0010-8000-00AA006D2EA4}"
    Const strExcel As String = "{00020813-0000-0000-C000-000000000046}"
    
    On Error Resume Next
    
    If Application.Version = 14# Then
        Set Ref = References.AddFromGuid(strADO, 6, 0)
        Set Ref = References.AddFromGuid(strExcel, 1, 7)
    ElseIf Application.Version = 12# Then
        Set Ref = References.AddFromGuid(strADO, 2, 8)
        Set Ref = References.AddFromGuid(strExcel, 1, 6)
    End If
    
    Set Ref = Nothing

End Sub
```

オフィスのバージョンを取得しバージョンごとに条件分岐、

```
References.AddFromGuid("GUID", メジャーバージョン, マイナーバージョン)
```

これで各ライブラリの参照設定をする。

エラー処理は手抜き。
すでに参照設定されている場合にはエラーNo.32813が返ってくるので、必要に合わせてエラー処理を。
（参照設定は保存されるので、エラー32813に対して何らかのエラー処理
をしておかないと、2回目以降に起動した際エラーが発生する。）
（上記同様の理由で配布時には一度参照設定を外してから配布することを忘れずに。）

参考：[VBAで参照設定を設定・解除する（ACCESS）](http://www.iltt.info/page/information/contents/20100113.htm)

※もっとスマートな方法ご存知の方いれば教えてください。
GitとGitHub


Gitについてざっと覚え書き

# 用語
##Repository（リポジトリ）
　　ファイルや変更履歴を管理する場所のこと。
##Local repository（ローカルリポジトリ）
　　その名の通りローカル（自分の端末）にあるリポジトリのこと。
##Remote repository（リモートポジトリ）
　　サーバ上にあるリポジトリのこと。
##Commit（コミット）
　　ファイルをローカルリポジトリへ反映させること。
##Push（プッシュ）
　　ファイルをローカルリポジトリからリモートリポジトリへ反映させること。
##Pull（プル）
　　リモートリポジトリからローカルリポジトリへ反映させること。

# 分散型バージョン管理システム
>git（ギット[2][3][4]）は、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。Linuxカーネルのような巨大プロジェクトにも対応できるように、動作速度に重点が置かれている。現在のメンテナンスは濱野純 (Junio C Hamano) が担当している。
gitでは、各ユーザのワーキングディレクトリに、全履歴を含んだリポジトリの完全な複製が作られる。したがって、ネットワークにアクセスできないなどの理由で中心リポジトリにアクセスできない環境でも、履歴の調査や変更の記録といったほとんどの作業を行うことができる。これが「分散型」と呼ばれる理由である。

引用元：[Wikipedia](https://ja.wikipedia.org/wiki/Git)
# 分散型と集中型
##分散型
ローカルリポジトリ（リモートのクローン）とリモートリポジトリでファイル管理。
サーバにアクセスしないため動作が軽い。オフライン利用可。
それぞれがローカルリポジトリで管理しているため、リモートリポジトリ（サーバ）に障害が発生してもファイルが損壊、消失しない。安全。

##集中型
リモートリポジトリのみでファイルを管理（ローカルリポジトリを介さない）。
構造が簡単。ファイル管理がサーバに依存しているためオンラインでしか使えない。

# 何が幸せ？
以下の課題を解決できます
- 最新のファイルどれ
- 誰が更新かけた
- どんな更新かけた

# GitHub
Gitのリモートリポジトリに当たるもに開発サポート機能をつけたWebサービス。
ソースが無料で公開されている。いろんな人のソースを見て勉強するもよし、自分のソースをアップし公開するもよし。

エンジニアとして成長するために是非とも有効活用したいサービス。

#参考
http://www.hivelocity.co.jp/blog/33793
Windows Subsystem for LinuxをUbuntu 16.04にアップグレード

Windows Subsystem for Linux (WSL) は、Ubuntu 14.04 LTS がベースになっているので、リポジトリのソフトが全体的に古い。

将来的にはUbuntu 16.04へのアップデートも予定されているそうだが、待っていられないので無理やりアップグレードしてみる。

#注意
現段階ではアップグレードによって**不具合が生じる**。
環境を元に戻すには**WSLを再インストール**するしかないそうなので注意。

#やり方
1.`/etc/apt/sources.d`を書き換える。
`trusty`をすべて`xenial`に書き換えればOK

2.`sudo apt-get dist-upgrade`を実行
30分くらいで終わる。
途中で「サービスを勝手に止めてよいか」とか「rcS.dを書き換えてよいか」などと聞かれるが、すべてそのままEnterキーを押せばよい。

#不具合
##`sudo`が使えなくなる
`sudo`を使おうとすると次のようなメッセージが出る。
`sudo: 端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません`

`sudo -S`で標準入力からパスワードを読み取るようにすればとりあえず使える。
(セキュリティ上どうなのかはわからない)

#参考
http://darthnunix.blogspot.jp/2016/06/ubuntu-1604-on-ubuntu-on-windows-wsl.html
https://www.reddit.com/r/windowsinsiders/comments/4iy38n/upgrade_ubuntu_on_windows_from_1404_to_1604/
SublimeText3からPlantUMLを使う

# はじめに

SublimeText3でもPlantUMLをプレビューできるぞ！をお知らせいたします

![スクリーンショット 2016-08-04 00.59.13.png](https://qiita-image-store.s3.amazonaws.com/0/50823/508c0ad2-0bf1-9018-095a-2bb3a2f58020.png)

## 但し書き

- SublimeText3で生成済イメージのLivePreviewをする方法がわかりません

# 想定環境

- OS
    - OSX 10.11.6
- brew
    - 0.9.9
- java
    - 1.8.0_25
- SublimeText3
    - Sublime Text Build 3114

# install

## brew

- graphvizはplantumlが依存している
- plantuml自体は後述のpluginが同梱している
    - （2016-08-04現在）`Sublime Text 3/Packages/sublime_diagram_plugin/diagram/plantuml-8024.jar`


```
$ brew install graphviz --with-librsvg --with-freetype
```

## SublimeText3

### package install

1. コマンドパレットから`Add Repository`で下記を追加
    - `https://github.com/hardillb/sublime_diagram_plugin`
2. コマンドパレットから`Install Package`で下記をinstall
    - `sublime_diagram_plugin`

### package settings

```Diagram.sublime-settings
{
    "viewer" : "Sublime3Viewer",
    "check_on_startup": true,
    "charset": "UTF-8"
}
```

# 動作確認

1. 何か書いて`hoge.wsd`で保存すると、syntaxが`Diagram`に変化
1. `⌘m`
1. plantumlがイメージを生成し、SublimeText3のタブの中でイメージが表示される

hoge.wsdとして保存しても、`hoge-d0p19_.png`などの様に毎回ランダムのsuffixが付くので、live previewは出来ない模様。

## tips

- SublimeText3で、Origamiなどでright paneを作っておき、カーソルなどでアクティブにしておけば、そちらのpaneへ生成された画像はタブとして現れる。
- 複数のcode blockを書くと、個別の画像として生成される。SublimeText3のタブは個別タブとなる。

# sample uml code

プラグインが紹介されているページに出ているようなイメージを吐き出す構文を出すには下記を選択する。

1. SublimeText3の`Preferences`
2. `Package Settings`
3. `Diagram`
4. `EXAMPLE`

# see also

- [sublime-text-uml-tool](https://www.hardill.me.uk/wordpress/2015/10/28/sublime-text-uml-tool/)
LinuxからNTFSストレージで巨大ファイルを扱うと、mount.ntfsが暴走する

## TL;DR
LinuxからNTFSのストレージに巨大ファイルのコピペやTorrentを使うなど大きなファイルを扱うと、mount.ntfsプロセスが暴走してCPUをものすごく食うことがある模様。決定的な対処方法はない。おとなしくext4とか使おう。

## 環境 - Ubuntu

Ubuntu 16.04.1 LTS (Xenial Xerus)
Linux 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

## 概要 - mount.ntfsが突如暴走
NTFSのHDDへ激しいI/Oが走るプログラムを起動したら、突然そのHDDをマウントしているプロセス、`mount.ntfs`のCPU使用率が急上昇したので、少し調査してみました。

が、自分のmountやファイルシステム周りの知識が少なく、あんまり理解できてないです。おかしなところや他に詳しい方がいたら指摘していただきたい。。

## 原因 - 巨大ファイルの操作?

調査の参考にしたのは主に以下のサイトです。

[[ubuntu] mount.ntfs 100% CPU usage](https://ubuntuforums.org/showthread.php?t=1653598)

[Huge CPU usage by mount.ntfs process](https://bugs.launchpad.net/ubuntu/+source/ntfs-3g/+bug/392204)

どうやら、NTFSのHDDで巨大ファイルをコピペしたり、ダウンロードしたり、大きなtarbollを解凍したりなど、なにかしら大きなファイルを扱うときに暴走する模様。

## 解決策 - NTFSはダメ。おとなしくext4を使いなさい。

解決策ですが、上記フォーラムには毎回マウントし直すとか`/etc/fstab`で`big_writes`フラグを立てろとか`ntfsfix`を使えばいいとかいやどれもやったがダメだったなどなど…決定的な対処方法はありませんでした。おとなしくext4を使えという感じだと思います。

仕方がないので、私はNTFSからext4のHDDへデータを移し、そちらで作業を再開しました。
これから何か大きなファイルが絡む処理が入ることをやりたい場合は、NTFSは避けた方がよいでしょう。
Jekyll Nowの環境を構築するスクリプト

僕はJekyll Nowを使用してgithub上でブログを作成しました。
Jekyll Nowってなに？って方はこちらをどうぞ↓
[クリック1発で、Github上にブログを無料で作成できる「Jekyll Now」が超絶便利！
](http://plus.appgiga.jp/masatolan/2015/01/13/55047/)

この間新しい環境（パソコン）に買い換えたのですが、そのときに自分のブログをクローンして
`gem install github-pages`
をしなければいけませんでした。


地味にめんどくさかったので、自分のブログのリポジトリに
`install.sh`
というスクリプトを書いて、そのスクリプトを実行すればgithub-pagesをインストールする（既にインストール済みなら何もしない）というものを書きました。
なんともくだらないスクリプトですが、ここに共有しておきます(笑)
意外と、こういったくだらないものでも書いておくと後で楽になったりするかも。。。しれません。

```shell-session
#!/bin/bash

which github-pages >/dev/null 2>&1
if [ $? -ne 0 ];
then
  echo "not found command github-pages"
  echo "install github-pages"
  sudo gem install github-pages
fi
```
shouldAutorotate() が呼ばれない

#問題
[UITabViewController]->[UINavigationController]->[UIViewController]という構造になっているとき、UIViewControllerを継承したViewの中で

```swift
override var shouldAutorotate: Bool{
    return false
}
```
を書いても、画面が回転してしまう。
UIViewControllerが回っていなくても、その下にあるUITabViewControllerとUINavigationControllerが回ってしまっているからだ。
#解決方法
これをどこかに追記する。ちなみにshouldAutorotate以外にも個人的に書いておいたほうがいいと思ってるものも入ってる。

```swift
extension UINavigationController {
    open override var shouldAutorotate: Bool {
        guard let viewCtrl = self.visibleViewController else{return true}
        return viewCtrl.shouldAutorotate
    }
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        guard let viewCtrl = self.visibleViewController else{return .all}
        return viewCtrl.supportedInterfaceOrientations
    }
}

extension UITabBarController{
    open override var shouldAutorotate: Bool {
        guard let viewCtrls = self.viewControllers else{return true}
        return viewCtrls[selectedIndex].shouldAutorotate
    }
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        guard let viewCtrls = self.viewControllers else{return .all}
        return viewCtrls[selectedIndex].supportedInterfaceOrientations
    }
}
```

#コメント
UINavigationControllerのextensionを追記するのはどのサイトでも出てきたけど、UITabBarControllerがあるのが盲点だった。ちょっと書き方が複雑だったように思う。

上の書き方はSwift3.0だけど、Swift2系なら

```swift
open override var なになに: なになに{
```
を

```swift
public override func なになに() -> なになに{
```
に書き換えればいい。
Isomorphic JavaScript (with ClojureScript) for pre-rendering single-page-applications

https://pupeno.com/2015/09/11/isomorphic-clojurescript-javascript-for-pre-rendering-single-page-applications-part-1/
https://pupeno.com/2015/09/14/isomorphic-clojurescript-javascript-for-pre-rendering-single-page-applications-part-2/
https://pupeno.com/2015/10/02/isomorphic-javascript-with-clojurescript-for-pre-rendering-single-page-applications-part-3/
Vagrant 1.8.5 で default: Warning: Authentication failure. Retrying... と起動できない

# ひさびさに
Vagrant 立ち上げたらバージョン古いなと思って最新版にしたらハマった記録です。

- Windows10 
- [Vagrant 1.8.5](https://www.vagrantup.com/)
- [Virtualbox 5.1.4r](https://www.virtualbox.org/)

# default: Warning: Authentication failure. Retrying...

> [Vagrant 1.8.5でLinux boxをvagrant upするとエラーが出る件について](http://oki2a24.com/2016/08/15/resolve-warning-authentication-failure-retrying-in-vagrant-1-8-5/)
> [【Vagrant】バージョン 1.8.5 で Warning: Authentication failure. Retrying… となり vagrant up できない問題を解決](http://oki2a24.com/2016/08/15/resolve-warning-authentication-failure-retrying-in-vagrant-1-8-5/)

ようするに、600になってないと

```
-rw-------  1 vagrant vagrant  389 Aug 23 15:10 authorized_keys
```

# きたー、あれ？
なぜか見慣れたエラーが。。。[VirtualBox 5.1.4 Oracle VM VirtualBox Extension Pack](http://download.virtualbox.org/virtualbox/5.1.4/Oracle_VM_VirtualBox_Extension_Pack-5.1.4-110228.vbox-extpack) もインストールすることをお勧めします。

```
set -e
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant
```
ActionCableサンプル内でメッセージ送信をJob化

[前回](http://qiita.com/MariMurotani/items/6c1d78401c8085622603)
作ったサンプルでは、受け取ったメッセージを即座にbroadcastして送信していましたが、次はJobを通して送信したいと思います。

# 1. jobの作成
> rails g job MessageBroadcast

# 2. コード編集
先ほど作成したjobの中身を書き足します。

```rb:my1stRails/app/jobs/message_broadcast_job.rb
class MessageBroadcastJob < ApplicationJob
  queue_as :default

  def perform(message)
    ActionCable.server.broadcast 'room_channel', message: render_message(message)
  end
  private
    def render_message(message)
      ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
    end
end
```

room_channel.rbで直接ブロードキャストしていたところをコメントアウトします。

```rb:my1stRails/app/channels/room_channel.rb
  def speak(data)
    Message.create! content: data['message']
    #ActionCable.server.broadcast 'room_channel', message: data['message']
  end
```

データベースにレコードが追加されてコミットされた後のイベントに先ほど作成した、MessageBroadcastJob.performを登録します。

```rb:my1stRails/app/models/message.rb
class Message < ApplicationRecord
  after_create_commit { MessageBroadcastJob.perform_later self }
end
````

実行順序は
1) my1stRails/app/channels/room_channel.rbでデータ受信
2) Message.create! content: data['message']でデータベースにデータ登録
3) MessageBroadcastJobが呼ばれる
4) 3の中からrender_messageが呼ばれる
5) 画面に配信される

JOBは色々使えそうなので、これから勉強していきたいと思います。
JavaScriptのスコープについて

# はじめに
はじめまして
去年まで専門学校に通っていたゆとりの新社会人、ポンコツエンジニアです。
まだまだ、駆け出しなので間違った事を書いている可能性があるので
何かお気付きの点などがございましたら、ご指導のほどよろしくお願いします。

# 投稿の背景

　さて、今回こういった投稿をする事になった経緯としては
最近、JavaScriptを学習しなくてはならない環境になり
いろいろと理解していないことを痛感したので、これを良い機会に学習していこう
と思ったことが事の始まりです。

　今後も投稿する事があると思いますが、
「備忘録」といったスタンスで学習した内容を記録に残そうという意図を持って
書いているので、参考にしたい方はちゃんと理解している人のサイトを見つけてね(笑)

では、本題に入って行きたいと思います

# JavaScriptにおけるスコープについて

そもそも、スコープとはなんぞやってことで調べてきました。

## スコープ(scope)とは
スコープとは、変数の有効範囲のことで、プログラムのどの場所から参照できるかを決める概念だそう。

### スコープの種類
JavaScriptのスコープには、グローバル変数とローカル変数がある。
（まぁJavaScriptに限ったことじゃないけどね。）


|　　　　　　|  グローバル変数 | ローカル変数    |
|:---------:|:--------------:|:-----------:|
|　宣言場所　|   関数の外で宣言した変数　| 関数の中で宣言した変数、関数の仮引数  |
|　有効範囲　|  プログラム全体から参照できる　| その関数の中でのみ参照できる |

宣言場所って文章だけだと
イメージ付きにくいと思うので
コードを書きました(笑)
↓

```js:hoge1.js

var str1 = 'hello';  <--グローバル変数

function printStr(){

    var str2 = 'world'; <- プライベート変数

}
```

## スコープの有効範囲

実際の有効範囲としてはこんな感じかな
↓

```js:hoge2.js
var str1 = 'hello';

console.log(str1); <- helloと表示される

function printStr () {

    var str2 = 'world';

    console.log(str2); <- worldと表示される

    console.log(str1); <- helloと表示される
}

console.log(str2); <- エラーになる
```
つまり

`str1`は`printStr()`の外で宣言したので**グローバル変数**となり
`printStr()`の中からも参照は出来るが、
逆に`str2`は`printStr()`の中で宣言したので**ローカル変数**となり
関数の外からは参照出来ないってこと！

# JavaScriptにおける `this` について

JavaScriptにも`this`ってあるんですね
ただ少しJavaと違います。
今日そのおかげで仕事場でちょっと恥をかきました(笑)
なので、そのへんも記録に残したいと思います

## `this` ってなんやねん

意味は英語でいうと「この～」とかなんですけど
プログラミンではちょっと意味が違ってくるんですよね。。。

2016/8/24訂正
~~簡単に言えば*現在のオブジェクトを指す*ってことです。
ちょっとわかりにくいですね(笑)~~

正しい情報を教えて頂きました
>JavaScriptの this キーワードは理解しづらいもので、他のオブジェクト指向言語によくある“現在のインスタンス（またはクラス）を参照するもの”ではありません。
通常JavaScriptにおいて、関数内で呼び出された this は、関数呼び出し元のオブジェクトを参照することになります。

inoinojpさん、ありがとうございます。

例としてコードを書いてみました

```js:scope1.js
var str = 'global';// <- `window`オブジェクトに宣言

function getStr(){
    var str = 'obj'
    console.log(this.str); // <- 呼び出されたthis
}

getStr(); //<- 関数呼び出し元
````

>最上層のグローバルオブジェクトは `window` オブジェクトである

という事なので、
今回の場合、`getStr()`を呼んでいる場所は`window`オブジェクトになるという事ですね
すなわち、`console.log(this.srt);`の`this.str`の部分は`window.str`と言い換えてもいいですね

次の例を見てみましょう

```js:scope2.js
var str = 'global'
var Obj = {
    str:'object',
    getStr:function(){
    return console.log(this.str);
    } 
}
Obj.getStr();
```
この場合、呼び出している場所は`window`オブジェクト配下になるんですが、
`Obj.getStr();`というコードは`Obj`オブジェクトの`getStr()`を呼び出せとなっているので呼び出し元は`Obj`オブジェクトとなるわけです。
よって、出力されるのは`object`となります。

## `this` のメリットについて調べた結果

1. 汎用的な`function`が書ける

```js:hege3.js

function human(age){
   this.age = age;
}

human.prototype.print = function () {    
    console.log(this.age+"歳");

}
var boy = new human("23");
boy.print();

var girl = new human("20");
girl.print();
````

このコードを実行すると表示されるのは`boy.print`では`23歳``girl.print()`では`20歳`なんです。
これで汎用的な書き方ができそうですね！

次回はコメントで頂いた
>new 演算子を用いて生成されたインスタンスオブジェクトの場合、 this は自身のオブジェクトを参照します。
その他にも Function.prototype.call() などといった this キーワードの参照先を変更させるメソッドも用意されており、これもまたクセのある仕様になっている点（ここでは割愛しますが）に注意が必要です。

と言う部分の`new`演算子についての復習と`Function.prototype.call()`と言うワードについて学習していこうと思います。
adb.exe / Android SDK どこにあるんだよ！


設定から `Appearance & Behavior > System Settings > Android SDK` と進み、設定画面上部の `Android SDK Location` にパスが書かれています。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/43328/22de4f4e-ece3-c21e-2c88-c887b335c5a2.png)

私の場合は `C:\Users\[ユーザ名]\AppData\Local\Android\Sdk` にありました。(Android 2.1.3時点)