'sqr'atch-note

ちりはつもれど ちりぬるを

M3のMBPを買った

  • M3のMacBook Airが発売されるのを待とうと思っていたけど、MBAMacbook Proを比較したとき、別にMBAである必要性も無いなと分かったため、M3 MacBook Proを購入した。色はスペースグレイを選択した。
    • MBAを待たずにMBPを買った理由はいくつかあって、まずMBAは15インチだとしても実解像度は14インチのMBPの方が高く、MBPのみリフレッシュレート120Hzに対応しており、そしてSDカードスロットやHDMIポートも付いているため、MBPの方が利便性は高そうで、今後M3 MBAが発売するとなっても、この辺りの差異は変わらないだろうと思った。
    • さらに、15インチのMBAは1.5kgくらいあって、14インチMBPと変わらず、Airと言っても流石に15インチだからそこまで軽い訳では無い。
    • 価格的な面を考えてみても、MBAを今回購入したMBPと同等の構成(メモリ16GB、ディスク512GB)にした時、MBPとは2万円程度の差額しか発生しない。上記の機能を2万円程度で追加できるなら、安いものだと思う。
  • そういう訳で、MBPを購入。2018年まではMBP 2015を使っていて、2018〜2023年はWindowsのラップトップを使っていたため、3年ぶりにWindowsからmacOSに乗り換え。
    • ていうか、結構な頻度でラップトップ買い替えてるなあ・・・。自重したい。
    • 今回買ったMBPの構成は以下の通り。
    • 変更したのは、メモリサイズを8GB→16BGBに、キーボードをUS配列に、の2点だけ。
  • いま頑張って色々とセットアップ中。これに関しては別エントリを書きたいと思う。

2023秋 Drizzle Season振り返りと来シーズンの話

  • いつものように、スプラトゥーン3の2023秋 Drizzle Season振り返りをしようと思ったものの、今シーズンはあまりバイトもしてこなかったため、振り返ることが少ない。
    • 通常バイトは、野良カンストを目指したいなとまだ思ってるが、評価40から999まで上げるためには最低6時間以上必要なため、そういうまとまった時間を取れなくなったのが大きい。というのも、競プロをはじめ、色々その他にもやることが増えたため、単純にサモランに時間を割きづらくなった。言い換えれば、モチベーション低下かもしれない。
    • ただ、来シーズンのアップデートによって、取得しているバッジに応じてバイト開始時の評価値が400スタートなどのように変わるようになったので、来シーズンは野良カンスト未達のステージのカンストが出来るかもしれない。
  • で、来シーズンのアップデートで個人的に一番の目玉は、シオカラーズの冬コスが見られる特別なフェス。
  • ほんとこれ可愛すぎる。冬コスのシオカラーズが可愛すぎて、これは卑怯。追加コンテンツ課金不可避。

今月やってきたこと

まだ11月は終わってないけど、今月の振り返り。今月は主に次のことをやってた。

  1. GolangでTodoアプリの再実装
  2. Duolingo
  3. AtCoderで競プロ

GolangでTodoアプリの再実装

  • 『Go言語Webアプリケーション開発』のTodoアプリをハンズオン形式で一通り実装してみたものの、19章以降の部分からほとんど理解できなかったので、より理解するために本書のTodoアプリを書き直していた。
  • 再実装にあたっては、設計としては同じだけど、データの保存先をsqlite3にして、WebフレームワークEchoを使ってWeb GUIも追加しようと考えている。
  • 現状は、本書の18章データの永続化処理までを実装し直した状況。

Duolingo

  • Duolingoを使って英語の勉強を始めた。洋画を見る時に、もう少しまともに聞き取れるようになりたいなとちょっとだけ思ったため。
  • 本当は、英単語や熟語をたくさん覚えたいという方向性を考えていたけど、Duolingoはそういうサービスでは無く英語の基礎を学ぼうって感じのサービスなので、その目的は達成できず、このまま続けるかどうかは悩んでいる。と言いつつ、1レッスンが5分程度であり、Xを見てる無駄な時間の代わりにDuolingoやってたら、30日連続で遊んでいた。
    • もっと聞き取れるようになりたいとは思いつつも、そこまでモチベーションは高くないため、隙間時間で出来るのはありがたい。
    • 最初のセクションがあまりにも簡単過ぎて、1つ1つ進めるのはめんどくさかったので、セクション4まで飛び級をした。Duolingoには現状セクション6まであって、そこまで飛び級できそうだと思ったけど、飛ばしまくっても意味ないじゃないのかなと思い、セクション4からはレッスンを1つ1つ真面目にやっている。ただ、それから3週間経っても、進捗はまだユニット2が7割ほど。
    • セクション4は全部で30ユニットあるので、1日5分(1レッスン)だけやってくスタイルだと、やり終えるまでに1年以上かかるのでは?と思わないでもない。
  • 英語初心者でもないため、Duolingoは非常に簡単で、これをやるより英単語を覚えまくった方が色んな意味で手っ取り早いのではという気がする。もっとも、Xをダラダラと眺めてる時間よりかは有意義だと思いたい・・・。

AtCoderで競プロ

  • 先月から始めたAtCoderは、まだ継続しており、ほぼ毎週ABCに参加してる。
  • AB問題は、20分以内に解けるようになって、いまパフォーマンス的には280くらいの位置(ただ、コンテスト参加数が9回以下なので正式なレーティングは算出できてない)。ここからレーティングを120だけ伸ばして400(茶色)になるためにはC問題を解けるようになる必要がある。むしろ、AB問題を短時間で解けるようになるよりもC問題が解けるようになったほうがパフォーマンスは伸びるはず。
    • C問題は、問題文の通りに単純に実装してしまうと計算量が多くTLEになってしまうため、少し工夫が必要となってくる。が、現状その工夫部分が知識として身についてないので、時間内に解ききれない。過去問をたくさん解いてパターンを覚えていく必要があり、そのために時間がかかるだろうなと思っている。先月時点では1年後くらいに茶色になっていれば良いなという計画だったので、それよりも早くに達成しそうな雰囲気はある。
    • 過去問としてAtCoder Problemsの「Boot camp for Beginners」に取り組んでおり、今日までに32問解いた。 1日1問くらいのペースで最低限はやっているが、もう少し消化率を上げたい。

CLIでWebサイトのスクショを取る

developer.chrome.com

& "C:\Program Files\Google\Chrome\Application\chrome.exe" --headless --screenshot=C:\Users\noname\Pictures\sample.png https://google.com
  • 気をつける点は、Powershellで外部プログラムを実行する場合には&(アンパサンド)を先頭につけること。chrome.exeのパスが文字列として認識されてしまい、エラーとなる。もしくは、Start-Processコマンドでプログラムを実行する方法でも良い。

オプションについて

  • --headless=new
    • 上記公式ブログでは、新しいヘッドレスモードを利用するためには、newフラグを指定する必要があると書いてあるが、今回試したChrome 119では、フラグを指定すると逆に動かなかった。
    • また同ブログにはフラグ無しだと、古いヘッドレスモードが起動するとあるものの、新しいヘッドレスモード用のオプションは使えたので、もしかしたらフラグの設定は不要になって、デフォルト動作が新しいヘッドレスモードになったのかもしれない。しらんけど。
  • --screenshot
    • スクリーンショットを取得するオプション。このオプションと併用できる物として以下のものがある。
    • --window-size
      • --window-size=1920,1080のように指定して、スクショのサイズを変更できる
    • --timeout
      • ページのレンダリングを一定時間待ってからスクショを取るためのオプション
  • --print-to-pdf
    • WebサイトをPDFとして保存するオプション
      • Webサイトのフルサイズスクショを取りたい場合は、PDFとして出力したほうが良い。windows-sizeオプションでは絶対値で指定するので、足りなかったり余白が多くなったりしがち。

PythonSeleniumでスクショを取る

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless') ## ヘッドレスモードを指定
driver = webdriver.Chrome(options=options)

url = "https://www.python.org"
driver.get(url)

## ページの最大幅
page_width = driver.execute_script('return document.body.scrollWidth')
## ページの最大縦
page_height = driver.execute_script('return document.body.scrollHeight')

driver.set_window_size(page_width, page_height)

filename = url.translate(str.maketrans({':': '_', '/': None}))) #=> https_www.python.org
driver.save_screenshot(filename + '.png') ## => True
driver.quit()
  • このプログラムでは、ページのフルサイズスクショを取得し、指定されたURLをファイル名として保存する。
  • うーん、基本のコードなのであまり追加で説明することはない。実行環境は以下の通り。

『Goならわかるシステムプログラミング』読んだ

  • 2020年から低レイヤー(OS・カーネル)を学んでいて、ちょうどその頃はGolangに手を出したのもあって、一石二鳥な本だなと思って第1版を買ったものの、そのときはインターフェイスの理解が浅すぎたこともあり、io.Reader, io.Writerの章が殆ど分からず挫折して積読してしまっていた。今年9月からGolangの学習を再開してインターフェイスは前よりも分かったと思うので、積んであった本書をようやく読み直した。3年も寝かせている間に第2版が出たので、そちらを書い直して読んだ。
  • 本書は、Golangを用いたシステムプログラミング入門の本。
    • 文法の話は書かれていないが、Golangに限らずその他の言語に慣れていれば読み進めるのに支障はないと思う。システムプログラミングに興味がなくてもプログラマーであれば、OSに関する知識は持っていて損はないので、そういう意味ではプログラマー全員に向け?
    • 本書ではシステムプログラミングの意味として「OSの提供する機能を使ってプログラミングすることをシステムプログラミングと定義」(p.1)している。
    • じゃあ、OSが提供する機能とはなにかというと、プロセスの管理(生成、スケジューリング)、メモリ、CPU、ファイルシステム、ネットワーク通信といったものがあり、本書はHTTPサーバの実装を通じてTCP/UDPのネットワーク通信、そしてファイルシステム、プロセスの操作とプロセス間通信、メモリ管理を取り扱う。
    • ただし、それらを扱うのは5章以降であり、まずは2~4章でそれらOS機能を取り扱うためGolangに用意された抽象化レイヤーであるio.Writer、io.Reader、チャネルを解説している。本書を頭から読んでいくと、序盤が非常に抽象的で難しく感じると思うので、2~4章はまずはざっくり流し読みして、5章以降を読んでいろいろ試してから、2~4章を読み返すという読み方が良いかもしれない。
    • 本書には、加えて、Golangの特徴でもある並列処理の機能goroutineの解説も2章を割いてある。
  • 全19章もあって結構ボリュームがあり、5章以降の実際にOS機能をGolangで使ってみる部分がシステムプログラミングを題材とする本書のメインパートだと思うけど、個人的にはio.Writer, io.Readerとチャネルを解説する2~4章がけっこう重要な箇所だと思ってて、残りの章はそれら3機能を使った実践編みたいなイメージ。とはいえ、io.Writer, io.Readerインターフェイスとチャネルは抽象的な概念な感じがあって理解しづらい気がするので、実践編をやることで手を動かして理解が進むと思う。
    • io.Writer, io.Readerインターフェイスを使うことで、相手がプロセス、ネットワーク、ファイルシステムであったとしても、読み書きという処理で扱えるよう抽象化されてる。これは、Linuxがデバイスの操作、プロセス間通信、データ読み書きをすべてファイルへの読み書きとして抽象化しているというのとほぼ同じことなのかなと。
    • 正直、io.Writer/Readerが理解できたか?というと自信がないが、ひとまず読み書きをしたいとなったら、io.Writer/Readerインターフェイスを満たすものを準備して、Write()/Read()メソッドを呼び出せば良いという感じで一旦は理解した。
  • 本書の冒頭でも書いてあるが、システムプログラミングと言うと、システムコールを使ってプログラミングしていくというのがイメージが一般的。となると、特定のOSに縛られることになるけど、本書はクロスコンパイル可能なGolangを使ってLinuxWindowsのOSが提供する機能を統一的に扱っており(これがio.Reader/Writerインターフェイスの有り難さだと思う)、OSの機能を使うためのより汎用的な知識が身につけられるように思う。
    • システムコールを直接扱ってプログラミングする本は、Linuxに限って言うと『ふつうのLinuxプログラミング』があって、これは非常に面白いので、実際にシステムコールを使ったプログラミングをやってみたいと思ったら読んでみると良いかもしれない。

第4回クマフェス、野良カンスト成らず

  • 今回のクマフェスの最終評価は900。
  • WAVE3で納品数が足らず時間切れになったり、WAVE2や1で失敗が続いたりして840~900の間をウロウロしてしまった。
    • これまで過去のクマフェスで、低評価帯ならいざ知らず、800や900になっても納品数足りずに失敗しちゃうってのはあまり記憶にないなあ。
    • 低評価の場合は、納品数に対して、オオモノの湧きが少ないので、初期の湧きでちゃんと納品をするのを意識しないと納品が足りないのは割とある。でも、キケン度が上がっていくと、オオモノの湧きのほうが多くなるため、イクラが足りないってのは少なくて、処理が追いつかずに全滅とか、納品ができなくてタイムオーバーっていうパターンになっていく。
    • 今回、納品が足りなかった原因として、どうしても一つ一つがSPと同じくらい強力がブキが4つも配布されるので、みんな我先にオオモノを寄せも関係なく処理をしてしまい、納品が追いつかないという感じだった。
    • 海岸側で倒してしまうとコンテナ周りにイクラが足り無いけど、イクラ投げしてしまうと、クマブキのインク効率の悪さでインクがなく攻撃ができない状態に陥りがち。
  • 結構沼ってしまったけど、結局トータル114バイトをプレイした。12時間くらい?
    • 始める前は、流石に3時間位でやめようかなって思ってたのに、バイト評価が上がって行って、600を超えた辺りから楽しくなってしまった。
    • やっぱりクマブキの強さを実感できるのは、オオモノがたくさん湧いてくるようになって、わちゃわちゃしはじめてからだし、それが600以降。
  • あと今回、夜ウェーブの満潮泥シャケで納品数91個の個人最高記録が出て嬉しかった。
    • 満潮で、クマスロを持っている仲間がいて、さらに金泥シャケがコンテナ横に2~3回?湧いたおかげ。
  • 次回のクマフェスはまた3か月後?だとして、2月とかかな。

本日、クマフェス(4回目)

  • 本日17時から、サモランでオールクマブキのクマフェスが開催される。今回で第4回。
  • 9月開催のビッグランで、クマサン印のマニューバ(クマニューバ)が追加されて、2ヶ月ぶりにまたクマニューバが使えるということで、楽しみ。
    • アラマキ砦は、すでに通常シフトで野良カンストを達成しているので、あまり野良カンストまでやるぞっていうほどのモチベーションは薄いけど、強ブキばかりのシフトは楽しいので、たくさんオオモノを倒したい。
  • ただ、最近はバイト評価400(キケン度250%~)以上じゃないと楽しめなくなってしまったため、そろそろバイト評価が維持されるアップデート入ってくれないかなと思っている。
    • 前回シフトの最終評価から-200された評価が次回シフト開始時に維持される仕組みをイメージしてる。
    • 評価40から400に上げるのは、成功率90%以上でも3時間位かかるため地味につらい・・・。
  • このシフトが終わって次の大きなイベントとしては、12月から始まる新シーズンでのビッグランで、おそらく新しいおカシラシャケが追加されるんじゃないかな。そのタイミングで、そういう評価維持のシステムの追加もされたりしないかなあ。