業務備忘録

備忘録です

『ゼロからの自作OS入門』軽く詰まったところ①

2023-07-30 14:41:56 | 日記

10月の応用情報の申し込みをすっぽかしてしまったので、1月くらいまで暇。
そこで前から気になっていた『ゼロからの自作OS入門』を読み始めることにしました。あんまりネット上に記事もないので、詰まったことはちょっとしたことでも書いておきます。

【第1章 1.3】

まずはコマンドの中身から。

WSL(Windows SubSystem for Linux)上のubuntuからEFIファイルをUSBメモリにコピーするさいのコマンド(p.31)。

$ sudo mkdir -p /mnt/usbmem
$ sudo mount -t drvfs F: /mnt/usbmem
$ sudo mkdir -p /mnt/usbmem/EFI/BOOT
$ sudo cp BOOTX64.EFI /mnt/usbmem/EFI/BOOT
$ sudo umonut /mnt/usbmem

mountコマンド…「「mount」は、HDDやUSBメモリ、DVD-ROMなどのフォーマット済みの領域(ファイルシステム)を指定したディレクトリ(マウントポイント)と一時的に結び付けてアクセスできるようにするコマンドです」。
(https://atmarkit.itmedia.co.jp/ait/articles/1802/15/news035.html)

Windows側のドライブをマウントする場合は-t[ype] drvfsを指定する。
USBドライバー「F:」とubuntuの/mnt/usbmemディレクトリが結び付けられている。

そのため、3行目でmkdirコマンドで/EFI/BOOTディレクトリを作成したさいは、USB側にもF:直下にEFI/BOOTディレクトリが作成されている。

詰まったのは4行目のコピーコマンドです。
$ sudo cp BOOTX64.EFI /mnt/usbmem/EFI/BOOT
cp: cannot stat 'BOOTX64.EFI': No such file or directory

問題
Windows側のドキュメントフォルダに保存していたのでEFIファイルが見つからない。

解決

$ sudo cp /mnt/c/Users/[ユーザ名]/Documents/BOOTX64.efi /mnt/usbmem/EFI/BOOT

ubuntu側からはmnt/cからWindows側ユーザのCドライブが見られるようです。


【JavaScript】locationインターフェースを使えば遷移パラメータも簡単に取得できたのに

2023-07-29 20:06:49 | 日記

JSのlocationインターフェースを使う機会があったので勉強。

1.locationインターフェース(*)とは?

Location インターフェイスは、関連付けられたオブジェクトの場所 (URL) を表します。

                                ーmdn web docs

プロパティからURLの状態を取得したりメソッドで操作できる。

(*)「概念的に共通した部品と機能の集まり(もしくは操作の集まり)のことを インタフェース/interface」といいます
(https://zenn.dev/ojk/articles/js-interface)

概念として部品とその機能を定義したのがインターフェースで実体化されたものがオブジェクト。

2.実際に中身を見る

https://www.google.co.jp/?id=001&value=%22hello%22
にて実行!

後述のメソッドを使わなくても、location.hrefプロパティを更新するだけで遷移することができます。

  URL location.origin location.host location.hrefにセットする値
https://www.google.com/ "https://www.google.com" "www.google.com" "test"
https://www.google.com/test "https://www.google.com" "www.google.com" "https://yahoo.co.jp"
https://www.yahoo.co.jp/ "https://www.yahoo.co.jp" "www.yahoo.co.jp" "www.google.com"
  https://www.yahoo.co.jp/ "https://www.yahoo.co.jp" "www.yahoo.co.jp"

"test"のようにhref属性に指定する値にhttpsなどからはじまるプロトコル名を省略すると、originプロパティからの相対パスになるようです。
"https://yahoo.co.jp"のようにプロトコル名を指定した場合はそのまま遷移します。
"www.google.com"のようにホスト名を指定した場合は元のURLに遷移します。

 

メソッドたち。

assign() 引数に指定したURLに遷移。
reload() 現在のURLを再読み込みする。
replace() 引数に指定したURLに遷移。ただし戻るボタンを使用して戻ることはできない。
toString() URL全体を収めた文字列を返す。

 

3.URLから遷移パラメータをいい感じに切り出す

locationインターフェースのsearchプロパティにはクエリ文字列(*)が渡されます。
(*)クエリ文字列:遷移パラメータ、URLパラメータに同じ。


昔書いたダメな例
JSでURLから遷移パラメータを切り出そうとしています。

http:****?id=001&value=02のようなURLを処理するとして、
「substring()でクエリ文字列全体を切り出して、split()でパラメータ名と値を切り分けて…」などと書いていくのは面倒くさい。
そもそもlocationのsearchプロパティにクエリ文字列が格納されているので、substring()による切り出しは全く不要。

よさそうな例
URLインターフェースのsearchParamsプロパティを使いましょう。
searchParamsプロパティはキーと値がセットになったURLSearchParamsオブジェクトを返し、mapオブジェクト(*)と同様に操作することができます。
URLオブジェクトを使うために、当該ページのURL = location をコンストラクターに渡して初期化しています。
行数も格段に減りましたね。
 
URLオブジェクトの初期化時のパラメータには「絶対 URL または相対 URL を表す USVString」(mdn web docs)を渡しますが、渡すのはlocationオブジェクトでもlocation.hrefプロパティでもよいようです。

(*)map: 連想配列。合言葉となるキー(key)によって値(value)を取り出す。値を取得するときはget([キー名])メソッドを使用する。列挙するときはfor-inではなくfor-ofやforeachで。

SQL ServerにSQL認証でログインするときに出るエラーコード26

2023-07-29 02:03:26 | 日記

SQL Serverをインストール後、SQL認証にてログインしようとすると、必ず出るエラー。

SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。
サーバーが見つからないかアクセスできません。
インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。


サーバー認証を「SQL Server認証とWindows認証」(*)に選択しただけだとSQL認証でログインすることはできません。
* Windows認証はWIndowsのユーザ情報でログインする方式のこと。

結論から言うと、インストール後はデフォルトでSQL server Browserが起動していないので、起動させる必要がある。

  1. コントロールパネル→システムとセキュリティ→管理ツール→サービス→一覧からSQL Server Browserのプロパティを開いて、スタートアップの種類を「手動」にする。
  2. SQL Server構成マネージャを起動→SQL Serverのサービス→SQL Server Browserの開始モードを「自動」にする。

1.の手順を踏まないと構成マネージャから起動できないので注意。

 


【Ubuntu】Ubuntu内のディレクトリをWindowsから共有する

2023-07-27 00:00:20 | 日記

最近、常用のPCを5年使ったノートPCから、デスクトップに切り替えました。VisualStudioを動かすにはメモリ8GBではとても足りませんでしたし、
まして今時HDDではとても作業になりませんでしたから、大変快適な環境になりました。

結果として、使わないノートPCが1台自宅の置物となっているわけですが、せっかくなのでSSDに換装のうえOSをubuntu22.04にしてみました。

いろいろやってみたいことはありますが、まずは環境構築をせねばなりません。

今回は、ubuntu側をサーバーとしてWindowsとファイル共有をする設定を行いました。
ネット上には同趣旨の記事があふれていますが、なんだかんだ詰まったポイントもあったので以下に記しておこうと思います。

あと、初心者なので注釈も細かく書きます。

 

1.手順一覧

  1. ubuntuユーザの追加
  2. sambaユーザの追加
  3. 共有ディレクトリの作成とアクセス制限
  4. GUIから共有設定

2.実際にやってみる

2-1.ubuntuユーザの追加

まずはUbuntuにユーザを追加します。といってもLinuxの標準コマンドです。ctrl + alt + t でターミナルを開いて、

$ sudo adduser [任意のユーザ名] (*1)

入力するとパスワードの入力を求められるので、入力します。

*1 sudo 管理者権限でコマンドを実行するときに使用するコマンド

一応、追加されているか確認します。

$ cat ../../etc/passwd (*2)

今回は"ubuntu"というユーザ名にしました。
passwdファイルの最後の行に自分の入力したユーザ名が追加されています。

*2 cat ファイルの内容を標準出力するコマンド

2-2.sambaユーザの追加

WindowsとUbuntuの間で直接ファイルの送受を行うことはできません。
ファイルのやり取りを実現する方法として、Ubuntu側でSambaサーバー(*3)を立てる方法があります。

*3 Samba windowsと互換性のあるファイルサーバ機能などを提供するソフトウェア
         楽しそうな名前でいいね

まずはSambaをインストールします。

$ sudo apt install samba (*4)

*4 apt パッケージのインストール・削除(remove)・更新(upgrade)に使うコマンド

Sambaにユーザ登録します。Ubuntuに追加したユーザと同じユーザ名にしないといけないらしいです。

$ smbpasswd [任意のユーザ名] 

パスワードの入力も求められるので、適当に入力します。
一応、登録されているか確認。

$ sudo pdbedit -L -u [ユーザ名] 

 

2-3.共有ディレクトリの作成とアクセス制限

共有のディレクトリは、今回は作成したユーザ"ubuntu"のホームディレクトリ内に作成します。

わかりやすくなるようルートディレクトリに移動。

$ cd / 

ディレクトリの作成。今回は"share"という名前にします。

$ mkdir ./home/ubuntu/share 

確認がてらlsコマンドを叩きます。-lオプションで詳細を表示できます。

$ ls -l  ./home/ubuntu/share 

一番右の列にそれぞれのディレクトリやファイル名が表示されているはずですが、一番左の列に謎めいた文字列が表示されているかと思います。


(ディレクトリ作成当時の画像がないので適当にルートディレクトリでlsしたものを使います)

左の列の文字列は、アクセス権限を表します。

d| rwx| rwx| rwx
①   ②     ③   ④

文字列には上記4つのセクションに分かれています。
まず、使用されている文字がそれぞれ意味するところは、
①のセクションでは、'd'はディレクトリ'-'はファイルを示します。
②~④においては、'r'は読み取り可能であること。'w'は書き込み可能であること。'x'は削除可能であることを示し、'-'は権限が与えられていないことを示します。
また、②は所有者の権限、③はグループの権限、③はグループ外のその他のユーザの権限です。

あらたに作成したshareディレクトリはたしかdwrx------だったと思いますので、所有者以外は権限が与えられていない状態です。そこで、権限を変更するコマンドを叩きます。

$ sudo chmod 777 ./home/ubuntu/share (*)

* chmod ChangeModeコマンドで、ディレクトリやファイルへのアクセス制限を行う。

今回はLAN内でサーバにアクセスするのは自分だけなので777ですべてのユーザに権限を与えます。またいずれ制限する練習もしたいですね。

ついでにSambaの設定ファイルも編集します。

$ gedit /etc/samba/smb.conf (*)
* gedit CUIのviとは違いGUIによるテキスト編集が行える。

[global]で始まるセクションに以下を追記。

dos charset = cp932
unix charset = UTF-8

また、workgroup = WORKGROUP
という記述が存在することを確認します。

####Networking####から始まるブロックに、

; interfaces = 127.0.0.0/8
という記述があるので、この部分に以下のように追記します。先頭のセミコロンは削除するらしいです。
 interfaces = 127.0.0.0/8 [自身のネットワークアドレス]

ipアドレスはWindows側のコマンドプロンプトからでもUbuntuのターミナルからでもどちらから調べても可。
今回はWindowsから。

ipconfig /all

自分はIPv4アドレスが192.168.11.xでサブネットマスクが255.255.255.0なので、ネットワークアドレスは192.168.11.0として考えます。

最後にsmb.confの末尾に以下を追記。

[share]

browsable = yes
writable = yes
path = /home/ubuntu/share
force create mode = 0770
force directory mode = 0770
guest ok = yes
guest only = yes

2-4.GUIから共有設定

CUIだったりGUIだったりでマチマチになってしまっていますが、こういう設定も全部CUIでできるようになりたいですね。

共有フォルダを右クリック→「ローカルネットワーク共有」を選択。
「このフォルダー内でのファイルの作成・削除を他のユーザに許可する」
「ゲストによるアクセス」(本当に選択する必要があるのか確かめてない)を選択。Ubuntu側の設定はこれでおしまい。

一応、

$ sudo testparm

でsmb.confの記述にミスがないか確認。

Windowsからは、エクスプローラを開いて「ネットワーク」を右クリック→「ネットワークドライブの割り当て」を選択。

ドライブはなんでもいいので、フォルダー名を以下の通り指定

\\[Sambaユーザのドメイン]\[共有フォルダ名]

Sambaユーザのドメインは

$ sudo pdbedit -v [ユーザ名]
で出力される詳細情報の"Domain"の行に記載があります。

入力次第「完了」押下で設定完了です!

 

3.エラー対処

■'net usershare'がエラー255を返しました
net usershare add:cannnot share path/home/ubuntu as we are restricterd to only sharing directories we own.

"Ask the administrator to add the line "usershare owner only = false" 
tothe [global] section of the smb.conf to allow this.
というガイドが出るので、それに従う。
smb.confの[global]セクションに"usershare owner only = false" を追記。

 

■WARNING: no network interfaces found

...?
インターフェース?ルーターかな?と思いましたがルータは生きている模様。
$ sudo smbstatus 
を実行するとなぜかSambaサーバーが動いていない様子。
$ sudo system ctl restart nmdb 
=>Failed to restart nmdb.service: Unit nmdb.service not found.
検索すると原因が多岐にわたるようなので削除後再インストールすることにしました。こういうのもうまく対処できるようになりたいですね。

$ sudo apt-get remove samba-common-bin
$ sudo apt-get remove samba-common
$ sudo apt-get remove samba
*よくよく調べたらsystem ctl restart nmdb は検索してもHITしないので間違っていたかも。やる気があったら調べて追記しようと思います。
【お世話になったサイト様】
http://ckenko25.jp/2016/02/post-2272(Samba再インストール)
https://chirorin.hatenadiary.com/entry/2021/06/21/132126(共有フォルダ作成の流れ)
http://www.linux-beginner.com/linux_kihon139.html(コマンド類)

【HTML】ValidityStateオブジェクトについて深掘りする。

2023-07-23 01:13:31 | 日記

htmlから最大入力文字数を制限する属性にmaxlength属性があります。

適当なhtml要素にmaxlength="8"など設定すれば、フォームの入力要素が8文字以内に制限されるというもので、その効果については周知のことと思います。
では、制限を指定されたhtmlオブジェクトの状態はどのように管理されているのか?
今回はformの入力要素の制限を管理している、ValidityStateインターフェースについて中身を見ていきたいと思います。

1.ValidityStateインターフェースとは?

"ValidityState インターフェイスは、制約の検証に関して、要素が取りうる妥当性の状態を表します。要素の値が不正な場合、なぜ検証に失敗したのかを知る手がかりにもなります。"

-MDN Web Docs

ValidStateインターフェースには、いくつかのプロパティがあり、inputタグのtype属性に応じてboolean型がセットされます。

  1. tooLong...maxLengthで指定された長さを超えている場合trueとなる。
  2. tooShort...minLengthで指定された長さに満たない場合trueとなる。
  3. typeMismatch...typeがemailまたはurlのとき、要求された構文に満たない場合trueとなる。
    なお、「要求された構文」とは、メールアドレスの[先頭部分]@[ドメイン名]という形式や、URLであれば[httpsやftpなどのプロトコル名]:[接続先のドメイン名]のような形式を指す。
  4. patternMismatch...指定されたpattern属性と一致しない場合trueとなる。
  5. valueMissing...required属性が指定されたにもかかわらず値がない場合trueとなる。

2.挙動を確認するコード

type属性ごとにinputタグを作成し、JS側でそれぞれの要素のValidityStateオブジェクトの中身を走査します。
for-inによって、オブジェクト内のプロパティで値がtrueとなっているものを調べ、列挙します(element.validity[key]===trueとしている箇所は冗長な記述でした)。
なお、removedKey配列には、今回は出力に含めないプロパティにキー名を列挙しました。

3.結果確認

illegalな入力値と、入力の結果trueとなったプロパティが列挙されています。
tooLLongプロパティは一旦置いておくとして、type属性がurlやemailの場合はpatternMismatchのみならずtypeMismatchやにも引っかかっていますが、
これは,emailの場合は@より前のメールアドレスのアカウント部分が書かれていないこと、URLの場合はドメイン名が指定されていないためです。
なお、このように制約に違反した入力がされた場合は上記のプロパティがtrueとなりますが、
オブジェクト内のいずれかの制約に違反していることを示すvalidプロパティはfalseとなります。ややこしいですね。

ところで、周知のとおり、maxlength制約が付されたフォームには、htmlからは入力制限の桁数以上の文字列を入力することはできません。
じゃあ、tooLongプロパティがtrueになることはないのか?JS側から制約を満たさない場合はどうなのか?
続編ではtooLongプロパティと、ついでにsetCustomValidityメソッドについて記述します。