ブログ内検索

micro:bitページ
とにかく速いブログサイトを目指す

カテゴリー : Go言語/page-1

SOY CMSマニュアルページ作成中

SOY CMSの開発秘話を投稿しました。→SOY CMSの開発秘話
 

Go言語で関数型の値を扱う

/** Geminiが自動生成した概要 **/
Go言語では関数を値として扱える。 `greet`関数を`f`変数に代入し、`f()`で実行できる。 `dofunc(f func())` は関数型引数を受け取り、その関数を実行する関数である。 `main`関数で`greet`を`f`に代入し、`dofunc(f)`を呼び出すと、`dofunc`内で`f()`が実行され、`greet`関数の処理("hello"の表示)が行われる。 これは関数を第一級オブジェクトとして扱う例である。

 

Go言語で内部コマンドを作成する③

/** Geminiが自動生成した概要 **/
Go言語でコマンドライン引数を扱うflagパッケージの使い方を説明しています。`flag.Int`と`flag.String`でそれぞれ整数型と文字列型のオプションを定義し、デフォルト値と説明文を設定します。`flag.Parse()`でコマンドライン引数を解析し、定義したオプションに値をセットします。実行例として、`main.exe`をビルドし、オプションなしで実行するとデフォルト値の1111と"default"が出力されます。`--help`オプションでヘルプメッセージが表示されます。`-i 5 -s "おはよう"`のようにオプションを指定して実行すると、指定した値が出力されます。つまり、コマンドライン引数からプログラムに値を渡す方法を解説しています。

 

Go言語で内部コマンドを作成する②

/** Geminiが自動生成した概要 **/
Go言語のos.Argsはコマンドライン引数を扱う。`os.Args`はスライスで、最初の要素`os.Args[0]`は実行ファイルのパス。`./main.exe test`と実行すると、`os.Args[1]`は"test"となる。同様に`./main.exe test 5`と実行すれば、`os.Args[1]`は"test"、`os.Args[2]`は"5"となる。つまり、`os.Args`を用いることで、コマンドライン引数にアクセスし、プログラムの動作を制御できる。

 

Go言語で内部コマンドを作成する①

/** Geminiが自動生成した概要 **/
Go言語でコマンドを作成する方法を解説。 `~/workspace/go/cmd`ディレクトリに`main.go`を作成し、`fmt.Println("usako")`を出力するコードを記述。MINGW64を用いて`go build main.go`でコンパイルし、`./main.exe`で実行すると、コマンドラインに"usako"と表示される。 `go build`コマンドはGoのソースコードをコンパイルして実行ファイルを作成する。Windowsでは実行ファイルに`.exe`拡張子が付く。

 

Go言語で一方向ハッシュ関数

/** Geminiが自動生成した概要 **/
Go言語で自作ハッシュ関数を作成し、"ryoko"を暗号化する例が示されています。`CreatHash`関数では、入力文字列をバイト配列に変換後、`sha256.Sum256`でSHA256ハッシュ値を計算し、`hex.EncodeToString`で16進数文字列に変換して返します。 `ryoko`のバイト表現`[114 121 111 107 111]`は、SHA256ハッシュ化され、最終的に`db08d212da1b3ec6c2e3c12d1864626c8d125084c4b05767f00627eebb70bede`というハッシュ値が生成されます。

 

Go言語でファイルの読み込み

/** Geminiが自動生成した概要 **/
Go言語で`template/header.txt`ファイルを読み込む方法を説明しています。`os.Open`関数でファイルを開き、エラー処理も実装しています。`defer file.Close()`で確実にファイルを閉じます。`ioutil.ReadAll`関数でファイルの内容をバイトスライス`content`に読み込み、`string(content)`で文字列`html`に変換します。最後に`fmt.Println(html)`でファイルの内容を表示します。 添付画像は`header.txt`の内容("string1")が表示された実行結果を示しています。

 

Go言語でhtmlからの文字の部分的取得

/** Geminiが自動生成した概要 **/
Go言語でWebページから本文を抽出するプログラムの説明です。`https://saitodev.co/article/%E3%83%A4%E3%83%96%E3%82%AC%E3%83%A9%E3%82%B7%E3%81%AE%E5%9F%B7%E5%BF%B5` から、`<div class="post-content">` と `<!-- .post-content -->` で囲まれた本文を抽出します。`bufio.NewReader` でHTMLを一行ずつ読み込み、`strings.Index` で "post-content" を検索。開始タグを見つけたら `readMode` フラグをtrueにして本文を `content` 変数に蓄積、終了タグを見つけたらループを抜けます。抽出した本文は `test.html` ファイルに保存されます。

 

Go言語で文字列操作

/** Geminiが自動生成した概要 **/
Go言語でHTML内のimgタグのsrc属性を書き換える方法をコード例を用いて説明しています。`strings.Replace`関数を用いて``属性と不要な `/` を除去し、`regexp.MustCompile`と`ReplaceAllString`を用いて`/site/files[数字]/`部分を`./files/`に置換しています。具体的には、まず``を空文字列に、`/>`を`>`に置換します。そして正規表現`/site/files[0-9]*?/`にマッチする部分を`./files/`に置換することで、画像パスを相対パスに変更しています。

 

Go言語で特定のサイトの複数の画像を取得する

/** Geminiが自動生成した概要 **/
Go言語で特定サイトから複数画像を取得する処理を解説しています。まず、対象ページのHTMLを取得し、正規表現を用いて`img`タグの`src`属性から画像パスを抽出します。抽出したパスは`/site/files`を含むものだけをスライスに格納します。次に、スライス内の各パスに対して、サイトのドメインを付加して完全なURLを生成し、`http.Get`で画像データを取得します。取得したデータは`ioutil.ReadAll`でバイト型に変換後、ファイル名を取得するためにパスの最後の`/`以降の文字列をファイル名として新規ファイルを作成し、画像データを書き込み保存します。

 

Go言語でHTMLのイメージタグから画像を取得

/** Geminiが自動生成した概要 **/
Go言語でHTMLのimgタグから画像を取得し、ファイル保存するコードの説明です。正規表現でsrc属性値を取得し、ファイル名を抽出し、URLを完成させます。HTTP GETリクエストで画像データを取得し、ファイルを作成して書き込みます。具体的な例として、`<img src="/site/files10/P5100314.JPG" ...>`から`P5100314.JPG`という名前で画像ファイルを保存する手順を解説しています。 コードは`https://saitodev.co`をベースURLとして使用し、`ioutil.ReadAll`でレスポンスボディ全体を読み込み、`os.Create`と`file.Write`でファイルに書き込んでいます。

 

Go言語でWebサイトから画像のデータを取得

/** Geminiが自動生成した概要 **/
Go言語でWebサイトから画像を取得し、ローカルに保存する方法を解説しています。`http.Get`で指定URLの画像データを取得し、`ioutil.ReadAll`でレスポンスボディをバイトスライスとして読み込みます。`os.Create`で新規ファイルを作成し、`file.Write`で取得したバイトデータを書き込むことで、画像ファイルを保存します。サンプルコードでは"植物のミカタ"の画像URLを使用し、"sample.jpg"として保存しています。記事では、HTTP GETリクエストとファイル作成の基本についても触れており、関連する記事へのリンクも提供しています。

 

Go言語でファイル作成

/** Geminiが自動生成した概要 **/
Go言語でファイルを作成する方法を解説しています。まず、`os.Stat`でファイルの存在確認を行い、存在しなければ`os.Create`で作成、存在すれば`os.Open`で開きます。`defer file.Close()`で確実にファイルを閉じ、`[]byte`に変換した文字列を`file.Write`で書き込みます。次に、`os.Stat`でディレクトリの存在確認を行い、なければ`os.Mkdir`で作成します。`filepath.Abs(".")`で現在のディレクトリを取得し、`os.Chdir`で作成したディレクトリに移動してから、上記と同様にファイルを作成・書き込みます。結果として、指定したディレクトリにファイルが作成されます。

 

Go言語で構造体のメソッド

/** Geminiが自動生成した概要 **/
Go言語のメソッドは、特定の型に紐づく関数です。`sample.go`で`Person`構造体を定義し、`Greet()`メソッドを実装します。`Greet()`メソッドは`Person`型のポインタ`*Person`をレシーバーとして受け取ります。`main.go`で`Person`型の変数`ryoko`を作成し、`ryoko.Greet()`と呼び出すことでメソッドを実行します。メソッド内では、レシーバー`p`を通して`Person`のフィールド(例:`p.Name`)にアクセスできます。初期実装では「こんにちは」と表示されますが、`fmt.Println(p.Name + "さん、こんにちは")`と変更することで「りょうこさん、こんにちは」と表示できます。

 

Go言語で構造体

/** Geminiが自動生成した概要 **/
Go言語では、`type`キーワードで構造体(`struct`)を定義できる。構造体は複数の型の値をまとめたもので、例えば`Person`構造体に`id`、`name`、`reading`フィールドを持つ。`main`関数で`Person`型の変数`ryoko`を宣言し、値を代入して出力できる。構造体のフィールドへは`.`でアクセスする。また、構造体はパッケージに含めることができ、`sample`パッケージに`Person`構造体を定義し、`main`関数で`import`して`sample.Person`として利用できる。パッケージ内の構造体を利用する場合、フィールド名の最初の文字は大文字にする必要がある。

 

Go言語でマップ(連想配列)

/** Geminiが自動生成した概要 **/
Go言語のマップは、キーと値のペアを格納する連想配列です。`map[KeyType]ValueType`で宣言し、`make`関数で初期化します。 キーを指定して値にアクセス (例: `m["name"]`) し、`for...range`ループで全てのキーと値を反復処理できます。上記例では、文字列キーと文字列値のマップを作成し、"name":"Tuyoshi"、"reading":"Saito"を格納、表示しています。 `fmt.Println(m)`でマップ全体、`fmt.Println(m["name"])`で特定の値、`for k, v := range m { fmt.Println(k + ":" + v) }`でキーと値を順に表示します。

 

Go言語でスライス(可変長配列)

/** Geminiが自動生成した概要 **/
Go言語の可変長配列(スライス)は`[]int`で宣言し、`make([]int, 10)`で要素数10の配列を作成する。`s[4] = 5`で5番目の要素に5を代入。要素を追加するには`append`関数を使う。`append(s, 9)`で9を追加。複数の値(例: 5, 3, 7)を追加する場合は、別のスライス`s2`を作成し、`append(s, s2...)`のように`...`を使って展開して追加する。

 

Go言語で配列

/** Geminiが自動生成した概要 **/
Go言語で配列を扱う方法を示すコード例です。10個の文字列を格納できる配列`array`を宣言し、"ryoko"、"usako"、"kumata"を初期値として代入しています。`fmt.Println(array)`で配列全体、`fmt.Println(array[1])`で特定の要素を表示できます。`for i:=0; i<10; i++`のような通常のforループに加え、`for i, v := range array`を使うことで、インデックス`i`と値`v`を取得しながら配列の各要素にアクセスできます。インデックスが不要な場合は`for _, v := range array`と記述します。

 

Go言語で繰り返し

/** Geminiが自動生成した概要 **/
Go言語の`for`ループは様々な繰り返し処理を実現する。`for i := 0; i < 10; i++` のように初期値、条件、増分を指定する一般的な方法に加え、`for {}`と`break`を組み合わせた無限ループも可能。`i += 1`は`i++`と同じくインクリメントを意味する。二重ループで九九の計算も容易に実現できる。外側のループ変数 `i`、内側のループ変数 `j` を用いて `fmt.Println(i * j)` で結果を表示する。

 

Go言語でHTTPのPOST

/** Geminiが自動生成した概要 **/
Go言語でChatWork APIを用いてマイチャットにメッセージをPOSTする手順を紹介。 `http.NewRequest`でPOSTリクエストを作成し、ChatWork APIトークンをヘッダーに設定、`http.DefaultClient.Do`でリクエストを送信する。記事では"GOからのテスト投稿"というメッセージを送り、レスポンスコード200を確認することで成功を確認している。 また、ChatWork APIのルームID、トークンの取得方法については別記事を参照している。

 

Go言語でHTTPのGET

/** Geminiが自動生成した概要 **/
Go言語でHTTP GETリクエストを実行する方法を解説しています。`net/http`パッケージの`Get`関数で指定URLにアクセスし、レスポンスを取得します。`ioutil.ReadAll`でレスポンスボディを読み込み、`string`型に変換してHTML内容を表示します。エラー処理も実装し、最後に`response.Body.Close()`でクローズします。記事では、各段階の出力を示しながら、最終的にHTMLを取得するコードを完成させています。

 

Go言語でユニットテスト

/** Geminiが自動生成した概要 **/
Go言語では、関数の動作を検証するためにユニットテストを行います。テストコードの作成には、以下のような手順があります。1. テストしたい関数の前に「Test」を付け、テスト関数を作成する。2. テスト関数に「(t *testing.T)」パラメータを渡す。3. 関数の引数と期待される値を設定する。4. 関数を実行し、期待される値と実際の結果を比較する。テストを実行すると、「ok」または「FAIL」が出力されます。「ok」はテストが成功したことを示し、「FAIL」はテストが失敗したことを示します。テストを失敗させるには、期待される値と実際の結果を意図的に不一致にします。この場合、テスト結果は次のように表示されます。```--- FAIL: TestJudgeEo (0.00s)func_test.go:10: 5は奇数なのでfalseを返さなければいけない```

 

Go言語で制御構文のif文

/** Geminiが自動生成した概要 **/
Go言語のif文は条件が真か偽かを判定する制御構文です。変数iが5ならば「iに格納されている文字は5」と表示する例が示されています。==は等価性を表し、!=は不一致を表します。else ifステートメントは複数の条件を処理するために使用できます。elseは、他のすべての条件が失敗した場合に実行されるブロックです。例では、str変数にtestまたはhogeが含まれているかどうかがチェックされ、それ以外の場合は「strに格納されている値はtestもhogeでもありません」と表示されます。最後に、偶数か奇数かを判定する関数を示し、iが偶数であればtrue、奇数であればfalseを返します。

 

Go言語でpackage

/** Geminiが自動生成した概要 **/
Go言語のpackage機能は関数をまとめて再利用や配布を可能にする。package名は作成するフォルダ名と同じにする。同じ階層のpackageを読み込むにはimport "./パッケージ名"を使用する。package内に複数の関数があっても、呼び出すときに指定する必要はない。また、Go言語には最初から組み込まれたpackage(例えばtime package)があり、それらを利用することもできる。

 

Go言語で関数

/** Geminiが自動生成した概要 **/
Go言語では、関数は `func` キーワードを使用して作成され、引数とその型を定義できる関数です。関数は、エントリーポイントである `main` 関数から呼び出されます。整数同士の和を表示する関数 `sum` を作成する場合、関数は次のようになります。```gofunc sum(i int, j int) int {return i + j}```返り値がある関数は、その型を関数シグネチャに指定します。たとえば、`sum` 関数は `int` 型の値を返します。複数の値を返す関数は、関数シグネチャにタプルの型を指定します。たとえば、`sum` 関数が和とブール値を返す場合、そのシグネチャは次のようになります。```gofunc sum(i int, j int) (int, bool)```

 

Go言語で変数

/** Geminiが自動生成した概要 **/
Go言語で変数の使い方を解説しています。整数型(int)は数値、文字列型(string)はダブルクォートで囲みます。実数型(float64)は小数点を含む数値、論理値型(bool)はtrue/falseを扱います。変数を宣言し、値を代入し、print関数で表示します。値を代入しないbool型変数はfalseになります。

 

Go言語でHello World

/** Geminiが自動生成した概要 **/
Go言語で"Hello World"を表示する方法を解説。Go環境設定後、workspace内のgoディレクトリにmain.goファイルを作成する。`package main`と`func main(){}`は必須。`print("Hello World")`を{}内に記述し、Ctrl+Shift+Bで実行すると"Hello World"が表示される。Atomの設定でBを押すと実行されるよう設定されている。 別の方法として、MINGW64などのコマンドラインから`go run main.go`を実行しても"Hello World"が表示される。

 

妻にプログラミングを教えることにした-後編

/** Geminiが自動生成した概要 **/
妻にGo言語を教えることにした。プログラミングを教えることで、教える側も理解を深め、学習効率が上がるためだ。Go言語を選んだ理由は、初心者にも扱いやすい点が多いからである。go runでLL言語のように手軽に実行でき、go buildでコンパイルもできる。システムプログラミングにも触れられるため、コンピュータの仕組み理解に役立つ。go fmtやgo importによる自動整形・補完でコードの書き方に迷うことも少ない。また、オブジェクト指向がないため学習コストが低い。冗長になりやすい、他言語学習時に混乱する可能性があるという欠点はあるものの、プログラミング入門には最適だと考える。妻の変化が楽しみだ。

 

妻にプログラミングを教えることにした-前編

/** Geminiが自動生成した概要 **/
妻にプログラミングを教えるのは、SOY Shop開発への協力を期待しているからではなく、プログラミングを通して「相手に的確に指示を伝える能力」を身につけてほしいからだ。事務職希望者が多い一方、経営者側は事務作業をコストと捉える現状がある。プログラミングは、パソコンを部下に見立て、明確な指示を出す訓練となる。これは事務作業の効率化にも繋がる。また、電話での行き違いによる業務の非効率性を指摘し、プログラミング的思考で事前に情報を整理し伝えることの重要性を説く。最終的には、どんな業種でも発生する事務作業を効率化し、円滑なコミュニケーション能力を養うことが目的である。

 

レバテックキャリアさんの技術ブログで当ブログのGo言語の記事が紹介されました

/** Geminiが自動生成した概要 **/
レバテックキャリアの技術ブログで、筆者のGo言語のユニットテスト記事が紹介された。紹介記事はGo言語学習者向けのおすすめ記事まとめで、筆者の記事はテストコード作成フローの実例紹介が評価された。IT・Web系転職サイトに栽培系ブログが掲載されたことは、デジタルとアナログ業界の橋渡しとして意義深い。筆者は今後、両業界の利点を融合させる役割を目指している。追記として、レバテックキャリアと同じ運営会社が、フリーランス向け案件紹介サイト「フリーランスHub」を立ち上げたことが紹介されている。フリーランスHubでは、地域やリモートワークなど様々な条件で業務委託案件を検索できる。

 

WindowsでGo言語

/** Geminiが自動生成した概要 **/
Windows 10でGo言語開発環境を構築する手順をまとめた記事です。Git、Go、Atomエディタをインストールし、日本語化やGo開発に必要なパッケージを追加します。AtomでGoファイルを作成し、"hello world"を出力するサンプルコードの実行までを解説しています。Go言語のバージョンは1.9.4、Windowsは64bit版を使用しています。最後に、アンチウイルスソフトの設定が必要になる場合があることに触れています。

 

COMODO Internet Securityを利用しながらGoで書かれたプログラムを実行する

/** Geminiが自動生成した概要 **/
COMODO Internet SecurityがGoプログラムの実行をブロックする問題への対処法。COMODOの「アプリケーションのブロック解除」画面で、ブロックされたGoプログラムにチェックを入れ、「すべてのセキュリティコンポーネントのブロックを解除する」を選択する。これでAtomからの実行は可能になる。ただし、go buildで作成したバイナリは実行毎にブロックされるため、Goバイナリを無条件で実行する方法については未解決。

 

SOY CMSに総当り攻撃を仕掛けてみる。その2

/** Geminiが自動生成した概要 **/
Go言語でSOY CMSへの総当り攻撃コードを改良した。前回はトークンチェックで攻撃が無効化されたため、今回はトークン取得とセッションキー保持の処理を追加した。具体的には、ログインページからトークン値を抽出し、自作のCookieJarを用いてセッションキーを保持することで、正規のログインと同様にトークンを送信できるようにした。この改良により、辞書攻撃が可能になった。 最後に、管理画面URLの特定の容易性と攻撃のしやすさを指摘し、URLを複雑にする、IDを辞書攻撃されにくいものにするなどの対策の必要性を訴えている。

 

SOY CMSに総当り攻撃を仕掛けてみる。その1

/** Geminiが自動生成した概要 **/
SOY CMSへの総当たり攻撃を試行する記事。Go言語でログインを試みるコードを作成し、IDとパスワードを固定で送信、ログイン失敗を確認。本来は辞書データを用いて繰り返し実行する計画だったが、SOY CMSのログインフォームにトークンのチェックがない事を発見。GitHubで管理しているコードにトークンチェックを追加し、攻撃を阻止した。

 

Go言語で認証鍵を使ってSSHの接続を行う

/** Geminiが自動生成した概要 **/
Go言語でSSHの秘密鍵認証によるリモートサーバ接続を実装する方法が紹介されています。 `ioutil.ReadFile` で秘密鍵ファイル(id_rsa.pem)を読み込み、`ssh.ParsePrivateKey` でパース、`ssh.PublicKeys` で公開鍵を設定することでパスワード認証から秘密鍵認証に変更できます。`id_rsa.pem` ファイルは `openssl` コマンドで `id_rsa` から変換する必要があります。 サンプルコードでは、接続後、リモートサーバに空ファイルを作成する処理を実行しています。

 

Go言語でサーバのバックアップの仕組みを作ろう。SSH編

/** Geminiが自動生成した概要 **/
Go言語でサーバのバックアップを作成するため、SSH接続を用いたファイルコピーから、Zipファイルのダウンロード方式に変更された。 `golang.org/x/crypto/ssh` パッケージを利用し、SSH接続を確立、リモートでコマンドを実行するテストコードが作成された。このコードは、指定したサーバに接続し、空のファイル`empty.txt`を作成することに成功。今後の開発は、このSSH接続とコマンド実行機能をベースに、Zipファイルのダウンロード処理を実装する方向で進められる。

 

Go言語でサーバのバックアップの仕組みを作ろう。ファイルの更新編

/** Geminiが自動生成した概要 **/
Go言語でサーバのバックアップスクリプトを改良し、ファイルの更新日時をチェックするようにした。前回は全ファイルをコピーしていたが、今回はバックアップ元と先のファイルの更新日時を比較し、元ファイルが新しい場合のみコピーする処理を追加。`os.FileInfo`の`ModTime()`メソッドで更新日時を取得し、Unixタイムに変換して比較することで実現した。コード例では`filepath.Walk`でファイルを走査し、更新日時が新しいファイルのみ`io.Copy`でコピーしている。

 

Go言語でサーバのバックアップの仕組みを作ろう。Walk編

/** Geminiが自動生成した概要 **/
Go言語でファイルサーバのバックアップを作成する過程の記録。今回は同一PC内でのディレクトリとファイルコピーを実装。`filepath.Walk`でディレクトリ構造を走査し、`os.Stat`でバックアップ先にディレクトリが存在しなければ`os.Mkdir`で作成。ファイルは`os.Open`、`os.Create`、`io.Copy`でコピー。`tree`コマンドでコピー結果を確認し、ディレクトリ構造とファイル内容が正しくコピーされたことを確認。ただし、ファイル更新日時を考慮したコピー処理は未実装。

 

土壌分析アプリsoil2 by Go

/** Geminiが自動生成した概要 **/
Go言語で開発された土壌分析Webアプリ「soil2」の紹介。 入力された土壌分析値をグラフ化し、将来的にはサードパーティアプリとの連携も視野に入れている。Go言語採用理由は、コンパイル言語のためサーバー環境によるコード変更の手間を省き、処理速度の向上も見込めるため。REST APIと管理者機能を実装し、グラフ表示にはChart.jsを使用。当初は身内向け公開予定だったが、最終的にはSOY Shopのマイページ機能に統合された。

 

Goのgoroutineで平行処理を試してみる

/** Geminiが自動生成した概要 **/
Goのgoroutineを用いた並行処理の練習として、偶数奇数判定プログラムを例に解説。通常は上から順に実行されるコードを、計算(sender)と表示(receiver)に分け、channelで繋ぐことで並行処理を実現。senderは計算結果をchannel(ch,ch2)に送り、receiverはselect文でch,ch2から値を受け取り表示する。例ではgoroutineの利点は活かされていないが、マルチコア風な処理を記述できた。

 

GoでGETを使ってHTMLを文字列で取得してみる

/** Geminiが自動生成した概要 **/
Goの`http.Get`関数を用いてHTMLを文字列として取得する方法を解説。ライブラリに頼らず、ピュアな方法で実現。`http.Get`でURLを指定しレスポンスを受け取り、`res.Body`からHTML部分を読み込む。`ioutil.ReadAll`で読み込んだbody(byte型)を文字列に変換するために、`bytes.NewBuffer`でバッファに格納後、`buf.String()`で文字列型に変換する。`defer res.Body.Close()`で処理終了後にレスポンスをクローズ。最後に`fmt.Println`でHTML文字列を出力し、動作を確認。

 

golangでテストを書いてみたのでメモ

/** Geminiが自動生成した概要 **/
Go言語のテスト方法についての記事です。`sample.go`に`MakeRandomString`(ランダム文字列生成)と`Convert`(MD5ハッシュ化)関数を定義し、`sample_test.go`にテストコードを書きます。`Test`+関数名でテスト関数を定義し、`t *testing.T`を引数に取ります。`Convert`関数のテストでは、空文字やハッシュ化前文字列と等しい場合に`t.Error("failed")`でエラーとします。`go test`コマンドでテストを実行し、`PASS`なら成功、`FAIL`なら失敗となります。`MakeRandomString`関数のテストでは、2回生成した文字列が同じであればエラーとしています。

 

Golangのsessionの取り扱いの際の型で苦戦した

/** Geminiが自動生成した概要 **/
Go言語でgorilla/sessionsを使ってセッションを扱う際、セッションから取得した値の型がinterface{}となり、string型の構造体フィールドに代入できない問題が発生した。ログ出力ではstring型に見えたが、構造体への代入時に型エラーが発生。stringへの型アサーションを試みても解決せず、最終的に構造体のフィールド型をinterface{}に変更することで回避した。セッション値取得時の動的な型定義と構造体の静的な型チェックの不一致が原因と考えられる。より良い解決策を模索中。

 

Goで一方向ハッシュ関数によるパスワードの暗号化を書いてみた

/** Geminiが自動生成した概要 **/
SHA-2は、SHA-1の後継として開発された暗号学的ハッシュ関数群です。SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256といったバリエーションがあり、それぞれ異なるハッシュ値の長さを生成します。SHA-2は、メッセージダイジェストを作成することでデータの整合性を検証し、改ざんを検出できます。内部構造はSHA-1と類似していますが、より安全で攻撃に対する耐性が高いとされています。現在、SHA-256とSHA-512が広く利用されており、SSL/TLSやデジタル署名など、様々なセキュリティアプリケーションで重要な役割を果たしています。


Powered by SOY CMS  ↑トップへ