OmniAICreator/Qiita-1.07M huggingface dataset:
Homebrewで旧バージョンをインストールする方法(brew versionsはもう使えない)


OSごと再インストールしたMacにRabbitを入れようとしたら、エラーが出て入らなかったので、Homebrewと格闘していました。

中でも``brew versions``コマンドが使えなくなっていたのが一番困ったので、対処法についてまとめます。


## 旧バージョンが提供されている場合

一番楽ちんなパターン。  
Homebrew公式で旧バージョンが提供されている場合。

``brew tap homebrew/versions``で旧バージョン提供用のリポジトリを追加し、``brew search``で検索。

```
$ brew search versions/ruby
homebrew/versions/ruby182    homebrew/versions/ruby187    homebrew/versions/ruby193    homebrew/versions/ruby21
homebrew/versions/ruby186    homebrew/versions/ruby192    homebrew/versions/ruby20
```

Rubyだとこんな感じになります。  
多分各バージョンの最終版しかないので、もっと細かい単位で指定したい場合は他の方法を使います。




## ``brew upgrade``したら動かなくなった場合

手元の環境で旧バージョンを使ったことがあるのなら、``brew switch``コマンドで過去のバージョンに切り替えることができます。

まず``brew info``で手元にどのバージョンが残っているかを確認します。

```
$ brew info poppler                                                                      oppler: stable 0.39.0 (bottled) [pinned at 0.39.0]
PDF rendering library (based on the xpdf-3.0 code base)
http://poppler.freedesktop.org
Conflicts with: pdftohtml
/usr/local/Cellar/poppler/0.38.0 (473 files, 22.4M)
  Poured from bottle
/usr/local/Cellar/poppler/0.39.0 (473 files, 22.4M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/poppler.rb
```

「*」がついている方が現在のバージョンです。

``brew switch``で一つ前のバージョンに切り替えます。

```
$ brew switch poppler 0.38.0
Cleaning /usr/local/Cellar/poppler/0.38.0
Cleaning /usr/local/Cellar/poppler/0.39.0
42 links created for /usr/local/Cellar/poppler/0.38.0
```


## どちらも使えないとき

対象パッケージのFormulaファイルをGitで巻き戻してインストールすることができます。

``/usr/local/Library/Formula``にFormulaファイルが入っているので、ここで``git log``を使って旧バージョン時点のコミットを探します。

```
$ cd /usr/local/Library/Formula

$ git log poppler.rb
commit ad64e01ff4e4569f6a1e8c09b480d9c045aaf513
Author: BrewTestBot <brew-test-bot@googlegroups.com>
Date:   Mon Dec 21 16:03:44 2015 +0000

    poppler: update 0.39.0 bottle.

commit 7dba60ed43aaf747de01401bfe224c35c7fb8138
Author: Alexis Hildebrandt <afh@surryhill.net>
Date:   Thu Dec 17 16:51:55 2015 +0100

    poppler 0.39.0

    Closes #47114.

    Signed-off-by: Andrew Janke <andrew@apjanke.net>

commit 6f7b9d57b25451e811e8901c560d17abd7a464f9
Author: BrewTestBot <brew-test-bot@googlegroups.com>
Date:   Mon Dec 7 21:33:52 2015 +0000

    poppler: update 0.38.0 bottle.

commit 1b1c724b8db9ec68e2ac714e27cb44768f23afa6
Author: luzpaz <luzpaz@users.noreply.github.com>
Date:   Mon Dec 7 12:50:09 2015 -0600

    poppler 0.38.0

```

最新版は0.39.0で、上から3つ目のコミットが1つ前の0.38.0のようです。  
コミットのハッシュ値を指定して``git checkout``してFormulaファイルを巻き戻します。


```
$ git checkout 6f7b9d57b25451e811e8901c560d17abd7a464f9 poppler.rb
```

そして``brew install``すると、旧バージョンのFormulaファイルを使ってインストールされます。

```
$ brew install poppler
==> Downloading https://homebrew.bintray.com/bottles/poppler-0.38.0.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring poppler-0.38.0.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/poppler/0.38.0: 473 files, 22.4M
```


## 最後に

大体書いた段階で欲しかった情報が全部まとまってる記事を見つけてしまったけど、このまま公開します。

[gem install rabbit に失敗したのを解決した](http://blog.n-z.jp/blog/2015-12-28-gem-install-rabbit.html)
babel-plugin-typecheck を使って flowtype 文法で書かれたJSをランタイムチェックする


https://github.com/codemix/babel-plugin-typecheck を使ってみた。

## これは何

babelでflowtypeの構文を使って型エラーの**ランタイムチェック**を行う。静的解析ではない。（自分がドキュメントから見落としてるだけで静的解析を行う方法がある？）

## 興味を持った理由

- 既存コードに対してtypescriptを導入するのは大変
- flowtypeは既存コードからの乗り換えは簡単だが、型チェッカの挙動が未だに不審
- コード上のドキュメントとしての型 + ランタイムチェックというアプローチなら十分では

ESdoc等で型を書いてもあくまでドキュメント上の指定だが、flow syntax とこれなら実行可能という点が大きい。最悪動かなくてもランタイムチェックを外せば良い。型指定はドキュメントとして残る。

## Install

すでにbabel環境があることを想定

```
npm i -D babel-plugin-syntax-flow babel-plugin-transform-flow-strip-types babel-plugin-typecheck
```

```json:.babelrc
{
  "presets": ["es2015"],
  "plugins": [
    ["typecheck", {
      "disable": {
        "production": true
      }
    }],
    "syntax-flow",
    "transform-flow-strip-types"
  ]
}
```

本番ではランタイムチェックを有効化しない。

## browserify-railsの設定

browserify-rails を使ってる人はここで NODE_ENV を渡すことで無効化できた。

```rb:config/environments/production.rb
config.browserify_rails.node_env = "production"
```

## コードを書いてみる

flowといえば口うるさいイメージがあったので、まず最初にそのまま実行してみた。無事巨大なコードベースで動作確認。

次に、エラーが起きるコードを書いてみた。

```js:application.js
function f(name: string): number {
  return name.length;
}

f([1]);

```

ちゃんと開発環境でランタイムエラー出た。
![](https://i.gyazo.com/df557e993690996a224ead624722240e.png)

別ファイルに書いた型定義の `import type {...} form ...` も上手く動いた。

## 感想

テストコードが十分にあればランタイムチェックで型違反が検知できる。アプリケーションをスクラッチで設計するときはtypescriptでいいだろうが、既存コードの書き換えならこっちもアリでは、という感じ。
Angularのng-resourceの使い方

# What is ?
Angularの$httpをラッピングしていて、サーバとのHTTP通信を行え、RESTfullにやり取りを行うためのサービス。

# Version
AngularJS 1.4.8 で動作確認

# Install
 
```bower.json
"angular-resource": "1.4.8"
```

# How to

まずは、登録

```app.js
sampleApp = angular.module('sampleApp', ['ngResource']);
```

次にAPI通信するモジュールをFactoryとして作成
※例としてUserモデルに関するAPIを実行するモジュールとします

```User.js
sampleApp.factory('User', ['$resource', function($resource) {

  // 「get」「find」「create」の3つのアクションを定義
  return $resource(
    'http://sample.com/api/users/:id',
    {id: '@id'},
    {
      get: {method: 'GET', isArray: true}, // apiの戻り値が配列の場合は「isArray: true」を指定する
      find: {method: 'GET'},
      create: {method: 'POST'}
    }
  );
}]);
```

- $resource
    - 第一引数
        - URLを指定する。
        - 「:id」のような形式でURLパラメータを指定できる
    - 第二引数
        - デフォルトパラメータを指定する
        - 上記の例では、メソッド呼び出し時のパラメータのキーに「id」があればそれをURLパラメータに埋め込んでくれる
    - 第三引数
        - アクションの定義
        - 各アクション毎に「method」等のオプションを設定できる。設定可能なオプションについては[公式ドキュメント](https://docs.angularjs.org/api/ngResource/service/$resource)を参照

最後にコントローラーでの実行例

```SampleController.js
sampleApp.controller('SampleController', ['User', function(User) {
  self = this;

  // GET http://sample.com/api/users
  User.get().$promise.then(function(users) {
    self.users = users;
  }).catch(function(data, status) {
    alert('error');
  });

  // GET http://sample.com/api/users/1
  User.find({id: 1}).$promise.then(function(user) {
    self.user = user;
  }).catch(function(data, status) {
    alert('error');
  });

  // POST http://sample.com/api/users {name: "test", address: "test@sample.com"}
  var user = new User({name: 'test'}); // パラメータを引数で指定できる
  user.address = 'test@sample.com'; // newした後にパラメータを付与することも可能
  // GETメソッド以外のアクションを実行するときはprefixに「$」をつける
  // またアクションの戻り値がpromiseになっている
  user.$create().then(function(data) {
    console.log(data);
  }).catch(function(data, status) {
    alert('error');
  });

}]):
```

# Interceptor
Interceptorを登録することで、共通のヘッダー処理や共通のエラーハンドリングを行うことができる。

```app.js
sampleApp.config(['$httpProvider'], function($httpProvider) {
  $httpProvider.interceptors.push(['$q', function($q) {
    return {
      // リクエストの前処理
      request: function(config) {
        console.log(config);
        return config;
      },
      // レスポンス受信時の前処理
      response: function(response) {
        console.log(response);
        return response;
      },
      // 通信エラー時の処理
      responseError: function(rejection) {
        console.log(rejection);
        return $q.reject(rejection);
      }
    };
  }]);
});
```
systemtap と Secure boot

寒い夜なのでカーネルモジュールを書きたくなってしまい、自宅のデスクトップPC(下記環境)にてデバッグ用にsystemtapを起動させたところ、下記のようエラーが出てしまった。という個人メモ。

```
# rpm -qa | grep systemtap
systemtap-sdt-devel-2.9-1.fc22.x86_64
systemtap-2.9-1.fc22.x86_64
systemtap-devel-2.9-1.fc22.x86_64
systemtap-server-2.9-1.fc22.x86_64
systemtap-runtime-2.9-1.fc22.x86_64
systemtap-client-2.9-1.fc22.x86_64
# uname -r
4.2.6-201.fc22.x86_64
# cat /etc/redhat-release 
Fedora release 22 (Twenty Two)
# stap pfaults.stp
Using a compile server.
Unable to find a suitable compile server.  [man stap-server]
No servers online to select from.
Passes: via server failed.  Try again with another '-v' option.
The kernel on your system requires modules to be signed for loading.
The module created by compiling your script must be signed by a systemtap compile-server.  [man stap-server]
--use-server was automatically selected in order to request compilation by a compile-server.

```

一瞬systemtapサーバでのモジュールビルドが必須になってしまったのかもしれないと思ったが、これはsystemtapによって作成されたカーネルモジュールが署名されていないだけだ。

参考リンク
https://sourceware.org/systemtap/wiki/SecureBoot

そこで、とりあえずデスクトップPCのSecure bootをOffにしてからOSを起動することで回避できた。
単なるデバッグにも信用が必要となる世知辛い世の中である()
AndroidStudioでJar追加時のGradle :app:preDexDebug error Android Studio Projectについて

applicationからMysqlに接続しようと思いAndroidStudioにMysqlのJarを追加した。
するとアプリケーション起動時に
Gradle :app:preDexDebug error Android Studio Project
とかのメッセージが出て変更が反映されなかった。
2時間以上はまってしまったので対応策をメモしておく。

↓を参考にした。誠にありがとうございます。
https://teratail.com/questions/20520

うまくいかなかったときは
mysql-connector-java-5.1.38
を使っていた。が、どうやら駄目らしいので
mysql-connector-java-5.0.8
を使うことにした。うまくいった。

原因については良くわかっていない。
詳しい方、コメントお願いします。

以上。
MAMPでデフォルトのタイムゾーンが変更出来ないとき

# MAMPのphp.iniでデフォルトのタイムゾーンを変更したハズなのに、時刻がドイツのベルリン時間とかになってることありませんか？

もしかするとあなたは違うphp.iniに手を加えたのかもしれません。
それでは早速検証してみましょう。

## まずphp.iniファイルの場所を確認します
MAMPのコントローラーから**Open WebStart page**をクリックし、MAMPのStartページからphpInfoのページを開きます。

## 次に設定項目を確認します
色々と設定内容が表示されているかと思いますが、その中の**Loaded Configuration File**という項目をチェックします。

以下のパスが表示されていますでしょうか？
`/Applications/MAMP/bin/php/php(バージョン番号)/conf/php.ini`

ということはつまりこのパスに存在するphp.iniを編集しないと設定が反映されないということです。

## 後は、対象のphp.iniのファイルのタイムゾーンを編集するだけ
デフォルトは以下のタイムゾーンで設定されていると思います。
`date.timezone = "Europe/Berlin"`
これを下記の様な任意のタイムゾーンに設定を変更すれば完了です。（ここでは東京に設定しています）
`date.timezone = "Asia/Tokyo"`

※設定を反映させる為にApacheを再起動させるのをお忘れなく。


## このphp.iniを変更しました？
もしかするとあなたは`/Applications/MAMP/conf/php(バージョン番号)`の中にあるphp.iniの設定を変更したのではないでしょうか？
こちらを編集してApacheを再起動しても設定は反映されないかと思います。

なぜ上記のパスにあるphp.iniを編集しても設定が反映されないかは現状では原因不明なのですが、もしご存知の方がいらっしゃれば共有頂けると幸いです。
「IoDebuger」はじめますた

# 突然ですが「IoDebuger」はじめますた
## 「IoDebuger」とは
私以前より「Electron」なるものに興味がありまして、この度お勉強を兼ねまして、PHPのDebug Toolを作成いたしますた。

var_dump的な感じでWindowに変数の中身が書き出されるというシロモノで御座います。

## 経緯
以前からAjaxのDebugなぞは、POST値をファイルに書き出し、tail -f で中身確認していたのですが、サーバーが必要やら、var_dumpがHTMLベースで書き出されるやらで困っておりました。

今回もEC-CUBE3のイベントを確認するのにvar_dump + exit していたのですが。。
exitしちゃうので、イベントがどういう流れで実行されているのかわかりにくすぎって事で、これはsocket-ioさんでリアルタイムでvar_dumpすればいいんじゃないって事で、サクサクっと~~コピペ~~自作いたしました。

以下からDLなりCloneなりしてお役にたてば何よりでございやす。

[IoDebuger](https://github.com/geany-y/IoDebuger)

## 使い方
1. Windowsの方は任意のフォルダに「iodebuger-win32-x64」保存した後、「iodebuger.exe」をクリックしますと、何の味気もない白い「Window」が表示されます。( 誰かステキに改造してPullいただければと。。 ) 

2.これで準備はOKですので、次はPHP側で「php/myfunc」内の「debug.php」をrequire_onceなどでincludeしてください。

3.後は任意の変数を「ezd($hoge);」の様にしていただき、var_dumpの要領で使用していただくと、先ほどの味気のないWindowに変数の中身がdumpされます。

4.EC-CUBE3なら「vendors」直下に「php/myfunc」を保存し、html直下のindex_dev.phpなどでrequireしていただくと幸せになれます。

## 備考
1.Macのビルドが何故かWin環境でうまくいかないため、**どなたか作成してください**

2.本アプリは「XAMPP」や「MAMP」などのローカル環境での使用を想定しています

3.本アプリは「3000」ポートを占有しますので、**「3000」ポートは使ってはいけません**

## 参考サイト
[Electronで自分のIPアドレスをLAN内のiPhoneに通知するには](http://abrakatabura.hatenablog.com/entry/2015/10/24/113659)

それではみなさんいいプログラムライフを！！
SUUMOで古地図表示するブックマークレット

最近、奈良から新横浜に単身赴任で引っ越したのですが、職場に歩いてでも行けなくはない辺りに住みたいと思い、最初菊名あたりに住もうかと思ったところ、不動産屋に菊名あたりは山がちで新横浜に行くまでに山一つ越えないといけないからしんどいよ、と言われまして。
それで、もっと上流の方が平坦だよと言われたので、神奈川区三枚町あたりに住み始めたのですが、いざ住み始めてちょっと待てと。
ここ、新横浜まで平坦かどうか以前に、一番最寄りの岸根公園まで行くのに、徒歩10分の距離で高低差20mの峠越えせなあかんやんけ！
おまけに菊名から新横浜って、確かに背後は山だけど、駅〜駅間だけなら、ほとんど高低差緩やかなルートもあるやんけ！
いい加減にしろ！
不動産屋のセールストークを鵜呑みにせず、その場で地形図を確かめなかったばかりに、長期住むことになりそうな家を不便なところに借りてしまった過去の自分を恨んでいます。

で、ついカッとなって、SUUMOの上で旧版地形図等を見られるブックマークレットを作成しました。
最初はSUUMOのデータを取ってくる地図アプリでも作ろうかと思ったんですが、SUUMOにはAPIがないとのことで、ブックマークレットにせざるを得ず。

* [SUUMO古地図](http://t.tilemap.jp.s3.amazonaws.com/suumo/suumo.html)

上のリンク先ページにあるリンク[^1]を、ブラウザのブックマークツールバーにドラッグ&ドロップしてブックマークレットを作り、SUUMO上で地図を表示[^2]してブックマークレットをクリックすれば、以下のように地図画面に古地図表示[^3]と、地図/時代セレクタが表示されるはずです。

![SUUMO古地図](https://qiita-image-store.s3.amazonaws.com/0/10108/cbef0431-1d03-18da-2030-2c60a786dfa3.png)

選べる古地図は[今昔マップ on the web](http://ktgis.net/kjmapw/)で提供されている全国大都市圏の明治〜昭和期の地形図と、[地理院地図](http://maps.gsi.go.jp/)から都市圏活断層図と明治期の低湿地を選びました。
他に希望する地図があれば、フィードバックいただければ追加いたします。

今後の方向性としては、

* 古地図の領域（首都圏、阪神圏etc...）を、自動で選択されるようにする。
* 透明度選択をスライダーにする。
* 地図上でマウスを動かせば、その場所の標高が表示されるようにする。
* 2点を選ぶと、その間のルートと、経路の高低差プロファイルがわかるようにする。

あたりを目指したいなと思っています。

[^1]: 当初この記事上でブックマークレットリンクを貼ってましたが、Qiitaの仕様でJavascriptスキームはリンクにできないので、急遽外部htmlを用意しました。急拵えなので雑なhtmlですみません。
[^2]: 記事書いた後で気づきましたが、SUUMOの地図表示にはいくつか種類がある（賃貸だけ表示の時と、不動産全部表示の時はレイアウトが違う）ようで、このブックマークレットは今の所 **http://suumo.jp/edit/oudanchizu/** これで始まるURLの地図にしか対応してません。（[例](http://suumo.jp/edit/oudanchizu/?geoflg=9&geosys=tky&arnm=%E9%96%A2%E6%9D%B1&tf=14&tfnm=%E7%A5%9E%E5%A5%88%E5%B7%9D%E7%9C%8C&initKeido=502868020&initIdo=127818660&pnJusho=1&ar=030&bs=010&bs=011&bs=020&bs=021&bs=030&bs=040)）その他のレイアウトについては、順次確認して対応していきたいと思います。また、多分スマホ版も別レイアウトだと思うので、そちらも順次対応します。
[^3]: デフォルト古地図は首都圏の明治期を選択しているので、首都圏以外では適切な地図選択後でないと古地図は表示されません。
Powershell > サブフォルダのsystem.hwdefファイルを探して最終更新日時を表示

```txt:動作確認
Windows 8.1 pro (64bit)
```

指定の親フォルダの下層にあるsystem.hwdefファイルを探して、その最終更新日を表示するスクリプト

探索フォルダはdir_config.txtに指定する。

```dir_config.txt
C:\ZyboDev\zybo_160112_baseDesign
```

```findHwdef.ps1
function readDirInfo($scriptDir)
{
    $procDir = ( Get-Content $scriptDir\dir_config.txt )
<#    
    return "TEST"
#>
    return $procDir
}

function findHwdef($procDir)
{
    $target = ( Get-ChildItem $procDir -Recurse "system.hwdef" )
    return $target.Fullname
}

$prcDir = readDirInfo(".\\")
echo "process directory=$prcDir"

$hwfile = findHwdef($prcDir)

echo $hwfile
echo (Get-ChildItem $hwfile).LastWriteTime
```

```txt:実行結果
process directory=C:\ZyboDev\zybo_160112_baseDesign
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.srcs\sources_1\bd\system\hdl\system.hwdef

2016年1月12日 22:09:12
```

ファイル探索の方法がまだまだ身についていない。
ownCloud コマンドラインツールによるファイルスキャン

# 動機

ownCloud には外部ストレージを扱う機能があります。しかし Enterprise 用のようで、個人がフリーソフトとしてインストール・実行する場合はどうもうまく働かないようです。何とかしようとしたツワモノもいらっしゃるようですが、やはり不安が残ります。

FTPだのDropBoxだのを扱う事は不可能としても、FreeNASで共有設定して読み書きしたファイルを扱えるようにはなりたい。そこで調べた所、コマンドラインツールでファイルを総ざらいしてDB登録できるようでした。これと jail のストレージ機能を組み合わせれば、それなりに何とかなりそうです。

# occ file:scan

というわけで、ファイル総ざらいするコマンドラインのコマンドについての覚え書きです。

参考文献: [Using the occ Command - ownCloud 8.2 Server Administration Manual](https://doc.owncloud.org/server/8.2/admin_manual/configuration_server/occ_command.html#http-user-label)


但しユーザを www で実行しなければなりません。その為に sudo コマンドが必要ですが、 FreeBSD にはデフォルトでは sudo が無いようです。事前に ```pkg install sudo``` してください。その後に下記コマンドを実行します。

```
# cd /usr/local/www/owncloud
# sudo -u www php occ file:scan 《ユーザ名》
```

こうすると、指定したユーザの全ファイルを総ざらいして ownCloud のDBに登録します。この後にいつも通りブラウザで ownCloud にアクセスすると、ownCloudとは無関係な所で転送したファイル達も見えるようになります。
【Raspberry Pi】電子工作初心者による、電子工作初心者のための GPIO 解説（未完成版）

# はじめに

Raspberry Pi の各部品について、電子工作初心者の方が読んでも分かりやすいようにまとめていきます（少しずつ加筆予定）。

今回は ***GPIO*** についてのお話。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/49458/084e653e-b5f9-167b-5dc3-3aafa447156d.png)

# GPIOって何だろう？

<a href="https://ja.wikipedia.org/wiki/GPIO">Wikipedia</a> には、以下のように記載されています。

> General Purpose Input/Output（汎用入出力）の略語である。

名前の通り、入力／出力の両方に使える、デジタル信号の出入り口（インターフェース）として覚えておきましょう。

私の手元にある Raspberry Pi 2 Model B には、40本の GPIO ピンがあります。
![blog_02.png](https://qiita-image-store.s3.amazonaws.com/0/49458/4c7f2987-8341-2e6d-3c30-32fdcd0ef1c1.png)
それぞれ物理的なピン番号が振られており、基板の一番隅っこにあるピンが、2番ピンとなっています。

Raspberry Pi の GPIO ピンは、物理ピン番号だけではなく、それぞれの役割によってピン名が設定されています。

例えば 2番ピンと4番ピンは、GNDピン（後述）に対して5.0Vの電圧を出力する電源端子で、それぞれ「5V」というピン名が付けられています。

Raspberry Pi 2 Model B の場合、以下のような対応となっています。

| ピン名 | ピン番号 | ピン番号 | ピン名 |
|------:|--:|:---|:-------|
| 3.3V  | 1 | 2  | 5V     |
| GPIO2 | 3 | 4  | 5V     |
| GPIO3 | 5 | 6  | GND    |
| GPIO4 | 7 | 8  | GPIO14 |
| GND   | 9 | 10 | GPIO15 |
| GPIO17 | 11 | 12 | GPIO18 |
| GPIO27 | 13 | 14 | GND    |
| GPIO22 | 15 | 16 | GPIO23 |
| 3.3V   | 17 | 18 | GPIO24 |
| GPIO10 | 19 | 20 | GND    |
| GPIO9  | 21 | 22 | GPIO25 |
| GPIO11 | 23 | 24 | GPIO8  |
| GND    | 25 | 26 | GPIO7  |
| ID_SID | 27 | 28 | ID_SC  |
| GPIO05 | 29 | 30 | GND    |
| GPIO06 | 31 | 32 | GPIO12 |
| GPIO13 | 33 | 34 | GND    |
| GPIO19 | 35 | 36 | GPIO16 |
| GPIO26 | 37 | 38 | GPIO20 |
| GND    | 39 | 40 | GPIO21 |

公式ではありませんが、以下URLのブログに Raspberry Pi 各バージョンの GPIO ピンの配置図がありますので、参考にしてください。
http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-header-and-pins/

# 特別な役割をもっているピン、汎用的なピン

ピン名が「GPIOxx」となっているピンは、プログラム制御によって、デジタル信号の入力／出力のいずれかを個別設定できます。なかには特定の機能をもったピンもありますが、基本的に全てGPIOとして利用することができます。
<del>その他（ピン名が「GPIOxx」以外）のピンも、汎用的なGPIOとして利用する事ができますが、それぞれ特別な機能をもったピンです。特別な理由がなくピンに空きがある場合は、汎用GPIOを利用するのが良さそうです。</del>
その他（ピン名が「GPIOxx」以外）のピンは、それぞれ特別な役割を持っているため、GPIOとしては利用できません。

# GNDピン

「GND（グランド）」は各ピンの基準となる電位DC0Vの端子です。電源ピン「5V」「3.3V」の返りのピンでもあります。

# 参考にしたサイト

Raspberry PiのGPIOの配置図と基本的な説明
http://denshikousaku.net/raspberry-pi-gpio-layout

マイコン活用基礎：周辺機能を学ぼうー（1）GPIO
http://japan.renesas.com/edge_ol/engineer/16/index.jsp
FreeNAS tips - WebDAV

FreeNAS のちょっとした設定など。うっかり見落とし勝ちなものを中心に。

# WebDAV ユーザーとパスワード

なぜかどこにも記述が無いようだが（というか周知の事実？）ログインユーザ名は webdav である。パスワードはデフォルトで davtest とヘルプには書かれていたが、なぜかちゃんと設定しないとログイン出来ない。設定すればうまくいく。

# パーミッション

問題は共有するディレクトリの設定。一番手っ取り早くて間違いが無さそうなのは、webdavユーザを www グループに入れてしまう事。そして共有ディレクトリを ```chown webdav:www ; chmod 770``` とかしておく。この場合は webdav ユーザになると全ユーザのファイルを見る事が可能になってしまうわけで、あんまりよろしくない。せめて webdav のパスワードくらいは隠しておきたい。

# WebDAV のユーザ指定

WebDAV の設定を解析して AuthUserFile に自分でユーザを追記してみる。関連する設定は ```/usr/local/etc/apache24/Includes/webdav.conf``` に書かれている。ユーザファイルは ```/usr/local/etc/apache24/webdavhtbasic``` なので、ここに htpasswd でユーザを追記してしまう。この場合、ログインパスワードは別々でも、ログイン後のユーザは結局全員 webdav になってしまう。ログイン後にファイルアクセスするユーザを webdav 以外にするには、webdav.conf を自分で書いてユーザ毎に独自設定を作るしかない。こんな事をすれば、当然FreeNASでは管理出来なくなってしまう。

なかなかうまくいかないものだ。
【簡単】GithubでWebサイトを公開する2つの方法

# はじめに
githubでWebサイトを公開したのでその手順をまとめてみました。
２つの方法があるので２つとも紹介します。
１つはユーザー（グループ）ページを作る方法・もう１つはリポジトリのページを作る方法です。
~~実際に僕は自分のポートフォリオサイトをgithubで公開しています。~~
※ 現在は個人VPSで公開しています。


# 参考リンク

英語ですが公式サイトは絶対なので見るのをおすすめします。
https://pages.github.com/

# 注意
githubでは動的なサイト（データベースとやりとりのあるサイト）は公開することができないらしいです。あとコードはオープンソースでなければなりません。

# ユーザー（グループ）ページを作成する

## 新しいリポジトリを作成
まずはgithub上でリポジトリを作成しましょう。そのときにリポジトリの名前を**ユーザーネーム.github.io**にします。

## 作成したリポジトリをクローン
次に作成したリポジトリをクローンします。usernameの部分は自分のユーザーネームを入力しましょう。

```
$ git clone https://github.com/username/username.github.io
```

## index.htmlに"Hello World"と記述

```
$ cd username.github.io
$ echo "Hello World" > index.html
```

## プッシュ

```
$ git add --all
$ git commit -m "Initial commit"
$ git push -u origin master
```

## 完成

ブラウザを起動して、http://username.github.io にアクセスしてみましょう。


# リポジトリごとのページを作成する

## 新しいリポジトリを作成

なんでもいいのでgithub上で新しいリポジトリをつくりましょう
ここではsampleというリポジトリを作成します。

## 作成したリポジトリをクローン

ユーザーページのときと同様に作成したリポジトリをクローンします。usernameの部分は自分のユーザーネームを入力しましょう。

```
$ git clone https://github.com/username/sample
```

## gh-pagesというブランチに切り替える

```
$ cd sample
$ git checkout --orphan gh-pages
$ echo "Hello World" > index.html
```

## プッシュ

```
$ git add --all
$ git commit -m "Initial commit"
$ git push -u origin gh-pages
```

## 完成

ブラウザを起動して、http://username.github.io/sample にアクセスしてみましょう。


# まとめ
githubにwebサイトを簡単に公開できるのでおすすめです。
Homebrewを使って入れたMySQLが動かない状態に陥った下らない原因


homebrew経由でインストールしていたつもりのMySQLが全く動かなくて長い間放置していた問題がたまたま解消できたので、記念のメモ代わりに投稿。

homebrewからMySQLを何度もアンインストールし、Stack Overflowや各種ネットに書いてあったhomebrewでインストールした場合のMySQLの不具合に関して調べまくったけれど、解消しなかった状態でした。

# 原因

結論を先に書くと、原因は下らなくて、 **設定ファイルの`my.cnf`が古いまま消し忘れていたこと** でした。

詳しくは後述。

# 出ていたエラー

各種ネットの情報を駆使しても、以下のエラーがつぶせない状態でした。

```bash
$ mysqld --initialize-insecure --user=taku --basedir=/usr/local/Cellar/mysql/5.7.10 --datadir=/usr/local/var/mysql --tmpdir=/tmp --explicit_defaults_for_timestamp
2016-01-12T11:35:11.104978Z 0 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
 100
 100
2016-01-12T11:35:27.326652Z 0 [Warning] InnoDB: New log files created, LSN=45790
2016-01-12T11:35:28.053387Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2016-01-12T11:35:28.110798Z 0 [ERROR] unknown variable 'innodb_additional_mem_pool_size=16M'
2016-01-12T11:35:28.110818Z 0 [ERROR] Aborting
```

この`[ERROR] unknown variable 'innodb_additional_mem_pool_size=16M'`が問題なんだろうと色々ググったりしてみて、`innodb_additional_mem_pool_size`というオプションは現在はdeprecatedになっているらしいということまで突き止めましたが、どこでその値が読み込まれているのか分からずにずっと放置していました。

たまたま今回またMySQLをいじる機会があったので再度いじったところ、たまたま`my.cnf`について書いてある記事を見かけて、「もしかしてMySQLどころかDBもよく分からない時にいじった設定ファイルが残ったままで、そこにinvalidなオプションがあるからエラーになっているのでは？」と思い、参考資料に書いてあった以下のコマンドを使い、該当する場所に`my.cnf`がないか探してみました。

```bash
$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
```

案の定、`/usr/local/etc/my.cnf`だけが残っていて、そこに`innodb_additional_mem_pool_size=16M`と記載されていてエラーを出していたようなので、この`my.cnf`を消して`brew postinstall mysql`をしたところ、`mysql.server start`をしてもエラーが出なくなり、直接Mac上でMySQLが使えるようになりました。

# まとめ

古くて不必要になったものはさっさと消しておきましょう。

# 参考資料

http://qiita.com/is0me/items/12629e3602ebb27c26a4
PHPでファイル名文字列から拡張子のみ取得する時に最も速いのはどの方法か

ちょっとしたことだけど塵も積もれば速くなるので悩まないためにメモ。

## 方法1

なんとなく速そうなやつ。

```php
$ext = substr($filename, strrpos($filename, '.') + 1);
```

## 方法2

記述が簡単なやつ。

```php
$ext = pathinfo($filename, PATHINFO_EXTENSION);
```

## 方法3

ドットで配列にして最後を取得。
ワンライナーでできないのが難。

```php
$arr = explode('.', $filename);
$ext = end($arr);
```

## 方法4

方法3と同じだけど `array_pop` を使用。

```php
$arr = explode('.', $filename);
$ext = array_pop($arr);
```

## 結果

各10000回実行した結果。

|方法|マイクロ秒|
|---|---:|
|方法1(substr) :thumbsup: |0.0030159950256348|
|方法2(pathinfo)|0.0118758678436280|
|方法3(explode + end)|0.0055711269378662|
|方法4(explode + array_pop)|0.0053489208221436|

-----

やっぱり文字列系が速いらしい。
[翻訳] 複雑な文字列とのパターンマッチング

Henrik Nyhさんの2016年1月9日付のブログ記事[Pattern-matching complex strings](http://thepugautomatic.com//2016/01/pattern-matching-complex-strings/)の翻訳です。前回と前々回で**Elixir**のパターンマッチングについて見てきましたが、文字列ともパターンマッチできます。とはいえ、文字列とのパターンマッチングは制約が多いので…という例です。後半はパターンマッチング関係ないやん…という気もしますが…。

-----

Elixirの文字列は他のバイナリーと同じように`<>`結合演算子もしくは`<<...>>`でビットパターンを指定することでパターンマッチングすることが可能です。

```ex
defmodule Example do
  def run_command("say:" <> <<digit::bytes-size(1)>> <> ":" <> thing) do
    count = String.to_integer(digit)
    String.duplicate(thing, count)
  end
  def run_command("say:" <> thing), do: thing
end

Example.run_command("say:hi")
# => "hi"
Example.run_command("say:3:hi")
# => "hihihi"
```

しかしこれには大きな制約があります: 最後の(オプショナルな)一つを除いてバイナリーパターンの全ての部分は固定長でなければなりません。

そのためもっと複雑なパターンについては少々ワザが必要になります。例えばcountの中に2桁以上のdigitがあったなら？

もしこの固定長ルールを破ろうものならElixirはこんな風に文句を言ってきます:

```ex
"say:" <> number <> ":" <> thing = "say:123:hi"
# ** (CompileError) a binary field without size is only allowed at the end of a binary pattern
```

長さの種類が限られているなら、パターンを追加すれば良さげです:

```ex
def run_command("say:" <> <<number::bytes-size(1)>> <> ":" <> thing), do: #…
def run_command("say:" <> <<number::bytes-size(2)>> <> ":" <> thing), do: #…
```

しかしどんな長さの数字にも対応しようとするとこのやり方は使えません。

関数の引数でのパターンマッチングを諦めてひとつの関数の中に判断ロジックを付け足すこともできます:

```ex
def run_command("say:" <> stuff) do
  case String.split(stuff, ":") do
    [number, thing] -> # …
    [thing] -> # …
  end
end
```

これはこれで動くんですが、Elixirのやり方としてはダサすぎますよね…。

より良い方法があります。文字列を細切れにしてそれから関数の引数でのパターンマッチングに受け渡せば…？[^1]

[^1]: 結局ここで文字列のパターンマッチングを諦めてるわけで…

```ex
def run_command(command) do
  do_run_command String.split(command, ":")
end

defp do_run_command(["say", number, thing]) do
  count = String.to_integer(number)
  String.duplicate(thing, count)
end
defp do_run_command(["say", thing]), do: thing
```

ああ、だいぶいい感じになってきましたね。では、他の関数への受け渡しも行えるようにしてパターンマッチングの真の実力を解放しましょう。

```ex
  def run_command(command) do
    do_run_command String.split(command, ":")
  end

  defp do_run_command(["say", number, thing]) do
    count = String.to_integer(number)
    say(thing, count)
  end
  defp do_run_command(["say", thing]), do: thing

  defp say(thing, count) when count < 100, do: String.duplicate(thing, count)
  defp say(thing, _count), do: say(thing, 99) <> " etc"
```

[^2]
[^2]: 100を越える数が指定されたら2番めのsayが呼び出されて99個thingが並んだ後に" etc"を表示しておしまいにします。

何もlistにする必要はありません。正規表現式も辞書としてマッチさせることができます。例えば:

```ex
def run_command(command) do
  regex = ~r/say:(?<number>\d+):(?<thing>.+)/
  captures = Regex.named_captures(regex, command)
  do_run_command(captures)
end

defp do_run_command(%{"number" => number, "thing" => thing}), do: #…
```

ここまで挙げた例がだんだんわざとらしくなってきてしまいましたが、これで何かアイデアが浮かんでくるといいですね[^3]。

[^3]: というわけで、文字列を扱うときは他の言語と同じく正規表現を使ってパースするのが一番楽そうですね。やれやれ。もっともその後のところはElixirぽく書けますが。
WebViewでhttpsのサイトにアクセスした際に証明書チェックがエラーになっても無理やり表示する

#はじめに
仕事の中でSSLサーバの証明書の有効期限が切れているページを表示せざるを得ない場面があった時にハマったのでメモを残しておきます。
通常、WebViewで証明書の期限切れ等でエラーになった場合、真っ白な画面が表示されます。
ちなみに、不審なページで証明書のチェックをスキップするというのはセキュリティーホールになりかねないので非推奨です。

#実装
WebViewにsetWebViewClientするときにonReceivedSslError()をオーバーライドし
その中で、handler.proceed()するだけです。

```java

//前略

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {  
            handler.proceed();  
        }  
    } 

//後略 
```

#おわりに
自分の場合は証明書が期限切れなのはあくまでも開発中の検証環境の話であり、リリースの際にはちゃんとしたhttpsでの接続が保証されているので本番のソースにはこの実装は入れません。
はじめにも書きましたが、脆弱性を生み出す原因なので気をつけましょう。
让cell分割线(separatorLine)补全方法。


###Swift:

1 实现代码:

```Swift
override func viewDidLayoutSubviews() {
        if tableView!.respondsToSelector("setSeparatorInset:") {
            tableView!.separatorInset = UIEdgeInsetsZero
        }
//
        if tableView!.respondsToSelector("setLayoutMargins:") {
            tableView!.layoutMargins = UIEdgeInsetsZero
        }
    }
```

2 实现代理方法:

```Swift
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if cell.respondsToSelector("setSeparatorInset:") {
            cell.separatorInset = UIEdgeInsetsZero
        }
        
        if cell.respondsToSelector("setLayoutMargins:") {
            cell.layoutMargins = UIEdgeInsetsZero
        }
    }
```

###Objective-C:

1 实现代码:

```Objective-C

- (void)viewDidLayoutSubviews {
    
    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        _tableView.separatorInset = UIEdgeInsetsZero;
    }
    
    if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        _tableView.layoutMargins = UIEdgeInsetsZero;
    }
}

```

2 实现代理方法:

```Objective-C

- (void)tableView:(UITableView *)tableView
                                willDisplayCell:(UITableViewCell *)cell
                                forRowAtIndexPath:(NSIndexPath *)indexPath {
    
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        cell.separatorInset = UIEdgeInsetsZero;
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        cell.layoutMargins = UIEdgeInsetsZero;
    }
}

```
Vivado > Generate Bit Streamの後のファイル更新 > system.hwdef / system.bxml 

```txt:動作確認
Vivado 2015.4 on Windows 8.1 pro (64bit)
```

Vivadoでの各処理終了時にSlackで通知するため、どういうファイルが更新されるかを確認している。確認にはSoureTreeを使用。

### Generate Bit Stream(1回目)の後

以下のファイルなどが追加・更新されている
(...は省略記号)

- hw/.../bd/system/hdl/system.v
- hw/.../bd/system/ip/system*.vhd
- hw/.../ipstatic/.../hdl/*.v
- hw/.../mem_init_files/Makefile
- hw/.../mem_init_files/axi*
- hw/.../mem_init_files/ps7_init.* (tclファイルなど)
- hw/.../sim_scripts/system/*
- hw/.../zybo_bsd.srcs/sources_1/bd/system/*
- hw/.../zybo_bsd.srcs/sources_1/bd/system/system.bd
- hw/.../zybo_bsd.srcs/sources_1/bd/system/system.bxml
- hw/.../zybo_bsd.srcs/sources_1/bd/system/system.ooc.xdc


### Generate Bit Stream(2回目)の後

再度、Generate Bit Streamをしてみた。
ただし、デザインの変更がないとGenerate Bit Streamを実行できないので、UART0をONにしてから実行した。

以下のファイルなどが追加・更新されている
- hw/.../bd/system/hdl/system.v
- hw/.../zybo_bsd.srcs/sources_1/bd/system/.../*.xml
- hw/.../zybo_bsd.srcs/sources_1/bd/system/.../*.xci
- hw/.../bd/system/hdl/system.v
- hw/.../bd/system/hdl/system.hwdef
- hw/.../sim_scripts/system/*
- hw/.../mem_init_files/ps7_init.* (tclファイルなど)
...
- hw/.../zybo_bsd.srcs/sources_1/bd/system/system.bxml


### ファイルの選択

ps7_init.tclファイルは複数ある。
system.hwdefファイルは１つだけ。
system.bxmlファイルは１つだけ。

後ろの２つのファイルはGenerate Bit Stream終了の確認に使えるかもしれない。

.hwdefはバイナリっぽい。
.bxmlはテキストとして中身が読める。
更新日付だけ使う場合はどちらでもよさそう。
DBD::ODBCとFreeTDSを使ってDSN lessでSQL Serverへ接続する

# 内容

odbcとfreetdsを利用したsql serverへの接続方法を紹介する記事は多いです。

それらの記事は、sql serverの接続情報(IP アドレス、ポート番号等)を別ファイルに予め定義しておき、
その定義された設定を利用してsql serverに接続するというものでした。

この方法では予め接続するDBが限定されているケースでは有効ですが、接続DBが限定されないケースでは
不都合です。

ソースコード内で接続する情報（IP アドレス、ポート等）を動的に設定したいケースがありましたので、
その方法を紹介します。

ここでは/etc/odbc.iniやfeetds.confの設定情報を参照しないで、FreeTDSとDBD::ODBCを利用した DSN lessな接続方法を紹介します。


# 環境

- CentOS 6.7 64bit
- unixODBC 2.2.14
- freetds v0.91

# 手順

下記を順に実行する

 - unixodbc, freetdsのインストール

```bash
sudo yum install unixODBC-devel.x86_64
sudo yum install freetds-devel.x86_64
```

 - driver情報の登録
/etc/odbcinst.iniに以下を追加

```
[FreeTDS]
Description             = FreeTDS for SQL Server
Driver64                = /usr/lib64/libtdsodbc.so
Setup64         = /usr/lib64/libtdsS.so
FileUsage               = 1
CPTimeout               = 5
CPReuse         = 5
UsageCount              = 1
```

 - DBD::ODBCのインストール

```bash
cpanm DBI
cpanm DBD::ODBC
```

# サンプルコードの実行

以下のスクリプトを実行する

```pl

use strict;
use warnings;

use utf8;
use DBI;
use Data::Dumper;

# DB名：sample_db
# ログインID：sa
# パスワード：password

my $dsn = "dbi:ODBC:DRIVER={FreeTDS};Server=192.168.56.100;Database=sample_db;Port=1433;";
    #"Trusted_Connection=yes;". # yesだとWindows認証
    #"AutoTranslate=No;";

my $dbh=DBI->connect($dsn.'uid=sa;'.'pwd=password') or die $!;

my $sql = "
select * FROM test
";
my $sth=$dbh->prepare($sql) or die $dbh->errstr;

# 出力エラー対策
$sth->{LongTruncOk}=1;
$sth->{LongReadLen}=2000000;

$sth->execute or die $dbh->errstr;

while(my $arrayref = $sth->fetchrow_arrayref){
        print Dumper $arrayref;
}

$sth->finish;
$dbh->disconnect;
```

### 日本語の後半部分が見切れる問題に関して

日本語が格納されている列ではデータの後半部分が見切れる問題があります。
DBD::ODBCがデフォルトではUnicodeサポートがされないためです。(*参考文献 Enabling and Disabling Unicode supportを参照)

データベース内で日本語を格納している場合は、以下の手順1，もしくは手順2でDBD::ODBCをインストールして下さい。

- DBD::ODBCインストール手順1

```

cpanm DBD::ODBC --configure-args="-u"

```

- DBD::ODBCインストール手順2

```
cpanm DBD::ODBC --look
perl Makefile.PL -u
make
make test
make install
```

# tsqlによる接続

FreeTDS 付属のtsqlコマンドでSQL Serverサーバへ接続することも可能です。

```
$ tsql -I FreeTDS -S 192.168.56.100 -D sample_db -P 1433 -U sa -P password
```

# 参考文献

- [PC MEMORANDUM OF AUGUSTUS](http://www.augustus.to/blog/3128/archives/000047.html)
- [htgc tech blog](http://d.hatena.ne.jp/htgc/20130310/1362863515)
- [Enabling and Disabling Unicode support](http://search.cpan.org/~mjevans/DBD-ODBC-1.52/ODBC.pm#Enabling_and_Disabling_Unicode_support)


以上

# CHANGELOG

2016/12/16 日本語が見切れる問題を追加
2016/12/13 tsql 追加, 段落、タイトル修正
標準入力から受け取った文字列を数値に変換する

標準入力をデリミタで区切り数値型へ変換する
数値型から文字列型の変換方法、
forと拡張forの構文も記載する

```java:StdInNPrs.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class stdInNcng {
    public static void main(String args[] ) throws Exception {
    	final String strDlmt=",";	//定数として区切り文字(デリミタ)を指定する
    	
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	String strLine = br.readLine();
    	
    	//デリミタで文字列を区切る
    	String strSplit[] = strLine.split(strDlmt);
    	
    	//int型配列を宣言する
    	int intStdInLen = strSplit.length;
    	int intSplit[] = new int[intStdInLen];
    	
    	//配列を一つずつ文字列から数値へ変換する
    	for(int i=0;i<intStdInLen;i++){
    		intSplit[i]=Integer.parseInt(strSplit[i]);
    		//Long型に変換する場合は、下記を使う
    		//lngSplit[i]=Long.parseLong(strSplit[i]);
    	}
    	//for構文
    	for (int i=0;i<intStdInLen;i++){
    		  System.out.println(intSplit[i]);
    	}
    	
    	
    	//配列を一つずつ数値から文字列へ変換する
    	for(int i=0;i<intStdInLen;i++){
    		strSplit[i] = String.valueOf(intSplit[i]);
    	}
    	//拡張for構文
    	for (String strData: strSplit){
    		  System.out.println(strData);
    	}
    	
    }
}
```
firefox

# tips
## open new tab on the right side of current tab
http://www.koikikukan.com/archives/2015/04/09-005555.php
1. input "about:config" on the address bar.
2. input "browser.tabs.insertRelatedAfterCurrent" on the search form.
3. change "browser.tabs.insertRelatedAfterCurrent" value into true.
4. save configuration.
rpm でアップデートで上書きされるファイル・されないファイル

rpm でインストールしたときに配置されるファイルには幾つか種類があり、特に「設定ファイル」は、アップデートしたときに元の内容から編集されていた場合は編集されたファイルが維持される、という特徴があります（rpm に含まれていた最新の設定ファイルは .rpmnew みたいなサフィックスが付いて保存されたと思います）。

設定ファイルの一覧は `rpm -qlc <package>` で表示できます、例えば次のようにです。

```
rpm -qlc httpd
```

```
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
```

この一覧に含まれないファイルは編集してもアップデートで上書きされてしまうので、編集するべきではありません。

また、この一覧に含まれる、いわゆる設定ファイルも、ファイルを削除するとアップデートで復元してしまうため、いらないときは削除するのではなく、下記のように中身を空にするべきです。

**リダイレクトでファイルの内容を空にする**

```
> /etc/httpd/conf.d/autoindex.conf
> /etc/httpd/conf.d/userdir.conf
> /etc/httpd/conf.d/welcome.conf
```
CentOS 6 の NIC の名前を固定する方法いろいろ

CentOS 6 で Vagrant の Box とか AWS の AMI とか VirtualBox の ovf/ova とかのイメージを作るときに `/etc/udev/rules.d/70-persistent-net.rules` をそのまま残しておくと、イメージから起動したときに NIC のデバイス名が変わってしまい、IP アドレスが割り当てられないなどの問題が発生したりするの、あるあるだと思います。

このファイルを削除しておけば大丈夫ですが、

```bash
rm -f /etc/udev/rules.d/70-persistent-net.rules
```

起動するたびに復元されてしまうので、イメージを作成する都度、手作業で削除する必要があり、めんどくさいし忘れてしまうこともあります。

ので、最初に ISO から構築した後に１回だけ作業するだけにしたいのですが、下記のような幾つかの方法があるようです。

**毎回削除する**

起動時に `rc.local` で自動的に削除します。実はやったことないのでこれで大丈夫かどうかわかりません。

```bash
echo "rm -f /etc/udev/rules.d/70-persistent-net.rules" >> /etc/rc.d/rc.local
```

**ディレクトリを作る**

同名のディレクトリを作っておくことでファイルの作成を失敗させます。

```bash
rm -f /etc/udev/rules.d/70-persistent-net.rules
mkdir /etc/udev/rules.d/70-persistent-net.rules
```

**/dev/null にリンクする**

`/dev/null` にリンクしておくことで書き込みを無視します。

```bash
rm -f /etc/udev/rules.d/70-persistent-net.rules
ln -sf /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

**/lib/udev/rules.d/75-net-description.rules を空にする**

`70-persistent-net.rules` を作るための設定ファイルがあるのでそれを空にします。

```bash
> /lib/udev/rules.d/75-net-description.rules
```

----

どの方法もちょっと微妙です。特に最後の方法は `yum update` で戻ってしまいそうです。

AWS の CentOS 6 の AMI を見たところ、次のような空ファイルが作成されていました。

```bash
> /etc/udev/rules.d/75-persistent-net-generator.rules
```

多分この方法が一番いいと思います。

----

`man udev` 曰く（**Rules files** のちょっと下あたり）

> Rule files are required to have a unique name, duplicate file names are ignored.
> Files in /etc/udev/rules.d/ have precedence over files with the same name in /lib/udev/rules.d/. This can be used to ignore a default rules file if needed.

> ルールファイルは一意の名前を持っている必要があり、重複したファイル名は無視されます。
> /etc/udev/rules.d/ にあるファイルは /lib/udev/rules.d/ で同じ名前のファイルより優先されます。
> これは、必要に応じて、デフォルトのルールファイルを無視するために使用することができます。
> *（Powered by Google 翻訳）*
Atomで手動スクレイピング


[プログラムいらず！vimで手動スクレイピング](http://qiita.com/muran001/items/7a76a1c70aa12ed68cb6)という記事があったので、Atomでもやってみた。
vimの場合はexコマンドの組み合わせで実現していたが、AtomならばJavaScriptを使うので「プログラムいらず！」とはならないが、やってみるのも一興であろう。
「表示」 > 「開発」 > 「デベロッパー ツール」からデベロッパーツールを開き、新しいタブを開いた上で下記JavaScriptを実行すると動く。

## 正規表現による力技

```js
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r){var b = "";r.on("data", function(c){b += c});r.on("end", function(){b.replace(/\n/g, "").match(/<a[^>]*href="([^"]+)"/g).forEach(function(m){atom.workspace.getActiveTextEditor().insertText(m.replace(/<a[^>]*href="([^"]+)"/, function(){return arguments[1] + "\n"}))})})})
```

なにこれきもちわるい。

## DOMオブジェクトにしてみる

Vimは行指向の編集が出来るから、正規表現による力技でもスマートにやれるのだろう。
ならばAtomはJSを扱える強みを生かしてDOMオブジェクトから抽出するのがスマートであるはずだ。

```js
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r){var b = "";r.on("data", function(c){b += c});r.on("end", function(){var p = new DOMParser();var d = p.parseFromString(b, "text/html");[].forEach.call(d.querySelectorAll("a"), function(a){atom.workspace.getActiveTextEditor().insertText(a.getAttribute("href") + "\n")})})})
```

なにこれきもちわるい。

## 結論

やる前から分かっていたことだが、素直にプログラム書いて、[script](http://atom.io/packages/script)なりで実行した結果をコピペしたほうがすっきり書けるようだ。

なお、他のOSではどうか知らないが、Windows版であれば`Ctrl + o`で開くファイル選択ダイアログの「ファイル名」にURLを貼り付けて「開く」とするとファイルをダウンロードしてから開いてくれるので、参考までに。
（これはAtomに限らずWindowsの「ファイルを開く」ならば大体利用できる）

## 補足

標準状態で扱えるモジュールのみで完結させようとしたため`http`モジュールや`DomParser`を使用しているが、恐らく`request`モジュールや`cheerio`モジュールを使ったほうがスマートに書けるであろう。
しかし、Vimは標準で扱えるものだけで実現していたため、今回はあえてこれらのモジュールを使わずに泥臭く書いている。

最後に、上記のコードを[atom-beautify](http://atom.io/packages/atom-beautify)で整形したものを掲載する。
「ここをこうしたらもっと短くなるのでは」というアイデアがあればコメントにてお教えいただければ幸いである。

### "正規表現による力技"の整形

```js
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r) {
  var b = "";
  r.on("data", function(c) {
    b += c
  });
  r.on("end", function() {
    b.replace(/\n/g, "").match(/<a[^>]*href="([^"]+)"/g).forEach(function(m) {
      atom.workspace.getActiveTextEditor().insertText(m.replace(/<a[^>]*href="([^"]+)"/, function() {
        return arguments[1] + "\n"
      }))
    })
  })
})
```

### "DOMオブジェクトにしてみる"の整形

```js
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r) {
  var b = "";
  r.on("data", function(c) {
    b += c
  });
  r.on("end", function() {
    var p = new DOMParser();
    var d = p.parseFromString(b, "text/html");
    [].forEach.call(d.querySelectorAll("a"), function(a) {
      atom.workspace.getActiveTextEditor().insertText(a.getAttribute("href") + "\n")
    })
  })
})
```
AWK のフィールドセパレータの真実

- [ワンライナーのための perl コマンドラインオプション入門](http://qiita.com/ngyuki/items/d5dde70cf2de952cfb87)

という内容を社内 SNS っぽいところに投稿したところ、次のようなツッコミがありました。


> 大抵の環境では gawk が入っているので区切り文字に正規表現が指定できるようですね。
>
> ```
> cat hoge.log | awk -F',+' '{print $2}'
> ```

なん・・だと・・

そこ、正規表現だったの？？

じゃあ `awk -F'.'` とか、超使い方間違えていたの？ 死ぬの？

----

`man awk` 曰く（**Fields** の辺り）。

> If FS is a single character, fields are separated by that character.
> If FS is the  null  string, then each individual character becomes a separate field.
> Otherwise, FS is expected to be a full regular expression.
> In the special case that FS is a single space, fields are separated by runs of spaces and/or tabs and/or newlines.

意訳。

- 単一の文字なら、フィールドはその文字で句切られる
- 空文字列なら、それぞれの文字が別々のフィールドになる（1文字ずつのフィールドになる）
- それ以外なら正規表現になる
- 特殊なケースで、単一のスペースなら、空白/タブ/改行、のいずれかで区切られる

なるほど。

```bash
$ cat <<EOS> hoge.txt
aaa.123 xxx
bbb.456 yyy
ccc.789 zzz
EOS
```

１文字なら只の文字。

```bash
$ cat hoge.txt | awk -F. '{print $2}'
123 xxx
456 yyy
789 zzz
```

２文字以上なら正規表現。

```bash
$ cat hoge.txt | awk -F'[0-9]+' '{print $1}'
aaa.
bbb.
ccc.
```

空文字なら文字ごとに区切り。

```bash
$ cat hoge.txt | awk -F '' '{print $6}'
2
5
8
```

単一のスペースなら空白/タブ/改行。

```bash
$ cat hoge.txt | awk -F ' ' '{print $1}'
aaa.123
bbb.456
ccc.789
```

最後のケースはレコードセパレータも変えるとわかりやすい。

```bash
$ cat <<EOS> hoge.txt
aaa
bbb
ccc
.
123 456 789
.
xxx
yyy
zzz
EOS

$ cat hoge.txt | awk -F ' ' -v RS=. '{print $2}'
bbb
456
yyy
```

----

`awk -F'.'` は無事だった・・よかった。
ワンライナーのための perl コマンドラインオプション入門

perl とか学生時代にはじめて Web に触れたとき以来ほとんど触ったことありませんが、たまにワンライナーで sed の代わりにつかうと便利です。

大抵の環境でインストールされているし、python も大抵の環境でインストールされているけどワンライナーには向かないし。

## コマンドラインオプションの説明

### `-e <program>`

実行するスクリプトの内容を指定します。perl をワンライナーで使用するならこれは必須です。

### `-p`

入力データの各行を処理して出力します。入力行は `$_` に入ります。

概ね次のようなコードと同じです（イメージ）。

```perl
while (<>) {
  ... script ...
} continue {
  print;
}
```

### `-n`

入力データの各行を処理します。`-p` から出力を取り除いたものです。

```perl
while (<>) {
  ... script ...
}
```

### `-l[octal]`

スクリプトの処理前に行を chomp し、さらに print で出力時に改行を追加します。8進数で文字を指定すると print で出力時に追加される文字を指定できます。

`-l` を使わないかぎり `$_` とか後述の `$F` の最後とかには改行も含まれています。sed や awk と同じ感覚で使うなら `-l` も付けておくと良いでしょう。

### `-0[octal]`

8進数で行のセパレータ文字を指定します。省略すればヌル文字になります。

例えば find の -print0 と組み合わせて次のように使います。

```perl
find . -name '*.bak' -print0 | perl -0ne unlink
```

### `-a`

`-n` や `-p` と一緒に使用すると、スクリプトの実行前に行を分割して `@F` に代入します。

awk っぽい使い方ができます。

```bash
ip -o addr show | perl -anle 'print $F[3]'
```

### `-F<pattern>`

`-a` で行を分割するときのセパレータを指定します。

```bash
cat /etc/passwd | perl -aF: -lne 'print $F[2]'
```

指定されたものは正規表現と解釈されます。

```bash
echo -e 'aaa123bbb\nccc456ddd' | perl -aF'\d+' -lne 'print $F[1]'
```

修飾子を付けて指定することもできます。

```bash
echo -e '12a34\n56Z78' | perl -aF'/[a-z]/i' -lne 'print $F[1]'
```

### `-i[extension]`

入力ファイルを処理結果で上書きします。`extension`を指定すると元ファイルに拡張子を付与してバックアップします。

sed の `-i` と同じです。

## perl の補足

perl はいろんなところで変数が省略できるようになっており、下記のコードだと、

```perl
while (<>) {
  ... script ...
} continue {
  print;
}
```

下記のコードと同じです（たぶん）。

```perl
while ($_ = <>) {
  ... script ...
} continue {
  print $_;
}
```

他の制御文とかでも、変数を省略すると自動的に `$_` が使われます。

例えば、下記のコードは、

```perl
print if /foo/
```

下記のコードと同じです（たぶん）。

```perl
print $_ if $_ =~ /foo/
```

普通にコードを書く分には気持ち悪いことこのうえないですが、ワンライナーするには便利です。

## 使用例

てきとうな入力データを作ります。

```bash
cat <<EOS> hoge.log
foo123bar,ore,,123
foofoo456,are,,456
barbar789,sore,,789
EOS
```

----

foo を ___ に置換します。もちろんこの程度なら sed でも余裕です。

```bash
# sed の場合
cat hoge.log | sed 's/foo/___/g'

# perl の場合
cat hoge.log | perl -pe 's/foo/___/g'
```

----

正規表現に一致する最初の行を表示します。これも sed でも余裕です。

```bash
# sed の場合
cat hoge.log | sed -rn '/are/{p;q}'

# perl の場合
cat hoge.log | perl -lne 'print,exit if /are/'
```

----

正規表現に一致する部分文字列を返します。grep で一応できます。

```bash
# grep の場合
cat hoge.log | grep -Po 'foo\d+'

# perl の場合
cat hoge.log | perl -lne 'print $1 if /(foo\d+)/'
```

----

正規表現のサブパターンだけを返します。たぶん sed や grep だと辛いです。

```bash
# perl の場合
cat hoge.log | perl -lne 'print $1 if /foo(\d+)/'
```

----

区切り文字で分割した２番目の項目を出力します。これは awk でも余裕です。

```bash
# awk の場合
cat hoge.log | awk -F, '{print $2}'

# perl の場合
cat hoge.log | perl -aln -F, -e 'print $F[1]'
```
----

正規表現で分割した２番目の項目を出力します。たぶん awk だと辛いです。

```bash
# perl の場合
cat hoge.log | perl -aln -F'/,+/' -e 'print $F[2]'
```

## ruby のワンライナーのためのコマンドラインオプション

実は ruby にもほとんど同じようなコマンドラインオプションがあります。
ふりがなを正規表現を使って簡単に片付ける方法

# rubyタグの置き換えめんどい事件
rubyタグを使って、ふりがなを振る必要がありました。
量も膨大ですし、手作業で置き換えるとバグの元なので正規表現を使って置換を試みることにしました。

##エディタ
sublime text2
##正規表現で置き換え

1.command + alt + Fで置換フォームを表示する
2.置換フォームに以下を入力する
![スクリーンショット 2016-01-12 午後8.22.08.png](https://qiita-image-store.s3.amazonaws.com/0/56423/de017389-e293-a234-d990-9c1d3e5e5e91.png)
※左端の正規表現は選択状態にしておくこと

3.Find What:に漢字のJISコードを入れ、( +) で括る。()で括ることによってReplace With:で便利な使い方ができる。

```
([々〇〻\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}]+)
```

4.$1の前後に置換したい文字を入力する。Find What:の括弧が下の用に使用する事ができる。 

```
<ruby><rb>$1</rb><rp>(</rp><rt></rt><rp>)</rp></ruby>
```

5.replace
<b>ひゃっはー！うまくいったぜぇ！！！</b>
後は手作業。。。この後の効率化の方法求むです m ( _ _ ) m

## CSS
cssはタグを上書きしています。(stylusの書き方になります。)

```
ruby
	display:inline-block !important
	text-align:center !important
	word-wrap:normal !important
	vertical-align: bottom !important

	rp
		display:none !important
	rb
		display: table-row-group !important
		text-align:center !important
		vertical-align:bottom !important
		
	rt
		display: table-header-group !important
		text-align:center !important
		vertical-align:bottom !important
		font-size:0.3em !important
		line-height:0.3em !important
```
ふりがなが縦幅を取るのが嫌なので、
rtのfont-sizeとline-heightを小さくしているのがポイントです。
default styleはfont-size:50%のline-height:1だったと思います。

##結果
![スクリーンショット 2016-01-12 午後8.43.37.png](https://qiita-image-store.s3.amazonaws.com/0/56423/31380e82-f4a3-d779-b44c-48008367f107.png)
こんな感じになりました！
マンズが13枚そろった時のシャンテン数の割合を計算してみた

# マンズが13枚そろった時のシャンテン数の割合を計算してみた

という訳で麻雀ネタ第三弾です。

## 前回の記事で思ったこと

前回の記事は[こちら](http://qiita.com/satthi/items/c9e2cddc32148887426d)

完全にランダムでチンイツ待ち当てゲームをやると意外とテンパイしてないなって思ったんで調べてみた！

## で

ただ単に普通に計算したら**面白くないので**、総当たりしたらどんなもんかな・・・と

ふむ・・・

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/54588/0e06456a-1fd2-09e6-2245-ad3d0973b150.png)か・・・

2,310,789,600件・・・

**よしやろう！**

## という訳で

[やった](https://github.com/satthi/majong_menchin_shanten)

結果は

テンパイ：1,106,193,760件(約47.9%)

1シャンテン：1,190,253,600件(約51.5%)

2シャンテン：14,342,240件(約0.6%)

でした。

なお、かかった時間は197,004秒・・・

**うん、たった二日チョイやな！**

## やったこと

1マン～9マンまで各4牌、の計36牌のうち13枚を選ぶ組み合わせは上記のとおり![無題.png](https://qiita-image-store.s3.amazonaws.com/0/54588/6380e6dd-2284-f4db-3b47-359585304be1.png)

その組み合わせをwhile文でまわしながら全通り作ります。(ちなみになーんもググらずに自分で考えて適当に書いたんでスマートな書き方かどうかは知らない！


```java
//コードから抜粋して整理
Integer check_hai = 36;
Integer pickup_num = 13;

HashMap<Integer,Integer>before_info = new HashMap<Integer,Integer>();
HashMap<Integer,Integer>start_lists = new HashMap<Integer,Integer>();

for (int i = 1 ; i <= pickup_num ; i++){
    start_lists.put(i, i);
}
//ここでシャンテン判定

Integer check = check(haipai, start_lists, pickup_num, 0L);
before_info = start_lists;
Long count = 0L;
while(true) {
    //末端の数字が最大値でないなら末端の数字を+1する
    if (before_info.get(pickup_num) != check_hai) {
        HashMap<Integer,Integer>now_info = new HashMap<Integer,Integer>();
        now_info = before_info;
        now_info.put(pickup_num, now_info.get(pickup_num) + 1);
        //ここでシャンテン判定
        before_info = now_info;
    } else {
        //何桁目までがmaxか調べる
        Integer max_keta = null;
        for (int j = pickup_num; j >= 1; j--) {
            if (before_info.get(j) != check_hai - pickup_num + j) {
                max_keta = j + 1;
                //for文のbreak;
                break;
            }
        }
        
        if (max_keta == null){
            //while文のbreak;
            break;
        }
        
        HashMap<Integer,Integer>now_info = new HashMap<Integer,Integer>();
        now_info = before_info;
        //maxでない桁をチェックしてその桁を+1
        now_info.put(max_keta - 1, now_info.get(max_keta - 1) + 1);
        Integer kijun_num = now_info.get(max_keta - 1);
        //以降の桁はkijun_numに+1ずつした値
        for (int m = max_keta;m <= pickup_num;m++){
            kijun_num++;
            now_info.put(m, kijun_num);
        }
        //ここでシャンテン判定
        before_info = now_info;
    }
}

```

これさえ出来れば後は、以前のコードを使いまわしたら完成ですね！

## 感想とか

**とりあえず普通に数値をInteger型で書いて実行してたら、途中でLong型じゃないとだめなことに気づいた！**

あと、普通にLong型で値入れるときは後ろにLを入れないと動かないことに驚愕・・・。

~~PHPこんなこと気にしなくていいのに・・・~~

そして同じ環境でPHPだと**絶対に二日じゃ終わらない**自信がある！

## 次のネタ・・・？

とりあえず[天和の確率は33万分の1](http://www10.plala.or.jp/rascalhp/mjmath.htm#6)なんてあるが本当かよ！そんなに上がれるなんて信じられない！

総あたりで調べてやんぜ！！！！

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/54588/41cf7c95-49ba-bda0-4c6b-fd5a06eb5dfd.png)


・・・

・・・・・・

・・・・・・・・・

このまま計算したら約250万年かー

**長生きしないとね！**

~~その前にサーバがぶっ壊れるか~~
java play Framework アノテーション以外でvalidationをつける方法

play2.4での入力チェックについて :pencil2: 

```
@Required(message = "名前を入力してください。")
@Pattern(value = "^(?!.*abc).+$", message = "abcという文字列は使えません")
public String name;

@MinLength(value = 4, message = "4文字以上入力してください。")
@MaxLength(value = 16, message = "16文字以下で入力してください。")
@Pattern(value = "^[a-zA-Z0-9]+$", message = "半角英数字のみで入力してください。")
public String userName;
```
のように@で行うバリデート以外にも
バリデーションを追加したい場合。

今回は期間の入力フォームに対して
バリデーションをつけたかったので以下のようにした。

```
//期間初日
@Required(message = "未入力です"。)
@Formats.DateTime(pattern = "yyyy/MM/dd")
public Date start_date;

//期間最終日
@Required(message = "未入力です"。)
@Formats.DateTime(pattern = "yyyy/MM/dd")
public Date end_date;


// バリデーションの追加
public List<ValidationError> validate() {
        List<ValidationError> errors = new ArrayList<ValidationError>();
        if(!validateDateCompare(start_date, end_date)){
            errors.add(new ValidationError("date", "期間最終日は期間初日より未来の日付を入力してください。"));
        }
        return errors.isEmpty() ? null : errors;
}
    
    // 日付を比較
public boolean DateCompare(Date start_date, Date end_date) {
        int diff = start_at.compareTo(end_date);
        if (diff == 0 || 0 > diff) {
            return true;
        } else {
            return false;
        }
}

```

viewでのエラーメッセージ表示方法は@のバリデーションと同様。
`List<ValidationError> errors`は`List<ValidationError>`以外に
`String`や`Map<String,List<ValidationError>>`にしても使える。

参考資料　[公式ドキュメント](https://www.playframework.com/documentation/2.4.x/JavaForms)　[ソース](https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/data/validation/Validation.scala
)