スキップしてメイン コンテンツに移動

投稿

2月, 2015の投稿を表示しています

インターン(その13)

実務訓練としてお世話になっています、 豊橋技術科学大学の近藤です。 本日、2月25日をもって、インターンが終了となります。 今回のインターン中に学ぶことができた、コーディングの習得の方法についてまとめてみました。 コードリーディングの重要性 当初、私はDjangoはおろか、Pythonすらあまり理解していない状態で Djangoチュートリアルを一通り行い、アプリケーションの開発を始めました。 しかし、チュートリアルや簡単なアプリケーションだけでは、実際に 使用するような美しいコーディングのアプリケーションの開発を行うことは、 非常に難しいと思います。  今回、Django本体のコードを読む必要があり、コードリーディングを行うことで、 「どのような記述方法があるのか」、「各処理の正しい手順」、 「Djangoでのプログラミングの考え方」が学べたのではないかと思います。  初心者が他人のコード、ましてや複雑な処理を書いている本体のコードを読むのは、 非常に抵抗があります。しかし、嫌々でもコードを読み、理解できるようになれば、 ある程度のコーディングができるようになります。初心者だからこそ、 しっかりと書き込まれたコードを読むことが重要であると感じました。 「何がどうしてダメなのか」を知る コードリーディングを行い、ある程度のコーディングができるようになりましたが、 書くコードはまだまだ無駄が多く、美しいとは言えませんでした。 コーディングしている際は、とりあえず動くコードを記述するので精一杯で、 知識不足であるため、「実はもっと楽な方法がある」ということを知らずに書いて いました。  今回、私が書いたソースコードを見て頂き、「どこが直すべき点か」、 「どうしてダメなのか」、「どのような記述にすべきか」という点の方向性を 教えて頂くことができ、改めて自分でリファレンスなどを調べ、 楽なコーディング、きれいなコーディングをすることができるようになりました。  ダメ出しをして頂ける方がいて、方向性だけを教えるということが、自分で調べて 解決するということにつながり、結果きれいなコーディングが身に付くのではないか と思います。 プログラミングに取り組む環境 新たなプログラミング言語を学ぶ際に重要になる点は、   ・ある程度の期間、しっかり集中して取り組める環

インターン(その12)

MNUにてインターンをさせていただいています、 豊橋技術科学大学の近藤です。 現在作成中のアプリケーションで行った作業の一部をまとめてみました。 Adminサイトの表示変更 AdminサイトのChangeListをいじっている際に、 1つのインスタンスにつき2行を割り当てて、 2行目の表示、非表示を切り替えるようにするため、 無理やりコーディングしてみました。 def detail(self, obj): pre = u'<pre>%s</pre>' % obj.message span = len(self.list_display) - 1 msg = u'<th >Message</th><td colspan="%s">%s' % (span, pre if obj.message != '' else '') detail = u'<button class="btn btn-info toggler_row_btn" id="%s" type="button 詳細</button>' % (obj.pk) button = u'<div class="btn-group btn-group-sm" role="group">%s</div>' % (detail) return u'%s</td></tr><tr class="toggler_row" id="%s"><td></td>%s' % (button, obj.pk, msg) detail.allow_tags = True 単純に、行を閉じて新しい行を開いてpreタグで くくったメッセージを表示させているだけです。 後はdjango.contri

インターン(その11)

MNUにてインターンをさせていただいています、 豊橋技術科学大学の近藤です。  DjangoのAdminサイトをカスタマイズしていたので、内容をまとめてみました。 アクションの追加 FileFieldを使ってファイルを管理していたので、ファイルを削除できるアクションを追加してみました。 from django.contrib import admin from .models import Hoge def file_delete(modeladmin, request, queryset): for query in queryset: query.file_delete() # modelsに記述した除去メソッド file_delete.short_description = u'ドロップダウンに表示するアクション名' class HogeAdmin(admin.ModelAdmin): actions = [ file_delete ] admin.site.register(Hoge, HogeAdmin) フィルターの追加 アクション追加のついでにファイルがあるかでフィルターできるように。 call FileListFilter(admin.SimpleListFilter): title = u'フィルター名' parameter_name = 'file' # urlのパラメタ def lookups(self, request, modeladmin): return ( ('true', u'あり'), ('false', u'なし'), ) def queryset(self, request, queryset): if self.value() == 'true': return queryset.exclude(file__exact='') elif self.value() == 'false': return query

インターン(その10) デブサミ2015

MNUにてインターンをさせていただいています、 豊橋技術科学大学の近藤です。 本日行われた、Developers Summit 2015のセッション、  「クラウドAPIを利用した開発について」を聴講してきました。 このセッションでは、SoftLayerの豊富なAPIを利用した開発について、 SoftLayerエバンジェリストの北瀬さん、MNUの 石橋さん、 エクストリーム・デザイン・ラボの柴田さん、クリエーションラインの前佛さんが 話されていました。 SoftLayerの大きな特徴として、ベアメタル(物理サーバ)を使用することができる という点があります。 セッション冒頭で、北瀬さんがSoftLayerのポータルを使用して、 ベアメタルサーバを実際にオーダーするというデモを行われました。 CPU, Memory, Storageなどのほか、 Intel TXT など、様々なハードウェア構成、 専用線などのネットワーク構成をポータルからオーダーすることが可能だそうです。 カスタマイズを施した物理サーバは数時間、テンプレート化されたもので数十分、 仮想サーバーだと数分で使用可能になるという、たいへん短いビルド時間、 高機能なポータルは、SoftLayerを使う大きな利点であると感じました。 石橋さん、柴田さん、前佛さんが、SoftLayerを使用することのメリットと、 SoftLayerの問題点をそれぞれ以下のようにあげられていました。 メリット ・ ObjectStorageがデフォルトでつかえる ・ サーバ構成がフレキシブルである  - ベアメタルを用いることで、ハイパフォーマンスなサーバ構成が可能である ・ 純粋なIaaSである ・ 高い安定性  - ベアメタルを使用した占有環境であると、性能にほとんど揺らぎがない  - 非占有環境であっても、他のサービスと比較して安定している ・ Catalystプログラム  - 起業家支援プログラムの内容が充実 月額1,000ドル分の無償利用が可能 ・ コミュニティの存在  - 困ったときに助け合える環境がある 問題点  ・ 月末締めに対応していない  - アカウントを作成した日付が Anniversary Bil

インターン(その9) Djangoで非同期処理

MNUにてインターンをさせていただいています、 豊橋技術科学大学の近藤です。 DjangoでBuild用のコマンドを作成しましたが、 そのまま使用すると、コマンド終了までページが戻ってこないので、 非同期処理を使用したいと思います。 Djangoで非同期処理を実装する際には、Celeryというモジュールを使うのが 一般的らしいです。Celeryはタスクキューを管理するインタフェースを提供しており、 内部で実際にキューイングするブローカーが必要でした。今回は、ブローカーに Redisを使用します。 インストール django-celeryのインストール pip install django-celery この時、Celery本体も一緒にインストールされる Redisのインストール yum install redis pip install redis 設定 setup.py INSTALLED_APPS += ( 'djcelery', ) import djcelery djcelery.setup_loader() # BrokerサーバのURLを指定 Redisのポートはデフォルト6379 BROKER_URL = 'redis://127.0.0.1:6379/' # 実行結果のストア先 CELERY_RESULT_BACKEND = 'djcelery.backends.database.DatabaseBackend' # 実行できるメッセージのホワイトリスト CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml'] 実行するタスクの記述 実行するアプリ内にtasks.pyを用意する。この中に非同期処理させる記述を書くのが一般的。 from __future__ import absolute_import, unicode_literals from celery.task import Task from celery import shared_task from .apis import build log

インターン(その8) SoftLayer Summit 2015

豊橋技術科学大学の近藤です。 昨日、虎ノ門ヒルズで行われた「 SoftLayer Summit 2015 」に 参加させていただきました。 SoftLayerユーザーコミュニティが中心となって開催されたカンファレンスで、 500人以上の方が参加されました。 アメリカSoftLayerのフィリップス・ジャクソンさんが基調講演で登壇され、 pythonで書かれたコードを実行し、APIを用いて20台のサーバを立ち上げるという デモンストレーションを行われていました。 SoftLayerの価格設定は、他のサービスと比較して低価格で、データセンタ間の通信が 無料で行えるという、太っ腹なサービスであり、 「一体どこで儲けているのか」という質問に対し、ジャクソンさんは、 「700人で12万台のサーバを管理していました。これは、自動化やスクリプトなどをAPI に反映してきたから。」とおっしゃっていました。 このキモであるAPIをいかに使うかについて、APIの魅力を IBMの小薗井さん、国政さん、そしてMNUの雪本さんが話されていました。 。 また、本日2/13 18:00から、APIをつかって開発が体験できる 第1回東京SoftLayer Hackathon を開催するそうです。 終了後に行われた懇親会では、ライトニングトークが行われ、 SoftLayerを使用したオンラインストレージであるPBOXについて、 MNUの石橋さんが説明されていました。 とても貴重な体験ができました。今後、実際にSoftLayerを使用してみたいと思います。

インターン(その7)

豊橋技術科学大学の近藤です。  pythonをあまり触ってこなかった私が、 躓いた点、気を付けるるべきと思った点をまとめてみました。 Logger Djangoで使うコマンドを作成した際、ログ表示にprintを使っていましたが、 printでのロギングはよろしくないということなので、Loggerについて調べてみました。 基本的な使い方 import logging logger = logging.getLogger('hoge.command') logger.setFormatter(logging.Formatter('HogeCommand:%(message)s')) logger.setLevel(logging.DEBUG) logger.info('fuga') ログのレベルは DEBUG < INFO < WARNING < ERROR < CRITICAL の順。設定レベル以下のログは出ない printだと改行させずにログをだし、処理が終わったらステータスを出して改行する のような使い方ができたが、loggerでは難しいようで。 python ver3.2以降であれば、stream_handler.terminatorに改行コード が入っているので、空文字にしてやれば改行されないらしい。 Exception.message @ version2.6 except Exception as e: logger.warning(e.message) Filepython 2.6だと怒られるので、 logger.warning(e) logger.warning(e[0]) logger.warning(e.args[0]) logger.warning(e.str()) のどれかでOK。ただ、e.str()だとUTF-8が化けるので注意。  Popen os側のコマンドをたたく際に、os.systemや、commands.getstatusoutput を使っていたが、subprocess.Popenのほうが出力等の制御がしやすく、 Ctrl-cが送られてきた際にも処理を止めてくれたりするので使って

インターン(その6)

豊橋技術科学大学の近藤です。 只今、Djangoプロジェクトのリポジトリを指定して実行すると、 Clone,  Virtualenv作成, pipでのfreezeインストール, Test, cx_freezeでのBuild, ZIP圧縮 を自動的に行うDjangoアプリを作成中です。 その際に、いくつか躓いた点があったのでまとめてみました。  os.path.realpathではチルダは使えない よく考えたら動かないのは当然ですが、なかなか気づきませんでした。 os.path.realpath('~/.virtualenv/hoge/bin/pip') は、 /home/kondo/django/fuga/~/.virtualenv/hoge/bin/pip になるそうで。 チルダの展開は os.path.expanduser がやってくれる。 os.path.expanduser("~/.virtualenv/hoge/bin/pip') -> /home/kondo/.virtualenv/hoge/bin/pip Test時のカレントディレクトリに注意する ビルドしたいプロジェクト内でテストを実行しようと、manage.py test を実行したら こんなエラーをはいていました。 File "/usr/lib64/python2.7/unittest/loader.py", line 267, in _find_tests raise ImportError(msg % (mod_name, module_dir, expected_dir)) ImportError: 'tests' module incorrectly imported from '/home/kondo/django/ fuga/.build/piyo/myapp'. Expected '/home/kondo/django/fuga/myapp'. Is this module globally installed? 発生条件が 親プロジェクト内のディレクトリに存在する 子プロジェクトをテストしようとする

インターン(その5) Slack Bot 作成まとめ2

豊橋技術科学大学の近藤です。 昨日のSlackBotまとめに足りない点があるので、 別にまとめます。 1. API Tokenの取得 https://api.slack.com/web から取得するのは、ユーザのTokenでした。 Bot用のトークンを取得する方法は、 Configure Integrations(左チーム名のドロップダウン)  -> Bots を Add(下の方)    -> デフォルトの名前を決定する      -> API Token  でした。 2. Markdownを使う mrkdwnをTrueにする。 data = { 'text': '``` print(`hoge`) ```', 'mrkdwn': True, 'attachments': [attachment, ], } attachments内では、mrkdwn_inにキーを記述 attachment = { 'fallback': 'fuga', # attachmentsの表示ができない端末用の文字列 'pretext': 'piyo', # attachmentの上にtextと同じように出力 'title': 'タイトル', 'text' : '*hogehoge*',  'fields': [field, ], 'mrkdwn_in': ["pretext", "text", "title", "fields", "fallback"], } mrkdwn_inに記述できるのは5種類。 3. URLの記述 URLを記述する際は '<' , '>' を使うといいらしい。 ただ、使わなくてもリンクを張ってくれる。 ただ、 'text': '[ <http: www.youtub