HSP

マップオンデマンドの地図更新でパスワードが入力できない

投稿日: 更新日:


車を購入時にカーナビとしてNSZT-W61Gを付けたのですが、
カーナビ購入してから3年間はマップ情報のバージョンアップが無料ということで、
バージョンアップをしようとしました。

バージョンアップ方法の流れ
1. 購入時についていた「マップオンデマンドセットアップディスク」のDVDでセットアップツールをインストール
2. GAZOO」を無料でユーザー登録(「TOYOTA Web Passport」と同一?)
追記「MOD専用G-BOOK ID」では数値のパスワード作れるらしく、本問題自体を解決できるようです!
下記の話はログイン、出来なかったときに書いたものなので無視していいと思います。
3. マップオンデマンドのサイトからログイン
4. 購入時についていた取説の一番後ろのページにある「G-BOOK用車載端末ID」を入力
5. マップをダウンロード
6. あとは、取説通りに進める

といった感じなのですが、重大な問題が発生します。
それは、「マップオンデマンドセットアップディスク」でインストールした
専用アプリケーションに問題がある点です。(恐らく新しいセットアップディスクだと問題は起きません)

マップオンデマンドのツールでは、
G-BOOKか、GAZOO のどちらかのユーザー情報をGUIで入力する必要があるのですが、
このパスワード入力欄が、数値しか受け付けてくれません。

マップオンデマンド」のサイトにはたしかに、

2013年06月11日
【販売店装着オプションでSDナビをご利用のお客様へ】TOYOTA Web PassportのID、パスワード(PW)をご利用の場合、パスワードを「数字のみ」で設定登録してください。SD地図更新アプリを利用する際、PW入力時にエラーメッセージが表示される場合があります(ログイン画面のPW欄が英数対応していないため)。PWを「英数」で設定登録された方は、「数字のみ」に変更し、SD地図更新アプリをご利用下さい。バージョンアップにて英数対応予定です(別途、ご案内します)。

とあるのですが、解決方法の「パスワードを「数字のみ」で設定登録」に関しては、
そもそもパスワードが数字と英字両方を含めないと登録できない制約があるため、不可能なのです。

password

そのため、バージョンアップを待つ必要があると思いますが、
どこでバージョンアップツールをダウンロードできるのか、ちょっとわかりませんでした。
恐らくG-BOOK様に連絡すれば、ダウンロードできるかもしれません。
トヨタ様のディーラーに聞いても、下記のサポートディスクへ聞かないとわからないとのことでした。

マップオンデマンド・サポートデスク
0561-57-6814. 受付時間 9:00∼18:00

更新期日があと1日しかなく聞く時間がなかったため、
結局聞いてはいないのですが、バージョンアップする方法が分かりました。
このツールのメニューバーのヘルプの「最新バージョンを確認」でバージョンアップしてください。
すると、恐らくツールがバージョンアップできるはずです。
新しいバージョンでは英数字が入力可能のため、バージョンアップ後は問題が発生しなくなります。

ただし、私自身後で気が付いたものなので、上の方法ではうまくいかないかもしれません。
「最新バージョンを確認」自体がログインしないとできないものかもしれないからです。


一応、私がとった方法を紹介します。解決方法の1つとしてみてください。
方法とは、パスワードの入力欄の設定の「数値しか受け付けない」を解除させます。

専門的な話になりますが、Windowsの表示は多くが共通の部品によってできています。
この共通の部品は使い方が公開されており、みんなが知ることができます。
今回は、文字の入力用の共通部品であるエディットボックスを使用しており、
このエディットボックスに「数値しか受け付けない」という設定がされているわけです。
共通部品なので、ほかのソフトからもその設定を設定したり、逆に解除することができます。
今回は、その設定を解除することを行います。

1. パスワード入力欄のウィンドウハンドルを調査
2. GetWindowLong でウィンドウハンドルから、スタイル(GWL_STYLE)を取得
3. ウィンドウ情報から ES_NUMBER (0x2000) をビットマスクで削除
4. SetWindowLong でスタイル(GWL_STYLE)を再設定

これで、パスワード入力欄に英数字を入力できるようになります。
ログインをすると、新しいツールの確認が始まり、
新しいマップオンデマンドツールのバージョンアップされます。

上の手順をHSPというプログラミングツールで実行ファイルにしたものです。

ソースコード
実行ファイル

すみません。DNSサーバーを切り替えた際に、設定がおかしくなってしまってアクセスできなくなってしまいました。
いったん、dropboxに置きましたので、なおるまで下記からダウンロードしてください。申し訳ございません。
https://www.dropbox.com/sh/uyr4hpjjefhs68l/AABtbEe6Ybw6g9vzEk0-g0p7a?dl=0

上記の実行ファイルを実行したときに何か発生しても責任をとることはできません。
自己責任でお願いします。

ウィンドウハンドルは、毎回異なるため、
WindowFromPoint でカーソル下のハンドルを取得可能する関数を使用しました。


追記
Yahoo知恵袋 「トヨタ純正カーナビで、データ更新をしようと思い、マップオンデマンドソフトを添…
fukushun1994様による解決方法の回答がありました。
MOD専用G-BOOK ID」というものをとるといいとのことです。


関連するブログ
MapOnDemandでちょいイラ‐(NSZT-W61G編)カッパっぱ、るっパッパ
ナビの地図データ更新&Gracenoteメディアデータベース更新*YOU*のページ

指定した範囲の乱数を作成したい(実戦編)

投稿日: 更新日:


みなさん、こんにちは。
さて、前回前々回にわたって、
指定した範囲の乱数の作成の仕方を書きました。
改めて奥が深いですね。

読み忘れた方のためにリンクしますっ(^o^)
指定した範囲の乱数を作成したい(前編)
指定した範囲の乱数を作成したい(後編)
指定した範囲の乱数を作成したい(実戦編)←いまここっ!


これまでの話では、
小さなより精度が低い乱数発生器を使用していたため、
実用上は、そんなに関係ないんじゃないかな。
と思う方も多いかもしれません。

今回の話はかなり短いですが、
実際の実用例を考えて、
乱数の落とし穴にはまっていきたいと思います。(^o^)丿

あなたは、ネットワークゲームを設計しています。
モンスターを倒すと、レアアイテムを落とします。
確率は、0.01%刻みで設定できるようにしたいです。
言語は、VC++、またはHSPを使用することとします。

ほら、ちょっと本当にありそうな雰囲気になってきましたよね。
さて、どのように設計するでしょうか、
VC++の乱数発生器だったら、みんな使ってるし大丈夫だろう。
乱数作成の高速化も考えて、 x = rand() % 10000 こんな感じにして、
で、if(x < 1000) で 10% みたいに計算しちゃおう。

では、実際にコードを書いてみましょう。
とりあえず、HSPが好きなので、HSPで書きます。
まず、 HSP には rnd(n) という関数があるのですが、
これはCで rand() % n という文章にすぎません。

#define multiplier 214013
#define addend 2531011

x = 1

goto *start

#defcfunc rnd2 int s
	x = x * multiplier + addend
	return (((x >> 16) & 0x7FFF) \ s)

*start

mes "HSPの rnd(n) は、余りを使用して乱数を切り出している。"
mes "HSPの rnd -> " + rnd(100) + " は"
mes "上記の rnd2 -> " + rnd2(100) + " と同じ。"

上記をふまえて、
乱数の値がどのように分布するか度数分布表を作ってみましょう。

size = 100000
dim bin, 10

repeat size
	x = rnd(10000)
	bin(int(x / 1000))++	
loop

repeat 10
	mes strf("[%5d ,%5d) ... %5d回", (cnt * 1000), ((cnt + 1) * 1000), bin(cnt))
loop

実行すると、

範囲 回数
[ 0, 1000) 12401
[1000, 2000) 12176
[2000, 3000) 11618
[3000, 4000) 9079
[4000, 5000) 9088
[5000, 6000) 9107
[6000, 7000) 9150
[7000, 8000) 9048
[8000, 9000) 9316
[9000,10000) 9017

つまり、10%を作るつもりが、12%になってしまいます!!
さらに、if(rnd(10000) < 3000) で 30.00% みたいに計算しちゃおうと思うと 36%になります。

棒グラフを作ると分かりやすい。
histogram

そんなこんなで、
今回は、ちょっと身近に感じそうな話を作ってみました。
みなさん、乱数には十分に気を付けましょう!

ちなみに、HSPの機能の中でより正しい乱数を作りたい場合は、
これまでの話をふまえると下のような感じ。(色々と追加しました。)

#module

#defcfunc rnd15 int s
	// 15ビットの実数の乱数を作成
	return int(((double(rnd(0x8000))) / 0x8000) * s)

#defcfunc rnd30 int s
	// 30ビットの実数の乱数を作成
	return int(((32768.0 * rnd(0x8000) + rnd(0x8000)) / 0x40000000) * s)

#defcfunc rnd52 int s, local a
	// 52ビットの実数の乱数を作成
	a = double(rnd(0x8000))
	repeat 3
		a *= 32768
		a += rnd(0x8000)
	loop
	return int(a / 1152921504606846976.0 * s)

#defcfunc rnd4 int s, local a, local b
	// 繰り返して範囲外は捨てる
	repeat
		a = rnd(0x8000)
		b = a \ s
		if(a - b + s <= 0x8000) {
			break
		}
	loop
	return b

#global

font "MS ゴシック", 12
pos 5, 5

// 作成する乱数の範囲によって、
// 乱数のビットを大きいものを選ぶか、
// 上記の rnd4() を利用するといいです。

randomize
size = 1000000

mes "通常版"
dim bin, 10
repeat size
	x = rnd(10000)
	bin(int(x / 1000))++	
loop
repeat 10
	mes strf("[%5d ,%5d) ... %5d回", (cnt * 1000), ((cnt + 1) * 1000), bin(cnt))
loop

mes "工夫したもの"
dim bin, 10
repeat size
	x = rnd15(10000)
	bin(int(x / 1000))++	
loop
repeat 10
	mes strf("[%5d ,%5d) ... %5d回", (cnt * 1000), ((cnt + 1) * 1000), bin(cnt))
loop

mes "誤差が少ない"
dim bin, 10
repeat size
	x = rnd30(10000)
	bin(int(x / 1000))++	
loop
repeat 10
	mes strf("[%5d ,%5d) ... %5d回", (cnt * 1000), ((cnt + 1) * 1000), bin(cnt))
loop

pos 200, 5

mes "最も誤差が少ない"
dim bin, 10
repeat size
	x = rnd52(10000)
	bin(int(x / 1000))++	
loop
repeat 10
	mes strf("[%5d ,%5d) ... %5d回", (cnt * 1000), ((cnt + 1) * 1000), bin(cnt))
loop

mes "正しい乱数"
dim bin, 10
repeat size
	x = rnd4(10000)
	bin(int(x / 1000))++	
loop
repeat 10
	mes strf("[%5d ,%5d) ... %5d回", (cnt * 1000), ((cnt + 1) * 1000), bin(cnt))
loop

上記の「正しい乱数」のアルゴリズムについては、下で紹介していますが、前編から読むとより勉強になるかもしれません。
指定した範囲の乱数を作成したい(後編)

ipmpackにアフィン変換を追加

投稿日: 更新日:


久しぶりにipmpackを更新しました。
まだvectorからはダウンロード出来ません。
placearkの方からダウンロードして下さい。

今回オマケとして、sample\ipmpackの中に、
少しだけコンパイル前のソースコードが入っています。

ipmpack 1.050
(公開したてなので、バージョン据え置きの細かい修正が入るかも。vector公開まで待つといいかも。)

いろいろと更新しました。
主な更新点は次のような感じです。
・アフィン変換機能
・画像の一部コピー機能
・カラーマトリックス変換のオフセット値の設定機能
・命令の引数の省略可能な箇所を増やす
・一部の変な命令名を変更
・HSPの新しいサムネイル機能付きヘルプに対応

詳しいところは、ヘルプやreadmeに任せまして、
目玉のアフィン変換機能の紹介。


上のように、アフィン変換を用いて、拡大回転思いのままです。
回転なら、grotateより品質がよく綺麗に回転できます。
線形補間にも対応しています。

ただ少し処理が重たいです。
ソースコードが「sample\ipmpack\sample_vram.zip」の中に入っているので、
自由にいじって下さい。
ライセンスは前の通りNYSLのような感じです。

ヘルプでサムネイルが表示されます!

sleep sortっぽいの

投稿日: 更新日:


この前、sleep sort(元ネタ)というのを知って、
HSPでSetTimerでそれっぽいのを作ったのですが、
掲示板のwait0000さんが作ったのと普通に被ってしまったので寝かせてました。

うん。

でも5月に1度も投稿してなかったので、投稿します(^^)
実用性とかそういうのなしで、発想力がすごい。

//sleep sort

//元ネタ
//http://dis.4chan.org/read/prog/1295544154
;Genius sorting algorithm: Sleep sort
;1 Name: Anonymous : 2011-01-20 12:22
;Man, am I a genius. Check out this sorting algorithm I just invented.
;
;
;#!/bin/bash
;function f() {
;    sleep "$1"
;    echo "$1"
;}
;while [ -n "$1" ]
;do
;    f "$1" &
;    shift
;done
;wait
;
;example usage:
;./sleepsort.bash 5 3 6 3 6 3 1 4 7

#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,sptr
#func KillTimer "KillTimer" int,int
#define WM_TIMER 0x0113
#define N 20

randomize
dim number, N
oncmd gosub *OnTimer,WM_TIMER
repeat N
	number = rnd(100) + 1
	SetTimer hwnd, number, number * 10, 0
loop
stop

*OnTimer
	KillTimer hwnd, wparam
	mes wparam
	return

そういえば、しひさんプロセスを作って実装という
本物のsleep sortが投稿してあってすごいと思った。

C言語のアドレス演算子の不思議

投稿日: 更新日:


前々から、C言語のポインタで不思議だったこと。

最適化C 言語 より
http://www.imit.chiba-u.ac.jp/new-system/sr/man_hitachi_c/MAN/3000/03C3100D/C310057.HTM
>単項&演算子をアドレス演算子といい,&の後に続くオペランドのポインタ(アドレス)を表します。
>(3) 記述例
>int a , *p ;
>p = &a ;
>    解説
>        &aはaのアドレスを表し,ポインタpにaのアドレスを代入する式です。

こういうのを見て、アドレス演算子をつければ、
その変数のアドレスが分かるって理解しちゃうと不思議なことが起きます。

例えば、

#include
main() {
    int target;
    int x = &target + 1;
    int y = &target;y += 1;
    printf("x = %d\ny = %d\n",x,y);
}

のようなコード。xとyが同じ値になりません。

友人に色々教えてもらい分かったことなのですが、
数値とアドレスは違うもの。&をつけるとポインタ型になる。」ということ。
考えれば、普通は変数にアドレス演算子をつけたものは、ポインタ型にエラーなく代入してますよね。
つまり、アドレスの型は、ポインタ型なのです。

なお、ポインタ型同士の加算は出来ないです。

&target + &targetエラー

実際の計算的には
int x = &target + n; → int x = (int)&target + sizeof(target) * n;
X型のポインタ型に、数値を加算する場合に、自動でsizeof(X)を数値に掛け算してくれます。
数値ではなく、ポインタ型の場合はエラー。

HSPをやっていると、varptr函数でアドレスが分かるのですが、

アドレス演算子は、それと同じようなものだと思っていたわけですが、こんな違いがあったのですね。
あとあと、教科書やサイトとかで、ポインタ型を%pではなく整数型を表示させる%dで表示するもんだから、
なんか、「アドレスと整数は同じなんだ。アドレスって数値だし納得!」みたいな錯覚するというか。

後で調べたのですが、ポインタに関して、
苦しんで覚えるC言語アドレスを記憶する変数 がつっこんだところまで解説していて分かりやすいです。

まあそれはおいておいて、友人が書いたサンプル。

main() {
    int x = 1,y[] = {0,100};
    printf("%d\n",x[y]);
}

という書き方のほうが驚いた。
y[2] が *(y+2) に対応しているから、こういう書き方できるそうです。
C言語は奥が深いです。

いろいろ教えてくださって、ありがとうございます。m(_ _)m

ポインタ型同士の加算・ポインタ型に数値の掛算・割算はエラー

#include
main() {
    int* target;
    target = (int *)1 + (int *)2;
    target = (int *)1 * 1;
    target = (int *)1 / 1;
}

以上のことが分かると、次のようなネタコードが書けます。

ビットシフト無しで1バイトずつ取り出す。(1回の加算と1回のビット論理和)

#include
#define GET(T,N) ((int)*((char*)(&T)+(int)(N)))
main() {
    int i,target = 0×11223344;
    for(i=0;i

加算のみで5の倍数を表示する(3回の加算)

#include
#define GET(T,N) (int)((T*)0+(int)(N))
main() {
    int X = 8;
    printf("%d\n",GET(long,X)+GET(char,X));
}

立て続けに…

投稿日: 更新日:


ここ立て続けに、「オンラインゲーム」と「システムのチェック」を公開したのですが
修正したいのが後から後から出てくる。

 修正したいの一覧

オンラインゲーム

 ・サーバーの状態で時間別の接続人数が、過去最大の接続人数になってる。
 1日以上サーバー付けっぱなしはなかったので気づかなかった

 ・サーバーを監視するプログラム
 サーバーは友人のを借りているので、
問題があった場合すぐさま再起動出来ない。
 また、サーバーはGUIでのみ操作するように作っちゃったので
なんか、その辺をどうにかしたい

 「システムのチェック

・多分64ビット版Vistaで終了できない
国産の言語HSPのバグ。対処方法はある。

そもそも窓の手がVistaで動かないらしいので
これ自体が動かない可能性も。 Vistaでテストする必要あるみたい

 ・タスクバーに表示される。

ダイアログっぽいウィンドウを目指してるので
ここに表示されたら雰囲気が……。)
でも、これ消したら、Win+Dとかどうなるんだろう。

ああ。いろいろ大変なことに。
 仕事も大変な時期なので、
ここら辺が完成したら、
しばらくゲーム作りとか休止したい。
 といっても、なんだかんだで更新続けそうですが。


7月2日追記
サーバー監視ソフト1つを残して全て解決しました。

strfについて、HSP3.2betaではエラー発生。

投稿日: 更新日:


以前、すぽいと君を1.077にバージョンアップした時に気がついた仕様?
書式変換の一部にstrfを使用しており、これがエラーの原因になってました。
せっかくですので紹介します。
HSP3.1 ではエラーにならないのに、HSP3.2beta エラーになるというもの。
mes strf(“a”,1)
これです、strfに“%d”がないので、パラメータがあっても置き換え出来ないよということです。
HSP3.1ではエラーになりません
多分、strfに複数のパラメータを持つことが出来るという機能が追加されたため、動作が変わったと思います。
気をつけてください^^
そういえば、つい昨日まで、矩形短形と間違い探してました。( ● _ ● )