ドキュメントの場所
https://www.kernel.org/doc/html/v5.14/
The Linux Documentation Project
linuxのkernelのソースコード取得
https://www.kernel.org/からtar ballを取得するか
gitで取得する。
ドキュメントの場所
https://www.kernel.org/doc/html/v5.14/
The Linux Documentation Project
linuxのkernelのソースコード取得
https://www.kernel.org/からtar ballを取得するか
gitで取得する。
ラズベリーパイの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倍
githubからidとpasswordでgit cloneしたらgithubから怒られました。
2021年8月頃にidとpasswordでは、操作できなくなるそうです。(詳細)
少しハマったのでキーの作成方法と公開キーの登録方法をメモしておきます。
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
catで表示してコビーペーストでも問題ない。
2. 左端のメニューの"SSH and GPG keys"
3. 右上の"New SSH key"
$ 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.
$ git clone git@github.com:abcd/efghi.git
セキュリティの問題から、ブラウザの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(); };
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が参照される。
__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が表示される。
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
下記のコードを付け加える。
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
スクリプトのタイプをtext/babelにする。
<script type="text/babel">
例題
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
</script>
</body>
</html>
とりあえずは、この方法でテストできる。
本番環境では、実行速度に問題があるので、この方法はよくない。
<!DOCTYPE HTML> <html> <body> <div id="my_react"></div> <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script> <script src="my_react.js"></script> </body> </html>my_react.js
'use strict'; const e = React.createElement; class LikeButton extends React.Component { constructor(props) { super(props); this.state = { liked: false }; } render() { if (this.state.liked) { return 'You liked this.'; } return e( 'button', { onClick: () => this.setState({ liked: true }) }, 'Like' ); } } const domContainer = document.querySelector('#my_react'); ReactDOM.render(e(LikeButton), domContainer);
本番用のスクリプトは、こちらを使う
<script src="https://unpkg.com/react@17/umd/react.production.min.js" crossorigin></script><script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js" crossorigin></script>
minificationは、こちらを参照する。なおJSXを使うためにはここを参照する。
オブジェクト中のthisは、紛らわしい動作をする場合がある。
var message = 'aaaa'; let obj1 = { message : 'Hello', func1: function(){alert(this.message);} } obj1.func1(); // Hello #thisは、obj1 let func2 = obj1.func1; func2(); // aaaa #thisは、window func2.call(obj1); // Hello 明示的にthisを指定することができる。 setTimeout(function(){obj1.func1();}, 1000); // Hello setTimeout(obj1.func1, 1000); // aaaa setTimeout(obj1.func1.bind(obj1), 1000); // Hello bindでthisを決めてしまうこともできる。
callbackにobj1.func1で渡すと、thisは、obj1にならず、windowになる。
"use strict"をつけると
func2();は動作しない。
javascriptをためすには、
ファイルindex.htmlをつくる。
<html> <body> <script src="index.js"></script> </body> </html>
スクリプトは、index.htmlと同じフォルダーのindex.jsに記述する。
index.htmlをブラウザで開く。
ssh 公開キーによる認証
キーペアの作成
$ssh-keygen -t rsa
デフォルトでは、~/.sshに公開キー(public key)と秘密キー(private key)が作られる
id_rsa 秘密キー(private key)
id_rsa.pub 公開キー(public key)
設定ファイルの場所
/etc/ssh/sshd_config
ターゲットのホストへのsshキーの転送
ssh-copy-idコマンドを使用するか
パブリックキーをホストに転送し.ssh/authorized_keys にパプリックキーを登録する。
cat id_ras.pub >> .ssh/authorized_keys
正式版 本家
ダウンロードしたbinaryを/usr/local/lib/nodejsに展開してpathを通す。
LTSの確認 nodejsのホームページで確認する。
VERSION=v14.15.4 DISTRO=linux-x64
wget https://nodejs.org/dist/$VERSION/node-$VERSION-$DISTRO.tar.xz
sudo mkdir -p /usr/local/lib/nodejs sudo tar -xJvf node-$VERSION-$DISTRO.tar.xz -C /usr/local/lib/nodejs
~/.profileの最後に下記を追加する。
# Nodejs
VERSION=v14.15.4
DISTRO=linux-x64
export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH
profileを更新する。
. ~/.profile
テスト
node -v
npm version
npx -v
APT INSTALL
$ sudo apt install nodejs npm
$ nodejs --version <== コマンドはnodejs
v10.19.0 <== 古い
node.jsのバージョン管理モジュールをインストール
adduser username 下記の処理も行ってくれる
useradd
cp -a /etc/skel/. /home/username
chown -R username:username /home/username
usermod -a -G adm,cdrom,dip,lxd,plugdev,sudo username <==必要なグループを追加する
などなど
$ sudo adduser xx
ユーザー `xx' を追加しています...
新しいグループ `xx' (1002) を追加しています...
新しいユーザー `xx' (1002) をグループ `xx' に追加しています...
ホームディレクトリ `/home/xx' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい パスワード:
新しい パスワードを再入力してください:
passwd: パスワードは正しく更新されました
xxのユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
フルネーム []:
部屋番号 []:
職場電話番号 []:
自宅電話番号 []:
その他 []:
以上で正しいですか? [Y/n] y
$
特殊な変数
arguments 配列のような変数
配列ではないため、foreachとかpopなどはない
function test() {
for(let arg of arguments) alert(arg);
// or
//let args = Array.from(arguments);
let args = [...arguments];
args.forEach(arg => alert(arg));
// arguments.forEach(arg => alert(arg)); これはできない
}
test(1,2,3);
rest parametersは、配列である。
function test(...args) {
args.forEach(arg => alert(arg));
}
test(1,2,3);
docker images 取得済みDockerイメージの一覧
docker ps -a ローカル環境のDockerコンテナの一覧
-aは停止中のものも表示する。
docker run <image name> ダウンロードと実行
docker pull <image name> ダウンロード
docker rm <container name> コンテナの削除
docker stop <container name> コンテナの停止
docker exec -it <container name> bash コンテナ内でbashの実行
docker commit <container name> <作成するimage name> Dockerイメージの作成
OpenZFSにUbuntu on Raspberry PiのRootをSZFにする方法が記載されています。
SDカードで動作を確認できました。
USBの場合には、基本的な手順は同じですが、若干の差があります。
本家で指定されている、ディスクイメージは、USBデバイスでは、ブートできないので、Raspberry Pi ImagerでUSBストーレジにubuntu serverを書き込み、このデバイスをインストールimageとして使います。
あと/dev/mmcblk0を適宜/dev/sdx(xはaとかbとか環境により異なる)と読み替えると本家の手順どうりに行えます。
なお、eepromが、USBブートに対応していない場合は、ここを参照してください。
eepromのversionが2020-08-20以降のものは、USBブートが可能になっています。
Raspberry Pi imagerでかきこむOSを選び、SDカードを選ぶ画面を開くとUSBが選択できるので、書き込むめば、ブート用のUSBの完成です。
USBブートできない場合は、下記の方法でeepromを更新できます。
Raspberry Pi imagerでRaspberry Pi 4 boot recoveryを選びSDカードに書き込み
Raspberry Piで起動するだけ。
なお、Raspberry Pi OSでapt full-upgradeでも最新eepromを最新に変更できる。
(2021.1.1)