SSHクライアントは D2D/DW PuTTY がオススメ

SSHクライアントはPuTTYの派生版『D2D/DW PuTTY』をずっと使わせてもらっています。
見た目がクールでいいですよね。
ウィンドウを透過設定できるところが個人的に好みです。

d2ddw

導入方法は、まずGDI PuTTYというGDI版のPuTTY(同じ作者さまです)をインストール後、D2D/DW PuTTYをインストールフォルダに上書きする形になります。
インストールの詳細は、公式サイトで説明されているので参考にしてください。

GDI PuTTY
http://ice.hotmint.com/putty/index.html

D2D/DW PuTTY
http://ice.hotmint.com/putty/d2ddw.html

バージョンアップの際も、同じ要領になります。
ただしバージョンアップの際はputty.iniファイル(と、他のiniファイル)を上書きしないように注意しましょう。
保存した設定が消えてしまいます。

PukiWiki に nend 広告を埋め込む

PukiWiki Plus! にnendを埋め込む方法でちょっとつまづいたのでメモです。
編集するファイルは skin/default.skin.php で、以下コードの nend コメントのある箇所から5行を追加するだけです。
(nendから提供された広告コードをコピペします)

<div id="contents">
<table class="contents" width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr>
<?php if (arg_check('read') && exist_plugin_convert('menu') && do_plugin_convert('menu') != '') { ?>
  <td class="ltable" valign="top"><div id="menubar"><?php echo do_plugin_convert('menu') ?></div></td>
<?php } ?>
  <td class="ctable" valign="top">
   <?php if ($is_page and exist_plugin_convert('topicpath')) { echo do_plugin_convert('topicpath'); } ?>
   <div id="body"><?php echo $body ?></div>
	<!-- nend -->
	<script type="text/javascript">
	var nend_params = {"media":xxxx,"site":xxxxx,"spot":xxxxx,"type":x,"oriented":x};
	</script>
	<script type="text/javascript" src="http://js1.nend.net/js/nendAdLoader.js"></script>
  </td>
<?php if (arg_check('read') && exist_plugin_convert('side') && do_plugin_convert('side') != '') { ?>
  <td class="rtable" valign="top"><div id="sidebar"><?php echo do_plugin_convert('side') ?></div></td>
<?php } ?>
 </tr>
</table>
</div>

この箇所に埋め込めば、ちょうど記事の最後にnend広告が表示されるようになります。

当初、スマホでしか表示されないことに気づかずにずっとPCで動作確認をしていて、かなり時間を食ってしまいました(汗
スマホでチェックしたら、すんなりと綺麗に表示されていました。
PCではnendは表示されないので、ちゃんとスマホでチェックするようにしましょう。

Monacaバックエンド

ちょっとしたゲームでもオンラインランキングあったほうが燃えますよね~。

ということでちゃちゃっとランキングの実現性を調査。
Monaca+html+enchant.jsな環境だとフリーで使えそうなランキングサービスはなさそうだったので、自作で作らないといけないのかな~とか思っていたところ、MonacaバックエンドというMonaca直々のサービスを発見しました。
http://docs.monaca.mobi/ja/learning/backend/

Monacaのサイトは結構見てましたけどいままで全然気付かなかった・・・でも7/16にリリースって書いてあるから、つい先日リリースされたんですかね。
ちょっとゲームのランキングに使うのは想定されてない感じもしますけど、これはなんだか良さそう!
近いうちにテストしてみます。

しかしこれも無料で使っていいんですかね。
なんとすばらしいMonaca環境・・・!

.bashrc で nvm use すると WinSCP でログイン出来なくなった件

.bashrc で
source ~/.node/nvm.sh
nvm use v0.10.13
てな感じでnodeを使えるようにしようとしていたのですが、このままだとWinSCPでログインした時になんでかエラーでログイン不可能になってしまいました。
とりあえず上記をコメントアウトして回避しましたが、なんででしょう・・・

socket.io使ってみる

$ node socket_example.js
な具合でsocket.ioのサンプルを実行してみたら
Error: Cannot find module ‘socket.io’
というエラーが出て、おかしいなあと他のサンプルを動かしてみても同じエラー。
うーん、と思って、よくよく見てみたら
$ npm install socket.io
は example.js のファイルがあるディレクトリで実行しないといけないというオチでした。
ナンテコッタイ。

初代Xperia(SO-01B)をAndroid2.3.3にバージョンアップしてみる

monaca+html5+enchant.js+nendなゲームを作っていますが、初代Xperia(SO-01B)で確認してみたところ、なんか表示が変なことに・・・
これはいかんということでMonaca Debuggerを入れてみようとしたところ、Android2.1は未対応・・・それはそうですよね。
どうせ使ってないし、データ消えても問題ないのでいい機会だしAndroid2.3.3にバージョンアップしてみました。
下記サイトの手順通りにやったところ、すんなり成功しましたーよかったよかった。
https://sites.google.com/site/gitoshin/android/xperia-gb

enchant.ui.MutableText を拡張してみる

enchant.jsの enchant.ui.MutableText を拡張してみました。
・フォントテクスチャをコンストラクタで指定できるように。(コンストラクタで座標指定は削除)
・スケール(scaleX scaleY)に対応。
参考までにペタリ。

var MyMutableText = enchant.Class.create(enchant.Sprite, {
	/*!
		コンストラクタ
		@param	fontTexture			テクスチャ
		@param	fontTextureUnitSize	テクスチャの1文字のサイズ
	*/
    initialize: function(fontTexture, fontTextureUnitSize) {
        enchant.Sprite.call(this, 0, 0);
        this.fontSize		= fontTextureUnitSize ? fontTextureUnitSize : 16;		// テクスチャの1文字サイズ
        this.widthItemNum	= 16;	// テクスチャの1列に何文字格納されてるか
        this.x = 0;
        this.y = 0;
        this.m_fontTexture	= fontTexture;
        this._imageAge = Number.MAX_VALUE;
        this.text = '';
        if (arguments[2]) {
            this.row = Math.floor(arguments[2] / this.fontSize);
        }
    },
    /**
     * ラベルの内容を書き換える関数
     * @param txt
     */
    setText: function(txt) {
        var i, x, y, wNum, charCode, charPos;
        var	fontDstWidth	= this.fontSize * this.scaleX;
        var	fontDstHeight	= this.fontSize * this.scaleY;
        this._text = txt;
        var newWidth;
        if (!this.returnLength) {
            this.width = Math.min(fontDstWidth * this._text.length, enchant.Game.instance.width);
        } else {
            this.width = Math.min(this.returnLength * fontDstWidth, enchant.Game.instance.width);
        }
        this.height = fontDstHeight * (Math.ceil(this._text.length / this.row) || 1);
        // if image is to small or was to big for a long time create new image
        if(!this.image || this.width > this.image.width || this.height > this.image.height || this._imageAge > 300) {
            this.image = new enchant.Surface(this.width, this.height);
            this._imageAge = 0;
        } else if(this.width < this.image.width || this.height < this.image.height) {
            this._imageAge++;
        } else {
            this._imageAge = 0;
        }
        this.image.context.clearRect(0, 0, this.width, this.height);
        for (i = 0; i < txt.length; i++) {
            charCode = txt.charCodeAt(i);
            if (charCode >= 32 && charCode <= 127) {
                charPos = charCode - 32;
            } else {
                charPos = 0;
            }
            x = charPos % this.widthItemNum;
            y = (charPos / this.widthItemNum) | 0;
            this.image.draw(	this.m_fontTexture,						// テクスチャ
                				x * this.fontSize, y * this.fontSize,	// 入力xy
                				this.fontSize, this.fontSize,			// 入力wh
				                (i % this.row) * fontDstWidth, ((i / this.row) | 0) * fontDstHeight,	// 出力xy
				                fontDstWidth, fontDstHeight	);			// 出力wh
        }
    },
    /**
     * ラベルの内容
     * @type {String}
     */
    text: {
        get: function() {
            return this._text;
        },
        set: function(txt) {
            this.setText(txt);
        }
    },
    /**
     * @type {Number}
     */
    row: {
        get: function() {
            return this.returnLength || this.width / this.fontSize;
        },
        set: function(row) {
            this.returnLength = row;
            this.text = this.text;
        }
    }
});

Xperia Z SO-02E 上でenchant.jsのタッチがうまくとれない件

っsうーん、Xperia Z SO-02E 上で enchant.js v0.71 のタッチがうまくとれない症状で悩み中。
1回しかタッチしていないのに何故か touchstart が2回反応してしまいます。
他の端末だと大丈夫だったので、端末固有の問題だとは思うのですが、原因不明。

・・・というかそれ以前にmonaca+enchant.jsの環境で、Monaca Debbuger でXperia Z上でプレビューすると基本的になんか動作がおかしいので、まずそれから原因探らないとダメなんですけどね汗

ただ、ビルドしてインストールするとちゃんと動作するので、Monaca Debuggerの不具合なのかもと思い中…

■追記■
enchant.jsのGitHubでまさに同じ問題が報告されていました。
https://github.com/wise9/enchant.js/issues/200
既に解決しているようなので、修正されているenchant.jsファイルをゲットしてきました。
ただ、修正された箇所を見るとわかりますが、enchant.jsを差し替えるだけではダメで、

enchant.ENV.MOUSE_ENABLED	= false;

をCore生成の前に呼ぶ必要があります。
マウスとタッチのイベントがかぶって通知されることがあるとか。
・・・やったー直った!

this.scene にハマる

var MyEntity = enchant.Class.create( enchant.Entity, {
	initialize: function(scene) {
		enchant.Entity.call( this );
		// シーンを保存
		this.scene	= scene;
		// シーンに追加
		scene.addChild( this );
		// この時点で、this.scene は scene じゃなくなっている
		// addChildした時点でthis.scene が上書かれる
	}
});

こんな感じで、やると、this.scene は上書かれてしまいます。
いやいや、sceneメンバが存在していたとは、盲点でした。
これで結構悩んでしまいました(汗
ライブラリ側とかち合わないように、頭に m_ つけたりするのが良いかもしれませんね。

それ以前に、クラス内のメンバにthisでアクセスしなければならない事を結構わすれて、ダイレクトに書いちゃったりするんですが・・・

アプリを作って3000円!Monaca×nendアプリ開発キャンペーン

アプリを作って3000円!Monaca×nendアプリ開発キャンペーン | http://blog.asial.co.jp/1182

ちょうど何日か前、Monacaという、コーディングから最終ビルドまで全てブラウザ上で完結できるすばらしい無料サービスを発見して、これはいい!ということで、ちょっとしたAndroidゲームを制作しているところでした。

そんなところに、なんと良いタイミングでこのキャンペーン・・・!

Monacaの開発、運営を手がけているアシアルさんのブログでMonaca環境でnendを表示するエントリがあったので、広告もnendに決めたところでした。

自分はhtmlやJavascriptの知識はあまりありませんが、まあJavascriptならなんとかなるだろうとenchant.jsというお手軽なゲーム制作ライブラリを使用することにしました。

そんなこんなで、環境は monaca + html5 + enchant.js + nend で決定。

htmlやJavascriptに苦労しつつも現状なんとかゲームの大まかなシーンの流れとnendで広告表示のレイアウトまでうまくいきました。
htmlが理解しきれていないのでhtml+enchant.js+nendの環境で、広告とゲーム画面両方をきれいに表示させるのになかなか苦労しました。

この辺りは、自分の理解が深まった頃にでも、まとめて記事にしたいなと思っています。