mac同士でキーボード・マウスを共有
研究室でiMacとmacbook同時にを使用しているが、いちいち腕を動かすのがダルイ。
なのでマウス、キーボードを共有できるものがないか調べてみた。
teleportなるものがあるらしい。
ということで入れてみた。
- インストール(両方のMacに)
- http://abyssoft.com/software/teleport/の上にあるdownloadから落としてきて、解凍。
中にあるteleport.prefPaneをダブルクリック。 - その表示にしたがってインストールするとmacのシステム環境設定のパネルにteleportの項目が追加されている。
- http://abyssoft.com/software/teleport/の上にあるdownloadから落としてきて、解凍。
- 設定
これで使えるようになるはず。
気になること
・マウスボタンが接続先で使えない。Exposeをマウス余ったボタンに割り当ててるので結構こまる。
・キーボードの音量も接続先で使えない。
・画面の端にExposeやSpaces当ててる人は不都合でるかも。
その場合はOptionの Switch only if key down:でキー設定するといいかも
・イントールはめっちゃ簡単。設定も簡単。これスゴイよ!!
このソフト意外にもsynegyとうソフトもある。こちらも動いた。
Synergy ふたたび! - SynergyKM -このサイトでGUIによる設定を紹介している。
試してみたい場合はCUIで設定するよりこっちがオススメ
pydevでunable to find interpreterがでる。
eclipse3.6がリリースされていたのでバージョンを上げてみた。
それにpydevを入れて、interpreterの設定をしてみるとあら不思議、動かない。なぜ?…
unable to find interpreter:named python26. Available:python2.6(~~~~~~~
となる。
あれ?python26ってなに?python2.6とInterpreterの名前つけたはずなのに…
どうも前のバージョンeclipseのプロファイルと競合?してるらしくpython26なんてねえと言われるので、とりあえず前のeclipseで設定していたInterpreterの名前であるpython26に変更。
とりあえず動いた。まあこれでいいや
どっかの設定ファイルいじれば正しく設定できるはず!!きっと!
Scalaに入門したい。 #4 データ構造
前回Scalaに入門したい。 #3 制御構文 - 風の谷の備忘録は、制御構文について触れました。
今回はデータ構造についてやっていきたいと思います。
Array
Arrayリテラル
scala> val num =Array(1,2,3) num: Array[Int] = Array(1, 2, 3)
Array型はミュータブルな型で、あとから再代入可能である。
変数をvalで宣言してもArray自体が変更可能なので以下のようなことが可能
scala> num.update(0,4) scala> for (i <- num) | println (i) 4 2 3
numの0番目を4に置き換えてみた。ふむ。
明示的に型をしていするなら
scala> val numarray = new Array[Int](3) numarray: Array[Int] = Array(0, 0, 0)
という書き方も出来る。
List
Listリテラル
scala> val numlist = List(1,2,3) numlist: List[Int] = List(1, 2, 3)
scalaのListはイミュータブルにあって、
scala> numlist(0) res7: Int = 1 scala> numlist(0) = 4 <console>:6: error: value update is not a member of List[Int] numlist(0) = 4 ^
と怒られる。'='ってメソッドがListにはねえよってことですね。
もちろん格納先の変数をvarで宣言してやって、書き換えることは可能
でも参照透過性を確保するためにやめましょうって Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala) はおっしゃってます。
関数型的なコードではこういうのが基本みたいですね。
イミュータブルな値をつかい、さらにスコープを関数内だけに限定する関数単体の動作を保証するってスタンスらしい。
まあ手続き型でも考えることの気がするんだけど…副作用をもたないものを極力目指すらしいです。
ちなみにListの初期化は
scala> val num = 1 :: 2 :: 3 :: Nil num: List[Int] = List(1, 2, 3)
これでも可能です、'::'はList型のもってる演算子(メソッド)。
演算子が全てメソッドってのも後でまとめた方がいいなあ、オーバーライドなんかも含めて
Tuple
Tupleリテラル
scala> val tuple = ("hoge",1234) tuple: (java.lang.String, Int) = (hoge,1234)
Toupleはイミュータブルであるが、違う型のオブジェクトをぶち込むことが可能
そうすると要素にアクセスする方法がArrayなんかとは異なる
scala> val tuple = ("hoge",1234) tuple: (java.lang.String, Int) = (hoge,1234) scala> println(tuple._1) hoge scala> println(tuple._2) 1234
とこんな感じでアクセス
添字が0からじゃないところに注意ですねえ。
簡単ですが今回はここまで。
次回はデータ構造の続きをやります。setやmapなどに触れられればと思います。
Scalaに入門したい。 #3 制御構文
前回「Scalaに入門したい。#2 変数と関数 - 風の谷の備忘録」は、変数と関数の宣言方法についてお勉強したので、今回はScalaの制御構文についてみて行こうと思う。
if文…if式?
まず下のコードについてみていく
scala> if (1 < 3) true else false res18: Boolean = true scala> if (1 > 3) true else false res19: Boolean = false //trueとfalseはBoolean型のリテラル
みて分かる通りブロックがなく
if (条件式) [true時の処理] else [false時の処理]
というようになる。javaの三項演算子に似てる。
条件式を抜けて処理部分が評価され、評価された値が返る仕組みになっている。
scala> if (1 > 3) | true //ここで[Enter] res20: AnyVal = ()
こんな感じになってしまう。trueを書いたところでifが実行されてるらしい
そして何で結果型がAnyValかっていうと
d:id:matt-k:20100413より
2.8から返り値の型がAnyValになるみたい.
if (true) 3
は
if (true) 3 else ()
という解釈になるみたい.
http://d.hatena.ne.jp/matt-k/20100413
とのこと。
ちなみに
scala> (x:Int,y:Int) => if(x > y) x else y res25: (Int, Int) => Int = <function2> scala> res25(2,3) res26: Int = 3 scala> println(res25(3,5)) 5
こゆこともできる。やっぱ式か?…
while文
scala> var i = 0 i: Int = 0 scala> while(i<5){ | println(i) | i+=1 | } 0 1 2 3 4
まあ普通のwhileよね。javaと変わらん
ちなみにScalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
だとなるべく使うなとのこと
何故かと言えば、whileの終了条件にはvarな値を使うことが多い。でもそれだと副作用を産むので関数型っぽくならんよってことらしい
do-while
scala> var i = 0 i: Int = 0 scala> do{ | i+=1 | println(i) | }while(i<5) 1 2 3 4 5
for式
反復処理
scala> for(i <- Range(0,10)) | print(i) 0123456789 scala> for( i <- 0 to 10){ | print(i) | } 012345678910
"<-"はpythonでいう"in"と同じ。
Rangeってのはscala.collection.immutable.Rangeから来ててcollectionの子クラスだからこんな風に使えます。pythonと同じね。
フィルター
scala> for(i <- Range(0,10) if(i%2 ==0)) | print(i) 02468
forの条件式?内にifでフィルターもかけられるよ!!これ便利ね
入れ子
scala>for{i <- Range(0,3) | t <- Range(0,3) | } | {print("i = "+i+", ") | println("t = "+t) |} i = 0, t = 0 i = 0, t = 1 i = 0, t = 2 i = 1, t = 0 i = 1, t = 1 i = 1, t = 2 i = 2, t = 0 i = 2, t = 1 i = 2, t = 2
入れ子にも出来るよ!!
いろいろできますなあ。入れ子の例で中括弧使ってるのは行末判定に必要な";"を打つのがめんどくさいからです。
とりあえず今回はここまで次回はデータ構造をみていきたい
Scalaに入門したい。#1 インストール
・インストール
- ダウンロード
- インストール
- テスト
- PATH通す
Download | The Scala Programming Language
上のページから使っているOSに合わせてダウンロードする。
Stableは2.7.7だったが、すでにインストールしてあったので2.8.0を落としてきた。
ちなみにうちの環境はOSX 10.5.8だった。
落としてきたファイルを展開して中をみると
[kousaka]% tar -xf scala-2.8.0.RC1.tgz [kousaka]% cd scala-2.8.0.RC1 [kousaka]% cd doc [kousaka]% cat README ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Unix Installation ----------------- Untar the archive. All Scala tools are located in the "bin" directory. Adding that directory to the PATH variable will make the Scala commands directly accessible. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
とあるので「/scalaほにゃほにゃ/bin」にPATHを通せばいいらしい。
それで終わり!!なんと簡単なっ!!
READMEの中にテストについて書いてあったのでやってみる。
You may test the distribution by running the following commands: $ ./bin/sbaz install scala-devel-docs $ ./bin/scalac doc/scala-devel-docs/examples/sort.scala $ ./bin/scala examples.sort [6,2,8,5,1] [1,2,5,6,8] $ ./bin/scala scala> examples.sort.main(null) [6,2,8,5,1] [1,2,5,6,8] scala>:quit $
この通りに試してみるべ。
[kousaka]% ./bin/sbaz install scala-devel-docs [j06027:~/scala-2.8.0.RC1] planning to install: scala-devel-docs/2.8.0.RC1 Installing... Downloading: http://www.scala-lang.org/downloads/packages/scala-devel-docs-2.8.0.RC1.sbp 13.08M/13.08M Done #scala/docにscala-develdocs/ができる [kousaka]% ./bin/scalac doc/scala-devel-docs/examples/sort.scala [j06027:~/Desktop/scala-2.8.0.RC1] #コンパイルされる [kousaka]% ./bin/scala examples.sort [j06027:~/scala-2.8.0.RC1] [6,2,8,5,1] [1,2,5,6,8] [kousaka]% ./bin/scala [j06027:~/scala-2.8.0.RC1] Welcome to Scala version 2.8.0.RC1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_17). Type in expressions to have them evaluated. Type :help for more information. scala> examples.sort.main(null) [6,2,8,5,1] [1,2,5,6,8] scala> :exit Unknown command. Type :help for help. scala> :quit
おういえ!!
簡単ですねん。
その前に、homeディレクトリに置いとくのは邪魔なのでどっかに移動させる。
[kousaka]% sudo mv scala-2.8.0.RC1 /usr/ [j06027:~]
とかで、いいんじゃね?
それでシェルの環境設定ファイルにPATHを追加しておわりです。
zshを使っているので~/.zshrcに
path=( $path /usr/scala-2.8.0.RC1/bin )
[kousaka]%scala [j06027:~] Welcome to Scala version 2.8.0.RC1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_17). Type in expressions to have them evaluated. Type :help for more information. scala>
Scalaに入門したい。#2 変数と関数
さて前回「Scalaに入門したい。#1 インストール - 風の谷の備忘録」はインストールまでやった訳だが、とりあえず基本的なことからみていきたいと思う。
私自身は
これを読んだり、色々なサイトを巡りながら、これをまとめている。
Scalaは関数型オブジェクト指向言語
正直言ってサッパリわかんねぇぜ!!
概要
関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。また、純粋関数型言語では、全ての関数が副作用を持たない。関数型言語の多くは、カリー化、遅延評価などの機能を備えている。また、静的型付けの物の多くは型推論の機能を持つ。
引数の評価が関数の実行より先に行われることを正格であるといい、そのような性質を正格性と呼ぶ。正格性に関して非正格である言語は通常、デフォルトでの遅延評価を採用している。純粋関数型言語は遅延評価を標準とし、非純粋関数型言語は正格評価(先行評価)を標準としている。
関数型言語 - Wikipedia
オブジェクト指向プログラミング (OOP、英: object-oriented programming) とは相互にメッセージ (message) を送りあうオブジェクト (object) の集まりとしてプログラムを構成する技法である。この技法をサポートするプログラミング言語はオブジェクト指向プログラミング言語 (object-oriented programming language, OOPL) と呼ばれる。オブジェクト指向プログラミングには必ずしもオブジェクト指向プログラミング言語を用いる必要は無いが、オブジェクト指向プログラミング言語の備えるクラスとその継承などの仕組みを利用するほうが格段に開発効率は向上する。
オブジェクト指向プログラミング - Wikipedia
うん。分からん。
こういうのは使っていくうちに分かってくるものだと思っているので、深くは考えないでおく。
たぶんどっちの書き方も出来るよってことなのだろう。
とにかく試してみる
うだうだ考えても仕方ないので試してみる。
・変数
scalaの変数にはvarとvalの2種類ある。
・var
これは変更可能な値で、variableの略
scala> var num : Int = 2 num: Int = 2 scala> num = 3 num: Int = 3
・val
これは変更不可能な値、valueの略
scala> val hoge : Int = 2 hoge: Int = 2 scala> hoge = 3 <console>:6: error: reassignment to val hoge = 3 ^
変更不可能なので、こんな感じでエラーがでる。
・変数の宣言
上の例でも見た通りで
scala> var num : Int = 2 num: Int = 2
[変数の種類] [変数名]:[値の型] = [変数の値]
という形になる。これだと相当ダルイけどScalaには型推論という便利なものがありまして
scala> var amicable = 220 amicable: Int = 220 scala> var hello = "Hello World" hello: java.lang.String = Hello World
[変数の種類] [変数名] = [変数の値]
とこんな感じで値をみて型を自動的に割り当ててくれる。
まあ多少楽です。
・値の型
Scalaでは基本型として以下が存在する。
- 基本型
- 数値型
- Byte
- Short
- Int
- Long
- Float
- Double
- Char
- String
- Boolean
- 数値型
この辺はjavaと同じなので詳しく書かない。
・関数
scala> def hello (name : String) : String = { | "Hello " + name | } hello: (String)String scala> hello("Scala") res9: String = Hello Scala
def [関数名] ([引数名] : [引数の型]) : [結果型(戻り値の型のこと)] = { 〜〜〜関数の中身〜〜〜 }
となる。基本的に最後に行った演算を返す…のかな?
hello:(String)Stringは
関数名:([引数の型])[結果型]の表記に従ったもの
scala> def test (num : Int) : Int = { | num + 1 | } test: (Int)Int scala> test(5) res10: Int = 6
そうみたい。一応明示的なreturnもあるけど、それだと関数型っぽくならないよね〜
・結果型の型推論
scala> def test2 (num : Int) ={ | num+1 | } test2: (Int)Int scala> test2(4) res11: Int = 5
結果型を指定しなくても型推論して戻してくれる。
再帰などのときは明示的指定する必要があるとか
・voidな関数
scala> def void ()={ | println("hoge") | } void: ()Unit scala> void hoge
void : ()Unitについて
・()は引数がない事を意味する。
・Unitは関数が意味のある値を返してこない事を意味する。javaのvoidみたいなもん