forget for get

覚えるために忘れる

Go入門(Windows)

公式ドキュメントを見ながらチュートリアルを進めていく。
https://go.dev/doc/
※私はWindowsPowerShellを使います。

インストール

https://go.dev/dl/
Featured downloadsからWindows向けのインストーラ(.msi)をダウンロード
ダブルクリックしてNextを押していってインストール
PowerShellから「go version」を実行してバージョンが表示されたらインストール完了

 

チュートリアル

https://go.dev/doc/tutorial/getting-started

PowerShellを起動
起動した状態のディレクトリのまま作業する(例: C:\Users\yourname)


・作業用ディレクトリ作成
mkdir golearn
(最初、mkdir goで作業したら、goが使うデフォルトのディレクトリ名と被って失敗した、、)


・モジュール初期化(依存関係の追跡を有効にする)
go mod init example/hello
(よくわからんが、やる)
golearn/go.modが作成される
go/pkg/mod/cache/lockも作成される

 

・golearn/hello.goファイルを作成して、コード書いて保存

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

VSCodeで書いたら、ほとんど補完してくれたので楽

 

・実行
go run .
を実行して「Hello, World!」が表示されるのを確認

 

外部のパッケージを使いたい場合

・パッケージを探す

https://pkg.go.dev/search?q=quote
たとえば「quote」で検索
READ MEやドキュメントでどんなパッケージか確認

 

・コード上でインポートする

package main

import "fmt"

import "rsc.io/quote"

func main() {
    fmt.Println(quote.Go())
}

golearn/hello.goを一部修正


・モジュールを使えるようにする
go mod tidy

を実行すると、モジュールがダウンロードされる

 

・再実行するとエラーになる
go run .
Don't communicate by sharing memory, share memory by communicating.

たぶんわざとそうしてると思うが、
fmt.Println(quote.Go())

fmt.Println(quote.Hello())
に変えると、「Hello, world.」が表示される

#の扱い ~ どっぺるソングで困った話

lightwill.main.jp

どっぺるソングのURL設計がそもそもよくないのですが、

アーティスト名で検索すると「https://lightwill.main.jp/hc/doppelsong/B%27z/1

アーティスト名がURLの一部になるので、URLエンコードする必要がある。

URLエンコードだけでほとんどの場合大丈夫だったが、「#ババババンビ」というアイドルグループがいた。

https://lightwill.main.jp/hc/doppelsong/#%E3%83%90%E3%83%90%E3%83%90%E3%83%90%E3%83%B3%E3%83%93/1

ページが表示されているから問題ないように見えるかもしれない。

しかし、検索が効いていない。

URLの#以降はページ内リンクとみなされてしまう、、

 

苦肉の策として、「#」でリクエストが来たらリダイレクトするようにした。

https://lightwill.main.jp/hc/doppelsong?searchKey=%23%E3%83%90%E3%83%90%E3%83%90%E3%83%90%E3%83%B3%E3%83%93

 

PowerShell入門

サンプルコード

hello.ps1

Set-Variable -Name MAX_LEVEL -Value 100 -Option Constant
Write-Output MAX_LEVEL;

Write-Output (Get-Date).ToString("yyyy/MM/dd HH:mm:ss") 

#配列
[int[]]$nums=1,2,3
for ($i = 0; $i -lt 3; $i++) {
  Write-Output $nums[$i]
}

#こうも書ける
foreach ($i in 1..3) {
  Write-Output $i
}

#関数
function lottery([int]$rate) {
  $random = Get-Random -Minimum 0 -Maximum 100
  return $random -lt $rate
}

if (lottery(50)) {
  Write-Output "Hit!"
} else {
  Write-Output "Miss!"
}

実行時に許可がいるので以下のように実行

powershell -NoProfile -ExecutionPolicy Unrestricted ./hello.ps1

エクセルからMySQLに接続

MySQL ODBCドライバをインストール

https://dev.mysql.com/downloads/connector/odbc/

 

使うエクセルが2007(32bit)だったので、8.0を選択。

 

ODBCデータソースの設定

コントロールパネルのODBCデータソースアドミニストレータ(32ビット)を使用して、MySQLの接続情報を設定

MySQLサーバーのIPアドレス、データベース名、ユーザー名、パスワードを入力

 

MySQL権限設定

VirtualBoxMySQLに接続しようとしたけどエラー。

権限を設定しないといけない。

CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'password';

GRANT SELECT, INSERT, UPDATE, DELETE ON lightwill.* TO 'remoteuser'@'%';

FLUSH PRIVILEGES;

外部からアクセスできるユーザを作成。

SELECT, INSERT, UPDATE, DELETE の権限を付与。

反映。

 

エクセルマクロ(VBA

Sub AccessMySQL()
    Dim conn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConn As String
    
    ' MySQLへの接続情報を設定
    strConn = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.33.10;Database=lightwill;Uid=remoteuser;Pwd=password;"
    
    ' ADO Connectionオブジェクトを作成
    Set conn = CreateObject("ADODB.Connection")
    
    ' 接続を開く
    conn.Open strConn
    
     ' SQLクエリを作成
    strSql = "SELECT * FROM dp_comments order by id desc LIMIT 0, 30;"
    
    ' ADO Recordsetオブジェクトを作成
    Set rs = CreateObject("ADODB.Recordset")
    
    ' RecordsetにSQLクエリの結果を格納
    rs.Open sql, conn
    
    ' データをExcelに貼り付け
    Sheet1.Range("A1").CopyFromRecordset rs
    
    ' 接続を閉じる
    rs.Close
    conn.Close
    
    ' オブジェクトの解放
    Set rs = Nothing
    Set conn = Nothing
End Sub

 

 

 

 

SpringBoot入門:DBから値を取得

気軽に試せるH2データベースを使えるようにする

src/main/resources/
application.properties

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

spring.sql.init.encoding=UTF-8
spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.data-locations=classpath:data.sql

spring.h2.console.enabled=true

 

スキーマとテストデータのSQL

schema.sql

create table if not exists employee(
  id varchar(50) primary key,
  name varchar(50),
  age int
);

 

data.sql

insert into employee(id, name, age)
values('1', 'Tom', 30);

Model、Repository、Service、Controller、Viewを作成、修正

src/main/java/com.example.demo/hello
Employee.java

@Data
public class Employee {
	private String employeeId;
	private String employeeName;
	private int employeeAge;
}

HelloRepository.java

@Repository
public class HelloRepository {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public Map<String, Object> findById(String id) {
		String query = "select *"
				+ " from employee"
				+ " where id=?";		
		Map<String, Object> employee = jdbcTemplate.queryForMap(query, id);		
		return employee;
	}
}

HelloService.java

@Service
public class HelloService {
	@Autowired
	private HelloRepository repository;
	
	public Employee getEmployee(String id) {
		Map<String, Object> map = repository.findById(id);
		
		String employeeId = (String) map.get("id");
		String name = (String) map.get("name");
		int age = (Integer) map.get("age");
		
		Employee employee = new Employee();
		employee.setEmployeeId(employeeId);
		employee.setEmployeeName(name);
		employee.setEmployeeAge(age);
		
		return employee;
	}
}

HelloController.javaに追記

	@Autowired
	private HelloService service;
	
	@PostMapping("/hello/db")
	public String postDbRequest(@RequestParam("eid") String id, Model model) {
		Employee employee = service.getEmployee(id);
		model.addAttribute("employee", employee);
		return "hello/db";
	}

src/main/resources/templates
db.htmlを作成

        <p th:text="${employee.employeeId}"></p>
        <p th:text="${employee.employeeName}"></p>
        <p th:text="${employee.employeeAge}"></p>

 

hello.htmlに追記

        <form method="post" action="/https/lightwill.hatenablog.com/hello/db">
            <input type="text" name="eid" th:value="${eid_value}">
            <button>送信</button>
        </form>

 

H2データベースのコンソール
http://localhost:8080/h2-console
JDBC URL: jdbc:h2:mem:testdb

 

 

 

 

SpringBoot入門:環境構築

参考書はこちらを選択(Kindle Unlimitedで無料で読めるので)
Spring 解体新書

 

環境構築


IDE
Spring Tools 4 for Eclipse
https://spring.io/tools/
windows版をダウンロード、任意の場所に配置して「java -jar spring-tool-suite-xxx.jar」
sts-x.x.x.RELEASEの中のSpringToolSuite4.exeが本体

 

Pleiadesの日本語化プラグイン
https://willbrains.jp/
Pleiades プラグイン・ダウンロードからWindowsをダウンロード
解凍してsetup.exe
先ほどのSpringToolSuite4.exeを選択して日本語化

 

Lombokインストール
https://projectlombok.org/download
java -jar lombok.jar
SpringToolSuite4.exeを選択してインストール

 

Spring Tools 4の設定
コード補完の設定
ウィンドウ→設定→Java→エディタ→コンテンツアシスタント
Javaの自動有効化トリガー
.abcdefghijkemnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_
※デフォルトだと.を入力した時しか補完されない
「Enter以外の挿入トリガーを使用不可にする」にチェック

Ctrl + Shift + Fでコード整形

 

新規Springスタータープロジェクトの作成
追加ライブラリ
Spring Boot DevTools, Lombok, JDBC API, Spring Data JDBC, H2 Database, Thymeleaf, Spring Web

 

src/main/resources/templates
hello.htmlを作成

<html xmlns:th="http://www.thymeleaf.org">
    <body>
        Hello World
    </body>
</html>

 

src/main/java/com.example.demo/hello
HelloController.javaを作成

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
	@GetMapping("/hello")
	public String getHello() {
		return "hello";
	}
}

プロジェクトを右クリック→実行→SpringBootアプリケーション
http://localhost:8080/hello

Java入門

筆者はPHPを習得しているので環境構築くらいしか書くことがない。

(言語の違いで気づいたことがあれば追記していく)

 

JavaDriveでJava入門
https://www.javadrive.jp/start/

 

JDKのインストール
https://jdk.java.net/
Ready for use: JDK XXをクリック
BuildsからWindowsのzipをダウンロード
任意のディレクトリに展開

 

環境変数の設定
検索窓に「環境変数」と入力して環境変数Windowを開く
ユーザー環境変数かシステム環境変数に「JAVA_HOME」を追加
変数値には先ほど配置したパスを指定「C:\xxx\jdk-xx.x.x」
「Path」の編集で、新規→「%JAVA_HOME%\bin」を追加
コマンドプロンプトで「javac -version」で確認

 

公式ドキュメント
https://www.oracle.com/jp/java/technologies/documentation.html
該当バージョンのリンク日本語→左メニューのAPIドキュメント

 

Hello, World
Hello.java

class Hello {
  public static void main(String[] args) {
    System.out.println("Hello");
  }
}

 

コンパイル
javac Hello.java
実行
java Hello

 

サンプルプログラム

import java.time.LocalDate;

class Sample {
  public static void main(String[] args) {
  	final int MAX_LEVEL = 100;
  	
  	System.out.println(MAX_LEVEL);
  	
  	LocalDate ld = LocalDate.now();
    System.out.println(ld);
  	
  	//配列
  	int[] nums = new int[3];
  	nums[0] = 1;
  	nums[1] = 2;
  	nums[2] = 3;
  	
  	for (int i = 0; i < 3; i++) {
  		System.out.println(nums[i]);
  	}
  	
  	//こうも書ける
  	int[] nums2 = {1, 2, 3};
  	for (int num : nums2) {
        System.out.println(num);
    }
  	
  	//String型や配列型は参照型なので、代入すると同じものを参照する
  	int[] others = nums2;
  	nums2[0] = 4;
  	// 同じものを参照しているので、4になる
    System.out.println(others[0]);
  	
  	int[] others2 = nums2.clone();
  	nums2[0] = 5;
  	// cloneだと別オブジェクトになるので5にならない
    System.out.println(others2[0]);
  }
}