「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > macOS 用の市庁舎時計アプリの構築: 総合ガイド

macOS 用の市庁舎時計アプリの構築: 総合ガイド

2024 年 11 月 3 日に公開
ブラウズ:260

Building a City Hall Clock App for macOS: A Comprehensive Guide

Mac 用のクールな市庁舎時計アプリを構築する準備はできましたか?素晴らしい!メニュー バーに常駐し、15 分ごとにチャイムを鳴らし、時間をカウントするアプリを作成します。ステップごとに詳しく説明します。何が起こっているかを理解できるように、コードのすべての部分を説明します。

プロジェクト概要

市役所の時計アプリは次のことを行います:

  • macOS メニューバーに時計アイコンを表示します
  • 15分ごとにチャイムを鳴らす
  • 毎正時にチャイムを鳴らします
  • メニューバーに「終了」オプションを提供します
  • ターミナル ウィンドウを開かずに適切な macOS アプリケーションとして実行します

プロジェクトのセットアップ

まず最初に、プロジェクトを設定しましょう:

  1. 新しいディレクトリを作成します:
   mkdir CityHallClock
   cd CityHallClock
  1. 新しい Go モジュールを初期化します。
   go mod init cityhallclock
  1. 必要な依存関係をインストールします。
   go get github.com/getlantern/systray
   go get github.com/faiface/beep

メインコード

さて、main.go ファイルを作成して各関数を実行しましょう:

package main

import (
    "bytes"
    "log"
    "os"
    "path/filepath"
    "time"

    "github.com/faiface/beep"
    "github.com/faiface/beep/mp3"
    "github.com/faiface/beep/speaker"
    "github.com/getlantern/systray"
)

var (
    audioBuffer *beep.Buffer
)

func main() {
    initAudio()
    systray.Run(onReady, onExit)
}

// ... (other functions will go here)

各機能を詳しく見てみましょう:

1. main()関数

func main() {
    initAudio()
    systray.Run(onReady, onExit)
}

ここからアプリが始まります。これは 2 つの重要なことを行います:

  1. initAudio() を呼び出してチャイム音を設定します。
  2. systray アプリを実行し、準備ができたとき (onReady) と終了するとき (onExit) に何をするかを指示します。

2. initAudio() 関数

func initAudio() {
    execPath, err := os.Executable()
    if err != nil {
        log.Fatal(err)
    }
    resourcesPath := filepath.Join(filepath.Dir(execPath), "..", "Resources")
    chimeFile := filepath.Join(resourcesPath, "chime.mp3")

    f, err := os.Open(chimeFile)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    streamer, format, err := mp3.Decode(f)
    if err != nil {
        log.Fatal(err)
    }
    defer streamer.Close()

    audioBuffer = beep.NewBuffer(format)
    audioBuffer.Append(streamer)

    err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
    if err != nil {
        log.Fatal(err)
    }
}

この関数はオーディオを設定します:

  1. アプリが実行されている場所を検出し、チャイム サウンド ファイルを見つけます。
  2. MP3 ファイルを開いてデコードします。
  3. チャイム音を含むオーディオバッファを作成します。
  4. オーディオ スピーカーを初期化します。

何か問題が発生した場合 (サウンド ファイルが見つからないなど)、エラーをログに記録して終了します。

3. onReady() 関数

func onReady() {
    systray.SetIcon(getIcon())
    systray.SetTitle("City Hall Clock")
    systray.SetTooltip("City Hall Clock")

    mQuit := systray.AddMenuItem("Quit", "Quit the app")

    go func() {
        



この関数はメニュー バー アイコンを設定します:

  1. アイコンを設定します (getIcon() を使用)。
  2. タイトルとツールチップを設定します。
  3. メニューに「終了」オプションを追加します。
  4. 「終了」オプションがクリックされるとリッスンを開始します。
  5. クロックの実行を開始します (ブロックされないように別の goroutine で)。

4. onExit() 関数

func onExit() {
    // Cleanup tasks go here
}

この関数はアプリの終了時に呼び出されます。ここでは何もしていませんが、必要に応じてクリーンアップ タスクを追加できます。

5. runClock() 関数

func runClock() {
    ticker := time.NewTicker(time.Minute)
    defer ticker.Stop()

    for {
        select {
        case t := 



これは私たちの時計の「心臓」です:

  1. 毎分「カチカチ」と鳴るティッカーを作成します。
  2. 無限ループでは、1分ごとに時刻をチェックします。
  3. 正時または 15 分過ぎになると、チャイムが鳴ります。

6.chime()関数

func chime(t time.Time) {
    hour := t.Hour()
    minute := t.Minute()

    var chimeTimes int
    if minute == 0 {
        chimeTimes = hour % 12
        if chimeTimes == 0 {
            chimeTimes = 12
        }
    } else {
        chimeTimes = 1
    }

    for i := 0; i 



この関数はチャイムを再生します:

  1. チャイムを鳴らす回数を計算します (40 分に 1 回、または正時の時刻の数字)。
  2. その後、チャイム音を一定回数再生し、チャイム間に短い休止を挟みます。

7. getIcon() 関数

func getIcon() []byte {
    execPath, err := os.Executable()
    if err != nil {
        log.Fatal(err)
    }
    iconPath := filepath.Join(filepath.Dir(execPath), "..", "Resources", "icon.png")

    // Read the icon file
    icon, err := os.ReadFile(iconPath)
    if err != nil {
        log.Fatal(err)
    }

    return icon
}

この関数はメニュー バー アイコンを取得します:

  1. アプリが実行されている場所を見つけます。
  2. リソース ディレクトリ内のアイコン ファイルを見つけます。
  3. アイコン ファイルを読み取り、その内容を返します。

macOS アプリケーション バンドルの作成

アプリを適切な macOS 市民にするには、アプリケーション バンドルを作成する必要があります。これには、Info.plist ファイルの作成が含まれます:

CFBundleExecutableCityHallClockCFBundleIconFileAppIconCFBundleIdentifiercom.yourcompany.cityhallclockCFBundleNameCity Hall ClockCFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleVersion1LSMinimumSystemVersion10.12LSUIElementNSHighResolutionCapable

これをプロジェクト ディレクトリに Info.plist として保存します。

カスタムアイコンの追加

2 つのアイコンが必要です:

  1. メニュー バー アイコン: icon.png という名前の 22x22 ピクセル PNG を作成します。
  2. アプリアイコン: .icns ファイルを作成します:
    • 画像のサイズを 16x16 から 1024x1024 ピクセルにします。
    • icon_16x16.png のような名前で AppIcon.iconset に保存します。
    • 実行: iconutil -c icns AppIcon.iconset

構築とパッケージ化

ビルド スクリプト (build.sh) を作成しましょう:

#!/bin/bash

# Build the Go application
go build -o CityHallClock

# Create the app bundle structure
mkdir -p CityHallClock.app/Contents/MacOS
mkdir -p CityHallClock.app/Contents/Resources

# Move the executable to the app bundle
mv CityHallClock CityHallClock.app/Contents/MacOS/

# Copy the Info.plist
cp Info.plist CityHallClock.app/Contents/

# Copy the chime sound to Resources
cp chime.mp3 CityHallClock.app/Contents/Resources/

# Copy the menu bar icon
cp icon.png CityHallClock.app/Contents/Resources/

# Copy the application icon
cp AppIcon.icns CityHallClock.app/Contents/Resources/

echo "Application bundle created: CityHallClock.app"

chmod x build.sh で実行可能にしてから、./build.sh で実行します。

結論

そして、これで完成です! macOS 用の完全に機能する市庁舎時計アプリを構築しました。以下について学びました:

  • Go でメニュー バー アプリを作成する
  • 特定の間隔でサウンドを再生する
  • Go アプリケーションをネイティブ macOS アプリとしてパッケージ化する

これについては自由に拡張してください。カスタム チャイムや異なるチャイム間隔の設定を追加することもできます。空は限界です!

完全なソース コードはここで見つけることができます https://github.com/rezmoss/citychime

コーディングを楽しんで、新しい時計をお楽しみください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rezmoss/building-a-city-hall- Clock-app-for-macos-a-comprehensive-guide-48k4?1 侵害がある場合は、study_golang までご連絡ください。 @163.com 削除
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3