なおすけの落書き帳

毎日がエブリデイ。

Scalaですから

こんばんは。なおすけです。 台風が沖縄に大集合らしいですね。
12日から14日までは東京出張なので、台風が来ないことを祈るばかりです。

冷やしScala始めました。

研究はJavaを使ったアプリケーションを扱っています。
正確には、Javaを使ったアプリケーション"も"扱っているという感じですが。
2005年にプロトタイプが作られて、そこから10年間、諸先輩方が開発を継続していった秘伝のアプリケーションです。
さすがに一回綺麗にリファクタリングをした方がいいかと思いました。
あと、最近プログラム書くことから離れてたので、リハビリもしないとなという感じだったので…

というわけで、ちょっと気になってたScalaを使って書きなおして見ようと思いました。
作るべきものが明確なので、途中で投げ出しそうにないしいいですね。

で、Scalaってなんぞ

Scalaとは、JVM上で動作するマルチパラダイムの言語です。
オブジェクト指向の特徴と、関数型の特徴を統合しているらしい。
現在のバージョンは2.11.6だそうで。

特徴としては、

  • 開発生産性を高める簡潔な表記
  • Javaのライブラリをインポートして使用可能
  • 静的型付を行う関数型言語のため、型関連のエラー検出が容易
  • 型推論があるため、自動的に型を補完してくれる
  • XMLを直接プログラム内部に記述可能

(´・∀・`)ヘー

実務としては、Twitterがバックエンドを2009年にRubyからScalaに移行したり、 FoursquareScalaとLiftフレームワークを利用してたり、LinkedInも使ってたり、それなりに利用されてるらしいです。

そもそもなんでJavaからScalaにしようと思ったの

  • Scalaが気になってた
  • Javaに比べて読みやすいし書きやすい
  • そもそもJavaを書きたくない
  • XMLをゴニョゴニョできる

この4つが適当な割合をもって並んでいます。

Scalaを少し使った感想

Javaっぽい書き方しかまだ出来てないですが、Javaに比べてやっぱり書きやすいし読みやすいです。
例えば、配列の走査について、Javaだと

int[] array = new int[] { 1, 2, 3, 4, 5 }

// 添字を利用したループ
for ( int i = 0; i < array.length; i++ ) {
  System.out.println(a[i]);
}

// 要素を直接取り出すループ
for ( int e : a ) {
  System.out.println(a[i]);
}

みたいなのが、Scalaだと

var array = Array(1, 2, 3)

// 添字を利用したループ(Scalaは非推奨)
for ( i <- 0 until a.length ) {
  println(array(i))
}

// 要素を直接取り出すループ
for ( e <- array ) {
  println(e)
}

// 要素を直接取り出すループ(こっちでも可)
array.foreach(println)

みたいな感じ。割と個人的には読みやすかったです。

今後の展望

Javaっぽい書き方で、とりあえず既存のシステムを書き直そうと思ってます。
その後、再度リファクタリングもかねて関数型っぽく書いてみようかなと思います。
その前に関数型の勉強でHaskelやりそうだなあとふと思いました。

その他

こないだ誕生日でしたので例のアレお願いします。


6月の総括

2015年06月総括

週に1回はまともに記事を書いていきたいと思います。なおすけです。おはようございます。
月ごとの総括書いてる人がいたので、自分も書いてみようかな、と思いました。
これがいつまで続くかはわかりませんが…w

今月のメニュー

〜10日

  • 某学会論文執筆

18〜21日

26日

27〜30日

  • 院試(死)勉強

所感

先月ほどではないが、今月も前半までは忙しくてずっと走り回っていた感じ。
スケジュールに落ち着きがほしいなと思います。

学業/研究活動

論文執筆が大変でした。
研究で開発しているシステムに新機能を乗せる内容で、どういう機能がいいかという話を顧客(担当教官)と執筆前に話し合って、これが激アツだったです。
まあ、これで卒論の方向性などが大体決まったので、あとは9ヶ月後くらいのゴール向かって実装評価していくだけです。(これが大変なんだけどね)

院試の勉強も周りより少し遅目ですが始めました。やってるとそれなりに記憶が戻ってくるので、復習大事だなと思いました。
あと、過去の授業資料を残してないのが痛かったです。後輩各位は気をつけてください。

お仕事/作業

今月はだいぶ楽でした。先月がかなりきつかったんですが。
東京出張と書いてますが、特に作業があったわけではなくて、あっちの会社の方との会議がメインでした。

趣味

東京出張の土はオケのコンサートでした。
オケでやってた曲はシューマンの1番とリムスキー=コルサコフのシェヘラザード。まあ有名どころでしたがよかったです。
日曜も、のんびりブラブラと。行きたかったアニメの聖地も行けて、いいリフレッシュになりました。

それ以外の趣味はそんなにしてないかな。最近話題になってるイカのゲームはハードウェアが無いので買えないし。
8月末にDQ83DS版が出るし、それは買おうと思ってます。

あ、アニメですが、今期は4つくらいみてました。きんモザ終わって難民になりかけました。
響けユーフォニアム? 古傷をえぐられてる気分になるので見てません。

その他

最近、某提督業に復業しました。作業の合間にぽちぽちやってます。

総括

院試で爆死しそうで怖い。

そういえば、例のアレ晒しておきますね。

ICPC2015国内オンライン予選

ACM-ICPC 2015年度国内予選参加記

お久しぶりですなおすけです。
記事のドラフトはいっぱいあるのに完成させてません。
月に1回東京に行っていて、アニメの聖地を巡っているので、写真がいっぱいあります。
例のごとく、そのうち記事書きます。3割くらいしか下書きしてないけど。

ACM-ICPC 2015年度国内予選

というわけで、今日(昨日)参加しました。
結果は3問完答で372チーム中119位。まあまあだった感じがあります。
ちなみに去年は1問完答で326チーム中199位。結構上がってますね。
サークル内では2位でした。なんとか部長の面目を保つ事が出来ました(汗)
以下、雑感などをつらつらと。
ただ、解答内容を書いていいのかわからないので、その辺は伏せておきます。

チーム構成と問題の進め方

チームは後輩2人(学部3年)と組んでました。
A問題は後輩にまかせて、自分はB問題を紙に解いていました。
後輩はA問題を30分から40分くらいで解き終わって、自分にバトンタッチ。
自分はB問題を40分くらいで解きました。
自分がB問題を解いている間は、後輩はC問題の問題を読んだりして待機。
1時間ちょっと経過した頃から、C問題に取り組み始めた感じ。
C問題は後輩と協力しながらカチャカチャと。
途中1回、解答コードの全消しをしましたが、終了5分前に何とか解答成功。

後から後輩と話したのですが、お互いに任せた部分に関しては、実装に関することは一切なにも言わなかったのが良かったのかなと。
自己主張をする(そういう意味では)とがった人たちが多いサークルなので、珍しい展開じゃないのかな、と勝手に思ってマス。

問題構成

例年、7問の出題だったのですが、今年はなぜか8問でした。
ICPCはもともと1問は全チーム解けるように問題が作られているらしいですが、 色々と見ていると、2014年度の予選は1問目が難しかった、とかレビューが有りました。

その影響もあったのか、今年のA問題は易化していた感じがあります(俺は解いてないけど)。
後輩も簡単だと言っていました。
B問題も結構簡単だったんじゃないかな、と解いてると思いました。
あんまり言ってるといっぱい解いた人に刺されそうな気がするのでこの辺でやめときます()

その他

最近論文を書くことが多くて、あんまりコードを書いてなかったのですが、何とかなって一安心です。
たまにはコードも書かないと、とは思ってます。
あと、来週には大学院の入試があるんですが、そっちの進捗がよろしくないです。やばい。


参考リンク

SLP KBIT AdventCalendar2014 @24日目

__________
    <○√
     ∥ 
     くく
しまった!今は性の6時間だ!
オレが止めているうちに耳を塞ぐんだ!
早く!早く!オレに構わずリア充から逃げろ!

なんこれ

この記事はSLP KBIT AdventCalendar2014 24日目の記事です。

Titaniumで過ごす聖なる夜

Titaniumとは、原子番号22、元素記号はTiの元素です。地球を構成する近くの成分として9番目に多い元素として有名ですね。
酸化物は非常に安定しており、空気中では不導態となるため、白金や金とほぼ同等の耐蝕性を持っています。

これを使って聖なる夜を過ごす方法について簡単に書きたいと思います。 アメリカンジョーク

冗談は置いといて

Titanium logo

Titaniumとは、Appcelerator社が提供している、JavaScriptiOS/Android/BlackBerryのネイティブアプリを開発することができる開発環境です。
プラットフォーム別に言語をわけて書く必要がなく、また、Webアプリケーション開発でおなじみな言語ということで、CEM、GMV、ETR関係なくモバイルアプリケーションが開発できるというわけです。
あ、ただしアプリのビルドにSDKが必要なので、WindowsではiOSの開発はできないです。怒るならAppleを怒ってくれ。俺は悪くない。

どんなことできるの

基本的に、Objective-CJavaで開発されたアプリができる処理のほとんどが実装できます。
具体的には

  • 加速度センサや電子コンパスの利用
  • 音声や動画の再生、録画、録音
  • HTTP通信
  • SQLiteによるデータベース管理

などなど。とても便利。 ただし、3Dゲームのようなものを開発するには余りむいていないです。
あと、メモリ管理の実装をすることが出来ないです。なので、デバイスの性能を100%使いたいという場合は、Titaniumは向いてないです。デバイスそれぞれ用にコード書いてください。

さんぷる

実際にはこんなかんじです。

/ this sets the background color of the master UIView (when there are no windows/tab groups on it)
Titanium.UI.setBackgroundColor('#000');
// create tab group
var tabGroup = Titanium.UI.createTabGroup();
//
// create base UI tab and root window
//
var win1 = Titanium.UI.createWindow({
    title:'Tab 1',
    backgroundColor:'#fff'
});
var tab1 = Titanium.UI.createTab({
    icon:'KS_nav_views.png',
    title:'Tab 1',
    window:win1
});
var label1 = Titanium.UI.createLabel({
    color:'#999',
    text:'I am Window 1',
    font:{fontSize:20,fontFamily:'Helvetica Neue'},
    textAlign:'center',
    width:'auto'
});
win1.add(label1);
//
// create controls tab and root window
//
var win2 = Titanium.UI.createWindow({
    title:'Tab 2',
    backgroundColor:'#fff'
});
var tab2 = Titanium.UI.createTab({
    icon:'KS_nav_ui.png',
    title:'Tab 2',
    window:win2
});
var label2 = Titanium.UI.createLabel({
    color:'#999',
    text:'I am Window 2',
    font:{fontSize:20,fontFamily:'Helvetica Neue'},
    textAlign:'center',
    width:'auto'
});
win2.add(label2);
//
//  add tabs
//
tabGroup.addTab(tab1);
tabGroup.addTab(tab2);
// open tab group
tabGroup.open();

これを実行すると、

http://www.infiniteloop.co.jp/blog/wp-content/uploads/2011/04/f69dfde284d3e845c8f7c50b4f3fbc8b-159x300.png

こんなかんじにアプリが実行されます。

ちなみに、Appcelerator社が公式にKitchenSinkというサンプルアプリケーションが公開しています。
基本的な機能は実装されているので、これを見るとだいたいの問題が解決します。

上級編

CoffeeScriptを使った開発も当然可能です。
Rubyとか使っている人にはこっちのほうが馴染みやすいと思います。
あと、IDEを使わず、コマンドラインで開発をすることも出来ます。詳しくはググってください。

まとめ

モバイルアプリケーションも楽しいですよ。
で、明日は誰が書くの()


参考文献

SLP KBIT AdventCalendar2014 @3日目

なんこれ

この記事はSLP KBIT AdventCalendar2014 3日目の記事です。 何書こうか悩みながら書いてます。

まえがき

ネタが思い浮かばないんで1年生置いてきぼりな記事書いてます。
スマソ

本題

何について書こうか考えた結果、いろいろな脆弱性について書こうと思います。
まあ、XSSSQLインジェクションとかその辺程度。

脆弱性

脆弱性って言葉、多分皆さん聞いたことがあると思います。
意味を調べるとこんなことが書いてありました。

一般的には「脆くて弱い性質または性格」のことをさす。vulnerability。
コンピュータ用語としては、現在では、コンピュータやソフトウェア、ネットワークなどが抱える保安上の弱点のことを指すことがほとんどであり、
正規の管理者や利用者など以外の第三者が保安上の脅威となる行為(システムの乗っ取りや機密情報の漏洩など)に
利用できる可能性のある欠陥や仕様上の問題点のこと。
新聞などでは「ぜい弱性」と表記されることもある。

はてなキーワード
まあこんなかんじです。

で、これが何

CGIとかかいてると、formタグをつかって入力を受け付けたり、SQLをつかってデータを色々格納したりすることがあると思います。
で、何も考えずにやってると痛い目見てしまうってのが今日の話。
まあ、何個か紹介しようと思います。

脆弱性のいろいろ

XSS

なんそれ

いきなりアルファベット3文字! 正式名称はクロスサイトスクリプティングといいます。
XSSとは、他人のWebサイトへ悪意のあるスクリプトを埋め込むことです。
「悪意のあるスクリプトを埋め込むってどういうこっちゃ」という感じですが…。

実際にやってみた

じゃあ、実例を示してみましょう。
あるPHPのプログラムを利用します。

<html>
<body>
    <form action="" method="post" accept-charset="utf-8">
        <input type="text" name="xss_text" value="">
        <p><input type="submit" value="submit"></p>
    </form>
    value: <?php echo $_POST['xss_text']; ?>
</body>
</html>

まあこれを表示するとこんな感じ。
入力をそのまま出力する簡単なPHPプログラムです。

f:id:naosuke2dx:20141203002738p:plain

で、この入力にこんな文字列を入れてみると… <script>alert('XSS');</script>

f:id:naosuke2dx:20141203002743p:plain

こんなふうにスクリプトが実行されてしまいます。 value移行の、<?php ~~~ ?>で、入力を表示させていますが、ここに入力した<script>~</script>が埋め込まれているわけですね。
<script>タグって、JavaScriptのアレですよね。
JavaScriptって意外となんでも出来て、掲示板のリンクになんか仕込んでやると、セッションハイジャックやパスワードの流出などが割りとできちゃうわけです。
ね、怖いでしょ。

対策法

タグに使われる<>などを&lt;&gt;に置換するって方法があります。
他には、タグの属性値を"~"で囲むなど、そういう方法が必要です。

SQLインジェクション

なんそれ

データベースの管理システムに、リレーショナルデータベース管理システム(RDBMS)というものがあります。
RDBMSにおいて、データの操作や定義を行う問い合わせ言語をSQLって言います。
SELECT * FROM table;みたいなこんなやつです。1年生わかるかな…。

で、SQLインジェクションとは、アプリケーションが想定していないSQL文を実行することによって、データベースを不正に操作する攻撃手法です。
SQLに別のSQLを注入(inject)されるため、SQLインジェクションって呼ばれます。
ちなみに、このSQLインジェクション、2011年4月から発生しているPlayStation Networkの個人情報漏洩の原因だったりします。

実際にやってみた

と思ったのですが、昔授業で作った脆弱性満載のPHPプログラムが見つからなかったので、口頭解説

例えば、フォームから受け取った値から、以下のSQL文を実行することを考えます。
SELECT * FROM users WHERE name = '(入力値)';
簡単な説明をすると、usersテーブルから、入力値に一致したユーザを表示するというSQL文です。
これは、WHERE以降のname = '(入力値)'がtrueのとき、ユーザが一致したというふうに認識します。

じゃあここで、入力値にt' OR 't' = 'tという入力値を与えてやるとどうなるでしょう…。
WHERE以降はこんなふうになります。
WHERE name = 't' OR 't' = 't';
さっき、WHERE以降がtrueのとき、ユーザが一致したという認識をする、と書きましたが、今回のSQL文はどうでしょう。
WHERE以降は常にtrueになってますね。
C風に書くと

if ( name == 't' || 't' == 't') {
  printf("%s\n", users);
}

みたいな。
まあifの条件式が常にtrueになっちゃってますね。
つまり、usersテーブルに格納されているすべてのデータが引っ張ってこれるわけですよ。
もしusersテーブルにパスワードとか住所とかが格納されていたら…どうなるでしょうね。

対策方法

まあ、文字のエスケープが一般的ですね。
他にはO/Rマッピングと呼ばれる方法をつかうのもひとつの手です。

紹介しないけど

などなど。気になる人は調べてください。

まとめ

脆弱性こわいから、アプリケーション書くときは気をつけましょう。


参考文献 - XSS脆弱性のあるPHPコード簡易サンプル