某氏から、プレゼントをもらいました。
買わないとと言いつつ買ってなかったルームウェアとサンダルです。
感謝感謝。
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とは、Appcelerator社が提供している、JavaScriptでiOS/Android/BlackBerryのネイティブアプリを開発することができる開発環境です。
プラットフォーム別に言語をわけて書く必要がなく、また、Webアプリケーション開発でおなじみな言語ということで、CEM、GMV、ETR関係なくモバイルアプリケーションが開発できるというわけです。
あ、ただしアプリのビルドにSDKが必要なので、WindowsではiOSの開発はできないです。怒るならAppleを怒ってくれ。俺は悪くない。
どんなことできるの
基本的に、Objective-C
やJava
で開発されたアプリができる処理のほとんどが実装できます。
具体的には
などなど。とても便利。
ただし、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();
これを実行すると、
こんなかんじにアプリが実行されます。
ちなみに、Appcelerator社が公式にKitchenSinkというサンプルアプリケーションが公開しています。
基本的な機能は実装されているので、これを見るとだいたいの問題が解決します。
上級編
CoffeeScriptを使った開発も当然可能です。
Rubyとか使っている人にはこっちのほうが馴染みやすいと思います。
あと、IDEを使わず、コマンドラインで開発をすることも出来ます。詳しくはググってください。
まとめ
モバイルアプリケーションも楽しいですよ。
で、明日は誰が書くの()
参考文献
- Titanium mobile (公式)
- Titaniumの基本を学ぶ、JavaScriptだけのクラシックスタイルでTODOアプリを開発しよう (type IT Academy)
- 初心者でも2週間でiPhoneアプリが作れちゃうTitanium Mobileがすごい件 (infinite loop)
SLP KBIT AdventCalendar2014 @3日目
なんこれ
この記事はSLP KBIT AdventCalendar2014 3日目の記事です。 何書こうか悩みながら書いてます。
まえがき
ネタが思い浮かばないんで1年生置いてきぼりな記事書いてます。
スマソ
本題
何について書こうか考えた結果、いろいろな脆弱性について書こうと思います。
まあ、XSS、SQLインジェクションとかその辺程度。
脆弱性
脆弱性って言葉、多分皆さん聞いたことがあると思います。
意味を調べるとこんなことが書いてありました。
一般的には「脆くて弱い性質または性格」のことをさす。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プログラムです。
で、この入力にこんな文字列を入れてみると…
<script>alert('XSS');</script>
こんなふうにスクリプトが実行されてしまいます。
value移行の、<?php ~~~ ?>
で、入力を表示させていますが、ここに入力した<script>~</script>
が埋め込まれているわけですね。
<script>
タグって、JavaScriptのアレですよね。
JavaScriptって意外となんでも出来て、掲示板のリンクになんか仕込んでやると、セッションハイジャックやパスワードの流出などが割りとできちゃうわけです。
ね、怖いでしょ。
対策法
タグに使われる<
や>
などを<
や>
に置換するって方法があります。
他には、タグの属性値を"~"
で囲むなど、そういう方法が必要です。
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と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使ってる場合はまあいろいろ適当に設定してください。
できたー゚+.(ノ*・ω・)ノ *
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/; } }
で、そのアドレスにつなげると
できたー゚+.(ノ*・ω・)ノ *
実際にサーブレットをかいてみる
とおもったけど、Exampleが用意されてますね。
# ln -s /usr/local/tomcat/webapps/examples/home/web/tomcat/
で、servlet.example.com/examples
につなげると
できたー゚+.(ノ・ω・)ノ
まとめ
Javaはクソ
参考文献