12月4日

Submitする前に確認ダイアログを表示したい場合

<input type='submit'  value='送信' onclick='return confirm("よろしいですか?");'/>

HSQLDBでカラムの定義を変更したい場合
HSQLDBのSQL文法ドキュメントでALTER TABLEのところを見る。
Chapter 9. SQL Syntax

サンプルがいくつかあるので、マネすればできるはず!

例:

alter table mydata alter column memo clob

12月1日

SpringMVCでファイルアップロードをするための設定

tomcatのcontext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
--><!-- The contents of this file will be loaded for each web application -->
<Context allowCasualMultipartParsing="true">

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
</Context>

WEB-INF/web.xml

	<filter>
    	<filter-name>MultipartFilter</filter-name>
    	<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
	</filter>
	<filter-mapping>
    	<filter-name>MultipartFilter</filter-name>
    	<url-pattern>/*</url-pattern>
	</filter-mapping>

application-config.xml

    <bean id="multipartResolver"
		class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
	</bean>

11月27日

YAGNI

YAGNI – Wikipedia
You ain’t gonna need it

機能は実際に必要となるまでは追加しないのがよい

ソースコードは短い方が良い。→ 読みやすい・理解しやすい・バグが出にくい

とりあえずテストにパスするコードを書いて、あとのリファクタリングでソースコードを整理するというやり方でもよい。

KISSの原則

KISSの原則
Wikipedia の YAGNI のページに関連リンクがある。

Keep it simple stupid の略語。

ファイルアップロード

ファイルアップロードは、Springの公式サイトに書いてある実装がわかりやすい。

Getting Started · Uploading Files – Spring

ファイルを保存する処理は、Webページには書かれてなく、ZIPファイルをダウンロードした中の FileSystemStorageService クラス内にある。
Serviceクラスを作ってもいいが、必要な部分をコントローラにコピーしてもよい。

@RequestMapping(value = "アップロード先URL", method = RequestMethod.POST)
public String handleFileUpload(@RequestParam("file") MultipartFile file, Model model) {
        // file を保存
        String filename = StringUtils.cleanPath(file.getOriginalFilename());
        try {
            if (file.isEmpty()) {
                throw new StorageException("空のファイルです " + filename);
            }
            if (filename.contains("..")) {
                // This is a security check
                throw new StorageException("ファイル名に「..」が含まれてます " + filename);
            }
            Files.copy(file.getInputStream(), Paths.get("保存先ファイル名"),
                    StandardCopyOption.REPLACE_EXISTING); // 上書き
        } catch (IOException e) {
            throw new StorageException("Failed to store file " + filename, e);
        }
        return "uploadcomplete"; // 完了後に表示するjsp
    }

11月20日

発表に使用するパソコンについて

発表で使用するパソコンは、教師用を使用する。
パワーポイントのファイルは、各グループのBacklogにアップロードし、そのファイルに教師用パソコンから開く。

作成したWebアプリのデモは、各グループの誰かのパソコン上で動作しているものを使用する。
パソコンの液晶の裏側に貼ってあるホスト名(pck403xx)にアクセスすれば、教室内の全員がそこで動作するWebアプリを使用できる。

発表用パワーポイント
発表に使用するパワーポイントは、以下のテンプレートを使用すること。

発表資料

10月27日

新しいデータベースインスタンスを作成する方法

hsqldb.bat を編集して引数を追加する。
インスタンスを識別できるように、番号を割り振る。
割り振った番号Nを、引数で割り当てる。

  • –database.N db/dbname
  • –dbname.N dbname
cd C:\pleiades45\hsqldb-2.3.4\hsqldb\lib
java -cp hsqldb.jar org.hsqldb.Server --database.0 db/mydata --dbname.0 mydata --database.1 db/hoge --dbname.1 hoge

HSQLDBを再起動すると、複数のデータベースインスタンスが作られていることがわかる。

[Server@28a418fc]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@28a418fc]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@28a418fc]: Startup sequence initiated from main() method
[Server@28a418fc]: Could not load properties from file
[Server@28a418fc]: Using cli/default properties only
[Server@28a418fc]: Initiating startup sequence...
[Server@28a418fc]: Server socket opened successfully in 10 ms.
[Server@28a418fc]: Database [index=0, id=0, db=file:db/hoge, alias=hoge] opened
successfully in 555 ms.
[Server@28a418fc]: Database [index=1, id=1, db=file:db/mydata, alias=mydata] ope
ned successfully in 106 ms.
[Server@28a418fc]: Startup sequence completed in 683 ms.
[Server@28a418fc]: 2017-10-27 11:01:48.200 HSQLDB server 2.3.4 is online on port
 9001
[Server@28a418fc]: To close normally, connect and execute SHUTDOWN SQL
[Server@28a418fc]: From command line, use [Ctrl]+[C] to abort abruptly

10月2日

これからのチーム開発のやりかた

  1. 毎朝、それぞれが取り組む課題を決定する。
  2. Backlogに課題を登録する。
  3. 課題を「未対応」→「処理中」に変更する。
  4. 課題に取り組む。
  5. ファイルを新規で作った場合はGitに追加する。
  6. 終わったらGitにコミットする(コミットメッセージは課題のIDのみ)
  7. 課題を「処理中」→「処理済み」に変更する。
  8. チームのほかのメンバーに確認してもらう。
  9. 確認したメンバーが課題を「処理済み」→「完了」に変更する。
  10. Backlogのリモートリポジトリにプッシュする。
  11. ほかのメンバーにプッシュしたことを伝え、プルしてもらう。
  12. 1に戻る。

課題の内容は、当日(1~2現の3時間)で完了できる内容にすること。

課題のタイトルは、ロバストネス図に書いた、画面・コントローラ・エンティティなどを書いて、それに対してどのような変更をするのかを記載し、課題で何を解決しようとしているのかが一目でわかるようにすること。

課題の詳細欄には、変更する具体的な内容や、変更するファイル名などを記載する。タイトルだけでわかるのであれば、書かなくてもよい。

9月15日

SpringMVCにおけるユーザー認証

SpringMVCでは、spring-securityを使ってユーザー認証を行う。
そのために、pom.xmlに以下の内容を追加する。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>4.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>4.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>4.0.1.RELEASE</version>
</dependency>

web.xmlの最後にフィルターを追加する。

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
  
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

src/main/resources/spring フォルダに、spring-security.xml を作成する。

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-4.0.xsd">
  
    <http pattern="/" security="none"/>
    <http pattern="/index.jsp" security="none"/>
    <http auto-config="true" >
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <form-login />
        <logout />
    </http>
  
    <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <beans:property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver" />
        <beans:property name="url" value="jdbc:hsqldb:hsql://localhost/mydata" />
        <beans:property name="username" value="sa" />
        <beans:property name="password" value="" />
    </beans:bean>
  
    <!-- ユーザとROLEを定義 -->
    <authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"
                 users-by-username-query="SELECT user_name, password, enabled FROM users WHERE user_name = ?"
                 authorities-by-username-query="SELECT user_name, role FROM users WHERE user_name = ?" />
        </authentication-provider>
    </authentication-manager>
</beans:beans>

ユーザーとユーザの権限を管理するためのテーブルを作成する。

CREATE TABLE users(
 user_id bigint NOT NULL identity,
 user_name varchar(50) NOT NULL,
 password varchar(50) NOT NULL,
 enabled tinyint NOT NULL,
 role varchar(100) NOT NULL
);

USERSテーブルにテスト用のユーザーを登録する。

INSERT INTO users ( user_name , password , enabled, role)
   VALUES ( 'taro', 'abcd' , 1, 'ROLE_USER' );

チーム開発

チームで開発するWebアプリケーションを決めよう!

  • 2ちゃんねる
  • Twitter
  • LINE
  • Wiki
  • EC(ネットショップ)

以下のことを決めよう。

  • 作成するサービスを決める(候補を出す)
  • チーム名を決める
  • リーダーを決める
  • サービスの名前(プロジェクト名)を決める
  • 基本的な画面遷移図(ロバストネス図)を作成する

ロバストネス図は、astah community で作れる。

チーム1

チーム名:やりたい
リーダー:西田
サービス名:やりたま
プロジェクト名:Yaritama

チーム2

チーム名:ナイトプール
リーダー:中尾
サービス名: 写真共有アプリ
プロジェクト名: PhotoSharing

チーム3

チーム名:ボビーオロゴン
リーダー:前田
サービス名:診断メーカー
プロジェクト名:ShindanMaker

チーム4

チーム名:ママ、早く!
リーダー:山本
サービス名:掲示板
プロジェクト名:3chan

チーム5

チーム名:ゲームウィキ麻生支部
リーダー:宮崎
サービス名:ゲームウィキ
プロジェクト名:GameWiki