プログラムの最近のブログ記事

ログイン画面を作ろうと思うと結構めんどくさかったりします。

ログイン画面のユーザーの参照ページを保持したり途中別のページが開かれたり

ややこしい認証だと共通モジュールに入れると全体が見づらくなったりと。。。

 

弊害を上げていったら切りがありませんが、ほとんどのブラウザはBesic認証に

対応しています。通常は「.htpassword」にパスワードが保存されていますが、

PHPでは「PHP_AUTH_USER」と「PHP_AUTH_PW」をつかってヘッダー内の

パラメーターを簡単に取得出来てしまいます。

ログイン画面に必要な機能はBesic認証でそろってますしこれを使わないては

無いですよね^^b

 

ってことでこんな感じで実装してみました。

 

<?php

$id = 'root';
$pw = 'pass';

// ユーザー認証
if(empty($_SESSION['IS_LOGIN'])){
 // パラメーターの有無を確認、いやマージしておこう。
 $auth = array_merge(
  array('PHP_AUTH_USER','PHP_AUTH_PW'),
  $_SERVER
 );

 if(
  $auth['PHP_AUTH_USER'] $id &&
  $auth['PHP_AUTH_PW']   $pw
 ){
  // ログイン成功
  $_SESSION['IS_LOGIN'] = 1;
  /*
   ここでセッションやクッキーにパラメーターを
   記録しておいて次回表示に備える。
  */
 }else{
  // ログイン失敗
  header('WWW-Authenticate: Basic realm="Wellcome"');
 }
}else{
 // すでにログインしている場合はスルー

}

echo 'Hello';

セキュリティー関連の問題が無いかがちょっと不安ではありますが、

お知らせや予定表等のみの簡単なCMSしか搭載していないサイトであれば

こっちのほうが簡単ですよね。

 

(完)

 

お世話になっています。
プログラマの竹内です。

CakePHP の便利な機能で、モデルの「アソシエーション」機能があります。
関連付けた複数テーブルのデータを一度に取得できる機能です。

今回はこのアソシエーションの1つ、「hasAndBelongsToMany」なモデルデータを、ページ分割してデータ取得してくれる「paginate」メソッドで使うことができないかなあ?というお話。


1. hasAndBelongsToMany とは

例えば、以下のようなテーブルが3つあり、

ユーザーにタグをつけて検索したいという場合。


●users テーブル

 id    name

●users_tags テーブル

 id    user_id    tag_id

●tags テーブル

 id    name


モデルには以下のように記述します。

     var $hasAndBelongsToMany = array(
        'Tag' => array(
            'className' => 'Tag',
            'joinTable' => 'users_tags',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'tag_id',
        )
    );


2. paginate で取得するには

find と同様に、モデルのデータを取得してくる paginate ですが、表面的に同じような使い方をすると期待する結果が取得できない場合があります。


通常テーブルのデータ(例えば、ユーザー名を取得する)なら

$this->paginate('User', array('User.name'=>'ひろし'));

などという感じで取得することができます。


しかし、hasAndBelongsToMany のデータを取得する場合、

例えばタグで検索しようとして

$this->paginate('User', array('UsersTag.tag_id'=>1));

などとやっても、このままでは取得することができません。


3. paginate メソッドでモデル結合する。

しょうがないので、検索のSQLでデータを結合して取得してくるようにします。


コントローラー冒頭の宣言で

    var $paginate = array('User' =>
                array(
                    'conditions'=>array(
                        'User.del_flag'=>false
                    ),
                    'limit'=>10,
                    'order'=>array(
                        'User.id'=>'asc'
                    ),
                    'joins'=>array(
                        array('type'=>'LEFT', 'alias'=>'UsersTag', 'table'=>'users_tags',
                            'conditions'=>'User.id = UsersTag.user_id')
                    )
                )
        );

と記述します。


これで、

$this->paginate('User', array('UsersTag.tag_id'=>1));

のような方法によるデータの取得が可能になりました。       


後記

だいぶ遠回りしていますが、CakePHP の機能でまだまだ不備のある点がよくわかって面白いです。

P.S. bindModel を使う手もありそうですが、恒久的なデータの取得に向かなさそうなので避けました。


Android多言語対応スクリプト

こんにちわ高崎です。
androidで多言語対応のソフトを作る場合
いちいちvalues_jaなどにxmlファイルを入れなければなりません。

それで作ったのが以下のperlスクリプト


# /bin/perl

$header='<?xml version="1.0" encoding="utf-8"?>'."\n".'<resources>'."\n";
$footer='</resources>';

open (IN, 'langage.csv');
@data = <IN>;
close (IN);

@firstline=split(/\,/,$data[0]);

for($k=1;$k<@data;$k++){
    @line=split(/\,/,$data[$k]);
    
    if(!-d $line[0]){mkdir $line[0];}
   
    $output=$header;
    for($i=1;$i<@firstline;$i++){
        $output.='<string name="'.$firstline[$i].'">'.$line[$i]."</string>\n";
    }
    $output.=$footer;
   
    open(OUT, ">/".$line[0]."/strings.xml");
    print OUT $output;
    close(OUT);
}

exit;


やりかたとしてはlangage.csvに

フォルダ名,項目1,項目2
values_ja,項目1の値,項目2の値
values_en,one_val,two_val

みたいなCSVを作ればOK。

すでに多言語アプリケーションを作ってる人は
似たようなことをやっていると思いますが・・・。


FlashDevelop が 4.0 になった!

こんにちは、竹内です。

年始に次の記事が出てました。

窓の杜 - 【NEWS】ActionScript向けの無償開発環境「FlashDevelop」の最新版v4.0.0が公開
http://www.forest.impress.co.jp/docs/news/20120105_502681.html

私も、昨年 Flash のActionScript プログラムを修正しようと思ったときに、
Flash CS の外部エディタとして使用したことがあります。

オープンソースソフトですが、高機能で使い勝手がよく、
なにより軽快で、Flash の重々しいイメージが嫌な人もすぐに馴染めるのではないかと思います。

また、以前までのバージョンでは、デバッガやコード補完機能がまだまだだったようですが、
4.0.0 ではだいぶ改善されているほか、
iOS版やAndroid版の「Adobe AIR」にも対応しているそうです。


FlashDevelop4.0.0 RTM リリース
http://flashdevelop.jp/FlashDevelop4.0.0_RTM
こんにちわ。高崎です。

DBを触る時postgres用のツールがあまりないため
webサーバーから簡単に操作できるDBツールをちょこちょこと作っていました。
githubにて公開したので、ぜひ使ってみてください。

https://github.com/tkk-space/webquery

まだまだバグも多いのですが、フィードバックなどがあれば反映していきます。
ファイル数も少なく、わりと簡単なコードでできているので
webアプリケーションを作っている人には、カスタマイズして使うのにも向いていると思います。

以下、簡単な導入方法。

環境:apache、PHP5(pdo)
ブラウザ:モダンブラウザ推奨


githubにアクセスしzipボタンを押してダウンロード

1.png


apacheにダウンロードしたファイルをフォルダごと入れてください。

アクセスすると、以下のような画面になると思います

2.png

3.png
接続リストに入れてセレクトボックスで接続先を選択すると、DB一覧に表示されます、DBを選択するとテーブル名が表示されるといった感じで、わりとスピード感がある操作が可能になっています。

是非試してね。

1  2