modest violet

modest violet

開発者としてのあれこれや、日々の雑記など

your future hasn't written yet. no one's has.
by Emmett Lathrop "Doc" Brown

Windows11非推奨のSurface Pro5にWindows11をインストールしてみました

古いPCにはインストールできないWindows11

2021年10月5日にWindows11が正式リリースされました。

Windows11

前情報から言われていた通りTPM2.0*1に対応していないCPUのPCにはインストールが出来ません。
自分のパソコンが対応しているかどうかは、Microsoftが公式に提供しているチェックツールで判定する事が出来ます。

Windows 11 インストール アシスタント

www.microsoft.com

半数以上のSurfaceもインストールできない

MicrosoftSurfaceですらWindows11がインストールできない端末が多数です。対象となるのはSurface Pro6以降との事で、Surface Pro5を使っている自分はアップデート出来ませんでした。インストールアシスタントが無情にもその旨を告げます。何なんでしょうか。新しいSurfaceを買えと言うことなのでしょうか・・・。 Windows11のインストールアシスタントで対象外と告げられる

非推奨のPCにインストールする場合は『自己責任』

当初は沈黙を貫いていたMicrosoftですが、公式が非推奨のPCにWindows11をインストールする方法を公開しました。但しあくまでもWindows11はTPM2.0が推奨環境である為、無理矢理アップデートを行った事による動作不具合はサポート対象外と謳っています。
方法はレジストリエディターの値を変更するのみで行えますが、レジストリを変更する事になるので自己責任で行ってください。 不安な方は直前にバックアップを取るなどの措置を忘れずに。

一旦Windows11のインストールを試みる

以下のレジストリパスの値を変更します。

HKEY_LOCAL_MACHINE¥SYSTEM¥Setup¥MoSetup

MoSetupという項目が最初は無いようです。現に私の環境もありませんでした。これは1度Windows11のインストールを試みると良いようです。

www.microsoft.com

Windows11のISOをダウンロードし、インストールを試みてください。おそらく途中で要件を満たさないとエラーで止まります。エラーになっても気にせず次の手順へ移ってください。

レジストリエディターを設定する

スタート⇒regeditと入力⇒レジストリエディター
HKEY_LOCAL_MACHINE¥SYSTEM¥Setup¥MoSetup

REG_DWORDキーを作成し、名前を「AllowUpgradesWithUnsupportedTPMOrCPU」とします。もし既にあれば、それをそのまま使用してください。ダブルクリックし、値を「1」に変更します。

Windows11をインストールする

準備は完了したので、先ほどダウンロードしたWindows11のISOファイルからインストールを開始します。要件を満たさずにエラーとなった箇所が通るようになっていればOKです。

ご丁寧な事に非推奨である旨を再度確認されます。好き好んで非推奨の道を選んでいる訳ではないので、哀しい顔をしながら「承諾する」のボタンを押します。

これでWindows11のインストールが開始されます。数十分程度かかりますので気長に待ちましょう。

さいごに

無事に非推奨のSurface Pro5にWindows11をインストールする事が出来ました。この記事もWindows11のアップデートしたSurface Pro5から書いているのですが、今の所大きな問題はありません。正直なところ、Windows11は綺麗なのですが、細やかな設定が出来なくなっている箇所が多くて、賛否が分かれそうだなあと感じました。
Windows11にアップデートしても10日以内であれば、簡単にWindows10に戻せるそうなので気になる方は1度挑戦してみてはいかがでしょうか?

*1:TPM(Trusted Platform Module)とは、PCなどの端末で様々なセキュリティ機能を提供するためのモジュール

新しいiPhone SEはホームボタンの"終わりの始まり"

いよいよ待ちに待ったiPhone SEが発売されました。

www.apple.com

慣れ親しんだデザインに最新のiPhone11並の機能。そして低価格となると、「待っていたよ!」という声も多いことでしょう。
ですが、個人的には「ホームボタン式iPhoneの終わりが始まった」と受け取りました。

iPhone SEとは

第1世代となるiPhone SEは、iPhone6以降の丸みを帯びたデザインや大きくなったディスプレイではなく、iPhone5をベースとした4インチで小さく角張ったデザインでした。
年々大きくなるデバイスに対して、小さい方を好む方々は大勢おられます。ナンバリングを更新する際に消えゆくiPhone5系のデザインを残したのが、第一世代となるiPhone SEでした。
ですので、今回の第2世代iPhone SEを見て落胆された型も多いと思っています。

終わりの始まり

Appleは過去の製品をみても、ある日突然今までのデザインをガラッと変更し、一新する傾向が強いです。
例えばiMacも初代と今では全く別物です。iPod nanoも長くなったり小さくなったり、長方形だったり正方形になったり・・・とその時その時で別の形状になっていました。
そして最終的には消えていきます。
iPhone SEとはすなわち、過去の形状に一定期間の猶予を与えると捉えています。すなわち、ホームボタン式のiPhoneはこれでおしまい!と暗に言っている訳です。

返り咲きはあるのか

このまま消えゆくかと思っていたmacbook Airが奇跡の復活を遂げた辺りをみると、可能性が全くない訳ではないと思います。
ただ、iPhoneはどんどんカメラ機能が強化され全面のノッチが小さくなっていくと予想されています。
初代から絶えずあったホームボタンのデザインが完全に消えてしまうのは寂しいので、iPhone SEはなんとか残ってくれれば・・・と切に願います。

初心者プログラマーが意識するだけで格段に成長するたった1つのコト

最終更新日:2023/11/23

私は仕事柄、色々な人が書いたプログラムを読む機会が多くあります。その中でベテランが書いたプログラムと初心者が書いたプログラムで大きく異なる点があると常々感じています。 多種多様なプログラムが存在しますが、皆さんは命名規則を気にしていますか?
ベテランプログラマーと初心者プログラマーのコードを比べると顕著に違いが見受けられます。 「何だよ、命名規則かよ」と思った人、「何それ美味しいの」と思った人。伸びしろがまだまだあるので、是非1分程度でさらっと読んでいってください。思っている以上に効果は絶大です。

命名規則の必要性

命名規則が大事」というのが分かるけれど、「どう書けばいいのか分からない!」というプログラマーさんが多いと思います。
まず始めに述べると、命名規則に正解はないです。 おいおい、ちょっと待てよと。大事と言っておきながら正解はないとか、どうすればいいんですか?となりますよね。分かります。 もちろん一定のルールは存在します。企業が定めているコーディングルールであったり、言語ごとにお作法となっているルールであったり。

少し乱暴かもしれませんが、ベテランでも命名規則は悩みます。というか悩まなければいけないのです。 「えっ?でもベテランさんはサクサクっと名前を付けているように見えるけど??」という意見も多いと思います。それは、単にベテランさんには命名規則のパターンが染みついているからです。全く新しい概念のクラスとか出てきたとき、どういう名前がいいのかベテランさんも考えます。

さて本題です。何故、命名規則が必要なのか。
それは人がプログラムを作るからです。コンパイラアセンブリ命名規則なんて関係ありません。人がコードを読むために命名規則が必要なのです。
そして、可読性を良くする為に「こういう風に書きましょう」という規則を設けているに過ぎないのです。
ですので命名規則なく適当な名前でもプログラムは動きます。ですが、それは独りよがりの汚いコードです。それは数ヶ月、数年後に自分でも読めないコードに陥る可能性が非常に高いです。

未来の自分でもキチンと読めて、他の人にも読みやすいコードを、美しいコードと呼びます。
そんな美しいコードを意識する最初の一歩が、命名規則です。

よくある命名規則の例

良くない例(初心者が避けるべきもの)

意味のない略語や単語の省略

   # 悪い例
   def calc(a, b):
       return a + b

意味のある変数名や関数名を使用することが重要です。

単一文字の変数

   # 悪い例
   x = 5

変数名が何を表しているのかわからないため、避けるべきです。

意味が重複する変数名

   # 悪い例
   user_name_str = "John Doe"
   user_name = "Jane Doe"

変数名には一貫性が重要です。冗長な情報を含めないように注意してください。

良い命名規則の例

意味が明確で簡潔な変数名

   # 良い例
   total_score = calculate_sum(scores)

変数や関数の名前には意味が明確で、かつ簡潔なものを選びましょう。

キャメルケースやスネークケースの統一

   # 良い例 (キャメルケース)
   calculateTotalScore()

   # 良い例 (スネークケース)
   calculate_total_score()

プロジェクト内で一貫性を保つために、キャメルケースやスネークケースなどの規則を統一しましょう。

関数やメソッドの目的を示す名前

   # 良い例
   def calculate_average(scores):
       # 各科目の得点を合計して返す
       return sum(scores)

関数やメソッドの名前は、その目的を明確に示すようにしましょう。

定数の大文字と単語の区切り

   # 良い例
   MAX_RETRY_COUNT = 3

定数は通常大文字で表記し、単語の区切りにはアンダースコアを使用します。

コメントを活用

   # 良い例
   def calculate_total_score(scores):
       # 各科目の得点を合計して返す
       return sum(scores)

上記例は簡単なのでコメントは要らないと判断できます(あくまでも例なので)。コードの理解が難しい場合や、意図が明確でない場合にはコメントを追加して説明しましょう。

悩みすぎは厳禁

命名規則が大事!という事により、何十分も悩み続ける人をたまに見かけます。はっきり言ってそれは無駄です。
クラスやメソッドの名前を付けるときに、数分かかっても悩む場合はそのクラスまたはメソッドの動きを把握できていないか、用途を理解出来ていないと判断できます。
そういう場合は、仮の名前を定めてTODOを残し、動きや用途を理解出来た段階でリファクタリングしましょう。

意外に、自分が書いたコードを説明できないという駆け出しプログラマーさんは多いです。
命名もしかりで、「何故この名前にしたの?」と尋ねてもはっきりした答えがない場合が多いです。
適切な名前を付けるには、対象となるコードを理解する。または、関連する動きの中での役割を理解する事が大事です。

大体3分悩んでもぴったりくる名前がつけられなかった場合は、後回しにするべきでしょう。

終わりに

たかが命名規則、されど命名規則。 転ばぬ先の命名規則
他人に言われなくても自然と命名規則を気にしたコーディングスタイルを身につけることができれば、開発者として一段高みに登ったといえるでしょう。

Office365の割引を利用してお安く買う方法

Microsoft Office 365とは、買い切り型ではなく月額使用料を払って常に最新のWord、Excelといったツールが使用できるサブスクリプション型のOfficeの事です。
最新というのは、買い切り型のOfficeにはない機能も随時追加され、非常に利便性の高い製品になっています。それ故の誤動作がある場合も見受けられますが・・・。

www.microsoft.com

普通にOffice365を購入すると、

  • \12,984 (年間契約)
  • \1,284 (月契約)

年間契約がお得になっています。

安く購入するには12月が狙い目!

2018年の12月にOffice365の3,000円キャッシュバックキャンペーンが行われ、2年目となる2019年も同様にキャンペーンが行われました。

www.microsoft.com

Amazonのセールと併用可能!

2019年を参考にすると、 \12,019 ⇒ \11,581 ⇒ 10%OFF ⇒ \10,423

ここから3,000円キャッシュバックとなるので、実質\7,423でOffice365の1年分ライセンスが購入できます。

月額にすると、わずか\600程度となります。

定価で月契約した際の半額以下となります。

Amazonのキャンペーン、およびMicrosoftのキャンペーンは期間限定ですので、お急ぎください!

【Elasticsearch】スナップショットの共有ストレージはNFSサービスを使う備忘録

Elasticsearchネタというか備忘録は続きます。

以下の書籍通りにスナップショット(バックアップ)を試みましたが、要らないコトをして無駄な時間を費やしました。反省。

失敗したコト

書籍の中では、NFSサービスを使用して共有ストレージに保存しましょうと紹介されていました。
使用しているVirtual BOXの仮想環境がオフライン(非インターネット接続)であった為、aptが面倒という理由でNFSサービスを使わない方向で行こう!と暴走。
結果、ドツボにはまる。

具体的に何をしたのかというと、V-BOXの共有ストレージ機能を使用して各ノードサーバーにマウント。
各サーバーからはキチンと読み書き出来たので大丈夫と思いきや、REST APIからスナップショットの指示を出すとrepository_verification_exceptionエラーが出た。

その際のエラーはこんな感じ。

{
    "error": {
        "root_cause": [
            {
                "type": "repository_verification_exception",
                "reason": "[mv_backup] [[Sup7NQqXQVaT1maJ49ajpg, 'RemoteTransportException[[node72][192.168.1.72:9300][internal:admin/repository/verify]]; nested: RepositoryVerificationException[[mv_backup] a file written by master to the store [/home/sgpl/elasticsearch_backup] cannot be accessed on the node [{node72}{Sup7NQqXQVaT1maJ49ajpg}{AOI8z2v7QzeohCBSFoZHRA}{192.168.1.72}{192.168.1.72:9300}{ml.enabled=true}]. This might indicate that the store [/home/sgpl/elasticsearch_backup] is not shared between this node and the master node or that permissions on the store don't allow reading files written by the master node];'], [mHR3zxDqQCqDvGNBxUF2tw, 'RemoteTransportException[[node73][192.168.1.73:9300][internal:admin/repository/verify]]; nested: RepositoryVerificationException[[mv_backup] a file written by master to the store [/home/sgpl/elasticsearch_backup] cannot be accessed on the node [{node73}{mHR3zxDqQCqDvGNBxUF2tw}{BwILk21wR4GlJaWDy-DHFg}{192.168.1.73}{192.168.1.73:9300}{ml.enabled=true}]. This might indicate that the store [/home/sgpl/elasticsearch_backup] is not shared between this node and the master node or that permissions on the store don't allow reading files written by the master node];'], [XEgaW0CvQt-02VEczOmHoA, 'RemoteTransportException[[node71][192.168.1.71:9300][internal:admin/repository/verify]]; nested: RepositoryVerificationException[[mv_backup] a file written by master to the store [/home/sgpl/elasticsearch_backup] cannot be accessed on the node [{node71}{XEgaW0CvQt-02VEczOmHoA}{WMgwMgp_QLae61ux_xPqtA}{192.168.1.71}{192.168.1.71:9300}{ml.enabled=true}]. This might indicate that the store [/home/sgpl/elasticsearch_backup] is not shared between this node and the master node or that permissions on the store don't allow reading files written by the master node];']]"
            }
        ],
        "type": "repository_verification_exception",
        "reason": "[mv_backup] [[Sup7NQqXQVaT1maJ49ajpg, 'RemoteTransportException[[node72][192.168.1.72:9300][internal:admin/repository/verify]]; nested: RepositoryVerificationException[[mv_backup] a file written by master to the store [/home/sgpl/elasticsearch_backup] cannot be accessed on the node [{node72}{Sup7NQqXQVaT1maJ49ajpg}{AOI8z2v7QzeohCBSFoZHRA}{192.168.1.72}{192.168.1.72:9300}{ml.enabled=true}]. This might indicate that the store [/home/sgpl/elasticsearch_backup] is not shared between this node and the master node or that permissions on the store don't allow reading files written by the master node];'], [mHR3zxDqQCqDvGNBxUF2tw, 'RemoteTransportException[[node73][192.168.1.73:9300][internal:admin/repository/verify]]; nested: RepositoryVerificationException[[mv_backup] a file written by master to the store [/home/sgpl/elasticsearch_backup] cannot be accessed on the node [{node73}{mHR3zxDqQCqDvGNBxUF2tw}{BwILk21wR4GlJaWDy-DHFg}{192.168.1.73}{192.168.1.73:9300}{ml.enabled=true}]. This might indicate that the store [/home/sgpl/elasticsearch_backup] is not shared between this node and the master node or that permissions on the store don't allow reading files written by the master node];'], [XEgaW0CvQt-02VEczOmHoA, 'RemoteTransportException[[node71][192.168.1.71:9300][internal:admin/repository/verify]]; nested: RepositoryVerificationException[[mv_backup] a file written by master to the store [/home/sgpl/elasticsearch_backup] cannot be accessed on the node [{node71}{XEgaW0CvQt-02VEczOmHoA}{WMgwMgp_QLae61ux_xPqtA}{192.168.1.71}{192.168.1.71:9300}{ml.enabled=true}]. This might indicate that the store [/home/sgpl/elasticsearch_backup] is not shared between this node and the master node or that permissions on the store don't allow reading files written by the master node];']]"
    },
    "status": 500
}

何がいけなかったのか

書籍通りにやらなかったというのが一番な訳ですが、どうも各サーバー上からはアクセスできても、実際のマスターノードが他のノードにアクセスする際、ローカルのパスだと駄目という海外の記述もあり。。。
素直にNFSサービスを入れることに。

Ubuntuでのスナップショット構築

NFSサーバー側ノード

※マウント先のドライブを/dev/sdb1で設定済みとし、/mnt/repoとしてマウント済み

  1. 権限変更
    RESTful APIが読み書きする為に必要

    sudo chown -R elasticsearch:elasticsearch /mnt/repo

  2. NFS server install

    sudo apt install nfs-kernel-server

  3. exports設定

    sudo nano /etc/exports

    # (公開したいディレクトリ) (どのマシンに公開するか) (公開モード)

    /mnt/repo *(rw,async,no_root_squash)

  4. sudo exportfs -av

    exporting *:/mnt/es_repo

NFSクライアント側ノード

  1. NFS client install

    sudo apt install nfs-common

  2. mount用folder
    【需要】マウント先の名前は揃える

    sudo mkdir /mnt/repo

  3. 権限変更

    sudo chown -R elasticsearch:elasticsearch /mnt/repo

  4. 自動マウント

    sudo nano /etc/fstab {NFSサーバーIP}:/mnt/es_repo /mnt/repo nfs rw 0 0

共通設定

  1. elasticsearch.ymlにRepositoryのPath追記

    path.repo: ["/mnt/repo"]

急がば回れとはよく言ったものですね・・・。