コンパイラ〜つく〜ろ〜♪2番 JavaCCの導入

前回記事pokotyamu.hatenablog.com

今回は
「トークンの作成」に関する内容として
JavaCCについて、導入をしつつまとめていきます。

JavaCCとは

Javaベースのコンパイラコンパイラのこと。
コンパイラコンパイラとは、構文解析ルーチン字句解析ルーチンを作成するツールのこと。
つまり、コンパイラを作るために使うツールですね。

これらのルーチンを作成するツールとして有名なのが
yacc」や「lex」ですが、こちらを採用しなかったのは
生成するコードがJavaコードなので、C言語を混ぜずに進めるためという理由です。
拡張性とか考えたらyaccを使うほうがいいのかな?
その部分は自分の理解が足りていません。

今回から追加された、参考書籍はこちら

JavaCC―コンパイラ・コンパイラfor Java

JavaCC―コンパイラ・コンパイラfor Java

1.Macへの導入手順

導入に際して、こちらを参考にさせていただきました。qiita.com

JavaCCを管理しているサイトから直接ダウンロード可能です。
JavaCC Home

ダウンロード・展開が終了したら、以下コマンドを実行していきます。

$ cd Downloads/javacc-6.0
$ cp bin/lib/javacc.jar /usr/local/javacc/lib
$ sudo mkdir /usr/local/javacc/bin
$ sudo touch /usr/local/javacc/bin/javacc
$ sudo chmod u+x /usr/local/javacc/bin/javacc
$ ln -s /usr/local/javacc/bin/javacc /usr/local/bin/javacc

シェルにパスを追加
.zshrc

export PATH="/usr/local/javacc/bin/javacc” #追加

最後にスクリプトファイルの中身を追加して終了です。
/usr/local/bin/javacc

cmd_path="$(readlink -n $0)"
javacc_root="$(dirname "$(dirname "$cmd_path")")"

CLASSPATH="$javacc_root/lib/javacc.jar"
export CLASSPATH

java javacc "$@"

2.開発環境の構築のために

私のJava関係の開発環境は、主にNetbeansもしくは、Emacsを使っているので
それぞれの開発環境を整えていきます。
まずは、NetBeansJavaCCプラグインplugins.netbeans.org

そして、Emacsjavacc-modeを入れたGitHubのコミットを載せておきます。github.com

以上で、JavaCCの開発環境が整いましたが、
次回はJavaCCでコードを書かずに、
今回読み込ませるコードをBNF記法で定義していく作業を行っていきたいと思います。

コンパイラ〜つく〜ろ〜♪1番全体の構成

オレオレ言語のコンパイラ作ることになったので、
せっかくなら勉強しながら学んでいくスタイル

これをKindleで買って、読み進めながらやっていきます。

今日のテーマはコンパイラの全体構成の話。
これから勉強を進めていく毎に、これらの詳細化が出来ればと思っています。

コンパイラの構成

コンパイラの全体構成図は次のようになっています。
f:id:pokotyamu:20150512003546p:plain:w300
それぞれについて少しだけ説明すると、

1.字句解析

ソースコードを最小の構成単位(トークン)に分割する。
字句の例としては
 キーワード:int for while
 識別子:変数名、関数名
 定数:100等
 文字列リテラル:”abcd"
 演算子:+ - / < =
 区切り子:[ ] { } ( )

2.構文解析

トークンの順序の正しさを判定するため構文木を作成する。

i = a + b * c;

というコードに対して構文木を書くと以下のようになる
f:id:pokotyamu:20150512003216p:plain:w300
これによって、ある程度の型のチェックすることで最適化を行う。

3.中間コード

構文木をソースプログラムの中間言語表現に変換する。
代表的な変換としては
上の式を

 T1 = b * c;
 i = a + T1;

とすることで、2項演算子のみにする等がある。
これについては理解が追いついていないので後日。

4.最適化

実行速度の面から改善するために、無駄な要素を見つけ出し、対処する。
・同じ変数値を何度も読み込んでいる
 →レジスタに1回読み込んで維持しておく
・ループ内で結果が一定である式が存在する
 →ループ外に出す処理をする
ここについても、もう少し進めていって勉強。

5.コード生成

中間コードは内部表現なので、中間コードが終わりではなく、
そこから目的のプログラムコードを作成する。
コードの生成結果は通常ファイルである。
目的のプログラムがアセンブラ言語ファイルである場合は、
それをさらに機械語に変換することで実行可能ファイルが生成される。

次回は、実際にトークンの作成のコードを作ってみようと思います。

就活終わった私の逆求人という就活スタイル

関東での就職決まりました!!

というわけで、今回は、
就活に使ったイベント逆求人について紹介していこうかと!
今後使う人、使おうか迷っている人、存在知らなかった人の役に立てば幸いです(o_ _)o

サポーターズなどなど色々あるそうですが
私は、GSTYLUSの逆求人フェスティバルのみに参加しました(累計3回)www.studenthunting.com

以下は全てIT逆求人に限った話です。他の総合職等は知らない(´ω`)

自分が参加した逆求人

2014年05月:インターンシップ
2014年10月:内定向け
2015年01月:内定向け(プレミア)
全て東京開催(今年は関西開催もあるらしい)

1.逆求人とは?

普通の企業セミナーの企業が持っているブースを
学生が持って、30分間で企業側と1対1で話す就活イベント
企業によって時間配分は違うが主な流れとしては

  1. 自分の自己紹介(プレゼン)
  2. 自己紹介に対するフィードバック←ここ重要
  3. 企業の紹介

これを朝から晩まで8ターム繰り返す形でした。*1*2
内定直結という形ではなく、
人事面接パスであったり、ESが免除になったりします。
面接の時に使われるのも履歴書じゃなくて
逆求人の時に書いたプロフィールが使ってたり(´ω`)
コネクションを作るというのが目的な感じですね。

2.逆求人のメリット

B2B,B2Cどちらの企業も参加している

業界は絞ってるけど、色々見たい人にはおすすめ
B2Bならこんなことしたい
・B2Cならこんなことしたい
ということをまとめているとよい。

自分のポートフォリオを評価してもらえる

履歴書や人事面接以上に話すことができるので
自分の人物像を知ってもらいやすい
私もホークスの話題で盛り上がる時があった。

特に決まった志望動機を持たなくていい

普通の面接では、志望動機を聞かれることがあるが
逆になぜ自分に興味を持ってくれたのか?等を聞くことが出来る。
それによって、今後の就活に役立てることも聞けたりする。

マッチしない企業のフィードバックが聞ける

通称お祈りメールでは、なんで落とされたかが分からない等の問題はありますが
このイベントでは、「もっとこうすると良い」や「ここはもっと固めよう」等の
アドバイスを直接貰うことが出来るため次に繋げやすい。
また、イベント終了後に通知表のようなものも送られるので、客観評価も出来る。

メンターの手厚いサポート

就活生につき1人のメンターが付くので
基本的にそこに相談しとけば放置されることはない。
なお、逆求人の相談だけでなく、面接の相談や内定承諾の相談も出来る
面談はSkypeオッケー(雑談オッケー)

リクルートスーツ着なくていい

自分らしい格好で行ける
スーツでもいいけど、企業側も着てない人が多い印象
わざわざこのためにスーツを用意する!的な感じはしなくていい。

交通費出る(遠方のみ一部支給)

値段は言えないけど、お金もらいながら就活出来るのはありがたい。
ただし、全額支給ではないので、あまり当てにし過ぎると高くつく。

3.逆求人のデメリット(向いてない人)

ポートフォリオがないと話すことがない

ギークな人、面白い研究をしてる人のブースと
それらを上手く伝えきれていない人のブースはやっぱ埋まり方が違うと感じた。

自分の就活の軸が決まってないといろんな企業がいるのでブレる

そらそうよね。
企業が色々入る分、自分の軸が無いと目移りしてしまう可能性が大いにある。
私自身、これがブレていた時はあまり良い結果が出なかった。

複数回出ると、来る企業の中で何回か見たことがあるとこもある

その時に話せる人が人事だったり、エンジニアだったりするので
企業の幅が広がらないという意味でデメリットかどうかは本人次第。

大手しか考えていない人

自分が行った時はベンチャーが多かったので
絶対大手!という人には向かないのかなと思う。
けど、決めるにしても一回見ておくという経験も悪くはないかと。
何社かは大きなところも来ていたし、プレミアの時はそれ以上に来ていた
印象もあるので、一回メンターさんと相談してみるてもいいと思う。

4.これから逆求人をやる人向け

良くも悪くも30分しか話せない

後日に企業訪問のアポまで取れる方がいい(特に地方学生
私は、1週間程度泊まって、会社訪問してました。
就活にはお金がかかるもの。しかし、会社訪問や面接を前々から組んでいれば
交通費が出る企業もあるので、そこは交渉しだいな気もする。

プレゼン資料はしっかりと作りこむ

プレゼンとそこからの話の持って行き方で80%ぐらいの印象は決まるので
どんな戦略で自分をアピールするかを考えるといい。

成果物のデモ

実際に動いているものでやると説明力が増すので、話しやすいと思う。
逆求人に向けてアプリを作るというのもあってもいいかと。

5.終わりに

私自身、面接に進む企業や就職先を決めるときに
「誰と働いてみたいか?」ということを意識しました。
就職すればそこには人が絡んでくるわけで、どうせ働くなら楽しく働きたいですよね。
17卒のインターン用の逆求人が5月に関西、関東どちらも開催予定なので
人と話しながら企業のことを知れるこのイベントに少しでも興味が出たならエントリーしてみるのもいいかと思います。

〜以上〜

*1:エクストラある人もいた

*2:自分の時には8タームだったけど、他の時には違う可能性もある?詳しくはメンターへ

研究室のサーバーでGitlabを立てるまで

今回は最近個人的に勉強してるサーバー関係の本番
研究室で眠っているサーバーを使ってローカルなGithubサーバであるGitlabを立ててみた。
その時のまとめ

スペック等

研究室のサーバは
HP ProLiant ML110 G7

Amazon.co.jp: HP ML110 G7 OSレスモデル 6473360-AHZN: パソコン・周辺機器


メモリ 6GB
細かい性能はわかりません。

OS:Debian 7.0
を使用

まずは、ブート用のCD作り

Debian -- Network install from a minimal CD

ここからブート用のCDを作ったのだが、ここで大きな落とし穴
アーキテクチャの選択を
amd64ではなく、i386してしまったため
Gitlab導入時にアーキテクチャエラーが発生
これによって、サーバを一度初期化し、作りなおすはめになった。

基本的な下準備

Gitlabはrubyを使用するので

Debian上で、smalrubyを動かしてみた(Debian+RVM) - pokotyamu的なあうとぷっと
ここらへんの環境設定を行った上で進める。

Gitlabの実装

ここからが本題
Gitlabの基本的なインストールについては
GitLab | Omnibus package downloads for GitLab CE

公式ドキュメントの手順どおりに行う。
Gitlabはnginxも必要なのでapt-getを忘れないようにする。

しかし、最後のDBを作成する
$sudo gitlab-ctl reconfigure
で以下のようなエラーが発生

URLが正しくないですよという内容のはず。
これの通りに

# /etc/gitlab/gitlab.rb
# Check and change the external_url to the address your users will type in their browser
#external_url 'kklabadmin.kklab.jp'
external_url 'http://gitlab.com'

のように変更
これで解決!

とおもいきや、
hostnameでアクセスしても実行されない。
原因はよく分からないが
Apache2をストップさせると

f:id:pokotyamu:20141218033153p:plain
動きました!

恐らく、アドレスが被ってたりするのかな?

ここから先の設定についてはGithubと同じなので簡略に

  • rootのアカウントでユーザアカウント作成
  • ユーザーアカウントから新規プロジェクトの作成
  • git config 系の設定を行う
  • ssh公開鍵を登録
  • プロジェクトの手順に沿ってremote登録

おわりに

これで研究室にGitlabが立ったので、快適になるはず。
※みんなへの実装はまだできていない模様。

あと、Gitlabのチューニングも少し行っていく必要がある。
少し大きめのデータをpushした際、502で落ちた。
これについては、原因を追求、改善次第またまとめの記事に起こす。

参考にした記事


GitHubクローンのGitLabを5分でインストールした - アルパカDiary

Debian上で、smalrubyを動かしてみた(Debian+RVM)

前回の続き

Debian+Vagrant 環境を整えた - pokotyamu的なあうとぷっと

初期設定

とりあえず、私の環境を整えるために
zshとoh-my-zshを入れる

$apt-get install git
これでgitのインストール完了

$git config --global user.name <name>
$git config --global user.email <mail address>
基本設定なので説明は省略
$git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

ここでタイムアウトするエラーが発生

$git config --global url."https://".insteadOf git://
これによって、gitアドレスもhttps://と同じように使える

これで、基本的な設定は終了。

Rails 入れていきます

今回はRVMを使用しました。
RVM: Ruby Version Manager - RVM Ruby Version Manager - Documentation
installのやり方はチュートリアル通りに進めました。

$\curl -L https://get.rvm.io | bash -s stable --rails
$source ~/.rvm/scripts/rvm
rvm 1.26.3 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

このように出ればオッケ!

次にrubyrailsの設定

$rvm list known
使えるrubyのバージョン一覧が表示されます
$rvm install 2.0.0
$rvm gemset create 20rails40
$rvm gemset use 20rails40
$gem install rails -v '4.0.0'

rvmではrubyのバージョン毎に
gemsetという単位でrailsのバージョンを管理します。
そのためこのようにgemsetの名前でバージョンがわかるといいらしい。
以上で、RubyRailsの環境が整いました。
私は、

$ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
$rails -v
Rails 4.0.3

このような環境でこれから作業をしていきます。

次回はsmalruby入れるよー

Debian+Vagrant 環境を整えた

smalrubyのコードを読む会をしたくて
動かすための実行環境を整えたのでそのメモ書き

まずは仮想環境の構築から〜
今回は、Vagrantを使用してDebian系を入れていきます

Vagrant*1
f:id:pokotyamu:20140715174111p:plain

開発環境構築ツールですね(´ω`)

$vagrant add <name> <url>

登録するテンプレートを追加
boxというテンプレートを
A list of base boxes for Vagrant - Vagrantbox.es*2
このサイトからダウンロードしてくる
今回はDebian系を入れたので

$vagrant box add Debian https://github.com/jose-lpa/packer-debian_7.6.0/releases/download/1.0/packer_virtualbox-iso_virtualbox.box
$vagrant box list 

boxのリストが見れる(現在登録されているテンプレート)

$vagrant box list
Debian      (virtualbox, 0)

となればおけ

$vagrant init <name>

リストの中身からテンプレートとして使用するboxを選ぶ

$ls
Vagrantfile

があればおけ

この時、後々のことも考えて
Vagrantfileの中身をいじります

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
###追加分
 config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
  end
###
end

これにより、networkのipアドレスを設定します。
後々、railsサーバ立てるときにここでつまりました。

$vagrant up 
起動

$vagrant ssh
ssh接続

こんな感じで、Debian系の仮想環境作りました。
次回はrails入れていきますー

*1:[リンク:Vagrant]

*2:有志のサイトなので、自己責任で

2社行ったインターンシップから学べたこと:考え方

帰りの飛行機の中で,今回のインターンシップを振り返る。
技術に関する話しはまた後日。
この記事では,自分が感じた働き方や,
人生の考え方がまとめられるといいなと思ってます。
この記事で主に書いているのは2社目のフィードフォースのインターンシップだが
1社目のアクロクエストで学べたことがあったからこその充実だと思っている。
1社目に関してはFB参照。

1.年上が空気感を作る

今回のインターンシップは最年長が私で今年23歳
最年少は17歳の高専生ととても幅のある感じだった。
初日から「あだ名を付ける」や飲み会をする(もちろん未成年はコーラ)等
積極的に年上からコミュニケーションを取れる場を作れたことも
今回のインターンシップで意識出来た。
それゆえ、期間中での会話も多かったし
心地よい空気感で開発出来たと思う。

2.ベンチャーで働く心構え

今日の自分と明日の自分を比較した時に
いかに成長出来ているか?パフォーマンスが上がっているか?
を考えるかというのが大事だと感じた。
それは、常に前を向き続き自分の夢や会社の夢に対して
毎日一歩でも前進する必要があるからだ。
会社で、K(keep:良かったこと)P(problem:問題)T(Try:挑戦,改善策)
という手法で一日の振り返りを行っていた。
常に進み続けないと潰れてしまうベンチャー企業において
どのように明日に繫げて行くかを考えるというのは必須に思えた。
だから、ベンチャーで働く心構えとして、このマインドを持ちたい。

3.チームで何か活動するためには,止まることも必要

これは前回のインターンシップから,課題として感じた部分で
今回は,いかに止まるか?相手の意見を聞けるか?ということをテーマに考えた。
2週間で得た物としては
相手との呼吸をいかに合わせるか?というのを意識することで
自分の気持ちもコントロール出来るものである。

Railsが初挑戦の人とペアで2週間開発をしていたが
彼の分からないところを聞いて解決するまで待ってみることをやった。

結果として,ハッカソンのコンテストに優勝出来たのは
1人で1.5の仕事をするより,2人で1づつの仕事をして
合計で2になってる方がより良いものが作れたからだろう。


今回のインターンシップで見つかった改善点

没頭すると周りが見れなくなる

開発系のインターンシップということもあり
コードを書いている時等
それに対して没頭してしまい。
ペアのサポートが出来ていない場面があった。
あらかじめ時間を決めておくことや
ペアプロすること等を強制しておいた方がいい場面もある。


ーーーー
2つのインターンシップに共通して、
ベンチャーで少数でやっているからこそ、アットホームな感じで仕事しており
文字通り会社は家族であるということが空気感で伝わってきた。

今回出会えたインターンシップ生は
全て自分の成長に繋がる出会いだったと思う。
インターンシップを開いて頂いた会社、社員さんに感謝はもちろんだが
同じインターンシップをやりきった、インターンシップ生にも感謝したい。


そして、お互いに今後の活動も見続けれたら
お互いハッピーだと思う。


これも何かの縁。つながりは大切にしたい。
福岡なのか。関東なのか。今の環境と自分の将来。
色々考えることは多い。けど、楽しい。
これから頑張ろう!

f:id:pokotyamu:20140830145656j:plainf:id:pokotyamu:20140830145559j:plain