December 9, 2010

WikipediaのJimmy Walesさんを見飽きた

ので、ちょっと下のほうに移動してもらうGreasemonkeyのスクリプトを書いた。
以下のページのInstallから。

http://userscripts.org/scripts/show/92125

グリモンのスクリプトはChromeの拡張機能としても使える。インストールの仕方はGreasemonkeyと同じ。アンインストールの仕方はExtentionと同じ。SafariのGreaseKitでも使えます。

ジミー・ウェールズさんが邪魔にならない位置に移動する、はず。

// ==UserScript==
// @name           Move Jimmy's message on Wikipedia
// @namespace      http://satomacoto.blogspot.com/
// @include        http://*.wikipedia.org/*
// @include        http://*.wikitionary.org/*
// @include        http://*.wikinews.org/*
// @include        http://*.wikiquote.org/*
// @include        http://*.wikispecies.org/*
// @include        http://*.wikisource.org/*
// @include        http://*.wikiversity.org/*
// @include        http://*.wikibooks.org/*
// @include        http://*.wikimedia.org/*
// @description    
// ==/UserScript==

(function(){
    var content = document.getElementById("content");
    var siteNotice = document.getElementById("siteNotice");
    content.removeChild(siteNotice);
    content.appendChild(siteNotice); // don't comment out this line, or Jimmy will go away!
})();
20行目を削除したりコメントアウトしたりしたら、ジミーが消えちゃうからさびしくなります。

November 18, 2010

Bloggerに関連記事を入れる

http://code.google.com/p/brps/wiki/ClientGasJs

  1. Dashboard→Design→Edit HTML。
  2. 必要に応じてテンプレートをバックアップ。
  3. Edit TemplateでExpand Widget Templatesにチェックを入れてテンプレートを編集。


  4. <div class='post-footer'>を探す。(Ctrl+fとかcommand+fとかで)
    その下に以下のように追加する。

        <div class='post-footer'>
    
    <!-- ここから -->
    <b:if cond='data:blog.pageType == &quot;item&quot;'>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <script src="http://brps.appspot.com/gas.js"></script>
    <h2>Related Posts</h2>
    <div id="gas-results"></div>
    <!-- 設定 -->
    <script>
    window.brps_gas = {
      remove_tags: ['unwanted_tag1', 'unwanted_tag2'], 
      tag_selector: 'a[rel=tag]',
      limit: 5,
      add_sites: ['secondblog.blogspot.com', 'thirdblog.blogspot.com'],
      remove_string_regexp: /^.*?: /,
      exclude_url_regexp: /(\/search\/label\/|(archive\.html|blog\.example\.com\/|\.blogspot\.com\/)$)/,
      html_loading: '<span>Loading...</span>',
      html_no_results: '<span>Found no results.</span>'
      };
    </script>
    </b:if>
    <!-- ここまで -->
    
    jqueryを他で読み込んでいたら5行目はいらない。
    設定は自分の環境に合わせて。

September 17, 2010

数式をレンダリングするURLを取得するChrome Extensionを作ってみた

Google DocsのPresentationに数式を挿入したいけど,今のところ見当たりません.
Google先生に尋ねたところ LaTeX in Presentation というのが引っかかりました.

今のところ Google Chart API を使って数式をレンダリングするURLをつくって挿入するのが良さそう.が,いちいちURLエンコードするのめんどくさい.

なので,数式のURLを生成するChromeの拡張機能を作ってみました.

Formula Image Link

こんなかんじ.


ブログなどに貼付けられます.


サイズ,色,背景は後から自分で記述しないといけないとかしょぼいです.

チュートリアルわかりやすい.

数式のURLを取得する拡張機能は Sitmo LaTeX equation editor というのもありました.

September 9, 2010

Notepad++でPythonを実行する

  1. Python 2.6.6とNotepad++ 5.7。
  2. Plugins > Plugin Manager > Show Plugin Manager
  3. Availableタブで NppExec にチェックしてInstall。Restart。
  4. Plugins > NppExec > Excute (F6)
  5. Command(s)に pythonw -u "$(FULL_CURRENT_PATH)" としてOKで実行。

August 31, 2010

Pythonの正規表現で半角記号,半角数字,半角英字

import re
p = re.compile("[!-/:-@[-`{-~]") # 半角記号
p = re.compile("[!-@[-`{-~]")    # 半角記号+半角数字
p = re.compile("[!-~]")          # 半角記号+半角数字+半角英字

http://ja.wikipedia.org/wiki/ASCII

August 25, 2010

Carbon Emacsで英語フォントをInconsolataに日本語フォントをヒラギノ丸ゴにする

プログラミングに最適なConsolasとかInconsolataとか - 0xFFと話題になっていたのでEmacsで使ってみる.普通に設定すると日本語フォントが微妙.日本語と英語を別々のフォントにする.

.emacsに以下のように記述する.

(create-fontset-from-mac-roman-font
 "-apple-inconsolata-medium-r-normal--14-0-72-72-m-0-iso10646-1"
 nil "myfont")

(set-fontset-font "fontset-myfont"
                  'japanese-jisx0208
                  '("ヒラギノ丸ゴ pro w4*" . "jisx0208.*"))

(set-fontset-font "fontset-myfont"
                  'katakana-jisx0201
                  '("ヒラギノ丸ゴ pro w4*" . "jisx0201.*"))

(add-to-list 'default-frame-alist '(font . "fontset-myfont"))

Inconsolataは以下のページの下部 OpenType file を右クリックして保存,インストール.

http://www.levien.com/type/myfonts/inconsolata.html


InconsolataのXLFD表現の取得は以下のページの下部の CarbonEmacs の項を参考に

1. M-x mac-font-panel-mode でフォントパネルを開いてInconsolataを選択
2. M-x describe-font でXLFD表現が表示されるのでコピー(たとえば,-apple-inconsolata-medium-r-normal--14-0-72-72-m-0-iso10646-1)

http://www.emacswiki.org/emacs/SetFonts


日本語と英語で別々のフォントを設定するのは以下のページの「フォントセットを予め定義する」の項を参考にした.

http://macemacsjp.sourceforge.jp/matsuan/FontSettingJp.html

August 8, 2010

Carbon Emacsのpython-modeの設定

Carbon Emacsにはデフォルトでpython-mode.elが入ってる。
ただし、設定しないとpython.elのまま。python.elだとバッファ上で実行するから同じフォルダの他のファイルをインポートできない。ちょっと困る。時もある。

以下設定方法。

~/.emacsファイルに次のように記述。
;;; python-mode
(autoload 'python-mode "python-mode" "Python editing mode." t)

以下使い方。python-mode.elより抜粋。後で見やすくする?
;; electric keys
(define-key py-mode-map ":" 'py-electric-colon)
;; indentation level modifiers
(define-key py-mode-map "\C-c\C-l" 'py-shift-region-left)
(define-key py-mode-map "\C-c\C-r" 'py-shift-region-right)
(define-key py-mode-map "\C-c<" 'py-shift-region-left) (define-key py-mode-map "\C-c>" 'py-shift-region-right)
;; subprocess commands
(define-key py-mode-map "\C-c\C-c" 'py-execute-buffer)
(define-key py-mode-map "\C-c\C-m" 'py-execute-import-or-reload)
(define-key py-mode-map "\C-c\C-s" 'py-execute-string)
(define-key py-mode-map "\C-c|" 'py-execute-region)
(define-key py-mode-map "\e\C-x" 'py-execute-def-or-class)
(define-key py-mode-map "\C-c!" 'py-shell)
(define-key py-mode-map "\C-c\C-t" 'py-toggle-shells)
;; Caution! Enter here at your own risk. We are trying to support
;; several behaviors and it gets disgusting. :-( This logic ripped
;; largely from CC Mode.
;;
;; In XEmacs 19, Emacs 19, and Emacs 20, we use this to bind
;; backwards deletion behavior to DEL, which both Delete and
;; Backspace get translated to. There's no way to separate this
;; behavior in a clean way, so deal with it! Besides, it's been
;; this way since the dawn of time.
(if (not (boundp 'delete-key-deletes-forward))
(define-key py-mode-map "\177" 'py-electric-backspace)
;; However, XEmacs 20 actually achieved enlightenment. It is
;; possible to sanely define both backward and forward deletion
;; behavior under X separately (TTYs are forever beyond hope, but
;; who cares? XEmacs 20 does the right thing with these too).
(define-key py-mode-map [delete] 'py-electric-delete)
(define-key py-mode-map [backspace] 'py-electric-backspace))
;; Separate M-BS from C-M-h. The former should remain
;; backward-kill-word.
(define-key py-mode-map [(control meta h)] 'py-mark-def-or-class)
(define-key py-mode-map "\C-c\C-k" 'py-mark-block)
;; Miscellaneous
(define-key py-mode-map "\C-c:" 'py-guess-indent-offset)
(define-key py-mode-map "\C-c\t" 'py-indent-region)
(define-key py-mode-map "\C-c\C-d" 'py-pdbtrack-toggle-stack-tracking)
(define-key py-mode-map "\C-c\C-f" 'py-sort-imports)
(define-key py-mode-map "\C-c\C-n" 'py-next-statement)
(define-key py-mode-map "\C-c\C-p" 'py-previous-statement)
(define-key py-mode-map "\C-c\C-u" 'py-goto-block-up)
(define-key py-mode-map "\C-c#" 'py-comment-region)
(define-key py-mode-map "\C-c?" 'py-describe-mode)
(define-key py-mode-map "\C-c\C-h" 'py-help-at-point)
(define-key py-mode-map "\e\C-a" 'py-beginning-of-def-or-class)
(define-key py-mode-map "\e\C-e" 'py-end-of-def-or-class)
(define-key py-mode-map "\C-c-" 'py-up-exception)
(define-key py-mode-map "\C-c=" 'py-down-exception)
;; stuff that is `standard' but doesn't interface well with
;; python-mode, which forces us to rebind to special commands
(define-key py-mode-map "\C-xnd" 'py-narrow-to-defun)
;; information
(define-key py-mode-map "\C-c\C-b" 'py-submit-bug-report)
(define-key py-mode-map "\C-c\C-v" 'py-version)
(define-key py-mode-map "\C-c\C-w" 'py-pychecker-run)
;; shadow global bindings for newline-and-indent w/ the py- version.
;; BAW - this is extremely bad form, but I'm not going to change it
;; for now.
(mapc #'(lambda (key)
(define-key py-mode-map key 'py-newline-and-indent))
(where-is-internal 'newline-and-indent))
;; Force RET to be py-newline-and-indent even if it didn't get
;; mapped by the above code. motivation: Emacs' default binding for
;; RET is `newline' and C-j is `newline-and-indent'. Most Pythoneers
;; expect RET to do a `py-newline-and-indent' and any Emacsers who
;; dislike this are probably knowledgeable enough to do a rebind.
;; However, we do *not* change C-j since many Emacsers have already
;; swapped RET and C-j and they don't want C-j bound to `newline' to
;; change.
(define-key py-mode-map "\C-m" 'py-newline-and-indent)

August 6, 2010

Snow Leopardに64bitのSciPyをインストールする

SciPyはPythonの数値解析ソフトウェア。

追記。

現在は Scipy Superpack
Recent builds of fundamental Python scientific computing packages for OS X
から。



SciPy.orgでも紹介されているが、Mac OS X 10.6 Snow LeopardにプリインストールされているPython 2.6.1で利用できる64bitのSciPyやらNumPyやらのインストールスクリプトがあって便利。(プリインストールのPythonのみ。FinkやらDarwin PortsからインストールしたPythonだと使えない、らしい。)

SciPy Superpack for Python 2.6 (64-bit)の下の方にある「Download Scipy Superpack Installer for OSX 10.6」とあるリンクからスクリプトをダウンロード。

ターミナルから
sh superpack_10.6_2010.07.27.sh
とすると、gFortranをインストールするか聞かれたり、管理者パスワードを聞かれたりしながら作業が進んでいく。

インストールされるのは
gFortran
ez_setup
numpy
matplotlib
scipy
pymc
ipython
nose
DateUtils

とても便利。

August 5, 2010

AutopagerizeでFilckrを除く

Tumblrで回避するために Exclude Patterns に /[^.]+\.tumblr\.com\// を追加した

July 29, 2010

Pythonで隠れマルコフモデルのSmoothingの例

Pythonで隠れマルコフモデルのFilteringの例のSmoothingバージョン.

スムージング
  • 現在まで(0~T)のすべての観測があるときに,過去の状態(t;0<t<T)を推定する.
  • i.e. P(Xt|Y0:T)を求める.
Filtering同様,P(Xt|Y0:T)を変形する.

cは正規化項.P(Xt|Y0:t)はフィルタリング(Forward Algorithm)で求められる.P(Yt+1|Xt+1)は出力確率.P(Xt+1|Xt)は遷移確率.で,再帰的にP(Yt+1:T|Xt)を求められる.以下実装.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 状態変数
states = ['Rainy', 'Sunny']

# 観測列
observations = ['walk', 'shop', 'clean', 'shop', 'walk']

# 初期確率
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
 
# 遷移確率
transition_probability = {
   'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
   'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
   }

# 出力確率 
emission_probability = {
   'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
   'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
   }

# Forward
def forward(y1, prior, states, trans_p, emit_p):
    post = {}
    for x1 in states:
        post[x1] = emit_p[x1][y1] * sum([ trans_p[x][x1] * prior[x] for x in states ])
    s = sum(post.values())
    for k,v in post.items():
        post[k] = v/s
    return post

# Filtering
def filtering(observations, states, start_p, trans_p, emit_p):
    prior = start_p
    T = len(observations)
    for t in range(T):
        post = forward( observations[t], prior, states, trans_p, emit_p )
        prior = post
    return post

# Backward
def backward(y1, prior, states, trans_p, emit_p):
    post = {}
    for x in states:
        post[x] = sum([ emit_p[x1][y1] * prior[x1] * trans_p[x][x1] for x1 in states ])
    s = sum(post.values())
    for k,v in post.items():
        post[k] = v/s
    return post

# Smoothing
def smoothing(observations, t, states, start_p, trans_p, emit_p):
    T = len(observations)
    # forward
    f = filtering(observations[:t], states, start_p, trans_p, emit_p)
    # backward
    b = {}
    for x in states:
        b[x] = 1.0 / len(states)
    for i in range(T-1, t-1,-1):
        b = backward(observations[i], b, states, trans_p, emit_p) 
    # product
    results = {}
    for x in states:
        results[x] = f[x] * b[x]
    # normalization
    s = sum(results.values())
    for k,v in results.items():
        results[k] = v/s
    return results

print "Smoothing", smoothing(observations, 3, states, start_probability, transition_probability, emission_probability)
print "Filtering", filtering(observations[:3], states, start_probability, transition_probability, emission_probability)
実行結果は
Smoothing {'Rainy': 0.85679684480228568, 'Sunny': 0.14320315519771437}
Filtering {'Rainy': 0.86342066067036916, 'Sunny': 0.1365793393296309}
['walk', 'shop', 'clean', 'shop', 'walk']という観測列があったときの3日目(cleanをした日)のスムージングの結果とフィルタリングの結果を表している.フィルタリングでは4日目にshopして5日目にwalkしたという情報も使っているので若干Rainyの確率が下がっている.

ちなみに,4日目も5日目もcleanだった場合(観測列が['walk', 'shop', 'clean', 'clean', 'clean'])の3日目の推定結果は
Smoothing {'Rainy': 0.90669272213214924, 'Sunny': 0.093307277867850785}
Filtering {'Rainy': 0.86342066067036916, 'Sunny': 0.1365793393296309}
となり雨の確率が上がる.

4日目も5日目もwalkだった場合は(観測列が['walk', 'shop', 'clean', 'walk', 'walk'])の3日目の推定結果は
Smoothing {'Rainy': 0.78605072114831254, 'Sunny': 0.21394927885168744}
Filtering {'Rainy': 0.86342066067036916, 'Sunny': 0.1365793393296309}
となり雨の確率は下がる.

July 27, 2010

Pythonで隠れマルコフモデルのFilteringの例

http://en.wikipedia.org/wiki/Viterbi_algorithm
の天気の例で使えるFiltering。

隠れマルコフモデルの例
隠れマルコフモデルの例 その2

フィルタリング
  • 現在までのすべての観測があるときに,現在の状態を推定する.
  • i.e. P(Xt|Y0:t)を求める.
P(Xt|Y0:t)をガリガリ式変形する(マルコフ性,ベイズ,周辺化でごにょごにょする)と,
が得られる.P(Xt|Xt-1)は遷移確率.P(Yt|Xt)は出力確率.cは正規化項.で,再帰的にP(Xt|Y0:t)を求める.以下実装.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 状態変数
states = ('Rainy', 'Sunny')

# 観測列
observations = ['walk', 'shop', 'clean']

# 初期確率
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
 
# 遷移確率
transition_probability = {
   'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
   'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
   }

# 出力確率 
emission_probability = {
   'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
   'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
   }

# Forward Algorithm
def forward(y1, prior, states, trans_p, emit_p):
    post = {}
    for x1 in states:
        post[x1] = emit_p[x1][y1] * sum([ trans_p[x][x1] * prior[x] for x in states ])
    s = sum(post.values())
    for k,v in post.items():
        post[k] = v/s
    return post

# Filtering
def filtering(observations, states, start_p, trans_p, emit_p):
    prior = start_p
    T = len(observations)
    for t in range(T):
        post = forward( observations[t], prior, states, trans_p, emit_p )
        prior = post
    return post

print filtering(observations, states, start_probability, transition_probability, emission_probability)

上記の実行結果は

{'Rainy': 0.86342066067036916, 'Sunny': 0.1365793393296309}

つまり, walk→shop→clean という観測列があったら3日目の天気は雨が86%,晴れが14%だよっ,ということ.

July 4, 2010

Windows 7 on Mac mini (Mid 2010) のスコア

Mac mini (Mid 2010)
  • CPU 2.4GHz
  • メモリ 4GB (2GB x 2 (バルク))
  • HDD 320GB (Boot Camp 100GB)
  • Windows 7 32bit
  • Boot Camp 3.1

March 22, 2010

Androidでデフォルトのアプリケーションの設定を消去する

「常にこの操作で使用する」にチェックするとき
ホームの[設定]>[アプリーション]>[アプリケーションの管理]でデフォルトの設定をクリアします。
とあります。

(追記)

DefaultApp Resetを使うともっと楽に変更できるかもしれません。


(追記)

検索ボタン長押しをVoice Searchに設定してしまったのを消去します。
HT-03A、カスタムROM(CM6.1.0 Froyo 2.2.1)、ホームアプリはADWLauncher。
他の端末、他のアプリの設定を変えたい時でもだいたい同じように戻せます。

アプリの一覧から設定を選択。あるいはホームボタン押してメニューボタン押して設定を選択。
あ、ウィジェットの時間めっちゃずれてる^^;
アプリケーションの「設定」からも行けます。

アプリケーションを選択。

アプリケーションの管理を選択。

アプリケーションの中から目的のアプリVoice Searchを探して選択。

デフォルトでの起動の項目で設定を消去をクリック。

終わり。


Operaやらのデフォルト以外のブラウザいれたり、ホームアプリいれたりすると間違って選んじゃいがち…


スクリーンキャプチャはandroid sdkのtoolsのddmsでデバイスを選んでDevice > Screen Capture

March 15, 2010

radiko.jpをダッシュボードウィジェットに

radiko.jpはじまった!

Web Clipを使って、ダッシュボードに置くための手順のメモ。Mac、Snow Leopard。

まず、適当な放送局をListen now!して、SafariのファイルメニューからOpen in Dashboard。


ダッシュボードに貼付ける範囲を設定する。上のradiko.jpあたりをクリックすると全体を選択できて、Add。

できた。Dashboard Widget。


このままだと、ダッシュボードからはなれると音が聞こえない!ので、右下の「i」のマークをクリック。


Only play audio in Dashboardのチェックを外す。スタイルも変えれる。


「ラヂコで聞いてます。」

March 10, 2010

CotEditorでGo

Googleのプログラミング言語「Go」(http://golang.org/)のスクリプトをCotEditorで編集、ターミナルでコンパイル、リンク、実行するためのAppleScriptを書いてみた。
Download Go.applescript
・~/Library/Application Support/CotEditor/AppleScript に置いて、CotEditorのメニューバーのスクリプトメニューから Update Script Menu すれば使えます。
・環境によってはスクリプトを書き換える必要があります。(上のものは64bit用)
・ファイルは保存されている必要があります。
・ショートカットの割り当てたいときはCotEditorのスクリプトフォルダ内の _aboutScriptFolder.rtf を参照してください。
・生成された実行ファイル等は削除されます。

ついでに、CotEditorのシンタックスハイライトも。
Download Go.plist
Preferences > Syntax > Syntax Style > Importで、Go.plistをインポートする。適当。


「Go」は探しにくい。golangとかで探す。

March 8, 2010

PythonでXMLを扱う

いつも調べて、いつも忘れる。メモ。

モジュールのインポート
from xml.dom import minidom

DOMオブジェクトにパース
xdoc = minidom.parse("ファイル名かファイル")
xdoc = minidom.parseString("XML文字列")

文字列で表示
print xdoc.toxml()

あるタグのリストを取得
elements = xdoc.getElementsByTagName("タグの名前")

最初のノードを取得
node = elements[0]

子ノードたち
childeNodes = node.childNodes

ある属性の取得
attr = node.attributes["属性の名前"]

テキストノードかコメントノードだったら値を表示
if node.nodeType in [node.TEXT_NODE, node.COMMENT_NODE]:
    print node.data


参考サイト

20.7. xml.dom.minidom — Lightweight DOM implementation — Python v2.6.5c1 documentation
8.6 xml.dom -- 文書オブジェクトモデル (DOM) API
9.3. Parsing XML
9.5. Searching for elements
9.6. Accessing element attributes
10.4. Finding direct children of a node

February 20, 2010

Word 2007の文献管理のファイルの場所

Word 2007の文献管理の情報は
%appdata%\Microsoft\Bibliography\sources.xml
に収められている。

February 8, 2010

JSONをHTMLのリスト形式で表示する

JSONをHTMLのリスト形式で表示するコードを書いてみた。

json = {"foo":"bar", "baz": [1,2,3]};

とかだったら

foo
bar
baz
  1. 1
  2. 2
  3. 3

以下、コード。

function json2list(json) {
 if (json==null) {
  return "null";
 }
 else if (json.constructor===Object) {
  var dl = $("<dl>");
  for (var key in json) {
   dl.append($("<dt>").html(key));
   dl.append($("<dd>").html(json2list(json[key])));
  }
  return dl;
 }
 else if (json.constructor===Array) {
  var ol = $("<ol>");
  var json_length = json.length;
  for (var i=0; i<json_length; i++) {
   ol.append($("<li>").html(json2list(json[i])));
  }
  return ol;
 }
 else {
  return json;
 }
}

February 2, 2010

MacのFirefoxでコピペができないのはLastPassのせいだった

FirefoxでCopy & Pasteができない。
どうやらLastPassのアドオンが悪さしていた模様。
とりあえず無効化していろいろ試したら…

どうやらホットキーの設定が(今のところ)いけなかったようだ。
ホットキーの設定を空にしたらコピーできるようになった。

うーん。

MacのFirefoxをセーフモードで起動する

  1. Firefoxを完全に終了する
  2. option を押しながらFirefoxを起動する

MacでIronPythonでSilverlightで時計をつくるサンプルのメモ その2


MacでIronPythonでSilverlightで時計をつくるサンプルのメモのつづき。

アナログ時計を実装する。CompositionTargetを使ったアニメーション。
clock > appフォルダ内のapp.xamlとapp.pyを以下のように書き換える。

構成は、
clock/
clock/index.html
clock/app/
clock/app/app.xaml
clock/app/app.py
clock/css/...
clock/javascript/...
clock/js/...
cssフォルダとかはとりあえず触らない。

app.xaml

短針、長針、秒針を長方形で描く。Canvasパネルにそれぞれ置く。CanvasパネルはRenderTransformで180度回転させておく。各々の針はTranslateTransformで中心をずらしておく。針の角度はRotateTransformのAngleを弄るようにする。


app.py

日付を取得するためにDateTimeクラス、アニメーションを行うためにCompositonTargetクラスをインポートしておく。CompositonTargetクラスを用いるとフレームアニメーションを作れる。各フレームごとに日付を取得して、app.xamlで名付けた針の角度を設定する。



ターミナルからclockフォルダで
Chiron /b
でブラウザからindex.htmlに飛べば、時計が動く。はず。

なお、止めるときはターミナルで Ctrl + c。

つづく。

February 1, 2010

MacでIronPythonでSilverlightで時計をつくるサンプルのメモ

題名のとおり。
つくったものものはこちら

つづき→
MacでIronPythonでSilverlightで時計をつくるサンプルのメモ その2

準備

  1. MonoでMono 2.6 Frameworkをダウンロードしてインストールする。
  2. IronPythonで上のタブからDownloadsを選んでOther Available DownloadsのなかのIronPython-2.6-Bin.zipをダウンロードする。
  3. 解凍してどこかに置く。
  4. シェルの設定ファイル(~/.bashrcとか)にChiron.exeのエイリアスを定義する。置いた場所はフルパスで。たとえばドキュメント以下に解凍したら、


    alias Chiron="mono '/Users/(ユーザ名)/Documents/IronPython-2.6/Silverlight/bin/Chiron.exe'"
    とする。

開発

zipを解凍すると Silverlight/script/templates/python というフォルダにサンプルがあるのでそれを元にアプリをつくる。

  1. pythonフォルダをどこかにコピー。clockとか名前を付ける。
  2. とりあえず起動してみる。ターミナルでコピーしたフォルダに移動して

    Chiron /b
    とするとブラウザが起動する。


  3. index.html
    をクリックするとWelcome to Python and Silverlight!と表示される。はず。

MacでIronPythonでSilverlightで時計をつくるサンプルのメモ その2につづく。

January 25, 2010

CotEditorでLaTeXファイルをタイプセットするスクリプト

編集中のTeXファイルをDrag & Drop pTeXでタイプセットするスクリプト。texファイルはどこかに保存されている必要があります。デフォルトではpTeX.appは“アプリケーション”フォルダにインストールされているとします。pTeX.appのスクリプトを参考にしました。少し書き換えればportsなどでインストールしたpTeXにも対応できるかもしれません。

ダウンロード

TeX2PDF.applescript
TeX2PDFwBibTeX.applescript (jBibTeX)
https://gist.github.com/1601133


インストール

スクリプトフォルダ
~/Library/Application Support/CotEditor/ScriptMenu/
以下のどこかに置きます。メニューバーのスクリプトメニュー(ヘルプの左)から“スクリプトフォルダを開く”ことができます。Finderであるフォルダに移動するためには command + shift + g が便利です。

使い方

* インストールしたらメニューバーのスクリプトメニュー(ヘルプの左)から“スクリプトメニューを更新”。ちゃんとインストールされていたらTeX2PDFというメニューが表示されているはず。TeXファイルを保存したら、そのメニューをポチッと。

* デフォルトではファイル名をTeX2PDF.@~p.applescriptとしたら、ショートカットは、
command + option + p
ショートカットの変更の仕方は ~/Library/Application Support/CotEditor/ScriptMenu/_aboutScriptFolder.rtf に載っています。

たとえばTeXShopのように command + t にショートカットを当てたかったら、ファイル名をTeX2PDF.@t.applescriptとします。ただしこの場合はFontパネルのショートカットとバッティングしてしまうのでCotEditorのKey Bindingの設定でShow Fontsのショートカットをつぶしましょう。

* TeXファイルが保存されていないとタイプセットできないので、 command + s → command + option + p というコンボで使うといいと思います。

注意

ターミナルの Preferences > Setting > Shell > When the shell exits: で Close if the shell exited cleanly を選んでおかないとウィンドウが開きっぱなしになってしまうので鬱陶しいです。

雑感

CotEditorDrag & Drop pTeXもすごくいい!

追記(2010/8/29)

jBibTeXも含めたものを追加しました。

追記(2010/9/14)

TeX2PDFwBibTeX.applescriptのバグを取り除きました。

追記 (2011/1/25)

gs: command not foundなんてエラーが出るときは小川さんのページでESP Ghostscriptをダウンロードしてインストール。

January 24, 2010

Googleで優先する言語を保存できないのでGreasemokeyでなんとかした その2

相変わらず検索言語の設定が保存できないGoogle先生。MacのときのメインブラウザはSafariで検索は右上のSearchバーを使う。自分でつくっといてアレだが、Google Search Language Selector for Greasemonkey ではいちいち言語を選ぶのめんどくさい。

一発である言語で検索したい。のでまたGreasemonkeyのスクリプトを書いた。

Download

Google Search Language Jumper for Greasemonkey

Description

Googleで

Google en

って調べたら英語で「Google」を検索するページに飛ぶ。

Google ja

って調べたら日本語で「Google」を検索するページに飛ぶ。

January 18, 2010

Chromeの拡張機能が保存されている場所

Windows
C:\Users\(ユーザ)\AppData\Local\Google\Chrome\User Data\Default\Extensions
Mac
~/Library/Application Support/Google/Chrome/Default/Extensions
(ユーザ)はひとによって違います。フォルダについてるわけわかんない文字列はChromeのExtensionsウィンドウでDeveloper modeにするとそれぞれの拡張機能の下に出てくるやつ。

January 16, 2010

MacのChromeの拡張機能が保存されている場所

~/Library/Application Support/Google/Chrome/Default/Extensions/
ひとつのフォルダがひとつの拡張機能に対応している、と思う。

Googleで優先する言語を保存できないのでGreasemokeyでなんとかした



Download

Google Search Language Selector for Greasemonkey

Description

Googleのデフォルトの言語は英語にしている。
でも日本語だけで調べたいときもある。

Setting > Search setting > Search language > Prefer pages written in these language(s):

で Japanese だけ選んでいれば日本語のページだけ検索できた。
のにちょっと前から勝手に

Search English and Japanese pages

になってしまう。
逆にデフォルトの言語を日本語にして

設定 > 検索設定 > 検索言語の設定 > 優先する言語:

で英語だけにチェックして保存しても

英語 と 日本語のページを検索

とかなっちゃう。
なんでだよ!ということでなんとかするためにGreasemonkeyのスクリプトを書いた。

Google Search Language Selector for Greasemonkey

デフォルトでは「すべての言語、英語、日本語」にしてあるけど、スクリプトをちょいと書き換えれば他の言語も単独で調べられるようになる。もうちょい書き換えれば、「英語とフランス語」とかいくつかの言語にも対応できる。

January 6, 2010

Word 2007の数式エディタショートカットとコマンドの覚書

すぐ忘れる。覚書。徐々に追加。

ショートカット
Alt =
: 数式の挿入

コマンド
\matrix(&&@&&@&&)
行列