ひとりも見捨てないことを、あきらめない

学校教育、社会教育、数学、技術家庭科、Youtube、EdTech、ICT、プログラミング、その他

「窓」を作る。大きくする。表示順序を変える   01/23 木

 Visual Studio 2019 でプログラミングしていることについて、ちょっとメモです。

 複数のフォームを表示させて、その画面にいろいろな情報を表示させていると、「あああ。窓が小さいっっ」と思うことがあります。

 いっそのこと、画面全体に大きくして、広々と作業したくなります。そこで、「現在、作業している<窓>と別の<窓>を表示させたい」。「両方とも大きくなると、使いやすくて便利」。「できれば、こっちの窓が、最初にパッと見えると、いちいち切り替えなくてもいいので便利」みたいなことを考えます。

 そこで、こういうことを、プログラミングするにはどうすればいいだろうかと考えるわけです。(当然、あちこち検索して、こうすればいいのかな。ああすればいいのかな。と試すわけです)。

 途中を全部省略して、結果だけ以下に書きます。本当は「その過程」が楽しいんですけどね。

namespace test
{
	public partial class myForm : Form
	{
		public myForm()
		{
			InitializeComponent();

			// 別のフォームをつくる
			Form F2 = new Form();
			// そのフォームを表示させる
			F2.Show();

			// この時点では、どちらも、800x400ぐらいの大きさ

			// もともとのフォームを最大化する
			this.WindowState = FormWindowState.Maximized;
			// 「別のフォーム」も最大化する
			F2.WindowState = FormWindowState.Maximized;

			// 両方とも最大化したが、どちらが上になっているかは未定

			F2.Owner = this
			// 「別のフォーム」の「親」を最初のフォームにする
			// ⇒ 子どものフォーム「F2」が必ず上になる。
		}
	}
}

 ちなみに文中で「フォーム」と書いてあるのは<窓>のことです。このあたりの用語の使い方というのも、いろいろクセがあって、初めての人(私のことです)には、分かりにくい部分ですね。

 上から順番に読んでいくと、ちょっとだけ分かるかなあと思います。もうちょっと詳しく知りたければ、御連絡いただければ何とかするかも。

f:id:takase_hiroyuki:20200123073058p:plain

 

日本型労働の見直しについて 01/22 水

 経団連が、「春闘に向けた経営側の指針」を発表したというニュースが飛び交っています。そのなかで「転換期を迎えている日本型雇用システム」という項目があり、いままでの雇用のあり方を本格的に変えていこうという提言がなされている・・・と報道されています。

 ただ、こういう報道に頼ってしまうと、うっかりして表面的な理解にとどまったり、大事なところで誤解してしまったりします。したがって、やはり原典にあたるのが大切かと存じます。

 原典は、アマゾンで購入可能です。

経営労働政策特別委員会報告 2020年版 (日本語) – 2020/1/27

 

 また、目次だけなら、WEBでも確認できます

---引用ここから---

2020年版 経営労働政策特別委員会報告
-Society 5.0時代を切り拓くエンゲージメントと価値創造力の向上-

一般社団法人 日本経済団体連合会

〔目次のみ掲載〕
第1章 Society 5.0時代にふさわしい働き方を目指して
はじめに

1.働き方改革のさらなる深化
2.転換期を迎えている日本型雇用システム
3.Society 5.0時代に活躍する人材の育成
4.地域の中小企業の新たな取組み

第2章 雇用・労働分野における諸課題
1.働き方改革関連法への対応
2.ハラスメントをめぐる法改正と企業の対応
3.70歳までの就業機会の確保に向けて
4.障害者雇用の現状と今後の課題
5.最低賃金制度に関する考え方

第3章 2020年春季労使交渉・協議における経営側の基本スタンス
1.わが国企業を取り巻く経営環境
2.経営側の基本スタンス
3.今後の労使関係

■ TOPICS
○ 働き手のエンゲージメントの重要性
労働生産性の向上に向けて
○ 副業・兼業をめぐる動向
就職氷河期世代支援
○ 労働紛争の現状と動向
○ 雇用類似の働き方をめぐる動向
○ 仕事と生活の両立に資する介護休暇等の時間単位取得
雇用保険法の改正
労働分配率の動向
以上

---引用ここまで---

出典

https://www.keidanren.or.jp/policy/2020/009.html

 

私自身も、「きちんと勉強しなくちゃいけないな」と考えています。

f:id:takase_hiroyuki:20200122191416j:plain

 

名簿関係のプログラミング  01/21 火

 現在、つくっているアプリケーションについて、名簿関係のプログラミングに移っています。名簿を読んだり、書いたり、修正したりです。下の画像のような、DataGridView という便利な仕組みがあるのですが、これは「表示するだけ」で、貼り付けたり修正したりは、自分で作り込まなくてはなりません。

 あれこれ、試しています。具体的な、プログラム・コードについては、後ほど整理して書こうと思います。

f:id:takase_hiroyuki:20200121051500p:plain

 

フィットネス 2020/01/18   01/20 月

フィットネス 2020/01/18
現在の走行距離の合計、約39km 

次回からベンチプレスは、30x5+35+2+40x1+45x30 に変更する予定です。
痛めていた左足のヒザに、なるべく負荷をかけるようにしています。

キャット&ドッグ 3回x3セット
ラット・プル (25kg+27kg+29kg)x10回
ベンチ・プレス 20kgx10+30kgx7+35kgx3+45kgx30回
 
トレッドミル(25分間) 2,890m ⇒2020年の累計 8,670m
 
ハムストリングス 23kgx10回x3セット
レッグ・エクステンション 39kgx10回x3セット
アダクション 52kgx10回x3セット
アブダクション 43kgx10回x3セット
プレス・ダウン。最後にねじる 34kgx10回x4セット
アーム・カール 29kgx10回x4セット
レッグ・プレス 57kgx10回x3セット
腹筋 1秒x20回x3セット
ダンベル(内側) 10kgx25+12kgx5
ダンベル(両方外側) 4kgx20回x3セット
ライイング・トライセップス・エクステンション 10kgx40回+12.5kgx5回
フロント・プル 39kgx10回x3セット
 
バイク(25分間) 10,300m ⇒2020年の累計 30,700m

f:id:takase_hiroyuki:20190519162425p:plain

 

プログラムが止まる!!その2  01/19 日

 昨日の記事についてですが、「同時にアクセスしようとするからダメなんだろう」と考えて、いくつかの方法を試してみました。(たとえばトランザクションという仕組みを使うとか)

 現時点で、大丈夫そうな方法は、「最初にデータベースをオープンしたら、あとは開きっぱなしにしておく」という方法です。でも、これでは、危なそうな気もします。

// データベースが存在しなければ作る
public static void DBCheck()
{
	DBconn = new SQLiteConnection("DataSource=" + DataFileName);
	DBconn.Open();

	(途中略)
}

※この関数でデータベースを開いたら、
 最後まで DBconn.Close() を実行せずにそのままにする。

 もうすこし別の方法も考えてみます。

f:id:takase_hiroyuki:20191123160855p:plain

プログラムが止まる!!!  01/18 土

 アプリケーションを作るときに、私は、最初はとりあえず外観とか、入力したときの具体的な動きとかを作って、実際のデータの構造の決定や、「class」(って言われても分かんないですよね)の構造の決定は、少し後回しにします。

 自分で、半分、遊びながら試行錯誤で作っているという、とても気楽な作業ですので、「まあ、とりあえず、作ってみよう」、「いろいろ作ったり、壊したり、付け加えたりしているうちに、だんだん形になってくるだろう」と考えています。

 現在、現在作っているアプリケーションでも、とりあえず、だいたいの動きを作りました。そのうちに、「これと、これは、ひとまとめにした方がいいなあ」、「これをこうすると、こっちも一緒に動くなあ」ということがだんだん分かってきました。密接に連携しているものは、「class」と呼ばれる機能をつかって、ひとまとめにできますので、あらためて、ひとまとめにしてからプログラムを作り直すということをやっています。

 この過程で、だんだん、自分が扱っているデータの構造がハッキリしてきます。そこで、そのデータを上手に保存できるように、データベースのデータ構造を決めています。そして、今度は、データベースを組み込んだ形で、もう一度、プログラムを組んでいきます。

 もちろん、同じことを何度もやるのは面倒くさいので、前に作ったものをコピーして、次の段階に進みます。「どのようにしたら、コピーしやすいか」、「どのような作り方をしたら、コピーするだけでちゃんと動くのか」ということも、試行錯誤しながら作っています。

 

 さて、データベースを組み込んだ状態で、プログラムを動かしてみると、いろいろな問題が新たに発生します。一番、面倒なことは、「いままでは、メモリ上だけで、さまざまな処理を行っていたことを、今度は、いちいちデータベースから読み取ったり、データベースに記録したりしなければならない」ということです。

 コンピュータのプログラムは、突然、止まることがあります。突然、止まったときに、それまでの仕事内容が全部消えてしまったら、とても悲しくなります。そこで、作業のたびにデータベースに結果を記録しておこうと考えます。ただし、すべてを丸ごと記録するのでは効率が悪いので、変更した部分だけを記録します。

 私が作っているアプリケーションでは、マウスをクリックしたときと、マウスを移動させたときに、それぞれデータを保存する必要があります(常に、ではないのですが、保存する場合もあります)。このとき、うっかり「クリックした瞬間に動かしてしまう」と、同時に2つの処理が発生します。

 同時に2つの処理が発生すると、データベースは、「ちょっと待ったぁぁぁ。データに不整合が起きる可能性があるから、待て!!」となます。そして、10秒とか15秒とか、完全に止まります。

 うーむ。どうしたものか。

 現在、悩んでいるところです。

f:id:takase_hiroyuki:20191123160855p:plain

 

データベースへのアクセス 01/17 金

 現在作成しているアプリでは、データベースは SQLite を使用しています。これは、「あとで、処理内容を確認したい」というときに、SQLite であれば、データファイルを保存しておけば、そのファイルを開くだけで過去のデータにアクセスできるからです。

 具体的に、データベースにアクセスするための方法をメモしておきます。以下のメモは、他にも非常に多くの方が、ブログ等で紹介しておられますので、特に新しいものではありません。

 まず、「もしも、データベースそのものが存在しなければ、データベースを作る」というのは、次のようにします。

using var conn = new SQLiteConnection("DataSource=" + DataFileName);
conn.Open();
SQLiteCommand comm = conn.CreateCommand();
string Src;

Src = "create table if not exist TestTable ( id primary key, name not null, pic BLOB)";
comm.CommandText = Src;
comm.ExecuteNonQuery();

comm.Dispose();
conn.Close();
conn.Dispose();

 これで、ID と名前と顔写真のデータベースが作成できました。

 次に、「データベースを開いて、何らかの処理を行う」というのは、次のようにします。

using var conn = new SQLiteConnection("DataSource=" + DataFileName);
conn.Open();
SQLiteCommand comm = conn.CreateCommand();
string Src;

Src = "select id, name form TestTable";
comm.CommandText = Src;
SQLiteDataReader reader = comm.ExecuteReader();
if (reader.HasRows)
{
	while (reader.Read())
	{
		int myid;
		string myname;
		myid = reader.GetInt32(0);
		myname = reader.GetString(1);
	}
}

comm.Dispose();
conn.Close();
conn.Dispose();

 ここで、上のふたつで実際にデータベースを操作しているのは、次の部分です。

Src = "create table if not exist TestTable ( id primary key, name not null, pic BLOB)";
Src = "select id, name form TestTable";

 これら文を理解するためには、プログラムそのものを理解するのとは、別の事柄(つまり、データベースとは、そもそも何で、どのように処理を行うのかという事柄)を理解しなければなりません。そういう意味では、単にプログラムを作るよりも、難しい課題だと思います。

 ただ、現実的に皆さんに使っていただけるようなアプリを作るためには、データベース的な考え方は、避けて通れません。というよりも、「そもそもデータベースとは何か」、「どうすれば便利に使うことができるのか」という事柄は、多くの人が理解すべきことだろうなあと、私は思っています。

f:id:takase_hiroyuki:20191123160855p:plain

自動スクロールについて 01/16 木

 画面になにかを表示させたときに、画面に収まり切らない場合があります。このときに、スクロールバーがあれば、見えない部分を見ることができるので、便利です。

 スクロールバーは、いろいろなものにつけることができます。タブにも、パネルにも、つけることができます。自動的にスクロールバーを表示させるためには、次のように書きます。

TabPage tab = new TabPage();
tab.AutoScroll = true;

問題なのは、「見えないところに、モノを配置するには、どうすればいいか」ということですが、「現在見えている画面の、左上が、座標の原点になる」ということのようです。そして、見えない部分(画面の上に隠れている部分)は、Y座標がマイナスになります。反対に、画面の下の方に行くほど、Y座標は大きくなります。

 それでは、画面の上の「見えない部分」がどのくらいあるのかというと、それは、次のようにして取得することができます。

tab.AutoScrollPosition.Y

この値は、負の値になります。

 したがって、「見えない部分の一番上」にたとえばラベルを貼り付けたければ、Location を次のように設定すればよいということになります。

int y = tab.AutoScrollPosition.Y;
Label LB = new Label();
LB.Location = new Point(0,y);

f:id:takase_hiroyuki:20191123160855p:plain

イベントハンドラの「裏技」 01/15 水

 こんな方法があるんだと、びっくり仰天です。

 でも、この記事を読んでおられる皆様は、「いったい何がびっくり仰天なのか」、「なぜ、そのことが、びっくり仰天に値するのか」が、分からないだろうなあと思います。申し訳ありません。

 自分用のメモとして少し書いておくと、まず「イベントハンドラ」とは、マウスを動かしたとか、マウスをクリックしたとか、キーボードのボタンを押したとか、人間がコンピュータに対して、何らかの操作を行ったということに関係しています。

 「こんな操作をしたよ」ということを、上手にコンピュータに伝えるための道具が「イベントハンドラ」です。

 当然のことながら、マウスを動かすということと、キーボードのキーを押すということは、まったく別の種類の事柄です。したがって、プログラムでも、別の種類のものとして扱っています。

 ところが、「裏技」を使うと「なんでもあり」になってしまいます。マウスもキーボードもなんでもあり、ですし操作する対象も、画像を扱っていたはずなのに、ボタンを操作してしまうということも可能です。まるでジョーカーのような働きをしています。

 プログラムは、次のとおりです。

using System.Drawing;
using System.Windows.Forms;

namespace mytest
{
    public partial class Form1 : Form
    {
        public static Panel PL;

        public Form1()
        {
            InitializeComponent();
            PL = new Panel();
            Controls.Add(PL);
            PL.Size = new Size(800, 600);

            new Test(60);
            new Test(120);
            new Test(180);
            new Test(240);
        }

        public static void MyMove(PictureBox pic, Label LB)
        {
            pic.BackColor = System.Drawing.Color.Red;
            LB.BackColor = System.Drawing.Color.Yellow;
        }

        public static void MyLeave(PictureBox pic, Label LB)
        {
            pic.BackColor = Color.FromArgb(40, 0, 0, 255);
            LB.BackColor = Color.FromArgb(40, 255, 0, 0);
        }
    }

    public class Test
    {
        public PictureBox Pic;
        public Label LB;

        public Test(int y)
        {
            LB = new Label();
            Form1.PL.Controls.Add(LB);
            LB.Size = new Size(100, 50);
            LB.Location = new Point(50, y);
            LB.BackColor = Color.FromArgb(40, 255, 0, 0);

            Pic = new PictureBox();
            Form1.PL.Controls.Add(Pic);
            Pic.Size = new Size(100, 50);
            Pic.BackColor = Color.FromArgb(40, 0, 0, 255);
            Pic.Location = new Point(200, y);
            Pic.MouseMove += (s, e) => Form1.MyMove(Pic, LB);
            Pic.MouseLeave += (s, e) => Form1.MyLeave(Pic, LB);
        }
    }
}

 いちおう、画像も、添付しておきます。

f:id:takase_hiroyuki:20200115192008p:plain

だいぶ形になってきました 01/14 火

 PDF ファイルも読めるようになりましたし、読み込んだデータを、SQLite のデータファイルに保存したり、再度、読み込んだりすることもできるようになりました。

 画面構成は、すいませんが、とても荒削りです。

 まだまだ、これからです。

f:id:takase_hiroyuki:20200115192411p:plain

 

フィットネス  01/13 月

ベンチ・プレスの 45kgx30回は、安定してできるようになりました。トレッドミルとバイクは、少しゆっくりにしています。

現在の走行距離の合計、約26km 
キャット&ドッグ 3回x3セット
ラット・プル (25kg+27kg+29kg)x10回
ベンチ・プレス 20kgx10+30kgx7+35kgx3+45kgx30回
 
トレッドミル(25分間) 2,830m ⇒2020年の累計 5,780m
 
ハムストリングス 23kgx10回x3セット
レッグ・エクステンション 39kgx10回x3セット
アダクション 52kgx10回x3セット
アブダクション 43kgx10回x3セット
プレス・ダウン。最後にねじる 34kgx10回x4セット
アーム・カール 29kgx10回x4セット
レッグ・プレス 57kgx10回x3セット
腹筋 1秒x20回x3セット
ダンベル(内側) 10kgx25+12kgx5
ダンベル(外側) 5kgx20回x3セット
ライイング・トライセップス・エクステンション 10kgx40回+12.5kgx5回
フロント・プル 39kgx10回x3セット
 
バイク(25分間) 10,100m ⇒2020年の累計 20,400m

 

f:id:takase_hiroyuki:20190519162425p:plain

 

日付を「普通の数字」に変更する  01/12 日

 C# になって、日付のシリアル値が、あまりはっきりしなくなったように思います。つまり、歴史上のある年月日、時分を基準として、そこから何秒後という数字を、「一意的に表すような関数」を、誰かが標準的に決めるということをしなくなったように思います。

 日時については、DateTime というクラスで表現することになっているのですが、したがって、この DateTime から普通の数値に変換することが、なかなか難しくなりました。なにしろ、標準的な関数のなかには、そのような関数はありません。

 とは言うものの、そういう関数がないということは、皆さんは、あまりそういう関数を必要としていないのだろうなあと感じています。

 ところが、データベースを使うとなると、ちょっと事情が変わります。特に、私が普段使っているのは、SQLite というデータベースなので、できれば「普通の数値」に変更した方が記録しやすいと思います。

 あれこれ探して、次のような方法なら、実用になりそうだと思う方法を見つけたので、メモしておきます。

 まず、基準となる日時を自分で決めておきます。以下の例では、2000年1月1日の午前0時を基準にしました。現在の時刻は、DateTime 型の関数で、

    DateTime.Now

という形で取得できます。この DateTime 型の数値を、普通の数値(2000年1月1日午前0時からの秒数)に変換することが目的です。具体的には、次のようになります。

    DateTime kako, ima;
    int second;
    kako = DateTime.Parse("2000/1/1");
    ima = DateTime.Now;
    second = (int)(ima - kako).TotalSeconds;

 また、秒数から現在の数値に変更するには、次のようにします。変更したものを表示するために、メッセージボックスを利用しています。

    int kako, ima, second;
    second = 600000000; // 2000年1月1日から6億秒後
    kako = DateTime.Parse("2000/1/1");
    DateTime ima = kako.AddSeconds(second);
    MessageBox.Show(ima.ToString(),"現在時刻");

以下の図のように、2000年1月1日から6億秒後は、2019年1月5日の午前10時40分になります。

f:id:takase_hiroyuki:20200112214655p:plain

ちなみに、2001年1月1日午前0時から6億秒後は、

f:id:takase_hiroyuki:20200112215009p:plain

です。つい、最近ですね。