Yandex.MapsはAPIを倉曎したす。 クラスタヌ化ツヌルの埌方互換性を砎る必芁があったのはなぜですか

私はYandexで働いおおり、Yandexにはマップがあり、マップにはAPIがありたす。 APIは、WebサむトにYandexマップを埋め蟌むこずができるものです。 バヌゞョン2.0以降、APIはクラむアントでラベルをクラスタヌ化できたす。 クラスタリングの前埌のラベルは次のずおりです。



画像



先日、ベヌタバヌゞョン2.1.4の次のリリヌスが行われたした。 このリリヌスは、ボルシェビキが非垞に恐れおいたこずが起こったこずで泚目に倀したす。 譊告したように、タグクラスタリングの䞋䜍互換性を壊さなければなりたせんでした。



この蚘事では、バヌゞョン2.1.4でクラスタリングを䜿甚する際の革新をリストするだけでなく、これらの革新を生み出す必芁がある理由に぀いおも説明したす。 そしお、あなたはコヌドを曞き盎さなければなりたせん、そしお、あなたがあなたがこれをしなければならない理由を理解しないならば、コヌドを曞き盎すこずは悲しいです。



蚘事の内容

  1. ラベルの非同期远加をキャンセルしたすこのアむテムは、objectsaddtomapメ゜ッドを䜕らかの方法で䜿甚した人が読む必芁がありたす。
  2. パブリッククラスタリング方法を倉曎したす。
  3. カヌドをタむルに分割する方法を倉曎したすおそらく誰も気付かないでしょう。
  4. Cluster゚ンティティの名前をClusterPlacemarkに倉曎したすおそらく誰も気付かないでしょう。
  5. clusterer.balloonおよびclusterer.hintの倉曎クラスタヌバランを䜿甚した堎合、たたはクラスタヌにヒントを远加したい堎合は、読む䟡倀がありたす。
  6. 任意のクラスタヌアむコンを蚭定するこずは新しいこずですもし、ここで明らかな堎合は、読む䟡倀がありたす。
  7. プリセットオプションの埮調敎たたはホバヌ時のクラスタヌカラヌの倉曎方法。
  8. クラスタヌおよびクラスタヌ内のラベルのプレフィックスオプション。
  9. コヌドの違いの芁玄衚。
  10. バヌゞョンの速床の比范蚘事を玍埗させるため。


非同期タグ付けをキャンセルしたす。



バヌゞョン2.0では、ゞオオブゞェクトが䜜成され、マップに远加され、すぐに1぀のストリヌムでレンダリングされたした。 ブラりザが匱いほど、マップに远加するオブゞェクトが倚くなるほど、メッセヌゞが衚瀺される可胜性が高くなりたす。

画像

開発者のアントンは、この状況を科孊甚語「ザリポン」ず呌んでいたす。



マップ䞊のタグの数が倚い堎合、クラスタリングが䜿甚され始めたす。 たくさんのオブゞェクトがあるずき、これらの同じザリポンの問題が珟れたす。 䜕かを解決する必芁があり、クラスタヌ化では、デフォルトでマップぞのオブゞェクトの非同期远加を行うこずが決定されたした。 オブゞェクトがobjectsaddtomapむベントによっおマップに远加されたこずを理解できたした。 バヌゞョン2.0の䟋を次に瀺したす。



//      . //      , //       ,   //     . cluster.events.add('objectsaddtomap', function () { //       . var geoObjectState = cluster.getObjectState(myGeoObjects[1]); // ,        . if (geoObjectState.isShown) { //     ,      . if (geoObjectState.isClustered) { geoObjectState.cluster.state.set('activeObject', myGeoObjects[1]); geoObjectState.cluster.balloon.open(); } else { //      ,    . myGeoObjects[1].balloon.open(); } } });
      
      





これでの䜜業が非垞に䟿利だったずは蚀えたせん。 しかし、䜕もしないよりも䞍䟿です。ブラりザがぶら䞋がっおいるこずは、コヌドの矎しさよりも優れた議論です。



バヌゞョン2.1では、オブゞェクトの分離ずマップ䞊での衚瀺に向かっお歩きたした。 誰かがgetOverlayメ゜ッドが非同期で䞍䟿になっおいるこずに気づいたかもしれたせん-それだけです。 実際、レむアりトの非同期レンダリングは、マップにオブゞェクトを远加するプロセスを最適化する優れた方法です。



物事の本質をよりよく理解するために、ラベルが䜜成されおからマップに衚瀺される方法を芋おみたしょう。 プロセスは3぀の段階に分けるこずができたす。



第䞀に、説明は必芁ないず思いたす。 手順2ず3の違いは明確ではありたせん。 オブゞェクトをマップに远加するず、ラベルが芪コレクションほずんどの堎合map.geoObjectsに添付されたす。 タグは、地図投圱を含むこのコレクションからいく぀かのオプションを受け取りたす。 ラベルオブゞェクトは、マップがどの投圱で描画されおいるかを確認した埌、そのゞオメトリを平面に投圱できたすこれが実行されたす。 平面䞊のマヌクの座暙を投圱した埌、マヌクアむコンを描画するために画面䞊のどのピクセルポむントで必芁かが明らかになりたす。 この時点で、ステヌゞ2は終了したす。



3番目の段階は、特定のピクセル座暙で地図䞊にマヌクを描くプロセスです。 バヌゞョン2.1では、最初の2぀のステヌゞを1぀のスレッドで同期的に実行したす。 ただし、タむムアりトでオブゞェクトを描画したす。



したがっお、ラベルはずにかく非同期に描画されるため、クラスタヌ化ツヌルのロゞックを簡玠化し、マップぞのラベルの遅延远加を削陀するこずが可胜になりたした。 clustererにはsynchAddオプションがなくなり、察応するobjectsaddtomapむベントが消えたした。



぀たり、バヌゞョン2.1.4にアップグレヌドするには、objectsaddtomapむベントぞのサブスクリプションをコヌドから削陀する必芁がありたす。 このむベントのハンドラヌ内のすべおのコヌドは、オブゞェクトをクラスタヌ化ツヌルに远加した埌、すぐに同期しお実行できるようになりたした。 この蚘事の最埌に、「become-was」圢匏の䟋を瀺した衚を瀺したす。これ以䞊読みたくない堎合は、盎接アクセスできたす。



パブリッククラスタリング方法を倉曎する



バヌゞョン2.0では、クラスタヌ化ツヌルはymaps.Collectionオブゞェクトの子孫でした。 圌は、コレクションからadd、remove、setParentなどの必芁なメ゜ッド、およびgetIteratorなどの䞍芁なメ゜ッドを継承したしたこれらのメ゜ッドが䞍芁だった理由を説明したす。 clusterizerはそれ自䜓のコレクションであるように思われたす-オブゞェクトを远加し、オブゞェクトを削陀するこずができたす。 しかし、クラスタヌ化ツヌルにはいく぀かの芁玠が含たれるだけでなく、これらの芁玠をマップ䞊に衚瀺する堎合ず衚瀺しない堎合があり、远加のクラスタヌオブゞェクトも生成したす。



したがっお、各メ゜ッドの実装がどのようなものであっおも、あたり論理的ではありたせん。 远加したすべおのオブゞェクトを反埩凊理する必芁がありたす。 オブゞェクトずクラスタヌをりォヌクスルヌする必芁があるかどうか。 しかし、クラスタヌは垞に再構築されおいたす。 クラスタリングは完党なコレクションではないこずに気付きたした。 それはコレクションではありたせん。



珟圚、クラスタヌ化ツヌルには、オブゞェクトにアクセスするためのシンプルで明確なパブリックメ゜ッドがありたす。



ドキュメントでこれらのメ゜ッドの䜿甚䟋を探しおください。



マップをタむルに分割する方法を倉曎したす



ご存知のように、グリッドクラスタリングアルゎリズムを䜿甚したす詳现に興味がある人は誰でも-クラスタリングに぀いおの私の叀くからのスピヌチぞのリンクです。 アルゎリズムは単玔で矎しいためクラむアント䞊でオブゞェクトをクラスタヌ化する堎合、最初にコヌド実行の速床を考慮する必芁がありたす。



マップは正方圢のセルに分割されたした。 1぀のセルに分類されるラベルがクラスタヌを圢成したした。 各小さなマップドラッグで蚈算を行わないために、セルは倧きなクラスタヌに結合されたした。これを「クラスタヌタむル」ず呌びたす。 すべおのクラスタヌタむルが凊理され、マップの可芖領域が完党にたたは郚分的に萜ちたした。



画像



このバヌゞョンでは、「タむル」ずいう蚀葉の抂念を混同しないこずにしたした。 珟圚、クラスタヌタむルは通垞のカヌドタむルずたったく同じ堎所に配眮されおおり、サむズは垞に256x256ピクセルです。 これは制限を意味したす-クラスタリングセルのサむズは、a256以䞋、b敎数のクラスタリングセルがタむルに収たる必芁がありたす。 ぀たり、クラスタリングセルサむズの有効な倀は、2、4、8、16、32、64、128、および256です。



さお、良いニュヌスは-あなたが間違った倀を求めおも、私たちはそれを最も近い正しい倀に持っおいき、すべおがうたくいくでしょう。 なぜ私はこれをすべお曞いたのですか、あなたは尋ねたす。 はい、そのように。 誰かが興味を持぀かもしれたせんが、誰かがクラスタリング埌にマップ䞊の状況が少し倉わった理由を喜んで知るでしょう。



タむルは小さく、䞀般的に、マップの境界線はタむルの境界線ず䞀臎する可胜性があるため、マップの衚瀺領域に远加のむンデントmapViewport



デフォルトでは128ピクセルを導入したした。 ぀たり、垞に必芁以䞊に少し凊理されたす。 ただし、ナヌザヌは、マップを移動するずきに再構築に気付かないでしょう。



クラスタヌの名前をClusterPlacemarkに倉曎



私はい぀も、2、3人の人々私ず私たちのドキュメンタリヌのOlesyaだけがClusterがClustererずどのように異なるかを集䌚に䌝えるこずができるず疑っおいたした違いを理解すれば、あなたは玠晎らしい仲間です。



ドキュメントの異なるペヌゞでのクリック数を調査したした-ClustererおよびClusterペヌゞは非垞に人気がありたす。 そしお私は、クラスタヌをクリックする人々が残酷さず誀解の犠牲者であるず疑っおいたす。 そのため、Cluster゚ンティティの名前をClusterPlacemarkに倉曎するこずにしたした。 ClustererずClusterPlacemarkを芋るず、䜕が䜕であるかが明らかになるようです。



API Mapsクラブでは、クラスタヌをクラスタヌずは別に䜿甚するナヌザヌは衚瀺されなかったためサフィックスに泚意、この倉曎はたったく気付かれたせん。 たた、ClustererではなくClusterのドキュメントでの誀ったクリックは、過去をさかのがるはずです。 それにもかかわらず、Clusterオブゞェクトのドキュメントを読み、その損倱を芪友の損倱ずしお認識したい堎合は、ClusterPlacemarkのドキュメントをお読みください。



clusterer.balloonおよびclusterer.hintの倉曎



楜しい郚分から始めたしょう-最埌に、クラスタヌラベルにツヌルチップを衚瀺する機胜を远加したした。 このコヌドでこれを行うこずができたす

 var clusterer = new ymaps.Clusterer(); clusterer.createCluster = function (center, geoObjects) { //  -     . var clusterPlacemark = ymaps.Clusterer.prototype.createCluster.call(this, center, geoObjects), geoObjectsLength = clusterPlacemark.getGeoObjects().length, hintContent; if (geoObjectsLength < 10) { hintContent = ' '; } else if (geoObjectsLength < 100) { hintContent = '  '; } else { hintContent = ' '; } clusterPlacemark.properties.set('hintContent', hintContent); return clusterPlacemark; };
      
      





クラスタヌにはhintContent



フィヌルドがhintContent



おいないため、デフォルトではヒントは衚瀺されたせんマップ䞊には数字の付いた円がありたす。ずにかく蚀葉で説明しない方がいいです。 この倀の蚭定を開始するずすぐに、ヒントが衚瀺され始めたす。



䞀般的なヒントずバランの倉曎に぀いお。 バヌゞョン2.0の颚船を操䜜するために、各クラスタヌは.balloon



フィヌルドを䜜成したした。 cluster.balloon.open();



ように芋えるバルヌンを開く 。



この゜リュヌションの欠点は、コヌド実行の速床が遅いこずでした。 実際、100個のクラスタヌがある堎合、それぞれにバルヌンを蚭定できたす。぀たり、クラスタヌごずにcluster.balloon



フィヌルドにcluster.balloon



マネヌゞャヌを䜜成しお割り圓おる必芁がcluster.balloon



たす。 そのため、速床に関する䜜業の䞀環ずしお、バランの管理者ずクラスタリングのヒントを1人䜜成するこずが決定されたした。 これで、クラスタヌ䞊のバルヌンを次のように開くこずができたす。

 //     -. clusterer.balloon.open(clusterPlacemark);
      
      





バランを開くためのコヌドの倉曎の詳现に぀いおは、以䞋の芁玄衚を参照しおください。



カスタムクラスタヌアむコンの定矩-新機胜



バヌゞョン2.0では、すべおの地理オブゞェクトは同等でした。 しかし、いく぀かはより平等でした。 キャンバスに描かれたラベルは、アクティブな領域を通じおむンタラクティブ性を獲埗したした。 DOMを䜿甚しお描かれたラベルは、それ自䜓がむンタラクティブでした。 これにより、動䜜に違いが生じ、倚くの䞍䟿が生じたした。

したがっお、バヌゞョン2.1では、すべおのオブゞェクトをむベントの地平線の䞋にそれが䜕を意味するにせよ運ぶこずが決定されたした。 これで、マップの䞊郚にアクティブ゚リアが重ね合わされるため、すべおのマヌクがむンタラクティブになりたす。 このため、ラベルはアクティブ゚リアがラベルの䞊にある圢状ずサむズを瀺す必芁がありたすカヌ゜ルを倉曎する画像の郚分にカヌ゜ルを合わせるず、ラベルをクリックしおチェックする必芁がありたす。



暙準クラスタタグには、倧、䞭、小の3皮類の画像がありたす。 これらの写真は䞞いです。 マりスをクラスタヌラベル䞊に移動しようずするず、ラベルのアクティブな領域が画像ず䞀臎し、円でもあるこずがわかりたす。



画像画像画像



䞀郚のナヌザヌは、バヌゞョン2.1.3でクラスタヌアむコンの画像を眮き換えるずきに、アクティブな領域がただ䞞いたたであるこずに気付いおいたすラベルは、䞀般的には正方圢たたはさらに䞉角圢です。

画像

-カスタムラベル。ただし、円はずにかくクリック可胜でした。



これを修正し、ラベルのアクティブ領域の圢状を個別に決定できるようになりたした。 これをこのように行うこずができたす䞞マヌクの䟋。



 clusterer.options.set({ clusterIcons: [ { href: 'images/small.png', size: [20, 20], offset: [-10, -10], shape: new ymaps.shape.Circle(new ymaps.geometry.pixel.Circle([0, 0], 10)) }, { href: 'images/medium.png', size: [30, 30], offset: [-15, -15], shape: new ymaps.shape.Circle(new ymaps.geometry.pixel.Circle([0, 0], 15)) }, { href: 'images/big.png', size: [40, 40], offset: [-20, -20], shape: new ymaps.shape.Circle(new ymaps.geometry.pixel.Circle([0, 0], 20)) } ] });
      
      





コヌドは非垞に単玔ではないこずが刀明したため、代替アプロヌチがありたす-より単玔ですが、より粗いです。 アむコンの説明時に圢状パラメヌタヌを指定しない堎合、アむコンの䞊の長方圢の領域がアクティブになり、サむズずオフセットのパラメヌタヌに基づいお圢成されたす。 ぀たり、このようなコヌドも正垞に機胜し、アむコンの呚りの長方圢の領域のみがクリック可胜になりたす。

画像

画像は耇雑であるため、わざわざアむコンの呚囲の長方圢の領域をむンタラクティブにするこずはありたせん。 完璧䞻矩の皋床に応じお゜リュヌションを遞択しおください。



 clusterer.options.set({ clusterIcons: [ { href: 'images/small.png', size: [20, 20], offset: [-10, -10] }, { href: 'images/medium.png', size: [30, 30], offset: [-15, -15] }, { href: 'images/big.png', size: [40, 40], offset: [-20, -20] } ] });
      
      







別の小さな远加。 クラスタヌラベル内のコンテンツを衚瀺したくない堎合は、clusterIconContentLayoutオプションをnullに蚭定できたす。ラベルはclusterer.options.set('clusterIconContentLayout', null);



内に数字なしで衚瀺されclusterer.options.set('clusterIconContentLayout', null);







クラスタヌのプリセットのマむナヌリビゞョン



クラブAPIマップでは、「特定のクラスタヌにスタむルを蚭定する方法」ずいうトピックに関する質問がありたした。 option.presetStorageの説明に瀺されおいるキヌは、クラスタヌ化ツヌル党䜓に蚭定されおいる堎合にのみ機胜するため、この質問に察する適切な回答はありたせんでした。 しかし、単䞀のタグの堎合、これらのキヌは適合したせんでした。 このバヌゞョンでは、キヌがナニバヌサルになりたした-それらは、クラスタヌ化ツヌル党䜓ず特にクラスタヌラベルの䞡方に適しおいたす。



このようにホバヌするずクラスタヌの色を倉曎できたす。

 clusterer.events.add('mouseenter', function (e) { var target = e.get('target'); if (typeof target.getGeoObjects == 'function') { target.options.set('preset', 'islands#redClusterIcons'); } }); clusterer.events.add('mouseleave', function (e) { var target = e.get('target'); if (typeof target.getGeoObjects == 'function') { target.options.set('preset', 'islands#blueClusterIcons'); } });
      
      







クラスタヌおよびクラスタヌ内のラベルのプレフィックスオプション



クラスタ化ツヌルには、ラベルクラスタず、オブゞェクトのグルヌプに分類されなかった単䞀オブゞェクトの2皮類のオブゞェクトがありたす。 䞡方のオプションを蚭定するこずが必芁になる堎合がありたす。 誰も同じオプションを公開するためにすべおのラベルずクラスタヌを゜ヌトするこずを望たないこずは明らかです。 すべおのオブゞェクトのオプションを䞀床に蚭定するには、これらの同じオプションをクラスタヌ化ツヌルで1回指定したす。 そしお、クラスタヌ化ツヌルはこれらのオプションをその子オブゞェクトに枡したす。



特に、バヌゞョン2.0ではそうするこずができたしたclusterer.options.set('cursor', 'help');



カヌ゜ルは、単䞀オブゞェクトずクラスタヌラベルの䞡方で倉曎されたした。



奜奇心reader盛な読者は、「クラスタヌラベルずシングルラベルに異なる皮類のカヌ゜ルを蚭定したい堎合はどうすればいいですか」ず質問したす。このケヌスを想定し、クラスタヌラベルが「クラスタヌ」プレフィックスを持぀オプションも理解するこずを決定したした。



 clusterer.options.set({ //   . ursor: 'pointer', //   -. clusterCursor: 'help' });
      
      







このシステムでは、クラスタヌラベルに圱響を䞎えずに単䞀のラベルのみをカスタマむズしたい堎合を陀き、すべお問題ありたせんでした。 単䞀ラベルのオプションのみを倉曎したい堎合は、 clusterer.options.set('cursor', 'help');



そしお、それらは非垞に倧きな効果を埗たした-オプションは単䞀のオブゞェクトに拡匵され、クラスタヌにラベルを付けたす。 ぀たり、単䞀のラベルのみに圱響を䞎えたい堎合は、ずにかく単䞀のオブゞェクトずクラスタヌのオプションを蚭定する必芁がありたした。



バヌゞョン2.1では、もう少し䟿利になりたした。 これで、子オブゞェクトのすべおのオプションにプレフィックスが蚭定されたした。 プレフィックスが「cluster」のクラスタヌラベルの堎合、プレフィックスが「geoObject」の単䞀ラベルの堎合。 これで、子オブゞェクトのオプションは互いに独立しおいたす。 䞀番奜きなものを尋ねおください。



 //         . lusterer.options.set('geoObjectCursor', 'help');
      
      







倉曎の抂芁衚


だった になっおいたす
 //  1.    c  . //      , //       ,   //     . clusterer.events.add('objectsaddtomap', function () { //       . var geoObjectState = clusterer.getObjectState(myGeoObjects[1]); // ,       . if (geoObjectState.isShown) { //     ,       . if (geoObjectState.isClustered) { geoObjectState.cluster.state.set('activeObject', myGeoObjects[1]); geoObjectState.cluster.balloon.open(); } else { //      ,    . myGeoObjects[1].balloon.open(); } } });
      
      





 //  1.    c  . //       . var geoObjectState = clusterer.getObjectState(myGeoObjects[1]); // ,       . if (geoObjectState.isShown) { //     ,       . if (geoObjectState.isClustered) { geoObjectState.cluster.state.set('activeObject', myGeoObjects[1]); clusterer.balloon.open(geoObjectState.cluster); } else { //      ,    . myGeoObjects[1].balloon.open(); } }
      
      



 //  2.   -. var options = ymaps.option.presetStorage.get('islands#redClusterIcons'); cluster.options.set({ icons: options.clusterIcons, iconContentLayout: options.clusterContentLayout });
      
      



 //  2.   -. cluster.options.set('preset', 'islands#redClusterIcons');
      
      



 //  3.  -  . clusterer.options.set('clusterIconContentLayout', ymaps.templateLayoutFactory.createClass(''));
      
      



 //  3.  -  . clusterer.options.set('clusterIconContentLayout', null);
      
      



 //  4.       . lusterer.options.set({ clusterBalloonLayout: myClusterBalloonLayout, balloonLayout: myPlacemarkBalloonLayout });
      
      



 lusterer.options.set({ clusterBalloonLayout: myClusterBalloonLayout, geoObjectBalloonLayout: myPlacemarkBalloonLayout });
      
      





それ以倖の堎合、すべおは倉曎されたせんでした。 すべおの革新は、ドキュメントに蚘茉されおいたす。



バヌゞョン2.0.36および2.1.4でのクラスタヌ速床の比范



䞀床読んで信じないよりも䞀床芋たほうがいい。 枬定はどのように行われたしたか そのような堎合はサンプルずしお取られたした

 <!doctype html> <html> <head> <title>   </title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="http://api-maps.yandex.ru/2.0.36/?load=package.full &lang=ru-RU&ns=ym" type="text/javascript"></script> <script type="text/javascript"> ym.ready(function() { var map = new ym.Map('map', { center: [55.755381, 37.619044], zoom: 13 }), coords = [], center = [55.755381, 37.619044], placemarks = [], i; for (i = 0; i < 10000; i++) { coords[i] = [ center[0] + 0.5 * Math.random() * Math.random() * Math.random() * (Math.random() < 0.5 ? -1 : 1), center[1] + 0.7 * Math.random() * Math.random() * Math.random() * (Math.random() < 0.5 ? -1 : 1) ]; } var startTime = +new Date(); for (i = 0, l = coords.length; i < l; i++) { placemarks[i] = new ym.GeoObject({ geometry: { type: "Point", coordinates: coords[i] } }); } var clusterer = new ym.Clusterer(); clusterer.add(placemarks); map.geoObjects.add(clusterer); var stopTime = +new Date(); alert(stopTime - startTime); }); </script> </head> <body> <div id="map" style="height: 400px; width: 800px;"></div> </body> </html>
      
      







このコヌドは、埌方互換性が損なわれる点には圱響しないため、バヌゞョン2.0.36ずバヌゞョン2.1.4の䞡方で、リンクをAPIバヌゞョンに切り替えるだけで、倉曎なしで実行できたす。 時間はミリ秒単䜍で枬定されたした。

画像

IE11に぀いお発蚀したいず思いたす。 すべおのブラりザヌのテストは私のラップトップで実行し、IE11の堎合はWindowsを搭茉した別のラップトップで実行したしたMacbookを持っおいたす。 そのため、このスケゞュヌルで他のブラりザず䜜業速床を比范するこずは䟡倀がありたせん。 ただし、APIがバヌゞョンごずにどの皋床加速したかを評䟡する䟡倀がありたす。



重芁なのは、クラスタヌ化ずラベルを䜿甚しおカヌドの初期化時間を短瞮したこずだけです。 ブラりザはコヌドを実行し、息を吐き、レンダリングオブゞェクトに戻るこずができたす。 党䜓的な負荷はそれほど倉化したせんでした-それは時間ずずもに広がるだけで、アクションのいく぀かは埌で実行されたす。 それにもかかわらず、これは匱いブラりザヌにずっお重芁です-䞀床に1぀のスレッドで実行できずハングしたこずが、珟圚では時間ずずもに分散され、ブラりザヌはそのような負荷を凊理できたす。



おわりに



互換性の故障は、開発者の人生における小さな悲劇であるこずを理解しおいたす。 しかし、時間が経぀ず状況は倉わり、経隓を積んでナヌザヌからフィヌドバックを受け取りたす。 バヌゞョン2.0で倚くのこずを倉曎したかったのですが、䜕も倉曎しないこずを玄束したため、これはできたせんでした。



これで、新しいバヌゞョン2.1のリリヌスに関しお少し自由になりたした。 もちろん、さらに倉曎したかったのですが、倉曎できるのは小さなこずだけです3.0ではなく2.1のたたです。

むノベヌションが少なくずも開発の少しの助けになり、その利益がコヌドを曞き盎さなければならないずいう䞍䟿を克服するこずを願っおいたす。



蚘事の結末は前向きでなければならないず蚀われたので、これからの皆さんにお祝いを申し䞊げたす



All Articles