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

 

Date 関数がv13.3からv13.4で変わった

いいのです。よくあることなのです。

マニュアルにも書いてありました。12月の次が1月であるという保証はない、と。

しかし動いていたんです。v13.3までは。

Date(‘2014/13/1″)

v13.3までは、このコードは2015年1月1日を返してくれていました。それがv13.4でDate関数が大幅に変更になりました。このとき動きがマニュアル通りになりました。13月という月は無いのだと。プログラマが制御せよと。

問題はその月の最後の日を返すところで起こりました。次の月の1日から1日引いて求めます。正解は次です。

C_LONGINT($1;$year)

$year:=$1

C_LONGINT($2;$month)

$month:=$2

C_DATE($0;$date)

$date:=Date(String($year)+”/”+String($month)+”/”+String(1)) //当月の1日

$date:=Add to date($date;0;1;0) //翌月の1日

$date:=Add to date($date;0;0;-1) //当月の末日

$0:=$date

カテゴリー: 4D

バックアップ

4D データベースは稼働中にバックアップすることができます。バックアップスケジュールに「毎日」「朝の3時に」とか指定して、どこに保存するか、いくつ前までのバックアップを残すかを指定します。

バックアップファイル作成時刻から次のバックアップファイル作成時までの間にトラブルが起こった場合は、ログファイルを使って復元を試みることができます。ログファイルはどこに書き出すかを指定することができます。通常は内蔵ディスクを指定します。ストラクチャーファイルと同じディスクに保存する場合はパッケージの中に保存するのが一般的です。

出力されるファイル名には「.journal」が付いています。パッケージフォルダが大きくなって困るときはパッケージの隣に出力するように設定しておくと良いでしょう。

カテゴリー: 4D

プラグインフォルダ「Plugins」と「MAC4DX」

4Dのプラグインはv12から「Plugins」フォルダに入れておきます。

v12時代に作成したプロジェクトに次のプラグインを使っていました。

1)4D InternetCommands.bundle

2)Time and Number.bundle

これはW3C日付文字列から日付や時間を切り出すプラグインです、宮古さんからいただきました。これらを「MAC4DX」フォルダに入れて使っていました。これをそのままv13に変換したら動かなかった、というお話です。

はじめ「4D InternetCommands.bundle」のほうは認識されているように見えましたが、これはアプリケーションフォルダにこのプラグインがあったからでした。

「Time and Number.bundle」は標準の4Dには附属していませんので、アプリケーションフォルダにありません。このためこちらのプラグインだけ認識されていない、という状況になった次第です。

v11までのプロジェクトとの互換性のため、v12では「MAC4DX」というフォルダにプラグインを入れてあっても認識します。これがv13では通用しなくなったことがそもそもの原因でした。

プラグインは.4dbファイルの並びに「Plugins」フォルダを作って、その中に保存しましょう。ここにない場合でもApplications→4Dフォルダ→Pluginsフォルダにプラグインがあれば認識されます。

まとめますと、プラグインを置く場所(v13以降)は次の2カ所です。

1)プロジェクトフォルダ→「Plugins」フォルダ

2)アプリケーションフォルダ→4Dフォルダ→「Plugins」フォルダ

カテゴリー: 4D

4D v11の文字コード

4D v11には、文字コードの扱いを制御する環境設定がある。v13とは異なり、データベース設定も環境設定メニューにあります。

環境設定の「アプリケーション」の「互換性」メニューに「Unicodeモード」というチェックボックスがあります。v11で新しくプロジェクトを作成した場合、Unicodeモードはチェックされていますが、たとえばv2004のプロジェクトをv11にコンバートした場合はUnicodeモードがチェックされていません。

このおかげでどういうことが起こるかというと...

非Unicodeモードでは、Positionコマンドで取得した文字列中のポジションは文字数を示していますが、Substringコマンドでその文字数を切り出すと、すでにUnicodeですので、期待していた長さとバイト数が異なってしまう、現象が起こります。

v11で作成した、Jiro_str_Extractというかなり実績のあるプログラムを、この元v2004の今はv11のプロジェクトにコピーして使ったときに起こりました。Jiro_str_Extractはさんざんテストされていたのに、なぜか変な結果を返す、ポジションを示す数値は合っているのに切り出される文字列が、文字の途中で切れてしまう、という現象が起きます。

【環境設定】→【アプリケーション】→【互換性】で「Unicodeモード」がチェックされていませんでした。これをチェックしたら問題は解決しました。ちなみにv13にコンバートしても問題は解決します。これで気づきました。

サポートにも問い合わせて裏は取りました。古いプロジェクトを扱うときは注意しましょう。

 

カテゴリー: 4D