alphaのjava備忘録

alphaが勉強したことを書いていくブログ

「プロを目指す人のためのRuby入門」メモ

・ヒアドキュメント	(<<TEXT  TEXT)
・()を省略したメソッドでも、引数間のカンマは必要(method val1, val2)
・''で囲わない文字列はすべてリテラルではない!
・= ⇔ == は見間違えないように(代入⇔等号演算子)
・a=b(object_idが同一)のとき、aをupcaseするとbもupcaseされる(同一のオブジェクトを参照しているため)
・assertメソッド(テストコード用の検証メソッド)ってMinitest::Testを継承してないと使えない

〇irbについて
・""を閉じ忘れやすい。
・リテラル以外の英字は変数・定数と解釈される → エラー
・irbプロンプトの見方
  「irb(mainオブジェクトをto_sしたもの):行番号:当該行のインデント数>当該行本文」
     irb(main):001:0> var1 = 12

Rubyの正規表現まとめ

頻出のものをメモ。

/something/        / /は正規表現オブジェクト
--------------------------------------------------
1文字とマッチ
[AB]   A or B          の1文字
[A-B]  A to B          の1文字
[^A]   without A    の1文字
.         任意             の1文字
--------------------------------------------------
※文字マッチではAとaは区別する
--------------------------------------------------
バックスラッシュ(\)系
\S     空白1字
\d     数字1字
\w     文字or数字1字
\A     文字列先頭
\z     文字列末尾

---------------------------------------------------
()       キャプチャ・グループ化
(abc)  abcの繰り返し
---------------------------------------------------
直前の文字をn回繰り返す

?        0回 or 1 回
*        0回 以上 
+       1回 以上
{0,1}   0回 以上 1回以下

---------------------------------------------------
|         OR
---------------------------------------------------
行頭・行末
^        行頭
$        行末

Surface Pro 5 スクリーンキーボードのポップアップを防ぐ

Surface Pro 5のもう一つの問題。それがスクリーンキーボードのポップアップである。
使用するキーボードが公式が発売しているタイプカバー(1万円くらいする)でない場合、Webサイトのフォーム等でタイピングが可能な状態になるたびにスクリーンキーボードがポップアップし、画面の半分を占有してしまう。困る。

ありがたいブログが解決法を載せていてくれたのでリンク。


<解決法>
tabtib.exeをタスクマネージャから無効にして、スクリーンキーボードのポップアップを防ぐ。
※サービスTouch Keyboard and Handwriting Panel Serviceを停止すると、英字キーボードの日本語切り替えができなくなる。

www.howtogeek.com
gimpresso.jimdofree.com

※2021年5月更新
どうやらWindows Updateで↑の方法が使えなくなった(無効にできなくなった)みたいのなので、別の方法を調べた。先人たちありがとう。

<解決法>
・TabTip.exeのファイル名をリネームして、スクリーンキーボードのポップアップを防ぐ
 (1)タスクマネージャ→「詳細」タブ→「TabTip.exe」を右クリック→ファイルの場所を開く
 (2)TabTip.exeの「プロパティ」→「セキュリティ」タブ→「詳細設定」→所有者を変更(TrustedInstaller→Administrators)→「適用」
 (3)TabTip.exeの「プロパティ」→「セキュリティ」タブ→「編集」→Administratorsの「変更」権限にチェック→「適用」
 (4)TabTip.exeの「名前の変更」→(TabTip.exe→_TabTip.exe)
 ※TrustedInstallerが所有者のファイルは管理者であっても通常変更はできない。
 ※ファイルのリネームにはAdministratorsに「変更」権限が必要なため。

nodamushi.hatenablog.com
qiita.com

Surface Pro 5 勝手に画面の明るさが変わる問題

Surface Pro 5は持ち運びやすい(大事!)タブレットPCで気に入ってるんだけど、いくつか困った点がある。

その一つが、画面の明るさが勝手に変わる機能。開いている画面の色味に合わせて自動的に画面の光量を変えてくれる。Surface Pro 5でダークモードのような黒基調の画面を開いていると画面の光がちょっとずつ強くなり、逆に白基調の画面を開くと画面の光が少しずつ弱くなる。複数のWebサイトやアプリを開いていると、画面を変えるたびに光が増減してチラチラして目に悪い。なにより問題なのは、この明るさ調整機能、設定やコントロールパネルからは変更できないのだ。Surface pro6以降だと対応プログラムが配布されているらしいのだけど...。


色々調べた結果、レジストリを直接いじる方法しか現状この問題を解決できなさそう。下記のサイトが参考になった。
takumi9942.net
なお、Windows Updateをするとレジストリの値が元に戻ってしまう。その時はもう一度レジストリの値を修正しよう。

フォームに入力されたデータを出力する

JSPで行うフォームの作成は入力フォームを作ることもできる。サーブレット側でフォームの値を取得する記述をするとJSP画面で入力された内容をプログラム上で使用できる。今回はJSP画面から入力した文字列を別のJSPの画面で出力してみる。処理の流れとしては、EclipseからServlet実行→doGet()でJSP1が呼び出される→フォーム入力後、送信ボタンを押す⇒ServletがdoPost()でJSP2を呼び出す、という形になる。


Servlet4.java

package servletTest;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Servlet4")
public class Servlet4 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String jsp1 = "/WEB-INF/jsp4-1.jsp";
		RequestDispatcher rd = request.getRequestDispatcher(jsp1);
		rd.forward(request,response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String ret[] = request.getParameterValues("text1");
		String jsp2 = "/WEB-INF/jsp4-2.jsp?name="+ret[0];
		RequestDispatcher rd = request.getRequestDispatcher(jsp2);
		rd.forward(request,response);
	}
}


jsp4-1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>jsp4-1.jsp</title>
</head>
<body>

<form method = post action="Servlet4" >
<input type = text  name= text1 >
<input type = submit value ="送信">

</form>

</body>
</html>

jsp4-2.jsp

<% String name = request.getParameter("name");%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>jsp4-2.jsp</title>
</head>
<body>
<%= name%>
</body>
</html>


実行結果
f:id:dream_of_night:20180712224355p:plain
最初に1つ目のJSP画面(jsp4-1.jsp)が表示されて

f:id:dream_of_night:20180712224348p:plain
文字列を入れて「送信」ボタンを押すと

f:id:dream_of_night:20180712224814p:plain
文字列のデータを持った2つ目のJSP画面(jsp4-2.jsp)が表示される。

doPost()を使用する/JSPからのリクエストを受け取る

サーブレットを実行してdoGet()メソッドでJSPページに飛ばすことが成功したので、次はdoGet()メソッドで表示したJSPページからのリクエストをサーブレットで受け取ってみる。方法としてはJSPページの<body>タグ内に<form>タグと<input type>タグを書くことでサーブレットの呼び出しが可能になる。以下、ソース。


jsp3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>jsp3.jsp</title>
</head>
<body>

<form method = post action=Servlet3>
<input type="submit" value="送信" />
</form>

</body>
</html>

(1)<body>~</body>の中に<form>タグ、<input type>タグを書く。
(2)<form>~</form>タグでフォーム作成箇所を規定。
 ・フォーム:クライアント(ブラウザ)側で押したり入力したりできる場所。
(3)<form>の括弧内にはmethod属性、action属性を書く。
  ・method属性ではサーバへのデータ送信方法を書く。
   ここでpostを指定すると、サーブレットのdoPost()メソッドを起動させられる
  (つまりdoGet()とは別の処理を記述可能)
  ・action属性では送信先を書く。Servlet3を指定すると Servlet3.javaへ送信する。
(4)<input>タグでフォームを規定。<input>タグ1つで1つのフォームなので、↑の<input type="submit" >を2個にするとボタンも2個できる。
(5)<input>の括弧内にはtype属性、value属性を書く。
  ・type属性ではフォーム形式を書く。submitを指定すると送信ボタンが作成される。
  ・value属性ではフォームの名前を書く。この場合送信ボタンに"送信"と名前が出る。


Servlet3.java

package servletTest;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String jsp = "/WEB-INF/jsp3.jsp";
		RequestDispatcher rd = request.getRequestDispatcher(jsp);
		rd.forward(request,response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost method moved successfully!");
	}
}

(1)Eclipseで「実行」を押すと、最初にdoGet()メソッドが呼ばれforward()でjsp3.jspが画面表示される。
(2)画面(jsp3.jsp)で「送信」ボタンを押すと、doPost()メソッドが呼ばれコンソールに"doPost method moved successfully!"が出力される。



実行結果

実行すると画面が表示。ボタンが出力されている。「送信」ボタンを押すと、、、、
f:id:dream_of_night:20180707162104p:plain


コンソールに"doPost method moved successfully!"が出力される。
f:id:dream_of_night:20180707162109p:plain

サーブレット/JSPを連携するには

前回作成した動的Webプロジェクトに新規のサーブレットJSPを加えて連携させてみる。初歩としてサーブレット(Servlet2.java)のdoGet()メソッドでJSP(jsp2.jsp)のページを表示する。



JSP作成
   「WebContent」-「WEB-INF」配下に「ファイル」タブ⇒「新規」⇒「その他」⇒「Web」⇒「JSPファイル」で作成。(jsp2.jsp

・注意:サーブレットの変更後は「プロジェクト」タブ⇒「クリーン」をしないと変更が適応されないみたい。何回か404エラーが出たよ、、、JSPの変更では不要

Servlet2.java

package servletTest;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String jsp ="/WEB-INF/jsp2.jsp";
		RequestDispatcher rd = request.getRequestDispatcher(jsp);
		rd.forward(request, response);
	}
}

サーブレットからJSPへ移動させる(フォワード)にはforward()メソッドの使用が必要。
(1)String型変数 jspjspのパス("/WEB-INF/jsp2.jsp")を代入。
 (なぜパスが/WEB-INFから始まるのかはよくわからない。メソッドの処理される場所からの相対パス?)
(2)RequestDispatcher インターフェイスを実装したオブジェクトrdを用意
(3)RequestDispatcher のオブジェクトを戻り値とするgetRequestDispatcher()を使用。引数はjspのパス。
 (getRequestDispatcher()は引数に指定したリソースのラッパを返すらしい。)
 (オブジェクトrequestはHttpServletRequest インターフェイスを介して ServletRequest を実装しており、getRequestDispatcher()が使用可能)
(4)RequestDispatcher 型のオブジェクトrdでforward()を使用。


jsp2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>JSP2.jsp</title>
</head>
<body>
This is jsp2 page!
</body>
</html>

(1)タイトルはJSP2.jsp
(2)ページ内容は"This is jsp2 page!"


実行結果
f:id:dream_of_night:20180707004440p:plain


ちなみにjsp2.jspはかなり省略しても一応表示される。きっとこのままだと問題があるやつだね、、、ページタイトルも入ってないし

<body>
This is jsp2 page!
</body>

実行結果
f:id:dream_of_night:20180707004701p:plain