より良いエンジニアを目指して

記事を頻繁に書き直す性格なのでごめんなさい。

デスクトップアプリケーションでGoogleAnalyticsしたいんだけど。

デスクトップアプリケーションでGoogleAnalyticsを活用するにはどうするかを調べてました。

Microsoftが用意しているようです。

www.publickey1.jp

github.com

ですが、UWPがターゲットのようです。

WPFでは? となると以下のリポジトリが見つかりました。

github.com

試す

garlicのサンプルコードを動かしてみることにしました。

まず、肝心のGoogle Analyticsのアカウントを作成します。

webtan.impress.co.jp

f:id:rimever:20191204193141p:plain
ウェブを選択します。

あとはトラッキングIDとドメインをサンプルコードを書き換えます。

namespace Garlic.Sample.WPF
{
   public class AppBootstrapper : Bootstrapper<IShell>
   {
      private const string Domain = "YOUR DOMAIN HERE";
      private const string GACode = "YOUR CODE HERE";

デバッグ実行します。

f:id:rimever:20191204194317p:plain

f:id:rimever:20191204194524p:plain
右側のアクティブなページが開いているタブと同じ

こんな感じなんですね。

おまけ

DeskMetricsという製品もあります。

jp.techcrunch.com

Macで.NET CoreインストールするならHomebrew

いつの間にかHomebrewに.NET Coreが追加されていたようです。

formulae.brew.sh

brew cask install dotnet-sdk

cask指定が必要なようです。

f:id:rimever:20191204191455p:plain
インストール成功

最初、おかしな状態でインストールしてしまったらしく、再インストールしても失敗でした。

そこで、一度アンインストール してから、インストールしたら成功しました。

普通にパッケージをダウンロードしてインストールしようとすると、「悪質なソフトウェアかどうかをAppleでは確認できないため、このソフトウェアは開けません。このソフトウェアはアップデートが必要です。詳しくは開発元にお問い合わせ下さい。」と出てしまうので、Homebrewでインストールが良いと思います。(Control押しながら開けばダウンロード出来ます)

参考サイト

www.shibuya24.info

キャッシュレス社会について思うこと

お金が足りません! お金が足りません!

年配の方だとお金が足りませんと何度も言っても理解してもらえず、スーパーの店員さんが困っている。

耳が遠いのか、本人は正しいと自分を信じて疑わないのか、おかげでレジで並んでいる私は待ちぼうけということがありました。

こういうシーンを見るとキャッシュレスになると良いのかなと思います。

最近ではキャッシュレスが盛んです。

キャッシュレスだったら還元というブームですね。

キャッシュレスについて思うことを。

キャッシュレスのメリット

店側としても現金管理の手間が省けます。

とある芸能人はお釣りが数えられないからクビになったというエピソードを披露してましたが、そういうことも減るとは思います。

店でバイトをしたことのある知り合いから聞いた話だと、アルバイトが店の金を持ち出すというトラブルも発生したことがあるようです。

そういった意味では店が還元してもキャッシュレスを進める価値はありますね。

キャッシュレスのデメリット

キャッシュレスで怖いのは、意図しない取引が発生することでしょう。

悪い人々は、これを格好のカモとして狙っています。

Paypayでもトラブルがあったように、一般人じゃ思いつかない悪い方法でお金を巻き上げることが発生するリスクです。ようは犯罪です。

その矢先、7Payでの事件が起きました。

セキュリティはイタチごっこですので、トラブルはこれだけでは終わらないと思います。

スキミングやクレジットカードの債務破綻者といったことと同様のことが起きそうです。

私のキャッシュレス生活

私としては現金主義者だったためか、SuicaWAONくらいしか使ってません。

基本はSuicaで行きたいところですが、買い物をするスーパーがWAONが使えるイオンやダイエーなのでWAONは持ってます。

WAONはタッチの反応が悪いので、微妙な間が発生します。

私が言うまでも無く、キャッシュレスで使えるカードが多すぎます。

コンビニなどで買い物をするときに使えるカードの一覧が見えますが、瞬時に自分の使えるカードがどれだか判断つきませんね。

WAONが使えるんじゃないか?と思ったら似て非なる水色のカードだったりします。

お金を使わせて内需刺激とも言えるでしょうか。国としてはキャッシュレスが盛り上がって計算通りかもしれませんね。

とはいえ、私が学生だった時点でフィンランドでは自販機での支払いを携帯で出来るとか聞いてたんですけどね。

小銭を扱う手間が減るのは間違いなくメリットです。特に50円。真ん中に穴が空いているとはいえ色が100円と一緒です。

100円と思って取ったら50円でガッカリすることがあります。そのため、私は50円をなるべく避けるようにしていました。

70円の買い物だったら120円支払う、50円が財布にあればなるべく積極的に使う、など。

そんなことは考えなくて良いようになります。

逆に小銭をあまり使わなくなるので、いざ現金を使うときにお札のみの支払いになって、小銭だらけになりますが。

結論として、キャッシュレス生活は便利ですがお金の使い方が荒くなります。

WPFのボタン処理であるICommand.Executeで非同期処理を使えるようにする。

RelayCommandのExecuteメソッドって非同期処理使えないの?と。

HttpClientを使うことになれば自然とExecuteメソッドをasync修飾子を指定したくなります。

Task.Runで包むという手はあるのですが、それも微妙だなあと思っていると以下の記事が見つかりました。

blogs.msdn.microsoft.com

自分でRelayCommandAsyncというクラスを定義して使うことになります。

以下のような形になります。

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace WpfApp1
{
    public class MainWindowViewModel
    {
        public ICommand ClickCommand { get; set; }


        public MainWindowViewModel()
        {
            ClickCommand = new RelayCommandAsync<object>(async o =>
            {
                HttpClient httpClient = new HttpClient();
                HttpResponseMessage response = await httpClient.GetAsync("http://www.contoso.com/");
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                MessageBox.Show(responseBody.Substring(0, 100));
            });
        }
    }
    public class RelayCommandAsync<T> : ICommand
    {
        private readonly Func<T, Task> _executedMethod;
        private readonly Func<T, bool> _canExecuteMethod;
 
        public event EventHandler CanExecuteChanged;
        public RelayCommandAsync(Func<T, Task> execute) : this(execute, null) { }
 
        public RelayCommandAsync(Func<T, Task> execute, Func<T, bool> canExecute)
        {
            _executedMethod = execute ?? throw new ArgumentNullException("execute");
            _canExecuteMethod = canExecute;
        }
 
        public bool CanExecute(object parameter) => _canExecuteMethod == null || _canExecuteMethod((T)parameter);
        public async void Execute(object parameter) => await _executedMethod((T)parameter);
        public void OnCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }
}

参考記事

docs.microsoft.com

コードを書いてBasic認証について学ぶ

Web上で使われているHTTPの認証方式として、Basic認証があります。

あまりよく理解していないので、Basic認証について学んでみることにしました。

ja.wikipedia.org

developer.mozilla.org

Basic認証は、

  1. ユーザー名とパスワードをコロンで繋ぐ(user:password)
  2. Base64変換
  3. Authorizationヘッダーに付与
  4. 指定のページへリクエス

Pythonで、GitHub APIに対してBasic認証をしてみます。 developer.github.com

# HTTP通信を行うための標準ライブラリ
import urllib.request

# Base64を扱うための標準ライブラリ
import base64

# 送信先のURL
user = "user";
password = "password"; # GitHub APIの場合、パスワードでは無く、PersonalAccessToken
url = "https://api.github.com/user";
basic_user_and_password = base64.b64encode('{}:{}'.format(user, password).encode('utf-8'))

# Basic認証付きの、GETリクエストを作成する.
request = urllib.request.Request(url, 
    headers={"Authorization": "Basic " + basic_user_and_password.decode('utf-8')})

# 送信して、レスポンスを受け取る.
with urllib.request.urlopen(request) as res:
    data = res.read()

data

Base64は可逆性があるため、このリクエストが他人が覗いてしまえば

  1. Authorizationヘッダーを取得
  2. Base64文字列を戻す
  3. ユーザー名とパスワードが取得

あっさりバレます。

上記のようなコードが書ける・理解が出来るレベルであれば、簡単に解読可能という訳です。

検閲などに対抗すべく、httpでは無くセキュアな通信を担保するhttpsが主流になりつつあります。

ja.wikipedia.org

それだけに現在はhttpssがついていないサイトは安全ではないと警告される訳ですね。

f:id:rimever:20191124203735p:plain
東京都のサイト。保護されていない通信って、やばいじゃん!

参考サイト

www.yoheim.net

気になること

C# で、以下のようなコードを書いたのですが、Forbiddenになってしまったので、調査中・・・。

        private static async Task<HttpResponseMessage> RequestWithBasicAuthentication(string url, string userName, string password)
        {
            var request = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri(url)
            };

            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
                "Basic",
                Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")));

            using (var httpClient = new HttpClient())
            {
                return  await httpClient.SendAsync(request);
            }
        }

XAML IslandsでWPFアプリケーションの最新化

MSDNの以下のサイトでは、XAML Islandsと.NET Core 3.0を使って.NET Frameworkで開発されたWPFアプリケーションの最適化を試すことが出来ます。

docs.microsoft.com

XAML Isldandsのコンポーネントに触れておくにはうってつけのドキュメントです。

下記に保証される最新バージョンの記載があります。

docs.microsoft.com

f:id:rimever:20190707223446p:plain

f:id:rimever:20190708064803p:plain

こんなコンポーネント、あるんだ!という驚きが待ってます。

もし、つまづいたら

パートごとにフォルダが分けられています。

f:id:rimever:20190708064824p:plain

パート1ならExercise1。パート2ならExercise2。といった具合です。

トラブルシューティング

Contoso.Expenses.Core.csproj : error : The project file cannot be opened by the project system, because it is missing some critical imports or the referenced SDK cannot

タイムラインってどう開くの?

タスクバーより「タスクビューを開く」というボタンを使います。二つの小さい四角がくっついたアイコンです。

f:id:rimever:20191124164510p:plain

https://www.pasoble.jp/windows/10/time-line.html

居酒屋で職場の愚痴を言い合うことは自分にとって転職の始まり

私は、一人で飲みに行くほどお酒が好きなのですが、たまには会社の仲間とも飲みに行きます。

流石に居酒屋でプログラミングの混みいった難しい話はしません。

となると会社の仲間で飲むと、失敗談とか会社の愚痴なども出ます。

この愚痴が転職への引き金になってくる気がします。

直近の転職もそうですし、その前の転職もそうでした。

酒も入っているので、ペラペラと喋って、その場は盛り上がります。

ただ振り返ってみれば嫌悪感が残ります。

  1. 飲みに行ってもどうせ会社の不満を言うんだろうなと考えるようになる。
  2. 飲みに行くのも嫌になる。会社の仲間と会話するのも嫌になる。
  3. 会社の不満を言ったところで結論は出ず、転職になる。

なんかこの悪循環よくないなと。

毎回このパターンで転職を繰り返していたら、よくないような気がしてきました。

対策としては

  • 職場の仲間と飲みに行くのをやめる
  • 職場の仲間と飲みに行っても仕事の話はしないようにする
  • 愚痴など言っていないで根本的な問題を解決する

飲みに行くのはやめることは出来なくもないですが、コミュニケーションの場ですし、逆にやめる直前の私は、職場の仲間とコミュニケーションをなるべく取らずひっそり辞めていくつもりでしたが、それはそれで孤独で辛くもありました。

仕事の話はしないようにするには、仕事以外の話をする必要があり、そうするだけ私が会話の引き出しがあればいいのですが、そうではありません。

私はつまらない男ですし。

根本的な問題を解決するのが望ましいです。正しいです。

が、上層部が決めたことまでひっくり返せることが出来たり、ダメな若手がすぐにスーパーエンジニアになったら(私もなりたい)、苦労しない気がしません。

調べて見ました

飲み屋での「仕事の愚痴」は実は危険行為だ | 若手社員のための「社会人入門」 | 東洋経済オンライン | 経済ニュースの新基準

キンコン西野「居酒屋で愚痴を言うぐらいなら会社を辞めろ」

情報漏洩からの刑事罰に繋がるとか、だったら辞めろよという痛烈な記事がヒットしてしまいました。

給料は迷惑料とか我慢料という言葉もあります。自分には我慢が足りないのかな。

何かあっても不満を述べる方ですから。

brweb.jp

物は言いようで辞める人は辞めるんでしょう。