Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Mac 生成带密码的zip文件

  1. create a folder

  • cd folderPath
  • mkdir folderName
  1. create zip file and set password

  • zip -er filename.zip folderPath
  • input/confirm password

Python yeild

1
2
3
4
5
6
7
8
9
def myGenerator(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1

for i in myGenerator(10):
print(i)

带有yeild的函数就是generator。yeild每次被执行到,都会返回一个迭代值。下一次执行时从yeild所在的下一个语句继续执行。

CLIでVue.jsを作る

事前準備として、nodeをインストールする。

以下のコマンドを使って、バージョン確認する。

1
2
node -v
npm -v

バージョン古いときは以下のコマンドで更新できる。

1
npm -g install npm

次のステップはvue-vliのインストール。

1
npm install -g @vue/cli

2.x バージョンのvueは npm install -g vue-cliでインストールする

次はプロジェクトの親フォルダーへ移動して、プロジェクトを作る。

Webページのプロジェクトを作るため、以下のコマンドを実行する。

1
vue init webpack myVueProject

プロジェクト名などはディフォルで設定してくれるので、エンターキー連発でいい。
router testなどの機能も初期化したい場合は、該当の確認で Y を入力すればいい。

これで、Vue.jsのプロジェクト作成完了。

最後は npm run buildでビルドして、 npm run devでサーバーを起動すればいい。

Vue.js プロジェクトの構造

Vue.jsプロジェクトファイルの構造とVueファイルの構造をメモする。

Vue.jsプロジェクトの構造

  • src
    • components: 各モジュールはここで定義する
    • main.js: 入り口のjs
    • router
      • index.js: ルーター設定
    • App.vue
    • assets: 画像などのリソース
  • index.html: 画面入り口
  • static: 静的リソース
  • test
  • config
    • index.js: 各種設定
  • build
  • package.json
  • node_modules

Vueファイルの構造

Vueファイルは以下3つの部分がある。

[1]HTML

1
2
3
4
5
6
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>

[2]JavaScript

1
2
3
4
5
6
7
8
9
10
<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
name: 'App',
components: {
HelloWorld
}
}
</script>

[3]css

1
2
3
4
5
6
7
8
9
10
11
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

JUnit5から使える @ParameterizedTest

@ParameterizedTestは指定のテストメソッドに違う引数を順番に渡して処理することで、複数のテストを実現する方法。
JUnit5の新しい機能として、使うとき以下のパッケージを依存関係に追加する必要がある。

1
org.junit.jupiter:junit-jupiter-params

使ってみる

@ParameterizedTestでパラメーター指定のテストケースを声明する。そして@ValueSourceを利用してパラメーターを指定する(整数:1,2,3)。

1
2
3
4
5
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void test(int i) {
System.out.println(i);
}

これで1つのメソッドでテストを3回実行した。
@ParameterizedTestorg.junit.jupiter.params.providerパッケージ下のインタフェースと一緒に使う必要がある。

DisplayName of ParameterizedTest

@ParameterizedTestはパラメーターごとにテストケースを命名できる。

1
2
3
4
5
6
@ParameterizedTest(name = "input is {0} {1} {2}")
@CsvSource(value = {"1,a,true"})
void test(int a, String b, boolean c) {

}

使えるplaceholderは以下となる。

  • {index} テストケースの番号
  • {0~n} 指定番号の引数の値(0から)
  • {arguments} 全ても引数
  • {displayName} @DisplayNameで指定する内容、@DisplayNameがない場合はテストメソッドの名前

InjectMocksのインジェクト方法

テスト対象のインスタンスに @InjectMocksをつけると、対象インスタンスのフィルドに@Mockされたインスタンスを差し込むことができる。

1
2
3
4
5
@InjectMocks
Manager manager;

@Mock
Name name; // manager.nameはモックされる

実現方法

InjectMocksのJavadocを読むと、フィルドのinject方法は3つあります。

  1. Constructor injection;
    1つ目はコンストラクターを利用してモックインスタンスを設定する。この方法はデフォルトで引数の数が一番多いコンストラクターを利用する。
    要注意なことは、必要なモックインスタンスが見つからない場合、その引数はnullとなる。
    引数にモックできないタイプ(基本型)がある場合、デフォルトのコンストラクターでInjectMocksのインスタンスを作って別の方法でInjectを実現する。

  2. Property setter injection;
    2つ目はとてもわかりやすくて、フィルドのsetterメソッドを利用して、モックインスタンスを差し込む。
    該当のsetterメソッドを探すとき、まずフィルドのタイプを利用する。同じタイプのフィルドが存在する場合、モックインスタンスの名前を利用する。
    という理由で、モックインスタンスを定義するとき、できる限りInject対象のフィルドと同じ名前にする方がいい。
    Constructor Injectionでデフォルトコンストラクターを利用する場合、モックインスタンスの差し込むはこの方法で実現される。

  3. Field injection;
    フィルドのsetterがない場合、直接設定でInjectを実現する。ルールはProperty setter injectionと同じ。

Mockito使い始めて見る

Mockitoはクラスの偽のオブジェクトを作ってくれます。

when().thenReturn()を利用して、publicメソッドの戻る値を指定できます。

1
2
3
4
5
6
@Test
public void add_with_when() {
List<String> mockedList = mock(List.class);
when(mockedList.size()).thenReturn(10);
assertThat(mockedList.size(), is(10));
}

ここは1つ注意しなければならないことがあります。モックで作成したオブジェクトの全てのメソッドが偽物になります。下記のadd()はモックされたため、リストに追加する処理はありません。

1
2
3
4
5
6
7
@Test
public void add_without_when() {
List<String> mockedList = mock(List.class);
mockedList.add("A");
mockedList.add("B");
mockedList.add("C");
assertThat(mockedList.size(), is(0));

Answers.CALL_REAL_METHODSを利用すれば、本物のメソッドを呼べます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void call_real_method() {
Employee employee = mock(Employee.class, Answers.CALLS_REAL_METHODS);
employee.setName(new Name("Alice"));
assertThat(employee.getName(), is("Alice"));
}

@Test
public void call_real_method_with_when() {
Employee employee = mock(Employee.class, Answers.CALLS_REAL_METHODS);
employee.setName(new Name("Alice"));
when(employee.getName()).thenReturn(new Name("Bob"));
assertThat(employee.getName(), is("Bob"));
}

web.xml 的Servlet配置

web.xml中servlet配置及其含义

什么是 web.xml

web.xml是Java工程中用来设置初始化配置信息的文件。xml的书写规则是有Schema文件来定义的。

web.xml使用的schema一般是Sun定义的,标注在标签<web-app>中。

web.xml中设置Servlet的常用标签

【1】servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- servlet的配置 -->
<servlet>
<!-- 定义servlet的内部名称 -->
<servlet-name></servlet-name>
<!-- servlet的类名 此处为全路径-->
<servlet-class></servlet-class>
</servlet>

<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- 对应上面定义的servlet内部名称 -->
<servlet-name></servlet-name>
<!-- servlet的映射路径 -->
<url-pattern></url-pattern>
</servlet-maping>

配置servlet标签需要配置两个,一个是servlet本身,另一个servlet-mapping是servlet的映射信息。
servlet的servlet-name可以自定义,一般为servlet的类名,而servlet-class则是servlet类的全路径。
servlet-mapping的servlet-name是对应的servlet名,url-pattern则是我们输入到浏览器地址栏中的用来调用servlet的url。

url-pattern
精确匹配 /servlet
模糊匹配 /*
模糊匹配 /path/*
模糊匹配 *.后缀

url-pattern除了上面的基本写法之外,还要注意几点:

  1. / 或者 *, url不能直接用servlet名开头。
  2. 同时使用两种模糊匹配是非法路径
  3. 匹配优先级:精确匹配最优先,后缀匹配最后

【2】初始参数

可以设置两种参数用来初始化servlet,一种是init-param,一种时context-param。
关于两种参数的区别:init-param and context-param

init-param是给特定servlet设置的参数,所以写在<servlet>下面

1
2
3
4
5
6
7
8
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>Alice</param-value>
</init-param>
</servlet>

使用的时候通过getServletConfig().getInitParamter("userName")来调用。

context-param是为webApp全局准备的参数,直接定义在<web-app>标签下,通过getServletContext().getInitParamter("userName")来调用

1
2
3
4
5
6
7
<web-app>
<context-param>
<param-name>userName</param-name>
<param-value>Alice</param-value>
</context-param>

</web-app>

【3】特殊标签

  1. 错误处理
1
2
3
4
5
6
7
8
9
10
11
<error-page> 
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>

...

<error-page>
<exception-type>java.lang.Exception<exception-type>
<location>/exception.jsp<location>
</error-page>
  1. 过滤器
1
2
3
4
5
6
7
8
<filter> 
<filter-name> </filter-name>
<filter-class> </filter-class>
</filter>
<filter-mapping>
<filter-name> </filter-name>
<url-pattern> </url-pattern>
</filter-mapping>
  1. 监听器
1
2
3
<listener> 
<listener-class></listener-class>
</listener>
  1. 会话
1
2
3
4
<session-config> 
<!-- 以分为单位 -->
<session-timeout> </session-timeout>
</session-config>
  1. 欢迎页

找不到index1,就会加载index2

1
2
3
4
<welcome-file-list>
<welcome-file>index1.jsp</welcome-file>
<welcome-file>index2.jsp</welcome-file>
</welcome-file-list>

Servlet 基础

内容总结自网络。

定义

Servlet(Server Applet) 可以翻译为Java小服务程序或者服务连接器。是用Java编写的服务器端程序,具有独立于平台和协议的特性。主要的功能是交互式地浏览和生成数据,生成动态Web内容。

狭义的Servlet是指Java的一个接口,广义的Servlet是指任何实现了这个接口的类。从原理上讲Servlet可以响应任何类型的请求,但绝大多数情况侠Servlet只用来扩展基于HTTP协议的Web服务器。

实现过程

Servlet交互式地浏览和生成数据的过程为:

  1. 客户端发送请求到服务器
  2. 服务器将请求信息发送至Servlet
  3. Servlet生成响应内容并传给服务器。
  4. 服务器将响应返回客户端

生命周期

  1. 客户端请求Servlet
  2. 加载Servlet到内存
  3. 生成Servlet实例,调用init()初始化
  4. server调用service()方法,将一个请求对象和一个响应对象传递给service()
  5. service()调用资源处理请求,使用响应对象的方法将响应传回server,再传回到客户端
  6. (一般是server关闭时)调用destroy()方法