技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

ヌルオブジェクトの導入【リファクタリング】

状況 null値のチェックが繰り返されている 対処 ヌルオブジェクトを作り、null値チェックと置き換える メリット コードがシンプルになり、どこをポリモーフィックにすべきかがわかりやすくなる ヌルオブジェクトは、「特殊ケース」とも捉えることができ、こ…

v-forで要素数に変化があるときはkeyにindexを用いない【Vue.js】

備忘です。 v-forで要素数が変化(後で追加、削除を行う)する場合には、 keyにindexを用いてはいけないようです。 keyは要素の変更を、どのデータに対して行うべきか判別するために使われます。 v-forで生成されるindexをkeyに使った場合、要素の追加や削除…

連想配列のvalue更新をリアクティブにする方法【Vue.js】

次のように連想配列が定義されているとします。 data () { return { showEdit: {}, } }, 上記に対して、次のような処理を行っても変更結果がリアクティブになりません。 this.showEdit[id] = false; 次のように記述する必要があります。 this.showEdit = Obj…

連想配列のkey指定に変数を用いる方法【Javascript】

連想配列のkeyを指定してvalueにアクセスする際、 itemList.hoge = "hoge" というように「.」を使うことが一般的ではありますが、 変数を使う場合には次のようにします。 var key1 = "hoge" itemList[key1] = "hoge"

axiosでresponseデータのフィールドにアクセスする方法【Go】

クライアントとサーバーの通信を、クライアントではaxiosを用いる例です。 ユーザーに関する情報をサーバーでデータベースに保存しておき、 ログイン後のページで、そのデータを利用して表示を変えることを想定します。 例えば次のコードを見てみます。 goフ…

axiosでformの値を送受信する方法【Vue.js】【Go】

POSTまたはPUTのformデータをサーバーサイドに送信する際、 axiosでは、デフォルトでJSON形式にしてrequest payloadに乗せて送られます。 HTTP.Requestは次のようになっています。 POST /some-path HTTP/1.1 Content-Type: application/json { "username" : …

mixinでグローバル定義【Vue.js】

mixinを使うことで、どのコンポーネントでも「this.~」の形で、関数や変数computedなどを利用することができます。 下記のようにmixinsフォルダを作成し、その下にjsファイルを作成した方が管理しやすいでしょう。 build config src ... mixins globalValiab…

https接続【Vue.js】

Vue-CLIを使ったhttps接続です。 build/webpack.dev.conf.jsを編集します。 見やすさのために一部を抜粋し、追加する2行についてコメントを記載しています。 'use strict' const utils = require('./utils') ... const fs = require("fs") // 追加。ファイル…

Cross-Originを許容してCookieを送受信する【Go】

フロントをVue (port :8081)で、サーバーをGo (port :8080)で実行した時、Safariは「開発」メニューから一時的にCross-Originの制限を無効にすることができますが、Chromeにはそれらしきものが見当たらず、Headerにセットすることにしました。備忘として残し…

TLS【Go】

TLSを使ったHTTPS通信を紹介します。 2015年にはGoogleがHTTPS通信を行うサイトを、検索結果において優遇すると宣言したように、どのサイトでもTLSを用いたHTTPS通信が要求される時代です。 証明書、秘密鍵の生成 TLSを使用するには、その方式で使われる証明…

case: 長すぎるパラメータリスト【リファクタリング】

パラメータが多すぎる状態は、記述するのが面倒なだけでなく、それぞれのパラメータの役割をわかりづらくします。 一番の問題は、変更に対応するための作業が煩わしくなることです。パラメータを一つ追加すると呼び出し側の修正が必要になります。 パラメー…

Cookieに使える、base64エンコード【Go】

Go

CookieにJSONの内容を格納する際などは、base64を用いて事前にエンコードし、Cookieから取り出した後にデコードします。 Cookieには許容されない文字を使うと、Cookieにそもそも登録できない、または異なるValueの値が登録されてしまうからです。 func main(…

MySQL - invalid memory address or nil pointer dereference【Go】

複数の関数で、DBコネクションを使い回す場合には、注意が必要です。 dbだけでなく、sql.Open()の返り値に含まれるerrもpackageグローバルに定義して、 sql.Open()の返り値のアサインは「:=」ではなく、「=」を使用します。 var db *sql.DB var err error //…

MySQL【Go】

インストール sql-Driverごとにpackageをインストールする必要があります。 $ go get -u github.com/go-sql-driver/mysql import database/sqlは、コード中で使用するものの、mysqlについてはプログラムの起動処理には使われますが、コード中では使用しない…

Linuxコマンド

著者が初めて使用する度に書き加えていくもので、網羅しているわけではありません。 ファイル 作成 $ touch mymemo.txt 編集 $ nano mymemo.txt // nanoはviより使いやすい 削除 $ rm mymemo.txt 移動 $ mv mymemo.txt Memos // ファイル名を変更しない場合 …

コマンド【Go】

著者が初めて使用する度に書き加えていくもので、網羅しているわけではありません。 単一ファイルの実行 $ go run main.go package mainが複数ファイルに分かれている場合の実行 $ go build $ ./<exe-name > // デフォルトのexe名は、project名 もしくは $ go build -o </exe-name>…

nano(使いやすいCUIエディタ)

nanoは、CUI(Character User Interface、コマンドラインなど。↔︎ GUI)環境における、使いやすいエディタです。 標準搭載のvi等に比べ、覚えるキー操作も少なく、簡単に扱うことができます。 ファイルの作成 $ nano または $ nano mymemo.txt // mymemo.txt…

Sessionの期限更新と清掃【Go】

Go

処理を実行するごとにsessionの有効期限を更新し、ログアウト時に、他のユーザーに関するsession情報も含めて、 一定時間を超えたsessionを削除する機能を用意します。 過去の記事を基にしています。 Session【Go】 - 技術向上 bcryptでパスワードをhash化【…

bcryptでパスワードをhash化【Go】

Go

サードパーティのbcryptを使用します。 bcrypt - GoDoc シンプルな記述で暗号化でき、暗号の強度も数字や定数を指定するだけです。 暗号化 暗号化の対象(byte配列)とコスト(暗号の強度)を引数にとり、byte配列とエラーを返します。 bs, err := bcrypt.Ge…

Session【Go】

Go

Sessions、Users sessionの簡単な例をお見せします。 sessionsテーブルとusersテーブルを用いてユーザー情報を管理するイメージです。 sessionsテーブルのunique idをキーに、usersテーブルの情報を引き出します。 main.goです。 type user struct { // 各ユ…

Unique IDの生成【Go】

Go

サードパーティのパッケージを使用します。 GitHub - satori/go.uuid: UUID package for Go func main() { http.HandleFunc("/", index) http.HandleFunc("/read", read) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServe(":8080",…

Cookieの削除【Go】

Go

CookieにはMaxAgeという、有効期限を秒数で指定する属性があります。 Goでは、このMaxAgeにマイナス値か0を設定することで、対象のCookieを削除することができます。 func main() { ... http.HandleFunc("/delete", delete) // 「/delete」にアクセスしたらd…

Cookieの読み書き【Go】

Go

Cookieをセットし、Nameを指定してセットしたCookieを取得する例です。 func main() { http.HandleFunc("/", set) http.HandleFunc("/read", read) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServe(":8080", nil) } func set(w ht…

Cookieの概要とセキュリティ

Webサーバとブラウザ間で状態を管理する通信プロトコル、その管理の中でブラウザに保存された情報を指します。 主な用途は、ショッピングサイトのカートの状態などで、ユーザーが操作した情報を一定期間保存して利便性を高めるために使われます。 動作 サー…

コンテナ

Dockerに代表されるコンテナ型仮想化は、 1つのOS環境に、コンテナと呼ばれる分離された空間を作成し、コンテナごとに異なるOS環境(version)を実現します。 コンテナは、あくまで一つのOSの上に成り立っているため、物理マシン上で一般的な「OSブート手順…

Redirects【Go】

Go

http.Redirect() 303、307の例をお見せします。 記述内容が異なるのは、http.Redirect()の第4引数のみです。 templateであるindex.gohtmlです。 formのaction属性に「/bar」を指定します。 <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="POST" action="/bar"> <input type="text" name="fname"> </form></body></html>

HTTP Status Code 307

使用ケース 307 Temporary Redirectは、リクエストされたリソースが一時的に異なるURLに移動されたことを意味します。 元のリクエストメソッドがそのまま移動先へのリクエストメソッドとなります。 したがって、301や303と違い、POSTがGETに変更されることは…

HTTP Status Code 303

使用ケース 303 See Otherは一般的に、PUTやPOSTの結果として返されるステータスコードです。 例えば掲示板などでPOST送信した後に再び書き込み一覧を表示してしまうと、その画面を再読み込みした場合に、再度同じPOSTを送信できてしまいます。 これを防ぐた…

HTTP Status Code 301

使用ケース 301 Moved Permanentlyは、恒久的にURLが移転された際、その新しいURLへのリダイレクトとして使用されます。 サイトが全く異なるURLに移転したケースはもちろん、SSL化してhttpからhttpsに変更された際にも使用します。 また、SEOの観点からURLを…

case: 巨大なクラス【リファクタリング】

1つのクラスがあまりに多くの仕事をこなしている場合は、大抵、インスタンス変数の持ちすぎになっています。 インスタンス変数が多すぎると、重複したコードが生まれやすくもなります。 まず「クラスの抽出」を適用して、いくつかの変数をまとめます。ポイン…