頭の中は異空間

ものづくり中心

mbr2gptコマンドでDisk layout validation failed for disk 0が出たときの解決策について

mbr2gpt /validate /disk:0 /allowfullOS

これの結果が表題の通り。
Windows11への乗り換え前にディスクが要件を満たしていないので変えようとしたら出た


C:\Windowsにエラーログ(setuperr.log)があるので、これの中身をチェック
→ValidateLayout: Last partition too close to the end of the disk. Should end at offset 500107845120 or below, found at 500107862016とかあった

ググってみると同じ症状に出くわしてた人がいた
日報 2021.10.12 | ド

↑に倣ってパーティションサイズ縮小

diskpart

list disk
select disk 0

list partition

この時点で自分の状態が

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              500 MB  1024 KB
  Partition 2    プライマリ              465 GB   501 MB

こうなっていたので、partition 2に対してパーティションサイズ縮小をかける
※これは見ての通り回復パーティションが最初からない場合の話

list partition

shrink desired=100

ボリュームは、次の方法で正常に縮小されました:  100 MB

exit

※100は適当

この状態で再度mbr2gptのvalidateをかけると通った

C:\Users\07k11>mbr2gpt /validate /disk:0 /allowfullOS
MBR2GPT: Attempting to validate disk 0
MBR2GPT: Retrieving layout of disk
MBR2GPT: Validating layout, disk sector size is: 512 bytes
MBR2GPT: Validation completed successfully

※エラーログファイルを開きっぱなしにしてると、Cannot initialize logs. Error: 0x00000000とエラーが出るため、先に閉じておこう

そしてGPTへ変換をかける

mbr2gpt /convert /disk:0 /allowFULLOS

MBR2GPT will now attempt to convert disk 0.
If conversion is successful the disk can only be booted in GPT mode.
These changes cannot be undone!

MBR2GPT: Attempting to convert disk 0
MBR2GPT: Retrieving layout of disk
MBR2GPT: Validating layout, disk sector size is: 512 bytes
MBR2GPT: Trying to shrink the OS partition
MBR2GPT: Creating the EFI system partition
MBR2GPT: Installing the new boot files
MBR2GPT: Performing the layout conversion
MBR2GPT: Migrating default boot entry
MBR2GPT: Fixing drive letter mapping
MBR2GPT: Conversion completed successfully
Call WinReReapir to repair WinRE
MBR2GPT: Failed to update ReAgent.xml, please try to  manually disable and enable WinRE.
MBR2GPT: Before the new system can boot properly you need to switch the firmware to boot to UEFI mode!

こっちも通ったZOY

一応diskpartでGPTにチェックがついたかを確認

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           465 GB    99 MB        *

問題なさそう

UEFIに切り替えが出来そうなのでやってみる

BIOSから起動→CSMをDisabledにし、セキュアブートがUEFIになっていることを確認して保存、終了
再度起動した時にDiskが見つからないなど出ず、無事にWindowsを起動出来た。
この時点でまだエラーが出る場合はTPMが有効になっていないなど他に原因があるので、それは適宜調査すること

Vuexを使わないVueJSのstoreを自前で用意する

import { ref, reactive, readonly } from "vue";

export function useStore() {
  const items = reactive({ list: [] });
  let backupList = [];

  const auth0 = reactive({ auth: null });

  function setUser(auth) {
    auth0.auth = auth;
  }
  function getUser() {
    return auth0.auth;
  }

  // データリスト登録
  function setItem<T>(list: T[]) {
    items.list = ref(list);
    backupList = list.concat();
  }

  // リストにデータ追加
  function add<T>(item: T) {
    items.list.unshift(item);
    backupList.unshift(item);
  }

  // リストからデータ削除
  function remove(id: Number) {
    let _target = items.list.filter(_obj => _obj.id === id);
    let _removeIndex = items.list.indexOf(_target[0]);
    items.list.splice(_removeIndex, 1);

    _target = backupList.filter(_obj => _obj.id === id);
    _removeIndex = backupList.indexOf(_target[0]);
    backupList.splice(_removeIndex, 1);
  }

  // データ検索
  function search<T>(list: T[]) {
    restore();
    const _target_ids = list.map((_obj: Object) => { return _obj.id });
    list.map((_obj: object) => {
      const _target = items.list.filter(_item => !_target_ids.includes(_item.id));
      _target.map((_deleteTarget: Object) => {
        const _removeIndex = items.list.indexOf(_deleteTarget);
        items.list.splice(_removeIndex, 1);
      });
    });
  }

  // バックアップからリストを復元する
  function restore() {
    if (items.list.length === backupList.length) { return; }

    const length = items.list.length;
    backupList.map((_obj: Object) => {
      items.list.push(_obj);
    });
    for(let _i = 0;_i < length;_i++) {
      items.list.shift();
    }
  }

  // リストを空にする
  function allClear() {
    items.list.splice(0);
  }

  return { setUser, getUser, items: readonly(items), setItem, add, remove, search, restore, allClear };
};

auth0という変数を使っているが、これはauth0を利用する前提で、認証済みユーザをstoreにぶち込むつもりで作っている。
ユーザを入れずにデータリストのみを使う場合はsetUser, getUserの部分を削除すればいい
backupListはデータリストの復元のためだけに使うのでスコープ外には公開しない

使い方

// App.vueでprovideする
export default defineComponent({
  name: "App",
  components: { NavigationHeader, FooterInformation },
  setup() {
    const store = useStore();
    provide('datalist', store);
  }
});


// データリストを使いたいところでinject
const store = inject('datalist');

VueJSの導入の敷居が高すぎやしないか問題

個人的なwebサービス開発時にVueJSを導入しようとして色々調べているうちに思ったことを書いていく
前提として私のJSスキルはフレームワークjQueryしかまともに触ったことがないです(PureなJSもES6も書けますよ)


まあ表題の通りなので簡単にはいかないよねって話
その理由はいくつかあるが

  1. 現在(2023/8)がVueJSの過渡期であること(Vue2→Vue3へ切り替わる途中)
  2. Vue3はJSのフレームワークであると同時にNode.jsのパッケージでもあるということ(これはReactもそう)
  3. VueJS自体がかなり独特な表記法を使っていること

などなど。

1.について

まず分からないことだらけで色々調べるのだが、ネット上の記事だとVue2前提で書かれているものとVueJS公式のようにVue3前提で書かれているもののざっくり2種類あり、素人目線からするとどっちか区別できないことが挙げられます。

2.について

個人的に分かりづらいなと思ったのがNode.jsのコマンドや用語、package.jsonの扱いやそもそもサーバ上で動かせるJSってなんだよ!という点。これにwebpackも。。。なんてなったらぜってえ頭こんがらがるヨ
更に調べていくとNode.jsとAWS Lambdaを使ってサーバレスアプリケーションを作れる、なんて話もあるくらい。いやいや、サーバレスって言いながらサーバ使ってんじゃんラマヌジャン
この辺の用語のキモさって消費税と同じものを感じますね。言葉を正しく使えよ(◞‸◟)

3.について

実際にVueJSのサンプルコードをググって一目見ればわかる
あと、ついでにVueJSはTypeScriptとの親和性が高い(というかそもそもVueJS自体がTypeScriptで書かれている)ということもありせっかくなのでTypeScriptも…と欲張った結果より学習コストが爆上がりしてしまったというオチ


「State of JavaScript 2022」公開。利用率1位のフロントエンドライブラリはReact、レンダリングはNext.js、テストはJestなど、4万人のエンジニアが回答 - PublickeyにあるようにVueJS自体は使用率が高くて魅力はあるんですけどね。今の自分の職場ではReactは使われているけどVueは特に…って感じだったので独学するしかないのが辛いところ→ならReactやれよって言われたらそれはそう
→→別にいいんだけどでもぶっちゃけReactの記法であるJSXをひと目見て吐き気したのは内緒です😒

じゃあどうやって学習するのって話

TypeScript→VueJSの順がいいのか、それとも逆がいいのか…


結論:一緒にやればいい


どうせどっちもできたほうがいいんだからそらそうよ、と言いたいところですがここでちょっくら整理を。

  1. VueJSはVue3の方を使う
  2. VueJSのインストール方法は3つあるがSFCをフル活用したほうがいいしTypeScriptと連携するならnpm install一択

→サーバ用言語のフレームワークでガッツリ開発してフロントエンドの部分だけJSを使うことができる

  1. TypeScriptに関しては一通りVueJSで書いたコードを.tsにしてエラーを潰していきながら覚える、的な感じ


これでなるべくVueJS公式が想定する通りの環境での実装が可能なはずです。多分。
ディレクトリ構成は余程メチャクチャじゃなければいいでしょう。
あとはもう分からん単語や記法が出てきたら都度調べて地道にマスターしていく予定

デフォルトpythonからpyenvへ乗り換えるときの落とし穴について

 ふと自分のmacに入ってるPythonのバージョンを確認したら3系でやっていたつもりが2系のままだったのでアップデートしてみました。しかし数時間詰まって大苦戦…

 何が起きたかというとpyenv global 3.8.2でバージョン変更したのにpython -Vしてもデフォルトの2.7.16から変わらず。解決策をググるとそれなりに似たようなエントリがいくつも見つかるのですが、そのどれを試しても自分のだとだめだったので備忘録としてここに解決策を記しておきます

 結局こちらをヒントにようやくゴールへたどり着きました…
ottan.xyz

 macに入っているデフォルトのpythonのバージョンは2.7.16

~ $ python -V
Python 2.7.16

このままではpyenvでいくら3.X.Xに切り替えても意味がありません。先にまず2系を3系に切り替える必要がありました。

~ $ /usr/bin/python3 -V
Python 3.8.2

先にpyenv globalでpyenv-versionを3.8.2にしていたので切り替える先のPython3のバージョンが3.8.2です。これにaliasを張ればいいだけでした。

~ $ alias python=/usr/bin/python3
~ $ alias pip=/usr/bin/pip3
~ $ python -V
Python 3.8.2

この設定を.bash_profileにでも書いておけば毎回設定し直す必要もなくなります。

これで無事変わりました。

自分のmacbook airの容量逼迫の正体を掴むためのコマンド

やったこと

 久しぶりにMacbook airのstrageを確認したらいつの間にか150GB以上あった空きが100GB足らずまで圧迫されていたのでちょっと整理しようと思いたち、strageを圧迫している犯人を突き止めました。
使ったのは以下コマンド。

sudo su -
cd /Users/ユーザ名/
ls -l | awk '{print $9}' | xargs du -sch | egrep '\d+G'


 自ユーザのホームディレクトリへ移動していますが、まずはすぐ見れるデスクトップだったりDownloadsだったりを探して、次に他を見る感じで探すと良いと思います。

 動画、画像、音楽(mp3など)ファイルは数が揃うとかなり容量を食うので、整理するとしたらこの辺のファイルが狙い目です(私の場合だと特にMusic以下、iTuensに追加した音源が30Gとかあってヤバかったです)
あとよくあるのは要らないAppを消すこと。

 容量圧迫となるとまずGB単位のフォルダが諸悪の根源のはずなのでGでgrepかけてますが、数十〜数百MBのファイルが複数集まればGBの塊へと変貌するため、余裕があればegrepの箇所をegrep '\d+M'とかしても良いかも。そこまでやったらキリがない気もしますが…

sudoしてもPermission deniedとか出るんだけど…

 Full Disk Accessをいじります。私はiTerm2を使ってるので以下に頼りました
www.softantenna.com

1個4GB以上のファイルを消したくないけど他所へ移動したい場合はどうするの?

 OnedriveやDropbox、外付けHDD等へ退避してやるのがベストです。私はOnedriveを使いましたが、こちらは無料分では5GBしか使えないので、月額¥200ちょいで1TBまで拡張できるのを知ってそちらに移行しました。

いつ買ったか分からないレターパックを使うときの罠について

ちょっと最近問題が起きたので。

日本では19年10月に消費税が10%になりました。そのため、増税前に購入したレターパックを今になって使って届け物をする場合、レターパックが10円値上がりしているのでそのまま送ると料金不足のハガキも一緒に相手に届いてしまいます。
当然、受取側に10円の支払いが発生してしまいます。このとき、発送側が10円切手を貼っていれば問題ないのですが思考の外にあったためまさにこの状態になりました。

いつ買ったかわからないレターパックを使うときはポストに投函するのでなく郵便局に出向いて窓口から発送してもらった方が賢明です。料金等で何か問題があればこの時点で忠告されるので、後でトラブルを招く可能性はなくなるでしょう。

Chromeで複数タブを開きがちな人にとって便利なOneTabをタスクリストのように使ってみる

最近知った便利なタブ管理ツールについて。
chrome.google.com

ネットサーフィンをし続けていると気づいたらタブがめちゃくちゃ増殖していてどれがどれだかわからなくなることが結構多いように感じたので入れてみたら問題が解消されました。あと、chromeはメモリ使用量が多いです。タスクマネージャーを開いてみると一目瞭然です。それも解消されます。
そんなOneTabについて、このextensionの使いみちとしては、タスクリストのように使うのが一番なんじゃないかと思ったので一応備忘録として書いておきます。

早速使ってみると、以下のようになります。
f:id:notwo:20190928122015p:plain

OneTabを使うと複数のchromeのタブを一箇所にまとめてくれるのでメモリ節約&見やすさ向上の面で大いに役立ちます。しかしただそこにまとめただけでは本当に”ただまとめただけ”で終わってしまってもったいない。
一箇所にまとめたリンク先のリストを作ってくれるので、それを1つずつ消化していく、という使い方で、せっかく読む気になった記事なのだから、しっかり目を通して満足したら閉じる、何度も読み返す必要があるならブックマークしておく、とするだけで何度も同じ記事をググり直す無駄を省けます。ゲームで言う積みゲー状態になってしまわないように、興味関心が薄れないうちに目を通すのって本当に大事だと思います。ソッチのほうが読んでいても頭に入ってきます。「鉄は熱いうちに打て」と言いますしね。
それと、extensionのレビューにもあったとおりこれはブックマーク機能として使うのは違うかな、と思います。ブックマーク機能ならどのブラウザにも標準で入っているから、新たにextensionを追加する必要はあまりないでしょう。

使い方に関して書きましたが、ただこれが当てはまらないパターンもあると思います。
例えば毎日見るyoutube動画のシリーズが5つあるとするならば、その動画はタブ5つ分を常に開きっぱなしにしておきたいでしょう。これをわざわざOneTabでまとめたままにするといちいちタブとして開きに行かないといけない(その分手間がかかる)ため、普段のブラウザの使い方がそればっかりの人にとってはOneTabはむしろマイナスになると思います。
またプログラミング学習中に何度も文法を見直すなど必要がある場合も、タブにずっと開きっぱなしで残しておいたほうがましだと思いますし、他にもエンジニアが職場でこれを使うのは必ずしもプラスにはならないかな、と思います。仕事中は勤怠管理とかjenkinsとかgithubとかdev、本番環境のトップページのような何度も開くことがわかっているサイトは固定タブにしたほうが良いですしね。

というわけで読みたい記事が沢山あるけどタブ多すぎて辛い、な人におすすめなextensionです。