( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

「ぼくはこうしてプログラミングを覚えられなかった」

  • 大学は情報系だったけどサークルとバイトばかりやっていた
  • プログラミングが大好きだけど同じくらい好きなものが他にもあった
  • 人に自慢できるほどプログラミングに時間を費やしていなかった
  • 最初に就職した企業がいわゆるブラック企業と呼ばれるSIerだった
  • 新人研修で教えられたプログラミング言語Java
  • その会社では、同期入社が100人いたが、2年後には半分になっていた(俺も2年半で辞めた)
  • SIerでよくわからないレガシーシステムの機能追加なんぞをやっていて、そのシステムは(というか日本のエンタープライズ系の業務システムはほとんど)シンプルとはほど遠い設計だった
  • オレオレフレームワークを書いてドヤ顔キメていたことがある
  • 次に、ベンチャー企業(だったところ)に入ったが、コードは中国人が書いていて、管理ばかりやらされていた
  • プログラマ35歳定年説」とかよくわかない言説に踊らされて、プロジェクトマネージメントの道に一時期踏み込んでしまった
  • 今思い出すと死にたくなる黒歴史だが、「ITアーキテクト」と名乗っていたことがあった
  • 半年くらいニートをやったあと、フリーランスとして独立した
  • このころから勉強会行ったりブログ書いたりするようになった
  • いろいろなプログラミング言語に手を出したけど、深いところまで潜っていけたのはScalaくらい
  • なんだかんだあって、今もプログラミングを完全に覚えられてないけど、それでもプログラマとして何とかやってる

ᗅᐷᒷᐷᕕᐷᔹᐓᕀᐓᕶᐓᕌᐓ (謎言語ウキャス)

ᙐᐨᘍᐨ、ᓽᐓᔦᐓᓻᐓᓽᐓᓢᐓUnihanGridᔥᐓᗩᐯᔔᐓᓹᐓᘃᐹᔦᐓᓺᐓᓲᐓᔦᐓᓳᐓᓤᐓᓼᐓ、U+1400 ᓞᐓᔜᐓ U+16FF ᔑᐓᓺᐓᔁᐓᖯᐨᕻᐤᓟᐓᓕᐓᔑᐓᔝᐓᓾᐓᕂᐓᖏᐓᕾᐓᓺᐓᓗᐓᔠᐓᓗᐓᔠᐓᓻᐓᙀᐴᓛᐓᐦᐫᓾᐓᓰᐓᓙᐓᓾᐓᓽᐓᓶᐓᓲᐓᔁᐓᓺᐓᓬᐓ。


ᓦᐓᔁᐓᓕᐓᓲᐓᔝᐓᔁᐓblockᔂᐓ、'Unified Canadian Aboriginal Syllabics(ᒣᐲᖩᐡᔾᐓᕝᐓᕓᐓᕨᐠᗮᐟᒼᐫᘯᐼᕱᐱ)'ᓻᐓᓗᐓᓙᐓᔜᐓᓪᐓᓗᐓ。ᓽᐓᔦᐓᓞᐓᔕᐓᓙᐓᓗᐓᔠᐓᓗᐓᔠᐓᓻᐓᕒᐓᕱᐓᕼᐓᖆᐓᒈᐦᓪᐓᓹᐓᓹᐓᓕᐓᖏᐓᖏᐓᔕᐓᓙᐓᕷᐓᕬᐓᔺᐓᕱᐓᕋᐓᕷᐓᕬᐓᔺᐓᓶᐓᓹᐓᓕᐓᔃᐓᔃᐓᔃᐓᔃᐓᔃᐓᔃᐓᔃᐓᔃᐓ。


http://www.unicode.org/charts/PDF/U1400.pdf


ᓰᐓᓦᐓᓺᐓ、ᖚᐟᘵᐦᔁᐓᘍᐨᓕᐩᕕᐷᔥᐓᓦᐓᔁᐓ'Unified Canadian Aboriginal Syllabics'ᔁᐓᖯᐨᕻᐤᓾᐓᖬᐣᐃᐨᓪᐓᓲᐓ、ᗅᐷᒷᐷᕕᐷᔹᐓᕀᐓᕶᐓᕌᐓᓻᐓᓗᐓᓙᐓᔁᐓᔥᐓᒶᐳᓛᐓᓲᐓ。'Unified Canadian Aboriginal Syllabics'ᔁᐓᙩᐼᖯᐨᕻᐤUCASᓳᐓᓞᐓᔜᐓᔹᐓᕀᐓᕶᐓᕌᐓᓶᐓᓹᐓᖂᐓᕄᐓ。ᘦᐭᓾᐓᘵᐦᘔᐡᔂᐓᓽᐓᓗᐓ。


ᖬᐣᐃᐨᔂᐓ、Unicode Code Blockᔁᐓᓙᐓᓴᐓ、 "U+3040-309F Hiragana", "U+30A0-30FF Katakana","U+4E00-9FFF CJK Unified Ideographs"ᔁᐓᖯᐨᕻᐤᔁᐓcode pointᔥᐓ、'Unified Canadian Aboriginal Syllabics'ᔁᐓᖯᐨᕻᐤᖘᐨᓺᐓᓕᐓᔞᐓ639ᔥᐓᒝᐣᖘᐨᓻᐓᓬᐓᔞᐓ639ᗫᐹᖘᐨᖞᐶᔬᐮᓾᐓᖬᐣᐃᐨᓪᐓ、ᓰᐓᔟᐓᓱᐓᔟᐓᔁᐓᗪᐩᓾᐓᘢᐤᓪᐓᓹᐓ'0x1400'ᔥᐓᑁᐡᕈᐱᓪᐓᓹᐓ"Unified Canadian Aboriginal Syllabics"ᓾᐓᐓᐡᔝᐓᑹᐦᓹᐓᔜᐓᔟᐓᓲᐓcode pointᔁᐓᖯᐨᕻᐤᓾᐓᓬᐓᔞᐓ、ᓻᐓᓗᐓᓙᐓᑆᐷᙧᐠᓺᐓᖬᐣᐃᐨᓨᐓᔟᐓᔞᐓ。


ᓦᐓᔁᐓᖬᐣᐃᐨᔂᐓᖐᐡᖿᐹᓽᐓᔁᐓᓺᐓ、ᘍᐨᓕᐩᕕᐷᓞᐓᔜᐓᗅᐷᒷᐷᕕᐷᔹᐓᕀᐓᕶᐓᕌᐓᔋᐓᖬᐣᐃᐨᓨᐓᔟᐓᓲᐓᖯᐨᒑᐱᔂᐓ、ᔑᐓᓲᐓᘍᐨᓕᐩᕕᐷᓾᐓᓏᐦᕣᐠᓬᐓᔞᐓᓦᐓᓻᐓᓟᐓᓺᐓᓠᐓᔞᐓ。 ᓦᐓᔁᐓᖬᐣᐃᐨᔥᐓScalaᗃᐤᗻᐶᓪᐓᓲᐓᔁᐓᓟᐓᓦᐓᔟᐓ


https://gist.github.com/1079871


ᓦᐓᔁᐓᔻᐓᖆᐓᕛᐓᕽᐓᐞᐴᗲᐟᔕᐓ、ᓦᐓᔁᐓᗃᐤᗻᐶᓾᐓᔛᐓᔝᐓᗅᐷᒷᐷᕕᐷᔹᐓᕀᐓᕶᐓᕌᐓᓾᐓᖬᐣᐃᐨᓨᐓᔟᐓᓹᐓᓗᐓᔞᐓᓻᐓᓗᐓᓙᐓᔢᐓᓤᐓᓳᐓ。
ᒚᐷᕤᐷᓬᐓᔞᐓᓾᐓᔂᐓ、ᕨᐠᔁᐓGistᔥᐓscalacᓺᐓᕆᐓᖆᐓᕤᐓᔷᐓᕾᐓᓪᐓᓹᐓ'scala UCAS decode "ᕣᐠᓾᐓᓢᐧᓪᐓᓲᐓᓗᐓᖯᐨᒑᐱ"'ᓺᐓᓏᐦᕣᐠᓺᐓᓠᐓᔞᐓᔛᐓ。

どのプログラミング言語が『モテ』なのか「かわいい検索」を使って測定してみた

「どのプログラミング言語が『モテ』なのか?」という話題は、ついったーなどでよく見かけますが、未だに決着が着かない永遠の課題のように思えます。
その一因として、『モテ』というものを定量的に表す指標が存在しないことが挙げられるのではないでしょうか?


ところで、慶応義塾大学SFC(湘南藤沢キャンパス)の女子大生3人が かわいい検索 というサービスをリリースされたそうです。
"かわいい"という側面でブログを検索するサービスです。


これを見て、ふと思いました。


"かわいい検索"で該当数が多いプログラミング言語」 は、かわいいものが好きな女子にウケる → モテる言語


という仮説を。


ってことで、さっそく調べてみました*1 *2。そして、驚くべき結果が……!!


言語 合計 ゆるかわ キュート きれい おもしろ まじめ
C++ 3441 356 1042 892 544 607
Go 1528 216 505 328 152 327
PHP 737 115 126 102 59 335
RPG 160 0 127 22 10 1
Clean 17 8 3 5 1 0
Ruby 17 6 4 2 2 3
VB 11 3 1 5 1 1
Groovy 6 3 2 0 1 0
Java 4 2 0 1 0 1
Lua 4 2 1 1 0 0
Perl 3 0 0 0 0 3
JavaScript 3 0 0 0 1 2
Pascal 2 0 1 1 0 0
Python 2 0 0 0 0 2
Scheme 1 0 0 0 0 1
C言語 1 1 0 0 0 0
Delphi 1 0 0 0 1 0
Ada 1 0 1 0 0 0
Transact-SQL 0 0 0 0 0 0
Lisp 0 0 0 0 0 0
アセンブラ 0 0 0 0 0 0
F# 0 0 0 0 0 0
Erlang 0 0 0 0 0 0
OCaml 0 0 0 0 0 0
Clojure 0 0 0 0 0 0
Scala 0 0 0 0 0 0
PL/I 0 0 0 0 0 0
Haskell 0 0 0 0 0 0
Smalltalk 0 0 0 0 0 0
ActionScript 0 0 0 0 0 0
Objective-C 0 0 0 0 0 0
C# 0 0 0 0 0 0
D言語 0 0 0 0 0 0
Fortran 0 0 0 0 0 0
COBOL 0 0 0 0 0 0


なんと、一番「モテる言語」は"C++"でした!そして、その後に"Go", "PHP"が続きます。しかし、"C++"や"Go"は検索ワードとしてのユニークネスが低いことを考えると、「いちばんモテなのはPHPという結論になるのではないでしょうか?

*1:言語の一覧は[http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html:title]の20位までと、個人的にいくつか追加したものです

*2:測定に使ったスクリプトは[https://gist.github.com/1055682:title]

プログラミング言語「ほむほむ」

なんか、極めると「ほむほむ」だけで会話できるみたいですね?


俺はまだそこまでの域には至ってないんですが、「ほむほむ」だけでプログラミングできたらステキですよね?

そこで、ちょっと草植えときますね型言語 Grassを元にして以前作ったプログラミング言語「天使ちゃんマジ天使」とか 「ブブゼラ」をベースに、 またまたネタ言語を作りました。


Grassの文法と異なる点は以下のとおり。

  • wがほむ
  • スペース・タブにはさまれた"ほむ"がW
  • vは改行


wを出力するプログラム:

ほむ ほむほむ ほむほむほむほむ


xを出力するプログラム:

ほむ ほむほむほむ ほむほむほむほむ ほむほむほむ ほむ


"Hello, world!"を出力するプログラム

ほむ
ほむ ほむ ほむほむほむほむ ほむ ほむほむほむほむほむほむ ほむほむほむほむほむ ほむ ほむほむほむほむほむ ほむほむほむほむ
ほむほむほむほむ ほむほむほむ ほむほむ ほむ ほむほむ ほむほむほむほむほむほむ ほむほむほむほむ ほむ ほむほむ
ほむ ほむほむ ほむ ほむ ほむほむ
ほむほむ ほむほむ ほむ
ほむ ほむほむほむ ほむほむ ほむほむほむほむほむ ほむほむほむ ほむ ほむほむ ほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむ ほむ ほむほむほむほむ ほむ ほむほむほむほむほむ ほむ ほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむ ほむ ほむ ほむ ほむほむほむ ほむほむ ほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむ ほむほむ ほむほむほむほむほむほむ ほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむ ほむほむ ほむほむほむほむ ほむほむほむ ほむほむほむほむ ほむほむほむほむ ほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむ ほむほむほむ ほむほむ ほむ ほむほむほむ ほむ ほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむ ほむほむ ほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむ ほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ


ソースコードです。

import java.io.File
import scala.io.Source
import scala.util.matching.Regex
import scala.util.parsing.combinator._
import scala.util.parsing.input.{Position, NoPosition}

sealed abstract class Insn extends ( CED => CED ){
  val pos:Position
}
case class App( m:Int, n:Int, pos:Position ) extends Insn{
  override def apply( ced:CED ) = ced.e( m - 1 )( ced.e( n - 1 ), ced )
  override def toString = "App(%s,%s)".format(m, n)
}

case class Abs( m:Int, body:List[App] ,pos:Position ) extends Insn{
  override def apply( ced:CED ) =
    if( m == 1) CED( ced.c, Fn( body, ced.e ) :: ced.e, ced.d )
    else        CED( ced.c, Fn( Abs( m - 1, body, pos ) :: Nil, ced.e ) :: ced.e, ced.d )

  override def toString = "Abs(%s)".format(m)
}

case class CED( c:List[Insn], e:List[Value], d:List[CE] )
case class CE( c:List[Insn], e:List[Value] )

class GrassRuntime( val insn:List[Insn], val source:String){

  val e0 = Out :: Succ :: CharFn('w') :: In :: Nil
  val d0 = CE(Nil, Nil) :: CE( App(1, 1, NoPosition) :: Nil, Nil) :: Nil

  def run:Unit = {
    var c = eval( CED( insn, e0, d0 ) )
    while( c != None ){
      val Some(m) = c
      c = eval( m )
    }
  }

  def eval( ced:CED ) = ced.c match {
    case Nil => ced.d match {
      case Nil => None
      case x::xs  => Some( CED( x.c, ced.e.head:: x.e , xs ))
    }
    case code :: remains => Some( code( CED( remains, ced.e, ced.d )) )
  }
}

abstract class Value extends ( (Value, CED) => CED )

case class Fn(code : List[Insn], env : List[Value]) extends Value {
  override def apply( v:Value, ced:CED ) = CED( code , v :: env, CE( ced.c, ced.e ) :: ced.d )
  override def toString = "Fn"
}

case class CharFn(char : Char) extends Value {
  val ChurchTrue  = Fn( Abs( 1, App( 3, 2, NoPosition ) :: Nil, NoPosition ) :: Nil, Fn( Nil, Nil ) :: Nil )
  val ChurchFalse = Fn( Abs( 1, Nil,  NoPosition) :: Nil,  Nil)

  override def apply( v:Value, ced:CED ) = v match {
    case CharFn( c ) => CED( ced.c, ced.e ::: ( if( char == c ) ChurchTrue else ChurchFalse ) :: Nil, ced.d )
    case _ => throw new Exception("eval error value is not CharFn")
  }
  override def toString = "CharFn(%s, %s)".format( char , char.toInt)
}

object Succ extends Value {
  override def apply( v:Value, ced:CED ) = v match {
    case CharFn( c ) =>
      val char = ( (c + 1) % 256 ).toChar
      CED( ced.c, CharFn( char ) :: ced.e, ced.d )
    case _ => throw new Exception("eval error value is not CharFn")
  }
  override def toString = "Succ"
}

object Out extends Value {
  override def apply( v:Value, ced:CED ) = v match {
    case CharFn( c ) =>
      print(c)
      CED( ced.c, v :: ced.e, ced.d )
    case _ => throw new Exception("eval error value is not CharFn")
  }
  override def toString = "Out"
}
object In extends Value {
  override def apply( v:Value, ced:CED ) ={
    val c = readChar
    CED( ced.c, CharFn( c ) :: ced.e, ced.d )
  }
  override def toString = "In"
}

object Home2LangParser extends RegexParsers{
  import scala.util.parsing.input.CharSequenceReader._
  override def skipWhitespace = false

  val wToken = "ほむ".r
  val sep = """[ \t]""".r
  val fToken = rep1( sep ) ~> rep1(wToken) <~ rep1( sep ) ^^ { x => "W" * x.length }
  val vToken = """\n""".r

  def p(s:String):Parser[String] = s

  def wrap[A](p: Parser[A]) = Parser{r => Success(r.pos,  r)} ~ p

  def w :Parser[String] = rep( comment ) ~> wToken <~ rep( comment )
  def f :Parser[String] = rep( comment ) ~> fToken <~ rep( comment )
  def v :Parser[String] = rep( comment ) ~> vToken <~ rep( comment )
  val any :Parser[String] = elem("", _ != EofCh) ^^ { _.toString }

  def token   :Parser[String] = wToken ||| fToken ||| vToken
  def comment :Parser[String] = not( token ) <~ any ^^ ( (Unit) => "" )

  def app :Parser[App] = wrap(  f  ~ rep1( w ) ) ^^
    { case ~( p, x ~ y ) => App( x.size, y.size, p ) }

  def abs :Parser[Abs] = wrap( rep1( w ) ~ rep( app ) ~ rep(v) ) ^^
    { case ~( p, ws ~ body ~ vs ) => Abs( ws.size, body, p ) }

  def prog :Parser[List[Insn]] = rep( abs ) ~ rep( app ) ~ rep( v ) ^^
    { case a ~ p ~ v => a ::: p  }

  def parse( s:String ):Option[GrassRuntime] = parseAll( prog , s ) match {
    case Success( insn, _ )  =>  Some( new GrassRuntime( insn, s ) )
    case Failure( msg, _ ) => { println( msg ); None }
    case Error( msg, _ )   => { println( msg ); None }
  }
  def run( s:String ) = parse( s ) foreach{ _.run }

  def test( s:String ) = parse( s ) foreach{ r => dump( r.insn, 0 ) }

  def dump( x:List[Insn] , n:Int ):Unit = {
    val sp = (for( i <- 0 to n ) yield{ "  " } ).mkString
    x.foreach{ o => o match {
      case Abs( i,b,_ ) => {
        println( sp + "Abs( " + i + ")")
        dump( b , n + 1 )
      }
      case App( i,j,_) => println( sp + "App( " + i + ", " + j + " )")
    }}
  }
}

class GrassParser(
  wTokens:List[String],
  fTokens:List[String],
  vTokens:List[String]
)extends RegexParsers{
  import scala.util.parsing.input.CharSequenceReader._
  override def skipWhitespace = false

  def p(s:String):Parser[String] = s
  def make( tk:List[String] ) = ( p( tk.head ) /: tk.tail ){ _ ||| p( _ ) }

  def wrap[A](p: Parser[A]) = Parser{r => Success(r.pos,  r)} ~ p

  def w :Parser[String] = rep( comment ) ~> ( make( wTokens ) ) <~ rep( comment )
  def f :Parser[String] = rep( comment ) ~> ( make( fTokens ) ) <~ rep( comment )
  def v :Parser[String] = rep( comment ) ~> ( make( vTokens ) ) <~ rep( comment )
  val any :Parser[String] = elem("", _ != EofCh) ^^ { _.toString }

  def token   :Parser[String] = make( wTokens ) ||| make( fTokens ) ||| make( vTokens )
  def comment :Parser[String] = not( token ) <~ any ^^ ( (Unit) => "" )

  def app :Parser[App] = wrap( rep1( f ) ~ rep1( w ) ) ^^
    { case ~( p, x ~ y ) => App( x.size, y.size, p ) }

  def abs :Parser[Abs] = wrap( rep1( w ) ~ rep( app ) ~ rep(v) ) ^^
    { case ~( p, ws ~ body ~ vs ) => Abs( ws.size, body, p ) }

  def prog :Parser[List[Insn]] = rep( abs ) ~ rep( app ) ~ rep( v ) ^^
    { case a ~ p ~ v => a ::: p  }

  def parse( s:String ):Option[GrassRuntime] = parseAll( prog , s ) match {
    case Success( insn, _ )  =>  Some( new GrassRuntime( insn, s ) )
    case Failure( msg, _ ) => { println( msg ); None }
    case Error( msg, _ )   => { println( msg ); None }
  }
  def run( s:String ) = parse( s ) foreach{ _.run }

  def test( s:String ) = parse( s ) foreach{ r => dump( r.insn, 0 ) }

  def dump( x:List[Insn] , n:Int ):Unit = {
    val sp = (for( i <- 0 to n ) yield{ "  " } ).mkString
    x.foreach{ o => o match {
      case Abs( i,b,_ ) => {
        println( sp + "Abs( " + i + ")")
        dump( b , n + 1 )
      }
      case App( i,j,_) => println( sp + "App( " + i + ", " + j + " )")
    }}
  }
}

object Main{
  def main(args:Array[String]) = {

    println()
    println( "プログラミング言語 ほむほむ" )

    println("-" * 80)
    println( "print w" )
    val printW = "ほむ ほむほむ ほむほむほむほむ"

    println( "source code:")
    println( "  %s" format printW)
    println()
    println( "AST:")
    Home2LangParser.test( printW )
    println()
    println( "Result:")
    Home2LangParser.run( printW )
    println()

    println("-" * 80)
    println( "print x" )
    val printX ="ほむ ほむほむほむ ほむほむほむほむ ほむほむほむ ほむ"

    println( "source code:")
    println( "  %s" format printX)
    println()
    println( "AST:")
    Home2LangParser.test( printX )
    println()
    println( "Result:")
    Home2LangParser.run( printX )
    println()

    println("-" * 80)
    println( "Hello World" )
    val hw = Source.fromFile(new File( "./home2lang.grass" )).mkString

    println( "source code:")
    println( "  %s" format hw)
    // println()
    // println( "AST:")
    // Home2LangParser.test( printX )
    println()
    println( "Result:")
    Home2LangParser.run( hw)
    println()
    println("-" * 80)
  }
}

https://gist.github.com/1001863


実行結果

$ scala Main 

プログラミング言語 ほむほむ
--------------------------------------------------------------------------------
print w
source code:
  ほむ ほむほむ ほむほむほむほむ

AST:
  Abs( 1)
    App( 2, 4 )

Result:
w
--------------------------------------------------------------------------------
print x
source code:
  ほむ ほむほむほむ ほむほむほむほむ ほむほむほむ ほむ

AST:
  Abs( 1)
    App( 3, 4 )
    App( 3, 1 )

Result:
x
--------------------------------------------------------------------------------
Hello World
source code:
  ほむ
ほむ ほむ ほむほむほむほむ ほむ ほむほむほむほむほむほむ ほむほむほむほむほむ ほむ ほむほむほむほむほむ ほむほむほむほむ
ほむほむほむほむ ほむほむほむ ほむほむ ほむ ほむほむ ほむほむほむほむほむほむ ほむほむほむほむ ほむ ほむほむ
ほむ ほむほむ ほむ ほむ ほむほむ
ほむほむ ほむほむ ほむ
ほむ ほむほむほむ ほむほむ ほむほむほむほむほむ ほむほむほむ ほむ ほむほむ ほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむ ほむ ほむほむほむほむ ほむ ほむほむほむほむほむ ほむ ほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむ ほむ ほむ ほむ ほむほむほむ ほむほむ ほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむ ほむほむ ほむほむほむほむほむほむ ほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむ ほむほむ ほむほむほむほむ ほむほむほむ ほむほむほむほむ ほむほむほむほむ ほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむ ほむほむほむ ほむほむ ほむ ほむほむほむ ほむ ほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむ ほむほむ ほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむ ほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむ ほむほむほむほむほむほむほむほむ ほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ ほむほむほむほむほむほむ ほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむほむ


Result:
Hello, world!
--------------------------------------------------------------------------------


ほむほむ

当ブログのイメージキャラクターがエルシャダイにパクられた件について

なんかエルシャダイの新キャラが発表されましたね。

404 Not Found
『エルシャダイ』新キャラ、ロリ幼女のナンナちゃん公開!オタ層もカバーしたシャダイにもはや死角なし : はちま起稿


f:id:yuroyoro:20101021185205j:image
f:id:yuroyoro:20101021185204j:image


で、この幼女が乗っている生き物、どこかで見たような……。


ほら、背景画像をご覧ください。

f:id:yuroyoro:20101021185206p:image


「神は言っている。完全に一致している、と。」

ハイパーおちんちんタイム転送プロトコル Hyper Otintin Time Transfer Protocol (HOTTP/1.0)

HTTPの勉強として、ジョークRFCを書いてみました。


ネタは相当に頭が悪く、真摯にWebに対して向き合っている方々には本当に申し訳なく思っており、反省しています。


ただ、こういう仕様を考えることで色々と勉強になりました。URIスキームとステータスコードはHTTPで代用できるのですが、ネタとして面白いので拡張しました。いちおう、実装可能な仕様になっていると思います。

Network Working Group                                  Yuroyoro(T.Ozaki)
Request for Comments: xxxx                                 17 July 2010
Category: Informational


             ハイパーおちんちんタイム転送プロトコル
        Hyper Otintin Time Transfer Protocol (HOTTP/1.0)

このメモの位置づけ

   このメモはインターネットコミュニティに情報を提供する。インターネッ
   トの標準を規定するたぐいのものではない。このメモの配布は無制限であ
   る。

著作権の表示

   Copyright (C) yuroyoro - Tomohito Ozaki(2010). All Rights Reserved.

概要

   この文書は HOTTP/1.0について記述する。このプロトコルはURI(Uniform
   Resource Identifier)[RFC3986] によって表現されたリソースについて、
   そのリソースのハイパーおちんちんタイムの状態を取得・更新するための
   ものである。

1. 理論的根拠と適用範囲

   インターネットにおけるアプリケーション・サービスの進化にともない、
   特定のURIが示すリソースについての状態をHTTP/1.1[RFC2616]によって制
   御する需要が拡大している。

   このようなリソースに対しての制御は、REST(Representational State
   Transfer )によるものが一般的だが、この文書ではより特定のリソースの
   状態に特化した制御プロトコルについての提案を行うものである。

   具体的には、URI によって表現されるリソースがハイパーおちんちんタイ
   ムであるかを取得・更新するためのプロトコルとしてハイパーおちんちん
   タイム転送プロトコル(HOTTP/1.0 (Hyper Otintintime Transfer
   Protocol))をこの文書で規定した。

   現代(2010年)におけるインターネットでは、URI で表現されたリソースが
   特定個人を示す識別子(ID /identifier)である場合があり、リソースが個
   人であれば、ハイパーおちんちんタイムである・ないという状態を持つは
   ずである。
   よって、この状態モデルをクライアント・サーバー間で制御・転送するた
   めのプロトコルが必要となると予測される。






Yuroyoro                     Informational                      [Page 1]

RFC xxxx                       HOTTP/1.0                    17 July 2010


   HOTTP/1.0 では、リソースに対するハイパーおちんちんタイムに関する状
   態を取得・更新するためのあらゆる要求と返答を許す。HOTTP というプロ
   トコルの名前は、RESTにおける"リソースの状態を転送(transfer)する"と
   いう考えにもとづき、"制御(control)"ではなく"転送(tranfer)"を採用し
   たことによる。あと、スキームをなるべくHTTPに似た字面にしたかった、
   という理由もあるしむしろこっちが本音である。

   このプロトコルは、おそらく拡張もされないであろうし、将来の版が提案
   されることもない、はずだ。

2. HOTTP プロトコル

   HOTTP プロトコルは、いくつかの新しいステータスコードとヘッダフィー
   ルドを加え、既存のヘッダーフィールドの意味を置き換えて、HTTPの上に
   構築する。

   あらゆる HOTTP サーバーは、URIスキームを "hottp:" により参照する
   (Section 2.1.3)。または、URIスキームを"http:" とした場合は、リクエ
   ストヘッダーフィールドにOtintintime-version フィールドが設定された
   リクエストによって識別される。

   そのため、HTTP/1.1 におけるプロトコルパラメータ
   (RFC2616 (Section 3))のうちいくつかは、HOTTPにおいて修正される。

   また、HOTTP プロトコルにおけるリクエストメソッドは、HTTP/1.1により
   規定されるものの一部のみをサポートする(section 3.1)

   その他の規定についてはHTTP/1.1に準ずるものとする。

2.1 HOTTP のバージョン

   RFC2616(Section 3.1)において規定されるHTTPのバージョンは、HOTTP で
   はHTTP-Version フィールドに以下の形式で指定する。

      HTTP-Version   = "HOTTP" "/" 1*DIGIT "." 1*DIGIT

   実質的には、HOTTPリクエストにおいては"HOTTP/1.0"以外が指定されるこ
   とはないであろう。

   上記のリクエストラインの形式は、URIスキームが"hottp:" によって参照
   される場合であり、"http:"によって参照される場合はHTTP/1.1に準ずる。


2.2 Uniform Resource Identifiers

   HOTTP/1.0におけるURIは、特定の個人を意味し、ハイパーおちんちんタイ
   ムという状態を持つべきリソースを意味するが、プロトコル上でURI が特
   定個人に対する識別子であるかを指定しなくともよいし、サーバーは保証
   する必要はない。



Yuroyoro                     Informational                      [Page 2]

RFC xxxx                       HOTTP/1.0                    17 July 2010


2.3 HOTTP スキーム

   RFC2616(3.2.2 http URL )に示される"http" スキームは、HOTTPにおいて
   は"hottp"スキームとなる。従って、HOTTP URLは以下の構文で示される。

   hottp_URL = "hottp:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

   もしportが空かあるいは与えられていなければ、ポート番号として8421が
   仮定される。
   8421は、いにしえのポケベル打ちで"おちんちん"と入力した場合のキーの
   組み合わせである"お(15)ちん(4203)ちん(4203)"を加算したものである。

   URIスキームが"http:"により参照される場合はこの限りではなくHTTP/1.0
   に準ずるものである。


3 HOTTP のリクエストメソッドとレスポンス

   HOTTP サーバーは、リソースのハイパーおちんちんタイムについての制御
   要求をリクエストメソッドにより判断する。
   HOTTP において規定されるリクエストメソッドは、HTTP/1.1により規定さ
   れているOPTIONS/GET/HEAD/POST/PUT/DELETE/TRACE/CONNECTのうち、以下
   のものである。

          Method = "GET"                    ; Section 3.1
                   "POST"                   ; Section 3.2
                   "PUT"                    ; Section 3.3
                   "DELETE"                 ; Section 3.4

   上記以外のHTTP/1.1リクエストメソッドについて、HOTTP サーバーはその
   リクエストに対して 405(Method Not Allowed) を返すべきである。
   HTTP/1.1で規定されていないメソッドに対しては、HOTTP サーバーはレス
   ポンスとして 501(Not Implemented)を返すべきである。

3.1 GET メソッド

   HTTP では、GET メソッドは「リクエストURIで指定されるどんな情報でも
   (存在している形式で)検索する」という意味で使われるが、HOTTP におい
   てはリソースのハイパーおちんちんタイムの状態を返すものである。

   HOTTP GETリクエストは、基本的にはHTTP/1.1 GET リクエストと同じ形式
   である。例として以下を示す。

     GET /ozaki HOTTP/1.0
     Host : example.com
     Accept:text/html;q=0.9, text/plain;q=0.8, image/png, */*;q=0.5



Yuroyoro                     Informational                      [Page 3]

RFC xxxx                       HOTTP/1.0                    17 July 2010


   "http:"により参照される場合は、"Hottp-version"をヘッダーフィールド
   にHOTTPバージョン(section 2)を指定し、以下の形式となる。

     GET /ozaki HTTP/1.0
     Host : example.com
     Accept:text/html;q=0.9, text/plain;q=0.8, image/png, */*;q=0.5
     Hottp-version: HOTTP/1.0

   ステータスラインにおけるHTTP-versionフィールドは、リソースが参照さ
   れるURIスキームと一致する。"http:"URIスキームであれば"HTTP/1.0" で
   あり、"hottp:"URIスキームであれば"HOTTP/1.0"である。これはレスポン
   スステータスラインも同様である。

   HOTTP GET レスポンスは、新しく規定されたステータスコードにより、リ
   ソースがハイパーおちんちんタイムに突入しているかを設定する。リソー
   スがハイパーおちんちんタイムに突入している場合は 270
   (Yeahoooooooooooo!!!)が設定される。
   賢者モードの場合は 271 (Hu....)が設定される。

   HOTTPサーバーは、同様にリソースの状態を表すために、"Otintin-time"
   レスポンスヘッダーフィールドをレスポンスに含めるべきである。ハイパ
   ーおちんちんタイム突入中であれば"Hyper" が設定され、賢者モードであ
   れば"Wiseman" が設定される。値はステータスコードと一貫性をもって設
   定されなければならない。

     Otintin-time = ( "Hyper" | "Wiseman" )

   また、ハイパーおちんちんタイムに突入している場合には、メッセージボ
   ディにはテキストや画像などそのリソースのおちんちんタイムを表す内容
   がAcceptヘッダーフィールドに応じて設定されることがあるし、なにも設
   定されないこともある。例えば以下のようになる。

     HOTTP/1.1 270 Yeahoooooooooooo!!!
     Otintin-time: Hyper
     Date: Fri, 15 Jul 2010 17:22:53 JST
     Expires: Fri, 15 Jul 2010 18:00:00 JST
     Content-Type: text/html; charset=UTF-8

     <p>イヤッホオオオオオオォオオオオオオ!!</p>

   HOTTP レスポンスメッセージボディに設定される内容は、HTTP/1.1に準じ
   たコンテントネゴシエーションにより決定されるべきである。リソースが
   賢者モードの場合は、レスポンスメッセージボディになにも設定してはな
   らない。

   HOTTP レスポンスヘッダーフィールドでは、HTTP/1.1で規定されるヘッダ
   ーフィールドの意味を変更しているものがある。



Yuroyoro                     Informational                      [Page 4]

RFC xxxx                       HOTTP/1.0                    17 July 2010


   Dateレスポンスヘッダーフィールドは、そのリソースがハイパーおちんち
   んタイムに突入した時刻を示す。
   Expires レスポンスヘッダーフィールドは、そのリソースがハイパーおち
   んちんタイムを終了して賢者モードになる予定の時刻を示す。


3.2 POST メソッド

   POST メソッドは、URIによって表現されるリソースの生成を指示する。

   リクエストは、Otintin-timeヘッダーフィールドにより、生成されたあと
   のリソースがハイパーおちんちんタイムであるか指定することができる。
   Otintin-time ヘッダーフィールドが省略された場合は、"Wiseman"が設定
   されているものと見なされる。"Hyper" が設定されている場合は、ヘッダ
   ーフィールドにWiseman-dateヘッダーフィールドを指定することにより、
   ハイパーおちんちんタイムが終了する日時を示す必要がある。

     Wiseman-date = "Wiseman-date" ":" HTTP-date

   またリクエストメッセージボディには、リソースのハイパーおちんちんタ
   イムを表す内容を含めることができる。HOTTPサーバーは、POST/PUT メソ
   ッドで送信されたメッセージボディの内容を以降のGET リクエストに対す
   るメッセージボディに設定しなければならない。

   HOTTP サーバーは、リソースのハイパーおちんちんタイムを表す内容とし
   て、Content-type毎にPOST/PUTメソッドで送信されたメッセージボディの
   内容を複数保持する。
   保持する内容は、PUT リクエストを受信するたびにContent-type毎に追加
   される。

   つまり、最初のPOSTメソッドでContent-type: text/plan であるメッセー
   ジボディが送信され、次にPUTメソッドでContent-type: image/jpgである
   メッセージボディを受け取り、三番目のPUT でContent-type:text を受け
   取った場合は、HOTTP サーバーはAccept: text/* のGETリクエストに対し
   て最初か三番目のPUT リクエストで受け取った内容を返さねばならない。
   このときに、最初から三番目かどちらの内容を返すかはHOTTP サーバーが
   任意に選択してよいし、本文書ではその方式を規定しない( ランダムに返
   すか、ローテーションして返すか、など)。そして、Accept:image/* に対
   しては二番目のPUTメソッドで受け取った内容を返さなければならない。
   HOTTP サーバーが対応するContent-typeを保持していない場合は、単純に
   なにもメッセージボディを返す必要は無い。

   リクエストメッセージボディの内容には、"multipart/form-data" タイプ
   を許可するが、それ以外のマルチパートタイプは許可しない。







Yuroyoro                     Informational                      [Page 5]

RFC xxxx                       HOTTP/1.0                    17 July 2010


   HOTTP サーバーは、リクエストメッセージボディが省略された場合に、そ
   のリソースのハイパーおちんちんタイム状態を表す初期状態を複数設定し
   てよい。たとえば、以下のようにいかにもハイパーおちんちんタイムであ
   るような文字列を初期状態として持つことが望ましい。

     Content-type: text/plain

        ::| |l´ ̄ ̄ ̄`l
        ::| ||¶     |
        ::| ||______|
        ::| |┌─‐l'l ̄|  おちんちんランド開園だよー
        ::| | |二 /⌒ヽ
        ::| | |д(ω^ )
        ::| | 〔: 〕と  ヽ
        └┴[__]‐し―J

         _____
        ::| |l´ ̄ ̄ ̄`l
        ::| ||¶     |
        ::| ||______|
        ::| |┌──..l´ll  乗り込めー
        ::| | | ⌒ヽ | |¶
        ::| | |(^/⌒`| ||   д д
        ::| | |_(__|д .д〔д〔: 〕
        └┴‐――‐〔: 〕〔: д: 〕__]
                [__] [_〔: 〕]
         _____    [__]
        ::| |l´ ̄ ̄ ̄`l
        ::| ||¶     |
        ::| ||______|
        ::| |l´ ̄ ̄ ̄`l パタン…
        ::| ||¶     |
        ::| ||      .|    д д
        ::| ||_____д .д〔д〔: 〕
        └┴‐――‐.〔: 〕〔 ゚д゚ 〕__]
                .[__] [_〔: 〕]
                   [__]


   ハイパーおちんちんタイムを表現する望ましい内容については、下記を参
   照するとよい。

     http://slpy.blog65.fc2.com/blog-entry-1570.html

   POSTリクエストに対するレスポンスは、ハイパーおちんちんタイムに突入
   できた場合は 272 (Otintin Land Has Opened)を返す。POSTリクエストを
   受信した時点ですでにリソースが生成されているならば、 471 (Otintin
   Conflict)を返し、リソースの状態を更新してはならない。

Yuroyoro                     Informational                      [Page 6]

RFC xxxx                       HOTTP/1.0                    17 July 2010


   POSTメソッドは、PUT/DELETEメソッドを発行できないクライアントを考慮
   しPUT/DELETEメソッドの代わりに利用することができる。そのため、POST
   リクエストには、新しくHOTTPで規定されたOtintin-commandヘッダーフィ
   ールドにより、PUT またはDELETEのどちらかのメソッドの代わりであるか
   を示すことができる。

     Otintin-command = ( "PUT" | "DELETE" )

   Otintin-command が省略された場合は、上述のPOSTメソッドであると解釈
   される。

3.3 PUT メソッド

   PUT メソッドはURI で示されるリソースがハイパーおちんちんタイムを開
   始することを要求する。または、リソースが保持するハイパーおちんちん
   タイム突入中を表す内容の更新を指示する。

   PUT リクエストは、ヘッダーフィールドにWiseman-dateヘッダーフィール
   ドを指定することにより、ハイパーおちんちんタイムが終了する日時の更
   新を指示することができる。

   リクエストメッセージボディには、リソースのハイパーおちんちんタイム
   状態を表す内容を設定することができる。HOTTP サーバーが、すでに対応
   するContent-typeの内容を保持している場合はその内容を更新する。

   PUT リクエストメッセージボディの内容も、POSTリクエストメッセージボ
   ディと同様に"multipart/form-data" タイプを許可するが、それ以外のマ
   ルチパートタイプは許可しない。"multipart/form-data" タイプを送信さ
   れた場合は、対応するContent-typeが無ければ追加し、保持していれば更
   新するようにしなければならない。

   PUT リクエストをサーバーが受け取った時点ですでにハイパーおちんちん
   タイムが開始されている場合は、Wiseman-Dateヘッダーフィールドの内容
   でリソースが賢者タイムにもどる時刻を更新しなければならない。

   また、レスポンスヘッダーフィールドには、Otintin-timeヘッダーフィー
   ルド、DateヘッダーフィールドおよびExpires ヘッダーフィールドを含む
   べきである。

   レスポンスメッセージボディには、そのリソースがハイパーおちんちんタ
   イムに突入したことを示す内容を含んでもよい。GET リクエストに対する
   メッセージボディと同じ内容を設定することもできる。

3.4 DELETE メソッド

   DELETE メソッドにより、URIで示されるリソースがハイパーおちんちんタ
   イムを終了して賢者タイムに戻ることを要求する。または、リソースに紐
   付けされているのハイパーおちんちんタイムの状態を表す内容の削除を要
   求する。


Yuroyoro                     Informational                      [Page 7]

RFC xxxx                       HOTTP/1.0                    17 July 2010


   DELETEメソッドのメッセージボディが設定されていない場合、リソースは
   ハイパーおちんちんタイムは終了し、賢者モードに入る。この場合は、レ
   スポンスとして273 (Otintin Land Has Closed)を返す。ただしDELETE メ
   ソッドを受け取った時点で賢者モードならば、レスポンスとして204 (No
    Content)を返す。

   DELETEメソッドにメッセージボディが設定されている場合は、保持してい
   るハイパーおちんちんタイムの状態をあらわす内容から、メッセージボデ
   ィに一致するものを削除する。対応するリソースが存在し削除された場合
   は270 (Yeahoooooooooooo!!!)を返し、一致するものがない場合は204 (No
   Content)が返される。

4 追加されたステータスコード

   HOTTP/1.0 におけるステータスコードは、リソースのハイパーおちんちん
   タイム状態と制御に対する結果を表す。よって、HTTP/1.1にいくつかの拡
   張を行っている。

4.1 270 Yeahoooooooooooo!!! (イヤッホホホホッホオオオオオオオオオ!!)

   リソースがハイパーおちんちんタイム突入中である場合に戻される。

4.2 271 Hu.... (ふぅ…。)

   リソースが賢者モードである場合に戻される。

4.3 272 Otintin Land Has Opened (おちんちんランド開園だよー)

   リソースがハイパーおちんちんタイムに突入できた場合に返される。

4.4 273 Otintin Land Has Closed(おちんちんラン閉園だお)

   DELETEメソッドによりリソースが賢者モードにもどった場合に返される。

4.5 470 Bad Otintin Time (おちんちんタイム終わってるよ)

   POST/PUTリクエストで指定されたOtintin-timeフィールドの時刻が過去
   の時刻を指定している場合に返される。

4.7 471 Otintin Conflict (おちんちんバトル)

   POSTリクエストにより生成を指示されたリソースがすでに生成されてい
   る場合にかえされる。

4.8 472 Otintin Time Required (おちんちんタイム教えて)

  POSTリクエストにOtintin-time フィールドが含まれていない場合、または
  HTTP-date形式に準じない時刻が指定された場合に返される。





Yuroyoro                     Informational                      [Page 8]

RFC xxxx                       HOTTP/1.0                    17 July 2010


4.9 473 Otintin Time Too Long (そんなに長い時間おちんちんできないお)

  HOTTPサーバーが、対象のリソースが指定されたOtintin-timeまで耐えるこ
  とができないと判断した場合に返される。

4.10 474 Otintin Not Found (おちんちんついてないお…)

  URIで指定されたリソースが存在しない、またはおちんちんがついていない
  場合に設定される。


5. 謝辞

   こんなネタにつきあってくれた全ての人へ、深く感謝します。

6. 参考文献

   [RFC2068] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., and T.
   Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2068,
   January 1997.

   [RFC3986] T.Berners-Lee, R.Fielding, L. Masinter, "Uniform Resource
   Identifier (URI): Generic Syntax" RFC 3986,  January 2005.

   [RFC2186] Wessels, D., and K. Claffy, "Internet Cache Protocol (ICP),
   version 2," RFC 2186, September 1997

10. 著者の連絡先

   yuroyoro (Tomohito Ozaki)
   EMail: ozaki@yuroyoro.com





















Ozaki                         Informational                      [Page 9]

RFC xxxx                       HOTTP/1.0                     17 July 2010


6.  著作権について

   Copyright (C) yuroyoro - Tomohito Ozaki(2010). All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   Japanese.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
























Ozaki                         Informational                     [Page 10]

ハイパーおちんちんタイム転送プロトコル Hyper Otintin Time Transfer Protocol (HOTTP/1.0)

プログラミング言語の超能力度

超能力者(レベル5)
単独でGoogleと戦える程の力
大能力者(レベル4)
プロジェクトにおいて戦術的価値を得られる程のニンジャ力
強能力者(レベル3)
日常業務において活用可能で、便利に使われてしまう力
異能力者(レベル2)
低能力者(レベル1)とほとんど変わらない程度の力
低能力者(レベル1)
Hello,Worldを出力できる程度の業務ではなんの役にも立たない力
無能力者(レベル0)
測定不能や意味の分からないコードを書いたりする迷惑な力

(via wikipedia:とある魔術の禁書目録 )


ちなみに俺は、リファレンス(オンライン含む)が無いとどの言語も書けない異能力者(レベル2)です…。


元ネタ:

プログラミングスキル/経験が分かる資料(形式自由)
プログラミング言語経験を列挙する場合、以下の指標を資料内に併記してください
付記例) Perl (5), Python (4), C (3), C++ (2)

レベル5
マスターレベル。拡張ライブラリを記述できるだけでなく、言語の内部仕様、処理系の実装等についても明るい
レベル4
問題なく日常的に利用できるレベル。言語を使うだけでなく、その言語のライブラリを作ったり、フレームワークを作ることもできる
レベル3
リファレンスがなくても任意の処理が記述できるレベル
レベル2
リファレンス本があれば利用できるレベル
レベル1
授業などで触れたことがある程度。日常的に利用できるわけではない
http://www.hatena.ne.jp/company/intern2010/


マジメな話はこちらで。
プログラミング言語の習熟度 - Life like a clown