教育支援用CASL2・COMET2シュミレータ
お久しぶりです。
今回はOS-CPU Advent Calendar 2019 - Adventarの記事です。
はじめに
皆さんアセンブリ言語はどのように習得されましたか?
CTF?組み込み?などなどあると思います。
一部大学や工業高校でも情報科学の一歩としてアセンブリ言語を勉強するそうです。
いろいろアセンブリ言語がある中でてっとり速く習得できるアセンブリ言語として、IPAが策定したCASL2があります。
>> CASL(キャスル)は、情報処理技術者試験におけるプログラミング能力試験のために、CAP-Xの後継として1986年仕様策定したアセンブリ言語である。 <<
CASL - Wikipedia
CASL2は命令セットが少なくシンプルであるため、アセンブリ言語教育として多く使われています。
仕様はこちらを見ていただけたらわかります。
アセンブラ言語CASLⅡの仕様
問題点
CASL2・COMET2は実際に教育現場で使われているのですが、良いシミュレータが余り存在しない点があります。
CASL2を動かす分にはいいのですが、CPUの可視化・CPUの命令サイクルの動きなどCPU本来の動きを見せているシミュレータが余りありません。
個人的に理想に近いシミュレータが
www.ics.teikyo-u.ac.jp
になります。
が筆者のOSがArchLinux&MacOSであるため、簡単には動きません。まして、教育用ということで最近流行りのChrome OSやAndroidなど環境にとらわれないシミュレータがほしいところです。
解決
というわけでCASL2・COMET2シミュレータをつくりました!!
Webブラウザで動作します。
使い方はこちらを参考にしてください。https://wocasl2.herokuapp.com/help
アセンブルやシミュレータ部分を完全フルスクラッチのためエラーの原因やメモリのオーバーフローなど独自で検知できるようになっています。
しかし、まだ開発中のためCOMET2のCPUの可視化が全然できておりません。COMET2のトグルボタンをオンにするとCPU可視化モードが音になる予定です。
Go言語 ポインタ
Golang にはポインタの概念があってC言語と同じようにポインタ操作できる
いろいろ制約があるが大体同じようなことができる
今回は、Golangでどうしてもアドレス値を取得して変数に入れて加工がしたかったのだが...
どうしてもうまくいかない!!
a:=0 b:=(int)&a
こんな感じでうまくいくんじゃね?
と思っていたが型変換がうまくいかなかった
いろいろ模索を考えていたがfmt.Sprintfで文字列にしてからintに変換してアドレスを取得することになった....
なんか..こうアドレスだけ返してくれる関数とかあったりしないんか?
もっとスマートな方法でできるやり方があったら教えてください...
SecHack365-福岡回
お久しぶりです。
今回はSecHack365福岡回に行きました
[ Day0 ]
24:00
バイトが終わり知り合いの家に行く。
なぜかというと、今回は田舎の空港から福岡だったので空港に行くまでに時間がかかるためなるべく空港から距離が近い知り合いの家に泊まった。
弁当を2つ食って体力回復
プレゼン資料が完成していないためプレゼン資料を作る。
今回のプレゼンは、全体にプレゼンする形で、自分が何をやりたくて現在どこまでできているのかというテーマであった。
自分は、言語統一で天下統一を目指す
2:00
就寝
[ Day1 ]
- 5:30
起床
- 5:50
バス停まで歩く
-
7:10
空港に着く
-
9:00
飛行機フライト
-
10:30
福岡到着
博多駅に移動
- 12:00
他の参加者と合流して博多ラーメンの旅に出る
神が現れた
- 13:00
- 13:30
Nulabに到着
- 14:00
Nulabの社長さんのプレゼンテーションや社員との交流
めちゃめちゃ刺激になった
TypeTalkとBacklogを使おう!!
- 19:00
宿泊先へそして夕飯
バイキング形式でお刺身やステーキなどあってめちゃくちゃうまかった!!
その後9:00まで習慣化の follow upなど
風呂に入って1日目終了
[ Day2 ]
- 6:30
起床そしてご飯へ
- 9:00
全員のプレゼンテーションタイム
年齢順の発表のため、みなさん強いことしか言わない...
午前中で半分の人が発表
- 12:30
昼飯
お弁当
- 13:20
くぼたつ道場
今回は、会場の目の前が海だったので海に行くことに...
くぼたつさんがかなり泳いで行ってしまったのですごかった...
リゾート気分を楽しみリフレッシュできた
ちなみに自分がガチで泳ぎました
- 15:00
後半の人のプレゼンテーション
自分は15:50頃で34番目であった...
自分のテーマは「言語開発とJIT開発」
発表してる時「Rustはいいぞぉ〜」や、コメントに「Rustはいい言語」ときたのでRustを意識し始める
Goベースで書いているのはお察し
SecHack365内で一番の最弱でクソザコナメクジなので今後が心配になった
- 18:00
夕飯タイム
1日目と同じでバイキング形式
お刺身とご飯と味噌汁が最高にうまい!!
SecHack365さんありがとうございます!!!!!!
- 19:00
発表をして同じ内容を目指している人とグループを作ったり、相談をしたり自由な感じで情報共有
言語のヒヤリングなど、聞いて回った??
- 22:00
終了
[ Day3 ]
- 6:00
起床
同じ部屋の人から海に行かないかと誘われついて行く
エモい!!
リフレッシュ
- 7:00
風呂
朝風呂ガチ最高!!
- 7:30
朝食
バイキング形式
うまい!!
コーヒーが美味しい!!
- 9:00
コースワーク開始
ゼミに一人追加!!仲間が増えた
LLVMの狐本を初めて見て中間表現すげぇ〜
オライリーのRust本を初めて見てこりゃすげぇ〜
っとなった
自分は言語の仕様が固まっておらず言語の特徴レポートを書くことになった
- 12:00
お昼ご飯。弁当
うまい
- 13:00
倫理のお話
セキュリティに間することをやっているので改めて倫理について考えた
- 14:00
最終の相談タイム
とりあえずレポートのWikiを作ったりと
15:00
バスに乗り込む
16:00
福岡空港に着く
とりあえず空港を散策してハンバーガ食ってお土産買って飛行機に乗った
20:30
空港について終わり
次回は、山形回。
成果物を上げなければいけない回
フルパワーでがんばるぞい
SecHack365-北海道回
お久しぶりです。習慣化のための日記を書いているのですが、更新頻度が遅いです...
前日
まさかの前日にバイトに入ってしまい準備もせずにバイトに行く
そして、終電を逃して家まで徒歩で帰る羽目になった...
W杯の生中継も見たいのに....
まさかのゼミ内で実況が始まる
1時間マラソンをして家に帰ったが、家を出発するのが6時前なので、3時間しかねれなかった...
1日目
6:00 家を出発する
6:20 電車に乗る
6:40 新幹線に乗る
8:30 品川に着く
そして羽田に行くために京急線に乗り換えだが迷子になる
9:00頃 羽田空港に着く
手荷物が10kgまで持ち込みがおkですが、自分のバックの中にPC2台,ipad,OS自作本、GOインタプリンタ本で10kg以上を超えました()
究極の手段で、OS自作本をキャリーバックの中に入れました
10:30頃 飛行機に乗る
めっちゃ晴れてて窓席でまじ最高!!
11:45頃 新千歳空港に着く
天気違いすぎるやろ...
とりあえず集合時間まで新千歳空港を満喫する
とりあえずラーメン道場に吸い込まれた
味噌ラーメンめっちゃうまかったです
そしてドラえもんゾーンへ
Web スクレイピングで画像収集
はじめに
www.d-man.site
↑これのWeb スクレイピング編です
主な環境
名前 | バージョン | 備考 |
---|---|---|
Python(Anaconda) | 3.6.5(Anaconda 5.2) | 環境導入はこれ(http://www.d-man.site/entry/2018/06/04/022059) |
Windows | わすれた | Windowsでも試しました |
Mac OS | macOS High Sierra | MacでもWindowsでもどっちでもええよ |
Google Chrome | 66.0.3359.181 | とりあえずChrome |
ChromeDriver | 2.40 | Pythonからブラウザを動かすため |
ChromeDriverインストール
https://chromedriver.storage.googleapis.com/index.html?path=2.40/
↑ここから自分にあったOSの奴をダウンロードするする
そしたら適当なところにフォルダを作り配置します
WIndowsだったらCドライブ直下に「scraping」ってフォルダ作りましょう
↑こんな感じ
終わり
seleniumインストール
conda install -c conda-forge selenium
anaconda Promptでcondaコマンドでインストール
y/n聞かれるのでyと入力
インストールが終わったらChromeDriverを入れたら場所にscraping.pyのファイルを作りましょう
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities #MacOsの場合 #driver = webdriver.Chrome(executable_path="./chromedriver") #Windowsの場合 driver = webdriver.Chrome(executable_path="./chromedriver.exe")
上記のコードをscraping.pyに記述します
python scraping.py
で実行します
こんな感じでChromeが勝手にひらけば成功です。
selenium使い方
URLを指定して開く
URL="https://google.co.jp/" driver.get(URL)#←URLを指定できる
全体だとこんな感じ
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities #MacOsの場合 #driver = webdriver.Chrome(executable_path="./chromedriver") #Windowsの場合 driver = webdriver.Chrome(executable_path="./chromedriver.exe") URL="https://google.co.jp/" driver.get(URL)
htmlを取得する
html=driver.page_source #pageのhtmlを取得する
全体
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from bs4 import BeautifulSoup #htmlを解析するため #MacOsの場合 #driver = webdriver.Chrome(executable_path="./chromedriver") #Windowsの場合 driver = webdriver.Chrome(executable_path="./chromedriver.exe") URL="https://google.co.jp/" driver.get(URL) print(driver.page_source)#html表示
BeautifulSoup
スクレイピングをするためにBeautifulSoupを使います
こんな感じで使います
使い方
soup = BeautifulSoup(driver.page_source, 'html.parser')
指定したタグの要素を全部取る
htmlのタグを指定してすべて取得
soup = BeautifulSoup(driver.page_source, 'html.parser') for img in soup.find_all("img"):#find_all(タグ)で取得 print(img)
全体
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from bs4 import BeautifulSoup #htmlを解析するため #MacOsの場合 driver = webdriver.Chrome(executable_path="./chromedriver") #Windowsの場合 #driver = webdriver.Chrome(executable_path="./chromedriver.exe") URL="https://www.google.co.jp/search?q=doraemon&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiF8PaIvMrbAhUEErwKHdk0Cc0Q_AUICygC&biw=1439&bih=710&dpr=2" driver.get(URL) soup = BeautifulSoup(driver.page_source, 'html.parser') for img in soup.find_all("img"): print(img)
doraemonの画像の検索結果が出ます
Yahoo 画像検索でのスクレイピング
import os import requests # urlを読み込むためrequestsをインポート import time import sys from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities args = sys.argv if (len(args) != 2): sys.exit() search = args[1] URL = 'https://search.yahoo.co.jp/image/search?p='+search+'&dim=large' images = [] # 画像リストの配列 beforheight=0 #読み込む時間を設定する timer=2 #フォルダを作成する if not os.path.exists(search): os.makedirs(search) #Chromeを開く #MacOsの場合 #driver = webdriver.Chrome(executable_path="./chromedriver") #Windowsの場合 driver = webdriver.Chrome(executable_path="./chromedriver.exe") driver.get(URL) time.sleep(timer) while True: while True: #画面を下までスクロールする driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(timer) #スクロールの位置を取得 height = driver.execute_script("return document.body.scrollHeight") #最後の取得されたスクロールの位置と同じならページの下だと判断 if height == beforheight: break beforheight = height try: submitButton = driver.find_element_by_link_text("もっと見る") submitButton.click() time.sleep(timer) except: break soup = BeautifulSoup(driver.page_source, 'html.parser') for link in soup.find_all("img"): if link.get("src").endswith(".jpg"): images.append(link.get("src")) elif link.get("src").endswith(".png"): images.append(link.get("src")) elif link.get("src"): images.append(link.get("src")) i = 0 # imagesからtargetに入れる for target in images: re = requests.get(target) try: with open(search+"/"+search+"-"+str(i)+".jpg", 'wb') as f: f.write(re.content) # .contentにて画像データとして書き込む i+=1 except: print("Error") print(str(i)+"枚数保存完了") # 確認
実行方法
python scraping.py 検索ワード
検索ワードには適当に入れてもええです
python scraping.py doraemon
ってやればdoraemonのフォルダが直下にできてその中に書き込まれます
こんな感じ
ただし一つ問題点があり、
画像サイズが現物のサイズではなく検索エンジンの表示サイズなのでリンクを踏むように改造しなければならないので頑張ります
まあ色々改造してみてください
なんとなくやる機械学習(画像収集方法編)
はいどうも
何かと忙しすぎて全然かけませんでした
はじめに
機械学習をするに関して学習用のデータが大量に欲しい場合があります。
今回の場合は画像なんですが、自分で写真を撮って学習させるなんてめんどくさいです...
かといってWebにある画像を右クリック保存なんてやってたら日が暮れても終わりません
なんとか自動で画像を集めてくれるものはないのかと調べました。
方法は二つあり、
- Web scraping
が主にありました
それぞれ環境構築やソースコードに関してはおいおい書きます
Web scraping(Webスクレイピング)
ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー[1]あるいはウェブ・スパイダー[2]とも呼ばれる。 通常このようなソフトウェアプログラムは低レベルのHTTPを実装することで、もしくはウェブブラウザを埋め込むことによって、WWWのコンテンツを取得する。
簡単に言えばYahooやGoogleの画像検索した結果を解析してタグ探して保存することです...(大雑把)
ただし、法的な問題があるので注意が必要です。
qiita.com
↑参考
www.d-man.site
D言語でかく素数プログラム(エラトステネスの篩)
後輩に素数プログラムを書いてくださいと言われたので書いてみた
どうやら後輩はC言語を勉強中であり、C言語でとりあえずささっと実装した
1~100までの素数を出せばいいらしい
1分で作ったコード
#include<stdio.h> #include<math.h> #define N 100 int main() { int a[101] = { 0 }; int i, i2; for (i = 2; i <= (int)sqrt(N); i++) { for (i2 = i; i*i2 <= N; i2++) { a[i*i2] = 1; } } for (i = 2; i <= N; i++) { if (!a[i]) printf("%d\n", i); } }
アルゴリズム的には素数問題の解法でよく使われるエラトステネスの篩です。
2*2,2*3,2*4,,...10*10と倍数になるものは素数ではないので配列に目印立てとけばいいだけの話です
理論的な話は、Wkipediaを見てください
エラトステネスの篩 - Wikipedia
しかし、後輩からの一言に衝撃を受けた....
なんと配列をまだ習っていないという....
配列なしに素数を出すプログラムとは???と考え見つけ出したのがこれ
#include<stdio.h> int main() { int i, i2; for (i = 2; i<100; i++) { for (i2 = 2; i2 <= i; i2++) { if (i == i2) { printf("%d\n", i); } if (i%i2 == 0) { break; } } } }
いや~なんとも普通なプログラム....
若干高速化できないかと考えて
#include<stdio.h> #include<math.h> int main() { int i, i2; printf("2\n"); for (i = 3; i<100; i+=2) { int a = 1; for (i2 = 3; i2 <= sqrt(i); i2+=2) { if (i%i2 == 0) { a = 0; break; } } if (a) printf("%d\n", i); } }
とりあえず素数は奇数しかないので奇数だけループを回して考える
ちょっとは早い
最後にD言語で素数問題(エラトステネスの篩)を解いてみる(これがやりたかっただけ)
import std.stdio,std.math; const int N = 101; bool[N] a; void main() { for(int i=2;i<=sqrt(cast(double)a.length);i++){ for(int i2=i;i*i2<=a.length;i2++){ a[i*i2]=true; } } for(int i=2;i<a.length;i++){ if(!a[i]) writefln("%s",i); } }
まあ普通にC言語っぽい