ページ

2013年11月4日月曜日

[Android] GridView で列数を固定する。

GridView は列数を numColumns で指定すると、 GridView の横幅に応じて セルの幅を自動的に決めてくれる。

しかし、縦幅はセルに指定したアイテムの縦幅が採用されるので、 行数も固定して GridView を綺麗に固定するには GridView のサイズに応じて、アイテムの縦幅を調整する必要がある。

2013年10月27日日曜日

NEC MEDIAS X N-07D の ADB Interface を使う

NEC の MEDIAS N-07D を ADB 接続しようとしたのだが公式ドライバではうまくいかなかったのでメモ。

NECカシオモバイルコミュニケーションズ の公式ダウンロードページから ドライバをダウンロードしてインストールした。
しかし、正常にデバイスとして認識されない。 USB Storage デバイスとしては見えているのだが、ADB デバイスとしては機能していない。

公式ドライバの使用を断念し、Android SDK に入っているドライバを使用して解決。
以下、そのメモ。

2013年10月20日日曜日

[どうぶつしょうぎ] 相腰掛ゾウ基本定跡 23手目 ▲C4ライオン の変化


図1は、相腰掛ゾウ基本定跡(相ゾウ冠基本定跡)で 22手目に後手が △A3ゾウ とした局面。
本筋では先手は ▲A4ライオン として、以下△C1ライオン、▲C4キリン、△B2ゾウ と進む。

今回は、23手目に先手が ▲A4ライオン に替えて ▲C4 ライオンとしてきた場合の変化を見てみる。
先手の狙いは ▲A4ヒヨコ打。後手は A3 のゾウの捌き方が焦点になる。

棋譜はこちら → 棋譜
図1 △A3ゾウ打 まで

2013年9月29日日曜日

[Java] Java Image は透過色をサポートしていない?

Java7 の ImageIO は PNG の透過色指定をサポートしていないらしい。

package kuro.misc.image;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class TransparentColor {
  private static String FILE_IN = "C:/work/temp/test.png";
  private static String FILE_OUT = "C:/work/temp/test-out.png";

  public static void main(String[] args) throws IOException {
    BufferedImage image = ImageIO.read(new File(FILE_IN));
    ImageIO.write(image, "PNG", new File(FILE_OUT));
  }
}

こんな感じのコードを書いて、透過色指定をした「test.png」を読み込ませると、 出力される「test-out.png」は透過色指定がなくなってしまう。

 BufferedImage image = ImageIO.read(new File(FILE_IN));
System.out.println(
    "Image transparency = " + image.getTransparency());
-----------
Image transparency = 1

getTransparency の出力値の意味は以下の通り。
package java.awt;

public abstract interface Transparency
{
  public static final int OPAQUE = 1;
  public static final int BITMASK = 2;
  public static final int TRANSLUCENT = 3;

  public abstract int getTransparency();
}

読み込んだ時点で 透過情報のあるImageだとは扱われていない模様。

2013年9月2日月曜日

[Java] Image の拡大

Image を拡大して PNG に保存する方法。
PNGに保存するには ImageIO.wtite を使いたいので、 BufferedImage にしておく必要がある。


Image の拡大


いろいろ方法はありそうだが、一番簡単そうなのは java.awt.Image#getScaledInstance を使う方法。
  private static Image magnifyImage(Image img, int scale) {
    int width = img.getWidth();
    int height = img.getHeight();
    Image scaledImage = img.getScaledInstance(
        width * scale, height*scale, Image.SCALE_DEFAULT);
    return scaledImage;
  }


Image から BufferedImage に変換する方法


Image#getScaledInstance を使うと、拡大したイメージは、 java.awt.Image になってしまうので、 ImageIO.write を使うためには、 java.awt.image.BufferedImage に変換する必要がある。
  private static BufferedImage convertImageToBufferedImage(Image img) {
    BufferedImage bimg = new BufferedImage(
        img.getWidth(null), img.getHeight(null),
        BufferedImage.TYPE_INT_ARGB);
    Graphics g = bimg.getGraphics();
    g.drawImage(img, 0, 0, null);
    g.dispose();
    return bimg;
  }

すでに大きさが確定しているイメージを使うので Image.getWidth で Observer を指定する必要はない。


この方法の難点は透過情報(アルファチャンネル)を失ってしまうことだが、 今回は アルファ情報はいらないのでこれで良しとする。

2013年8月5日月曜日

[どうぶつしょうぎ] ぴよ替わり後の▲C3きりん の変化


ぴよ替わり後の▲C3きりん型 (相キリンの翼)の変化を見てみる。
図1は12手目に後手が △C1ヒヨコ打 とした局面。
本筋では ▲C4ライオン と引いたが、実戦では ▲B4ライオンと引くことが多い。

▲C4ライオン の場合は、△B3キリン と奥のゾウを取り込んだが、 ▲B4ライオン の場合は △B3キリン では負けになってしまう。 ここは、△C2ヒヨコ とする必要がある。 この場合の棋譜はこちら(→棋譜)。
図1 △C1ヒヨコ打 まで

2013年7月22日月曜日

[どうぶつしょうぎ] ▲A4ゾウ -先手待機策- への対応 ▲B3ヒヨコ型


前回、5手目に先手が ▲A4ゾウ と引く場合の変化を調べてみた。
この後、△A3キリン、▲B3ゾウ という手順だったが、 実戦では △A3キリン に対して、ほとんどの場合先手は ▲B3ヒヨコ打 と応じてくるので、 この変化も調べておく。

図1までの手順は、

▲B2ヒヨコ、△同ゾウ、▲B3ゾウ、△A2キリン、
▲A4ゾウ、△A3キリン、▲B3ヒヨコ打

棋譜はこちらを参照(→ 棋譜 )
図1 ▲B3ヒヨコ打 まで

2013年7月13日土曜日

[どうぶつしょうぎ] ▲A4ゾウ -先手待機策- への対応


ヒヨコ交換後、△A2キリン を見て先手が ▲A4ゾウ と手を戻して様子見で来ることがある。

図1までの手順は、
▲B2ヒヨコ、△同ゾウ、▲B3ゾウ、△A2キリン、
▲A4ゾウ


後手は間違わずに指せば24手の短手順で勝ちになるので確実に勝ち切りたい局面。

正解は、△A3キリンとキリンを突き出す一手(→ 棋譜)。

△C2ライオン とライオンを上がりたくなる局面だが ▲B3ゾウ の反撃を受けてしまう。このあと 相腰掛ゾウ基本定跡 に合流するので勝ち局面であることは変わらないが、手数も長くなりまぎれも多くなってしまう(→ 棋譜)。
図1 ▲A4ゾウ まで

2013年7月7日日曜日

[どうぶつしょうぎ] 完全解析ツールを引き分け局面の追跡に対応させてみる

田中先生のどうぶつしょうぎ完全解析ツールの checkState コマンドは、開始局面が引き分け局面だとその時点で手順の追跡を打ち切ってしまい、引き分けに至る手順は出力されない。
そこで、引き分け局面でも手順が出力されるように checkState コマンドを改造してみた。

  • 引き分け局面を発見したら探索を終了するロジックを除去
  • 引き分け局面の追跡では、通過した局面を覚えておいて通過済み局面に到達したら追跡終了

という作戦で行く。
ざっと読んでみた感じだと、winLoseTable.cc (と winLoseTable.h ) に手を入れれば何とかなりそう。

2013年7月6日土曜日

UUID の Version の見分け方

UUID には いくつかのバージョンがあり、生成方法が定められている。
現在定義されているバージョンは以下の5つ。

Version生成方法
1 MAC-Address と 生成時刻によるもの
2 DCE Security version
3 名前(byte列)のMD5 ハッシュによるもの
4 ランダム
5 名前(byte列)の SHA-1 ハッシュによるもの


UUID の形式は以下のようになっている。

xxxxxxxx-xxxx-Vxxx-xxxx-xxxxxxxxxxxx

赤字の「V」のところがバージョン番号。

2013年7月1日月曜日

Google Apps Script から Twitter を使う

Google Apps Script から Twitter API を使ってみよう。
今回の目標は、Google Apps Script から Twitter の認証を経由して Tweet することにする。


Callback URLの指定


まず、Twitter の 連携アプリケーション管理画面 で Google Apps Script 用に Callback URL を設定する。

https://spreadsheets.google.com/macros/ 

2013年6月23日日曜日

Play Framework から Twitter4J を使う。

Twitter 上でのログイン込みで OAuth 認証をを、 Play Framework で Twitter4J を使って試してみる。 せっかく Play を 2.1.1 に上げたところなので、 Play 2.1 の新機能である Filter 機能を使ってみよう。

アプリにアクセスすると Twitter の認証画面が出て、 認証すると Tweet するような感じで作ってみる。

2013年6月22日土曜日

[Play] Play 2.0.3 から Play 2.1.1 へバージョンアップ

最近 これまで使っていた Play 2.0.3 のバージョンを変えていなかったので、 Play 2.1.1 にバージョンアップしたらいろいろ動かなくなった。
そもそもコンパイルが通らない。

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: play#sbt-plugin;2.0.3: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]
[warn]  Note: Some unresolved dependencies have extra attributes. 
 Check that these dependencies exist with the requested attributes.
[warn]   play:sbt-plugin:2.0.3 (sbtVersion=0.12, scalaVersion=2.9.2)
[warn]
sbt.ResolveException: unresolved dependency: 
play#sbt-plugin;2.0.3: not found

いくつか手を入れないといけなかったのでメモ。

2013年6月16日日曜日

[Play] Play Framework のセッション

Play Framework には Tomcat のような HTTP セッションがない。
Play でのセッションは Cookie として実現されている。
Play でセッションを使う場合にはこのようなコードになる。
package controllers

import play.api._
import play.api.mvc._
import play.api.mvc.RequestHeader

object Application extends Controller {
  def index = Action.apply { request => 
      val currentVal : String = request.session.get("hoge") match {
         case Some(x) => x;
         case None => "";
      }
      
      Ok("hoge = " + currentVal).withSession(
            request.session + ("hoge" -> "hogege"));
  }
}

request.session.get は Option を返すので、 パターンマッチで SomeNone かを判定して、Some から値を取り出す必要がある。
もしくは、Option.getOrElse を使って、
      ...
      val currentVal : String = request.session.get("hoge").getOrElse("");
      ...
とする。こっちの方が簡単でいい。

2013年6月15日土曜日

[Play] Play の Welcome Application

Play Framework 2.0.3 で 「play new XXX」で simple Scala application を作成したときに生成される Application.scala は 以下のようになっている。

package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {
  
  def index = Action { 
    Ok(views.html.index("Your new application is ready."))
  }

}

ここで、Application#index メソッドの返り値は、
play.api.mvc.Action[play.api.mvc.AnyContent]
になっている。
何が起きているのか分かりずらいので少し中を見てみることにしよう。

2013年6月10日月曜日

Twitter4J の OAuth 認証を使ってみる

OAuth を調べてみようとしてとりあえず OAuth 認証をサポートしている Twitter の Java 用ライブラリの Twitter4J を使ってみた。
OAuth の基本的な使い方
  1. 事前のアプリケーション(Consumer)用に サービスプロバイダにアプリケーションを登録して、 アプリケーション用の Consumer Key と Consumer Secret を入手する。
  2. アプリケーションはサービスプロバイダにアクセスして認証用の RequestTokenを入手する。
  3. ResuestToken を引数に Twitter の認証画面を表示する。
  4. RequestToken が認証されたら AccessToken を取得する。
  5. AccessToken を使用して サービスプロバイダの機能を呼び出す。
大体こんな感じだと思う。

2013年6月9日日曜日

[どうぶつしょうぎ] ▲B3キリン - 中キリン-


図1は序盤によく出てくる先手が中央にキリンを持ってきた中キリン局面。
初手からの典型的な手順は

▲C3キリン、△A2キリン、 ▲B2ヒヨコ、 △同ゾウ、
▲B3キリン

他にもいろいろな手順でこの局面に行き着く。

後手勝ち局面で先手後手最善を尽くすとあと68手で後手が勝つ。
この手順(中キリン定跡)を見てみよう。
棋譜は こちら
図1 ▲B3キリン まで


2013年6月3日月曜日

[どうぶつしょうぎ] 完全解析ツールのバグについて

以前、東京大学情報基盤センターの田中先生による「どうぶつしょうぎ完全解析ツール」をUbuntu環境で使うとエラーになる件について環境依存かもしれないと書いたのだが、 ちゃんと調べてみたら単なるバグだったことが分かった。

環境によって動いたり動かなかったりしたのはたまたまの模様。

2013年6月2日日曜日

Google サイト の サイトマップ

以前、Blogger の サイトマップを ウェブマスターツールに登録した。 同じようにして、Googleサイト のサイトマップも登録してみる。

2013年6月1日土曜日

[どうぶつしょうぎ] 相腰掛ゾウ定跡9手目からの変化 -その2



図1は 相腰掛ぞう基本定跡 の9手目。
先後手最善を尽くした場合、あと67手で後手が勝つ局面。


前回 は▲A3ヒヨコ打、△B1ライオン、▲C3キリン上(36手後手勝ち)の変化を調べてみたので、 今回はもう一つの有力な変化になる▲A3ヒヨコ打、△B1ライオン、▲C3キリン寄(54手後手勝ち)を調べてみよう。
△B1ライオンの次の手順としては、この▲C3キリン寄が最善手になる。
この手順の棋譜は こちら
図1 △C2ゾウ打 まで

2013年5月27日月曜日

[どうぶつしょうぎ] 相腰掛ゾウ定跡9手目からの変化

図1は相腰掛ぞう基本定跡の9手目。
先後手最善を尽くした場合、あと67手で後手が勝つ局面。


定跡通りなら▲B2キリン とゾウをとり、△同ライオン、▲A3ゾウ打 と続く。 しかし実戦では有力な変化があるところなので、それらの変化を見てみよう。

先手▲C3キリン は△同ゾウ で失敗。
▲同キリン、△B3ヒヨコ で先手万事休す。

そこで図1から▲A3ヒヨコ打、△B1ライオンと進む変化が有力になる。
先手の次の手は、▲C3キリン上(36手後手勝ち)、▲C3キリン寄(54手後手勝ち)が有力な応手になる。
図1 △C2ゾウ打 まで

2013年5月26日日曜日

Ubuntu on VirtualBox で ホストとのファイル共有ができなくなった

これまで普通に、ホストファイルシステムの共有ができていた VirtualBox 上のUbuntu が急にファイル共有できなくなった。 最近実行したカーネルアップデートが原因だった。
カーネルをアップデートすると、VirtualBox Guest Additions を再インストールしないといけない模様。

Guest Additions を再インストールしてリブートで解決。
以下、その顛末。

2013年5月25日土曜日

Ubuntu の バージョンの確認方法

VirtualBox 上に Ubuntu 環境が増えてきたのでバージョンの確認方法をまとめておく。

2013年5月21日火曜日

VirtualBox の Linux に Windows ホストのファイルシステムを共有する

VirtualBox 上で動いている Linux から Windows ホスト上のファイルシステムを共有して 利用可能にする方法のメモ。

Ubuntu 13.04 x64 on VirtualBox 4.2.12
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 13.04
Release: 13.04
Codename: raring

必要なもの:

VirtualBox Guest Additions がインストールされていることが必要。
普通はインストール済みのはず。

Windows上の作業:

共有するディレクトリを作成。 (例: C:\Work\Shared)

Virtual Box上の作業:

共有フォルダを作成する。
「Virtual Boxのデバイスメニュー > 共有フォルダ」 を実行して 共有フォルダを作成。
「共有フォルダ」、「一時的な共有フォルダ」が選択できる。
今回は一時的に共有できれば十分で永続化するつもりはないので、
「一時的な共有フォルダ」以下に共有フォルダを作成する。

パスに共有するフォルダのWindows上の物理的なパス、
フォルダー名に Linuxから見える共有フォルダ名を指定。
ここでは、パスに「C:\Work\Shared」、
フォルダー名に「Shared」を指定した。

読み取り専用なら「読み取り専用」にチェックを入れる。
一時的なものなので自動マウントと永続化はチェックしない。

Linux上での作業:

  • マウントするディレクトリを作成する。
    sudo mkdir /media/shared
  • マウントする。
    sudo mount -t vboxsf [共有名] [マウントするパス]
    sudo mount -t vboxsf Shared /media/shared
    ファイルタイプは vboxfs ではなく vboxsf。
    VirtualBox Shared Folder の略か?



これで完了。
$ ls /media/shared
テスト.txt


自動マウントを設定した場合には再起動時に、 /media/sf_[共有名] フォルダが作成されてそこにマウントされる。
この場合、vboxsf グループのメンバーしかアクセスできないので、ログインユーザーを vboxsf グループのメンバーにする必要がある。

参考:

2013年5月20日月曜日

VirtualBox で GuestAddition マウント時のドライブ選択

VirtualBox の Ubuntu に GuestAdditions を再インストールする必要があったので、 ストレージから除去してあった VBoxGuestAdditions.iso を 再度マウント。

で、Ubuntu 上から実行するのだが起動しない。
どうもおかしいと思って調べていたら、ファイルの読み込みでエラーになっていることが分かった。

ローカルドライブにファイルをコピーしようとすると、 「ファイルをspliceする際にエラー」のようなエラーになる。

2013年5月18日土曜日

[Blogger] Blogger の概要ページのチャート

Blogger の概要ページで表示されるページビューのチャート。
前から微妙に気になっていたのだがどうやって作っているのだろう・・・
調べてみた。

2013年5月12日日曜日

[Scala] AppEngine で Scala を使う

Eclipse + App Engine で Scala を使ってみる。

以前、既存 Java プロジェクトで Scala を使えるようにする方法は確認したので、 Google Web Application プロジェクトを作って、 そこで Scala が使えるようにする方法で行く。

2013年5月6日月曜日

[どうぶつしょうぎ] 先手 B3ヒヨコ 打ち直し


▲B2ヒヨコ、△同ゾウ のヒヨコ交換後、先手が▲B3ヒヨコ と ヒヨコ を打ち直して来ることも多い。
後手は △C1ゾウ の一手で、それに先手が▲C3キリン と上がってきた局面。

ここで後手はどう応じるか。
図1: ▲C3キリン まで

2013年5月5日日曜日

[どうぶつしょうぎ] 完全解析ツール on Ubuntu

前回まで、田中先生の どうぶつしょうぎ完全解析ツールは Amazon EC2 上の Amazon Linux 上で動かしていたのだが、 手元の VirtualBox 上 の Ubuntu に持ってくることにした。

結果としては、32bit 版 Ubuntu では動かず、64bit 版が必要なようだ。
→ 訂正: Ubuntu 13.04 x64 with g++ 4.7.3 でも動かない。
  現状の動作実績は、Ubuntu 11.10 x64 with g++ 4.6.3のみ。

追記
完全解析ツールのバグだった。
環境によって動いたり動かなかったりはたまたまだった模様。
原因と修正方法はこちら。

2013年5月4日土曜日

[どうぶつしょうぎ] ぴよ替わり後の▲C3きりん

前回、田中先生の完全解析結果を使うツールの準備をしたので、 最善手順以外も調べてみよう。

▲B2ヒヨコ、△同ゾウ、▲B3ゾウ、△A2キリン

先手一手損ぴよ替わり型から、後手がキリンを突きだした形。完全解析結果では、ここで先手は「▲A2同ゾウ」となっている。 しかし、実際には▲C3キリン と先手もキリンを突き出すことが多い。

この後の最善手順を見てみよう。
この局面からの完全解析ツールによる最善手順はこちら。
▲C3きりん まで

2013年4月21日日曜日

[どうぶつしょうぎ] 完全解析ツールの checkState で最善手順を求める

田中先生による完全解析結果のページには、 先手の4つの初手からの最善手順しか掲載されていないので、 それ以外の手順は自分で解析ツールを実行する必要がある。
解析ツールは 田中先生の完全解析結果のページからダウンロードできる。

Unix 系なので 久しぶりに Amazon EC2 の Amazon Linux を使ってみた。
マイクロインスタンスなので CPU パワーはないが、 局面解析をするわけではなく、解析結果を使って最善手を探すだけなのでこれで十分。

2013年4月8日月曜日

[どうぶつしょうぎ] 完全解析 その他の初手

東京大学情報基盤センターの田中先生による、どうぶつしょうぎの完全解析結果から 前回は初手「▲B2ひよこ」の場合の最善手順を見た。

今回は、それ以外の場合の手順について見てみよう。
各初手での最適手順は以下にある。



2013年4月7日日曜日

[どうぶつしょうぎ] 完全解析

どうぶつしょうぎは、東京大学情報基盤センターの田中先生によって完全解析が行われており、 後手必勝であることがわかっている。

これによると
  • 初手「B2ひよこ」なら後手76手勝ち
  • 初手「C3きりん」なら後手78手勝ち
  • 初手「C3ライオン」または「A3ライオン」なら
    後手78手勝ち
という結果になっている。

意外なことに初手によってほとんど差が出ない。
むしろ先手最善と思われる「B2ひよこ」が最短になっている。

到達局面は2.5億局面ほどあるそうなので、先手の応手まで全部覚えきれるわけはないのだが、 とりあえず手順を見てみることにしよう。
各初手からの最短(先手から見たら最長)手順は以下に記載されている。

一番ありそうな「B2ひよこ」からの相腰掛ぞう基本定跡を見てみよう。 局面の読み方はこちらから。

2013年4月6日土曜日

Evernote 4.6.4 の インストールエラー

Evernote を最新版の 4.6.4.8136 に更新しようとしたら、 エラーが発生してインストールができないようになってしまった。
予期しないエラーが発生しました。
このパッケージに問題がある可能性があります。
エラーコード:2732。

Google で検索すると特定のレジストリを削除することで回避できるとのこと。
しかしもっと簡単な回避策があった。

  • コントロールパネルの「プログラムと機能」から古いEvernote(今回は4.6.3)を削除。
  • ダウンロードした最新の Evernote インストーラを実行。

これで無事インストールすることができた。
情報源はこちら。

このページでは、
  • 単純なアンインストール/再インストール
  • REVO Uninstaller を使う方法
  • Evernote 4.6.1 をいったんインストールする
  • RegEdit でレジストリを削除する方法
の各方法について記載している。

2013年3月25日月曜日

JavaScript で 0パディング

JavaScript では String.format が使えないので整形する時に少し不便。
0パディング(ゼロパディング)をしようとしたときに簡単なやり方があったのでメモ。
0パディング:
n桁に足りない整数値の場合、左を0で埋める操作。
123を6桁にする場合には、000123のようになる。

2013年3月18日月曜日

GRAPES でアステロイドを描く

前回の記事でグラフを描くのに、関数グラフ描画ソフト GRAPES を使ってみた。

このソフトがあまりにもすごいので今回はこれでアステロイド曲線を描いてみる。

2013年3月11日月曜日

[ドリトル] 包絡線 -アステロイド-

この間は、包絡線で放物線を作ってみたので今度は「アステロイド曲線(星芒形(せいぼうけい))」を描いてみる。

アステロイド

アステロイド(astroid)の語義はギリシア語: aster(星の)+ -oid(ようなもの)であり、星芒形(せいぼうけい)、星形とも呼ばれる。アステロイドは四つの尖点を持つ内サイクロイド(四尖点内擺線)であり、四尖点形 (tetracuspid) の名称も古くから用いられている
- Wikipedia

アステロイド曲線は、X軸Y軸との交点間の距離が等しい直線群によって構成される包絡線になる。
つまり、ある長さの棒を壁に立てかけたときに滑って倒れるときに、その棒が描く包絡線がアステロイド曲線になる。

2013年3月10日日曜日

[ドリトル] 包絡線 -放物線- その2

前回の記事では、2直線上を等速で動く点間の直線群が描く包絡線が放物線になるのをやってみた。
放物線を包絡線で描くにはもう一つほかの方法がある。
「直線 L 上の任意の点 Q と L 上にない点 P の間の直線 PQ と、
直線 L上で交わる直線群」の包絡線は放物線になる。


2013年3月5日火曜日

[ドリトル] 包絡線 -放物線-

この間の記事 で与えられた2点を通る直線を引くメソッドを作ったので、 それを使って包絡線を描いてみよう。

包絡線

包絡線(ほうらくせん、envelope)とは、与えられた曲線族と接線を共有する曲線、すなわち与えられた(一般には無限個の)全ての曲線たちに接するような曲線のことである。
- Wikipedia

以下の方法で描画する。
  • 2つの非表示タートルを用意する。
  • 各々を1ステップずつ移動しながら、両者の間に線を引く。
  • 始点はX軸上を左から右へ、終点はY軸上を上から下へ等速で動かす。

2013年3月4日月曜日

[ドリトル] 三角関数で謎な図形

無限ブログの記事で面白いのを見つけた。


aTurtle =Turtle ! create (blue) linecolor 1 linewidth。
aTurtle ! penup 200 200 moveto pendown.
[ | i |
 aTurtle ! 5 forward (90 * sin(i)) rightturn.
] ! 3000 repeat.



なんだこれは???

2013年3月3日日曜日

[ドリトル] 直線延長

指定した2点を通る直線を引く。
  • 2点の前後に延長する長さを指定する。
  • 描画開始点と終了点のX座標を指定する。

2013年3月2日土曜日

[Scala] 無名関数の return の仕組み(その2)

前回の記事 に引き続き、無名関数中の return 文の仕組みについて調べてみる。
今回は 匿名関数を引数に引き渡して深い階層からリターンしてくる場合を見てみよう。
今回の Scala コードはこれ。

  def main(args:Array[String]) {
    println("main start")
    test();
    println("main finish")
  }

  private def test() {
    val f = () => return;
    println("test start")
    test2(f);  
    println("test finish")   // 実行されない。
  }
 
  def test2(f: () => Unit) {
    println("test2 start")
    f();
    println("test2 finish")  // 実行されない。
  }

------------------
main start
test start
test2 start
main finish

test2() 内の 匿名関数実行で test2()、test() を一気に脱出している。

2013年3月1日金曜日

[Scala] 無名関数の return の仕組み

この前の記事で、Scala の無名関数中での return 文の動きについてみてみた。

今回はその仕組みが Java 的にどうなっているのか見てみる。 JD-Plugin の導入には前回失敗したので、デコンパイルには Java Decompiler の GUI 版を使った。
前回使ったコードはこれ。
  def main(args:Array[String]) {
    println("main start")
    test();
    println("main finish")
  }
  
  private def test() {
    val f = () => return;
    println("test start")
    f();
    println("test finish")   // 実行されない。
  }

------------------
main start
test start
main finish

2013年2月23日土曜日

Java Decompiler が Eclipse Juno で動かない

Scala コンパイラが生成するクラスファイルが、Java としてどうなっているのかを確認したかったので、 Java の逆コンパイラを導入する。

Java の逆コンパイラといえば Jad が有名だが Java 1.5 以降には対応していないなど古くなってきていて、 最近はその名の通り Java Decompiler というのがよく使われているようなのでそちらを採用。 Eclipse 用に JD Eclipse という Plugin もある。

がどうやっても JD Eclipse が動かない。
結局断念して単独の GUI 版を使うことにした。

いつかの再挑戦に備えて今回の敗退の記録を残しておく。

2013年2月18日月曜日

[Scala] 無名関数中での return 文

無名関数の中で return 文を使うと、関数を抜けるのではなく、 無名関数を定義した関数自体を抜けてしまう。
  def main(args:Array[String]) {
    println("main start")
    test();
    println("main finish")
  }
  
  private def test() {
    val f = () => return;
    println("test start")
    f();
    println("test finish")   // 実行されない。
  }

------------------
main start
test start
main finish

test() が f() 呼び出しで return していることがわかる。
関数なのだから なんとなく 無名関数 だけを return しそうな気がするので 気を付ける必要がある。

2013年2月16日土曜日

Android 機のスクリーンショット

Android4.0(ICS)以降ならアプリを使わず、OS の標準機能でスクリーンショットが取れる。


端末の電源ボタンと音量調節のダウンボタンを同時に押す

2013年2月12日火曜日

どうぶつしょうぎカップの棋譜の傾向

前回の記事 で、 どうぶつしょうぎカップの棋譜を取り込んだので、その傾向を見てみよう。

全21局中、▲B2ひよこ:12局、▲C3きりん:7局、▲C3ライオン:2局 だった。
やはり、▲C3ライオンはいまいちか。

全勝優勝の中田プロは先手局では、
▲B2ひよこ:2局、▲C3きりん:2局。
中田プロに負けた以外は全勝の武田アマは
先手局 2局とも▲B2ひよこ。

2013年2月8日金曜日

どうぶつしょうぎカップの棋譜

第23回1DAYトーナメント・どうぶつしょうぎカップのページに 同大会での棋譜がある。

棋譜はこのページで対局ごとに Flash で再生できるのだが、 データ自体は、 http://www.liblog-sns.jp/doubutsu/XXX.txt という形式で入っている。
対局は4局同時対局で7局目まであるので、XXXの部分は、 101~104、・・・、161~164まで計28局分。

どうぶつしょうぎカップは第33回1DAYトーナメントでも開催されているが、こちらの棋譜は見当たらなかった。

2013年2月7日木曜日

どうぶつしょうぎ ▲C3ライオン

動物将棋その2

初手 ▲C3ライオン の後を調べてみよう。
△A2ライオン は ▲C2ライオン 以下先手の勝ちなので、 後手の応手は △B3ひよこ か △A2きりん。

2013年2月5日火曜日

どうぶつしょうぎ

以前話題になっていた「どうぶつしょうぎ」。
初手は何がいいのだろうか?

盤面は左からA、B、C、
上から1、2、3、4。
ありうる手は、
  • B2ひよこ
  • A3ライオン
  • C3ライオン
  • C3きりん
の4手。

2013年2月4日月曜日

[Scala] Lazy による遅延評価

変数宣言時に Lazy キーワードをつけるとその値が必要になるまで値の評価を遅延できる。
  var x = 1;
  lazy val z = x*2;
  x = 2;
  println(z);

--------------------
4
変数宣言時には x の値は 1 だが、println(z) 呼び出しで z の値が必要になった時点で評価されるので、 出力は 4 になる。

2013年2月2日土曜日

[Scala] 名前渡し

Scala で関数を定義する際、仮引数名と型名の間に 「 => 」を記載すると名前渡しとなり、値が必要になったときに式の値が評価される。
  var x = 1;
  
  def main(args: Array[String]) {
    x = 1;  
    notdelayed(x*2);
    x = 1;  
    delayed(x*2);
  }

  def notdelayed(value : Int) {
    x = 100;
    println("notdelayed: " + value)
  }  

  def delayed(value : => Int) {
    x = 100;
    println("delayed: " + value)
    x = 200;
    println("delayed: " + value)
  }

--------------------
notdelayed: 2
delayed: 200
delayed: 400

2013年1月26日土曜日

Android で Bluetooth ヘッドセットを使う

Android 機で普段音楽等を聞くのに使っている Bluetooth ヘッドフォンだがマイク機能もついている。 通話などではヘッドセットとして使用できるのだが、録音アプリやWeb会議などのアプリではマイク機能が使えないので少し調べてみた。

2013年1月21日月曜日

[Scala] 関数リテラルの2つの定義方法

Scala で関数リテラルを定義する場合、通常はこのような形式で定義する。
  val a : Function2[String, String, Unit] = (x,y) => {
    val xx = x + y;
    println(xx);
  }
  a("abc", "def")

--------------------
abcdef

2013年1月20日日曜日

[Scala] Soure.fromUrl での認証

認証が必要なページへアクセスする際の認証の方法。
Apache HttpClient 等を使うのであればその流儀でやればいいのだが、scala.io.Source.fromUrl 等で簡単に済ませる場合のやりかた。

Java の java.net.URL で使う方法をそのまま使う。