OmniAICreator/Qiita-1.07M huggingface dataset:
いろいろあり、vagrantの再々インストールから、RubyOnRailsまで。

vagrant up 時に以下が出る。（なぜか出ない時もある）

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device


上記が出る場合、vagrant ssh出来ない（サーバに繋がらない）。
しかし、vagrant statusを見ると、普通に上がっている。

vagrant upしなおすと普通に上がったりする。

以前から気になっていた点として・・・

フォルダ構成

MyVagrant---
  -- .vagrant
  -- Package →このファイルは謎。vagrant packageで作ったboxではない。0kb。
  -- Vagrantfile
  -- mycentos
     -- .vagrant
     -- Vagrantfile

つまり、vagrantをインストールし直した（しかも、違う場所に）関係で、vagrant一式が２つあるという。（vagrant up自体は、mycentos内で行っている。）

ドットインストール様
http://dotinstall.com/lessons/basic_localdev_win
の補足情報、
「更新後「Failed to mount folders in Linux guest...」というエラーが出る場合」
により、

vagrant plugin install vagrant-vbguest

を実行する。これ、どこで実行するのか分からなかったのでとりあえず、

C:\Users\ユーザー名　配下で実行。無事終了、と思ったのだが・・・

その後のvagrantコマンドがすべて、

C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant.rb:59:in `require': cannot load such file -- childprocess (LoadError)
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant.rb:59:in `<top (required)>'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant:105:in `require'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant:105:in `<main>'

もうどうにも拉致があかない、ということでvagrant再々インストール

- [ ] アンインストール

アプリと機能より

C:\HashiCorpが当然消えますね。

- [ ] 不要のファイル削除

上記の「気になっていた点」は、まあ前回再インストール時に、MyVagrant以下を削除してないからですよね、当たり前ですね。

がっさり消す

そして、~/.vagrant.dも前回消してなかった。

がっさり消す。
これで、完全にきれいさっぱりなはず。

これ以降は、ドットインストールにて。

http://dotinstall.com/lessons/basic_localdev_win/30803

公式よりダウンロードしたwindows版（vagrant_1.8.1.msi）を使用。

vagrant box add とvagrant init の違いがいまいち分からんな～。
とりあえず、ドットインストールにあるようにvagrant init で。

boxですが、いままで32bit windows10であることから、

bento/centos-6.7-i386 

を使っていたのですが、よく見るとx64ベースプロセッサと書いてある！ので、

bento/centos-6.7 

にしてみる。ここら辺は、私たちのようなシロウト＋若干アルファにとっては分かりにくい。

vagrant init bento/centos-6.7 

vagrant up
で普通に上がった！

続けて
http://dotinstall.com/lessons/basic_localdev_win/30806

これがまた、マシンパワーがないからか、時間がかかるんですね。（１時間ほど）

gem install rails
50分ほど。普通の機械なら、もっと全然早いです。
参考までに、使用マシンはASUS EeeBook X205TAとなります。

http://dotinstall.com/lessons/basic_rails_v2/24903
$ rails new myapp
$ rails s
サーバは、普通に上がった。
この環境では、therubyracerは必要ない模様。
http://dev.2oh.com:3000/
ポート3000番でアクセスするが、「ウェルカム画面」が見れない。
→Rails 4.2.5.1のため、サーバ起動は、以下のオプションを指定する必要があるとのこと。
$ rails s -b 0.0.0.0
http://dev.2oh.com:3000/
Welcome aboard!
出てきた。
http://dotinstall.com/lessons/basic_rails_v2/24904
rails generate scaffold User name:string score:integer
rake db:migrate
で、http://dev.2oh.com:3000/Usersに繋ぐと、
Routing Error
No route matches [GET] "/Users"
という感じでエラーになった。
http://dev.2oh.com:3000/users
としたら、ＯＫ。
scaffoldコマンドではUserという風に大文字で始めるが、アドレスの指定では、usersという風に全て小文字にするようだ。
http://dotinstall.com/lessons/basic_rails_v2/24905
Scala でファイルを扱う

# やりたいこと

下記Java の実装を Scala で使う。

```java

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class TestReadFile {
  public static void main(String args[]) {
    String fileName = "file.txt";
    try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
      stream.forEach(System.out::println);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```

# Scala バージョン

```scala
import java.util.stream.Stream
import java.nio.file.Files
import java.nio.file.Paths
import java.util.function._
import java.nio.charset.StandardCharsets
import java.io.IOException

object ReadFile {
  def main(args: Array[String]) = {
    val file = "file.txt"
    try {
      val stream = Files.lines(Paths.get(file), StandardCharsets.UTF_8)
      stream.forEach(new Consumer[String] { def accept(s: String) = println(s) })
    } catch {
      case e: IOException => e.printStackTrace()
    }
  }
}
```

# メモ

Java の

```java
stream.forEach(x -> foo())
```

は

```java
stream.forEach(
  new Consumer<Path> { public void accept(Path x) { foo(); } }
)
```

で、Scala で実装すると

```scala
Files.walk(Paths.get(""))
  .forEach(new Consumer[Path] { def accept(s: Path) = println(s) })
```

となるらしい。

## REPL で確認

```
scala> import java.nio.file.Files
import java.nio.file.Files

scala> import java.nio.file.Paths
import java.nio.file.Paths

scala> import java.util.stream.Stream
import java.util.stream.Stream

scala> import java.util.function._
import java.util.function._

scala> Paths.get("file.txt")
res0: java.nio.file.Path = file.txt

scala> Files.lines(Paths.get("file.txt"))                                             
res1: java.util.stream.Stream[String] = java.util.stream.ReferencePipeline$Head@5bf8fa12

scala> res1.forEach
<console>:15: error: missing arguments for method forEach in trait Stream;
follow this method with `_' if you want to treat it as a partially applied function 
       res1.forEach

scala> res1.forEach _
res3: java.util.function.Consumer[_ >: String] => Unit = <function1>

scala> res1.forEach(new Consumer[String] { def accept(s: String) = println(s) })
java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1
  at java.io.BufferedReader$1.hasNext(BufferedReader.java:574)
  at java.util.Iterator.forEachRemaining(Iterator.java:115)
  at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
  at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
  ... 33 elided
Caused by: java.nio.charset.MalformedInputException: Input length = 1
  at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
  at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
  at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
  at java.io.InputStreamReader.read(InputStreamReader.java:184)
  at java.io.BufferedReader.fill(BufferedReader.java:161)
  at java.io.BufferedReader.readLine(BufferedReader.java:324)
  at java.io.BufferedReader.readLine(BufferedReader.java:389)
  at java.io.BufferedReader$1.hasNext(BufferedReader.java:571)
  ... 36 more
```
windows７ composerでsymfonyを導入した記録

#windows php composerの導入方法

##1.composer のインストール
各コマンドそのままコピペでOK
php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php

php -r "if (hash('SHA384', file_get_contents('composer-setup.php')) === '7228c001f88bee97506740ef0888240bd8a760b046ee16db8f4095c0d8d525f2367663f22a46b48d072c816e7fe19959') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

php composer-setup.php

php -r "unlink('composer-setup.php');"

※phpがインストールされていない場合は最初にインストール
参照サイト
http://www.phpbook.jp/install/install/index1.html
ちなみに私はダウンロードしてフォルダー名「php」にしてcドライブ直下に置きました。（c:\php)

##2.Symfonyをインストール
コマンドそのままコピペ
php composer.phar create-project symfony/framework-standard-edition /xampp/htdocs/Symfony 2.8.0

/xampp/htdocs/Symfonyが格納されるフォルダ位置の設定になるので各自かえてください。
2.8.0　はバージョン情報が変えられるので該当のバージョンでだうんろーどしてください。
UITableViewのセルを選択不可にする方法

**2018/05/10：Swift 4.1に対応しました**
--

すぐ忘れてしまうので、備忘録として書いておく。

## UITableView全体のセルを選択不可にする
最初からセルの選択はしないようにする、ということが決まっているのであれば、この設定をする。

Storyboard上ではUITableViewの``Selection``の項目を``No Selection``にする。

<img width="262" src="https://qiita-image-store.s3.amazonaws.com/0/40009/c3cedfaa-a2e4-6035-4398-3e1e10e460c1.jpeg">

コード上で設定する場合は``allowsSelection``をfalseにする。

```swift:swift
self.tableView.allowsSelection = false
```

## UITableViewの特定のセルを選択不可にする
この設定にはいくつかパターンがある。

Storyboard上ではUITableViewCellの``Selection``の項目を``None``にする。

<img width="260" src="https://qiita-image-store.s3.amazonaws.com/0/40009/79e02199-4cbc-8c6a-0877-f2d881f6e8f5.jpeg">

ただし、この場合は該当のUITableViewCellクラス全体に影響が出る。

例えば、このセクションのこのセルだけ、という一部のセルの場合は使えない。
そういう場合はコードで設定する必要がある。

これは2番目のセルだけ選択不可にする場合。

```swift:swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    if indexPath.row == 1 {
        // セルの選択不可にする
        cell.selectionStyle = .none
    } else {
        // セルの選択を許可
        cell.selectionStyle = .default
    }

    return cell
}

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

    switch indexPath.row {
        case 0:
            return indexPath
        // 選択不可にしたい場合は"nil"を返す
        case 1:
            return nil
            
        default:
            return indexPath
    }
}
```

これでOK。

## 余談
一部のブログで``tableView(_:willSelectRowAt:)``でnilを返すだけ、というのを見かけたけど、これはあくまでも選択時のハイライトは無効にしない。

この部分だけを設定して、セルを押し続けるとタップした直後はハイライトされないが、実際は選択されているように見えてしまう。

そのため、``UITableViewCell.selectionStyle = UITableViewCellSelectionStyle.none``の設定も必要。
複数ファイルの「ブロックの解除」を一括で行う方法

インターネットからダウンロードしたファイルには、セキュリティが考慮され、次のようにブロックが設定される場合があります。
複数のファイルを選択した状態でプロパティを表示しても、「ブロックの解除」ボタンは表示されません。

![ブロックの解除.png](https://qiita-image-store.s3.amazonaws.com/0/114618/7e42d666-ccce-0dcd-7123-8aaa55ce04f0.png)

#方法

1. ブロックの解除をしたいファイルを、１つのフォルダにまとめます。
2. まとめたフォルダを、ZIP形式で圧縮します。
3. 圧縮したZIPファイルを、展開します。


確認したWindows7は、ファイルシステムがNTFSですが、ZIPファイルにすることで、代替データ ストリーム(ADS)の情報が消えたようです。
ImageMagick+RMagickで画像に書き込もうとしたらArgumentError "no text"

# 事象
## 現象
ImageMagickに渡すコードの先頭文字が「@」だとこのエラーが起きる
参考： http://stackoverflow.com/questions/18697306/how-to-stop-imagemagick-in-ruby-rmagick-evaluating-an-sign-in-text-annotatio

## 実際のコード
```
def annotate(記述先画像, source_text)
text = source_text
draw = Magick::Draw.new
draw.annotate(記述先画像, 0, 0, x座標, y座標, text) do
      self.font = 超かっこいいフォント
      self.fill = '#FFFFFF'
      self.align = Magick::CenterAlign
      self.pointsize = 48
      self.kerning = 0
end
```

問題が起きたのはこのコード。
ArgumentError "no text"と出た。
textには`text`の中身があるはずなので `no text`というのは不自然。

`text` には文字列が入り、画像に書き込まれる。
エラーが起きたログを見ると`text`には `@hoge-san` のような文字列が入るはずだった。

# 原因と対応
## だいたいRMagickのせい
ImageMagickはコマンドラインから`convert`や`annotate`などのコマンドを使い画像操作を行う。
RMagickはrubyからImageMagickを操作できるようよしなにやってくれる

## ImageMagick「`@`はじまりなら特別処理」
調査した感じ `@hoge-san` を変数として解釈し、「そんな文字列宣言されてないよ」と言っている。
ImageMagick、お前の仕業か

## 対策
@はじまりでも変数と解釈させない
エスケープ文字を入れる。
`\@`のままでコマンドラインに渡されるがコマンドライン側で先頭の`\`はエスケープ文字と解釈されるため`\`は画像には書き込まれない

```
def annotate(記述先画像, source_text)
text = source_text.gsub(/^@/, '\@')
draw = Magick::Draw.new
draw.annotate(記述先画像, 0, 0, x座標, y座標, text) do
      self.font = 超かっこいいフォント
      self.fill = '#FFFFFF'
      self.align = Magick::CenterAlign
      self.pointsize = 48
      self.kerning = 0
end
```

先頭文字が`@`ならエスケープした

## 結果
正常に画像変換できた
よく使う Chrome 拡張

新しいPCのセットアップをするついでに、利用している Chrome 拡張を紹介がてらリストアップしてみました。
数は少ないですがお役に立てれば幸いです。

# [Advanced REST Client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo)

REST API 開発の必需品。
簡単なフォーム入力で、API を叩けます。
他にも同様の拡張はいくつか有りますが今のところこれが一番使いやすいです。

# [Google Keep](https://chrome.google.com/webstore/detail/google-keep-notes-and-lis/hmjkmjkepdijhoojdojkdfohbdgmmhki?hl=ja)

ちょっとしたメモを取るのに便利。
複数デバイスからもアクセス出来るため、
出先等でちょっとしたメモをしておくときに使います。

# [FireShot](https://chrome.google.com/webstore/detail/capture-webpage-screensho/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja)

開発をしているとスクリーンショットを取りたくなることが多々あると思います。
そんな時はこれ。

* 表示中の領域
* 指定した範囲
* ページ全体

とスクリーンショットが手軽に取れるのでオススメです。

# [LiveMd](https://chrome.google.com/webstore/detail/livemd/gdkdfndgjifoabdbagnmodicadpngfko?hl=ja)

Chrome 上で利用できる Markdown エディタ。
以前は vim で編集したり [kobito](http://kobito.qiita.com/) や [Mou](http://25.io/mou/) を使っていましたが、
手軽さを考えるとこちらに軍配が上がります。

qiita ユーザーには kobito が馴染み深いかとは思いますが、
騙されたと思って使ってみていただきたい逸品。

# 番外

* [艦これウィジェット](https://chrome.google.com/webstore/detail/%E8%89%A6%E3%81%93%E3%82%8C%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88/iachoklpnnjfgmldgelflgifhdaebnol?hl=ja)
    * いやぁ…提督には便利です。
Rubyでターミナルのサイズを取得する

コンソールアプリを開発する時に使えるかもです。

```ruby
`tput lines`
`tput cols`
```
で取得できます。

サイズの変更をプロセスに通知するシグナルSIGWINCHを使い、サイズの変更を検知する例。

```ruby
resize = proc do
  p `tput lines`
  p `tput cols`
end

loop do
  Signal.trap(:WINCH, &resize)
end

```
ansible ec2の挙動が変わっていた話

# ansible ec2とは

http://docs.ansible.com/ansible/ec2_module.html

ec2上のインスタンスをansibleのinventoryとして扱えるようにしてくれる便利なものです。

例えば、

```
- name: do something
  hosts: 'tag_Name_{{tag}}'
  ...
```

のようにすると、特定のタグがついたインスタンスに対し同じ操作を行う、という設定が用意にできます。
auto scalingなどしているときはとても便利です。

しかしansibleをupdate(1.8.4 -> 1.9.4)し、上記のinventory scriptも更新したところ軒並み動かなくなりました。

# ec2のtagを確認

ec2のコンソールから確認したところ想定したタグはちゃんとついていたのですが、

```
PLAY [hogehoge] ******************************************* 
skipping: no hosts matched

PLAY RECAP ******************************************************************** 
```

というように、そんなタグついたインスタンスないよという返事でした。

# ec2インスタンスを全部取得

下記コマンドで、管理下のインスタンスリストが取得できます。
 
```
 inventory/ec2.py --list
```

このリストを眺めていて気付いたのですが、ec2上では"hoge-fuga-piyo"というタグが付いている場合、ansible ec2インベントリ的には"tag_Name_hoge_fuga_piyo"というふうに、ハイフンが全てアンスコになっていました。

そこで、先ほどのymlで指定していたタグもアンスコに変更することで、ちゃんとec2インスタンスが取得できるようになりました。

自分が関わるリリースが近いときに、気軽にバージョンを上げてはいけないという教訓を新たにしました。
Drupalでシステム開発と保守をしてきた所感

#はじめに
2016/04現在、Drupal歴1年弱。
Drupalでシステム開発(見積り/設計/製造/試験/リリース)と保守をしてきた。
あくまでも経験則、所感のため参考程度に見てもらえばと思う。
尚、本投稿は随時更新していく。

#各工程での所感・コツなど
##見積り
Drupalに限った話ではないが、
機能 と 工数、それに加えて見積り時点で
想定していることがあれば記載しておく。

- Drupalのバージョンはどれか
- ディストリビューションを使うのか
- どのAPIを使うのか
- どのモジュールを組み合わせて実現するのか
- どの外部サービスを使う想定か

など。

##設計
###基本設計、詳細設計
Drupalだからこう書く！みたなテクニックはあまりない気がする。
ただ、設計するにあたり以下のような考え方は必要そう。

1.Drupalの標準機能で実現できるか
2.モジュールで実現できるか、画面からの設定のみで実現できるか
3.hookで実現できるか、どのhookを使うのか
4.既存モジュールのソースを改修して実現できるか[^1]
5.モジュール + 画面からの設定 + hookによるふるまいの変更 で実現できるか

[^1]: モジュールをバージョンアップする際に改修したロジックを上書きする恐れがあるため、運用を考慮すること

また、Drupalやディストリビューションモジュールの機能仕様ベースでの
仕様になる点は明記すべきだと思う。
（※自前で作りこむ場合は不要）

機能実現するにあたり、Drupalエバンジェリスト級のエンジニアでない限り、
使うモジュールの調査を必ず行う必要がある。
調査を行っていく中で、機能実現できていたりする。
つまり、調査 ≒ 製造 に近い部分がある。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/65994/be67938f-b2bd-8a75-0abc-a01417880df7.png)

##製造

以下があると便利。

- <del>EclipseなどのIDE。</del>Sublime Text
- XDebug
- [Devel](https://www.drupal.org/project/devel)モジュール
 - 一昔前まではEclipseでブレークポイントを貼ってステップ実行をしていたが、dpm/dpqがあれば事足りる
- [Examples for Developers](https://www.drupal.org/project/examples)モジュールが参考になる

- コマンドからDrupalを操作できる[Drush](https://www.drupal.org/project/drush)もあると尚良。

- リアルタイムでログを確認できる[Watdhdog Live](https://www.drupal.org/project/watchdog_live)も地味に便利

##試験
###ブラックボックス
- 一般的なWeb系のシステムと同様に、画面を打鍵する。
- もちろん、Seleniumも利用可
- Develという開発用モジュールを使うと、コンテンツノやユーザなどのダミーデータを
自動生成してくれるため、若干便利。

###ホワイトボックス
Drupalでの経験はなし。
[ここ](https://www.drupal.org/node/811254) とか [ここ](https://www.drupal.org/simpletest-tutorial-drupal7)に情報があるので
参考にするとよさげ。

##品質判定
うーん。難しいところ。
Drupalの標準機能は信頼してあげてもよい気がするが、

> 自前でコーディング＋Drupal標準機能 あるいは サードパーティ製のモジュールによって実現した機能

上記のような場合、どうだろう。

自前でコーディングした部分は数行でも、
同値・境界値やバリエーションを考慮して、
しっかり網羅して品質を担保してあげる必要が当然ある。

すると、規模(ステップ数)の割に、試験項目数が多すぎる、
またはバグ数が少なすぎるということが起こり得る。

##リリース
- モジュール／ソースの配置
- モジュールの有効化
- 画面からの設定（極力、import/exportで対応する）

リリース時はメンテナンスモードをONにして、
administrator権限のアカウントのみログイン出来るようにしておく。


##保守
- 運用チームより改善要望
- Drupalのバージョンアップ/セキュリティフィックス
- モジュールのバージョンアップ/セキュリティフィックス
- 上記反映後のリグレッションテスト および リリース

バージョンアップやセキュリティフィックスを知る方法として、以下がある。

- Drupal標準機能を使う
- [Security advisories](https://www.drupal.org/security)を確認する（RSS、メーリングリスト有り）
- Twitter（‎@drupalsecurity）をフォローする（メーリングリストより早い）

#最後に
- Drupalを使う前提条件だけで工数が浮く（学習コストは高い）
 - 認証機能やユーザ登録機能、コンテンツ管理機能が既に存在するため
 - 要件を満たせるモジュールがあれば、コーディングなしで機能実現できる場合もある
 - 従来のWebアプリケーションフレームワークとはまったく使い勝手が異なる
- おおきな仕様変更は弱そう
 - API（フック）による実装
 - モジュールと画面からの設定が絡みあう
- コントリビュートモジュールを改修する際は、調査時間を多めに見積もる
- 差分バックアップ＆リストアは、データモデル的にキツそう
- コンテンツタイプに対するインポート/エクスポートは、運用上できるようにすべき！
- Drupalは大規模開発でもイケる聞いたことがあるが、どちらかと言うとイテレーション開発で中小規模のシステムの方が向いていると思う
- コントリビュートモジュールを有効にすると、どのURLが有効になるか把握すること
 - 不要な画面はアクセスできないよう設定が必要
 - Workflowモジュールであれば、/workflow や /workflow/summary 等が有効になる
Xcode でビルドも実行もできるのにエラー表示が発生する場合の対処法

Xcode で コーディング中に、エラー表示はされるが、ビルドするとエラーが消えて実行できるのに、またソースを修正するとエラー表示がされるという経験はないだろうか？エラーメッセージは以下のような感じだったりします。

<img width="701" alt="Screen Shot 2016-04-06 at 3.01.39 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/65634/ef3f3964-b928-8835-d8fe-b88ab5ce1338.png">

```.console
Use of unresolved identifier 'MyManager'.
```

ちゃんとコードがプロジェクトに含まれている事を確認して、テストの為実行させると、エラーが消えて実行できたりする。どうなってんだろうと色々調べてみました。

Use of undeclared type” in Swift, even though type is internal, and exists in same module
http://stackoverflow.com/questions/25437891/use-of-undeclared-type-in-swift-even-though-type-is-internal-and-exists-in-s

質問の切り口は異なるかもしれませんが、問題の解決方法は同じでした。答えは、Target に Tests や UITests などがあった場合に、あるターゲットから特定の class などにアクセスできない場合にエラーになります。

エラーが発生している部分はこんな感じです。

<img width="702" alt="Screen Shot 2016-04-06 at 3.54.36 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/65634/c3ac28eb-8cb2-9d54-6c41-682731699a1c.png">

`MyManager` のコードの部分はこんな感じです。

<img width="702" alt="Screen Shot 2016-04-06 at 3.48.32 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/65634/2ed14705-9b4f-014c-8f2e-7ccddbf9146a.png">


つまり、エラーの出たコードの部分では、アプリ自体には `MyManager` は含まれるが、Tests や UITests には `MyManager` が含まれないので、「`Use of unresolved identifier 'MyManager'`」と言われるというわけでした。そこで、Project から MyManager のソースを選んで、Tests と UITests のターゲット含めてあげれば（下図）、エラー表示は消えてくれます。

<img width="702" alt="Screen Shot 2016-04-06 at 3.19.57 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/65634/7523b873-2742-91f3-75f6-9ead3f8b1bd5.png">

実は、この現象、過去にも時々発生して、その度毎にすったもんだしてこの答えにたどり着いて、わかっているつもりでしたが、今回もすっかり（しっかり）失念していましたので、備忘録として記録する事にします。

もっとも、今回のケースに該当しない要因も考えられますので、ご留意ください。

（注記）
エラーにならないケースもあるようなので、今後注意深く観察していきたいと思います。

（環境表記）

```.console
Xcode: Version 7.3 (7D175)
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
```
Macでbrew installをしたらPermissionで怒られた時の対処（簡易的に）

# 現状
先日Qiita中の先生方々の中で画面遷移がMarkdown形式で記入できるというエディタをリリースされた方がいらっしゃいまして（[■ここリンクです](http://qiita.com/hirokidaichi/items/ff54a968bdd7bcc50d42)）参考にインストールをしましたところ、久々にbrewを使って躓いたので、ここにメモしました。

# 内容
graphvizとdotが必要（[参考にした先生](http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d)）なので、下記のコマンドでインストールしようとしたら、Permissionで怒られた。

**`~$ brew install graphviz`**
→`Error: Cannot write to /usr/local/Cellar`

**`~$ sudo brew install graphviz`**
→`Error: Cannot write to /usr/local/Cellar`

sudoを使ってもダメでした。よって直接/usr/local/Cellarの権限をいじりました。

# 方法
まずdoctorをします。

**`~$ brew doctor`**
多分あまりbrew周りをメンテナンスしていない人（自分）はwarningが結構出てきます。

```
Warning: /usr/local/Cellar isn't writable.
You should probably change the ownership and permissions of /usr/local/Cellar
back to your user account.
  sudo chown -R $(whoami) /usr/local/Cellar
```

を見つけたら、Cellarがwritableになっていない状態ですので、記載の通りにchownしてあげましょう。

まずいまログインしているユーザーを確認します。
**`~$ whoami`**
次にchownをしてあげます。
**`~$ sudo chown -R whoami /usr/local/Cellar`**

そうすると。素直に
**`~$ sudo brew install graphviz`**
が実行できると思います。

```
remote: Counting objects: 3657, done.
remote: Compressing objects: 100% (3540/3540), done.
remote: Total 3657 (delta 15), reused 1578 (delta 5), pack-reused 0
Receiving objects: 100% (3657/3657), 2.70 MiB | 512.00 KiB/s, done.
Resolving deltas: 100% (15/15), done.
==> Installing dependencies for graphviz: libpng
==> Installing graphviz dependency: libpng
==> Downloading https://homebrew.bintray.com/bottles/libpng-1.6.21.el_capitan.bo
######################################################################## 100.0%
==> Pouring libpng-1.6.21.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/libpng/1.6.21: 25 files, 1.2M
==> Installing graphviz
==> Downloading https://homebrew.bintray.com/bottles/graphviz-2.38.0.el_capitan.
######################################################################## 100.0%
==> Pouring graphviz-2.38.0.el_capitan.bottle.1.tar.gz
🍺  /usr/local/Cellar/graphviz/2.38.0: 506 files, 67M
```
こんな感じです。

以上になります。
CSSでSan Franciscoフォントを指定する

iOS9やapple watch、MacOSX El Capitan等で採用されているシステムフォントのSan Franciscoですが
現在のところCSSではそのままfont-familyに指定しても表示されません。

##font-familyの指定方法
```css
.target {
  font-family: -apple-system, 'BlinkMacSystemFont', '.SFNSDisplay-Regular', sans-serif;
}
```

`-apple-system`だけではchromeなどで表示されないので`BlinkMacSystemFont`も併記します。
また一部記号が正常に表示されないこともあるので気になる場合は`.SFNSDisplay-Regular`も指定してください。
最後の`sans-serif`は`San Francisco`フォントが無い場合のフォールバックです。
必要な場合は`sans-serif`の前にその他のフォントを任意で指定してください。

##参考
[How to use Apple's new San Francisco font on a webpage](http://stackoverflow.com/questions/32660748/how-to-use-apples-new-san-francisco-font-on-a-webpage/32660790#32660790)
[Redis]RedisをWindowsにインストールしてみる

# Redisのインストール

Redisは公式にはWindowsサポートを行っていないようです
http://redis.io/download

>Windows
>The Redis project does not officially support Windows. However, the Microsoft Open Tech group develops and maintains this Windows port targeting Win64.

ただしMSOpenTechによって64bitWindowsOS用にバイナリが配布されているようなのでそちらを使います

https://github.com/MSOpenTech/redis/releases

ページに移動すると現時点でダウンロードできるバージョンが二つありますが、今回は3.0.501を選択します

<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/b777a159-adda-5e73-e008-58876868807a.png" width="80%" height="80%">

参考：[Key-Valueストア「Redis 3.0」リリース、クラスタリングにネイティブ対応](https://osdn.jp/magazine/15/04/04/070400)

ダウンロードしたインストーラーを実行していきます
途中インストール先指定とともにパスを追加するか聞かれるのでチェックします

<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/000c0e95-1556-482a-fdc2-da5c22c6599e.png" width="80%" height="80%">

あとはそのまま進めていきます
インストールが完了したらWindowsのサービスに追加されていることを確認します

<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/ea18ee60-1758-3877-0801-693e20dbdbf4.png" widht="80%" height="80%">

これでRedisのインストールは完了となります

# Redisの動作確認

Redisをインストールしたフォルダに移動して、redis-cli.exeを起動し、以下のコマンドのようになれば正しく動いている状態になります

```
127.0.0.1:6379> set test hoge
OK
127.0.0.1:6379> get test
"hoge"
```
KVM on VMware ESX (ESX上でKVMを使用する)

【vmware ESX上の仮想サーバでKVMを使用する際の注意事項】
(Openstack構築中にハマったのでメモ。。。)

■環境
物理サーバ：HP Proriant
仮想ソフト：VMware ESX 5.1.0
仮想OS   ：Ubuntu14.04

vmware ESX上でKVMを使用する際、KVMをインストールしただけでは使用できない。
下記のように、CPUが対応していないとメッセージが出る。
~$ kvm-ok
INFO: Your CPU does not support KVM extensions
INFO: For more detailed results, you should run this as root
HINT:   sudo /usr/sbin/kvm-ok

仮想OSのvmxファイルを修正して、VT-xを有効にする必要がある。
仮想OSが起動している場合は一旦 shutdown する。

① vSphere Client で、仮想マシンのプロパティを変更
ゲストOSを右クリックし、「設定の編集」⇒「オプション」⇒「CPI/MMU 仮想化」の「Intel(R) VT-x/AMD-V(TM) を命令セット仮想化に使用し、ソフトウェアをMMU仮想化に使用」を選択

② vmxファイルを編集する。
ESXに ssh でログインして、該当の仮想マシンの vmx ファイルに、「vhv.enable = "TRUE"」と追記

③ 確認
ゲスト OS を起動してログインし、kvm_intel モジュールがロードされているか確認する。

$ lsmod | grep kvm
　kvm_intel             138538  4
　kvm                   431315  1 kvm_intel

$ kvm-ok
　INFO: /dev/kvm exists
　KVM acceleration can be used
MacからIEで動作確認する方法


Microsoft先生がModernIEというサイトを作っているのでそこにアクセス。

なんか見た目変わったな...一応90日間でライセンス切れるのでそのたびに入れなおしが必要です。

# 導入

Tools > Virtual machinesをクリック

色々選ぶ画面になるので...

![スクリーンショット 2016-04-06 14.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/9186/f8c811ff-33ea-0cfe-ea0c-f3f9acef697e.png "スクリーンショット 2016-04-06 14.44.40.png")

![スクリーンショット 2016-04-06 14.45.52.png](https://qiita-image-store.s3.amazonaws.com/0/9186/4dc23f2b-5869-7e01-5dc5-f11792ef7b36.png "スクリーンショット 2016-04-06 14.45.52.png")

適当なやつで、今回はVirtualBoxで。

VirtualBox入ってればDLしたイメージをダブクリで動く筈。

# ホストOSのlocalhostにIEからアクセスする

VB上のWindowsでNotepadを右クリック

Adminとして起動し、C:\windows\system32\drivers\etc\hostsを開く

```
10.0.2.2 localhost
```

こういうのを追加するとIEでlocalhostと打つと、ホストOSのlocalhostにアクセスできる。

やりかたは色々あるはず。

IEの下位ブラウザシミュレーション機能は無駄に正確なので、IE11あたりを入れてF12 > emulationでIE8とかで動かすと、忠実にIE8のCSSのバグとかを再現する。
Eclipse on OSX で、P2 update を使って gnu.io.rxtx をインストール

背景
====

Eclipse で組み込み開発を行う場合、DSDP プロジェクトが提供している TM を使うと、ワークベンチの中でシリアルポート端末が使えて、とっても便利です。

TM が提供する端末は、シリアルポートの制御を gnu.io.rxtx に頼っています。
しかしながら、OSX 上で動作する Eclipse から、公式のP2アップデートサイトへアクセスしても、 「gnu.io.rxtx.macosx が見つからない」と弾かれてしまいます。archive.eclipse.org に存在するミラーサイトも同様です。

原因
====

上記アップデートサイトでは、 content.jar!content.xml の内容が古く、gnu.io.rxtx.macosx が、 osgi.arch=x86 または osgi.arch=ppc のときのみ有効になっています。
osgi.arch=x86_64 が無い一方、最近のバージョンの Eclipse は osgi.arch=x86_64 なので、gnu.io.rxtx.macosx の検出に失敗します。

対策
====

上記を修正したアップデートを作成して Github Pages に上げました。

http://pizzafactory.github.io/bits/rxtx/

ブラウザからアクセスしても 404 エラーになります。Eclipse の p2 アップデートを使ってください。

なお、公式は、この問題を認識したものの修正できなかったようで、公式アップデートサイトに含まれている最後のバージョン (2.1.7.4) では、 MacOSX のサポートが切り落とされています。
アップデートのUIで過去のバージョンも表示できるようにした上で、一つ手前の 2.1.7.3 をインストールしてください。
AngularJS $logProviderを使ってログの表示/非表示を切り替える


AgnularJSでコンソールにlogを出力し、デバッグするときのお話。
$logProviderの使ってon/offを切り替える方法の情報が意外と見つかりにくかったのでメモ代わりに書いた。


## console.debug()
例えばChromeの開発者ツールでは、Consoleペインからjavascript標準の`console.info()`メソッドで記述した内容が出力されるので、これまでサッと確認したいときのデバッグ手段として一般的だった。

AngularJSのチュートリアルなどでもconsoleメソッドが使われたコードをよく見かけるが、ログの表示/非表示を切り替えることができないので不便。解決するために`$logProvider`を使う。

```
console.debug ("[debug] edit action called.");
console.debug ("[debug] editing article:"+article.id);
```

![スクリーンショット 0028-03-04 12.20.36.png](https://qiita-image-store.s3.amazonaws.com/0/34236/98d2b816-9758-b4d1-32d7-b16e95c01c3a.png "スクリーンショット 0028-03-04 12.20.36.png")


## $log関数 / $logProvider
Angularが1.1.2より標準で用意しているログ出力のためのシンプルなservice。デフォルトではコンソールにデバッグメッセージは出力されない。ng.$logProvider#debugEnabledを使用して、これを変更することでログの表示が有効になる。

```javascript:app.js
var myApp = angular.module('myApp', []);

myApp.config(function ($logProvider) {
    $logProvider.debugEnabled(true);
});
```

```javascript:controller.js
myApp.controller('myCtrl',
    function ($scope, $log) {
        $scope.printDebugLog = function () {
            $log.debug("debugLog");
        };
    }
);
```

![スクリーンショット 0028-03-04 13.23.14.png](https://qiita-image-store.s3.amazonaws.com/0/34236/2d1d04b1-2020-731a-0de2-0be6cdc064af.png "スクリーンショット 0028-03-04 13.23.14.png")

`debug()`だけではなく、以下の5つのプロパティが利用できる。

* $log.debug() : デバッグメッセージを出力
* $log.error() : エラーメッセージを出力
* $log.info() : インフォメーションメッセージを出力
* $log.log() : ログメッセージを出力
* $log.warn() : 警告メッセージを出力

![スクリーンショット 0028-03-04 13.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/34236/78a7e64b-172a-516e-9c87-61f3ef4cabd5.png "スクリーンショット 0028-03-04 13.24.32.png")

あとはこのdebugEnabledを、true/falseで切り替えてやればログの表示/非表示がサッと実現できる。開発環境と本番環境で分岐させておくと良さそう。

```
# 開発環境ではdebugモードをonに
$logProvider.debugEnabled(true);

# 本番環境ではdebugモードをoffに
$logProvider.debugEnabled(false);
```


## 気をつけること

### ・debugEnabled(false);で非表示にできるのはdebug()プロパティのみ
`$logProvider.debugEnabled(true);`で、$log関数のすべてのプロパティを表示できるが非表示にできるのは`$log.debug()`プロパティのみ。その他の4つのプロパティには非表示が効かないので気をつける。

### ・$log関数ではログに出力される該当箇所の情報が、angular.jsコード内の行数になる
`console()`で出力されたログには呼び出された行の行番号が出る (`article_edit.self-8fa6598622ac384c8da410a5cf168456329cde922ea0eed4d968a117286e8dca.js:17`) が `$log.debug()`で出力されたログには (`angular.js:12294`) のように該当箇所の行番号が表示されないので適切に使い分ける。


## 参考
[AngularJS: API: $log](https://docs.angularjs.org/api/ng/service/$log)
[AngularJS: API: $logProvider](https://docs.angularjs.org/api/ng/provider/$logProvider)
[How to turn on/off $log.debug in AngularJS](http://stackoverflow.com/questions/15561853/how-to-turn-on-off-log-debug-in-angularjs)
[feat($log): add $log.debug() by nlaplante · Pull Request #1625 · angular/angular.js](https://github.com/angular/angular.js/pull/1625)
Excelファイルから別のExcelファイルの列を読み取って何かするVBA

ExcelVBAは使う機会が多い割に毎回思い出せないのでメモします。

# コード
```vbnet
Option Explicit

Const BOOKPATH As String = "C:\Users\noraplant42\target.xlsx"

Sub Main()
On Error GoTo Exception
    Dim xls As New Excel.Application
    Dim wbook As Workbook
    Dim wsheet As Worksheet

    Dim maxRow As Long
    Dim row As Long
    Dim colData As Variant

    ' 対象のExcelファイルを開く
    Set wbook = xls.Workbooks.Open(BOOKPATH, 0, True)
    Set wsheet = wbook.Worksheets("targetSheet")

    ' 対象列の最大行を取得する
    maxRow = wsheet.Cells(Rows.Count, 1).End(xlUp).row

    ' 対象列を範囲で取得し、配列にする
    colData = wsheet.Range(wsheet.Cells(2, 1), wsheet.Cells(maxRow, 1))

    ' 対象列の配列を回して何か処理する
    For row = 1 To (maxRow - 1)
        Cells(row, 5) = colData(row, 1)
    Next row

    wbook.Close False
    Set xls = Nothing
    Exit Sub

Exception:
    If Not wbook Is Nothing Then
        wbook.Close False
        Set xls = Nothing
    End If

    MsgBox Err.Description
End Sub
```

## 覚えておくと良さそうなこと
* `Range`の値を`Variant`変数に入れると、二次元配列として扱うことができます。
* `Err.Description`には標準のエラーメッセージが入ります。`On Error GoTo ...`をしなかった場合に表示されるエラーメッセージと同じものです。
Railsのmigrationでreferencesの張られたカラムを削除する


Railsのmigrationでreferencesの張られたカラムを削除するとき、自動生成されたmigrationのままではカラムの削除ができなくてハマったので書き残しておく。

何も考えずにremove_columnをつかって

```
$ rails generate migration remove_カラム名_from_テーブル名
```

でカラムの削除をしようとすると、外部キー制約に引っかかるため削除ができない。

「カラム名:references」を後尾につけると、remove_reference と remove_foreign_key が自動付与されるので良い。

```
$ rails generate migration remove_カラム名_from_テーブル名 カラム名:references
$ rails g migration remove_content_from_item content:references

class RemoveContentIdFromItem < ActiveRecord::Migration
  def change
    remove_reference :items, :content, index: true
    remove_foreign_key :items, :contents
  end
end
```

```
$ bundle exec rake db:migrate

== 20160226074929 RemoveArticleFromContent: migrating =========================
-- remove_reference(:contents, :article, {:index=>true})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Cannot drop index 'index_contents_on_article_id': needed in a foreign key constraint: ALTER TABLE `contents` DROP `article_id`/Users/imachan0322/Project/kapiyva-20160226/db/migrate/20160226074929_remove_article_from_content.rb:3:in `change'
```

できない・・・
原因がわからなくて1時間くらいハマってようやく以下でできた。

```ruby
class RemoveContentFromItem < ActiveRecord::Migration
  def change
    remove_foreign_key :items, :contents
    remove_reference :items, :content, index: true
  end
end
```

remove_foreign_key と remove_reference の順序を逆にすると大丈夫だった。
PHP & Apache & EC2でサーバー構築


## 概要
EC２へデプロイし、とりあえず繋がるまでをまとめています。
Amazon Web Services上でEC2インスタンスの作成と、ローカルから作成されたEC2インスタンスにsshのログインまでが完了していることが前提です。

## 使用した環境
* PHP 5.3.29  
* EC2 Amazon Linux AMI 2015.09.1 (HVM)（プロダクションマシン）


## 1. ユーザーの作成

ユーザーをec2-userからrootに切り替えてパスワードを設定する。  

```
$ sudo su -
$ passwd

- New password: に続けて新しいパスワードを設定する
- all authentication tokens updated successfully.と表示されればok
```

デフォルトのec2-user以外の作業用ユーザーを作成する。

```
$ useradd [任意の名前]
$ passwd [作成したユーザー名]

- New password: に続けて新しいパスワードを設定する
- all authentication tokens updated successfully.と表示されればok
```

作成した作業用ユーザーにsudo権限を与える。

```
$ usermod -G wheel [作成したユーザー名]
$ sudo visudo

- 以下のコメントアウトを外す
# %wheel ALL=(ALL) ALL
```

exitしてec2-userへ戻り作成した作業用ユーザーで入れるか確認する。
以降の作業は基本的に作業用ユーザーで行い、rootやec2-userでは作業しない。

```
$ su - [作成したユーザー名]
```

## 2. デプロイするディレクトリを作成

```
- 現在のディレクトリを確認
$ pwd
/home/[作成したユーザー名]

- デプロイは/var/www/html 配下に作成
$ sudo mkdir /var/www
$ sudo mkdir /var/www/html
```

## 3. 必要なものを順番にインストール

これからインストールするものは必ずローカル環境のバージョンと合わせるようにする。

**1）前準備**

```
$ sudo yum update -y

$ yum -y install httpd
$ sudo service httpd start
$ sudo chkconfig httpd on
```

**2）Apacheの設定を変更する**

```
$ vi /etc/httpd/conf/httpd.conf

- ブラウザからディレクトリ構造を表示できないようにする
Options Indexes FollowSymLinks
-> Options -Indexes FollowSymLinks

- ファイルが見つからない時の「Forbidden」ページからOS情報を非表示にする
ServerTokens OS
-> ServerTokens Prod

- ファイルが見つからない時の「Forbidden」ページからIPやApacheの情報を非表示にする
ServerSignature On
-> ServerSignature Off

- htaccessを有効にする
<Directory "/var/www/html">
AllowOverride None
</Directory>
-> <Directory "/var/www/html">
-> AllowOverride All
-> </Directory>

- Apatcheを再起動して変更を適応させる
$ sudo service httpd restart
```

**3）phpのインストール**

```
$ yum install php php-devel php-mysql php-gd php-mbstring -y
$ php -v
```

**4）dstatのインストール**

```
- dstat(リソース状況確認コマンド)をinstallする
$ yum install dstat

- dstatはaliasを追加しておくと便利
- vim /etc/profile にて末尾に以下を追加する
・alias dstat='dstat -tlcmgdrn'
・alias dstat-cpu='dstat -tlcr'
・alias dstat-mem='dstat -tlcm'
・alias dstat-disk='dstat -tlcdr'
・alias dstat-net='dstat -tlcnd'
```

## 4. 参考

・[AWS EC2 Linux開発環境 構築メモ - Qiita](http://qiita.com/oshou/items/b9c2de7bbf0116ffca6a)
【メモ】rpmとyumで依存パッケージ確認

自分ですぐ忘れてmanを見返す羽目になるのでメモ。

rpmで該当のパッケージがどのパッケージに必要？→
$ rpm -q --whatrequires パッケージ名

例) rpm -q --what requires glibc

このファイルってどのパッケージ削除すると消えてしまうんだっけ？→
$ yum provides 該当ファイル名

例) yum provides /etc/mime.types
Firefox 45以降に失われたTab Groupを取り戻す

Firefox 45.01の話です。

Firefoxには便利なタブ一覧機能、Tab Group機能があります。いえ、ありました。
この機能は45以降で削除されてしまいました。

https://support.mozilla.org/ja/kb/tab-groups-removal

Firefoxをよくするためにということですが、なにがよくなるのかイマイチわかりません。
まあ大人の事情なのでしょう。

ここは代替アドオンをインストールして、Tab Groupの機能を取り戻します。


# Tab Groups
https://addons.mozilla.org/en-US/firefox/addon/tab-groups-panorama/


すかさず 
Command +Shift + E

<img width="674" alt="Screen Shot 2016-04-06 at 13.26.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/7f452fa1-774d-a23b-3308-9695db0d5edc.png">


YES!
PythonでFizzbuzz（1行で）


python初心者に基礎を教える機会があり、Fizzbuzz問題で内包表現に慣れてもらおうという狙いでやってもらった問題
今回は1から30まででやってみることにした。
環境はPython3.5.0

普通のもの

```python:fizzbuzz.py
for n in range(1, 31): 
	if n % 3 == 0 and n % 5 == 0:
		print("FizzBuzz")
	elif n % 3 == 0:
		print("Fizz")
	elif n % 5 == 0:
		print("Buzz")
	else:
		print(n)
```

1行縛りの例(3かつ5はめんどくさいので15にしてしまう)

```python:fizzbuzz2.py
["FizzBuzz" if n % 15 == 0 else "Fizz" if n % 3 == 0 else "Buzz" if n % 5 == 0 else n for n in range(1,31)]
```
これはlistを作るだけで表示はされないのでもう少し改良

```python:fizzbuzz3.py
print("\n".join(["FizzBuzz" if n % 15 == 0 else "Fizz" if n % 3 == 0 else "Buzz" if n % 5 == 0 else str(n) for n in range(1,31)]))
```

PEP8を思いっきり無視の1行の長さなので、実際に内包が長くなるときは適宜改行はするべきですね。

>
shiracamusさんのコメントにあるような記述でもFizzBuzz可能です。とてもトリッキーですがpythonならではの書き方って感じなのでそちらも見ていただければ
Docker コンテナ内からホストの IP アドレスを知る

以前 Docker のコンテナ内から、ホストで立ち上げているサーバーの機能にアクセスするという少し変わった使い方をした。

そのときは Docker 標準のネットワーク設定を使ったためホストのアドレス `172.17.0.1` をスクリプトに直接記述したのだが、この値はネットワークの設定によっては変化する可能性がある。

なんとなく不便。ネットワーク環境に関わらず、ホストのアドレスを正しく扱いたい。

というわけで、コマンドで簡単に抽出する方法を調べてみた。

環境
----

- Ubuntu 15.04
  - ホストもコンテナも同じ。
- Docker 1.9.1

ざっくり言うと
----

コンテナの eth0 が利用するゲートウェイのアドレスが、コンテナから見えるホストのアドレスになっている。

これを抽出すればいい。

抽出
----

### `ip route`

Docker 標準のネットワーク設定を使って、コンテナ内でコマンドを実行したときの出力は以下。

~~~
$ ip route
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.2
~~~

ここから抽出する。

#### ホストの IP アドレス

~~~bash:ip_route___gateway_address.sh
ip route | awk 'NR==1 {print $3}'
~~~

先ほどの例では 172.17.0.1 となる。

#### ネットワーク範囲

~~~bash:ip_route___network_range.sh
ip route | awk 'NR==2 {print $1}'
~~~

先ほどの例では 172.17.0.0/16 となる。 CIDR 形式。

### `route`

`ip` コマンドなんて新しすぎてうちのコンテナにはない、という状況では `route` コマンドを使う。

コンテナ内での出力例は以下。

~~~
$ route
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0
~~~

#### ホストの IP アドレス

~~~bash:route___gateway_address.sh
route | awk 'NR==3 {print $2}'
~~~

先ほどの例では 172.17.0.1 となる。

#### ネットワーク範囲

`route` の場合、ネットワークアドレスとサブネットマスクを別々に取ることになる。

~~~bash:ip_route___network_address.sh
route | awk 'NR==4 {print $1}'
~~~

~~~bash:ip_route___subnet_mask.sh
route | awk 'NR==4 {print $3}'
~~~

先ほどの例では、順に 172.17.0.0 と 255.255.0.0 が出力される。
Elixir:マクロで定義された関数をオーバーライドする

# マクロで関数を定義する

Elixirでは, 関数を定義しているマクロを呼び出すことで, その関数を呼び出し元の関数として定義することができます.

つまり

```ex
defmodule MyMacro do
  defmacro __using__(opts) do
    quote do
      def hello() do
        IO.puts "Hello from macro"
      end
    end
  end
end
```

こんな感じのモジュールを用意し

```ex
defmodule UseMacro do
  use MyMacro
end
```

このように別のUseMacroモジュールでuseしてやることとで, マクロ内で定義されたhelloをUseMacroモジュールの関数として定義することができるわけです.

```ex
iex(3)> UseMacro.hello
UseMacro.hello
Hello from macro
:ok
```

# 関数をオーバライドする
しかし, この方法で定義される関数の一部だけを別処理に変えたい場合があるかもしれません。
関数を定義しているマクロの方に直接手をいれることができるならば, 何も悩むことはなくマクロの方を修正すればいいのですが,
そうでない場合は, 以下のように同じシグニチャを持つ関数を__マクロを呼び出す前に__定義してやることで, 
オーバライドすることができるようです.

```ex
defmodule UseMacro do

  def hello() do
    IO.puts "Hello from module"
  end

  use MyMacro
end
```

```ex
iex(2)> c("/home/vagrant/phoenix_sample/lib/use_macro.ex")                                                                                                                                       
use_macro.ex:7: warning: this clause cannot match because a previous clause at line 3 always matches
[UseMacro]
iex(3)> UseMacro.hello
UseMacro.hello
Hello from module #<--- モジュールで定義された関数が呼び出されている
:ok
```

もっとも, この方法はあくまでハックなので, ライブラリの更新などで動かなくなって悲しみを背負う覚悟の元で使用してください:P
href がない a タグを XPath で取得する

Capybara 使ってテストしようとしたのだけど、やり方がわからなかったので調べた。
時間かかったけどやり方見つけたので備忘録。

```rb
have_xpath(%(//a[contains(normalize-space(string()), "ほげ 1") and not(@href)]))
```

normalize-space の存在を知るのに時間がかかった。
Capybara のソースに `XPath.string.n.is(locator)` というのを見つけてようやくわかった。

XPath は滅多に使わんので使う度に色々と忘れてますな。
期間のマッチング

業務システムでよくある要件で、例えば、

> 深夜の時間帯のご利用は30%OFFにします

みたいな話で、料金計算をするとき、割引時間帯に利用時間範囲が入っているかどうか判定し、割引率を算出します。
よくよく考えればシンプルな話ですが、毎回、図を書いて考えている気がするのでまとめておきます。

## 期間のマッチングのパターン

ルールの開始時刻をRs、終了時刻をRe、判定対象データの開始時刻をTs、終了時刻をTeとします。
![image](https://qiita-image-store.s3.amazonaws.com/0/8475/592b85d1-8876-efcb-6e13-99b1f95c6eff.png)

当然ながら、Rs ≦Re および Ts ≦Te が成立します。

ここで2つの期間の交わり方のパターンは、以下のとおり6パターン存在します。
![image](https://qiita-image-store.s3.amazonaws.com/0/8475/0c6eeb20-967b-ec2b-4a21-0e93ec4e35bd.png)

さて、割引の適用ルールには、実業務においてはこれらのパターンの組合せで以下の3つがありうるかと思います。それらについて、条件式の書き方をまとめます。

### 1. 割引期間内に利用期間がすっぽり収まる

この真ん中のケースです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/c5168034-9a17-eaef-ecc2-f45b7870a5ae.png)

これを素直に書くと、以下のようになります。

```java
if (rs <= ts && ts <= re && rs <= te && te <= re) {
    // 30%OFFの処理
}
```

ちなみに前置記法を使うと自然な感じで書けます。

```clj
(if (and (<= rs ts re) (<= rs te re))
  ;; 30%OFFの処理
)
```

ただ、これはN/Aの領域を利用すると、以下のように書けることがわかります。N/Aのうまい扱い方については『[エスイーが要件定義でやるべきたったひとつのこと(実践編)](http://qiita.com/kawasima/items/98b5636db0172d9b5051)』を参照して下さい。

```java
if (ts >= rs && te <= re) {
   // 30%OFFの処理
}
```

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/38214c26-7e6d-f2a7-914c-763b3549c6d2.png)


### 2. 割引期間に利用期間が少しでも入っていればよいケース

これは以下の4パターンです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/d65c3d5c-738f-3bb2-40c0-8862aea0a91a.png)

したがって、条件式は以下のようになります。

```java
if (ts <= re && te >= rs) {
    // 30%OFFの処理
}
```

### 3. 利用開始または利用終了が割引期間に入っている、またぎはだめなケース

またぐケースを許されない場合は、あまりキレイにはいきません。
![image](https://qiita-image-store.s3.amazonaws.com/0/8475/185226af-01a7-13d4-80da-7546473ef34f.png)

利用開始または終了が割引期間に入っていることを条件式にします。(ま、字面通りですね)
![image](https://qiita-image-store.s3.amazonaws.com/0/8475/a2691e6a-d8c1-f905-6c6d-04a9f51ba205.png)

```java
if ((rs <= ts && ts <= re) || (rs <= te && te <= re)) {
    // 30%OFFの処理
}
```

## まとめ

業務要件で似たようなものが出てきた際にはどうぞお使いください。
出現確率1%のおみくじを100回連続引けば、1回は当たる？

# 今回のお題
インスパイアされた元記事ではおみくじではなくガチャなんですが、、、

>確率が明らかになったところで，それを正しく理解できなければ意味がない。よくある間違いが，「出現確率1％なら，100回ガチャを引けばほぼ確実に出るだろう」という思い込みだ。実際のところ，ガチャを100回引いて出現確率1％のものが当たる確率は約63％でしかない。表現を変えれば，100人のプレイヤーがそれぞれ100回引くと，63人は当たるが，残り37人は100回全部ハズレ，という感じだ。
http://www.4gamer.net/games/999/G999905/20160305003/

実際にはどういうことなんでしょうか？
数学的な背景、Pythonで計算＆図示までを簡単にご紹介。

# 確率論的には
>1回あたり1%の確率で当たりが出るガチャを連続100回引いた場合、1回も当たりが出ないことがある？！

ということですね。神社にあるおみくじだと1回引いたおみくじは通常元に戻しません（その代わり、神社の境内のどっかに結んだりしますねー）ので、1回引くごとに全おみくじから1枚ずつ減っていきます（非復元抽出）。
今回のガチャでは、常に100枚のくじのうち1回が当たり、、という状況なので、復元抽出に当たりますね。（おみくじで言えば自分のくじを元に戻すことに相当）

## Pythonで計算してみよう
ということで、
>1回あたり1%の確率で当たりが出るガチャを連続100回引いた場合、1回も当たりが出ないことがある？！

を定量化してみます。これは、要は100回連続でハズレを引き続けることに相当するので

```math
(1-0.01)^{100}=0.99^{100}
```

を計算させればいいですね。pythonで計算させると、

```py
>>> 0.99**100
0.3660323412732292
```
なので`0.366≒36.6%`程度1回も当たらないことになりますね（残念）。これは、元記事の
> 残り37人は100回全部ハズレ，という感じだ。

の部分ですね。

# 数学的にちゃんと考える
今回の場合、非復元抽出で100回連続試行しますので、数学では「二項分布」が相当します。

よくある話が「コインの裏、もしくは表が100回中何回出るか？」みたいな文脈ですが、オモテウラの出方がイビツで「表が出る確率が0.01、裏が出る確率が0.99」のような状況です。（どんなコインか見てみたいものですが、、）

## 定式化
そうすると、100回の非復元抽出で`r`回当たりが出る確率は

```math
\begin{eqnarray}
{}_{100} C _r\times 0.01^r\times (1-0.01)^{100-r}
\end{eqnarray}
```

## 幾つか計算してみる
### `r=1`のとき
```math
\begin{eqnarray}
{}_{100} C_1\times 0.01\times (1-0.01)^{99} = 100\times 0.01\times 0.99^{99}=0.3697...
\end{eqnarray}
```
⇒大体`0.370`くらいなんで、1回も当たりを引かない確率と、1回当たりを引く確率が大体一緒なんですね。

### `r=2`のとき
```math
\begin{eqnarray}
{}_{100} C_2\times 0.01^2\times (1-0.01)^{98} = 4950\times 0.01^2\times 0.99^{98}=0.1849...
\end{eqnarray}
```
⇒今度は`0.18`くらいなので、いきなり確率が半減してしまいます、、、


# 確率分布描いてみっか
、、、と個々のケースを都度都度考えているのも大変なので、（確率）分布を描いてみると全体像が見えてきそうです。


## Pythonでグラフを描いてみる
```py
import pandas as pd
import numpy as np

init = 0
trial = 100
prob = 0.01

### 組み合わせを再帰的に計算
def comb(n, r):
    if n == 0 or r == 0: return 1
    return comb(n, r-1) * (n-r+1) / r 

### r回当たりである確率を計算
def binominal(n,r,p):
    return comb(n,r)*(p**r)*((1-p)**(n-r))

### 関数のベクトル化
bi = np.vectorize(binominal)

### 試行回数を配列で持たせる
arr = np.arange(init, trial)

### 二項分布をベクトル演算で計算
plot_values = pd.DataFrame(bi(trial, arr, prob), columns=['probability'])

### 図示
plot_values.plot()
```

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/80539/67a23748-4927-81b2-50b3-346694368b03.png)

⇒`0`や`1`の付近でピークが終わり、急激に確率が0に近づいていますね、、、（汗）

# Poisson分布
↑の分布、どっかで見たなー、という方は鋭いです。Poisson分布ですね。Wikipediaの「二項分布」のページでは
>n が大きく p が十分小さい場合、np は適度な大きさとなるため、パラメータ λ = np であるポアソン分布が 二項分布B(n, p) の良好な近似を与える。すなわち、期待値λ = npを一定とし、nを十分大きくしたとき、

```math
P[X=k]\simeq \frac{\lambda^ke^{-\lambda}}{k!}
```

とあります。我々は`python`を使って`r=0, 1, 2`の計算を行いましたが、試しに上の式に`k=0, 1, 2`を当てはめてみましょうか。`λ=100×0.01=1`に注意すると一般に

```math
P[X=k]\simeq \frac{1}{e\times k!}
```

なので、

```math
P[X=0]=P[X=1]=\frac{1}{e} \simeq 0.3679...
```

となり、`r=0, 1`の時が確率が同程度であることが確認できますね。さらに、

```math
P[X=2]=\frac{1}{2e}\simeq 0.1839...
```

なので、`r=2`の場合は`r=0, 1`の場合の確率の半分というところも大体合っていますね！
tmuxのステータスラインにmouseやズームモードの状態を表示する

最近 vim や tmux などステータスラインの表示に絵文字を活用するのがマイブームです。

# マウスモードを表示

以前から、以下のエントリにあるような設定を入れて `prefix-m` でマウスモードのON/OFFを簡単に切り替えられるようにしています。
[tmuxでマウスモードのON/OFFを単一キーで簡単に切り替える - Qiita](http://qiita.com/kawaz/items/7b15e18ca8e072c1dc57) 

で、切り替えが簡単だとモードの表示をしたくなるよね。ってことでマウスモードがステータスラインに表示されるようにしてみました。


```tmux.conf
# マウスモードを右側に表示 ← NEW！
set -g status-right '#(tmux show-option -g mouse | grep -q on && echo "🐹  ")'

# マウスモードを簡単切り替え（デフォルトはOFFにしておいて、prefix+mで切替える） https://y-kawaz.hatenadiary.org/entry/20130308/1362735393
set-option -g mouse off
bind-key m if-shell "tmux show-options -g mouse | grep -q off" "set-option -g mouse on" "set-option -g mouse off" \; refresh-client
```

で、↓こんな感じになりました。
![dabf45c5fab7e981180e467929c94aa7-compressor-loop.gif](https://qiita-image-store.s3.amazonaws.com/0/18726/5ca508e4-ddeb-8804-2f10-ef25ae9cae62.gif)

🐹 （ネズミの絵文字）は黒背景で結構視認性が良くていい感じです。

# 各ウィンドウのタブにズームモードを表示

同じような感じで、`prefix-z` でカレントpaneを全画面表示にしたり戻したりという機能をよく使うのでこれもステータスに拡大モードの表示が出来るようにしてみました。

ズームモードの場合は tmux 側で `window_zoomed_flag` というフラグが使えるようなのでこれを利用します。
具体的には拡大モードを示すアイコンを挿入したい位置に `#{?window_zoomed_flag,🔍 ,}` を埋め込む感じになります。

パワーライン的な表示設定があるせいでちょっとごちゃついてますが、例えば現在の僕の設定は以下のようになっています。各自の設定ではウィンドウ名表示の `#W` の前か後ろ辺りに足すのが良いと思います。

```tmux.conf
set -g window-status-format "#[fg=colour244,bg=colour234]  #I #[fg=colour240] #[default]#{?window_zoomed_flag,🔍 ,}#W "
set -g window-status-current-format "#[fg=colour234,bg=colour31]#[fg=colour117,bg=colour31] #I  #[fg=colour231,bold]#{?window_zoomed_flag,🔍 ,}#W #[fg=colour31,bg=colour234,nobold]"
```

`window-status-format` はカレントウィンドウ以外のタブ用、`window-status-current-format`はカレントウィンドウ用の設定箇所です。

で、↓こんな感じになりました。
![f5f2cf9bb6dbce384f53741636c80780-compressor-loop.gif](https://qiita-image-store.s3.amazonaws.com/0/18726/3f2e5262-f464-88d3-0cd9-a27d7fe63b72.gif)

🔍 （虫眼鏡アイコン絵文字） はちょっと視認性が良くないので他の文字に変えようか検討中ですが、とりあえず今はこれで運用中。


# ambiguous width (曖昧な文字幅)について
絵文字は大抵のアプリでは内部的に**半角幅**として扱われるようですが、表示上は**全角幅**な感じになる、特にターミナル環境ではちょっと嫌な感じのユニコード文字です。

で、この文字を半角として扱うか全角として扱うかどうかの設定が、`iTerm` や `vim` などの各種アプリにあることがありますが、昔から色んなケースを経験した結果、全てのアプリで半角として扱うようにして表示上の文字が被る問題には目をつぶるのが無難だなという結論に落ち着きました。表示上は綺麗でも見た目とカーソル位置がズレてしまうことで隣の文字を消してしまう事故の方が厄介なのでね…。

なので絵文字を埋めるときは `絵文字+半角スペース` をワンセットで使うのが毎ベストプラクティスです。上述の設定もそのようにしています。
Webサイトの任意の1ページを表示する為に必要なファイル一式を取得する方法（wgetを使用）

エンハンスの仕事を行う際に作業ベースとなるファイルを「現行本番からファイル一式を取得して作業してください」となるケースがたまにあります（少なくともうちの会社は…）。

ググるとwgetコマンドを使用してサイト全体のファイルを取得する方法はよく見つかるのですが、大手サービスのサイトだったりするとサイト全体のファイルを取得しようとするとページ数が膨大すぎて（数万ページとか）とてもじゃないけれど取得していられません。

そこで取得したい1ページと、そのページで読み込まれているCSS/JS/画像ファイル等のみをピンポイントで取得する方法をご紹介します。またPCページだけではなく、TABやSPのページを取得する方法も合わせてご紹介します。

# wgetを使う
## wgetとは
ファイルをFTPサーバーやWebサーバーからダウンロードする為のコマンドです。

## wgetのインストール
ここらへんを参照
http://kengo92i.hatenablog.jp/entry/2014/09/01/173547

## ファイルを取得
任意のページのHTMLファイルとそのHTMLファイルで読み込まれているCSS/JS/画像ファイル等を取得します。
オプション「-p」を使用します。

```command:command
wget -p http://example.com/fuga.html
```

これだけで取得可能です。

## SPサイトやTABサイトのページのファイルを取得
前述の方法ではPCサイトのファイル一式しか取得できません。
wgetコマンドでは「--user-agent」オプションを使用する事でSPサイトやTABサイトのファイル一式も取得できます。

指定するUAは下記サイトで確認できます。
http://www13.plala.or.jp/bigdata/user_agent.html

下記の例はiPhone iOS9.1の場合です。

```command:command
wget -p --user-agent="Mozilla /5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B5110e Safari/601.1" http://example.com/fuga.html
```

以上です。
tarファイルから解凍/展開せずに一部ファイルをとりだす (Gitlabのバックアップファイルからバージョンの抽出)

# 目的
Gitlabのバックアップファイル(*_gitlab_backup.tar)からリストア環境として必要なGitlabのバージョンを取得したい。
バックアップで作成されたtarファイルは大きいため、必要なファイルのみ抽出したい。

# 取得方法
サンプルとして以下の様なtarファイルを想定する。
tarファイルの中身は `t` オプションで確認できる。

```text:tオプション
-t, --list                 list the contents of an archive
```

```bash:tarファイルサンプル
$ tar tf 1459704554_gitlab_backup.tar
repositories/hoge/
repositories/hoge/foo.bundle
db/
db/database.sql.gz
uploads.tar.gz
builds.tar.gz
artifacts.tar.gz
lfs.tar.gz
backup_information.yml
```

今回の抽出対象は、`backup_information.yml` になる。
一部ファイルを取り出す場合は `x` オプションかつファイルを指定。
テキストの場合は`O` オプションで標準出力に出すことができる。

```text:xオプション、Oオプション
-x, --extract, --get       extract files from an archive
-O, --to-stdout            extract files to standard output
```

```bash:tarに含まれるファイルを標準出力に出力
$ tar xOf 1459704554_gitlab_backup.tar backup_information.yml
:db_version: '20160320204112'
:backup_created_at: 2016-04-04 02:29:14.263690606 +09:00
:gitlab_version: 8.6.1
:tar_version: tar (GNU tar) 1.27.1
:skipped:
```
ここからバージョンを抽出するには例えば以下のようにする。

```bash:バージョンを抽出する例
$ tar xOf 1459704554_gitlab_backup.tar backup_information.yml | grep gitlab_version | awk '{print $2}'
8.6.1
```


# 参考
[tarファイルを解凍せずに中身をみる＠Linux | Mazn.net](http://www.mazn.net/blog/2009/02/03/183.html)
HTMLElementの中でScriptタグを追加し、実行する

まず、以下の例を見てみます。

    <html>
    　　<body onload="document.getElementById('loader').innerHTML 　　　　　　= '<script>alert(\'hi\')<\/script>'">
    　　　<div id="loader"></div>
    　　</body>
    </html>

*DIV*の中で*Script*タグを追加し、実行しますが、**動きません。**
この記事は*DIV*の中で*Script*タグを使える方法を説明します。
#１。innerHTMLを使えない
上記の例の動かない原因は*innerHTML* でDIVのHTMLコンテンツが新HTMLStringを変わります。しかし、**`<script>`**タグはHTMLコンテンツではないで、DOM Elementです。それで、 使うために、**`<script>`***HTMLString*は*DOM Element*を変更することが必要です。
#２。Jqueryを使う
HTMLStringはDOM Elementを変更することに対して、Jqueryを使うことは一番簡単な方ほだと思います。

    <html>
    　　<script src="https://code.jquery.com/jquery-　　　　　2.2.2.min.js"></script>
    　　<body onload="$('#loader').html('<script>alert(\'hi\')　<\/script>')">
    　　　<div id="loader"></div>
    　　</body>
    </html>

****append, replaceWith, appendChild,...****も使えます。

#３。JavaScriptを使う
他の***JavaScript***も使えます。

    var script=document.createElement('script');
    script.innerHTML = "alert('ok')"
    var div=document.getElementById('test');
    div.appendChild(script)
Dockerコンテナ上に開発環境を作った時の反省点

Dockerコンテナ上に開発環境

この記事は「[Dockerコンテナ上に開発環境一式を構築する](http://qiita.com/hakaicode/items/5522a5ad1c280b9cf757)」の一部です。

# 反省

調べながら業務でやった環境をアップデートしつつやっていたのですが、初回構築時に調査不足で足りなかったこと、新しく出てきたこと、変更したいことなどがありました。

* ConoHaにはDocker用のイメージがあるので自分でインストールするのではなく最初からそれを使う。
* コンテナ毎にスクリプトを作ってそれを一括呼び出しするスクリプトも作ったが、そういうのはdocker-composeでやるらしい
* コンテナベースをAlpine Linuxにすれば小さくなりそう。Selenium+Xvfb+firefox+chromeまで動くかはわからないけど挑戦。
(busyboxとか使っててfloppyfw等の1FD Linuxを使ってた人間には懐かしい）
* メモリ1GBでデスクトップ環境までは無理があった。デスクトップだけならあがるけどIDEAあげてPlayを動かしたらアウト、同じホストでJenkinsやGitBucketも動かしてるのでかなり無理。
* IDEAをイメージに焼くとアップデートの時面倒。apt-getで管理しないものはイメージに焼かない。

# 再構築

そこで方針を下記のように改めてやり直します。

* docker-composeで管理、alpine linux
 * dns
 * httpd
 * pop/imap/smtp
 * jenkins
 * gitbucket
* 新VPSにデスクトップ構築構築、IDEAはユーザーHOMEの下に

デスクトップ環境はDockerにしないほうがセキュリティアップデートとかも楽なのですが、こうしとかないとどんなアプリを入れたのか忘れちゃうので移行の時の調査が面倒なんですよね。

# 続く

というわけで以下に続く
[Docker Compose + alpineでサーバー一式を構築する](http://qiita.com/hakaicode/items/889257c321f98161efaf)
Docker上にIntelliJ IDEA実行環境を作る]()