プログラミングとか色々

プログラミングとかについて色々

OpenBLASの環境構築

実行環境

2024/04/18

デバイス名   LAPTOP-HV84GN6D
プロセッサ 12th Gen Intel(R) Core(TM) i5-1240P   1.70 GHz
実装 RAM  16.0 GB (15.6 GB 使用可能)
デバイス ID C6210A55-C787-4D5F-AE5C-E83A4195C931
プロダクト ID  00355-60821-80951-AAOEM
システムの種類   64 ビット オペレーティング システム、x64 ベース プロセッサ
ペンとタッチ  このディスプレイでは、ペン入力とタッチ入力は利用できません
エディション    Windows 11 Pro
バージョン 23H2
インストール日   2023/11/04
OS ビルド    22631.3447
エクスペリエンス    Windows Feature Experience Pack 1000.22688.1000.0
$ wsl -v
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3447
$ uname -a
Linux LAPTOP-HV84GN6D 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

インストール

パッケージマネージャーから(失敗)

https://github.com/OpenMathLib/OpenBLAS/wiki/Precompiled-installation-packages#linux に従ってインストールした aptを使ったがインストール先がかわからなかったため、リンクができず諦めた

ビルド時間がだいぶ長かったため、インストール先がわかればこの方法のほうが早くインストールできると思う

ソースコードから

基本的にこの通りに https://github.com/OpenMathLib/OpenBLAS/wiki/User-Manual

  • ソースコードはgitを使ってdevelopブランチをクローンした
    • だいぶ大きなリポジトリでダウンロードにもそこそこ時間がかかった
  • ビルドするマシンで使うためNormal compileで良くmakeを実行した
    • ビルドはだいぶ時間がかかった
  • make install PREFIX=/usr/local/でインストールした
    • include,bin,libの3つのディレクトリが作られるため、PREFIX=/usr/local/includeではなく上記のパスで良い
    • ドキュメント/your_path/OpenBLAS/の部分が/usr/local/になる

実際に動かす

上記の通りに設定した場合、

  • 静的リンクは
gcc -o test test.c /usr/local/lib/libopenblas.a

コンパイル

  • 動的リンクは
gcc -o test test.c -I/usr/local/include/ -L/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -lopenblas

コンパイル

Helix editor使ってみて

Helixはrust製のエディターです。 丸1日使ってみて思ったことなど、いろいろ雑に。

helix-editor.com

GitHub - helix-editor/helix: A post-modern modal text editor.

自己紹介

感想

全体的な感想としてはどちらかといえばいいと思う。 痒い所に手が届かない感じ。 メインエディターとして使うには不便そう。

良かったところ

  • ちょっとコードを読み書きするだけなら標準の設定で十分
  • 高速に起動し、すぐにコードが書き始められる
  • file pickerが使いやすく、ファイルを開くのが楽
  • 最初から使えるカラーテーマが豊富でオシャレ
  • vim-likeなキーバインドで意外と簡単でシンプル
  • コメントアウトをよくするのでコマンドがctrl-cで楽

いまいちなところ

  • 手動でlanguage serverをインストールする必要があり、めんどくさい
  • 全体的にvimと比べてコマンドが少ないイメージ
    • vimの段落移動(}, {)、変更(ciw, ci")をよく使っていて、これにあたるコマンドがなさそう
    • Y、D相当のコマンドはx<space>yvgldでタイプ数が多くなってつらい
  • プラグインに対応していない
  • vim:term相当のことができない

個人的注目ポイント

アセンブリと仲良くなりたい

アセンブリと仲良くなりたい

この記事は群馬高専アドベントカレンダー2022の22日目の記事になります。

目次

自己紹介

いろんなプログラミング言語に手を出すのと競プロが好きです。 浅くいろんなものに手を出してます。最近は音楽とプラモデルにはまってます。

アセンブリ難しくない?

この頃とても便利な高レベル言語がたくさんあり、アセンブリといった低レベル言語を使う機会はあまりなくなりました。 しかし、弊学J科のマイコンの授業ではアセンブリの読み書きができるようにならなければいけません。 そのうえ学校の実行環境は特殊なソフトとマイコンを使うのであまり手軽ではなく難しいものとなっています。 情報系の学生にとってこのような状況は意外と多いのではないでしょうか

家でもアセンブリを読み書き・実行できると便利だと思いこの記事を書きました。

形式とかアーキテクチャとかについてはまだよく調べられてないので適当ですみません

アセンブリ読みたい

c言語からアセンブリ

gccではc言語からアセンブリの生成ができます。 gccのほかにもzig ccclangでもできるらしいです。 コンパイルオプションとして-Sを追加します。

標準ではAT&T形式アセンブリが生成され、追加でオプションを追加することでAT&T形式intel形式を変えることができるらしいです。

例として、

gcc -S test.c

を実行するとtest.sが生成されます。 このtest.sはこのような内容になっています。

そこそこ長いので折りたたみます

test.cソースコード

int main() {
    return 0;
}

出力結果

    .text
    .def    @feat.00;
    .scl    3;
    .type   0;
    .endef
    .globl  @feat.00
.set @feat.00, 0
    .file   "test.c"
    .def    main;
    .scl    2;
    .type   32;
    .endef
    .globl  main                            # -- Begin function main
    .p2align    4, 0x90
main:                                   # @main
.seh_proc main
# %bb.0:
    pushq   %rbp
    .seh_pushreg %rbp
    subq    $48, %rsp
    .seh_stackalloc 48
    leaq    48(%rsp), %rbp
    .seh_setframe %rbp, 48
    .seh_endprologue
    callq   __main
    movl    $0, -4(%rbp)
    xorl    %eax, %eax
    addq    $48, %rsp
    popq    %rbp
    retq
    .seh_endproc
                                        # -- End function
    .addrsig

実行ファイルからアセンブリ

objdumpコマンドを使用することで実行ファイルからアセンブリの生成ができます。 -dオプションを使うことでdisassembleができます。 windowsでもこのコマンドを使用することができますが、 出力されるアセンブリがとても読みにくいため環境があればlinuxがおすすめです。

Linux 5.15.79.1-microsoft-standard-WSL2 での実行例を下にまとめます。

だいぶ長いので折りたたみます

test.c元のC言語ファイル

int main() {
    return 0;
}

コンパイルして実行ファイルにし、それをディスアセンブルする。

gcc test.c
objdump -d ./a.out

出力結果

./a.out:     file format elf64-x86-64


Disassembly of section .init:

0000000000001000 <_init>:
    1000:       f3 0f 1e fa             endbr64
    1004:       48 83 ec 08             sub    $0x8,%rsp
    1008:       48 8b 05 d9 2f 00 00    mov    0x2fd9(%rip),%rax        # 3fe8 <__gmon_start__@Base>
    100f:       48 85 c0                test   %rax,%rax
    1012:       74 02                   je     1016 <_init+0x16>
    1014:       ff d0                   call   *%rax
    1016:       48 83 c4 08             add    $0x8,%rsp
    101a:       c3                      ret

Disassembly of section .plt:

0000000000001020 <.plt>:
    1020:       ff 35 a2 2f 00 00       push   0x2fa2(%rip)        # 3fc8 <_GLOBAL_OFFSET_TABLE_+0x8>
    1026:       f2 ff 25 a3 2f 00 00    bnd jmp *0x2fa3(%rip)        # 3fd0 <_GLOBAL_OFFSET_TABLE_+0x10>
    102d:       0f 1f 00                nopl   (%rax)

Disassembly of section .plt.got:

0000000000001030 <__cxa_finalize@plt>:
    1030:       f3 0f 1e fa             endbr64
    1034:       f2 ff 25 bd 2f 00 00    bnd jmp *0x2fbd(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
    103b:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

Disassembly of section .text:

0000000000001040 <_start>:
    1040:       f3 0f 1e fa             endbr64
    1044:       31 ed                   xor    %ebp,%ebp
    1046:       49 89 d1                mov    %rdx,%r9
    1049:       5e                      pop    %rsi
    104a:       48 89 e2                mov    %rsp,%rdx
    104d:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
    1051:       50                      push   %rax
    1052:       54                      push   %rsp
    1053:       45 31 c0                xor    %r8d,%r8d
    1056:       31 c9                   xor    %ecx,%ecx
    1058:       48 8d 3d ca 00 00 00    lea    0xca(%rip),%rdi        # 1129 <main>
    105f:       ff 15 73 2f 00 00       call   *0x2f73(%rip)        # 3fd8 <__libc_start_main@GLIBC_2.34>
    1065:       f4                      hlt
    1066:       66 2e 0f 1f 84 00 00    cs nopw 0x0(%rax,%rax,1)
    106d:       00 00 00

0000000000001070 <deregister_tm_clones>:
    1070:       48 8d 3d 99 2f 00 00    lea    0x2f99(%rip),%rdi        # 4010 <__TMC_END__>
    1077:       48 8d 05 92 2f 00 00    lea    0x2f92(%rip),%rax        # 4010 <__TMC_END__>
    107e:       48 39 f8                cmp    %rdi,%rax
    1081:       74 15                   je     1098 <deregister_tm_clones+0x28>
    1083:       48 8b 05 56 2f 00 00    mov    0x2f56(%rip),%rax        # 3fe0 <_ITM_deregisterTMCloneTable@Base>
    108a:       48 85 c0                test   %rax,%rax
    108d:       74 09                   je     1098 <deregister_tm_clones+0x28>
    108f:       ff e0                   jmp    *%rax
    1091:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    1098:       c3                      ret
    1099:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

00000000000010a0 <register_tm_clones>:
    10a0:       48 8d 3d 69 2f 00 00    lea    0x2f69(%rip),%rdi        # 4010 <__TMC_END__>
    10a7:       48 8d 35 62 2f 00 00    lea    0x2f62(%rip),%rsi        # 4010 <__TMC_END__>
    10ae:       48 29 fe                sub    %rdi,%rsi
    10b1:       48 89 f0                mov    %rsi,%rax
    10b4:       48 c1 ee 3f             shr    $0x3f,%rsi
    10b8:       48 c1 f8 03             sar    $0x3,%rax
    10bc:       48 01 c6                add    %rax,%rsi
    10bf:       48 d1 fe                sar    %rsi
    10c2:       74 14                   je     10d8 <register_tm_clones+0x38>
    10c4:       48 8b 05 25 2f 00 00    mov    0x2f25(%rip),%rax        # 3ff0 <_ITM_registerTMCloneTable@Base>
    10cb:       48 85 c0                test   %rax,%rax
    10ce:       74 08                   je     10d8 <register_tm_clones+0x38>
    10d0:       ff e0                   jmp    *%rax
    10d2:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
    10d8:       c3                      ret
    10d9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

00000000000010e0 <__do_global_dtors_aux>:
    10e0:       f3 0f 1e fa             endbr64
    10e4:       80 3d 25 2f 00 00 00    cmpb   $0x0,0x2f25(%rip)        # 4010 <__TMC_END__>
    10eb:       75 2b                   jne    1118 <__do_global_dtors_aux+0x38>
    10ed:       55                      push   %rbp
    10ee:       48 83 3d 02 2f 00 00    cmpq   $0x0,0x2f02(%rip)        # 3ff8 <__cxa_finalize@GLIBC_2.2.5>
    10f5:       00
    10f6:       48 89 e5                mov    %rsp,%rbp
    10f9:       74 0c                   je     1107 <__do_global_dtors_aux+0x27>
    10fb:       48 8b 3d 06 2f 00 00    mov    0x2f06(%rip),%rdi        # 4008 <__dso_handle>
    1102:       e8 29 ff ff ff          call   1030 <__cxa_finalize@plt>
    1107:       e8 64 ff ff ff          call   1070 <deregister_tm_clones>
    110c:       c6 05 fd 2e 00 00 01    movb   $0x1,0x2efd(%rip)        # 4010 <__TMC_END__>
    1113:       5d                      pop    %rbp
    1114:       c3                      ret
    1115:       0f 1f 00                nopl   (%rax)
    1118:       c3                      ret
    1119:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

0000000000001120 <frame_dummy>:
    1120:       f3 0f 1e fa             endbr64
    1124:       e9 77 ff ff ff          jmp    10a0 <register_tm_clones>

0000000000001129 <main>:
    1129:       f3 0f 1e fa             endbr64
    112d:       55                      push   %rbp
    112e:       48 89 e5                mov    %rsp,%rbp
    1131:       b8 00 00 00 00          mov    $0x0,%eax
    1136:       5d                      pop    %rbp
    1137:       c3                      ret

Disassembly of section .fini:

0000000000001138 <_fini>:
    1138:       f3 0f 1e fa             endbr64
    113c:       48 83 ec 08             sub    $0x8,%rsp
    1140:       48 83 c4 08             add    $0x8,%rsp
    1144:       c3                      ret

アセンブリ書きたい

gccではアセンブリ.sファイルとして認識し、

gcc test.s

とするとアセンブリファイルから実行ファイルを生成してくれます。

これもgccのほかにもzig ccclangでもできるらしいです。

これは余談なのですが、gccでは.cファイル、.hファイルをコンパイルできるのは有名ですが、ほかのファイルを渡した場合どうなるのでしょう。 そもそもgccccはC Compilerの略ではなく、Compiler Collectionのccらしいです。 そして、公式ホームページによると、

The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...)

と、いろいろな言語をサポートしているようです。(c言語以外で使ったことないですが、、、)

これもそこそこ長いので折りたたみます

適当にフィボナッチ数列rdi項目を求めるプログラムtest.sを書きました。

.intel_syntax noprefix
.globl main

fib:
    mov rdx, 0
    mov rcx, 1
fib_loop:
    mov rsi, 0
    add rsi, rdx
    add rsi, rcx
    mov rdx, rcx
    mov rcx, rsi
    sub rdi, 1
    cmp rdi, 0
    jne fib_loop
    mov rax, rsi
    ret

main:
    mov rdi, 5
    call fib
    ret
gcc test.s
./a.out

を実行すると生成されたa.outが実行されます。 (windowsならa.exe?) 出力結果は

bash

echo $?

fish

echo $status

powershell

echo $LASTEXITCODE

で見ることができます。

さいごに

アセンブリと仲良くなりましょう!!

次は、「こひむ」さんの「高専プロコン失敗談」です。

Python嫌いがPythonを使うようになった理由

Python嫌いがPythonを使うようになった理由

この記事は群馬高専アドベントカレンダー2022の6日目の記事になります。

目次

自己紹介

いろんなプログラミング言語に手を出すのと競プロが好きです。 浅くいろんなものに手を出してます。最近は音楽とプラモデルにはまってます。

はじめに

最近、Pythonプログラマだけでなく研究者や怪しいプログラミングスクールの広告プログラミング初心者にとっても人気な言語となってきており、注目されている言語だと思っています。

そんなPythonですが、C、C++C#、Rustといった言語が好きで普段から使ってきた自分にとってあまり魅力的な言語には感じていませんでした。しかし、最近良さがわかってきたので紹介しようと思いこの記事を書きました。 主にwindows11とvscodeで使用することを想定しています。

Pythonのいいところ

まず、Pythonのわかりやすいいいところとして以下のようなものがあるかと思います。

  1. ライブラリの豊富さ
    • 標準ライブラリだけでもとても多くの機能がある
    • PyPIという巨大なパッケージ公開サイトがある
  2. 手軽さ
    • コンパイルが必要なくREPLもあるため手軽にコードを実行することができる
  3. 壊滅的なコードが生まれにくい
    • インデントでブロックを決めるので、インデントがないコードが生まれないです

初心者や簡単な自動化、計算などをするうえでとても便利な機能を備えており、人気になる理由がわかります。 他にも、C,C++といった他言語との連携が簡単にできるなど様々ないいところを持っている言語です。

個人的に驚いた標準ライブラリ

公開されているパッケージライブラリが豊富なPythonですが、標準でも様々なライブラリが搭載されています。この標準ライブラリの豊富さもPythonを手軽に・便利に使用するための大きな手助けになっています。

少し内容がずれますが、「この機能、標準ライブラリなの!?」と思ったものをコラムのような感じで紹介していきます。

  1. データ圧縮とアーカイブに関するライブラリ
    • zipやtarなどの圧縮ファイルをいじることができます
    • 具体的に、zlibgzipgz2lzmazipfiletarfileがあります
  2. ファイルフォーマットに関するライブラリ
    • csv、toml、jsonと大体何でもいじれます
    • 特に驚きなのですが、Macユーザの方向けに.plistをいじれるplistlibというものもあります
  3. 構造化マークアップツールに関するライブラリ
    • html、xmlがいじれます

ほかにも暗号化サービスや、メールの送受信を行うライブラリもあります。 これらは標準ライブラリなためpipなどでダウンロードしなくても最初から使用することができます。 標準ライブラリに組み込むほど需要のあるライブラリなのでしょうか?

個人的に好きな標準ライブラリ

次に好きなライブラリです

  1. itertools
    • 気持ちよくコードが書けるようになります
  2. functools
    • 気持ちよくコードが書けるようになります
  3. collections
    • 気持ちよくコードが書けるようになります
  4. tkinter
    • 標準でGUIライブラリがついているのはなんだかんだ便利です
  5. typing
    • 型ヒントに関するライブラリです
    • コードを読みやすく書きやすくしてくれます
  6. os

このライブラリたちは、コードを書くのが楽しくなる・簡単になるため好きなライブラリです。

公式リファレンスを読むと他にもたくさんあって面白いのでぜひ読んでみてください。

Pythonの悪いところ

一方で、以下の理由からPythonを使っていませんでした。

インタプリタでの実行

  • 実行速度が遅い
  • コンパイルで検出できるエラーが検出されない
  • 実行時のエラーもわかりにくい

複数のインタプリタに環境を破壊される

  • Windowsの場合、anaconda、microsoft store、公式サイト、など様々な所からインストールでき、それぞれのインタプリタのバージョンも管理しなくてはいけない
  • Pythonコマンドを実行したとき、どれが実行されるかわからない

動的型付け

  • IDEによる補完が効きにくい
  • コードを見ないと動作が想像しにくい

これらは、自分にとってメリットを上回るデメリットでした。

Pythonの悪いところの改善

実行速度の改善

Faster CPython計画が現在動いています。 この計画はCPython3.10から4年で1.5倍ずつ、最終的に5倍高速化することを目標にしているそうで、かなりの高速化が期待できます。[参考]

エラーメッセージの改善

Pythonのバージョンが上がるごとにエラーメッセージが改善されているようです。 例えば3.11では、トレースバックで例外の位置を正確に指し示す機能が実装されました。[参考]

from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float

def distance(a, b):
    return abs(a.x-b.x) + abs(a.y-b.y)

def main():
    a = Point(3, 4)
    b = None
    distance(a, b)

if __name__ == "__main__":
    main()

というコードに対し、3.10以前では、

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    main()
  File "test.py", line 14, in main
    distance(a, b)
  File "test.py", line 9, in distance
    return abs(a.x-b.x) + abs(a.y-b.y)
AttributeError: 'NoneType' object has no attribute 'x'

と表示されていたものが、

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    main()
    ^^^^^^
  File "test.py", line 14, in main
    distance(a, b)
    ^^^^^^^^^^^^^^
  File "test.py", line 9, in distance
    return abs(a.x-b.x) + abs(a.y-b.y)
                   ^^^
AttributeError: 'NoneType' object has no attribute 'x'

と波線が引かれどの変数に関するエラーなのかがわかりやすくなりました。(この記事から引用)

複数のインタプリタ

アプリ実行エイリアスの設定

複数のPython環境が混在する中でPythonを実行するような場合、Windows11ではアプリ実行エイリアスを設定することで考えることが減ります。

VSCodeインタプリタの選択

vscodeでは見やすいインタプリタ選択画面が表示されます。 おすすめも表示されるのでよくわからない場合も安心(?)です。

型ヒントの使用

型ヒントを使うことによってエディタに補完してもらいやすくなります。 また、Python3.9からは型ヒントがより書きやすくなり、typing.Listtyping.Setなどが非推奨になり、そのままlistsetなどと書けるようになりました。

例えば、list[int]型のすべての要素にxを加算し、結果のリストを返すというシンプルな関数を考えます。 型ヒントがない場合、変数a, xがそれぞれ何なのかわからずこの関数を使用するにはコードを読まなければなりません。 また、返ってきた値を使用するときも型情報が失われているためlist[int]に対する補完が行われません。

def add_x(a, x):
    return list(map(lambda t: t + x, a))

一方で、型ヒントを書くとそれぞれの変数に何を入れると何が返ってくるのかがわかるようになり、エディタからの補完もされるようになるため、気持ちよくコードを書くことができるようになります。

def add_x(a: list[int], x: int) -> list[int]:
    return list(map(lambda t: t + x, a))

さらに、型ヒントをもとに静的検査を行うことで実行前にエラーとなりうるか所を検出することもできるようになります。

まとめ

これらのことをすることによって少ないストレスでPythonを書けるようになりました。 なにより、やりたいことを豊富なライブラリと様々な言語機能によってほかの言語より短いコードで書くことができ、手軽に実行できるようになりました。

短く簡潔に書けるため、早さが重視される競プロなどにおいては多少有利に立ち回ることができるようになります。

皆さんもストレスなくPythonを書いてやりたいことを簡単に、退屈なことを手軽に自動化しましょう!

次は、しろだんごさんによる「学生生活4年間の食生活と料理スキルの変遷を辿る」です。

3年次編入体験記

2023年度山梨大学コンピュータ理工学科の3年次編入に合格しました。

編入に関して情報が少ないので今後の誰かの役に立てればと思い書きました。 体験記書くことを考えてなかったので、写真が少なかったり、細かい抜けがあったりすみません…

プロフィール

使用した問題集

これだけをひたすらやり込みました。 www.dainippon-tosho.co.jp

問題が編入試験の過去問からできており、回答・解説もわかりやすく書いてあるためおすすめです。(他のものを使っていないため比較はできませんが…) 受験した大学はすべて数学とプログラミングだけなので他の問題集や参考書は何も使ってないです。

山梨大学 コンピュータ理工学科

試験内容

試験問題は、筆記試験の

のうち、好きな2科目を解いて提出する+面接という形です。 問題を見てから2科目を選べるため、難しい・簡単な問題ばかりの科目があったときのために全科目勉強しておいたほうがいいです。 TOEICはないです。

筆記試験は過去問が3年分公開されているのでこれを使いました。 過去問を一通りやるとわかりますが、範囲が広く、傾向と対策が難しいです。

www.yamanashi.ac.jp

そこまで深い知識や高度な発想が必要な問題は出ない傾向にある気がするため、幅広くきちんと勉強しておくと良いと思います。 ちなみに、プログラミングと計算機アーキテクチャを選択し、7~8割程度解けて合格できました。

面接に関しては、

  • 志望理由
  • 入学後頑張りたいこと
  • 最近気になったニュース
  • 卒業研究の内容

が聞かれました。 先輩から聞いていた内容とほぼ同じ質問だったため、面接で聞かれる内容はあまり変わらないのではないかと思います。

試験前後の流れ

甲府 ビジネスホテル ホテルニューステーションに宿泊し、2泊3日で試験に挑みました。

ホテルについては、値段が安く、山梨大学からとても近かったため良かったと思います。 自分の泊まった部屋には机がなく、勉強するのが大変でした。 また、ホームページにはwi-fi有りと書いてありますが、通信速度がとても遅くfast.comで800Kbps前後しか出なかったためPCやタブレットを使ってインターネットに接続しながら勉強する人にはあまりおすすめできません。

ホテルニューステーションでの朝食

当日は、ホテルに荷物を置かせてもらい、必要なものだけを持って試験に向かいました。 駅から大学まで上り坂なので荷物を多く持ってきている人はどこかにおいておくと良いと思います。

昼食は試験会場のすぐ近くにコンビニがあったためそこで買いました。

予定表には17:00までとあったためもう1泊ホテルを予約しましたが、12:30頃にはすべて終わりました。 試験官の方が遠くから来ている人を優先して面接を行うと行っていたので1泊2日でも良かった気がします。

その他

服装は全員スーツでした。

定員は5名と記載されていましたが、20人くらい受験し8名合格でした。

筑波大学 情報学群情報学類

試験内容

プログラミング2問+数学2問+TOEICが出題されます。

TOEIC510点、筆記試験6~7割で不合格でした。

TOEICのスコアシートがないと受験させてくれないので忘れないように注意してください。

筑波も過去問が公開されているのでこれを使用しました。 ac.tsukuba.ac.jp

正確にはわかりませんが、倍率は13~20倍くらいだったらしいです。

試験前後の流れ

ダイワロイネットホテル筑波に1泊2日で宿泊しました。 このホテルも筑波大学から一番近かったためここに決めました。 このホテルは、十分広い机と普通に使える程度のwi-fiが提供されており、試験前日は快適に復習できました。

筑波大学は、予想以上に大きく試験会場がどこなのかわかりにくかったため、予め会場を確認に行っておくと良いと思います。

試験当日は、本当に受験だけしてすぐ終わりなので特に注意点とかはないと思います。

その他

服装は2/3くらいが私服でほかはスーツ(学生服?)でした。

最後に

この体験記が少しでも合格の助けになれば嬉しいです。 何かわからない点や聞きたいこと等あれば、気軽にTwitterのDM送って大丈夫です! 3年次編入をする方、あまり情報がなく不安かもしれませんが頑張ってください!!

ちょっとオシャレにJuliaを使う

Juliaと書きましたが、コンソール上で動くcuiアプリであればPythonでも何でも大丈夫だと思います。

1. Windows Terminalをインストールする

ここからインストールできます。

www.microsoft.com

オープンソースソフトウェアです。プレビュー版や、ソースコードはここから。

GitHub - microsoft/terminal: The new Windows Terminal and the original Windows console host, all in the same place!

2. 新しいプロファイルを追加する

 設定画面を開き、新しいプロファイルを作成します。 名前・コマンドラインを設定すれば、windows terminal上で起動できます。

 外観の欄を設定することで、好みのカラーテーマ、フォント、カーソルの形等さまざまな設定が行なえます。 ここで、背景画像設定、透明化、ウィンドウのパッディングの設定が行えるのが大きなポイントだと思います。

f:id:namacha411:20220317182438p:plain
新しいプロファイル

3. 完成

いい感じ

f:id:namacha411:20220317183517p:plain

Rustでmultisetを使う

Rustでmultisetを使う

C++のmultiset相当のものはRustの標準ライブラリにないが、いい代用方法を見つけたのでメモ

AtCoderの提出一覧から頭のいいコードを見つけたのでパクる

multisetとは

multiset は連想コンテナの一種であり、要素自身がキーとなる。

連想コンテナは特にそれらキーによる要素アクセスが効率的になるよう設計されたコンテナである(要素への相対位置または絶対位置によるアクセスが効率的であるシーケンシャルコンテナとは異なる)。

内部的には、multiset 内の要素は、コンテナの構築時に設定された狭義の弱順序基準に従って小さいものから大きいものへとソートされる。

setが重複キーを許可しないのに対し、multisetは重複キーを許可する。

cpprefjp.github.io

代用方法

方針

BTreeSetを使用し、要素に重複しないものをタプルで持たせることで重複キーを許可する

multisetとの対応

使ったもの・わかりにくかったものを書く

説明 C++ Rust
multiset BTreeSet
挿入 insert(x) &self.insert((x, 重複しない値))
与えられた値より大きいもの upper_bound(x) &self.range((x, 十分小さい値)..)
与えられた値より小さいもの lower_bound(x) &self.range(..=(x, 十分大きい値))

他もBTreeSetのメソッド、Rustのiterを使っていい感じに書けると思う

使用例

atcoder.jp

use std::collections::BTreeSet;
use proconio::{input, fastout};

#[fastout]
fn main() {
    input! {
        query: usize
    };

    let mut a = BTreeSet::new();
    let inf = std::usize::MAX;
    for i in 0..query {
        input! { q: usize, x: usize };
        match q {
            1 => {
                a.insert((x, i));
            },
            2 => {
                input! { k: usize };
                if let Some((x, _)) = a.range(..=(x, inf)).rev().nth(k - 1) {
                    println!("{}", x);
                } else {
                    println!("-1");
                }
            },
            3 => {
                input! { k: usize };
                if let Some((x, _)) = a.range((x, 0)..).nth(k - 1) {
                    println!("{}", x);
                } else {
                    println!("-1");
                }
            },
            _ => unreachable!()
        }
    }
}