Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2019/04/07 (日)

祝 新元号発表! で、西暦→元号変換してみる

| 16:36 | 祝 新元号発表! で、西暦→元号変換してみる - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 祝 新元号発表! で、西暦→元号変換してみる - 雪乃☆雫のなでしこ日和 祝 新元号発表! で、西暦→元号変換してみる - 雪乃☆雫のなでしこ日和 のブックマークコメント

 マイナビ連載43目は、新元号対応の和暦変換でした。

https://news.mynavi.jp/article/nadeshiko-43/

 これは、このタイミングで絶対出ると思っていましたよ~☆

 ワタシも、和暦変換するのを作ろうと思っていたけど、に合わなんだorz


 記事の最後に、明治以前の和暦にも対応することについて、さらっと触れられていました。

 実は、これは、ガチでやろうとすると本当は、思うほど簡単なことではありません。

 明治六年(1873年)の、グレゴリオ暦導入以前の和暦は旧暦なので、西暦と単純に対応させることが出来ないんですね。

 例えば、なでしこ3にはまだありませんが、なでしこ1には「和暦変換」とゆう命令があり、「1868/01/01」までの西暦を変換してくれることになっていますが、旧暦には対応していないため『「1868/01/01」を和暦変換して表示』とすると、『明治元年1月1日』と返ってきますが、実際には『慶応3年12月7日』です。

 まあ、明治までなら、こうゆう仕様ですと言い張ることも可能かと思いますが、有効な日付を「日本でグレゴリオ暦が採用された明治6年1月1日(1873/01/01)以降」、とするのが本当であろうかとも思われます。

 して、明治以前にも対応するとなると、ちょっとそう言うわけには行かないです。

 日付まで対応しようとすると、改元日のデータと、さらには旧暦のデータも必要になってくる。

(グレゴリオ暦導入後ならば、改元日が無くても、の年の1/1に遡って新元号とする立年改元としても良いのですが、旧暦の場合、の立年改元で遡るべき1/1自体が西暦とは一致ないので)

 してさらに、西暦にグレゴリオ暦が採用される以前の西暦は、ユリウス暦ということにするのかグレゴリオ暦のまま遡るのか、とゆう問題にも直面する。

 あー、アタマ痛い(@_@)

 てゆうかもう、具合わるい(´д`)


 さてさてそれでは、日付のことは考えずざっくりと、西暦年を入れたら元号年に変換するだけならば、元号の開始年と終了年を「大化」から「令和」まで全て用意すれば、マイナビの記事のとうりで、すんなりとできるでしょうか?

 答えは、否です。

 例えば、安政は1855年~1860年なのですが、かの桜田門外の変が安政7年3月3日であることで分かるように、7年まであります

 ところが、単純に当てはめていくと・・・

1855 嘉永7年/安政元年
1856 安政2年
1867 安政3年
1868 安政4年
1859 安政5年
1860 安政6年/万延元年

 ・・・あれ、いっこ足りない?! となります。

 これは、安政への改元が、和暦では年明け前、西暦では年明け後の嘉永7年11月27日(1855/01/15)に行われたために起こります。安政元年は1ヶ月ちょいしかありません。

 西暦1855年は、1/14までは嘉永7年、1/15~2/16のだけ安政元年、2/17以降は安政2年なんですよ~ん。

1854 嘉永7年
1855 嘉永7年/安政元年/安政2年
1856 安政3年
1867 安政4年
1868 安政5年
1859 安政6年
1860 安政7年/万延元年

 どうすりゃいいんだ?

 やっぱ、1860年=安政7年=万延元年とするためには、1855年=安政2年とゆうことにして帳尻を合わせるしか無い。

 しかし、1854年は嘉永7年で、嘉永最後の年だけど安政元年では無いので、安政元年は存在し無いコトになっちゃうけど、仕方がない!・・・のか?

 このような元号が、12個もあります


 プログラム的には?

 どーすりゃいいんだ??

 単純に、こうなっちゃう元号の場合にだけ、Vをさらに+1にする・・・?

 あと、1年続かず年内に改元となった元号が3つありますが、それも無かったことになっちゃいますが、コレもどうしようもない・・・のか?


 考え方としては、指定された西暦年の最終日、12/31時点での元号を、の年の元号と見なして表示する・・・的なことになりますかね?

 南北朝時代は、正統とされる南朝側の元号を表示することにする。

 ・・・でっ、こんな感じ?

#---宣言----------
元号一覧URL=「gengo_s.csv」
時代区分URL=「jidai.csv」
和暦表=配列。特殊元号1=。特殊元号2=。
西暦年=今年。西暦年エディタ。
時代一覧=配列。
時代区分URLへGET送信した時には
  対象CSV取得し、それを時代一覧へ代入ここまで。
元号一覧URLへGET送信した時には
  対象CSV取得し、それを和暦表へ代入。
  和暦表を反復
   もし対象[1]=対象[2]ならば、特殊元号1=特殊元号1「・」対象[0]。ここまで。
   もし、(対象[3]の1だけ文字左部分)=「*」ならば、特殊元号2=特殊元号2「・」対象[0]。ここまで。
  ここまで。
  特殊元号1=特殊元号1の1から1だけ文字削除。特殊元号2=特殊元号2の1から1だけ文字削除。

    #---GUI作成----------
    HTML = 「
    <div class="nako3">
    指定された西暦年を元号年に変換します。<BR>
    1年続かず年内に改元した元号は無視されます。({特殊元号1})<BR>
    西暦では年が明け、和暦では年明け前に改元が行われた元号では、元年と2年が同じ年になるため、元年が表示されません。<BR>
    ({特殊元号2})<BR>
    南北朝時代は南朝側の元号を使用。<BR>
    時代区分は『広辞苑第七版付録 西暦・和暦対照表』による。<BR>
      <p><div id="gui"></div></p>
      <p><div id="result"> </div></p>
    </div>
    」
    「#nako3_div_1」にHTMLHTML設定。
    「#result」に{
      "padding": "16px",
      "border": "1px solid #FF7979",
      "背景色": "#FFF4F4"
    }をDOMスタイル一括設定。

    「#gui」にDOM親要素設定。
    改行作成。
    「西暦 」のラベル作成。
    西暦年のエディタ作成して、西暦年エディタ代入。
    「年」のラベル作成。
    改行作成改行作成。
    「西暦和暦変換処理」のボタン作成して、変換ボタン代入。
    「 」のラベル作成。
    「クリア」のボタン作成して、クリアボタン代入。
    西暦年エディタの「幅」に「80px」をDOMスタイル設定。

    変換ボタンをクリックした時には
     西暦年=西暦年エディタからテキスト取得。
     西暦年=西暦年を英数半角変換。
     和暦年=西暦年を西暦和暦変換処理。
     年干支=西暦年の年干支取得。
     時代区分=西暦年の時代区分取得。
     「#result」に「{和暦年} {年干支} {時代区分}」をテキスト設定。
    ここまで。

    クリアボタンをクリックした時には、
    西暦年エディタをテキスト設定。
    ここまで。
ここまで。

●(西暦年を)西暦和暦変換処理とは
  もし、西暦年<645ならば、「元号制定以前」で戻る。
  違えば、
   和暦表を反復
    # 表から値を取り出す
    和暦名=それ[0]
    開始年=それ[1]
    終了年=それ[2]
    改元日=それ[3]
    # 指定した西暦に該当するか調べる
    もし(開始年≦西暦年)かつ(西暦年<終了年)ならば、
      和暦年=西暦年-開始年+1。
      もし、(改元日の1だけ文字左部分)=「*」ならば、和暦年=和暦年+1。
      もし、和暦年=1ならば、和暦年=「元」。
      「{和暦名}{和暦年}年」で戻る。
    ここまで。
   ここまで
  ここまで。
  「不明」で戻るここまで。

●(西暦年の)年干支取得
 十二支=「子丑寅卯辰巳午未申酉戌亥」を文字列分解。
 十干=「甲乙丙丁戊己庚辛壬癸」を文字列分解。
 干支は配列。
 60
  C=回数-1
  干支[C]=「{十干[C%10]}{十二支[C%12]}」
 ここまで。
 干支No=西暦年%60-4。
 もし、干支No<0ならば、干支No=干支No+60。
 干支[干支No]で戻るここまで。

●(西暦年の)時代区分取得
 時代一覧を反復
  もし対象[2]≧西暦年ならば対象[0]で戻るここまで。
 ここまで。
ここまで。

http://snowdrops.starfree.jp/wnako3_test/17_gengo.html

 タブン合っていると思うんだけど・・・

 干支と時代区分も表示してみたケド、よく考えたら、こんな風に表示するなら、の年に含まれる元号を全て併記するようにしても良かったのだ;

 まあめんどーだし、西暦と和暦を1対1で取得したい場合とゆうことで(^▽^;


 本当は、なでしこ1の和暦変換みたいに日付で、改元日も反映させてずっと昔まで変換出来るようにしたいと思うんだけど、カナリ挫折中(+_+)

 も旧暦と一口に言ったって、本当なら幾度も改暦が行われてますけど、こはどーしますか?! などとゆうさらなる問題にも直面したりするわけです。

 うう、それはムリ・・・(>_<;;;



【追記】

 の後ウィキペディアを見たところ、「実際とはずれが生じる」としながらも、「嘉永7年=安政元年=西暦1854年」にしちゃう感じのようでした。

 立年改元(の年の1/1に遡って新元号とする)として考えれば、嘉永7/安政元年の1/1は、西暦では1854/01/29なので、っから安政元年は始まってるのだと言い張ることも可能っちゃ可能。

 いっこいっこ検索する場合ならともかく、一覧で出力した時とか、元年が無いのもかなり違和感があるし、っちのほうがいいかなぁ?

 の場合は、プログラムでどうこうするより、ちょこっとデータを変えちゃった方が、楽だねw

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190407

2019/03/22 (金)

テキスト読上げ(青空文庫形式対応)

| 12:49 | テキスト読上げ(青空文庫形式対応) - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - テキスト読上げ(青空文庫形式対応) - 雪乃☆雫のなでしこ日和 テキスト読上げ(青空文庫形式対応) - 雪乃☆雫のなでしこ日和 のブックマークコメント

 なんだかんだで、読上げ自体はわりとすぐに出来るようになりました。

 [# ]で囲まれた註を無視して、前に書いたとうりに漢字部分を読まずにルビの方を読むようにしただけなので。

#------------------------------------------------------------------
# テキスト読上げ
#------------------------------------------------------------------
「Google 日本語」に話者設定。   //ダミー

#---宣言----------
テキスト=。読上中フラグ=オフ行数=-1。細区切=-1。
区切記号=「{CRLF},{CR},{LF}」を「,」で区切る。
息継記号=「 , ,?,!,―,…,{カッコ}」を「,」で区切る。
註記号=「-------------------------------------------------------,-------------------------------------------------------
※[#,]{改行}[#,]」をCSV取得。

#---HTMLの設置----------
HTML=「<div id="main"></div>」
「#nako3_div_1」にHTMLを、DOM_HTML設定。

#---GUI作成----------
「#main」にDOM親要素設定。
のテキストエリア作成し、テキストエリアに代入改行作成。
「読み上げ」のボタン作成し、読上ボタン代入。
「先頭」のボタン作成し、先頭ボタン代入。
「クリア」のボタン作成し、クリアボタン代入改行作成。
「{カッコ}、{カッコ閉じ}でも区切って読む(Google 日本語で止まる場合)」のチェックボックス作成し、細区切チェック代入改行作成。

#---CSS設定----------
読上ボタンの「margin」に「2px 5px」をDOMスタイル設定。
先頭ボタンの「margin」に「2px 5px 2px 50px」をDOMスタイル設定。
先頭ボタンの「disabled」に「disabled」をDOM属性設定。
クリアボタンの「margin」に「2px 5px」をDOMスタイル設定。
細区切チェックの「margin」に「10px」をDOMスタイル設定。
テキストエリアの「rows」に「20」をDOM属性設定。
テキストエリアの「placeholder」に「ここに読上げたいテキストを入力して下さい」をDOM属性設定。

テキストエリアに{
  "幅": "100%",
  "margin": "2px 5px",
  "背景色":"#ffffff",
  "色": "#000000",
}をDOMスタイル一括設定。

#---イベント----------
クリアボタンをクリックした時には、
  「テキストを全てクリアします。{改行}読上げ中の場合は、読み上げも中断します」で二択。
  もしそれはいならば、
    細区切チェックの「disabled」にDOM属性設定。
    テキストエリアにをテキスト設定。
    テキスト=。読上げ中フラグ=オフ行数=-1。
  ここまで。
ここまで。

先頭ボタンをクリックした時には
  「先頭に戻って読み上げを行います。」で二択。
  もしそれはいならば、
    行数=-1。読上開始。
  ここまで。
ここまで。

読上ボタンをクリックした時には
 「Google 日本語」に話者設定。   //Google Chromeでは、Google 日本語で読む。
 もし、読上中フラグ=オフならば、
  読上開始。
 違えばもし、読上中フラグ=オンならば、
  先頭ボタンの「disabled」にDOM属性設定。
  読上中断。
 ここまで。
ここまで。

細区切チェックの「onchange」に「チェック関数」をDOMイベント設定。

●チェック関数
  細区切=細区切*-1。
ここまで。
#------------------------------------------------------------------
●読上テキスト作成
 註記号を反復
   対象[0]から対象[1]を註削除。
 ここまで。
 ルビ反映。
 テキスト=テキストの「》」を置換。
 テキスト=テキストの「|」を置換。
 テキスト=テキストのカッコ閉じを「。」に置換。
 テキスト=テキストの「。」を「。{改行}」に置換。
 もし、細区切=オンならば、
   テキスト=テキストの「、」を「、{改行}」に置換。
 ここまで。
 息継記号を反復
   テキスト=テキストの対象を「、」に置換。
 ここまで。
 区切記号を反復
   テキスト=テキストを対象区切る。
 ここまで。
ここまで。
#------------------------------------------------------------------
●註削除(AからBを)
 検索開始位置=1。
 削除始=テキストで検索開始位置からAを文字検索改。
 もし、削除始=0ならば戻る。
 削除終=テキストで削除始+(Aの文字数)からBを文字検索改。
 もし、削除終=0ならば戻る。
 削除数=削除終-削除始+(Bの文字数)。
 テキスト=テキストの削除始から削除数を文字削除。
 検索開始位置=検索開始位置+削除始
 AからBを註削除。
ここまで。

●ルビ反映
 検索開始位置=1。
 ルビ記号=テキストで検索開始位置から「《」を文字検索改。
 もし、ルビ記号=0ならば戻る。
 ルビ始=ルビ記号-1。
 オン
   仮=テキストでルビ始から1を文字抜出。
   もし、(仮を漢字か判定)=はいならば、
     ルビ始=ルビ始-1。
   違えば、
     ルビ始=ルビ始+1。抜ける。
   ここまで。
 ここまで。
 削除数=ルビ記号-ルビ始+1。
 テキスト=テキストのルビ始から削除数を文字削除。
 検索開始位置=検索開始位置+ルビ記号+1。
 ルビ反映。
ここまで。
#------------------------------------------------------------------
●文字検索改(SでAからBを)
 検索対象=(Sの文字数)+1-A。
 仮=SのAから検索対象を文字抜出。
 数=(仮でBを文字検索)
 もし、数=0ならば、数で戻る。
 違えば、数+A-1で戻る
ここまで。

●漢字か判定(Sが|Sの|Sを)
  Sを「^[\u3005\u3007\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DFF]|[\uD840-\uD87F][\uDC00-\uDFFF]」で正規表現マッチ。
  もしそれがnullならばいいえ戻る。
  違えばはい戻るここまで。
#------------------------------------------------------------------
●テキスト読上げ
 もし、読上中フラグ=オンならば、
  行数行数+1。
  もし行数≧(テキストの要素数ならば、
    細区切チェックの「disabled」にDOM属性設定。
    行数=-1。読上中断。戻る。
  ここまで。
  テキスト[行数]を話し終わった時には
    テキスト読上げ。
  ここまで。
 ここまで。
ここまで。
#------------------------------------------------------------------
●読上開始
  テキスト=テキストエリアからテキスト取得。
  もし、テキスト=ならば、
    「テキストエリアに読み上げたい文章を入力して、読み上げボタンを押して下さい。」と言う。
  違えば、
    読上テキスト作成。
    読上ボタンに「一時停止」をテキスト設定。
    読上中フラグ=オン。
    テキストエリアの「disabled」に「disabled」をDOM属性設定。
    先頭ボタンの「disabled」に「disabled」をDOM属性設定。
    クリアボタンの「disabled」に「disabled」をDOM属性設定。
    細区切チェックの「disabled」に「disabled」をDOM属性設定。
    テキスト読上げ。
  ここまで。
ここまで。

●読上中断
  読上ボタンに「読み上げ」をテキスト設定。
  読上中フラグ=オフ。
  テキストエリアの「disabled」にDOM属性設定。
  クリアボタンの「disabled」にDOM属性設定。
ここまで。
#------------------------------------------------------------------

http://snowdrops.starfree.jp/wnako3_test/16_yomiage.html

 がっ・・・

 ぐる子さん(Google日本語)の方が、はるかさんより読み違いが少なくて、多少聞きやすい感じなので、変えれるようにすっかなと思ったんですけど、どうも「話者設定」や、「話者一覧取得」の命令が、初は通らない(?)感じなのです。

話者一覧取得して反復
  F名前=対象["name"]
  F言語=対象["lang"]
  「{F名前}: {F言語}」を表示ここまで

 実行ボタンを押しても出ないんです。

 で、あれ? と思ってもう一押したらちゃんと表示され、の後はタブではずっと動きます。

 だもんで、前に話者変更などを試していた時には気付いてなかったけど、新しく開いた毎目は動かないの。謎すぎ。


 エディタの場合は、実行ボタンを二押せば良いだけなんだけど、HTMLに埋め込んだらそうもいかないですよね。

 一ダミーで話者設定し、ウェイトを入れた後、再設定すると通るので、最初にダミーを設定した後イベントの中で再設定で、出来たことは出来たのですが、無理矢理すぎ;



 あとは、なでしこは関係ないと思われることだけど、chromeさんとは、どうも相性が良くないみたいなんですよねぇ・・・


 ぐる子さんは長文が読めないらしくて、読上げ途中でいきなり止まって、再読み込みではダメで、ブラウザ自体の再起動必要かも知れない感じになる~(´д`)

 長文を読ますような前提じゃないってコトかも知れないし、一度話し始めたら、強制的に中断させるような命令もないのだから、もあんまり長文を一気に話させるのはどうかと思われるところですけど、100文字以下くらいでも余裕で止まることがあるから、改行や「。」ごと区切ったくらいじゃ駄目なことがあって、困ったもんだ。

 これは、chromeがと言うより、Google日本語のことで、chrome+はるかさんなら問題はないFirefoxではもちろん問題が無い。

 読上げエンジンの方の仕様なのかと思われるけど、「、」で区切ると、ちょっと息切れ感が・・・;


 それから、読上げようのテキストが大きいと、「話す」には一行ずつ送ってるにもかかわらず、しばしば止まるんだよね~。大きいったって30kbくらいなんですが。

 いや、のせいかどうかすらもよく分からんけど、元のテキストを半分とかにしたら、ふつーに読めたのです。

 でも、短編の一編くらいは、まるっと最初から最後まで読んで欲しいよね~。むむむ~。

 これは、chrome+はるかさんでも発生し、前のとは違って、一時停止して、もっかい読上げボタン押すと、次を読んだりもする。これFirefoxでは大丈夫。

 場当たり的には出来るようにできそうな気もするけど、原因が確定していない上にワタシが普段メインで使ってるのはFirefoxだから、やる気出ないなぁ;

 なにしろ、どれもこれFirefoxでは無問題なのですよ(?_?)

 お試しとゆうことでこんくらいにしておくか、まちっと研究してみるか、それが問題だw

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190322

2019/03/17 (日)

「文字検索」と「漢字か判定」

| 09:50 | 「文字検索」と「漢字か判定」 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 「文字検索」と「漢字か判定」 - 雪乃☆雫のなでしこ日和 「文字検索」と「漢字か判定」 - 雪乃☆雫のなでしこ日和 のブックマークコメント

 マイナビ連載42目は、「再帰処理」についてでした。

https://news.mynavi.jp/article/nadeshiko-42/

 いや~、ワタシは別に、再帰処理につまずいた気はしないですけどね~。

 だって、それ以前に関数がわかんなかったし(爆)

 なでしこのお陰で急に賢くなって以降は、深く考えずに、ふつーに、それっぽいことをしていたように思う。



 それはさておき、「文字検索」です。

 そうは書いてないけど、v1非互換でした。

 なでしこ1の文字検索は、「文字列SでA文字目からBを検索する」とゆう命令でした。

 したがって、先頭の1文字目から検索を始めて、見つかったら「それ+1」文字目から次を検索・・・とゆう手順で、文書内にある全てのBを検索出来ました。(再帰って、こうゆうコトだよね(?))

#なでしこ1
C=1。新聞紙。
●新聞紙
 「しんぶんし」でCから「ん」を文字検索。  //「文字検索」
 もしそれが0ならば、 //ヒットしなかった場合は、
   戻る。       //関数から戻ることを忘れず!
 違えば、
   それ表示。
   C=それ+1。
   新聞紙。      //再帰

 まあ、なんかこんなような。

 ところが!

 なでしこ3の文字検索は、「文字列Sで文字列Aが何文字目あるか調べて返す」とゆうことになっており、検索開始位置の指定が出来ないんですよー。

 これでは、「何文字目」命令と、同じことっぽい。

 しくしくしくしく。どーすりゃいいんだorz


 ・・・・・・とりあえず、こんな感じか?

#なでしこ3
C=1。新聞紙。
●新聞紙
 「しんぶんし」でCから「ん」を文字検索改。
 もしそれが0ならば、
   戻る。
 違えば、
   文字位置=それ
   文字位置を表示。 //「それ表示」だと、v3の場合の後の「それ」が「undefined」になっちゃう
   C=文字位置+1。
   新聞紙。
 ここまで。
ここまで。

#-----------------------------------------------
#文字列SでA文字目からBを検索する
#なでしこ1の「文字検索」互換っぽいの
●文字検索改(SでAからBを)
 検索対象=(Sの文字数)-A+1。 //Aの位置も検索対象に含める
 仮=SのAから検索対象を文字抜出。
 数=(仮でBを文字検索)
 もし、数=0ならば、数で戻る。
 違えば、数+A-1で戻る
ここまで。
#-----------------------------------------------

 タブン、合ってると思うんだけど・・・



 さてさて、次にやりたいことは、指定した文字が漢字かどうかを調べることなんだけど、「文字種類」の中に、漢字か判定は無いので(1にも無い)自前でなんとかしないない

 ユニコードのCJK統合漢字の中に、ふつーに使うほとんどの漢字が含まれているのですが、ウィキペディアさまによると、Unicode 11.0では次のようになってるそうです。

U+4E00~U+9FEA   CJK Unified Ideographs(CJK統合漢字)
U+F900~U+FAFF   CJK Compatibility Ideographs(CJK互換漢字)
U+3400~U+4DFF   CJK Unified Ideographs Extension A(CJK統合漢字拡張A)
U+20000~U+2A6FF  CJK Unified Ideographs Extension B(CJK統合漢字拡張B)
U+2A700~U+2B734  CJK Unified Ideographs Extension C(CJK統合漢字拡張C)
U+2B740~U+2B81F  CJK Unified Ideographs Extension D(CJK統合漢字拡張D)
U+2B820~U+2CEAF  CJK Unified Ideographs Extension E(CJK統合漢字拡張E)
U+2CEB0~U+2EBE0  CJK Unified Ideographs Extension F(CJK統合漢字拡張F)

https://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97


 とゆうわけで、正規表現で、

「^[\u4E00-\u9FEA\uF900-\uFAFF\u3400-\u4DFF\u20000-\u2EBE0]」で正規表現マッチ

で行けるかと思ったら、行かなかった。

 5桁のユニコードは、なんでもサロゲートペアなるものの対応が必要ラシイ。

https://ja.wikipedia.org/wiki/Unicode#.E3.82.B5.E3.83.AD.E3.82.B2.E3.83.BC.E3.83.88.E3.83.9A.E3.82.A2

 よくわかんないケド、このとうりに計算してエンコードすればいいのだろう。

 あと、ここによると第2面のU+20000~U+2FFFFは漢字専用領域となっているようなので、少なくともこまでは将来的に拡張される可能性があると考えられるので、

[\uD840-\uD87F][\uDC00-\uDFFF]

 こんな感じ?

 CJK統合漢字も、ATOKさまの文字パレットを見るとU+9FFFまで範囲になっているから、キリよくこまで含めとく?

 あと、繰り返しの「々」と漢数字の「〇」も含めておきたい。

U+3005  々(CJKの記号及び句読点:繰返し記号)
U+3007  〇(CJKの記号及び句読点:漢数字ゼロ)

 「〇」は、丸「○」とは別ですよ~。毛筆書体などを適用すると、違いが顕著なのでご注意です。

 でっ、こうなった。

#-----------------------------------------------
#文字列Sの1文字目が漢字か判定
●漢字か判定(Sが|Sの|Sを)
  Sを「^[\u3005\u3007\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DFF]|[\uD840-\uD87F][\uDC00-\uDFFF]」で正規表現マッチ。
  もしそれがnullならばいいえ戻る。
  違えばはい戻るここまで。
#-----------------------------------------------
#以下はテスト
「○」が漢字か判定して表示。   //0 丸
「〇」が漢字か判定して表示。   //1 漢数字のゼロ
「一」が漢字か判定して表示。   //1 CJK統合漢字
「1」が漢字か判定して表示。   //0
「豈」が漢字か判定して表示。   //1 CJK互換漢字
「㐀」が漢字か判定して表示。   //1 CJK統合漢字拡張A
「𠀀」が漢字か判定して表示。   //1 CJK統合漢字拡張B

 しかし、頑張って対応させたものの、果たして拡張部分は必要だったのか;

 見たこともないヤツばっかだ;;;

 して、扱おうとしてるテキストは青文庫のなので、文字コードはJIS X 0208 の範囲に限定されていて、それ以外のは註になってるんだよね。

 ウィキペディアさまによると、「IS X 0208のすべての漢字が、UCS/Unicodeの基本多言語面のいずれかの符号位置に対応する」・・・とゆうことらしいから、明らかにいらなかった気が(´・ω・`)

https://ja.wikipedia.org/wiki/JIS_X_0208#ISO/IEC_10646%E3%81%8A%E3%82%88%E3%81%B3Unicode

 まあ、他のことでも使うかもしないし、足りないよりかは網羅している方がいいとゆうことにしようそうしよう。



 んなこんなでやろうとしていたことは、折角なでしこさんがしゃべるようになったので、青文庫でも読み上げさせてみっかなとゆうことで、読み上げにルビを反映させることでした。

 何しろ、のまま読ますと「兎《と》に角《かく》」を「うさぎきごうときごうにかくきごうかくきごう」と読んじゃうんですからねヽ(;´Д`)ノ

 まず「《」を検索して、漢字か判定でルビの付いてる範囲を調べ、それとルビの記号「《》」を消せば(置換)ルビ部分だけが残るって寸法です。

 しかし・・・もはるかさんの読み上げ精度がひどい(「沢山」を「さわやま」と読んじゃうとか!(´д`;)上に、最近Fire7を手に入れたところ、標準でみずきさんがKindleを読み上げてくれるんで、もうなんだかな~;

 まあ、みずきさんもんなに上手に読んでくれるわけじゃないですけどねw

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190317

2019/03/13 (水)

タイマーでボールを動かしクリックで止める

| 02:43 | タイマーでボールを動かしクリックで止める - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - タイマーでボールを動かしクリックで止める - 雪乃☆雫のなでしこ日和 タイマーでボールを動かしクリックで止める - 雪乃☆雫のなでしこ日和 のブックマークコメント

 なでしこ3がバージョンアップしました☆

v3.0.57
・もし文で違えばない時のネストが不安定を修正。 #357
・『逐次実行』構文で連文を認識できない問題を修正 #373

v3.0.55
・関数定義でスタックが混乱する問題を修正(#342)
・CSV関連の関数の不具合を修正(#314)
・Node版のcopy-pasteモジュールを置き換え(#347)
・『関数』から始まる変数が定義できない問題を修正(#341)
・エラーメッセージを親切に(#350)
・引数の中で関数呼び出しがあるとうまく実行できない問題を修正(#352)
・SJIS取得がうまく動いていない問題を修正(#354)
・cnako3に『尋』命令を追加(#355)
・非同期処理の『逐次実行』構文を追加(#258)
・『』命令が動かないので修正(#371)
・RGB関数配列版『色混ぜる』関数追加(#360)

 以前ぼやいていた「CSV取得」の問題と、入れ子になった「もし文」の問題が、早速対応されました! ありがたや~。

 「逐次実行」は、データを取得したりする時に、ちゃんと取得し終わるのを待ってから次を実行するとゆうことだね。

 AJAX送信とHTTP取得は書いてあること一緒だけど何か違うのかなぁ(?_?)

 「色混ぜる」なーるほどねえ、色混ぜw

 普通に数値で指定した場合には、RGBと何が違うんだという話ですけど、色のデータを配列で持っていた場合に、「RGB(色[0],色[1],色[2])」みたいになっちゃうところ、「色の色混ぜ」みたいに書けるんですね~♪



 さてしかし、やるのはタイマー停止の実験。

 タイマーで玉を動かして、クリックで止めたり、また動かしたりします。

 3.0.41でタイマー停止の命令が追加され、ゲームが作り易くなった! と言いつつ放置していたんだよね~w

 取りあえず、マニュアルのサンプルのとうりだと、「*秒タイマー開始した時には」の後のカッコの中に、タイマーIDを入れる変数を指定して、それを「タイマー停止」することで、タイマーが止められるラシイ。

https://nadesi.com/doc3/index.php?plugin_system%252F%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC%E5%81%9C%E6%AD%A2

 キッチンタイマーとかのように、1秒毎画面の書き換えを行って、決まった秒数が経ったら停止、みたいなのはうまくいきました。

 でも、サンプルのように、タイマーの中で止める場合はいいんだけど、クリックした時で止めようとしてみたら止まらなかった。

 このタイマーIDは無名関数引数ローカル変数? ・・・なんかよく分かんないケドんなようなものらしく、イベントなどでタイマーの外から停止させる場合には、グローバル変数? に移しておかなきゃダメっぽいね。

#------------------------------------------------------------------
# タイマーで動かしクリックで止める
#------------------------------------------------------------------
画面w=480。画面h=360。玉w=20。玉h=20。
玉x=画面w/2-玉w/2。玉y=画面h/2-玉h/2。
dx=3。dy=3。玉タイマーオフ。//タイマーID=

#---HTMLの設置----------
HTML=「<div id="base"><div id="main"><div id="msk"></div>
<canvas id="ball" width=20 height=20></canvas>
</div></div>」
「#nako3_div_1」にHTMLHTML設定。

#---CSS設定----------
「#base」に{
  "margin": "auto",
  "幅": "{画面w}px"
  "高さ": "{画面h}px"
  "border": "2px solid #999999"
}をDOMスタイル一括設定。

「#main」に{
  "position": "absolute",
}をDOMスタイル一括設定。

「#msk」に{
  "position": "absolute",
  "幅": "1360px"
  "高さ": "660px"
  "z-index": "2"
}をDOMスタイル一括設定。

「#ball」に{
  "position": "absolute",
  "左": "{玉x}px",
  "top": "{玉y}px",
}をDOMスタイル一括設定。

#---玉の描画----------
「#ball」へ描画開始。
[10,10]へ9の描画。

#---マウスイベント----------
「#msk」をマウス押した時には、
  もし、玉タイマーオンならば、
//    タイマーIDのタイマー停止
    玉タイマーオフ。
  違えば、
    玉x=マウスX。玉y=マウスY。
    もし、玉x≧画面w-玉wならば、玉x=画面w-玉w-1。
    もし、玉y≧画面h-玉hならば、玉y=画面h-玉h-1。
    「#ball」の「左」に「{玉x}px」をDOMスタイル設定。
    「#ball」の「top」に「{玉y}px」をDOMスタイル設定。
    玉移動。
  ここまで。
ここまで。
#-----------------------------------------------
玉移動
●玉移動
 玉タイマーオン。
 0.01秒タイマー開始した時には(ID)
//  タイマーID=ID。
  もし、玉タイマーオフならば、IDのタイマー停止。  //※
  もし、(玉x+dx<0)または(玉x+dx+玉w>画面w)ならば、dx=dx*-1。
  もし、(玉y+dy<0)または(玉y+dy+玉h>画面h)ならば、dy=dy*-1。
  玉x=玉x+dx。玉y=玉y+dy。
  「#ball」の「左」に「{玉x}px」をDOMスタイル設定。
  「#ball」の「top」に「{玉y}px」をDOMスタイル設定。
 ここまで。
ここまで。
#------------------------------------------------------------------

http://snowdrops.starfree.jp/wnako3_test/15_timer.html

 できた~☆

 タイマー開始時の最初に、先に宣言してあるタイマーIDに、IDを代入しています。

 だけど、これだとタイマーが動いてる中0.01秒毎とかに毎代入が繰り返されることになるって話だよね。まあ、別にいいけど。・・・それとも、他に何かうまい手があるのかなあ・・・?

 イヤイヤ待て待て、ひらめいたわ。タイマーってるかどうかのフラグで、マウスのイベントを分けてんだから、のフラグをオフにしたらタイマーの中でタイマーを止めればいいだけじゃ?(バカ;)


 して、玉をいっぱい動かしたいような場合には・・・?

 やっぱり、玉いっこいっこにタイマーを用意してやらなきゃダメかな?

 よくわからん;;;

 とりあえず、動的に? 玉用のcanvasタイマー関数を作って、10個でも20個でも100個でも玉を出せるようにしてみた。

#------------------------------------------------------------------
# タイマーをいっぱいす(動的に作る)
#------------------------------------------------------------------
画面w=480。画面h=360。玉w=20。玉h=20。
玉x=配列。玉y=配列。玉色=配列。
dx=配列。dy=配列。玉タイマー配列。
最大移動速度=5。玉数=10。C=0。

#---GUIの設置----------
HTML=「<div id="gui"></div>
<div id="base"><div id="main"><div id="msk"></div>
<canvas id="bg" width={画面w} height={画面h}></canvas>
<div id="ball"></div>
</div></div>」
「#nako3_div_1」にHTMLHTML設定。
「#gui」にDOM親要素設定。
「玉数:」のラベル作成。
玉数のエディタ作成し、玉数エディタ代入。
「スタート」のボタン作成し、スタートボタン代入。

#---イベント----------
スタートボタンをクリックした時には
  玉数=玉数エディタからテキスト取得。
  玉作成。
  玉移動ここまで。

「#msk」をマウス押した時には、
  もし、(C<玉数)ならば、
    玉タイマー[C]=オフ。
  違えば、
    玉移動。C=-1。
  ここまで。
  C=C+1。
ここまで。

#---CSS設定----------
「#gui」に{
  "margin": "auto"
  "幅": "{画面w}px"
}をDOMスタイル一括設定。

「#base」に{
  "margin": "auto",
  "幅": "{画面w}px"
  "高さ": "{画面h}px"
  "border": "2px solid #999999"
}をDOMスタイル一括設定。

「#main」に{
  "position": "absolute",
}をDOMスタイル一括設定。

「#msk」に{
  "position": "absolute",
  "幅": "{画面w}px"
  "高さ": "{画面h}px"
  "z-index": "2"
}をDOMスタイル一括設定。

「#bg」に{
  "position": "absolute",
  "z-index": "0",
}をDOMスタイル一括設定。

#---canvasとマウス押下関数の設置----------
●玉作成
  HTML=「」
  タイマー関数
  (玉数)
   C=回数-1。
  
   #--各玉の設定---
   玉x[C]=画面w-玉wの乱数。玉y[C]=画面h-玉hの乱数。玉色[C]=(16777215の乱数)のHEXを6でゼロ埋め。
   玉タイマー[C]=オフ。
   dx[C]=(最大移動速度*2の乱数)-最大移動速度。dy[C]=(最大移動速度*2の乱数)-最大移動速度。
   もし、dx[C]=0ならば、dx[C]=3。もし、dy[C]=0ならば、dy[C]=3。
  
   #--玉の個数分canvas作成---
   HTMLHTMLに「<canvas id="ball{C}" width={玉w} height={玉h}></canvas>」を一行追加。
  
   #--玉の個数分関数を作る---
   タイマー関数タイマー関数に「
●玉移動{C}
 玉タイマー[{C}]=オン。
 0.01秒タイマー開始した時には(タイマー{C})
  もし、玉タイマー[{C}]=オフならばタイマー{C}のタイマー停止。
  もし、(玉x[{C}]+dx[{C}]<0)または(玉x[{C}]+dx[{C}]+玉w>画面w)ならば、dx[{C}]=dx[{C}]*-1。
  もし、(玉y[{C}]+dy[{C}]<0)または(玉y[{C}]+dy[{C}]+玉h>画面h)ならば、dy[{C}]=dy[{C}]*-1。
  玉x[{C}]=玉x[{C}]+dx[{C}]。玉y[{C}]=玉y[{C}]+dy[{C}]。
  {カッコ}#ball{C}{カッコ閉じ}の{カッコ}left{カッコ閉じ}に{カッコ}{波カッコ}玉x[{C}]{波カッコ閉じ}px{カッコ閉じ}をDOMスタイル設定。
  {カッコ}#ball{C}{カッコ閉じ}の{カッコ}top{カッコ閉じ}に{カッコ}{波カッコ}玉y[{C}]{波カッコ閉じ}px{カッコ閉じ}をDOMスタイル設定。
 ここまで。
ここまで。
」を追加。
  ここまで。
  「#ball」にHTMLHTML設定。
  タイマー関数をナデシコ。
  
  #---玉の描画とCSS設定----------
  (玉数)
   C=回数-1。
   「#ball{C}」へ描画開始。「#{玉色[C]}」に線色設定。「#{玉色[C]}」に塗色設定。[10,10]へ9の描画。
  
   「#ball{C}」に{
    "position": "absolute",
    "左": "{玉x[C]}px",
    "top": "{玉y[C]}px",
    "z-index": "1"
    }をDOMスタイル一括設定。
  ここまで。
  C=0。
ここまで。
#-----------------------------------------------
●玉移動
 A=。
 (玉数)
  A=Aに「玉移動{回数-1}。」を一行追加。
 ここまで
 Aをナデシコ。
ここまで。
#------------------------------------------------------------------

http://snowdrops.starfree.jp/wnako3_test/15_timer_2.html

 「ナデシコする」頼みです(^▽^;

 いっこいっこ個別に動かしたり止めたりしたい場合、ワタシの知恵では他に手が思いつかん;;;

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190313

2019/02/15 (金)

色を色々・・・

| 09:07 | 色を色々・・・ - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 色を色々・・・ - 雪乃☆雫のなでしこ日和 色を色々・・・ - 雪乃☆雫のなでしこ日和 のブックマークコメント

 色を色々してみようと思ったら、なんかRGB命令がエラーになっちゃう~・・・と思っていたら、どうやらv1非互換のようです。

 v1では、「R,G,B(0-255)を指定してカラーコード(なでしこ用$RRGGBB)を返す」
 v3では、「HTML用のカラーコードを返すRGB(R,G,B)で各値は0-255」

 とゆうことになってる。これは、似ているようで返り値が大違い。

 なでしこ1で「$」は16進数の記号なので、数値で返ってきていました。

色=RGB(255,255,255)
色を表示

 なでしこ1で実行すると、「16777215」。

 カラーコードが欲しい時には、HEXしてやればいいだけなんだけど、Rが0~15だった時に困っちゃうんだよね。文字列ゼロ埋めは効かないし何気にめんどーだった。(・・・と思ったら、v3では文字列ゼロ埋め出来た!)

 なでしこ3では、なんとふつーに「#ffffff」のカラーコードが返ってきます。

 特にv3では、HTMLCSSでカラーコードを使いたい場面が多いから便利~♪


 シカシ、色を色々するに当たっては、数値が欲しい場合が多いことも事実~。

 なでしこ3の16進数の記号は「0x」なので、「#」を「0x」に置換してやれば良いかと思ったら単なる文字列になってしまった(りゃそうだ;)

 でも、整数変換したらふつーにできました☆

色=「#FFFFFF」
色=色の「#」を「0x」に置換。
色=色を整数変換。
色を表示

 よきかなよきかな♪


 でっ、実際のところ色を色々するために、まずやりたいことはむしろRGBの逆で、16進のカラーコードから、RとGとBに分解するコトなんだよね。

 なにゆえの命令は無いのだろう。(R,G,B)で指定する方が世の中の主流なのか?

 ワタシは、色を指定するといえば16進コードなんだけど・・・

 ででで、こんな感じ?

#HTMLの16進カラーコード(#RRGGBB)を256色表示(R,G,B)に分解。
●(色を|色の)RGB分解
 分色とは変数。分色=配列。
 色=色の「#」を「0x」に置換。
 色=色を整数変換。
 数を2から0まで繰り返す
  分色[数]=色%256。
  色=(色-分色[数])/256
 ここまで。
 分色で戻るここまで。

 初めは、カラーコードを文字列として三分割して、それぞれ数値化しようと思ってたけど、ひらめいて256で割っていけばいい・・・とゆうことに気が付いたのでこうなりました。(行数的には、さほど変わらんw)


 こうして分解したRとGとBを使ってやろうとしていたのは、RGBからHSLに変換することでした。

 輝度とか彩度とか使うと、単色グラデーションを作るのが、簡単なんだよねー☆

 まあ、単にグラデーションを表示するだけなら、CSSだけで簡単に出来るんですが。

 はじめ、HSVとHSBとHSLのコトがよく分かってなくて、ムダにHSBの変換方法を調べまくってしまったヽ(;´Д`)ノ

 ちなみに、HSVとHSBは同じ物で、HSLは別物でした;;;

 CSSで直接指定出来るのは、HSLです。

 しかも、呼び方の違う明度B(V)と輝度Lの部分だけでなく、同じ名称の彩度Sの出し方も違うっていうね!(でも色相Hは同じ)


 ここのが一番分かりやすくて、よく分かりました!

https://www.peko-step.com/tool/hslrgb.html

 でっ、こんな感じ?

# RGB(#RRGGBB)→HSL(H,S,L)
# H=0~360。S,L=0~100。
●(色を|色の)HSL変換
  Hとは変数。Sとは変数。Lとは変数。Maxとは変数。Minとは変数。Rとは変数。Gとは変数。Bとは変数。
  色=色のRGB分解。R=色[0]。G=色[1]。B=色[2]。
  Max=色の配列最大値。Min=色の配列最小値。
  もし、(R=G)かつ(G=B)ならば、H=0。
  違えばもし、Max=Rならば、H=60*((G-B)/(Max-Min))。
  違えばもし、Max=Gならば、H=60*((B-R)/(Max-Min))+120。
  違えばもし、Max=Bならば、H=60*((R-G)/(Max-Min))+240。
  もし、H<0ならば、H=H+360。
  H=Hを四捨五入。
  L=(Max+Min)/2。
  もし、L<128ならば、S=(Max-Min)/(Max+Min)
  違えばもし、(Max=255)かつ(Min=255)ならば、S=0。
  違えば、S=(Max-Min)/(510-Max-Min)
  S=S*100を1で小数点四捨五入。
  L=L/255*100を1で小数点四捨五入。
  [H,S,L]で戻るここまで。

 ・・・と思ったら、なでしこ3には配列最大値も、配列最小値も、小数点四捨五入も無いじゃーん( ;∀;)


 こんな感じか・・・?

●(Aの)配列最大値
 数とは変数。最大値とは変数。Cとは変数=0。
  Aを反復
    数=対象整数変換。
    もし、C=0ならば、
     最大値=数。
    違えば、
     もし、数>最大値ならば、最大値=数。
    ここまで。
    C=C+1。
  ここまで。
  最大値で戻るここまで。

●(Aの)配列最小値
 数とは変数。最小値とは変数。Cとは変数=0。
  Aを反復
    数=対象整数変換。
    もし、C=0ならば、
     最小値=数。
    違えば、
     もし、数<最小値ならば、最小値=数。
    ここまで。
    C=C+1。
  ここまで。
  最小値で戻るここまで。

●(数をAで)小数点四捨五入
  数=数*(10^A)
  数=数を四捨五入。
  数=数/(10^A)
  数で戻る
ここまで。

 なでしこ1は、こういう便利機能が色々あるのが良かったですけれどもねー。

 そういえば、いつかのマイナビの連載で、小数点で四捨五入する方法が説明されてたような(?)

 教育用に主眼を置いた場合、こうゆうちょっと考えたら出来る的なコトは、自分で考えられるようになった方が良いとゆうことなのか、それとも単にまだ、こういった細かい部分にまでは手が及ばぬとゆうことなのか。

 でも、最初の頃は完全に便利機能頼みだったし、それを何から何まで自分で考えなきゃならんとすると、どうしてよいか分からずやる気無くしてただろうから、特に表をどうこうする的な命令なんかは、1と同じに使えるようになるといいなあ。


 それはさておき、一応逆もできるようにして・・・

# HSL(H,S,L)→RGB(R,G,B)
●HSL2RGB(H,S,L)
  Maxとは変数。Minとは変数。Rとは変数。Gとは変数。Bとは変数。
  もし、L<50ならば、
    Max=2.55*(L+L*(S/100))。Min=2.55*(L-L*(S/100))
  違えば、
    Max=2.55*(L+(100-L)*(S/100))。Min=2.55*(L-(100-L)*(S/100))
  ここまで。
  もし、(0≦H)かつ(H<60)ならば、
   R=Max。G=(H/60)*(Max-Min)+Min。B=Min。
  違えばもし、(60≦H)かつ(H<120)ならば、
   R=((120-H)/60)*(Max-Min)+Min。G=Max。B=Min。
  違えばもし、(120≦H)かつ(H<180)ならば、
   R=Min。G=Max。B=((H-120)/60)*(Max-Min)+Min。
  違えばもし、(180≦H)かつ(H<240)ならば、
   R=Min。G=((240-H)/60)*(Max-Min)+Min。B=Max。
  違えばもし、(240≦H)かつ(H<300)ならば、
   R=((H-240)/60)*(Max-Min)+Min。G=Min。B=Max。
  違えばもし、(300≦H)かつ(H<360)ならば、
   R=Max。G=Min。B=((360-H)/60)*(Max-Min)+Min。
  ここまで。
  R=Rを四捨五入。G=Gを四捨五入。B=Bを四捨五入。
  [R,G,B]で戻るここまで。

 でもこれは、相互変換を繰り返すと完全に元には戻らないそうです。

 出来る色の数が異なる上に、四捨五入とかしてるんだから、ある種当然ですがw


 ででで、わりとありがちな、色を作ったり相互変換したり出来るヤツ。

http://snowdrops.starfree.jp/nako3/RGB_HSL.html

 別にこれを作ろうとしてたわけでは無く、単に特定の色を輝度グラデーションした中色が取りたかっただけなんだけどさー。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190215

2019/01/21 (月)

CSV取得!

| 19:14 | CSV取得! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - CSV取得! - 雪乃☆雫のなでしこ日和 CSV取得! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 マイナビ連載41目は、閏年の計算でした。

 コレは、前にバイオリズムを作った時にやったね☆

 https://news.mynavi.jp/article/nadeshiko-41/

 あー・・・ワタシは常に、こんなカンジですよ~。いきなりプログラムに出来る能力が無いでね(´・ω・`)


 してして、ふと気が付いたら、なでしこ3がバージョンアップしてましたよ~☆

v3.0.53
・『関数』から始まる変数が定義できない問題を修正 #341
・『DOMイベント処理停止』(preventDefault)を追加。(#326)
・範囲コメントの中に改行あるとソースコードが正しく実行できない問題(#345)
・DOMイベント「~時」に、「の」の助詞を追加 (#340)
・関数JS関数実行』を追加 (#327)
・『ブラウザ移動』と『ブラウザ戻る』を追加。(#313)
・CSV取得, TSV取得, 表CSV変換, 表TSV変換追加

 おぉ、CSV取得ですよ!(喜)

 これで、自前の関数をいちいちくっつけなくても良くなるね♪

 ・・・と思ったらエラーになりました。

 どうも、v1非互換のようです。  ※2019/3/13追記 v3.0.55で修正されました!

 わたしの使用上で一番問題が発生するのは、最後の列がの行があった場合に、「,」が入っていると、次の行とくっついちゃうんですね。

データ=「いろは,にほへ,と
ちりぬ,るを,
わかよ,たれ,つねならむ」
データを言う

データ=データをCSV取得。
データを表CSV変換して言う

データが元に戻らずに、

いろは,にほへ,と
ちりぬ,るを,わかよ,たれ,つねならむ

 となっちゃう。

データ=「いろは,にほへ,と
ちりぬ,るを
わかよ,たれ,つねならむ」
データを言う

データ=データをCSV取得。
データを表CSV変換して言う

 「を」の後の「,」が無ければ元に戻るので、こういう仕様である、列数の多いデータの場合に改行を挟んでも1行と出来るようになってるのであるいうことなのかも知れない

 しかし、エクセルで作って、CSV形式で保存すると、このようなデータの場合、もれなく末尾に「,」が入って出力されてきちゃうので困ったもんだというところ(´・ω・`)


 とりあえず、CSV取得する前に、「,{改行}」を改行置換してやれば良いかなと思ったら、これまたうまくいかなかった。

 いや、簡易エディタ上では、うまくいきました。改行は、LFみたい。

 「GET送信した時」とかで、ファイルから取得する場合は、改行CRLF、CRLFのどれなのかを確認して置換してやらないとダメらしい。「,{CHR(13)}{CHR(10)}」を改行置換で出来ました。

 あるいは、ファイルの改行コードをLFとして保存するべきなのか。


の列が続く行では、「,」が複数個くっついてくるから、「,*{改行}」を改行正規表現置換、の方が良さそう

クジラ飛行机クジラ飛行机2019/01/26 20:40CSV取得の問題、修正しました!
https://github.com/kujirahand/nadesiko3/issues/353

ご報告に感謝です(^v^)y

雪乃☆雫雪乃☆雫2019/01/27 16:28なななんかスミマセン><
ご対応ありがとうございます!!!(≧▽≦)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190121

2019/01/17 (木)

九星の取得のナゾ

| 14:16 | 九星の取得のナゾ - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 九星の取得のナゾ - 雪乃☆雫のなでしこ日和 九星の取得のナゾ - 雪乃☆雫のなでしこ日和 のブックマークコメント

 マイナビ連載40目は、迷路ゲームでした。

https://news.mynavi.jp/article/nadeshiko-40/

 ゲームですよ! やった~☆

 コレを発展させると、ド○クエが作れますよ♪

 して、タイムリーに正月中、Ⅲ、Ⅰ、Ⅱとやって、はⅤをやってるワタシです(爆)

 やっぱゲームは、こうゆうのでいいんだよね~。

 3Dでリアルタイムに戦うとかムリヽ(;´Д`)ノ



 しかしは、ゲームとはマッタク関係なく、年前にやってたカレンダーに、度は九星を表示したいとゆう話し。

 歴註に二黒とか九紫とか書いているアレですね。

 例によってウィキペディアさまに教えてもらうと、年の九星は簡単でした。

年家九星=11-西暦年%9
もし、年家九星≧10ならば、
  年家九星=年家九星-1

 コレで算出出来るようです。

 しかし、日は……?

 どうも、なかなかフクザツです。

https://ja.wikipedia.org/wiki/%E4%B9%9D%E6%98%9F#%E6%97%A5%E3%81%AE%E4%B9%9D%E6%98%9F

 ゆってることがよく分からん(´д`;

 しかも、この教えのとうりにやってみたところ、どうもカレンダーと合いません。まあ、所詮占いなので、流派によって若干異なるラシイんですが。

http://d.hatena.ne.jp/nobml/20121231

 ここのがとても分かりやすくてうまくいきました☆

 この記事はの後改訂されているのですが、改訂後の計算方法というのがウィキペディアさまのに書いてあるのと同様で、ウチのカレンダーとは合わないんです。(今年言うタブン11/23の切替日から合わなくなる)

 我が家のカレンダーが時代遅れなのか……?Σ(゜д゜;

 別なカレンダーも見てみたい……

#-----------------------------------------------------------------------
#  九星取得
# https://ja.wikipedia.org/wiki/%E4%B9%9D%E6%98%9F
# http://d.hatena.ne.jp/nobml/20121231
#-----------------------------------------------------------------------
●(日付を|日付の|日付で)日家九星取得
  九星=「一白水星,二黒土星,三碧木星,四緑木星,五黄土星,六白金星,七赤金星,八白土星,九紫火星」を「,」で区切る。
  データ=配列。 #修正ユリウス日,干支,切替日,開始九星
  日付U=日付の修正ユリウス日取得。
  日付を「/」で区切る。
  西暦年=それ[0]

  6
    C=回数-1。年=西暦年+(INT(C/2)-1)。
    データ[C]=配列。
    もし、C%2=0ならば、
      二至=「夏至」。データ[C][3]=8。
    違えば、
      二至=「冬至」。データ[C][3]=0。
    ここまで。
   # 日家九星を求めたい日を含む年、およびの前年・翌年の夏至と冬至の修正ユリウス日と干支(No)を求める。
    データ[C][0]=年の二至を二十四節気日付取得して、それ修正ユリウス日取得。
    データ[C][1]=(それ+50)%60。
   # 陽遁・陰遁の切替日の日付を求める。
    もし、データ[C][1]≦28ならば、
      データ[C][2]=データ[C][0]-データ[C][1]。
    違えばもし、データ[C][1]≧32ならば、
      データ[C][2]=データ[C][0]+(60-データ[C][1])。
    違えば、
      データ[C][2]=データ[C][0]+(30-データ[C][1])。
      もし、二至=「夏至」ならば、データ[C][3]=2。
      違えば、データ[C][3]=6。
      # 閏が連続した場合の調整
      もし、C>0ならば、
       もし、データ[C][2]-データ[C-1][2]=210でなければ、
        データ[C-1][2]=データ[C-1][2]-30。
        もし、二至=「夏至」ならば、データ[C-1][3]=0。
        違えば、データ[C-1][3]=8。
       ここまで。
      ここまで。
    ここまで。
  ここまで。
  # 見逃された閏の調整。
  4
    C=回数。
    もし、データ[C][2]-データ[C-1][2]=240ならば、
      データ[C][2]=データ[C][2]-30。
      もし、C%2=1ならば、データ[C][3]=6。
      違えば、データ[C][3]=2。
    ここまで。
  ここまで。

  # 求める日付の切替日。
  もし、日付U≧データ[3][2]ならば、
    切替日=データ[3][2]。開始九星=データ[3][3]。陰陽=1。
  違えばもし、日付U<データ[2][2]ならば、
    切替日=データ[1][2]。開始九星=データ[1][3]。陰陽=1。
  違えば、
    切替日=データ[2][2]。開始九星=データ[2][3]。陰陽=0。
  ここまで。

  # 求める。
  もし、陰陽=1ならば、
    九星[(日付U-切替日+開始九星)%9]で戻る。
  違えば、
    もし、開始九星-(日付U-切替日)%9<0ならば、九星[開始九星-(日付U-切替日)%9+9]で戻る
    違えば、九星[開始九星-(日付U-切替日)%9]で戻る。
  ここまで。
ここまで。
#-----------------------------------------------------------------------
●(日付を|日付の|日付で)日家九星取得_改
  九星=「一白水星,二黒土星,三碧木星,四緑木星,五黄土星,六白金星,七赤金星,八白土星,九紫火星」を「,」で区切る。
  データ=配列。 #修正ユリウス日,干支,切替日,開始九星
  日付U=日付の修正ユリウス日取得。
  日付を「/」で区切る。
  西暦年=それ[0]

  6
    C=回数-1。年=西暦年+(INT(C/2)-1)。
    もし、C%2=0ならば、二至=「夏至」
    違えば、二至=「冬至」
    データ[C]=配列。
   # 日家九星を求めたい日を含む年、およびの前年・翌年の夏至と冬至の修正ユリウス日と干支(No)を求める。
    データ[C][0]=年の二至を二十四節気日付取得して、それ修正ユリウス日取得。
    データ[C][1]=(それ+50)%60。
   # 陽遁・陰遁の切替日の日付を求める。
    もし、データ[C][1]≦28ならば、データ[C][2]=データ[C][0]-データ[C][1]。
    違えば、データ[C][2]=データ[C][0]+(60-データ[C][1])。
  ここまで。
  # 閏を置くかどうかを判断する。
  4
    C=回数。
    もし、データ[C][2]-データ[C-1][2]=240ならば、
      データ[C][2]=データ[C][2]-30。
      もし、C%2=1ならば、データ[C][3]=6。
      違えば、データ[C][3]=2。
    違えば、
      もし、C%2=1ならば、データ[C][3]=0。
      違えば、データ[C][3]=8。
    ここまで。
  ここまで。

  # 求める日付の切替日。
  もし、日付U≧データ[3][2]ならば、
    切替日=データ[3][2]。開始九星=データ[3][3]。陰陽=1。
  違えばもし、日付U<データ[2][2]ならば、
    切替日=データ[1][2]。開始九星=データ[1][3]。陰陽=1。
  違えば、
    切替日=データ[2][2]。開始九星=データ[2][3]。陰陽=0。
  ここまで。

  # 求める。
  もし、陰陽=1ならば、
    九星[(日付U-切替日+開始九星)%9]で戻る。
  違えば、
    もし、開始九星-(日付U-切替日)%9<0ならば、九星[開始九星-(日付U-切替日)%9+9]で戻る
    違えば、九星[開始九星-(日付U-切替日)%9]で戻る。
  ここまで。
ここまで。
#-----------------------------------------------------------------------
●(日付を|日付の|日付で)年家九星取得
  九星=「一白水星,二黒土星,三碧木星,四緑木星,五黄土星,六白金星,七赤金星,八白土星,九紫火星」を「,」で区切る。
  日付を「/」で区切る
  西暦年=それ[0]
  立春=西暦年の「立春」を二十四節気日付取得。
  もし、(日付をUNIXTIME変換)<(立春をUNIXTIME変換)ならば、西暦年=西暦年-1。
  数=11-西暦年%9-1。
  もし、数≧9ならば、数=数-9。
  九星[数]で戻る
ここまで。
#-----------------------------------------------------------------------
#和時計の時は月/日のみ返したが、年/月/日を返すよう変更している。
●(年のSを|Sで)二十四節気日付取得
  節気=["小寒","大寒","立春","雨水","啓蟄","春分","清明","穀雨","立夏","小満","芒種","夏至","小暑","大暑","立秋","処暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
  データ=[{"D":6.3811,"A":0.242778},{"D":21.1046,"A":0.242765},{"D":4.8693,"A":0.242713},{"D":19.7062,"A":0.242627},{"D":6.3968,"A":0.242512},{"D":21.4471,"A":0.242377},{"D":5.6280,"A":0.242231},{"D":20.9375,"A":0.242083},{"D":6.3771,"A":0.241945},{"D":21.9300,"A":0.241825},{"D":6.5733,"A":0.241731},{"D":22.2747,"A":0.241669},{"D":8.0091,"A":0.241642},{"D":23.7317,"A":0.241654},{"D":8.4102,"A":0.241703},{"D":24.0125,"A":0.241786},{"D":8.5186,"A":0.241898},{"D":23.8896,"A":0.242032},{"D":9.1414,"A":0.242179},{"D":24.2487,"A":0.242328},{"D":8.2396,"A":0.242469},{"D":23.1189,"A":0.242592},{"D":7.9152,"A":0.242689},{"D":22.6587,"A":0.242752}]。
  年を「/」で区切る。
  年=それ[0]
  数=節気からSを配列検索。
  もし、数<4ならばY=年-1。
  違えばY=年。
  月=((数/2)を切捨)+1。
  日=データ[数]["D"]とデータ[数]["A"]でYの節気計算。
  「{年}/{月}/{日}」で戻るここまで。

●(DとAでYの)節気計算
  INT(D+(A*(Y-1900))-INT((Y-1900)/4))
ここまで。
#-----------------------------------------------------------------------
●(日付を|日付の|日付で)修正ユリウス日取得
  日付を「/」で区切る
  y=それ[0]。m=それ[1]。d=それ[2]。
  もし、(m=1)または(m=2)ならば、
    y=y-1。m=m+12。
  ここまで。
  (INT(365.25*y))+INT(y/400)-INT(y/100)+INT(30.59*(m-2))+d-678912で戻るここまで。
#-----------------------------------------------------------------------

#以下はテスト
日付=「2019/12/31」
日付の年家九星取得して表示。
日付の日家九星取得して表示。
日付の日家九星取得_改して表示

https://nadesi.com/doc3/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%933%E7%B0%A1%E6%98%93%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF

 簡易エディタでお試し出来ます。

 (改のついてるほうが参考にしたサイトの改訂版の計算方法という意味で、付いてない方が、うちにあるカレンダーと合う方です。)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190117

2018/12/11 (火)

「修正ユリウス日取得」と「年ノ干支取得」と「日ノ干支取得」

| 04:27 | 「修正ユリウス日取得」と「年ノ干支取得」と「日ノ干支取得」 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 「修正ユリウス日取得」と「年ノ干支取得」と「日ノ干支取得」 - 雪乃☆雫のなでしこ日和 「修正ユリウス日取得」と「年ノ干支取得」と「日ノ干支取得」 - 雪乃☆雫のなでしこ日和 のブックマークコメント

 マイナビ連載39目は、「2019年を有意義にする年計画表作成アプリを作ろう」でした。

 https://news.mynavi.jp/article/nadeshiko-39/

 年計画どころか、冬休みの計画でさえ、実行出来たことは無かったですけどね~w

 してや、一年が始まったかと思っていたら、なんかもう年賀状書かなきゃなんですけど?! みたいなヽ(;´Д`)ノ

 と、いうわけで計画なんか立てないけど、折角カレンダーなので、ワタシは十干十二支と二十四節気を追加してみたいと思う。


 「二十四節気取得」は、以前関数を作りました。

 https://nadesiko.g.hatena.ne.jp/snowdrops89/20180427/1524800687


 十干十二支は、なでしこ1には「年ノ干支取得」と「日ノ干支取得」とゆう命令があったんだけど、なでしこ3にはまだ無いんだよね。

 年のはまあ、簡単なんですよ。西暦を十干の10と、十二支の12でそれぞれ割った余りから算出できます。

 しかし、日は……?

 まあ、60日おきにぐるぐるってるだけだから、なんかかんか出来ると思うんだけど、ウィキペディアさまによるとどうやら、ユリウス通日とやらから算出するラシイ。

 https://ja.wikipedia.org/wiki/%E5%B9%B2%E6%94%AF#%E6%97%A5%E3%81%AE%E5%B9%B2%E6%94%AF

 な、なんて???(@_@)


 なでしこ1では、「修正ユリウス日取得」とゆう命令もあったのですが、これもなでしこ3にはまだありません。

 がっ、ウィキペディアさまはなんでも教えてくれます。

 https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA%E6%9A%A6%E3%81%8B%E3%82%89%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%E3%81%B8%E3%81%AE%E6%8F%9B%E7%AE%97

 ぐっ、具合悪っ(´д`;


 ・・・とゆうわけで作ってみた、「修正ユリウス日取得」と「年ノ干支取得」と「日ノ干支取得

●(日付を|日付の|日付で)修正ユリウス日取得
  日付を「/」で区切る
  y=それ[0]。m=それ[1]。d=それ[2]。
  もし、(m=1)または(m=2)ならば、
    y=y-1。m=m+12。
  ここまで。
  (INT(365.25*y))+INT(y/400)-INT(y/100)+INT(30.59*(m-2))+d-678912で戻るここまで。

●(日付を|日付の|日付で)日ノ干支取得
  十干=「甲乙丙丁戊己庚辛壬癸」を文字列分解。
  十二支=「寅卯辰巳午未申酉戌亥子丑」を文字列分解。
  日付の修正ユリウス日取得。
  十干No=それ%10。
  十二支No=それ%12。
  もし、十干No<0ならば、十干No=十干No+10。
  もし、十二支No<0ならば、十二支No=十二支No+12。
  「{十干[十干No]}{十二支[十二支No]}」で戻る
ここまで。

●(日付を|日付の|日付で)年ノ干支取得
  十干=「庚辛壬癸甲乙丙丁戊己」を文字列分解。
  十二支=「申酉戌亥子丑寅卯辰巳午未」を文字列分解。
  日付を「/」で区切る
  西暦年=それ[0]
  十干No=西暦年%10。
  十二支No=西暦年%12。
  「{十干[十干No]}{十二支[十二支No]}」で戻る
ここまで。

 まあ、式は丸写しだから、コード自体は難しくない

 タブンあってると思うんだけど・・・

 なでしこ1同様、紀元前には未対応です。(タブ修正ユリウス日取得の公式自体が紀元前には対応してないみたい?)

 あと、本来は、1873/1/1(新暦導入)以前の年ノ干支は、正確ではありません。旧暦の正月から大晦日になるので、年末年始がちょっと違ってしまうんだよね。まあ、なでしこ1もそうなってるので、互換とゆうことでw

 旧暦変換なんて、ワタシの知恵ではもう完全にムリです><


 ででで、折角だからカレンダーにする。

# 365日分のカレンダーに十干十二支と二十四節気を表示
対象日=「2019/01/01」
対象秒=対象日をUNIXTIME変換。
365
 F曜日対象日の曜日。
 F日付=対象日を「/」で区切る。
 十干十二支=対象日の日ノ干支取得。
 二十四節気=対象日の二十四節気取得。
 「{F日付[1]}月{F日付[2]}日({F曜日}){タブ}{十干十二支}{タブ}{二十四節気}」を表示。
 対象秒=対象秒+(60 * 60 * 24)
 対象日=対象秒を日時変換して「 」まで切り取るここまで。

●(日付を|日付の|日付で)修正ユリウス日取得
  日付を「/」で区切る
  y=それ[0]。m=それ[1]。d=それ[2]。
  もし、(m=1)または(m=2)ならば、
    y=y-1。m=m+12。
  ここまで。
  (INT(365.25*y))+INT(y/400)-INT(y/100)+INT(30.59*(m-2))+d-678912で戻るここまで。

●(日付を|日付の|日付で)日ノ干支取得
  十干=「甲乙丙丁戊己庚辛壬癸」を文字列分解。
  十二支=「寅卯辰巳午未申酉戌亥子丑」を文字列分解。
  日付の修正ユリウス日取得。
  十干No=それ%10。
  十二支No=それ%12。
  もし、十干No<0ならば、十干No=十干No+10。
  もし、十二支No<0ならば、十二支No=十二支No+12。
  「{十干[十干No]}{十二支[十二支No]}」で戻る
ここまで。

●(日付を|日付の|日付で)二十四節気取得
  節気=["小寒","大寒","立春","雨水","啓蟄","春分","清明","穀雨","立夏","小満","芒種","夏至","小暑","大暑","立秋","処暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
  データ=[{"D":6.3811,"A":0.242778},{"D":21.1046,"A":0.242765},{"D":4.8693,"A":0.242713},{"D":19.7062,"A":0.242627},{"D":6.3968,"A":0.242512},{"D":21.4471,"A":0.242377},{"D":5.6280,"A":0.242231},{"D":20.9375,"A":0.242083},{"D":6.3771,"A":0.241945},{"D":21.9300,"A":0.241825},{"D":6.5733,"A":0.241731},{"D":22.2747,"A":0.241669},{"D":8.0091,"A":0.241642},{"D":23.7317,"A":0.241654},{"D":8.4102,"A":0.241703},{"D":24.0125,"A":0.241786},{"D":8.5186,"A":0.241898},{"D":23.8896,"A":0.242032},{"D":9.1414,"A":0.242179},{"D":24.2487,"A":0.242328},{"D":8.2396,"A":0.242469},{"D":23.1189,"A":0.242592},{"D":7.9152,"A":0.242689},{"D":22.6587,"A":0.242752}]

  日付を「/」で区切る。
  年=それ[0]
  月=それ[1]
  日=それ[2]を整数変換。
  日付=「{年}/{月}/{日}」
  もし、月<3ならば、Y=年-1。
  違えばY=年。
  もし、日>15ならば、数=月*2-1。
  違えば、数=月*2-2
  日=データ[数]["D"]とデータ[数]["A"]でYの節気計算。
  もし、「{年}/{月}/{日}」=日付ならば、節気[数]で戻る。
  違えば戻るここまで。

●(DとAでYの)節気計算
  INT(D+(A*(Y-1900))-INT((Y-1900)/4))
ここまで。

 もらったばかりのカレンダーを見た感じ、合ってると思う~☆

 小寒までしか見てないけどさ;

 簡易エディタでお試し出来ます。

 https://nadesi.com/doc3/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%933%E7%B0%A1%E6%98%93%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20181211

2018/11/06 (火)

キー同時押しで斜めに動かしたい! &もし~違えばのナゾ?

| 00:27 | キー同時押しで斜めに動かしたい! &もし~違えばのナゾ? - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - キー同時押しで斜めに動かしたい! &もし~違えばのナゾ? - 雪乃☆雫のなでしこ日和 キー同時押しで斜めに動かしたい! &もし~違えばのナゾ? - 雪乃☆雫のなでしこ日和 のブックマークコメント

 キーボードで動かすのは、やっぱり斜めも動きたいよねぇ~。

 「↑」と「→」同時押しで右上みたいなのは、なでしこ1には「キー状態」とゆう命令があって簡単だったけど、なでしこ3には無いっぽいんだけれど、「キー押した時」と「キー離した時」のイベントでフラグを立てれば、同じように出来そうだね。


 ・・・と思って色々やっていたんだけども、どうも「もし違えば」が、うまく働かなかったりする。

※2019/3/13追記  v3.0.57で修正されました!

 前から、んなよーな気がしたりしなかったりしてたんだけども、単になでしこ1では不要だった「ここまで」を忘れてる事件;なども多かったので、なんか自分が違ってるんだろうと思ったり思わなかったりで、だましだましやっていたんですけれどね。

 それにしても・・・

右キー=オフ。右位置=OK。
もし、(右キー=オン)ならば、
  もし、(右位置=OK)ならば、
   「右」と表示。
  ここまで。
違えば、
  「左」と表示
ここまで。

 コレが、動作しないって、どーいうことなんです?

 前からこんな感じだっただろうか・・・

 ちなみに、なでしこ1では、意図したとうり「左」になります。

 なんかね、「もし違えば」の「もし」の中に、さらに「もし」の文が入ってると、「もし」の部分はいいけど「違えば」の部分が働かなくなっちゃうっぽい?

右キー=オフ。右位置=OK。
もし、(右キー=オン)ならば、
//  もし、(右位置=OK)ならば、
   「右」と表示。
//  ここまで。
違えば、
  「左」と表示
ここまで。

 単純にこれだけだったら、ちゃんと「左」になるワケですよ。むむむ(@_@)

 してどうやら、「もし」の中の「もし文」に「違えば」が付いていれば、行けるっぽい?

右キー=オフ。右位置=OK。
もし、(右キー=オン)ならば、
  もし、(右位置=OK)ならば、
   「右」と表示。
  違えば、
   「NG」と表示。
  ここまで。
違えば、
  「左」と表示
ここまで。

 ええっΣ(゜д゜;


 いやいや、とりあえず斜めに動かす自体は、「違えば」使う必要なんて無くできたけどもさw

<script type="なでしこ">
#-----------------------------------------------------------------------
# キー同時押しで斜めに動かす
#-----------------------------------------------------------------------
画面w=640。画面h=480。
玉w=20。玉h=20。
玉x=画面w/2-玉w/2。玉y=画面h/2-玉h/2。

「#ball」へ描画開始。
[10,10]へ9の描画。

「#ball」の「左」に「{玉x}px」をDOMスタイル設定。
「#ball」の「top」に「{玉y}px」をDOMスタイル設定。

右キーはオフ。左キーはオフ。上キーはオフ。下キーはオフ。
DOCUMENTをキー押した時には、
 もし、押されたキー=「ArrowRight」ならば、右キー=オン。
 もし、押されたキー=「ArrowLeft」ならば、左キー=オン。
 もし、押されたキー=「ArrowDown」ならば、下キー=オン。
 もし、押されたキー=「ArrowUp」ならば、上キー=オンここまで。
DOCUMENTをキー離した時には、
 もし、押されたキー=「ArrowRight」ならば、右キー=オフ。
 もし、押されたキー=「ArrowLeft」ならば、左キー=オフ。
 もし、押されたキー=「ArrowDown」ならば、下キー=オフ。
 もし、押されたキー=「ArrowUp」ならば、上キー=オフここまで。

「キャラ移動」を0.01秒毎

●キャラ移動
 もし、(右キー=オン)かつ(玉x<画面w-玉w*2)ならば、玉x=玉x+3。
 もし、(下キー=オン)かつ(玉y<画面h-玉h*2)ならば、玉y=玉y+3。
 もし、(上キー=オン)かつ(玉y≧玉h)ならば、玉y=玉y-3。
 もし、(左キー=オン)かつ(玉x≧玉w)ならば、玉x=玉x-3。

 「#ball」の「left」に「{玉x}px」をDOMスタイル設定。
 「#ball」の「top」に「{玉y}px」をDOMスタイル設定。
ここまで。

#-----------------------------------------------------------------------
</script>

<H1>キー同時押しで斜めに動かす</H1>
<HR>
<style type="text/css">
#base {
  margin:auto;
  width:640px;
  height:480px;
  border:2px solid #999999;
}
#main {
  position:absolute;
}
#ball {
  position:absolute;
}
</style>

<div id="base">
  <div id="main">
    <canvas id="ball" width=20 height=20></canvas>
  </div>
</div>

http://snowdrops.starfree.jp/wnako3_test/15_Keyboard_2.html

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20181106

2018/11/01 (木)

「キー押した時」と「マウス移動した時」でキャラを動かす

| 12:50 | 「キー押した時」と「マウス移動した時」でキャラを動かす - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 「キー押した時」と「マウス移動した時」でキャラを動かす - 雪乃☆雫のなでしこ日和 「キー押した時」と「マウス移動した時」でキャラを動かす - 雪乃☆雫のなでしこ日和 のブックマークコメント

 なでしこ3のお試しプログラム置き場を、ジオシティーズからスターサーバーフリーにお引っ越ししました。http://snowdrops.starfree.jp/index.html

 広告無しで、1G使えるというのはイイよね。

 のところは転送サービスがあるので、記事中のURLは直してない


 さて、これでゲームが作れそう! と狂喜乱舞しておきながら放置していたけれど、とりあえず「キー押した時」や「マウス移動した時」でキャラを動かすのをやってみた。

<script type="なでしこ">
#-----------------------------------------------------------------------
# キー押した時でキャラを動かす
#-----------------------------------------------------------------------
画面w=640。画面h=480。
玉w=20。玉h=20。
玉x=画面w/2-玉w/2。玉y=画面h/2-玉h/2。

「#ball」へ描画開始。
[10,10]へ9の描画。

「#ball」の「左」に「{玉x}px」をDOMスタイル設定。
「#ball」の「top」に「{玉y}px」をDOMスタイル設定。

DOCUMENTをキー押した時には、
 もし、(押されたキー=「ArrowRight」)かつ(玉x<画面w-玉w*2)ならば、玉x=玉x+玉w。
 もし、(押されたキー=「ArrowLeft」)かつ(玉x≧玉w)ならば、玉x=玉x-玉w。
 もし、(押されたキー=「ArrowDown」)かつ(玉y<画面h-玉h*2)ならば、玉y=玉y+玉h。
 もし、(押されたキー=「ArrowUp」)かつ(玉y≧玉h)ならば、玉y=玉y-玉h。
 「#ball」の「左」に「{玉x}px」をDOMスタイル設定。
 「#ball」の「top」に「{玉y}px」をDOMスタイル設定。
ここまで。
#-----------------------------------------------------------------------
</script>

<H1>なでしこ3てすと~キー押した時でキャラを動かす</H1>
<HR>
<style type="text/css">
#base {
  margin:auto;
  width:640px;
  height:480px;
  border:2px solid #999999;
}
#main {
  position:absolute;
}
#ball {
  position:absolute;
}
</style>

<div id="base">
  <div id="main">
    <canvas id="ball" width=20 height=20></canvas>
  </div>
</div>

http://snowdrops.starfree.jp/wnako3_test/15_Keyboard.html


<script type="なでしこ">
#-----------------------------------------------------------------------
# マウスの移動でキャラを動かす
#-----------------------------------------------------------------------
画面w=640。画面h=480。
玉w=20。玉h=20。
玉x=画面w/2-玉w/2。玉y=画面h/2-玉h/2。

「#ball」へ描画開始。
[10,10]へ9の描画。

「#ball」の「左」に「{玉x}px」をDOMスタイル設定。
「#ball」の「top」に「{玉y}px」をDOMスタイル設定。

「#msk」をマウス移動した時には
  もし、(マウスX<画面w-玉w)かつ(マウスY<画面h-玉h)ならば、
    玉x=マウスX。玉y=マウスY。
    「#ball」の「左」に「{玉x}px」をDOMスタイル設定。
    「#ball」の「top」に「{玉y}px」をDOMスタイル設定。
  ここまで。
ここまで。
#-----------------------------------------------------------------------
</script>

<H1>なでしこ3てすと~マウスの移動でキャラを動かす</H1>
<HR>
<style type="text/css">
#base {
  margin:auto;
  width:640px;
  height:480px;
  border:2px solid #999999;
}
#main {
  position:absolute;
}
#ball {
  position:absolute;
}
#msk {
  position:absolute;
  z-index:2;
}
</style>

<div id="base">
  <div id="main">
    <canvas id="msk" width=640 height=480></canvas>
    <canvas id="ball" width=20 height=20></canvas>
  </div>
</div>

http://snowdrops.starfree.jp/wnako3_test/15_Mouse.html


 まあ、こんだけなんですが;

 マウス移動の方の「#msk」は何かとゆうと、背景の方で「マウス移動した時」を取得しようとすると、の上に乗っているキャラなどのキャンバスの上にマウスが入ると、マウスの移動を検出しなくなっちゃうから、「z-index」で一番上に透明のキャンバスを置いて、こでマウスを検出している。

 なんか他に、うまい方法があるかなあ・・・?

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20181101