初めてのOS

EB4E9048454C4C4F49504C0002010100
02E000400BF009001200020000000000
400B0000000029FFFFFFFF48454C4C4F
2D4F5320202046415431322020200000
00000000000000000000000000000000
B800008ED0BC007C8ED88EC0BE747C8A
0483C6013C007409B40EBB0F00CD10EB
EEF4EBFD0A0A68656C6C6F2C20776F72
6C640A00000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
·N·HELLOIPL·····
···@············
@·····)····HELLO
-OS···FAT12·····
················
·······|·····t|·
····<·t········· ······hello,·wor ld·············· 上記バイナリでPCを起動するとhello worldが表示される。 最も簡単なOS バイナリエディタも使えると幅が広がるとのこと

[OpenCV4.5.0] CentOS8に入れる手順

centos8のvagrant boxを入れてから、opencvをインストールします。git cloneするため、gitのインストールも必要です。

$ vagrant box add generic/centos8
$ vagrant init generic/centos8
$ vagrant up
$ vagrant ssh
$ sudo yum update

$ git –version
-bash: git: command not found
$ sudo yum -y install gcc curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker autoconf
$ cd /usr/local/src/
// gitを入れる 省略

$ sudo su
$ dnf install epel-release make git gcc gcc-c++ cmake3 qt5-qtbase-devel python3 python3-devel python3-pip cmake python3-devel python3-numpy gtk2-devel libpng-devel libwebp-devel libjpeg-turbo-devel libtiff-devel tbb-devel freeglut-devel mesa-libGL mesa-libGL-devel boost boost-thread boost-devel gstreamer1-plugins-base -y
$ mkdir -p ~/opencv_build
$ cd ~/opencv_build
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git

$ cd opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules -D BUILD_EXAMPLES=ON ..
$ make -j4
// 凄い時間がかかる
$ make install
$ ln -s /usr/local/lib64/pkgconfig/opencv4.pc /usr/share/pkgconfig/
$ ldconfig
$ pkg-config –modversion opencv4
4.5.0

$ python3 -c “import cv2; print(cv2.__version__)”
4.5.0-dev

ぎゃあああああああああああああああああああああ
いい週末になった

OSごとのインストールファイル

zipファイルなどのアーカイブファイルを展開した場合、アプリケーション管理ができない、インストール・アンインストールの設定が自動的にできない、などの制限があるため、インストーラがインストールする

Windows
1.exe形式のインストーラ
2.msi形式のインストーラ
 L リソース情報だけを持っており、インストールはWindows Installerで行う
 L Visual Studioを利用すれば、msiを利用したexe形式としてインストーラを作成できる

OS X
1.appファイル
2.dmg(ディスクイメージファイル)
3.pkg(パッケージファイル)
 L 動作に必要なパッケージも同時にインストール
 L パッケージ管理システム Homebrew

Ubuntu
1. apt
L debファイルからインストール

CentOS
1. rpm

OSごとにインストールファイルやその仕組みが異なることは分かった。
で、これ全部C言語で書いて、buildする必要あるの??

linuxのkernel

linuxのkernelファイル群
bpf, cgroup, configs, debug, dma, events, gcov, irq, livepatch, locking, power, printk, rcu, sched, time, trace
当然全てC言語で書かれていますね。
https://github.com/torvalds/linux/tree/master/kernel

ubuntuだとbootディレクトリの中に入っている
config-*-generic, initrd.img-*-generic, System.map-*-generic, vmlinuz-*-generic, grub

主要機能だとデバイスドライバ、スケジューラ、メモリ管理、ファイルシステム、ネットワークプロトコルスタック、システムコールあたりか。

モノシリックカーネルとマイクロカーネル

モノシリックカーネル
全OSは一つのカーネル内に存在し、カーネルスレッド上で実行される
システム構成要素間の依存関係が複雑
デバイスドライバ、スケジューラ、メモリ管理、ファイルシステム、ネットワークプロトコルスタックなどもカーネル空間におかける
Linux, FreeBSDはモノシリック
ソフトウェアが少なく高速、コードも少ない
システムコールの延長で動作する
コーディングは難しい 標準Cライブラリが使えず、GNUデバッガが必要

モノシリックカーネル
伝統的なカーネルからサーバ群に機能を移転するOS設計方針
サーバ群を可能な限りユーザ空間で動作させる
ハードウェアの抽象化とシステムコールの最小
IPC(プロセス間通信)、基本スケジューラ、基本メモリハンドラ、基本I/Oプリミティブなどはカーネル空間におかける
スケジューラ本体、メモリ管理、ファイルシステム、ネットワークスタックの大部分はユーザ空間で動作
macOS, QNX, GNU Hurdなど
マイクロカーネルは通常、アドレス空間定義部、プロセス間通信(IPC)、プロセス管理などを扱う
ハードウェア処理などの昨日はマイクロカーネルで扱わない
メモリ、ソフトウェアを多く使用し、プロセス管理が複雑
ロボット、医療用システムで使われる

ハイブリッドカーネル
macOS
通信プロトコルスタックやファイルシステムをカーネル空間で動作、一部のカーネルコードはユーザ空間で提供
サードパーティーのテクノロジーを素早く統合できる

unixはユーティリティプログラム群とカーネル
linuxカーネルは1300万行
macOSはDarwinをベースとしており、XNUと呼ばれるハイブリッドカーネルを採用
Windowsもクライアント・サーバ型階層型サブシステムモデルを採用しており、ハイブリッドカーネルと見なされている

なるほど、Linux, Windows, MacOSだと、カーネルの設計・仕組みが異なるってことか。

cat /proc/meminfo

/proc/meminfoは、カーネルが内部的に管理している枠組みでのメモリ情報

[vagrant@localhost python]$ cat /proc/meminfo
MemTotal: 1020076 kB
MemFree: 299244 kB
Buffers: 95364 kB
Cached: 408216 kB
SwapCached: 8328 kB
Active: 147128 kB
Inactive: 429060 kB
Active(anon): 36828 kB
Inactive(anon): 42764 kB
Active(file): 110300 kB
Inactive(file): 386296 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2064380 kB
SwapFree: 1616664 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 65920 kB
Mapped: 16524 kB
Shmem: 6984 kB
Slab: 116968 kB
SReclaimable: 58068 kB
SUnreclaim: 58900 kB
KernelStack: 2016 kB
PageTables: 10412 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2574416 kB
Committed_AS: 1137548 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 12012 kB
VmallocChunk: 34359708156 kB
HardwareCorrupted: 0 kB
AnonHugePages: 12288 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 8128 kB
DirectMap2M: 1040384 kB

Slab: 116968 kB なので、slabはそこそこありますね。

要求: libatspi.so.0()(64bit)

[root@localhost test]# sudo yum whatprovides libatspi.so.0
読み込んだプラグイン:fastestmirror
Repository nodesource is listed more than once in the configuration
Repository nodesource-source is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* base: ftp.nara.wide.ad.jp
* extras: ftp.nara.wide.ad.jp
* remi-safe: ftp.riken.jp
* updates: ftp.nara.wide.ad.jp
警告: yum のバージョン 3.0.x は、誤ってファイル名に対して一致するでしょう。
その振る舞いをするには「*/libatspi.so.0」もしくは「*bin/libatspi.so.0」が使用できます。
No Matches found

What is load average?

Load average is an indicator that represents the load status of the entire system. It is represented by “the number of processes waiting for “the number of processes waiting for execution per unit time and disk I/O waiting for one CPU”.

If yuo want to increase the throughput of the system, the goal is to reduce the load average.

The Linux kernel has a process descriptor for each process, and manages the state of the process in its state member. The state of the process is distinguished as follows.

TASK_RUNNING: Possible state. It can be run if the CPU is free.
TASK_UNINTERRUPTABLE: Uninterruptible wait state. Those that return in a short time, such as waiting for disk I/O.
TASK_INTERRUPTABLE: An interruptible wait state. The return time can not be predicted, such as waiting for user input.
TASK_STOPPED: Execution has been suspended. It will not be scheduled until it is resumed.
TASK_ZOMBIE: Zombie process. The child process has not exited and has not been waited on by the parent process.

ロードアベレージを確認するコマンド
[vagrant@localhost ~]$ uptime
08:42:40 up 1 day, 16:57, 1 user, load average: 0.00, 0.00, 0.00
[vagrant@localhost ~]$ uptime
08:43:36 up 1 day, 16:58, 2 users, load average: 0.13, 0.03, 0.01

[vagrant@localhost ~]$ w
08:44:33 up 1 day, 16:59, 2 users, load average: 0.05, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
vagrant pts/1 192.168.35.1 08:43 1:08 0.42s 0.24s php -S 192.168.
vagrant pts/0 192.168.35.1 23:24 1.00s 7.38s 0.01s w

[vagrant@localhost ~]$ top
top – 08:45:38 up 1 day, 17:00, 2 users, load average: 0.02, 0.02, 0.00
Mem: 501796k total, 493992k used, 7804k free, 6144k buffers
Swap: 1015804k total, 419948k used, 595856k free, 30000k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6854 vagrant 20 0 100m 700 468 S 51.0 0.1 0:00.34 sshd
9368 vagrant 20 0 15020 1308 1008 R 51.0 0.3 0:00.28 top
1 root 20 0 19232 192 60 S 0.0 0.0 0:00.90 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:01.62 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.63 watchdog/0
7 root 20 0 0 0 0 S 0.0 0.0 3:13.04 events/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_long/0
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_power_ef
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
16 root 20 0 0 0 0 S 0.0 0.0 0:01.11 sync_supers
17 root 20 0 0 0 0 S 0.0 0.0 0:00.02 bdi-default

おおおおおおおおおお、なんかわかった気になってきた。すげえ。

ミドルウェアとソフトウェアの違いはなに?

ミドルウェアって何???

ミドルウェアは、アプリケーションとOSの中間的処理を行うソフトウェアのこと
ということは、ミドルウェアもソフトウェアの一部って理解でよさそうだ。
つまり、ミドルウェアはソフトウェアの一部だから、ミドルウェアとソフトウェアの違いという質問自体が愚問といって良いだろう。

では、OSは例えば、CentOS7.0として、アプリケーションをLaravel5.7とした場合、PHP、MySQL、Composerなどはミドルウェアと呼んでよいのだろうか?

Web
Apache, IIS, Nginx
サーバーを提供しているこれらはミドルウェアになる。

Application
Tomcat, JBoss, WebLogic Server, WebSphere Application Server, Cosminexus Application Server
Tomcatもミドルウェアに含まれる。わかる気がしますね。

Database
MySQL, Oracle, PostgreSQL, SQLServer, DB2
はい、Mysqlもミドルウェアになります。

その他
arcserve, backup exec, netbackup, netvault, jp1, senju, systemworker, tivoli, websam, hinemos, zabbix, clusterpro, hacmp, haモニタ、heartbeat, lifekeeper, mscs, primecluster, serviceguard, vcs
zabbixもミドルウェアですか。アプリケーションのイメージありますけど。。

色々調べると、DBMSやモニター類が代表的なようですね。phpなど、言語はあまりミドルウェアとは呼んでないようです。

ヨ〇バシ mac book air 64GB 2011年モデル 査定額

純正のアダプターがなかったので、じゃんぱら、ソフマップで買い取り対象とならず。
さすが、しっかりしてますね。

しょうがないので、ヨ〇バシに行ってみよう

11時ごろ
定員「osが入ってないので、査定に早くても夜くらい、もしくは朝になりますね」
わたし「そんなにかかりますか?」
定員「OSダウンロードに時間かかりますので」
わたし「(OSのダウンロードって20分の筈だが…) 」


正直ここで止めとけばよかった。嫌な予感が走った。


わたし「えらいかかりますね、、わかりました。お願いします。」
定員「査定が終わったら連絡します。」

翌日10:30
定員「もしもし、査定が終わりまして、付属品がない為、2000円になります」

わたし「??? 」
わたし「(焼肉一回食べるのと一緒じゃん…)」
わたし「(爽やか風に)今回は止めときますー」

ということで結論
2000円

なるほど、こういう風に商売するのか。これは誰がやっても絶対に利益が出るね。
実際の査定は30分くらいだけど、査定に1日かけるってところがミソだな。

同じ仕組み作るかー