2015年2月27日金曜日

コマンドでOphcrack(Windows7対象)

基本的にWindowsは使ってないんだけど、身内がWindows7でパスワード忘れたわーわーってなってたので、久しぶりにOphcrackでパスワードリセットしたのでメモ。

なんか、LiveCDのisoをusbメモリに書き込んでbootさせたんだけど、なんかXがうまく立ち上がってくれなかったので、コマンドラインで実行してみた。

対象環境
Windows 7

流れ

1. ここ(http://ophcrack.sourceforge.net/download.php?type=livecd)から
「ophcrack-vista-livecd-3.6.0.iso」をダウンロード

2. ここ(http://ophcrack.sourceforge.net/tables.php)から「Vista free」をダウンロード

3. 1をbootableな形式でusbメモリに書き込む。2もusbメモリに書き込む(別のusbメモリにするか、別パーティションにするとよい)

4. 3で作ったusbメモリで作業対象のPCをboot(BIOSでboot順序を変えておく)

5. Xが起動せずにシェルが起動した場合はsuしてrootになっておく(公式サイトによれば、suのpasswordは"root")

6. 2のvista freeのテーブルディレクトリをマウントしておく

例)# mount /dev/sdb2s2 /mnt


7. こんなコマンドを実行。おしまい

例)# ophcrack -g -t /mnt/table -w /media/sda3/Windows/System32/config

オプションの意味
-g : GUIを起動しない
-t : テーブルファイルの置き場を指定。今回は6でマウントした場所になっている
-w:windowsのCドライブをマウントしているところを指定して、System32のconfigを指定

まぁ、tableファイルいろいろあるけど、そんな長くないパスワードだったらVista Freeのテーブルだけで、5分ぐらいでいけると思う

( ´ー`)フゥー...

2015年2月24日火曜日

Rのチートシート


RとRubyによるデータ解析入門
http://www.amazon.co.jp/dp/4873116155
2章を参考に。


環境周り


Rの導入(macportsで)
sudo port install R

ファイルをコマンドラインから実行
R --vanilla --slave < hoge.R

--vanilla : Rがこれまでに保存していたオブジェクトを読み込まない
--slave : 標準出力に表示を出さない

パッケージのインストール
install.packages('tree')

インストール済パッケージ一覧
installed.packages()

パッケージのアンインストール
remove.packages('hoge')

パッケージの使用
library(tree)

Rのシンタックス

コメント
#

代入演算子

x <-1
or
1 -> x
or
mean(x = 1:10)

=はトップレベルでのみ使うことができて、関数内で使った場合はスコープが関数内になる。
x <- 1:10
とすると関数外でも使うことができる。

関数定義

my_function <- function(x,y) {

}


関数作成時に初期値を設定するには下記のようにする

my_function <- function(x,y=5) {

}

関数呼び出し

my_function(1,2)

引数に初期値がある場合は、すべての引数を指定しなくても良い

my_function(1)


条件文とループ


条件文の例

x <- 10
if (x > 20) {
print("x is greater than 20")
} else {
print(x is less than 20")
}

ループ3つ

repeat {}

breakないと止まらないお


while () {}

for ( x in 1:10) {}


データ構造

ベクトル(1次元配列)

// 結合関数cでつくる
> height <- c(1,2,3)

// :演算子でつくる
> 1:10

// seq関数でつくる
> seq(0,100,by=10)

// ベクトルの長さを取る
> length(height)

// ベクトルにアクセス
> length[1]

ベクトルのインデックスは0からではなく、1からはじまる

// 複数要素を取ることもできる
> length[2,3]


リスト

// key/value的な感じ
> peater <- list(name='Peter', age=30, glasses=TRUE)

// 参照は、位置もしくは、名前
> peater[1]

> peater['name']

// exact=FALSEにすると、名前の部分一致でもアリらしい
> petaer['na',exact=FALSE]


行例

> m <- matrix(1:20,nrow=5,ncol=4)

// デフォルトは列方向につくられるので、行方向につくりたいとき
> m <- matrix(1:20,nrow=5,ncol=4,byrow=TRUE)


アクセス

// 10番目、の意
m[10]

// 位置
m[3,4]

// 行列3~5行目,2~3列目
m[3:5,2:3]


配列

ベクトルを2次元以上へ拡張したもの。array()で作成する。
行列を複数つくる感じ

> a <- array(1:24,c(2,3,4))


ファクタ

値には、名義値、順序値、連続値がある。
名義値と順序値をつくりたいためのファクタ。


> colors <- c('green', 'red', 'blue')
> factor(colors)
[1] green red   blue
Levels: blue green red

デフォルトではabc順。factor作成時に順序指定することもできる。
> factor(colors, order=TRUE, levels=colors)


データフレーム

名前のついた複数のベクトルからなるリスト

ちょい書きかけ...

2015年2月22日日曜日

MacOSXでの複数Java環境の管理

yosemiteにて

インストールされているJava一覧


$ /usr/libexec/java_home -V

Matching Java Virtual Machines (2):    1.8.0_25, x86_64:   "Java SE 8"     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home    1.7.0_40, x86_64:   "Java SE 7"     /Library/Java/JavaVirtualMachines/jdk1.7.0_40.jdk/Contents/Home/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home


いまのJavaHome

$ /usr/libexec/java_home

/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home

余談

JavaHomeの切り替えなんだけど、

export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_25` 

みたいなversion指定で切り替えられるんだけど、個人的には、

 ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home /usr/local/java8

みたいにソフトリンクのほうが、
共存させててるときにわかりやすいなのでなんとなくそうしてる

2015年2月20日金曜日

MySQLでデッドロック検知したときに、とりあえず見るところ

お手本はこちら。
http://d.hatena.ne.jp/sh2/20090618

これはただの自分用のメモです。
5.5 later想定

デットロックが監視にひっかかったら!!


  • 心を落ち着かせる
  • show full process list;
    • 今流れてるクエリを眺める
  • show engine innodb status\G
    • LATEST DETECTED DEADLOCKのあたりを見よう
  • select * from information_schema.INNODB_TRX order by trx_id;
    • limitとかwhereとか適当に効かせて
    • ロックを引き起こしてる輩:information_schema.INNODB_LOCKSをみる
    • ロックで待たされちゃってる輩:information_schema.INNODB_LOCK_WAITS
  • ( ´ー`)フゥー...




2015年2月6日金曜日

2015年やること

1月中、いろんなことを調べたり、試したりしていて、今年やることを(今更)決めたので、残しておこうと思う。これはただのチラ裏。

いろいろ考えていたのは、今年というか、30代のテーマどうしようかなーと思っているのがあって、なかなかもやもやしていたのだった。

やることってか、学ぼうリストみたいな感じですね(言ったからにはやろうというか)

今年やること


英語

いい加減Google翻訳に頼る生活辞めたい。普通にTOEICの勉強しようと思う。

数学(統計)

ECサイトにいることもあって、手元にデータなんかいろいろあるので、いっちょセクシィなアウトプットを目指す。

Ruby

仕事は相変わらずJavaを書いてる気がするんだけど、趣味のものはなるべくRuby使おうかな、と。もう少し慣れたい。Rubyで仕事をしたいかというと特にそういうのもないんだけど。

関数型言語(Haskell ?) 

最近、情報が多いのがHaskellなので、これかなー


今年やるかも?


Go

swiftはたぶんやらない


ほか、仕事で必要になった知識は別途是是非でやっていくということで。

人生上の大きなイベントが昨年から今年にかけて多いので、勉強の時間取るのをうまくやっていかないとね。

おしまい

2015年2月2日月曜日

固定長リストへ循環アクセスするサンプル

タイトルまま



コード
package hoge;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class TestTest {

 @Test
 public void test1() {
  
  List list = Arrays.asList("a","b","c","d","e","f","g");
  
  for(int i=0;i< 10;i++) {
   System.out.println(list.get(i % list.size()));
  }
 }
}
実行結果
a
b
c
d
e
f
g
a
b
c

2015年1月16日金曜日

【補足あり】JavaCVでPixel操作サンプル

さて、昨日つくった環境で
http://blogger.shase.info/2015/01/javacv.html
公式のサンプル(といっても結局c++なんだけど…)っぽいことをしてみる。

https://code.google.com/p/javacv/wiki/OpenCV2_Cookbook_Examples_Chapter_2#Accessing_Pixel_Values
ここにある、Accessing Pixel Values ってやつ。

元画像


加工後















コード
package hoge;

import org.junit.Test;

import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_highgui.*;

public class HogeTest {

 @Test
 public void test1() {

  IplImage image = cvLoadImage("abc.jpg");
  CvMat cvMat = new CvMat();
  cvGetMat(image, cvMat);

  int div = 100;
  int nbElements = cvMat.rows() * cvMat.cols() * cvMat.channels();
  for (int i = 0; i < nbElements; i++) {
   double v = (int) cvMat.get(i);
   double newV = v / div * div + div / 2;
   cvMat.put(i, newV);
  }

  IplImage image2 = new IplImage(cvMat);
  cvSaveImage("abc2.jpg", image2);
  cvReleaseImage(image);
 }
}

CvMatのgetとputがduplicatedってどーゆーことー ?_?


【補足】
get,putの代わりにcvGet2Dとか、cvSet2Dとかあるのでこれでよいですね。
と、ここまで、やって、OpenCV使うにしてもJavaCVいろいろ微妙なんじゃないかな、と思い始めた俺ががいる。

MacOSでJavaCVが動かなくて悲しい思いをした

環境は、Mac OS

OpenCVやりたいー。
Javaだから、JavaCV使って見ようと思って、pom.xmlに追加するじゃないですか。

https://github.com/bytedeco/javacv

  <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>0.10</version>
  </dependency>

公式サイトの通り。
で、公式サイトの通りテストプログラムを書いてみる。


import org.junit.Test;

import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_highgui.*;

public class HogeTest {

  @Test
  public void test1() {

    IplImage image = cvLoadImage("/Users/hoge.jpg");
    if (image != null) {
      cvSmooth(image, image);
      cvSaveImage("/Users/hoge2.jpg", image);
      cvReleaseImage(image);
    }
  }

}

でもこんなエラーになるわけです。
java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
  at java.lang.Runtime.loadLibrary0(Runtime.java:845)
  at java.lang.System.loadLibrary(System.java:1084)
  at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:535)
  at org.bytedeco.javacpp.Loader.load(Loader.java:410)
  at org.bytedeco.javacpp.Loader.load(Loader.java:353)
  at org.bytedeco.javacpp.opencv_core.(opencv_core.java:10)
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:264)
  at org.bytedeco.javacpp.Loader.load(Loader.java:385)
  at org.bytedeco.javacpp.Loader.load(Loader.java:353)
  at org.bytedeco.javacpp.opencv_highgui.(opencv_highgui.java:13)
  at jp.co.cyberagent.dokusho.service.HogeTest.test1(HogeTest.java:17)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:601)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.UnsatisfiedLinkError: no opencv_core in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
  at java.lang.Runtime.loadLibrary0(Runtime.java:845)
  at java.lang.System.loadLibrary(System.java:1084)
  at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:535)
  at org.bytedeco.javacpp.Loader.load(Loader.java:401)
  ... 31 more

悲しい。 結論から言うと、コイツ、いろんなjarが足りないらしい。ひどい! で、それらの足りないものを補ってくれるものが公開されてます。

ずばりここに書いてあった。

Making Computer Vision actually work
http://marellbox.marell.se/?p=687

で、書いてある回避用リポジトリをpom.xmlに追加すると動いたー。


<dependency>
    <groupid>org.bytedeco</groupid>
    <artifactid>javacv</artifactid>
    <version>0.10</version>
 </dependency>
 <dependency>
     <groupid>se.marell</groupid>
     <artifactid>opencv-macosx-x86_64</artifactid>
     <version>2.4.10-0.10</version>
     <scope>runtime</scope>
 </dependency>
 ...
 <repository>
   <id>marell</id>
   <url>http://marell.se/nexus/content/repositories/releases/</url>
 </repository>

( ´ー`)フゥー...

2015年1月14日水曜日

JavaでVarnish用のHttpMethod BANを発行してみる

いわゆる独自メソッドを定義したいという話。

やりたいことは、

curl -X BAN http://localhost/hogehoge

これ。

Javaでやると、こんなんなった。

最初SpringのrestTemplateで考えていたんだけど、これ独自メソッドにどうやってやるんやろ?ってしばらく悩んだ結果、諦めてApacheのHttpClientにしてみた。。。

2015年1月10日土曜日

rbenvでruby2系の環境をつくる

CentOS 6系で試したメモ


#事前に入れておく
yum install -y git gcc openssl-devel

#rbenvを拾ってくる
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# pathを通す
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

#上記の読み込み
exec $SHELL -l

#rbenvの動作確認
rbenv -v

#ruby-buildの導入
git clone https://github.com/sstephenson/ruby-build.git~/.rbenv/plugins/ruby-build

cd ~/.rbenv/plugins/ruby-build

#install 可能リスト
rbenv install --list

#2.1.2のinstall
rbenv install -v 2.1.2

#再読み込み
rbenv rehash

#設定
rbenv global 2.1.2

#確認
ruby -v

2015年1月9日金曜日

Sinatraでechoサーバー

rubyが入ってるmacにて。

sinatraのinnstall

gem install sinatra --no-ri --no-rdoc -V

echo.rb


require 'sinatra'
get '/hoge' do
                  http_headers = request.env.select { |k, v| k.start_with?('HTTP_') }
                   p "#{http_headers}" 

起動コマンド

ruby -rubygems ./echo.rb -o 127.0.0.1 -p 10000 &

動作確認 

http://127.0.0.1:10000/hogeにGETでアクセス

sinatraの仕様はこちらを参考にしました
http://qiita.com/mechamogera/items/9c620155e669b394d513

5分でできますね。(^^)

2015年1月6日火曜日

Macで、apache + phpの環境をつくる

MacPortsでちょーざっくり

phpとapacheとhandler入れる


sudo port install php53 apache2
sudo port install php53-apache2handler

他必要なものがあったら入れる
(sudo port list php53-* ででてくるものとか)

apacheにモジュール読み込ませる


cd /opt/local/apache2/modules
sudo /opt/local/apache2/bin/apxs -a -e -n php5 mod_php53.so

httpd.confに追加

#phpのtypeを追加
AddType application/x-httpd-php .php
Include conf/extra/httpd-vhosts.conf
Include conf/extra/mod_php53.conf
DirectoryIndex index.html index.php


httpd-vhosts.confに最低限の設定を

<VirtualHost *:80>
    DocumentRoot "/opt/local/apache2/htdocs"
    ServerName localhost
</VirtualHost>

php.iniを環境にあわせて編集


sudo ln /opt/local/bin/php53 /opt/local/bin/php
sudo cp /opt/local/etc/php53/php.ini-development /opt/local/etc/php53/php.ini
sudo vim /opt/local/etc/php53/php.ini

適当に 


apache起動


sudo /opt/local/apache2/bin/apachectl start

動作確認

sudo vim /opt/local/apache2/htdocs/info.php
$ cat /opt/local/apache2/htdocs/info.php
<?php
  phpinfo();
?>
ブラウザで、 http://localhost/info.php



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


らくちんですなー

2014年5月16日金曜日

Excelからのcsvをjava.nioで読んだらMalformedInputException

環境

  • Mac OS X Lion
  • Java 7
  • 元ファイルは素性のしれないxlsx
  • Excel 2011

経緯


素性のしれないxlsxをExcelでcsvにした

こんな読み込みをしていて
こんな例外が

java.nio.charset.MalformedInputException: Input length = 1

元のファイルを見てみる

$ file --mime fuga.csv
fuga.csv: text/plain; charset=unknown-8bit

unknownとかいっちゃってる。

sublime Textで、UTF-8 で保存しなおす。

$ file --mime fuga.csv
fuga.csv: text/plain; charset=utf-8

わーい。
これで読み込めた。


追記

そもそもなんだけど、Excelでcsv出力すると、S-JIS(固定)らしい。

別件で、InputStream扱うときに

BufferedReader br = new BufferedReader(new InputStreamReader(hoge.getInputStream(), "SJIS"));

List<String> stringList = new ArrayList<>();
while(br.ready()) {
    stringList.add(br.readLine());
}
br.close();

とかで読み込みできた。

ちなみに、hogeはSpringのMultipartFileです。


2014年4月30日水曜日

SpringMVCのform:selectだけど、optionのlabelが使いたい

結論から言うと、妥協してるのでいい方法があったら教えて欲しい。

元のやつ

<form:select class="hoge-form" items="${hogeMap}" path="hogeId" required="required">


hogeMapはSpringMVCのControllerで定義されているMap<Integer,String>である。
上記のようなタグは、実行されるとこんな感じになる。

<select id="hogeId" name="hogeId" class="hoge-form" required="required">
<option value="1">リスト1</option>
<option value="2">リスト2</option>
</select>

このoptionのところにlabelをつけたいんだけど、form:selectだとどうにもうまくいかなくて妥協したのがコレ

<select id="hogeId" name="hogeId" required="required">
<c:forEach var="hoge" items="${hogeMap}" varStatus="hogeStatus">
<option value="${hogeMap.key}" label="${hogeStatus.index}.${hoge.value}" class="hoge-form" />
</c:forEach>
</select>

生成されるのはこんなん

<select id="hogeId" name="hogeId" required="required">
<option value="1" label="0.リスト1" class="hoge-form"></option>
<option value="2" label="1.リスト2" class="hoge-form"></option>
</select>

びみょ

追記

別途modelMapになにかのmodelがあって、form:selectのpathに指定したやつがmodelMapのmodelのプロパティにあると勝手にそれをselectedにしてくれる機能を使ってる場合は別途、<option>にこんな指定が必要です。


${(model.hogeId eq hoge.key)?'selected="selected"' : ''


2014年4月22日火曜日

Basic認証ついてるAPIをSpringのRestTemplateでPOSTするサンプル

タイトルまんま。例えばcurlで


curl http://example.com/hoget -X POST -u shase:p@$$w0rd

こんな感じで使えるAPIをRestTemplateで使おうと思った時はこんなコードでOK



こちら参考にしました(リンク先はGETの例)
http://springinpractice.com/2013/10/02/quick-tip-basic-authentication-with-spring-resttemplate

2014年4月10日木曜日

骨の折れる話

案外インターネット上に情報が少なく感じたので、親指の骨折(母指基節骨骨折)から治療までの記録を簡単に残しておこうと思います。

今丁度2回目の手術(固定ワイヤーの抜針)が終わったところです。

時間のない人向けまとめ


  • スノーボードは油断するとすぐ怪我をするので気をつけよう
  • 手の外科は専門性が高いので、「手外科専門医」がいる病院を選ぼう
  • やっぱり保険は大切
  • 手術室のBGMは先生の趣味


ま、ふつーのことなんですが。。。
こっから語り入ります。


骨折〜診断

2月のとある日曜日に、会社の同僚とスノボに行き、誰も見てないところでふつーにこけました。

こけた時に、思わず左手をついてしまったらしく、親指の付け根のあたりから腫れていて、突き指をしたような痛みがありました。

痛みはあったものの、そんな大したこともないかな〜という感じで、自力で下山してその日は新幹線で東京の自宅に帰りました。

翌日、市販の湿布をして寝て起きて、それでもやはり腫れが引いておらず、これはヒビでも入ってるかなぁ、と思い、ネットで調べて家から近い整形外科のA診療所に向かいました。

そこで撮ったレントゲンを見ながら

「折れてますねー。これは手術しないとだめですねー」

という、宣告を受けたのでした。

ひと駅隣に、手の専門医がいる病院があるとのこと。

特に手の外科手術をしてくれそうな病院に心当たりがなかったので(普通無いですよね)、紹介状を書いてもらい、午後の診察に間に合わせる感じで、その専門医のいるB病院に行ったのでした。

手外科専門医

あとから知ったのですが、手という器官はとても難しいらしく、整形外科の中でも、更に専門性が高いそうです。

手外科学会というところが、「手外科専門医」認定制度を行っていて、そこに登録されている人は一応手外科の専門医として、認められているそうです。

こちらにリストがあります。

http://www.jssh.or.jp/ippan/senmon/senmoni-meibo.html

首都圏には多い気がしますが、やっぱり地方には少ないですよねぇ。

この話もずいぶん後になってから知ったんですが、わたしを担当していただいた先生もリストにいました。
さて、その病院に行き、レントゲンを撮って、速攻で

「明日は祝日だから、明後日手術できます?」 

という話になり、ずーん、と落ち込んだのを覚えています。

なんでもやっぱり手術以外の解決方法がないとのことで、放置しておくと握力無くなる、という話でした。

セカンドオピニオンも一瞬だけ考えたんですが、最初に行ったA診療所の先生が、

「ウチでは手の骨折はこの病院を毎回紹介しているし、このへんの病院の間でも手ならB病院だね」

なーんてゆってたので、めんどくさくなってじゃあ明後日手術します。ということになりました。

その日は手術の為の血液検査とか、事前のブリーフィングとかして帰りました。

手術


人生で手術なんてしたことなかったのでガクブルだったんですが、事前の説明で

  • 日帰り手術
  • 麻酔は左腕一本(伝達麻酔?)
  • 時間は1時間ぐらい

ということだったので、まぁ、そこまででも無いのかなぁ、と思いました。

実際やってみるとしんどかったんですが。

日帰り手術なので、まず、入院して、手術着に着替え、熱を測ったり、血圧を測ったりします。

時間は結局前の患者さんの手術が押したりするとズレするので、だいたいO時ぐらい、という感じです。

ガクブルしながら暇を潰します。

そして、いざ呼ばれると、まぁ、手以外は元気なので、徒歩で手術室に向かいます。

手術室に入ると、まず患部を洗うように言われます。これも看護師さんに言われながら自分で洗います。

その後、手術台に横たわり手術。。。という流れなのですが、わたしが行った手術室では東京FMがずーっと手術中も流れていました


手術室のBGM

これもあとから知ったんですが、手術室のBGMって、先生の趣味、らしいですね。

先生によってはお気に入りのBGMを持ち込む人もいるとか、いないとか。。。

開腹のようなガチの奴はBGM無しだったりもするようです。

手術の流れとしては、麻酔〜執刀〜縫合、って感じでしょうか。

全身麻酔ではないので手術されている間意識があるんですが、金属製のワイヤーとかを扱っている関係で、

キーン、とか、バチッ(ニッパーで切る)とか金属加工音

がいちいち気になりますが、どうしようもないですよね。。。

都合2時間ほどかかったのですが、憔悴してるわたしに先生が一言

「靭帯も切れてたから縫っておいたよ」

と軽い感じで言われたのが印象的です。骨折に加えて靭帯も切れていたみたいでした(靭帯はレントゲンに映らないので開けないとわからない)。

この手術では結果ワイヤーを4本埋め込む事になりました。

術後

手術した当日の夜がしんどかったです。

麻酔が切れた途端、激しい痛みが押し寄せました

ま、切ってるから当たり前なんですが、耐えかねて痛み止めを2回分飲んだんですがそれでも痛くて、その夜は悶絶しながら寝ました

ちなみに、処方された薬は、


  • 鎮痛剤
  • 抗生物質
  • 胃薬


でした。これを5日ぐらい飲み続けます。痛みは2〜3日目からずいぶん良くなりました。
この時はギブス固定されています。

抜糸

術後一週間ぐらいで、抜糸が行われます。ハサミでチョキチョキってかんじです。まだギブスは取れません。

ワイヤーを1本抜く

術後三週間ぐらいで、1本ワイヤーを抜きました。といっても手術ではなく、

ワイヤー1本は外に露出してる

という状態でした。それをペンチでエイヤーって抜く感じですね。これはこれで痛い。

このタイミングでギブスも外れました。

リハビリ(指を動かせ)と言われるのもこの辺りから。


保険について

手術の費用としては、3割負担のおかげで、1回数万円程度でした(痛い出費ですが。。。)

スノーボード用の簡易な保険とかに入っておくのも良いかも、と今回の事件を振り返って思いました。

旅行代理店のパック旅行中の怪我だったので、通院が終わって総額が算出され次第、保険適用の申請をする予定です。

最初に通院した時に、旅行代理店に電話したところ、「事故発生報告」のような書類の提出を求められ、返信すると、各種手続きの書類が送られてきました。

通院時の領収書等を残しておいたほうが良いとの事だったので、一応全部残してあります。

再手術の日程決まる

術後六週間ぐらいで、そろそろ再手術できるかな、という話になりました。指にワイヤー3本残っており、それを撤去する手術になります。

ちょうど年度初めにかぶっていたので、わたしは1周間だけずらしました。

再手術

術後八週間ぐらいで、再手術と相成りました。今回の手術も

  • 日帰り手術
  • 局部麻酔(今度は腕ではなく、手だけ)
  • 時間は1時間ぐらい

という話でした。

基本的な流れは前回の手術と一緒なんで、端折りますけど

  • 時間はすぐ終わった(手術時間自体は10分程度)
  • 手だけの麻酔なので逆に痛い(麻酔の注射自体の痛みとか、腕に感覚があることによる痛みとか)
  • やっぱり手術室は東京FMだった
という感じで、とりあえず無事終わりました。

術後の痛みも前回に比べれば全然マシでした。でも、やっぱり憔悴してはいます。。。

最後に

今後の流れとしては
  • 抜糸
  • リハビリ
  • 術後1ヶ月ぐらいに先生の最後のチェック
  • 終了
という感じだそうです。(もちろん、予後次第というのはありますが)。

今回のことで、多くの人にご迷惑をお掛けして申し訳ないと思いつつ、また多くの人に心配して頂いて感謝の気持ちでいっぱいでした。

一気には難しいかもしれませんが、ちょっとずつ恩返しができたらなぁ、と思っています。

2014年4月3日木曜日

Springockitoのメモ(一部だけMockitoのモックに)

要旨

Spring+Mockitoを使った環境で、DIしてテストしたいときに、一部だけMockitoのモックに置き換えたい、という話。

Mockito単体だとなんかうまくいかなくて。
もしかしたら、Mockitoでも、やりかた間違ってんのか、もしくは、PowerMockとか使えばいけんのかも。

説明

このコードは、Service1の中で、Service2のメソッドが呼ばれています。
で、Service1のテストをしたいんだけど、Service2のメソッドだけモックにしたい。 しかし、Service1の他の処理はモックにしたくない。

そんなとき。

こんなコードで動くかなーと書いてみます。 残念ながら、このコードは動きません。

ここで、Springockitoです。
 https://bitbucket.org/kubek2k/springockito/overview


こんな書き方ができます。

使い方

Mavenの人はpomにこんな感じで追加しといてください。

Javaでテストと言えばコレ

2014年3月23日日曜日

vimチートシート(書きかけ)

導入


tmux.confの設定
ln -s ~/Dropbox/dotfiles/.tmux.conf ~/.tmux.conf

vimの設定
mkdir -p ~/.vim
mkdir -p ~/.vim/bundle
ln -s ~/.vimrc ~/Dropbox/dotfiles/.vimrc 

neobundle.vimの導入
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

:NeoBundleInstall

でOK

参考にしました
http://www.karakaram.com/vimfiler
http://qiita.com/hide/items/b0087bc0bbc36d0f91fb

neobundle

参考にしました
http://vim-users.jp/2011/10/hack238/
http://qiita.com/puriketu99/items/1c32d3f24cc2919203eb


コマンドチートシート

  • 大文字小文字変換
    • ~
  • 行番号の表示非表示
    • set number / set nonumber

2014年1月9日木曜日

Eclipseでメソッドをオーバーライドした際に、@inheritDocコメントを入れる

Eclipseにて

[環境設定] -> [Java] -> [Code Style] -> [Code Templates] -> [Comments] -> [Overriding methods]

こいつをEditして、下記の感じに編集

/**
* {@inheritDoc}
*/

OKしてapply

下の方の、Automatically add comments for new methods and types
にチェックをいれればおしまい。

あとは、オーバーライドすると勝手に上記のコメントが挿入されるようになります。