OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby] チケットゴブル問題

[Ruby] チケットゴブル問題

結城浩さんのCodeIQ チケットゴブル問題
[https://codeiq.jp/ace/yuki_hiroshi/q863](https://codeiq.jp/ace/yuki_hiroshi/q863)
を解いて応募し、評価５をいただきました。これで４勝２敗です。これまで２連敗していたので、念入りに検算しました。ソースコードの後半は検算部分です。

POINT: うるう年の1月1日から12月31日までのチケットと考えて、帰国日順にソートしたあと、乗ることができて、かつ、もっとも早く帰国できるチケットを順に集めて解答としました。

貪欲法で、区間スケジューリング問題を解く問題でした。


```ruby:gobble.rb

# encoding: Shift_JIS
# gobble.rb
require 'date'
require 'time'
require 'pp'

if true & false
heredoc=<<HEREDOC
Austria 1/1-1/5
Belgium 1/6-1/10
Canada 1/7-1/8
Denmark 1/9-1/10
Egypt 1/18-1/30
Georgia 2/29-3/2
HEREDOC
  lines = heredoc.lines.to_a
else
  lines = Array.new
  File.open("tickets.txt",'r') { |r|
    while line = r.gets
      lines << line.chop
    end
  }
end

class Ticket
  attr_accessor :name, :from, :to
  def initialize(name,from,to)
    @name = name
    @from = from
    @to = to
  end
end

LEAP_YEAR = 2016
raise "leap error" if ! Date.new(LEAP_YEAR).leap?

tickets = Array.new
lines.each { |line|
  /(\S+)\s+(\d+)\/(\d+)-(\d+)\/(\d+)/ =~ line
  name = $1
  from_s = sprintf("%4d/%02d/%02d",LEAP_YEAR,$2,$3)
  to_s   = sprintf("%4d/%02d/%02d",LEAP_YEAR,$4,$5)
  from   = Time.parse(from_s).yday
  to     = Time.parse(to_s).yday
  printf("%20s #{from_s}-#{to_s} #{from}-#{to} \n",name)
  tickets << Ticket.new(name,from,to)
}
# pp tickets
#--------------------------------------------------
# 帰国日順にソートしたあと、乗ることができて、かつ、もっとも早く帰国できるチケットを順に集める
p '-'*20
courses = Array.new
fine = (-1)
tickets.sort { |a,b| a.to <=> b.to }.each { |t|
  if fine < t.from
    courses << t
    fine = t.to
  end
}
# pp courses
#--------------------------------------------------
# 国の名前をアルファベット順に並べる
p '-'*20
answer = "#{courses.size}"
courses.sort { |a,b| a.name <=> b.name }.each { |t|
  answer += " #{t.name}"
}
printf "[#{answer}]\n"
#--検算--------------------------------------------
p '-'*20
answer2 = "#{courses.size}"
tickets.each { |t|
    answer2 += " #{t.name}" if courses.include?(t)
}
printf "[#{answer2}]\n"

raise "sort error" if ! (answer == answer2)

#--------------------------------------------------
# 答えをファイルに保存
File.open("my_answer.txt",'w') { |f|
  f.puts answer
} if true

#--検算--------------------------------------------
p '-'*20
fine = (-1)
courses.each_with_index { |t,idx|
  # printf("%20s %2d %2d\n", t.name, t.from, t.to)
  from_time = Time.local(LEAP_YEAR,1,1) + (60*60*24*(t.from-1))
  to_time = Time.local(LEAP_YEAR,1,1) + (60*60*24*(t.to-1))
  printf("%2d %14s %d/%d-%d/%d\n", idx+1, t.name, 
    from_time.month, from_time.day,
    to_time.month, to_time.day)
  generate_line = sprintf("%s %d/%d-%d/%d",t.name,
    from_time.month, from_time.day,
    to_time.month, to_time.day)
  raise "line error" if ! (lines.include?(generate_line))
  raise "day error" if t.from <= fine
  fine = t.to
}
#--------------------------------------------------



```
実行している言語のバージョンを調べる

Qiita に投稿するのに [ideone](https://ideone.com/) で動作確認を行うことが多いのだが、
例えば動いているRubyのバージョンが何なのかを知ることができない。
（たぶんあるはずなんだけど）
確認するにはランタイムが自分のバージョンを出力すればよいので、まとめる。

# バージョンを出力するプログラム

## Ruby

```rb
puts RUBY_VERSION # => 1.9.3
```

## PHP

```php
<?php
echo phpversion(); // => 5.4.4-12
```

コメントより追加

```php
<?php
echo PHP_VERSION; // => 5.4.4-12
```
## Python

```py
import sys
print(sys.version) # => 3.2.3 (default, Sep 10 2012, 12:58:42) 
```

## .NET (by C#)

コメントで指摘を受け、 `System.Reflection.Assembly.GetExecutingAssembly().ImageRuntimeVersion`から修正

```csharp
public class Test {
  public static void Main() {
    System.Console.WriteLine(System.Environment.Version); // => 2.0.50727.1433
  }
}
```

[Environment.Version プロパティ](http://msdn.microsoft.com/ja-jp/library/system.environment.version.aspx)

> 共通言語ランタイムのメジャー バージョン番号、マイナー バージョン番号、ビルド番号、およびリビジョン番号を記述する Version オブジェクトを取得します。

[Assembly.ImageRuntimeVersion プロパティ](http://msdn.microsoft.com/ja-jp/library/system.reflection.assembly.imageruntimeversion.aspx)

> マニフェストを格納しているファイルに保存された共通言語ランタイム (CLR: common language runtime) のバージョンを表す文字列を取得します。

なるほど。

# 終わり

結果、予想以上にバージョンが古かった。
飽きた（というか自分はこの程度で十分な）ので続きはだれかよろしくお願いします。
build.gradle で junit に付いてくる hamcrest-core を使わずに hamcrest-all を利用する dependencies の書き方

# 概要

JUnit 4.11 を依存ライブラリに加えると勝手に hamcrest-core が付いてきちゃうのだけど、 hamcrest-core じゃなくて hamcrest-all を使いたいという場合の ``dependencies`` の書き方をメモっておく。

# build.gradle の記述例

```groovy
apply plugin: 'java'

sourceCompatibility = 1.5
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    testCompile (group: 'junit', name: 'junit', version: '4.11') {
        // これで hamcrest-core の依存を除外する
        exclude module: 'hamcrest-core'
    }

    // 改めて hamcrest-all の依存を追加する
    testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
}
```
ORACLEユーザー管理メモ

##ユーザー作成
```sql:ユーザー作成
 CREATE USER ユーザー名
 IDENTIFIED BY "パスワード"
 DEFAULT TABLESPACE USERS
 TEMPORARY TABLESPACE TEMP;
```
* DEFAULT TABLESPACEはユーザーが作成するテーブルの保存先を指定する。USERS領域を指定。 
* TEMPORARY TABLESPACEは大量のソートや表結合など一時的な作業領域を指定する。TEMP領域を指定。

##ユーザー権限の確認

```sql:ユーザー権限確認
SELECT * FROM USER_SYS_PRIVS;
```
* 現在ログインしているユーザーの権限を確認できる。

##ユーザー権限の付与
```sql:システム権限付与
GRANT 権限 TO ユーザー名 ;
```
* データベース全体に対する操作権限を付与。

```sql:オブジェクト権限付与
GRANT 権限 ON テーブル名 TO ユーザー名 ;
```
* 指定したテーブルに対する操作権限を付与。 
* 権限にALLを指定するとすべての操作が可能。


#ユーザー権限の削除
```sql:システム権限の削除
REVOKE 権限 FROM ユーザー名 ;
```

```sql:オブジェクト権限の削除
REVOKE 権限 ON テーブル名 FROM ユーザー名 ;
```
[scala] java.lang.IllegalArgumentException: !": event not found エラー

## 事象
論理演算子「!=」を使うとコンパイラーで
「java.lang.IllegalArgumentException: !": event not found」エラーがでる。

```
$ ( 30 != 30 )
```

事象発生バージョン
```
$ scala -version
Scala code runner version 2.11.0-M4 -- Copyright 2002-2013, LAMP/EPFL
```

## 原因
scalaのバグ。
[参考サイト](https://groups.google.com/forum/#!msg/scala-user/u2ADAHY7vis/wD43Zrrw2bsJ)

## 回避法
バージョンアップするか、バージョンダウンする

今回は、brewでバージョンダウンした。

### Homebrewに存在するscalaのバージョン確認

```
$ brew versions scala

Warning: brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
2.11.0   git checkout 7d1c149 Library/Formula/scala.rb
2.10.4   git checkout d64edec Library/Formula/scala.rb
2.10.3   git checkout 7c65743 Library/Formula/scala.rb
2.10.2   git checkout 03b5e3d Library/Formula/scala.rb
2.10.1   git checkout 39f9385 Library/Formula/scala.rb
```

### scalaバージョン切替え

```
$ git checkout d64edec /usr/local/Library/Formula/scala.rb
$ sudo brew upgrade scala
==> Upgrading 1 outdated package, with result:
scala 2.10.4
==> Upgrading scala
==> Downloading http://www.scala-lang.org/files/archive/scala-2.10.4.tgz
######################################################################## 100.0%
==> Downloading https://raw.github.com/scala/scala-dist/27bc0c25145a83691e3678c7dda602e765e13413/completion.d/2.9.1/scala
Already downloaded: /Library/Caches/Homebrew/scala--completion-2.9.1
==> Caveats
To use with IntelliJ, set the Scala home to:
  /usr/local/opt/scala/idea

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
?  /usr/local/Cellar/scala/2.10.4: 103 files, 32M, built in 2.1 minutes

```

### scalaバージョン確認
```
$ scala -version
Scala code runner version 2.10.4 -- Copyright 2002-2013, LAMP/EPFL
```


## 感想
まさかscalaのバグだとは、、
ググってみるとすぐに原因が分かった。
先人に感謝(´▽｀)ｱﾘｶﾞﾄ!
プロトコルを理解する

プロトコルはjavaでいうところのインターフェイスに近い。
クラスの実装はどうあれプロトコルに準拠したオブジェクトは
実装しなければいけないメソッドが決定される。（オプションでなければ実装しなければならない）
objective-cではデリゲートの実装によく登場する。

検証のため
プロトコル定義　FooProtocol
プロトコル準拠クラス　Bar
を考える。

FooProtocolでは、@optional（実装が必須ではない）でfooメソッドを定義し、
@reqired（実装が必須）でfoofooを定義している。

BarクラスはFooProtocolに準拠しているのでfoofooメソッドの実装を行う。

流れとしては以上。
参考までに検証用のコードを以下に示す。

※@requiredを指定したはずのfoofooをBarにて実装を削除して
[bar foofoo]も削除、でも警告（foofooの実装をしないさいという警告）がでただけ。
必須だからコンパイルエラーではじくと思ったのだが。。警告レベルというのは注意が必要かも。


【プロトコルの定義　FooProtocol】

```objc:FooProtocol.h
#import <Foundation/Foundation.h>

@protocol FooProtocol <NSObject>
@optional
-(void)foo;
@required
-(void)foofoo;
@end
```

【プロトコルの実装クラス Bar】

```objc:Bar.h
#import <Foundation/Foundation.h>
#import "FooProtocol.h"

@interface Bar : NSObject <FooProtocol>
-(void)foofoo;
@end
```

```objc:Bar.m
#import "Bar.h"

@implementation Bar
-(void)foofoo
{
    NSLog(@"foofoo is called");
}
@end
```

【メイン関数】

```objc:main.m
#import "Bar.h"

int main(int argc, const char * argv[])
{
    
    id bar = [[Bar alloc] init];
    [bar foofoo];
    
    return 0;
}
```
近日発売の Ruby on Rails 本（日本語）メモ


[Ruby on Rails 4 アプリケーションプログラミング](http://www.amazon.co.jp/dp/4774164100/)
大型本: 544ページ
出版社: 技術評論社 (2014/4/11)
言語: 日本語
ISBN-10: 4774164100
ISBN-13: 978-4774164106
発売日： 2014/4/11

[実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング](http://www.amazon.co.jp/dp/4844335928/)
単行本（ソフトカバー）: 536ページ
出版社: インプレスジャパン (2014/5/23)
言語: 日本語
ISBN-10: 4844335928
ISBN-13: 978-4844335924
発売日： 2014/5/23


[パーフェクト Ruby on Rails](http://www.amazon.co.jp/dp/4774165166/)
大型本: 432ページ
出版社: 技術評論社 (2014/6/6)
言語: 日本語
ISBN-10: 4774165166
ISBN-13: 978-4774165165
発売日： 2014/6/6
MacOS10.8+Vagrantでpublicネットワークでnfsも使う


## 環境

MacOS: 10.8.5
Vagrant: 1.5.3
VirtualBox: 4.3.10
GuestOS: CentOS6.3

## Vagantfile

publicネットワークでのsynced_folderをrsyncではなく、nfsを使いたいが、host_onlyネットワークでないと使えない。

そこで、host_onlyネットワークと、publicネットワークの両方を指定して、host_onlyネットワークはnfsのためだけに利用することにした。

```
  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.network "public_network", ip: "192.168.207.50"

  config.vm.synced_folder "../apps", "/apps", :nfs => true

```

ゲストOSでifconfigすると、eth1にhostonlyネットワーク、eth2にpublicネットワークが割り当てられているのがわかります。

```
eth1      Link encap:Ethernet  HWaddr 08:00:27:EF:41:8A  
          inet addr:192.168.33.10  Bcast:192.168.33.255  Mask:255.255.255.0

eth2      Link encap:Ethernet  HWaddr 08:00:27:DD:2A:83  
          inet addr:192.168.207.50  Bcast:192.168.207.255  Mask:255.255.255.0

```

rsyncはとっても遅いが、nfsだと、快適にソースコードの修正を反映してくれます。
linux-boxをhub化する

**覚え書き**
## linux-boxをハブ化する
2つのNIC(eth0,eth1)をブリッジさせてHUBとして動作させます。OSはCentOS6.5です。

* パッケージをインストールする
`# yum install bridge-utils`

* インターフェース設定ファイルを編集する

 /etc/sysconfig/network-script/ifcfg-eth[0|1]の内容
 `DEVICE=eth0  (or eth1)
HWADDR=xx:xx:xx:xx:xx:xx  (actual mac address)
ONBOOT=yes
TYPE=Ethernet
BRIDGE=vbr0`



 /etc/sysconfig/network-script/ifcfg-vbr0の内容
 `DEVICE=vbr0
 BOOTPROTO=static
 IPADDR=192.168.20.1
 NETMASK=255.255.255.0
 ONBOOT=yes
 TYPE=Bridge
 STP=off`

* ネットワーク再起動
`# service network restart`
サーバーの基礎知識

# リモート

（＝リモコンみたいな）

サーバーと自分が別々の場所にいてもネットワーク越しに操作できる（＝サーバーに入れる）。

① 物理的に同じ場所にいて、直接つないで使うのがローカル
　　⇒現実的ではない。
② サーバーと自分が別々の場所いいてネットワーク越しに使うのがリモート

# SSH

（＝身元を確認した上でサーバーに入れてくれる）

・SSHは、secure shellの略
・リモートのサーバーと自分のPCを安全に繋げてくれるサービスのこと
### FTP・FFFTP
暗号化しない
### SSH・SFTP/SCP
暗号化する

# 鍵認証

例）
SSH　＝　サーバーの守り神

サーバーに入りたい人は、ユーザー名とパスワードを使って入る。

けど、パスワードだと、短いと知られてしまうし、長いと覚えられない。

ので、【ユーザー名と秘密鍵】を使って入る。

[サーバー][守り神]　←　[サーバーに入りたい人]
　　　≪公開鍵≫　　　　　　　　鍵認証
　　　　　｜　　　　　　　　　　　｜
　　　　　 ――――――――――――
                   　　　　　　　　　　　｜
　　　　　　　　　　ペアだ！

→ただ、PCを丸ごと盗まれたらだめ。
　⇒盗まれても「パスフレーズ」を知らないとサーバーに入れない。

→秘密鍵は絶対にPCから出さない。

秘密鍵の最初の設定が面倒だが、簡単に侵入できたら困るからしょうがない。
日々アタックを受けているので、しっかり守るため情報セキュリティの対策は大事。

# GW（ゲートウェイ）

（＝ビルの入館ゲートのようなもの）

[サーバーに入りたい人]　→　[SSH守り神][ゲートウェイサーバー]　→　サーバー
　　　　　｜　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　↑
　　　　　 ―――――――――――――――――――――――――――――――
　　　　　　　　　　　×　GWを通らないと入れません。

・開発GWは一人につきひとつ！

##なぜGW使うのか：

### ①より高度なセキュリティ
SSH　→　ポート番号22番（デフォルト）
　　　　　　　　（ドア番号）
＝　例）SSH守り神がたくさんあるドアの中の22番ドアに入っている。

### ②脆弱性が発見されたときに、すぐに対応するため
GWを踏み台にしていれば、GWだけに対応すればよい。楽。

# エージェントフォワーディング　(agent forwarding)

（＝PCから秘密鍵を持ち出さずに秘密鍵を使えるもの）

パソコンから秘密鍵を使わず、
・PCから開発GWに入る　⇒　OK
・開発GWからサーバーに入る

[鍵の番人][秘密鍵]　⇒　[サーバー入りたい人][GW]　⇒　[SSH守り神][サーバー]

↓　

[鍵の番人]　⇒　[秘密鍵][サーバー入りたい人][GW]　⇒　[SSH守り神][サーバー]

なにでエージェントフォワードができるのか：
Mac：SSHエージェント     
Win: WinSCP                  

Q:なぜGWに秘密鍵を置けるのか？

A:GWに侵入してもサーバーには行けないから大丈夫。

[サーバーに入りたい人]　⇒トンネル⇒　[GW]　⇒セッション⇒　[サーバー]
hgwebdirとApacheでMercurialのリポジトリを参照できるようにする


## 前提条件

- OS: Amazon Linux
- webサーバ: Apache
- webサーバ上のパス: /hg
- Mercurialリポジトリ: /var/hg/repos/*


## インストール

Mercurialをインストール。

```
yum install mercurial
```

Mercurialのリポジトリと設定ファイル等を置くためのディレクトリを作成。

```
mkdir -p /var/hg/repos
chown -R apache:apache /var/hg
```

hgweb.cgiを[Mercurialの公式リポジトリ](http://selenic.com/hg)から取得して/var/hg/に置く。

ファイルを置いたらパーミッションを変更。

```
chmod +x /var/hg/hgweb.cgi
```

hgweb.cgiの設定ファイルを作成。

```ini:/var/hg/hgweb.config
[paths]
/hg = /var/hg/repos/*

[web]
encoding = UTF-8
```

```apache:/etc/httpd/conf.d/hg.conf
ScriptAlias /hg "/var/hg/hgweb.cgi"
```
setDateFormat:@"yyyy-MM-DD HH:mm:ss"で日時がずれる

##setDateFormat:@"yyyy-MM-DD HH:mm:ss"で日時がずれる


```objc
    NSString *firstDate = @"2014-05-20 16:47:00";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-DD HH:mm:ss"];
    NSDate *setDate = [dateFormatter dateFromString:firstDate];

    NSLog(@"firstDate: %@", firstDate);
    NSLog(@"setDate: %@", setDate);
```
でlogを吐くと、

```
firstDate: 2014-05-20 16:47:00
setDate: 2014-01-20 07:47:00 +0000
```

となって月と時間がズレる。

時間がズレるのはGMTとJSTの差によるもの（参考：http://www.yoheim.net/blog.php?q=20120902）
だから理解できるけど、なぜか月がズレる…？



##原因


**@"yyyy-MM-DD HH:mm:ss" -> @"yyyy-MM-dd HH:mm:ss"**

```objc
    NSString *firstDate = @"2014-05-20 16:47:00";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *setDate = [dateFormatter dateFromString:firstDate];

    NSLog(@"firstDate: %@", firstDate);
    NSLog(@"setDate: %@", setDate);
```
に変えると

```
firstDate: 2014-05-20 16:47:00
setDate: 2014-05-20 07:47:00 +0000
```

で月のズレがなおる


##結論
*MMに引きずれてDDにしないように！*



##ちなみに

yyyy → YYYY　

だと年がズレる問題もあるらしい（参考：http://ios.steppers-hi.net/?eid=16）
よく使うコマンドのメモ

よく使うコマンドの備忘録

##UNIX
コマンド|メモ
:------|:------
mkdir directory|ディレクトリを作成
cp -i file copy_file|ファイルを別名でコピー（同名の上書き確認をする）
mv file rename_file|ファイル名を変更
rm -f file|ファイルを警告無しで削除
rm -rf directory|ディレクトリごと警告無しで削除
grep -r 'XYZ' ~/|ホームディレクトリ以下の文字列「XYZ」の検索

##git
コマンド|メモ
:------|:------
git log --grep #12345|チケット#12345に関するコミットログを抽出
git log origin/feature_12345..feature_12345|feature_12345ブランチでpushしていないcommitを確認
Unity3D BEAD プラグイン for iOS and Androidで広告を表示する


BEADのUnity用プラグインを組み込む際にかなり手間がかかったので他の人が同じような事にならないようにメモを残す。

# BEADとは

BEADでは最近のカジュアルゲームで頻繁に見るダイアログ型広告を提供してくれる。

![IMG_1910.PNG](https://qiita-image-store.s3.amazonaws.com/0/16400/4f7fe6f2-52f9-3c6b-5871-fd6d27fc2b22.png "IMG_1910.PNG")

ちなみにBEADの読み方はビードと読むらしい。
http://bead-ad.com/lp/

# ダイアログ型広告が表示できない時

ダイアログが表示できない時にチェックする項目は次の通り

- 広告枠フォーマットが「レクタングル大 (300 x 250) 」になっているか確認する
- XcodeのLinked Frameworks and Librariesからリファレンス指定のフレームワークが全て読み込まれているか確認する
- XcodeのBuild setting で“Other Linker Flags”に –ObjC と–all_load に追加する

それぞれ詳細は次に述べる

## 広告枠フォーマットを「レクタングル大 (300 x 250) 」

広告枠フォーマットは管理画面からあらかじめ設定するが、この項目は初回しか設定できない。表示できない場合はまずここを確認すること。

また、まずはBEADプラグインに同梱されているサンプルプロジェクトとサンプルシーンを実行して実機で確認することがオススメで、サンプルで表示できない場合はこの広告枠フォーマットが間違っている可能性がある。

## XcodeのLinked Frameworks and Libraries

利用するフレームワークを指定しているかをチェックすること。

## XcodeのBuild setting で“Other Linker Flags”

“Other Linker Flags”に –ObjC と–all_loadを追加せずに実行した場合、[UIImage animatedImageWithAnimatedGIFData]が見つからないというエラーによりアプリケーションはクラッシュする。

おそらくこれはカテゴリでUIImageに対してアニメーションGIFを表示するメソッド追加を有効にしているのだろう。

正直、このためだけならカテゴリでUIImageを拡張せずコーディングすることでこのような設定の手間を省いてもらいたい。UnityではXcodeのプロジェクトファイルを生成するため、その設定をわざわざ毎回変更するのは手間になり非常にバランスが悪い作りになっている。


またリファレンスではBuild settingsについて最後の方に書かれていて分かりづらい。これはフレームワークの設定周辺に書いてあるべきだと思う。
Lynx(テキストブラウザ)を使ったブラウジング


## 目的

Googleがクロールしやすいようにマークアップできているか確認する。

[ウェブマスター向けガイドライン（品質に関するガイドライン）](https://support.google.com/webmasters/answer/35769)
>Lynx などのテキスト ブラウザを使用して、サイトを確認します（ほとんどの検索エンジンのスパイダーには Lynx で見えるようにサイトが映ります）。JavaScript、Cookie、セッション ID、フレーム、DHTML、Flash などの特殊な機能が使用されているためにサイトの一部がテキスト ブラウザで表示されない場合、検索エンジンのスパイダーがサイトをうまくクロールできない可能性があります。

## 検証環境

OSX 10.9.3

## セットアップ

### Lynxをインストールする

```shell-session
$ curl -O http://lynx.isc.org/lynx2.8.7/lynx2.8.7.tar.bz2
$ tar xjvf lynx2.8.7.tar.bz2 
$ cd lynx2-8-7
$ ./configure --with-ssl && make
$ sudo make install
```


### 日本語表示に対応する

```shell-session
$ sudo vi /usr/local/etc/lynx.cfg
```

下記の項目を設定する

```
CHARACTER_SET:utf-8
```


## ターミナルからブラウジングする

```
$ lynx http://yahoo.co.jp/
```
javascriptでタイピングゲームを作るためのライブラリ

以前せっかく作ったものの自分ではほとんど使っていないのでせっかくなので宣伝。
[Typing.js](https://github.com/yaegaki/typing)

複数の入力方法があるものにはすべて対応したつもり。(「っ」なら「ltu, xtu」など)
FormTypeにサービスコンテナなどをインジェクションする方法

DoctrineなどのQueryBuilderで取得した項目をフォームで利用するなど当たり前の事なのですが、これがSymfony2ではインジェクションをしないことには実装できません。意外とややこしいのです。

例えば

```php
class ExampleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $em = $this->getDoctrine()->getManager();
        $entities = $em->getRepository('AcmeUserBundle:user')->findAll();

        $choices = array();
        foreach($entities as $entity)
        {
            $choices[$entity->getId()] = $entity->getName();
        }
        $builder
            ->add('column_name', 'choice', array( 'choices' => $choices )))
        ;
    }
```

なんて事ができればいいのですが、インジェクションしないとこれは動きません。で！どのようにするかというと、service.yml に インジェクションするコンストラクタを設定定義してます。この定義した内容を formTypeをnewする際にコントローラー側から getします。コード見ないときっとわかりにくいかと思います。

まずは service.yml ですが、各bundle内でも構いませんし、appの中でも構いません。bundleの中に記述したほうが分かりやすいと思ってます。

service.yml の内容

```yaml
services:
    acme_user.user.form.type:
        class: Acme\UserBundle\Form\UserType
        arguments: ["@doctrine.orm.entity_manager", "@service_container"]
        tags:
            - { name: form.type, alias: app_user_user }
```

@doctrine.orm.entity_manager
@service_container

は php app/console container:debug で一覧表示できますが、細かい動作の内容についてはsensioのソースの中を調べることになります。自分で書いたservice.ymlも同じようにコンストラクタとしてインジェクション出来ます。便利ですね。

続いてformTypeクラスのコンストラクタを記述します。先の動作しないformTypeを書き換えます。__construct を実装している所がポイントです。

```php
class ExampleType extends AbstractType
{
    private $doctrine, $service_container;
    // private $user;

    public function __construct($doctrine, $service_container)
    {
        $this->doctrine = $doctrine;
        $this->service_container = $service_container;
        /* 下記のように予め書いておくことでUserにもアクセスできます。 */
        // $this->user = $service_container->get('security.context')->getToken()->getUser();
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $entities = $this->doctrine->getRepository('AcmeUserBundle:user')->findAll();

        $choices = array();
        foreach($entities as $entity)
        {
            $choices[$entity->getId()] = $entity->getName();
        }
        $builder
            ->add('column_name', 'choice', array( 'choices' => $choices )))
        ;
    }
    public function getName()
    {
        return 'app_user_user'; /* service.ymlのalias名を入力 */
    }
```

このformTypeをコントローラーからアクセスします。

```php
$form = $this->createForm($this->get('acme_user.user.form.type'), $entity, array(
    'action' => $this->generateUrl('user_create'), // you should fix
    'method' => 'POST',
));
```

という感じで $this->get(‘service.ymlで定義した名前’); という風に クラスを new します。すると service.yml 経由で目的のクラスをインジェクションすることが出来ます。

多用するの結構面倒なんですよね。service.ymlの記述とコンストラクタをつくるところや、formtypeをnewするところなどポイントは多々ありますが、テンプレを作って動くサンプルを作ることがポイントね。
Symfony2でPagerを実装する方法

Symfony2にはページャーが標準ではありません。と言っても標準につけるくらいの機能ではないというのも実際で。

まずは準備から。config.ymlにはこうのように登録

```yaml
services:
    pager:
        class: Acme\BlogBundle\Classes\Pager
        arguments: ["@service_container", "@doctrine.orm.entity_manager"]
        scope: request
```

Acme\BlogBundle\Classes\Pager に Pager.php を作成して下記の内容にします。

```php
<?php

namespace App\BlogBundle\Classes;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class Pager
{

    var $entityManager;
    var $serviceContainer;

    var $inc;
    var $offset;
    var $count;
    var $is_next = true;
    var $path;

    public function __construct($serviceContainer, $entityManager)
    {
        $this->serviceContainer = $serviceContainer;
        $this->entityManager = $entityManager;

        $this->offset = $this->serviceContainer->get('request')->get('offset');
        if(!$this->offset) $this->offset = 0;
        if(!preg_match('/^\d{1,}$/', $this->offset)) $this->offset = 0;

    }
    public function setPath($path){
        $this->path = $path;
    }
    public function setInc($inc){
        $this->inc = $inc;
    }
    public function getRepository($namespace, $where = array(), $orderby = array()){

        $entities = $this->entityManager->getRepository($namespace)->findBy(
            $where,
            $orderby,
            $this->inc,
            $this->offset
        );
        $this->count = count($entities);
        $this->is_next = $this->count >= $this->inc ? true : false;

        return $entities;

    }
    public function getParameters(){

        return array(
            'next' => $this->offset + $this->inc,
            'prev' => $this->offset - $this->inc,
            'current' => $this->offset,
            'is_next' => $this->is_next,
            'inc' => $this->inc,
            'count' => $this->count,
            'path' => $this->path
        );
    }
}
```

Acme/BlogBundle/Blog/Resources/Views/Blog に pager.parts.html.twig を保存内容は下記の通り

```html
<p>
{% if pager.prev >= 0 %}
<a href="{{ path(pager.path, {'offset': pager.prev}) }}" class="btn">前へ</a>
{% endif %}

{{ pager.current }}件 から {{ pager.count }} 件を表示

{% if (pager.next >= 0 and pager.is_next) %}
<a href="{{ path(pager.path, {'offset': pager.next}) }}" class="btn">次へ</a>
{% endif %}
</p>
```

これで準備は整いました。ではControeller、Templateの２箇所にコードを書きます。

Controllerでは下記のように。

```php
$pager = $this->get('pager');
$pager->setInc(20); // 20件表示
$pager->setPath('blog'); // ページのrouting path

$entities = $pager->getRepository('AcmeBlogBundle:Blog',array('createdUser' => $this->getUser()), array('id' => 'DESC')); /* namespace, where, orderby の引数です */

return $this->render('AcmeBlogBundle:Blog:index.html.twig', array(
    'pager' => $pager->getParameters(),
    'entities' => $entities,
));
```

AcmeBlogBundle:Blog:index.html.twigのテンプレートにはこう書いてください

```php
{% include 'AcmeBlogBundle:Blog:pager.parts.html.twig' %}
```
Windows8 必要な画像たち


windows8 ストアアプリでは様々な解像度に対応するため、iOSの@2xより多い、4種画像を用意できます。
用意しなくてもいいですが、ピクセル等倍あると綺麗です。

## 名前のルール

- Logo.scale-80.png
- Logo.scale-100.png
- Logo.scale-140.png
- Logo.scale-180.png

ッて感じで、
*.scale-{拡大率}.png
のルールで名前をつけます

## 画像一覧

| 名前             | 80%     | 100%    | 140%    | 180%    | デフォルト名   |
|-----------------|---------|---------|---------|---------|--------------|
| 70正方形         | 56x56   | 70x70   | 98x98   | 126x126 | ---          |
| 150正方形        | 120x120 | 150x150 | 210x210 | 270x270 | Logo         |
| 310x150ワイド    | 248x120 | 310x150 | 434x210 | 558x270 | ---          |
| 310正方形        | 248x248 | 310x310 | 434x434 | 558x558 | ---          |
| 30正方形         | 24x24   | 30x30   | 42x42   | 54x54   | SmallLogo    |
| ターゲットサイズ   | 16x16   | 32x32   | 48x48   | 256x256 | ---          |
| ストアロゴ        | ---     | 50x50   | 70x70   | 90x90   | StoreLogo    |
| バッジロゴ        | ---     | 24x24   | 33x33   | 43x43   | ---          |
| スプラッシュ      | ---     | 620x300 | 868x420 | 1116x540 | SplashScreen |


![win8_screens.jpg](https://qiita-image-store.s3.amazonaws.com/0/14330/157ec94c-2ab2-0506-1b97-21adb5011b62.jpeg "win8_screens.jpg")


## 自動書き出しスクリプト ...マックですが

https://gist.github.com/asus4/6339ba10e648c80f188a
homebrewでtapに含まれるパッケージのバージョン変更をする


パッケージのバージョン変更は、本来、以下の手順で行う。

```
$ brew versions nkf
Warning: brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
2.1.3    git checkout b0ebf92 Library/Formula/nkf.rb
2.1.2    git checkout 9ad1b87 Library/Formula/nkf.rb
2.1.0    git checkout d0efd9e Library/Formula/nkf.rb
$ cd `brew —prefix`
$ git checkout b0ebf92 Library/Formula/nkf.rb
$ brew upgrade nkf
```

上記では、まずnkfのバージョンを確認し、その中で、2.1.3を使うことにする。その後、brew —prefixで出力される管理ディレクトリに移動し、表示されたチェックアウトコマンドを実行し、最後にパッケージのアップグレードを行う。

しかし、brew tapで導入されたパッケージはbrew —prefixに移動しても、バージョンを更新することができない。

```
$ brew versions opencv
Please use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
2.4.9    git checkout 14b5b58 opencv.rb
2.4.8.2  git checkout 66d06fd opencv.rb
2.4.7.1  git checkout ebc5b15 opencv.rb
2.4.6.1  git checkout 9c5be73 opencv.rb
2.4.5    git checkout ae74fe9 opencv.rb
2.4.4a   git checkout 3efa797 opencv.rb
2.4.4    git checkout d85d011 opencv.rb
2.4.3    git checkout 8cb3f45 opencv.rb
2.4.2    git checkout b64b319 opencv.rb
2.4.1    git checkout 3d32cf1 opencv.rb
2.4.0    git checkout 2a8c46b opencv.rb
2.3.1a   git checkout cdaf83d opencv.rb
2.2      git checkout 032047f opencv.rb
2.1.1-pre git checkout 2438f42 opencv.rb
$ cd `brew —prefix`
$ git checkout 14b5b58 opencv.rb
error: pathspec '66d06fd' did not match any file(s) known to git.
error: pathspec 'opencv.rb' did not match any file(s) known to git.
$ git ls-files | grep opencv
$ 
```

実際にそれを試してみたのが、上記のコマンドの例である。コマンドでは、homebrew/scienceに含まれるopencvパッケージのバージョンを変更しようとしているが、gitの管理対象外だとエラーが出力されている。

色々と調べてみると、そもそもtapのリポジトリは、prefixのLibrary/Tapsの下で別途管理されているらしい。

そこで、以下のようにしたら、望み通りアップグレードすることができた。

```
$ cd `brew —prefix`
$ cd Library/Taps/homebrew/homebrew-science
$ git checkout 66d06fd opencv.rb
$ git upgrade opencv
```

この内容、あまり書いていないので、記事にしてみた。困っている人がいたら、活用してください。
NumPy の配列操作 (1)

# なぜ Python を使うのか

もう一度、原点に立って考えてみましょう。統計や機械学習について Python を使う理由は何でしょうか。筆者は次のように考えています。

* Python 自体はグルー言語として万能性がある
* 数学、統計、機械学習などの科学計算用のライブラリが非常に豊富であり他の一般的な言語の追随を許さない域にある
* C/C++ や FORTRAN などで書かれた線形代数などの数学ライブラリを呼び出すためインタプリタ言語でありながら数理計算部分が高速である

純粋に言語としての魅力を語るのであれば Haskell や Ruby など他にもたくさん種類があるでしょう。また、単純に統計数理計算をするだけであれば R 言語がよく知られています。また金融計算や統計分析用のソフトウェアについては有償のものもあります。しかしながら、計算に特化した科学アプリケーションと、一般的なシステム処理を同時に問題解決する言語としては、まず Python が候補に挙がるのではないでしょうか。

そしてこれら Python による多次元配列計算をはじめとする科学計算・各種数理計算の基礎になるライブラリが [NumPy](http://www.numpy.org/) です。

今回からしばらく NumPy の配列操作に焦点を当て、その強力な機能について理解を深めていきます。

## np.ndarray オブジェクト

NumPy の ndarray オブジェクトはストライドデータ (連続的なデータ) を N 次元配列として扱うためのクラスです。

一般的なプログラミング言語でこのようなライブラリの助けなく多次元配列を扱おうとすると、複雑にネストしたリスト (配列) と、それを計算するためのこれまた複雑にネストした多重のループが必要になってしまいます。これでは現実的ではありませんから、科学計算において多次元配列ライブラリの良し悪しは要とも言えるでしょう。

### ndarray の長所と短所

ndarray と多重リスト (配列) において ndarray が有利な点を挙げてみます。

* ndarray は行列を対象とした多くの高度な数学的操作を多重リストより容易かつ高速に適用できます。
* 配列中の全要素やもしくは一部の要素に対してまとめて演算や関数を適用することで高速な処理が可能です。

一方、 ndarray が不利な点を挙げてみます。

* 多重リストはリスト内でその要素の型が異なっても良いです。しかし ndarray は基本的に全て同じ型の要素で構成されていなければなりません。
* ndarray は各次元ごとの要素数が等しくなければなりません。

このあたりは、数学的とくに線形代数の観点からみると、むしろ当たり前と言えるのではないかと思います。

### ndarray の構成要素

ndarray はストライド (歩幅) を内部的に持っており、配列オブジェクトは dtype (データ型) 、形状、ストライドという要素を持ちます。

配列の形状は shape 関数でアクセスすることができます。またストライドは strides 関数でアクセスできます。

```py3
np.zeros((3,4))
#=> array([[ 0.,  0.,  0.,  0.],
#          [ 0.,  0.,  0.,  0.],
#          [ 0.,  0.,  0.,  0.]])

np.zeros((3,4)).shape
#=> (3, 4)

np.zeros((3,4)).strides
#=> (32, 8)
# 各次元の方向に要素を 1 つ進めるために必要な「歩幅」を示すバイト値
```

## インデックス参照

### スライシング

2 次元以上の配列の場合、インデックスで参照した先は 1 次元以上の配列になります。

```py3
arr = np.array( [[[1,2,3], [4,5,6]], [[7,8,9],[10,11,12]]] )

arr.ndim # 次元数
#=> 3

arr[0]
#=> array([[1, 2, 3],
#          [4, 5, 6]])
# 2 次元配列が返る
```

インデックスに配列を指定するとその分次元数を削減した配列を取り出せます。

```py3
arr[1,0]
#=> array([7, 8, 9])

arr[1,0,2]
#=> 9
```

### ファンシーインデックス参照

多次元配列からある特定の順序で抽出をおこないたいときに、その順番を示す整数のリストまたは ndarray をインデックス参照として渡すことができます。

```py3
arr[[1,0]]
#=> array([[[ 7,  8,  9],
#           [10, 11, 12]],
#          [[ 1,  2,  3],
#           [ 4,  5,  6]]])

arr = np.arange(48).reshape((4,3,4))
#=> array([[[ 0,  1,  2,  3],
#           [ 4,  5,  6,  7],
#           [ 8,  9, 10, 11]],

#          [[12, 13, 14, 15],
#           [16, 17, 18, 19],
#           [20, 21, 22, 23]],

#          [[24, 25, 26, 27],
#           [28, 29, 30, 31],
#           [32, 33, 34, 35]],

#          [[36, 37, 38, 39],
#           [40, 41, 42, 43],
#           [44, 45, 46, 47]]])

arr[[0,0,1],[0,1,0],[0,0,2]]
#=> array([ 0,  4, 14])
# (0,0,0), (0,1,0), (1,0,2) の位置にある要素が取り出される
```

## まとめ

まずは基本的なインデックス参照について紹介しました。これらの参照ではメモリ上でオブジェクトがコピーされておらず、すべてデータに対するストライドビューで提供されています。これが ndarray の特徴のひとつです。
コンソールでタブ文字を入力する

コンソールでタブ文字は`^V<Tab>`で挿入できます。（普通にタブ押すと自動補完が起動する。）

（せっかくなので[抜粋](http://qiita.com/ginpei/items/38c55618d2f0d901a6cf)）
branchをpushするフロー

# tortoiseGitの場合

## ブランチを切る

`TortoiseGit`　→　`Create Branch`

![6.png](https://qiita-image-store.s3.amazonaws.com/0/44278/b116067c-ff49-c86b-5ad7-7c8a1d0faa4c.png)

↓

`Create Branch`　例）dev_sassというブランチつくる

![7.png](https://qiita-image-store.s3.amazonaws.com/0/44278/d53d44e7-b17b-d69c-e040-ae7f7be623e6.png)


↓

`Git Branch`からブランチ切り替えられます。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/44278/92408fbc-00aa-6fbf-0151-06ce72af6054.png)



## 作業ブランチにcommit

![9.png](https://qiita-image-store.s3.amazonaws.com/0/44278/ec80db29-5164-da4b-7570-1fb296976604.png)


## masterブランチに切り替え

↓

## pull

↓

## materに作業ブランチをmergeする

↓

## push
全ファイルのタブをスペースに置換

`find`で検索して`xargs`で各ファイルごとに`sed -i`で上書き保存。

```bash
find ./my-project/**/* -type f | xargs sed -e "s/  /  /g" -i
```

コンソールでタブ文字は`^V<Tab>`で挿入できます。（普通にタブ押すと自動補完が起動する。）

バイナリを無視するオプションとかもあるのかな。今回はgit管理下だったので、`git checkout images/`で戻しました。

もっと簡単な方法教えてください……。
Encoding::UndefinedConversionError from Windows -31J to UTF-8

`Encoding::UndefinedConversionError from Windows -31J to UTF-8`

解決法：

コマンドに`chcp 65001`と打つ

なぜ：

コマンド上の文字コードの問題。
windowsはshift_JISがデフォルトなので、UTF-8に直す必要があった。
iOSでFlurry Analyticsを使ってみる


##Flurry Analyticsとは
iOSやAndroidで使える、モバイルアプリ解析サービス。
無料で使える。

##できること
ユーザ数、アクティブユーザ数のカウントとかエラー集計とかその他いろいろをブラウザ上の管理画面でグラフで表示してくれたり、見やすく表示してくれる。

##使ってみる

### 1. ユーザ登録
[http://www.flurry.com/](http://www.flurry.com/ 'Flurry')でサインアップ

### 2. SDKをダウンロード
[https://dev.flurry.com/uploadVersionSelectProject.do](https://dev.flurry.com/uploadVersionSelectProject.do 'Flurry SDK')でFlurry iOS SDKをダウンロード

### 3. ライブラリをプロジェクトに追加
`Flurry.h`と`libFlurry_xx.xx.xx.a`が含まれているFlurryフォルダをプロジェクトにドラッグアンドドロップ。

`SystemConfiguration.framework`と`Security.framework`もプロジェクトに追加。

###4. Application Delegateで初期化

```AppDelegate.m
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
     //Flurryをクラッシュレポーティングツールとして使う場合はYES
     //他のクラッシュレポーティングツールを使用している場合はNO
     //iOSでは一つのクラッシュレポーティングツールしか使えない
    [Flurry setCrashReportingEnabled:YES];

    // APIキーはDLしたSDK内のProjectApiKey.txtに記述されている
    [Flurry startSession:@"YOUR_API_KEY"];
}
```

これだけで、以下の情報が取得できるらしい。

```
* Sessions
* Active Users
* New Users
* Session Length
* Frequency of Use
* Benchmarks
* Page Views 
* Custom User Segments
* User Paths
* Lifecycle Metrics
* User Retention
* Version Adoption
* Cross-App Usage
* iOS Category Interests 
* Demographic Estimates
* Time of Day Reporting
* Geographic Usage
* Language Metrics
* Devices
* Darriers
* Firmware Versions 
```

###5. イベント登録
たとえば、あるボタンのタップイベントを登録する場合。

```
//ボタンがタップされると呼ばれるメソッド
- (IBAction)tap:(id)sender
{
	//Button Tappedというイベントを登録
    [Flurry logEvent:@"Button Tapped"];
}
```

これで、管理画面のEventsに`Button Tapped`というイベントが表示され、タップ数とかが集計される。

以下のようにして、パラメータを渡すこともできる。

```
//ボタンがタップされると呼ばれるメソッド
- (IBAction)tap:(id)sender
{
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
        @"John Q", @"Author",
        nil];

	//Button Tappedというイベントを登録
    [Flurry logEvent:@"Button Tapped" withParameters:params];
}
```

##参照
* [「Flurry Analytics」無料で使える！アプリのアクセス解析ツール](http://www.glpgs.com/d-blog/archives/526 '「Flurry Analytics」無料で使える！アプリのアクセス解析ツール')
* [FLURRY Analytics > Getting Started](http://support.flurry.com/index.php?title=Analytics/GettingStarted 'Flurry')
新卒フロントエンジニアが知っておくべき言葉

順次更新しています。
***

## バッチ（batch）

特定の処理を行うための複数のコマンド群を記述したファイルのこと

## Jade（.jade）

htmlのテンプレートエンジン。htmlにコンパイルする

・＜＞無し
・インデントで閉じタグ　⇒　コードが綺麗
・cssと同じclassとidの表記

http://jade-lang.com/

## compass

sassを拡張するもの。sassの機能を使ってより簡単にするのが、compass。（javascriptと jQueryの関係と同じ）

http://compass-style.org/

## CoffeeScript

cofeeScript →　js

## Grunt

node.js上で書いたタスクを実行してくれるもの。
SassやCoffeeScriptのようなコンパイルが必要なものをファイルを変更したらいちいちコンパイルしてくれる。

http://gruntjs.com/

##gulp

gruntと同じビルド用ツールのこと。
gruntはシンプルなタスクだけであればわかりやすいのですが、多くのプラグインを使用したり、タスクの制御を細かく行うようになるとコードが長くなってしまいわかりにくくなってしまいます。
そんなgruntの問題点を解消することを目的として開発されたのがgulpです。

http://gulpjs.com/

## Bower

フロントエンド用のパッケージマネージャー。
よくつかうjs, jQueryなどを入れておく。ライブラリを自分で管理する必要がなくなり、管理するファイルの数を減らすことができる。
バージョン管理するときやアップデートするときに便利。
→大規模サイトをつくるときに使うライブラリ管理にいい。

http://bower.io/

## Yeoman

総合開発ツール群。
・grunt(タスクランナー)
・bower（フロントエンドパッケージマネージャ）
・yo（雛形作成ツール→Node.jsでつくられている。yeoman generatorともいう。）

→sassやcoffeScriptを変換してくれる。

http://yeoman.io/

## Minify

圧縮して軽くすること。インデントなくす。
MinifyのWebサービスの利用したり、wordpressのminifyプラグインをつかってやる。


## 「五月雨で納品」「五月雨式で」

できたぶんから、数そろうのを待たずに。

## callback

あらかじめ指定しておく関数。
電話を相手に一度かけて、電話番号のみ伝え、一回電話を切って相手に折り返し電話をかけなおしてもらうことをcallbackというので、そこからこの名前ついた。

## トルツメ

よけいな部分を取って詰めること。削除して、空いた部分を詰めること。

## wget（だぶるげっと）

ソースコードをダウンロードするのに使うコマンド。
wget -rにすると、再帰的に（同じ手続きを繰り返すこと）リンクを辿ってくれる。
double getでは、ない！
## バッファ

余裕があること。
緩衝という意味のbufferからきている。緩衝は物と物の間に入ることで衝撃を和らげるという意味をもつ。
例）①バッファ見てスケジュール⇒余裕持たせてスケジュール
　　②バッファある⇒余裕がある
　　③今日はバッファない⇒今日は余力ない。

## 改修
元々あったサイトを一部改善する。全部変えるときがリニューアルするという。
回収では、ない！

## grepかける
ファイルをまたいで検索かけること。find in files
ダミー画像やデモ環境URL、ダミーリンク（"#","./"とか）、文言の洗い出しをする。
大規模サイトを作る上で大事。最終チェック。

## fix
確定した状態のこと。
ex)fixした？⇒確定した？

## I/O
「入出力」(input/output)の略。
input:外部からコンピュータにデータを送ること
output:コンピュータが外部にデータを送ること

## リファクタリング（refactoring）
プログラムの外部の見た動作を変えずに、
ソースコードの内部構造を整理すること。
ex)クラス・メソッド・属性の名称を変えること

## tortoiseGit
windows用のgitツール。

## XAMPP（ザンプ）
無料＆一括でWebアプリケーションをインストールできるパッケージのこと。
ローカルで作業の表示確認する際に必須です。
Rails4.1でdeviseのログインIDをemailとusernameのどちらでも可能にする

##概要
Ruby On Rails4.1環境でdeviseを利用してログイン機能を実装していますが、
そのログインIDをemailでもusernameでも可能にします。

##参考
公式のHowToほぼそのままです。
https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address

##テーブルにusernameカラムを追加する
※users以外の名前を付けている場合は適時置き換えて下さい。


usernameカラムを追加

```
$ rails generate migration add_username_to_users username:string:uniq
```

生成されたマイグレーションを実行

```
$ rake db:migrate
```

必須パラメータ設定の書き換え

```app/controllers/application_controller.rb
# 以下を追加
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected
    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
      devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
      devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
    end
```

##ログイン用のパラメータlogin(=emailまたはusername)をモデルに設定する

loginパラメータのアクセサを設定

```app/models/user.rb
# 以下を追加
  attr_accessor :login
```

ログイン認証用キーをloginに設定

```app/models/user.rb
# deviseにパラメータを追加
#  devise :database_authenticatable, :registerable,
#         :recoverable, :rememberable, :trackable, 
#         :validatable
# ↓↓
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, 
         :validatable, :authentication_keys => [:login]
```

ログイン認証条件を書き換え(find_first_by_auth_conditionsをオーバーライド)

```app/models/user.rb
# 以下を追加
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first
    else
      where(conditions).first
    end
  end
```

usernameのバリデーションを行う場合は任意で設定

```app/models/user.rb
validates :username,
  :uniqueness => {
    :case_sensitive => false
  },
  :format => { ... } # etc.
```

##Viewの更新

Viewファイル一覧を生成(オーバーライドするため)

```
$ rails g devise:views
```

Viewファイルの書き換え
※下記以外の部分は、適時書き換えてください。

```app/views/devise/sessions/new.html.erb
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>

↓↓↓書き換え

<p><%= f.label :login %><br />
<%= f.text_field :login %></p>
```

```app/views/devise/registrations/new.html.erb
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>
```

```app/views/devise/registrations/edit.html.erb
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>
```

##結果
emailまたはusernameでログインが可能になります。
Jackson JSON processorで存在しない変数を無視してマッピングする２つの方法

JacksonでJSON -> OBjectのマッピングをするとき、JSONには存在して、マッピング対象のクラスには存在しないフィールドがあると、

`org.codehaus.jackson.map.exc.UnrecognizedPropertyException`

が発生します。

## 回避方法１：Annotation
マッピング対象のクラスに`@JsonIgnoreProperties`をつける

```java
@JsonIgnoreProperties(ignoreUnknown = true)
public class Something implements Serializable {
    ...(skip)
}
```
## 回避方法２：Configure
`ObjectMapper`にパラメータを設定する

```java
// Jackson 1.9 and before
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
```

```java
// Jackson 2.0
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
```
This gem was compiled for 5.5.29 but the client library is 5.6.1

http://cacaosoft.web.fc2.com/tkool/lecture/rgss2/015.html

エラー
Fixing "Incorrect MySQL client library version! This gem was compiled for 5.5.29 but the client library is 5.6.10. (RuntimeError)" on OS X while using Brew
解決
---

<pre>
sudo ARCHFLAGS="-arch x86_64" gem install mysql2 -- –with-mysql-config=/usr/local/bin/mysql_config
</pre>
Yeomanのジェネレータを使ってFamo.usを試したメモ


# [Famo.us](https://famo.us)とは

- アプリっぽいUXを実現するJavaScriptのフレームワークです
	- GPUを使ってレンダリングしてるから速いとかなんとか
- こういうものが作れるらしい
	- 公式のデモ：http://famo.us/demos

# 手順

- 探したら Yeoman のジェネレータ(generator-famous)があったのでそれを利用する
	- https://github.com/Famous/generator-famous
- もし Yeoman が開発環境に無い場合は、事前にインストールしてください
	- `# npm install -g yo grunt-cli bower`

### ① ジェネレータをインストール

```
# npm install -g generator-famous
```
### ② ジェネレータを起動

```
$ yo famous
```

### ③ なんか聞かれるので、そのままデフォルトで進める

![スクリーンショット 2014-05-20 11.56.37.png](https://qiita-image-store.s3.amazonaws.com/0/35733/81f8a913-20fb-3b5e-9a99-cff1404ad7fd.png "スクリーンショット 2014-05-20 11.56.37.png")

以上でインストールは完了。こういうファイル構成になる。

![スクリーンショット 2014-05-20 12.00.08.png](https://qiita-image-store.s3.amazonaws.com/0/35733/bffc8b51-e353-ef9d-bd08-967cfd6ffca5.png "スクリーンショット 2014-05-20 12.00.08.png")

### ④ 動作確認してみる

- Gruntでブラウザを起動

	```
	$ grunt serve
	```

- 次のように表示されればOK（ロゴがぐるぐる回ってる）

	![スクリーンショット 2014-05-20 12.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/35733/d4eb4f4a-b462-8dcf-0a61-a0ec33bf4d0c.png "スクリーンショット 2014-05-20 12.21.35.png")

# ソースをながめてみる

- 上のロゴをぐるぐるさせるソースは `main.js` のようだ。

	![スクリーンショット 2014-05-20 12.20.51.png](https://qiita-image-store.s3.amazonaws.com/0/35733/790c101c-f7dd-9e28-f148-42bb77407d0a.png "スクリーンショット 2014-05-20 12.20.51.png")

- これ系でよくあるように、オプジェクトを作って、動きを定義して、、という風にするみたい。

# ほか

- 開発は公式のドキュメント(http://famo.us/docs)を見ながらやっていく
	− ただ学習コスト高そう
nginx + php-fpm のPHPをバーチャルホストごとにユーザー権限で動かす

nginx + php-fpm で、PHPでファイル作成とかするとユーザー(とグループ)が nginx になってしまうので、バーチャルホストごとに違うユーザーで動かしたく、それを解消するメモ。
まだこの構成に慣れていないので変なところがあるかも・・・

## php-fpm の設定

ユーザー用のプロセスを作るため、
設定ファイルにユーザー(例として「 **myname** 」)用の記述を追加

```ini:/etc/php-fpm.d/www.conf
[myname]
listen = /var/run/php-fpm-myname.sock
listen.mode = 0666
user = myname
group = myname
pm.max_children = 3
pm.start_servers = 3
```
`listen.mode = 0666` がキモで、これがないと nginx で Permission Error が出た。
(pm.～系その他は適宜)

ユーザー用プロセスが動いているか確認

```bash
$ service php-fpm restart
$ ps aux | grep '^myname'
myname   21282  0.0  0.5 280012  5224 ?        S    11:25   0:00 php-fpm: pool myname
myname   21283  0.0  0.5 280012  5152 ?        S    11:25   0:00 php-fpm: pool myname
myname   21284  0.0  0.4 280012  4872 ?        S    11:25   0:00 php-fpm: pool myname
```

## nginx の設定

nginxのバーチャルホストを設定
(例として「`myname.conf`」)

```nginx:/etc/nginx/conf.d/myname.conf
# 他と重複しない名前
upstream php-fpm-myname {
  ip_hash;

  # php-fpmのlistenに合わせる
  server unix:/var/run/php-fpm-myname.sock;
}

server {
    listen  80;
    server_name  example.com;
    root  /home/myname/www;
    index  index.php index.html index.htm;
    location ~ \.php$ {
        # upstream部分で設定した名前
        fastcgi_pass  php-fpm-myname;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_buffer_size  128k;
        fastcgi_buffers  256 16k;
        fastcgi_busy_buffers_size  256k;
        fastcgi_temp_file_write_size  256k;
        include  fastcgi_params;
    }
}
```

nginx を再起動

```bash
$ service nginx restart
```

これでPHPで `touch('test.txt');` とかやってみてファイル権限がユーザーになってればOK。

- - -

あとぜんぜん関係ないけどQiitaのシンタックスハイライトに「nginx」てのがあるのを知ったw
たまに起こる client denied by server configuration に対処する (on Debian)

理屈はCentOS等のLinux環境でも多分同じになるかと思います。事例の一つとして参考にしてください。

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 7.5 (wheezy)
Release:	7.5
Codename:	wheezy

$ apache2 -version
Server version: Apache/2.2.22 (Debian)
Server built:   Jan 31 2014 18:55:37
```

ヤボ用で、監視ソフトZabbixのAPIを試していたとき、HTTP 403でアクセスが失敗するケースが頻発しました。
そのとき、サーバ(Apache2)側で以下のようなエラーが出ていました。

```
[Tue May 20 10:59:01 2014] [error] [client XXX.XXX.XXX.XXX] client denied by server configuration: /usr/share/zabbix/api_jsonrpc.php
```

このメッセージ自体は、設定ミスで表示されることが多いようです。調べると大方そちらが出ます。典型的な事例では ```allow from all``` に相当する設定が抜けていて、アクセスを一律で遮断されるケースです。

ただ、今回は「たまに」発生するため、事情が異なるようでした。DEBUG相当のログでも理由が出なかったので、謎は深まります。

もうすこし調べたところ、どうもApacheにインストールされているDOSモジュール、具体的にはmod_evasiveの問題であることが分かってきました。

* 今回、同一バージョンのZabbixサーバを2台対象にしていたが、片方だけおかしい -> 単なるバグ・設定不良とは思われない
* Chromeから同サーバへアクセスしているタブを閉じると改善される -> 同時アクセス数が多いと問題になっている様子
* 問題の起きているサーバでプロセス数等を今回のレベルで制約する設定はされていない
* mod-security は入れていないが、……知らないモジュール ```mod-evasive``` が入っていた。
* ```a2dismod mod-evasive``` 前後で問題が改善される -> つまりこれか

さて原因が分かれば設定を変更するだけです。

# 以降、mod-evasiveのトリビア

調べた限りではメールを送る設定も作れるようなので、ついでなので実際のDOSアタック時にメールしてもらう設定も追加することにしました。

こちらを参考にします: http://www.yourhowto.net/installing-mod_security-and-mod_evasive-on-debian/

mod-evasive自体は設定ファイルがありませんでした。なので、下記のファイルを作ります。
 
```apache:/etc/apache2/mods-available/mod-evasive.conf
<IfModule mod_evasive20.c>

  ...(色々)...

  DOSEmailNotify watashino@meado.example.com
  DOSWhitelist   127.0.0.1
  DOSWhiteList   XXX.XXX.XXX.XXX
</IfModule>
```

```a2enmod``` が行うようにsymlinkをmods-enabledに入れるのも忘れないこと。
(このあたりはCentOS等では全く違う構造になるはずなので注意です)

なお```DOSWhiteList```はコンマ区切りではなくて別行にて指定みたいです。

あともう一点。調査不足を前提に書くと、標準のmod-evasiveは```/bin/mail```の存在を仮定しているのですが、これが私の環境にはありませんでした。代わりに ```/usr/bin/mail``` ならあるので、そちらを使うように変更するのですが、これがソースコードレベル以外受け付けないらしいので、ちょっと面倒。

今回はローカル環境についてはパッケージを再ビルドしました。ビルド方法は省略します。

ついでに```/bin/mail```がない部分についてはバグ報告しました。バグではないのかもしれませんが……
【gmail】メールの振り分け

#やりたいこと
特定のメールのみを受信トレイ以外にまとめたい。そして既読にしたい。
自分の場合は、監視系のメール。

#手順

##ラベルを作成する
1.左側にある「新しいラベルを作成」を選択。
2.ラベル名を設定して保存する。

##フィルタを設定する。
1.フィルタしたいメールを開いて右上のマーククリック。
「メールの自動振り分け設定」を選択。

2.フィルタ条件が設定された状態でフィルタ画面が開く。
例)含むlist:"メーリングリスト名"
「この検索条件でフィルタを作成 »」をクリック

3.メール振り分けを設定する。
「受信トレイをスキップ」「既読にする」にチェックを入れてフィルタ作成ボタンを選択。

##フィルタの設定変更
1.TOPページ右上のネジマークみたいのをクリックして開いて設定を選択。

2.設定画面が開くので、フィルタタブを開くとフィルタ一覧が表示される。

3.各フィルタの編集ボタンを押すとフィルタの編集ができる。
Xcodeの覚えておきたい操作

※随時追加していく予定

## エディタ操作系
1.Class, methodなどの定義にジャンプ
```Cmd + 対象をクリック```

2.Documentation and API Referenceを開いて調べる
```Cmd + shift + 0```

3.h/m切り替え
```Cmd + Ctrl + ↑/↓```

4.ファイル名で検索
``` Shift + Cmd + o```

5.行頭、行末に移動
```Ctr + a(行頭)/e(行末)```

6.一括インデント
```Cmd + ](インデント挿入)```
```Cmd + [(インデント削除)```

7.インデントを揃える
```範囲選択 → Ctr + i```

8.windowを2分割してファイルを開く
```alt + 左クリック```

9.プロジェクトナビゲータの表示切り替え
```Cmd + 0```

10.カーソルのフォーカス移動
``` Cmd + opt + Shift + @```

11.行末まで削除
``` Ctr + k```

## build系
1.ビルド
``` Cmd + b```

2.クリーン
``` Cmd + Shift + k```

3.実行
``` Cmd + r```

## デバッグ系
1.Sterp Over
``` Fn + F6```

2.Step Into
``` Fn + F7```

3.Step Out
``` Fn + F8```
Ubuntu 14.04 LTS にRails4をインストールする


https://www.ruby-lang.org/en/installation/


https://github.com/sstephenson/rbenv


```

$ sudo apt-get install git

$ sudo apt-get install build-essential

$ sudo apt-get install libssl-dev

$ sudo apt-get install libsqlite3-dev

$ sudo apt-get install nodejs

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

```

シェルを再起動

```

$ type rbenv

```

ruby-buildをインストール

https://github.com/sstephenson/ruby-build#readme

```

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

```


Rubyインストール

```

$ rbenv install -l

$ rbenv install 2.1.2

※数値だけの行の最大の値が最新なのでそれを入れる

$ rbenv rehash

$ rbenv global 2.1.2
※インストールしたバージョンを指定

$ gem i bundler


```


Railsインストール

```

$ gem i rails
or
$ gem i rails --no-ri --no-rdoc


$ gem i spring

```


postgresqlインストール

```

$ sudo apt-get install postgresql

※DBはインストール後に起動している。postgresqlを停止する場合
$ sudo service postgresql stop


```
最近体に覚えこませているvimコマンド

## vimtutor
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    カーソル位置から行末までのコピー(ノーマルモード)
    y$

    ---> hoge fuga piyo hogera hogehoge foo bar baz quz quux

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    行追加テキスト入力(ノーマルモード)
    o : 今いる行の下に行挿入してテキスト入力
    O : 今いる行の上に行挿入してテキスト入力
    i : カーソルの前にテキスト入力
    I : 行頭の最初の文字に移動してテキスト入力
    a : カーソルの後ろにテキスト入力
    A : 行末に移動してテキスト入力

    ---> foo bar baz qux quux
    ---> hoge fuga piyo hogera hogehoge

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    対応する括弧移動(ノーマルモード)
    %

    ---> (hoge(fuga)piyo)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    カーソル移動(ノーマルモード)
    w  : 右の単語前
    e  : 右の単語後ろ
    b  : 左の単語前
    ge : 左の単語後ろ

    ---> hoge fuga piyo hogera hogehoge foo bar baz quz quux

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    カーソル移動(ノーマルモード)
    f{文字} : 右の指定文字までとぶ
    F{文字} : 左の指定文字まで飛ぶ

    ---> hoge fuga piyo

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    カーソル上の単語を消す(ノーマルモード)
    diw
    daw : 単語に加えて後続スペースも消す

    ---> hoge fuga  piyo

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ""で囲まれた文字を消す(ノーマルモード)
    di"

    ---> "hoge" "fuga" "piyo"

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    カーソル位置にある単語を検索する(ノーマルモード)
    * : 下方向に検索
    # : 上方向に検索

    ---> hoge fuga piyo

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ハイライトを消す(コマンドモード)
    :noh

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    数値をインクリメント、デクリメントする(ノーマルモード)
    <C-a> : インクリメント 
    <C-x> : デクリメント 

    ---> 1 2 3

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    前に変更した箇所へカーソルを移動する(ノーマルモード)
    g;

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    英字の大文字小文字変換(ビジュアルモード)
    U : 選択部分を大文字に変換
    u : 選択部分を小文字に変換

    ---> foo bar baz qux quux
    ---> HOGE FUGA PIYO HOGERA HOGEHOGE

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    開いている文章の再読み込み(コマンドモード)
    :e!

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ページ移動(ノーマルモード)
    <C-f> : ページforward送り
    <C-b> : ページback戻り

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    入力補完(インサートモード)
    <C-n> : 補完next
    <C-p> : 補完previous

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    置換(ノーマルモード)
    s/{検索文字}/{置換文字}/g
    s/{検索文字}/{置換文字}/gc : 一箇所一箇所チェックして置換していきたいとき
オーバークロックでコーディングを高速化しながら社会貢献

東海のオーバークロック集団「TEAM SHACHI-HOKO」で活動しています。
ハードウェア・ソフトウェア技術の研鑽、BOINCによる社会貢献活動を実施中です。
オーバークロック技術は、コーディングの高速化、効率化にもつながるかと思いますが、Qiitaの皆様いかがでしょうか。
https://sites.google.com/a/shachi-hoko.jp.net/team-shachi-hoko/top

![20140503中部経済新聞掲載記事(公開用）.png](https://qiita-image-store.s3.amazonaws.com/0/44312/0177634d-5561-224b-5dd2-79f461c08924.png)
![DPP_0401.JPG](https://qiita-image-store.s3.amazonaws.com/0/44312/9531106c-65dc-5982-d701-1c6eda6a1969.jpeg)
![IMG_6544.JPG](https://qiita-image-store.s3.amazonaws.com/0/44312/de55f772-be12-7be7-003f-cab694a72253.jpeg)


チーム鯱とは？

TEAM SHACHI-HOKO（和名：チーム鯱）は、空冷/水冷/極冷でオーバークロックをやっている向上心の高いオーバークロッカーチームです。主なメンバーは水冷でオーバークロックを行っています。

製作しているマシンにより、グリッドコンピューティング(WCG)に参加して
さまざまなオーバークロックマシンを運用し、社会に役立ていくことを模索しています。


常時100%の高負荷がかかるWCGプロジェクトは、CPUの性能とPC全体の安定性を測るのに最適な上、
人類全体の問題を解決するプロジェクトを日夜こなすことで
社会貢献ができますし、さらにPCの普段使っていないあまったパワーを活用できるため、
二重にも三重にもメリットがあります。
このことからも、SHACHI-HOKOでは、WCGプロジェクトへの参加を第一義の目的として
最重要視していきます。

さらに交流会、各種イベント、ベンチマーク大会への参加といった外部活動を行うことで、
オーバークロックの普及と発展に貢献することを第2の目的としています。

鯱チューン＝システムを極限まで追い込んだチューニング法またはそのさま
同クロック帯と比較して総合的に高速に動作するのが特徴。

また、「極限」まで詰めた設定で「常用」設定するところと、
極上をかけて、「極常用PC＝極常PC」と呼んでいます。

高負荷での長距離を得意としてベンチマークにとらわれない、実用性主義のチームです。

チーム活動内容

・オーバークロック技術の探求
・オーバークロック技術を用いてのグリッドコンピューティング活動
・会員同士の交流会/定例会パーツ交換即売買会
・各種セミナー、イベント開催、ベンチ大会等への参加

まれに季節ごとのイベントや、普段の休日にも集まる和気あいあいとしたチームです。

![IMG_6396.JPG](https://qiita-image-store.s3.amazonaws.com/0/44312/7487964b-7129-022d-baf5-5a6a0bca3c3f.jpeg)
![DPP_1598.JPG](https://qiita-image-store.s3.amazonaws.com/0/44312/6efafe18-0997-2900-d0bf-67f62b66c3a8.jpeg)