プログラマメモ2

目次

2007-12-30

長方形のカードを並べて最も小さい正方形をつくるとき


長方形のカードを並べて最も小さい正方形をつくりたければ、長方形の縦、横の最小公倍数を求めればいいわけです。

縦:6cm
横:8cm

24cmの正方形になります。

Groovyで

def lcm(l, r){
return (l * r) / (l.gcd(r));
}

print lcm(6G, 8G)


Groovyでは
数のうしろにGをつけると、BigInteger,BigDecimalとしてあつかわれます。

Groovy - Groovy Math

参考
プログラマメモ2: 最小公倍数の検索結果
これだけは知っておきたい数学の公式・定理 - プログラマの本棚




2007-12-28

VFSを使用してftpでファイルのコピー


Commons Virtual File System - Commons VFS

VFSを使用してFTPでファイルのコピーを行います。
org.apache.commons.vfs.FileUtil.copyContentを使用しています。

!!このコードは効率が悪いです!!
あくまでも参考です。

VFSを使用するといろいろなファイルシステムが透過的にみえて便利そうですね。
もう少しAPIが簡単だといいのかなぁ

僕は、最近は、ライブラリ導入するときにはまっさきにUtil系をついついみていますね。

import java.io.IOException;

import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.FileUtil;
import org.apache.commons.vfs.VFS;

public class CopyOfA {

public static void main(String[] args) throws IOException {
FileSystemManager fsManager = VFS.getManager();

FileObject srcFile = fsManager
.resolveFile("ftp://username:password@ADDRESS/home/nakawaka/test.file");
FileObject destFile = fsManager
.resolveFile("ftp://username:password@ADDRESS/home/nakawaka/xxxx/zzz2.txt");

FileUtil.copyContent(srcFile, destFile);
}

}




日にちを7でわったときの余りが同じ数は、同じ曜日になっている


日にちを7でわったときの余りが同じ数は、同じ曜日になっているこれだけは知っておきたい数学の公式・定理


calコマンドで出力
   December 2007
S M Tu W Th F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31


7日が金曜日です。それで、27日は何曜日と質問されたら、
27 % 7 します。すると6余るので木曜日って感じでもとめらます。




僕の周りにMacユーザーがいない。


僕自身の不徳が原因です。
本当にMacユーザーが周りにいないのです。

何故だ?

こんなにMacがいいといっているのに!!

もしかして、本当にMacユーザーになったりしたら、マイノリティー感がなくなってつまらなくなるかもしれないけど(笑)

別にPCゲームマニアでもなく、ネットサーフィンとかメールチェックぐらいにしかPC使ってないなら、Mac使って欲しいなと思う訳です。

何故、僕がMacを使っているのかといいますと、まあ、そんなに積極的な理由はないかな..
最初に買ったMacはパフォーマの575でしたので、古参のマッカーというわけではないです。
Macintosh Performa 575

途中で一度だけDellにはしりましたが、それ以外はMacです。

お仕事ではWindows環境ばかりで、サーバーにLinuxを使ってるとかそんな感じでした。

たしかに、Macである積極的な理由はないかもしれない。
一番多く使ってるプログラミング言語はJavaだし、使ってる開発環境はEclipseだし。

何故にMac?




2007-12-27

cygwin コマンドを抜き出して使いたい。


cygwinのsplitとcatだけを使いたかった。
ライブラリがないといけないので、ライブラリと同じディレクトリに置くと使えます。

cygiconv-2.dll
cygintl-8.dll
cygwin1.dll
split.exe
cat.exe


どうして、そういう回りくどいことをしたかったかといいますと、ファイルが大きいとCVSに登録できない場合があるので、splitでわけたかった。

で、分けたファイルを結合したかたからです。

簡単なスプリットの使い方。

20メガで分けて、分けたファイルのおしりりにsplitとつける。
split -b 20m 対象ファイル名 対象ファイル名.split.


ちなみにantのビルドファイルで外部コマンドを動かす方法は、execが使える。

execをパイプでつなげる方法はコマンドをshから動かすか、windowsならcmdから動かすとよい。
Apache Ant - Frequently Asked Questions
How do I redirect standard input or standard output in the task? − タスクの標準入力や標準出力をリダイレクトするにはどうすればいいですか?




Groovyでの日付操作


Groovy - JN0545-Dates

明日、今日、昨日

def today= new Date()
println today + 1
println today
println today - 1


useの使い方がいまいち理解しきれていないけど...

10年前
import groovy.time.*
import java.util.*
def today= new Date()

use( [org.codehaus.groovy.runtime.TimeCategory] ){
println today - 10.years
}




約数の個数の求め方


公式

ある整数nが、ap * bq * cr表されるとき、約数の個数は、(p + 1)(q + 1)(r + 1)個


素因数分解
小さい素数から順にわっていく方法を連除法という。

とりあえずJavaのコード。
import java.math.BigInteger;

public class S1 {

public static void main(String[] args) {

int a=360;
int k = 1;

for(int i=2;i<=a;i++){
// 素数になるまで...
if(!isPrime(i)) continue;
int c = 0;
// 割れる間は...
while((a % i) == 0){
a = a / i;
c += 1;
}
System.out.println(i + "^"+c);
k *= c + 1;
}
System.out.printf("約数の個数:%d", k);
}

public static boolean isPrime(long l){
return BigInteger.valueOf(l).isProbablePrime(1);
}

}




2007-12-26

オラクル 注意点


全スキャンと、暗黙の型変換に注意すべし。

とにかく注意すべし。

暗黙の型変換に気をつけろ

オラクル通信:基礎から始める データベース入門セミナー 第9回
SQLを速くするぞ―お手軽パフォーマンス・チューニング
索引を作成したのにパフォーマンスが悪いケース(1/3) - @IT




ORA-00257: アーカイブ・エラーです。解除されるまで内部接続のみにしてください


linuxでオラクルを動かしていて、dfコマンドでみると100%近くなったので、適当にディレクトリを移動させたらオラクルから怒られた。

ORA-00257 - Oracle エラー FAQ

アーカイブ先のディスクの空き容量を確保する、不要なアーカイブログを削除する。(念のため直近のアーカイブファイルには手を出さないこと)ORA-00257 - Oracle エラー FAQ


それで、移動させてたディレクトリと同じ名前のディレクトリを作成してマシンごとリブートさせたら復活した。

参考
Oracle 10g で ORA-00257 エラーが発生したときの対処方法 :: Drk7jp




コードを生成についてちょっとだけ考えたこと


コードをがりがり書くより
コードを生成するコードを書く。

CodeZine:Judeのクラス図からActiveScaffoldのコードを自動生成する(Jude, Ruby on Rails)
という記事をぱらぱらみてて、図からコードをおこすのはいいなぁと思ったしだい。

記事にあったLuRuJu

LuRuJuとは、UMLモデリングツールJUDEのモデルデータをオブジェクト指向スクリプト言語Rubyで操作する為のライブラリです。また、JUDEとWebフレームワークRuby on Railsとの連携もめざしています。luruju.com

こういった視点が欲しいな自分に。

はなしかわって、エクセルからコードを生成するというののは個人的な理由であまり好きではなかった。
というのも自宅でエクセルを所有してないから。
でも、OpenOfficeがあるので、エクセルからコードをおこすのは俄然あり。

でも、コードを生成する方法をとった場合の悩みって、変更の矢印が一方向になりがちかなと思った。
というかたいていは一方向になるんだよね。



これはこれで都合がいいとは思うけど。

そういえば、モデルドリブンってあった思うんだけど、ちょっと調べてみようかなと。

Eclipseモデリングフレームワークって,Java - XML - UML どれとっても変更が双方向だったような記憶が。

ユーザーインターフェイスがからむとまた頭がこんがらがってきた Orz...




2007-12-23

色がないのに色がついて見える補色残像について


補色残像がおもしろかったので、とりあげてみます。

補色残像とは?


補色残像というのは、色順応によって、色がないもの(モノクロ写真とか)を見たときに色がついてみえたりすることのようです。


プログラム






起動して画面に画像をドロップします。



補色画像ボタンを押して30秒ぐらいみます。


グレースケール画像ボタンを素早く押しますすると、画像に色がついてみえます(みえるかも...)。



プログラム(説明,コード)




package main.afterimage

import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import org.jdesktop.swingx.JXImageView;
import org.jdesktop.swingx.graphics.GraphicsUtilities;
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import javax.swing.JFrame
import javax.swing.BoxLayout

import com.jhlabs.image.*

public class Main {
static void main(args) {
def swing = new SwingBuilder()
ImageView imageView = new ImageView()
def frame =
swing.frame(title:'Frame', size:[500,300], defaultCloseOperation:JFrame.EXIT_ON_CLOSE, pack:true, show:true) {
borderLayout()
panel(constraints:BorderLayout.SOUTH){

button(text:'補色画像',
actionPerformed: {
imageView.setInvert()
println "clicked"})
button(text:'グレースケール画像',
actionPerformed: {
imageView.setGray()
println "clicked"})
}

widget(imageView)
}
frame.setBounds(100,100,400,300)
//frame.pack()
frame.show()
}
}

public class ImageView extends JXImageView {
public ImageView() {
super();
initialize();
setDragEnabled(true);
setEditable(true);
}

private void initialize() {
this.setSize(new Dimension(316, 285));
}

BufferedImage originalImage;
BufferedImage gray;
BufferedImage invert;

@Override
public void setImageString(String url) throws IOException {
System.out.println("new image");
this.originalImage = null;
try {
originalImage = ImageIO.read(new URL(url));
processImage()
} catch (Exception e) {
e.printStackTrace();
}
super.setImageString(url);
}

public void setInvert(){
if (this.originalImage != null) {
setImage(invert);
}
}

public void setGray(){
if (this.originalImage != null) {
setImage(gray);
}
}

public void processImage() {
if (this.originalImage != null) {
try {

BufferedImage image = GraphicsUtilities
.toCompatibleImage(originalImage);
int w = image.getWidth();
int h = image.getHeight();

gray = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
invert = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);

GrayscaleFilter gfilter = new GrayscaleFilter()
gfilter.filter(image, gray)

InvertFilter ifilter = new InvertFilter()
ifilter.filter(image, invert)

setImage(invert);
} catch (Exception e) {
e.printStackTrace();
}
}
}


}


参考


Gon's BLOG: Color Illusion 補色残像
sasapong's room: 補色残像てんこもり
色順応
Color Illusion Tutorial

その他




[java] SunがオープンソースPDF Rendererをリリース


pdf-renderer: PDFRenderer Home Page
InfoQ: SunがオープンソースPDF Rendererをリリース
shin1のつぶやき: pdf-rendererを試してみる
MOONGIFT: » 100% JavaのPDFビューワー「PDF Renderer」:オープンソースを毎日紹介

大きな壁 日本語


やはり日本語が不安だったので試してみましたが、うーん、だめだった。
PDF自体のバージョンとか、フォントとかなのかしら。
※うまく読めているとか書いてある記事があったので、ちょっと自分のやり方に自信がないです。

動作させたのはプロジェクトページに掲載されていたデモのviewerです。
読み込ませたPDFファイルは日本語技術資料のダウンロードを利用しました。

やはり引き続き注目しよう。

期待していること


開発を行ううえでJavaで閉じれるというのがありますね。
アクロバットリーダーのバージョンや振る舞いを気にしないですみますし。




[Groovy]GraphicsBuilderを使ってみる - Java6から対応?


GraphicsBuilder
Andres Almiray's Weblog : Weblog

GroovyにあるGraphicsBuilderを使ってみたくていろいろ試しているのですが、どうやらJava6以降しか対応していないみたい。

osxの環境で実行させると、java/awt/Component$BaselineResizeBehaviorがないと例外が発生。
このクラスはJava6から導入さているクラス。

参考
GraphicsBuilderを使用するためのライブラリを含んだJava Web Startです。http://deiji.jp/tools/websupport/groovyconsole2/g.jnlp?graphicsbuilder=on




2007-12-22

500記事


500記事


前回のBloggerへの投稿で500記事になりました。

このプログラマメモは、2006年に開始しました。
もう思い出せないのですが、はじめた動機は、なんでもいいから記録しようだったと思います。

プログラマメモ2: プログラマメモ開始

検索エンジン迷子


このブログへのアクセスの大半は検索エンジンからです。
お目当ての情報を提供できていない可能性が大きいです。

検索エンジン迷子の方々のお力になりたい...

グーグル アドセンス


Bloggerからグーグルアドセンスが手軽に使えるようになって、ブログから収入を得られる可能性があることに、気がつきました。

が、途中で、すごく大変なことに気がつきました(笑)。

プログラマメモ2での広告収入は、現時点で約13ドルです(100ドルにいってないのでまだもらえていないです。)

次の目標


1000記事です。
1000記事なったらプログラマメモ3を作ろうと思います(笑)

言語


やはりJavaにさわっている時間が長かった。だんだんGroovyで作ることも多くなってきたけど、頭がまだまだJava脳でした。2008年は、他の言語の勉強をします。




PHP ヘッダー書き換え


はじめに


PHPを利用して、Java Web Startで起動させるアプリケーションをつくってます。

具体的には、JNLP(PHPで生成している)がコールされた時に、参照できるライブリーを付加したりできるようにしたいのです。

PHPで単純にJNLPの中身を出力するだけではだめだったので、それについてのメモです。

Content-Typeを書き換えたい



mime-typeって指定しないとデフォルトで「text/html」のようですね(もちろんwebサーバーとかの設定なのでしょうが...)

mime-typeの指定がないと、Java Web Startが起動しませんでした。

PHPで例えばPDFや、JNLP、イメージなどを生成する場合、そのmime-typeを指定します。

参考
Deploying Java Web Start Applications (The Java™ Tutorials > Deployment > Java Web Start)
Java Web Start にさわる
ヘッダ書き換えの実用的サンプル - ギャラクシードリンク 宇宙味
PHP: header - Manual

ファイルの先頭に,header関数で、Content-Typeを指定します。
JNLPの場合
<?php
header("Content-Type: application/x-java-jnlp-file");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
?>



Content-Tpyeのチェック


Content-Tpyeのチェックを行うにwgetコマンドが使える環境ならwgetで確認できます。

wget http://deiji.jp/tools/websupport/groovyconsole/g.jnlp--13:22:13-- http://deiji.jp/tools/websupport/groovyconsole/g.jnlp
=> `g.jnlp'
Resolving deiji.jp... 219.94.129.200
Connecting to deiji.jp|219.94.129.200|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 729 [application/x-java-jnlp-file]


ブラウザにFireFoxを使用しているのであれば、FireFoxの機能拡張が便利なようです。

mozdev.org - livehttpheaders: index

キャプチャした画面


参考

ウノウラボ Unoh Labs: すべてのWebデベロッパーに必須なFirefox拡張20(+1)選


さいごに


Java Web Startを使用したアプリケーションの提供がもっと一般的になったらいいなと思ってます。
アイデアとして起動時にとりこむライブラリをユーザーに選択させて、動作させるのはそんなに悪くないと考えているのですが、どうでしょう。




2007-12-21

Groovy CVSの情報をディレクトリから削除します。


CVSの情報をディレクトリから削除します。

できがよくないけど。
とりあえず。

Groovy - Recipes For File


def dir = "パス";
def delClos

//Define closure
delClos = { // println "Dir ${it.canonicalPath}"
it.eachDir( delClos );
it.eachFile {
if(( it.getParentFile().getName().equals("CVS") ) ) {
it.delete()
println " delete File ${it.canonicalPath}"
}
if(( it.getName().equals("CVS") ) ) {
it.delete()
println " delete File ${it.canonicalPath}"
}

}
}

delClos( new File(dir) )




Groovy .javaファイルをカウントします。


WindowsOSにおいてあるjavaファイルをカウントします。
単純にぐるぐるまわしているだけ...

パッケージ名で出力するために、パスを¥を.にかえたりしています。
あと、ソースの格納の場所はjavaというフォルダに行っていたので、javaというフォルダから頭のパスをとるようにしています。

import java.io.*;


def dir = "パス";

def cnt = 0
new File(dir).eachFileRecurse{ f ->


if((f as String).endsWith(".java")){
f = (f as String).replaceAll("\\\\", ".").replaceFirst("^(.*)\\.java\\.", "")
println f;
cnt++
}
}
println "count: ${cnt}"
>




groovyをコンパイルするために


そろそろ、スクリプトを読み込ませGroovyを動かしていたのを止めて、コンパイルして動作させようと画策中です。

Groovy - The groovyc Ant Task
@IT:Java TIPS -- Antで使う新規タスクを作成する
Groovyを使って、より高速にJavaコードをユニット・テストする

簡単なbuild.xmlです。

<project default="" name="ARE_YOU_GROOVY" basedir=".">

<property name="mytarget" value="${basedir}/mytarget" />

<taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc"
classpath="${basedir}/lib/groovy-all-1.5.0.jar" />

<target name="G">
<mkdir dir="${mytarget}/classes" />
<groovyc srcdir="${basedir}/src" destdir="${mytarget}/classes">
<classpath>
<fileset dir="${basedir}/lib/">
<include name="*.jar"/>
</fileset>
</classpath>
<javac source="1.5" target="1.5" debug="on" />
</groovyc>
</target>
</project>




JBoss Gavin King氏語る - いくつか興味深かったのでメモ


Javaの今、JavaとRuby:JBoss Gavin King氏語る - builder by ZDNet Japan

いくつか興味深かったのでメモ

ふたつ目のコンセプトは、コンポーネントモデルとしては疎結合を目指しながらも、厳密な型システムを提供するということです。例えば、システムとしてダイナミックな振舞いを追求し、かつ疎結合を徹底的に目指すとなると、どうしても動的言語や文字列だらけのメタデータを使うという方向に向いてしまい、型の安全性が犠牲になりがちです。Javaの今、JavaとRuby:JBoss Gavin King氏語る - builder by ZDNet Japan

型システム

ご存じの通り、一時はJava EEテクノロジーから離れていこう、という動きがありました。しかし今ではJPAやEJB3の台頭により、逆にJava EEに立ち返っていこうという動きが非常に顕著だと思っています。Javaの今、JavaとRuby:JBoss Gavin King氏語る - page2 - builder by ZDNet Japan

Java EE への回帰

ただ、あくまでも私の私見ですが、UIを定義する際に使用する言語はどれをとっても、UIの作成にあまり向いていない、という問題を抱えている気がします。JavaScriptが向いているとは思えませんし、XMLやJavaが向いているとも思えません。Javaの今、JavaとRuby:JBoss Gavin King氏語る - page3 - builder by ZDNet Japan

UIに関する技術はまだまだ

システムが小さいうちは、タイピングも実行も動的言語の方が素早く行えます。しかしシステムが巨大になってしまうと、Ctrl+Space (多くのIDEで採用されている、コード補完のためのショートカット) があなたのよき友です。Javaの今、JavaとRuby:JBoss Gavin King氏語る - page4 - builder by ZDNet Japan

Ctrl+Spaceは便利だよね。これがないとJavaコードを書く気力が減ります...
Eclipseを使っているとコンパイルエラーがでた場合は、すぐにEclipseが教えてくれます。
僕はこれを《赤バッテンがでた》(※Eclipseの画面上では赤いxがソースファイルについて教えてくれる)といういい方をするのですが、この機能もないとコードかけない...


他のインタビュー記事
The Interview: Gavin King, Hibernate
ブログ
In Relation To... Gavin's Blog




2007-12-20

交換法則 結合法則 分配法則


交換法則
a+b=b+a a*b=b*a

結合法則
a+b+c=(a+b)+c=a+(b+c)
a*b*c=(a*b)*c=a*(b*c)

分配法則
a*(b+c)=a*b+a*c




仕様記述言語


[Think IT] 第1回:仕様記述言語を紹介するにあたって (1/3)
[Think IT] 第2回:仕様記述言語の種類について (1/3)
[Think IT] 第3回:Z言語とVDM-SLの記述例 (1/3)
[Think IT] 第4回:Z言語とVDM-SLの違いとその効果 (1/3)

勉強しよう....




注目しています。AmazonのSimpleDB


Amazon.com: Amazon SimpleDB, Amazon Web Services

AmazonからSimpleDBのbetaが公開されました。このサービスに注目しています。
それで、申し込めるかなと思ってためしてみたら、もう少ししたらpublicリリースするからそれまでまってねとのことでした。



このサービスで何ができるか、想像しているところです。サービスが公開されたらためしてみようと思います。

queryの書き方とか簡単そうなんですよね。あとデータの堅牢性、可用性、パフォーマンスとか高そうだし。

アマゾン、ウェブデータベース「SimpleDB」の公開テストを開始:ニュース - CNET Japan
米アマゾン、Webデータベース「SimpleDB」を開発 − @IT
Web上に登場した3種類の“プラットフォーム” − @IT
blog.pmarca.com: The three kinds of platforms you meet on the Internet
Shahzad Bhatti » Blog Archive » Accessing SimpleDB using Java and Erlangvia オレンジニュース


クラウドについて

ちょっと長いけど引用です。

それに対してレベル3のプラットフォームというのは、ランタイムやライブラリまで含め、実行環境全体を提供するインターネットサービスを指す。開発者はコードをアップロードするだけでよく、物理的なサーバやネットワーク機器、OSやライブラリなどといったものに煩わされることがない。その実行環境というのは、最近“クラウド”(cloud)と呼ばれることが多い、多数のサーバで実現された分散コンピューティングシステムの上で提供されることになる。Web上に登場した3種類の“プラットフォーム” − @IT




Are you groovy? - ノリノリです。


Speaking thru experience: Are you groovy?

ふと何故、僕がGroovyを好きなのか考えました。

それはノリノリな感じだからだと思います....

GroovyのT-シャツちょっと欲しいかも.




2007-12-19

Groovy 普及のために その2


Groovy consoleをJava Web Startで気軽に使えるようにしました。
といってもやってることは単純にConsole.run()ですが。





Windowsで起動させて、画面から終了させた場合にプロセス(javaw.exe)が消えてなくならかったので下記のようにして対処しました。

package main.groovyconsole;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import groovy.ui.Console;

public class Main {

public static void main(String[] args) {
Console console = new Console();
console.run();
console.getFrame().addWindowListener(new WindowAdapter() {

@Override
public void windowClosed(WindowEvent windowevent) {

super.windowClosed(windowevent);
System.err.println("system exit o_o!");
System.exit(0);
}

});

}

}


単純にwindowがクローズされたイベントを受けてSystem.exitさせているだけです。

Groovyを使ったことがないのであれば、起動させて何かコードを実行してみてください。




2007-12-17

Groovy 1.5がリリースされていました。- Groovy普及のために


Groovyです。
Groovy 1.5がリリースされていました。

Groovy 1.5 released - Groovy - Codehaus

Groovy普及のためにGroovy consoleをJava Web Startで起動するようにしました。
Javaがインストールされている環境であれば動作すると思います。
Groovy - Groovy Console





※20071217 実行して終了してもプロセス(javaw.exe)が消えないです。あとで修正します。※20071219 修正しました


しばらく、ブログの右上端においておきますので、是非起動してGroovyを楽しんでください。


しかし、悲しいことにmac osxで何故かエラーがでて起動しませんでした...


以下、エラーを回避してmac osx(tiger)で起動するためのひとつの方法です。
root権限が必要です。Javaのセキュリティーポリシーを設定するという方法をとってみます。
セキュリティーポリシーは
pwd /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/security/java.policy


最初のエラーです。
startup failed, General error during class generation: access denied (java.lang.RuntimePermission accessClassInPackage.com.apple.mrj)


このエラーを回避するためにはセキュリティーポリシーファイルのgrantに、下記の一文を追加します。

permission java.lang.RuntimePermission "accessClassInPackage.com.apple.mrj";


次のエラーです。
access denied (java.lang.RuntimePermission canProcessApplicationEvents)


このエラーを回避するためにはセキュリティーポリシーファイルのgrantに、下記の一文を追加します。
permission java.lang.RuntimePermission "canProcessApplicationEvents";


以上でosx(tiger)で起動させることができました。




OpenOfficeのマクロでファイル保存のための手習い


OpenOfficeのマクロのための手習いです。

マクロでファイルに文字列を出力します。

ExportDataというプロシージャ (Procedure)を定義しています。

使っているオブジェクトの意味もちょっと理解してないんですが...
エラー処理とかしてません。

REM ***** BASIC *****

Option Explicit

'ファイルに文字列を出力するマクロ
Sub Main
' この例ですとルートにファイルが出力されるので注意してください。
ExportData("mytext2.txt", "test to test")
End Sub

'ファイルに文字列を出力します。
Sub ExportData (finename, s)

Dim FA As Object
Dim O As Object
Dim OS As Object

FA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
O = createUnoService("com.sun.star.io.TextOutputStream")
OS = FA.openFileWrite(finename)
O.setOutputStream(OS)
O.writeString(s)
O.closeOutput()
End Sub



OpenOfficeからデータベースに接続してCalcに値を展開してマクロから、ファイル出力とかできそうですね。


参考
OpenOffice.org Basic - Wikibooks
Writer文書から指定したスタイルを持つ段落の内容を取り出すためのフィルターとマクロ
StarSuite 8 Basic プログラミングガイド
OOoBasic/Generic/file - PukiWiki Plus!




2007-12-16

Blogger クイック編集のアイコンが表示されなくなった。


Bloggerです。
Bloggerを使っていて、クイック編集がブログに表示されなくなってしまいました。
クイック編集がブログの所有者以外には表示されません。
このクイック編集は記事を修正するのにワンアクションでできるのでないと困ります。

いろいろテンプレートいじったり、ClickCommentを導入したりしたので、それの影響かなぁと考えていますが、原因はいまのところわかりません。

調査中です。
とりあえずの応急処置ができたのでそれの紹介です。
みつけた場所は、Quick edit icon is gone - Something Is Broken | Google グループです。

If you cannot see ANY quick edits (like the ones for the
widgets themselves, not just the post one) then it can be something on
your side. 3rd party cookies being blocked, referrer headings being
blocked, etc.
http://help.blogger.com/bin/answer.py?answer=42231


とりあえず、応急処置のコードをブログにアップしている方がいたので、それを利用してみました。

tester: Corrected Post Quick Edit Widget

僕の場合の入れた箇所は、



表示された



いろいろためして、だめでしたら上記の方法を試してみるのもありかもです。
しかし、おそらく自分で適当にテンプレートいじってるせいなのかなぁという気もしますが。。。




UPCコード,EANコード,JANコードにおける国別コード判定 その2


JavaScriptです。
Life is beautiful: Javascript、クロージャを使ったプライベート関数の隠蔽について
という記事を読んで、なるほどと思い、自分で試してみました。

以前、作成した、UPCコード,EANコード,JANコードにおける国別コード判定 - プログラマメモ2をベースにして試してみます。

下のテキストボックスに数字(例,45とか)入れてOKをボタンを押すと、そのコードにあった国名を表示します。




長いけどとりあえず、使用したコード。
<script>
var code2name = (function(){
var mapping ={
"10":"アメリカ合衆国、カナダ",
"11":"アメリカ合衆国、カナダ",
"12":"アメリカ合衆国、カナダ",
"13":"アメリカ合衆国、カナダ",
"20":"小売業インストアコード用",
"21":"小売業インストアコード用",
"22":"小売業インストアコード用",
"23":"小売業インストアコード用",
"24":"小売業インストアコード用",
"25":"小売業インストアコード用",
"26":"小売業インストアコード用",
"27":"小売業インストアコード用",
"28":"小売業インストアコード用",
"29":"小売業インストアコード用",
"30":"フランス",
"31":"フランス",
"32":"フランス",
"33":"フランス",
"34":"フランス",
"35":"フランス",
"36":"フランス",
"37":"フランス",
"380":"ブルガリア",
"383":"スロベニア",
"385":"クロアチア",
"387":"ボスニア・ヘルツェゴビナ",
"400":"ドイツ連邦共和国",
"401":"ドイツ連邦共和国",
"402":"ドイツ連邦共和国",
"403":"ドイツ連邦共和国",
"404":"ドイツ連邦共和国",
"405":"ドイツ連邦共和国",
"406":"ドイツ連邦共和国",
"407":"ドイツ連邦共和国",
"408":"ドイツ連邦共和国",
"409":"ドイツ連邦共和国",
"410":"ドイツ連邦共和国",
"411":"ドイツ連邦共和国",
"412":"ドイツ連邦共和国",
"413":"ドイツ連邦共和国",
"414":"ドイツ連邦共和国",
"415":"ドイツ連邦共和国",
"416":"ドイツ連邦共和国",
"417":"ドイツ連邦共和国",
"418":"ドイツ連邦共和国",
"419":"ドイツ連邦共和国",
"420":"ドイツ連邦共和国",
"421":"ドイツ連邦共和国",
"422":"ドイツ連邦共和国",
"423":"ドイツ連邦共和国",
"424":"ドイツ連邦共和国",
"425":"ドイツ連邦共和国",
"426":"ドイツ連邦共和国",
"427":"ドイツ連邦共和国",
"428":"ドイツ連邦共和国",
"429":"ドイツ連邦共和国",
"430":"ドイツ連邦共和国",
"431":"ドイツ連邦共和国",
"432":"ドイツ連邦共和国",
"433":"ドイツ連邦共和国",
"434":"ドイツ連邦共和国",
"435":"ドイツ連邦共和国",
"436":"ドイツ連邦共和国",
"437":"ドイツ連邦共和国",
"438":"ドイツ連邦共和国",
"439":"ドイツ連邦共和国",
"440":"ドイツ連邦共和国",
"45":"日本",
"49":"日本",
"460":"ロシア連邦",
"461":"ロシア連邦",
"462":"ロシア連邦",
"463":"ロシア連邦",
"464":"ロシア連邦",
"465":"ロシア連邦",
"466":"ロシア連邦",
"467":"ロシア連邦",
"468":"ロシア連邦",
"469":"ロシア連邦",
"470":"キルギスタン",
"471":"台湾",
"474":"エストニア",
"475":"ラトビア",
"476":"アゼルバイジャン",
"477":"リトアニア",
"478":"ウズベキスタン",
"479":"スリランカ",
"480":"フィリピン",
"481":"ベラルーシ",
"482":"ウクライナ",
"484":"モルドバ",
"485":"アルメニア",
"486":"グルジア共和国",
"487":"カザフスタン",
"489":"香港",
"50":"イギリス",
"520":"ギリシャ",
"528":"レバノン",
"529":"サイプラス",
"531":"マケドニア",
"535":"マルタ",
"539":"アイルランド",
"54":"ベルギー、ルクセンブルク",
"560":"ポルトガル",
"569":"アイスランド",
"57":"デンマーク",
"590":"ポーランド",
"594":"ルーマニア",
"599":"ハンガリー",
"600":"南アフリカ共和国",
"601":"南アフリカ共和国",
"608":"バーレーン",
"609":"モーリシャス",
"611":"モロッコ",
"613":"アルジェリア",
"616":"ケニア",
"619":"チュニジア",
"621":"シリア",
"622":"エジプト",
"624":"リビア",
"625":"ヨルダン",
"626":"イラン",
"627":"クウェート",
"628":"サウジアラビア",
"629":"アラブ首長国連邦",
"64":"フィンランド",
"690":"中華人民共和国",
"691":"中華人民共和国",
"692":"中華人民共和国",
"693":"中華人民共和国",
"694":"中華人民共和国",
"695":"中華人民共和国",
"70":"ノルウェー",
"729":"イスラエル",
"73":"スウェーデン",
"740":"グアテマラ",
"741":"エルサルバドル",
"742":"ホンジュラス",
"743":"ニカラグア",
"744":"コスタリカ",
"745":"パナマ",
"746":"ドミニカ共和国",
"750":"メキシコ",
"759":"ベネズエラ",
"76":"スイス、リヒテンシュタイン",
"770":"コロンビア",
"773":"ウルグアイ",
"775":"ペルー",
"777":"ボリビア",
"779":"アルゼンチン",
"780":"チリ",
"784":"パラグアイ",
"786":"エクアドル",
"789":"ブラジル",
"790":"ブラジル",
"80":"イタリア",
"81":"イタリア",
"82":"イタリア",
"83":"イタリア",
"84":"スペイン",
"850":"キューバ",
"858":"スロバキア",
"859":"チェコ",
"860":"ユーゴスラビア",
"867":"朝鮮民主主義人民共和国",
"869":"トルコ",
"87":"オランダ",
"880":"大韓民国",
"884":"カンボジア",
"885":"タイ王国",
"888":"シンガポール",
"890":"インド",
"893":"ベトナム",
"899":"インドネシア共和国",
"90":"オーストリア",
"91":"オーストリア",
"93":"オーストラリア",
"94":"ニュージーランド",
"955":"マレーシア",
"958":"マカオ",
"977":"定期刊行物",
"978":"書籍用",
"979":"書籍用",
"980":"返金受領書用",
"981":"ユーロ通貨クーポン用",
"982":"ユーロ通貨クーポン用",
"99":"クーポン用 "
} ;
return function(code) { return mapping[code] || '(unknown)';};
})();

function check(s){
message(code2name(s));
}
function message(s){
var n = 'msg20071216';
document.getElementById(n).innerHTML = s;
document.getElementById(n).style.color = "white"; document.getElementById(n).style.background = "#cc4444"; document.getElementById(n).align = "center";}</script>
<div id="msg20071216"></div>
<form name="f20071216">
<input type=text name="txt">
<input type=button value=OK onclick="check(document.forms.namedItem('f20071216').txt.value)">
</form>




2007-12-15

角丸にチャレンジ その2


Javaです。角丸にチャレンジその2です。

角丸いいですよね。角丸が気になりはじめるとあちらこちらに角丸が存在することに気がつきました。

前回:角丸にチャレンジ - プログラマメモ2
前回ためした方法と違う方法で行いました。
clipしてます。java.awt.geom.Areaを使用しています。
java.awt.geom.Areaは使い方によっては柔軟にいろいろな形状がつくれそうです。

※一部にSwingXを使用しています。org.jdesktop.swingx.graphics.GraphicsUtilities

BufferedImage image = GraphicsUtilities
.toCompatibleImage(originalImage);
int w = image.getWidth();
int h = image.getHeight();
BufferedImage round = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = round.createGraphics();
g2.setClip(new Area(new RoundRectangle2D.Double(0, 0, w, h,
arc, arc)));
g2.drawImage(image, 0, 0, null);
g2.dispose();
setImage(round);


Java Web Startにしてみました。
起動して画像をドロップしてください。スライダーで角丸の丸っこさを決めます。







参考
Java No.4〜言語別の習作集〜
AreaClipTestPanel




2007-12-14

HWND_TOPMOSTはフレームをずっとまえにだします。


Windowsプログラミングで、HWND_TOPMOSTといえば、画面をずっと最前面にだすもののようです。

それで以前、書いたコードが実は、Javaでもずっとフレームを前にだしておく効果があることに気がつきました。

java window - 隠れたwindowを表にだす方法として使えるか? その2

OS.SetWindowPos(hWindow, OS.HWND_TOPMOST, 0, 0, 0, 0, OS.SWP_NOACTIVATE
| OS.SWP_NOMOVE | OS.SWP_NOSIZE);



参考
位置と順序




2007-12-12

JXGradientChooserはグラーデーション用のカラーチューザー


Javaです。SwingXです。

SwingLabs Java™ Desktop Technology

グラーデーション用のカラーチューザーがありました。
org.jdesktop.swingx.JXGradientChooserを使うと、グラーデーションで使える色選択ができそうです。




依存するライブラリがあるので注意。
MultipleGradientPaint.jar

ちなみにGradientってどう訳するでしょうか?階調とかでしょうか。

参考
グラデーションを使ったデザインのやり方 - GIGAZINE




2007-12-11

JXImageViewは画像の拡大縮小アプリをつくるのに役に立つと思いました。


Javaです。SwingXです。

画像の拡大縮小をする簡単なviewerを作成したいと思いました。
はじめ、ScaleFilterを使用して作ろうかなぁと考えて調べものしていました。途中で、SwingXでいいのないかなぁと思いさがしたら、ずばりありました。
org.jdesktop.swingx.JXImageViewです。
このコンポーネントが便利なところをあげてみます。

既にドラッグアンドドロップに対応している。
拡大縮小ようのスケールメソッドが用意されている。
デフォルトで画像を中央表示するようになっているです。

お手軽に画像表示アプリを作成する場合に、重宝すると思います。

SwingLabs Java™ Desktop Technology

JSliderの使い方JSliderクラス - Swing

下記参考までに作成





2007-12-10

JComboBox ユーザーが選択したコンボボックスの値が、望ましくない場合、あと戻りさせるためのコードです。


Javaです。
ユーザーが選択したコンボボックスの値が、望ましくない場合、あと戻りさせるためのコードです。

JComboBoxにItemListenerをaddして、
ItemEventのDESELECTEDがきた場合、oldの値として以前のデータをおぼえるようにします。
SELECTEDがきた場合に、その変更が適切なものか判断させて、もとにもどすという処理で実現してみました。

追記:あとから気づいて、SwingUtilities.invokeLaterでくるみました。

他にいい方法があればいいのですが。

package comb;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JComboBox;
import javax.swing.JPanel;

public class TestComb extends JPanel {

private static final long serialVersionUID = 1L;
private JComboBox jComboBox = null;
public TestComb() {
super();
initialize();
}

private void initialize() {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.VERTICAL;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.gridx = 0;
this.setSize(300, 200);
this.setLayout(new GridBagLayout());
this.add(getJComboBox(), gridBagConstraints);
}

private JComboBox getJComboBox() {
if (jComboBox == null) {
jComboBox = new JComboBox();
jComboBox.addItem("aaaaaa");
jComboBox.addItem("bbbbbb");
jComboBox.addItem("cccccc");
jComboBox.addItem("dddddd");
jComboBox.addItemListener(new ItemListener(){

Object old = null;

public void itemStateChanged(ItemEvent e) {
System.out.println(e);
if(e.getStateChange() == ItemEvent.DESELECTED){
this.old = e.getItem();
return;
}

if(eq(e.getItem(), "bbbbbb")){
System.out.println("change old value!!");
SwingUtilities.invokeLater(new Runnable(){
public void run() {
comboBox.setSelectedItem(old);

}});
return;
}
}});
}
return jComboBox;
}

protected static boolean eq(Object object, Object object2) {
return object == null ? object2 == null : object.equals(object2);
}
}




BeansBindingを勉強するためのメモ


The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 295
【コラム】Java API、使ってますか? (6) JavaBeansのプロパティを同期させるバインディングAPI | エンタープライズ | マイコミジャーナル

画面系のアプリケーションでデータと画面を結びつけるパターンは2種類あるかなと思いました。

1.コレクト型(収集タイプ)
2.バインド型

1.の場合は、何かアクションがおきたら、画面からデータをひろい集めて、処理をする。
2.はデータと画面の項目が対になっている。
1.の場合は2.よりちょっと雑な感じがする。すごく大雑把な動きをするイメージ。
と考えている途中。

SwingXのorg.jdesktop.beans.AbstractBeanを使ってBeans Bindingの仕組みを理解していくための準備。

org.jdesktop.beans.AbstractBeanは、non-visualなbeanでもPropertyChangeイベントの仕組みが使えるようにしてくれます。といっても全部自動で何かしてくれるわけではなくて、イベントを発火させるコードは書かないといけないです。

public void setterXxxx(val) {
old = getVal();
this.val = val;
firePropertyChange("val", old, getVal());
}


以下、大雑把なコード
package r;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.jdesktop.beans.AbstractBean;

public class A extends JPanel {

private static final long serialVersionUID = 1L;
private JTextField jTextField = null;
private JCheckBox jCheckBox = null;
private JButton jButton = null;

public A() {
super();
initialize();
}

private void initialize() {
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
gridBagConstraints2.gridx = 0;
gridBagConstraints2.gridy = 2;
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
gridBagConstraints1.gridx = 0;
gridBagConstraints1.gridy = 1;
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.gridx = 0;
this.setSize(300, 200);
this.setLayout(new GridBagLayout());
this.add(getJTextField(), gridBagConstraints);
this.add(getJCheckBox(), gridBagConstraints1);
this.add(getJButton(), gridBagConstraints2);
}

private JTextField getJTextField() {
if (jTextField == null) {
jTextField = new JTextField();
myBean.addPropertyChangeListener("isChecked",
new PropertyChangeListener() {

public void propertyChange(
PropertyChangeEvent propertychangeevent) {
jTextField.setText("old:"
+ propertychangeevent.getOldValue()
+ " new:"
+ propertychangeevent.getNewValue());
}
});
}
return jTextField;
}

private JCheckBox getJCheckBox() {
if (jCheckBox == null) {
jCheckBox = new JCheckBox();
jCheckBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myBean.setChecked(jCheckBox.isSelected());
}
});
myBean.addPropertyChangeListener("isChecked",
new PropertyChangeListener() {

public void propertyChange(PropertyChangeEvent evt) {
jCheckBox.setSelected(myBean.isChecked());
}
});
}
return jCheckBox;
}

private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
myBean.setChecked(myBean.isChecked() ? false : true);
}
});
}
return jButton;
}

MyBean myBean = new MyBean();

public class MyBean extends AbstractBean {
boolean isChecked = false;

public boolean isChecked() {
return isChecked;
}

public void setChecked(boolean isChecked) {
boolean old = isChecked();
this.isChecked = isChecked;
firePropertyChange("isChecked", old, isChecked());
}

}

}




2007-12-09

反省


[ネタ][仕事] エンジニアなら英語の大文字小文字,綴りは気をつけよう - 航海日誌 (2007-11-26)

ついつい、いい加減にしてしまっていました。。。
反省...




ストライプ画像を作成してみます。Java Web Start を使って。


ブログの背景にストライプを使いたいなと思いました。
ストライプ画像を作成してくれるWebアプリケーションもちらほらありました。

このサイトがとてもよかったです。ストライプにグラーデーションが適用できる!!
Stripemania - Striped background generator

Webアプリケーションといってもサーバー側で処理させるパターンとは別に、JavaのWeb Startのような方法もありますね。

Flashとか使ってもできそうですね。ただしローカル環境にファイルの保存とかしたい場合が...
※最近、いろいろとクライアントサイドで動かせる技術がちらほらでていますね。

SwingXには、ずばりストライプを描くためのPinstripePainterというのがありました。
Painter Tutorial

今回は、このPinstripePainterを利用してWeb Startアプリケーションでストライプ作成のサンプルを作ってみました。

二つあります。

(A)ユーザーのローカル環境にアクセスできない版(ファイルの保存ができません。)


(B)ユーザーのローカル環境にアクセスできる版(ファイルの保存ができます。)起動時にユーザーに証明書の確認がでてきます。信頼できると思ったときだけ実行してください。


saveを押してディレクトリを指定したらそこにstripe.pngというファイルができます。

起動できたら下のような画面がでてくると思います....


実用的ではないです。
適用してみたらうまくいかなかった。

使用しているのは、SwingXで提供されているswingx-0.9.1.jarです。




しばらく追跡してませんでしたが、veの非公式版が更新されていました。


全然、しばらく追いかけていませんでしたが、www.ehecht.comのveが更新されていました。更新日付は11/17でした。

よくよくみてみるとeclipseの3.4でも動くよってこと?

ついついveが動く前のバージョンのeclipseばかりつかっているので、気がつかなかった...

newsgroup
Eclipse NewsPortal - eclipse.tools.ve

まったく関係ないですが、eclipse.orgってグーグルページランクが8なんだ!!
別におどろくことではないけど。




2007-12-07

bloggerのテンプレートを小さくしてみました。


bloggerです。

bloggerのテンプレートをいろいろ触っていて、ごちゃごちゃしてきたので、シンプルなものからデザインをしていこうと試しています。

bloggerのテンプレートを小さくしてみました。

まず、記事を入れるwidgetのBlog1は必要なようです。
これだけでいいようですが、これだとページ要素(page elements)で部品のはったりする画面がでてこなくなるので、sectionのsidebarはあったほうがいいようです。

この状態から、必要なものつけくわえてデザインしていく方向でいこうと思います。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<b:include data='blog' name='all-head-content'/>
<title>
<data:blog.pagetitle/>
</title>
<b:skin><![CDATA[]]></b:skin>
</head>

<body>
<b:section class='main' id='main' showaddelement='no'>
<b:widget id='Blog1' locked='true' title='Blog Posts' type='Blog'/>
</b:section>
<b:section class='sidebar' id='sidebar' preferred='yes'/>
</body>
</html>




2007-12-05

イベントディスパッチ上でswingのコンポーネントはさわろう。


javaです。swingです。

ネットワーク越しからデータを取得する場合、Threadをおこして、データをとってきたりすると思います。
その際に、このThreadから直接Swingのコンポーネントを操作すると、期待してない動きをする可能性があります。
この現象は、プログラムの動作がうまくいっている場合は、気がつきませんが、ある程度プログラムが完成しはじめて、発覚すると、追いかけづらいことになります。

イベントディスパッチ上からの呼び出しかどうか判定するのは
javax.swing.SwingUtilities.isEventDispatchThread()を使います。

現在のスレッドが AWT イベントディスパッチスレッドの場合に true を返します。


イベントディスパッチ上でなければ、下記のコードでくるんで実行します。

SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ここでswingの部品を触る。
}
});


invokeLaterのjavadocでの説明です。

doRun.run() を、AWT イベントディスパッチスレッドで非同期的に実行させます。これは、保留中のすべての AWT イベントが処理されたあとに発生します。このメソッドは、アプリケーションスレッドが GUI を更新する必要があるときに使用されます。....


このUI関係のコードは、頭をこんがらせますね。
何故そうしなければいけないのか、考えないと...

ところで、
javadocからチュートリアルのリンクもあるので、手元のjavadocを確認することが大切。
javaプログラマで、javadocへの参照を怠っている人は、いますぐ手元にダウンロードしませう。eclipseのコードアシストを山カンで使っている人は、あやういです。




2007-12-04

#16進数値をint値にします。


javaです。

#HexDigitsをint値にします。
Integer.decodeを通すとint値で取得できますね。

Integer i = Integer.decode("#6495ED");

int r = (i >>16) & 0xff;
int g = (i >>8) & 0xff;
int b = (i) & 0xff;

System.out.println(i);

System.out.println(r);
System.out.println(g);
System.out.println(b);

System.out.println(Integer.toHexString(r));
System.out.println(Integer.toHexString(g));
System.out.println(Integer.toHexString(b));


もどして、もどされて。




bloggerの記事のtitleを変えて表示したい、例えばXXX:記事タイトルという形式をやめたいということ


bloggerについてです。

観察していて、どうもbloggerのタイトル(headのtitleです)で表示される字句の順番が、よくないような気がしたのでした(自分とあわないという意味)。

mainのページであれば、単純にブログ名がでているだけでいいのですが、各記事ページにいった場合に

ブログ名:記事名


となるようです。
テンプレートでは
<title><data:blog.pageTitle/></title>

となっています。

どうも、このdata:blog.pageTitleでブログ名:記事名となっているようですが、好みとしては、記事名-ブログ名という感じにしたいなぁと思ったわけです。

いろいろ調べると、SEO対策で、metaキーワードを入れ込むテクニックとあわせてタイトルを変えるという試みをしているところがちらほらありました。

ただ、そういったところでもブログ名:記事名の形を変えてませんでした。

Changing the Blogger Title Tag ~ Widget-based

このブログで紹介されていたやり方だと、もう少し柔軟に記事ごとのタイトルを変更できそうです。

<!-- Start Widget-based: Changing the Blogger Title Tag -->
<b:if cond='data:blog.pageType == "item"'>
<b:section id='titleTag'>
<b:widget id='Blog2' locked='false' title='ブログの投稿' type='Blog'>
<b:includable id='nextprev'/>
<b:includable id='backlinks' var='post'/>
<b:includable id='post' var='post'><data:post.title/></b:includable>
<b:includable id='commentDeleteIcon' var='comment'/>
<b:includable id='status-message'/>
<b:includable id='feedLinks'/>
<b:includable id='backlinkDeleteIcon' var='backlink'/>
<b:includable id='feedLinksBody' var='links'/>
<b:includable id='postQuickEdit' var='post'/>
<b:includable id='comments' var='post'/>
<b:includable id='main' var='top'><title><b:loop values='data:posts' var='post'><b:include data='post' name='post'/></b:loop> - <data:blog.title/></title></b:includable>
</b:widget>
</b:section>
<b:else/>
<title><data:blog.pageTitle/></title>
</b:if>
<!-- End Widget-based: Changing the Blogger Title Tag -->


わかりづらい例ですが、変更前、変更後のキャプチャです。





ブログ名が後ろについているのがわかります。

しかし、この方法を実践するには、ちょっと複雑すぎるのではないかなぁと思います。
この方法とった場合、このコードをテンプレートから削除するときに、bloggerからウィジット消すけどよいか?というふうに聞かれます。

一応、自己責任で...




2007-12-03

void(0); 何も値を返さない命令


void(0);
は何も値を返さない命令。

formのアクションとかに入れておくとページ遷移とかしない、あとリンクでjavascript:void;とかしておくとこれもジャンプしないっぽい。

javascriptを動作させるトリガー、リンクとかボタンのときに使えそう。というか使ってます。

void/JavaScriptリファレンス




お手軽 CSS border見た目チェック


divのstyleのボーダー設定を確かめられます。
(safari,firefoxでしかためしていません。)

毎回どう設定していいものか迷うので作成しました。
もう少ししっかりつくれば、お手軽にdivの設定ができるかも。

反映ボタンで、下のほうに結果のボックスが表示されます。


背景色(ex. #000000):

サイズ(px):

ボーダーカラー(ex. #000000):

ボーダー:
border-color
入力テキスト:




HTML:





 




GroovyかJRubyか - ...Groovyが好きかなぁ...


Martin Fowler's Bliki in Japanese - GroovyかJRubyか

JRubyはほとんど触ったことがないので、Groovyかなぁ

Rubyのこと考えるとJRubyとか面白そうだけど。

Groovyが好きなのは名前が好きだから、ノリノリな感じがするので好き。

Eclipseで、使えるエディターがもっともっとよくなるといいなぁ
コード補完と、コードフォーマッターとか。

結局、Eclipseでjavaでいろいろ済ませてしまうんですよね。
ファイルの整形とかも、Eclipse上からjavaでしてしまうし。




2007-12-01

getRootPaneを使って再描画


javaです。swingです。getRootPaneです。
正しいかどうかちょっと不安。

こういう問題に出会いました。
Jlistで表示しているデータを変更して、すぐに表示に変更されない。

こういう場合、実は、modelとviewの考えかかたをベースに、イベント、メッセージのやりとりをイメージできればなんとなく理解できるのではないかと思います。



modelが変更された場合、viewに変更した旨を通知しないといけません。そうしないと、viewはデータが変更されたことを知らずに人に変化していないviewを見せ続けてしまいます。

通知してないのだけど、viewで変化したデータを見ることができる場合があります。viewは表示するときにmodel(データ)を参照します。そのタイミングでデータの変更を知ってそのまま表示するから、うまくいきます。

理想は、modelが変更した場合には、変更したというメッセージを伝えて、viewが表示しなおす(update,repaint)することだと思います。ですが、そうなってないプログラムを作成してしまう場合があります。

そういったときは、viewに再描画を依頼してview側から変更されたmodelを参照させてます。

JComponent系クラス.getRootPane().repaint()

を使うと便利な場合があります。




 

プログラマの本棚