mac同士でキーボード・マウスを共有

研究室でiMacmacbook同時にを使用しているが、いちいち腕を動かすのがダルイ。
なのでマウス、キーボードを共有できるものがないか調べてみた。

teleportなるものがあるらしい。
screenshot
ということで入れてみた。

  • インストール(両方のMacに)
    • http://abyssoft.com/software/teleport/の上にあるdownloadから落としてきて、解凍。
      中にあるteleport.prefPaneをダブルクリック。
    • その表示にしたがってインストールするとmacのシステム環境設定のパネルにteleportの項目が追加されている。


  • 設定
    • 両方のMac
      システム環境設定のteleportにあるActive teleportにチェック
    • キーボード・マウスを飛ばしたいほうのMac
      Shared this Macにチェック
    • キーボード・マウスの接続されているMac
      Layoutのタブに接続されたMacが表示されるのでそれを好きな位置にドラッグ

これで使えるようになるはず。

気になること
・マウスボタンが接続先で使えない。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インタプリタで行を分けて書こうとすると

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 インストール

・インストール

  1. ダウンロード
  2. Download | The Scala Programming Language


    上のページから使っているOSに合わせてダウンロードする。

    Stableは2.7.7だったが、すでにインストールしてあったので2.8.0を落としてきた。

    ちなみにうちの環境はOSX 10.5.8だった。


  3. インストール
  4. 落としてきたファイルを展開して中をみると

    [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を通せばいいらしい。

    それで終わり!!なんと簡単なっ!!



  5. テスト
  6. 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
    

    おういえ!!

    簡単ですねん。



  7. PATH通す
  8. その前に、homeディレクトリに置いとくのは邪魔なのでどっかに移動させる。

    [kousaka]% sudo mv scala-2.8.0.RC1 /usr/                             [j06027:~]

    とかで、いいんじゃね?

    それでシェルの環境設定ファイルにPATHを追加しておわりです。

    zshを使っているので~/.zshrcに

    path=( $path /usr/scala-2.8.0.RC1/bin )

    最後にホームからscalaインタプリタを起動してみる

    [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>
  9. まとめ
    • インストールは簡単。落としてきてPATH通すだけ
    • JVMは1.5以上で動くらしいっす

第二回へ;Scalaに入門したい。#2 変数と関数 - 風の谷の備忘録

Scalaに入門したい。#2 変数と関数

さて前回「Scalaに入門したい。#1 インストール - 風の谷の備忘録」はインストールまでやった訳だが、とりあえず基本的なことからみていきたいと思う。

私自身は
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
これを読んだり、色々なサイトを巡りながら、これをまとめている。

Scalaは関数型オブジェクト指向言語

正直言ってサッパリわかんねぇぜ!!

  • 関数型
    • これは、LispとかHaskellみたいな言語のことを言う。

概要

関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。また、純粋関数型言語では、全ての関数が副作用を持たない。関数型言語の多くは、カリー化、遅延評価などの機能を備えている。また、静的型付けの物の多くは型推論の機能を持つ。

引数の評価が関数の実行より先に行われることを正格であるといい、そのような性質を正格性と呼ぶ。正格性に関して非正格である言語は通常、デフォルトでの遅延評価を採用している。純粋関数型言語は遅延評価を標準とし、非純粋関数型言語は正格評価(先行評価)を標準としている。

関数型言語 - Wikipedia

オブジェクト指向プログラミング (OOP、英: object-oriented programming) とは相互にメッセージ (message) を送りあうオブジェクト (object) の集まりとしてプログラムを構成する技法である。この技法をサポートするプログラミング言語オブジェクト指向プログラミング言語 (object-oriented programming language, OOPL) と呼ばれる。オブジェクト指向プログラミングには必ずしもオブジェクト指向プログラミング言語を用いる必要は無いが、オブジェクト指向プログラミング言語の備えるクラスとその継承などの仕組みを利用するほうが格段に開発効率は向上する。

オブジェクト指向プログラミング - Wikipedia

うん。分からん。
こういうのは使っていくうちに分かってくるものだと思っているので、深くは考えないでおく。
たぶんどっちの書き方も出来るよってことなのだろう。

とにかく試してみる

うだうだ考えても仕方ないので試してみる。

Hello World!!

scalaインタプリタを起動して

scala> println("Hello World!!")
Hello World!!

scala>

・変数

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みたいなもん

第三回へ;Scalaに入門したい。 #3 制御構文 - 風の谷の備忘録