試したこと、読んだ本について書いていくブログです。

Pocketからお祝いメールが届きました


みなさんは、「あとで読む」サービスのPocketを使用していますか?
僕はスマートフォンでニュースを読んだり、ブラウジングしたときに、気になる記事を一時保管するために以前から使っています。

先日、Pocketから以下のようなメールが届きました。

Congratulations!
We’re thrilled to let you know that you’re one of the top 5% of readers in Pocket for 2016! To celebrate, we’ve put together your very own Year in Review page with some fun stats to review and share.

どうやら、Pocketの使用頻度が高いユーザになれたようです。確かに毎日のようにPocketは使っていますが、一般的な使い方をしているつもりなので、上位5%に含まれているとは驚きです。

今後は、Pocketヘビーユーザの自覚を持ち、真摯にサービスと向き合っていきたいと思います。
とりあえず、未読の記事が溜まっているので消化していかなきゃですね…

Read more ⟶

再帰処理してみた


はじめに

Go言語を使っているときに、「再帰処理できるのか?」と疑問に思ったので試してみました。
どういった問題が再帰処理に向いているのか分からないので、とりあえず素数判定の処理を作成しています。

素数判定

標準入力された数値が素数か判断するプログラムです。

これを元に、標準入力された数値以下の素数をすべて出力するプログラムも作ってみました。

おわりに

今回は、再帰処理が行えることの確認がメインテーマです。100万以下のすべての素数を求めたところ、2時間20分かかりました。効率とか速度とかは度外視しているので、その辺は何卒ご容赦下さい。

学生時代、再帰処理の課題に苦労し「全部while文でいいじゃねぇか」と思っていましたが、再帰処理が使えてよかったと思える場面が来るのでしょうか。

Read more ⟶

8進数のエラーについて


はじめに

Go言語を使っていたら見慣れないエラーが出てたので調べてみました。

エラーの内容

試験用にサンプルの日付データを作っていたら、以下のようなコンパイルエラーとなりました。

malformed octal constant
malformed integer constant: 08

エラーとなった原因のコードはこちらです。

t = time.Date(2016, time.Month(11), 08, 00, 00, 00, 00, time.Local)

原因

Go言語は先頭に0が付いた数値を8進数だと認識します。08は8進数としては存在しない値のためエラーとなってしまうのでした。同様に、09も同じエラーとなります。

対策

単純に対策をするのであれば、以下のように08から0を除いてしまえばエラーは解消されます。

t = time.Date(2016, time.Month(11), 8, 00, 00, 00, 00, time.Local)

どうしても0809と記載したい、そんなときには、数値を"で囲って文字列として指定しておき、文字列から数値に変換させれば大丈夫です。ただし、標準で用意されているstrconv.Atoi関数は2つの戻り値を返すので、そのままでは使えません。以下のように、変換用の関数を用意する必要があります。

package main

import (
	"fmt"
	"os"
	"strconv"
	"time"
)

func main() {
	t := time.Date(2016, time.Month(atoi("11")), atoi("08"), atoi("00"), atoi("00"), atoi("00"), atoi("00"), time.Local)
	fmt.Println(t)
}

func atoi(str string) int {
	num, err := strconv.Atoi(str)
	if err != nil {
		os.Exit(1)
	}
	return num
}

矩形選択を使用する場合など、桁数をあわせたい場合には使えるのかもしれません。別途関数を用意したり、パッケージを追加する必要があり少し面倒なので、他の解決策をご存じの方がいたらお教え下さい^^;

Read more ⟶

Go言語で構造体のスライスを扱ってみる


Go言語で構造体のスライスを扱おうとしたときに少し悩んだので、まとめておきます。

ここで構造体やスライスについて詳しく説明はしません。詳細はA Tour of Goなどに記載されているので、そちらをご確認下さい。 今回は、構造体を要素として持つスライスを扱う方法をまとめています。

いろいろな操作

  • 要素にする構造体
    今回の説明で使用する構造体は以下の通り定義されています。 社員番号(number)と名前(name)を持つ社員(employee)型です。スライスで複数人の社員情報をまとめて扱うようなイメージです。
type employee struct {
	number int
	name   string
}
  • スライスの作成
    以下のようにmake関数を使えば、要素数が0のemployee型のスライスを作成することが出来ます。
employees := make([]employee, 0)

スライスの作成と初期化をまとめて行うこともできます。

employees := []employee{employee{1, "Taro"}}

複数の要素を持つスライスを1行で書くことも可能です。

employees := []employee{employee{1, "Taro"}, employee{2, "Jiro"}, employee{3, "Saburo"}}
  • 要素の追加
    既存のスライスに対して、要素を追加させるには以下のように記載します。
employees = append(employees, employee{4, "Shiro"})
  • 要素の削除
    組込み関数にはスライスの要素を削除する仕組みは実装されていません。そのため、個別に関数を作成する必要があります。例としては、以下のような関数で要素の削除機能が実現できます。
func delete(employees []employee, n int) []employee {
	result := make([]employee, 0)
	for i, v := range employees {
		if i != n {
			result = append(result, employee{v.number, v.name})
		}
	}
	return result
}
  • 要素のへのアクセス
    スライスの各要素のフィールドには個別にアクセスすることが出来ます。ここでは、先頭要素の各フィールドを出力してます。
fmt.Println(employees[0].number)
fmt.Println(employees[0].name)

以下のように、フィールドの値を変更することも出来ます。

Read more ⟶