Ubuntu20.04 Wifi設定(コマンドラインから)
Netplan +Networkmanagerを使用して、Ubuntu20.04のWifi設定をコマンドライン行った。使用しているのは20.04だが、18.04でも可能。
準備
対象PCにNetplanをインストールする。おそらく標準でインストールされているので必要ないかもしれない。
$ sudo apt update $ sudo apt install netplan.io network-manager
Netplanについて
Ubuntuにおいてsystemd-networkdかnetwork-managerがNetworkの設定や管理などなどを行っている。ただ、もっとわかりやすく設定をおこないたい、ということでNetplanが生まれた。注意点としてはNetplanはsystemd-networkdかnetwork-managerの設定ファイルを生成するのみで、実際に仕事をしているのはsystemd-networkdかnetwork-managerである。
Netplanでの設定はyamlファイルで書き、それを/etc/netplanディレクトリにおいて、netplan applyコマンドで適用する。
設定
今回は以下のような設定を行う。
wifiデバイスが接続されていることの確認
下記コマンドを行う。wl…というような名前のデバイスが見つかればOK。このデバイス名はのちほど使用する。 (命名はudevというデーモンが行っている。環境によって名前は異なってくる。)
$ ip a ~~~~ 7: wlan0:mtu 1500 qdisc mq state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
アクセスポイントの検出
下記コマンドでアクセスポイントを検出する。目的としているものが見つかればOK。
$ nmcli d wifi list IN-USE SSID MODE CHAN RATE SIGNAL BARS SECURITY * XXXXXXXXXXX Infra 6 16 Mbit/s 100 ▂▄▆█ WPA1 WPA2
Netplan用yamlファイルの記述
下記のようにファイルを記載する。内容は次のように変更する。
- "wlan0"を自分のWifiデバイス名に置き換える。
- DHCPを使用しない場合は"dhcp4: false"とする。
- addresses: は設定したい固定IPアドレスにする。下記だと"192.168.11.101/24"に設定される。
- XXXXXXXXXXXは自分のSSIDに変更する。
- xxxxxxxxxxxは自分のパスワードに変更する。
$ sudo vim /etc/netplan/99-manual.yaml
network: version: 2 renderer: NetworkManager wifis: wlan0: dhcp4: true addresses: [192.168.11.101/24] access-points: XXXXXXXXXXX: password: "xxxxxxxxxxx"
設定の適用
下記コマンドで適用する。再起動は必要ない。(ただし、設定をやり直したりすると再起動が必要な場合がある。)
$ sudo netplan apply
確認
下記コマンドでIPが振られていることを確認する。(192.168.11.6/24はDHCPで振られたもの。)
ちなみにSSHでは6でも101でもどちらでもアクセスできる。
$ ip a ~~~~ 7: wlan0:mtu 1500 qdisc mq state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.11.6/24 brd 192.168.11.255 scope global dynamic noprefixroute wlan0 valid_lft 169127sec preferred_lft 169127sec inet 192.168.11.101/24 brd 192.168.11.255 scope global secondary noprefixroute wlan0 valid_lft forever preferred_lft forever
外部ネットワークに接続されているかはpingとばしたり、apt updateしてみると良い。
JetsonNano起動高速化
JetsonNanoの起動を高速化する。 Systemdサービスで不要なものを止めて起動を高速化してみる。 結果としては倍以上高速化することができた。
制限事項
今回計測するのはKernelが起動してから、初期化処理が終わるまでです。 実際にはその前にBIOSなど(L4TだとBootROMやCboot)が入るので、電源ONからの起動時間は表記+10秒程度はかかっています。
使ったイメージ
Jetpack 4.4イメージを使用した。ただし、パッケージなどいろいろと追加で入れているので参考まで。
ユースケース
自分の使用方法は下のような感じなので、最低限これができる用になればいい。ほかはすべて止める。
現状確認
下のコマンドで起動にかかる時間が調べられる。
$ systemd-analyze Startup finished in 7.068s (kernel) + 4.819s (userspace) = 11.887s graphical.target reached after 4.799s in userspace
現状は11.9秒ほどかかっている模様。
GUI→CLI起動へ変更
CLI起動へ変更する。結果は以下の通り。
$ sudo systemctl set-default multi-user.target $ sudo rebot ~~~ after rebot ~~~ $ systemd-analyze Startup finished in 1.743s (kernel) + 7.076s (userspace) = 8.820s multi-user.target reached after 7.053s in userspace
8.8秒まで短縮された。2.9秒の改善。
解析
以下のコマンドでサービスのうち、起動処理のクリチカルチェインがわかる。 見方としては、@の後ろに書いてある時間がそのサービスが起動開始した時間、+の後ろに書いてある時間が起動にかかった時間である。ちなみに.targetはそれに必要なサービスを集めたものなので、それ自体に処理は存在しない。(例えばmulti-user.target はCLI起動に必要なサービスを集めたもの。Networkなどが含まれる。)
$ systemd-analyze critical-chain The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character. multi-user.target @7.053s └─networkd-dispatcher.service @1.247s +5.805s └─basic.target @1.049s └─sockets.target @1.049s └─snapd.socket @1.043s +5ms └─sysinit.target @1.038s └─systemd-timesyncd.service @821ms +217ms └─systemd-tmpfiles-setup.service @701ms +65ms └─local-fs.target @692ms └─local-fs-pre.target @692ms └─keyboard-setup.service @443ms +248ms └─systemd-journald.socket @433ms └─system.slice @429ms └─-.slice @417ms
見てみるとnetworkd-dispatcher.serviceが5.8秒と大きく足を引っ張っていそう。これをどうにかできないか考える。
networkd-dispatcher.serviceって何ぞ?
下記コマンドでサービスの説明や状態が確認できる。 "Dispatcher daemon for systemd-networkd"らしい。わからん。
$ systemctl status networkd-dispatcher.service ● networkd-dispatcher.service - Dispatcher daemon for systemd-networkd Loaded: loaded (/lib/systemd/system/networkd-dispatcher.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-01-14 22:08:56 JST; 31min ago Main PID: 3991 (networkd-dispat) Tasks: 2 (limit: 4174) CGroup: /system.slice/networkd-dispatcher.service └─3991 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers ...
どうやらPython3で/usr/bin/networkd-dispatcherを実行しているらしい。中身を見ると、Wifiの設定やリゾルバの設定などを行っていた。以下はNetworkManagerの説明だが、DispacherはNetwork接続時に実行するプログラムを管理するためのものである模様。
また、これはsystemd-networkd用のサービスである。今回はNetworkManagerに統一するので停止してしまう。
$ sudo systemctl disable networkd-dispatcher.service Removed /etc/systemd/system/multi-user.target.wants/networkd-dispatcher.service. $ sudo rebot ~~~ after rebot ~~~ $ systemd-analyze Startup finished in 1.833s (kernel) + 4.640s (userspace) = 6.473s multi-user.target reached after 4.614s in userspace
6.5秒まで短縮した。2.3秒の短縮。
個別にサービス停止
これ以降は大きな差がなかったので、すべてのサービスを見て不要なものは停止する。
$ systemctl -t service UNIT LOAD ACTIVE SUB DESCRIPTION alsa-restore.service loaded active exited Save/Restor apport.service loaded active exited LSB: automa avahi-daemon.service loaded active running Avahi mDNS/ console-setup.service loaded active exited Set console containerd.service loaded active running containerd cron.service loaded active running Regular bac dbus.service loaded active running D-Bus Syste getty@tty1.service loaded active running Getty on tt grub-common.service loaded active exited LSB: Record haveged.service loaded active running Entropy dae kerneloops.service loaded active running Tool to aut keyboard-setup.service loaded active exited Set the con kmod-static-nodes.service loaded active exited Create list ModemManager.service loaded active running Modem Manag networking.service loaded active exited Raise netwo NetworkManager.service loaded active running Network Man nv-l4t-usb-device-mode.service loaded active exited Config nvargus-daemon.service loaded active running Argus daemo nvgetty.service loaded active running UART on tty nvmemwarning.service loaded active running Display Low nvphs.service loaded active running PHS daemon nvs-service.service loaded active running NVS-SERVICE polkit.service loaded active running Authorizati resolvconf.service loaded active exited Nameserver rpcbind.service loaded active running RPC bind po rsyslog.service loaded active running System Logg serial-getty@ttyGS0.service loaded active running Serial Ge serial-getty@ttyS0.service loaded active running Serial Get setvtrgb.service loaded active exited Set console snapd.seeded.service loaded active exited Wait until speech-dispatcher.service loaded active exited LSB: Speech ssh.service loaded active running OpenBSD Sec systemd-journal-flush.service loaded active exited Flush J systemd-journald.service loaded active running Journal Ser systemd-logind.service loaded active running Login Servi systemd-modules-load.service loaded active exited Load Ker systemd-random-seed.service loaded active exited Load/Save systemd-remount-fs.service loaded active exited Remount Ro systemd-resolved.service loaded active running Network Nam systemd-sysctl.service loaded active exited Apply Kerne systemd-timesyncd.service loaded active running Network Tim systemd-tmpfiles-setup-dev.service loaded active exited Cr systemd-tmpfiles-setup.service loaded active exited Create systemd-udev-trigger.service loaded active exited udev Col systemd-udevd.service loaded active running udev Kernel systemd-update-utmp.service loaded active exited Update UT systemd-user-sessions.service loaded active exited Permit ubuntu-fan.service loaded active exited Ubuntu FAN user@1000.service loaded active running User Manage whoopsie.service loaded active running crash repor wpa_supplicant.service loaded active running WPA supplic
- alsa-restore.service: サウンド。停止。
- apport.service: クラッシュ時のログ収集。残す。
- avahi-daemon.service: ローカルネットワーク上のサービス検出(プリンタとか)。停止。
- console-setup.service: コンソールの設定。サービスでわざわざ設定しなくても大丈夫では?停止。
- containerd.service: Dockerの関係者。残す。
- cron.service: プログラムなどを自動実行。停止。
- dbus.service: Dbus。残す。
- getty@tty1.service: TTY。残す。
- grub-common.service: grubのなにか。grubは使ってないので停止。
- ModemManager.service: モデム。使う予定ないので停止。(LTEとかつかうならいるかも。)
ちょっと多すぎるのでここまでで一旦試してみる。
$ sudo systemctl disable alsa-restore.service avahi-daemon.service console-setup.service cron.service grub-common.service ModemManager.service Synchronizing state of avahi-daemon.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable avahi-daemon Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable cron grub-common.service is not a native service, redirecting to systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable grub-common Removed /etc/systemd/system/dbus-org.freedesktop.Avahi.service. Removed /etc/systemd/system/multi-user.target.wants/console-setup.service. Removed /etc/systemd/system/sockets.target.wants/avahi-daemon.socket. Removed /etc/systemd/system/dbus-org.freedesktop.ModemManager1.service. Removed /etc/systemd/system/multi-user.target.wants/ModemManager.service.
ログを見ると、alsa-restore.service はDisableできていない。このように依存関係などによってDisableできない場合がある。そのときはDisableより強いmaskを使用する。これはそのサービスを/dev/nullにリンクしてしまう。そのため十分に注意して操作を行い、動作確認をしっかり行うこと。
$ sudo systemctl mask alsa-restore.service Created symlink /etc/systemd/system/alsa-restore.service → /dev/null.
これで無効化できた。再起動して起動時間を計測。
$ sudo rebot ~~~ after rebot ~~~ $ systemd-analyze Startup finished in 1.767s (kernel) + 3.764s (userspace) = 5.532s multi-user.target reached after 3.741s in userspace
結果
5.5秒まで短縮。最初と比較すると倍以上高速化することができた。
すべてのサービスは確認できていないので、また時間があるときにつづきやります。
また、maskした影響で、他のサービスがエラーになったりしていないか、下記のコマンドで確認しておく。
$ systemctl -t service
JetsonNanoでPython3.8でDHT11
JetsonNanoでDHT11を動かした。
DHT11とは
GPIO1本で温度・湿度が図ることのできるセンサー。 精度やサンプリングレートは良くないが、温度も湿度も測れるセンサーとしては非常に安価であり、広く用いられている、らしい。
- データシート
Amazon.co.jp: VKLSVAN 3個セット DHT11温度センサー モジュール湿度センサーモジュール デュポンラインと付属 Arduinoに対応: DIY・工具・ガーデン
配線
以下の用につないだ。(画像はラズパイですが使ったのはJetson Nanoです。)
ライブラリ
ラズパイ用にはいろいろ公開されているがJetsonNano用のものはそんなになかった。 今回は以下を使用。
ただ、これはPython2用のライブラリなのでPython3用にポーティングして使用する。
手順
まずはリポジトリをクローン。
$ git clone --recurse-submodules -j8 https://github.com/GrgoMariani/NVidia-Jetson-DHT22-Python
READMEに書いてある通り、Pinを使用するものに変更する。今回は以下のようにする。
#define PIN0 jetsonnano_pin32 #define PIN1 jetsonnano_pin31
続いてビルド。今回はPython3で使うのでPython3でビルド。そうするとPy_Initializeじゃないのか?と聞かれる。(ネタバレするとPython3ではPy_InitModuleを使えないので手を加える必要がある。ビルドはできるのでひとまずこのまま進めてみる。)
$ python3 setup.py build ~~~ C_DHT.c:173:8: warning: implicit declaration of function ‘Py_InitModule’; did you mean ‘Py_Initialize’? [-Wimplicit-function-declaration] (void)Py_InitModule("C_DHT", C_DHT22Methods); ^~~~~~~~~~~~~ Py_Initialize C_DHT.c:174:1: warning: control reaches end of non-void function [-Wreturn-type] }; ~~~
インストール。
$ python3 setup.py install
試してみる。
$ python3 >>> import C_DHT Traceback (most recent call last): File "", line 1, in ImportError: /usr/local/lib/python3.8/site-packages/C_DHT.cpython-38-aarch64-linux-gnu.so: undefined symbol: Py_InitModule
Python3用ではないのでエラー。なのでソースコードを修正する。
対象:C_DHT.c
まずは以下の行を削除。
PyMODINIT_FUNC initC_DHT(void){ (void)Py_InitModule("C_DHT", C_DHT22Methods); };
そして以下の行を最後に追加。
static struct PyModuleDef C_DHT = { PyModuleDef_HEAD_INIT, "C_DHT", /* name of module */ "", /* module documentation, may be NULL */ -1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */ C_DHT22Methods }; PyMODINIT_FUNC PyInit_C_DHT(void){ return PyModule_Create(&C_DHT); };
ビルド+インストール。
$ python3 setup.py build $ python3 setup.py install
試す。
$ python3 >>> import C_DHT >>>
うまく行きました。
サーバーでDockerでJupyter notebook
リモートサーバーでJupyter notebookを使う場合、SSHでログイン後、--ipオプションをつけて起動すれば良い。
$ jupyter notebook --ip=* [W 12:06:27.853 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended. [I 12:06:27.854 NotebookApp] The port 8888 is already in use, trying another port. [I 12:06:27.862 NotebookApp] Serving notebooks from local directory: /home/XXX [I 12:06:27.862 NotebookApp] Jupyter Notebook 6.1.6 is running at: [I 12:06:27.862 NotebookApp] http://XXX-desktop:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224 [I 12:06:27.862 NotebookApp] or http://127.0.0.1:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224 [I 12:06:27.863 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [W 12:06:27.879 NotebookApp] No web browser found: could not locate runnable browser. [C 12:06:27.879 NotebookApp] To access the notebook, open this file in a browser: file:///home/XXX/.local/share/jupyter/runtime/nbserver-9183-open.html Or copy and paste one of these URLs: http://XXX-desktop:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224 or http://127.0.0.1:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224
起動確認後、クライアントでブラウザからhttp://<jupyter実行ホストのIP Address>:<port番号(上記だと8889)> にアクセスすればいい。port番号は使用されていないものでデフォルト(8888)から一番近いものが使用される。そのため、毎回同じでない可能性があるため、他人のNotebookにアクセスしないよう注意。(まあ、Passwordがあるので大丈夫だと思う。)
ただ、この状態だと環境が共通となってしまい不便である。そのためDockerを使用してJupyter notebookを実行する方法を示す。
準備(Dockerのインストール)
下記を参考にDockerをインストールする。GPUを使用したい場合は、Nvidia-Dockerも導入する。
コンテナ起動
コンテナを起動して、Jupyter notebookをインストールする。このとき、--network hostオプションを使用することで、外部からのアクセスが可能となる。
下記だとPython3.8のイメージでコンテナを起動している。
$ docker run -it --network host python:3.8-slim-buster bash # apt update && apt install python3-pip python-pip -y && pip3 install jupyter
通常時とほぼ同様に、Notebookを起動する。--allow-rootをつけておかないと怒られて起動しないので注意。
# jupyter notebook --ip=* --allow-root
起動後、http://<jupyter実行ホストのIP Address>:<port番号> にアクセスすると、Notebookが使える。設定したパスワードは覚えておく。
終了する
終了する場合はjupyter notebook を実行したターミナルでCtrl + CでNotebookを終了し、exitまたはCtrl + Dでコンテナから抜ける。
コンテナの動作状況は、以下のように確認できる。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ce6c11aa6e9a python:3.8-slim-buster "bash" 27 minutes ago Exited (0) 2 seconds ago great_meninsky
再起動する
コンテナをRestartして、コンテナのなかに入る。この場合、コンテナIDまたはコンテナ名が必要なので、上のdocker psコマンドで調べておく。
コンテナIDの場合
$ docker restart ce6c11aa6e9a $ docker exec -it ce6c11aa6e9a bash # jupyter notebook --ip=* --allow-root
コンテナ名の場合
$ docker restart great_meninsky $ docker exec -it great_meninsky bash # jupyter notebook --ip=* --allow-root
bashが必要ない場合は、直接起動してもOK。
$ docker restart ce6c11aa6e9a $ docker exec -it ce6c11aa6e9a jupyter notebook --ip=* --allow-root
Jetson Nanoのセットアップ方法(Docker)
Jetson Nanoを購入したので、セットアップ方法をメモしておく。 購入から、Nvidia Docker上でCUDAを動かすところまで行う。 セットアップ後、ストレージは十数GB消費されていたので、SDカードは32GB以上のものを使用するといい。
セットアップ方法の種類
セットアップには以下の3種類がある。
WindowsPCを使用する場合は1番のみしかできないため、この方法で行った。
1. 配布しているイメージをSDカードにフラッシュする
書き込み方法
配布イメージ2:学習用のイメージ
2. NVIDIA SDK Managerを使用する
3. 独自にRootFSを用意してフラッシュする
初期セットアップ
イメージをSDカードにフラッシュし終わったら、Jetson Nanoに挿入し、モニター、キーボード、マウスを接続し、電源をつけて画面にしたがってユーザー名などの設定をおこなう。
完了したら、再起動を行う。
アップデート
Aptパッケージのアップデートを行う。 デスクトップ上でCtrl + Shift + T でターミナルを開き、以下を実行する。
$ sudo apt update $ sudo apt upgrade
Docker groupへの追加
sudo をつけなくてもdockerコマンドが使用できるよう、グループに追加する。
※ 該当ユーザーでログインしていること。
※ Dockerを事前にインストールしておくこと。(Jetpack SDKにはすでにインストールされているため必要なし。)
$ sudo gpasswd -a $USER docker
DockerイメージのPull
NvidiaはJetson用にDocker イメージを配布している。これを使用するとセットアップが楽。 以下にアクセスし、ユーザー登録し、欲しいコンテナを探す。TensorFlowインストール済のものなど様々ある。
今回はDeeplearning用に一通り揃っているイメージを使用する。 以下コマンドでイメージをPullする。また、イメージがPullできていることを確認する。
$ docker pull nvcr.io/nvidia/l4t-ml:r32.4.4-py3
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nvcr.io/nvidia/l4t-ml r32.4.4-py3 7ef384cfc62b 2 months ago 4.41GB
Docker コンテナの起動&確認
コンテナを起動し、サンプルプログラムを実行しGPUを認識していることを確認する。NVIDIA Tegra X1が認識されていればOK。
$ docker run -it --rm --privileged --runtime nvidia --network host nvcr.io/nvidia/l4t-ml:r32.4.4-py3 bash
# cd /usr/local/cuda/samples/bin/aarch64/linux/release # ./deviceQuery ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "NVIDIA Tegra X1" CUDA Driver Version / Runtime Version 10.2 / 10.2 CUDA Capability Major/Minor version number: 5.3 Total amount of global memory: 3964 MBytes (4156796928 bytes) ( 1) Multiprocessors, (128) CUDA Cores/MP: 128 CUDA Cores GPU Max Clock rate: 922 MHz (0.92 GHz) Memory Clock rate: 13 Mhz Memory Bus Width: 64-bit L2 Cache Size: 262144 bytes Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 32768 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 1 copy engine(s) Run time limit on kernels: Yes Integrated GPU sharing Host Memory: Yes Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Device supports Compute Preemption: No Supports Cooperative Kernel Launch: No Supports MultiDevice Co-op Kernel Launch: No Device PCI Domain ID / Bus ID / location ID: 0 / 0 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.2, CUDA Runtime Version = 10.2, NumDevs = 1 Result = PASS
プライバシーポリシー・免責事項
プライバシーポリシー
個人情報の利用目的
当ブログでは、お問い合わせや記事へのコメントの際、名前やメールアドレス等の個人情報を入力いただく場合がございます。 取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、これらの目的以外では利用いたしません。
広告について
当ブログでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。
Cookieを無効にする方法やGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご確認ください。
また、当方は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。
アクセス解析ツールについて
当ブログでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにクッキー(Cookie)を使用しております。トラフィックデータは匿名で収集されており、個人を特定するものではありません。
コメントについて
当ブログへのコメントを残す際に、IP アドレスを収集しています。 これはブログの標準機能としてサポートされている機能で、スパムや荒らしへの対応以外にこのIPアドレスを使用することはありません。 なお、全てのコメントは管理人が事前にその内容を確認し、承認した上での掲載となります。あらかじめご了承ください。
免責事項
当ブログからのリンクやバナーなどで移動したサイトで提供される情報、サービス等について一切の責任を負いません。
また当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。情報が古くなっていることもございます。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。
著作権について
当ブログで掲載している文章や画像などにつきましては、無断転載することを禁止します。
当ブログは著作権や肖像権の侵害を目的としたものではありません。著作権や肖像権に関して問題がございましたら、お問い合わせフォームよりご連絡ください。迅速に対応いたします。
リンクについて
当ブログは基本的にリンクフリーです。リンクを行う場合の許可や連絡は不要です。
ただし、インラインフレームの使用や画像の直リンクはご遠慮ください。