ぷよぷよ連鎖シミュレータ


を作ってみた。


GUI設計にVisualSwing4eclipseを使いました。
VisualEditorとJavaEditorを最初うまく使い分けることができなくて
自分で書き加えたコードがeclipse側で何度も消されてしまったり。。。

オススメはVisualEditor時にコードの表示を消すことです。
コード書く時は必ずJavaEditorで。
そして、片方を更新したら確実に各々セーブすること。

これらを徹底したらすいすい作業できました。


▽苦戦した落下処理

// 落下処理
private boolean fall() {
	boolean isActioned = false;
	int emptyCnt = 0;
	int y = 12;
	
	for(int x = 5; x >= 0; x--) {
		while(y >= 0) {
			if(cellLabel[x][y].isEmpty) {
				emptyCnt++;	
			} else if(emptyCnt != 0){ 
				if(!cellLabel[x][y].isEmpty) {
					moveCell(x, y , emptyCnt);
					initCell(x, y);
					isActioned = true;
					
				} else {
					emptyCnt = 0;
					y = 12;
				}
			}
			y--;
		} // end of while
		emptyCnt = 0;
		y = 12;
	} // end of for
	
	return isActioned;
}

スライス記法、Python3.x、HTTP


Python3.1でHTTP通信

サーバ上のIRCのログファイルから特定の文字列を含む行を抽出してメール送信する.py
コンプライアンスに抵触しそうな部分は伏せてます。

import datetime
import urllib.request
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate


# 現在日付をyyMMddの形式で取得
today = str(datetime.date.today()).replace('-', '')[2:]

# 日付からログファイルのURLを生成
logUrl = 'http://******/' + today + '.log'

# HTTP接続
con = urllib.request.urlopen(logUrl)
logList = con.readlines()

# all:抽出
allMsg = ''
for line in logList :
	decoded = line.decode('utf-8')
	if decoded.find('all:') != -1:
		allMsg += decoded
		#print(decoded)

con.close()
allMsg = 'Logged by:\n<http://******/' + today + '.log>\n\n' + allMsg

# メール送信
msg = MIMEText(allMsg.encode('utf-8'), 'plain', 'utf-8')
msg['Subject'] = '[log] ' + today
msg['From'] = '*******'
msg['To'] = '******@dwango.co.jp'
msg['Date'] = formatdate()

smtp = smtplib.SMTP('******')
smtp.sendmail(msg['From'], [msg['To']], msg.as_string())
smtp.close()


スライス記法

# 現在日付をyyMMddの形式で取得
today = str(datetime.date.today()).replace('-', '')[2:]


文字列操作関係を調べてたら[2:]みたいな変な書き方が出てきました。
これはスライスっていう書き方で
たとえばこんなことができます。

# インデックスが1から3の部分文字列を取得
>>>word = 'hogehoge'
print(word[1:3])

# 出力結果
oge


[2:]は(0から数えて)2番目以降の部分文字列取得するという意味です。
ちなみに、文字列じゃなくてリストでも同じことができます。


で、このプログラムを作る上で混乱したことがあったのでメモしておきます。

Python3.xではurllib.urlopen('URL文字列') はエラーになります
2.6から3.0で標準ライブラリのパッケージの統合などが行われたそうです。

import文の違い。

# 2.6
import urllib
import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate


# 3.x
import urllib.request
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate


なぜ、はまったかというとWeb上の参考ページのほとんどが
Python2.6を前提に書かれているからです。
(3.xに関するページはまだかなり少ないようです。)


細かい変更点に関しては以下のドキュメントが参考になります。

What'sNewInPython3.0
http://text.world.coocan.jp/TSNET/?What'sNewInPython3.0

レイアウトを模索中...@めも


こうかなぁ。

投稿確認画面とプレビュー表示も欲しい。

あとせっかくJavaだし環境(OS)に依存しないようにしたい。
設定ファイルのパスとかフォントとかLookAndFeelとか改行とか。


現段階ではメニューバーの必要性あまり感じないけど、ないと見た目にしまりがない。。。

はてダクライアント開発中...


id:Yamashiro0217さんから「t_nagataが最近ブログ書いてない」との指摘がありました。


僕はブログを書き出すと平気で1時間とかかかっちゃうので
最近なんとなく遠ざかってたのは自覚してますorz
ですが、現在開発中の「はてダクライアント」を使えばそんな悩みも解決・・・!


日記に時間がかかる原因の一つがHTMLタグ使いすぎなこともあるので
そこらへんの作業を改善できればいいなと思って主に自分用に作ってます。



プロトタイプが出来て、もう投稿も可能な状態です。
投稿のロジックは以前ブログで書いたものとほぼ同様です。


文字が選択状態の時はその文字を囲む形でタグを挿入することができます。
今後追加する(したい)機能としては
・メニューバー
はてな記法に対応
・コードに行番号表示
・いろんなHTMLタグに対応
・プレビュー表示
・過去の日記を一覧表示、編集
・ホットキーの設定
・Webセーフカラーのすべてをサポート
・PeraPeraPrvみたいにマスコットに萌えキャラをry


以上のようなものがあります。


最近Java日記を書いてないのでぼちぼち進捗を書いていこうと思います。


▼タグ挿入部分のロジックと太字ボタンのイベントリスナ

	private void insertTag(String startTag, String endTag) {
		int selectionStart = subjectField.getSelectionStart();
		int selectionEnd = subjectField.getSelectionEnd();
		
		if(selectionEnd - selectionStart == 0) {
			subjectField.insert(startTag + endTag, subjectField.getCaret().getDot());
		} else {
			subjectField.insert(startTag, selectionStart);
			subjectField.insert(endTag, selectionEnd + startTag.length());
		}
		
	}
	private void boldButtonActionActionPerformed(ActionEvent event) {
		insertTag("<b>", "</b>");		
	}

Python15分講座 #4 ダックタイピング

"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)

# 実装が同じクラスA,Bを定義

>>> class A(object):
	def printType(self):
		print('type' + type(self))

		
>>> class B(object):
	def printType(self):
		print('hogehoge : ' + str(type(self)))

		
# それぞれ実行してみる
>>> a = A()
>>> a.printType()


type : <class '__main__.A'>

>>> b = B()
>>> b.printType()


hogehoge : <class '__main__.B'>

# 当然の結果
# リストにインスタンスa, bを追加
>>> list = []
>>> list.append(a)
>>> list.append(b)

# ループで実行
>>> for hoge in list:
	hoge.printType()

	

type : <class '__main__.A'>
hogehoge : <class '__main__.B'>


Javaでいうインタフェースを実装する必要がありません。


"アヒルのように鳴くならそれはアヒルだ"

つまり。。。

// Javaのコード
interface 福本 {
    void カイジっぽく鳴く();
}


public class カイジ implements 福本 {
    public void カイジっぽく鳴く(){
        System.out.println("ざわ...ざわ...");
    }
}


Javaならこんな感じにするかと思いますが、
ダックタイピングの考え方では、"カイジっぽく鳴く"なら
それは福本インタフェースを実装しているものとみなす。
いいじゃんカイジで。

・・・と。


動的型付け言語のやわらかい部分を勉強しました。