ナルシーNote

2020年12月からC#、2021年2月からPythonを51歳で始めました。学んだことを備忘録として残してます。そろそろN88BASICは卒業しようかな😱

<C#>リストの使い方

リストのサンプルです。

(1)サンプル1 宣言の時に初期値を入れる

List listTest1 = new List() { "1", "2", "3" };
foreach (var test1 in listTest1)
{
    Console.WriteLine(test1);
}

(2)サンプル2 宣言した後に追加する

List listTest2 = new List();
listTest2.Add("a");
listTest2.Add("b");
listTest2.Add("c");
foreach (var test2 in listTest2)
{
    Console.WriteLine(test2);
}

(2)サンプル3 varで宣言する

var listTest3 = new List();
listTest3.Add("A");
listTest3.Add("B");
listTest3.Add("C");
foreach (var test3 in listTest3)
{
    Console.WriteLine(test3);
}

(2)サンプル4 2次元リスト

var listTest4 = new List<List>();
var addData = new List();
addData.Add("1");
addData.Add("A");
listTest4.Add(addData);
addData = new List();
addData.Add("2");
addData.Add("B");
listTest4.Add(addData);
listTest4.Add(new List { "3", "C" });
foreach (var test4 in listTest4)
{
    Console.WriteLine(test4[0] + " " + test4[1]);
}

リストをCSV形式の文字列にする

var listcsv = new List();  // = string.Join(",", listTest1);
foreach (var test4 in listTest4)
{
    var line = string.Join(",", test4);
    listcsv.Add(line);
}
var allline = string.Join("\r\n", listcsv);
Console.WriteLine(allline);

Console.WriteLine("(6)index付きforeachのサンプル");
foreach (var test4 in listTest4.Select((Value, Index) => new { Value, Index }))
{
    Console.WriteLine(test4.Index.ToString() + ":" + test4.Value[0] + " " + test4.Value[1]);
}    

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら

 

 

<c#>ログファイルを作成する

ログファイルを作成するサンプルです。

使い方

// クラスを使用する宣言 ErrorLog:アプリケーションのフォルダの下にさらにフォルダを作ります。
NarcyNote.ClassLog errorlog = new NarcyNote.ClassLog("ErrorLog");

// ログの保存例
errorlog.SaveLog("○○エラー発生);

ログの内容

2022/05/28 09:00:00,○○エラー発生
2022/05/29 09:01:00,○○エラー発生
2022/05/30 09:02:00,○○エラー発生

ログファイル作成クラス

using System;
using System.IO;
using System.Text;

namespace NarcyNote
{
    class ClassLog
    {
        private readonly string foldername;

        public ClassLog(string folder)
        {
            this.foldername = folder;
        }

        public bool SaveLog(string message)
        {
            // LOGファイル保存

            string fullpath = Path.Combine(
                AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
                foldername + @"\");

            //ファイル名をくっつける前にフォルダがなければ作成
            if (!Directory.Exists(fullpath))
            {
                Directory.CreateDirectory(fullpath);
            }

            StreamWriter sw = null;
            message = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "," + message;
            try
            {
                // 既にファイルが存在している場合は追加(2個目の引数:true)
                fullpath += DateTime.Now.ToString("yyyyMMdd") + ".txt";
                sw = new StreamWriter(
                fullpath,
                true,
                Encoding.GetEncoding("UTF-8"));
                sw.WriteLine(message);
            }
            catch 
            {
                Console.WriteLine("SaveLog失敗:" + fullpath);
                return false;
            }
            finally
            {
                if (sw != null)
                {
                    sw.Close();
                }
            }
            return true;
        }
    }
}

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら

 

 

<C#>フォルダの中のファイル一覧を取得する

フォルダの中のファイル一覧を取得するサンプルです。

(1)ファイル一覧サンプル

var folder = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
var filenames = Directory.GetFiles(folder, "*");
foreach (var filename in filenames)
{
    // フルパスだと長いのでファイル名だけ表示してみる
    Console.WriteLine(Path.GetFileName(filename));
}

(2)ファイル一覧サンプル(サブフォルダ含む)

folder = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
filenames = Directory.GetFiles(folder, "*", SearchOption.AllDirectories);
foreach (var filename in filenames)
{
    // フルパスだと長いのでファイル名だけ表示してみる
    Console.WriteLine(Path.GetFileName(filename));
}

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら

 

 

<C#>スレッドが終了するまで待つ

スレッドの終了の待ち方を3種類試してみました。

Application.DoEvents()は使わないほうが良いと書いてあるページが多いのですが、フォームが固まってしまってダメです。

とりあえずApplication.DoEvents()を使っちゃえ(笑)

(1)Task.WaitAll() メソッドでスレッドが終了するのを待つ

// ↓フォームが固まる
Console.WriteLine("(1)開始:" + DateTime.Now.ToString("HH:mm:ss"));
Task th1 = Task.Factory.StartNew(() => Thread1());
Task th2 = Task.Factory.StartNew(() => Thread2());
Task.WaitAll(th1, th2);
Console.WriteLine("(1)終了:" + DateTime.Now.ToString("HH:mm:ss"));

(2)Thread.Join() メソッドでスレッドが終了するのを待つ

// ↓フォームが固まる
Console.WriteLine("(2)開始:" + DateTime.Now.ToString("HH:mm:ss"));
Thread th3 = new Thread(new ThreadStart(Thread2));
th3.Start();
th3.Join();
Console.WriteLine("(2)終了:" + DateTime.Now.ToString("HH:mm:ss"));

(3)th4.IsAliveでスレッドが終了するのを待つ

// ↓フォームは固まらない
Console.WriteLine("(3)開始:" + DateTime.Now.ToString("HH:mm:ss"));
Thread th4 = new Thread(new ThreadStart(Thread2));
th4.Start();
while (th4.IsAlive)
{
    Application.DoEvents();
}
Console.WriteLine("(3)終了:" + DateTime.Now.ToString("HH:mm:ss"));

 

Thread1とThread2は、とりあえずこんな感じ。

private void Thread1()
{
    Thread.Sleep(5000);
}

private void Thread2()
{
    Thread.Sleep(6000);
}

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら

 

 

<c#>アプリを自動的に再起動する

ときどきフリースしてしまうアプリがあるので、アプリを自動的に再起動するアプリを作ってみました。

 

 

    using System;
using System.Linq;

namespace RestartApp
{
    class Program
    {
        static void Main(string[] args)
        {

            if (args.Count() < 2)
            {
                //ローカルコンピュータ上で実行されているすべてのプロセスを取得
                System.Diagnostics.Process[] ps =
                    System.Diagnostics.Process.GetProcesses();
                foreach (System.Diagnostics.Process p in ps)
                {
                    try
                    {
                        //プロセス名を出力する
                        Console.WriteLine("プロセス名: {0}", p.ProcessName);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }

                Console.WriteLine();
                Console.WriteLine("引数1:終了させるプロセス名 引数2:起動するファイル名");
                Console.WriteLine("Hit any key!!");
                Console.ReadKey();
                return;
            } 

            //プロセスを取得
            System.Diagnostics.Process[] procs =
                System.Diagnostics.Process.GetProcessesByName(args[0]);

            foreach (System.Diagnostics.Process proc in procs)
            {
                Console.WriteLine("終了中:" + proc.ProcessName);
                proc.CloseMainWindow();

                //プロセスが終了するまで最大10秒待機する
                proc.WaitForExit(10000);
                //プロセスが終了したか確認する
                if (proc.HasExited)
                    Console.WriteLine("正常終了しました。:" + proc.ProcessName);
                else
                {
                    proc.Kill();
                    Console.WriteLine("強制終了しました。:" + proc.ProcessName);
                }
            }

            //再度起動する
            System.Diagnostics.Process procRun =
                System.Diagnostics.Process.Start(args[1]);

            // Console.ReadKey();

        }
    }
}

<C#>リストの不要なデータを削除してソートする

 LINQって何?(笑)

 ログファイルから実績数を調べるときにLINQを使ったら便利でした。

 編集したい内容は、

  • 合否判定がPASSのもの
  • 重複したデータは削除する(残すのは最後のデータ)
  • 日時でソート

 ということを1行でできちゃった。

ログファイルの内容

  • 日時
  • シリアル
  • 合否判定

ログファイルはこんな感じ

f:id:Cars_Narcy:20210526124843p:plain

logファイル

こんなファイルが複数あります。  

ファイルからリストに入れるところは省略してプログラムで入れました。

 

プログラムはこんな感じ

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            // サンプルデータを作成する
            var allLists = new List<List>();
            {
                allLists.Add(new List { "2021/06/01 09:00:00", "21610001", "PASS" });
                allLists.Add(new List { "2021/06/01 09:03:00", "21610003", "FAIL" });
                allLists.Add(new List { "2021/06/01 09:05:00", "21610003", "FAIL" });
                allLists.Add(new List { "2021/06/01 09:10:00", "21610003", "PASS" });
                allLists.Add(new List { "2021/06/01 09:11:00", "21610003", "PASS" });
                allLists.Add(new List { "2021/06/01 09:02:00", "21610002", "PASS" });
                allLists.Add(new List { "2021/06/01 09:04:00", "21610004", "PASS" });
                allLists.Add(new List { "2021/06/01 09:06:00", "21610005", "PASS" });
                allLists.Add(new List { "2021/06/01 09:07:00", "21610006", "PASS" });
                allLists.Add(new List { "2021/06/01 09:09:00", "21610007", "PASS" });

            };

            // 正常品と、シリアルのダブりを除いて日時でソートする
            IEnumerable targets = allLists
                                        .Where(x => x[2] == "PASS")
                                        .GroupBy(x => x[1])
                                        .Select(x => x.Last())
                                        .OrderBy(x => x[0]);

            // 結果を表示する
            foreach (IEnumerable target in targets)
            {
                foreach (var item in target)
                {
                    Console.Write(item + ",");
                }
                Console.WriteLine();
            }
        }
    }
}

 

 実行結果

2021/06/01 09:00:00,21610001,PASS,
2021/06/01 09:02:00,21610002,PASS,
2021/06/01 09:04:00,21610004,PASS,
2021/06/01 09:06:00,21610005,PASS,
2021/06/01 09:07:00,21610006,PASS,
2021/06/01 09:09:00,21610007,PASS,
2021/06/01 09:11:00,21610003,PASS,
    

 すごいですね。

見やすいように改行してますけど、実質1行でできちゃいました。

IEnumerable targets = allLists
                .Where(x => x[2] == "PASS")
                .GroupBy(x => x[1])
                .Select(x => x.Last())
                .OrderBy(x => x[0]);

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら

 

 

<Python>Raspberry Pi でシフトレジスタ74HC595を使う

Raspberry Pi でシフトレジスタ74HC595を使うサンプルです。

 

回路図はこんな感じです。

f:id:Cars_Narcy:20210403134709p:plain

回路図

 こちらのライブラリーを使わせていただきました。

github.com

こんなに便利な情報がいつでも手に入るなんてありがたいです。

素人でも使えました。

本当にありがとうございます。

 

まずはインストールします。

pip3 install git+https://github.com/marsminds/shiftr_74HC595.git

 

プログラムはこんな感じ。

リストpatternsの中身を順番に出力します。

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from shiftr_74HC595.shiftr_74HC595 import ShiftRegister
from time import sleep

#数字を8bitバイナリーリストにする
def list_bin(byte, degit):
    _high = 1 #GPIO.HIGH
    _low = 0  #GPIO.LOW
    bits=[]
    for i in range(degit):
        set_bit = _high if byte & (1 << i) else _low
        bits.append(set_bit)
    return bits

if __name__ == '__main__':

    # GPIO.setmode(GPIO.BOARD)
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    shift_register = ShiftRegister(data_pin=21, latch_pin=20, clock_pin=19)

    patterns = [1,2,4,8,0x10,0x20,0x40,0x80,0x00,0x55,0xaa,0x55,0xaa,0x00]
    try:
        while True:
            for i in patterns:
                print (format(i, '02x'), end = "=")
                print (i)
                shift_register.setOutputs(list_bin(i,8))
                shift_register.latch()
                sleep(0.5)
    except KeyboardInterrupt:
        shift_register.setOutputs(list_bin(0,8))
        shift_register.latch()
        print ("Ctrl-C - quit")
        GPIO.cleanup()
    

実行するとLEDが点滅します。

抵抗内臓LEDを使用すると配線がすっきりします。 

 

f:id:Cars_Narcy:20210403135728j:plain

(左側に写っている基板は関係ありません)

 

ご使用に関しては自己責任でよろしくお願い申し上げます。


2021年2月にpaizaラーニングでPythonを受講しました。
コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら