OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubで超簡単にプレゼンテーションを作成・公開できるGitPitchの紹介

## GitPitchとは

[GitPitch](https://gitpitch.com/)は、無料でプレゼンテーションを公開できるサービスです。記述方式は[Markdown](https://ja.wikipedia.org/wiki/Markdown)(マークダウン)。

使い方はとても簡単です。アカウントを作ったりソフトウェアをダウンロードする必要はありません。

## 必要となるもの

* [GitHub](https://github.com/)のアカウント([GitLab](https://about.gitlab.com/)と[Bitbucket](https://bitbucket.org)もサポートしています)
* [Git](https://git-scm.com/)とMarkdownの基本的な知識

## 使い方

GitHubのレポジトリに`PITCHME.md`というファイルを作ってMarkdownで記述するだけです。プッシュして`https://gitpitch.com/user/repo`にアクセスするとスライドを見ることができます。

右に新しいスライドを作る場合は`---`で区切り、下に新しいスライドを作る場合は`+++`で区切ります。

```
Hello!

+++

Hola!

---

Goodbye!

+++

Adiós!
```

[コード](https://github.com/gitpitch/gitpitch/wiki/Code-Slides)や[画像](https://github.com/gitpitch/gitpitch/wiki/Image-Slides)、[ビデオのリンク](https://github.com/gitpitch/gitpitch/wiki/Video-Slides)はもちろんですが、[GISTのリンク](https://github.com/gitpitch/gitpitch/wiki/GIST-Slides)や[数式](https://github.com/gitpitch/gitpitch/wiki/Math-Notation-Slides)までサポートしています。

フッターの左にあるプルダウンメニューをクリックするとGitHub、GitLab、Bitbucketの選択が可能です。

## どんなものを使って作られているのか

GitPitchは[reveal.js](https://github.com/hakimel/reveal.js)のプレゼンテーション・フレームワークを利用しているそうです。また、サーバーには[Play Framework 2.5.x](https://playframework.com/)が利用されており、オープン・ソースとしても[公開されています](https://github.com/gitpitch/gitpitch)。
perltidyのpbpオプションで直接ファイルを書き換える

```
> ls 
test.pl
> perltidy -b -pbp -nst test.pl
> ls
test.pl  test.pl.bak
```

Perlスクリプトの整形コマンドを使いやすいようにコマンドにしてみた。

```:bin/pbp
#!/bin/bash
#set -u

# man perltidy
#           In particular, if you want to use both the -b flag and the -pbp
#           (--perl-best-practices) flag, then you must put a -nst flag after the -pbp flag
#           because it contains a -st flag as one of its components, which means that output
#           will go to the standard output stream.

[ -z "$1" ] && echo "not enough arguments" &&  exit 1
[ ! -f $1 ] && echo "No such file or directory" && exit 1

perltidy -b -pbp -nst $1

diff -uprN $1.bak $1
```

# example

```
> cat test.pl
my $aaa = 2;
if ($aaa == 2) {
    say $aaa . "abc";
}

> pbp test.pl
--- test.pl.bak 2017-04-29 04:03:25.818000000 +0900
+++ test.pl     2017-04-29 04:26:08.224000000 +0900
@@ -1,4 +1,4 @@
 my $aaa = 2;
-if ($aaa == 2) {
+if ( $aaa == 2 ) {
     say $aaa . "abc";
 }

> ls
test.pl  test.pl.bak
```



# 参考

[PerlTidyでの一括整形コマンド](http://oomatomo.hatenablog.com/entry/37208841)

[Linuxエンジニアらしいパッチのつくりかた](http://qiita.com/astro_super_nova/items/e30dcaf4d106deebc63c)

Documentation/translations/ja_JP/SubmittingPatches
>パッチの作成には「 diff -up 」又は「 diff -uprN 」を使ってください。
RecruitのimageInfluenceAPIを使ってみる

#概要
Recruitが肉の画像に点数をつけるAPIを無料公開したので使ってみる。
APIのアクセスキーはここで簡単に取れます。
[imageInfluenceAPI](https://a3rt.recruit-tech.co.jp/product/imageInfluenceAPI/)

#実践
imgフォルダに画像を入れておく
データはこんな感じ
<img width="1114" alt="29s.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/1e3251d5-7ced-1df2-ae4d-175f6924c16b.png">


```GetNikuRank.php
<?php
$url = "https://api.a3rt.recruit-tech.co.jp/image_influence/v1/meat_score";
$apikey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
$predict = 1;

foreach (glob("img/*") as $imagefile) {
    exec("curl -X POST -F apikey=$apikey -F imagefile=@$imagefile 
                -F predict=$predict $url", $result);
}

var_dump($result);
 ?>
```
curlのとこ、phpのcurl_initとかcurl_setoptとかでカッコよくやりたかったけど
できなかったのでズルしましたm(_ _)m
誰かやり方教えてください。。。

#結果
```bash
array(8) {
  [0]=>
  string(70) "{"status": 0, "message": "ok", "result": {"score": 4.119289398193359}}"
  [1]=>
  string(70) "{"status": 0, "message": "ok", "result": {"score": 4.322441101074219}}"
  [2]=>
  string(70) "{"status": 0, "message": "ok", "result": {"score": 4.786712169647217}}"
  [3]=>
  string(71) "{"status": 0, "message": "ok", "result": {"score": 4.7479472160339355}}"
  [4]=>
  string(70) "{"status": 0, "message": "ok", "result": {"score": 3.971776247024536}}"
  [5]=>
  string(71) "{"status": 0, "message": "ok", "result": {"score": 3.1198763847351074}}"
  [6]=>
  string(70) "{"status": 0, "message": "ok", "result": {"score": 4.162046432495117}}"
  [7]=>
  string(71) "{"status": 0, "message": "ok", "result": {"score": 4.1765265464782715}}"
}
```

結構美味しそうな写真を判定させたと思ったんだけどなぁ。
僕が考えた最強のKeynote用テンプレート

# Keynoteのテンプレートを作って公開しました

こんにちは、[m4kvn](https://github.com/m4kvn) です。
最近函館では、Tech系のイベントを開催したりでスライドを作る機会が増えました。
そこでかっこいいスライドを作れるテンプレートを探すんですが、
納得のいくテンプレートが見つからず結局自分で調整していて、
それなら自分で作ったものをテンプレートにしようってことで作成しました。

### 追記 (2017.07.02)

- ページ番号を右下に追加しました
- リストスライドのデザインを変更しました
- デモスライドを更新しました
- 仕様を記述しました

## TL;DR

作成したテンプレートは2種類あり [GitHub](https://github.com/m4kvn/Keynote-Style) で公開しています。
一部ソースコード用のスライドにフォント [Ricty Diminished](https://github.com/edihbrandon/RictyDiminished) を使用しているので、
このテンプレートを使っていただける場合はインストールを推奨します。
デモ用のスライドも公開しているので、参考にしていただけたらと思います。

**MStyle-Dark DEMO**
https://speakerdeck.com/masahirosaito/mstyle-dark-demo

**MStyle-White DEMO**
https://speakerdeck.com/masahirosaito/mstyle-white-demo

気に入ってくれたらスターくれると嬉しいです。
今後別のカラーリングやスライドも追加する予定です。

## 仕様

- 配置されている全てのオブジェクトは編集可能
    - 矢印などの長さや色を変更可能
    - ページ番号が不必要ページのみ削除可能
    - テキストボックスの大きさを変更可能

## MStyle-Dark Sample

| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0001.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0002.jpg) |
| :-: | :-: |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0003.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0004.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0005.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0006.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0007.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0008.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0009.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0010.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0011.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-Dark/0012.jpg) |

## MStyle-White Sample

| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0001.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0002.jpg) |
| :-: | :-: |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0003.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0004.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0005.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0006.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0007.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0008.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0009.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0010.jpg) |
| ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0011.jpg) | ![](https://github.com/m4kvn/Keynote-Style/raw/master/assets/MStyle-White/0012.jpg) |
Bash(awk)でHello World!を出力する。

# ただし文字・数値リテラルを使わずに

## 早速ソース
```
$ false;echo $? |
awk '{one=$0;zero=one-one;two=one+one;three=one+two;
four=one+three;seven=three+four;eight=seven+one;
nine=eight+one;print(seven two);print(one zero one);
print(one zero eight);print(one zero eight);
print(one one one);print(three two);print(one one nine);
print(one one one);print(one one four);
print(one zero eight);print(one zero zero);print(three three); }'|
awk '{printf("%c",$0)}END{printf("\n")}'

[実行結果]
Hello world!
```

何番煎じかわかりませんが、会社のSlackに気まぐれで貼ったら意外と受けが良かったので。
見やすいように適当に改行入れてます。

## 解説

`false;echo $?`
`false`は終了コード`1`を返すコマンドです。
続けて実行している`echo $?`で直前のコマンド（`false`）の終了コードを出力しています。

---
`awk '{one=$0;zero=one-one;...print(three three); }'`
`echo $?`の値が`$0`に入っているため、`one`という変数に格納します。
コレで`1`を作ることが出来たので、`1 - 1 = 0`、`1 + 1 = 2`のようにしてどんどん数値を作っていきます。
また、`print()`では変数や文字列同士をスペースを挟むことで結合して出力できます。
例） `print("1" "2")` => `12`
コレを用いて、先程作った数値から"Hello world!"の各文字に対応する文字コードを作っていきます。

`H` = `72`
`e` = `101`
`l` = `108`
`o` = `111`
` ` = `32`
`w` = `119`
`r` = `114`
`d` = `100`
`!` = `33`

---
`awk '{printf("%c",$0)}END{printf("\n")}'`

あとは、`printf("%c",x)`でxの文字コードに対応する文字を表示させます。
`printf()`は`print()`と違って改行を出力しないため、最後に改行を出力します。

以上です。
もっと簡潔に書けるよ！とかあればよろしくお願いします。
Nginxのtry_filesディレクティブ設定例

Nginxの設定にて、静的なファイルと動的なURLを振り分けたいことがあります。try_filesを利用すれば、指定した順番で確認と転送を実施してくれます。

参考
[Module ngx_http_core_module](http://nginx.org/en/docs/http/ngx_http_core_module.html)

**以下の順番で確認するよう設定します**
1.　URLのパスにファイルがあるか
2.　1がなかった場合、URLのパスにディレクトリがあるか
3.　12がなかった場合、指定したロケーションに行く

```nginx
location / {
    root /home/user/app/public/;
    try_files $uri $uri/ @dinamic;
}

location @dinamic {
    proxy_pass http://upstream;
}
```
【メモ】Vagrant + VirtualBox + Homesteadでロカール環境にLaravelを導入したった時に起きた問題と解決策

★基本的にはこちらの記事をそのまま参照
http://qiita.com/7968/items/97dd634608f37892b18a

ただ、上記の通り実施中にいくつか問題が起きたのでその解決策をメモ



【以下起きた問題】
①STEP9で「Laravel」のページが表示されない
　→ゲストOSの(home/vagrant/Code/Laravel/public)でサーバー起動が必要

```
vagrant@homestead:php -S 192.168.10.10:8000
```

②何故かホストOSとゲストOSのフォルダが同期されない = Laravelのファイルを「home/vagrant/Code/」にComposerでインストールしても、ホストOSの方の「app/」には反映されない
　→調べたけど一向に解決しなかったのでFilezillaを使って同期することに。Filezillaで接続する時はSSH接続でユーザー名/パスワードは```vagrant/vagrant```、ポートはSSHの時は22。
これで接続出来た。

【MySQLを使う場合】
コマンドラインからMySQLに接続したい。

①```vagrant ssh```でゲストOSに接続
②```mysql -u USERNAME -p```で接続出来る
　※デフォルトでUSERNAMEは「homestead」/パスワードは「secret」

(参考)
https://readouble.com/laravel/5.4/ja/homestead.html
http://mysql.javarou.com/dat/000389.html (コマンドラインからMySQLへ接続)

以上。
fishとvimプラグインでのエラーを解決

fish生活中。


```
> vim a.pl
"a.pl" [新ファイル]^[[2;3R
/usr/share/vim/vim74/ftplugin/perl.vim の処理中にエラーが検出されました:
行   50:
E484: ファイル "/tmp/vdZJghB/0" を開けません
function <SNR>8_LoadFTPlugin の処理中にエラーが検出されました:
行   17:
E170: :endfor がありません
function <SNR>5_FTpl の処理中にエラーが検出されました:
行   10:
E171: :endif がありません
続けるにはENTERを押すかコマンドを入力してください
```

(´・ω・｀)

[fish と Vim の組み合わせでエラーが起こる件](http://d.hatena.ne.jp/ursm/20090112/1231754050)
>
これは Vim の外部プロセス呼び出しが POSIX 互換シェルを前提としているからです。.vimrc で別のシェルを設定してやることで回避できます。


＼(^o^)／

```
> cat ~/.vimrc

if $SHELL =~ '/fish$'
  set shell=bash
endif

```
AndroidStudio でデバイス一覧が表示されない時

# 問題

MacのAndroidStudioで実行ボタンを押した時に、デバイス一覧が表示されない事象に遭遇した。

<img width="618" alt="スクリーンショット 2017-04-20 13.24.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/44388/426c19e2-6f4f-eaaa-b81c-ee9c41a3b597.png">

また、イベントログには下記のエラーが吐かれている。

```
error: could not install *smartsocket* listener: Address already in use
ADB server didn't ACK
* failed to start daemon *
error: cannot connect to daemon
'/Users/ユーザ名/Library/Android/sdk/platform-tools/adb start-server' failed -- run manually if necessary
```

# 原因

調べてみると、adbサーバが上手く立ち上がっていないようだった。

# 対応

下記のコマンドで、管理者権限でadbサーバを一度殺してから再び起動する。

```
sudo /Users/ユーザ名/Library/Android/sdk/platform-tools/adb kill-server
sudo /Users/ユーザ名/Library/Android/sdk/platform-tools/adb start-server
```

成功時は下記のメッセージが表示され、デバイス一覧が表示されるようになっているはず。

```
adb server version (36) doesn't match this client (39); killing...
* daemon started successfully *
```

<img width="626" alt="スクリーンショット 2017-04-29 1.46.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/44388/4e0f0b01-dfbd-3e31-81e9-2fdb4ad27d35.png">
Railsで管理画面をつくってみる

active adminにしよう。画面かっこいいから。

参考：
- [Rails4でActiveAdminを使ってみる](http://avosalmon.hatenablog.com/entry/2014/06/24/%E3%80%90Rails4%E3%80%91devise%E3%81%A8active_admin%E3%81%A7%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E7%AE%A1%E7%90%86%E8%80%85%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92)
- [【Rails4】deviseとactive_adminで一般ユーザーと管理者ユーザーを作成](http://avosalmon.hatenablog.com/entry/2014/06/24/%E3%80%90Rails4%E3%80%91devise%E3%81%A8active_admin%E3%81%A7%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E7%AE%A1%E7%90%86%E8%80%85%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92)
- [active_admin Rails 4.2の管理画面を最短時間で作ろう！　active_admin[Devise入り]](http://morizyun.github.io/blog/active-admin-gem-rails/)

なんかすごく簡単そうで嬉しい。

# gem追加

```
gem 'activeadmin', github: 'gregbell/active_admin'
```

# 色々インストール

```
$ rails g active_admin:install
```

結果

```
Running via Spring preloader in process 91179
      invoke  devise
    generate    No need to install devise, already done.
      invoke    active_record
      create      db/migrate/20170428162011_devise_create_admin_users.rb
      create      app/models/admin_user.rb
      invoke      test_unit
      create        test/models/admin_user_test.rb
      create        test/fixtures/admin_users.yml
      insert      app/models/admin_user.rb
       route    devise_for :admin_users
        gsub    app/models/admin_user.rb
        gsub    config/routes.rb
      append    db/seeds.rb
      create  config/initializers/active_admin.rb
      create  app/admin
      create  app/admin/dashboard.rb
      create  app/admin/admin_user.rb
      insert  config/routes.rb
    generate  active_admin:assets
Running via Spring preloader in process 91221
      create  app/assets/javascripts/active_admin.js.coffee
      create  app/assets/stylesheets/active_admin.scss
      create  db/migrate/20170428162015_create_active_admin_comments.rb
```

# db:migrate

```
$ rails db:migrate
```

# アクセス

`http://localhost:3000/admin`にアクセスすると管理者ログイン画面が出現した。デフォルトのID/Passは下記。

- ID: admin@example.com
- PASS: password 

入れない。。笑

## ログインできない場合
参考：[gem active adminでログインできない時の対処法](http://web-master.tech/2016/10/06/gem-active-admin%E3%81%A7%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/)

```
$ rails db:seed
```

これで入れた。
VitrualBox上のUbuntuに、ホストからsshをする



# 目的
Ubuntu on Virtualbox on Windows で動いているsshサーバに
Windows上のputtyからssh接続をしたい

# 環境
* Ubuntu 16.04
* Virtualbox 5.1.20

# 方法
Virtualboxで「ホストオンリーアダプター」の設定をすれば良い
参考：[VirtualBox上のUbuntuにSSHで接続するための設定](http://smys0515.hatenablog.com/entry/2016/02/29/080000)

# 追記
VMのネットワーク接続を、デフォルトのNATからブリッジにするだけでもできる。
Rantly(property based testing tool)でテストデータ生成 - literal

Rantly#literal で値をそのまま返します

## <i class='fa fa-question-circle'></i> 関連記事
[tbpgr の rantly 関連記事](http://qiita.com/search?utf8=%E2%9C%93&q=user%3Atbpgr%20tag%3Arantly)

## <i class='fa fa-flask'></i> サンプル

```ruby
Rantly(5){literal("test")}
# => ["test", "test", "test", "test", "test"]
Rantly(5){literal("test")}
# => ["test", "test", "test", "test", "test"]

# 固定値とランダム文字列を50%の確率で生成
Rantly(5){choose literal("test"), string}
# => ["test", "test", "WS~&fy", "test", "iZ'}dD"]
Rantly(5){choose literal("test"), string}
# => ["test", "ObZpu~", "test", "test", ")~Tny6"]
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [abargnesi/rantly](https://github.com/abargnesi/rantly)
TextFieldで簡単に文字数制限

#TextFieldで簡単に文字数制限
動画は入力７文字制限です。
##GIF
![textField.gif](https://qiita-image-store.s3.amazonaws.com/0/131469/8688f9e7-dc3a-daeb-c875-5e473eab79b6.gif)

githubにXcode9.3バージョンのソースあります。
https://github.com/daisukenagata/PasswordTextField

##使い方

好きなViewControllerにUITextFieldを配置

<img width="285" alt="スクリーンショット 2017-04-29 0.14.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/cecdf3fd-982c-3d3e-0838-43977e126722.png">

アトリビュートインスペクタのTag設定で文字数を設定

<img width="261" alt="スクリーンショット 2017-04-29 0.15.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/69ea664a-c867-f345-cbf8-9f8c2b820a25.png">

####2018/5/11 viewDidLoadメソッド内でcodeに変換しました。


##ViewController内の編集判定コード
このメソッドは毎回呼ばれるTextFieldのデフォルトのメソッドです。
ここで複数UITextFieldを設定していても、そのUITextFieldのtag番号と文字列で判定できます。

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        passTextField.pass(st:passTextField.text!, tag: passTextField.tag, textField: textField)
        return true
    }

キーボードが下がる時も文字列制限を実施します。

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        passTextField.pass(st: passTextField.text!, tag: passTextField.tag, textField: textField)
        textField.resignFirstResponder()
        return false
    }
##ペースト等制限のコード
```
　　 カーソル非表示
    override func caretRect(for position: UITextPosition) -> CGRect { return CGRect.zero }
　　 範囲選択非表示
    override func selectionRects(for range: UITextRange) -> [Any] { return [] }
    コピー・ペースト・非表示
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false }
```
##文字数制限のコード
st.prefix(tag)で指定の数字まで文字読み込んでいます。

    
     func pass(st:String,tag:Int,textField:UITextField) {
        if st.count >= tag {
            textField.text = String((st.prefix(tag)))
        }
    }

以上です。ありがとうございました。
【karma】karma-ie-launcherでIEのテストを実行するとCannot start IE エラーになる場合の解決策

karmaでkarma-ie-launcherを使ってIEのテストをしようとしたら
うまく起動できなかったので、そのメモ。

解決策は普通にkarma-ie-launcherのページに書いてあったが原因は良くわかってない。
https://www.npmjs.com/package/karma-ie-launcher
https://github.com/karma-runner/karma-ie-launcher


# 環境系

IEは11

package.json抜粋

```json
  "devDependencies": {
    //・・・
    "karma": "^1.4.0",
    //・・・
    "karma-ie-launcher": "^1.0.0",
    //・・・
  }
```

karma.conf.js抜粋

```js
		browsers: ['IE'],
```

# 現象

<font color="FireBrick">IEを起動している状態で</font>karmaのテストを実行する。


IEが(3つ)起動するが、コンソール上に下記のようなエラーが出る。

```bash
XX XX XXXX XX:XX:XX.XXX:ERROR [launcher]: Cannot start IE
・・・
XX XX XXXX XX:XX:XX.XXX:ERROR [launcher]: IE failed 2 times (cannot start). Giving up.
XX XX XXXX XX:XX:XX.XXX:ERROR [karma]: TypeError: Cannot set property ・・・
```

起動されたIEには、「disconnected」と表示されている。

# 解決策

https://www.npmjs.com/package/karma-ie-launcher
の下の方に書いてある`-extoff`の方法を参考に、karma.conf.jsを書き換える。

karma.conf.js抜粋

```js
		browsers: ['IE_no_addons'],
		customLaunchers: {
			'IE_no_addons': {
				base: 'IE',
				flags: ['-extoff']
			},
		},
```

# 再実行

ちゃんとIEでテストが動いた。


そもそも`-extoff`を設定しなくても、
IEを起動していない状態でテスト実行したら動く。（自分の環境では）
fasttextとgoでWebページのタグ分類

Webページのタグ分類システム
====

## 概要

ソーシャルブックマークのURL, Tagセットを学習して、
RSSから取得した新しいWebページをタグ分類するシステムです。

学習元データは、[Delicious](https://del.icio.us/)や、[Pinboard](https://pinboard.in/)のエクスポートデータをそのまま利用できます。



![概要フロー](https://github.com/m-hosoi/go-tag-predict/blob/master/doc/diagram.png?raw=true)

## ソースコード
[https://github.com/m-hosoi/go-tag-predict](https://github.com/m-hosoi/go-tag-predict)

※ソースに付属しているデモ用の学習元データは、タグが偏りすぎているのか精度が悪いです。
super(A, self) で消耗した話

## 言いたいこと

`super(A, self)`ではなく`super()` と書いた方が良い。

## 経緯

諸事情により、Aという名前のクラスを、同一モジュール内で２回以上宣言しなければならないとします。
大まかにはこういうコードが書かれます。

```python:fool1.py
class A:
    pass

a11 = A()
a12 = A()


class A:
    pass

a21 = A()
a22 = A()
```

クラス定義というのは、言い換えれば（`type`による）クラスオブジェクトの生成ですから、２つのAクラスは別オブジェクトです。
当然、こうなります。

```
>>> a11.__class__ is a12.__class__
True
>>> a21.__class__ is a22.__class__
True
>>> a11.__class__ is a21.__class__
False
>>> a12.__class__ is a22.__class__
False
```

このことを意識せずに`super(A, self)` を使って予想外の動きをするのに悩まされました。
例えば、次のような定義を考えます。

```python
class Asuper:
    pass


class A(Asuper):
    def get_super1(self):
        return super(A, self)

    def get_super2(self):
        return super()

    def get_super3(self):
        return super(self.__class__, self)
```

Aをインスタンス化してget_super[123] を呼び出すと以下のようになります。

```
>>> a = A()
>>> a.get_super1()
<super: <class 'A'>, <A object>>
>>> a.get_super2()
<super: <class 'A'>, <A object>>
>>> a.get_super3()
<super: <class 'A'>, <A object>>
```

次に、Aを１回インスタンス化した後にAを再定義してから同じことをやってみます。

```
>>> a = A()
>>> class A:
...     pass
... 
>>> a.get_super1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in get_super1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> a.get_super2()
<super: <class 'A'>, <A object>>
>>> a.get_super3()
<super: <class 'A'>, <A object>>
```

`super(A, self)`を使っているget_super1だけ`TypeError`が発生しました。おそらく、実行中のモジュールにおける`A`という名前が参照するオブジェクトが切り替わったことにより制約違反が発生しました。
これを回避するには、get_super3のように、オブジェクトが参照するクラスオブジェクトを指定すると良いと思います。未確認ですが`super`の引数を省略するとこのような挙動になってるのではないかと思います。
あなたのQiita力はどれくらい？データで見るContribute数の統計

#概要

- Qiitaの統計データを解析してみた
- Qiita力が分かるように早見表を作った
- Contribute数，20未満の人々は記事を書いているユーザーの約48%
- 自分のQiita力は上位17%くらいだった


#前書き

最近，家でプログラムを打つことも少なくなり，自分の技術力ってどれくらいなのか？と思い始めた．そこで，自分の技術力向上もかねて，「今年中にQiitaでContributeが1000になるまで頑張ろう」と思いはじめました．しかし，今，自分のContribute数が157くらい．というところを考えると，どれくらい難しいのか？現実的なのか？実現可能性について考えました．そこで，QiitaのContribute数の統計データを集め，どれくらい難しいのかを調べてみました．


#手法

ひとつひとつクローリングしてもいいのですが，[QiitaUserRanking](https://qiita-user-ranking.herokuapp.com/)というサイトで，欲しいデータが集まっていたので，そこから抽出しました．

https://qiita-user-ranking.herokuapp.com/

Contribute数と，その人数のデータがまとめられていました．
まず初めに簡単にスクレイピングします．

```bash
wget -O - https://qiita-user-ranking.herokuapp.com/chart | grep Bar | grep -o "\[.*\]" | sed "s/\],\[/\n/g" | grep -o "[0-9][0-9]*,[0-9][0-9]*" > data.csv
```

data.csvのフォーマットとして，

```
Contribute数,そのContribute数のユーザーの人数
```

となっています．このデータを変換して，Contribute数に合わせ，パーセンタイルに変換します．そして，Qiitaの表記に合わせて出力するPythonスクリプトを書きます．

```py:qiita_stats.py
if __name__=="__main__":
    data = [
        tuple(map(int,l.split(",")))
        for l
        in open("data.csv")
    ]

    all_num = sum(l[1] for l in data)

    for num in [10,20,30,40,50,60,70,80,90,100,200,300,400,500,600,700,800,900,1000,2000,3000,4000,5000]:
        under = sum(l[1] for l in data if l[0] < num)
        print "| %5d | %5d | %5.2f |" % (num,under,(1-float(under)/all_num)*100)
    
    #自分の順位を出す用
    num = 159
    under = sum(l[1] for l in data if l[0] < num)
    
    print "num %5d : %5d / %5d : %5.2f%%"  % (num,under,all_num,(1-float(under)/all_num)*100)
```

出力された表がこちらです．

| Contribute数 |   人数    |    パーセンタイル   | 
|------:|------:|------:|
|    10 |  7767 | 67.19 |
|    20 | 11156 | 52.88 |
|    30 | 13046 | 44.89 |
|    40 | 14307 | 39.57 |
|    50 | 15275 | 35.48 |
|    60 | 16083 | 32.06 |
|    70 | 16735 | 29.31 |
|    80 | 17231 | 27.22 |
|    90 | 17686 | 25.29 |
|   100 | 18065 | 23.69 |
|   200 | 20174 | 14.78 |
|   300 | 21092 | 10.91 |
|   400 | 21684 |  8.41 |
|   500 | 22063 |  6.80 |
|   600 | 22347 |  5.61 |
|   700 | 22556 |  4.72 |
|   800 | 22718 |  4.04 |
|   900 | 22840 |  3.52 |
|  1000 | 22943 |  3.09 |
|  2000 | 23367 |  1.30 |
|  3000 | 23515 |  0.67 |
|  4000 | 23573 |  0.43 |
|  5000 | 23606 |  0.29 |

Contribute数10未満のユーザーは7767人います．そのため，Contribute数10のユーザーは，Qiitaのユーザーの中で，上位67.19%の位置にいます．という見方をします．他の例ですと，Contributeの数が500未満のユーザーが22063人います．そのため，Contributeの数が500のユーザーは上位6.80%の位置にいます．


#考察
QiitaUserRankingによるとContributeが1以上の人は，23674人いるようです．上の表を見て分かる通り，Contribute数が20のユーザーは上位52.88%にいるようです．そのため，Contributeの数が20程度を境に上位と下位が分かれることが分かります．今，現状の私のContribute数は159．スクリプトで計算してみた結果，

```
num   159 : 19496 / 23674 : 17.65%
```

というデータが出てきました．したがって，Contribute数159未満のユーザーが19,496人います．そして，**私の順位は上位17.65%に当たるようです．**


#感想
私が目指していた

**Contribute数1000のユーザーはQiitaの上位約3%に当たります．**

なかなか厳しいなーと思いました．
個人的な話になってしまうのですが，私の記事は1記事当り，平均Contributeが14程度あります．そのため，**Contributeを1000にするには，72記事必要な計算になります．**2017年はあと7カ月の計算なので，**月産10～11記事．週3ぐらいのペースで記事を書けば間に合います．**いやーこれは辛い．
どちらかというともう少しクオリティの高い記事，もしくは引きの強い記事を書いて，１記事当りのContribute数を上げたいなーと思いました．
rails 予約機能をつける。（二回目） rails 予約機能をつける。DateTimePickerを導入する

```ruby:環境
rails 5.0
deviseでログイン機能を作っている
```

予約機能で、日付、時間を手軽に記入するために、DateTimePickerを導入する。

下の図が完成のイメージ
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/83540db6-8029-13dc-509a-6f12bb268eb0.png)


### Gemfileに追加する

```ruby:Gemfile
gem 'bootstrap3-datetimepicker-rails'
gem 'momentjs-rails', '>= 2.9.0'
```

```ruby:
$ bundle install
```
```ruby:application.scss
@import 'bootstrap-datetimepicker';

```

```ruby:application.js
//= require moment
//= require bootstrap-datetimepicker

```
 
```ruby:app/views/books/show.html.erb
  <%= form_for [@book, @book.reservations.new] do |f| %>

<%= f.hidden_field :book_id, value: @book.id %>

<div class="container">
    <div class='col-md-5'>
        <div class="form-group">
            <div class='input-group date' id='datetimepicker6'>
                <%= f.text_field :start_date, :class => 'form-control', :placeholder => "借りたい日"%>
                <span class="input-group-addon">
                    <span class="glyphicon glyphicon-calendar"></span>
                </span>
            </div>
        </div>
    </div>
    <div class='col-md-5'>
        <div class="form-group">
            <div class='input-group date' id='datetimepicker7'>
                <%= f.text_field :end_date, :class => 'form-control', :placeholder => "返す日"%>
                <span class="input-group-addon">
                    <span class="glyphicon glyphicon-calendar"></span>
                </span>
            </div>
        </div>
    </div>
</div>


 

   <%= f.submit "この日程で予約する", class: "btn btn-danger btn-wide" %>    


<% end %>

<script type="text/javascript">
    $(function () {
        $('#datetimepicker6').datetimepicker();
        $('#datetimepicker7').datetimepicker({
            useCurrent: false //Important! See issue #1075
        });
        $("#datetimepicker6").on("dp.change", function (e) {
            $('#datetimepicker7').data("DateTimePicker").minDate(e.date);
        });
        $("#datetimepicker7").on("dp.change", function (e) {
            $('#datetimepicker6').data("DateTimePicker").maxDate(e.date);
        });


    });

</script>

```
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/922653ab-0fe8-4064-c3e4-bfc0856ae4ea.png)
こんな感じになる。

###できる機能
　
・右にあるカレンダーの図を押すと、
がでてきて、日時、時間が選択できる。
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/83540db6-8029-13dc-509a-6f12bb268eb0.png)


・借りる日のカレンダーの図を押すと、現在の日時と時間が出てくる。

・借りた日、時間を選択して、返す時間を選ぶとき、借りた日以前のに日程は選択できない。

###感想
自分は、gem 'bootstrap-datetimepicker-rails'とやってしまって、修正に時間がかかった。
Javascriptを使うと、いろんな設定ができる。　

### 追記

　次回は、借りた人側と貸した人側のviewを作る。
参考資料
http://eonasdan.github.io/bootstrap-datetimepicker/

前回の投稿　　１回目
http://qiita.com/kitaokeita/items/77f66016075a2b773376
HoloLens スラング

Microsoft HoloLensは国内で発売されてから、まだ3か月ですが、すでに多くの開発者や企業が購入しHoloLensの体験会やアプリ開発などのイベントも増えてきました。ここ最近で、ワタシが参加したHoloLensのアプリ開発や技術者同士のネットワーキングを中心としたIT系コミュニティ界隈で使われている**HoloLensスラング**をまとめておくことにしました。今後は増えてくるかもしれませんので、適宜アップデートしていきたいと思います。

## **1. ホロレンジャー** (読み方: ほろれんじゃー)
HoloLensを愛する人たち (主に、HoloLens対応アプリ開発に挑むヒーローな技術系の皆さま)

## **2. ホロ充** (読み方: ほろじゅう)  
HoloLensで充実したライフを過ごしていること

## **3. ホロ獣** (読み方: ほろじゅう)　
HoloLensアニマル

## **4. 隠れホロシタン** (読み方: かくれほろしたん)
国内で公式に販売開始前からHoloLensを所有し、ひっそりと生息していた人たち。とくに、ある意味で覚悟を決めた技術系の方々。最近ではHoloLens未発売の中国エリアで隠れホロシタンが生息しているとか、してないとか。

## **5. We Are HoloRanger!!!** (読み方: うぃーあーほろれんじゃー)
HoloLensを装置した人たちと写真撮影や、乾杯する際の掛け声

## **6. Holofie** (読み方: ほろふぃー)
HoloLensを装着した自分の姿を鏡に映し、HoloLensのカメラ機能で自撮りしている人

## **7. 医療はホロ充** (読み方: いりょうはほろじゅう) 
HoloEyesの杉本真樹先生のセッションで誕生したワード。「今や手術中に患者さんの身体の上に臓器が浮いてるのは当たり前です！」<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/146388/dcc7608a-867c-bbe3-3d08-9da74afc70b9.jpeg" width="300"><br>▲国内初のHoloLens Meetupセッションにて撮影(2017年2月3日)

## **8. マイホロ** (読み方: まいほろ)
個人でジバラ購入したMicrosoft HoloLensのこと

## **9. 社ホロ** (読み方: しゃほろ)
会社が企業資産として購入したMicrosoft HoloLensのこと

## **10. コミュホロ** (読み方: こみゅほろ)
コミュニティ等がクラウドファウンディングや、共同費用で購入し所有しているMicrosoft HoloLensのこと


## Have a nice Geek Life♪
※Twitterで最新情報発信中 @ayatokura
JasmineによるAngularJSのテストで$stateParamsの値をセットする(UI-Router)

# はじめに
この記事では、UI-Routerを使用した場合に、`$stateParam`の値をJasmineによるテストでどのようにモックするかについて説明します。

* この記事では、ui-router 1.0以上を使用することを前提として記載しています。
* `$stateProvider.state()` によるルーティングはcontrollerではなくcomponentに対して行っています。

# 前提: $stateParamsを使用するcomponent
次のサンプルコードのように、`movie`というcomponentを`$stateProvider.state()`によってルーティング設定した場合の例について考えてみましょう。

```js:movieの定義
angular
.module('movies', [])
.component('movie', {
  templateUrl: './movieView.html',
  controller: controller
})

function controller($stateParams){

  this.$onInit = function(){
    // 指定されたIDを元に情報を取得
    var item = getItem($stateParams.id);

    // Do something...
  }
}
```

```js:ルーティング設定
$stateProvider
  .state('movieDetail', {
    url: '/movies/{id:int}',
    component: 'movie',
  });
```
このサンプルコードでは、URLから渡されたidを`movie` componentの中で`$stateParams.id`をとして受け取ります。Jasmineを使用して、この`movie` componentをテストする際、何らかのidを渡してその挙動を確認する必要がありますが、Jasmineではどのようにして`$stateParams`の値を定義すればよいでしょうか。これにはいくつかの方法があります。

# $stateParamsのモック

`$stateParams`をモックして`id`に`1`という値をセットすることを考えてみます。これを実現してJasmineによるテストを行うには、以下のような方法があります。

## $provide.constant
`$provide.constant`を使用して`$stateParams`の値を定義する方法です。これは、以下のように実装します。

```js:$provide.constantによるモック
  beforeEach(module('movies'));

  beforeEach(() => {
    module(function ($provide) {
      $provide.constant('$stateParams', { id: 1 });
    });
  });
```

## $provide.factory
`$provide.factory`を使用して`$stateParams`の値を定義する方法です。これは、以下のように実装します。

```js:$provide.factoryによるモック
  beforeEach(module('movies'));

  beforeEach(() => {
    module(function ($provide) {
      $provide.factory('$stateParams', () => {
        return { id: 1 };
      });
    });
  });
```

## angular.copy
`angular.copy` を使用して、`$stateParams`に値をセットします。この場合、`$stateParams`のオブジェクトを保持したまま、そのコンテンツだけを更新することができます。以下が実装例です。

```js:angular.copy()によるモック
  beforeEach(module('movies'));

  beforeEach(() => {
    inject(($stateParams) => {
      angular.copy({ id: 1 }, _$stateParams_);
    });
  });
```

# 参考
[angular + jasmine + mock $stateParams in a directive](http://stackoverflow.com/questions/35899581/angular-jasmine-mock-stateparams-in-a-directive)
virtualenv を使っているときに sudo pythonして動かなくて困惑した私へ

# 動作確認環境
- Ubuntu 14.04
- Python 2.7.6
- virtualenv 15.1.0

# virtualenv ってなんだっけ？
同一マシン（ＯＳ）上でありながら、複数のPython環境を作ることができる機能です。

- Python のバージョンを変えたり
- ライブラリを切り替えたり
- 一度作った環境を virtualenv コマンドによって別環境に持って行けたり

ということを、ゼロから作るより圧倒的に早く、数コマンドで実行することができるようになります。初めて触ったときはおっかなびっくりでしたが、とても開発向きの機能です。
docker 使えって？


### virtualenv 参考
http://cloverrose.hateblo.jp/entry/2012/10/01/235126
http://qiita.com/H-A-L/items/5d5a2ef73be8d140bdf3
http://qiita.com/Kodaira_/items/feadfef9add468e3a85b

# sudo python <source> が動かない？
私は普段 Windows 上で Anaconda によりpythonを使用しつつ conda コマンドを経由して virtualenv も使用しているのですが、windows では sudo を要求されるという文化が存在しません。したがって、sudo を要求される 事柄があるということをすっかり忘れていました。

そのとき、私は、bottle という python 用のサーババックエンドプログラムを試そうとしていたのです。

```shell-session:bottleインストールまで
$ virtualenv --no-site-packages bottle_test
$ cd bottle_test
$ pip install bottle
```

そして、サンプルプログラムをstart_server.py に写経し、実行しようとしました。

```shell-session:テスト
$ python start_server.py
   ...(中略)...
socket.error: [Errno 13] Permission denied
```
ああ、sudo だな。忘れてた。

```shell-session:sudoで実行
$ sudo python start_server.py
   ...(中略)...
ImportError: No module named bottle
```
あれ？bottle 入れ忘れてたっけ？そんな馬鹿な？

```shell-session:バージョン確認
$ pip freeze
appdirs==1.4.3
bottle=0.12.13
packaging=16.8
pyparsing==2.2.0
six=1.10.0
```
あー、、あれ？インストールされている、、、なんでエラーになる？
、、、ああ！

# 原因：sudoしたときに昇格した後 に使えるvirtualenvがない
sudo すると、一時的にではあるがホームディレクトリが /root に切り替わります、そして、/root には virtualenv は作成していません。そう。今作成したのはあくまで、ログイン中のユーザー自身の virtualenv であって、root用のものではない。ということのようでした。

## 対応？対応。
調べたところ、対応方法は3つほど見つかりました。

1. 仮想環境のpythonを直接呼び出す
2. sudo で仮想環境を作る
3. そもそもsudoが必要なコードを書かない

3 はまあ、、、今回しようとしていることに対して使えないのでおいておきます。

### 1. 仮想環境のpythonを直接呼び出す
仮想環境を作った時のフォルダ構成に大きく依存しますが、例えば次のように作成したとします

```shell-session:virtualenvの作成
~ $ mkdir test
~ $ cd test
~/test $ virtualenv --no-site-packages testenv
~/test $ cd testenv
~/test/testenv $ source bin/activate
```
その場合、仮想環境 testenv が使用する python のパスは `~/test/testenv/bin/python` です。

これを直接 sudo で呼び出すと、仮想環境 testenv を使用した状態で python が起動できます。

```shell-session:思った通り動く実行方法
(testenv) $ sudo ~/test/testenv/bin/python start_server.py
```

### 2. sudoで仮想環境を作る
この方法は試していません。考え方としては簡単で、sudoしたときに使用できるvirtualenvを作成しようということのようです。

```shell-session:sudoでvirtualenvをつくる
$ sudo virtualenv venv
```
この場合、パッケージのインストールは次のようにすればよいようです。

```shell-session
$ sudo venv/bin/pip $PACKAGE
$ sudo sh -c ". venv/bin/activate; pip install $PACKAGE"
```


## sudo + virtualenv の実行参考
https://askubuntu.com/questions/234758/how-to-use-a-python-virtualenv-with-sudo
http://stackoverflow.com/questions/2658902/in-my-virtualenv-i-need-to-use-sudo-for-all-commands
http://emilkirkegaard.dk/en/?p=5770


# おわりに
python virtualenv の落とし穴経験共有をさせていただきました。皆様の開発ライフの参考になれば！

え、python使わない？javascriptメインだって？俺だって普段はC#メインだよ！

では！
Promise.thenをasync/awaitを使って同期させてテストする方法(jest)

# 問題
`Promise.then`は非同期なので`.then`内で起こる事をテストしようとしても、時系列的にthenの内容が評価される前にテストが走ってしまい結果としてテストが失敗する。


例えばこういう`Promise`を内部で返す関数があり、この`.then`内で何かしらの評価をしたい場合

```js:promise.async.js
export default class PromiseTest{
  fetchData(callback){
    this.fetch().then(({status}) => {
      if(status == "ok"){
        callback()
      }
    })
  }

  fetch(){
    return new Promise((resolve, reject) => {
      resolve({
        status: "ok"
      })
    })
  }
}
```

コールバックをmockして、呼ばれるかどうか確認したいがテストが先に走り、その後に`.then`が呼ばれるためテストが失敗する

```js:promise.async.js
import PromiseTest from "./promise.async"

describe('PromiseTest', () => {
  describe('async/awaitなし', () => {
    it('先にテストが走るので、失敗する', () => {
      const mockCallback = jest.fn()
      const target = new PromiseTest()

      target.fetchData(mockCallback)
      expect(mockCallback).toHaveBeenCalled()
    });
  });
});
```

# 解決方法

**async/awaitを使う**
これにより`target.fetchData(mockCallback)`が終わるまで待ってくれるので、続くテストがその後に実行され、正しく評価する事が可能になる。

```js:promise.sync.js
import PromiseTest from "./promise.async"
import "babel-polyfill"

describe('PromiseTest', () => {
  describe('async/awaitアリ', () => {
    it('成功する', async () => {
      const mockCallback = jest.fn()
      const target = new PromiseTest()

      await target.fetchData(mockCallback)
      expect(mockCallback).toHaveBeenCalled()
    });
  });
});
```

##注意

`import "babel-polyfill"`
をしないと
`    ReferenceError: regeneratorRuntime is not defined`
が起きる
[参照](http://qiita.com/devneko/items/c7ddb31f504c8c2a5ac5)



```diff
diff --git a/promise.async.spec.js b/promise.sync.spec.js
index e856584..0661e6b 100644
--- a/promise.async.spec.js
+++ b/promise.sync.spec.js
@@ -1,12 +1,13 @@
 import PromiseTest from "./promise.async"
+import "babel-polyfill"

 describe('PromiseTest', () => {
-  describe('async/awaitなし', () => {
-    it('先にテストが走るので、失敗する', () => {
+  describe('async/awaitアリ', () => {
+    it('成功する', async () => {
       const mockCallback = jest.fn()
       const target = new PromiseTest()

-      target.fetchData(mockCallback)
+      await target.fetchData(mockCallback)
       expect(mockCallback).toHaveBeenCalled()
     });
   });
```
iPhone Safariではareaでtouchイベントが効かない？

この辺の話。
[Are Touch Events in HTML Image Maps Supported in iOS/Mobile Safari - Stack Overflow](http://stackoverflow.com/questions/18754475/are-touch-events-in-html-image-maps-supported-in-ios-mobile-safari)

実際試しても確かに効かなかったのだが、どうも納得がいかなかったから色々試してみたら効くように出来た。

##結論
imgに```addEventListener```で```touchstart```を付ければ効くようになる。

##DEMO
http://jsrun.it/hadakadenkyu/ajtX
![QR](http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl=http%3A%2F%2Fjsrun.it%2Fhadakadenkyu%2FajtX)
Visual Studio 2017にコンポーネント(機能)を追加する方法

Visual Studio 2017をインストールした後、インストールしていない機能を使う必要が出てくる場合があります。そんな時、Visual Studioをアンインストールしてインストールし直す必要はありません。

今回は、**Visual Studio 2017に後から機能を追加したい場合**の手順をまとめておきました。参考にしてください。

#手順
**1.** Windows 10環境の場合、検索ボックスに「**Visual Studio Installer**」と入力し検索する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/146388/74b6448d-0c9f-a6a2-e831-814e3d5956c4.png" width="300">
**2.** 表示されたデスクトップアプリケーションの「**Visual Studio Installer**」を選択して起動する。
**3.** 起動した画面で使っている「**Visual Studio 2017**」が**インストール済**になっていることを確認する。※今回はVisual Studio Community 2017がインストール済の環境です。
**4.** 三本線のアイコンをクリックし「**変更**」を選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/146388/1b441f53-9dae-8f55-0d29-adf10c8cc59e.png" width="500">
**5.** 「**ワークロード**」画面が表示される。追加したい機能のチェックボックスにチェックを入れて「変更」ボタンをクリックする。 ※削除したい機能がある場合はチェックを外す。<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/146388/ae7062d6-4fb6-1edd-1d18-f0c2b2182bb0.png" width="500"><br>
**6.** 個別にSDKやツールなどのコンポーネントを指定して、追加したい場合には「**個別のコンポーネント**」タブを選択し、表示されたリストの中から追加したいコンポーネントのチェックボックスにチェックを入れて「変更」ボタンをクリックする。<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/146388/4323406f-6004-2c31-ef89-3e95255cae10.png" width="500"><br>
**7.**　自動的に該当するパッケージを取得し、機能の追加インストールが開始し終了する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/146388/7e1d9f54-bd32-a98c-712a-bca2b8bd750f.png" width="500"><br>
操作は以上です。

#メモ
OSや各サービスのバージョンが更新されるタイミングで、Visual Studio 2017の内部バージョンも更新され、SDKなどもアップデートする必要があります。できるだけ最新のものを使うのが望ましいのですが、その時点の環境や状況によって互換性が変動しやすい可能性があるので注意しましょう。

#関連サイト
万が一、こちらの手順を進めている途中で問題が発生した場合には、マイクロソフト公式サイト [Visual Studio 2017 で発生するインストールおよびアップグレード エラーのトラブルシューティング](https://support.microsoft.com/ja-jp/help/4015967/troubleshooting-visual-studio-2017-installation-and-upgrade-failures) を参考に対処してみてください。

Have a nice VS Day♪
Rails - マイグレーション

色々やってみます。

# テーブル追加
テーブル追加はモデルを追加すると自動でマイグレーションファイルも作成されます。

```
$ rails g model admins email:string password:string
$ rails db:migrate
```

`g model`で、idは通常自動的に作成されます。また、created_at、updated_atも自動作成されます。

# フィールド名変更

参考：[rails generate migrationコマンドまとめ](http://qiita.com/zaru/items/cde2c46b6126867a1a64)

空のマイグレーションファイルを作って、手動で埋めていく感じっぽい。`rename_column`を使うとできる。

```
$ rails g migration ChangeColumnToBill
```
空のやつができるのでそれに埋めていく。

```20170428124559_change_column_to_bill.rb
class ChangeColumnToBill < ActiveRecord::Migration[5.0]
  def change
    rename_column :bills, :created, :created_at
    rename_column :bills, :modified, :modified
  end
end
```

# 正しくないマイグレーションファイルを実行した場合の修正方法

マイグレーションファイルに誤字があったまま、`rails db:migrate`をしてしまった場合どうするのか？？今まさにその状況なのですが。。rollbackすればいいのか。

```
$ rails db:rollback
```

rollbackして、マイグレーションファイル修正して、再度`rails db:migate`したら出来た。
MacでPython環境を作る（2017/4)


MacでPythonを利用するメモを書いてきたのですが、

* http://qiita.com/zaburo/items/dd1a8323633035614efc
* http://qiita.com/zaburo/items/fbdaf6c04151671407db

ちょっと古くなってきたので更新します。
Macには最初から2.xのPythonが入っていますが、時代は3.xなので、3.xをセットアップします。

なお、私のPython利用目的のメインはDjango利用なので、Djangoを利用するところまで書きます。


## pyenvの削除

まずは、Pyenvがインストールされているものとし、その削除からです。
Pyenvをインストールしていない人はPython3のインストールから初めて下さい。

### アンインストール

brewを使ってインストールしたので、brewを使ってアンインストールします。
pyenv,pyenv-virtualenvを削除するとともに、各環境下のファイルが保存される~/.pyenvを削除します。

```bash
brew uninstall --force pyenv
brew uninstall --force pyenv-virtualenv
rm -rf .pyenv/
```

>pyenv-pip-rehashをインストールしている場合はそれも削除します。brew uninstall pyenv-pip-rehash

### .bash_profileの関連記述の削除

続いて、pyenvが有効に動作するために.bash_profileに加えた記述を削除します。

> それぞれの環境に合わせて対応してください。

```diff
-export PYENV_ROOT="${HOME}/.pyenv"
-export PATH=${PYENV_ROOT}/bin:$PATH
-eval "$(pyenv init -)"
```

削除が完了したら.bash_profileを読み込み直し、バージョンを確認します。
デフォルトのPythonのバージョンとなっているようです。

```bash
source .bash_profile
python -V
Python 2.7.13
```

## Python3のインストール

では、Python3.x系をインストールします。インストールはbrewにより行います。

>brew(homebrew)が入っていない場合はGoogle先生に聞いてインストールして下さい。

```bash
brew install python3
```

## 仮想環境の作成

Python3.3?から仮想環境を管理するpyvenv(venv)が搭載されています。
今回はそれを利用して仮想環境を作成します。

### 仮装環境を作成する

下記のコマンドを実行することで、myenvという独自の環境を管理するディレクトリおよびファイル群が生成されます。

```bash
pyvenv myenv
```

なお、私の環境では、上記コマンドを実行した際、

```bash
WARNING: the pyenv script is deprecated in favour of `python3.6 -m venv`
```

というワーニングが表示されました。どうやら、pyvenvコマンドは今後非推奨なので、

```bash
python3 -m venv myenv
```

を使え！とのことです。実行してみます。

```bash
python3 -m venv myenv
```

myenvディレクトが作成されました。

### 仮装環境を実行する

作成された仮装環境フォルダを指定して、仮装環境を起動します。

```bash
. myenv/bin/activate
(myenv) :~ hoge$
```

> . を付けて起動しないとPermissionエラーとなります。

そうすると、プロンプトが(仮装環境名)となり、仮装環境下に入ったことがわかります。
この状態でpython -Vを実行すると3.xになっていることがわかります。

この状態でpipを実行すると、仮想環境のみにパッケージが反映されます。

### 仮装環境を抜ける

仮想環境を抜けるには、

```bash
deactivate
```

とします。プロンプトが通常の状態に戻ります。

## 仮装環境下にDjangoをインストール

では、仮装環境に入っている状態でDjangoをインストールします。

```bash
. myenv/bin/activate

pip install djange
```

Djangoがインストールされました。

## Ddjangoプロジェクトを作成

では、インストールされたDjango（コマンド）利用して、プロジェクト（ディレクトリ）を作成します。
下記のコマンドを実行します。

```bash
django-admin.py startproject django_test
```

この例ではdjango_testというプロジェクト（フォルダ）が作成されます。

## Djangoの起動

では、作成されたプロジェクトを初期化し、プロジェクトを実行してみます。

```bash
cd django_test
./manage.py #動作するか確認
./manage.py migrate #マイグレーションします。標準ではDBとしてsqliteが利用されます。
./manage.py runserver #開発サーバ起動
```

起動したら、ブラウザからアクセスしてみます。

http://localhost:8000/

動いているようです。
MariaDBとMySQLの部分的互換(MariaDB 10.1.19はMySQL 5.7に部分的に互換しているデータベース)

mariadbは基本的にはmysqlの特定バージョンに近いデータベースであるということが公式ページの解説で理解できます。
MariaDB 10.1.19は、MySQL 5.7に部分的に互換しているデータベースだとわかりました。
MariaDB versus MySQL - Compatibility
("Incompatibilities between MariaDB 10.0 and MySQL 5.6
Incompatibilities between MariaDB 10.1 and MySQL 5.7
Incompatibilities between MariaDB 10.2 and MySQL 5.7
")
https://mariadb.com/kb/en/mariadb/mariadb-vs-mysql-compatibility/#incompatibilities-between-mariadb-101-and-mysql-57
iOS10.3で取り消し線が消える症状と回避策

iOS10.3で`NSAttributedString`による 取り消し線属性(`NSStrikethroughStyleAttributeName`)が機能しなくなる症状に出くわしたので、その内容ととその対処法についてまとめます。

- 取り消し線の適用範囲が全部の文字列であれば再現しない
- 特定文字列のみ取り消し線を適用すると再現　　
  - こういうやつですね。~~ほげほげ~~

# NSBaselineOffsetAttributeName を追加付与で回避
[NSStrikethroughStyleAttributeName , How to strike out the string in iOS 10.3?](http://stackoverflow.com/questions/43070335/nsstrikethroughstyleattributename-how-to-strike-out-the-string-in-ios-10-3)

↑の記事の最後の方に書いてある方法を自分は参考にしました。
`NSBaselineOffsetAttributeName`を追加付与してたところ再現しなくなりました。値は0にしてます。

### 採用理由
できれば、出くわした箇所がそもそも別々のUILabelにしたほうが良いデザインだったにも関わらず、無理やり１行でこと済ませて箇所だったので分けたかったのですが、リリース直後ということもあり手軽さ重視で↑を選びました。

# しかし今度は iOS8 で再現

シミュレータですが調べました。
Sim： シミュレータ
有り： `NSBaselineOffsetAttributeName`属性の追加付与
無し： `NSBaselineOffsetAttributeName`属性の付与なし

|iOS|Sim/実機|有り|無し|
|:-----:|:-----:|:-----:|:-----:|
|8.1|実機|**非表示になる**|**表示される**|
|8.2|Sim|影響受けず|影響受けず|
|8.3|Sim|影響受けず|影響受けず|
|8.4|Sim|影響受けず|影響受けず|
|9.0|Sim|影響受けず|影響受けず|
|9.3|Sim|影響受けず|影響受けず|
|10.0|Sim|影響受けず|影響受けず|
|10.2|実機|影響受けず|影響受けず|
|10.3|実機|**表示される**|**非表示になる**|

### 最終的にはバージョンで処理分離
OSによって処理分岐はしたくなかったのですが、そもそも上にも書いたとおり別の在るべき形があり、落ち着いたタイミングで`UILabel`を2つに分けるので許容しました。
Qualys SSL LabsのテストでA+を取る。簡易版（centos7 + apache | nginx）

[Qualys SSL Labs](https://www.ssllabs.com/ssltest/)のSSLサイトテストで評価A+を取る方法。

Qualys SSL Labsとは？とか各設定についての細かい説明は省きます。参考URLを参照してください。ここではとりあえず同じように設定しておけばA+になりますよ的な方法紹介です。

+ 2017.04.28　create　　

![alt](https://github.com/nakamuraseiji/img/blob/master/SSLServerTest.png?raw=true)

環境
---
OS:centos7  
Apache:httpd-2.4.6-45.el7.centos.x86_64 (baseリポジトリ)  
Nginx:nginx-1.11.13-1.el7.ngx.x86_64 (nginxリポジトリ)

共通の作業
---
１.パッケージを最新にする  
  これ大事です。

  ```text:yumのupdate実行
 $sudo yum -y update
  ```

2.証明書ファイルを用意する
　crt、key、chainファイルなどは予め購入するなり用意してください。

Apache編
---
SSLの設定に関連するものだけ抜き出してます。


```text:コンテキストserver-configの設定はこんな感じ
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
```

   server-config部分はmod_sslでインストールされるssl.confほぼそのままです。  

```text:コンテキストvirtualhostの設定はこんな感じ
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES:!RC4:!DH
SSLHonorCipherOrder On
Header set Strict-Transport-Security "max-age=315360000;"
SSLCertificateFile /etc/httpd/conf.d/ssl/hogehoge.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/hogehoge.key
SSLCertificateChainFile /etc/httpd/conf.d/ssl/server-chain.crt
Header onsuccess append Cache-Control public
```


nginx編
---

DHパラメータファイルを作成しておきます。

```text:2048bit以上にしておきましょう。
$sudo openssl dhparam 2048 -out /etc/nginx/conf.d/ssl/dhparam.pem
```

```text:serverコンテキストの設定はこんな感じ
    listen       443 ssl;

    ssl on;
    ssl_certificate     /etc/nginx/conf.d/ssl/hogehoge.crt;
    ssl_certificate_key /etc/nginx/conf.d/ssl/hogehoge.key;
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers          "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
    ssl_dhparam /etc/nginx/conf.d/ssl/dhparam.pem;
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;
    add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";
```

#####参考URL
---
下記サイトを参考にさせていただきました。
http://shanon-tech.blogspot.jp/2015/12/websslqualys-ssl-labsa.html
https://blog.kksg.net/posts/nginx-secure-ssl
ofShader.cppのデフォルト・アトリービュートメモ

OpenframeworksでGLSLの3.0以上を使うとき、レイアウトをマジで毎回忘れるのでメモ
(0.9.8@visualStudio 2015で確認)

```
0 = POSITION_ATTRIBUTE
1 = COLOR_ATTRIBUTE
2 = NORMAL_ATTRIBUTE
3 = TEXCOORD_ATTRIBUTE
```
上記の順番で取り込まれるので、うまくLayoutを確認してみること。
ofShader.cppで下記のような書き方されてる。

```cpp:ofShader.cpp
bool ofShader::bindDefaults() const{
	if(shaders.empty()) {
		ofLogError("ofShader") << "bindDefaults(): trying to link GLSL program, but no shaders created yet";
		return false;
	} else {
		bindAttribute(ofShader::POSITION_ATTRIBUTE,::POSITION_ATTRIBUTE);
		bindAttribute(ofShader::COLOR_ATTRIBUTE,::COLOR_ATTRIBUTE);
		bindAttribute(ofShader::NORMAL_ATTRIBUTE,::NORMAL_ATTRIBUTE);
		bindAttribute(ofShader::TEXCOORD_ATTRIBUTE,::TEXCOORD_ATTRIBUTE);
		return true;
	}

}
```

テッセレーションとかは0.9.8では未実装の模様。
使いたい場合は自分で書くこと。

```C++:ofShader.cpp
string ofShader::nameForType(GLenum type){
	switch(type) {
		case GL_VERTEX_SHADER: return "GL_VERTEX_SHADER";
		case GL_FRAGMENT_SHADER: return "GL_FRAGMENT_SHADER";
		#ifndef TARGET_OPENGLES
		case GL_GEOMETRY_SHADER_EXT: return "GL_GEOMETRY_SHADER_EXT";
		#ifdef glDispatchCompute
		case GL_COMPUTE_SHADER: return "GL_COMPUTE_SHADER";
		#endif
		#endif
		default: return "UNKNOWN SHADER TYPE";
	}
}
```

ofGLProgrammableRenderer.cpp
の中にマトリックス関係。
ダウンロードしてきたコードが動かないとかの時は、先頭文字が大文字になってるとかありがち。

```cpp:ofGLProgrammableRenderer.cpp
static const string VIEW_MATRIX_UNIFORM="viewMatrix";
static const string MODELVIEW_MATRIX_UNIFORM="modelViewMatrix";
static const string PROJECTION_MATRIX_UNIFORM="projectionMatrix";
static const string MODELVIEW_PROJECTION_MATRIX_UNIFORM="modelViewProjectionMatrix";
static const string TEXTURE_MATRIX_UNIFORM="textureMatrix";
static const string COLOR_UNIFORM="globalColor";
```

ofShaderとは関係ないけどブレンドモードの中身も同じcpp内に記述してある。うっかり忘れがちなのでメモ。

```cpp:ofGLProgrammableRenderer.cpp
void ofGLProgrammableRenderer::setBlendMode(ofBlendMode blendMode){
	switch (blendMode){
		case OF_BLENDMODE_DISABLED:
			glDisable(GL_BLEND);
			break;

		case OF_BLENDMODE_ALPHA:
			glEnable(GL_BLEND);
			glBlendEquation(GL_FUNC_ADD);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
			break;

		case OF_BLENDMODE_ADD:
			glEnable(GL_BLEND);
			glBlendEquation(GL_FUNC_ADD);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE);
			break;

		case OF_BLENDMODE_MULTIPLY:
			glEnable(GL_BLEND);
			glBlendEquation(GL_FUNC_ADD);
			glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA /* GL_ZERO or GL_ONE_MINUS_SRC_ALPHA */);
			break;

		case OF_BLENDMODE_SCREEN:
			glEnable(GL_BLEND);
			glBlendEquation(GL_FUNC_ADD);
			glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);
			break;

		case OF_BLENDMODE_SUBTRACT:
			glEnable(GL_BLEND);
			glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE);
			break;

		default:
			break;
	}
	currentStyle.blendingMode = blendMode;
}
```
Rails - rails-erdでＥＲ図を出力

参考：[Try Gem】rails-erdを使ってＥＲ図を出力してみる。](http://tech.mof-mof.co.jp/blog/try-rails-erd.html)

RailsのgemでER図が出せるらしい。

```
$ brew install graphviz
```

これを追加する。

```
gem 'rails-erd'
```

ER図作成

```
$ rails erd
```

とりあえず出てきた。なんか参考サイトでリンクされている本家サイトがなくなっている。あんまりメンテされていないかもしれない。

参考：[Rails ERDの導入と実行](http://qiita.com/kanpou_/items/74eca1846101e6db3387)

やっぱりメンテされてないっぽい。
オプションもなんかエラーになるし、使うのやめよう。