OmniAICreator/Qiita-1.07M huggingface dataset:
UAを参照しないでブラウザを判定する方法

`navigator.userAgent`に頼らず判定したい場合のスクリプト。

[デモページ](http://jsbin.com/oloyac/2)

```javascript
var w = window,
    d = w.document,
    dE = d.documentElement,
    unavailableQuerySelector = isUndefined(d.querySelector),
	unavailablePerformance = isUndefined(w.performance),
    isIE = !isUndefined(d.uniqueID),
	ltIE6 = isIE && isUndefined(dE.style.maxHeight),
	ltIE7 = isIE && unavailableQuerySelector,
	ltIE8 = isIE && isUndefined	(d.getElementsByClassName),
	ltIE9 = isIE && isUndefined(w.Worker),
	isIE6 = isIE && ltIE6,
	isIE7 = isIE && ltIE7 && !ltIE6,
	isIE8 = isIE && ltIE8 && !ltIE7 && !ltIE6,
	isIE9 = isIE && ltIE9 && !ltIE8 && !ltIE7 && !ltIE6,
	isIE10 = isIE && !ltIE9 && !ltIE8 && !ltIE7 && !ltIE6,
	isMoz = !isIE && !isUndefined(w.sidebar),
	ltFirefox3 = isMoz && unavailableQuerySelector,
	ltFirefox36 = isMoz && isUndefined(w.ArrayBuffer),
	ltFirefox6 = isMoz && unavailablePerformance,
	isOpera = !isIE && !isUndefined(w.opera),
	isWebkit = !isIE && !isMoz && !isOpera && !isUndefined(d.querySelectorAll),
	isMobileWebkit = isWebkit && !isUndefined(w.ontouchstart),
	isChrome = isWebkit && !unavailablePerformance && !	isUndefined(w.EventSource),
	isSafari = isWebkit && !isChrome,
	ltSafari4 = isSafari && isUndefined(w.matchMedia),
	ltSafari5 = isSafari && isUndefined(w.FileReader),
	isSafari4 = isSafari && ltSafari4,
	isSafari5 = isSafari && ltSafari5 && !ltSafari4,
	isSafari6 = isSafari && !ltSafari5 && !ltSafari4,
	isMobileChrome = isChrome && isMobileWebkit,
	isMobileSafari = isSafari && isMobileWebkit,
    support = {
		isIE: isIE,
		ltIE6: ltIE6,
		ltIE7: ltIE7,
		ltIE8: ltIE8,
		ltIE9: ltIE9,
		isIE6: isIE6,
		isIE7: isIE7,
		isIE8: isIE8,
		isIE9: isIE9,
		isIE10: isIE10,
		isMoz: isMoz,
		ltFirefox3: ltFirefox3,
		ltFirefox36: ltFirefox36,
		ltFirefox6: ltFirefox6,
		isOpera: isOpera,
		isWebkit: isWebkit,
		isChrome: isChrome,
		isSafari: isSafari,
		ltSafari4: ltSafari4,
		ltSafari5: ltSafari5,
		isSafari4: isSafari4,
		isSafari5: isSafari5,
		isSafari6: isSafari6,
		isMobileWebkit: isMobileWebkit,
		isMobileChrome: isMobileChrome,
        isMobileSafari: isMobileSafari
    };
      
function isUndefined (value, undefined) {
	return value === undefined;
}

console.log(support);
```
`isMobileWebkit`や`isMobileSafari`は**Android**や**BlackBerry**にも`true`を返します。
検証環境が整っていないので、整い次第追加したいです。

そして各ブラウザがアップデートされる度に更新しないとエラいことになるので気をつけて使用しなければなりません。

**ご指摘大歓迎ヽ(´ー｀)ノ**

***

# 参考にしたサイト
http://w3g.jp/blog/tools/js_browser_sniffing
http://d.hatena.ne.jp/Naotsugu/20110927/1317140891
http://caniuse.com/
メンバ変数のリストを動的に取得する

```
#include <objc/runtime.h>
```

が必要です

```
@interface Hoge : NSObject
@property (nonatomic, assign) int a;
@property (strong, nonatomic) NSString *str;
@end
@implementation Hoge
@end
```

```
    unsigned memberCount;
    Ivar *ivars = class_copyIvarList([Hoge class], &memberCount);
    
    printf("member list\n");
    for(int i = 0 ; i < memberCount ; ++i)
    {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        const char *type = ivar_getTypeEncoding(ivar);
        
        printf("name = %s, type = %s\n", name, type);
    }
    
    free(ivars);
```

この場合は
member list
name = _a, type = i
name = _str, type = @"NSString"
と出力されます

objcのランタイムリファレンス
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

同じような感覚でプロパティのリストやメソッドのリストも取得できるようです。
Objective-cならではで、面白いですね
URI.escape() でescapeしたい文字を追加

~~~:ruby
> URI.escape("O'Reilly Media")
 => "O'Reilly%20Media" 
> URI.escape("O'Reilly Media", Regexp.union(URI::UNSAFE, /['()]/))
 => "O%27Reilly%20Media"
~~~

Dropbox API のパスで `'` などをエスケープする必要があった。
https://www.dropbox.com/developers/reference/api#metadata
もっといい方法ありそうだけど...
CUDAコンパイラ(nvcc)でVisualStudioコンパイラ(cl)の特定の警告を無効にする方法

ThrustとかをVisualStudioでコンパイルすると、[C4819警告](http://msdn.microsoft.com/ja-jp/library/ms173715.aspx)が大量に出てめんどくさい、とかいう状況になりますよね。

で、普通にVisualStudioのコンパイラ(cl)でやるときは、`/wd 4819`とオプションに付け加える（「プロジェクトのプロパティ＞構成プロパティ＞C/C++＞詳細設定＞指定の警告を無効にする」で4819と指定する）だけで無視できるんですが、CUDAのコンパイラ(nvcc)にはそんなオプションがありません。
といっても、nvccはホストとデバイスを分離した後、ホスト側のコードはclでコンパイルするはずなので、どうにかcl用のコンパイラオプションを直接渡せばいいわけです。

でも簡単に見つからなかったので[聞いてみました](https://devtalk.nvidia.com/default/topic/524142/how-to-disable-specific-warnings-with-nvcc-/)。そしたら、nvccには`-Xcompiler`という、ホストコンパイラ（clなど）に直接オプションを渡すことの出来るオプションがあるというじゃないですか！調べたら[確かにありました](http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#options-for-passing-specific-phase-options)（なんで気づかなかった・・・）。

というわけで、例えばC4819警告を無視するには、「構成プロパティ＞CUDA C/C++＞Command Line＞追加オプション」に
```-Xcompiler "/wd 4819"```
と入れればできました。やったね200個ぐらい出てた警告がなくなったよ！

ちなみにこれ別に警告を無視する以外にもclに渡したいオプションがあればできるっぽいので、必要なときは使っていこうと思いました。
XOOPSの言語ファイルでのParseErrorを防止する check_lang.zsh


仕事で多言語対応サイトをXOOPS Cubeで構築したときに、英語やフランス語のメッセージをもらってプログラムにマージすることがあります。

そのときについうっかり下記の様になってしまってエラーになることがあります。

```php
define('_MD_FOO_LANG_MISS', 'It's NG');// シングルクォートのエスケープもれ
```

そこで言語ファイルの構文チェックだけ実行する zsh スクリプトを用意しました。

```zsh
#!/bin/zsh
for file in `ls **/language/*/*.php`;
do 
php -l $file >/dev/null
if [ $? -ne 0 ]
	then
	echo 'ERROR! check ->  php -l ' $file;exit 1;
fi
done;
echo 'success';
```

うっかりミス防止になりそうです。
Devise関連のページだけをSSL化する手順

ログイン画面やパスワード変更画面など、Devise関連の画面のみSSL化して、それ以外はSSL化したくない場合の手順を紹介します。

###手順
Devise関連のControllerでSSLを強制的に有効化します。

````ruby:config/environments/production.rb
# staging.rbがあればそちらも同様
config.to_prepare { Devise::SessionsController.force_ssl }
config.to_prepare { Devise::RegistrationsController.force_ssl }
config.to_prepare { Devise::PasswordsController.force_ssl }
````

(2012.11.23変更)
ログイン後、およびログアウト後は`https://`ではなく、`http://`でページを表示してほしいので、以下のようにDeviseのメソッドをオーバーライドします。

````ruby:app/controllers/application_controller.rb
def after_sign_in_path_for_with_http(resource_or_scope)
  path = after_sign_in_path_for_without_http(resource_or_scope)
  path_to_url(path)
end
alias_method_chain :after_sign_in_path_for, :http

def after_sign_out_path_for_with_http(resource_or_scope)
  path = after_sign_out_path_for_without_http(resource_or_scope)
  path_to_url(path)
end
alias_method_chain :after_sign_out_path_for, :http

def path_to_url(path)
  "http://#{request.host_with_port.sub(/:80$/,"")}/#{path.sub(/^\//,"")}"
end
````

ログアウト用のリンクを作っている場合は、リンク先を`https://`にします。
ただし、ローカル環境では`http://`になっていると思うので、helperメソッドを使って切り分けましょう。

````ruby:app/views/layouts/application.html.haml
link_to 'ログアウト', destroy_user_session_url(protocol: protocol_for_devise), method: :delete
````

````ruby:app/helpers/application_helper.rb
def protocol_for_devise
  Rails.env.development? ? 'http://' : 'https://'
end
````

SSLのページで`http://`を読み込むような箇所があると、ブラウザによっては警告が出ます。
たとえば、twitter-bootstrap-railsを使っていると、以下のように`http://`の読み込み処理があるので、URLを`https://`に変更します。(対象のリソースが`http://`と`https://`のどちらでも参照できる場合)

````diff:app/views/layouts/application.html.haml
- = javascript_include_tag "http://html5shim.googlecode.com/svn/trunk/html5.js"
+ = javascript_include_tag "https://html5shim.googlecode.com/svn/trunk/html5.js"
````

以上で終わりです。
正しく動作するか、サーバーで確認してみましょう。

###確認環境
  - Rails 3.2.8
  - Devise 2.1.2
  - Heroku Cedar Stack + [Piggyback SSL](https://devcenter.heroku.com/articles/ssl#piggyback-ssl)

###おまけ
全画面とも強制的にSSL化する場合(非SSLなページが不要な場合)は、以下の設定だけでOKです。

````ruby:config/environments/production.rb
# staging.rbがあればそちらも同様
config.force_ssl = true
````

###参考
  - https://github.com/plataformatec/devise/wiki/How-To:-Use-SSL-(HTTPS)
  - http://stackoverflow.com/questions/9527158/how-should-i-go-about-making-all-devise-paths-use-https
  - http://grosser.it/2008/11/24/rails-transform-path-to-url/
Gist に gistfile1.txt のない綺麗な Git リポジトリを作る

なんでもいいから適当な gist を作ってから既存の Git リポジトリで

```
$ git remote add origin git@gist.github.com:4126330.git
$ git push -f origin master
```

などとすれば gistfile1.txt みたいな邪魔なものを歴史から抹消できる。
RailsのBootstrap導入、かつレスポンシブデザインを無効にする

レスポンシブデザインは画面の大きさ(パソコン、タブレット、スマホ)によって表示を変えるBootstrapの素晴らしい技術です。

ですが、時としてその挙動を望まない場合があります。
RailsのBootstrapではデフォルトでこのレスポンシブデザインが入っていて何とか無効にしたいと。

そんな時は以下のファイルを修正して下さい

その前にBootstrapの導入方法について

```ruby:Gemfile
gem 'twitter-bootstrap-rails'
```

```コンソール
bundle install
rails g bootstrap:install
```

ここで(可変レイアウト)テンプレートを作成する場合は

```コンソール
rails g bootstrap:layout application (fluid)
```

そしてレスポンシブデザインが読み込まれているところは

```ruby:app/assets/stylesheets/bootstrap_and_overrides.css.less
@import "twitter/bootstrap/responsive";
```

ここをコメントもしくは削除することでレスポンシブデザインを無効にすることができます
めでたしめでたし。
print all float limits in a given common lisp implmentation


```lisp:float-limits.lisp
(defun float-limits ()
  (dolist (m '(most least))
    (dolist (s '(positive negative))
      (dolist (f '(short single double long))
        (let ((n (intern (string-upcase
                            (format nil "~A-~A-~A-float"
                                          m  s  f)))))
          (format t "~30A ~A ~%" n (symbol-value n)))))))
```
Make a tasty cookie in Scheme ; )

From TLS4th.

```scheme:cookie.sch
(define cookies
  (lambda ()
    (bake
      (quote (350 degrees))
      (quote (12 minutes))
      (mix
        (quote (walnuts 1 cup))
        (quote (chocolate-chips 16 ounces))
        (mix
          (mix
            (quote (flour 2 cups))
            (quote (oatmeal 2 cups))
            (quote (salt .5 teaspoon))
            (quote (baking-powder 1 teaspoon))
            (quote (baking-soda 1 teaspoon)))
          (mix
            (quote (eggs 2 large))
            (quote (vanilla 1 teaspoon))
            (cream
              (quote (butter 1 cup))
              (quote (sugar 2 cups)))))))))
```

yummy!
Network.HTTP


ネスト深くなるのをなんとかする術は早めに見つけておきたい。

```haskell:
% runhaskell
import Network.HTTP

main :: IO ()
main = do
    let req = getRequest "http://d.hatena.ne.jp/hiratara/"
    result <- simpleHTTP req
    case result of
      Left x  -> error $ show x
      Right y ->
          do
            if (rspCode y) /= (2, 0, 0)
            then error $ "bad status code" ++ (show $ rspCode y)
            else return ()
            putStrLn $ take 256 $ rspBody y

【実行結果】
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:og="http://ogp.me/ns#">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Cont
```
JSON.parse() したオブジェクトを Javascript みたいにアクセス

~~~:ruby
class OpenHash < OpenStruct;
  def []=(k, v)
    send("#{k}=", v)
  end
  def [](k)
    send(k)
  end
end
o = JSON.parse('{"a":1, "b":{"c":2}}', :object_class => OpenHash)
o.b.c #=> 2
~~~
plan b for your js cdn

lesson learned from HTML5 boilerplate:

````
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
        <script>window.jQuery || document.write('<script src="/front/try/js/vendor/jquery-1.8.0.min.js"><\/script>')</script>
````

The `window.jQuery` will check if the cdn is not available, it will use your local jQuery as a plan B.
指定フォルダ以下のパワーポイントファイル内の文字列を一括置換するVBScript

ちょっと必要だったので作りました。
拡張子とあと他ちょこっといじればExcelとかWordにも転用できると思います。

テンポラリな用途なのでかなり乱暴に書いてます。
置換作業前に開いてるファイルの保存を必ずして下さい。
作業中のファイルが消えてしまいます（やっちまいました）。

```vbnet
msgbox "Powerpointが起動中の場合は、終了してから操作を行なって下さい。"

Dim folderPath
folderPath = InputBox("フォルダパスを入力して下さい。","指定フォルダ以下のファイルの文字列を置換します。")

Dim sysObj
Set sysObj = CreateObject("Scripting.FileSystemObject")
if sysObj.FolderExists(folderPath) = false then
	msgbox "不正なフォルダです"
	WScript.Quit
end if

Dim fromStr
Dim toStr

fromStr = InputBox("置換する元の文字列を入力して下さい。","置換する元の文字列を入力して下さい。")
if fromStr = "" then
	'置換前が指定されなければ終了
	WScript.Quit
end if

toStr = InputBox("置換後の文字列を入力して下さい。","置換後の文字列を入力して下さい。")

if msgbox(folderPath & "以下のパワポファイルを" & fromStr & "から" & toStr  & "に置換してもいいですか？",vbYesNo + vbQuestion) = vbYes then

	Dim poworPoint
	Set poworPoint = CreateObject("PowerPoint.Application")
	poworPoint.Visible = True
	Dim Target

	'指定フォルダの中のファイル
	For Each oFile In sysObj.GetFolder(folderPath).files
	 Target =  oFile.Name
	 '拡張子の判別
	  If LCase(sysObj.GetExtensionName(Target)) = "ppt" Or LCase(sysObj.GetExtensionName(Target)) = "pptx" Then
	   ''Targetに対する処理
	   Call repSub(folderPath & "\" & Target, fromStr,toStr, poworPoint)
	  End If
	Next

	poworPoint.Quit
	Set poworPoint = Nothing
end if

Sub repSub(filePath, fromStr, toStr, poworPoint)
On Error Resume Next
  With poworPoint.Presentations.Open(filePath)
  For Each myS In poworPoint.ActivePresentation.Slides
     For Each mySP In myS.Shapes
       mySP.TextFrame.TextRange = Replace(mySP.TextFrame.TextRange, fromStr, toStr)
     Next
  Next
 .Save
 .Close
  End With
End Sub
```

補足
こちらを参考にしました→ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1016644705
[Chef]AttributeをRole(Node)で設定(上書き)する

## まずrecipeでattributeを設定する
テストのためのcookbook(samples)を作成

```ruby:samples/recipes/default.rb
# WARNに値を出力するだけ
Chef::Log::warn node[:apache][:prefork][:startservers]
```

```ruby:samples/attribute/default.rb
if "#{node[:roles]}" == 'front_web'
  default[:apache][:prefork][:startservers] = 36
else
  default[:apache][:prefork][:startservers] = 500
end
```

roleファイルは以下のようなものを作成し、 knife role from file ./front_web.rb その他で反映しておきます。内容が同じであればGUIからでも構いません。

```ruby:front_web.rb
name "front_web"
run_list "recipe[sample]"
```

nodeにroleを設定します。（今回はすべて一つのRoleのみを適用するものとします。）

```bash:nodeの状態例
# knife node show vm-test
Node Name:   vm-test
...
Run List:    role[front_web]
...
```

nodeに設定したrun_listの内容がそれぞれ左の場合、実行時に評価されるstartserversの値（chef-client実行時にWARNログとして表示される値）は右になります。

role[front_web] -> WARN: 36
recipe[sample] -> WARN: 500


## roleでattributeを設定（上書き）する

attribute値を入れたroleを作って、実行時に上書きします。
roleの書式はrubyかjsonかはお好みで。

```ruby:upscale.rb
name "upscale"
run_list "recipe[samples]"
default_attributes(
    "apache" => {
        "prefork" => {
            "startservers" => "1000"
        }
    }
)
```

```json:minscale.json
{
  "name": "minscale",
  "json_class": "Chef::Role",
  "run_list": [
    "recipe[samples]"
  ],
  "default_attributes": {
    "apache": {
      "prefork": {
        "startservers" : "10"
      }
    }
  }
}
```

```bash
knife role from file ./upscale.rb
knife role from file ./minscale.json
```

それぞれ、roleを適用すると
role[upscale] -> WARN: 1000
role[minscale] -> WARN: 10
と出力されます。

※さらにnodeに値を設定して上書きすることも可能です。attributeが上書きされる順番は下記で確認できます。
[Opscode wiki](http://wiki.opscode.com/display/chef/Setting+Attributes+%28Examples%29)

手元で確認した段階では、roleで値を入れる場合、shef -zでのデバッグ時に
node.apache.prefork.startserversなどの値がきちんと上書きされた状態で取れない場合があるみたいなので、少しデバッグしにくいかも。。。
MTのMYSQLでタグの回数をCSV出力


```mysql:qiita
SELECT t.tag_name, COUNT(t.tag_name) AS count 
FROM mt_tag AS t, mt_objecttag AS o 
WHERE t.tag_id = o.objecttag_tag_id AND o.objecttag_object_datasource = "entry" AND o.objecttag_blog_id = 1 
GROUP BY t.tag_name HAVING COUNT(t.tag_name) > 0 
INTO OUTFILE "ファイル名.csv" 
FIELDS TERMINATED BY ",";
```

参考URL
http://keywordsmemo.blogspot.jp/2011/02/movable-type.html
http://phpjavascriptroom.com/?t=mysql&p=join
http://sasuke.main.jp/sqlcsv.html
http://yoshiomemo.blog115.fc2.com/blog-entry-32.html
http://kawama.jp/archives/2009/11/mysql_7.html
プロセスとそれが使用しているソケットコネクションを確認する


```
$ lsof -i -P
```

実行結果

```
COMMAND    PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
loginwind   38 xxxxxxxx    8u  IPv4 0xffffff801417df00      0t0  UDP *:*
SystemUIS  162 xxxxxxxx    7u  IPv4 0xffffff80126aea48      0t0  UDP *:*
Finder     163 xxxxxxxx    8u  IPv4 0xffffff80126b1ac0      0t0  UDP *:*
Finder     163 xxxxxxxx   27u  IPv4 0xffffff8017901160      0t0  TCP localhost:49664->localhost:26165 (ESTABLISHED)
redis-ser  184 xxxxxxxx    4u  IPv4 0xffffff8012d35160      0t0  TCP localhost:6379 (LISTEN)
redis-ser  184 xxxxxxxx    6u  IPv4 0xffffff8018a5bc20      0t0  TCP localhost:6379->localhost:51213 (ESTABLISHED)
redis-ser  184 xxxxxxxx    8u  IPv4 0xffffff80178ffc00      0t0 
```
Maven tomcat-maven-plugin を使うための設定例

なぜか[codehausのUsage](http://mojo.codehaus.org/tomcat-maven-plugin/usage.html)通りに書いても上手く行かなかったのでメモ。

まずpom.xmlの設定。

```XML:pom.xml
<project>
...
    <build>
    ...
        <plugins>
            ...
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>tomcat-maven-plugin</artifactId>
                <!-- 1.0までしか使えないっぽい。 -->
                <version>1.0-SNAPSHOT</version>
                <configuration>
                    <!-- ここはプロジェクトに合わせて適宜変更する。 -->
                    <server>tomcat</server>
                    <url>http://localhost:8080/manager</url>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <pluginRepositories>
        ...
        <pluginRepository>
            <id>Codehaus Snapshots</id>
            <url>http://snapshots.repository.codehaus.org/</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>
</project>
```

$M2_HOME/settings.xmlの設定。

```XML:settings.xml
<settings>
    ...
    <servers>
        ...
        <server>
            <id>tomcat</id>
            <!-- Tomcatのtomcat-users.xmlに書いたusername, password を入れる。 -->
            <username>username</username>
            <password>password</password>
        </server>
    </servers>
</settings>
```
Bootstrap用に適当な色のボタンを簡単につくれちゃうScssのMixin

[Bootstrap](http://twitter.github.com/bootstrap/ "Bootstrap") に最初から入っている btn-primary や btn-success なんかには手を加えずに、新しい色のボタンをピャッとつくれちゃう Scss の Mixin のお話をします。

これは @asonas 先輩と一緒につくりました！

```scss
@mixin btn-colored-with($color) {
  $to: $color;
  $from: lighten($color, 15%);

  color: #fff;
  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);

  background-color: $from;
  background-image: -o-linear-gradient(top, $from, $to);
  background-image: -ms-linear-gradient(top, $from, $to);
  background-image: -moz-linear-gradient(top, $from, $to);
  background-image: -webkit-linear-gradient(top, $from, $to);
  background-image: linear-gradient(top, $from, $to);
  background-repeat: repeat-x;

  &:hover {
    color: #fff;
    background-color: $to;
  }
}
```

「あぁ、薔薇色の人生を歩みたい… そうだ、薔薇色のボタンをつくろう！」なんてときには、まずは適当に薔薇の画像を探し当てて、カラーピッカーでピッッと薔薇色の RGB 値を取得しましょう。

あとはこんな感じで、

```scss
.btn-rose {
  @include btn-colored-with(#bf0028);
}
```

薔薇色の class をひとつ定義してやって、お好きな HTML のタグにこの class を振ってやればオッケです！

![rose](https://www.evernote.com/shard/s1/sh/b3e71809-9413-42a4-9178-f31a781d459c/582f8f013104d715ef175d0727616f5f/res/6f583da8-e6ec-4d3e-9082-756e9cbca47a/skitch.png "rose")

以上、ボタンと薔薇でした！
Capybaraで複数ページのフォームのテスト

保険の申込など10画面ぐらいあるウィザード形式の申し込みフォームなどのテストをする時、セッションなどの情報を共有する時に使った方法。
肝はcontextは普通のclassなのでdefでメソッドが定義できるのでそこに共通処理をまとめる点。

```ruby
context '発注する時' do
  def step1 
    visit '/order/new'
  end

  def step1_input
    fill_in 'name', with:"qiita"
    fill_in 'address', with:"tokyo"
  end

  def step2 
    step1
    step1_input
    click_button 'next'
  end

  def step3
    step2
    click_button 'order'
  end

  it "オーダーページが表示される" do
    step1
    #...
  end

  it "注文が完了する" do
    step3
    #...
  end
end
```
Scalaでオープンクラスっぽいこと

Rubyなどにある既存のクラスにメソッドなどを追加するオープンクラスという手法。
ScalaではRubyの様なオープンクラスは無いものの、暗黙の型変換を使って
オープンクラスっぽいことが出来るようです。

scala.xml.Nodeにテキストと属性値を表示するメソッドを追加してみる例です。

```scala:OpenClass.scala
import scala.xml._
import java.io.File

object OpenClass {
    class NodeWrapper(node:scala.xml.Node) {
        def getText = Utility.trim(node).text
        def getAttribute(key:String) = node \ ("@"+key) text 
    }
    implicit def node2nodeWrapper(node: scala.xml.Node) = new NodeWrapper(node)
   
    def main(args: Array[String]): Unit = {
        val xml = XML.loadFile(new File("test.xml"))
        println(xml.getText)    
        println(xml.getAttribute("src"))    
    }
}
```

まず、メソッドを追加する為のラッパークラスを用意します。
そこでオープンしたいクラスのインスタンスを保持し、追加したいメソッドを書きます。
次に、implicitキーワードを用い暗黙の型変換が行われるようにします。
メソッドの名前はおそらく何でもいいので、引数に元のクラスのインスタンスを設定し
返り値がラッパークラスのインスタンスになるようにします。
このようにすることで、追加したメソッドを元のクラスで利用しようとすると
暗黙的にラッパークラスへ変換されメソッドが実行されます。
見ての通り実際にはラッパークラスが仕事をしているのですが、コードを見る限りでは
元のクラスにメソッドが追加されたかのように見えるというわけです。
Node.js で Github のOAuth アクセストークンを取得する

殴り書きで失礼。。。

コンソールから GithubAPI を叩くための第一歩。
Basic認証でアクセストークンを取得する。

この方法だとアプリ登録の必要がないのと、コマンドだけで済むので楽。

```javascript:github.js
#!/usr/local/bin/node
var https        = require('https');

var user     = 'USER_NAME',
    password = 'PASSWORD';

var options = {
    host: 'api.github.com',
    port: 443,
    method: 'POST',
    path: '/authorizations',
    auth: user + ':' + password
};

var params = {
    scopes: ['public_repo', 'user', 'gist']
};

var request = https.request(options);

request.on('response', function (response) {
    response.setEncoding('utf8');

    var body = "";
    response.on('data', function (chunk) {
        body += chunk;
    });
    response.on('end', function () {
        console.log(JSON.parse(body));
    });
});

request.on('error', function (error) {
    console.log('problem with request: ', error);
    process.exit();
});

var body = JSON.stringify(params);

request.setHeader('Content-Length', Buffer.byteLength(body));
request.write(body + '\n');
request.end();
```

実行すると[マニュアルの通り](http://developer.github.com/v3/oauth/#oauth-authorizations-api)のレスポンスが取得できる。

## 参考)

* http://developer.github.com/v3/oauth/#create-a-new-authorization
* http://nodejs.jp/nodejs.org_ja//api/http.html#http_http_request_options_callback

## @todo

* コードのリファクタリング、構造化
* トークンを使ってAPIをいろいろ叩く
* ユーザーID, パスワードをパラメータで受け取れるようにする
Rails の Ajax リクエスト全てを Google Analytics のイベントとしてトラックする


``` javascript
$(document).ajaxSend(function(event, xhr, settings){
  if (typeof _gaq !== "undefined" && _gaq !== null) {
    pathes = url('path', settings.url).split('/');
    _gaq.push(['_trackEvent', pathes[1], pathes[2]+":"+settings.type]);
  }
});
```

パスからControllerとActionを分離して、それぞれカテゴリ、アクションに分離している。
環境に合わせてイベントのパラメータを設定して下さい。

jQuery UJS を利用している事が前提だと思う。
https://github.com/rails/jquery-ujs
URLのパースはjs-urlを利用している。
https://github.com/websanova/js-url
XOOPS Cube のプリロード CssPreload.class.php

マルチメニューでブロックにメニューを積むのはよくやりますが、そこで「CSS3なイケてるデザインを入れたい」という要望に応えるプラグインです。

```/modules/multiMenu/preload/CssPreload.class.php
<?php
if (!defined('XOOPS_ROOT_PATH')) exit();
define('MULTIMENUCSS_PATH','/modules/multiMenu/templates/blocks/css/multimenu_panel.css');

class multiMenu_CssPreload extends XCube_ActionFilter
{
	function preBlockFilter()
	{
		$this->mRoot->mDelegateManager->add('XoopsTpl.New', array(&$this, 'MultimenuCssfile'));

	}
	function MultimenuCssfile(&$xoopsTpl)
	{
		$filename = XOOPS_URL . MULTIMENUCSS_PATH;
		$filepath = XOOPS_ROOT_PATH . MULTIMENUCSS_PATH;
		if( file_exists( $filepath ) ) {
			$xoops_module_header = '<link rel="stylesheet" type="text/css" media="screen" href="'.$filename.'" />';
			$xoopsTpl->assign('xoops_module_header', $xoops_module_header . "\n" . $xoopsTpl->get_template_vars('xoops_module_header'));
		}
	}
}
?>
node.jsでポートフォワーディング

http-proxyモジュールのインストール

```
npm install http-proxy 
```

```javascript:port_forwarding.js
var httpProxy = require('http-proxy');
var options = {
    hostnameOnly:true,
    router: {
        'example.com': '127.0.0.1:8080',
        'hoge.example.com': '127.0.0.1:9090'
    }
    
}
httpProxy.createServer(options).listen(80);
```
80番ポートをlistenして、example.comにアクセスしてきた通信を8080ポートに、hoge.example.comでアクセスしてきた通信を9090ポートに送る。

[node.jsでTCPプロキシ＆ポートフォワーディング](http://shimz.me/blog/?p=1797)
オブジェクト作成方法


最近オブジェクトの作成方法を色々と試していて、
理想としては、

- superができる
- 継承ができる
- privateが書ける
- 構造がわかりやすい

というオブジェクトができるようになればと考え、
その過程でできた作り方のひとつを忘れないようにメモ。


```javascript
var parent = function(spec, my){
    var my = my || {},
        that = {};
     
    my.word = "Hello! ";
     
    that = Object.create({
        say : function(){
            console.log("parent:",my.word, this.name);
        }
    });
    that.name = spec.name;

    return that;
}
 
var child = function(spec, my){
    var my = my || {},
        that = Object.create(parent(spec, my)),
        super_say = that.say;
     
    that.say = function(){
        my.word = "Hi! ";
        super_say.apply(this);
    }
     
    return that;
}

var a = child({
    name : "hoge"
});

var b = child({
    name : "fuga"
});
a.say();//parent: Hi! hoge
b.say();//parent: Hi! fuga

console.log(a);

```
これはGoodPartsで紹介されている関数型継承を模した作り方で、
特徴としては「my」を継承間で共有できるというもの。

でも構造がわかりにくいかなと。
prototype.jsやenchant.jsで利用されているようなClass.createが一番良いかなと考え中。
iOS6でinputタグに幅100％とプレースフォルダを設定した時のバグ

##バグ
inputタグに'width: 100%;' と 'placeholder' を同時に設定した状態で、
デバイスを横から縦に傾きを変えると親の幅が横向き時の状態から戻らなくなるバグがありました。

``` html
<div>
<input type="text" name="searchParam" value="" placeholder="テキストを入力" />
</div>
```

``` css
input[type="text"]{
width: 100%;
box-sizing: border-box;
}
```

##対処
親要素に'overflow: hidden;'を設定する

``` css
div{
overflow: hidden;
}
```
^Mを削除する

WindowsからテキストファイルをftpなどのバイナリモードでUNIX上に転送した場合，行末の改行コードが「^M」に変換されてしまう。

スクレイピングしているとき，このようなファイルをUNIXでひらくとファイル読込めなかった

→(解決策)

http://d.hatena.ne.jp/yoshifumi1975/20080503/p1
コマンド
tr -d '\r' < hogehoge.html > pokopoko.html
でOK

-(メモ)
^Mとうっても認知されないので［Ctrl］＋［V］キーを押してから、［Ctrl］＋［M］キーを押す。
d3forumのRSS表示バグ

http://usadeki.jp/modules/d3forum/index.php?topic_id=785
にも書いたが、こちらにもメモ。

XOOPS_TRUST_PATH/modules/d3forum/mian/index.php 58行目

```php
	if( _CHARSET != 'UTF-8' ) {
		$data = $xoopsTpl->get_template_vars() ;
		d3forum_common_utf8_encode_recursive( $data ) ;
		$xoopsTpl->assign( $data ) ;
		if( empty( $_GET['forum_id'] ) ) {
			$rss = array( 'title' => $data['pagetitle'] , 'query' => 'cat_ids='.$data['cat_ids'] , 'desc' => '' , 'category_title' => '' ) ;
		} else {
			$rss = array( 'title' => $data['forum']['title'] , 'query' => 'forum_id='.$data['forum']['id'] , 'desc' => $data['forum']['desc'] , 'category_title' => $data['category']['title'] ) ;
		}
		$xoopsTpl->assign( 'rss' , $rss ) ;
	}
```

を下記へ

```php
	if( _CHARSET != 'UTF-8' ) {
		$data = $xoopsTpl->get_template_vars() ;
		d3forum_common_utf8_encode_recursive( $data ) ;
		$xoopsTpl->assign( $data ) ;
	}

	if( empty( $_GET['forum_id'] ) ) {
		$rss = array( 'title' => $data['pagetitle'] , 'query' => 'cat_ids='.$data['cat_ids'] , 'desc' => '' , 'category_title' => '' ) ;
	} else {
		$rss = array( 'title' => $data['forum']['title'] , 'query' => 'forum_id='.$data['forum']['id'] , 'desc' => $data['forum']['desc'] , 'category_title' => $data['category']['title'] ) ;
	}
	$xoopsTpl->assign( 'rss' , $rss ) ;
```
instanceof はどういう時に true を返すか

ある `object` に対して `object instanceof Class_` が `true` を返すのは

- object.constructor.prototype が Class_.prototype
- object.constructor.prototype.constructor.prototype が Class_.prototype
- object.constructor.prototype.constructor.prototype.consrtuctor.prototype が Class_.prototype
- 以下繰り返し

な時。なので当然の如く

```js
function Class_() {}
object = new Class_
object.constructor === Class_  // true
object instanceof Class_  // true
```

また最も単純なプロトタイプ拡張だと思われる

```js
function Super() {}
function Child() {}
Child.prototype = new Super
c = new Child
c instanceof Super  // true !!!
```

が成り立つし

```js
function ClassA() {}
function ClassB() {}
ClassA.prototype = ClassB.prototype
cA = new ClassA
cB = new ClassB
cA instanceof ClassB  // true !!!
cB instanceof ClassA  // true !!!
```

という2つの異なるコンストラクタから作られたインスタンスが互いのインスタンスである、という謎の状況も作れる。

ちなみに、後付することはできないので注意が必要

```js
function Super() {}
function Child() {}
c = new Child
c.constructor.prototype = Super.prototype
c instanceof Super  // false
c2 = new Child
c2 instanceof Super  // true !!!
```
Data.Array.IO


ほんとはData.Array.STのつもりだったんだけども、どっちもMArrayなので。

```haskell
% runghc
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Array.IO

main :: IO ()
main = do
  a :: IOArray Int String <- newArray (0, 9) ""
  mapM_ (\n -> writeArray a n $ show $ 10 - n) [0 .. 9]
  readArray a 8 >>= print
  return ()

【実行結果】
"2"
```

newArrayの時の型指定ダサいんだけど、いい感じに推論させることできないのかなー。
Twitter API (Ruby) 

TwitterAPIの使い方です。bot作成など、色々遊べます。
OAuth認証の記事はたくさんあったけど、APIの記事はなかったので。

**追記：[Qiita「TwitterAPI Devise連携/グラフ可視化/データの効率的格納/API高速化」](http://qiita.com/items/ea2c5f7faec66347a10f) にて続きを書きました。**

#できること
TwitterクライアントやBotを作るための機能は揃っています。

例1：呟く

```hoge.rb
Twitter.update("api_testなう")
```


例2：特定ユーザーがフォローしているID一覧を取得

```hoge.rb
Twitter.friend_ids("mosa_siru")
#フォローしてるIDを表示。実行結果：
@attrs=
  {:previous_cursor=>0,
   :next_cursor_str=>"0",
   :previous_cursor_str=>"0",
   :ids=>
    [421856832,
     373248221,
     80331643,
     752440345,
.
.
.
```

#導入


##Gem

```GemFile
gem  'twitter'
```

最新バージョン(4.3)は最新のTwitterAPI ver1.1対応となります。

```Gemfile
gem  'twitter', '3.7.0'
```

TwitterAPI ver1.0対応となります。

`$bundle install`で準備完了。

###API制限
#####ver1.1
1アカウントのエンドポイントごとに、15分で15回or180回となります。(1時間あたり60回または720回)
ツイートの表示やユーザー検索などは多くできます。

####ver1.0
1アカウントごとに、1時間あたり350リクエスト。場合によっては多くとれますが、2013年3月初旬までしか使えません。


##認証

[Twitter developer](https://dev.twitter.com/)にてログイン後、右上のアイコンから「My Application」→「Create a new application」で詳細を入力します。

* websiteは`http://localhost`は許可されないですが、`http://192.168.0.1:8080`などは大丈夫です。
* Callback URLは適当でいいので必ず書いてください。

登録後、「Create my access token」でアクセストークンを得ます。キーとトークンの情報をメモします。

次に取得したトークン等を読み込ませます。Railsなら以下に書くと良いでしょう。

```config/initializers/twitter.rb
Twitter.configure do |config|
  config.consumer_key = "YOUR_CONSUMER_KEY"
  config.consumer_secret = "YOUR_CONSUMER_SECRET"
  config.oauth_token = "YOUR_OAUTH_TOKEN"
  config.oauth_token_secret = "YOUR_OAUTH_TOKEN_SECRET"
end
```

認証できていない場合、APIを叩いても「Bad Authentication data」となります。(APIver1.1は認証必須です)




##参考

* [gem twitter](http://rdoc.info/gems/twitter)
* [gem twitter document(ver4.2.0)](http://rubydoc.info/gems/twitter/frames)
* [gem twitter document(ver3.7.0)](http://rubydoc.info/gems/twitter/3.7.0/frames)
* [日本語解説サイト(ver2.1.0)](http://route477.net/w/?RubyTwitterJa)
Storyboardで定義したViewControllerを呼び出す



複数の画面からModalで設定画面を呼びたいケースがあったので、
その時の手法をメモ。


1. Storyboard上で、ViewControllerを定義する
2. Storyboard上で、ViewControllerのStoryboardIDを定義する
3. 呼び出したいクラスで下記のコードを実行する


```
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"SettingsViewController"];
    [self presentViewController:nc animated:YES completion:nil];
```


##注意

上記のコードのようにUINavigationControllerを呼び出す場合には、
Storyboard上でUINavigationControllerのStoryboardIDを定義する。

ViewControllerのみを呼び出す場合には、
Storyboard上でViewControllerのStoryboardIDを定義する。
さくらVPSにJekyll入れたときの覚え書き

##バーチャルホストって何？
[小悪魔女子大生のサーバエンジニア日記 » Blog Archive » バーチャルホストとは？](http://co-akuma.directorz.jp/blog/2010/10/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF%EF%BC%9F/ "小悪魔女子大生のサーバエンジニア日記 » Blog Archive » バーチャルホストとは？")



##お名前.comのレンタルDNS
[お名前.comでドメインを管理しながら、バーチャルホストを設定するときに気をつけたいこと。 | チュー介のtech techブログ](http://capture.heartrails.com/150x130/shadow?http://www.chusuke.com/2012/08/onamae-virtual_host/)
をみながら、
お名前.com の設定ページより
*hogehoge.com
hogehoge.com
を追加



##VirtualHostの設定
基本的には、こんな感じでいけた

```apache:
NameVirtualHost *:80
<VirtualHost *:80>
    ServerName blog.meganii.com
    DocumentRoot /home/user/jekyll/_site
</VirtualHost>

<VirtualHost *:80>
    ServerName lokka.meganii.com
    DocumentRoot /home/user/lokka/public
</VirtualHost>
```
テキスト中のURLをHTMLのaタグに置換する方法。ただし画像へのリンクは置換しない


## 概要
Railsで作成中のアプリの、Storyモデル内からコードを取ってきました。self.bodyにテキストが入っています。

## コード

```ruby:story.rb
  def convert_links
    URI.extract(body, %w{http https}).uniq.each do |uri|
      unless uri.match(/(\.jpg|\.jpeg|\.png)/)
        self.body.gsub!(uri, %Q{<a href="#{uri}">#{uri}</a>})
      end
    end
  end
```

このメソッドでself.bodyを書きかえ、body内のテキストに記述されたURLはaリンクで囲まれたものになります。

## 解説
URIライブラリ( http://www.ruby-lang.org/ja/old-man/html/URI.html )を使ってURLである文字列、それもhttpかhttps形式のものを探し、それらを配列にしてまとめてから、uniqメソッドで重複をなくします。

配列におさめた各URL文字列に対し、gsub!でbodyを置換していきます。
Ubuntuで個人環境にpythonパッケージをインストール

easy_install.pyでインストールされるパッケージが~/local以下になるように設定。
Ubuntu12.10にて。

/usr/local/lib/python2.7/dist-package/altinstall.pth

~~~python
import os, site; site.addsitedir(os.path.expanduser('~/local/lib/python2.7'))
~~~

~/.pydistutils.cfg

~~~
[install]
install_lib = ~/local/lib/python2.7
install_scripts = ~/local/bin
~~~

[これ](http://peak.telecommunity.com/DevCenter/EasyInstall#custom-installation-locations)を参考にした。

インストール先が、~/libとかではなくて~/local/libとかなのは、個人的な趣味。他のconfigure-make系のシステムも--prefix=~/localとかできて楽。
リモートから作業中のセッションに接続し、共同作業してもらう方法


リモートから同じセッションに接続することにより、ペアコーディングやインフラ作業などの共同作業が捗ります。__席を移動したりする手間__とか、__使い慣れないキーボードの操作__ともおさらばです。

wemuxを活用し、単一コンソールの複数人操作を実現します。例えば、誰かが文字を打ちこめば、もう一方のコンソールでも同じように表示されますし、逆向きも同様といった感じです。お互いに声をかけあって作業しないと、しっちゃかめっちゃかになります（笑）。
操作自体は、普段のコンソール作業と何ら変わりありません（tmuxのキーバインドが有効です）。

wemux
https://github.com/zolrath/wemux

### リモートからの作業用アカウント作成

```
システム環境設定 - ユーザとグループ
```
の画面より、新しくwemux-guestなどリモートユーザを作ります。

次に、wemux-guestでログインしなおしたあと、

```
システム環境設定 - 共有 
```
の画面より、リモートログインにチェックを付けます。これにより、外部からのssh接続が可能となります。

### wemuxをインストール

```
$ brew install https://github.com/downloads/zolrath/wemux/wemux.rb

$ wemux conf
host_list=(hoge)
```

### hogeさん（ホスト）のマシンでfugaさん（リモート）に共同作業してもらう

####hogeさんの作業
```
hoge $ wemux
(wemuxのセッションに移行します）
```

####fugaさんの作業
hogeさんマシンのIPやwemux-guestのパスワードは予め教えてもらっておきます。

```
fuga $ ssh wemux-guest@192.168.xx.xx

wemux-guest $ wemux attach
(wemuxのセッションに移行します）

hoge $ 
```
これで共同作業を行うことが出来ます。何か文字を打ってみてください。相手の画面上にも表示されているはずです。

### 作業を終えたとき

tmux同様 "Ctrl+b d" して、自らデタッチしてもらうか、wemux外のセッションにおいて、
```
hoge $ wemux kick wemux-guest
```
で追い出すことも出来ます。
使い終わったあとは、適宜wemux-userのリモートログインを不可するとか、パスワード変更しておいてください。

###おわり

今回は、自分の作業マシンでの共同作業を想定しましたが、お互いがログイン可能なサーバー上での利用の方が、より一般的かと思います。他にも、色々と使い方を工夫してみて頂けると幸いです！
Androidでタップ時の黄色い枠を消す方法


Create.jsいじってたら、iPhoneじゃ問題ないのにAndroidだけcanvasをタップすると黄色い枠がでた。
Create.jsに限らずリンクに反応するようで、多分機種によって色が違うんだろうけど、こんなのいらない。
下記のスタイルシートでタップしても変化しないように設定して解決。

```
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
```
XOOPS Cube モジュールハンドラのエラー通知改善

XOOPS Cube でモジュールハンドラを使っていて、思った様に動いてくれない時があります。スコープが正しく無い訳ですが、フレームワークを使っていると、どんなスコープで見に行ったか、どこで間違ったかを探すのは一苦労です。

そんなときコア側で貴方の指定したメソッドはどんなファイルのどんな関数を呼ぼうとしたか、というエラーを吐き出せば自分が間違った指定をしたかすぐに解ります。

多くの場合、大文字小文字のリテラルミスや余分なアンダースコアなどケアレスミスです。そんなトラブルはすぐにリカバリーしたいですね。

こんな時、functions.php の 628行目付近からの // Cube Style のフレームワークの呼び出し方を以下に帰ると見通しが良くなります。

```html/include/functions.php
        //
        // Cube Style
        //
	    $primaryHandlerFile = XOOPS_ROOT_PATH . "/modules/{$module_dir}/class/handler/" . ucfirst($name) . ".class.php";
	    $secondaryHandlerFile = XOOPS_ROOT_PATH . "/modules/{$module_dir}/class/{$name}.php";
        if (file_exists($primaryHandlerFile)) {
            include_once $primaryHandlerFile;
        } elseif ( file_exists( $secondaryHandlerFile ) ) {
            include_once $secondaryHandlerFile;
        }
        $className = ucfirst(strtolower($module_dir)) . "_" . ucfirst($name) . 'Handler';
        if (XC_CLASS_EXISTS($className)) {
            $handlers[$module_dir][$name] = new $className($GLOBALS['xoopsDB']);
        }
        else {
            $className = ucfirst(strtolower($module_dir)) . ucfirst($name) . 'Handler';
            if (XC_CLASS_EXISTS($className)) {
                $handlers[$module_dir][$name] = new $className($GLOBALS['xoopsDB']);
            }
        }
    }
    if (!isset($handlers[$module_dir][$name]) && !$optional) {
        trigger_error('Handler does not exist
            Module dir name: '.$module_dir.'
            Table Name: '.$name.'
            Primary Handler File: '.$primaryHandlerFile.'
            Secondary Handler File: '.$secondaryHandlerFile.'
	        Class: '.$className
	        , E_USER_ERROR);
    }
```
Primary Handler File と Secondary Handler File のどちらかで読み込めないと行けないのですがPrimary Handler File で大文字小文字ミスで Secondary Handler File を読みに行ってエラーを起こしているかもしれません。そんな時は Primary / Secondary 両方のファイルが明記されていないと見つけるのに時間が掛かります。

また、ついでにどんなクラスを呼ぼうとしたのかも表示します。これでちょっとしたツマズキに足を取られすぎずすぐにリカバリーして次のコードへ進めます。
CentOS上のJavaの情報ダンプ系コマンド

CentOS上のJavaで動くシステムの各種情報をダンプする時に使うコマンドの健忘録。

```sh
#標準出力にスレッドダンプを出す
kill -3 {pid}

#起動引数などを含めてJavaプロセスID表示
/usr/java/default/bin/jps -vlm

#ヒープ概要表示
/usr/java/default/bin/jmap -heap {java pid}

#ヒープダンプをファイルに取得(visualvmなどで確認可)
/usr/java/default/bin/jmap -dump:format=b,file=heap.dump {java pid}

#GC統計表示
/usr/java/default/bin/jstat -gc -t {java pid}
```
Zabbixで複雑な条件でトリガーを発火させる方法

例として、翌月の第1火曜日から3日を過ぎても値が更新されない場合、トリガーを発火させる方法を示す。

# item の作成
発火状態なら `1` に、未発火状態なら `0` になる item を作成する。この item の Type は、External check で作成する。

| 項目名 | 設定値 |
|:-----------|:------------|
| Description | test.fire |
| Type | External check |
| Key | fire.sh[monitor-key] |
| Type of information | Numeric(unsigned) |
| Data type | Decimal |

`monitor-key` には、値の更新を監視したいキーを設定する。

# external script
ディレクトリ `/etc/zabbix/externalscripts` に、次のような `fire.sh` を作成する。

```bash:fire.sh
#!/bin/bash
TARGET_IP=$1
TARGET_KEY=$2

# zabbix server の設定を読み込み、DB 接続情報を利用する
. /etc/zabbix/zabbix_server.conf

# hostid を取得する。
HOSTID=$(echo "SELECT hostid FROM hosts WHERE ip='$TARGET_IP' OR host='$TARGET_IP';" \
  | mysql -N -u $DBUser --password=$DBPassword $DBName)

# itemid を取得する
ITEMID=$(echo "SELECT itemid FROM items WHERE hostid=$HOSTID AND key_='$TARGET_KEY';" \
  | mysql -N -u $DBUser --password=$DBPassword $DBName)

# item の更新時刻を取得する
CLOCK=$(echo "SELECT clock FROM history_uint WHERE itemid=$ITEMID ORDER BY clock DESC LIMIT 1;" \
  | mysql -N -u $DBUser --password=$DBPassword $DBName)

# 翌月の1日になるまで、1日ずつ加算していく
THISMONTH=$(date -d "@$CLOCK" +%m)
NEXT_UNIXTIME=$(expr $CLOCK + 86400)
while [ $THISMONTH -eq $(date -d "@$NEXT_UNIXTIME" +%m) ];
do
  NEXT_UNIXTIME=$(expr $NEXT_UNIXTIME + 86400)
done

# 第1火曜日になるまで、1日ずつ加算していく
while [ $(date -d "@$NEXT_UNIXTIME" +%w) -ne 2 ];
do
  NEXT_UNIXTIME=$(expr $NEXT_UNIXTIME + 86400)
done

# 時刻を 0 時にする
NEXT_UNIXTIME=$(date -d "$(date -d @$NEXT_UNIXTIME +%Y-%m-%d)" +%s)

# $NEXT_UNIXTIME には、翌月の第一火曜日午前0時が設定された。
# 3 日後を求める。
LIMIT_UNIXTIME=$(expr $NEXT_UNIXTIME + 259200)

if [ $LIMIT_UNIXTIME -lt $(date +%s) ]; then
  # 値が更新されていない
  echo "1"
  exit 1
else
  # 正常
  echo "0"
  exit 0
fi
```

# トリガーの作成
次のようにキー `fire.sh[monitor-key]` が 0 以外の時に発火するトリガーを作成すれば完成である。

| 項目名 | 設定値 |
|:-----------|:------------|
| Name | does not running even after the specific date. |
| Expression | {monitored-host:fire.sh[key].last(0)}#0 |
| Severity | Average |
| Comment | 期限を過ぎても item が更新されていません。 |
cartonでライブラリ管理してるperlプロジェクトでvimを良い感じにする

Perlのプロジェクトでcartonを使っているとだいたい以下のようなディレクトリ構成になる。

```
project_root
├── local
│   └── lib
│       └── perl5
│              └── darwin-2level   # macの場合
└── lib
```

vimでperlを開くといろいろと良い感じにしてくれるが、多くの場合システムの `@INC` を使うため不都合を被る場面がでてくる。

##thinca/vim-localrc

使うのは [thinca/vim-localrc](https://github.com/thinca/vim-localrc)

project_rootに.local.vimrcを作ってそこに色々と書いていく

##gfで正しいファイルに飛べない問題

vimはgfでカーソル以下にあるファイルに飛ぶ機能がある。perlを開いていればそのモジュールに飛ぶ。しかし `@INC` には入っていないので飛ぶことができない。

これを解決するのは `.local.vimrc` に下記のように書く。

```vim:.local.vimrc
set path=/path/to/project_root/lib,/path/to/project_root/local/lib/perl5,/path/to/project_root/local/lib/perl5/darwin-2level
```

###確認

lib以下のpmファイルを適当に開いて

```
:set path?
```

を確認して .local.vimrc で設定した内容になっていればOK

これで

```perl:lib/Foo/Bar.pm
use Foo::^Baz;   # ^ にカーソルがある
```

この状態で gf と打てば project_root/lib/Foo/Baz.pm に画面が遷移する。cartonでインストールしたpmでも大丈夫

## syntasticでライブラリが見つけられない問題

syntasticには use しているライブラリの存在確認機能があるが carton 内のやつを見つけられないので、保存のたびにエラーが出る。

これに対しては以下を追記する。 `g:syntastic_perl_lib_path` に関しては `syntastic/syntax_chekers/perl.vim`を参照

```vim:.local.vimrc
let g:syntastic_perl_lib_path = "/path/to/project_root/lib,/path/to/project_root/local/lib/perl5,/path/to/project_root/local/lib/perl5/darwin-2level"
```
Safari,Chromeで文字が太くなる現象の解消


最近(?)のChromeやSafariでフォントが異様に太くなって、さらにマウスオーバーの透明度にイージングをかけると一瞬細くなったりする現象に悩まされてたのを解消した方法。

```CSS
body {
  -webkit-font-smoothing: antialiased;
}
```
これで、他のブラウザと同様のフォントの太さになり、アニメーション時にもフォントが太くなったりしなくなった。
PHP 5.3.6より前のバージョンの PDO MySQL で charset を指定する

[MySQLとPDOの組み合わせでcharsetを指定する](http://qiita.com/items/6fabdef669e35e92bdc4) を見て思いたしたこと。

PHP 5.3.6より前のバージョンの PDO MySQL で charset を指定するには次のようにする。

```php
<?php
$options = array(
    PDO::MYSQL_ATTR_READ_DEFAULT_FILE  => '/etc/my.cnf',
); 
$pdo = new PDO(
    'mysql:host=yourhost;dbname=yourdb',
    'user', 'password', $options
);
```

**/etc/my.cnf**

    [client]
    default-character-set = utf8

この方法ならPDOの中の libmysql に charset を知らせることが出来る。`SET NAMES` だとMySQLサーバには charset が伝わるけれどクライアント側は latin1 のままなのでエスケープ処理で問題が出る可能性があります（と、思ったけれどプリペアドステートメントなら大丈夫？）。

なお、この方法は PDO の中が libmysql でなければ使えません。Linux 版のビルドでは大抵大丈夫だと思いますが、Windows 版のビルドでは PDO の中身が mysqlnd なのでこの方法は使えません（`PDO::MYSQL_ATTR_READ_DEFAULT_FILE` というクラス定数が存在しない）。

#### 追記
APサーバとDBサーバが別の場合などは my.cnf で connect-timeout も指定しておくと良いかもしれません。DBサーバが死んだ時にデフォルトだと相当長いタイムアウト時間になっていたと思うので。

ただ、その場合に

    [client]
    default-character-set = utf8
    connect-timeout = 1

などとしてしまうと mysqldump などのコマンドが使えなくなってしまうので、次のように php 用のセクションを作ります。

```php
<?php
$options = array(
    PDO::MYSQL_ATTR_READ_DEFAULT_FILE  => '/etc/my.cnf',
    PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => 'php',
); 
$pdo = new PDO(
    'mysql:host=yourhost;dbname=yourdb',
    'user', 'password', $options
);
```

**/etc/my.cnf**

    [client]
    default-character-set = utf8
    
    [php]
    default-character-set = utf8
    connect-timeout = 1
Groovyのリスト表現の落とし穴？

最近のLL言語だと、リストの表現として

```
[1..4]
```

のような形で、「１から始まり、４まで続くリスト」を表現できると思います。
Groovyでも当然のようにこの書き方が出来るわけですね。

```groovy:listExp.groovy
def list=[1..4]
```

で、問題なのは、

Haskellの場合

```haskell:ghci_out
Prelude> let l=[1..4]
Prelude> let m=[1,2,3,4]
Prelude> l==m
True
```

とごく予想通りの結果になるのに対して、Groovyでは

```groovy:listExpError.groovy
assert [1..4]==[1,2,3,4]
             |
             false
```

とAssertion failedを起こしてしまいます。

これは落とし穴だよね。

（追記）
どうしてこうなるのか、というと上記の用にHaskellで見慣れている

```
[1..4]
```

という表記だとGroovyの場合

```groovy
assert [[1,2,3,4]]==[1..4]
```

となっているわけです。
つまり、角括弧なしの

```groovy
１..４
```

で既に[1,2,3,4]が表現されているわけですね。
Google Analyticsの利用時に注意すること


技術的なTipsではありませんが、関連性が高そうなのでシェアします。
自社サービスの解析ツールにGoogle Analyticsを使っている方は多いかと思いますが、利用規約に以下のような文言があります。

## 以下抜粋
**お客様はプライバシー・ポリシーを掲載しなければならず、
当該プライバシー・ポリシーにはお客様が、トラフィックデータの収集のために cookie を使用していることが示されなければならず...**

## 原文
[Google アナリティクス サービス利用規約](http://www.google.com/analytics/terms/jp.html)

> 7. 　プライバシー   　
お客様は、本サービスを利用する（又は第三者が利用する）にあたって、
個人を特定するデータ（氏名、Ｅメールアドレス、請求関係の情報等の個人情報）又はGoogleが
当該情報に合理的に関連付けることが可能なその他のデータの追跡、収集又は格納をしないものと
します（かつ第三者にこれらをさせないものとします）。お客様は、適正なプライバシー・ポリシー
を策定してこれを固守し、訪問者からの情報の収集に関して適用される法令を全て遵守することとします。
お客様はプライバシー・ポリシーを掲載しなければならず、当該プライバシー・ポリシーにはお客様が、
トラフィックデータの収集のために cookie を使用していることが示されなければならず、お客様は、
本サービスの一部であるプライバシー機能（例えば、オプトアウトの機能）を回避してはなりません。

Google Analyticsを利用している場合、プライバシー・ポリシーの掲載が必須であり、さらにその中にGoogle Analyticsを利用してトラフィックデータの収集のために cookie を使用している旨を表明していないと利用規約違反となるようです。

細かい点ですが、ユーザーさんに快適に使ってもらうために気をつけるとよい点かと思います。
配列を操作するjQueryのユーティリティ関数まとめ

jQuery要素/DOM要素の他に、純粋な配列の操作などができる関数をjQueryは持っていますが、命名や引数などややこしいことが多いのでまとました。

# 配列を操作するjQueryのユーティリティ関数
## 純粋な配列を操作できる関数
- `$.inArray(needle, array)`
- `$.each(array, callback(index, value))`
- `$.map(array, callback(value, index))`
- `$.grep(array, callback(value, index) [, invert])`
- `$.merge(first, second)`

コールバック関数に渡される**引数の順序が統一されていない**ことに注意。

## 純粋な配列は操作できない関数
- `$.unique(array)`

勘違いすると厄介です。詳しくは後述。


***

# 関数の解説
## `$.inArray(needle, array)` 
[公式リファレンス](http://api.jquery.com/jquery.inarray/)
引数`needle`が引数`array`の何番目にあるのか整数値で返します。配列に含まれない場合は`-1`を返します。**論理値**や`NaN`は返さないので注意。

***

## `$.each(array, callback(index, value))`
[公式リファレンス](http://api.jquery.com/jquery.each/)
配列の各要素に対して指定した関数を実行できる。`for`文や`Array.prototype.forEach`の代替として使用出来る。
コールバックに渡される引数の順番が`$.gerp`や`$.map`、`Array.prototype.forEach`と逆なので注意。

```javascript
// ECMA5から使えるforEachメソッドとはvalueとindexの引数の順番が逆
[1, 2, 3].forEach(function (value, index, context) {
	// loop	
});
```

引数`array`にはjQuery要素などオブジェクトも渡せるので`for-in`文としても使用可能。
（これは`Array.prototype.forEach`を使用した際も同じ事がいえますが）関数オーバーヘッドがあるのでパフォーマンスを求められる際はfor文が無難。そしてループを抜ける方法がbreak文ではなくreturn文で抜けることができるが、以下の点に注意。

```javascript
var array = [1, 2, 3],
	length = array.length;

(function () {
	var i;

	for (i = 0; i < length; i += i)
		if (i === 2) {
			return; // 無名関数まで抜けることができる。
			// break; ループだけ抜ける場合はコレ。
		}
	});

}()); 

(function () {
	$.each([1, 2, 3], function (i, value) {
		if (i === 2) {
			return; // $.eachまでしか抜けられない。
		}
	});
}());
```
### 関連メソッド
#### `$.fn.each(callback(index, element))`
[公式リファレンス](http://api.jquery.com/each/)
jQuery要素の各要素に指定した関数を実行する。

***

## `$.map(array, callback(value, index))`
[公式リファレンス](http://api.jquery.com/jquery.map/)
配列の各要素に指定した関数を実行し、それぞれの戻り値で構成された新しい配列を返す。`Array.prototype.map`の代替として使用出来る。

```javascript
// ECMA5から使えるmapメソッドと引数の順番は同じ
var newArray = [1, 2, 3].map(function (value, index, context) {
	// return newValue;
});
```

### 関連メソッド
#### `$.fn.map(callback(index, element))`
[公式リファレンス](http://api.jquery.com/map/)
jQuery要素の各要素に指定した関数を実行する。戻り値は**純粋な配列ではない**。jQueryの要素が返される。ちなみにこっちはコールバック関数に渡される引数が逆（第二引数と`this`コンテキストが同じ物だけど、ややこしい）。純粋な配列を返したい場合は`$.map`を使う。

```javascript
// 基本的にはjQueryの要素コレクションが返されるが、コールバック関数の戻り値に、jQuery要素もしくはDOM要素以外を
var result = $('div').map(function (index, element) {
	// this === element は true
	return element.nodeName; // 文字列を返してみる。
});

result; // インデックスには文字列が入っいるDOMを参照しない、できそこないのキメラのような中途半端なjQuery要素が出来上がる。
```

***

## `$.grep(array, callback(value, index) [, invert])`
[公式リファレンス](http://api.jquery.com/jquery.grep/)
配列の各要素を指定したコールバック関数で評価し、trueとなる要素からなる新しい配列を返す。`invert`引数に`true`を渡すと、評価が逆になり、falseとなる要素からなる新しい配列を返す。`Array.prototype.filter`の代替として使用出来る。

***

## `$.merge(first, second)`
[公式リファレンス](http://api.jquery.com/jquery.merge/)
配列と配列を結合させて、新しい配列を返す。jQuery要素の結合もできる。

***

## `$.unique(array)`
[公式リファレンス](http://api.jquery.com/jquery.unique/)
**<!>純粋な配列は操作できない関数**
DOM要素から成る配列もしくはjQuery要素コレクションから重複要素を削除した配列もしくはjQuery要素コレクションを返す。インデックス内の要素がDOM要素でなければうまく機能しない。**文字列や数値から成る配列には無効なので注意**。

***

間違いなどありましたらどうぞご指摘ください。
git logを見やすく設定


素のままのgit-logだとごちゃごちゃしていて読みにくい
なので

```bash:git-log

$ git log --pretty=format:\"%C(yellow)%h %C(White)%ad | %C(White)%s%C(Green)%d %C(Red)[%an]\" --graph --date=short	

```

　　

Qiitaって画像貼れなかったっけ……  #[5.24追記] 貼れました、ongaeshiさんありがとうございます！

![terminal](http://cdn-ak.f.st-hatena.com/images/fotolife/h/hachibeechan/20121119/20121119234255.png?1353336195)


これで上のスクリーンショットみたいな感じに、
左からグラフ、ハッシュ（黄色）、日付（白文字） | コメント（白文字）ブランチ名(緑) [コミット者（赤）]というようにコンパクトに表示されるはず。

%C(colorname)って感じみたいだ。
詳しいところは[git-config](http://schacon.github.com/git/git-config.html)あたりを参考に。
これ以上のことをしようとするなら、tigあたり使った方が良いのではないかなーとか思ってしまう。

　　
ついでに

```git:.gitconfig

[alias]
	hist = log --pretty=format:\"%C(yellow)%h %C(White)%ad | %C(White)%s%C(Green)%d %C(Red)[%an]\" --graph --date=short

```

みたいに、gitconfigにエイリアスを設定をするとちゃちゃっと確認したいときに便利です。

色や属性の設定など、ターミナル依存なところもあったりするので注意
混乱を招くポインタ宣言の構文についてメモ


たまに書くとき、混乱する上にググりにくいポインタ宣言の構文についてメモ.

Cの勉強でとても腹がたったのが、`int *p`と`int* p`の違いがわからんところ。微妙に使い分けている風でありつつも、同じように使えているような。
結論からいうとどちらも同じ。


```cpp:ptr
// 型 変数名の順で宣言するのでこちらがわかりやすい。
int* p;

// ただし、こう書いても良い。
int *p;
```

僕も前者のほうが絶対わかりやすいと思うんだけど、あんま見ないのはなんか良くない現象とか起きるのかな。Cの教本とかだと後者の書き方をよく見るきがする。

`追記_ hage@github氏のコメントより`

```cpp: 
// 以下のように宣言した場合……
int* p, q;
// p -> intへのポインタ
// q -> int型

// pもqもポインタとして宣言したい場合は以下のように宣言する
int *p, q;
// あるいは
int *p, *q;

```

というようなことがあるようだ。
　
## 宣言と代入のまとめ

```c:
#include <stdio.h>

int main()
{
	/* {intへのポインタ}型でpを宣言 */
	int* p;
	/* int型でxを宣言 */
	int x = 20;
	/* 変数pに、アドレス演算子&を使ってint型のxへのアドレスを代入 */
	p = &x;

	/* 間接演算子*を使い、変数pが指し示す先の値を取り出す */
	printf("%d", *p);
}
```

教本だと、よく以下のように書いてある気がする

```c
int x = 10;
int *p = &x;
printf("%d", *p);
```

初学者が、型宣言時の`*p`と、ポインタの先を参照する時の`*p`は全然違う意味を持っているということを__その後の文書で解説されたとしても__理解するのは難しいと思うんだけどな。
しかしこの誤解を呼ぶクソ構文さえ理解しちゃえば、そんなに難しいもんでもないのかも。

　
### 宣言構文の設計方針について

`追記_ yohhoy氏のコメントより`

>> C言語のポインタ周りの宣言構文が分かりにくい、というのはその通りだと思います。まぁ既にそうなってしまったものは仕方ないということで一つ…
ちなみに、ポインタ型の宣言は「変数を利用するときと見た目を揃える」という方針で設計されているそうです。[要出典]

ということらしい。

```cpp:コメントより引用
int a;  // int型変数 a
a = 5;

int *p = &a; // int型へのポインタ型変数 p
*p = 10;

double d;
// int型を1つ引数にとりdouble型を返す関数へのポインタ型変数 f
double (*f)(int) = ...;
d = (*f)(a);  //ここは"d = f(a)"でも可
```

こう考えると、関数ポインタの宣言に対する脳みその拒絶反応も薄れる気がする。