ずっと使えるFXチャート分析の基本〈復習&書評〉
とてもわかりやすくて面白かったです。
今一番知りたいと思っていたことがちょうど記載されており非常に勉強になりました。
今一番知りたいと思っていたことは、ポジションを取るタイミングと決済するタイミングの根拠。
私は取引する際の根拠に自信が持てていなかったので、おそらく一番始めに覚えるべき、かつ超重要でもあるチャート分析の基本「トレンドとレンジ」の考え方をこの本できちんと理解できたので、読む価値が非常に高かったです。
全然難しいことを言っていないのになぜ今まで理解できていなかったのか?
と思うほど簡単に理解できました。
改めて考えると、FX中級者以上なら誰でも知ってる話だと思うので知っている方は読んでも退屈だと思いますが、理解できていない方は必見の内容です。
PART1. チャート分析の技術なくして利益を得られない
序章的な章で、FXの勉強を少しでも知っている方ならよく聞く話です。
- FXは技術を学んで運用するもので、技術がなくては稼ぐことはできない
- 技術を学べば複利の力で資産は指数関数的に増える
- 技術があればギャンブルにならない
- テクニカルの使い方を学ぶのではなく、チャートの本質を学んで稼ぐ技術を理解する
PART.2 チャートを正しく読み取るためのステップ
ここも基本的な話の章で、丁寧にローソク足を解説しています。ローソク足を理解していない人は読んだ方が良いですが、ローソク足を理解している人は読む必要は無いように思います。
PART.3 相場の勝ち組に乗るチャートの読み方
この章でなんとなく理解していたレンジとトレンドを正確に理解できるようになりました。
売り手が多いと下落して、買い手が多いと上昇して、売り手と買い手の勢力争いでレンジが形成されて、レンジが崩れればレンジブレイクが起きて、レンジブレイクが繰り返されればトレンドになる。
PART.4 実際のチャートで値動きを追って取引する方法
3章で学んだ仕組みを実践の場で使えるように解説があります。
取引するのはレンジブレイクした時だけで、レンジ相場では予測できないため取引はしません。ただ、時間軸を小さくすればレンジもトレンドになります。
- 逆指値でレンジブレイクに注文をいれる
- レンジの期間が長いほどレンジブレイクした時に大きく動く可能性が高い
- 十字線の出現や長いヒゲの出現は重くなっている証拠
- 広いレンジはそれだけレンジの期間も長くなる
- 広いレンジでは休場するのも手
PART.5 フォーメーション分析も値動き重視で確度が決まる
今までの理論を元にフォーメーションの解説をしてくれます。
- ダブルトップ&ダブルボトム
- トライアングル
- ヘッドアンドショルダーズトップ&ヘッドアンドショルダーズボトム
感想
読み終わってみると、簡単なことしか言っていなかったと思えるのですが、実際は理解できていなかったことを丁寧に解説してくれたおかげです。ネットだと情報がバラバラで理解しにくいのですが、取引する上で超重要なことなのでFX初心者の方には本当におすすめの本です。逆に丁寧すぎる解説なのでトレンドやレンジを理解している人にとってはとても退屈な本だとも思います。
<Java>オセロの作り方 - 初めてゼロから作ったプログラム -
Javaの勉強のためにオセロを作りました。
初めてゼロから作ったプログラムです。
勉強のためなので無駄がたくさんあります。
そもそも作者のプログラミングレベルが低いのであしからず。
作り方
駒を反転する際のロジックにはちょうど良い記事がありましたので流用しています。
https://techacademy.jp/magazine/22228
言語:Java
技術:JSP/Servlet , JSTL , EL式 , SetterGetter , セッションスコープ , フィルタ
ファイル構成
Model:Reversi.java , Logic.java
View:index.jsp
Controller:Servlet.java
Filter:Filter.java
ファイル構成はMVCモデルに沿ってみました。
1. まずは 画面を作成します。
ポイント
- JSPでデータを作成
- フィルタを使用
- テーブルをforEachで回してる
- 現在の駒数をカウントする
- 待ったボタン、パスボタン、最初からボタンを作成
- ボタンを丸くしているところ
- 画像などは一切使わずにtableタグやテキストだけでデザインしたところ
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page import="models.Reversi" %> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>オセロ</title> <link rel="stylesheet" href="<c:url value='/css/style.css' />"> </head> <body> <header> <h1>オセロ</h1> <p>はじめて開発したゲーム</p> <h2>${ reversi.msg }</h2> </header> <main> <form action="/othello/Servlet" method="get"> <table> <tr> <th></th> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th></th> </tr> <% int i = 0; int j = 0; %> <c:forEach var="sarr" items="${ reversi.board }"> <tr> <th><%= i+1 %></th> <c:forEach var="s" items="${ sarr }"> <% String set = i+"_"+j; %> <td><input type="submit" value="${ s }" name="<%= set %>" class="set"></td> <% j++; %> </c:forEach> </tr> <% i++; j = 0; %> </c:forEach> </table> <p>BLACK : ${ reversi.cnt_black } WHITE : ${ reversi.cnt_white }</p> <div> <input type="submit" value="待った" name="stop" class="stop"/> </div> <div> <input type="submit" value="パス" name="pass" class="pass"/> </div> <div class=""> <button type="submit" value="最初から" name="reset" class="reset">最初<br>から</button> </div> </form> </main> <footer> <p>by Amanjack</p> </footer> </body> </html>
2. CSSの作成
style.css
@charset "UTF-8"; body{ text-align:center; font-size:7pt; display: flex; flex-flow: column; min-height: 100vh; } main { flex:1; } footer{ margin-bottom:10px; } table{ border-collapse:collapse; margin-left:auto; margin-right:auto; table-layout:fixed; } table th, table td{ width:25px; height:25px; } table th{ font-size:70%; } table td{ border:solid 1px black; } .set{ width:25px; height:25px; border-style:none; background-color:#ffffff; font-size:12pt; } .set:hover{ background-color:#cccccc; } button, input[type="submit"]{ background-color: transparent; border: none; cursor: pointer; outline: none; padding: 0; appearance: none; } div{ display: inline-block; width: 40px; height: 40px; border-radius: 50%; border:solid 1px black; margin:15px; } .stop, .pass, .reset{ font-size:8pt; width: 38px; height: 38px; border-radius: 50%; text-align: center; vertical-align:middle; margin:1px; background-color:white; } .stop{ padding:0 0 2px 0; } .reset{ line-height:12px; } .stop:hover, .pass:hover, .reset:hover{ background-color:#cccccc; }
3. JavaBeans的なファイルの作成
ポイント
- 作る必要はなかったが勉強のために作成
- addメソッド、removeメソッドclearメソッドなどカスタマイズ
Reversi.java
package models; import java.util.ArrayList; public class Reversi { // ゲーム進行用フラグ private boolean game; private boolean fin; private boolean ok_reverse; // 8×8の盤面のデータを格納するインスタンス private String[][] board; // 何手目かカウントする変数 private int cnt_turn; private ArrayList<String[][]> record; // 配列に格納するオセロのデータ static final String EMPTY = " "; static final String BLACK = "●"; static final String WHITE = "○"; // 置く石と反転される石 private String stone; private String rev_stone; // ゲーム進行用メッセージ private String msg; // 石の駒数のカウント private int cnt_black; private int cnt_white; public Reversi() { } public Reversi(boolean game, boolean fin, boolean ok_reverse, String[][] board, int cnt_turn, ArrayList<String[][]> record, String stone, String rev_stone, String msg, int cnt_black, int cnt_white) { super(); this.game = game; this.fin = fin; this.ok_reverse = ok_reverse; this.board = board; this.cnt_turn = cnt_turn; this.record = record; this.stone = stone; this.rev_stone = rev_stone; this.msg = msg; this.cnt_black = cnt_black; this.cnt_white = cnt_white; } public boolean isGame() { return game; } public void setGame(boolean game) { this.game = game; } public boolean isFin() { return fin; } public void setFin(boolean fin) { this.fin = fin; } public boolean isOk_reverse() { return ok_reverse; } public void setOk_reverse(boolean ok_reverse) { this.ok_reverse = ok_reverse; } public String[][] getBoard() { return board; } public String[] getBoard(int i) { return board[i]; } public String getBoard(int i, int j) { return board[i][j]; } public void setBoard(String[][] board) { this.board = board; } public void setBoard(int i, int j, String value) { this.board[i][j] = value; } public int getCnt_turn() { return cnt_turn; } public void setCnt_turn(int cnt_turn) { this.cnt_turn = cnt_turn; } public ArrayList<String[][]> getRecord() { return record; } public String[][] getRecord(int i) { return record.get(i); } public void setRecord(ArrayList<String[][]> record) { this.record = record; } public void addRecord(String[][] new_board) { this.record.add(new_board); } public void removeRecord(int i) { this.record.remove(i); } public void clearRecord() { this.record.clear(); } public String getStone() { return stone; } public void setStone(String stone) { this.stone = stone; } public String getRev_stone() { return rev_stone; } public void setRev_stone(String rev_stone) { this.rev_stone = rev_stone; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getCnt_black() { return cnt_black; } public void setCnt_black(int cnt_black) { this.cnt_black = cnt_black; } public int getCnt_white() { return cnt_white; } public void setCnt_white(int cnt_white) { this.cnt_white = cnt_white; } }
4. submitボタンの受け皿となるServletの作成
ポイント
- ぬるぽが出ないように作成
- セッションスコープの利用
package controllers; 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; import javax.servlet.http.HttpSession; import models.Logic; import models.Reversi; /** * Servlet implementation class Servlet */ @WebServlet("/Servlet") public class Servlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); HttpSession session = request.getSession(); Reversi r = (Reversi) session.getAttribute("reversi"); if(r != null){ // ゲームが終了した場合 if(r.isFin()){ Logic.initialize(r); session.setAttribute("reversi", r); } else { // 盤面からリクエストを受けた場合 for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { String param = i+"_"+j; if (!(request.getParameter(param) == null || request.getParameter(param).isEmpty())) { Logic.setStone(r, j, i); session.setAttribute("reversi", r); } } } // "待った"ボタンが押された場合 if (!(request.getParameter("stop") == null || request.getParameter("stop").isEmpty())) { Logic.stop(r); session.setAttribute("reversi", r); // "パス"ボタンが押された場合 } else if (!(request.getParameter("pass") == null || request.getParameter("pass").isEmpty())) { Logic.pass(r); session.setAttribute("reversi", r); // "最初から"ボタンが押された場合 } else if (!(request.getParameter("reset") == null || request.getParameter("reset").isEmpty())) { Logic.initialize(r); session.setAttribute("reversi", r); } } } else { // インスタンスがnullの場合 Reversi reversi = new Reversi(); Logic.initialize(reversi); session.setAttribute("reversi", reversi); } RequestDispatcher rd = request.getRequestDispatcher("/index.jsp"); rd.forward(request, response); } }
5. ロジック専用のJavaファイルの作成
ポイント
- 初期化するメソッド initialize()
- 駒をセットするメソッド setTurn()
- 駒を反転するメソッド turnStone()
- パスするメソッド pass()
- 駒をカウントするメソッド cnt()
- 盤面を戻すメソッド stop()
駒を反転するロジックは下記サイトから流用
https://techacademy.jp/magazine/22228
Logic.java
package models; import java.util.ArrayList; public class Logic { // 初期設定するメソッド static public void initialize(Reversi reversi) { // インスタンスの生成 String[][] board = new String[8][8]; ArrayList<String[][]> record = new ArrayList<String[][]>(); // 初期化 reversi.setGame(false); reversi.setFin(false); reversi.setOk_reverse(false); reversi.setBoard(board); reversi.setRecord(record); reversi.setCnt_turn(0); reversi.setCnt_black(0); reversi.setCnt_white(0); //オセロ版の要素を全てクリアする for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { board[i][j] = Reversi.EMPTY; } } //初期状態の配置 board[3][3] = Reversi.BLACK; board[3][4] = Reversi.WHITE; board[4][3] = Reversi.WHITE; board[4][4] = Reversi.BLACK; // 0手目の盤面をコピーする add_record(reversi); reversi.setCnt_black(2); reversi.setCnt_white(2); //次うつ駒の色を指定 reversi.setStone(Reversi.BLACK); reversi.setRev_stone(Reversi.WHITE); reversi.setMsg(reversi.getStone() +"のターンです"); //ゲーム実行中フラグ reversi.setGame(true); } static public void add_record(Reversi reversi) { String[][] new_board = new String[8][8]; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { new_board[i][j] = reversi.getBoard(i,j); } } reversi.addRecord(new_board); } static public void setStone(Reversi reversi, int x, int y) { // 位置名称の変数のセット int a = x+1; int b = y+1; String position = a+" - "+b; // 駒を配置できる場合 if ((reversi.getBoard(y,x)).equals(Reversi.EMPTY)) { // 駒をセット reversi.setBoard(y, x, reversi.getStone()); // ひっくり返す処理 turnStone(x, y, reversi); // ひっくり返す場所があった場合と // なかった場合の処理 if(reversi.isOk_reverse()) { // 駒の集計 cnt(reversi); // 次うつ駒の設定 String next_rev_storn = reversi.getStone(); reversi.setStone(reversi.getRev_stone()); reversi.setRev_stone(next_rev_storn); // 現在の盤面を手数ごとに格納 reversi.setCnt_turn(reversi.getCnt_turn()+1); add_record(reversi); } else { reversi.setMsg(position+"に駒は置けません"); reversi.setBoard(y, x , Reversi.EMPTY); } } else { // 既に駒がおいてある位置を指定した場合 reversi.setMsg(position+"にはすでに駒が置いてあります"); } } static public void cnt(Reversi reversi) { //駒の集計をする処理 boolean existempty = false; reversi.setCnt_black(0); reversi.setCnt_white(0); for (String[] sarr : reversi.getBoard()) { for (String s : sarr) { //空いている座標があるか、各駒数の集計 if (s.equals(Reversi.EMPTY)) { existempty = true; } else if (s.equals(Reversi.BLACK)) { reversi.setCnt_black(reversi.getCnt_black()+1); } else if (s.equals(Reversi.WHITE)) { reversi.setCnt_white(reversi.getCnt_white()+1); } } } if (existempty) { reversi.setMsg(reversi.getRev_stone() + "のターンです"); } else if(reversi.getCnt_black() > reversi.getCnt_white()) { reversi.setMsg(Reversi.BLACK + "の勝ちです"); reversi.setFin(true); } else if(reversi.getCnt_white() > reversi.getCnt_black()) { reversi.setMsg(Reversi.WHITE + "の勝ちです"); reversi.setFin(true); } else if(reversi.getCnt_white() == reversi.getCnt_black()) { reversi.setMsg("引き分けです"); reversi.setFin(true); } } static public void stop(Reversi reversi) { if(reversi.getCnt_turn() > 0) { // 前回の盤面に戻す処理 reversi.setCnt_turn(reversi.getCnt_turn()-1); reversi.setBoard(reversi.getRecord(reversi.getCnt_turn())); // 不要な盤面の削除 reversi.removeRecord(reversi.getCnt_turn()+1); // 次うつ駒の設定 String next_rev_storn = reversi.getStone(); reversi.setStone(reversi.getRev_stone()); reversi.setRev_stone(next_rev_storn); reversi.setMsg(reversi.getStone()+"のターンです"); } else if(reversi.getCnt_turn() == 0) { reversi.setMsg("一手目です"); } } static public void pass(Reversi reversi) { // 次うつ駒の設定 String next_rev_storn = reversi.getStone(); reversi.setStone(reversi.getRev_stone()); reversi.setRev_stone(next_rev_storn); // 現在の盤面を手数ごとに格納 reversi.setCnt_turn(reversi.getCnt_turn()+1); add_record(reversi); reversi.setMsg(reversi.getStone()+"のターンです"); } static public void turnStone(int x, int y, Reversi reversi) { // フラグの初期化 reversi.setOk_reverse(false); // 8方向の駒の配置を確認し、ひっくり返す turnLeftUp(x, y, reversi); turnUp(x, y, reversi); turnRightUp(x, y, reversi); turnLeft(x, y, reversi); turnRight(x, y, reversi); turnLeftDown(x, y, reversi); turnDown(x, y, reversi); turnRightDown(x, y, reversi); } static public void turnLeftUp(int x, int y, Reversi reversi) { if (y > 1 && x > 1) { // となりの駒 String next = reversi.getBoard(y-1,x-1); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (x - i < 0 || y - i < 0 || reversi.getBoard(y-i,x-i).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y-i,x-i).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y-t, x-t, reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } static public void turnUp(int x, int y, Reversi reversi) { if (y > 1) { // となりの駒 String next = reversi.getBoard(y - 1,x); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (y - i < 0 || reversi.getBoard(y - i,x).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y - i,x).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y - t,x,reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } static public void turnRightUp(int x, int y, Reversi reversi) { if (y > 1 && x < 6) { // となりの駒 String next = reversi.getBoard(y - 1,x + 1); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (x + i > 7 || y - i < 0 || reversi.getBoard(y - i,x + i).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y - i,x + i).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y - t,x + t,reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } static public void turnDown(int x, int y, Reversi reversi) { if (y < 6) { // となりの駒 String next = reversi.getBoard(y + 1,x); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (y + i > 7 || reversi.getBoard(y + i,x).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y + i,x).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y + t,x,reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } static public void turnRight(int x, int y, Reversi reversi) { if (x < 6) { // となりの駒 String next = reversi.getBoard(y,x + 1); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (x + i > 7 || reversi.getBoard(y,x + i).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y,x + i).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y,x + t,reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } static public void turnLeftDown(int x, int y, Reversi reversi) { if (y < 6 && x > 1) { // となりの駒 String next = reversi.getBoard(y + 1,x - 1); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (x - i < 0 || y + i > 7 || reversi.getBoard(y + i,x - i).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y + i,x - i).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y + t,x - t,reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } static public void turnLeft(int x, int y, Reversi reversi) { if (x > 1) { // となりの駒 String next = reversi.getBoard(y,x - 1); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (x - i < 0 || reversi.getBoard(y,x - i).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y,x - i).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y,x - t,reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } static public void turnRightDown(int x, int y, Reversi reversi) { if (y < 6 && x < 6) { // となりの駒 String next = reversi.getBoard(y + 1,x + 1); // となりの駒が裏駒の場合 if (next.equals(reversi.getRev_stone())) { // さらにその一つとなりから順に確認 for (int i = 2; true; i++) { if (x + i > 7 || y + i > 7 || reversi.getBoard(y + i,x + i).equals(Reversi.EMPTY)) { // 駒がない場合終了 break; } else if (reversi.getBoard(y + i,x + i).equals(reversi.getStone())) { // 自駒の場合 // あいだの駒をすべて自駒にひっくりかえす for (int t = 1; t < i; t++) { // 配列の要素を上書き reversi.setBoard(y + t,x + t,reversi.getStone()); } reversi.setOk_reverse(true); break; } } } } } }
6. フィルタの作成
セッションが無ければ初期設定を行うフィルターです。
勉強のためにフィルタ使ってみたい!ってだけで追加したのでたいして意味のないファイルです。
ポイント
- index.jspを初めて開いた時に盤面の初期設定を行う
Filter.java
package filters; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import models.Logic; import models.Reversi; /** * Servlet Filter implementation class Filter */ @WebFilter("/index.jsp") public class Filter implements javax.servlet.Filter { /** * Default constructor. */ public Filter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub // place your code here HttpSession session = ((HttpServletRequest)request).getSession(); if((Reversi) session.getAttribute("reversi") == null){ // セッションが無ければ、初期設定を行う Reversi reversi = new Reversi(); Logic.initialize(reversi); session.setAttribute("reversi", reversi); } // pass the request along the filter chain chain.doFilter(request, response); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub } }
プログラムは以上になります。
感想
仕事でJavaを使っているので簡単にできると思ったのに、やってみると大変でした。実際にゼロから開発してみると、一度勉強したことはあるけど覚えていないことばかりです。仕事では改修しかやっていないので、コードは読めても自分での開発はできないことがわかりました。しかし、勉強し直しながら開発を進めている感覚で、大変でもあり楽しくもあり充実感はありました。
〈今週の総括〉トレンドとレンジを理解した
2020年6月15日〜2020年6月19日のFX日誌
トレンドとレンジを理解した。
タラタタッタッタッターン♪
今年からFXを始めた初心者です。
今週からFXの週間日誌をつけていきます。
目指せ億トレーダー!
今週の動き
始値 ¥107.3
終値 ¥106.8
高値 ¥107.6
安値 ¥106.6
今週の動き
今週は変動幅が1円と言う、ボラティリティの小さい週でした。
こう言う時はレンジ相場での戦い方を身に付ける時!
チャンスが来るまでじっと我慢するのが良いとは聞きますが、取引額を低くして何度もして失敗を繰り返して経験値を上げていきます!
反省点
今週はなんとなくでレンジの中での反転を狙って取引しましたが、ほとんど失敗しました。
やはり、なんとなく取引は危険です。
しかし、今週は「ずっと使えるチャート分析の基本」と言う本を読んでトレンドとレンジを理解したので、来週はこの理論を駆使して勝ちます!
終値(¥106.8)がレンジの安値(¥106.6)に近いので、来週はレンジブレイクしたらショートでエントリーします。
レンジの安値を超えない場合は、損切りラインを¥106.5辺りで入れて、レンジ内での利益を取りにいきます。
世界でもっとも強力な9のアルゴリズム
アルゴリズムのソースコードを書いてみたいと思い購入しましたが、ソースコードは一切でてきませんでした。
しかし、読み物としてとても面白い本です。
9のアルゴリズムと言っていますが、正確には生活に及ぼしている9種類のIT技術のお話なので、一つのIT技術に対して数種類のアルゴリズムの話が出てきたり、または出てこない章もあったりします。
9章のデータベースや10章の決定不能生に関してはアルゴリズムですら無いです。技術の仕組みや数学の証明を深堀りするお話です。
9種類のアルゴリズムを技術レベルまで落とし込んで理解できることを期待していたのですがもっと抽象的で、9種類のIT技術の仕組みをIT分野に疎い方でも理解できるように歴史的な話から仕組みの話までを分かりやすく説明してくれる本です。
それでは、9のアルゴリズムを追っていきます。
1. 検索エンジンのインデクシング
インデクシングとは検索時に利用しているアルゴリズムです。インデクシングのほかにマッチングと言う文字列に位置情報を関連させるアルゴリズムのお話もあります。検索エンジンのテクニックを簡単に言うと、事前に索引を作っておき、検索時はその索引から検索して結果を表示するものです。その検索テクニックを単純な3つの英語の例文を使ってわかりやすく詳細に説明してくれます。
2. ページランク
ページランクとはグーグルの創業者のセルゲイ・ブリンとラリー・ペイジが学生のときに発表した検索エンジンのランキングを作るためのアルゴリズムです。簡単に言うと、リンクの数と重みを利用して表す手法です。4種のスクランブルエッグのサイトを見立ててページランクのテクニックを深堀りしつつわかりやすく説明してくれます。
3. 公開鍵暗号法
オープンな場でも特定の相手にしか分からないように情報を伝える手法のお話です。自分とイブとアーノルドと言った架空の人物の3人が登場します。とても簡単な例から始まりますが、徐々に難しくなっていきます。
4. 誤り訂正符号
データが伝送する際は必ずノイズが発生しますが、そのノイズを放置していたらデータはデタラメになってしまいます。パソコンはイレギュラーが無いように思えますが、実際にはとても多くの誤りがあり、その誤りは訂正されてから私たちの目に映っているので私たちの実感として認識しずらいようになっています。本章はそのノイズを修正する仕組みである反復トリック、冗長性トリック、チェックサムトリック、ピンポイントトリックなど説明してくれます。
5. パターン認識
機械があまり得意では無い分野であるパターン認識に関して、機械が答えを作り出す仕組みを説明してくれます。最近傍法と言った距離を利用して誤差を判定する技術や決定木と言った質問を重ねて答えに近く技術が出てきます。後半は人間の頭脳を模倣する技術であるニューラルネットワークを使ってパターン認識する仕組みのお話です。
6. データ圧縮
データを圧縮する技術はZipだけでなくデータを伝送する際など様々なところで使われています。圧縮には大きく分けてロスなし圧縮とロスあり圧縮の2つあり、その仕組みを説明してくれます。ロスなし圧縮は圧縮した後に元に戻すことができ、反復するものには短いシンボルを振り分けるテクニックや頻繁に出てくるものには短い文章に変更するテクニックを用います。ロスあり圧縮は圧縮後には元に戻せません。影響の少ない部分を除外して圧縮します。
7. データベース
データを保存する際に利用するリレーショナルデータベースに関して説明してくれます。トランザクション、todoリストトリック、コミット、ロールバック、仮想テーブルトリックなどが登場します。この章はプログラマーなら誰でも知っている仕組みの話が多くあまり面白くありません。また、アルゴリズムと言えるのか疑問でもある章です。
8. デジタル署名
この章では今まで出てきたテクニックが合わさって用いられます。公開鍵暗号法やチェックサムトリックが再登場し、公開鍵を保管する銀行を通してデジタル署名を実現します。後半は素数の特殊な仕組みを利用した公開鍵暗号法であるRSAの仕組みも教えてくれます。コピーできるはずのデジタル技術がコピーできない署名として利用する面白いパラドックスを解決します。
9. 決定不能性とはなにか
コンピュータにも不可能なことがあると言うことを証明をします。 背理法を使った数学の証明問題の解法のような内容ですが、丁寧に教えてくれるので全然難しくありません。バグクラッシュ検出システムを例にして最終的にはバグクラッシュ検出システムを作れないことを証明しますが、完璧なシステムでなくとも似たようなシステムを作ることはできる話で落ち着きます。
おわりに
何のためにそのアルゴリズムがあるのかと言えば、なにかを成し遂げるために作られたわけで、難しい問題を成し遂げるには1つのアルゴリズムで解決できるはずもなく、様々なアルゴリズムを組み合わせて技術をつくるので技術の説明をするときはアルゴリズムは1つのわけはなくその全てを合わせて1つの技術になるので1つのアルゴリズムとも言え、題名の9のアルゴリズムはやはり間違っていないのだと思いました。
金持ち父さん、貧乏父さん〈書評〉
かなり有名な本ですが、有名なだけあって面白かったです。
どんな内容なのか、紹介していきます。
要約
お金からの恐怖心を払拭しない限り、お金からの自由は解放されません。お金持ちはお金のために働くのではなくお金を作っています。貧乏人はお金のために働いています。お金の奴隷にならないように、お金の持っている力を学び、お金を作る方法を自分で考える必要があります。
資産と負債の違いを知り、資産を増やし続けることをお金持ちは実践しています。資産と思っているものが負債かもしれないので、なにが負債でなにが資産なのか知識を蓄えて、資産を有効的に使って資産を増やし続けます。
マクドナルド社のビジネスはハンバーガーを売ることではなく、不動産ビジネスです。マクドナルド社はハンバーガーを売りながら、世界中の時価相場の高い不動産を所有しており、世界最大の不動産所有会社です。マクドナルドの不動産はマクドナルドのフランチャイズ権を買った人が代わりに支払ってくれているような仕組みになっています。自分のビジネスを持てばお金でお金を増やすことができます。
ファイナンシャル・インテリジェンス
自分の会社を持つことで節税できます。人生で1番の支出は税金です。会計力、投資力、市場理解力、法律力を学び、ファイナンシャル・インテリジェンスを高めれば、節税ができて資産を増やすことを有利に運べます。
お金はただの同意されたものであってお金は実際には存在しません。なぜ、ファイナンシャル・インテリジェンスを高めるのか?それは自分自身で答えを見つける必要がありますが、著者自身はこう言っています。
「お金を早く作りたいからです。お金を早く作る”必要”があるからではなく、お金を早く”作りたい”からです。お金を作ることは胸躍る楽しいことで、お金を作るために学習する過程も楽しいです。実際には存在しないお金を作るゲームの中に生き生きとした活動があり、後に残された人間の1人にはなりたくない。」
とおっしゃています。理屈ではない感情的な話なのが逆に共感できます。
長い目で見て学ぶ
お金のために働くのではなく、学ぶために働きます。目の前のお金に囚われるのではなく、長い目で見て幸せになれる選択をします。専門を極めるより、広い知識を学び、視野を広げ、専門を極めんとする人たちが学習していない知識を得ることで成功を得ます。手にした技術は教えます。人に与えることによって自分に返ってきます。
「与えよ、さらば与えられん」
お金をコントロールするために乗り換える5つの障害
- お金を失う恐怖
- 悪い方にばかり考えて臆病になる
- 忙しいことを理由に怠ける
- 自分への投資を後回しにする
- 無知を隠すために傲慢になる
おわりに
私がこの本のことを知ったのは、友達のエピソードからです。友達が婚活パーティで知り合った女性から本書を紹介されたようですが、その女性はマルチ商法に繋がっていたようです。驚くことに、その友達は2人連続で本書を使った同じ勧誘を受けたようです。
その話を聞き、マルチ商法をしたくなるくらいすごい影響力のある本なんだから面白いに決まってる!と思い購入しました。
そして、この本ではお金のことを勉強すれば不労所得で悠々自適に暮らせるようになるよと言っているので、マルチ商法をしたくなる気持ちもわかりました。
しかし、この本で言いたいことは不労所得で稼げと言っているわけではなく、お金の知識をもっと持つ必要性を説いているだけです。決してマルチ商法を勧めているわけではありません。
ちなみに、私はマルチ商法には全く興味はないです。
新しいLinuxの教科書〈書評〉
新しいLinuxの教科書。
振り返ります。
ページ数:425ページ
読書時間:約20時間
タイトルを見ればだいたい内容はわかると思いますが、この本はLinuxをあまり知らない方に向けたLinuxの入門書です。上司に「Linuxはどこでも使うから使えるようになっておけ」と言われたのがきっかけで勉強を始めました。初心者なので体系的に学びたいと思い書籍をネットで調べたところ評価が高かった本書を購入しました。
Chapter 01 Linuxを使ってみよう
Linuxの概要の説明が簡単にあり、続いてLinuxの環境を構築します。CentOSと言うLinuxのソフトウェアパッケージを使用します。
- Oracle VM VirtualBoxのインストール
- Oracle VM VirtualBoxで仮想マシンの作成
- CentOSイメージファイルのインストール
- CentOS 7 のインストール
- ログイン、ログアウト、シャットダウンの方法
Chapter 02 シェルって何だろう?
シェルとはLinuxカーネルとユーザをつなげるインタフェースとなっているソフトウェアのことです。この章を読んでやっと、今まで疑問だったMacのターミナルとWindowsのコマンドプロンプトとLinuxの違いが理解できました。
- シェル Linuxカーネルのインターフェースとなっているソフトウェアのこと「sh」「csh」「bash」「tcsh」「zsh」などの種類がある
- Linuxカーネル CPUやメモリなどのハードウェアに関する管理とコマンド実行やジョブプロセスの管理もしているOSの中核部分の機能のこと
- ターミナル 入出力するウィンドウ画面を提供するソフトウェアのこと
- プロンプト シェルに表示されるユーザ名・ホスト名・ディレクトリ・$マークなどのこと
Chapter 03 シェルの便利な機能
シェルの基本的な操作方法を学びます。カーソルの移動、カットとヤンク、コマンドの入力方法などの操作方法が通常のOSとはやり方が違うため、覚えることがたくさんあります。習うより慣れないといけない感じです。
Chapter 04 ファイルとディレクトリ
Linuxのファイル構成やファイルに関する基礎知識とディレクトリの移動の仕方などを学びます。
Chapter 05 ファイル操作の基本
ファイルの作成・コピー・削除などのファイルの操作を学びます。登場するコマンドとオプションが多すぎて覚えきれません(涙)
- mkdir ディレクトリを作成
- touch ファイルを作成
- rm ファイルを削除
- rmdir ディレクトリを削除
- cat ファイルの内容を表示
- less ファイルの内容をスクロールと共に表示
- cp ファイルやディレクトリをコピー
- mv ファイルを移動
- ln ファイルやディレクトリのリンクを作成
Chapter 06 探す、調べる
ファイルを探す方法や、コマンドを調べる方法を学びます。
- find ディレクトリツリーからファイルを探す
- locate データベースからファイルを探す
- --help コマンドのヘルプメッセージを表示するオプション
- man コマンドのマニュアルを表示
- which コマンドのパスを表示
Chapter 07 テキストエディタ
Linuxの標準エディタのVimに関して学びます。インストールから始まり、起動と終了、ファイルの開き方と保存と終了、カーソルの移動と文字の入力と削除、検索と置換などの基本操作を学びます。このVimもシェルと操作方法が全然違うので覚えるのが大変です💦
Chapter 08 bashの設定
シェルの環境を操作し、快適な環境にカスタマイズするためのbashの設定方法を学びます。
- alias コマンドの初期設定にオプションを追加
- set シェルの設定のオプションをオンオフする
- shopt setコマンドと同じくシェルの設定のオプションをオンオフするが、設定できるオプションが違う
- シェル変数 シェルの内部で使用される変数
- 環境変数 外部コマンドからも値を参照できる変数
- 組み込みコマンド シェル自体に内臓しているコマンド
- 外部コマンド シェルの外側であるファイルシステム上に置かれているコマンド
Chapter 09 ファイルパーミッション、スーパーユーザー
ファイルパーミッションとはファイルに対するアクセス権限の情報のことです。chmodコマンドでアクセス権限の変更を行います。スーパユーザとは管理者権限を持つ特別なユーザのことで強い権限を持ちます。rootユーザともいいます。
Chapter 10 プロセスとジョブ
プロセスとはメモリ上にある実行中のプログラムのことです。シェルからコマンドを実行して、Linuxカーネルが実行ファイルを読み取りメモリに格納して、メモリの内容に沿ってCPUがプログラムを実行します。
ジョブとはシェルから見た処理の単位です。プロセスはLinuxカーネルから見た実行ファイルの単位で、ジョブはシェルから見た実行ファイルの単位です。
Chapter 11 標準入出力とパイプライン
コマンドを組み合わせてコマンド同士を連携する仕組みを学びます。
- 標準入力 キーボードからプログラムに働きかける入力のこと
- 標準出力 プログラムからディスプレイに出力すること
- 標準エラー プログラムのエラーメッセージを出力すること
- リダイレクト 標準入出力を変更する機能のこと
- パイプライン コマンドの出力を別のコマンドに繋ぐ機能のこと
- フィルタ コマンドから出力した情報を入力として受け取ることができるコマンドのこと
Chapter 12 テキスト処理
テキスト処理を行うコマンドを学びます。
- wc バイト数・単語数・行数を数える
- sort 行を並べ変える
- uniq 重複した行を取り除く
- cut 入力の一部を切り出す
- tr 文字を変換・削除する
- tail 末尾部分を表示する
- diff 差分を表示する
Cahpter 13 正規表現
正規表現とは文字列を表現する記法のことです。正規表現は他のプログラミング言語やオフィスソフトなどテキスト処理をする上で様々な場所で利用するのでとても重要です。
Chapter 14 高度なテキスト処理
sedコマンドとawkコマンドを学びます。sedコマンドは文字列を削除したり置換したりして高度で効率的なテキスト処理を行えます。awkコマンドはsedよりも高度なテキスト処理が行えるコマンドです。
Chapter 15 シェルスクリプトを書こう
シェルスクリプトとはコマンドラインを事前に設定しておくファイルのことで、自分でコマンドを組み合わせて作ることができます。シェルスクリプトの作成方法、仕組みなどを学びます。Chapter 15 〜 17はシェルスクリプトに関する説明です。
Chapter 16 シェルスクリプトの基礎知識
引き続きシェルスクリプトの説明が続きます。プログラミング言語でもおなじみのif文、for文、case文、while文が登場します。
- 変数 プログラミング言語でもよく使う値を格納する入れ物のこと
- クォーティング ' シングルクォートか " ダブルクォートで囲んでメタ文字の解釈をさせないこと
- 位置パラメータ コマンドラインから引数を用いて扱う変数のこと
- シェル関数 処理をひとまとめにする関数のこと
Chapter 17 シェルスクリプトを活用しよう
シェルスクリプトに関する最後の章です。日記を書くフォーマットを作るシェルスクリプトや指定したディレクトリのファイルを一覧表示するシェルスクリプトや高機能な検索ができるシェルスクリプトの演習を通して一連の流れを学んでいきます。
Chapter 18 アーカイブと圧縮
windowsではアーカイブと圧縮を同時に行いますが、Linuxでは別々に行います。アーカイブとは複数のファイルをまとめて一つにしたファイルのことです。圧縮とはファイルを小さくすることで、ファイルにある様々な冗長性を排除します。
Chapter 19 バージョン管理システム
バージョン管理システムとはファイルの変更履歴を保存して管理するためのツールです。本章では特に有名なGitを学びます。
- リポジトリ ファイルの変更履歴を保存している場所
- インデックス コミットする前の段階を保存している場所
- ワークツリー 現在のファイルを展開している場所
- リビジョン ある時点での履歴の状態
- ブランチ リビジョンが枝分かれした履歴の道筋
- git init リポジトリを作成する
- git add インデックスにファイルを登録する
- git commit インデックスにあるファイルをリポジトリに登録する
- git status 現在のワークツリーの状態を表示する
- git log 変更の履歴を表示する
- git diff コミットの情報の差分を表示する
おわりに
勉強になり満足感もあり非常に面白かったです。大変わかりやすく読み進めるのに苦労はありませんでした。ただ、この手の技術書を読むときは毎回そうですが読むのに時間が掛かります。本書も例に漏れず理解するのに時間が掛かり読み終えるのが大変でした。
プロになるためのWeb技術入門 なぜ、あなたはWebシステムを開発できないのか
プロになるためのWeb技術入門
〜なぜ、あなたはWebシステムを開発できないのか〜
読み終えたので振り返っていきます。
ページ数:277ページ
読書時間:約20時間
Webアプリケーションの根本を学ぶために読みました。Webアプリケーションの根本が理解できたとは思えませんが、知らない話も多く勉強になりました。ただ、内容はIT業界を始めたばかりの方には有益と思いますが、長年この業界にいる方には物足りないと思います。
JavaとPHPを使った例文が多いので、これら2つの言語の知識があると読み進めやすいです。
章ごとに振り返っていきます。
LESSON 1 「Webアプリケーション」とは何か
Webアプリケーションとは何か?と言うことを簡単に紹介しています。
LESSON 2 Webはどのように発展したか
この章ではWebアプリケーションの歴史を学びます。インターネットの歴史から始まります。World-Wide-Webが誕生し、Webを支える通信技術の仕組み、JavaからSevlet・JSP、最後はフレームワークの誕生の話まで広がります。
LESSON 3 HTTPを知る
HTTPとはHyper Text Transfer Protocolの略で、情報を通信する際のルールであり仕組みのことです。WebサーバにデータがありHTTPのルールでリクエスト/レスポンスによるキャッチボールを行ってWebサーバ間でデータをやり取りする仕組みの話です。
LESSON 4 CGIからWebアプリケーションへ
CGIとはCommon Gateway Interfaceの略で、Webブラウザの要求に対してWebサーバが情報を返す仕組みのことです。宅配ピザ注文サイトをPHP言語を使って作成し、Cookieとセッションの仕組みを学びます。Cookieは通信してきた相手が誰であるか特定する技術のことです。セッションはCookieを利用して情報をやり取りする一連の流れのことで、セッションIDを使いCookieよりも安全性に多くの情報を扱うことができます。
LESSON 5 Webアプリケーションの構成要素
Webアプリケーションで用いられる構成「三層構成」であるWebサーバ・データベースサーバ・アプリケーションサーバの仕組みを学びます。サーバの仕組みは複雑で理解が少々難しいです。
LESSON 6 Webアプリケーションを効率よく開発するための仕組み
本章はLESSON4でも登場した宅配ピザ注文サイトを再度題材として、アプリケーション開発の一連の流れと仕組みを学びます。ソースコードが多くSQLやフレームワークなどのプログラミングが登場するので慣れていない方には難しいです。逆に技術的な話が多いのでプログラミング経験者には物足りない章です。
LESSON 7 セキュリティを確保するための仕組み
セキュリティを脅かす代表的な攻撃手法とその対策に関する話と人的ミスによるセキュリティ問題とその対策に関する話です。
- SQLインジェクション SQLと連携しているWebフォームの入力の仕組みを利用してデータベースにアクセスする攻撃手法 【対策】入力値のチェック・プリペアードステートメントの利用
- クロスサイトスクリプティング HTMLにJavaScriptを埋め込み、レスポンスの際に実行してCookieの盗難やページの改ざんを行う攻撃手法 【対策】サニタイジング
- セッションハイジャック セッションIDを盗み、利用者になりすましてサービスを利用する攻撃手法 【対策】サニタイジング・SSL化・セッションタイムアウト値の変更・セッションIDのランダム化
- クロスサイトリクエストフォージェリ 強制的に情報をサブミットして掲示板の書き込みや買い物をする攻撃手法 【対策】ワンタイムトークンによるフォームの妥当性チェック
- 強制ブラウズ WebブラウザのアドレスバーにURLを直接入力する際に意図しない画面を表示させる攻撃手法 【対策】インデックス表示機能の無効
- ディレクトリトラバーサル リクエストで渡された文字列を利用してシステム内のファイルを閲覧する攻撃手法 【対策】サニタイジング・ファイルシステムアクセス権の設定の変更
感想
本自体は楽しく読めましたが、知っている内容も多く少し物足りなかった部分もあるのが正直な感想です。