.NETコンソールアプリでコマンド実行してみる
はじめに
.NETコンソールアプリで任意のコマンドを実行するexeを作ります。
プロジェクトの作成
下記コマンドでプロジェクトを作成します。
オプションはどちらかひとつでも通ります。
-o:出力先のディレクトリ名の指定
-n:プロジェクトファイル名の指定
dotnet new console -o [プロジェクト名]
ソースコード
using System; using System.Diagnostics; namespace commandtest { class Program { static int Main(string[] args) { int rtn = 0; int result = 0; try { // プロセスの起動 ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "/k dir"); // プロセスを新しいウィンドウで起動する psi.CreateNoWindow = true; // プロセスの起動にシェルを使用する psi.UseShellExecute = true; psi.RedirectStandardError = false; psi.RedirectStandardInput = false; psi.RedirectStandardOutput = false; // ウィンドウの状態を取得/設定 psi.WindowStyle = ProcessWindowStyle.Normal; // 実行 using (Process proc = Process.Start(psi)) { // プロセスの終了を待つ proc.WaitForExit(); // プロセスが終了時に指定された値を受け取る result = proc.ExitCode; } } catch { rtn = -1; } Environment.ExitCode = rtn; return rtn; } } }
コード内補足
ProcessStartInfo:引数に起動時に使用するアプリとアプリに渡すコマンドが設定できます。using System.Diagnosticsが必要です。
ProcessStartInfo クラス (System.Diagnostics) | Microsoft Docs
コマンド指定の先頭にある/kは実行後にウィンドウを閉じないために指定します。
ウィンドウを閉じたい場合は/cにします。
RedirectStandardError:アプリケーションのエラー出力を StandardError ストリームに書き込むかを指定します。
ProcessStartInfo.RedirectStandardError プロパティ (System.Diagnostics) | Microsoft Docs
RedirectStandardInput:アプリケーションの入力を StandardInput ストリームから読み取るかを指定します。
ProcessStartInfo.RedirectStandardInput プロパティ (System.Diagnostics) | Microsoft Docs
RedirectStandardOutput:アプリケーションのテキスト出力を StandardOutput ストリームに書き込むかを指定します。
ProcessStartInfo.RedirectStandardOutput プロパティ (System.Diagnostics) | Microsoft Docs
※UseShellExecuteを使用する場合、上記3つはfalseにする必要があります。
WindowStyle:プロセスを起動するときに使用するウィンドウの状態を取得/設定できます。最大化(Maximized)、最小化(Minimized)、通常(Normal) 、非表示(Hidden)が選べます。
ProcessStartInfo.WindowStyle プロパティ (System.Diagnostics) | Microsoft Docs
WaitForExit:指定した時間が経過するかプロセスが終了するまで現在のスレッドの実行をブロックします。
Process.WaitForExit メソッド (System.Diagnostics) | Microsoft Docs
exeで実行できる形にする
dotnet publish -c Release
プロジェクトの下記にビルドされます。
bin\Release\net5.0\publish
exeをダブルクリックすると実行できます。
SSMSでVSCodeのショートカットキーを使う
はじめに
最近はVSCodeでUIやAPIを作り、SQL Server Management Studio(SSMS)でDBを触る、というスタイルなのでVSCodeとSSMSを行ったり来たりします。
それぞれショートカットキーが異なり、面倒に感じたのでSSMSのショートカットキーを編集しました。
ちょっと調べてるうちにVSCodeからDBにアクセスできる方法がわんさと出てきたので
ショートカットキーの設定云々よりそっちに移行することになりそうです~
一応、SSMSでVSCodeのショートカットキーが使えるんだなってことで書いておきます。
SSMSにVSCodeのショートカットキーを割り当てる
特に面倒に感じたのがコメントアウトのショートカットキーの違いです。
VSCodeはCtrl+/、SSMSはCtrl + K、Ctrl + C。
VSCodeのほうに慣れてしまったので、SSMSのほうを変えます。
メニューバーから[ツール]>[オプション]を選択。
[キーボード]>[次の追加キーボードマップスキームを適用]で[Visual Studio Code]を選択。
[OK]をクリック。
これでCtrl+/でコメントアウトができるようになります。
ただし、ひとつのショートカットキーに2つの意味は持たせられないようで、
コメントアウト解除のショートカットキーは別になります…
(Ctrl+/を連打しても頭の--が増えるだけ…
『日本語プログラミング言語「なでしこ」に関する解説』を読んでの感想
日本語プログラミング言語「なでしこ」とは?
上記のコラムを読んでいただくのが一番良いですが、簡単に。
- 日本語で書けるソースコード
- 対象使用者:プログラミング初心者の老若男女
- 開発のきっかけ:事務の自動化のため
- 2021年度から中学の教科書で扱うことに。
公式サイトでは簡易エディタがあり、実際に触ってみることができます。
なでしこ:日本語プログラミング言語
他の人がなでしこを使って作ったプログラムも見ることができます。
🍯 なでしこ3貯蔵庫
私がコラム内で特に日本語プログラミング言語の意義として一番いいなと思ったのは下記です。
現在プログラミング入門として,Scratchなどビジュアルプログラミング言語が用いられています.しかしビジュアルプログラミング言語から,本格的なプログラミング言語に移行するには大きな壁があります.そこで,クッションとして日本語プログラミング言語を使っていただければと思います.
私もビジュアルプログラミング言語とプログラミング言語には大きな壁があると思っています。
その壁によって、せっかく楽しいと思えたプログラミングへの興味が折られてしまったらもったいないと感じていました。
なでしこによってその差が埋められたらいいですよね。
自作プログラミング言語って?
プログラミング言語の作り方についてあまり知らなかったのでこの機会に調べてみました。
世の中には当然のように自作プログラミング言語界隈があるようで、これもまた深い沼のような雰囲気がありました…
自作する目的としては下記があるようです。
- 既存よりいい言語を作りたい
- 独自のアプリ用の言語が欲しい
- とにかく作ってみたい
結局は「作ってみたい」という情熱がすべてな気がしますね。
作る流れ
大雑把に流れを書くと大体こんな感じではないかと。
字句解析
ソースコードを意味のある単語(トークン)に分割します。
この説明はこちらのサイト様の説明がわかりやすいです。
プログラミング言語を作る/yaccとlex
ちなみに、なでしこでは助詞でトークンを区切ることで、引数を逆転させても意味が通るような工夫がされているそうです。
構文解析
字句解析したトークンとプログラミング言語の文法から構文木を作ります。
なぜ木構造なのというところの理解がふわっとしており、文字に書き起こせないのでもう少し考えてから書きたいと思います。
構文解析は研究が盛んなようで、ツールが言語によっていろいろあるそうです。
例)yacc(C言語)、JavaCC(Java)
【React+TypeScript】ミニマムなユニットテストコードを書いてみた
はじめに
React+TypeScriptでフロントエンドを触るようになりましたが、いまだにテストは全然自動化できてません…
テストの種類も色々あり、どれも気になるのですが、よくあるテストピラミッドを参考にまずはユニットテストを考えることにしました。
そもそもユニットテストのテストコードとはどんなものなのかを知りたかったので、ミニマムなテストコードを書いてみました。
参考サイト様
主にこちらの記事のユニットテストを実施させていただきました。
JavaScriptテストフレームワーク「Jest」を使って、Reactをテストしよう – ajike developer's blog – UXデザイン会社アジケの開発者ブログ
その他、テストについて参考にさせていただきました。
React Testing Libraryの使い方 - Qiita
react-testing-frameworkで要素が「存在しないこと」を確認しようとするとエラーになる - 幸福なプログラマ
使うもの
React
TypeScript
Reactのテストユーティリティ
テストユーティリティ – React
やったこと
新規Reactアプリケーションを作成する
下記コマンドで新規プロジェクトを作成します。
npx create-react-app [プロジェクト名] --typescript
テスト対象のコンポーネントを作る
テスト対象のコンポーネントを作ります。
今回はLink.tsxです。
import React, { Component } from 'react'; class Link extends Component<{ text?: string }, {}> { render() { return ( <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" > {this.props.text || 'No contents'} </a> ) } } export default Link
App.tsxで呼び出します。
import React from 'react'; import logo from './logo.svg'; import './App.css'; import Link from './components/Link'; function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> Edit <code>src/App.tsx</code> and save to reload. </p> <Link text='this link'/> </header> </div> ); } export default App;
テストフォルダを作る
テストコードを格納するためにフォルダ名「tests」のフォルダを作ります。
テストファイルを作る
testsフォルダにテストファイルを作ります。
今回はLink.text.tsx。
テストファイルの書き方についてもまだ掘り下げ切れていないのですが、
確認項目ひとつにつき、actひとつという感じのようです。
今回は、propsが渡された場合と渡されない場合の2パターンでテストします。
propsが渡されない場合は、textが'No contents'であること
propsが渡された場合は、textが'this link'であることを確認しています。
import { render } from 'react-dom'; import { act } from 'react-dom/test-utils'; import Link from '../components/Link'; describe('Link component testing', () => { let container: Element | DocumentFragment | null = null; container = document.createElement("div"); document.body.appendChild(container); it('Linkコンポーネントテスト', () => { // ケース別にテストします act(() => { render(<Link />, container); }); // propsが渡されない場合 expect(container!.textContent).toBe('No contents'); act(() => { render(<Link text='this link'/>, container); }); // propsが渡された場合 expect(container!.textContent).toBe('this link'); }); })
App.test.tsxの編集
create-react-appすると、デフォルトでApp.test.tsxというテストファイルが作られますが、
そのまま使用するとエラーが出るので、下記のように書き換えるorコメントアウトします。
import { render, screen } from '@testing-library/react'; import App from './App'; test('renders learn react link', () => { render(<App />); // const linkElement = screen.getByText(/learn react/i); // expect(linkElement).toBeInTheDocument(); const linkElement = screen.queryByText(/learn react/i); expect(linkElement).toBeNull(); });
テストの実行
ターミナルで下記コマンドを実行して、テスト開始します。
npm test
問題がなければ2 passedの結果が出ます。
意図的に失敗させたい場合は、Link.text.tsx内の'this link'を別の文字列にしたりします。
そうするとこんな感じのエラーが出ます。
ソースコード全体
今回作ったもののソースコードはGitHubにあげているの、そちらも参照ください。
github.com
感想
今回は2つしかテストがないので、結果が見やすいですがテストが増えたら見づらくなるのでは?と思ってます。
たぶんVScodeの拡張機能を使ったりすればもっと見やすいテスト結果の取得ができるんだろうなという気がします。
今回のやり方では必要なコンポーネントごとにテストコードを書くのは結構な労力になることがわかりました。
この考え方をベースにしてユニットテストコードを書くのは果たして正解なのか…
ユニットテストコードを書くことはどんなやり方でもこれくらい大変なのか、
またはもっと簡単なやり方があるのか、慣れなのか…ううーむ
少なくともテストコードの作成には労力が結構必要ということが身をもってわかったので、必要なところにピンポイントで用意することの大切さはわかった気がします。
(むやみやたらにテストコードを用意すればいいものではない、コスト的にも難しい…等
多少大変でも品質向上のために適材適所なテストコードは必要かと思っているので
とりあえず導入できるくらいのテストコードは模索したいと思います。
AI-900に向けた試験対策
はじめに
先日AI-900を受験してきました。
ぎりぎりの合格でしたが、試験対策でやったことを書いておきます。
AI-900とは
MCP試験(マイクロソフト認定プロフェッショナル試験)のひとつです。
入門編の位置づけで、AI-900は機械学習と人工知能の概念、それに関連する Microsoft Azure サービスの基礎知識が問われます。
Exam AI-900: Microsoft Azure AI Fundamentals - Learn | Microsoft Docs
事前スペック
・Cognitive Servicesの一部サービスを触ったことがある(Custom Vision,QnA Maker,Form Recognizer,Bot Framework Composer等)
・機械学習に関する知識はほぼ皆無。
試験対策にやったこと
Microsoft Learn
試験ページにあるラーニングパスを一通りやりました。
Exam AI-900: Microsoft Azure AI Fundamentals - Learn | Microsoft Docs
特に大事な部分については後述で紹介する記事を参照いただくと良いです。
私は機械学習そのものの基礎知識が欠けているので、Azure Machine Learningのモジュール内容がよくわからずMS Learnを進めることすら困難でしたが、やっておいて良かったです。
追加で下記2つのラーニングパスもやりました。
大事な部分の理解が深められた気がします。
ニーズに最適な AI サービスを選択する (AZ-900) - Learn | Microsoft Docs
責任ある AI の基本原則を特定する - Learn | Microsoft Docs
受験レポを参考にする
AI-900の受験を決めてからすぐに参考にさせていただきました。
試験で大事な部分についてわかりやすくしっかりと書かれているので、試験勉強の指標にさせていただきました。
Microsoft 資格 AI-900 / DP-100 勉強法 - Qiita
試験の直前くらいにお見掛けして、参考にさせていただきました。
Microsoft Azure AI Fundamentals (AI-900)チャレンジ_4日目~試験当日 - よしなしごとをかきつくれば
Cogbotコミュニティに参加する
機械学習については知識ゼロですが、Cognitive Servicesには興味があったので、Cogbotコミュニティに定期的に参加しています。
Cognitive Servicesに関する最新のアップデート情報が聞けるのはもちろん、それぞれのサービスの具体的な使い方なども聞けるのでそれが試験にとても役立った気がします。
勉強会の開催情報はconnpassやFacebookで発信されていますので見てみてください。
connpass
Cogbot コミュニティ - connpass
おわりに
いつも試験関係は過去問に頼りきりなのですが、今回はMS Learnだけで済んだので良かったです。
練習で作ったリソースは削除を忘れないようにしましょう!(結構高いので…
Microsoft認定プロファイルの氏名を変更する
はじめに
Microsoft認定資格試験(MCP)は受験時に本人確認書類を提示する必要があります。
本人確認書類の姓が変わった場合、試験申し込みをするアカウントの氏名も変更する必要があります。
変更方法としてはフォームを送るだけと簡単ですが、変更までにどれくらい時間がかかるのかなど気になったので書き留めておきます。
問い合わせフォームの送信
Microsoft Learningの設定プロファイルから住所などの変更はできますが、法律上の名前は変更できません。
下記の「登録名更新フォーム」に従いプロファイル名変更要求フォームを送る必要があります。
Microsoft 認定資格のヘルプ | Microsoft Docs
必須入力項目
・マイクロソフト認定プロファイルに現在表示されている名前
・試験の予約時に提示する政府発行の身分証明書に記載されている名前
下記いずれか3つ以上を入力
今回は私が記入した項目について記載します。
・マイクロソフト認定プロファイルの識別番号-MCID。(数字のみ)
MCIDはMicrosoft Learningの右上に表示されます。
・マイクロソフト認定プロファイルに関連付けられた電子メール。
Microsoft Learningの設定プロファイルで確認できます。
・ピアソンVUE試験の登録確認書に記載されているMicrosoftID(MS ID)。(数字のみ)
受験申込時にピアソンVUEから来るメールを参照しました。
・ピアソンVUE試験登録ID。(数字のみ)
受験申込時にピアソンVUEから来るメールを参照しました。
・受けた試験と完了日をリスト
ピアソンVUEの受講履歴を参照しました。
・達成した認定と完了日をリスト
ピアソンVUEの受講履歴を参照しました。
ピアソンVUEの受講履歴表示方法
[Microsoft Learningダッシュボード]>[試験プロバイダ]>[ピアソン VUE]>[Go]>[受験履歴]
フォーム入力例
フォームを送信すると、受理のメールが届きます。
変更完了後の確認
名前の更新が完了すると、氏名変更されたTranscriptが添付された変更完了メールが届きます。
私の場合はフォームを送ってから28時間後くらいに来ました。
Microsoft LearningやピアソンVUEのダッシュボードを見に行くと、名前が変わっていることが確認できました。
※補足
私は旧姓で試験を申し込み、受験日の3週間くらい前に新姓への変更手続きを行いました。
ピアソンからの予約案内メールには
「登録時に使用した氏名と、受験当日に提示する本人確認書類2点に記載されている氏名が同一である必要があります。」
とあったので、申し込み時点での名義(旧姓)が有効かと思っていましたが、当日はちゃんと新姓のほうで受付されました。
ややこしいことはするもんじゃないですね。
AADの非管理者がアプリケーションを登録できないようにする
はじめに
Azure Active Directoryで組織内の非管理者がアプリケーションを登録できないようにします。
手順
Azure Portalにサインインし、Azure Active Directoryを選択します。
[ユーザー設定]を選択します。
[アプリの登録]で、[ユーザーはアプリケーションを登録できる]を[いいえ]に切り替えます。
[保存]をクリックして変更を保存します。
保存後に非管理者のユーザーでアプリの登録をしようとすると、
[アクセス権がありません]の画面が表示され、無事登録できなくなりました。
管理者であればちゃんと登録画面が出ます。