\

個人で開発するアプリの決め方

プログラミングは楽しいですよね。個人で好きに仕様を決めてアプリを開発できるので、仕事のようなしがらみが無く、自由に作ることができます。

しかし、いざアプリを作ろうとしても、どんなアプリにしようか悩むことが多いと思います。

この記事では、プログラミング初学者などが個人で開発するアプリの決め方を紹介します。

1. 日々使っているアプリを作る

作りたいものが分からない場合は、日々自分が使っているアプリを模倣して作ってみましょう。

私はTodo管理アプリを毎日使っていますので、今はTodo管理アプリを作っています。

今使っているアプリはとても便利で使いやすいのですが、私は作業時間とタスクを一つのアプリで管理して、決められた作業時間で完了させるようタイマー機能が欲しいと思っています。

日常的に使ってるアプリなら、機能要件などが見えやすいですし、オリジナルな機能実装もしやすいと思いますので、おすすめです。

2. 自分が使いたいと思うアプリを作る

仕様やプログラミング言語などを自由決めてアプリを開発したとしても、自分が使いたいと思わなければ、モチベーションが上がりません。

自分が使いたいと、心の底から思えるようなアプリを設計しましょう。

アプリは一度開発しただけで終わりではありません。何度も改善して改善して、長い時間をかけて育てていくものだと思います。長い期間をかけてメンテナンスしていく必要があります。

このモチベーションを維持していくためにも、自分が使いたいと思うアプリを作りましょう。

3. 機能は必要最小限に留める

アプリを設計していると、あれもこれも、多くの機能を搭載したいと考えてしまいます。

そうすると、それだけ多くの開発期間がかかってしまいますので、初回リリースする際は、必要最小限の機能に留める努力をしましょう。

要は、何を作らないか決めること、です。

機能が多いと、コード量も多くなり、バグが多くなります。その分、メンテナンスや機能追加も難しくなっていきます。

ハードルを下げるためにも、最初は極力コンパクトなアプリを目指しましょう。

4. 必要最小限の機能を開発したら、早くリリースする

リリースすると、達成感を得られます。開発してきて二番目にうれしい瞬間です。

(※一番目は、フィードバックをもらったとき、ですね)。

ある程度テストしてきて、バグも収束してきたら、早くリリースしましょう。世間に触れることは、開発者とユーザーのギャップを埋めるという意味でも、とても大事なことです。

自信がなかったら、アルファ版やベーダ版としてリリースすることをおすすめします。早くリリースして、宣伝する準備をしましょう。

5. フィードバックをもらって改善するサイクルを回す

開発したアプリの利用者からフィードバックをもらえると、本当に嬉しくなります。開発してリリースして良かったと心から思える瞬間です。

フィードバックは、自分が思いもしなかった情報を得られる数少ない情報源の1つです。
ユーザーの声に耳を傾け、アプリを改善していく手がかりにしていくのがいいと思います。このとき、フィードバックをもらってからアプリ改修・リリースまでの期間を極力短くしましょう。

スピードが速いとユーザーも喜んでくれるはずです。

6. 最後に

個人開発は、自分の好きな時間に、好きなプログラミング言語とフレームワークを使って、好きなだけ時間を使って、アプリを開発することができます。

しかし、それだけ自由度が大きいと、何から始めたらいいか迷うと思います。そこで、上述したようなポイントを考慮して、開発していくアプリを検討してみていただけたらと思います。

ユーザーからフィードバックをもらって、アプリを改善してリリースして、またフィードバックをもらう、最高の改善サイクルが回り始めます。

こうなると個人開発はとても楽しいものになります。ぜひ、個人開発をやっていきましょう。

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

Xamarinでタイマーを実装する方法

XamarinでiOSアプリにタイマーを実装する方法を紹介します。

この記事では、System.Timers.Timerは使わずに、Task.Delay()を使用する方法を記載しています。

System.Timers.Timerが動作しなかった人向けの代替策です。

0. この記事で実装したいイメージ

以下のツイートのように、1秒ずつカウントダウンしていきます。

「分:秒」で表示させています。

1. タイマーのカウントダウンロジック

System.Threading.Tasks.Task.Delay(1000)で、1秒待つというロジックになります。

これを while でループさせています。

while ループを抜ける条件としては、「timeLimitSecが0より大きい」としています。

1
2
3
4
5
6
7
8
9
10
11

private int timeLimitSec = 10;

async void StartTimer()
{
while(true && timeLimitSec > 0)
{
await System.Threading.Tasks.Task.Delay(1000);
timeLimitSec = timeLimitSec - 1;
}
}

2. 秒から「分:秒」の表示に変換する

秒(int型)から「分:秒」の表示に変換するには、TimeSpanを使用します。

以下のコードでは、TimerCountというラベルのテキストにセットしています。

1
TimerCount.Text = new TimeSpan(0, 0, timeLimitSec).ToString(@"mm\:ss");

TimerSpanの第3引数に「秒」をセットし、ToString()で文字列に変換します。

ちなみに、macでバックスラッシュを入力するには、「 option + ¥」です。

3. View部分(xaml)

タイマー表示用として、TimerCountという名前のラベルを設置します。

1
2

<Label x:Name="TimerCount"></Label>

4. 実行例

以下のように表示されれば成功です。

5. Task.Delay の問題点

タイマーカウントダウンのロジックは以下の通り Task.Delayを使用しています。

1
2
3
4
5
while(true && timeLimitSec > 0)
{
await System.Threading.Tasks.Task.Delay(1000);
timeLimitSec = timeLimitSec - 1;
}

そのため、このタイマーを一時的にストップする場合は、最大で1秒の遅延が発生します。

Task.Delay(1000)の部分で一秒待つためです。

6. タイマーの一時停止機能を実装する方法

タイマーの一時停止機能を実装してみましょう。

まず、View(xaml)にスタートとストップのボタンを設置します。

1
2
<Button x:Name="TimerStart" Clicked="TimerStart_Clicked" Text="TimerStart"></Button>
<Button x:Name="TimerStop" Clicked="TimerStop_Clicked" Text="TimerStop"></Button>

タイマーカウントダウンロジックを一部修正します。

ループ条件にtimerEnableというbool変数を使用します。

1
2
3
4
5
6
7
8
9
10
11
12
13

private bool timerEnable = false;

async void StartTimer()
{
while(timerEnable && timeLimitSec > 0)
{
await System.Threading.Tasks.Task.Delay(1000);
timeLimitSec = timeLimitSec - 1;
TimerCount.Text = new TimeSpan(0, 0, timeLimitSec).ToString(@"mm\:ss");

}
}

TimerStart_Clickedイベントトリガーで、タイマーを開始します。

void TimerStart_Clicked(System.Object sender, System.EventArgs e)
{

timerEnable = true;
StartTimer();

}

TimerStop_Clickedイベントトリガーで、タイマーを停止します。

1
2
3
4
void TimerStop_Clicked(System.Object sender, System.EventArgs e)
{
timerEnable = false;
}

7. この記事で紹介したソースコード全文

  • TaskTimer.xaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="todotimer.TaskTimer">
    <ContentPage.Content>

    <StackLayout>

    <Button x:Name="TimerStart" Clicked="TimerStart_Clicked" Text="TimerStart"></Button>
    <Button x:Name="TimerStop" Clicked="TimerStop_Clicked" Text="TimerStop"></Button>

    <Label x:Name="TaskName"></Label>
    <Label x:Name="TimerCount"></Label>
    <Label x:Name="DeviceCount"></Label>
    </StackLayout>
    </ContentPage.Content>
    </ContentPage>
  • TaskTimer.xaml.cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    using System;
    using System.Collections.Generic;
    using Xamarin.Forms;

    namespace todotimer
    {
    public partial class TaskTimer : ContentPage
    {

    private int count = 0;
    private int timeLimitSec = 10;
    private bool timerEnable = false;

    public TaskTimer(string TodoName)
    {
    InitializeComponent();
    TaskName.Text = TodoName;
    TimerCount.Text = new TimeSpan(0, 0, timeLimitSec).ToString(@"mm\:ss");

    }

    async void StartTimer()
    {
    while(timerEnable && timeLimitSec > 0)
    {
    await System.Threading.Tasks.Task.Delay(1000);
    timeLimitSec = timeLimitSec - 1;
    TimerCount.Text = new TimeSpan(0, 0, timeLimitSec).ToString(@"mm\:ss");

    }
    }

    void TimerStart_Clicked(System.Object sender, System.EventArgs e)
    {
    timerEnable = true;
    StartTimer();
    }

    void TimerStop_Clicked(System.Object sender, System.EventArgs e)
    {
    timerEnable = false;
    }
    }
    }

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

Xamarinで変数を次画面に引き継ぐ方法

Xamarinでスマホアプリを開発していると、画面遷移の際に変数の値を表示したいことがあると思います。

この記事では、画面表示のときに変数の値を表示する方法を紹介します。

0. この記事で説明したいこと

ListViewで選択した項目名を、次の画面に表示します。

1. 項目名を表示する画面のコンストラクタに引数を定義する

コンストラクタに引数を定義して、値を取得できるようにします。

TaskNameというラベルに、引数から取得した値を表示するようにしています。

1
2
3
4
5
public TaskTimer(string TodoName)
{
InitializeComponent();
TaskName.Text = TodoName;
}

2. XAMLに項目名を表示するラベルを定義します。

今回は、TaskNameという名前のラベルを定義しました。

1
<Label x:Name="TaskName"></Label>

3. ListViewのItemTappedイベントから画面表示を行う

画面表示はNavigation.PushAsyncを使用します。

TaskTimerという画面にListViewの選択値を表示するには、以下のように書きます。

1
Navigation.PushAsync(new TaskTimer(e.Item.ToString()), true);

4. 以下のように、遷移先の画面に値が表示できれば成功です。

5. ソースコード全文

この記事で紹介したソースコードの全文を記載します。

  • MainPage.xaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="utf-8"?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="todotimer.MainPage">
    <StackLayout>
    <Label Text="Todo Timer" HorizontalTextAlignment="Start" FontSize="24" />
    <Label Text="Today's Task" HorizontalTextAlignment="Start" FontSize="24" />
    <ScrollView>
    <StackLayout>
    <ListView x:Name="TopTaskView" ItemTapped="TopTaskView_ItemTapped" HasUnevenRows="False" RowHeight="40">
    </ListView>
    </StackLayout>
    </ScrollView>


    </StackLayout>
    </ContentPage>
  • MainPage.xaml.cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Xamarin.Forms;

    namespace todotimer
    {
    public partial class MainPage : ContentPage
    {
    public MainPage()
    {
    InitializeComponent();

    TopTaskView.ItemsSource = new string[]
    {
    "item 1111111111111",
    "item 2222222222222",
    "item 3333333333333",
    };

    }

    void TopTaskView_ItemTapped(System.Object sender, Xamarin.Forms.ItemTappedEventArgs e)
    {
    Navigation.PushAsync(new TaskTimer(e.Item.ToString()), true);

    }
    }
    }
  • TaskTimer.xaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="todotimer.TaskTimer">
    <ContentPage.Content>

    <StackLayout>
    <Label x:Name="TaskName"></Label>
    </StackLayout>
    </ContentPage.Content>
    </ContentPage>
  • TaskTimer.xaml.cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    using System;
    using System.Collections.Generic;

    using Xamarin.Forms;

    namespace todotimer
    {
    public partial class TaskTimer : ContentPage
    {
    public TaskTimer(string TodoName)
    {
    InitializeComponent();
    TaskName.Text = TodoName;
    }
    }
    }

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

Xamarin で ListViewを使う方法

Xamarinは iOSやAndroidなどのスマホアプリが作れるフレームワークです。

画面viewをXAMLで記述して、処理をc#で記述します。

この記事では、XamarinでListViewを使う方法を紹介します。

1. XAML部分

以下のようにListViewを定義します。

1
2
<ListView x:Name="TopTaskView" ItemTapped="TopTaskView_ItemTapped" HasUnevenRows="False" RowHeight="40">
</ListView>
  • x:Name="TopTaskView"で、このListViewの名前をTopTaskViewとするように定義します。

  • ItemTapped="TopTaskView_ItemTapped"で ListView のアイテムをタップしたときのイベントトリガーを定義します。TopTaskView_ItemTappedという関数が実行されます。

  • HasUnevenRows="False" は、RowHeightプロパティと併用すると、リストビューには値のある行しか表示されません。HasUnevenRowsRowHeightプロパティを定義しない場合、リストビューに空行のアイテムが表示されます。

2. コード部分

以下のコードで、ListView(TopTaskView)に値をセットします。

1
2
3
4
5
6
TopTaskView.ItemsSource = new string[]
{
"item 1111111111111",
"item 2222222222222",
"item 3333333333333",
};

TopTaskView_ItemTappedイベントは、タップしたアイテム名がアラートで表示されるようにしています。

以下のように、e.Item.ToString()で、タップしたアイテム名を取得します。

1
2
3
4
void TopTaskView_ItemTapped(System.Object sender, Xamarin.Forms.ItemTappedEventArgs e)
{
await DisplayAlert("title", e.Item.ToString(), "ok");
}

3. 実行結果

以下のように表示されれば成功です。

4. ソースコード全文

今回のソースコードの全文を記載します。

  • MainPage.xaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="todotimer.MainPage">
<StackLayout>
<Label Text="Todo Timer" HorizontalTextAlignment="Start" FontSize="24" />
<Label Text="Today's Task" HorizontalTextAlignment="Start" FontSize="24" />
<ScrollView>
<StackLayout>
<ListView x:Name="TopTaskView" ItemTapped="TopTaskView_ItemTapped" HasUnevenRows="False" RowHeight="40">
</ListView>
</StackLayout>
</ScrollView>


</StackLayout>
</ContentPage>
  • MainPage.xaml.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace todotimer
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();

TopTaskView.ItemsSource = new string[]
{
"item 1111111111111",
"item 2222222222222",
"item 3333333333333",
};

}

void TopTaskView_ItemTapped(System.Object sender, Xamarin.Forms.ItemTappedEventArgs e)
{
await DisplayAlert("title", e.Item.ToString(), "ok");

}
}
}

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

Macでシェルスクリプトを書いたのに bad intepreter エラーが表示される時の対処方法

シェルスクリプトの1行目は、#!/bin/shのように、シェルのパスを記載します。

正しく書いたのに bad interpreter: /bin/sh^M: no such file or directory ってエラーが表示された時の対処方法を記載します。

1. 改行コードを確認する

MacOSXの場合、改行コードは LF である必要があります。

Visual Studio Code などで、改行コードがCRLFなどになっていないか、確認しましょう。

以下の場合は、改行コードがCRLFなので、エラーになります。

Visual Studio Codeの下のステータスバーにある CRLFの箇所をクリックし、LFを選択して保存しましょう。

こうすることで、改行コードがLFに変換されるので、シェルスクリプトが正しく実行できると思います。

2. シェルのバイナリパスを確認する

シェルスクリプトの1行目に#!/bin/shと記載している場合、本当にsh/bin/に存在しているのか確認しましょう。

whichコマンドを使用すると簡単にパスを取得することができます。

1
2
haruo@Haruos-MBP workspace % which sh
/bin/sh

このように、「which コマンド名」で実行すると、そのバイナリのパスを取得することができますので、シェルスクリプトの1行目に書いたパスが正しいか確認してみましょう。

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

c#からLiteDBのレコードを更新・削除する方法

LiteDBはポータブルなNoSQLデータベースです。

.Net Framework 用にライブラリが用意されており、c#などから簡単に使用することができます。

この記事では、c#を使用してLiteDBのレコードを更新する方法を紹介します。

0. Nugetパッケージの適用

LiteDBのNugetパッケージを適用します。

https://www.nuget.org/packages/LiteDB

1
dotnet add package LiteDB --version 5.0.9

1. サンプルのデータ構造

この記事では、以下のデータ項目をもったレコードを対象とします。

idをユニークキーとしています。

1
2
3
4
5
public class Data {
public int id {get; set;}
public int TaskGroupUID {get; set;}
public string TaskGroupName {get; set;}
}

2. テーブル名称

テーブル名称は、同一クラス内に定義しておきます。

1
public static string tableName = "TaskGroup";

3. 更新処理

以下のコードで更新することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void Update(int id, Data updateData)
{

using (LiteDatabase litedb = new LiteDatabase(DataModel.DataBase.litedbFilePath))
{
var col = litedb.GetCollection<Data>(tableName);
var record = col.FindOne(x => x.id == id);

record.TaskGroupUID = updateData.TaskGroupUID;
record.TaskGroupName = updateData.TaskGroupName;

col.Update(record);

}

}

この関数では、以下の引数を持ちます。

引数名称 属性 意味
id int ユニークキーです。更新対象のレコードを特定するのに使用します
updateData Dataクラス 更新情報を格納します

idで特定した1レコードを、updateDataの情報で更新する処理になります。

4. 削除処理

削除するには、以下のようになります。

1
2
3
4
5
6
7
8
9
10
public static void Delete(int id)
{
using (LiteDatabase litedb = new LiteDatabase(DataModel.DataBase.litedbFilePath))
{
var col = litedb.GetCollection<Data>(tableName);
var record = col.FindOne(x => x.id == id);

col.Delete(id);
}
}

これも更新処理と同様に、idで特定した1レコードをDeleteメソッドで削除する処理になります。

5. ソースコードの全体像

この記事で使用したクラスファイルの全体像を以下に記載します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using LiteDB;
using System.Collections.Generic;

namespace consoleapp.DataModel
{
public class TaskGroup
{

// レコード定義
public class Data {
public int id {get; set;}
public int TaskGroupUID {get; set;}
public string TaskGroupName {get; set;}
}

// NoSQLテーブル名称
public static string tableName = "TaskGroup";

// レコード追加処理
public static void Add(Data data)
{

using (LiteDatabase litedb = new LiteDatabase(DataModel.DataBase.litedbFilePath))
{
var col = litedb.GetCollection<Data>(tableName);

Data taskGroupData = new Data();
taskGroupData.TaskGroupUID = data.TaskGroupUID;
taskGroupData.TaskGroupName = data.TaskGroupName;

col.Insert(taskGroupData);
}

}


//全件取得
public static List<Data> GetAllData()
{
using(LiteDatabase litedb = new LiteDatabase(DataModel.DataBase.litedbFilePath))
{
var col = litedb.GetCollection<TaskGroup.Data>(TaskGroup.tableName);
var result = col.Query()
.ToList();
return result;
}
}

// 1レコード取得
public static Data GetOneRecord(int id)
{
using (LiteDatabase litedb = new LiteDatabase(DataModel.DataBase.litedbFilePath))
{
var col = litedb.GetCollection<Data>(tableName);
var record = col.FindOne(x => x.id == id);

return record;
}
}

//1レコード更新
public static void Update(int id, Data updateData)
{

using (LiteDatabase litedb = new LiteDatabase(DataModel.DataBase.litedbFilePath))
{
var col = litedb.GetCollection<Data>(tableName);
var record = col.FindOne(x => x.id == id);

record.TaskGroupUID = updateData.TaskGroupUID;
record.TaskGroupName = updateData.TaskGroupName;

col.Update(record);

}

}

//1レコード削除
public static void Delete(int id)
{
using (LiteDatabase litedb = new LiteDatabase(DataModel.DataBase.litedbFilePath))
{
var col = litedb.GetCollection<Data>(tableName);
var record = col.FindOne(x => x.id == id);

col.Delete(id);
}
}

}
}

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

ExcelVBAでOutlookクライアントから自動的にメールを送信する

ExcelVBAからOutlookクライアントアプリを使用して、メールを自動的に送信することができます。

ユーザーに送信ボタンをクリックさせることなく、バックグラウンドで送信まで行います。

0. この記事のまとめ

Microsoft Outlook Object Library を使用します。

olMailItemオブジェクトのSendメソッドを使用することで、送信が行われます。

1
2
3
4
5
6
7
8
9
10
11
Dim ObjOutlook As Outlook.Application
Dim ObjMail As Outlook.MailItem
Set ObjOutlook = New Outlook.Application
Set ObjMail = ObjOutlook.CreateItem(olMailItem)

ObjMail.To = "aaa@bbb.com; ccc@ddd.com"
ObjMail.CC = "aaa@bbb.com; ccc@ddd.com"
ObjMail.Subject = "メール件名"
ObjMail.Body = "メール本文"

ObjMail.Send

1. メールを送信するのは、Sendメソッド

Outlookメールを送信するのは、ObjOutlook.CreateItem(olMailItem)で作成されたオブジェクトのSendメソッドです。

以下のコードの中でObjMail.Sendがこれに該当します。

1
2
3
4
5
6
7
8
9
10
11
Dim ObjOutlook As Outlook.Application
Dim ObjMail As Outlook.MailItem
Set ObjOutlook = New Outlook.Application
Set ObjMail = ObjOutlook.CreateItem(olMailItem)

ObjMail.To = "aaa@bbb.com; ccc@ddd.com"
ObjMail.CC = "aaa@bbb.com; ccc@ddd.com"
ObjMail.Subject = "メール件名"
ObjMail.Body = "メール本文"

ObjMail.Send

2. 宛先は「To」プロパティ

宛先メールアドレスは、Toプロパティで指定します。

1
ObjMail.To = "aaa@bbb.com; ccc@ddd.com"

3. Ccは「CC」プロパティ

CCメールアドレスは、CCプロパティで指定します。

1
ObjMail.CC = "aaa@bbb.com; ccc@ddd.com"

4. BCcは「BCC」プロパティ

CCメールアドレスは、CCプロパティで指定します。

1
ObjMail.BCC = "aaa@bbb.com; ccc@ddd.com"

5. 送信せずにメール送信画面を表示するときは、「Display」メソッド

直接送信せずに、メール送信画面を表示するには、Displayメソッドを使用します。

1
2
3
4
5
6
7
8
9
10
11
Dim ObjOutlook As Outlook.Application
Dim ObjMail As Outlook.MailItem
Set ObjOutlook = New Outlook.Application
Set ObjMail = ObjOutlook.CreateItem(olMailItem)

ObjMail.To = "aaa@bbb.com; ccc@ddd.com"
ObjMail.CC = "aaa@bbb.com; ccc@ddd.com"
ObjMail.Subject = "メール件名"
ObjMail.Body = "メール本文"

ObjMail.Display

6. メール本文形式を変更するときは「BodyFormat」プロパティ

メール本文形式は、以下から選択できます

  • テキスト形式
  • リッチテキスト形式
  • HTML形式

これらは、BodyFormatプロパティから指定できます。

メール形式 プロパティ名称
テキスト形式 olFormatPlain
リッチテキスト形式 olFormatRichText
HTML形式 olFormatHTML
1
ObjMail.BodyFormat = olFormatPlain

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

ProBoarderExcel Ver, 2020.11 リリースしました

Excel操作にはマウスが必須です。しかし、マウスを使うのは非常に面倒くさい。

ということで、できるだけExcelをキーボードで操作可能にするためのアドインである「ProBoarderExcel」を開発しており、この度、バージョン 2020.11 をリリースいたします!!

1. 新機能

以下の機能が新たに追加されました。

コマンド 機能概要 備考
set clipboard file name アクティブワークブックのファイル名をクリップボードにセットします
set clipboard file path アクティブワークブックの絶対パスをクリップボードにセットします
set sheet tab color シートタブの色を変更します。
cell vertical alignment center アクティブセルの文字列の上下位置を中央に配置します
cell vertical alignment top アクティブセルの文字列の上下位置を上部に配置します
cell vertical alignment bottom アクティブセルの文字列の上下位置を下部に配置します
cell horizontal alignment center アクティブセルの文字列の左右位置を中央に配置します
cell horizontal alignment center across 文字列を選択範囲で中央に配置します
cell horizontal alignment left アクティブセルの文字列の左右位置を左に配置します
cell horizontal alignment right アクティブセルの文字列の左右位置を右に配置します
add shape connector straight 選択セル範囲に対応した直線図形を追加します
add shape rectangle 選択セル範囲に合致する四角図形を追加します
add picture from file ファイルから選択された画像を追加します。大きさは選択セル範囲に対応します
cell merge セルを結合します
cell unmerge セルの結合を解除します
set displaygridlines true 枠線(目盛線)を表示します
set displaygridlines false 枠線(目盛線)を非表示にします

2. ダウンロード

以下のリンクからダウンロードが可能です。

ProBoarderExcel.xlam

3. ソースコードについて

自由に参照・改変可能です。

このアドインマクロのVBAプロジェクトはパスワードロックをかけていませんので、お持ちのExcelから参照ください。

4. ライセンスについて

MITライセンスになります。

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

ブログネタを溜めるコツは、考える時間を確保すること

ブログを書いていると、次に何を書こうか、ブログのネタに困ることが多々あると思います。

この記事では、ブログネタを溜めるコツについて、紹介します。

1. その1:考える時間を確保する

ブログネタを考える時間を確保することは大事なことです。

1日5分でもいいので、何を書こうか、どんなブログを書こうか考える時間を確保しましょう。

私も毎日5分間、ブログネタを考える時間を確保し、スマホのリマインダーに登録しています。

ブログネタを考えていると、もっと勉強しようとか、こんな知識が足らないなど、自分に欠けているものが見えてきます。

そうすると、学習することリストや、読書リストなど、インプットに繋がるタスクも見えてきます。

ブログというアウトプットに対して、インプットを取り込むという好循環が生まれますので、ブログネタを考える時間は重要です。

2. その2:日々の仕事からネタを考える

日々仕事をしていると、苦労したことや、新しく得た知識など、様々な刺激があると思います。

その中からブログに書ける内容を探してみましょう。

もちろん、秘密保持が必要な情報や社外秘などの情報を書くことはNGですので、一般に知られても問題ないものをブログネタにしましょう。例えば、以下のようなものです。

  • プログラミングやシステム開発知識
  • システム設計技法
  • PCの操作方法
  • PCのエラー対処方法
  • その他、一般に知られても問題ない情報

ブログは世界中から見られる情報ですので、秘密としておかないといけない情報の公開はNGです。

書いていいか分からない情報は、極力、書かないほうが無難です。

3. その3:2~3年前の自分に対するアドバイスを書く

2~3年は、過ぎてしまえばあっという間ですが、仕事やプライベートなどで様々な経験をしており、確実にスキルアップしていると思います。

2~3年間に自分が経験した失敗談や、もっとこうすればよかったこと、など、2~3年前の自分に対するアドバイスをブログに書いてみましょう。

こんな知識やスキルを持っていれば、トラブルなく仕事ができていたのに、、という情報は有益になると思います。

自分のことをブログに書くということは、他との差別化になります。本で得られるような一般的な情報は、誰でも知っている情報ですので、あまり有益ではありません。

それよりも、自分が実際に経験して、失敗して、効果があった内容をブログに書くほうが、かなり有益です。

自分だけしか当てはまらない、という情報はそんなに無いと思います。自分が苦労したことは、他の誰かも苦労していて、その解決方法は、誰かの助けになると思います。

4. その4:とにかくいろんなことをやってみる

知っているだけの知識をブログに書こうとすると、かなりしんどいです。

実際に手を動かして、自分でアウトプットしたものをブログに書くほうが、かなりラクです。

よって、本で読んだだけの知識をブログに書こうとせず、とにかくいろんなことを自分の手で動かしてやってみた結果をブログに書きましょう。

そのほうが、ブログ記事の内容も濃いものになり、楽しくブログを書けると思います。

楽しい方が続けやすいですし、もっとこうしようとか、改善点を見つけやすくなります。

楽しくなければ休めばいいと思いますので、できるだけ楽しくブログを書くようにしましょう。

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

仕事を効率よく完了させる方法は、ToDoリストとタイマーを使うこと

会社で働いていると、あまり気がのらず思うように仕事が進まないことがあると思います。

この記事では、仕事を効率よく終わらせる方法について紹介します。

0. この記事のまとめ

仕事を効率よく終わらせる方法は、ToDoリストとタイマーを使うことです。

まず、ToDoリストは、作業を行う前日までにリストアップしておきましょう。作業当日は、作業することだけに集中できるようにするためです。

次にタイマーですが、これは、ついつい無駄な時間を過ごさないようにするために使います。具体的には、1つの作業を完了させる時間を決めてタイマーをセットし、時間内に終わらせるように作業するようにします。

こうすることで、できるだけ無駄な時間をかけずに仕事を終わらせることができます。

1. ToDoリストで作業内容を明確にする

ToDoリストは、言ってみればやることリストですが、以下のような注意事項があります。

  • 作業前日までに確定させておく
  • 各作業ごとに制限時間をメモしておく
  • 作業完了の条件を具体的にしておく

作業前日までに確定させておく理由としては、作業当日に、作業に集中できるようにするためです。当日になって、今日はどこまで仕事を終わらせておけばいいのか考えていると、仕事が進みません。ToDoリストは作業前日に確定しておきましょう。

次に、各作業ごとの制限時間をToDoリストにメモしておきましょう。例えば、「30分で議事録を作成する」などです。作業内容と制限時間を一緒にToDoリストに書いておくのです。

最後に、ToDoリストには、作業完了の条件を具体的に記載しましょう。「プログラミングする」というToDoはダメです。理由は、どこまでプログラミングしたらこのタスクが完了としていいのか不明なためです。「xxxxxx機能を実装する」のように、作業内容と完了条件が具体的になるようにToDoリストを書きましょう。

2. 作業する時は、タイマーを使用して、制限時間内に終わらせる様にする

せっかく作業と完了条件が具体的なToDoリストを作ったとしても、だらだら作業していたら意味がありません。よって、作業する時はタイマーを使って、制限時内に終わらせるようにしましょう。

音が出せる作業環境であれば音を出してもいいですし、音が出せない作業環境であれば、タイムアップ時に画面表示だけで通知させるようにしましょう。

設定時間に対して短い時間で作業が完了した場合は、次回はこれよりも短い時間で終わらせるように努力してみましょう。

逆に、設定時間に対して長く時間がかかってしまった場合、何が原因だったのか探ってみましょう。

3. 仕事というものは、時間をかけようと思えば無限に時間をかけてしまうもの

仕事というものは、時間をかけようと思えば無限にかけてしまうものです。そのため、完了条件と制限時間を明確にして効率よく仕事を終わらせることが重要です。

早く終われば好きなことができますし、何より時間は無限ではありません。

効率よく時間を使いましょう。

コメントシステムを導入しました!コメント頂けると嬉しすぎて、光の速さで返信します(●´ω`●)

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱