2008年12月31日水曜日

VIsual C++2005 入門編

HSP製インタプリタの処理が遅かったら
Visual C++ Express Edition製にしよっかなー
ということで
大きめの書店で入門書を買って読んでます

でも開発言語の解説より
言語仕様の解説が多くてものたりないです
どうやってマスターしようか?→開発環境の使い方
なんかC++の知識が前提みたいで
何年も前に買った独習C++も読み直す必要がありそうです
でも内容が硬くてなかなか読み進められないですね

これ読んでたらHSP製インタプリタの作成意欲が減ってきた気もしますが
気にしない(苦笑)

2008年12月29日月曜日

参加賞

HSPコンテスト2008の参加賞が今日届きました
品物はレンズクリーナー携帯ストラップです
携帯の画面汚れ気味のTACKとしては嬉しいです

そういや今使ってる携帯3年くらいたつよ
一箇所チラリと基盤が見えてますよ
親父の使ってた携帯に機種替えようと思いつつ
めんどくさいし
着うたフルはいんないし
変えるとしたら新しい携帯かな。なんて思っています
携帯替えるのは簡単なんだろうけど
メモとか
ムービーに入ってる鼻歌だとか
そういうのを入力するのがめんどくいんだよね

#ちなみに僕はAUユーザーです

"FILE_array_plus.hsp"モジュールと"FILE_str_plus.hsp"モジュールの合体

サイト更新しました

更新したページはコチラ

"FILE_array_plus.hsp"モジュールと"FILE_str_plus.hsp"モジュールの合体


モジュールとモジュールの結合ということで
スクリプトが加算されるかな?と思いきや
いらない命令も多くすっきりしました

コチラのページも初期値を代入できるように少し変更

文字列の自動確保機能を使用して複数の文字列を格納するモジュール



次に作りたいモジュールはシナリオからの文字列の取り出しです
本見ながら紙にオートマンまで書いて
格納する配列のサイズはどうする?とか思ってたら
こんなモジュールを作成してしまいました

2008年12月27日土曜日

文字列の自動確保機能を使用して複数の文字列を格納するモジュール

サイト更新しました
次の課題は使用しているモジュールへのアクセスが遅いかもしれないので
モジュール二つを合体させることです
分割したモジュールを合体させるなんて
オブジェクト指向的にどうか。とも思いますが
簡単そうなのでやってみます

更新箇所はコチラ

文字列の自動確保機能を使用して複数の文字列を格納するモジュール

2008年12月24日水曜日

文字列の自動確保機能を使用して数値配列を自動確保するモジュール

何日か前に作成してあとはどこかで公開すべき
そんな状態でしたがようやく更新完了
上手く表示されないのでモジュールはtxt形式になりましたが...

wikiに投稿しようか?と少し思いましたが
たまには投稿したくもありますが
あまりよそさまに頼るのもあれなんで
HSP製インタプリタの作成で作成したものは
自分のサイトで公開していこうかな?と思い始めているので

LINKはこちらから

文字列の自動確保機能を使用して数値配列を自動確保するモジュール

2008年12月23日火曜日

本日のerror:2008/12/23

サイトを更新しようとして、スクリプト書いてたんですよ
もう一個似たような命令を欲しいな
で、コピペ。その後error
あれ。全然上手く動かねー!(怒)

正解は文字列にpokeしてたのが2文字目からで
ってことは1文字目の値は0ってわけで
1文字目が0だと2文字めにどんな値を入力しても
空文字列と判定されるということです

それから、MODULE作TACKのページ更新しました

0を加えて指定の桁に揃えた文字列を返すモジュール

2008年12月18日木曜日

HSP開発wikiへの投稿200812/18

久しぶりにHSP開発wikiへ投稿しました
Module→行頭と行末のタブとスペースを取り除くモジュール
です
HSP製インタプリタ作成の一環として
このモジュールを作成しました
論理を踏むように
一つ一つの動作を積み上げて作成したら
案外簡単でした

HSP開発wikiではしょっちゅう中傷されて
あんまり得意ではないですが
今度は大丈夫だといいな

少し作りたりない部分もありますが
続きは明日ってことで...

2008年12月17日水曜日

区切り文字で区切るモジュール

・FILE名:mdl_calc_one_dat.hsp

#module one_data NO,型,tmp_型,中身の数,中身,warn,n_warn

#modinit int number
NO=number
型=null
sdim tmp_中身,2000
sdim tmp_型,256
tmp_型=""
中身の数=0
sdim 中身,2000,32
repeat 32
中身.cnt=""
loop
n_warn=0
sdim warn,1000

sdim of_sep_A,1000
sdim of_sep_B,1000
return
#modfunc add_warn str w
if n_warn=0{ warn=w : n_warn++ }
else{ warn+="\n"+w : n_warn++ }
return
#defcfunc sep2 var to_sep,var from_sep_01,var from_sep_02
l2sep=strlen(to_sep)
ans_of_sep=instr(to_sep,0,"||")
if ans_of_sep==-1{
from_sep_01=to_sep
return 1
}else{
from_sep_01=strmid(to_sep,0,ans_of_sep)
l=l2sep-ans_of_sep-2
from_sep_02=strmid(to_sep,-1,l)
return 2
}
return -1
#modfunc search_sep_error
if tmp_型==""{add_warn thismod,"区切り文字の前に何もありません" }
ii=中身の数-1
if 中身の数>0{
if 中身.ii==""{add_warn thismod,"区切り文字の後に何もありません" }
}
n=中身の数
if n>=2{
repeat (n-1)
if 中身.cnt=""{add_warn thismod,"区切り文字の間に何もありません" }
loop
}
return
#modfunc set_one_data var data
ans=sep2(data,of_sep_A,of_sep_B)
tmp_型=of_sep_A : 中身の数=0
n_cnt=0
while ans==2
tmp_中身=of_sep_B
ans=sep2(tmp_中身,of_sep_A,of_sep_B)
中身.n_cnt=of_sep_A
中身の数++
n_cnt++
wend
search_sep_error thismod
return

#modfunc dump
logmes "NO = "+str(NO)
logmes "型 = "+tmp_型
logmes "中身の数 = "+中身の数
repeat 中身の数
logmes "中身"+cnt+" = "+中身.cnt
loop
if warn!=""{
logmes "警告:"+warn }
return
#global


テストコード その1

#include "mdl_calc_one_dat.hsp"
sdim sn,4000
sdim tmp_sn,256
sdim one_sc,256

sdim to_test,2000,32
to_test.0="this"
to_test.1="this||a"
to_test.2="this||a||b"
to_test.3="this||a||b||c"
to_test.4="this||a||b||c||d"

newmod one_dat_01,one_data,1
set_one_data one_dat_01,to_test.0
dump one_dat_01

newmod one_dat_02,one_data,2
set_one_data one_dat_02,to_test.1
dump one_dat_02

newmod one_dat_03,one_data,3
set_one_data one_dat_03,to_test.2
dump one_dat_03

newmod one_dat_04,one_data,4
set_one_data one_dat_04,to_test.3
dump one_dat_04

newmod one_dat_05,one_data,5
set_one_data one_dat_05,to_test.4
dump one_dat_05


・テストコード その2

#include "mdl_calc_one_dat.hsp"
sdim sn,4000
sdim tmp_sn,256
sdim one_sc,256

sdim to_test,2000,32
to_test.0="this"
to_test.1="this||"
to_test.2="||a||"
to_test.3="a||b||||||||c"
to_test.4="this||a||b||c||d||e||f||||g"

newmod one_dat_01,one_data,1
set_one_data one_dat_01,to_test.0
dump one_dat_01

newmod one_dat_02,one_data,2
set_one_data one_dat_02,to_test.1
dump one_dat_02

newmod one_dat_03,one_data,3
set_one_data one_dat_03,to_test.2
dump one_dat_03

newmod one_dat_04,one_data,4
set_one_data one_dat_04,to_test.3
dump one_dat_04

newmod one_dat_05,one_data,5
set_one_data one_dat_05,to_test.4
dump one_dat_05

HSP製インタプリタ2008/12/17

便利なインタプリタ作成は後回しにして
中間言語だけのインタプリタを作成中です
作成中というか
アイデアだけ色々と考えてます
コツコツとスクリプト書きするほうが
完成への一番の近道なのでしょうが
スクリプト書きが激遅のTACKは
全然スクリプト書きがはかどっていません
順調に進むといいなぁ→スクリプト書き

というわけで最近作成したモジュールです
作成しているのは中間言語なので
tokenで区切るのではなく
区切り文字で区切る予定です
というわけで、”||”の2文字で
区切るモジュールを書いてみました
区切り文字で区切るといっても
"と"で区切った中の区切り文字は無視するのが
次のSTEPです

2008年12月7日日曜日

HSPwikiへの投稿2008/12/7 その後

wikiへの投稿、ガッツリ削除されました
なんか、怒りが収まらない

消されてすぐ書き込みしなおすのも癪なので
同じ内容を自分のサイトに書きました
もうこのネタ、wikiに書かなくていいよ...

でも消したヤツ一体どういうつもりなんだろう?
このサイトは俺が管理する!
俺の気に入らない記事は削除だ!とか
勘違いしているんだろうか?
こういう奴がいるから
HSPwikiの管理人のiwataさんにキレられるんだ

行頭のタブとスペースを取り除く

プログラミング言語って行頭と行末のタブとスペースを取り除いてくれますよね
シナリオにそんな機能もつけたいと思い
まずは行頭のタブとスペースを取り除くスクリプトを書いてみました
2byte文字の関係で行末のタブとスペースの取り除き方はわからないけどな!
sdim sn,4000
sdim tmp_sn,256

notesel sn
noteload "scenario_test02.txt"

repeat notemax

noteget tmp_sn,cnt
l_tmp_sn=strlen(tmp_sn)
css=" "
cs=peek(css,0)
c=peek(tmp_sn,0)
if c=='\t'|c==cs{flag=1}
else {flag=0}

while(flag)
l_tmp_sn--
tmp_s=strmid(tmp_sn,-1,(l_tmp_sn))
tmp_sn=tmp_s

c=peek(tmp_sn,0)
if c!='\t'&c!=cs{_break}
wend

noteadd tmp_sn,cnt,1
loop

stop

HSPwikiへの投稿2008/12/7

久しぶりにHSPwikiに投稿しました
内容は新規命令系の防忘録です
場所は名前ページです
今なら投稿したばかりなので
HSPwikiの最近の更新で
タイトルがy.tackのページを見れば
あると思います

僕は新しいモジュールを作成する時
区切り文字やら引数やらオブジェクト名やらがごっちゃになって
よくわからなくなります
そんな時
自分で書いた”モジュールについて”というページを見ます
ならもう少し防忘録という趣旨で書いてみよっかなー
って思ったのです

wikiは(僕の書き方も悪いけれど)中傷コメントが多くて
書くのを控えていたんですけど
それでも最近、また書いてみよっかなー。ってなりました
今度は中傷コメントに負けないようにー♪

HSP製インタプリタ2008/12/7

最近、RPGツクールを少々したんですよ
で、思った
変数/スイッチの選択呼び出し画面。
と、コモンイベント呼び出し画面便利やなー
で、そんな機能を持ったツール作ろうかな。

で、作ろうと思ったら
なぜかHSP製インタプリタを作りたくなった
インタプリタと言っても
字句解析だけの
中間コードだけの
簡単なやつね

目標はシナリオ機能を手軽に作成できるようにすること
シナリオ機能は簡単なの作ったことあるから
それのバージョンアップ兼汎用性を高めようという趣旨です
なので、あんまり期待しないで下さいね

2008年12月2日火曜日

検索ツール

ちょっと思った
(ちょっとじゃなく、少し前からです)
APIやらUSER32.dllやらの命令やらを
TACK Local Linksの形式で
マウスクリックでMSNで検索できるようにしたら
便利ではないだろうか?

APIやらはMSNで検索かければ
使い方がわかるものですが
コピペして検索かける行為がめんどくさかったりします
なので、そのような行為が手軽になれば
と、思うのです

公式BBSに関する話題(IE)

HSPでIEを操作したい場合
COMを使うんだろうけれど
COMを作成しないでIEを操作する方法が
公式BBSに書いてありました
COMを使ってもいいけれど
IEを×ボタンを押して消すと
COMを削除する時にエラーが出るんですよ
なのでCOMを使用しないで
IEを操作できる。と読んで
おぉ!そんなことができるのか!ってなりました

今、作成中のツールにも
この技術を採用させてもらおう

Magic Point その2

コンテストの結果、発表されたみたいですね
僕の投稿作はと言うと...

一時審査落選♪
適当に作ったやつだから当然やけどね
でも、Rankingはたまに覗くんだけど
Playしてくれる人が何人かいるみたいで
最初はRankingのあるHSPTV部門で良かったのかも
なんて考えてしまいます
ちょこっとPlayしてくれる人だけでなく
やり込んでくれる人もいるみたいで
それもまた嬉しいです

ここ一ヶ月くらい自分のサイトを全然更新してなかったんやけど
原因はGAMEです
またGAMEばっかやってしまった
でも一ヶ月くらいディスガイアにはまって
少しプログラミングしたい気持ちも復活してきました

2008年11月1日土曜日

公式BBSに関する話題(繰り返し)

公式BBSで繰り返しに関する話題がでていました

繰り返しの使用は
・repaet命令
・while等拡張マクロ命令
・ラベルとgotoを用いる
の3種類があります

繰り返しの中でreturnしたい場合
どれが最適か?という問題は
僕の中でずっとひっかかっています
repeat命令は不適
while等拡張マクロ命令は少し疑問
ラベルとgotoを用いた場合は問題なし

りささんのBBSで
拡張マクロ命令の中でreturnをしても大丈夫?
という話題で議論になっています
僕はラベルとgotoを用いたマクロを作ったので
それを使う気なのですが
オープンな場所でのスクリプトには
使わない方がいいかな?
とも思っています
フラグを用いて
繰り返しの中でreturnするのをやめれば良い
って話でもあります

僕はラベルとgotoを用いたマクロ は
そのうちwikiに書こうかな。とも思っていますが
ここ1年くらいwikiは敬遠気味やからなぁ

Magic Point

計算が必要な連打ゲーム「Magic Point」を
HSPコンテスト2008HSP TV部門に投稿しました

スクリプトはほぼ一日で完成したんですが
直しに一週間くらい
ドキュメント書きとスクリーンショットの準備に
一週間くらいかかりました
僕のサイトでも紹介しています
http://space.geocities.jp/digital_clock_2006/soft/Magic_Point.htm

何にせよ、無事投稿できてヨカッタヨカッタ

2008年10月13日月曜日

英語日記

今やってるのが長続きすれば
大学を卒業して、3回目のチャレンジということでございます

今回の作戦は
散歩しながら単語を暗記しよう!というもので
運動不足気味なTACKがたまにする
いやいや。たまにじゃないですよ
たまに毎日する散歩の間、暇なので
紙に単語を書いたのを持ち歩いて散歩中
暗記しようという趣旨でございます
とかいいつつ、散歩中暗記カード持ってたの2回目w
いやいや、散歩してないっちゅーか
かたづけで、しばらく散歩できなかったからね

長く続く習慣になればいいですね
散歩も暗記も

投稿用GAME

更新サボってすいません
理由はコンテスト用のGAMEを作成してたのと
季節の変わり目か眠くて眠くて
それから実家に住んでるんですけど
家を工事するとかで
僕の部屋を畳からフローリングに変えるとかで
部屋の荷物全部ダンボールに詰めてました
それも昨日ようやく終わりました

更新サボってGAME作成してたのに
更新してっるってことは
完成?いやいや
なんだかどーでもよくなってきた(ぉ
いやいや。どうあがいてもこのペースじゃ
完成しそうにないので
今回のコンテストにSKILL POINTを投稿するのは
諦めちゃいました
絶対いつか完成させて、投稿しちゃるって気はあるんですけどね
戦闘場面はだいたいできたんですけど
経験値、SKILL POINTの取得、LVUPと
未実装の処理が目白押しなんですよー(泣

替わりにMAGIC POINTというショート用GAMEは
ほぼ完成していて(なんか一日でほぼ完成した気が…)
それを投稿しようかな。という月曜日の夕方でございます
後はドキュメントを書いて
スクリーンショットを作れば無事投稿かな

2008年9月9日火曜日

中山真敬:著 パソコン「書く力」が面白いほどつく本 その2

> 「構成」「書き出し」-これだけで印象はガラリと変わる
最近、たいして書き出し考えてないですねー
適当に書き出してますねー
でも、そんな書き出し下手なTACKにも
一つワザがあります

思い切れば、思い切るほど、なんとかなる
ホラこの文章も、内容が暗中模索なのになんとかなりそう
書き出しは考えませんが頭の中で構成は結構やってます
筋道を通して最後まで覗けないと文章書けません
以前は細部まで構成しすぎて時間が足りなくて足りなくて困っていました
構成をアバウトにしたら文章が雑になりました
でも、時間は足りなくないからいいけどさ

パソコン使って文章を書いているのに
パソコンを使わずに構成しているから困り者です

中山真敬:著 パソコン「書く力」が面白いほどつく本

文章力の本です
BOOK・OFFで興味をひかれて買いました
部分、部分のワザの効果が光っています

> 例えば、今日から、次の5つのコツを試してみて欲しい
> あなたの文章に必ずや、いい変化が生じるはずである
この言葉は、飾り言葉ではないです
著者が前書きで述べたこの言葉に
パソコン文章術の極意が詰まっています

> ①文章を書く前に、まず「5W1H」で考える
たぶん「5W1H」で考えるのは一文ごとじゃないです
一段落ごとに「5W1H」で考えてみるならば
効果はてき面かもしれません
特に物語、シナリオ、小説を書いてみよう
そんな時(僕の場合、シナリオ)必須そうな気がします
さらにこれは「考える力」をマスターするためのコツだそうです

> ②「文章の結論」から「書き出し」をどうするか考える
「文章の結論」まで考えて、そこで初めて「書き出し」を考える資格を
得られる。という話かもしれません
もちろん章だてで考えているのなら章の結論を考えるごとに
章の書き出しを考えるという作業でもよいのかもしれませんが
さらにこれは「構成する力」をマスターするためのコツだそうです

> ③「自分が伝えたい情報」より「相手が欲しい情報」を考える
TACKの場合、だいたい「自分が伝えたい情報」ありきで文章を書いていますが
「相手が欲しい情報」とは何ぞや?などと考えたこともありません
自分の興味のある情報ならきっと興味のある人もいるだろうだなんて考えています
提示する情報を選べるほど引き出しも広くないですし...
ちなみにこれは「読ませる力」をマスターするためのコツだそうです

> ④伝えたいことは「効果的に三度」繰り返す
さすがの短い文章ばかり書いている自己中なTACKも
三度繰り返したりはしないです
似たような表現のられつはよくしますが...
でもこの考え方には共感していて
覚えておきたいことは三度読み返す。を読書の信条にしています
ちなみにこれは「アピールする力」をマスターするためのコツだそうです

> ⑤「打ち合わせの内容をまとめる習慣をつける」
TACKはフリーターなので打ち合わせはそんなにしないです
でも本の内容をまとめたり、考えていることをまとめたり
応用範囲の広そうなワザですね
ちなみにこれは「情報を整理する力」をマスターするためのコツだそうです

2008年8月22日金曜日

テキストFILEの更新 ver02

データに決まった内容を書き込むサンプルスクリプトはできましたが
今度は入力した内容をデータに書き込みます

変更前のテキストFILE
FILE名:dat\\y_tack_page.txt
NO.001
TITLE:ずざざん ざん♪
URL :http://space.geocities.jp/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.002
TITLE:TACK BLOG
URL :http://space.geocities.yahoo.co.jp/gl/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.003
TITLE:ブログを ずざざん ざん♪
URL :http://ytack.blogspot.com/
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:


テキストFILEの更新のスクリプトver02

以前作成したdiv_strモジュールを使用しています
#include "FILE_div_str.hsp"

bt_str_01="NO.001"
bt_str_02="NO.002"
bt_str_03="NO.003"

sl_bt_str_01="→NO.001"
sl_bt_str_02="→NO.002"
sl_bt_str_03="→NO.003"
sl_NO=1

bt_cmd_str_01="項目"
bt_cmd_str_02="TEXT"

sl_bt_cmd_str_01="→項目"
sl_bt_cmd_str_02="→TEXT"
sl_CMD=1

sdim s_title,1000
s_title=""
sdim s_url ,1000
s_url=""
sdim s_memo ,2000
s_memo=""
t_null ="TITLE:\nURL :\nmemo1:\nmemo2:\nmemo3:\n"
t_null+="memo4:\nmemo5:\nmemo6:\nmemo7:"
sdim s_text ,4000
s_text=t_null

sdim to_chg_topic,4,256
to_chg_topic.1="HSPTV!"
to_chg_topic.2="http://hsp.tv/"
to_chg_topic.3="ONION software"

sdim to_chg_text,10,256
to_chg_text.1="TITLE:HSPTV!"
to_chg_text.2="URL :http://hsp.tv/"
to_chg_text.3="memo1:ONION software"
to_chg_text.4="memo2:"
to_chg_text.5="memo3:"
to_chg_text.6="memo4:"
to_chg_text.7="memo5:"
to_chg_text.8="memo6:"
to_chg_text.9="memo7:"

gosub *ld_dat
gosub *set_topic_pre

*begin
cls 0
gosub *draw_button
if sl_CMD==1{ gosub *draw_topic }
if sl_CMD==2{ gosub *draw_text }
stop

*set_topic_pre
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
s=""
gosub *get_inside
s_title=t
i++
gosub *get_inside
s_url=t
i++
s_memo=""
repeat 7
gosub *get_inside
s_memo+=t
i++
loop
return

*get_inside
noteget s,i
l=strlen(s)
l-=6
t=strmid(s,6,l)
return

*set_text_pre
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
s_text=""
s=""
repeat 9,i
noteget s,cnt
s_text+=s+"\n"
loop
return

*set_topic_tmp
s_title=to_chg_topic.1
s_url =to_chg_topic.2
s_memo =to_chg_topic.3
return

*set_text_tmp
s_text=""
repeat 9,1
s_text+=to_chg_text.cnt+"\n"
loop
return

*draw_text
pos 120,25
mesbox s_text,480,450,1,-1
return

*draw_topic
pos 120,25
mes "title"
mesbox s_title,360,40,1,-1
mes "URL"
mesbox s_url,360,100,1,-1
mes "memo"
mesbox s_memo,360,250,1,-1
return

*draw_button
objsize 120.25
pos 0,0
if sl_CMD==1{
button sl_bt_cmd_str_01,*cmd01 }
else{ button bt_cmd_str_01,*cmd01 }
if sl_CMD==2{
button sl_bt_cmd_str_02,*cmd02 }
else{ button bt_cmd_str_02,*cmd02 }
button "tmplate挿入",*cmd_insert
button "更新",*cmd_chg
button "RESET",*cmd_reset
button "LOAD",*cmd_load
pos 120,0
if sl_NO==1{
button sl_bt_str_01,*sl_1 }
else{ button bt_str_01,*sl_1 }
pos 240,0
if sl_NO==2{
button sl_bt_str_02,*sl_2 }
else{ button bt_str_02,*sl_2 }
pos 360,0
if sl_NO==3{
button sl_bt_str_03,*sl_3 }
else{ button bt_str_03,*sl_3 }
return

*sl_1
sl_NO=1
goto *set_dat
*sl_2
sl_NO=2
goto *set_dat
*sl_3
sl_NO=3
goto *set_dat

*set_dat
if sl_CMD==1{ gosub *set_topic_pre }
if sl_CMD==2{ gosub *set_text_pre }
goto *begin

*cmd01
sl_CMD=1
goto *set_dat
*cmd02
sl_CMD=2
goto *set_dat

*cmd_insert
if sl_CMD==1{ gosub *set_topic_tmp }
if sl_CMD==2{ gosub *set_text_tmp }
goto *begin

*ld_dat
sdim dat,1024
notesel dat
noteload "dat\\y_tack_page.txt"
return

*cmd_chg
if sl_CMD==1{ gosub *topic2text}
if sl_CMD==2{ gosub *mb2text}
stop
*topic2text
s = "TITLE:"+div_one_at_div_str(s_title)
t = "URL :"+div_one_at_div_str(s_url)

init_at_div_str 16
set_str_at_div_str s_memo
div_str_at_div_str 16
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
noteadd s,i,1 :i++
noteadd t,i,1 :i++
j=3
k=1
repeat 7,i
noteadd ("memo"+k+":"+get_str(j)),cnt,1
j++
k++
loop
notesave "dat\\chg_dat.dat"
exec "notepad dat\\chg_dat.dat"
stop

*mb2text
init_at_div_str 16
set_str_at_div_str s_text
div_str_at_div_str 16
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
j=1
repeat 9,i
noteadd get_str(j),cnt,1
j++
loop
notesave "dat\\chg_dat.dat"
exec "notepad dat\\chg_dat.dat"
stop

*cmd_load
sdim dat,2048
notesel dat
noteload "dat\\chg_dat.dat"
goto *set_dat

*cmd_reset
gosub *ld_dat
goto *set_dat

ToDoリストによるとまだまだ
作成すべき機能もありますが
サンプルスクリプトも作成するのがめんどうなので
サンプルスクリプトの作成は一段落させて
本体のスクリプトを作成していこうと思います

2008年8月21日木曜日

文字列を改行での分割モジュールver02:テストコード

テストコードA
#include "FILE_div_str.hsp"

string_1="1ab\n\n3cd\n4ef\n\n6gh\n7ij\n8kl";c=8
string_2="1ab\n\n3cd\n4ef";c=4
string_3="1ab\n\n3cd\n4ef\n";c=5
string_4="1\n2\n3\n4\n5\n\n7\n8\n\n10\n11\n"

init_at_div_str 16
set_str_at_div_str string_1
div_str_at_div_str 10

logmes "1a:"+get_str(1)
logmes "2a:"+get_str(2)
logmes "3a:"+get_str(3)
logmes "4a:"+get_str(4)
logmes "5a:"+get_str(5)
logmes "6a:"+get_str(6)
logmes "7a:"+get_str(7)
logmes "8a:"+get_str(8)

init_at_div_str 16
set_str_at_div_str string_2
div_str_at_div_str 4

logmes "1b:"+get_str(1)
logmes "2b:"+get_str(2)
logmes "3b:"+get_str(3)
logmes "4b:"+get_str(4)
logmes "5b:"+get_str(5)
logmes "6b:"+get_str(6)
logmes "7b:"+get_str(7)
logmes "8b:"+get_str(8)

init_at_div_str 8
set_str_at_div_str string_3
div_str_at_div_str 10

logmes "1c:"+get_str(1)
logmes "2c:"+get_str(2)
logmes "3c:"+get_str(3)
logmes "4c:"+get_str(4)
logmes "5c:"+get_str(5)
logmes "6c:"+get_str(6)
logmes "7c:"+get_str(7)
logmes "8c:"+get_str(8)

init_at_div_str 16
set_str_at_div_str string_4
div_str_at_div_str 16

logmes "1d:"+get_str(1)
logmes "2d:"+get_str(2)
logmes "3d:"+get_str(3)
logmes "4d:"+get_str(4)
logmes "5d:"+get_str(5)
logmes "6d:"+get_str(6)
logmes "7d:"+get_str(7)
logmes "8d:"+get_str(8)
logmes "9d:"+get_str(9)
logmes "10d:"+get_str(10)
logmes "11d:"+get_str(11)
logmes "12d:"+get_str(12)
logmes "13d:"+get_str(13)
logmes "14d:"+get_str(14)
logmes "15d:"+get_str(15)
logmes "16d:"+get_str(16)
stop


テストコードB
#include "FILE_div_str.hsp"
sdim word,4096

repeat 1000,1
if cnt\10==9{word+="\n"}
else{word+=str(cnt)+"\n"}
loop

init_at_div_str 2048
set_str_at_div_str word
div_str_at_div_str 1000

repeat 1000,1
logmes str(cnt)+":"+get_str(cnt)
loop
stop

文字列を改行での分割モジュールver02

分割は一行か七行と決めうちして、モジュールを作成したのですが
十行の分割がやりたくなったので
何行の分割もできるようにモジュールを改造しました

FILE名:FILE_div_str.hsp
#module div_str
/* グローバル変数
変数
max_ar ar_locとar_sの配列の最大
index 分割した数
string 分割する文字列
len Stringの長さ

配列
ar_loc \nの場所
ar_s 分割した文字列を格納
**/

// グローバル変数の初期化
#deffunc init_at_div_str int max
max_ar=max
dim ar_loc,max
sdim ar_s,max,256
sdim string,1024
index=0
return

// setter
#deffunc set_str_at_div_str str p
string=p
len=strlen(string)
return

// getter
#defcfunc get_str int p
if p>index:return ""
return ar_s.p

// 文字列分割
#deffunc div_str_at_div_str int div_num
num=0
if div_num>=max_ar{count=max_ar}
else{count=div_num}
count--

// \nの位置を調べて配列にar_loc\nの位置を格納
num++
if instr(string,ar_loc.0,"\n")==-1{ar_loc.1=-1}
else{ ar_loc.1=instr(string,ar_loc.0,"\n")+2}
repeat count,1
tmp=cnt+1
num++
if instr(string,ar_loc.cnt,"\n")==-1{ar_loc.tmp=-1:break}
else{ ar_loc.tmp=instr(string,ar_loc.cnt,"\n")+ar_loc.cnt+2 }
loop
index=num

// 一つ目の\nの位置までの文字列を配列ar_sに格納
if num>=1{
hoge=ar_loc.1-2
ar_s.1=strmid(string,0,hoge)
}

// \nの位置から次の\nの位置までの文字列を配列ar_sに格納
repeat count,1
n=cnt+1
if (num>=n)&(ar_loc.cnt!=-1){
hoge=ar_loc.n-ar_loc.cnt-2
ar_s.n=strmid(string,ar_loc.cnt,hoge)
}
loop

// 文字列に\nが含まれてないので、文字列を配列ar_sに格納
if ar_loc.1==-1{
ar_s.1=string
}

// 最後の\nの位置から、文字列の最後までを配列ar_sに格納
repeat count,1
nn=cnt+1
if ar_loc.nn==-1{
hoge=len-ar_loc.cnt
ar_s.nn=strmid(string,-1,hoge)
break
;mes nn ;コメントアウト
}
loop
return

// 複数行の文字列から、最初の一行
// 単一行の文字列であれば文字列全部を返す
#defcfunc div_one_at_div_str var pre
loc=instr(pre,0,"\n")
if loc==-1:return pre
return strmid(pre,0,loc)

#global

2008年8月20日水曜日

テキストFILEの更新

データの編集操作の一環で
データに決まった内容を書き込みます

データに書き込むのは
決まってない内容ですが
まずは決まった内容を書き込むスクリプトを書いてみました

変更前のテキストFILE
FILE名:dat\\y_tack_page.txt
NO.001
TITLE:ずざざん ざん♪
URL :http://space.geocities.jp/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.002
TITLE:TACK BLOG
URL :http://space.geocities.yahoo.co.jp/gl/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.003
TITLE:ブログを ずざざん ざん♪
URL :http://ytack.blogspot.com/
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:


そして、テキストFILEの更新のスクリプト
// 変更用文字列を配列で用意
sdim to_chg,10,256
to_chg.1="TITLE:HSPTV!"
to_chg.2="URL :http://hsp.tv/"
to_chg.3="memo1:ONION software"
to_chg.4="memo2:"
to_chg.5="memo3:"
to_chg.6="memo4:"
to_chg.7="memo5:"
to_chg.8="memo6:"
to_chg.9="memo7:"

*begin
mes "何番のデータを更新しますか?"
button "NO.001",*chg_001
button "NO.002",*chg_002
button "NO.003",*chg_003
stop

// 変更前dat読み込み
*ld_dat
sdim dat,1024
notesel dat
noteload "dat\\y_tack_page.txt"
return

// ボタンAを押した時の処理
*chg_001
gosub *ld_dat
i=0
goto *chg_func

// ボタンBを押した時の処理
*chg_002
gosub *ld_dat
i=10
goto *chg_func

// ボタンCを押した時の処理
*chg_003
gosub *ld_dat
i=20
goto *chg_func

// datの書き換え
*chg_func
repeat 9,1
j=i+cnt
noteadd to_chg.cnt,j,1
loop

// datを保存して、それをnotepadで開く
notesave "dat\\changed_dat.txt"
exec "notepad dat\\changed_dat.txt"
stop

2008年8月19日火曜日

文字列を改行での分割モジュール

複数行入力されることが予想される
入力された文字列から一行もしくは七行
改行文字で分割した文字列を配列に格納するための
文字列の分割モジュールです
分割して取得する行数は一行か七行と決め打ちしているので
拡張性は考えていません

確か開発wikiに分割モジュールがあった気がしますが
文字列処理は好きな分野なので
面白半分でモジュールを作成してみました

注:スクリプトは変更したので削除

シンプルな文字列操作

簡単なテストで文字列操作のやり方がわかってきたところで関数を一つ
文字列の中に\nがあればそれ以前
文字列の中に\nがなければ文字列全部
を返す関数を作ってみました
複数行の文字列から、最初の一行
単一行の文字列であれば文字列全部を返す関数です
goto *@f
#defcfunc div_one var pre
loc=instr(pre,0,"\n")
if loc==-1:return pre
return strmid(pre,0,loc)
*@
s="123\n45"
logmes "s:"+div_one(s)
t="12345"
logmes "t:"+div_one(t)
stop

シンプルな関数ですが意外と使い道がありそう

そうそう。久しぶりに実験室を更新しました

button命令による割り込み時の繰り返し命令の動作

簡単な文字列操作のテスト

久しぶりにTACK Local Linksの開発です
今回の目標はデータファイルを入力する文字列群で更新することです

そのために、まずは複数行文字列を\nで分割して
文字列配列に格納したいです

文字列の分割の前に、文字列操作関数の復習から

// \nの位置を調べる
s="abc\ndef"
loc=instr(s,0,"\n")
logmes str(loc)

// 文字列sを\nで二つに区切る
l=strlen(s)
l-=loc+2
t=strmid(s,0,loc)
u=strmid(s,(loc+2),l)
logmes t
logmes u
stop

2008年8月13日水曜日

サイトのデザイン変更しました

tytyさんのアドバイスを参考にサイトのデザインを変更しました
変更箇所が広範囲というか
ほぼサイト全域に及んでいて、変更はめんどくさかったんですけど
ジオシティーの更新ツールが便利で
案外、簡単に更新できました

白や黒はありきたりで嫌だったので
灰色を基調にデザインしてみました
大分、見やすくなったと思うけれど
まだ見にくい。という意見があれば
白か黒を基調にデザインの変更を行うので
ゲストブックにでも書き込んでください

それと、今までみやすい配色を行うという視点が欠けていて
自分の好きな色ばかり使っていたことをお詫び致します
どうもすみませんでした

僕のサイトはスクリプトを参考にしたいというより
こんなスクリプト書いたんだぜー。というような
スクリプトの発表の場であり
単なる自己満足のためでもあり
あんまり、参考にして欲しくて書いている訳ではありません

参考にすべきサイトは他にたくさんあり
そのようなサイトを参考にして
僕のスクリプトはちょろっと見る程度でかまわない
というスタンスです
でもやっぱり僕のスクリプトも参考にして欲しい気持ちもあり
そんな矛盾にはさまれていたりします

特にブログにスクリプトやToDoリストを書くのは
wikiに書きながらスクリプトを書いていくように
自分で眺めながら開発するという趣旨が強いです

それから、最近、自分のサイトのバナーを書いてから
少し、LINK活動をしています
自分のサイトより参考になるサイトは
たくさんあることは強く認識しているので
そのうちLINKも充実させたいです
といってもLINKは
自分でたくさん集めるよりも
LINK集の充実しているサイトからジャンプする方が
効率的なのも知っているので
そういうことを視野に入れながら、増やしていきたいです

2008年8月10日日曜日

calc_priceモジュール TESTコード

モジュールを作ったらTESTせねばってことでTEST

関数cmp_priceのTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
logmes "cmp:LV1:0:50"
logmes str(cmp_price(1,0,50))
logmes "cmp:LV1:0:49"
logmes str(cmp_price(1,0,49))
logmes "cmp:LV16:2:0"
logmes str(cmp_price(16,2,0))
logmes "cmp:LV16:0:0"
logmes str(cmp_price(16,0,0))
stop


命令get_priceのTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
repeat 24,1
a=0
b=0
get_price cnt,a,b
logmes str(cnt)+"a:"+a
logmes str(cnt)+"b:"+b
loop
stop


命令sub_priceのTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
repeat 24,1
a=0:b=0
sub_price cnt,a,b
logmes str(cnt)+"a:"+str(a)
logmes str(cnt)+"b:"+str(b)
loop
stop


型変換がきちんとなされているか?のTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
a=9999999
b=9999999
sub_price 20,a,b
mes ""+a+"M"+b
stop

calc_priceモジュール

INT二つで値を処理するモジュールを作ってみました
コピペしようが何しようが
モジュールに手を加えた後はいじりたくないので
別FILEにして#includeした方が良いか検討中です
ですがとりあえず
FILEの中身をモジュールのみにしてTESTしてみます

FILE名:FILE_calc_price_slv_0_3.hsp
#module calc_price
#deffunc init_calc_price
// レベルから計算する価格の表示用
price_a=0
price_b=0
dim sep_of_price,2,64
sep_of_price.0.1 = 0
sep_of_price.1.1 = 50
sep_of_price.0.2 = 0
sep_of_price.1.2 = 100
sep_of_price.0.3 = 0
sep_of_price.1.3 = 200
sep_of_price.0.4 = 0
sep_of_price.1.4 = 400
sep_of_price.0.5 = 0
sep_of_price.1.5 = 800
sep_of_price.0.6 = 0
sep_of_price.1.6 = 1600
sep_of_price.0.7 = 0
sep_of_price.1.7 = 3200
sep_of_price.0.8 = 0
sep_of_price.1.8 = 6400
sep_of_price.0.9 = 0
sep_of_price.1.9 = 12800
sep_of_price.0.10 = 0
sep_of_price.1.10 = 25600
sep_of_price.0.11 = 0
sep_of_price.1.11 = 51200
sep_of_price.0.12 = 0
sep_of_price.1.12 = 102400
sep_of_price.0.13 = 0
sep_of_price.1.13 = 204800
sep_of_price.0.14 = 0
sep_of_price.1.14 = 409600
sep_of_price.0.15 = 0
sep_of_price.1.15 = 819200
sep_of_price.0.16 = 1
sep_of_price.1.16 = 638400
sep_of_price.0.17 = 3
sep_of_price.1.17 = 276800
sep_of_price.0.18 = 6
sep_of_price.1.18 = 553600
sep_of_price.0.19 = 13
sep_of_price.1.19 = 107200
sep_of_price.0.20 = 26
sep_of_price.1.20 = 214400
sep_of_price.0.21 = 52
sep_of_price.1.21 = 428800
sep_of_price.0.22 = 104
sep_of_price.1.22 = 857600
sep_of_price.0.23 = 209
sep_of_price.1.23 = 715200
sep_of_price.0.24 = 419
sep_of_price.1.24 = 430400
return

#deffunc sub_price int lv,var have_a,var have_b
to_sub=LongInt(sep_of_price.1.lv)
to_sub+=sep_of_price.0.lv*1000000
of_sub=LongInt(have_b)
of_mul=LongInt(have_a)
of_mul=of_mul*1000000
of_sub+=of_mul
of_sub-=to_sub
chg_sub=LongInt(of_sub)
chg_sub=chg_sub/1000000
have_a=int(chg_sub)
chg_sub=LongInt(of_sub)
chg_sub=chg_sub\1000000
have_b=int(chg_sub)
return
#defcfunc cmp_price int lv,int have_a,int have_b
if sep_of_price.0.lv < have_a{return 2}
if sep_of_price.0.lv > have_a{return -2}
if sep_of_price.1.lv <= have_b{return 1}
return -1


#deffunc get_price int lv,var have_a,var have_b
have_a=sep_of_price.0.lv
have_b=sep_of_price.1.lv
return
#global

sep_of_price配列の値の計算は手動じゃないです
2倍、4倍...と計算して
頭に文字列くっつけてlogmesで出力させたのをコピペしました

SKILL POINT開発再開

HSPコンテストに向けてPOINT生成連打RPG、SKILL POINT
の開発を行っています
着想は2年くらい前でしょうか
忘れた頃、忘れた頃に作成していて
現在、スクリプトの長さ約2500行
といっても、ほとんどプロジェクトすぅぃったの原理で
シナリオですけど
構造エディタを使っているためスクリプトを分割してないので
この長さになったとも言います

で、ゲームの趣旨はMAGIC POINTなりSKILL POINTなりマナなり
POINTを貯めるのが趣旨なので
INT型以上に貯めたいので
LongIntのdllを使ってみました
手始めにマナのPOINTの管理をLongIntのdllを使って
二つのINTで表現してみました

試行錯誤して、その処理のサブルーチン作成がなかなか上手くいって
メインスクリプトに組み込んでみた
よしよし上手く動く
で、下位のINTに999999。上位のINTにも999999代入してテストしてみた
(下位を100000で割った値を上位のINTで表現)
すると、動作が変だ
原因は型変換の不徹底
HSPはあまり型変換を意識する必要のないプロセッサーなので
型変換が不徹底でした

型変換を徹底させるときちんと動きました
これからスクリプトに組み込むぞ!ヲー!

2008年7月30日水曜日

軽量版、gotoを使用したサブルーチン:ver04

軽量版、gotoを使用したサブルーチン の命令も
衝突しにくいように書き換えました

FILE名:FILE_manage_label_mini_0_4.hsp
#include "FILE_set_get_label_mini_0_2.hsp"
#module manage_label
#deffunc init_at_manage_label
now=-1
init_at_set_get_label_mini
return
#deffunc set_at_manage_label
now++
set_label_at_set_get_label_mini now
return
#deffunc back_of_st_at_manage_label
get_label_at_set_get_label_mini now
now--
return
#define global ctype inner_call(%1,%2):\
tmp_l@set_get_label_mini=*%2:set_at_manage_label:goto %1:*%2
#define global ctype call(%1)%tlabel_call inner_call(%1,%n)
#define global back:\
back_of_st_at_manage_label:goto tmp_r@set_get_label_mini
#global


テストコード
#include "FILE_manage_label_mini_0_4.hsp"
init_at_manage_label
call(*s_a)
mes "OK"

stop
*s_a
mes "a"
call(*s_b)
call(*s_d)
back
*s_b
mes "b"
call(*s_c)
back
*s_c
mes "c"
back
*s_d
mes "d"
back

軽量版、ラベル格納用変数の管理モジュール:ver02

軽量版、ラベル格納用変数の管理モジュール の命令も
衝突しにくいように書き換えました

FILE名:FILE_set_get_label_mini_0_2.hsp
#module set_get_label_mini
*null
stop
#define ctype def_l(%1):\
l_%1_0=*null:l_%1_1=*null:l_%1_2=*null:l_%1_3=*null:l_%1_4=*null:\
l_%1_5=*null:l_%1_6=*null:l_%1_7=*null:l_%1_8=*null:l_%1_9=*null

#deffunc init_at_set_get_label_mini
tmp_l=*null
tmp_r=*null
def_l(0):def_l(1):def_l(2):def_l(3):def_l(4)
def_l(5):def_l(6):def_l(7):def_l(8):def_l(9)
return
#define ctype set_c(%1,%2):\
if c==0{l_%1_0=tmp_l}:\
if c==1{l_%1_1=tmp_l}:\
if c==2{l_%1_2=tmp_l}:\
if c==3{l_%1_3=tmp_l}:\
if c==4{l_%1_4=tmp_l}:\
if c==5{l_%1_5=tmp_l}:\
if c==6{l_%1_6=tmp_l}:\
if c==7{l_%1_7=tmp_l}:\
if c==8{l_%1_8=tmp_l}:\
if c==9{l_%1_9=tmp_l}
#define ctype set_b:\
if b==0{set_c(0)}:\
if b==1{set_c(1)}:\
if b==2{set_c(2)}:\
if b==3{set_c(3)}:\
if b==4{set_c(4)}:\
if b==5{set_c(5)}:\
if b==6{set_c(6)}:\
if b==7{set_c(7)}:\
if b==8{set_c(8)}:\
if b==9{set_c(9)}
#deffunc set_label_at_set_get_label_mini int index
if index<0: dialog "error ネストが浅すぎます",1:stop
if index>99: dialog "error ネストが深すぎます",1:stop
b=index/10
c=index\10
set_b()
return
#define ctype get_c(%1):\
if c==0{tmp_r=l_%1_0}:\
if c==1{tmp_r=l_%1_1}:\
if c==2{tmp_r=l_%1_2}:\
if c==3{tmp_r=l_%1_3}:\
if c==4{tmp_r=l_%1_4}:\
if c==5{tmp_r=l_%1_5}:\
if c==6{tmp_r=l_%1_6}:\
if c==7{tmp_r=l_%1_7}:\
if c==8{tmp_r=l_%1_8}:\
if c==9{tmp_r=l_%1_9}
#define ctype get_b:\
if b==0{get_c(0)}:\
if b==1{get_c(1)}:\
if b==2{get_c(2)}:\
if b==3{get_c(3)}:\
if b==4{get_c(4)}:\
if b==5{get_c(5)}:\
if b==6{get_c(6)}:\
if b==7{get_c(7)}:\
if b==8{get_c(8)}:\
if b==9{get_c(9)}
#deffunc get_label_at_set_get_label_mini int index
if index<0: dialog "error ネストが浅すぎます",1:stop
if index>99: dialog "error ネストが深すぎます",1:stop
b=index/10
c=index\10
get_b()
return
#global

2008年7月29日火曜日

gotoを使用したサブルーチン:ver05

set_get_labelモジュールに続いて
manage_labelモジュールの名前も変更します

タイプがめんどくさい命令名になった気もしますが
直接呼ばれる可能性は低いので大丈夫でしょう

ちなみにcallマクロとbackマクロは
このモジュールを使う場合何度も呼び出す可能性があるので、そのままです
変な名前をつけると、使ったあと読みにくそうですからね

init_at_manage_label
変数の初期化処理

call(p1)
gosubのようにサブルーチンを呼び出します
p1:呼び出すサブルーチンのラベル

back
call命令でジャンプした場所に戻る命令

FILE名:FILE_manage_label_0_5.hsp
#include "FILE_set_get_label_0_2.hsp"
#module manage_label
#deffunc init_at_manage_label
now=-1
init_at_set_get_label
return
#deffunc set_at_manage_label
now++
set_label_at_set_get_label now
return
#deffunc back_of_st_at_manage_label
get_label_at_set_get_label now
now--
return
#define global ctype inner_call(%1,%2):\
tmp_l@set_get_label=*%2:set_at_manage_label:goto %1:*%2
#define global ctype call(%1)%tlabel_call inner_call(%1,%n)
#define global back:\
back_of_st_at_manage_label:goto tmp_r@set_get_label
#global


テストコード
#include "FILE_manage_label_0_5.hsp"
init_at_manage_label
call(*s_a)
mes "OK"

stop
*s_a
mes "a"
call(*s_b)
call(*s_d)
back
*s_b
mes "b"
call(*s_c)
back
*s_c
mes "c"
back
*s_d
mes "d"
back

ラベル格納用変数の管理モジュール:ver02

今まで書きためていたものを読んで思いました
命令の名前が安易で競合の可能性がある!

適当にsetとかつけるもんだから
これ絶対、後でsetとかいう名前の命令を作るだろう。とか思いました

やったことは命令の後ろに_at_モジュール名 をつけただけ
でもこれだけで、かなり命令の名前の競合が減るんですよね
ちなみにglobalキーワードをつけていないマクロは
@モジュール名をつける必要があるんで変更していません

FILE名:FILE_set_get_label_0_2.hsp
#module set_get_label
*null
stop
#define ctype def_l(%1,%2):\
l_%1_%2_0=*null:l_%1_%2_1=*null:l_%1_%2_2=*null:l_%1_%2_3=*null:\
l_%1_%2_4=*null:l_%1_%2_5=*null:l_%1_%2_6=*null:l_%1_%2_7=*null:\
l_%1_%2_8=*null:l_%1_%2_9=*null
#define ctype def_l_b(%1):\
def_l(%1,0):def_l(%1,1):def_l(%1,2):def_l(%1,3):def_l(%1,4):\
def_l(%1,5):def_l(%1,6):def_l(%1,7):def_l(%1,8):def_l(%1,9)

#deffunc init_at_set_get_label
tmp_l=*null
tmp_r=*null
def_l_b(0):def_l_b(1):def_l_b(2):def_l_b(3):def_l_b(4)
def_l_b(5):def_l_b(6):def_l_b(7):def_l_b(8):def_l_b(9)
return
#define ctype set_c(%1,%2):\
if c==0{l_%1_%2_0=tmp_l}:\
if c==1{l_%1_%2_1=tmp_l}:\
if c==2{l_%1_%2_2=tmp_l}:\
if c==3{l_%1_%2_3=tmp_l}:\
if c==4{l_%1_%2_4=tmp_l}:\
if c==5{l_%1_%2_5=tmp_l}:\
if c==6{l_%1_%2_6=tmp_l}:\
if c==7{l_%1_%2_7=tmp_l}:\
if c==8{l_%1_%2_8=tmp_l}:\
if c==9{l_%1_%2_9=tmp_l}
#define ctype set_b(%1):\
if b==0{set_c(%1,0)}:\
if b==1{set_c(%1,1)}:\
if b==2{set_c(%1,2)}:\
if b==3{set_c(%1,3)}:\
if b==4{set_c(%1,4)}:\
if b==5{set_c(%1,5)}:\
if b==6{set_c(%1,6)}:\
if b==7{set_c(%1,7)}:\
if b==8{set_c(%1,8)}:\
if b==9{set_c(%1,9)}
#define ctype set_a_1:\
if a==0{set_b(0)}:\
if a==1{set_b(1)}:\
if a==2{set_b(2)}:\
if a==3{set_b(3)}:\
if a==4{set_b(4)}
#define ctype set_a_2:\
if a==5{set_b(5)}:\
if a==6{set_b(6)}:\
if a==7{set_b(7)}:\
if a==8{set_b(8)}:\
if a==9{set_b(9)}
#deffunc set_label_at_set_get_label int index
if index<0: dialog "error ネストが浅すぎます",1:stop
if index>999: dialog "error ネストが深すぎます",1:stop
a=index/100
b=(index\100)/10
c=index\10
set_a_1()
set_a_2()
return
#define ctype get_c(%1,%2):\
if c==0{tmp_r=l_%1_%2_0}:\
if c==1{tmp_r=l_%1_%2_1}:\
if c==2{tmp_r=l_%1_%2_2}:\
if c==3{tmp_r=l_%1_%2_3}:\
if c==4{tmp_r=l_%1_%2_4}:\
if c==5{tmp_r=l_%1_%2_5}:\
if c==6{tmp_r=l_%1_%2_6}:\
if c==7{tmp_r=l_%1_%2_7}:\
if c==8{tmp_r=l_%1_%2_8}:\
if c==9{tmp_r=l_%1_%2_9}
#define ctype get_b(%1):\
if b==0{get_c(%1,0)}:\
if b==1{get_c(%1,1)}:\
if b==2{get_c(%1,2)}:\
if b==3{get_c(%1,3)}:\
if b==4{get_c(%1,4)}:\
if b==5{get_c(%1,5)}:\
if b==6{get_c(%1,6)}:\
if b==7{get_c(%1,7)}:\
if b==8{get_c(%1,8)}:\
if b==9{get_c(%1,9)}
#define ctype get_a_1:\
if a==0{get_b(0)}:\
if a==1{get_b(1)}:\
if a==2{get_b(2)}:\
if a==3{get_b(3)}:\
if a==4{get_b(4)}
#define ctype get_a_2:\
if a==5{get_b(5)}:\
if a==6{get_b(6)}:\
if a==7{get_b(7)}:\
if a==8{get_b(8)}:\
if a==9{get_b(9)}
#deffunc get_label_at_set_get_label int index
if index<0: dialog "error ネストが浅すぎます",1:stop
if index>999: dialog "error ネストが深すぎます",1:stop
a=index/100
b=(index\100)/10
c=index\10
get_a_1()
get_a_2()
return
#global

2008年7月28日月曜日

gotoを使用したサブルーチン:ver04

軽量版のスクリプトを不要な部分を削ってみると
大分すっきりしたのでもう一方の方も
不要な部分を削ります

注:スクリプトは書き換えたので削除

軽量版、gotoを使用したサブルーチン:ver03

下書きを整理していて思いました
数値の配列とアクセスいらんやん

ラベルが順に上から下に蓄積され
下から上に破棄される仕組みが
予想はしつつも、上手くのみこめなくて
数値の配列とアクセスを使用していました

例外は起きるかな?と思っていましたが
起こらなそうなので
数値の配列とアクセスを取り除いてみました

注:スクリプトは書き換えたので削除

gotoを使用したサブルーチン:下書き

スクリプトを単にダダダーッと並べても
動作がよくわからないかもしれないので
下書きをテキスト形式で表現してみます

01:call(s_a)
02:*l_a
03:stop
04:
05:*s_a
06:mes "a"
07:call(s_b)
08:*l_b
09:call(s_c)
10:*l_c
11:back
12:
13:*s_b
14:mes "b"
15:back
16:
17:*s_c
18:mes "c"
19:back

1.
01:call(s_a)
02:*l_a
;*s_aにジャンプし
;*l_aをスタックに積む
;call命令の後ろにラベル

-stackの内容
0
*l_a
prev:-1

現在地 0

2.
05:*s_a
06:mes "a"
07:call(s_b)
08:*l_b
;*s_bにジャンプし
;*l_bをスタックに積む
;call命令の後ろにラベル

-stackの内容
0
*l_a
prev-1

1
*l_b
prev0
現在地 1

3.
13:*s_b
14:mes "b"
15:back
;*l_bをスタックから取り出す
;スタックを上の位置に移動(ここでは0)
;現在地の値をprevの値に書き換える
;取り出した*l_bへジャンプ

-stackの内容
0
*l_a
prev-1
現在地 0

4.
09:call(s_c)
10:*l_c
;*s_cにジャンプし
;*l_cをスタックに積む
;call命令の後ろにラベル

-stackの内容
0
*l_a
prev-1

1
*l_c
prev0
現在地 1

5.
17:*s_c
18:mes "c"
19:back
;*l_cをスタックから取り出す
;スタックを上の位置に移動(ここでは0)
;現在地の値をprevの値に書き換える
;取り出した*l_cへジャンプ

-stackの内容
0
*l_a
prev-1
現在地 0

6.
11:back
;*l_aをスタックから取り出す
;スタックを上の位置に移動(ここでは-1)
;現在地の値をprevの値に書き換える
;取り出した*l_aへジャンプ

-stackの内容
現在地 -1

軽量版、gotoを使用したサブルーチン:ユニークラベル使用

999回ネストできるversionにユニークラベルを使う変更をほどこしたので
ネストは99回versionにも、同様の変更を行います

注:スクリプトは書き換えたので削除

gotoを使用したサブルーチン:ユニークラベル使用

call命令の引数をユニークラベルを使用して減らすことは
現在の課題でしたが
マクロのタグは一時期、色々試行錯誤して遊んでいたので
実際に使ってみると、すんなり使えました
というわけで
gotoを使用したサブルーチン:ユニークラベル使用 の
スクリプトです

注:スクリプトは書き換えたので削除

gotoを使用したサブルーチン軽量版:ネストは99回まで

ラベルを99個、定義、入力、値の取得ができるモジュールを
書いたので、gotoを使用したサブルーチンを
軽量版ラベル格納用変数の管理モジュール を使用したversionに変更してみる

注:スクリプトは書き換えたので削除

2008年7月27日日曜日

軽量版、ラベル格納用変数の管理モジュール

ラベルを格納する変数を999個用意した状態で
デバッグウィンドゥを見てみましょう
ハイ。似たような変数でデバッグウィンドゥがいっぱいですね
デバッグウィンドゥのみやすさ。という観点から
スクリプトを見ると変数を999個用意するのは
よくないかもしれません

という訳で
そんなに頻繁にたくさんネストする訳でもないので
ネストが99回まで。ということで
軽量版ラベル格納用変数の管理モジュール を作成してみました

注:スクリプトは書き換えたので削除

gotoを使用したサブルーチン:ネストが999回まで可能

さっきラベルを999個、定義、入力、値の取得ができるモジュールを
書いたので、さっそくgotoを使用したサブルーチンを
ネストが999回できるように変更してみる

注:スクリプトは書き換えたので削除

大量のラベル格納用変数の管理モジュール

下記のスクリプトはネストが10までしかできません
ネスト10回じゃ、やっぱ少ないっすよね
labelを配列に格納できたら
ネストの回数を増やすことも簡単なのでしょうが
できないもんは仕方ありません

というわけで
ネストの回数を増やすべく
macroを駆使して、999個の、ラベルを確保するための変数を用意しました
これでネストが999回まで対応できます

注:スクリプトは書き換えたので削除

gotoを使用したサブルーチン裏話

このスクリプトは実は下書きがあります

サブルーチンなんか使わなくてもgotoで飛んで、帰ってくればいいじゃないか?
とか。考えてて
でもサブルーチンの最後にgoto文があるのは
イマイチやなぁ。
とか。考えてて
考えても、考えても、考えがまとまらないものだから
紙に書いて整理してみました
すると、自分の考えていたことが上手く整理できました
で、ヨーシいっちょうスクリプトを組んでみようか!
ってなって
スクリプトを試行錯誤しながら組んでみると
きちんと動きました

整理しきれないことは紙に書いて整理してみる
ちょっと無理そうな動作でも
やってみれば、なんとかなる
といった教訓を改めて感じました。とさ

gotoを使用したサブルーチン:テストコード

どこをどうすればきちんとテストできるのか
全然わかんなくて量は少しですが
一応、テストコードです
#include "FILE_manage_label.hsp"
m_init
call(*s_a,*l_a)
mes "OK"

stop
*s_a
mes "a"
call(*s_b,*l_b)
call(*s_d,*l_d)
back
*s_b
mes "b"
call(*s_c,*l_c)
back
*s_c
mes "c"
back
*s_d
mes "d"
back

gotoを使用したサブルーチン

最近、gotoにはまっていて
繰り返しをgotoによって行う。というmacroを作成したりしています
で、そんなことをしているうちに思った
HSPってサブルーチン呼び出し、命令呼び出し、関数呼び出し、信用ならない
いやいや。僕が仕様をよくわかってなくてerrorが起こるって話ですが
サブルーチンの中でgotoを使ったら
ネストの返り場所とか、そのまんまなんだろうか?
とか考えたら
自分で、gotoを使ったサブルーチン呼び出しを作ってみました
なんかcall命令のp2が冗長で、p2のラベルをユニークラベルにおきかえることは
今後の課題です

m_init
変数の初期化処理

call(p1,p2)
gosubのようにサブルーチンを呼び出します

p1:呼び出すサブルーチンのラベル
p2:帰ってくる時の目印
(なんでもいいです。ただし、衝突に注意)

back
call命令でジャンプした場所に戻る命令

FILE名:FILE_manage_label.hsp
#module manage_label
*a
stop
#deffunc m_init
now=-1
max=0
back_l=*a
back_r=*a
dim num,16
l_0=*a:l_1=*a:l_2=*a:l_3=*a:l_4=*a
l_5=*a:l_6=*a:l_7=*a:l_8=*a:l_9=*a
return
#deffunc set_num int index,int m
num.index=m
if index>=10{
dialog "error ネストが深すぎます",1:stop
}
return
#deffunc get_num int index
if index<0{
dialog "error ネストが浅すぎます",1:stop
}else{
now=num.index
}
return
#deffunc set_lb int index
if index==0:l_0=back_l
if index==1:l_1=back_l
if index==2:l_2=back_l
if index==3:l_3=back_l
if index==4:l_4=back_l
if index==5:l_5=back_l
if index==6:l_6=back_l
if index==7:l_7=back_l
if index==8:l_8=back_l
if index==9:l_9=back_l
if index>=10{
dialog "error ネストが深すぎます",1:stop
}
return
#deffunc get_lb int index
if index<0{
dialog "error ネストが浅すぎます",1:stop
}else{
if index==0:back_r=l_0
if index==1:back_r=l_1
if index==2:back_r=l_2
if index==3:back_r=l_3
if index==4:back_r=l_4
if index==5:back_r=l_5
if index==6:back_r=l_6
if index==7:back_r=l_7
if index==8:back_r=l_8
if index==9:back_r=l_9
}
return
#deffunc set
set_num max,now: set_lb max
now=max: max++
return
#deffunc back_of_st
get_lb now
get_num now
max--
return
#define global ctype call(%1,%2):\
back_l@manage_label=%2:set:goto %1:%2
#define global back:\
back_of_st:goto back_r@manage_label
#global

2008年6月14日土曜日

終わり良ければ全て良し

そんな諺もあるけれど
終わりよければ。って終わったんですよね
どんなかんじでも終わりまでことがはこべば
結果はどうあれ、いいことだよなぁ
と、作りかけのスクリプトばかり転がっているTACKは思った

2008年6月7日土曜日

和田秀樹著「他人の10倍仕事をこなす 私の習慣」その3

和田秀樹著「他人の10倍仕事をこなす 私の習慣」P73
第三章 スランプを克服して生産性を上げる
>乗っていないときに何をすればやり過ごせるかも知らないといけない
>仕事をしてそれで生き延びていこうと思ったら
>やはり自分を知ることがものすごく大事なことになる
>自分を知るためには、多少、自分をある種、追い詰めていったほうがいい
>つまり、負荷が多くなければ
>何に弱く、何に強いかがわからない
現在のTACKのスクリプト書き。スランプですねぇ
TACK Local Links も コンテストへの応募を予想しているゲームの製作も
止まったまんまです
僕のスクリプト書きは、はかどっている方が珍しく
だいたいほっぽってるまんまです
スランプの脱却法は仕事をすることだ。とも書いていたけれど
やる気が起きないんだから仕方がない
だから
>乗っていないときに何をすればやり過ごせるかも知らないといけない
この一文は非常に参考になりました
という訳で
>やはり自分を知ることがものすごく大事なことになる
ということですね
どんな状態の時に、どんなことをするのが
自分にとっていいのか?ということを
色々と試行錯誤しながら、理解していきたいです

和田秀樹著「他人の10倍仕事をこなす 私の習慣」その2

和田秀樹著「他人の10倍仕事をこなす 私の習慣」P62 P63
>こうやったら時間がつくれるとか
>このやり方のほうが早いというノウハウを
>実際にやってみて経験的に培うことだ
>いいと思ったやり方をとことんやってみることである
>そうやって自分の能力や特性に合わせて
>自分を変えていかないといけない
>失敗ばかりする人は
>自分を変えないままでうまくいかないのはなぜだろうと悩む
>いろいろな仕事術の本を読んでみて
>これなら当てはまりそうだとピンときたらやってみる
>不幸なのは、うまくいってないのに変えられない人
>もしくは、せっかくうまくいった体験を生かせない
>次に生かせない人である
>人間、誰しも一度や二度は、成功体験があるだろう
>また、うまくいかないで自己嫌悪に陥った経験もあると思う
>それらを利用しない手はない
>年をとって経験を積んでいくと
>どんどん仕事が速くなっていく
>もちろん、質に関しては他人が評価するものだから
>わからないまでも、量はこなせるようになる
>四十台になれば、二十代よりも量がこなせる
>とにかく経験を活かし、ノウハウを培うことである
この文庫は「大人のための スキマ時間勉強法」の発展したものだと思います
「他人の10倍仕事をこなす 私の習慣」は著者が時間の使い方を教えているのに対し
「大人のための スキマ時間勉強法」では引用部分にあるとおり
自分で何かをするやり方を試行錯誤するように。と書いています
自分の、自分だけの財産である経験というものを活用し
自分なりの、何かのやり方を試行錯誤すべき。と著者は語っているかのごとく。です

和田秀樹著「他人の10倍仕事をこなす 私の習慣」

著者は高校3年生の頃
年間300本、映画を見たそうです
で、めちゃめちゃ勉強したそうです
にも関わらず、東大に合格したそうです
僕も浪人時代、競馬のことばっかり考えてたし、やってました
で、すんげー勉強した
やっぱりやりたいことをやっていた方が
何事もはかどるのだろうな。と思った
プログラミングも英語もバイトも書くことも両立させたいけれど
そのためにやりたいことを我慢するのではなく
やりたいこともやっていいのかな?と少し思った

2008年6月6日金曜日

和田秀樹著「大人のための スキマ時間勉強法」

最近、古本屋で色々とハウツーものの文庫本を買って読んでいます
ハウツーものはわりと好きだけれど
勉強法の本、文章の本、前向きに生きていくための本、をよく読みます
そういった文庫本をよく読むのは
生き方、勉強の仕方にいきづまっているからだと思います
1、2年くらい前。英語ばかり勉強していたのに、ものにならなかった
あんなに英単語をノートに書きじゃくったのに、全然覚えられなかった
大学院の試験に見事、落ちた
そんな経験で行き詰って、勉強に身が入らないのです
文章も一応書いてはいるのに、進歩の痕跡が見当たらない
というわけでハウツーものに走っています
今日は和田秀樹著
「大人のための スキマ時間勉強法」という文庫本を読みました

朝型勉強すればいいらしい
朝早く起きて、早寝早起きの生活をして、朝、勉強時間を確保する
朝が一番時間の確保がしやすいらしい
こんな時間に何か書いていて、全然そんな生活できそうにないですが
税所弘著「100日で「朝型人間」になれる方法」という文庫本も買ってみた
100日って長そうだけど、是非、早寝早起きの習慣を身につけたいです
それから疲れているときは疲れているなりの勉強の仕方も考えてみたいです
疲れている時でもできる勉強ってどんななのか?少し考えてみたいテーマです
それから勉強をしたい時は睡眠時間を削る必要がありそうですが
睡眠時間を削る必要はないそうです
睡眠時間を削ると他のことに支障が出るそうです
TACKはロングスリーパーで一日9時間寝ないとつらいです
そっか寝たい人は寝たいだけ寝ればいいのか
そのかわりスキマ時間をひねり出して、そこで勉強する
睡眠、食事、お風呂。そういった時間を大切にするそうです
それからリラックスタイムも大事
遊ぶ時間も大事
TACKは勉強に身が入っている時は、全然ゲームしません
勉強に身が入らない時は、勉強せずゲームばっかしています
それはいけないらしい(そうは書いてなかったけど)
ゲームしてもいいから、勉強もちゃんとしろ。と
別々にするんじゃなくて、かわるがわるってことだろうか?
課題ばかり浮かんだけれど、有意義な読書でした

2008年5月17日土曜日

斎藤孝著 原稿用紙10枚を書く力 その2

再度、この本を読んで思ったことの文章です
文章の本の良書を読んでから
もしくは、ブログを書くようになって漸進的に
TACKに変化が生じました
それは、書くことの素材探しとしての読書です

いつからか、僕は書くことの素材探しとしての読書をするようになりました
普通に楽しむために読んで簡単な感想を書く
そのような読書ももちろんまだあります
でも、書く材料探しとしての読書も、最近よくします

やっぱり漠然と読書をするのと
書くことを前提に読書をするのとは違うし
このような読書にも違う楽しさは(はっきり)あります

斎藤孝著 原稿用紙10枚を書く力

図書館で借りてきて読みました
読んで一番気になったキーワードは構築力です
この本の中で何かを10枚書くには構築力が必要と書いていました

僕は構築なんてしたことないように見えて
書く前にボヤーッと書きたいことを考えます
で、思い浮かんだら、思い浮かんだことについて書く
キーワードはいつも2個か3個
この本の中でもキーワードは3つがいいと書いていました
それ以上、キーワードを増やしてもまとまりがないのは事実

とはいえ10枚って、結構大変ですよね
内省した結果を誰に見せるともなく書いたことはあったけど
ノートパッドにして何行かはわからないけれど
それくらいは書けた気がします
書く量を増やした時期を経て
今のTACKは2、3キーワードが浮かんだらPCに向かいます
でも、書くのは短い
いつか10枚書くのを前提に
また、量をこなす文章書きもしてみたいです

話は変わって
例えば小説を書こうとした時
構築は不可欠。みたいなことも書かれていました

小説。書けないっすね
一回書こうとして
短い段落2つ。で先が書けなくなったものです
でもそれは、僕に実力がないのではなくて
構築の作業が欠けていた。ということかもしれない

現在作成中のゲームにシナリオをつけようとして
なかなかシナリオが浮かびません
でも、それは構築の作業が欠けているということかもしれません
シナリオ書きのために
すこしづつ、キャラ設定と構築の作業を進めていきたいものです

2008年5月13日火曜日

TACK Local Links:テストコード末尾データの復元操作:テストコード

テストコード末尾データの復元操作の単体テストです
dat\\null.txt:空のテキスト
dat\\tmp_HSP_LINK.txt:データ復元操作の対象
ちなみにテキストの行数は11行です
処理しやすいように11行のテキストに9行追加して
20行にします
NO.001
TITLE:HSPオフィシャルホームページ
URL :http://www.onionsoft.net/hsp/
memo1:フリー・インタプリタ・HSPのオフィシャルサイト
memo2:
memo3:
memo4:
memo5:
memo6:
memo7:
NO.002

以下テストコード
#include "set_note_begin.hsp"
#include "set_note_last.hsp"
init_at_set_note_last "URL"
sdim dat,1024
notesel dat;*1
noteload "dat\\null.txt"
def_set_note_begin
def_set_note_last
notesave "dat\\null_c03.txt"
mes notemax
exec "notepad dat\\null_c03.txt"

sdim dat_b,1024
notesel dat_b;*2
noteload "dat\\tmp_HSP_LINK.txt"
def_set_note_begin
def_set_note_last
notesave "dat\\null_d01.txt"
mes notemax
exec "notepad dat\\null_d01.txt"
stop

*1:空テキストを操作
*2:11行のテキストを操作
今まで、テキスト操作→保存→手動で開く
といった作業をしていたんですけど
スクリプトの中でexecを使用して
自動的に開けば楽なことに気付きました(ぉ

TACK Local Links:テストコード末尾データの復元操作

TACK Local Linksでは読み込むテキスト形式のファイルは
10行単位と想定しています
なので10行で割り切れない行数だと正確に処理できないかもしれません
行数がずれていた場合、表示がおかしくなるので、わかりそうです
しかし10行の倍数で割り切れない行数のテキストファイルを
10行の倍数で読み込むとどうなるかは、予想がつきません
なので無理矢理10行の倍数まで行を埋める命令を作成してみました
ファイル名:set_note_last.hsp
#module m_set_note_last
#deffunc init_at_set_note_last str p
sdim t,256,16
t.2 ="TITLE:"
t.3 =p+" :";*1
t.4 ="memo1:"
t.5 ="memo2:"
t.6 ="memo3:"
t.7 ="memo4:"
t.8 ="memo5:"
t.9 ="memo6:"
t.10="memo7:"
return
#deffunc def_set_note_last
n=notemax\10
m=2
while n!=0
if n<=m{
noteadd t.m,-1,0
}
m++
n=notemax\10
wend
return
#global

*1:3行目は"URL :"と"pos :"の2種類のテキストの存在を
想定しているため引数を使用して代入しています

#単体テストは書きかけなのでまた明日!

2008年5月12日月曜日

TACK Local Links:空ファイル及びファイルが一行のデータへの処理:テストコード

読み込むファイル
null.txt:空ファイル
null_b.txt:データが一行のファイル
#include "set_note_begin.hsp"
sdim dat,1024
notesel dat;*1
noteload "null.txt"
def_set_note_begin
notesave "null_a01.txt"
mes notemax

sdim dat_b,1024
notesel dat_b;*2
noteload "null_b.txt"
def_set_note_begin
notesave "null_b01.txt"
mes notemax
stop

*1:空ファイルを読んだ時のテスト
*2:データが一行のファイルを読んだ時のテスト

TACK Local Links:空ファイル及びファイルが一行のデータへの処理

TACK Local Linksは複数のファイルへの処理を想定しています
なのでファイルを作成したばかりのファイルは空です
ここではそんなファイルに一行書き込む命令を定義してみます
ファイル名:set_note_begin.hsp
#module m_set_note_begin
#deffunc def_set_note_begin
if notemax==0{
noteadd "NO.001",-1,0
}else{
if notemax==1{
noteadd "NO.001",0,1
}
return
#global

2008年5月7日水曜日

TACK Local Links:ナンバーの再定義操作 テストコード

ナンバーの再定義操作命令の単体テストです
注:文字コードのエスケープ文字がバッククォートになってます
#include "write_number.hsp"
sdim dat,64000
notesel dat
noteload "dat\\HSP_LINK.txt";*1
l=notemax/10
def_write_number l
notesave "dat\\HSP_LINK11.txt"

noteload "dat\\HSP_LINK.txt";*2
repeat 15000
noteadd ":",-1
loop
def_write_number 1200
notesave "dat\\HSP_LINK12.txt"
stop

*1:ナンバーがきちんとつけられるか?のテスト
*2:ナンバーをつける数の最大が999であるか?のテスト

TACK Local Links:ナンバーの再定義操作 その2

普通はいくつかの命令をまとめてモジュール化するのですが
漸進的なブログ形式での開発ということで
モジュールが細切れです

さて、ナンバーの再定義モジュールです
ファイル名:"write_number.hsp"
#module m_write_number
#deffunc def_write_number int p
m=p;*1
if m>999:m=999
repeat m
n=cnt+1
if n<10{s="00"+str(n)};*2
else{
if n<100{s="0"+str(n)};*3
else{s=str(n)}
}
noteadd ("NO."+s),(cnt*10),1;*4
loop
return

#global


*1:数値型引数に代入をすると怒られるので変数に代入しています
*2:1桁の数字の桁数を3桁に揃える
*3:2桁の数字の桁数を3桁に揃える
*4:上書きモードでテキストデータに書き込み

末尾データの復元操作の作成が先だったかな?

TACK Local Links:ナンバーの再定義操作

サンプルテキスト
注:文字コードのエスケープ文字がバッククォートになってます
ファイル名:"dat\\HSP_LINK.txt"
NO.001
TITLE:HSPオフィシャルホームページ
URL :http://www.onionsoft.net/hsp/
memo1:フリー・インタプリタ・HSPのオフィシャルサイト
memo2:
memo3:
memo4:
memo5:
memo6:
memo7:
NO.002
TITLE:HSPTV!
URL :http://hsp.tv/
memo1:HSPの最新情報ならココ!
memo2:
memo3:
memo4:
memo5:
memo6:
memo7:
NO.006
TITLE:HSPユーザーのサイトのLINK
URL :http://hsp.tv/play/link.html
memo1:HSPユーザーのサイトのLINK
memo2:
memo3:
memo4:
memo5:
memo6:
memo7:
NO.007
TITLE:HSP LINK 推奨サイト
URL :http://hsp.tv/play/link1.html
memo1:HSPの推奨サイト
memo2:COOL で HOT な情報がテンコ盛り
memo3:
memo4:
memo5:
memo6:
memo7:
NO.008
TITLE:HSP LINK HSPの情報・講座などがあるサイト
URL :http://hsp.tv/play/link2.html
memo1:HSPの情報・講座などがあるサイト
memo2:HSPを学びたいなら、ここからジャンプ!
memo3:
memo4:
memo5:
memo6:
memo7:
NO.009
TITLE:HSP LINK 拡張プラグイン・支援ツール等のサイト
URL :http://hsp.tv/play/link3.html
memo1:HSPの拡張プラグイン・支援ツール等のサイト
memo2:HSPを極めたいなら、ここからジャンプ!
memo3:
memo4:
memo5:
memo6:
memo7:
NO.010
TITLE:HSP LINK その他・リンク集など
URL :http://hsp.tv/play/link4.html
memo1:HSPのその他・リンク集など
memo2:HSPを調べる時は、ここからジャンプ!
memo3:
memo4:
memo5:
memo6:
memo7:
NO.011
TITLE:HSP LINK HSPによるソフトを公開しているサイト
URL :http://hsp.tv/play/link5.html
memo1:HSPによるソフトを公開しているサイト
memo2:HSPで楽しみたいなら、ここからジャンプ!
memo3:
memo4:
memo5:
memo6:
memo7:

このようなテキストを操作してみます
サンプルテキストは80行です
テキストファイルの最後尾の行は"memo7:"の行で終わって下さい

TACK Local LinksのToDoリスト

現在考えている、TACK Local Linksのデータ構造と、テキスト形式のデータへの操作のToDoリストです
  • データ構造
  • 一行目:ナンバー
  • ナンバーはつけなくてもいいような気もしてきましたが、テキストを直接編集する時にあると便利そうなので、一行目は、ナンバーにしています
  • 二行目:タイトル
  • 三行目:URL
  • 四行目~十行目:メモ
  • 本当はメモは八行あったのですが、七行だと行数付きエディタで編集するのに便利なので、泣く泣く、メモは七行にしました

データ操作機能ToDoリスト

  • 末尾データの復元操作
  • 末尾データが十行ではなく、例えば、七行だったら、正確に処理できないので、末尾データのみ、データを付け加えて、テキストデータの行数を十の倍数にします
  • ナンバーの再定義操作
  • 追加や削除でナンバーが正確でなくなった時に、必要そうな機能です。またテキストデータを直接加工した場合、自動的にナンバーを再定義できると、便利そうです
  • データの編集操作
  • データの追加操作
  • データの削除操作
  • データの移動操作
  • (将来的に)データのエラーチェック
  • データを直接加工することを考えると、データのエラーをチェックしてくれると便利そうですよね。しかし、この機能は、TACKの技術的に当分実装できない気がします

TACK Local Links

結構、前に作成していたLocl Linkツール、TACK Local Links
の作成を再開してます

動機は以前書いた。小・中学生の頃、通っていた
塾の先生のアドバイスです。
wikiに書くのを続けてみればいいじゃない?
と、その時、言ってもらいました
僕に何人もの人が反論したことを指して
一対複数だから、負けて当然ですよね。言った
そうすると先生は書くということは
何人が相手だろうと立ち向かうことなのよ。と言った

その時は、またwikiへの投稿を再開しようと思いました
でも、以前の投稿から間が空きすぎて(ソフト開発の企画ね)
上手く再開はできません
しかし、テキスト形式のデータの処理として
TACK Local Linksのテキスト形式で処理している
データへの操作のスクリプトを書くことに決めました
wikiへの投稿はためらわれますが
ellerさんのようにブログ形式で更新していこうと思っています

2008年5月6日火曜日

考える力がつく「文章」の書き方

またまた、図書館で借りて読みました
考える力はついたかどうかわからないけれど
(そもそも本、一冊読んだくらいで
 考える力がついたら苦労しないんだろうけど
 でも、考えながら何かを書き続けていったら
 考える力もつくんだろうなぁ)
少し、文章を考えながら読むようになりました

予備校の小論文の授業で生徒が書いた小論文の添削が主なんだけど
説明を読みながら読んでたら
考えながら読めるようになってきた気がします

それよりなにより
文章指導の本は、読むことにより
文章指導をするというほどテクニックを押さえた
書き方をする文章を読むということで
文章に影響が出るんですよね
今、気付いたんやけど
この文章も序論・本論・結論の三段重ねになっている(笑)

2008年4月30日水曜日

HSPゲームプログラミング・クックブック

なんか最近、スクリプトを書く気がおきなかったんですよ
作りたいゲームもツールもモジュールもあるのに
いまいち、スクリプトを書く気がおきなかった

で、解決策をみつけました
先日、僕の小・中学校で通っていた塾に遊びに行きました
で、僕、数学が手順を踏んで式を変形するの苦手だったんですよ
みたいなことを言いました
だから、プログラミングをする時に
手順を踏んでプログラミングをするのが苦手なんですよ
みたいなことを言いました
すると、それは数式の処理のパターンを抑えてなかったから
そうだったんだよ
みたいなことを言われました
つまり、スクリプト書きも、主なスクリプトの手順を抑えてないから
上手く、手順を踏んで、スクリプトを書けなかったんだぁ
ってなりました

それから3日くらい
HSPゲームプログラミング・クックブックを読みました
理由は主なスクリプトの手順を抑えるためです
で、今日、久しぶりにスクリプトを書きたくなりました
たった3日本を読んだだけで
スクリプトの手順なんておさえられられるようになるわけはないけれど
僕もこれまで、量としてはそんなに多くはないけれど
スクリプトを書く経験をしています
それがこの3日間で
以前の状態とつながったかんじです

これからは
HSPゲームプログラミング・クックブックも
HSP3プログラミング辞典も
モチベーションが下がる度に
何回も何回も読んでいきたいです

コンパイラ構成法

amazonで買いました
4800円もしました
プレミアでも付いているのかなー?なんて思いきや
届いて値段見たら6500円って書いてありました
専門書って高いのね

内容はyaccとlexの使い方です
簡単な言語作成の本は2冊ほど読みましたが
構文解析がいまいち理解でけん!
ってな状況です

で、この本少し読んでみました
なんかあんまり構文解析しなくても言語が使えるみたいです
難しくて家だとなかなか内容が頭に入ってきません
なので、今度図書館でも行った時に図書館パワーで読んでいこう
なんて考えています

2008年4月20日日曜日

「文章を上手につくる技術」 その2

「文章を上手につくる技術」
あさ出版 上条晴夫 著P111
> ①主張(クレーム)②事実(データ)③論拠(ワラント)の
> 三段重ねで説得する

TACKは自己主張が激しいです
でも主張だけ
経験は書くかな
しかし、論拠は見事にないねぇ
主張には論拠が必要。と

「文章を上手につくる技術」

図書館から借りてきて読みました
文章を書く技術の本は数冊読んだけれど
なかなか役に立ちませんでした
そんな中、この本は書く技術に満ちていました
特に意識しなくても、書く技術に満ちた筆者の文章を読むだけで
書く技術が向上した気がします

「文章を上手につくる技術」あさ出版 上条晴夫 著P162~P174
> 一つの文で一つのことだけを書く。
> 句点(。)をなるべく多く稼ぐ。
>「一文一義」で書けばわかりやすい
>― なるべく一文を短く書く

一文一義かぁ。そんなこと考えたこともなかった
僕は文章を書くとき、頭の中を出力すべくダラダラと吐き出してました
そうか!文章は短い方が読みやすいんだ!
書籍には句点を5百円玉だと思ってたくさん稼げ!みたいなことが
書かれておりました
今度からは句点を5百円玉だと思っていっぱい稼ごう

> 長い文章を短くする技術
> ― 短い文を積み重ねれば論理的になる
> ― 一文を短くする三つのポイント
> ステップ1:機械的に句点をつける
> ステップ2:できるだけ主語を補う
> ステップ3:文間に接続詞を入れる

というわけで文を短くするコツは上記のようです要チェックやぁ!。と

ブログ始めました

ここでは初めまして。y.tackと申します

ellerさんのブログを見てて始めようかなと思いました
内容は以前書いてた日記の延長です
でも他の人の書いたブログにトラックバックを送ったり
色々とブログならではの活動をしていきたいと思っています

2008年3月25日火曜日

プロジェクト すぅぃった その7

NO.2130
久しぶりに”プロジェクト すうぃった”を更新しました
解説しているサンプルRPGは
文字列の描画をシナリオ化したものです

このスクリプトを作成して、どれくらいたつだろうか?
2、3年たっているかもしれません
このスクリプトは、とにかく動作が汚くて
解説が思い浮かばなかったので、アップしてなかったんだけど
りささんのBBSでシナリオのスクリプトについて触れて
ちょっと更新してみようか?ってなりました
解説は手抜きですが
シナリオ使用の一サンプルとして御一読あれ

2008年3月11日火曜日

まつもとひろゆきさんのブログ その3

NO.2129
今日はバイトがお休みだったので
いつも期間をおいてガーッと読むMatz日記を読んでいます

今読んでいるところは、まつもとひろゆきさんが
PHPの欠点の指摘をしてものすごい反応があったところ
それでもまつもとひろゆきさんは
自分は炎上とは思っていないと書いていらっしゃった
強い人やねぇ

僕なんてwikiで少し中傷されただけでものすごい凹んだのにぃ
中傷はされたけれど
もう少しwikiに書きたい文章がある
まつもとひろゆきさんの姿勢を見習って
もう少し頑張ってみようかな。なんて思いました

それから、PHPユーザー(?)の反響から
最近HSPユーザーの反響がないな。とも書いていました
少ないコア・ライブラリに少ない外部ライブラリだってさ
僕としては、標準命令は少なくて嬉しいけれど
覚えることが少なくて
なんとなく動作は覚えているので
使いたい機能はヘルプ・ブラウザで検索すれば、すぐ出てくるし
外部ライブラリが少ないのはDLL化しなければいけないからでしょうか?
確かに外部ライブラリは作りやすくして欲しいですけど
でも、APIだの、定義だけの命令だの
(userうんたらだの、karnelうんたらだの)
使える命令はものすごい数になっていますね
それらはいちいちGOOGLE先生に質問しないといけないんで
(ヘルプ・ブラウザに載ってる命令みたく
 動作で検索できないし)
使用するのに抵抗もあります

2008年2月13日水曜日

TACK Local Links 開発記

NO.2128
以前、日記に書いた、IE Linkツール、TACK Local Links
の話です
制作は順調なのかなぁ?
2日に1回くらい。一日一時間くらいスクリプト書きしてます
なんで、こんなにペース遅いんだろw

で、少しスクリプトが長くなって来たので
リファクタリングの時間です
スクリプトを改めて読んでみると...
汚い。これはヒドイ
設計も何もなく。思いつくまんまスクリプト書きしてたらこうなりました
ひょっとしたら、スクリプト公開できないかも
でもでも、是非!サンプルスクリプトとして公開したいので
リファクタリング頑張ります

完成度:10%

はじめよう!Java

NO.2127
日経ソフトウェア2006総集編の記事です
2007総集編も買ったというのに
未だに2006を読んでたりします
というわけでJavaの連載を読んでみました

中盤までは既知のことがら
復習のつもりでサラサラ読みました
なんかこれはサクサク読めると思ったら
知ってることがら故か?

オブジェクト指向があって
(わかるわかる)
ポリモーフィズムがあって
(わかるわかる)
オーバーロードにオーバーライドにインターフェイス
この辺がまだわかってなかったみたいです
やっぱりよくわかってないことは、読むの大変ですね

とりあえずJavaの知識が一歩前進!といったところでしょうか?

私がマイクロソフトで学んだこと

NO.2126
いつものごとく図書館で、
ではなく古本屋でGETしました

中身はマイクロソフトの内部から見たことです
ハッカーにはマイクロソフトが嫌いな人が多いみたいだけど
僕は中立的立場です
別に好きでも嫌いでもない
とかいいつつWindowsしか触ったことがありません

PCの性能アップを帳消しにするような
Windowsの遅さは確かにムカつくけれど

著者はハッカーではなくマネジメント関係の人みたいなんで
ビジネス書としては、楽しめました

2008年2月2日土曜日

TACK Local Links

NO.2125
「TACK Local Links」とは、TACKが、最近作成し始めたツールの名前です
簡単に言うとお気に入り管理ツールです
お気に入りと言っても、IEとは全然連携してないですがw
選択画面にタイトルとURLとメモを表示して
URLにジャンプするだけです
ぶっちゃけ、お気に入りでもたいして不便はないのですが
よく行くページじゃないと
タイトルからどんなサイトだったかわからないし
簡単なメモも書いておきたいです
そんな不満を解消するために、現在、作成中です

動機の一つとしてさくらさんの
HSC :: HSP Script Center (hsc)
を使ってみて、インスパイアされて、製作する気になったということです

現在の問題点
IE型のCOMを作ってジャンプするんだけど
手動でIEを閉じてしまうと、操作していたCOMがなくなってしまうんですよね
そうなるとバグります
ジャンプする時はいちいちIEを開くか
注意書きを書いてバグつきのまま公開するか、思案しています
(いちいちIEを開いていると遅いんですよ)

mdl_wr_logモジュール(マクロ?)

NO.2124
ようやく公開しました
スクリプトは割と早く完成したのですが
コメントもついてないし、説明文も全然思いつかないw
その後、コメントはササッと書いて、後は説明文
(要点を得ないコメントですみません)
よし、書くぞ!と決めて
うりゃぁ!って書いたら、サックリ書けました
中身は「MODULE作:TACK」のページを見て下さい
あとはこのモジュールを、今作成中のゲームに実装して
解析ツールを作ります
スクリプト作成は(この場合ゲームね)ツール作りから。ってかんじです
なんかこのモジュールを書いていたら
主題のゲーム作りがおっくうになってきた気もしますが、気にしない

2008年1月13日日曜日

ソニー自述伝

NO.2123
古本屋で買いました
ソニーで編集したのをまとめた本のようで
今までのソニーの奇跡がわかりやすくまとまっていて
すげーなぁ。と思いました

プラグラミング関係でもソニーみたいな
進歩的な企業があれば憧れるのになぁ
ま、僕みたいな奴はそんな企業があっても入れないだろうけれど

もしくは、プログラミング関係のソニーみたいな企業は
アメリカにごろごろしてるとか
英語上手くなりてーよー

#僕なんか英語が上手くてもそんな企業はいれねぇってW