takashiskiのブログ

覚書の殴り書き

伝達・継承の間に経緯が落ちるの例

どこでみたのか全く思い出せないけど覚えているネタを書き出す。 ある行為の本来の理由を勝手に補完して重要なものとして伝えていってしまう例。

本文

母から教わった魚のパイか何か(忘れた)のレシピで、頭としっぽを落とすという工程があった。 なんでこれをするのかわからなかったので母に聞いたら母はこう答えた。

「祖母からそう教わったからそうしている。 どうしてかは聞いていないけど味が染みやすいとかそういう理由があるのだと思う。 祖母は必ず頭としっぽを落としていた」

二人で祖母に尋ねたら祖母はこう答えた。 「当時使っていた鍋に入らなかったから落としていただけ。今の鍋には入るからここ何年かは落としてないよ」

お水さしすせそに続く「たちつてと」「はひふへほ」

本当に適当かはともかく、ネタとして面白かったのでメモ。

さしすせそ

  • さすが!
  • 知らなかった!
  • すごい!
  • センスいい!
  • そうなんだ

たちつてと

  • 例えば?
  • 違いは?
  • つまり?
  • 定義は?
  • 統計的な裏付けは?

はひふへほ

  • 凡例を述べよ
  • 標準偏差は?
  • 不確定要素は?
  • 平均偏差は?
  • 他に意見はございませんか?

3Dプリンタトラブルメモ

頭の中から追い出したいことを書き出しただけです。

まず参照すべきウェブサイト

  • Ultimakerのサポートページ
  • Simplify3Dのサポートページ

この二つに頻出造形トラブルの調査個所は列挙されています。一通り目を通しておくと「あっ!このトラブル、サポートページで見たことがある!」となります。

というか、ならないと発生した現象はどういう語句で説明されるかがわからず、疑問を検索することもできません。

もうちょっと詳しく知りたいとき参照するウェブサイト

Nature3D

  • フィラメントを製作している方のウェブサイト
  • 自分で制作しているだけあってフィラメントの知りたいあれこれの実験結果が載ってる

「あのモデルないかな」のときに見るサイト

thingiverse

  • 設計図共有サイト
  • 重い
  • デザイン変わってもっと重くなった
  • thingiverse キーワード」でgoogle検索したほうがthingiverse内で検索するよりも欲しい検索結果が早く出てくる

以下その他見かけた何かに使えそうな情報が書かれているウェブサイト

dreamerdream.hateblo.jp

e3d-online.dozuki.com

www.tronxy.com

geekhack.org

3dprinting.stackexchange.com

flexispotを組み立てた

社に追加されることになり、自主的に二日連続で合計2台組み立てたのでなんとなくわかった。

買ったら速やかにすべきこと

  • ねじの検品
    • なんかぼろぼろで、自分で穴をあけれない木ネジがいた。
    • 下穴がないとまったくはいらなかった

必要な道具

ねじは木ねじと六角穴のボルト。木ねじ22本を手で入れていくのはなかなかつらいと思うので電動ドライバがあったほうがいいかんじ。

読み合わせしてどう動けばいいか分かった状態なら、複数人で並行処理すると作業時間が大幅に短縮できると予想される。

  • 人数分の電動ドライバ
  • 人数分のビット
    • No2+
    • 六角4mm, 5mm
    • ドリルビット(測定し忘れた)

ビットは消耗品だし、適当なセット持っておくと穴開けに便利だと思う。

あるといい道具

六角レンチにプラスドライバーがくっついたやつついてくるけどちゃんとしたやつがあったほうが楽。

増し締めするときと、ゆるめるときの最初だけは電動ドライバを使わずに手でやることをお勧めする。

今回は電動で締めすぎると、ネジ穴を壊す恐れがある部品が多い。最後に固く締めるのは手でやったほうがいい。緩めるときも同様に最初の硬いところは人間の手でやったほうが良いと思う。

  • No2ドライバー
  • ボールレンチ

あるといい消耗品

  • でかい段ボール何枚か
  • ひっくり返したり回したりのときに傷がつきにくくなる
  • 結束バンド
    • たぶん、カバーの穴を使ってカバーにケーブル固定したほうがいい

公式以外の天板

公式の天板は位置決めのための下穴がいくらかすでに開いている。 自前天板だとそこを自分で開けないといけないので、中央を検出したり、任意の場所に下穴を設置できる技能が必要である。

多少歪んでても倒れなければいいよの精神で適当にやっても、致命的な問題はなさそう。

手順に関して

基本的によく考えられているのでそのままやればよい。

図のネジが通っている穴をちゃんと確認すれば間違わないはず。

しいて言うならば、足のとりつけ位置を決める工程では、足をネジ止めする大体の位置決めてから中央ネジ止めで幅固定するよりも、四隅を仮止めして足の位置の仮決めが済んでから中央を固定しないとゆがむと思った。

必要空間に関して

天地返しが必要になるので、長辺の1.5倍程度の横幅、2倍程度の縦幅の空間が最低で必要になる。 これはあくまで組み立てと天地返しをするときに必要な広さである。組み立て前の足などをこの枠の中に入れるとなかなか狭い。

そのうえで45Lゴミ袋3つ分+でかい段ボールたちが発生するので、もう1x1m程度の広さが欲しい。ベッドの上など置ける空間ならどこでもいい。

重量に関して

適切に持ち上げないと腰や背中を即座に破壊するであろう重量である。とはいえ40kg程度なのでまぁまぁ持てるし動く。 脇を締めて膝をしっかりまげて腰を使って持ち上げることで何とかなる。

感想とか

とりあえず組み立ては二人いれば確実にできて、一人の場合はある程度の重量を安全に持ち上げられる人なら可能。

机の使用感は、まず糞重いのでぐらつきがすくなくてすごくよい。

また、副作用として机の高さを1200mm程度まであげることで、ほとんど屈まずに机の下に潜り込めるので掃除や机周辺の物の整理が楽になる。

人間工学の観点からだとどう扱うとよさそう、みたいな話は条件多くてひたすら長くなるし、たぶん技術書典でそういうことばかり書いてる本(キーボードの話が主なはずだった)を書いて売ってる/売るからそっち読んで。

浅草の飯

3年くらい住んでた浅草の飯を思い出しながら書く。 2018年の情報なので注意。

全体の感想

育ちは岐阜愛知だけど、大学で物心ついてから(?)は長野だったので、味覚は長野よりで割と何でも好き。

東京という地方の飯はあんまり好みじゃない感じだった。特に、うまいとされる麺類の感じがあまり好きじゃなかったようにおもう。麺は歯切れよくてなんぼだと思う。

浅草はよほどひどい店じゃない限り一見の観光客が無限に供給されてくるせいですごいつらい店も生き残っていて、一通り回るのを途中であきらめた。店の数がやたらあるのに地雷もやたら多い。

居住地域に近かった観音裏は観光エリアから外れるので、比較的よかったがどちらかというと飲み屋しかないので辛かった。

超通った店

ミスターデンジャー

プロレスラー松永光弘さんのお店の分店。本人は本店をやってるのでここにはいない。 浅草寺の裏側、六区側から花屋敷の横を通って斜めにいくとある。

150g1500円、300g2000円。食べログでメニュー写真見たら増税で値上がりして、300gは2100円になってた。 サラダとライスとスープがついてこの価格である。

特徴はとにかく柔らかい肉とたれの多さ。どんな疲れててもぺろりといけた。 たれはなんか5種類くらいあった。だいたい塩と甘口ソースで食べてた。

ここにさんざん通った後に、駅前のミスタードーナツがなくなっていきなりステーキができたので入ってみたら硬くてしんどかった。

どうでもいいけど斜め向かいに瓦割専門店がある。土日しかやってない。

ジムでトレーニングした後に大体ここかこととい、あとは吉野家にいってた。

tabelog.com

こととい

ザ・定食屋という感じの店。岐阜系の濃尾平野な味付けが食べれる。

だいたい一食1000円だしたらおつりがある程度の価格。

味の傾向が合致したら外れなくいけるとおもう。

日替わりメニューが多いので、「うまそうだなーでもまたでいいや」をやると食べ損なうことがたびたびある。

大家が近所にあってそこそこテレビで紹介されているたい焼きの写楽写楽でたい焼きかって、そのままマメココロでコーヒー買って帰るということをよくしてた。さらにそこの先にある徳太樓という和菓子屋のきんつばが超おいしい。

ここのジムの帰りに空いてたらよってた。

tabelog.com

ゆきかげ

鶏ラーメンのおみせ。

プレオープンのときに食べに行って、生活動線上でこの品質のラーメンが食べられることがわかってすごい喜んだ記憶がある。 一通り食べるために週3以上でしばらく通ってた気がする。

好きだったのは、珀黒、朱、鶏天丼の3つ。 麺は常に固めで頼んでた。

珀黒はなんか好きだった。まれに出汁が返ってしまったのか、味がない日があって辛かった。

朱は辛いのに味がしっかりしていてすごく好きだった。

鶏天丼はつゆ多めなときがすきだった。たぶん出汁が好きなんだと思う。

餃子も好きではあったのだけど、ラーメンが酢と相性が悪く、店も配慮してフルーツ酢にしているものの、酢に負けてしまう。 特に珀黒は餃子を酢で食べた直後は全く味がしなくなる程度に繊細であった。

あと桜餅あじジェラートが好きだった。まだやってるのかなぁ。

と思ってググったら先月西日暮里にジェラート専門店オープンしたことが判明。なにやってるの...

twitter.com

tabelog.com

とんかつとお山

東武線北側出口、エキミセ北側出口の通りのすぐ西側にあるとんかつ屋さん。 塩でうまく食べれることを売りにしているお店。 「えっこれが1000円でたべれるの?」な品質のロースのとんかつがでてくる。

味噌汁がすごい好きだった。小鉢も好きだった。

昼は糞混んでるけど夜は比較的空いているのでよくふらっと食べに行った。

サーモンとかささみとか基本的になんでもうまかった。

晦日に食べに行った程度には好き。

tabelog.com

そばうどん文殊浅草店

銀座線の東武線側出口の、地下街との間にある蕎麦屋さん。 東京の立ち食いそばチェーン。超汚い外見してる。

基本的に東京のそばは、高くてそれなりで少ない量か、安くて低品質で普通量しか見つけられなくて辛かった。

特に、立ち食いそば系のチェーン店は、蕎麦が好みじゃないか、出汁が好みじゃないかの最低どちらかだった。

文殊は超安いのに茹でて締めて温めなおしたそばが出てくるので雑に食べたくなったときはいってた。 ざるでもいけるけど、やはりこの価格帯のそばはかけ蕎麦がよいと思う。 500円であのざるそば出してくる長野の小木曾製麺所が異常。

現金メニューでかきあげなど追加可能であった。

tabelog.com

台東区墨田区

すずめ食堂

曳舟駅前のイトーヨーカドーの外壁にあるラーメン屋。 長野駅前にあったゆいが第一義のラーメンどんぶりが調理で使われてる。 また、魚介味噌ラーメンがゆいが第一義のラーメンに近かった。

長野のラーメン食べたさにいったのだけど、だいたいいつも混んでた。

tabelog.com

余談だけど後楽園/春日のあたりにある烈士殉名と魚雷も長野のラーメン系列(ボンドオブハーツ)。個人的にはラーメンより焼肉定食がはずれない系列だった覚え。

タンタンタイガー

蔵前にある、東京で流行のどう考えても担々麺ではないと思う系統のおいしい汁なし担々麺のおみせ。 阿吽なんかと同じ系統。

余談だけど、山梨(石和温泉)の北斗辛軒のオーナーに「阿吽に絶対いったほうがいいよ」といわれて阿吽とかタンタンタイガーとか何件か回った、北斗辛軒のほうが圧倒的に好きだった。

tabelog.com

百年本舗

末広町駅前にあるラーメン屋。銀座線の民だったので、マルツとか秋月とかの様子見に行くときに立ち寄ってた。

ローストポークが載ってる比較的シンプルなラーメン屋。ねぎダブルトッピングするのが好きだった。

京都ラーメン系を期待していったら全然違ったけどこれはこれですごい好きだった。

太陽のトマト麺

上野広小路本所吾妻橋にあった。 超好きってわけではないけど、たまに食べにいっていた。

他にもあった気がするけど忘れた。あ、今は亡きあいつのピッツァもよかったなぁ。

浅草いったらとりあえずミスターデンジャーいこうぜ。

Noitaですでに定義された杖を初期装備とする最低限のコードかいた

概要

前の記事で使った wand_good_1を初期装備とする最低限のコードを書きました。haxeで。 大事なとこだけ読みたい人は本題まで読み飛ばしてください。

takashiski.hatenablog.com

github.com

Haxe?

ActionScriptっぽい構文で色々な言語のソースコードを吐き出せるやつです。

haxe.org

今回はLuaが辛そうだったので、Luaを隠蔽するためにHaxeを使っています。

あとXMLを吐くためにnodejsを使っています。これはなんの言語でも構いません。

NoitaのLuaライブラリ->Haxe->Lua

Haxeでそのまま何でも書けるわけではありません。

Externという機能を使って、外部ライブラリのHaxeでのインターフェースっぽいのを書くと書けるようになります。 TypeScriptの型定義が似てるらしいです。

haxe.org

  • このHaxeクラスはどのライブラリのクラスと対応があるか
  • このクラスはどんな関数/変数があるか
  • この関数の型と戻り値は何か
  • この変数の型とアクセス権限はどうなっているか

あたりを記述します。

これは別にすべてを網羅する必要は必ずしもなく、実際に使う関数/変数だけを記述すればよいです。

hxnoita

今回私はhxnoitaという名前でnoitaのluaライブラリ?のhaxe externを書いています。 とりあえずEntityとComponentを接頭辞とする関数群だけまとめてあるていどです。 あと既存のPerk名と既存のSpell名。

github.com

本題

前の記事で使った wand_good_1を初期装備とする最低限のコードを書きました。

takashiski.hatenablog.com

最低限のファイル構成

modは最低以下の2ファイルから構成されます。

mod.xmlには、noitaのmod設定画面で表示される名前と説明を記述します。 それ以外の役目は私は今のところ分かっていません。

init.luaではmodのふるまいを記述します。今のところOnPlayerSpawned関数内に書いた処理が、プレイヤーキャラクターの出現時に実行されることがわかっています。

今回のファイル構成

杖を読み込むべく、前回の記事で読み込んだwand_good_1*な名前のファイル群がまるっとコピーしてあります。これらはまだHaxeから生成していません。

もうちょっと詳しくなったら適当なファイルと置き換える予定です。

init.luaはMain.hxから、mod.xmlはXmlInit.hxから生成しています。

処理の流れ

  • inventoryのEntityIdを取得する
  • inventoryを空にする
  • 杖をファイルから読み込む
  • 杖をinventoryにいれる
  • 水ボトルをファイルから読み込む
  • 水ボトルをinventoryにいれる
  • 水ボトルをファイルから読み込む
  • 水ボトルをinventoryにいれる

処理の解説

内容はすべて、私がやってきた中で感じた憶測になります。Noitaのmod APIはほぼ説明なく公開されている状態ですので、既存のコードや誰かが書いたコードを読んで感じ取るしかなかったからです。

事前知識

基本的にNoita内に存在するすべてのモノにはEntityIDが割り振られています。 Entityに対して直接操作をすることはできず、常にEntityIdを使ってやりとりをします。

inventoryのEntityIdを取得する

プレイヤーエンティティの子要素のどれかがInventoryということだけはわかっています。 なので総当たりで名前がinventory_quickかどうかを調査し、inventory_quickだったらinventoryとしてEntityIdを記録します。

inventoryを空にする

この処理は今回は杖と水ボトル2個を追加するだけなので、消しても動くかもしれません(試していない)。

Inventoryの子要素は所持している杖もしくはアイテムです。 全て置き換えたい場合は、すべての子を取得して、すべて削除します。

杖を読み込む

杖のXMLファイルを読み込みます。 それだけです。

このあとに杖の数値の変更をする関数を実行しても問題ありません。

杖をinventoryにいれる

取得処理です。子要素として追加するだけですね。

水ボトル

杖と基本的には一緒です。

2回取得処理をしているのは、同一EntityIdだとまずいという考えです。たぶん失敗するんじゃないかと思います(試していない)。

余談ですが、potion_water.xmlがあるフォルダにはほかのポーションが並んでいます。

定義済みの任意の杖を初期装備として始めるModがかけました。

余談

noita.gun.procedural.GunActionUtilsの下に、AddGunAction()とAddGunActionPermanent()が定義してあります。 第一引数は杖のEntityId、第二引数は今のところSpellsです。Spellsは実体はStringで、既存の魔法を列挙してあります。

使用例は以下です。

            GunActionUtils.AddGunActionPermanent(wand1,Spells.SPIRAL_SHOT);

これを杖情報を取得した後に実行すると、このコードであればwand1が常時詠唱魔法としてスパイラルショットを持ちます。 Spells.まで打ち込むとサジェストがあるはずなので、適当なスペルを当ててみてください。

AddGunActionであれば通常の魔法として杖に追加されます。

Noitaの杖の定義を読んでみる

Steamで人気?のNolla gamesのNoitaのコード読みます。

今回読むのは、杖の定義です。

具体的には、NoitaのModを使うための手順だったかで「これをルートフォルダに移動して実行しろ!」とか書いてあるファイルを実行したときに展開されるファイル群の中に入っているdata/entities/items/wands/wand_good_1*です。

事前知識

  • 何故か内部定義ではwandではなくgunが使われているようです。もともとはそういうあれだったのかもしれません。
  • コードの記述され方がバラバラです。グローバル領域にべた書きされている部分もあれば、関数でくるんで定義直後で関数呼び出ししているものもあります。
  • どこからでも呼べるAPI関数はパスカルケースのようです。使い捨てな関数はスネークケースのようです。 また、変数名はスネークケースなようです。
  • 基本的にLuaスクリプトを書くことで世界を制御できます

XML

杖の読み込みはXMLをEntityLoadで読み込むことで完了します。まずXMLを読みましょう。

  • Entity
    • AbilityComponent
      • gun_config
      • gunaction_config
    • HotspotComponent
    • Base
      • ItemComponent
      • SpriteComponent
      • SimplePhysicsComponent
    • LuaComponent
    • ManaReloaderComponent
    • LuaComponent(2個目)

なんとなーく名前からわかる気もしますが、ぱっと見ただけではよくわかりません。

ほかのファイルとの関係をみる

同じフォルダには、同名の拡張子違いのファイルがありました。 それらのファイルとの関係性を探ることで何かつかめる気がします。

その視点から見ると、いくらか他のファイルへの参照を持っている要素があります。

  • AbilityComponent
  • Base
  • SpriteComponent
  • LuaComponent
  • LuaComponent(2個目)

このうち、AbilityComponentとSpriteComponentは同じwand_good_1_sprite.xmlへの参照を持っています。

Baseはbase_item.xmlなので名前から素直に考えると、雛形的な何かのようです。 ちらっとみてみたところ、物理演算廻りの数値や当たり判定、光源や音などが定義されているようでした。

残る二つはLuaファイルへの参照を持っています。 1個目はwand_good_1.lua, 2個目はwand_good_pickup.luaです。

基本的にはModはLuaで書かれることになっているはずですので、見ていきましょう。

lua(wand_good_1.lua)

外部ファイル読み込み

dofileは外部ファイル読み込みです。noitaでは関数やテーブルが定義されているファイルを読み込むために使われることが多いです。

必要なら後から読みに行きましょう。

あとdofile_onceがnoitaで定義されて現在ではそちらが推奨されているようです。

関数定義

functionから始まるのは関数定義です。

これらは杖の内容をランダムにしたいときに使う便利関数のようです。

実際の処理

localがローカル変数の定義で、ここからがこのファイルの処理内容のようです。

おそらく最新の==使用されていないEntityIdを取得します。 このEntityIdの位置情報を乱数のシードに使います。

XMLのAbilityComponentをTableとして取得します。

そのあとに杖の能力を定義しています。振れ幅を持ちたい数値は、{下限,上限}や候補などの形で保持しています。

最後に、XMLで定義されていたオブジェクトたちに対して値を代入していきます。

ComponentSetValueは今回はAbilityComponentの要素として、ComponentObjectSetValueはAbilityComponentの子要素の要素として値を代入する関数のようです。

最後のAddGunActionは杖が持っている呪文を定義する関数です。 コメントアウトされているAddGunActionPermanentを代わりにつかうと、永続呪文として定義されます。

Lua

Luaスクリプトの中身は以下の要素から構成されていました。

  • (便利関数定義)
  • AbilityComponentをテーブルとして読みだす
  • 杖のパラメータをAbilityComponentのテーブルに代入する

Lua(wand_good_pickup.lua)

2個目のLuaスクリプトのwand_good_pickup.luaを読みます。このファイルは1関数が定義されているようです。

通常アイテムの取得処理はEntityAddChild()を使ってインベントリーエンティティに対してアイテムを追加します。

どうやらこの関数はワールド内にこの杖が一つしかない状態にしたいようです。 内部に取得処理は特に書かれていないようにみえます(entity_who_pickedが引数にはあるけど使われていない?)。

とりあえず杖の存在の性質(ユニークアイテム)には影響を与えそうですが、杖の能力自体には影響がなさそうなので無視してよさそうです。

まとめ

以下のことが分かりました。

最初は適当な杖のXML定義を改造して、何をしてよいのか探るのがよさそうです(Mod内でエラーがあっても握りつぶされます)。

次は、初期杖を変更するModを書く話をします。