makeできないとき。
make したとき、
err:wineconsole:WCUSER_SetFont wrong font
err:wineconsole:WINECON_Fatal Couldn't find a decent font, aborting
といったエラーが出るときは、Wineの問題がある。
export LANG=C
とすればOK
Ploneのコンテンツを公開したときTwitterにツイートする.
Plone4アドベントカレンダー2011の21日目です.
ワークフローの状態が変わったらTwitterにツイートするサンプルを作成しました.
ngi.site.notificationです.
このサンプルでEventHandlerとRegistryの使い方,コントロールパネルの作成方法がわかります.
確実にエラーが出ると思います.出たら教えてください.
インストール方法
- buildout.cfgに以下を追加
extends = http://good-py.appspot.com/release/dexterity/1.1?plone=4.1.3 eggs = ngi.site.notification - ./bin/buildout を実行します.
- サイト設定のアドオンからNotificationをインストールします.
使い方
インストールが終わったら,サイト設定のNotification settingsを表示します.
Action:ワークフローのアクションのidを記入します.デフォルトでpublishが入っています.
comment:ツイートする際のコメントを記入します.
Consumer key,Consumer secret,Access token,Access token secretはhttps://dev.twitter.com/でapplication登録した際のOAuth設定情報を入力します.
設定は以上です.
試してみる
オープンソースOCWのeduCommons
みなさん、こんにちは。 本日は、私がPlone4 アドベントカレンダー2011の担当します。
オープンコースウェア
オープンコースウェア(OCW)を皆さんご存知でしょうか? これは、大学の講義をインターネットを使って無償で提供するという活動です。 代表例は、MITのOCWサイトでしょう。私もたまに利用しています。
eduCommons
eduCommonsは、教育機関がOCWを簡単に導入するためのアプリケーションです。OCWの担当者は、一番重要な、コンテンツに集中することができます。このeduCommonsは、Ploneをベースに作られています。今年、Plone4をベースとしたeduCommons4がリリースされました。ベースのPlone4のパフォーマンスが上がっているので、eduCommons4の性能も上がっていることが期待できます。
まず、どんなものかを見てみたい人は、educomonns.comにデモサイト(http://demo.educommons.com/)があるので使ってみるといいでしょう。
日本にもeduCommonsを使って活動している大学を紹介します。どれも、貴重な講義が掲載されていて一見の価値があります。
おわりに
Plone4を使って作られた教育向けアプリケーションの紹介をしました。もう一回、担当があるので、次回は、Plone4を使った開発のことについて書きたいと思います。
リンク
- 日本オープンコースウェア・コンソーシアム http://www.jocw.jp/
ErlangでOSコマンドの実行
cmd(コマンド)で結果が帰ってくる.
コマンドには,atomか文字列を渡す.
たとえば,os:cmd(ls). とか os:cmd(“ls -al”). である.
上棟
かねてより進めていたプロジェクトが始まりました.
Polygonのこと
cPolygonが3点ないとエラーを出してしまう見たい.回避策として,1点の時は,その点を中心としたサークルに変換,2点の時は,2点を結ぶ線にオフセットする線を作成して,4点に変更する.
SSO利用時のlogoutスクリプト
SSOのlogoutスクリプト
from Products.CMFCore.utils import getToolByName
try:
from Products.CMFPlone import transaction_note
except ImportError:
from Products.CMFPlone.utils import transaction_note
from Products.PluggableAuthService.PluggableAuthService import logger
logger.info("REQUEST.cookies = %r" % repr(context.REQUEST.cookies))
try:
context.acl_users.logout(context.REQUEST)
except:
pass
target_url = context.REQUEST.URL1.replace('$', '$$')
skinvar = context.portal_skins.getRequestVarname()
path = '/' + context.absolute_url(1)
if context.REQUEST.has_key(skinvar) and not context.portal_skins.getCookiePersistence():
#logger.info("expiring skin cookie")
context.REQUEST.RESPONSE.expireCookie(skinvar, path=path)
sdm = getToolByName(context, 'session_data_manager', None)
if sdm is not None:
#logger.info("got session_data_manager")
session = sdm.getSessionData(create=0)
if session is not None:
#logger.info("invalidating session")
session.invalidate()
if context.REQUEST.cookies.has_key('__ac'):
#logger.info("building local account logout URL")
transaction_note('Logged out')
target_url += '/logged_out'
context.REQUEST.RESPONSE.redirect(target_url)
else:
#logger.info("building shibboleth lazy logout URL")
config = context.acl_users.ShibbolethLogin.getConfig()
spliturl = target_url.split(':')
if config['http_logout_to_http']:
spliturl[0] = 'http'
try:
if config['http_login_url'][0][1][-1] == '=':
splitpath = spliturl[2].split('/')
port = str(config['http_login_to_port'])
if (spliturl[0] == 'https' and port == '443') or \
(spliturl[0] == 'http' and port == '80'):
# don't include default ports
del spliturl[0]
else:
splitpath[0] = port
if splitpath:
spliturl[2] = '/'.join(splitpath)
else:
del spliturl[2]
target_url = config['http_logout_url'] + ':'.join(spliturl) + '/logged_out'
else:
raise IndexError
except IndexError:
target_url = ':'.join(spliturl)
target_url = '%s/Shibboleth.sso/Logout?return=%s' % (target_url, target_url)
context.REQUEST.RESPONSE.redirect(target_url)
print 'This is the %s "%s" in %s' % (script.meta_type, script.getId(), context.absolute_url())
return printed
Blobのファイルはどこに保存されている?
明けましておめでとうございます。と言っても1月ももう後半ですが。
Ploneを使っていて、ふと、Blobフィールドのファイルがどこに保存されているか知りたくなりました。
f = obj.getField('file')
blob = f.getUnwrapped(obj)
zodb_blob = blob.getBlob()
blob_file = zodb_blob.open()
blob_file.name
で、このnameがファイルシステムに保存されているファイルのフルパスになります。
なお、zodb_blob._p_oid を整形したものが Pathになっているぽい。
今年もよろしくお願いいたします。
collective.xdv でコンテンツタイプごとのテーマテンプレート切り替え
collective.xdv
今まで、テーマテンプレートとルールを切り替えるのは、「コントロールパネルでできる、URLの正規表現マッチだけ。」と思っていた。
でも、こいつは、diazo(xdv)サーバーを使っている。だから、diazo(xdv)の書き方にそって、ルール内に<theme />タグで書いてあげれば、コンテンツタイプごとに切り替えだってできるのだ。
たとえば、ドキュメントコンテンツタイプでテンプレートを切り替えるには、 <theme href=”sample.html” css:if-content=”body.portaltype-document”/> てな感じで簡単に切り替えができる。
これができたので、ルールのネストなんかもできるに違いない!後日テストしよう。
ロゴとフッターを変えるプロダクト
Plone4のデザインは、素敵だけど、ロゴとフッターの変更が面倒だと常々感じる。TTTWで変更できるけど、ZMIにアクセスして、base_propertiesをいじったり、Page templateファイルをいじったりしないといけない。
Ploneには、サイト設定という場所がある。なぜ、ロゴとフッターを変更するというサイト作成において、重要なものがないのだろうか?と思っていた。
そこで、今回、さくっと作ってみた。Plone4でしかテストしていないけど、とりあえず、動いている感じ。
ngi.theme.simple
http://pypi.python.org/pypi/ngi.theme.simple/1.0b3
override.zcmlを使ったりとちょっと?というところもあるけど、それは、これから直していきます。
Plone で動くBlogプロダクト
Plone で動くBlogプロダクトで便利だなーと思うのは、collective.blogging。
これは、標準アイテムを拡張してBlogにしてしまうもの。PloneのUIにはマッチしたものだけど、単純に記事を書いて、公開したいというには、ちょっと面倒。
そこで、勉強がてらBlogを作ってみた。(まだ公開していないけど。)
以前、dexterityの勉強のために、
Products.ngiNikkiというのを作っていて(まだ作成中・・・。)、これをArchetypeベースにして、lightboxを同梱し、Plone3とPlone4両方で動くようにしたもの。
残すタスクは、ポートレット部分と国際対応、そして、すこしのテンプレート修正。あと、ドキュメントか。
プロダクト名は、ngi.site.blog となる予定。
今月末の公開を目指す。
なお、使ってもらっているサイトは、こちら↓↓
http://www.edu-con.jp/s-blog
Plone 4 dev用buildout
以下、最近利用する頻度が多くなってきたのでメモしておく。
Plone4 のbuildoutの場所
http://svn.plone.org/svn/plone/buildouts/plone-coredev/branches/4.0/
MeeGoでGAE SDK for Pythonで開発する時のポイント1
MeeGoは、Python2.6が標準で入っています。しかし、GAEは、Python2.5を必要とするため2.5を自前でインストールする必要があります。
Pythonをコンパイルする前に、「ソフトウェアの追加・削除」もしくはYumで下記のパッケージを導入します。
- openssl-devel
- sqlite-devel
これらを導入後、Pythonをコンパイルします。








