OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby2.4.0 & Rails5.0.1にアップデートしたらエラーが発生したgemたち

何かしらのエラーが出るとは予想していましたが....
案の定出現しました( ･ὢ･ )

## 開発環境
- Vagrant 1.9.1(CentOS7.1)
- Ruby 2.4.0
- Rails 5.0.1

Rubyのバージョンは、rbenvで管理しています。

## アップデート後エラーが発生したgem

### ・bundle
unicornを再起動しようとすると
「bundleがあるのはruby2.3.0 だよ〜」と怒られる。


>[vagrant@localhost rails_5]$ bundle exec unicorn_rails -c config/unicorn.rb
rbenv: bundle: command not found
>The `bundle' command exists in these Ruby versions:
  2.3.0


どうやら、bundleはRubyのバージョンごとに管理されているので
bundle installを行う必要があるそうです。

```
bundle install --path vendor/bundle
```

【参考】
[rbenvでRubyの最新のバージョンに対応する](http://qiita.com/saicologic/items/4819b81f7628b490a7f2)

### ・rubocop & rainbow
bundle installを実行するとエラー発生

>Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
>
>    can't modify frozen String
>
>Gem files will remain installed in /vagrant/hello_gyouza/rails_5/vendor/bundle/ruby/2.4.0/gems/rainbow-2.2.1 for inspection.
Results logged to /vagrant/hello_gyouza/rails_5/vendor/bundle/ruby/2.4.0/extensions/x86_64-linux/2.4.0-static/rainbow-2.2.1/gem_make.out

>An error occurred while installing rainbow (2.2.1), and Bundler cannot continue.
Make sure that `gem install rainbow -v '2.2.1'` succeeds before bundling.


[rainbow](https://github.com/sickill/rainbow)というgemで引っかかったようです。
入れた覚えがないgemなのにな〜と調べてみたら
rubocopと依存関係にあるgemでした。

RubyGemsをupdateするとエラー解消できました。

```
gem update --system
```

【参考】
[Bundler 0.14 breaks 2.2.1 build #48](https://github.com/sickill/rainbow/issues/48#issuecomment-274266731)

### ・draper
bundle installもできたしunicornを立ち上げるぞ〜〜！
と思ったらエラー発生

>LoadError: cannot load such file -- active_model/serializers/xml

active_model/serializers/xml が読み込めないとのこと。
Gemfileにgemを追加してインストールするとエラーが解消されました。

▼Gemfileにactivemodel-serializers-xmlを追加

```
gem 'activemodel-serializers-xml'
```

```
bundle install --path vendor/bundle
```

【参考】
[Draper relies on active_model/serializers/xml which is being removed in Rails 5 #697](https://github.com/drapergem/draper/issues/697)

### ・where-or
またもやエラー発生....
早く..unicorn起動させて..........

> Congrats for being on Rails 5. Now please remove this patch by getting rid of the `where-or` gem

Rails5でOR句は使えるようになったから、gemは消そっ♪とのこと。
'where-or'を抹消すると無事エラー解消！

```
gem uninstall where-or
```

unicornも起動できました！
＼＼\\ ٩( 'ω' )و //／／
sshによるリモートコマンド実行時の環境変数について



sshによるリモートコマンド実行時にsshでログインした際には適用される環境変数が適用されてなくて困ったので、適用されない理由を調べた。あってるかは不明なので間違ってたらこっそり教えて下さい。

まずsshのmanには以下の一文が記載されている。

> If command is specified, it is executed on the remote host instead of a login shell.

sshでコマンドを指定して実行すると **ログインシェルの代わり** に実行されると書かれている。

[How do I set $PATH such that `ssh user@host command` works?](http://stackoverflow.com/questions/940533/how-do-i-set-path-such-that-ssh-userhost-command-works)

ログインシェルと非ログインシェル及び対話的かどうかで初期化ファイルの読み込みに差異が出てくる。
下記にその違いを簡単に記載する(bashを例に)。

ログイン

- システムログイン時に実行されるシェル
- 必要な設定やログイン時に実行したい環境・設定を構築するのに使用される
- bashの場合実行時に/etc/profile及び~/.bash_profileを読み込む

非ログイン

- ログイン以外のシェルやログオンユーザに紐づいてないプロセスから起動されているシェル

対話シェル

- 実行するコマンドはキーボードなどのユーザ入力を受け取ることが可能
- ユーザへ入力を促すことが出来る
- bashの場合実行時に~/.bashrcを読み込む

非対話シェル

- プロセスから実行されているため、ユーザからの入力や出力をユーザに見せるといったことができない

>Interactive: As the term implies: Interactive means that the commands are run with user-interaction from keyboard. E.g. the shell can prompt the user to enter input.

>Non-interactive: the shell is probably run from an automated process so it can't assume if can request input or that someone will see the output. E.g Maybe it is best to write output to a log-file.

>Login: Means that the shell is run as part of the login of the user to the system. Typically used to do any configuration that a user needs/wants to establish his work-environment.

>Non-login: Any other shell run by the user after logging on, or which is run by any automated process which is not coupled to a logged in user.


[What is the difference between interactive shells, login shells, non-login shell and their use cases? [duplicate]](http://unix.stackexchange.com/questions/50665/what-is-the-difference-between-interactive-shells-login-shells-non-login-shell)

sshのリモートコマンド実行の場合、ログインシェルが実行されないためシェルがログイン時に実行する各種初期化が動かない(非ログイン・非対話のシェル)ため、環境変数がログイン時とはことなる状態になっている(のだと思う).
docker for mac をインストールしたんだが、docker pullでコケた時の対処法

# 落ちたdockerのバージョン
```
% docker --version
Docker version 1.13.1, build 092cba3

% docker-compose --version 
docker-compose version 1.11.1, build 7c5d5e4

% docker-machine --version  
docker-machine version 0.9.0, build 15fd4c7
```

上記環境下で docker pullを行うと...

```
docker pull ubuntu       
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.65.1:53: server misbehaving
```

のように落ちます。あぁ無情...

stack overflowを漁っていくとどうやら、docker for macのバグのようで開発者にfeedbackを送ろうと書いてある始末...そんなに待てるかー！っと。

ということで、あるあるですが以下のことを試しました。

```
1. 一度uninstallして再install
2. 違うバージョンをinstallする
```

#対処法とその結果
1. 一度uninstallして再install

→ 2度試してみましたが、解決しませんでした。これで解決したという人もstack overflowでみかけましたが、このバージョンでは解決せず。

2. 違うバージョンをinstallする

<img width="831" alt="Screen Shot 2017-02-24 at 22.27.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/98127/c0a87cc5-b98d-66f1-40e9-03cbb5b0d03c.png">

安定思考な私はStable版をインストールしていたのですが、Beta版ではこの不具合直っているのでは？と思いinstallしてみると

```
% docker pull ubuntu 
Using default tag: latest
latest: Pulling from library/ubuntu
8aec416115fd: Pull complete
695f074e24e3: Pull complete
946d6c48c2a7: Pull complete
bc7277e579f0: Pull complete
2508cbcde94b: Pull complete
Digest: sha256:71cd81252a3563a03ad8daee81047b62ab5d892ebbfbf71cf53415f29c130950
Status: Downloaded newer image for ubuntu:latest
```
成功！どうやらB版では起きないらしい。

<img width="621" alt="Screen Shot 2017-02-24 at 22.40.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/98127/9ac39fd4-4e2e-ebb0-53a2-553afbfe6285.png">

なんだかロゴのbetaの文字が可愛く見えてきました。


#ウルトラCな対処法
ふと家庭用のwifiからポケットwifiに切り替えてやってみたところ、stable版でも実行できました。もしかしたら、wifiを切り替えるだけで治ることもあるのかもしれません。


#追記
どうやらdns周りのエラーっぽい。
https://github.com/docker/for-mac/issues/1025
gitのcommitメッセージを考えたくない（良いか悪いかで言ったら悪い案)

ここらへんでちょちょっとPushしよってときに、メッセージ考えるのがめんどくさいからメッセージをaliasに

```
alias da=git commit -m "data"
```

```
$ git da
```

ちょっちょっとPushするときに便利なので使ってみてください

#注意！！！！
最初とmergeするときにdataってcommitメッセージ送ったら怒られるから気をつけろ！油断するな！！
あと、最後にリベースしなさいよ！！
Windows 10でLaravelを動かすまでのメモ

# PHPインストール
## ダウンロード
- http://windows.php.net/download#php-7.1
    - hread SafeのZipをダウンロード

## インストール
- 解凍後、C:\phpに配置
- PATH設定
- php.iniの設定

# Apacheインストール
##  ダウンロード
- https://www.apachelounge.com/download/

## インストール(PHPの設定含む)
- zip解凍
- httpd -k install 
- httpd.conf修正
    - LoadModule php7_module C:/php/php7apache2_4.dll

```
<FilesMatch "\.php$">
  AddHandler php7-script .php
  AddType application/x-httpd-php .php
</FilesMatch>

PHPIniDir "c:\php"
```

# Composerインストール
- Composer-Setup.exe 実行

# Laravel インストール

```
composer create-project --prefer-dist laravel/laravel [PJ-name]
```

# サーバ起動
c:\[PJ-name]>php artisan serve

# 参考リンク
PHPのインストール
http://www.phpbook.jp/install/

Apacheインストール
https://www.adminweb.jp/apache/
UbuntuでRedmine

UbuntuでRedmineをインストールしようと下記のコマンドを実行
sudo -u www-data svn co sudo -u www-data svn co http://svn.redmine.org/redmine/branches/3.2-stable 

下記のエラーが出て処理が止まってます。
svn: warning: W000013: ファイル '/root/.subversion/servers' を開けません: 許可がありません

このエラーの対処方法がわかる方がいれば、ご指導お願いします。
jqueryで要素が指定したclassを持っているか確認する方法

このclassがあったら非表示、とかの動作に使える

```javascript
// クラス名に「.」をつけないように注意
element.hasClass("クラス名");
```

```javascript
$("div").click(function(){
  if ( $(this).hasClass("protected") )
    $(this).animate({ left: -10 }, 75)
           .animate({ left: 10 }, 75)
           .animate({ left: -10 }, 75)
           .animate({ left: 10 }, 75)
           .animate({ left: 0 }, 75);
});
```
pythonのsimpyでシミュレーションをしてみた その１

#そもそもsimpyとはなにか
simpyはsimulation pythonの略語でpythonのライブラリの一つです。といってもよくあるような連続的な物理シミュレーションを対象としているわけではなく数学的に離散型待ち行列と呼ばれるものを対象としています。つまり時間が離散的な場合において、待ち行列と呼ばれる数学の行列ではなく現実に人が待たなければいけない行列を対象としています。待ち行列の具体例としてスーパーマーケットの行列があげられます。まぁ要はsimpyは待ち行列を離散的に扱ってpythonでシミュレーションしてくれるわけですね。待ち行列の詳しい内容はここでは説明しないのでググってどうぞ。または[待ち行列理論の記事](http://qiita.com/ogata-k/items/ed53406a8e6010fe4a43)を見てください。
#対象読者
今回の記事を読んでもらいたい対象者としてはpython3系を使い、pythonの基本ライブラリのrandom、scipy、matplotlib、sys、osを簡単にではあるが使えることを前提として考えていますのでsimpyに関しないことの説明を省かせていただくのであしからず。ですがシミュレーションで必要なのはsimpyだけなので概略をつかむだけでいいならこれらを使えなくても結構ですし、これらが出てくるのはその３以降です。
そして注意してほしいこととして筆者がテキトーに使えるように頑張って英文を理解しただけですので単語の日本語訳はテキトーです。それでも言い方は読み続けても大丈夫です。それ以外の方は参考記事程度に読み進めていってください。
#pythonのイテレータ関数（まだpythonの基礎の部分）
pythonでforループを使うときにrange関数を使うときがあると思います。簡単に言うとこのrange関数がイテレータと呼ばれるものです。イテレータとは実際に関数を実装するときにyield文を使います。簡単にrange関数をmyrange関数として実装してみると

```python:myrange.py
def myrange(n):
    j = 0
    while j < n:
        yield j
        j += 1

for i in myrange(3):
    print(i)  # 0 1 2
```

このmyrange関数はforループで呼び出される度にyieldでいったん止まりそこで数値を返します。そしてfor文で、作成した変数に代入します。そしてまたfor文で呼ばれたときにyieldの後の文から関数が実行されます。これを繰り返してこの関数を抜けたときにこの関数は勝手にエラーを返してforループを抜けます。
こういったイテレータ呼ばれる関数はpythonでも使われる基礎的な文法ですがsimpyで頻出する文法でもあります。
#simpyの基本的な文法（ここから本番）
simpyの一番簡単なコードは以下のようになります。

```python:practice.py
import simpy

def myrun(env):
    while True:
        print(env.now)
        yield env.timeout(2)

env = simpy.Environment()
env.process(myrun(env))
env.run(until=10)  # 0 2 4 6 8
```
まず

```py
import simpy
```

でsimpyをインポートします。
そのあとにイテレータmyrun()を定義しておきます。（あとで詳しく説明します）
次に

```py
env = simpy.Environment()
```

でsimpyの環境を作成します。今後このenvとおいた環境のプロセスにイテレータを追加してシミュレートすることになります。つまり今回の場合では先ほどテキトーに説明したイテレータmyrunをこのenv環境のプロセスに追加してenv.run関数でシミュレーションします。myrunは無限ループですが内部でenv環境の時刻を表示してからそのenv環境の２単位時間分（何を単位時間とするかは任意）の時間を待つイテレータです。（つまり２単位時間分そのenv環境からタイムアウトをします。）また、yield env.timeout(1)だと1単位時間分待つのでenv環境が1単位時間分進む毎に呼ばれることになるわけです。そして

```py
env.process(myrun(env))
```

でenv環境にプロセスを追加して

```py
env.run(until=10)
```

で１０単位時間分だけenv環境の時間を進めます。ここでもしmyrun関数が

```py
def myrun(env):
    print(env.now)
    yield env.timeout(2)
```

だとすると、一度だけ実行してすぐに関数を抜けるのでイテレータとしてのエラーを吐いて関数の役目は終わります。つまりenv.run()の結果は0だけ表示されて終わります。また、untilを設定しないと無限に計算してくれます。しかしすべてのイテレータがエラーをはいて止まってくれていればenv.run()は無限に計算せずにすべてがエラーをはいたときに止まってくれます。
簡単なsimpyの基本動作はこれですべてです。
# 次回予告
simpyの重要な道具である資源（というか利用可能サーバ）のsimpy.Resourceとコンテナ（というかこちらが利用可能資源）のsimpy.Containerを説明します。

[その２](http://qiita.com/ogata-k/items/efa963d5752a64490de2)ができました。
2017/2/27にジェネレータ関数の記述をpythonの一般的な記述のイテレータに書き直しました。
2017/3/25に待ち行列に関しての記事へのリンクを貼り付けました。
Haskell GHCへの機能提案とその議論を見ることができます

はじめに
=======

HaskellのコンパイラであるGHCについて、ユーザーに見える(user-visible)機能についての提案と議論が、Githubを用いて行われています。


ghc-proposals on github
=======================

従来は、Mailing-list, Trac, Reddit, IRC などを用いて、GHCへの機能提案と議論が行われていました。
2016年の後半あたりから、それらの分散した議論を、Githubを用いて行えるようになりました。

提案と議論は以下で行われています。

  * https://github.com/ghc-proposals/ghc-proposals

これまでの提案は、以下で参照することができます。

  * https://github.com/ghc-proposals/ghc-proposals/pulls

Githubのアカウントがなくても、議論を参照することが出来ます。
Githubのアカウントがあれば、議論や新規提案を行うことが出来ます。



ghc-proposalsでの提案プロセスについて
==================================

提案プロセスの手順や考え方については、以下の公式情報が参考になります。

A Proposal for Proposals
* https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0001-proposal-process.rst



補足
=========

### GHC開発の中でのghc-proposalsの位置づけ

GHC開発の中でのghc-proposalsの位置づけについては、以下の資料もどうぞ。

- [GHC development flow](https://takenobu-hs.github.io/downloads/ghc_development_flow.pdf#page=10)

### 追記：

GHCへの変更提案の手順については、以下の記事もどうぞ。

- [GHCへの変更提案とパッチ送付の手順例](https://haskell.jp/blog/posts/2018/ghc-proposal-and-patch.html)



以上です。
アクセスログを分析する

#各コマンドについて
##wcコマンド
Word Countの略で単語数や行数を数えるコマンド。

##grepコマンド
ファイルの中の文字列に対して正規表現を使って検索するコマンド。

##cutコマンド
各行の一部を出力するコマンド。

##uniqコマンド
連続して重複した行を1つにまとめる
同じファイル内に同じ行があったとしても、連続していないとまとめられないため、sortコマンドとよく一緒に使用される。
-dで重複している行のみを抽出したり-uで重複した行をまとめるのではなく削除したりする。

##sortコマンド
行の並び替えができるコマンド。
2行目でソートさせたい場合には-kを付けるとできる。

```
$ sort -k2 fuga.txt
1 22
6 24
2 34
7 4
5 43
4 46
8 5
9 5
3 53
```

一見ソートされていないように見えるが、2がつく数字が上に来るようにソートされている。
数値としてソートさせるには-nオプションが必要。


```
$ sort -k2n fuga.txt
7 4
8 5
9 5
1 22
6 24
2 34
5 43
4 46
3 53
```

#実際にやってみる
アクセスログを実際に集計してみる(練習)
##ログの総件数を求める

```
$ wc -l access_log.20170201
4661 access_log.20170201

$ wc -l access_log.20170201 access_log.20170202
34661 access_log.20170201
34785 access_log.20170202
69446 合計
```

wcコマンドの引数にファイルを指定すれば、件数を表示してくれる。
-lオプションで行数だけを表示させることができる。
注意点としては改行があって1行とカウントされるので、改行が一つもないと中身が存在しても0行になってしまう。



##hoge.phpへの全アクセス数を求める

```
$ grep hoge.php access_log.20170201 | wc -l
5633
```

grepでhoge.phpが含まれる行だけを出力し、それをwcコマンドの渡すことでhoge.phpに対するアクセス数を計算している。

##hoge.phpへの12時台のアクセス数を求める

```
$ grep 01/Feb/2017:12 access_log.20170201 | grep hoge.php |  wc -l
672
```

上記の例にさらにgrepで検索を行っている。

##ログファイル中のユニークなIPアドレスのリストを求める

```
$ cat access_log.20170201 | cut -d ' ' -f 1 | sort | uniq
10.11.12.13
10.11.12.14
10.11.12.15
```
cutコマンドは-dオプションでデリミタを指定して-fオプションでフィールドを指定している。
今回の場合スペースで区切られたフィールドのうち、最初のフィールドのみを出力させている。
それに対してsortコマンドで重複が連続するようにした後に、uniqコマンドで重複をまとめている。

##IPアドレスごとのhoge.phpへのアクセス数を求める

```
$ grep hoge.php access_log.20170201 | cut -d ' ' -f 1 | sort | uniq -c
30  10.11.12.13
3   10.11.12.14
223 10.11.12.15
```

uniquコマンドに-cオプションをつけることで重複した行数を先頭に付加することができるため、何行あるかを表示できる。

##時間帯ごとのhoge.phpへのアクセス数を求める

```
$ grep 01/Feb/2017 access_log.20170201 | grep hoge.php | cut -b  25-31  | sort | uniq -c
 420 2017:00
 512 2017:01
 641 2017:02
 167 2017:03
 143 2017:04
 174 2017:05
 298 2017:06
 387 2017:07
 476 2017:08
 367 2017:09
 410 2017:10
 699 2017:11
 802 2017:12
1043 2017:13
1536 2017:14
1833 2017:15
1409 2017:16
1902 2017:17
2367 2017:18
2435 2017:19
2525 2017:20
2362 2017:21
1958 2017:22
1400 2017:23
```
cut -b  25-31ってところがいけてないけど、他に思いつかなかった。
試験に出るHTML5プロフェッショナルLv1

試験を受けようと下書きをして、そのまま放置していたら、
HTML5プロフェッショナル認定試験 レベル1がバージョン２となるようです。（２０１７/３月より）
なんと・・・。・・・名前もややこしい・・・。
とは言いつつ、バージョン２の対策本も現状ないし、ひとまず受験してきました。
一応誰かのために残してみます。

まず結果から。
６７点の合格ラインに対し８３点のスコアで合格でした。ふう。
全く知らないワードが２、３問（こういった試験では必ず泥沼問題がでますね）
長文のhtml,cssを読み解く問題が４問くらい。
キーボードで入力する問題も幾つか出題されました。

その他は世に出ている公式サンプル問題、問題集に近い出題でした。
個人的に「全て選択しなさい」という嫌いな出題形式が感覚的に５問くらいしか出なかったのは助かりました。
あと、今後は出題比率が減るらしい？Webの基礎知識（HTTPとかネットワーク、サーバー周り）が出題範囲にある通り、かなり出題されていて助かりました。応用情報の午前レベルの問題なので、ここで点数を稼げました。（基本情報、応用情報に合格したのは随分前ですが・・・）

やっておくべきこと。

 - 公式ページのサンプル問題。
 - マイナビさまの対策テキスト＆問題集。
 - 翔泳社さまのHTML教科書。
 - ＠ITさまのITトレメ。
 
上記を一通り９割程度正解できるようになっておくことが重要です。


> **『舐めてかかると余裕で落ちれます』**

という受験記を上げている方が世の中にいますが、その通りです。
問題を解くだけでは多分合格できないです。（擬似要素と擬似クラスが分別できるレベルなら問題解くだけでも大丈夫かも？）
問題集の模擬試験１回目の結果に驚くことでしょう。
（私は試験２日前に４５％くらいの正解率で諦めかけたくらいですよ、はい）
書籍の問題が粒揃いというか、重箱の隅をつつくというか、そのレベルを要求されるの？
というところですが、まあ実務では必要ないかもですが試験では確実に必要です。（*セマンテック重要、それはこの試験で学んだよ*）
そういった、重箱の隅をつつきながらこんなプロパティがあるのか、とかこんな要素書いたことない・・・
という部分を埋めていけば合格に近づけそうです。（*バージョン２はどうなることでしょうか・・・*）
必要な知識はかなり広く、それなりに深くという感じですね。
Lv2のバージョン２はどんな感じなのでしょう・・・。


以下、下書きのままです。
**HTML5で追加された要素とか、実務で使ってなくても本当に出題されますからね。**

## DOCTYPE宣言
 - <!DOCTYPE HTML>
 - <!doctype html>
 
※!DOTYPEの前に空白は入れない。
※<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">はhtml4.01

## グローバル属性
 - accesskey
 - class
 - contenteditable
 - dir
 - hidden(html5で追加：要素を表示しない)
 - id
 - lang
 - spellcheck（ｈｔｍｌ５で追加：スペル、文法チェック）
 - style
 - tabindex
 - title
 - translate

※googleの検索結果の検索ボックスは、以下のグローバル属性が設定されていました。(aria-*属性やrole="combobox"もありました)

 - class="gsfi" 
 - id="lst-ib"
 - title="検索"
 - dir="ltr"
 - spellcheck="false" 

## HTML5で追加された要素
 - article
 - aside
 - audio
 - bdi
 - canvas
 - data
 - datalist
 - embed
 - figcaption
 - figure
 - footer
 - header
 - keygen
 - main
 - mark
 - meter
 - nav
 - output
 - progress
 - rb
 - rp
 - rt
 - rtc
 - ruby
 - section
 - source
 - templete
 - time
 - track
 - video
 - wbr
Chainer ver2.X と ver1.XなどをAnaconda で切り替えて使ってみる

2.24に行われた[Chainer meetup#4](https://chainer.connpass.com/event/46953/)ではChainer v2.0.0a1のリリースの発表がありました。詳しくは[YouTubeの配信（1:39:25～）](https://www.youtube.com/watch?v=Fq5ZQ1ccG38)が参考になります。
今まで、仮想環境などまったく考えずに１つの環境だけで使っていましたが、今回のv2.0以降とv1.Xでは一部互換性がなくなります。最近TensorFlowもver0.12 ⇒ ver1.0に変わったこともあり、古いバージョンのコードが使えるように、切り替えて使える形にしておくと便利だと思います。調べてみると、[「Condaで作ってる仮想環境の切り替えをJupyter上で簡単に行う方法」](http://qiita.com/yoppe/items/38005f415a5b8b884c7d)がとても便利そうだったのでやってみました。

#環境
- Windows 10 Professional
- GeForce GTX 1070
- CUDA Toolkit 8.0 (8.0.44)　
- cuDNN 5.1
- Anaconda3 4.2.0 (Python 3.5）
- jupyter 1.0.0

####◎変更前
＜root＞
・chainer 1.21.0
・tensorflow-gpu 0.12.0rc1
・Keras 1.1.2

####◎変更後
＜root＞
・chainer 2.0.0a1
・tensorflow-gpu 1.0.0
・Keras 1.2.2

＜oldenv＞（rootをクローンして作成）
・chainer 1.21.0
・tensorflow-gpu 0.12.0rc1
・Keras 1.1.2

今の環境＜root＞をクローンして＜oldenv＞を作り、＜root＞の中を新しくしたという感じです。
Anaconda上では＜root＞と＜oldenv＞は別ファイルで独立しており、それぞれの環境でpipやcondaで個別にインストール・アンインストールできるようでした。
rootのクローンは容量がそれなりに増えるので、あまり頻繁にするものではないのかもしれません。

#構築方法

##1.今の環境をクローン
Anaconda Promptなどで＜root＞の環境をクローンして、別の環境例えば＜oldenv＞などを作る

```
>conda create -n oldenv --clone root
```


##２．環境の変更


####・環境の一覧を表示

```
>conda info -e
```

####・環境を＜oldenv＞へ切り替え

```
>activate oldenv
```

####・インストールされたパッケージの確認

（クローンされた側にも＜root＞と同じものが入っていました。）

```
>conda list
```


####・環境を＜root＞に戻す

```
>deactivate 
```

##３．新しいVerをインストール

####・入れ替えたい環境で（今回は＜root＞）古いverをアンインストール

（updateでもうまくいくかもしれませんが、念のため一回アンインストール）

```
>pip uninstall chainer
>pip uninstall tensorflow-gpu
>pip uninstall Keras
```

####・そのままの環境で（今回は＜root＞）新しいverをインストール

```
>pip install chainer --pre
>pip install cupy
>pip install tensorflow-gpu
>pip install Keras
```

※chainer 2.0.0a1はアルファ版なので --preを入れないとchainer1.21.0が入ります。
※chainer 2ではcupyが独立したので、別途入れる必要があります。

##４．jupyterで切り替えられるようにする
[「Condaで作ってる仮想環境の切り替えをJupyter上で簡単に行う方法」](http://qiita.com/yoppe/items/38005f415a5b8b884c7d)
[「Jupyterで複数カーネルを簡単に選択するための設定」](https://qiita.com/tomochiii/items/8b937f15c79a0c3eae0e) 2018.3.22追加
を見て設定してください。こんな感じで簡単に切り替えることができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/109458/a51a180b-5081-a0a1-2def-800d86e277d7.png)
Rのジェネリック関数のコードを確認

タイトルの内容についてのメモ書き。

コンソールでぱぱっと確認しようとしてちょいちょい忘れてしまうんで。今回は`dplyr::recode`を例に。

まずは関数名だけで実行してみる:

```r
library(dplyr)
#>  
#>  Attaching package: 'dplyr'
#>  The following objects are masked from 'package:stats':
#>  
#>      filter, lag
#>  The following objects are masked from 'package:base':
#>  
#>      intersect, setdiff, setequal, union
recode
#>  function (.x, ..., .default = NULL, .missing = NULL) 
#>  {
#>      UseMethod("recode")
#>  }
#>  <environment: namespace:dplyr>
```

こんな感じで`UseMethod("hoge")`ってなってるとジェネリック関数で、`class`が何によるかで関数が分かれていくことになる。じゃあどんなmethodがあるかを確認。

```r
methods("recode")
#>  [1] recode.character* recode.factor*    recode.numeric*  
#>  see '?methods' for accessing help and source code
```

`methods`関数に放り込むと、`(関数名).(クラス名)`で定義された関数の一覧が返ってくる。それぞれのコードをコンソールでチェックするには、`getS3method`関数を利用。

```r
getS3method("recode", "character")
#>  function (.x, ..., .default = NULL, .missing = NULL) 
#>  {
#>      values <- list(...)
#>      if (!all(has_names(values))) {
#>          stop("All replacements must be named", call. = FALSE)
#>      }
#>      n <- length(.x)
#>      template <- find_template(..., .default, .missing)
#>      out <- template[rep(NA_integer_, n)]
#>      replaced <- rep(FALSE, n)
#>      for (nm in names(values)) {
#>          out <- replace_with(out, .x == nm, values[[nm]], paste0("`", 
#>              nm, "`"))
#>          replaced[.x == nm] <- TRUE
#>      }
#>      .default <- validate_recode_default(.default, .x, out, replaced)
#>      out <- replace_with(out, !replaced & !is.na(.x), .default, 
#>          "`.default`")
#>      out <- replace_with(out, is.na(.x), .missing, "`.missing`")
#>      out
#>  }
#>  <environment: namespace:dplyr>
```

これでOK.
デザイナーのスマホのcssのデバックを手伝った話

デザイナーのcssのデバッグを手伝った備忘録
デザイナーの人がどうしても動かない、どうしてもこれができないって言う時に行うためのTips
(特にスマホ）
※ Javascriptアレルギーの方には不向きです
※ jQueryで書いてあるところがあるので適宜なんとかしてください、不安ならエンジニアに見せればなんとかしてくれます

# iOSで動かない！
## Macがある場合に使えるデバック
MacとiPhoneをつなげてデバックが出来るのはご存知？
1. MacとiPhoneをつなげる
2. Safariのメニューから開発を選ぶ
（※ 開発がない場合はsafari→環境設定→詳細→メニューバーに"開発"メニューを表示 にチェックを入れる）
3. ユーザーエージェントの下らへんにあなたの端末名（iPhoneとかiPad)とかの名前があるはずなのでそれを選択する
（※ 表示されない場合はiPhoneにこのPCを信頼しますか？と出ているので信頼を押す、出ていない場合は認証みたいなボタンを押す）
4. みたいタブを選択する
5. chromeっぽいデバッガーが出るのであとはなんとかする

# Androidで動かない！ and Macがない！
(なんかいいデバッガーあったら教えてください）
## javascriptのalertでデバッグ

```html
<script type="text/javascript">
alert('test');
</script>
```
こんな感じで書くと画面にアラートが出るので、これを使って色々頑張っていく。

例
読み込み時の要素の高さを出したいとき

```html
<script type="text/javascript">
$(function(){
 alert($('.調べたいクラス名').innerHeight);
});
</script>
```

ボタンを押したときに要素の高さを出したいとき

```html
<script type="text/javascript">
$('.ボタンの名前').click(function(){
 alert($('.調べたいクラス名').innerHeight);
});
</script>
```

# 結論
逃げないで頑張ろう
デザインファイルをGit LFSで管理する方法 + コミット時にSketchのファイルを自動書き出し

## git-lfs インストール

```bash
$ brew install git-lfs
```

### 新しいgitリポジトリ作成
もうある場合はやらないで良い

```bash
$ git init
```

### git-lfsで管理したいファイルを追記

```bash
$ git lfs track "*.psd"
$ git lfs track "*.ai"
$ git lfs track "*.sketch"
$ git lfs track "*.png"
$ git lfs track "*.jpg"
```

追記されると`.gitattributes `が作成されてます

```bash
$ cat .gitattributes 
*.psd filter=lfs diff=lfs merge=lfs -text
*.ai filter=lfs diff=lfs merge=lfs -text
*.sketch filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
```

### コミットしてプッシュ

あとは普通のgitと同じようにコミットしてプッシュするだけ
SourceTreeでも普通にできました。


## コミット時にSketchのファイルを自動で画像で書き出してコミットするスクリプト

### sketchtoolインストール

```bash
$ /Applications/Sketch.app/Contents/Resources/sketchtool/install.sh
$ sketchtool -v
sketchtool Version 42 (36781)
```

### sketchtoolで書き出してみる

[sketchtoolの使い方はこちら](http://qiita.com/narikei/items/cc4cf9a649d9a138b1fd)

```bash
$ sketchtool export artboards pc.sketch --output=output/pc
```

### pre-commit.shを作成

管理しやすいように`scripts/`の下に置きます。
これでrootにある、sketchファイルが自動で書き出されるようになる。

```bash:scripts/pre-commit.sh
for filename in *.sketch; do
  sketchtool export artboards $filename --output=output/${filename%.*}
done

git add ./output/.
```

### githookに設定する

さっき作ったスクリプトをgithookの`pre-commit`で実行されるように設定します。

```bash
$ echo 'sh scripts/pre-commit.sh' > .git/hooks/pre-commit
$ chmod +x .git/hooks/pre-commit
```

### 普通にコミット

```bash
$ git commit
Exported 01_top.png
Exported 02_news.png
Exported 03_about.png
Exported 04_contact.png
....
```

```
$ tree
.
├── README.md
├── pc.sketch
├── output
│   ├── pc
│   │   ├── 01_top.png
│   │   ├── 02_news.png
│   │   ├── 03_about.png
│   │   ├── 04_contact.png
```

## おわり

便利。
`git-lfs`と`githook`だけ設定してあげて、SourceTreeでデザイナーさんでも使えそう！
perl : Smart::Optionsで、コマンドライン引数のパース


perl でコマンドラインツールを作る場合の、
コマンドライン引数のパースを便利化してくれる[Smart::Options](http://search.cpan.org/~mikihoshi/Smart-Options-0.056/lib/Smart/Options.pm)のメモです。

# 手抜きパターン

```perl:p1.pl
my $args    = Smart::Options->new->parse;
warn Dumper($args);
```

結果

```perl
$ perl p1.pl --arg1 111 --arg2 222 --arg3 333a --arg3 333b --flag 
$VAR1 = {
          '_' => [],
          'arg1' => '111',
          'arg2' => '222',
          'arg3' => [
                      '333a',
                      '333b'
                    ],
          'flag' => 1
        };
```

もっと簡略化すると

```perl:p2.pl
my $args = argv;
warn Dumper($args);
```

```perl
$ perl p2.pl   --arg1 111 --arg2 222 --arg3 333a --arg3 333b --flag
$VAR1 = {
          '_' => [],
          'arg1' => '111',
          'arg2' => '222',
          'arg3' => [
                      '333a',
                      '333b'
                    ],
          'flag' => 1
        };
```

# ちゃんとやる場合

```perl:p3.pl
my $args = opts()->parse(@ARGV);
warn Dumper($args);

sub opts {
    return
    Smart::Options->new->options(
        arg1    => {describe    => "arg1 description", demand  => "arg1"}, # demand  => arg_name
        arg2    => {describe    => "arg2 description", alias   => "a2"},   # alias   => alias_name
        arg3    => {describe    => "arg3 description", default => "ARG3"}, # default => default_value
        bool    => {describe    => "boolean option"  , boolean => "bool"}, # boolean => arg_name
        int     => {describe    => "Integer option"  , type    => "Int"},  # type    => type_name (Bool, Str, Int, Num, ArrayRef, HashRef, Config)
    );
}
```

結果

```perl
$ perl p3.pl
Usage: p3.pl

Options:
  --a2, --arg2  Arg2 description
  --arg1        Arg1 description             [required]
  --arg3        Arg3 description                         [default: ARG3]
  --bool        Boolean option    [boolean]
  -h, --help    Show help
  --int         Integer option


Missing required arguments: arg1
Died at ...


$ perl p3.pl  --arg1 111 -a2 222  --bool 100  --int 999
$VAR1 = {
          '_' => [
                   '100'
                 ],
          'a2' => '222',
          'arg1' => '111',
          'arg3' => 'ARG3',
          'bool' => 1,
          'int' => '999'
        };

$ perl p3.pl  --arg1 111 --arg3 OVERWRITE   --bool 0
$VAR1 = {
          '_' => [
                   '0'
                 ],
          'arg1' => '111',
          'arg3' => 'OVERWRITE',
          'bool' => 1  # 0にはならないようだ
        };
        
$ perl p3.pl --arg1 111  --int string
Value 'string' invalid for option int(Int)
```
DB2DBA: DB2の日付操作でプレミアムフライデー判定

```sql
SELECT
    CASE
        WHEN
            dayofweek(current date) = 6     -- Sun=1,Mon=2...
            AND month(current date + 7 day) <> month(current date)
            THEN 'PREMIUM FRIDAY!'
        ELSE NULL
    END
FROM
    sysibm.sysdummy1
```

# 参考資料
- developerWorks 日本語版
    - [DB2の基礎: 日付と時刻で遊ぶ](http://www.ibm.com/developerworks/jp/data/library/dataserver/techdoc/daytime.html)
TOPPERS/EV3RTでEV3の超音波センサーを使ってみる

TOPPERS/EV3RT環境でC言語を使って、EV3基本セット付属の超音波センサーを使ってみます。[環境開発の記事はこちら](http://qiita.com/tkzw102/items/93dd959cccf2efc8d4a6)

#EV3超音波センサーの特徴

EV3超音波センサーは、センサーから3cm~250cmの間にある物体までの距離を、誤差±1cmで計測してくれます。

![Usonic-sensor.png](https://qiita-image-store.s3.amazonaws.com/0/152243/e6b28ace-eb3a-fb23-4da3-1d4965778923.png)

これが超音波センサーです。使用中は正面の目玉のようなパーツが赤色に発光します。
このセンサーは、正面から向かって左側から超音波を発信し、右側で超音波を受信します。
左側から発信された超音波が物体に反射して、戻ってきたものを右側で受信して距離を測定しているのです。
そのため、**もし他に超音波を発信している物があり、その超音波を受信してしまうと、距離が正しく計測できません。**

また、このセンサーは超音波の受信機能のみの利用が可能になっています。
この機能を使えば、開けた場所でゴール地点に超音波発振器を設置し、そこに向かって進むロボットとかも作れそうですね。

今回は、物体までの距離を測って表示するだけのアプリ(sonic-test)を作成しようと思います。
#超音波センサーと本体の接続

![connect.png](https://qiita-image-store.s3.amazonaws.com/0/152243/d09e915f-6c22-8a6a-59b8-3be27aa757e5.png)

上の画像のように接続しました。センサーポート1に超音波センサーをつなぎます。
今回はLCDと超音波センサーがあればアプリを作れるので、他のセンサーやモーターは必要ありません。

#ソースコード

以下ソースコードになります。センサーとセンサーポートを接続した後無限ループに入り、LCDに測定距離を表示し続けます。

```app.c

/**
 ******************************************************************************
 ** ファイル名   : app.c
 ** 説明       : 距離を測定する 
 ******************************************************************************
 **/

#include "ev3api.h"
#include "app.h"
#include "stdlib.h"

#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif

#define DEBUG

#ifdef DEBUG
#define _debug(x) (x)
#else
#define _debug(x)
#endif


/* センサーの設定 */
static const sensor_port_t
    ultrasonic_sensor = EV3_PORT_1;

/* メインタスク */
void main_task(intptr_t unused)
{
    /* 反射光値格納用の変数 */
    static int distance = 0;
    char distance_buffer[30];

    /* ループに入る前にセンサーとセンサーポートを接続する */
    ev3_sensor_config (ultrasonic_sensor, ULTRASONIC_SENSOR);
    //ev3_lcd_set_font (EV3_FONT_MEDIUM);
    /* 接続が完了したら合図として本体LEDをオレンジ色に変える */
    ev3_led_set_color(LED_ORANGE); 

    /* ループの中に入る */
    while(1)
    {   /* 距離を測定して表示し続ける */
        /* 反射値を測って変数に格納 */
        distance = ev3_ultrasonic_sensor_get_distance(ultrasonic_sensor);
        /* 文字配列に読み取った値を格納する */
        sprintf(distance_buffer, "DISTANCE:%d   ",distance);
        /* 正面ディスプレイに文字配列の中身を描写させる */
        ev3_lcd_draw_string(distance_buffer, 0,10);
    	
    }
    ext_tsk();
}

```
#動作確認

![distance-test.png](https://qiita-image-store.s3.amazonaws.com/0/152243/45853732-1523-8d1d-19e1-aba73cef5950.png)

こんな感じで、測定対象とセンサーの間をメジャーで測定しました。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/152243/fb0955f0-2088-bfa1-7630-613fea94cf7d.png)

精度はかなりいいみたいです。
UIButtonの画像をUIButtonに対してAspectFitする方法

UIButtonに表示させる画像にcontentModeを設定する時、思い通りにいかない人が多いと思うのですが、色々調べていくうちにようやく正解がみえたので共有したいと思います。コードはSwift3ですがSwift2以前でも適切に変更してやれば動きます。

## どうやってボタンにAspectFitを設定するか

UIButtonへのcontentModeの設定、これに関してはいろんな人が書いていて

```swift
btn.imageView?.contentMode = .scaleAspectFit
```

のように書けばもちろんUIButtonの中に入っているImageViewに対してAspectFitになります。ですがこれはあくまで**UIButtonの中に入っているImageViewに対して**というところに注意しなければなりません。もちろんこれで上手くいくこともありますが、AutoLayoutなどで引き伸ばした時に思っていたサイズよりかなり小さくなるケースがあります。

この原因はUIButtonという親クラスに対して中のUIImageViewのサイズ指定が適切に働いていないことが原因です。つまりUIButtonは大きくなっているのに、中のImageViewが小さいままということがおきてしまうのです。



これを避けるためには`contentHorizontalAlignment`と`contentVerticalAlignment`というプロパティを設定します。

以上まとめるとUIButtonに画像をめいっぱいアスペクト比を保ったまま表示するには以下の三行が必要になります。

```swift
btn.imageView?.contentMode = .scaleAspectFit
btn.contentHorizontalAlignment = .fill
btn.contentVerticalAlignment = .fill
```

これを盛り込んだ自作クラスとして予め`@IBDesignable`などを作っておくといいかもしれませんね。
JavaScriptでプレミアムフライデー（月末最終金曜日）の日付を取得してみた

せっかくプレミアムフライデーなので。

# 月末最終金曜日の日付を取得する

第4週・5週の金曜日が月末をオーバーしてるかをチェックして判定してみました。

```js
function get_premium_friday(year, month) {
	month -= 1;
	var date = new Date(year, month, 1);
	var weekday = date.getDay();
	
	var day_4week = new Date(year, month, 7*3 + 6 - weekday);
	var day_5week = new Date(year, month, 7*4 + 6 - weekday);
	var end_of_month = new Date(year, month + 1, 0);
	
	return (day_5week > end_of_month ? day_4week : day_5week);
}
```

# 実行と結果

```js
for (var i = 1 ; i <= 12 ; i++) {
	console.log(get_premium_friday(2017, i));
}

/*
Fri Jan 27 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Feb 24 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Mar 31 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Apr 28 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri May 26 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Jun 30 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Jul 28 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Aug 25 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Sep 29 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Oct 27 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Nov 24 2017 00:00:00 GMT+0900 (東京 (標準時))
Fri Dec 29 2017 00:00:00 GMT+0900 (東京 (標準時))
*/
```
Railsの起動オプションの省略方法【備忘録】

# はじめに

どこかで、Railsの起動オプションの省略方法を調べたのだけども、
調べたサイトがどこかに行ってしまったので、個人的なメモを残す感じで

ちなみにRailsのバージョンは4.2.7.1です。

# 起動オプションの省略

普段は下記のようなコマンドうっています。。。がオプションつけるのめんどくさい
（ポートはあまり変えませんが...)
`bundle exec rails s -b 0.0.0.0 -p 3001`

そんなわけで、"Railsアプリ名"/config/boot.rbをいじります。

```ruby:boot.rb
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

require 'bundler/setup' # Set up gems listed in the Gemfile.

# ここから追加する
require 'rails/commands/server'
module Rails
    class Server
        def default_options
            super.merge(Host: '0.0.0.0', Port: 3001)
        end
    end
end
# 追加ここまで
```

すると`bundle exec rails s`を入力するだけで下記のようにRailsのサーバーが起動します。

```
PS C:\hogehoge\demo-app> bundle exec rails s
=> Booting WEBrick
=> Rails 4.2.7.1 application starting in development on http://0.0.0.0:3001
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2017-02-24 19:17:50] INFO  WEBrick 1.3.1
[2017-02-24 19:17:50] INFO  ruby 2.0.0 (2015-12-16) [x64-mingw32]
[2017-02-24 19:17:50] INFO  WEBrick::HTTPServer#start: pid=45224 port=3001
```

もう忘れないようにしないと...
毎月最終金曜（プレミアムフライデー）だったら実行するシェルスクリプト

## 背景
今日は、プレミアムフライデーらしいです。
https://premium-friday.go.jp/
そんなことはお構いなく仕事していますが、プレミアムフライデーのみ動作するスクリプトを書いてみます。

## 環境
* CentOS
* bash

## スクリプト
```bash:premiumfriday.sh
#!/bin/bash
export LANG=C

# 実行曜日　以下のいずれかを指定
# Sun, Mon, Tue, Wed, Thu, Fri, Sat
DAY_OF_WEEK=Fri

# 曜日チェック
now_date=`date +%a`
if [ "x$DAY_OF_WEEK" != "x$now_date" ]; then
	# 金曜ではありません。残念。
	exit 1
fi

# +7日して、翌月になったら、最終週
now_month=`date +%m`
next_week_month=`date +%m --date '7 days'`
if [ "x$now_month" == "x$next_week_month" ]; then
	# 金曜だけど最終週ではないので終了。残念。
	exit 1
fi

# プレミアムフライデーだ！
echo "Hayaku Kaere!!"
exit 0
```

## 解説
解説するほどではないですね。もう少しスマートにできるとは思うのですが・・・

## あとがき
来月は早く帰るぞ！
ファイル名・容量・タイムスタンプ・パーミッションなどをタブ区切りで出力する


まだまだエクセル全盛期なシステム業界。

複数ファイルをデプロイ依頼するにも
いちいち１ファイルごとに
容量・タイムスタンプ・パーミッションを書かされるのが
ぼくの現場です。

今日は３００ファイルくらい申請する必要があります。

先輩に聞いたら
「右クリックでプロパティでサイズと更新日は分かるよ」と
真顔で言われました。

さすがにやってられないのでbashの練習がてら
Shellで組んで見ることにしました。

# ファイルをリストアップする

find か ls -lR　か　tree　が候補にあがると思います。

この後一覧を加工したりするので
一番素直に出力される find を採用することにしました。

```bash
find . -type f
```


# 日付の形式を指定してlistする
なんか、日付のフォーマットが
自分の開発環境だと英語表記だったので
フォーマットを指定します。

```bash
ls -l --time-style=+'%Y-%m-%d_%H:%M:%S'
```

# 複数スペースを１スペースに変換する
ls -l コマンドでは、半角スペース埋めで整形されて出力されます。
そのままだと扱いづらいので、この変換をかませます。

```bash
sed -i -e 's/\s\+/ /g' list.txt
```
※なぜか　's/ +/ /g'では上手くいきませんでした。

# ファイル名でソートする
findは基本的にソートしてくれないので、sortコマンドで
別途ソートして上げる必要があります。
7番目の要素でソートするようにすればファイル名でソートになります。

```bash
sort -k7
```


# 半角スペースをタブに変換する
```bash
sed -i -e 's/ /\t/g' list.txt
```

これでようやく３００ファイルをいちいち
右クリックする必要がなくなりました。

やったね。

・・・

SubversionかGitか
何かある世界に生まれたかったです。。。
「Google Cloudではじめるデザイナ/プログラマのためのDocker実践入門」に参加したのでメモ

## 資料
https://docs.com/asashiho/6721/gcpdocker
http://qiita.com/Dr_ASA/items/e13aecc331e0e920f7ea

## 感想とメモ
- GCPは最近業務でつかっていて、Dockerはちょっとさわったことあって、GKE運用にしたほうがいいよって言われるけどよくわかってなかったので参加した
- 資料がとてもわかりやすくて、2時間でほんとにコンテナのクラスタ構築できた
- ざっくりとGKEの雰囲気つかめて満足
- コンテナのライブアップデートもあっさりできて、便利だなぁと実感。コンテナ運用してみたくなった。
- 資料では ` kubectl edit deployment/web-container ` でデプロイ用の設定yamlを編集したけど、実際の運用ではちゃんとdeployment.yamlを編集してバージョン管理したくなりそう。質問してみたら、実運用ではdeployment.yamlはバージョン管理するべきとのことでした。
- Dockerのイメージのレイヤ構造についてはこちらを参照とのこと
  - http://enakai00.hatenablog.com/entry/20140802/1406958412
- 運営の皆様ありがとうございました
「mvnプロジェクト作成」から「GitLabにリモートリポジトリを作成」して「git init」まで

先輩に教えていただいたので備忘録。

#※※前提※※
- GitLabにログインできる事
- 以下の条件でプロジェクトを作る
    - グループ名：xxx
    - プロジェクト名：hoge
    - フレームワーク：Spring


#始めるよ！！！


##1. ローカルにmvnプロジェクトを作成
```sh
# 適当に移動する
cd hoge

# 以下のコマンドで、mvnプロジェクトを作成
mvn archetype:generate
```

こうすると色々聞かれるので、答えていく。

####①`Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 932:`
- **「spring」**と入力
    - ( **「932個のテンプレートがあるけどどれ使う？」**と聞かれてるので、**「多過ぎるからspringだけに絞って」**と応えているイメージ )

####②`Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): :`
- **番号**を入力
    - ( 以下のような感じで大量にテンプレートが表示されるので、適切なモノを選んで、一番左にある数字を入力するイメージ )
    - ( ex: 115: remote -> org.springframework.boot:spring-boot-sample-web-static-archetype (Spring Boot Web Static Sample )

####③`Define value for property 'groupId':`
- **「xxx」**と入力
    - ( **「どのグループに属してるの？」**みたいな感じで聞かれてるので、**「xxxだよー」**と応えているイメージ )

####④`Define value for property 'artifactId':`
- **「hoge」**と入力
    - ( **「どんな成果物(プロジェクト)作るの？」**って聞かれてるので、**「hogeだよー」**応えているイメージ )

####⑤`Define value for property 'version' 1.0-SNAPSHOT: :`
- **何も入力せず**Enter
    - ( よく分からんけど()、デフォルトのままでOK )

####⑥`Define value for property 'package' sapri: :`
- **何も入力せず**Enter
    - ( よく分からんけど()、デフォルトのままでOK )

####⑦`Y: :`
- **「Y」**と入力
    - ( **「これでいい？」**って聞かれてるので、**「いいよ！」**って応えてあげているイメージ )


##2. GitLabにプロジェクトを追加
- ブラウザを開き、**GitLab**にログイン
- トップ画面の右上にある**「New Project」**を選択
- 以下を設定
    - **「Project Name」**：プロジェクト名
    - **「Visibility Level」**：Private
- **「Create Project」**を選択

##3. 3で作成したプロジェクトにユーザを追加
- 3で作成したプロジェクトに移動
- 右上にある**「歯車」から「Members」**を選択
- **デフォルト値が「Guest」となっているドロップダウン**があるので、「Master」に変更
- **プレースホルダに「Search for a user」と入っているテキストボックス**があるので、追加したいユーザを入力
- **「Add to project」**を選択

##4. GitLabにプロジェクトをinit
```sh
cd hoge
git init
git add .
git commit -m "気の利いた格好いいコメント"
git push -u origin master
```

上記のコマンドで、2のプロジェクトを、3のGitLabに反映する



以上。
C4D起動時に"コンピューターにlibmmd.dllがないため~"というエラーが発生した場合の対処法

日本語での対処法がなかったのでとりあえず置いときます。

>コンピューターにlibmmd.dllがないため、プログラムを開始出来ません。この問題を解決するには、プログラムを再インストールしてみて下さい。

C4D起動時にこういうエラーが出た場合、
C:\Program Files\MAXON\CINEMA 4D\resource\libs\win64
中にある"libmmd.dll"をコピー。

次にC:\Windows\System32にペースト。

自分はこれで起動できました。
RecyclerViewのItemDecorationでStickyHeaderをつくってみた


# ItemDecorationサイッキョ

普通はどうやって実現するのか知りませんが、去年のDroidKaigiでItemDecorationで実現できるよ！と外国の方が言っていたので、ItemDecorationでやってみました！


# サンプル

https://github.com/ushi3/ExampleGroupLabel

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/40926/ff4cb079-fcdf-f0c2-4593-a929fb707d44.gif)

# 課題

## LayoutManagerの制限

`LinearLayout`かつ`vertical`かつ`reversedでない`状態でしか動作確認してないです。

## onDrawOverの描画がスクロールバーよりあとになる

`onDrawOver()`は`RecyclerView.draw()`内で呼び出されますが、`super.draw()`よりもあとの描画になります。
`super.draw()`ではスクロールバーの描画処理が行われており、そのあとのdrawは必然的にスクロールバーの上に描画されてしまいます。

これを実装で解決しようとするとものすごい労力がかかる(`onDraw()`と`onDrawOver()`を使い分けたり？)ので、 `onDrawOver()`のコールタイミング修正してくれないかなーって感じです。
Ranche Server のロードバランサーで http から https にリダイレクトをかける


web ページの https 化にあたり，Rancher Server のロードバランサの設定をしようとしたが，リダイレクト設定が無くて迷ってので書き残しておく

結論から言うとバックエンドの名前を振ってカスタム設定でリダイレクトをかけてやるとよい

## リクエストのフロー

`him0-web:80` を Web サーバをホストするコンテナだとする

素直に HTTPS でリクエストが来たとき

パブリック HTTPS `him0.net:443` -> `him0-web:80`

HTTP でリクエストが来たとき

パブリック HTTP `him0.net:80` -> http-frontend -> リダイレクト(301) -> HTTPS `him0.net:443` -> `him0-web:80`

## 設定

![振り分け設定](https://qiita-image-store.s3.amazonaws.com/0/69007/e9cc5d4b-0eca-6673-76e2-97a128a68146.png)


![リダイレクトの設定](https://qiita-image-store.s3.amazonaws.com/0/69007/b3cc8272-7256-1ff3-ce38-a2cb35452bf0.png)

こんな感じで設定すると良さげ

## 参考

https://github.com/rancher/rancher/issues/3505
AbstractThreadedSyncAdapter の SyncResult を使って正しくデータ同期のバックオフを動かす

# 概要

Android には SyncAdapter というデータの同期のためのフレームワークがあります。このフレームワークにのっかることで、通信環境やサーバの状態に応じた適切なデータ同期タイミングの調整、リトライのバックオフをシステムがやってくれます。そのためアプリ側の実装では、どのデータをどのように同期するかというロジックに集中することができます。

必要なものとしては`Account`と`ContentProvider`、`Service`そして`AbstractThreadedSyncAdapter`の4つです。`ContentProvider`は空実装でも問題ありません。また`Account`もダミーのもので構いません。いちばん大事なのは`AbstractThreadedSyncAdapter`を継承して作る「どのデータをどのように同期するか」という部分です。

# `onPerformSync`メソッドの`SyncResult`

Android システムは、いい感じのタイミングを見計らって、有効な`AbstractThreadedSyncAdapter`の`onPerformSync`メソッドをバックグラウンドスレッドから呼び出してくれます。ここで同期したいデータを取り出し、適切な手順でサーバ(クラウド)とデータを同期します。

何もなければメソッドは正常に戻り、アプリがなすべき同期のフローは終わりです。ただし、通信の状況やサーバの状況によっては、うまくデータが同期できないことも考えられます。そのようなときのために、`onPerformSync`メソッドには[`SyncResult`](https://developer.android.com/reference/android/content/SyncResult.html)というオブジェクトが渡されます。

Android Developers のリファレンスによると

> This class is used to communicate the results of a sync operation to the SyncManager. Based on the values here the SyncManager will determine the disposition of the sync and whether or not a new sync operation needs to be scheduled in the future.

とあり、Android システムがデータの同期のスケジューリングについて`SyncResult`の内容を見て判断してくれることが分かります。

# `SyncResult.stats`

`SyncResult`のリファレンスには各々のフィールドについて、システムが無視するものと使うもの、参考程度にするものとがあると書いてあります。
このうち、システムが同期のスケジューリングのときに使う大事な情報をもつものは`stats`フィールドです。このフィールドは[`SyncStats`](https://developer.android.com/reference/android/content/SyncStats.html)という型で、何件のデータを同期したか、何件のデータが挿入・上書き・削除・されたか、また何件のIOException/ParseException/AuthExceptionがあったかを記録します。

名前からもわかるとおり、何かしらの理由で同期に失敗した場合には、IOException/ParseException/AuthExceptionの件数をインクリメントすることで、システムにスケジューリングを促すことになります。

# ソフトエラーとハードエラー

同期の失敗理由にはいくつかの種類があるはずです。通信が貧弱でうまくデータがやりとりできなかった場合、サーバが障害等でレスポンスできなかった場合、あるいは、アプリ側の不良が理由で同期に失敗することもありえます。

通信環境による失敗は`ソフトエラー`としてシステムが記録し、近い未来に同期を再実行するようスケジューリングします。これが何度も続いた場合にはエクスポネンシャルバックオフと呼ばれる方法で、スケジューリングの感覚が徐々に長くなっていきます。

一方で、サーバの障害やアプリの不良、または不正なデータはすぐには改善する見込みが無いため`ハードエラー`としてシステムが記録します。このハードエラーが何度も続くと、システムは同期のスケジューリングを諦めます。

# `SyncResult`をちゃんと記録しないとどうなるか

`SyncResult`に対して同期のフローで何が起きたかを記録しない場合、システムは同期が正常に終了したものとみなします。`onPerformSync`メソッドに`throws`シグネチャはないので、自分で適切に例外をハンドリングし`SyncResult`にエラーを記録する必要があります。仮になにもしないと、たとえ何らかの失敗があってもシステムはスケジューリングをし続ける事になります。

```
君がッ 泣いても 殴るのをやめないッ！
```

記録のとりかたについては、GoogleSamples にちょうどよいプロジェクトが公開されています。

https://github.com/googlesamples/android-BasicSyncAdapter/blob/master/Application/src/main/java/com/example/android/basicsyncadapter/SyncAdapter.java

# 余談:`ContentProviderClient`は何だ

`onPerformSync`メソッドには`SyncResult`以外にも`ContentProviderClient`も渡されます。
これは`ContentResolver`のように`ContentProvider`にクエリを投げたりデータを挿入したりするために使います。これらの違いなどについては、[このブログ記事](http://yuki312.blogspot.jp/2012/07/androidcontentresolvercontentprovidercl.html)に詳しく解説されていますが、`AbstractThreadedSyncAdapter`においては`ContentProviderClient#release()`は`onPerformSync`から戻ってきたときに呼び出してくれるようです。
ActionCableにRubyのWebSocketクライアントで接続してみる

[Rails 5 + ActionCableで作る！シンプルなチャットアプリ（DHH氏のデモ動画より） - Qiita](http://qiita.com/jnchito/items/aec75fab42804287d71b)でできるチャットサーバにWebSocketクライアントで接続したかったのでひとまずRubyでやってみた。
よく内容を理解しないまま出来てしまったがとりあえずメモしておく。

## 参照サイト

[ActionCableをwebsocket APIとして使ってUnityと通信する - Qiita](http://qiita.com/wakaba260/items/b23721d5cfd73cd47ada)
[ruby on rails - Connecting to ActionCable from iOS app - Stack Overflow](http://stackoverflow.com/questions/35145429/connecting-to-actioncable-from-ios-app)

## とりあえずできた

```rb
require 'websocket-client-simple'
require 'json'

ws = WebSocket::Client::Simple.connect 'ws://localhost:3000/cable'

ws.on :message do |msg|
  puts msg.data
end

ws.on :open do
  id = { channel: 'RoomChannel' }
  # channel参加(on :messageでメッセージを受け取れるように)
  ws.send({ command: 'subscribe', identifier: {channel:'RoomChannel'}.to_json}.to_json)
  # channel参加完了前にメッセージを送るとエラーとなるのでとりあえず
  sleep 1
  # メッセージ送信              
  ws.send({ command: 'message', data: {message: 'hogemogeaa2', action: 'speak'}.to_json, identifier: {channel:'RoomChannel'}.to_json}.to_json)
end

ws.on :close do |e|
  exit 1
end

loop do
  ws.send STDIN.gets.strip
end
```
VagrantでVirtualBox上でMySQLを起動しようとしたら起動できないって怒られた件

#前提
Windowsでvagrantfileを設定しています。
ローカルの開発環境を作ることが楽になるように試行錯誤中です。

#Vagrantfile

```
  config.vm.provision "shell", inline: <<-SHELL
    rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
    yum -y install mysql-community-server
    mysqld --no-defaults --log-error-verbosity=3 --initialize-insecure
    service mysqld start
SHELL
```

て書いたのに起動しなかったなぜだ？ログ調査だ！

```
less /var/log/mysqld.log
（前略）
0000-00-00T00:00:00.000000Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
（後略）
```

ん！？ファイルパーミッションがおかしいだと。。
たしかに確認すると所有者はrootで権限は

```
-rw-r-----.  1 root root 12582912 Mon 00 00:00 ibdata1
```

だったらこうだ!!

```
  config.vm.provision "shell", inline: <<-SHELL
    rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
    yum -y install mysql-community-server
    mysqld --no-defaults --log-error-verbosity=3 --initialize-insecure
    chown -R mysql:mysql /var/lib/mysql/*
    service mysqld start
SHELL
```


はいー無事起動ー。

#あとがき
chefって何？美味しいの？
Goでsql.NullStringを含む構造体をjson.Marshalする方法

### Goでsql.NullStringを含む構造体をjson.Marshalする方法

以下を参考にしたがうまくできなかったので、変更点を記載。

参考
http://okamuuu.hatenablog.com/entry/2016/12/20/150339

以下の構造体 `A` があったとします

```go
type A struct {
   ID    int             `json:"id"`
   Title string          `json:"title"`
   Desc  sql.NullString  `json:"desc"`
}
```

`sql.NullString` を使うケースとしては、 `NULLを許容` するときです。

で、これを `json.Marshal` すると、
`"desc" : { "String" : "", "Valid" : false }`
という感じになってしまいます。

`json.Marshal` のソースを見ると、 `MarshalJSON()` というinterfaceを持っていれば、
それを実行するというふうになっています。

`sql.NullString` は、`MarshalJSON()` を持たないので、
以下のようにカスタムで `NullString`　と言う感じの構造体を作って、それを定義してあげます。

```go
type NullString struct {
	sql.NullString
}
```

```go
func (s NullString) MarshalJSON() ([]byte, error) {
	return json.Marshal(s.String)
}

func (s *NullString) UnmarshalJSON(data []byte) error {
	var str string
	if err := json.Unmarshal(data, &str); err != nil {
		return err
	}
	s.String = str
	s.Valid = str != ""
	return nil
}
```

それで、今回のポイントは１つで、
`func (s NullString) MarshalJSON()` この部分です。

参考にした記事とかでは、
`func (s *NullString) MarshalJSON()`
というふうになっていて、すなわち、レシーバーがポインタになっているわけです。

このとき、jsonにしたい構造体で、
`[]NullString` というslice型の場合は、ちゃんと `MarshalJSON`を実行してくれますが、
`NullString` という通常の型の場合は、実行してくれません。

自分は、ここで躓きました。。

で、結局正しいのはなにかというと、
Marshalする場合は、レシーバーをポインタにしない
`func (s NullString) MarshalJSON()` で正しく動きます。

## 以上！
中の人による Rescale のまとめ (個人的まとめ)


下記項目でまとめています。

- Hands-on 資料
- Rescale API/CLI
- Tips


Hands-on 資料
=================

### OpenFOAM
 
[[Rescale Hands-on] OpenFOAMをRescale上で動かしてみよう！](http://qiita.com/daikumatan/items/46f018b1d6f4d221a32a)

- 基本的なジョブの投入方法とパラメータスタディー機能が学べます。

	
[SaaS型HPC "Rescale" の実力とやらをちょっと見てみた](http://blog.serverworks.co.jp/tech/2016/11/08/rescale-openfoam-tutorial/)

- Serverworksの白鳥さんのブログです。長尾が書いた上記記事よりわかりやすい。

### STAR-CCM+

[STAR-CCM+ on Rescale ハンズオン@AWSJ Jan 27th, 2017](http://qiita.com/daikumatan/items/5b1f9b9cd930fe52ddb5)

- AWSさん、Siemens(旧CD-Adapco)さん、ISIDさんと一緒に行った[クラウドCAEフェスティバル](https://www.google.co.jp/webhp?sourceid=chrome-instant&rlz=1C5CHFA_enJP698JP699&ion=1&espv=2&ie=UTF-8#q=CAE+AWS+STARCCM+RESCALE&*)のハンズオン資料です。
- パラメータスタディー機能を紹介しています。


[[Rescale] 過去のジョブ/共有されたジョブ を "クローン" して簡単に新規ジョブを実行する(STAR-CCM+編)](http://qiita.com/daikumatan/private/7807cf1605e0bac2f479)

- 誰かが作ったワークフローを利用して自分の計算を流す方法を解説しています

### LS-DYNA

[[LS-DYNA on Rescale] Hands-on 資料](http://qiita.com/daikumatan/private/86bbc5a3b90c930180ad)

- かなり丁寧に書きました。Remote Desktop を使うところまで書いています。
- Rescaleの基本的な操作方法はこれで十分に学べます。


### ANSYS Fluent

[[ANSYS on Rescale] Hands-on 資料](http://qiita.com/daikumatan/private/6f3ca0fd17899ff5d08d)

### Cradle STREAM

[[Rescale ハンズ・オン] STREAM on Rescale によるパラメータスタディー](http://qiita.com/daikumatan/private/4a388f925929fb31c66c)

- 書きかけですが、参考までに公開します。
- パラメータスタディー機能を学べます

Rescale API/CLI
===============

### Rescale CLI

[Rescale CLI 日本語マニュアル](http://qiita.com/daikumatan/items/fe416b7e29181a080e8b)

- 英語の資料を Google Transferに食わせました。

[Rescale CLI Hands-on](http://qiita.com/daikumatan/private/528cc84af1519cd46c23)

- より実践的に。最低限必要なエッセンスのみ

### Rescale API

[RescaleAPI Hands-on (ver 2017/02/13)](http://qiita.com/daikumatan/items/788c51091eda5cacb67e)

- かなり丁寧に書いています。ひとと通りのAPIが学べます。 




Tips
================

- [[Rescale] アプリケーションがうまく動かなかったときの対処法](http://qiita.com/daikumatan/private/c7a668cfda2baf6f18ac)
- [Rescale API Key の作成](http://qiita.com/daikumatan/private/5d33f0a9c0030bfd7743)
[Linux/Windows/Mac] hostsに設定を追加する

hostsの変更手順メモ

# 変更例
IPのあとにホスト名を記載する

```
127.0.0.1       localhost
```

# Windows
## Windows7

以下を管理者権限のあるエディタで修正

```
C:\Windows\System32\drivers\etc\hosts
```

# Linux
root権限をつけて以下を編集

```
/etc/hosts
```

# Mac
`sudo` で以下のいずれかを編集（`/private/etc/hosts`は`/etc/hosts`のリンク）

```
/private/etc/hosts
/etc/hosts
```

[Macでhostsファイルを変更・反映 - Qiita](http://qiita.com/junker919/items/cc15653a681e2dcd79ea)
sedコマンドで文字列編集


sedについて基本的なことも含めてメモとして書いていきます。
awkでもできます(やり方知らないけど)。でもsedです。

環境はMac OS X 10.9.5 bashです。

**見直してみたらex1.shとex2.shの名用が間違えていました。**
**sedの終わりのsingle quoteの前に必要な"g"が抜けていました(2017.5.15)** 

###複数の空白を消す
とりあえず、`ls -l`と打ってみてください。
空白を多数使うことで、きれいに整列されています。

それでは、この中の時刻の部分だけ取り出したかったらどうしましょうか。`cut`を使用するか、`awk`を使用するか。
`awk`を知っている人は解けるけど、知らない人はちょっと頭をひねらないとなかなか出てこないのではないでしょうか。

`sed`+`cut`を使った解決方法は次の通り

```bash:ex1.sh
ls -l | sed -e 's/ \{2,\}/ /g' | cut -d " " -f8
```

画面に時刻は出てきたかと思います。
`\{2,\}`の部分は、記してある前の文字(ここでは半角空白)が2つ以上並んでいる場所を探してくることを意味しています。
なのでこの中括弧のなかの数字を3にすると、全然違う物が画面に表示されます。

```bash:ex2.sh
ls -l | sed -e 's/ \{3,\}/ /g' | cut -d " " -f8
```
apache solrを動かしてみる。

まずはここを見て、solrをインストール、wikipediaのデータを入れる。
- SolrにWikipediaのデータを入れて遊ぶ
　http://www.mwsoft.jp/programming/munou/wikipedia_solr.html

どうも上記の内容が古いようで、v6.4.1のsolrのjarではsolrserverのパッケージが見つからない。
あきらめて、本家のチュートリアルを読む。
http://lucene.apache.org/solr/quickstart.html
とりあえず、付属のdocsフォルダのindexをgettingstartedとして作るところまでは完了。

次に下記のページを読んで、ajax-solrを使って、gettingstartedのフロントエンドを作成。
- ajax-solrのページ
https://github.com/evolvingweb/ajax-solr/wiki
とりあえず、一覧とページネーションは出せた。
<img width="1075" alt="スクリーンショット 2017-03-06 8.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/90251/3d1c9654-2f8a-6625-7c0d-06f4554561ef.png">

次はタグクラウド。。

https://cwiki.apache.org/confluence/display/solr/Using+SolrJ

- apache solrのページ
http://lucene.apache.org/solr/
- ajax-solrのチュートリアル
https://www.slideshare.net/netseven/apache-solr-ajax-solr
- blacklightのページ
https://github.com/projectblacklight/blacklight
- word2vecの紹介
https://deepage.net/bigdata/machine_learning/2016/09/02/word2vec_power_of_word_vector.html
- word2vecの日本語学習モデル
http://aial.shiroyagi.co.jp/2017/02/japanese-word2vec-model-builder/
UIRefreshControlのイベント内でUIAlertControllerを使ってメッセージを表示すると更新画像が表示されている領域が閉じなくなる

表題の通りの問題。
半ば諦めていたけども、下記のようにすれば無事に解決。

```
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self
                   action:@selector(onSwipeReloadData:)
         forControlEvents:UIControlEventValueChanged];        
self.myCollectionView.refreshControl = refreshControl;
// データが空でもUIRefreshControlを使えるようにする
self.myCollectionView.alwaysBounceVertical = YES;
```

```
- (void)onSwipeReloadData:(UIRefreshControl *)refreshControl
{
    [refreshControl beginRefreshing];

    *** なんかいろいろ処理 ***

    [self presentViewController:alert animated:YES completion: ^
    {
        // completion内で呼んでやればちゃんと閉じる！
        [refreshControl endRefreshing];
    }];
}
```