D man? blog

言語開発と開発ブログ

教育支援用CASL2・COMET2シュミレータ

お久しぶりです。

今回はOS-CPU Advent Calendar 2019 - Adventarの記事です。

はじめに

皆さんアセンブリ言語はどのように習得されましたか?

CTF?組み込み?などなどあると思います。

一部大学や工業高校でも情報科学の一歩としてアセンブリ言語を勉強するそうです。

いろいろアセンブリ言語がある中でてっとり速く習得できるアセンブリ言語として、IPAが策定したCASL2があります。

>> CASL(キャスル)は、情報処理技術者試験におけるプログラミング能力試験のために、CAP-Xの後継として1986年仕様策定したアセンブリ言語である。 <<
CASL - Wikipedia

CASL2は命令セットが少なくシンプルであるため、アセンブリ言語教育として多く使われています。

仕様はこちらを見ていただけたらわかります。
アセンブラ言語CASLⅡの仕様

CASL2を動かすマシンとしてCOMET2と言われる仮想マシンも実はIPAが策定しています。

ja.wikipedia.org

問題点

CASL2・COMET2は実際に教育現場で使われているのですが、良いシミュレータが余り存在しない点があります。

CASL2を動かす分にはいいのですが、CPUの可視化・CPUの命令サイクルの動きなどCPU本来の動きを見せているシミュレータが余りありません。

個人的に理想に近いシミュレータが
www.ics.teikyo-u.ac.jp
になります。

が筆者のOSがArchLinux&MacOSであるため、簡単には動きません。まして、教育用ということで最近流行りのChrome OSAndroidなど環境にとらわれないシミュレータがほしいところです。

解決

というわけでCASL2・COMET2シミュレータをつくりました!!

wocasl2.herokuapp.com

Webブラウザで動作します。

使い方はこちらを参考にしてください。https://wocasl2.herokuapp.com/help


アセンブルやシミュレータ部分を完全フルスクラッチのためエラーの原因やメモリのオーバーフローなど独自で検知できるようになっています。

しかし、まだ開発中のためCOMET2のCPUの可視化が全然できておりません。COMET2のトグルボタンをオンにするとCPU可視化モードが音になる予定です。

最後に

バグの発見や改善案などございましたら
github.com
issuesまでどうぞ

よろしくお願いいたします。

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

他の参加者と合流して博多ラーメンの旅に出る

神が現れた


f:id:d-lan:20180825004614j:image

  • 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

くぼたつ道場

今回は、会場の目の前が海だったので海に行くことに...

くぼたつさんがかなり泳いで行ってしまったのですごかった...

リゾート気分を楽しみリフレッシュできた

ちなみに自分がガチで泳ぎました


f:id:d-lan:20180825004647j:image

  • 15:00

後半の人のプレゼンテーション

自分は15:50頃で34番目であった...

自分のテーマは「言語開発とJIT開発」

発表してる時「Rustはいいぞぉ〜」や、コメントに「Rustはいい言語」ときたのでRustを意識し始める

Goベースで書いているのはお察し

SecHack365内で一番の最弱でクソザコナメクジなので今後が心配になった

  • 18:00

夕飯タイム

1日目と同じでバイキング形式

お刺身とご飯と味噌汁が最高にうまい!!

SecHack365さんありがとうございます!!!!!!

  • 19:00

発表をして同じ内容を目指している人とグループを作ったり、相談をしたり自由な感じで情報共有

言語のヒヤリングなど、聞いて回った??

  • 22:00

終了

 

[ Day3 ]

  • 6:00

起床

同じ部屋の人から海に行かないかと誘われついて行く

エモい!!

リフレッシュ


f:id:d-lan:20180825004706j:image

  • 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頃 飛行機に乗る
めっちゃ晴れてて窓席でまじ最高!!
f:id:d-lan:20180705163712j:plain
f:id:d-lan:20180705163745j:plain

11:45頃 新千歳空港に着く
f:id:d-lan:20180705163907j:plain
天気違いすぎるやろ...

とりあえず集合時間まで新千歳空港を満喫する

とりあえずラーメン道場に吸い込まれた
f:id:d-lan:20180705164126j:plain
味噌ラーメンめっちゃうまかったです

そしてドラえもんゾーンへ
f:id:d-lan:20180705164228j:plain
f:id:d-lan:20180705164328j:plain

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の奴をダウンロードするする

f:id:d-lan:20180611094529p:plain


そしたら適当なところにフォルダを作り配置します

WIndowsだったらCドライブ直下に「scraping」ってフォルダ作りましょう

f:id:d-lan:20180611094213p:plain
↑こんな感じ

終わり

seleniumインストール

conda install -c conda-forge selenium

anaconda Promptでcondaコマンドでインストール

f:id:d-lan:20180611021621j:plain

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

で実行します

f:id:d-lan:20180611100318p:plain
こんな感じで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のフォルダが直下にできてその中に書き込まれます

f:id:d-lan:20180611105900p:plain
こんな感じ

ただし一つ問題点があり、

画像サイズが現物のサイズではなく検索エンジンの表示サイズなのでリンクを踏むように改造しなければならないので頑張ります


まあ色々改造してみてください

なんとなくやる機械学習(画像収集方法編)

はいどうも

何かと忙しすぎて全然かけませんでした

はじめに

機械学習をするに関して学習用のデータが大量に欲しい場合があります。

今回の場合は画像なんですが、自分で写真を撮って学習させるなんてめんどくさいです...

かといってWebにある画像を右クリック保存なんてやってたら日が暮れても終わりません

なんとか自動で画像を集めてくれるものはないのかと調べました。

方法は二つあり、

  • Web scraping

が主にありました

それぞれ環境構築やソースコードに関してはおいおい書きます

Web scraping(Webスクレイピング)

ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー[1]あるいはウェブ・スパイダー[2]とも呼ばれる。 通常このようなソフトウェアプログラムは低レベルのHTTPを実装することで、もしくはウェブブラウザを埋め込むことによって、WWWのコンテンツを取得する。

ウェブスクレイピング - Wikipedia

簡単に言えばYahooやGoogleの画像検索した結果を解析してタグ探して保存することです...(大雑把)

ただし、法的な問題があるので注意が必要です。
qiita.com
↑参考
www.d-man.site


検索エンジンAPI

検索エンジンなどで検索結果の画像をjsonなどで返してくれるサービスがあります

Twitter

などなど

無料で使うにはそれぞれ制限があるので注意してください

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言語っぽい