2012/04/04

python socket reset

明日こそは散髪に行こうと思っています!!

何がしたかったの? と聞かれてもマイッチングのですが
"python socket reset" で検索してました。
reset できるようになりたかったみたいです。
そんな質問には stackoverflow がさくっと答えてくれますよ

http://stackoverflow.com/questions/6439790/sending-a-reset-in-tcp-ip-socket-connection

SO_LINGER ってのを使えって書いてあるけど何じゃらほい。
ググるよ。

TCPメモ(Hishidama's TCP Memo)

ほー。SO_LINGER ってのを on で 0 に指定して close() しろと。
でも SO_LINGER って何じゃらほい? と思ってもう少し調べたけど、
結局 man に辿りついちゃうのよね。

Man page of SOCKET
SO_LINGER
SO_LINGER オプションを取得・設定する。引き数には linger 構造体を取る。
struct linger {
    int l_onoff;    /* linger active */
    int l_linger;   /* how many seconds to linger for */
};
有効になっていると、 close(2) や shutdown(2) は、そのソケットにキューイングされたメッセージがすべて送信完了するか、 linger (居残り) タイムアウトになるまで返らない。無効になっていると、 これらのコールはただちに戻り、クローズ動作はバックグラウンドで行われる。 ソケットのクローズを exit(2) の一部として行った場合には、残っているソケットの クローズ動作は必ずバックグラウンドに送られる。

  • SO_LINGER の設定無しに close とかすると後処理は kernel に任せられて SOCKET が何か WAIT になる
  • SO_LINGER が設定されてると TIMEOUT するか送信確認できるまで block する
  • 特に SO_LINGER が on で TIMEOUT が 0 だと

というわけでちょっと書いてみた:
import socket

addr = socket.getaddrinfo('www.google.com', 80)[0][4]
print(addr[0])
sock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, b'\1\0\0\0\0\0\0\0')
sock.connect(addr)
sock.close()
実行してみた:
$ time ip_address=`python test.py`; echo $ip_address; netstat -tn | grep "$ip_address"
74.125.235.81
何も残らない。TIMEOUT も 1 にしてみた:
import socket

addr = socket.getaddrinfo('www.google.com', 80)[0][4]
print(addr[0])
sock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, b'\1\0\0\0\1\0\0\0')
sock.connect(addr)
sock.close()
実行してみた:
$ ip_address=`python test.py`; echo $ip_address; netstat -tn | grep "$ip_address"
173.194.38.80
tcp        0      0 192.168.37.5:42359      173.194.38.80:80        TIME_WAIT  
残った。

TIMEOUT を設定すると RST じゃなくなる、のかな?
と思ったら違うか、TIMEOUT すると RST 投げるんだな、きっと。
ソース嫁ですと? ふへへ。

ちなみに、SO_LINGER で画像検索するとちょっと面白かったです。

2012/03/17

python ubuntu make LDFLAGS

Python Developers Festa 2012.03 に参加してきました。 日本オラクルのオフィスは相変らず素敵でした。 Python 3 の発表が 3 つくらいあったので再び少し興味を持ちました。 使ってみよう、3.3.0a1。 Ubuntu を用意して tar.bz2 を落として
sudo aptitude install gcc
sudo aptitude install make
make だ! っつーことで make してみたところ
Python build finished, but the necessary bits to build these modules were not found:
_bz2               _curses            _curses_panel
_dbm               _gdbm              _lzma
_sqlite3           _ssl               _tkinter
readline           zlib
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


Failed to build these modules:
_crypt
なんてこと言われたんでこれは流石に困るなと思い 沢山 package 入れてみることに:
sudo aptitude install libbz2-dev
sudo aptitude install libncurses5-dev
sudo aptitude install liblzma-dev
sudo aptitude install libssl-dev
sudo aptitude install libreadline-dev
sudo aptitude install zlib1g-dev
sudo aptitude install g++
sudo aptitude install dpkg-dev
sudo aptitude install libsqlite3-dev
sudo aptitude install libgdbm-dev
よし、こんだけ入れればいいだろう! っと思って make してみたら何かやっぱダメ。 な、なんでや!! つわけでググってみたところ LiPyrary - Python for books: How to compile Python on Ubuntu 11.04 これか!
export arch=$(dpkg-architecture -qDEB_HOST_MULTIARCH)
export LDFLAGS="-L/usr/lib/$arch -L/lib/$arch"
export CFLAGS="-I/usr/include/$arch"
export CPPFLAGS="-I/usr/include/$arch"
したら無事に色々な library が読み込まれて module が使えるようになりました。 めでたしめでたし。

2011/08/26

google api blogger

コード貼るしー、と思ってプリチーに見せたいわとか思ってたんで google-code-prettify 使ってました。

でもね、"all indentation for code snippets in my posts became broken" って そうなの、なんか code tag だとインデント壊れちゃってたの。

とりあえず pre に置き換えれば ok っぽかったんですが、 やっとこさ google の api 叩くことにしました。

Blogger API - Google Code まんまですわ。というかもうちょっと先に進んで Developer's Guide: Python - Blogger APIs - Google Code ここ見たんですが、

from gdata import service

blogger_service = service.GDataService('xxxxxxxx@gmail.com', 'xxxxxxxx')
blogger_service.source = 'exampleCo-exampleApp-1.0'
blogger_service.service = 'blogger'
blogger_service.account_type = 'GOOGLE'
blogger_service.server = 'www.blogger.com'
blogger_service.ProgrammaticLogin()

blog_id = '3061113982813699457'

i=1
while True:
  query = service.Query()
  query.feed = '/feeds/' + blog_id + '/posts/default'
  query.published_min = '2009-01-01'
  query.published_max = '2011-12-31'
  query.max_results = 10
  query.start_index=i
  feed = blogger_service.Get(query.ToUri())
  i += 10

  if len(feed.entry) == 0:
    break
  for entry in feed.entry:
    entry.content.text = entry.content.text.replace('<code ', '<pre ').replace('/code>', '/pre>')
    blogger_service.Put(entry, entry.GetEditLink().href)
これでとりあえず code を撲滅? できました 見れてるかな??

2011/05/17

ubuntu beep 鳴らす

Ubuntu 10.10 入れて暫く経つわけですが terminal で beep しないのに気付いていませんでした。 beep させたいな、と思ったんで何で慣らないのか調べましたところ Ubuntu日本語フォーラム / ビープ音を有効にしたい うん、これこれ、と思ったけどどうもこの方は解決してない? とりあえず冒頭にある module を調べてみると
$ lsmod | grep pcspkr
$ 
うん、無いわ。つことで
$ sudo modprobe pcspkr
としたら無事鳴りました。 なんだよー、何で load されてないんだよー、と思ったんですが、
$ grep pcspkr /etc/modprobe.d/*
/etc/modprobe.d/blacklist.conf:blacklist pcspkr
と見事に blacklisted だったので、有効にしときました。

2011/03/08

google-spreadsheet api

備忘でしかないんですがね
Google SpreadSheet の自分のブックの一覧が欲しくなって
Python で取るのがいいかしら? と思って調べました
まぁ、gdata 使えばいいんですけど、すぐなんですけど

# coding=utf8

import getpass
import sys

import gdata.spreadsheet.service


service = gdata.spreadsheet.service.SpreadsheetsService()
sys.stderr.write('e-mail: ')
service.email = raw_input()
service.password = getpass.getpass()
service.ProgrammaticLogin()

feed = service.GetSpreadsheetsFeed()

for i in [(x.updated.text, x.link[1].href, x.title.text)
for x in feed.entry
if x.author[0].email.text == service.email]:
print("\t".join(i))


これでね、
$ python kono_script.py > output.tsv
e-mail: abcdefg@gmail.com
Password:
$
とかすれば output.tsv に出ます

わーい

2011/03/04

map script interfaces wlan

暫く自宅と会社をノートPC持って往復してたんですが
Debian でローテクでやってるんで wifi の設定も貧弱で
/etc/netwerk/interfaces を手で書き直してました
コメントにしたりコメントアウトにしたり
どうなのよそれ、と

で、Debian 系だとその interfaces で mapping っつーの使います
script を走らせて状況判断させて
事前にしてある任意の設定で interface を up できる
っつーのは知ってたけど今までそこまで使い込むことなかったんですが
やるべ、と、一大決心をして、ググりました

何も見ないし何も知らない | テーマ:コンピューター・Web
ん〜、惜しい、その最後のとこに書いてある
「Address(Mac Address)をsedで抜き出したらうまくいくかもしれない。」
それが欲しいんだ!

つわけで自分で作ればいいかと考え直しました
interfaces の mapping から復習しました
$ man interfaces
したら復習できました

例えば
wlan0 という interface に対してスクリプトで動的に設定したい、
という場合
mapping wlan0
script /usr/local/sbin/my_script.sh
map spam ham
map egg bacon
みたいに書きます

で、ifup wlan0 と wlan0 を有効にしようとすると
/usr/local/sbin/my_script.sh に引数 wlan0 が渡され
更に map で始まる行の map 以外の部分が標準入力に渡されます
つまり、
$ echo -e "spam ham\negg bacon" | /usr/local/sbin/my_script.sh wlan0
したみたいになるわけです

でで、このコマンドの出力結果の文字列が
実際に設定されます

ででで、今回は wifi AP の MAC ADDRESS を登録しといて
実際に行う動作の設定へと導いてあげることにしました
/etc/network/interfaces はこんな感じにしたい
mapping wlan0
script /usr/local/sbin/my_script.sh
map XX:XX:XX:XX:XX:XX office
map YY:YY:YY:YY:YY:YY home

iface wifi-office inet dhcp
wpa-driver wext
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-ssid "office api"
wpa-psk "xxxxxxxxxxxxxxxxxxxxxxxx"

iface wifi-home inet dhcp
wpa-driver wext
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-ssid "office home"
wpa-psk "yyyyyyyyyyyyyyyyyyyyyyyy"
で、あとは /usr/local/sbin/my_script.sh が
出力結果として "wifi-office" か "wifi-home" を出力してくれれば
それぞれの設定を施して AP に繋ぎにいってくれるはずです

じゃぁ /usr/local/sbin/my_script.sh どうすんのよ、というと
上のサイトと Debian の examples を見たらこんな感じに
#!/bin/sh
LANG=C
set -e

# 対象 interface で scan して wifi AP の MAC ADDRESS 集め
INTERFACE=$1
ifconfig $INTERFACE up
sleep 1
MACADDRESS_LIST=$(iwlist $INTERFACE scan | sed -n -e 's/^.*Address: \([0-9A-F:]*\).*$/\1/p')
ifconfig $INTERFACE down

which=""
# read は標準入力から1行読んで変数に入れる
while read testmac scheme; do
if [ "$which" ]; then continue; fi
for MACADDRESS in $MACADDRESS_LIST; do
# 設定されてる MAC ADDRESS があれば対応する設定を $which に
if [ "$testmac" = "$MACADDRESS" ]; then which="$scheme"; fi
done
done

#仕上に出力、hit しなかったら "wifi-default" と出す
echo wifi-${which:-default}
どうも sleep が短かいのか
ちょっと調整しないと一発で成功とまではいってないんですが
これで一々設定ファイルいじらなくてもよくなりました

でもさ、どーせさ、みんな Ubuntu 使ってるからさ
こんなことしなくてもサクサク設定できちゃってるわけでしょ?
ぷんぷん

2011/02/19

sysinstall gpt fdisk

検証用の DELL のパソコンが壊れました
電源が入らなくなって電源ランプがオレンジに光ります
http://plusd.itmedia.co.jp/pcuser/articles/0809/30/news074.html
あれ、電源がそもそも弱かったのかしら、この子

で、なぜか TM8000 の載ったマザボと検証であたったケースがあり
放置してたので使ってやるかと DELL の HDD を移植などしてみることに
というか確か DELL の HDD はもともとこの TM8000 のやつに繋いであったので
戻してみただけだったのだ

つうか今更 ATAPI ですよお嬢さん

で、何で放置してたか忘れてたんだけど、
マザボをネジで止めると電源スイッチからのケーブルが届かなかったの
ひどい
とりあえずマザボは固定せずにスイッチが入ることを優先しつつ
後日 LED-30EX とやらを購入しました

しかし遅い、TM8000 が遅いのか何が遅いのか分からないけど遅い
試しに PC-BSD 8.1 と Ubuntu 10.10 を入れてみたんだけど遅い
KDE とか Gnome とかそもそも使わないのに更にこの遅さか
メモリ余ってるから完全に CPU が原因だろうにこの遅さか

というわけで Squeeze でも入れてみようかと思ったんですが
なんとなーく FreeBSD でもいってみるかと思ってまた CD 焼いて
インストールしようと思ったらインストールできないんですよ
sysinstall で Custom で設定して commit しようとすると
"Unable to find device node for /dev/ad0s1b in /dev"
みたいなこと言われちゃって slice 切ってくれないの

で、いろいろググってみたらどうやら HDD が GPT とやらで??
Ubuntu とか PC-BSD とか入れて遊んでたら何か変えられて
sysinstall からいじれなくなってしまっているらしい
Problem running fdisk via sysinstall
このスレッドが分かりやすかった

とりあえず、HDD の最後の部分に何か書かれてるからダメらしく
dd if=/dev/zero of=/dev/ad0 seek=?????????
と、seek をいくつにしたか忘れたけど
sysinstall で見れる block size くらいにしといて
とりあえず何か上書きしてみたらちゃんと sysinstall できました

解決はしたけど理屈は良く分かってないんだけど
眠いからとりあえず解決策だけ書いとくよ!!
 
[PR] SSL