たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

第63回シェル芸勉強会に参加しました

第63回シェル芸勉強会

参加しました。今回は正規表現とか検索の回とのことでした。参加記として解答とPowerShell解を残しておきます。

当日の配信はこちらです。

問題1

九九の合計を出力する問題。えいでできそうですね。

$ echo {1..9}'*'{1..9} | fmt -1 | bc | jq -s add
2025

# 別解
$ seq 9 | join -j9 -t\* - <(seq 9) -o 1.1,2.1 | paste -sd+ | bc

組み合わせを生成して合計するだけですね。PowerShell解も考えてみます

$ (1..9 | %{ $x=$_; 1..9 | %{ $_ * $x } } | measure -Sum).Sum

普通に計算した感じですね。

問題2

9132円の支払いとして、10000円を出したとき、お釣りとしてあり得る効果の組み合わせを出力する問題。組み合わせは1種類でいいとのことなので、1円玉868枚と出力するだけでいいのですが、それだとつまらないのでできるだけ出力してみましょう。

$ join -j9 <(echo 500'*'{0,1} | fmt -1) <(echo 100'*'{0..8} | fmt -1) | join -j9 - <(echo 50'*'{0..17}|fmt -1)  | sel -a -D+ 2: | sel 1 1 | teip -f2 -- bc | awk '$2<=868{for(ten=0;ten<=int((868-$2)/10);ten++) for(one=0;one<=int(868-ten*10-$2);one++)if($2+ten*10+one == 868) print $1"+10*"ten"+1*"one}'
...
500*1+100*2+50*2+10*1+1*58
500*1+100*2+50*2+10*2+1*48
500*1+100*2+50*2+10*3+1*38
500*1+100*2+50*2+10*4+1*28
500*1+100*2+50*2+10*5+1*18
500*1+100*2+50*2+10*6+1*8
500*1+100*2+50*3+10*0+1*18
500*1+100*2+50*3+10*1+1*8
500*1+100*3+50*0+10*0+1*68
500*1+100*3+50*0+10*1+1*58
500*1+100*3+50*0+10*2+1*48
500*1+100*3+50*0+10*3+1*38
500*1+100*3+50*0+10*4+1*28
500*1+100*3+50*0+10*5+1*18
500*1+100*3+50*0+10*6+1*8
500*1+100*3+50*1+10*0+1*18
500*1+100*3+50*1+10*1+1*8

500円玉、100円玉、50円玉の組み合わせを列挙、一度この時点で868円を超える組み合わせは除外します。最初から組み合わせを列挙すると、組み合わせの量が多すぎてえらいことになるのでこうしてます。
10円玉と1円玉の部分はawkで組み合わせ列挙、868円となるものだけ出力してます。

同じ方針でのPowerShell解は以下です。

$ 0..1 | %{ @{ str="$_*500"; sum=$_*500 } } | %{for($i=0;$i -le 8;$i++){@{sum=$_.sum+$i*100;str=$_.str+"+$i*100"}}} | %{for($i=0;$i -le 17;$i++){@{sum=$_.sum+$i*50;str=$_.str+"+$i*50"}}} | ?{$_.sum -le 868} | %{for($i=0;$i -le 86;$i++){@{sum=$_.sum+$i*10;str=$_.str+"+$i*10"}}} | ?{$_.sum -le 868} | %{$d=868-$_.sum;$_.str+"+$d*1"}

問題3

genkou.texからペアになっていない\ref\labelを探す問題。160本ノックに類題がありました。という話もされましたね。

$ cat She*/*.63/gen* | grep -oPe '\\(label|ref)\{[^}]+}' | sel -gd '\\|\{|\}' 3 | sort | uniq -u
eq:state_equation_linear
eq:state_equation_nonlinear
fig:typhoon

欲しいデータだけ削っていき、uniq -uで重複部分だけ取り出すって感じですね。uniqのオプションは覚えられんです。サッと出てくる人はすごいです

PowerShell解は以下です。

$ Get-Content -Encoding UTF-8 She*/*.63/gen* | sls '\\(ref|label)\{[^{]+}' | %{ $_.Matches.Value } | sort -Unique | %{ $x=($_ -split '{'); @{a=$x[0];b=$x[1]} } | group -Property b | ?{$_.Group.Count -eq 2 }|%{$_.Name}
eq:state_transition_model}
eq:state_transition_model2}
fig:motion}

問題4

tonnan.txtから東西南北となっている部分文字列を抽出する問題。ただし、東西南北の並び順は考えなくて良いとのこと。

$ cat She*/*.63/to* | conv fs='' 4 | zniq fs='' | awk 'length($1)==4{print NR"文字目から"$1}'
3文字目から西南北東
12文字目から南北西東
33文字目から南東西北
41文字目から西北南東
43文字目から南東北西
54文字目から東北南西
55文字目から北南西東
56文字目から南西東北
57文字目から西東北南
58文字目から東北南西
63文字目から南西東北
64文字目から西東北南
68文字目から東南西北
71文字目から北西南東
72文字目から西南東北
97文字目から西北東南

egzactの出番です!

github.com

先頭からずらしながら4つずつ選んでいくのはconvを使います。fs=''とすることで一文字ずつをカラムにできるので楽です。

東西南北が揃っているかどうかは、横方向のuniqをした後の文字列が4文字かどうかで判定できます。横方向のuniqにはzniqを使います。これもegzactのコマンドです。便利~~~!

PowerShell解もやってみます。こちらはegzact無しです

$ $TEXT=(Get-Content -Encoding utf8 Sh*/*.63/to*); 0..$TEXT.Length | %{ $x=$TEXT[$_..($_+3)]; if(($x | sort -Uniq).Length -eq 4) { "$_ "+($x -join '') } }

$TEXTに文字列を取り出しておいて、スライスで切り出していきます。残りの部分はzniqや、awkでやってることと同じですね

問題5

reversi.txtは以下のような内容のファイルです

 12345678
A        
B        
C   ⚪    
D   ⚪⚫   
E   ⚫⚫   
F    ⚪⚫  
G        
H        

次の手番はです。いくつかおける場所は何個かありますが、斜めにひっくりかえせる場所である、E6, G7にをおいてくださいという問題。ただし、普通にやるだけだと面白くないので、同じsed二回だけで完成させてくださいとのこと。どうして。

cat reversi.txt | sed '式' | sed '式'

難しそうですが、ひっくりかえせるかどうかを調べるべき座標は、から固定数倍個先であることが分かれば正規表現を書くのはやるだけです。

$ cat She*/*.63/re* | sed -zE 's/(⚪.{10}(⚫.{10})+) /\1❌/' | sed -zE 's/(⚪.{10}(⚫.{10})+) /\1❌/'
 12345678
A        
B        
C   ⚪    
D   ⚪⚫   
E   ⚫⚫❌  
F    ⚪⚫  
G      ❌ 
H        

はい…。これがやるだけな正規表現かどうかは謎なんですが…。ここからの話はsed -zEを前提にします。

盤面をななめ見るとき、駒と駒の間には改行を含めて10文字が存在します。最初はの次にが来なければなりません。これを正規表現で表すと⚪.{10}⚫と書けます。

その先の駒も考えてみます。の位置にを置くことで斜めにひっくりかえせることを考えると、の次はでなければなりません。正規表現で書くと⚫.{10}⚫となりますが、は何個続いてもいいので、+を使った繰り返しを用いて(⚫.{10})+と表すことができます。

から正規表現から正規表現を連結すると、⚪.{10}(⚫.{10})+と表せます。最後、空白マスである が登場したら、そこがを置きたい場所になるので置換を行います。このとき、~の部分はそのまま使いたいので、キャプチャして後方参照します。

なんでこれが二回なのかというと、G7に置くときの始点であるD4は、E6の検索中にすでに通過している部分であり、sedではいったん戻って再検索ということができないからですね。

なんというか、信じられないほど読みづらい文章ですね。むずかしいね。

PowerShell解は…勘弁してください。

問題6

先ほどを置いた位置との間にあるにする問題。やっぱりねー!予想ついてましたよ!

この問題ではPerlを使うと楽とのこと。先読みやら後読みやらが使えるからですね!最強!

$ cat She*/*.63/re* | sed -zE 's/(⚪.{10}(⚫.{10})+) /\1❌/' | sed -zE 's/(⚪.{10}(⚫.{10})+) /\1❌/' | tr -d \\n | perl -C -Mutf8 -pe 's/⚫(?=.{9}(⚫.{9})*❌)/⚪/g' | fold -b27 | awk 4
 12345678
A        
B        
C   ⚪    
D   ⚪⚪   
E   ⚫⚪❌  
F    ⚪⚪  
G      ❌ 
H        

時間切れでした。正規表現を書くところまではよかったんですが、-Mutf8にハマってしまいました。-Cが必要ってところまでは過去の午前の部で習ったので覚えていたんですが…。無念。

LT

今回もLTさせていただきました!聞いてくださった方ありがとうございました!

speakerdeck.com

音声合成やってみたいな…と思ったのでやってみたというお話です。筋トレも頑張ります。

まとめ

今回は2問目をサッと解けるような回答が出せなくて悔しかったですね。最後2問も難しそうなんですが、パターンに気づけるかどうかだったので頭の体操って感じでいいなって思いました。楽しんで解くことができました!

途中、もなかを頂いたんですが、これが糖分補給にめちゃめちゃ良かったです。次回から必須アイテムかもですね(?)

今回も企画・開催・準備などありがとうございました!

霧島の遺産 - チャプター3, 挑戦モード

転生弱くない?

こんなん絶対非ボスじゃん

こんなもののために毎日頑張るのは渋い

チャプター2は毎日最適化を行って、3日目時点でラバストーン回収、残りは防御固めて飯食うみたいなことをしていました。行動力回復ポーションが重要とか書いたけど、実はサラダでいいですね。はい。

そんな間違いを書いた前回の記事は以下

xztaityozx.hatenablog.com


本日、チャプター3が公開になりました。チャプター2時点での最適化と練習のおかげか一発クリアできました。でもなんか満腹度の減りひどくなってて厳しかったです。一応注意ですが、この後ネタバレにつながる画像があるので、見たくない人は飛ばしてください。

クリア時の特性は以下の通りでした。「攻撃力lv9もあれば楽勝でしょwwww」と思ってたんですが、1確できる雑魚が少なくてビビりました。

行動力は振らなくていいと思いました

今回はクリア報酬にくだんのトーテムがあります。専用の転生の炎が1つついてくるみたいですね。そのほかにも極限成長秘薬があったりして報酬自体は豪華ですね。

超豪華

しかしながら、拘束時間がなっっっっがいです。同日に公開されたイベントがほかにもあり、とてもしんどいです。

攻略概要

装備や防衛はチャプター2相当でクリア可能です。最終波までに欲しいのは、鉄板ブーツもしくは羽ブーツ、石壁、適当なタワー、デュアルボウガン、砥石です。

食材は野菜+水+肉を調理することで得られる蒸し肉です。水は集めやすいこと、HPを多く回復できるので、殴ってくるMOBがいるマップでも強引に滞在することができるのが魅力だと思います。

野菜の確保が面倒そうですが、木材回収のついでに集まります。

主食

ただし、野菜も肉も調理後アイテムもかばんを圧迫するので、葉っぱかばん・皮かばんをN個作ってインベントリを拡張することが必須な印象でした。

性能的には蒸し魚の方が無駄もなくいいバランスなんですが、魚と取りに行くのが面倒だな…とおもって採用してませんでした。でもMOBを殴るだけで割と出るので、採用してもよさそうですね。

主食候補

道中の行動で採用したいのは黄金の槌です。自分は弓から乗り換えました。横範囲は狭くなりますが、火力、縦範囲は上な印象です。特筆すべきは制作難易度の低さで、初めて金道具を作ったときのあまりで作成できる程度なのでうれしいです。

これ昔のセングチュアリですか?

満腹感ゲージの減りが速いので、できるだけ早めに足回りを強化できると良いです。鉄板ブーツは制作難易度が低いのでまず履いておくと安心です。

青いワンちゃんからドロップする素材で作れる羽ブーツは、基本の機動力が上がるほかに、FJが2回できたりとすごく快適になるので、余裕があれば作るとよさそうです。でもチャプター3攻略程度であればいらないかも。

最終波

最終波にはデカいおじさんが登場します。すごくデカい

ラスボスのおじさん

体力が高くタフです。耐久力に気を付けながらデュアルボウガンで仕留めましょう。攻撃はおとなしめな印象…。チャプター2のボスは正面にいると即死するレベルで痛かったんですが、こちらはそうでもなかったような。運が良かっただけかも

襲撃をクリアすると会話が始まります。さっきのおじさんが握ってた杖はキーアイテムだったようですが、完全にダメになっちゃったようです。あ~あ。

あ~あ じゃないのよ

おじさんの杖にくっついてた?ラバストーンをお礼にともらえるみたいなんですが、普通にいらないですね。ラバストーン採取できるじゃん。

島の外に持ち出しても問題はないってなんでわかるねん

とか思っていたら返却することになりました。いらないもんね。


ともあれ、ストーリーとしてはここで終わりのようです。このあと報酬と経験値をもらって終了です。お目当てだったトーテム、素ステだと以下のような感じ。

トーテムなのか石板なのかレプリカなのか

普段からアフターランドを付けているので未強化でもちょっと伸びてますね。まぁ誤差ですが。

そして転生が弱い。

どうしてこんなことするの

手順

チャプター1, 2の時と同様に攻略手順を箇条書きにしておこう…と思ったんですが、チャプター2とそんなに変わらないのでやめました。変わったのは食うものぐらいですね。

挑戦モード

クリアすると敵の量、火力、体力が強化されたモードで遊べるようになります。業績でラバストーン転生の炎ボックスを得られたりします。転生が気に入らないよ!って人は25日までは生き残ってみてはどうでしょう。

ところでミトラって誰

自分はちょうど25日目で力尽きてしまいました。行動としてはチャプター3と大体同じでした。敵が堅いせいか、初動ほどキツいという印象でした。敗因は画面外から飛んできたおじさんだったので、それがなければまだ生き残れたかも…。何日あるか知りませんが。

まとめ

ふと思い立って霧島の遺産の攻略記事を書きました。正直海外情報がggれば山ほど出てくるし、プレイしてるうちに気づけることしか書いてないんでアレなんですが。

こういう行動を最適化していく系のゲームは嫌いではないので、結構楽しめました。報酬のトーテムがナーフされて輸入されたこととか、不便が多い点とか、拾うのがだるかったりとか、謎に重かったりとか、拘束時間がクソ長いこととかを除けばよかったです。…要素残ってますか?

挑戦モードを毎日やるかというと…やらないと思います。まぁ気が向いたらで。

霧島の遺産 - チャプター2

火力を積めば勝てると思います

結局チャプター1は前回の記事の行動で安定してました。剣と石壁があればまぁ何とかなる感じなので、そこまでは頑張ってあとは飯食って待ち、みたいな感じに落ち着きました。

xztaityozx.hatenablog.com

探検隊特性

強化ポイントを200ptしっかり毎日集めていたので以下のように振ってチャプター2に備えました。 チャプター2クリア後のポイントを採取に振ったので、実際には初回クリア時は採取がlv3でした。

結局火力こそ正義なんだよな

生存型建築家lv1が初動を加速させるので500pt払ってもいいかもって思ってたんですが、支給される斧とつるはしは落ちてる石と枝でサッと作れるので、実際にはコスパは謎です。振りなおしてもいいかもしれんですね。

それより重要なのは攻撃力強化採取力強化です。 攻撃力強化はその名の通り攻撃時のダメージが割合増加するものです。火力を振っておけば肉の採取やゴブリン襲撃時にかなり有利でうれしいです。

採取力強化は採取量を割合増加させるものです。前後比較がしづらいので実感もづらいんですが、鉄の集まりが良くなるので、鉄道具や速度が強化できる靴を早い段階で揃えやすくなるのでおススメです。あえて欠点を挙げるとすれば拾うのがめんどくさいって点です。

チャプター2 攻略

1回目はHP管理をミスって負けましたが、反省を生かして2回目にクリアしました。12日目まで大体1時間ぐらいかかるのでしんどい。これをデイリーにするの狂ってる。

報酬が豪華でうれしいね

チャプター2は満腹度の減りが緩和されている?ことと帰還書が支給されることがあり食事は割と余裕があります。採取に出かけられる時間が延びますが、行動力が足りなくなりがちなので、拾っては帰還してテントで回復しながら作るという動きは変わらないですね。

帰還書。何度でも使えて便利。

滞在時間が長くなったので、錬金窯を使っていろいろ作る余裕も出てきました。ポーション類は材料をあつめるのがちょっとめんどくさいですが、最終波までには作っておくと楽になると思います。とくに行動力は足りないがちです

からだにわるそう

ラバストーンが採取できるようになったので作業台も一つ上が解禁されます。木は正直金斧で良いですが、つるはしはラバストーン製のを作るといい感じです。自分、職がブラスターなんですが、このつるはしの時だけボーナスもらえません?

どう見てもガントレットリボルバーです

武器はラバストーン製のデュアルボウガンが射程・威力・攻撃速度が優秀だと思いました。耐久力が低め?なのと、範囲というか誘導がないので肉集めでは剣か弓がよさそうです

これも見たことがあるデュアルボウガン

最終波は、最低限デュアルボウガンと石壁、砥石があれば勝てるので、それらを揃えることを目標に行動を決めるといいと思います。


前回同様、攻略時は忙しすぎてスクショを全然とれてません!Scl押せばいいだけなんだけどね。あとチャプター1よりも画面がカクつくことが何度かありました。敵が多いと起きがち?

というわけでざっくり攻略手順

  1. 最初に支給される石斧でその辺の木を伐採、生存作業台を作成する。生存作業台ってなんやねん
  2. 初期マップか隣のマップに鉄があるので石つるはしで最低5個採取
  3. 鋼鉄つるはしを作る
  4. 鋼鉄つるはしで鉄を採取しながら金を取りに行く金は6個あればうれしい。2つMAPすすめばどこにでもある印象
  5. 産業作業台と適当なテントを作る。テントは葉っぱテントで十分
  6. 金つるはしを作る
  7. 肉と食材を集めつつ金をとりにいく
  8. 弓とかばんをつくる。皮が余ってれば皮かばんのが良いがしばらくは葉っぱでもいい
  9. この辺でゴブリン襲撃がくるので弓で撃退
  10. 金斧と調理台を作る。これ以降適当に3つ食材を選んで調理台で作った飯を食う。
    1. 食材は水+水+任意で雑に作ったやつが楽な印象(組み合わせを見つけられなかっただけともいう)
  11. 剣を作る
  12. スタッズ付き靴をつくる。移動速度が目的なので足が遅くてもいいと思ったらやらなくてよい
  13. 金つるはしでラバストーンを取りに行く。6~8個あればうれしいが採取ポイントにいるMOBが常にアクティブなので、体力に余裕が無かったら無理はしない。
  14. 剣があり、攻撃力強化がlv5なら余裕をもって勝てるので挑戦してみてもよいかも。ドロップ品はいらないけど
  15. 石垣を作って進路上に設置しておく。左右1つずつでよい
  16. ゴブリン襲撃がくるので弓とか剣で撃退
  17. 作業台を強化する。ラバストーンが1つ使ってハンドドリルを作る
  18. ハンドドリルでラバストーンを取りに行く
  19. 錬金窯とHP回復ポーション・行動力回復ポーションを作っておく
    1. かさばるので箱を作って保管しておくとといいかもだけど、ポーションはそれぞれ1つあれば十分なので箱はお好み
  20. デュアルボウガンを作る
  21. 砥石を4つほど作っておく
  22. 石壁とイノシシ牙から作れる奥歯トラップをつくる
  23. 石壁奥歯トラップを設置。雑でよい
  24. ゴブリン襲撃がくるのでデュアルボウガンで撃退。デュアルボウガンが壊れないように気を付ける
  25. デュアルボウガンの耐久力を砥石で回復させておく
  26. あとは自由時間。奥歯トラップを増やしたり弩タワーを作ったり飯を食ったりして時間をつぶす
  27. 最後のゴブリン襲撃がくるのでデュアルボウガンで撃退。BOSSの攻撃がめちゃくちゃ痛いので正面に立たないこと。
    1. 殴っていると行動力が足りなくなるので行動力回復ポーションで回復して殴りを再開するとよい。
      1. 石壁がかなりもつのでテントで休んで回復でもよい
    2. デュアルボウガンで殴りまくっていると壊れると思うのでちょこちょこ気にしながら砥石を使うと良いです

まとめ

なんだか毎日最適化を進めるのが楽しいなって思ってきました。思うつぼ。

とはいえ1回1時間以上かかるのはしんどい…のでチャプター3はそんなに伸びないことを祈ってます。

またチャプター3が来たら書くと思います

霧島の遺産 - チュートリアルからチャプター1まで

僕たちはメイプルストーリーでマイクラがやりたかったのか?

そんな感じのイベント 霧島の遺産が始まった。平面なマイクラタワーディフェンスみたいな感じ。転生の炎が使えるトーテムが手に入るのでやるといいかもしれない。各所で重いって話を見たけど自分はそうでもなかった。

最中はずっと忙しいため、スクリーンショットは少な目

触ってみて分かったざっくりとしたルール

  • 赤、青、黄の3つのゲージがある
    • 赤:HPゲージ。被弾で減る。0になってないからわからないけど0になったら多分ゲームオーバー
    • 青:行動力ゲージ(?)。正式名称はわからないけど、採取したりFJしたり、上ジャンプすると減る。黄のゲージが残っていると自動回復する?
    • 黄:満腹感ゲージ。なにもしなくても減る。0になるとほかのゲージがすごい減っていく。30ぐらいから画面内の警告がうるさい
  • 採取したりものを作るなどの行動をし、ゴブリンの襲撃から中央の遺跡みたいなのを何度か守ればクリア
    • 防衛するための設備を作り、設置することもできる。
    • 武器を作って直接倒すこともできる。というかチャプター1では攻撃しないと負ける。

チュートリアル

いつもの★からではなく、専用のアイコンからクエストを受け島に入場。いくつか会話を聞いて行動スタート。割としっかり目に読んでたけど急に行動が開始されるので普通に焦った。ちなみに会話を読んでる間も満腹感は減る。なんでやねん

急にアバターをはがされ、貧相な服だけになった。さっきまで着てたじゃん

チュートリアルということもあり 「採取/NPC会話 を押そうね」という感じの吹き出しが出る。新キャラ作ったときのチュートリアルでも見るやつ。

採取/NPC会話を押すとオブジェクトに対応した素材がドロップする。拾うキーを押すと手に入る。拾った素材はインベントリに入る。インベントリは普段のインベントリと同じキーで開く。

斧があるけど、採取段階では手に入ってない

「制作」ボタンを押すと専用のUIが出現。作るアイテムとその素材が出てくる。材料が足りていれば作成できる。このあたりにマイクラみを感じた。

石斧をつくったところ

満腹感ゲージを回復するために食べ物を作る必要がある。調理しなくても食えるバナナなども採取できるが、チュートリアルでは近くのMOBと焚き火を組み合わせて肉を焼くことになる。

焚き火。時限で消える使い切り設備

肉を焼く手前

「調理する」を押すと肉が焼かれる。インベントリに直接格納されず、調理UIからダブルクリックして取り出さないといけない。ダブルクリックって操作は複雑だし、ダブルクリックを受け付ける範囲は小さいし、取り出してすぐ食べたいのに、ダブルクリックすると調理UIに移動してしまうなどがあり、不便ポイントが高い。

これは後に作ることになる調理用焚き火でも同じなので慣れるしかない。慣れるしかないのか…?

火が消えない超技術設備


つるはしや斧を作った後はさらに上位の素材を集める。具体的には鉄をあつめて、道具をアップグレードしたりする。こうすることで採取量を増やせたり、時短になったりする。でもチュートリアルでは過剰なのでしなくてよさそうだった。

鋼鉄のつるはし。堀パワーが要らないが行動力は要る
鋼鉄斧。町で店売りしてそうな見た目

自分の火力を上げるために武器を作っておくのはよさそうだった。まず作るのは弓がよさそう。射程、威力、一度に殴れる数の多さ、要求素材の簡単さという点で優秀だった。チュートリアルなら、これだけで戦えた。

ゴブリンの襲撃があったが、スクリーンショットを完全に取り忘れてしまった…。弓が強いのが悪い(?)

勝利するとチュートリアルクリア。俺たちの戦いはここからだ!みたいなことを言われる。

戦闘後普通にアバターを着ていて笑った

チャプター1

スクリーンショット、ありません

忙しすぎて全然撮れなかったね。なので行動内容をざっくり箇条書きで。記憶があいまいなので順番は前後するかもだけど、大体以下の通り。絶対クリアできる!という攻略内容ではないので、参考程度に。

満腹感ゲージが減ってきたら適宜肉やバナナを食べる。運よく採取できた草とかキノコはその場で食ってしまう方が、インベントリを空けられるのでうれしいと思った。鳥からは時々タマゴとか、食える虫?みたいなのをドロップするので余裕があれば倒してみるのもよさそう。

  1. 石斧と石つるはしを作成。材料は初期マップで手に入るはず
  2. 鉄と木を適度に採取
  3. 生存作業台を作成。どこかのポータルの近くに置くのが良い。ところで生存作業台ってなんだよ。
  4. 鋼鉄斧と鋼鉄のつるはしを作成。石斧と石つるはしはインベントリを圧迫するので捨てる
  5. この辺で満腹感ゲージが枯渇してくるので、焚き火と食料の調達。道具作成の残りがあると思うので、焚き火はそれで作成。肉は近くのMOBを狩る。
  6. 調理用焚き火を作る。1wave目のゴブリン後まで肉を集めに行く暇がなかったので、この時点では余裕があればでよさそう
  7. 弓を作る
  8. ぼちぼちゴブリン襲撃の1wave目が来るので弓で撃退
  9. 右端のポータルから2MAP目にある所々金色な岩から金を採取。必須は1つだけど、せっかくなのでいくつか集めた。
  10. 剣を作る。ゴブリン襲撃は剣、肉集めは弓と分けていたがここはお好み。
  11. 柵と弩タワーをつくる。余裕があればバリケードでもいいが、2wave目の備えとしては柵で十分だった。
  12. 柵と弩タワーを設置。もちろん両方置くのが良いが、最低限右側の柵とタワーは必ず設置すること。
  13. 食材と柵の材料を集めつつ2wave目を待つ
  14. ゴブリン襲撃、2wave目を撃退する
    • ボスが右からやってくるので、左はさっさと片付けて相手の射程外から剣で攻撃する。柵はもたないが、タワーまでは壊されなかった。
  15. 柵、弩タワーをハンマーで壊し、新しくする。柵は予備を2個作っておく。余裕があればバリケードでもよさそう。
  16. 食材を集め
  17. テントで体力を回復しておく。テントの近くに作業台とか調理用焚き火を置いておくと回復しつつ作業ができるのでよさげ。
  18. 余りの素材で適当な防具を作る。3wave目のボスは被ダメが痛いのであると安心
  19. 3wave目まで満腹感ゲージを維持しつつ待機。暇なら防具か防衛を作っておくとよさそうだけど、自分はそんな余裕なかった
  20. ゴブリン襲撃、3wave目
    • ボスは左から来る。射程が長いので柵・タワーを盾にし、剣の射程ぎりぎりから狙ってもダメージを受けてしまう。
    • ところが後ろには攻撃が来ないので、後ろに回って剣を連打すると良い。
    • タワーも柵も壊され中央の遺跡が殴られるが、剣で攻撃し続けていれば遺跡の体力が半分ぐらいになったところで討伐できる。
    • 柵が壊れた時点で置きなおせばもう少し余裕ができるかも?

クリアすると霧島中の自キャラに適用できる強化に使えるポイントが200もらえる。金髪の子に話しかけて、「会話する」の選択肢を選ぶと強化UIを開くことができる。分かりづらい。

感想

次何するっていうのを事前に決めておかないといけないシビアなゲームだと思った。ちょっとアイテムの説明を読んでいる間にも満腹感ゲージが減るので、余裕がほぼない。何もわからない始めたての頃ほど、テキストを読む時間が長いが、序盤のほうがやることも多いのでなんだかなあって思った。

持っている道具を使う、切り替えるがマウスの基本的な操作だけでできるマイクラってすげえ便利だなと思った。こちらはスペースやら攻撃キーやらをやりたいことにあわせて押し分けなければならず大変だった。プログラマブルなキーがついてるマウスを持っているなら、専用プロファイルを作ってもよいかもしれない。

ただでさえシンボルにあわせてコインデイリーがあるのに、さらにデイリー要素を増やすのはなんでなんですか。でも報酬が豪華なので我慢してやります。

不満ばっかり書いてますが、新しい体験って感じで良かったです。チャプター2の公開は2023/2/1らしいのでクリアしたらまた書きます。

EntityFramework7でFileInfoをカラムにしたい

大したネタじゃないけども、すぐ忘れるので…。雑記です


何かしらのデータとローカルマシン内のデータへのファイルパスをDBで管理したい場面がありました。例えばですが、rowをC#で書くと以下みたいな感じです

class AudioFile {
  public string Title { get; set; }
  public string FilePath {get; set; }
}

パスは文字列だからstringでもいいのですが、存在チェックとかのためにFileInfoになっていると嬉しいです(たぶん)。つまり以下のようにしたいです。

class AudioFile {
  public string Title { get; set; }
  public FileInfo File { get; set; }
}

でもDBはFileInfoなんて型は知らないし、EF6もよしなにしてくれないようです(定義済みのコンバータ)

ちなみに今回DBはMySQL 8.0.31を使っているとします。

HasConversionでコンバータを定義してあげる

DbContextOnModelCreating(ModelBuilder)で変換を定義してあげる方法です。

public class Repository : DbContext {
// コンストラクタとかは省略

  public DbSet<AudioFile> AudioFiles => Set<AudioFile>();

  protected override void OnModelCreating(ModelBuilder modelBuilder) {
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<AudioFile>(builder => {
        builder
            .Property(a => a.File)
            .HasConversion(fileInfo => fileInfo.FullName, str => new FileInfo(str));
    })
  }
}

とてもシンプル。ちなみにカラムの型はlongtextになる

クラスにプロパティを書く

string FilePathを参照してFileInfoを返すプロパティを定義するだけでもよさそう

class AudioFile {
  public string Title { get; set; }
  public string FilePath {get; set; }

  private FileInfo? fileInfo = null;
  [NotMapped]
  public FileInfo File {
    get {
      if(fileInfo is null) fileinfo = new FileInfo(FilePath);
      return fileInfo
    }
  }
}

まとめ

  • OnModelCreatingHasConversionを使って型変換を書ける
  • でもそもそもプロパティでもよさそう
  • 存在確認ならFile.Exists(string)でもいいので、stringで持っててもよさそう

EFCore 7 でMySQLに繋ごうとしてた話

ちゃんとした記事というよりはメモです。雑記です。

やりたかったこと

.NET 6 で EFCore 7 つかってMySQL 8.0.31に接続したかった

詰まったところ

dev MySQLを参考に書いてみたけど動かない。別のSQLクライアントから接続できるのは確認済み

dev.mysql.com

具体的には、以下のような感じに接続文字列書いてるのに Method not found: 'System.String Microsoft.EntityFrameworkCore.Diagnostics.RelationalStrings.get_NoConnectionOrConnectionString()'.' とかいう例外で接続できなかった

public class HogeContext: DbContext
{
  public DbSet<Foo> Foo { get; set; }

  protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder) {
    var builder = new MysqlConnectionStringBuilder{ Server = "localhost", Port = 50001, UserID = "user", Password = "password", Database = "database" };
    optionBuilder.UseMySQL(builder.ConnectionString)
  }
}

using var db = new HogeContext();
db.Database.EnsureCreated(); // <- ここで例外

解決策

Pomelo.EntityFrameworkCore.MySql を使うのが正しかった。

github.com

var hostBuilder = Host.CreateDefaultBuilder(args)
    .ConfigureServices(sc =>
    {
        sc.AddDbContext<HogeContext>(options =>
        {
            options.UseMySql(
                new MySqlConnectionStringBuilder
                {
                    Server = "localhost", Port = 50001, UserID = "user", Password = "password", Database = "database"
                }.ConnectionString,
                new MySqlServerVersion(new Version(8, 0, 31))
            );
        });
    });

using var host = hostBuilder.Build();
using var scope = host.Services.CreateScope();

var db =
    scope.ServiceProvider.GetService<HogeContext>()
    ?? throw new NoNullAllowedException();
db.Database.EnsureCreated(); // <- 例外でなかった!ハッピー!

やったこと

このままだとつらかった…っていう日記になるので、解決までの道のりを書いておこうと思う。これも何の役に立つんだって感じですが。

リンクいろいろ貼ってるけど、時が経つと今日(2022年12月24日)のとは内容が変わるかもしれない

1. get_NoConnectionOrConnectionString() でggった

MSのドキュメントが見つかった

learn.microsoft.com

EFCore 6のドキュメントだったので、ドロップダウンからEFCore 7に変えたら、The requested page is not available for Entity Framework Core 7.0. と言われてしまった。

Applies to を見てみたら 3.0, 3.1, 5.0, 6.0 だったのでなんかおかしいなって思った

2. EFCore 7 MySQL とかで雑にggった

MSのドキュメントを見つける

learn.microsoft.com

ここで先の Pomelo.EntityFrameworkCore.MySql の存在を知る。 README通りに書いてみたら接続できた。

3. MySQLのドキュメントを読み返した

なんでdev MySQLの方はでけへんねんと思ったが…

General Requirements for EF Core Support - Connector/NET 8.0

  • MySQL 8.0 Server (or MySQL 5.7)

  • Entity Framework Core packages:

    • MySql.EntityFrameworkCore 6.0.0+m8.0.2x (Connector/NET 8.0.28 and later)
    • MySql.EntityFrameworkCore 5.0.0+m8.0.2x and 3.1.10+m8.0.2x (Connector/NET 8.0.23 and later)
    • MySql.Data.EntityFrameworkCore 8.0.2x (Connector/NET 8.0.22 and earlier)

-- https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html

EFCore 6が対象だよってちゃんと書いてあった。目がついてませんでした。すいませんでした。

おわり

やったことのところ、ざっくり書いてるけど2時間ぐらいかかりました。むずかしいね。

MySQLにこだわりはなく、なんならSQLiteでもよかったんだよね…。

クリスマスイブになにやってんねんという感じです。

第62回シェル芸勉強会に参加しました

今回、大阪はサテライトが開催ということで現地参戦しました。

下みたいな感じで盛り上がってました

twitter.com

問題と解答

いつものように時間中に解いた答えなどを記録していきます。PowerShell解は気が向いたらやります

Q1

message.pptxからデータを削り出していき、unkoを得る問題

$ cat She*/*62/mess* | grep -aoPe 'u|n|k|o' | uniq | tr -d \\n | grep -o unko
unko

grep-aでバイナリ内を検索します。出てきた文字から連続部分をuniqで圧縮したり、trで改行を消したあと、最後にgrepunkoを取り出すという感じですね。削り出しでいいのでこれで解答としました

Q2

imgディレクトリ以下のファイルがPNGかどうかを判断する問題

$ ls She*/*.62/img/* | awk '{print "xxd", $1, "|head -n1|grep -q PNG && echo",$1,"PNG || echo",$1,"PNGじゃない"}' | bash
ShellGeiData/vol.62/img/img1.png PNG
ShellGeiData/vol.62/img/img2.png PNGじゃない
ShellGeiData/vol.62/img/img3.png PNG
ShellGeiData/vol.62/img/img4.png PNGじゃない

バイナリを直接見る感じでやってみました。でもこれねPNGって書いてあったらだめだねこれね。fileで判断するのが賢いと思います

Q3

PNG画像からプログラム取り出して実行する問題

$ convert She*/*.62/prog* pgm:- | sed 1,3d > a && chmod +x ./a && ./a 
これはUNKOの画像です。

PGMから生成されたというヒントがあったので、PGMに戻してやったあとのヘッダー部分を取り除いた残りの部分をファイルに書き出しました。実はこの部分がプログラムなので実行権限を付けてやれば解けるということですね。

Q4

さっきのような画像を作る問題

$ cat > src.pgm
P5
2 23
255
#!/bin/bash

echo おはようございます

$ convert src.pgm dest.PNG

$ convert dest.PNG pgm:- | sed 1,3d | bash
おはようございます

解答例としても紹介されていたシェルスクリプトを仕込む感じにしてみました。本当はowariとか仕込んでやればよかったんですけど、ファイルサイズがいい感じの素因数分解できなくて諦めました

Q5

message.pptxに書いてあるメッセージを読み取る問題

$ cd She*/*.62/
$ unzip messag* &> /dev/null
$ cat ppt/slides/slide1.xml | grep -oPe '<a:t>[^<]*</a:t>' | sel -gd'<|>' 3
メッセージ
これを読んでいるころは、
シェル芸勉強会に参加されていることでしょう。
どうせ、yes ウンコとかコマンドを
打たさせていると思うと、大変残念です。
どんまいける!

どんまいける!pptxはzipっていうのはいつもそういえばそうでしたって感じになりますね。

Q6

nanika_data.tar内にあるファイルをタイムスタンプ順で並び替え ファイル名 -> 内容 の順番で読みだすと文章になります。ここからいろいろ取り出してくださいという問題

時間内には解けず…。tarの仕様を読んだりTLの解答を試したりしてました。\0が厄介でしたね~~~

LT

今回もLTしました!!!!!!!

github.com

ワタナベにとりつかれてしまったという話をしてしまいました。

takaさんのLTがかなり興味深かったです。勉強になる

おわり

今回も楽しかったです。近くに呻いている人がいるのはいいですね。 企画運営などありがとうございました!