<?xml version="1.0" encoding="UTF-8"?>

<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom">
    <title>EMXAS IT工房</title>
    <subtitle>ITLab Tech Blog</subtitle>
    <id>http://www.emxas.co.jp/itblog/:2</id>

    <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/" />
    <link rel="self" type="application/atom+xml" href="http://www.emxas.co.jp/itblog/http://www.emxas.co.jp/itblog" />
    <generator uri="http://nucleuscms.org/">Nucleus CMS v3.3</generator>
    <updated>2011-07-11T05:04:00Z</updated>

    <entry>
 <title type="html"><![CDATA[Active Directory に JNDI アクセスしてオブジェクトを操作]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=309" />
 <author>
  <name>hyhy</name>
 </author>
 <updated>2011-07-11T05:04:00Z</updated>
 <published>2011-07-11T14:04:00+09:00</published>
 <content type="html"><![CDATA[Active Directory に対し、JNDI(Java Naming and Directory Interface)を使用してアクセスし、オブジェクトを操作する方法を紹介します。<br />
<br />
実行環境<br />
<div class="inBlogTable"><table border="1"><tr><th width="150px;">Java SE</th><td width="150px;">1.5.0_10</td></tr><tr><th>Active Directory</th><td>2003 / 2008</td></tr></table></div><br />
公開紹介するサンプルコードの内容は以下となります。<br />
<ul><li><a href="#ou_creator">組織階層を作成する</a><li><a href="#user_creator">ユーザーを作成する</a><li><a href="#group_creator">グループを作成する</a><li><a href="#group_member_adder">グループにメンバを追加する</a><li><a href="#group_member_deletor">グループからメンバを削除する</a><li><a href="#user_ou_mover">ユーザーの組織階層を移動する</a></ul><br />
<br />
以下のサンプルコードは、<a href="http://www.emxas.co.jp/itblog/item_99.html" target="_self">過去掲載記事</a>を参照して下さい。<br />
<ul><li>ユーザーを検索する<li>ユーザーに属性を追加する<li>ユーザーの属性を変更する<li>ユーザーの属性を削除する</ul><br />
<br />
<a name="ou_creator"><b>◆組織階層を作成する</b></a><br />
<br />
"objectClass"属性に、"top","organizationalUnit"と設定するのがポイントです。<br />
<br />
<div class="itl_source" style="height:500px;"><br />
package jp.co.emxas.itl.jndi;<br />
<br />
import java.util.Hashtable;<br />
<br />
import javax.naming.Context;<br />
import javax.naming.NamingException;<br />
import javax.naming.directory.Attribute;<br />
import javax.naming.directory.Attributes;<br />
import javax.naming.directory.BasicAttribute;<br />
import javax.naming.directory.BasicAttributes;<br />
import javax.naming.directory.InitialDirContext;<br />
<br />
/**<br />
 * 組織階層を作成します。<br />
 */<br />
public class OUCreator {<br />
<br />
	/**<br />
	 * 組織階層を作成します。<br />
	 * <br />
	 * @param args<br />
	 * @throws NamingException<br />
	 *             LDAPアクセスに失敗した場合<br />
	 */<br />
	public static void main(String args[]) throws NamingException {<br />
		// ★★ LDAP接続環境を設定します Start<br />
		// ここで指定する情報は外部ファイル化するのが良いでしょう<br />
		Hashtable env = new Hashtable();<br />
		// Contextファクトリを設定<br />
		env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
				"com.sun.jndi.ldap.LdapCtxFactory");<br />
		// 接続先URL(ホスト，ポート番号)を設定<br />
		env.put(Context.PROVIDER_URL, "ldap://localhost:389");<br />
		// 接続ユーザIDを設定します<br />
		// ※このユーザはオブジェクト作成権限を持つ必要があります<br />
		env.put(Context.SECURITY_PRINCIPAL,<br />
				"CN=jndi_connector,OU=Users,DC=emxas,DC=co,DC=jp");<br />
		// 接続ユーザのパスワードを設定します。<br />
		env.put(Context.SECURITY_CREDENTIALS, "password");<br />
		// ★★ LDAP接続環境を設定します End<br />
<br />
		// 設定した環境を元にコンテキストを生成します<br />
		InitialDirContext context = new InitialDirContext(env);<br />
<br />
		// 属性集合<br />
		Attributes attrs = new BasicAttributes();<br />
		// ou属性<br />
		Attribute attrOu = new BasicAttribute("ou");<br />
		attrOu.add(0, "ou1");<br />
		attrs.put(attrOu);<br />
		// objectClass(必須)<br />
		Attribute attrObjClass = new BasicAttribute("objectClass");<br />
		attrObjClass.add(0, "top");<br />
		attrObjClass.add(1, "organizationalUnit");<br />
		attrs.put(attrObjClass);<br />
<br />
		// 組織階層を作成<br />
		context.createSubcontext(<br />
				"OU=ou1,OU=Users,DC=emxas,DC=co,DC=jp", attrs);<br />
<br />
	}<br />
<br />
}<br />
</div><br />
<br />
<a name="user_creator"><b>◆ユーザーを作成する</b></a><br />
<br />
"objectClass"属性に、"top","person","inetOrgPerson"と設定するのがポイントです。<br />
<br />
<div class="itl_source" style="height:500px;"><br />
package jp.co.emxas.itl.jndi;<br />
<br />
import java.util.Hashtable;<br />
<br />
import javax.naming.Context;<br />
import javax.naming.NamingException;<br />
import javax.naming.directory.Attribute;<br />
import javax.naming.directory.Attributes;<br />
import javax.naming.directory.BasicAttribute;<br />
import javax.naming.directory.BasicAttributes;<br />
import javax.naming.directory.InitialDirContext;<br />
<br />
/**<br />
 * ユーザーを作成します。<br />
 */<br />
public class UserCreator {<br />
<br />
	/**<br />
	 * ユーザーを作成します。<br />
	 * <br />
	 * @param args<br />
	 * @throws NamingException<br />
	 *             LDAPアクセスに失敗した場合<br />
	 */<br />
	public static void main(String args[]) throws NamingException {<br />
		// ★★ LDAP接続環境を設定します Start<br />
		// ここで指定する情報は外部ファイル化するのが良いでしょう<br />
		Hashtable env = new Hashtable();<br />
		// Contextファクトリを設定<br />
		env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
				"com.sun.jndi.ldap.LdapCtxFactory");<br />
		// 接続先URL(ホスト，ポート番号)を設定<br />
		env.put(Context.PROVIDER_URL, "ldap://localhost:389");<br />
		// 接続ユーザIDを設定します<br />
		// ※このユーザはオブジェクト作成権限を持つ必要があります<br />
		env.put(Context.SECURITY_PRINCIPAL,<br />
				"CN=jndi_connector,OU=Users,DC=emxas,DC=co,DC=jp");<br />
		// 接続ユーザのパスワードを設定します。<br />
		env.put(Context.SECURITY_CREDENTIALS, "password");<br />
		// ★★ LDAP接続環境を設定します End<br />
<br />
		// 設定した環境を元にコンテキストを生成します<br />
		InitialDirContext context = new InitialDirContext(env);<br />
<br />
		// 属性集合<br />
		Attributes attrs = new BasicAttributes();<br />
		// cn属性<br />
		Attribute attrCn = new BasicAttribute("cn");<br />
		attrCn.add(0, "user1");<br />
		attrs.put(attrCn);<br />
		// sn属性(姓)<br />
		Attribute attrSn = new BasicAttribute("sn");<br />
		attrSn.add(0, "user1");<br />
		attrs.put(attrSn);<br />
		// objectClass(必須)<br />
		Attribute attrObjClass = new BasicAttribute("objectClass");<br />
		attrObjClass.add(0, "top");<br />
		attrObjClass.add(1, "person");<br />
		attrObjClass.add(2, "inetOrgPerson");<br />
		attrs.put(attrObjClass);<br />
<br />
		// ユーザーを作成<br />
		context.createSubcontext(<br />
				"CN=user1,OU=Users,DC=emxas,DC=co,DC=jp", attrs);<br />
<br />
	}<br />
<br />
}<br />
</div><br />
<br />
<a name="group_creator"><b>◆グループを作成する</b></a><br />
<br />
"objectClass"属性に、"top","group"と設定するのがポイントです。<br />
<br />
<div class="itl_source" style="height:500px;"><br />
package jp.co.emxas.itl.jndi;<br />
<br />
import java.util.Hashtable;<br />
<br />
import javax.naming.Context;<br />
import javax.naming.NamingException;<br />
import javax.naming.directory.Attribute;<br />
import javax.naming.directory.Attributes;<br />
import javax.naming.directory.BasicAttribute;<br />
import javax.naming.directory.BasicAttributes;<br />
import javax.naming.directory.InitialDirContext;<br />
<br />
/**<br />
 * グループを作成します。<br />
 */<br />
public class GroupCreator {<br />
<br />
	/**<br />
	 * グループを作成します。<br />
	 * <br />
	 * @param args<br />
	 * @throws NamingException<br />
	 *             LDAPアクセスに失敗した場合<br />
	 */<br />
	public static void main(String args[]) throws NamingException {<br />
		// ★★ LDAP接続環境を設定します Start<br />
		// ここで指定する情報は外部ファイル化するのが良いでしょう<br />
		Hashtable env = new Hashtable();<br />
		// Contextファクトリを設定<br />
		env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
				"com.sun.jndi.ldap.LdapCtxFactory");<br />
		// 接続先URL(ホスト，ポート番号)を設定<br />
		env.put(Context.PROVIDER_URL, "ldap://localhost:389");<br />
		// 接続ユーザIDを設定します<br />
		// ※このユーザはオブジェクト作成権限を持つ必要があります<br />
		env.put(Context.SECURITY_PRINCIPAL,<br />
				"CN=jndi_connector,OU=Users,DC=emxas,DC=co,DC=jp");<br />
		// 接続ユーザのパスワードを設定します。<br />
		env.put(Context.SECURITY_CREDENTIALS, "password");<br />
		// ★★ LDAP接続環境を設定します End<br />
<br />
		// 設定した環境を元にコンテキストを生成します<br />
		InitialDirContext context = new InitialDirContext(env);<br />
<br />
		// 属性集合<br />
		Attributes attrs = new BasicAttributes();<br />
		// cn属性<br />
		Attribute attrCn = new BasicAttribute("cn");<br />
		attrCn.add(0, "group1");<br />
		attrs.put(attrCn);<br />
		// objectClass(必須)<br />
		Attribute attrObjClass = new BasicAttribute("objectClass");<br />
		attrObjClass.add(0, "top");<br />
		attrObjClass.add(1, "group");<br />
		attrs.put(attrObjClass);<br />
<br />
		// グループを作成<br />
		context.createSubcontext(<br />
				"CN=group1,OU=Users,DC=emxas,DC=co,DC=jp", attrs);<br />
<br />
	}<br />
<br />
}<br />
</div><br />
<br />
<a name="group_member_adder"><b>◆グループにメンバを追加する</b></a><br />
<br />
<div class="itl_source" style="height:500px;"><br />
package jp.co.emxas.itl.jndi;<br />
<br />
import java.util.Hashtable;<br />
<br />
import javax.naming.Context;<br />
import javax.naming.NamingException;<br />
import javax.naming.directory.Attribute;<br />
import javax.naming.directory.BasicAttribute;<br />
import javax.naming.directory.DirContext;<br />
import javax.naming.directory.InitialDirContext;<br />
import javax.naming.directory.ModificationItem;<br />
<br />
/**<br />
 * グループにメンバを追加します。<br />
 */<br />
public class GroupMemberAdder {<br />
<br />
	/**<br />
	 * グループにメンバを追加します。<br />
	 * <br />
	 * @param args<br />
	 * @throws NamingException<br />
	 *             LDAPアクセスに失敗した場合<br />
	 */<br />
	public static void main(String args[]) throws NamingException {<br />
		// ★★ LDAP接続環境を設定します Start<br />
		// ここで指定する情報は外部ファイル化するのが良いでしょう<br />
		Hashtable env = new Hashtable();<br />
		// Contextファクトリを設定<br />
		env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
				"com.sun.jndi.ldap.LdapCtxFactory");<br />
		// 接続先URL(ホスト，ポート番号)を設定<br />
		env.put(Context.PROVIDER_URL, "ldap://localhost:389");<br />
		// 接続ユーザIDを設定します<br />
		// ※このユーザはオブジェクト作成権限を持つ必要があります<br />
		env.put(Context.SECURITY_PRINCIPAL,<br />
				"CN=jndi_connector,OU=Users,DC=emxas,DC=co,DC=jp");<br />
		// 接続ユーザのパスワードを設定します。<br />
		env.put(Context.SECURITY_CREDENTIALS, "password");<br />
		// ★★ LDAP接続環境を設定します End<br />
<br />
		// 設定した環境を元にコンテキストを生成します<br />
		InitialDirContext context = new InitialDirContext(env);<br />
<br />
		// member属性の追加<br />
		ModificationItem[] modificationItems = new ModificationItem[1];<br />
		Attribute attrMember = new BasicAttribute( "member" , "CN=user1,OU=Users,DC=emxas,DC=co,DC=jp" );<br />
		modificationItems[0] = new ModificationItem( DirContext.ADD_ATTRIBUTE , attrMember );<br />
<br />
		// グループにメンバを追加<br />
		context.modifyAttributes( "CN=group1,OU=Users,DC=emxas,DC=co,DC=jp" , modificationItems );<br />
<br />
	}<br />
<br />
}<br />
</div><br />
<br />
<a name="group_member_deletor"><b>◆グループからメンバを削除する</b></a><br />
<br />
<div class="itl_source" style="height:500px;"><br />
package jp.co.emxas.itl.jndi;<br />
<br />
import java.util.Hashtable;<br />
<br />
import javax.naming.Context;<br />
import javax.naming.NamingException;<br />
import javax.naming.directory.Attribute;<br />
import javax.naming.directory.BasicAttribute;<br />
import javax.naming.directory.DirContext;<br />
import javax.naming.directory.InitialDirContext;<br />
import javax.naming.directory.ModificationItem;<br />
<br />
/**<br />
 * グループからメンバを削除します。<br />
 */<br />
public class GroupMemberDeletor {<br />
<br />
	/**<br />
	 * グループからメンバを削除します。<br />
	 * <br />
	 * @param args<br />
	 * @throws NamingException<br />
	 *             LDAPアクセスに失敗した場合<br />
	 */<br />
	public static void main(String args[]) throws NamingException {<br />
		// ★★ LDAP接続環境を設定します Start<br />
		// ここで指定する情報は外部ファイル化するのが良いでしょう<br />
		Hashtable env = new Hashtable();<br />
		// Contextファクトリを設定<br />
		env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
				"com.sun.jndi.ldap.LdapCtxFactory");<br />
		// 接続先URL(ホスト，ポート番号)を設定<br />
		env.put(Context.PROVIDER_URL, "ldap://localhost:389");<br />
		// 接続ユーザIDを設定します<br />
		// ※このユーザはオブジェクト作成権限を持つ必要があります<br />
		env.put(Context.SECURITY_PRINCIPAL,<br />
				"CN=jndi_connector,OU=Users,DC=emxas,DC=co,DC=jp");<br />
		// 接続ユーザのパスワードを設定します。<br />
		env.put(Context.SECURITY_CREDENTIALS, "password");<br />
		// ★★ LDAP接続環境を設定します End<br />
<br />
		// 設定した環境を元にコンテキストを生成します<br />
		InitialDirContext context = new InitialDirContext(env);<br />
<br />
		// member属性の削除<br />
		ModificationItem[] modificationItems = new ModificationItem[1];<br />
		Attribute attrMember = new BasicAttribute( "member" , "CN=user1,OU=Users,DC=emxas,DC=co,DC=jp" );<br />
		modificationItems[0] = new ModificationItem( DirContext.REMOVE_ATTRIBUTE , attrMember );<br />
<br />
		// グループからメンバを削除<br />
		context.modifyAttributes( "CN=group1,OU=Users,DC=emxas,DC=co,DC=jp" , modificationItems );<br />
<br />
	}<br />
<br />
}<br />
</div><br />
<br />
<a name="user_ou_mover"><b>◆ユーザーの組織階層を移動する</b></a><br />
<br />
<div class="itl_source" style="height:500px;"><br />
package jp.co.emxas.itl.jndi;<br />
<br />
import java.util.Hashtable;<br />
<br />
import javax.naming.Context;<br />
import javax.naming.NamingException;<br />
import javax.naming.directory.InitialDirContext;<br />
<br />
/**<br />
 * ユーザーの組織階層を移動します。<br />
 */<br />
public class UserOUMover {<br />
<br />
	/**<br />
	 * ユーザーの組織階層を移動します。<br />
	 * <br />
	 * @param args<br />
	 * @throws NamingException<br />
	 *             LDAPアクセスに失敗した場合<br />
	 */<br />
	public static void main(String args[]) throws NamingException {<br />
		// ★★ LDAP接続環境を設定します Start<br />
		// ここで指定する情報は外部ファイル化するのが良いでしょう<br />
		Hashtable env = new Hashtable();<br />
		// Contextファクトリを設定<br />
		env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
				"com.sun.jndi.ldap.LdapCtxFactory");<br />
		// 接続先URL(ホスト，ポート番号)を設定<br />
		env.put(Context.PROVIDER_URL, "ldap://localhost:389");<br />
		// 接続ユーザIDを設定します<br />
		// ※このユーザはオブジェクト作成権限を持つ必要があります<br />
		env.put(Context.SECURITY_PRINCIPAL,<br />
				"CN=jndi_connector,OU=Users,DC=emxas,DC=co,DC=jp");<br />
		// 接続ユーザのパスワードを設定します。<br />
		env.put(Context.SECURITY_CREDENTIALS, "password");<br />
		// ★★ LDAP接続環境を設定します End<br />
<br />
		// 設定した環境を元にコンテキストを生成します<br />
		InitialDirContext context = new InitialDirContext(env);<br />
<br />
		// ユーザーの組織階層を移動<br />
		context.rename("CN=user1,OU=Users,DC=emxas,DC=co,DC=jp", "CN=user1,OU=ou1,OU=Users,DC=emxas,DC=co,DC=jp");<br />
<br />
	}<br />
<br />
}<br />
</div><br />
<br />
　サンプルコードの実行には、予め、Active Directory に接続ユーザアカウント(jndi_connector)を作成し、オブジェクト操作権限をもつ、Administratorsグループ権限を付与しました。<br />
オブジェクト操作権限をもたない場合、オブジェクト操作時にエラーとなるので注意して下さい。<br />
※検索処理を実施するだけであれば、オブジェクト操作権限をもつ必要はありません。<br />
<br />
　今回は、Active Directory オブジェクトに対して JNDI でアクセスし、オブジェクトを操作しましたが、LDAP アクセスの観点から見れば、一般的な Directory サーバに対して操作を行っているのと大きく変わりはありません。<br />
Active Directory オブジェクト固有の考慮が必要なのは、各オブジェクトの属性名と属性値です。<br />
例えば、ユーザアカウントの“国/地域”の属性名は「c」で属性値は「文字列」です。<br />
これらオブジェクトの属性名と属性値が分かれば、LDAP アクセスにより、自由にオブジェクトの操作が可能となります。<br />
※オブジェクトの属性名と属性値は、Windows Server の「ADSI エディター」などで確認可能です。]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:309</id>
</entry><entry>
 <title type="html"><![CDATA[[Abobe AIR] [Flex] [TextArea]コンポーネントの制御]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=290" />
 <author>
  <name>hiroy</name>
 </author>
 <updated>2010-01-03T15:00:00Z</updated>
 <published>2010-01-04T00:00:00+09:00</published>
 <content type="html"><![CDATA[TextAreaコンポーネントで入力を行う際に、<br />
[CTRL+S]などのキー操作を行うと変な文字が入力されてしまいます。<br />
例えば、アプリケーションの機能として<br />
[[CTRL+S]でテキストエリアに入力されている文字列をローカルのファイルに保存する]<br />
というようなショートカット機能がある場合に、<br />
ファイルの末尾に余分な文字がくっつくことになってしまいます。<br />
<br />
それを回避するための方法です。<br />
<br />
<div class="itl_source" style="width:550px;height:500px;"><br />
package scripts.extend<br />
{<br />
  import flash.system.Capabilities;<br />
  import flash.events.KeyboardEvent;<br />
  import flash.ui.Keyboard;<br />
  import mx.controls.TextArea;<br />
<br />
  /**<br />
   * テキストエリア拡張クラス<br />
   * @author<br />
   * <br />
   */	<br />
  public class TextAreaEx extends TextArea<br />
  {<br />
    /**<br />
     * コンストラクタ <br />
     * <br />
     */		<br />
    public function TextAreaEx()<br />
    {<br />
      super();<br />
    }<br />
<br />
    /**<br />
     * キーボードが押されたとき <br />
     * Ctrl(Command)+Sを防御<br />
     * @param event<br />
     * <br />
     */		<br />
    override protected function keyDownHandler(event:KeyboardEvent):void<br />
    {<br />
      var isWin:Boolean = isWindows();<br />
<br />
      if((isWin && event.ctrlKey) || (!isWin && event.commandKey))<br />
      {<br />
        if(Keyboard.S == event.keyCode)<br />
        {	<br />
          event.preventDefault();<br />
<br />
          return;<br />
        }<br />
      }<br />
<br />
      super.keyDownHandler(event);<br />
    }<br />
<br />
    /**<br />
     * OSがWindowsかどうか <br />
     * @return <br />
     * <br />
     */		<br />
    private function isWindows():Boolean<br />
    {<br />
      return (Capabilities.os.substring(0, 3) == "Win");<br />
    }<br />
  }<br />
}<br />
</div><br />
<br />
キーボードが押された時(KeyboardEvent.KEY_DOWN)のハンドラをオーバーライドします。<br />
Windowsでは[CTRL+S]ですが、Macでは[Command+S]が一般的ですので、OSの判定も行っています。<br />
OS判定のメソッドは本来はユーティリティクラスなどに定義したほうがいいでしょう。<br />
<br />
OSがWindowsで[CTRL+S]もしくはOSがMacで[Command+S]の場合は、イベントをキャンセルし、<br />
それ以外は親クラスで本来の処理をしてもらう、というコードです。<br />
<br />
他にも、[CTRL+J]で改行してしまったり、[CTRL+Y]で罫線が入力されてしまったりするので、<br />
防ぎたい場合には、その分だけif(KeyBoard.S == event.keyCode || KeyBoard.J == event.keyCode)のように<br />
条件を増やしていくといいと思います。<br />
<br />
多くなった場合には防ぎたいキーを配列にして、<br />
if(-1!=arr.indexOf(event.keyCode))や、<br />
if(arr.contains(event.keyCode))でもすっきりしていいですね。<br />
<br />
TextInputでも同様に拡張クラスを作成すれば、同じことが実現できます。]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:290</id>
</entry><entry>
 <title type="html"><![CDATA[Virtual PC 2007 で Windows XP + IE6 の日本語化利用]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=289" />
 <author>
  <name>hyhy</name>
 </author>
 <updated>2009-12-22T04:02:11Z</updated>
 <published>2009-12-22T13:02:11+09:00</published>
 <content type="html"><![CDATA[現在、Windows Internet Explorer(以下IE) の最新バージョンは8となりましたが、未だに、IE6のみターゲットにしているWebシステムも多くあります。<br />
今回は、「IE6利用のWebシステムの稼働確認をしたいけど、もうIE6はインストールしてないよ！！」っと言った場合のIE6の利用方法をご紹介します。IE6を利用する方法はいくつかありますが、今回は、Microsoftから無償配布されている以下を利用した方法をご紹介します。<br />
　・ Virtual PC 2007 の仮想化ソフト<br />
　・ WindowsXP + IE6 の Virtual PC 用ゲスト OS イメージ<br />
<br />
ただし、今回利用するゲストOSイメージは英語版となるため、日本語の表示・入力を可能とするために設定変更などの対応が必要となります。<br />
<br />
今回はその手順もあわせてご紹介します。<br />
<br />
<div class="inBlogTitle1">事前準備</div><br />
<b>Virtual PC 2007 ダウンロード＆インストール</b><br />
<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=04D26402-3199-48A3-AFA2-2DC0B40A73B6#filelist" target="_blank">このサイト</a>からダウンロードし、インストールを実施して下さい。</ul><br />
<br />
<br />
<div class="inBlogTitle1">WindowsXP + IE6 イメージ ダウンロード＆インストール</div><br />
<br />
<b>WindowsXP + IE6 ダウンロード</b><br />
<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=21EABB90-958F-4B64-B5F1-73D0A413C8EF&displaylang=en" target="_blank">このサイト</a>から「IE6-XPSP3.exe」をダウンロードします。<br />
ダウンロードした「IE6-XPSP3.exe」を実行し、WindowsXPのVirtualPCゲストOSイメージを任意のフォルダに展開します。<br />
<img src="http://www.emxas.co.jp/media/10/20091219-001.jpg"/><br />
<img src="http://www.emxas.co.jp/media/10/20091219-002.jpg"/><br />
<br />
<b>ゲストOSをVirtualPCのバーチャルマシーンに登録</b><br />
VirtualPCを起動し、新しいバーチャルマシーンウィザードからバーチャルマシーンを追加します。<br />
「ファイル -> 新しいバーチャルマシーンウィザード」メニューを選択<br />
<img src="http://www.emxas.co.jp/media/10/20091219-003.jpg"/><br />
「次へ」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-004.jpg"/><br />
「バーチャルマシーンの作成」を選択し、「次へ」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-005.jpg"/><br />
任意のフォルダに展開したバーチャルマシーンファイルを選択し、「次へ」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-006.jpg"/><br />
「Windows XP」を選択し、「次へ」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-007.jpg"/><br />
「推奨 RAM を使用」を選択し、「次へ」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-008.jpg"/><br />
「既存のバーチャルハードディスク」を選択し、「次へ」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-009.jpg"/><br />
「バーチャルハードディスク」「復元ディスクを有効にする」を選択し、「次へ」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-010.jpg"/><br />
「完了」ボタンを押下<br />
<br />
これで Virtual PC に登録したゲストOSを起動することが出来ます。<br />
<br />
<br />
<div class="inBlogTitle1">ゲストOS日本語化</div><br />
<b>日本語表示用システムファイルの導入</b><br />
IE6を起動し、日本語サイトを表示します。<br />
<img width="586" src="http://www.emxas.co.jp/media/10/20091219-012.jpg"/><br />
「その言語はインストールされていない」といったエラーが表示されるので「Install」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-013.jpg"/><br />
システムファイル導入のため、CDを要求してきますが、Windows XP 日本語版ホストPCの「C:\I386」以下のフォルダを共有してインストールしていきます。<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-014.jpg"/><br />
今回は、“Windows XP 日本語版ホストPCの「C:\I386」フォルダ”を“Z:”ドライブとして割り当て、インストールを実施しました。<br />
ほかにも以下ファイルを要求されますが、「C:\I386」または「C:\I386\LANG」フォルダ配下に存在しているので、該当するファイル指定すれば問題ありません。<br />
・imekrcic.dll<br />
・kbd106.dll<br />
・gulim.ttc<br />
・kbdipn.dll<br />
<br />
インストールが完了すると、再起動を求められます。<br />
<img src="http://www.emxas.co.jp/media/10/20091219-020.jpg"/><br />
再起動すると日本語の表示が可能となります。<br />
<br />
<b>日本語表示設定</b><br />
Control Panel - Date and Time を起動します。<br />
Time Zone を「Osaka,Sapporo,Tokyo」に変更します。<br />
<img src="http://www.emxas.co.jp/media/10/20091219-021.jpg"/><br />
<br />
Control Panel - Regional and Language Options を起動します。<br />
「English」「USA」といった項目を「Japanese」に変更し、Languageタブの「Details」を開き日本語入力システムを選択します。<br />
<img src="http://www.emxas.co.jp/media/10/20091219-022.jpg"/><br />
<img src="http://www.emxas.co.jp/media/10/20091219-023.jpg"/><br />
<img src="http://www.emxas.co.jp/media/10/20091219-024.jpg"/><br />
<br />
<b>キーボード設定</b><br />
英語キーボードが設定されているので、日本語キーボードを設定します。<br />
コンピュータ管理を起動します。<br />
<img src="http://www.emxas.co.jp/media/10/20091219-025.jpg"/><br />
[デバイスマネージャ]-[キーボード]を右クリックで、UpdateDriverを選択<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-026.jpg"/><br />
「No, not this time」を選択し、「Next」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-027.jpg"/><br />
「Install from a list or specific location [Advanced]」を選択し、「Next」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-028.jpg"/><br />
「Don't search. I will choose the driver to install」を選択し、「Next」ボタンを押下<br />
<br />
<img src="http://www.emxas.co.jp/media/10/20091219-029.jpg"/><br />
「Standard keyboards」「Japanese PS/2 Keyboard(106/109 Key)」を選択し、「Next」ボタンを押下<br />
<br />
<br />
以上の手順で完了となります。]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:289</id>
</entry><entry>
 <title type="html"><![CDATA[POI(書き込み機能(1))]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=283" />
 <author>
  <name>yas</name>
 </author>
 <updated>2009-12-07T15:00:00Z</updated>
 <published>2009-12-08T00:00:00+09:00</published>
 <content type="html"><![CDATA[以前に、JavaでMicrosoft Excelを扱うライブラリとしてJava Excel API(JXL)をご紹介しました。<br />
今回はより有名なPOIについて同様の内容について記述していきたいと思います。<br />
<br />
JXLとの比較もかねて、メニューの構成を前回とほぼ同一としています。<br />
まずはExcel文書の書き込み機能時に利用するAPIについて、2回に分けてご紹介していきます。<br />
<a href="#1">開始／終了処理</a><br />
　<a href="#1-1">新規にExcelファイルを作成する。</a><br />
　<a href="#1-2">既存のExcelファイルから操作用ファイルを作成する。</a><br />
　<a href="#1-3">保存してExcelファイルの操作を終了する。</a><br />
<a href="#2">ワークブックの操作</a><br />
　<a href="#2-1">ワークブック内のシート数を確認する。</a><br />
　<a href="#2-2">内容を書き込むためにシートのインスタンスを取得する。</a><br />
　<a href="#2-3">既存のシートの内容を別シートにコピーする。</a><br />
　<a href="#2-4">ワークブック内に新規シートを作成する。</a><br />
　<a href="#2-5">シートの順序を変更する。</a><br />
　<a href="#2-6">シートを削除する。</a><br />
　<a href="#2-7">登録された名前定義を取得する。</a><br />
　<a href="#2-8">名前定義されたセル範囲を取得する。</a><br />
<a href="#3">シートの操作</a><br />
　<a href="#3-1">シート名を設定する。</a><br />
　<a href="#3-2">シートに行を追加する。</a><br />
　<a href="#3-3">シートに列を追加する。</a><br />
　<a href="#3-4">行を削除する。</a><br />
　<a href="#3-5">列を削除する。</a><br />
　<a href="#3-6">内容を書き込むためにセルのインスタンスを取得する。</a><br />
　<a href="#3-7">値、フォーマットを設定したセルをシートに追加する。</a><br />
　<a href="#3-8">シート内のページ切り替え位置を設定する。</a><br />
　<a href="#3-9">行の高さを設定する。</a><br />
　<a href="#3-10">列の幅を設定する。</a><br />
　<a href="#3-11">列のフォーマットを設定する。</a><br />
　<a href="#3-12">セルを結合する。</a><br />
　<a href="#3-13">セルの結合を解除する。</a><br />
　<a href="#3-14">イメージを設定する。</a><br />
　<a href="#3-15">ハイパーリンクを設定する。</a><br />
<br />
<br />
<br />
<div id="1" class="inBlogTitle1">開始／終了処理</div><br />
org.apache.poi.hssf.usermodel.HSSFWorkbookのメソッドを使用します。<br />
<br />
<b id="1-1">新規にExcelファイルを作成する。</b><br />
<div class="itl_source">HSSFWorkbook workbook = new HSSFWorkbook();</div><br />
<br />
<b id="1-2">既存のExcelファイルから操作用ファイルを作成する。</b><br />
org.apache.poi.poifs.filesystem.POIFSFileSystemを使用します。<br />
<div class="itl_source">// POIFSFileSystemとして既存のExcelファイルを読み込む<br />
POIFSFileSystem fileSystem = new POIFSFileSystem(<br />
        new FileInputStream(filePath));<br />
HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);</div><br />
<br />
<b id="1-3">保存してExcelファイルの操作を終了する。</b><br />
<div class="itl_source">// OutputStreamに対して内容を書き込む<br />
Output output = new FileOutputStream("path/to/excel/file");<br />
<br />
/* <br />
 * 書き込み処理<br />
 */<br />
<br />
// 内容を保存<br />
workbook.write(output);<br />
// 終了処理<br />
try {<br />
    output.close();<br />
} IOException e) {<br />
    e.printStackTrace();<br />
}</div><br />
<br />
<br />
<div id="2" class="inBlogTitle1">ワークブックの操作</div><br />
org.apache.poi.hssf.usermodel.HSSFWorkbookを使用します。<br />
以下変数workbookをHSSFWorkbookのインスタンスとします。<br />
<br />
<b id="2-1">ワークブック内のシート数を確認する。</b><br />
<div class="itl_source">int count = workbook.getNumberOfSheets();<br />
</div><br />
<br />
<b id="2-2">内容を書き込むためにシートのインスタンスを取得する。</b><br />
<div class="itl_source">// インデックスを指定して取得する<br />
int index = 0;<br />
HSSFSheet indexedSheet = workbook.getSheetAt(index);<br />
<br />
// シート名を指定して取得する<br />
String sheetName = "Sheet1";<br />
HSSFSheet namedSheet = workbook.getSheet(sheetName);</div><br />
<br />
※ シートの操作は<a href="#3">こちら</a>を参照してください。<br />
<br />
<b id="2-3">既存のシートの内容を別シートにコピーする。</b><br />
<br />
コピーを行なうAPIはないようです。<br />
<br />
<b id="2-4">ワークブック内に新規シートを作成する。</b><br />
<div class="itl_source">// 新規シートを作成する<br />
HSSFSheet sheet1 = workbook.createSheet();<br />
<br />
// 名称を指定してシートを作成する<br />
HSSFSheet sheet2 = workbook.createSheet("SHEETNAME");</div><br />
<br />
<b id="2-5">シートの順序を変更する。</b><br />
<div class="itl_source">// シート名[sheet1]を3シート目に移動する<br />
String moveSheetName = "sheet1";<br />
int moveTo = 2;<br />
workbook.setSheetOrder(moveSheetName, moveTo);<br />
</div><br />
<br />
<b id="2-6">シートを削除する。</b><br />
<div class="itl_source">// 1シート目を削除する。<br />
int deleteSheet = 0;<br />
workbook.removeSheetAt(deleteSheet);<br />
</div><br />
<br />
<b id="2-7">登録された名前定義を取得する。</b><br />
※ 「挿入->名前->定義」で登録された名前定義名称を取得します。<br />
<div class="itl_source">// 設定された名前定義数を取得<br />
int namesCount = workbook.getNumberOfNames();<br />
for (int i = 0; i < namesCount; i++) {<br />
	HSSFName name = workbook.getNameAt(i);<br />
	String nameName = name.getNameName();<br />
}<br />
</div><br />
<br />
<b id="2-8">名前定義されたセル範囲を取得する。</b><br />
<div class="itl_source">// 設定された名前定義数を取得<br />
int namesCount = workbook.getNumberOfNames();<br />
for (int i = 0; i < namesCount; i++) {<br />
	HSSFName name = workbook.getNameAt(i);<br />
	String formula = name.getRefersToFormula();<br />
}<br />
</div><br />
※ シート名!開始セル位置:終了セル位置 の形式で取得できます。<br />
<br />
<div id="3" class="inBlogTitle1">シートの操作</div><br />
org.apache.poi.hssf.usermodel.HSSFSheetを使用します。<br />
HSSFSheetインスタンスの取得は<a href="#2">こちら</a>を参照してください。<br />
以下変数sheetをHSSFSheetのインスタンスとします。<br />
<br />
<br />
<b id="3-1">1シート目のシート名を変更する。</b><br />
<div class="itl_source"><br />
int index = 0;<br />
String sheetName = "updateSheetName";<br />
workbook.setSheetName(indexm sheetName);<br />
</div><br />
<br />
<b id="3-2">シートに行を追加する。</b><br />
<div class="itl_source">10行追加する<br />
for (int i = 0; i < 10; i++) {<br />
    HSSFRow row = sheet.createRow(i);<br />
}<br />
</div><br />
<br />
<b id="3-3">シートに列を追加する。</b><br />
列単位で操作するAPIはないようです。<br />
<br />
<b id="3-4">行を削除する。</b><br />
<div class="itl_source">1行目を削除する<br />
HSSFRow row = sheet.getRow(0);<br />
sheet.removeRow(row);<br />
</div><br />
<br />
<b id="3-5">列を削除する。</b><br />
列単位で操作するAPIはないようです。<br />
<br />
<b id="3-6">内容を書き込むためにセルのインスタンスを取得する。</b><br />
<div class="itl_source">// 行から、列番号を指定してセルを取得<br />
int row = 0;<br />
int column = 0;<br />
HSSFRow row = sheet.getRow(row);<br />
HSSFCell cell = row.getCell(column);<br />
</div><br />
※ セルの操作は次回に記述します。<br />
<br />
<b id="3-7">値、フォーマットを設定したセルを追加する。</b><br />
<div class="itl_source">// 10行10列のセルを追加<br />
for (int i = 0; i < 10; i++) {<br />
	HSSFRow rowa = sheet1.createRow(i);<br />
	for (int j = 0; j < 10; j++) {<br />
		row.createCell(j);<br />
	}<br />
}<br />
</div><br />
<br />
<br />
<b id="3-8">シート内のページ切り替え位置を設定する。</b><br />
<div class="itl_source"><br />
int rowBreak = 10;<br />
int colBreak = 10;<br />
sheet.setRowBreak(rowBreak);<br />
shee.setColumnBreak(colBreak);<br />
</div><br />
<br />
<b id="3-9">行の高さを設定する。</b><br />
<div class="itl_source">// 設定対象行番号<br />
int rowIndex = 3;<br />
// 高さ<br />
short height = 20;<br />
HSSFRow heightedRow = sheet.getRow(rowIndex);<br />
heightedRow.setHeight(height);<br />
<br />
// 行を非表示にする<br />
rowIndex = 5;<br />
HSSFRow hiddenedRow = sheet.getRow(rowIndex);<br />
hiddenedRow.setZeroHeight(true);<br />
</div><br />
<br />
<br />
<b id="3-10">列の幅を設定する。</b><br />
<div class="itl_source">// 設定対象列番号<br />
int column = 3;<br />
// 幅<br />
int width = 20;<br />
sheet.setColumnWidth(column, width);<br />
</div><br />
<br />
<b id="3-11">列のフォーマットを設定する。</b><br />
<div class="itl_source">// 設定対象セルを取得<br />
int row = 5;<br />
int column = 3;<br />
HSSFRow row = sheet.getRow(row);<br />
HSSFCell cell = sheet.getCell(column);<br />
// セルからスタイル情報の取得<br />
HSSFCellStyle cellStyle = cell.getCellStyle();<br />
<br />
// 行のスタイル情報の取得<br />
HSSFCellStyle rowStyle = row.getRowStyle();<br />
<br />
// 列のスタイル情報の取得<br />
HSSFCellStyle colStyle = sheet.getColumnStyle(column);<br />
<br />
/*<br />
 * 値、フォーマットを設定<br />
 * 設定方法は次回に記述します<br />
 */<br />
</div><br />
<br />
<b id="3-12">セルを結合する。</b><br />
<div class="itl_source">// 結合開始セル位置<br />
int fromRow = 0;<br />
int fromColumn = 1;<br />
// 結合終了セル位置<br />
int toRow = 3;<br />
int toColumn = 3;<br />
CellRangeAddress range = new CellRangeAddress(fromRow, toRow, fromColumn, toColumn);<br />
sheet.addMergedRegion(range);<br />
</div><br />
<br />
<b id="3-13">セルの結合を解除する。</b><br />
<div class="itl_source">// インデックスを指定して結合を解除<br />
int mergeIndex = 0;<br />
sheet.removeMergedRegion(mergeIndex);<br />
</div><br />
<br />
<b id="3-14">イメージを設定する。</b><br />
<div class="itl_source">// イメージファイルをbyte配列に読み込む<br />
String imageFilePath = "image/file/path";<br />
InputStream input = new FileInputStream(imageFilePath);<br />
ByteArrayOutputStream out = new ByteArrayOutputStream();<br />
byte[] bytes = new byte[1];<br />
while (input.read(bytes) != -1) {<br />
	out.write(bytes);<br />
}<br />
// ワークブックにイメージを追加し、追加したイメージのインデックスを取得<br />
int index = workbook.addPicture(out.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG);<br />
<br />
// シートに表示設定<br />
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();<br />
HSSFClientAnchor anchor = new HSSFClientAnchor(<br />
		1, <br />
		1, <br />
		5,<br />
		5, <br />
		(short) 1, <br />
		2,<br />
		(short) 3,<br />
		5);<br />
anchor.setAnchorType(HSSFClientAnchor.MOVE_AND_RESIZE);<br />
patriarch.createPicture(anchor, index);<br />
</div><br />
<br />
<b id="3-15">ハイパーリンクを設定する。</b><br />
<div class="itl_source">int rowNumber = 5;<br />
int colNumber = 3;<br />
<br />
// セルを作成し、リンクを設定<br />
HSSFRow row = sheet1.createRow(rowNumber);<br />
HSSFCell cell = row.createCell(colNumber);<br />
HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);<br />
link.setAddress("http://www.emxas.co.jp");<br />
link.setFirstColumn(rowNumber);<br />
link.setFirstRow(colNumber);<br />
cell.setHyperlink(link);<br />
</div><br />
<br />
残りの書き込み機能については次回以降に記述します。<br />
]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:283</id>
</entry><entry>
 <title type="html"><![CDATA[IE8におけるJavaScriptの挙動変更]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=275" />
 <author>
  <name>nob</name>
 </author>
 <updated>2009-10-18T15:00:00Z</updated>
 <published>2009-10-19T00:00:00+09:00</published>
 <content type="html"><![CDATA[InternetExploreｒ8（以下IE8）において、JavaScriptの挙動が以前のバージョンと変わっているものがあり、<br />
これによりIE8では、正常に動作しないページあります。<br />
<br />
ここでは幾つか挙動の変化したものについて紹介いたします。<br />
<br />
<br />
IE８では互換性をとるために、幾つかの動作モードが存在しています。<br />
ここではIE8における、IE8モードでの挙動について説明いたします。<br />
<br />
■getElementByIdメソッド<br />
<br />
　●NAME属性とID属性<br />
<br />
　既存のIEではgetElementByIdメソッドの対象となる属性は'NAME'または'ID'でしたが、<br />
　IE8からは'ID'のみ対象となりました。<br />
<br />
　　【サンプルコード】<div class="itl_source">&lt;head&gt;<br />
  &lt;title&gt;Example1&lt;/title&gt;<br />
  &lt;script&gt;<br />
    function GetAttr(){<br />
      var obj1 = document.getElementById("target_id");<br />
      var sHref1Attr = obj1.getAttribute("href");<br />
      var sOutput = ("target id : " + sHref1Attr);<br />
<br />
      var obj2 = document.getElementById("target_name");<br />
      if( obj2 != null ) {<br />
          var sHref2Attr = obj2.getAttribute("Href");<br />
          var sOutput = ( sOutput + "&lt;br/&gt;" + "target name : " + sHref2Attr );<br />
      } else {<br />
          var sOutput = ( sOutput + "&lt;br/&gt;" + "target name : null" );<br />
      }<br />
<br />
      document.getElementById("output").innerHTML = sOutput;<br />
    }<br />
  &lt;/script&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body onload="GetAttr()"&gt;<br />
   &lt;a class="emxas" id="target_id" name="target_name" href="http://www.emxas.co.jp/index.html"&gt;エムザス株式会社&lt;/a&gt;<br />
   &lt;div id="output"&gt;Output appears here.&lt;/div&gt;<br />
&lt;/body&gt;<br />
</div>　　【結果】<br />
　　　　『IE7』<br />
　　　　　　target id : http://www.emxas.co.jp/index.html<br />
　　　　　　target name : http://www.emxas.co.jp/index.html　　　← NAME属性も取得可能<br />
　　　　『IE8』<br />
　　　　　　target id : http://www.emxas.co.jp/index.html<br />
　　　　　　target name : null　　　　　　　　　　　　　　　　　　　　　　　← NAME属性は取得不可<br />
<br />
　●属性名の大文字小文字の区別<br />
<br />
　既存のIEではgetElementByIdメソッドで指定する属性名の大文字小文字を区別していませんでしたが、<br />
　IE8からは大文字小文字を区別するように変更されました。<br />
<br />
　　【サンプルコード】<div class="itl_source">&lt;head&gt;<br />
  &lt;title&gt;Example1&lt;/title&gt;<br />
  &lt;script&gt;<br />
    function GetAttr(){<br />
      var obj = document.getElementById("Target_ID");<br />
      if( obj != null ) {<br />
          var sHrefAttr = obj.getAttribute("href");<br />
          var sOutput = ( "target id : " + sHrefAttr );<br />
      } else {<br />
          var sOutput = ( "target id : null" );<br />
      }<br />
<br />
      document.getElementById("output").innerHTML = sOutput;<br />
    }<br />
  &lt;/script&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body onload="GetAttr()"&gt;<br />
   &lt;a class="emxas" id="target_id" name="target_name" href="http://www.emxas.co.jp/index.html"&gt;エムザス株式会社&lt;/a&gt;<br />
   &lt;div id="output"&gt;Output appears here.&lt;/div&gt;<br />
&lt;/body&gt;<br />
</div>　　【結果】<br />
　　　　『IE7』<br />
　　　　　　target id : http://www.emxas.co.jp/index.html　　　← 大文字小文字を区別しないため、取得できる<br />
　　　　『IE8』<br />
　　　　　　target id : null　　　　　　　　　　　　　　　　　　　　　　　← 大文字小文字を区別するため、該当無しとなる<br />
<br />
<br />
■getAttributeメソッド<br />
<br />
　●属性名の大文字小文字の区別<br />
<br />
　　既存のIEではgetAttributeメソッドで指定する属性名について、大文字小文字の区別有無を指定することができました。<br />
　　　　getAttribute("Href")　　　　　属性名の大文字小文字を区別しない（デフォルト）<br />
　　　　getAttribute("Href",0)　　　　属性名の大文字小文字を区別しない<br />
　　　　getAttribute("Href",1)　　　　属性名の大文字小文字を区別する<br />
<br />
　　IE8では、オプションの指定有無に係らず、大文字小文字を区別しないように変更されました。<br />
<br />
　　【サンプルコード】<div class="itl_source">&lt;head&gt;<br />
  &lt;title&gt;Example1&lt;/title&gt;<br />
  &lt;script&gt;<br />
    function GetAttr(){<br />
      var obj = document.getElementById("link");<br />
      var sHref1Attr = obj.getAttribute("Href");<br />
      var sHref2Attr = obj.getAttribute("Href",0);<br />
      var sHref3Attr = obj.getAttribute("Href",1);<br />
      var sOutput = ("getAttribute no option : " + sHref1Attr +<br />
                     &lt;br/&gt; + "getAttribute option 0 : " + sHref2Attr +<br />
                     &lt;br/&gt; + "getAttribute option 1 : " + sHref3Attr );<br />
      document.getElementById("output").innerHTML = sOutput;<br />
    }<br />
  &lt;/script&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body onload="GetAttr()"&gt;<br />
   &lt;a class="emxas" id="link" href="http://www.emxas.co.jp/index.html"&gt;エムザス株式会社&lt;/a&gt;<br />
   &lt;div id="output"&gt;Output appears here.&lt;/div&gt;<br />
&lt;/body&gt;<br />
</div>　　【結果】<br />
　　　　『IE7』<br />
　　　　　　getAttribute no option : http://www.emxas.co.jp/index.html<br />
　　　　　　getAttribute option 0 : http://www.emxas.co.jp/index.html<br />
　　　　　　getAttribute option 1 : null　　　　←　大文字小文字を区別するため、該当無しとなる<br />
　　　　『IE8』<br />
　　　　　　getAttribute no option : http://www.emxas.co.jp/index.html<br />
　　　　　　getAttribute option 0 : http://www.emxas.co.jp/index.html<br />
　　　　　　getAttribute option 1 : http://www.emxas.co.jp/index.html　　　　←　区別しないため、取得できる<br />
<br />
<br />
　●ＵＲＬの取得<br />
<br />
　　getAttribute("href")でURLを取得する場合、取得内容が変更されました。<br />
　　　　IE7：絶対URL<br />
　　　　IE8：相対URL<br />
<br />
　　【サンプルコード】<div class="itl_source">&lt;head&gt;<br />
  &lt;title&gt;Example1&lt;/title&gt;<br />
  &lt;base href="http://www.emxas.co.jp/"&gt;<br />
  &lt;script&gt;<br />
    function GetAttr(){<br />
      var obj = document.getElementById("link");<br />
      var sHrefAttr = obj.getAttribute("href");<br />
      var sOutput = ("href value: " + sHrefAttr);<br />
      document.getElementById("output").innerHTML = sOutput;<br />
    }<br />
  &lt;/script&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body onload="GetAttr()"&gt;<br />
   &lt;a class="emxas" id="link" href="index.html"&gt;エムザス株式会社&lt;/a&gt;<br />
   &lt;div id="output"&gt;Output appears here.&lt;/div&gt;<br />
&lt;/body&gt;<br />
</div>　　【結果】<br />
　　　　『IE7』<br />
　　　　　　href value: http://www.emxas.co.jp/index.html<br />
　　　　『IE8』<br />
　　　　　　href value: index.html<br />
<br />
　　　※IMGタグ等で用いられるsrc属性等も同様な扱いとなっています。<br />
<br />
<br />
■class属性の取り扱い<br />
<br />
　今までのIEではgetAttributeメソッド等でclass属性を扱う際、属性名を'className'としなければなりませんでした。<br />
　IE8では、属性値を'class'で扱えるように変更されました。<br />
　※既存の'className'では、対象の属性が存在しないため null となります。<br />
<br />
　　IE7:○　IE8:×　　getAttribute('className')<br />
　　IE7:×　IE8:○　　getAttribute('class')<br />
<br />
　【サンプルコード】<div class="itl_source">&lt;head&gt;<br />
  &lt;title&gt;Example1&lt;/title&gt;<br />
  &lt;base href="http://www.emxas.co.jp/"&gt;<br />
  &lt;script&gt;<br />
    function GetAttr(){<br />
      var obj = document.getElementById("link");<br />
      var sClass1Attr = obj.getAttribute("classname");<br />
      var sClass2Attr = obj.getAttribute("class");<br />
      var sOutput = ("className value: " + sClass1Attr +<br />
                     &lt;br /&gt; + "class value: " + sClass2Attr);<br />
      document.getElementById("output").innerHTML = sOutput;<br />
    }<br />
  &lt;/script&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body onload="GetAttr()"&gt;<br />
   &lt;a class="emxas" id="link" href="index.html"&gt;エムザス株式会社&lt;/a&gt;<br />
   &lt;div id="output"&gt;Output appears here.&lt;/div&gt;<br />
&lt;/body&gt;<br />
</div>　【結果】<br />
　　　『IE7』<br />
　　　　　className value: emxas<br />
　　　　　class value: null　　　　　　　　← 'class'では取得できない<br />
　　　『IE8』<br />
　　　　　className value: null　　　　← 'className'では取得できない<br />
　　　　　class value: emxas<br />
]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:275</id>
</entry><entry>
 <title type="html"><![CDATA[iPhoneアプリ開発（その１）]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=261" />
 <author>
  <name>rfrf</name>
 </author>
 <updated>2009-08-09T15:00:00Z</updated>
 <published>2009-08-10T00:00:00+09:00</published>
 <content type="html"><![CDATA[2009年7月14日、米国Appleが「<span style="color: rgb(51, 51, 153); ">App&nbsp;Store」</span>からのアプリダウンロード数が、15億本を突破したとの発表がありました。<span style="color: rgb(51, 51, 153); ">iPhone&nbsp;3GS</span>の発売もあって、色々な利用シーンに併せてアプリケーションをダウンロードして活用していくスタイルが定着しつつあるのではないでしょうか。アプリケーションを提供する側も、iPhone・iPod touchの利用者数が増えるに従い、日常生活の様々なシーンにおいて新たな生活スタイルを生み出すようなアプリケーションを打ち出し易い環境になってきと思います。また、全世界をターゲットとしたマーケットも開発者にとって非常に魅力的だと思います。<br /><br />
前回は、<a href="http://www.emxas.co.jp/itblog/category_36/item_230.html">iPhoneアプリ開発環境について</a>記載しました。<br /><br />
今回は、簡単なアプリケーション（HelloWorld）を使って、開発手順を追って説明していきます。<div>&nbsp;</div><div><b>（アプリケーション仕様）</b></div><div>・テキスト入力できる。</div><div>・ボタンを押すと「Hello　iPhone！」のメッセージダイアログを表示する。<br />
&nbsp;</div><div class="inBlogTitle1">プロジェクトの作成</div><div><br />
まず、Xcodeを起動して<span style="color: rgb(51,51,153)">［File］</span>&rarr;<span style="color: rgb(51,51,153)">［New Project］</span>から新規プロジェクトを作成します。</div><div>その際、アプリケーションのテンプレートを選択するウインドウが表示さます。</div><div>iPhoneアプリケーションのテンプレートには下記の種類があり、アプリケーションタイプによってベースとなるテンプレートを選択します。</div><div>&nbsp;</div><div><b>【iPhoneアプリケーションプロジェクトのテンプレート】</b></div><div>&nbsp;</div><div><span style="color: rgb(51,51,153)">◆Navigation-Based Application</span></div><div>複数の画面を使用して、階層的にデータを表示するアプリケーション。「連絡先(Contacts)」アプリケーションなど。</div><div>&nbsp;</div><div><span style="color: rgb(51,51,153)">◆OpenGL ES Application</span></div><div>画像やアニメーションを表示するために、OpenGL ESベースのビューを使用するアプリケーション。</div><div>&nbsp;</div><div><span style="color: rgb(51,51,153)">◆Tab Bar Application</span></div><div>ユーザが複数の画面から選択できるラジオインターフェイスを表示するアプリケーション。「時計(Clock)」アプリケーションなど。</div><div>&nbsp;</div><div><span style="color: rgb(51,51,153)">◆View-Based Application</span></div><div>1つのビューを使用してユーザインターフェイスを実装しているアプリケーション。</div><div>&nbsp;</div><div><span style="color: rgb(51,51,153)">◆Utility Application</span></div><div>メインビューを1つ実装しており、ユーザは裏面のビューにアクセスして簡単なカスタマイズができるアプリケーション。「株価(Stocks)」アプリケーションなど。<br />
&nbsp;</div><div><span style="color: rgb(51,51,153)">◆Window-Based Application</span></div><div>このテンプレートは、すべてのアプリケーションのスタート地点として役割を果たし、1つのアプリケーションデリゲート（delegate、委任）と1つのウインドウを含んでいます。独自の階層ビューを実装する場合に、このテンプレートを使用します。</div><div>&nbsp;</div><div>テンプレートでは、Mac OSXアプリケーションとiPhone OSアプリケーションのカテゴリが表示されるので、iPhoneアプリケーションのカテゴリの中からテンプレートが選択します。</div><div>今回は「<span style="color: rgb(51,51,153)">View-Based Application</span>」を選択し、プロジェクト名称に「<span style="color: rgb(51,51,153)">SampleAP</span>」と指定してプロジェクトを作成します。<br />
&nbsp;</div><img src="http://www.emxas.co.jp/media/3/20090809-newproject.png" width="550" height="468"  title="" alt="" /><br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-project_name.png" width="400" height="136"  title="" alt="" /><br /><br />
<div>プロジェクト名を指定すると、選択したテンプレートをベースとしたプロジェクトが作成され、下図のように画面の右ペインに、「SampleAP」で始まる生成されたコードのファイル一覧が表示されます。<br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-project_create.png" width="550" height="391"  title="" alt="" /><br />
&nbsp;</div><div class="inBlogTitle1">アクションメソッドの宣言定義</div><br />
<div>下記のように、画面からイベントが発生した時に、どのコントローラ（ターゲット）のメソッド（アクション）を呼び出すかの宣言を行います。今回は、ボタンクリックした時のイベントで呼び出されるActionメソッドの宣言を、<span style="color: rgb(51,51,153)">SampleAPViewController.h</span>　へコード追記します。<br />
&nbsp;<br />
<span style="color: rgb(51,51,153)">【SampleAPViewController.h】</span></div><br />
<div class="itl_source" style="height: 190px"><p>#import <uikit uikit.h=""></uikit><br /><br />
@interface SampleAPViewController : UIViewController {<br /><br />
}<br /><br />
//---　追記　buttonClicked: event---<br />
-(IBAction) buttonClicked:(id)sender;<br /><br />
@end</p></div><div><span style="color: rgb(51,51,153)">アクションメソッ</span>ドとリンクする場合は、戻り値に「<span style="color: rgb(51,51,153)">IBAction</span>」という型を指定します。</div><div>テキストボックス等をインスタンス変数として扱う場合は、<span style="color: rgb(51,51,153)">UIViewController</span> の中で「<span style="color: rgb(51,51,153)">IBOutlet</span>」を指定します。</div><div>このようなインスタンス変数宣言を<span style="color: rgb(51,51,153)">アウトレット</span>といいます。</div><div>このコード記述は、UI作成後でも構いません。<br />
&nbsp;</div><div class="inBlogTitle1">UIの作成<br />
&nbsp;</div><div>UIは、<span style="color: rgb(51,51,153)">InterfaceBuilder</span>を使ってビジュアル定義していきます。</div><div>ファイル<span style="color: rgb(51,51,153)">SampleAPViewController.xib</span>をダブルクリックして、InterfaceBuilderを起動します。<br />
&nbsp;</div><img src="http://www.emxas.co.jp/media/3/20090809-controller_xib.png" width="400" height="145"  title="" alt="" /><br /><br />
<br /><img src="http://www.emxas.co.jp/media/3/20090809-InterfaceBuilder.png" width="550" height="424"  title="" alt="" /><br /><br />
<div>まずは、空のUIが<span style="color: rgb(51,51,153)">Viewウィンドウ</span>に表示されています。<span style="color: rgb(51,51,153)">Libraryウィンドウ</span>にある各種UIコントロールをViewウィンドウにはドラックしながら配置していきます。</div><div>下記のように、各コントロールを配置設定します。設定後、コントロールのサイズや表示位置などを調整していきます。</div><div><br />
<div><b>Labelコントロール</b>（Text属性：SampleAP）</div><div><b>Text Fieldコントロール</b>（なし）</div><div><b>Round Rect Buttonコントロール</b>（Title属性：Click）</div><br />
<img src="http://www.emxas.co.jp/media/3/20090809-control_set.png" width="255" height="400"  title="" alt="" /></div><br />
併せて、iPhoneを横に傾けた場合の切替対応として、各コントロールの<span style="color: rgb(51,51,153)">View SizeのAutosizing属性</span>を横表示に合わせ変更しておきます。<br /><br />
<div>続いて、<span style="color: rgb(51,51,153)">SampleAPViewController.xib</span>というウインドウに、3つのオブジェクトアイコンが表示されているので、<span style="color: rgb(51,51,153)">UIコントロール</span>と<span style="color: rgb(51,51,153)">Controllerオブジェクト</span>を関連づけます。<br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-ViewController_xib.png" width="329" height="282"  title="" alt="" /><br /><br />
<div><span style="color: rgb(51,51,153)">File's Owner</span>は、xibファイルを読み込む時に、UIコントロールと関連するインスタンスを指定して関連付けるためのコンポーネントです。<span style="color: rgb(51,51,153)">First Responder</span>は、ユーザからアクションを受け取るためのコンポーネントです。<span style="color: rgb(51,51,153)">View</span>は、UIコントロールを表示するためのコンポーネントです。</div><div><br />
まず、<span style="color: rgb(51,51,153)">SampleAPViewController Identityウィンドウ</span>の<span style="color: rgb(51,51,153)">Class Actions</span>に（＋）ボタンでアクションを追加します。</div><div>ここでは、Actionメソッド宣言で指定した「buttonClicked：」を指定します。</div><div>その後、Controlキーを押しながら<span style="color: rgb(51,51,153)">Round Rect Buttonコントロール</span>を選択して<span style="color: rgb(51,51,153)">SampleAPViewController.xibウィンドウ</span>のFile's Ownerアイコンに</div><div>ドラッグし、ポップアップから「<span style="color: rgb(51,51,153)">buttonClicked：</span>」を選択します。これで、ボタンコントロールとアクションメソッド（buttonClicked：）が関連付きました。</div><br />
<img src="http://www.emxas.co.jp/media/3/20090809-inspector.png" width="291" height="385"  title="" alt="" /><br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-Outlet2Action.png" width="500" height="227"  title="" alt="" /><br /><br />
<span style="color: rgb(51,51,153)">File's Ownerアイコン</span>で右クリックすると、下図のように関連付けたアクションメソッドが表示されています。<br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-propaty.png" width="380" height="301"  title="" alt="" /><br /><br />
<br />&nbsp;</div><div class="inBlogTitle1">コード実装</div><br />
<div><span style="color: rgb(51,51,153)">Xcode</span>に戻り、<span style="color: rgb(51,51,153)">SampleAPViewController.m</span>　に、アクションメソッド（buttonClicked:）を追記します。</div><div>併せて、iPhoneを横に傾けた時に、画面を横に変更するための対応コードとして、<span style="color: rgb(51,51,153)">shouldAutorotateToInterfaceOrientation:</span>の戻り値を「YES」に変更します。</div><br />
<span style="color: rgb(51,51,153)">【SampleAPViewController.m】</span><div class="itl_source" style="height: 300px"><p>#import &quot;SampleAPViewController.h&quot;<br /><br />
@implementation SampleAPViewController<br /><br />
<br />// Override to allow orientations other than the default portrait orientation.<br />
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />
//---変更　Return YES---<br />
return YES;<br />
}<br /><br />
<br />- (void)didReceiveMemoryWarning {<br />
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview<br />
// Release anything that's not essential, such as cached data<br />
}<br /><br />
<br />- (void)dealloc {<br />
[super dealloc];<br />
}<br /><br />
//---追記　buttonClicked: event---<br />
-(IBAction) buttonClicked:(id)sender {<br />
  UIAlertView *alert = [[UIAlertView alloc] <br />
              initWithTitle:@"SampleAP" message:   <br />
              @"Hello iPhone!"  <br />
              delegate:self cancelButtonTitle:@"OK" <br />
              otherButtonTitles:nil, nil];<br />
  [alert show];<br />
  [alert release];<br />
}<br /><br />
@end<br />
&nbsp;</p></div><br /><br />
<br /><div class="inBlogTitle1">シミュレータでの実行確認</div><br />
Xcodeの「ビルド」&rarr;「実行」すると、iPhoneシミュレータが起動して、下図のようにアプリケーション画面が表示されます。<br /><br />
シミュレータ起動後、アプリケーションがロードされ画面が表示されます。<br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-kekka1.png" width="212" height="400"  title="" alt="" /><br /><br />
テキストフィールドにカーソルを合わせると、ソフトキーボードが表示され文字入力が行えます。<br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-kekka2.png" width="216" height="400"  title="" alt="" /><br /><br />
ボタンを押すと、「Hello　iPhone！」のメッセージダイアログを表示します。<br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-kekka3.png" width="213" height="400"  title="" alt="" /><br /><br />
コマンドキー　＋　&rarr;（右矢印）キーで画面が横向きに切り替わります。<br /><br />
<img src="http://www.emxas.co.jp/media/3/20090809-kekka4.png" width="400" height="209"  title="" alt="" /><br /><br />
次回は、別のサンプルアプリケーションで詳細に説明していきます。<br />
]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:261</id>
</entry><entry>
 <title type="html"><![CDATA[CSSフレームワークを解析する]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=259" />
 <author>
  <name>maeshaw</name>
 </author>
 <updated>2009-07-20T15:00:00Z</updated>
 <published>2009-07-21T00:00:00+09:00</published>
 <content type="html"><![CDATA[コリスさんのサイトで<a href="http://coliss.com/articles/build-websites/operation/css/css-framework-bluetrip.html" target="blank">複数のスタイルシートのフレームワークのいいとこ取りをした -BlueTrip</a> という紹介エントリがあったので、どんないいとこ取りなのか、中身を解析し、元になったCSSフレームワークと比較してみます。<br />
<br />
◆<a href="http://bluetrip.org/" target="blank">BlueTrip</a><br />
<br />
◆<a href="http://www.blueprintcss.org/" target="blank">BluePrint CSS</a><br />
<br />
◆<a href="http://devkick.com/lab/tripoli/" target="blank">TRIPOLY</a><br />
<br />
◆<a href="http://960.gs/" target="blank">960 Grid System</a><br />
<br />
◆<a href="http://code.google.com/p/hartija/" target="blank">hartija</a><br />
<br />
◆<a href="http://elements.projectdesigns.org/download.html" target="blank">Elements</a><br />
<br />
<div class="inBlogTitle1">CSSファイルの種類と構成</div><br />
BlueTripは複数のCSSフレームワークから良いところを取り入れて再構成したものとなっています。<br />
<br />
Blueprint、Tripoli (名前はここから)、Hartijaの印刷スタイル、960gsの簡潔さ、Elementsのアイコン、を併せた…(HPより)<br />
<br />
そこで、元となったCSSフレームワークとBlueTripを比べながら解析してみようと思います。それぞれのCSSファイル構成を見て行きましょう。<br />
<br />
◆Blueprintは3つの圧縮CSSファイルで動作します。<br />
<br />
<div class="itl_source"><br />
screen.css：メイン<br />
print.css：印刷用<br />
ie.css：IE専用<br />
</div><br />
<br />
圧縮前のファイルは6種類です。他にpluginsディレクトリにもCSSファイルがあります。<br />
<br />
<div class="itl_source"><br />
reset.css：ブラウザによるデフォルト設定をリセット<br />
grid.css：グリッド関連<br />
typography.css：文字表現関連<br />
forms.css：送信フォーム関連<br />
print.css：印刷用<br />
ie.css：IE専用<br />
</div><br />
<br />
blueprintディレクトリ直下には3つの圧縮ファイルとsrcディレクトリ、pluginsディレクトリが配置されています。圧縮はlibディレクトリのcompress.rbというツールで実施します。圧縮時に使用するソースCSSファイルなどの設定は、settings.ymlファイルに設定します。<br />
pluginsディレクトリに入っているファイルを見ると、プラグインの利用例は2通りあるようです。ひとつは、圧縮時に使用するソースCSSファイルとなっているもの、もうひとつは直接HTMLにlinkタグで記述するように指定しているものです。<br />
<br />
<br />
◆Tripoliはtripoliディレクトリ直下のCSSファイルで2通りの利用が可能です。<br />
1つは、シンプルなCSSをそのまま利用する方法です。<br />
<br />
<div class="itl_source"><br />
tripoli.simple.css：メイン<br />
tripoli.simple.ie.css：IE専用<br />
</div><br />
<br />
もう1つは、styles.css、styles.ie.cssの2つのインポートCSSを用いて、以下のCSSファイルを読み込む設定方法です。<br />
<br />
<div class="itl_source"><br />
tripoli.base.css：メイン<br />
plugin/tripoli.visual.css：デザイン表現関連<br />
plugins/tripoli.type.css：文字表現関連<br />
tripoli.base.ie.css：IE専用<br />
</div><br />
<br />
TRIPOLIはベースとなるCSSはtripoliディレクトリ直下に、付加的なCSSはpluginsディレクトリ下に配置しています。<br />
<br />
<br />
◆960gsはcss直下に3種類の圧縮ファイル、とシンプルです。uncompressedディレクトリにある圧縮前のファイルも同数です。imgディレクトリに12と16のグリッド用イメージがあります。<br />
<br />
<div class="itl_source"><br />
reset.css：ブラウザによるデフォルト設定をリセット<br />
text.css：文字表現関連<br />
960.css：メイン<br />
</div><br />
<br />
◆hartijaは印刷専門のため、print.cssのみの提供となっています。<br />
<br />
◆elementsは4つのCSSファイルです。圧縮はありません。images/elementsImagesに外部リンク用イメージファイルが収まっています。<br />
<br />
<div class="itl_source"><br />
global.css：メイン<br />
externalLinks.css：外部リンク表現関連<br />
lightbox.css：lightbox用(メイン画面の背景を暗くして写真などを同画面内に明るく表示する手法)<br />
reset.css：ブラウザによるデフォルト設定をリセット<br />
</div><br />
<br />
◆BlueTripはcss直下4つのCSSファイル構成となっています。<br />
<br />
<div class="itl_source"><br />
screen.css：メイン<br />
print.css：印刷用(hartijaをほぼ流用)<br />
ie.css：IE専用(Blueprintをベース)<br />
style.css：利用者が追加で設定するためのCSS(?)。何も設定されていません。<br />
</div><br />
<br />
CSSフレームワークでは、ディレクトリ体系やファイル名が結構重要な要素です。BlueTripではこの部分についてもいいとこ取りしているようです。<br />
CSSファイル名はBlueprintの圧縮ファイルの名称をベースにしています。何に関するCSS記述がされているファイルかが直感的に判るファイル名として、linkタグのmediaで指定する分類になっています。style.cssはtripoliのインポート用から取ったようです。ファイル名についてはCSSフレームワーク名を使用しているものと汎用的な名前をつけているものとがあります。<br />
CSSに圧縮を用いていません。圧縮しない方が修正しやすいし、CSS圧縮オンラインサービスもあるし、ということでしょうか。<br />
ディレクトリ構成はcssとimgの構成(960gs)でかなりシンプルです。imgディレクトリ直下にはグリッド用イメージ(960gs)が、下のiconsディレクトリには外部リンク用イメージファイル(elements)が収められています。ディレクトリ名称については略称のimgだったりフルスペルのiconsだったりするのは、いいとこ取りのご愛嬌(?)。<br />
<br />
◆CSSでの定義<br />
さて、肝心のCSSファイルの中身です。BkueprintとElementsの定義が中心のようです。クラスの事前設定は、コンテナとグリッド関連、テキスト修飾用の独自クラス、およびlightbox関連程度となっています。<br />
<br />
<div class="itl_source"><br />
・CSSリセット<br />
・基本的な文字修飾<br />
・blockquoteタグ修飾<br />
・送信フォーム<br />
・基本サイズ指定<br />
・list、TABLEタグの修飾<br />
・MARGINとPADDING<br />
・アンカータグの文字色<br />
・24カラムグリッド<br />
・イタリック文字、大文字アルファベット<br />
・外部リンク修飾、ファイルリンクのアイコン修飾<br />
・テキスト修飾用の独自クラス定義<br />
・独自ボタン<br />
・通常ボタン<br />
・lightbox<br />
</div><br />
<br />
◆結論として<br />
BlueTripの構造を解析することで、優秀なCSSフレームワークの中から自分が必要な部分をどのように考えて取り出し、再構成していけばよいかが判ってきたように思います。<br />
]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:259</id>
</entry><entry>
 <title type="html"><![CDATA[PHP ZendFramework 事始(4) - 命名規則]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=249" />
 <author>
  <name>hiroy</name>
 </author>
 <updated>2009-06-28T23:58:00Z</updated>
 <published>2009-06-29T08:58:00+09:00</published>
 <content type="html"><![CDATA[前回は、PHP ZendFramework 事始(3)ということで、ZendFrameworkを使用した多人数での開発の際に遵守すべき、標準のコーディング規約について見てきました。今回は命名規則について見ていきましょう。<div class="inBlogTitle1">ファイル名</div>・使用可能な文字は「英数字」「アンダースコア( _ )」のみ<br />
・拡張子は必ず「.php」<br />
・英単語で構成する<br />
・用途が分かりやすい名前をつける<br />
<div id="itl_tbl"><table><tr style="background-color:#cccccc;"><td style="background-color:#cccccc;">良い例</td><td style="background-color:#cccccc;">悪い例</td><td style="background-color:#cccccc;">理由</td></tr><tr><td>new_user.php</td><td>user_sakusei.php</td><td>日本語と英語が混在している</td></tr><tr><td>editItem.php</td><td>item-koshin.php</td><td>ハイフンや日本語を使用している</td></tr><tr><td>RegistColumn.php</td><td>regist1.php</td><td>用途が分かりづらい</td></tr></table></div><br />
<br />
<div class="inBlogTitle1">変数名</div>・使用可能な文字は「英数字」のみ<br />
・「アンダースコア( _ )」は使用不可(※クラスのメンバ変数の場合には先頭に必ず付与する)<br />
・「camelCase」形式<br />
・省略しすぎない($iや$nは小さいループなどでのみ使用する)<br />
<div class="itl_source">変数名の例<br />
$itemName<br />
$updateDate<br />
クラス内で<br />
private $_dbConnection</div><br />
<br />
<div class="inBlogTitle1">関数名</div>・使用可能な文字は「英数字」のみ<br />
・「アンダースコア( _ )」は使用不可<br />
・「camelCase」形式<br />
・機能が分かりやすい名前をつける<br />
・オブジェクトにアクセスする関数名は「get」「set」で始める<br />
<div class="itl_source">関数名の例<br />
createUser();<br />
updateItemName();<br />
オブジェクトにアクセスする<br />
private $_dbConnection;<br />
public function getDbConnection()<br />
{<br />
    return $this->_dbConnection;<br />
}<br />
<br />
public function setDbConnection($dbConnection)<br />
{<br />
    $this->_dbConnection = $dbConnection;<br />
}<br />
</div><br />
<br />
<div class="inBlogTitle1">定数名</div>・使用可能な文字は「英数字」「アンダースコア( _ )」のみ<br />
・すべて大文字<br />
・単語間に「アンダースコア( _ )」を入れる<br />
<div class="itl_source">定数名の例<br />
APP_FONT_SIZE<br />
DATE_DISPLAY_FORMAT<br />
</div><br />
<br />
<div class="inBlogTitle1">クラス名</div>・使用可能な文字は「英数字」のみ<br />
・「アンダースコア( _ )」は使用不可<br />
・大文字で始める<br />
・各単語の1文字目を大文字にする<br />
<div class="itl_source">クラス名の例<br />
public class ItemDataAccess<br />
{<br />
<br />
}<br />
</div><br />
<br />
最初はかなり窮屈に感じるかもしれませんが、多人数での関発を行う場合、特に他人の書いたソースを読む際に統一された命名規則にのっとっているだけで随分可読性が高まるのではないかと思います。<br />
]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:249</id>
</entry><entry>
 <title type="html"><![CDATA[Firefox拡張機能を作ってみる（５）]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=243" />
 <author>
  <name>hyhy</name>
 </author>
 <updated>2009-06-07T15:00:00Z</updated>
 <published>2009-06-08T00:00:00+09:00</published>
 <content type="html"><![CDATA[<a href="http://www.emxas.co.jp/itblog/item_221.html" target="_self">前回</a>に引き続き、FUELオブジェクトについて記述します。<br />
<br />
<div class="inBlogTitle1">FUELオブジェクトのプロパティとメソッド（その２）</div><br />
<ol>今回は、<ul><li>Bookmark</li><li>BookmarkFolder</li><li>BookmarkRoots</li><li>Extension</li><li>Extensions</li><li>SessionStorage</li><li>Preference</li><li>PreferenceBranch</li><li>Annotations</li><li>Console</li></ul>に関して記述します。</ol><ol><b><font size="+1">Bookmarkオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>id</td><td>ブックマークの id</td></tr><tr><td>title</td><td>ブックマークのタイトル</td></tr><tr><td>uri</td><td>ブックマークの URI</td></tr><tr><td>description</td><td>ブックマークの説明</td></tr><tr><td>keyword</td><td>ブックマークに関連付けられたキーワード</td></tr><tr><td>type</td><td>ブックマークの種類<br>値は "bookmark", "separator" のいずれか</td></tr><tr><td>parent</td><td>ブックマークの親フォルダ</td></tr><tr><td>annotations</td><td>ブックマークに対する注釈オブジェクト</td></tr><tr><td>events</td><td>ブックマークに対するイベントオブジェクト<br>"remove", "change", "visit", "move" をサポート</td></tr></table></div><br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>remove()</td><td>アイテムを親フォルダから削除する<br>ブックマークや区切りを削除するために使う</td><td>なし</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">BookmarkFolderオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>id</td><td>フォルダの id</td></tr><tr><td>title</td><td>フォルダのタイトル</td></tr><tr><td>description</td><td>フォルダの説明</td></tr><tr><td>type</td><td>フォルダの種類<br>値は "folder"</td></tr><tr><td>parent</td><td>フォルダの親フォルダ</td></tr><tr><td>annotations</td><td>フォルダに対する注釈オブジェクト</td></tr><tr><td>events</td><td>フォルダに対するイベントオブジェクト<br>"add", "addchild", "remove", "removechild", "change", "move" をサポート</td></tr><tr><td>children</td><td>このフォルダに含まれるすべてのブックマーク、区切り、フォルダの配列</td></tr></table></div><br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>addBookmark( ブックマークのタイトル, ブックマークの URI )</td><td>このフォルダへ新しい子のブックマークを追加する</td><td>Bookmark オブジェクト</td></tr><tr><td>addSeparator()</td><td>このフォルダへ新しい子の区切りを追加する</td><td>Bookmark オブジェクト</td></tr><tr><td>addFolder( フォルダのタイトル )</td><td>このフォルダへ新しい子のフォルダを追加する</td><td>BookmarkFolder オブジェクト</td></tr><tr><td>remove()</td><td>親フォルダからフォルダを削除する</td><td>なし</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">BookmarkRootsオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>menu</td><td>ブックマークメニューのルート</td></tr><tr><td>toolbar</td><td>パーソナルツールバーのルート</td></tr><tr><td>tags</td><td>タグのルート</td></tr><tr><td>unfiled</td><td>未整理のブックマークのルート</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">Extensionオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>id</td><td>拡張機能の id</td></tr><tr><td>name</td><td>拡張機能の名前</td></tr><tr><td>version</td><td>拡張機能のバージョン番号</td></tr><tr><td>firstRun</td><td>その拡張機能がインストール後の初回の起動であるかどうかを表す</td></tr><tr><td>prefs</td><td>拡張機能に対する設定オブジェクト<br>デフォルトでは "extensions.<extensionid>." ブランチ</td></tr><tr><td>storage</td><td>拡張機能の対するストレージオブジェクト</td></tr><tr><td>events</td><td>拡張機能に対するイベントオブジェクト<br>"uninstall" をサポート</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">Extensionsオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>all</td><td>アプリケーション内のすべての拡張機能を列挙した Extension の配列</td></tr></table></div><br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>has( 拡張機能の id )</td><td>指定した id の拡張機能が存在するかどうかを調べる</td><td>拡張機能が存在すれば true、さもなくば false</td></tr><tr><td>get( 拡張機能の id )</td><td>指定した id の拡張機能オブジェクトを取得する</td><td>拡張機能オブジェクト、あるいはもし指定した id の拡張機能が存在しない場合は null</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">SessionStorageオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>events</td><td>ストレージに対するイベントオブジェクト<br>"change" をサポート</td></tr></table></div><br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>has( アイテムの名前 )</td><td>指定した名前のストレージアイテムが存在するかどうかを調べる</td><td>指定した名前のアイテムが存在すれば true、さもなくば false</td></tr><tr><td>set( アイテムの名前, アイテムの値 )</td><td>指定した名前のストレージアイテムの値を変更する</td><td>なし</td></tr><tr><td>get( アイテムの名前, デフォルト値 )</td><td>指定した名前のストレージアイテムの値を取得する<br>そのアイテムが存在しなければ、デフォルト値を返す</td><td>指定した名前のアイテムの値<br>指定した名前のアイテムが存在しない場合、指定したデフォルト値</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">Preferenceオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>name</td><td>設定の名前</td></tr><tr><td>type</td><td>設定の型を表す文字列（String, Boolean, Number のいずれか）</td></tr><tr><td>value</td><td>設定の値を取得あるいは変更する</td></tr><tr><td>locked</td><td>設定のロック状態を取得する<br>真偽値をセットすることで設定をロックあるいはロック解除する</td></tr><tr><td>modified</td><td>設定がユーザによって変更されたかどうかを調べる</td></tr><tr><td>branch</td><td>この設定を含むブランチ</td></tr><tr><td>events</td><td>この設定に対するイベントオブジェクト<br>"change" をサポート</td></tr></table></div><br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>reset()</td><td>設定をデフォルトの値にリセットする</td><td>なし</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">PreferenceBranchオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>root</td><td>ブランチの名前</td></tr><tr><td>all</td><td>このブランチ内のすべての設定を列挙した fuelIPreference の配列</td></tr><tr><td>events</td><td>ブランチ内のすべての設定に対するイベントオブジェクト<br>"change" をサポート</td></tr></table></div><br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>has( 設定の名前 )</td><td>ある設定が存在するかどうかを調べる</td><td>その設定が存在する場合は true、存在しない場合は false</td></tr><tr><td>get( 設定の名前 )</td><td>ある設定を表すオブジェクトを取得する</td><td>設定オブジェクト、あるいはもし設定が存在しなければ null</td></tr><tr><td>getValue( 設定の名前, デフォルト値 )</td><td>ある設定の値を取得する<br>設定が存在しない場合はデフォルト値を返す</td><td>設定の値、あるいは設定が存在しない場合はデフォルト値</td></tr><tr><td>setValue( 設定の名前, 設定の値 )</td><td>設定の値を変更する</td><td>なし</td></tr><tr><td>reset()</td><td>ブランチ内のすべての設定をデフォルト値へリセットする</td><td>なし</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">Annotationsオブジェクト</font></b><br />
<br />
プロパティ<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">プロパティ</th><th width="70%">説明</th></tr><tr><td>names</td><td>この注釈オブジェクトを所有するブックマークアイテムに関連付けられたすべての注釈の名前の配列</td></tr></table></div><br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>has( 注釈の名前 )</td><td>指定した名前の注釈が存在するかどうかを調べる</td><td>指定した名前の注釈が存在すれば true、さもなくば false</td></tr><tr><td>get( 注釈の名前 )</td><td>指定した名前の注釈の値を取得する</td><td>注釈の値を含む変数<br>文字列、真偽値、数値をサポートする</td></tr><tr><td>set( 注釈の名前, 注釈の値（文字列、真偽値、数値をサポートする）, 注釈の有効期限ポリシー )</td><td>指定した名前の注釈へ値をセットする</td><td>なし</td></tr><tr><td>remove( 注釈の名前 )</td><td>この注釈オブジェクトを所有するブックマークアイテムから、指定した名前の注釈を削除する</td><td>なし</td></tr></table></div><br />
<br />
<br />
<b><font size="+1">Consoleオブジェクト</font></b><br />
<br />
メソッド<br />
<div class="inBlogTable"><table border="1"><tr><th width="30%">メソッド</th><th width="50%">説明</th><th width="20%">戻り値</th></tr><tr><td>log( エラーコンソールへ送る文字列 )</td><td>指定した文字列をエラーコンソールへ送る</td><td>なし</td></tr><tr><td>open()</td><td>エラーコンソールのウィンドウを開く<br>ウィンドウがすでに開かれている場合は前面に表示する</td><td>なし</td></tr></table></div><br />
<br />
現在公開されているFUELオブジェクトのご紹介は以上となります。<br />
これ以外にはファイル操作機能が欲しいところですね。<br />
<br />
今後も色々試した情報を公開していきます。</ol>]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:243</id>
</entry><entry>
 <title type="html"><![CDATA[EZアプリ(BREW)開発 その１]]></title>
 <link rel="alternate" type="text/html" href="http://www.emxas.co.jp/itblog/?itemid=236" />
 <author>
  <name>jup</name>
 </author>
 <updated>2009-04-26T15:00:00Z</updated>
 <published>2009-04-27T00:00:00+09:00</published>
 <content type="html"><![CDATA[EZアプリ(BREW)はKDDIのau携帯で動作する携帯アプリです。<br />
BREWというのはアメリカのQualcomm社が開発したモバイル端末の上でアプリケーションを実行するためのプラットホーム（Runtime Environment）で、KDDIのau携帯では、このBREWを採用しています。<br />
<br />
この記事では、Visual C++ を使った EZアプリ(BREW) の HelloWorld アプリ作成について記述します。<div class="inBlogTitle1">開発の流れ</div><br />
auの携帯アプリ「EZアプリ(BREW)」を開発する際は、以下のような手続きが必要です。<br />
<br />
　?KDDIに公式コンテンツプロバイダとして申請する。<br />
　?PC上で携帯アプリを開発する。<br />
　?携帯アプリを携帯端末で動作確認する。<br />
　?開発した携帯アプリをKDDIに審査してもらう。<br />
<br />
※?で開発したアプリケーションを実際の携帯端末で動かすためには、?の申請が完了してから入手できる情報が必要となります。<br />
<br />
ここでは、申請に関する詳細は割愛し、開発に関する箇所に焦点を当てています。<br />
<br />
<div class="inBlogTitle1">開発に必要なもの</div><br />
・<B>C/C++の開発環境</B><br />
EZアプリ(BREW)は、C/C++言語でコーディングを行うので、C/C++の開発環境が必要です。<br />
<br />
作成したアプリをPC上で動作確認する際に利用する『BREWシミュレータ』はDLLファイルをアプリケーションのモジュールとして読み込むので、開発環境としてMicrosoftのVisual C++を利用します。<br />
<br />
・<B>BREW SDK v3.1とBREW SDK Tools v1.0</B><br />
BREW SDK v3.1とBREW SDK Tools v1.0は「QUALCOMM|ディベロッパーリソース」<br />
<a href="https://brewx.qualcomm.com/brew/sdk/download.jsp?page=dx/ja/">https://brewx.qualcomm.com/brew/sdk/download.jsp?page=dx/ja/</a>からダウンロードします。<br />
<br />
IE でアクセスしてユーザ登録後、ログインしてネットワークインストールします。<br />
ブラウザが IE 以外だとインストーラが起動しないため、IE でアクセスする必要があります。<br />
<br />
BREW SDK には、BREW シミュレータや API リファレンスガイド、SDK ユーザドキュメント、サンプルアプリケーションガイド、サンプルアプリケーションのソースコードなどが含まれています。<br />
<br />
BREW SDK Tools には、MIF エディタや、リソースエディタ、圧縮画像作成ツールなどが含まれています。<br />
<br />
<div class="inBlogTitle1">HelloWorldの開発</div><br />
開発環境の構築から、ビルド、BREW シミュレータでの実行までの流れは、以下のようになります。<br />
<br />
<B>１．Microsoft Visual C++のインストール</B><br />
Visual C++ の最新版は Visual C++ 2008 ですが、BREW SDK に含まれているBREW用のアドインウィザードは VC++.NET 2003 と VC++6.0 のみの対応のため、C/C++ の開発環境として Visual C++ 2008 を利用する場合、BREW用のアドインウィザードなしで開発を行う必要があります。<br />
<br />
また無償版の Express Edition は現在 Visual C++ 2008 しか提供されてません。<br />
（Visual C++ 2005 Express Edition の提供は 2009年 3月 31日で終了となっています。）<br />
<a href="http://www.microsoft.com/japan/msdn/vstudio/Express/">http://www.microsoft.com/japan/msdn/vstudio/Express/</a><br />
<br />
ここでは、Visual C++ 2008 Express Edition を前提に記載しています。<br />
<br />
Visual C++ 2008 Express Edition は <a href="http://www.microsoft.com/japan/msdn/vstudio/express/">http://www.microsoft.com/japan/msdn/vstudio/express/</a> よりWebインストールします。<br />
<br />
<B>２．BREW SDK と BREW SDK Toolsのインストール</B><br />
「QUALCOMM|ディベロッパーリソース」<a href="https://brewx.qualcomm.com/brew/sdk/download.jsp?page=dx/ja/">https://brewx.qualcomm.com/brew/sdk/download.jsp?page=dx/ja/</a> より<br />
「BREW SDK v3.1.2 日本語版」と「BREW SDK Tools v1.0.1 日本語版」をネットワークインストールします。<br />
<br />
<B>３．MIFエディタでMIFファイルを作成</B><br />
Windows の[スタート]から[BREW SDK Tools 1.0.1 日本語版]-[BREW MIF エディタ]を起動します。<br />
[アプレット]タブの[新規アプレット]アイコンを押下してアプレットのClassIDとクラス名を入力します。<br />
<img src="http://www.emxas.co.jp/media/6/20090424-00.PNG" width="398" height="376" alt="" title="" /><br />
<br />
アプレット情報登録後、[ファイル]-[保存]でmfx形式で保存します。<br />
保存したmfx形式のファイルを[ビルド]-[MIFスクリプトのコンパイル]でコンパイルすることによりMIFファイルを生成します。<br />
<img src="http://www.emxas.co.jp/media/6/20090424-01.PNG" width="597" height="386" alt="" title="" /><br />
<br />
<B>４．Microsoft Visual C++の環境設定</B><br />
Windowsの[スタート]から[Microsoft Visual C++ 2008 Express Edition]を起動します。<br />
[ファイル]-[新規作成]-[プロジェクト]から新規プロジェクトを作成します。<br />
<br />
Visual C++ 2008 では、BREW用のアドインウィザードが利用できないため、いくつか環境設定の変更が必要となります。<br />
<br />
汎用的なアプリケーションを作成するための「Win32 プロジェクト」を選択し、アプリケーションの種類で「DLL」を選択します。<br />
<br />
BREW用のアドインウィザードでは、自動的に取り込まれるファイルを作成したプロジェクトの「ソースファイル」に追加するため「ソースファイル」のコンテキストメニューから[追加]-[既存の項目]を選択し、[BREW 3.1.2 Ja\sdk\src] のAEEAppGen.c と AEEModGen.c ファイルを追加します。<br />
<br />
また、BREW SDK のヘッダファイルのインクルードも手動で行う必要があるため、「プロジェクト」のコンテキストメニューから[プロパティ]を選択し、「構成プロパティ - C/C++ - 全般」の「追加のインクルードディレクトリ」に BREW SDK のインクルードディレクトリを入力します。<br />
<img src="http://www.emxas.co.jp/media/6/20090424-02.PNG" width="597" height="386" alt="" title="" /><br />
<br />
BREWシミュレータで実行する際に必要なプリプロセッサの定義（AEE_SIMULATOR）を「構成プロパティ - C/C++ - プリプロセッサ」の「プリプロセッサの定義」に追加します。<br />
<img src="http://www.emxas.co.jp/media/6/20090424-04.PNG" width="597" height="386" alt="" title="" /><br />
<br />
※プリプロセッサの定義（AEE_SIMULATOR）を指定しなかった場合、BREWシミュレータで実行時『Unknown Error』が発生するので注意が必要<br />
<br />
<B>５．Microsoft Visual C++でコーディング＆ビルド</B><br />
以下のコード(Qualcommのサンプルコード)を入力し、[ビルド]-[ソリューションのビルド]を実行します。<br />
<br />
<div class="itl_source" style="height:300px;"><br />
#include "AEEAppGen.h"        // Applet helper file<br />
#include "helloworld.bid"     // Applet-specific header that contains class ID<br />
#include "nmdef.h"<br />
<br />
static boolean HelloWorld_HandleEvent(AEEApplet * pme, AEEEvent eCode,uint16 wParam, uint32 dwParam);<br />
<br />
int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * pMod,void ** ppObj)<br />
{<br />
   *ppObj = NULL;<br />
   if(AEEApplet_New( sizeof(AEEApplet),                  // Size of our private class<br />
                     ClsId,                              // Our class ID<br />
                     pIShell,                            // Shell interface<br />
                     pMod,                               // Module instance<br />
                     (IApplet**)ppObj,                   // Return object<br />
                     (AEEHANDLER)HelloWorld_HandleEvent, // Our event handler<br />
                     NULL))                              // No special "cleanup" function<br />
      return(AEE_SUCCESS);<br />
	return (EFAILED);<br />
}<br />
<br />
static boolean HelloWorld_HandleEvent(AEEApplet * pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)<br />
{  <br />
   AECHAR szText[] = {'H','e','l','l','o',' ','W','o', 'r', 'l', 'd', '\0'};<br />
<br />
   switch (eCode){<br />
      case EVT_APP_START:                        <br />
         IDISPLAY_DrawText(pMe->m_pIDisplay,    // Display instance<br />
                           AEE_FONT_BOLD,       // Use BOLD font<br />
                           szText,              // Text - Normally comes from resource<br />
                           -1,                  // -1 = Use full string length<br />
                           0,                   // Ignored - IDF_ALIGN_CENTER<br />
                           0,                   // Ignored - IDF_ALIGN_MIDDLE<br />
                           NULL,                // No clipping<br />
                           IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);<br />
         IDISPLAY_Update (pMe->m_pIDisplay);<br />
         <br />
         return(TRUE);<br />
<br />
      case EVT_APP_STOP:<br />
         return(TRUE);<br />
<br />
<br />
      default:<br />
         break;<br />
   }<br />
   return(FALSE);<br />
}<br />
</div><br />
コンパイルに失敗する場合は、環境設定に問題がないか確認してください。<br />
<br />
正常に終了していれば、プロジェクトフォルダの Debugフォルダに helloworld.dll が生成されます。<br />
<br />
<B>６．BREWシミュレータで実行</B><br />
作成したアプリを BREWシミュレータで実行する際は、MIFファイルと DLLファイルを以下のフォルダ構成で格納します。<br />
helloworld.mif<br />
helloworld\helloworld.dll<br />
<br />
<img src="http://www.emxas.co.jp/media/6/20090424-03.PNG" width="201" height="360" alt="" title="" /><br />
]]></content>
 <id>http://www.emxas.co.jp/itblog/:2:236</id>
</entry>
</feed>
