[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

[Mac] phpでcurlが入って無かった

ちょっとお遊びでtwitter botでも作ろうかと思ってphpのOAuthライブラリのtwitteroauthを使おうと思ったら

PHP Fatal error: Call to undefined function curl_init() in /hogehogehogehoge/twitteroauth.php on line 199

って怒られた。

curlってwgetみたいなやつだっけ?
phpでそれ関係使ったこと無いので気付かなかったんだけど、phpでcurlを使えるようにしないとダメっぽい。
portでphp入れてたので以下でおkだった

$sudo port install php5-curl

Filed under: Internet,PHP,Programming — maesan 10:59 PM

WindowsでBasic認証のWebDAVをマウントできない件

ちょっとGB単位のファイルを遠隔地とやり取りしないと行けなくなって、なかなかオンラインストレージでそんな都合のいいのも少ないのでおウチのサーバーにWebDAVサーバー作っときゃイイんじゃね?って思ってやってみました。

サーバー構築方法

って言ってもApache2に標準でDAVのモジュール入っているので詳細は書きませんが、http.confとかでmod_davとmod_dav_fsが有効になってればおk
おウチのCentOSはデフォルトで有効になってた(前に自分でやったのかもしれないけど覚えてないw)
Debian系なら
a2enmod dav
a2enmod dav_fs
しとけばおk

んで設定を<Location>なり<Directory>なりでDavを指定する
今回はVirtualHostでやりたかったので以下の設定で試した

<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName dav.example.com
DocumentRoot /home/dav/public
<Directory /home/dav/public>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# ココからDAVの設定
Dav On
AuthType Basic
AuthName DAV
AuthUserFile /home/dav/.htpasswd
Require valid-user
</Directory>
</VirtualHost>

接続

Macの場合はFinderでcommand+kしたらネットワークのマウントできるので、URL入れてBasic認証のユーザーとパスワード入れたらおk、簡単

Windowsの場合にハマってしまった。
試したのはWindows7なのですが、マイコンピュータから「ネットワークの場所の追加」やったら「有効なフォルダではない」って言われるし、ネットワークから「ネットワークドライブの割当」ってやったら認証通らないし軽く途方に暮れた。。。

で、いろいろと調べてみるとどうやらWindowsの仕様ではWebDAVをマウントするためには、Basic認証の場合SSLでないとダメらしい。httpでBasic認証のWebDAVをマウントしたい場合はレジストリを書き換えればよいらしく、
¥HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥WebClient¥Parameters
のBasicAuthLevelを2に書き換えればおk
書き換え後はコマンドプロンプトでwebclientを再起動したら接続できるようになりました。
>net stop webclient & net start webclient

取りあえず素直にSSLの設定をすることにします><

参考

windows7でBASIC認証のかかったWEBDAVにログインできません

Filed under: Internet,PC — maesan 12:28 PM

[Python] MySQLdbでDictCursorとか知らんかったし

PythonでMySQLdbつかってデータを取得する時にこんな感じにやってた
DBはこのエントリーのやつとして

import MySQLdb

con = MySQLdb.connect(db="currency", host="127.0.0.1", port=3306, user='root', passwd='root')
sql = "select target, value, inverse, created from currencies order by created desc"
cur = con.cursor()
cur.execute(sql)
row = cur.fetchone()
print row

実行結果はこんな感じでタプルで返ってくる

(‘EUR’, 0.0089999999999999993, 111.111, datetime.datetime(2010, 12, 3, 22, 4))

この場合、為替レートととろうと思ったら row[2]とかしないといけないので全く直感的じゃないよね。
で、phpのmysql_fetcharray() したときみたいな辞書(ハッシュ)で扱いたいなぁと思ったのでこんなことやってみた。

fields = [field[0] for field in cur.description]
dict_row = dict(zip(fields, row))
print dict_row

こうすると望み通り辞書でデータが扱えるようになってうれしい

{‘inverse’: 111.111, ‘target’: ‘EUR’, ‘value’: 0.0089999999999999993, ‘created’: datetime.datetime(2010, 12, 3, 22, 4)}

って満足してたら実はDictCursorって便利なのがあったらしく

from MySQLdb.cursors import DictCursor

cur = con.cursor(DictCursor)
cur.execute(sql)
row = cur.fetchone()
print row

ってやったら上のと全く同じの取得できた><

{‘inverse’: 111.111, ‘target’: ‘EUR’, ‘value’: 0.0089999999999999993, ‘created’: datetime.datetime(2010, 12, 3, 22, 4)}

参考ページ

ジャンゴ バックエンドに依存しない DictCursor
pythonのmysqldbの使い方メモ

Filed under: Programming,Python — maesan 11:36 PM

[TextMate] Portで入れたPythonで動かない

PythonのコーディングにTextMateを使い始めたのですが、command+Rで実行させた時にどうもSnow Leopardのデフォルトで入ってるPythonで動いているみたいです。
Python2.5とかPython2.6とかを使い分けたいので、Portで入れたPythonを使って欲しいのですが、python_selectで設定しても全く関係無しでデフォルトのやつで動くみたい。

試しに以下のスクリプトを実行すると

import sys
import os

print sys.version
print os.environ['PATH']


ってなってた。
どうやらPATHが素の状態のままっぽいのでちょっと無理矢理感がありますがプロジェクトの設定でPATHに/opt/local/bin:/opt/local/sbin/:/usr/bin:/bin:/usr/sbin って入れてみると


Portで入れたPythonが動作しました。

Filed under: Programming,Python — maesan 1:49 PM

PythonでKeyErrorを回避する

ハッシュ(Python的には辞書)で存在しないキーでアクセスするとKeyErrorが出ちゃう。
データは必要なのでキーの存在確認をして、存在しなかったらデフォルトの値とかを表示したい場合に

data = {}
if 'hoge' in data:
print data['hoge']
else:
print "default"

ってやればいいんだけど、getを使うと超かんたんにできちゃう

data = {}
print data.get('hoge', 'default')

で、他にもsetdefaultってのがあるらしく、表示だけじゃなくてデータをセットしたい場合に

data = {}
# getでやるならこんな感じなのを
data['hoge'] = data.get('hoge', 'default')
# setdefaultならこんな感じで書ける
data.setdefault('hoge2', 'default2')

何か気持ちイイw

Filed under: Programming,Python — maesan 10:19 PM
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)