2021年9月7日火曜日

Linux kernel build

 ドキュメントの場所

https://www.kernel.org/doc/html/v5.14/

https://kernelnewbies.org/

The Linux Documentation Project


開発ツールのインストール
sudo apt-get install libncurses5-dev gcc make git exuberant-ctags bc libssl-dev flex bison libelf-dev

linuxのkernelのソースコード取得

https://www.kernel.org/からtar ballを取得するか

gitで取得する。

Linus' treeから取得する場合
(Linusとは、有名なLinus Torvaldsのこと)
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

安定版(stable)を取得する場合
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
cd linux-stable
最新のタグを探してチェックアウトする。(手順省略)

.configをLinuxを実行中のマシンからコピー
.configには、ビルドするドライバ、モジュールなどの情報が記述されている。
cp /boot/config-`uname -r`* .config

default configを作る
make defconfig
(注意)default configは、ビルドする人にとって、必要な情報が設定されていない場合もある。


configの変更は、
make menuconfig
または、
make nconfig
で行う。

ビルドの実行
make -jX
Xは、数字 コア数に応じて変更、コア数の1.5倍くらいがよい。
例 make -j12 

インストール
sudo make modules_install install


カーネルの実行時の注意
変更前のカーネルで実行できるようにgrubの設定をしておく
 /etc/default/grubからGRUB_HIDDEN_TIMEOUT_QUIET行を削除
GRUB_TIMEOUTに適当な値を設定

2021年7月21日水曜日

Raspberry Pi OS Kernel クロスコンパイル

  ラズベリーパイのKernelをx86 Linux クロスコンパイル環境で作成する。

開発環境は、Raspberry Pi OSと同じDebian系のubuntuがよく使われるようである。


1. 開発環境のインストール

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

64bit kernel用の環境

sudo apt install crossbuild-essential-arm64


2. ソースコードの入手(最小構成)

git clone --depth=1 https://github.com/raspberrypi/linux


3. 64bit Raspberry Pi 4のconfig作成

cd linux

KERNEL=kernel8

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig


4. 64bit build

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs

-j N をつけるとコア数に応じて早くビルドできる

Nは、コア数の1.5倍



2021年2月27日土曜日

github clone ssh

githubからidとpasswordでgit cloneしたらgithubから怒られました。

2021年8月頃にidとpasswordでは、操作できなくなるそうです。(詳細)

少しハマったのでキーの作成方法と公開キーの登録方法をメモしておきます。

sshキーの作り方

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

キーをgithubへ登録する方法

catで表示してコビーペーストでも問題ない。


1.

2. 左端のメニューの"SSH and GPG keys"

3. 右上の"New SSH key"

sshの接続テスト

$ ssh -T git@github.com

The authenticity of host 'github.com (52.192.72.89)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes   <== 入力
Warning: Permanently added 'github.com,52.192.72.89' (RSA) to the list of known hosts.
Hi user-ID! You've successfully authenticated, but GitHub does not provide shell access.
または
Hi user-ID! You've successfully authenticated, but GitHub does not provide shell access.
のように表示されたらOK 

cloneの例

$ git clone git@github.com:abcd/efghi.git

2021年2月21日日曜日

javascript ファイル出力

 セキュリティの問題から、ブラウザのjavascriptから直接ファイルの操作はできない。

Blobを作成して、アンカーに紐づけダウンロードすることによりファイルを出力できる。
window.onload = () => {
    let data =  Array("abcdefg", "xxxxx");
    let blob = new Blob(data, {type: "text/plan"});
    let link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = 'testfile.txt';
    link.click();
};

2021年2月15日月曜日

javascript internal slot [[Prototype]]について

 Internal methods and internal slots are identified within this specification using names enclosed in double square brackets [[ ]].(© Ecma International 2020)

[[ ]]は、ECMAScriptでの表記方法

普通のオブジェクト(ordinary object)は、[[Prototype]]を持っています。

[[Prototype]]は、nullまたは、他のオブジェクトの参照を持っています。


普通にオブジェクトを作成すると、[[Prototype]]は、Object.protorypeの参照を持ちます。

let obj1 = {};
let obj2 = {};
let obj3 = Object.create(obj1);   // [[Protorype]]は、obj1

Object.prototype.my_prop = "AAA"

// すべてAAAが表示される。
alert(obj1.my_prop);
alert(obj2.my_prop);
alert(obj3.my_prop);

alert("abc".my_prop);  // 文字列も[[Protorype]]を持っており、最終的にObject.prototypetが参照される。


2021年2月14日日曜日

javascript の特殊なプロパティー __proto__

 __proto__は、[[prototype]]にアクセスするための特殊なプロパティーである。色々なブラウザに実装され、デファクト・スタンダードとなった。現在では非推奨である。

代わりに

Object.create(proto, [descriptors]) 

Object.getPrototypeOf(obj) 

Object.setPrototypeOf(obj, proto) 

を使う。

__proto__ の例

let obj1 = {
    prop1 : "ABC"
}

let obj2 = {
    __proto__ : obj1
}

alert(obj2.prop1);   // ABCが表示される。obj2.__proto__.prop1 (obj1.prop1)が参照される。

obj2.__proto__ = "TEST";  // プリミティブは代入できない。

alert(obj2.__proto__);   // [object Object]が表示される。

obj2.__proto__ = {
    prop1 : "XXX"
};                    // オブジェクトは代入できる。

alert(obj2.prop1);    // XXXが表示される。

objectをmapとして使用した場合、画面入力からキーとバリューを作成した場合、キーに"__proto__"が入力された場合問題が発生する。

Object.create(null);を使うことにより、__proto__の無いオブジェクトが作成できる。

let obj3 = Object.create(null);   // [[prototype]] が、nullになる
obj3.__proto__ = "TEST";
alert(obj3.__proto__);    // TESTが表示される。

obj3.__proto__ = {
    prop1 : "XXX"
};
alert(obj3.prop1);        // undefined 
alert(obj3.__proto__.prop1);   // XXXが表示される。

2021年2月13日土曜日

javascript React web site + JSXの開発方法

 JSXを使ってweb siteを開発する場合の手順(Babel)

1. node.jsをインストール(参考)

2. プロジェクトフォルダーを作成する。

3. プロジェクトフォルダーで下記コマンドを実行

$ npm init -y

$ npm install babel-cli@6 babel-preset-react-app@3

以上で開発環境の準備終了

プロジェクトに、srcとjsというフォルダを準備し

下記コマンドを実行する。

$ npx babel --watch src --out-dir js --presets react-app/prod

srcに作られたJSXで記述されたコードが本番用に変換されて
jsに出力される。