MySQLのNOW()

・NOW()

関数が文字列で使用されているか、または数値コンテキストで使用されているかによって、現在の日付を 'YYYY-MM-DDHH:MM:SS' または YYYYMMDDHHMMSS.uuuuuu フォーマットの値で返します。値は現在の時間帯で表現されています。

mysql> SELECT NOW(); -> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0; -> 20071215235026.000000

MySQL :: MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) :: 7.6 日付時刻関数

後者をふと目にする機会があったのでメモ。
しかし後者の使い方は、場合によってはトラブルのもとになりそうだし(23時台に+10000すると、24時~分となって不正な日付の値になったり)、素直に日付演算用の関数を使おう。

P4G買った

惰性でのDiablo3プレイが生活リズム的にまずいことになっているので、Diablo3を始めることでLoL漬けの生活から脱したのと同じように、別ゲーをもって今の状態から脱却しようと試みた結果、ペルソナ4を買っていた。

毒をもって毒を制す?

とりあえずメガネゲーというくらいしか前提知識はないが、周囲の評価を聞いているとわりとよさげなのでゆるゆるプレイしていきます。

第2回足立フレンドリーマラソンでハーフ走ってきたー

第2回 足立フレンドリーマラソン にて、ハーフマラソンの部に参加してきました。
せっかくなので感想なりなんなり箇条書きしてみます。

  • 走る前
    • ハーフマラソンを走るのは5回目。
    • 大学生時代に京都シティハーフマラソンに3回ほど参加。(今はリメイクされて京都マラソンになっている)
      • このころのタイムは1時間40分台。大学の友だちと一緒に出てた。
      • 若さってすごい。
    • 去年は守谷シティハーフマラソンに参加。
      • この時は確か2時間20分くらい?終盤の向かい風が寒かった記憶。あとチョコもらったけど口のなかぱさぱさになったよ!
    • 事前の練習としては、ジムで30分ほど走ったくらい。
  • 走ってる時
    • コースは荒川沿いに10km下って、折り返して戻ってくる、というものだった。
    • 風が結構強くて、行きは走ってる時でも背中で風を感じれるくらい追い風。
    • 折り返してからは、足の疲労とあいまって、超絶つらい向かい風だった。進まないw
    • 残り5kmくらいからは、夜に予定してた馬肉を食べる会のことばかり考えていた。とにかく足が痛くなってきてたので意識を外へ。
    • 「がんばれー」という声援をうけると走る速度が2秒間ほどUPする。すぐ戻る。
    • 道路脇で見ている幼女とハイタッチできた。ハイタッチもスピードが一時的に上がる効果が見込まれる。
  • 走り終えて
    • タイムは2時間15分。多分行きが1時間切るくらいで、戻りでだいぶペースダウン。練習不足と向かい風。
    • コースが川沿いということもあって、幅もままあり走り易かった。
    • コース途中に時計の類はないので、自分のように時計持っていないにわかランナーにとっては、時間が全くわからなくて、別に困りはしなかったけどもあるとよいなと思った。せめて折り返しあたりに。
    • 練習不足により、足の裏と付け根にまずガタが来た。
      • 普段は通勤やおでかけ時に自転車を漕ぐくらいなので、心肺はわりと大丈夫だった。かわりに足の裏がやわいまま。
      • 24日現在絶賛筋肉痛。
    • 参加時にもらったパンフに銭湯の紹介がのっており、ゼッケンをみせると特別価格とのことだったので帰りに行きたかったが、場所が遠そうだったのであきらめた。
    • コースの最寄り駅は北千住で、自分が住んでるところから電車で20分ほどで、とても近かった。
      • 千葉や埼玉等の大会は、移動に時間がかかるため早起きがつらい。今回のような近場の大会があったらまた出たい。

サイ本要約 16章「CSSとDHTML」

ブラウザの開発ツールなりで実際にstyleいろいろいじると理解が深まりんぐ。
特に位置指定まわりはやってみると感覚としてわかります。
Chrome使ってる人なら Ctrl+Shift+I をッターン!しましょう!
あとこのへんの基本をさらった上で、jQuery使って楽しましょう。
jQuerycss操作系メソッドのコード読んだりするのもいいかも。

CSSの概要

記述方法

  • セレクタ { 属性: 値; 属性: 値;属性: 値;・・・} というおなじみ(?)の記述方法。

//タグ指定
p { font-weight: bold; color: blue; text-decoration: underline; }
//クラス指定
.bold { font-weight: bold; }
//id指定
#hoge { margin: 3px; }
//組み合わせ: errorクラスをもつdiv要素
div.error

//スペースをはさむと、子孫要素を指定できる。
//div要素内のp要素
div p { 〜〜〜 }

  • どんな属性、値があるかについてはググッてリファレンスみてください。
  • 親要素から値を継承できる、"inherit"という値がある。
  • よく使われると思われるものにはショートカット属性が存在する。
    • font, margin, padding, border など。


要素への適用方法

  • 要素の"style"属性で指定。

<div style="letter-spacing: 0px; line-height: 1.4;">
    hogehoge
</div>

  • スタイルシート内に記述。
    • htmlの構造と表示を分けるという観点からは、こちらが推奨される。

スタイルシートの記述方法

  • 内に直接記述。

<head>
    .
    .
    <style type="text/css">
        body { --- }
        p { --- }
    </style>
</head>

  • 外部ファイルから読み込む。

<head>
    .
    .
    <link rel="stylesheet" href="hoge.css" type="text/css">
</head>


スタイルルールの優先順位

  • 基本的な考え方としては、適用範囲が狭いものほど強い。
  • スタイルシートの優先順位(同じ属性が指定されている場合は左側が優先される)
    • 要素 > ページ > ユーザ > ブラウザ
    • 例外、ユーザスタイルシートにimportが含まれている場合
  • 同じ要素に対して、複数の方法で指定された場合の優先順位
    • id > クラス > 入れ子タグ(例: div p {~~} の p) > タグ


◆インラインスタイルの制御

属性値の取得、設定

  • 要素を参照するオブジェクトの、styleプロパティから取得、設定できる。
  • styleプロパティから取得、設定できるのは、インラインスタイルで指定したもののみ。
  • styleプロパティから取得、設定できるのは、インラインスタイルで指定したもののみ。(大事なことなので2回言いました)
    • なので、スタイルシートで指定した属性情報は取得できない。
    • 取得したい場合はwindow.getComputedStyleを利用する。(後述)
  • 取得結果の値は文字列。
    • "width", "margin-top" などは、単位も含めて文字列として返されるので注意。
    • 設定時も、単位(px等)を含めた文字列で指定すること。

//要素取得
var hoge = document.getElementById("hoge");
//属性値の取得
var width = hoge.style.width;
//属性値の設定
hoge.style.backgroundColor = "red";

//幅の取得値は単位を含めた文字列
var width = hoge.style.width; // "150px" など
//幅を倍にする場合はparseInt()などを使う
var newWidth = parseInt(width) * 2;
hoge.style.width = newWidth + "px";

//ダメな例(数値と解釈されない文字列に数値をかけた結果はNaNになる)
hoge.style.width = hoge.style.width * 2; 

  • "margin", "font" などのショートカット属性も取得、設定できる。

//要素取得
var fuga = document.getElementById("fuga");

//属性値の取得
var margin = fuga.style.margin; //インラインで指定されていれば、"10px 5px" などと返ってくる。

//属性値の設定
hoge.style.margin = "5px 10px 15px 20px";
hoge.style.padding = "5px 10px"; //上下5px、左右10pxの指定となるのはスタイルシート記述時と同じ



命名規則に関する注意

  • ハイフンを含む属性名の場合は、ハイフン後の最初の文字を大文字にする。

//ダメ
element.style.font-size
//OK
element.style.fontSize
element.style["fontSize"]
element.style["font-size"] //chromeだといけた。全ブラウザで可能かはわからない。

  • "float"はjavascript予約語なのでこれもそのままは使えない。
  • 代わりに"cssFloat"を使用する。

//ダメ
element.style.float
//OK
element.style.cssFloat


CSSによる位置指定

よく使い(そうな)位置指定いろいろ

  • position属性で方式を指定し、left,top(right,bottom)で位置を指定する。
  • 実際に書いてみて表示の変化を見るとイメージがつかみやすいので、ブラウザから適当なページのCSSいじって遊んでみましょう。
    • static(デフォルト)
      • 特になにも。
    • absolute
      • 絶対位置指定。
      • デフォルトでは、他の位置指定されている要素に入れ子にされている場合はその要素、に対しての相対位置を指定。

//<body>要素の左端から10pxの位置にdiv要素の左端がくる。
<div style="position: absolute; left: 10px;">
    hoge
</div>

    • relative
      • 通常(static)の配置結果に対する相対位置指定。
      • static指定時の場合に要素に割り当てられたスペースはそのまま残る。

//positionを指定しない場合(static)と比べて、右に10px、下に10px移動した位置に表示される。
<div style="position: relative; left: 10px; top: 10px;">
    fuga
</div>

    • fixed
      • ブラウザウインドウに対する位置指定。
      • スクロールに影響を受けずに同じ位置に表示させられるので、メニューバーやらによく使われる。

//常に表示ウインドウの上部に表示される。
<div style="position: fixed; left: 0px; top: 0px; width: 100%;">
    fuga
</div>


◆その他

スタイルシートオブジェクト

  • document.styleSheets でCSSStyleSheetオブジェクトの配列が取得できる。
    • CSSStyleSheetオブジェクトはCSSRuleオブジェクトの配列をもつ。
      • CSSRuleオブジェクトには、selectorText, styleの2つのプロパティがある。
  • ぶっちゃけ使いどころがあんまりわかってない。

//最初のスタイルシートオブジェクトの、CSSRuleオブジェクトの配列が取得。
var rules = document.styleSheets[0].cssRules

for (var i = 0; i < rules.length; i++) {
	var rule = rules[i];
	//@import はスキップ
	if (!rule.selectorText) continue;
	//ruleText は、例えば次のような文字列になる
	//"div{font-size: 10px;width: 100px;}";
	var ruleText = rule.selectorText + "{" + rule.style.cssText + "}";
	//marginの値を2倍に変えてみる
	var margin = paseInt(rule.style.margin);
	if (margin) {
	    rule.style.margin = (margin * 2) + "px";
	}
}

  • スタイルシート内の既存ルールを読みだしたり変更したりするだけでなく、追加、削除までできる。
    • insertRule(), deleteRule()
      • ※ただしIEは(ry
      • IEは addRule(), removeRule()
      • 試してみたら、IE9からinsertRule(), deleteRule()も使えた。IE8だとダメだった。まだしばらくはIEは別で書かなきゃならなそう。

算出スタイル(computed style)

  • 実際にその要素に適用されているスタイルを取得したい場合、W3C標準のAPIが利用できる。
    • ※ただしIE以外に限る。
      • IEはcurrentStyleというのがある。
    • window.getComputedStyle({要素}, {CSS擬似要素});(IE以外)
      • CSS擬似要素は引数として省略できないので、基本的にnullを指定する。詳細を知りたい場合はググりましょう。
    • 取得はできるが、設定の書き換えはできない。あくまで値を取得できるだけ。

//最初のp要素取得
var p = document.getElementByTagName("p")[0];
//p要素の算出スタイルを取得
var style;
if (p.currentStyle) {  //IE用
    style = p.currentStyle;
}
else {
    style = window.getComputedStyle(p, null);
}

//  -> style.width, style.fontFamily などで適用されているスタイル情報が取得できる。

//windowはグローバルオブジェクトなので、getComputedStyleはそのまま呼べる。
style = getComputedStyle(p, null);

Scala で HTTP POST やろうとしてハマったメモ

はてなグラフAPIを利用するモジュールをScalaで書いてる時に、HTTP POST 周りでちょっとハマったのでメモ。
HTTPライブラリとしてはこちらを利用しました。
Apache HttpComponents - Apache HttpComponents


さて、どこではまったかというと、POSTパラメータのセット。
Javadocやら見てると、それらしいメソッドがあるのでてっきり次のようにして出来るかと思ったら、パラメータ(以下の例だと"value")がセットされていなかった。

  • ダメ

//HttpParams にパラメータセット
val params = new BasicHttpParams
params.setParameter("value", value)
//HttpPost を用意し、パラメータをセット
val post = new HttpPost("http://hoge.com/fuga/")
post.setParams(params)
//実行
val client = new DefaultHttpClient
val response = client.execute(post)


あれこれ試行錯誤した結果、次のやり方でよいということになった。

  • イケル

//NameValuePair のArrayList を用意して、
//そこに BasicNameValuePair を追加していく
val params: java.util.List[NameValuePair] = new ArrayList()
params.add(new BasicNameValuePair("value",value))
//HttpPost を用意し、パラメータをセット
val post = new HttpPost("http://hoge.com/fuga/")
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8))
//実行
val client = new DefaultHttpClient
val response = client.execute(post)


参考にしたのがJavaのサンプルなので、もっとScalaっぽい書き方ができるのかもしれない。
単純に移植するだけでもJavaに比べて記述がわりと簡潔になるもんだなーという感想。


前者の手法のほうがすっきりするので、なんとかできないかとがんばってはみたものの、結局解決には至らず。
setParameterとはいったい・・・うごごご・・・。


(参考)
HttpClient 4.0-beta2を使う POST編 - Javaと情熱のあいだ
AndroidでPOST通信 | 5ive.blog

delete last line

今日はこいつ。

標準入力から渡されるもののうち、最終行以外を出力するというもの。
readLineで行ごとに受け取るなら、最終行かを判別するために、前行を保持しておいて〜とかする必要がありそうなので、まずはio.Source.stdin使って全体とって最終行をなにかしらで省く方法でいってみます。

とりあえずまず最初に通るものを。

  • 53bytes

io.Source.stdin.getLines.toList.init.foreach(println)


io.Source.stdin.getLines で全入力を行単位の Iterator[String] にして、toListして、initで末尾(ここでは最後の行の文字列)を取り除いて、出力。
やってることは素直なので、わかりやすいけど若干長い。


同じような感じでもう1つ。最終行末尾には改行コードが入らないので、改行コードでsplitして最後の要素を省いて出力。
まあ伸びたけどw

  • 58bytes

(io.Source.stdin.mkString split"\n").init.foreach(println)


readLine使ったパターンの方が短くなりそうだけど、ちょっと今酔ってるので、寝て起きたら考えます。

even lines

今日はこれ。
anarchy golf - even lines

標準入力から渡されるもののうち、偶数行目だけを出力するというもの。
しばらくは、なんとかline(s)系の軽めなのを続けていこうかと。
継続はなんとやら。


まず何も考えずに書いたのが以下。

  • 40bytes

while(0<1){readLine;println(readLine.r)}


1ループ内でreadLineを2回呼んで、2回目のみ出力すればいいよね、というもの。
.r は例によって、例外投げてタイムアウトを予防するためのものです。


while(0<1){〜〜} は def f{〜〜;f};f に書き換えると1bytes減るけど、まだあわてるような時間じゃない。
というか、できることなら{}なしで、while(〜)println(〜) とか書きたい。

今回の場合なら、奇数行を読むreadLineは投げ捨てているので、そこをうまくwhileの条件に指定できないかな〜とPredefのreadHoge を眺めてたら、readBooleanなるものが。
ということで次。

  • 38bytes

while(!readBoolean)println(readLine.r)


readBooleanは、REPLで試してみたところ"t" or "true" の場合に true、それ以外は false を返す模様。
なので↑のコードは、"true"なんて行があったりするとそこで止まってしまったりするw


もうちょい条件のところをちゃんとできないかな、と他のread系メソッド見てあれこれ悩んだ末にできたのがこれ。

  • 34bytes

while(readChar>0)println(readLine)


readCharは入力の1文字目をCharでとってくる。Char型は数値演算ができる(その文字のAsciiコードの値)ので、不等号と合わせるとBooleanがとれる。
while部分で終了判定ができるので、readLineのあとの.rもいらなくなった。
やったー。