ラベル MongoDB の投稿を表示しています。 すべての投稿を表示
ラベル MongoDB の投稿を表示しています。 すべての投稿を表示

2013年3月13日水曜日

かわいいぼたんジェネレータを作ってみた!

前作ったこれを改造したものです

だれでも、簡単に◯◯ちゃんかわいいと呟くことの出来るボタンを作ることができます。

どのように作るかと言いますと

まずしたのページにてボタンを作るボタンをクリックします

次に1つだけの入力フォームにかわいいと呟きたい相手の名前を入力します(ちゃんは自動的につくので気をつけてください)

すると、

大体は前回と同じなのですが、今回実装した面白いことを2つほど紹介したいと思います。

  1. 画像を自動的に取得してくる
  2. タイトル画像の自動生成

まず、1についてなのですが、NAVER画像で項目について検索をかけてそのレスポンスをスクレイピングするだけです。

ソースは以下のようになってます。

これは前回書いた記事のクローラファーム上で動いています

これで、画像のurlを取得して表示という流れです。

2つ目は文字列を受け取ってPILで処理して画像に変換! …と言いたいところですが…今回はインチキをしましたw

このロゴジェネレータさんを使ってまた、クローリングでかいけつしました。

パラメータをつけてPOSTで送ってやるだけなんですけどね!

少し、BaseCrawlerを書きなおして置かないとダメなところも出てきてしまったので。書きなおしたりもしてやりきりました。

以下はソースです

色とかも弄れるのでパラメータが多いですね…

最近クローリングばっかりで問題解決してる気がするので。少し反省してちゃんとした解決方法も模索出来るようにして行きたいな〜と思っています。

2012年12月13日木曜日

PythonとFlaskとMongoDBで後輩のお手伝いをした話

昨日はJOI(情報オリンピック)の予選の模擬試験を後輩(@kagamiz)がやるのをお手伝いしました

システム側の運営をやった感じです。(@kagamizは問題を作りました)

今回もMongoDB+Flaskで頑張りました。

実装

今回の主な実装となったのは
1. ログイン処理
2. 解答の提出処理
3. 採点スクリプト

の3つです。

1つ目はlogin用の使いまわしやすいモジュールを自分で書いてあるのでそれをクローンしてくるだけで瞬殺でした。

MongoDBで {_id: int, username: string, passwd: string} みたいな感じのコレクションを用意しておいて 以下のように

!python

import functools
from flask import session

def require_login(func):
@functools.wraps(func)
def wrapeer(*args, **kwargs):
    if (session.has_key("username") == True and
    session.has_key("passwd") == True):
        user = g.db.users.find_one({"username": session["username"]});
        if (user == None):
            return ("Invalid User");
        kwargs["user"] = user;
    else:
        path = request.path;
        get_request = urllib.urlencode({
            "redirect": path
        });
        return (redirect("/login?" + get_request));

    return func(*args, **kwargs);
return wrapeer;

こんな感じで書いてこれをViewのデコレータにしてあげればデコレータをつけたViewに入るときにloginしていなければログイン画面へリダイレクトするという処理がかけます(うーん便利だなーデコレータは!) Pythonのデコレータはすごく便利なので後日まとまって記事がかけるといいな〜と思っています。

2つ目はフォルダのパーミッションに気をつけさえすればそんなに難しいことではありません。

3つ目は頑張って書きました。 正直データベースからデータを引っ張ってきてゴニョゴニョするだけです。

参加状況

最初はICT委員会(僕の入ってる部活のようなものです)内でやる厳かなものだと思ってたのですが@kagamizくんがTwitterで一般の人にも告知したところ。なんと128人も参加者が来ました(切りが良い!) なんか、落としたらどうしようって感じで怖かったです。

トラブル

  1. ソースファイルの提出が一時間できなくなった(そこまで致命的ではない)
  2. 登録処理が5分間ほどできなくなった(致命的)
  3. 採点する際に空ファイルを提出された時に正解と出してしまっていた(致命的)

1に関しては些細なミスが招いたものですでに他の解凍ファイルを提出した状況下でしかテストをおこなっていなかったことに起因します。これからはテストをもっとしっかりやりたい。

2に関しては登録した時の確認メールを送る処理の中でこけていました。原因の究明も大事なのですがかなり致命的な場所でのエラーだったので、一旦メール確認の機能を切ることにより対処しました。

3は解答ファイルのほうが小さかった場合の処理のbrakeの前にフラグを折ってなかったことに起因しました。

まあ、致命的な奴は5分くらいで対処できたので初めてにしては上出来なのではないでしょうか?

まとめ

正直、短時間で100人以上が同時に参加するサイトを管理するという。経験が少なかったので短い間でしたけどその体験ができてよかったです。

まあ、いくつかトラブルがありましたが無事終了させることがあってよかったです。

2012年6月9日土曜日

早起きして Flask MongoDB を使ってWebアプリケーションを作ってみた

昨日、一時間早起きして作ったサービスを今日公開しました。

twitter 流速 スカウター

内容はTwitterでの自分のタイムラインの流れる速さ(ツイート/時)を測ってランキングを作るというサービスです

画面はこんなかんじです

作ったフローは以下のようになっています

  1. 眠い目を擦りながら、いつも使っているflaskの足場をコピペ
  2. 少し、頭がすっきりしてきたと同時に前に書いた記事で作ってあるFlask用のTwitterPluginをgithubからクローン!
  3. 目が覚めて、ガリガリ書く(MongoDBなので最初にがっちりDBを決めなくてもいいから楽でいいです[ごめんなさい情弱で])

こんな感じで(全体的な)ロジックは書きあがりました。

それを@pinkrootさんに丸投げしてHTMLとCSSと部品とかを作ってもらう

なんか、tweepyの中のtwitterとの連携部分でバグって戸惑う

しょうがないから寝る。

次の日も早起きしてデバッグ。

結局別ウィンドウで認証してたのが悪いらしい(3回に2回くらい401エラーが出てた状態)

しょうがないから同じウィンドウで認証するように書きなおす

出来たので、@pinkrootに報告。@pinkroot「よし公開しよう」との事で公開

@refiuteくんが

とのことです

そこで

14分後くらいかな

というわけです。結構がんばったので

という感じでお褒めの言葉をいただきました。

ちなみに同じような感じでユーザの検索機能も追加しました!!

今回の反省点

  1. ちゃんと計測が何回行われたかわかるDBの設計にしなかった
  2. また、さーばを(ry
  3. ランキング機能くらいはちゃんと最初から作っておくべきだったな