はてなキーワード: blobとは
ChatGPTその物が正確な知識を持ってる訳ではないので、インターネット上に公開されてる情報をChatGPTに集めさせて要約させるのがコツ。
ChatGPTだと"o3"とかがそういう作業を得意としている。
「o3-pro + DeepResearch」だとか「Gemini 2.5 pro + DeepResearch」だとか"DeepResearch"の名前を冠した機能を使えばもうちょっと詳しい情報が出てくる。
質問の例
回答
--- ***▶︎ メーカーが公称する「スペック上の射程」** ** MP5 は 9 mm×19 パラベラム弾を使用し、銃身長は約 225 mm、初速はおおむね 400 m/s。H\&K 公式サイトではこの条件で弾頭エネルギーを約 650 J とし、*effective firing range*(最大有効射程)を **200 m** と示しています。([en.wikipedia.org][1], [heckler-koch.com][2]) --- ***▶︎ “射程”という言葉の食い違い** 1. **最大射程**:弾が空気中に留まり得る限界距離(安全係数なし)。 2. **最大有効射程**:設計上「命中率と停止力をまだ期待できる」ぎりぎりの距離。メーカーや軍規格が定義。 3. **実用射程(運用上のレンジ)**:訓練・装備・任務環境を前提に、部隊が日常的に想定する距離。 公称 200 m は②の概念であり、③とはしばしば乖離します。 --- ***▶︎ 9 mm パラ弾の弾道と威力変化(例:Federal American Eagle 115 gr FMJ)** ** **初速・初期エネルギー**:1180 ft/s ≒ 360 m/s、356 ft-lb ≒ 480 J。 ** **100 yd(約 91 m)時点**:速度 ≈ 960 ft/s、236 ft-lb ≒ 320 J。弾道は照準ラインから **-8.7 inch(-22 cm)** 下に落下(25 ydゼロ)。([federalpremium.com][3]) ** 200 m 付近になると落下量はおおむね 70 cm 以上、エネルギーも 300 J 前後まで低下し拳銃弾相当となります(計算値)。 ** 同じ 9 mm 弾でも弾頭重量・薬量で 50 J 以上変動するため、ここでは「典型的な練習弾」の例を採用。 ** なお、工場マニュアルは「25 m でも発射体は 1 マイル(1.6 km)以上飛び得る」と警告しています。([cdn.preterhuman.net][4]) --- ***▶︎ ゼロインと実戦での射撃距離** ** H\&K は出荷時に **25 m** でゼロイン(8 g NATO 弾、6 時照準)を調整。([en.wikipedia.org][1]) ** LAPD SWAT の MP5 資格コースは最長 **50 yd(≈ 46 m)**。講習・CQB ドリルも 0-50 m に集中しています。([lapdonlinestrgeacc.blob.core.usgovcloudapi.net][5]) ** 米海軍 SEAL/各国警察特殊部隊のマニュアルでも「点的射撃はおおむね 100 m 以内」を推奨とされる例が多数(公開講習資料・訓練要領より)。 --- ***▶︎ カタログ 200 m と CQB 50 m が離れる理由** ** **弾道補正**:200 m では 70 cm 以上の落下を想定して狙点を大きく上に取る必要がある。ダイオプター照準と短いサイト半径では現実的に困難。 ** **停止力の低下**:100 m で既にエネルギー約 320 J、200 m では拳銃以下。防弾ベスト(IIIA 相当)への貫通は運任せになる。 ** **任務特性**:MP5 の主要ユーザは法執行機関・対テロ部隊であり、建物内や車両制圧など **0-50 m** が大半。 ** **装備の世代交代**:100 m 超を担う火器は PDW(MP7 等)や 5.56 mm ショートカービンに置き換えが進み、MP5 は「最も扱いやすい短距離火器」として残った。 --- ***▶︎ 結論(要点整理)** ** **公称有効射程 200 m** は“当てられる上限”を示す設計値。 ** **実用射程**は多くの現場で **0-50 m**、遠くても **~100 m** が実情。 ** 9 mm 弾は **100 m を超えると弾道落下と威力低下が急激**。 ** MP5 の真価は「低反動・高精度・操作性」による CQB 性能であり、**200 m で戦うサブマシンガン**というイメージはスペックシート上の理論値に近い。 これらを踏まえると、MP5 を運用する際の最適距離は「**至近〜中距離(おおむね 50 m 以内)**」と考えるのが現場の常識と言えます。 [1]: https://en.wikipedia.org/wiki/Heckler_%26_Koch_MP5 "Heckler & Koch MP5 - Wikipedia" [2]: https://www.heckler-koch.com/en/Products/Military%20and%20Law%20Enforcement/Submachine%20guns/MP5?utm_source=chatgpt.com "MP5 - Heckler & Koch" [3]: https://www.federalpremium.com/handgun/american-eagle/american-eagle-handgun/11-AE9DP.html "Buy American Eagle Handgun 9mm Luger Ammo | 115 Grain, 1180 FPS | Federal" [4]: https://cdn.preterhuman.net/texts/wars_and_weapons/guns/Heckler%20%26%20Koch%20MP5%20Submachine%20Gun%20Operator%27s%20Manual.pdf?utm_source=chatgpt.com "[PDF] Heckler & Koch MP5 Submachine Gun Operator's Manual" [5]: https://lapdonlinestrgeacc.blob.core.usgovcloudapi.net/lapdonlinemedia/2022/07/Special_Weapons_and_Tactics_23000.pdf?utm_source=chatgpt.com "[PDF] LOS ANGELES POLICE DEPARTMENT Special Weapons and ..."
7と8。
技術的なところが気になる人はこれだけ読んでくれたらいい
最後に技術的な観点からエアレペルソナが純国産ではないということを指摘する。
RocketChatという海外で開発されたOSSチャットアプリをフォーク、改変したもののよう。
ttps://github.com/RocketChat/Rocket.Chat.ReactNative
ttps://rocket.chat
フォーク元はバリバリ多国籍、外資である。(RocketChat自体は問題のないアプリであり、このエアレペルソナとはフォーク関係を超える関係はないと思われる)
冒頭のこの部分に関してである。
ttps://play.google.com/store/apps/details?id=chat.airlex.reactnative
Google Playで公開されているエアレペルソナのAndroidアプリをリバースエンジニアリングして調べてみた。
ちなみに、エアレペルソナには利用規約のようなものは見当たらず、リバースエンジニアリング禁止条項も無いようだった。
ttps://apps.evozi.com/apk-downloader/
ttps://github.com/pxb1988/dex2jar
この辺を使ってapkをダウンロードし、apkを解凍し、chat.airlex.reactnative/classes.dexをjar fileに変換した。
classes.dexから変換されたjarファイルを展開するとchat/airlex/reactnativeというフォルダ、パッケージが見つかる。
このパッケージ内のファイル(.class、クラス)がエアレペルソナの処理を行うもののようである。
このクラスをJadを使い、デコンパイルしてみた。その結果が以下である。
ちなみにここからapkをアップロードするとdex2jarをしなくてもJavaのソースコードにまでデコンパイルしてくれた。便利。
package chat.airlex.reactnative; import android.content.Context; import com.ammarahmed.mmkv.SecureKeystore; import com.facebook.react.bridge.ReactApplicationContext; import com.tencent.mmkv.MMKV; public class Ejson { private String TOKEN_KEY = "reactnativemeteor_usertoken-"; String cardId; String host; String messageId; String messageType; /* access modifiers changed from: private */ public MMKV mmkv; String msg; String notificationType; String rid; Sender sender; String senderName; String type; public Ejson() { ReactApplicationContext reactApplicationContext = CustomPushNotification.reactApplicationContext; if (reactApplicationContext != null) { MMKV.initialize((Context) reactApplicationContext); new SecureKeystore(reactApplicationContext).getSecureKey(C0617Utils.toHex("com.MMKV.default"), new RNCallback() { public void invoke(Object... objArr) { if (objArr[0] == null) { MMKV unused = Ejson.this.mmkv = MMKV.mmkvWithID("default", 1, objArr[1]); } } }); } } public String getAvatarUri() { if (this.type == null) { return null; } return serverURL() + "/avatar/" + this.sender._id + "?rc_token=" + token() + "&rc_uid=" + userId(); } public String token() { String userId = userId(); MMKV mmkv2 = this.mmkv; return (mmkv2 == null || userId == null) ? "" : mmkv2.decodeString(this.TOKEN_KEY.concat(userId)); } public String userId() { String serverURL = serverURL(); MMKV mmkv2 = this.mmkv; return (mmkv2 == null || serverURL == null) ? "" : mmkv2.decodeString(this.TOKEN_KEY.concat(serverURL)); } public String privateKey() { String serverURL = serverURL(); MMKV mmkv2 = this.mmkv; if (mmkv2 == null || serverURL == null) { return null; } return mmkv2.decodeString(serverURL.concat("-RC_E2E_PRIVATE_KEY")); } public String serverURL() { String str = this.host; return (str == null || !str.endsWith("/")) ? str : str.substring(0, str.length() - 1); } public class Sender { String _id; String username; public Sender() { } } }
フィールド名を見てみると、cardId, host, messageId, messageType, mmkv, msg, notificationType, rid, sender, senderName, typeが存在する。
メソッドには、getAvaterUri、token、userId、privateKey、severURLが存在する。
ところで、RocketChatというOSSのチャットアプリが存在する。
ttps://rocket.chat
そのRoketChatのAndroid実装の中に同名のEjsonというクラスが存在する。
ttps://github.com/RocketChat/Rocket.Chat.ReactNative
ttps://github.com/RocketChat/Rocket.Chat.ReactNative/blob/develop/android/app/src/play/java/chat/rocket/reactnative/Ejson.java
見比べてみると、フィールドにcardIdが追加されている以外はフィールドやメソッド名、そしてその処理の内容まで一致している。
他にもReplyBroadcastなど、同様のクラスがエアレペルソナに見つかる。
以上のことからエアレペルソナはRocketChatをフォークして、パッケージ名を変えて作られたチャットアプリであり、開発の大部分はRocketChat社の努力と多数のOSSコントリビュータによってなされたものであると思われる。
そもそもこのOSS時代に純だの何だの言っている時点で怪しい。
さて、エアレペルソナがRocketChatをフォークして作られたものであるとすると、気になるのはライセンスである。
RocketChatのOSSライセンスはMITライセンスである。
ttps://github.com/RocketChat/Rocket.Chat.ReactNative/blob/develop/LICENSE
MITライセンスは非常に緩いライセンスであるため、エアレペルソナの様にフォークして別のアプリケーションとして公開することにはおそらく問題がないということは強調しておく。
現状エアレペルソナにログインできておらず(2要素認証のコードが送信されないといった問題が起きている模様)、使用している各OSSのライセンス表示が適切に行われているかまでは調べられていない。
あぁ、この話は 巨大なテーブル(カラムが多いとか、大きなデータが入ってるとか)を検索するよりも、小さなテーブルでサブクエリしたほうが速いこともあるって話で会ってBLOBの是非の話ではなかったり。
一番わかり易いのが巨大なBLOBだっただけ。
BLOBはできるだけ使わない方が良いと思うぞ?
BLOBかな?って書いてたら修正入ってたw