パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください -39ページ目

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

Python勉強中のパク太郎です。


今回は、MySQLへの接続とWebページの表示を用いて簡単な画面遷移を行うWebアプリケーションを作成したいと思います。

Webページの表示で作成したsimpleweb.pyを下記のように修正します。
MySQLへの接続で作成したaccountdao.pyをsimpleweb.pyと同じディレクトリに配置します。


from wsgiref import simple_server, util
import cgi
import hashlib
import accountdao

_html = '''&lthtml>
&lthead>&lttitle&gtLogonForm</title>
&ltmeta http-equiv="Content-type" content="text/html; charset=utf-8">
</head>
&ltbody>
&ltform action="{0}" method="POST" AcceptEncoding="utf-8">
&ltdl>
&ltdt&gtUserID</dt>
&ltdd>&ltinput type="text" name="UserID"/></dd>
&ltdt&gtPassword</dt>
&ltdd>&ltinput type="text" name="Password"/></dd>
&ltinput type="submit" name="logon" value="LogOn" />
</form>
</body>
</html>
'''

class SimpleWeb(object):
'''簡単なWebアプリケーション'''

def __call__(self, environ, start_response):
''' WSGI アプリケーション '''
method = environ.get('REQUEST_METHOD')
if method == 'POST':
wsgi_input = environ.get('wsgi.input')
length = int(environ.get('CONTENT_LENGTH', 0))

query = dict(cgi.parse_qsl(wsgi_input.read(length)))

account_dao = accountdao.AccountDao('localhost', 'practice', 'paku', 'paku')
rows = account_dao.select(query.get(b'UserID').decode('utf-8'), 'user_passwd')
passwd = hashlib.sha1(query.get(b'Password')).hexdigest()

if passwd == rows[0][0]:
start_response('200 OK', [('Content-Type', 'text/plane; charset=utf-8')])
return [b"LogON OK"]
else:
start_response('200 OK', [('Content-Type', 'text/plane; charset=utf-8')])
return [b"LogON NG"]
else:
start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])
return self.logonPage(environ)

def logonPage(self, environ):
'''Logonページの内容を作成'''

return [bytes(_html.format(util.request_uri(environ)), 'utf-8')]

application = SimpleWeb()

if __name__ == '__main__':

''' ユーザーID:test ユーザー名:test パスワード:testのユーザーを作成 '''
account_dao = accountdao.AccountDao('localhost', 'practice', 'paku', 'paku')
rows = account_dao.select('test')
if len(rows) != 0:
''' 既にユーザーID:testが存在する場合は削除 '''
account_dao.delete('test')

account_dao.insert('test', 'test', hashlib.sha1('test'.encode(encoding='utf_8', errors='strict')).hexdigest())

server = simple_server.make_server('', 8080, application)

server.serve_forever()



行が塗りつぶされている部分が修正箇所です。
簡単に説明をします。
 ・28行目で、environからリクエストメソッドを取得します。
 ・リクエストメソッドがPOSTであった場合は、POSTデータの解析を行います。
 ・30行目でPOSTデータを読み出すためのストリームを取得します。
 ・31行目でPOSTデータのサイズを取得します。
 ・33行目でストリームからPOSTデータを読み出し、辞書型に変換します。
 ・35~37行目でUserIDに入力されたデータのパスワードを検索します。
 ・39~44行目でPasswordに入力されたデータと検索でヒットしたパスワードを比較し、
  結果を出力します。
 ・58~65行目では今回のアプリ用のテストデータを生成しています。
 
では、実際に動かしてみましょう。

simpleweb.pyを保存したディレクトリ上で、
下記コマンドを実行します。


>python simpleweb.py



これでWebアプリケーションが起動しますので、http://localhost:8080にアクセスします。

アクセスしたWebページのFormのUserID欄にtest、Password欄にtestを入力し、
LogOnボタンを押下した際に、LogON OKと表示されれば成功です。
また、上記以外の情報を入力した場合は、LogON NGと表示されます。

終了する際は、シェル上でCTRL+Cを押下すればWebアプリケーションは終了します。

これでMySQLに接続する簡単な画面遷移を行うWebアプリケーションの作成が出来ました。

はじめまして~
ちかと申します
雑多に書きなぐりますが、よろしくお願い申し上げます。

今日は変数を作るときの悩みを打ち明けます。

悩みの種

私はいつも頭を抱えていました。
チェックボックスを変数に格納するとき、変数名は一体どうやって決めれば良いのでしょうか。

  • chkbox
  • chk_box
  • chkBox
  • ChkBox
  • checkbox
  • check_box
  • checkBox
  • CheckBox

あぁ! なんてくだらない悩み!
私はもっと他のことに悩みたいのに!
(恋とか! 愛とか! 晩御飯のおかずとか!! あ、ついでに仕様をどう実現するかとか。)

ちょっと妄想

じゃぁ仮に、、、
チェックボックスに chkbox と名付けたらどうなるでしょうか。

まずほぼ間違いなく、ボタンには btn と名付けるでしょう。

コンボボックスに cmbbox と名付けて、数秒後に 「う~ん、 combo の方が分かりやすいかなぁ…」 とボヤくのですが、 chkbox との兼ね合いから cmbbox のままにします。

それからスクロールバーをどう略すか1分半ほど悩み、 scrbar にしてみますが、どうもしっくりきません。
そこで、 「Google で "scrbar" を検索して、スクロールバーに関するページが出てきたら scrbar で行こう!」 と思い立ちます。
こうして Google 先生のお墨付きを得て scrbar と名付けるのですが、半年後、「scrbar ってなんだろう...??」 「これってスクロールバーの略語として正しいのかな...??」 と再び Google 先生の元を訪れることになるのです。

その頃には、 cnf が conference (会議) なのか confidential (部外秘) なのか config (設定) なのか分からず、自分の恋人 (lover) と肝臓 (liver) の見分けもつかなくなっています!

そう、

勝手な略語を作っちゃダメ!

母音を抜いて短くする例ばかり挙げましたが、単語の頭文字をつなげてもダメです!
LPCTSTR なんかは略語を作って混乱した最たる例です。

I'm not Hungary, but Hungry.

ハンガリアン記法においては、システムハンガリアンであれアプリケーションハンガリアンであれ、プレフィックスとして勝手な略語を使うことになります。
(システムハンガリアンとアプリケーションハンガリアンについて知りたい方は 『間違ったコードは間違って見えるようにする - The Joel on Software Translation Project』 へどうぞ。)

次の疑似コードでは、 sus が特別な意味を持つプレフィックスとして使われています。
(この例は 『間違ったコードは間違って見えるようにする - The Joel on Software Translation Project』 の例を私に都合良いよう一部改変したものです。)

sName = SFromUs(usName)

こんな略語プレフィックスを10個ほど作れば、プロジェクトメンバーを混乱させるには十分です。
さらに、蹴落としたいライバルを眠らせたければ、略語プレフィックスリストをドキュメント化して渡せば OK です。

上の疑似コードは略さずに書くと次のようになります。

safeName = SafeFromUnsafe(unsafeName)

たしかにソースコードは長くなりました。えぇなりましたとも。
ですが、理解するためのコストはずっと軽くなったのでは!?

キャメる?? パスカる??

略語を削ることで、チェックボックスの名前の候補が半分になりました。

  • checkbox
  • check_box
  • checkBox
  • CheckBox

命名方式の名前はあまり問題ではありませんが、一応、checkbox 以外には呼び方があって、
スネーク形式 (check_box), Camel 形式 (checkBox), Pascal 形式 (CheckBox) と呼ばれるそうです。
※ 広義の Camel 形式は checkBox だけでなく CheckBox も含むので注意が必要です。

で、どれを選ぶかですが、私が言うまでもないというか、私では決められないというか、プログラミング言語ごとやプラットフォームごとの作法がありますので、それに従えばいいでしょう。

もちろん、プロジェクト内の作法があればそちらが優先されるべきですけどね。

最後に

一応断っておきますが、
この記事はちかの独断と偏見にもとづいており、会社全体の方針というわけではございません。あしからず。

今回は、「IEEE802.11b」「IEEE802.11a」について書きます。
/*------------------------------------------------------------------*/
●IEEE802.11bについて

IEEE802.11bは「タスクグループB」が策定したため「IEEE802.11」の後に「b」が付きます。
「ISMバンド」と呼ばれる2.4GHzの周波数帯域(免許不要)を使用します。

最大伝送速度は11Mbpsですが、電波の強度により通信速度が異なります。
もちろん、電波が強いところほど速度がでます。

日本国内で利用できるチャネル数は14chですが、同時使用最大チャネル数は4chです。
ただし[14ch]を使用するのは日本のみで海外では[14ch]というチャネルは使用しません。
1つのチャネル幅の規格が22MHzであるため、IEEE802.11bで干渉することなく利用できるチャネルは、「 1ch、6ch、11ch、14ch 」(日本のみ) 4つとなります。

変調方式はCCK方式(Completely Code Keying:相補符号変調)を採用することにより
11Mbpsによる速度を実現し、802.11との互換性も保持している。

/*------------------------------------------------------------------*/
●IEEE802.11aについて

IEEE802.11aは「タスクグループA」が策定したため「IEEE802.11」の後に「a」が付きます。

「U-NIIバンド」と呼ばれる5.2GHz周辺の周波数帯域を使用します。
但し、この5GHzの周波数帯域は、移動体衛星通信システムにも利用されているために
電波法により屋外での利用が禁止されているので802.11aを使用する場合は屋内である必要があります。
 ・5.15-5.35GHz : 屋内の利用に限り免許不要
 ・5.47-5.725GHz : 屋内外に限らず免許不要

変調方式は、OFDM (Orthogonal Frequency Division Multiple) 方式を採用することにより、伝送速度は36~54Mbpsとなり、IEEE 802.11bの約11Mbpsから大幅に高速化されています。

/*------------------------------------------------------------------*/

次回以降は、「IEEE802.11g」と「IEEE802.11n」について記述します。
こんにちわ。iOSアプリ開発担当の ゆんぼう です。

今回は、Xcodeをインストールして、アプリを実行してみましょう。
なお、動作環境は、以下の通りです。
・Mac OS X v10.8.2
・インターネットが接続できる環境

Xcodeのインストール

まず、xcodeのインストールから行います。

1. Macのdockに表示されている 「AppleStore」のアイコンをクリックします。


2. AppleStoreのサーチバーで「xcode」で検索します。


3. 検索結果に「Xcode」が表示されますのでインストールしてください。


4. インストールした後、Macのdockに表示されている「Finder」のアイコンをクリックします。


5. よく使う項目から「アプリケーション」を選択します。


6. 「Xcode」を選択します。選択後、Macのdockに追加されます。



(iOS) Hello World の作成
では、Xcodeで Hello World を作成します。

1. Macのdockに表示されている 「Xcode」のアイコンをクリックします。


2. Welcome to Xcode画面で 「Create a new Xcode project」を選択します。


3. Choose a template for your new project画面で 「Emplty Application」を選択後、「next」を選択します。


4. 以下の内容を記入後、「next」を選択します。

Product Name・・・アプリ名(例:HelloWorld)
Organization Name・・・組織名(例:park)
Company identifier・・・会社ID(例:jp.co.pa-rk)
Class Prefix・・・今は記入不要
Devices・・・対応機種(例:iPhone)

Use Core Data・・・CoreDataの使用有無(今は不要)
Use Automatic Reference・・・Counting ARCの使用有無
Include Unit Test・・・ユニットテスト



5. プロジェクトの保存先を指定します。


6. Hello World のテキストを表示するプログラムコードを追加します。
プロジェクトのファイル一覧画面で、「AppDelegate.m」を選択します。


7. 「AppDelegate.m」で以下のコードを追記します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(10, 10, 100, 50);
label.text = @"Hello World!";
[self.window addSubview:label];

return YES;
}


8. 「RUN」を選択します。その後、iOSシミュレータが起動します。


9. iOSシミュレータに「Hello World」が表示されました。


以上がアプリ実行時の簡単な流れとなりました。
次回は更に詳しく説明します。
Python勉強中のパク太郎です。


今回はPythonを用いてWebページの表示を行いたいと思います。

Pythonを用いてWebページの表示を行うためには、WSGIというインタフェース定義に従います。


WSGIに準拠したアプリケーションは下記のようになります。


from wsgiref import simple_server, util

_html = '''<html>
<head><title>LogonForm</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
</head>
<body>
<form action="{0}" method="POST" AcceptEncoding="utf-8">
<dl>
<dt>UserID</dt>
<dd><input type="text" name="UserID"/></dd>
<dt>Password</dt>
<dd><input type="text" name="Password"/></dd>
<input type="submit" name="logon" value="LogOn" />
</form>
</body>
</html>
'''

class SimpleWeb(object):
    '''簡単なWebアプリケーション'''

    def __call__(self, environ, start_response):
        ''' WSGI アプリケーション '''
        start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])

        return self.logonPage(environ)

    def logonPage(self, environ):
        '''Logonページの内容を作成'''
        
        return [bytes(_html.format(util.request_uri(environ)), 'utf-8')]

application = SimpleWeb()

if __name__ == '__main__':

    server = simple_server.make_server('', 8080, application)

    server.serve_forever()

上記コードのSimpleWebクラスがWSGIに準拠したアプリケーションです。
引数で渡された、呼び出し可能オブジェクト(start_response)に対して、
ステータスコードとレスポンスヘッダを返して、
本文を生成するための、バイト配列を返り値として返しています。

SimpleWebを標準モジュールwsgirefを用いて表示しているのが、
38行目と40行目の部分です。

では、実際に動かしてみます。
上記コードをsimpleweb.pyという名前で保存し、保存したディレクトリ上で、
下記コマンドを実行します。


>python simpleweb.py


これでWebアプリケーションが起動しますので、http://localhost:8080にアクセスします。
Webページが表示されていれば成功です。

FormがあるWebページにしましたが、
現段階ではボタンを押下しても同じページを表示するだけで
何もしないWebページになっています。
(次回の記事で画面遷移するように機能追加する予定です)

終了する際は、シェル上でCTRL+Cを押下すればWebアプリケーションは終了します。

これで、WSGI準拠のアプリケーションを起動することが出来ました。