たまカーチャンのお部屋(さんでーぷろぐらま館)

仕様変更も納期も関係ない 趣味の素人タマさんの悪戦苦闘ぷろぐらみんぐBLOG

書いている人のキャパ

連載を前にして、これを書いている人がどんなことをやっていて、どんなことができるかを書いておきます。
なんでこんなもの冒頭に書いておくかといえば(ネトゲとかで私のことを知っている人は分かるでしょうけど)、私には モノを書いているうちについ盛ってしまう悪い癖がありましてですね。
別に嘘を書くわけではないのですが、ついつい「盛るぜぇ~超盛るぜぇ~~」になってしまうという……。
(一番有名なのが〝管理栄養士〟ネタですね。ちなみに私は栄養士の資格は持ってますが 管理栄養士は持っておりません)
で、これも私を以前から知ってる人には分かると思うのですが、私の嫌いなことの筆頭が〝もみ消し〟なんですね。
ツイ消しとかアカ消しとかはもっての外、黒歴史は修正を入れつつ全部残していくスタンスです。

ということで、予め資格だのスキルだの並べておけば、なんか書いたときに
「あ~又盛ってるな」
と分かるということです(始めから書かなきゃいいんですけど、盛らないと死んじゃう人なので)。

では持っている(持っていた)資格について
☆国家資格
・普通車AT(わざわざ書くことかこれ)
・地方Ⅲ種(昔で言うところの地方初級です。今はこんな言い方しないけどね)←地方なのに国家資格扱いとはこれいかに
・栄養士(ガッコ出たら自動で貰える。でも簡単じゃないですよ 取得所要時間は軽く1000時間を越えるし)←単にガッコに通ってる時間という話も
民間資格
日商簿記二級(学生時代に取った。事務のお仕事に 家計簿に 副職の申告にとお役に立ちまくり)
・FP2級(ほぼ10年掛かり これで転職(?)も大丈夫)←転職予定なし
・ACE(単一製品認定:InDesign)←副職の肩書きに取った(仕事が回ってくるようになってから更新してません。というより資格制度そのものが今は無いという)

お勉強
☆あんまり頑張ってませんでした(そら推薦で短大行ったクチですから)。
☆好きな科目は数学と世界史(今でもYouTubeの数学関連チャンネルでコメント入れまくったりしてます)。
☆ただ数学の成績はまぁとんでもないものでした。
☆代数と確率統計は得意だったけど、幾何と解析が壊滅的に ( ᐛ👐)パァ でしたからねぇ。
☆数学の内、プログラム関連のものはそれなりに深いとこを知ってたりするけど、関連じゃないところは ぱっぱらぴーです(TT)

そして、ぷろぐらまとしてのキャパ
☆まずは、完全アマチュアです。生まれてこの方 プログラム書いて報酬を受け取ったことは一度もありません。
☆でも長い間、オープンソースソフトウェアを作るグループに参加していて、細かい部品を作ったりテストしたりデバッグしたりしています。
・これのおかげで開発ツールを無料で使わせていただいているので それが報酬と言えば報酬かな(無料使用条件に〝ツールを使用した開発で金銭報酬を受け取ってはならない〟というのがあるのです)
☆読めるだけで 書けと言われても書けない言語が多いです。
☆読み書きできて、実際にモノを作れる言語というと
C++オープンソースの開発と、C#から呼び出すライブラリ作成用。ちなみにMFCは全く使えません。インターフェースはATLでやってます
C#←使い捨てに近いプログラムと、競技プログラムに使っています。UI作成も、軽さから近頃はこればっかり使っています。
Pascal←かつての母国語。PCにDelphiは入っていますが C++Builderは影も形もありません。あれ使うならC#で十分だしね。
Python←お手軽に何でも書ける楽しい道具。これでないとできない用途というものがたくさんあります。

ではでは

いよいよ明日より連載を開始します

なんか去年の10月から始めると書いてたのですが、ちょっと問題があって2月からとなりました。
以前から書いているように、Visual Studio2022のRC版テスターをやっていたのですが、これの終了日が今日なわけです。
で、それが何の問題かと言うと、使っているのがEnterpriseだったので Communityのstableに変更するまで延ばしていたわけです。
ライセンス的に問題があるかどうかは詳しくはわかりませんが、まあ曖昧なところには踏み込まないということで。

連載は 偶数日を予定しています。大の月は月末月初で2日空く利点があるので奇数日にしないところがカーチャンの浅ましさ(^_^;

順調に増えてる増えてる

今日またアップデートがきました。

Visual Studio 2022 17.0.0 Preview 4.1

例によってスタックトレース吐きまくりなのはいいとして(いいのか?)、いい加減これはどうにかして欲しい項目がこれ(MS報告済み)

リストに出力命令を格納するというコード(デリゲートのサンプル)なのですが、まあそのまま書けばこんな感じでしょうか

            var nums = new List<string> { "ONE", "TWO", "THREE" };
            var actions = new List<Action>();

            foreach (var n in nums) {
                actions.Add(() => { Console.WriteLine(n); });
            }

このコードのforeachのところにカーソルを持って行くと、修正候補として

f:id:tamaka:20210924075515p:plain
リファクタリング候補

と表示され、〝呼び出し形式へ変換〟を指定した場合こうなります。

            var nums = new List<string> { "ONE", "TWO", "THREE" };
            var actions = (nums.Select(n => () => { Console.WriteLine(n); })).ToList();

……当然こんなものはコンパイルできません。
これをチェーンメソッドに変換するとしたら

            var nums = new List<string> { "ONE", "TWO", "THREE" };
            var actions = nums.Select(n => (Action)(() => Console.WriteLine(n))).ToList();

あたりが無難かと思います。

修正を提案してくるくらいならせめてシンタックスエラーが出るようなものに変換するんじゃない~

余談:チェーンメソッドというものは、慣れたら大したことじゃないんですが、まあ読みづらいと言えば読みづらいので、私が書くとすれば↓のようになるんじゃないかなと*1

            var nums = new string[] { "ONE", "TWO", "THREE" };
            var actions =
                from n in nums
                select (Action)(() => Console.WriteLine(n));

          //actions.ForEach(delegate (Action action) { action(); });
            actions.ForEach(action => action());

私は、昨日書いたようにLINQ大好きですけど、クエリ式で書けるものはクエリ式で書く方が見易いと思います。
伊達にクエリ式がシンタックスシュガーと呼ばれているわけではないということで。
……クエリ式でどうやっても書けないものはあるので、適材適所の併用が吉かと(^^)

*1:今は最後の行のような書き方ができるから楽ですけど、以前はその1行上のコメントみたいな書き方だったんですよねぇ……

たぬたぬのやらかしたこと

私の血を引いてるんだから多少はこっち方面(ぷろぐらむ)向きかもとは思うけど、何も無ければいくらなんでも小学生に競プロやらせようとは思いません。
親バカなのは認めるとしてもそこまでトチ狂ってはいないぞ(^_^;

直列と並列

スイッチが2つある時、以下のようにする方法は?

  1. 片方を押したら点灯、もう片方だけ押しても点灯、両方押したら当然点灯
  2. 片方だけでは点灯せず、両方押したら点灯

……まんま 並列繋ぎと直列繋ぎですねぇ……回路だったら
f:id:tamaka:20210930113637p:plain

並列(OR)
f:id:tamaka:20210930113808p:plain
直列(AND)
小学校の〝りかのじっけん〟でやりましたねこれ。

イクラの場合

イクラの赤石は残念ながら輪っかになっていません。
上の1.(OR)の方は何も考えずに配線するだけでOKです。

f:id:tamaka:20210930114107p:plain
OR

でも2.(AND)の方はちょっとした工夫が要ります。
幸いにもNOTはレッドストーントーチという松明で実装されているので、ORとNOTでANDを実装することが求められてます*1*2

与えた手掛かり

さすがに小3がノーヒントでド・モルガン思いつけたら人外としか言いようがないわな*3
ということで、こんなものを作って使い方だけを教えておいて 後は何もしていません。

f:id:tamaka:20210930114318p:plain
ベン図アプリ

透過画像の表示/非表示で 各状態のAND/OR/NOTとその重なりが見えるようになっています。

結果

無事ANDゲート作成

f:id:tamaka:20210930114437p:plain
AND

ORとNOTは最初からあるので飛ばして
XORゲート(片方押したら点灯 だけど両方押したら消灯)も作成

ここまでなら〝えらいえらい(^^)〟なんですけど[想定内]*4
IMPLIESゲート作成……おまけに意味まで説明してもらった……。
もちろん数式なんかじゃなくて言葉でですけど、確かに内容は合ってるので本人も分かってるらしい……。
別に偉い数学者さんでないと分からないほど高度なことでもない(学校で教わる)ことですけど、出てくるの理系の高3やぞ……。
IMPLIESというのは、堅い言葉だと集合(必要条件とか十分条件)とブール代数(条件式)の接点*5なのですが、ぶっちゃけた言い方をすると

	if (xならばyは必ず成立するが yならばxは必ずしも成立しない)
	{
		なんたらかんたら
	}

をコードで書くということです。

さてこれを伸ばせるかスポイルしてしまうか*6
カーチャン、がんばりますですよ。

*1:ANDとNOT 又はORとNOTだけで全ての論理ゲートは実装可能です。ANDとORでNOTは作れないけどね

*2:NANDやNORは1種類だけで全部実装可能だけど、これは元々がニコイチなので(^_^;

*3:イクラで試行錯誤している内に見つけたというのは有りかもしれないけど(^_^;

*4:1975年頃までは ベン図とかA∩BとかA∪Bとかは学習指導要領では小学校で教えることになってたから、50代半ばより上の年代の人は小学生でこれを教わってます

*5:堅い言葉というより乱暴な言葉だなぁ……積集合(∩)和集合(∪)とAND(\wedge)OR(\vee)は確かに1対1に対応するけど

*6:嫌がるようなら絶対強制はしないつもりです

と思ったら

なにかと言うとこれが出る~

StreamJsonRpc.RemoteInvocationException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
   場所 StreamJsonRpc.JsonRpc.<InvokeCoreAsync>d__139`1.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.CodeAnalysis.Remote.BrokeredServiceConnection`1.<TryInvokeAsync>d__16`1.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 Microsoft.VisualStudio.Telemetry.WindowsErrorReporting.WatsonReport.GetClrWatsonExceptionInfo(Exception exceptionObject)
RPC server exception:
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
      場所 Microsoft.CodeAnalysis.Shared.Utilities.SymbolEquivalenceComparer.EquivalenceVisitor.HandleTupleTypes(INamedTypeSymbol x, INamedTypeSymbol y, Dictionary`2 equivalentTypesWithDifferingAssemblies)
      場所 Microsoft.CodeAnalysis.Shared.Utilities.SymbolEquivalenceComparer.EquivalenceVisitor.AreEquivalentWorker(ISymbol x, ISymbol y, SymbolKind k, Dictionary`2 equivalentTypesWithDifferingAssemblies)
      場所 Microsoft.CodeAnalysis.Shared.Utilities.SymbolEquivalenceComparer.EquivalenceVisitor.AreEquivalent(ISymbol x, ISymbol y, Dictionary`2 equivalentTypesWithDifferingAssemblies)
      場所 Microsoft.CodeAnalysis.SymbolKey.SymbolKeyReader.ParameterTypesMatch(ImmutableArray`1 parameters, PooledArrayBuilder`1 originalParameterTypes)
      場所 Microsoft.CodeAnalysis.SymbolKey.MethodSymbolKey.Resolve(SymbolKeyReader reader, Boolean isPartialMethodImplementationPart, IMethodSymbol method)
      場所 Microsoft.CodeAnalysis.SymbolKey.MethodSymbolKey.Resolve(SymbolKeyReader reader, String metadataName, Int32 arity, Boolean isPartialMethodImplementationPart, PooledArrayBuilder`1 parameterRefKinds, Int32 beforeParametersPosition, IMethodSymbol method)
      場所 Microsoft.CodeAnalysis.SymbolKey.MethodSymbolKey.Resolve(SymbolKeyReader reader, String& failureReason)
      場所 Microsoft.CodeAnalysis.SymbolKey.SymbolKeyReader.ReadWorker(SymbolKeyType type, String& failureReason)
      場所 Microsoft.CodeAnalysis.SymbolKey.SymbolKeyReader.ReadSymbolKey(String& failureReason)
      場所 Microsoft.CodeAnalysis.SymbolKey.ResolveString(String symbolKey, Compilation compilation, Boolean ignoreAssemblyKey, String& failureReason, CancellationToken cancellationToken)
      場所 Microsoft.CodeAnalysis.InheritanceMargin.InheritanceMarginServiceHelper.<GetInheritanceMemberItemInProcAsync>d__2.MoveNext()
   --- 直前に例外がスローされた場所からのスタック トレースの終わり ---
      場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
      場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      場所 Microsoft.CodeAnalysis.InheritanceMargin.InheritanceMarginServiceHelper.<GetInheritanceMemberItemAsync>d__1.MoveNext()
   --- 直前に例外がスローされた場所からのスタック トレースの終わり ---
      場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
      場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      場所 Microsoft.CodeAnalysis.Remote.RemoteInheritanceMarginService.<>c__DisplayClass2_0.<<GetInheritanceMarginItemsAsync>b__0>d.MoveNext()
   --- 直前に例外がスローされた場所からのスタック トレースの終わり ---
      場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
      場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      場所 Microsoft.CodeAnalysis.Remote.BrokeredServiceBase.<RunServiceImplAsync>d__12`1.MoveNext()
   --- 直前に例外がスローされた場所からのスタック トレースの終わり ---
      場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
      場所 Microsoft.VisualStudio.Telemetry.WindowsErrorReporting.WatsonReport.GetClrWatsonExceptionInfo(Exception exceptionObject)

まぁ、なんですねぇ……Roslynさんが泡吹いてます。

再開にあたっての目標

VS2022 Preview4は無事、報告した不具合も直っており*1、まずは一安心です。
で、昨日書いていた目標ですが

英才教育(大嘘)

たぬたぬ*2に創造力をつけるとかの名目でブロック遊びなどやらせてみようと思いつつも
LEGOが高価で困る(TT)
ということで、幼少のおりからMinecraftとか言う知育教材(?)に慣れ親しんでいました。
イクラの中でも赤石(Redstone回路)に興味を示し、色々仕込んでいる内に今では私よりも詳しくなってしまいました。

カーチャンの野望

イクラの赤石は、名前は回路ですが実質は論理ゲートなので、これを進めていったら凄いことになりそう

なんか想定以上の成果が出てしもた(次記事参照)
しかも本人は結構楽しんでいる模様
これはもしかしてスーパーハカー誕生かもしれず(←親バカ)

目指せIMO(高校生数学オリンピック)(←親暴走)

……私自身にそんなもん教えられる頭がありませんでした*3(←親号泣)

このテの問題は学校には期待できないしねぇ……。

では目標変更

ということで、私になんとか出来る範囲で一緒に頑張りましょう*4

期間

中学卒業までに

何を

Project Euler全問(の内、できるところまで)を

どのように

平易な記述で、ある程度の実行速度を持って

なぜProject Euler?

パズル系の問題の方が解いている分には楽しいのですが、ぶっちゃけ潰しが効かないんですよねぇ……。
実際にお仕事で求められているのは

  • 与えられた仕様を
  • いかに平易な記述で(不具合の入り込む余地を減らす:ゼロにはならんのは当然ですが)
  • 可能な限りパフォーマンスを上げて

書けるかということでしょう*5
このような力を付けるのにProject Eulerの問題は向いていると思います。
一通り見渡すだけでも

  • 方程式の解
  • 文字列処理
  • 探索
  • 整列
  • 図形処理
  • 集計処理
  • ファイル処理
  • データ構造
  • データ検査

あたりが揃ってますしね。

なぜBLOGに載せていくのか

なるべく間違わないように精一杯やっていこうとは思います。でもそれが最善じゃないのは重々承知なわけで
ここを色々な方に見ていただいて、もっと良い手法があるとか突っ込んでいただけたら光栄至極とか思っています。
まあ、実際の書込を見れば分かる通り、あくまで子供と一緒に学んでいこうというスタンスなので、もっとスマートとかエレガントとかなテがあっても
小中学生に理解ができない
コードでは参考にはならないのでご容赦です。

まとめ

小中学生でやるのに早いかどうかと考えてみたのですが、まあ電話級アマチュア無線技士(現 第四級アマチュア無線技士)の最年少が小学校2年で、基本情報技術者試験(ITパスポートじゃないです念のため)の最年少合格者が小学校4年なので、大丈夫じゃないのかなとは思っています。

では以降 お付き合いいただけたら幸いです。

*1:私のレポートで直ったわけでもないと思うけど、あちこちから指摘されてるとは思うので

*2:長男です。黒猫(長女)と言ってもネコじゃないし、たぬたぬと言ってもタヌキではありません(^_^;。

*3:まあ一度IMOの過去問見てみれば分かります。これが教えられるくらいなら中高一貫ガッコの数学教師やっとるわ……

*4:一応、IOI(高校生情報オリンピック)の過去問は一通り解けるタマ先生

*5:平たく言えば、「コードレビューや検収で突っ込まれないものが書けること」(by 師匠) 

張り切ってから時空を越えて

再開ご挨拶

一つ下の記事から8年半たってますがなあーた……。
その間にまた子供が増えたりいろいろありました。
……七五三を全パート埋めて一度に済ませたりね。
そして新目標と共に再開となりました。

きっかけ

本日、このようなものがリリースされております。

Visual Studio 2022 17.0.0 Preview 4.0

まあいきなりというわけでもなく

と、慌ただしく機能追加とかバグフィックスとかしているらしいです。
駄菓子菓子*1、プレビュー3.1の時点でまだ

  • 行結合で、連結したテキストの一部が欠落する
  • エラー・警告表示をダブルクリックすると該当行にジャンプする筈が、別の行にジャンプしてしまう*2

等の不具合が残っており*3、さて今回はどうなっているものやら……。

で、これを機会にタマ部屋を再開しようとか思ったわけです
(目標についてはまた明日書きます)

*1:誤字ではありません。タマさんが「だがしかし」と書くとこれに変換されるので惰性で使っております

*2:エラー・警告の該当行表示は正確に表示されています

*3:MSへは報告済