northclimbの備忘録

徒然なるままに...です。

Tarkovのテクニカルアップデート【Ver 0.12.12.15.17861】

まえがき

タルコフ (Escape from Tarkov) のアップデートが来たらしいので翻訳してみる。(ワイプはまだか....) 間違えてても許して....

アップデートの内容

公式によるとテクニカルアップデート Ver 0.12.12.15.17861 の内容は以下の通り。

  1. プレイヤーScavがPMCをキルしてもScav, Raider, Rogueたちは敵対しなくなったよ。
  2. Customs, Reserves, Shoreline, Lighthouseの室内で、雨のアニメーションが貫通してくることがある問題を直したよ。
  3. グレネードの爆発の効果音と描写が消える原因と思しきうちの一つを直したよ。
  4. Raiderがプレイヤーにキルされた時の振る舞いを直したよ。
  5. Reshalaの医療品の使用に関するアルゴリズムを直したよ。
  6. スモークグレネードに対するNPCの反応を直したよ。
  7. Schmidt & Bender PM II 3-12x50(可変倍率スコープ)を使っているときの表示が正しくなかったのを直したよ。
  8. MP-443 Grachをリロードする際のアニメーションで手の位置が不自然だったのを直したよ。
  9. Scav, Raider, Rogueたちは接敵した際に、プレイヤーの近くに位置取ることはなくなったよ。
  10. Chiappa Rhinoを装備している際に、
    • Raidへ行く前のロード画面
    • Characterページ
    • RagmanのServiceタブ
    • Raid後の結果画面
    でキャラクターのアニメーションが固まるのを直したよ。
  11. Terragroupのタープ(防水性能のあるアレ)越しに撃った時に与えるダメージがすごく減る問題を直したよ。

以上です。

確かにグレネードの効果音、消えてることあったかもしれない。

【C言語】型のまとめ

型とは何か

大雑把に説明するのであれば  「データの種類」  のことです。

例えば、「a」であれば文字型、「1」であれば整数型、「0.25」であれば浮動小数点型といったようにデータの形式によって呼び方が異なります。

以下、少し詳しく書きますが読み飛ばしても問題ないです。

「型」は「データ型」と呼ばれることもあります。基本的には同じ型であれば同じ操作が可能です。

(例)
1 + 2 や 3 + 2 という式を考えてみます。
1, 2, 3 は同じ整数型なので同じ演算(操作) '+' をすることができます。
また、'a' や 'x' は同じ文字型なので
例えば 'a' + 1, 'x' + 1 で次の文字を得ることができます。

データ型と呼ばれることからも分かるように、メモリなどの記憶装置上のデータをどのように読むべきかを示しています。また、プログラムで扱われているデータの形式をコンパイラインタプリタなどに伝えることで型検査が行われます。これによって、プログラムがメモリ上などに存在するデータを不正に書き換えないように前もって検査することができます。

型の種類

C言語における型の種類は以下の通りです。

種類型名バイト数値の範囲
型無しvoid
整数型short2-32768 ~ 32767
int2 or 41)-32768 ~ 32767
or
-2147483648 ~ 21474836471)
long4-2147483648 ~ 2147483647
long long8-9223372036854775808 ~
9223372036854775807
unsigned short20 ~ 65535
unsigned int2 or 41)0 ~ 65535
or
0 ~ 42949672951)
unsigned long40 ~ 4294967295
unsigned long long80 ~ 18446744073709551615
浮動小数点数float4 -3.4 \times 10^{38} ~
 3.4 \times 10^{38}
double8 -1.8 \times 10^{308} ~
 1.8 \times 10^{308}
文字型char10 ~ 255
signed char1-128 ~ 127

  • 1)コンパイル時の計算機によって決まります
  • 実際の使い方

    それでは、実際に型をどのように使うのか簡単な例を挙げてみます。コピペして実行するとcdと表示されるはずです。実行する環境がない人は適当に無料のrepl.itでも使ってみてください。下記の記事に登録方法等を"ざっくりと"書いてあるので、分からなければご覧ください。

    northclimb.hatenablog.com

    #include <stdio.h>
    
    int main(void) {
      char x = 'c';
      printf("%c%c\n", x, x+1);
      return 0;
    }
    

    関数の宣言

    まず、int main(void) { }の部分についてです。関数を宣言するには戻り値型 関数名(引数型 引数名){ 処理 }のように書きます。今回のmain関数は正常に終了したときにreturn 0されるので、戻り値は整数型intの0です。したがって、「戻り値型」としてintを指定しています。また、今回のmain関数は引数がない(つまり型無し)なので「引数型 引数名」の部分はvoidとなっています。もし、fという関数が型をfloat、名前をxとして引数を受け取り、戻り値の型を整数型long longにするのであれば、long long f(float x) { }のように書きます。

    変数の宣言

    次に、char x = 'c';の部分です。変数を宣言するには型 変数名;のように書きます。もし、宣言時に変数の中身を初期化したいのであれば、型 変数名 = 初期化時の値;と書きます。今回は後者の方を使っています。具体的には、文字型charを内部に格納する変数xを宣言しており、初期値として'c'が代入されています。もし、整数型unsigned shortを内部に格納する変数numberを宣言したいのであれば、unsigned short number;のように書きます。

    循環(wraparound)する整数型のOverflowを検出する方法

    Julia を触っているときに悩んだので備忘録的に残しておきます。

    考え方

    乗算がオーバーフローしやすいと思うので、その場合で考えていきます。

    説明で使う関数などは Julia-like に書きます。わからない人は下記の表を確認してください。

    Int64 64bitの整数
    typemax(T) T型の最大値 ex) typemax(Int64) = 263 - 1
    typemin(T) T型の最小値 ex) typemin(Int64) = -263
    typeof(x) xの型を返す



    任意の型Tについて、 a, b \in \mathrm{T}, \, a > 0, b > 0 がオーバーフローすると仮定すると、

     a \cdot b > \mathrm{typemax(T)} \tag{1}

    が成り立ちます。しかし、ラップアラウンドする整数型に対して、この式は必ずしも成り立つとは言えません。以下に例を挙げてみます。

    julia> x = 1000000000000000000
    1000000000000000000
    
    julia> typeof(x)
    Int64
    
    julia> x * 10
    -8446744073709551616
    

    このとき、(1) の  a\cdot b でラップアラウンドが発生しています。

    では、ラップアラウンドが起こらないように (1) を変形してみましょう。

     b > \mathrm{typemax(T)} / a \tag{2}

    これでラウンドアップを起こさずにオーバーフローを検出できるはずです。 プログラム言語によっては、  \mathrm{typemax(T)} / a の部分で切り捨て除算が起こり正しく判定できないかもしれないので、適宜処理をしてください。

     a, b の他の場合分けについても同様に考えることができ、オーバーフローする条件は、

     
\begin{cases}
a > 0, b > 0 & \qquad \mathrm{typemax(T)} / a < b \\
a < 0, b < 0 & \qquad \mathrm{typemax(T)} / a > b \\
a > 0, b < 0 & \qquad \mathrm{typemin(T)} / a > b \\
a < 0, b > 0 & \qquad \mathrm{typemin(T)} / a < b
\end{cases}

    の4パターンです。

    実装の例

    上記を考慮して「オーバーフロー時に、より範囲の広い整数型で計算する」関数を Julia で作ると以下のようになります。Base.Checked.checked_mul() を使って OverflowError を try catch するより断然早いはずです。

    function ovf_mul(x::T, y::T) where T<:Integer
        (x == zero(T)) && (return zero(T))
        (y == zero(T)) && (return zero(T))
        if x > zero(T)
            if y > zero(T)
                return (typemax(T) / x) < y ? widen(x) * widen(y) : x * y
            else
                return (typemin(T) / x) > y ? widen(x) * widen(y) : x * y
            end
        else
            if y > zero(T)
                return (typemin(T) / x) < y ? widen(x) * widen(y) : x * y
            else
                return (typemax(T) / x) > y ? widen(x) * widen(y) : x * y
            end
        end
    end
    

    効率的なサトウキビの植え方

    f:id:northclimb:20211208150041p:plain

    皆さんが Minecraft で最も必要とする作物は何でしょうか?

    はい。サトウキビですね。(確信)

    そんな(どんな?)サトウキビを自動で収穫するのもよいですが、まとまった数を集めようとするとそれなりの元手が必要になります。序盤の満足できないような資源量では、サトウキビを優遇するわけにはいかないかもしれません。

    そこで、低コストで効率的な植え方の出番です。

    サトウキビについて

    サトウキビは水源・水流に隣接する土や砂の上に植えることができます。成長に光源は必要ありません。また、成長すると最大で3ブロック分の高さになります。破壊された部分より上のサトウキビは全てアイテム化します(竹と同じ)。ジャガイモやニンジンと異なり、幸運のエンチャントの効果を受けません。

    f:id:northclimb:20211208154105p:plain
    水源に隣接する草の上に植えられたサトウキビ

    効率的な部分(形)を考える

    「効率的ってなんぞ?」となるので指標は「単位面積当たりに植えられたサトウキビ数 (SC/m2) 」にしておきましょう。(マンパワーで収穫することを考えているので"単位時間当たりの収穫数"ではないことに注意)

    これが1に近いほど効率的だと考えられます。

     \displaystyle SC/m2 = \frac{サトウキビ数}{畑の面積(水面含む)}

    上記の式で考えていきましょう。

    f:id:northclimb:20211208163844j:plain

    よく見る小規模の自動化施設の植え方ですね。 上記の写真の場合は、

     \displaystyle SC/m2 = \frac{8}{2 \times 8} = 0.5

    となります。

    サトウキビは水に隣接していればよいので、今植わっている場所の反対側8か所と左右の2か所にも植えられます。さて、どうなるでしょうか?

     \displaystyle SC/m2 = \frac{8 + 8 + 2}{3 \times 8 + 2} = \frac{9}{13} \approx 0.6923

    さっきよりも効率的になりました。では、これを横に8か所並べるのではなく7か所にしたらどうでしょうか。

     \displaystyle SC/m2 = \frac{7 + 7 + 2}{3 \times 7 + 2} = \frac{16}{23} \approx 0.6957

    6か所にすると......

     \displaystyle SC/m2 = \frac{6 + 6 + 2}{3 \times 6 + 2} = 0.7

    気づきましたか?そうです。1か所、つまり1マスの水源の周り4か所にサトウキビを植えた時が最も効率的になります。f:id:northclimb:20211208170028p:plain このとき、

     \displaystyle SC/m2 = \frac{4}{5} = 0.8

    となります。直感的に最も効率のよさそうな植え方と一致しましたね?

    この十字型の部分を隙間なく並べると高効率なサトウキビ畑が完成します。

    効率的な植え方

    さて、そろそろ効率的な植え方を考えていきましょう。前の章で十字型の効率が良いと分かったので、それを隙間なく敷き詰める方法を考えていきましょう。

    f:id:northclimb:20211208233150p:plainf:id:northclimb:20211208233212p:plain

    水源の周りのサトウキビを植えられる箇所をガラスで表現します。左のような感じですね。

    では、これに重ならないようにもう一つの部分を付け足します。すると、左のようになりますね? 上に2ブロック、左(または右)に1ブロックのところに水源を設置していきます。 f:id:northclimb:20211208234236j:plain

    これを繰り返していったものが下の画像です。 f:id:northclimb:20211208233226p:plain

    では、右上にはどのように広げていけばよいでしょうか。お察しの通り、下の画像のように広げます。

    f:id:northclimb:20211208233233p:plainf:id:northclimb:20211208234554p:plain

    この方法で水源を設置した  10 \times 20 の畑が下のようになります。

    f:id:northclimb:20211208234647p:plain
     10 \times 20 のサトウキビ畑と光るイカ

    12マスある磨かれた閃緑岩の部分はこの畑の面積では植えられない場所です。このように長方形の畑を作ると必ず植えられない箇所ができてしまいますが、それでも十分に効率的です。

    それではどの程度効率的か計算してみましょう。

     \displaystyle SC/m2 = \frac{10 \times 20 - (40_{水源} + 12_{植えられない部分})}{10 \times 20} = 0.74

     10 \times 20 よりも畑の面積を大きくすればするほど理想値の0.8に近づいていきます。

     <要検証> 畑の縦横の長さは5の倍数にすると良い(はず)

    ストレスフリーな収穫のためにやること

    前章で効率的な植え方は決まったわけですが、水源の位置が直線的ではないので収穫しにくいです。

    これを解決するためには水源のマスに上付きハーフブロックで蓋をし、その上に湧きつぶしのための松明を設置するとよいでしょう。f:id:northclimb:20211209134337p:plain こうすれば水源に落ちることなくハーベスターのごとく駆け巡ることができるでしょう。

    超簡単 ホッパー付きトロッコ自動取り出し機構

    Minecraft をやっているとホッパー付きトロッコの終着点にアイテムを自動的に取り出す装置が欲しいことが多々ありますよね?(念押し)

    そこで、今回はホッパー付きトロッコの自動搬出装置を作っていきたいと思います。といっても、ものすごく簡単なので身構える必要なんて全く以て無いのですが......

    材料

    作成に必要なアイテムは以下の通りです。(装置部分のみ示します。レール等は必要数だけ準備してください。)

    アイテム名 個数 アイテム名 個数
    チェスト レッドストーン
    パワードレール レッドストーンコンパレータ(比較)
    ブロック※ レッドストーントーチ
    ホッパー

    ※透過ブロックは使用できません。透過ブロックについてはこちら(minecraft.fandom.com)

    完成形

    以下に完成形の画像を載せておきます。作り方の手順も書こうと思ったのですが簡単すぎるので割愛

    これで、パワードレール上に乗ったホッパー付きトロッコはインベントリ内のアイテムを全てチェストに移し、その後自動的に発車します。

    f:id:northclimb:20211207173157p:plain
    ホッパー付きトロッコの自動搬出装置

    上記の通りに作ってうまくいかない場合に考えられることを幾つか羅列しておきます。

    • レッドストーンコンパレータが減算モードになっている。(ブロック側の点が赤く光っている)
    • ホッパーがチェストにつながっていない。
    • ホッパーに外部からのレッドストーン信号が入力されている。

    おわりに

    ホッパー付きトロッコの自動搬出装置自体はこれで完成ですが、搬出先のチェストの代わりにドロッパーを設置してアイテムエレベーターに直結するも良し、アイテム仕分け装置に繋げて大規模倉庫のターミナルにしても良しで夢が膨らみます。

    プログラミング初心者にもreplitをお勧めしたい!

    最近ではweb上でもプログラミングをして実行してみることもできます。

    プログラミングを始める敷居が低くなっていると思うので、簡単にプログラムに触れることができるreplitの紹介をしようと思います。

    repl.it

    何ができるの?

    プログラミング初心者が試行錯誤しながら学ぶだけでなく、チームでチャットをしながら開発できるなど様々な機能が用意されています。また、PCからだけでなく、スマートフォンなどからも接続・実行できるのでおすすめです。通勤電車の暇な時間にプログラミングに挑戦してみてはいかがでしょうか。

    登録の仕方

    まず初めにrepl.itへ行き、まるで囲った Start coding をクリックします。

    そうすると、下記のような登録のフォームが出てきます。ユーザー名、メールアドレス、パスワードを入力して Create account をクリックします。Google, Github, Facebookのアカウントを持ったいる方は、それでログインしてもいいでしょう。

    アカウントの作成は完了です。驚くほど簡単(笑)

    少し使ってみましょう

    せっかくなので少し触ってみましょう。

    左側のタブを開き、 My Repls をクリックします。

    すると、こんな画面が出るので New folder か、 New repl を選びます。

    今回は New repl にします。言語は適当にPythonにしました。

    そして、 Create Repl をクリックしましょう。

    左のタブにコードを書いて上部の Run をクリックします。

    実行結果が右のタブに表示される感じです。簡単でしょ?

    Raspberry Pi で Visual Studio Code をインストールする方法

    まあ、よくある通り必ずしも全ての Raspberry Pi の環境でうまくいくとは限らないのでご容赦を。一応、筆者のシステム情報は以下のようになっています。

    $ uname -a
    Linux raspberrypi 5.4.79-v8+ #1373 SMP PREEMPT
     Mon Nov 23 13:32:41 GMT 2020 aarch64 GNU/Linux

    まずはパッケージ一覧を最新のものに更新しておきます。

    $ sudo apt update

    最近はレポジトリに VScode が追加されているらしいので、以下を実行するだけで十分のはず。

    $ sudo apt install code

    ターミナルで$ code もしくは、デスクトップ左上のラズパイマーク→プログラミング→ Visual Studio Code から起動できる。

    日本語化したい場合は拡張機能の Japanese Language Pack for Visual Studio Code をインストールする。あとは、お好みでカスタマイズ。



    [雑談欄]
    全く関係ないですがおすすめの漫画です。点滴よりもよく効きます。(あくまでも個人の感想です) このような絵が苦手な人には「失礼しました」とだけ。

    ご注文はうさぎですか? 1巻 (まんがタイムKRコミックス)