Upload
vodang
View
231
Download
1
Embed Size (px)
Citation preview
各種商標と著作権の取り扱いに関する注意
UNIXは The Open Groupの OS名です。Solarisは Sun Microsystems, Inc.の OS名です。Linuxは Linus Torvalds氏の手による OSです。BSD UNIXとはカリフォルニア大学バークレイ校 (UCB)で開発された Berkley Software Distribution版に端を発するOS群を指す表現です。Apple, Macintosh, MacOSは米国 Apple Inc.の登録商標です。MS-DOS, Windows95, Windows98, WindowsNT, WindowsMe, Windows2000, WindowsXP, Windows Vista,MASM (Microsoft Macro Assembler), MS-VB (Microsoft Visual Basic),MS-C/C++ (Microsoft C/C++), MS-VC/C++/C# (Microsoft Visual C/C++/C#)はMicrosoftの、CodeGear C++, Turbo C/C++, TASM (Turbo Assembler),Turbo Pascal, Delphi, Kylixは CodeGearの、N88-BASIC(86)は NECの、Z80はザイログの、8086, i386, i486, Pentium, Pentium Pro, Pentium II, Pentium III, Pentium 4, Pentium M, Celeron, Core Duo, Core 2 Duo,Core 2 Quadは Intelの、PowerPCは IBMの、それぞれ商標となっております。その他、プログラム名、プロセッサを始めとする各種の製品名は一般に各メーカーの登録商標です。本文中では “TM”、並びに “®”マークは明記しておりませんがその旨ご了承下さい。
本誌に掲載される各記事の著作権は、それぞれの記事の作者が保有します。各種プログラムのソースコードの著作
権はプログラムの作者が保有します。「PDS」または「パブリックドメイン」と明記されていないものについては、個
人で使用する目的以外のための無断複製は著作権法により禁止されています。
i
▷もくじ ◁
1 Mastodon 東大インスタンス "UTodon"
に botを作った話 — uc 1
1. はじめに . . . . . . . . . . . . . . . . . . . . 1
2. UTodonに botを作る . . . . . . . . . . . . 2
3. おわりに . . . . . . . . . . . . . . . . . . . . 5
2 MastodonデプロイWriteup — gott 6
1. はじめに . . . . . . . . . . . . . . . . . . . . 6
2. デプロイ . . . . . . . . . . . . . . . . . . . . 6
3. 参考 URL . . . . . . . . . . . . . . . . . . . . 9
3 ローグダンジョンマップの自動生成基礎
論 — tiace. 10
1. これぞ人生 . . . . . . . . . . . . . . . . . . . 10
2. 話題 . . . . . . . . . . . . . . . . . . . . . . . 10
3. 部屋と通路のマップ . . . . . . . . . . . . . 10
4. 細い道のみからなるマップ . . . . . . . . . 11
5. おわりに . . . . . . . . . . . . . . . . . . . . 16
4 テスラコイル製作記(未完) — proton 17
1. はじめに . . . . . . . . . . . . . . . . . . . . 17
2. テスラコイルについて . . . . . . . . . . . 17
3. 自分が SSTC 製作に挑戦したときの記
録のようなもの . . . . . . . . . . . . . . . . 19
4. あとがき . . . . . . . . . . . . . . . . . . . . 21
ii
1
1 Mastodon東大インスタンス"UTodon"に botを作った話
uc (@anntena-three)
1. はじめにこの記事は,Pythonを使って簡単なWebスクレイピングとMastodonインスタンスへの自動トゥートを
行った顛末をまとめたものです.
1.1 Mastodon
以下に続くのはMastodonについての基礎知識です。ご存知の方は読み飛ばしてください。
Twitterのパクr…もとい,影響を大きく受けた SNSです.Twitterと基本的な見た目は似ていますが,
誰もが自由にサーバを立ち上げて運営できる点で,サーバがひとつの会社によって独占されている Twitter
と大きく異なっています.それぞれのサーバはインスタンスと呼ばれ,ユーザはいずれかのインスタンス
に所属します.ユーザは Twitterのように他のユーザをフォローしてつながることができます.他のイン
スタンスのユーザをフォローすることも可能です.ユーザの発言 (toot)が流れるタイムラインは 3種類あ
ります.
ホーム 自分がフォローしているすべてのユーザの tootが流れるタイムライン
ローカル 自分と同じインスタンスのすべてのユーザの tootが流れるタイムライン
連合 自分と同じインスタンスのすべてのユーザのホームをまとめたタイムライン
インスタンスにはそれぞれ特色があります.2017年 5月 17日現在,アカウント数 5桁以上のインスタ
ンスの世界ランキングは以下のとおりです.
1 pawoo.net pixivが立ち上げたインスタンス.R18絵で溢れかえっているため,多くの海外
インスタンスから BANされている.アカウント数が世界最大.
2 mstdn.jp 大学生の nullkal氏が自宅サーバで立ち上げたインスタンス.Mastodonがバズ
り一時日本最大のインスタンスに.不安定になり,さくらのクラウドに移転.
3 mastodon.social Mastodonを開発しているドイツ人の Eugen Rochko氏が立ち上げたインスタン
ス.最新版の機能が使える.新規登録停止中.
4 friends.nico ニコニコ動画運営のドワンゴが立ち上げたインスタンス.独自のカスタマイズ
がなされている.
5 mastodon.cloud フランス語/英語インスタンスだったが,不安定化した mstdn.jp 難民が押し寄
せ,日本鯖と化した.
2 UTMC Press 2017-5
1.2 UTodon
2017年 4月 27日,Mastodonに新たなインスタンスが加わりました.gott君が立ち上げた東大インスタ
ンス,"UTodon.jp"*1 です.アカウント認証に u-tokyo.ac.jpドメインのメールアドレスを使うので,正真正
銘東大関係者しか参加できません.また,WebクライアントにMathJaxが導入されているため,.まあ詳
しい内容や技術的な内容は gott君が書いてくれるでしょうから,ここでは軽い紹介に留めておきます.
2. UTodonに botを作る2.1 ことの始まり
Twitterには ashiato45さんが作った UTask-Web巡回 bot*2があり,ashiato45さん曰くあまりメンテナン
スはしていないようですが 1000人以上のフォロワーに活用されていました.
そんな中,UTodonを立ち上げて間もない gott君が「utask-web巡回 botがこっちにもあるといいですよ
ね (願望」*3と言っていたのを見て,私はWeb関連のプログラミングなど微塵もやったことがないにもかか
わらず,「よし,いっちょやったるか」とWebの海へ突撃していったのです.
2.2 Rubyから Pythonへ
さて,何はともあれ検索窓に "mastodon bot"と打ち込むと,トップに出てきたのは「Rubyで完全自動
Mastodon botを作成する」*4でした.「RubyはWeb向けって言うしMastodonは Ruby on Railsで書かれて
るし,これは Rubyで決まりだ!」とそのままの勢いでWebスクレイピングを Rubyで実装しました.
が,HTTPがエラーを吐いて,シングルバイト文字はトゥートできるもののマルチバイト文字がトゥー
トできない症状に見舞われ,手も足も出なくなって Rubyごと投げ出しました.この記事に書くためにい
じってたら何故か全角文字もトゥートできるようになってたので供養しておきます.
ソースコード 1.1 UTaskWeb巡回 botの Rubyソース
1 # coding: utf -8
2
3 require ’open -uri’
4 require ’nokogiri ’
5 require ’csv’
6
7 #前期教養のお知らせのページを n o k o g i r iに処理させる8 url = ’http :// www.c.u-tokyo.ac.jp/zenki/news/index.html’
9
10 charset = nil
11 html = open(url) do |f|
12 charset = f.charset
13 f.read
14 end
15
16 doc = Nokogiri ::HTML(html , nil , charset)
17
18 #トゥート済のお知らせのリストを読み込む19 data_path = File.expand_path(’../ zenki_news.csv’, __FILE__)
20
21 old_data = CSV.read(data_path , encoding:’utf -8’)
22 new_data = CSV.open(data_path , ’a’)
23
*1 https://utodon.jp/*2 https://twitter.com/utask_bot*3 https://utodon.jp/web/statuses/3307*4 http://qiita.com/fjustin/items/afe21c00dc50c23cd109
Mastodon東大インスタンス "UTodon"に botを作った話 — uc 3
24 #お知らせのページをさらって未トゥートのお知らせをリストに追加しトゥートする25 newslist2 = doc.xpath(’//div[@id=" newslist2 "]’)
26 newslist2.xpath(’//dd’). reverse_each do |node|
27 news = [node.text , node.css(’a’). attribute(’href’).value]
28 if news [1][0] == "/" then
29 news [1] = "http :// www.c.u-tokyo.ac.jp" + news [1]
30 end
31 exist = false
32 old_data.each do |value|
33 if value == news then
34 exist = true
35 end
36 end
37 if exist == false then
38 new_data.puts news
39 system(’ruby mastodon -cli -sample.rb "’ + news [0] + ’ ’ + news [1] + ’"’)
40 end
41 end
42
43 new_data.close
mastodon-cli-sampleは「Mastodon API gemを使って投稿する」 *5 から丸パクリしてきました.
2.3 Pythonとの出会い
Rubyがすっかり嫌になったので,Mastodonのライブラリがあるもう一つの言語である Pythonに移行
しました.Pythonを触るのはこれが初めてでしたが.
ソースコード 1.2 UTaskWeb巡回 botの Pythonソース
1 import urllib.request
2 from bs4 import BeautifulSoup
3 import csv
4 from mastodon import Mastodon
5
6 #前期教養のお知らせのページを B e a u t i f u l S o u pに処理させる7 url = "http :// www.c.u-tokyo.ac.jp/zenki/news/index.html"
8
9 html = urllib.request.urlopen(url)
10 soup = BeautifulSoup(html , "html.parser")
11
12 dds = soup.find_all("dd")
13
14 #トゥート済のお知らせのリストを読み込む15 with open("zenki_news.csv", mode="r", encoding="utf -8") as f:
16 reader = csv.reader(f)
17 csv_data = []
18 for row in reader:
19 csv_data.append(row)
20
21 #お知らせのページをさらって未トゥートのお知らせを n e w s l i s tに入れる22 news_list = []
23
24 for dd in reversed(dds):
25 html_data = [dd.a.string , dd.a.get("href")]
26 if html_data [1][0] == "/":
27 html_data [1] = "http :// www.c.u-tokyo.ac.jp" + html_data [1]
28 for row in csv_data:
29 if row == html_data:
30 break
31 else:
32 news_list.append(html_data)
33
34 # n e w s l i s tをトゥート済のリストに追加する35 with open("zenki_news.csv", mode="a", encoding="utf -8") as f:
36 writer = csv.writer(f, lineterminator="\n")
37 writer.writerows(newslist)
38
39 # @ u t a s k _ b o tで n e w s l i s tの内容をトゥートする40 mastodon = Mastodon(
41 client_id = "cred.txt",
42 access_token = "auth.txt",
43 api_base_url = "https :// utodon.jp")
*5 http://qiita.com/takahashim/items/a8c0eb3a75d366cfe87b
4 UTMC Press 2017-5
44
45 for news in news_list:
46 mastodon.toot(news [0] + ’\n’ + news [1])
2回目なので多少変数名の付け方とかが丁寧になっています.それにしても,Pythonってきれいに書け
ますねえ.1つだけはまったのが,csv.readerの仕様でした.
ソースコード 1.3 CSVを読み出す部分と,HTML中の ddタグの中身と CSVを照合してトゥート済か調べる部分
1 with open("zenki_news.csv", mode="r", encoding="utf -8") as f:
2 csvdata = csv.reader(f)
3
4 news_list = []
5
6 for dd in reversed(dds):
7 (中 略)
8 for row in csv_data:
9 if row == html_data:
10 break
11 else:
12 news_list.append(html_data)
csv.reader の返り値は reader オブジェクトとかいうやつなんですが,これがリストと同じように
for で回せると聞いて,最初このように書いていました.ところが,どうやら 8 行目の for row in
csv_data:のループが,1 回目しか実行されていないようなのです.これに気づかず 1 時間ほど無駄に
したのですが,reader オブジェクトを for で読み出せるのは 1 回きりのようです.なぜこんなことに
なっているのか勝手に推察しますと,readerオブジェクトからデータを読み出すには forを使う以外に
csv_data.next()というメソッドを使う方法がありまして,どうやら forは next()メソッドを重ねる
ことによって実装しているようなのです.なので,1回目の forでデータの末尾まで next()を繰り返し
てしまった後は forが使えなくなるようです.なので,今回は readerオブジェクトに読み込んだデータ
をリストに読み込み直して使っています*6.
2.4 UTodonで複垢を作る
UTodon は前述の通り u-tokyo.ac.jp ドメインのメールアドレスを登録に使います.なので,一見複垢
を持つことは不可能に見えますが,東京大学のメールシステムは G Suite なので,Gmail と同じように
ローカルパートに "+(文字列)" を付け加えるだけでエイリアスが作れます.例えば,メールアドレスが
[email protected]*7なら,[email protected]とか.便利!
2.5 VPSで botを動かす
Web関連に手を出したのはこれが初めてだったので当然サーバを持ってもいないし契約もしていなかっ
たので,はじめは自宅のデスクトップ PCで botを動かしていました.そのうちサーバ契約しようかなー
と思いつつも何もわからない状態だったのですが,生産会で gott君が助けてくれたのでその場でさくら
の VPSの最小プランを契約してそちらに移行しました.初期費用 1080円,月額費用 685円と実にお手
軽で,最小プランながら石狩データセンターの SSDサーバなので結構さくさく動きます.デフォルトの
Pythonが 2系だったため使えなかったので,Pythonの実行環境には pyenvを,定期実行には cronを使っ
ています.
*6 きれいに書けるとは何だったのか*7 当記事はドモホルンリンクルとはなんの関係もありません
Mastodon東大インスタンス "UTodon"に botを作った話 — uc 5
3. おわりにWebも Pythonも Linuxも初めてという,初めてしかない挑戦にもかかわらずなんだかんだ実装できた
あたり,やればできるものだなあと思っております.VPSの契約や初期設定を手伝ってくれた gott君に謝
意を表します{締め切り落としてごめんなさい.UTodonの発展を願いつつ*8この記事を終えたいと思いま
す.UTask-Web巡回 bot*9 (https://utodon.jp/web/accounts/553)を今後ともよろしくお願いいたします.
*8 能力的にプルリクエスト送れるかは不明*9 6月に UTask-Webが終了して新サービス UTASに切り替わる予定なので早々に名前が変わることになるかもしれない
6
2 MastodonデプロイWriteupDocker on AWS
gott (@gott)
1. はじめに1.1 UTodonについて
ユーザー登録時に u-tokyo.ac.jpのドメイン制限をかけたMastodonインスタンスです。5/17現在 229人
のユーザーがおり,52のインスタンスと接続中です。pawooがダントツでトップの接続数です。
utodon.jpで動いています。
1.2 構成
1.3 インスタンスタイプについて
はじめは t2.medium でやっていましたが,この規模なら small でも動くみたいなので縮小しました。
microだとビルドが通らなかったり接続が不安定になったりします (一度インスタンス自体が落ちました)
2. デプロイ2.1 やったこと
2.1.1 AWSの準備
• Ubuntuでインスタンス作成
• # apt-get update && apt-get upgrade
• # apt-get install python3-pip docker.io
• # pip3 install docker-compose
2.1.2 gitの準備
• GitHubでフォークします (https://github.com/g0tt/mastodon.git)
• $ cd && git clone https://github.com/g0tt/mastodon.git
2.1.3 .env.productionの編集
• $ cp .env.production.sample .env.production
とりあえず
• LOCAL_DOMAIN=example.com
MastodonデプロイWriteup — gott 7
• LOCAL_HTTPS=false
だけ設定して,
• # docker-compose build
でビルド。
• # docker-compose run –rm web rake secret
を三回やって,出てきた 3つの鍵を.env.productionの
• PAPERCLIP_SECRET=
• SECRET_KEY_BASE=
• OTP_SECRET=
に書く。
2.1.4 DBと REDISの永続化
docker-compose.ymlの指定箇所のコメントアウトを外しました。
2.1.5 DBの初期化とアセットのプリコンパイルをして Docker起動
• # docker-compose run –rm web rails db:migrate
• # docker-compose run –rm web rails assets:precompile
• # docker-compose up -d
localhost:3000で動きました。
2.1.6 nginxの準備
webは 3000番,ストリーミングは 4000番で動いてたりするので,そのへんの振り分けのために nginx
を使います。
• # apt-get install nginx
• # vim /etc/nginx/conf.d/mstdn.conf
https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.mdを参考に
ソースコード 2.1 mstdn.conf
1 map $http_upgrade $connection_upgrade {
2 default upgrade;
3 ’’ close;
4 }
5
6 server {
7 listen 80;
8 listen [::]:80;
9 server_name utodon.jp;
10
11 keepalive_timeout 70;
12 sendfile on;
13 client_max_body_size 0;
14
15 root /home/ubuntu/mastodon/public;
16
17 gzip on;
18 gzip_disable "msie6";
8 UTMC Press 2017-5
19 gzip_vary on;
20 gzip_proxied any;
21 gzip_comp_level 6;
22 gzip_buffers 16 8k;
23 gzip_http_version 1.1;
24 gzip_types text/plain text/css application/json application/javascript text/xml ...
25
26 add_header Strict -Transport -Security "max -age =31536000";
27
28 location / {
29 try_files $uri @proxy;
30 }
31
32 location /assets {
33 add_header Cache -Control "public , max -age =31536000 , immutable ";
34 }
35
36 location @proxy {
37 proxy_set_header Host $host;
38 proxy_set_header X-Real -IP $remote_addr;
39 proxy_set_header X-Forwarded -For $proxy_add_x_forwarded_for;
40 proxy_set_header X-Forwarded -Proto https;
41 proxy_set_header Proxy "";
42 proxy_pass_header Server;
43
44 proxy_pass http ://127.0.0.1:3000;
45 proxy_buffering off;
46 proxy_redirect off;
47 proxy_http_version 1.1;
48 proxy_set_header Upgrade $http_upgrade;
49 proxy_set_header Connection $connection_upgrade;
50
51 tcp_nodelay on;
52 }
53
54 location /api/v1/streaming {
55 proxy_set_header Host $host;
56 proxy_set_header X-Real -IP $remote_addr;
57 proxy_set_header X-Forwarded -For $proxy_add_x_forwarded_for;
58 proxy_set_header X-Forwarded -Proto https;
59 proxy_set_header Proxy "";
60
61 proxy_pass http :// localhost :4000;
62 proxy_buffering off;
63 proxy_redirect off;
64 proxy_http_version 1.1;
65 proxy_set_header Upgrade $http_upgrade;
66 proxy_set_header Connection $connection_upgrade;
67
68 tcp_nodelay on;
69 }
70
71 error_page 500 501 502 503 504 /500. html;
72 }
こんなふうにしました。(SSL関係は AWSのロードバランサで処理します)
横着して iptablesで 3000番に飛ばそうとしたら streamingが動かず,ドキュメントを見てみたら設定例が
書いてありました。
• service nginx restart
2.1.7 ロードバランサの準備
適当に elbつくって証明書つくって 80と 443を ec2の 80に飛ばします。
2.1.8 メディア用ストレージの設定
http://fnya.cocolog-nifty.com/blog/2017/04/mastodonvps-da0.html
を参考に設定しました。
MastodonデプロイWriteup — gott 9
2.1.9 SMTPサーバーの準備
.env.production.sampleを読むと SparkPostが推奨されていますが,メールの不着があるようなので AWS
の SESを準備。sandboxも解除しておきます。
2.1.10 .env.productionの追加設定
EMAIL_DOMAIN_WHITELIST=のコメントアウトを外し,
EMAIL_DOMAIN_WHITELIST=u-tokyo.ac.jp
と設定。これでアカウント登録時に*.u-tokyo.ac.jpのみ許可されるようです。
また,SESの SMTPサーバー設定も行いました。
2.1.11 アカウント作成
utodon.jpからアカウントを作成していろいろテストしました。
$ docker-compose run –rm web rails mastodon:make_admin USERNAME=<ユーザー名>
で管理画面にアクセスできるようになります。
2.1.12 機能追加
とりあえず TEXが書けます。MathJaxが動いています。
https://github.com/g0tt/mastodon/issues
だいたいここに書いてあります。
3. 参考 URL• http://qiita.com/tsuitta_dayo/items/dfd659ec68435653d16a
• http://fnya.cocolog-nifty.com/blog/2017/04/mastodonvps-da0.html
10
3 ローグダンジョンマップの自動生成基礎論開講区分:Zセメスター 単位数:0
tiace. (ティアス)
1. これぞ人生衝撃の事実。
_人人人人人人人人人人人_
> 入部翌々日締め切り <
‾ YYYYYYYYYYYYYYY‾
入部のタイミングがタイミングなんだよなあ。というわけでレポートを翌日に控えた学生のごとく過集
中を上手に利用して書いていきましょう。
2. 話題ローグ形式の RPGなんてやったことありますか? メジャーなもので行くとポケ●ン●思議のダ●ジョ
ンなんかがそうですが、操作が非常に単純な点スマホと相性がよく、個人制作のスマホゲーでもたくさん
の作品が出ていますよね。そんなローグ RPGを作ろうとした際に、このジャンルのキモであるダンジョ
ンマップの自動生成っていったいどうやってるんだという超初歩的な壁にブチ当たってしまいいろいろ調
べたので、ここはひとつ記事にまとめてみたいと思います。尚、簡単のためコードは C#のコンソールア
プリとして書いていきます。
3. 部屋と通路のマップ3.1 概要
簡単めに描くと下図のようなマップを生成することを目標とします。
ローグダンジョンマップの自動生成基礎論 — tiace. 11
この形状のマップについては unityのスクリプトなどコピペ欲をそそるコードがネットに溢れているのと、
ここで解説するとながーくなってしまうのでアルゴリズムのほんの概略のみに致します。ここで、やらな
ければならないこととしては
• 長方形の部屋を重ならないように配置
• すべての部屋が探索可能となるように通路で繋ぐ
の 2つがあります。
3.2 部屋の配置
マップに長方形の部屋を重なりなく配置する方法としては、マップ全体を直線で区切っていき、できた
区画一つに対して一つずつ部屋を配置するというものが一般的なようです。
大部屋が不要な場合は予め格子状に区切ったマップを使い、一つの区画に 0または 1つの部屋を配置する
という手法もあります。
3.3 部屋の接続
次に部屋の接続ですが、ひいた境界線に向かって各部屋から直線を引き、境界線を通路とすれば必
ず全ての部屋が探索可能になりますね。あとは外枠の線と、外枠に直接つながっている境界線の、枝
分かれになる部分までを削除して完成です。調べた限りでは下の URL の記事がお役に立ちそうです。
https://mynavi-agent.jp/it/geekroid/2017/02/unity52d.html
4. 細い道のみからなるマップ例としては Kan Kikuchi氏の 1-Bit Rogueみたいなものを想定しています。ボンバーマンとかもローグ
ではないけどマップの形は近いかなあ。これに関しては調べてもなかなか出てこなかったので、自前で
コーディングしてみました。壁も道も細い状態、つまり 2× 2以上の床や壁の塊ができないようにすると
いう制約をかけます。この場合はまず外枠の大きさが奇数×奇数マスである必要があります。また、左上
の壁マスを (0,0)マスとする座標をとるとき、外枠を除く (奇数,奇数)マスは床、(偶数,偶数)マスは壁と
なります。残る (奇数,偶数)マスと (偶数,奇数)マスを、全ての床が探索可能となるよう乱数で埋めてい
きます。
12 UTMC Press 2017-5
4.1 ベースとなるマップの出力
それではまず縁と (奇数,奇数)マスを壁としたベースマップの出力を行いましょう。
ソースコード 3.1 ベースマップの出力
1 using System;
2
3 namespace DungeonMap
4 {
5 class Program
6 {
7 static void Main(string [] args)
8 {
9 int mapSizeX = 13;
10 int mapSizeY = 13;
11 Map stage1 = new Map(mapSizeX , mapSizeY );
12 for(int i = 0;i < mapSizeY; i++)
13 {
14 for(int j = 0;j < mapSizeX; j++)
15 {
16 Console.Write(stage1[j,i] ? "■" : "・");
17 }
18 Console.Write("\n");
19 }
20 }
21 }
22
23 class Map
24 {
25 bool[,] map;
26 public Map(int mapSizeX ,int mapSizeY)
27 {
28 map = new bool[_mapSizeX , _mapSizeY ];
29 //▲30 while (true){ //あとでループの末尾に b r e a k条件を追加します31 //愚直に初期化&(偶数 ,偶 数) マ ス を 壁 に32 for (int i = 0;i < _mapSizeX; i++)
33 {
34 for(int j = 0;j < _mapSizeY; j++)
35 {
36 if (i % 2 == 0 && j % 2 == 0) map[i, j] = true;
37 else map[i, j] = false;
38 }
39 }
40 //まずは壁でふちどり41 for (int i = 0;i < _mapSizeX; i++)
42 {
43 map[i, 0] = true;
44 map[i, _mapSizeY - 1] = true;
45 }
46 for(int i = 0;i < _mapSizeY; i++)
47 {
48 map[0, i] = true;
49 map[_mapSizeX - 1, i] = true;
50 }
51 //★52 break; //◆53 }
54 }
55 //マップは読み取り専用にします56 public bool this[int X,int Y]
57 {
58 get
59 {
60 return map[X, Y];
61 }
62 }
63 }
64 }
コンソールの出力は以下のようになります
ローグダンジョンマップの自動生成基礎論 — tiace. 13
■■■■■■■■■■■■■
■・・・・・・・・・・・■
■・■・■・■・■・■・■
■・・・・・・・・・・・■
■・■・■・■・■・■・■
■・・・・・・・・・・・■
■・■・■・■・■・■・■
■・・・・・・・・・・・■
■・■・■・■・■・■・■
■・・・・・・・・・・・■
■・■・■・■・■・■・■
■・・・・・・・・・・・■
■■■■■■■■■■■■■
おそらくコンソール上では行間が狭くきれいなフィールドとして見えると思います。ここからさらに壁
を増やしていく形になります。
4.2 乱数で壁を埋める
ここでは、1-Bit Rogueをプレイしていて、もしかしたらこうかな、と思った手法を紹介します。上の出
力で孤立している縁以外の (偶数,偶数)マスそれぞれに対し、そのマスの上下左右のうち壁となっていな
いマスから 1マスだけ選び、壁にする、というものです。
上記のソースコードで//★のコメントをした位置に以下のコードを追加します。
ソースコード 3.2 乱数で壁を埋める
1 {
2 Random rand = new Random ();
3 int i = 2, j = 2;
4 while (i < mapSizeX - 2 && j < mapSizeY - 2)
5 {
6 //乱数で上下左右のうちいずれかを壁で埋める7 switch (rand.Next (4))
8 {
9 case 0://上10 if (map[i - 1, j] == false) map[i - 1, j] = true;
11 else continue;
12 break;
13 case 1://下14 if (map[i + 1, j] == false) map[i + 1, j] = true;
15 else continue;
16 break;
17 case 2://左18 if (map[i, j - 1] == false) map[i, j - 1] = true;
19 else continue;
20 break;
21 case 3://右22 if (map[i, j + 1] == false) map[i, j + 1] = true;
23 else continue;
24 break;
25 }
26 j += 2;
27 if (j >= mapSizeY - 2)
28 {
29 i += 2;
30 j = 2;
31 }
32
33 }
34 }
14 UTMC Press 2017-5
たとえばこんなものが出力されます。いい感じの迷路になりましたね。
■■■■■■■■■■■■■
■・・・■・■・■・・・■
■・■■■・■・■・■・■
■・・・・・・・・・■・■
■・■・■■■■■■■■■
■・■・・・・・・・・・■
■■■■■・■・■■■・■
■・・・■・■・・・■・■
■・■■■■■■■・■■■
■・■・■・■・・・・・■
■・■・■・■・■■■・■
■・・・・・・・・・■・■
■■■■■■■■■■■■■
ただしストレートにこの手法を実装すると当然以下のようなマップが現れる可能性がありますね。
■■■■■■■■■■■■■
■・・・・・■・・・・・■
■・■■■・■・■■■■■
■・・・■・・・・・・・■
■・■・■■■■■■■・■
■・■・■・・・・・■・■
■■■・■・■■■・■・■
■・・・■・・・・・■・■
■■■・■■■■■■■・■
■・・・■・・・・・・・■
■・■■■・■■■・■■■
■・・・・・・・■・・・■
■■■■■■■■■■■■■
マップ内に環状の壁が現れ、すべての床マスが探索可能となりません。ただしこれは上記のコードを何
度も実行していただければわかりますが確率的にはあまり高くない (マップが大きいと確率が上がります
が)ので、マップを生成したあとですべてのマスが探索可能であるか確認し、探索可能でないマスが存在
する場合は一からやり直すという方法で足りそうです。
4.3 全床マスが探索可能かを確認する
再帰関数を新しく作るので、必要な情報をクラス変数を作って参照できるようにしましょう。以下のク
ラス変数を追加します。
bool[,] isExplored;
int _mapSizeX;
int _mapSizeY;
コメント//▲の位置に以下を追加します。
_mapSizeX = mapSizeX;//他の関数からもマップサイズが参照できるよう
ローグダンジョンマップの自動生成基礎論 — tiace. 15
_mapSizeY = mapSizeY;//クラス変数に引数をコピーします
isExplored = new bool[mapSizeX, mapSizeY];
準備ができたので探索の再帰関数を導入しましょう。
ソースコード 3.3 床を探索する再帰関数
1 //再起によって左上の角から探索可能な(奇数 ,奇 数) マ ス の 数 を 数 え あ げ る2 private bool ExploreCheck ()
3 {
4 //探索に使用する配列を初期化5 for(int i = 0;i < _mapSizeX; i++)
6 {
7 for(int j = 0;j < _mapSizeY; j++)
8 {
9 isExplored[i, j] = false;
10 }
11 }
12 return (Explore(1, 1) == (_mapSizeX - 1) * (_mapSizeY - 1) / 4);
13 }
14 private int Explore(int x,int y)
15 {
16 int count = 1;
17 isExplored[x, y] = true;
18 if (x >= 3 && !isExplored[x - 2, y] && map[x - 1, y] == false){//上19 count += Explore(x - 2, y);
20 }
21 if (x <= _mapSizeX - 4&& !isExplored[x + 2, y] && map[x + 1, y] == false){//下22 count += Explore(x + 2, y);
23 }
24 if (y >= 3 && !isExplored[x, y - 2] && map[x, y - 1] == false){//左25 count += Explore(x, y - 2);
26 }
27 if (y <= _mapSizeX - 4 && !isExplored[x, y + 2] && map[x, y + 1] == false){//右28 count += Explore(x, y + 2);
29 }
30
31 return count;
32 }
(偶数,奇数)または (奇数,偶数)マスの床マスは、隣接する (奇数,奇数)マスの探索が可能であれば探索
可能なので、(奇数,奇数)マスで探索可能なもののみを数え上げています。
コンストラクタ内でこの関数を利用しましょう。コメント//◆のついている break文を消し、以下のよ
うに書き換えます。
if (!ExploreCheck())continue;
else break;
これで全域探索可能でないマップが生成されたときはやり直されるようになりました。
16 UTMC Press 2017-5
4.4 完成です!
マップサイズを 21とか 31(この辺まで来ると処理に数秒かかりますが…)とかもっと大きな奇数にし
てみましょう! やりごたえのあるゲームが作れそうな気がしませんか?
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■・■・・・■・・・・・・・・・・・・・■・■・・・・・・・■
■・■■■・■・■・■・■■■・■・■■■・■・■■■・■■■
■・・・・・・・■・■・・・■・■・・・・・■・・・■・・・■
■・■・■・■■■■■■■・■■■■■■■■■・■・■・■・■
■・■・■・・・・・・・■・■・・・・・・・・・■・■・■・■
■■■・■■■・■■■・■・■■■・■・■■■■■■■・■・■
■・・・■・■・・・■・■・・・・・■・・・■・・・・・■・■
■・■■■・■・■■■・■■■・■■■・■■■■■・■■■■■
■・■・・・■・・・■・■・■・・・■・・・・・■・■・・・■
■・■■■・■■■・■■■・■・■・■■■■■・■■■・■■■
■・・・・・■・■・・・・・■・■・・・■・■・・・・・■・■
■■■・■■■・■・■■■■■■■■■・■・■・■・■・■・■
■・・・■・・・・・・・・・・・・・■・■・・・■・■・・・■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
5. おわりに冒頭にも書きましたが個人制作でもスマホのローグ RPG作品はたくさん出ています。この記事で迷路
を作りながら「こんなゲームが作れそうだなあー」なんてアイデアが浮かんできたりしたら…うれしいで
すね。筆者自身もローグ RPG作品をこれから手がけていく予定ですのでよろしくお願いします笑
tiace.:UTMC歴 1桁日。現在 2年。プログラミングは高校から、部活で。プログラミングなんてゲーム
しかやったことない。初心 unity使い。人生で最も無駄だったと思う時期は C学ぶ前に C++の知識だけで
unity動かしてた時期。割りと最近の話だけど。
17
4 テスラコイル製作記(未完)proton
1. はじめにこれは五月祭前日に急いで書いた記事なのでかなり雑です。
元々、春休みに作り始めたテスラコイルの記事を書くつもりだったのですが未だに自分の設計では放電に
至っていないため、真面目な回路の説明とかはしません。(というか時間がない)基本的に他人の回路図を
組み合わせたり少し改変したものばかりで、回路等の画像を張っていいのかよくわからないためリンクを
張っておきます。
電子工作は、調べても間違った情報が出てきたり入手困難な部品が使われており完全に再現できないと
いったことがよくあるため、その仕組みをある程度理解しておく必要があります。今回の、テスラコイル
は原理が難しい (?) (自分もちゃんと理解しているか怪しい)ためかオカルト方面でも人気があるようで、
なかなか怪しい記事が検索に混ざっており回路図決定までもかなり時間がかかってしまったので、 (ただ
でさえ少ない電子工作が出来る人の中でテスラコイルをまだ作ったことがない人がこれを読むとは思えま
せんが)いろいろ調べたサイト等々を載せるので参考になればと思います。
当然ですが、この記事そして各サイトに書いてある内容を参考にしていかなる損害を負おうとも責任は負
えません。テスラコイルは高電圧や大電流を扱うため、どこが危険でどのようなことが生じうるかをある
程度理解したうえで、(自己責任で)工作を行うべきです。
2. テスラコイルについて(ちゃんとした内容や理論は自分で調べたほうがいいですが、何も書かないわけにはいかないので自分
なりの理解等を書きます。)
2.1 紹介
テスラコイルは、共振を利用して高周波・高電圧を得る装置のことです。(ニコラ・テスラが開発した
ためテスラコイルと呼ばれるようになったらしい)振り子の周期に合わせて力を加えることで振り子の振
れ幅が大きくなるように、電気的なエネルギーを加えて電圧を高くして空気の絶縁破壊に至らせるわけで
す。計算すればわかりますが、この振り子の周期に相当するものが現実的な大きさの装置ではどうしても
小さくならざるを得ないため高周波しか得られません。逆に、高周波であるため表皮効果によって放電に
触ったりすることができたりします。
(参考:ニコニコ動画“人間テスラコイル・ヒューマンライティング”: http://www.nicovideo.jp/watch/sm18700601
)
テスラコイルの理論的な解析はかなり難しく、参考になる資料がほとんど存在しないため動作原理に関し
18 UTMC Press 2017-5
てはまだ書けるほど理解していませんが、似たような技術は非接触給電があり、こちらは道路から車への
給電とかちゃんと研究されているものなので勉強すると何かわかるかもしれません。
(参考: 磁界共鳴によるワイヤレス電力伝送 /居村岳広著
空芯電磁誘導の基本原理: http://www.geocities.jp/motoki_mimori/super_tc.htm
テスラコイルって素晴らしい: http://blog.livedoor.jp/neotesla/)
2.2 構成内容
テスラコイルは、基本的に共振を利用したトランス (変圧器)であり、大電流を流すために銅管や太い電
線を用いて 310回巻きの一次コイルと、細いエナメル線を 1000回 (?) ほどの 1層巻きの二次コイル、二
次コイルにつける容量球 (キャパシタ)、一次コイルに流す電流を制御する部分、電源から構成されます。
電源電圧は設計にもよりますがロジック側は 915V,パワー側は 12282Vほどでありパワー側は当然大電流
が流せるようなものを用いる必要があります。放電時の周波数は基本的に 100kHz1.4MHz程度であり電
圧は諸説ありますが1次側の電源電圧と 1,2次側の共振回路の Q値と 1次 2次コイルの巻き数比の積から
求められるらしいです。(低周波高電圧ではないため単純に空気の絶縁破壊耐力と放電距離から計算がで
きないらしい)
(参考: DRYROOM テスラコイル 3 号機 (DRSSTC) [一次コイル制作に電圧に関する式があります]:
http://dry-room.net/doku.php?id=power_ele:teslacoilver3)
テスラコイルの共振周波数は、主に二次コイル側のインダクタンスとキャパシタンスで決まります。コイ
ルはコンデンサを取り付けていなくても、巻き線と巻き線の間などコイル自体が静電容量を持つためテス
ラコイルの画像でよく見る容量球やトロイドはなくても問題はありません。容量球やトロイドをつけるの
は共振周波数を下げることで、一次コイルに流す電流を切り替える周期を伸ばすためや、放電部分の曲率
を小さくすることで絶縁破壊電圧を上げるためです。(当然高速で切り替えようとするほど要求される素
子等の性能も上がる)
2.3 制御方式
一次コイルに電流を流す制御部分の方式はいくつかあります。
一つ目が、SGTC (Spark Gap Tesla Coil)でありニコラ・テスラが開発したテスラコイルと同じ方式です。
仕組みはかなり単純で、高圧トランスで昇圧してコンデンサを充電し、一定電圧を超えるたびに調整した
スパークギャップ間が絶縁破壊して導通することでコンデンサと一次コイルによる LC共振を生じさせ高
電圧が発生し、それによって二次コイル側もコイルやトロイド等による LC共振を起こし高電圧を発生さ
せます。単純ですが、高圧トランスや高圧コンデンサの入手(制作)が難しく、駆動周波数のフィード
バックができないため自由に調節できるように作らなければいけません。回路図こそ至極単純ですが次の
SSTCとは別の難しさがあります。
(参考: テスラコイルの製作法: https://www.ekbo.co.jp/wp-content/file/pdf/laboratory/tesla/1_3.pdf
殺伐の実験室テスラコイルの製作 (SGTC): http://www.geocities.jp/daga884/exp_tesla.html
テスラコイルの製作 http://www.aichi-c.ed.jp/contents/kogyo/jirei_H14/handa-th/tesura/tesuracoil.htm
ヤフー知恵袋ホームセンターの材料だけで作れるテスラコイルの作り方を教えてください:
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14145312479)
テスラコイル製作記(未完) — proton 19
二つ目は、SSTC(Solid state Tesla coil) であり半導体制御のテスラコイルです。適当な発信回路で FET
や IGBT などのスイッチング素子を用いて一次コイルに交互に断続的な直流を流します。一次コイル側
と二次コイル側の共振周波数を合わせるように一次コイル側にもキャパシタを追加した DRSSTC(Dual
Resonant Solid State Tesla Coil)や、さらに大電力アンプなどを用いて DRSSTCではスイッチングに急激に
電圧を高くしていたところを徐々に電圧を高くするようにすることで放電距離を伸ばし針のような放電を
生成する QCWDRSSTC(Quasi-Continuous Wave Dual Resonant Solid State Tesla Coil) などの派生がありま
す。半導体制御であるため、フィードバックをとることによって環境によって変動する共振周波数に追従
するような制御や、音のデータを入力できるようにして音の周波数でスイッチングをすることで放電によ
り音を鳴らすこと等ができます。しかし、各種素子の役割やロジック回路、パワーエレクトロニクスの基
礎的な知識など様々な知識が必要となります。特に DRSSTCや QCWDRSSTCは回路の細かい工夫が必
要とされ、情報が少ないためかなり難しいです。
(参考: TNKSブログテスラコイルの作り方 半導体テスラコイル DRSSTC回路図等:
http://tnksblog.doorblog.jp/archives/32926963.html
エレクトロニクス研究部 東京都市大学付属中学・高等学校 テスラ班:
http://www.eleken.net/2011/group/eleken.tesla/index.html
虹ゲルの電子工作記 SSTC用MIDIインターラプター指南書:
http://nijigeru.blog.fc2.com/blog-category-1.html
The Micro SSTC (11/28/03) [Steve氏のものです]: http://www.stevehv.4hv.org/SSTC6.htm
Atelier Penguin Half-bridge SSTC: http://www.at-penguin.com/jp/?p=29
Loneoceans Laboratories SSTC2: http://www.loneoceans.com/labs/sstc2/
UZZORS2K Class E PLL SSTC: http://uzzors2k.4hv.org/index.php?page=classecoil1)
三つ目は、VTTC(Vacuum Tube Tesla Coil)であり真空管を用いたテスラコイルです。FETや IGBTのよう
なスイッチング素子よりもさらに早く切り替えができる (高周波動作が可能)ため、小さなテスラコイルで
も駆動することができます。情報が極端に少なく、真空管に関する知識も必要です。
四つ目は、OLTC(Off Line Tesla Coil)でアメリカの Coiler Terry Fritz氏によって作られたテスラコイルで
す。SGTCと仕組みは同じらしいですがよくわかりません。興味があればリンク先を解読してください。
(参考:OLTC FAQ 1.0: http://scopeboy.com/tesla/oltcfaq10.html)
さらに細かく分けることもできますが、大きく分けるとこの 4つになります。全体的に情報が少なく、必
要とされる知識も多いため電子工作の中では難しい部類に入りますが、SGTCと SSTCはまだ情報がある
ので頑張れば作れると思います。
3. 自分が SSTC製作に挑戦したときの記録のようなものもともと春休みに何か作ろうと思い、できれば難易度が高いものをとテスラコイルに挑戦しましたが想
像以上に難しくいろいろとあったので、いまだ未完成ですがこれまでの経緯の振り返りもかねて参考にな
るかもわからない雑な記録や注意点を書きます。
20 UTMC Press 2017-5
3.1 二次コイルの製作
二次コイルの特性は設計段階での計算が困難であるため、まず初めに二次コイルを作る必要がありま
す。
今回は、(確か) φ 88 の塩ビパイプに 0.5mm, 1kg のポリウレタン銅線をすべて巻いたものを使いまし
た。秋月で売っている LCRメータ (DE-5000)を用いて測定したところ、試験周波数 100kHzで 24.56Ω,
13.252mH, 19.281pF程度でした。ここから共振周波数を計算してもよいのですが、二次コイルの下端にオ
シロスコープと矩形波を生成するオシレータを接続し、オシロスコープとオシレータ GNDをアースに接
続して矩形波の周波数を変えていくことで共振周波数を知ることができます。矩形波が凹んで丸い M字
に近い波形になるところが共振周波数であり、これは周囲の人の位置などによって明確に変化することが
わかります。今回制作した二次コイルでは、トロイドをつけないでおよそ 475kHz, 1.19MHzあたりが共振
周波数でした。
3.2 参考にした回路図とこれまでの経緯
二次コイルを作った後、色々と調べましたが一番初めは
A’s LabâEaMy SSTCの回路図を公開: http://haido.blog.jp/archives/1000016896.html
の回路図を参考にしました。インタ-ラプタ-は
DRSSTC Interrupter: https://www.stevehv.4hv.org/drsstc_interrupter.htm
の回路図をもとに制作し、インタ-ラプタ-と制御基板の間は同軸ケーブルで接続しました。
結果は、信号を元に FETを駆動させるデュアルローサイドドライバの IR4427がとても発熱し、出力の電
圧降下が大きく、ロジックとパワーを切り離すためのゲートドライブトランス (GDT)のパワー側に FET
を駆動させるだけの電圧が生じませんでした。IR4427が数個お亡くなりになりました。
色々と試しましたがどうしてもうまくいかず、GDTをなくそうとして次に
Atelier Penguin Half-bridge SSTC: http://www.at-penguin.com/jp/?p=29
のデットタイム生成部分と IRS2110周辺部分だけ参考にしました。
結果は、IRS2110の出力が全く機能せず回路を見直したりしましたがいくつもの IRS2110が (おそらく)
壊れていったので諦めました。
その後 FETの駆動前であれこれやっていましたが、最終的に音楽を鳴らしたかったので
UZZORS2K Class E PLL SSTC: http://uzzors2k.4hv.org/index.php?page=classecoil1
を参考に PLLを用いた回路を作成しましたが、動作こそするものの音の入力に対してどのように変化す
ればいいかなどが理解できていないためまだ調整中です。
さらにまた GDTのこと等を調べていると、ゲートドライバの出力が足りなかったのではないかと思い
TNKSブログテスラコイルの作り方 半導体テスラコイル DRSSTC回路図等:
http://tnksblog.doorblog.jp/archives/32926963.html
の”~で GDTの説明といっしょくたにした図が~“の部分にある画像を参考に、ゲートドライバと GDT
の間に FETを使いました。
結果は、GDTはちゃんと動きましたがリンギングの発生がひどく FETの動作電圧以上最大電圧以下に収
まるように GDTの巻き比を調整したり、ノイズを除去するために LCフィルタなどを入れてみたりして
いるあたりで春休みが終わってしまい、あまり作業ができなくなりました。
テスラコイル製作記(未完) — proton 21
4. あとがき時間がないのと、まだ完成しておらず理解も十分でないためかなり説明を省いたところがありますが、
夏コミの部誌のころには多分もう少しましなものを書くので許してください m(*_ _)m
自分なりのこれまでの振り返りとして書いたので、構成や文体が少し雑になってしまいました。テスラコ
イルや電子工作に少しでも興味を持ってもらえると嬉しいです。(調べているときに見つけたのですが、
aitendoという秋葉原の店にテスラ電光音発生キットという 1000円前後の音楽がならせるテスラコイルが
買えます。かなり素子を酷使する構成なので遊んでいたら一日で壊してしまいましたが、手っ取り早く放
電や放電による音を体験したければ買ってみてもいいかもしれません。)
22
*あとがき *
つかれた
23
Memo:
9784201705018
1929404000005
UTMCBN978-4-2017-0501-8 C9404 ¥0E定価(本体オープン価格 +税)
UTMC Press 2017年 5月号(5月祭部誌)
2017年 5月 19日 初版印刷2017年 5月 20日 初版発行
編 集 gott表 紙 uc印 刷 UTMC印刷局発行所 東大マイコンクラブ (UTMC)
〒153-0041 東京都目黒区駒場 3丁目 8番 1号東京大学教養学部学生会館 303号
電 話 03 (5454) 4343(呼)e-mail [email protected]
URL http://www.komaba.utmc.or.jp/
©2017 UTMC Printed in Japan
落丁・乱丁は残部のある限りお取り替え致します。