なおすけの落書き帳

毎日がエブリデイ。

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コード簡易サンプル

Sambaの移行で手間取った話

Sambaの移行で手間取った話

CentOS7がリリースされてしばらくたちました。 ちょっと試しに使ってみたのですが、「これなんてFedora」という感想を抱かざるをえませんでした。

まあそんなことはどうでもいいですね

タイトルの話

某所でサーバを数台管理しています。 で、そこのサーバはCentOS5.6が動いていました。 さすがにハードウェアスペックの問題とか、バージョン的な問題とかがいろいろあったので、リプレイスすることになりました。 ちなみにOSはCentOS6.5に変わります。 皆さんご存知の通り、CentOS5系列とCentOS6系列だと色々と変わっています。 ええ、そこで思っきりこけましたApache HTTPDとか、そのへんはまあそんなに困りませんでしたが…。 タイトルに書いてる通り、Sambaで思いっきりこけました。 ちょっとめんどくさかったのでメモ。

Sambaとは

Sambaは、マイクロソフトのWindowsネットワークを実装したフリーソフトウェア。
Linux、Solaris、BSD、Mac OS XなどのUnix系OS を用いて、
Windows のファイルサーバやプリントサービス、ドメインコントローラ機能、ドメイン参加機能を提供する。

出典:Wikipedia

まあ、要するにWindowsでも使えるようなファイルサーバとその他もろもろの機能を持ったすごいやつということですね()。

CentOS5.xではSamba3.0.33がデフォルトで入ってるみたいですね。 CentOS6.xではSamba3.6.9が入ってるようです。

うちのサーバの話

旧サーバの設定ファイルは、2.xをベースに作られていました。 でも、新サーバのSambaは3.6…。 これが何を意味してるのかというと、まあお察しの通り、正しく動きませんでした。

問題発生

作業内容

旧サーバから新サーバに、とりあえずSambaの設定ファイルをすべてコピー。 具体的には/etc/samba/以下をまるっとコピーしました。 で、smb.confに権限の設定や、ディレクトリマスクの設定などを書き写しました。 設定が書き終わったら、

# /etc/init.d/smb configtest
# /etc/init.d/smb start

これで問題なくsmbが起動しました。

ところがどっこい

ええ、ログインできなくなりました まあ、原因はあれですね。認証方法ですね。 Sambaさん、しばらくsmbpasswdを使ってたのに、tdbをつかって管理するようになったようで。 旧サーバはsmbpasswdを使っていたため、大変なことになりました。

解決策

ググったら一発でした。 tdbeditコマンドを使えばいいらしいです。 旧smbpasswdファイルをsmbpasswd.oldとします

# /etc/init.d/smb stop              # Sambaサービスの停止
# cd /var/lib/sammba/private
# mv passwd.tdb passwd.tdb.orig     # デフォルトファイルのバックアップ
# mv /etc/samba/smbpasswd smbpasswd # 旧ファイルの移動
# pdbedit -i smbpasswd:smbpasswd %
     -e tdbsum:smbpasswd.tdb        # smbpasswd形式をtdbsum形式に変換
# mv smbpasswd.tdb passwd.tdb       # 正しいものにリネーム
# /etc/init.d/smb start             # Sambaサービスの起動

これでログインできるかテストすると… できたー!

まとめ

よかった♡


参考文献
- Sambaの認証をsmbpasswdからtdbへ移行

Tomcatいれてnginxと連携してみた話

諸事情によりVPSのOSを再インストールしました。いい機会なので色々と前と環境を変えてみました。
OSはCentOS6.5のままですが、いろいろと変えました。

やりたいこと 前の環境 新しい環境
HTTPサーバ Apache Nginx
データベース PostgreSQL9.1 PostgreSQL9.3
Ruby Ruby2.0.0 Ruby2.1.3
git git2.0 git2.1

まあこんなかんじ。他にも変えたけど覚えてねえや。
今回は授業にもがっつり使えるようにするのが目標だったので、とりあえずRedmine入れたりしました。

タイトルの話

さっき書いたように、授業でも使えるようにしたいのですよ。
うちの学校の授業ではJavaサーブレットをいじるので、その環境を作ったって話。
あんまりJavaが好きじゃない勢としては苦痛ですがしゃーない。
手順はこんな感じです。

  1. Javaいれる
  2. Javaの設定する
  3. Tomcat入れる
  4. Tomcatの起動確認する
  5. Nginxと連携する

やってた中で一番苦痛だったのは1と2でした()

作業

Javaいれる

とりあえず困ったらyum使えばいいという風潮

# yum search openjdk       
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile

 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
====== N/S Matched: openjdk =======
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
icedtea-web.x86_64 : Additional Java components for OpenJDK - Java browser plug-in and Web Start implementation
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle

Java 7がこの中だと新しいので、java-1.7...を入れましょう。
ランタイムだけでもいいんだけど、開発もしたいのでjava-1.7.0-openjdk-develも入れましょう。

# yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

終わったら確認

# java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
# javac -version
javac 1.7.0_65

できたー゚+.(ノ*・ω・)ノ *

Javaの設定

JAVA_HOMEなどという環境変数を設定しないといけないらしい。ほんとめんどくさい。
とりあえず、Javaの場所を確認。

# readlink $(readlink $(which java))
/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

これを設定しましょう。だるいので全ユーザに対して当てます。

# echo "JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64" >> /etc/profile
# echo "export JAVA_HOME" >> /etc/profile

これで完了!

Tomcatのインストール

Tomcatいれますよー。アイコンが猫なのか虎なのかよくわからんですが、これってどっちなの。
とりあえずパッケージ落とします。

# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz

なんか、tomcatってどう使えばいいのかよくわからんので、適当にやってみます。

# tar xf apache-tomcat-7.0.56.tar.gz
# mv apache-tomcat-7.0.56.tar.gz /usr/local/tomcat
# useradd -s /sbin/nologin tomcat  # tomcatはsuで動かしたらアカンです
# chown -R tomcat /usr/local/tomcat

これで入ったらしい。

Tomcatの起動確認

とりあえず起動確認します。ポートはデフォルトで8080らしいです。

# sudo -u tomcat /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

スタートしたらしいのでアクセスしてみましょう。
iptablesとかSELinux使ってる場合はまあいろいろ適当に設定してください。

f:id:naosuke2dx:20141012222248p:plain

できたー゚+.(ノ*・ω・)ノ *

Nginxとの連携

まあNginxのリバースプロキシ使えばいいだけの話ですがね。
tomcat.confとか適当に名前つけて、設定を書いてやればいいと思います。

server {
  listen 80;
  server_name servlet.example.com;

  root /home/web/tomcat;

  access_log /var/log/nginx/tomcat_access.log;
  error_log /var/log/nginx/tomcat_error.log;

  location / {
    proxy_pass http://127.0.0.1:8080/;
  }

}

で、そのアドレスにつなげると

f:id:naosuke2dx:20141012222253p:plain

できたー゚+.(ノ*・ω・)ノ *

実際にサーブレットをかいてみる

とおもったけど、Exampleが用意されてますね。

# ln -s /usr/local/tomcat/webapps/examples/home/web/tomcat/

で、servlet.example.com/examplesにつなげると

f:id:naosuke2dx:20141012222259p:plain

できたー゚+.(ノ・ω・)ノ

まとめ

Javaはクソ


参考文献