Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

リモートブランチにあるリポジトリを一発で引っ張ってくる

git checkoutは-bオプションを付けてあげると新しいブランチを作って、かつ移動する事ができます。
で、第二引数に導入もとを明記すると……一本のコマンドで新ブランチ作成とマージが一本で出来てしまいます。

実際のところ

いままでは、以下のような泥臭いのをやってましたが……

$ git checkout -b branchA
$ git merge origin branchA

以下のようにすれば一本で済みます。

$ git checkout -b branchA origin/branchA

実は昔の記事で扱っていたのですが、あまりに存在感が無いので完全に忘れてました(白目
shuzo-kino.hateblo.jp

参考もと

  • "git checkout --help"

標準ライブラリtimeitで動作時間のサンプルを取る

リファクタリングの結果を取る場合には標準ライブラリtimeitが有効です。

実際のところ

$ python -m "timeit" -s "1 + 1"
10000000 loops, best of 3: 0.0202 usec per loop

そんな回数は要らないよ、というときは-nオプションを噛ませます

$ python -m timeit -n 10 -s "1 + 1"
10 loops, best of 3: 0.0283 usec per loop

上位個数を増やしたい場合は-r

$ python -m timeit -r 10 -s "1 + 1"
10000000 loops, best of 10: 0.0204 usec per loop

"if __name__ == '__main__':"という構文

"if __name__ == '__main__':"という構文をよく見かけますね。
これは、公式だと以下のように説明されています。

A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt.

まぁ、要するにシェルなりREPLなりからやれば、基本的に'__name__'には '__main__'が入っているって事です。

実際のところ

#!/usr/bin/python
import sys

def main(argv):
  print argv[0], ": Value :", argv[1]

if __name__ == '__main__':
    main(sys.argv)

実行すると、こんな塩梅

$ ./maintest.py 12
maintest.py : Value : 12

psycopg2で画像データを読み書きする

psycopg2で画像データを読み書きする方法です。

実際のところ

画像データの格納にはbytea型を使います。
PostgreSQLのbytea型はmemorybuffer型を返すので、ちゃんとbytes関数なりで整形しないといけません。

import psycopg2

DSN  = "dbname=postgres user=shuzo_kino"
SQL3 = "INSERT INTO image(byte_data)\
        VALUES (%(imagedata)s);"
SQL4 = "SELECT byte_data FROM image \
        WHERE id = (%(id)s) LIMIT 1;"

def pushImage(query, filename):
  fp        = open(filename, "rb").read()
  imgdata   = psycopg2.Binary(fp)
  postquery = {'imagedata': imgdata}
  curs.execute(query, postquery)

def saveImage(query, filename, id):
  vals = {'id': id}
  curs.execute(query, vals)
  fp = curs.fetchone()[0]
  with open(filename,'wb') as file:
    file.write(bytes(fp))

with psycopg2.connect(DSN) as conn:
  with conn.cursor() as curs:
    distImg = "/Users/shuzo_kino/Desktop/sample.png"
    saveImage(SQL4, distImg, 16)

    sourceImg = "/Users/shuzo_kino/Mexico.Tacos.01.jpg"
    pushImage(SQL3, sourceImg)

psycopg2でデータをINSERTする

前回に引き続き、psycopg2でデータをINSERTする方法です。

実際のところ

imageというbytea型のbyte_dataカラムを持っているテーブルに対し、バイナリデータを叩き込む方法は以下の通り。

import psycopg2

DSN = "dbname=postgres user=shuzo_kino"
SQL3 = "INSERT INTO image(byte_data)\
        VALUES (%(imagedata)s);"

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
      postquery = {'imagedata': b'\xde\xad\xbe\xef'}
      curs.execute(SQL3, postquery)

bytearray型で叩きつける事もできます。

      postquery = {'imagedata': bytearray.fromhex("12deadbeef12ab41")}
      curs.execute(SQL3, postquery)

psycopg2を使ってPostgreSQLにあるデータを読み出す

psycopg2を使ってPostgreSQLにあるデータを読み出す

実際のところ

以下のSQL文を叩くケースを考えます。

  • 固定の時間値を返す。
  • imageテーブルからとりあえず一個引っ張り出す

せっかくwith節を使う事ができるので使ってみます。

import psycopg2

DSN = "dbname=postgres user=shuzo_kino"
SQL = "SELECT * FROM image limit 1;"
SQL2 = "SELECT '2016-11-25 00:00:00'::timestamptz;"

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL2)
        print(curs.fetchone()[0])
        curs.execute(SQL)
        buff = curs.fetchone()[0][0:]
        print(type(buff), bytes(buff))

これの実行結果はこんな塩梅。

$ python dbtest.py 
2016-11-25 00:00:00+09:00
<class 'memoryview'> b'\xde\xad\xbe\xef'

postgresで現在のユーザ名を知る

あんまり参照する機会もないですが、PostgreSQLで現状のログインしているユーザ名を表示する方法です。

実際のところ

現状のユーザ情報はCURRENT_USER変数に格納されています。
というわけで、全部出したい場合は、こう

# select * from pg_user where usename = CURRENT_USER;
  usename   | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig 
------------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 shuzo_kino |       10 | t           | t        | t       | t            | ******** |          | 
(1 row)

名前だけ知りたい場合は

# select usename from pg_user where usename = CURRENT_USER;
  usename   
------------
 shuzo_kino
(1 row)