【Python】 Google Api Python ClientでYoutubeにアップされた動画を日本語で検索する

1ページ目は取得できるが list_nextメソッドを使った時にUnicodeEncodeErrorが出力される。

日本語が含まれたurlの出力、取得に問題があったので、とりあえずの絆創膏。

site-packages/apiclient/discovery.py

def createNextMethod

newq[0] = (newq[0][0], urllib.unquote(newq[0][1].encode('raw_unicode_escape').decode('utf-8').encode('utf-8')))

"configure: error: no acceptable C compiler found in $PATH" の解決方法

CentOSで./cofigureしようとしたらエラー。 コンパイラがない。

yum -y install gcc

【Twitter Bootstrap2.3.1】モーダルを表示された状態でスクロールした時にページ全体がスクロールするのを止める

問題

モーダルが表示されている時はページ全体をスクロールさせたくない。

解決方法

  • 2.3未満の場合はcssだけで完了。
body.modal-open{
    overflow: hidden;
}
  • 2.3以降はモーダルが表示された時にbodyに.modal-openがつかないのでjQueryで処理する。
$(".modal").on("shown", function(){
    $("body").addClass("modal-open");
});

$(".modal").on("hidden", function(){
    $("body").removeClass("modal-open");
});

参考

Prevent BODY from scrolling when a modal is opened

【Django1.4】テンプレート内でviews.pyから渡さなくてもrequest変数を使えるようにする

問題

{{ request.get_full_path }}

などをテンプレートで使おうと思っても,
標準の設定ではviews.pyからrequest変数を渡さないといけない.

それは面倒だ.

解決方法

setting.pyの TEMPLATE_CONTEXT_PROCESSORS を書き換える.そもそもsettings.py内に

TEMPLATE_CONTEXT_PROCESSORS = (...)

の記述がなかった.記述がない場合はDjango側が勝手にデフォルトの値で動かしてくれているのだろう.

今回はtemplate内でrequest変数を使いたいので デフォルトの値に 'django.core.context_processors.request' を追加したものをTEMPLATE_CONTEXT_PROCESSORS=(...)として記述する.デフォルトの確認 → デフォルトの値(document)

'django.contrib.auth.context_processors.auth', # デフォルト
'django.core.context_processors.debug', # デフォルト
'django.core.context_processors.i18n', # デフォルト
'django.core.context_processors.media', # デフォルト
'django.core.context_processors.static', # デフォルト
'django.core.context_processors.tz', # デフォルト
'django.contrib.messages.context_processors.messages', # デフォルト
'django.core.context_processors.request', # 追加

【Postfix】【さくらVPS】送ったメールが迷惑メール(スパムメール)扱いされないために

送ったメールがスパムメールとして扱われる

【Postfix】【Django1.4】さくらvpsでPostfixを使ってメール送信用サーバを実装した時のメモでメールを送れるようになった. しかしながら,Gmail,Yahoo! Mail, Hotmailに送るとすべてのサービスで迷惑メールと判断されてしまい,迷惑メールフォルダに入れられてしまう.誰も迷惑メールフォルダなんてみることはない.

だから何としても送ったメールがスパム判定されないようにする必要があった.

※ ちなみにこのページによる”スパムメール扱い対策”前のPostfixの設定は上で紹介した記事ののまま

スパムメールとして扱われないようにするために

Gmailスパムメールと扱わなくなるまでに設定しては確認,設定しては確認していった. 設定していった順番は以下の通り.

  1. DNS逆引きレコード変更
  2. SPFの設定
  3. DKIMの設定

DNS逆引きレコード変更

さくらインターネット VPSコントロールパネルよりホスト名がメール送信時のFromと同じドメイン名になっていることを確認

DNSの確認は以下.ドメイン名が表示されればおk.されなかったらただ待つ.

nslookup serverIP

SPFの設定

Sender Policy Framework
送信したFromアドレスのドメイン名とサーバのドメイン名が一致しているかを調べ,一致していたら認証する.これによってアドレス詐称(なりすましなど)をしていない事を受信側が調べ,知ることができる.DNSサーバのゾーンファイルをちょこっと編集するだけで簡単に設定できる.

  • さくらVPSでのSPFレコードの追記の仕方

VPSコントロールパネルのネームサーバ登録から”ドメインリスト”→”ゾーン編集”で設定する.

エントリ名:
@
種別:
TXT
値:
v=spf1 a:ドメイン名 ~all
DNSチェック:
する
TILの指定:
チェックしない

※変更したらデータ送信を忘れずに

DKIMの設定

Domainkeys Identified Mail
送信側で署名し,受信側で署名を照合する.

  • DKIMの主な流れ
送信側: 署名する公開鍵をDNSサーバで公開
送信側: メール送信時にメールにDKIM-Signatureヘッダを追加
受信側: DKIM-Signatureから公開鍵の取得先を取得,公開鍵をゲットして照合

今回はOpenDKIMを使う

インストールと鍵(site_com_selector.txt, site_com_selector.private)の作成
-sは適当なセレクタ名,-dはドメイン名

sudo yum install opendkim
sudo opendkim-genkey -D /etc/opendkim/keys/ -s site_com_selector -d site.com

site_com_selector.txtの内容をゾーンファルに.さくらVPSの場合は,

エントリ名:
site_com_selector
種別:
TXT
値:
v=DKIM1;k=rsa; p=M......B
DNSチェック:
する
TILの指定:
チェックしない

DKIMレコードをチェックする時は以下のように.
ここが詳しい→Checking your DKIM DNS record

nslookup -q=txt site_com_selector._domainkey.site.com
や
dig site_com_selector._domainkey.site.com txt

※ 浸透には一日程度かかることもあるらしいが…

  • /etc/opendkim.confの設定
# 送信と受信
Mode sv

# コメントアウト
# KeyFile /etc/opendkim/keys/default.private

# アンコメント
KeyTable refile:/etc/opendkim/KeyTable

# アンコメント
SigningTable refile:/etc/opendkim/SigningTable

# アンコメント
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts

# アンコメント
InternalHosts refile:/etc/opendkim/TrustedHosts 
  • /etc/opendkim/KeyTableの設定
site_com_selector._domainkey.site.com site.com:site_com_selector:/etc/opendkim/keys/site_com_selector.private
  • /etc/opendkim/SigningTableの設定
*@site.com site_com_selector._domainkey.site.com

OpenDKIMの設定は終了.
次にPostfixの設定

最下部に追加

smtpd_milters = inet:127.0.0.1:8891

Postfixの設定も終了.

sudo service opendkim restart
sudo service postfix restart

/var/log/maillogで問題がなさそうであればおk.あったら設定を見直す

実際に送信してみる

ログを垂れ流しながら送信.

sudo tailf /var/log/maillog

送信した時にOpenDKIMのメッセージ,

DKIM-Signature header added (s=site_com_selector, d=site.com)

が流れれば送信時の対処は問題ない.

おわり

一度迷惑メールと判断されるとそれが解除されるのに時間がかかる (特にGmail)

【Postfix】【Django1.4】さくらvpsでPostfixを使ってメール送信用サーバを実装した時のメモ

DjangoとPostfixを使ってメールを送るまでのメモ

Postfixの導入

Postfixのインストール

# インストール
sudo yum install postfix

# 使うMTAをPostfixへ変更
sudo alternatives --config mta

# Postfixの起動
sudo /etc/rc.d/init.d/postfix start

# Postfixの自動起動をon
sudo chkconfig postfix on

Postfixの設定

myhostname = FQDS名
mydomain = ドメイン名
myorigin = $mydomain

# 待ち受けるinterface
inet_interfaces = localhost

# ipv6は使わない
inet_protocols = ipv4

# @以降
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 中継するip
mynetworks = 127.0.0.0/8

# telnetなどで接続された時にサーバソフト名を隠す
smtp_banner = $myhostname ESMTP unknown

# header_checksの指定
header_checks = regexp:/etc/postfix/header_checks

/etc/postfix/header_checksの編集

  • 以下追加
/^Received:.*127\.0\.0\.1.*/ IGNORE

/etc/sysconfig/iptablesの編集

  • SMTPのポート(25)を開ける

Djangoの設定

settings.pyの編集

# 追加
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25

これでdjango.core.mail.send_mail()などが使えるようになった.

【Django1.4】テンプレートで変数内(テキスト)のurlをリンクに置換する

問題

変数内にhttp://で始まる文字列を見つけたらそいつをリンクで置き換えたい

解決方法

{{ value|urlize }}
{{ value|urlizetrunc:15 }}  # 15文字目でurlをちょんぎる
{{ value|urlize|linebreaksbr }} # おk
{{ value|linebreaksbr|urlize }} # だめ