Quantcast
Channel: Eleclog.
Viewing all 81 articles
Browse latest View live

iPodをArduinoでコントロール

$
0
0

コントロールと言っても音楽やメディア(YouTube、ストリーミング等)の再生停止、送り戻し、音量の調節くらいですが、今更ながらDockコネクタ経由でやってみたり。
#時代はLightningとか言わない
一応、iOSデバイス(iPhone/iPad)も制御できますが、あくまでもメディア(音楽・動画)のコントロールのみなのでタイトルを「iPod」としました。

使用したのはArduino Pro mini 3.3V、スイッチ、抵抗(1kΩ*3、1MΩ*1)、Dockコネクタのbreakoutボードの4つ。
5V系を使う場合はTXからの出力を抵抗分圧等で3.3VにレベルシフトしてあげればOK。
(ただし、Arduinoへの電源供給は別途しなければならない)


とりあえず、再生停止、曲送り、曲戻しの3ボタンを用意。
Dockコネクタとの接続はこちら(http://pinouts.ru/CellularPhones-A-N/iPhone_connector_pinout.shtml)を参考に、ArduinoのTXをDockコネクタの13ピン、VCCを18ピン、GNDを11ピンに。
Dockコネクタの21ピン(Accessory Indicator)は1MΩ経由でGNDに接続しました。(500kΩでも問題なし)

iPod(iPhone/iPad含む)のシリアル通信に関しては既に調べ尽くされているので、その情報を参考にしました。
https://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2007/awr8_asl45/awr8_asl45/index.html
http://web.student.tuwien.ac.at/~e0026607/ipod_remote/ipod_ap.html

シリアル通信には複数のモードがあり、最も簡単な制御モード(iPodへの一方行通信)がmode2、曲名やアルバム名なども取得できる制御モード(iPodとの双方向通信)がmode4となっている模様。
接続直後はmode0となっているので、そこにmode2への切り替えコードを叩いてあげるとmode2の制御コマンドを受け付けるようになってくれます。
と言うわけで、プログラムは上記ページを参考にしながら以下の様な感じで。
#include <Bounce.h>

#define BUTTON1_PIN 3
#define BUTTON2_PIN 4
#define BUTTON3_PIN 5

boolean state[3];

Bounce button1 = Bounce( BUTTON1_PIN,20 );
Bounce button2 = Bounce( BUTTON2_PIN,20 );
Bounce button3 = Bounce( BUTTON3_PIN,20 );

byte mode2[] = {
0xFF, 0x55, 0x03, 0x00, 0x01, 0x02, 0xFA};
byte playStop[] = {
0xFF, 0x55, 0x03, 0x02, 0x00, 0x01, 0xFA};
byte prevTrack[] = {
0xFF, 0x55, 0x03, 0x02, 0x00, 0x10, 0xEB};
byte nextTrack[] = {
0xFF, 0x55, 0x03, 0x02, 0x00, 0x08, 0xF3};
byte buttonReleased[] = {
0xFF, 0x55, 0x03, 0x02, 0x00, 0x00, 0xFB};

void setup() {
pinMode(BUTTON1_PIN, INPUT);
pinMode(BUTTON2_PIN, INPUT);
pinMode(BUTTON3_PIN, INPUT);
Serial.begin(19200);
for (int i = 0; i < 7; i++) {
Serial.write(mode2[i]);
}
}

void loop() {
button1.update();
if ((button1.read() == HIGH)&&(state[0] == 0)) {
for (int i = 0; i < 7; i++) {
Serial.write(playStop[i]);
}
state[0] = 1;
}
if ((button1.read() == LOW)&&(state[0] == 1)) {
for (int i = 0; i < 7; i++) {
Serial.write(buttonReleased[i]);
}
state[0] = 0;
}
button2.update();
if ((button2.read() == HIGH)&&(state[1] == 0)) {
for (int i = 0; i < 7; i++) {
Serial.write(prevTrack[i]);
}
state[1] = 1;
}
if ((button2.read() == LOW)&&(state[1] == 1)) {
for (int i = 0; i < 7; i++) {
Serial.write(buttonReleased[i]);
}
state[1] = 0;
}
button3.update();
if ((button3.read() == HIGH)&&(state[2] == 0)) {
for (int i = 0; i < 7; i++) {
Serial.write(nextTrack[i]);
}
state[2] = 1;
}
if ((button3.read() == LOW)&&(state[2] == 1)) {
for (int i = 0; i < 7; i++) {
Serial.write(buttonReleased[i]);
}
state[2] = 0;
}
}
Bounceライブラリを使うとなんか冗長的な感じになってしまうのがアレですが、とりあえず仕組みは理解できたので今回はこれで良しとします。

これで何を作りたいのかと言うと、iOSデバイス上での音楽再生を停止させるスリープタイマーの外部インターフェース版。
普通はiOSデバイス単体でスリープタイマーを設定出来るようになっていますが、そういう設定が面倒くさい人(父)の為に、ボタンを「物理的に」何回か押せば簡単にタイマーが設定出来る装置を作ろうかと。

色々と資料を見ているとmode4も面白そうなので、次はmode4で取得した情報をLCDに表示させたりしてみようと思っているところ。

ArduinoISPでUSBasp-Bをアップデート

$
0
0

aitendoでUSBasp-Bを買ったものの、Arduino IDEからバージョン古いと怒られる&書き込み速度が遅いのでバージョンアップを試みた時のメモ。

ArduinoISPでUSBasp-Bをアップデートする試みは既にこちらなどで挑戦されているようですが、今のところ成功したという記事は見かけなかったのでチャレンジしてみることに。

1. ArduinoにArduinoISPを焼く
ファイル→スケッチの例→ArduinoISPを選択し、あとは普通にいつもの通り書き込む。

2. Auto Resetの無効化
ArduinoのAuto Resetを無効化するために、ArduinoのRESETとGND間にコンデンサを入れる。(0.1µFとか1µFでOK)
ちなみに、110Ω程度の抵抗をRESET-GND間に入れるというduemilanoveで使える技はUNOでは使えませんでした。

3. ArduinoとUSBasp-Bを接続
USBasp-BのJP3とJP4(3つのジャンパのうち真ん中以外の2つ)をONにしてファームウェア書き換えモードにする。
ArduinoとUSBasp-Bの接続はストレート(ArduinoのMOSIはUSBasp-BのMOSIに、MISOはMISOに接続)
ここで、USBasp-BのRESETはArduinoの10番pinに接続する。
ちなみに、この記事の一番上の写真は間違った接続をしていて、正解はこんな感じ。


ArduinoのICSPコネクタ5番pinはRESET(Arduinoの1番pin)に繋がっているため、USBasp-B側のRESETが(Auto Reset無効化の影響で)うまく効かず、

avrdude: stk500_recv(): programmer is not responding

を吐く原因となります。

4. 書き込み
USBaspのウェブサイトから最新版のファームウェアをダウンロード、展開し、ターミナルから下記コマンドで書き込み。

avrdude -P/dev/tty.usbmodemfd121 -b 19200 -c avrisp -p m8 -U flash:w:usbasp.atmega8.2011-05-28.hex:i

「/dev/tty.usbmodemfd121」は各自の環境に合わせて変更してください。
「usbasp.atmega8.2011-05-28.hex」も最新バージョンが出たらそれに合わせて適宜。

うまく書き込めたら下記の様な結果が返ってくると思います。
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.06s

avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "usbasp.atmega8.2011-05-28.hex"
avrdude: writing flash (4700 bytes):

Writing | ################################################## | 100% 5.73s

avrdude: 4700 bytes of flash written
avrdude: verifying flash memory against usbasp.atmega8.2011-05-28.hex:
avrdude: load data flash data from input file usbasp.atmega8.2011-05-28.hex:
avrdude: input file usbasp.atmega8.2011-05-28.hex contains 4700 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 5.41s

avrdude: verifying ...
avrdude: 4700 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done. Thank you.

最後にヒューズビット(hfuse)を書き換える。

avrdude -P/dev/tty.usbmodemfd121 -b 19200 -c avrisp -p m8  -U hfuse:w:0xC9:m

これも、うまくいけば下記の様な結果が返ってくる。
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.07s

avrdude: Device signature = 0x1e9307
avrdude: reading input file "0xC9"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.07s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xC9:
avrdude: load data hfuse data from input file 0xC9:
avrdude: input file 0xC9 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified

avrdude: safemode: Fuses OK

avrdude done. Thank you.

以上でバージョンアップ終わり。

Auto Resetの影響を受ける可能性を思いつくまで30分、ICSPの5番pinがRESETに接続されているのを思い出すまで30分...
0x14歳にして脳が衰退し始めていることを思い知らされた1時間でしたorz

ミニブレッドボードで遊ぶ (温湿度計)

$
0
0

秋月電子にて1個150円(2個以上買うと1個あたり150円)で売ってあるミニブレッドボードBB-601
これにどれだけ詰め込めるかという遊びを思いついたので、早速何か簡単なものを作ってみました。

ATmega328P-PU、温度センサ(LM61CIZ)、湿度センサ(HIH4030)、極小キャラクタ液晶、セラロック(16MHz)、抵抗(10kΩ)、コンデンサ(0.1µF)という構成。
#流石に電源まで詰めるのは無理


この状態でUSARTとSPIは空いているので、更に拡張や連携も可能だったり。
温度・湿度センサもデジタル(I2CやSPI)接続の物を利用すれば、もう少し他の物を接続できる。


LCD裏はこんな感じ。
買ってきてすぐは1mmピッチのFFCが付いていますが、何だかんだで扱いにくいので、細めで少し硬いビニル絶縁電線に付け替えました。(自立可能)

このサイズで何か面白いものが出来れば掲載しようと思っているものの、如何せんネタが無いのである(~_~;)

追記:サイズ比較にiPhone4Sの上に載せて1枚。


フレキシブル太陽電池 TX3-25

$
0
0

少し前にSwitch ScienceでSunModというテレビなどのリモコンを太陽電池式に改造するキットが販売開始されたのですが、これに使われている(と思われる)太陽電池を偶然共立エレショップで見つけて買ってしまった訳です。


ご覧の通り非常にフレキシブルで薄いので、円筒形の物の表面に貼り付けたりするのも問題なさそう。(日の当たり具合とかは取りあえず無視して)


さっそく両極にリード線を付けてチェック。日中の屋内でも1.7Vくらいの出力が得られる。


少し曇った日の正午過ぎに西向きの窓の網戸越しに置いて1.9Vくらい。
ちなみに定格は「開放電圧/短絡電流:4.1V/40mA 操作電圧/電流:3V/25mA」だそうで、日光のガシガシ当たるところでは普通に3V出るっぽい。

追記:直射日光を当てると4V出ました。

SunModの様に直列接続のニッケル水素電池2本に並列に接続する形で蓄電して、何かに電源供給するという使い方が良さそうですが、実際に充電できる&どのくらい充電できるのかは謎...
#そのうち検証してみるつもり

Arduino+74HC595+LED16個でPOV

$
0
0

Arduinoとシフトレジスタ74HC595でLED16個を制御してPOVを作ろうという今更感漂うネタ。
実は4月末に作っていたものですが、なかなか時間がとれず今頃ブログに投稿です...


配線はこんな感じ。 #LED16個への配線で非常に見づらくなっております...


シフトレジスタ1個で8個のLEDが制御可能、2段にすると16個、3段で24個、4段で32個...と言う具合に(電源容量の限り)8の倍数ずつ増やすことができます。

プログラムは、Arduinoのチュートリアルも参考にしながら下記のような感じで。

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

word data;
word dataArray[][10] = {
{
0b0000000000000000,
0b0000001111110000,
0b0000110000001100,
0b0001000000000010,
0b0001000000000010,
0b0001000000000010,
0b0001000000000010,
0b0000110000001100,
0b0000001111110000,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0001000000000100,
0b0001000000000010,
0b0001111111111110,
0b0001000000000000,
0b0001000000000000,
0b0000000000000000,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0001100000000100,
0b0001010000000010,
0b0001001000000010,
0b0001000100000010,
0b0001000010000010,
0b0001000001000100,
0b0001000000111000,
0b0000000000000000,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000100000000100,
0b0001000001000010,
0b0001000001000010,
0b0001000001000010,
0b0001000001000010,
0b0000100010100010,
0b0000011100011100,
0b0000000000000000,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000001100000000,
0b0000001011000000,
0b0000001000100000,
0b0000001000011000,
0b0000001000000100,
0b0001111111111110,
0b0000001000000000,
0b0000001000000000,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000100001111110,
0b0001000001000010,
0b0001000001000010,
0b0001000001000010,
0b0001000010000010,
0b0000100010000010,
0b0000011100000010,
0b0000000000000000,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000011111110000,
0b0000100010001000,
0b0001000001000100,
0b0001000001000010,
0b0001000001000010,
0b0001000001000010,
0b0000100010000010,
0b0000011100000100,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000000000000010,
0b0001100000000010,
0b0000011000000010,
0b0000000110000010,
0b0000000001000010,
0b0000000000110010,
0b0000000000001010,
0b0000000000000110,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000011100000000,
0b0000100010111100,
0b0001000001000010,
0b0001000001000010,
0b0001000001000010,
0b0001000001000010,
0b0000100010111100,
0b0000011100000000,
0b0000000000000000
}
,
{
0b0000000000000000,
0b0000100000111000,
0b0001000001000100,
0b0001000010000010,
0b0001000010000010,
0b0001000010000010,
0b0000100010000010,
0b0000010001000100,
0b0000001111111000,
0b0000000000000000
}
};

void setup() {
pinMode(latchPin, OUTPUT);
}

void loop() {
for (int i = 0; i <=9; i++){
for (int j = 0; j <= 9; j++) {
data = dataArray[i][j];
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, data);
digitalWrite(latchPin, 1);
delay(3);
}
}
}

void shiftOut(int myDataPin, int myClockPin, word myDataOut) {

int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);

for (i=16; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
digitalWrite(myClockPin, 0);
}
これで、0123456789という数字が連続して表示されるはず。


dataArrayの中身を書き換えることで、数字以外にもアルファベットや漢字、ひらがな、記号などを表示させることができます。


「Talkspace」と表示させた例 (青い点はeneloopモバイルブースターのLEDランプ)

最終目標は自転車のホイールへの搭載なので、次は回転に同期させる部分を作っていきます。

PICでBluetooth SPP - UARTコンバータ

$
0
0

BluetoothのSPPが使えるモジュール、技適マーク付きの物を買うと5000円以上したりします。
これを市販のUSBドングル型Bluetoothモジュールを使ってなんとかしようというネタ。

使うのはPIC24FJ64GB002というUSB OTGが使えるマイコンで、今のところ買えるのはRSやDigiKeyを除いて共立電子のみ。


回路はこんな感じでOK
USBコネクタ部分の配線がよく分からない順番になってますが、実際は
1 - VCC
2 - D- (図の茶色線)
3 - D+ (図の黄色線)
4 - GND
という感じでAメスコネクタと配線してください。

電圧は3.3V。
PicKit3から電源供給する際はプロジェクトのプロパティから電源供給をONに。(MPLAB X)
Arduinoのシールド化する際は3.3Vから引きます。
(本当はあんまり良くないけど)RX/TXは直でArduinoと接続しても問題なし。

実際に使う場合は、右上のFTDI breakooutが繋がってるRX、TX、GNDをUART通信したいデバイスに接続します。


Arduinoと接続してAndroidとSPPで通信している様子。
ここでは、ONと送るとArduinoの13番pinのLEDが点灯、OFFと送ると消灯というスケッチをArudinoに書き込んでいます。

PIC側のプログラムは、hrdakinori氏のPIC24F_btstackをベースに、UARTからの受信をBuetooth SPPに渡すコードを追加すればOKです。

具体的にはこんな感じで、まずbt_spp.cのbt_spp_recive_callbackを以下の様な感じに。

int bt_spp_recive_callback(uint16_t channel, uint8_t *packet, uint16_t size)
{
packet[size] = 0;

//SPP to UART
UART2PrintString(packet);

return 0;
}

更に、main.cのsw_processを以下の様な感じに。

static int sw_process(struct data_source *ds)
{
if(IFS1bits.U2RXIF == 1){
char text[100]={0};
int i = 0;
char c = 0;

while(1){
while(U2STAbits.URXDA) {
c = U2RXREG;
text[i] = c;
i++;
}
if (c == '\n') break;
else if(c == 0) break; // if UART no Connect, break while(1)
}
text[i] = 0; //

//UART2PrintString(text); //debug and callback

//Bluetooth Send
bt_spp_send((uint8_t*)text,strlen(text));

IFS1bits.U2RXIF = 0;

if ( U2STAbits.OERR) {
U2STAbits.OERR = 0;
}
}
return 0;
}

あと、コンパイル時にundefined reference to packet_handlerが出るので、btstackのhci.c内のstatic void packet_handlerをvoid packet_handlerに変更します。

PICとのシリアル通信は57600bpsで、Bluetooth側は特に制約は無い(はず)。


こんな感じでSwitch Scienceさんのバニラシールドに載せてしまえば、Arduino UNOやMEGAのシールドとして普通に使えます。

Raspberry Piで秋月の無接点プッシュスイッチを使う

$
0
0
Web系のお仕事が山積みで、数ヶ月間更新出来ていませんでした;;
現在もガッツリ電子工作系に打ち込む時間が無いので、今回はベーシックな小ネタということで。


秋月電子で売ってる「無接点プッシュスイッチ(コード付)」を使う。
"機械的接点がない光学式の無接点プッシュスイッチです。デジタル出力型ICセンサ内蔵でドライブ回路に直結可能。"という説明の通り、ICが載ってるので出てる線はVCC、GND、OUTの3本です。
添付されていた参考資料によると、スイッチを押すとOUTがGNDに落ちるようになっていたので配線は以下。


これに加えてLEDを1個追加したので、図には入れてませんが、GPIO 17(pin11)から1kΩの抵抗を介してLED、GND(pin6)というのを入れています。

プログラム(Python with RPi.GPIO)はこんな感じで。
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN)
GPIO.setup(17,GPIO.OUT)

while True:
if (GPIO.input(4)):
GPIO.output(17,GPIO.LOW)
else:
GPIO.output(17,GPIO.HIGH)
ifとelseの中身を変えてあげれば何にでも使えますね。

もし、ボタンを押したらコマンドを叩く様にしたい場合は、
import RPi.GPIO as GPIO
import subprocess

GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN)
GPIO.setup(17,GPIO.OUT)

while True:
if (not GPIO.input(4)):
subprocess.call("shutdown -h now", shell=True)
みたいな感じにしてあげれば良いかも。
#このままだとボタンを押していると連続して叩いてしまうので、一回だけ実行するようにする必要ありです。

追記:pushCheck = Falseとか定義して、以下みたいな感じにすればOK

while True:
if (not GPIO.input(4) and not pushCheck):
pushCheck = True
print "Push!"
GPIO.output(17,GPIO.HIGH)
if (GPIO.input(4) and pushCheck):
pushCheck = False
GPIO.output(17,GPIO.LOW)

話は変わりますが、12/1に割と大きなネタがあるので、時期が近づいたら改めて告知します。

New Style Collection / かごしまITフェスタ

$
0
0

告知しますと言いながら事後報告になってしまいましたが... 鹿児島市主催のかごしまITフェスタにて色々やったのでご報告。
#ファッションショーなのにダサい格好で登壇しているっていうツッコミは勘弁;;

今回は、鹿児島県内の女子大生によるファッションショー企画団体Lily、鹿児島大学発のベンチャー企業freepとコラボして、音と光のファッションショーというものに協力させていただきました。

モデルが何らかの決めポーズ的なものをすると、それに合わせて効果音が流れるというものを製作。
技術的には、Arduino Fioと加速度センサ(ADXL345)、XBee Pro(ZigBee)で体(主に腕)のモーションを取得して送信&PCで受信、Processingで処理してモーション毎に音を鳴らすという仕組み。

コードに関しては色々と突貫で作ってる部分が多いので、時間が出来たら少し書き直して気が向いたら公開しようかなぁ...っと思っています。

Web系が大忙しで電子工作から離れつつある今日この頃...
そろそろニコ技にも進出したいところなので、ネタ探し中です。

SECCON CTF 2013 online予選

$
0
0
感想:難しかった

解けたのはforensics100と300だけ、あとはcrypt100の法則に気がついた(ソルバー書いたのは後輩)のとforensics200の仕様を発見した(スクリプト書いて回したのは後輩)くらいしか貢献できませんでした...

とりあえずforensics300だけメモしておきます。(追記:最下部にWriteUpへのリンクをまとめました)

問題:ログインパスワードを解明せよ
調査対象パソコンのユーザー名Forensicsのパスワードが不明な状態です。 システムの電源を落とす前に、win32ddにより、メモリ全体のイメージファイル(RAW形式)が取得されています。 このイメージファイルを解析し、ユーザー Forensics のWindowsへのログオンパスワードが何かを特定してください。
メモリをダンプした対象システムは Windows 7, x86(32bit)です。
Memorydump2.rar

参考にしたのは
http://cyberarms.wordpress.com/2011/11/04/memory-forensics-how-to-pull-passwords-from-a-memory-dump/

Volatility 2.3.1 Standaloneを使いました。
https://code.google.com/p/volatility/downloads/list

Windows 7 x86とのことなので、

C:\Users\keiichiro\Desktop>volatility hivelist -f Memorydump2.bin --profile=Win7SP0x86
Volatility Foundation Volatility Framework 2.3.1
Virtual Physical Name
---------- ---------- ----
0x9ff5a3c0 0x37fbb3c0 \SystemRoot\System32\Config\SECURITY
0x9ffc03a0 0x30e243a0 \SystemRoot\System32\Config\SAM
0x8f60c568 0x04bbc568 [no name]
0x8f61c008 0x005d2008 \REGISTRY\MACHINE\SYSTEM
0x8f6448d8 0x04b3c8d8 \REGISTRY\MACHINE\HARDWARE
0x90659650 0x199c0650 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0x906d8008 0x13200008 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0x93cf5008 0x38814008 \Device\HarddiskVolume1\Boot\BCD
0x93d479d0 0x388c19d0 \SystemRoot\System32\Config\SOFTWARE
0x989bc008 0x37920008 \SystemRoot\System32\Config\DEFAULT
0x9e6e69d0 0x005469d0 \??\C:\Users\forensics\ntuser.dat
0x9efe5650 0x028aa650 \??\C:\Users\forensics\AppData\Local\Microsoft\Windows\UsrClass.dat

SAMとSYSTEMの番地が分かったので、これを使って

C:\Users\keiichiro\Desktop>volatility hashdump -f Memorydump2.bin --profile=Win7SP0x86 -y 0x8f61c008 -s 0x9ffc03a0 > passhashs.txt

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
forensics:1000:aad3b435b51404eeaad3b435b51404ee:98ffdb1b29e7c88954326cd4011141d8:::

ophcrackにrainbow table(vista_free)を読ませてpasshashs.txtを投入すると3秒くらいで出ました。


最後はforensicsの500をいじってましたが、500点問題となるとうまくはいかないもんですね...

その他は、よくできる後輩のブログ記事をご確認ください。(なげやり
開始前にこんな事↓言ってたら
マジでpcap問題は全部解いちゃうカッコイイ後輩くんです。尊敬してます。
http://blog.y1r.org/archives/48

追記:以下に参考になるWrite-upを貼っていくことにします。

見つけ次第、更新していきます。

フォレンジックス
[100] ここはどこ?
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 http://mrt-k.hateblo.jp/entry/2014/01/26/153934
 http://senz.hatenablog.com/entry/2014/01/26/144304
 http://misodengaku.hatenablog.com/entry/2014/01/27/032047
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[200] 削除されているファイルの名前は何ですか?
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 http://gomiba.co.in/blog/archives/351
 https://mimumimu.net/blog/2014/01/27/seccon-ctfweb%E4%BA%88%E9%81%B8%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8C%E3%82%93%E3%81%B0%E3%81%A3%E3%81%9F/
[300] ログインパスワードを解明せよ
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 http://gomiba.co.in/blog/archives/342
 https://mimumimu.net/blog/2014/01/27/seccon-ctfweb%E4%BA%88%E9%81%B8%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8C%E3%82%93%E3%81%B0%E3%81%A3%E3%81%9F/
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
 http://eleclog.quitsq.com/2014/01/seccon-ctf-2013-online.html (この記事)
[400] QRコードの断片を読み取れ
 http://eleclog.quitsq.com/2014/01/seccon-ctf-2013-online-forensics-400.html
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[500] CVE-2011-2484

プログラミング・crypt 
[100] calculate it / 計算せよ
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 http://math314.hateblo.jp/entry/2014/01/26/135814
[200] 数「毒」ちゃれんじ★
 http://sc123.hatenablog.jp/entry/2014/01/26/122313
 http://math314.hateblo.jp/entry/2014/01/26/135814
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[300] Cryptanalysis
 http://math314.hateblo.jp/entry/2014/01/26/135814
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[400] TicTacLogic
 http://math314.hateblo.jp/entry/2014/01/26/135814
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[500] 古典暗号ちゃれんじ★
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 http://math314.hateblo.jp/entry/2014/01/26/135814
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127

バイナリ
[100] Enjoy the Game
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 https://mimumimu.net/blog/2014/01/27/seccon-ctfweb%E4%BA%88%E9%81%B8%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8C%E3%82%93%E3%81%B0%E3%81%A3%E3%81%9F/
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
 http://d.hatena.ne.jp/aki33524/20140126/1390761307
[200] exploit me
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
 http://d.hatena.ne.jp/aki33524/20140126/1390761307
[300] RISC processor
 http://orumin.blogspot.jp/2014/01/seccon-ctf-2013-online-wirteup.html
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[400] Enter 8-char password to the interpreter
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
[500] Hack this site
 http://pastebin.com/EY0gSCYe

ネットワーク・Web
[100] repeat after me
 http://takahoyo.hatenablog.com/entry/2014/01/26/184133
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[200] Find the key!
 http://senz.hatenablog.com/entry/2014/01/26/144304
 http://takahoyo.hatenablog.com/entry/2014/01/26/184133
 http://misodengaku.hatenablog.com/entry/2014/01/27/032047
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127
[300] Hidden Message?
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 http://takahoyo.hatenablog.com/entry/2014/01/26/184133
 http://misodengaku.hatenablog.com/entry/2014/01/27/032047
[400] SECCON競馬
 https://gist.github.com/tyage/8628077
[500] 箱庭XSS Final
 http://gomiba.co.in/blog/archives/354
 http://d.hatena.ne.jp/Dltn/20140126/1390708058
 http://dec12-kaz.hatenablog.com/entry/2014/01/26/170218
 http://misodengaku.hatenablog.com/entry/2014/01/27/032047
 http://d.hatena.ne.jp/kusano_k/20140126/1390761127

その他
[100] 練習問題
 http://yagihashoo.com/archives/596
[200] Encode me.
 http://orumin.blogspot.jp/2014/01/seccon-ctf-2013-online-wirteup.html
 http://dec12-kaz.hatenablog.com/entry/2014/01/26/170218
[300] Crossword Puzzle
 http://dec12-kaz.hatenablog.com/entry/2014/01/26/170218
[400] solve the steganography
 http://wataamectf.blogspot.jp/2014/01/seccon-ctf-2013-onlinewriteup.html
 http://d.hatena.ne.jp/aki33524/20140126/1390761307
[500] Secret of Galaxy / 銀河の秘密

リンク貼られたら困る!という方はコメント欄か@9GHzに「リンクするなアホ」とお伝えください。
追加もコメント欄か@9GHzまでお願いします。

SECCON CTF 2013 online予選 forensics 400

$
0
0
SECCON CTF 2013 オンライン予選のフォレンジックス400点の解法です。
競技中は解けませんでしたので、終わってからじっくり解いてみました。

問題:QRコードの断片を読み取れ
富士山麓で焼け落ちたQRコードの断片が発見された。 損傷が激しい。内容を復元することはできるだろうか?
qr-photo.jpg

QRコードの仕様について詳しく知らなかったので、調べました。
http://ja.wikipedia.org/wiki/QR%E3%82%B3%E3%83%BC%E3%83%89

・バージョンがある(1〜40)
誤り訂正レベルがある(L,M,Q,H)
・モードがある(数字、 英数字、8ビットバイト、漢字)
・どのモードを使っているかを表すモード指示子がある
・文字列/データの長さを表す文字数指示子がある
・QRコードは読み取り精度を高めるためにマスク処理が行われている
・どのようなマスクが掛かっているかを表すマスクパターン参照子がある

Wikipedia英語版では図解で説明されていました。
http://en.wikipedia.org/wiki/QR_code


QRコードの3つの角に付いてるマーカー、そのうち左側のマーカーの周りには、誤り訂正レベル(Error Correction Level)、マスクパターン参照子(Mask Pattern)、誤り訂正レベルとマスクパターン参照子から算出した訂正ビット(Format error correction)が配置されています。
残る1つ、右上のマーカーの下には、この訂正ビットの下8ビットが配置されています。

ここまでで分かったことは...
QRコードにはマスクが掛かっているが、どのマスクパターンが掛かっているかはマスクパターン参照子が無いと分からない。
→でも、写真のQRコードには左半分が無いから、マスクパターンの種類は分からない。
→ついでに誤り訂正レベルも分からない。

ここで、英語版Wikipediaにある次の画像に注目しました。
誤り訂正レベルHでバージョン3のQRコードのコード配置の説明画像です。


とりあえず、これに写真のQRコードを合成してみよう...


なんと、ドットのサイズも配置もバッチリじゃないですか...
どうやら、写真に写っているのはバージョン3らしく、誤り訂正レベルHのQRコードと仮定すればデータ領域は全部残っているとみることが出来そうです。
誤り訂正はできませんが、この部分が読み取れれば何とかなりそう。
しかし、マスクが被さっているので、このまま読んでも意味が通じません。
→なんとかしてマスクパターンが知りたい
→右上のマーカーの下(上図の赤い部分)に付いている訂正ビットの下位8bitは分かる!

左が上位ビットらしいので、これを読むと、下位8bitは10001001と分かります。

http://www.swetake.com/qrcode/qr5.html
http://www.swetake.com/qrcode/qr6.html

↑こちらのサイトによれば、誤り訂正レベル(Error Correction Level)、マスクパターン参照子(Mask Pattern)、誤り訂正レベルとマスクパターン参照子から算出した訂正ビット(Format error correction)を形式情報と呼び、15bitで表現されるようです。
15bitのうち、最初の5ビット(誤り訂正レベル2bit+マスクパターン参照子3bit)をBCH符号化したものが10bitの訂正ビットで、最初の5bitとBCH符号化した10bitを引っ付けた15bitを更に101010000010010とXORしたものがQRコードに刻まれるとのこと。

ここで、誤り訂正レベルをH(上位2bitが10)と仮定すると、マスクパターンは全てで8種類なので...
10000、10001、10010、10011、10100、10101、10110、10111をBCH符号化して求めた10bitの訂正ビットをそれぞれに付け、これをXORしたものの下位8bitが10001001であるものがあれば、マスクパターンを特定することができます。


というわけで、計算すると下位8bitが一致するのはマスクパターン参照子000となります。
写真QRコードと判明した形式情報からQRコードを描くと、以下になります。
(まだリーダーなどでは読み込めません)


マスクパターン参照子000のマスクは(i+j) mod 2 = 0なので、マスクは市松模様のようになります。
もう一度マスクを掛ければ元に戻るので、上記のQRコードのマーカーと形式情報を除外した場所を市松模様状にマスクを掛け、先ほどのコード配置図を合成すると、以下のようになります。


D1からD26まで、ビット配置の規則に従って読んでいくと、


http://www.swetake.com/qrcode/qr2.html

↑こちらサイトによれば、最初の4bitはモード指示子で、この場合は0010なので英数字モード、次の9bitが文字数指示子で000100011なので10進数にすると35文字ということになります。
それ以降は11bitずつ区切れば良いそうで、区切った11bitを10進数に変換すると以下の通り。
(35文字なので、最後の1文字だけ上位6bitを読んで10進数に変換)


この10進数の値は英数字2文字分で、1文字目のコードに45掛けた数値と2文字目のコードの和になっているとのこと。
(文字コード対応表は下記)


という訳で、全てのパターンを計算しました。安定のC(白目

#include <stdio.h>

int main(void) {
int i,j;
for(i=0;i<=44;i++){
for(j=0;j<=44;j++){
printf("45*%d+%d=%d\n",i,j,45*i+j);
}
}
return 0;
}

実行結果は下記
http://ideone.com/phmtrx

必ず一意の数値になるので、10進数に直した数字で一覧を検索すると下記のように対応します。


並べると「CONGRATS. FLAG IS VIVA REED-SOLOMON」で、Keyは「VIVA REED-SOLOMON」となります。

おまけ:完全復元したQRコード
感想:QRコードを学べる良い機会になりました!
(もう二度とQRコード印刷した紙を燃やしたりしないでください >Kちゃん先生)

MP268 FR4 ワイヤレス給電モジュール

$
0
0

久々の電子工作系のネタ(といっても工作じゃありませんが...)
dealextremeでワイヤレス給電のモジュールが売ってあったので、2種類買ってみました。
1つめは特に規格などが定められてないMP268 FR4 DIY Wireless Power Supplyというもので、もう1つはqi規格に対応したモジュール... なのですが別々に発送されて先にMP268が届いたので、こちらから先に調べてみました。

中身は上の写真の通り。
給電モジュールと受電モジュールのセットで、受電側は何かに貼り付けられるように両面テープみたいになってます。
ちなみに、受電モジュールの正極側のリード線が付いてなかったので、この後自分で付けました...

説明書によれば入力はDC12Vとのことですが、商品ページには10〜12Vとか9〜12Vとか色々書いてあるので、とりあえず試してみました。
直流安定化電源は菊水のPMC18-3Aです。

左上12V、右上9V、左下7V、右下5V。



7Vくらいまでは大丈夫そう。(余裕を見れば9V〜12Vといったところでしょうか)
いずれもコイル間の隙間がほぼゼロの状態なので、実際に何かに組み込む際はもう少し下がるでしょう。

以下は実際にLEDを繋いでみた&スマートフォンを繋いでみた動画。(入力は12V)



実用的で夢拡がる感じなのは良いとして、何に組み込もうか...

追記:説明書の裏に使用用途例が書いてありました。(なぜ気づかなかった?)


赤外線LEDとフォトトランジスタでシリアル通信

$
0
0

久々のArduinoネタ。
赤外線LED(OSI5FU5111C-40)とフォトトランジスタ(L-51ROPT1D1)を使ってシリアル通信をする。
最終的にATtiny85に載せる計画なので、SerialではなくSoftwareSerialを使っています。

送信側はこんな感じ。
普通のLEDと同様に抵抗1本を入れる。


受信側はこんな感じ。
トランジスタ(2SC1815)を入れてD10に接続。


これを向かい合わせにして、配置する。


プログラムは以下のような感じ。
送信側
#include <SoftwareSerial.h>

SoftwareSerial sender(10, 11);

void setup() {
sender.begin(1200);
}

void loop() {
sender.println("Hello World!");
delay(1000);
sender.println("1234567890");
delay(1000);
sender.println("abcdefghijklmnopqrstuvwxyz");
delay(1000);
}

受信側
#include <SoftwareSerial.h>

SoftwareSerial receiver(10, 11, false);

void setup() {
receiver.begin(1200);
Serial.begin(9600);
}

void loop() {
if (receiver.available()) {
Serial.write(receiver.read());
}
}

送信側のプログラムは、「Hello World!」→「1234567890」→「a〜z」を1s毎に出力、受信側は赤外線で受け取ったデータをSerialにそのままフォワーディングするような感じ。
仕組み的には独自のプロトコルではなく、Serial(SoftwareSerial)を使っているので特に複雑な訳でもなくサクッと使えるのが利点。

環境にもよると思いますが、この構成だと約20cmくらいまで離しても通信できました。
通信距離を伸ばすには赤外線LEDの球数を増やす、電圧を上げる(もちろん高出力タイプに置換した上で)等で出力を強くする必要あります。

次の記事では送受信×2で双方向(全二重)を実現させます。

続・赤外線LEDとフォトトランジスタでシリアル通信

$
0
0

前回の続き。
赤外線LED(OSI5FU5111C-40)とフォトトランジスタ(L-51ROPT1D1)を使ったシリアル通信。
今回は、送受信×2で双方向(全二重)通信を実現させます。

構成は...
PC <---Serial---> Arduino <---赤外線---> Arduino <---Serial---> PC
こんな感じ。

前回のものを一体化して、以下のようにする。

これを2個用意し、互い違いになるように向かい合わせて配置。


プログラムは以下の通り。

#include <SoftwareSerial.h>

SoftwareSerial irPort(10, 11, false);

void setup() {
irPort.begin(1200);
Serial.begin(9600);
}

void loop() {
int i = 0;
char c;
char buf[100];
if(Serial.available()){
while(Serial.available()){
c = Serial.read();
buf[i] = c;
i++;
buf[i] = '\0';
delay(2);
}
irPort.print(buf);
}

if (irPort.available())
Serial.write(irPort.read());
}

最初はSerialから赤外線へ渡す部分を
if (Serial.available()) {
irPort.write(Serial.read());
}
こんな感じにしていたけど、これだとループの早さにSerial.readが追いつかないっぽい。
abcdefgと送るとabcgになる等、データが途中で抜けたりするので一旦バッファに全部溜めてからprintするようにしました。
ちなみに、上記コード中のdelay(2)を取ると、途中が抜けたり最初の3文字くらいしか取れない現象が発生するので、やはりSerial.readが原因の模様。
当初のコードのirPort.writeの前行にdelayを入れるのも試してみたが、10msくらいにしないとダメだったので、バッファに溜めた方が早いかなと。

上記写真のような配置で距離を離して双方同時に送信すると、互いが干渉して文字抜けや化けが発生するので、実際は間に遮蔽を入れるなどの工夫が必要。
試しに紙を1枚入れてみたら安定して通信できました。

ATtiny85で赤外線シリアル通信

$
0
0

前回前々回の続き。
赤外線LED(OSI5FU5111C-40)とフォトトランジスタ(L-51ROPT1D1)を使ったシリアル通信をATtiny85で実現させます。
さらに、このATtiny85とArduinoをI2Cで接続し、I2C-赤外線通信コンバーター化します。

構成はこんな感じ。

ATtiny85の各ピンは以下の通り。

pin1 - RESET
pin2 - Serial RX (from フォトトランジスタ)
pin3 - Serial TX (to 赤外線LED)
pin4 - GND
pin5 - I2C SDA (Arduino A4)
pin7 - I2C SCL (Arduino A5)
pin6 - not used(D1)
pin8 - VCC

pin6が空いているので、更に何か追加することもできますが、今回は未使用。

ATtiny85をArduinoとして扱う方法は「Programming an ATtiny w/ Arduino 1.0」 を参考にしました。
書き込みはaitendoで購入し、以前の記事でファームウェアのアップデートを行ったUSBasp-Bを使用。
ATtiny85は内蔵RC 8MHz駆動です。

プログラムは以下の様な感じ。(たぶんもっとキレイに書けるはず...)

#include <SoftwareSerial.h>
#include "TinyWireS.h"

#define I2C_SLAVE_ADDR 13
#define IR_RX 3 // pin2
#define IR_TX 4 // pin3

SoftwareSerial irPort(IR_RX, IR_TX, false);

void receiveEvent(uint8_t a) {
int i = 0;
char c;
char buf[100];
if (TinyWireS.available()) {
while(TinyWireS.available()){
c = TinyWireS.receive();
buf[i] = c;
i++;
buf[i] = '\0';
delay(2);
}
irPort.write(buf);
}
}

void requestEvent() {
if(irPort.available()){
char c = irPort.read();
if(c!=255)
TinyWireS.send(c);
}
}

void setup() {
TinyWireS.begin(I2C_SLAVE_ADDR);
irPort.begin(1200);

TinyWireS.onReceive(receiveEvent);
TinyWireS.onRequest(requestEvent);
}

void loop() {

}

Arduino UNO側はこんな感じ。

#include <Wire.h>

void setup(){
Serial.begin(9600);
Wire.begin();
}

void loop(){
if(Serial.available()){
int i = 0;
char c;
char buf[100];
while(Serial.available()){
c = Serial.read();
buf[i] = c;
i++;
buf[i] = '\0';
delay(2);
}
Wire.beginTransmission(0); //broadcast
Wire.write(buf);
Wire.endTransmission();
}

Wire.requestFrom(13,1);
if(Wire.available()){
byte b = Wire.read();
if(b!=0xff && b!=0x0a && b!=0x00)
Serial.write(b);
}
}

これで、一番上の写真のように向かい合わせにして赤外線通信ができます。
UNO側のコードでbroadcastにしているのは訳があって、このあとATtiny85を複数個ぶら下げる予定。

桜島が噴火したYoを作った

$
0
0

鹿児島県の桜島が噴火(爆発)したときに「Yo」で通知してくれる仕組みを作ってみた。

QuitSquare » 桜島が噴火したYo
http://www.quitsq.com/sakurajima_yo/

使い方 
  1. Yoを起動します。
  2. 「SAKURAJIMA」にYoを送信します。
  3. 終わりです。
以降、桜島が噴火する度にYoが送信されます。
解除したい場合はSAKURAJIMAをブロックしてください。


実際にはこんな感じでYoが来る。
2014年 8月11日 15時01分 (今年199回目)の爆発時の通知なのですが、時刻を見れば分かるとおり15分遅れてます。
これは自分の書いたプログラムとかYo APIの遅延じゃなくて、気象庁が電文を公開するまでの時間なので、こちら側で何とかできる訳ではありません。
だいたい10〜15分程度は遅れるようなので、噴火「速報」的な使い方は全く保証できません。
が、実際噴火してから降灰するまでには時間があるので、降灰注意には使えるかも。

後ろの仕組みは簡単。
気象庁発表の電文をパース、桜島が噴火もしくは爆発した第1報を元にYo APIを叩くというもの。
Javaで書いてるのですが、ちゃっちゃと書いたせいで汚いのでキレイキレイしてから公開します。

他にも桜島の噴火情報を利用したサービスを考え中なので、そのうち作るかも...
その時は気象庁防災情報XMLについても書く予定。

桜島が噴火したYoの裏側

$
0
0

作ってから1週間くらい経ってますが、プログラムの紹介というか詳解というか...
実は初めてのJava Servlet(&Tomcat)だったんですが、Eclipseからwar書き出して置くだけでdeploy完了というのは素晴らしい。
#小5の頃にPerlでCGI書いて動いた時くらいの感動

で、実際の仕組みは...
  1. 気象庁からPuSH(PubSubHubbub)で来るfeedを受け取る
  2. entryをSAX(Simple API for XML)で解析する
  3. 桜島に関する情報(噴火 or 爆発第1報)の場合はYoを送信
という感じ。

気象庁が公開している気象庁防災情報XMLフォーマットについては、下記を参照。
http://xml.kishou.go.jp/open_trial/

PubSubHubbubは以下。
https://code.google.com/p/pubsubhubbub/

ここ↑にはJavaで書かれたSubscriber Clientsの紹介もあるのですが、こちらはServletじゃないです。
特にServletに対するこだわりは無いけど、最近Scalaとかに興味あるのでWebサービスを書く為のJavaを学んでおこうかと...

セキュリティ上の都合で全てのコードを公開できる訳ではないのですが、PuSHの購読&受信とfeedの解析部分は以下の様な感じ。
#例のごとく酷いコードなので参考までに...

上がSAXハンドラ、下がPuSHサブスクライバです。
#Gistってファイル単位でバラしてコード貼り付けできないのね... (今更

実際には、このSAXハンドラのpublic void characters内で「現  象:噴火」「第1報 現  象:爆発」がcontent要素内に含まれる場合に分岐させてYoを送るメソッドを呼んでます。
それと、これも上記コードには含まれてませんが、受け取ったfeedに記載された全てのxmlは取得&保存しています。
#つまり、天気予報とか天気概要とか注意報警報なども"現在は"使ってないけど、保存はしてるっていうこと。

先日のYoアップデートの際にURLの添付が可能になったのですが、これに伴って噴火の詳細情報をYoにくっつけて送るアップデートをしようかなぁっと。
現在フロントエンドを書いてる途中で、これの仕組みは、保存されたxmlをパースして表示するだけですね。はい。

これに並行して、WebSocketでpushを... なんてのも準備中。
PuSHはネット上からアクセス可能なサーバでしか受けられないので、これを転送したいなぁっと。
これができると、噴火したら火口が赤LEDで光る桜島オブジェなんてものも作れちゃう訳です。

そういえば2週間弱くらい大学行って研究してない気がするけど... アッ(

新装整備品Thinkpad X230 Tabletを購入

$
0
0

発売当初から欲しかったThinkpad X230 Tabletを買いました。
開封済み・新装整備品でお値段は54000円(税込)で、色々遊ぶには最高なんじゃないかと考えてたらポチってました。

ThinkPad X230 Tablet - 開封済み・新装整備品 | 3436XF1 | Lenovo Outlet (JP)
http://shopap.lenovo.com/jpoutlet/itemdetails/3436XF1/445/628C87959CB248F78E23CB2244F4AEC9

実際に買ったのは1ヶ月くらい前だけど、色々追加したり環境整えたりする作業をダラダラやってたので今更まとめということで。

その1:無線LANカードが載ってない

無線系はBluetoothしか載ってないので、無線LANカードを買って増設しました。
アンテナ線は3本(黒、灰、白)来てるので、WiMAXのカードとか3本アンテナ必要なカードとかも刺せる。
ちなみに、WWAN用のアンテナ線も2本来てます。(青と赤)
WWANカードを載せないなら、mSATA SSDカード用に使える。(ただし、SATA2の速度までしか出ない)


買ったのはIntel Centrino Advanced-N 6205。
FRU品じゃないとBIOSで弾かれるので60Y3253という型番のカードを買いました。
お値段2158円。

その2:メモリ搭載量が少ない

流石に2GBは少ないので、換装します。
Lenovoのサイトには2GB (空スロット:0)と書いてあるけど、実際には2GBが1枚刺さってるので、トータル4GBでよければ2GBを刺すのもあり。


まぁ、ここは積めるだけ積んでおこうということで8GB*2枚の16GBを買いました。
お値段14796円。
#エルピーダが死んでから高騰が激しくて辛いですね...

ここまでで、トータル71054円。
来月辺りで320GBのHDDを512GBのSSDに換装しようと考えているので、最終的には10万円弱になりそうですが...
デジタイザ搭載マシンが欲しかった&VMでは無い純粋なWindows機が欲しかったので、どちらも達成できて満足。
Linux走らせて遊ぶだけなら無線LANカードを追加するくらいで十分そう。

ここ数年ずーっとMacしか買ってなかったので、バラバラ分解可能でバッテリーも取り外せるThinkpadが斬新すぎる。
特に最近のMacBook系なんてRAMまでオンボだし...

そのうちmSATAなSSDでも買ってLinuxとデュアルブートにしたいなぁ

X230tのHDDをCT512MX100SSD1に換装

$
0
0

前回、新装整備品のThinkPad X230 Tabletを買った記事を書きましたが、今回はこれのHDDを512GBのSSDに換装した話。
今回購入したのは、割と評判が良くて安価なCrucial CT512MX100SSD1です。
CrucialはMicron Technologyのブランドなので信頼性は高いイメージ。

まずは、現在入っているHDDからSSDにデータを移行します。
これには、CT512MX100SSD1に付属しているAcronis True Image HDを使ってディスククローンしてあげればOK。


USB-SATAケーブルはaitendoの実店舗で980円くらいで売ってあった(気がする)もの。
2.5インチサイズまでしか電源の関係で駆動できないけど、1本持ってると便利。


Acronis True Image HDは現在稼働中のWindowsが入っているHDDにインストールして使います。
自身が入っているディスクをクローンする時は、再起動後に独自のシステムが起動してクローンしてくれます。

クローンが終了したら、スタイラスペンが収納されている側にあるHDDスロットカバーをプラスドライバーで開けて、ベロを引っ張り古いHDDを引き抜きます。
レールを外して同じようにSSDに付け替え、元の様にスロットに戻し、スロットカバーを閉めれば終了。

手順を何も間違っていなければ、電源ONで今まで通りの環境が立ち上がるはずです。

ちなみに元から入っていたHDDはHGSTのHTS545032A7E380でした。
リカバリディスク製作済みorリカバリ領域もクローン済みなら、初期化して外付けHDDケースなどに入れて使うのも良いかも。(ただし5400rpmなので読み書きは遅め)

X220にArch Linuxを入れた時の覚書

$
0
0

ThinkPad X220にArch Linux、Xfceなどを入れて諸々の設定を行った時のメモ。
地味に初Archです。#普段はサクッとFreeBSDをインストールする派

使用したX220は、Core i5 2520M 2.5GHz、RAM 4GB(2GB*2)、HDD 320GBという構成のモデルナンバー4290RW4、2011年春発売のモデル。
指紋センサーあり、カメラは無し、無線LANはCentrino Advanced-N 6205を搭載、液晶は非IPSで視野角狭めな感じの、ベーシックタイプ。
これのHDDをIntel SSD 320 120GBに換装して、Arch Linuxをインストールしました。

インストール自体は既にネット上に大量にある情報とほぼ変わらないが、
・UEFI+GRUB
・指紋認証
・ファンコントロール
・音量ボリュームキー他の有効化
の4つは結構大事な情報で、これらも含めてまとまっている情報が無かったので、ここに残すことに。


Chrome、Eclipse、Wireshark等々を入れて落ち着いた状態が↑これ
スッキリ、シンプルで非常に快適。

以下、インストール時に行った操作など、まとめ。

https://www.archlinux.org/download/
から最新のイメージをダウンロードして、USBにddで書き込み。
$ sudo dd if=archlinux-2014.10.01-dual.iso  of=/dev/rdisk1 bs=1m
これをX220のUSBポートに刺して、電源ON
BIOSに入って Startup→UEFI/Legacy BootをUEFI Onlyに。
Restart→Exit Saving Changes→Yesで再起動。

起動したらキーマップを設定、今回はWi-Fiでネットに接続、インストール作業は同一LAN内のMacからSSHで行う。
# loadkeys jp106
# wifi-menu
# ip addr
# passwd
# systemctl start sshd
ここからはMacで続行。
$ ssh root@10.0.1.30

パーティションを切る

# lsblk
# cgdisk /dev/sda

こんな感じにしてみた。
swapが必要なら末にでも追加すれば良いかと。

フォーマット

# mkfs.vfat -v -F 32 /dev/sda1
# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/sda3

マウント

# mount /dev/sda3 /mnt
# mkdir /mnt/boot
# mount /dev/sda2 /mnt/boot
# mkdir /mnt/boot/efi
# mount /dev/sda1 /mnt/boot/efi

ミラーリスト編集とインストール

# nano /etc/pacman.d/mirrorlist
Japanのサーバ2つ(JAISTと筑波)をカットして一番上にペースト
# pacstrap /mnt base base-devel 
# genfstab -U -p /mnt >> /mnt/etc/fstab
# arch-chroot /mnt /bin/bash
# nano /etc/locale.gen
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
をコメントアウト
# echo LANG=ja_JP.UTF-8 > /etc/locale.conf
# export LANG=ja_JP.UTF-8
# echo KEYMAP=jp106 > /etc/vconsole.conf
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc
# echo "Qs-TPX220"> /etc/hostname
「Qs-TPX220」のところは適当な名前で。
(自分の所有するマシンは頭にQs-、その後にマシンモデル名を付与している)
# pacman -S openssh
# systemctl enable sshd.service
# passwd
# mkinitcpio -p linux

ブートローダの設定

# pacman -S grub efibootmgr os-prober
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck
# grub-mkconfig -o /boot/grub/grub.cfg
# mkdir /boot/efi/EFI/boot
# cp /boot/efi/EFI/arch_grub/grubx64.efi /boot/efi/EFI/boot/bootx64.efi

起動後に向けた設定

無線LANが使えるようにWi-Fi周りのツールを入れて、自動で無線接続するようにする。
# pacman -S wireless_tools wpa_supplicant wpa_actiond dialog
# systemctl enable netctl-auto@wlp3s0
# systemctl enable dhcpcd.service

ユーザ作成

# useradd -m -g wheel keiichiro
# passwd keiichiro(自分のユーザネーム)
# visudo
以下のコメントアウトを外す
Defaults env_keep += "HOME"
%wheel ALL=(ALL) ALL
# exit
# umount -R /mnt
# reboot

電源が落ちたら、ThinkPadロゴが表示される前にUSBを抜いて、起動を待つ。
起動後、再びMacからSSHでログイン
$ ssh keiichiro@10.0.1.30
$ su

Xのインストール

# pacman -S xorg-server xorg-server-utils xorg-xinit xorg-xclock xterm
# pacman -S xf86-video-intel

SLiMのインストール

# pacman -S slim slim-themes archlinux-themes-slim
# nano /etc/slim.conf
以下のコメントアウトを外す
daemon yes

以下を変更
#current_theme       default
current_theme       archlinux-simplyblack
# systemctl enable slim.service

Xfceのインストール

# pacman -S xfce4 xfce4-goodies gamin
# cp /etc/skel/.xinitrc ~/
# nano ~/.xinitrc
以下のコメントアウトを外す
exec startxfce4
# exit
(個人ユーザでも行う)
$ cp /etc/skel/.xinitrc ~/
$ nano ~/.xinitrc
以下のコメントアウトを外す
exec startxfce4

Yaourtの導入

$ sudo nano /etc/pacman.conf
以下を追加

[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch

[pnsft-pur]
SigLevel = Optional TrustAll
Server = http://downloads.sourceforge.net/project/pnsft-aur/pur/$arch

以下のコメントアウトを外す

[multilib]
Include = /etc/pacman.d/mirrorlist
$ sudo pacman --sync --refresh yaourt
$ sudo pacman -Syu

日本語フォントなどのインストール

$ yaourt -S ttf-ricty

省電力設定

$ sudo pacman -S tlp
$ sudo systemctl enable tlp

ブルートゥース

$ sudo pacman -S bluez bluez-utils
$ sudo systemctl enable bluetooth
$ sudo systemctl start bluetooth

指紋認証

$ sudo lsusb
Bus 001 Device 003: ID 147e:2016 Upek Biometric Touchchip/Touchstrip Fingerprint Sensor

$ sudo pacman -S fprintd libfprint pam
$ sudo fprintd-enroll keiichiro
$ sudo nano /etc/pam.d/system-local-login
先頭に
auth sufficient pam_fprintd.so
を追加

ファンコントロール

$ sudo pacman -S lm_sensors
$ sudo sensors-detect
$ yaourt -S thinkfan
$ sudo nano /etc/thinkfan.conf
hwmon /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input
(0,     0,      45)
(1,     43,     50)
(2,     48,     55)
(3,     53,     60)
(4,     58,     65)
(5,     63,     70)
(6,     68,     75)
(7,     73,     80)
(127,  78,     32767)

$ sudo nano /etc/modprobe.d/thinkpad_acpi.conf
以下を書き込んで保存
options thinkpad_acpi fan_control=1
$ sudo systemctl enable thinkfan.service
$ sudo systemctl start thinkfan.service
$ sudo systemctl status thinkfan.service

音量ボタン

$ yaourt -S xfce4-volumed
$ sudo pacman -S alsa-utils

Xfceのアプリケーションメニュー→設定→キーボード→アプリケーションショートカットキー 以下を追加
amixer set Master 5%+
amixer set Master 5%-
amixer set Master toggle



途中から雑になってるので、ぼちぼち綺麗に読みやすく書き直して、説明なども入れていく予定です。

OpenLayers 3でOpenStreetMap上にピンを打つ

$
0
0
OpenLayers 3を使って、緯度経度で指定したポイントやポイントを結んだ形の図形をOpenStreetMap上に表示してみた。
OpenLayersは2から3へのアップデートで結構変わってる上にドキュメントは微妙、日本語での解説は2ばかりという状況なので、色々と試しながらです。

問題点は
・OpenStreetMapは球面メルカトル図法(EPSG:3857)で描画される
・ポイントは緯度経度(WGS84/EPSG:4326)で示したい
・EPSG:3857とEPSG:4326のレイヤーは同時に表示できない

最終的には
format: new ol.format.GeoJSON({
defaultProjection: 'EPSG:4326'
}),
projection: 'EPSG:3857',
みたいな感じで解決できました。

以下、ソースコード

GeoJSONの仕様は
http://s.kitazaki.name/docs/geojson-spec-ja.html
を参考に。

上記コード内では、textで直接GeoJSONを書き込んでいるが、実際はurlで外部からjsonファイルを引っ張ってくる使い方が一般的(のはず)。

ちなみに、Polygonは閉路になる順にcoordinatesを指定してしないと捻れちゃうので、その辺も要注意。
そういうのを踏まえて、投げられた複数のジオタグから凸包を描くようなGeoJSONを吐くプログラムを現在製作中...
Viewing all 81 articles
Browse latest View live