Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プログラムコードの最適化 (2016)

4D Japan
November 01, 2024

プログラムコードの最適化 (2016)

4D Japan

November 01, 2024
Tweet

More Decks by 4D Japan

Other Decks in Technology

Transcript

  1. 1 ΫϥΠΞϯταʔόʔ൛Ͱ։ൃͱݕূ 2 ࣮ࡍͷσʔλΛ༻ҙ 3 σʔλΛഒʹ૿΍͔ͯ͠Β࡞ۀΛ։࢝ 4 ΩϟογϡαΠζΛӡ༻؀ڥʹ߹ΘͤΔ 5 ΠʔαωοτΛ੾ͬͯXJpͰΫϥΠΞϯταʔόʔΛݕূ

    ։ൃ؀ڥͰ஗͍ωοτϫʔΫΛ࢖༻͍ͯ͠Ε͹ ͦΕ͚ͩӡ༻؀ڥͰ͸շదʹಈ͘ ϚʔϑΟ͸ۃ౓ͷָ؍ओٛऀͩͬͨ Murphy was an incurable optimist
  2. ฒͼସ͑ NT NT NT NT NT Πʔαωοτ 8Jp ྫ؆୯ͳฒͼସ͑ x

    1.2 XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  3. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  4. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  5. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  6. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ x 7.5 XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  7. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ x 7.5 Time with 'execute on server' method attribute "サーバー上で実⾏メソッド"属性を有効にした場合 XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  8. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  9. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ ÷23 ÷6 XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  10. ܭࢉʹཁͨ࣌ؒ͠ 0 ms 3,750 ms 7,500 ms 11,250 ms 15,000

    ms Πʔαωοτ 8Jp ྫࢦఆͨ͠೔෇ʹಛఆͷۭߓ͔Β໨త஍·Ͱߦ͚ΔϑϥΠτΛݕࡧ ৐Γܧ͗ճ͕ϧʔτ ÷23 ÷6 XJGJͰ஗ԆΛࡍཱͨͤΔ wifi makes delays worse
  11. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 σόοάϩάͷه࿥Λ։࢝͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͢Δ 3 σόοάϩάͷه࿥Λఀࢭ͢Δ
  12. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 σόοάϩάͷه࿥Λ։࢝͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͢Δ 3 SET DATABASE PARAMETER(Debug log recording;0) σόοάϩάͷه࿥Λఀࢭ͢Δ
  13. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 σόοάϩάͷه࿥Λ։࢝͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͢Δ 3 σόοάϩάͷه࿥Λఀࢭ͢Δ 4 ετϥΫνϟͱಉ֊૚ͷlogsϑΥϧμʔΛ։͘
  14. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 σόοάϩάͷه࿥Λ։࢝͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͢Δ 3 σόοάϩάͷه࿥Λఀࢭ͢Δ 4 ετϥΫνϟͱಉ֊૚ͷlogsϑΥϧμʔΛ։͘ 5 4DDebugLog_1.txtϑΝΠϧΛ։͘
  15. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 σόοάϩάͷه࿥Λ։࢝͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͢Δ 3 σόοάϩάͷه࿥Λఀࢭ͢Δ 4 ετϥΫνϟͱಉ֊૚ͷlogsϑΥϧμʔΛ։͘ 5 4DDebugLog_1.txtϑΝΠϧΛ։͘
  16. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 σόοάϩάͷه࿥Λ։࢝͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͢Δ 3 σόοάϩάͷه࿥Λఀࢭ͢Δ 4 ετϥΫνϟͱಉ֊૚ͷlogsϑΥϧμʔΛ։͘ 5 4DDebugLog_1.txtϑΝΠϧΛ։͘
  17. ৘ใྔʹѹ౗͞Εͳ͍ͨΊʹ͸ too much info; select you must ؂ࢹର৅ίϚϯυΛߜΓࠐΉ ΤΫεϓϩʔϥʔͰίϚϯυΛબ୒͢Δ ίϚϯυ൪߸ʢྫʣΛ֬ೝ͢Δ

    ಛఆͷίϚϯυʹϩάΛݶఆ͢Δ SET DATABASE PARAMETER(Log command list;"277") SET DATABASE PARAMETER(Debug log recording;2+4+8+16) 1 2 3 4
  18. ৘ใྔʹѹ౗͞Εͳ͍ͨΊʹ͸ too much info; select you must ؂ࢹର৅ίϚϯυΛߜΓࠐΉ ΤΫεϓϩʔϥʔͰίϚϯυΛબ୒͢Δ ίϚϯυ൪߸ʢྫʣΛ֬ೝ͢Δ

    ಛఆͷίϚϯυʹϩάΛݶఆ͢Δ SET DATABASE PARAMETER(Log command list;"277") SET DATABASE PARAMETER(Debug log recording;2+4+8+16) SET DATABASE PARAMETER(Log command list;"277;341") SET DATABASE PARAMETER(Debug log recording;2+4+8+16) 1 2 3 4
  19. ৘ใྔʹѹ౗͞Εͳ͍ͨΊʹ͸ too much info; select you must ؂ࢹର৅ίϚϯυΛߜΓࠐΉ ΤΫεϓϩʔϥʔͰίϚϯυΛબ୒͢Δ ίϚϯυ൪߸ʢྫʣΛ֬ೝ͢Δ

    ಛఆͷίϚϯυʹϩάΛݶఆ͢Δ SET DATABASE PARAMETER(Log command list;"277") SET DATABASE PARAMETER(Debug log recording;2+4+8+16) SET DATABASE PARAMETER(Log command list;"277;341") SET DATABASE PARAMETER(Debug log recording;2+4+8+16) QUERY (277) および 
 QUERY SELECTION (341) コマンドを監視 1 2 3 4
  20. SET DATABASE PARAMETER(Debug log recording; 2 + 4 + 8

    + 16) ϑϥάͷ໾ׂ set the flags
  21. SET DATABASE PARAMETER(Debug log recording; 2 + 4 + 8

    + 16) 2 : 引数も記録(メソッドおよびコマンド) 4 : タブ区切りフォーマット 8 : 遅延書き込みモード 16 : プラグインも対象 ϑϥάͷ໾ׂ set the flags
  22. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 ͋ΒΏΔϝιουίʔϧΛ؂ࢹ͢Δ SET

    DATABASE PARAMETER(Log command list;"") SET DATABASE PARAMETER(Debug log recording;4+8+16)
  23. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 ͋ΒΏΔϝιουίʔϧΛ؂ࢹ͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͔ͯ͠ΒϩάΛఀࢭͯ͠։͘ 3 ϩάʹ͸ϝιουίʔϧ͚͕ͩه࿥͞Ε͍ͯΔ
  24. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 ͋ΒΏΔϝιουίʔϧΛ؂ࢹ͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͔ͯ͠ΒϩάΛఀࢭͯ͠։͘ 3 ϩάʹ͸ϝιουίʔϧ͚͕ͩه࿥͞Ε͍ͯΔ
  25. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 ͋ΒΏΔϝιουίʔϧΛ؂ࢹ͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͔ͯ͠ΒϩάΛఀࢭͯ͠։͘ 3 ϩάʹ͸ϝιουίʔϧ͚͕ͩه࿥͞Ε͍ͯΔ 4 ۭͷςʔϒϧʹϩάΛΠϯϙʔτ͢Δ
  26. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 ͋ΒΏΔϝιουίʔϧΛ؂ࢹ͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͔ͯ͠ΒϩάΛఀࢭͯ͠։͘ 3 ϩάʹ͸ϝιουίʔϧ͚͕ͩه࿥͞Ε͍ͯΔ 4 ۭͷςʔϒϧʹϩάΛΠϯϙʔτ͢Δ 5 ϩάΛௐࠪ͢Δ
  27. ࣗ෼ͷίʔυΛঠѲ͢Δ know your code activity, you should 1 ͋ΒΏΔϝιουίʔϧΛ؂ࢹ͢Δ 2

    ී௨ʹΞϓϦέʔγϣϯΛ࢖༻͔ͯ͠ΒϩάΛఀࢭͯ͠։͘ 3 ϩάʹ͸ϝιουίʔϧ͚͕ͩه࿥͞Ε͍ͯΔ 4 ۭͷςʔϒϧʹϩάΛΠϯϙʔτ͢Δ 5 ϩάΛௐࠪ͢Δ 6 ςΫχΧϧαϙʔτ͕ఏڙ͢Δπʔϧ܈Λ׆༻͢Δ
  28. 1 σόοάϩά͸σΟεΫ༰ྔΛඞཁͱ͢Δ 2 σόοάϩάͰσΟεΫ͕͍ͬͺ͍ʹ 3 ֎෦هԱ૷ஔͷϝʔΧʔ͸େتͼ 4 ϩάϑΝΠϧ͸.#ຖʹ෼ׂ͞Ε͍ͯΔ 5 SET

    DATABASE PARAMETER(Circular log limitation;10) ϩά͕઎༗͢Δ༰ྔΛ཈੍͢Δ͜ͱ͕ඞཁ 10 x 10MB = 最⼤100MB
  29. P1 P2 $P3 PR1 PR2 P1' $P2' PR1' SP2 SP1

    ストアドプロシージャー
  30. P1 P2 $P3 PR1 PR2 P1' $P2' PR1' SP2 SP1

    WP2 WP3 WP1 Webプロセス
  31. P1 P2 $P3 PR1 PR2 P1' $P2' PR1' SP2 SP1

    WP2 WP3 WP1 コンパイル モード
  32. P1 P2 $P3 PR1 PR2 <> P1' $P2' PR1' SP2

    SP1 WP2 WP3 WP1 インタープロセス変数テーブル コンパイル モード
  33. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' SP2 SP1 WP2 WP3 WP1 コンパイル モード
  34. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V SP2 SP1 WP2 WP3 WP1 プロセス変数テーブル コンパイル モード
  35. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 SP1 WP2 WP3 WP1 コンパイル モード
  36. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V コンパイル モード
  37. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V V コンパイル モード
  38. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V V V V コンパイル モード
  39. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V V V V <> CV <> CV コンポーネント#1の インタープロセス変数テーブル コンポーネント#2の インタープロセス変数テーブル コンパイル モード
  40. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V V V V <> CV <> CV <> CV <> CV <> CV <> CV コンパイル モード
  41. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V V V V CV CV <> CV <> CV <> CV <> CV <> CV <> CV コンポーネント#1の プロセス変数テーブル コンポーネント#2の プロセス変数テーブル コンパイル モード
  42. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V V V V CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV <> CV <> CV <> CV <> CV <> CV <> CV コンパイル モード
  43. P1 P2 $P3 PR1 PR2 <> <> P1' $P2' <>

    PR1' V V V V V SP2 V SP1 V WP2 V WP3 V WP1 V V V V CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV CV <> CV <> CV <> CV <> CV <> CV <> CV コンパイル モード プロセス変数テーブルのサイズに無頓着であってはいけない
  44. 無数のフォームローカル変数を オブジェクト型のプロセス変数に置換: {"onTimerMessage":"refresh", "PreviousFormEvent":27, "LastKeystroke":"C", "OnErrorMethodToRestore":"General_Error_Call", "OnEventMethodToRestore":"", "CountryCustomer":"FR", "CurrentQuoteUUID":"EF455411221114778AB3ED45DD", "ListOfCountryInWishList":["US","FR","UK","SA","AU"]

    } 1個のプロセス変数に保存: form_context プロセス変数テーブルに 16バイト追加することに わずか16バイトで整理できて ⼤変お買い得! ΦϒδΣΫτม਺ͰεοΩϦ group the variables in an object, you can
  45. 無数のフォームローカル変数を オブジェクト型のプロセス変数に置換: {"onTimerMessage":"refresh", "PreviousFormEvent":27, "LastKeystroke":"C", "OnErrorMethodToRestore":"General_Error_Call", "OnEventMethodToRestore":"", "CountryCustomer":"FR", "CurrentQuoteUUID":"EF455411221114778AB3ED45DD", "ListOfCountryInWishList":["US","FR","UK","SA","AU"]

    } 1個のプロセス変数に保存: form_context プロセス変数テーブルに 16バイト追加することに わずか16バイトで整理できて ⼤変お買い得! 属性を追加するだけ拡張: フォームに オブジェクトを追加する必要なし ΦϒδΣΫτม਺ͰεοΩϦ group the variables in an object, you can
  46. OB SET(form_context;"currentCountry";"France") $ref:=Open form window("country_selector") DIALOG("country_selector") CLOSE WINDOW($ref) $return_country:=OB Get(form_context;"currentCountry")

    $evt:=Form event Case of : ($evt=On Load) $currentCountry:=OB Get(form_context;"currentCountry") ALL RECORDS([Country]) DISTINCT VALUES([Country]Continent;_continent) If ($currentCountry="") _continent:=1 OB SET(form_context;"onTimerMessage";"changeContinent") SET TIMER(-1) Else QUERY([Country];[Country]Name=$currentCountry) _continent:=Find in array(_continent;[Country]Continent) QUERY([Country];[Country]Continent=_continent{_continent}) DISTINCT VALUES([Country]Name;_country) _country:=Find in array(_country;$currentCountry) End if : ($evt=On Timer) SET TIMER(0) $onTimerMessage:=OB Get(form_context;"onTimerMessage";Is text) OB REMOVE(form_context;"onTimerMessage") Case of : ($onTimerMessage="changeContinent") QUERY([Country];[Country]Continent=_continent{_continent}) DISTINCT VALUES([Country]Name;_country) _country:=1 End case End case ίϯςΩετม਺ͷྫ୊ example with a form_context
  47. OB SET(form_context;"currentCountry";"France") $ref:=Open form window("country_selector") DIALOG("country_selector") CLOSE WINDOW($ref) $return_country:=OB Get(form_context;"currentCountry")

    $evt:=Form event Case of : ($evt=On Load) $currentCountry:=OB Get(form_context;"currentCountry") ALL RECORDS([Country]) DISTINCT VALUES([Country]Continent;_continent) If ($currentCountry="") _continent:=1 OB SET(form_context;"onTimerMessage";"changeContinent") SET TIMER(-1) Else QUERY([Country];[Country]Name=$currentCountry) _continent:=Find in array(_continent;[Country]Continent) QUERY([Country];[Country]Continent=_continent{_continent}) DISTINCT VALUES([Country]Name;_country) _country:=Find in array(_country;$currentCountry) End if : ($evt=On Timer) SET TIMER(0) $onTimerMessage:=OB Get(form_context;"onTimerMessage";Is text) OB REMOVE(form_context;"onTimerMessage") Case of : ($onTimerMessage="changeContinent") QUERY([Country];[Country]Continent=_continent{_continent}) DISTINCT VALUES([Country]Name;_country) _country:=1 End case End case OB SET(form_context;"onTimerMessage";"changeContinent") SET TIMER(-1) ίϯςΩετม਺ͷྫ୊ example with a form_context
  48. OB SET(form_context;"currentCountry";"France") $ref:=Open form window("country_selector") DIALOG("country_selector") CLOSE WINDOW($ref) $return_country:=OB Get(form_context;"currentCountry")

    $evt:=Form event Case of : ($evt=On Load) $currentCountry:=OB Get(form_context;"currentCountry") ALL RECORDS([Country]) DISTINCT VALUES([Country]Continent;_continent) If ($currentCountry="") _continent:=1 OB SET(form_context;"onTimerMessage";"changeContinent") SET TIMER(-1) Else QUERY([Country];[Country]Name=$currentCountry) _continent:=Find in array(_continent;[Country]Continent) QUERY([Country];[Country]Continent=_continent{_continent}) DISTINCT VALUES([Country]Name;_country) _country:=Find in array(_country;$currentCountry) End if : ($evt=On Timer) SET TIMER(0) $onTimerMessage:=OB Get(form_context;"onTimerMessage";Is text) OB REMOVE(form_context;"onTimerMessage") Case of : ($onTimerMessage="changeContinent") QUERY([Country];[Country]Continent=_continent{_continent}) DISTINCT VALUES([Country]Name;_country) _country:=1 End case End case OB SET(form_context;"onTimerMessage";"changeContinent") SET TIMER(-1) OB SET(form_context;"currentCountry";_country{_country}) ACCEPT ίϯςΩετม਺ͷྫ୊ example with a form_context
  49. レコードのサイズ 150フィールドのテーブル ヘッダー 32 バイト 32 バイト データ 実際のサイズ 実際のサイズ

    µストラクチャ 8 バイト×フィールド数 1,200 バイト 合計 最低 1.2 Kb レコード毎 150フィールドのテーブル ະ࢖༻Ͱ΋ίετ͕ൃੜ empty isn't free
  50. レコードのサイズ 150フィールドのテーブル ヘッダー 32 バイト 32 バイト データ 実際のサイズ 実際のサイズ

    µストラクチャ 8 バイト×フィールド数 1,200 バイト 合計 最低 1.2 Kb レコード毎 150フィールドのテーブル ະ࢖༻Ͱ΋ίετ͕ൃੜ empty isn't free
  51. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  52. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  53. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  54. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  55. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  56. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  57. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  58. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  59. ϑΟʔϧυ͕૿͑ͪΌ͏ප "all you can store" syndrome # フィールド 9 Phone1

    10 Phone2 11 Fax 35 Phone3 90 Portable 105 email 120 email2
  60. SET AUTOMATIC RELATIONS SET FIELD RELATION カレントプロセス内で有効 すべてのリレーションを変更する 1個のリレーションだけを変更する True,

    False Do not modify, Structure config., Manual, Automatic ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  61. SET AUTOMATIC RELATIONS SET FIELD RELATION カレントプロセス内で有効 すべてのリレーションを変更する 1個のリレーションだけを変更する True,

    False Do not modify, Structure config., Manual, Automatic ストラクチャー定義の⾃動リレーションは変更できない ストラクチャー定義の⾃動リレーションも変更できる ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  62. SET AUTOMATIC RELATIONS SET FIELD RELATION カレントプロセス内で有効 すべてのリレーションを変更する 1個のリレーションだけを変更する True,

    False Do not modify, Structure config., Manual, Automatic ストラクチャー定義の⾃動リレーションは変更できない ストラクチャー定義の⾃動リレーションも変更できる "True" はリレーションをロックする;
 その場合 SET FIELD RELATION 
 は無視されてしまう 副作⽤なし ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  63. SET AUTOMATIC RELATIONS SET FIELD RELATION カレントプロセス内で有効 すべてのリレーションを変更する 1個のリレーションだけを変更する True,

    False Do not modify, Structure config., Manual, Automatic ストラクチャー定義の⾃動リレーションは変更できない ストラクチャー定義の⾃動リレーションも変更できる "True" はリレーションをロックする;
 その場合 SET FIELD RELATION 
 は無視されてしまう 副作⽤なし ! ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  64. SET AUTOMATIC RELATIONS SET FIELD RELATION カレントプロセス内で有効 すべてのリレーションを変更する 1個のリレーションだけを変更する True,

    False Do not modify, Structure config., Manual, Automatic ストラクチャー定義の⾃動リレーションは変更できない ストラクチャー定義の⾃動リレーションも変更できる "True" はリレーションをロックする;
 その場合 SET FIELD RELATION 
 は無視されてしまう 副作⽤なし ! 互換性のために残されている 効率⾯で優れている ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  65. QUERY BY FORMULA QUERY BY FORMULA QUERY SELECTION BY FORMULA

    ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  66. QUERY BY FORMULA QUERY BY FORMULA インデックスを使⽤しないシーケンシャル検索 インデックス検索 サーバー側でフォーミュラを評価 ⾃動的にJOINを実⾏

    クライアント側でフォーミュラ式を評価 レコード1件ずつクライアントに転送 JOINを定義して使⽤ QUERY SELECTION BY FORMULA ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  67. QUERY BY FORMULA QUERY BY FORMULA インデックスを使⽤しないシーケンシャル検索 インデックス検索 サーバー側でフォーミュラを評価 ⾃動的にJOINを実⾏

    クライアント側でフォーミュラ式を評価 レコード1件ずつクライアントに転送 JOINを定義して使⽤ 以前のアドバイス : 
 利⽤は慎重に,できる限りQUERY SELECTIONで対応 現在のアドバイス : v11の主要強化ポイントのひとつ 積極的に使⽤するべき! QUERY SELECTION BY FORMULA ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  68. EXECUTE ON CLIENT EXECUTE ON CLIENT REGISTER CLIENT(name;period) REGISTER CLIENT(name)

    ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  69. EXECUTE ON CLIENT EXECUTE ON CLIENT REGISTER CLIENT(name;period) REGISTER CLIENT(name)

    登録後,クライアントは定期的に,デ フォルトでは2秒毎に,サーバー あるいは別のクライアントから 呼び出されているか問い合わせる サーバーは必要なときに実⾏リクエスト を直接クライアントに送信する ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  70. EXECUTE ON CLIENT EXECUTE ON CLIENT REGISTER CLIENT(name;period) REGISTER CLIENT(name)

    登録後,クライアントは定期的に,デ フォルトでは2秒毎に,サーバー あるいは別のクライアントから 呼び出されているか問い合わせる サーバーは必要なときに実⾏リクエスト を直接クライアントに送信する PULLモード PUSHモード ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  71. EXECUTE ON CLIENT EXECUTE ON CLIENT REGISTER CLIENT(name;period) REGISTER CLIENT(name)

    登録後,クライアントは定期的に,デ フォルトでは2秒毎に,サーバー あるいは別のクライアントから 呼び出されているか問い合わせる サーバーは必要なときに実⾏リクエスト を直接クライアントに送信する PULLモード PUSHモード ⼤量リクエストの可能性 必要最低限のリクエスト数 ߟ͑ํΛϦηοτ͢Δ you must unlearn what you have learned
  72. $reference:=[Customer]Reference PUSH RECORD([Customer]) QUERY([Customer];[Customer]Reference=$reference) $nb:=Records in selection([Customer]) POP RECORD([Customer]) If

    ($nb=0) //do something end if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  73. $reference:=[Customer]Reference PUSH RECORD([Customer]) QUERY([Customer];[Customer]Reference=$reference) $nb:=Records in selection([Customer]) POP RECORD([Customer]) If

    ($nb=0) //do something end if $reference:=[Customer]Reference $recNum:=Find in field([Customer]Reference;$reference) If ($recNum>=0) //do something End if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  74. $reference:=[Customer]Reference PUSH RECORD([Customer]) QUERY([Customer];[Customer]Reference=$reference) $nb:=Records in selection([Customer]) POP RECORD([Customer]) If

    ($nb=0) //do something end if $reference:=[Customer]Reference $recNum:=Find in field([Customer]Reference;$reference) If ($recNum>=0) //do something End if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… Find in field でバッチリ解決! ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  75. $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday PUSH RECORD([Customer]) QUERY([Customer];[Customer]firstName=$firstName;*) QUERY([Customer];[Customer]lastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) $nb:=Records in

    selection([Customer]) POP RECORD([Customer]) If ($nb=0) //do something End if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  76. $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday PUSH RECORD([Customer]) QUERY([Customer];[Customer]firstName=$firstName;*) QUERY([Customer];[Customer]lastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) $nb:=Records in

    selection([Customer]) POP RECORD([Customer]) If ($nb=0) //do something End if $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday SET QUERY DESTINATION(Into variable;$nb) QUERY([Customer];[Customer]FirstName=$firstName;*) QUERY([Customer];[Customer]LastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) SET QUERY DESTINATION(Into current selection) If ($nb=0) //do something End if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  77. $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday PUSH RECORD([Customer]) QUERY([Customer];[Customer]firstName=$firstName;*) QUERY([Customer];[Customer]lastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) $nb:=Records in

    selection([Customer]) POP RECORD([Customer]) If ($nb=0) //do something End if $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday SET QUERY DESTINATION(Into variable;$nb) QUERY([Customer];[Customer]FirstName=$firstName;*) QUERY([Customer];[Customer]LastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) SET QUERY DESTINATION(Into current selection) If ($nb=0) //do something End if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… SET QUERY DESTINATION 
 カレントセレクション・レコードを変更せずにクエリを実⾏ ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  78. $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday PUSH RECORD([Customer]) QUERY([Customer];[Customer]firstName=$firstName;*) QUERY([Customer];[Customer]lastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) $nb:=Records in

    selection([Customer]) POP RECORD([Customer]) If ($nb=0) //do something End if $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday SET QUERY DESTINATION(Into variable;$nb) QUERY([Customer];[Customer]FirstName=$firstName;*) QUERY([Customer];[Customer]LastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) SET QUERY DESTINATION(Into current selection) If ($nb=0) //do something End if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday SET QUERY LIMIT(1) SET QUERY DESTINATION(Into variable;$nb) QUERY([Customer];[Customer]FirstName=$firstName;*) QUERY([Customer];[Customer]LastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) SET QUERY DESTINATION(Into current selection) SET QUERY LIMIT(0) If ($nb=0) //do something End if SET QUERY DESTINATION 
 カレントセレクション・レコードを変更せずにクエリを実⾏ ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  79. $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday PUSH RECORD([Customer]) QUERY([Customer];[Customer]firstName=$firstName;*) QUERY([Customer];[Customer]lastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) $nb:=Records in

    selection([Customer]) POP RECORD([Customer]) If ($nb=0) //do something End if $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday SET QUERY DESTINATION(Into variable;$nb) QUERY([Customer];[Customer]FirstName=$firstName;*) QUERY([Customer];[Customer]LastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) SET QUERY DESTINATION(Into current selection) If ($nb=0) //do something End if PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… $firstName:=[Customer]FirstName $lastName:=[Customer]LastName $birthday:=[Customer]Birthday SET QUERY LIMIT(1) SET QUERY DESTINATION(Into variable;$nb) QUERY([Customer];[Customer]FirstName=$firstName;*) QUERY([Customer];[Customer]LastName=$lastName;*) QUERY([Customer];[Customer]Birthday=$birthday) SET QUERY DESTINATION(Into current selection) SET QUERY LIMIT(0) If ($nb=0) //do something End if SET QUERY LIMIT 
 0 でリミットを解除 SET QUERY DESTINATION 
 カレントセレクション・レコードを変更せずにクエリを実⾏ ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  80. $reference:=[Customer]Reference PUSH RECORD([Customer]) QUERY([Customer];[Customer]Reference=$reference) $firstName:=[Customer]FirstName $lastName:=[Customer]LastName POP RECORD([Customer]) //do something

    with $firstName, $lastName ... PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  81. $reference:=[Customer]Reference PUSH RECORD([Customer]) QUERY([Customer];[Customer]Reference=$reference) $firstName:=[Customer]FirstName $lastName:=[Customer]LastName POP RECORD([Customer]) //do something

    with $firstName, $lastName ... $reference:=[Customer]Reference $firstName:="" $lastName:="" Begin SQL select FirstName, LastName from Customer where Reference=:$reference into :$firstName, :$lastName End SQL //do something with $firstName, $lastName ... PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  82. $reference:=[Customer]Reference PUSH RECORD([Customer]) QUERY([Customer];[Customer]Reference=$reference) $firstName:=[Customer]FirstName $lastName:=[Customer]LastName POP RECORD([Customer]) //do something

    with $firstName, $lastName ... $reference:=[Customer]Reference $firstName:="" $lastName:="" Begin SQL select FirstName, LastName from Customer where Reference=:$reference into :$firstName, :$lastName End SQL //do something with $firstName, $lastName ... PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… SQL カレントセレクション・レコードを 変更せずにレコードの値を取り出すことができる ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  83. $reference:=[Customer]Reference PUSH RECORD([Customer]) QUERY([Customer];[Customer]Reference=$reference) $firstName:=[Customer]FirstName $lastName:=[Customer]LastName POP RECORD([Customer]) //do something

    with $firstName, $lastName ... $reference:=[Customer]Reference $firstName:="" $lastName:="" Begin SQL select FirstName, LastName from Customer where Reference=:$reference into :$firstName, :$lastName End SQL //do something with $firstName, $lastName ... PUSH / POP ロジックはとても⾼価な処理 セレクション変更・クエリ・メモリの読み書き… SQL カレントセレクション・レコードを 変更せずにレコードの値を取り出すことができる 別⾔語の使⽤は⾃由! ελοΫ͸่͍͔ͭյ͢Δ at the end, house of cards falls
  84. QUERY([Customer];[Customer]LastName="Skywalker") CREATE SET([Customer];"SkywalkerFamilly") SET QUERY DESTINATION(Into set;"SkywalkerFamilly") QUERY([Customer];[Customer]LastName="Skywalker") SET QUERY

    DESTINATION(Into current selection) QUERY+CREATE SET: 2度のネットワーク通信・ カレントセレクションの変更・カレントレコードの 変更・カレントレコードのロック ஌͕ࣝߦ࿏Λ੾Γ։͘ a little more knowledge lights our way
  85. QUERY([Customer];[Customer]LastName="Skywalker") CREATE SET([Customer];"SkywalkerFamilly") SET QUERY DESTINATION(Into set;"SkywalkerFamilly") QUERY([Customer];[Customer]LastName="Skywalker") SET QUERY

    DESTINATION(Into current selection) QUERY+CREATE SET: 2度のネットワーク通信・ カレントセレクションの変更・カレントレコードの 変更・カレントレコードのロック SET QUERY DESTINATION+QUERY: 1度の ネットワーク通信・セットを作成するだけ ஌͕ࣝߦ࿏Λ੾Γ։͘ a little more knowledge lights our way
  86. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("parameters") ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  87. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("parameters") "parameters" はグローバルセマフォ ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  88. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("parameters") "parameters" はグローバルセマフォ "<>arrayParameters" は インタープロセス変数 ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  89. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("parameters") "parameters" はグローバルセマフォ "<>arrayParameters" は インタープロセス変数 サーバー側で管理 ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  90. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("parameters") "parameters" はグローバルセマフォ "<>arrayParameters" は インタープロセス変数 サーバー側で管理 クライアント側で管理 ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  91. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("parameters") "parameters" はグローバルセマフォ "<>arrayParameters" は インタープロセス変数 サーバー側で管理 クライアント側で管理 ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  92. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("parameters") 貴様はテロリストか ! "parameters" はグローバルセマフォ "<>arrayParameters" は インタープロセス変数 サーバー側で管理 クライアント側で管理 ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  93. While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("parameters")

    ARRAY TEXT(<>arrayParameter;0) ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  94. While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("parameters")

    ARRAY TEXT(<>arrayParameter;0) While (Semaphore("$parameters";500)) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("$parameters") ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  95. While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("parameters")

    ARRAY TEXT(<>arrayParameter;0) While (Semaphore("$parameters";500)) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("$parameters") "$parameters" はローカルセマフォ ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  96. While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("parameters")

    ARRAY TEXT(<>arrayParameter;0) While (Semaphore("$parameters";500)) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("$parameters") "$parameters" はローカルセマフォ クライアント側で管理 ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  97. While (Semaphore("parameters")) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("parameters")

    ARRAY TEXT(<>arrayParameter;0) While (Semaphore("$parameters";500)) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue) CLEAR SEMAPHORE("$parameters") "$parameters" はローカルセマフォ クライアント側で管理 セマフォがセットされるまで500tick待機する ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  98. ARRAY TEXT(<>arrayParameter;0) While (Semaphore("$parameters";500)) IDLE End while APPEND TO ARRAY(<>arrayParameter;$newValue)

    CLEAR SEMAPHORE("$parameters") "$parameters" はローカルセマフォ クライアント側で管理 セマフォがセットされるまで500tick待機する 型をしっかり憶えましょう 🙂 ௜໧ͷதʹ஌ܙ͕͋Δ the sounds of silence, respect you must
  99. //$sum:=Array_Sum(->myArray) C_POINTER($1;$array) C_REAL($0) $array:=$1 ASSERT(\ (Type($array->)=Real array)\ | (Type($array->)=LongInt array)\

    | (Type($array->)=Integer array)\ ;"Array must be a numeric") $sum:=0 For ($i;1;Size of array($array->)) $sum:=$sum+$array->{$i} End for $0:=$sum ࣗຫͷ൚༻ϝιουΛஅࣺ཭ kill good old generic
  100. //$sum:=Array_Sum(->myArray) C_POINTER($1;$array) C_REAL($0) $array:=$1 ASSERT(\ (Type($array->)=Real array)\ | (Type($array->)=LongInt array)\

    | (Type($array->)=Integer array)\ ;"Array must be a numeric") $sum:=0 For ($i;1;Size of array($array->)) $sum:=$sum+$array->{$i} End for $0:=$sum $sum:=Sum(myArray) ࣗຫͷ൚༻ϝιουΛஅࣺ཭ kill good old generic
  101. //$sum:=Array_Sum(->myArray) C_POINTER($1;$array) C_REAL($0) $array:=$1 ASSERT(\ (Type($array->)=Real array)\ | (Type($array->)=LongInt array)\

    | (Type($array->)=Integer array)\ ;"Array must be a numeric") $sum:=0 For ($i;1;Size of array($array->)) $sum:=$sum+$array->{$i} End for $0:=$sum $sum:=Sum(myArray) v13以降,"Sum" "Min" "Max" などの統計関数は配列に対応 ࣗຫͷ൚༻ϝιουΛஅࣺ཭ kill good old generic
  102. //ReadWrite(->table) C_POINTER($1;$table) $table:=$1 If (Read only state($table->)) READ WRITE($table->) End

    if ReadWrite(->[Contact]) ൚༻ϝιουΛ࠶ධՁ kill good old generic, you can
  103. //ReadWrite(->table) C_POINTER($1;$table) $table:=$1 If (Read only state($table->)) READ WRITE($table->) End

    if ReadWrite(->[Contact]) v2004では,サーバーをコールしたので, READ WRITEを実⾏する前に 状態を調べることは有⽤だった ൚༻ϝιουΛ࠶ධՁ kill good old generic, you can
  104. //ReadWrite(->table) C_POINTER($1;$table) $table:=$1 If (Read only state($table->)) READ WRITE($table->) End

    if ReadWrite(->[Contact]) READ WRITE([Contact]) v2004では,サーバーをコールしたので, READ WRITEを実⾏する前に 状態を調べることは有⽤だった ൚༻ϝιουΛ࠶ධՁ kill good old generic, you can
  105. //ReadWrite(->table) C_POINTER($1;$table) $table:=$1 If (Read only state($table->)) READ WRITE($table->) End

    if ReadWrite(->[Contact]) READ WRITE([Contact]) v2004では,サーバーをコールしたので, READ WRITEを実⾏する前に 状態を調べることは有⽤だった v11以降,リクエストがサーバーに 送信されるまでREAD WRITEは 保留されるようになったのでこれで良い ൚༻ϝιουΛ࠶ධՁ kill good old generic, you can
  106. //ReadWrite(->table) C_POINTER($1;$table) $table:=$1 If (Read only state($table->)) READ WRITE($table->) End

    if ReadWrite(->[Contact]) READ WRITE([Contact]) v2004では,サーバーをコールしたので, READ WRITEを実⾏する前に 状態を調べることは有⽤だった v11以降,リクエストがサーバーに 送信されるまでREAD WRITEは 保留されるようになったのでこれで良い 毎回のアップグレード後に必ずチェックするべき項⽬のひとつ ൚༻ϝιουΛ࠶ධՁ kill good old generic, you can
  107. //ReadWrite(->table) C_POINTER($1;$table) $table:=$1 If (Read only state($table->)) READ WRITE($table->) End

    if ReadWrite(->[Contact]) READ WRITE([Contact]) v2004では,サーバーをコールしたので, READ WRITEを実⾏する前に 状態を調べることは有⽤だった v11以降,リクエストがサーバーに 送信されるまでREAD WRITEは 保留されるようになったのでこれで良い 毎回のアップグレード後に必ずチェックするべき項⽬のひとつ 何年も開いていない汎⽤コードは腐った⾷品と同じ: 捨てるか運を天に任せるか ൚༻ϝιουΛ࠶ධՁ kill good old generic, you can
  108. //ReadWrite(->table) C_POINTER($1;$table) $table:=$1 If (Read only state($table->)) READ WRITE($table->) End

    if ReadWrite(->[Contact]) READ WRITE([Contact]) v2004では,サーバーをコールしたので, READ WRITEを実⾏する前に 状態を調べることは有⽤だった v11以降,リクエストがサーバーに 送信されるまでREAD WRITEは 保留されるようになったのでこれで良い 毎回のアップグレード後に必ずチェックするべき項⽬のひとつ 何年も開いていない汎⽤コードは腐った⾷品と同じ: 捨てるか運を天に任せるか 汎⽤コードがまとめられたコンポーネントも忘れずにチェックすること ൚༻ϝιουΛ࠶ධՁ kill good old generic, you can
  109. $ID_Process:=Execute on server("MySrvProcessMethod";0;"MySrvProcessMethod"+<>myLogin+"_"+string(<>customerID)) $ID_Process:=Execute on server("MySrvProcessMethod";0;"MySrvProcessMethod";<>myLogin;<>customerID) $ID_Process:=New process("MyProcessMethod";0;"MyProcessMethod"+<>myLogin+"_"+string(<>customerID)) プロセス名は容器ではありません $ID_Process:=New

    process("MyProcessMethod";0;"MyProcessMethod";<>myLogin;<>customerID) パラメーター群をサーバーに転送 明快なプロセス名 奇妙または気まぐれに考案された名前では将来のログ解析が困難に σλϥϝͳ໊લΛ෇͚ͳ͍ respect the name, you should
  110. $ID_Process:=Execute on server("MySrvProcessMethod";0;"MySrvProcessMethod"+<>myLogin+"_"+string(<>customerID)) $ID_Process:=Execute on server("MySrvProcessMethod";0;"MySrvProcessMethod";<>myLogin;<>customerID) $ID_Process:=New process("MyProcessMethod";0;"MyProcessMethod"+<>myLogin+"_"+string(<>customerID)) プロセス名は容器ではありません $ID_Process:=New

    process("MyProcessMethod";0;"MyProcessMethod";<>myLogin;<>customerID) パラメーター群をサーバーに転送 明快なプロセス名 奇妙または気まぐれに考案された名前では将来のログ解析が困難に 今⾵に,コンテキスト情報はオブジェクト1個で渡せば良い σλϥϝͳ໊લΛ෇͚ͳ͍ respect the name, you should
  111. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) ྨࣅ඼ʹ஫ҙ brothers but not twins …
  112. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while ྨࣅ඼ʹ஫ҙ brothers but not twins …
  113. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while "Execute on server" メソッドに引数を渡せば良い ྨࣅ඼ʹ஫ҙ brothers but not twins …
  114. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while "Execute on server" メソッドに引数を渡せば良い 1回にまとめられる ྨࣅ඼ʹ஫ҙ brothers but not twins …
  115. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while "Execute on server" メソッドに引数を渡せば良い 1回にまとめられる "息継ぎ"する時間がない ྨࣅ඼ʹ஫ҙ brothers but not twins …
  116. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while "Execute on server" メソッドに引数を渡せば良い 1回にまとめられる "息継ぎ"する時間がない パラメーターをコマンドに直接 渡すことは避けたほうが良い ྨࣅ඼ʹ஫ҙ brothers but not twins …
  117. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while //myReallyOptimizedMethodSrv $customer_ID:=$1 // 結果を計算する $result:=.... $0:=$result ྨࣅ඼ʹ஫ҙ brothers but not twins …
  118. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while //myReallyOptimizedMethodSrv $customer_ID:=$1 // 結果を計算する $result:=.... $0:=$result ྨࣅ඼ʹ஫ҙ brothers but not twins …
  119. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while //myReallyOptimizedMethodSrv $customer_ID:=$1 // 結果を計算する $result:=.... $0:=$result ྨࣅ඼ʹ஫ҙ brothers but not twins …
  120. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while //myReallyOptimizedMethodSrv $customer_ID:=$1 // 結果を計算する $result:=.... $0:=$result ྨࣅ඼ʹ஫ҙ brothers but not twins …
  121. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while //myReallyOptimizedMethodSrv $customer_ID:=$1 // 結果を計算する $result:=.... $0:=$result ྨࣅ඼ʹ஫ҙ brothers but not twins …
  122. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while //myReallyOptimizedMethodSrv $customer_ID:=$1 // 結果を計算する $result:=.... $0:=$result "Execute on server"コマンドは⾮同期コール ྨࣅ඼ʹ஫ҙ brothers but not twins …
  123. $process_srv_id:=Execute on server("myOptimizedMethodSrv";0;"myOptimizedMethodSrv") SET PROCESS VARIABLE($process_srv_id;customer_ID;$1) $calculation_launch:=True SET PROCESS VARIABLE($process_srv_id;calculation_launch;$calculation_launch)

    $calculation_finished:=False Repeat GET PROCESS VARIABLE($process_srv_id;calculation_finished;$calculation_finished) GET PROCESS VARIABLE($process_srv_id;Result;$Result) Until ($calculation_finished) $calculation_kill:=true SET PROCESS VARIABLE($process_srv_id;calculation_kill;$calculation_kill) // myOptimizedMethodSrv calculation_launch:=False calculation_finished:=False calculation_kill:=False customer_ID:=0 while( not(calculation_launch)) DELAY PROCESS(Current process;1) End while // 結果を計算する Result:=.... calculation_finished:=True While (Not(calculation_kill)) DELAY PROCESS(Current process;1) End while //myReallyOptimizedMethodSrv $customer_ID:=$1 // 結果を計算する $result:=.... $0:=$result "Execute on server"コマンドは⾮同期コール "サーバー上で実⾏"メソッド属性は同期コール ྨࣅ඼ʹ஫ҙ brothers but not twins …
  124. DESCRIBE QUERY EXECUTION(True) QUERY BY FORMULA([Flight];([Airport]IATA_AirportCode="SFO")\ & ([Flight]UUID_Line=[Line]UUID) & ([Line]UUID_Airport_To=[Airport]UUID))

    $path:=Get last query path(Description in text format) SET TEXT TO PASTEBOARD($path) DESCRIBE QUERY EXECUTION(False) ࢥͬͨΑ͏ͳ଎౓͕ಘΒΕͳ͍ͱ͖ʜ if no mistake have you made, yet losing you are …
  125. DESCRIBE QUERY EXECUTION(True) QUERY BY FORMULA([Flight];([Airport]IATA_AirportCode="SFO")\ & ([Flight]UUID_Line=[Line]UUID) & ([Line]UUID_Airport_To=[Airport]UUID))

    $path:=Get last query path(Description in text format) SET TEXT TO PASTEBOARD($path) DESCRIBE QUERY EXECUTION(False) クエリプランとクエリパスで視点をエンジンルーム内に移動 ࢥͬͨΑ͏ͳ଎౓͕ಘΒΕͳ͍ͱ͖ʜ if no mistake have you made, yet losing you are …
  126. DESCRIBE QUERY EXECUTION(True) QUERY BY FORMULA([Flight];([Airport]IATA_AirportCode="SFO")\ & ([Flight]UUID_Line=[Line]UUID) & ([Line]UUID_Airport_To=[Airport]UUID))

    $path:=Get last query path(Description in text format) SET TEXT TO PASTEBOARD($path) DESCRIBE QUERY EXECUTION(False) クエリプランとクエリパスで視点をエンジンルーム内に移動 優れたクエリを書くため,時には直感を働かせることも必要 ࢥͬͨΑ͏ͳ଎౓͕ಘΒΕͳ͍ͱ͖ʜ if no mistake have you made, yet losing you are …
  127. $id_progress:=Progress New Progress SET BUTTON ENABLED ($id_progress;True) Progress SET TITLE

    ($id_progress;"Update customers";0;"";True) ALL RECORDS([Customer]) $j:=0 $nb:=Records in table([Customer]) While (Not(End selection([Customer]))) & (Not(Progress Stopped ($id_progress))) $j:=$j+1 Progress SET PROGRESS ($id_progress;$j/$nb;[Customer]name) ///Կ͔͢Δ ... NEXT RECORD([Customer]) End while Progress QUIT ($id_progress) Mr Smith VAT rate ਐḿόʔͰ։ൃ΋αΫαΫ 4D helps your progress
  128. $id_progress:=Progress New Progress SET BUTTON ENABLED ($id_progress;True) Progress SET TITLE

    ($id_progress;"Update customers";0;"";True) ALL RECORDS([Customer]) $j:=0 $nb:=Records in table([Customer]) While (Not(End selection([Customer]))) & (Not(Progress Stopped ($id_progress))) $j:=$j+1 Progress SET PROGRESS ($id_progress;$j/$nb;[Customer]name) ///Կ͔͢Δ ... NEXT RECORD([Customer]) End while Progress QUIT ($id_progress) Mr Smith VAT rate $id_progress:=Progress New Progress SET BUTTON ENABLED ($id_progress;True) Progress SET TITLE ($id_progress;"Apply new parameter";0;"";True) ALL RECORDS([Param]) $j:=0 $nb:=Records in table([Param]) While (Not(End selection([Param]))) & (Not(Progress Stopped ($id_progress))) $j:=$j+1 Progress SET PROGRESS ($id_progress;$j/$nb;[Param]name) ///Կ͔͢Δ ... NEXT RECORD([Param]) End while Progress QUIT ($id_progress) ਐḿόʔͰ։ൃ΋αΫαΫ 4D helps your progress
  129. $id_progress:=Progress New Progress SET BUTTON ENABLED ($id_progress;True) Progress SET TITLE

    ($id_progress;"Update customers";0;"";True) ALL RECORDS([Customer]) $j:=0 $nb:=Records in table([Customer]) While (Not(End selection([Customer]))) & (Not(Progress Stopped ($id_progress))) $j:=$j+1 Progress SET PROGRESS ($id_progress;$j/$nb;[Customer]name) ///Կ͔͢Δ ... NEXT RECORD([Customer]) End while Progress QUIT ($id_progress) Mr Smith VAT rate $id_progress:=Progress New Progress SET BUTTON ENABLED ($id_progress;True) Progress SET TITLE ($id_progress;"Apply new parameter";0;"";True) ALL RECORDS([Param]) $j:=0 $nb:=Records in table([Param]) While (Not(End selection([Param]))) & (Not(Progress Stopped ($id_progress))) $j:=$j+1 Progress SET PROGRESS ($id_progress;$j/$nb;[Param]name) ///Կ͔͢Δ ... NEXT RECORD([Param]) End while Progress QUIT ($id_progress) おすすめ: 
 ループ10回毎に
 メソッドをコールする ਐḿόʔͰ։ൃ΋αΫαΫ 4D helps your progress
  130. C_POINTER($1;$2) C_LONGINT($nb_total) ARRAY TEXT($_result;0x0000) CLEAR VARIABLE($nb_total) $nb:=Size of array($1->) For

    ($i;1;$nb) If (Length($1->{$i})=0) Else APPEND TO ARRAY($_result;$1->{$i}) $nb_total:=$nb_total+1 End if End for COPY ARRAY($_result;$2->) ࣗ෼Ͱ΍Βͳ͍ͱؾ͕ࡁ·ͳ͍ don't keep a dog and bark yourself!
  131. C_POINTER($1;$2) C_LONGINT($nb_total) ARRAY TEXT($_result;0x0000) CLEAR VARIABLE($nb_total) $nb:=Size of array($1->) For

    ($i;1;$nb) If (Length($1->{$i})=0) Else APPEND TO ARRAY($_result;$1->{$i}) $nb_total:=$nb_total+1 End if End for COPY ARRAY($_result;$2->) がんばり過ぎ〜 $nb_total:=0 のほうが⾃然なのに この変数は要らないのでは $1->{$i}="" よりも 優れているのかなぁ? =0 / Else よりも #0 のほうが シンプルじゃないの? ࣗ෼Ͱ΍Βͳ͍ͱؾ͕ࡁ·ͳ͍ don't keep a dog and bark yourself!
  132. ΞϯτϫʔψɾυɾαϯʹςάδϡϖϦ Antoine de Saint Exupéry La perfection est atteinte, non

    pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer. ׬ᘳͱ͸͜ΕҎ্Ճ͑ΒΕͳ͍ͱ͖Ͱ͸ͳ͘ ͜ΕҎ্࡟ΓͱΕͳ͍ͱ͖ʹୡ੒͞ΕΔΑ͏ͩ ʰਓؒͷ౔஍ʱΑΓ Wind, Sand and Stars (1939)