WINGSプロジェクト
wingsさんが作成した「WINGSプロジェクト」パッケージ
- Chica's Blog
- IIJIMASが勉強しようとしています。
- まさるblog
- ふじこのため息 v3
- 寝ても覚めても.NET(?)
- ナオキにASP.NET(仮)
- Azureの小ネタ
- あおきのTechメモ
- asaにっき
- bird982000の日記
- なお記
- 昨日とは違う今日この頃
- ゆろよろ日記
- 恵比寿で働く社長のアメブロ
- Ouobpo
- かるあ のメモ
- かるあのメモ on Wordpress
- まつぼ x Web
- IT起業日記@吉祥寺 DESKPLATE
- しまじろうの日記
- 蒼の王座
- be free
- Serendipity 2 / future lies'n sundome.
- 時空システムパートナー合同会社
- Processtune Blog
- Inquisitor
こんにちわ。今日は、関数合成の話をします。
標準入力から何行か読み込んで、ソートして返す以下のようなScalaのコードを例にします。
例なので、あえて冗長なコードを書いてます。
このコードでは、4つの関数が用意されています(unlines/putstr/sort/lines)。
この4つの関数を組み合わせて、読み込んだ文字列を行に分解して、ソートして、
また改行コードをつけて文字列にもどして表示、ということをやっています。
object Main extends App { val in = scala.io.Source.stdin.getLines.mkString("\n") // 改行をつけて結合する関数 val unlines = (s:Seq[String]) => s.mkString("\n") // 文字列を表示する関数 val putStr = (s:String) => println(s) // ソートする関数 val sort = (s:Seq[String]) => s.sorted // 文字列を改行コードで分割する関数 val lines = (s:String) => s.lines.toSeq // かっこがいっぱい……。 putStr( unlines( sort( lines(in)))) }
問題は、最後の行です。
// かっこがいっぱい……。
putStr( unlines( sort( lines(in))))
このカッコを無くすことが、今回のテーマです。
合成しなイカ
数学の授業で習った、合成関数を思い出してみましょう。
(g ∘ f)(x) = g(f(x))
関数gと関数fの合成関数g ∘ fに引数xを渡した結果は、関数gにf(x)の結果を渡したものと等しい、と言うことです。
先ほどのコードの例に戻りましょう。関数gをputStr, fをunlines(...)に置き換えると
(putStr ∘ unlines)(sort(lines(in)) = putStr( unlines( sort( lines(in))))
となります。この調子で、sortやlinesも合成していくと、このように変形できます。
(putStr ∘ unlines ∘ sort ∘ line)(in)
さて、Scalaにおける関数の合成は、Function1トレイトにcomposeというメソッドとして定義されています。これを利用すると、
(putStr compose unlines compose sort compose lines)(in)
このようになりました。カッコが減っていますね。
読みにくくなイカ?!
composeを使って関数を合成できることが分かりましたが、そもそもcomposeって長いのでもうヤ。
そこで、Groovyのように<<で関数を合成できるようにします。Function1に対して、このようなimplicit conversionを
定義します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g } implicit def toComposableFunction1[T1, R](func:T1 => R) = new ComposableFunction1[T1, R]{ val f = func }
その結果、先ほどのcomposeは<<で置換できるので、
(putStr << unlines << sort << lines)(in)
おー、だいぶシンプルになったじゃなイカ!
適用しなイカ?!
まだちょっと不満な点があります。それは、(合成関数)(引数)のように、まだカッコが残っているからです。
「全てのカッコを、書かれる前に消し去りたい。全てのコード、過去と未来の全てのカッコを、この手で…!」
そこで、composeに<<という別名を付けたように、関数適用applyにも別名を付けます。ここでは、<*>をapplyの別名として、
先ほど用意したimplicit conversionで変換されるComposableFunction1に追加します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g // applyの別名 def <*>(v:T1) = f apply(v) }
さぁ、さっきのコードを変形してみようじゃなイカ?
putStr << unlines << sort << lines <*> in
やったー、カッコが消えたよ!!。
さて、これをもう少し推し進めると、Applicativeスタイルになるんじゃなイカ?と思ったのですが、今回はここまで。
ちなみにHaskellでは
import List main = do cs <- getContents sorting cs sorting :: String -> IO () sorting cs = putStr (unlines (sort (lines cs)))
が
sorting :: String -> IO () sorting cs = putStr $ unlines $ sort $ lines cs
こうなって
sorting :: String -> IO () sorting = putStr . unlines . sort . lines
こうなります。
こんにちわ。今日は、関数合成の話をします。
標準入力から何行か読み込んで、ソートして返す以下のようなScalaのコードを例にします。
例なので、あえて冗長なコードを書いてます。
このコードでは、4つの関数が用意されています(unlines/putstr/sort/lines)。
この4つの関数を組み合わせて、読み込んだ文字列を行に分解して、ソートして、
また改行コードをつけて文字列にもどして表示、ということをやっています。
object Main extends App { val in = scala.io.Source.stdin.getLines.mkString("\n") // 改行をつけて結合する関数 val unlines = (s:Seq[String]) => s.mkString("\n") // 文字列を表示する関数 val putStr = (s:String) => println(s) // ソートする関数 val sort = (s:Seq[String]) => s.sorted // 文字列を改行コードで分割する関数 val lines = (s:String) => s.lines.toSeq // かっこがいっぱい……。 putStr( unlines( sort( lines(in)))) }
問題は、最後の行です。
// かっこがいっぱい……。
putStr( unlines( sort( lines(in))))
このカッコを無くすことが、今回のテーマです。
合成しなイカ
数学の授業で習った、合成関数を思い出してみましょう。
(g ∘ f)(x) = g(f(x))
関数gと関数fの合成関数g ∘ fに引数xを渡した結果は、関数gにf(x)の結果を渡したものと等しい、と言うことです。
先ほどのコードの例に戻りましょう。関数gをputStr, fをunlines(...)に置き換えると
(putStr ∘ unlines)(sort(lines(in)) = putStr( unlines( sort( lines(in))))
となります。この調子で、sortやlinesも合成していくと、このように変形できます。
(putStr ∘ unlines ∘ sort ∘ line)(in)
さて、Scalaにおける関数の合成は、Function1トレイトにcomposeというメソッドとして定義されています。これを利用すると、
(putStr compose unlines compose sort compose lines)(in)
このようになりました。カッコが減っていますね。
読みにくくなイカ?!
composeを使って関数を合成できることが分かりましたが、そもそもcomposeって長いのでもうヤ。
そこで、Groovyのように<<で関数を合成できるようにします。Function1に対して、このようなimplicit conversionを
定義します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g } implicit def toComposableFunction1[T1, R](func:T1 => R) = new ComposableFunction1[T1, R]{ val f = func }
その結果、先ほどのcomposeは<<で置換できるので、
(putStr << unlines << sort << lines)(in)
おー、だいぶシンプルになったじゃなイカ!
適用しなイカ?!
まだちょっと不満な点があります。それは、(合成関数)(引数)のように、まだカッコが残っているからです。
「全てのカッコを、書かれる前に消し去りたい。全てのコード、過去と未来の全てのカッコを、この手で…!」
そこで、composeに<<という別名を付けたように、関数適用applyにも別名を付けます。ここでは、<*>をapplyの別名として、
先ほど用意したimplicit conversionで変換されるComposableFunction1に追加します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g // applyの別名 def <*>(v:T1) = f apply(v) }
さぁ、さっきのコードを変形してみようじゃなイカ?
putStr << unlines << sort << lines <*> in
やったー、カッコが消えたよ!!。
さて、これをもう少し推し進めると、Applicativeスタイルになるんじゃなイカ?と思ったのですが、今回はここまで。
ちなみにHaskellでは
import List main = do cs <- getContents sorting cs sorting :: String -> IO () sorting cs = putStr (unlines (sort (lines cs)))
が
sorting :: String -> IO () sorting cs = putStr $ unlines $ sort $ lines cs こうなって >|haskell| sorting :: String -> IO () sorting = putStr . unlines . sort . lines
こうなります。
こんにちわ。今日は、関数合成の話をします。
標準入力から何行か読み込んで、ソートして返す以下のようなScalaのコードを例にします。
例なので、あえて冗長なコードを書いてます。
このコードでは、4つの関数が用意されています(unlines/putstr/sort/lines)。
この4つの関数を組み合わせて、読み込んだ文字列を行に分解して、ソートして、
また改行コードをつけて文字列にもどして表示、ということをやっています。
object Main extends App { val in = scala.io.Source.stdin.getLines.mkString("\n") // 改行をつけて結合する関数 val unlines = (s:Seq[String]) => s.mkString("\n") // 文字列を表示する関数 val putStr = (s:String) => println(s) // ソートする関数 val sort = (s:Seq[String]) => s.sorted // 文字列を改行コードで分割する関数 val lines = (s:String) => s.lines.toSeq // かっこがいっぱい……。 putStr( unlines( sort( lines(in)))) }
問題は、最後の行です。
// かっこがいっぱい……。
putStr( unlines( sort( lines(in))))
このカッコを無くすことが、今回のテーマです。
合成しなイカ
数学の授業で習った、合成関数を思い出してみましょう。
(g ∘ f)(x) = g(f(x))
関数gと関数fの合成関数g ∘ fに引数xを渡した結果は、関数gにf(x)の結果を渡したものと等しい、と言うことです。
先ほどのコードの例に戻りましょう。関数gをputStr, fをunlines(...)に置き換えると
(putStr ∘ unlines)(sort(lines(in)) = putStr( unlines( sort( lines(in))))
となります。この調子で、sortやlinesも合成していくと、このように変形できます。
(putStr ∘ unlines ∘ sort ∘ line)(in)
さて、Scalaにおける関数の合成は、http://www.scala-lang.org/api/current/scala/Function1.html:Function1トレイト]にcomposeというメソッドとして定義されています。これを利用すると、
(putStr compose unlines compose sort compose lines)(in)
このようになりました。カッコが減っていますね。
読みにくくなイカ?!
composeを使って関数を合成できることが分かりましたが、そもそもcomposeって長いのでもうヤ。
そこで、Groovyのように<<で関数を合成できるようにします。Function1に対して、このようなimplicit conversionを
定義します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g } implicit def toComposableFunction1[T1, R](func:T1 => R) = new ComposableFunction1[T1, R]{ val f = func }
その結果、先ほどのcomposeは<<で置換できるので、
(putStr << unlines << sort << lines)(in)
おー、だいぶシンプルになったじゃなイカ!
適用しなイカ?!
まだちょっと不満な点があります。それは、(合成関数)(引数)のように、まだカッコが残っているからです。
「全てのカッコを、書かれる前に消し去りたい。全てのコード、過去と未来の全てのカッコを、この手で…!」
そこで、composeに<<という別名を付けたように、関数適用applyにも別名を付けます。ここでは、<*>をapplyの別名として、
先ほど用意したimplicit conversionで変換されるComposableFunction1に追加します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g // applyの別名 def <*>(v:T1) = f apply(v) }
さぁ、さっきのコードを変形してみようじゃなイカ?
putStr << unlines << sort << lines <*> in
やったー、カッコが消えたよ!!。
さて、これをもう少し推し進めると、Applicativeスタイルになるんじゃなイカ?と思ったのですが、今回はここまで。
ちなみにHaskellでは
import List main = do cs <- getContents sorting cs sorting :: String -> IO () sorting cs = putStr (unlines (sort (lines cs)))
が
sorting :: String -> IO () sorting cs = putStr $ unlines $ sort $ lines cs こうなって >|haskell| sorting :: String -> IO () sorting = putStr . unlines . sort . lines
こうなります。
こんにちわ。今日は、関数合成の話をします。
標準入力から何行か読み込んで、ソートして返す以下のようなScalaのコードを例にします。
例なので、あえて冗長なコードを書いてます。
このコードでは、4つの関数が用意されています(unlines/putstr/sort/lines)。
この4つの関数を組み合わせて、読み込んだ文字列を行に分解して、ソートして、
また改行コードをつけて文字列にもどして表示、ということをやっています。
object Main extends App { val in = scala.io.Source.stdin.getLines.mkString("\n") // 改行をつけて結合する関数 val unlines = (s:Seq[String]) => s.mkString("\n") // 文字列を表示する関数 val putStr = (s:String) => println(s) // ソートする関数 val sort = (s:Seq[String]) => s.sorted // 文字列を改行コードで分割する関数 val lines = (s:String) => s.lines.toSeq // かっこがいっぱい……。 putStr( unlines( sort( lines(in)))) }
問題は、最後の行です。
// かっこがいっぱい……。
putStr( unlines( sort( lines(in))))
このカッコを無くすことが、今回のテーマです。
合成しなイカ
数学の授業で習った、合成関数を思い出してみましょう。
(g ∘ f)(x) = g(f(x))
関数gと関数fの合成関数g ∘ fに引数xを渡した結果は、関数gにf(x)の結果を渡したものと等しい、と言うことです。
先ほどのコードの例に戻りましょう。関数gをputStr, fをunlines(...)に置き換えると
(putStr ∘ unlines)(sort(lines(in)) = putStr( unlines( sort( lines(in))))
となります。この調子で、sortやlinesも合成していくと、このように変形できます。
(putStr ∘ unlines ∘ sort ∘ line)(in)
さて、Scalaにおける関数の合成は、http://www.scala-lang.org/api/current/scala/Function1.html:Function1トレイト]にcomposeというメソッドとして定義されています。これを利用すると、
(putStr compose unlines compose sort compose lines)(in)
このようになりました。カッコが減っていますね。
読みにくくなイカ?!
composeを使って関数を合成できることが分かりましたが、そもそもcomposeって長いのでもうヤ。
そこで、Groovyのように<%lt;で関数を合成できるようにします。Function1に対して、このようなimplicit conversionを
定義します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g } implicit def toComposableFunction1[T1, R](func:T1 => R) = new ComposableFunction1[T1, R]{ val f = func }
その結果、先ほどのcomposeは$lt;$lt;で置換できるので、
(putStr << unlines << sort << lines)(in)
おー、だいぶシンプルになったじゃなイカ!
適用しなイカ?!
まだちょっと不満な点があります。それは、(合成関数)(引数)のように、まだカッコが残っているからです。
「全てのカッコを、書かれる前に消し去りたい。全てのコード、過去と未来の全てのカッコを、この手で…!」
そこで、composeに<<という別名を付けたように、関数適用applyにも別名を付けます。ここでは、<*>をapplyの別名として、
先ほど用意したimplicit conversionで変換されるComposableFunction1に追加します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g // applyの別名 def <*>(v:T1) = f apply(v) }
さぁ、さっきのコードを変形してみようじゃなイカ?
putStr << unlines << sort << lines <*> in
やったー、カッコが消えたよ!!。
さて、これをもう少し推し進めると、Applicativeスタイルになるんじゃなイカ?と思ったのですが、今回はここまで。
ちなみにHaskellでは
import List main = do cs <- getContents sorting cs sorting :: String -> IO () sorting cs = putStr (unlines (sort (lines cs)))
が
sorting :: String -> IO () sorting cs = putStr $ unlines $ sort $ lines cs こうなって >|haskell| sorting :: String -> IO () sorting = putStr . unlines . sort . lines
こうなります。
こんにちわ。今日は、関数合成の話をします。
標準入力から何行か読み込んで、ソートして返す以下のようなScalaのコードを例にします。
例なので、あえて冗長なコードを書いてます。
このコードでは、4つの関数が用意されています(unlines/putstr/sort/lines)。
この4つの関数を組み合わせて、読み込んだ文字列を行に分解して、ソートして、
また改行コードをつけて文字列にもどして表示、ということをやっています。
object Main extends App { val in = scala.io.Source.stdin.getLines.mkString("\n") // 改行をつけて結合する関数 val unlines = (s:Seq[String]) => s.mkString("\n") // 文字列を表示する関数 val putStr = (s:String) => println(s) // ソートする関数 val sort = (s:Seq[String]) => s.sorted // 文字列を改行コードで分割する関数 val lines = (s:String) => s.lines.toSeq // かっこがいっぱい……。 putStr( unlines( sort( lines(in)))) }
問題は、最後の行です。
// かっこがいっぱい……。
putStr( unlines( sort( lines(in))))
このカッコを無くすことが、今回のテーマです。
合成しなイカ
数学の授業で習った、合成関数を思い出してみましょう。
(g ∘ f)(x) = g(f(x))
関数gと関数fの合成関数g ∘ fに引数xを渡した結果は、関数gにf(x)の結果を渡したものと等しい、と言うことです。
先ほどのコードの例に戻りましょう。関数gをputStr, fをunlines(...)に置き換えると
(putStr ∘ unlines)(sort(lines(in)) = putStr( unlines( sort( lines(in))))
となります。この調子で、sortやlinesも合成していくと、このように変形できます。
(putStr ∘ unlines ∘ sort ∘ line)(in)
さて、Scalaにおける関数の合成は、http://www.scala-lang.org/api/current/scala/Function1.html:Function1トレイト]にcomposeというメソッドとして定義されています。これを利用すると、
(putStr compose unlines compose sort compose lines)(in)
このようになりました。カッコが減っていますね。
読みにくくなイカ?!
composeを使って関数を合成できることが分かりましたが、そもそもcomposeって長いのでもうヤ。
そこで、Groovyのように<<で関数を合成できるようにします。Function1に対して、このようなimplicit conversionを
定義します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g } implicit def toComposableFunction1[T1, R](func:T1 => R) = new ComposableFunction1[T1, R]{ val f = func }
その結果、先ほどのcomposeは<<で置換できるので、
(putStr << unlines << sort << lines)(in)
おー、だいぶシンプルになったじゃなイカ!
適用しなイカ?!
まだちょっと不満な点があります。それは、(合成関数)(引数)のように、まだカッコが残っているからです。
「全てのカッコを、書かれる前に消し去りたい。全てのコード、過去と未来の全てのカッコを、この手で…!」
そこで、composeに<<という別名を付けたように、関数適用applyにも別名を付けます。ここでは、<*>をapplyの別名として、
先ほど用意したimplicit conversionで変換されるComposableFunction1に追加します。
trait ComposableFunction1[-T1, +R] { val f: T1 => R def >>[A](g:R => A):T1 => A = f andThen g def <<[A](g:A => T1):A => R = f compose g // applyの別名 def <*>(v:T1) = f apply(v) }
さぁ、さっきのコードを変形してみようじゃなイカ?
putStr << unlines << sort << lines <*> in
やったー、カッコが消えたよ!!。
さて、これをもう少し推し進めると、Applicativeスタイルになるんじゃなイカ?と思ったのですが、今回はここまで。
ちなみにHaskellでは
import List main = do cs <- getContents sorting cs sorting :: String -> IO () sorting cs = putStr (unlines (sort (lines cs)))
が
sorting :: String -> IO () sorting cs = putStr $ unlines $ sort $ lines cs こうなって >|haskell| sorting :: String -> IO () sorting = putStr . unlines . sort . lines
こうなります。
まだキャンペーンモードクリアできてないんですが、今のところ楽しんで遊べてます。
これはd:id:naoki0311:20110607:1307448723で紹介したファイターズアンケージと同じKinectでプレイする格闘ゲームです。キャラクターというより、戦う力を得られるスーツを選んで戦います。ファイターズアンケージとの決定的な違いは二つ
- アバタ―を使いアバタ―で戦える
- 選択したスーツがそれぞれ3種類の必殺技を保有してこれを活用しなければ勝利しづらい
ファイターズアンケージの場合TPSの様な角度で操作キャラクターの顔は見えませんでした。パワーアップヒーローズはアバタ―の顔が見えます(ヘルメットもかぶれます)。スーツは多数ありますが、これらの基本攻撃はエネルギー弾と近接攻撃の2種類です。エネルギー弾を出すと必殺技を妨害でき、近接攻撃はエネルギー弾を無視して相手の懐に潜り込み攻撃できます。これらの出し方は手を前に出してパンチするとエネルギー弾、近接攻撃はキックするだけです。
さて、肝心の必殺技ですが、Kinectならではという事で、アニメや漫画で見てきたようなポーズをとれば出せます。カメハメ波、元気玉、抜刀術、鎖分銅の投げ引き付け、サッカーのシュートなどなど。最初は恥ずかしく感じるかもしれませんが、自宅でやる分には羽目を外せるのでかなり楽しく遊べます。もちろん1人ではなく複数人でも遊べるので友人・家族と遊ぶのに最適なゲームとも言えそうです。
Kinect持ちの方はプレイを検討してみてはいかがでしょうか。
- 出版社/メーカー: ユービーアイ ソフト
- 発売日: 2012/01/19
- メディア: Video Game
- この商品を含むブログ (5件) を見る
Windows Azureの商用サービスが開始して、2周年!!
素晴らしい!
まだ、2周年なのにサービスそのものは2年間、数か月毎にどどどーーーんっと拡充し続けて、でっかくでっかくなりました。
また、Azureイメージキャラクターのクラウディアさんが、マイクロソフト公式キャラクターとして登場し、Azureの快進撃は続きますね。2月のクラウディアカレンダーが、MR.Azureで大佐の異名をもつ砂金さんのBlogで公開されていますので、ぜひ!
個人的なAzureの思い出
Azureと関わり合いを持ち始めた経緯。
2009年11月ごろ ハンズオン受講
2010年1月 sqlazure.jpドメイン取得/MSに怒られると思ってました(ぇ
2011年1月 Microsoft MVP for SQL Azure 受賞
2012年1月 Microsoft MVP for SQL Azure 再受賞
共著執筆したAzure本が発売
退職
みたいな感じで、毎年1月にフラグを立てながら、Azureに関わってきました。
個人的なAzureへの感想
Azureを初めて、人生が変わりました。
次回の第 67 回 CLR/H 勉強会は 2 月 11 日土曜日に、開催予定です。都合の付く方は是非ご参加ください。
日時・場所その他
|
日時 |
|---|
2012/2/11 (土) 13:00 ~ 18:00(開場 13:00)
場所 |
マイクロソフト株式会社北海道支店 セミナールーム |
|---|
(札幌市中央区北5条西2丁目JRタワーオフィスプラザさっぽろ20F アクセスマップ)
|
参加費 |
|---|
500 円(会場費やお菓子代に使用させて頂きます)
|
懇親会参加費 |
|---|
勉強会後、懇親会を行う予定です。
| 内容 |
|---|
タイムテーブル(随時更新します)
| 時刻 | スピーカー | タイトル |
| 雪祭りWebスペシャルデイ | ||
| 13:00 | 開場 | |
| 13:30 | チャック | WebMatrix リリース一周年企画「WebMatrix登場の背景とASP.NET習得の最短経路を考察する」(仮) |
| 14:30 | 休憩(10分) | |
| 14:40 | @jsakamoto | jQuery Mobile + PHP + MySQL + WebMatrix + ExpressWeb で作成・公開する勉強会申し込みサイト |
| 15:40 | Lightning Talk & ハイパーおやつタイム | |
- (登壇者募集中)
ほか
| 16:20 | @shibayan | knockout.js(仮) |
| 16:50 | 休憩(10分) | |
| 17:00 | ジニアス平井 | 『スマートフォンサイト構築のノウハウ』〜 ジニアス、jQuery Mobileはじめました! 〜 |
| 18:00 | 後片付け | |
スピーカー紹介&セッション概要
【タイトル】
【概要】
【スピーカー】
【スピーカー紹介】
【タイトル】
【概要】
Web ページの "顔" は jQuery Mobile を利用して作成し、スマートフォン対応に!
そしてさらに、作成した勉強会申し込み Web アプリを、ホスティングサービス "ExpressWeb" 上へ配置してインターネットへ公開してみます。
※最後にはおまけとして Excel との組合わせ技も...!
各技術や手順のこまかい説明は端折ったり別のセッションに譲ったりセッション外でフォローしますが、実践レベルでの開発の流れを体感してください。
【対象】
- Web アプリ開発にご興味のある方
- すでに PHP を使って Web 開発をされているが、WebMatrix の実力がいかほどのものか気になる方
- Ruby や Java、ASP.NET などですでに Web 開発されているが、他のプラットフォームで作るとどうなるか気になる方
【スピーカー】
【スピーカー紹介】
PHP と MySQL は実は初心者(!)で、今回のセッションのために勉強しました。
【タイトル】
【概要】
【スピーカー】
【スピーカー紹介】
【タイトル】
【概要】
【スピーカー】
ジニアス平井
【スピーカー紹介】
|
|
下記申し込みフォームからどうぞ。 |
|---|
| Ustream 配信 | 下記URLで配信予定です。 |
http://www.ustream.tv/channel/<wbr />clr-h1
オンラインアンケート
| Web上からご回答頂けるオンラインアンケートはこちら(現在は、前回、第66回勉強会のアンケートのリンクです)。 |
無線LAN、電源
| セッション当日は会場にて無線LANアクセスポイントを設営し、参加者の皆様にご利用頂けるようにする予定です。 また電源も利用可能です。 |
過去の勉強会に関する全ての記録は、CLR/H 活動実績を御覧ください。
実は次回講師の松田君は中学校の同級生で幼馴染とも言える相手だったりします。会うのは10年以上ぶりなのでセキュリティの話は勿論色々面白い話をしたいなぁと思っていたり。以下、開催概要です。逆アセンブリとかバイナリ解析とか興味がある方はためらうことなく登録してみてください。
第10回北海道情報セキュリティ勉強会(せきゅぽろ)を以下のとおり開催いたします。
eagle0wl(いーぐるおうる)(https://twitter.com/#!/eagle0wl)
松田 和樹
ネットエージェント株式会社 研究開発部
共著として『クラッキングバイブル 新装版』『クラッカー・プログラム大全 新装版』(いずれもデータハウス刊)など。
競技ヨーヨーの全国大会を開催する『日本ヨーヨー連盟』(www.jyyf.org)の設立メンバーであり、2010年12月の社団法人化まで運営理事。毎年フロリダ州で開催される世界大会『World Yo-Yo Contest』で補助スタッフを務めたことがある。
「バイナリ解析」あるいは「リバースエンジニアリング」と呼ばれる技法は、情報セキュリティ技術を語る上で外すことのできないジャンルとして、ほぼ定着してきています。しかし、この技法をプロダクトやサービスとして重用できる局面は非常に限定されており、広く開放されているものとしてはCTF(Capture The Flag) を代表とするセキュリティコンテストぐらいのもので、なかなか習得する機会に恵まれないのが現状です。
| テーマ | バイナリ解析 |
| メインセッション | OSS/Java/.NETプログラマが意識すべきバイナリ解析の素養 |
| 日 付 | 2012年3月17日(土) |
| 時 間 | 13:30〜17:00 |
| 会 場 | 月寒公民館 3F 第3研修室 |
| 定 員 | 50名 |
| 参加費 | 社会人:1,000円(学生、未成年:500円) |
| 申し込み | http://tinyurl.com/7b3kas5 |
| 注 意 | ・ラフな服装での参加で構いません。 |
| 時 間 | 17:30〜19:30 |
| 会 場 | (未定) 会場等調整中 |
| 定 員 | 30名 |
| 参加費 | 社会人:3,500円(学生、未成年:3,000円) |
| 締 切 | 2012年3月13日(月) |
前回、Perlで組んだシステムの機能追加で、MySQLから抽出したデータ一覧のソート機能を実現しましたが・・・。さらに、今度は以下のようなことを頼まれました。
1.項目をクリックすればソートできることが、ユーザにわかりにくい。
2.行が増えたときにはページング処理ができるようにしてほしい。
3.列データの文字数が多い場合は、一定文字数で切ってほしい。
さすがに、自力では難しいと感じ、検索してみたら、いいものがありました。
TinyTable JavaScript Table Sorter
[Click here for the demo]をクリックすると、上記1と2が実現できることがわかりました。
[Click here to download the source code.]をクリックすると、ソースコードがダウンロードできます。
ダウンロードしたsorter.zipを解凍すると、
1.imagesフォルダ(この中に三角マークや矢印が入っています)
2.script.jsファイル
3.script.cssファイル
4.index.htmlファイル
5.packed.jsファイル
上記のうち、実際に必要なのは、1~3のフォルダ・ファイルです。
適用させたいページを、4のファイルを参考にしてカスタマイズします。
デザインの変更が必要な場合は、3のファイルを修正します。
私の場合は、以下のようにしました。
・tableタグに、id="table" class="sortable" を追加
・項目のtr、tdタグをthead、thタグに変更して、<thead><tr><th><h3>項目名</h3></th>に変更
あとは、script.cssファイルのwidth、font-size、paddingなどを調整しました。
これで、要望の1と2はできました。
あとは、要望3の列データの文字数が多い場合は、一定文字数で切ってほしい、ですが、
これは、substr関数で一定のバイト数だけ取り出し、その文字はリンクになっていたので、aタグに、title=(全文字列)とすることで、マウスオーバー時に、全文字が表示できるようになりました。
これにて、一件落着。
Windows Azure上で多くのインスタンスを使用している場合、特定インスタンスで発生した問題を調査する必要がでてくるかもしれません。
直接的な方法はありませんが、すべてのインスタンスかた特定インスタンスだけをオフライン化することができます。特定インスタンスでの問題を調査するために、最初にすることはロードバランサーのネットワークからインスタンスを外して、オフラインでトラブルシューティングをします。
Azureサービス管理ポータルでは、そのような機能は提供されていません。PowerShellとWindows Azureコマンドレットをコンピュートノード上で使うことで、ロードバランサーからインスタンスを除外できます。それを使用するために、Windows Azureアプリケーションにリモートログインします。
手順
- オフラインにしたい特定インスタンスにリモートログインします。
- 管理者権限でPowerShellを起動します。
- 次のコマンドを実行します。
Add-PSSnapIn Microsoft.WindowsAzure.ServiceRuntime - 「R」を選択します。
- 次のコマンドを実行します。
Set-RoleInstanceStatus –busy - オフラインモードを維持したい場合は、PowerShellのウィンドウを閉じないでください。ウィンドウを閉じると、インスタンスは再度アクティブになります。PowerShellウィンドウには次の画像のようなメッセージが表示されます。
- 2~5分程度で、特定インスタンスはオフラインになります。

Windows Azure管理ポータルでのステータスは次のようになります。

確認するために、オフラインにしたの同じインスタンス上でPSコマンドを実行します。
Get-RoleInstance –Curren

PowerShellウィンドウを閉じると、特定インスタンスは2~5分程度で再び、レスポンスを返すようになります。

元情報
この投稿は、Windows Azure Troubleshooting – Taking specific Windows Azure Instance offlineをざっくりと意訳した投稿です。
Perlで組んだシステムの機能追加で、MySQLから抽出したデータ一覧のソート機能の追加がほしい、と言われました。
PerlでMySQLからデータを抽出する際、SQL文に「ORDER BY フィールド名」を付ければ、もちろん可能ですけど、それではサーバに負荷がかかります。
こんな時は、抽出済みのデータの見せ方を変えるだけなので、当然クライアント側でJavaScriptを使って組むのが常道です。
理屈はわかっているのだけれど、では実際どうしたらいいかが解っていない自分に気が付きました。情けない。「基礎Perl」「JavaScript本格入門」「10日でおぼえるjQuery入門」は持っているので、復習します。
要は、<TABLE>タグで作った一覧表を、JavaScriptのDOM(Document Object Model)を使って、取り出して、ソートして、書き戻せばいいのですね。
そのためのJavaScriptをHTML内に記述してやればいいだけの話でした。
とほほさんのページが参考になりました。
ただ、私の場合は、<TD>タグの中に、<SPAN>タグや<A>タグが入っているので、そのままでは動かず、これをもとに試行錯誤中です。
結局、DOMの操作方法が問題なので、「XML辞典」も見ていますが、コーディングしながら、ここでどんなプロパティ・メソッドが使えるのか、インテリセンスの機能とか、オブジェクトブラウザ的な一覧とか、途中どのようなオブジェクトが取得できているのか、など開発環境がないと行き当たりばったりでかなり苦しいことがわかってきました。JavaScriptでは、AptanaやVisual Studioも使えるようで試してみようと思います。
とりあえず、Firefoxのアドオンである、Firebugを使ってDOMを参照しながら、いろいろやってみたところ、動くようになりました。
とほほさんのページ(http://www.tohoho-web.com/wwwxx038.htm)をベースにしましたが、以下のように修正しました。
getElementsByTagName(“*”) → getElementsByTagName(“TD”)
oTDs[nCol].firstChild.nodeValue → oTDs[nCol].innerHTML
[nColId].firstChild.nodeValue → [nColId].firstChild.firstChild.innerHTML
よかった、よかった。
「カレシ、カレシの元カノ、カレシの元カノの元カレ・・・」というちょっと怖い広告がかつてありました。
あの広告が警告していたエイズは怖い病気ですが、もし、もっと怖い、たとえば、潜伏期間は人それぞれ、発症前に治療すれば100%治るが、発症すれば3日で死ぬ、そんな性感染症が発見されたら、すぐに検査を受けたくなりますよね。でも、(未だ収束していない)福島原発事故発生当時のような、「パニックを恐れる」エリートパニックによって、その事実が市民に知らされたときにはもう手遅れ、ということは十分あり得ます。
患者にインタビューしながら感染経路を調べて・・・なんてことをしてもやはり手遅れになるでしょう。
そこで、Facebookを使えないかなあ、とか思うわけです。Facebookでは、ユーザが自分で編集できる基本データに「恋愛ステータス」なる項目があって、交際相手を自己申告できるようになっています。自分の友人の登録状況は、次のアプリで一覧表示できます。
表示させるには、交際ステータスへのアクセス許可が必要です。下のようなページが表示されたら、「インストール」をクリックしてください(http://www.facebook.com/settings/?tab=applicationsでアンインストールできます)。

私の友人たちの登録状況はこんな感じです。あまり登録していませんね(ウェブブラウザでなら友人以外の情報も見られるのですが、このアプリが利用しているAPIでは自分と友人の情報しか見られません)。

この交際相手、もちろん他人から見られるのは現在の相手だけですが、Facebookのサーバに、過去の相手が保存されていたら面白いですね(情報漏洩を恐れてちゃんと消しておくのが正しいポリシーでしょうが)。
最初に述べたような怖い病気が発生したときに、Facebookはその情報を公開するのだろうか、と思うのです。「公開する」と宣言すれば、人は将来の保険と思って登録するようになるでしょうか。「公開しない」と宣言すれば、情報漏洩を恐れる人も安心して登録するようになるでしょうか。あるいは逆の結果に?
「そういう病気が見つかって初めて過去の恋人たちを登録できるようなフォームが作られるだろうから今は何もしない」という人はまったく冷静ですばらしいです。そのペースで対応できる病気ならよいのですが。
