<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7517129252814270767</id><updated>2011-12-01T10:23:58.764+09:00</updated><category term='ComputerLanguage'/><category term='MSSQL'/><category term='Vista'/><category term='jQuery'/><category term='Subversion'/><category term='Flash Lite'/><category term='AIR'/><category term='ActionScript'/><category term='Java JavaEE'/><category term='HID'/><category term='Perl'/><category term='Windows'/><category term='Java'/><category term='webgl'/><category term='MyBatis'/><category term='Google'/><category term='Groovy'/><category term='JavaFX'/><category term='C++'/><category term='MinGW'/><category term='Flash'/><category term='iPhone'/><category term='blogger'/><category term='JRuby'/><category term='opengl'/><category term='Chrome'/><category term='Ruby'/><category term='Linux'/><category term='Framework'/><category term='Mac'/><category term='Processing'/><category term='Software'/><category term='Device'/><category term='JavaScript'/><category term='Android'/><category term='Boost'/><category term='Guice'/><title type='text'>たくまけい</title><subtitle type='html'>Macはじめました。ついでにブログはじめてみました。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default?start-index=101&amp;max-results=100'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>198</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4958998752281805928</id><published>2011-12-01T01:17:00.000+09:00</published><updated>2011-12-01T01:17:58.998+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='MyBatis'/><title type='text'>データベース + MyBatis + Guice のサンプル</title><content type='html'>&lt;br /&gt;&lt;a href="http://www.mybatis.org/"&gt;MyBatis&lt;/a&gt;だけでも十分に素敵だけど、&lt;a href="http://www.mybatis.org/"&gt;Guice&lt;/a&gt;と組み合わせるともう最強って感じ。&lt;br /&gt;&lt;br /&gt;せっかくなのでMyBatis+Guiceの魅力をwebappではない、スタンドアローンのプログラムを書いて堪能してみる。&lt;br /&gt;&lt;br /&gt;mybatis: ver 3.0.6&lt;br /&gt;mybatis-guice: ver 3.2&lt;br /&gt;guice: ver 1.0&lt;br /&gt;&lt;br /&gt;[1] データベースにテーブルを作る&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mysql.com/"&gt;MySQL&lt;/a&gt;で。&lt;br /&gt;&lt;pre class="brush: sql" title="Friends.sql"&gt;&lt;br /&gt;CREATE TABLE `Friends` (&lt;br /&gt;  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `name` varchar(45) NOT NULL,&lt;br /&gt;  `memo` varchar(140),&lt;br /&gt;  PRIMARY KEY (`id`),&lt;br /&gt;  UNIQUE INDEX `name_index` (`name`)&lt;br /&gt;) ENGINE=InnoDB DEFAULT CHARSET=utf8&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[2] プロジェクトを作る&lt;br /&gt;&lt;br /&gt;&lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;で。&lt;br /&gt;(依存ライブラリを探してダウンロード＋解凍＋パス設定＋などなどを、手動でやってた頃が懐かしい。)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/mybatis/wiki/Guice"&gt;MyBatis-Guice&lt;/a&gt;は&lt;a href="http://www.mybatis.org/"&gt;MyBatis&lt;/a&gt;と&lt;a href="http://www.mybatis.org/"&gt;Guice&lt;/a&gt;をつなぐ架け橋。これがあるおかげで、ものすごく便利な組み合わせになってる。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mybatis.org/"&gt;MyBatis&lt;/a&gt;は主要なロギングフレームワークに対応しているので、logback-classicを入れてる。&lt;br /&gt;ロギングフレームワークは自動認識されるので、ライブラリをパスに追加するだけでログを吐くようになる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml" title="pom.xml"&gt;&lt;br /&gt;&amp;lt;project&lt;br /&gt;  xmlns="http://maven.apache.org/POM/4.0.0"&lt;br /&gt;  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&lt;br /&gt;&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;com.takumakei.study&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;mysql-mybatis-guice&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;name&amp;gt;mysql-mybatis-guice&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;url&amp;gt;http://takumakei.blogspot.com/&amp;lt;/url&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;project.build.sourceEncoding&amp;gt;utf-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;dependencies&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;1.6.4&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;3.0.6&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;mybatis-guice&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;3.2&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;com.google.code.guice&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;guice&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;5.1.18&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;4.10&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;source&amp;gt;6&amp;lt;/source&amp;gt;&lt;br /&gt;          &amp;lt;target&amp;gt;6&amp;lt;/target&amp;gt;&lt;br /&gt;          &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[3] レコードのモデルクラスを作る&lt;br /&gt;&lt;br /&gt;POJOで書いてるけれど、BeanでもOK。&lt;br /&gt;&lt;pre class="brush: java" title="src/main/java/com/takumakei/study/model/Friend.java"&gt;&lt;br /&gt;package com.takumakei.study.model;&lt;br /&gt;&lt;br /&gt;public class Friend {&lt;br /&gt; public int id;&lt;br /&gt; public String name;&lt;br /&gt; public String memo;&lt;br /&gt;&lt;br /&gt; public Friend() { // 引数なしのコンストラクタがないとエラーになる&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Friend(String name, String memo) {&lt;br /&gt;  this.name = name;&lt;br /&gt;  this.memo = memo;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public String toString() {&lt;br /&gt;  return String.format("%s[%d/%s/%s]", super.toString(), id, name, memo);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[4] マッパーインターフェースを作る&lt;br /&gt;&lt;br /&gt;このインターフェースを、MyBatis-Friends.xmlでmapperにマッピングする。&lt;br /&gt;&lt;pre class="brush: java" title="src/main/java/com/takumakei/study/mapper/FriendsMapper.java"&gt;&lt;br /&gt;package com.takumakei.study.mapper;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import org.apache.ibatis.annotations.MapKey;&lt;br /&gt;import org.apache.ibatis.annotations.Param;&lt;br /&gt;import org.apache.ibatis.session.RowBounds;&lt;br /&gt;&lt;br /&gt;import com.takumakei.study.model.Friend;&lt;br /&gt;&lt;br /&gt;public interface FriendsMapper {&lt;br /&gt; public void insert(Friend friend);&lt;br /&gt;&lt;br /&gt; // DELETEしたレコードの数を返す仕様みたい&lt;br /&gt; public int deleteById(int id);&lt;br /&gt;&lt;br /&gt; // UPDATEしたレコードの数を返す仕様みたい&lt;br /&gt; // 複数のパラメータを指定している。mybatis-friends.xmlでは#{0}とか#{1}で参照することになる&lt;br /&gt; // こういう指定方法も可能ではあるけれど、保守性低下するから使わない方が良さそう&lt;br /&gt; public int updateMemo(int id, String memo);&lt;br /&gt;&lt;br /&gt; public Friend findById(int id);&lt;br /&gt;&lt;br /&gt; // org.apache.ibatis.session.RowBoundsのパラメータの扱いは特殊。&lt;br /&gt; // mybatis-friends.xmlではこのパラメータを明示していないけれど&lt;br /&gt; // MyBatisは期待通りにコード数を制限してくれる。&lt;br /&gt; public List&amp;lt;Friend&amp;gt; list(RowBounds bounds);&lt;br /&gt;&lt;br /&gt; // Mapで取り出す例。&lt;br /&gt; // 複数のパラメータを指定する際に、それぞれのパラメータに名前を付けて参照できるようにする例でもある。&lt;br /&gt; // (ただし、offsetとlimitはRowBoundsを使うべきところ)&lt;br /&gt; @MapKey("id")&lt;br /&gt; public Map&amp;lt;Integer, Friend&amp;gt; map(@Param("offset") int offset, @Param("limit") int limit);&lt;br /&gt;&lt;br /&gt; public int count(); &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[5] データベース操作用のクラスを作る&lt;br /&gt;&lt;br /&gt;@Injectを指定して、friendsフィールドをGuiceに生成してもらう。&lt;br /&gt;&lt;br /&gt;無駄に@Transactionalを使っているが、トランザクションの扱いも非常に簡単。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java" title="src/main/java/com/takumakei/study/db/Friends.java"&gt;&lt;br /&gt;package com.takumakei.study.db;&lt;br /&gt;&lt;br /&gt;import java.sql.SQLIntegrityConstraintViolationException;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import org.apache.ibatis.exceptions.PersistenceException;&lt;br /&gt;import org.apache.ibatis.session.RowBounds;&lt;br /&gt;import org.mybatis.guice.transactional.Transactional;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;&lt;br /&gt;import com.google.inject.Inject;&lt;br /&gt;import com.takumakei.study.mapper.FriendsMapper;&lt;br /&gt;import com.takumakei.study.model.Friend;&lt;br /&gt;&lt;br /&gt;public class Friends {&lt;br /&gt; static final Logger logger = LoggerFactory.getLogger(Friends.class);&lt;br /&gt;&lt;br /&gt; // Guiceにインスタンスを生成してもらう&lt;br /&gt; @Inject&lt;br /&gt; protected FriendsMapper friends;&lt;br /&gt;&lt;br /&gt; // 無駄に@Transactionalを指定してみた。&lt;br /&gt; // org.mybatis.guiceのログレベルをDEBUGにすると、&lt;br /&gt; // insertの前後でTransaction開始/終了したようなログが出力される&lt;br /&gt; @Transactional&lt;br /&gt; public Friend insert(String name, String memo) {&lt;br /&gt;  Friend friend = new Friend(name, memo);&lt;br /&gt;  try {&lt;br /&gt;   // friendのidはAUTO_INCREMENT&lt;br /&gt;   // insertに成功するとfriendのidを更新して返してくれる&lt;br /&gt;   // mybatis-friends.xmlのuseGeneratedKeysとkeyPropertyのおかげかな？&lt;br /&gt;   logger.info("before:{}", friend);&lt;br /&gt;   friends.insert(friend);&lt;br /&gt;   logger.info(" after:{}", friend);&lt;br /&gt;   return friend;&lt;br /&gt;  } catch (PersistenceException e) {&lt;br /&gt;   Throwable cause = e.getCause();&lt;br /&gt;   if (cause instanceof SQLIntegrityConstraintViolationException) {&lt;br /&gt;    // 制約に違反してinsert失敗した時にはnullを返すようにしてみた。&lt;br /&gt;    // ここでわざわざ例外を握りつぶす必要性は全くない。例示のための実装。&lt;br /&gt;    logger.warn("INSERT FAILED:{}", cause.getMessage());&lt;br /&gt;    return null;&lt;br /&gt;   }&lt;br /&gt;   throw e;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public boolean deleteById(int id) {&lt;br /&gt;  return 1 == friends.deleteById(id);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public boolean updateMemo(int id, String memo) {&lt;br /&gt;  return 1 == friends.updateMemo(id, memo);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Friend findById(int id) {&lt;br /&gt;  return friends.findById(id);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public List&amp;lt;Friend&amp;gt; list(int offset, int limit) {&lt;br /&gt;  return friends.list(new RowBounds(offset, limit));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Map&amp;lt;Integer, Friend&amp;gt; map(int offset, int limit) {&lt;br /&gt;  return friends.map(offset, limit);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int count() {&lt;br /&gt;  return friends.count();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[6] SQLを書く&lt;br /&gt;&lt;pre class="brush: xml" title="src/main/resources/mybatis-friends.xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"&amp;gt;&lt;br /&gt;&amp;lt;mapper namespace="com.takumakei.study.mapper.FriendsMapper"&amp;gt;&lt;br /&gt;  &amp;lt;sql id="friend"&amp;gt;id, name, memo&amp;lt;/sql&amp;gt;&lt;br /&gt;  &amp;lt;sql id="#memo"&amp;gt;#{memo, javaType=String, jdbcType=VARCHAR}&amp;lt;/sql&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;insert id="insert" parameterType="Friend" useGeneratedKeys="true" keyProperty="id"&amp;gt;&lt;br /&gt;    INSERT INTO Friends (name, memo)&lt;br /&gt;    VALUES(#{name}, &amp;lt;include refid="#memo"/&amp;gt;);&lt;br /&gt;  &amp;lt;/insert&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;delete id="deleteById" parameterType="int"&amp;gt;&lt;br /&gt;    DELETE FROM Friends WHERE id = #{id}&lt;br /&gt;  &amp;lt;/delete&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;update id="updateMemo"&amp;gt;&lt;br /&gt;    UPDATE Friends&lt;br /&gt;    SET memo = #{1, javaType=string, jdbcType=VARCHAR}&lt;br /&gt;    WHERE id = #{0, javaType=int, jdbcType=INTEGER}&lt;br /&gt;  &amp;lt;/update&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;select id="findById" parameterType="int" resultType="Friend"&amp;gt;&lt;br /&gt;    SELECT &amp;lt;include refid="friend"/&amp;gt;&lt;br /&gt;    FROM Friends&lt;br /&gt;    WHERE id = #{id}&lt;br /&gt;  &amp;lt;/select&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;select id="list" resultType="Friend"&amp;gt;&lt;br /&gt;    SELECT &amp;lt;include refid="friend"/&amp;gt;&lt;br /&gt;    FROM Friends&lt;br /&gt;    ORDER BY id&lt;br /&gt;  &amp;lt;/select&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;select id="map" resultType="Map"&amp;gt;&lt;br /&gt;    SELECT &amp;lt;include refid="friend"/&amp;gt;&lt;br /&gt;    FROM Friends&lt;br /&gt;    ORDER BY id DESC&lt;br /&gt;    LIMIT #{offset}, #{limit}&lt;br /&gt;  &amp;lt;/select&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;select id="count" resultType="int"&amp;gt;&lt;br /&gt;    SELECT COUNT(*) FROM Friends&lt;br /&gt;  &amp;lt;/select&amp;gt;&lt;br /&gt;&amp;lt;/mapper&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[7] mybatisの設定ファイルを作る&lt;br /&gt;&lt;pre class="brush: xml" title="src/main/resources/mybatis-config.xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;property name="driver" value="com.mysql.jdbc.Driver" /&amp;gt;&lt;br /&gt;    &amp;lt;property name="url" value="jdbc:mysql://localhost:3306/test" /&amp;gt;&lt;br /&gt;    &amp;lt;property name="username" value="change*me" /&amp;gt;&lt;br /&gt;    &amp;lt;property name="password" value="change*me" /&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;  &amp;lt;typeAliases&amp;gt;&lt;br /&gt;    &amp;lt;typeAlias alias="Friend" type="com.takumakei.study.model.Friend" /&amp;gt;&lt;br /&gt;    &amp;lt;typeAlias alias="FriendsMapper" type="com.takumakei.study.mapper.FriendsMapper" /&amp;gt;&lt;br /&gt;  &amp;lt;/typeAliases&amp;gt;&lt;br /&gt;  &amp;lt;environments default="development"&amp;gt;&lt;br /&gt;    &amp;lt;environment id="development"&amp;gt;&lt;br /&gt;      &amp;lt;transactionManager type="JDBC" /&amp;gt;&lt;br /&gt;      &amp;lt;dataSource type="POOLED"&amp;gt;&lt;br /&gt;        &amp;lt;property name="driver" value="${driver}" /&amp;gt;&lt;br /&gt;        &amp;lt;property name="url" value="${url}" /&amp;gt;&lt;br /&gt;        &amp;lt;property name="username" value="${username}" /&amp;gt;&lt;br /&gt;        &amp;lt;property name="password" value="${password}" /&amp;gt;&lt;br /&gt;      &amp;lt;/dataSource&amp;gt;&lt;br /&gt;    &amp;lt;/environment&amp;gt;&lt;br /&gt;  &amp;lt;/environments&amp;gt;&lt;br /&gt;  &amp;lt;mappers&amp;gt;&lt;br /&gt;    &amp;lt;mapper resource="mybatis-friends.xml" /&amp;gt;&lt;br /&gt;  &amp;lt;/mappers&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[8] logbackの設定ファイルを作る&lt;br /&gt;&lt;br /&gt;設定ファイルは後で書いた方が、大量のDEBUGログを見れるので良いかもしれない。&lt;br /&gt;&lt;pre class="brush: xml" title="src/main/resources/logback.xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"&amp;gt;&lt;br /&gt;    &amp;lt;encoder&amp;gt;&lt;br /&gt;      &amp;lt;pattern&amp;gt;%d{HH:mm:ss.SSS} %-5level [%thread] %logger{136} - %msg%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;    &amp;lt;/encoder&amp;gt;&lt;br /&gt;  &amp;lt;/appender&amp;gt;&lt;br /&gt;  &amp;lt;logger name="org.apache.ibatis" level="INFO" /&amp;gt;&lt;br /&gt;  &amp;lt;logger name="org.mybatis.guice" level="INFO" /&amp;gt;&lt;br /&gt;  &amp;lt;logger name="java.sql.Connection" level="INFO" /&amp;gt;&lt;br /&gt;  &amp;lt;logger name="java.sql.Statement" level="INFO" /&amp;gt;&lt;br /&gt;  &amp;lt;logger name="java.sql.PreparedStatement" level="INFO" /&amp;gt;&lt;br /&gt;  &amp;lt;logger name="java.sql.ResultSet" level="INFO" /&amp;gt;&lt;br /&gt;  &amp;lt;root level="DEBUG"&amp;gt;&lt;br /&gt;    &amp;lt;appender-ref ref="stdout"/&amp;gt;&lt;br /&gt;  &amp;lt;/root&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[9] 動かす&lt;br /&gt;&lt;pre class="brush: java" title="src/main/com/takumakei/study/App.java"&gt;&lt;br /&gt;package com.takumakei.study;&lt;br /&gt;&lt;br /&gt;import java.sql.SQLRecoverableException;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import org.apache.ibatis.exceptions.PersistenceException;&lt;br /&gt;import org.mybatis.guice.XMLMyBatisModule;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;&lt;br /&gt;import com.google.inject.Guice;&lt;br /&gt;import com.google.inject.Injector;&lt;br /&gt;import com.takumakei.study.db.Friends;&lt;br /&gt;import com.takumakei.study.model.Friend;&lt;br /&gt;&lt;br /&gt;public class App {&lt;br /&gt; static final Logger logger = LoggerFactory.getLogger(App.class);&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  try {&lt;br /&gt;   logger.info("&amp;lt;start&amp;gt;");&lt;br /&gt;   run();&lt;br /&gt;  } catch (PersistenceException e) {&lt;br /&gt;   Throwable cause = e.getCause();&lt;br /&gt;   if (cause instanceof SQLRecoverableException)&lt;br /&gt;   logger.error("database dead? [{}] {}", cause.getClass().getSimpleName(), cause.getMessage());&lt;br /&gt;  } catch (Throwable t) {&lt;br /&gt;   logger.error("something bad", t);&lt;br /&gt;  } finally {&lt;br /&gt;   logger.info("&amp;lt;exit&amp;gt;");&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void run() throws Exception {&lt;br /&gt;  Injector injector = Guice.createInjector(new XMLMyBatisModule() {&lt;br /&gt;   @Override&lt;br /&gt;   protected void initialize() {&lt;br /&gt;    setEnvironmentId("development");&lt;br /&gt;    setClassPathResource("mybatis-config.xml");&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;  Friends db = injector.getInstance(Friends.class);&lt;br /&gt;  &lt;br /&gt;  logger.info("[list up]");&lt;br /&gt;  for (Friend friend : db.list(0, 3)) {&lt;br /&gt;   logger.info("select:{}", friend);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  logger.info("[insert]");&lt;br /&gt;  logger.info("insert:{}", db.insert("(1)TAKUMA KEI", "(1)hello world"));&lt;br /&gt;  logger.info("insert:{}", db.insert("(1)TAKUMA KEI", "(1)same name!!"));&lt;br /&gt;  logger.info("insert:{}", db.insert("(2)TAKUMA KEI", "(2)hello world"));&lt;br /&gt;  logger.info("insert:{}", db.insert("(3)TAKUMA KEI", "(3)hello world"));&lt;br /&gt;  logger.info("insert:{}", db.insert("(4)TAKUMA KEI", "(4)hello world"));&lt;br /&gt;&lt;br /&gt;  Friend insertedFriend = db.insert(new Date().toString(), null);&lt;br /&gt;  logger.info("insert:{}", insertedFriend);&lt;br /&gt;&lt;br /&gt;  logger.info("[count]");&lt;br /&gt;  logger.info("count:{}", db.count());&lt;br /&gt;&lt;br /&gt;  logger.info("[findById]");&lt;br /&gt;  logger.info("findById({}):{}", insertedFriend.id, db.findById(insertedFriend.id));&lt;br /&gt;  logger.info("findById(0):{}", db.findById(0));&lt;br /&gt;  &lt;br /&gt;  logger.info("[update]");&lt;br /&gt;  logger.info("update:{}", db.updateMemo(insertedFriend.id, "HELLO HELLO HELLO"));&lt;br /&gt;  logger.info("update:{}", db.updateMemo(1, new Date().toString()));&lt;br /&gt;&lt;br /&gt;  logger.info("findById({}):{}", insertedFriend.id, db.findById(insertedFriend.id));&lt;br /&gt;  &lt;br /&gt;  logger.info("[delete]");&lt;br /&gt;  logger.info("delete:{}", db.deleteById(insertedFriend.id));&lt;br /&gt;  &lt;br /&gt;  logger.info("[map]");&lt;br /&gt;  Map&amp;lt;Integer, Friend&amp;gt; map = db.map(0,  3);&lt;br /&gt;  for (Integer id : map.keySet()) {&lt;br /&gt;   logger.info("map:{} =&amp;gt; {}", id, map.get(id));&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4958998752281805928?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4958998752281805928/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/12/mybatis-guice.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4958998752281805928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4958998752281805928'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/12/mybatis-guice.html' title='データベース + MyBatis + Guice のサンプル'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2136106823974143419</id><published>2011-11-05T01:05:00.000+09:00</published><updated>2011-11-05T01:05:00.081+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>mavenでjavacのオプションを指定してみた</title><content type='html'>&lt;br /&gt;mavenのデフォルト設定では、アノテーションを使うとエラーになる。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;デフォルト設定が、javacのオプションが-source 1.4と-target 1.4になっているのが原因。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;pom.xmlで次のように-source 1.6と-target 1.6にすれば解決する。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: xml" title="pom.xml"&gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;          &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br /&gt;          &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;参考情報&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html"&gt;http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://download.oracle.com/javase/6/docs/technotes/tools/windows/javac.html#options"&gt;http://download.oracle.com/javase/6/docs/technotes/tools/windows/javac.html#options&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding: 3px; border: solid 3px #acf"&gt;&lt;div&gt;-source release&lt;/div&gt;&lt;div&gt;Specifies the version of source code accepted. The following values for release are allowed:&lt;/div&gt;&lt;div&gt;1.3&lt;/div&gt;&lt;div&gt;The compiler does not support assertions, generics, or other language features introduced after JDK 1.3.&lt;/div&gt;&lt;div&gt;1.4&lt;/div&gt;&lt;div&gt;The compiler accepts code containing assertions, which were introduced in JDK 1.4.&lt;/div&gt;&lt;div&gt;1.5&lt;/div&gt;&lt;div&gt;The compiler accepts code containing generics and other language features introduced in JDK 5.&lt;/div&gt;&lt;div&gt;5&lt;/div&gt;&lt;div&gt;Synonym for 1.5.&lt;/div&gt;&lt;div&gt;1.6&lt;/div&gt;&lt;div&gt;This is the default value. No language changes were introduced in Java SE 6. However, encoding errors in source files are now reported as errors, instead of warnings, as previously.&lt;/div&gt;&lt;div&gt;6&lt;/div&gt;&lt;div&gt;Synonym for 1.6.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding: 3px; border: solid 3px #acf"&gt;&lt;div&gt;-target version&lt;/div&gt;&lt;div&gt;Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6).&lt;/div&gt;&lt;div&gt;The default for -target depends on the value of -source:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If -source is not specified, the value of -target is 1.6&lt;/div&gt;&lt;div&gt;If -source is 1.2, the value of -target is 1.4&lt;/div&gt;&lt;div&gt;If -source is 1.3, the value of -target is 1.4&lt;/div&gt;&lt;div&gt;For all other values of -source, the value of -target is the value of -source.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2136106823974143419?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2136106823974143419/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/11/mavenjavac.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2136106823974143419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2136106823974143419'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/11/mavenjavac.html' title='mavenでjavacのオプションを指定してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7713702062552311192</id><published>2011-07-10T03:33:00.000+09:00</published><updated>2011-07-10T03:33:34.089+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>mavenで遊んでみた</title><content type='html'>&lt;div&gt;いままでちゃんと使ってこなかったことを後悔するくらいmavenって便利かも。&lt;br /&gt;&lt;br /&gt;mvnで依存関係解決すると、eclipseで-sources.jarとか-javadoc.jarもちゃんと解決してくれるのってすごく便利。&lt;br /&gt;&lt;br /&gt;mvn packageとかmvn deployしたら、-sources.jarと-javadoc.jarも一緒に更新してくれるようにできるのって便利。&lt;br /&gt;&lt;br /&gt;今日は、こんなpom.xmlを作って満足してるところ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;project&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;repositories&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;local.file.system&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;file:///c:/Users/Kei/Devel/Java/MavenRepos/&amp;lt;/url&amp;gt;&lt;br /&gt;      &amp;lt;snapshots&amp;gt;&lt;br /&gt;        &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;br /&gt;      &amp;lt;/snapshots&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;  &amp;lt;/repositories&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;distributionManagement&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;deploy-repository&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;deployRepository&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;file:///c:/Users/Kei/Devel/Java/MavenRepos/&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;  &amp;lt;/distributionManagement&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-source-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;excludeResources&amp;gt;true&amp;lt;/excludeResources&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;        &amp;lt;executions&amp;gt;&lt;br /&gt;          &amp;lt;execution&amp;gt;&lt;br /&gt;            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;              &amp;lt;goals&amp;gt;&lt;br /&gt;                &amp;lt;goal&amp;gt;jar&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;/goals&amp;gt;&lt;br /&gt;          &amp;lt;/execution&amp;gt;&lt;br /&gt;        &amp;lt;/executions&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-javadoc-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;author&amp;gt;true&amp;lt;/author&amp;gt;&lt;br /&gt;          &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;          &amp;lt;locale&amp;gt;en&amp;lt;/locale&amp;gt;&lt;br /&gt;          &amp;lt;!-- &amp;lt;locale&amp;gt;ja&amp;lt;/locale&amp;gt; --&amp;gt;&lt;br /&gt;          &amp;lt;showPackage&amp;gt;true&amp;lt;/showPackage&amp;gt;&lt;br /&gt;          &amp;lt;showPrivate&amp;gt;true&amp;lt;/showPrivate&amp;gt;&lt;br /&gt;          &amp;lt;encoding&amp;gt;utf-8&amp;lt;/encoding&amp;gt;&lt;br /&gt;          &amp;lt;charset&amp;gt;utf-8&amp;lt;/charset&amp;gt;&lt;br /&gt;          &amp;lt;decoding&amp;gt;utf-8&amp;lt;/decoding&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;        &amp;lt;executions&amp;gt;&lt;br /&gt;          &amp;lt;execution&amp;gt;&lt;br /&gt;            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;              &amp;lt;goals&amp;gt;&lt;br /&gt;                &amp;lt;goal&amp;gt;jar&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;/goals&amp;gt;&lt;br /&gt;          &amp;lt;/execution&amp;gt;&lt;br /&gt;        &amp;lt;/executions&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;androidのプロジェクトもmavenでビルドできたらいいのに。&lt;br /&gt;android library projectの参照解決がしっかりできなくちゃダメ。&lt;br /&gt;もしかして、それもできるのかな？知らないだけ？&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7713702062552311192?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7713702062552311192/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/07/maven.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7713702062552311192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7713702062552311192'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/07/maven.html' title='mavenで遊んでみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4871942773468068093</id><published>2011-05-19T10:25:00.000+09:00</published><updated>2011-05-19T10:25:08.909+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>AndroidのWebViewがhttpsでloadUrlすると真っ白になる件</title><content type='html'>Froyo以前のバージョンでは信頼できない証明書を受け入れるかどうかを選択する方法が提供されていないらしい。&lt;br /&gt;&lt;br /&gt;しかも、警告も何もなしに読み込みを停止しちゃうので真っ白になる。&lt;br /&gt;&lt;br /&gt;その解決方法がプライベートAPIを使ったものなのだけど、プライベートAPIの使い方が、「え？それでいいの？」って感じ。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://damianflannery.wordpress.com/2010/09/28/android-webview-with-https-loadurl-shows-blankempty-page/"&gt;Android WebView with https loadUrl shows blank/empty&amp;nbsp;page&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4871942773468068093?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4871942773468068093/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/05/androidwebviewhttpsloadurl.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4871942773468068093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4871942773468068093'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/05/androidwebviewhttpsloadurl.html' title='AndroidのWebViewがhttpsでloadUrlすると真っ白になる件'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4803008487732619167</id><published>2011-04-11T14:08:00.001+09:00</published><updated>2011-04-11T14:10:15.454+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Apache HttpClientでJSONをgzipしてPOSTする</title><content type='html'>&lt;script src="https://gist.github.com/913067.js?file=JSONEntity.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div&gt;サーバ側は&lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;の&lt;a href="http://www.sinatrarb.com/intro#Erb%20Templates"&gt;view (erb)&lt;/a&gt;で書いたらこんな感じ。&lt;/div&gt;&lt;pre class="brush: html" title="views/index_post.erb"&gt;&amp;lt;!doctype html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;post /&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;post /&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;Content-Type: &amp;lt;%= request.content_type%&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;Content-Encoding: &amp;lt;%= request.env[&amp;quot;HTTP_CONTENT_ENCODING&amp;quot;]%&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;textarea cols=&amp;quot;80&amp;quot; rows=&amp;quot;20&amp;quot; readonly&amp;gt;&amp;lt;%=&lt;br /&gt;  if &amp;quot;gzip&amp;quot; == request.env[&amp;quot;HTTP_CONTENT_ENCODING&amp;quot;]&lt;br /&gt;    begin&lt;br /&gt;      Zlib::Inflate.inflate(request.body.read)&lt;br /&gt;    rescue =&amp;gt; e&lt;br /&gt;      e.pretty_inspect&lt;br /&gt;    end&lt;br /&gt;  else&lt;br /&gt;    request.body.read&lt;br /&gt;  end&lt;br /&gt;%&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4803008487732619167?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4803008487732619167/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/04/apache-httpclientjsongzippost.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4803008487732619167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4803008487732619167'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/04/apache-httpclientjsongzippost.html' title='Apache HttpClientでJSONをgzipしてPOSTする'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3239911912657400595</id><published>2011-04-08T15:21:00.001+09:00</published><updated>2011-04-08T15:29:18.020+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>AndroidでSystem.outとSystem.errをLogに転送する</title><content type='html'>Androidでは、System.outとSystem.errがLogに転送されているけれど、&lt;br /&gt;任意のプライオリティと任意のタグでLogに転送するコードを作ってみた。&lt;br /&gt;&lt;br /&gt;ついでに、はじめて&lt;a href="https://gist.github.com/"&gt;Gist&lt;/a&gt;を使ってみた。&lt;br /&gt;&lt;br /&gt;Gistで保存するコードの先頭には、コピーライトとか書かない方がいいのかもなぁ。&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/909374.js?file=RutimeInit.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;おもいっきり&lt;a href="http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/com/android/internal/os/RuntimeInit.java&amp;q=System.setOut%20android&amp;sa=N&amp;cd=1&amp;ct=rc&amp;l=260"&gt;プライベートなAPI&lt;/a&gt;使ってるから良くない子に分類されるだろう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3239911912657400595?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3239911912657400595/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/04/androidsystemoutsystemerrlog.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3239911912657400595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3239911912657400595'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/04/androidsystemoutsystemerrlog.html' title='AndroidでSystem.outとSystem.errをLogに転送する'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5561198601686616797</id><published>2011-03-31T12:47:00.000+09:00</published><updated>2011-03-31T12:47:46.765+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>JavaでJSONしたい</title><content type='html'>JavaでJSONを扱うためのライブラリはたくさんあるなぁ&lt;br /&gt;&lt;br /&gt;どれを使ったらいいんだろう？&lt;br /&gt;&lt;br /&gt;ちょっと古い記事だけど、&lt;a href="http://www.rojotek.com/blog/2009/05/07/a-review-of-5-java-json-libraries/"&gt;A Review of 5 Java JSON Libraries&lt;/a&gt; が参考になりそう。&lt;br /&gt;&lt;br /&gt;この記事で取り上げているのは次の５つ。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.json.org/java/index.html"&gt;org.json&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jackson.codehaus.org/"&gt;Jackson&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://xstream.codehaus.org/"&gt;XStream&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/jsonmarshaller/"&gt;JsonMarshaller&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/json-simple/"&gt;JSON.simple&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a href="http://www.json.org/"&gt;www.json.org&lt;/a&gt;に18ものライブラリが掲載されていると書いてあるが、&lt;br /&gt;その中からどういう基準で５つを選んだのか気になるところ。&lt;br /&gt;&lt;br /&gt;それでも、これらの中のどれかを状況に合わせて選択すれば今を生きていくには十分だろう。&lt;br /&gt;&lt;br /&gt;「とりあえずJSON使っておく？」&lt;br /&gt;みたいな状況だったら &lt;a href="http://code.google.com/p/json-simple/"&gt;JSON.simple&lt;/a&gt; を使えば良さそう。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;と&lt;/span&gt;ころで、AndroidのSDKには&lt;a href="http://developer.android.com/reference/org/json/JSONObject.html"&gt;org.json.JSONObject&lt;/a&gt;などが用意されている。&lt;br /&gt;パッケージ名から類推して org.json のコードが使われているのかと思っていたら間違いだった。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://android.git.kernel.org/?p=platform/libcore.git;a=blob;f=json/src/main/java/org/json/JSONObject.java;h=56c91cf02fe3b88d68e712cd44cfac1ef7623450;hb=HEAD"&gt;[platform/libcore.git] / json / src / main / java / org / json / JSONObject.java&lt;/a&gt;&lt;br /&gt;ここのソースのコメントに、&lt;br /&gt;&lt;br /&gt;&lt;i&gt;// Note: this class was written without inspecting the non-free org.json sourcecode.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;と書いてある。&lt;br /&gt;オリジナルってことかな？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5561198601686616797?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5561198601686616797/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/03/javajson.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5561198601686616797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5561198601686616797'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/03/javajson.html' title='JavaでJSONしたい'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4223184696075741789</id><published>2011-03-01T18:18:00.002+09:00</published><updated>2011-03-01T18:18:39.587+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JavaでXPathを使ったことがあった</title><content type='html'>&lt;pre class="brush:xml title:'hello.xml'"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;hello&amp;gt;&lt;br /&gt;    &amp;lt;item&amp;gt;&lt;br /&gt;        &amp;lt;world attr=&amp;quot;value1&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/item&amp;gt;&lt;br /&gt;    &amp;lt;item&amp;gt;&lt;br /&gt;        &amp;lt;world attr=&amp;quot;value2&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/item&amp;gt;&lt;br /&gt;&amp;lt;/hello&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush:java"&gt;import java.io.File;&lt;br /&gt;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;import javax.xml.xpath.XPathConstants;&lt;br /&gt;import javax.xml.xpath.XPathExpression;&lt;br /&gt;import javax.xml.xpath.XPathFactory;&lt;br /&gt;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.dom.NamedNodeMap;&lt;br /&gt;import org.w3c.dom.Node;&lt;br /&gt;import org.w3c.dom.NodeList;&lt;br /&gt;&lt;br /&gt;public class XPathSample {&lt;br /&gt;    public static void main(String[] args) throws Exception {&lt;br /&gt;        XPathExpression xpath =&lt;br /&gt;            XPathFactory.newInstance()&lt;br /&gt;            .newXPath()&lt;br /&gt;            .compile(&amp;quot;//world[@attr='value2']&amp;quot;);&lt;br /&gt;&lt;br /&gt;        Document document =&lt;br /&gt;            DocumentBuilderFactory.newInstance()&lt;br /&gt;            .newDocumentBuilder()&lt;br /&gt;            .parse(new File(&amp;quot;hello.xml&amp;quot;));&lt;br /&gt;&lt;br /&gt;        NodeList nodeList = (NodeList) xpath.evaluate(document, XPathConstants.NODESET);&lt;br /&gt;        for (int i = 0; i &amp;lt; nodeList.getLength(); ++i) {&lt;br /&gt;            Node node = nodeList.item(i);&lt;br /&gt;            NamedNodeMap attributes = node.getAttributes();&lt;br /&gt;            String value = attributes.getNamedItem(&amp;quot;attr&amp;quot;).getNodeValue();&lt;br /&gt;            System.out.println(value);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4223184696075741789?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4223184696075741789/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/03/javaxpath.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4223184696075741789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4223184696075741789'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/03/javaxpath.html' title='JavaでXPathを使ったことがあった'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-405161877753442655</id><published>2011-02-28T20:03:00.000+09:00</published><updated>2011-02-28T20:03:29.498+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>ついでにAESで暗号化・復号化するサンプルコード書いてみた</title><content type='html'>&lt;pre class="brush:java"&gt;import java.security.InvalidAlgorithmParameterException;&lt;br /&gt;import java.security.InvalidKeyException;&lt;br /&gt;import java.security.NoSuchAlgorithmException;&lt;br /&gt;import java.security.SecureRandom;&lt;br /&gt;&lt;br /&gt;import javax.crypto.BadPaddingException;&lt;br /&gt;import javax.crypto.Cipher;&lt;br /&gt;import javax.crypto.IllegalBlockSizeException;&lt;br /&gt;import javax.crypto.KeyGenerator;&lt;br /&gt;import javax.crypto.NoSuchPaddingException;&lt;br /&gt;import javax.crypto.SecretKey;&lt;br /&gt;import javax.crypto.spec.IvParameterSpec;&lt;br /&gt;import javax.crypto.spec.SecretKeySpec;&lt;br /&gt;&lt;br /&gt;public class Sample {&lt;br /&gt;    public static class EncryptedData {&lt;br /&gt;        public byte[] iv;&lt;br /&gt;        public byte[] data;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) throws Exception {&lt;br /&gt;        // 鍵を生成する。&lt;br /&gt;        // この鍵を保存して暗号文を交換する２者間で安全に共有する。&lt;br /&gt;        final byte[] key = generateKey();&lt;br /&gt;        print(&amp;quot;[Key]&amp;quot;, key);&lt;br /&gt;&lt;br /&gt;        // 暗号化対象の平文&lt;br /&gt;        final byte[] input = &amp;quot;hello world&amp;quot;.getBytes();&lt;br /&gt;        print(&amp;quot;[Input]&amp;quot;, input);&lt;br /&gt;&lt;br /&gt;        // 鍵で平文を暗号化する。&lt;br /&gt;        // 復号化するためには、「鍵」と「IV(initial vector)」と「暗号文」が必要。&lt;br /&gt;        // 「鍵」は事前に安全に共有されていると仮定して、ここでは「IV」と「暗号文」を求める。&lt;br /&gt;        final EncryptedData encrypted = encrypt(key, input);&lt;br /&gt;&lt;br /&gt;        // 試しに暗号化したデータを表示してみる。&lt;br /&gt;        print(&amp;quot;[IV]&amp;quot;, encrypted.iv);&lt;br /&gt;        print(&amp;quot;[Encrypted]&amp;quot;, encrypted.data);&lt;br /&gt;&lt;br /&gt;        // 「鍵」と「IV」と「暗号文」を渡して復号化する。 &lt;br /&gt;        final byte[] decrypted = decrypt(key, encrypted.iv, encrypted.data);&lt;br /&gt;&lt;br /&gt;        // 試しに復号化したデータを表示してみる。&lt;br /&gt;        print(&amp;quot;[Decrypted]&amp;quot;, decrypted);&lt;br /&gt;&lt;br /&gt;        // さらに、同じ鍵で同じ平文を暗号化・復号化してみる。&lt;br /&gt;        final EncryptedData encrypted2 = encrypt(key, input);&lt;br /&gt;        print(&amp;quot;[IV(2)]&amp;quot;, encrypted2.iv);&lt;br /&gt;        print(&amp;quot;[Encrypted(2)]&amp;quot;, encrypted2.data);&lt;br /&gt;        final byte[] decrypted2 = decrypt(key, encrypted.iv, encrypted.data);&lt;br /&gt;        print(&amp;quot;[Decrypted(2)]&amp;quot;, decrypted2);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static byte[] generateKey()&lt;br /&gt;            throws NoSuchAlgorithmException&lt;br /&gt;    {&lt;br /&gt;        final SecureRandom random = SecureRandom.getInstance(&amp;quot;SHA1PRNG&amp;quot;);&lt;br /&gt;        //random.setSeed(getRandomSeedBytes()); // ここで本物の乱数で初期化する&lt;br /&gt;        final KeyGenerator keyGen = KeyGenerator.getInstance(&amp;quot;AES&amp;quot;);&lt;br /&gt;        keyGen.init(256, random);&lt;br /&gt;        return keyGen.generateKey().getEncoded();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static EncryptedData encrypt(byte[] key, byte[] input)&lt;br /&gt;            throws&lt;br /&gt;                NoSuchAlgorithmException,&lt;br /&gt;                NoSuchPaddingException,&lt;br /&gt;                InvalidKeyException,&lt;br /&gt;                IllegalBlockSizeException,&lt;br /&gt;                BadPaddingException&lt;br /&gt;    {&lt;br /&gt;        final SecureRandom random = SecureRandom.getInstance(&amp;quot;SHA1PRNG&amp;quot;);&lt;br /&gt;        //random.setSeed(getRandomSeedBytes()); // ここで本物の乱数で初期化する&lt;br /&gt;        final SecretKey secretKey = new SecretKeySpec(key, &amp;quot;AES&amp;quot;);&lt;br /&gt;        final Cipher cipher = Cipher.getInstance(&amp;quot;AES/CBC/PKCS5Padding&amp;quot;);&lt;br /&gt;        cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);&lt;br /&gt;        final EncryptedData result = new EncryptedData();&lt;br /&gt;        result.iv = cipher.getIV();&lt;br /&gt;        result.data = cipher.doFinal(input);&lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static byte[] decrypt(byte[] key, byte[] iv, byte[] input)&lt;br /&gt;            throws&lt;br /&gt;                NoSuchAlgorithmException,&lt;br /&gt;                NoSuchPaddingException,&lt;br /&gt;                InvalidKeyException,&lt;br /&gt;                InvalidAlgorithmParameterException,&lt;br /&gt;                IllegalBlockSizeException,&lt;br /&gt;                BadPaddingException&lt;br /&gt;    {&lt;br /&gt;        final SecretKey secretKey = new SecretKeySpec(key, &amp;quot;AES&amp;quot;);&lt;br /&gt;        final Cipher cipher = Cipher.getInstance(&amp;quot;AES/CBC/PKCS5Padding&amp;quot;);&lt;br /&gt;        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));&lt;br /&gt;        return cipher.doFinal(input);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void print(String tag, byte[] bs) {&lt;br /&gt;        System.out.print(tag);&lt;br /&gt;        for (int i = 0; i &amp;lt; bs.length; ++i) {&lt;br /&gt;            if (i % 16 == 0) {&lt;br /&gt;                System.out.println();&lt;br /&gt;            }&lt;br /&gt;            System.out.print(String.format(&amp;quot; %02X&amp;quot;, bs[i]));&lt;br /&gt;        }&lt;br /&gt;        System.out.println();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-405161877753442655?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/405161877753442655/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/02/aes.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/405161877753442655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/405161877753442655'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/02/aes.html' title='ついでにAESで暗号化・復号化するサンプルコード書いてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7846965685310078179</id><published>2011-02-28T19:07:00.000+09:00</published><updated>2011-02-28T19:07:55.633+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>AndroidでRSAを使ってみた</title><content type='html'>RSAでの暗号化と復号化のシンプルなサンプルコードを書いてみた。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;    public static byte[] encrypt(byte[] data)&lt;br /&gt;            throws&lt;br /&gt;                InvalidKeySpecException,&lt;br /&gt;                NoSuchAlgorithmException,&lt;br /&gt;                NoSuchPaddingException,&lt;br /&gt;                InvalidKeyException,&lt;br /&gt;                IllegalBlockSizeException,&lt;br /&gt;                BadPaddingException&lt;br /&gt;    {&lt;br /&gt;        final Key publicKey =&lt;br /&gt;            KeyFactory&lt;br /&gt;            .getInstance(&amp;quot;RSA&amp;quot;)&lt;br /&gt;            .generatePublic(new X509EncodedKeySpec(PUBLIC_KEY_BYTES));&lt;br /&gt;        final Cipher cipher = Cipher.getInstance(&amp;quot;RSA/ECB/PKCS1Padding&amp;quot;);&lt;br /&gt;        cipher.init(Cipher.ENCRYPT_MODE, publicKey);&lt;br /&gt;        return cipher.doFinal(data);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush:java"&gt;    public static byte[] decrypt(byte[] data)&lt;br /&gt;            throws&lt;br /&gt;                InvalidKeySpecException,&lt;br /&gt;                NoSuchAlgorithmException,&lt;br /&gt;                NoSuchPaddingException,&lt;br /&gt;                InvalidKeyException,&lt;br /&gt;                IllegalBlockSizeException,&lt;br /&gt;                BadPaddingException&lt;br /&gt;    {&lt;br /&gt;        final Key privateKey =&lt;br /&gt;            KeyFactory&lt;br /&gt;            .getInstance(&amp;quot;RSA&amp;quot;)&lt;br /&gt;            .generatePrivate(new PKCS8EncodedKeySpec(PRIVATE_KEY_BYTES));&lt;br /&gt;        final Cipher cipher = Cipher.getInstance(&amp;quot;RSA/ECB/PKCS1Padding&amp;quot;);&lt;br /&gt;        cipher.init(Cipher.DECRYPT_MODE, privateKey);&lt;br /&gt;        return cipher.doFinal(data);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ポイントは、Cipherのインスタンスを取得するときに、&lt;br /&gt;フィードバックモードとパディングをちゃんと指定すること。&lt;br /&gt;&lt;br /&gt;Cipher.getInstance("RSA") // これは悪い例！&lt;br /&gt;&lt;br /&gt;同じJavaVM環境なら、こうやって書いても期待通りに動いてしまう。&lt;br /&gt;&lt;br /&gt;フィードバックモードおよびパディングを省略すると、&lt;br /&gt;プロバイダ固有のデフォルト値が使われると&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/api/index.html"&gt;書いてある&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;同じJavaVM環境ならプロバイダーが同じだからデフォルト値も同じなので問題がないというわけ。&lt;br /&gt;&lt;br /&gt;ところが、&lt;br /&gt;Sun(Oracle)のJREやJDKにバンドルされているJCEプロバイダのデフォルトは&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/SunProviders.html#SunJCEProvider"&gt;SunJCE&lt;/a&gt;で、&lt;br /&gt;Androidの場合は&lt;a href="http://www.bouncycastle.org/"&gt;BouncyCastle&lt;/a&gt;のようだ。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/SunProviders.html#SunJCEProvider"&gt;SunJCE&lt;/a&gt;の場合&lt;br /&gt;"RSA"は"RSA/ECB/PKCS1Padding"&lt;br /&gt;がデフォルトみたい。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bouncycastle.org/"&gt;BouncyCastle&lt;/a&gt;の場合は&lt;br /&gt;"RSA"は"RSA/None/NoPadding"&lt;br /&gt;がデフォルトみたい。&lt;br /&gt;&lt;br /&gt;これらはたまたま手元の環境で動かしたらそうなっただけで、&lt;br /&gt;デフォルト値が未来永劫変わらない保証はない。&lt;br /&gt;&lt;br /&gt;というわけで、フィードバックモードとパディングを省略すると&lt;br /&gt;サーバとAndroid端末の間で渡したデータを復号化できなくなると思った方がよい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7846965685310078179?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7846965685310078179/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/02/androidrsa.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7846965685310078179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7846965685310078179'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/02/androidrsa.html' title='AndroidでRSAを使ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2386229896430641770</id><published>2011-02-02T18:19:00.000+09:00</published><updated>2011-02-02T18:19:02.193+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>ChromeでDesktop Notificationしてみた</title><content type='html'>&lt;div&gt;Chromeのみ。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GmailがChrome Extensionなしで新着通知してくれるようになったのでやってみた。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;許可を得ないと機能しない。&lt;br /&gt;&lt;li&gt;許可を得るためにはユーザのアクションが必要。（自動的に許可を求めることはできない）&lt;br /&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;ということで、初めてボタンをクリックした時は許可を与えてやるべし。&lt;/div&gt;&lt;div&gt;それから、もう一回ボタンをクリックするべし。&lt;/div&gt;&lt;input id="showNotification" type="button" value="show notification" onclick="showNotification()"&gt;&lt;script&gt;if (!window.webkitNotifications) {  document.getElementById('showNotification').disabled = "disabled";}function showNotification() {  if (window.webkitNotifications.checkPermission() == 0) {    var icon = 'http://2.bp.blogspot.com/_-552tFB6UQU/S6zfGefaPdI/AAAAAAAAARo/Yg6h_8NobXY/20100326003_samsung_galaxy_s.jpg';    var title = 'Chrome Notification Sample';    var message = 'This works only with Google Chrome Web Browser.';    var n = window.webkitNotifications.createNotification(icon, title, message);    n.ondisplay = function() {      setTimeout(function() { n.cancel(); }, 5000);    };    n.show();  } else {    window.webkitNotifications.requestPermission();  }}&lt;/script&gt;&lt;pre class="brush: js"&gt;&amp;lt;input id=&amp;quot;showNotification&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;show notification&amp;quot; onclick=&amp;quot;showNotification()&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;if (!window.webkitNotifications) {&lt;br /&gt;  document.getElementById('showNotification').disabled = &amp;quot;disabled&amp;quot;;&lt;br /&gt;}&lt;br /&gt;function showNotification() {&lt;br /&gt;  if (window.webkitNotifications.checkPermission() == 0) {&lt;br /&gt;    var icon = 'http://2.bp.blogspot.com/_-552tFB6UQU/S6zfGefaPdI/AAAAAAAAARo/Yg6h_8NobXY/20100326003_samsung_galaxy_s.jpg';&lt;br /&gt;    var title = 'Chrome Notification Sample';&lt;br /&gt;    var message = 'This works only with Google Chrome Web Browser.';&lt;br /&gt;    var n = window.webkitNotifications.createNotification(icon, title, message);&lt;br /&gt;    n.ondisplay = function() {&lt;br /&gt;      setTimeout(function() { n.cancel(); }, 5000);&lt;br /&gt;    };&lt;br /&gt;    n.show();&lt;br /&gt;  } else {&lt;br /&gt;    window.webkitNotifications.requestPermission();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2386229896430641770?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2386229896430641770/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/02/chromedesktop-notification.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2386229896430641770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2386229896430641770'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/02/chromedesktop-notification.html' title='ChromeでDesktop Notificationしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3451773958061891316</id><published>2011-01-26T11:34:00.004+09:00</published><updated>2011-02-02T18:47:21.339+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android Screenshots, Screen Capture, Screen Cast</title><content type='html'>これは便利だ。&lt;br /&gt;&lt;br /&gt;USB接続したAndroidの画面をどんどんキャプチャ―してPNGに保存してくれる。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mightypocket.com/2010/08/android-screenshots-screen-capture-screen-cast/"&gt;Android Screenshots, Screen Capture, Screen Cast&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="390" src="http://www.youtube.com/embed/c50kXaaHhac" title="YouTube video player" type="text/html" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;AndroidScreenCapture-1.1.zipをダウンロードして実行。&lt;br /&gt;&lt;br /&gt;android-sdk_r08-windows.zipでは動かない。&lt;br /&gt;android-sdk_r07-windows.zipを使ったら動いた！&lt;br /&gt;sdkのディレクトリ構造が変わったのが原因だろうな。&lt;br /&gt;&lt;br /&gt;ダウンロードは&lt;a href="http://sourceforge.net/projects/ashot/"&gt;sourceforge&lt;/a&gt;から。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3451773958061891316?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3451773958061891316/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/01/android-screenshots-screen-capture.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3451773958061891316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3451773958061891316'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/01/android-screenshots-screen-capture.html' title='Android Screenshots, Screen Capture, Screen Cast'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/c50kXaaHhac/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4101830137963614549</id><published>2011-01-13T14:35:00.000+09:00</published><updated>2011-01-13T14:35:59.105+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Google APIsとGALAXY Tabのエミュレータ</title><content type='html'>&lt;div&gt;android-sdkでSamsung GALAXY Tabのエミュレータを簡単に作成できる。&lt;br /&gt;&lt;br /&gt;でも、残念ながらGoogle APIs、たとえばGoogle Maps APIを使ったapkを実行できない。&lt;br /&gt;&lt;br /&gt;しかたがないので600x1024サイズのAVDを使うことにする。&lt;br /&gt;&lt;br /&gt;Google APIs(Google Inc.) - API Level 8をTargetにしたAVDを作成してから、&lt;br /&gt;&lt;br /&gt;~/.android/avd/AVDNAME.avd/config.iniのskin.pathを&lt;br /&gt;&lt;br /&gt;add-ons/addon_galaxy_tab_samsung_electronics_8/skins/GALAXY Tab&lt;br /&gt;&lt;br /&gt;にすると、GALAXY Tabの画面サイズにできる。&lt;br /&gt;&lt;br /&gt;動作に影響はしないみたいだけれどskin.nameもGALAXY Tabにしておいた。&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4101830137963614549?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4101830137963614549/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/01/google-apisgalaxy-tab.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4101830137963614549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4101830137963614549'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/01/google-apisgalaxy-tab.html' title='Google APIsとGALAXY Tabのエミュレータ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7138164877798529616</id><published>2011-01-08T03:45:00.001+09:00</published><updated>2011-01-08T03:48:46.784+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>開いているページのURLをQRコードにするブックマークレット</title><content type='html'>&lt;div&gt;&lt;a href="javascript:void((function(){window.location.href='http://takumakei.blogspot.com/2011/01/qrweb.html?qrcodeInputText='+encodeURIComponent(window.location.href);})());"&gt;開いているページのURLをQRcodeにする&lt;/a&gt;ブックマークレット&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://takumakei.blogspot.com/2011/01/urlqr.html?javascript:void((function(){window.location.href='http://takumakei.blogspot.com/2011/01/qrweb.html?qrcodeInputText='+encodeURIComponent(window.location.href);})());"&gt;開いているページのURLをQRcodeにする&lt;/a&gt;ブックマークレット(iPhone用)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;※iPhone用の場合&lt;br /&gt;&lt;ol&gt;&lt;li&gt;リンク先をブックマークに保存した後で&lt;br /&gt;&lt;li&gt;保存したブックマークのURLの先頭から「javascript:」までを削除すること。&lt;br /&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;javascript:void((function(){window.location.href='http://takumakei.blogspot.com/2011/01/qrweb.html?qrcodeInputText='+encodeURIComponent(window.location.href);})()); &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7138164877798529616?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7138164877798529616/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/01/urlqr.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7138164877798529616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7138164877798529616'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/01/urlqr.html' title='開いているページのURLをQRコードにするブックマークレット'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-257526931016327307</id><published>2011-01-07T20:49:00.004+09:00</published><updated>2011-01-08T03:00:23.123+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>QRコードを作るWebアプリ</title><content type='html'>&lt;style type="text/css"&gt;.qrcodecenter{margin-left:auto;margin-right:auto;text-align:center}&lt;/style&gt;&lt;br /&gt;&lt;div class="qrcodecenter"&gt;&lt;input id="qrcodeInputText" type="text" size="40" placeholder="text here"&gt;&lt;input type="button" value="QRcode" onclick="javascript:updateQrcodeView();"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="qrcodecenter"&gt;&lt;image id="qrcodeView" style="visibility:hidden"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="qrcodeText" class="qrcodecenter"&gt;&lt;/div&gt;&lt;a href="http://takumakei.blogspot.com/2011/01/qrweb.html?qrcodeInputText=http%3A%2F%2Ftakumakei.blogspot.com%2F2011%2F01%2Fqrweb.html"&gt;このページのQRコード&lt;/a&gt;&lt;br /&gt;&lt;script&gt;function updateQrcodeView() {  var src = document.getElementById('qrcodeInputText').value;  var qrcodeView = document.getElementById('qrcodeView');  qrcodeView.src =    'http://chart.apis.google.com/chart?chs=150x150&amp;cht=qr&amp;chl='    + encodeURIComponent(src);  qrcodeView.style.visibility = 'visible';  var qrcodeText = document.getElementById('qrcodeText');  qrcodeText.innerText = src;}&lt;/script&gt;&lt;br /&gt;&lt;pre class="brush:html"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;QRcode&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;.qrcodecenter{margin-left:auto;margin-right:auto;text-align:center}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;function updateQrcodeView() {&lt;br /&gt;  var src = document.getElementById('qrcodeInputText').value;&lt;br /&gt;  var qrcodeView = document.getElementById('qrcodeView');&lt;br /&gt;  qrcodeView.src =&lt;br /&gt;    'http://chart.apis.google.com/chart?chs=150x150&amp;amp;cht=qr&amp;amp;chl='&lt;br /&gt;    + encodeURIComponent(src);&lt;br /&gt;  qrcodeView.style.visibility = 'visible';&lt;br /&gt;  var qrcodeText = document.getElementById('qrcodeText');&lt;br /&gt;  qrcodeText.innerText = src;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;qrcodecenter&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input id=&amp;quot;qrcodeInputText&amp;quot; type=&amp;quot;text&amp;quot; size=&amp;quot;40&amp;quot; placeholder=&amp;quot;text here&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;QRcode&amp;quot; onclick=&amp;quot;javascript:updateQrcodeView();&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;qrcodecenter&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;image id=&amp;quot;qrcodeView&amp;quot; style=&amp;quot;visibility:hidden&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;qrcodeText&amp;quot; class=&amp;quot;qrcodecenter&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2011/01/08 01:18am ちょっと修正&lt;br /&gt;&lt;script&gt;(function(){  var url = 'http://takumakei.blogspot.com/2011/01/qrweb.html';  var href = document.location.href;  if (href.indexOf(url) != 0) { return; }  var name = 'qrcodeInputText';  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  var regexS = "[\\?&amp;]"+name+"=([^&amp;#]*)";  var regex = new RegExp(regexS);  var results = regex.exec(href);  if (results == null) return;  document.getElementById('qrcodeInputText').value = unescape(results[1]);  updateQrcodeView();})();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-257526931016327307?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/257526931016327307/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2011/01/qrweb.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/257526931016327307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/257526931016327307'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2011/01/qrweb.html' title='QRコードを作るWebアプリ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1586544015727773499</id><published>2010-12-20T12:00:00.000+09:00</published><updated>2010-12-20T12:00:05.919+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>「VC 2010 Expressでx64コンパイル」を見つけて嬉しかったのでメモ</title><content type='html'>&lt;a href="http://hylogics.net/blog/wp-trackback.php?p=700"&gt;VC 2010 Expressでx64コンパイル(How to compile x64 app with VC 2010 Express)&lt;/a&gt;&lt;br /&gt;mnemotoさんありがとう&lt;br /&gt;&lt;pre class="brush: xml" title="%userprofile%\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props"&gt;&amp;lt;?xml version=”1.0″ encoding=”utf-8″?&amp;gt;&lt;br /&gt;&amp;lt;Project DefaultTargets=”Build” ToolsVersion=”4.0″ xmlns=”http://schemas.microsoft.com/developer/msbuild/2003“&amp;gt;&lt;br /&gt;  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;    &amp;lt;SourcePath&amp;gt;$(SourcePath)&amp;lt;/SourcePath&amp;gt;&lt;br /&gt;    &amp;lt;IntDir&amp;gt;$(SolutionDir)$(Platform)\$(Configuration)\&amp;lt;/IntDir&amp;gt;&lt;br /&gt;    &amp;lt;IncludePath&amp;gt;C:\Program Files\Microsoft SDKs\Windows\v7.1\Include;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include&amp;lt;/IncludePath&amp;gt;&lt;br /&gt;    &amp;lt;LibraryPath&amp;gt;C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64&amp;lt;/LibraryPath&amp;gt;&lt;br /&gt;   &lt;br /&gt;    &amp;lt;TrackFileAccess&amp;gt;false&amp;lt;/TrackFileAccess&amp;gt;&lt;br /&gt;  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;&amp;lt;/Project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: shell" title="build-boost-amd64.bat"&gt;set “PATH=%PATH%;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64″&lt;br /&gt;set “INCLUDE=C:\Program Files\Microsoft SDKs\Windows\v7.1\Include;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include”&lt;br /&gt;set “LIB=C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64″&lt;br /&gt;bjam release debug threading=multi link=static runtime-link=static toolset=msvc address-model=64&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1586544015727773499?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1586544015727773499/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/12/vc-2010-expressx64.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1586544015727773499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1586544015727773499'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/12/vc-2010-expressx64.html' title='「VC 2010 Expressでx64コンパイル」を見つけて嬉しかったのでメモ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4751026337225452206</id><published>2010-12-18T18:43:00.000+09:00</published><updated>2010-12-18T18:43:43.499+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>WebGLに触れてみる</title><content type='html'>&lt;a href="http://www.khronos.org/webgl/"&gt;WebGL&lt;/a&gt;とは「&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;a href="http://ja.wikipedia.org/wiki/JavaScript" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="JavaScript"&gt;JavaScript&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;とネイティブの&lt;a href="http://www.khronos.org/opengles/"&gt;OpenGL ES&lt;/a&gt; 2.0のバインディング」だそうだ。 by &lt;a href="http://ja.wikipedia.org/wiki/WebGL"&gt;wikipedia&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;「&lt;a href="http://engineer.dena.jp/2010/08/post.html"&gt;WebGLを試してみる&lt;/a&gt;」がわかりやすくて感動した。&lt;br /&gt;&lt;br /&gt;Firefoxよりもchromeが好きなので、&lt;a href="http://tools.google.com/dlpage/chromesxs"&gt;Canary Build&lt;/a&gt;をインストールして再生準備完了。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/demos/webkit/SpiritBox.html"&gt;子犬の写真がテクスチャとして貼ってある立方体がくるくる回ってるデモ&lt;/a&gt;をみた。&lt;br /&gt;&lt;br /&gt;早速ソースをみてみたら、VertexShaderとかFragmentShaderが何やってるのかわからなかったけど&lt;br /&gt;メインのJavaScriptの部分はOpenGLを知っていればそれほど苦労せずに読めそう。&lt;br /&gt;&lt;br /&gt;気になったのは、OpenGL ES 2.0はOpenGL ES 1.xよりも、いちいち面倒らしいということ。&lt;br /&gt;&lt;br /&gt;それでも情報が増えてくれば負担は軽くなっていくだろうし&lt;br /&gt;だれかが、便利な「なんとか.js」を作って公開してくれるだろうから&lt;br /&gt;全力で待っているフリをしてみることにする。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4751026337225452206?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4751026337225452206/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/12/webgl.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4751026337225452206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4751026337225452206'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/12/webgl.html' title='WebGLに触れてみる'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2909149821535602058</id><published>2010-11-30T11:55:00.000+09:00</published><updated>2010-11-30T11:55:34.884+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>現在のdalvik VMはアプリのヒープを16Mに制限している</title><content type='html'>&lt;a href="http://groups.google.com/group/android-framework/msg/cda4cd5d5da2b2d8"&gt;http://groups.google.com/group/android-framework/msg/cda4cd5d5da2b2d8&lt;/a&gt;&amp;nbsp;から引用。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;the VM currently limits app heaps to 16MB.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;This allows for a&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;reasonable number of apps to run.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;ふーん。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2909149821535602058?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2909149821535602058/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/11/dalvik-vm16m.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2909149821535602058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2909149821535602058'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/11/dalvik-vm16m.html' title='現在のdalvik VMはアプリのヒープを16Mに制限している'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-431213876162702688</id><published>2010-11-30T10:25:00.000+09:00</published><updated>2010-11-30T10:25:16.732+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>NTTドコモのAndroid端末のユーザーエージェント</title><content type='html'>&lt;span class="Apple-style-span" style="color: #2f2f2f; font-family: 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', メイリオ, Meiryo, 'ＭＳ Ｐゴシック', sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 25px;"&gt;&lt;a href="http://www.dcm-gate.com/fordeveloper/android/faq.html#faq06"&gt;FAQ&lt;/a&gt;に書いてあった。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="boxFaq" style="color: #2f2f2f; font-family: 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', メイリオ, Meiryo, 'ＭＳ Ｐゴシック', sans-serif; font-size: 14px; font-style: normal; line-height: 21px; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;div style="display: block; font-style: normal; line-height: 1.8; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 50px; padding-right: 0px; padding-top: 3px; text-decoration: none;"&gt;&lt;img alt="【図】答え" class="iconA" src="http://www.dcm-gate.com/fordeveloper/android/shared/img/icon_answer.gif" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; font-size: 10px; line-height: 0px; margin-bottom: 5px; margin-left: -37px; margin-right: 10px; margin-top: 0px; vertical-align: middle;" /&gt;弊社Android端末標準webブラウザのユーザーエージェントは、下記のとおりとなります。&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #2f2f2f; font-family: 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', メイリオ, Meiryo, 'ＭＳ Ｐゴシック', sans-serif; font-size: 14px; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="boxFaq" style="font-style: normal; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;table cellspacing="1" class="ua" style="background-attachment: initial; background-clip: initial; background-color: #cccccc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: inherit; margin-left: 50px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="bg" style="background-attachment: initial; background-clip: initial; background-color: #f6f6f6; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-align: center; text-decoration: none; vertical-align: middle;"&gt;端末&lt;/td&gt;&lt;td class="bg" style="background-attachment: initial; background-clip: initial; background-color: #f6f6f6; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-align: center; text-decoration: none; vertical-align: middle;"&gt;ファームウェア&lt;br /&gt;バージョン&lt;br /&gt;(ビルド番号)&lt;/td&gt;&lt;td class="bg" style="background-attachment: initial; background-clip: initial; background-color: #f6f6f6; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-align: center; text-decoration: none; vertical-align: middle;"&gt;ユーザーエージェント&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;HT-03A&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 1.5&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 1.5; ja-jp; HT-03A Build/CDB72)&lt;br /&gt;AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 1.6&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; Docomo HT-03A Build/DRD08)&lt;br /&gt;AppleWebKit/528.5+(KHTML, like Gecko) Version/3.1.2 Mobile Safari/ 525.20.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="4" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Xperia™&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 1.6&lt;br /&gt;(R1EA018)&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA018)&lt;br /&gt;AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 1.6&lt;br /&gt;(R1EA025)&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA025)&lt;br /&gt;AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 1.6&lt;br /&gt;(R1EA029)&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA029)&lt;br /&gt;AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 2.1&lt;br /&gt;(2.0.B.0.138)&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; SonyEricssonSO-01B Build/2.0.B.0.138)&lt;br /&gt;AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;LYNX SH-10B&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 1.6&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SH-10B Build/S7023)&lt;br /&gt;AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td nowrap="nowrap" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;&lt;span style="white-space: nowrap;"&gt;GALAXY S&lt;/span&gt;&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 2.2&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-02B Build/FROYO)&lt;br /&gt;AppleWebKit/533.1(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td nowrap="nowrap" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;GALAXY Tab&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Android 2.2&lt;/td&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-style: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; padding-top: 3px; text-decoration: none; vertical-align: top;"&gt;Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build/FROYO)&lt;br /&gt;AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div id="boxFaq" style="font-style: normal; margin-bottom: -15px; margin-left: 50px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-431213876162702688?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/431213876162702688/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/11/nttandroid.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/431213876162702688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/431213876162702688'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/11/nttandroid.html' title='NTTドコモのAndroid端末のユーザーエージェント'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4138412986842685724</id><published>2010-11-27T02:33:00.003+09:00</published><updated>2010-11-27T02:52:40.591+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>HTML5でファイルのドラッグアンドドロップしてみた</title><content type='html'>&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;と&lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/"&gt;Syntaxhighlighter&lt;/a&gt;使って、HTMLファイルを読みやすくしてみた。&lt;br /&gt;ファイルのドラッグアンドドロップよりも、むしろ、SyntaxHighlighter.highlight()に気づくまで時間かかった。&lt;br /&gt;&lt;br /&gt;Chrome 7.0.517.44とFirefox 3.6.10で動いた。&lt;br /&gt;IE8とSafari 5.0.2は動かなかった。&lt;br /&gt;&lt;style&gt;.drophere {  padding: 0.25em;  width: 50%;  border: 1px solid #666;  background: #eee;}.dragover {  background: #8f8}&lt;/style&gt;&lt;br /&gt;&lt;div id="dropzone"&gt;&lt;div class="drophere" align="center"&gt;ここにHTMLファイルをドロップする。&lt;br /&gt;&lt;br /&gt;Drop your html files here.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;style&amp;gt;&lt;br /&gt;.drophere {&lt;br /&gt;  padding: 0.25em;&lt;br /&gt;  width: 50%;&lt;br /&gt;  border: 1px solid #666;&lt;br /&gt;  background: #eee;&lt;br /&gt;}&lt;br /&gt;.dragover {&lt;br /&gt;  background: #8f8&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;drophere&amp;quot; align=&amp;quot;center&amp;quot;&amp;gt;ここにHTMLファイルをドロップする。&amp;lt;br/&amp;gt;&lt;br /&gt;Drop your html files here.&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://www.google.com/jsapi&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;google.load(&amp;quot;jquery&amp;quot;, &amp;quot;1.3&amp;quot;);&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;$(function(){&lt;br /&gt;  $('#dropzone .drophere')&lt;br /&gt;    .bind('dragenter', function(ev) {&lt;br /&gt;      $(ev.target).addClass('dragover');&lt;br /&gt;      return false;&lt;br /&gt;    })&lt;br /&gt;    .bind('dragleave', function(ev) {&lt;br /&gt;      $(ev.target).removeClass('dragover');&lt;br /&gt;      return false;&lt;br /&gt;    })&lt;br /&gt;    .bind('dragover', function(ev) {&lt;br /&gt;      return false;&lt;br /&gt;    })&lt;br /&gt;    .bind('drop', function(ev) {&lt;br /&gt;      $(ev.target).removeClass('dragover');&lt;br /&gt;      var dt = ev.originalEvent.dataTransfer;&lt;br /&gt;      for (var i = 0; i &amp;lt; dt.files.length; ++i) {&lt;br /&gt;        var file = dt.files[i];&lt;br /&gt;        var reader = new FileReader();&lt;br /&gt;        reader.onloadend = function() {&lt;br /&gt;          $('#dropzone')&lt;br /&gt;          .append(&lt;br /&gt;          $('&amp;lt;pre/&amp;gt;')&lt;br /&gt;          .html($('&amp;lt;div/&amp;gt;').text(reader.result).html())&lt;br /&gt;          .addClass('brush: html'));&lt;br /&gt;          SyntaxHighlighter.highlight();&lt;br /&gt;        };&lt;br /&gt;        reader.readAsText(file, 'utf-8');&lt;br /&gt;      }&lt;br /&gt;      return false;&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://www.google.com/jsapi"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;google.load("jquery", "1.3");&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;$(function(){  $('#dropzone .drophere')    .bind('dragenter', function(ev) {      $(ev.target).addClass('dragover');      return false;    })    .bind('dragleave', function(ev) {      $(ev.target).removeClass('dragover');      return false;    })    .bind('dragover', function(ev) {      return false;    })    .bind('drop', function(ev) {      $(ev.target).removeClass('dragover');      var dt = ev.originalEvent.dataTransfer;      for (var i = 0; i &lt; dt.files.length; ++i) {        var file = dt.files[i];        var reader = new FileReader();        reader.onloadend = function() {          $('#dropzone')          .append(          $('&lt;pre/&gt;')          .html($('&lt;div/&gt;').text(reader.result).html())          .addClass('brush: html'));          SyntaxHighlighter.highlight();        };        reader.readAsText(file, 'utf-8');      }      return false;    });});&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4138412986842685724?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4138412986842685724/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/11/html5.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4138412986842685724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4138412986842685724'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/11/html5.html' title='HTML5でファイルのドラッグアンドドロップしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7687523856600754756</id><published>2010-11-17T15:56:00.000+09:00</published><updated>2010-11-17T15:56:18.981+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidでスクリーンの方向を指定してみたらもやもやした</title><content type='html'>ゲームとかで画面の表示方向を固定したいことがある。&lt;br /&gt;&lt;br /&gt;AndroidManifest.xmlでactivityのscreenOrientation属性で指定する方法が一般的だと思う。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;activity&lt;br /&gt;  ...&lt;br /&gt;  android:screenOrientation=&amp;quot;landscape&amp;quot;&lt;br /&gt;  ...&amp;gt;&lt;/pre&gt;&lt;br /&gt;この指定は実行時に変更することができる。&lt;br /&gt;&lt;br /&gt;縦長固定に変える&lt;br /&gt;&lt;pre class="mycodeB"&gt;Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);&lt;/pre&gt;&lt;br /&gt;横長固定に変える&lt;br /&gt;&lt;pre class="mycodeB"&gt;Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);&lt;/pre&gt;&lt;br /&gt;システムに決めてもらう&lt;br /&gt;&lt;pre class="mycodeB"&gt;Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);&lt;/pre&gt;&lt;br /&gt;「システムに決めてもらう」設定にしておくと、重力センサーなどに従って、自動的に自然な方向に回転したりする。&lt;br /&gt;&lt;br /&gt;普通の時は自由に回転させておくけれど、ボタンを押したときには「その時の方向で固定」したいこともある。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public void lockScreenOrientation() {&lt;br /&gt;    switch (getResources().getConfiguration().orientation) {&lt;br /&gt;    case Configuration.ORIENTATION_LANDSCAPE:&lt;br /&gt;        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);&lt;br /&gt;        break;&lt;br /&gt;    case Configuration.ORIENTATION_PORTRAIT:&lt;br /&gt;        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);&lt;br /&gt;        break;&lt;br /&gt;    case Configuration.ORIENTATION_SQUARE:&lt;br /&gt;        // ここではどうしたらいい？&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;世の中には正方形のデバイスもあるらしい。&lt;br /&gt;確かに横長でも縦長でもないけれど、正方形だとしてもデバイスの方向ってやつがあるはずでしょぅ&lt;br /&gt;そう考えると、SQUAREっていう報告は来ないはず…&lt;br /&gt;実機で試してみたいなぁー&lt;br /&gt;あーもやもやする&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7687523856600754756?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7687523856600754756/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/11/android_17.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7687523856600754756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7687523856600754756'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/11/android_17.html' title='Androidでスクリーンの方向を指定してみたらもやもやした'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4582814659361652844</id><published>2010-11-16T12:21:00.000+09:00</published><updated>2010-11-16T12:21:44.971+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>&lt;application&gt;の直下に&lt;meta-data&gt;を書いてもいいのかもしれない</title><content type='html'>&lt;a href="http://developer.android.com/intl/ja/guide/topics/manifest/manifest-intro.html"&gt;AndroidManifest.xml&lt;/a&gt;の&lt;a href="http://developer.android.com/intl/ja/guide/topics/manifest/meta-data-element.html"&gt;&amp;lt;meta-data&amp;gt;の説明&lt;/a&gt;では、&amp;lt;meta-data&amp;gt;の親になるのは、&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;activity&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;activity-alias&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;service&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;receiver&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;の4つしか書いてない。&lt;br /&gt;&lt;br /&gt;だけど、&lt;a href="http://developer.android.com/intl/ja/reference/android/content/pm/ApplicationInfo.html"&gt;ApplicationInfo&lt;/a&gt;には&lt;a href="http://developer.android.com/intl/ja/reference/android/content/pm/PackageItemInfo.html#metaData"&gt;metaData&lt;/a&gt;フィールドがあるし、&lt;br /&gt;実機で検証したところ、期待通りに機能している。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public static Object getAppMetaData(Context context, String key) {&lt;br /&gt;    try {&lt;br /&gt;        final Bundle metaData =&lt;br /&gt;            context&lt;br /&gt;            .getPackageManager()&lt;br /&gt;            .getApplicationInfo(&lt;br /&gt;                context.getPackageName(),&lt;br /&gt;                PackageManager.GET_META_DATA)&lt;br /&gt;            .metaData;&lt;br /&gt;        if (null != metaData) {&lt;br /&gt;            return metaData.get(key);&lt;br /&gt;        }&lt;br /&gt;    } catch (NameNotFoundException e) {&lt;br /&gt;    }&lt;br /&gt;    return null;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;「動く」けど、ドキュメントに書かれていない、この便利な機能を使ってよいのだろうか？&lt;br /&gt;&lt;br /&gt;答えがないかと探していたら、見つけたっぽい。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.admob.com/docs/AdMob_Android_SDK_Instructions.pdf"&gt;AdMobのガイド&lt;/a&gt;。&lt;br /&gt;&amp;lt;application&amp;gt;の子要素で&amp;lt;meta-data&amp;gt;使って"ADMOB_PUBLISHER_ID"をセットしている。&lt;br /&gt;&lt;br /&gt;AdMobがこの仕組みを使ってるってことは、だれでも使っていいってことだろう。&lt;br /&gt;いつかドキュメントが更新されるに違いない。&lt;br /&gt;もしも問題になったとしても、解決策がすぐに提案されるだろう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4582814659361652844?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4582814659361652844/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/11/androidmanifest.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4582814659361652844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4582814659361652844'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/11/androidmanifest.html' title='&amp;lt;application&amp;gt;の直下に&amp;lt;meta-data&amp;gt;を書いてもいいのかもしれない'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-301580155631673383</id><published>2010-11-08T21:33:00.000+09:00</published><updated>2010-11-08T21:33:26.015+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidでアプリ実行中にフルスクリーンにしたりしなかったり</title><content type='html'>ボタンを押したらフルスクリーンにする。&lt;br /&gt;もうひとつのボタンをおしたら元に戻す。&lt;br /&gt;&lt;pre class="brush: java"&gt;@Override&lt;br /&gt; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;  super.onCreate(savedInstanceState);&lt;br /&gt;  setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;  findViewById(R.id.btnFullScreen).setOnClickListener(new View.OnClickListener() {&lt;br /&gt;   @Override&lt;br /&gt;   public void onClick(View v) {&lt;br /&gt;    getWindow().addFlags(&lt;br /&gt;      WindowManager.LayoutParams.FLAG_FULLSCREEN);&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  findViewById(R.id.btnNotFullScreen).setOnClickListener(new View.OnClickListener() {&lt;br /&gt;   @Override&lt;br /&gt;   public void onClick(View v) {&lt;br /&gt;    getWindow().clearFlags(&lt;br /&gt;      WindowManager.LayoutParams.FLAG_FULLSCREEN);&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-301580155631673383?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/301580155631673383/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/11/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/301580155631673383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/301580155631673383'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/11/android.html' title='Androidでアプリ実行中にフルスクリーンにしたりしなかったり'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1666832043021482964</id><published>2010-10-21T14:15:00.001+09:00</published><updated>2010-10-21T14:18:07.253+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidの標準ブラウザで開いたHTMLから自作アプリを起動してみた</title><content type='html'>通常のアプリのように見えて、&lt;br /&gt;かつ、&lt;br /&gt;ブラウザーからもアプリを起動できるようにするためには、&lt;br /&gt;アクティビティにintent-filterを追加すればよい。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;AndroidManifest.xml&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;activity&lt;br /&gt;    android:name=".MyActivity"&lt;br /&gt;    android:label="@string/app_name"&lt;br /&gt;    &amp;gt;&lt;br /&gt;    &amp;lt;intent-filter&amp;gt;&lt;br /&gt;        &amp;lt;action android:name="android.intent.action.MAIN"/&amp;gt;&lt;br /&gt;        &amp;lt;category android:name="android.intent.category.LAUNCHER"/&amp;gt;&lt;br /&gt;    &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;    &amp;lt;intent-filter&amp;gt;&lt;br /&gt;        &amp;lt;action android:name="android.intent.action.VIEW"/&amp;gt;&lt;br /&gt;        &amp;lt;category android:name="android.intent.category.DEFAULT"/&amp;gt;&lt;br /&gt;        &amp;lt;category android:name="android.intent.category.BROWSABLE"/&amp;gt;&lt;br /&gt;        &amp;lt;data android:scheme="hello" android:host="world"/&amp;gt;&lt;br /&gt;    &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;&amp;lt;/activity&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;HTMLには&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeB"&gt;&amp;lt;a href=&amp;quot;hello://world/&amp;quot;&amp;gt;起動&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;こんなリンクを用意する。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;ブラウザーから起動された場合、getIntent().getData()でUriを取得することができる。&lt;/div&gt;&lt;div&gt;アクティビティが普通に起動されたときには、getData()はnullを返す。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;参考&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.android.com/intl/ja/guide/topics/intents/intents-filters.html"&gt;http://developer.android.com/intl/ja/guide/topics/intents/intents-filters.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.android.com/intl/ja/guide/topics/manifest/intent-filter-element.html"&gt;http://developer.android.com/intl/ja/guide/topics/manifest/intent-filter-element.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.android.com/intl/ja/guide/topics/manifest/data-element.html"&gt;http://developer.android.com/intl/ja/guide/topics/manifest/data-element.html&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1666832043021482964?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1666832043021482964/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/10/androidhtml.html#comment-form' title='3 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1666832043021482964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1666832043021482964'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/10/androidhtml.html' title='Androidの標準ブラウザで開いたHTMLから自作アプリを起動してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3043476276069111119</id><published>2010-08-31T21:21:00.000+09:00</published><updated>2010-08-31T21:21:51.480+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>画像でボタンを作る方法</title><content type='html'>これまでスタイルで指定する方法を使っていたけれど、よりよい方法を見つけた。&lt;br /&gt;スタイルで指定するとEclipseのLayoutエディタではプレビューできなかった。&lt;br /&gt;でも、以下の方法ならばプレビューもちゃんとできる。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;まず、画像を3つ用意する。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;通常時の画像。&lt;/li&gt;&lt;li&gt;トラックパッドなどで選択されている時の画像。&lt;/li&gt;&lt;li&gt;タッチされている時の画像。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;例えばこんな感じ。&lt;/div&gt;&lt;div&gt;res/drawable/normal.png&lt;/div&gt;&lt;div&gt;&lt;div&gt;res/drawable/focused.png&lt;/div&gt;&lt;div&gt;res/drawable/pressed.png&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次に、ボタンの状態に応じて表示するものが変わるdrawableをxmlで作成する。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;drawable/button.xml&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;selector xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;item android:drawable=&amp;quot;@drawable/focused&amp;quot; android:state_focused=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;item android:drawable=&amp;quot;@drawable/pressed&amp;quot; android:state_pressed=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;item android:drawable=&amp;quot;@drawable/normal&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/selector&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そしてボタンに適用する。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;layoutファイルにて&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;Button&lt;br /&gt;  android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;  android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;  android:background=&amp;quot;@drawable/button&amp;quot;/&amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;参考情報:&amp;nbsp;&lt;a href="http://www.taosoftware.co.jp/blog/2009/01/android_8.html"&gt;Android画像付きボタン&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3043476276069111119?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3043476276069111119/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3043476276069111119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3043476276069111119'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/08/blog-post.html' title='画像でボタンを作る方法'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8744166595207335162</id><published>2010-08-31T11:06:00.002+09:00</published><updated>2010-08-31T11:06:45.346+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>自作Viewのカスタム属性</title><content type='html'>&lt;div&gt;MyViewという名前で自作Viewを作り、カスタム属性helloを作る方法のメモ。&lt;/div&gt;&lt;br /&gt;まず res/values/attrs.xml を作って属性を定義する。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;res/values/attrs.xml&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;  &amp;lt;declare-styleable name="MyView"&amp;gt;&lt;br /&gt;    &amp;lt;attr name="hello" format="string"/&amp;gt;&lt;br /&gt;  &amp;lt;/declare-styleable&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで、R.styleable.MyViewとR.styleable.MyView_helloというフィールドが自動生成される。&lt;br /&gt;&lt;br /&gt;次に、MyViewのコンストラクタでカスタム属性を読むコードを書く。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;MyView.java&lt;/pre&gt;&lt;pre class="mycodeB"&gt;public MyView(Context context, AttributeSet attrs, int defStyle) {&lt;br /&gt;  super(context, attrs, defStyle);&lt;br /&gt;&lt;br /&gt;  TypedArray a = context.obtainStyledAttributes(&lt;br /&gt;    attrs, R.styleable.MyView, defStyle, 0);&lt;br /&gt;  this.hello = a.getString(R.MyView_hello);&lt;br /&gt;  a.recycle();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;MyViewを使う時は、属性のために名前空間を宣言する。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;layout/main.xml&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout&lt;br /&gt;  xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;  xmlns:takumak="http://schemas.android.com/apk/res/[Rクラスのパッケージ名]"&lt;br /&gt;  android:layout_width="fill_parent"&lt;br /&gt;  android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;  &amp;lt;com.blogspot.takumakei.lib.MyView&lt;br /&gt;    android:layout_width="fill_parent"&lt;br /&gt;    android:layout_height="fill_parent"&lt;br /&gt;    takumak:hello="hello world"/&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;参考にした情報&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.pocketjourney.com/2008/05/02/android-tutorial-42-passing-custom-variables-via-xml-resource-files/"&gt;Android Tutorial#4.2: Passing custom attributes via XML resource files&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/res/res/values/attrs.xml;h=b2ba645cc782e18c57681903ace21d9a434550bc;hb=01889503c47aadc9faacf727371f1d23e3a99d97"&gt;core/res/res/values/attrs.xml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/widget/FrameLayout.java;h=3afd5d42f8574488fedc490a644bb4b2c65baca2;hb=01889503c47aadc9faacf727371f1d23e3a99d97"&gt;core/java/android/widget/FrameLayout.java&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8744166595207335162?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8744166595207335162/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/08/view.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8744166595207335162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8744166595207335162'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/08/view.html' title='自作Viewのカスタム属性'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1355234457120260319</id><published>2010-08-30T19:33:00.003+09:00</published><updated>2010-08-31T10:59:24.401+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Galaxy Sは魅力的な端末だった</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_-552tFB6UQU/S6zfGefaPdI/AAAAAAAAARo/Yg6h_8NobXY/20100326003_samsung_galaxy_s.jpg" width="200" /&gt;&lt;/div&gt;たまたま実機に触れるチャンスがあった。&lt;br /&gt;反応が速くて素敵。&lt;br /&gt;有機ELディスプレイも綺麗だし。&lt;br /&gt;すごい魅力的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1355234457120260319?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1355234457120260319/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/08/galaxy-s.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1355234457120260319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1355234457120260319'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/08/galaxy-s.html' title='Galaxy Sは魅力的な端末だった'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-552tFB6UQU/S6zfGefaPdI/AAAAAAAAARo/Yg6h_8NobXY/s72-c/20100326003_samsung_galaxy_s.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-9157027569416341240</id><published>2010-08-18T12:16:00.000+09:00</published><updated>2010-08-18T12:16:49.777+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>SIMとICCIDとIMSIとIMEI</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;ICCID&lt;/span&gt;とはIC Card IDのこと。&lt;a href="http://ja.wikipedia.org/wiki/SIM%E3%82%AB%E3%83%BC%E3%83%89"&gt;SIMカード&lt;/a&gt;固有の番号。&lt;br /&gt;SIMカードとはSubscriber Identity Module Cardのこと。&lt;br /&gt;加入者識別番号モジュールカード。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/intl/ja/reference/android/telephony/TelephonyManager.html#getSimSerialNumber()"&gt;android.telephony.TelephonyManager#getSimSerialNumber&lt;/a&gt;でICCIDを取得可能。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ja.wikipedia.org/wiki/International_Mobile_Subscriber_Identity"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;IMSI&lt;/span&gt;&lt;/a&gt;とはInternational Mobile Subscriber Identityのこと。&lt;br /&gt;&lt;br /&gt;国際移動体加入者識別番号。&lt;br /&gt;キャリアがSIMに割り当てた識別番号。&lt;br /&gt;携帯電話の通信ではIMSIが電話番号の役割を担う。&lt;br /&gt;IMSIは再利用される可能性がある。&lt;br /&gt;IMSIは滅多に送信されることがないらしい。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://ja.wikipedia.org/wiki/International_Mobile_Equipment_Identity"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;IMEI&lt;/span&gt;&lt;/a&gt;はInternational Mobile Equipment Identifierのこと。&lt;/div&gt;&lt;div&gt;&lt;div&gt;国際移動体装置識別番号。&lt;/div&gt;&lt;div&gt;端末に割り当てられた番号。&lt;/div&gt;&lt;div&gt;*#06#と入力すると携帯電話の画面に表示できる。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.android.com/intl/ja/reference/android/telephony/TelephonyManager.html#getDeviceId()"&gt;android.telephony.TelephonyManager#getDeviceId&lt;/a&gt;でIMEIを取得可能。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;TelephonyManager&lt;/span&gt;のインスタンスは、&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.android.com/intl/ja/reference/android/content/Context.html#getSystemService(java.lang.String)"&gt;Context#getSystemService(Context.TELEPHONY_SERVICE)&lt;/a&gt;で取得する。&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.android.com/intl/ja/reference/android/Manifest.permission.html#READ_PHONE_STATE"&gt;READ_PHONE_STATE&lt;/a&gt;パーミッションが必要。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;もとねた：&lt;a href="http://groups.google.co.jp/group/android-group-japan/browse_thread/thread/95ce061583e27798?pli=1"&gt;ICCIDの取得方法について&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-9157027569416341240?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/9157027569416341240/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/08/simiccidimsiimei.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/9157027569416341240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/9157027569416341240'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/08/simiccidimsiimei.html' title='SIMとICCIDとIMSIとIMEI'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8379953270358318318</id><published>2010-08-17T20:55:00.001+09:00</published><updated>2010-08-17T20:58:01.188+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>みたことあるAndroid端末のUser Agentたち</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;HT-03A&lt;/pre&gt;&lt;pre class="mycodeB"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; Docomo HT-03A Build/DRD08) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/pre&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;X06HT Desire&lt;/pre&gt;&lt;pre class="mycodeB"&gt;Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; HTC Desire Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17&lt;/pre&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;SO-01B XPERIA&lt;/pre&gt;&lt;pre class="mycodeB"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA018) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/pre&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;IS01&lt;/pre&gt;&lt;pre class="mycodeB"&gt;Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; IS01 Build/S7070) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8379953270358318318?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8379953270358318318/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/08/androiduser-agent.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8379953270358318318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8379953270358318318'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/08/androiduser-agent.html' title='みたことあるAndroid端末のUser Agentたち'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2312457444196805076</id><published>2010-07-18T01:18:00.000+09:00</published><updated>2010-07-18T01:18:19.006+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JavaでXPathを使ってみた</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;Sample.java&lt;/pre&gt;&lt;pre class="mycodeB"&gt;import java.io.FileInputStream;&lt;br /&gt;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;import javax.xml.xpath.XPathConstants;&lt;br /&gt;import javax.xml.xpath.XPathExpression;&lt;br /&gt;import javax.xml.xpath.XPathFactory;&lt;br /&gt;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.dom.Node;&lt;br /&gt;&lt;br /&gt;public class Sample {&lt;br /&gt;    public static void main(String[] args) throws Exception {&lt;br /&gt;        Document document =&lt;br /&gt;            DocumentBuilderFactory&lt;br /&gt;            .newInstance()&lt;br /&gt;            .newDocumentBuilder()&lt;br /&gt;            .parse(new FileInputStream(&amp;quot;books.xml&amp;quot;));&lt;br /&gt;        XPathExpression xpath =&lt;br /&gt;            XPathFactory&lt;br /&gt;            .newInstance()&lt;br /&gt;            .newXPath()&lt;br /&gt;            .compile(&amp;quot;//book[@year='2000']/title/text()&amp;quot;);&lt;br /&gt;        Node node = (Node)xpath.evaluate(document, XPathConstants.NODE);&lt;br /&gt;        if (null != node)&lt;br /&gt;            System.out.println(node.getNodeValue());&lt;br /&gt;        else&lt;br /&gt;            System.out.println(&amp;quot;not found&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;books.xml&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;inventory&amp;gt;&lt;br /&gt;    &amp;lt;book year=&amp;quot;2000&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;title&amp;gt;Snow Crash&amp;lt;/title&amp;gt;&lt;br /&gt;        &amp;lt;author&amp;gt;Neal Stephenson&amp;lt;/author&amp;gt;&lt;br /&gt;        &amp;lt;publisher&amp;gt;Spectra&amp;lt;/publisher&amp;gt;&lt;br /&gt;        &amp;lt;isbn&amp;gt;0553380958&amp;lt;/isbn&amp;gt;&lt;br /&gt;        &amp;lt;price&amp;gt;14.95&amp;lt;/price&amp;gt;&lt;br /&gt;    &amp;lt;/book&amp;gt;&lt;br /&gt;    &amp;lt;book year=&amp;quot;2005&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;title&amp;gt;Burning Tower&amp;lt;/title&amp;gt;&lt;br /&gt;        &amp;lt;author&amp;gt;Larry Niven&amp;lt;/author&amp;gt;&lt;br /&gt;        &amp;lt;author&amp;gt;Jerry Pournelle&amp;lt;/author&amp;gt;&lt;br /&gt;        &amp;lt;publisher&amp;gt;Pocket&amp;lt;/publisher&amp;gt;&lt;br /&gt;        &amp;lt;isbn&amp;gt;0743416910&amp;lt;/isbn&amp;gt;&lt;br /&gt;        &amp;lt;price&amp;gt;5.99&amp;lt;/price&amp;gt;&lt;br /&gt;    &amp;lt;/book&amp;gt;&lt;br /&gt;&amp;lt;/inventory&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;そもそも、AndroidでXMLしたくて調べたのだけれど、&lt;br /&gt;&lt;a href="http://developer.android.com/intl/ja/reference/javax/xml/xpath/XPath.html"&gt;XPath&lt;/a&gt;はAPI Level 8 (Android 2.2) でプラットフォームに取り込まれた。&lt;br /&gt;最近ターゲットにしているAPI Level 4 (Android 1.6) では標準ではなかった。&lt;br /&gt;&lt;br /&gt;参考: &lt;a href="http://www.ibm.com/developerworks/jp/xml/library/x-javaxpathapi.html"&gt;Java XPath API&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2312457444196805076?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2312457444196805076/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/07/javaxpath.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2312457444196805076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2312457444196805076'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/07/javaxpath.html' title='JavaでXPathを使ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5560845067436099014</id><published>2010-06-27T00:01:00.001+09:00</published><updated>2010-06-27T00:06:24.615+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JavaScript on Java で Swing してみた</title><content type='html'>コードを書きまくって指が痛くなり、&lt;br /&gt;もっとサボらなくちゃいけないと思い、&lt;br /&gt;Javaの代わりにスクリプト言語で書くという選択肢にたどり着く。&lt;br /&gt;&lt;br /&gt;「Javaの代わりにスクリプト」 == 「Groovy」 かなぁ？&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;「Javaの代わりにスクリプト」 == 「JRuby」 かなぁ？&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;そうこうしているうちに、&lt;a href="http://jcp.org/en/jsr/detail?id=223"&gt;Scripting for Java Platform&lt;/a&gt;。こんな機能、知りませんでした。&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;JS.java&lt;/pre&gt;&lt;pre class="mycodeB"&gt;import java.io.FileReader;&lt;br /&gt;&lt;br /&gt;import javax.script.ScriptEngine;&lt;br /&gt;import javax.script.ScriptEngineManager;&lt;br /&gt;&lt;br /&gt;public class JS {&lt;br /&gt;    public static void main(String[] args) throws Exception {&lt;br /&gt;        ScriptEngineManager m = new ScriptEngineManager();&lt;br /&gt;        ScriptEngine e = m.getEngineByName(&amp;quot;js&amp;quot;);&lt;br /&gt;        FileReader source = new FileReader(&amp;quot;swing.js&amp;quot;);&lt;br /&gt;        try {&lt;br /&gt;            e.eval(source);&lt;br /&gt;        } finally {&lt;br /&gt;            source.close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;swing.js&lt;/pre&gt;&lt;pre class="mycodeB"&gt;importPackage(java.awt);&lt;br /&gt;importPackage(java.awt.event);&lt;br /&gt;importPackage(javax.swing);&lt;br /&gt;&lt;br /&gt;var frame = new JFrame(&amp;quot;Sample&amp;quot;);&lt;br /&gt;frame.setLayout(new FlowLayout());&lt;br /&gt;&lt;br /&gt;var button = new JButton(&amp;quot;OK&amp;quot;);&lt;br /&gt;&lt;br /&gt;button.addActionListener(new ActionListener({&lt;br /&gt;  actionPerformed: function(event) {&lt;br /&gt;    JOptionPane.showMessageDialog(frame, &amp;quot;JavaScript on Java で Swing&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;}));&lt;br /&gt;&lt;br /&gt;frame.add(button);&lt;br /&gt;&lt;br /&gt;frame.setSize(100, 100);&lt;br /&gt;&lt;br /&gt;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)&lt;br /&gt;frame.setVisible(true);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;&lt;a href="http://www.javainthebox.net/laboratory/JavaSE6/scripting/scripting.html"&gt;言語の中の言語 - Scripting&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.techscore.com/tech/J2SE/JavaSE6/5.html"&gt;スクリプティング機能&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ところで、スクリプト言語に換えたところで指の痛みは軽減できないことに気がついた。&lt;br /&gt;「スクリプト使う→打鍵数が減る→プログラムが早くできあがる」だけだった&lt;br /&gt;別ののサボり方を探そう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5560845067436099014?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5560845067436099014/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/06/javascript-on-java-swing.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5560845067436099014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5560845067436099014'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/06/javascript-on-java-swing.html' title='JavaScript on Java で Swing してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1731132202148810413</id><published>2010-06-09T22:16:00.003+09:00</published><updated>2010-06-10T01:46:51.692+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Nettyと戯れてみた</title><content type='html'>&lt;a href="http://www.jboss.org/netty"&gt;Netty&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;まずはMaven 2.2.1 をインストール。apache-maven-2.2.1\binをPATHに追加。&lt;br /&gt;&lt;br /&gt;Mavenでプロジェクトを作成。&lt;br /&gt;&lt;pre class="mycodeB"&gt;C:\Users\Kei&amp;gt;mvn archetype:generate -DgroupId=com.blogspot.takumakei.studynetty -DartifactId=StudyNetty -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false&lt;/pre&gt;&lt;br /&gt;pom.xmlにnettyを追加。&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(nettyのDownloadページからコピペしたらバージョン番号がX.Y.Z.Qになっててエラー吐いた。)&lt;/span&gt;&lt;br /&gt;&lt;pre class="mycodeB"&gt;&amp;lt;project xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;  xsi:schemaLocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;com.blogspot.takumakei.studynetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;StudyNetty&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;StudyNetty&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;  &amp;lt;repositories&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;repository.jboss.org&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;http://repository.jboss.org/nexus/content/groups/public/&amp;lt;/url&amp;gt;&lt;br /&gt;      &amp;lt;snapshots&amp;gt;&lt;br /&gt;        &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;      &amp;lt;/snapshots&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;  &amp;lt;/repositories&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;  &amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.jboss.netty&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;netty&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;3.1.5.GA&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Eclipseのプロジェクトファイルを生成。&lt;br /&gt;&lt;pre class="mycodeB"&gt;C:\Users\Kei\StudyNetty&amp;gt;mvn eclipse:eclipse -DdownloadSource=true -DdownloadJavadocs=true&lt;/pre&gt;&lt;br /&gt;Eclipseにインポート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EclipseのWindow &amp;gt; PreferencesでClasspath Variablesに&lt;br /&gt;[Name] M2_REPO&lt;br /&gt;[Path] C:\Users\Kei\.m2\repository&lt;br /&gt;を追加。&lt;br /&gt;&lt;br /&gt;mvnで追加できるのを後から知った。&lt;br /&gt;&lt;pre class="mycodeB"&gt;C:\Users\Kei&amp;gt;mvn -Declipse.workspace=&amp;quot;C:\Users\Kei\EclipseWorks&amp;quot; eclipse:add-maven-repo&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://docs.jboss.org/netty/3.1/guide/html/start.html"&gt;Writing a Discard Server&lt;/a&gt;のDiscardServerHandlerとDiscardServerを追加。&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;さっそくサーバを起動してつながってみる。&lt;br /&gt;&lt;pre class="mycodeB"&gt;C:\Users\Kei&amp;gt;irb -rsocket&lt;br /&gt;ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]&lt;br /&gt;require 'rubygems' -&amp;gt; true&lt;br /&gt;require 'irb/completion' -&amp;gt; true&lt;br /&gt;require 'pp' -&amp;gt; true&lt;br /&gt;irb(main):001:0&amp;gt; c = TCPSocket.open('localhost', 12345)&lt;br /&gt;=&amp;gt; #&amp;lt;TCPSocket:0x3bf1bf4&amp;gt;&lt;br /&gt;irb(main):002:0&amp;gt; c.write 'hello world'&lt;br /&gt;=&amp;gt; 11&lt;br /&gt;irb(main):005:0&amp;gt; c.close&lt;br /&gt;=&amp;gt; nil&lt;br /&gt;irb(main):006:0&amp;gt;&lt;br /&gt;C:\Users\Kei&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;動いてる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;あとは、ドキュメント読みつつ実装するのみ。&lt;br /&gt;&lt;br /&gt;そういえば…&lt;br /&gt;Maven2.0.11かMaven2.2.1のどっちを使うべきか迷ったので両方インストールしてみた。&lt;br /&gt;情報が少ないかもしれないけど、これまでMavenに依存してなかったから新しい方(2.2.1)を選んだ。&lt;br /&gt;&lt;br /&gt;環境はWindows 7 Pro x64にJDK1.6.0_20&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1731132202148810413?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1731132202148810413/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/06/netty.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1731132202148810413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1731132202148810413'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/06/netty.html' title='Nettyと戯れてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4464067217392032289</id><published>2010-05-20T02:56:00.000+09:00</published><updated>2010-05-20T02:56:21.945+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>久しぶりにNetBeans IDEを使ってみた</title><content type='html'>NetBeans IDE 6.9 Betaを使ってみた。&lt;br /&gt;&lt;div&gt;最近はAndroidアプリの開発をしているのでEclipseなのだけれど&lt;/div&gt;&lt;div&gt;JavaFXしたいな～と思ってNetBeans。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ところがJavaFXする前に…&lt;/div&gt;&lt;div&gt;awtのデザインをGUIで構築できるのが便利すぎてつい遊んでしまった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;BlogCode.java&lt;/pre&gt;&lt;pre class="mycodeB"&gt;/*&lt;br /&gt; * To change this template, choose Tools | Templates&lt;br /&gt; * and open the template in the editor.&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * BlogCode.java&lt;br /&gt; *&lt;br /&gt; * Created on 2010/05/20, 2:11:47&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package com.blogspot.takumakei.blogcode;&lt;br /&gt;&lt;br /&gt;import java.awt.Toolkit;&lt;br /&gt;import java.awt.datatransfer.Clipboard;&lt;br /&gt;import java.awt.datatransfer.DataFlavor;&lt;br /&gt;import java.awt.datatransfer.StringSelection;&lt;br /&gt;import java.awt.datatransfer.UnsupportedFlavorException;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import javax.swing.UIManager;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Kei&lt;br /&gt; */&lt;br /&gt;public class BlogCode extends javax.swing.JFrame {&lt;br /&gt;&lt;br /&gt;    /** Creates new form BlogCode */&lt;br /&gt;    public BlogCode() {&lt;br /&gt;        initComponents();&lt;br /&gt;        setTitle("BlogCode");&lt;br /&gt;        jTextArea1.setText(getClipboardString());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /** This method is called from within the constructor to&lt;br /&gt;     * initialize the form.&lt;br /&gt;     * WARNING: Do NOT modify this code. The content of this method is&lt;br /&gt;     * always regenerated by the Form Editor.&lt;br /&gt;     */&lt;br /&gt;    @SuppressWarnings("unchecked")&lt;br /&gt;    // &amp;lt;editor-fold defaultstate="collapsed" desc="Generated Code"&amp;gt;&lt;br /&gt;    private void initComponents() {&lt;br /&gt;&lt;br /&gt;        jButton1 = new javax.swing.JButton();&lt;br /&gt;        jButton2 = new javax.swing.JButton();&lt;br /&gt;        jScrollPane1 = new javax.swing.JScrollPane();&lt;br /&gt;        jTextArea1 = new javax.swing.JTextArea();&lt;br /&gt;        jTextField1 = new javax.swing.JTextField();&lt;br /&gt;        jButton3 = new javax.swing.JButton();&lt;br /&gt;&lt;br /&gt;        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);&lt;br /&gt;&lt;br /&gt;        jButton1.setText("Reset");&lt;br /&gt;        jButton1.addActionListener(new java.awt.event.ActionListener() {&lt;br /&gt;            public void actionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;                jButton1ActionPerformed(evt);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        jButton2.setText("Copy");&lt;br /&gt;        jButton2.addActionListener(new java.awt.event.ActionListener() {&lt;br /&gt;            public void actionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;                jButton2ActionPerformed(evt);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        jTextArea1.setColumns(20);&lt;br /&gt;        jTextArea1.setRows(5);&lt;br /&gt;        jScrollPane1.setViewportView(jTextArea1);&lt;br /&gt;&lt;br /&gt;        jButton3.setText("Clear");&lt;br /&gt;        jButton3.addActionListener(new java.awt.event.ActionListener() {&lt;br /&gt;            public void actionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;                jButton3ActionPerformed(evt);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());&lt;br /&gt;        getContentPane().setLayout(layout);&lt;br /&gt;        layout.setHorizontalGroup(&lt;br /&gt;            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)&lt;br /&gt;            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()&lt;br /&gt;                .addContainerGap()&lt;br /&gt;                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)&lt;br /&gt;                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 269, Short.MAX_VALUE)&lt;br /&gt;                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()&lt;br /&gt;                        .addComponent(jButton1)&lt;br /&gt;                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)&lt;br /&gt;                        .addComponent(jButton3)&lt;br /&gt;                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 83, Short.MAX_VALUE)&lt;br /&gt;                        .addComponent(jButton2))&lt;br /&gt;                    .addComponent(jTextField1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 269, Short.MAX_VALUE))&lt;br /&gt;                .addContainerGap())&lt;br /&gt;        );&lt;br /&gt;        layout.setVerticalGroup(&lt;br /&gt;            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)&lt;br /&gt;            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()&lt;br /&gt;                .addContainerGap()&lt;br /&gt;                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)&lt;br /&gt;                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)&lt;br /&gt;                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 172, Short.MAX_VALUE)&lt;br /&gt;                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)&lt;br /&gt;                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)&lt;br /&gt;                    .addComponent(jButton1)&lt;br /&gt;                    .addComponent(jButton2)&lt;br /&gt;                    .addComponent(jButton3))&lt;br /&gt;                .addContainerGap())&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;        pack();&lt;br /&gt;    }// &amp;lt;/editor-fold&amp;gt;&lt;br /&gt;&lt;br /&gt;    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;        final String title = jTextField1.getText();&lt;br /&gt;        final String body = jTextArea1.getText();&lt;br /&gt;        if (0 == body.length()) { return; }&lt;br /&gt;&lt;br /&gt;        StringBuilder sb = new StringBuilder();&lt;br /&gt;        if (0 &amp;lt; title.length()) {&lt;br /&gt;            sb.append("&amp;lt;pre class=\"mycodeT\" onclick=\"toggleMyCode(this)\"&amp;gt;");&lt;br /&gt;            sb.append(escapeHTML(title));&lt;br /&gt;            sb.append("&amp;lt;/pre&amp;gt;");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        sb.append("&amp;lt;pre class=\"mycodeB\"&amp;gt;");&lt;br /&gt;        sb.append(escapeHTML(body));&lt;br /&gt;        sb.append("&amp;lt;/pre&amp;gt;\n");&lt;br /&gt;&lt;br /&gt;        setClipboardString(sb.toString());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;        jTextField1.setText("");&lt;br /&gt;        jTextArea1.setText(getClipboardString());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;        jTextField1.setText("");&lt;br /&gt;        jTextArea1.setText(getClipboardString());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static String escapeHTML(String s){&lt;br /&gt;        // http://www.rgagnon.com/javadetails/java-0306.html&lt;br /&gt;        StringBuilder sb = new StringBuilder(s.length());&lt;br /&gt;        int n = s.length();&lt;br /&gt;        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;            char c = s.charAt(i);&lt;br /&gt;            switch (c) {&lt;br /&gt;            case '\t': sb.append("    "); break;&lt;br /&gt;            case '&amp;lt;': sb.append("&amp;amp;lt;"); break;&lt;br /&gt;            case '&amp;gt;': sb.append("&amp;amp;gt;"); break;&lt;br /&gt;            case '&amp;amp;': sb.append("&amp;amp;amp;"); break;&lt;br /&gt;            case '"': sb.append("&amp;amp;quot;"); break;&lt;br /&gt;            case 'à': sb.append("&amp;amp;agrave;");break;&lt;br /&gt;            case 'À': sb.append("&amp;amp;Agrave;");break;&lt;br /&gt;            case 'â': sb.append("&amp;amp;acirc;");break;&lt;br /&gt;            case 'Â': sb.append("&amp;amp;Acirc;");break;&lt;br /&gt;            case 'ä': sb.append("&amp;amp;auml;");break;&lt;br /&gt;            case 'Ä': sb.append("&amp;amp;Auml;");break;&lt;br /&gt;            case 'å': sb.append("&amp;amp;aring;");break;&lt;br /&gt;            case 'Å': sb.append("&amp;amp;Aring;");break;&lt;br /&gt;            case 'æ': sb.append("&amp;amp;aelig;");break;&lt;br /&gt;            case 'Æ': sb.append("&amp;amp;AElig;");break;&lt;br /&gt;            case 'ç': sb.append("&amp;amp;ccedil;");break;&lt;br /&gt;            case 'Ç': sb.append("&amp;amp;Ccedil;");break;&lt;br /&gt;            case 'é': sb.append("&amp;amp;eacute;");break;&lt;br /&gt;            case 'É': sb.append("&amp;amp;Eacute;");break;&lt;br /&gt;            case 'è': sb.append("&amp;amp;egrave;");break;&lt;br /&gt;            case 'È': sb.append("&amp;amp;Egrave;");break;&lt;br /&gt;            case 'ê': sb.append("&amp;amp;ecirc;");break;&lt;br /&gt;            case 'Ê': sb.append("&amp;amp;Ecirc;");break;&lt;br /&gt;            case 'ë': sb.append("&amp;amp;euml;");break;&lt;br /&gt;            case 'Ë': sb.append("&amp;amp;Euml;");break;&lt;br /&gt;            case 'ï': sb.append("&amp;amp;iuml;");break;&lt;br /&gt;            case 'Ï': sb.append("&amp;amp;Iuml;");break;&lt;br /&gt;            case 'ô': sb.append("&amp;amp;ocirc;");break;&lt;br /&gt;            case 'Ô': sb.append("&amp;amp;Ocirc;");break;&lt;br /&gt;            case 'ö': sb.append("&amp;amp;ouml;");break;&lt;br /&gt;            case 'Ö': sb.append("&amp;amp;Ouml;");break;&lt;br /&gt;            case 'ø': sb.append("&amp;amp;oslash;");break;&lt;br /&gt;            case 'Ø': sb.append("&amp;amp;Oslash;");break;&lt;br /&gt;            case 'ß': sb.append("&amp;amp;szlig;");break;&lt;br /&gt;            case 'ù': sb.append("&amp;amp;ugrave;");break;&lt;br /&gt;            case 'Ù': sb.append("&amp;amp;Ugrave;");break;&lt;br /&gt;            case 'û': sb.append("&amp;amp;ucirc;");break;&lt;br /&gt;            case 'Û': sb.append("&amp;amp;Ucirc;");break;&lt;br /&gt;            case 'ü': sb.append("&amp;amp;uuml;");break;&lt;br /&gt;            case 'Ü': sb.append("&amp;amp;Uuml;");break;&lt;br /&gt;            case '®': sb.append("&amp;amp;reg;");break;&lt;br /&gt;            case '©': sb.append("&amp;amp;copy;");break;&lt;br /&gt;            case '€': sb.append("&amp;amp;euro;"); break;&lt;br /&gt;            // be carefull with this one (non-breaking whitee space)&lt;br /&gt;            //case ' ': sb.append("&amp;amp;nbsp;");break;&lt;br /&gt;&lt;br /&gt;            default:  sb.append(c); break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return sb.toString();&lt;br /&gt;    }&lt;br /&gt;//    public static String stringToHTMLString(String string) {&lt;br /&gt;//        // http://www.rgagnon.com/javadetails/java-0306.html&lt;br /&gt;//        StringBuilder sb = new StringBuilder(string.length());&lt;br /&gt;//        // true if last char was blank&lt;br /&gt;//        boolean lastWasBlankChar = false;&lt;br /&gt;//        int len = string.length();&lt;br /&gt;//        char c;&lt;br /&gt;//&lt;br /&gt;//        for (int i = 0; i &amp;lt; len; i++)&lt;br /&gt;//            {&lt;br /&gt;//            c = string.charAt(i);&lt;br /&gt;//            if (c == ' ') {&lt;br /&gt;//                // blank gets extra work,&lt;br /&gt;//                // this solves the problem you get if you replace all&lt;br /&gt;//                // blanks with &amp;amp;nbsp;, if you do that you loss&lt;br /&gt;//                // word breaking&lt;br /&gt;//                if (lastWasBlankChar) {&lt;br /&gt;//                    lastWasBlankChar = false;&lt;br /&gt;//                    sb.append("&amp;amp;nbsp;");&lt;br /&gt;//                    }&lt;br /&gt;//                else {&lt;br /&gt;//                    lastWasBlankChar = true;&lt;br /&gt;//                    sb.append(' ');&lt;br /&gt;//                    }&lt;br /&gt;//                }&lt;br /&gt;//            else {&lt;br /&gt;//                lastWasBlankChar = false;&lt;br /&gt;//                //&lt;br /&gt;//                // HTML Special Chars&lt;br /&gt;//                if (c == '"')&lt;br /&gt;//                    sb.append("&amp;amp;quot;");&lt;br /&gt;//                else if (c == '&amp;amp;')&lt;br /&gt;//                    sb.append("&amp;amp;amp;");&lt;br /&gt;//                else if (c == '&amp;lt;')&lt;br /&gt;//                    sb.append("&amp;amp;lt;");&lt;br /&gt;//                else if (c == '&amp;gt;')&lt;br /&gt;//                    sb.append("&amp;amp;gt;");&lt;br /&gt;//                else if (c == '\n')&lt;br /&gt;//                    // Handle Newline&lt;br /&gt;//                    sb.append("&amp;amp;lt;br/&amp;amp;gt;");&lt;br /&gt;//                else {&lt;br /&gt;//                    int ci = 0xffff &amp;amp; c;&lt;br /&gt;//                    if (ci &amp;lt; 160 )&lt;br /&gt;//                        // nothing special only 7 Bit&lt;br /&gt;//                        sb.append(c);&lt;br /&gt;//                    else {&lt;br /&gt;//                        // Not 7 Bit use the unicode system&lt;br /&gt;//                        sb.append("&amp;amp;#");&lt;br /&gt;//                        sb.append(new Integer(ci).toString());&lt;br /&gt;//                        sb.append(';');&lt;br /&gt;//                        }&lt;br /&gt;//                    }&lt;br /&gt;//                }&lt;br /&gt;//            }&lt;br /&gt;//        return sb.toString();&lt;br /&gt;//    }&lt;br /&gt;&lt;br /&gt;    // http://www.ne.jp/asahi/hishidama/home/tech/java/clipboard.html&lt;br /&gt;    public static String getClipboardString() {&lt;br /&gt;        Toolkit toolkit = Toolkit.getDefaultToolkit();&lt;br /&gt;        Clipboard clipboard = toolkit.getSystemClipboard();&lt;br /&gt;        try {&lt;br /&gt;            return (String)clipboard.getData(DataFlavor.stringFlavor);&lt;br /&gt;        } catch (UnsupportedFlavorException e) {&lt;br /&gt;            return "";&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            return "";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // http://www.ne.jp/asahi/hishidama/home/tech/java/clipboard.html&lt;br /&gt;    public static void setClipboardString(String str) {&lt;br /&gt;        Toolkit toolkit = Toolkit.getDefaultToolkit();&lt;br /&gt;        Clipboard clipboard = toolkit.getSystemClipboard();&lt;br /&gt;        StringSelection selection = new StringSelection(str);&lt;br /&gt;        clipboard.setContents(selection, selection);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;    * @param args the command line arguments&lt;br /&gt;    */&lt;br /&gt;    public static void main(String args[]) {&lt;br /&gt;        try {&lt;br /&gt;                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        java.awt.EventQueue.invokeLater(new Runnable() {&lt;br /&gt;            public void run() {&lt;br /&gt;                new BlogCode().setVisible(true);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Variables declaration - do not modify&lt;br /&gt;    private javax.swing.JButton jButton1;&lt;br /&gt;    private javax.swing.JButton jButton2;&lt;br /&gt;    private javax.swing.JButton jButton3;&lt;br /&gt;    private javax.swing.JScrollPane jScrollPane1;&lt;br /&gt;    private javax.swing.JTextArea jTextArea1;&lt;br /&gt;    private javax.swing.JTextField jTextField1;&lt;br /&gt;    // End of variables declaration&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4464067217392032289?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4464067217392032289/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/05/netbeans-ide.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4464067217392032289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4464067217392032289'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/05/netbeans-ide.html' title='久しぶりにNetBeans IDEを使ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4342388492190332950</id><published>2010-04-30T09:36:00.000+09:00</published><updated>2010-04-30T09:36:29.338+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerLanguage'/><title type='text'>LLVMのロゴ</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://llvm.org/img/DragonSmall.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://llvm.org/img/DragonSmall.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;LLVMにロゴがあったなんて知らなかった。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;LLVM 2.7 がリリースされたけれど、X86-64の対応が甘いのは相変わらずっぽい。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;自分で解決しろってことか…。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4342388492190332950?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4342388492190332950/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/04/llvm.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4342388492190332950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4342388492190332950'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/04/llvm.html' title='LLVMのロゴ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-207541632736051149</id><published>2010-04-17T23:31:00.000+09:00</published><updated>2010-04-17T23:31:39.009+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Xperia X10とWindows 7 64bit の USBドライバ(SDKのドライバをロードする方法)</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'MS PGothic';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;android_winusb.infを修正しておくだけ。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'MS PGothic';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;android_winusb.inf.patch&lt;/pre&gt;&lt;pre class="mycodeB"&gt;--- android_winusb.inf.orig &amp;nbsp; &amp;nbsp; 2010-04-17 22:36:28.789163200 +0900&lt;br /&gt;+++ android_winusb.inf &amp;nbsp;2010-04-17 23:24:14.522073700 +0900&lt;br /&gt;@@ -26,6 +26,9 @@&lt;br /&gt;&amp;nbsp;%ProviderName% = Google, NTx86, NTamd64&lt;br /&gt;&lt;br /&gt;&amp;nbsp;[Google.NTx86]&lt;br /&gt;+; Xperia X10&lt;br /&gt;+%SingleAdbInterface% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= USB_Install, USB\VID_0FCE&amp;amp;PID_D12E&lt;br /&gt;+%CompositeAdbInterface% &amp;nbsp; &amp;nbsp; = USB_Install, USB\VID_0FCE&amp;amp;PID_D12E&amp;amp;MI_01&lt;br /&gt;&amp;nbsp;; HTC Dream&lt;br /&gt;&amp;nbsp;%SingleAdbInterface% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= USB_Install, USB\VID_0BB4&amp;amp;PID_0C01&lt;br /&gt;&amp;nbsp;%CompositeAdbInterface% &amp;nbsp; &amp;nbsp; = USB_Install, USB\VID_0BB4&amp;amp;PID_0C02&amp;amp;MI_01&lt;br /&gt;@@ -44,6 +47,9 @@&lt;br /&gt;&amp;nbsp;%CompositeAdbInterface% &amp;nbsp; &amp;nbsp; = USB_Install, USB\VID_18D1&amp;amp;PID_4E12&amp;amp;MI_01&lt;br /&gt;&lt;br /&gt;&amp;nbsp;[Google.NTamd64]&lt;br /&gt;+; Xperia X10&lt;br /&gt;+%SingleAdbInterface% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= USB_Install, USB\VID_0FCE&amp;amp;PID_D12E&lt;br /&gt;+%CompositeAdbInterface% &amp;nbsp; &amp;nbsp; = USB_Install, USB\VID_0FCE&amp;amp;PID_D12E&amp;amp;MI_01&lt;br /&gt;&amp;nbsp;; HTC Dream&lt;br /&gt;&amp;nbsp;%SingleAdbInterface% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= USB_Install, USB\VID_0BB4&amp;amp;PID_0C01&lt;br /&gt;&amp;nbsp;%CompositeAdbInterface% &amp;nbsp; &amp;nbsp; = USB_Install, USB\VID_0BB4&amp;amp;PID_0C02&amp;amp;MI_01&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-207541632736051149?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/207541632736051149/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/04/xperia-x10windows-7-64bit-usbsdk.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/207541632736051149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/207541632736051149'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/04/xperia-x10windows-7-64bit-usbsdk.html' title='Xperia X10とWindows 7 64bit の USBドライバ(SDKのドライバをロードする方法)'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7202754272847786702</id><published>2010-04-05T14:44:00.000+09:00</published><updated>2010-04-05T14:44:14.268+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>いまさらだけどRubyをWindows(32bit)にインストールするときのためのメモ</title><content type='html'>RubyをWindowsでcygwinに依存せずに快適に使うために必要なファイルの場所のメモ。&lt;br /&gt;&lt;br /&gt;@ITの「&lt;a href="http://www.atmarkit.co.jp/fcoding/articles/ruby191/ruby191a.html"&gt;WindowsにRuby1.9.1をインストールする&lt;/a&gt;」によると&lt;br /&gt;&lt;br /&gt;Ruby mswin32は&lt;a href="ftp://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/"&gt;ftp://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/&lt;/a&gt;から持ってこれる&lt;br /&gt;GNU Readlineなどは&lt;a href="http://jarp.does.notwork.org/win32/"&gt;http://jarp.does.notwork.org/win32/&lt;/a&gt;から持ってこれる&lt;br /&gt;OpenSSLは&lt;a href="http://www.deanlee.cn/programming/openssl-for-windows/"&gt;http://www.deanlee.cn/programming/openssl-for-windows/&lt;/a&gt;から持ってこれる&lt;br /&gt;Iconvは&lt;a href="http://www.meadowy.org/meadow/dists/snapshot/old/"&gt;http://www.meadowy.org/meadow/dists/snapshot/old/&lt;/a&gt;から持ってこれる&lt;br /&gt;&lt;br /&gt;Ruby1.8.6やRuby1.8.7でもこれらのDLLを使える。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ソースパッケージのほうが微妙に新しくなってるから&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;できれば(Rubyも含めて)自分でコンパイルしたい。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Cでext書くこともあるし、Cなgemをインストールすることもあるし...&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;でも、VC6が動くマシンは持ってないからなぁ...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7202754272847786702?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7202754272847786702/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/04/rubywindows32bit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7202754272847786702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7202754272847786702'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/04/rubywindows32bit.html' title='いまさらだけどRubyをWindows(32bit)にインストールするときのためのメモ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5201348699336140560</id><published>2010-04-01T19:47:00.000+09:00</published><updated>2010-04-01T19:47:17.918+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Xperia X10とWindows 7 64bit の USBドライバ</title><content type='html'>Xperia X10をWindows 7 64bitに認識してもらえなくて困ってた。&lt;br /&gt;いろいろぐぐってようやく&lt;a href="http://androidboss.com/install-android-2-1-usb-device-driver-on-windows-7-64-bit/"&gt;見つけた&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;正解は&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;a href="http://www.junefabrics.com/android/index.php"&gt;PdaNet for Android&lt;/a&gt;のインストールを途中までやる&lt;/span&gt;&lt;/b&gt;こと。&lt;br /&gt;&lt;br /&gt;手順はたぶん次のようだったと思う。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Xperia X10はPCから接続をはずしておく。&lt;/li&gt;&lt;li&gt;PdaNetの64bit用のインストーラを起動して、「Androidをデバッグモードにしてつなげ」というダイアログが出るところまで進める。&lt;/li&gt;&lt;li&gt;Xperia X10をデバッグモードにして、PCとUSBケーブルと接続する&lt;/li&gt;&lt;li&gt;ダイアログのOKで先に進む。(ここでドライバのインストールに成功する)&lt;/li&gt;&lt;li&gt;モデム用のデバイスドライバをインストールするかどうか聞いてくるので、&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;No&lt;/span&gt;&lt;/b&gt; と言う。&lt;/li&gt;&lt;li&gt;するとインストーラはインストールに失敗したとみなしてインストールをキャンセルしてロールバックしてくれる。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ちなみに、&lt;br /&gt;PdaNetを見つける前に&lt;a href="http://androidforums.com/sony-ericsson-xperia-x10/41892-help-need-usb-drivers.html"&gt;フォーラム&lt;/a&gt;で見つけたX10.zipというのではダメだった。&lt;br /&gt;32bit用なのだろうか？&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5201348699336140560?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5201348699336140560/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/04/xperia-x10windows-7-64bit-usb.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5201348699336140560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5201348699336140560'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/04/xperia-x10windows-7-64bit-usb.html' title='Xperia X10とWindows 7 64bit の USBドライバ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3451260666510467806</id><published>2010-03-26T17:09:00.000+09:00</published><updated>2010-03-26T17:09:48.476+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>クリティカルスピード</title><content type='html'>コードが少なくて驚いた。&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;面白いかも。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.real-unreal.info/item_53.html"&gt;リアルアンリアル　高速配信Webサーバシステムをオープンソース化&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3451260666510467806?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3451260666510467806/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/03/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3451260666510467806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3451260666510467806'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/03/blog-post.html' title='クリティカルスピード'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8683393095896424516</id><published>2010-03-24T12:16:00.002+09:00</published><updated>2010-03-24T12:18:10.679+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>MinGWでgdbmをビルドしてみた</title><content type='html'>flockとかfsyncがなくてダメな感じ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;systems.h&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#include &amp;lt;io.h&amp;gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define UNLOCK_FILE(dbf) {                              \&lt;br /&gt;    HANDLE h = (HANDLE)_get_osfhandle(dbf-&amp;gt;desc);       \&lt;br /&gt;    if (INVALID_HANDLE_VALUE != h) {                    \&lt;br /&gt;      UnlockFile(h, 0, 0, (DWORD)-1, (DWORD)-1);        \&lt;br /&gt;    }                                                   \&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;#define READLOCK_FILE(dbf) {                                            \&lt;br /&gt;    HANDLE h = (HANDLE)_get_osfhandle(dbf-&amp;gt;desc);                       \&lt;br /&gt;    if (INVALID_HANDLE_VALUE == h) {                                    \&lt;br /&gt;      lock_val = -1;                                                    \&lt;br /&gt;    } else {                                                            \&lt;br /&gt;      OVERLAPPED over;                                                  \&lt;br /&gt;      ZeroMemory(&amp;over, sizeof(over));                                  \&lt;br /&gt;      DWORD flags = LOCKFILE_FAIL_IMMEDIATELY;                          \&lt;br /&gt;      if (!LockFileEx(h, flags, 0, (DWORD)-1, (DWORD)-1, &amp;over)) {      \&lt;br /&gt;        lock_val = -1;                                                  \&lt;br /&gt;      } else {                                                          \&lt;br /&gt;        lock_val = 0;                                                   \&lt;br /&gt;      }                                                                 \&lt;br /&gt;    }                                                                   \&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;#define WRITELOCK_FILE(dbf) {                                           \&lt;br /&gt;    HANDLE h = (HANDLE)_get_osfhandle(dbf-&amp;gt;desc);                       \&lt;br /&gt;    if (INVALID_HANDLE_VALUE == h) {                                    \&lt;br /&gt;      lock_val = -1;                                                    \&lt;br /&gt;    } else {                                                            \&lt;br /&gt;      OVERLAPPED over;                                                  \&lt;br /&gt;      ZeroMemory(&amp;over, sizeof(over));                                  \&lt;br /&gt;      DWORD flags = LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK; \&lt;br /&gt;      if (!LockFileEx(h, flags, 0, (DWORD)-1, (DWORD)-1, &amp;over)) {      \&lt;br /&gt;        lock_val = -1;                                                  \&lt;br /&gt;      } else {                                                          \&lt;br /&gt;        lock_val = 0;                                                   \&lt;br /&gt;      }                                                                 \&lt;br /&gt;    }                                                                   \&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8683393095896424516?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8683393095896424516/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingwgdbm.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8683393095896424516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8683393095896424516'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingwgdbm.html' title='MinGWでgdbmをビルドしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3066233709401055171</id><published>2010-03-11T22:33:00.000+09:00</published><updated>2010-03-11T22:33:56.245+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>MinGWでDLLを作ってみる (32bitと64bit)</title><content type='html'>手軽な方法はこれ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeB"&gt;$ g++ -static -shared -o hello.dll hello.cc world.cc -Wl,--out-implib,libhello.a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;gcc 4.4.0 (32bit)を使って、上記の方法でDLLをつくると、必要以上に多くの関数をexportしちゃっている。&lt;br /&gt;&lt;br /&gt;ちゃんとDEFファイルを用意して必要な関数だけをexportする場合は次のようにすればよいみたい。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeB"&gt;$ g++ -c hello.cc&lt;br /&gt;$ g++ -c world.cc&lt;br /&gt;$ g++ -mdll -o hello.dll.tmp -Wl,--base-file,hello.dll.base hello.o world.o&lt;br /&gt;$ dlltool -l libhello.a --dllname hello.dll --base-file hello.dll.base --output-exp hello.dll.exp --def hello.def&lt;br /&gt;$ g++ -mdll -o hello.dll -Wl,hello.dll.exp -static hello.o world.o&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3066233709401055171?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3066233709401055171/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingwdll-32bit64bit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3066233709401055171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3066233709401055171'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingwdll-32bit64bit.html' title='MinGWでDLLを作ってみる (32bitと64bit)'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1528990462558935762</id><published>2010-03-11T22:26:00.000+09:00</published><updated>2010-03-11T22:26:08.955+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>MinGW-w64でx64バイナリを作ってみる</title><content type='html'>&lt;a href="http://sourceforge.net/projects/mingw-w64/"&gt;MinGW-w64&lt;/a&gt;から&lt;a href="http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20100310.zip/download"&gt;mingw-w64-bin_i686-mingw_20100310.zip&lt;/a&gt;をダウンロード&lt;br /&gt;&lt;br /&gt;適当な場所に展開してPATHを通してコンパイル。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeB"&gt;$ x86_64-w64-mingw32-g++ Hello.cpp -static&lt;/pre&gt;&lt;br /&gt;※ -staticオプションを指定しないと LIBSTDC++-6.DLL が必要。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1528990462558935762?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1528990462558935762/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingw-w64x64.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1528990462558935762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1528990462558935762'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingw-w64x64.html' title='MinGW-w64でx64バイナリを作ってみる'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-470646890101206789</id><published>2010-03-11T14:24:00.001+09:00</published><updated>2010-03-11T22:28:27.511+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>MinGW/g++-4.4.0でコンパイルしてみた</title><content type='html'>「-static-libgcc」これをつけると、libgcc_s_dw2-1.dllを配布しなくてすむ&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;コンソール&lt;/pre&gt;&lt;pre class="mycodeB"&gt;$ g++ --version&lt;br /&gt;g++.exe (GCC) 4.4.0&lt;br /&gt;Copyright (C) 2009 Free Software Foundation, Inc.&lt;br /&gt;This is free software; see the source for copying conditions.  There is NO&lt;br /&gt;warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;&lt;br /&gt;$ ls -l Hello.cpp&lt;br /&gt;-rw-r--r-- 1 takumakei Administrators 97 Mar 11 13:00 Hello.cpp&lt;br /&gt;&lt;br /&gt;$ cat Hello.cpp&lt;br /&gt;#include &lt;iostream&gt;&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt;  std::cout &amp;lt;&amp;lt; "Hello world" &amp;lt;&amp;lt; std::endl;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$ g++ -o Hello -O3 Hello.cpp -static-libgcc&lt;br /&gt;&lt;br /&gt;$ ls -l Hello.exe&lt;br /&gt;-rwxr-xr-x 1 takumakei Administrators 3862265 Mar 11 13:56 Hello.exe*&lt;br /&gt;&lt;br /&gt;$ strip Hello.exe&lt;br /&gt;&lt;br /&gt;$ ls -l Hello.exe&lt;br /&gt;-rwxr-xr-x 1 takumakei Administrators 496142 Mar 11 13:56 Hello.exe*&lt;br /&gt;&lt;br /&gt;$ ./Hello.exe&lt;br /&gt;Hello world&lt;br /&gt;&lt;/iostream&gt;&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;ウィンドウ&lt;/pre&gt;&lt;pre class="mycodeB"&gt;$ ls -l HelloW.cpp&lt;br /&gt;-rw-r--r-- 1 JP10007 Administrators 150 Mar 11 13:34 HelloW.cpp&lt;br /&gt;&lt;br /&gt;$ cat HelloW.cpp&lt;br /&gt;#include &lt;windows.h&gt;&lt;br /&gt;&lt;br /&gt;int WINAPI WinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {&lt;br /&gt;  MessageBox(NULL, "Hello world", "HelloW", MB_OK);&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$ g++ -o HelloW.exe -O3 HelloW.cpp -static-libgcc -mwindows&lt;br /&gt;&lt;br /&gt;$ ls -l HelloW.exe&lt;br /&gt;-rwxr-xr-x 1 JP10007 Administrators 334435 Mar 11 13:59 HelloW.exe*&lt;br /&gt;&lt;br /&gt;$ strip HelloW.exe&lt;br /&gt;&lt;br /&gt;$ ls -l HelloW.exe&lt;br /&gt;-rwxr-xr-x 1 JP10007 Administrators 75790 Mar 11 13:59 HelloW.exe*&lt;br /&gt;&lt;/windows.h&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-470646890101206789?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/470646890101206789/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingwg-440.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/470646890101206789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/470646890101206789'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/03/mingwg-440.html' title='MinGW/g++-4.4.0でコンパイルしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-331639052932968338</id><published>2010-03-10T22:22:00.000+09:00</published><updated>2010-03-10T22:22:57.877+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java JavaEE'/><title type='text'>Vaadinに興味津津</title><content type='html'>JavaだけでWebアプリケーションを作るフレームワーク&lt;a href="http://vaadin.com/home"&gt;Vaadin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/meXvxkn1Y_8&amp;hl=ja_JP&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/meXvxkn1Y_8&amp;hl=ja_JP&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-331639052932968338?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/331639052932968338/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/03/vaadin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/331639052932968338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/331639052932968338'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/03/vaadin.html' title='Vaadinに興味津津'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6888433143498918310</id><published>2010-03-10T21:34:00.001+09:00</published><updated>2010-03-10T21:47:30.923+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>GCJでコンパイルしてみた</title><content type='html'>&lt;a href="http://www.mingw.org/"&gt;MinGW/MSYS&lt;/a&gt;をインストールしてgcjしてみたがコンパイル後のプログラムを起動できないという罠にはまった。&lt;br /&gt;&lt;br /&gt;つぎに&lt;a href="http://thisiscool.com/"&gt;thisiscool.com&lt;/a&gt;の&lt;a href="http://www.thisiscool.com/gcc_mingw.htm#gcj43ecj"&gt;GCC/GCJ 4.3 (gcj-eclipse-merge-branch)&lt;/a&gt;をインストールしてようやくコンパイルと実行に成功した。&lt;br /&gt;&lt;br /&gt;SWTを使ってウィンドウを表示するだけの単純なアプリなのに、コンパイルにはやたらと時間がかかるし、実行ファイルのサイズが55,842KBと巨大。&lt;a href="http://upx.sourceforge.net/"&gt;upx&lt;/a&gt;で圧縮しても20,394KB。&lt;br /&gt;&lt;br /&gt;JREをインストールしていない環境でも動作するプログラムをJavaで実装できることにはとても魅力を感じるけれど、この結果だと採用しにくいな。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;a/Main.java&lt;/pre&gt;&lt;pre class="mycodeB"&gt;package a;&lt;br /&gt;&lt;br /&gt;import org.eclipse.swt.widgets.Display;&lt;br /&gt;import org.eclipse.swt.widgets.Shell;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        Display display = new Display();&lt;br /&gt;        Shell shell = new Shell(display);&lt;br /&gt;        shell.setText("HelloSWT");&lt;br /&gt;        shell.setSize(480, 320);&lt;br /&gt;        shell.open();&lt;br /&gt;        while (!shell.isDisposed()) {&lt;br /&gt;            if (!display.readAndDispatch()) {&lt;br /&gt;                display.sleep();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        display.dispose();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;コンパイル&lt;/pre&gt;&lt;pre class="mycodeB"&gt;gcj -fjni -c -o swt.o swt.jar&lt;br /&gt;gcj -mwindows -o Hello --classpath=swt.jar --main=a.Main a/Main.java swt.o&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6888433143498918310?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6888433143498918310/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/03/gcj.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6888433143498918310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6888433143498918310'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/03/gcj.html' title='GCJでコンパイルしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6756069147683275721</id><published>2010-02-08T12:50:00.002+09:00</published><updated>2010-02-08T13:38:08.484+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Device'/><title type='text'>Kindle Development Kitがリリースされた</title><content type='html'>&lt;a href="http://www.amazon.com/"&gt;Amazon.com&lt;/a&gt;のヒット商品である電子書籍リーダー &lt;a href="http://www.amazon.com/gp/product/B0015T963C/ref=sv_kinh_0"&gt;Kindle&lt;/a&gt; の&lt;a href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;amp;docId=1000476231"&gt;開発キット&lt;/a&gt;が&lt;a href="http://kdk-javadocs.s3.amazonaws.com/index.html"&gt;ベータリリース&lt;/a&gt;された。&lt;br /&gt;&lt;br /&gt;今更ながら、おさらい&lt;br /&gt;&lt;br /&gt;レベニューシェア : 開発者 70% 。Amazon 30%。&lt;br /&gt;&lt;br /&gt;アクティブコンテントの価格設定は三種類。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;無料コース&lt;/li&gt;&lt;ul&gt;&lt;li&gt;コンテントが1M以下で、月に100K以下の通信量なら無料でリリースできる&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;お買い上げコース&lt;/li&gt;&lt;ul&gt;&lt;li&gt;月に100K以下の通信量&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;月額コース&lt;/li&gt;&lt;ul&gt;&lt;li&gt;毎月お支払い。&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;br /&gt;アクティブコンテントは最大で100Mまで。&lt;br /&gt;10Mを超える場合は無線でダウンロードはできない。PC経由でUSBで転送する必要がある。&lt;br /&gt;&lt;br /&gt;Kindleは無料で無線ネットワークを使えるので、それを考慮したガイドラインになっている。&lt;br /&gt;&lt;br /&gt;Request to become a Limited Beta Developerに登録しようかと思ったけれど&lt;br /&gt;「君が作ろうと思っているアクティブコンテントアプリケーションはどんなものかね？」&lt;br /&gt;と聞かれた。回答必須だと。&lt;br /&gt;&lt;br /&gt;今のところNo Idea。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6756069147683275721?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6756069147683275721/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/02/kindle-development-kit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6756069147683275721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6756069147683275721'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/02/kindle-development-kit.html' title='Kindle Development Kitがリリースされた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1162408657955974460</id><published>2010-02-04T12:07:00.000+09:00</published><updated>2010-02-04T12:07:27.414+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>swfmillのバッチファイルを作ってみた</title><content type='html'>&lt;a href="http://swfmill.org/"&gt;swfmill&lt;/a&gt;を使ってswfとxmlを相互に変換する作業を&lt;br /&gt;繰り返し繰り返しやる必要があったので&lt;br /&gt;ドラッグアンドドロップできるようなバッチファイルを作ってみた。&lt;br /&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;swf2xml.bat&lt;/pre&gt;&lt;pre class="mycodeB"&gt;@ECHO OFF&lt;br /&gt;FOR %%I IN ( %* ) DO (&lt;br /&gt;  ECHO $ swfmill swf2xml %%~nxI %%~nI.xml&lt;br /&gt;  swfmill swf2xml &amp;quot;%%~I&amp;quot; &amp;quot;%%~dpnI.xml&amp;quot;&lt;br /&gt;  ECHO .&lt;br /&gt;)&lt;br /&gt;PAUSE&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;xml2swf.bat&lt;/pre&gt;&lt;pre class="mycodeB"&gt;@ECHO OFF&lt;br /&gt;FOR %%I IN ( %* ) DO (&lt;br /&gt;  ECHO $ swfmill xml2swf %%~nxI %%~nI.swf&lt;br /&gt;  swfmill xml2swf &amp;quot;%%~I&amp;quot; &amp;quot;%%~dpnI.swf&amp;quot;&lt;br /&gt;  ECHO .&lt;br /&gt;)&lt;br /&gt;PAUSE&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1162408657955974460?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1162408657955974460/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/02/swfmill.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1162408657955974460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1162408657955974460'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/02/swfmill.html' title='swfmillのバッチファイルを作ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5305631339893430286</id><published>2010-01-27T01:23:00.003+09:00</published><updated>2010-01-27T01:23:00.307+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>jrubycでプリコンパイルしてみた</title><content type='html'>JRubyではRubyスクリプトをプリコンパイルしてclassファイルにすることができる。&lt;br /&gt;&lt;br /&gt;% type sample.rb&lt;br /&gt;puts "hello world&lt;br /&gt;&lt;br /&gt;% mkdir bin&lt;br /&gt;% jruby -S jrubyc -t bin sample.rb&lt;br /&gt;Compiling sample.rb to class sample&lt;br /&gt;&lt;br /&gt;実行する時にはJRubyのライブラリをクラスパスに指定する。&lt;br /&gt;JRuby 1.4.0では、jruby.jarを指定すれば十分なようだ。&lt;br /&gt;&lt;br /&gt;% java -cp ./bin;C:/jruby-1.4.0/lib/jruby.jar sample&lt;br /&gt;hello world&lt;br /&gt;&lt;br /&gt;jarファイルにjarファイルを埋め込むことができるから、(Fat JarとかOne-Jarとか)&lt;br /&gt;これで「rubyなんてインストールしてないよ」っていう人でも&lt;br /&gt;Javaがインストールされていれば作成したプログラムを使ってもらえる。&lt;br /&gt;&lt;br /&gt;ちなみに、jrubyはコンパイル済みのクラスファイルを実行することもできる。&lt;br /&gt;&lt;br /&gt;% jruby sample.class&lt;br /&gt;&lt;br /&gt;便利そうだけど、JRubyがインストールされている環境でjrubycでコンパイルしたclassファイルを実行できて嬉しいことがあるのかどうかちょっと疑問。&lt;br /&gt;&lt;br /&gt;exerbみたいにrequireをトレースして必要なファイルを全てコンパイルしてJarに固めるような機能があったら便利そう。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5305631339893430286?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5305631339893430286/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/01/jrubyc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5305631339893430286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5305631339893430286'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/01/jrubyc.html' title='jrubycでプリコンパイルしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-728288151718534687</id><published>2010-01-21T15:53:00.001+09:00</published><updated>2010-01-21T15:54:18.713+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ComputerLanguage'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovyは僕を幸せにするか？</title><content type='html'>&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-family: 'MS PGothic';"&gt;&lt;span style="font-size: medium;"&gt;&lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;を使ったらプロトタイプ開発＝製品開発にできるだろうか？&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;プロトタイプ作成にRuby使って書いたコードを、製品用にJavaに書き直したとき&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Rubyのコードは600行(約15KB)位だったのに&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Javaのコードは1200行(約34.5KB)超えてちょっとうんざりした&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ruby→Javaにしなければならなかった理由は&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;バグ修正、機能拡張 ← 担当者がRuby知ってることはオプション。Javaは必須要件。&lt;/li&gt;&lt;li&gt;パフォーマンス ← 軽くて早いのがいい&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;という事だったかな。&lt;br /&gt;&lt;br /&gt;「Java必須ならRubyも必須でしょ？」はちょっと難しそうだけど&lt;br /&gt;「Java必須ならGroovyも常識でしょ？」ってちょっと頑張ればごり押しできるかも&lt;br /&gt;...とか妄想してみたりしなかったり。&lt;br /&gt;&lt;br /&gt;Groovyのパフォーマンスはどうなんだろう。調べてみたい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-728288151718534687?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/728288151718534687/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/01/groovy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/728288151718534687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/728288151718534687'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/01/groovy.html' title='Groovyは僕を幸せにするか？'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8482298806403997490</id><published>2010-01-21T15:48:00.000+09:00</published><updated>2010-01-21T15:48:15.467+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Play!</title><content type='html'>PlayフレームワークはJavaでWebアプリ開発を簡単にする...らしい。&lt;br /&gt;&lt;a href="http://www.playframework.org/"&gt;The Play framework makes it easier to build Web applications with Java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_1264054894205"&gt;Javaで軽快に使える「軽量フレームワーク特集」&lt;/a&gt;&lt;br /&gt;&lt;a href="http://codezine.jp/article/detail/4750"&gt;～本格的なRoRスタイルフレームワーク「Play!」&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ほぅ。&lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;にも興味が出てきた。&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;←え！そっち？&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8482298806403997490?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8482298806403997490/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/01/play.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8482298806403997490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8482298806403997490'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/01/play.html' title='Play!'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7147159469733497730</id><published>2010-01-19T21:25:00.001+09:00</published><updated>2010-01-19T21:25:48.869+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>StringプリミティブとStringオブジェクトの微妙な違い</title><content type='html'>&lt;span style="font-family: monospace; font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt;へぇ～。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt;...&lt;a href="http://groups.google.com/group/android-group-japan/msg/4b63d40e5cfd5db6?hl=ja"&gt;JSにはStringオブジェクトと、いわゆるプリミティブ型の文字列がある&lt;/a&gt;...&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7147159469733497730?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7147159469733497730/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2010/01/stringstring.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7147159469733497730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7147159469733497730'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2010/01/stringstring.html' title='StringプリミティブとStringオブジェクトの微妙な違い'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8652350547894954206</id><published>2009-12-17T17:58:00.003+09:00</published><updated>2009-12-17T18:02:09.258+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerLanguage'/><title type='text'>左再帰を取り除くメモ</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;左再帰&lt;/pre&gt;&lt;pre class="mycodeB"&gt;A : A B0&lt;br /&gt;  | A B1&lt;br /&gt;  ...&lt;br /&gt;  | A Bn&lt;br /&gt;  | C0&lt;br /&gt;  | C1&lt;br /&gt;  ...&lt;br /&gt;  | Cn&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;※1 B0 ... Bn はε(空)ではない&lt;/div&gt;&lt;div&gt;※2 C0 ... Cn は A を先頭に持たない&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;左再帰を消す&lt;/pre&gt;&lt;pre class="mycodeB"&gt;A : C0 A_tail?&lt;br /&gt;  | C1 A_tail?&lt;br /&gt;  ...&lt;br /&gt;  | Cn A_tail?&lt;br /&gt;&lt;br /&gt;A_tail : B0 A_tail?&lt;br /&gt;       | B1 A_tail?&lt;br /&gt;       ...&lt;br /&gt;       | Bn A_tail?&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;参考: &lt;a href="http://en.wikipedia.org/wiki/Left_recursion#Removing_immediate_left_recursion"&gt;Wikipedia - Removing immediate left recursion&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8652350547894954206?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8652350547894954206/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/12/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8652350547894954206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8652350547894954206'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/12/blog-post.html' title='左再帰を取り除くメモ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2354164038553166354</id><published>2009-12-04T18:12:00.005+09:00</published><updated>2009-12-04T18:26:48.356+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Rubyでメールアドレスかどうか調べたくなってみた</title><content type='html'>結論→今日はメールアドレスかどうかをちゃんと調べる必要がないので適当にごまかしておく。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;「やっとくか〜？」と思ったけれど、やっぱり面倒だった。あはは...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;厳密には正しくないけど今はまぁこれで十分な感じの正規表現&lt;/pre&gt;&lt;pre class="mycodeB"&gt;valid_chars = '[0-9A-Za-z_!#\$%&amp;amp;*+\-\/=\?^_{|}\~\.]+'&lt;br /&gt;valid_pattern = Regexp.new("^(#{valid_chars})@(#{valid_chars})$", nil, 'n')&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;ところで&lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/35453"&gt;元ネタ&lt;/a&gt;は2002年のRubyなので、Regexp#newのパラメータが現在(Ruby 1.8とか1.9)とは異なるようだ。&lt;/div&gt;&lt;div&gt;元ネタではRegexpの引数が2つになっていて、第2引数は 'n' だ。&lt;/div&gt;&lt;div&gt;この 'n' は文字コード "none" の指定じゃないかと思われる。&lt;/div&gt;&lt;div&gt;&lt;a href="http://doc.okkez.net/static/187/class/Regexp.html"&gt;Regexpのリファレンスマニュアル&lt;/a&gt;見ると第2引数がFixnum以外で真ならIGNORECASEになるって。&lt;/div&gt;&lt;div&gt;当時はオプションの指定ができなかったのだろうか？それとも単なる転記ミス？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;元ネタ&lt;/div&gt;&lt;div&gt;&lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/35453"&gt;Subject: [ruby-list:35453] Re: メールアドレスを抽出する方法&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.livedoor.jp/dankogai/archives/51189905.html"&gt;「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://d.hatena.ne.jp/j0hn/20070602"&gt;「正しい方法」でメールアドレスを確認するには&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2354164038553166354?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2354164038553166354/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/12/ruby.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2354164038553166354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2354164038553166354'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/12/ruby.html' title='Rubyでメールアドレスかどうか調べたくなってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7342807429951429571</id><published>2009-11-20T02:00:00.003+09:00</published><updated>2009-11-20T02:02:52.033+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerLanguage'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>The Go Programming Language</title><content type='html'>Googleで開発中の新しい言語だ〜&lt;br /&gt;&lt;a href="http://golang.org/"&gt;The Go Programming Language&lt;/a&gt;&lt;br /&gt;ちょっと面白そうかも。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7342807429951429571?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7342807429951429571/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/11/go-programming-language.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7342807429951429571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7342807429951429571'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/11/go-programming-language.html' title='The Go Programming Language'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1200563030482118814</id><published>2009-11-20T01:51:00.000+09:00</published><updated>2009-11-20T01:52:11.933+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><title type='text'>Mac版 Google Chromeアップデートされた</title><content type='html'>バージョンが4.0.249.0になった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1200563030482118814?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1200563030482118814/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/11/mac-google-chrome.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1200563030482118814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1200563030482118814'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/11/mac-google-chrome.html' title='Mac版 Google Chromeアップデートされた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7173820761753586013</id><published>2009-11-19T19:59:00.003+09:00</published><updated>2009-11-19T20:00:05.827+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>RubyでGIFを読んでみた</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;gif.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;class GIF&lt;br /&gt;  attr_accessor :version, :width, :height, :bgcolor_index, :aspect_ratio, :sort_flag&lt;br /&gt;  attr_accessor :color_table, :blocks&lt;br /&gt;&lt;br /&gt;  def self.load(istream)&lt;br /&gt;    self.new.load(istream)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.load_file(filename)&lt;br /&gt;    self.new.load_file(filename)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def initialize&lt;br /&gt;    @blocks = []&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def [](index)&lt;br /&gt;    @blocks[index]&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def []=(index, block)&lt;br /&gt;    @blocks[index] = block&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def &amp;lt;&amp;lt;(block)&lt;br /&gt;    @blocks &amp;lt;&amp;lt; block&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def clear&lt;br /&gt;    @blocks = []&lt;br /&gt;    @version = @width = @height = @bgcolor_index = @aspect_ratio = @sort_flag =&lt;br /&gt;      @color_table = nil&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def load(istream)&lt;br /&gt;    clear&lt;br /&gt;    reader = Reader.new(self, istream)&lt;br /&gt;    reader.run&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def load_file(filename)&lt;br /&gt;    File.open(filename, 'rb'){|f| load(f) }&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  class GraphicControlExtension&lt;br /&gt;    attr_accessor :disposal_method, :user_input_flag, :delay_time, :transparent_index&lt;br /&gt;    # case disposal_method&lt;br /&gt;    # when 0; # no action is required&lt;br /&gt;    # when 1; # do not dispose&lt;br /&gt;    # when 2; # restore to background color&lt;br /&gt;    # when 3; # restore to previous&lt;br /&gt;    # end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  class CommentExtension&lt;br /&gt;    attr_accessor :data&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  class PlainTextExtension&lt;br /&gt;    attr_accessor :x, :y, :width, :height, :cell_width, :cell_height&lt;br /&gt;    attr_accessor :fgcolor_index, :bgcolor_index&lt;br /&gt;    attr_accessor :text&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  class ApplicationExtension&lt;br /&gt;    attr_accessor :app_id, :auth_code, :data&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  class ImageBlock&lt;br /&gt;    attr_accessor :x, :y, :width, :height, :interlace_flag, :sort_flag, :color_table&lt;br /&gt;    attr_accessor :code_size, :data&lt;br /&gt;&lt;br /&gt;    def decode&lt;br /&gt;      LZW.decode(@code_size, @data)&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def encode(indexes)&lt;br /&gt;      largest = indexes.sort[-1]&lt;br /&gt;      @code_size = (&amp;quot;%b&amp;quot; % largest).size&lt;br /&gt;      @code_size = 2 if 2 &amp;gt; @code_size&lt;br /&gt;      @data = LZW.encode(@code_size, indexes)&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def encode_with_code_size(indexes, code_size)&lt;br /&gt;      @data = LZW.encode(@code_size = code_size, indexes)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;class GIF::Reader&lt;br /&gt;  def initialize(gif, istream)&lt;br /&gt;    @gif = gif&lt;br /&gt;    @istream = istream&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def run&lt;br /&gt;    read_header&lt;br /&gt;    read_blocks&lt;br /&gt;    @gif&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_header&lt;br /&gt;    sig,&lt;br /&gt;    @gif.version, @gif.width, @gif.height,&lt;br /&gt;    bits,&lt;br /&gt;    @gif.bgcolor_index, @gif.aspect_ratio = read_fmt('a3a3vvCCC')&lt;br /&gt;&lt;br /&gt;    gctf = 0 != (0b1000_0000 &amp;amp; bits) # global color table flag&lt;br /&gt;    cr = (0b0111 &amp;amp; (bits &amp;gt;&amp;gt; 4)) + 1 # color resolution&lt;br /&gt;    @gif.sort_flag = 0 != (0b1000 &amp;amp; bits)&lt;br /&gt;    gct_size = 2 ** ((0b0111 &amp;amp; bits) + 1) # size of global color table&lt;br /&gt;    @gif.color_table = (0...gct_size).map{ read_fmt('CCC') } if gctf&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_blocks&lt;br /&gt;    loop do&lt;br /&gt;      case block_type = read_fmt('C')[0]&lt;br /&gt;      when 0x3B # trailer&lt;br /&gt;        break&lt;br /&gt;      when 0x21 # Extension&lt;br /&gt;        @gif &amp;lt;&amp;lt; read_extension_block&lt;br /&gt;      when 0x2C # Image&lt;br /&gt;        @gif &amp;lt;&amp;lt; read_image_block&lt;br /&gt;      else&lt;br /&gt;        raise &amp;quot;Not Yet Impl : BlockType is 0x#{&amp;quot;%02x&amp;quot; % block_type}&amp;quot;&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_extension_block&lt;br /&gt;    label = read_fmt('C')[0]&lt;br /&gt;    case label&lt;br /&gt;    when 0xF9 # Graphic Control&lt;br /&gt;      read_graphic_control&lt;br /&gt;    when 0xFE # Comment Label&lt;br /&gt;      read_comment_label&lt;br /&gt;    when 0x01 # Plain Text&lt;br /&gt;      read_plain_text&lt;br /&gt;    when 0xFF # Application Extension&lt;br /&gt;      read_application_extension&lt;br /&gt;    else&lt;br /&gt;      raise 'Not Yet Impl'&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_graphic_control&lt;br /&gt;    b = GIF::GraphicControlExtension.new&lt;br /&gt;    block_size, bits, b.delay_time, b.transparent_index, zero = read_fmt('CCvCC')&lt;br /&gt;    b.disposal_method = 0b111 &amp;amp; (bits &amp;gt;&amp;gt; 2)&lt;br /&gt;    b.user_input_flag = 0 != 0b10 &amp;amp; bits&lt;br /&gt;    transparent_color_flag = 0 != 0b1 &amp;amp; bits&lt;br /&gt;    b.transparent_index = nil unless transparent_color_flag&lt;br /&gt;    b&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_comment_label&lt;br /&gt;    b = GIF::CommentExtension.new&lt;br /&gt;    b.data = read_block_data&lt;br /&gt;    b&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_plain_text&lt;br /&gt;    b = GIF::PlainTextExtension.new&lt;br /&gt;    block_size, b.x, b.y, b.width, b.height,&lt;br /&gt;    b.cell_width, b.cell_height,&lt;br /&gt;    b.fgcolor_index, b.bgcolor_index = read_fmt('CvvvvCCCC')&lt;br /&gt;    b.text = read_block_data&lt;br /&gt;    b&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_application_extension&lt;br /&gt;    b = GIF::ApplicationExtension.new&lt;br /&gt;    block_size, b.app_id, b.auth_code = read_fmt('Ca8a3')&lt;br /&gt;    b.data = read_block_data&lt;br /&gt;    b&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_block_data&lt;br /&gt;    bytes = ''&lt;br /&gt;    loop do&lt;br /&gt;      size = read_fmt('C')[0]&lt;br /&gt;      return bytes if size == 0&lt;br /&gt;      bytes &amp;lt;&amp;lt; read(size)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_image_block&lt;br /&gt;    b = GIF::ImageBlock.new&lt;br /&gt;    b.x, b.y, b.width, b.height, bits = read_fmt('vvvvC')&lt;br /&gt;    lctf = (0 != 0x80 &amp;amp; bits) # local color table flag&lt;br /&gt;    b.interlace_flag = (0 != 0x40 &amp;amp; bits)&lt;br /&gt;    b.sort_flag = (0 != 0x20 &amp;amp; bits)&lt;br /&gt;    lct_size = 2 ** ((0x07 &amp;amp; bits) + 1)&lt;br /&gt;    b.color_table = (0...lct_size).map{ read_fmt('CCC') } if lctf&lt;br /&gt;    b.code_size = read_fmt('C')[0]&lt;br /&gt;    b.data = read_block_data&lt;br /&gt;    b&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read(size)&lt;br /&gt;    bytes = @istream.read(size)&lt;br /&gt;    raise 'End of file' if bytes.nil? &lt;br /&gt;    raise 'Not enough' if bytes.size != size&lt;br /&gt;    bytes&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_fmt(fmt)&lt;br /&gt;    read(pack_size(fmt)).unpack(fmt)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def pack_size(fmt)&lt;br /&gt;    total_size = 0&lt;br /&gt;    item_size = 0&lt;br /&gt;    fmt.scan(/[a-zA-Z]|[0-9]+/).each do |v|&lt;br /&gt;      case v&lt;br /&gt;      when 'C'; item_size = 1&lt;br /&gt;      when 'a'; item_size = 1&lt;br /&gt;      when 'v'; item_size = 2&lt;br /&gt;      when /[0-9]+/&lt;br /&gt;        item_size *= v.to_i - 1&lt;br /&gt;      else&lt;br /&gt;        raise 'Not Yet'&lt;br /&gt;      end&lt;br /&gt;      total_size += item_size&lt;br /&gt;    end&lt;br /&gt;    total_size&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;module GIF::LZW&lt;br /&gt;  MAX_NBITS = 12&lt;br /&gt;&lt;br /&gt;  module_function&lt;br /&gt;  def encode(nbits, istring)&lt;br /&gt;    GIF::LZW::Encoder.encode(nbits, ArrayReader.new(istring), StringIO.new).string&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def decode(nbits, istring)&lt;br /&gt;    GIF::LZW::Decoder.decode(nbits, StringIO.new(istring), StringIO.new).string&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def bit_mask(nbits)&lt;br /&gt;    (1 &amp;lt;&amp;lt; nbits) - 1&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;class GIF::LZW::Dictionary&lt;br /&gt;  attr_reader :clear_code, :end_code&lt;br /&gt;  def initialize(nbits)&lt;br /&gt;    dict_size = 1 &amp;lt;&amp;lt; nbits&lt;br /&gt;    @dict = (0...dict_size).map{|k| [nil, k] }&lt;br /&gt;    @clear_code = dict_size&lt;br /&gt;    @dict &amp;lt;&amp;lt; nil # Clear Code&lt;br /&gt;    @end_code = dict_size + 1&lt;br /&gt;    @dict &amp;lt;&amp;lt; nil # End Code&lt;br /&gt;    @code = {}&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def reset&lt;br /&gt;    @dict.slice!(@end_code + 1, @dict.size)&lt;br /&gt;    @code = {}&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def size&lt;br /&gt;    @dict.size&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def add(w, k)&lt;br /&gt;    new_code = @code[(w &amp;lt;&amp;lt; 8) + k] = @dict.size&lt;br /&gt;    @dict &amp;lt;&amp;lt; [w, k]&lt;br /&gt;    return new_code&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def code(w, k)&lt;br /&gt;    return k unless w&lt;br /&gt;    return @code[(w &amp;lt;&amp;lt; 8) + k]&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def string(code)&lt;br /&gt;    w, k = @dict[code]&lt;br /&gt;    return nil unless k&lt;br /&gt;    return string(w) &amp;lt;&amp;lt; k if w&lt;br /&gt;    return [k]&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;# src[0] : &amp;lt;abcde&amp;gt;    : 11100&lt;br /&gt;# src[1] : &amp;lt;fghij&amp;gt;    : 11000&lt;br /&gt;# src[2] : &amp;lt;klmno&amp;gt;    : 10000&lt;br /&gt;#&lt;br /&gt;# dst[0] : &amp;lt;hijabcde&amp;gt; : 00011100&lt;br /&gt;# dst[1] : &amp;lt;.klmnofg&amp;gt; : 01000011&lt;br /&gt;class GIF::LZW::BitWriter&lt;br /&gt;  attr_reader :stream&lt;br /&gt;&lt;br /&gt;  def initialize(stream)&lt;br /&gt;    @stream = stream&lt;br /&gt;    @value = @nbits = 0&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def write(value, nbits)&lt;br /&gt;    @value |= (GIF::LZW.bit_mask(nbits) &amp;amp; value) &amp;lt;&amp;lt; @nbits&lt;br /&gt;    @nbits += nbits&lt;br /&gt;    while 8 &amp;lt;= @nbits&lt;br /&gt;      @stream.write([0xFF &amp;amp; @value].pack('C'))&lt;br /&gt;      @value &amp;gt;&amp;gt;= 8&lt;br /&gt;      @nbits -= 8&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def flush&lt;br /&gt;    if 0 &amp;lt; @nbits&lt;br /&gt;      @stream.write([0xFF &amp;amp; @value].pack('C'))&lt;br /&gt;      @value = @nbits = 0&lt;br /&gt;    end&lt;br /&gt;    @stream.flush&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;class GIF::LZW::BitReader&lt;br /&gt;  attr_reader :stream&lt;br /&gt;&lt;br /&gt;  def initialize(stream)&lt;br /&gt;    @stream = stream&lt;br /&gt;    @value = @nbits = 0&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read(nbits)&lt;br /&gt;    while @nbits &amp;lt; nbits&lt;br /&gt;      byte = @stream.read(1)&lt;br /&gt;      return nil unless byte&lt;br /&gt;      byte = byte.unpack('C')[0]&lt;br /&gt;      @value |= byte &amp;lt;&amp;lt; @nbits&lt;br /&gt;      @nbits += 8&lt;br /&gt;    end&lt;br /&gt;    v = GIF::LZW.bit_mask(nbits) &amp;amp; @value&lt;br /&gt;    @value &amp;gt;&amp;gt;= nbits&lt;br /&gt;    @nbits -= nbits&lt;br /&gt;    return v&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;class GIF::LZW::ArrayReader&lt;br /&gt;  def initialize(array)&lt;br /&gt;    @array = array&lt;br /&gt;    @pos = 0&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def getc&lt;br /&gt;    if @pos &amp;lt; @array.size&lt;br /&gt;      pos = @pos&lt;br /&gt;      @pos += 1&lt;br /&gt;      return @array[pos]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;class GIF::LZW::Encoder&lt;br /&gt;  # @return ostream&lt;br /&gt;  def self.encode(nbits, istream, ostream)&lt;br /&gt;    encoder = self.new(nbits, istream, ostream)&lt;br /&gt;    encoder.run&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def initialize(nbits, istream, ostream)&lt;br /&gt;    @nbits = nbits&lt;br /&gt;    @istream = istream&lt;br /&gt;    @bit_writer = GIF::LZW::BitWriter.new(ostream)&lt;br /&gt;    @code_size = nbits + 1&lt;br /&gt;    @dict = GIF::LZW::Dictionary.new(@nbits)&lt;br /&gt;    @w = nil&lt;br /&gt;    write_code(@dict.clear_code)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def run&lt;br /&gt;    while k = @istream.getc&lt;br /&gt;      write(k)&lt;br /&gt;    end&lt;br /&gt;    finish&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def write(k)&lt;br /&gt;    if c = @dict.code(@w, k)&lt;br /&gt;      @w = c&lt;br /&gt;      return&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    c = @dict.add(@w, k)&lt;br /&gt;    write_code(@w)&lt;br /&gt;    @w = k&lt;br /&gt;&lt;br /&gt;    return if (1 &amp;lt;&amp;lt; @code_size) != c&lt;br /&gt;&lt;br /&gt;    if @code_size &amp;lt; GIF::LZW::MAX_NBITS&lt;br /&gt;      @code_size += 1&lt;br /&gt;      return&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    write_code(@dict.clear_code)&lt;br /&gt;    @code_size = @nbits + 1&lt;br /&gt;    @dict.reset&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def finish&lt;br /&gt;    write_code(@w) if @w&lt;br /&gt;    write_code(@dict.end_code)&lt;br /&gt;    @bit_writer.flush&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def write_code(code)&lt;br /&gt;    @bit_writer.write(code, @code_size)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;######################################################################&lt;br /&gt;class GIF::LZW::Decoder&lt;br /&gt;  # @return ostream&lt;br /&gt;  def self.decode(nbits, istream, ostream)&lt;br /&gt;    decoder = self.new(nbits, istream, ostream)&lt;br /&gt;    decoder.run&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def initialize(nbits, istream, ostream)&lt;br /&gt;    @nbits = nbits&lt;br /&gt;    @bit_reader = GIF::LZW::BitReader.new(istream)&lt;br /&gt;    @ostream = ostream&lt;br /&gt;    @code_size = nbits + 1&lt;br /&gt;    @dict = GIF::LZW::Dictionary.new(@nbits)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def run&lt;br /&gt;    decode_1st &amp;amp;&amp;amp; while decode_2nd; end&lt;br /&gt;    @ostream.flush&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def decode_1st&lt;br /&gt;    @w = read_code&lt;br /&gt;    @w = read_code while @dict.clear_code == @w&lt;br /&gt;    return nil if @w.nil? || @dict.end_code == @w&lt;br /&gt;    @ws = @dict.string(@w)&lt;br /&gt;    @ostream.write(@ws.pack('C*'))&lt;br /&gt;    true&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def decode_2nd&lt;br /&gt;    @code_size += 1 if @dict.size == (1 &amp;lt;&amp;lt; @code_size) &amp;amp;&amp;amp; @code_size &amp;lt; GIF::LZW::MAX_NBITS&lt;br /&gt;    k = read_code&lt;br /&gt;&lt;br /&gt;    return if k.nil? || @dict.end_code == k&lt;br /&gt;&lt;br /&gt;    if @dict.clear_code == k&lt;br /&gt;      @code_size = @nbits + 1&lt;br /&gt;      @dict.reset&lt;br /&gt;      return decode_1st&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    ks = @dict.string(k)&lt;br /&gt;    ks = @ws + @ws.slice(0, 1) unless ks&lt;br /&gt;    @ostream.write(ks.pack('C*'))&lt;br /&gt;    @dict.add(@w, ks[0])&lt;br /&gt;    @w, @ws = k, ks&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def read_code&lt;br /&gt;    @bit_reader.read(@code_size)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7173820761753586013?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7173820761753586013/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/11/rubygif.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7173820761753586013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7173820761753586013'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/11/rubygif.html' title='RubyでGIFを読んでみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-458422485354547192</id><published>2009-11-19T12:26:00.000+09:00</published><updated>2009-11-19T12:28:37.908+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>LZWをRubyで実装してみた</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;lzw.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#&lt;br /&gt;# LZW Algorithm&lt;br /&gt;#&lt;br /&gt;class Dic&lt;br /&gt;  def initialize&lt;br /&gt;    @dict = (0...256).map{|k| [nil, k]}&lt;br /&gt;    @code = {}&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def add(w, k)&lt;br /&gt;    new_code = @code[(w &amp;lt;&amp;lt; 8) + k] = @dict.size&lt;br /&gt;    @dict &amp;lt;&amp;lt; [w, k]&lt;br /&gt;    return new_code&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def code(w, k)&lt;br /&gt;    return k unless w&lt;br /&gt;    return @code[(w &amp;lt;&amp;lt; 8) + k]&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def string(code)&lt;br /&gt;    w, k = @dict[code]&lt;br /&gt;    return nil unless k&lt;br /&gt;    return string(w) &amp;lt;&amp;lt; k if w&lt;br /&gt;    return [k]&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def encode(input)&lt;br /&gt;  output = []&lt;br /&gt;  dic = Dic.new&lt;br /&gt;  w = nil&lt;br /&gt;  while k = input.shift&lt;br /&gt;    c = dic.code(w, k)&lt;br /&gt;    if c&lt;br /&gt;      w = c&lt;br /&gt;    else&lt;br /&gt;      output &amp;lt;&amp;lt; w&lt;br /&gt;      dic.add(w, k)&lt;br /&gt;      w = k&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  output &amp;lt;&amp;lt; w if w&lt;br /&gt;  return output&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def decode(input)&lt;br /&gt;  output = []&lt;br /&gt;  dic = Dic.new&lt;br /&gt;  w = input.shift&lt;br /&gt;  return output unless w&lt;br /&gt;  ws = dic.string(w)&lt;br /&gt;  ws.each{|v| output &amp;lt;&amp;lt; v}&lt;br /&gt;  while k = input.shift&lt;br /&gt;    ks = dic.string(k)&lt;br /&gt;    ks = ws + ws.slice(0, 1) unless ks&lt;br /&gt;    ks.each{|v| output &amp;lt;&amp;lt; v}&lt;br /&gt;    dic.add(w, ks[0])&lt;br /&gt;    w, ws = k, ks&lt;br /&gt;  end&lt;br /&gt;  return output&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;encode([0,1,0,1,0,1,0,1]) # =&amp;gt; [0, 1, 256, 258, 1]&lt;br /&gt;decode([0,1,256,258,1])   # =&amp;gt; [0, 1, 0, 1, 0, 1, 0, 1]&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-458422485354547192?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/458422485354547192/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/11/lzwruby.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/458422485354547192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/458422485354547192'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/11/lzwruby.html' title='LZWをRubyで実装してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5572254251919809942</id><published>2009-10-14T11:01:00.016+09:00</published><updated>2009-11-18T23:34:28.565+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerLanguage'/><title type='text'>不等号演算を論理積でつなげてみた</title><content type='html'>&lt;pre class="mycodeB"&gt;if A &amp;lt; B &amp;lt; C&lt;br /&gt;  # 本体&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;こんな条件式を書けたら素敵じゃない？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;処理の流れは、&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Aを評価して(a)に保存する&lt;/li&gt;&lt;li&gt;Bを評価して(b)に保存する&lt;/li&gt;&lt;li&gt;(a) &lt; (b) を評価してfalseなら終了&lt;/li&gt;&lt;li&gt;Cを評価して(c)に保存する&lt;/li&gt;&lt;li&gt;(b) &lt; (c) を評価してtrueなら本体を実行&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;とする。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rubyで書くとこんな感じ↓&lt;pre class="mycodeB"&gt;a = A&lt;br /&gt;b = B&lt;br /&gt;if a &amp;lt; b&lt;br /&gt;  c = C&lt;br /&gt;  if b &amp;lt; c&lt;br /&gt;    # 本体&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Bの評価を1回だけ行うところがミソ。&lt;/div&gt;&lt;div&gt;こんな風に書けたら便利だと思う。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ところで、&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeB"&gt;A &amp;lt; B &amp;lt; C&lt;br /&gt;A &amp;lt; B &amp;lt;= C&lt;br /&gt;A &amp;lt;= B &amp;lt; C&lt;br /&gt;A &amp;lt;= B &amp;lt;= C&lt;br /&gt;A &amp;gt; B &amp;gt; C&lt;br /&gt;A &amp;gt; B &amp;gt;= C&lt;br /&gt;A &amp;gt;= B &amp;gt; C&lt;br /&gt;A &amp;gt;= B &amp;gt;= C&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これらの組み合わせは、並び順が大小関係になっているので認識しやすいと思う。&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;一方、&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;pre class="mycodeB"&gt;A &amp;gt; B &amp;amp;&amp;amp; B &amp;lt; C → A &amp;gt; B &amp;lt; C&lt;br /&gt;A &amp;gt; B &amp;amp;&amp;amp; B &amp;lt; C → A &amp;gt; B &amp;lt; C &lt;br /&gt;A &amp;lt; B &amp;amp;&amp;amp; B &amp;lt; C &amp;amp;&amp;amp; C &amp;gt; D &amp;amp;&amp;amp; D &amp;lt; E → A &amp;lt; B &amp;lt; C &amp;gt; D &amp;lt; E&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;こんなのもあったら便利かな？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2項演算子は左辺のオブジェクトのメソッド呼び出しだから、記述できても何ら不都合はないはず。&lt;/div&gt;&lt;div&gt;むしろHaskellのモナドみたいで面白いかもしれないね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeB"&gt;a = A&lt;br /&gt;b = B&lt;br /&gt;if a &amp;lt; b&lt;br /&gt;  c = C&lt;br /&gt;  if b &amp;lt; c&lt;br /&gt;    d = D&lt;br /&gt;    if c &amp;gt; d&lt;br /&gt;      e = E&lt;br /&gt;      d &amp;lt; e # 最後の条件判定の結果は使われていないのでif文を省略&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5572254251919809942?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5572254251919809942/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/10/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5572254251919809942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5572254251919809942'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/10/blog-post.html' title='不等号演算を論理積でつなげてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-188138596227546602</id><published>2009-10-11T03:47:00.003+09:00</published><updated>2009-10-11T03:58:07.657+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><title type='text'>Mac版 Google Chrome使ってみた</title><content type='html'>バージョンは4.0.221.8&lt;br /&gt;&lt;div&gt;いつもの散歩コースに出てみたけれど&lt;/div&gt;&lt;div&gt;バグっぽい挙動には出会わなかった。&lt;/div&gt;&lt;div&gt;YouTubeも表示できてるし、&lt;a href="http://benfirshman.com/projects/jsnes/"&gt;JSNES&lt;/a&gt;のドンキーコングも動かせた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;不満はMicrosoft Wireless Mouse 5000についている「戻る」と「進む」のボタンが使えないことぐらいかな。ショートカットキーは同じなのに、なぜ？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まぁ、もうしばらく使ってみよう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-188138596227546602?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/188138596227546602/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/10/mac-google-chrome.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/188138596227546602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/188138596227546602'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/10/mac-google-chrome.html' title='Mac版 Google Chrome使ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1473002256623372215</id><published>2009-09-21T01:24:00.004+09:00</published><updated>2009-09-21T01:36:12.416+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Treetop - RubyのPEG</title><content type='html'>&lt;div&gt;これは面白いかも&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" color: rgb(196, 89, 0); line-height: 27px; font-family:'Lucida Grande', Geneva, Arial, Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;a href="http://treetop.rubyforge.org/"&gt;&lt;span class="Apple-style-span"  style="color:#C45900;"&gt;Treetop&lt;/span&gt;&lt;/a&gt; is a language for describing languages. Combining the elegance of Ruby with cutting-edge &lt;/span&gt;&lt;em&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;parsing expression grammars&lt;/span&gt;&lt;/em&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, it helps you analyze syntax with revolutionarily ease.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Treetopは言語を記述するための言語だ。Rubyの簡潔さと最先端のParsing Expression Grammarを融合させたもので、構文解析を革新的に容易にする。&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://treetop.rubyforge.org/"&gt;http://treetop.rubyforge.org/&lt;/a&gt;&lt;/div&gt;&lt;a href="http://treetop.rubyforge.org/syntactic_recognition.html"&gt;http://treetop.rubyforge.org/syntactic_recognition.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1473002256623372215?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1473002256623372215/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/treetop-rubypeg.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1473002256623372215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1473002256623372215'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/treetop-rubypeg.html' title='Treetop - RubyのPEG'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-9094814280956398475</id><published>2009-09-16T14:25:00.000+09:00</published><updated>2009-09-16T14:26:39.830+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Rubyでwithしてみた</title><content type='html'>VBで評価の高いWithをRubyで。&lt;div&gt;とっても簡単。&lt;/div&gt;&lt;div&gt;あらためてRubyすごいなぁ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;sample.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;def with(instance, &amp;amp;block)&lt;br /&gt;  instance.instance_eval(&amp;amp;block)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Hello&lt;br /&gt;  def say&lt;br /&gt;    puts 'hello world'&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;with(Hello.new) do&lt;br /&gt;  say&lt;br /&gt;  say&lt;br /&gt;  say&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-9094814280956398475?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/9094814280956398475/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/rubywith.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/9094814280956398475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/9094814280956398475'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/rubywith.html' title='Rubyでwithしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8152110588944270805</id><published>2009-09-03T17:02:00.009+09:00</published><updated>2009-09-03T17:10:56.407+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>Flash Lite 1.1 で関数</title><content type='html'>&lt;div&gt;言語で関数を定義することはできないけれど&lt;/div&gt;&lt;div&gt;通常は再生されないフレームにアクションを書いて&lt;/div&gt;&lt;div&gt;call(フレーム名) とする方法が使われる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;しかし、これは関数と言うよりはサブルーチンだ。&lt;/div&gt;&lt;div&gt;普通は再帰呼び出しすることはできない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;「それじゃ、引数や返り値の受け渡しのためにスタックを実装すれば、関数になるのでは？」&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;と思って作ってみた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;いろいろな実装方法が考えられるけれど、とりあえず次のようなルールとする。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;関数への引数は、関数を呼び出す側でスタックに積む。&lt;/li&gt;&lt;li&gt;関数はスタックを参照して引数を得る。&lt;/li&gt;&lt;li&gt;関数は返り値をスタックに積む。&lt;/li&gt;&lt;li&gt;関数呼び出しの後に引数と返り値をスタックから取り除くのは、関数を呼び出す側の責任。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;ルートムービークリップのフレーム1のアクション&lt;/pre&gt;&lt;pre class="mycodeB"&gt;sp = -1; // スタックポインタの初期化&lt;br /&gt;&lt;br /&gt;// 引数をスタックに積む&lt;br /&gt;++sp;&lt;br /&gt;eval( "s" add sp ) = 12;&lt;br /&gt;&lt;br /&gt;call ( "fact" ); // 関数呼び出し&lt;br /&gt;&lt;br /&gt;// 答えをスタックから取り除く&lt;br /&gt;r = eval ( "s" add sp );&lt;br /&gt;--sp;&lt;br /&gt;&lt;br /&gt;trace ( r ); // 確認&lt;br /&gt;&lt;br /&gt;stop();&lt;/pre&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;ルートムービークリップのフレーム2のアクション&lt;/pre&gt;&lt;pre class="mycodeB"&gt;// 階乗を計算する関数&lt;br /&gt;n = eval ( "s" add sp );&lt;br /&gt;if ( n == 0 ) {&lt;br /&gt;  eval ( "s" add sp ) = 1; // 引数をスタックから取り除き、答えをスタックに積む。つまりspは変化しない。&lt;br /&gt;} else {&lt;br /&gt;  // 引数をスタックに積む&lt;br /&gt;  ++sp;&lt;br /&gt;  eval ( "s" add sp ) = n - 1;&lt;br /&gt;  call ( "fact" );&lt;br /&gt;  r = eval ( "s" add sp ); // 関数の答えを取得する。&lt;br /&gt;  --sp; // スタックポインタを戻す&lt;br /&gt;  n = eval ( "s" add sp ); // n は再帰呼び出しで変化してるので復帰させる。&lt;br /&gt;  eval ( "s" add sp ) = r * n; // 引数をスタックから取り除き、答えをスタックに積む。つまりspは変化しない。&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;最後にルートムービークリップのフレーム2に名前"fact"をつけてプレビュー。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;479001600&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;12!(12の階乗)を計算できた。&lt;/div&gt;&lt;div&gt;関数できた。&lt;/div&gt;&lt;div&gt;・・・かなり面倒だな。&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8152110588944270805?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8152110588944270805/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11_926.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8152110588944270805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8152110588944270805'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11_926.html' title='Flash Lite 1.1 で関数'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6296866510974954828</id><published>2009-09-03T16:03:00.002+09:00</published><updated>2009-09-03T16:05:30.889+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>Flash Lite 1.1でカレンダー計算:前の日を求める</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;prevday.as&lt;/pre&gt;&lt;pre class="mycodeB"&gt;// 前の日の日付を計算する&lt;br /&gt;//&lt;br /&gt;// @param a0 ... 西暦年 (例: 2009 )&lt;br /&gt;// @param a1 ... 月 (1?12)&lt;br /&gt;// @param a2 ... 日 (1?31)&lt;br /&gt;//&lt;br /&gt;// @return a0 ... 西暦年 (例: 2009 )&lt;br /&gt;// @return a1 ... 月 (1?12)&lt;br /&gt;// @return a2 ... 日 (1?31)&lt;br /&gt;//&lt;br /&gt;--a2;&lt;br /&gt;if (0 &amp;gt;= a2) {&lt;br /&gt;  switch (a1) {&lt;br /&gt;  case 1:&lt;br /&gt;    a0 -= 1; a1 = 12; a2 = 31;&lt;br /&gt;    break;&lt;br /&gt;  case 2:&lt;br /&gt;  case 4:&lt;br /&gt;  case 6:&lt;br /&gt;  case 8:&lt;br /&gt;  case 9:&lt;br /&gt;  case 11:&lt;br /&gt;    --a1; a2 = 31;&lt;br /&gt;    break;&lt;br /&gt;  case 3:&lt;br /&gt;    a1 = 2;&lt;br /&gt;    if ((a0 % 4 == 0 &amp;amp;&amp;amp; a0 % 100 != 0) || (a0 % 400 == 0)) { // 閏年&lt;br /&gt;      a2 = 29;&lt;br /&gt;    } else {&lt;br /&gt;      a2 = 28;&lt;br /&gt;    }  &lt;br /&gt;    break;&lt;br /&gt;  case 5:&lt;br /&gt;  case 7:&lt;br /&gt;  case 10:&lt;br /&gt;  case 12:&lt;br /&gt;    --a1; a2 = 30;&lt;br /&gt;    break;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6296866510974954828?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6296866510974954828/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11_8303.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6296866510974954828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6296866510974954828'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11_8303.html' title='Flash Lite 1.1でカレンダー計算:前の日を求める'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7480164208094882469</id><published>2009-09-03T16:02:00.002+09:00</published><updated>2009-09-03T16:05:22.074+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>Flash Lite 1.1でカレンダー計算:次の日を求める</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;nextday.as&lt;/pre&gt;&lt;pre class="mycodeB"&gt;// 次の日の日付を計算する&lt;br /&gt;//&lt;br /&gt;// @param a0 ... 西暦年 (例: 2009 )&lt;br /&gt;// @param a1 ... 月 (1?12)&lt;br /&gt;// @param a2 ... 日 (1?31)&lt;br /&gt;//&lt;br /&gt;// @return a0 ... 西暦年 (例: 2009 )&lt;br /&gt;// @return a1 ... 月 (1?12)&lt;br /&gt;// @return a2 ... 日 (1?31)&lt;br /&gt;//&lt;br /&gt;++a2;&lt;br /&gt;switch (a1) {&lt;br /&gt;case 1:&lt;br /&gt;case 3:&lt;br /&gt;case 5:&lt;br /&gt;case 7:&lt;br /&gt;case 8:&lt;br /&gt;case 10:&lt;br /&gt;  if (31 &amp;lt; a2) { ++a1; a2 = 1; }&lt;br /&gt;  break;&lt;br /&gt;case 2:&lt;br /&gt;  if ((a0 % 4 == 0 &amp;amp;&amp;amp; a0 % 100 != 0) || (a0 % 400 == 0)) { // 閏年&lt;br /&gt;    if (29 &amp;lt; a2) { ++a1; a2 = 1; }&lt;br /&gt;  } else {&lt;br /&gt;    if (28 &amp;lt; a2) { ++a1; a2 = 1; }&lt;br /&gt;  }&lt;br /&gt;  break;&lt;br /&gt;case 4:&lt;br /&gt;case 6:&lt;br /&gt;case 9:&lt;br /&gt;case 11:&lt;br /&gt;  if (30 &amp;lt; a2) { ++a1; a2 = 1; }&lt;br /&gt;  break;&lt;br /&gt;case 12:&lt;br /&gt;  if (31 &amp;lt; a2) { ++a0; a1 = 1; a2 = 1; }&lt;br /&gt;  break;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7480164208094882469?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7480164208094882469/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11_03.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7480164208094882469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7480164208094882469'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11_03.html' title='Flash Lite 1.1でカレンダー計算:次の日を求める'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-788049406598424727</id><published>2009-09-03T16:01:00.002+09:00</published><updated>2009-09-03T16:04:58.769+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>Flash Lite 1.1でカレンダー計算:曜日を求める</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;weekday.as&lt;/pre&gt;&lt;pre class="mycodeB"&gt;// 日付から曜日を求める&lt;br /&gt;//&lt;br /&gt;// @param a0 ... 西暦年 (例: 2009)&lt;br /&gt;// @param a1 ... 月 (1?12)&lt;br /&gt;// @param a2 ... 日 (1?31)&lt;br /&gt;//&lt;br /&gt;// @return r0 ... 0?6 {0:日曜, 1:月曜, ... , 6:土曜}&lt;br /&gt;//&lt;br /&gt;if (2 &amp;gt;= a1) { // 1月と2月は前年の13月と14月と見なす&lt;br /&gt;  --a0;&lt;br /&gt;  a1 += 12;&lt;br /&gt;}&lt;br /&gt;// Zellerの公式の変形式&lt;br /&gt;r0 = (a0+int(a0/4)-int(a0/100)+int(a0/400)+int((13*a1+8)/5)+a2)%7;&lt;br /&gt;if (12 &amp;lt; a1) { // 13月と14月を元に戻す&lt;br /&gt;  ++a0;&lt;br /&gt;  a1 -= 12;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-788049406598424727?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/788049406598424727/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/788049406598424727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/788049406598424727'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/flash-lite-11.html' title='Flash Lite 1.1でカレンダー計算:曜日を求める'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6672864751934045770</id><published>2009-09-03T12:00:00.005+09:00</published><updated>2009-09-03T12:08:40.372+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>SWF4でevalする時のTips</title><content type='html'>&lt;div&gt;&lt;div&gt;Flash CS4で作成したSWF4のバイトコードを読んでみた。&lt;/div&gt;&lt;div&gt;SWF4はFlash Lite 1.1で作成したプロジェクトの出力フォーマット。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ActionScriptで&lt;/div&gt;&lt;pre class="mycodeB"&gt;eval(varInstName).varname = "value";&lt;/pre&gt;&lt;div&gt;このコードは、次のようなバイトコードになる。&lt;/div&gt;&lt;pre class="mycodeB"&gt;1: ActionPush "varInstName"&lt;br /&gt;2: ActionGetVariable&lt;br /&gt;3: ActionPush ":"&lt;br /&gt;4: ActionStringAdd&lt;br /&gt;5: ActionPush "varname"&lt;br /&gt;6: ActionStringAdd&lt;br /&gt;7: ActionPush "value"&lt;br /&gt;8: ActionSetVariable&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;一方、&lt;/div&gt;&lt;pre class="mycodeB"&gt;eval(varInstName add ":varname") = "value";&lt;/pre&gt;&lt;div&gt;同じ効果を持つこのコードは、&lt;/div&gt;&lt;pre class="mycodeB"&gt;1: ActionPush "varInstName"&lt;br /&gt;2: ActionGetVariable&lt;br /&gt;3: ActionPush ":varname"&lt;br /&gt;4: ActionStringAdd&lt;br /&gt;5: ActionPush "value"&lt;br /&gt;6: ActionSetVariable&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;にコンパイルされるので、":"と"varname"をActionStringAddするコードを1つにできて、swfのバイトコードを6バイト減量できる。&lt;/div&gt;&lt;div&gt;命令数も減るので運がよければ速くなるかも。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに、&lt;/div&gt;&lt;pre class="mycodeB"&gt;eval("/InstName:varname") = "value";&lt;/pre&gt;&lt;div&gt;と&lt;/div&gt;&lt;pre class="mycodeB"&gt;_root.InstName.varname = "value";&lt;/pre&gt;&lt;div&gt;は、同じバイトコードを出力し、&lt;/div&gt;&lt;pre class="mycodeB"&gt;1: ActionPush "/InstName:varname"&lt;br /&gt;2: ActionPush "value"&lt;br /&gt;3: ActionSetVariable&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;だった。&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6672864751934045770?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6672864751934045770/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/swf4evaltips.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6672864751934045770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6672864751934045770'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/swf4evaltips.html' title='SWF4でevalする時のTips'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8554865324600010122</id><published>2009-09-02T00:51:00.009+09:00</published><updated>2009-09-02T01:17:30.303+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Zellerの公式</title><content type='html'>まぁ普通は&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F"&gt;Zellerの公式&lt;/a&gt;使ってすっきり書くのでしょうねぇ・・・&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;weekday.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;# 曜日を求める&lt;br /&gt;# y ... 西暦年&lt;br /&gt;# m ... 月&lt;br /&gt;# d ... 日&lt;br /&gt;def weekday(y, m, d)&lt;br /&gt;  if 2 &gt;= m&lt;br /&gt;    y -= 1&lt;br /&gt;    m += 12&lt;br /&gt;  end&lt;br /&gt;  (y + (y / 4) - (y / 100) + (y / 400) + (13 * m + 8) / 5 + d) % 7&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;require 'date'&lt;br /&gt;&lt;br /&gt;def check&lt;br /&gt;  d = Date.new(2000, 1, 1)&lt;br /&gt;  50000.times do&lt;br /&gt;    unless d.wday == weekday(d.year, d.month, d.day)&lt;br /&gt;      puts "#{d} ng"&lt;br /&gt;      break&lt;br /&gt;    end&lt;br /&gt;    d = d.next&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;check&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8554865324600010122?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8554865324600010122/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/zeller.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8554865324600010122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8554865324600010122'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/zeller.html' title='Zellerの公式'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2694455941621308599</id><published>2009-09-01T23:44:00.002+09:00</published><updated>2009-09-01T23:47:18.380+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>曜日を計算する関数を作ってみた</title><content type='html'>カレンダーライブラリが使えない環境で任意の日付の曜日を求める必要があったので、いろいろごちゃごちゃやっている間に何となくできた関数。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;weekday.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;# 曜日を求める&lt;br /&gt;# y ... 西暦年&lt;br /&gt;# m ... 月&lt;br /&gt;# d ... 日&lt;br /&gt;def weekday(y, m, d)&lt;br /&gt;  ms = [ 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 ]&lt;br /&gt;  x = y&lt;br /&gt;  if 2 &amp;gt;= m&lt;br /&gt;    y -= 1&lt;br /&gt;  end&lt;br /&gt;  (x + (y / 4) - (y / 100) + (y / 400) + ms[m-1] + (d-1)) % 7&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;require 'date'&lt;br /&gt;&lt;br /&gt;def check&lt;br /&gt;  d = Date.new(2000, 1, 1)&lt;br /&gt;  50000.times do&lt;br /&gt;    unless d.wday == weekday(d.year, d.month, d.day)&lt;br /&gt;      puts &amp;quot;#{d} ng&amp;quot;&lt;br /&gt;      break&lt;br /&gt;    end&lt;br /&gt;    d = d.next&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;check&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2694455941621308599?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2694455941621308599/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/09/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2694455941621308599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2694455941621308599'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/09/blog-post.html' title='曜日を計算する関数を作ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6682310222312552524</id><published>2009-08-21T16:08:00.002+09:00</published><updated>2009-08-21T16:10:50.751+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript'/><title type='text'>QRコードをAS3とかJavaScriptとかで実装したライブラリ</title><content type='html'>&lt;div&gt;これは便利かも。&lt;/div&gt;&lt;a href="http://www.d-project.com/flex/003_QRCode/"&gt;AS3&lt;/a&gt;と&lt;a href="http://www.d-project.com/qrcode/index.html"&gt;JavaScript&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6682310222312552524?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6682310222312552524/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/qras3javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6682310222312552524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6682310222312552524'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/qras3javascript.html' title='QRコードをAS3とかJavaScriptとかで実装したライブラリ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8929606558466600087</id><published>2009-08-21T00:49:00.003+09:00</published><updated>2009-08-21T00:57:42.857+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>virtualboxの仮想HDDをwritethroughにしてみた</title><content type='html'>&lt;div&gt;VirtualBoxの仮想HDDは3つのモードがある。&lt;/div&gt;&lt;div&gt;GUIでは操作できないみたいだけど、コマンドラインで簡単に変更できる。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;普通のモード&lt;/li&gt;&lt;li&gt;スナップショットを作成できないモード&lt;/li&gt;&lt;li&gt;再起動するともとに戻るモード&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;VBoxManage modifyhd &lt;vdiをfull&gt; --type [normal|writethrough|immutable]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;仮想化したときのメリットとして、なんでも試してみて気に入らなければ気軽にロールバックしちゃうなんて使い方がある。&lt;/div&gt;&lt;div&gt;でも、ホームディレクトリなんかはロールバックしちゃったらもったいない状況も多々ある訳で、そんなときにスナップショットを作成できないモードにしておく。writethroughモード。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8929606558466600087?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8929606558466600087/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/virtualboxhddwritethrough.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8929606558466600087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8929606558466600087'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/virtualboxhddwritethrough.html' title='virtualboxの仮想HDDをwritethroughにしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1550995324213009734</id><published>2009-08-19T17:52:00.001+09:00</published><updated>2009-08-19T17:53:36.786+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>SELinuxのせいでreadline.soをロード失敗してみた</title><content type='html'>&lt;div&gt;CentOS 5.2 で ruby-1.8.7-p174 をビルド＆インストールした時のこと。&lt;/div&gt;&lt;div&gt;irb -rirb/completionしたら下記のエラー。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;/usr/local/lib/ruby/1.8/i686-linux/readline.so: /usr/local/lib/ruby/1.8/i686-linux/readline.so: cannot restore segment prot after reloc: Permission denied - /usr/local/lib/ruby/1.8/i686-linux/readline.so (LoadError)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これはSELinuxの設定が原因。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ls -lZ /usr/local/lib/ruby/1.8/i686-linux/*.so&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;してみたところ、&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-rwxr-xr-x 1 user_u:object_r:lib_t            root root  116642  8月 19 17:14 readline.so&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とのこと。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;chcon system_u:object_r:textrel_shlib_t zlib.so&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このコマンドを実行して設定を正しくする。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-rwxr-xr-x 1 system_u:object_r:textrel_shlib_t root root  116642  8月 19 17:14 readline.so&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1550995324213009734?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1550995324213009734/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/selinuxreadlineso.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1550995324213009734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1550995324213009734'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/selinuxreadlineso.html' title='SELinuxのせいでreadline.soをロード失敗してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8408489059735949609</id><published>2009-08-07T02:48:00.000+09:00</published><updated>2009-08-17T15:51:04.514+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>壁のばし方で迷路を作ってみた</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;maze.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#!/usr/bin/env ruby&lt;br /&gt;# -*- encoding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'win32console'&lt;br /&gt;require 'term/ansicolor'&lt;br /&gt;&lt;br /&gt;include Win32::Console::ANSI&lt;br /&gt;include Term::ANSIColor&lt;br /&gt;&lt;br /&gt;class Maze&lt;br /&gt;  PATHWAY = 1&lt;br /&gt;  WALL = 2&lt;br /&gt;&lt;br /&gt;  attr_accessor :width, :height&lt;br /&gt;&lt;br /&gt;  def initialize(width, height)&lt;br /&gt;    @width = width * 2 + 1&lt;br /&gt;    @height = height * 2 + 1&lt;br /&gt;    @map = [ PATHWAY ] * @width * @height&lt;br /&gt;    @console = Win32::Console.new(STD_OUTPUT_HANDLE)&lt;br /&gt;&lt;br /&gt;    prologue&lt;br /&gt;    dig&lt;br /&gt;    epilogue&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def prologue&lt;br /&gt;    @console.Cls&lt;br /&gt;    print on_white&lt;br /&gt;    dig_edge&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def epilogue&lt;br /&gt;    print reset&lt;br /&gt;    @console.Cursor(0, 1)&lt;br /&gt;    print ' '&lt;br /&gt;    @console.Cursor(@width - 1, @height - 2)&lt;br /&gt;    print ' '&lt;br /&gt;    @console.Cursor(0, @height + 1)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def dig&lt;br /&gt;    loop do&lt;br /&gt;      w0, w1 = select_next&lt;br /&gt;      break unless w0&lt;br /&gt;      set_wall(*w0)&lt;br /&gt;      set_wall(*w1)&lt;br /&gt;      loop do&lt;br /&gt;        w0, w1 = candidates(*w1)&lt;br /&gt;        break unless w0&lt;br /&gt;        set_wall(*w0)&lt;br /&gt;        set_wall(*w1)&lt;br /&gt;        sleep 0&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def select_next&lt;br /&gt;    r = walls&lt;br /&gt;    loop do&lt;br /&gt;      i = rand(r.size)&lt;br /&gt;      x, y = r[i]&lt;br /&gt;      r.delete_at(i)&lt;br /&gt;      z = candidates(x, y)&lt;br /&gt;      return z if z&lt;br /&gt;      break if r.empty?&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def candidates(x, y)&lt;br /&gt;    c = []&lt;br /&gt;    f0(c, x + 1, y, x + 2, y)&lt;br /&gt;    f0(c, x - 1, y, x - 2, y)&lt;br /&gt;    f0(c, x, y + 1, x, y + 2)&lt;br /&gt;    f0(c, x, y - 1, x, y - 2)&lt;br /&gt;    c[rand(c.size)] unless c.empty?&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def f0(z, x, y, x1, x2)&lt;br /&gt;    if PATHWAY == self[x1, x2]&lt;br /&gt;      z &amp;lt;&amp;lt; [ [x, y], [x1, x2] ]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def walls&lt;br /&gt;    r = []&lt;br /&gt;    0.step(@height - 1, 2) do |y|&lt;br /&gt;      0.step(@width - 1, 2) do |x|&lt;br /&gt;        r &amp;lt;&amp;lt; [x, y] if WALL == self[x, y]&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    r&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def dig_edge&lt;br /&gt;    x = @width - 1&lt;br /&gt;    @height.times do |y|&lt;br /&gt;      set_wall(0, y)&lt;br /&gt;      set_wall(x, y)&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    y = @height - 1&lt;br /&gt;    @width.times do |x|&lt;br /&gt;      set_wall(x, 0)&lt;br /&gt;      set_wall(x, y)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def set_wall(x, y)&lt;br /&gt;    @map[x + y * @width] = WALL&lt;br /&gt;    @console.Cursor(x, y)&lt;br /&gt;    print ' '&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def [](x, y)&lt;br /&gt;    return nil if x &amp;lt; 0 || @width &amp;lt;= x&lt;br /&gt;    return nil if y &amp;lt; 0 || @height &amp;lt;= y&lt;br /&gt;    @map[x + y * @width]&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;m = Maze.new(39, 30)&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;参考: &lt;a href="http://www5d.biglobe.ne.jp/~stssk/maze/make.html"&gt;自動生成迷路&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8408489059735949609?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8408489059735949609/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/blog-post_17.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8408489059735949609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8408489059735949609'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/blog-post_17.html' title='壁のばし方で迷路を作ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1681848190026904229</id><published>2009-08-05T23:46:00.003+09:00</published><updated>2009-08-05T23:49:43.561+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>穴掘り法で迷路を作ってみた</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;maze.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#!/usr/bin/env ruby&lt;br /&gt;# -*- encoding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'win32console'&lt;br /&gt;require 'term/ansicolor'&lt;br /&gt;&lt;br /&gt;include Win32::Console::ANSI&lt;br /&gt;include Term::ANSIColor&lt;br /&gt;&lt;br /&gt;class Maze&lt;br /&gt;  OUTSIDE = -1&lt;br /&gt;  PATHWAY = 0&lt;br /&gt;  WALL = 1&lt;br /&gt;&lt;br /&gt;  def initialize(width, height)&lt;br /&gt;    @console = Win32::Console.new(STD_OUTPUT_HANDLE)&lt;br /&gt;    @width = width * 2 + 1&lt;br /&gt;    @height = height * 2 + 1&lt;br /&gt;    @data = [WALL] * @width * @height&lt;br /&gt;    draw_bg&lt;br /&gt;    dig&lt;br /&gt;    finish&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def finish&lt;br /&gt;    @console.Cursor(0, 1)&lt;br /&gt;    print ' '&lt;br /&gt;    @console.Cursor(@width + 1, @height)&lt;br /&gt;    print ' '&lt;br /&gt;    @console.Cursor(0, @height + 1)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def dig&lt;br /&gt;    x = rand(@width / 2) * 2&lt;br /&gt;    y = rand(@height / 2) * 2&lt;br /&gt;    loop do&lt;br /&gt;      dig_path(x, y)&lt;br /&gt;      r = select_next(x, y)&lt;br /&gt;      break unless r&lt;br /&gt;      set_pathway(*r[0])&lt;br /&gt;      x, y = r[1]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def select_next(x, y)&lt;br /&gt;    r = walk(x, y)&lt;br /&gt;    until r.empty?&lt;br /&gt;      i = rand(r.size)&lt;br /&gt;      x, y = r[i]&lt;br /&gt;      r.delete_at(i)&lt;br /&gt;      s = candidates(x, y)&lt;br /&gt;      return s[rand(s.size)] unless s.empty?&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def walk(tx, ty, x = nil, y = nil, fx = nil, fy = nil, r = [])&lt;br /&gt;    return if fx == tx &amp;amp;&amp;amp; fy == ty&lt;br /&gt;    return if PATHWAY != self[tx, ty]&lt;br /&gt;    r &amp;lt;&amp;lt; [tx, ty] if tx % 2 == 0 &amp;amp;&amp;amp; ty % 2 == 0&lt;br /&gt;    walk(tx + 1, ty, tx, ty, x, y, r)&lt;br /&gt;    walk(tx - 1, ty, tx, ty, x, y, r)&lt;br /&gt;    walk(tx, ty + 1, tx, ty, x, y, r)&lt;br /&gt;    walk(tx, ty - 1, tx, ty, x, y, r)&lt;br /&gt;    r&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def dig_path(x, y)&lt;br /&gt;    set_pathway(x, y)&lt;br /&gt;    loop do&lt;br /&gt;      s = candidates(x, y)&lt;br /&gt;      break if s.empty?&lt;br /&gt;      s = s[rand(s.size)]&lt;br /&gt;      set_pathway(*s[0])&lt;br /&gt;      set_pathway(*s[1])&lt;br /&gt;      x, y = s[1]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def candidates(x, y)&lt;br /&gt;    r = []&lt;br /&gt;    try_dig(x, y, 1, 0, r)&lt;br /&gt;    try_dig(x, y, -1, 0, r)&lt;br /&gt;    try_dig(x, y, 0, 1, r)&lt;br /&gt;    try_dig(x, y, 0, -1, r)&lt;br /&gt;    r&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def try_dig(x, y, dx, dy, r)&lt;br /&gt;    x += dx&lt;br /&gt;    y += dy&lt;br /&gt;    s = x + dx&lt;br /&gt;    t = y + dy&lt;br /&gt;    if WALL == self[s, t]&lt;br /&gt;      r &amp;lt;&amp;lt; [[x, y], [s, t]]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def [](x, y)&lt;br /&gt;    return OUTSIDE if x &amp;lt; 0 || @width &amp;lt;= x&lt;br /&gt;    return OUTSIDE if y &amp;lt; 0 || @height &amp;lt;= y&lt;br /&gt;    @data[x + y * @width]&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def set_pathway(x, y)&lt;br /&gt;    @data[x + y * @width] = PATHWAY&lt;br /&gt;    @console.Cursor(x + 1, y + 1)&lt;br /&gt;    print ' '&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def draw_bg&lt;br /&gt;    @console.Cls&lt;br /&gt;    (@height + 2).times do&lt;br /&gt;      print on_white&lt;br /&gt;      print ' ' * (@width + 2)&lt;br /&gt;      print reset&lt;br /&gt;      puts&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#Maze.new(38, 30)&lt;br /&gt;Maze.new(10, 10)&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;参考: &lt;a href="http://www5d.biglobe.ne.jp/~stssk/maze/make.html"&gt;自動生成迷路&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1681848190026904229?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1681848190026904229/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/blog-post_05.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1681848190026904229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1681848190026904229'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/blog-post_05.html' title='穴掘り法で迷路を作ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3283062084712301080</id><published>2009-08-05T12:00:00.002+09:00</published><updated>2009-08-05T12:11:38.653+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>PassengerTempDirを設定したほうが幸せ？</title><content type='html'>Apache + PassengerをCentOS 5.2で稼働させているのだけれど、たまに、落ちる。&lt;div&gt;Apacheのerror_logには&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The spawn server has exited unexpectedly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とか&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Exception Errno::ENOENT in PhusionPassenger::Rack::ApplicationSpawner (No such file or directory ...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;と記録されている。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;/tmp/passenger.????&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;を見てみたら・・・あれ？なんだかキレイ・・・&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;/tmpなのでファイルを消されちゃっても文句は言えないのかも？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ってなわけで、httpd.conf で PassengerTempDir を勝手にいじられるはずがないところに変更してみた。&lt;/div&gt;&lt;div&gt;この設定でしばらく様子を見てみよう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;せっかくなので、PassengerTempDirは、アプリと同じパーティションのディレクトリを指定。&lt;/div&gt;&lt;div&gt;ファイルアップロードでコピーじゃなくてリネームを使えるかも～？&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3283062084712301080?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3283062084712301080/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/passengertempdir.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3283062084712301080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3283062084712301080'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/passengertempdir.html' title='PassengerTempDirを設定したほうが幸せ？'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7107286475610009074</id><published>2009-08-04T14:36:00.000+09:00</published><updated>2009-08-04T14:39:58.889+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>エラーハンドリングフレームワーク</title><content type='html'>&lt;a href="http://ml.tietew.jp/cppll/cppll/article/13411"&gt;[cppll:13411] エラーハンドリングフレームワーク&lt;/a&gt;&lt;div&gt;便利かな～&lt;/div&gt;&lt;div&gt;最近C++書いてないなぁ&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7107286475610009074?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7107286475610009074/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7107286475610009074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7107286475610009074'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/blog-post.html' title='エラーハンドリングフレームワーク'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3976840782003568808</id><published>2009-08-02T07:19:00.002+09:00</published><updated>2009-08-02T07:26:09.733+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>iPhoneアプリ開発に惹かれてる</title><content type='html'>Macを手にしてからずいぶん時間が経ってるなぁ。&lt;br /&gt;&lt;div&gt;いまさらだけど、iPhoneアプリ開発に興味が出てきた。&lt;/div&gt;&lt;div&gt;&lt;a href="http://gihyo.jp/dev/serial/01/iphone"&gt;目指せ！iPhoneアプリ開発エキスパート&lt;/a&gt;&lt;/div&gt;&lt;div&gt;エキスパートの前にまずはビギナーから…&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3976840782003568808?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3976840782003568808/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/08/iphone.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3976840782003568808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3976840782003568808'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/08/iphone.html' title='iPhoneアプリ開発に惹かれてる'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8891750552787523575</id><published>2009-07-29T20:00:00.004+09:00</published><updated>2009-07-29T22:40:10.890+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>Flash Lite 1.1 のルートムービークリップの変数を動的生成してみた</title><content type='html'>&lt;div&gt;swfの動的生成は&lt;a href="http://swfmill.org/"&gt;swfmill&lt;/a&gt;や&lt;a href="http://www.libming.org/FrontPage"&gt;ming&lt;/a&gt;という方法があるけれど、ひな形となるswfの変数だけを動的に変えるだけでよい場合にはswfバイナリを直接変更するという方法もあるという例。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;生成した変数はルートムービークリップの変数になるようだ。変数名と同じ変数名でダイナミックTextインスタンスをステージに配置すれば、動的設定した文字列を表示することもできる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに、検証にはFlash Lite 1.1で作成したswfを使った。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;swf.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#!/usr/bin/env ruby&lt;br /&gt;# -*- encoding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;require 'stringio'&lt;br /&gt;&lt;br /&gt;module SWF&lt;br /&gt;  def self.read(src)&lt;br /&gt;    header = src.read(9)&lt;br /&gt;    x = (header[8] &amp;gt;&amp;gt; 3) * 4 + 5&lt;br /&gt;    header_size = ((((8 - (x &amp;amp; 7)) &amp;amp; 7) + x) / 8) + 12 + 5&lt;br /&gt;    header &amp;lt;&amp;lt; src.read(header_size - 9)&lt;br /&gt;    body = src.read&lt;br /&gt;    [header, body]&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  class Vars&lt;br /&gt;    HD = &amp;quot;\x3f\x03\x00\x00\x00\x00&amp;quot;&lt;br /&gt;    BE = &amp;quot;\x96&amp;quot;&lt;br /&gt;    ZE = &amp;quot;\x00&amp;quot;&lt;br /&gt;    ZB = ZE + BE&lt;br /&gt;    ED = &amp;quot;\x00\x1d&amp;quot;&lt;br /&gt;&lt;br /&gt;    def initialize&lt;br /&gt;      @vars = []&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def add(key, value)&lt;br /&gt;      @vars &amp;lt;&amp;lt; [key, value]&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def to_bytes&lt;br /&gt;      bytes = StringIO.new&lt;br /&gt;      bytes &amp;lt;&amp;lt; HD&lt;br /&gt;      @vars.each do |key, val|&lt;br /&gt;        bytes &amp;lt;&amp;lt; BE &amp;lt;&amp;lt; [key.size + 2].pack('v') &amp;lt;&amp;lt; ZE &amp;lt;&amp;lt; key&lt;br /&gt;        bytes &amp;lt;&amp;lt; ZB &amp;lt;&amp;lt; [val.size + 2].pack('v') &amp;lt;&amp;lt; ZE &amp;lt;&amp;lt; val &amp;lt;&amp;lt; ED&lt;br /&gt;      end&lt;br /&gt;      bytes &amp;lt;&amp;lt; ZE&lt;br /&gt;      bytes.seek 0&lt;br /&gt;      bytes = bytes.read&lt;br /&gt;      bytes[2, 4] = [bytes.size - 6].pack('V')&lt;br /&gt;      bytes&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    def apply(src_io, dst_io)&lt;br /&gt;      vars = to_bytes&lt;br /&gt;      header, body = SWF.read(src_io)&lt;br /&gt;      header[4, 4] = [header.size + body.size + vars.size].pack('V')&lt;br /&gt;      dst_io &amp;lt;&amp;lt; header&lt;br /&gt;      dst_io &amp;lt;&amp;lt; vars&lt;br /&gt;      dst_io &amp;lt;&amp;lt; body&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if __FILE__ == $0&lt;br /&gt;  require 'yaml'&lt;br /&gt;  require 'optparse'&lt;br /&gt;  dat, src, dst = nil&lt;br /&gt;  OptionParser.new do |opt|&lt;br /&gt;    opt.on('-v VARS.yaml'){|v| dat = v }&lt;br /&gt;    opt.on('-i INPUT.swf'){|v| src = v }&lt;br /&gt;    opt.on('-o OUTPUT.swf'){|v| dst = v }&lt;br /&gt;    opt.parse!(ARGV)&lt;br /&gt;    unless dat &amp;amp;&amp;amp; src &amp;amp;&amp;amp; dst&lt;br /&gt;      opt.parse!([&amp;quot;-help&amp;quot;])&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  vars = SWF::Vars.new&lt;br /&gt;  YAML.load_file(dat).each{|key, value| vars.add(key, value) }&lt;br /&gt;  File.open(src, 'rb') do |s|&lt;br /&gt;    File.open(dst, 'wb') do |d|&lt;br /&gt;      vars.apply(s, d)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8891750552787523575?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8891750552787523575/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/flash-lite-11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8891750552787523575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8891750552787523575'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/flash-lite-11.html' title='Flash Lite 1.1 のルートムービークリップの変数を動的生成してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3548693031114196839</id><published>2009-07-24T17:55:00.002+09:00</published><updated>2009-07-24T17:57:30.546+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidのタイトルバーにアイコンを表示してみた</title><content type='html'>&lt;pre class="mycodeB"&gt;import android.view.Window;&lt;/pre&gt;&lt;div&gt;&lt;pre class="mycodeB"&gt;Window w = getWindow();&lt;br /&gt;w.requestFeature(Window.FEATURE_LEFT_ICON);&lt;br /&gt;setContentView(R.layout.search);&lt;br /&gt;w.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.icon);&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;とっても簡単。&lt;/div&gt;&lt;div&gt;Window.FEATURE_???を調べたらいろいろできることが増えるのかも。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;出典: &lt;a href="http://www.adamrocker.com/blog/201/icon_in_android_title.html"&gt;Androidのタイトルバーにアイコンを表示する方法&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3548693031114196839?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3548693031114196839/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3548693031114196839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3548693031114196839'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/android.html' title='Androidのタイトルバーにアイコンを表示してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4726303705447574089</id><published>2009-07-24T17:54:00.000+09:00</published><updated>2009-07-24T17:55:04.772+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Eclipse 3.5 Galileo に ADT を入れてみた</title><content type='html'>&lt;div&gt;Eclipse IDE for Java Developers &lt;/div&gt;&lt;div&gt;Build id: 20090619-0625&lt;/div&gt;&lt;div&gt;Android SDK: 1.5r3&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;デバッグ実行してブレークポイントで止まるし、特に問題無く動作している。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4726303705447574089?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4726303705447574089/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/eclipse-35-galileo-adt.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4726303705447574089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4726303705447574089'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/eclipse-35-galileo-adt.html' title='Eclipse 3.5 Galileo に ADT を入れてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5214396118835573155</id><published>2009-07-24T11:06:00.001+09:00</published><updated>2009-07-24T11:09:15.238+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android Emulatorの為にSDカードイメージを作ってみた</title><content type='html'>&lt;div&gt;SDカードイメージを作成するには、2つの方法がある。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Android Virtual Devices Managerを使う方法&lt;/li&gt;&lt;li&gt;コマンドラインプログラムで作成する方法&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;どちらもできることは同じ。たぶん。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EclipseにADTを導入するとAndroid Virtual Devices Managerが使える。&lt;/div&gt;&lt;div&gt;Android Virtual Devices Managerを使う方が断然楽。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;コマンドラインの場合Android SDKのtoolsにあるmksdcardコマンドを使う。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;mksdcard.exe -l "ラベル名" サイズ SDカードイメージファイル名&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;サイズに単位を指定しないと、バイト単位になる。&lt;/div&gt;&lt;div&gt;Kをつけるとキビバイト、Mをつけるとメビバイトになる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;生成されたファイルは生のイメージなのでファイルのサイズは指定したサイズと等しくなる。&lt;/div&gt;&lt;div&gt;大きなサイズを指定すると生成にも時間がかかった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;参考: &lt;a href="http://typex2.wordpress.com/2008/09/29/android%e3%81%a7sd%e3%82%ab%e3%83%bc%e3%83%89%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%82%92%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e3%81%97%e3%81%a6mp3%e3%82%92%e5%86%8d%e7%94%9f%e3%81%97%e3%81%a6/"&gt;AndroidでSDカードイメージをマウントしてMP3を再生してみる&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5214396118835573155?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5214396118835573155/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/android-emulatorsd.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5214396118835573155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5214396118835573155'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/android-emulatorsd.html' title='Android Emulatorの為にSDカードイメージを作ってみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-118254988670698885</id><published>2009-07-24T11:05:00.002+09:00</published><updated>2009-07-24T11:05:58.507+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android EmulatorのSkinをHT-03Aにしてみた</title><content type='html'>白も黒もどっちもできる。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;参考: &lt;a href="http://wikiwiki.jp/android/?%A5%A8%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF%A4%CESkin%A4%F2HT-03A%A4%CB%A4%B9%A4%EB"&gt;Android Wiki&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-118254988670698885?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/118254988670698885/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/android-emulatorskinht-03a.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/118254988670698885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/118254988670698885'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/android-emulatorskinht-03a.html' title='Android EmulatorのSkinをHT-03Aにしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7734120357672826755</id><published>2009-07-22T21:40:00.003+09:00</published><updated>2009-07-23T13:22:45.459+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android NDKってなに？</title><content type='html'>&lt;div&gt;Androidでネイティブコードを動かすための開発ツールを見つけた。&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.android.com/sdk/ndk/1.5_r1/index.html#overview"&gt;What is the Android NDK?&lt;/a&gt;の駄訳。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Android NDKは、Androidアプリ開発者のみんなが、君たちのアプリケーションに、ネイティブコードで書かれたコンポーネントを埋め込むことができるようになるツールだよ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AndroidアプリはDalvik仮想マシンの上で動くんだけど、このNDKを使えば、CやC++みたいなネイティブコード言語を使ってアプリケーションのパーツを開発できるようになるんだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そうすれば、ある種のアプリケーションにはメリットがあるんだ。それらの言語で書かれたコードを再利用することができるとか、時にはスピードアップとかね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このNDKに入れてあるもの&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;CやC++のソースコードからネイティブコードライブラリを生成する事ができるツールやビルドファイル。&lt;/li&gt;&lt;li&gt;ネイティブコードライブラリをAndroidデバイスにデプロイ可能なアプリケーションパッケージファイル(.apks)に埋め込む方法。&lt;/li&gt;&lt;li&gt;ネイティブシステムヘッダーやライブラリのセット。これらは将来にわたってAndroid 1.5以降の全てのAndroidプラットフォームでサポートされるよ。&lt;/li&gt;&lt;li&gt;ドキュメント、サンプル、それにチュートリアル&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このリリースのNDKはARMv5TEのマシン語をサポートしている。それに、安定したlibcのヘッダーファイル(Cライブラリ)やlibm(数学ライブラリ)、JNIインターフェースやその他のライブラリを入れてあるよ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このNDKは、ほとんどのアプリケーションには役に立たないだろうな。開発者として、メリットとデメリットのバランスを見極める必要があるよ。特に、ネイティブコードを使っても、自動的にパフォーマンスが向上するわけじゃないし、そのくせ必ずアプリケーションを複雑にしてしまうからね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NDKを使うよい例は、自己完結的で、メモリアロケーションを伴わない、CPUをこき使うような処理だね。例えば、シグナル処理とか物理シミュレーションとかね。なにかのメソッドを単純にCで書き換えたとしても、たいていはたいしてパフォーマンス向上につながらないよ。でもね、NDKは既に世の中に存在するCやC++のコードを再利用する時には効率的な手段になり得るんだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;注意して欲しいんだけど、NDKを使ってもネイティブコードだけのアプリケーションを作ることはできないよ。AndroidのメインのランタイムはDalvik仮想マシンのままだからね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7734120357672826755?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7734120357672826755/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/android-ndk.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7734120357672826755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7734120357672826755'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/android-ndk.html' title='Android NDKってなに？'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2574582109450974625</id><published>2009-07-21T11:24:00.003+09:00</published><updated>2009-07-21T11:27:34.571+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>HTC-03AでHello, Androidをデバッグ実行してみた</title><content type='html'>&lt;div&gt;PC: Intel 32bit&lt;/div&gt;&lt;div&gt;OS: WindowsXP SP3&lt;/div&gt;&lt;div&gt;IDE: Eclipse Java EE IDE for Java Developers, Version: 3.4.2 Build id: M20090211-1700&lt;/div&gt;&lt;div&gt;Android SDK: 1.5r3&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;最初に実機をPCに接続した時、デバッグモードにせずにつないでしまったためか、USB記憶装置として認識されてしまった。デバイスを削除して、再インストールしようとしても、.infファイルのハードウェアの記述が異なるみたいで該当なしと言われる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;同じ状態になってしまった人もたくさんいるみたいで、探してみたらいくつか情報が。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://d.hatena.ne.jp/redcloud/20090715/1247663365"&gt;HT-03AをデバッグモードでPCとUSB接続。。。したくてハマった顛末&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://groups.google.co.jp/group/android-sdk-japan/browse_thread/thread/c966c0b89f0a3c1f"&gt;HTC-03A+Eclipse のUSB接続実機デバッグについて&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とりあえず、HTCのサイトから&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.htc.com/tw/SupportDownload.aspx?p_id=267&amp;amp;cat=3&amp;amp;dl_id=564"&gt;http://www.htc.com/tw/SupportDownload.aspx?p_id=267&amp;amp;cat=3&amp;amp;dl_id=564&lt;/a&gt;&lt;/div&gt;&lt;div&gt;デバイスドライバのアップデータ(?!)をダウンロードして、実行。&lt;/div&gt;&lt;div&gt;実機を接続していなかったので「実機つないでくれんと・・・」と怒られる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;しかし、ここで思い立って、先に、Android SDKに付属の&lt;/div&gt;&lt;div&gt;usb_driver\x86\android_usb\infをインストールしてから、デバッグモードに&lt;/div&gt;&lt;div&gt;した実機をUSBに接続したら、デバイスドライバをインストールするウィザードが開いてくれた。&lt;/div&gt;&lt;div&gt;手動でドライバを選択したら待通りにインストール完了。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eclipse経由でHello, Androidを動かしてちょっと満足。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;デバイスドライバのアップデータを実行したのが吉だったのかな・・。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2574582109450974625?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2574582109450974625/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/htc-03ahello-android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2574582109450974625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2574582109450974625'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/htc-03ahello-android.html' title='HTC-03AでHello, Androidをデバッグ実行してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-330109383166987656</id><published>2009-07-17T14:09:00.007+09:00</published><updated>2009-07-17T18:08:43.698+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Rubyの拡張モジュールでリソースを解放する方法</title><content type='html'>RubyはGCを持っているので、Rubyの世界の中ではリソースの解放をそれほど気にしなくてもよいけれど、Cで記述したRubyの拡張モジュールではそうはいかない。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;インスタンス生成で資源を確保し、GCがインスタンスを回収した時に資源を解放するサンプル。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;foo.c&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#include &amp;lt;ruby.h&amp;gt;&lt;br /&gt;#include &amp;lt;rubysig.h&amp;gt;&lt;br /&gt;&lt;br /&gt;static VALUE g_cFoo = Qnil;&lt;br /&gt;&lt;br /&gt;struct FooData&lt;br /&gt;{&lt;br /&gt;  int x;&lt;br /&gt;  int y;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;static void&lt;br /&gt;Foo_free_data(struct FooData* data)&lt;br /&gt;{&lt;br /&gt;  fprintf(stderr, "free 0x%08x\n", data);&lt;br /&gt;#if defined(USE_RUBY_XMALLOC)&lt;br /&gt;  ruby_xfree(data);&lt;br /&gt;#else&lt;br /&gt;  free(data);&lt;br /&gt;#endif&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static VALUE&lt;br /&gt;Foo_alloc_data(VALUE self)&lt;br /&gt;{&lt;br /&gt;  return Data_Wrap_Struct(self, 0, &amp;amp;Foo_free_data, 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static struct FooData*&lt;br /&gt;Foo_data(VALUE self)&lt;br /&gt;{&lt;br /&gt;  struct FooData* sval = NULL;&lt;br /&gt;  Data_Get_Struct(self, struct FooData, sval);&lt;br /&gt;  return sval;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static VALUE&lt;br /&gt;Foo_initialize(VALUE self)&lt;br /&gt;{&lt;br /&gt;#if defined(USE_RUBY_XMALLOC)&lt;br /&gt;  DATA_PTR(self) = ruby_xmalloc(sizeof(struct FooData));&lt;br /&gt;#else&lt;br /&gt;  DATA_PTR(self) = malloc(sizeof(struct FooData));&lt;br /&gt;#endif&lt;br /&gt;  fprintf(stderr, "alloc 0x%08x\n", DATA_PTR(self));&lt;br /&gt;  return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Init_foo()&lt;br /&gt;{&lt;br /&gt;  g_cFoo = rb_define_class("Foo", rb_cObject);&lt;br /&gt;&lt;br /&gt;  rb_define_alloc_func(g_cFoo, &amp;amp;Foo_alloc_data);&lt;br /&gt;  rb_define_method(g_cFoo, "initialize", &amp;amp;Foo_initialize, 0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;※注意！&lt;/span&gt;このモジュールを使って ruby 1.8.7 p174 {mingw32|linux}で ruby -rfoo -e 'loop{Foo.new}' したら Segmentation faultになった。原因不明&gt;_&lt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-330109383166987656?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/330109383166987656/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/ruby.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/330109383166987656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/330109383166987656'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/ruby.html' title='Rubyの拡張モジュールでリソースを解放する方法'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6398353818975541394</id><published>2009-07-16T14:04:00.002+09:00</published><updated>2009-07-16T14:06:07.997+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>ruby embedded into c++</title><content type='html'>&lt;div&gt;2003年に書かれたものだから、古いかもしれないけれど、Rubyの拡張モジュールを作成する時の参考になるかもしれない。&lt;/div&gt;&lt;a href="http://metaeditor.sourceforge.net/embed/"&gt;http://metaeditor.sourceforge.net/embed/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6398353818975541394?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6398353818975541394/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/ruby-embedded-into-c.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6398353818975541394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6398353818975541394'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/ruby-embedded-into-c.html' title='ruby embedded into c++'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3895730209888243389</id><published>2009-07-11T13:10:00.008+09:00</published><updated>2009-07-12T10:32:09.483+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Thriftの存在を知らなかった</title><content type='html'>&lt;div&gt;&lt;a href="http://cydn.cybozu.co.jp/2007/06/thrift.html"&gt;サイボウズ Thrift 調査報告&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://kzk9.net/blog/2008/02/thrift.html"&gt;Thriftを利用したログからの復旧機能の実装&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://instant.thrift-rpc.org/"&gt;http://instant.thrift-rpc.org/&lt;/a&gt; (これはなに？)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3895730209888243389?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3895730209888243389/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/thrift.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3895730209888243389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3895730209888243389'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/thrift.html' title='Thriftの存在を知らなかった'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7566437894261077185</id><published>2009-07-08T14:54:00.002+09:00</published><updated>2009-07-14T02:02:47.763+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>emacsでruby-modeを使う設定</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;.emacs&lt;/pre&gt;&lt;pre class="mycodeB"&gt;;;;;&lt;br /&gt;;;;; Ruby&lt;br /&gt;;;;;&lt;br /&gt;(add-to-list 'load-path "c:/somewhere/site-lisp")&lt;br /&gt;(autoload 'ruby-mode "ruby-mode"&lt;br /&gt; "Mode for editing ruby source files" t)&lt;br /&gt;(setq auto-mode-alist&lt;br /&gt; (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))&lt;br /&gt;(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))&lt;br /&gt;                               interpreter-mode-alist))&lt;br /&gt;(autoload 'run-ruby "inf-ruby"&lt;br /&gt; "Run an inferior Ruby process")&lt;br /&gt;(autoload 'inf-ruby-keys "inf-ruby"&lt;br /&gt; "Set local key defs for inf-ruby in ruby-mode")&lt;br /&gt;(add-hook 'ruby-mode-hook&lt;br /&gt;     '(lambda ()&lt;br /&gt;       (inf-ruby-keys)))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7566437894261077185?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7566437894261077185/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/emacsruby-mode.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7566437894261077185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7566437894261077185'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/emacsruby-mode.html' title='emacsでruby-modeを使う設定'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4098749149733604603</id><published>2009-07-07T21:02:00.005+09:00</published><updated>2009-07-07T21:38:40.895+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Dokan Ruby 0.1.4 のパッチ</title><content type='html'>&lt;a href="http://dokan-dev.net/"&gt;Windows用の仮想ファイルシステムドライバDokanライブラリ&lt;/a&gt;を使ってみた。&lt;div&gt;Dokan Rubyを使うとRubyで手軽にファイルシステムを書けてしまうという&lt;/div&gt;&lt;div&gt;素晴らしいライブラリだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そのサンプルにmirror.rbというものがある。&lt;/div&gt;&lt;div&gt;任意のフォルダを指定して、ドライブにマウントするサンプルだ。&lt;/div&gt;&lt;div&gt;SUBSTコマンドのようなもの。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;しかし、このmirror.rbでマウントしたドライブは、&lt;/div&gt;&lt;div&gt;Explorerでファイルを見ることはできるものの、&lt;/div&gt;&lt;div&gt;コマンドプロンプトで cd FolderName を実行しても&lt;/div&gt;&lt;div&gt;「指定されたパスが見つかりません。」と言われる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ばぐ？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dokanライブラリのreadme.ja.txtに答えが書いてあった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="color:#993300;"&gt;ディレクトリに対するアクセスで有るのにも関わらず，CreateFile が呼ばれることもあります．その場合は，DokanFileInfo-&gt;IsDirectory は FALSE がセットされています．ディレクトリの属性を取得する場合などに OpenDirectory ではなく，CreateFileが呼ばれるようです．ディレクトリに対するアクセスなのにも関わらず，CreateFile が呼ばれた場合は，必ず DokanFileInfo-&gt;IsDirectory にTRUEをセットしてからreturnしてください．正しくセットされていないと，Dokanライブラリは，そのアクセスがディレクトリに対するアクセスかどうか判断できず，Dokanファイルシステムで Windows に対して正確な情報を返すことが出来なくなります．&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;mirror.rbはopenでFile.file?(path)の結果を返していて、ディレクトリの場合に対応できていない。&lt;/div&gt;&lt;div&gt;そもそも、dokan_lib.soでFileInfo#directory=が定義されていないし、instans_eval等で無理矢理値を変えたとしても、FileInfoをDokanFileInfoに書き戻すコードは無かった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;dokan_lib.cとmirror.rbを少しだけ書き換えたらうまくいった。めでたしめでたし♪&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;dokan_lib.c.patch&lt;/pre&gt;&lt;pre class="mycodeB"&gt;110a111,118&lt;br /&gt;&amp;gt; static VALUE&lt;br /&gt;&amp;gt; DR_FileInfo_set_directory_p(&lt;br /&gt;&amp;gt;     VALUE    self,&lt;br /&gt;&amp;gt;     VALUE    value)&lt;br /&gt;&amp;gt; {&lt;br /&gt;&amp;gt;     rb_iv_set(self, &amp;quot;@is_directory&amp;quot;, value);&lt;br /&gt;&amp;gt;     return self;&lt;br /&gt;&amp;gt; }&lt;br /&gt;151a160&lt;br /&gt;&amp;gt;     VALUE is_dir;&lt;br /&gt;154a164,166&lt;br /&gt;&amp;gt; &lt;br /&gt;&amp;gt;     is_dir = rb_iv_get(FileInfo, &amp;quot;@is_directory&amp;quot;);&lt;br /&gt;&amp;gt;     DokanFileInfo-&amp;gt;IsDirectory = (Qfalse != is_dir &amp;amp;&amp;amp; Qnil != is_dir);&lt;br /&gt;&amp;gt;     /* DokanFileInfo-&amp;gt;IsDirectory = RTEST(is_dir); */ /* 普通はこう書くのかな？ */&lt;br /&gt;173c185,186&lt;br /&gt;&amp;lt;     rb_define_method(g_cFileInfo, &amp;quot;directory?&amp;quot;, DR_FileInfo_directory_p, 0);&lt;br /&gt;---&lt;br /&gt;&amp;gt;     rb_define_method(g_cFileInfo, &amp;quot;directory?&amp;quot;, DR_FileInfo_directory_p, 0);&lt;br /&gt;&amp;gt;     rb_define_method(g_cFileInfo, &amp;quot;directory=&amp;quot;, DR_FileInfo_set_directory_p, 1);&lt;br /&gt;&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;mirror.rb.patch&lt;/pre&gt;&lt;pre class="mycodeB"&gt;19c19,24&lt;br /&gt;&amp;lt;       File.file?(get_path(path))&lt;br /&gt;---&lt;br /&gt;&amp;gt;       s = File.stat(get_path(path)) rescue nil&lt;br /&gt;&amp;gt;       if s&lt;br /&gt;&amp;gt;         fileinfo.directory = s.directory?&lt;br /&gt;&amp;gt;         true&lt;br /&gt;&amp;gt;       else&lt;br /&gt;&amp;gt;         false&lt;br /&gt;&amp;gt;       end&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4098749149733604603?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4098749149733604603/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/07/dokan-ruby-014.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4098749149733604603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4098749149733604603'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/07/dokan-ruby-014.html' title='Dokan Ruby 0.1.4 のパッチ'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5591390439626028120</id><published>2009-06-29T17:34:00.002+09:00</published><updated>2009-06-29T17:38:03.344+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>gemの作り方</title><content type='html'>「&lt;a href="http://jp.rubyist.net/magazine/?0010-PackageManagement#l4"&gt;自前の gem の作り方&lt;/a&gt;」&lt;div&gt;その記事の中で&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  line-height: 21px; font-family:'ms pgothic';font-size:14px;"&gt;&lt;a href="http://rake.rubyforge.org/classes/Rake/GemPackageTask.html" class="external" style="color: rgb(255, 104, 53); background-color: transparent; "&gt;Rake を使って gem パッケージを作る&lt;/a&gt;方が良い。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'ms pgothic';font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" line-height: 21px;font-size:14px;"&gt;と書いてある。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'ms pgothic';font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" line-height: 21px;font-size:14px;"&gt;そのうち調べよう。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5591390439626028120?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5591390439626028120/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/gem.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5591390439626028120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5591390439626028120'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/gem.html' title='gemの作り方'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7524390612747936328</id><published>2009-06-29T17:30:00.003+09:00</published><updated>2009-06-29T17:34:04.080+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>set_trace_funcは使ったことがない</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px; white-space: pre; "&gt;&lt;a href="http://d.hatena.ne.jp/secondlife/20061010/1160453355"&gt;Ruby で debug する7つの方法&lt;/a&gt;という記事。&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Arial;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Arial;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;a href="http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#set_trace_func"&gt;set_trace_func&lt;/a&gt; は使ったことがない。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Arial;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;間接的にはお世話になってるけれど、直接使ったことはない。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7524390612747936328?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7524390612747936328/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/settracefunc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7524390612747936328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7524390612747936328'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/settracefunc.html' title='set_trace_funcは使ったことがない'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-2507289875583716806</id><published>2009-06-23T15:48:00.000+09:00</published><updated>2009-06-23T15:49:38.702+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>"make install"したソフトウェアを管理できる超便利ツール「Paco」</title><content type='html'>&lt;a href="http://d.hatena.ne.jp/rx7/20081011/p2"&gt;"make install"したソフトウェアを管理できる超便利ツール&lt;/a&gt;「&lt;a href="http://paco.sourceforge.net/index.html"&gt;Paco&lt;/a&gt;」&lt;div&gt;へぇ～&lt;/div&gt;&lt;div&gt;もうちょっと早くきがついていたら、使ってみる気になったかもな～。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-2507289875583716806?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/2507289875583716806/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/make-installpaco.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2507289875583716806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/2507289875583716806'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/make-installpaco.html' title='&quot;make install&quot;したソフトウェアを管理できる超便利ツール「Paco」'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6750135329426437884</id><published>2009-06-23T15:42:00.005+09:00</published><updated>2009-06-23T15:50:10.569+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>CentOS 5.2 で swfmill をソースからビルド</title><content type='html'>pkg-configが使えなくてちょっと苦しんだ。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;libxml2-2.7.3.tar.gz を ./configure ; make ; make install&lt;/div&gt;&lt;div&gt;libxslt-1.1.25.tar.gz を ./configure ; make ; make install&lt;/div&gt;&lt;div&gt;freetype-2.3.9.tar.bz2 を ./configure ; make ; make install&lt;/div&gt;&lt;div&gt;libpng-1.2.37.tar.bz2 を ./configure ; make ; make install&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最後に、swfmill-0.2.12.tar.gz を&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;patch -p 1 &lt;&gt;&lt;div&gt;export XML_CFLAGS=-I/usr/local/include/libxml2&lt;/div&gt;&lt;div&gt;export XML_LIBS="-L/usr/local/lib -lxml2"&lt;/div&gt;&lt;div&gt;export XSLT_CFLAGS=-I/usr/local/include/libxslt&lt;/div&gt;&lt;div&gt;export XSLT_LIBS="-L/usr/local/lib -lxslt -lexslt"&lt;/div&gt;&lt;div&gt;export FREETYPE_CFLAGS=-I/usr/local/include/freetype2&lt;/div&gt;&lt;div&gt;export FREETYPE_LIBS="-L/usr/local/lib -lfreetype"&lt;/div&gt;&lt;div&gt;export PNG_CFLAGS=-I/usr/local/include/libpng12&lt;/div&gt;&lt;div&gt;export PNG_LIBS="-L/usr/local/lib -lpng"&lt;/div&gt;&lt;div&gt;./configure&lt;/div&gt;&lt;div&gt;make&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;swfmill.cpp:395: error: ‘xslt_simple’ was not declared in this scope&lt;/div&gt;&lt;div&gt;こんなこと言われたので、vi +395 src/swfmill.cpp して、適当な位置に extern const char* xslt_simple; 追加。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;make&lt;/div&gt;&lt;div&gt;su&lt;/div&gt;&lt;div&gt;make install&lt;/div&gt;&lt;div&gt;ldconfig&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6750135329426437884?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6750135329426437884/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/centos-52-swfmill.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6750135329426437884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6750135329426437884'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/centos-52-swfmill.html' title='CentOS 5.2 で swfmill をソースからビルド'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-8160681576790859147</id><published>2009-06-20T22:06:00.002+09:00</published><updated>2009-06-20T22:08:40.985+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Hamlしてみた</title><content type='html'>&lt;a href="http://haml.hamptoncatlin.com/"&gt;Haml&lt;/a&gt;&lt;div&gt;&lt;br /&gt;なんだか便利そう・・・だけどまだよく分からない。&lt;/div&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;sample.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;require 'rubygems'&lt;br /&gt;require 'haml'&lt;br /&gt;&lt;br /&gt;e = Haml::Engine.new('%p= foo')&lt;br /&gt;puts e.render(Object.new, :foo =&amp;gt; "Hello World")&lt;br /&gt;&lt;br /&gt;e = Haml::Engine.new('%p= yield')&lt;br /&gt;puts( e.render do&lt;br /&gt;'Hello World ' * 2&lt;br /&gt;end )&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-8160681576790859147?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/8160681576790859147/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/haml.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8160681576790859147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/8160681576790859147'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/haml.html' title='Hamlしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-4171990693573618897</id><published>2009-06-20T15:35:00.002+09:00</published><updated>2009-06-20T15:38:52.091+09:00</updated><title type='text'>FLEX BUILDER 3 をアップデート</title><content type='html'>Flex Builder 3 をアップデートしたら 3.0.2.214193 になった。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-4171990693573618897?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/4171990693573618897/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/flex-builder-3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4171990693573618897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/4171990693573618897'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/flex-builder-3.html' title='FLEX BUILDER 3 をアップデート'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5751494807933563122</id><published>2009-06-17T23:11:00.001+09:00</published><updated>2009-06-17T23:13:34.562+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>RoRのActiveRecord</title><content type='html'>&lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;で&lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html"&gt;ActiveRecord&lt;/a&gt;使いたい。&lt;div&gt;あ、組み合わせとして使えないのではなくて、使ったことがないだけ。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5751494807933563122?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5751494807933563122/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/roractiverecord.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5751494807933563122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5751494807933563122'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/roractiverecord.html' title='RoRのActiveRecord'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-7759646520938176133</id><published>2009-06-17T22:51:00.001+09:00</published><updated>2009-06-17T22:51:40.419+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Sinatraでアップローダー</title><content type='html'>Rubyスクリプト1つで書けるところが面白い。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;app.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#!ruby&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'sinatra'&lt;br /&gt;require 'sinatra/authorization'&lt;br /&gt;require 'erb'&lt;br /&gt;require 'fileutils'&lt;br /&gt;&lt;br /&gt;helpers do&lt;br /&gt;  def authorization_realm; 'Private Zone'; end&lt;br /&gt;&lt;br /&gt;  def authorize(login, password)&lt;br /&gt;    login == 'id' &amp;amp;&amp;amp; password == 'pw'&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;module Uploader&lt;br /&gt;  attr_reader :upload_path, :upload_dir&lt;br /&gt;  def initialize&lt;br /&gt;    @upload_path = 'files'&lt;br /&gt;    @upload_dir = File.join(Sinatra::Application.public, @upload_path)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def files&lt;br /&gt;    Dir.entries(upload_dir).select do |x|&lt;br /&gt;      !File.directory?(x)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def floor3(x)&lt;br /&gt;    (x * 1000).floor / 1000.0&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def file_size(x)&lt;br /&gt;    s = File.stat(File.join(upload_dir, x)).size&lt;br /&gt;    case&lt;br /&gt;    when 1024 * 1024 &amp;lt; s&lt;br /&gt;      &amp;quot;#{floor3(s/(1024.0 * 1024.0))} M&amp;quot;&lt;br /&gt;    when 1024 &amp;lt; s&lt;br /&gt;      &amp;quot;#{floor3(s/1024.0)} K&amp;quot;&lt;br /&gt;    else&lt;br /&gt;      &amp;quot;#{s} bytes&amp;quot;&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;helpers Uploader&lt;br /&gt;&lt;br /&gt;get '/' do&lt;br /&gt;  login_required&lt;br /&gt;  erb :index&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;post '/upload' do&lt;br /&gt;  if params[:file]&lt;br /&gt;    save_file = File.join(upload_dir, File.basename(params[:file][:filename]))&lt;br /&gt;    File.open(save_file, 'wb'){|f| f.write(params[:file][:tempfile].read)}&lt;br /&gt;  end&lt;br /&gt;  redirect '/'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;get '/remove' do&lt;br /&gt;  if params[:file]&lt;br /&gt;    FileUtils.rm(File.join(upload_dir, File.basename(params[:file]))) rescue nil&lt;br /&gt;  end&lt;br /&gt;  redirect '/'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;get '/logout' do&lt;br /&gt;  redirect '/' unless Rack::Auth::Basic::Request.new(request.env).provided?&lt;br /&gt;  response[&amp;quot;WWW-Authenticate&amp;quot;] = %(Basic realm=&amp;quot;#{authorization_realm}&amp;quot;)&lt;br /&gt;  halt 401, 'Authorization Required'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;get '*' do&lt;br /&gt;  redirect '/'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;__END__&lt;br /&gt;&lt;br /&gt;@@ index&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;K&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;a href=&amp;quot;/logout&amp;quot;&amp;gt;logout&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;/upload&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;file&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&amp;lt;%&lt;br /&gt;  files.sort.each do |x|&lt;br /&gt;    %&amp;gt;&amp;lt;a href=&amp;quot;&amp;lt;%=escape_html(File.join(upload_path, x))%&amp;gt;&amp;quot;&amp;gt;&amp;lt;%&lt;br /&gt;    %&amp;gt;&amp;lt;%=escape_html(x)%&amp;gt;&amp;lt;/a&amp;gt; (&amp;lt;%=file_size(x)%&amp;gt;)&amp;lt;%&lt;br /&gt;    %&amp;gt; &amp;lt;a href=&amp;quot;/remove?file=&amp;lt;%=escape(x)%&amp;gt;&amp;quot;&amp;gt;remove&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;%&lt;br /&gt;  end&lt;br /&gt;%&amp;gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-7759646520938176133?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/7759646520938176133/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/sinatra.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7759646520938176133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/7759646520938176133'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/sinatra.html' title='Sinatraでアップローダー'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6409143341265808242</id><published>2009-06-17T17:04:00.003+09:00</published><updated>2009-06-17T17:15:16.006+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>SinatraとSession</title><content type='html'>&lt;div&gt;SinatraでCookieベースのSessionを使って認証。&lt;/div&gt;&lt;a href="http://wiki.github.com/integrity/sinatra-authorization"&gt;sinatra-authorization&lt;/a&gt;を調べる前に、とりあえず目的達成できそうな方法を模索してみた。&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;study_auth.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;use Rack::Session::Cookie,&lt;br /&gt;# :key =&amp;gt; 'rack.session',&lt;br /&gt;# :domain =&amp;gt; 'takumakei.blogspot.com',&lt;br /&gt;# :path =&amp;gt; '/',&lt;br /&gt;:expire_after =&amp;gt; 3600,&lt;br /&gt;:secret =&amp;gt; 'changeme'&lt;br /&gt;&lt;br /&gt;helpers do&lt;br /&gt; def auth_ok?(id, pw)&lt;br /&gt;   id == 'id' &amp;amp;&amp;amp; pw == 'pw'&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def login&lt;br /&gt;   if auth_ok?(params['id'], params['pw'])&lt;br /&gt;     session[:login] = 'What should i have to put here ?'&lt;br /&gt;     redirect '/'&lt;br /&gt;   else&lt;br /&gt;     erb :login&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def logout&lt;br /&gt;   session.delete(:login)&lt;br /&gt;   redirect '/'&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def need_auth&lt;br /&gt;   unless session[:login]&lt;br /&gt;     erb :login&lt;br /&gt;   else&lt;br /&gt;     yield&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;app.rb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;#!ruby&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'sinatra'&lt;br /&gt;require 'erb'&lt;br /&gt;require 'study_auth'&lt;br /&gt;&lt;br /&gt;get '/' do&lt;br /&gt; need_auth do&lt;br /&gt;   erb :index&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;get '/login' do&lt;br /&gt; login&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;post '/login' do&lt;br /&gt; login&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;get '/logout' do&lt;br /&gt; logout&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;get '/*' do&lt;br /&gt; login&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;index.erb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;index&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;%=Time.new.to_s%&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;a href="logout"&amp;gt;logout&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;login.erb&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;login&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form action="login" method="POST"&amp;gt;&lt;br /&gt; &amp;lt;input type="text" name="id" value="&amp;lt;%=params['id']%&amp;gt;"&amp;gt;&lt;br /&gt; &amp;lt;input type="password" name="pw"&amp;gt;&lt;br /&gt; &amp;lt;input type="submit" value="LOGIN"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6409143341265808242?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6409143341265808242/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/sinatrasession.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6409143341265808242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6409143341265808242'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/sinatrasession.html' title='SinatraとSession'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-1012705820602713015</id><published>2009-06-16T23:05:00.002+09:00</published><updated>2009-06-16T23:07:42.771+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>FlashコンテンツからFlash Lite 1.1コンテンツへの変換</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px; white-space: pre; "&gt;&lt;div&gt;最近の贅沢な高級言語からFlash Lite 1.1初心者になるといろいろ足りなくて困る。&lt;/div&gt;&lt;div&gt;後で読もう。&lt;/div&gt;&lt;a href="http://www.adobe.com/jp/devnet/devices/articles/as2_to_flashlite.html"&gt;FlashコンテンツからFlash Lite 1.1コンテンツへの変換&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-1012705820602713015?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/1012705820602713015/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/flashflash-lite-11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1012705820602713015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/1012705820602713015'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/flashflash-lite-11.html' title='FlashコンテンツからFlash Lite 1.1コンテンツへの変換'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-3585323777393201619</id><published>2009-06-16T22:58:00.000+09:00</published><updated>2009-06-16T22:59:18.132+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Lite'/><title type='text'>Flash Lite 1.1 でカウントダウンしてみた</title><content type='html'>&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;CountDown&lt;/pre&gt;&lt;pre class="mycodeB"&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// 現在日時からXデーまでのカウントダウン&lt;br /&gt;//&lt;br /&gt;// 結果は4つの変数に算出する。「あと{dT}日と{HT}時間{MT}分{ST}秒」&lt;br /&gt;//dT = 0; // 残り日数&lt;br /&gt;//HT = 0; // 時間&lt;br /&gt;//MT = 0; // 分&lt;br /&gt;//ST = 0; // 秒&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデー&lt;br /&gt;yL = 2009;&lt;br /&gt;mmL = 7;&lt;br /&gt;dL = 7;&lt;br /&gt;HL = 0;&lt;br /&gt;ML = 0;&lt;br /&gt;SL = 0;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// 現在日時取得&lt;br /&gt;yR =fscommand2(&amp;quot;GetDateYear&amp;quot;);&lt;br /&gt;mmR = fscommand2(&amp;quot;GetDateMonth&amp;quot;);&lt;br /&gt;dR = fscommand2(&amp;quot;GetDateDay&amp;quot;);&lt;br /&gt;HR = fscommand2(&amp;quot;GetTimeHours&amp;quot;);&lt;br /&gt;MR = fscommand2(&amp;quot;GetTimeMinutes&amp;quot;);&lt;br /&gt;SR = fscommand2(&amp;quot;GetTimeSeconds&amp;quot;);&lt;br /&gt;if(!yR){&lt;br /&gt;    debug_ = '現在時刻を取得できなかったYo';&lt;br /&gt;    stop();&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーを表示する。「年」を表示&lt;br /&gt;yyyy_ = yL;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーを表示する。「月」を2桁で表示&lt;br /&gt;if(10 &amp;gt; mmL){&lt;br /&gt;    mo_ = '0' add mmL;&lt;br /&gt;}&lt;br /&gt;else{&lt;br /&gt;    mo_ = String(mmL);&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーを表示する。「日」を2桁で表示&lt;br /&gt;if(10 &amp;gt; dL){&lt;br /&gt;    dd_ = '0' add dL;&lt;br /&gt;}else{&lt;br /&gt;    dd_ = String(dL);&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーを表示する。「時」を2桁で表示&lt;br /&gt;if(10 &amp;gt; HL){&lt;br /&gt;    hh_ = '0' add HL;&lt;br /&gt;}else{&lt;br /&gt;    hh_ = String(HL);&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーを表示する。「分」を2桁で表示&lt;br /&gt;if(10 &amp;gt; ML){&lt;br /&gt;    mi_ = '0' add ML;&lt;br /&gt;}else{&lt;br /&gt;    mi_ = ML;&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーを表示する。「秒」を2桁で表示&lt;br /&gt;if(10 &amp;gt; SL){&lt;br /&gt;    ss_ = '0' add SL;&lt;br /&gt;}else{&lt;br /&gt;    ss_ = SL;&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーを2000年1月1日からの経過秒数に変換する。dtLが結果。&lt;br /&gt;dtL = 0;&lt;br /&gt;for(i = 2000; i &amp;lt; yL; ++i){&lt;br /&gt;    if((i % 4 == 0) ? ((i % 100 == 0) ? (i % 400 == 0) : true) : false){&lt;br /&gt;        dtL += 366;&lt;br /&gt;    } else {&lt;br /&gt;        dtL += 365;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;switch(mmL){&lt;br /&gt;case 2: dtL += 31; break;&lt;br /&gt;case 3: dtL += 59; break;&lt;br /&gt;case 4: dtL += 90; break;&lt;br /&gt;case 5: dtL += 120; break;&lt;br /&gt;case 6: dtL += 151; break;&lt;br /&gt;case 7: dtL += 181; break;&lt;br /&gt;case 8: dtL += 212; break;&lt;br /&gt;case 9: dtL += 243; break;&lt;br /&gt;case 10: dtL += 273; break;&lt;br /&gt;case 11: dtL += 304; break;&lt;br /&gt;case 12: dtL += 334; break;&lt;br /&gt;}&lt;br /&gt;if(2 &amp;lt; mmL &amp;amp;&amp;amp; ((yL % 4 == 0) ? ((yL % 100 == 0) ? (yL % 400 == 0) : true) : false)){&lt;br /&gt;    dtL += 1;&lt;br /&gt;}&lt;br /&gt;dtL += dL;&lt;br /&gt;dtL = (dtL * 24 * 60 * 60) + (HL * 60 * 60) + (ML * 60) + SL;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// 現在日時を2000年1月1日からの経過秒数に変換する。dtRが結果。&lt;br /&gt;dtR = 0;&lt;br /&gt;for(i = 2000; i &amp;lt; yR; ++i){&lt;br /&gt;    if((i % 4 == 0) ? ((i % 100 == 0) ? (i % 400 == 0) : true) : false){&lt;br /&gt;        dtR += 366;&lt;br /&gt;    } else {&lt;br /&gt;        dtR += 365;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;switch(mmR){&lt;br /&gt;case 2: dtR += 31; break;&lt;br /&gt;case 3: dtR += 59; break;&lt;br /&gt;case 4: dtR += 90; break;&lt;br /&gt;case 5: dtR += 120; break;&lt;br /&gt;case 6: dtR += 151; break;&lt;br /&gt;case 7: dtR += 181; break;&lt;br /&gt;case 8: dtR += 212; break;&lt;br /&gt;case 9: dtR += 243; break;&lt;br /&gt;case 10: dtR += 273; break;&lt;br /&gt;case 11: dtR += 304; break;&lt;br /&gt;case 12: dtR += 334; break;&lt;br /&gt;}&lt;br /&gt;if(2 &amp;lt; mmR &amp;amp;&amp;amp; ((yR % 4 == 0) ? ((yR % 100 == 0) ? (yR % 400 == 0) : true) : false)){&lt;br /&gt;    dtR += 1;&lt;br /&gt;}&lt;br /&gt;dtR += dR;&lt;br /&gt;dtR = (dtR * 24 * 60 * 60) + (HR * 60 * 60) + (MR * 60) + SR;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーと現在日時の差を計算して、{dT}日{HT}時間{MT}分{ST}秒にする。&lt;br /&gt;if(dtL &amp;lt; dtR){&lt;br /&gt;    debug_ = 'もう過ぎてるYo';&lt;br /&gt;    stop();&lt;br /&gt;}&lt;br /&gt;dtT = dtL - dtR;&lt;br /&gt;dT = int(dtT / (24 * 60 * 60));&lt;br /&gt;HT = int((dtT / (60 * 60)) % 24);&lt;br /&gt;MT = int((dtT / 60) % 60);&lt;br /&gt;ST = int(dtT % 60);&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーまでの「日数」を4桁で表示&lt;br /&gt;if(10 &amp;gt; dT){&lt;br /&gt;    dT_ = '000' add dT;&lt;br /&gt;}&lt;br /&gt;else if(100 &amp;gt; dT){&lt;br /&gt;    dT_ = '00' add dT;&lt;br /&gt;}&lt;br /&gt;else if(1000 &amp;gt; dT){&lt;br /&gt;    dT_ = '0' add dT;&lt;br /&gt;}&lt;br /&gt;else{&lt;br /&gt;    dT_ = String(dT);&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーまでの「時間」を2桁で表示&lt;br /&gt;if(10 &amp;gt; HT){&lt;br /&gt;    HT_ = '0' add HT;&lt;br /&gt;}&lt;br /&gt;else{&lt;br /&gt;    HT_ = String(HT);&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーまでの「分」を2桁で表示&lt;br /&gt;if(10 &amp;gt; MT){&lt;br /&gt;    MT_ = '0' add MT;&lt;br /&gt;}&lt;br /&gt;else{&lt;br /&gt;    MT_ = String(MT);&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Xデーまでの「秒」を2桁で表示&lt;br /&gt;if(10 &amp;gt; ST){&lt;br /&gt;    ST_ = '0' add ST;&lt;br /&gt;}&lt;br /&gt;else{&lt;br /&gt;    ST_ = String(ST);&lt;br /&gt;}&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-3585323777393201619?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/3585323777393201619/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/flash-lite-11_16.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3585323777393201619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/3585323777393201619'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/flash-lite-11_16.html' title='Flash Lite 1.1 でカウントダウンしてみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-6814298596767827592</id><published>2009-06-16T22:45:00.002+09:00</published><updated>2009-06-16T22:49:32.385+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><title type='text'>QRコードを表示してみた</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5RXf1G_Wm2w/Sjei59kMnoI/AAAAAAAAAIc/pEh5EbT8OMs/s1600-h/QRcodeG.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 128px; height: 156px;" src="http://1.bp.blogspot.com/_5RXf1G_Wm2w/Sjei59kMnoI/AAAAAAAAAIc/pEh5EbT8OMs/s320/QRcodeG.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5347922199188381314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="mycodeT" onclick="toggleMyCode(this)"&gt;QRcodeG.mxml&lt;/pre&gt;&lt;pre class="mycodeB"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"&lt;br /&gt;  layout="vertical"&lt;br /&gt;  showStatusBar="false" paddingBottom="3" paddingLeft="3" paddingRight="3" paddingTop="3"&lt;br /&gt;  width="174" height="188"&lt;br /&gt;  minWidth="174" minHeight="188"&amp;gt;&lt;br /&gt;  &amp;lt;mx:Script&amp;gt;&lt;br /&gt;      &amp;lt;![CDATA[&lt;br /&gt;          private const GOOGLE_CHART:String&lt;br /&gt;              = 'http://chart.apis.google.com/chart?chs=150x150&amp;amp;cht=qr&amp;amp;chl=';&lt;br /&gt;          private function create():void&lt;br /&gt;          {&lt;br /&gt;              var url:String = GOOGLE_CHART + encodeURIComponent(txt_.text);&lt;br /&gt;              qrImage_.scaleContent = true;&lt;br /&gt;              qrImage_.source = url;&lt;br /&gt;          }&lt;br /&gt;      ]]&amp;gt;&lt;br /&gt;  &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;  &amp;lt;mx:HBox width="100%"&amp;gt;&lt;br /&gt;      &amp;lt;mx:TextInput id="txt_" width="100%"/&amp;gt;&lt;br /&gt;      &amp;lt;mx:Button label="QR" click="create()"/&amp;gt;  &lt;br /&gt;  &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:HBox width="100%" height="100%" horizontalAlign="center" verticalAlign="middle"&amp;gt;&lt;br /&gt;      &amp;lt;mx:Image id="qrImage_" width="100%" height="100%"&lt;br /&gt;          source="icons/icon_128.png" scaleContent="false"&lt;br /&gt;          autoLoad="true" verticalAlign="middle" horizontalAlign="center"/&amp;gt;&lt;br /&gt;  &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:WindowedApplication&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-6814298596767827592?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/6814298596767827592/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/qr.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6814298596767827592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/6814298596767827592'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/qr.html' title='QRコードを表示してみた'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_5RXf1G_Wm2w/Sjei59kMnoI/AAAAAAAAAIc/pEh5EbT8OMs/s72-c/QRcodeG.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7517129252814270767.post-5088164243159066414</id><published>2009-06-12T19:10:00.000+09:00</published><updated>2009-06-12T19:11:32.217+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flash Lite 1.1 遊び始めました</title><content type='html'>&lt;div&gt;Flashで遊び初めて2日目。&lt;/div&gt;&lt;div&gt;対象デバイスは携帯なので、Flash Lite。&lt;/div&gt;&lt;div&gt;複数バージョン存在するけれど、ひとつひとつ対応していられないのでFlash Lite 1.1をターゲットにするのが現時点での最適解みたい。&lt;/div&gt;&lt;div&gt;しかし、なんと制約が多いことか。&lt;/div&gt;&lt;div&gt;Flashの動的生成とか動的合成が不可欠なのね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7517129252814270767-5088164243159066414?l=takumakei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takumakei.blogspot.com/feeds/5088164243159066414/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://takumakei.blogspot.com/2009/06/flash-lite-11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5088164243159066414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7517129252814270767/posts/default/5088164243159066414'/><link rel='alternate' type='text/html' href='http://takumakei.blogspot.com/2009/06/flash-lite-11.html' title='Flash Lite 1.1 遊び始めました'/><author><name>じゃんぐる</name><uri>http://www.blogger.com/profile/02113745182263021441</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-g6PdPrSqG0A/TseL_b7iJ8I/AAAAAAAAA6c/WHTEc5NVH7o/s220/takumakei-2011.jpg'/></author><thr:total>0</thr:total></entry></feed>
