OmniAICreator/Qiita-1.07M huggingface dataset:
演算子のオーバロードとsort, sorted, max, minの関係　トランプを例にとって実験してみた。

はじめに
---
トランプカードをそのカードの数字順にソートしたり、最大または最小の数字を取得したりするうえで、演算子のオーバロードとの関係が気になったので調べてみた。

前提事実及び要件
---
トランプのカード52枚のそれぞれには、A(エース)からK(キング)までのいずれかの数字（乃至、数字と1対1対応する文字)と、スペード('S')、ハート('H')、ダイヤ('D')、クラブ('C')との組みが印字されている。
ここで、複数のカードがプレイヤーの手に配られることを想定する。この複数のカードを小さい順から数字順に並べ変えたい。なお、Aは14に相当し、Jは11に相当し、Qは12に相当し、Kは13に相当し、その他の数字はその数字に相当する値として評価される。また、処理の都合上、10をTの文字で置き換えている。
たとえば、スペードのエース(A,S),　ダイヤの2(2,D), クラブのジャック(J,C), ハートの8(8,H), ダイヤの8(8,D)といったカードが配られた場合に、ダイヤの2(2,D), ハートの8(8,H), ダイヤの8(8,D) , クラブのジャック(J,C), スペードのエース(A,S)のように並べ替えたい。（数字が同じの8については順不同）
また、これらの数字の組みから最大の数字を有するカード、すなわちスペードのエースを抜き出したい。

今回実験したこと
---
上記前提のもと、演算子のオーバロードで、sort()やらsorted()やらmax()やらmin()やらがどのように動くのかということを実験してみた。

その1 Cardクラスの作成
---
数字とマークとをインスタンス変数として持ち、そのうち数字によって大きさを決めるCardクラスを定義してみた。

```py
class Card:
  Numbers = {'A':14,'T':10,'J':11,'Q':12,'K':13}
  
  def __init__(self, number, mark):
    if number in self.Numbers:
      self.number = self.Numbers[number]
    else:
      self.number = int(number)
    self.mark = mark
    
  def __cmp__(self,other):
    if self.number > other.number:
      return 1
    elif self.number < other.number:
      return -1
    else:
      return 0
```

このクラスを使った演算子に関する実行結果は次のとおり。

```py
>>> c1 = Card('A','S')
>>> c2 = Card('2','D')
>>> print c1 > c2
True

>>> c3 = Card('J','C')
>>> print c2 > c3
False

>>> c4 = Card('8','H')
>>> c5 = Card('8','D')
>>> print c4 == c5
True
```

次はsort()を試してみたところ、きちんとソートされたっぽい。

```py
>>> hand = [c1, c2, c3, c4, c5]
>>> hand.sort()
>>> print hand[0].number, hand[0].mark
2, 'D'
>>> print hand[4].number, hand[4].mark
14, 'S'
```

sorted()でも変わらず。

```py
>>> hand = [c1, c2, c3, c4, c5]
>>> print sorted(hand)[0].number
2
```

次はmax(),min()を使ってみた。

```py
>>> hand = [c1, c2, c3, c4, c5]
>>> print max(hand).number
14
>>> print min(hand).number
2
```

どうやら演算子のオーバロード（より正確にはその基礎となる`__cmp__`のオーバロード）で演算子だけでなく、sort, sorted, max, minなども正常に動くようである。多分に、sum()なども動くのではないだろうか。下手をするとmathの階乗関数なども動きそうな気もする。
Gitでマージ済みブランチを一括削除

## 目的

Gitのブランチはマージしても消えてくれないので定期的に掃除しないとゴミが残ってうざい。
というわけで、さくっと消す方法。

## ローカルでマージ済みブランチの一覧を表示

```
git branch --merged
```

※消したいのは↑で出てきたブランチ一覧。

## 一括削除

```
git branch --merged|egrep -v '\*|develop|main'|xargs git branch -d
```
※develop と main は消さないようにしています。
※これでスッキリしますが、毎回これ書くのは辛い。

## .gitconfig にalias (2021/05/18 ブランチ名の修正他)

.gitconfigに以下を追加

```
[alias]
       delete-merged-branch = "!f () { git checkout $1; git branch --merged|egrep -v '\\*|develop|main'|xargs git branch -d; };f"
```

これで、 `git delete-merged-branch develop` とやると｀
1. developにcheckoutし、
2. merge済みブランチを一括削除

します。

`delete-merged-branch` はaliasなので好きな名前をつければいいです。(自分は、 `vacuum` とつけています)
スクリプト内の、 `develop|main` 部分は消したくないブランチ名をパイプでつなげて複数記述すればマージ済みでも削除されません。

e.g.) `release` `main` ブランチをブロックしたい場合。
delete-merged-branch = "!f () { git checkout $1; git branch --merged|egrep -v '\\*|release|main'|xargs git branch -d; };f"

また、引数にブランチ名を指定すれば複数の機能をまとめたFeatureブランチにチェックアウトしたあと、そのブランチにマージ済みのブランチを消すことができます。
e.g.) `git delete-merged-branch hoge-features` # hoge-featuresに `checkout` しマージ済みのブランチを削除

## 補足

リモートブランチを消しても、`git branch -a` で出てくるリモート追跡ブランチを消す方法

`git fetch --prune`

### 補足の補足(2021/05/18追記)

自分の `.gitconfig` の `alias` では `git fetch --prune` も組合わせています

```
[alias]
   vacuum = "!f () { git checkout $1; git branch --merged|egrep -v '\\*|develop|main'|xargs git branch -d; git fetch --prune; };f"
```
BTKCollectionViewFlowLayoutのチューニング

前回に続いて、UICollectionViewFlowLayout拡張の話です。
[UICollectionViewFlowLayoutの拡張](http://qiita.com/tomohisaota/items/3245fb00b76e6bdc46e4)

## Sticky Sessionの実装方法
UICollectionViewFlowLayoutのレイアウトは静的なもので、スクロール時にレイアウトの再計算は必要ありません。しかし、Sticky SessionではHeader/Footerの位置がスクロールに応じて変化するため、スクロールに応じてレイアウトを再計算する必要があります。
このような場合には、shouldInvalidateLayoutForBoundsChangeからYESを返すことで、常にレイアウトを再計算することができます。

```objc
- (BOOL) shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
```

あとは頑張ってHeader/Footerの位置を計算するだけです。
contentInsets、sectionInsets、header/footerの有無を考えてコードを書く必要がありますが、順につぶしていけば実装できます。

## パフォーマンス上の問題
このアプローチで実装すると、sticky view使用時のフレームレートが半分以下に落ちます。
いままで不要だったレイアウト計算が毎回必要になるので、当然の結果ですね。しかし、エンジニアとしてフレームレートが半分になるのは我慢できません。できませんよね？

## 解決策
原因がはっきりしている以上、解決策も簡単に思いつきます。スクロール時にはHeader/Footerのみを再計算すればいいわけです。これが思ったより面倒でした。
関係するコードを抜粋します。

鍵になるのは[self invalidationContextForBoundsChange:CGRectZero]で空のcontextを作っている部分です。これを元にheader/footerを追加することで、header/footerだけを更新するcontextを生成しています。

```objc
- (BOOL) shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
    UICollectionViewLayoutInvalidationContext *context = [self invalidationContextForBoundsChange:CGRectZero];
    [self invalidateLayoutWithContext:context];
    return [super shouldInvalidateLayoutForBoundsChange:newBounds];
}

- (UICollectionViewLayoutInvalidationContext *)invalidationContextForBoundsChange:(CGRect)newBounds
{
    UICollectionViewLayoutInvalidationContext *context = [super invalidationContextForBoundsChange:newBounds];
    NSInteger numOfSections = self.collectionView.numberOfSections;
    NSMutableArray *indexePaths = NSMutableArray.new;
    for(NSInteger s = 0 ; s < numOfSections ; s++ ){
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:s];
        [indexePaths addObject:indexPath];
    }
    [context invalidateSupplementaryElementsOfKind:UICollectionElementKindSectionHeader
                                      atIndexPaths:indexePaths];
    [context invalidateSupplementaryElementsOfKind:UICollectionElementKindSectionFooter
                                      atIndexPaths:indexePaths];
    return context;
}

```

## 互換性
UICollectionViewLayoutInvalidationContextで、個別のSupplemental Viewを指定する機能はiOS8からしか使用できません。
そのためiOS7用ではパフォーマンスが落ちるかと思ったのですが、「指定できない＝＝常にすべて更新」という意味らしく、新メソッドを呼び出さないようにするだけで動作しました。

## 最後に
BTKCollectionViewFlowLayoutのコードを見てもらうとわかりますが、実際には結構面倒な作業でした。Apache Licenseなので、よかったら使ってみてください。
[BTKCollectionViewFlowLayout on GitHub](http://github.com/tomohisaota/BTKCollectionViewFlowLayout)

## 余談
PodspecがiOS6.0からになってる。。orz
iOS7.0以降でしか動きません。
PHPで顔認識したい

#PHPで顔認識したい

PHPで顔認識するという若干ニッチな要望が某案件であったりします。

http://www.xarg.org/project/php-facedetect/

こんなのがあるのでこれをインストールしに行きます。

##OpenCVのインストール
facedetectをインストールするにあたってOpenCVが必要になります。

yumでもあったりはするんですがバージョンが古くてfacedetectをインストールできません。

なので仕方なくソースからインストール・・・。

[これ](http://blog.ligun.net/2013/08/centos_opencv/)の通りやれば行けなくはないんですが、groupinstallが邪魔・・・。

```
[root@localhost source]# wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.11/opencv-2.4.11.zip
[root@localhost source]# unzip opencv-2.4.11.zip
[root@localhost source]# cd opencv-2.4.11
*cmakeが必要なのでない場合はyumからインストール
[root@localhost opencv-2.4.11]# cmake .
# こける
```
cmakeで失敗します

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

```
[root@localhost opencv-2.4.11]# yum install gtk2-devel
#groupinstallから必要なパッケージを探したらこれだけだった・・・
[root@localhost opencv-2.4.11]# yum install gcc-c++
```
さーコンパイルのお時間でございます

```
[root@localhost opencv-2.4.11]# cmake .
# OK
[root@localhost opencv-2.4.11]# make
# OK
[root@localhost opencv-2.4.11]# make install
#OK !
```
でけた！

##facedetectのインストール
facedetectも実はepelにパッケージがあったりするんですがPHPのバージョン縛りがやたら厳しいので入れるのは難しい可能性ががが・・・。

(私が試したときはremiのPHPバージョン5.5.22、epelにあるfacedetectの必要バージョン5.5.21・・・。)

ということでしゃーないので公式のとおりソースから

```
[root@localhost source]# wget https://github.com/infusion/PHP-Facedetect/archive/master.zip
[root@localhost source]# unzip master.zip
[root@localhost source]# cd PHP-Facedetect-master/
[root@localhost PHP-Facedetect-master]# phpize && ./configure && make && make install
[root@localhost PHP-Facedetect-master]# vi /etc/php.d/facedetect.ini
[root@localhost PHP-Facedetect-master]# cat /etc/php.d/facedetect.ini
extension=facedetect.so
#でけた
```

##動かしてみる

```
<?php 
//haarcascade_frontalface_alt2.xmlはopencvのソース/data/haarcascades/内のファイルを持ってきています
$fDtc = face_detect('test.jpg','haarcascade_frontalface_alt2.xml');

//顔認識したものをベースに抽出
foreach ($fDtc as $i => $fDtcv){
    $im = new Imagick('test.jpg');
    $im_width = $im->getImageWidth();
    $im_height = $im->getImageHeight();
    
    //右と下のカット
    $im->chopImage($im_width,$im_height,$fDtcv['w'] + $fDtcv['x'],$fDtcv['h'] + $fDtcv['y']);
    //左上のカット
    $im->chopImage($fDtcv['x'],$fDtcv['y'],0,0);
    
    //画像の書き出し
    $im->writeImage('test2.jpg');
    $im->destroy();
}
```

- これが・・・

![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/54588/01a5631c-d1a2-a93d-3085-72ff3dffc2f6.jpeg)


- こんな感じ！

![test2.jpg](https://qiita-image-store.s3.amazonaws.com/0/54588/d637a2f5-447c-4431-11e9-3c9a304f47fe.jpeg)
環境確認手順

# ローカルテスト環境や、ステージング環境、本番環境、デプロイ時の確認作業

確認手順になります。**ローカルテスト環境、** **ステージング環境**、**本番環境**が正しいか確認し、まず問題のないこと確認。

```lang:注意事項
環境によって差異が発生してはいけない。
常に、デプロイサーバの確認が必要です。
DB定義や、DBバージョン、構成（カラム・テーブル）、フラグの設定、デフォルト値
あたりまえのようですが、意外とデプロイ時に差異が発生します。

jQueryのバージョンやURLのプロトコルがhttpとhttpsでは指定パスによっては動かなくなります。
環境確認を怠ると意味のないテストになります。
```

```lang:デプロイを実施
開発者が、バージョン管理ツールのリポジトリからソースをもってきてデプロイを実施する。
手動だと、ミスが多いのでやはりここは自動化したい。検討中。やはりJenkinsだろうか
git pushでサーバーへ自動デプロイし、本番サーバーでgit pullをする手順
```

<img width="617" alt="スクリーンショット 2020-07-27 21.23.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/1d44d609-9f85-808f-f903-7fb11046e794.png">

参考）下記のコマンドを叩いて確認。

```lang:LinuxのOSの起動日時
uptime
```
```lang:phpバージョンを確認
php -v
```
```lang:Apacheバージョンを確認
httpd -V
```
```lang:MySQLバージョンを確認
SELECT version();
```
```lang:Opensslversionバージョンを確認
openssl version
```

```lang:ファイルを検索
find . -name "*.php" | xargs grep *mail
find . -name \*.php -print0 | xargs -0 grep test /dev/null
find /var -name "*.log"  -exec grep -l '201712*' {} \;
find /var -name "*.log"  2>/dev/null -mtime -1;
```

```lang:ファイルの行数
wc -l file01
```
```lang:履歴
history | grep ls
```
```lang:ファイルパス名
locate　*.php
```
```lang:差分をファイルに出力する
diff sample01.txt sample03.txt > diff.txt
view diff.txt
```

```lang:ディスク容量確認
df -h
du -h
```

```lang:対象ホストまでのルート
traceroute google.jp
```

```lang:ネットワーク接続状況
netstat -a
```

```lang:SQLコマンド
参照
select * from test_table limit 0,1;

SELECT DISTINCT item FROM table_name

SELECT item1 AS item2 FROM table_name
```

```lang:権限付与
権限付与
SHOW GRANTS;
```

```lang:テストデータ追加
追加
insert into test_table (id,memo) vales (2,'2nd');
```
```lang:テストデータ更新
更新
UPDATE table_name SET item1 = 1 WHERE item2 = 2
```
```lang:テストデータ削除
削除
DELETE FROM mysql.user WHERE user='ユーザ名' AND host='ホスト名'; 
```
```lang:そのほか
SHOW CHARACTER SET; 

DROP TABLE テーブル名; 

ALTER TABLE テーブル名 RENAME AS 新テーブル名;

バージョン確認
show variables like 'version';

SELECT COUNT(*) FROM table_name GROUP BY item

SELECT x,SUM(i) FROM table_name GROUP BY x HAVING SUM(i) > 100

SELECT 氏名 FROM table_name WHERE 氏名 LIKE '%郎'

SELECT * FROM table_name WHERE item1 = 100 OR item2 = 200

SELECT MAX(item) FROM table_name
```
http://refer.it-manual.com/sql.html
iOSのホーム画面にオリジナルのアイコンを置く方法

##方法
以下のテキストの【～】の部分を好きなように置き換え、SafariのURLバーに入力し、開いたページをホーム画面に追加することで、ホーム画面にオリジナルのアイコンを設置することができます。

```text
data:text/html;charset=UTF-8,<title>【タイトル】</title><meta name="apple-mobile-web-app-capable" content="yes"><link rel="apple-touch-icon" href="【画像URL】"><script>navigator.standalone?location="【URLスキーム】":alert("ホーム画面に追加してください")</script>
```

ポイントは以下のようになります。

- data URI … サーバーなどにHTMLファイルを用意することなくHTMLを使える
- apple-mobile-web-app-capable … フルスクリーンモードで、Safariを開かずにHTMLを表示できる
- apple-touch-icon … 好きな画像をアイコンとして使える
- navigator.standalone … フルスクリーンモードで開かれたかどうかを判定し、処理を分岐する
- URLスキームを使ってアプリを起動

それぞれ具体的にどのような機能があるのかを知りたい場合は、ググると参考になるサイトがたくさん出てくると思います。

さらに、画像URL部分にもdata URIを使えば、完全にオフラインで作動します。変換には、[こちら](https://hamayapp.appspot.com/static/data_uri_conv.html)が便利です。

##使用例
例えば、「[SySight](https://itunes.apple.com/jp/app/sysight/id568731681?mt=8)」というiOSのメモリ管理アプリがあります。このアプリにはURLスキームを使ったメモリ解放機能があるのですが、これを使ってホーム画面からメモリ解放するには、以下のようなdata URIにします。

```text
data:text/html;charset=UTF-8,<title>メモリ解放</title><meta name="apple-mobile-web-app-capable" content="yes"><link rel="apple-touch-icon" href="data:image/png;base64,iVBORw0KGg...（省略）...lFTkSuQmCC"><script>navigator.standalone?location="sysight://allkill":alert("ホーム画面に追加してください")</script>
```
Swift PlaygroundでCocoaPodsのライブラリを使う


※Xcode 6.2

# xcworkspaceをつくる

`pod install`してあれば出来ています。
Swiftが含まれているPodを使う場合はPodfileに`use_frameworks!`が必須になっています。
まだ変えていない場合はpod installしなおします。(deployment targetがiOS 8以上の必要があります)

# xcworkspaceにPlaygroundファイルを追加する

File -> New -> File... -> Playground で

# playgroundファイルにimportを追加

PodfileでインストールしたPodの名前でimport

```swift
import AsakusaSatellite
```

このままだとフレームワークが見つからないエラーが出ています。

# Podのframeworkをビルドする

デフォルトではPodのframeworkのスキームは見えていません。
Scheme -> Manage Schemes...
で，Pods-AsakusaSatellite のShowをチェックします。

![Screen Shot 2015-03-19 at 21.40.26.png](https://qiita-image-store.s3.amazonaws.com/0/6450/9c994b37-b70e-712f-dc24-441d1028b69e.png "Screen Shot 2015-03-19 at 21.40.26.png")

追加したスキームの64bitシミュレータを選択してビルドします。(iPhone 6など)

これでPlaygroundでimportのエラーがなくなります。

# Play!

![Screen Shot 2015-03-19 at 21.06.45.png](https://qiita-image-store.s3.amazonaws.com/0/6450/f6b36877-1658-62cc-4583-d7b3c6787cef.png "Screen Shot 2015-03-19 at 21.06.45.png")

# See Also

* [play with AsakusaSatellite.framework #3](https://github.com/codefirst/AsakusaSatelliteSwiftClient/pull/3)
* https://developer.apple.com/library/ios/recipes/Playground_Help/Chapters/ImportFramework.html#//apple_ref/doc/uid/TP40015166-CH27-SW1
マージされてない他者のプルリクを取り込む

チーム開発をしててまだマージされてない、他の人のプルリクを取り込みたい時のやり方。

分かりやすく、

- プルリクを送ったユーザー…taro
- プルリク元のリポジトリ…repo
- 取り込みたいプルリク…feature

とする。


プルリクを送ったユーザーのリモートリポジトリを登録する。
```
git remote add taro git@github.com:taro/repo.git
```


リポジトリデータを取得する。
```
git fetch taro
```


masterにマージしても良いが、ブランチを切ってそこにマージするようにする。
```
git checkout -b hoge-branch
```


取り込みたいプルリクをマージ。
```
git merge taro/feature
```
iTerm2(AppleScript)&pecoでイイ感じにSSHしてみる

# はじめに
仕事でいろんなサーバにSSHするのだけれど（鳥脳のせいで）ドメインとかIP覚えきれないし、いちいちターミナル分割していくつも手動でログインするのもめんどくさいなぁと思っていたので、AppleScriptと[Peco](https://github.com/peco/peco)[^1]で作ってみました。

# やったこと
## AppleScript書く
初めて書いたので多少戸惑ったけどこんな仕上がりに。

```applescript:multi_ssh.scpt
on run argv
	set num_hosts to count of argv
	if num_hosts = 0 then
		return
	end if
	
	launch application "iTerm"
	tell application "iTerm"
		activate current terminal
		tell the current terminal
			launch session "Default Session"
			tell the the current session
				set current_host to 1
				repeat with host in argv
					if current_host > 1 then
						if current_host < 6 then
							tell i term application "System Events" to keystroke "d" using command down
						else
							tell i term application "System Events" to keystroke "]" using command down
							tell i term application "System Events" to keystroke "D" using {command down, shift down}
						end if
					end if
					delay 0.2
					
					write text "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null toremo@" & host
					
					set current_host to current_host + 1
				end repeat
			end tell
		end tell
	end tell
end run
```

引数にアクセスしたいSSHのドメインなりIPなりを渡すとiTerm上に新しいタブを作ってhostの数だけPane分割しながらSSHアクセスします（ここでは横に作るPane数を5つ固定にしてます）。

## Hostのリストを作る
Pecoに食わすHostの一覧を用意しました（1行1Host）。

```:host_list.txt
web001
web002
proxy001
proxy002
db001
...
```

## Shell書く
host一覧をPecoに食わせて、その戻りを配列化したものを引数にしてAppleScriptに渡すだけの簡単なShellを書きました。

```bash:multi_ssh_peco.sh
#!/bin/bash
IFS=$'\n'
list=("$( peco ~/host_list.txt )")
osascript ~/multi_ssh.scpt $list
```

## Aliasに起動コマンドを設定
最後にAliasに起動コマンドを設定して終了です。

```
alias mssh=". ~/multi_ssh_peco.sh"
```

これでターミナルから```mssh```と叩いてやるだけで、Host一覧からPecoで選択したHostだけを一括SSHさせることができました。

# 所感
AppleScriptの記号の少なさに戸惑いながらも割とサクッとできました。
もう少しいろいろ工夫すればもっと柔軟にできそう。
一覧のHostが多くても、Pecoはインクリメンタルサーチで絞り込めるので"web"とか"db"とかで絞れば簡単に目的のサーバ見つけられるし、とてもイイ感じです。
Peco素敵！

# 参考にさせて頂いたサイト
https://github.com/peco/peco
http://mc909j.blogspot.jp/p/document.html
https://wimdeblauwe.wordpress.com/2014/07/16/opening-multiple-ssh-sessions-with-iterm-automatically/

[^1]: [percol](https://github.com/mooz/percol)をgo言語で書き換えたようなやつ。むちゃ便利。
(いまさら)Objective-C ブロックの書き方まとめ

## メソッドのパラメータ
```objc
- (ret)hogeMethod:(retType (^)(param p1, param p2))blockName
```

## メソッドコールの引数に直接指定(無名)
```objc
[object hogeMethod:^(param p1, param p2) {
     // 処理
}];
```

## ローカル変数宣言
```objc
ret (^blockName)(param p1, param p2) = ^(param p1, param p2) {
     // 処理
};
```

## typedef
```objc
typedef ret (^blockName)(param p1, param p2);
```
このように記述することで、`blockName`をメソッドのパラメータの型として使えるようになります。
PHPからMySQLに接続してレコードを挿入する１

## 前提
[PHPからMySQLに接続する](http://qiita.com/tiida26/items/a8af26b5f34d64423b8b) にて接続を行っている


## コード(処理部分のみ)

テーブル: hogetable に以下のようなレコードを挿入する。

|id|name|pass|
|:---:|:---:|:---:|
|1|yamada|hogehoge|

```php
$stmt = $dbh->prepare("insert into hogetable (id,name,pass) values (:id,:name,:pass)");
$stmt->execute(array(":id"=>"1",":name"=>"yamada",":pass"=>"hogehoge"));    // 配列(array)で書く
```


## その他

`:変数名` のことをプレースホルダーという
PHPでMySQLに繋いでselect文を発行

## 前提
[PHPからMySQLに接続する](http://qiita.com/tiida26/items/a8af26b5f34d64423b8b) にて接続を行っている


## コード(処理部分のみ)

テーブル:hogetable、のフィールド:hogefieldの内容を`dump`する。

```php
$sql = "select * from hogetable";
foreach ($dbh->query($sql) as $hoge) {
    var_dump($hoge['hogefield']);
}
```

テーブル:hogetableにおいて`select`で取得した行数を`echo`する。

```php
echo $dbh->query("select count(*) from hogetable")->fetchColumn();
```


## 所感

`$dbh->query(クエリ)`ってやると結果が連想配列な感じになるのね。
LINQでファイルが存在するかどうかチェックする

C#でLINQを使ってファイルが存在するかどうかをチェックします。環境変数のPATHおよびPATHEXTの内容を考慮します。

※ 2015/03/19頂いたアドバイスを元に改良しました。

```csharp:コード
var path = "探したいファイル";
var found = Environment.GetEnvironmentVariable("PATH").Split(';')
  .Select(x => Path.Combine(x, path))
  .SelectMany(_ => Environment.GetEnvironmentVariable("PATHEXT").Split(';')
    .Concat(new String[] { Path.GetExtension(path) }), 
      (p, ext) => Path.ChangeExtension(p, ext))
  .Any(File.Exists);
```

```csharp:使用例
var path = "perl";
var found = Environment.GetEnvironmentVariable("PATH").Split(';')
  .Select(x => Path.Combine(x, path))
  .SelectMany(_ => Environment.GetEnvironmentVariable("PATHEXT").Split(';')
    .Concat(new String[] { Path.GetExtension(path) }), 
      (p, ext) => Path.ChangeExtension(p, ext))
  .Any(File.Exists);
// found => true(Perlがインストール済みの場合)
```

無理に一行で書こうとしたせいで冗長になってしまいました。

# おまけ：もし見つかったらファイルパスを返す

最後のAnyをWhereに変えたらLinuxのwhichコマンドみたいなものもできました。LINQすごい。

```csharp:whichっぽいの
var path = "perl";
var found = Environment.GetEnvironmentVariable("PATH").Split(';')
  .Select(x => Path.Combine(x, path))
  .SelectMany(_ => Environment.GetEnvironmentVariable("PATHEXT").Split(';')
    .Concat(new String[] { Path.GetExtension(path) }), 
      (p, ext) => Path.ChangeExtension(p, ext))
  .Where(File.Exists).FirstOrDefault();
// found => "c:\cygwin\bin\perl.EXE"(インストール済みの場合)
```

もし存在しないpathを指定すると、foundはnullとなります。
PHPからMySQLに接続する

## 環境
- CentOS 6.6
- MySQL 5.5.41
- PHP 5.4.38
- PDO使う

↓みたいなコマンドで環境つくれると思う

```shell-session
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# yum install --enablerepo=remi mysql mysql-server mysql-devel mysql-utilities php-mysql php php-pdo
```


## コード

DBに接続してエラーが出たらエラーを表示して処理を終了。接続できたらsuccessを表示。

```php:index.php
<?php

try {
    $dbh = new PDO('mysql:host=localhost;dbname=hogedb','hogeuser','hogepass');
} catch (PDOException $e) {
    var_dump($e->getMessage());
    exit;
}
echo "success!";

$dbh = null;    // データベースから切断
```
【初心者向け？】map メソッドで既存配列から違う型の配列を作る方法

まあかなり簡単なやり方ですが、慣れてくると結構便利なのでメモとして残しておきます。

まず`map`メソッドを簡単に説明しますと、最近は多くの言語は配列に「`map`」というやらを対応しています。簡単に言うと配列の要素を何かしら弄って返すメソッドです。例えば 0 から 9 までの自然数の配列があるとしますが、その配列の要素の自乗した配列がほしい、という場合は昔 C 言語の時代はこんな風に書きます

```c
	int arrayA[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int arrayB[10];

	for (int i = 0; i < 10; i++) {
		arrayB[i] = arrayA[i] * arrayA[i];
	}
```

まあこのコード自体はとてもシンプルですが、一応「C の文法がわからない！」という方のために同じ動作の Swift のコードを書きます：

```swift
let arrayA = [Int](0 ..< 10)
var arrayB = [Int]()

for element in arrayA {
	arrayB.append(element * element)
}
```

（まあこの段階でも C と比べると更にだいぶシンプルになりましたね…もう Swift なれちゃった筆者はもう C でソースコード書きたくないでございます orz）
もちろんこの書き方自体も全然悪くないのですが、`map`メソッドを使うと更にシンプルに書けちゃうのです：

```swift
let arrayA = [Int](0 ..< 10)
let arrayB = arrayA.map{$0 * $0}
```

というかもはや「なにこれ気持ち悪っ！」ってレベルの簡潔さですね、はい。<del>そしてやっぱ`let`使える時は`let`使ったほうが気持ちいいですよね（笑）</del>とまあ、`map`メソッドの簡単な紹介はこれくらいにします、ここからが本題です。実は自乗なんて生ぬるいものだけでなく、そもそも違う型で出力することだってできちゃうのです。例えばこれの平方根を取りたいとするでしょう、でも`Int`型じゃあ小数取れないでしょう、そういう時はこのように書けます：

```swift
let arrayA = [Int](0 ..< 10)
let arrayB = arrayA.map{ (element: Int) -> Double in
	let value = sqrt(Double(element))
	return value
}
```

こうすると`Double`型の`arrayB`が生成され、`arrayA`の各要素の平方根が入ります。書き方について詳しい説明は省きますが、要するに`map`メソッドの中身はクロージャを打ち込むことで中身を色々操作して新しい配列として吐き出してくれるというわけですよ。

んで実は筆者の場合、こういう使い方よりも、一度に複数の`UIView`オブジェクトを`UIViewAnimation`に渡したいときに使ったりしますね。例えばもうズバリ書いちゃいます：

```swift
let baseView = UIView(frame: CGRectMake(0, 0, 1920, 1080))

let viewTags = [Int](0 ..< 10)

for tag in viewTags {
	let view = UIView(frame: baseView.frame)
	view.tag = tag
	baseView.addSubview(view)
}

//いろいろ操作

let animationViews = viewTags.filter{$0 % 3 == 0}.map{ (tag: Int) -> UIView in
	let view = baseView.viewWithTag(tag)!
	return view
}

UIView.animateWithDuration(1.5, animations: { () -> Void in
	for view in animationViews {
		view.alpha = 0
	}
})
```

まあ詳しい説明は省きますが、要するに`baseView`を作ってその上に順番に tag が 0 から 9 までの`UIView`を重ねていきます。そして途中は省略してますが、最後 tag が 3 の倍数の`UIVew`だけフェードアウトさせる、というプロセスです。
コマンドプロンプトをハッカーぽくする方法

1.コンテキストメニューからプロパティを開く
![cmd1.PNG](https://qiita-image-store.s3.amazonaws.com/0/69767/6fd8031e-d20a-1b40-316b-1e3ff7cb8baf.png)
2.画面の色のタブで画面の文字を選択
![cmd2.PNG](https://qiita-image-store.s3.amazonaws.com/0/69767/29bec15f-76bd-82ec-a78f-0393708f68f5.png)
3.文字の色を選んで、OK!!
![cmd3.PNG](https://qiita-image-store.s3.amazonaws.com/0/69767/9f6460bf-a7a8-09bf-a8b4-7f86dc72c0c2.png)
4.ハッカーぽくなりましたw
![cmd4.PNG](https://qiita-image-store.s3.amazonaws.com/0/69767/287c8512-3792-06ee-17bb-71de0a4b551e.png)

モチベーションアップするかも!?
OSXにてOracle提供のVM使ってOracle使えるようにする


Rubyでつつける環境が欲しくてとりあえず作った際のメモ。

## Oracleが提供しているVMがある
[VirtualBox VMs for Developers](http://www.oracle.com/technetwork/jp/community/developer-vm/index.html)
「開発者向けの事前構築済み仮想マシン　(Oracle VM Virtual Box用）」
というのがあるのでとりあえずOSXからつながる環境がほしいので適当にダウンロードすることにする。

## ダウンロード
一番小さそうな下記をダウンロード。
それでも4GB超。
[Virtual Machine for the Oracle Communications Service 
Delivery Platform (SDP) Products](http://www.oracle.com/technetwork/apps-tech/sdp-vm-2121008.html?ssSourceSiteId=otnjp)

## インポート
VirtualBoxで「仮想アプライアンスのインポート」でダウンロードしたファイルを選択

## 起動
USBが無いよ、とかなったので設定で外した。

## oracleユーザでログイン
パスワードはoracle、と[Download and Setup Instructions for SDP-VM](http://download.oracle.com/otn/vm/sdp/SDP_VM_Instructions.pdf)に書いてあった）

## 自動起動の設定
毎回GUIで起動してログインして、インスタンス起動、とか面倒です。ので

  - 参考：[OS の起動時に Oracle を起動する - オラクル・Oracleをマスターするための基本と仕組み](http://www.shift-the-oracle.com/config/auto-startup.html)
  - `/etc/rc1.d`と`/etc/rc6.d`に`ln -s /etc/init.d/oracle-xe KXXoracle-xe`
     - /etc/rc1.dと/etc/rc6.dはなぜかK05oracle-xeがあったのでそのままとした
  - `/etc/rc3.d`と`/etc/rc5.d`に`ln -s /etc/init.d/oracle-xe KXXoracle-xe`
     - /etc/rc3.dと/etc/rc5.dはなぜかK05oracle-xeがあったので消した
  - oratab
    - `/etc/oratab`にoracle-xe、というかxeの記載があり、NになっているのでYにした
  - 再起動とかシャットダウン後の起動でMacからつながればOK


## VirtualBoxのheadless（画面なし）での起動
  - 起動
     - `VBoxManage startvm SDP_VM --type headless`
  - 停止
     - 電源OFF：`VBoxManage controlvm SDP_VM poweroff`
     - ACPIOFF：`VBoxManage controlvm SDP_VM acpipowerbutton`
  - 参考：[VirtualBox の VM をコマンドラインから管理する - Qiita](http://qiita.com/zakkied/items/abf43c69fae92e4c5207)

## 適当にユーザ作る
VMにログインしてコンソールにて。
つかえりゃいいのでとりあえずDBA権限。

```
sqlplus / as sysdba
create user dev identified by dev;
grant dba to dev;
exit
```

## Mac側のクライアントの設定
下記の記事を参考に
[OS X Mavericks に Oracle Client と ruby-oci8 をインストール - Qiita](http://qiita.com/usutani/items/e9a55051c61457989ddd)
若干バージョン違いによってパスが違ったりする点は要確認


## その後は？
下記の記事を参考につついて遊ぶとか何なりと
[ActiveRecordを単体で使う](http://qiita.com/toyoshi/items/993cfa4143277430abf9)
[Linq]GroupByとToLookupの違い

## はじめに

GroupByはシーケンシャルアクセス、Lookupはインデクサアクセスらしいです。
大量データのときどちらが早いのか気になったので計測してみました。

## 結果

```
Big Lookup:00:00:15.9899402
Big GroupBy:00:00:18.6203130
```


Lookupのほうが少し早かったけど劇的ではありませんでした。
大量のオブジェクトコレクションにアクセスする際はやっぱりあらかじめ絞り込まれたコレクションのキャッシュにアクセスすることが大切だということを再認識しました。（大量のマスタへのアクセスとか）

## 計測

あらかじめこういう計測用のDelegateを用意しておく

```csharp
readonly Action<string, Action> _measurement = ((desc, execute) =>
{
    var sw = new Stopwatch();
    sw.Start();
    execute();
    sw.Stop();
    Console.WriteLine("{0}:{1}", desc, sw.Elapsed);
});
```

1千万件のランダムな文字列をKeyValueコレクションにしてアクセスしてみる時間を計測

```csharp
var rand = new Random();
var big = new List<string>();
Enumerable.Range(1, 10000000).ForEach(x =>
{
    big.Add(rand.Next().ToString());
});

_measurement("Big Lookup", () =>
{
    var lookup = big.ToLookup(x => x);
    var item = lookup.Where(x => x.Key == "5000000").ToArray();
});

_measurement("Big GroupBy", () =>
{
    var group = big.GroupBy(x => x);
    var item = group.Where(x => x.Key == "5000000").ToArray();
});

```

### 余談

Linqの変換のメソッドでLinqはAs～すると遅延実行される、To～はされないという慣例があるみたいです。拡張メソッドなんかを作る際に考慮されているとありがたいです。
A(IMG)タグの相対URLを絶対URLに書き換えるメモ(jQuery)

自分用メモ。
対象文字列に `<base>` があることを想定。`<iframe>`を利用して書き換える。
※ 諸事情によりchromeでのみ確認。
参考 http://qiita.com/kawanamiyuu/items/0e95f360ad5490e2db74

```js
var convAbsluteUrlByBaseTag = function(_html) {

	if (typeof _html !== 'string'){
		return _html;
	}
	var _re = /<base [^>]*>/gi;
	if (_html.match(_re) === null) {
		return _html;
	}
	
	var _id = 'tekitouna_id_wo_shitei';
	$('body').append('<iframe id="'+_id+'" style="visibility:hidden;"></iframe>');

	var $iframe = $('iframe#'+_id);
	var _idoc = $iframe[0].contentWindow.document;
	$('body', _idoc).append(_html);
	$('a', _idoc).each(function(){
		var _href=$(this)[0].href;
		$(this).attr('href', _href);
	});
	$('img', _idoc).each(function(){
		var _src=$(this)[0].src;
		$(this).attr('src', _src);
	});
	_html = $('body', _idoc).html();
	$iframe.remove();
	
	return _html.replace(_re, '');
};
```
Vagrantで作成した仮想環境のRails4.2に繋がらない！！

# 概要
Rails4.2の開発環境をVagrantのCentOS7で作成していました。
Rails実行環境が出来て**bundle exec rails s**で起動し、ホストOSのブラウザからIP指定してアクセスしようとしてもつながらず・・

色々試して解決できたので、記録しておきます。

## 前提条件
Vagrantで起動した仮想環境にホストOSのブラウザからIP指定でアクセスできるように、Vagrantfileに記載するネットワーク設定を**public_network**にしています。

```rb:Vagrantfile
config.vm.network = "public_network"

```

# 解決方法

## rails server のbinding オプションを設定する
Rails4.2でrails serverコマンドを実行すると以下のように表示されます。

```
$ bundle exec rails s
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-03-19 10:01:40] INFO  WEBrick 1.3.1
[2015-03-19 10:01:40] INFO  ruby 2.2.0 (2014-12-25) [x86_64-linux]
[2015-03-19 10:01:40] INFO  WEBrick::HTTPServer#start: pid=3487 port=3000
```

上記の3行目に,
*Rails 4.2.0 application starting in development on http://localhost:3000*
と記載されている通り、localhostからのアクセスしか受け取らないようになっています。

[Rails4.2のリリースノート](http://railsguides.jp/4_2_release_notes.html#rails-server%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%83%9B%E3%82%B9%E3%83%88)を確認してみるとしっかり記載されていますね・・・

>3.3 rails serverのデフォルトホスト
Rackの変更 により、rails serverコマンドを実行した際のデフォルトのホストが0.0.0.0からlocalhostに変更されました。

VMで起動しているRailsサーバーに外のOSからIP指定でアクセウするには以下のようにbindingオプションで0.0.0.0を指定します。

````
$ bundle exec rails server -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-03-19 10:10:04] INFO  WEBrick 1.3.1
[2015-03-19 10:10:04] INFO  ruby 2.2.0 (2014-12-25) [x86_64-linux]
[2015-03-19 10:10:04] INFO  WEBrick::HTTPServer#start: pid=3571 port=3000
````

これで仮想VMのIPを指定してホストOSのブラウザからアクセスできるようになりました。

# あとがき
ちゃんとリリースノートを読みましょう。
UITableViewの更新について

一覧のうち、一つだけをチェックするようなUITableViewのCheckmarkの更新をする際に、今までは選択したindexを変数として保持し、その都度TableをreloadDataしていたので
どうも動きがダサいなぁと思っていましたが、普通は多分こんな風にやるのですね。今更ですが。

```objc
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    for (int i = 0; i < [tableView numberOfRowsInSection:0]; ++i)
    {
        UITableViewCell *c = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
        c.accessoryType = UITableViewCellAccessoryNone;
        if (i == indexPath.row) {
            c.accessoryType = UITableViewCellAccessoryCheckmark;
        }
    }
}
```
Project Euler 47

問題
---
それぞれ2つの異なる素因数を持つ連続する2つの数が最初に現れるのは:

```
14 = 2 × 7
15 = 3 × 5
```

それぞれ3つの異なる素因数を持つ連続する3つの数が最初に現れるのは:

```
644 = 2**2 × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19
```

最初に現れるそれぞれ4つの異なる素因数を持つ連続する4つの数を求めよ. その最初の数はいくつか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2047

回答
---
指定された数maxまでの各数の約数の素数のリストを作る関数get_prime_factor_listを作った。この関数は、たとえば、次のようなリストを作成する。

```
6→[2,3]
8→[2]
12→[2,3]
```

これを使って、上記リストの要素数が4以上となるような数が4連続する最初の数を探した。

```py
# coding: utf-8
import math
from mymath import get_prime_boolean

def get_prime_factor_list(max):
    bool = get_prime_boolean(max)
    ret = [ [] for i in range(max+1)] 
    for p in range(max+1):
        if bool[p]:
            for j in range(p*2,max,p):
                ret[j] += [p]
    return ret

def main():
    # TPF stands for a threshold of number of prime factors.
    # TCI stands for a threshold of number of concecutive integers
    MAX, TPF, TCI =10**6, 4, 4
    prime_factor_list = get_prime_factor_list(MAX)
    ans = []
    for i in range(MAX):
        if len(prime_factor_list[i]) >= TPF:
            ans.append(i)
            if len(ans) == TCI:
                break
        else:
            ans = []

    print ans[0]

main()
```
Apache:CGIの利用設定をする


#CGIとは

```Wikipediaより
WEBサーバの機能の主体は、あらかじめ用意された情報をクライアントの要求に応じて送り返すことである。そのためサーバプログラム単体では情報をその場で動的に生成してクライアントに送信するような仕組みを作ることはできなかった。 そこでサーバプログラムから他のプログラムを呼び出し、その処理結果をクライアントに送信する方法が考案された。それを実現するためのサーバプログラムと外部プログラムとの連携法の取り決めがCGI(Common Gateway Interface)である。
```

#CGIを使えるようにする

###実行したいプログラムを"/var/www/cgi-bin/"に配置する
cgiプログラムにはサーバー情報等公開すべきでない情報も含まれる可能性があるため、cgiファイルへのアクセスを防ぐために公開ディレクトリ(html直下)に配置しないようにする
###httpd.confを設定する
#### ScriptAlias:指定したCGIディレクトリをURLのパスとして割り当てる
```httpd.conf
#CGIディレクトリ:/var/www/cgi-bin/をURL:http://example.com/cgi-bin/に割り当てる
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

#CGIディレクトリコンテナ
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
# cgi-scriptが拡張子.cgiを処理するように設定
# (拡張子.cgiをCGIのファイルとする設定）
AddHandler cgi-script .cgi
```
【c++】Reference to stack memory associated with local variable

[元ブログ、【c++】Reference to stack memory associated with local variable - 技術は熱いうちに打て！](http://blog.dalt.me/1139)

掲題の警告が出ました。
どういう意味なんでしょうか？

エラーが出たコードは概ね以下の形です。

```cpp
const string& Sample::getString(int a)
{
  string data { to_string(a) };
  return data;
}
```
return dataの部分で警告が出ます。

## 無効な参照の返却

問題は**このメソッド内でしか有効でないインスタンスの参照を返している事**でした。

このメソッドを利用してこのインスタンスの参照を得たとしても、メソッドを抜けた時点でこのインスタンスは既に破棄されています。
だからダメだよってコンパイラが教えてくれているんですね。
## 対処

参照を返すのではなくデータそのものを返す様にすれば良いかと思います。


誰かのお役に立てば。
Terminal-аас Sublime Text дээр файл нээх


## subl-г идэвхижүүлэх

Sublime Text нь terminal дээр ``subl`` гэсэн командаар ажиллах ба доорх байдлаар командыг идэвхижүүлнэ.

```sh
# Mac OS X дээр Sublime Text 2 ашиглаж байгаа бол
$ sudo ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/bin/subl
```

## subl командууд

Амжилттай идэвхижсэн бол доорх байдлаар ашиглана.

```sh
# file.txt гэсэн файлыг Sublime Text дээр нээх
$ subl file.txt

# Sublime Text дээр одоо байгаа фолдеруудыг харуулдаг болгох
$ subl .
```

### Бусад хэрэглээг харах

```sh
$ subl --help
Sublime Text 2 Build 2221

Usage: subl [arguments] [files]         edit the given files
   or: subl [arguments] [directories]   open the given directories
   or: subl [arguments] -               edit stdin

Arguments:
  --project <project>: Load the given project
  --command <command>: Run the given command
  -n or --new-window:  Open a new window
  -a or --add:         Add folders to the current window
  -w or --wait:        Wait for the files to be closed before returning
  -b or --background:  Don't activate the application
  -s or --stay:        Keep the application activated after closing the file
  -h or --help:        Show help (this message) and exit
  -v or --version:     Show version and exit

--wait is implied if reading from stdin. Use --stay to not switch back
to the terminal when a file is closed (only relevant if waiting for a file).

Filenames may be given a :line or :line:column suffix to open at a specific
location.
```
rake と bundle exec rake の違い

bundle exec rake はプロジェクトのライブラリ保存場所から読み出す
rake はrailsのライブラリ保存場所から読み出すという指示になるそうです。

で、複数のPJを利用している場合、rakeコマンドが違ったりして、毎回bundle installしてた
（めっちゃ非効率）

調べてみたら、常識的なことだったようです。
PJ単位にbundle install ができるとのことで、試してみました。

```
cd [PJ rootディレクトリ]
bundle install --path gems
```

設定した内容はここで確認
```cat .bundle/config
```

以降はみたいな感じでやっています。
```bundle exec rake XXXXX
```
直近の祖先要素に囲まれているcheckboxを操作する #jQuery

## HTML

* 次のようなHTMLがあって、&lt;a&gt;から見た直近の祖先要素&lt;div&gt;に囲まれているcheckboxだけ操作するような場合。

```html
<div>
<div>
<a href="javascript:void(0)" class="on">チェックする</a><br>
<a href="javascript:void(0)" class="off">チェック外す</a>
<div>
<label><input type="checkbox">チェックボックス</label>
</div>
</div>
<div>
<a href="javascript:void(0)" class="on">チェックする</a><br>
<a href="javascript:void(0)" class="off">チェック外す</a>
<div>
<label><input type="checkbox">チェックボックス</label>
</div>
</div>
</div>
```

* &lt;a&gt;から見た直近の祖先要素&lt;div&gt;と&lt;div&gt;に囲まれている部分

```html
<div>
<a href="javascript:void(0)" class="on">チェックする</a><br>
<a href="javascript:void(0)" class="off">チェック外す</a>
<div>
<label><input type="checkbox">チェックボックス</label>
</div>
</div>
```

## jQuery (javascript)

* &lt;a&gt;タグをクリックしたときに&lt;a&gt;から見た直近の祖先要素&lt;div&gt;を`$(this).closest('div')`で参照して同じく囲まれているcheckboxのチェック状態だけ変更する。

```js
$('a').on('click', function(){
    $('input[type="checkbox"]', $(this).closest('div')).prop('checked', $(this).hasClass('on'));
});
```

* jQuery 1.11.2を利用しGoogle Chrome 41.0.2272.89 mで確認。
* 参考: https://www.softel.co.jp/blogs/tech/archives/2488

## Example

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>Example</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
    $('a').on('click', function(){
        $('input[type="checkbox"]', $(this).closest('div')).prop('checked', $(this).hasClass('on'));
    });
});
</script>
</head>
<body>
<form>
<div>
<div>
<a href="javascript:void(0)" class="on">チェックする</a><br>
<a href="javascript:void(0)" class="off">チェック外す</a>
<div>
<label><input type="checkbox" value="A">チェックA</label><br>
<label><input type="checkbox" value="B">チェックB</label><br>
<label><input type="checkbox" value="C">チェックC</label>
</div>
</div>
<hr>
<div>
<a href="javascript:void(0)" class="on">チェックする</a><br>
<a href="javascript:void(0)" class="off">チェック外す</a>
<div>
<label><input type="checkbox" value="A">チェックA</label><br>
<label><input type="checkbox" value="B">チェックB</label><br>
<label><input type="checkbox" value="C">チェックC</label><br>
<label><input type="checkbox" value="D">チェックD</label><br>
<label><input type="checkbox" value="E">チェックE</label><br>
<label><input type="checkbox" value="F">チェックF</label>
</div>
</div>
<hr>
<div>
<a href="javascript:void(0)" class="on">チェックする</a><br>
<a href="javascript:void(0)" class="off">チェック外す</a>
<div>
<label><input type="checkbox" value="A">チェックA</label><br>
<label><input type="checkbox" value="B">チェックB</label>
</div>
</div>
</div>
</form>
</body>
</html>
```

* jQueryをダウンロードして用いる場合は別途入手する。  
https://jquery.com/ (英語)

## どのようなときに利用できそうか？

* `.parent().parent()`のように親要素のさらに親要素を参照したい場合など`.closest()`を利用すると見た感じわかりやすそう。

## 参考

* http://semooh.jp/jquery/api/traversing/closest/%5Bexpr%5D/
* http://www.jquerystudy.info/reference/traversing/closest.html
Assetic を Smarty から使う


[Assetic](https://github.com/kriswallsmith/assetic) は PHP の Asset 管理フレームワーク。css や javascript などのアセットを結合したり、minify して配信したりできるので、リクエスト数の削減が期待できる。特定のフレームワークに依存していないポータブルなライブラリなので、既存の環境に手軽に入れ込める。

Assetic をテンプレートエンジンから利用する方法として、本家では Twig を使う方法が紹介されているが、既存ソースの都合上、Smarty から使いたい。

調べてみたところ [assetic-smarty](https://github.com/pjparra/assetic-smarty) なるプラグインを発見。が、使ってみたところ、config で期待されている設定方法がよくわからなかったので、以下のようにブロック関数プラグインを書きかえて使ってみることにした。

```
<?php
use Assetic\Asset\AssetCollection;
use Assetic\Asset\FileAsset;
use Assetic\AssetManager;
use Assetic\AssetWriter;
use Assetic\Filter\CssMinFilter;
use Assetic\Filter\JsMinFilter;
use Assetic\Filter\Yui;

function smarty_block_assetic($params, $content, &$smarty, &$repeat)
{

    if ($repeat) {
        $smarty->assign('asset_url', '/assets/' . $params['version'] . '/' . $params['bundle_name']);
        $asset_absolute_path = DOCUMENT_ROOT_DIR . '/assets/' . $params['version'] . '/' . $params['bundle_name'];

        if (!$params['debug'] && file_exists($asset_absolute_path)) {
            // debugモードでない場合、既にリソース結合済みであれば再生成しない.
            return;
        }   
        $asset_files = preg_split('/[\s\n]+/', $params['assets']);

        $assets = [];
        foreach ($asset_files as $asset_file) {
            $asset = new FileAsset(DOCUMENT_ROOT_DIR . '/' . $asset_file);
            $assets[] = $asset;
        }   

        $filters = []; 
        if ($params['bundle_type'] === 'css') {
            $filters[] = new CssMinFilter();
            $filters[] = new Yui\CssCompressorFilter('/path/to/yuicompressor.jar');
        }   
        if ($params['bundle_type'] === 'js') {
            $filters[] = new JsMinFilter();
            $filters[] = new Yui\JsCompressorFilter('/path/to/yuicompressor.jar');
        }

        $asset_collection = new AssetCollection($assets, $filters);
        $asset_collection->setTargetPath($params['bundle_name']);
        $asset_manager = new AssetManager();
        $asset_manager->set('sample', $asset_collection);

        $output_dir = DOCUMENT_ROOT_DIR . '/assets/' . $params['version'];

        $writer = new AssetWriter($output_dir);
        $writer->writeManagerAssets($asset_manager);
    } else {
        echo $content;
    }   

}
```

これで、予め定義しておいた DOCUMENT_ROOT_DIR 直下から見た位置にあるファイル群を結合し、{DOCUMENT_ROOT_DIR}/assets/{version} 以下に出力される。
 
Smarty テンプレートからは、以下のようにすれば、作成済みの asset がない場合に限り Assetic でのファイル結合をおこなった上で、bundle_name に指定したファイル名で出力する。このブロック内で $asset_url が結合後のファイルへのパスに設定されるので、そのまま src 属性に指定してやれば良い。

```
{assetic
  assets="js/aaa.js js/bbb.js js/ccc.js"
  version="20140101"
  bundle_name="all.js"
  bundle_type="js"
}
<script type="text/javascript" src="{$asset_url|escape}"></script>
{/assetic}
```

version は設定ファイルなどから渡してやるのが良いと思う。
ひとまず、期待している動作は確認できた。
photshop で position を 出してくれるスクリプト


##photoshop と front の仕事

frontend の仕事をしていると photoshop から画像を切り出してポジションを出すという作業が 少なくない機会訪れるでしょう。

##position の割り出し方

この作業は非常に面倒。
楽したいなら、プラグイン とか、 sketch を使うとか

いろいろ手はあります

##昔ながらの絶対座標なケース

時には絶対座標でレイアウトするとかってケースは多々あります。
こういうときに欲しいツールがない。。。
ならば自作だ！！！

#photoshop plugin

つくりましょうよ jsx 
photoshop の preset/scripts のフォルダにファイルを打ち込めばok


#ソースコード

これは自分用なので結構汚いし、用途があれですが、、、
全てのレイヤーのポジションを網羅していくスクリプトです。
でそれをテキストファイルに書き出します。

```
$.appEncoding = "UTF-8";
var CR = String.fromCharCode(13);
var fileName = File.saveDialog("保存ファイル名を入力");

var fileObj = new File(fileName);
var nest = 0;


if ( fileObj.open('w') ) {

  for (var i = 0; i < activeDocument.layers.length; i++) {
    var layer = activeDocument.layers[i];
    get_layer_pos(layer, fileObj, nest);
  }
  fileObj.close();

}
function get_layer_pos(target, fileObj, nest) {
  var bounds = target.bounds;
  
  for (var i = 0; i < bounds.length; i++) {
    bounds[i] = parseInt(bounds[i]);
  };
  
  // 高さと幅も取れるよ。
  var w = bounds[2] - bounds[0] ;
  var h = bounds[3] - bounds[1] ;
  
  var x = bounds[0];
  var y = bounds[1];

  // インデント用のコードだよ。要らないなら消そう。
  var length = 15;
  var name = "";
  for (var i = 0; i < nest; i++) {
    length -= 2;
    name += "  ";
  };
  name += target.name;
  length -= target.name.length;

  for (var i = 0; i < length; i++) {
    name += " ";
  };

  // ファイル書き出し
  fileObj.write ( name + ':\t{"x": ' + x + ', "y": ' + y + '}' + CR );

  if(target.layers){
    for (var i = 0; i < target.layers.length; i++) {
      get_layer_pos(target.layers[i], fileObj, nest+1);
    };
  }
}
```

ちょっとしたケースなら自分でかいて自動化していきましょう！
PHPUnitでとにかく楽に遅いテストをピックアップする

とりあえず楽したいならこんな感じで PHPUnit の listener を作ればいい。

```php:tests/listeners/PickSlowListener.php
<?php

class PickSlowListener extends PHPUnit_Framework_BaseTestListener
{
    private $test_start_time;

    private $test_time_results = array();

    private $rank_limit;

    public function __construct($rank_limit)
    {
        $this->rank_limit = $rank_limit;
    }

    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
    {
        $this->test_start_time = microtime(true);
    }

    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
    {
        $this->test_time_results[$suite->getName()] = microtime(true) - $this->test_start_time;
    }

    public function __destruct()
    {
        if (empty($this->test_time_results)) {
            return;
        }

        echo 'SLOW TEST WORST ' . $this->rank_limit . PHP_EOL;
        arsort($this->test_time_results);
        foreach (array_slice($this->test_time_results, 0, $this->rank_limit) as $test_name => $time) {
            echo $test_name . ':' . $time . PHP_EOL;
        }
    }
}

```

設定はこんな感じで

```diff
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 858b395..204e559 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -21,4 +21,13 @@
     <logging>
         <log type="coverage-clover" target="build/logs/clover.xml"/>
     </logging>
+
+    <listeners>
+        <listener class="PickSlowListener" file="tests/listeners/PickSlowListener.php">
+            <arguments>
+                <integer name="rank_limit">1</integer>
+            </arguments>
+        </listener>
+    </listeners>
 </phpunit>
```

出力はこのようになる

```
 ~/Documents/program/ghq/github.com/gong023/assert_chain/ [master*] ./vendor/bin/phpunit
PHPUnit 4.4.0 by Sebastian Bergmann.

........

Time: 1.48 seconds, Memory: 10.50Mb

OK (8 tests, 69 assertions)

Generating code coverage report in Clover XML format ... done
SLOW TEST WORST 1
AssertChain\Container\Test\AggregaterTest:0.64362788200378
```
ヘッダー、フッター付き全画面Google Map


ベタですが...
ヘッダーとフッター領域を確保しながらその他はGoogle Mapで埋めるHTMLとCSSです。
ネットに転がってるサンプルを見ると時々Googleのコピーライト部が隠れちゃってるのがありますね、一応コピーライト部も隠れないように書いてます。

##短い時
![Kobito.LfsGsr.png](https://qiita-image-store.s3.amazonaws.com/0/51116/af174ba2-35b4-325f-b030-8c96a53c7f6f.png "Kobito.LfsGsr.png")

##長い時
![Kobito.acEgHY.png](https://qiita-image-store.s3.amazonaws.com/0/51116/bd0b4800-beb2-76dd-bfd0-c6fb87fd3335.png "Kobito.acEgHY.png")

##ソースコード類
```index.html
<!DOCTYPE html>
<html lang="ja">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width">
	<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=true&language=ja&region=JP"></script>
	<script src="./script.js" type="text/javascript"></script>
	<link rel="stylesheet" href="style.css" />
	<title>gmap</title>
</head>

<body>
	<header>
		<p>ヘッダー</p>
		<p>ヘッダー</p>
		<p>ヘッダー</p>
	</header>
	<div class="map_frame">
		<div id="map-canvas"></div>
	</div>
	<footer>
		<p>フッター</p>
		<p>フッター</p>
		<p>フッター</p>
	</footer>
</body>

</html>

```

```style.css
* {
	-webkit-box-sizing : border-box;
	-moz-box-sizing    : border-box;
	-o-box-sizing      : border-box;
	-ms-box-sizing     : border-box;
	box-sizing         : border-box;
}
html, body {
	width         : 100%;
	height        : 100%;
	margin        : 0;
	padding       : 0;
}
p {
	margin        : 0;
	padding       : 0;
	line-height   : 120%;
}
header {
	width         : 100%;
	height        : 200px;
	position      : absolute;
	background    : #eeeeee;
	top           : 0;
	border-bottom : 1px solid #999999;
	padding       : 5px;
	overflow      : hidden;
}
.map_frame {
	position      : absolute;
	top           : 0;
	bottom        : 0;
	width         : 100%;
	margin-top    : 200px;/* ヘッダーの高さ */
	margin-bottom : 100px;/* フッターの高さ */
}
#map-canvas {
	width         : 100%;
	height        : 100%;
}
footer {
	position      : absolute;
	width         : 100%;
	height        : 100px;
	bottom        : 0;
	background    : #eeeeee;
	border-top    : 1px solid #999999;
	padding       : 5px;
	overflow      : hidden;
}
```

```script.js
var map;

google.maps.event.addDomListener(window, "load", function() {
	// init map
	var mapOptions = {
	 "zoom"   : 14,
	 "center" : new google.maps.LatLng(35.685379, 139.753089)
	};
	map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
}, false);
```
commons-emailとhandlerbars.javaでメール送信

メール本文のテンプレートをHandlebars.javaで用意して、それをcommons-emailを使って送信したときのメモ。



## メールの送信

SimpleEmailのインスタンスをつくって、そいつにSMTPの接続情報、from,toアドレス（cc,bccも可）と件名、本文をセットしていくだけ。

```

 try {
            SimpleEmail email = new SimpleEmail();
            //接続情報を設定
            email.setHostName("SMTPホスト");
            email.setSmtpPort(25);
            email.setSSLOnConnect(falase);
            email.setAuthentication("SMTPユーザー名", "パスワード");

            //送信内容の設定
            email.setFrom("fromアドレス");
            email.setSubject("件名");

            //テンプレートから本文を生成
            String message = createMessage(messageDto);

            email.setMsg(message);
            email.setCharset("ISO-2022-JP");

            email.addTo("Toアドレス");
            email.send();

        } catch (Exception e) {
            log.error("mail sending failed.", e);
        }

```

## テンプレートから本文生成

テンプレートを読み込んで、対応するオブジェクトでパラメタを解決した結果の文字列を返させる。

```
private String createMessage(MessageDto messageDto) throws IOException {
        Handlebars handlebars = new Handlebars();
        Template template = handlebars.compile("template"); //デフォルトの拡張子がhbs
        Context context = Context.newBuilder(messageDto).resolver(FieldValueResolver.INSTANCE).build();
        return template.apply(context);
    }
```

handlebars.javaのテンプレートは下のようなもの。基本は Mustache　(http://mustache.github.io/) から派生したものなので、それのルール通り。
{{xxx}}に変数が入る。

```lang:template.hbs
{{user}}　様

{{greeting}}

先着{{max}}名までに、{{item}}をプレゼント！

XXXより

```

今回はテンプレートとオブジェクト（Bean）を対応させたかったので、インスタンスのフィールド名でパラメタを解決させる。そのためには下記のcontextをtemplateにapplyすればよい。

`Context context = Context.newBuilder(messageDto).resolver(FieldValueResolver.INSTANCE).build();`

これならテンプレートに渡すための型をつくれば、変数の増減の影響範囲をそこでおさまるので、楽そう。
handlebarsも扱いやすそうだし、もっと高度なこともできるので、面倒な要件にも対応できそう。



### commons-email
http://commons.apache.org/proper/commons-email/index.html

### Handlebars.java
https://github.com/jknack/handlebars.java
画像アップロードのパスの設定について

現在Java、Seasar2(SAStrats/S2JDBC)、JSP、PostgreSQLを使って
DBを使ったWebアプリケーションを作っています。

今画像アップロード機能を追加しているのですが、引っかかっているところがあります。

そこで質問なのですが、
結論から言うと
<br>
**画像アップロードにおけるパスの設定はどこでしているのでしょうか？**
<br>
質問として漠然としているし、わかりにくいと思うので状況を説明します。

<br>
まず現在下記のサイトを利用して、ソースをそのまま使わしてもらっています。
http://winter-tail.sakura.ne.jp/pukiwiki/index.php?SAStruts%A4%A2%A4%EC%A4%B3%A4%EC%2F2-4%20Web%A4%C7%C6%FC%B5%AD%A4%F2%A4%C4%A4%B1%A4%E8%A4%A6

DiaryAction.javaのgetRealPathメソッドで取得した実際のパスの部分(Tennisディレクトリの下)にimageディレクトリを作成することで
画像アップロードの機能は実装することができました！！

↓実際のパス　
<div />C: \ ..\ ..\workspace\ .metadata\ .plugins\ org.eclipse.wst.server.core\ tmp0\ wtpwebapps\ Tennis\ image</div>


動いたことは動いたのですが、理解しようと思いコードリーディングをしていると
パスの設定の仕方が理解できませんでした。
<br>

↓赤枠の部分が今回調査しているところです。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/60528/9ae8074d-960f-fff0-68f0-fb34ffdb803e.png)

赤枠部分をimage2に変更し、相応の位置(Tennisディレクトリの下)にディレクトリを作成すれば
問題なく動くと思っていたのですが、画像のアップロードができませんでした。

いろいろ試したのですが、画像アップロードはimageファイルでしかできず、
他のところ、他のクラスやJSPでパスの設定をしているのでは？？
と思い、探したのですが見つけることができませんでした。


もし、なにかわかりそうな方やアドバイスをいただける方がいましたら教えていただきたい思います。

該当箇所が他のクラスやJSPの可能性があるので画像を載せたいのですが、
そうすると情報量の肥大化やかなり見づらくなる可能性があると考え、
もしご協力いただける心優しい方は、恐れ入りますが上記のサイトをご覧いただければと思います。
書き方は同じです。


少しわかりにくい内容になっているかもしれませんが、どうぞよろしくお願いします。
ハッシュアルゴリズムメモ

実用上のまとめ
============

+ SHA-2のsha256使っとけ

メモ本体
=======

暗号学的ハッシュ関数について言うと、既知だけど[MD5](http://ja.wikipedia.org/wiki/MD5)とか[SHA1](http://ja.wikipedia.org/wiki/SHA-1)はもう安全じゃない。今現役と思われるSHA2への攻撃はまだ成功してない。SHA3はドラフトまできてて、アルゴリズムは[Keccak](http://keccak.noekeon.org/)という名前らしい（読み方がわからん。[ケチャクかケチャック](http://ja.wikipedia.org/wiki/SHA-3)っぽい？）

暗号学的でない（DBMに使うような）ハッシュ関数について[調べた結果](http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed)を見ると、割と普通の範囲でも衝突が発生している。用途に支障なければ問題ないのか。

cdbが内部的に使ってる[djb-hash](http://www.cse.yorku.ca/~oz/hash.html)の定数5381は[魔法の定数](http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function/13809282#13809282)だそう。[cdb超絶速い](http://www.dmo.ca/blog/benchmarking-hash-databases-on-large-data/)けど、動的に内容を変えれないと用途が限定されるような。[dbskkd-cdb](https://github.com/jj1bdx/dbskkd-cdb)とか。

[Perfect hash function](http://en.wikipedia.org/wiki/Perfect_hash_function)っていうワードを見つけたけど、そういう魔法のようなものではなくて、[完全ハッシュ関数](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0#.E5.AE.8C.E5.85.A8.E3.83.8F.E3.83.83.E3.82.B7.E3.83.A5.E9.96.A2.E6.95.B0)に書いてあるとおり、条件が限定できるなら可能とのこと。なるほど。