marveriksにアップデートしたらSynergyのキー配列が変

以前Windowsをサーバにmacをクライアントでsynergyを使用していたのですが、macのOSをmountain lion からmavericksにアップデートしたところ、synergyで記号がまたまたおかしくなってしまった

以前はキーボードの設定で地域をオーストラリアなどにすればよかったのですが今回はそういう設定がなくなった模様。。

いろいろごじゃごじゃやってようやく解決

  • mac 10.9 + SybergyKM
  • windows 7 + Synergy1.3

1.macのシステム設定からキーボードを選択

2.入力ソースで+からbritish-PCを選択

3.ことえりを選択し英字のチェックを外す

つまり英語入力時にはbritish-PCを使えば106キーボードの記号がそのまま出ます

そろそろバグ修正してもらえませんかねぇ

Scala+SlickでTupple22問題を解決してみた

slickというかscalaには有名なタプル22問題があります。

23項目以上のメンバを持ったcase classが作れない。

どうやらscala2.11では解消されているようですが、まだベータ版ということで使うのにはためらいます

そこでネストしたcase classを用いて23カラム以上持つデータベースのテーブルを取得するものを作成してみました

  • scala2.10.2
  • slick2.10-1.0.1
  • eclipse 4.3
  • Tests.scala

import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession
import scala.slick.jdbc.{GetResult, StaticQuery => Q}
import Q.interpolation

	 case class PartA(a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07:Int, a08:Int, a09:Int, a10:Int)
	 case class PartB(a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17:Int, a18:Int, a19:Int, a20:Int)
	 case class PartC(a21: Int, a22: Int, a23: Int, a24: Int)
	 case class Whole(id: Int, p1: PartA, p2: PartB, p3: PartC)

		object Tests extends Table[Int]("test"){
			def id = column[Int]("id", O.PrimaryKey)
			def a01 = column[Int]("a01")
			def a02 = column[Int]("a02")
			def a03 = column[Int]("a03")
			def a04 = column[Int]("a04")
			def a05 = column[Int]("a05")
			def a06 = column[Int]("a06")
			def a07 = column[Int]("a07")
			def a08 = column[Int]("a08")
			def a09 = column[Int]("a09")
			def a10 = column[Int]("a10")
			def a11 = column[Int]("a11")
			def a12 = column[Int]("a12")
			def a13 = column[Int]("a13")
			def a14 = column[Int]("a14")
			def a15 = column[Int]("a15")
			def a16 = column[Int]("a16")
			def a17 = column[Int]("a17")
			def a18 = column[Int]("a18")
			def a19 = column[Int]("a19")
			def a20 = column[Int]("a20")
			def a21 = column[Int]("a21")
			def a22 = column[Int]("a22")
			def a23 = column[Int]("a23")
			def a24 = column[Int]("a24")

			def * = id

			def all = (
				id,
				(a01, a02, a03, a04, a05, a06, a07, a08, a09, a10),
				(a11, a12, a13, a14, a15, a16, a17, a18, a19, a20),
				(a21, a22, a23, a24)
			)
	
			private def connectDB[Any](db:javax.sql.DataSource,f: => Any): Any = {
				Database.forDataSource(db) withSession {f}
			} 
			implicit val sqlToClass=GetResult(rs=>Whole(rs<<,PartA(rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<),PartB(rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<,rs<<),PartC(rs<<,rs<<,rs<<,rs<<)))
 
			def select(db:javax.sql.DataSource,id:String):Option[Whole]= {
				connectDB(db,
				{
				sql"select 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4 ".as[Whole].list.headOption
				}
		)
	}
}

  • TestsTest.scala

import javax.sql._
import javax.naming._

import org.junit._

import com.mysql.jdbc.jdbc2.optional._

class StockMasterTest {
	 private def testDataSource:javax.sql.DataSource={
	System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.naming.java.javaURLContextFactory")
	System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming")
	val ic = new InitialContext()
	ic.createSubcontext("java:")
	ic.createSubcontext("java:comp")
	ic.createSubcontext("java:comp/env")
	ic.createSubcontext("java:comp/env/jdbc")

		val ds = new MysqlConnectionPoolDataSource()
	ds.setUser("root")
	ds.setPassword("password")
	ds.setDatabaseName("dbname")
	ds.setServerName("localhost")
	ds.setPortNumber(3306)
	ic.bind("java:comp/env/jdbc/database", ds)
	ds
	} 

	@Test
	def select:Unit={
		val list=Tests.select(testDataSource,"id");
		println(list)

	}

}
  • eclipse4.3で実行
Some(Whole(0,PartA(1,2,3,4,5,6,7,8,9,0),PartB(1,2,3,4,5,6,7,8,9,0),PartC(1,2,3,4)))

とりあえず動いているようです

iptablesでNAT変換しTOMCATをポート80で動かす

色々やりかたはあると思うのですが、ROOT権限で動かしたくなかったので

iptablesでNAT変換します

iptables -F
iptables -t nat -F
iptables -X
iptables -Z
iptables -t nat -A OUTPUT -d localhost -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -d `hostname` -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -d `hostname` -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -L

Windowsでシンボリックリンクを作成

どうやらWindowsでもシンボリックリンクが作成できるようです。Vista以降。

というのもScalaのベータ版を使ってみたいがためいちいち入れ替えるのもあれなので、うまくできないかなと探していたところ以下の記事を発見

http://blog.livedoor.jp/s_imai_jp/archives/51360129.html

C:\Program Files (x86)>path
PATH=...;C:\Program Files (x86)\scala\\bin
;C:\play-2.1.3;C:\Program Files\Java\jdk1.7.0_40\bin;...
C:\Program Files (x86)>scala -version
Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL
C:\Program Files (x86)>mklink /d scala scala-2.11.0-M4
scala <> scala-2.11.0-M4 のシンボリック リンクが作成されました
C:\Program Files (x86)>scala -version
Scala code runner version 2.11.0-M4 -- Copyright 2002-2013, LAMP/EPFL

Javaで自ホストのIPアドレスで127.0.0.1以外を取得する

ちょっと困ったのでメモ

通常JavaのInetAddress.getLocalHost().getHostAddress()から取得できるIPアドレスは127.0.0.1

これではちょっと使えません

ネットワークインターフェースを調べるとちゃんとした?IPアドレスが取得できます

import java.net.*;
import java.util.*;


public class test{
	public static void main(String[] argv)throws Exception{
		Enumeration n = NetworkInterface.getNetworkInterfaces();
			while (n.hasMoreElements()){
				NetworkInterface e = n.nextElement();
				Enumeration a = e.getInetAddresses();
				while ( a.hasMoreElements()){
					InetAddress addr = a.nextElement();
																		if (!addr.getHostAddress().equals("127.0.0.1"))
							 System.out.println(addr.getHostAddress());
				}
		 }
	}
}

javascriptでサブドメインの異なるサイトでクッキーの共有

こちらの記事を参考にJavascriptでサブドメインの異なるサイト間でクッキーの恭有してみました。

http://d.hatena.ne.jp/dirablue/20090506/1241607961

http://www1.example.com/setCookie.html

  • setCookie.html

  





http://www2.example.com/getCookie.html

  • getCookie.html

  



ポイントはHTMLを設置するパスを同じにすることとdomain指定の前にドットをつけることでしょうか?

あとIDやパスワードをクッキーに保存してはいけません^^);

eclipse+tomcatでアクセスログの場所

意外とわからなかったのでメモ。

環境

  • eclipse kelpher
  • tomcat 7
  • java 7

手順

  1. プロジェクトの作成でWebーDynamicWebで作成
  2. Eclipseの環境設定のServer、RuntimeEnvironmentsにtomcat 追加
  3. プロジェクトのpropertiesからjava build pathのLibrariesにadd LibrariesからServer Runtime のTOMCATを追加
  4. なんか作成
  5. Debug AsのDebug ConfigurationからTomcatのargumentsを確認
  6. ここの-Dcatalina.baseのパス以下にTOMCATのいろいろなものが入っている(/Users/username/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0)
  7. このlogs以下にアクセスログが作成される

PlayFramework2.1でセッションタイムアウトを作ってみた

PlayFrameworkのセッションはCookieになります。ブラウザを閉じるまで有効なので、従来のservletなどで実現してきたsessionの観念はありません。

これが意外と困ってしまうので(タイムアウトした際にログアウトさせるなど)Cookieに時間を持たせることによりにたようなものを実装してみました

routes

GET		 /													 controllers.Application.index
GET		 /login													controllers.Application.login
POST		/login													controllers.Application.submit

controllers.Application.scala

package controllers

import play.api._
import play.api.mvc._
import helper.Session
import helper.Login
import play.api.data._
import play.api.data.Forms._
import play.api.data.validation.Constraints._
	
case class User(id:String,password:String)
	
object Application extends Controller {
	val userForm = Form[User](
			mapping(
					"id" ->nonEmptyText,
					"password"->text(minLength=6))
			((id,password)=>User(id,password))((user:User)=>Some(user.id,user.password))
	)
	
	def index = Action {request=>{
			if(Session.check(request))Ok(views.html.index("LoginOK"))
			else Redirect(routes.Application.login)
		}	 
	}
	def login=Action{
		Ok(views.html.login(userForm))
	}
	def submit = Action { implicit request =>
		userForm.bindFromRequest.fold(
			errors => BadRequest(views.html.login(errors)),
			user => {
				if(Login.check(request,user.id,user.password))Redirect(routes.Application.index).withSession(Session.set(request))
				else BadRequest(views.html.login(userForm))
			}
		) 
	}
}

helper.Login.scala

本来ならばログインIDとパスワードとつきあわせてチェックするのですがとりあえず必ずOKになるように

package helper

import play.api._
import play.api.mvc._
object Login {

	def check(req:Request[AnyContent],id:String,password:String):Boolean={
		true // NO check
	}
}

helper.Session.scala

クッキーに保存した時刻と現在時刻を比較し、ログアウトの判定

package helper

import play.api._
import play.api.mvc._
object Session {
	val MAX_MILLISEC:Long=1000*60	// time out 
	val SESSION_KEY="play2"
	
	def check(req:Request[AnyContent]):Boolean={
		req.session.get(SESSION_KEY).map{
			user=>{ 
				val cookieDate=user.toLong
				val nowDate=new java.util.Date().getTime();
				if(nowDate-cookieDatenew java.util.Date().getTime().toString())
	}
// ログアウトボタンを押したらこれを呼ぶ、未実装
	def del(req:Request[AnyContent])={
		req.session - SESSION_KEY
	}
}

views.index.scala.html

@(message: String)
@message

views.login.scala.html

@(userForm:Form[User])

@import helper._

@helper.form(action=routes.Application.submit){
						@inputText(
								userForm("id"), 
								'_label -> "Username", 
								'_help -> "Please choose a valid username.",
								'_error -> userForm.globalError
						)
						
						
						@inputPassword(
								userForm("password"), 
								'_label -> "Password",
								'_help -> "A password must be at least 6 characters. "
						)
						



}

ログイン後1分放置するとログイン画面に戻ります