問題タブ [forward-compatibility]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 緩和された range-for-loop をポータブルにサポート
C++17 は (おそらく) loop の範囲の定義を緩和しend()
、異なる型 (例: センチネル) を返せるようにします:
現在、これをサポートしているコンパイラは gcc 6.1 と clang 4.0+ (例) (エラー メッセージの例) のみです。センチネルが最後の型に対してより効率的な範囲型を作成している場合、コンパイラが緩和された範囲をサポートしているかどうかをどのように検出できますか? P0184R0 (上記のリンク) では、これに関する議論は見られません。機能テスト マクロは提供されますか?
その他の質問:
- コンパイラのサポートを検出する方法がある場合、
end()
メンバー関数の戻り値の型を変更しても (ライブラリにとって) 安全ですか? たとえば、センチネルを暗黙的にイテレータ型に変換できるようにする必要がありますか? - 逆に、C++17 より前のコンパイラの場合、センチネルを別の名前 (例:
sentinel()
) で公開する価値はありますか? C++17 より前のアルゴリズムは効率的に使用できます[begin(), sentinel())
か、それともコードを追加する価値はありませんか?
rest - 古いバージョンのエンティティ クラスを使用して、複雑な JPA エンティティの部分的な更新を実装する
私は概念的な問題を抱えており、誰かが答えてくれることを願っています。
私はすでに何を持っていますか?
単一タイプのエンティティに対して CRUD のような操作を提供する RESTful サービスがあります。エンティティ ( orderと呼びましょう) は、Jackson を使用して JSON として表されます。Jackson アノテーションはエンティティ クラスに直接アタッチされており、明確なデータ トランスポート レイヤーはありません。エンティティ クラスには、1 対 1 および 1 対多の関係など、多数の属性が含まれています。
技術的には、Wildfly 10、JAX-RS 2.0、および JPA 2.1 (Hibernate 5 を使用) に基づいています。
現在サポートされている操作は次のとおりです。
- GETを使用してエンティティを
orders/123
読み取りますEntityManager.find
- PUTは、またはを使用してエンティティ
orders/123
を作成または置換します。EntityManager.persist
EntityManager.merge
コードサンプル
エンティティの簡易バージョンは次のようになります。
JSON 表現は次のようになります。
私は何をしたいですか?
ここで、フィールドfield2をエンティティに追加しますOrder
。このサービスには複数のクライアント ( Client1とClient2 ) があります。
Client1はエンティティの更新を実行し、新しいフィールドに値newValueを与えます。
Client2は、新しいフィールドには関心がありません。したがって、Client2の新しいバージョンは開発されません。field1
ここで、の値をanotherNewValueの値に変更したいと考えています。新しいフィールドがわからないためfield2
、次の JSON をサービスに PUT します。
あるいは、Client1field2
はもう一度値を削除することを決定します。値が空になり、Jackson アノテーションによると空の値が含まれていないため、次の JSON が PUT されています。
何が問題ですか?
この解決策には深刻な問題 があります。エンティティの古い表現を使用しているクライアントは、不明なフィールドを誤って削除してしまいます。
基本的に、それは私にとって大きな問題である前方互換性を壊します!
考えられる解決策はいくつかありますが、それぞれに重大な欠点があります。
- エンティティの進化ごとに新しいバージョンのサービスを展開する: 簡単で確実に機能しますが、同時に維持する必要がある多数のバージョンが発生します。
- Use a specific media type for each version : これにより、クライアントは参照するエンティティのバージョンを指定できます。ただし、受信したエンティティ (どのフィールドがどのバージョンに存在するかを考慮して) とデータベース内のエンティティとの違いを手動でマージする必要があります。
- 部分的な更新を伴うパッチ: 問題を 2 つの問題に分けることができ
ます。
- パッチ (クライアント) を作成します。変更前と変更後のエンティティを手動で比較する必要があります。
- パッチを適用する (サーバー): データベースからエンティティを選択し、パッチを手動で適用する必要があります。
あなたの助けが欲しいところ
これはかなり一般的な問題だと思いますので、すでにこのようなことをしている方もいらっしゃると思います。具体的な質問があります: 1. 任意のオブジェクト ツリーにパッチを作成して適用できる Java ライブラリを知っている人はいますか (ソリューション 2 と 3 で必要)。2. 誰かがより簡単な解決策を持っていますか?
テキストが長くなって申し訳ありませんが、関連するすべての詳細を含めたかったのです。お時間をいただきありがとうございました!
google-cloud-messaging - FCM と GCM は下位互換性と上位互換性がありますか?
Google は、 Firebase Cloud Messagingを優先してGoogle Cloud メッセージングを廃止します。
Firebase Cloud Messaging (FCM) は、GCM の新しいバージョンです。信頼性と拡張性に優れた GCM インフラストラクチャに加えて、新機能を継承しています。詳細については、FAQ を参照してください。新しいアプリにメッセージングを統合する場合は、FCM から始めてください。GCM ユーザーは、現在および将来の新しい FCM 機能を利用するために、FCM にアップグレードすることを強くお勧めします。
サーバーで行ったいくつかのテストから、FCM URL ( https://fcm.googleapis.com/fcm/send ) は GCM プロジェクトで動作し、その逆も同様です - GCM URL ( https://android.googleapis.com /gcm/send ) は FCM プロジェクトで動作します。
既存のすべての GCM プッシュ送信コードを FCM に移行すると、多くの手間とリファクタリングを節約できます (プッシュごとに、アプリのバージョンが FCM か GCM かを確認する必要はありません)。
この下位互換性と上位互換性は公式にサポートまたは文書化されていますか?
assembly - シンボル名は、新しい NASM バージョンの新しいレジスタ名と競合しますか?
これを 10 年前 ( Intel MPXとbnd0
..bnd3
レジスターがロードマップに含まれる前) に書いたとします。
これを現在のバージョンの NASM でどのように組み立てることができますか? つまり、NASM (または YASM) には、新しいレジスタ名をサポートする新しいバージョンとの前方互換性がありますか?
明らかに、これは単一のファイルまたはプロジェクト内で検索/置換することで簡単に解決できます。しかし、理論的には、NASM からエクスポートするか、extern ymm0
. (外部シンボルを宣言する必要があるため、認識されないレジスタ名がシンボル参照にアセンブルされることはありません。)
_
NASM 構文は、シンボル名の前に を付けたり、他の種類の名前マングリングを実行したりしないプラットフォーム (Linux ELF など) では、C コンパイラ出力の形式として既に不適切です。global をコンパイルすることはできませんint eax = 1;
。 これが、AT&T 構文が%eax
レジスタ名に使用する理由です。その答えに関するコメントでの議論が、この質問に影響を与えたものです。GAS は外部シンボルを宣言する必要がないことに注意してください。認識されない名前はシンボルとして扱われます ( .intel_syntax noprefix
MASM に似た構文を使用するモードでも)。
関連: MASM は新しい拡張機能の前方ソース互換性をどのように処理しますか?
どうにかして MPX サポートを無効にすることはできますか?
YASM は、一部のニーモニックのサポートを無効にするCPU
ディレクティブymm0
をサポートしていますが、AVX サポートを無効にしても、シンボル名として使用することはできません。(YASM 1.3.0 は AVX512 または MPX をサポートしていないため、これらのレジスタ名をシンボルとして使用するコードをアセンブルできますが、AVX2 はサポートしています。)
私は得るyasm-CPU.asm:2: error: directive 'extern' requires an identifier parameter
。またはymm0: dd 123
、エラーはyasm-CPU.asm:2: error: label or instruction expected at start of line
しかし、AVX サポートは確実に無効になっています: アセンブルCPU Conroe
/vmovaps xmm0, [edi]
を与える:
(CPU 686
古い無効化された拡張機能については、または同様のように表示されます。IDK なぜ表示されないin CPU Sandybridge AVX
のですか。yasm は適切に保守されていないようです。YASM 1.3.0ではCPU Haswell
andがサポートされAVX2
ていますが、ドキュメントには記載されていません。)
この機能の目的は、SSSE3 以下の CPU の関数で誤って SSE4 命令を使用するのを防ぐことですが、明らかにこの問題には役立たないでしょう。
NASM のCPU
ディレクティブは似ているようで、まったく役に立ちません。
extern ymm0
ディレクティブの有無にかかわらず問題なくアセンブルCPU
されますが、オペランドとして使用するとすぐに問題が発生することに注意してください。