OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellでWMIからユーザ情報取得する(csv)

# はじめに
なんでActive Directoryじゃないの、というつっこみはなしでお願いします(;>ω<)
WMIからユーザ名を取得して、```ner user``` で地道に情報を取得しています。

# 出力形式

```YYYYMMDD_サーバ名.csv
"ユーザ名","アカウント有効","最終パスワード変更日時","パスワード有効期間","最終ログオン日時","所属グループ"
"Administrator","Yes","2015/09/01","2015/10/13","2015/09/17","*Administrators　"
```
# ソース

```userdataList.ps1
#出力パス作成
$d = Get-Date -Format "yyyyMMdd"
$mypath = Split-Path $myInvocation.MyCommand.Path -Parent
$path = $mypath + $d + "_" + $env:computerName + ".csv"

#WMIを取り出す
$WMIResult = Get-WmiObject -q "SELECT Name From Win32_UserAccount Where LocalAccount=True"

#カスタムオブジェクト(要素の入れ物)
$Datas = New-Object System.Collections.ArrayList

$WMIResult | %{ ($_.name) } | %{

        # カスタムオブジェクトの要素作成
        $Data = New-Object PSObject | Select-Object ユーザ名, アカウント有効, 最終パスワード変更日時,パスワード有効期間,最終ログオン日時,所属グループ

        #ユーザ情報の取得
        $detailUser = net user $_
       
        #カスタムオブジェクトの要素に値を設定
        $Data.ユーザ名 =  ($detailUser[0] -replace '\s+','■').Split("■")[1]     
        $Data.アカウント有効 =  ($detailUser[5] -replace '\s+','■').Split("■")[1]  
        $Data.最終パスワード変更日時 = ($detailUser[8] -replace '\s+','■').Split("■")[1]     
        $Data.パスワード有効期間 = ($detailUser[9] -replace '\s+','■').Split("■")[1] 
        $Data.最終ログオン日時 = ($detailUser[18] -replace '\s+','■').Split("■")[1] 
        
        #ローカルグループは可変なので、直後のグローバルグループの開始位置を取得する
        #初期値
        $count = 0
        
        $ln = foreach($e In $detailUser){if ($e -match "グローバル"){$count}$count += 1}
        $joinGroup = ""
        for ($i=0; $i -lt ($ln - 22) ; $i++){
           
           $hoge = ($detailUser[22+$i] -replace '\s+','')
           $joinGroup += $hoge.Substring($hoge.IndexOf("*")) + "　"
           
        }
        
        $Data.所属グループ = $joinGroup
        
        # カスタムオブジェクトに要素を追加
        [void]$Datas.Add($Data)    
      
 } 
 $Datas |Export-Csv -Path $path -EnCoding default -Force -NoTypeInformation
```

# カスタム
他の情報が必要な場合は、下記をもとに「カスタムオブジェクトの要素作成/値を設定」辺りを変更します。

| 行番号($detailUser) | 情報($Data.) |
|:-----------|:------------|
|0|ユーザー名                         |
|1|フル ネーム                        |
|2|コメント                           |
|3|ユーザーのコメント                 |
|4|国コード                           |
|5|アカウント有効                     |
|6|アカウントの期限                   |
|7|(空行)                           |
|8|最終パスワード変更日時             |
|9|パスワード有効期間                 |
|10|パスワード次回変更可能日時        |
|11|パスワードあり                    |
|12|ユーザーによるパスワード変更可能  |
|13|(空行)                          |
|14|ログオン可能なワークステーション  |
|15|ログオン スクリプト               |
|16|ユーザー プロファイル             |
|17|ホーム ディレクトリ               |
|18|最終ログオン日時                  |
|19|(空行)                      |
|20|ログオン可能時間                  |
|21|(空行)                            |
|22|所属しているローカル グループ     |
|  |                                  |
|  |所属しているグローバル グループ   |
編集してから実行するまで

##便利だと思ったので紹介

編集してから実行するまで、いちいち同じファイル名を書くのがめんどくさい

```:terminal
vim test.py
python !$
```

で実行すると、`!$`で`test.py`が参照できて便利
`../`とか、絶対参照した後とか、ディレクトリが遠いときに便利
`!$`最後に参照したものなので、'ls file1 file2 file3'の`file2`を参照したい場合は、`!:2`とすればできる
unicorn+nginxで動かしてるRails をtouchでリスタートしちゃう

# 経緯

+ エンジニアだけの開発チームにデザイナーが加わった
+ 開発機はなるべく本番と同じにするためWEBrick ではなくnginx+unicornで動いている
+ デザイナーは`kill -USR2` とかは打てない

# 方針

+ 基本は[この記事](http://tech.actindi.net/3615001798)に書いてあることをやる
+ しかし、デザイナーに`tmp/unicorn_restart/restart.txt` です！と言っても忘れるかもしれない
+ `tmp/restart.txt` でrestart出来るよう必要がある

# 結果

+ `config/unicorn.rb` にこんな事を追記した
+ 基本的には`Listen.to`の辺りを変えただけ

```rb
before_fork do |_server, _worker|

  # oldsig QUIT
  if File.exists?(old_pid) && _server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end

  # watch restart.txt
  if _worker.nr == 0 && Rails.env.development?
    listener = Listen.to(Rails.root.join('tmp').to_s, only: /\Arestart.txt\z/) do |modified, added, removed|
      pid = _server.config[:pid]
      if pid == _server.pid
        begin
          Process.kill("USR2", File.read(pid).to_i)
        rescue Errno::ENOENT, Errno::ESRCH
        end
      end
    end
    listener.start
  end
```
Hyper-V利用の個人的ガイドライン

# はじめに

これまで数台のHyper-Vホストで運用してきた経験より、個人的な使用ガイドラインらしきものをまとめました。

# ネットワーク設定

参考：[Hyper-Vネットワークの基本](http://www.vwnet.jp/Windows/WS12R2/Hyper-V/Hyper-V_Network.htm)

## ゲスト専用ポートを用意する

NICが2つ以上ある場合、LANケーブルを2つ以上刺し、1つはゲスト専用ポートとする。

0. Hyper-Vマネージャーより［仮想ネットワークマネージャー］を開く
0. 「外部」の仮想ネットワークを追加する
0. 追加した外部ネットワークを選択し、［接続の種類］→［管理オペレーティング システムにこのネットワークアダプターの共有を許可する］のチェックを外す

## 仮想内部ネットワークで止むを得ず外と繋ぎたい場合ルーティング設定を追加する

仮想内部ネットワークは閉域網とすべきだが、やむを得ず外と繋ぎたいこともある。そういうときはホストのルーティングテーブルに追加する。

0. Hyper-Vマネージャーより［仮想ネットワークマネージャー］を開く
0. 「内部」の仮想ネットワークを追加する
0. ホストの［ネットワークと共有センター］を開く
0. 作成した仮想内部ネットワークのプロパティを開く
0. 仮想内部ネットワークにIPアドレスを設定する  
   （このアドレスがゲートウェイのアドレスとなる）
0. ホストにてコマンドプロンプトを開き、route add コマンドで作成した仮想内部ネットワークセグメントへのアクセスを作成した上記IPアドレス宛にルーティングする


なお、ゲスト側ではデフォルトゲートウェイに上記IPアドレスを設定すると、外にアクセスできるようになる。

# 仮想マシンの構成

## D:\Hyper-Vに配置する

D:\Hyper-V（もしくはC:\Hyper-V）フォルダーを仮想マシンのルートフォルダーとする。
フォルダー内は次のように構成する。

```
D:\Hyper-V\
|
+- (仮想マシン名)\
|  |
|  +- Virtual Machines\
|  |  |
|  |  +- (仮想マシンのGUID)\
|  |  |
|  |  +- (仮想マシンのGUID).xml
|  |
|  +- Virtual Hard Disks\
|  |  |
|  |  +- (仮想マシン名).vhdx(vhd)
|  |  |
|  |  +- (仮想マシン名)-（ドライブ名).vhdx(vhd)  ※追加HDDが必要なら
|  |
|  +- Snapshots\
|
+- (仮想マシン名)\
|  |
|  :
:
```

### 利点

- 管理する仮想マシンが分散しない
- ウイルス対策ソフトによる除外フォルダーがD:\Hyper-Vだけでよくなる

## CPUコア数は最大でも2

ホストの論理CPUコア数が使えるCPUコア数の上限になるので、多くの仮想マシンが必要なら一つ一つのコア数は最大でも2つくらいに抑える必要がある。

例）

- Intel Core i7だと物理コア4+Hyper Threadingで論理コア数は8
- ホストOS用のCPUコアを残すと、ゲストで使えるのはいいところ合計6コアまで

## 動的メモリを活用する

「動的メモリ」を使うとRAMをそれぞれのゲストOSが必要な分だけ使うため効率が良い。
ただし、使えるゲストOSに制限がある。

- Windows 7
    - Enterprise
    - Ultimate
- Windows 8以降
- Windows Server
- Linux
    - CentOS / RedHat Enterprise Linux
        - 6以上
    - Ubuntu
        - 12以上
    - 他
        - Linux ICsが使えるバージョン

# 仮想マシンの構築

## マスター仮想マシンを活用する

新たに仮想マシンを一から構築すると手間がかかるので、必要とするOSのマスター仮想マシンを作成しておく。
新たな仮想マシンはマスター仮想マシンを「新規コピー」して作成する。

参考：[\[Windows\] Sysprep を使用してHyper-V展開用の仮想マシンの雛形を作成する - Netplanetes](http://www.pine4.net/Memo/Article/Archives/185)

なお、「差分ディスク」を使う方法もあるので併せて検討する。
[Hyper-Vの子パーティションを手早く作る](http://www.vwnet.jp/Windows/WS08R2/QuickChildPartition/QuickChild.htm)

### マスター仮想マシンの作成

0. OS名などでマスターとわかるように新規仮想マシンを作成する
0. マスター仮想マシンにOSをインストールし、最新のWindows Updateを行う
0. ビルドインAdministratorを有効化し、OSインストール時に作成した管理者ユーザーを削除する  
   （合わせてプロファイルも削除しておく）
0. ネットワークは接続なし、CD\DVDメディアをアンマウントする
0. sysprepツールを使い、OSを一般化してシャットダウンする
0. 作成した仮想マシンをHyper-Vで「エクスポート」する
0. エクスポートしたらマスター仮想マシンを削除する

### マスター仮想マシンのインポート

0. Hyper-V  マネージャーにて「仮想マシンのインポート」を開く
0. エクスポートしたマスター仮想マシンの**フォルダー**を指定する
0. マスター仮想マシンを選択する
0. ［インポートの種類］は［仮想マシンをコピーする（新しい一意なIDを作成する）］を選択する
0. ［移動先の選択］にて、［仮想マシンを別の場所に格納する］にチェックを入れ、各フォルダーに`D:\Hyper-V\(作成する仮想マシン名)`を入力する
0. 仮想ハード ディスクの保存場所に`D:\Hyper-V\(作成する仮想マシン名)\Virtual Hard Disks`を入力する
0. インポートを実行する
0. インポート後に仮想マシンの設定を開く
0. ［ハード ドライブ］を開き、仮想ハードディスクの［参照］ボタンをクリックする
0. vhdx(vhd)ファイルの名前をマスターマシン名から作成した仮想マシン名に変更し、選択しなおして［OK］ボタンをクリックする
0. 任意のネットワークアダプターを選択する
0. 仮想マシンを起動し、セットアップ（ライセンス認証含む）を行う
Rails newからHogestgram

#Rails newからHogestgram
##概要
InstgramのAPIを仕様し任意のタグのついた画像を取得する
http://ec2-54-92-85-246.ap-northeast-1.compute.amazonaws.com:3000

##Instgramとは
写真共有SNS
アクティブ数がtwitterを超えたらしい
http://gaiax-socialmedialab.jp/socialmedia/368

##類似サービス(?)
ネコスタグラム
http://tuiken.jp/archives/2324339.html
イヌスタグラム
http://tuiken.jp/archives/2350615.html
ビジョスタグラム
http://tuiken.jp/archives/2382368.html

##実装
###Rrails new
```
rails new hogestgram
cd hogestgram
```
###Gemを用意
Gemfileに
```
gem 'instagram'
```
を追加
bundle install

下記のGemを使用します。
https://github.com/Instagram/instagram-ruby-gem

###表示ページを用意
```
$rails g controller home index
vim config/routes.rb
post 'home#index'
root 'home#index'
```
###Instagram API_IDの取得
####アプリの登録
1.https://instagram.com/developer/
2.[Register a new Client]ボタンを押下
3.もろもろ入力して登録
####IDの取得
CLIENT ID:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CLIENT SECRET:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
をメモしておく

###コントローラ作成
```home_controller.rb
    Instagram.configure do |config|
      config.client_id = "CLIENT ID"
      config.client_secret = "CLIENT SECRET"
    end
    if params[:home_index] && params[:home_index][:search] != ""
      @image = Instagram.tag_recent_media(params[:home_index][:search], {:count =>20})
    end
```

###view作成
```erb
<h1>Hogestagram</h1>
<div>
<%= form_for :home_index do |f| %>
  <p>
    <%= f.label :search, "search" %>
    <%= f.text_field :search %>
    <%= f.submit %>
  </p>
<% end %>
</div>

<% if @image.present? %>
  <% @image.each do |p| %>
    <%= link_to p.link, :target => "_blank" do %>
      <%= image_tag(p.images.low_resolution.url) %>
    <% end %>
  <% end %>
<% end %>
```

##参考
[instagram api 事始め access_tokenを取得する - Qiita](https://qiita.com/zurg/items/4c423b93b6a7f1ac737d)
[InstagramのAPIを使って画像をひっぱてくる - Qiita](https://qiita.com/Kenya/items/1cfb108fe3292e5d20bb)
既に存在しているファイルを簡単に空ファイルに変える方法が目からうろこだったので共有する


* 既にファイルが存在しない場合

```
touch path/to/file.txt
```

* 既にファイルが存在していて、空に上書きしたい場合

```
: > path/to/file.txt
```
ZendFrameworkのflashMessengerでリダイレクト先に完了メッセージを渡す方法

完了や削除、編集、保存などの処理のあとに、重複処理を避けるために
リダイレクトをするのはよくある処理のひとつです。

そこでリダイレクト先の処理完了画面へ、
「◯◯の処理が完了しました」などといったメッセージを送ります。

前の画面からリダイレクト先へ値を渡さないと、
リダイレクト先からは、何が処理されてきたのかわからないためです。

そこで一般的にはセッションの利用を思いつくかと思いますが、
ZendFrameworkには、その処理を簡単に行えるように

「flashMessenger」という便利なプラグインが用意されています。

〜方法〜

Controller内のActionで
>
class FreeController extends W_Controller_Action_Admin
{
    public function pendingAction()
    {
　　　　〜〜〜〜
　　　　（省略）
　　　　〜〜〜〜
        \$message = $this->_helper->getHelper('FlashMessenger');
        // フラッシュマネージャへ受け渡すメッセージを追加する
        \$message->addMessage('URLの掲載依頼を保留しました');
        // リダイレクトする
        \$this->_redirect(/free_edit/preview);
    }  
}

処理後に実行するAction

>class Free_EditController extends W_Controller_Action
{
    public function preDispatch()
    {
        parent::preDispatch();
        
        // ここで　$_SESSION をダンプするとセッションにどのように保持されているかを確認できる
        var_dump($_SESSION);
        $message = $this->_helper->getHelper('FlashMessenger');
        
        $this->view->messages = $message->getMessages();
    }
}

VIEW側のファイルで
> <?= \$this->message('action', $this->messages) ?>
Circle CIでparallel実行したsimplecov結果の収集


TravisCIにせよCircle CIにせよ通常その結果を得るには「取れるところにおいて取ってくればいい、終了！」なんだけど、人類には早すぎる並列実行テクノロジーをやむを得ず使わざるを得ない場合には人智を越えるので大変なわけです。

その具体例として(?)今回はCircle CIでparallel実行したsimplecovの結果収集を取り上げます。

## 対象のソースコードの取得
後述しますが、まず対象のソースコードが必要です。GitHubからの場合、`https://github.com/<username>/<reponame>/archive/<commit>.tar.gz` を取ってきて、`tar -C /tmp -xf repo.tar.gz`するのが楽でしょう。Private Repositoryの場合は[Oauth tokenを取得してBasic Authに`<username>:<token>`](https://developer.github.com/v3/auth/#basic-authentication)でいけます。

## .resultset.jsonの収集
[GET: /project/:username/:project/:build_num/artifacts](https://circleci.com/docs/api) のJSONから適当に取ってきてください。

## .resultset.jsonのマージ
落とし穴がたくさんありますが、結論は以下の通りです。

```ruby
require 'open-uri'
require 'json'
require 'simplecov'
require 'fileutils'

resultset_uris = [] # .resultset.jsonのURIの入った配列
CIRCLECI_APIKEY # Circle CIのapikey
reponame # APIとかから取ってきましょう
vcs_revision # APIとかから取ってきましょう

dirpath = File.join(Dir.tmpdir, "#{reponame}-#{vcs_revision}")

merged_results = resultset_uris.inject({}).do |results, uri|
  part = URI("#{url}?circle-token=#{CIRCLECI_APIKEY}").read
  part.gsub!(/(?<=")\/[^"]*\/#{reponame}(?=\/)/, dirpath) # ソースファイルのパス書き換え
  json = JSON.parse(part)
  result = SimpleCov::Result.new(json['RSpec']['coverage'])
  result.original_result.merge_resultset(results)
end
SimpleCov.root(dirpath) # Simplecov.filtered()のroot_filter回避
res = SimpleCov::Result.new(merged_results) # マージ完了!
FileUtils.remove_entry_secure(dirpath, true) # ソースコード削除

# 例えばカバレッジ率が欲しい場合
puts "%.2f" % res.covered_percent
```
### ポイント
* resultset から参照しているファイルは実際にそこに存在している必要がある。（だから、最初にソースコードを取ってきたわけです）
* require 'simplecov'した時点のカレントディレクトリ下にソースコードがある。外にあると`Simplecov.filtered()`のroot_filterでそのファイルは除外されてしまう。回避するにはSimpleCov.root(repo_path)を呼ぶ。

以上を行わなかった場合、covered_percentが常に100になり、SimpleCov::Result#filesは[]になります。

## 参考資料
[HOW WE GET COVERAGE ON PARALLELIZED TEST BUILDS](http://technology.indiegogo.com/tag/simplecov/): CoverallsはCircle CIのVMにssh接続してやっているらしい。
Nginxのバーチャルホスト設定

バーチャルホストの設定についての体系的な記述が見当たらなかった。
下記の設定方法が正当であるかどうかは不明であるが一つの定番例として覚え書き。

##バーチャルホスト設定ファイル配置用のディレクトリ作成

これは習慣的な方法らしく、`sites-available`に設定ファイル実体を配置して、`sites-enabled`に設定ファイルへのシンボリックリンクを張るらしい。
シンボリックリンクを削除することで、簡単にバーチャルホストのサイトを閉鎖することが可能となる。

```
$ mkdir /etc/nginx/sites-available
$ mkdir /etc/nginx/sites-enabled
```

##sites-availableに設定ファイルを配置
```/etc/nginx/sites-available/virtualhost.com
server {
    listen       80;
    server_name www.virtualhost.com;
    access_log  /var/log/nginx/virtualhost.com.access.log;
    location / {
        root   /var/www/html/virtualhost;
        index  index.html index.htm index.php;
    }
    location ~ \.php$ {
        root           /var/www/html/virtualhost;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/html/virtualhost$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

```
$ cd /etc/nginx/sites-enabled/
$ ln -s /etc/nginx/sites-available/virtualhost.com virtualhost.com
```

##シンボリックリンクのあるsites-enabledに対してインクルード
```/etc/nginx/nginx.conf
include /etc/nginx/sites-enabled/*;
```

Apache HTTP Serverに比べると、直感的にも設定ファイルがわかりやすく記述できる。
EC2+Nginx+PHP-FPMの最小限の環境設定

AWS EC2で、Nginxを動かすまでを解説します。

##確認事項
1.SSH接続
できないと、なにもできません。
ログインしておいてください

2.セキュリティグループの確認
HTTPなり、HTTPSなりで自分がアクセスできるようにしておいてください。
ELB（ロードバランサ）を利用する場合も同様です。

![スクリーンショット 2015-09-30 16.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/85797/e530ac85-0334-5410-9348-6fb373c9e953.png)

##Nginxをインストール
ユーザをrootに変更します。

```
$ sudo su - 
```

Nginxをyumからインストールします。

```
# yum install nginx -y
```
##Nginx設定

成功したら、自動起動設定を有効にします

```
# chkconfig nginx on
```

ひとまず、Nginxを起動してみましょう。

```
# service nginx start
```

ブラウザでアクセスしてみましょう
ウェブサーバのIPアドレスを、ウェブブラウザのアドレスに入力してみます
![スクリーンショット 2015-10-01 16.07.38.png](https://qiita-image-store.s3.amazonaws.com/0/85797/6dac4134-fa2a-3718-4c9d-f1af198da6ba.png)
上のような表示になるはずです。

確認次第、Nginxはストップさせておきます。

```
# service nginx stop
```

プロジェクトをいれて置くためのディレクトリを作成します。
場所はどこでも良いですが、あまりユーザに依存する場所は好ましくないでしょう。
ここでは、/var/wwwとします。
ついでに、PHPの動作を確認するために、テスト用のドキュメントルートを作成します

```
# mkdir /var/www/test
```

ついでに、専用ユーザとグループ、ユーザのパスワードを設定します

```
# adduser www
# passwd www
# gpasswd -a www www
```

先ほど作成したドキュメントルートを専用ユーザと専用グループの所有とします。
パーミッションの設定は、本来、最低限であることが好ましいです。

```
# chown -R www:www /var/www/test
# chmod -R 2775 /var/www/test
```


##PHPとPHP-FPMをインストール

PHPとPHP-FPMをインストールします

```
# yum install php php-fpm -y
```

php-fpmを、自動起動設定し、起動します

```
# chkconfig php-fpm on 
# service php-fpm start
```

##PHPが動くか確認する

nginxの設定ファイルを変更します。

```
# vi /etc/nginx/nginx.conf
```

5行目のuserをnginxからwwwに変更します

```
user www 
```

46行目の"server　{"から始まるセクションをコメントアウトします。

```
#server{
    listen    80;
//以下略
#}
```



コメントアウトした箇所の後ろに、下記を追記してみてください

```
    server {
        listen      80;
        server_name localhost;
        root        /var/www/test; #テスト用のドキュメントルート
        index       index.php index.html;
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include fastcgi_params;
        }
    }
```

保存します。

確認用のPHPファイルを作成します

```
# vim /var/www/test/index.php
```

とりあえず、このように記述します

```
<?php
echo 'test';
```

設定を確認します

```
# service nginx configtest
```

エラーが出ていなければ、nginxを起動します

```
# servece nginx start
```

再び、ブラウザでサーバにアクセスしてみます。
testと出ていればOKです。
JAVA ランダムな配列

```java
:qiita.rb
import java.util.Random;
import java.util.Arrays;
import java.util.Collections;
//java.util.List→順序付きリストのインターフェース
import java.util.List;

 public class drink{
	public static void main(String[] args) {
		test1();
	}
	
	
	 private static void test1() {
	 	//rndd→名前は自由
	 	Random rndd = new Random();
		Random rnd = new Random();
		Random rnddd = new Random();
		String[] neko = {"凶", "吉", "大凶", "末吉"};
		String[] nekoneko = {"ねこ", " ねこ１", "ねこ２", "ねこ3"};
		String[] neko1 = neko;
		String[] neko2 = neko;
		String[] neko3 = nekoneko;
		String[] aa = {"ねこ4", " ねこ5", "ねこ6", "ねこ7"};
		List<String> list = Arrays.asList(aa);
		//リストの並びをシャッフルします
		Collections.shuffle(list);
		aa = (String[])list.toArray(new String[0]);
		
		//String[] neko1 = neko.clone();
		//neko.lengthは、発生させる乱数の上限値
		//length→文字列の長さを求める、変数nekoの長さ
		//nextInt()乱数を作る
		//nextIntの()に乱数の限界値(引数-1)を入れる
        	int num = rndd.nextInt(neko.length);
			System.out.println("今日のあなたの運勢は？");
			System.out.println(neko[num]);
		
		for(int b = 0; b < 4; b++) {
			System.out.println("neko1[" + b + "]:" +neko1[b]);
		}
		
			int c = rnd.nextInt(neko2.length);
			//int cにランダムで最大値が入った時、次の
			//c++で行列の繰り返し最大数を超えている
			//nekoには4つの値しか入れてない、それを超えたらアウト
			//なので、c++;とここに入れない方がいい
			System.out.println(neko2[c]);
		//}
		
		for(int d = 0; d < 4; d++) {
			System.out.println("neko3[" + d + "]:" +neko3[d]);
		}
		
		//既に出力済みの値ならスキップする
		//neko2の最大数分出力されるまでループし続ける
		
		for (String str : aa) {
		
		
		
			System.out.print(str + ", ");
		}
	}
}
""

▪️実行結果
Marimo-no-MacBook-Air:java marimo$ javac drink.java
Marimo-no-MacBook-Air:java marimo$ java drink
今日のあなたの運勢は？
大凶
neko1[0]:凶
neko1[1]:吉
neko1[2]:大凶
neko1[3]:末吉
吉
neko3[0]:ねこ
neko3[1]: ねこ１
neko3[2]:ねこ２
neko3[3]:ねこ3
 ねこ5, ねこ4, ねこ7, ねこ6, Marimo-no-MacBook-Air:java marimo$ javac drink.java
Marimo-no-MacBook-Air:java marimo$ java drink
今日のあなたの運勢は？
大凶
neko1[0]:凶
neko1[1]:吉
neko1[2]:大凶
neko1[3]:末吉
末吉
neko3[0]:ねこ
neko3[1]: ねこ１
neko3[2]:ねこ２
neko3[3]:ねこ3
 ねこ5, ねこ7, ねこ6, ねこ4
sublime text3 で lua を Build したい。


> 引用自記事：　http://yukinko-music.hatenablog.com/

実用性はあるのかは知らない。
取り敢えず出力結果を見たかったので導入してみる。
上のタブにて[ Tool > build System > New Build System ]  と移動し出てきたファイルに下の文をコピペする。

```lua.sublime-build
{
"cmd": ["/usr/local/bin/lua", "$file"],
"file_regex": "^(?:(?:\t)|(?:.+: ))(.+):([0-9]+): (.*)$",
"selector": "source.lua"
}
```

```test.lua
for i = 1, 10 do
print(i)
end
```
などを書いて ⌘ + B をして「1,2,3,4,5,6,7,8,9,10」と表示されれればおしまい
sprocketsではなくnodejsを使うRailsアプリをHerokuにデプロイする方法

sprocketsは面倒だし、babelやwebpackなどの最新JSテクノロジーを使うためにnodejsを使ってassetsを組み立てたいという欲求があると思います。

簡単に解決するなら `gulp build` したものをgitリポジトリに追加してしまえばいいのですが、挙動がおかしかった時にバグがあるのか、それともソースがちゃんと git-add できていなくて古いことが原因なのか、とか考える必要が生じて嫌な感じです。できればデプロイ時にビルドしたい。

そういう風な感じでassetsを管理しているRailsアプリをHerokuにデプロイするときに色々ハマったので備忘録としてその方法を書き残します。

# 忘れずにrails_12factorをbundleする

nodejsは関係無いですが、HerokuでRailsを動かすには必須らしいですね。

```rb:Gemfile
gem "rails_12factor", :group => :production
```

# rubyとnodejsのbuildpackを指定する

Herokuでrubyとnodejsが必要なのでbuildpackを2つ指定します。

```
heroku create --buildpack https://github.com/heroku/heroku-buildpack-ruby.git APP_NAME
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nodejs.git
```

昔は1アプリに複数のbuildpackを指定するにはmulti-buildpackを使う必要があったけど、最近は `buildpacks:add` するだけで問題無いとのこと。

# NPM_CONFIG_PRODUCTION=false

package.jsonで指定したパッケージをインストールして開発を行います。Railsでgulpやらを使う場合、それ自体は開発にしか使わないものなので `devDependencies` に入れたくなりますが、そのままだとnodejs buildpackが `dependencies` しかインストールしないので上手く行きません。

一つの回避方法は全部 `dependencies` に入れてしまうことですが、気持ちが悪いので変わりに `NPM_CONFIG_PRODUCTION=false` 環境変数を設定します。

```
heroku config:set NPM_CONFIG_PRODUCTION=false
```

これで `devDependencies` と `dependencies` の両方がインストールされるようになります。

# postinstallで全てビルドする

nodejs buildpackを使っているとgit-push時に自動的に `npm install` が走ります。その後で `heroku run gulp build` とすることを考えましたが、ビルド結果が永続化されず参照エラーになりました。`heroku run` でファイルを書き出しても消えちゃうんですかね？Heroku弱者なのでよく分かりません。

この問題を回避するには全てを `npm install` で生成すればいいということなので `postinstall` scriptで全てビルドするようにしました。

```js:package.json
{
  "scripts": {
    "postinstall": "node_modules/.bin/bower install && node_modules/.bin/gulp build"
  }
}
```

`bower install` していますが、これだけだと bower_components ディレクトリ以下が永続化されません。

# ファイルを吐き出すディレクトリは全て cacheDirectories に追加する

`cacheDirectories` に指定していないディレクトリに生成したファイルは `npm install` 中だろうと消えてしまいます :expressionless: 

```js:package.json
{
  "cacheDirectories": [
    "bower_components",
    "node_modules"
  ]
}
```

# まとめ

そういう感じで設定をちゃんとすると、Heroku上でgulpでビルドしたものを使うことができるようになります。
VimでのBOMの取り扱い

# BOM付きファイルの確認
VimでBOM付きファイルを開いても一見BOMが付いているのかそうでないのかわからない。
VimでBOMを確認するには以下のコマンドを使う。

```
:set bomb?

> bomb
> nobomb
```

BOMを付けたいときは

```
:set bomb
```

逆にBOMを取りたいときは

```
:set nobomb
```
DjangoのAdmin(管理サイト)でManyToManyFieldを使いたいときの方法

admin.pyのlist_displayにManyToManyFieldのカラムを指定すると、以下のようなエラーが出ました。

```py
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
<class 'proj.admin.ArticleAdmin'>: (admin.E109) The value of 'list_display[2]' must not be a ManyToManyField.
```

あるレコードに対して、ManyToManyFieldで紐付いた別テーブルのデータを管理サイトで一覧表示できると便利そうだと思ったのですが、エラーメッセージによると指定できない仕様のようです。

ただ、以下のようにしてやることで実現可能でしたので、やり方を記録しておきます。

## やりたい事

はてなブックマークのように、ドキュメントに対してメタデータが付与される例を想定してください。

![イメージ図](https://qiita-image-store.s3.amazonaws.com/0/27019/39ffb741-7e88-f594-3843-e72c69dcc8fc.png)

## 対応方法

Author(著者)、Article(記事)、Tag(メタデータ)の3つがあるとします。

Article.metaがManyToManyFieldになっており、リレーション先としてTagを指定しています。

### models.py

```py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

class Article(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey('Author', blank=True, null=True)
    meta = models.ManyToManyField('Tag')

    def __unicode__(self):
        return self.title

class Tag(models.Model):
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name
```

### admin.py

_metaのような任意の名前の関数を定義してやり、list_displayに該当の関数名を指定してやると、先で示した図のようにコンマ区切りで紐付いたデータを一覧表示することができました。

```py
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', '_meta')

    def	_meta(self, row):
        return ','.join([x.name for x in row.meta.all()])

admin.site.register(Article, ArticleAdmin)
```

## 参考資料

* http://stackoverflow.com/questions/18108521/many-to-many-in-list-display-django
【ONTAP】sysstatコマンドでNetApp全体の負荷状況が確認できる


NetAppにおける負荷の状況を確認するData ONTAPコマンドとして `sysstat` というコマンドがあります。（SSHログインにて利用できる）

いろいろとオプションはあるようですが、とりあえず **-u** を見ていればある程度の状況は把握できるかなと思います。　ちなみに **-x** オプションだと全て表示してくれますが読みづらい‥。

```bash
nas1> sysstat -u 3
 CPU   Total     Net   kB/s    Disk   kB/s    Tape   kB/s  Cache  Cache    CP  CP  Disk
       ops/s      in    out    read  write    read  write    age    hit  time  ty  util
  1%      92     716     26      97      3       0      0     0s   100%    0%  T     1%
  1%      12     100     27     841   2088       0      0     0s    98%    9%  :     3%
  0%      24     101     12       7      0       0      0     0s    98%    0%  -     0%
  1%      15     193      8       9      0       0      0     0s   100%    0%  -     1%
  1%      31      68     55     675   1076       0      0     0s   100%    7%  T     3%
  ```

それぞれの項目は下記の通りです。

|項目名|内容|
|-----------|------------|
|CPU|CPUが使用されていた時間の割合。|
|Total ops/s|1秒間あたりの合計（NFS+CIFS+HTTP）処理数。|
|Net kB/s|送受信したネットワークトラフィック。|
|Disk kB/s|読み取り、書き込みされたディスクトラフィック。|
|Tape kB/s|読み取り、書き込みされたテープトラフィック。|
|Cache age|バッファから最後にデータが削除されてからの経過時間。|
|Cache hit|キャッシュヒット率。|
|CP time|CP処理(RANからDiskに書き込まれる処理）の割合。|
|CP ty|CPの種類。例えば《T》はタイマーによる定期実行処理。（デフォルト10秒に1回）|
|Disk util|アクセス率が最も高かったディスクの利用率。|

ちなみに。
CPの割合が多いとRAM不足もしくは書き込み先Diskの問題が考えれます。
ffmpeg ビルド（decklinkを有効に）　on centOS7

linuxのFFMPEGはバイナリーが無いようなのでソースから
ビルドを行う

前準備）
　decklinkを有効にする為には、https://www.blackmagicdesign.com/jp/support から
　SDKをダウンロードしておく。
　その中にLinuxというディレクトリがあるので適当な場所においておきます①



https://github.com/FFmpeg/FFmpegからZIPファイルをダウンロード

展開して、展開したディレクトリをカレントにして

./configure --enable-gpl --enable-nonfree --enable-decklink --extra-ldflags=-L/home/master/decklink_Linux/include --extra-cflags=-I/home/master/decklink_Linux/include --extra-libs=-ldl

--extra-ldflags=-L[①のパス]、--extra-cflags=-I[①のパス]にします

これだけだと、h264とかいろいろ使えませんが今回はXDCAMhd422をターゲットにしているので
別に構わないこととします（XDCAMHD422はMPEG2ですので・・）

sudo make

sudo make install

でインストール完了。

と思ったら、ffplayが使えません。

SDLが必要との事らしいので
https://www.libsdl.org/download-1.2.phpから

・SDL-1.2.15-1.x86_64.rpm
・SDL-devel-1.2.15-1.x86_64.rpm

をダウンロードしてインストール

一旦ffmpegをアンインストールしなくてはいけないけどyumでは出来なかった
調べたら自分でmakeしたときはmakefileがあるので

sudo make unintallで消せるそうです

再度

sudo make

sudo make install

ffmpeg -list_devices 1 -f decklink -i dummy

と打って、自分がセットしたボードの名称が出てこればffmpegで
制御可能となります

次回は、FFMPEGを使ってキャプチャーをしたいと思います
iOS 9 の LSApplicationQueriesSchemes の落とし穴

## 事象
下記のように Info.plist に記述するも期待通りの動作とならない。
LSApplicationQueriesSchemes (Array)
┗ urlscheme:// (String)

## 解決策
**誤**
┗ urlscheme:// (String)

**正**
┗ urlscheme (String)

**://** は不要なようです。
参考記事を見ると :// まで書いている物が多く数分ハマった。
TwilioAPI勉強会向けDataSpiderハンズオン情報

※この記事は、以下の勉強会のハンズオン情報をまとめたものです。
https://twiliomeetup.doorkeeper.jp/events/31268

Twilioのハンズオン情報は[こちら](http://qiita.com/joohounsong/items/950cba868bea61c5777f)

#ハンズオンシナリオ
DataSpiderを利用してTwilioのAPIをノンプログラミングでコールし電話をかけます。

イメージ図
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/95102/5a64bcd9-3b77-c30b-9177-d6862705fe0b.jpeg)


#DataSpiderの機能紹介
* DataSpider Server  
DataSpiderの処理を実行するサーバーエンジンです。DataSpiderを利用するためには必ず起動しておく必要があります。
* DataSpider Studio  
DataSpiderの処理を作成するクライアント・アプリケーションです。インストールして利用するものとWebブラウザで利用するものと2つのStudioがあります。ハンズオンではWeb版のStudioを利用します。
* アダプタ  
DataSpiderにおいて外部システムとのインターフェイスを担う機能です。各外部システムごとにアダプタが用意されています。また、アダプタによって実行可能な機能に差があります。
* グローバルリソース  
アダプタが利用する接続先の設定です。この設定はプロジェクトをまたいで利用することが可能です。
* トリガー  
DataSpiderの処理を何かしらのきっかけを用いて自動実行する仕組みです。
* コントロールパネル  
DataSpiderの各種設定をGUIで行うことのできる設定パネルです。

#DataSpiderの使い方
###DataSpiderの処理の概念
DataSpiderの処理の最小単位はスクリプトです。スクリプトは複数のアダプタやその他制御アイコンによって形成されます。連携処理一本がスクリプト一つとお考えください。そのスクリプトの集合体がプロジェクトです。プロジェクトの中に複数スクリプトを作成することができます。
###スクリプトの作り方
DataSpider Studio内にあるデザイナというツールを利用します。デザイナを開くと**キャンバス**と**ツールパレット**が表示されますので、ツールパレットより処理を行いたいアダプタのアイコンをキャンバスに貼り付けて処理を作成します。最後にStratアイコンからEndアイコンまでドラッグ＆ドロップで線を引いて完成です。
###Mapperの使い方
スクリプト内でデータの構造や値の変換を行いたい時には**Mapper**というツールを利用します。入力と出力の処理をそれぞれ作りその間にMapperを作成すると、左側に入力元、右側に出力先のデータの構造が表示されます。それぞれの項目をドラッグ＆ドロップでマッピングすることでデータの構造の変換が可能です。また、ツールパレットがMapper用のものに切り替わってきますので、その中に含まれる関数アイコン(ロジックアイコンと呼びます)をマッピングの間に挟むことで、データそのものの加工や変換が可能です。

#接続情報

#ハンズオン手順
1.[新しいプロジェクト]をクリックしてプロジェクトを作成します。一緒にスクリプトも作成できます。
2.右側のツールパレットから[クラウド][Twilio]を開きます。
3.その中にある[通話]のアイコンをキャンバスに向かってドラッグ＆ドロップします。
4.接続先をクリックして新規に接続先を作成します。
  アカウントID、認証トークンはそれぞれTwilioの設定画面のアカウント情報から確認できます。
5.From、To、TwiML URLを設定します。
6.Startアイコン、通話のアイコン、Endアイコンと線を引きます。
7.実行ボタンを押下してスクリプトを実行します。

#リンク
* http://dataspider.appresso.com/
* http://dstn.appresso.com/
【jQuery】フォーム部品のリセット初期値を変更する（まとめ）

[【jQuery】\<input type="reset"\>（リセットボタン）でリセットされる初期値を変更する](http://qiita.com/Ryoto20707/items/f5ef6402cd8fb2ea2ee2 "Qiita")
で紹介した方法がテキストボックス(`<input type="text">`)にしか通用しないので、今回は各フォーム部品の初期値リセット方法を設定する方法をまとめます

#コード・動作について
jQuery 1.11.2で動作確認
フォーム部品のセレクタ(`"input[name='xxx']"`, `"#id"`など)は`selector`としています。
各スクリプトは、汎用性を高めるために関数にしました。
今回は前述のリンク記事で使用した、**現在の入力（選択）値**をリセット初期値にする方法を紹介します。
任意の値にする際は各サンプルコード下の記述を参照してください。

###リセット初期値
`<input type="reset">`で表示されるリセットボタンを押すとフォームがリセットされます。
ただしこの場合の「リセット」とはHTMLを読み込んだ際にあらかじめ表示されている値（`value=""`, `checked`など）であり、その初期値がもう一度設定されます（全消去ではありません）。
この初期値を書き換えていきます。

#テキストボックス(`<input type="text">`)
```js:textbox.js
function setTextboxValue(selector){
    $(selector).attr("value", $(selector).val());
}
```

###任意の値にするには
`$(selector).val`を任意の文字列に変換するか、第二引数を設定してください。

#テキストエリア(`<textarea>`)
```js:textarea.js
function setTextareaValue(selector){
    $(selector).text($(selector).val());
}
```

###任意の値にするには
`$(selector).val`を任意の文字列に変換するか、第二引数を設定してください。

#セレクトボックス(`<select>`)
##単一選択

```js:select_single.js
function setSelectValue(selector){
    var value = $(selector).val();
    $(selector + ' option').removeAttr('selected');
    $(selector + ' option[value="'+value+'"]').attr('selected','selected');
}
```
###任意の値にするには
`value`を任意の文字列に変換するか、第二引数を設定してください。
設定した値が選択肢に含まれているかの判定処理、エラー処理を追加することを推奨します。

##複数選択(`<select multiple="multiple">`)
```js:select_multiple.js
function setSelectValues(selector){
    var values = $(selector).val();
    $(selector + ' option').removeAttr('selected');
    $.each(values, function(){
        $(selector + ' option[value="'+this+'"]').attr('selected','selected');
    });
}
```
###任意の値にするには
`values`を任意の**文字列の配列**に変換するか、第二引数（配列）を設定してください。
設定した値が選択肢に含まれているかの判定処理、エラー処理を追加することを推奨します。

##両方に対応させる
必要なら[$.isArray](http://semooh.jp/jquery/api/utilities/jQuery.isArray/obj/ "jQuery日本語リファレンス")を使って条件分岐しながら一つの関数にするのも良さそうですね。

#ラジオボタン(`<input type="radio">`)
```js:radio.js
function setRadioValue(selector){
    var value = $(selector+':checked').val();
    $(selector).removeAttr('checked');
    $(selector + '[value="'+value+'"]').attr('checked','checked');
}
```
###任意の値にするには
`value`を任意の文字列に変換するか、第二引数を設定してください。
設定した値が選択肢に含まれているかの判定処理、エラー処理を追加することを推奨します。

#チェックボックス(`<input type="checkbox">`)
```js:checkbox.js
function setCheckboxValues(selector){
    var values = $(selector+':checked').map(function() {
        return $(this).val();
    }).get();
    $(selector).removeAttr('checked');
    $.each(values, function(){
        $(selector + '[value="'+this+'"]').attr('checked','checked');
    });
}
```
###任意の値にするには
`values`を任意の**文字列の配列**に変換するか、第二引数（配列）を設定してください。
設定した値が選択肢に含まれているかの判定処理、エラー処理を追加することを推奨します。

#参考記事
[【jQuery】フォーム部品の取得・設定まとめ](http://qiita.com/kazu56/items/36b025dac5802b76715c "Qiita")
El Capitanで Emacs-24.5 をビルドして動かす

Yosemite から El Capitan に移行すると Emacs.app が起動しなくなったので、動かすためにやった手順を。

といっても、ほとんど[この記事](http://qiita.com/scalper/items/b7d81beb8fbaada3ce5f)で書いた通り。

# 環境

* OSX 10.11.4
* Xcode 7.3.1

# ビルド、インストール

```shell-session
cd ~/src/emacs
curl -LO http://ftp.gnu.org/pub/gnu/emacs/emacs-24.5.tar.xz
curl -LO ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-24.5-mac-5.17.tar.gz
tar Jxvf emacs-24.5.tar.xz
tar zxvf emacs-24.5-mac-5.17.tar.gz
cd emacs-24.5
patch -p1 < ../emacs-24.5-mac-5.17/patch-mac
cp -R ../emacs-24.5-mac-5.17/mac mac
cp ../emacs-24.5-mac-5.17/src/* src
cp ../emacs-24.5-mac-5.17/lisp/term/mac-win.el lisp/term
cp nextstep/Cocoa/Emacs.base/Contents/Resources/Emacs.icns mac/Emacs.app/Contents/Resources/Emacs.icns
./configure --with-mac --without-x
make 
make install
cp -R mac/Emacs.app /Applications/Emacs.app
cd ..
curl -LO http://emacsformacosx.com/emacs-builds/Emacs-24.5-universal.dmg
open Emacs-24.5-universal.dmg
cp -R /Volumes/Emacs/Emacs.app/Contents/MacOS/bin-x86_64-10_9 /Applications/Emacs.app/Contents/MacOS/bin
umount /Volumes/Emacs
```

## 補足

make の時点で、 libxml/tree.h が見つからないエラーが出る人は、

```shell-session
xcode-select --install
```

やっておけば良い。 （もちろん Xcode がインストールされていることが必要）

Xcode は普段使いなので、指摘されて初めて気づいた...

# 更新履歴

* 2015.5.9
  * 10.11.4 でビルドしなおしたついでに環境、emacs-mac patch のバージョン更新
  * patch のオプション修正
* 2015.5.10
  * make 時のエラーについて追記
[詳解付き][Rails][Webサービス]デプロイで失敗した事象と解決まで

# webサービスにデプロイ自動化は不可欠。
リリースする際のデプロイ自動化は不可欠なのですが、アプリケーションとは関係のない所でデプロイ失敗が起きることも多々あります。
今回はCapistranoを実行した際にエラーとなり、リリース出来ないという事象が発生しました。
その時のメモになります。
エラーは違うが事象はどちらも同じ。

# エラー内容

## エラー文言


```
fatal: Could not parse object 'b4a8856aa30e9394049efc1359e69d6b91dfb662'.
```

## 解決方法
デプロイ先のサーバーに入って以下のコマンドを実行
(デプロイ先を確認すること。webサーバー以外にもDBサーバーやproxyサーバーもデプロイ先対象であればそちらにもログインして以下のコマンドを実行する。)

```

$ cd [デプロイ先のパス]/shared
$ rm -rf cached-copy/

```

# エラー内容

## エラー文言


```

fatal: reference is not a tree: b4a8856aa30e9394049efc1359e69d6b91dfb662
 
```


## 解決方法

**対応方法**

「config/deploy/production.rb」に対して、以下の部分をコメントアウト
(検証環境、staging環境へのデプロイの場合は「production.rb」部分が「preview.rb」や「staging.rb」などになる。)

**変更前**

```
set :git_shallow_clone, 1
```

**変更後**
コメント部分に理由まで書いてあると後から見直しやすい

```
# capistranoエラー回避のためコメントアウト
# set :git_shallow_clone, 1
```
slick.jsでdotsやprevious,nextのボタンがうまく表示されない(備忘録)

# 少し自分のことを
現在、大学４年生であり、未熟ながらも研究ではjavascriptに触れている事があるため、学んだことを備忘録として残しておこうと思い書いています。
ご指摘やアドバイス等頂けると大変ありがたいです。

# 本題
slick.jsを利用してカルーセルの表示をしようとした際にボタンの表示がうまくいきませんでした。
![qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/78155/9c6b0146-2e2d-4191-a216-e8452b663606.png)

原因を探ったところこちらの記事に書いてありました。
[レスポンシブ対応のカルーセルJQプラグインslickの使い方](http://singoro.net/note/jq-slick/)

今回の原因は、
**slick-theme.cssのファイルがなかったため。**

# なぜ起きたか
slick.jsのダウンロードの際に公式サイトの「Download Now」の方をダウンロードしたため。
そちらのフォルダにはslick-theme.cssのファイルがなかった。
あと、**初歩的すぎて中々情報がなかったかもしれない。**

# どうすれば良いか
slick.jsの「View On Github」からGithubにとんで、そちらでダウンロードする。
もしくは、slick/slick-theme.css をコピペする。

後は外部ファイルのリンク付けを行えば大丈夫なはずです。

# 最後に
今回のようなことは恐らく初心者が陥ることが割りと多いのではないかと感じた。
僕自身が初心者だからこそ初心者視点でつまずきそうなところを記事にしていこうと決意した最初の記事でした。
Code Climateで特定ファイルを解析対象から除外する

Node.jsでとあるサービスのSDKを書いた際に、browserifyしたファイルをリポジトリに入れたらCode ClimateのGPAが大変なことになったので、特定ファイルを解析から除外する方法を調べてみました。

（ちなみに）
とあるサービス→[ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)
リポジトリ→[NIFTYCloud-mbaas/ncmb_js](https://github.com/NIFTYCloud-mbaas/ncmb_js)

![cc_before.png](https://qiita-image-store.s3.amazonaws.com/0/79789/008673e1-5b0d-f2d8-1a5a-4089045078a5.png)
全体が2000行程度のSDKなのにbrowserifyした生成物は24810行で評価F（0点換算）…。GPAも0.2まで低下。

# 設定ファイルの作成

Code Climate自体は設定ファイルなしでも利用可能ですが、詳細設定を.codeclimate.ymlに記述することができます。
今回は「ncmb.min.js」を解析から除外したいので、以下のようにexclude_pathsに該当ファイルを記述します。

.codeclimate.yml

```
languages:
  JavaScript: true
exclude_paths:
- "ncmb.min.js"
```

その後.codeclimate.ymlを追加してプッシュすれば、設定が反映されていることが確認できます。
↓
指定したファイルが除外されてGPAもまともな値に回復しました！
![cc_after.png](https://qiita-image-store.s3.amazonaws.com/0/79789/ee98c196-2bf2-4e46-02f2-ac9ded7f87f7.png)

また、正規表現でディレクトリごと除外するような設定ももちろん可能です。
その他設定ファイルの使い方は公式ドキュメント（英語）に記述があるので、そちらを確認してみてください。
[Using a .codeclimate.yml File](http://docs.codeclimate.com/article/289-configuring-your-repository-via-codeclimate-yml)

以上です。

--
今回の内容を実践したリポジトリはこちら
[NIFTYCloud-mbaas/ncmb_js](https://github.com/NIFTYCloud-mbaas/ncmb_js)
↑のSDKを利用するサービスの宣伝
[ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)
Rubyの'aws-sdk'の使い方が変わってた。

## RubyからS3へファイルをアップロードする

文献を漁ると`AWS::S3.new`とか書かれている記事が多いですが、[本家のサイト](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UploadObjSingleOpRuby.html)を見るとどうやら違う模様。

はまったのでメモ。

## gem
これは変わらず。

```rb:Gemfile
gem 'aws-sdk'
```

Gemfile.lockはこんな感じ。

```rb:Gemfile.lock
    aws-sdk (2.1.24)
      aws-sdk-resources (= 2.1.24)
    aws-sdk-core (2.1.24)
      jmespath (~> 1.0)
    aws-sdk-resources (2.1.24)
      aws-sdk-core (= 2.1.24)
```

## 使い方
こんなイメージ

```rb
require 'aws-sdk'

s3 = Aws::S3::Resource.new(access_key_id: "ACCESS_KEY_ID",
                      secret_access_key:  "SECRET_ACCESS_KEY",
                      region: "REGION")
obj = s3.bucket("BUCKET_NAME").object("PATH")

# string data
obj.put(body: 'Hello World!')

# IO object
File.open('source', 'rb') do |file|
  obj.put(body: file)
end
```

`AWS`が`Aws`のアッパーキャメルケースになってた・・・。
msbuild 自分用バッチ

コミット前にこれ叩く

```mybuild.cmd
%windir%\microsoft.net\framework\v4.0.30319\msbuild /m your_solution_name_goes_here.sln /p:Configuration=Debug "/p:Platform=Any CPU"
@IF %ERRORLEVEL% NEQ 0 GOTO err
@exit /B 0
:err
@PAUSE
@exit /B 1
Q:レガシーだからPEARをインストールして欲しい A:Composerでやれば簡単だよの件です。

# これは何？
さっき聞かれたPEARをComposerでインストールする件です。
たまーに質問されるので書いた。
ご参考までに。

# Composerのインストール
https://getcomposer.org/doc/00-intro.md
上記のInstrationを参考にしてください。

## 必要なパッケージをcomposer.jsonに定義
pear package x3をインストールするサンプルです。
どのPEARがどのpackageなのかは、https://packagist.org/ で探すといいよ。

```bash:composer.json
{
    "require": {
        "pear-pear.php.net/mail_mime" : "*",
        "pear-pear.php.net/http_request2" : "*",
        "pear-pear.php.net/mail_mimedecode" : "*"
    },
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.php.net"
        }
    ]
}
```

# 必要なパッケージをインストール
composer install

# インストール後
インストールされたファイルはvendorディレクトリ以下に入ります。
残念ながら、PEARパッケージはPSR-0,4に対応していないので、vendor/autoload.phpをrequireしてもオートロードされません。
中のPEARパッケージにパスを通すorパスが通っている場所にファイルを移すなど、必要に応じて対応してあげてください。
SQLで特定の文字以外の条件でNULLのレコードが取得されない

DB2で特定のカラムから特定の文字以外を取得する場合、
NULLのレコードが取得されずにハマったので備忘録

下記の様なテーブルがあった場合
<pre>
col1
-------　
A
null
B
C
</pre>

A以外を取得する場合
<pre> SELECT col1 FROM table1 WHERE col1 <> 'A' </pre>
上記のsqlを実行した結果、col1がBとCのレコードが取得されたが、nullのレコードは取得されない。

nullのレコードも必要な場合は条件に IS NULL も付ける必要がある。
<pre> SELECT col1 FROM table1 WHERE col1 <> 'A' OR col1 IS NULL</pre>

in句を使用する場合も同様に IS NULL を付ける必要がある。
<pre> SELECT col1 FROM table1 WHERE col1 NOT IN ('A','B') OR col1 IS NULL</pre>
devise-i18n-views

# [mcasimir/devise-i18n-views](https://github.com/mcasimir/devise-i18n-views)
[mcasimir/devise-i18n-views](https://github.com/mcasimir/devise-i18n-views)について

## I18n用YAMLが自動でロードされる
該当ソース部分
[devise-i18n-views/devise-i18n-views.rb at 789d3e980527fca07ff1c526e764be7f61a4559e · mcasimir/devise-i18n-views](https://github.com/mcasimir/devise-i18n-views/blob/789d3e980527fca07ff1c526e764be7f61a4559e/lib/devise-i18n-views.rb)

```
      DeviseI18nViews::Railtie.instance_eval do
        pattern = pattern_from app.config.i18n.available_locales

        files = Dir[File.join(File.dirname(__FILE__), '../locales', "#{pattern}.yml")]
        I18n.load_path.concat(files)
      end  
```

## I18n.load_pathの優先順位ってどうなってるん？
調査中

### そもそも
application.rbではこうなっている。

```
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```

```
0> config.i18n.class
=> ActiveSupport::OrderedOptions
```
え！`ActiveSupport::OrderedOptions`ってなに？

[ActiveSupport::OrderedOptionsを使ってHashで.(ドット)を使えるようにする٩( ‘ω’ )و - Murajun's Style](http://murajun1978.hatenadiary.com/entry/2015/03/23/223551)

(ﾟдﾟ)！Hashをドットで？　それJavaScriptやん！？

まあ、驚きはあったけど、Hashがドットでアクセスできようが、そうじゃなかろうが、今はどうでもよくて知りたいのは優先順位。

`config.i18n`はまあ結局`Hash`なので、

```
{:railties_load_path=>[], :load_path=>[...], :fallbacks=>{}}
```
という構造になっていることを確認。

## I18n.load_path　と　config.i18n.load_pathは何が違うんや？
[mcasimir/devise-i18n-views](https://github.com/mcasimir/devise-i18n-views)
はYAMLファイルのパスの登録に、`I18n.load_path`を使ってるがな。どないなってますのん。まいった。

優先順位のヒントぽいもの
[tail -f pinzo.log: Redmineのプラグインで既存の文言を上書きする](http://blog.mkt-sys.jp/2013/12/redmine-message-override-by-plugin.html)
（`railties_load_path`だから関係ないかも？）
【Minecraft PE】ModPE Scriptsを使ったModの作り方をまとめてみた（２）〜用語編〜

[前回の投稿](http://qiita.com/ttsuzo/items/dbe9760e85d6bca7ef97)でModPE ScriptのHello Worldをやりましたので、今回はModPE Scriptで提供されているAPIで使われている用語を、僕が理解している範囲でまとめてみます。

ではさっそく

- **Item**
    - アイテムです。手に持ったりチェスト等に入った状態のものを言います。
    - Blockとは違うようなので注意です。
    - 例）function useItem() -> Itemを使った時に呼ばれるイベント
- **Block**
    - ブロックです。すでにフィールド上に置かれた状態のものを差します。
    - 上記の通りItemとは違う概念で、例えば同じ「水」でも、手に持っているバケツの状態とフィールド上にすでに流れている状態でIDが違うものがいます。
    - 丸石等、BlockアイテムはItemとしてもBlockとしても同じIDを持っているようです。
- **Level**
    - エンチャント等で使うレベルではなく、「ワールド」を指す言葉のようです。紛らわしい。。。
    - 例）function newLevel() -> ワールドを開始した時に発火されるイベント
- **Entity**
    - Mob、プレイヤー等を指します。
    - 例）function Entity.remove() -> 指定されたMobをワールド上から消す関数
- **Tile**
    - ワールド上のブロックのことを指します。
    - 例）function getTile() -> 指定された座標のブロックIDを取得する関数。
- **ModPEクラスのData**
    - key-value形式で保存される文字列データ
    - 例）function readData() -> 与えられたKeyで保存されている文字列を取得する関数
- **Pitch/Yaw**
    - Entityが向いている方向を表します。
    - Pitchが上下、Yawが左右の角度をint型で表します。

ひとまずぱっと見でわかりづらい、実装していてハマりがちなのはこのあたりでした。
不足している単語や誤りがあればご指摘ください。
マルチ解像度対応 Drawableリソースの設置場所

Androidにはdrawable-xxxxxというディレクトリに解像度ごとの画像を用意することでマルチ解像度対応する機能があります。
各Drawableフォルダに設置する解像度の目安を記録します。
※ユーザーエージェントを解析し、自動で画面解像度に応じたイメージをロードします。
※API4.2からmipmapで同様の対応ができます。

#Drawable別 対応解像度＆端末情報
※モバイルは解像度によりフォルダが判別できますが、タブレットは解像度ではなく機種によるようですので注意してください。
###モバイル
■drawable-ldpi
解像度：240×320
代表的な端末：不明

■drawable-mdpi
解像度：320×480
代表的な端末：不明

■drawable-hdpi
解像度：480×800, 540×960
代表的な端末：不明

■drawable-xhdpi
解像度：720×1280
代表的な端末：Samsung S3, Micromax Canvas HD

■drawable-xxhdpi
解像度：1080×1920
代表的な端末：Samsung S4, HTC one, Nexus5

■drawable-xxxhdpi
解像度：1440×2560
代表的な端末：Nexus6, Samsung S6edge

***

###タブレット
■Galaxy Mega
インチ：6.3
解像度：1280×720
フォルダ：hdpi

■Kindle Fire HD
インチ：7
解像度：1280×800
フォルダ：hdpi

■Galaxy Mega
インチ：5.8
解像度：960×540
フォルダ：tvdpi

■Sony Xperia Z Ultra
インチ：6.4
解像度：1920×1080
フォルダ：xhdpi

■Kindle Fire(1st & 2nd gen)
インチ：7
解像度：1024×600
フォルダ：mdpi

■Nexus7 (1st gen/2012)
インチ：7
解像度：1280×800
フォルダ：tvdpi

■Nexus7 (2st gen/2013)
インチ：7
解像度：1824×1200
フォルダ：xhdpi

■Kindle Fire HDX
インチ：7
解像度：1920×1200
フォルダ：xhdpi

■Kindle Fire HD
インチ：8.9
解像度：1920×1200
フォルダ：hdpi

■Kindle Fire HDX
インチ：8.9
解像度：2560×1600
フォルダ：xhdpi

■Galaxy Tab 2
インチ：10
解像度：1280×800
フォルダ：mdpi

■Galaxy Tab 3
インチ：10
解像度：1280×800
フォルダ：mdpi

■ASUS Transformer
インチ：10
解像度：1280×800
フォルダ：mdpi

■ASUS Transformer2
インチ：10
解像度：1920×1200
フォルダ：hdpi

■Nexus10
インチ：10
解像度：2560×1600
フォルダ：xhdpi

■Galaxy Note 10.1
インチ：10
解像度：2560×1600
フォルダ：xhdpi

#参考資料
こちらが大変参考になりました。
http://stackoverflow.com/questions/16706076/drawable-folder-for-different-resolution-and-application-icon-size
ITMS-90339 エラーの対処方法


Xcode7でビルドし、iTCにバイナリをuploadした際に、ITMS-90339エラーがでてしまった場合の対処方法です。

## 発生条件(推測)

* 昔からあるプロジェクト
* OSSなどでbundleファイルがある場合

## 対処方法

1. Build Settings を開く
2. Code Signing Resource Rule Path を探す
3. `$(SDKROOT)/ResourceRules.plist` が入っていると思うので、削除する。
ITMS-90535 エラーの対処方法


Xcode7でビルドし、iTCにバイナリをuploadした際に、ITMS-90535エラーがでてしまった場合の対処方法です。

## 発生条件(推測)

* 使用しているOSSなどでbundleファイルが内包されている場合

## 一時的な対処方法

1. エラーに関連するbundleファイルを探す
2. bundleファイル内にあるInfo.plistを開く
3. `CFBundleExecutable`(Executable file)を削除
4. `CFBundlePackageType`(Bundle OS Type code)を`BNDL`に変更

## 本来の対処方法

エラーに関連するライブラリ側で対処してもらう。
Debianでタッチパネルのキャリブレーション

RaspbianでマレーシアのChalkboard Electronics製7インチタッチパネル液晶を使った時のメモ。
つかっているタッチパネル付液晶は[こちら](http://www.chalk-elec.com/?page_id=1280#!/7-open-frame-universal-HDMI-LCD-with-capacitive-multi-touch/p/21750207/category=3094861)のもの。
##基本
基本的には
`xinput_calibrator`を使ってキャリブレーションします。
ない場合は`apt-get`でインストールしましょう。

__シェル__から実行すると、
キャリブレーション用の画面が表示されるので、画面にしたがって点をタッチしましょう。

```shell-session:Bash
$ xinput_calibrator

Warning: multiple calibratable devices found, calibrating last one (Chalkboard Electronics HID Touchscreen)
	use --device to select another one.
Calibrating EVDEV driver for "Chalkboard Electronics HID Touchscreen" id=7
	current calibration values (from XInput): min_x=4, max_x=1200 and min_y=800, max_y=-1

Doing dynamic recalibration:
	Setting new calibration data: 8, 1268, 793, 1


--> Making the calibration permanent <--
  copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf'
Section "InputClass"
	Identifier	"calibration"
	MatchProduct	"Chalkboard Electronics HID Touchscreen"
	Option	"Calibration"	"8 1268 793 1"
EndSection

```

すると、こんな感じで設定がシェルに書きだされます。
これをxorgの設定ファイルに書き込む必要があります。
##設定ファイルの書き込み

シェル上では、`/etc/X11/xorg.conf.d/99-calibration.conf`に書き込めと出ていますが、 __これは間違いです__。

__Debian/Ubuntuでは、`/usr/share/X11/xorg.conf.d/99-calibiration.conf`の一番下の行に追加します。__
ファイルがなければ作成しましょう。

こんな感じで。

```/usr/share/X11/xorg.conf.d/99-calibiration.conf
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "Chalkboard Electronics HID Touchscreen"
        Option  "Calibration"   "4 1200 800 -1"
        Option  "SwapAxes"      "1"
EndSection
```
` "SwapAxes"`は画面を回転させて使っている時、軸の方向あわなくなる場合に使用します。
xinput-calibrationの出力で自動的に付与される場合もあります。

##キャリブレーションがうまくいかない場合
そもそもキャリブレーション時に画面の外にカーソルが行ってしまうような状態だと、うまくキャリブレーションができない場合があります。
その場合は、一度上記の設定ファイル`/usr/share/X11/xorg.conf.d/99-calibiration.conf`に書きこんだあと、
`Option  "Calibration"`の値を手動で変更して、画面のどこを触ってもカーソルが画面の外にいかないように調整します。

設定した値を反映するには、KDEを使用している場合

```console:bash
$ sudo killall lightdm
$ sudo service lightdm start
```
これで、xを再起動すると、値が反映されます。
なぜか`service lightdm restart`ではダメで、一度lightdmをkillしないと再起動できませんでした。

カーソルが常に画面内に表示されたら、もう一度`xinput_calibrator`を実行して上記の手順を行いましょう。

##補足
どうやら、x.orgの[ドキュメント](http://www.x.org/archive/X11R7.5/doc/man/man4/evdev.4.html)を読むと、`Option "Calibration"`の値は、それぞれ _min-x, max-x, min-y, max-y_らしいので、それぞれを解像度に合わせて設定してあげれば大丈夫...?
ちなみに、Chalkboard-electroncisの7インチ1280x800液晶を+90度回転して使うときの設定は、

```
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "Chalkboard Electronics HID Touchscreen"
        Option  "Calibration"   "0 1280 800 0"
        Option  "SwapAxes"      "1"
EndSection
```

###追記
あれ、、、`xinput-calibrator`は`apt-get`じゃはいらない...?
http://engineering-diy.blogspot.co.uk/2013/01/adding-7inch-display-with-touchscreen.html
production.cssの変更内容を確認する方法

# Before

圧縮されたCSSの変更内容を確認したいことってよくありますよね。
でも、`diff`コマンドなどで比較しても、次のように無駄な部分が多く、どこが変更されたのかわかりません。

```shell-session
$ diff -u /tmp/base.css /tmp/head.css
--- /tmp/base.css       2015-10-01 12:08:16.170860000 +0900
+++ /tmp/head.css       2015-10-01 12:08:23.834860000 +0900
@@ -1 +1 @@
-html{font-family:sans-serif;-webkit-text-size-adjust:none}body{margin:0;padding:0;color:#333;background:#FFF;font-size:12px;font-family:sans-serif}abbr,address,article,aside,audio,b,blockquote,caption,cite,code,dd,del,dfn,dialog,div,dl,dt,em,fieldset,figure,footer,form,h1,h2,h3,h4,h5,h6,hea（省略）
+html{font-family:sans-serif;-webkit-text-size-adjust:none}body{margin:0;padding:0;color:#333;background:#FFF;font-size:12px;font-family:sans-serif}abbr,address,article,aside,audio,b,blockquote,caption,cite,code,dd,del,dfn,dialog,div,dl,dt,em,fieldset,figure,footer,form,h1,h2,h3,h4,h5,h6,hea（省略）
```

# After

そこで、ちょっとした工夫をしてみましょう。
同じ `diff` コマンドでも、下のように変更箇所がはっきりわかるようになります。

```shell-session
$ diff -u /tmp/base.pretty.css /tmp/head.pretty.css
--- /tmp/base.pretty.css        2015-10-01 12:09:46.178860000 +0900
+++ /tmp/head.pretty.css        2015-10-01 12:09:54.925860000 +0900
@@ -1026,7 +1026,7 @@

 @font-face {
     font-family: mixiIcon;
-    src: url(/static/fonts/icons/mixiIcon.eot?md5-by-cache-buster=6c0bbe4e29cc7106c21dc63d435ba599)
+    src: url(/static/fonts/icons/mixiIcon.eot?md5-by-cache-buster=e974b5a966dc1df146c49cc2f9596aac)
 }

 #page {
```

fontファイルの部分だけが変更されたことがすぐにわかるようになりました。


# やり方
## CSSの整形ツールをインストール

CSSの整形ツールである[`css-beautify`](https://www.npmjs.com/package/js-beautify)コマンドをインストールします。
次のコマンドを実行してください。

```shell-session
$ npm install -g js-beautify
```

`css-beautify` コマンドは次のように実行できます。
試しに適当な production.css を引数に実行してみてください。
きちんと整形されることが確認できるはずです。

```shell-session
$ css-beautify sample.production.css
```

## production.cssを整形

次に、比較対象の production.css を `css-beautify` で整形します。
整形後の出力は、適当なファイルへと出力しておいてください。

```shell-session
$ css-beautify path/to/before.production.css > /tmp/before.css
$ css-beautify path/to/after.production.css > /tmp/after.css
```

## diffで比較を実行

最後に、整形したCSS同士を比較します。

```shell-session
$ diff -u /tmp/before.css /tmp/after.css
```

# 応用例
## コミット前の差分と比較する方法

```shell-session
$ diff -u <(git show HEAD:hoge.production.css | css-beautify -f -) <(css-beautify hoge.production.css | css-beautify)
```
【CakePHP】マジックfindで簡単に複数条件を指定する

マジックfindは自動的に`find('first')`または`find('all')`を呼び出して実行するメソッドです。

メソッドの書き方は、`findBy`または`findAllBy`の後ろに、指定したいカラムをキャメルケースで並べます。

例えばこんな感じです。

```php:findBy
// find('first', array('conditions' => array('Model.id' => $id))) に対応
$this->Model->findById($id);
```

```php:findAllBy
// find('all', array('conditions' => array('Model.id' => $id))) に対応
$this->Model->findAllById($id);
```

指定したいカラムを複数にすることも可能で、
その場合は、`findBy`または`findAllBy`の後ろに、指定したいカラムを`And`または`Or`で繋いで並べます。

例えばこんな感じです。

```php:AND条件
// find('first', array('conditions' => array('Model.id' => $id, 'Model.name' => $name))) に対応
$this->Model->findByIdAndName($id, $name);
```

```php:OR条件
// find('first', array('conditions' => array('OR' => array('Model.id' => $id, 'Model.name' => $name)))) に対応
$this->Model->findByIdOrName($id, $name);
```

尚、`And`と`Or`は一緒に使うことはできないようです。
複雑な条件を指定する場合は、普通にfindメソッドを使う感じです。