OmniAICreator/Qiita-1.07M huggingface dataset:
VivaldiのWEBパネルに登録して便利だったサイト


Chrome拡張ブラウザVivaldiを使い始めて2ヶ月。
もうchromeには戻れないくらい使ってて楽しい。

特にお気に入りの機能の一つがWEBパネル機能ですが、
あまりその良さが知られていない気がするので、登録しておいて便利だったサイトまとめました。
(こんな使い方もあるよーとかあればぜひご教授ください)

# WEBパネル機能とは
現在開いているタブでサイトを表示しながら、予め登録しておいた別のサイトを同時に表示できる機能。
下の画像では、googleTOPを開きつつ、WEBパネルでgoogle翻訳サイトを表示してます。
呼び出し方や登録の仕方は本題とずれるので省きます。

![wfgwrgwerg.png](https://qiita-image-store.s3.amazonaws.com/0/179992/47e1ccf5-eeb4-4c44-1eb7-e2796d04f7cb.png)

# 何が便利か
### 同時閲覧が一つのウィンドウで完結
わざわざもう一つブラウザウィンドウを開く必要がない！
※ちなみにWEBパネルに登録するまでも無いけど同時閲覧したい場合には、タイリングという機能もある。

### 複数のサイトを登録可能
WEBパネルには複数のサイトを登録できて、それぞれのサイトにショートカットキーを割り当てられる。

### タブ切替してもWEBパネルは切り替わらない
AのタブでWEBパネルを開いたあと、Bのタブに遷移しても、表示中のWEBパネルは閉じたり切り替わったりしない。

# WEBパネルに登録して便利だったサイト(本題)
ココからが本題。
実際に登録して便利だったサイト

※ちなみにWEBパネルはandroidブラウザ表示となっているらしいので、スマホアプリ展開しているサイトなど、
androidブラウザに対応していないサイトは表示することが出来ないです(evernoteやslackなど)

## 2018/12/10 追記
Vivaldi使い始めて1年半くらいたちましたが、未だにメインブラウザとして愛用中
(せっかく端末間同期だってできるようになったのに、何で流行らないんだろう、、)
ありがたくもリクエストをいただいたので、何点か追加しました。

## google検索TOPページ
ちょっとだけググりたい時に呼び出す。
「～とは」などちょっとした検索で一々新しいタブを出して検索していると、
戻るのも面倒な上に、タブが増えすぎて困ることもあったけど、これで軽減できました。

## google翻訳
ちょっと翻訳したいときに呼び出す。

## Gmail
新着メールをチェックしたいときに呼び出す。
閲覧・検索・アーカイブくらいなら不便無くできる。
ただandroidブラウザ表示なので、メール書いたり受信BOX以外を開くなどちょっと込み入ったことをしようとすると操作性が悪かったりします。

## Todoist
有名なタスク管理サイト。
今日のタスクをチェックしたり登録するときに呼び出す。
スマホアプリと比べても遜色なく使えて便利なので、todoistユーザはぜひ。

## Papier
ちょっとメモしたいときに呼び出す。
**この記事はこれを紹介するために書いた**といっても過言じゃないです。
PapierはChromeの拡張機能で、「新規タブページをメモ帳にする」機能で、
Chrome時代から愛用してた機能ですが、これをWEBパネルに登録したら想像以上に便利でした。

![wrgergarg.png](https://qiita-image-store.s3.amazonaws.com/0/179992/d4861e79-5fa0-a72e-0f3b-43b8382f5bfa.png)

登録方法
1. Chrome拡張機能でPapierを追加
2. Papierを有効にして、新規タブを表示(Papierのサイトが表示される)
3. アドレス欄のURLをコピー
4. WEBパネルにURLを登録


vivaldi自体にメモ機能があることはもちろん知っていて、よく使うのですが
「ちょっとペーストしておきたい」なんてときはこっちの方が便利だったりします。
お勧めです。

## パスワード用乱数生成ツール
http://www.luft.co.jp/cgi/randam.php
今のところWEBパネルではこのサイトが使いやすい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179992/02d1d2e2-2ab3-362f-1d33-af0e0c7c77f9.png)

## codic
https://codic.jp/
実装時のネーミングに悩んだときに使うサイト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179992/a9fff3a4-9e2f-4bd0-d1a4-3251c0171f97.png)

## QR生成サイト
https://qr.quel.jp/form_bsc_url.php
今のところWEBパネルではこのサイトが一番使いやすい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179992/45745a82-0bed-05f9-10e2-995ad53f2754.png)

## NAVITIME(電車)
https://www.navitime.co.jp/transfer/
乗換案内とNAVITIMEで迷ったけど、WEBパネルではNAVITIMEの方が使いやすかった
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179992/8c9fb3fc-cb8f-0751-41ba-8489b4b5106b.png)

## その他
twitterやらも、よく使う人には便利らしいです。
infinite scrollで表示した画像をcolorboxで開く

# 今回のお題
「もっと見る」ボタンをクリック → スクロールして表示される画像を
colorboxを使ってダイアログ表示します

infinite scrollでの表示に関しては
[cakePHPのpaginateでinfinite scrollを使った無限スクロール](http://qiita.com/sanapon1020/items/7c4a91b4bde086392b2d)を参照してください
手前味噌で恐縮です！

ですので、phpコードは省略します

## html
```html
<link rel="stylesheet" href="colorbox.css" />

<script src="/js/imagesloaded.pkgd.min.js"></script>
<script src="/js/masonry.pkgd.min.js"></script>
<script src="/js/jquery.infinitescroll.min.js"></script>
<script src="/js/jquery.colorbox-min.js"></script>

<!-- now loading -->
<span class="loading">
    <img src="/img/loading.gif" alt="Now Loading..." />
</span>

<div class="works">
    <?php foreach ($works as $work) : ?>
    <div class="works_item">
        <a href="..." class="popup">
            <img src="...">
        </a>
    </div>
    <?php endforeach; ?>
    <?php echo $this->Paginator->next('もっと見る', array('tag' => 'p', 'class' => 'read_more'), null, array('style' => 'display:none;')) ?>
</div>
```

今回、クラス名は`popup`とします


## javascript
```js
$(function () {
    // 総ページ数
    var pageCount = <?php echo $this->Paginator->params()["pageCount"] ?>;
    var nowPage = 1;

    $('.works').imagesLoaded(function(){
        $('.works').masonry({
            itemSelector: '.works_item',
            isFitWidth: true,
            isAnimated: true,
            isResizable: true
        });
    });
    $('.works').infinitescroll({
            navSelector  : ".read_more",
            nextSelector : ".read_more a",
            itemSelector : ".works_item",
            loading : {
                img : '...',
                msgText : '...',
                finishedMsg : '',
            },
    },
    function( newElements ) {
        var $newElems = $(newElements);
        $newElems.css({opacity: '0'});
        $newElems.imagesLoaded(function() {
            $('.works').masonry('appended', $newElems, true); 
            $('.popup').colorbox();
            if (nowPage < pageCount) {
                $(".read_more").appendTo(".works").delay(300).fadeIn(600);  
            }
            $newElems.css({opacity: '0'}).animate({opacity: '1'}, 1500);
            $('.loading').hide();
        });
        nowPage++;
    });

    // クリックでスクロールさせるためinfinitescrollをunbind
    $('.works').infinitescroll('unbind');
    // クリック時の動作
    $('.read_more a').click(function(){
        $('.loading').show();
        $('.works').infinitescroll('retrieve');
        return false;
    });
    $('.popup').colorbox();
});
```

`popup`に対してcolorboxを実行するようにします
スクロールされた際にもcolorboxが実行されるようにするために
`$newElems.imagesLoaded`内でも記述しています

とりあえずこれだけ、でホッとしていましたが。。。

## ハマったこと
colorboxでダイアログを開き、クローズをすると
infinite scrollでスクロールができなくなっていたんですね。。。

憶測ですが、colorboxをクローズしたタイミングで
infinite scrollを再初期化しないといけないのかなと、、、

しかし、うまくできなかったので以下の逃げ道を使いました
`$('.popup').colorbox({iframe: true});`

今回はcolorboxをiframeで開くことにより回避はできましたが
回避策がわかる方いましたらご教授願えたらと思います
GPTのディスクをddでコピーしたときの問題回避

GPTのディスクであっても、物理ディスクのデータは変わらないので、ddでまるっとコピーすれば全く同じものができるはず。しかし、ddでコピーした直後は、パーティションを正確に認識しない（GPTパーティションにはなっている）。下記の手順をとることで、パーティションを正確に認識させ、利用することができる。

1. gdiskを起動（sudo gdisk /dev/sdX）
2. l（小文字のL）、その次にw（小文字のW）で書き込む

参考元: http://minkara.carview.co.jp/userid/1364696/blog/34838758/
VagrantでWindows10にCentOSを立てる

以下の環境で、VirtualBox上にCenOSを起動します。
[環境]
Windows10
Vagrant 1.9.4
VirtualBox 5.1.22
CentOS 6.4

## 1. VirtualBoxをインストール
以下のサイトからダウンロードします。
「Windows hosts」となっているものを選択しましょう。
https://www.virtualbox.org/

## 2. Vagrantをインストール
以下のサイトからダウンロードします。
https://www.vagrantup.com/

## 3. Puttyをインストール
PuttyはWindows対応のSSHクライアントです。
TeraTearm等でも代用できます。
以下のサイトからダウンロードします。
http://ice.hotmint.com/putty/

## 4. VAGRANT_HOME設定
Windowsのユーザー名を日本語で設定している場合、正常に動作しないことがあります。
環境変数にVAGRANT_HOMEを追加し、日本語を含まないパスを設定します。
<img width="355" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/130099/ac19a3c7-d3fe-69b5-845f-3e1f76d18bd7.png">

## 5. VagrantでCentOSを起動する
以下の手順でCentOSを起動します。
- VagrantにBoxを追加する
- Vagrantfileを作成する
- CentOSを起動する

### VagrantにBoxを追加する
VagrantではBoxという単位でOSイメージを扱います。
以下のサイトから対象のOSを選択し、URLをコピーします。  
http://www.vagrantbox.es/  

今回は「CentOS 6.4 x86_64」を選択します。  

```
$ vagrant box add CentOS_6_4 https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box
```
ダウンロードが完了したら、listコマンドで確認できます。

```bash
$ vagrant box list
```

### Vagrantfileを作成する
Vagrantfileには仮想マシンの設定が記述されます。
任意のディレクトリに移動し、initコマンドを実行してVagrantfileを作成します。  

```bash
$ vagrant init CentOS_6_4
```

### CentOSを起動する
以下のコマンドでCentOSを起動します。

```bash
$ vagrant up
```

## 6. CentOSに接続する
Puttyを起動して、以下の通りに接続します。
- Host Name : 127.0.0.1
- Port      : 2200

接続先でログインIDとパスワードを聞かれるので入力します。
- loginID : vagrant
- password : vagrant

停止する場合はホスト側でhaltコマンドを実行します。

```bash
$ vagrant halt
```

CentOSにLAMP環境を整えるには以下の記事を参考にしてください。

[Vagrantで立てたCentOSにLAMP環境を構築する](http://qiita.com/sanotyan1202/items/e408ad338b0217b72eee)
MACアドレスからIPを調べる PowerShell編

`arp`と同等かそれ以上の機能を持つ`Get-NetNeighbor`コマンドレットを使う
`-LinkLayerAddress`オプションでMACアドレスを指定できる
https://technet.microsoft.com/ja-jp/library/hh826147.aspx

```ps1
> Get-NetNeighbor -LinkLayerAddress "XX-XX-XX-XX-XX-XX"

ifIndex IPAddress                                          LinkLayerAddress      State       PolicyStore
------- ---------                                          ----------------      -----       -----------
XX      192.168.X.X                                        XX-XX-XX-XX-XX-XX     Stale       ActiveStore
```
初心者が国際ハッカソンに単身乗り込んでみた

#自己紹介
こんにちは。現在広告制作会社に勤める社会人2年目のエンジニアです。
今回は僕が人生で初めてハッカソンに参加して得たこと感じたことをまとめたいと思います。
僕は主にopenframeworksとかunityを触っていて、学生時代はwebサイトを少し作ってたりしていました。今はphpとかその辺のデータベース周りを勉強しつつお前は一体どこを目指しているんだ状態です。
プログラミング自体ちゃんと勉強し始めたのは社会人なってからでしょうか。そんなド素人が出場して感じたことなので、「ハッカソンに出てみたいけど技術に自信がない…」「エンジニアじゃないからハッカソンは出れない...」とかいう人には読んでほしいです！
きっとそういう人、結構いるはず。

##今回出場したハッカソン
今回僕が出場したのがJunctionTokyo2017と言われる国際ハッカソンでした。会場が天王洲アイルで会社から近かったのもあって選びました(笑)
もう国際っていうだけあってスタッフが全員英語で喋ること喋ること。
会場に入って2秒で帰りたくなりましたよ。マジで。


##内容
今回の内容はハッカソンに出てどうやったら賞が取れるか？とかいう話ではなく、あくまでもハッカソンに出るのをこまねいてる人への後押しになれば的な記事です。
なので技術的なこととかには触れず準備物とかやっておいた方がいいことを書ければと思っています。

どうやったら賞が取れるのか？僕が教えてほしいわ。


#ハッカソン出場への準備
##ハッカソンには一人で行くべきか、チームで行くべきか？
僕は今回一人で乗り込みましたが、結果的に一人で乗り込んで良かったと思っています。嫌が応にも人と話さなくてはならない環境になりますし、何より自分の知らない分野の方達と話すことでたくさんの貴重な情報を教えてもらえます。
また、知らない人とチームを組むことで、お互いを全く知らないので結構言いたいこと話せたりするんですよね。これが友達同士だと多分気を使ってしまったりするケースもある気がします。
もちろん仲のいい友達と行くのは全然OKですよ！
なのでどちらでもいいと思いますが、一人で行った方が刺激的だと思います。


##技術者じゃなくても出れる？
基本的にはどこも大歓迎ですよ！でも参加人数の規模は要チェックしといた方がいいと思います。
例えば今回のJunctionTokyoは参加人数も多くエンジニアの人数が充分すぎるほど足りていて、むしろデザイナーの取り合いな雰囲気がありました。
なので考えるのが得意な人、デザイン大好きな人！自信を持って足を踏み入れてほしいです！
僕今回資料制作もしましたけど「デザイナー欲しい…」って思ってましたから...！


##アイディアは事前に考えておいた方がいい？
ハッカソンにもよりますけど事前にテーマを公開しているのもありますよね。
別にノープランでもいいと思います。ただ少なくとも賞を取るのが目的ならば最低２つは考えて、なおかつ実装まである程度済ましておくことをお勧めします。
やっぱりそのままノープランで挑んで企画まとめていざ実装となると、どうしても時間が足りなくなってくると思うので余裕を持って挑んだ方がいいと思いました。

ちなみに今回僕たちのチーム、奇跡の全員ノープランでした。


##参加者の年齢層
ハッカソンにもよると思いますが、特に参加に年齢制限が無いならば老若男女問わず多数の方がいます。僕いま23歳なんですけど、行く前は年上ばっかなんだろうなと思っていたら意外と学生さんも多くてですね。しかも英語ペラペラな子もいるんですよ。聞いてみたらどいつもこいつも、やれ交換留学やら、やれホームステイやら。
君たち両親に感謝しなさいホント。
もちろん年上の方も沢山いました。


##持ち物、準備
持ち物とかも基本ハッカソン運営側が提示しているものを持ち込めば全然問題なしです。
変に不安になっていっぱい詰め込んでも使わなかったりして労力の無駄になるので、むしろいかに持ち物を減らすことを考えましょう。
実際今回僕は不安になりすぎて結構荷物詰め込みましたが結局半分も使いませんでした(泣)
基本的に以下の荷物があれば問題ないかと。

・パソコン、充電器
これが無いと何もできんです
・紙とペン　
なくてもいいですがサッと自分の考えを図で起こすと意外と伝わります
・おやつ　
お腹空きます

ぐらいで全然大丈夫ですよ(^ ^)


#最後に
偉そうにいっぱい書きましたけど僕も正直死ぬほどビビって出場しました。
大した技術もアイディアもないのに冷やかしに行っているようなもんじゃないのかって思いながら。
でも最初はなんでも怖いって言うように行ってみないとわからない世界がいっぱいあります。
ハッカソンもその一つ。
動機なんて「ただどんなもんかと思ってきてみました」でいいんです。
怖いのはわかります。ただ出ないで終わるのが本当に勿体ないと出てみて感じました。体験談なんで間違い無いです！笑
もしあなたがハッカソンに興味があって出場するかどうか尻込みしているなら、是非勇気を出して出場してみてください。その一歩さえ踏み出せればあとはどうとでもなって、きっと終わった後には「楽しかった」の一言が出ているはずですよ(^ ^)

これが誰かのハッカソン出場への勇気に繋がれば幸いです。

賞を取る云々の前に、自分自身が楽しむことが第一ですよ。


#番外
ちなみに今回僕が出場したハッカソンがロボスタさんの方でレポート取り上げれています。
冒頭で取り上げられているバスタブ持ち込んでいるチームが僕たちのチームです(笑)
https://robotstart.info/2017/05/06/junction-tokyo-2017.html
RailsでjQueryのページスクロール設定

Railsで作成したWebサイト内でアンカーに飛ぶ際、瞬間移動ではなくページスクロールした際のメモです。

### 開発環境
- Ruby version  
  2.3.0 
- Rails version  
  5.0.2

# HTML(erb)

```html+erb:view/sample.html.erb
<div>
  <ul>
    <li><%= link_to 'サンプル1', '#sample1' %></li>
    <li><%= link_to 'サンプル2', '#sample2' %></li>
    <li><%= link_to 'サンプル3', '#sample3' %></li>
  </ul>
</div>

<div id="sample1">
  サンプル1
</div>

<div id="sample2">
  サンプル2
</div>

<div id="sample3">
  サンプル3
</div>
```
# jQuery

```js:assets/javascripts/sample.js
$(function () {
    $('a[href^="#"]').click(function () {
        var speed = 500;
        var href= $(this).attr("href");
        var target = $(href == "#" || href == "" ? 'html' : href);
        var position = target.offset().top;
        $("html, body").animate({scrollTop:position}, speed, 'swing');
        return false;
    });
});
```
最初、$('a[href^=#]')としており上手く動きませんでした。
$('a[href^="#"]')と#を"(ダブルクォーテーション)で囲んだところ上手く動作しました。
mongoをちょっと触ったので次にNodeから触ってみる

とりあえずMongooseとやらを入れればいいらしい？

```
npm install mongoose
```
だとエラーが出たので

```
npm install -g mongoose
```
とすると入れられた

https://teratail.com/questions/25181
この辺に解説が載ってます。

無事入れられたので実際に遊んでまた更新します。
BashOnUbuntuOnWindowsでMySQLを起動させる。

#BashOnUbuntuOnWindowsでMySQLを起動させる。
- 利用環境:Bash on Ubuntu on windows Version 10.0.15063
- mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64)

#記事の前提・目的
- 前提：BashOnUbuntuOnWindowsのバージョンを14393から15063に変更した。バージョン変更後、BashOnUbuntuOnWindowsを再インストールする必要があり、その結果、それまでのUbuntuの設定を再度行う必要があった。
参考：http://www.buildinsider.net/enterprise/bashonwindows/creatorsupdate


- 前提：これまで、BashOnUbuntuOnWindowsからMySQLを起動させる時には、常時起動しているMySQLを止めて、そのうえで、BashOnUbuntuOnWindowsからMySQLを起動させていた。


- この記事の目的：今後BashOnUbuntuOnWindowsを再インストールした時に、参考にする。

#BashOnUbuntuOnWindowsでMySQLをインストールする。

```
sudo apt-get install mysql-client-core-5.7
```
これは問題なし。

#MySQLを起動させようとするとエラーになる。
- BashOnUbuntuOnWindows で`rails s `や `sudo service mysql start`を入力すると下記のエラーになる。
これを回避し、MySQLを起動させたい。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```
エラーメッセージで検索してみると参考になるサイトが出てくるのだけど、
今回は試してもうまくいかない...なんでだっけ...。

#mysql-serverをインストールする必要があった。
```
sudo apt-get install mysql-server
```
これで、`sudo service mysql start`が効いた。

```
* Starting MySQL database server mysqld  
  No directory, logging in with HOME=/   
  [ OK ]
```


参考：http://qiita.com/hiroq/items/d6f611791ae2124f0fbe
　　　http://umatomakun.hatenablog.com/entry/2014/04/25/223240
　　　https://forums.ubuntulinux.jp/viewtopic.php?pid=91260
ER-XでフレッツIPv6 PPPoE（ひかり電話）

ひかり電話有りフレッツIPv6 PPPoE接続環境下で、HGW配下のER-XからIPv6プレフィクスを配布する設定について記述します。

環境
===

* ハードウェア: ER-X
* ファームウェア: v1.9.1.1

接続は以下の通りです。

[HGW] → eth0 [ER-X] switch0 → [クライアント]

手順
===

1. DHCPv6-PDクライアント設定
---------------

HGWにIPv6 PPPoEの設定を行うと、NGNより/56のIPv6プレフィクスが配布されます。
HGWはそれを16個に分け、/60のプレフィクスとして、DHCPv6-PDを用いて配布します。
まず、これを受け取るために、ER-XにDHCPv6-PDクライアントの設定を行います。

```
edit interfaces ethernet eth0
set ipv6 address autoconf
set dhcpv6-pd prefix-only
set dhcpv6-pd pd 0 prefix-length /60
set dhcpv6-pd pd 0 interface switch0 host-address ::1
set dhcpv6-pd pd 0 interface switch0 prefix-id :0
set dhcpv6-pd pd 0 interface switch0 service dhcpv6-stateless
exit
```

`prefix-only`は、DHCPv6-PDのみを使用し、DHCPv6によるアドレスの取得を抑圧する指定です。
`autoconf`は、eth0でRAを受信させ、ルーティングを
`prefix-length`には、HGWが払い出すプレフィクスの長さを指定します。
`host-address`には、switch0のインターフェイスIDを指定します。
`prefix-id`には、switch0のサブネットIDを指定します。
`dhcpv6-stateless`は、後述するRA配布において、DHCPv6-liteによるDNS設定の配布を有効にする設定です。

2. RA配布設定
------------

```
edit interfaces switch switch0
set ipv6 router-advert send-advert true
set ipv6 router-advert other-config-flag true
set ipv6 router-advert prefix ::/64
exit
```

`send-advert`を指定すると、RA配布デーモンであるradvdが起動します。
`other-config-flag`は、DHCPv6-liteによるDNS設定の配布を有効にします。
`prefix`は、/64のプレフィクスを配布することをradvdへ指示します。

どうもEdgeMAXのDHCPv6-PD周りは不安定らしく、再起動が必要な場合があります。

以上の設定により、ER-X配下のクライアントにIPv6プレフィクスが配布され、IPv6でインターネットに接続できるようになります。
デザインパターン学習メモ：「Factory Method」


## このパターンの目的

> 　オブジェクトを生成するときのインタフェースだけを規定して、実際にどのクラスをインスタンス化するかはサブクラスが決めるようにする。Factory Methodパターンは、インスタンス化をサブクラスに任せる。(GoF本、P.115)

## 実装例

```java:AbstractShapeFactory.java
// Creator
public abstract class AbstractShapeFactory {
	abstract Shape createCircle();
}
```

```java:ShapeFactory.java
// ConcreteCreator
public class ShapeFactory extends AbstractShapeFactory {

	@Override
	Shape createCircle() {
		return new Circle();
	}
}
```

```java:Shape.java
// Product
public interface Shape {
}
```

```java:Circle.java
// ConcreteProduct
public class Circle implements Shape {
	public Circle() {}
}
```

## 利点
`Circle`クラスの生成をnewすることなくFactoryを通じて行うことができるようになったので、具体的なクラスへの依存を取り除くことができた。

こうして生成された`Circle`クラスは、`Shape`インタフェースを通して操作されるため、`Circle`クラスに固有のメソッドを呼ばれることはなくなった。

## (備考)生成に関するパターンの使い分け
GoF本では、「Abstract Factory」、「Builder」、「Factory Method」、「Prototype」、「Singleton」の５つが生成に関するパターンとして紹介されている。

どのパターンを用いるかは自分が解決したい課題に応じて変わってくるのはいうまでもないが、「Factory Method」がシンプルで導入しやすいため、まずこれを使ってみるとよい。

GoF本には以下のように書かれている。

>　Factory Methodパターンは、しばしば、オブジェクトを生成する標準的な方法として扱われる。（中略）設計の初期段階ではFactory Methodパターンをまず使っておき、より一層の柔軟性が必要であることがわかったときに、他のパターンに発展させるようにする。(P.146)


## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
 * ロバート・C・マーチン（2004）『アジャイルソフトウェア開発の奥義　第２版　オブジェクト指向開発の神髄と匠の技』瀬谷啓介訳、SBクリエイティブ
『textgrid for free thinking』というブラウザテキストエディタを作ってみた

# textgrid for free thinking
あなたの思考に軽やかな翼を！
https://textgrid.herokuapp.com/

<img width="1440" alt="スクリーンショット 2017-05-07 0.14.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/150129/1da695d6-ee1f-ff0b-b8f1-d63a3321ac60.png">





# グリットデザインのテキストエディタです！
作ったきっかけは自由な思考をしたかったからです。
あることを考えているときに、別の視点で別のことが思いつきますよね。
そのときに、その一瞬のイメージが消えないうちにそれを書き残して置きたい。
そのために、グリッドで分けられたテキストエリアを複数用意することで、イメージが消えないうちにぱぱっと別のエリアにそれを書いて、書き終わったらもとのエリアで続きを書くことができる。

# エクセルのテキストボックスでも同じようなことができるのですが、重いしなんかださいし
考えを整理するときにわざわざエクセル起動するのもなんかなあと思いまして。
ブラウザで思考を深めることができた方がクールじゃないですか？

# 工夫した点
local storageを使って、ページを更新したり、戻る・進むしたりしても書いた内容が残るようにしたことです。
むしろそれぐらいしか工夫していない・・・。

# 改善点・・・
・入力したテキストのエクスポート機能がない笑 => これは近いうちにつけたいです
・「drag」と「resize」をボタンで切り替えるのはいまいち => テキストエリアの右下端をドラッグでサイズ変更、その部分以外でエリアの場所変更ができたらいいんですがやり方がわからない笑
・個人的にコードブロック機能が欲しい => コードを書き留めたときにシンタックスハイライトがないと読みにくいですし
（というかエクセルにコードブロック機能追加されないだろうか・・・）
homebrewでwatchmanインストールするときの制限

##tl:dr

- 公式docに載ってるコンパイル用オプションを使いたいなら、homebrewダメ。ソースからコンパイルが（ほぼ）必須
- 例外は `--enable-statedir`。これは、homebrewの環境変数を使って変更可能
- homebrewのインストール先をカスタマイズしてるなら、 `--enable-statedir`を使わないといけない

## homebrewのインストール先がデフォルト（`/usr/local`)の場合

```bash
brew install watchman
```

でOK

## homebrewのインストール先をカスタマイズしてる環境

- 自分がこれに該当
- `$HOMW/homebrew`に設定している

### 発生する問題

`brew install watchman`でインストールされても、起動でコケる

```bash
# エラーの出力の例
while computing sockname: 
failed to create /usr/local/var/run/watchman/sakymrk-state: No such file or directory
```

起動時に設定ファイルを`/usr/local`以下に作ろうとして（権限がないため）コケる

### `brew install watchman` ではインストールオプションが指定できない

watchmanのドキュメントに載ってる、[compile-time-configuration-options](https://facebook.github.io/watchman/docs/install.html#compile-time-configuration-options)を参考に、`--enable-statedir`オプションを使おうとしても、homebrewは無視する。

- watchmanのFormulaでオプションが定義されていない
    - `brew info watchman` を実行しても`==> Options` のセクションが無い
- そのため、このオプションに限らずすべてのコンパイルオプションは無視される


### 解決方法

watchmanのFormulaみると、変数`prefix`、`var`にホームディレクトリなど別のpathを渡せば、解決できることがわかる。

```rb
# watchmanのFormulaファイルの抜粋
# https://github.com/Homebrew/homebrew-core/blob/master/Formula/watchman.rb#L24-L29

  def install
    system "./autogen.sh"
    system "./configure", "--disable-dependency-tracking",
                          "--prefix=#{prefix}",
                          "--with-pcre",
                          # we'll do the homebrew specific python
                          # installation below
                          "--without-python",
                          "--enable-statedir=#{var}/run/watchman"
    system "make"
    system "make", "install"
```

[Formula Cookbook](https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md#variables-for-directory-locations)よむと、

- `var` は`prefix`の値から派生的に決まる
- 環境変数`HOMEBREW_PREFIX`をセットすれば、`prefix`の値をデフォルトの`/usr/local/`から変更可能

とわかる

### インストール方法

これでOK

```bash
# Good!
HOMEBREW_PREFIX=$(brew --prefix) brew install watchman
```
xrdpでproblem connecting

# 概要
- Amazon EC2上にubuntuをインストールしてリモートデスクトップ接続したい
- 下記の手順通りやっても上手くいかなかったので、対処法をメモ:
    - [Windows からデスクトップ機能を使用して Amazon EC2 Linux インスタンスに接続する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-to-linux-desktop-from-windows/) 
- 参考(というか答え):
    - [Problems Connecting to xrdp xfce desktop after Ubuntu Upgrade ](http://www.linuxquestions.org/questions/linux-networking-3/problems-connecting-to-xrdp-xfce-desktop-after-ubuntu-upgrade-943189/)

# 環境
- リモートOS: Ubuntu 16.04 Xenial (EC2上に作成)

# 事象
- xrdpでログインできない。下記メッセージが出力される。

> connecting to sesman ip 127.0.0.1 port 3350
> sesman connect ok
> sending login info to session manager, please wait...
> xrdp_mm_process_login_response: login successful for displa(見切れている)
> started connecting
> connecting to 127.0.0.1 5911
> error - problem connecting

# 対処
- /etc/xrdp/startwm.sh を変更

`+xfce4-session
-. /etc/X11/Xsession
+#. /etc/X11/Xsession`

- xrdp再起動

`service xrdp restart`

これで接続できるようになりました。
stm32:wait,delay処理

組み込み開発をやっていると、ICの応答や安定待ちで数usのウェイトを入れたいことが良くある。

厳密な時間を管理したい訳ではなく、「ざっくりとこの程度の時間を待ちたい」という処理なのでタイマを使うのも微妙。そんな時は、ソースコード中にインラインアセンブラで記述してやる。

プログラミングマニュアルにMCUの命令セットが大抵記載されているので、そこから"何もしない"命令を探してインラインアセンブラで以下のように記述する。

```cpp:
// STM32F4の場合
// 1クロックだけ待つ
asm("NOP");
```

100MHzのクロックであれば、asm("NOP");で10nsのウェイトになる。以下はサンプルコード。これをforやwhileで回したりすると繰り返しの分だけ余計に処理がかかるため、思った通りの待ち時間にならないことに注意。

```cpp:
//これはダメな例
void delay_us(uint32_t i){
	//NOP100回@100MHz = 1us	
	i=i*100;
	while(i>0){
		asm("NOP");
		i--;
	}
}
```

繰り返し処理や減算処理以外にも、関数の呼び出し処理があるため厳密には合わない。asm("NOP");を100回まとめて書いたものでストップウォッチで実測してみると、delay_us(10000000);で10.8秒くらい。NOPを90回に減らして調整。
本当はwhile文、iの減算処理にかかる処理数をアセンブラレベルで追いかければ正確にでるが、ざっくりとしたウェイトなのでこれで十分かな、と。（もちろん、割込みが入ればウェイトの時間はのびる…）

```cpp:
//妥協できる例
void delay_us(uint32_t i){
	while(i>0){
		//NOP100回@100MHz = 1us
		//実際はwhile文、iの減算の処理がある。実測でNOP90回が1usに相当する。
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
		i--;
	}
}
```
ubuntu wifiへの電力供給を安定化させる

#wifiが不安定な場合にチェック
`iwconfig`
無線lanプロセス名を確認（`wlan0 wlp2s0`等）
`Power Management:On`を確認

`sudo iwconfig プロセス名 power off`

常時この状態にする方法がわからん
起動時laptop modeに入るようにしてるけど、それに合わせてpower managementもonになりますね
これだけoffにする方法ないものか
Windowsで終了時にDDE Server Window アプリケーションエラーが発生する場合

#はじめに
こちらのブログで書いた記事の再投稿です
Windows10 anniversary update(Ver1607)で確認しています．
[Windows 10でシャットダウン時にエラーが出るようになった(DDE Server Window) ](http://wgg.hatenablog.jp/entry/20170127/1485512638)

# エラー概要
Windowsをシャットダウンする時，正確にはサインアウトするときに以下のようなダイアログが表示されました．

    DDE Server Window: explorer.exe - アプリケーションエラー
    ------------------------------------------------------

    0x****** の命令が0x****** のメモリを参照しました．メモリがwrittenになることはできませんでした．

    プログラムを終了するには[OK]をクリックしてください プログラムをデバッグするには[キャンセル]をクリックしてください

    [OK]  [キャンセル]

OK,キャンセルどちらをクリックしてもそのままシャットダウン(サインアウト)は実行されました．

# 対応
このエラーが発生した場合に，この通りにすれば直る確証はありませんが，自分の場合は以下のどちらかを行うと発生しなくなりました．

1. [設定]→[個人用設定]→[タスクバー]→[デスクトップモードでタスクバーを自動的に隠す]をオフにする

2. [タスクバーを自動的に隠す]はオンのままで，タスクバーの[スピーカ/ヘッドフォン]アイコンを[隠れているインジケータを表示します]の中に入れない

このいずれかに当てはまった状態で同じエラーが発生している人は上記を試して発生しなくなるか教えていただきたいです．
また，Windows10 Creators Update(Ver 1703)では発生しなかったので，もう修正されたのかもしれないです

## 参考
[Windows 10 Anniversary Update で アプリケーション エラー【Ver1607】](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-update/windows-10-anniversary-update-%E3%81%A7/2665348d-3eff-41af-9f70-21095e8437fa)

[DDE server windows: explorer.exe - Application error since Windows 10 Anniversary Update ](https://answers.microsoft.com/en-us/windows/forum/windows_10-performance/dde-server-windows-explorerexe-application-error/a5a45d0e-d3da-4e7f-a6cb-dc9b443e0dc4?page=2)
GitでSSH接続がなかなか確立しない場合の対処法

## 現象
GitでBitbucketにSSH接続しようとしてもなかなか接続が確立しない。
具体的には毎回pull/pushしようとする時に数十秒から数分待たされる。
環境は以下の通り。
OS: macOS Sierra 10.12.3
Git: git version 2.12.2
一方で、外部のLinuxサーバー
OS: CentOS release 6.8 (Final)
Git: git version 1.7.1
ではすぐに接続される。

## 対処法
常にIPv4で接続するようにする。
~/.ssh/configに以下の記述を追加。

```:.ssh/config
Host bitbucket.org
 AddressFamily inet
```

## 参考
sshの接続確立が遅い場合の対処方法
http://d.hatena.ne.jp/yuyarin/20090410/1239298235

## 追記
以下の同様の記事を見つけた。
http://qiita.com/devneko/items/5b4cbd89a66709f493ed
これってBitbucket固有の問題なんだろうか。

## 追記2
Bitbucket公式情報らしきものを発見。
https://confluence.atlassian.com/bbkb/recent-ipv6-changes-840796883.html
https://blog.bitbucket.org/2016/07/21/bitbucket-cloud-now-available-ipv6/

macOSで接続情報をチェック。

```zsh
$ ssh -v git@bitbucket.org
OpenSSH_7.3p1, LibreSSL 2.4.1
中略。
debug1: Connecting to bitbucket.org [2401:1d80:1010::151] port 22.
debug1: connect to address 2401:1d80:1010::151 port 22: Operation timed out
中略。
debug1: Connecting to bitbucket.org [104.192.143.2] port 22.
debug1: Connection established.
以下省略。
```
どうやらIPv6で失敗してIPv4で接続し直している様子。
Linuxだと素直にIPv6で接続出来ていた。
対処するにはファイアウォールの設定をいじると良いらしい。
https://confluence.atlassian.com/bitbucket/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall-343343385.html
暇な時に試してみよう。
IPv4も残っているらしいのでとりあえず最初の対処で良いことにする。
Apache HTTP error logs

#Setting up logs on conf 

```html:sample.conf
<VirtualHost *:80>
  DocumentRoot /var/www
  CustomLog ${APACHE_LOG_DIR}/access.log combined
  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
  LogLevel warn
</VirtualHost>
```

# Viewing the access and error logs
sudo tail -f -n 200 /var/log/apache2/access.log
sudo tail -f -n 200 /var/log/apache2/error.log
Vue.jsでシンプルな入力文字種制限

要件そのものにどうも納得がいかなかいが世の中似たような事求められることもありそうだからメモ。

##要件
1. フロントエンドでリアルタイムに入力項目にバリデートをかけたい
2. 条件外の入力文字列はそもそも入力できないようにしたい
3. フレームワークはVue.js

##検討
- とりあえずは```pattern```が使えそう
- (2)が無ければ```input```の```pattern```に正規表現を入れてイチイチ```form```タグで囲って入力毎に```submit```してやれば大体イケそうだが
- [vue-validator](https://github.com/kazupon/vue-validator)使えば多分イケるだろうけどこの程度のことに導入したくない


##現時点での結論:
```html:@inputでプロパティとvalueの両方に代入する
<template>
<main id="app"><main id="app">
    <h1>Vueでシンプルな入力制限</h1>
    <table>
        <tbody>
        <tr>
            <th>数字のみ:</th><td><input type="text" pattern="^[0-9]+" maxlength="20" :value="test1" @input="test1=opt(test1,$event)"></td>
        </tr>
        </tbody>
    </table>
</main>
</template>
<script>
var vue = new Vue({
    el:'#app',
    data:{
        test1:'',
    },
    methods:{
        opt:function(e){
            var re = new RegExp(e.target.pattern);
            var result = re.exec(e.target.value);
            return e.target.value = (result)?result[0]:oldVal;
        }
    }
})
</script>
```
- ```v-model```は```v-bind:value```と```v-on:input```の糖衣構文
    - [このへん](https://vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events)
- インライン構文でプロパティに代入すると```dispatchEvent```しなくて良くてスマートな感じ

##失敗:カスタムディレクティブ
```html:カスタムディレクティブ
<template>
<main id="app">
    <table>
        <tbody>
        <tr>
            <th>数字のみ:</th><td><input type="text" pattern="^[0-9]+" maxlength="10" v-model="test1" v-validate="test1"></td>
        </tr>
        </tbody>
    </table>
</main>
</template>
<script>
var vue = new Vue({
  el:'#app',
  directives:{
    validate:function(el, binding, vnode){
      var re = new RegExp(e.target.pattern);
      var result = re.exec(binding.value);
      el.value = (result)?result[0]:'';
      var evt = document.createEvent("HTMLEvents"); // この辺が冗長でアホくさい
      evt.initEvent('input', true, true );
      el.dispatchEvent(evt);
    }
  }
});
</script>
```
- 値をプロパティに直接入れたいが、```binding.value```は[読み取り専用](https://jp.vuejs.org/v2/guide/custom-directive.html#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%95%E3%83%83%E3%82%AF%E5%BC%95%E6%95%B0)
- ```binding.arg```とか```binding.expression```とかでプロパティ名を取ることは可能だが、```v-for```の中だったりするとどうしようもなくなる
- と言ってelのvalueに値を代入してもイベントが起こらないから態々起こさないといけない。
    - これが非常に冗長で美しくない。

##DEMO
Vueでシンプルな入力制限 http://jsdo.it/hadakadenkyu/22SK/
numpy配列をCSV出力する

初投稿。
最近pythonを使い始めた。
主に科学技術計算のために使おうと思っているのだが、今回は手始めにnumpy.arrayの配列データをCSVに出力する方法をメモする。


```python:test01.py
import numpy as np
#例としてsinカーブを作る
x = np.linspace(-5,5,100)
y = np.sin(x)

data = np.c_[x,y]

#csvファイルとして保存
np.savetxt('out.csv',data,delimiter=',')


```
git fetchとは

### 初心者です。ふと疑問に思ったことを書きます。



## git fetchって何？

###mergeしたはずなのにlocalに反映されてない！
という時とかに使えます。

gitの場合、リポジトリはリモートとローカルで2つあります。
git fetchとはリモートリポジトリで更新された最新情報をローカル
リポジトリに持ってくるコマンドのことです。
しかしpullのようにファイルが更新されるわけではありません。

ファイルが更新されるのではなく、
orgin/masterが更新されます。

##origin/masterとは

###ローカルの作業ディレクトリと結びついているのがmasterブランチ


###orgin/masterとはリポジトリと結びついているブランチ


ローカルリポジトリの中にはmasterとorgin/masterの2つの情報が
置かれています。
git fetchを行った時に新しい更新があるとorgin/masterが最新になります。
しかしmasterには更新が行われていない状態なのでmergeすることが必要になります。

```
git fetch
```
これでorgin/masterが最新になり

```
git merge origin/master
```

これでローカルのファイルが最新状態になります。
コマンドラインで最新版のphpMyAdminをバージョン指定なしでダウンロードする

コマンドラインで最新版のphpMyAdminをダウンロードしたかったです。
以前はできなかった気がしますが、公式サイトにlatestのリンクがありました。

> https://www.phpmyadmin.net/downloads/

下記のようにすれば現在ディレクトリにファイルを展開します。


```bash
$ curl -L -O https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
```

実際にはリダイレクトで`phpMyAdmin-latest-4.7.0-languages.zip`といったバージョン番号付きのファイルに飛ばされますが、保存されるファイルは`phpMyAdmin-latest-all-languages.zip`となります。

```bash
$ unzip phpMyAdmin-latest-all-languages.zip
```

ただしこのファイルを展開した場合にはディレクトリにバージョン番号がつきます。
うーんここもディレクトリ名をいつも同じものにしたいですね。
rails generate devise:install でエラー  (Rails 5.1, ruby 2.4)

deviseを使うときに躓いたのでメモ:pencil2:
Gemfileに以下を記述し、bundle installを実行

```
gem 'devise'
```

次に、rails generate devise:installすると以下のエラー

```
/home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.14.6/lib/bundler/runtime.rb:94:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'devise'.
Gem Load Error is: undefined method `alias_method_chain' for ActionDispatch::Routing::RouteSet:Class
Did you mean?  alias_method
Backtrace for gem load error is:
```

Gemfileの記述を以下に変更で解決


```
gem 'devise', git: 'https://github.com/plataformatec/devise.git', branch: 'master'
```


###参照
-  [undefined method `alias_method_chain (Rails 5.1, ruby 2.4) #4511](https://github.com/plataformatec/devise/issues/4511)
Electronで、前面に表示されているウィンドウを制御する

Electronは、ウィンドウを作るのは「main.js」などで、画面内での制御は「renderer.js」などと制御部分が分かれています。

そのため、画面内のボタンをクリックしたときに「今開いているウィンドウの場所」などを制御したい場合にハマりました。結論からいえば「remote」というしくみを使います。

```js

// ウィンドウなどを制御できるように remoteを取得
const remote = require('electron').remote;

// 現在フォーカスがあたっているウィンドウを取得
var win = remote.BrowserWindow.getFocusedWindow();
```

これで、ウィンドウを取得することができました。後は、位置などを変えたい場合は、次のように制御できます。

```
win.setPosition(0, 0);
```

他のやり方（ips？）などもあるようなので、別途調べてみたいと思います。
うそっ、私のサーバの性能悪すぎとか悔しくなりつつディスクの読み書き速度を確認する

# はじめに
ディスクの読み書き速度を確認したかったです。
物理ディスクでは個体差はありますがディスク自体の性能で決定されています。
が、VPSやクラウドではディスクは仮想的なものなので、どれぐらいの速度がでるか、というのは事業者によって違います。
その速度の確認コマンドです。あくまで目安として。

下記では1MBのブロックを1024回書き込んでいます。

```bash
$ dd if=/dev/zero of=/tmp/hoge bs=1MB count=1024 ; rm /tmp/hoge

1024+0 records in
1024+0 records out
1024000000 bytes (1.0 GB) copied, 4.56644 s, 224 MB/s

$ dd if=/dev/zero of=/tmp/hoge bs=1KB count=1024000 ; rm /tmp/hoge

1024000+0 records in
1024000+0 records out
1024000000 bytes (1.0 GB) copied, 6.02842 s, 170 MB/s
```

同じデータを連続して書き込む、いわゆるシーケンシャルライトを実行しています。
ブロックサイズが1MBの上の例では 224 MB/s、ブロックサイズが1KBの下の例では170 MB/sとなっています。

大体200MB/sあたりが出れば良い方で、上記の例はそこそこの速度といえるでしょう。

# GMOクラウドの例
GMOクラウドを使っていますが、たまにこの値がすごく悪いことがあります。

```bash
$ dd if=/dev/zero of=/tmp/hoge bs=1MB count=1024 ; rm /tmp/hoge

1024+0 records in
1024+0 records out
1024000000 bytes (1.0 GB) copied, 74.4594 s, 13.8 MB/s
```

![Screen Shot 2017-05-06 at 20.49.24.png](https://qiita-image-store.s3.amazonaws.com/0/47327/b17656f0-1758-6bf3-4343-5b64095955fc.png)


13.8 MB/s うーん、悪いですね（笑）


GMOクラウドの場合、ディスクのマイグレーション（使っているディスクを変更する）ことができます。
https://support.gmocloud.com/public/guide/portal_manual/disk_migration.html
このマイグレーションを行うことでディスク速度が改善することがあります。
ただしバックアップや作業などで時間がかかるので注意が必要です。

マイグレーションでダメな場合にはサポートに相談しましょう。改善の手立てを考えてくれる場合があります。

> なんか重いウェブサーバはディスクアクセスが遅いことが原因だったのでそれを解決した話
> http://qiita.com/yousan/items/bb9c55d09514690c7178

# 注意点など
## 小さすぎるサイズ

書き込むファイルのサイズが小さすぎる（100MB）と、OSのファイルキャッシュや仮想マシンホスト側のキャッシュに乗ってしまって実測値とかけ離れる場合があります。（1GB/sなど）
ですので1GB以上などのある程度の大きさにしておくことが必要です。

## AWS
AWSの場合にはIOPSを保証することができます。

> プロビジョンド IOPS SSD (io1) ボリューム
> http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSVolumeTypes.html#EBSVolumeTypes_piops

> AWS インスタンス別ネットワーク帯域・InstanceStore IOPS測定
> http://qiita.com/saitara/items/882a3e70639637e24a4f

> 既存EC2インスタンスにEBSボリュームを追加（アタッチ）する
> http://qiita.com/yuppi/items/ceed29f19e2b38fd0a79


## ディスク負荷
この作業はディスク負荷を掛けます。
頻繁に行ったり、大きいサイズで行ったりと負荷をかけすぎると事業者から怒られる可能性があります。他の人の迷惑にもなってしまうのでほどほどに注意して行いましょう。
sublime textでの最終行空行の自動追加


#sublime textで最終行空行を自動追加する方法

sublime text→preferences→settings

<img width="480" alt="スクリーンショット 2017-05-06 20.09.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/178032/e64dc658-e9ad-4aa6-76fd-05df4fbe1b8c.png">

16行目のように"ensure_newline_at_eof_on_save": false,　　を追加する

"trim_trailing_white_space_on_save": false, 
がある場合は最終空行削除になるので、消去し書き換える。

**git hubにて最終行に空行がない場合、赤丸の注意マークが出る。**
git hubでは実際は最終行空行があっても、削除されて表示されているので注意。

### 空行を最終行に入れる理由

-C言語、Unixのように最終行に空行が無いと、動作が保証されない場合があるため。
-見た目の統一性
[Python]多項式によるカーブフィッティング

サンプルデータに対し多項式でカーブフィッティングしたいときはnumpyのpolyfitを使うと簡単にできる。曲線は下記の多項式で表される。polyfitは下の式の$a_n$を計算してくれる。

```math
y = \sum^{N}_{n=0} a_n x^n
```

polyfitで返される値は次数が高い方ほうから並んでいる。数式にすると下記のような感じになる。

```math
y = \sum^N_{n=0} a_n x^{N-n}
```
polyfitで取得した係数を使った曲線のグラフを書きたいときは,xの値をnumpy.linspace等で用意して、numpy.polyvalに係数とxを渡すとyを計算してくれる。

下図はサンプルデータと１次式でカーブフィッティングした結果
numpy.polyfit(x,y,1)とするだけで係数が得られる。x,yはデータで1は次数を表す。
![download.png](https://qiita-image-store.s3.amazonaws.com/0/100523/e300401d-00b3-4987-7fc0-871849d32d05.png)

```python
w = np.polyfit(x,y,1)
xs = np.linspace(np.min(x),np.max(x),100)
ys = np.polyval(w,xs)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y,label='input')
ax.plot(xs, ys, 'r-', lw=2, label='polyfit')
ax.set_title('polyfit w = [%.2f, %.2f]' % (w[0],w[1]))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend(loc='best',frameon=False)
ax.grid(True)
```

サンプルデータは下記のように作成した。

```python
def getData1(numPoints, w,b, nstdev, xmin=0.0, xmax=1.0 ):
    x = scipy.stats.uniform.rvs(loc=xmin, scale=xmax-xmin,size=numPoints)
    n = scipy.stats.norm.rvs(size=numPoints, scale=nstdev)

    y = w * x + b + n
    return x, y

x, y = getData1(100, 1.5, 10, 10, xmin=0, xmax=100)
```


3次多項式でカーブフィッティングした結果
![download.png](https://qiita-image-store.s3.amazonaws.com/0/100523/4c788863-9ae3-3946-371a-dc84aef29267.png)


```python
w = np.polyfit(x,y,3)

xs = np.linspace(np.min(x),np.max(x),100)
ys = np.polyval(w,xs)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y,label='input')
ax.plot(xs, ys, 'r-', lw=2, label='polyfit')
ax.set_title('polyfit w = [%.2f, %.2f, %.2f, %.2f]' % (w[0],w[1],w[2],w[3]))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend(loc='best',frameon=False)
ax.grid(True)
```

サンプルデータは下記のように作成した。

```python
def getData2(numPoints, Amp,  freq, phase, nstdev, xmin=0.0, xmax=np.pi*2.0 ):
    x = scipy.stats.uniform.rvs(loc=xmin, scale=xmax-xmin,size=numPoints)
    n = scipy.stats.norm.rvs(size=numPoints, scale=nstdev)

    y = Amp*np.sin(freq * x + phase) + n
    return x, y

x, y = getData2(100, 10, 1.0, 0.0, 5, xmin=0, xmax=np.pi*2.0)
```

参考URL
https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html
https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html#numpy.polyval
railsでコントローラに関連付けられているモデルじゃないデータを呼び出すには？

初心者です。railsでふと疑問に思ったことを書いていきます。

railsでコントローラに関連付けられているテーブルじゃないテーブルのデータを呼び出すには？

ということです。結論は特になにもしなくても出来る、です。

例えばUserコントローラで

```rb
def index
    @group = Group.find(params[:group_id])
end
```

とGroupモデルを引っ張ってこれます。「UserコントローラだからUserモデルじゃないと駄目」とかそういう決まりはないそうです。

以上です。間違えていたらコメント下さい。
FragmentのonResumeが2回呼ばれる対策

Fragmentを追加(add)して、削除(popBackStack)して、同一のFragmentを再度追加(add)すると、
FragmentのonResume()が２回呼び出されることがある。


#参考リンク
[Why is my onResume being called twice?](http://stackoverflow.com/questions/16026756/why-is-my-onresume-being-called-twice)

[Android lifecycle onPause and onResume are called twice in some test-cases in both android lollipop version 5.0 and 5.1.](https://issuetracker.google.com/issues/37033842)

#原因の予想
同一のFragmentを再度作成し追加(add)する際に、
古い(削除した)Fragmentと新しい(追加した)Fragmentの両方のonResume()が呼ばれてしまうのではないかと予想している。

#回避策
onResume()が２回呼ばれる場合があるが、
そのうちの一つはonResume()が呼び出されているのにisAdded()がfalseとなるケースがある。
FragmentのonResume()の最初にisAdded()のチェックを行うことで、
異常ケースのonResume()の処理を弾くことが出来る。
Unity5.6でVRコンテンツを作ってみる（ポインタ召喚編）

#UnityでVRコンテンツを作る
前回に引き続きVRコンテンツを作っていこうと思います。

**※諸事情により前回使ってたasset storeの家ではなく他の家を使っています**
その他の変更はございません。

#今回の目標【VRによくある点(ポインター)を表示する】
VRコンテンツにはよく
<img width="566" alt="ポインタ.png" src="https://qiita-image-store.s3.amazonaws.com/0/83409/8b352782-bcdf-8eee-623d-e736b26f43c2.png">
こんな感じの点がありますよね。
今回は実行すると２画面になり、さらにこの点を表示するところまでやります。

#準備
今回準備するものは
~~・Google VR SDK for Unity
これはhttps://developers.google.com/vr/unity/download?hl=jaからダウンロードしてください。~~<-なんかなくても下のがあれば行けそう
・あるソースコード(gvr-unity-sdk)
gvr-unity-sdkは
https://github.com/googlevr/gvr-unity-sdk
からダウンロードしておいてください。
以上!!

#手順
##１.ダウンロードしたものをドラック&ドロップ
![スクリーンショット 0029-05-06 19.30.51.png](https://qiita-image-store.s3.amazonaws.com/0/83409/a730b9b9-a932-08bc-fb78-8f0cd28b3181.png)
このCardboardと言うフォルダごとUnityのAssetsの部分にドラック&ドロップします。

##2.再生した時にVRっぽくする
Main CameraにAssets/Cardboard/scriptsのStereoControllerをドラック&ドロップします。そして試しに再生してみましょう。![スクリーンショット 0029-05-06 19.36.12.png](https://qiita-image-store.s3.amazonaws.com/0/83409/11570d90-9d0a-d9b0-5a7f-798c0576e95d.png)
こんな感じにVR特有の２画面で再生されるようになりました。
**カメラの向きを変えたい時はAltキーを押しながらマウス移動でいけます！！**

##3.点（ポインター）の召喚
まず、Main Cameraの中にCardboardPointerと言うカラのゲームオブジェクトを作ります。
![スクリーンショット 0029-05-06 19.40.29.png](https://qiita-image-store.s3.amazonaws.com/0/83409/40eb7722-aba7-059d-b091-b6f7b37aee68.png)
そして、そのCardboardPointerにAssets/Cardboard/Scripts/UIの中にあるCardboardReticleをドラックします。
さらに、Assets/Cardboard/Resources/UIの中にあるCardboardReticleMaterialをドラックします。
![スクリーンショット 0029-05-06 19.42.19.png](https://qiita-image-store.s3.amazonaws.com/0/83409/2c8bd020-238f-6396-e811-769e3d6397f7.png)
![スクリーンショット 0029-05-06 19.41.25.png](https://qiita-image-store.s3.amazonaws.com/0/83409/636ce17a-cf1c-7101-1f46-107a25ce6d46.png)
そして、CardboardPointerをクリックして、このShaderの部分をクリックし、Cardboard/CardboardReticleに変更します。（色はColorの部分で変更してます。もともとは白です。）![スクリーンショット 0029-05-06 19.43.28.png](https://qiita-image-store.s3.amazonaws.com/0/83409/2e3f3b28-570a-9a9e-c00e-2c814d4d2df0.png)
これで実行してみましょう！！！！
こんな感じに点が出たらOKです！！
![スクリーンショット 0029-05-06 19.45.18.png](https://qiita-image-store.s3.amazonaws.com/0/83409/588d3821-0d78-95c9-41ef-414d948bce6b.png)

次は自分の端末にこれをインストールしてみましょう。
キノコやってみた Pepper x IBM Bluemix Text to Speech

# 音声ファイルを作って、Pepperに話をさせる（再生）

## text-to-speechとは
IBMの音声合成機能を使用して書かれたテキストを自然な音声に変換してくれます。
AWSでいうPollyと同じ。

- https://www.ibm.com/watson/developercloud/doc/text-to-speech/index.html

## Pepperの発話に苦戦
Pepperにいい感じに発話させるのって大変。しかも発音調整するには実機がないとできないから余計に大変
バーチャルロボットで確認できるならいいんだけど、そうもいかず。。これ、みんなどうしているんだろう？？
みんな苦戦しているのでしょうか？？

## テキストを音声ファイルにして再生
というわけで、テキストを Text to Speech 使って音声ファイルに変換しダウンロード。それをそのまま発話させるということを試しました。

## Bluemixで Text to Speechを作成
![スクリーンショット 2017-05-06 18.24.42.png](https://qiita-image-store.s3.amazonaws.com/0/119864/89ab10e2-b303-ec61-2237-58bc6ca1fab5.png)

アクションの「資格情報の表示」を押すと、usernameとpasswordが表示されるので、コレを使います。


```python:pepper-pythonscript例
  url = "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?accept=audio/wav&voice=ja-JP_EmiVoice"
  param = {"output" : "hello_world.wav", "text" : message}
  filePath = self.appFolder + "/" + self.getParameter("file name")
  r = requests.get(url, auth=("{username}", "{password}"), params=param)
  outfile = open(filePath, 'wb')
  outfile.write(r.content)
  outfile.close()
```

http get に、python requestsモジュールを使ってます。
このあたりが参考になります。
http://qiita.com/n0bisuke/items/5b782bb758ce5611cc90

paramでは、出力（ダウンロード）ファイル名と、変換元のテキストを設定しています。
requests.getで、先の資格情報とparamを設定し、request発行

Pepper内の `filePath` にしていた場所に `outfile.write(r.content)` にて保存されます。
あとは Play Soundボックスで再生すれば完成です。
使用scrapy爬取电影网站

#使用scrapy爬取电影网站

#环境
Scrapy    : 1.3.3
lxml      : 3.7.3.0
libxml2   : 2.9.3
cssselect : 1.0.1
parsel    : 1.1.0
w3lib     : 1.17.0
Twisted   : 17.1.0
Python    : 2.7.9 (default, Mar  6 2017, 10:54:15) - [GCC 4.4.7 20120313 (Red Hat 4.4.7-16)]
pyOpenSSL : 16.2.0 (OpenSSL 1.0.1e-fips 11 Feb 2013)
Platform  : Linux-2.6.32-431.el6.x86_64-x86_64-with-centos-6.5-Final


#spider_movices.py
```python：scrapy_movices.py

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

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from ygdy8_20170508.items import moviceItem
#from  scrapy.linkextractors import LinkExtractor

class MySpider(CrawlSpider):
    name = 'Myspider'
    allowed_domains = ['ygdy8.com']
    start_urls = ['http://www.ygdy8.com/']

#    rules = (
#        Rule(LinkExtractor(allow=('\d+\.html', ), deny=('html\/game\/\d+\.html', ))),
#        Rule(LinkExtractor(allow=('\d+\.html', )), callback='parse_item',follow=False,),
#    )

    rules = [
        Rule(SgmlLinkExtractor(allow=('\d+\.html'),),
             callback='parse_item',
             follow=True)
    ]

    def parse_item(self, response):
        self.log(response.url)
        item = moviceItem()
        if 'game' in response.url:
            #ftps = response.css('td[style*=WORD-WRAP]').xpath('u/font/a/@href').extract()
            ftps = response.css('td[style*=WORD-WRAP] a::attr(href)').extract()
        else:
            ftps = response.css('td[style*=WORD-WRAP]').xpath('a[contains(href,ftp)]/text()').extract()
            if len(ftps) == 0:
                ftps = response.css('td[style*=WORD-WRAP] a::attr(href)').extract()
            for i in ftps:
                x = i.encode('utf-8')
                if  not x.startswith('ftp'):
                    ftps = response.css('td[style*=WORD-WRAP] a::attr(href)').extract()
                    break
        item['ftp'] = map(lambda x:x.encode('utf-8'),ftps)
        item['name'] = ''.join(response.xpath('//title/text()').extract()).encode('utf-8')
        yield item
```

#items.py

```python:items.py
# -*- coding: utf-8 -*-

import scrapy

class moviceItem(scrapy.Item):
    name = scrapy.Field()
    ftp = scrapy.Field()


```

#pipelines.py

```python:pipelines.py
# -*- coding: utf-8 -*-
import codecs
import json

class Ygdy820170508Pipeline(object):
    def __init__(self):
        self.file = codecs.open('movice.json','wb',encoding='utf-8')

    def process_item(self, item, spider):
        m = item['ftp']
        if len(m) == 0:
            raise DropItem('Drop %s the item' %item)
        line = json.dumps(dict(item)) + '\n'
        self.file.write(line.decode('unicode_escape'))
        return item
```


[执行结果下载](http://cloud.utouu.me/index.php/s/ZhqKDTn8QuOSfmj)
デザインパターン学習メモ：「Builder」

## 目的

> 複合オブジェクトについて、その作成過程を表現形式に依存しないものにすることにより、同じ作成過程で異なる表現形式のオブジェクトを生成できるようにする(GoF本、P.105)

## 実装例

```java:Main.java
public class Main {

	public static void main(String[] args) {
		Director director = new Director(new MarkdownBuilder());
		String text = director.construct();
		System.out.println(text);
	}
}
```

```java:Director
public class Director {
	private Builder builder;
	
	public Director(Builder builder) {
		this.builder = builder;
	}

	public String construct() {
		builder.makeHeadline("headline 1");
		builder.makeStrongText("strong text");
		return builder.getResult();
	}
}
```

```java:Builder.java
public interface Builder {
	void makeHeadline(String text);
	void makeStrongText(String text);
	String getResult();
}
```

```java:MarkdownBuilder.java
public class MarkdownBuilder implements Builder {
	private StringBuffer buffer = new StringBuffer();

	@Override
	public void makeHeadline(String text) {
		buffer.append("# text");
		buffer.append("\n");
	}

	@Override
	public void makeStrongText(String text) {
		buffer.append("**");
		buffer.append(text);
		buffer.append("**");
	}

	@Override
	public String getResult() {
		return buffer.toString();
	}
}
```

## 実装例の解説
 * MainクラスはDirectorを生成する。DirectorはフィールドにBuilderの具象クラスを持つ
 * Directorのconstructメソッドを呼ぶと、Builder内に目的のオブジェクトが作られる
    * constructメソッドは、Buidlerがもつオブジェクト生成用メソッドを１つ以上呼び出す
 * 最後に、Builder内の完成したオブジェクトをgetResult()で取得する

## ポイント
 * Directorがフィールドとして持つBuilderの具象クラスを切り替えることで、生成されるオブジェクトの表現形式を変えることができる
    * 実装例だと、MarkdownのテキストやHTMLのテキストを切り替える
 * 新しいDirectorを実装することで、すでにあるBuidlerをつかって、異なるプロセスで`product`(Builderによって生成されるオブジェクト)を生成できる
 * `product`の 内部表現や内部構造が、Builderによって隠蔽される
    * つまり、Builderだけが知っている
 * オブジェクトの生成プロセスは、Director内に局所化される

## 使いどころ
GoF本にでてきた例の1つがわかりやすかったので、引用する。

> コンパイラサブシステム内のParserクラスは、(中略)Directorクラスである。Parserオブジェクトは、文法上の構文を認識するたびに、ProgramNodeBuilderオブジェクトに通知を送る。構文解析が終了するときに、Parserオブジェクトは、ProgramNodeBuilderオブジェクトに対して、それまでに作成した構文解析木を要求し、それをクライアントに返す。(P.114)

DirectorクラスとしてのParserが、構文解析を行いながら、Buidlerにオブジェクト（解析木）生成のためのメッセージを送る。Builder内に解析木が出来上がっていき、完成したらそれを取り出すのである。

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
 * 結城浩（2004）『Java言語で学ぶ　デザインパターン入門』SBクリエイティブ
Mac で特定サイズの画像を生成する

Preview.app でたいていの編集は問題なくできるのだが、横にちょっと余白いれたいなどができない。そういった場合、特定のサイズで透明画像を作成して、それを編集するという方法が使える。

ImageMagick を使う。

```sh
brew install imagemagick
```

生成コマンドは次。

```sh
convert -size 960x1136 "xc:#00ff00" launch.png
```

透過した画像を作りたい場合は `xc:none` を使う。

```sh
convert -size 960x1136 xc:none launch.png
```
単体テストのカバレッジを取る


単体テスト環境を作ってみる
http://qiita.com/tksmiura/items/f783cab446a4a1075bba

の続き

- とりあえずgcovを使う
- 'make gcov'と打つだけでカバレッジが取れるようにしたい。

##実装結果

```Makefile

all: main

#TARGETS
PROGRAM = main
SRCS = main.c
TEST = ut_main
TEST_SRCS = ut_main.c
GCOV_TEST = ut_main_gcov

# ENVIRONMENT
CC ?= gcc
CFLAGS ?= -Wall -O2

# suffixes
.SUFFIXES: .c .o .go

# target
$(PROGRAM): $(SRCS:.c=.o)
	$(CC) -o $(PROGRAM) $^

# サフィックスルール
.c.o:
	$(CC) $(CFLAGS) -c $<

.c.go:
	$(CC) $(CFLAGS) --coverage -o $@ -c $<

# ファイル削除用ターゲット
.PHONY: clean
clean:
	$(RM) $(PROGRAM) $(SRCS:.c=.o) $(TEST) $(TEST_SRCS:.c=.o) $(GCOV_TEST) *.gcda *.gcno *.gcov *.go

.PHONY: test
test: $(TEST)
	./$(TEST)

$(TEST): $(TEST_SRCS:.c=.o)
	$(CC) -o $(TEST) $^

.PHONY: gcov
gcov: $(GCOV_TEST)
	./$(GCOV_TEST)
	gcov -b $(TEST_SRCS:.c=.gcda)

$(GCOV_TEST): $(TEST_SRCS:.c=.go)
	$(CC) $(CFLAGS) --coverage -o $(GCOV_TEST) $^


```

```main.c
#include <stdio.h>

static int func1(int parm)
{
    if (parm >= 0)
        return 1;
    return 0;
}

int main(int argc, char *argv[])
{
    printf("Hello World!\n");
    printf("arg test %d\n", func1(argc));
    return 0;
}
```

```ut_main.c
#include <stdio.h>
#include <dlfcn.h>
#include <stdbool.h>

/* test function prototype */
typedef bool (*Test)(void);

#define main __original_main

#include "main.c"

#undef main

#define UT_ASSERT(f) {if (!(f)) {printf("%s:%u: '%s' is NG\n", __FILE__,__LINE__,#f);return false;}}

bool test001(void)
{
    UT_ASSERT(func1(1) == 1);
    return true;
}

bool test002(void)
{
    UT_ASSERT(func1(0) == 1);
    return true;
}

bool test003(void)
{
    UT_ASSERT(func1(-1) == 0);
    return true;
}

int main(int argc, char *argv[])
{
    Test t;
    bool ret;
    int i;
    char func_name[100];
    unsigned int count_ok = 0, count = 0;
    
    for (i = 0; i < 100; i++) {
        sprintf(func_name, "test%03d", i);
        t = (Test) dlsym(RTLD_DEFAULT, func_name);
        if (t != NULL)  {
            count++;
            ret = (*t)();
            if (ret)
                count_ok++;
            else
                printf("test NG %s\n", func_name);
        }
    }
    printf("result %u/%u \n", count_ok, count);
}
```

###実行結果

MAC OS X(10.12.4)

```
% make gcov
cc -Wall -O2 --coverage -o ut_main.go -c ut_main.c
cc -Wall -O2 --coverage -o ut_main_gcov ut_main.go
./ut_main_gcov
result 3/3 
gcov -b ut_main.gcda
File './main.c'
Lines executed:57.14% of 7
Branches executed:100.00% of 2
Taken at least once:100.00% of 2
No calls
./main.c:creating 'main.c.gcov'

File 'ut_main.c'
Lines executed:95.24% of 21
Branches executed:100.00% of 12
Taken at least once:66.67% of 12
No calls
ut_main.c:creating 'ut_main.c.gcov'
```

### 技術的な話

- makeで別オプションのビルドをするために、実行ファイル名を変えるのと合わせ、独自の拡張子(*.go)を導入、ルールを追加（あっ、go言語と被る？)、リンカはどうせマジックナンバーで見ているので勝手にリンクしてくれるだろう（保証なし）
- make時にgcovを掛けるところまで実行
- テストコードのカバレッジが出てしまうのもイマイチ