goo blog サービス終了のお知らせ 

marunomaruno-memo

marunomaruno-memo

20km歩く

2011年03月12日 | Weblog
5時間半くらいだったかな。
ともかく、疲れた。
足がパンパン。
とりあえず、歩いたところは、歩道(狭かったが)で、歩きにくい感じではなかった。ただ、前を歩く人のペースで、自分のペースで歩けなかったところが疲れる原因かな。

公衆電話が30分から1時間歩いて1個程度の割にしか見つからなかった。

まあ、家族が無事でなにより。



NXCメモ (1)

2011年02月10日 | Weblog
NXC Version 1.2.1 r3
---

■液晶ディスプレイの行数で使うマクロ定数

---
LCD_LINE8  0
LCD_LINE7  8
LCD_LINE6 16
LCD_LINE5 24
LCD_LINE4 32
LCD_LINE3 40
LCD_LINE2 48
LCD_LINE1 56
---



■Wait()関数の引数に使えるマクロ定数

---
MS_1 1
MS_2 2
MS_3 3
MS_4 4
MS_5 5
MS_6 6
MS_7 7
MS_8 8
MS_9 9
MS_10 10
MS_20 20
MS_30 30
MS_40 40
MS_50 50
MS_60 60
MS_70 70
MS_80 80
MS_90 90
MS_100 100
MS_150 150
MS_200 200
MS_250 250
MS_300 300
MS_350 350
MS_400 400
MS_450 450
MS_500 500
MS_600 600
MS_700 700
MS_800 800
MS_900 900
SEC_1 1000
SEC_2 2000
SEC_3 3000
SEC_4 4000
SEC_5 5000
SEC_6 6000
SEC_7 7000
SEC_8 8000
SEC_9 9000
SEC_10 10000
SEC_15 15000
SEC_20 20000
SEC_30 30000
MIN_1 60000
---


■PlayToneなどの音関係で使うマクロ定数

---
FREQUENCY_MIN 220
FREQUENCY_MAX 14080
SAMPLERATE_MIN 2000
SAMPLERATE_DEFAULT 8000
SAMPLERATE_MAX 16000

TONE_A3 220
TONE_AS3 233
TONE_B3 247
TONE_C4 262
TONE_CS4 277
TONE_D4 294
TONE_DS4 311
TONE_E4 330
TONE_F4 349
TONE_FS4 370
TONE_G4 392
TONE_GS4 415
TONE_A4 440
TONE_AS4 466
TONE_B4 494
TONE_C5 523 // ド
TONE_CS5 554
TONE_D5 587 // レ
TONE_DS5 622
TONE_E5 659 // ミ
TONE_F5 698 // ファ
TONE_FS5 740
TONE_G5 784 // ソ
TONE_GS5 831
TONE_A5 880 // ラ
TONE_AS5 932
TONE_B5 988 // シ
TONE_C6 1047 // ド
TONE_CS6 1109
TONE_D6 1175
TONE_DS6 1245
TONE_E6 1319
TONE_F6 1397
TONE_FS6 1480
TONE_G6 1568
TONE_GS6 1661
TONE_A6 1760
TONE_AS6 1865
TONE_B6 1976
TONE_C7 2093
TONE_CS7 2217
TONE_D7 2349
TONE_DS7 2489
TONE_E7 2637
TONE_F7 2794
TONE_FS7 2960
TONE_G7 3136
TONE_GS7 3322
TONE_A7 3520
TONE_AS7 3729
TONE_B7 3951
---


Smartyを使って、年月日の入力フォームを作る

2011年01月11日 | Weblog
2010-01-11
Smartyを使って、年月日の入力フォームを作る
======================================================================

■select_date_sample.php
---
<?php
require_once("/usr/share/Smarty/libs/Smarty.class.php");

//Smartyのインスタンス$tplの生成
$tpl = new Smarty();

$year = array();
$localtime_assoc = localtime(time(), true);
$this_year = $localtime_assoc["tm_year"] + 1900;
for ($i = $this_year - 50; $i <= $this_year; $i++) {
    $year[] = $i;    
}

$month = array();
for ($i = 1; $i <= 12; $i++) {
    $month[] = $i;    
}

$day = array();
for ($i = 1; $i <= 31; $i++) {
    $day[] = $i;    
}

//$tplにアサイン(登録)
$tpl->assign("year", $year);
$tpl->assign("month", $month);
$tpl->assign("day", $day);

//テンプレートに基づいて表示
$tpl->display("select_date_sample.html");

?>
---



■テンプレート select_date_sample.html
---
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<select name="year">
{foreach from=$year item=i}
<option value="{$i}">{$i}</option>
{/foreach}
</select>


<select name="month">
{foreach from=$month item=i}
<option value="{$i}">{$i}</option>
{/foreach}
</select>


<select name="day">
{foreach from=$day item=i}
<option value="{$i}">{$i}</option>
{/foreach}
</select>

</body>
</html>
---


PHPサイバーテロの技法―攻撃と防御の実際

2010年12月24日 | Weblog
PHPサイバーテロの技法―攻撃と防御の実際 [単行本]
GIJOE (著)

単行本: 239ページ
出版社: ソシム (2005/11)
ISBN-10: 4883374718
ISBN-13: 978-4883374717
発売日: 2005/11
商品の寸法: 23 x 18.4 x 2.6 cm

1 Webアプリケーションのセキュリティとは
2 Webアプリケーションを実際に攻撃してみよう
3 攻撃方法14種類総ざらえ
4 Webアプリケーションセキュリティの理論
5 HTTPセッションから攻撃の本質を知る
6 脆弱性スキャナーを利用する
7 チャート式:脆弱性の見つけ方

「symfony propel-build-all」コマンドを使う場合のデータベースのバックアップとリストア

2010年12月19日 | Weblog
※symfonyのバージョンは1.0

「symfony propel-build-all」コマンドを使う場合のデータベースのバックアップとリストア


「symfony propel-build-all」コマンドでは、データベースの内容が
すべて初期化されます。
したがって、既にあるデータはいったん、バックアップして、
「symfony propel-build-all」コマンドを実行後、リストアする必要が
あります。

そのための手順です。


---
バックアップ
$ mysqldump -u root -p symfony > symfony_database.sql

モデル・テーブル作成
$ symfony propel-build-all

リストア
$ mysql -u root -p symfony < symfony_database.sql
---


できるPRO Apache Webサーバー Apache 2/1.3対応

2010年12月18日 | Weblog
できるPRO Apache Webサーバー Apache 2/1.3対応
http://www.impressjapan.jp/books/2265.php

\2,625 (本体 \2,500+税)
品種名:書籍
発売日:2006/06/15発売
ページ数:272P
サイズ・判型:B5変型判
著者:辻秀典・渡辺高志・鈴木幸敏&できるシリーズ編集部 著
ISBNコード:978-4-8443-2265-8

■第1章 Apacheをインストールしよう
1-1 Apacheってなに? <Apache HTTPサーバー>
・一番使われているWebサーバー
・バージョン2とバージョン1.3の2種類が使われている
1-2 サーバーとどう通信するの? <IPアドレス>
・IPアドレスで互いを指定する
・IPアドレスは4つの数字からなる
・グローバルIPアドレスとプライベートIPアドレス
・直接通信できるのはセグメントの中だけ
・セグメントはネットマスクで表す
1-3 IPアドレスはどう決めるの? <DHCP、NAT>
・DHCPを使えば自動で割り当てられる
・サーバーは固定でIPアドレスを指定する
・NATでLANとインターネットを中継
・ルーターがつながって世界をカバー
1-4 インストールする環境を用意しよう <必要なハードとソフト>
・必要なハードウェア
・OSと構成
・本書で使う環境
1-5 UNIX系OSにインストールするには <UNIX系OSへのインストール>
・OSで用意されたものと自分でソースからコンパイルするもの
・ソースからインストールする場合
・OSで用意されたものをインストールする場合
1-6 Windowsにインストールするには <Windowsへのインストール>
STEP UP <Apacheのバージョンを最新に保つ>

■第2章 Apacheを動かそう
2-1 URLは何を表しているの? <URLの意味>
・URLは複数の指定の集合体
・WebブラウザはURLを分解してアクセスする
2-2 ホスト名ってなに? <名前解決>
・アドレスをホスト名で指定する
・DNSで名前解決する
・ホスト名の構造
・DNSは階層構造で世界をカバーする
・ダイナミックDNS
2-3 設定ファイルを見てみよう <httpd.conf>
・テキストファイルで設定する
・設定ファイルを確認する
2-4 初期設定をしよう <サーバー自身の情報>
・エラーのときにサーバーの情報が必要
・Apache 2の場合
・Apache 1.3の場合
2-5 Apacheを起動しよう <起動と停止>
・デーモンとして動く
・ソースからインストールした場合
・OSで用意しているものをインストールした場合
・Windows版Apache 2の場合
・Windows版Apache 1.3の場合
2-6 アクセスしてみよう <リクエストとレスポンス>
・サーバーにリクエストを送る
・サーバーからレスポンスが返る
・クライアントからアクセスできるようにしてテストしよう
2-7 アクセスの記録を確認しよう <ログファイル>
・サーバーへのアクセスはログファイルに記録される
STEP UP <HTTPの通信内容の確認方法>

■第3章 ページを見せよう
3-1 設定ファイルの構造を知ろう <セクションコンテナ>
・指定の範囲を決める
・設定の優先順位
・ディレクトリ単位で指定する――
・ファイル単位で指定する――
・パス名で指定する――
・ほかの設定ファイルを読み込む――
3-2 HTMLファイルを置こう <ドキュメントルート>
・ドキュメントルート以下にコンテンツを置く
・ファイルを転送するには
3-3 文字コードの設定を変更しよう <AddDefaultCharset>
・文字コードを指定するしくみ
3-4 設定を反映しよう <Apacheの再起動>
・ソースからインストールした場合
・OSで用意されている場合
・Windows版Apache 2の場合
・Windows版Apache 1.3の場合
3-5 インデックスファイルを設定しよう <DirectoryIndex、Indexes>
・index.htmがインデックスファイルに使われない
・インデックスを設定する
3-6 ほかの場所にあるファイルを見せるには <Alias>
・ドキュメントルートの中にないファイルを見せる
3-7 データの種類を追加するには <AddType>
・データの種類はMIMEタイプで表わされる
STEP UP <正規表現を覚えよう>

■第4章 ユーザーごとに公開ディレクトリを作ろう
4-1 ユーザーごとの公開ディレクトリを用意しよう <ユーザーディレクトリ>
・ユーザーごとのディレクトリを公開できる
・ユーザーディレクトリの設定を確認する
・ユーザーディレクトリを作る(UNIX系OSの場合)
・ユーザーディレクトリを作る(Windows版Apache 2の場合)
・ユーザーディレクトリを作る(Windows版Apache 1.3の場合)
・ユーザーデレクトリにアクセスする
・ユーザーごとに許可や禁止をするには
4-2 ディレクトリごとの設定ファイルを使うには <.htaccess>
4-3 複数のサーバーに見せるには <仮想ホスト>
・1台のサーバーに複数のホスト名をつける
・名前ベースの仮想ホスト
・IPベースの仮想ホスト
・仮想ホストを設定する
・仮想ホストにアクセスする
4-4 仮想ホストに別名をつけるには <ServerAlias>
・IPベースの仮想ホストに元のホスト名をつけるには
4-5 ホスト名を指定しないブラウザに対応するには <ServerPathによる仮想ホストの識別>
・パス名で仮想ホストを判断
STEP UP <Webブラウザのキャッシュを制御する>

■第5章 アクセスを制御しよう
5-1 アクセス元を制限するには <アクセス制限>
・アクセス元に対して禁止や許可を設定する
・特定のアクセス元に対してアクセスを禁止する
・特定のアクセス元にだけアクセスを許可する
・アクセス元の指定方法
5-2 Webブラウザの種類を制限するには <Apacheの環境変数>
・リクエストのメッセージヘッダーを見て値を設定する
5-3 リンクを制限するには <リファラー>
・リンク元の情報もサーバーに送られる
5-4 エラーメッセージを変更するには <ステータスコード>
・レスポンスにはステータスコードが付く
5-5 パスワードをかけるには <基本認証>
・登録ユーザーだけアクセスさせる
・認証のしくみ
・パスワードを指定する
5-6 認証してグループ単位で許可するには <ユーザーグループ>
5-7 アクセス制限と認証を組み合わせるには <Satisfy>
・両方の条件に合ったときだけ許可する場合
・どちらかの条件に合えば許可する場合
5-8 URLが変更になったときは <リダイレクト>
・変更先のURLを返す
・一時的にリダイレクトする場合
・引っ越しのためリダイレクトする場合
・URLのパターンでリダイレクトする場合
5-9 ページの言語を自動で切り替えるには <コンテントネゴシエーション>
・言語や文字コードの情報もサーバーに送られる
・品質値で優先度を指定する
・言語や文字コードを自動で切り替える
・言語を切り替える
・文字コードを切り替える
5-10 サーバーの種類を隠すには <ServerTokens、ServerSignature>
・レスポンスにサーバーの情報が入っている
・サーバーが作るページに表示される情報
STEP UP <Apacheで使える認証方法>

■第6章 CGIを使おう
6-1 CGIってなに? <CGIの概要>
・Apacheを通してプログラムを実行するしくみ
・Perlなどでプログラムを作る
・セキュリティに気をつけよう
6-2 CGIを使えるようにするには <ScriptAlias、AddHandler>
・プログラムはダウンロードできない場所に置く
6-3 CGIを使ってみよう <CGIのスクリプト>
6-4 ユーザーディレクトリでCGIを使うには <ScriptAliasMatch>
6-5 状況に応じて動作させるには <環境変数の利用>
6-6 クライアントからデータを受け取るには <GETとPOST>
・Webブラウザからデータを送る
・GETメソッドとPOSTメソッド
・CGIでデータを受け取る
6-7 クライアントにデータを覚えさせるには <Cookie>
・メッセージヘッダーに値を付けて返す
・CGIでCookieを使う
6-8 CGIでページにフィルタをかけるには <ActionによるCGIの呼び出し>
6-9 エラーになったCGIの通信を確認するには <ScriptLog>
STEP UP <Perl以外のスクリプト言語>

■第7章 SSIを使おう
7-1 SSIを使えるようにするには <AddOutputFilter>
・ページの一部の内容を入れ替える
7-2 ファイルやコマンドの出力を組み込むには <include、exec>
・ファイルの内容を組み込む――include file=
・コマンドの出力を組み込む――exec cmd=
・CGIの出力を組み込む――exec cgi=
・URLで指定した先を組み込む――include virtual=
7-3 値を表示するには <echo、config、if>
・値を表示するには――echo
・日時の表示を変えるには――config
・ファイルの情報を表示するには――fsize
・条件で表示を変えるには
7-4 実行権限でSSIを指定するには <XBitHack>
STEP UP <Web画面での操作を快適にするAjax>

■第8章 モジュールで拡張しよう
8-1 モジュールってなに? <Apacheのモジュール>
・モジュールで機能を追加できる
・モジュールの追加方法は2種類ある
・組み込まれているモジュールを調べる
8-2 モジュールを追加するには <モジュールの追加とコンパイル>
・組み込みのモジュールを指定する場合
・DSOのモジュールをダウンロードして追加する場合
・DSOのモジュールをコンパイルする場合
8-3 データを圧縮して送るには <mod_deflate、mod_gzip>
・自動的に圧縮と復元が行なわれる
・Apache 2でmod_deflateを使う
・Apache 1.3でmod_gzipを使う
・そのほかの圧縮設定
8-4 違うURLでアクセスさせるには <mod_rewrite>
8-5 Perlスクリプトを組み込めるようにするには <mod_perlのインストール>
・Apache 2にmod_perl 2をインストールする
・Apache 1.3にmod_perl 1をインストールする
8-6 PerlスクリプトをApacheに組み込むには <mod_perlの利用>
8-7 CGIスクリプトをmod_perlで動かすには <PerlのRegistryモジュール>
STEP UP <さまざまなApacheモジュール>

■第9章 SSLに対応しよう
9-1 暗号化されたWebサーバーを構築するには <SSL>
・SSLで高まるWebサイトのセキュリティ
・CAに認証してもらうしくみ
9-2 SSLをインストールするには <OpenSSL>
・SSLってなに?
9-3 ApacheからSSLを使えるようにするには <mod_ssl>
・Apache 2の場合
・Apache 1.3の場合
9-4 テスト用の証明書を作成するには <サーバー証明書>
・証明書を作る
・Apacheを設定する(Apache 2の場合)
・Apacheを設定する(Apache 1.3の場合)
・クライアントからアクセスする
・本格的にSSLを利用したWebサーバーを運営するには
STEP UP <WebDAVを使ってみよう>

■第10章 ログを活用しよう
10-1 ログをチェックしよう <ログのチェックポイント>
・誰が何にアクセスしているかをチェック
・怪しいアクセスに注意する
・ログの解析ツールもある
10-2 アクセスログの記録項目を変えるには <LogFormat、CustomLog>
・フォーマットの指定方法
10-3 指定した条件でログを分けるには <環境変数による制御>
10-4 エラーログの記録項目を変えるには <LogLevel>
10-5 ログ中のIPアドレスをホスト名に変えるには <logresolve>
10-6 Cookieでユーザーを追跡するには <mod_usertrack>
10-7 ログを1日単位で切り替えるには <ログのローテーション>
・rotatelogsコマンドを使う場合
・OSの標準機能を使う場合
STEP UP <ログ解析ツールを使おう>

■第11章 サーバーを管理しよう
11-1 セキュリティに気をつけよう <セキュリティ対策>
・インターネットのサーバーはスキャンや攻撃を受ける
・Apacheで気をつけるべきこと
・その他の危険
11-2 動作状態をWebブラウザで確認するには <mod_status、mod_info>
・動作状況を確認する――mod_status
・設定情報を確認する――mod_info
11-3 サーバーの動作状態を確認するには <OSの観察>
・CPUの負荷の状態を見る
・プロセスの状態を見る
・ネットワークカードの状態を見る
・ネットワークがつながっているかを確認する
・ネットワークに関する状態を見る
・OSのログを見よう
11-4 ロボットからのアクセスを制限するには <robots.txt>
・収集されたくないディレクトリをrobots.txtで指定
・HTMLのmetaタグでも指定できる
11-5 性能を向上させるには <パフォーマンスチューニング>
・不要な設定を削れば性能は向上する
・ベンチマークでApacheの性能を測定しよう
・Keep-Aliveの調整
・待ち受けプロセス数の調整
・ApacheのMPMを選ぶ
・CGIやSSIを見直す
STEP UP <携帯向けサイトの違い>

■付録 設定項目リファレンス

バグ攻略で極めるWeb開発のツボ 現場で必要不可欠なバッドノウハウ

2010年12月13日 | Weblog
バグ攻略で極めるWeb開発のツボ 現場で必要不可欠なバッドノウハウ [大型本]
山城 拓明 (著), 渡利 良太郎 (著)
http://www.seshop.com/product/detail/10558/

大型本: 336ページ
出版社: 翔泳社 (2009/6/9)
言語 日本語
ISBN-10: 4798119091
ISBN-13: 978-4798119090
発売日: 2009/6/9
商品の寸法: 23 x 18 x 2.4 cm


序章 本書の読み方

Webシステムのバグ
Webシステムと本書の構成
PHP/JSPの基本構文
本書を読む上での注意点
Bug No.000 普通のバグ「不等号の記述ミス」

第1章 ブラウザとHTML

Bug No.001 テーブル上部の謎のスペース
Bug No.002 IEだけそろってくれない表示幅
Bug No.003 長文が送信できない問い合わせフォーム
Bug No.004 入力値の後半が消えるテキストボックス
Bug No.005 改行がどんどん増えるテキストエリア
Bug No.006 オフにできないチェックボックス
Bug No.007 [Enter]キーでの送信は更新されない更新画面
Bug No.008 外部JavaScriptファイルの修正が反映されない現象
Bug No.009 URLとファイルパスのバグ

第2章 JavaScriptと入力チェック

Bug No.010 表示データが1件のときだけ誤動作する必須チェック
Bug No.011 JavaScriptのグローバル変数汚染
Bug No.012 全角文字が素通りする半角英数字チェック
詳細解説  正規表現の利用例
Bug No.013 標準関数を使った数値チェックのバグ
Bug No.014 合計金額を再計算してくれない注文画面
詳細解説  Webシステムの入力チェック

第3章 PHP

Bug No.015 正しくないパスワードでログインできる認証処理
詳細解説  PHPでの比較の注意
Bug No.016 ログインIDもパスワードもなしでログインできる認証処理

第4章 Java

Bug No.017 他人の個人情報が見える会員情報画面
Bug No.018 日付のフォーマット処理でたまに発生する例外
詳細解説  サーバサイドJavaで書いてはいけない変数
Bug No.019 JSPを元に戻したのに画面が元に戻らない
Bug No.020 22億円の売上目標が達成できない財務システム
詳細解説  Javaの金額計算にはどの型を使うべきか
詳細解説  バグコード自動検出ツールFindBugs

第5章 データベースとSQL

Bug No.021 受注データが表示されなくなったバグ
Column:筆者の経験談 INのリストの上限超えバグ
Bug No.022 「_」が検索できないメールアドレス検索
Bug No.023 本日の売上が検索できない売上実績一覧画面
Bug No.024 時分秒が欠落するバグ(Oracle-JDBCドライバ)
詳細解説  日付と時刻のバグいろいろ
Column:筆者の経験談 飛行機墜落?ミサイル誤射?2000年問題の脅威
Bug No.025 予想外に遅い頭文字検索画面
詳細解説  SQLチューニングはじめの1歩
Bug No.026 楽観的ロックでの初期化漏れバグ
Bug No.027 300回表示するとシステムがダウンする検索画面
詳細解説  リソースリークの検出方法
Column:筆者の経験談 リソースリークの犯人は・・・

第6章 セキュリティ対策

Bug No.028 SQLインジェクション対策ミス!書き込みがすべて消えた掲示板
Bug No.029 スクリプトインジェクション攻撃によるなりすまし被害
Bug No.030 クロスサイトリクエストフォージェリ攻撃による強制投稿
詳細解説  Webシステムのセキュリティ対策

第7章 文字化けと文字コード

Bug No.031 metaタグを書いても文字化けが直らない
Bug No.032 新サーバで文字が化けたり「~」が逆になったり
詳細解説  文字コードと文字化け
Bug No.033 ダウンロードCSVの謎の点「・」
詳細解説  ファイルダウンロード機能の注意点

終章 バグにハマらないために

没バグ集
汎用的なバグの予防方法
本書のまとめ(最後に)

完全合格 応用情報技術者 午後問題集

2010年09月12日 | Weblog

  • 完全合格 応用情報技術者 午後問題集

  • 完全合格 応用情報技術者 午前問題集


Java問題サンプル解答 メソッド(2)

2010年07月15日 | Weblog
-------------------------------------------------
/**
 * 10. (基本選択法)
 * 要素数10のint型配列aにデータが入っている。
 * この配列要素を昇順に並べ替える。
 * (参考:午前中のテキストp.63の基本選択法を使う)
 */
public class Quiz1708 {
    public static void main(String[] args) {
        int[] a = {50, 30, 90, 40, 100, 10, 20, 60, 80, 70, };

        // 表示する
        System.out.print("整列前 = ");
        print(a);

        // 整列する
        sort(a);
        
        // 表示する
        System.out.print("整列後 = ");
        print(a);
    }

    /**
     * 指定された配列を昇順に並べ替える。
     * @param a 配列
     */
    static void sort(int[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            // 最大値を持つ添字を探す
            int maxIndex = 0;            // 最大値を持つ添字
            for (int j = 0; j < a.length - i - 1; j++) {
                if (a[j] > a[maxIndex]) {
                    maxIndex = j;
                }
            }
            
            // 最大値を持つ添字を範囲の最後と交換する
            if (a[a.length - i - 1] < a[maxIndex]) {
                int w = a[a.length - i - 1];
                a[a.length - i - 1] = a[maxIndex];
                a[maxIndex] = w;
            }
        }
    }

    /**
     * 指定された配列aの各要素を並べて表示する。
     * @param a 配列
     */
    static void print(int[] a) {
        System.out.print("[");
        for (int i = 0; i < a.length - 1; i++) {
            System.out.print(a[i] + ", ");
        }
        if (a.length > 0) {
            System.out.print(a[a.length - 1]);
        }
        System.out.println("]");
    }
}
/* 実行結果
整列前 = [50, 30, 90, 40, 100, 10, 20, 60, 80, 70, ]
整列後 = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, ]
*/

-------------------------------------------------
/**
 * 13. (文字列探索 - BM法) char型配列textにデータが入っている。
 * この文字配列textの中に、パターン文字列(char型配列pattern)を探索する。
 * あった場合は、patternの先頭文字と一致するtextの添字を返す。 
 * ない場合は、-1を返す。 (参考:午前中のテキストp.67のBM法を使う)
 */
public class Quiz1709 {
    public static void main(String[] args) {
        // テキスト
        String textString = "PQACZXYZRXYZ";
        char[] text = textString.toCharArray();

        // パターン
        String patternString = "XYZ";
        char[] pattern = patternString.toCharArray();

        // 表示する
        System.out.println("テキスト = [" + textString + "]");
        System.out.println("パターン = [" + patternString + "]");

        // 探索する
        int index = indexOf(text, pattern);

        // 結果を表示する
        System.out.print("index = " + index);
    }

    /**
     * @param text
     * @param pattern
     * @return
     */
    static int indexOf(char[] text, char[] pattern) {
        // スキップ表を作る
        int[] skip = new int[256];
        // デフォルト値を設定する
        for (int i = 0; i < skip.length; i++) {
            skip[i] = pattern.length;
        }
        // スキップ数を設定する
        for (int i = 0; i < pattern.length - 1; i++) {
            skip[pattern[i]] = pattern.length - i - 1;
        }

        // 探索する
        int index = -1;
        int i = 0;
        search: while (i <= text.length - pattern.length) {
            // パターンを後ろから見ていく
            int j;
            for (j = pattern.length - 1; (j >= 0) && (text[i + j] == pattern[j]); j--) {
            }
            
            // すべて一致すれば見つかった
            if (j < 0) {
                index = i;
                break search;
            }
            
            // 次の位置までスキップする
            int k = skip[text[i + j]] - (pattern.length - j - 1);
            if (k > 0) {
                i += k;
            } else {
                i += 1;
            }
        }
        return index;
    }
}
/*
実行例
 テキスト = [PQACZXYZRXYZ] 
パターン = [XYZ] 
index = 5

テキスト = [PQACZXYZRXYZ] 
パターン = [XYZW] 
index = -1
*/

-------------------------------------------------
import java.util.Scanner;

/**
 * Quiz0904で、じゃんけんの勝敗表(2次
 * 元配列)をつくり、勝負するロジックを簡単
 * にする。
 * また、指定した手も、数字ではなく、日本語
 * 表記(グー、チョキ、パー)で表示すること。
 * --------- ------- -------- --------
 * 勝敗表    0 グー  1 チョキ  2 パー
 * --------- ------- -------- --------
 * 0 グー    引分け    勝ち     負け
 * 1 チョキ   負け    引分け    勝ち
 * 2 パー     勝ち     負け    引分け
 * --------- ------- -------- --------
 */
public class Quiz1710 {
    public static void main(String[] args) {
        String[] HAND = {"グー", "チョキ", "パー"};
        String[] JUDGE = {" あなたの負けです。", " 引き分けです。", " あなたの勝ちです。"};
        
        // 標準入力を準備する
        Scanner sin = new Scanner(System.in);

        // じゃんけんの手を入力する
        System.out.print("じゃんけんの手(0:グー、 1:チョキ、 2:パー )を入力してください => ");
        int userTe = sin.nextInt(); // 標準入力から手を入力する
        int computerTe = (int) (Math.random() * 3); // コンピューターの手

        // 勝負する
        int judge = judge(userTe, computerTe);        // 勝敗結果 -1: 負け、0: 引分け、1: 勝ち

        // 結果を表示する
        System.out.print("あなた: " + HAND[userTe] + ", コンピューター: " + HAND[computerTe]);
        System.out.println(JUDGE[judge + 1]);
    }
    
    /**
     * 2つのじゃんけんの手の勝負結果を返す。
     * @param te1 手1
     * @param te2 手2
     * @return 手1が負けたとき-1、引分けのとき0、勝ったとき1
     */
    static int judge(int te1, int te2) {
        int[][] JUDGE = {
                { 0,  1, -1},     // ぐー
                {-1,  0,  1},     // ちょき
                { 1, -1,  0},     // ぱー
        };
        
        return JUDGE[te1][te2];
    }
}
/* 実行結果例
じゃんけんの手(0:グー、 1:チョキ、 2:パー )を入力してください => 0
あなた: グー, コンピューター: グー 引き分けです。
*/

-------------------------------------------------

import java.util.Scanner;

/**
 * 23.重さに対する料金を出す。
 * 6×2の配列の、1列目に重さ、2列目に料金が
 * 入っている。
 * なお、重さは、下の表では以下をあらわす。
 * たとえば、200gに対しては、190円になる。
 * 2000gより重い場合は、一律に2000円とする
 * 
 *     ------- ----
 *     重さ    料金
 *     ------- ----
 * [0]  100     100
 * [1]  200     190
 * [2]  400     370
 * [3]  600     550
 * [4] 1000     900
 * [5] 2000    1700
 *     ------- ----
 */
public class Quiz1711 {
    public static void main(String[] args) {
        String buffer;    // データを入力するバッファー

        int WEIGHT_RATE[][] = {    // 重量-料金表
                { 100,  100},
                { 200,  190},
                { 400,  370},
                { 600,  550},
                {1000,  900},
                {2000, 1700},
        };

        int weight;              // 重量

        // 標準入力を設定する
        Scanner in = new Scanner(System.in);

        // データを入力する。
        System.out.printf("重量を入力してください。");
        buffer = in.nextLine();
        weight = Integer.parseInt(buffer);

        // 料金を引く
        int rate = rate(WEIGHT_RATE, weight);

        // 結果を表示する
        System.out.println(weight + " g の料金は " + rate + " 円です。");
    }

    /**
     * 料金表と重さを渡して、その重さに対する料金を返す。
     * @param rateTable 料金表
     * @param weight 重さ
     * @return 重さに対する料金。表にない場合は、2000.
     */
    private static int rate(int[][] rateTable, int weight) {
        for (int i = 0; i < rateTable.length; i++) {
            if (weight <= rateTable[i][0]) {
                return rateTable[i][1];
            }
        }
        return 2000;
    }
}
/* 実行結果例
>java Quiz1711
重量を入力してください。50
50 g の料金は 100 円です。

>java Quiz1711
重量を入力してください。100
100 g の料金は 100 円です。

>java Quiz1711
重量を入力してください。150
150 g の料金は 190 円です。

>java Quiz1711
重量を入力してください。2000
2000 g の料金は 1700 円です。

>java Quiz1711
重量を入力してください。2001
2001 g の料金は 2000 円です。
*/
-------------------------------------------------


Java問題サンプル解答 メソッド(1)

2010年07月14日 | Weblog
1. BMI を計算するメソッド
(参考: Quiz0602.java)

    static double bmi(double height, double weight)

2. int型配列の要素を順に表示するメソッド。

    static void print(int[] a)

3. 配列aの各要素を1つずらした配列を返す
メソッド。(参考: Quiz1603.java)
    a[0]→b[1]、a[1]→b[2]、・・・ 
    a[8]→b[9]、a[9]→b[0]

    static int[] rotate(int[] a)

int型配列の要素を順に並べて文字列化する
メソッド。

    static String toString(int[] a)

4.西暦年yearを渡して、その年がうるう年
かどうかを判断するメソッド。
(参考: Quiz0704.java)

    static boolean isLeap(int year)

5.月(1~12)monthを渡して、その月の日数
を返すメソッド。
(参考: Quiz1606.java)

    static int daysOf(int month)

6. (線形探索)
int型配列aとint型データを渡して、その
データが配列要素にあれば、そのときの添字
を返すメソッド。なければ、-1を返す。
(参考: Quiz1607.java)

    static int sequentialSearch(int[] a, int data)

7. (二分探索)
int型配列aとint型データを渡して、その
データが配列要素にあれば、そのときの添字
を返すメソッド。なければ、-1を返す。
(参考: Quiz1608.java)

    static int binarySearch(int[] a, int data)

8. (整列)
int型配列aを順番に並べ替えるメソッド。
アルゴリズムは、基本交換法、基本選択法、
基本挿入法のいずれを使ってもよい。
(参考: Quiz1609.java、 Quiz1610.java、 
Quiz1611.java)

    static void sort(int[] a)

9. (文字列探索)
char型配列textにデータが入っている。
この文字配列textの中に、パターン文字列
(char型配列pattern)を探索するメソッド。
あった場合は、patternの先頭文字と一致す
るtextの添字を返す。ない場合は、-1を返す。
アルゴリズムは、力まかせ探索法、BM法のい
ずれを使ってもよい。
(参考: Quiz1612.java、 Quiz1613.java)

    static int indexOf(char[] text, char[] pattern)

10. じゃんけんの手を2つ渡して、勝敗を返
すメソッド。
第1引数が勝った場合1、引分け0、負けた場
合-1を返す。
(参考: Quiz1621.java)

    static int judge(int te1, int te2)

11.料金表と重さを渡して、その重さに対す
る料金を返す。
(参考: Quiz1623.java)

    static int rate(int[][] rateTable, int weight)


-------------------------------------------------
/**
 * BMI を計算し、表示する。
 *   体重 / 身長の2乗
 */
public class Quiz1701 {
    public static void main(String[] args) {
        System.out.println("BMI = " + bmi(1.62, 55));
    }

    static double bmi(double height, double weight) {
        return weight / (Math.pow(height, 2));
    }
}
/* 実行結果
BMI = 20.957171162932475
*/

-------------------------------------------------
/**
 * 配列aの各要素を1つずらして、配列bにコピーする。
 *         a[0]→b[1]、a[1]→b[2]、・・・ a[8]→b[9]、a[9]→b[0]
 */
public class Quiz1703 {
    public static void main(String[] args) {
        int[] a = {5, 3, 7, 9, 0, 1, 2, 8, 4, 6, };
        int[] b = new int[a.length];

        // 表示する。
        System.out.print("a = ");
        print(a);

        // ずらしてコピーする。
        b = rotate(a);

        // 表示する。
        System.out.print("b = ");
        print(b);
    }

    /**
     * 指定された配列aの各要素を1つずらして、新しい配列を作って返す。
     * @param a 配列
     * @return 要素を1つずらした配列
     */
    static int[] rotate(int[] a) {
        int[] b = new int[a.length];
        for (int i = 0; i 
            b[(i + 1) % b.length] = a[i];
        }
        return b;
    }

    /**
     * 指定された配列aの各要素を並べて表示する。
     * @param a 配列
     */
    static void print(int[] a) {
        System.out.print("[");
        for (int i = 0; i 
            System.out.print(a[i] + ", ");
        }
        if (a.length > 0) {
            System.out.print(a[a.length - 1]);
        }
        System.out.println("]");
    }
}
/*
a = [5, 3, 7, 9, 0, 1, 2, 8, 4, 6]
b = [6, 5, 3, 7, 9, 0, 1, 2, 8, 4]
*/

-------------------------------------------------
/**
 * 西暦年を指定し、この西暦年がうるう年かどうかを表示する
 *         西暦年が4の倍数ならうるう年
 *         上記の条件でも、100の倍数なら平年
 *         上記の条件でも、400の倍数ならうるう年
 *         どの条件にも当てはまらなければ平年
 */
public class Quiz1704 {
    public static void main(String[] args) {
        int year = 2010;    // 西暦年

        // 結果を表示する
        if (isLeap(year)) {
            System.out.println(year + " 年はうるう年です。");
        } else {
            System.out.println(year + " 年は平年です。");
        }
    }

    /**
     * 西暦年を指定し、この西暦年がうるう年かどうかを判断する。
     * @param year 西暦年
     * @return うるうどしのときtrue、平年のときfalse
     */
    static boolean isLeap(int year) {
        return (year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0));
    }
}
/* 実行結果
2010 年は平年です。
*/
/* 疑似コード


*/

-------------------------------------------------
/**
 * 月(1~12)を指定して、その月の日数を表示する
 */
public class Quiz1705 {
    public static void main(String[] args) {
        int month = 6;    // 月
        
        // 結果を表示する
        System.out.println(month + " 月は " + daysOf(month) + " 日です。");
    }
    
    /**
     * 月(1~12)を指定して、その月の日数を返す。
     * @param month 月
     * @return 指定された月の日数
     */
    static int daysOf(int month) {
        int[] DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        return DAYS[month - 1];
    }
}
/* 実行結果
6 月は 30 日です。
*/

-------------------------------------------------
/**
 * 7. (線形探索)
 * 要素数10のint型配列aにデータが入っている。
 * コマンドライン引数で、整数値を指定して、その数値が配列要素にあるかどうか、
 * あれば、そのときの添字を表示する。
 * (参考:午前中のテキストp.58の線形探索)
 */
public class Quiz1706 {
    public static void main(String[] args) {
        int key = Integer.parseInt(args[0]);
        int[] a = {50, 30, 90, 40, 100, 10, 20, 60, 80, 70, };

        // 探索する
        int index = sequentialSearch(a, key);

        // 結果を表示する
        if (index >= 0) {
            System.out.println(key + " はありました。(index = " + index + ")");
        } else {
            System.out.println(key + " はありませんでした。");
        }
    }

    /**
     * 指定された配列の中から、指定されたデータを探す。
     * @param a 被検索の配列
     * @param key 検索データ
     * @return 見つかった場合、その添字、見つからなかった場合-1
     */
    static int sequentialSearch(int[] a, int key) {
        for (int i = 0; i 
            if (a[i] == key) {
                return i;
            }
        }
        return -1;
    }
}
/* 実行結果
>java Quiz1706 10
10 はありました。(index = 5)

>java Quiz1706 50
50 はありました。(index = 0)

>java Quiz1706 70
70 はありました。(index = 9)

>java Quiz1706 55
55 はありませんでした。
*/

-------------------------------------------------
/**
 * 7. (二分探索)
 * 要素数10のint型配列aにデータが入っている。このとき、要素の値は昇順に入っている。
 * コマンドライン引数で、整数値を指定して、その数値が配列要素にあるかどうか、
 * あれば、そのときの添字を表示する。
 * (参考:午前中のテキストp.58の二分探索)
 */
public class Quiz1707 {
    public static void main(String[] args) {
        int key = Integer.parseInt(args[0]);
        int[] a = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, };

        // 探索する
        int index = binarySearch(a, key);

        // 結果を表示する
        if (index >= 0) {
            System.out.println(key + " はありました。(index = " + index + ")");
        } else {
            System.out.println(key + " はありませんでした。");
        }
    }

    /**
     * 指定された配列の中から、指定されたデータを探す。
     * @param a 被検索の配列。要素は昇順にソートされていなければならない。
     * @param key 検索データ
     * @return 見つかった場合、その添字、見つからなかった場合-1
     */
    static int binarySearch(int[] a, int key) {
        int lowerIndex = 0;
        int upperIndex = a.length - 1;
        int middleIndex;
        while (lowerIndex <= upperIndex) {
middleIndex = (lowerIndex + upperIndex) / 2; if (a[middleIndex] <key) { key) { upperIndex = middleIndex - 1; } else { return middleIndex; } } return -1; } } /* 実行結果 >java Quiz1707 10 10 はありました。(index = 0) >java Quiz1707 50 50 はありました。(index = 4) >java Quiz1707 100 100 はありました。(index = 9) >java Quiz1707 55 55 はありませんでした。 */ -------------------------------------------------


Java問題 サンプル解答 2次元配列

2010年07月12日 | Weblog
--------------------------------------------------
import java.util.Scanner;

/**
 * Quiz0904で、じゃんけんの勝敗表(2次
 * 元配列)をつくり、勝負するロジックを簡単
 * にする。
 * また、指定した手も、数字ではなく、日本語
 * 表記(グー、チョキ、パー)で表示すること。
 * --------- ------- -------- --------
 * 勝敗表    0 グー  1 チョキ  2 パー
 * --------- ------- -------- --------
 * 0 グー    引分け    勝ち     負け
 * 1 チョキ   負け    引分け    勝ち
 * 2 パー     勝ち     負け    引分け
 * --------- ------- -------- --------
 */
public class Quiz1621 {
    public static void main(String[] args) {
        String[] HAND = {"グー", "チョキ", "パー"};
        int[][] JUDGE = {
                { 0,  1, -1},     // ぐー
                {-1,  0,  1},     // ちょき
                { 1, -1,  0},     // ぱー
        };
        
        // 標準入力を準備する
        Scanner sin = new Scanner(System.in);

        // じゃんけんの手を入力する
        System.out.print("じゃんけんの手(0:グー、 1:チョキ、 2:パー )を入力してください => ");
        int userTe = sin.nextInt(); // 標準入力から手を入力する
        int computerTe = (int) (Math.random() * 3); // コンピューターの手

        // 勝負する
        int judge = JUDGE[userTe][computerTe];        // 勝敗結果 -1: 負け、0: 引分け、1: 勝ち

        // 結果を表示する
        System.out.print("あなた: " + HAND[userTe] + ", コンピューター: " + HAND[computerTe]);
        if (judge == 0) {
            System.out.println(" 引き分けです。");
        } else if (judge > 0) {
            System.out.println(" あなたの勝ちです。");
        } else {
            System.out.println(" あなたの負けです。");
        }
    }
}

--------------------------------------------------
import java.util.Scanner;

/**
 * 1000円でお釣りをもらう。お釣りの硬貨は最低枚数とする。
 * 6×2の配列の、2列目に、それぞれのお釣りの枚数を入れるアルゴリズムを作りなさい
 * 1列目には硬貨の種類があらかじめ入っているものとする。
 */
public class Quiz1622 {
    public static void main(String[] args) {
        String buffer;    // データを入力するバッファー

        int coins[][] = {    // 硬貨を数える配列
                {1, 0},
                {5, 0},
                {10, 0},
                {50, 0},
                {100, 0},
                {500, 0},
        };

        int mony;              // 金額
        int change;            // お釣り

        // 標準入力を設定する
        Scanner in = new Scanner(System.in);

        // データを入力する。
        System.out.printf("金額を入力してください。");
        buffer = in.nextLine();
        mony = Integer.parseInt(buffer);

        // お釣り
        change = 1000 - mony;
        System.out.println("金額は " + mony + " 円、お釣りは " + change + " 円です。");

        // 枚数を数える
        for (int i = coins.length - 1; i >= 0; i--) {
            coins[i][1] = change / coins[i][0];
            change %= coins[i][0];
        }

        // 枚数を表示する
        for (int i = 0; i < coins.length; i++) {
            System.out.println(coins[i][0] + " 円硬貨は " + coins[i][1] + " 枚です。");
        }
    }
}

--------------------------------------------------
import java.util.Scanner;

/**
 * 23.重さに対する料金を出す。
 * 6×2の配列の、1列目に重さ、2列目に料金が
 * 入っている。
 * なお、重さは、下の表では以下をあらわす。
 * たとえば、200gに対しては、190円になる。
 * 2000gより重い場合は、一律に2000円とする
 * 
 *     ------- ----
 *     重さ    料金
 *     ------- ----
 * [0]  100     100
 * [1]  200     190
 * [2]  400     370
 * [3]  600     550
 * [4] 1000     900
 * [5] 2000    1700
 *     ------- ----
 */
public class Quiz1623 {
    public static void main(String[] args) {
        String buffer;    // データを入力するバッファー

        int WEIGHT_RATE[][] = {    // 重量-料金表
                { 100,  100},
                { 200,  190},
                { 400,  370},
                { 600,  550},
                {1000,  900},
                {2000, 1700},
        };

        int weight;              // 重量

        // 標準入力を設定する
        Scanner in = new Scanner(System.in);

        // データを入力する。
        System.out.printf("重量を入力してください。");
        buffer = in.nextLine();
        weight = Integer.parseInt(buffer);

        // 料金を引く
        int rate = 2000;                // 料金
        for (int i = 0; i < WEIGHT_RATE.length; i++) {
            if (weight <= WEIGHT_RATE[i][0]) {
                rate = WEIGHT_RATE[i][1];
                break;
            }
        }

        // 結果を表示する
        System.out.println(weight + " g の料金は " + rate + " 円です。");
    }
}

--------------------------------------------------