2015年1月5日月曜日

PHPはじめてなJava屋のチートシート


コメント

  • /
  • /** ~ */


メソッド

  • private メソッドの名前
    • アンダースコアからのキャメル
    • ex) _buildHoge() { }

演算子

  • ::(ダブルコロン)
    • static,定数,オーバーライドしたクラスのプロパティやメソッドに対してアクセス
  • ->(アロー演算子)
    • オブジェクトのメンバにアクセス 
    • ex) $this->(メソッド) // 自クラスのメソッド、変数にアクセス
  • ===(厳密な比較)
  • .(文字列結合)
  • .= (文字列結合代入)
    • $hoge = "aaa";$hoge .= "bbb!"; // $hoge は、"aaabbb" となる

モジュール

  • defined()
    • 指定した定数が存在しているかの確認
    • ex)bool defined ( string $name )
    • 定義するのは、define("A_B_C","className");

TIPS

  • フィールドへのアクセス等は$this->
    • private $_hoge = '';
    • $this->_hoge = "aaa";
    • とか
  • new クラス名してないのになんか使われてるっぽい
    • new ReflectionClass(クラス名)になってた
  • error_log() : 標準のエラーログ関数
    • ドコに吐かれるかは、php.iniで定義



参考にしてみたもの

Zend Framework PHP 標準コーディング規約
http://framework.zend.com/manual/1.12/ja/coding-standard.html

ほかGoogle先生


2014年12月10日水曜日

MacOS X LionにOpenStack Swiftのclientを入れる

だんだんLionのままにしてるの恥ずかしくなってきたけど…



// pipがなかったのでいれる
$ sudo easy_install pip

// swiftのclient入れる
$ sudo pip install python-swiftclient

// 怒られる
$ swift
Traceback (most recent call last):
  File "/usr/local/bin/swift", line 7, in 
    from swiftclient.shell import main
  File "/Library/Python/2.7/site-packages/swiftclient/__init__.py", line 20, in 
    from .client import *
  File "/Library/Python/2.7/site-packages/swiftclient/client.py", line 34, in 
    from swiftclient import version as swiftclient_version
  File "/Library/Python/2.7/site-packages/swiftclient/version.py", line 27, in 
    import pbr.version
ImportError: No module named pbr.version

// 足りなそうなもの入れる
$ sudo pip install pbr

// 違う理由で怒られる
$ swift --version
Traceback (most recent call last):
  File "/usr/local/bin/swift", line 7, in 
    from swiftclient.shell import main
  File "/Library/Python/2.7/site-packages/swiftclient/__init__.py", line 20, in 
    from .client import *
  File "/Library/Python/2.7/site-packages/swiftclient/client.py", line 34, in 
    from swiftclient import version as swiftclient_version
  File "/Library/Python/2.7/site-packages/swiftclient/version.py", line 28, in 
    version_string = str(pbr.version.VersionInfo('python-swiftclient'))
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 39, in __str__
    return self.version_string()
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 78, in version_string
    for part in self.release_string().split('.'):
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 70, in release_string
    self.release = self._get_version_from_pkg_resources()
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 62, in _get_version_from_pkg_resources
    return packaging.get_version(self.package)
  File "/Library/Python/2.7/site-packages/pbr/packaging.py", line 870, in get_version
    raise Exception("Versioning for this project requires either an sdist"
Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed?

// このwaringあやしい
$ pip list
(略)
Warning: cannot find svn location for setuptools==0.6c12dev-r85381

// upgradeしてみる
$ sudo pip install --upgrade setuptools

// ちゃんと動いた
$ swift --version
swift 2.3.1

2014年11月1日土曜日

MySQLのUNIQUE KEYにおける備忘録3つ


環境はMySQL 5.x、innodbを想定している。
備忘録的に。

1. text型にはUNIQUE KEYをそのまま設定できない

まぁ、可変長型に設定できないのはしょうがない。

※ご指摘頂きました。

blobのため、そのままでは設定できない、というのが正しいです。 代わりにvarcharでも使うことにしよう。
なお、textにインデックスを貼りたいときは、リファレンスにもある通り、こうすればOK
BLOB または TEXT カラムにインデックスを張る場合、インデックスに対して接頭辞長を指定しなければなりません。
例 : CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
接頭辞は、最大 1000 バイト長 (InnoDB テーブルに対しては 767 バイト) まで可能です。接頭辞の最大長はバイトで評価されます。

一方、CREATE TABLE ステートメント内の接頭辞長は文字数として解釈されます。マルチバイトキャラクタセットを使用するカラムに対して接頭辞長を指定するとき、このことを考慮に入れなければいけません。
4.4.2. カラムインデックス



2. keyのlengthは最大で767byteまで

たとえば、UTF-8のとき、3byteで計算すると、varchar(256)はだめで、256*3=768byteになってしまう。(だから、varchar(255)をよく見かけるんだよね)。

あと余談。これ、UTF-8が3byte計算ならいいんだけど、MySQL 6系から今UTF8mb4と呼ばれている4byteUTFが標準のUTF-8になるらしく、そうなった場合、varchar(255)でもあふれることになるんだよね。

UTF8mb4のなにが嬉しいかというと、個人的には絵文字系がそのまま扱えるのが嬉しいかなw

3. NULLはいくらでも入る


nullの定義上、すべてのnullはユニークってことらしいので、nullはいくらでも入る。
カラムにdefault nullを定義するのもOK

2014年9月9日火曜日

MySQLでERROR:1093を回避する

まー些細なことなんですけどね。

エラーになる(as tmpが意味をなしてない)
update hoge set code = 0
where id IN 
(select id from hoge as tmp where id = 1 group by id  order by id)
;

こんなエラー
ERROR 1093 (HY000): You can't specify target table 'hoge' for update in 
FROM clause
mysqlって同じテーブルに対するサブクエリからの操作ができないんですよね。

リファレンスマニュアルより
http://dev.mysql.com/doc/refman/5.1/ja/subquery-errors.html

サブクエリは、SELECT ステートメント同様 UPDATE と DELETE ステートメント内で正当なので、UPDATE ステートメント内で、割り当ての為にサブクエリを利用する事ができます。しかし、同じテーブルを(この場合、テーブル t1)サブクエリの FROM 条項と更新ターゲットの両方に対して利用する事はできません。

ではどうするかというと、いっこ別に fromでtmpを受け取ってあげれば実はOK

うまくいく
update hoge set code = 0
where id IN (
select id from 
(select id from hoge where id = 1 group by id  order by id) as tmp
)
;

2014年6月30日月曜日

ImageMagickのコマンドラインツールで画像の情報をさくっと見てみる

環境はCentOS 6系 ImageMagick入れる
$ sudo yum install ImageMagick
identifyコマンドでチェック
$ identify -verbose newwindow.png

Image: newwindow.png
  Format: PNG (Portable Network Graphics)
  Class: DirectClass
  Geometry: 11x9+0+0
  Resolution: 72x72
  Print size: 0.152778x0.125
  Units: Undefined
  Type: PaletteMatte
  Endianess: Undefined
  Colorspace: RGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
    alpha: 1-bit
  Channel statistics:
    red:
      min: 117 (0.458824)
      max: 255 (1)
      mean: 207.97 (0.815567)
      standard deviation: 58.2078 (0.228266)
      kurtosis: -1.58905
      skewness: -0.506753
    green:
      min: 0 (0)
      max: 255 (1)
      mean: 170.879 (0.670113)
      standard deviation: 108.467 (0.425361)
      kurtosis: -1.28129
      skewness: -0.68968
    blue:
      min: 0 (0)
      max: 255 (1)
      mean: 170.879 (0.670113)
      standard deviation: 108.467 (0.425361)
      kurtosis: -1.28129
      skewness: -0.68968
    alpha:
      min: 0 (0)
      max: 255 (1)
      mean: 167.424 (0.656566)
      standard deviation: 121.088 (0.474855)
      kurtosis: -1.56516
      skewness: 0.659425
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 159.326 (0.624807)
      standard deviation: 111.088 (0.435638)
      kurtosis: -1.49685
      skewness: -0.508195
  Alpha: rgba(255,255,255,0)   #FFFFFF00
  Histogram:
        16: (117,117,117,255) #757575 grey46
        24: (153,  0,  0,255) #990000 rgba(153,0,0,1)
        34: (255,255,255,  0) #FFFFFF00 rgba(255,255,255,0)
        25: (255,255,255,255) #FFFFFF white
  Rendering intent: Undefined
  Gamma: 0.45
  Interlace: None
  Background color: white
  Border color: rgba(223,223,223,1)
  Matte color: grey74
  Transparent color: none
  Page geometry: 11x9+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2014-06-30T19:11:35+09:00
    date:modify: 2014-06-30T19:11:35+09:00
    signature: 2c79c5cc4298064485707a3e8c1e0ceba9f7241dd7366ff9a9dcb505a8b14936
    Software: Adobe ImageReady
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 220b
  Number pixels: 99b
  Version: ImageMagick 6.5.4-7 2014-02-10 Q16 OpenMP http://www.imagemagick.org
ずらーっとでてくる 例えば色空間(RGBとかCMYKとか)だったら
identify -verbose newwindow.png |grep Colorspace
  Colorspace: RGB
Colorspaceを見ればよいね。

2014年6月24日火曜日

jmxtermで手軽にJMX経由でmbeanの値を見てみる

ちょっと凝ったことをしたいときは、Javaだったり、JRubyなんかでスクリプト書いたほうがいいと思うんだけど。。。

単純に特定の値を見たい、そんなときはコマンドラインでカジュアルにチェックできると嬉しいよね、ってことで、jmxtermです。

ちなみに、グラフとか見たい時はJConsoleもいいけど、VisualVMのほうが見た目がよいね。最近のJavaならJAVA_HOME/bin配下にjvisualvmってのがあるから、そいつです。

 (閑話休題)

というわけで、チートシート風に。例では、hazelcastの値を取っていますが、別にhazelcastでなくてももちろんかまいません。

JMXを有効にするには、最低4つJVMの起動パラメータに追加してください。
(あたりまえだけど、外に晒される環境でああれば、適切なアクセス制限してください)

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=適当に
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

で、JVMを起動させたら、繋いでみる。
インタラクティブシェルとして操作もできるけど、パイプからコマンド投げたほうがなにかと便利。
javaが実行できる環境で叩いてください。これはMacで使用している例。

// ドメイン一覧
echo domains | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// bean一覧
echo beans -d com.hazelcast | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// info取得
echo 'info -b instance=sessions,name=hoge,type=IMap -d com.hazelcast' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// 対象の値全部
echo 'get -b instance=sessions,name=hoge,type=IMap -d com.hazelcast *' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// 特定の値
echo 'get -b instance=sessions,name=hoge,type=IMap -d com.hazelcast localHeapCost' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// keyは要らんからvalueだけ
echo 'get -b instance=sessions,name=hoge,type=IMap -d com.hazelcast -s localHeapCost' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port


らくちんですなー