自由気ままにブログ

地方零細企業プログラマがひっそりとなにかしています。

プログラムにタイピングの早さは必要なのか? 初心者におすすめのプログラム書き方

f:id:nono138:20200421225921p:plain

タイピングの早さの必要性

twitterでタイピングを練習している方を多く見受けられ、プログラミングにおいて、タイピングの早さって大事なのではと思っている方も多いと思います。

結論から言うと、必須ではありません。

むしろ、遅くても全然大丈夫です。

弊社の社長は、IT業界40年以上の大ベテランで、某大手の学校で講師もしていた程のキャリアを持っています。

じゃあ、タイピングは滅茶苦茶、早いねと思われるかもしれませんが、ぶっちゃけ滅茶苦茶、遅いです。

タッチタイピングはおろか、人差し指2本でコーディングしています。

私が分からないことを聞きに行く時は、言うからちょっと代わりに書いてとよく言われます。

開発速度は?と言うと早いです。

開発しよとしているシステムのプロートタイプを荒削りではありますが、土日間でだいたい作ってしまいます。

私の10倍ぐらい早いですね😨

つまり、プログラムを組む際には、書く速さより考える速さの方が大事だと分かりますね。

とは言った物の、タッチタイピングが出来るに越したことはないですけどね😅

もちろん、両方出来るのが最強なんですけどね。

プログラムを書く速度は考える速さへの依存が大きいです。

続きを読む

go-sqlite3をちょっこと触る

f:id:nono138:20200421225921p:plain

プログラミング言語の基礎を学んだ後に、次のステップとして触るのがデータベースになります。

今あるソフトウェア開発でデータベースを扱うのが大半だと思います。
今回は、データベースのテーブル作成・データの挿入・データの参照まで軽く書いて見ました。

ドライバーはmattnさんのgo-sqlite3を使わせて頂きました。

先ずは、sqliteからダウンロードしましょう。



ドライバーはGitHubから、直接ダウンロードするのも良いですが、dosプロンプトを開いてコマンドを叩けば落とせるので試してみて下さい。

コマンド
go get github.com/mattn/go-sqlite3
でダウンロード出来るはずです。(便利ですね~)

今回使うドライバーはgcc(C言語コンパイラ)が必要なのでそちらもダウンロードします。



データベースを確認する為に、DB Browserも一応、入れておきます。


長くて申し訳ありませんが、これで準備は出来ました。

goソース

package main

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/mattn/go-sqlite3"
)

//データベース用構造体
type Userinfo struct {
    chord      int
    userName   string
    category   string
    recordDate *time.Time
}

func main() {

    //データベースのコネクション
    DBerr := sql.Open("sqlite3""sample.db")
    if err != nil {
        fmt.Println(err)
    }
    //必ずデータベースは閉じるようにしておきましょう
    defer DB.Close()

    err = createTable(DB)
    if err != nil {
        fmt.Println(err)
    }
    err = insertDB(DB)
    if err != nil {
        fmt.Println(err)
    }
    err = selectDB(DB)
    if err != nil {
        fmt.Println(err)
    }
}


データベースのデータを格納する為の構造体を用意してあげましょう。
構造体とデータベースの型はきちんと合わせてあげましょう。
メインでデータベースを開きます。
コメントでも書いてありますが、必ずデータベースを閉じるようにしましょう。
あとは、関数を読んでいるだけになります。

crateTable

//テーブルの作成
func createTable(DB *sql.DB) (err error) {
    //ユーザー情報テーブル作成
    var cmd = ""
    cmd = "CREATE TABLE userinfo("
    cmd += "Chord INT(8) NOT NULL PRIMARY KEY, "
    cmd += "UserName VARCHAR(24) NOT NULL, "
    cmd += "Category VARCHAR(2) NOT NULL, "
    cmd += "RecordDate DATETIME "
    cmd += ")"

    _err = DB.Exec(cmd)
    if err != nil {
        return err
    }
    return nil
}


sql文を用意して、Execで実行してあげるだけです。
DB Browserで作れているか、一応、確認。
実行前
brow2
作れていますね。
これは、crateTablel関数を呼び出しただけの動作なので、二回目以降は同じテーブルは付く無いので注意してください。

insertDB

//テーブルにデータ挿入
func insertDB(DB *sql.DB) (err error) {
    nowtime := time.Now()
    var cmd = ""
    cmd = "INSERT INTO userinfo("
    cmd += "Chord, UserName, Category, RecordDate) "
    cmd += "VALUES ("
    cmd += "1, 'テスト 太郎', '男性',"
    cmd += nowtime.Format(layout)
    cmd += ")"

    _err = DB.Exec(cmd)
    if err != nil {
        return err
    }
    return nil
}

const layout = "20060102"


こちらも、テーブルを作成する時と、全く同じですね。

brow3
ちゃんと挿入されていますね。

//テーブルのデータを一括検索
func selectDB(DB *sql.DB) (err error) {
    //テーブルデータ取得
    cmd := "SELECT * FROM userinfo"
    rows_ := DB.Query(cmd)

    defer rows.Close()

    var userArray []Userinfo
    for rows.Next() {
        var user Userinfo
        err := rows.Scan(&user.chord, &user.userName, &user.category, &user.recordDate)
        if err != nil {
            fmt.Println(err)
        }
        userArray = append(userArray, user)
    }
    for _user := range userArray {
        fmt.Println(user.chord, user.userName, user.category, user.recordDate)
    }
    return nil
}


今回は*で検索していますが、本番ではちゃんとカラム名を指定してあげましょう。
Scanで、構造体にデータを挿入してあげます。
あとは、配列に入れて、その配列をデバック用にoutputしています。
配列に入れることで、行単位でデータを取れるので、後々楽だったりします。

実行結果 (省きましたが、insertをもう一回走らせています)
dos

DB Browser

brow4

dosプロンプト上だと、レコードが上手くとれていませんね。
DB Browserだと上手く表示出来ているんですけどね。
原因として考えれるのは、sqliteがDATETIME型をサポートしていないので、TEXT型で入れてstring型で受け取ってあげるのが良いかもです。

データベースもいろんな選択肢がありますが、シンプルながら一連の基礎まで使えるsqliteを採用しました。
実際、sqliteスマホゲームや、比較的軽いデータを扱うwebサービスでも採用されていますので、機能としては十分だと思います。
金融関係だと、Oracleがまだ、主流らしいですけが、まだ触ったことないのでそこら辺は分かりません

web系で、サーバサイドを考えている方はSQLは必ず通る道です。
Goだけやってればいいとは限らないのがツライところですね

最近では、javaScriptのnode.jsでサーバサイドもやってしまうと言った動きもあるそうなので、フロントエンドの方も「ちょっと、node.jsでサーバサイドやってみて」と無茶振りされるかもしれないので、データベース周りは知ってて損は無いと思います。

jsonファイルでテーブル作成 Tabulatorが高性能で便利過ぎる

サーバサイド側から、jsonファイルを渡してあげたところで、またテーブルを作成する処理がなかなか面倒ですよね。

そんな時にTabulatorがかなり便利です。
Tabulatorを使うと、ソート機能やデータの変更も容易に可能になります。
また、ajaxも対応しているので、動的にテーブルをの変更なども可能になります。

ダウンロードは公式サイトから、行って下さい


Tabulatorを使う際には、jQueryが必要になるので、jQueryもダウンロードして下さい。


現在、3.5.0にバージョンアップしてありますが、仕様の変更を確認していない為、3.4.1を使用しています。
また、重くなってしまうので、min版をダウンロードすることをおすすめします。

javaScript :tabulator.js

$(function () {
    //jsonファイル
    var json = [
        {
            name: "のび太",
            gender: "男性",
            rating: 20,
            col: "yellow"
    },
        {
            name: "ドラえもん",
            gender: "男性",
            rating: 100,
            col: "blue"
    },
        {
            name: "しずかちゃん",
            gender: "女性",
            rating: 30,
            col: "pink"
    },
        {
            name: "ジャイアン",
            gender: "男性",
            rating: 60,
            col: "orange"
    },
        {
            name: "スネ夫",
            gender: "男性",
            rating: 40,
            col: "green"
    }
];
//テーブルの作成
    var table = new Tabulator("#example-table", {
        layout: "fitColumns",
        tooltips: true,
        addRowPos: "top",
        history: true,
        data: json,
        columns: [
            {
                title: "名前",
                field: "name"
            },
            {
                title: "性別",
                field: "gender"
            },
            {
                title: "能力",
                field: "rating",
                editor:true,
                formatter:"progress"
            },
            {
                title: "イメージカラー",
                field: "col",
                formatter:"color"
            },
        ]
    });
});


HTML:sample.html

<!DOCTYPE html>
<html>

<head>
    <title>tabulator Sample</title>
    <meta charset="UTF-8">
    <!-- jQuery読み込み -->
    <script src="../jquery-3.4.1.min.js"></script>
    <script src="../jquery-ui.min.js"></script>
    <!-- Tabulatorの読み込み   -->
    <link href="../tabulator-master/dist/css/tabulator.min.css" rel="stylesheet">
    <script type="text/javascript" src="../tabulator-master/dist/js/tabulator.min.js"></script>
    <!--    検索結果のテーブル作成-->
    <script type="text/javascript" src="../js/tabulator.js"></script>
</head>

<body>
    <div id="example-table">
    </div>
</body>

</html>


結果
tabulater


こんな感じに出来ます。
ソートはも出来、カラー・プログレスバーなども表示し、editor:trueで編集も可能になります。

比較的、簡単に実装出来るので、おすすめです。
また、Tabulatorの公式サイトもサンプルをかなり置いてくれているので、かなり良心的で分かりやすいです。
サーバサイドでの処理ですが、テーブルの行(row)単位でデータを取れるので、変えたいところの行のデータを、サーバサイドに送って、データベースのUPDATEも簡単にできます。

javaScriptはかなりのライブラリーがあるので、探すのは大変ですが、その反面、面白さもありますね。

jsファイルをコマンドプロンプト(dosプロンプト)で実行

ほとんどコンパイル言語しか触ったことないので、javaScriptになかなか慣れないでいます。
GoやJAVA見たいにdosプロンプトで実行・デバックをしたいと思い至った次第です。

まず、超簡単なjsファイルを用意
file: dos.js

for (var i =0i < 10i++){
    console.log(i);
}


dos.js実行
dosJS2

consoleオブジェクトが無いとのエラーが発生

いろいろと調べた結果、consoleを使うのには、どうやらnode.jsが必要らしい。
私は、Bracketsをインストールした時に一緒にnode.jsも自動にインストールしてくれていたらしく、新たにインストールする必要はありませんでした。

無い方は、こちらから、ダウンロードして下さい。


node dos.jsで実行
dosJS3

今度はきちんと出力してくれましたね。
もちろん、Hello Worldも出力出来ます。

var str = "Hello World";
    console.log(str);


dosプロンプト画面
dosJS5
ちゃんと、Hello Worldが出力されていますね。

ブラウザ側では、デベロッパーツールから、デバック確認が出来るのでそちらで確認しましょう。
htmlソースと確認画面も載せておきます。
HTML:dos.html

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>html5 + js で json ファイルにアクセスしてデータを取得する</title>
    <script src="dos.js"></script>
</head>

<body>
</body>

</html>

右上のボタン → その他ツール → デベロッパー ツール

dosJS6
consoleボタンをクリック
dosJS7
Hello Worldが確認できますね。
また、ファンクションキーがある方は、F12キーだけで、デベロッパーツールが開けるので、そちらを使うことをオススメします。

こんな、面倒なことしなくても良くない?と思うかもしれませんが、デバック作業はかなり大事なことなので、上手く処理が行かない時は、consoleを是非、活用しましょう

fmtパッケージだけで、なんでも簡単にstring型に変換

f:id:nono138:20200421225921p:plain

Goは型のある言語で、型を意識して書かないといけません。

関数を使いたい時など、引数でstring型にしていされていて、あれ?使えない...って時がよくありませんか?私はよくあります。

通常だと

package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := 10
    fmt.Printf("%t\n", num)

    numStr := strconv.Itoa(num)
    fmt.Printf("%t", numStr)
}

結果

%!t(int=10)
%!t(string=10)

になります。

Sprintfを使うと、

package main

import (
    "fmt"
)

func main() {
    num := 10
    fmt.Printf("%t\n", num)

    numStr := fmt.Sprintf("%d", num)
    fmt.Printf("%t", numStr)
}


結果

%!t(int=10)
%!t(string=10)


int型から、string型に変換されていますね。

fmtパッケージだけで済むのが嬉しいですね。
また、int型だけではなく、interfeceやdate型にも対応できるので、string型に変換する時に困った時は、大体、Sprintfで解決できます。
また、前に”,”を付けたいなど、いわゆるカンマ編集なども容易に出来るのがいいですね。

一応、date型も変換出来るか見てみましょう

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    fmt.Printf("%t\n", t)

    timeStr := fmt.Sprintf("%d", t)
    fmt.Printf("%t", timeStr)
}


結果

{%!t(uint64=13454110244426743808) %!t(int64=1) %!t(*time.Location=&{   0 0 <nil>})}
%!t(string={13454110244426743808 1 1984640})


大丈夫そうですね。
Sprintfは結構、使える関数なので、ぜひ活用してみて下さい。


私事ですが、最近、推しのエンジニアさんがいるので、勝手に紹介させて頂きます。
名前はmattnさんです。
GitHubやブログ・Twitterを結構、頻繁に更新して下さるので、とてもお世話になっております。
また、みんなのGo言語などの技術書の執筆などもしていますので、ぜひ手にしてみて下さい。
twitter・ブログURLも一緒に貼っておきます。
twitter


ブログ

関数の引数・戻り値が多い場合は、メソッドを使おう

f:id:nono138:20200421225921p:plain

こんにちは、こんばんは、138nonoです。

goを作る時に、ついつい引数・戻り値が多くなってしまう時はありませんか?
若輩の私はよくあります。

そんな時、使うのがメソッドです。
メソッドの使い方は、こんな感じです。

package main

import "fmt"

type something struct {
    num        int
    characters string
}

func main() {
    something := new(something)
    something.num = 5
    something.characters = "Gopher"
    fmt.Println(something.num, "\n", something.characters)
    something.do()
    fmt.Println(something.num, "\n", something.characters)
}
func (anything *something) do() {
    anything.num *= 2
    anything.characters = "Hello World"
}


結果

10 
Hello World



関数の前に構造体を渡してあげるだけで、結果も戻ってくれます。
構造体を使うことによって、簡単にオブジェクト指向になります。
勿論、引数・戻り値も設定してあげることが出来ます。

関数だけでもシステムとしては成り立ちますが、コードの可読性、つまり、保守・運用性に欠ける場合があります。
場合に合わせて、関数かメソッドを使うかを適切に決めましょう。

1人で全てやってしまう、システムなら、良いですが、現在はチームで作るシステムが普通になっています。
また、少し時間が経つと、自分のコードを忘れてしまうこともよくあります。
(私自身、見返すとクソコードやなぁとよく思います…)
最初は難しいですが、慣れて来たら、誰かに見せる意識でコードを書くを書くのが良いと思います。