2012年1月31日火曜日

CSS - jQueryで垂直中央に配置する

jQueryを使ってボタンを親要素の高さの真ん中に配置したいと思います。単純なことですが、ちょっとはまったので、切り出して試しました。cssでheightを100%にするの忘れてたり、jQueryでtopを設定するときに'px'の2文字を入れ忘れたりしていただけでしたが、せっかく切り出して試したのでメモります。


下記のコードはブラウザで上記のような画面になります。まさしくボタンが中央に配置されています。

Html

<div id="box">
     <ul>
          <li class="a">aaaaaa
          <li class="b">bbbbbb
          <li class="c"><input id="btn" type="button" value="cccccc" />
     </ul>
</div>

css

#box{
     height:150px;
     background-color:#333;
     width:400px;
}
ul{
     margin:0;
     padding:0 10px;
     list-style-type: none;
     height:100%;
}
li{
     float:left;
}
.a{
     width:100px;
     background-color:#f00;
     height:100%;
}
.b{
     width:150px;
     background-color:#0f0;
}
.c{
     width:100px;
     background-color:#00f;
     height:100%;
     position:relative;
}
#btn{
     position:absolute;
}

javascript

$(function(){
     $(document).ready(function(){
          var btnh = $('#btn').outerHeight(true);
          var ch = $('.c').outerHeight(true);
          $('#btn').css('top',(ch-btnh)/2+'px');
     });
});

2012年1月30日月曜日

jQuery+CSS3サンプル

jQueryとCSS3を使ったサイトのサンプルを作ってみました。

jQueryをちょっとばかにしてたけどかなり色々できて面白い。スマホだとIE対応等の為に重くなっているらしいので、もっと軽いjQueryみたいなやつが沢山でているそうです。同じような使い方であることを祈ります。

このサンプルは、ここで見られます。

このサンプルは、画面がロードされるとメニューが横から飛んできます。メニューはアコーディオンになっていて、アクティブなメニューと非アクティブなメニューで色分けされます。後は、ローダーもspinnerというプラグインを使って入れてみました。このプラグインは分かり易いし便利です。あとは、ポップアップしてFacebookみたいに登録完了を告げてちょっとしたらポップアップが消えていくようにしました。インターネットが重い場合は、最初のメニューが横から飛んでくる前に画面に表示されちゃうかもしれません。最初は透明にするなりしておけばよかった。

2012年1月29日日曜日

消費税増税

国には予算があり、予算に基づいて僕らにいいことしてくれます。でも予算が税収を大きく上回っております
12年度予算案の一般会計総額は90兆3339億円。新規国債発行額は44兆2440億円と政府の財政健全化目標を守ったが、国債への依存度は49.0%とほぼ半分に達し、当初予算ベースで過去最悪を更新した。過去に編成した補正予算も含めると、国債発行額が税収見通しを上回るのは4年連続。
税収が40兆円くらいしかないから、国債を予算の穴埋めをするために新規で44兆円発行したのかなと思ってるんだけどあってるかな?でもこれ見ると国は特別会計っていうのがあって、ひっくるめると1年間で220兆円使ってるらしい。なんだか分からなくなてきた。国債の利払いとかも特別会計なのかしら。もうちょい調べないと全然わからないや。 なにしろ、金ないし、借金も限界やし、税金もっととらないとどうしようもないし、一番インパクトあるのは消費税やし、ということまでは分かったと言えるのだろうか?でも消費税増税しても、220兆円から考えるとまだインパクト少ないし、これから全体的にどうするのかは分からんし、ということだろうか?

2012年1月22日日曜日

cakePHP1.3でデータベース操作の研究(MySQL)(2)

今回はまだ調べてないデータベース操作を試してみます。試したいのは、テーブルを検索するときにフィールドの条件にリストを使うこと。リストを使う場合に部分一致が可能かどうかというのも試したい。あと、日付関連のデータをテーブルに格納する最適な方法と、格納されたテーブルの最適な検索等の方法を調べたい。

今回は、前回の英単語帳ではなく極めてシンプルなテーブル構成にしたい。テーブルは1つだけあり、名前はusersである。cakePHPのモデル名はよってUserになる。ちなみにモデルのファイル名は、user.phpである。フィールドは、id、name、have、wantの4フィールドを持つ。idはプライマリキーでauto_incrementにする。単なるテストなので、idは適当にmediumint(9)にしてある。nameはvarchar(50)で、haveとwantはtextにした。

今回のお試し用に作成した、test_controller.phpの全文は下記のとおり。

<?php 
class TestController extends AppController{
    public $name = 'test';
    public $uses = array('User');
 
    public function index(){
        $this->del();
        $this->put_user();
        $result = $this->search();
        $this->set('result',$result);
    }
 
    private function put_user(){
        $put_cnt = 2;
        for($i=0;$i<$put_cnt;$i++){
            if($i==0){
                $data = array('User' => array(
                    'name' => $i,
                    'have' => '1,2,3,4',
                    'want' => '5,6,7,8'
                ));
            }else{
                $data = array('User' => array(
                    'name' => $i,
                    'have' => '5',
                    'want' => '1'
                ));
            }
            $this->User->create();
            $this->User->save($data);
        }
    }
 
    private function del(){
        $user = $this->User->find('all',null);
        foreach($user as $u){
            $this->User->delete($u['User']['id']);
        }
    }
 
    private function search(){
        $user = $this->User->findByName('0');
        $list_h = $this->str_to_list($user['User']['have']);
        $list_w = $this->str_to_list($user['User']['want']);
 
        $params = array(
            'conditions' => array(
                'User.have' => $list_w,
                'User.want' => $list_h
        ));
        $user = $this->User->find('all',$params);
        return $user;
    }
 
    private function str_to_list($str){
        if($str == ''){
            return array();
        }else{
            return split(",", $str);
        }
    }
}
?>

2012年1月17日火曜日

cakePHP1.3でデータベース操作の研究(MySQL)

cakePHPのデータベース操作を研究します。データベースはMySQLです。cakePHPのバージョンは1.3を使ってます。cakePHPはバージョン毎に結構変化が色々あるようなので、cakePHP2.0との違いは早く調べておこうと思います。どんなデータをつくるかというと、分かり易いのがいいので英単語帳をイメージしてテーブルを作ってみます。

テーブル構成

テーブル構成は下記を想定してます。言葉遣いが間違っている可能性はありますが、iuwは、uwとiwを参照します。uwはuserとwordを参照します。cakePHPのJOINの構文を見ると、wordはuwを沢山持っていると言います。word hasmany uwとなります。逆にiuwはuwに属するといいます。iuw belongsTo uwとなります。



各テーブルの項目

各テーブルのフィールドは下記を想定しています。テスト機能つけたり色々一応想定して項目をつけました。まあ全部つくるか分かりませんがモチベーションが続くまで研究してみます。

usersid,name,image,discription
wordsid,word
imisid,imi
uwsid,user_id,word_id,count,seitouritsu,seigo
iwsid,imi_id,word_id,goodcnt,badcnt
iuwsid,uw_id,iw_id

2012年1月11日水曜日

トランザクション

トランザクションとは、
関連する複数の処理を一つの処理単位としてまとめたもの。金融機関のコンピュータシステムにおける入出金処理のように、一連の作業を全体として一つの処理として管理するために用いる。
GAEのデータベースは何でもトランザクションになっていたということだな。
トランザクションを使うと複数のクエリをまとめて1つの処理として扱うことができる。処理の途中でエラーになって処理を取り消したいような場合はROLLBACKをすることで変更内容を元に戻すことができる。
とみぞーノートに書いてある。 とみぞーノートを見ると、トランザクションを開始して、コミットするまでは、他の誰かがデータを参照してもトランザクション中の人が操作しているデータは見えないようだ。コミットするとトランザクションが終了するようだ。データを全部元に戻すには、ロールバックするらしい。単純な仕組みではある。確かinnoDBというのはトランザクションが使えるし、ロックが行単位の為、デッドロックになることは少ないとかなんかの雑誌に書いてあったな。

cakePHPでトランザクション

(※以下の情報は古かったのでcakePHP1.3の場合はここのやり方になります)

cakePHPでのトランザクションの使い方がこのページに書いてある。まずはapp/model/以下にあるapp_model.phpに以下を追加する必要があるらしい。

function begin()
{
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $db->begin($this);
}
    
function commit()
{
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $db->commit($this);
}
    
function rollback()
{
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $db->rollback($this);
}

そして、実際に使う様がこのページに載っている。cakePHP1.3の場合だそうだ。

$this->Event->begin(); // トランザクションの開始
if($this->Event->save($this->data)){
    $this->Event->commit(); // コミット
    // 登録できたらリダイレクト
    $this->redirect('.');
}else{
    $this->Event->rollback(); // ロールバック
    $this->Session->setFlash('データの保存に失敗しました');
}

あとで試してみよう。

2012年1月9日月曜日

cakePHPプロジェクト作成する際のファイル構成

そんなページありませんといわれないように、cakePHPプロジェクトを作成する際には、下記ファイルとフォルダを全部コピペしましょう。
  • appフォルダ
  • cakeフォルダ
  • pluginsフォルダ
  • vendorsフォルダ
  • .gitignore
  • .htaccess
  • index.php

2012年1月2日月曜日

Css - あふれた文字を「...」に変換する

下記のように、divの中に、長い文字列があるが、divの幅を固定したい場合、下記のようなcss設定によってあふれた文字を「...」に変換することができる。これによって、div幅を固定しながら文字列が続くことも表現できる為、スマートである。

divの例

<div id="afuretamoji">ああああああああいいいいいいううううううううえええええええおおおおおおおお</div>

css設定例

div#afuretamoji{
 font-size:10px;
 color: #06c;
 background-color: #def;
 border:1px solid #589;
 width:100px;
 max-width:100px;
 height:70px;
 overflow:hidden;
 white-space:nowrap;
 text-overflow:ellipsis;
}
「max-width:100px;」でdivの最大幅を決めている。
「overflow:hidden;」で、あふれた文字を表示しないようにしている。
「white-space:nowrap;」で、複数行表示を禁止している。
「text-overflow:ellipsis;」で、あふれた場合に、「...」を表示するようにしている。

結果

ああああああああいいいいいいううううううううえええええええおおおおおおおお

jQuery - メニューをマウスオーバーしたら色変える

非常に簡単な話ですがメモ。大体jQueryも分かってきたのですが、cssの設定方法などもいくつかパターンがあるようで、あとbackground-colorという記載が通常のcssの表記法だと思うのですが、jQueryの場合は、backgroundColorだったりしてなんかややこしい。多分キャメル法で統一されたりしてるのかも。そうじゃなかったら一々確認するのめんどくさいですからね。 下記は、ul#menuの子供にliが沢山あって、liにはそれぞれ固有のidが割り振られている状態を想定しています。


$(function(){
 $('ul#menu li').mouseover(function(){menu_mouseover($(this).attr('id'));});
 $('ul#menu li').mouseout(function(){menu_mouseout($(this).attr('id'));});
});

function menu_mouseover(id){
 $('ul#menu li#'+id).css('backgroundColor','#0cf');
}

function menu_mouseout(id){
 $('ul#menu li#'+id).css('backgroundColor','#09c');
}

Javascript - GETリクエストパラメータを取得する

window.location.search.substringで取得できる。
取得したものは正規表現やsplitで必要なところを取り出す必要がある。
下記はidがキーのパラメータの値(数字)を取り出す様。
var query = window.location.search.substring(1); 
if(query.match(/id=(\d+)/)){
    alert(RegExp.$1);
}

2012年1月1日日曜日

ミクロ経済学

『この世で一番おもしろいミクロ経済学』を読んだ。超分かり易かった。ただ広く浅くで超概要しかわからない。

サンクコスト(sunk cost)

サンクコストは埋没費用ともよばれ、すでに投資済みのコストのことをいいます。あるいはすでにやってしまったことをいいます。既にやってしまっていることを理由に次の施策を決定することはおかしい。腹痛になったので、ビオフェルミン飲むか、トイレに行くかを検討した際に、腹痛なのでトイレに行くのではなく、ビオフェルミンを飲むことにする、というのはおかしい。

お金の価値

お金は時間に伴い価値がかわります。利子により銀行に預けてるだけでその価値は1年後に上がるわけですから、今すぐにA円もらうのがいいか、1年後にB円貰うのがよいかを検討するには、利子率をもとにB円の現在価値を求めて、それをA円と比較します。

利子率をrとし、将来のお金をXとし、経過年数をnとすれば、現在価値PVは、PV = X / (1 + r)^n となります。
r = 0.05;
X = 200000;
n = 10;
PV = X/Math.pow((1+r),n);
document.write(PV);


毎年X円を、n年間貰える場合、この現在価値PVは、
r = 0.05;
X = 10000;
n = 20;
PV = 0;
for(i=0;i<n;i++){
    PV += X/Math.pow((1+r),i+1);
}
document.write(PV);


毎年一定額を貰えるようなケースを年賦(ねんふ)というらしい。年賦金の現在価値の公式がある。 PV = X * (1 - (1 / (1 + n)^n)) / r が公式らしい。証明を今度探すか。
r = 0.05;
X = 10000;
n = 20;
PV = X*(1-(1/Math.pow(1+r,n)))/r;
document.write(PV);


なんと、永遠に毎年一定額貰える場合も、現在価値を簡単に求められる。

現在価値は下記のような式で表すことができる。
[式a] PV = X / (1 + r)^1 + X / (1 + r)^2 + X / (1 + r)^3 ..........
この式の両辺に、(1 + r)をかけると、下記のようになる。
[式b] PV(1 + r) = X + X / (1 + r)^1 + X / (1 + r)^2 + X / (1 + r)^3 ..........
[式b]から[式a]を引くと下記のようになる。
PV * r = X
よって、現在価値PVは、下記になる。
PV = X / r

その他

その他もろもろの超概要を説明してくれている。リスクの考え方、取引のメリット、取引の制約がなければ取引は双方の取引メリットがなくなるまで続くとか、ゲーム理論、パレート最適、パレート改善とか、オークションとか、需要曲線、供給曲線とか、税金とか。