万能ウィジェット!テキストとカスタムメニュー in WordPressインストール版 ~ WordPress.comからの乗り換え

はい、このブログのことです。

このブログをWordPress.comで立てていますが、これをインストール版へ移行することになりました。

外観に関して、ここで構築したものを出来る限りそのままインストール版で再現したいと思ったのですが、あれができない・・・これができない・・・と最初は色々と頭を悩ませました。

が!やっていくとほとんどのことはテキストウィジェットとカスタムメニューウィジェットで実現できてしまいました。

テキストとカスタムメニューがシンプルで万能すぎる!

というわけでこのあたりのことを、WordPress.comとWordPressインストール版を比較しながら何をやったか書いていきます。

この投稿の続きを読む

AWS EC2上のTomcatにJMX設定をしよう!

はじめての方は初めまして、そうでない方はお久しぶりでございます。
DiceK Mikamiです。
諸事により長らくブログから遠ざかっておりましたが、戻って参りました。
決して嫌になったとかそういうんじゃないだからねっ!!
心機一転よろしくお願いいたします。
 
閑話休題
 
さて、4月になり春も真っ盛りと言う感じですが、
日本の社会人である私たちにとって4月とは新年度であり、
バタバタと忙しい日々かと思います。
新年度と言えば、、、そうですね新環境構築ですね。
今回は縁あって、EC2上に設置したTomcatに対してJMX設定を行いましたので、
その設定方法などを共有したいと思います。
これでリモート監視ができる!
 

検証環境

  • OS: Amazon Linux AMI release 2014.03
  • Java: JDK1.7.0
  • Tomcat: 7.0.5

 

リモートホスト(EC2側)の設定手順

1. Tomcatのserver.xmlにリスナーを登録する

素敵なことにJMX用のリスナーが用意されていますので、server.xmlにリスナーを追記します。

<Tomcat Home>/conf/server.xml

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10080" rmiServerPortPlatform="10081"/>

server.xmlの最初の方にリスナーが固まって記述されていますので、そのあたりに追加すれば良いです。
 

2. catalina-jmx-remote.jarをlibフォルダに追加する

リスナー登録だけでは動作してくれませんので、JMX用のライブラリ( catalina-jmx-remote.jar )をTomcatのlibフォルダに追加します。
最初から同梱されていることはほぼないと思いますので、以下から取得してください。

http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.50/bin/extras

バージョン配下にある「 bin/extras 」にjarファイルはありますので、利用するTomcatのバージョンにあわせてライブラリを取得してください。
ライブラリを取得しましたら「 $Tomcatホーム/lib 」配下に置きます。
 

3. Tomcat起動オプションを設定する

次にTomcatの起動オプションを追加します。
setenv.shを作成し、以下のオプションを追加します。

<Tomcat Home>/bin/setenv.sh

export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true
                      -Dcom.sun.management.jmxremote.ssl=false
                      -Dcom.sun.management.jmxremote.authenticate=false
                      -Djava.rmi.server.hostname=<ホスト名>"

bin配下にsetenv.shがある場合、起動時にデフォルトで呼ばれますので、別個に用意しています。
検証時には、設定するホスト名をEC2インスタンスを立ち上げた時のデフォルトホスト名を設定しました。
 

4. Outboundポートを開放する

今回の目的としてEC2上のTomcatをリモート監視すると言うことになりますので、外部から接続するためのポートを開放します。
これはAWSコンソールからの設定になります。
検証では10080ポートと10081ポートを利用しましたので、その2つのポートを開放しました。

EC2側での設定は以上になります。
 

クライアントからの接続手順

いよいよクライアントから接続します。
今回はjdkに付属しているjconsoleから接続してみます。(VisualVMでも接続できます)

$ jconsole service:jmx:rmi://localhost:10081/jndi/rmi://localhost:10080/jmxrmi

これで接続完了!
 

…….
……….. 
 

こ、こんなはずでは。。。

こ、こんなはずでは。。。


!!!!!
なん、、、だと、、、???

はいそうですね。
いくらポートを開放したところでセキュリティがバッチリきいているため接続はできなくて当然ですよね。
みなさんを試したんですよ。
リモートで接続するためにSSHトンネリングを利用しましょう。

$ ssh -i  @ -L 10080:localhost:10080 -L 10081:localhost:10081

これを実行した後、再度jconsoleを起動します。

$ jconsole service:jmx:rmi://localhost:10081/jndi/rmi://localhost:10080/jmxrmi

jmxsuccess
おお、ちゃんとグラフが見えるではないか。
 
ともあれ、これでリモートでTomcatを監視し放題になりました。
今回はコマンドラインと既存ツールを使って行いましたが、
SSHトンネリングとJMXのプロトコルを利用したアプリケーションを利用すればより良い監視ライフが送れることかと思います。

CloudWatch Monitoring Scriptsの監視データ(メトリクス)がすぐに反映されない場合の解決策

AWS便利ですね。今回は運用時にハマったことについて紹介します。
タイトルの通り、CloudWatch Monitoring ScriptsでEC2インスタンスの監視をしようとしたときの話です。
AMIから起動したインスタンスの監視データが、CloudWatchのコンソールになかなか表示されないという現象に遭遇しました。

 

CloudWatch Monitoring Scriptsについて

AWSのインスタンスを監視する方法としてCloudWatchが提供されています。
CloudWatchで監視できるEC2用のメトリクス(監視項目)は、以下の10項目です。

  • CPUUtilization
  • DiskReadOps
  • DiskWriteOps
  • DiskReadBytes
  • DiskWriteBytes
  • NetworkIn
  • NetworkOut
  • StatusCheckFailed
  • StatusCheckFailed_Instance
  • StatusCheckFailed_System

これに加えて、2013年2月にLinux用のMonitoring Scriptsがリリースされたことにより、公式のスクリプトでメモリやディスク使用量などの監視が可能になりました。

設定方法や使い方は下記の記事が大変参考になります。
http://dev.classmethod.jp/cloud/aws/cloudwatch-monitoring-script-for-linux/

 

監視データがすぐに反映されない場合の解決策

AMI作成前か、新しいインスタンス起動時に以下を実行する。

 rm -rf /var/tmp/aws-mon/*

 

Monitoring Scriptsを実行すると以下のファイルが作成され、すでにファイルが存在している場合は、インスタンスIDとゾーンを参照してしまうことが原因のようです。

  • /var/tmp/aws-mon/instance-id : EC2のインスタンスIDを記録するファイル
  • /var/tmp/aws-mon/placement/availability-zone : アベイラビリティゾーンを記録するファイル

使用頻度の高そうなMarkdownの記法

Markdownの記法についてよく使いそうなものをリストしました。(GitHubのWikiで表示確認しました。)

この投稿の続きを読む

SVGアイコンをきれいにWebフォント化する方法(Inkscape+icomoon)

Webフォントについて調べてみると、本当に色々なところで使われています。

代表的なのはFont Awesome

色々なライブラリがありますが、ライブラリに使いたいアイコンがない!

という場合は多々あります。

そんなときのために自分でかんたんにWebフォントを作れる方法をご紹介です。

流れとしては、

  1.  サンプルSVGファイル用意
  2. Inkscapeで微調整
  3. font icon generatorサービスでWebフォントを作成

といった感じです。

この投稿の続きを読む

ノンデザイナーの私がデザインするときによく使う重宝ツールまとめ

デザイナーではないけど、開発上デザインをしなければならない時があります。

そしてできれば今流行りのフラットデザインで綺麗なものを作りたい。

プログラマーの方でデザインに悩む方は多いのではないでしょうか(私だけじゃないはず・・・)。

色々検索してもデザイナー視点の記事が多く、なかなか素人には真似しがたいなぁと思っていました。

そこでノンデザイナー=素人の私が、これは便利!なるほど!と思った便利なツール、ためになるブログ、便利なサービスやライブラリをまとめてご紹介です。

プロのようにはなかなかいきませんが、下で紹介したページやツールにより随分とすっきりしたデザインになると思います。

この投稿の続きを読む

Javaデザインパターン Singleton

Singletonパタンについてご紹介します。

利用目的

あるクラスのオブジェクトを1個だけ作って共有したい。

実装

Java 1.6以降の場合、1個の要素だけの列挙型を利用して実装できます。

package javadesignpattern;

public enum MyEnumSingleton {
    INSTANCE;

    // other methods here
}

これは現在一番良いSingletonを実装するやり方だと言われています。(Effective java Joshua Bloch)

Java 1.6以前の場合

一般的な実装方法

package javadesignpattern.singleton;

/** 
 * Most frequently used singleton -- traditional singleton 
 */  
public class TraditionalSingleton {  
    private static final TraditionalSingleton instance = new TraditionalSingleton();  
  
    private TraditionalSingleton() {  
    }  
  
    public static TraditionalSingleton getInstance() {  
        return instance;  
    }  
  
}

遅延読み込み(Lazy loading)を実装する方法

package javadesignpattern.singleton;

/**
 * lazy loading
 *
 */
public class LazyLoadingSingleton {

	static LazyLoadingSingleton instance;

	public static synchronized LazyLoadingSingleton getInstance() {
	    if (instance == null)
	    	instance = new LazyLoadingSingleton();
	    return instance;
	}

}

ダブルチェックロッキングを実装する方法

package javadesignpattern.singleton;

/**
 * Double-checked locking
 *
 */
public class DoubleCheckedLockingSingleton {
	private static DoubleCheckedLockingSingleton uniqInstance;

	private DoubleCheckedLockingSingleton() {
	}

	public static synchronized DoubleCheckedLockingSingleton getInstance() {
    if (uniqInstance == null) {
    	synchronized (DoubleCheckedLockingSingleton.class) {
    		if (uniqInstance == null) {
    	    	uniqInstance = new DoubleCheckedLockingSingleton();
    		}
		}
    }
    return uniqInstance;
  }
  // other useful methods here
} 

Initialization-on-demandホルダーを実装する方法

package javadesignpattern.singleton;

/**
 * initialization on demand holder
 *
 */
public class InitializationOnDemandHolderSingleton {

	  static class SingletonHolder {
	    static InitializationOnDemandHolderSingleton instance = new InitializationOnDemandHolderSingleton();
	  }

	  public static InitializationOnDemandHolderSingleton getInstance() {
	    return SingletonHolder.instance;
	  }

}

利用例

JDKの中にSingletonの利用例は以下のようにあげられます。
java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
java.awt.Desktop#getDesktop()

注意点

Singontonパタンは、本当に1個しかオブジェクトが必要でないかどうか、慎重に検討してから使うべきです。

参考資料

http://javarevisited.blogspot.jp/2012/07/why-enum-singleton-are-better-in-java.html

http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

http://www.ibm.com/developerworks/jp/java/library/j-dcl/

Synchi – WordPressの秀逸エディタプラグイン

最近WordPressを使用しています。

デフォルトのテキスト(HTML)エディタは少し使いづらいです。
不満点は

  • コードがハイライトされないこと
  • Tabキーでインデント操作ができないこと

これらを解消できるエディタがあったので、ご紹介です。

Synchi

いくつか試しましたが、結果的に一番良かったのはこのプラグイン。

この投稿の続きを読む

Gmail Java IMAP Extensionを使ってGmailを既読にする

以前、こちらのエントリでGmailをIMAPを使って読み込む手法を紹介しました。

Gmailのメールの本文を直接開くURLを取得する方法

今回は同じGmailのIMAP用ライブラリを使用して、Gmailの特定のメールを既読にする手法を紹介します。

では早速ソースコードです。

package work;

import java.util.Properties;

import com.google.code.com.sun.mail.imap.IMAPSSLStore;
import com.google.code.javax.mail.Folder;
import com.google.code.javax.mail.Message;
import com.google.code.javax.mail.MessagingException;
import com.google.code.javax.mail.Session;
import com.google.code.javax.mail.Flags.Flag;
import com.google.code.javax.mail.search.GmailMessageIDTerm;

public class Sample {

	public static void main(String[] args) throws MessagingException{
		final String email = "email@gmail.com"; //メールアドレス
		final String password = "password"; //パスワード
		final String host = "imap.gmail.com"; //GmailのIMAPホスト名
		final String messageId = "xxxxxxxxxxxxxxx";  //既読にするメールのID(16進数表記)

		Properties props = new Properties();
		props.setProperty("mail.store.protocol", "imaps");
		Session session = Session.getDefaultInstance(props, null);
		IMAPSSLStore store = new IMAPSSLStore(session, null);
		Folder inbox = null;

		try {
			store.connect(host, email, password);
			inbox = store.getFolder("Inbox");
			inbox.open(Folder.READ_WRITE);

			GmailMessageIDTerm term
				= new GmailMessageIDTerm(Long.toString(Long.parseLong(messageId, 16)));
			Message[] messages = inbox.search(term); //対象のメッセージを検索
			if(messages != null){
				for(Message message : messages){
					if(message != null){
						message.setFlag(Flag.SEEN, true); //メッセージを既読にする
					}
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			if (inbox.isOpen()) {
				inbox.close(true);
			}
			if(store.isConnected()){
				store.close();
			}
		}
	}
}

なお、上記のコードはメッセージIDを使ったGmailの検索の例でもあります。
GmailのメッセージIDは各メールを開いた際のURLの末尾にある16進数になります。

で、実際に検索を行う際はこの16進数表記の文字列をロング値に変換してやる必要があるので注意が必要です。

IE9 iframeを用いたサイトのドキュメントモード

IE9においてiframeを用いたサイトを構築する場合、フレーム内のドキュメントモードに注意する必要があります

iframe Handling (英語)によると、IE9 では、iframe 内のドキュメント モードはトップ レベルの Web ページのドキュメント モードで決まります。トップ レベルの Web ページが IE9 標準モードでない場合、iframe内のサブドキュメントはどのような指定をしても IE9の標準モードではレンダリングできません。

例えば以下の様なコンテンツを作成したとします。

■ index.html

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'/>

<!-- ドキュメントモードにIE8標準モードを指定 -->
<meta http-equiv="X-UA-Compatible" content="IE=8">

<title>index</title>
<script type="text/javascript">
window.onload = function(){
var mode = document.documentMode;
document.body.innerHTML = "Document mode: " + mode;
};
</script>
</head>

<body>
<iframe id="ifrm" src="contents.html" />
</body>
</html>

■ contents.html

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'/>

<!-- ドキュメントモードにIE9標準モードを指定 -->
<meta http-equiv="X-UA-Compatible" content="IE=9">
<title>contents</title>
<script type="text/javascript">
window.onload = function(){
var mode = document.documentMode;
document.body.innerHTML = "Document mode: " + mode;
}
</script>
</head>

<body>
</body>
</html>

上記の例ではindex.html内にiframeを配置し、その中にcontents.htmlを表示するような指定となっています。contents.htmlはmetaタグの指定によりIE9標準モードでのレンダリングを行うよう指定していますが、トップレベルであるindex.htmlはmetaタグの指定によりIE8標準モードでのレンダリングとなっています。このような状態でindex.htmlをIE9で表示すると、contetns.htmlはmetaタグの指定に関わらず、IE8標準モードでレンダリングされることになります。

このようにiframe内のコンテンツがコンテンツ制作者の意図しないドキュメントモードでレンダリングされないようにするため、サイト内にiframeを用いる場合はトップレベルのドキュメントモードをIE9標準モードとする必要があります。

フォロー

新しい投稿をメールで受信しましょう。