4D Summit Europe 2014 Paris

2014年11月18日~2014年11月20日、フランスのパリで開かれた4D Summitに行ってきました。セッションはプレクラスも含めると3日間、白石は次のセッションを受講してきました。

2014.11.18

Pre – class Migration with the Experts

— Add Komoncharoensiri, Keisuke Miyako, Olivier Deschanels, Thomas Maul

 

2014.11.19

4D Summit Keynote

Quiz — 4Dについてどれだけ詳しいかというクイズが会場で配られていましたので回答。

A Voyage in the AWS Cloud  — Pierre Gilot

XML demystified  — Bruno Legay

Labels Revisited  — Keisuke Miyako

The 4D product line in Cocoa: Natibe 64-bit  — Laurent Esnault

10 tips to improve your Web design  — Add Komoncharoensiri

The new network layer  — Sergiy Temnikov

4D’s 30th birthday party @ Eurosites George V

 

2014.11.20

4D Summit Keynote

Easy visualization with hmCal and hmReports  — Christian Sakowski, Matthias Heubach

Migration, Part II  — Achime Peschke

Extending our old (excellent & unique) app to the cloud: From 4D to 4D Mobile  — Daniel Santiago, Susana Gutierrez, Francisco Caja

SQL by the Master  — Sergiy Temnikov

Gift Dinner @ Eurosites George V Arts — Quizに解答した結果が良くて上位3位に入ったご褒美に夕食券をいだだきました。

 

2015.11.21

4D社見学 @Clichy

宮古さんに案内していただきました。

 

帰国後、参加の感想を4D社に投稿しました。

カテゴリー: 4Dタグ:

2つの画像を比較する

今回は画像サイズの話。フォームに表示した画像変数がコピペやドラッグ&ドロップで変更された場合をキャッチしようとしていました。
On Data Changeを使うと同じ画像をペーストされた場合を識別できません。
リファレンスにEqual picturesというコマンドがありました。これだと思って使ってみるとうまく動いてくれません。
単純化して調べてみると、同じ画像を代入した2つのピクチャー変数を比較するとFalseが返ってくるのです。同じ画像を代入したのに等しくないと。マニュアルが間違っていて戻り値が逆?、変数の領域が異なる?とか、いろいろ考えてはまりました。
どうやら画像が空の場合にFalseになるのだと気づきました。そこでサイズを調べてみたら、サイズがゼロの時にEqual picturesはいつもFalseを返す、のでした。

//関数名:BL03_PIC_load
//20150206 wat
//画像をロードしてフォームに表示、途中で変更されたかどうかを調べようと、
// 4D v13で実装されたEqual picturesを使ってみる。

C_LONGINT($1;$pic_id)
$pic_id:=$1

C_PICTURE($mask)
C_BOOLEAN($isEqual)
C_TEXT($m)

READ ONLY([PIC_SET])
QUERY([PIC_SET];[PIC_SET]PIC_ID=$pic_id)
$numOfRecs:=Records in selection([PIC_SET])
If ($numOfRecs=1)

//同じ画像フィールドから2つの変数にピクチャーをロード
vBL03_varPIC_LOGO:=[PIC_SET]PIC_LOGO
vBL03_varPIC_LOGO_onload:=[PIC_SET]PIC_LOGO

//画像を比較すると
$isEqual:=Equal pictures(vBL03_varPIC_HEAD;vBL03_varPIC_HEAD_onload;$mask)
$m:=$m+”PIC_HEAD $isEqual=”+String($isEqual)+”,”
ALERT($m)
// Falseが返ってくることがある????  そこでサイズを調べてみた

C_LONGINT($picSize;$picSize_onload)

$picSize:=Picture size(vBL03_varPIC_HEAD)
$picSize_onload:=Picture size(vBL03_varPIC_HEAD_onload)
$isEqual:=Equal pictures(vBL03_varPIC_HEAD;vBL03_varPIC_HEAD_onload;$mask)

$m:=”BL03_PIC_load: ”
$m:=$m+”PIC_HEAD $isEqual=”+String($isEqual)+”,”
$m:=$m+” $picSize=[“+String($picSize)+”]”
$m:=$m+” $picSize_onload=[“+String($picSize_onload)+”]”
ALERT($m)

End if

リファレンスをよく読んでみたら書いてありました。Equal picturesは空のピクチャを与えると正しく実行されなかったとしてシステム変数OKにゼロを返す、と。要はEqual picturesは正しく実行されたかどうかを判定してから比較結果を評価しなくてはならないのでした。
ここで2者択一問題が発生しました。

1)OK変数が1の時だけ比較値を評価する
2)画像サイズがゼロの時はそもそもEqual picturesを実行しない

さてどちらでしょうか。サイズがゼロ以外にOK変数がゼロになることがあるのでしょうか?

「サイズがゼロでもゼロ以外でもEqual picturesがエラーの場合、アプリは画像は変化しなかったと見なす」

として問題は無いように思えます。いやもとい、片方の画像サイズがゼロでもう片方がゼロじゃなかったらエラーになる、という意味でしょうから

今回は次のコードを正解としました。

//Jiro_pic_isEqual
//20150207 wat
//2つの画像を比較して同じかどうかを調べる

C_PICTURE($1;$pic1)
$pic1:=$1
C_PICTURE($2;$pic2)
$pic2:=$2

C_PICTURE($mask)
C_LONGINT($pic1Size;$pic2Size)
C_BOOLEAN($0;$isEqual)

$isEqual:=Equal pictures($pic1;$pic2;$mask)
If (OK=0)

// OK変数の値がゼロの場合はサイズがゼロの可能性がある
//どちらか一方だけがゼロの場合:OK変数がゼロ、比較結果はFalse
//または両方ゼロじゃない場合:OK変数が1、比較結果は画像が同じならTrue画像が違えばFalse

//失敗の場合、画像サイズが同じゼロならツゥルー
$pic1Size:=Picture size($pic1)
$pic2Size:=Picture size($pic2)
If (($pic1Size=0)&($pic2Size=0))

$isEqual:=True

Else 

//現時点では失敗の場合フォルスが返されているが念のため
$isEqual:=False

End if 

End if 

$0:=$isEqual