アセンブリ言語を触ってた時のメモ

 玉田研のざきもとです。3日前にプロジェクト演習の内容を知ってそのあと3日間アセンブラ触ってたので備忘録として簡単に命令の使い方とか書いていく。今回アセンブラ書くのに使うP88の参考資料がやさしいコンピュータ科学だったのでそれとか読んでアセンブラ書いたりしてた。ちなみにこれまで理工学実験くらいでしかアセンブラ触ったことないので経験的にはプロ演受講者と変わらない感じ。あと先生も言ってたけどこういう個人の勉強用のメモを学習教材にする感じはよくないので受講者はちゃんと授業資料とか参考書籍読んで勉強してほしい(説明とか間違ってる可能性もある)

やさしいコンピュータ科学 (Ascii books)

やさしいコンピュータ科学 (Ascii books)

IN OUT(入力,出力)

  • IN
  • OUT

  • サンプルコード

    IN  AX
    OUT AX

COPY(値のコピー)

  • COPY
    • 指定した位置のメモリの内容をコピーする

サンプルコードでは,AXの内容がコピーされたBXが出力される。

  • サンプルコード
    IN AX
    IN BX
    COPY BX,AX ;BXにAXの内容をコピー
    OUT BX

ADD,SUB,MUL,DIV(算術演算)

  • ADD
    • 第1引数の値に第2引数の内容を加算する
  • SUB
    • 第1引数の値に第2引数の内容を減算する
  • MUL
    • 第1引数の値に第2引数の内容を乗算する
  • DIV
    • 第1引数の値に第2引数の内容を除算する

サンプルコードでは,AXにBXの数値を加算したものが表示される。

  • サンプルコード
    IN  AX
    IN  BX
    ADD  AX,BX ;AXにBXを加算
    OUT AX

JMP,END(ジャンプと終了)

    IN AX
    IN BX
    JMP LAB1 ;LAB1ラベルまでジャンプ
    ADD AX,BX ;ジャンプされるので命令は無視される
    OUT AX
LAB1 END ;プログラムの終了

CMP,JNB,JB(比較)

  • CMP

    • 二つの整数の値を比較する
  • JNB

    • 2つ目の数字の方が小さい場合ジャンプ
  • JB
    • 1つ目の数字の方が小さい場合ジャンプ

サンプルプログラム

      IN AX
      IN BX
      CMP AX,BX ;AXとBXの大きさを比較
      JNB LAB1 ;AXよりBXの方が小さい場合ジャンプ
      END ;プログラムの終了
LAB1  OUT AX

ラベル

    IN AX
    COPY AAA,AX
    ADD AX,AAA
    OUT AX
    END

このプログラムを実行すると以下のような警告文が出る。

$ ./p88 label.p88
!!Undefined Label ... Memory allocated: AAA = [9], Line=2

これはAAAのラベルが定義されてねーよみたいな警告。
汎用レジスタである,AX,BX,CX,DXを使えば出ないけど,それ以外だと未定義ラベルの警告文が出る。
これが出てもp88は自動でメモリを割り当てるからある程度のプログラムは実行はできるし挙動は特に問題ないけど実際のアセンブラのプログラムではこれだと実行できないらしい。なのでラベルをちゃんと定義する。とりあえずコピーするだけなのでAAAには0を代入しておく

    IN AX
    COPY AAA,AX
    ADD AX,AAA
    OUT AX
    END
AAA 0 ;AAAに0を定義

これで警告は消えて問題なく実行できる。

ここまで理解できれば演習の問題は多分全部できるはずなので頑張って。

聲の形を見た

初日に見たので覚えてる限りざっくりした感想を書く。映画のネタバレの他に原作も読んだ前提みたいな感じに書くのでこれらが問題ない人は多分問題無し。あと声優の話と作画の話は特にしない感じで行く。


映画『聲の形』 ロングPV

良かった点

  • 基本的には原作通りに進めていて下手にオリジナル展開入れるなどして原作から逸脱するような大きな改変はなかった。原作をどこまでやるかわからなかったけど7巻分を2時間20分で収めるのは難しいのはすでにわかっていたので映画作るシーンや各キャラの内面を表す背景とかがごっそり省かれたけどそこ以外は大体原作通り収めていてすごいという感じだった。
  • 耳の聞こえない硝子が体に触れられる以外でどのように周りに誰がいるか気付く演出が上手かった(最初の方で将也が転んだときに鳩が飛んだことでいるのに気付いたところとか周りの人の動きで将也が来てるのに気付くシーンとか)。気配を感じて振り向くみたいなご都合的な感じがあんまりなかったのは細かいなぁと感じた。
  • 日常パートや特にシリアスを必要としない場面(永束と友達になり絡むシーンなど)は動きをつけることで原作よりいい感じだった。そこは山田監督の得意分野なんだろうなという風に落ち着いた。

悪かった点

  • 原作を読んでいたので大体問題なく見れたけど未読だとちょいちょい端折られてる部分で違和感感じるのかなという箇所がいくつかあった。(結絃がなぜ公園で寝ていたのかとか)あとキャラの背景をカットしたので特に川井とか真柴が何を考えているのかよく分からない感じになってた。そこは映画だけでは尺的に厳しいので原作買って補完してくれという感じに解釈した。

上の方で良い悪いでとりあえず分けてあげてみたけど見終わった直後だとどう評価すればいいのか難しいという感じだった。ちゃんと原作通りだし終わり方も将也がちゃんとみんなの顔を見れるようになって良かったねという感じなんだけどそこで終わりなのでまぁいい作品でしたね以上の感想が浮かばない。見終わったあとは原作を1度も読まずに見た時と全巻見たあとでどう評価が変わるのかとかめっちゃ気になった。一緒に観に行った未読の後輩は普通に良かったですとのこと。とりあえず周りの感想が聞きたいのでみんな見たら感想書いてくれという感じです。

Classroom for GitHubの導入方法をまとめた

どうも,玉田研のざきもとです。春からMasterになります。

ここ数日Classroom for Githubについて色々触ってたのでそれについて導入方法のようなものを書いていきます。

きっかけは以前うちのボスが「Classroom for Github興味あるけどよくわからん」といってたので気になって自分で調べてみました

gihyo.jp

Classroom for Githubとは

下記の記事によると,Classroom for GitHubを使うと教師は授業の課題を作成し、プライベートな招待用URLを通じて学生に課題用コードを配布できるそうです。また,教師がリポジトリ作成やアクセス管理を効率化できるだけでなく、生徒の課題提出も容易になるそうです。

www.itmedia.co.jp

他大学での導入例

他の大学の例では,東京工業大学が去年プログラミングの授業でClassroomを導入しているようです。

www.slideshare.net


Classroom for Githubの使用方法には,公式のドキュメントなどを参考にしました。スクリーンショットを載せながら進めていきます。

github.com

Classroom for Githubの導入

まずGithubで,クラス用の組織アカウント(Organization)を作成します

f:id:takehanogi11:20160330233736p:plain

このクラス用アカウントをプライベートリポジトリで管理したい場合は,教員がGithub Educationのサイトから申請することで,無料でプライベートリポジトリを使うことができます。申請方法に関しては,先ほどのボスの記事や,下記の記事を参考にしてください

pastak.hatenablog.com


アカウント作成ができたら,1つ課題配布用のリポジトリを作成しておいてください。

f:id:takehanogi11:20160330233934p:plain

次にClassroom for Githubのサイトにアクセスして,先ほど作成したOrganizationをクラス用に管理するアカウントとして登録します。New classroomをクリックしてください。

f:id:takehanogi11:20160330235045p:plain

すると,どのアカウントを管理するか選択する必要があるので,選んでください。もしこの中に存在しない場合は,下のGrant us accessにクリックして,アカウントを追加してください。

f:id:takehanogi11:20160330235656p:plain

登録が完了すると次のような画面が表示されます。ここで他の管理者を招待できるので,他の教員やTAなどのGithubアカウントを追加したり,招待用のURLを送ってください

f:id:takehanogi11:20160331000432p:plain

これも完了すると,下記の画面が表示されます。このCreate your first assignmentをクリックすることで,最初の課題を作成することができます。クリックして,課題の設定をしましょう

f:id:takehanogi11:20160331000853p:plain

まずは課題の形式を選択します。左が個人用の課題リポジトリで,右がグループ用の課題リポジトリです。今回は個人リポジトリを選択します。

f:id:takehanogi11:20160331001209p:plain

次に課題の名前,リポジトリをpublic,privateどちらにするか,スターターコードの登録を行います。スターターコードは,最初にOrganizationで作成したリポジトリを使います。

f:id:takehanogi11:20160331001556p:plain

これでClassroom for Githubに課題の登録ができました。次にこの課題用のスターターコードを学生に配布する必要があるので,学生に対してGive this to your studentsのURLにアクセスしてもらうようにしてください。

f:id:takehanogi11:20160331002007p:plain

学生にアクセスしてもらい,同意すると,組織アカウントに下記のような「課題名-学生のアカウント名」のリポジトリが自動生成されます。

f:id:takehanogi11:20160331002319p:plain

リポジトリが生成されると,Classroom for Githubの管理画面で,生成した学生を確認することができます。

f:id:takehanogi11:20160331002527p:plain

ここからは,Classroom guideのForkの通りにやると問題なくできるはずです。

1. 生成されたリポジトリをForkして,自分のPCにcloneする
2. ブランチを切って,出された課題に沿ってソースコードを編集してcommitする。
3. 課題が完了したら,リポジトリGithubにPushする。
4. フォーク元のリポジトリにPull Requestを送って課題提出

これで教員は,Classroom for Githubで学生の提出状況をそれぞれの課題ごとに確認しながら,提出されたPull Requestを見て,学生にフィードバックを書くことができます。

Classroom for Githubは導入すべきか

実際の導入までには,ある程度知識がないと辛い部分もありました。けれど,いまだにメールで課題プログラムを提出してくださいのような化石みたいな風習の学校もあると聞くので,それをするくらいなら教員にPull Requestを送ってフィードバック貰う方がモダンな感じでいいんじゃないかという感じはします。うちの学校のようにmoodleで提出する方がいいかGithubで提出する方がいいかは,実際に管理している教員によって意見は異なると思うのでようわかりません。Github導入に理解ない人だと課題提出システムあるのにわざわざ新しく覚えるの面倒とか思われるかもしれない

利点としては,Github課題提出を行っていくことで,学生にGitやGithubを慣れ親しんでもらえて知識も付くのでいいのではないかと思います。あとは課題をPull Requestで提出してレビューしてもらうのに慣れておくと,今後Githubフローを使ったソフトウェア開発フローを行う場合,違和感なく導入できるかもしれません。

あとは管理者に加えた他の教員やTAが,担当教員の代わりに学生の課題のレビューが行えるので,その点も作業を分散できて便利なのかなぁという感じはします。

教員がどれくらいGitやGithubを授業に導入するのに意欲的なのかや,どれぐらいで学生が自分でGitやらGithub使えるようになるかなどが今後の課題かなぁという感じです。

本格的に導入するのであれば,いきなり必修授業などに利用するのではなく,とりあえず自分の受け持ってる選択授業などでプログラム課題を出した時にCrassroom for GitHub試してみて,良さそうなら必修のプログラミング授業でも取り入れるよう働きかけるというのが無難な感じはしました。

卒業研究でgitのチュートリアルを作った話

この記事は「Git Advent Calender 2015」の22日目の記事です。今やってる卒業研究でgitが関わってるのでそれについて書きます 。

はじめたきっかけ

今年の春頃から研究テーマ決める感じになってそこで何やりたいかでいくつか候補があげられました。その中にプログラミング教育というジャンルで「gitチュートリアルを作って初心者に教えるような研究しないか」みたいなことをボスに言われたのでそのテーマでやってみることにしました。その頃はあまり具体的になにするか決めてなくてとりあえずgitのチュートリアル作ろうくらいしか考えてませんでした。もともとgitには興味あったしこれまでSourceTreeでよくわからないけどなんとなくでバージョン管理してたのでこれを機に具体的にgitとかについて勉強しようという気持ちで研究を始めました。

完成したチュートリアル

実装を始めたのが6月ぐらいでダラダラ進捗をごまかしながらやっていた結果、期限ギリギリの10月末くらいに完成しました。完成したのがこんな感じです
f:id:takehanogi11:20151222205526p:plain

指定されたgitコマンドを入力すると説明部分が書き換わり、直前に入力したコマンドとリポジトリ内で何が起こったのかを説明します。主にtryGitを参考に作成しました。緑の4つのボタンでそれぞれコースに分けておりそれぞれ

  • 1.git add とかcommitする基本操作に関するコース

  • 2.git statusとかでリポジトリ確認するコース

  • 3.リモートリポジトリ使うコース

  • 4.ブランチで操作するコース

といった感じです。コンソール部分はjquery-consoleを使いました。このチュートリアルをボスが受け持ってる授業内の課題として学生たちにやってもらいました。課題として出しても全員にやってもらえたわけじゃないけどそれなりにデータは取れたのでよかったです。

チュートリアルの反省点

今回チュートリアルをやってもらった人たちに最後にアンケートをやってもらって色々な感想がもらえたけど比較的多かったのがチュートリアルでコマンド打ってるだけじゃよく分からないという意見が多かったです。これがこうなったよという説明ではgit初めての人にはインデックスとかリポジトリとかブランチとかよくわからん単語が出てきてもイメージしにくいよなぁと思いました。あと作った後に気付いたんですがバージョン管理してるファイルがユーザにはチュートリアルやってる間は「git diff」とかでしか確認できない感じだったのでせめてcatコマンドでファイルの中身がどう書き換わってるかぐらい確認できるようにすればよかったなと少し後悔しました。

まとめ

最初はgit知らない人に教えるぞというモチベーションだけで始めた研究なので後半になるにつれ色々考えることが増えていって辛さは増していったけどとりあえず完成させて一応当初の目的は達成させられて良かったです。チュートリアルに関しては多分来年も使う可能性があるのでそれまでに今回の反省点を踏まえて改良できたらなと思います。一応研究を始めた当初はGUIでしか使えなかったgitが今ではターミナルでパパッとコマンド入力しながら使えるようになったのでそこらへんは個人的に成長できたところだと思います。とりあえず卒論が辛すぎる

ant-ivyでコンパイルする方法

どうも、玉田研のzakimotoです

今日のソフ工の様子をTwitterで見た感じant-ivyでのコンパイルができないってツイートが結構多かったのでとりあえずコンパイル方法を書いときます。

他のビルドツールbrewとかでインストールしてあとはREADME見てればでいけると思うんで頑張って下さい。

ivyのダウンロード

Home | Apache Ivy ™からbinaryをダウンロードし、中にivy-2.4.0.jar ファイルがあるのを確認して下さい

ivyのインストール

次にこのjar ファイルをant配下のlibサブディレクトリーにコピーします。jarファイルのあるディレクトリに移動し以下のコマンドを入力して下さい

cp ivy-2.4.0.jar /usr/bin/apache-ant-1.9.4/lib/ 

バージョンは各自の環境に合わせて変更して下さい

antでコンパイル

これでantすれば、コンパイルができるはずです

あとはantやmakeと同じようにargs4j parent - Args4jからjarファイルをダウンロードしてclock_ant-ivyの下に置いてclockのjarファイルを実行すればアナログ時計が表示されます

これで実行できるはずなので是非試して下さい

特別研究Ⅰのメモ

今学期の研究でやったこと
Javaバイトコードによる数式難読化



どんな難読化?
Javaバイトコードレベルで計算式の部分を難読化

基本的にプログラム上で数式はスタックを二つ積んでいって算術演算子で一つに合体していきながら計算していく。
1 2 + = 3
上は逆ポーランド記法で表したけど様はこれと同じ。1と2のスタックを積んで+という演算子で合体すると3という一つのスタックになる
なので今回僕はスタックを最初に全部積んでから算術演算子で計算していく難読化を考えた


ソースコード
HelloWorld.java

public class HelloWorld
{
	public static void main(String[] args) {
		
		int i = 10;
		int j = 20;
		int k = 40;
		int l = (i + j) * k;
		
		System.out.println(l);
     }
}


コンパイル

バイトコード
HelloWorld.class

public static void main(java.lang.String[]);
    Code:
       0: bipush        10
       2: istore_1
       3: bipush        20
       5: istore_2
       6: bipush        40
       8: istore_3
       9: iload_1
      10: iload_2
      11: iadd
      12: iload_3
      13: imul
      14: istore        4
      16: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      19: iload         4
      21: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      24: return

これの

       9: iload_1
      10: iload_2
      11: iadd
      12: iload_3
      13: imul

の部分を

       9: iload_3
      10: iload_1
      11: iload_2
      12: iadd
      13: imul

上のようにして算術演算子であるi_add(+)やi_mul(*)が数字の入ったスタック(iload~)より後ろに来るようにする。
これがめっちゃ長い数式だと元の数式が何だったのか考えるのがとても困難になるけど今回提案した前の方に数字の入ったスタックにして後ろの方に算術演算子で固めるようにすると難読化前と難読化後の出力結果が異なる数式もある
例えば
(10+ 20) * (40 + 50)
上のような計算を逆ポーランド記法にすると
10 20 + 40 50 + *
こんな感じになるけどこれを
10 20 40 50|++*
こういうふうに数字と算術演算子を前後ろで分けて絶対数字の前に算術演算子来ない条件で計算するとどんだけ数字と演算子の順番変えても(10+20)*(40+50)と同じ計算結果にはならん

今回の研究で上のような数式も提案した難読化手法でできるようにしたかったけど結局できたのは上記のバイトコード(HelloWorld.class)のみ

改善策としては難読化前の出力結果を記憶しておいて難読化対象のバイトコードのみ前後ろに分けたりできたらどんな数式も難読化できそうやけど今のとこ実装方法が思いつかん

どんな数式にも自動で難読化できるようになるのが今後の課題

デコンパイリングJava ―逆解析技術とコードの難読化 (Art Of Reversing)

デコンパイリングJava ―逆解析技術とコードの難読化 (Art Of Reversing)

昨晩KADOKAWA×dwangoのKindleセールでお祭りだったお話

こんにちわ

 

なんか昨日の夜windows10とかいうなんか一つヴァージョンを吹っ飛ばしたOSが発表されたっぽいですね

 

 

いつもならこっちらへんで色々調べてたんですが同時刻にKADOKAWA関連書籍のkindleがエラい事になってるとTLで見たので見に行ったらエラい事になってました。

KODAKAWA関連電子書籍285円祭り

KADOKAWA×dwangoの統合キャンペーンでKingleストアで「カドカワ祭り」というをやっていたのですがその値引き価格がほとんど90%OFFというだいぶヤバい感じになってました。細かく言うと2000円以上のKindleストアで出てる商品でセールで285円になってる商品を買うと90%OFFになります。

 

今回がこれまでのkindleの値引きセールと違うのはほとんどの書籍が285円均一になっているという点です。普通は50~60%OFFで1600円の電子書籍とかでも800円くらいになるんですが今回は560円の電子コミックも3000円の技術書や画集も文庫本15巻セットとかも全部285円になっててだいぶ異常な感じでした。

 

f:id:takehanogi11:20141001112141p:plain

 

とりあえず昨晩TLに流れてたのいくつかまとめます

 

 

 

 

 

 

 

 

 

 

 

大体ここら辺のツイートのやつが全部285円になってて他にもあるけど下の記事とかにまとめられてます。ちなみに今回のセールで一番アドバンテージが取れたのはファミ通ゲーム白書で修正された現在は14000円になってるからこれ買うだけで13715円お得な感じだった。セール外で考えたらもっとだけど。ちなみに僕はNode.jsの本とAndroidプログラミング入門と言の葉の庭買いました。朝見たら3000円くらい得してた。あとGosickとかは全巻読んでたから買わなかったけど魔女の宅急便6巻セットとか買えばよかったなーと少し後悔しました。

 

 

 

 

急げ!カドカワ祭り中のKindle書籍に値段間違いが大量発生。最大の釣果をあげる検索キーワードとは

 

11時現在のAmazonkindleストアに並んでる有料Top20はほとんど昨日の時点で285円だったものばっかりだから明日には多分ごっそり入れ替わると思う。下で確認出来る

 


Amazon.co.jp ベストセラー: Kindle本 の中で最も人気のある商品です

 

ちなみに285円になってたのは今日の深夜2時頃から朝の5~6時までですでにほとんど値段修正されてます

 

改訂後も値段が変わってない電子書籍

 今回朝になっても値段が変わらなかったのは主にKADOKAWAコミックスでここらへんは215~285円のままになってた。昨日のセール乗り遅れたくやしーという人はここらへん買えば大丈夫だと思う

 

デンキ街の本屋さん 1 (コミックフラッパー)
 

 

 

のんのんびより 1 (コミックアライブ)

のんのんびより 1 (コミックアライブ)

 

 

 

 

 

 

普通にここらへんは僕も読んで面白かった作品なのでおすすめ。デンキ街の本屋さんとか10月にアニメ化するしいいかも。あと艦これ関連も200円くらいで安くなってたので読んで面白かったの適当にのせます

 

艦隊これくしょん‐艦これ‐side:金剛(1) (角川コミックス・エース)

艦隊これくしょん‐艦これ‐side:金剛(1) (角川コミックス・エース)

 

 

 

 

 

 

これまでの価格ミスとの大きな違い

Amazonは以前にもフィギュアとかで価格ミスして1万以上する美少女フィギュアとかを980円とかで販売してたけどそのときは予約商品だったからあとでキャンセルメールを出せばとりあえず問題なかった

 


Amazon価格間違いでフィギュアを特価販売中!!なおキャンセルされる模様【追記】|fig速

 

けど今回みたいに買ってダウンロードする系は 購入するとすぐKindleに入るから商品を返せとも言えないし完全に買ったもの勝ちみたいな感じだった。今回の件で誰が責任とるのかはわからないけど間違いなくKindleFireとかの売り上げは上がるだろうなーと思った