自由気ままにブログ

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

日本語でプログラミング!?

f:id:nono138:20200421225921p:plain

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

就業中、ググっていたら、面白いものを見つけました。
GitHubでお世話になっています、mattnさんのブログより


最後の部分で定義をUTF-8で使えるとのこと
さっそく、試してみたコード

package main

import "fmt"

type 女優 string

func (所属 女優) 名前出力() {
    fmt.Println("鈴村あいり")
}

func main() {
    var プレステージ 女優

    プレステージ.名前出力()
}


結果

鈴村あいり


ちゃんと、怒られずに実行できました。

プログラミングは体力を使うのでこう言った遊び心があると少しだけ紛れる気がします。
コロナでのリモートワークが推奨されており、弊社もリモートワークを考えていますが、私は家だと絶対に仕事しないので難しいところです。

配列に配列を代入はやってはいけない。

f:id:nono138:20200421225921p:plain

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

以前、配列に配列を代入すると、両方の配列が値を変換されてしまう問題を紹介したいと思いますが、その原因が分かりました。

↓参考にさせて頂いたページ



どうやら、代入した時点で、値だけでなく、ポインタまで代入してしまい、一見、片方だけ触っているつもりが、両方の変数を触ってしまっていることになります。
見かけ状は変数が2個に見えるが、ポインタが一緒なので、実質的に1個の変数として扱われている状態です。

こちらの対処として、copy関数を使うことで、対策は可能です。
正しい例

package main

import (
    "fmt"
)

func main() {
    var x int
    var y int

    x = append(x, 3)
    x = append(x, 4)
    y = append(y, 5)
    y = append(y, 6)

    fmt.Println(x, y)
    copy(x, y)
    fmt.Println(x, y)
    x[0] = 1
    fmt.Println(x, y)

}


結果
[3 4] [5 6] [5 6] [5 6] [1 6] [5 6]

配列xしか、変わっていないので、成功していますね。

細かい概念の理解がイマイチなので、もっと理解を深めないといけませんね。
現在、GoでPDFを扱う開発をさせて頂いていますが、日本語だとgofpdfが使えないので、なかなか難儀しております。

Goでの、二次元配列代入で躓いたところ(暗黙的代入)

f:id:nono138:20200421225921p:plain

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

業務に辺り、多次元配列をよく使う場面があると思います。
二次元配列とは、簡単に言うと、配列の中に配列を格納するような機能です。

一連の処理が終わった後、配列を元の配列に代入し初期値に戻そうと思ったのですが、上手く値が戻せないと悩んでいました。

二次元配列の中身を確認したところ、配列がコピーされていました。

package main

import (
    "fmt"
)

func main() {
    var test1 int
    var testA int

    test1 = append(test1, 3)
    test1 = append(test1, 4)
    testA = append(testA, 5)
    testA = append(testA, 6)
    test := [...][]int{
        test1,
        testA,
    }

    fmt.Println(test)
    test[0] = test[1]
    fmt.Println(test)
    test[1][0] = 1
    fmt.Println(test)

}


簡単なコードで、go playgroundで確認したところ次のような結果が得られました。

配列代入結果
test1配列にtestAを代入後、test1に1を代入するだけの処理ですが、暗黙的にtestAにtest1の結果がコピーされています。

分かりやすく書くと
x = 1; y = 2; xとyの初期化
x = y   この時点でxは2になっています
x = 3 xに3を直接代入
(y = x) 暗黙的にyにxが代入されている

goでの仕様なのか、配列は元々、そう言うものなのかは不明なので、分かる方がいれば是非、ご教授頂きたいです。

また、goでの仕様で配列は定数化出来ない(constは配列では使用不可)ので、初期値に戻すには、また直接、yに2を代入するしか、思いつきませんでした。
良い方法がまだまだ、あると思いますので、まだまだ自分の未熟さを痛感する今日この頃です。

Goでcsvファイルをキーにtxtファイルのデータを表示(連想配列)

f:id:nono138:20200421225921p:plain

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

Go言語で、csvファイルをキーに、txtファイルのデータとキーが一致したら、表示させるプログラムを組んでみました。

csvファイル(キー)の中身
csvSS

txtファイル(データ)の中身
dataSS

textファイルの:以下のデータを表示させます。
Goの連想配列を利用したソースコードになります。
mainがこちらになります。

package main

import (
    "fmt"
    "encoding/csv"
    "os"
    "bufio"
    "strings"
)
var csvline string //csvデータの文字列配列
var dataline string
var dMap map[string]string //mapの作成
func main() {
    csvPath := "key.csv"
    datePath := "datefile.txt"
    csvline,err := csvRead(csvPath) //csvファイルを、文字列配列に格納
    if err != nil{
        fmt.Println(err)
    }
    dMap,err := dataRead(datePath)//txtファイルを、mapのkeyとvalueをget
    if err != nil{
        fmt.Println(err)
    }
    //fmt.Println(dMap)
    resultMap,err := decide(csvline,dMap)
    if err != nil{
        fmt.Println(err)
    }
    //fmt.Println(resultMap)
    for i:= 0; i < len(csvline); i++{
        fmt.Println(csvline[i],resultMap[csvline[i]])
    }
}

csvファイルを、文字列配列に格納する関数

//csvを読み込み配列にセット
func csvRead(csvPath string)(line string,err error){
    file,err := os.Open(csvPath) //csvを開く
    if err != nil{
        fmt.Println(err)
    }
    defer file.Close()
    
    reader := csv.NewReader(file)   //csvの読み込み
    for {
        lineerr = reader.Read()
        if err != nil {
            break
        }
        csvline = line //戻り値用の値にcsvデータをループの数だけ、挿入
    }
    return csvline, nil
}

txtファイルのデータ、mapに入れる関数

//データの読み込みとkeyの判定をし、:以降のkeyをstringで返す
func dataRead(datePath string)(dMap map[string]string, err error){
    var lines string
    dMap = map[string]string{} //mapの初期化 (mapは初期化しないと、panicが起きる為)
    fileerr := os.Open(datePath)
    if err != nil {
        fmt.Println(err)
    }
    //textファイルをスキャン
    scanner := bufio.NewScanner(file)
    //スキャン出来るでけ、ループ
    for i :=0; scanner.Scan(); i++ {
        lines = append(lines, scanner.Text())
        //fmt.Println(lines[i])
        dataline = lines
        if strings.Contains(dataline[i], ":"){
            //:の位置を取得
            s := strings.Index(dataline[i], ":")
            //:の位置以前・以降を切り捨て
            datakey := dataline[i][:s] //:以前
            datavalue := dataline[i][s+1:] //以降
            dMap[datakey] = datavalue
        }
        if err != nil {
            return dMap, err
        }
    }
    return dMap,nil
}

csvのキーと一致するmapを判定する関数

//mapのkeyの判定,戻り値はmap
func decide(csvline string,dMap map[string]string)(resultMap map[string]string,err error){
    resultMap = map[string]string{}
    for i:=0; i <len(csvline); i++{
        resultMap[csvline[i]] = dMap[csvline[i]]
    }
    if err != nil {
        return resultMap,err
    }
    return resultMap,nil
}

実行結果

愛知 名古屋 岐阜 岐阜 三重 津 滋賀 大津 東京 東京


以前、Go言語では、連想配列を使わず、構造体に入れた方が良いとされて明言しましたが、JAVAを学んでいた時、あまりmapを使わなかったので、Goで触ってみましたが、なかなか便利ですね

なお、今回はcsvの順番通りに表示させるように処理がされていますが、mapだけで使うときは、順番がランダムになるので注意して下さい。

まだ、プログラミングを学んで半年経たずの半端者ですが、皆さんと知識を共有できたらなと思います。
コードのここをこうした方が良いよなど、改善ポイントも絶賛受付中なので、ご教授お願い致します。

実質、PCの引っ越し(win8→win10) オマケに意外と知らない使えるショートカットキー

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

今更ながら、ずっとwin10に変えたいと思い。
連休を利用し、OSのアップデートです

まず、win10用のプロダクトキーを購入
無料期間にやっておけばよかったと、ひたすら後悔です

バックアップ用のHDDも無いので、とりあえず、アップデート

1から環境構築です
とりあえず、欲しいソフトだけインストールして、次は開発出来るように環境を構築
Excelなどの、Officeが無くなったのはなかなかに痛い。
まぁ、家で使うことほとんどないから良いんですが、普通にショックは受けています...

ruby・Goもインストール
ちゃんとインストールされているか・動作するかのチェック
SS

問題なさそうですね(´・ω・`)

バックアップせずに、アップデートするのは私ぐらいでしょうが、皆さんもお気をつけて
私はとりあえず、clip studioが動けばいいや位の感覚で行ってしまったので、なかなかに反省しなきゃですね

最後に、職場でも、使っている方が少なかった、なかなか使えるショートカットキーを紹介します。

Windowsキー + 矢印キーでwindowsを上の左側モニター見たいに、自動で分割表示してくれます。
4分割も出来るので、調べ物が多い時や、シングルモニターしか使えない場合に便利です。

もう1つとして、Alt + Tabキーで、windowsの切り替えが出来ます。
1つのwindowsを大きく表示したいかつ、調べたい時などに便利です。
サイドボタンがあるマウスで、Alt + Tabをマクロに設定しておけべ使いやすいです。

一部、Excelなどのソフトで付けない場合もあるので、気を付けて下さい。
ショートカットキーを利用して、より良いPC生活を

Goでは、map(連想配列)をあまり使わないのが、正解らしいです。

f:id:nono138:20200421225921p:plain

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

Goを触り始めてから、早1ヶ月半程経ちます。
自社開発のシステムを少しづつやりながら、勉強をしております。

現在、使用している、おすすめの参考書があります。

実務を意識し、普通の参考書では、なかなか教えてくれないGo特有の書き方・心得など、書いてあります
↓それがこちらの参考書になります。 
*弊社に置いてある、参考書は第1版なので、少し内容が変わっているかもしれないのは、ご了承下さい。
こちらの参考書の執筆者の一人であり、私もGitHubのsqlite3でお世話になったmattnさんもいます

この参考書の中に、[mapは避ける]との記載が

フィールドの値の関係が分かりやすくなり、typeをコンパイル時に検出できるなどのメリットがあります。
Goでは、型のある言語で可能な限り、struct(構造体)で方を定義するのが吉です。
また、メソッドを追加できるのも、利点の一つですね

mapを使用し、並行処理で同時アクセスした時、変な値を読み込んだり、プログラムをクラッシュしたりする可能性があります

mapを扱う時には、排他制御に気を付ける必要があります。
その際に、syncパッケージのRW Mutexを使うのが定石になります。


こちらの参考書を使用する場合は、ある程度の基礎が必要になります。

↑私はこちらの参考書である程度の基礎を学びました。

私もmapで書いたプログラムで、想像と違った値が入って苦労しました。
書く前に、この参考書に出会いたかったなと思います

もし、余裕があれば、今書いているプログラムを改善したいなと思います。

最近、mapの概念も理解してきた気がするので(気がするだけ)、スクリプト言語も触って見たいなと思う今日この頃です。

ちょっとだけ、C#を触ってみました。

こんにちは、こんばんは、nono138です。

用意されている、テンプレートを拝借して、少しだけデザインを変えてみたのですが、どうでしょうか?
PCとスマホのデザインが統一されていないのが怠惰な私らしいですね(笑)
いづれは、wordPrssで、専用ページを作りたいと目録んでいます

今日は髪を切る予約をしていたので、珍しく、朝からの活動です。
美容師の方は、話が上手で凄いですよね。
髪の毛を切って、少し爽やかになった気がします

お昼頃に、姉の旦那さんが姪っ子を見に来ました。
毎週、県外から大変ですよね
私は特に何もしていないのですが、子供を産むって本当に大変だなと、しみじみ思います。

そして、環境は作っていたのですが、ずっと放置していた、Unityを触ってみようとやっと動き出しました
とりあえず、起動してみると、Versionが変わってる
放置しすぎましたね(笑)

こちらの本を参考にして、C#を少し書いてみました。
文法はとても、JAVAに似て、JAVAをやった事がある人なら、飲み込みが早いと思います
私はJAVAを少し触れる位のレベルなので、復習がてらにまた勉強します
しばらく、GO言語を触っていたせいか、セミコロンを付けるのを忘れがちになっています
まだ、Unityの機能的な部分は全然触れていないので、教材のC#の項目部門が終わったら、Unityのお勉強ですね。
visual studio codeの使い方も調べないとですね。
覚える事が多くて、先が長そうだ...
今年中に簡単なゲームを一個でも作れたら良いなと考えています。

 

用意されている、テンプレートを拝借して、少しだけデザインを変えてみたのですが、どうでしょうか?
PCとスマホのデザインが統一されていないのが怠惰な私らしいですね(笑)
いづれは、wordPrssで、専用ページを作りたいと目録んでいます

 

今日は髪を切る予約をしていたので、珍しく、朝からの活動です。
美容師の方は、話が上手で凄いですよね。
髪の毛を切って、少し爽やかになった気がします

 

お昼頃に、姉の旦那さんが姪っ子を見に来ました。
毎週、県外から大変ですよね
私は特に何もしていないのですが、子供を産むって本当に大変だなと、しみじみ思います。

 

今週は、週5で働かないといけないと億劫になりますね
日本人は働き過ぎだと、思う今日この頃です。