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

技術ネタとかの備忘録

最近の技術ネタとかの備忘録を書いていくブログです

Djangoアプリのプロファイル

Djangoのプロファイル方法のメモです。
Heroku上で運用しているDjangoアプリが遅いのでその調査で使用しました。
プロファイルにはdjango-extensionsを使用しました。
RunProfileServer — django-extensions 1.7.7 documentation

環境

  • django - 1.10.5
  • django-extensions - 1.7.7
  • qcachegrind - 16.12.0
  • qt - 5.8

方法

django-extensionsのインストール

pipコマンドでdjango-extensionsをインストールします。

$ pip install django-extensions

settings.pyのINSTALLED_APPSにdjango-extensionsを追加します。

INSTALLED_APPS = [
  ...
  'django_extensions',
]

サーバの起動

runprofileserverコマンドでサーバを起動します。

$ python manage.py runprofileserver --kcachegrind

プロファイル結果の取得

プロファイルしたいページをWebブラウザで表示します。
/tmpディレクトリにprofファイルが出力されます。

$ ll /tmp
...
-rw-r--r--   1 bllinko  wheel  498887  3  8 14:17 root.000812ms.1488950279.prof

プロファイル結果の表示

brewコマンドでqcachegrindとqtをインストールします。

$ brew install qcachegrind qt

qcachegrindコマンドの引数にファイル名を指定して実行します。

$ qcachegrind /tmp/root.000812ms.1488950279.prof

こんな感じに表示されます。 f:id:bllinko:20170308142423p:plain

HerokuのMongoDBのデータをローカルDBへインポートする

HerokuのMongoDBのデータをローカルDBへインポートする方法のメモ。
ちなみに、mLab上からMongoDBのデータをエクスポートすると料金が発生する模様。

MongoDBの接続情報

HerokuのconfigコマンドでMongoDBの接続情報を確認します。

$ heroku config --app アプリ名
=== xxx Config Vars
MONGODB_URI:  mongodb://ユーザ名:パスワード@ホスト名:ポート番号/DB名

MongoDBのエクスポート

MongoDBのデータをエクスポートします。
コマンドを実行したカレントディレクトリにエクスポートされます。
デフォルトだと"dump/DB名"という名前のディレクトリが作成されます。

$ mongodump --host ホスト名 --port ポート番号 --username ユーザ名 --password パスワード --db DB名

MongoDBのインポート

ローカルのMongoDBへインポートします。

$ mongorestore -d ローカルのDB名 --drop エクスポートしたディレクトリパス

Rails+MongoidでMongoDBに画像ファイルを保存する

今までHerokuで運用していたRailsアプリが、PostgreSQLの無料枠10,000レコードを超えるところだったので、PostgreSQLからMongoDBへ移行しました。

なんていったって、MongoDBのアドオンmLabは無料で500MBまで使い放題ですからね。 せっかくなのでMongoDB特有の機能を使おうと思い、画像ファイルをGridFSを使って保存しました。

バージョン

  • rails - 4.2.5
  • mongoid - 5.2.0
  • carrierwave-mongoid - 0.10.0
  • mini_magick - 4.6.1

使い方

CarrierWave::Uploader::Baseクラスを継承したUploaderクラスを作成します。

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick

  # :grid_fsを設定します。AWS S3に画像ファイルを保存する時は:fogを設定します。
  storage :grid_fs

  # 画像ファイルを120x120サイズへ変換して保存します。(サイズ変換が必要なければこの記述は不要です)
  process :resize_to_fill => [120, 120]

  # 画像ファイルにアクセスするためのURLのファイル名より前の部分になります。
  # ここでは"/users/image/1"な感じになります。
  def store_dir
    "/#{model.class.to_s.underscore.pluralize}/#{mounted_as}/#{model.id}"
  end

  # 画像ファイルがないときのURLになります。
  def default_url
    "/img/no-image.png"
  end

  # 許可する画像ファイルの拡張子になります。これ以外の拡張子の場合、バリデーションでエラーになります。
  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # 画像ファイルにアクセスするためのURLのファイル名の部分になります。
  # ここでは"original.jpg"な感じになります。
  def filename
    "original.#{model.image.file.extension}" if original_filename
  end

end

Modelクラスにmount_uploaderを使って画像ファイルを保存するフィールドを追加します。 (ここではUserというModelクラスに追加します。)

class User

  include Mongoid::Document

  mount_uploader :image, ImageUploader

end

画像ファイルのURLのアクセス先を作成します。

ルーティングに画像ファイルのURLを追加します。

Rails.application.routes.draw do

  get "/users/image/:id/*path", to: "users#image"

end

ControllerクラスでMongoDBから画像ファイルを取得して返却します。

class UsersController < ApplicationController

  def image
    @user = User.find(params[:id])
    self.response_body = @user.image.read
    self.content_type = @user.image.content_type
  end

end

画像ファイルの表示は、image_urlメソッドで表示できます。

  = image_tag @user.image_url

株式会社イノベータからやらせの営業メールがきた

今日、アプリのお問い合わせ窓口からこんなメールがきました。
いわゆる、お金払ったら高評価のレビューをいいねするよってことですかね?

ご担当者様

突然のご連絡、失礼いたします。
UIscopeを運営しておりますイノベータの平石です。
 
…省略…
 
UIscopeで保有する30万人のモニターが
高評価レビューをいいね(役に立つボタンの押下)することで、
レビュー自体の評価を上げ、ファーストビューに表示するという内容です。
 
…省略…
 
■高評価レビュー表示をキープ
・低評価レビューが表示され次第、即日対応
・低評価レビューを、高評価レビューに変更
・運用を継続し、高評価レビュー表示をキープ
 
…省略…
 
アプリページのダウンロード率up効果がでておりますので、
是非、ご興味がございましたら、お気軽にお問合せください。
何卒、宜しくお願い致します。

DjangoでPostgreSQLのArray型に対して演算子&&を使う方法

最近、Pythonの勉強がてらDjnagoでWebアプリを作ってます。
DjangoのQuerySet APIで、PostgreSQLのArray型のカラムを扱ってた時に少しハマりました。

Djangoのドキュメントに記載がなかったのでメモがてら残しておきます。
(私が見つけられていないだけだと思いますが・・・)

やりたかったこと

PostgresSQLのドキュメント*1にある演算子「&&(重複する(共通要素を持つ))」をDjangoのQuerySet APIで使いたい。

ARRAY[1,4,3] && ARRAY[2,1] => True

解決方法

Xxxx.objects.filter(xxx__overlap=xxx)

PostgreSQLの英語のドキュメントを読むと「重複する=overlap」なんですね。
勉強になりました。

無料でドメインを取得する「Freenom」

無料でドメインを取得できるサービスがこちらです。

Freenom - 誰でも利用できる名前

トップページの検索フォームに取得したいドメイン名を入力して検索すれば無料で取得できるか表示されます。

今のところ、下記のトップレベルドメインなら無料で取得できるようです。 ただし、永久無料ではなく最大12ヶ月まで無料で、それ以降は別途料金が発生してくるので注意が必要です。 開発目的等で一時的に利用する分には問題ないと思います。

  • .tk
  • .ml
  • .ga
  • .cf
  • .gq

ドメインを取得する上で、クレジットカードや住所等の個人情報も入力する必要はありません。 なので、利用期間が過ぎて、勝手に料金が請求される心配もありません。

ちなみに、ドメインの利用状況をサイト側でチェックしているようで、一定期間の利用がないと以下のメールが飛んできます。 次回チェックした際にまだ使ってなかったらドメインを没収するよ的な内容です。

Dear bllinko,

The Freenom Review Team has visited your website today. Your domain: BLLINKO.CF

We found that the free domain name and/or the website address you used with your free domain name was not accessible or did not follow the guidelines set in our terms and conditions.

It may well be that you are still working on the content of your website and/or using your domain for other means. We kindly request to start using your new domain soon according to the terms and conditions which can be found at: http://www.freenom.com/en/termsandconditions.html

In a few days from now we will visit your website again. To prevent domain hijacking all domains that are not accessible or not follow the guidelines set in our terms and conditions will be cancelled.

Alternatively, you may upgrade to a Paid Domain. Paid Domains incur a different set of policies. For example, Paid Domains have no usage requirement.

You can upgrade using the Upgrade tab under domain management for your domain BLLINKO.CF.

We thank you for using Freenom.

なお、トップレベルドメインによっては「CNAME」の設定ができないものがありました。 tkドメインで「CNAME」を設定しようとすると以下のメッセージが表示されました。

Zone is not active yet.

Google AdSenseやCloudFlare等のサブドメインでは利用できないサービスを利用する際に無料ドメインは使えそうです。

ロ麺ズ@弘明寺

家から歩いて15分くらいのところにあるロ麺ズ。

最寄り駅は京急弘明寺駅ですが、かなり歩きます。
こんな住宅街によく店を出したなという感じです。
ただ、平日のお昼にも関わらず人はけっこう入っていました。

初来店だったので、スタンダードにラーメン醤油を注文しました。
見た目はあっさり目な感じがしますが、とても旨味が凝縮されています。
G麺7に近い感じのラーメンでした。

f:id:bllinko:20170205215836j:plain