読者です 読者をやめる 読者になる 読者になる

webネタ

技術系ブログ。web系SE。1988。♂。@rhong_

Scalaで最短経路問題

アルゴリズムの勉強中...

  • 深さ優先探索幅優先探索
  • ベルマンフォード法 (閉炉を見つけれる)
  • ダイクストラ(よりコストの低い道を進む)
  • A* (よりゴールに近いほうから進む)
  • ワーシャルフロイド法 (全ペアの最短経路を見つける)

深さ優先探索幅優先探索

ベルマンフォード法

ダイクストラ

A* (えーすたー)

ワーシャルフロイド法

ワーシャルフロイド法は、重み付き有向グラフの全ペアの最短経路問題を求めるアルゴリズム

とある問題に気づいたけどそのうち直そう...。

Erlang練習 part1

とりあえず書いてみた。

Erlang末尾再帰じゃなくても速いらしい...謎い

練習

standaloneのhbaseが起動できなかった

zipを解凍して起動しようと思ったら、起動できなかった。

2013-12-11 15:52:47,105 ERROR org.apache.hadoop.hbase.master.HMasterCommandLine: Failed to start master
java.lang.RuntimeException: Failed suppression of fs shutdown hook: Thread[Thread-27,5,main]
        at org.apache.hadoop.hbase.regionserver.ShutdownHook.suppressHdfsShutdownHook(ShutdownHook.java:196)
        at org.apache.hadoop.hbase.regionserver.ShutdownHook.install(ShutdownHook.java:83)
        at org.apache.hadoop.hbase.util.JVMClusterUtil.startup(JVMClusterUtil.java:191)
        at org.apache.hadoop.hbase.LocalHBaseCluster.startup(LocalHBaseCluster.java:420)
        at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:149)
        at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:104)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
        at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:76)
        at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:2100)

start-hbase.shを追うと、hadoopコマンドからパスを取って、くっ付けて起動してた。

hadoopがrpmでインストールされていたので、そっちのパスも含んでいたのが原因でした

。。。。。。

gitで重いリポジトリをcloneするとき

git clone http://example.com/fuga.git

remote: Counting objects: 3203, done.
remote: warning: suboptimal pack - out of memory
remote: fatal: Out of memory, malloc failed
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: protocol error: bad pack header

エラーになるので少しずつ落とす

git clone --depth 1 http://example.com/fuga.git
git fetch --depth 10
git fetch --depth 100 # 値は調整しつつ
git fetch --unshallow # 最後に全部落とす このオプションは最新のgitでないとない

vagrantを普通にpackageしてもネットワークエラーがおきるものらしい

解決方法は、

sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules

を打ってから、vagrant packageしないといけない。

ホストオンリーネットワークとかブリッジの設定をしている場合必要みたい。

なんでこの問題がおきるかというと、

http://lfsbookja.sourceforge.jp/6.5.ja/chapter07/network.html

MACアドレスに基づいてネットワークカード(eth1とか)に名前が付けられるので、MACアドレスが変わるとエラーになるということらしい。なので初期化しておけばいいと。

つらいなぁ...( ˘ω˘ )

便利なjavaコマンド集

javaプロセス一覧

普通にps

% ps aux | grep java

jps

% jps
64806 activator-launch-1.0.8.jar

% jps -v
64806 activator-launch-1.0.8.jar -Dactivator.home=/Users/ryohongo/Downloads/activator-1.0.8 -Xms1024m -Xmx1024m -XX:MaxPermSize=256m -XX:ReservedCodeCacheSize=128m 

jps便利。

様々な統計

jcmd

threadやgcやロードしてるクラス数など色々な情報がざっくり出る。

% jcmd 64806 PerfCounter.print

java.ci.totalTime=5259552
java.cls.loadedClasses=8353
java.cls.sharedLoadedClasses=0
(略) ひたすら統計情報が出る。

jcmdは多機能で、使いこなせればかなり色々できるようです。参考

jconsole

メモリやスレッドやGCなどの情報がグラフなどのGUIで見れる素敵なツール。

% jconsole
アプリが立ち上がる

GC

jstat

javaのgcに関する統計が出せます。

vmstatなどと同じように間隔を指定でき、↓では1000ms間隔で3回表示してます。

% jstat -gcutil 64806 1000 3

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  23.43   2.69  99.26      0    0.000     3    0.556    0.556
  0.00   0.00  23.43   2.69  99.26      0    0.000     3    0.556    0.556
  0.00   0.00  23.43   2.69  99.26      0    0.000     3    0.556    0.556

-gcutil以外にも色々オプションがありますが、まずは見やすいgcutilを打ってから他のを試します。

詳しい説明はこちら

列のS0Uなどの説明も載ってますが、Survivor0は他ではFromと呼ばれていたりするのでメモ。

  • Survivor0 = From
  • Survivor1 = To
  • YoungGC = ScavengeGC

muninとかでモニタリングできたらいいなぁ。

スレッド

jstack

javaのthreadダンプが出せます。kill -3よりも使いやすそう。

% jstack 64806

2013-10-10 11:30:04
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.0-b55 mixed mode):

"Attach Listener" daemon prio=5 tid=0x00007f8d129d1800 nid=0x7343 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
(略)

ヒープ

jmap

各クラスのインスタンス数とバイト数を表示。

% jmap -histo 64806

 num     #instances         #bytes  class name
----------------------------------------------
   1:         14042      111591248  [I
   2:        179231       23342824  [C
   3:         41970       12141904  [B
   4:         85041       11575592  <methodKlass>
   5:         85041       10069928  <constMethodKlass>
   6:          6765        7655512  <instanceKlassKlass>
(略)

設定の確認と変更

jinfo

指定したjvmの情報などが事細かに表示される。

% jinfo 64806

Attaching to process ID 64806, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.25-b01
Java System Properties:
(略)

設定もできる。

% jinfo -flag PrintGC 64806
-XX:-PrintGC

有効に

% jinfo -flag +PrintGC 64806
-XX:+PrintGC

値もかえれるかと思ったけどなぜかダメだった。ヘルプにはできると書いてるんだけどなぁ...

% jjinfo -flag MaxPermSize=1G 64806

まとめ

  • jps
  • jcmd
  • jstat
  • jstack
  • jmap
  • jinfo
  • jconsole

の紹介でした。よく使いそうなのはjpsとjcmdとjstatかな。

つらたん...(;´・ω・`)

Ajaxでクロスドメイン通信

Ajaxでクロスドメイン通信について調べたのでまとめ。

シンプルな例

client

var xhr = new XMLHttpRequest();
var url = 'http://example.com/xhr-response.php';
xhr.open('GET', url, true);
xhr.send();

server

<?php
header('Access-Control-Allow-Origin: *');
echo "ok";

Access-Control-Allow-Origin: *を付けてレスポンスすると、エラーにならず結果を受け取れる。

クッキー付きの送信

client

var xhr = new XMLHttpRequest();
var url = 'http://example.com/xhr-response.php';
xhr.withCredentials = true; 
xhr.open('GET', url, true);
xhr.send();

xhr.withCredentials = true;をつけることで、クッキー付きで送信される。

sever

<?php
header('Access-Control-Allow-Origin: ' . getenv('HTTP_ORIGIN'));
header('Access-Control-Allow-Credentials: true');

echo "ok";

Access-Control-Allow-Credentials: trueをつけ、

かつAccess-Control-Allow-OriginにはHTTPヘッダーのOriginをつける。

このOriginは、クロスドメインの通信の場合自動的に付与されて送られてくる。

対応ブラウザ

IE以外はok。

IE8,9はXMLHttpRequestではなく、XDomainRequest を使うことで対応可能。

IE6,7はいつも通り動きません。

GET以外

POSTリクエストやPUTリクエストなどは、あらかじめOPTIONSリクエストで許可をもらわないといけない。

client

OPTIONS
Origin: http://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER

server

Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 3600

再度、あらためてPOSTを送る。

参考