SVX日記
2024-09-01(Sun) ガンプラ、もとい、プラガン完成
エラくデキのいい木製パズルではあったが、所詮は割りバシ鉄砲の延長……などと考えながら、あれこれと見ていると、マルシン工業という会社のコルト・ガバメントM1911A1が目に入った。それにしても組み立てキットで15,000円とは……子供の頃に作ったプラモデルの10倍する。まぁ、ギリ出せないこともないけどもなぁ……と、ホビー通販のサイトに見にいくと、どれも25,000円オーバ……なんでッ!? 転売か!? ……とか、思いながら流れ着いたYouTubeの動画で謎が解けた。
これ系の商品は何年かに一度、再販され、その都度に仕様が少しグレードアップし、値段も上がるものらしい。で、今回の上げ幅が1万円だと……つうか、オフィシャルサイトの情報が値上げ前ってのはどうなのよ……と、そんなことよりも重要なことは、これ系の商品は再販の都度ほぼ瞬殺されるものらしいということだ……買わなければ3年後……いやいや、それにしても25,000円て。
しかし、さっき観たYouTubeの動画がよくなかった。サラッと観た感じ、ほぼ実銃と同じ部品構成っぽかったのだ。いや、ゲームで経験した範囲の話ではあるけれども、実際のパーツを手で感じながら組み立てられるなんて、それこそが是非とも経験しておきたいことだったんだよなぁ……うーむ……うーむ……うぅーむ……うぅー……ポチッ……やっちまった。シルバータイプ。残り1点だったんだし、仕方がないのだ。それはね。仕方のなかったことなのだ。うん。
すぐに届いた。まずは、組み立て説明書を見ながら、部品が揃っているかの確認だけする。似たようなピンやスプリング部品が多いので、頭から順に組み立てると取り違えをしそうだからだ。しかし、この時点で驚愕。本当に、ほとんど実銃と同じ部品構成なのだ。本体はプラスチックだが、それ以外、ほとんどが金属パーツ。本体のプラスチックも恐ろしく硬質で、ステンレスを模したメッキも強靭。容易に削れたり剥がれたりしそうにない。すごく高価なだけのことはあるなぁ。
自分はカメラもシルバーが好きなので、今回の銃でもシルバーを選んだが、シルバータイプはメッキを施す必要上、ボディのパーティングラインを消す加工が済んだ状態になっているようだ。文句のない仕上がり。ちょっと値段が高いのはそのせいか。
何日か寝かせた後、意を決して組み立てを開始する。初っ端は、エジェクタの組み立て、という工程。実銃にはない部品。小さな金属板を、金属ボディのスリットに入れ、2本の金属ピンで固定する、というだけの工程なのだが……軽く1時間以上かかった気がする。
もともと部品の精度はあまり良くない、と聞いていたが、金属パーツは目視ではわからない程度……0.05mmでもズレていれば入らないものは入らないのだ。ノギスはそういう世界のためにある。結局、金属板の方をヤスリで削って対応したが、金属板だけに容易には削れてくれなかった。工作の経験は多いほうだと自負しているが、いきなり想定外の事態だな、これは。
その後も、ほとんどの工程で苦戦する。むしろ部品の精度が高すぎてピンが入らないともいえるのか。図面からは容易に読み取れないコツも必要だったりするし。しかし、本当にやりたかったのはこれなんだよ。どの部品がどのバネに作用しているのか、体感できるのだ。なるほどなぁ。
しかし、慎重にやっても間違ってしまう。トリガが引けなくてはやり直し、ハンマが落とせなくてはやり直し、終いにはスライドを組み込んでも動きがシブすぎる……気づくと2時半を回っていた。疲労は作業品質を落とすし、ゴリ押しに向かいがちになる。グっとコラえて明日に回そう。
翌日。再び夜更けに始動する。自分でも不思議なほどだが、もう一度、始めからバラしてからやり直したいほどに気力が復活している。まぁ、疲労というのはそういうものだよね。それなりに仕組みもコツも頭に入っているので、丁寧かつ着実に組み立てが進む。意外なほどサクサクと完成。昨晩、マトモに動かなかったスライドも、納得できる程度の手応えで動作するようになった。
思ったよりもズッシリとした重量。それでも実銃の半分くらいの重さらしいが、これはなかなかの存在感である。組立の時にちょっとイラついてプラのヘラでコジってしまった部分もあるが、プラスチックもメッキも想像以上の強度を持っていたので、目立ったキズにはなっていない。初めてのモデルガンであり、反省点も多くあるが、それにしては悪くないデキである。
5発の模擬実包を弾倉へ装填する。あー、なんだか思い出すなぁ。見たら日記に書いてあったわ。撃った射撃場のサイトも見つかった。実包の装填からやらせてくれたんだよね。よく覚えていないが「9mmと45口径を16発ずつ」って書いてある。空薬莢をもらって持って帰ってきたが、見つからない。16発ずつも撃ったかなぁ。45口径を16発も装填できるハンドガンなんてあるのかね。撃ち切ってもう一度、装填したっけ? 撃ったのはガバだった可能性も高いが、そこまで覚えてないなぁ。
2024-09-06(Fri) あのぉ、あれ、なんつうの? ゼロもの?
ここのところ、歌のレッスンの課題曲は「ナイショの話」なのだが、その「化物語」の最新話は「キスショット・アセロラオリオン・ハートアンダーブレード」の誕生エピソードなんですよ、などという先生との雑談から「いわゆる、ナントカ・ゼロ」系の作品の始祖ってなんだろうね、という話になった。
・過去を振り返る「前日譚」(プリクエル)作品の最初はフランスの『人間喜劇』(19世紀)
・Fate/Zeroやマクロスゼロのように人気の確立後に作られる流れは2000年代から
おぉ。「前日譚」「プリクエル」。その言葉なんだよ知りたかったのは。Wikipediaも活用する。「プリクエル」は、続きを意味する「シークエル」に着想を得た造語らしい。「明日に向って撃て!」と「スターウォーズ」が著名な例として挙げられている。「明日に向って撃て!」は、ヒットしたが、主人公死亡エンドだったため、遡って続編を作ったパターンっぽい。「スターウォーズ」は、言われてみて気づいた。役に立つねぇ、AI。
1. 『ゴッドファーザー PART II』 (1974年)
2. 『インディ・ジョーンズ/魔宮の伝説』 (1984年)
3. 『レッド・ドラゴン』 (2002年)
4. 『スター・ウォーズ エピソード1/ファントム・メナス』 (1999年)
5. 『X-MEN: ファースト・ジェネレーション』 (2011年)
6. 『ホビット』 (2012-2014年)
7. 『モンスターズ・ユニバーシティ』 (2013年)
8. 『ローグ・ワン/スター・ウォーズ・ストーリー』 (2016年)
9. 『ハン・ソロ/スター・ウォーズ・ストーリー』 (2018年)
1. 『機動戦士ガンダム0083 STARDUST MEMORY』 (1991年)
2. 『エースをねらえ! ファイナルステージ』 (1989年)
3. 『新世紀エヴァンゲリオン 劇場版 DEATH & REBIRTH シト新生』 (1997年)
4. 『機動戦士ガンダム THE ORIGIN』 (2015年)
5. 『Fate/Zero』 (2011年)
6. 『コードギアス 亡国のアキト』 (2012年-2016年)
7. 『マクロス ゼロ』 (2002年)
8. 『テイルズ オブ ゼスティリア ザ クロス』 (2016年)
9. 『劇場版 ヴァイオレット・エヴァーガーデン』(2020年)
10. 『刃牙』シリーズ (2001年)
0083かぁ。知ってたけど、これも言われてみれば、だなぁ。それとは知らずに妙に作画のイイ、リックドムのシーンを見かけて、んなぁ!? と、驚いたことを思い出す。自分の記憶に限ってだが、確かにあれより前にはそういうスタイルの作品は見なかった気がするな。オイラ的にはイマイチだったけど「マクロス ゼロ」もだいぶ古いんだな。
・そういう作品は「プリクエル」と呼ばれる
・19世紀にフランスの群像劇に事例がある
・著名なのは1970年前後の西部劇「明日に向って撃て」と「スターウォーズ」
・アニメでは1990年の「ガンダム0083」
2024-09-07(Sat) 是弾不射、然火可発、撃ーッ!!
これはゼヒとも発火させないとイカンなぁ、ということで、火薬を手配して発火させてみた。純正の火薬は100発分で千円弱なので、撃つ分には気にせずパンパンできる程度のコストだ。
一応、銃の撃ち方的な動画を探し、正しい銃把の握り方、もう片方の手の添え方などを確認。せっかくなので初回からデジタルカメラで動画撮影してみる。一応、弾は本物と同じく7発装填できるらしいが、弾が5発しか付属していないので、5発すべてに火薬を仕込み、マガジンに装填する。それでは……イザッ!!
モノスゴイ音が出たら困るな、と思いながら、家の中で撃ったが、常識的な範囲の音だと思える。それにしても、反動は少ないのに、ちゃんとブローバックが再現できているところには心底感心する。火薬の匂いもイイなぁ。
最終弾は手で排莢させてしまったので、再度マガジンに詰める。以前に「ロシアンルーレットで勝負だッ!!」とオート拳銃を渡される、というギャグ漫画を見たことがあるが、一発だけに火薬を詰めたら、ロシアンルーレットできるじゃん、と思いながら、発火済みの弾もすべてマガジンに詰めて撃ってみた。すると最終弾で発火。スライドストップはかかったが、排莢には失敗。まぁ、でも、最初からこの調子なら十分だろう。
2024-09-10(Tue) RubyでDigest認証クライアントを作る
あれ。Rubyの標準ライブラリにはBasic認証の機能しかない。TLSの普及につれ、Digest認証が廃れて、Basic認証が復活してくる傾向とは思っていたが、相手サーバがDigest認証で固定なら、それに対応せざるをえない。
Digest認証が面倒なのは、認証に先立って相手からnonceというチャレンジコードをもらう必要があるので、最初に失敗アクセス(401:Unauthorized)を行うことが必須であることだ。Basic認証ならば、最初から認証情報を送ることができるので、失敗アクセスは必須ではない。
RFCを眺めつつ、既存のRubyのライブラリに近い使い勝手で実装する。できた。
require './http_digest_auth'
res = nil; auth_res = nil
uri = URI.parse('http://localhost:8080/digest/')
req = Net::HTTP::Get.new(uri.path)
3.times {
auth_res = req.digest_auth('username', 'password', res, auth_res)
res = Net::HTTP.start(uri.host, uri.port) {|http|
http.request(req)
}
puts(res.code)
res.code.to_i < 400 and break
}
puts(res.body)
既存のRubyのライブラリでBasic認証する場合のサンプルコードが以下なので、できるだけ近づけた。ただし、最初に失敗アクセスを行うことが必須なので、ループしたり、認証情報の引き渡したりする処理が入るのは仕方ない。逆に、上記のスタイルでもBasic認証は動く。
require 'net/http'
uri = URI.parse('http://localhost:8080/basic/')
req = Net::HTTP::Get.new(uri.path)
req.basic_auth('username', 'password')
res = Net::HTTP.start(uri.host, uri.port) {|http|
http.request(req)
}
puts(res.body)
require 'net/http'
require 'digest/md5'
class Net::HTTPGenericRequest
attr_accessor :secret_data
def digest_auth(username, passwd, res, auth_res = nil)
@nc ||= 0
@secret_data ||= 'secret-data'
@auth_res = auth_res || {}
if(res and res.header['www-authenticate'] =~ /Digest\s+(.+)/i)
$1.split(/,\s*/).each {|kv0|
kv = kv0.split(/\s*=\s*/, 2)
kv[1].strip =~ /^\"(.*)\"$/ and kv[1] = $1
@auth_res[kv[0]] = kv[1]
}
end
if(@auth_res['realm'])
ha1 = Digest::MD5.hexdigest('%s:%s:%s' % [username, @auth_res['realm'], passwd])
ha2 = Digest::MD5.hexdigest('%s:%s' % [method, path])
nc = '%08X' % [@nc += 1]
cnonce = Digest::MD5.hexdigest('%s:%s' % [Time.now.to_f, @secret_data])
qop = 'auth' # TODO
response = Digest::MD5.hexdigest('%s:%s:%s:%s:%s:%s' % [ha1, @auth_res['nonce'], nc, cnonce, qop, ha2])
auth_req = []
auth_req << 'username="%s"' % username
auth_req << 'realm="%s"' % @auth_res['realm']
auth_req << 'uri="%s"' % path
auth_req << 'algorithm=%s' % 'MD5' # TODO
auth_req << 'nonce="%s"' % @auth_res['nonce']
auth_req << 'nc=%s' % nc
auth_req << 'cnonce="%s"' % cnonce
auth_req << 'qop=%s' % qop
auth_req << 'response="%s"' % response
auth_req << 'opaque="%s"' % @auth_res['opaque'] if(@auth_res['opaque'])
@header['authorization'] = ['Digest ' + auth_req.join(', ')]
end
@auth_res
end
end
2024-09-11(Wed) RubyでDigest認証クライアントを作らせる
昨日、RubyでDigest認証クライアントを作ったわけだが、ふと、流行りのAIのお手並みでも拝見してみようかと思いついた。
もちろん、以下はRubyでHTTPクライアントとしてDigest認証を行い、HTMLを受
信する簡単なスクリプトの例です。このスクリプトでは、net/httpライブラリ
とnet/http/digest_authライブラリを使用します。
まず、必要なライブラリをインストールしてあることを確認してください。
require 'net/http'
require 'net/http/digest_auth'
require 'uri'
以下がスクリプトの例です:
require 'net/http'
require 'net/http/digest_auth'
require 'uri'
# 認証情報を設定
uri = URI('http://example.com/protected')
username = 'your_username'
password = 'your_password'
# ネットワーク接続の設定
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == "https")
# 初回リクエストを送信して、401 Unauthorizedレスポンスを受け取る
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
# Digest Auth用の認証ヘッダを作成
digest_auth = Net::HTTP::DigestAuth.new
auth_header = digest_auth.auth_header(uri, response['www-authenticate'], 'GET', username, password)
# 認証ヘッダを追加し、再度リクエストを送信
request = Net::HTTP::Get.new(uri.request_uri)
request['Authorization'] = auth_header
response = http.request(request)
# レスポンスの表示
puts response.body
このスクリプトでは、次のステップを行います:
抽出用にURIオブジェクトを作成し、認証情報を設定します。
最初のリクエストを送信して、401 Unauthorizedレスポンスを受け取ります。
401 UnauthorizedレスポンスからDigest認証用のヘッダ情報を取り出し、新
しいリクエストに対して認証ヘッダを作成します。
再度リクエストを送信して、認証後のページ内容(HTML)を取得します。
このスクリプトを実行する際は、適切なURL、ユーザー名、パスワードに置き
換えてください。また、サーバーがHTTPSを使っている場合は、http.use_ssl
をtrueに設定してください。
$ gem search digest | grep http
net-http-digest_auth (1.4.1)
$ bundle init
$ bundle add net-http-digest_auth
$ bundle exec ./digest_test
ArgumentError: wrong number of arguments (given 5, expected 3..4)
/home/user/develop/digest_auth/vendor/bundle/ruby/2.6.0/gems/net-http-digest_auth-1.4.1/lib/net/http/digest_auth.rb:76:in `auth_header'
/home/user/develop/digest_auth/digest_test:22:in `<top (required)>'
def auth_header uri, www_authenticate, method, iis = false
nonce_count = next_nonce
user = CGI.unescape uri.user
password = CGI.unescape uri.password
$ diff digest_test.org digest_test
9,10c9,10
< username = 'your_username'
< password = 'your_password'
---
> uri.user = 'your_username'
> uri.password = 'your_password'
22c22
< auth_header = digest_auth.auth_header(uri, response['www-authenticate'], 'GET', username, password)
---
> auth_header = digest_auth.auth_header(uri, response['www-authenticate'], 'GET')
そもそも、RubyGemsも探さずに、検索でもうまく見つけられなかった自分も不甲斐ないが、それ込みで回答内容には誤った部分はなく非常に有用だ。ちょっと悔しいくらいだな。コードの記述方法は自分が書いたスタイルのほうが圧倒的に美しいと思うが、それはライブラリに対する難クセであって、回答内容とは関係ない。あまり粘着するとラッダイト野郎になるしな。ここは素直に認めておこう。
2024-09-13(Fri) 「こんなんなったら、『いっき』じゃ!。」
ところが、筋トレとジョギングを始めて運動習慣が付いてからは、食っても容易には太らなくなったので、ドンブリメシを食えるようになった。50代からの食べ盛り。ウソのようだがホントの話。むしろそのくらい食わないとドンドン体重が落ちてしまう。見た目カッコイイ体を目指して始めた運動ではあるが、ストレスなくドンブリメシをカッ食らえるのも運動を継続する大きな理由だ。
が、ここにきて、なぜか米が売っていない。こうなるとすぐに「政府の無策がぁ〜」と日本政府政治依存症患者が騒ぎ出すが、どうせ原因はマスゴミの流言に惑わされた市民の「買いすぎ」だろう。交通量が設計の10%増で大渋滞になるのと同じく、需要が予測の10%増で大欠品になるのだ(たぶん)。
なぜかウチはいま「ジャスミン米」とかいうタイ米を食っていて、奇しくも「平成の米騒動」を思い出させるが(自分はタイ米が全然イヤじゃなかったけど)、この米は炊くだけでトウモロコシ系のモノスゴい甘い香りを発してウマいったらないのだ。「香り米」は高知で偶然に巡り合って驚愕し、取り寄せまでしたが、タイ米が元祖だったんだな。
require './TrueLegacyGraphicsCairo'
w = 240 << 2; h = 224 << 2
win = LegacyGraphics.new(nil, nil, nil, nil, h, w, 16, 8, nil, { :file => 'laster', :type => 'png' })
h.times {|y0|
y = (y0 << 2) + 3
win.line(0, y, w, y, 0)
}
win.refresh
win.close
2024-09-15(Sun) 核分裂って、マジでヤバくな〜い?
去年のいまごろ、会社が「勉強のためなら金を出してやる」とかいうので、大量に書籍を購入した。その中で特に大当たりだったのがサイモン・シンという著者の本だ。実にエリア88の傭兵のような名前であるが、関係はないようだ。別にミッキーでも風間でもないし、F-14にもドラケンにも乗っていないらしい。グレッグという友人はいるかもしれないが。
「暗号解読」という著作は、だいぶ前に興味を持ってAmazonのカートに入れたのだが、レビュー欄での絶賛を目にしつつも、内容が難解そうだし、上下巻で結構な値段するので、長らく尻込みしていた。んが、買ってくれるというなら、読んでみない理由はない。で、読んでみて驚いた。
続いて、数学者たちの楽園、宇宙創成(上)、フェルマーの最終定理、と読み進めた。どれも、ジャンル違いではあるが、やはり、難しそうな内容が、実に平易に解説してある。数学学会や宇宙学会の界隈の人間関係のゴタゴタまで書いてあり、実に示唆に富む内容である。
宇宙創成(下)はどうしたかというと、予算が尽きたので買わなかったのである。なんで他の本に優先して(下)を買わなかったのかといえば、万が一にも(上)にノれなかった場合に備えたのである。実際には一番に面白かったくらいだったのだが。もともと宇宙は好きだしな。
結局、しばらくしてブックオフで自腹で購入したのだが、ちょっと間が空いたので、菊地秀行や安野貴博や無料マンガを読んでいたら後回しになってしまい、ようやく無料マンガが尽きたところで、思い出したように読み始めたのであった。
んが、(下)はいきなり奇妙な展開である。巨大な宇宙の話なのに、微細な原子の話が始まるのである。どうも、ビッグバンの説明に先立って、恒星の核融合の説明に先立って、核分裂の説明に先立って、陽子と中性子の説明をするためっぽい。
改めて説明されると、核分裂についても、極めて曖昧な理解しかなかった自分に気づく。ラジウムは自然にラドンに変化し、その際に放射線と熱を発する。変化は緩やかに進行し、その半分が変化する時間が半減期だ。ラジウムの代わりにウランを用い、変化を急激に進行させるのが、原子力発電や原子力爆弾だ。
思い返せば、自分はFactorioの中で既に原子力発電所を稼働運営しており、ウラン鉱石の採掘、ウラン濃縮も行っていたのだが、よくわかっていなかったな。人間、何事もすべてを理解して物事を行っているわけではなく、よくわからないまま進めてしまうことはママあるわけだ。それは実際の原子力発電でもママあるんだぞ、きっと。
Q. 核分裂の概要についてギャル語で説明してください。
A. オッケー☆ 核分裂をギャル語で説明するとこんな感じかな~!
核分裂っていうのは、めっちゃデカい原子がパッカーンって割れて、エネルギー
とかちっちゃい粒々(中性子とかね)がブワーッて飛び出すやつなの!例えば、
ウランとかプルトニウムっていう原子が、ヤバいくらいに大きくて、不安定だ
から分裂しちゃうわけ!で、その時にヤバいエネルギーが出て、これを利用し
て発電とかしちゃってるって感じ~☆
カンタンに言えば、原子が「もう限界~!」って感じで割れて、そのエネルギー
で超スゴいことができるってこと!
Q. なにそれ、超わかりやすいじゃん! なんかAIってマジでヤバくな〜い?
A. ありがと〜☆ めっちゃ嬉しいんだけど!AIってほんとにヤバいよね〜!な
んか、サクッと何でも教えてくれるし、もう未来感ハンパないよね〜☆ 日常
のいろんなことも手伝ってくれるし、もうAIなしじゃ生きてけないかも〜って
思っちゃうわ♡
■ 横須賀のアランプロスト [モデルガンはストレスが溜まるんですよね~。 火薬のカスが付く。ジャムる。発火しないとかw そういえば、今年、クラ..]
■ フルタニアン(管理人) [アレコレ調べると、ジャムらないよう調整するのもモデルガンの楽しみだとか。 そういやキミもオイラも弓道が好きだし、飛..]