2005年03月18日

Ploneでユーザごとに好きなwysiwygエディターを選んでつかってもらう

PloneでつかえるwysiwygエディターはEpozだったりFCKEditorだったりCMFVisualEditorだったりいろいろあります。
でも複数のエディターをユーザごとに設定できるようにするには
/portal_skins/customにwysiwyg_supportを追加して編集する必要があります。

wysiwig_supportの例
全部使うならそのままコピペでオッケー、
二種類使うなら使わないものの色をはずせば使えると思う。
赤:CMFVisualEditor 青:Epoz 黄:FCKEditor

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en"
"http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">

<html i18n:domain="plone">

<!-- wysiwyg default widget -->
<div metal:define-macro="wysiwygEditorBox">

<tal:block tal:define="useCMFVE python: here.portal_membership.getAuthenticatedMember().getProperty('wysiwyg_editor')=='Visual Editor' and request.environ.get('HTTP_USER_AGENT').count('MSIE');
useEpoz python: here.portal_membership.getAuthenticatedMember().getProperty('wysiwyg_editor')=='Epoz';
useFCK python: here.portal_membership.getAuthenticatedMember().getProperty('wysiwyg_editor')=='FCK Editor';
wysiwyg python: useCMFVE | useEpoz | useFCK">


<tal:block tal:condition="useEpoz"
tal:define="ztu modules/ZTUtils;
pss modules/Products/PythonScripts/standard;
text_format python: getattr(here,'text_format','html');
getProperty python: here.stylesheet_properties.getProperty;
current_skin python: ztu.make_query(skin=request.get(here.portal_skins.getRequestVarname(), ''));"

tal:replace="structure python: here.Epoz(
inputname,
data = test(text_format=='structured-text',
pss.structured_text(inputvalue),
test(text_format=='plain',
pss.newline_to_br(inputvalue),
inputvalue)),
toolbox = here.absolute_url() + '/epoz_toolbox',
style = 'width: 800px; height: 600px; margin-top: 2px; border: %s;' % (getProperty('preBorder','1px solid #8cacbb'),),
button = 'background-color: %s; border: 1px solid %s; cursor: pointer; margin-right: 1px; margin-bottom: 1px;' % (
getProperty('contentTabBackground','#CDE2A7'),
getProperty('contentTabFontColor','#578308'),),
path = portal_url + '/')">

</tal:block>


<tal:block tal:condition="python: useCMFVE">
<iframe name="visedit" style="width: 800px; height: 600px; border:solid gray 1px;" tal:attributes="src string:visualeditor_edit?BASEURL=${here/portal_url}"></iframe>

<textarea cols="80"
rows="25"
tabindex=""
name="description"
style="display:none"
tal:content="inputvalue"
tal:attributes="name inputname;
id inputname;
onfocus onfocus|nothing;
onblur onblur|nothing;
tabindex tabindex|nothing"></textarea>

</tal:block>


<tal:block tal:condition="python: useFCK"
tal:define="parent_url python:here.aq_parent.absolute_url();
cleaninput0 python:inputvalue.replace('\x5C','\x5C\x5C');
cleaninput1 python:cleaninput0.replace('\x27','\x5C\x27');
cleaninput2 python:cleaninput1.replace('\r',' ');
cleaninput python:cleaninput2.replace('\n',' ')">


<script type="text/javascript" src="" tal:attributes="src string:fckeditor.js">
</script>

<script type="text/javascript" tal:content="structure string:
&lt;!--
var oFCKeditor=new FCKeditor('${inputname}');
oFCKeditor.BasePath='${request/URLPATH2}/';
oFCKeditor.Value='${cleaninput}';
oFCKeditor.ToolbarSet='ZopeCmf';
oFCKeditor.Width=780;
oFCKeditor.Height=600;
oFCKeditor.Create();
--&gt;
">
The FCK Editor Script
</script>


</tal:block>


<tal:block condition="not: wysiwyg">
<textarea cols="80"
rows="25"
tabindex=""
name="text"
tal:content="inputvalue"
tal:attributes="name inputname;
id inputname;
onfocus onfocus|nothing;
onblur onblur|nothing;
tabindex tabindex|nothing;" id="Textarea2"></textarea>
</tal:block>
</tal:block>
</div>

<div metal:define-macro="textFormatSelector">

<tal:block tal:define="wysiwyg python: here.portal_membership.getAuthenticatedMember().getProperty('wysiwyg_editor')!='None'">

<tal:block condition="wysiwyg">
<input type="hidden"
name="text_format"
value="html" id="Hidden1"/>
</tal:block>

<tal:block condition="not: wysiwyg">
<div class="row">
<div class="label">
<span i18n:translate="label_format">Format</span>
<div id="format_help"
i18n:translate="help_format"
class="help"
style="visibility:hidden">
Select which format you want to type the contents of this
document in. If you are unsure of which format to use, just
select Plain Text and type the document as you usually
do.
</div>
</div>
<div class="field"
tal:define="tabindex tabindex/next;
text_format python:request.get('text_format', getattr(here,'text_format','structured-text'))">
<input class="noborder"
type="radio"
name="text_format"
value="structured-text"
tabindex=""
id="cb_structuredtext"
onfocus="formtooltip('format_help',1)"
onblur="formtooltip('format_help',0)"
tal:attributes="checked python:test(text_format=='structured-text', 1, '');
tabindex tabindex;"
/>
<label for="cb_structuredtext" i18n:translate="structured_text">Structured Text</label> <br />

<input class="noborder"
type="radio"
name="text_format"
value="html"
tabindex=""
id="cb_html"
tal:attributes="checked python:test(text_format=='html', 1, '');
tabindex tabindex;"
onfocus="formtooltip('format_help',1)"
onblur="formtooltip('format_help',0)"
/>
<label for="cb_html" i18n:translate="html">HTML</label> <br />

<input class="noborder"
type="radio"
name="text_format"
value="plain"
tabindex=""
id="cb_plain"
tal:attributes="checked python:test(text_format=='plain', 1, '');
tabindex tabindex;"
onfocus="formtooltip('format_help',1)"
onblur="formtooltip('format_help',0)"
/>
<label for="cb_plain" i18n:translate="plain_text">Plain Text</label>
</div>
</div>
</tal:block>

</tal:block>

</div>
</html>
posted by titami at 02:07| Comment(13) | TrackBack(1) | ZOPE/CMF/Plone | このブログの読者になる | 更新情報をチェックする

2005年01月29日

Python Sidebar の日本語化

Python Sidebarというツールを会社の先輩に教えてもらった。
Mozilla(Firefoxも)でPythonのオンラインドキュメントにサイドバーから簡単にアクセスできるようにするツール
そのままだとPython.orgのドキュメントを使ってるので全部英語です。
Python.jpのドキュメントを使うようにできないものかと思いサイドバーのHTMLを
生成するスクリプト(update.py)をみてみると簡単に変更できそうだったのでやってみました。
手順は以下の通り

【python.jpのオンラインドキュメント用に変更】
解凍すると中にupdate.pyというファイルがあるのでこれを編集する。
1.52行目のcharsetの部分を"iso-8859-15"から"EUC-JP"に変更
2.ファイル中の"http://www.python.org/doc/current"を
  "http://www.python.jp/pub/doc_jp"に置き換える(12ヶ所)。
3.update.pyを実行する。

【ブックマークに登録】
[ブックマーク]-[ブックマークの管理]-[新しいブックマーク]

名前 : Python Sidebar
URL : file:///C:/[python-sidebarの置き場所]/html/toc-tutorial.html
[このブックマークをサイドバーに読み込む]にチェックを入れる。


めっちゃ便利です!
↓こんな感じ
pythonsidebar.Png







posted by titami at 00:21| Comment(3) | TrackBack(3) | python | このブログの読者になる | 更新情報をチェックする

2005年01月24日

基本認証が危ないことを実感してみる


>>> import socket
>>> s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.bind(('',8008))
>>> s.listen(1)
>>> conn,addr=s.accept()
>>> conn.recv(1024)
'GET / HTTP/1.1\r\nHost: localhost:8008\r\nUser-Agent: Mozilla/5.0 (W
indows; U; Windows NT 5.1; ja-JP; rv:1.7.5) Gecko/20041108 Firefox/1.
0\r\nAccept: text/xml,application/xml,application/xhtml+xml,text/html
;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: ja,en
-us;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset
: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: kee
p-alive\r\nCookie: wstyle=\r\n\r\n'

*受信したリクエストはホントは一行
ここまでは昨日と一緒



>>> conn.send("""
HTTP/1.1 401 Unauthorized\r\nWWW-Authenticate: Basic\r\n realm="user@omokiti.seesaa.net"
""")
86
>>> conn.close()
>>> conn,addr=s.accept()

ステータスコードを401
WWW-Authenticateヘッダーに"Basic"とrealm値をいれた
レスポンスを送り接続を閉じるとポップアップの認証画面が現れる。
basicauth01.Png
ユーザー名とパスワードを入れてOKを押すと
"ユーザー名:パスワード"の形でbase64エンコーディングでエンコードされたものが
Authorizationヘッダーに入り送信される。以下の緑の部分

>>> conn.recv(1024)
'GET / HTTP/1.1\r\nHost: localhost:8008\r\nUser-Agent: Mozilla/5.0 (W
indows; U; Windows NT 5.1; ja-JP; rv:1.7.5) Gecko/20041108 Firefox/1.
0\r\nAccept: text/xml,application/xml,application/xhtml+xml,text/html
;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: ja,en
-us;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset
: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: kee
p-alive\r\nCookie: wstyle=\r\nAuthorization: Basic aXRhbWk6cGFzc3dvcmQ=\r\n\r\n'

Authorizationヘッダーの部分を取り出して
デコードしてみる。

>>> import base64
>>> uspw = base64.decodestring("aXRhbWk6cGFzc3dvcmQ=")
>>> uspw
'itami:password'


簡単にデコードができてしまう。
これは確かにまずい。
posted by titami at 00:27| Comment(4) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2005年01月23日

Pythonでブラウザと通信してみる

socketの勉強の続き
もっとも簡単なWebServerを作ってみた。
右下のNextボタンでスタート








IEだとconn.close()が終わってから表示された。
posted by titami at 00:01| Comment(0) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2005年01月20日

pythonでsocket入門

仕事でsocketプログラミングをするかもしれない。
言語はCなのだがpython以外の言語はあまり使ったことがないので
まずはpythonで実験
Winkというソフトを使ってやったことを記録してみました。
右下のNextボタンでスタートします。









そういえばこんな本を買ってたんだった
がんばって読んでみようかな。


Foundations of Python Network Programming
posted by titami at 21:22| Comment(17) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2005年01月07日

PDFで世界のPloneサイト

この前世界中のPloneサイトを探してみたことがありました。
めっちゃいろんな国で使われててビックリしたんですが
Ploneが世界中で使われてるってことをアピールするPDF発見しました。
Ofer's Plone Presentation(ZOPE DISPATCHES)
やっぱりアラビア語の逆さ表示がインパクトあります。

【関連記事】
世界のPloneサイト【A〜G】
世界のPloneサイト【H〜N】
世界のPloneサイト【P〜Z】

posted by titami at 01:01| Comment(4) | TrackBack(1) | ZOPE/CMF/Plone | このブログの読者になる | 更新情報をチェックする

2005年01月05日

記憶○×ゲーム

昨日の夜11時からテレビ東京でやってた。
『超記憶力バトル!大脳パニック道場』という番組を観たのだけど
なんでそんなに覚えれるねんというのが正直な感想です。
いろんな問題がありましたが私はほとんどできなかったです、、
ただ第4ステージだったらできるかもと思いました。
内容は9マスにランダムに数字の入ったパネルを記憶して
○×ゲームを行うというもの。
357
618
294
つまり↑上のようなパネルを記憶して、その数字で○×ゲームをします。
番組観てるとなんか簡単そうだったので
試しにPythonで作ってやって見ました。
ダウンロード:TicTacToe.py
使い方はpythonがインストールされている環境でダブルクリックするだけ
あとはマスが9つのランダムな数字で埋められてるので、
記憶したと思ったらEnter押してコンピューターと対戦してください。

でやってみた結果はまったく覚えれませんでした、、
やっぱり昨日の番組に出てた人はすごい!
posted by titami at 00:01| Comment(6) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2005年01月02日

PythonでAlexaのWebサービスにアクセスする

AmazonはあのAlexaに対してもWebサービスでアクセスさせてくれる!
Alexa Web Information Service (Beta)
面白そうだ。
そして今年の目標は『Pythonを使いこなせるようになる』ことなので
pyamazonを参考にしてpyalexaを作ってみた。

【ダウンロード】
alexa.py

【使い方】
まず以下のサイトで無料デベロッパー・トークンを申し込む。
Amazon Webサービス

例えばこんな感じ(サブスクリプションIDのところは自分のをいれる)

import alexa
alexa.setSubscriptionId("サブスクリプションID")
data = alexa.urlInfo("Rank","amazon.co.jp")
print data.TrafficData[0].Rank[0]


他にも以下のようなことができます。

##urlInfoの例
data = alexa.urlInfo("Related","amazon.co.jp")
for cat in data.Related[0].Categories[0].CategoryData:
print cat.AbsolutePath[0]

##categoryの例
data = alexa.category("Top/Computers/Programming/Languages/Python")
for link in data.Browse[0].MostPopular[0].Links[0].Link:
print link.Title[0],link.NavigableUrl[0]

##crawlの例
data = alexa.crawl("google.co.jp")
for metadata in data.CrawlData[0].MetaData:
print metadata.RequestInfo[0].RequestDate[0],':',metadata.RequestInfo[0].IPAddress[0]

##searchの例
data = alexa.search("plone")
for result in data.WebSearch[0].Results[0].Result:
print result.DataUrl[0]

##webMapの例
data = alexa.webMap("LinksIn","yahoo.co.jp")
print data.WebMapData[0].LinksPointingIn[0].Total[0]
data = alexa.webMap("LinksOut","yahoo.co.jp")
print data.WebMapData[0].LinksPointingOut[0].Total[0]



作った後に以下のサイト発見
米Amazon.comが新Webサービス、高収益のアソシエイトサイト開発が可能に
そのうち有料になるのか、、
posted by titami at 03:29| Comment(4) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2004年12月21日

PlonePublicHolidayCalendar【Ploneプロダクト】

http://www.playershouse.com/downloads
カレンダーを拡張して土日祝日に色をつけるプロダクト
version1.1

PlonePublicHolidayCalendar1

【インストール方法】
1.[Plone の設定]−[プロダクツを追加・削除]でPlonePublicHolidayCalendarをインストール

2.portal_skins/plone_templates/headerをカスタマイズして以下を追加する。

<style type="text/css" media="all" tal:condition="exists: portal/plonePublicHolidayCalendar.css"
tal:content="string:@import url($portal_url/plonePublicHolidayCalendar.css);">
</style>

3.portal_properties/ploneholiday_propertiesを日本向けにする。
 多分こんな感じ。
fixedHolidays

01.01|元日
11.02|建国記念日
21.03|春分の日
29.04|みどりの日
03.05|憲法記念日
04.05|国民の休日
05.05|こどもの日
23.09|秋分の日
03.11|文化の日
23.11|勤労感謝の日
23.12|天皇誕生日

weekdayInMonthHolidays

2|1|1|成人の日
3|1|7|海の日
3|1|9|敬老の日
2|1|10|体育の日

*weekdayInMonthHolidaysで最期に改行するとエラーがでて
ページが表示できなくなるので注意。

*春分の日と秋分の日は年によって変動します。

4.portal_skins/plone_public_holiday_calendar/holiday_properties
 をカスタマイズして色を選ぶ。
posted by titami at 23:28| Comment(16) | TrackBack(2) | ZOPE/CMF/Plone | このブログの読者になる | 更新情報をチェックする

2004年12月18日

リブリエのファームウェアアップグレード

http://www.faq.sonydrive.jp/fInformationInfo.php?mode=open&iid=50
改善されるのは以下の二点
・辞書のメモリスティックが挿入されている時の辞書一覧の表示速度改善
・音声付きのe-Book(電子書籍)の表現力向上への対応
インストールの仕方の説明がわかりにくい、、
しかもよく考えてみるとメモリスティックは使わないし音声付きe-Bookには
興味がないのでそもそもアップグレードする必要はなかった。

10分たってもアップグレードが完了しない、、
おかしいなぁ…
posted by titami at 02:54| Comment(0) | TrackBack(1) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。