読者です 読者をやめる 読者になる 読者になる

毎日Learning

学んだことを共有します

ConnpassのAPIでイベントを検索するPythonスクリプトを書いた

connpassのAPIでイベントを検索するスクリプト。ぜんぜん汎用的に作ってないけど、キーワードとか年月日を指定してぱっと検索したいときにちゃっと使うのに良い感じ。Pythonインタプリタで実行するときは、 import connpass connpass.printd(connpass.search…

PythonでMicrosoft SQL ServerにアクセスするpymssqlをUbuntuにinstallする

pymssql をUbuntu環境にインストールするときに、 必要なUbuntuパッケージがあるので、メモっとく。 sudo apt-get install freetds-dev を入れとくと、 sudo pip install pymssql がうまいこと動く。入れてないと、 _mssql.c:314:22: fatal error: sqlfront.…

SimpleHTTPServerを日本語URIに対応する方法

PythonのSimpleHTTPServerってめちゃ便利ですよね。HTTPサーバーとしてアクセスしたいディレクトリのパス上で、 $ python -m SimpleHTTPServerって実行するだけで、 http://localhost:8000 でアクセスできるようになるじゃないですかー。でも、このSimpleHTT…

フォルダを再帰的に比較して追加、更新、削除になったファイルを一覧出力してくれるスクリプト

気軽にフォルダ同士を比較したいときって結構ありますよね。Windowsなら便利なツールで、 WinMerge 日本語版 っていうのがあります。でも、Linux環境やMac環境で開発したり遊んでる人は、Terminalや端末上で、気軽にぺっと比較したいときもありますよね。そ…

エキスパート Python プログラミング メモ Vol.7

2.3.4 プロキシ プロキシデコレータは関数にタグをつけたり、グローバルな仕組みへ登録したりします。 たとえば、実行中のユーザーごとにコードへのアクセスを保護するセキュリティレイヤは、呼び出し可能なオブジェクトに関連づけられたアクセス許可情報を…

エキスパート Python プログラミング メモ Vol.6

デコレータの一般的なパターンの続き。今日はキャッシュデコレータについて。 2.3.3 キャッシュ キャッシュデコレータは引数チェックによく似ていますが、出力が内部状態の影響を受けないというケースに限定して使用されます。 出力が内部状態の影響を受けな…

エキスパート Python プログラミング メモ Vol.5

2.3.1 デコレータの書き方 の続き… サブ関数に対して、wrapperのような一般名詞の代わりに _mydecorator のような明示的な名前をつけるのが良いプラクティスです。 その処理過程でエラーが発生したときに、トレースバックが読みやすくなり、デコレータの内部…

エキスパート Python プログラミング メモ Vol.4

かなり間が空いてしまった。途中、浮気(Slim3本)を読んだりしてたし…。今日から毎日4ページずつ読んではブログに書くようにしよう。4ページが無理っぽかったら、3ページになるかもしれない…。 2.3 デコレータ デコレータはPython 2.4で追加された構文で、関…

エキスパート Python プログラミング メモ Vol.3

2.2.3 ジェネレータ式 ジェネレータも、リストの内包表記と同じようなショートカットがあるとのこと。まじかよ。そんなんして良いのかよ。おなかいっぱいだよ。 >>> iter = (x**2 for x in range(10) if x % 2 == 0) >>> for el in iter: ... print(el) ... …

エキスパート Python プログラミング メモ Vol.2

電車移動中にiPhoneから投稿します。 やっぱ本を読むのは電車だよね。 2.2 イテレータとジェネレータ イテレータについては、割愛。 2.2.1 ジェネレータ ジェネレータは今まで使ったことが無かったが、今回、エキPyを読んで多用することになりそう。 Python …

Pythonの辞書をvalue値でソートする方法

こちら Pythonの辞書(dict型)をvalue値でソート - プログラミング工場 / Python を見て、個人的にメモとして転写させていただく。辞書のキーや値でソートして出力する方法。 >>> d = {'A':500, 'B':200, 'C':300, 'D':100, 'E':400} >>> for k, v in sorted(…

エキスパート Python プログラミング メモ Vol.1

エキスパートPythonプログラミング を読むので、読んだ内容の理解を深めるため、メモ的に内容を残すことをしようと思う。第1章「さあ、はじめよう」は、インストールやらエディタについて色々書いてあるが、ほとんど知ってるし割愛。 第2章「構文ベストプラ…

vimからTwitterにつぶやくだけのクライアントアプリをOAuth認証に対応した

以前まで Twitter - Post to Twitter from Vim : vim online を使っていたが、Basic認証の終了に伴いつぶやけなくなっていた。つぶやくだけの機能で良いので、OAuth認証で認証するようにだけ対応すれば良いやと思い、vimtwitter.vimのソースを見ながら、pyth…

TwitterのBasic認証が廃止になったのでcronの認証方法をOAuthで何とかしてみた

TwitterのBasic認証が廃止になったOAuth FAQ | Twitter Developersことから、cronでBasic認証を使用していたところが使えなくなっちゃった。Webアクセスの処理ならOAuth認証に変更で終了な話なのだが、cronなので、OAuth認証をするためにTwitterの認証ページ…

Youtubeの動画をPythonでダウンロードする

Pythonのurllib2やBeautifulSoupを使って、Youtubeの動画をダウンロードするスクリプトを作った。Youtubeの動画ファイルのURLがどこに隠されているのか、解析するために、Youtubeのソースをじーっと見続けたら、以下のスクリプトで取得できた。作った後にグ…

Google App Engineの認証にTwitterのOAuthを使ってみた

Google App Engineの認証は、Googleアカウントを使うのが最も簡単だが、今回、Twitterと連携するWebアプリケーションを作ったので、認証をTwitterで済ましてしまおうと思いやってみた。使用したライブラリは、tweepy joshthecoder/tweepy · GitHub と、simpl…

無名クラスの作り方

Djangoのsitemapsフレームワーク sitemaps フレームワーク — Django v1.0 documentation を使って、sitemap.xmlを作った。その際、サイトマップインデックスを生成したのだが、サイトマップインデックスのリンク先の各サイトマップ内で、それぞれ異なる処理…

P20 (*)リストからK番目の要素を削除する。

def remove_at(l, num): return [v for i,v in enumerate(l) if (i+1) != num] if isinstance(l, list) else None if __name__ == "__main__": print remove_at("a", 3) == None print remove_at(["a"], -1) == ["a"] print remove_at(["a"], 0) == ["a"] pr…

P19 (**)リスト要素をN要素分左に移動させる。

def rotate(l, num): return l[num:] + l[:num] if isinstance(l, list) else None if __name__ == "__main__": print rotate("a", 3) == None print rotate(["a"], -1) == ["a"] print rotate(["a"], 0) == ["a"] print rotate(["a"], 1) == ["a"] print ro…

P18 (**)リストをスライスして要素を抽出する。

def slicer(l, start, end): if not isinstance(l, list) or not start or not end or start > end or start > len(l) or end > len(l): return None return l[start-1:end] if __name__ == "__main__": print slicer("a", 3, 5) == None print slicer(["a"]…

P17 (*)リストを2つに分割する。1つ目の要素の長さは指定される。

def split_list(l, num): return [l[:num], l[num:]] if isinstance(l, list) else None if __name__ == "__main__": print split_list("a", 3) == None print split_list([], 0) == [[], []] print split_list(["a"], -1) == [[], ['a']] print split_list(…

P16 (**)リストのNの倍数番目の要素を削除する。リストの最初の要素を1番目として数える。

def drop(lista, num): return [v for i,v in enumerate(lista) if (i+1)%num != 0] if 0 < num else None if __name__ == "__main__": print drop([], 0) == None print drop(["a"], 0) == None print drop(["a"], 1) == [] print drop(["a"], 2) == ["a"] …

P15 (**)リストの各要素を指定回数連続させる。

def repli(lista, num): return reduce(lambda l,v: l+[v for i in range(num)], lista, []) if isinstance(lista, list) else None if __name__ == "__main__": print repli("a", 3) == None print repli([], 0) == [] print repli(["a"], 0) == [] print r…

P14 (*) リストの各要素を2連続させる。

def dupli(lista): return reduce(lambda x,y: x+[y,y], lista, []) if isinstance(lista, list) else None if __name__ == "__main__": print dupli("a") == None print dupli([]) == [] print dupli(["a"]) == ["a", "a"] print dupli(["a", "b"]) == ["a"…

P13 (**) リストをランレングス圧縮(直接型)

def encode_direct(lista): def padd(p, v): if not p or not v in p[-1]: p.append(v) else: if isinstance(p[-1], list): p[-1][0] += 1 else: p[-1] = [2, v] return p return reduce(padd, lista, []) if isinstance(lista, list) else None if __name__…

L-99: Ninety-Nine Lisp Problems p13-p20 までのソースをさらす

L-99: Ninety-Nine Lisp Problems p11-p12 までのソースをさらす - 毎日Learning の続き。今回はししょーに、「簡潔なコードを書くことにこだわりすぎず、分かりやすいコードを書くようにせよ」との命題を受けた。が、受ける前に書いているコードもいくつか…

P12 (**) P11の解でランレングス圧縮されたリストを解凍して元に戻す。

def main(): print decode(encode_modified("a")) == None print decode(encode_modified([])) == [] print decode(encode_modified(["a"])) == ["a"] print decode(encode_modified(["a", "b"])) == ["a", "b"] print decode(encode_modified(["a", "a", "b…

P11 (*) ランレングス圧縮の改良版。

def main(): print encode_modified("a") == None print encode_modified([]) == [] print encode_modified(["a"]) == ["a"] print encode_modified(["a", "b"]) == ["a", "b"] print encode_modified(["a", "a", "b"]) == [[2, "a"], "b"] print encode_mod…

L-99: Ninety-Nine Lisp Problems p11-p12 までのソースをさらす

L-99: Ninety-Nine Lisp Problems p09-p10 までのソースをさらす - 毎日Learning の続き。この問題に取り組むようになって、問題を1つずつ解いていくと、毎回、新たな発見があり、なかなか面白い。今までは、ぱっとやって動いたら、はい次ーってやっていたの…

P10 (*) リストをランレングス圧縮する。

def main(): print encode("a") == None print encode([]) == [] print encode(["a"]) == [[1, "a"]] print encode(["a", "b"]) == [[1, "a"], [1, "b"]] print encode(["a", "a", "b"]) == [[2, "a"], [1, "b"]] print encode(["a", "a", "b", "b"]) == [[2…

P09 (**) リストの重複する要素をそれぞれ子リストとしてまとめる。

def main(): print pack("a") == None print pack([]) == [] print pack(["a"]) == [["a"]] print pack(["a", "b"]) == [["a"], ["b"]] print pack(["a", "a", "b"]) == [["a", "a"], ["b"]] print pack(["a", "a", "b", "b"]) == [["a","a"], ["b", "b"]] p…

L-99: Ninety-Nine Lisp Problems p09-p10 までのソースをさらす

前回 L-99: Ninety-Nine Lisp Problems p06-p08 までのソースをさらす - 毎日Learning の続き。日々、意識して簡潔なコードを書くようになってきた。ししょーの言葉にあった、「コーディングもイテレーションや」を念頭に置き、一度動くコードを書いたからと…

Twitter APIを使って検索取得したJSONをGoogle App Engineに保存するcron

Twitter APIを使って、あるキーワードで取得した結果を、そのままGoogle App EngineのEntityに保存する。というcronを作ったので、メモっておく。app.yamlは以下のようにする。 application: hoge version: 1 runtime: python api_version: 1 - url: /c/.* s…

文字列の前後の全角空白をtrimする

文字列の前後に、半角空白やタブ文字が入っている場合、 " \thoge \t".strip() >>> 'hoge' で除去できるのは、普通。ただ、全角空白が入っていると、 " \thoge \t".strip() >>> '\xe3\x80\x80\thoge' と、上手いこといかない。全角空白は残るし、タブも残る…

キーの配列と値の配列を一発で辞書にする方法

ししょーの教えの元、感動したのでブログっておく。Java的指向の僕が考えたコードは以下。 k_l = ["a", "b", "c"] v_l = ["hoge", "fuga", "ponyo"] result = {} for k,v in zip(k_l, v_l): result[k] = v >>> {'a': 'hoge', 'b': 'fuga', 'c': 'ponyo'} し…

Google Appe Engineの開発サーバを実行した時のWARNING IOErrorが出る理由

ちょっと調べたら解決できたので、メモ。Google App Engineの開発サーバを、以下の環境で実行したときに、WARNINGログが出ていた。WARNINGなので無視っていたが、ちょい気になったので調べてみた。 WARNING 2010-07-20 09:41:03,831 py_zipimport.py:103] Ca…

vim上でpythonスクリプトを一発実行

ちょっとしたことだが、便利なので残しておく。vim上で以下のようなpythonスクリプトを実行するときに、Ctrl+P を入力するだけでpythonが実行されるというやつ。 def main(): print u"便利だわー" if __name__ == "__main__": main() .vimrc とかに、以下の…

L-99: Ninety-Nine Lisp Problems p06-p08 までのソースをさらす

前回( L-99: Ninety-Nine Lisp Problems p01-p05 までのソースをさらす - 毎日Learning )の投稿をししょーに添削してもらい、「これはJavaだね」と言われ、「こうだよ」という教えを受けました。その教えを反映できているか、まだまだ自信無いですが、さらす…

L-99: Ninety-Nine Lisp Problems p01-p05 までのソースをさらす

L-99: Ninety-Nine Lisp Problems p01-p10 の意訳 - Pyro Memo の和訳を見ながら、実際にやってみた。元サイト L-99: Ninety-Nine Lisp Problems も見ながら。P99のどこまで行けるか分からないが、出来るところまでさらしていこうと思う。はっきり言って、py…