2013/08/15

powershell true

PowerShell でコマンドで boolean 指定したくなって
True とか TRUE とか true とかやってもダメでした。
でも 1 なら True で 0 だと False なの。まじで!!

で何が正解なのか知りたくてググりました。
Boolean Values and Operators - Windows PowerShell Blog - Site Home - MSDN Blogs
Boolean values (which can be either 1 or 0) are defined in PowerShell using the....

まじで!! と思ったら $True とかも使えるみたいだったんだけど
っていうか $True!! と $True にビビったーので記念に記しておきます。
言葉が変われば何でも変わりますね。

2013/08/13

"Blocked loading mixed active content"

Firefox の Version Up のスピードに既に追いつけなくなっています。
23.0 って何だよ!! と思ってたら正常に表示されないページが出てしまいました。
JavaScript がページを取ってこれていないようだったので Ctrl+Shift+K 押して
コンソールを開いてリロードしてみたら
Blocked loading mixed active content "http....
何だこれは。

ということでググりました。が、良く分からない。
"Blocked loading mixed active content" in FireFox - WebFaction Community
MITM ねぇ、ふむ。

で mixed と言われて http/https の混在を思いついたのですが
about:config を確認するとありました!
security.mixed_content.block_active_content
これが true が default だったので false にしてみたら見れました。
よかったよかった。

でも、いいのかなこの設定...。

2013/08/12

golang certificate ssl handshake

2013/08/14 追記
Go界のジェフ・ベゾスが勝手にウンコードを添削してくれたよ!! みんな、こっち見てね!

ヒャッハー、証明書好きのオレ様が帰ってきたぜ!!!というわけで遅延証明書よりも在留証明書よりも公開鍵証明書を愛する私が Go を使ってサーバから証明書をゲットするその日がやってきました。Go には crypto/tls という素敵パッケージもあるので何の心配もありません。Config としてサーバ認証を真面目にしない InsecureSkipVerify を true としてあげればどんな IP address, port のペアに対してだって証明書を取ってくることが可能なのです。実行するとこんな:
$ go run get_cert.go www.google.com
i=0
[[{[2 5 4 6] US}] [{[2 5 4 10] Google Inc}] [{[2 5 4 3] Google Internet Authority}]]
2013-07-31 11:40:49 +0000 UTC
2013-10-31 23:59:59 +0000 UTC
[[{[2 5 4 6] US}] [{[2 5 4 10] Google Inc}] [{[2 5 4 7] Mountain View}] [{[2 5 4 8] California}] [{[2 5 4 3] www.google.com}]]
i=1
[[{[2 5 4 6] US}] [{[2 5 4 10] Equifax}] [{[2 5 4 11] Equifax Secure Certificate Authority}]]
2012-12-12 15:58:50 +0000 UTC
2013-12-31 15:58:50 +0000 UTC
[[{[2 5 4 6] US}] [{[2 5 4 10] Google Inc}] [{[2 5 4 3] Google Internet Authority}]]
OpenSSL みたいな pretty な感じに出してくれるのはとりあえず見つからなかったけど頑張れば自分で書けるぜ!!
package main

import (
        "crypto/tls"
        "crypto/x509"
        "fmt"
        "log"
        "os"
)

func main() {
        if len(os.Args) < 1 {
                log.Fatal("You must input a hostname")
        }
        peerCertificates, err := GetCert(os.Args[1])
        if err == nil {
                for i, Cert := range peerCertificates {
                        fmt.Printf("i=%d\n", i)
                        fmt.Println(Cert.Issuer.ToRDNSequence())
                        fmt.Println(Cert.NotBefore)
                        fmt.Println(Cert.NotAfter)
                        fmt.Println(Cert.Subject.ToRDNSequence())
                }
        } else {
                log.Fatal(err)
        }
}

func GetCert(host string) ([]*x509.Certificate, error) {
        config := &tls.Config{InsecureSkipVerify: true}
        conn, err := tls.Dial("tcp", host+":443", config)
        var peerCertificates []*x509.Certificate
        if err == nil {
                connectionState := conn.ConnectionState()
                peerCertificates = connectionState.PeerCertificates
        }
        return peerCertificates, err
}
ポートは決め打ちだぜ!!

2013/08/02

python debug "imported modules"

Python で利用されるモジュールを全部みつけてこれないかな〜、と思いました。そのものずばりがありました。

30.4. modulefinder — Find modules used by a script — Python v3.3.2 documentation


例えば
$ python -m modulefinder /usr/lib/python2.7/SimpleHTTPServer.py | head

  Name                      File
  ----                      ----
m BaseHTTPServer            /usr/lib/python2.7/BaseHTTPServer.py
m SocketServer              /usr/lib/python2.7/SocketServer.py
m StringIO                  /usr/lib/python2.7/StringIO.py
m UserDict                  /usr/lib/python2.7/UserDict.py
m __builtin__               
m __future__                /usr/lib/python2.7/__future__.py
m __main__                  /usr/lib/python2.7/SimpleHTTPServer.py
何か一杯出てきました。これは便利!!

こんなことまで標準ライブラリでできる Python は素敵ですね。

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 を撲滅? できました 見れてるかな??
 
[PR] SSL