クリップボード
クリップボードについて調べていたところ、googleのキャッシュに興味深い記述があったのでメモ。
「apple's eye」というマイクロソフト内のコラムで、古い記事なので、もう存在しないようです。
文字列の一部を移動する方法も用意されていたが、これは「Thing & Place」というもので、文字列のはじめとおわり、移動先を個別に指定する必要があった。ユーザーテストの結果、多くのユーザーが複数の場所を同時に指定するという方法を受け入れられないことがわかったので、カット & ペーストという方法が編み出された。ただし、最初は選択テキストがカット操作で消えてしまうことに戸惑うユーザーが多かったので、画面の下に Wastebasket という領域が用意され、ここにカットした文字が表示されるようにしていた。この Wastebasket はやがてスクラップ、クリップボードと名前を変えていく。
このコラム全体が「ビル・アトキンソンが明かす Mac 誕生秘話」という興味深いもので何とか読めるようにならないものかと思います。
courseraの「programming languages」の感想
約10週でstandard ML ・racket・rubyを学習する講座を今受講しているのですが、6週でracketまで終わったので、感想を書いておこうと思います。
●standard ML
静的関数型言語の元祖でscalaの直系の祖先。
授業は
1週目 肩慣らし
2週目 パターンマッチ
3週目 高階関数
4週目 モジュールシステム
といったところでしょうか。シラバスをみながら書いていますが、よく覚えていません。
1週目の宿題はパターンマッチ禁止で、関数型に不慣れな人も対象にしてるように思いますが、再帰関数は最初から登場します。
個人的には2週目でつまづいて、100点中6点という悲惨な結果になってしまいました。続く相互評価のための解答提出も締切りを忘れていてできずじまい。
このコースのプログラム演習は自動採点と相互評価のために二回答案を提出して、相互評価をしないと模範解答を見ることができないシステムになっています。なので、点数は悪くてもアップロードした方がいいです。プログラム演習に取り組むこと自体に意義があるんだから。(と自分をはげましつつ。)
課題提出→人の答案を採点→自己採点→人の評価を見る、と何度も復習して理解を進める形になっていて、相互評価自体も素晴らしさも含めて、よくかんがえられたシステムだと思います。
●racket
schemeの派生言語。schemeはLISPの一種。LISPは動的関数型言語。
1週目 基礎からstream、thunk、メモ化まで
2週目 インタプリタ作成
standard MLに比べるとペースが滅茶苦茶はやい。schemeも括弧の場所を間違えたりして結構たいへん。
ただracketはschemeにはないstructという機能があって、パターンマッチ的なことができます。なのでよりstandard ML的にプログラムできます。それでこその4週・2週という構成なんだろうとお思います。
なんといっても山場はインタープリタ作成。ほとんどLISPでLISPを実装する感じ。レキシカルスコープで再帰関数もサポートしています。TWITTERで「#proglang」を検索してもhardとかbrutalとか出てきます。でも出来れば達成感は半端ない。ホント一週間かかりっきり。終わってみれば、問題文・ビデオで丁寧に誘導しているのがわかるけど、最中は五里霧中。もともとあったコードと含めて、100行程度です。structのお陰で、全体の構造は捉えやすいコードができると思います。
rubyというと比較的とっつきやすいイメージが強いのですが、これをふまえてどう展開していくのかが楽しみです。
groovyfxをjava7u6でbuildしてみた。
ちょっとはまったので自分用にメモ。
1.java7u6をインストール
2.GITHUBからgroovyfxをクローン。(https://github.com/groovyfx-project/groovyfx.git)
3.環境変数「JAVA_HOME」を設定。「JAVAFX_HOME」を消す。
この2つの環境変数を使ってjfxrt.jarというファイルの場所を指定しているみたいだ。
4.build.gradleの30〜34行をコメントアウト。
com.sun.javafx.runtime.VersionInfo.runtimeVersionという関数がjava7u6から使えなくなったみたいなので、
バージョンをチェックしている場所を丸ごとコメントアウト。
5.ビルド実行。(windows7だとgradlew)
scalafxとsbt
scalafx用のsbtの設定を作ってみました。
sbtとScalaEdit
最近見つけたScalaEditというエディタを、紹介します。
プロジェクト・エディタ・コンソールの3画面がひとつになっているので、
sbtを使ってファイラーやコンソール画面、エディタを行ったり来たりしている人には便利じゃないでしょうか。
またsbtとIDEを併用する人も、まずsbtのprojectを作って、sbt上で動くツール(sbt-ideaやsbt-eclipsify)でIDE用のprojectに変換する、
といった使い方をするのにいいと思います。
プロジクト画面は、
- ルートを指定してからその下のフォルダを表示する。
- コンソール画面ではsbtやscalaがルートフォルダから開く。
- ルートの履歴が出る。
とルートフォルダだけ管理するファイルブラウザといったかんじですが、
sbtの場合あとは設定ファイルをエディタでいじれれば
かえって手軽にプロジェクトを管理できる気がします。
また、helpからjavaやscalaのAPIのリンクが出てくるのもさりげないですが便利です。
ただ未熟な点も多いです。アップデートが盛んなのですぐ状況が変わると思いますが。(5/27現在vesion0.2.0)
- コンソールに直接入力はできるが削除等の編集ができないので基本的には下のテキスト欄から入力する。
(windowsだけの不具合でunix,mac等では履歴・補完も効くようです)
-ファイルのエンコードが環境依存(僕の環境(日本語windows7)ではshift jis)
- jvm上で動き25MBもあるので手軽なエディタとは言いがたい。
- テンプレート機能がない(todoにあるのですぐにつくと思います)
不満な点も書きましたが、結構使えるいいエディタだと思うんですがどうでしょうか?
ScalaEditのホームページとgithubをはっておきます。
http://code.google.com/p/scala-edit/
https://github.com/kjellwinblad/ScalaEdit
エンコードに関してはUTF-8に決め打ちで入出力するフォークを作ってみました。
https://github.com/mnru/ScalaEdit
(現バージョン0.2.3ではデフォルトでUTF-8で読み書きするようになっています 6/2)
tortoiseHg2.03をインストール
tortoiseHgの2.0系が出てから結構、時間がたちましたが、2.03でhgsubversionがちゃんと動くようになったようです。
また,hg-gitとhgsubversionの干渉もなくなったのか、いちいち設定ファイルを書き換える必要もなくなりました。
これで、git,subversion,mercurialを統一的にtortoiseHgで扱うことができそうです。
インストール方法はほぼ1.9系と同じですが若干素直、単純になりました。(bookmarkの機能が内蔵されたとかで、設定する必要が
なくなりました)
手順
1.tortoisehgをインストールする。
2.puttyごった煮版をインストールする
3.「c:\hgex」というディレクトリを作って
hg clone http://bitbucket.org/durin42/hg-git/ C:/hgex/hg-git hg clone http://bitbucket.org/durin42/hgsubversion/ C:/hgex/hgsvn hg clone http://bitbucket.org/tinyfish/hg-fixutf8/ C:/hgex/hg-fixutf8
というコマンドを次々に実行する
4.mercurial.iniというファイルに以下の設定を書く
[ui] ssh = "C:\Program Files\TortoiseHg\TortoisePlink.exe" [extensions] hggit = C:\hgex\hg-git\hggit hgsubversion = C:\hgex\hgsvn\hgsubversion fixutf8 = c:\hgex\hg-fixutf8\to\fixutf8.py
5.ユーザー設定でユーザー名を設定する
6.環境変数を以下の設定にする
LANG=ja
HGENCODING=utg-8
7.「C:\Program Files\TortoiseHg\i18n\cmenu\thg-cmenu-ja.reg」を実行して右クリックメニューを日本語化する。
8.github,bitbucketにアカウントを作る
9.puttygenで作った公開鍵をgithubとbitbucketにコピペ(それぞれ別)。秘密鍵をファイルとして保存する。
10.秘密鍵をダブルクリックしてpagentを常駐させてから、接続を行う。
githubとbitbucketにミラーを作る
早速githubとbitbucketに行列のソースをアップしてみました。
基本的にどちらも空のリポジトリをweb上で作ってからローカルのリポジトリをプッシュすればいいはずだと思うんですが、
githubではうまくいかなかったので、空のgithubのリポジトリをローカルにクローンしていろいろ編集したものを、github,bitbucketにpushしました。
なおsshを使ってアクセスする場合のアドレスは
github git+ssh://git@github.com/mnru/ToyMatrix.git bitbucket ssh://hg@bitbucket.org/mnr_u/toymatrix
といった感じになります。
scalaで行列(3)
くどいですが、また書き換えてみました。
前回は二項演算子を引数にとって行列の各要素の演算を行うmopというメソッドを作ったのですが、
それの行バージョンのropというメソッドを加えてみました。
(import文とMatrixクラスのみ抜粋)
import scala.math.Numeric class Matrix[T: Numeric](val elms: M[T]) { override def toString() = (this.elms map (_.mkString("[", ",", "]"))).mkString("", "\n", "\n") def rop(rthis:R[T],rthat:R[T])(op: F[T]):R[T]=(rthis zip rthat)map (t => op(t._1,t._2)) def mop(that: Matrix[T])(op: F[T]): Matrix[T] = new Matrix[T]( ( this.elms zip that.elms) map (t => rop(t._1,t._2)(op(_,_))) ) def +(a: T, b: T) = implicitly[Numeric[T]].plus(a, b) def -(a: T, b: T) = implicitly[Numeric[T]].minus(a, b) def *(a: T, b: T) = implicitly[Numeric[T]].times(a, b) def +(that: Matrix[T]): Matrix[T] = this.mop(that)(this.+(_, _)) def -(that: Matrix[T]): Matrix[T] = this.mop(that)(this.-(_, _)) def transpose = new Matrix[T](this.elms.transpose) def dotProduct(a: R[T], b: R[T]): T = (rop(a,b)(this.*(_,_)).reduceLeft(this.+(_, _)) def *(that: Matrix[T]): Matrix[T] = new Matrix[T]( (for (rthis <- this.elms) yield (for (cthat <- that.elms.transpose) yield dotProduct(rthis, cthat))) ) }
さらにScala2.9からNumericが*,+,-をメソッドに持つ structual subtypingのように扱えるようになったので
import Numeric.Implicits._ class Matrix[T: Numeric](val elms: M[T]) { override def toString() = (this.elms map (_.mkString("[", ",", "]"))).mkString("", "\n", "\n") def rop(rthis:R[T],rthat:R[T])(op: F[T]):R[T]=(rthis zip rthat)map (t => op(t._1,t._2)) def mop(that: Matrix[T])(op: F[T]): Matrix[T] = new Matrix[T]( ( this.elms zip that.elms) map (t => rop(t._1,t._2)(op(_,_))) ) def +(that: Matrix[T]): Matrix[T] = this.mop(that)(_+_) def -(that: Matrix[T]): Matrix[T] = this.mop(that)(_-_) def transpose = new Matrix[T](this.elms.transpose) def dotProduct(a: R[T], b: R[T]): T = (rop(a,b)(_*_)).reduceLeft(_+_) def *(that: Matrix[T]): Matrix[T] = new Matrix[T]( (for (rthis <- this.elms) yield (for (cthat <- that.elms.transpose) yield dotProduct(rthis, cthat))) ) }
当初の思惑に近づいてすっきりした気もしますが、隠語の羅列のような気もします。
