タグ別アーカイブ: Computer

Dentoo.LT#11

陳腐化する前に話をしておこうと思いましたが、あまり面白いものではなかったので枠の無駄遣い感がありました、けいなです。

今回も、Dentoo.LTで話してきた内容についてです。
細かい話はYouTubeのDentoo.LTチャンネルDentoo.LT#11とスライドslideshareSpeaker Deckに譲ります。

トラック泊地の開放初日に着任してから延々とやり続けている廃人提督ですが、あれこれと自分で管理するのが面倒になって専ブラ・支援ツールに手を出しています。(先日問題になった)Chrome拡張を利用していた時期もありましたが、最終的に記録魔な性分とWin・Macで運用できることを理由に航海日誌を使っています。

航海日誌が吐き出した次の資材ログを良い感じに表示する試みの話でした。
Boot CampのWindowsで取っていたログもありますが、(おそらく)マージしてません。

% nkf log | head -2
日付,燃料,弾薬,鋼材,ボーキ,高速修復材,高速建造材,開発資材
2014-04-03 06:26:37,33674,52280,52628,42649,360,599,522
% nkf log | tail -2
2015-05-10 13:56:56,221603,255400,234321,298388,2556,1902,1769
2015-05-10 14:02:13,221433,255064,234371,298278,2556,1903,1769
% wc -l log
   15043 log
% du -hs log
928K	log

主に用いるのは話した通りGnuplotです。
Makefileに利用するスクリプトと変数の内容を起こすように記述して、ある程度適当に使えるようにしています。

Makefileには、イベント攻略の資源推移のプロット用、全期間のプロット用などの派生をいくつか作成していますが、抜粋で済ませます。
ファイル名、期間をdateコマンド及びgdateコマンドで設定しています(使い分けに特に理由はありません。調べてすぐ出てきた方を使いました)。

FILE= $(shell date "+%Y.%m.%d-%H%M%S")
OLD = $(shell gdate -d '2 months ago 1 days' +%Y-%m-%d)
OLDE= $(shell echo "2015-04-28 23:00:00")
NOW = $(shell gdate -d '1 days' +%Y-%m-%d)
NOWE= $(shell echo "2015-05-03 03:00:00")
allh : /Users/KHe7/Application/macosx-x64/資材ログ.csv
	make svgh
	rsvg-convert -f png -o "$(FILE).png" "$(FILE).svg"
	rsvg-convert -f pdf -o "$(FILE).pdf" "$(FILE).svg"
alle : /Users/KHe7/Application/macosx-x64/資材ログ.csv
	make svge
	rsvg-convert -f png -o "$(FILE).png" "$(FILE).svg"
	rsvg-convert -f pdf -o "$(FILE).pdf" "$(FILE).svg"
svgh : /Users/KHe7/Application/macosx-x64/資材ログ.csv
	cp /Users/KHe7/Application/macosx-x64/資材ログ.csv ./log
	gnuplot -e "file='$(FILE)';old='$(OLD)';now='$(NOW)'" ploth
svge : /Users/KHe7/Application/macosx-x64/資材ログ.csv
	cp /Users/KHe7/Application/macosx-x64/資材ログ.csv ./log
	gnuplot -e "file='$(FILE)';old='$(OLDE)';now='$(NOWE)'" plote

Gnuplotスクリプトの方では、”-e”オプションで受け取った変数を用いて出力ファイル名、x軸の期間を設定します。
また、SVGやPNGは何も設定しないと透過してしまうので、背景に白色を設定しています。
x軸に期間を設定するのに”set xdata time”と”set timefmt “%Y-%m-%d %H:%M:%S””を用いています。
色については各資源・資材の自分のイメージで決めました。組み込みに近い色があればそれに、なければ適当に数値で入れています。

set datafile separator ","
set terminal svg size 2880,1620 font "ヒラギノ明朝 Pro W3.otf,24"
set output file.".svg"
set object 1 rectangle from screen 0,0 to screen 1,1 fillcolor rgb"#ffffff" behind
set key left bottom
set xdata time
set format x "%Y.%m.%d"
set timefmt "%Y-%m-%d %H:%M:%S"
set xrange [old." 00:00:00":now." 00:00:00"]
set ytics nomirror
set y2tics
set grid xtics mxtics ytics
set yrange [250000:300000]
set y2range [1500:3000]
plot "log" using 1:2 w l lw 2 lc rgb "forest-green" title "燃料",\
     "log" using 1:3 w l lw 2 lc rgb "#8d6a47" title "弾薬",\
     "log" using 1:4 w l lw 2 lc rgb "gray60" title "鋼材",\
     "log" using 1:5 w l lw 2 lc rgb "sandybrown" title "ボーキサイト",\
     "log" using 1:6 w l lw 2 lc rgb "#aae272" title "高速修復材" axes x1y2,\
     "log" using 1:7 w l lw 2 lc rgb "#ff9999" title "高速建造材" axes x1y2,\
     "log" using 1:8 w l lw 2 lc rgb "light-blue" title "開発資材" axes x1y2

出力結果を2例示しておきます。
ひとつは全期間のログを用いたものです。
2015.05.10-232138
もうひとつは今回のイベント期間についてのものです。
2015.05.10-232132

よく考えるとこのどちらも上に示したMakefikeやGnuplotスクリプトで生成したものではないですが…余り変わらないので良しとしておきます。
前者はxrangeの設定を外してyrangeを[0:300000]、y2rangeを[0:3000]に設定しました。後者はxrangeをOLDE、NOEWで渡し、yrangeおよびy2rangeの設定を外した上で各期間に対応するような垂線を引き、凡例の位置を微調整しました。

ここまであれこれやったものの、あまり見栄えがしないので良い感じのビジュアライザを探したい気がしてきています。

次回は個人的な制作物のお話か、各種機関に対して行ったお問い合わせについて書きたいと思っているので、下調べと実行に取り掛かるつもりでいます。

Dentoo.LT#10

けいなです。

理由が出来たので投稿するという状態です。静的に置き換えることさえしてません。
Dentoo.LTが回数を重ねている間ネタがないと思い続けていたのですが、よくよく考えれば何かと話す材料があった、という話です。

細かい話はYouTubeのDentoo.LTチャンネルDentoo.LTにある動画Dentoo.LT#10とスライドslideshareSpeaker Deckを参照していただければと思いますが、初海外+単独渡航という状況下で学会に行かされるに辺って準備したモバイル通信環境とWindows 8.1におけるモバイル通信利用の話となっています。

発表後にVisitor SIMという知見を得たのですが日本通信に邪魔されて調べ物が捗りません。
Ready SIMとAT&T GoPhoneについてはプリペイドという扱いのため、これも含まれる…ように感じますが、真面目に英文でアメリカのSIM事情を追いかけるには事後ということもありやる気が出ません。

2年半選手のSC-01Dを置き換えたいと思いつつ、標準サイズのSIMで通信を流しているために代えがたいという状況で悩ましいのですが、いい加減に次の請求を行おうと思います。
何らかの成果が出ましたらこの場かTwitterなどで報告をさせていただきます。

ではまたいつの日にか。

P.S.
DentooLT#6の記事書いてないことに気付きましたがそれはもうスライドで見てください。

C++に関する記録

気付けば冬ですが、けいなです。

今回はC++に関して試行錯誤したことについて書きます。

お気楽参加のTopCoder SRMやAtCoder、絶賛放置中のAOJではJavaを使いです。
C++は随分前に手を出そうとして環境構築との戦いに負けて放置していました。
(高校ではポインタと構造体の無いC言語と簡単なBorland C++だった筈なのに)
とある事情によりC++に軽く触れておかなければならなくなったので、
環境構築をしたのですが前回と同様に痛い目にあったので少しまとめておきます。

TopCoder SRMでEclipse上のEclipseCoderに頼りきりな人です。
当然、C++もまずはEclipseで、と考えました。

#include <iostream>
using namespace std;

int main(){
	cout << "Hello World!\n";
	return 0;
}

なんの変哲もないHello Worldを打ち込んでプロジェクトをコンパイルして実行…したところターミナルになにも出力されない。

調べるとEclipseとMinGWの組み合わせで、64bitの時に生じるバグのよう。
リンカのオプションに-staticを渡してやると直ることが分かったのでプロジェクトのプロパティから適当に挿入して解決。
前に嵌ったのはこれだったので前回は調査不足だったということですね、残念。

次に、適当にテストケースを放り込むものをEclipseCoderのC++で生成されるものを流用して使うことに。
で、何も考えずに次のようなコードを書いてコンパイルできずに死亡。

	vector<int> expected_ = { 0, 13};

C++11で導入された記法らしいということに辿り着くまでにすこしかかったもののたどり着いてからは早く。
コンパイラのオプションに-std=c++11を渡してやるとコンパイル通るので適当に。

が、この環境を構築したWindows 8はバッテリーの食い方が異様なので電源を使用していない時はほとんど使っていません。
SRMの環境としてなぜかBoot Campで動いているWindows 8のEclipseを使用しているため普段は使用されることなく。
結局、環境作った筈なのに全く進まない。(正直Appleには頑張って欲しいところ、トラックパッドのドライバとか特に!)

そこで、Macで書けるようにしようということでclangとバトル。
これがまたあまりうまく行かなかった。普段C++を使わない人が適当に頑張ろうとするのが悪いのだろうと思いつつ延々。
clangに対してWindows 8+MinGW+Eclipseで成功した-std=c++11辺りを放り込んで色々やっていたもののあまりうまく行かず。

clang++ -std=c++11 -std=libc++ probtest.cpp

結論はあっけなく。c++として認識させろということでした、はい。

と、Macで書けるようになった。この程度だとvimとコンソールで書けるしWindowsのcygwinでできるのでは…ということで色々。

clang++と試行錯誤しつつ延々酷い目にあって、C_INCLUDE_PATHやCPLUS_INCLUDE_PATH、LIBRARY_PATHを弄っていて。
Eclipse側が読み込んでいるPleiadesお抱えのMinGW配下のファイルを読み込ませても上手く行かなかった。
そこで方針転換。cygwinが抱えているヘッダファイル達を読み込む方向に転換するもなにかがおかしい。
clangやgccが抱えていたヘッダファイル等をEclipseの読み先と似たように持ってきているのに全く通らず。

エラー吐いている部分を適当にググるとStackOverFlowがヒットして、調べるとcygwinのgccがこの例と同じく4.5.3。
cygwinのインストーラーを持ってきて4.5.3を使っている部分をすべからく4.7.2にアップデートしたところコンパイル成功。

clang++ -std=c++ probtest.cpp

教訓:環境とデフォルト設定を疑え

と、これでコンソールで書けるようになったのでDropboxか何かで同期させておけばいつでもできる。
引数の微妙な差分は.zshrcで環境ごとにalias通して作業すれば十分。

しかし…TopCoderはC++11じゃないしこの環境だと参加するには微妙なところだな…。

SECCON CTF

第1回SECCON CTF全国大会にチームMMAの一員として参加していました。
2013.02.23~2013.02.24という日程での開催でしたので既に1ヶ月が経過していて、非常に今更感しかありませんがせっかく参加したので少し。

昨年5月のつくば大会で先輩と同級生と後輩が点数稼いで3位に。
全く戦力になっていなかった残念な人ではありますが(人数制限がなかったので)北千住まで遊びに行くというくらいの軽い気持ちで参加。

初日、12時に集合してお昼を食べてから会場入り。
WiMAXルーターとWiFiルーターでチーム内ネットワークを構築。
1階の壁が薄い場所かつWiMAXハイパワーにも関わらず窓ギリギリにおかないとpingが残念というWiMAXに呆れつつも場所に恵まれ。
会場に一番近いメンバーがておくれていたものの時間に。
MONSTERのタワーに流石と呆れつつ開会式を終え、いざ競技開始…というもののthunderbolt-Ethernetの変換ケーブルを忘れて歩きまわる。
結局、田舎にthunderboltなんて文明は到来していなかったようでUSB-Ethernetで妥協。(ただ、Windows側で起動時以外に認識するというメリットあり。)
会場に戻ってからもこの手の知識が皆無で残念な人はこれって結局どうなってるんだろうな〜と思いつつも妨害コンテンツに素直に見入っていました。色々すいません。

時間で撤収。交流会の後、帰宅組と宿泊組に分かれて。

宿泊先はOpenVPNが一度通ったものの再びトライしたら通らなかったので会場と同じネットワーク構成で構築して適当に。SSHも22番ポートでしか通らなかったので色々厳しい…。
戦力にならない残念な人は早々に諦めて相槌を打つ人と化して。
しかし、Xiとかいう雑魚LTEでも500kB/sくらいは出るので重いファイルのダウンロードならWiMAXよりも早いというのはなんというか。ただ、SC-01Dは時々勝手にクラッシュするので使い辛い。

2日目。朝食のタイミングや電車の方向の勘違いで少し遅めの到着。
環境を再構築して適当に競技に参加。
といっても再び相槌を打つだけの存在になっていたのが現実。
後輩がtelnetが使える端末を所望したタイミングで自分の計算機を渡せたのが唯一まともに戦力になったところ。(疑いの余地多数)
後半のUranusでのキーワードと某後輩の妨害スクリプトでなんとか5位を死守。

2日間という期間、適当に楽しく参加できたのは良かった。
ただ、やはり何か知識を持っている訳でもなく、何かを作っている訳でもなく、ただ計算機に触っているだけの人というのは微妙なものだなという常々思っていることを再認識。
とはいえ、何か考えるわけでも何か始めるわけでもない辺りが私の悪い所で。
大学に入って既に3年が経過。成長したこともなくする気もないという状態だが来年は暇なはずなので少しはという意志を。

python-twitterで遊んだ。

ちょっとした興味で作った駄作について。

ちょっとコミケに遊びに行こうと思い、そのモバイル環境でTLが取得できないことを予測。使用しているモバイル環境がdocomo系MVNOのものなのでdocomoの比率の高さに加えて本家に潰される可能性がある。

で、VPSでTLを取得してメールで送りつければ良いのではという考えで作ったもの。

10秒に1回、自分のタイムラインを直近100件読み込んで、古いものから順にidを調べ、既に書き出しているものより大きいものをファイルに書き出すというもの。

import sys
import codecs
import time
import twitter

api = twitter.Api(consumer_key='適切な文字列', consumer_secret='適切な文字列', access_token_key='適切な文字列', access_token_secret='適切な文字列', cache=None)

tmp = 0

timeline = api.GetFriendsTimeline('@以下の文字列', 100, 0, 0, True, True)
timeline.reverse();
f = open("1.log","w")
f = codecs.getwriter('utf-8')(f)
for tweet in timeline:
	f.write('\n%s(%s)\n%s\n.' % (tweet.user.name, tweet.user.screen_name, tweet.text))
	if tmp < tweet.id:
		tmp = tweet.id
f.close();

while 1:
	time.sleep(120)
	timeline = api.GetFriendsTimeline('@以下の文字列', 100, 0, 0, True, True)
	timeline.reverse();
	f = open("1.log","a")
	f = codecs.getwriter('utf-8')(f)
	for tweet in timeline:
		if tmp < tweet.id:
			tmp = tweet.id
			f.write('\n%s(%s)\n%s\n.' % (tweet.user.name, tweet.user.screen_name, tweet.text))
	f.close();

また、取得したファイルを送りつけるようなシェルスクリプトを準備して回した。

#!/bin/zsh
while true
do
	export aaaa=`date +"%Y.%m.%d-%T"`
	mail -s $aaaa 送信先のメールアドレス < ./1.log
	rm -f ./1.log
	sleep 5m
done

出力されたファイルをリダイレクトでmailコマンドに放り込み、送信した時間を件名に埋め込んだだけの何か。送った後5分間休むので5分間隔で送りつけてくれる。cronを初めて使ったら添付ファイルになったので急遽作った。何が悪かったのかは今後。

この2つを借りているVPSで起こしたscreenの下で実行。5分間隔というのが少し短くて時々苛立ったが取得漏れ以外は追いかけることが可能だったのである程度重宝した。

メールでの通知は止めたがpythonのコードの方はその後も無駄に動かし続けている。10秒間隔が悪いのかは不明だが1日とか8時間とかで倒れてしまう現象が発覚。python-twitter側でエラーが起きて倒れるのでライブラリ自体が不穏な可能性もあるがとりあえず120秒間隔で取得するようにしたところ3日動き続けている。

pyhonなにそれという状態からライブラリを探しTwitterでアプリの登録をしてTLを吐き出すコードを書き、mailコマンドを適当に叩くところまでで4時間というので適当だがこういう駄作でもなにか作るとある程度調べるから悪くない。