簡易RSSをPythonで自作した。
GoogleのRSSリーダーを一時使用していたのだけど、サービスが停止してからRSSリーダーを一切使わなくなった。
いつか自作しようと思っていたのだけど、そのいつかは訪れることなく今の今まで来てしまったので、プログラミングの学習がてら簡易なリーダーを自作してみた。
使用したもの
簡単な説明
取得したいURLを記載したテキストファイルを準備して、それを読み込みparseして、タイトルとリンクをのみを取得し、htmlファイルへと出力する簡易な仕組み。
ソース
メイン的な。
#!/usr/bin/python # -*- coding: utf-8 -*- import feedparser, file_handle # html template html = """ <p> %s </p> <a href=%s> %s </a> """ # file 操作 file_input = file_handle.open_file("url_list.txt") file_output = file_handle.make_file() #main処理 feedparserを利用して、タイトルとurlをhtmlファイルに出力する。 for line in file_input: res = feedparser.parse(line) for entry in res.entries: title = entry.title.encode('utf-8') link = entry.link.encode('utf-8') file_output.write(html % (title, link, link))
ファイル操作するやつ。
def open_file(path): return open(path, 'r') def make_file(): import datetime today_html = "./rss_html/" + str(datetime.date.today()) + ".html" return open(today_html, "a")
ちょっと文字コードあたりで苦労したので、そこらへんをちゃんと理解していきたい。
あと便利なものを使うのもいいんだけど、学習っていういみでは元々の仕組みをしることも大事だと思った。
みんなのPython Webアプリ編でつまった点など
ヘッダー部分とコンテンツ部分に改行が必要な点
self.headers = {'Content-type':'text/html;charset=%s\n' % charset}
\nがないと、ブラウザからアクセスしても画面が真っ白に。
この記事で解決。 でも、なんで改行しないとだめなんだろ??
Permission周りで権限がないと弾かれる点
Python CGIHTTPServer crashes with “OSError: [Errno 13] Permission denied”
なんとなくこうすれば良いということはわかったのだけど、根本的なところが理解できてない。
Pythonの話ってよりは、OSの権限周りの話なのかな。
ソースコードを読むという意味でも、ここらへんのソースを追いつつ、OS周りのことも調べていきたい。
とりあえず、rssのurlを入力して、記事を得るという機能までは満たせたけど、
ソースの理解はまだまだなのでここからもう一歩踏み込んでいきます。
markdown記法
なれると便利ですね!!
参考にさせていただいたリンク
はてなブログで高速に記事を書けるMarkdown記法チートシート
Python覚え書き
パーフェクトPythonの昨日の続き。 初めてのPythonなどを参考にメモしてます。
with/asステートメント
try/finallyステートメントの代替として設計されたもの。 異なる点として、より幅広い用途に対応できるオブジェクトのプロトコルをサポートしている点が異なる。
基本的な使い方
with expression [as variable]: with block
expressionにはコンテキスト管理プロトコルをサポートするオブジェクトを戻すコード が入り、asを用いると、variableには何らかの値が代入される。 このとき、variableに代入されるのはコンテキスト管理プロトコルをサポートするオブジェクトではないことに注意。 このオブジェクトは、withブロックが開始され前に「前処理」をすることもあるし、終了後に、「後処理」をすることもある。
具体的な処理
with open("path/to/something") as f:
とした場合に、openはファイルオブジェクトを返し、それがfに代入される。 ファイルオブジェクトは、コンテキスト管理プロトコルをサポートしているため、 withブロックを抜けたら、自動的にファイルはクローズされる。
ちょっと紛らわしかったけど、要するに、expressionは評価された値じゃなくて、 オブジェクトを返して、asが使われていたら変数にオブジェクト代入するよっていう代物か。
コンテキストマネージャ
with/asの使い方は理解したけど、コンテキストマネージャって何だろう。 これは、初めてのPython見ても記述が見当たらなかった。
今まで整理した内容から考えると、ある操作をするときの状況・文脈で必ず行いたい前処理や後処理を 定義したもののことを言うのかな??
ちょっとここらへんまだ曖昧です。
とりあえず、独自のコンテキストマネージャを定義することができることは理解した。
クロージャ・高階関数
クロージャ
すでに存在しない外側のスコープに属する変数を保持しているオブジェクトのこと。
def outer(): x = 88 # 外側の変数 def inner(): print x # 外側の変数を参照 return inner # 内側の関数オブジェクトを返す action = outer() # 関数呼び出し。innerオブジェクトを返す。 action() # 関数呼び出しにて、88と表示。
すでに存在しない、つまりはaction()を呼び出した際に、outer()は既に存在しないが、 inner()はouter()の変数xの値を保持している、ということ。
基本的にネストされた関数はわかりづらくなりやすいので、避けた方が無難ぽい。
高階関数
こっちは昨日の理解でよさげ。 なので、apply関数とか、map関数とかをサンプルに記述する。
def func(x, y, z): return x + y +z apply(func, (2, 3, 4,)) # 9と出力 list = [1, 2, 3, 4] def inc(x): return x + 10 map(inc, list) # [11, 12, 13, 14]と出力
apply関数は関数オブジェクトと引数を渡すことで、関数を実行してくれる。 map関数は、関数オブジェクトとシーケンス型のオブジェクトを渡すことで、 一つ一つの要素に関数を適用して、リストを生成する。
デコレータ
とりあえず、以下のリンクを見る。
(デコレータ) 別の関数を返す関数で、通常、 @wrapper 構文で関数変換として適用されます。 デコレータの一般的な利用例は、 classmethod() と staticmethod() です。 デコレータの文法はシンタックスシュガーです。次の2つの関数定義は意味的に同じものです:
def f(...): f = staticmethod(f) @staticmethod def f(...):
とりあえずここまでは理解。 具体的なサンプルコードを見てみる。 以下のリンクを見てみる。
具体的なサンプルコードはリンク先を見てもらうとして、 要するにデコレータっていうのは、関数本体に手を入れることなく、何か別の事をやって欲しいと思ったときに、 それ専用のクロージャを作ってあげて、何かごにょごにょして、ハイじゃあ元の関数さんあなたの仕事してねって 感じの処理か。
それぞれの関数内で、ごにょごにょする関数を呼び出してもいいけど、@関数名でデコレートしとけば、 見た目奇麗になるでしょ、てな感じで今は理解しておこう。 (ここら辺からだいぶ適当になる、かも)
ディスクリプタ
参考にしたリンク先
ディスクリプタ HowTo ガイド
Python を支える技術 ディスクリプタ編 #pyconjp
__get__,__set___,__delete__
上記、3つのメソッドを定義したオブジェクトのこと、、、、
とまではわかったけど、それ以降は全然理解できない。
ちゃんとPythonにおけるクラスとかの仕組みを理解しないとだめな気がする。 ということで、もいっかい勉強し直してからここは戻ってこよう。
メソッド関連の話もそれからということで。
昨日今日とPythonの学習してきたけど 今まで言語の表面的な部分しか全然触ってきてなかったんだなと痛感しました。
それでも内部的な仕組みに少しでも触れることができたので、 今後とも精進していきたいです。
パーフェクトPythonメモ
Pythonの勉強を再開しようと思って買ってみました。
とりあえず、言語仕様の部分まではさらっと読んでみて、
知らないとこ、分からないところをメモっとく。
- withというか、コンテキストマネージャとはなんぞや とりあえず、前処理・後処理てきなやつをやってくれるのか。
- クロージャ 関数内部で定義され、かつ、外側の関数のローカル変数を参照している関数のこと。 とりあえず、外側の関数抜けても内側の関数内の変数は残ってるよくらいの理解なので、 再度整理が必要かな。
- 高階関数 関数の引数に関数や、また、戻り値に関数を返す関数のこと。 関数の細分化が可能。 例えば、数値の集合から奇数のみを取り出して、リストにする際に、 奇数を判定する関数(評価関数)と、評価関数を用いてリスト生成する関数を作成するなど。
- 関数デコレータ これがイマイチ理解できてないので、後で整理。 記法はJavaのアノテーションなんだけど、そもそもJavaのアノテーションもわかってないから、 全く関係ないかも。
- 多重継承 個人的にはなんか厄介な気がするんだけど、なんで採用したんだろ??
- インスタンスアロケータ メリットというか、使いどころがイマイチ想像できない。
- ディスクリプタ セッターゲッター用のデコレータが準備されているみたいだけど、 それとの違いがまだ分かんない。
- クラスメソッド、スタティックメソッド Javaと混同するから整理必要。
とりあえずざっと読んでみて気になったので、明日調べなおします。
明日でお正月休みが終わりかーはやかったなー 今年の目標とかたてよう。
Heroku+bottleを使ってみた。
Python - Heroku×bottleを使って4分33秒でWebアプリを公開する - Qiita
リンク先を参考にやってみた。
さすがに慣れてない部分があったので、5分でできなかったけどすぐにリリースまでできた。
まじでHerokuすごい。
リンク先にも書いてあったけど、Webサービスをリリースするってだいぶハードルが下がってきているんだと実感した。
商用とかエンタープライズ用とかでも耐えられるのかはわからないけど、
個人レベルのWebサービスをリリースするんだったら、全然構わないんじゃないかな。
以下、ちょっと詰まったところのメモ
①bottleのインストール
②ソース編集
③依存ライブラリの一覧作成
という手順でやるべきところを、
①ソース編集
②依存ライブラリの一覧作成
という手順でやってしまったため、Herokuにデプロイしても、
application errorでHello Worldが出力されなかった。
bottleをインストールして再度デプロイしてもまだだめだったので、
なんでかなーっと思ったら、③の依存ライブラリの一覧にbottleってあったっけ??
と思い確認。
bottleらしきライブラリの記述ないじゃん...とおもいつつ、
再度③の手順を実施して、再度デプロイしたら、見事できました。
pip freeze > requirements.txt
でやっていることとして、今の環境にインストールされているパッケージの一覧を取得して、txtファイルに保存している...って感じらしく、別の環境ではこのtxtファイルを参照して、ライブラリを準備するらしい。
まだまだ全然知らない事が多いので、Heroku、もっと勉強したいです。
Gitを触ってみた。
Git入門:Git初学習者のための効率的な学習方法を考えてみた – PAYFORWARD
これに沿ってみて、学習している最中。
takanabe/introduction-to-git · GitHub
とりあえず、ここまでやってみた感想。
業務でCVSを触ったことがあって、そのときはEclipse経由でリポジトリとのやりとりをしていたから、コマンドラインからの操作はちょっと疲れた。
ただ、CVSでの操作をしていたときにわけもわからずやっていた操作が、
今となってみるとこういうことやっていたんだなーと理解できた。
マージとかなんでHEADに移って実行しないといけないんだ??とか。
個人的に、GitのHEADは単なるポインタで、今作業しているブランチを指している、
という説明には非常に納得を持てた。
今の職場はメインフレームで開発していて、コードのバージョン管理なんて無いに等しくて、マージなんて手打ちで実行している状況だから、メインフレームの世界でもこういうツールが導入されたら開発効率があがるんじゃなかろうか。
そういや、来年度あたりからSVNでソース管理するみたいなこといってたから、
案外近いうちに導入されるのかも。
まぁ、使いこなせるかどうかは人次第な部分はあるけど。
一気にやったので後半の複数人でのリモートリポジトリの操作とかざっと見になっちゃったので、また気が向いたら見直そう。
あとは、GitHubのアカウントも作ってみたので、何か作ったらそっちにあげてみよう。
最近、ツールとか環境構築周りのことばっかりやってるから、コードも書かんと。
年末年始にまとまった休みがとれるから、その期間で何か作れたらなぁー