OtakuAssembly 出版記

OtakuAssembly Vol.1が技術書典7で出ました。
https://techbookfest.org/event/tbf07/circle/5710683937177600
ここでは終了後の感想やOtakuAssemblyの成り立ちなどを書いておきます。

OtakuAssemblyの成り立ち

2019/4/14の池袋で技術書典6がありました。
当時上京したてで初めての東京らしい大規模イベントに参加しました。
セキュリティキャンプを超える1万人の人混みの中で今まで見たこともない数の技術書同人誌を見て多くの先端技術やニッチな技術を知りました。
そのときにセキュリティキャンプ2017に参加したときのあの熱さとともに当時思っていた「新たな視点でOSを作る人の支援をする」という目標を思い出しました。
「自分も本を出版して新たなOS自作をする人のお手伝いしたい」、そう熱い思いを抱えて帰宅し密かに文を書き出しました。ところがいざ書き始めると「本を書くのは思っていたより難しい…」「こんな初歩的なネタで受けるんだろうか…」「印刷費も高いし大損はしたくないな…」と多くの壁が立ちはだかりました。そんな不安でモジモジしていたときに@sksat_tty氏に会う機会があり、雑談の後ある話題を持ちかけました…「技術書を一緒に書いてみないか。そうすればボリュームも増えてクオリティーも上がるし印刷費も分担できてリスク回避にもなる。合同誌だとネタにもなるだろうし、もう少しメンバーを増やせばもっと面白くなりそう。」と。sksat氏の返事は芳しくなく「やるならちゃんとした内容でやりたいし今の自分ではその域に達していないから…」というごもっともな意見で話が終わりました。そんな話を聞いて自分も「OSがバリバリできるわけでもないし、やっぱり本を出すのはおこがましすぎるかな…」と技術書執筆の熱も冷めていきました。
執筆作業もおろそかになっていたとき突然sksat氏から声がかかりました。どうやら「『本を書きたい』と言っているうちは書かないんですよ。」と煽られたとのことで、sksat氏とたまたま一緒にいたCra2yPierr0t氏を巻き込んで「本を書こう!!」とSlackチームが結成されました。
その後にTwitterで募集をかけたらメンバー10人以上になったり、Otaku + Assemblyという安直足し算でサークル名が決まったり、脅威の300Pの本ができたり…とあっという間に時が過ぎていき、気づけば技術書典7でサークル側に立っていました。

OtakuAssembly Vol.1を売ってみて

びっくり、ただただびっくりです。
当初も思いもよらなかった300Pの分厚い「薄い本」ができたと思ったら、43秒で一冊売れる勢いで売れてしまって5時間近くダウンロードカードを渡す作業をして、空いた口が塞がらないほどの驚愕です。
終わった後で原稿を読み返してみたら、圧倒的ボリュームで自分が知らないこともサークルメンバーがたくさん書いてくださってました。
OtakuAssembly Vol.1が成功したのは本当にメンバー皆様のおかげです。
こんなリーダー性のかけらのないオタクと一緒に進んでくれて、最終的に二人原稿を落としてしまいましたが「8人分のゴチャゴチャに低レイヤーネタが詰め込まれた分厚い本」というインパクト抜群の本を出版できましたし、そのおかげで売ることができたと思います。
自分の書いた記事が果たしてどんな評価を受けるかわかりませんが、「技術書を書きたいんだ」という思いのたくさん詰まったOtakuAssembly Vol.1を大切にしたいと思います。
次回が出るかわかりませんがその時はどうか皆さんよろしくお願いします。

OtakuAssemblyの良かった点・悪かった点

良かった点

  • ネタ盛りだくさんのボリューミーな本が作れて話題を呼び完売できた
  • 印刷費のリスクヘッジができた
  • 校閲作業をみんなでできた(文章下手な自分にとって大変ありがたい)
  • 作業が分担できたり、様々な知見を頼りにできた

悪かった点

  • お金の話では少し揉めた(しっかり取り決めて厳重に扱うべき)
  • お金の受け渡しに難がありそう(金銭やり取りは最小限にすべき)
  • 意思疎通がうまく行ってない点もあった(これは自分がリーダーを決めたり、役割を指定しなかったのが悪いです…)

終わりに

BOOTHなどでの販売も予定しているのでよかったら購入してください。
購入してくださった皆様、心から感謝します。またどこかでお会いしましょう。

Thermaldの設定の仕方

熱暴走(?)気味のノーパソを手に入れてしまい、Windowsはなんとか使える範囲だけどLinux入れて並行作業すると動作カクカクなので悲しい(親との相談の上大学用のWindows機として使うことにしました)。Core i5なんだけどなぁ…今回はメーカを冒険してみましたが、Linux機を買うときはメーカもしっかり選びましょう。

そんなわけで、Thermaldを入れて発熱を抑えようと思いましたがその時の設定方法をメモしておきます。thermaldは導入済みとします。
設定ファイル作る方法は

$ git clone https://github.com/intel/dptfxtract.git
$ cd dptfxtract
$ sudo acpidump > a
$ sudo acpixtract a
$ sudo ./dptfxtract *.dat
$ sudo cp /etc/thermald/thermal-conf.xml.auto /etc/thermald/thermal-conf.xml

としたら環境にあった設定ファイルができます。(acpiutilがないとacpidumpあたりは動かないかも)
あとは設定ファイルをお好みでいじってsystemctlでenableしてやるといいと思います。

セキュリティキャンプ2019参加記(チューター)

ドッタンバッタン大騒ぎして結局今までろくにまとめられなかったセキュリティキャンプの参加記。
感想も交えて詳しく書けたらいいなと思っています。

セキュリティキャンプ2017参加記

こんなことを書いて早2年、セキュリティキャンプにチューターとして参加ささせていただくことができました。というわけで前回と同じようにまとめたいと思います。
セキュリティキャンプの様子を知りたい方は、セキュリティキャンプ2017参加記も参考にされると良いと思います。
注意
この記事では大量のツイート埋め込みを行っていますので、ロースペックPCなどで重くなることがございます。ご了承ください。

“セキュリティキャンプ2019参加記(チューター)” の続きを読む

ドメインをDynadotにTransferした

このドメインですが、某名前ドットコムが嫌すぎたので、別ドメインを保持しているdynadotに移管したので、記録しておきます。

まず、移管元で移管ロックをはずしてAuth Codeを手に入れます。
この時にやらかしたのですが、移管元に「Whoisプロテクトメール転送オプション」ってありまして、WhoisプロテクトをかけておきながらTransfer転送メールが受け取れると思い、それができるかどうかホームページで読んだのですが、これまた文章がわかりにくて…まあやれるだけやってみようと食費を削ってオプションに申し込みましたが、結局できませんでした。Transferは即座に拒否されて失敗しました。
というわけでドメインのTransferはWhoisプロテクトを外すしかないようです。

認証に失敗したためDynadotさんに英語で連絡して、「認証に失敗したためTransferを一旦キャンセルしてほしい」と頼んだところ、「向こうからキャンセルの連絡がないとできないんだ…メールは届いてるみたいだけど、こっちには連絡きてないね…確認するからもうちょっとまって」というやり取りをして、結局移管元の連絡待ちになったわけですが、幸い数時間後に連絡が来たようで、やり直しになりました。

まず、ドメイン移管ロックとWhoisプロテクトを外して、Auth Codeを手に入れます。
次にDynadot側でAuth Codeを入れてWhoisプロテクトを有効にして購入作業を行った後に、移管元から確認メールが来ますので指定されたURLにアクセスします。

購入画面
色々隠しているけど、どこのレジストラかまるわかり…

承認すると、上位レジストラの承認待ちになるのでしばらく待ちます。自分は数時間で通りました。そうするとDynadotから完了通知メールが飛んできて即座にWhoisも書き換えられてプロテクト状態になります。

完了通知メール

というわけで、なんだかんだ言いながらできました…

SiFive HiFive 1 Rev Bで遊んだ

セキュリティキャンプ2019にチューターとして参加しているときにhikalium先生からHiFive1 RevBというものを借りて、https://github.com/PG-MANA/RuscV (Rustで書かれたOSもどき)を試してみようとビルドしたので記録します。

まずHiFive1はRISCV-32 IMACなアーキテクチャなのですが、RuscVはRISCV-64 IMAC向けに書いていたので(というよりテストしていたので)、大幅に書き換えました。

地味にメモリ配置もHiFive1とHiFive1 Rev Bで違うのでつまづきました。

まずriscv32-unknown-none.jsonを作成して以下の内容にします。

{
  "abi-blacklist": [
    "cdecl",
    "stdcall",
    "fastcall",
    "vectorcall",
    "thiscall",
    "aapcs",
    "win64",
    "sysv64",
    "ptx-kernel",
    "msp430-interrupt",
    "x86-interrupt",
    "amdgpu-kernel"
  ],
  "llvm-target": "riscv32-unknown-none",
  "data-layout": "e-m:e-p:32:32-i64:64-n32-S128",
  "linker-flavor": "gcc",
  "cpu": "generic-rv32",
  "target-endian": "little",
  "target-pointer-width": "32",
  "target-c-int-width": "32",
  "arch": "riscv32",
  "os": "none",
  "features": "+m,+a",
  "disable-redzone": true,
  "panic-strategy": "abort",
  "relocation-model": "static",
  "atomic-cas": true,
  "max-atomic-width": "32"
}

次にリンカスクリプトをconfig/riscv32/hifive.ldとして

MEMORY {
    rom : ORIGIN = 0x20010000, LENGTH = 0x6a120
    ram : ORIGIN = 0x80000000, LENGTH = 0x4000
}

ENTRY(_main)

SECTIONS {
    .boot_entry : {} > rom
    .text : {*(.text*)} > rom
    .rodata : {*(.rodata*)} > rom
    .bss : {*(.bss*)} > ram
} 

としてください。(サンプルなどを漁って適当に作ったので実用化のときはもっとちゃんとしてください…)

ツールチェーンはビルドしても良いですが、公式(https://www.sifive.com/boards)からPrebuilt RISC‑V GCC Toolchainを持ってきてください。(riscv64のバイナリだがriscv32も扱えるみたい)。またexportでもしてパスを通してください。

Makefileを以下のようにします。

#環境設定
##名前
NAME = ruscv

##ターゲット
TARGET_ARCH = $(2)
ifeq ($(strip $(TARGET_ARCH)),)
    TARGET_ARCH = riscv32
endif
RUST_TARGET = $(TARGET_ARCH)-unknown-none
#RUST_TARGET_FILE_FOLDER = target-json/ # https://github.com/japaric/xargo/issues/146

##ディレクトリ
SRC = src/
MAKE_BASEDIR ?= $(shell pwd)/
MAKE_BINDIR = $(MAKE_BASEDIR)bin/
MAKE_IMGDIR = $(MAKE_BINDIR)img/
MAKE_TMPDIR = $(MAKE_BASEDIR)tmp/
MAKE_OBJDIR = $(MAKE_TMPDIR)obj/
MAKE_CONGIGDIR =  $(MAKE_BASEDIR)config/$(TARGET_ARCH)/

##ソフトウェア
STRIP= riscv64-unknown-elf-strip
##↑変更
MKDIR = mkdir -p
CP = cp -r
RM = rm -rf
LD = riscv64-unknown-elf-ld -n --gc-sections -Map $(MAKE_TMPDIR)$(NAME).map -nostartfiles -nodefaultlibs -m elf32lriscv -nostdlib -T $(MAKE_CONGIGDIR)hifive1.ld
CARGO = cargo
QEMU = qemu-system-riscv32 --nographic -machine sifive_e

##ビルドファイル
KERNELFILES = kernel.elf
RUST_OBJ = target/$(RUST_TARGET)/release/lib$(NAME).a
BOOT_SYS_LIST = $(RUST_OBJ)

#初期設定
export TARGET_ARCH
export MAKE_BINDIR
export MAKE_TMPDIR
export MAKE_OBJDIR


#各コマンド
##デフォルト動作
default:
	$(MAKE) kernel
	-$(STRIP) $(MAKE_BINDIR)*.elf #できなくてもいい

##初期化動作
init:
	-$(MKDIR) $(MAKE_BINDIR)
	-$(MKDIR) $(MAKE_TMPDIR)
	-$(MKDIR) $(MAKE_OBJDIR)

clean:
	$(RM) $(MAKE_TMPDIR)
	$(CARGO) clean

kernel:
	$(MAKE) init
	$(MAKE) $(KERNELFILES)

#run:
#	$(MAKE) kernel
#	$(QEMU) -kernel bin/kernel.elf

# ファイル生成規則
kernel.elf : $(BOOT_SYS_LIST)
	$(LD) -o $(MAKE_BINDIR)kernel.elf $(BOOT_SYS_LIST)

$(RUST_OBJ) :  .FORCE
	$(CARGO) xbuild --release --target $(RUST_TARGET_FILE_FOLDER) $(RUST_TARGET)

.FORCE:

そんなわけでmakeする(make runは動きません)とkernel.elfができるので

riscv64-unknown-elf-objcopy  -O ihex kernel.elf kernel.hex
とするとhexファイルができるので、HiFive1をUSB接続してUSBメモリとして認識されたのちにkernel.hexを放り込むとフラッシュされて再起動します。
リセットと同時にcuコマンドなどでUSBシリアル通信をすると「Hello, RISC-V!」と表示されると思います。

もとのWelcome表示に戻すにはサンプルをビルドしないといけないのですが、ビルドチェーンは配布されてるバイナリを利用してnano.specsの記述を削除するなり、色々手間が必要だったので注意してください。せっかくなので、Welcomeサンプルの
HiFive1 RevB用のHexファイルを上げておきます。(Apache Licence 2.0)
https://repo.taprix.org/pg_mana/riscv/hifive1revb/

Elixirハンズオン

ドリコム社さんが開催してくださった【サーバーサイド講義&実技】Elixirハンズオンに参加してきました。そこでの感想やElixirの感想などを書こうと思います。

Elixirとは

Elixirは拡張性と保守性の高いアプリケーションを構築するためにデザインされた、動的で関数型のプログラミング言語です。

https://elixir-lang.jp/

ElixirはErlang VM上で動く言語で、フォールトトレランスやホットスワップが可能なErlangをRuby風の言語で利用しようと設計されたものらしいです。
サーバーサイド言語ではPHPしか扱ったことしかなかった私は、Elixirを使ってみたいなぁと思ってたわけですが、Ruby風の記述がどうも苦手で(つまり{}を使わない言語系)、手こずっている間に色々しないといけないことに追われて後回しになっていたのですが、幸いドリコム社さんのElixir ハンズオンに参加させてもらえることになり参加しました。

やったこと

Elixirはmixというパッケージ管理システムを使ってます。
アプリを新規作成するときは
$ mix new test_app
とやります。
こうすることで

test_app
├── README.md
├── config
│   └── config.exs
├── lib
│   └── test_app.ex
├── mix.exs
└── test
    ├── test_app_test.exs
    └── test_helper.exs

と言うような構成になります。
設定ファイルがmix.exs で実際にコードを書くのが lib/test_app.ex らしいです。
mix.exsには依存ライブラリなどの記述をします。

今回のハンズオンでは大量のJSONデータを処理するコードをやりました。
JSONの取扱はPoisonというライブラリを使うらしいのでmix.exsに

  defp deps do
    [
      {:poison, "~> 4.0"},
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end

と記述します。
依存関係をダウンロードするために
test_app $mix deps.get
としてlib/test_app.exのdefmodule test_appの中に

def main do
  json_text = File.stream!("d.json")
  json_data = Enum.map(data, fn d -> Poison.decode!(d) end)
  result = Enum.filter(json_data, fn d -> d["age"] <= 20 end)
  Enum.count(result)
end

と書きtest_app/d.jsonを

{"age":39,"name":"aaa"}
{"age":47,"name":"bbb"}
{"age":46,"name":"ccc"}
{"age":13,"name":"ddd"}
{"age":45,"name":"eee"}
{"age":18,"name":"fff"}
{"age":22,"name":"ggg"}
{"age":15,"name":"hhh"}
{"age":24,"name":"iii"}
...

と置きます。
その後、ターミナルにて
test_app $ iex -S mix
iex(1)>test_app.main
と打つと、20歳以下の人数が出てきます。

さて、Elixirにはパイプ演算子というのがあるらしく、前の関数の返数を第一引数として渡したい時に使えるらしいです。上のコードは以下のように書き直せます。

def main do
  "d.json"
  |> File.stream!
  |> Enum.map(fn d -> Poison.decode!(d) end)
  |> Enum.filter(fn d -> d["age"] <= 20 end)
  |> Enum.count
end

まあ、このように色々教えてもらってEnumじゃなくてStreamやFlow使うと良いよなど教えてもらいました。

感想

Elixir本を読んだときは、「他言語とは違うぞ〜」ということが非常に多く書かれてましたが、ドリコム社さんのおかげでスムーズに理解できました。もちろんElixirの一角だと思いますが、少しずつやっていこうと思います。
ただ、関数っぽい部分とそうでない部分とが妙に突っ掛かると言うか…まあ慣れかな…

あと今回の件で、map=>filterを行いましたが、filter一個でも行けるんじゃないかなと思って少し疑問…具体的には

  def is_adult (json_text) do
    data = Poison.decode!(json_text)
    data["age"] <= 20
  end

  def main do
    "data.json"
    |> File.stream!
    |> Enum.filter(fn d -> is_adult(d) end)
    |> Enum.count
  end

て書いても動くのでどうかな〜と、よく分かってない。
まあ、これからボチボチやっていきます。

OS自作のネタ集

この文章はセキュリティキャンプ2019 Y-I OS開発ゼミ用に書かれたものです。
セキュリティキャンプが終了次第公開する予定です。主にOS自作のネタを提供するのが目的な文章ですので、参加者の皆様が強い目標をお持ちなら、ぜひそれを実現させてください。(全員そうだったらこの文章は無駄になるわけですが…それはそれで)
そうでなくとも、セキュリティキャンプに応募する際に何らかの目標を持って応募はされているとは思いますが、+αという感じや、より目標が具体的になるように役立ててもらえると幸いです。

RustでOS自作

これは自分がセキュリティキャンプ2017に参加したときの目標です。

Rustは安全性、速度、並行性の3つのゴールにフォーカスしたシステムプログラミング言語です。 ガーベジコレクタなしにこれらのゴールを実現していて、他の言語への埋め込み、要求された空間や時間内での動作、 デバイスドライバやオペレーティングシステムのような低レベルなコードなど他の言語が苦手とする多数のユースケースを得意とします。

https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/

とあるように、Rustは低レイヤを得意とする言語で安全性に重きを置いています。おかげで最初は「エェ…そんくらい許してくれや…」というエラーがガツガツ出ます。しかしながら、これらを丁寧に潰していけばほぼ100%期待通りに動いてくれます。セキュリティキャンプ2017では割り込みのバグを潰すのに時間がかかったわけですが(参照:セキュリティキャンプ2017参加記)、Rustが原因であることは少なかったです。
RustでのOS自作で参考になりそうなサイトは以下の通りです。

NimでOS自作

Nim (旧称Nimrod) とは命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語であり、アンドレアス・ランプフにより設計・開発された。Nimは「効率的で表現豊かで優雅」であるように設計されている。

https://ja.wikipedia.org/wiki/Nim

NimはRustより少し早めに出てきた言語で、Python風に優美にコードがかける…らしいです。よく言語比較サイトでRustと喧嘩してます。
NimはCのコードを吐けるのでこれを利用してOSを自作することも可能のようです。ただRustに対してネットでの情報が少なく難航するかもしれません。でも折角のセキュリティキャンプなので挑戦してみるのも良いかと思います。(自分も気になります。)
NimでのOS自作で参考になりそうなサイトは以下の通りです。

ZigでOS自作

Zig is a general-purpose programming language designed for robustnessoptimality, and maintainability.

https://ziglang.org/

かなり新しい言語のようですが、低レイヤも扱えるようです。が、日本語の情報がほとんどありません。どうしたもんでしょう…Nim同様挑戦してみるのも良いかと思います。

はりぼてOSを64bit対応してセキュアにしてみる

言わずとしれた30日OS自作本のはりぼてOSですが、今や時代遅れのOSと言われるようになりました…悲しい。
昨今のOSは64bit対応でページングを採用していますので、32bitOSでセグメンテーションなはりぼてOSとは大違いです。
しかしながらはりぼてOSはGUIもしっかりしてますし初心者向けにわかりやすくできているので、これを参考にしてUEFIブートなどに対応するのも良いかなと思います。
また30日OS自作本では、LDTなどを使ってメモリ保護などを行っていますが、全然セキュアではないのです。例えば

void HariMain(void){
    api_boxfilwin(0, 8, 36, 141, 43, 3);
    api_putstrwin(10000, 28, 28, 0, 12, "hello, world");
    api_end();
}

というアプリでも作ろうもんならたちまちOSがぶっ壊れてしまいます。第一引数のwinをOS側で検証してませんから、適当な値を打ち込めばすぐやられます。これらを改善するにはどうしたらいいか考えるのもセキュリティらしいネタかもしれません。

別アーキテクチャでのOS自作

(もしx86環境という条件付きのキャンプでしたら以下のネタは利用できません)
世の中にはx86-64なCPUだけではなく、様々なISAがあります。
身近なものでは、スマートフォンでよく採用されているARMアーキテクチャや話題沸騰中のRISC-Vなど様々なものがあります。
QEMUでも実装されているCPUも多くありますので、実機では動かせなくともエミュレータで動くOSも作れます。
他のISAと比較することでx86-64がどのような性質を持って、セキュリティ的にどうかがわかるかもしれません。(自分はRISC-Vをいじって少しわかった…気がする…多分)
https://github.com/PG-MANA/RuscV RustでRISC-Vベアメタルをやったときのコードですが役に立つかもしれません。

終わりに

少ない量でしたが、何か役に立てたなら幸いです。これをみて全く別のことを思いついてもらっても構いません。
OS自作の分野は日本語の情報が(他に比べて)少ないですが、テーマは色々あると思うので、有意義なテーマを見つけて、頑張ってみてください。

受験勉強の進捗

この記事は テオクレ受験生のAdvent Calendar 9日目の記事です。

(実はこの記事は書きためていたものを、運良くカレンダー見つけて便乗して載せてますので、文章は最新のものではありません。)

WARNING: この文書は怪文書ではなく悔文書または壊文書です。またかなり真面目な内容を一部含みます。
なおこの記事を見て、「うっかり読んだせいで勉強する気になってしまった」「書いてあることを試してしまい、テオクレ受験生でなくなった」などについての責任は負いませんのでご注意ください。

届かないセンター8割。

何故かできない物理、何故かできる化学。
回答欄に当てはまらずに頭抱えてたらTHE ENDな数学。
解説読んでもわかんねぇ現代文。
文法ダメダメな英語。
周りがフィーリングで行けるというのに行けない地理。
現状7割が精一杯です。

進路希望調査では国公立大学落ちた場合の欄に「樹海へHAVE GONE旅行」と答えてしまった。なお教師からは「某国家での強制労働」を進められましたので現在検討中です。

というわけで現在は合格したら卒業旅行できるというご褒美を自分で立ててやる気を保っております。
嘆いても仕方ないというわけで今やっている対策を書いときます。

物理

わかんないところは徹底的に基礎から解く、幸い授業はおろそかにしてないので理解は早いが応用が効かないのでそこもやる。
公式が存在する問題が多く、公式を組み合わせて解く。

化学

センター過去問といてわからないところは周辺分野を確認、図表を見ると目に焼き付くので良い。

数学

ひたすら解いてる。練習あるのみ。抜けた公式は叩き直す。本来は公式の導出を頭で行うが間に合わないので解きまくって覚える。あとわからんやつは時間を区切って飛ばす度胸をつける。

現文

文法的にアプローチをする。特に接続詞に目をつける。「だが」「言うまでもなく」「つまり」のあとは筆者の主張が詰まってるのでそこを解析する。古典との時間の兼ね合い。
絞り込んで、2つの選択肢で悩んだときは、選択肢の傾向(?)を端的に読み取り(明るい感じとか暗い感じとか)、内容に即しているか考える。

古典

文法を覚える。傾向からして接続詞・敬語を覚えると選択肢がある程度絞れる。選択肢が読解のキーとなることもあるので選択肢を読む。

英語

アクセント、発音は解いて外したら繰り返し発音する。文法も解きながら間違えた文法と関連を覚える。長文は先に選択肢に目を通し、目星をつけて特定の文を読む。

地理

一問一答を利用しているが最近効果が見えてきた。グラフを見て頂点になっている理由や減少の理由を覚える。エネルギー利用などが多い。

知っておくと役に立つかもしれない知識(と自戒)

留年をすれば現役生のまま、センターまでの日付を365日伸ばせる。

これはクラスメイト発案ですが、私は成績悪くないので留年できません。
現在、問題となっている「浪人生フィルター」に対して有効な対策と思われる。
試したい方はどうぞ。

受験生全員で協力してセンター0点取れば二次試験一発勝負となる。

一人でも抜け駆けすると失敗します。あと東工大は対応できません。
受験は団体戦(exploit)。

ニトロセルロースはニトロ化合物でなく硝酸エステルである。

硝酸とアルコール(ヒドロキシ基)が縮合重合したら硝酸エステルである(と思う)。

地理の緊急輸入制限は「BLAME!」のセーフガードではない。

私はサナカン。セーフガードの代理構成体。我々セーフガードは、排除する。お前たち、受験勉強のやる気を持たないテオクレ受験生たちを。(映画良かった)

大学入試共通テストは暗記じゃうまく行かない

プレテストの傾向的には、なぜそうなるのか、公式の導出方法、証明方法、長文で誰がどんな発言をしたのか、をしっかり理解できようになっている必要があると思われる。

現代文は文法を駆使して読め

読んでもわかんないもんはわかんない。文法を利用して主張を取り出し、選択肢と比較する。

定期考査勉強はしろ

まずいまずい言いながら何故か一向にやる気が出ず、勉強しだしたかと思えば、センター試験の勉強するくらいやる気が出ない自分、3年間完全無欠(点)は守り抜けるのか…?
追記: 高校三年間、無欠点を貫きました。おまけに評定もAだった。

数学は詰まったら先行け

もう少し悩んだら取れそうな6点よりもその先の40点。(未だに時間を忘れてのめり込んで悲惨な目に合う)

駿台ベネッセ模試を校外(駿台)で受けると、もれなく偏差値50で学年一位になれる

眠いときは寝ろ、睡眠時間を削るな

寝ずにやってもただのお絵かき(字体崩壊)になるぞ…

最後に

ここまで、読んでくださった皆さんには大変申し訳無いが、この文章にはオチというものが存在しない。
みなさんが期待するような文章がかけるように大学で精進していきたいところである。
さてどうこうしているうちにセンター試験まで60日となりそうだ。(きっとこの文章を読んでいるときはもっと近づいているだろう)
文章を書くということはかなり頭に入ることであり、書いているうちにも勉強になった。

大学入学共通テストのプレテストを受けてきた

風邪が治らずグズグズ言い続けて1週間、入試のストレスがキツイなぁ…。

と言いながら数年後に始まる大学入学共通テストとかいうセンター試験の次世代版のプレテストを受けてきました。

受けた科目は英語と数学と理科(物理・化学)だけですが、ちょいと感想を書いておきます。

まず全体的な感想ですが、「思考力・応用力を問う」とだけあって、センター試験より頭を使う問題が非常に多かったです。
すべての教科において、ただ問題を出すのではなく実際の生活や身の回りのものに結びつけようとしてるのがわかりました。

そのため文章量が多く何を聞きたいかを理解するまでに少し時間がかかったこところもあり、よくできているなぁと思いながら解いてました。

英語は発音・アクセント・文法問題がなく、全て長文問題でした。
またセンター試験とは違って、正しい内容のうち、「fact(not a opinion)」や「opinion(not a fact)」と制限されていたことろもあり、ただ書いてあるからだけでなく英文の前後を見てそれが誰かの意見なのか、事実に基づく発言なのかを見極める必要があり、そのために問題文をじっくり読む必要もありました。また「全て選べ」は、すべての選択肢を検討しなければならず、解けたという安心が得られない、なかなか恐怖の問題でした。

リスニングも資格試験に近いような聞き方で、イラストが多く利用されていた印象を受けました。

数学に関しては、ただ与えられた数式を解くのではなく、実生活での問題(今回は階段の規格についてがありました)や公式の証明などが出題され、苦戦しました。(もともとセンター試験でも計算ミスで足を引っ張っている数学…)

物理化学に関しても聞いている内容は現在とほぼ変わらないが、身の回りのものに結びつけたり(物理では電磁誘導でエレキギターが出た)、普段聞かれない聞き方をされたり、現行のものとはかなり違う印象を受けました。

まだ自己採点をしてませんが(感触としては数学を除いて8割程度は行ったかな…?)、格段に難しいというわけでなく、解いてて若干楽しいというような感じでした。
センター試験よりも柔軟でフレンドリーな問題というのがふさわしいと思います。
これから調整されてもう少し軟化すると思いますが、このような特徴が残ってくれると嬉しいです。

…こんなこと書いてますが、自分が受けるのはセンター試験なので、単語帳や過去問を必死に説かなければ…

それではまた。

追記:
自己採点しましたが、得点率はセンターと大体同じでした。(英語とリスニングと化学は8割以上、それ以外は…ウン…精神がすり減る…)

Pydio Cellsのインストール

暑い

というわけでPydio Cellsを入れます。
Nextcloudの使い勝手にどうもなれず、Pydio使いたいなぁって思ってたんですがPHP版のPydioのエラーがわけがわからないし、他に良いサービスないかなぁと思ってたところでした。
Pydio CellsはGolangで書かれてる今時のイケイケサービスらしいのですが、PHP-FPMみたいにポンとおいて動いてくれないのでちょいと面倒です。
サーバを汚すのも嫌なのでDocker上で立てました。

しかぁし…ドキュメントが貧弱なので適当にちょいちょいといじったら動かないしエラーは不親切だし、わけわかめと言いながら一週間立てるのに苦労しました。

ということでまとめておきます。

追記: PHPが要らなくなったので対応

前提条件

Docker 17.09+
Docker Compose 1.17.0+
Nginx 1.14.0+

Docker

まずdocker-compose.yml書きます。


version:            '3.5'

networks:
  external_network:
  internal_network:
    internal:       true

services:
  db:
    image:          mariadb:latest
    restart:        always
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=cells
      - MYSQL_USER=pydio
      - MYSQL_PASSWORD=${PYDIO_PASSWORD}
    command:        [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci]
    expose:
      - "3306"
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - internal_network

  cells:
    image:          pydio/cells:latest
    restart:        always
    ports:
      - "1334:8080"
    environment:
      - CELLS_BIND=${HOST_NAME}:8080
      - CELLS_EXTERNAL=${HOST_NAME}
    volumes:
      - ./static:/root/.config/pydio/cells/static/pydio #staticはマウントしなくてもいいかも
      - ./data:/root/.config/pydio/cells/data
    networks:
      - external_network
      - internal_network
    depends_on:
      - db

volumesの設定い加減ですが、いい感じに書き直してください。
ミソとなるのはCELLS_BINDのホストとCELLS_EXTERNALのホストが同じ、ポートは別ということです。

次に.envを


DB_ROOT_PASSWORD=hogehogepasswd
PYDIO_PASSWORD=foobarpasswd
HOST_NAME=example.com

なんて感じで書いときます。まあ直接docker-compose.ymlに書いてもいいですが、git管理のしやすいから、こうするらしいです。

あとサブフォルダ形式(example.com/cloud/)は今の所できないみたいです。cloud.example.comみたいにサブドメインにしましょう。あとTLSも必須のような気がします。

これでdocker-compose upすれば、Port 1334をリッスンしてくれます。(なんでや!阪神関係ないやろ!)

Nginx

次にnginxの設定です。


server {
#...
#(listenやserver_name、sslの設定を書く)
#...
        location / {
                proxy_pass https://127.0.0.1:1334;
                proxy_set_header Host $host;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
        client_max_body_size    4G;#お好みで
}

ここでキモなのは、
proxy_passにおいて、docker-compose.ymlのportsに指定したIP(または127.0.0.1)を書くことです。
localhostなどと書いてるとIPv6でアクセスしてしまい、インストールは成功するのですが、その後Bad Gatewayで死にます。
あとWebscocket用に


proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

を忘れないことです。

これでnginxを再起動すると、インストール画面が出ます。
データベースの設定ではlocalhostをdbに書き換え、パスワードなどを入力します。

うまく行けばインストール終了後ログイン画面が出るはずです。

あとWebdavにはhttps://example.com/dav/でアクセスできるはずなのですが、できなかったり、同じフォルダが数個表示されたり不安定です。
あとでコミュニティで聞いてみます。

ではでは。