Lionでportが動かなかった

新しいMacBookPro買ったので移行アシスタントでSnow Leopardのディスクからデータ移したらportで入れたツールまできちんと移っててすごいなぁと感心してたんだけど(Snow Leopard以前の移行アシスタントではportそのものも移せなかったような気がするけど気のせい?)
実際にportを使ってみると port selfupdate とかするとエラーが出ちゃってとりあえず入れてたやつは動いているけど、新規でインストールとか出来ない状態になってました。

なんだろなぁと思いながらもしかしてLion用のXcode入れないとダメなんじゃね?とか思ってApp Storeからインストールしてみたら案の上動いたからとりあえずメモ

Filed under: Mac,Programming — maesan 6:16 PM

[cakePHP] floatのフィールドが指数表記になっちゃう

cakePHPでfloatのフィールドを使った場合、7桁を超える数値を入れたらフォームで指数表記されちゃうのが困る。

これが

こうなる

仕方ないのでviewで

$this->data["Article"]["point"] = sprintf('%.2f', $this->data["Article"]["point"]);

って書いたらいけるかと思ったらいけなかった。
よくよく考えたらviewをレンダリングする前にformが出来上がってんじゃなかったっけ?w
ってことに気付いて素直にcontrollerに書いたら期待通りに動いた。

function edit($id = null) {
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid article', true));
$this->redirect(array('action' => 'index'));
}
if (!empty($this->data)) {
if ($this->Article->save($this->data)) {
$this->Session->setFlash(__('The article has been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The article could not be saved. Please, try again.', true));
}
}
if (empty($this->data)) {
$this->data = $this->Article->read(null, $id);
$this->data["Article"]["point"] = sprintf('%.2f', $this->data["Article"]["point"]);
}
}


何かイマイチすっきりしないのですが、他の解決策ないのかねぇ?

Filed under: cakePHP,PHP,Programming — maesan 5:17 PM

[cakePHP] 1.3でForm->selectのパラメータ変わったのか

今までだと、formヘルパーを使って空白を出さないselectは以下の様に書いてました

echo $this->Form->select('hoge_id', $hoges, null, null, false);

で1.3でこれやるとダメで、ソース見たらこうやるのが正しいっぽい

echo $this->Form->select('hoge_id', $hoges, null, array('empty' => false));

だれかCookbookのフォームヘルパーのselectのページを修正してください><
http://book.cakephp.org/ja#!/ja/view/1430/select
↑英語版を見るとそっちは正しいみたいだった!

Filed under: cakePHP,PHP,Programming — maesan 11:31 PM

[Python] メール送信

Pythonでメールを送信したかったのでやってみた

基本的には以下のページのコピペなのですが、1点引っかかったのでメモ
Pythonでメールを送信したい人のためのサンプル集

#!/usr/bin/env python
# encoding: utf-8

import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate

def SendMail(to_addr, subject, body, from_addr=None):
if from_addr is None:
from_addr = "hoge@maesan.jp"
msg = MIMEText(body)
msg["Subject"] = subject
msg["From"] = from_addr
msg["To"] = to_addr
msg["Date"] = formatdate()

s = smtplib.SMTP()
s.sendmail(from_addr, [to_addr], msg.as_string())
s.close()

if __name__ == '__main__':
from_addr = 'hoge@maesan.jp'
to_addr = 'foo@maesan.jp'
subject = 'test mail'
body = 'test'
SendMail(to_addr, subject, body, from_addr)

これでおkだと思ってたのですが、実行すると

AttributeError: SMTP instance has no attribute ‘sock’

ってエラーがでた。

多分メールサーバーとの接続に失敗したのかなと思い、明示的にサーバーとポートを指定したら動いた。

# s = smtplib.SMTP() # ↓こんな感じに変更
s = smtplib.SMTP("localhost", 25)

参考ページ

Pythonでメールを送信したい人のためのサンプル集
[ mailman-Bugs-1315417 ] SMTP problem

Filed under: Programming,Python — maesan 11:29 AM

jQueryで.postしようと思ったらfileはpostできない件

今更ながらjQueryにハマってまして、今日も画面遷移なしで画像がアップロードできるスクリプトを書こうとしたのですが、Javascriptではfileをpostできないことに気付いた><

で、画面遷移なしでファイルをアップロードしようと思ったらiframeを使ったりするらしい。Ajaxではないけど、Ajaxっぽい動きですな。

ということでサクっと書いてみた

アップロード用ページ upload.html

<html>
<head>
<style>
#dummy{
/* display:none; するとSafariだとおかしくなるらしい? */
border:0px;
width:0px;
height:0px;
}
#image{
display:none;
max-width:480px;
}
</style>
</head>
<body>
<iframe name="dummy" id="dummy"></iframe>
<div id="message"></div>
<img id="image"></div>
<form action="upload.php" method="post" target="dummy" enctype="multipart/form-data">
<input type="file" name="img" />
<input type="submit" value="Upload">
</form>
</body>
</html>

注意点はiframeにdisplay:none;するとSafariだとおかしくなるらしいんだけど、ウチの環境では別にどっちでも行けた(Mac OSX 10.6.6, Safari 5.0.3)
http://groundwalker.com/blog/2007/02/file_uploader_and_safari.html

ファイルアップロード処理とか upload.php

<?php
$error = 0;
$msg = "";
$filename = "";
if ($_FILES["img"]["error"] == 0) {
$info = getimagesize($_FILES['img']['tmp_name']);
if ($info[2] != 2 && $info[2] != 3 && $info[2] != 6) {
$msg = "画像ファイルでお願いします。";
$error++;
} else {
$exts = array(2 => '.jpg', 3 => '.png', 6 => '.bmp');
$ext = $exts[$info[2]];
$filename = "tmp/hoge".$ext;
move_uploaded_file($_FILES["img"]["tmp_name"], $filename);
chmod($filename, 0666);
$msg = "ファイルをアップロードしました。";
}
} else {
$msg = "ファイルのアップロードに失敗しました。";
$error++;
}
// jsonで出してeval
$results = sprintf('{"error":"%s","msg":"%s","filename":"%s"}', $error, $msg, $filename);
?>
<html>
<head>
<script src="jquery.js"></script>
<script type="text/javascript">
//<![CDATA[
$('document').ready(function(){
var results = eval('(<?php echo $results;?>)');
// 親ウィンドウのオブジェクトはwindow.parent.documentってやったらとれる
$('#message', window.parent.document).html(results["msg"]);
if (results["error"] == 0) {
$('#image', window.parent.document).css('display', 'block').attr('src', results["filename"]);
}
});
//]]>
</script>
</head>
<body>
</body>
</html>

別にこの程度ならjQuery使う必要は全然ないんですけどねw
フツウに書いてもコード量は変わらんですw

ポイントはjQueryでiframeから親windowのDOM要素を操作する場合は
$(‘対象のidとか’, window.parent.document)
ってやるとできる。

素のjavascriptで書いた
parent.document.getElementById(“対象のid”)
とほぼ一緒かな。

Filed under: Javascript,PHP,Programming — maesan 9:15 PM

[PHP] move_uploaded_file→ご一緒にchmodはいかがっすか?

いや、たまにやるんだけど自分メモ

PHPでファイルアップロードする場合に

$filename = "hoge.jpg";
move_uploaded_file($_FILES["hoge"]["tmp_name"], $filename);

とかするっしょ?
んで普通に使う分には問題ないんだけど、デフォルトのパーミッションが600で保存されちゃうので、ちょっとftpとかSCPでアクセスした時に何にもできないってなるんだよね><
root権限とかあったらイイけど、フツウにレンタルサーバーとかでやっちゃったらもう大変w
わざわざファイルの削除するスクリプト書いてapacheに実行してもらわないといけないw
なので、move_uploaded_fileしたあとはchmodで666とかにしといたほうがよいです。

$filename = "hoge.jpg";
move_uploaded_file($_FILES["hoge"]["tmp_name"], $filename);
chmod($filename, 0666);

※ 666じゃなくて0666って書かないとダメかもよ

Filed under: PHP,Programming — maesan 5:03 PM

[MySQL + Linux] sonameでハマる

Python+MySQLdbでちょっとしたスクリプト書いてたんだけど、ローカルのMacではまともに動くのに、LinuxサーバーではSQLのsyntaxエラーが出ちゃいました。
はじめは全くわけが分からず、なんで怒られてるのかわからなかったのですが、どうやら原因はsonameってフィールド名を使ってたかららしい。

正直sonameって何やねん?って感じだったのですが、

Linuxのshared object呼び出したりする時の名前らしいね!
MySQL+Linuxではユーザー定義関数とか作る時にsonameって使うらしいね!
てかSQL書く時にフィールド名は`で囲めよオレ!

Filed under: Linux,MySQL,Programming — maesan 7:21 PM

[Django] 同じモデルに対して複数の外部キーを設定したい

Django で同じモデルに対して複数の外部キーを設定したかったのですが、ちょとハマったのでメモ

例えば、試合モデルとチームモデルがあって、試合モデルにホームチームとアウェイチームを関連付けたい

DB的に言うとこんな感じ

CREATE TABLE `team` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(80) NOT NULL
);
CREATE TABLE `game` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`game_date` datetime NOT NULL,
`home_team_id` integer NOT NULL,
`away_team_id` integer NOT NULL
);

んでモデルの定義はこんな感じにしてみた

class Team(models.Model):
name = models.CharField(max_length=80)

class Game(models.Model):
game_date = models.DateTimeField()
home_team = models.ForeignKey(Team)
away_team = models.ForeignKey(Team)

んでsyncdbしてみたらこんなエラー出た

Error: One or more models did not validate:
hoge.game: Accessor for field ‘home_team’ clashes with related field ‘Team.game_set’. Add a related_name argument to the definition for ‘home_team’.
hoge.game: Accessor for field ‘away_team’ clashes with related field ‘Team.game_set’. Add a related_name argument to the definition for ‘away_team’.

しばらく悩み調べた結果related_nameを定義すればおkだった。

class Team(models.Model):
name = models.CharField(max_length=80)

class Game(models.Model):
game_date = models.DateTimeField()
home_team = models.ForeignKey(Team, related_name="home_team")
away_team = models.ForeignKey(Team, related_name="away_team")

参考ページ

Multiple Foreign Keys to same Table?

Filed under: Django,Programming,Python — maesan 1:11 AM

[Django] CSRF verification failed.

取りあえずDjangoはじめて、とりあえずformつくって、とりあえずPOSTしてみて「CSRF verification failed.」って出たらsettings.pyのMIDDLEWARE_CLASSESにdjango.middleware.csrf.CsrfResponseMiddlewareを入れとくとおk


MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfResponseMiddleware', # <-コレ
)
Filed under: Django,Programming,Python — maesan 7:30 PM

[svn] ログを詳細に表示するには –verbose をつける

いつも忘れるので覚え書き

$svn log –verbose hoge.txt

Filed under: Programming — maesan 9:45 PM
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)