OmniAICreator/Qiita-1.07M huggingface dataset:
1時間でNodeアプリケーションをHerokuにデプロイする。

#HerokuでNodeアプリ公開してみた
自分で作ったnodeアプリを公開したいと思いやってみた。ちなみにアプリケーションにはsocket.ioを使ってリアルタイム通信ができるようにした。
githubリポジトリがあり、アプリケーションがデプロイできる状態であることを前提とする。
アプリケーションのコードとherokuのURLは以下。
[githubのURL](https://github.com/hikaru7719/chat_app)
[herokuにデプロイしたアプリケーションのURL](https://young-mesa-49188.herokuapp.com/)
![スクリーンショット (69).png](https://qiita-image-store.s3.amazonaws.com/0/136442/fb8a060f-b53b-f807-4510-5579044f27f6.png)
## まず最初にCLIツールをインストール
これでHerokuにログインするらしい。もしHerokuアカウントがない場合はアカウントを作る。
公式サイトで[インストーラ](https://devcenter.heroku.com/articles/getting-started-with-nodejs#prepare-the-app)があるでのインストール
## ログイン
` heroku login`
コマンドでログインする。 
メールアドレスとパスワードを聞かれるので入力。

## デプロイ先を作る 
`heroku create `コマンドでソースコードをアップする場所を作る。
自分の場合は以下のような出力が出た。
Creating app... done, oung-mesa-49188
https://young-mesa-49188.herokuapp.com/ | https://git.heroku.com/young-mesa-49188.git
この左側のURLがアプリケーションのURLになる。

## アプリケーションのデプロイ
デプロイのコマンドは以下。
` git push heroku master`  
自分の場合はこれをやったらエラー出た。なんでだろう？と思いエラーログを見た。 
logのコマンドは  
` heroku logs --tail`  
みるとアプリケーションに必要なモジュールがインストールされていないとのこと。
## package.json
普通にデプロイするとpackage.jsonのdevDependences に書かれたモジュールが無視される。
そこでdependencesのところにモジュールをすべて記入した。その後もう一度デプロイするとうまくいった。あとから、調べるとdevDependences書かれたモジュールをインストールさせるオプションのコマンドがあった。めんどくさい人はdependencesに記入。  
変更後、実行コマンド
```
git add -u
git commit -m "change package.json"
git push heroku master
```
## ブランチを切っている場合のデプロイ方法
ブランチを切っていると
` git push heroku master`コマンドではうまくいかない。
以下のコマンドの場合うまくいく。
` git push heroku ブランチ名:master`

## デプロイされたアプリケーションを触る
` heroku open`
でアプリケーションのページに遷移する。

## mongodbのaddonを使う

アドオンを使うにはクレジットカードの登録が必要なのでherokuのbillingのところから登録。
登録後
` heroku addons:add mongolab:sandbox`
でmongodbが使えるようになる。ちなみにsandboxは無料。
` heroku config`
でMongoDBのURLが見れるのでコードの設定変更する。自分の場合は以下のように変更。　


```  
var mongoose = require('mongoose');
var mURI='monngodbのURLをここに書く';
mongoose.connect(mURI,function(err){
  if(err){
    console.log(err);
  }
});
・・・・
```


## socket.ioを使う
クライアント側のコードが違っていたので自分はつまずいた。ローカルでやるときとは変えなくてはならない。` var socket = io();`に変更しましょう。

``` 
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript">

var socket = io();
・・・
```

## おわり
とりあえずこれでデプロイの方法は終了です。
ものすごく簡単にherokuにデプロイができるのでアプリケーションの公開におすすめ。無料です。
コードをgithubに公開しているのでぜひ見てください。
cocoapodsで入れたライブラリのinfo.plistが見つからない

アプリ開発中突然下記のようなエラーが出ることがあります。

```
... did not have a CFBundleIdentifier in its Info.plist
```

Cleanしても治らない...そんな時は、`alt`を押しながらproduct > clean build Folderをすると治ることがあります。（`alt`を押さないとただのcleanになります）

# 引用元
https://stackoverflow.com/questions/37601925/framework-did-not-have-a-cfbundleidentifier-in-its-info-plist
新しいmacにbrewを使ってnginxをインストールする

macを新調したので、webの環境を整えた時のメモ。
macのバージョンは macOS Sierra バージョン 10.12.3。

# nginx
## brewでnginxをインストール
curlで起動確認しています。localhostに接続すると接続できませんでした。
curl: (52) Empty reply from server

```console
$ brew install nginx

$ nginx -v
nginx version: nginx/1.12.0

$ sudo nginx

$ curl http://127.0.0.1:8080/
```

参考
http://qiita.com/you-me/items/5548424ebe360e5f9dda

## nginxの起動ポートを8080から80番に変更
sudoして実行しないと80番ポートから起動できませんでした。
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

```nginx:/usr/local/etc/nginx/nginx.conf
    server {
        listen       80;
        server_name  localhost;
```

```console
$ sudo nginx -s reload

$ curl http://127.0.0.1/

$ ls -l /usr/local/var/www
```

## nginxの停止
macでnginxはずっと起動し続けないので停止します

```console
$ sudo nginx -s stop
```

参考
http://qiita.com/sygnas/items/34c4c408bf3418b918a7


以上
Java Flight Recorder(JFR)について調べてみた

# いまさらだけど、Java Flight Recordeってなに？

Java Flight Recorde（以下、JFR）とは、一言で言うと、Javaのプロファイラーである。
Java SE Advancedに含まれているモジュールで、本番環境で使用するには商用ライセンスが必要（有償）になるが、開発時は無償で利用できる。

JFRは、Java7からJava SE の実行環境に内蔵されていて、
Java実行環境にすでに収集されているデータを効率よく記録してくれる（らしい）！
また、最新のJava9にも含まれる予定になっている。

JFR以外の有名なJavaプロファイラーは、
jvmmonitor 、JProfiler、JProbe、少し前だと、EclipseのTPTP（Test & Performance Tools Platform）とかあるけど、
有償だったり、開発停止して使えなくなっていたり…。

# JFRはどんな時に使うのか。何ができるのか。

JFRは、アプリケーションをずっと動かしていると、急にマシンが落ちる！とか、このアプリケーション、レスポンスが悪い！とか、メモリリークの調査が必要であったり、アプリケーションの性能向上が必要である場合に使うツールである。

JFRの機能としては、下記に挙げるものがある。

- **プロファイリング**
JFRは継続的に、稼働中のシステムに関するデータを大量に保存する。
このプロファイリング情報には、下記情報などが含まれる。
 - Javaアプリケーションの情報：例外、スレッド、ファイルI/O、ネットワークI/Oなど
 - JavaVMの情報：メモリの割り当て、クラスのロード、JIT、GC、メソッドのサンプリング
 - OSの情報：メモリやCPUの利用情報

- **ブラックボックス分析**
JFRは継続的に情報を循環バッファーに保存するため、異常検出時にこの情報にアクセスすると、その原因が分かる。


# JFRの使い方
## Javaコマンドのオプションで使う
JavaコマンドからJFRを使うには、以下のオプションを指定する。

- 「-XX:+UnlockCommercialFeatures」：商用機能のアンロック
- 「-XX:+FlightRecorder」          ：JFRの有効化
- 「-XX:StartFlightRecording」     ：JFRの記録を開始する

MyAppアプリケーションを実行して、すぐに60秒間の記録を開始し、それをrecording.jfrという名前のファイルに保存する方法

```$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=/tmp/recording.jfr MyApp```

「-XX:StartFlightRecording」のパラメタは下記参照。
[https://docs.oracle.com/cd/E22646_01/doc.40/b61441/optionxx.htm#BABIEFBA](https://docs.oracle.com/cd/E22646_01/doc.40/b61441/optionxx.htm#BABIEFBA)

## jcmdコマンドで使う
jcmdコマンドは、実行中のJavaプロセスのプロファイリングができるコマンドである。
jcmdコマンドから、JFRを使うには、
Javaアプリケーション起動時に「-XX:+UnlockCommercialFeatures」「-XX:+FlightRecorder」オプションが指定されてる必要がある。

プロセス識別子が5368の実行中Javaプロセスで60秒間の記録を開始し、それをrecording.jfrという名前のファイルに保存する方法

```$ jcmd 5368 JFR.start duration=60s filename=/tmp/recording.jfr```

# Java9で変わるところ！

Java9でJFRのUIが大幅に変わって、より使いやすくなるらしい。
JFR APIがサポートされて、レコーダのコントロール、カスタムイベントの生成ができるようになる。

# まとめ

アプリケーションの性能は作り方によって大きく左右されるし、性能劣化の要因の多くは、作り方（作り手）の問題だと思う。


プロファイリングツールを活用し、ボトルネックをうまく見つけ出して修正することができれば、
アプリケーションの性能を劇的に向上させることができる！

より良いモノを開発するために、プロファイリングツールを有効活用してみよう。

JFRは、**開発時は無償で利用できます！**
Ruby の ` メソッド

[ブログ記事](http://secret-garden.hatenablog.com/entry/2015/10/08/000000)からの転載です。

昨日、Ruby の単項演算子について調べていたんですが、``` ` ``` という演算子があったので調べてみました。  
そもそも Ruby の ``` ` ``` は『シェルコマンドを実行する手段』ぐらいしか知らなかったんですが、これって `Kernel` のメソッドだったんですね…。

* [module function Kernel.#`](http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/=60.html)

全然知らなかった…。

## [ ``` ` ``` を再定義する]

```ruby
class X
	def func str
		`#{str}`
	end

	def ` str
		str + str
	end
end

x = X.new
x.send :`, "mami"
# => "mamimami"
x.func "homu"
# => "homuhomu"
```

メソッド名はそのまま ``` ` ``` という名前で定義することができ、引数には ``` ` ``` ないの文字列が渡されます。  
レシーバをつけて呼び出す方法がわからなかったので今回は `#send` とクラス内から直接呼び出しています。  
もしシェルコマンドを実行する場合の ``` ` ``` の挙動を変えたい場合は `Kernel.#`` を再定義すればよさそう。
vi

気付いたら、追加していきます。

## 2018/01/05 検索しつつ移動

- カーソルのある場所から次のスペースまで移動 : f␣
- ◯個先のスペースまで削除 : 3df␣

␣ : スペースを意味します。

参考
https://qiita.com/nyantera/items/4bf29ca6f11bc797a9cb

## 2017/09/07 移動
- 10行上 : 10j
- 10行下 : 10k
- 10文字左 : 10h
- 10文字右 : 10l

※ １０文字右、１０文字左に慣れてくると、単語の文字数やターミナルの文字の幅を把握し、最終的にピンポイント移動が可能になる


## 2017/06/14 置換
- カレント行の１つ目のaaaをbbbに置換する ： `:s/aaa/bbb`
- カレント行の全てのaaaをbbbに置換する ： `:s/aaa/bbb/g`
- 編集中ファイルの全てのaaaをbbbに置換する ： `:%s/aaa/bbb/g`
- 10行目から20行目の全てのaaaをbbbに置換する ： `:10,20s/aaa/bbb/g`

## 2017/06/12 貼り付け
- 複数行を貼り付ける際、autoindentがtrueになっている場合、インデントがどんどん崩れていくのを防ぐ、貼り付けようモード
  - `:set paste`
- 上記のモードを解除
  - `:set nopaste`

## 2017/06/09 矩形選択
- 矩形選択開始 ： ctrl + v
- 行選択 ： shift + v

## 2017/06/08 移動
- 上 ： j
- 下 ： k
- 左 ： h
- 右 ： l
- １行目 ： gg (:0)
- 最終行 ： shitf + g (:$)
- 次単語の先頭へ移動 ： w
- 前単語の先頭へ移動 ： b
- 次スペースの次単語の先頭へ移動 ： shift + w
- 前スペースの次単語の先頭へ移動 ： shift + b

## 2017/06/07 コピーアンドペースト
- 範囲選択（Visualモード） ： v
- ワードコピー ：　範囲選択 -> y
- ペースト ： p
- 行コピー ： yy
git configをプロジェクトによって使い分ける

**Git v2.13.0**（2017/05/10リリース）でgit configに[**Conditional includes**（条件付きインクルード）](https://git-scm.com/docs/git-config#_conditional_includes)という機能が実装され、特定のリポジトリに対して一括でgit configを適用できるようになりました。

会社用と個人用でプロファイルを使い分けたり、たまに使う設定をまとめて適用する場合などに役立ちそうです。

## 設定方法
**`includeIf`**セクションを使います。git configコマンドか、~/.gitconfigを直接編集して追記します。

```
$ git config --global includeIf."<条件>".path "<設定ファイル>"
```

```diff:.gitconfig
+ [includeIf "<条件>"]
+   path = <設定ファイル>
```

- `<条件>`部分には`gitdir:`シンタックスで対象ディレクトリを指定できる。
  - `gitdir:`では標準のglobに加え、`**`で階層をまたいだマッチも可能。
  - `gitdir:~/foo/bar/`のように`/`で終わる場合は、`~/foo/bar/**`と補完され子階層すべてにマッチする。
- `<設定ファイル>`に記述した内容が、該当ポジトリだけに適用される。

より詳しい仕様は[公式ドキュメント](https://git-scm.com/docs/git-config#_conditional_includes)で確認できます。

## 例: 親ディレクトリによってメールアドレスを変える
普段は`myname@example.com`を使っているが、いくつかのプロジェクトには`user@work.com`というメールアドレスでコミットしたい場合を考えます。対象プロジェクトを`work`ディレクトリの下に置き、一括で設定を適用します。

**ディレクトリ:**

```
~/
├── a/
├── b/
└── work/
    ├── x/
    └── y/
```

**設定:**

```ini:.gitconfig
[user]
  email = myname@example.com

...

[includeIf "gitdir:~/work/"]
  path = ~/.gitconfig-work
```

```ini:.gitconfig-work
[user]
  email = user@work.com
```

**確認:**

```sh
# プロジェクトaではグローバル設定が反映される
$ cd ~/a

$ git config user.email
myname@example.com

# work配下のプロジェクトxでは設定が上書きされている
$ cd ~/work/x

$ git config user.email
user@work.com
```

このように`includeIf`を使えば、特定の設定を上書きすることができます。
条件を追加して複数の設定ファイルを使い分けることもできます。

## 参考
- [Git 2.13 has been released](https://github.com/blog/2360-git-2-13-has-been-released)
- [Git - git-config Documentation](https://git-scm.com/docs/git-config)
Qiitaみるたびに線の色が違うのが気になってしかたがないのでユーザースタイル書いた

# 重箱の隅がきになる病気

少し前からQiitaのページ開くのが憂鬱でした。
なんでかってーと、1ページに線の色が3種類(今回調べてみたら4種類だった)あって、俺のような人間は「あーもーこれ気になる、気になる。」と毎回思わなきゃなんないからなのです。

![qiita-before.png](https://qiita-image-store.s3.amazonaws.com/0/34041/e44a9fdd-fd8c-cdad-cbf3-359bb685ead3.png)


# なおせばいいじゃない

重い腰をあげてユーザースタイル書きました。
俺は薄めが好きなので #eee に統一しましたが、お好きな色に、どうぞ。

```css
.headerContainer-public,
.userInfo,
.userInfo-danger,
.categoryNavigation_menu,
.categoryNavigation_menu-danger,
.nav-tabs,
.nav-tabs>li.active>a,
.nav-tabs>li.active>a:hover,
.nav-tabs>li.active>a:focus,
.item-box .toggle-button span,
.sharedHeader-public .searchForm_query {
    border-color: #eee;
}
.nav-tabs>li.active>a,
.nav-tabs>li.active>a:hover,
.nav-tabs>li.active>a:focus {
    border-bottom-color: transparent;
}
.item-box .toggle-button-field {
    border-top-color: #eee;
}
.newUserPageProfile_info {
    border-color: #fff;
}
.ItemLink,
.user-box,
.tag-box {
    border-bottom-color: #eee;
}
.item-box.expanded {
    border-top-color: #eee;
    border-bottom-color: #eee;
}
```

# こうなった

これからは「あー気になる、気になるぅ。」って思わなくてすみます。
![qiita-after.png](https://qiita-image-store.s3.amazonaws.com/0/34041/c90798ec-5999-6498-408e-b965d049b31f.png)
Visual Studio CodeでGo開発環境を作成したときのパス設定

windows7のVisual Studio CodeでGo開発環境を作った際に、gitやgopathのパスがうまく通っておらず困ったのでメモ。

### 環境

* windows7
* Visual Stadio Code 1.12

### つまづきポイント

* goファイルをいじっているとgo関連パッケージのインストールが促されるので、促されるままインストールしようとしたが `exec: "git": executable file not found in %PATH%` という感じで怒られた

* gitのパスを通して関連パッケージを進められるまま入れていたら、文字入力してgolintか何か走る度にコマンドプロンプトが開くという状態になってしまった。

### 対応

`ファイル > 基本設定 > 設定 > ` から設定ファイルを開き、ユーザ設定に下記を追加

```
  "git.path": "C:\\Program Files\\Git\\bin\\git.exe",
  "go.gopath": "C:\\gopath\\bin"
```
Pythonをローカルインストール

Pythonをローカルインストールする際にはまったのでメモ．
管理者権限がない場合(sudoが使用できない場合)を想定している．
Python3.6.1をインストールしたが，他のバージョンにも適用可能であると考えられる．

#環境
* OS: Debian 8.8 (Jessie)
* tcl/tk 8.6.6
* Python 3.6.1

\$HOME/srcにダウンロード・展開し，\$HOME/localにインストールするものとして話を進める．

#tcl/tkのインストール
まず，matplotlibにtkinterが必要なので前もってtck/tkをインストールしておく．
もうすでにインストールされており，インストールされたlibディレクトリとincludeディレクトリがわかっている場合は読み飛ばしてよい．
自身の場合はインストールディレクトリがわからなかった（かつバージョンが古かった）ため，ローカルにインストールしている．

tcl/tkの最新バージョンは8.6.6なので，こちらをインストールする．
[公式サイト](https://www.tcl.tk/)内のリンクからダウンロードする．

まずtclをインストールする．

```bash
cd $HOME/src
wget https://sourceforge.net/projects/tcl/files/tcl8.6.6-src.tar.gz/download -O tcl8.6.6.tar.gz
tar xzvf tcl8.6.6.tar.gz
cd tcl8.6.6
mkdir build; cd build
../unix/configure --prefix=$HOME/local/
make
make install
```

同様にtkもインストールする．

```bash
cd $HOME/src
wget https://sourceforge.net/projects/tcl/files/tk8.6.6-src.tar.gz/download -O tk8.6.6.tar.gz
tar xzvf tk8.6.6.tar.gz
cd tk8.6.6
mkdir build; cd build
../unix/configure --prefix=$HOME/local/
make
make install
```

#Pythonのインストール
次にPythonをインストールする．
何も考えずにインストールするとtkinterがうまくいかなくなるので注意．

Pythonの最新バージョンは3.6.1なのでこちらをインストールする．
[公式サイト](https://www.python.org/)内のリンクからダウンロードする．

```bash
cd $HOME/src
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
tar xfv Python-3.6.1.tar.xz
cd Python-3.6.1
mkdir build; cd build
../configure --prefix=$HOME/local/ --with-tcltk-includes="-I/$HOME/local/include" \
   --with-tcltk-libs="-L/$HOME/local/lib -ltcl8.6 -ltk8.6"
make
make install
```

注意すべきはconfigureの実行の際にオプションでincludeディレクトリとlibディレクトリを指定することである．
これがないとPythonインストール後の実行時にエラーを吐く．
エラーメッセージとしては
```bash
    import _tkinter # If this fails your Python may not be configured for Tk
ImportError: No module named '_tkinter'
```
みたいなのが得られる．

インストールの際のメッセージの最後の方に

```
Python build finished successfully!
The necessary bits to build these optional modules were not found:
_gdbm                 _lzma
To find the necessary bits, look in setup.py in detect_modules() for the module's name.
```

と出ているのでこれらのパッケージが必要な場合はまた別のオプションを指定する必要がある．
困った場合は展開したPythonディレクトリ内にあるsetup.pyのスクリプトを参照するとよいだろう．

最後にpipをインストールすれば一応インストールは完了である．

```bash
wget https://bootstrap.pypa.io/get-pip.py
$HOME/local/bin/python3 get-pip.py
```

動くかの確認としてplt.show()などしてみるとよいだろう．
画面の手前にある透明なコライダーをクリックさせたいけど奥にあるSpriteをクリックしてしまうときの対処法

透明なコライダーオブジェクトに画像のないSpriteRendererをつけて Order in Layer の値を1000くらいにしておきましょう。
そうすれば手前にある透明なオブジェクトをクリックできます。
Vagrantfileでboxのバージョンを指定する方法


いつも使っている[Scotch Box](https://box.scotch.io/)がバージョンアップして、初回起動時にバージョン3.0を読み込んでしまうため、バージョンを指定してBoxを落としてくる方法を調べた。

案件的には、まだまだPHP5系が多いので。。。

Vagrantfileを修正する。


```diff

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

    config.vm.box = "scotch/box"
+   config.vm.box_version = "2.5"
    config.vm.network "private_network", ip: "192.168.33.10"
    config.vm.hostname = "scotchbox"
    config.vm.synced_folder ".", "/var/www", :nfs => { :mount_options => ["dmode=777","fmode=666"] }

end
```

```config.vm.box_version = "2.5"```を追加してバージョンを指定してあげれば良い。

***
参考サイト

* [config.vm - Vagrantfile - Vagrant by HashiCorp](https://www.vagrantup.com/docs/vagrantfile/machine_settings.html)
Factory method patternメモ

こういう感じのFactory method patternはよく使いそうなのでメモ

``` go
package main

import (
    "fmt"
    "errors"
)

const (
    PersonTypeSales     = 1
    PersonTypeOperator  = 2
)

type (

    PersonInterface interface {
        Greet() string
        GetType() int
    }

    Person struct {
        Type int
    }

    Salesperson struct {
        Person
    }

    Operator struct {
        Person
    }

    PersonFactory struct {}

)

// 共通メソッド
func (p Person) GetType() int {
    return p.Type
}

// 共通メソッド
func (p Person) Greet() string {
    return "I'm a person."
}

// 埋め込みStructのメソッドを上書き可能
func (p Salesperson) Greet() string {
    return "I'm a sales-person."
}

func (p Operator) Greet() string {
    return "I'm an operator."
}

// Factory method
func (p *PersonFactory) Get(personType int) (PersonInterface, error) {
    var person PersonInterface

    switch personType {
    case PersonTypeSales:
        person = Salesperson{Person{Type: personType}}
    case PersonTypeOperator:
        person = Operator{Person{Type: personType}}
    default:
        return nil, errors.New("Not found target type of person.")
    }

    return person, nil
}

func main() {
    factory := PersonFactory{}

    salesperson, _ := factory.Get(PersonTypeSales)
    operator, _ := factory.Get(PersonTypeOperator)

    fmt.Println(salesperson.Greet(), salesperson.GetType())
    fmt.Println(operator.Greet(), operator.GetType())
}
```
日付の表示方法メモ

#概要
JSとRailsで時間表示がうまくなかったので、そこの修正をおこなう。

#メモ
![80701be3-76ae-037a-12cf-84c6d60cac3e.png](https://qiita-image-store.s3.amazonaws.com/0/167850/5fd9cd80-5319-5a60-0c9b-b1eae8400441.png)


###変更したい点
- 表示時間に年月を加えたい。（画面上部の時間表示）
Javascriptで書かれているので、JSでの変更
- 出勤時間、退勤時間を時間だけの表示に変更したい。
Railsで書かれているので、Railsの修正

まずはrails部分。どうやら、下記のような形でかけばよいらしす。

```
<% time = Time.now # Thu Dec 24 00:00:00 +0900 2011  %>
<%= time.strftime('%Y年%m月%d日 %H:%M:%S') %>
```

下記のコードを変更してみる。

```
ユーザーID：<%= r.user_id %><br>
出勤時間：<% if r.timein.present? %><%= r.timein %><% else %>まだ出勤打刻してないよ<% end %><br>
退社時間：<% if r.timeout.present? %><%= r.timeout %><% else %>まだ退勤打刻してないよ<% end %><br>
```

変更後はこちら。ただ単に後ろに記述を書いただけ。

```
ユーザーID：<%= r.user_id %><br>
出勤時間：<% if r.timein.present? %><%= r.timein.strftime('%H:%M:%S') %><% else %>まだ出勤打刻してないよ<% end %><br>
退社時間：<% if r.timeout.present? %><%= r.timeout.strftime('%H:%M:%S') %><% else %>まだ退勤打刻してないよ<% end %><br>
```

時間だけがちゃんと表示されるようになる。

```
<script type="text/javascript">
var testtoday = new Date();
var thisYear = set2fig( testtoday.getFullYear() );
var thisMonth = set2fig( testtoday.getMonth() );
var today = set2fig( testtoday.getDate() );
console.log(thisYear);
console.log(thisMonth);
console.log(today);
</script>
```

![Screen Shot 2017-06-08 at 15.44.24.png](https://qiita-image-store.s3.amazonaws.com/0/167850/7bf70bc5-309d-2063-37d0-a1871de5b5d6.png)

次はJSの部分を直してみる。調べてみると、JSのDate()はすこし癖があるらしい。下記を書いてconsole.logで確認してみた。年月日がとれている。これを元にJSを変更する。

![Screen Shot 2017-06-08 at 15.48.59.png](https://qiita-image-store.s3.amazonaws.com/0/167850/e3005c82-558e-b28a-06d1-cf1a29d616f0.png)

下記のようにコードを変更する。はい。うまく年月日が入った表示に切り替わりました。

```
<p id="RealtimeClockArea2"></p>
<script type="text/javascript">
function set2fig(num) {
   // 桁数が1桁だったら先頭に0を加えて2桁に調整する
   var ret;
   if( num < 10 ) { ret = "0" + num; }
   else { ret = num; }
   return ret;
}
function showClock2() {
   var nowTime = new Date();
   var thisYear = set2fig( nowTime.getFullYear() );
   var thisMonth = set2fig( nowTime.getMonth() );
   var today = set2fig( nowTime.getDate() );
   var nowHour = set2fig( nowTime.getHours() );
   var nowMin = set2fig( nowTime.getMinutes() );
   var nowSec = set2fig( nowTime.getSeconds() );
   var msg = thisYear + "年" + thisMonth + "月" + today + "日" + nowHour + ":" + nowMin + ":" + nowSec;
   document.getElementById("RealtimeClockArea2").innerHTML = msg;
}
setInterval('showClock2()',1000);
</script>
```

![Screen Shot 2017-06-08 at 15.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/167850/7654625c-062c-f80f-ae4e-ca9d1374a55c.png)



#参考資料

[日付データをフォーマット(strftime)](http://railsdoc.com/references/strftime)
[JavaScript の Date は罠が多すぎる](http://qiita.com/labocho/items/5fbaa0491b67221419b4)
人に聞くとやや恥ずかしいドロップダウンリストのナンバリング2桁以上の表記

「Hello World」をJavaで表記できて喜んでるレベルですと、こういうことでも躓いてしまうのです。

SaaSForceでドロップダウンリストを作るときに、ナンバーをつけて区切るのですが2桁以上を作ると、どうしても問題が。

例えば、こんな感じです。

![wfc20161109036.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/24e66cc6-4df2-5cb1-a8bc-87d4c9f7f79b.jpeg)![wfc20161109037.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/05ef9882-99d3-6f23-8781-c12a7e70d403.jpeg)

作成した段階では、リストはマグロから始まって、巻物や玉子、そして、アナゴで終わっています。

しかし、これを保存するとこんなかんじに勝手に変わるのです。

「1:マグロ;10:鉄火巻き;11:かんぴょう巻き;12:玉子;13:アナゴ；;2:イクラ;3:イカ;4:ハマチ;5:タコ;6:金目鯛;7:ヒラメ;8:イサキ;9:ウニ」

つまり、1の次は10，11，12，13と言う認識がされます。

そこまで「1」が優先とは知りませんでした・・・。

そこで、1桁の数字に全部「0」を付けてみました（他人に聞いてみた）。

「01:マグロ;10:鉄火巻き;11:かんぴょう巻き;12:玉子;13:アナゴ；;02:イクラ;03:イカ;04:ハマチ;05:タコ;06:金目鯛;07:ヒラメ;08:イサキ;09:ウニ」

この状態で保存をしてまた開きます。

「01:マグロ;02:イクラ;03:イカ;04:ハマチ;05:タコ;06:金目鯛;07:ヒラメ;08:イサキ;09:ウニ;10:鉄火巻き;11:かんぴょう巻き;12:玉子;13:アナゴ;」

並べ替えなくても、番号さえ変えれば思ったとおりの順番に並んでくれました。

実際にアプリ化しても、このような表記がされていて、思ったようにできました。

![wfc20161109038.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/b0d7e03a-9a04-5540-e41c-da2ce67360e2.jpeg)

プログラミングになれている人なら常識なのかもしれませんが、正真正銘の素人はこういうことも知らないので、もし、同じことで「マジか」となった人は、是非、こうやって他人に質問することなく解決してください。
【Laravel 5.4】validationのロケールで、テーブルのフィールド名を日本語訳する方法

## まずバリデーションエラーを日本語化しておく
resources/lang/en を ja にコピーして中味を日本語訳するか
ここら辺（[Laravelの日本語レポジトリの作成](http://www.larajapan.com/2017/01/30/laravel%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%AC%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90/)とか）から、一旦 5.3 用を入れて差分修正しておく。
config/app.php を編集して、ja のロケール設定もしておく。
## フィールド名の定義
attributes に記述する。

```php:resources/lang/ja/validation.php
    'attributes' => [
        'name' => '名前',
        'email' => 'eメール',
    ],
```
## フィールド名を変換する
バリデーションエラーは勝手に変換してくれるけど、テーブルのフィールド名も定義した attributes の日本語訳で表示したい。
ローカライズは trans 関数を使う。
validation.php の attributes にある email を指定する場合は以下のようなキーを指定する。

```php:
trans('validation.attributes.email');
```
対応する訳があれば、その値（「eメール」とか）が返る。
訳がなければキーの値がそのまま('validation.attributes.email')返る。

例えばこんな関数を作ってラベルをまとめて日本語化したりすると
table にテーブル名を渡しただけで自動でテーブル一覧を表示したりして

```php:TableController.php
    /**
     * フィールド名配列の内容をまとめて日本語化
     * @param array $fields フィールド名一覧
     * @return array 日本語化されたラベル
     */
    private function trans($fields) {
        $label = [];
        foreach ($fields as $field) {
            $key = 'validation.attributes.' . $field; // キーを作成する
            $value = trans($key);
            $label[$field] = ($key == $value) ? $field : $value;
        }
        return $label;
    }

    /**
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $table = $request->input('table', null);
        $title = 'テーブル ' . $table;
        $data = DB::table($table)->get();
        if ($data) {                                // データがあれば
            $fields = array_keys((array) $data[0]); // 最初のオブジェクトを配列に変換してキーを取得
        } else {
            $fields = null;
        }
        $label = $this->trans($fields);
        return view('table')->with([
            'title'  => $title,  // タイトル
            'fields' => $fields, // フィールド一覧
            'label'  => $label,  // 表示ラベル
            'data'   => $data,   // 表示データ
        ]);
    }
```
あとは、こんな感じでループを回せばテーブル一覧が表示できる。

```php:table.blade.php
           :
@if ($data)
    @forelse ($data as $elem)
        @if ($loop->first)
        <table class="table table-bordered">
            <thead>
                <tr>
                @foreach ($fields as $field)
                    <th>{{ $label[$field] }}</th>
                @endforeach
                </tr>
            </thead>
            <tbody>
        @endif
                <tr>
                @foreach ($fields as $field)
                    <td>{{ $elem->$field }}</td>
                @endforeach
                </tr>
        @if ($loop->last)
            </tbody>
        </table>
        @endif
    @empty
    <p>データなし</a>
    @endforelse
@else
    <p>データなし</a>
@endif
           :
```
data が null なら「データなし」と表示。
data が一件もなければ「データなし」と表示。
ループの一回目にタイトル行を表示
ループの最後にテーブルのクローズタグを表示。
あとは data 行分、fields のカラム分を表示。

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
iOS11のCoreNFCの使い方


# はじめに
WWDC2017で発表になったiOS11の新しいフレームワークであるCoreNFCですが、早速使ってみました。しかも流行りのSwiftではなくObjective-Cで書いておきます。

基本的な呼び出し方は、すでに何人かの方が書いているので参考にしてもらえればと思います。AppID、Info.plistでのPrivacyなどなど。

で、最初ドキュメントのとおりにやったらエラーで表示できなくて、何が行けないのか調べたところ、

> entitlements

に１行書けと。
そんなのどこにも書いてないよって感じの情報でした。Twitterで回答してる人がいて助かりました。

# ではコードを書いてみます

CoreNFCでは２つのdelegate（成功とエラー）を書くわけですが、基本的に取得する内容は

```
@property (nonatomic, assign) NFCTypeNameFormat typeNameFormat;
@property (nonatomic, copy) NSData *type;
@property (nonatomic, copy) NSData *identifier;
@property (nonatomic, copy) NSData *payload;
```

の４つしかありません。
NFCは仕様がいくつかあるので、typeなどによってpayloadを解析してあげないといけません。後はこんな感じでやるだけです。

```
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.nfcSession = [[ NFCNDEFReaderSession alloc ]
		initWithDelegate:self queue:nil invalidateAfterFirstRead:TRUE ];
    [ self.nfcSession beginSession ];
    
}

- (void)readerSession:(NFCNDEFReaderSession *)session
       didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages
{
	for ( NFCNDEFMessage *message in messages ) {
       		// 複数ある可能性があるので
        for ( NFCNDEFPayload *record in message.records ) {
        
        	// record.typeNameFormat;
        	// record.type;
        	// record.identifier;
        	// record.payload;
		}
	}
}
- (void)readerSession:(NFCNDEFReaderSession *)session
        didInvalidateWithError:(NSError *)error
{
	// エラーとか読み込み終了とか    
}
```

ここまではそんなに難しくない（解析は自分でやらないといけないため）です。あとは仕様書とにらめっこしながらバイナリを解析していきましょう。

参考
* https://developer.apple.com/documentation/corenfc

# NFCタグ
* Amazonで買えます。10枚で1000円くらいで買えます。http://amzn.to/2u21W2i

追記
CoreNFCのセッション動画がアップされてました。
（実際はセッションはしてないはず）
* https://developer.apple.com/videos/play/wwdc2017/718/
Visual Studio Codeでテーマをカスタマイズする

# :ramen: 今回やること
選択されていないタブの背景色を黒くする(・ω・)

友人がtwitterで
> VSCodeで開いてるタブと開いてないタブ見違えるんだけど俺の設定が悪いんかなぁ
> 逆が望ましい

その件については、自分も確かにな〜〜と思ってました。

# :ramen: やってみよう！
1. `Cmd + ,` で設定ファイルを開きます。
2. JSONらしきものが出現するので、こいつに下記の3行を追加します。  

```
    "workbench.colorCustomizations": {
        "tab.inactiveBackground": "#000",
        "tab.activeForeground": "#fff",
    }
```

tab.inactiveBackground: 非アクティブタブの背景色
tab.activeForeground: アクティブのタブの文字色

## :ramen: 設定するとこんな感じ
<img width="820" alt="スクリーンショット 2017-06-08 15.18.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/96220/ccc4eb43-e17c-7a2c-3479-f0a6d84d7015.png">


## :ramen: 参考
https://code.visualstudio.com/docs/getstarted/theme-color-reference

## :ramen: さいごに
オススメのカスタマイズがあったら教えてください！
Seleniumでスクレイピング成功しました

#Seleniumでスクレイピング

全55ページ、1ページあたり24件の商品画像があるものを全数取得しないといけない要件を達成するために書きました。Selenium便利ですねホント。テキストベースで商品名、商品URL、商品画像SRCが分かればとりあえずOKという仕様なので、凄く簡潔です。

```seleniumer.py
import os, re
import time
from selenium import webdriver

DRIVER_PATH = os.path.join(os.path.dirname(__file__), 'chromedriver')
browser = webdriver.Chrome(DRIVER_PATH)
url = 'https://www.XXXXXXXX'
browser.get(url)

for i in range(56):
    try:
        img_list = []
        urls_list = []
        name_list = []

        for i in browser.find_elements_by_xpath('//*[@id="find-results"]/div/div/div/a[1]/img[1]'):
            imgs = i.get_attribute('src')
            img_list.append(imgs)

        for a in browser.find_elements_by_xpath('//*[@id="find-results"]/div/div/div/a[1]'):
            urls = a.get_attribute('href')
            urls_list.append(urls)

        for t in browser.find_elements_by_xpath('//*[@id="find-results"]/div/div/div/a/div/span[1]/span'):
            name = t.text
            name_list.append(name)

        for img_src, urls_href, name_title in zip(img_list, urls_list, name_list):
            print (name_title, urls_href, img_src, "\n+++++++++++++++++++++++++++++++++++++++++++++++++++")

        link_elem = browser.find_element_by_class_name('control-page-next-button')
        link_elem.click()

        time.sleep(3)
    except:
        print ('not found!')

browser.close()
```

browser.find_elements_by_xpath　で使うxpathを調べる場合はChromeでCOPYから貼り付け出来るんですね。ものすごい便利な機能があるもんだと感心してました。

find_elements()メソッドはforのなかでぶん回さないといけないっぽいですね。
AWSでSSL証明書の作成方法

SSL証明書をIAMにアップロードして利用していましたが、期限が近づいているという連絡が来ました。
AWSには無料で使えるACM(AWS Certificate Manager)があるので、証明書を作成し置き換えたいと思います。
これはその時のメモです。

# 手順

###手順１
EC2 > ロードバランサー
から該当のロードバランサーを選択し、[リスナー]タブの「編集」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/42a9fd64-a40f-d5ac-5982-8f3efd9b7e1f.png)

###手順2
SSL証明書の「変更」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/694abd56-4550-2c0f-e45e-2a1256fa7471.png)

###手順3
「AWS 証明書マネージャ (ACM) から、既存の証明書を選択する」を選択し、
「ACM　から新しい証明書をリクエスト」のリンクを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/8d19e54a-4264-3850-527c-514aa544a9c2.png)

###手順4
ドメイン名を入力後、「確認とリクエスト」ボタンを押します。
確認画面に遷移するのでもう一度ボタンを押してください。（スクリーンショットは省略）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/83f46d0b-8116-78bc-b6c2-62b110dbde3b.png)

###手順5
リクエストを行うと下記画面が出ます。
リクエストを送信したメールアドレスもここに表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/263d918e-1bc5-5399-86d5-8519d387265f.png)

###手順6
Amazonから届いたメールにリンクが貼ってあります。
そこから確認画面に遷移し、「I Approve」ボタンを押してください。
完了画面（スクリーンショットは省略）に遷移したら、あとは設定です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/e73eb568-e2a0-9b8b-f2c5-da358e114d1d.png)

###手順7
手順3の画面を再ロードすると証明書が選択できるようになっています！
こちらを選択し、保存すれば完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/a404d67a-4a61-5a63-2ec4-061e010f2a5f.png)

###手順8
ブラウザからページを開き、証明書が正しいか確認してください。
※確認したので気付けましたが、ワイルドカードにし忘れるという、しょうもないミスを私はしました。。。

#証明書の更新について
条件を満たしていれば自動更新されます。
http://docs.aws.amazon.com/ja_jp/acm/latest/userguide/configure-domain-for-automatic-validation.html

自動更新できない場合でも有効期限切れ45日前からメールで通知が来るようです。（手動更新）
http://docs.aws.amazon.com/ja_jp/acm/latest/userguide/managed-renewal.html#how-manual-domain-validation-works

# まとめ
素早く、簡単にでました。
簡単なのにキャプチャしっかり取りすぎました。
Swift4.0 で追加される Codable

※ まだ正式リリースされていない情報なので変更の可能性があります🙇

Swift3までは`struct`や`enum`をデータとして保存や読み込みをする際に必要となるオブジェクトのシリアライズとデシリアライズのために一発`NSCoding`プロトコルに準拠した`NSObject`を噛ませなければいけませんでした😭

```swift
struct Person {

  let name: String
  let age: Int
}

extension Person {

  class Helper: NSObject, NSCoding {

    let person: Person?

    init(person: Person) {
      self.person = person
      super.init()
    }

    required init?(coder aDecoder: NSCoder) {
      guard
        let name = aDecoder.decodeObject(forKey: "name") as? String,
        let age = aDecoder.decodeObject(forKey: "age") as? Int else {
          return nil
      }

      person = Person(name: name, age: age)
      super.init()
    }

    func encode(with aCoder: NSCoder) {
      guard let person = person else { return }

      aCoder.encode(person.name, forKey: "name")
      aCoder.encode(person.age, forKey: "age")
    }
  }
}

let person = Person(name: "Foo", age: 10)
let helper = Person.Helper(person: person)
let data = NSKeyedArchiver.archivedData(withRootObject: helper)
```

ただ、PersonをDataにしたいだけなのにこの手間。Swift4では`Codable`というプロトコルがFoundationに追加されて解決しました☺️

https://github.com/apple/swift-evolution/blob/master/proposals/0166-swift-archival-serialization.md

```swift

struct Person: Codable {

  enum Child: String, Codable {
    case son, daughter
  }

  let name: String
  let age: Int
  let children: [Child]
}

let person = Person(name: "Foo", age: 10, children: [.son, .daughter])
let data = try? JSONEncoder().encode(person)
```

これだけで済むのです👏エンコードを例にしましたが、定義元を見るとわかるのですがデコードも可能です。しかもSwift4で追加されたプロトコルの`&`が使われている👏

https://github.com/apple/swift-evolution/blob/master/proposals/0156-subclass-existentials.md

```swift
/// A type that can convert itself into and out of an external representation.
public typealias Codable = Decodable & Encodable
```

これならAPIなどで取得したデータをパースする時の処理に外部ライブラリを使わなくても済みますね。

```swift
let person = try? JSONDecoder().decode(Person.self, from: data)
```

このEncoderは現在`JSONEncoder`と`PropertyListEncoder`のみですが、今後増えて行くと思います。

しかもこの検証をPlaygroundで行なっていたところ、バイナリデータのサイズに大きな違いがあることも分かりました🎉前者がデカいのは`NSObject`を継承しているためでしょう。

```swift
let data = NSKeyedArchiver.archivedData(withRootObject: helper) // 299 bytes
let data = try? JSONEncoder().encode(person)                    // 53 bytes
```

おしまい👏
matplotlibの3Dグラフで平坦な面を作図する

matplotのチュートリアルなどを読むと鞍型や三角関数の合成など、素敵な3D作図の例を沢山見つけることができます。
しかしデータ分析業務においてはもっと単純な、単にy=ax+bをZ方向に引き伸ばして表示したいというようなことの方が多いのではないでしょうか。
簡単にできると思いきや、絵的に地味すぎるせいか例が見つからず時間がかかってしまったのでメモしておきました。

```python:python
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
z = np.linspace(0, 100, 11)
Y, Z = np.meshgrid(y, z)
X = np.array([x] * Y.shape[0])

fig = plt.figure()
ax = Axes3D(fig)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
ax.plot_surface(X, Y, Z, alpha=0.3) 
```
![2.png](https://qiita-image-store.s3.amazonaws.com/0/185969/ab4e0417-e1df-397a-d2d6-e7fc4807ec7e.png)

```python:python
x = 2
y = np.linspace(0, 100, 11)
z = np.linspace(0, 100, 11)
Y, Z = np.meshgrid(y, z)
X = np.array([x] * Y.shape[0])

fig = plt.figure()
ax = Axes3D(fig)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
ax.plot_surface(X, Y, Z, alpha=0.3)
```

![5.png](https://qiita-image-store.s3.amazonaws.com/0/185969/40acb0e9-4137-d07d-7fba-583ee22a3865.png)

あとはこの上から3D散布図を重ねたりワイヤーフレームの線を引いてやればOK。
とはいえ、見せられる側からするとディスプレイ上の3Dグラフはどうやっても見にくいのでデータ可視化が目的であればZの代わりにカラーグラデーションを使ったり、三面図みたいな見せ方を考えたほうがいいかもしれません。三次元のモデリングを行う方は是非参考にしてください。
Homebrewで Python3 OpenCV3をMacにインストール

OpenCV3のPython3バインディングをhomebrew経由でインストール中にDoes not support building both Python 2 and 3 wrappersのエラーがでて止まったので，その解決方法を記しておきます。

以下のページを参考にしました。
http://www.pyimagesearch.com/2016/12/19/install-opencv-3-on-macos-with-homebrew-the-easy-way/
http://www.pyimagesearch.com/2017/05/15/resolving-macos-opencv-homebrew-install-errors/

Windowsでは，http://qiita.com/hitomatagi/items/d5d475a446ec9c73261e の手法でインストールできるようです。

# 環境
- MacOS Sierra
- homebrew
- python3.6
- OpenCV3.2

homebrewはインストール済みとします。

# Python3のインストール
現時点での最新版Python3.6をインストールします。

```bash:Python3のインストール
brew install python3
```

OpenCV3はnumpyを利用するので，Python3といっしょにインストールされるpip3を使ってnumpyをインストールしておきましょう。その他必要であればmatplotlibやjupyterなどを入れておくと便利です。

```bash:numpyのインストール
pip3 install numpy
```


# homebrewのフォーミュラを追加
デフォルトのフォーミュラにはOpenCV3がはいってないので追加します。

```
brew tap homebrew/science
```

# OpenCV3のインストールエラー
ここで，以下のようにインストールを実行すると"Does not support building both Python 2 and 3 wrappers"というエラーがでてインストールに失敗します。

```
brew install opencv3 --with-python3
```

# OpenCV3のインストール方法
[Resolving macOS, OpenCV, and Homebrew install errors](http://www.pyimagesearch.com/2017/05/15/resolving-macos-opencv-homebrew-install-errors/) によると以下のようにオプションを指定することでOpenCV3のPython3バインディングがインストールができます。
--with-contribはOpenCV3の拡張をインストールするオプションなのでつけなくてもよいです。

```
brew install opencv3 --with-contrib --with-python3 --without-python
```

どうやら--with-python3のみだと，Python2バインディングもビルドしようとするためエラーとなるようです。なので明示的にPython2バインディングはいらないとオプションをつけてやります。

環境にもよりますが，5分から10分ほどでインストールが完了します。

# .soファイルのシンボリックリンクをはる

OpenCV3のPython3バインディングをインストールした直後だとimport cv2をしてもインポートエラーが発生します。

なので，cv2.soファイルのシンボリックリンクをPython3のsite-packagesフォルダにはります。

```:homebrewでインストールしたPython3のsite-packagesフォルダ
/usr/local/lib/python3.6/site-packages
```

```:cv2があるフォルダ
/usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages
```

```:cv2のシンボリックリンクを作成
ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so /usr/local/lib/python3.6/site-packages/
```

"3.2.0"の部分と"python3.6"の部分は各自インストールしたバージョンに合わせてください。

# import cv2してみる
ターミナルなどでPython3を起動して，以下のように打ち込むとOpenCV3が使えるようになっているはずです。

```py3
import cv2
```
Android Studio cheat sheet

# shortcuts

https://developer.android.com/studio/intro/keyboard-shortcuts.html

# test

https://developer.android.com/studio/test/index.html

https://developer.android.com/studio/test/command-line.html

Call the test task:

    ./gradlew test


Call the connectedAndroidTest task:

    ./gradlew connectedAndroidTest

# kotlin
## sample
https://github.com/cbeust/kotlin-android-example/blob/master/app/src/main/kotlin/com/beust/example/DbHelper.kt
Cognos TM1のメモリー使用について、覚えておくと役に立つ基本的な話

##概要
Cognos TM1はインメモリーベースのOLAP製品のため、メモリーの使用量に常に気をつける必要があります。

こちらのTechnoteの和訳がほとんどですが、TM1のメモリー使用動作について、知っておくと役に立つ基本的な内容を記載します。

**Understanding TM1 Memory Usage and Windows Paging**
http://www-01.ibm.com/support/docview.wss?uid=swg21665507

##内容
TM1はCubeのデータ等をメモリーに上げ、高速な処理を行いますが、物理メモリーが枯渇した場合、お構いなしに仮想メモリー(ページング領域)を使用し、とてつもなくパフォーマンスが低下します。

ページングを使用しない LockPagesInMemory=T という設定がありますが、TM1ノード上の他のアプリケーションに悪影響を及ぼす事も考えられるので、あまり推奨されません。
※LockPagesInMemoryに関しては、こちらのTechnoteもご参照下さい。
**LockPagesInMemory - TM1 server configuration parameter**
http://www-01.ibm.com/support/docview.wss?uid=swg27024038

そういう訳で、TM1のメモリー使用量を常にモニターし、物理メモリーの範囲で、できれば80%くらいに抑えておくことが重要です。

TM1が使用したメモリー領域は、TM1サーバーのサービスをシャットダウンするまで、OSに対して開放されません。

TM1の中には、GC(Garbage Collection)の機能もありますが、TM1のGCにより開放されたメモリーは、TM1のためにのみ再利用されます。

一度仮想メモリーを使用すると、GCで開放されても仮想メモリー領域も再利用してしまいます。これはTM1サーバーのシャットダウンまで開放されません。

TM1サーバーの使用メモリー総量は、Windowsのタスクマネージャーからtm1sd.exeプロセスを確認すればわかります。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/efc6ac22-82ac-11d4-32dd-765c49fecd01.png)

Cube単位で確認したい場合は、簡易的には、TM1 Architectから「キューブ」をクリックすると、表示メニューで「プロパティ・ウィンドウ」がチェックされていれば、下のようにCube毎のメモリー使用量が確認できます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7c849ea3-c8c6-b3da-f0d2-9db4842736f6.png)

もっと詳細に確認したい場合、TM1パフォーマンス・モニターの使用が有効です。

TM1 ArchitectでTM1サーバーを右クリックし「パフォーマンス・モニターの起動」でモニターを開始します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d3678d98-0d08-4c2c-28d0-0a08f9f74f62.png)

モニター結果は、}StatsByCubeのような、コントロールキューブを確認する事により可能です。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4018a3a2-8cd4-1486-19e0-ea5733f44e13.png)

Cube毎のTotal Memory Used以外にも、Viewのメモリー使用、Feedersのメモリー使用など、細かく確認する事が可能です。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4081dbef-c583-133a-ed90-7c7e060a03be.png)

基本的な内容ですが、とても重要なので覚えておいて頂ければと思います。
fastlane の create_keychain でエラーが出てしまった問題の対処

CircleCI で fastlane の create_keychain でエラーが出てしまった。
Fastfile には create_keychain をこんな感じで書いてた。

```ruby
before_all do
  if is_ci?
    create_keychain(
      name: 'name',
      password: 'password',
      timeout: 1800
    )
  end
end
```


エラーの内容は下記。

```
Shell command exited with exit status 48 instead of 0.
```

## 問題点

[Issue when use create\_keychain · Issue \#9366 · fastlane/fastlane](https://github.com/fastlane/fastlane/issues/9366)

すでに create_keychain してある状態で、同じ名前で keychain を作ってしまうのが問題のようだ。

エラーがでた状況は、確かに 2 回 create_keychain を実行していた。

1. Scan でテストを実行
    * before_all が実行され keychain が作成される
2. Deliver で iTunesConnect にアプリ提出
    * before_all で 2 回目の keychain 作成


## 解決策

create_keychain 前に該当の keychain を削除するようにした。
末尾の ` || echo` は、 keychain が存在しない場合にはエラーを握りつぶしたいため入れている。

```ruby
before_all do
  if is_ci?
    sh("rm /Users/distiller/Library/Keychains/name-db || echo")

    create_keychain(
      name: 'name',
      password: 'password',
      timeout: 1800
    )
  end
end
```
numpy.ndarrayの絶対値で詰まった話

最近、音声ファイルに対してちょっとした操作を行っています。

こちらのページを参考に、16bit整数の```numpy.ndarray```型として読み込んでみました。

[Pythonで音の波形を表示(Wavファイル)](http://denshi.blog.jp/signal_processing/python/wave_plot)

```python
import numpy as np
import wave

def read_wavefile(filename):
    """wav形式のファイルをnumpy.ndarrayとして読み込む"""
    wf = wave.open(filename , 'r')
    buf = wf.readframes(wf.getnframes())
    # バイナリデータを16bit整数に変換
    return np.frombuffer(buf, dtype='int16')
```

こちらの音声の絶対値を取りたかったため、```numpy.absolute```で配列を変換します。

```python
arr = read_wavefile('test.wav')
arr_abs = np.absolute(arr)
```

ところが、この中の```-32768```という値が、正の値に変換されずに残ってしまっています。
ヒストグラムを取ると、他の負の値はプラスになっているものの、```-32768```だけが残ってしまっていることがわかります（値が細かいですが）。

```python
import matplotlib.pyplot as plt

print(type(arr_abs))
# => <class 'numpy.ndarray'>

print(arr_abs.min())
# => -32768

plt.hist(np.absolute(arr), bins=100)
plt.show()
```

![ダウンロード (2).png](https://qiita-image-store.s3.amazonaws.com/0/127762/f22a6d0f-5981-3c82-2d0e-39f4140323ad.png)


# 対処方法

これは、最初の読み込みで32bit整数として読み込むと解決しました。

```python
def read_wavefile(filename):
    """wav形式のファイルをnumpy.ndarrayとして読み込む"""
    wf = wave.open(filename , 'r')
    buf = wf.readframes(wf.getnframes())
    # バイナリデータを32bit整数に変換
    arr = np.frombuffer(buf, dtype='int16')
    return arr.astype(np.int32)

arr = read_wavefile('test.wav')
arr_abs = np.absolute(arr)
print(arr_abs.min())
# => 0
```

これはおそらく、[16bit整数は-32768から32767までしか表現できない](https://docs.scipy.org/doc/numpy/user/basics.types.html)ため、```numpy.absolue```で符号を変換した値が変換できず、そのままの値が出力されてしまっているということだと思います。

（これらの仕様について詳しく書いてあるドキュメントは見つかりませんでしたが）

PythonのnumpyやR言語などの数値計算用のプログラムを利用する際は、高速化のためにC言語のデータ型をそのまま用いていることが多いので、普段より注意が必要だということを改めて認識しました。

ちなみに今回用いた```numpy```のバージョンは1.13.0です。

```bash
$ pip freeze | grep numpy
numpy==1.13.0
```
Kotlin Android ExtensionsでfindViewByIdとさよなら


こんにちはsekitakaです。

JavaのAndroid開発でButterknifeを使っていたのでKotlinではKotterknifeを使おうと思ったのですが、ちょっとぐぐってみたところKotlinには
[Kotlin Android Extensions](https://kotlinlang.org/docs/tutorials/android-plugin.html)という、Android用の拡張機能があったので使い方を共有します。

# なにができるの
Android開発をしているとfindByIdをキャスト付きで書く事が多いですが、それを省略できます。

# Kotterknifeにくらべて何がいいの？
layout.xmlに対応する特殊なパッケージをimportするだけで、Activityのコードではクラス変数としてアクセスできます。変数名はxmlで指定した`id`です。よってコードの記述量が少なくてすみ`id`と変数名も一致して分かりやすいコードになります。またキャストするために型を記述する必要もありません。

一方Kotterknifeは以下のようにActivityのクラス変数としての宣言が必要です。
`val firstName: TextView by bindView(R.id.first_name)`


# 使い方

## build.gradle
appのbuild.gradleに以下を追記します。

```buld.gradle
apply plugin: 'kotlin-android-extensions'
```

## コード
### layout
activityのレイアウト`activity_hoge.xml`に以下のtextviewがあるとします。(includeされた別のファイルでもよい)

```xml:activity_hoge.xml
<TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
```

### activity
Activityのktファイルで`activity_hoge.xml`のView要素を使用するために以下のようにパッケージをインポートします。

```
import kotlinx.android.synthetic.main.activity_hoge.*
```

それ以外の宣言などは必要なく、onCreateではいきなり以下のようにidで指定した変数名でTextViewにアクセスすることができます。
Android Studioでは入力補完も効きます。ナイス！

```Kotlin:HogeActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_hoge)
    myTextView.text = "aa" // idで指定したmyTextViewという名前でアクセスできる
}
```

## OnClickはどうかくの？
Butterknifeではアノテーションでクリック時の処理をわかりやすく関数化できましたが、Kotlin Android ExtensionやKotterknifeでは出来ないようです。ただラムダ式が簡単に記述できるので、まぁいいかなという感じはします。

```Kotlin
hogeButton.setOnClickListener {
    // クリック時の処理
}
```

## Adapterとかでも使える？
RecyclerViewのAdapterなどでも使えます。しかもこちらも入力補完が効きます。
Adapter内にViewHolderクラスを持つ構成の場合、AdapterのKotlinファイルで以下のようにAdapter内では`view.*`としてインポートすれば良いです。

```Kotlin
import kotlinx.android.synthetic.main.<アイテム用のxml>.view.*
```

# まとめ
Viewへの変数の定義などはただの定形作業なので、そのあたり省略できるのがいいですね。
これからKotlin開発では使っていこうと思います。
とはいえ、ButterknifeのアノテーションでのOnClickとか結構気に入ってたのだが。。。
anaconda での setuptools見つからないエラーを解消する

# Anaconda(conda env) で `pip install` したときにエラーが出る

```shell-session
$ pip install --upgrade google-cloud-bigquery
```

とすると、以下のようになる

```shell-session
FileNotFoundError: [Errno 2] No such file or directory: '/Applications/anaconda/envs/data_science3.6/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg'
```

実際にファイルはなかった。

調べると以下がでてきた。

https://github.com/ContinuumIO/anaconda-issues/issues/542

`setuptools`を再インストールすればなおるよ。とあったので以下を試したところうまく行った

```shell-session
conda install -c anaconda setuptools=27.2.0
```
Google Sheets APIを使って限定公開のシートをJavascriptで操作する



# はじめに
Google Sheets APIって便利ですよね。簡易なアプリケーションならばDBの代わりに使ったりもできます。
限定公開のシートにアクセスし読み込み書き込みを行っていきます。

ちなみに限定公開な必要がない場合はwebに公開して下記を参考にサクッとアクセスすることも可能です。
[https://developers.google.com/sheets/api/quickstart/js](https://developers.google.com/sheets/api/quickstart/js)


## プラグイン

Javascriptのクライアントを読み込む
[https://developers.google.com/api-client-library/](https://developers.google.com/api-client-library/)

Google APIコンソールからプロジェクトの作成、Sheets API のアプリケーションの登録をして
クライアントIDを取得しておきましょう。
[https://console.developers.google.com/start/api?id=sheets.googleapis.com](https://console.developers.google.com/start/api?id=sheets.googleapis.com)


## サンプル
(サンプルはES6で記述されております)

### Setup

ライブラリの読み込みは以下

```.pug
//- bodyの最後の方に追加
script(src='https://apis.google.com/js/api.js')
```

クライアントのイニシャライズ

* クライアントIDは取得したものを使用
* scopeは書き込みと読み込みの両方を指定
  [https://developers.google.com/sheets/api/guides/authorizing](https://developers.google.com/sheets/api/guides/authorizing)
* GoogleSheetsAPIを使用するのurlを指定

```.js
gapi.load('client:auth2', ()=> {
  gapi.client.init({
    clientId: '<YOUR CLIENT ID>',
    scope: 'https://www.googleapis.com/auth/spreadsheets',
    discoveryDocs: ['https://sheets.googleapis.com/$discovery/rest?version=v4']
  })
});
```

### Auth

限定公開のシートにアクセスするために権限を持っているユーザーに認証をさせます。
`signIn` のメソッドを呼び出した時にログイン用のダイアログが開きます。


```.js
const auth = gapi.auth2.getAuthInstance();
auth.signIn();
```

### シートデータの取得/書き込み

values.getはPromiseを返します。引数として取得した結果の参照が可能

```.js
gapi.client.sheets.spreadsheets.values.get({
  spreadsheetId: '<YOUR SheetID>',
  range: '<YOUR Sheet Name>!A2:E' // rangeの指定
}).then((res)=>{
  // value is res.result.values
});
```

書き込みや上書きは下記を参考に(API Explorerが非常に便利)
[https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update)


## 参考
JavaScript Quickstart
[https://developers.google.com/sheets/api/quickstart/js](https://developers.google.com/sheets/api/quickstart/js)
[swift]scrollViewDidEndDecelerating

#UIScrollViewDelegateについて

~~~swift
// MARK: UIScrollViewDelegate
~~~

##説明
scrollViewDidEndDecelerating スクロールが止まった後に呼ばれるメソッドの使い方についてご説明

##役割
scrollViewDidEndDecelerating
ドラッグ後、慣性が効いて動いたあとに止まった場合に呼ばれる。
（慣性なしでドラッグを終えた場合は呼ばれない。delegateを繋げよう！）

###使い道
スクロールが一番下に引いた時に呼ばれるようにするとスクロールのデータ更新などの連携に用いることが多い


~~~swift
    open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y < 0 {
            // refreshの最中にscrollViewDidEndDeceleratingが呼ばれることがある
            return
        }
        let threshold = 100 //しきい値
        let targetEdge = scrollView.contentOffset.y + scrollView.frame.size.height
        if (CGFloat(targetEdge) + CGFloat(threshold)) > scrollView.contentSize.height {
            // 読み込み中は呼ばない
            if isItemsLoading {
                return
            }
            // トータルの個数よりも多い場合は呼ばない
            if items.count >=  itemsTotalCount {
                return
            }
            // リフレッシュしない
            getItemsRefreshing(false)
            isItemsLoading = true
        }
    
    }
~~~

---

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
ページ遷移時のページ内リンクのスムーススクロール

2021.05.29 修正
codepenのサンプル内からのリンクを別タブで開くと警告されるようになったので、
別でサンプルHTMLを準備しました

---

よく出回ってる``hoge.html?id=sec01``など、URLのクエリパラメータでIDを指定するようなURLでページ内アンカーをさせるやり方はアクセシビリティ、マシンリーダブルの面では疑問です。
JavaScriptをOFFにされてもきちんと動作し、またGoogleなどのbotにも適切な箇所にリンク先を指定できるページ内アンカー(#id)で指定する方が好ましいと個人的に考えてます。

✕悪い例
`<a href="hoge.html?id=sec01">`
◎良い例
`<a href="hoge.html#sec01">`

なので素直にハッシュ(#)でID指定してページが自動スクロールするJavaScriptをjQueryで書きました。

# Sample
~~https://codepen.io/garyuten/pen/rwOGzJ?editors=1111~~
~~サンプル内のリンクを右クリック→別タブで開く でスクロールするのがわかると思います。~~

このリンクを別ウインドウで開いてみてください。ページ下までスムーススクロールするはずです。
https://blog.cgfm.jp/garyu/appendix/sample/jquery/page-scroll.html#page06


# CodePenのサンプルコード

<p class="codepen" data-height="793" data-theme-id="dark" data-default-tab="js,result" data-user="garyuten" data-slug-hash="rwOGzJ" style="height: 793px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="smooth-scroll to page anchor on pade load">
  <span>See the Pen <a href="https://codepen.io/garyuten/pen/rwOGzJ">
  smooth-scroll to page anchor on pade load</a> by Garyuten (<a href="https://codepen.io/garyuten">@garyuten</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# JavaScript

```js
$(document).ready(function(){
  //URLのハッシュ値を取得
  var urlHash = location.hash;
  //ハッシュ値があればページ内スクロール
  if(urlHash) {
    //スクロールを0に戻す
    $('body,html').stop().scrollTop(0);
    setTimeout(function () {
      //ロード時の処理を待ち、時間差でスクロール実行
      scrollToAnker(urlHash) ;
    }, 100);
  }
  
  //通常のクリック時
  $('a[href^="#"]').click(function() {
    //ページ内リンク先を取得
    var href= $(this).attr("href");
    //リンク先が#か空だったらhtmlに
    var hash = href == "#" || href == "" ? 'html' : href;
    //スクロール実行
    scrollToAnker(hash);
    //リンク無効化
    return false;
  });
  
  // 関数：スムーススクロール
  // 指定したアンカー(#ID)へアニメーションでスクロール
  function scrollToAnker(hash) {
    var target = $(hash);
    var position = target.offset().top;
    $('body,html').stop().animate({scrollTop:position}, 500);
  }
})
```