日常 発表、ニュース

小説「獣の奏者」の世界地図

Published by:

先日、友人から「獣の奏者」という本を借りました。

獣の奏者 I 闘蛇編
獣の奏者 I 闘蛇編 上橋 菜穂子

講談社 2006-11-21

Amazonで詳しく見るby G-Tools

獣の奏者 II 王獣編 獣の奏者-3-探求編 獣の奏者 (4)完結編 獣の奏者 外伝 刹那

全4冊の単行本で、作者である上橋菜穂子さんの別の本で雰囲気に慣れていたこともあり、一気に最後まで読み終えました。

実は2巻まででいったん完結しているお話で、読者からの強い希望で続く3~4巻が書かれたという経緯があるのですが(あとがきで知りました)、最初から後編を意識していたかのような統一感を感じました。

最初から全体の世界観をしっかりと作り上げた上で書かれているんでしょうね。
こういうことは、本当に誰も真似できるものではないと思います。

前編から後編に読み進むにつけて、舞台となる世界が少しずつ広がっていきます。
そして、町の名前や川の名前が増えていくと、ついついメモを取りたくなります。

ウラムをはじめ、イキシリ、トグラムの隊商都市は、それら三つの都市より、はるかに東にあり、かつてハジャン王国の都であったハジャに近かった。

イミィルと、我がリョザ神王国のアマスル領とは、馬車ならば四日、早馬であれば二日でつける距離。イミィルを落とされたら…



こんな文章があると、つい巻頭の地図を参照したくなるのですが・・・なぜか獣の奏者には、地図がついていない!
友人に借りた単行本についていないだけで、別の版にはあるのかもと思い、インターネットで検索したりもしたのですが、なぜかこの小説の世界地図は作られていないようです。
確かに2巻までであれば、強いて作らなくてもよいかもしれませんが、全4巻になったからにはぜひ作ってほしいものです。

・・・ということで、本当に勝手ながら作ってしまいました!

なんというか、自分と貸してくれた友だちのためだけに作りましたので、無いよりましレベルなんですけど、私以外にも地図が欲しいと思っている人もいると思いますので、記念として(?)ブログにアップしておきます。

地図作成に作ったメモも一緒に・・・

位置情報の書き抜きメモ(Excelファイル)

あと、印刷しやすいよう、PDFファイルもついでに。

印刷用PDF(A4印刷で、余白を切ると単行本にはさめるサイズ)

大公(アルハン)領が小さすぎるとか、西部の街々の位置関係が実は適当とかいろいろあるのですが、まあ趣味の作成ということで。

Android

AndroidのSpinner用Key-Value簡易アダプター

Published by:

Androidのアプリを作っていて、単純な「キー=値」構造のプルダウンメニューを一つ作ろうとすると、その都度 XXXAdapter extends ArrayAdapter<String> を作るハメになります。
毎回面倒ですので、どんなオブジェクトでも簡単にSpinner化できるようなKeyValueAdapterクラス+KeyValueItemインターフェースを作りました。
HTMLの<select>タグのような感じで使えますよ。

■サンプル:MyObjectクラス
package com.lumiere_couleur.android;
 
public class MyObject implements KeyValueItem {
    private int id;
    private String name;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public long getOptionValue() {
        return id;
    }
 
    @Override
    public String getOptionLabel() {
        return name;
    }

}

■KeyValueItemインターフェース
package com.lumiere_couleur.android;
 
public interface KeyValueItem {
    // 選択肢の値
    public long getOptionValue();
 
    // 選択肢の表示文字列
    public String getOptionLabel();
}

■KeyValueAdapterクラス
package com.lumiere_couleur.android;
 
import java.util.List;
 
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
 
public class KeyValueAdapter extends ArrayAdapter<String> {
 
    private List<? extends KeyValueItem> items;
 
    /**
     * コンストラクタ
     *
     * @param context
     * @param resourceId
     * @param items
     */
    public KeyValueAdapter(Context context, int resourceId,
            List<? extends KeyValueItem> items) {
        super(context, resourceId);
        this.context = context;
        this.items = items;
    }
 
    public int getCount() {
        return items.size();
    }
 
    public String getItem(int position) {
        return items.get(position).getOptionLabel();
    }
 
    public long getItemId(int position) {
        return items.get(position).getOptionValue();
    }
 
    public int getPosition(long itemId) {
        for (int i = 0; i < items.size(); i++) {
            if (items.get(i).getOptionValue() == itemId) {
                return i;
            }
        }
        return 0;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView label = new TextView(context);
        label.setTextColor(Color.BLACK);
        label.setText(items.get(position).getOptionLabel());
        return label;
    }
}

これでアダプターの量産から逃れられます。

日常

10年目の蒸し器の真実

Published by:

家が使っている蒸し器はこんな感じ。

閉じているところ

開くとこんな感じ。

開いたところ

フライパンに水を入れて、この蒸し器を開いておいて、さらにその上に別のフライパン(中華鍋みたいな形の)をフタにして使っているのですが、真ん中の持つところがものすごく邪魔で、いつかちゃんとした新しい蒸し器を買ってやると思い続けていました。

・・・が、

取れた

取れるのね、これ・・・

取れた持ち手の叫びが聞こえそうだ。
Ω Ω Ω <アホー

プログラミング

PHPExcelでセルの入力規則に名前定義を使う方法

Published by:

PHPExcelとはPHPでExcelを読み書きするための便利ツールですが、一度はまると泥沼に陥りやすいので、取り扱いに非常~に注意が必要です。

そんな泥沼の一つからやっと生還したので、ブログに書き残しておこうと思います。

上手のようなものをPHPExcelで動的に行おうと思ったのですが、ニッチもサッチもいかない。
「Excel2007」のWriterだと $validation->setFormula1(‘=野菜’); で簡単に出来るのですが、要件的にExcel2003への対応が必須だったため、どうしても「Excel5」のWriterで吐き出される必要がある。

最終的にうまくいったのですが、PHPExcelのコードの修正が必要です。

■PHPExcel/Writer/Excel5/Worksheet.php(PHPExcel 1.7.7)
2844:                // formula 1
2845:                try {
2846:                    $formula1 = $dataValidation->getFormula1();
2847:                    // >>> Added by S.Sakai
2848://                    if ($type == 0x03) { // list type
2849:                    if ($type == 0x03 && preg_match('/^\".*\"$/', $formula1)) { // list type
2850:                    // <<< Added by S.Sakai

2851:                        $formula1 = str_replace(',', chr(0), $formula1);
2852:                    }
2853:                    $this->_parser->parse($formula1);
2854:                    // >>> Added by S.Sakai
2855:                    if (is_array($this->_parser->_parse_tree)
2856:                            && strtoupper($this->_parser->_parse_tree['value']) == 'INDIRECT') {
2857:                        $this->_parser->_parse_tree['force_reference'] = true;
2858:                    }
2859:                    // <<< Added by S.Sakai

2860:                    $formula1 = $this->_parser->toReversePolish();
2861:                    $sz1 = strlen($formula1);
2862: 
2863:                } catch(Exception $e) {
2864:                    $sz1 = 0;
2865:                    $formula1 = '';
2866:                }

■PHPExcel/Writer/Excel5/Parser.php(PHPExcel 1.7.7)
616:    // >>> Added by S.Sakai
617://    function _convertFunction($token, $num_args)
618:    function _convertFunction($token, $num_args, $force_reference)
619:    // <<< Added by S.Sakai

620:    {
621:        $args = $this->_functions[$token][1];
622://        $volatile = $this->_functions[$token][3];
623:
624:        // Fixed number of args eg. TIME($i,$j,$k).
625:        if ($args >= 0) {
626:            return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]);
627:        }
628:        // Variable number of args eg. SUM($i,$j,$k, ..).
629:        if ($args == -1) {
630:            // >>> Added by S.Sakai
631://            return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]);
632:            if ($force_reference) {
633:                return pack("CCv", $this->ptg['ptgFuncVar'], $num_args, $this->_functions[$token][0]);
634:            } else {
635:                return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]);
636:            }
637:            // <<< Added by S.Sakai

638:        }
639:    }


1571:        // if it's a function convert it here (so we can set it's arguments)
1572:        if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and
1573:            !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and
1574:            !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and
1575:            !is_numeric($tree['value']) and
1576:            !isset($this->ptg[$tree['value']]))
1577:        {
1578:            // left subtree for a function is always an array.
1579:            if ($tree['left'] != '') {
1580:                $left_tree = $this->toReversePolish($tree['left']);
1581:            } else {
1582:                $left_tree = '';
1583:            }
1584:            // add it's left subtree and return.
1585:            // >>> Added by S.Sakai
1586://            return $left_tree.$this->_convertFunction($tree['value'], $tree['right']);
1587:            return $left_tree.$this->_convertFunction($tree['value'], $tree['right'], $tree['force_reference']);
1588:            // <<< Added by S.Sakai

1589:        } else {
1590:            $converted_tree = $this->_convert($tree['value']);
1591:        }

CONCATENATE(“野菜”)の部分をCONCATENATE(“野菜_”,A2)のように変えれば、ほかのセルの入力値を使ってさらに動的な入力規則を設定できるようになりますよ。

今日は丸一日これにドはまりでした。
PHPExcelには、このページをそのまま通知しようかな。。

あ、あとPHPExcelで困っている人にお勧めなのが、下の2つです。

それではお休みなさい (つ_-*)。οΟ ゜

発表、ニュース

Google検索結果リンクに含まれるリダイレクトを無くすChrome拡張

Published by:

Googleの検索結果からリンクをクリックする際、必ずリダイレクトリンクを踏ませられるようになっています。
(リンクをクリックすると、http://www.google.co.jp/url?…というリンクアドレスが、一瞬アドレスバーに表示されます)
2012年3月頃のポリシー変更に伴う処置のようですが、日々このリダイレクト処理が遅くなっているような気がします。
最初は、ん?と思うくらいでしたが、最近はあからさまに1秒くらい固まったりして、ググるたびにフラストレーションが・・・

というわけで、このリダイレクトを無くすChrome Extensionを作成したわけですが、このリダイレクト処理が無くなると、飛んだ先に検索キーワードなどがリファラとして渡されてしまいますので、どこにも痕跡を残したくない!という人には不向きです。

別にキーワードなんて知られてもいいよというChrome遣いの方は、下記リンクからどうぞ。

Google ChromeにGoogle Search Without Redirectionをインストール(ver 0.1)

Chrome ウェブストアにアップすると即行削除されそうなので、自分のブログでだけ公開します・・・
自動アップデートなどはありませんので悪しからず。

以下ソースです。

○manifest.json
{
  "name": "Google Search Without Redirection",
  "version": "0.1",
  "description": "You can link to any page from Google Search without Redirection(http://www.google.com/url?...).",
  "permissions":[
    "tabs", "http://*/", "https://*/"
  ],
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "matches": ["https://*/*"],
      "include_globs": ["http://www.google.*"],
      "include_globs": ["https://www.google.*"],
      "js": ["googlelover.js"],
      "run_at": "document_idle"
    }
  ]
}

○googlelover.js
function doit() {
    var head = document.getElementsByTagName("head")[0] || document.documentElement;
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.appendChild(document.createTextNode("window.rwt = function(){return true;};window.clk = function(){return true;};"));
    head.insertBefore(script, head.firstChild);
    head.removeChild(script);
}
doit();
setInterval(function(){
    doit();
}, 1000);

日常

AKIRAとsmilkobutaのタイムライン

Published by:

ちょうど東京へ出かける用事ができたので、これ幸いと大友克洋GENGA展へ行って来ました!
AKIRAを読んだ人には、全員行ってこいと言いたい。

AKIRAの原画を熱心に見ていると、当時興奮しながら読んでいたことを少しずつ思い出して・・・
でも、あれっていつ頃読んだのかなー・・・?と思い出せなかったので、年表にしました。
ちなみに私は1976年度生まれ(1977年2月)です。

映画版のAKIRAはてっきり漫画を読んだ後に観たものと思い込んでいましたが、小6の時、漫画の前に友達のうちで見せてもらっていたことを思い出しました。
怖かったんだよな~・・・あれ以来ホラー映画にハマったのもついでに思い出しました。

GENGA展では、あの金田のバイクに乗ることが出来ます!
一人でいったので、そばにいた方にお願いして撮ってもらいました。
その方の写真テクのおかげか、何だかすごくカッコいい。

金田バイクにまたがる

自分とは思えない・・・カッコよすぎる・・・!
現像して部屋に飾ろうと思います。

大友先生、ありがとうございます!
一生の宝ものにします!!

日常

仕事は、結局自分のためのもの。

Published by:

今朝見た夢の中で、(常々苦手に感じている)ネットワークがらみの本を出さないかという事になり、「ああ、その前にあの仕事を全部片付けなくちゃ」「ネットワークの本買ってもっと勉強しなくちゃ」と頭をグルグルさせて、半分うなされながら目が覚めました。

起きてみると特に執筆の予定があるわけでもなく、ほっと一息をついたところ、となりで眠っていた息子が手をいっぱいに伸ばしながらこっちに寄りかかっていました。

それを見て、「ああ、ななつんつん(ニックネーム)のためにも頑張らなくちゃ」といういかにもなセリフを心のなかで唱えてみて、気が付きました。
いやいや、仕事は、結局自分のためにしているものなんだ、と。

仕事が忙しい時は、息子のために、家族のためにやってるんだという自己犠牲モード(笑)に入りがちですが、大人にとって仕事と職業こそが大きなアイデンティティになってるんですよね。結局。
「○○のため」と言われる方はいい迷惑かもしれません。

そんな事を考えていたら、息子が手を引っ込めて「なに言ってんだ、いい加減にしろ」と、おそらくドラえもんで仕入れたであろうセリフを寝言で言いながら、向こうに寝返りを打っていってしまいました。
はい、すんません。

夢ではなく、実際忙しくなりつつあるので、一つ一つが自己表現と考えてお仕事していこうと思います。

発表、ニュース

四川省史上最も難しい?!Androidアプリ『リアル四川省』

Published by:

リアル四川省(32牌モード)

中学生の頃からゲームセンターで「四川省」や「上海」で腕を鳴らした私ですが、Androidタブレット(MotorolaのXoom)を買って最初にインストールしたアプリはもちろん「四川省」です。
以前のエントリー(Eee Top買ったよ~)でも、タッチパネルPCを買って最初に四川省をインストールしてますし、ほんと好きなんですよね。

「四川省」というのは、麻雀牌を使ったパズルゲームなんですが、別に麻雀とは全然関係なくて、同じ牌を選んで消していくだけの単純なゲームです。
ただし、最大2回まで曲がる直線で結ぶという制約があります。
似たようなゲームに「上海」っていうのがありますが、それよりも少しストイックな感じ?でしょうか。

すぐにいくつかの四川省アプリをインストールしてみたのですが、どれもこれも携帯向けのアプリばかりで、単に携帯向けの画面が拡大表示されるだけなんですね。。
タブレットの大きな画面で遊ぶには画像が粗すぎる~(T T)

というわけで作りました!タブレット向きの「四川省」を!

リアル四川省(176牌モード)

リアル四川省(176牌モード)




その名も「リアル四川省」。
牌画像はSVGというベクターグラフィックスで作成していますので、どんなに拡大してもきれいに表示されます。

リアル四川省(32牌モード)

リアル四川省(32牌モード)



出来上がって最初に遊んだ時は、心から歓喜しましたよ~!
いやほんと、四川省好きの私じゃないと作らないアプリだと思います。

中でも「176牌モード」は激ムズで、

  • スマホではおそらくクリックできないであろう、最多の176牌!
  • 限りなく高い「手詰まり」率!(すみません。牌の並びはランダムで表示しています)
  • 「春」「夏」「秋」「冬」や「菊」「蘭」「竹」「梅」などの絵柄牌も、同じ牌同士じゃないと取れません!

などの特徴を持っています。
もちろん普通のサイズのゲームモードも揃っていますので、初めての方もお気軽にお試しください~

もう少し詳しい解説は「リアル四川省 – Androidアプリ」から、さっさと試したい方は↓下のアイコンからどうぞ。

Androidマーケットで購入
リアル四川省をダウンロード

Androidタブレットをお持ちの方にはぜひとも遊んで欲しいです。
タブレットと四川省って、すごく相性がいいんですよ~。

それと、リリース前から「リアル四川省」を何度も遊んでくれたパートナーarcielと、友人のこむりん氏に謝意を表したいと思います。
おかげで大分バグがつぶれたよー(笑

UI コンピュータ ソフトウェアidea

idea#14 ついに来た!超仮想キーボード

Published by:

マイクロソフトがPC用 新型Kinectを発表・近距離からの高精度な読みとりに対応

PC用の新たなインターフェースとしても Kinect をプッシュするマイクロソフトが、
PC用の新Kinect ハードウェアを発売することを明らかにしました。
新 Kinect はハードウェアおよびファームウェアをPCでの使用に最適化した製品。
奥行きセンサーから40cmの近距離から認識でき、50cmならば
高精度の読みとりが可能な ” Near Mode ” を備え、デスク上などで使う
「クロースアップ」アプリに対応します。

これをタブレットにつなげて使えれば、エアキーボードが可能になる!かも!
前後の入力文字を賢く判断してくれれば、物理キーボードよりもむしろ入力早くなったりして。

マウスジェスチャーのようにジェスチャーと組み合わせて使用すれば、あんなことやこんなことも・・・
なぜか入力インターフェース系には異常に夢が広がります!!