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

1日1つ。良くなる!上手くなる!

休めるなら休むべきと考えるようになったこと

法律の影響もあり、会社として残業についてうるさくなってきました。

正直、私自身は定時に帰るということに抵抗がありました。

というのも私が、定時に帰る時は、大体、やる気がない時だったからです。

自分がそうであると、他人が定時で帰るのもそう目に映ってしまうものです。

環境も変わったことで、次第に考え方を変えるようにしました。

きっかけとなるのは以下の記事です。

toyokeizai.net

島根県の中部に位置する邑南町(おおなんちょう)ではB級ではなく、A級グルメで勝負をかけるようになりました。

安い固定費を活かし、付加価値の高い仕事で集客する。

そして、休める時は休んで、次に備えてインスピレーションを養うというものです。

情熱プログラマーにあるように定時で燃焼しきられるようにスピーディーな判断と仕事を心がけるようにしました。

思い切って休んで、勉強会に参加したり、勉強をして先行投資していくという訳です。

日曜日にコワーキングスペースに出勤する人もいますが、それが出来るには平日の過ごし方も重要でしょう。

おまけ

現場は早く帰ることを望んでいるのか、と思うことがあります。

2週間で終わると言った仕事を3日で終わると言ったら、なぜか叱られたことがあります。

type.jp

私は上記の記事のような考え方です。

技術的なことは、3日で終わることもあるが、10日でも終わらないことがあります。

つまづくと、その問題を解消するだけで3日も5日でもかかることがあります。

この一件もゴタゴタしたなぁ・・・。

この業界に最初に入った時、帰れるからといって帰れないという話を先輩に聞いていました。

早く帰っていると、こいつは暇だ、仕事をしていないと思われるからです。なので退社のチキンレースをするというものです。

早く帰れと言われるので早く帰っていたら、後になって、あいつは何で他の人と比べて残業が少ないんだ、と追求されたことが私はあります。

どうしろっていうの、と。

で、私は辞めていったのか。

残業時間を短くするのではなく、組織の根本的な問題を解消しない限り、ダメということです。

愚痴っても仕方ないので振り返ると、何もしなくても仕事は増えていきます。

  • 積極的に仕事を減らすこと
  • 高い勤労意欲で仕事ができるようにする

を心がけていきたいですね。

Mac端末(iPhone/iPad/Macbook)で開いているURLを別のMac端末に共有する場合

自分のMac端末で開いているURLを別の端末へ共有するには、どうするのでしょうか。

私はEvernoteなどの類にコピペして共有していたのですが、AirDropを使えば出来ます。

標準機能なので簡単です。

画面上の送るボタンをタップします。

f:id:rimever:20190804221631j:plain
送るボタン

AirDrop〜が表示されますが、少し待ちます。

すると、周囲の端末が表示されます。

あとはタップすれば、該当の端末にURLを共有できます。

参考サイト

enjoy.sso.biglobe.ne.jp

自分のブログ記事のプログラミング言語で円グラフを作成して考える円グラフ

円グラフは使い所に注意が必要なグラフとされています。

円グラフを安易に使ってはいけない理由を実例を交えて説明します

見た目はよいが、数字の違いが伝わりにくいというものです。

だが、「この項目が全体を大きく占めているんだ!」ということを伝える点では視覚的効果はあるなと仕事で分析していても感じます。

f:id:rimever:20190803124641p:plain
自分のブログ記事のプログラミング言語別円グラフ

私の2019/8/3までのブログ記事のカテゴリをプログラミング言語のみを抽出して可視化したものです。

C#が半分以上を占め、Pythonがその次というのが伝わって来ます。JavaやGoは一切ありませんね。

f:id:rimever:20190803125837p:plain
棒グラフにしてみると、項目の差は伝わるけど

これは棒グラフにした場合を見てもらうと、C#Pythonが圧倒的に多いのはわかっても全体に対してはわかりにくいかなと思います。

要は使い分けですね。

おまけ

プログラミング言語別のグラフを作ってみましたがプログラミング言語のカテゴリー関係なく、全てのブログ記事を含めて円グラフにすると以下のようになりました。

その他が半分以上となっており、技術ブログじゃなかったのか、と反省。

f:id:rimever:20190803125042p:plain
プログラミング言語関係なく、全体とすると

円グラフのpythonのコード

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

plt.style.use('default')
sns.set()
sns.set_style('whitegrid')
sns.set_palette('Set2')

x = ['C#','Python','JavaScript','C++','F#','Ruby']
y = np.array([63,43,5,5,2,1])

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.pie(y, labels=x, autopct="%1.1f%%")
plt.gca().add_artist(plt.Circle((0, 0), 0.65, color='white'))
plt.axis('equal')

plt.show()

参考記事

stats.biopapyrus.jp

C++のメンバ初期化子リスト

Effective C++ 第3版を読んでいたのですが、なかなか味わいのある本です。オススメです。

www.maruzen-publishing.co.jp

ただ、C++に語っているだけではなく、プログラミングについて考えさせられる内容になっています。

一度でもC++を齧ったことのある方には是非オススメしたい本です。

この本を読んでいて、こんなことができたのかーと知ったのが初期化リストです。

例えば以下のソース。

#include <iostream>

class test {
private:
    int a;
    int b;
public:
    void message() {
        std::cout << "a = " << a << ", b = " << b << std::endl;
    }

    test() {
        a = 1;
        b = 2;
    }
};


int main() {
    test* t = new test();
    t->message();
    return 0;
}

のうちの

    test() {
        a = 0;
        b = 0;
    }

のお話です。

C++にはC++11以降では、初期化リストというのがあり、これを用いて初期化するのが望ましいそうです。

#include <iostream>

class test {
private:
    int a;
    int b;
public:
    void message() {
        std::cout << "a = " << a << ", b = " << b << std::endl;
    }

    test() {
        a = int(1);
        b = int(2);
    }
};


int main() {
    test* t = new test();
    t->message();
    return 0;
}

それだけでなく、こんな記法もできるようです。

#include <iostream>

class test {
private:
    int a;
    int b;
public:
    void message() {
        std::cout << "a = " << a << ", b = " << b << std::endl;
    }

    test():a(4),b(5) {
    }
};


int main() {
    test* t = new test();
    t->message();
    return 0;
}

f:id:rimever:20190721220433p:plain

へー。

参考サイト

vivi.dyndns.org

marycore.jp

基底クラスのループ処理の中で、特定のクラスでのメソッドを呼ぶ時の実装

リファクタリングの頭の体操のような話です。

基底クラスのループ処理の中で、特定のクラスでのメソッドを呼ぶ時の実装について、思ったのでメモ。

以下のコードは、

  • 抽象クラスのSpriteを用意
  • HumanとMagicianはSpriteクラスを継承して、実装
  • Magicianの時だけは魔法使いなので、Magicメソッドを実装
  • Human,Human,Magicianという配列をループさせて、その中で、Magicianの時にだけMagicメソッドを呼び出したい

といったコードです。

using System;
                    
public class Program
{
    public abstract class Sprite {
        public void Act() {
        }
    }
    
    public class Human:Sprite {
    }
    
    public class Magician:Sprite {
        public void Magic() {
            Console.WriteLine("Fire!");
        }
    }
    
    public static void Main()
    {
        var party = new Sprite[] {
            new Human(),
            new Human(),
            new Magician()
        };
        foreach (var sprite in party) {
                         sprite.Act();
            if (sprite is Magician magician) {
                magician.Magic();
            }
        }       
    }
}

ゲームだと、このようなコードを私を書くことが多かったです。

ただ、こういう時は

using System;
                    
public class Program
{
    public abstract class Sprite {
        public void Act() {
        }
    }
    
    public class Human:Sprite {
    }
    
    public class Magician:Sprite {
        // privateに出来る!!!
        private void Magic() {
            Console.WriteLine("Fire!");
        }
        public static void Magic(Sprite sprite) {
            if (sprite is Magician magician) {
                magician.Magic();
            }
        }
    }   
    
    public static void Main()
    {
        var party = new Sprite[] {
            new Human(),
            new Human(),
            new Magician()
        };
        foreach (var sprite in party) {
                         sprite.Act();
            Magician.Magic(sprite);
        }       
    }
}

と、Magicのクラスメソッドはprivateにして静的メソッドで呼べた方がいいですね。

もっと複雑になったら、基底クラスに新たなメソッドを作るとか、delegateを経由して呼び出されるようにするとか、考えることになるでしょう。d

どこまで頑張るかはケースバイケースですね。

WPFでRadioButtonの項目をComboBoxにする

WPFになると、コンポーネントを組み合わせて、少し凝ったコンポーネントを作ってみたくなるものです。

RadioButtonの項目にComboBoxにしたいなと思いました。

f:id:rimever:20190718211705p:plain

出来るかなーと思ったのですが、ComboboxでRadioButton.Contentタグで囲めばできます。

stackoverflow.com

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <RadioButton Content="Big" Width="100"/>
            <RadioButton Content="Small" Width="100"/>
            <RadioButton>
                <RadioButton.Content>
                    <ComboBox  Width="100" Text="100" IsEditable="True"></ComboBox>
                </RadioButton.Content>
            </RadioButton>
        </StackPanel>
    </Grid>
</Window>

Let's Noteを使ってみて

初めてPanasonicのLet's Noteを使うことになったので、使ってみた感想を述べようと思います。

panasonic.jp

Let's Noteは自分にとって近いようで遠い、遠いようで近い存在でした。

職場で使っている人がいたのですが、私に割り当てられたのはLenovoということが何度かありました。

職場の人たちはLenovoよりPanasonicの方がよかったと言っていました。

LenovoのPCに変えればいいのに、ボロボロになってまでPanasonicのLet's Noteを使い続ける人もいました。

軽さ

Let's Noteの特徴としては、あのゴツい見た目に似合わない軽さです。

大きさはLenovoの方が薄くてもLet's Noteの方が軽い。

やはり軽いです。

マグネシウム合金を凹凸形状で設計した衝撃に強いボンネット構造の天板で、このゴツい見た目は衝撃を吸収するためにあります。

また、Lenovoはキーがチャチで壊れやすいですが、Let's Noteはその心配もなさそうです。

電源

電源を入れるときは電源スイッチをスライドさせて電源を入れます。

私が割り当てられたのは以前に他の人が使っていたPCなのですが、これが惜しいです。

たまに電源が入らないことがしばしばあります。

www.pcdock24.com

自分なりにクリーニングしてみたのですがイマイチでした。

ホイール

Let's Noteの特徴のもう一つがホイール式のタッチパッドでしょう。

機能を有効にすることで丸いタッチパッドをくるくる回すころでホイールスクロールを行うことができます。

askpc.panasonic.co.jp

やっぱり、なんとなく、これは使いたいですよね。

まとめ

出張が多い人だとLet's Noteはありがたいかもしれませんが、あまり持ち運びしないので、Let's Noteの恩恵は受けていないです。

個人的にはSurfaceを使ってみたいと心の中で思いつつ仕事しています。

とはいえ、8GBメモリで256GBの容量。開発機としてこれが十分満たしてしまうのでいつになるやら。