Windows 8をICONIA Tab W500にインストール

タイトルの通り、Windows 8をICONIA Tab W500にインストールした。これまでRelease Previewが入っていたが、別に大きな変化があったわけではない。ただインストールのメモ。

この世代のタブレットを持っていてこれからバリバリ使おうなんていう人も少ないだろうし、大雑把に。

とりあえずUSB DVDドライブにディスクを突っ込んで起動、インストーラーが起動するので指示に従ってインストール。強いて言えばパーティションで変なことしている人は悩むかもしれないがその悩みは自己解決できるもの(言っている意味がわからない場合はデフォルトでよい)。何かと入力するものがキーボードはあると何かと楽だが、なくてもインストールはできる模様。DVDブートに必要ならないと無理だが。めんどいし手元にキーボードがあったからBIOS画面に入ったが。

で、駆け足でインストール・設定する場合は

  • Windows 8のOSそのものをインストール
  • 加速度センサドライバ(Win8用が出ている)をインストール
  • Device Controlをインストール
  • Metroの方の個人設定で、キーボードをフルキーボード(ハードウェア準拠のキーボードとか書いてある)選択可能に
  • 同じく個人設定でソフトウェアキーで音が鳴らないように
  • 同じく個人設定で他のデバイスとの同期設定を好きなようにいじる
  • IE10の初仕事としてFirefoxをbingで検索・ダウンロードさせインストール(ぁ

あたりすればとりあえず使える。中二つは回転ロックスイッチを切った状態で傾けた時に縦横が切り替わるようにするためのもの。

むしろ戸惑うとしたら、Windows 8はログインがローカルログイン用のアカウントではなくMicrosoftアカウントとかいうやつでログインを勧められる点(詳しくはぐぐるとたくさん情報が出てくるが、パソコンそのものへログインするのにMicrosoftアカウントというMicrosoft側に認証サーバーがあるやつを使用するシステム。なお、こちらを選択するとまっさきに心配する「ネット繋がらなかったらどうすんの!?」だが、ネットが切れた場合は最後にログインした時のパスワードで構わないらしい)。MicrosoftアカウントでログインしないとMetro用のアプリがWindows Storeからインストールできない他、Microsoftアカウントでログインすると設定の同期とかアカウントの統合とか色々使えるらしい。詳しくは調べていないのでこれから調べたいと思う。

多分、デスクトップ(タブレット以外のもの、つまりノートも含む)の場合、Microsoftアカウントを使用せずローカルログインの方が何かと楽だろう。なかなか痛い問題点として、Microsoftアカウントでログインするとユーザーのホームディレクトリの名前に漢字が入るという点。タブレットの場合はMicrosoftアカウントがないとWindows Storeが使えないし、Microsoftアカウントを前提としたアプリもあるのでMicrosoftアカウントしかないだろう。もし生理的に受け付けないなら一応アプリケーションをインストールする時だけMicrosoftアカウントに切り替えるとか、アプリインストール用(というか管理用)のMicrosoftアカウントと普段使いのローカルアカウントを両方用意することとかもできるが。

あとスタートメニューはWin7方式にする外部アプリケーションを入れたい。タブレットであっても旧方式の方が何かと楽だろう。新しい方式はモダンだが、操作手順は増加している。 # というかWin8のインターフェイスは色々改善されているけどタブレット対応部分については難があるような気もしており。正直Win7に戻そうかとも、まあWin7に戻すモチベーションにはそれ以外にWin8が大学絡みのライセンスで商用利用というか学習以外の利用ができないライセンスであることもあるのだが。

とりあえず、パソコンに慣れた人でWindows 8を導入する場合には、Microsoftアカウントの存在とWindows 8との関係についてよく調べてからのほうがいいだろう。なんにせよ僕はまだあまり調べていないのでこの記事はあてにしないで。

あと一部の人々は、Win8の画面にでかでかと表示された「スタート」とか「アプリ」とかのタイトル文字をみて「うわぁえむえすぴーごしっくや。」とか言わないように。

ううむ。書く前からそうなるんじゃないかとは思っていたが、今日の記事はぐぐればすぐ出てきそうな情報しか書いてない。書く意味あったのか。まあいいや。

Git周り、SparkleShareやEclipseのEGitをPuTTYがインストールされたWindowsで使う話

件名が長すぎて件名に内容が収まってしまうのではないかというぐらい内容ないのだけれども。

SparkleShareとかEclipseのEGitとか、最近だとWindowsでGitを使う機会も多い。

で、Gitを利用するにあたって、リモートリポジトリへの接続にsshを使うこともよくある。鍵ならすごく安全だし、設定の手間がなんだかんだ最小限で済む。

で、Windowsでそれをやると随分とあほらしい理由でひっかかったりするようだ。

Git系のアプリケーションが利用すると思われる環境変数でGIT_SSHというのもがあり、ここに何かが入っているとssh接続にはこれを使うらしい。これが厄介で、どうも鍵認証が必要となると鍵はpagentから持ってこようとするらしい。即ち、PuTTYの鍵エージェントで鍵を読み込んだ状態じゃないと認証ができない状態になる。これは不便だ。

解決策は、GIT_SSHとかいう環境変数があったら削除することらしい。システムのプロパティ(マイコンピューターを右クリックしてプロパティで出るやつ)から削除することができる。これ、どういうタイミングで設定されてしまうかは確認していないが、gitに絡む何らかのアプリケーションをインストールと思われる。

とりあえずこれぐらいのことを思ったので一旦メモ。

ミクシィ「Scrap challenge for security」に参加した。

株式会社ミクシィが主催する「Scrap challenge for security」なるイベントに参加してきた。Twitterやブログなどに書いておいてほしいという風に言われていることもあり、アンケートへの回答を兼ねて普段書くこともなくて更新していないブログかどうかよくわからないこのページに参加した記録でも書いておこうと思う。

このイベントでは、先ほどのリンク先が示す通り「なんらかのプログラミング経験があり、1人でアプリケーションを作成する実力をお持ちの方」を対象とした、Webセキュリティに関するレクチャーを受けた上で実際に(仮想環境上に設けられた)某SNS(スライドから原文ママ)に似ているSNSを攻撃するというもの。

鴨ネギ男(6チームに対して3人、各2チームからの攻撃を受けてくれる)に対して脆弱性をつくようなリンク(サイト内)を送りつけるというのが基本的なタスクで、問題が前半6問、後半4問(後半は前半の問題にも引き続き回答可能)。脆弱性をついて、問題に指定された通りの挙動を鴨ネギ男の使用するウェブブラウザ上で出させることに成功すれば得点(一部鴨ネギ男のブラウザ以外で実行するものもある)。徐々にヒントが出るがヒントが出た後の回答は点数が下がるというシステム。問題にもよるが、途中からネタバレに近いヒントが出るものもあった。

1人でアプリケーションを作成する程度の能力を求められるとはいえ、主にWebを扱っているわけではない人も対象に含まれていることもあり、XSSなどの基本的な攻撃手法を用いる問題が主であったが、攻撃手法そのものがよく知られたものでも制限に合わせて工夫しなければ達成されないものもあったり、いくつかの攻撃手法を組み合わせないといけないものもあった。

攻撃する側として考えて実際にやってみる機会はなかなかないため、よい機会として楽しめた。防御する側としても「このような入力でエラーが出るならSQLインジェクション/XSSを疑ったほうがよい」的なものは重要であり、どのあたりに、というのはある程度検討がつくものの、実際に攻撃を成功させるとなると容易ではなかった。また、普段JavaScriptをあまり書かずに生活しているが、JavaScriptの知識も要求された。もちろんGoogle検索にも頼ったが、特に同じチームのK氏がJavaScriptを普段扱っており、必要となる機能を口走るとそれに必要な関数の名前を口走ってくれたりある程度要点を絞った程度の発言にJSで実装する方針を口走ってくれたりしたし、彼自身HTMLとCSSでごりごり書くような課題とかややこしそうな課題を色々やってくれたりしたので心強く、またS氏も問題を解いて提出してくれたりしたため、最後30秒前ぐらいでヒントが出るまで放置していた問題を漸く提出して全問正解、チームとして優勝することができた。問題の核心部分には触れられないので、具体的な内容としてはこのぐらいに留めておく。

最初のレクチャーで出た質問で「XSS」は何がcross-siteなのか、といったものが出ていたが、確かにわかりづらい、一方で確かに今後XSSなどの概念を説明するときに抜けてはならない視点だなと思ったりした。実際に仮想サーバーをもう一台ぐらい用意してcross-siteの攻撃をやってみるとかはやってみたかった気もする。というか、問題の趣旨を無視して自宅サーバーへのリンクを送りつけてWrong Answerくらっててへぺろしても良かった気もする。最後の時間のぎりぎりさを考えると、たとえ2分ぐらいで終わる(自宅サーバーサイドはApacheのアクセスログを見ればスクリプト不要ってのも極論可能)としてもそんなことをしていては間に合わなかっただろうが。

また、懇親会でミクシィの社員の方とお話しできた。昔からのシステムを維持するのは手間が掛かるよな、という話もあったが、新しい手法も色々取り入れているのだとか、あとは色々なところからこのイベントに来ているよな、とか、そういう話もあったりした。会社についての元から抱いていた印象と違うな、と思うようなことはなかったが、そういう話を聞くと親近感が湧いたりする。

なお今回、接続には普通の会社のゲスト用無線LANを利用していたが、このようなイベントにかぎらずパソコンでサーバーに繋がせるタイプのイベントでの配線ってどのようにするべきなのだろう、とか思ったりはする。無線LANは相性が悪い機械があったり、ユーザーが増えると遅くなったりすることを考えられるので、3Gを使わない場合は有線LANを併設したりするとよいと思ったりした。また、インターネット接続は今回必要だったが、サーバーはVPSだった。イベントで何に繋がせて何かをさせる場合、接続先のサーバーは室内LAN内に置いたほうが安定するだけではなく何かと自由が効くのではないかと思ったりした。最近ノートパソコンにVMware入れるだけでも結構性能が出たりするので。

あとは、やらなかったけど個人的にやっておけばよかったなと思う極めてどうでもいいこと。まず、問題に書かれておらず害のない派手な攻撃、具体的には鴨ネギ男ブラウザでmp3やYouTubeなどを勝手に再生する(鴨ネギ男は同室にいるため部屋に響き渡る)脆弱性を別な回答と一緒に送りつけること。それと、仮想環境に対するポートスキャン(だから何かができるわけでもないが)。もしここを見ている人で今後(おそらく来年度以降)このイベントに参加する人がいれば、この発想にとらわれず何かやらかしてほしい。

UbuntuでのRAIDハードディスクの交換

(追記)GPTパーティションを使用する場合、先頭に1MB程度以上のbios reservedなパーティションを用意する必要があります!さもないとその時は問題なくとも再起動できなくて、トラブルが発生して挙句にパーティションの再編成に時間を費やすことになるでしょう!(体験談)
(詳細はよく知らないしちゃんと調べるのは保留するので具体的な容量は自分で調べてください。どうせMB単位なので不安なら多めに確保しても気にするものではないと思います。)

うちのファイルサーバーはLinuxでよく使われる普通のソフトウェアRAID(mdadm)を用いて構成していたが、今回これをサーバーの電源を落とさず交換し、最後に容量を大きくしたのでその手順を書いておく。

もう二年ぐらい使っているサーバーで、ヒューレット・パッカード社のML115という安さに定評のあるサーバーをベースに、メインメモリ、CPU(買うのが遅くて中古で買った)、ハードディスクを交換していて運用していた。ML115は格安ながらハードディスクのオンラインスワップに対応しているため、サーバーを止めることなくディスクを交換することができる。

もともと1TBのハードディスク2台で冗長構成で容量1TBとして使用していたが、今回新たに3TBのハードディスク二台を購入、これらに置き換えて元のHDDはバックアップ用にでも使うことに。

RAID 1で構成しているので、一台が故障してももう一台で動き続ける構成になっている。つまり、二台とも故障していない状態であれば、一台を停止しても動き続けるし、もう一台をさしてそちらとの同期が完了すればまた二台で動き始める。基本的にはこれを二回繰り返す。

ここで、

  • 一台目のHDD: /dev/sda
  • 二台目のHDD: /dev/sdb
  • /dev/sda1, /dev/sdb1 が /dev/md0
  • /dev/sda2, /dev/sdb2がswap
  • /dev/sda3, /dev/sdb3が/dev/md1
  • swap以外のパーティションは全て/dev/md*になっている
  • /dev/md1を拡大する
  • 新しいHDDの容量は2TiB以上(もちろん2TiB未満でも構わない)

とする。必要に応じて読み替えて作業を進めること。

当然だが、作業前にバックアップを怠ってはいけない。この手順に誤りがあったり作業ミスがあったりしてデータが飛んでも誰も責任は負えない。
まず、/dev/sdaから交換していこう。/dev/sdaにあるパーティションを全部使わないようにする。

$ sudo mdadm --fail /dev/md0 /dev/sda1
$ sudo mdadm --remove /dev/md0 sda1
$ sudo mdadm --fail /dev/md1 /dev/sda3
$ sudo mdadm --remove /dev/md1 sda3
$ sudo swapoff /dev/sda2

mdadm –failでディスクを故障と認識させて同期を停止させ、mdadm –removeでRAID構成から取り除く。また、スワップの利用も外す。

外したら、もうsdaが使われていないことを確認する。

$ cat /proc/mdstat
$ cat /proc/swaps

ここにsdaのパーティションが現れないことを確認したら、sdaを取り外す。sdaがどのディスクであるか確認するために、sdaのシリアル番号を確認する。

$ sudo smartctl -a /dev/sda

シリアル番号などをよく確認して、sdaを本体から取り外す(※マザーボードがオンラインスワップに対応していない時は、サーバーの電源を落とす必要がある。)。サーバーの蓋を開けた今もサーバーは動いているので余計なところに触らぬよう注意する。
また、この時取り外したディスクはこの瞬間のバックアップディスクとしてあとから復元が一応できるようなので(当然突然シャットダウンした時のような状態にはなるが)、安定運用が確認できるまでは手っ取り早いバックアップファイルとして丁重に扱うこと。(–failのフラッグをつけたときに使用不能にする操作などないか若干不安だったが、実際にこの時のディスクを別のパソコンにつないでVMwareで起動してみたところ正常に起動され、ファイルも読み込めた。)

続いて、新しいディスクをとりつける。とりつけたら、まずパーティションを作成する。

パーティションの作成はfdiskでも作成することができるが、fdiskは2TiB以上のディスクに対応することができない。2TiB以上のディスクに対応するためにはGPTというタイプのパーティションを作成する必要があるので、partedを使ってパーティションを組む。

$ sudo parted /dev/sda
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

さて、まずはディスク全体をGPTとしてラベル付する。なおこの作業で、sdaに既存のパーティションテーブルがあった場合それはまっさらになる。

(parted) mklabel gpt

partedのコマンドリストはhelpと入力すると出てくる。なお、unitコマンドは

(parted) unit KiB

とかする。また、色々なコマンドで場所を指定する時はunitコマンドで指定した単位がデフォルトで、KiBなどをつけるとそれに合わせられる。
ということでパーティションを作る。新しくRAID構成にするパーティションは既存のパーティションと同じまたはそれ以上の容量にすること。容量拡大を狙っているパーティションは拡大後の予定サイズにする。また、パーティションの位置や順番は既存のものと異なっても構わないし、これまで同じディスクにあったものを違うディスクに配置することもできる(必要な数のディスクがある場合)

(parted) mkpart primary 1024KiB 50GiB
(parted) mkpart primary 50GiB 54GiB
(parted) mkpart primary 54GiB -1
(parted) set 1 bios_grub on

mkpart PART-TYPE START ENDとしてパーティションを作成するが、ENDを-1にすると最後までとなる。なお、sudo parted /dev/sdbしてprintするとすでにあるパーティションの構成を見られるので、既存のパーティションと同じにしたい部分はunit KiBした上でprintして出てきたSTART ENDをコピペするとよい。
また、GRUBをインストールできるよう、従来型のBootフラッグをオンにする。
パーティションを作成したら、partedを終了する。

(parted) quit

パーティションの作成が完了したら、sdaをRAIDやSWAPに組み入れる。
まず

$ sudo partprobe /dev/sda

としてパーティションの情報の再読み込みを行い、

$ sudo mdadm --add /dev/md0 /dev/sda1
$ sudo mdadm --add /dev/md1 /dev/sda3
$ sudo swapon /dev/sda2

こうすると同期が始まる。同期の状況は

$ cat /proc/mdstat

すると見られる。再同期はまあ、ディスク全部を同期するので予想どおりの時間がかかる。
あと、GRUBのインストールを忘れない。

sudo grub-install /dev/sda --recheck

同期が完了したら、もう一台のディスクも同様に交換する。なお、実際にやってみたところ、sda, sdbの二台構成でsdbを交換すると、sdaは交換後もsdaだったがsdbを交換すると新しいディスクはsdcになった。

二台とも交換が終わったら、現在古い容量のままになっているパーティションを新しい容量に合わせる。現在、パーティションそのものの大きさはpartedで新たに指定したものとなっているが、その中に入っているRAIDの大きさ(すなわち/dev/md1の大きさ)や、そのRAIDの中に入っているファイルシステムの大きさは古いままとなっている。これを外側から大きくしていく。

まず、RAIDの大きさをパーティションの大きさに合わせる。これは、

$ sudo mdadm --grow /dev/md1 --size=max

とかしてやる。なお今回はmaxだから関係ないが、この–sizeは「一台あたりの」大きさである。サイズを大きくしたパーティションの数だけこれを行う。なお、これは現在追加されているディスク全てが同期されている状態でないとできないので注意。
続いて、ext3/4の場合はオンラインでのファイルサイズ拡大ができるので、

$ sudo resize2fs /dev/md1

とかしてやると、ファイルシステムのサイズが望む大きさになる。なお、resize2fsは非常に時間がかかるので注意。この方法で容量を増やすと、徐々に容量が増えるらしく、Muninのディスク利用率のログが
diskusage
こんな風になっていた。
その他のファイルシステムは各自「ファイルシステムの」拡大の方法を調べて行う必要がある。

パーティションを縮小することを考えている場合は、ディスクを交換するまえにファイルシステムを縮小、続いてmdadmでRAIDの大きさを縮小してから作業することになるが、執筆時点ではext3/4はオンラインリサイズは拡大のみで、縮小する場合は一度アンマウントする必要がある。

JSP(tomcat)をUbuntuにインストールする。

tomcatをインストールしてJSPプログラムを走らせる手順、PHPとかよりは手間が掛かる。とりあえずメモ。

インストール

sudo apt-get install tomcat7

で勝手に入る。

が、MySQLぐらいは使いたいので

aptitude install libmysql-java libcommons-lang-java

cp /usr/share/java/mysql* /usr/share/tomcat7/lib/
cp /usr/share/java/commons-lang.jar /usr/share/tomcat7/lib/

とかしておく。

設定

/etc/tomcat7/server.xml の、Engineの下の項目に、

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="/var/lib/tomcat7/webapps/app_name" reloadable="True">
            <Resource name="refname" auth="Container"
            type="javax.sql.DataSource"
            username="" password=""
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost/dbname?useUnicode=true&amp;characterEncoding=utf-8"
            maxActive="100" maxIdle="100" />
            </Context>

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

      </Host>

とか書く。他のHost要素は要らないので削除する。

SQLへの接続もここで設定する。ユーザー名やデータベース名などを上の項目に追加する。ちなみに、

                        Context initCtx=new InitialContext();
                        Context envCtx=(Context) initCtx.lookup("java:comp/env");
                        DataSource ds=(DataSource)envCtx.lookup("refname");
                        Connection conn=ds.getConnection();

とかやると接続できる。

また、/var/lib/tomcat7/webapps/ROOT ができるが、これは削除する。削除しないとjspを実行した時に正常に走らないことがあるようだ

サーブレットのコンパイル

サーブレットをコンパイルするときには、

javac ./WEB-INF/classes/path/to/your/file.java -cp /usr/share/java/tomcat-servlet-api-3.0.jar:./WEB-INF/classes/:/usr/share/java/commons-lang.jar:/usr/share/tomcat7/lib/*

的な感じで一杯CLASSPATHを指定してあげる。
環境構築はとりあえずこんな感じでできるはず。
jarを追加したい時は/usr/share/tomcat7/lib/以下においてあげる。
実際にプログラムを書くにあたっての云々はいずれ機会があったら書く。