Grow up

生活とプログラミング

『働き方の損益分岐点』を読んで働き方を見直してみた

f:id:knkomko:20200114012051j:plain:w250

はじめに

働き方を考える為に読んでみたら良いよと経営者の方に勧められた
『働き方の損益分岐点』を読み終えたので、大事だと感じた点と
私自身の今後の働き方について考えをまとめます。

書籍

人生格差はこれで決まる 働き方の損益分岐点 (講談社+α文庫)

人生格差はこれで決まる 働き方の損益分岐点 (講談社+α文庫)

資本主義経済における給料の構造

経済学的に考えると、給料の決まり方には、
①必要経費方式
②利益分け前方式(成果報酬方式)
の2種類があります。

本書の冒頭では資本主義経済における給料の構造について解説されていました。
給料はそもそも努力や成果がベースでは無く、翌日も働くために必要な
衣食住のお金を労働者に払っているという事でした。

f:id:knkomko:20191222011904j:plain:w350

働き方の選択

過去からの「積み上げ」ができる仕事(職種)を選ぶ

結論としては知識・技術の積み上げにより緩やかに成長が見込めるという事です。

「変化が速い業界」では変化に適応できないと労働力の市場価値が低下します。
本書では「変化が速い業界」の例として開発言語の変化をあげていました。
新しい開発言語を覚えなおす時には若手の人間と競争が必要になります。
それに対して建築業界や農林水産業界などの「変化が遅い業界」では積み上げた技術や知識は陳腐化しにくいため労働力の市場価値が低下しにくい仕事になります。

まとめ

本書から学んだ事は、知識・技術の「積み上げ」の重要性です。
特に変化の速い技術よりも、過去から積み上げられた知識・技術となる「理論」を学ぶ事が大切だと気づかされました。
IT業界における理論としては、アルゴリズム、セキュリティ、ネットワーク、ソフトウェア工学、コンピュータシステムなどがあげられます。
また新しい技術を学ぶ際には理論に肉付けされた技術として学ぶ事で、効率良く学習が出来るようになると考えました。
働き方を変える方法として、技術の共通部分となる「理論」を学習する事で開発の効率化を実現していきたいです。

SQL Server のインスタンスに接続する仕組みと方法

f:id:knkomko:20191214144113p:plain

はじめに

今回SQL Server に接続する機会がありました。
そこで調べたインスタンスに接続する仕組みや方法についてまとめます。

インスタンスとは

SQL Server のサービス(常駐プログラム)のことを指します。
SQL Serverインスタンスごとに複数のデータベースを保存できます。
f:id:knkomko:20191214150148g:plain:w350
第1回 SQL Serverのインストールをチェックする (2/3):SQL Serverミニマム管理Q&A - @IT

SQL Serverがインストールされた順番によってインスタンスは2種類に分けられ
それぞれ接続時の仕組みに違いがあります。

・既定インスタンス
 1 番目にインストール(作成)されたSQL Serverインスタンス

・名前付きインスタンス
 2 番目からインストール(作成)されたSQL Serverインスタンス

SQL Server 接続の仕組み

・既定インスタンス
 既定インスタンスの場合、指定された接続先(コンピュータ名 or IPアドレス)と
 TCPポート 1433 を使ってSQL Serverに接続します。
f:id:knkomko:20191215005219p:plain:w550

・名前付きインスタンス
 名前付きインスタンスの場合、SQL Server Browser サービスへ問い合わせ、
 取得した待ち受けプロトコルやポート番号を使ってSQL Serverに接続します。
f:id:knkomko:20191215005228p:plain:w550

SQL Server 接続の方法

Windows アプリケーション
SqlClientに使用する接続文字列は以下の通りです。ポート番号は省略可能です。
また既定インスタンスに接続する場合はインスタンス名の省略が可能です。
Data Source=[コンピュータ名 or IPアドレス]\\[インスタンス名],[ポート番号];Initial Catalog=[データベース名];User ID=[ユーザ名];Password=[パスワード]

SqlConnection sqlConnection = new SqlConnection("Data Source=DESKTOP-RMBKTOC\\SQLEXPRESS,1433;Initial Catalog=sampleDB;User ID=Makoto;Password=password")


SQL Server Management Studio
 SQL Server の管理ツールから接続する場合です。
 サーバ名に「コンピュータ名¥インスタンス名」と指定して接続を行います。
 既定インスタンスに接続する場合はインスタンス名の省略が可能です。
f:id:knkomko:20191214151444p:plain:w350

コマンドプロンプト
 sqlcmd を使用する場合です。
 既定インスタンスに接続する場合はインスタンス名の省略が可能です。
 Windows認証による接続

sqlcmd -S [コンピュータ名 or IPアドレス]\[インスタンス名] -E

 SQL Server認証による接続
  Enter した次にパスワードの入力を求められます。

sqlcmd -S [コンピュータ名 or IPアドレス]\[インスタンス名] -U [ユーザ名]
名前付きインスタンスの接続

名前付きインスタンスの接続では SQL Server Browser の有効化が必要です。
デフォルトでは無効となっているためサービスから有効にします。

コントロールパネル → 管理ツール → サービス から
SQL Server Broeser」のプロパティを開きます。
f:id:knkomko:20191215020414p:plain:w400

スタートアップの種類を「自動」に変更して[OK]を押します。
f:id:knkomko:20191215020227p:plain:w400

構成マネージャのSQL ServerからSQL Browser Serviceを開始します。
f:id:knkomko:20191215020756p:plain:w400

IPアドレスを用いた接続

コンピュータ名では接続が成功してもIPアドレスでは接続出来ませんでした。

C:\Users\User1>sqlcmd -S DESKTOP-RMBKTOC\SQLEXPRESS -E
1> [:]quit

C:\Users\User1>sqlcmd -S 192.168.0.15\SQLEXPRESS -E
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : SQL Server ネットワーク インターフェイス:  指定された Server/Instance の位置を特定しているときにエラーが発生しました [xFFFFFFFF]. .
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : ログイン タイムアウトが時間切れになりました.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : SQL Server への接続の確立中に、ネットワーク関連のエラーまたはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできません。インスタンス名が正しいことと、SQL Server がリモート接続を許可するように構成されていることを確認 してください。詳細については、SQL Server オンライン ブックを参照してください。.

名前付きインスタンスの接続と同様にSQL Browser Serviceを有効にする事で接続が行えるようになります。

C:\Users\User1>sqlcmd -S 192.168.0.15\SQLEXPRESS -E
1> [:]quit

C:\Users\User1>sqlcmd -S DESKTOP-RMBKTOC\SQLEXPRESS -E
1> [:]quit

C:\Users\User1>sqlcmd -S DESKTOP-RMBKTOC -E
1> [:]quit

Windows で Keytool コマンドを使う

f:id:knkomko:20191114004433p:plain:w500

はじめに

Google OAuth 設定のためにコマンドを使用したのでまとめます。
www.atmarkit.co.jp

Keytool コマンドとは

3.2.2 keytoolコマンドについて

keytoolコマンドを使用して、自己署名証明書を生成し、キーストアに証明書をインストールして管理できます。

必要なもの

Java Runtime Environment
Java SE Runtime Environment 8 - Downloads

1. 上記 Java Runtime Environment のダウンロードサイトにアクセス

 Accept Licence Agreementを選択して赤枠からダウンロードします。
f:id:knkomko:20191114011543p:plain:w450

2. Oracle アカウントのログイン

 アカウントの登録は無料なので無い場合は作成します。
 ログインするとダウンロードが出来ます。
f:id:knkomko:20191114011457p:plain:w450

3. JRE のインストール

  インストーラの案内に従ってインストールします。
f:id:knkomko:20191114013015p:plain:w150

4. keytoolコマンドの確認
keytool -exportcert -alias androiddebugkey -keystore "%USERPROFILE%\.android\debug.keystore" -list -v

f:id:knkomko:20191114013911p:plain:w550

Postman の Could not get any response を解決する方法 (.Net Core API)

はじめに

.Net Core APIにPostmanを使った確認でつまずいたので解決方法を書き残します。

現象

固定値を返すGETメソッドを作りました。
f:id:knkomko:20191001234731p:plain:w350

IIS Express で実行します。
f:id:knkomko:20191001234835p:plain:w350

APIにPostmanでGETリクエストの送信をしても応答が得られませんでした。
f:id:knkomko:20191001234100p:plain:w350

Could not get any response
There was an error connecting to .
Why this might have happened:
The server couldn't send a response:
Ensure that the backend is working properly
Self-signed SSL certificates are being blocked:
Fix this by turning off 'SSL certificate verification' in Settings > General
Proxy configured incorrectly
Ensure that proxy is configured correctly in Settings > Proxy
Request timeout:
Change request timeout in Settings > General

ブラウザからアクセスした場合には応答が確認できます。
f:id:knkomko:20191001233927p:plain:w350

解決方法

Postman の File -> Settings を左クリック。
f:id:knkomko:20191001233017p:plain:w350

General -> SSL certificate verification を OFF にします。
f:id:knkomko:20191001233118p:plain:w350

Postmanによるテストを実行して応答があることを確認します。
f:id:knkomko:20191001233545p:plain:w350

公式のチュートリアルには以下のような説明がありました。
f:id:knkomko:20191001235251p:plain:w350

Arduinoで給水ポンプを使ってみた

f:id:knkomko:20190929062019p:plain:w450

はじめに

今回は給水ポンプを使ってみました。
豆苗の水の入れ替えを自動化できそうです。

以下の記事を参考にしました。
話題の電子工作「arduino」を使って、自動水やりロボットを作ったので、その手順を解説! | ツマミグイ×Blog

配線

実際の配線図です。
f:id:knkomko:20190929060004p:plain:w350

ソースコード

5秒おきに1秒間の給水を行います。

int MoterPin = 2;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(MoterPin, OUTPUT);  
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(MoterPin,HIGH); // HIGH = 5V
  delay(10000);                // Water supply
  digitalWrite(MoterPin,LOW);  // LOW = 0V

  for(int i=0; i<5; i++)
  {   
    Serial.println(i);
    delay(1000);
  }
}

.Net Core MVC を使った初めてのWebアプリ開発 #3

f:id:knkomko:20190912123325p:plain:w450

はじめに

#2 ではコントローラーとルーティングついてまとめました。
knkomko.hatenablog.com

#3 はビューについて解説していきます。
ソースコードASP.NET Core MVC の概要 | Microsoft Docsを参考にしています。

1. ビューの追加

Viewフォルダを右クリックして[追加]から[新しいフォルダー]を左クリックします。
フォルダーの名前は「HelloWorld」で作成します。
f:id:knkomko:20190912212735p:plain:w350

Viewフォルダ内に作成した[HelloWorld]フォルダを右クリックして[追加]から[新しい項目]を左クリックします。
f:id:knkomko:20190912212837p:plain:w350

[Razor ビュー]を選択して「Index.cshtml」の名前で[追加]を左クリックします。
f:id:knkomko:20190912213415p:plain:w350

Index.cshtmlの内容を次のコードに置き換えます。

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>Hello from our View Template!</p>

f:id:knkomko:20190912213655p:plain:w350

次に HelloWorldController の Index メソッドを次にコードに書き換えます。
View() の戻り値では IActionResult を返します。

        public IActionResult Index()
        {
            return View();
        }

f:id:knkomko:20190924123438p:plain:w350

以下のURLにアクセスするとRazor ビューの Index.cshtml が表示できます。
https://localhost:44370/HelloWorld/

2. レイアウトの変更

複数のWebページに共通した要素はレイアウトファイルに記述します。
レイアウトファイルを使用すると修正による変更箇所を最小限に抑えられます。
f:id:knkomko:20190929075453p:plain:w350

Views/Shared/_Layout.cshtml を開いてレイアウトファイルの内容を変更します。

①タイトル要素とフッター要素で、MvcMovie を Movie App に変更します。
変更前
f:id:knkomko:20190929075513p:plain:w350

変更後
f:id:knkomko:20190929075529p:plain:w350

②アンカー要素を変更します。
変更前
f:id:knkomko:20190929075545p:plain:w350

変更後
f:id:knkomko:20190929075920p:plain:w350

Views/HelloWorld/Index.cshtml を開きます。
f:id:knkomko:20190929082832p:plain:w350

タイトルと表示文章の違いが分かりやすくなるように表示内容を変更します。
タイトルとh2要素の内容を変更します。
f:id:knkomko:20190929084428p:plain:w350

ポート番号は実行時の番号に変更をして頂き以下のURLにアクセスします。
https://localhost:44370/HelloWorld/

URLにアクセスすると以下のようなWebページが表示されます。
f:id:knkomko:20190924124510p:plain:w350

赤下線が Index.cshtml で変更した内容です。
青下線が _Layout.cshtml で変更した内容になります。
f:id:knkomko:20190929084442p:plain:w350

Views/Shared/_Layout.cshtml はViews/_ViewStart.cshtml によって各ビューに共通要素を表示します。
Layout プロパティを変更することで別のレイアウトの指定や、null を設定することでレイアウトを使用しないようにできます。
f:id:knkomko:20190929090844p:plain:w350

3. コントローラーからビューへデータの受け渡し

#2 ではコントローラーだけを使用してURLに入力したパラメータ情報を表示させていました。
f:id:knkomko:20190911234944p:plain:w450


今回はURLで入力したパラメータ情報をビューに渡して表示します。
Controllers/HelloWorldController.cs のIndexアクションメソッドを変更します。
f:id:knkomko:20190929092406p:plain:w350

ビューへデータを渡すには ViewData オブジェクトを使用します。
"Message"や"NumTimes"はViewDataの変数になります。
f:id:knkomko:20190929092425p:plain:w350

ビューでは"Message"と"NumTimes"の変数をViewDataに指定することでコントローラーで割り当てられたデータを受け取ることができます。
Views/HelloWorld/Welcome.cshtml でコントローラーから渡された値を表示するようにします。

Welcomeビューを作成します。
Viewsフォルダを右クリック → [追加] → [新しい項目] の順で左クリック。
f:id:knkomko:20190929102338p:plain:w350

[Razor ビュー]を選択して名前を「Welcome.cshtml」として[追加]を左クリック。
f:id:knkomko:20190929102508p:plain:w350

Welcome.cshml の内容を以下のコードに置き換えます。
(int)ViewData["NumTimes"]と@ViewData["Message"]にはコントローラーから渡された値が割り当てられます。
@で始まるコードはHTMLヘルパーと呼ばれています。
HTMLヘルパーを使うとhtmlの作成にC#のオブジェクトやfor文などの処理を使うことができます。

@{
    ViewData["Title"] = "Welcome";
}

<h2>Welcome</h2>

<ul>
    @for (int i = 0; i < (int)ViewData["NumTimes"]; i++)
    {
        <li>@ViewData["Message"]</li>
    }
</ul>

f:id:knkomko:20190929102702p:plain:w350

以下のURLにアクセスします。
https://localhost:44370/HelloWorld/Welcome?name=Makoto&numtimes=4

URLで「name」に指定している文字列が「numtimes」で指定した数だけ表示されます。
f:id:knkomko:20190929102926p:plain:w350

URLにアクセスした時の動作は図のような動作です。
①URLから指定したnameとnumTimesのパラメータをWelcome(name, numTimes)の引数として渡します。
②Welcomeメソッドは引数で渡されたnameとnumTimesの値をViewData["Message"]とViewData["NumTimes"]に格納します。
③ビューは渡されたViewDataの値をHTMLヘルパーを使って作成するhtmlに埋め込みます。
④最後にコントローラがビューで作成されたhtmlをブラウザに返して一連の処理が終了します。
f:id:knkomko:20190930221044p:plain:w550

まとめ

#3ではコントローラーからビューを呼び出しました。
#4ではモデルを使います。

Arduinoで防水温度センサを使ってみた

f:id:knkomko:20190929020234p:plain:w450

はじめに

豆苗の成長を促すために水温管理を考え、防水温度センサを使ってみました。

豆苗の栽培にぴったりの温度は15〜25℃
引用 : 日々是豆苗 | 村上農園豆苗研究会活動レポート

以下の記事を参考に物品の購入や配線を行いました。
DS18B20(1-Wire)で温度計測 | Make.

防水温度センサ

www.amazon.co.jp

配線

実際の配線図
f:id:knkomko:20190929025447p:plain:w350

私はスターターキットに入っていた金属皮膜抵抗(Resistor)を使用しました。

赤枠部分が金属皮膜抵抗(Rsistor)になります。
f:id:knkomko:20190929041234j:plain:w350

ライブラリの追加

1. OneWire
github.com

2. DallasTemperature
github.com

ソースコード
#include <OneWire.h>
#include <DallasTemperature.h>
  
#define ONE_WIRE_BUS  2 // DATA
#define SENSER_BIT    9 // 温度読み取り精度

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  sensors.setResolution(SENSER_BIT);
}

void loop() {
  // put your main code here, to run repeatedly:
  sensors.requestTemperatures();              // 温度取得要求
  float f = sensors.getTempCByIndex(0);
  Serial.println(String(f));
  delay(1000);
}