2012年8月31日金曜日

[java]JavaでPDF出力

やりたいことはなんとなくPDF出力。
POIでさわって動的に作ったExcelをJODConverterでLibreOffice経由してPDFに出力できるとそれっぽいなっと。

やり方や考え方はここで示してくれている通りです。
http://d.hatena.ne.jp/s-ishigami/20110520/p1
ただ、いくつかハマったのでメモしときます。
Webでやる前に下記のようにコマンドラインで確認すればまあ問題ないと思いますので、コマンドラインまでのメモになります。

■環境とか

ubuntu-12.04-server-amd64.iso
java version "1.6.0_24" (OpenJDK)
JODConverter2.2.2
LibreOffice 3.5

■手順


1.フォントをインストール

sudo apt-get install otf-ipafont
これやらないと日本語が豆腐になります。もちろんなりました。
http://gihyo.jp/admin/serial/01/ubuntu-recipe/0153

2.LibreOfficeをインストール
http://d.hatena.ne.jp/pochio_pochiyama/20110126/p1

$ sudo apt-get purge "openoffice*.*"
$ sudo add-apt-repository ppa:libreoffice/ppa
$ sudo apt-get update
$ sudo apt-get install libreoffice libreoffice-gnome libreoffice-l10n-ja

add-apt-repository がなかったので。
http://vmem.jp/2010/11/10/add-apt-repository%E3%81%8C%E3%81%AA%E3%81%84/
$ sudo aptitude install python-software-properties

3.LibreOfficeをサービスで起動
http://www32.atwiki.jp/parepan/pages/144.html
結論・・・・

OpenOfficeは「2.4.1日本語版のRPM, JRE付き」を使用した。
 OOo_2.4.1_LinuxIntel_install_wJRE_ja.tar.gz
 解凍してX-windowからsetupを実行してインストールした。

OpenOfficeをサービスで起動する場合は
 # soffice -headless -accept="socket,port=8100;urp;" -nofirststartwizard
 ※「-nofirststartwizard」で起動しないとダメです。

jodconverter-2.1.1を使う。
java -jar jodconverter-2.1.1/lib/jodconverter-2.1.1.jar test.ppt test.pdf

私の環境ではオプションの指定で怒られたので、こんなコマンドでした。
soffice --headless --accept="socket,port=8100;urp;" --nofirststartwizard

実はフォントをこのあとにインストールしてサービス起動し直さず、文字化けの豆腐が直らない直らないとわめいておりましたw
この手順通りにすれば豆腐にはならないです。

4.JODConverterをインストール(というかzip解凍)
http://sourceforge.net/projects/jodconverter/files/JODConverter/2.2.2/

DLするのはこれ。
jodconverter-2.2.2.zip

tomcatやjettyで使うならこれ。
jodconverter-webapp-2.2.2.zip

5.JODConverterを実行して変換
http://chipmunkland.blog104.fc2.com/blog-entry-198.html

java -jar jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar input.xls output.pdf


ここまでできればきっとWebアプリでの連携もできると思います。
フロントエンドのWebアプリでリクエストを受けて、その内部でlocalhost:8080 的なサーバにリクエストレスポンスでバイナリを受け渡すか、Webアプリ内でシェルを実行するかの違いかな。
初めてやったんですが、なかなかおもしろかった。

2012年8月30日木曜日

[IntelliJ IDEA]カーソルがおかしくなったときに見直す設定

こんなカーソル(あとから知ったがcaretというみたい)


こんな感じに戻す


これなんでかなー?と必死だったけど自分で実は設定していたという…


Use block caret の設定を非チェックにしたら元に戻った。
Column Selection Mode とか windows の 上書きモードみたいなんかと思ったけどもっと初歩だった。

2012年8月27日月曜日

[python]py2exe で RuntimeError: EndUpdateResource

python setup.py py2exe でエラーが。

RuntimeError: EndUpdateResource: 指定されたデバイスまたはファイルを開けません。
なんだこれ。


Turns out it was anti-malware software (panda cloud)  i installed that interferred with the creation of the executable.
Since i uninstalled the software everything works smooth.
ウイルスソフト?
一時的にオフにしてやってみるとできたー。

マジでか。

setup.py はこんなやつ。

# -*- coding: utf-8 -*-
from distutils.core import setup
import py2exe

py2exe_options = {
    "compressed": 1, #圧縮する
    "optimize": 2,
#    "bundle_files": 2,# dllとexeが別
    "bundle_files": 1,# 1ファイル
}

setup(
    options = {"py2exe": py2exe_options},
    name="hello",
    console=["hello.py"],
#    data_files=[("static", glob.glob("static\\*.html")), ("templates", glob.glob("templates\\*.html"))],
    zipfile = None,
)

2012年8月22日水曜日

[other]現在の緯度経度からタイムゾーン取得

やりたいことはまさにこれ。

http://qa.atmarkit.co.jp/q/2309

qa内での引用元はstackoverflowのこれ。

http://stackoverflow.com/questions/5584602/determine-timezone-from-latitude-longitude-without-using-web-services-like-geona

  • Download the database of cities from geonames.org
  • convert it to a compact lat/lon -> timezone list
  • use an R-Tree implementation to efficiently lookup the nearest city (or rather, its timezone) to a given coordinate
って言ってる。

この都市情報はすげー役に立つ。
データはタブ区切りのデータになっているのでExcelやらawkやらで必要なところだけを切り取る。
私は3行目の都市名、5行目の緯度、6行目の経度、18行目のタイムゾーンだけの簡易リストを作る。

この次が…。
R-Treeのロジック作れってあるんだけど
二分木レベルお勉強中の自分のレベルじゃわからず…。

pythonにはrtreeなんてパッケージもあるよう。
これみてないけど、これつかっても解決できるかもしれない。
http://shibaok.net/index.php?prog%2Fpython%2Frtree

データをMySQLとかにつっこんでとりあえずプロトタイプを作りたいのでオーダーやフルスキャンをおそれずにこれを参考にさせてもらった。
http://ziddy.japan.zdnet.com/qa6032321.html

DBに保存している緯度経度リストが格納されているテーブル名が「location」
緯度が「latitude」フィールド、経度が「longitude」フィールドに格納されていたとしまして
以下のようなSQL文を実行すれば結果はだいたい近い順に並びますので
その一番上が一番近い1件となります。

SELECT * FROM `location` ORDER BY ABS(`latitude` - [調べたい緯度]) + ABS(`longitude` - [調べたい経度]) ASC
適当にテーブルを作る。


mysql> create table location ( city varchar(255), latitude double(10,5), longitude double(10,5));

さっき作った簡易リストをロードデータにして取り込み。


mysql> LOAD DATA LOCAL INFILE 'C:\\Users\\user\\Desktop\\city_lat_long_timezone.txt' INTO TABLE location FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

これで引用したクエリにlimit 1 とかつけて投げれば期待値は返る。
パフォーマンス…。



2012年8月20日月曜日

[python]rietveld で UnicodeEncodeError

UnicodeEncodeError : 'ascii' codec can't encode characters


このエラーそのものは、pythonでマルチバイト文字を扱ってるとよく起きる。
rietveld で diff を登録して View しようとするとエラーでトレースバックでこれが表示。
どうしてだろうと思いながら原因は明白だった。
SVNリポジトリのパスにマルチバイト文字を含んでいたら。
日本でSVNリポジトリに日本語文字列を含んでることって可能性としては低くないはず。

解決するには、 models.py の fetch_base 関数で result = urlfetch.fetch(url) にてHTMLレスポンスを期待してるところをエラーにならんようにする。
エラーにならんようにするには、単純に unicode の url 変数にマルチバイト文字が含まれているのでうまいことその部分をエンコードしてやる。
urlparseを使って回避してみた。


    try:
      url_list = urlparse.urlparse(url)
      url_path = url_list[2] # URLパスを取得
      url_path = urllib.quote(url_path.encode('utf-8')).decode('utf-8') # URLパスのマルチバイト文字をURLエンコード
      # TODO パラメータもURLエンコード
      new_url_list = list(url_list)
      new_url_list[2] = url_path # URLパスをエンコードしたunicode型の文字列に入れ替え
      url = urlparse.urlunparse(new_url_list) # URL生成
      result = urlfetch.fetch(url)
    except urlfetch.Error, err:
      msg = 'Error fetching %s: %s: %s' % (url, err.__class__.__name__, err)
      logging.warn('FetchBase: %s', msg)
      raise FetchError(msg)
    except Exception:
      raise Exception('error')


こんな感じにしました。
そもそもURLにマルチバイト文字を含めるなっつうことですね。

あと、私の環境ではHTTPステータスが401です。
これどうしたもんか。
Basic認証は実装されてない感じ?


2012年8月14日火曜日

[プロキシ]burp suite ことはじめ

burp suite を使う場合、SSL通信をプロキシでとめて中身を参照したり変更したりするのだと思います。
その前提で設定とか。

burp suite は javaアプリなので実行環境としてJavaをインスコしときます。

java -jar burpsuite.jar とかでプロキシを起動します。

次に、ブラウザ(Chrome)でプロキシ設定をします。

WindowsならIEのインターネットオプションみたいなのがでるのでLANの設定から localhost 8080 に。
もちろん、プロキシのオプションタブでポートとかいじってるのであればそれを指定。
Macなら環境設定のネットワークが表示されるのでプロキシタブでWebプロキシ(HTTP) と 保護されたWebプロキシ(HTTPS)を選択。
localhost:8080 とか 127.0.0.1:8080 とかを入力。

これで準備OK、なんですが、最近のブラウザは証明書のホストと通信先ホストが違うのをちゃんと知らせてくれるのですが、今回ばかりはこれが邪魔なので無視する設定にしたい。

http://chrome.half-moon.org/43.html#qd1d616c

Chromの起動オプションに --ignore-certificate-errors を追加して起動。
SSLセキュリティ証明書のチェックもろもろを無視するので危ないオプションです。
本当に必要なときだけに限定して使います。

※もしこのオプションがない場合、一度HTTPSなページを踏んでブラウザで信用する、みたいにすればOKです。ただ、Facebookとかは画像などのリソースをCDNかなんかで提供してるっぽくて、ホストが違うのでChromeのDeveloperToolのNetworkなどで赤色のエラーのものをクリックしていっこいっこ承認していかないといけないです。Twitterは戻るボタンだけで信用する的なボタンもなかったです。

http://isann0330.tumblr.com/post/29100326054/google-chrome
http://isann0330.tumblr.com/post/29099902605/q-a-okwave
http://isann0330.tumblr.com/post/29099837506/chrome

●mac
open -a Google\ Chrome --args --allow-file-access-from-files

●windows
call "chrome.exe" --args --allow-file-access-from-files

みたいなかんじで。

●javaコマンド
java -jar -Dfile.encoding=UTF-8 burpsuite_v1.4.01.jar 

一応、文字コードしていしとく。なくてもいけるっぽいけど。


仕組み
おもしろいよ。


おわり。



2012年8月7日火曜日

[apache]basic auth

Basic認証するメモ。

なんかこの界隈、やたらとアカパスを作成するWEBのツールあるけどなんでだろう。
もちろん、 htpasswd でやります。

. 手前味噌でげすが、http://isann.blog2.fc2.com/blog-entry-260.html の「■Basic認証アカウントを作成」を参考に。

.htpasswdファイル作成
(1).htpasswdファイルを新規作成する場合
[root@centos ~]# htpasswd -b -c /etc/httpd/conf/.htpasswd centos centospassos ← .htpasswdを作成してユーザーcentosを登録する
Adding password for user centos


(2)既存の.htpasswdファイルへユーザーを追加する場合
[root@centos ~]# htpasswd -b /etc/httpd/conf/.htpasswd centos centospassos ← 既存の.htpasswdへユーザーcentosを登録する
Adding password for user centos


(3)ユーザー登録確認
[root@centos ~]# cat /etc/httpd/conf/.htpasswd ← ユーザー登録確認
centos:vYwnFfo59lI/c

あとは、http://kensakuyoke.web.fc2.com/Basic.html を参考にさせて頂いて
.htaccess に

AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user(ここに改行をかならず)

こんな感じで。

[phpMyAdmin]インストール

微妙にwindowsの記事しかないので。
まあコマンドラインのほうがレスポンス的にも好きだんけど。
これがないと始まらない人もいるわけで、そういう環境構築をするのですよ。

httpdからインスコするなら
http://centossrv.com/apache.shtml
ここみながら。

yum -y install httpd

yum -y install php php-mbstring

vi /etc/httpd/conf/httpd.conf

    AllowOverride None
  ↓
    AllowOverride All ← .htaccessの許可

これくらいでhttpdできるとおもふ。

そのあと、http://www.dbonline.jp/phpmyadmin/ みながら phpMyAdminのターボール落としてきて ほんとうはよくないんだろうけど
とりあえず /var/www/html/phpMyAdmin とかにコピー。

mysqlのライブラリ云々になるので http://www.happytrap.jp/blogs/2012/04/08/8779/ を参考にしてphp-mysql php-mbstring php-mcrypt とかインスコ。

そしたら多分いけたー。

DBサーバがローカルじゃなかったら http://www.dbonline.jp/phpmyadmin/install/index4.html の 「config.inc.phpの作成」を参考にして host の値を修正。

service httpd restart や service mysqld restart 忘れずにー。


[aws]ec2サーバにmroongaインストール


2012-08-07 時点での話で賞味期限は短いですが。

RDSでは日本語全文検索できないので(多分) ec2サーバに mysql サーバたてて mroongaエンジンで全文検索してみる話。

ec2サーバをamazon用のLinuxOSにして yum -y install mysql-server すると mysql 5.5 あたりのパッケージになっちゃいまして、

Can't open shared library '/usr/lib64/mysql/plugin/ha_mroonga.so' (errno: 2 /usr/lib64/mysql/plugin/ha_mroonga.so:

で怒られる。
DBサーバそのままでどうにかするにはこちらですが、私のレベルではついてきませんでした。
環境的にCentOS6 で mroonga 2.0.5 は mysql5.1 からビルドされていて、mysql5.5 はダメっぽい。

なので、
yum list installed | grep mysql
とかでパッケージを確認して
yum remove mysql-server.noarch mysql55-common.x86_64 mysql55-libs.x86_64 mysql55-server.x86_64
とかで間違ってインスコしたパッケージをアンインストール。

あと

% sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-0.noarch.rpm
% sudo yum makecache
すると404とかになる。
URLがないので、/etc/yum.repo/groonga.repoの baseurlの値を
http://packages.groonga.org/centos/6/$basearch/
とかに変更。


それから、
yum list | grep mysql
で配布されている mysqlパッケージを確認して、運良くAWSのリポジトリに5.1があるっぽいので
yum -y install mysql51.x86_64 mysql51-common.x86_64 mysql51-libs.x86_64 mysql51-server.x86_64
とかで、インスコ。なかったら /etc/yum.repo/ にリポジトリ追加。
あとは、公式のドキュメントに沿って、
service mysqld start
yum -y install mysql-mroonga
でOK。
mysql -u root
show engines;
でmroongaエンジンがあればOK。


2012年8月5日日曜日

[linux]mac virtualbox に ubuntu server を入れて ssh するまで


なぜこれだけのことにこんだけ時間かかったのか。
あとになるとわからないけどメモ。


やりたいことは、
山ライオンさんなmacからVirtualBoxのubuntu serverさんにsshしてゴリゴリする。


1.VirtualBox をインスコ

これはもうそのままですね。

2.ubuntu serverの仮想環境構築

VirtualBoxマネージャーで仮想環境の設定。
ubuntu serverさんのディスクイメージはここから。
バージョンは12.04LTSでした。
http://www.ubuntu.com/download/server

3.ubuntu server 仮想環境インスコ

そのまま仮想マシンを起動してDLしたISOファイルを指定。
で、そのまま設定していって最後の方に何インスコする?って画面出るので
OpenSSH にチェックを入れてOK
無事インスコ完了したらマシンを落としとく

4.VirtualBoxのホストオンリーネットワークの設定

VirtualBox 4.1.18 あたりでは、仮想マシン作成時にデフォルトのままでは
NATのeth0アダプタだけ作成されます。
インターネットにはだいたいでれるんだけど、ホストPCと通信できない。
VirtualBox(windowsでもmacでも)でホストとゲストで通信するにはホストオンリーネットワークを追加しないといけない。
で、windowsならそのまま追加すればいいんだけどmacのVirtualBoxでは「無効な設定が見つかりました」とかで追加できない。
これの解決方法はこちら。
http://weble.org/2012/05/03/virtualbox-hostonly
VirtualBoxの環境設定でネットワークを追加。
これでOK。

5.ubuntu server のネットワークインタフェース設定

ubuntuにログインして

sudo vim /etc/network/interfaces

auto eth1
iface eth1 inet dhcp


保存して閉じる。
rebootするとネットワークアダプタが追加されててIPが割り当てられている。
sudo ifconfig とかで確認。

あとは、ホストOSのターミナルから ssh user@ipaddress_or_name とかでログインしてみる。
フィンガープリントでたらOKっす。

快適。

2012年8月1日水曜日

[linux]findとxargsの組み合わせ

find /path/to/search -name '*.txt' -mtime '+15' | xargs rm -f

これだとファイル更新日が15日以上前のファイルを検索して削除。


find /path/to/seach -name '*.txt' -mtime '+15' | xargs mv -f -t /path/to/move

これだとファイル更新日が15日移譲前のファイルを検索して移動。 mv -t は、GNU CoreUtils のオプションっす。 find -exec は検索したらいくつかでるけど、コマンド1個ずつ実行するから効率はあんまり良くないみたい。

[linux]文字列がそのファイルに含まれているか判定する

for f in ${DIR}/*.txt
do
        grep "^\[W\]" $f > /dev/null
        if [[ $? -eq 0 ]]; then
                # 含まれている
                echo $f
        fi
done

ぐるぐる回すならこんな感じ。
回さないなら
grep "XXX" /path/to/search > /dev/null
echo $?
でヒットすると 0 になる。


[linux]ファイル名を置換する

#! /bin/sh

cp -f /root/initdata/* ${INPUT_DIR}

DATE_STR=`date ‘+%Y%m%d’`

for f in ${INPUT_DIR}*

do

        mv $f `echo $f | sed -e “s/20120614/${DATE_STR}/g”`

        mv $f `echo $f | sed -e “s/20120615/${DATE_STR}/g”`

done


forのINPUT_DIRの値を変えれば検索するパスやファイル名を指定できる。 s/XXXX/ZZZZ/g の部分を書き換えればファイル名の置換。