OmniAICreator/Qiita-1.07M huggingface dataset:
Django で、URLリゾルバのビュー名を列挙するコード

Django の URL 解析機 (URLリゾルバ) で使うURL名 ( reverse() の第一引数に入れるやつ )の一覧を表示するコード

```python
from django.urls.resolvers import get_resolver
root_resolver = get_resolver()

def _join_namespace(a, b):
    return (a + ':' if a else '') + (b or '')

def _print_resolver(namespace, resolver):
    _namespace = _join_namespace(namespace, resolver.namespace)
    for ns, (prefix, res) in resolver.namespace_dict.items():
        _print_resolver(_namespace, res)
    for n, l in resolver.reverse_dict.items():
        if callable(n):
            continue
        print(_join_namespace(_namespace, n))

_print_resolver('', root_resolver)
```

結果

```text
admin:blog_blogpost_delete
admin:blog_blogpost_add
admin:auth_user_changelist
admin:galleries_gallery_delete
admin:form_lottery_electedformentry_delete
admin:contact_contact_changelist
admin:redirects_redirect_add
admin:datastructure_datastructurepage_changelist
admin:forms_form_changelist
admin:pages_richtextpage_change
admin:pages_link_change
admin:blog_blogpost_change
admin:datastructure_datastructure_changelist
admin:datastructure_datastructure_history
admin:news_newscategory_delete
admin:auth_group_delete
admin:blog_blogcategory_history
admin:pages_richtextpage_changelist
admin:auth_user_add
admin:sites_site_change
admin:sites_site_changelist
admin:forms_form_delete
admin:form_lottery_electedformentry_changelist
admin:login
admin:galleries_gallery_add
admin:news_newsarticle_add
admin:conf_setting_change
admin:pages_page_change
admin:pages_page_changelist
admin:sites_site_delete
admin:redirects_redirect_history
admin:galleries_gallery_change
admin:blog_blogcategory_add
...
```
batファイル > プロセスの起動時刻を表示する > powershell使用

```txt:動作環境
Windows 7 pro
```

USBメモリを挿して、クリック一つで特定のプロセスの起動時刻を見たい。

参考 [バッチファイルから PowerShell を呼び出す方法](http://qiita.com/cd01/items/82829ba0ec0f59e1b04d)
参考 [Get-Process bds | Select-Object StartTime](http://qiita.com/7of9/items/1bcd1336156ac528c728)

- 準備
  - checkStartTime.ps1を作る
  - checkStartTime.batを作る
- 運用
  - ps1とbatが入ったUSBメモリを挿す
  - checkStartTime.batをクリック

例として「bds.exe」を見るコード

grepを使うのは環境依存で、Select-Objectを使う方がいいことを@yumura_sさんに教えていただきました。

```checkStartTime.ps1(間違い)
Get-Process bds | Format-List * | grep StartTime
```

```checkStartTime.ps1(正しい)
Get-Process bds | Select-Object StartTime
```

```checkStartTime.bat
powershell -NoProfile -ExecutionPolicy Unrestricted .\checkStartTime.ps1
pause
```

pauseを入れることで、表示を止める。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1369630d-1c4b-b0e9-eeeb-d1bdd84b20dd.png)

USBメモリを挿せないシステムは検討していない。
su失敗してくるグローバルIPアドレスをランキング表示

##環境
- CentOS7


「最後の正しいログインの後に 33 回の失敗ログインの試行があります」とメッセージが表示されたのでlastbで確認してみたところ、数万件以上のグローバルIPアドレスからsu試行が確認されたので、慌ててIP制限しました。

## IPアドレスでランキング

lastbの結果だと空白区切りだったのでカンマ区切りに変換して出力。

`# lastb | tr -s ' ' ',' > lastb_log.txt`

```
# ls -ltr
total 7176
-rw-r--r-- 1 root root 7344672 Sep 21 17:23 lastb_log.txt
```

3カラム目をソートしてカウントしたものから上位10個を出力。

`# cat lastb_log.txt |cut -f 3 -d ',' | sort |uniq -c|sort -nr|head -10`

```
  44541 xxx.xxx.xxx.xxx
  12015 xxx.xxx.xxx.xxx
   8664 xxx.xxx.xxx.xxx
   7074 xxx.xxx.xxx.xxx
   6319 xxx.xxx.xxx.xxx
   6192 xxx.xxx.xxx.xxx
   5049 xxx.xxx.xxx.xxx
   4722 xxx.xxx.xxx.xxx
   1792 xxx.xxx.xxx.xxx
   1792 xxx.xxx.xxx.xxx
```

ちょっと多すぎたので今日の分だけでランキング。

`# grep 'Sep,21' lastb_log.txt | cut -f 3 -d ',' | sort |uniq -c|sort -nr|head -10`

```
676 xxx.xxx.xxx.xxx
141 xxx.xxx.xxx.xxx
 52 xxx.xxx.xxx.xxx
 22 xxx.xxx.xxx.xxx
 12 xxx.xxx.xxx.xxx
 11 xxx.xxx.xxx.xxx
  8 xxx.xxx.xxx.xxx
  3 localhost
  2 xxx.xxx.xxx.xxx
```

これらをhosts.denyに追記っと。
powershell > プロセス(例としてbds.exe)の起動時刻を知る > Get-Process bds | Select-Object StartTime

```txt:動作確認
Windows 7 pro
```

プロセスの起動時刻を知りたい。

## 間違い

bds.exeというプロセス起動時刻を見たい場合は、Powershellにて以下を実行する。

```
PS >
PS C:\Users\xxx> Get-Process bds | Format-List * | grep StartTime
STDIN
StartTime                  : 2016/09/21 17:17:24 
```

参考 [PowerShell/プロセスの詳細な情報を取得する方法・Get-Process, Format-List](http://win.just4fun.biz/PowerShell/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E8%A9%B3%E7%B4%B0%E3%81%AA%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%83%BBGet-Process,%20Format-List.html)

## 改良版

上記のgrepはC++ Builderインストール時に入ったものでした。
通常のWindowsではないものです。

@yumura_sさんの[コメント](http://qiita.com/7of9/items/1bcd1336156ac528c728#comment-8a4bb476b8e6eb8ef4e0)の方法が良さそうです。
Bash on Ubuntu On Windowsのデフォルトシェルをzsh、あるいはtmuxにする（別解）


zshを使うようになって久しいので、Windowsでもbashではなくzshを使いたいものです。

やりかたはすでにいろいろ挙がっています

- [Ubuntu on Windows で zshをデフォルトシェルにする](http://qiita.com/nsmr0604@github/items/7dd38faed1abd9189a83)
- [Windows10のbashをzshで起動するように変更する](http://qiita.com/yutaszk/items/ca0425456b5027d2ee0e)

ここでは、Windows側からアプローチしてみます。

# ステップ1 ショートカットを開く

[Start] > [Bash on Ubuntu on Windows]を右クリック > [More] > [Open File Location]を選びます。

![bash1.png](https://qiita-image-store.s3.amazonaws.com/0/59475/2578a9c2-204f-352c-d211-de4ddb87a311.png)

# ステップ2 ショートカットのプロパティを開く

Bash on Ubuntu on Windowsファイルを右クリックして[properties]を選びます。

![bash2.png](https://qiita-image-store.s3.amazonaws.com/0/59475/2a753554-f634-1526-5c45-345487c22b6e.png)


# ステップ3 ターゲットを変更

Targetを次のように変更します。

```text:変更前
C:\Windows\System32\bash.exe ~
```

```text:変更後
C:\Windows\System32\bash.exe ~ -c zsh
```

![bash3.PNG](https://qiita-image-store.s3.amazonaws.com/0/59475/885d19cd-c93a-fa9d-fcd5-ef24bd175636.png)

ここで`zsh`と書かずに`tmux`と書けば、いきなり`tmux`が起動します。


# おしまい

スタートメニューからBash on Ubuntu on Windowsを選んでみてください。
もしすでにタスクバーへピンどめしているときは、もう一度ピンどめしなおしてください。
お疲れ様でした。
JAWS-UG コンテナ支部 #6 デモ

# デモ

## 概要

**ECS / CodeDeploy** を使い、2 つのサービスを自動デプロイしてみます。

Web サービスは ECS を使ったローリングアップデート、
API サービスは CodeDeploy を使った停止時間ありのアップデート。

## デプロイの流れ

1. アプリケーションソースコードを修正
2. GitHub へ
3. リリースしたいタイミングで **タグを打つ**
4. CircleCI で Docker イメージ生成
5. テストが通ったら ECR へイメージをプッシュ
6. ECS / CodeDeploy によるサービス自動更新

## デモアプリ接続先（v1.0）

まずはいずれも、ハローワールドが返ってきます。

* Web サービス  
~~http://d3jz5z68tvtraa.cloudfront.net/~~  
* API サービス  
~~http://d3jz5z68tvtraa.cloudfront.net/api/~~

## アプリバージョンアップ

1. 今回は単に `Dockerfile` を書き換えてみます。  
（本来ここでソースコードをガリガリ書く）
2. git で `api-v0.1` などとタグを打ちます。

以上

## デモアプリ接続先（v2.0）

Web は v2.0 に、API は画像の推論サービスになりました。
（結局サービス間が繋がってないのはご容赦ください・・）

* Web サービス  
~~http://d3jz5z68tvtraa.cloudfront.net/~~  
* API サービス  
~~`curl -XPOST --data-binary @画像.png http://d3jz5z68tvtraa.cloudfront.net/api/classify`~~

# 補足

## 今日のコンテンツは公開しています

https://github.com/supinf/containers-on-aws

## このリポジトリ何？

<img width="500" alt="demo.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/ec83b33f-0a58-f103-9b68-308f9f7a3d24.png">

こんな構成となる

* CloudFormation テンプレート
* ECS / CodeDeploy への命令を記載した circle.yml
* CodeDeploy の appspec.yml とデプロイ用スクリプト
* Dockerfile や docker-compose.yml

## 試してみるには

1. GitHub と CircleCI にアカウント登録します
2. 上記リポジトリを fork し、CircleCI にプロジェクト登録
3. CloudFormation でスタック生成
    * VPC、SG、ECR => `/common/provision/cfn-common.yml`
    * CodeDeploy、ASG、S3、AS => `/app-api/provision/cfn-codedeploy.yml`
    * ECS、ASG、ALB、CF => `/app-web/provision/cfn-ecs.yml`
4. `Outputs` 欄を見ながら CircleCI に環境変数設定
5. `git push` & `git tag`

## テンプレートだけではできていないこと

デモのために、一部マネコンなどで作業しました。

* API サービスの初期デプロイ（タグ打ち）
* CloudFront ディストリビューションへ、API サービスを追加

## 破棄するには

CloudFormation スタックを削除してください。

## 画像推論サーバについて

NVIDIA 社の [GPU REST Engine](https://developer.nvidia.com/gre) を使っています。
各クラウドのコグニティブ API などとは違い、DL による**学習ができ**
**そのモデルに基づいた推論** を HTTP プロトコルで自前提供できます。

（g2.2xlarge をスポット MAX $0.5/hour で起動設定しているので
　試す際にはお気をつけください。高いかも、起動しないかも）
boombox.jsで発生してしまったバグなどを直す

#IE対策
IE9,10等についても対応しているが
boombox.jsのspriteを利用したが音声が流れなかった。

仕方がないので、サンプルのmixのようにそれぞれ音声わけて設置した。
今回は2つだけ。もともとあまりspriteする必要もなかったかも。

```
    var option = [];
    for(var i=1; i <= 2; i++)
    {
        option['options'+ i] = {
            src: [{
                "media": "audio/mpeg",
                path: `/sound/sound#{i}.mp3`
            }]
        };
        boombox.load('sound'+i, option['options'+i], function(err, htmlaudio) {
        });
        boombox.get("radio"+i).volume(1);
    }
```
#IE9対策
console.logがあると、不具合がでるので全部コメントアウトにした。
→コンソールをひらいた時のみ正常に動くっていう謎現象

# スマホ対策
スマホがclick時じゃないとloadがされないっていう仕様があるらしい。
boomboxだと先に読み込んで load true or falseのフラグを追加して再生を分けてるので変えた

- boombox.js に追加

```
Boombox.prototype.changeStateLoad = function (name) {
    this.pool[name].state.loaded = true;
};
```

- click eventのところに追加

```
boombox.load('sound1', option['options1'], function(err, htmlaudio) {});
boombox.changeStateLoad("radsound1o1");
```
もしかしたらloadいらないかも？

多分他にいい方法あるんだろうなーと思いつつ。
メジャー音声ブラウザ「PC-Taker」を試してみる。

※随時更新中
##PC-Takerとは？
・視覚障がい者が利用する音声ブラウザー。国内シェアは「PC-Talker」と「ホームページリーダー」という２つのアプリケーションで60%以上のシェアを占めている。
　参考：http://www.ibnet.ne.jp/blog/2008/01/10-ogawa.html
・高知システム開発さんへ問い合わせして試用版を郵送していただきました。
参考:http://www.aok-net.com/screenreader/

##試用にあたって知りたかった事
・アクセシビリティー対策を行ったWebsiteのhtmlソースが、実際どのように処理されるのか体験したい。
・視覚障がいを持った方が実際どんな形で音声ブラウザを利用しているのかを知りたい。
・アクセシビリティー対策のソースってバリデート以外本当正しいのか確認できなくない？という疑問をもったから。

##試用環境
Windows10

##試用してみて気づいたこと
・インストールしてみると単体のアプリケーションではなく、OS全体にかかわるものだった。
・スクリーンリーダー総合環境をOSに入れると考えたほうがよさそう。
・OSの音量をOFFにしても、シャットダウン時に音量設定が自動でONになり音声ガイダンスが流れる。
・同じくOS起動時にも音声ガイダンスが流れる。
・読み上げスピードの設定幅は予想より広く、トップスピードは聞き取れる限界の早口だと思います。

##導入難易度
・設定のハードルが結構高め
・とりあえず初期設定状態でそのまま使ってみようと思う。

##実際にWebコンテンツを閲覧してみて
・とりあえず目をつぶって試してみるが、音の洪水に慌てる
・アクセシビリティー対策でhtmlソースによく導入する、メインメニューをスキップするリンクが見つけられない
・Webブラウジングにはインターネットエクスプローラー利用が前提っぽい。
・とりあえずTABキーの連打でいろいろ試してみるが、難しい・・
・使いこなすには一定の練度が必要なことはわかった

参考サイト：
http://www.aok-net.com/screenreader/
http://website-usability.info/2010/03/entry_100308.html
Swiftで NSDate ⇔ Long(Int64) 相互変換する方法

## 目的 ##
 日時をLong(Int64）にしたかっただけなのに、
他言語なら調べると簡単に見つかるのにSwiftだとなかなか見つからなかった

例えば、Ruby, Java, JavaScriptなら...

### Ruby ###
```rb
Time.new.to_i * 1000
# => 1474443262000（ミリ秒に合わせるために1000をかけました）
```

### Java###
```java
new java.util.Date().getTime()
// => 1474443315450
```

### JavaScript(Node.js) ###

```js
Date.parse(new Date())
// 1474443474000
```

といった感じで簡単に`Date`から`Long`(`Int`)に変換できる

## SwiftでのNSDate⇔Int64の相互変換 ##

以下のコードが動くようなExtensionです


```swift
date.toInt64()   // NSDateからInt64へ
int64.toNSDate() // Int64からNSDate
```

```swift
extension NSDate{
  // NSDate -> Int64
  func toInt64() -> Int64{
    return Int64(timeIntervalSince1970 * 1000)
  }
}

extension Int64{
  // Int64 -> NSDate
  func toNSDate() -> NSDate{
    return NSDate(timeIntervalSince1970: Double(self / 1000) + Double(self % 1000)/1000)

  }
}
```

## 動作確認 ##

```swift
let date  = NSDate()
let int64 = date.toInt64()

print("date    : ", date)
print("toInt64 : ", int64)
print("toNSDate: ", int64.toNSDate())
```


出力
`Int64`に変換して逆変換で`NSDate`にちゃんと戻っていることが確認できました

```
date    :  2016-09-21 8午前8:07:47 +0000
toInt64 :  1474445267102
toNSDate:  2016-09-21 8午前8:07:47 +0000
``` 

## ~~問題点~~ 解決済み（2016/09/27） ##

~~ごめんなさい、問題点があります
`Double()`で`Int64`の値を`Double`にすると少し値の精度が落ちてしまいます
そのため、`Int64#toNSDate()`はおそらくミリ秒の部分で多少の誤差が発生してしまうと思われます。~~

上記の問題点は@nisinさんのお力によって無事に解決しました！@nisinさんありがとうございます！

詳しい変更はこちらの変更履歴をご参照ください
http://qiita.com/nwtgck/items/2689cc6e7cb339757d1c/revisions/3



## 参考にしたところ ##
* http://qiita.com/Kenya/items/ba8a19f84a830f229e1b
* http://qiita.com/alpha22jp/items/676dca97ad54b86645e7
djangoとuwsgiとnginxを使って、複数のアプリを公開する時の話

## uwsgiとnginxを使って、複数のアプリを公開

社内で、開発環境や、ステージングなどを同じ環境で、URL分けて使いたい

とか

個人プロジェクト同一URLだけど、プロジェクトとしては分けて開発してる

とか

ポートを分けないで、サーバ内で振り分ける場合の設定についてのメモ

```nginx.conf
http {
    ...
    server {
        listen       80;
        server_name  localhost;

        # 下記は、http://xxxxxxxx/app/にアクセスされることを想定
        location /app/ {
            include uwsgi_params;
            uwsgi_pass unix:/tmp/uwsgi.sock;
        }
    ...
```


```uwsgi.ini
[uwsgi]
# 下記は、manage.pyがあるディレクトリ
base = /root/demo

# the base directory (full path)
chdir           = %(base)
# 下記にbaseからみた、wsgiファイルを指定(core.wsgiの部分)
module          = core.wsgi:application

# 下記にpyenvなどのパスを指定
home            = /root/.pyenv/versions/sample

# process-related settings
# master
master          = true

# maximum number of worker processes
# デモ用なので1を指定
processes       = 1
# the socket (use the full path to be safe
# nginxの設定とあわせてsockファイルが生成されるように指定
socket          = /tmp/%n.sock

pidfile=          %(base)/pr.pid

# ... with appropriate permissions - may be needed
chmod-socket    = 666
# clear environment on exit
vacuum          = true

touch-reload = %(base)/.uwsgi_touch

daemonize= /var/log/wsgi.log

# 下記は、settingsの指定が必要な場合のみ追記
env = DJANGO_SETTINGS_MODULE=core.master_settings
```

上記で作成したiniファイルをオプションで指定して実行
```
uwsgi --ini /root/sample/core/uwsgi.ini
```
Vagrant + VirtualBox + CentOS6.x で困っていること

誰か助けて欲しいという内容です。

1. Guest Additions が入らないことに起因するっぽいエラー

現状：エラー表示後に以下を実行してから再起動（`vagrant reload`）している。

```zsh:HostOS
vagrant ssh
```

```zsh:CentOS
sudo yum -y update kernel
sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
exit
```

2. プロビジョニングで Passenger が入らない

* カーネルのバージョンを上げる
* SELinux を無効にする 

のどちらかが必要と言われる。

[Installing Passenger + Nginx on Red Hat 6 / CentOS 6 (with RPM) - Passenger Library](https://www.phusionpassenger.com/library/install/nginx/install/oss/el6/)

カーネルのバージョンを上げられれば問題なさそうだけど指定のバージョンにするのがちょっと大変そうだった。
SELinux を無効にするには再起動が必要 ……

以上、2点が原因で、コマンド叩いてしばらく放置ということができず困っています ……
こんどこそわかる(肯|否)定(先|後)読み

# それなに

正規表現の話です。
検索ワードの前後にも条件をつけるときに使う。
なんとなく解らないのでなんとなく敬遠するもののひとつ。

- 肯定先読み
- 否定先読み
- 肯定後読み
- 否定後読み

日本語訳した人には申し訳ないが、直感的じゃないので忘れることにする。

書き方      | 意味
-----------|----------
(?=regex)  | 直後にregexが**ある**
(?!regex)  | 直後にregexが**無い**
(?<=regex) | 直前にregexが**ある**
(?<!regex) | 直前にregexが**無い**

要するに、基本系が`(?=regex)`で、否定なら`!`にして、直前なら`<`を追加する。

例）
(?<**=**_hoge_)foo(?**!**_bar_) → 直前に_hoge_が**あり**、直後に_bar_が**無い**`foo`にマッチ
(?<**!**_hoge_)foo(?**=**_bar_) → 直前に_hoge_が**無く**て、直後に_bar_が**ある**`foo`にマッチ

構文の中に丸括弧とかいろいろあるけど、マッチする箇所が`foo`だけなのが重要なところです。


# いつ使うのよ

大量の名前リストから「しむらけん」を「バカ殿様」に置換することが年に2回くらいあると思いますが、

```bash
cat regex.ja                                                                                                                                                                                                                    
にしむらけんたろう
にしむらけん
しむらけんたろう
しむらけん
```

ふつうにやると「にしむらけんたろう」とか「にしむらけん」とか「しむらけんたろう」にもマッチしてしまいます。

```bash
cat regex.ja | perl -pe 's/しむらけん/バカ殿様/'
にバカ殿様たろう
にバカ殿様
バカ殿様たろう
バカ殿様
```

だめだこりゃ。「しむらけん」のみを「バカ殿様」に修正するには

```bash
cat regex.ja | perl -pe 's/(?<!に)しむらけん(?!たろう)/バカ殿様/'
にしむらけんたろう
にしむらけん
しむらけんたろう
バカ殿様
```
だっふんだ。

# おまけ：GNU と BSD

Mac の人はそのままだと grep で Perl 風正規表現が使えないかもしれないので、GNU版 grep 入れるといいよ。

```bash
-P, --perl-regexp         PATTERN is a Perl regular expression
```

brewがあれば、これで。

```bash
brew install homebrew/dupes/grep
```

```bash
alias grep='ggrep --color'

cat regex.ja | grep -P '(?<!に)しむらけん(?!たろう)'                                                                                                                                                              
しむらけん
```


# 参考にしたサイト

https://regex101.com/
https://www.regexpal.com/
https://www.rexegg.com/regex-lookarounds.html

あいーん。
fileコマンドを使ってみた

拡張子がjpgになっているけどjpg用の処理ができないつって
実は拡張子がjpgなだけどpng画像だったなんてことがありました。

慌てず騒がずまずは事実確認。
そう、ファイルの情報を見るときはfileコマンドを利用するのです。


```sh:拡張子をjpgに変えたpng画像の例
$ file /path/to/fake/img/01.jpg
```
ちゃんとPNG image dataとして判定されている
>/path/to/fake/img/01.jpg: PNG image data, 960 x 330, 8-bit colormap, non-interlaced



参考
http://webkaru.net/linux/file-command/
openldap と SSL/TLS と オレオレ認証局と。

openldap で SSL/TLSを利用しようとすると、当然証明書が必要になります。
そこで、テストのためにオレオレ認証局をたてて、オレオレ証明書を発行するわけですが……

そのままだとldapsearch ldaps://host みたいなことをするとエラーが出ます。
で、
/etc/openldap/ldap.conf
に

<pre>
TLS_REQCERT   never
</pre>

とか入れちゃうわけですが、これはあんまり筋が良くない気がします。

そこで、オレオレ認証局の証明書を
/etc/openldap/certs/あたりに入れて
<pre>
ln -s /etc/openldap/certs/オレオレ証明書 /etc/openldap/certs/\`openssl x509 -noout -hash -in /etc/openldap/certs/オレオレ証明書`.0
</pre>
とかsymlinkを追加しましょう。
あとは
/etc/openldap/ldap.conf
に

<pre>
TLS_CACERTDIR   /etc/openldap/certs/
</pre>

と書いておきましょう。
これでオレオレ認証局の発行したオレオレ証明書でもエラーが出ません！
(不要になったら証明書とsymlinkを削除しましょう)

なんでsymlinkがいるのかというと、Opensslが証明書を探すときのファイル名が
<pre>
\`openssl x509 -noout -hash -in オレオレ証明書`.0
</pre>
だからです。
ハッシュ値が被ったら.1 .2 .3 と増えていくんだろうなって。
無料のdockerホスティングサービスArukas上にhubotを立てる

adapterはslackを想定しています。

webhookみたいなのを作ったときにアクセス制限などがなく、晒状態になるので、制限をかけないと実運用状は危険かと思いますので、ご了承ください。

# 環境
- MacOSX 10.11.6
- homebrew
- node v4.2.1
- npm 2.14.7

# 手順

## 諸々インストール
```bash
$ brew install node # node環境のインストール
$ npm install -g yo # yeomanのインストール
$ npm install -g generator-hubot # hubotジェネレーターのインストール
$ npm install -g hubot hubot-slack coffee-script # その他使うもの
```

## hubotの作成
```bash
$ mkdir arukas-hubot && cd arukas-hubot
$ yo hubot
```

`Bot adapter`は`slack`を指定。

## dockerコンテナのビルド

`Dockerfile`を[arukas-hubot/Dockerfile](https://github.com/ushios/arukas-hubot/blob/master/Dockerfile)からコピーして、同じものを作り以下のコマンドを叩きます。

```bash
$ docker build -t arukas-hubot .
```

ビルドが成功したら、コンテナ上でhubotを対話モードで立ち上げて動作確認をする。

```bash
$ docker run -v $(pwd):/hubot -it -p 9999:9999 arukas-hubot bin/hubot 

...

arukas-hubot> arukas-hubot ping # pingで動作確認
arukas-hubot> pong
```

## docker-hubへプッシュ

動作確認が出来たらgithubにプッシュします。今回は以下のリポジトリを使います。
https://github.com/ushios/arukas-hubot

docker-hubにもリポジトリを作成
https://hub.docker.com/r/ushios/arukas-hubot/

<img width="860" alt="スクリーンショット 2016-09-21 13.57.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/2129/fd602089-4660-7933-764e-07081d7cdb5c.png">
ビルドが成功しているのを確認。

## Arukasにアプリケーションを追加する

### 入力項目

以下のようにアプリを作成し、起動させる

| name | value |
| ---- | ----- |
| App Name | 任意 |
| Image | ushios/arukas-hubot |
| Instances | 1 |
| Memory | 512MB |
| Endpoint | 任意 |
| Port | 9999/tcp |
| Env | 主に使用する環境変数を参照 |
| CMD | 空 | 

### 主に使用する環境変数

|  env | 用途 |
| ---- | ---- |
| HUBOT_SLACK_TOKEN | slackが発行するトークン |
| HUBOT_SLACK_TEAM | slackチーム名 |
| HUBOT_SLACK_BOTNAME | slack上で使用されるbotの名前 |
| PORT | 9999 |

HUBOT_SLACK_TOKENの取得方法は[こちら](http://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a#hubot%E3%81%AE%E8%BF%BD%E5%8A%A0)

<img width="1027" alt="mozaiku.png" src="https://qiita-image-store.s3.amazonaws.com/0/2129/e65c74ae-12ba-61cf-0e8f-40adaad15d86.png">

## 起動確認

あとはbotに対してpingとテキストでうってあげるとお返事をしてくれるはずです。

<img width="302" alt="スクリーンショット 2016-09-21 16.22.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/2129/c7202dce-efee-be3a-8b5f-f050aa849389.png">


# 参考
- [Docker + Yeoman + Hubot + Slack で簡単bot作成](http://blog.fenneclab.com/blog/docker-yeoman-hubot-slack/)
- [HubotでSlackのボットを作成する](https://www.seeds-std.co.jp/seedsblog/2125.html)
- [SlackのBot(hubot)を作ってみる - hubotの追加](http://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a#hubot%E3%81%AE%E8%BF%BD%E5%8A%A0)
[Ruby] File operations memo

Some memo when doing some file operations with ruby.

```rb
# Get files recursively
Dir.glob("**/*.txt") do |f|
  # Do something..
end

# Directory check
Dir.exist?(directory_name)

# File check
File.exist?(file_name)

# Get file name from path
File.basename(path)

# Get directory name from path
File.dirname(path)

# Create directory recursively
FileUtils.mkdir_p(dir_path)

# Copy
FileUtils.cp(source_file, destination_dir)

# Any command
`mv #{source} #{destination}`
```
Windowsでmakeコマンドを使う

# Windowsでmakeコマンドを使う
本記事ではmakeコマンドをインストーラでインストールする手順を紹介します。

## 環境とかインストールするものとか
- Windows8.1
- make (3.81) ※最終更新日 2006年11月25日

## 手順
1. [公式サイト](http://gnuwin32.sourceforge.net/packages/make.htm "Make for Windows") からインストーラをダウンロード (Complete package, except sources の SetUp から) する。
2. インストーラ (make-3.81.exe) を起動し、手順に従いインストールする。
  - インストール先をコピーしておくと良い。
3. 環境変数を設定する。
  - 末尾に"**インストール先 + \bin**" を追記する。
  ※末尾に "**;**" がついていない場合はつけてから。
  
### 環境変数の設定方法
※Windows8.1の場合
まず、下記の順に移動し環境変数の設定画面へ移動する。
`コントロールパネル ->　　システムとセキュリティ -> システム -> システムの詳細設定 -> 環境変数`

次に、Pathという変数を下記のように編集する。

- 末尾に"インストール先 + \bin" を追記する[^a]。 
- ※末尾に "**;**" がついていない場合はつけてから。
- 初期設定のままインストールした場合は`C:\Program Files\GnuWin32\bin`
- ※x86の場合は`C:\Program Files (x86)\GnuWin32\bin`
- コマンドプロンプトやPowershellを開いている場合は再起動する。

以上

#### 参考
[コマンドプロンプト で makeコマンドを使いたい - Bye Bye Moore](http://shuzo-kino.hateblo.jp/entry/20120510/1336613138)
【GAS】エラー「ArrayをObject[][]に変換できません。」に遭遇したら・・・

　GASでたまに遭遇するエラーですが直面して悩んでいる人向けに投稿しておきます。

　1次元配列を定義し、シート上の特定の範囲に一気にsetValues()しようとしたり、シートから特定の範囲のデータをスクリプト上にgetValues()で引っ張ってきて、いろいろと加工してまたシート上の特定の範囲にsetValues()させようとする場合にうっかりやってしまいがちなミスです。

　たとえば以下は失敗例で標題のようなエラーが表示されるはずです。

```js:コード.gs

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();

function test() {
  var fruits = ["オレンジ","ぶどう","バナナ"];
  sh.getRange(1,1,fruits.length,1).setValues(fruits);
}

```

　これは最初から2次元配列として定義するか、1次元配列を2次元配列化してからsetValuse()して解決します。

```js:コード.gs

// 最初から2次元配列として定義する
function test() {
  var fruits = [["オレンジ"],["ぶどう"],["バナナ"]];
  sh.getRange(1,1,fruits.length,1).setValues(fruits);
}

// 2次元配列化してからsetValuse()に渡す
function test() {
  var fruits = ["オレンジ","ぶどう","バナナ"];
  var ary = [];
  for (var i=0; i<fruits.length; i++) {
    ary.push([fruits[i]]);
  }
  sh.getRange(1,1,ary.length,1).setValues(ary);
}

```

　2次元配列化する場合、[fruits[i]]のところ、単にfruits[i]とやってしまいがちなので注意が必要となります。空の配列に配列をpushしないと2次元配列になりませんので。[]で包んで配列としてpushします。シートの見た目は1列、1行でも2次元配列じゃないとうまく渡せないところが最初のうちはうっかりハマってしまいがちかなと思います。

　ちなみに上記は縦に展開することを前提にしていますが、横に展開したい場合は以下の通り。

```js:コード.gs

// 最初から2次元配列として定義する
function test() {  
  var fruits = [["オレンジ","ぶどう","バナナ"]];
  sh.getRange(1,1,1,fruits[0].length).setValues(fruits);
}

// 2次元配列化してからsetValuse()に渡す
function test() {
  var fruits = ["オレンジ","ぶどう","バナナ"];
  var ary = [[]];
  for (var i=0; i<fruits.length; i++) {
    ary[0].push(fruits[i]);
  }
  sh.getRange(1,1,1,ary[0].length).setValues(ary);
}

```

　横に展開というのはこうゆうことです。あまり使う機会はありませんが、タイトル行をまとめて渡したい場合などに使うかと思います。

![スクリーンショット 2016-09-24 14.39.21.png](https://qiita-image-store.s3.amazonaws.com/0/139134/f83c6435-ea42-2bbb-2b8e-fd3d773674ac.png)

　要するに、A1は[0][0]、A2は[1][0]、A3は[2][0]、B1は[[0][1]、C1は[0][2]といった具合に、[行][列]というふうに考えておけばよいだけかなと思っています。R1C1と同じことか。
macOS SierraにしたらGitコマンドが動かなくなった


先ほどmacOS Sierraにアップデートしてみました。
色々あるけどとりあえずgitが動かなくなったので解消メモです。

[こっちにも書きました。](https://dotstud.io/blog/macos-sierra-update-process/)

```bash
$ git
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

ってエラーが出ました。

[El Capitanにしたらgitコマンド(CUI)が動かなくなった。](http://qiita.com/Ys_Jn/items/f7ff03f7a890329c3e2a)の記事に助けられました。

全く同じ問題っぽいですね。

```bash
$ xcode-select --install
```

を実行するとインストーラが立ち上がるのであとは流れに任せれば完了です。

![](https://i.gyazo.com/421e8fb8d5e73cfb715d5f1e93466764.png)


これでgitが動きました。

```bash
$ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
           ・
           ・(省略）
           ・
```

焦ったぁ。。。
【CSS設計】SMACSSとBEMを少しアレンジ


全てがアレンジではないが、ところどころ変えてみた。
自分のための覚書。

#レイアウト

`.l-` を使う。
また、`id` でなく `class` 名にする。
（同じ部分を他の頁でも使いまわしたりすることもあるので。）

#BEM

##Elementは`__`じゃなく`_`で書く

ただし、Modifierの `--` を `-` にはしない。

###理由

誰かが書いたコードを追記する際の混乱を防ぐため。
自分は名前をつけるとき`sessionDetail`とキャメルケースを好んで使うが、人によって`session-detail`のように`-`を使うことがある。
（`_`も可能性としてはあるが、`-`よりは低いように思う）

##~~長い要素名は短縮する~~

~~`contentBox_nameArea` の下 `name` `kana` 要素を追加するとき。~~

```html:index.html
<div class="contentBox_nameArea">
	<p class="contentBox_nameArea_name"></p>
	<p class="contentBox_nameArea_kana"></p>
</div>
```

~~としてもよいが、長い。~~
~~なので~~

```html:index.html
<div class="contentBox_nameArea">
	<p class="cB_nameArea_name"></p>
	<p class="cB_nameArea_kana"></p>
</div>
```

~~と頭文字を利用して略す。~~

##追記：ネストを深くしすぎない

１つ前の「長い要素名は短縮する」を削除した理由でもある。
[詳細度の高いCSS（Sass）はやめたほうがいい](http://qiita.com/shosho/items/e52683f1ef441b4ae136 "詳細度の高いCSS（Sass）はやめたほうがいい")と書いたが、BEMでも同じ。
上記のようなコードはDOMに依存しているため、レイアウトを少しでも変更するとクラス名も変更しなければならなくなる。
ネストの深いBEMでクラス名をつけてしまうのなら、CSSでDOMに依存しないクラスを作ったって意味がない。
【Swift】オプショナルバインディングでネストを避ける

最近、「シャドーイング」という言葉を知ったので、覚え書きと教えてくれた人への感謝の気持ち込めて投稿します。技法自体は知っていたのですが、「シャドーイング」と呼ばれていることを知らなかったんですね。
簡単に試せるように、Playgruond上で実行できるようにコードを記述しています。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

## オプショナル型の変数
オプショナル型があるSwiftには、変数の名前で困ることがあります。
例えば

```swift:変数定義
var value: Int?
value = 123
```
とすると、この変数valueはオプショナルIntなので、nilになる可能性があります。
オプショナルであることがわかりやすい変数名にすればいいかもしれませんが、そうするとnilでない値が保証されている時に煩わしいことになります。

## オプショナルバインディング
コードを記述していくと、途中でこの変数valueをアンラップする際に値がnilかどうかを常に気にしないといけないのが、面倒くさくなってきます。
そこで、オプショナルバインディング（Optional-Binding）という記述方法を使うと、「変数valueがnilでない場合」と「nilだった場合」の処理を分岐できます。

```swift:If-Let構文
let value: Int?
value = 123

if let value = value {
   // コードブロックA: valueがnilでない時の処理
   type(of: value)    // ここでは普通のInt型
} else {
   // コードブロックB: valueがnilだった時の処理
   fatalError()
}

type(of: value)   // この時点でオプショナルInt型
```

### シャドーイング

`if let value = value {                              `

If-Let構文で、同じ名前の定数オブジェクトを使うところが「シャドーイング」です。
この時点で、変数valueは定数valueの影に隠れて見えなくなってしまうんですね。もちろんオプショナルではないことが保証されているので安全です。

If-Let構文を抜けた後では、valueはInt?型（型パラメータで表現するとOptional<Int>）に戻っています。

### Guard-Let構文
同じシャドーイングのようでも、反対な使い方ができるのがGuard-Let構文です。



```swift:Guard-Let構文
let value: Int?
value = 123

guard let value = value else {
   // コードブロックC: valueがnilだった時の処理
   fatalError()
}

type(of: value)   // valueは普通のInt型

```

コードブロックCでは、valueがnilの場合に行う処理を記述します。
ここでは、必ずコードブロックを抜ける処理をしなければいけません。例えばreturn、break...のような。

注目すべきは、Guard-Let構文を抜けた後のvalueです。
この時点で、valueの型はnilでないことが保証された普通のInt型になっています。

## nilチェックとして
If-Let構文とGuard-Let構文はどちらもnilチェックとして使われますが、Guard-Let構文は後発（Swift2.x~で追加）だったので、積極的には使われていない気がします。
「nilでない場合」の処理を記述したいケースを、If-Let構文だけでコーディングするとネストが深くなってしまいコードが読みづらくなってしまいます。

Guard-Let構文と早期returnを活用すると、必要以上にネストせずに安全なコードが書けるので、私のような初心者でもわかりやすいサンプルコードがたくさんできるといいなと思います。
sbt-assembly の io.netty.versions.properties の error

[sbt-aseembly](https://github.com/sbt/sbt-assembly) を使うと

```
[error] (*:assembly) deduplicate: different file contents found in the following:
[error] /Users/ryoco/.ivy2/cache/io.netty/netty-handler/jars/netty-handler-4.0.41.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/ryoco/.ivy2/cache/io.netty/netty-buffer/jars/netty-buffer-4.0.41.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/ryoco/.ivy2/cache/io.netty/netty-common/jars/netty-common-4.0.41.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/ryoco/.ivy2/cache/io.netty/netty-transport/jars/netty-transport-4.0.41.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/ryoco/.ivy2/cache/io.netty/netty-codec/jars/netty-codec-4.0.41.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/ryoco/.ivy2/cache/io.netty/netty-codec-http/jars/netty-codec-http-4.0.41.Final.jar:META-INF/io.netty.versions.properties
[error] /Users/ryoco/.ivy2/cache/io.netty/netty-transport-native-epoll/jars/netty-transport-native-epoll-4.0.41.Final-linux-x86_64.jar:META-INF/io.netty.versions.properties
[error] Total time: 7 s, completed 2016/09/21 15:16:13
```

などと出て困ってたけど、 assemblyMergeStrategy に

```
assemblyMergeStrategy in assembly := {
  case "io.netty.versions.properties" => MergeStrategy.concat
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
```

にしても解決しなかったが、

```
assemblyMergeStrategy in assembly := {
  case "META-INF/io.netty.versions.properties" => MergeStrategy.concat
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
```

にしたら解決した。`META-INF` をつける。
R > 名前付き引数 > seq(to=5,from=1) > 1 2 3 4 5

```txt:動作環境
RStudio @ rollapp
R version 3.3.0
```

関数には「名前付き引数」を使えるようだ。

```R
> seq(to=5,from=1)
[1] 1 2 3 4 5
```
R > rep() > 繰返す

```txt:動作環境
RStudio @ rollapp
R version 3.3.0
```

rep()という繰返しの関数。

```R
> y<-c("zun","zun","doko")
> rep(y,3)
[1] "zun"   "zun"  "doko"  "zun"   "zun"  "doko"  "zun"   "zun" 
[9] "doko"
```
R > 機能マップ (2017-11-16)

Rの機能のマインドマップ。

[マップ @ mindmup](https://atlas.mindmup.com/yasokada/r_funcmap_160921/index.html)

ノードのリンク先からQiita記事へ飛ぶようになっている。

[マップの画像](https://atlas.mindmup.com/yasokada/r_funcmap_160921/thumb.png)


読んでいる本で次から次へと新しい用語が出てくるが、それで止まっていると作業が進まない。
こういうのはマップで整理して適宜使う時に辿るのがいいかと思う。
Three.jsの透過処理でつまずいた点



## 半透明な板で挟んだのに中身が見えない

![スクリーンショット 2016-09-21 12.51.17.png](https://qiita-image-store.s3.amazonaws.com/0/136286/58236f7b-807d-1020-9a3c-64b3e394952c.png "スクリーンショット 2016-09-21 12.51.17.png")

外側のモデル（壁）は`transparent=true`
内側のモデル（蝶）は`transparent=false`
レンダリングのQueueで`transparent=false`が先に描画されるので、蝶だけは透けずに表示される。


## 位置がかぶるとうまくレンダリングされない

上の例で全てのモデルを`position.set(0,0,0)`としていたところ、片方の壁が透過されない状態に。
https://mo49.github.io/qiita/20160908/opacity.html

これを解決するために片方の壁の位置を0.1ずらしてあげることで、両方の壁が透過されるようになった。
https://mo49.github.io/qiita/20160908/opacity.html

> 参考
[JSONモデルを透過させた際に表示に差異がある](https://teratail.com/questions/48780)


## 奥にあるモデルが手前のモデルを上書きしてしまう

`depthTest = false;`

depthTestにfalseを設定すると、奥の物体が手前の物体を上書きするのを防ぐ「陰面処理」が無効になる

> 参考
[多彩な表現力のWebGLを扱いやすくする「Three.js」 (3/5)](http://www.atmarkit.co.jp/ait/articles/1210/04/news142_3.html)
「オフラインリアルタイムどう書く第13回(積み木の水槽)」の問題を解いてみた


[横浜へなちょこプログラミング勉強会](https://yhpg.doorkeeper.jp/)にて過去に出題された[積み木の水槽](http://nabetani.sakura.ne.jp/hena/ord13blocktup/)を解いてみた。
回答にかかった時間は90分程度と大幅オーバー。

初めは

1. 入力値を"0"で分割
2. 分割したグループの最大値 * グループ長 - ブロック数でブロックがないマスの数を出す
3. ブロックがないマスの数から左右を壁で囲まれていないマスの数を引く

という流れで実装するよう考えていたのだが、左右を壁に囲まれていないマスの判定がうまく実装できずに50分が経過してしまった。

仕方がないので

1. 入力値を"0"で分割
2. 最小値の次段から最大値まで1段ずつ、ブロックのあるマスのインデックスを取得
3. 取得したインデックスの最小値から最大値までの差がブロックで囲まれている領域なので、そこからブロックが存在するマスを引いて水が入っているマスの数を特定

という流れで実装しなおした。

```ruby
class BlockWaterTank
  def initialize input
    @blocks = input.split("0").map{|block| block.chars.map &:to_i}
  end

  def fill
    @blocks.inject(0){|water, block|
      ((block.min || 0) + 1).upto(block.max || 0).inject(water){|w, len|
        fill = (0..(block.size - 1)).select{|i| block[i] >= len}
        w + fill.last - fill.first + 1 - fill.size
      }
    }
  end
end

test = <<_TEST
/*0*/ test( "83141310145169154671122", "24" );    
/*1*/ test( "923111128", "45" );    
/*2*/ test( "923101128", "1" );    
/*3*/ test( "903111128", "9" );    
/*4*/ test( "3", "0" );    
/*5*/ test( "31", "0" );    
/*6*/ test( "412", "1" );    
/*7*/ test( "3124", "3" );    
/*8*/ test( "11111", "0" );    
/*9*/ test( "222111", "0" );    
/*10*/ test( "335544", "0" );    
/*11*/ test( "1223455321", "0" );    
/*12*/ test( "000", "0" );    
/*13*/ test( "000100020003121", "1" );    
/*14*/ test( "1213141516171819181716151413121", "56" );    
/*15*/ test( "712131415161718191817161514131216", "117" );    
/*16*/ test( "712131405161718191817161514031216", "64" );    
/*17*/ test( "03205301204342100", "1" );    
/*18*/ test( "0912830485711120342", "18" );    
/*19*/ test( "1113241120998943327631001", "20" );    
/*20*/ test( "7688167781598943035023813337019904732", "41" );    
/*21*/ test( "2032075902729233234129146823006063388", "79" );    
/*22*/ test( "8323636570846582397534533", "44" );    
/*23*/ test( "2142555257761672319599209190604843", "41" );    
/*24*/ test( "06424633785085474133925235", "51" );    
/*25*/ test( "503144400846933212134", "21" );    
/*26*/ test( "1204706243676306476295999864", "21" );    
/*27*/ test( "050527640248767717738306306596466224", "29" );    
/*28*/ test( "5926294098216193922825", "65" );    
/*29*/ test( "655589141599534035", "29" );    
/*30*/ test( "7411279689677738", "34" );    
/*31*/ test( "268131111165754619136819109839402", "102" );
_TEST

require 'minitest/autorun'

describe 'WaterTank' do
  test.split("\n").each do |line|
    t, n, input, expect = line.match(/^\/\*(\d+)\*\/\s*test\(\s*"([^"]+)",\s*"([^"]+)"\s*\);\s*$/).to_a
    tank = BlockWaterTank.new input
    it input do
      assert_equal expect, tank.fill.to_s
    end
  end
end
```
よく使う特殊文字　一覧

HTMLやMarkdownで比較的よく使う特殊文字をまとめてみました

基本文字

|文字表記|文字|名称|
|-----|:-----:|---|
|`&quot;`|"|クォーテーション|
|`&amp;`|&|アンパサンド|
|`&lt;`|<|小なり|
|`&gt;`|>|大なり|
|`&nbsp;`| |空白|
|`&copy;`|©|コピーライト|
|`&#124;`|&#124;|縦棒|
|`&brvbar; `|&brvbar; |穴あき縦棒|
|`&frasl;`|&frasl;|スラッシュ|
|`&#64;`|&#64;|アットマーク|
|`&#42;`|&#42;|アスタリスク|
|`&#37;`|&#37;|パーセント|
|`&#35;`|&#35;|ナンバーサイン|
|`&#92;`|&#92;|バックスラッシュ|
|`&ndash;`|&ndash;|エンダッシュ|
|`&mdash;`|&mdash;|全角ダッシュ|
|`&#45;`|&#45;|ハイフン|
|`&#095;`|&#095;|アンダーバー|

数学系

|文字表記|文字|名称|
|-----|:-----:|---|
|`&frac14;`|&frac14;|四分の一|
|`&frac12;`|&frac12;|二分の一|
|`&frac34;`|&frac34;|四分の三|
|`&plusmn;`|&plusmn;|プラスマイナス|
|`&#61;`|&#61;|イコール記号|
|`&times;`|&times;|乗算記号|
|`&divide;`|&divide;|除算記号|
|`&deg;`|&deg;|度|

通貨系

|文字表記|文字|名称|
|-----|:-----:|---|
|`&yen;`|&yen;|円マーク|
|`&#36;`|&#36;|ドルマーク|
|`&cent;`|&cent;|セントマーク|
|`&pound;`|&pound;|パウンドマーク|
|`&euro;`|&euro;|ユーロマーク|

かっこ

|文字表記|文字|名称|
|-----|:-----:|---|
|`&#40;`|&#40;|左かっこ|
|`&#41;`|&#41;|右かっこ|
|`&#91;`|&#91;|左角かっこ|
|`&#93;`|&#93;|右角かっこ|
|`&#123;`|&#123;|左中かっこ|
|`&#125;`|&#125;|右中かっこ|

その他

|文字表記|文字|名称|
|-----|:-----:|---|
|`&#9733;`|&#9733;|黒星|
|`&#9734;`|&#9734;|白星|
|`&spades;`|&spades;|スペード|
|`&clubs;`|&clubs;|クローバー|
|`&hearts;`|&hearts;|ハート|
|`&diams;`|&diams;|ダイヤ|
iOS10になってからNSJSONSerializationに少し変更点がありますね。


NSJSONSerializationを利用しNSDictionaryまたはNSArrayで変換する場合、name/valueのcollectionタイプの返還タイプが違います。(NSJSONReadingMutableContainersの場合は例外です。)


- JSON

~~~
{
    test =     {
        1 = 2;
    };
}
~~~

- NSJSONSerializationで変換
    - 既存の場合は**test**の値のタイプは**__NSCFDictionary**になります。
    - iOS10の場合、**test**の値のタイプは**__NSDictionaryIまたは__NSSingleEntryDictionaryI(name/valueの双が一つのみの場合)**になります。

Google SDKみたいにJSONのデータを積極的に使っているところで使用法について問題が発生する可能性があります。
Fuelphpのmigrationでmysqlのafterを指定した結果

fuelphpのoilコマンドでmysqlのafterを指摘できるみたいだった。
http://saihoooooooo.hatenablog.com/entry/2014/02/06/204806


```
$ php oil g migration add_tablename pref:int\[4]:after\[country], city:varchar\[255]:after\[pref]
```

やってみた結果できたmigrateファイル

```php
<?php

namespace Fuel\Migrations;

class Add_tablename
{
	public function up()
	{
		\DBUtil::add_fields('', array(
			'pref' => array('constraint' => 4, 'type' => 'int', 'after' => 'country'),
			'city' => array('constraint' => 255, 'type' => 'varchar', 'after' => 'pref'),

		));
	}

	public function down()
	{
		\DBUtil::drop_fields('', array(
			'pref',
			'city'

		));
	}
}
```

このままoil r migrateするとテーブル名が空だよっておこられるのでそこは入れてからする。
AndroidStudioのgradle pluginのバージョンを2.2.0へ変更したらRobolectricを使ったテストに失敗する

# 問題

Android Studio 2.2がリリースされ，早速アップデートするとともに gradle plugin も2.2.0へ引き上げたところ，Robolectricを用いたテストがコケるようになりました．

```
java.lang.RuntimeException: java.lang.RuntimeException: build/intermediates/manifests/full/{product_flavors}/debug/AndroidManifest.xml not found or not a file; it should point to your project's AndroidManifest.xml
```

もともと使っていた `2.1.3` へ戻すとビルドが通ります．

# 解決

Robolectricのバージョンが `3.0` からアップデートされていませんでした．
`3.1.2` を使うようにして，無事テストがまた通るようになりました．
vimでマウスを無効にする

# 概要

vimを開いている時に、マウスで範囲選択するとvisualモードになった。
この機能は今はいらないので、切る方法があるか調べた。

# 結論

```~/.vimrc``` に書いても良いが、以下のように設定する


```
set mouse=
```

# 参照

[disabling mouse support in `vim` in a `gnome-terminal` environment](http://unix.stackexchange.com/questions/44513/disabling-mouse-support-in-vim-in-a-gnome-terminal-environment)

# 追記 2016-10-06

[Disable vim automatic visual mode using mouse](http://www.varesano.net/blog/fabio/disable%20vim%20automatic%20visual%20mode%20using%20mouse)

ここを見ると ```~/.vimrc``` に書く方法は

```
set mouse-=a
```

すでに起動しているなら

```
:set mouse-=a
```
ORMとDB時刻

APサーバーが複数存在していて時刻の差が気になったり、宗教上の理由などにより、
テーブルの時刻列を現在日時で更新する際にDB側の現在日時（postgresならcurrent_timestampとか）を使いたいケースはよくあると思います。
DB側もクラスタリングされていて時刻同期機能的な奴がどうとかは一旦全部無視すると普通に

```sql:
UPDATE test SET time = current_timestamp WHERE id = @id;
```
みたいな感じにすればいいだけですね、簡単です。

## でもそれORMでどうやるの？
ORMを使用（可能な限り生クエリは実行しない前提）している場合、一気に難易度が上がったりします。
例えば、play framework(ORM:EBean)の場合、以下のようなセッションを管理するテーブルがあるとします。

```java:SessionEntity.java
@Entity
@Table(name = "sessions")
@Getter
@Setter
public class SessionEntity implements Session{

    @Id
    @Column(name = "session_id")
    @NotNull
    private Long sessionId;

    @Column(name = "start_time")
    @NotNull
    private Timestamp startTime;

    @Column(name = "end_time")
    private Timestamp endTime;

}
```

大体以下のような感じで、セッションの開始時、終了時にレコードの作成、更新をするわけですが、
Entityに値をセットして作成（更新）をするという形になるので、DB側の時刻で処理する方法が良く分かりません。

```java:SessionController.java
public class SessionController extends Controller {

    public static Result startSession(){

        // セッションの開始（レコードの作成）
        SessionEntity session = new SessionEntity();
        session.setSessionId(1L);
        session.setStartTime(new Timestamp(System.currentTimeMillis()));
        Ebean.create(session);
    }

    public static Result endSession(){

        // セッションの終了（レコードの更新）
        session.setEndTime(new Timestamp(System.currentTimeMillis()));
        Ebean.update(session);
    }
}
```

グーグル先生と小一時間格闘しましたが、

* Entityの時刻フィールドにあるアノテーションを付けると作成時にDB側の時刻でレコードを作成する
* Entityの時刻フィールドにあるアノテーションを付けると更新時に毎回DB側の時刻で更新する

ということはできそうだったので、セッション開始時間の方は解決できるのですが、
セッション終了時間を任意のタイミングでDB側の時刻で更新する方法は見つかりませんでした。（生クエリを実行する以外の方法で）

## ならばトリガだ
結果どうしたかと言うと、アプリケーションコードはほぼそのままで、「トリガで更新し直す」ことにしました。

```sql:
CREATE FUNCTION reupdate_endtime()
  RETURNS trigger AS
$BODY$
    BEGIN
        NEW.time := current_timestamp;
        RETURN NEW;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION reupdate_endtime()
  OWNER TO postgres;

CREATE TRIGGER reupdate_endtime
  BEFORE UPDATE OF "end_time" 
  ON sessions
  FOR EACH ROW
  EXECUTE PROCEDURE reupdate_endtime();
```

ただ、この方法だとEntityにトリガで更新された時刻がセットされないので、update()後に再取得処理が動くようにしておく必要がありました。

## 最後に
ORM使うの難しい
# jQueryで特定要素以外クリック時のイベントを取得する

よくメニューや、モーダルを作る時に自分以外がクリックされた時に閉じたりするのに使ってるのでメモ。

## まずはHTMLとCSSを準備
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>clickMe!</title>
</head>
<body>
  <div class="outer">
    <div class="inner">
      clickMe!
    </div>
  </div>
</body>
</html>
```

## イベント取得
```javascript
$(document).click(function(event) {
  if(!$(event.target).closest('.inner').length) {
    console.log('外側がクリックされました。');
  } else {
  	console.log('内側がクリックされました。');
  }
});
```
ここから動作確認できます。
https://jsfiddle.net/p4tjgygr/2/

## 解説
自分以外のクリックイベントを取得するためには全てのクリックをみて確認する必要があります。

```javascript
$(document).click(function(event) {
// クリックイベントが発生すると毎回ここ通る
});
```

次にどの要素がクリックされたのかeventとclosestを使って判別します。

```javascript
$(document).click(function(event) {
  // event.targetをjQueryオブジェクトに変換する
  // closest()を使って自分から先祖要素までinnerクラスがある要素を選択する
  if(!$(event.target).closest('.inner').length) {
    console.log('外側がクリックされました。');
  }
});
```
MacOSでUndefined error: 'Module_six_moves_urllib_parse' object has no attribute 'urlencode' が出てしまったときの対処方法

GoogleApiを試そうと思ったときに少しハマったので原因と解決方法を書きます。

### 原因
Macにデフォルトでインストールされているpythonには既に`six`というパッケージが`/System/Library/Frameworks/Python.framework/Versions/2.7/Extras`下にあるらしいです。
これが`/Library/Python/2.7/site-packages`よりも先に解決されるため、パッケージがアップデートできないことが原因でした。

### 解決方法1
デフォルトのpythonを使わない。
これからpythonを使う方はこちらの解決方法が良いと思います。

### 解決方法2
以下のコマンドでも解決出来ました。

```sh
export PYTHONPATH=/Library/Python/2.7/site-packages
```


### 参考URL
https://github.com/google/google-api-python-client/issues/100
http://stackoverflow.com/questions/29485741/unable-to-upgrade-python-six-package-in-mac-osx-10-10-2/29666702#29666702
webpack browserify gulp



其实` webpack` 和` browserify` 做着同样的事情.他们都是将` module` 编译到浏览器模式,也就是在浏览器里能够使用他们. 这个` module` 本身它是` node` 的功能,所以它在浏览器里不支持的. 虽然在` ES6`里也是取现有的` AMD` 还有` CommonJS` 的` javascript` 的` module` 实现而规范化了` module`, 但是目前不是所有的浏览器都支持, 所以就早就当下三国的形态. 不管三七二十一最后的最后都是要把各种写法打包编译到当前主流浏览器甚至` ie8`还要支持的 javascript 状态下. 

回到` webpack` 和` browserify`, 其实他们也是有不同的地方,不然也不会重复造个没有意义的轮子. 对于` webpack` 来说,它天生提供了一些对于 web 开发来说的工具, 而`browserify` 它呢出发点就是针对` javascript` 的开发生态里提供了一种帮助. `webpack` 它可以提供一些如 **代码分割** 的功能, 而` browserify` 不是不支持只是需要一些插件的帮助. 不过归根结底结果都是一样的. 所以用哪个取决于个人爱好了. 这里说清楚一点就是` webpack` 并不是任务执行器, 而是对于本地的文件通过` CLI` 或者一些 task 的方式来处理.

而` webpack-dev-server` 它类似` Browsersync`, 就是一个 server, 它能够帮助你部署应用,验证当前的代码是否工作, 能够自动刷新页面应用等.
Ubuntu Server 16.04 LTSをハードウェアRAID構成でインストール

# 0.環境

|項目      | バージョン |
|:----------|:----------|
| 機種       | 富士通PRIMERGY RX200 S6 |
| OS        | Ubuntu Server 16.04 LTS |

# 1.パッケージダウンロード

[Ubuntuサイト](http://www.ubuntu.com/download/server)よりダウンロードしDVDに焼きました。

<img width="1027" alt="スクリーンショット 2016-09-21 11.48.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/128324/647e68c2-4b03-6649-07f1-c7377dabb83a.png">

# 2.言語設定・ネットワーク設定

作成したUbunstuServerインストールディスクを入れてブートします。

「日本語」を選択します。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/128324/503d33fa-161e-9eeb-6abe-7e05bd5c2a8b.png)

「Ubuntu Serverをインストール」を選択します。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/128324/595050a7-084e-9b54-0986-aa234b46b4e3.png)

「日本」を選択します。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/128324/5bde9889-816c-c45a-27d7-cabe29e8b4f2.png)

ここからネットワーク設定に入ります。IPアドレス等適宜設定します。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/128324/7f664a94-c44c-19aa-56f1-9fe7cf59b6e9.png)

以下省略

# 3.パーティショニング

ネットワークの設定が完了したらパーティションの設定に入ります。
本記事では、４本の物理ディスクを２本ずつのRAID1でハードウェアRAIDを組んだ構成ですので、以下のように２本のディスクがあるように見えます。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/128324/3e9c8dd0-7180-be00-ebf6-7fbf2380a10b.png)

パーティションを割り当てていきます。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/128324/41d8e540-51c6-b712-0ea4-69791073b1b8.png)

「新しいパーティションの作成」を選択します。
![08.png](https://qiita-image-store.s3.amazonaws.com/0/128324/88ca6f93-8812-b6d3-d889-d48b7842020b.png)

以下のイメージは最大サイズになっていますが、本記事ではスワップ領域を割り当てるため、「290.8G」に設定しました。
「続ける」を選択します。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/128324/03dd5220-ee0b-0126-292e-0101386ba5d7.png)

「基本パーティション」を選択します。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/128324/ae05ca01-eefd-caff-e370-99226ced4511.png)

「利用方法」を「ext4　〜」、「マウントポイント」を「/」に設定し「パーティションのセットアップを終了」を選択します。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/128324/e89149c0-d9e6-c071-95f5-5d4598381c6f.png)

他パーティションも同様に設定します。
本記事では以下のようにスワップ領域を割り当て、別ディスクに「/var」を割り当てました。
パーティションの設定が完了したら「パーティショニングの終了とディスクへの書き込み」を選択します。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/128324/8de35829-3525-c453-18d2-17e9196dab18.png)

「はい」を選択します。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/128324/deb401ff-236e-1b40-0d50-b815d92de5dc.png)

# 4.プロキシの設定

適宜プロキシを設定します。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/128324/545de42b-8c40-1225-c4b8-4ee6bbbb7ab9.png)

# 5.アップデートの設定

自動アップデートの設定をします。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/128324/f8bf3f59-4ab1-14e7-5789-7b7db3d15d7c.png)

# 6.ソフトウェアの選択

インストールするソフトウェアを選択します。
本記事では、追加でSambaとSSHをインストールしました。

![16.png](https://qiita-image-store.s3.amazonaws.com/0/128324/111eab81-4d06-f35f-5482-57b517157595.png)

# 7.ブートローダのインストール

「はい」を選択します。

![17.png](https://qiita-image-store.s3.amazonaws.com/0/128324/f4563a3e-0265-5d18-7cd1-747b0798ff6e.png)

システム領域のディスクを選択しました。
![18.png](https://qiita-image-store.s3.amazonaws.com/0/128324/6ddce4b1-110b-a361-de92-7b1621444f11.png)

# 8.終了

「続ける」を選択するとリブートがかかり、UbuntuServerが起動します。

![19.png](https://qiita-image-store.s3.amazonaws.com/0/128324/4f26e06e-0a18-327e-1b3d-2c9f78cd3807.png)
Mac OS X で過去のバージョンのMongoDBをインストール

## 実行環境
- OS
    - Mac OS X El Capitan

- Homebrewのバージョン
    - 0.9.9

## 手順
- 旧バージョン提供用のリポジトリを追加する<br>
```brew tap homebrew/versions```
- 検索キーワードをmongoにして検索<br>
```brew search mongo```<br>
- 検索結果の中に下記のレポジトリがあることを確認する。

```
homebrew/versions/mongodb26
homebrew/versions/mongodb30
```



2.6系列のMongoDBをインストールしたい場合は、
```brew install homebrew/versions/mongodb26```
3.0系列のMongoDBをインストールしたい場合は
```brew install homebrew/versions/mongodb30```
を行う。
elasticsearch-railsでkaminariとincludesを組み合わせるとエラーになる問題を解決

elasticsearchの返却値にincludesを通常のやりかたでかませるとエラーがでる。
bulletでN+1の警告が拾われないため、つい見逃しやすい。
備忘録的なメモ。

# 前提

elasticsearch_railsにはkaminariモジュールがあるため、
elasticsearchの返却値に下記のようにpageを加えてあげることで、
ページングを実現できる


```ruby:app/controllers/sample_models_controller.rb
class SampleModelsController < ApplicationController
  def index
    @sample_models = SampleModel.__elasticsearch__.search({query_json}).page(params[:page]).records
  end
end
```

viewは下記のようにElasticSearchを意識することなく
ActiveRecordと同様、kaminariの一般的な実装方法で記述できる。
これによりページング機能が実現できる。
これはElasticSearch内にkaminariモジュールがあるため、それによって実現されている

```haml:app/views/sample_models/index.html.haml
- @sample_models.each do |sample_model|
  = sample_model.title
  
= paginate @sample_models

```


# 問題: .includesをつけようとすると..

だが、ActiveRecordライクに下記のようにしてしまうと、

```ruby:app/controllers/sample_models_controller.rb
# NG例
class ModelsController < ApplicationController
  def index
    SampleModel.__elasticsearch__.search({query_json}).page(params[:page]).records.includes(:child_model)
  end
end
```

kaminariで下記のエラーが発生する

```
undefined method `total_pages' for #<SampleModel::ActiveRecord_Relation:0x00************>
```


`.includes(:child_model)` と記述してしまった時点で、
`Elasticsearch::Model::Response::Records`が、`SampleModel::ActiveRecord_Relation`
に変換されてしまい、ElasticSearchのkaminariモジュールに用意されたパラメータがそぎ落ちてしまうことが原因


# 解決策

elasticsearch_railsのrecordにoptionでincludesを引き渡せるようになっているので、
それを利用すればよい。


```ruby:sample_models_controller.rb
# OK例
class SampleModelsController < ApplicationController
  def index
    SampleModel.__elasticsearch__.search({query_json}).page(params[:page]).records(includes: :child_model)
  end
end
```
topicブランチでgit rebase masterする

コマンドだけ

```
$ git checkout master

$ git pull

$ git checkout <topicブランチ>

$ git rebase master

コンフリクトを修正

$ git add <修正したファイル>

$ git rebase --continue

$ git log
commit履歴を確認

$ git push -f origin <topicブランチ>
```
140文字以上のツイートを取得する

画像とか GIF の URL が140文字のカウントに含まれなくなって，今までの取得方法だと

```text:example
hogehoge(140文字)... https://t.co/fuga
```
みたいになってしまう．どうやって REST API で全文取得するのか調べたら
https://dev.twitter.com/overview/api/upcoming-changes-to-tweets
ここに書いてあった．

リクエストするエンドポイントに`tweet_mode=extended`を追加するといいらしい．
例えば
`https://api.twitter.com/1.1/statuses/user_timeline.json?tweet_mode=extended`
のような感じ？

ちなみに返ってくる JSON がちょっと変わっててその例は
https://github.com/twitterdev/tweet-updates/blob/master/samples/initial/extended_extended_14001.json
ここで見れる．

とりあえず Extended Tweet の本文は，取得した JSON では`full_text`が key になっているみたい．
今までだと`text`が key だったので注意します．
CLIでプログレスを表示


毎回どうやるんだっけかなーと調べてしまうのでメモ

![4C3D7C50-0A61-4B6C-9F2B-AD7B15A96ED2-683-0000713D9E659AC0.gif](https://qiita-image-store.s3.amazonaws.com/0/21086/3c83a67e-1d08-0a2b-cdb4-4bb92ae18407.gif "4C3D7C50-0A61-4B6C-9F2B-AD7B15A96ED2-683-0000713D9E659AC0.gif")


```rb:progress.rb
puts 'start'

list = (0..100).to_a
total = list.size
list.each.with_index(1) do |_v, i|
  print "progress... #{(i.to_f / total * 100).round}%\r" if $stdout.tty?
  sleep 0.01
end
puts ''

puts 'done'
```

## やってること

 - `$stdout.tty?`
	 - 端末から直接実行時にプログレスを表示
	 - `ruby progress.rb | less` とかするとプログレスは表示しない
 - `print`の`\r` 
	 - `carriage return` カーソルを行頭に戻す文字コード
 - `puts ''`
	 - `\r`でカーソルが先頭に移動してしまってるので改行
macOS sierra 起動 USB 作成方法

macOS sierra の起動USBを作成するには下記の方法で行う。

0. ディスクユーティリティーで初期化する。
0. ターミナルでコマンドを入力する。

## 1. ディスクユーティリティーで初期化

### USBを選んで、消去ボタンを押す
  名前: Untitled
  フォーマット: OS X 拡張(ジャーナリング）
  方式: GUID


## 2. ターミナルでコマンドを入力 

    sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Untitled --applicationpath "/Applications/Install macOS Sierra.app" --nointeraction
Sierra移行メモ


|OSXアップグレード|記事|
|:--|:--|
| |(Yosemiteまでは不具合等なし)|
|El Capitan移行メモ|http://qiita.com/cielavenir/items/ff4f3712c7790227d030|
|Sierra移行メモ|http://qiita.com/cielavenir/items/1c6b04af81748a92943e|

- Perl/PHP/Python/Ruby
  - 5.16/5.6/2.7/2.0。El Capitanからのアップグレードなら特別な手続きは必要なし。なぜPython3は入らなかったのか。

- Java (Apple)
  - Java for OSX 2015-001がインストールできます。ただし自己責任だと思われます。
  - Adobeも使えますが、ネットの情報によると新規インストールは不可らしいので、先にインストールすることをおすすめします。アクティベーションが解除される報告もあるようなので、インストール->アップグレード->アクティベーション？

- XtraFinder
  - **Finderがクラッシュします。** 残念ではありますが、必ずアンインストールしてからアップグレードして下さい。

- CrossOver
  - 12.5.1のままで問題ありません。

- Tuxera NTFS 2014
  - 使えはするのですが、BOOTCAMPパーティションが *ntfs* でマウントされる問題があります(本来は *fusefs_txantfs* になるべき)。
  - `sudo mount -t fusefs_txantfs /dev/disk0s4 /opt/BOOTCAMP`とかするしかなさそうです。不便ですね。

- UPX
  - UPX 3.91で圧縮したバイナリは「Killed: 9」となり実行できません。3.92(ただしgitから自力ビルドが必要)であれば大丈夫らしいです。
  - https://github.com/upx/upx/issues/4

- SSH
  - `ssh-add -K`による明示的キーロードが必要になったようです。自動でロードして欲しい…。
R > names() > ベクタに名前を付ける

```txt:動作環境
RStudio @ Rollapp
```

names()を使ってみる。

```R
> types<-c("human","android","Ferengi","Changeling")
> names(types)<-c("Kira","Data","Quark","Odo")
> types
      Kira       Data      Quark            Odo
    "human"  "android"  "Ferengi"  "Changeling"
```

名前付けしたものは以下のように取り出せる。

```R
> types["Kira"]
   Kira
"human"
```

参考 Rで学ぶデータ・プログラミング入門 by 石田基広さん