カテゴリー: PC Page 2 of 39

ソースコードからインストールしたOpenSSL 3.1.1を3.2.1にアップグレード。

こちらの記事から、OpenSSLのバージョンが上がっていたので対応します。

概要

脆弱性やバグフィックス版のOpenSSL3.2.1にアップグレードします。

環境、前提

  • Ubuntu 20.04
  • ソースコードからOpenSSL3.1.1をインストール・設定済み

さっくりとした手順

  1. rootに昇格します。
  2. 作業用ディレクトリにソースコードを取得・展開します。
  3. ソースからインストール(アップグレード)を行います。
  4. バージョンアップを確認します。

作業前にバージョン確認

openssl version -a

OpenSSL 3.1.1 30 May 2023 (Library: OpenSSL 3.1.1 30 May 2023)
built on: Thu Jun 22 05:19:59 2023 UTC
platform: linux-x86_64
options: bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DZLIB -DNDEBUG
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/ssl/lib64/engines-3"
MODULESDIR: "/usr/local/ssl/lib64/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfffa3203578bffff:0x7a9

rootに昇格

この手の作業はrootで行った方が手間が少ないです。その分、注意を払いましょう。

sudo su -

作業用ディレクトリに移動

cd /hoge && pwd

任意のディレクトリを指定します。

ソースコードの取得

  • git clone
git clone https://github.com/openssl/openssl -b openssl-3.2.1

2024/04/02時点での最新安定版を指定します

  • ソースコードのディレクトリに移動
cd openssl

ソースからアップグレード(インストール)

  • コンフィグ設定
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
  • make
make

makeは時間がかかります。状況を時折確認しながら待ちましょう。

  • 整合性確認
make test

同様にmake testも時間がかかります。

  • アップグレード(インストール)
make install

アップグレード後のバージョン確認

  • SSLのバージョンアップ確認
openssl version -a

OpenSSL 3.2.1 30 Jan 2024 (Library: OpenSSL 3.2.1 30 Jan 2024)
built on: Tue Apr 2 01:28:56 2024 UTC
platform: linux-x86_64
options: bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DZLIB -DNDEBUG
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/ssl/lib64/engines-3"
MODULESDIR: "/usr/local/ssl/lib64/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfffa3203578bffff:0x7a9

バージョンが上がっていることを確認します。

必要に応じてサーバの再起動を行い、作業完了です。

補足:Growiバージョンアップ→切り戻し時に行ったこと。(nodeのダウングレード)

Growi v6.3.2→v7.0.0にアップグレード後、アイコンが非表示になる状況を更に確かめるため、以下の作業を行いました。

環境

  • Ubuntu 22.04
  • node.js 18.20.0
  • npm 10.5.0
  • yarn 1.22.21
  • growi v6.3.2

nodeをアップグレード後に再アップグレード

https://docs.growi.org/ja/admin-guide/upgrading/70x.html

こちらのドキュメントで、サポートしているnodeが20にアップデートされています。

なので、一度、nodeのバージョンを上げます。

node 20 にアップグレード

  • リポジトリ追加
sudo curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash
  • パッケージのアップデート
sudo aptitude update
  • node 20にアップグレード
sudo aptitude upgrade

更新対象にnodeが出てくるので更新を行います

  • アップグレード確認
node -v
v20.12.0

再びGrowiアップデート

手順はこちら。

https://atelier.reisalin.com/projects/zettel/knowledgebase/articles/28

ですが、アイコンが非表示になる状況は変わりません。

Growiダウングレード(切り戻し) → 失敗

前回のエントリーを元にGrowiのバージョンダウンを行いましたが、Growi v6.3.2はnode 20をサポートしていません。なので、yarn通らず。nodeのバージョンダウンを行います。

nodeのダウングレード

こちらを参考にしました。

https://qiita.com/kbys7367/items/0db8d98ef31a12028970

  • node管理(n)のインストール
sudo npm install -g n
  • nodeのバージョン確認
sudo n ls-remote --all

18系の最新版が18.20.0だったのを確認しました。

  • nodeダウングレード
sudo n 18.20.0
  • nodeダウングレード確認
 node -v
v18.20.0

再びのGrowiダウングレード(切り戻し) → 成功

前回のエントリーを元にもう一度Growiのバージョンダウンを行い、yarmも通ることを確認。

取り急ぎ:原因がnodeではないことが判明しました。

Growiのバージョンダウン(システム切り戻し)。

環境

  • Ubuntu 22.04
  • node.js 18.20.0
  • npm 10.5.0
  • yarn 1.22.21
  • growi v6.3.2

の状況下で、growiのバージョンアップをしたら、以下の事象が発生したので、対応したときのメモです。

行ったこと

https://atelier.reisalin.com/projects/zettel/knowledgebase/articles/28

上記の通り、growiをv7.0.0にアップグレード。

発生した事象

左ツールバーや上部に表示されるアイコン全てが文字とリンクだけとなりました。

対処

視認性も操作もしづらいので、元のバージョンに戻します。

growiサービスを停止します

systemctl status growi.service
# サービススクリプトを[growi]にしている場合
# active (running)を確認します

sudo systemctl stop growi.service

systemctl status growi.service
# inactive (dead)を確認します

growiディレクトリに移動します

cd /opt/growi
# 自分の環境に合わせます。

最新版がリリースされていることを確認します。

sudo git fetch --tags

sudo git tag -l
# スペースで確認していき、以前のバージョンに戻します。
# 2023/03/28 利用していたバージョンはでv6.3.2

チェックアウトして切り戻しを行います。

sudo git stash

sudo git checkout 【以前のバージョン】

sudo yarn
# マシンスペックによっては相当時間がかかります
# Done in 【時間】と書かれていたらアップグレード完了です

growiサービスを起動します。

systemctl status growi.service
# inactive (dead)を確認します

sudo systemctl start growi.service

systemctl status growi.service
# サービススクリプトを[growi]にしている場合
# active (running)を確認します

切り戻しを確認します。

  1. ブラウザから設定したgrowiのドメイン/IPにアクセスします。
  2. 画面下部にあるバージョンがチェックアウトしたバージョンであることを確認します。

アイコンが元に戻りました。

要検証

今回はあくまで切り戻し。新規バージョンのgrowiは使いたいので、

  • 新規にv7.0.0をインストールしたらどうなるか?
  • 他に再現するか?

の検証が必要です。

Nextcloud、PHPのアップロードファイルサイズを変更。

概要

Nextcloudの管理画面から出てくるPHPの最大アップロードファイルサイズを変更します。

環境

2024/03/26現在

  • Ubuntu 20.04
  • Apache 2.4.58
  • Nextcloud 28.0.3
  • PHP 8.1.27

手順

現在のファイルサイズを確認

  • upload_max_filesize
cat /etc/php/8.1/apache2/php.ini |grep max_filesize
upload_max_filesize = 2M
  • post_max_size
cat /etc/php/8.1/apache2/php.ini |grep max_size
post_max_size = 8M

それぞれ、筆者の環境です。

バックアップ取得

  • バックアップ
sudo cp -pi /etc/php/8.1/apache2/php.ini /path/to/backup/directory/php.ini.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • バックアップ取得確認
diff -u /etc/php/8.1/apache2/php.ini /path/to/backup/directory/php.ini.$(date +%Y%m%d)

エラーが出なければ(差分がなければ)バックアップはできています。

ファイル書き換え

  • ファイル書き換え
sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 100M/; s/post_max_size = 8M/post_max_size = 120M/' /etc/php/8.1/apache2/php.ini

※upload_max_filesize = 2Mとpost_max_size = 8Mは、自分の設定を入れてください。

  • ファイル書き換えの差分表示
diff -u /path/to/backup/directory/php.ini.$(date +%Y%m%d) /etc/php/8.1/apache2/php.ini

先ほどバックアップしたファイルを指定します。

 ; https://php.net/post-max-size
-post_max_size = 8M
+post_max_size = 120M

 ; Automatically add files before PHP document.
 ; https://php.net/auto-prepend-file
@@ -847,7 +847,7 @@

 ; Maximum allowed size for uploaded files.
 ; https://php.net/upload-max-filesize
-upload_max_filesize = 2M
+upload_max_filesize = 100M

設定反映

  • apacheのステータス確認
systemctl status apache2.service

active(running)を確認します

  • apache再起動
sudo systemctl restart apache2.service
  • apacheのステータス確認
systemctl status apache2.service

active(running)を確認します

設定反映確認

先ほど修正を行ったNextcloudに管理者権限でアクセスします。

管理>システムに進みます。

最大アップロードファイルサイズが修正した値になっていれば設定完了です。

RHEL(Red Hat Enterprise Linux)のライセンスとサーバを紐付け。(サブスクリプション更新)

概要

Redhatのサブスクリプション更新、忘れがちになるのでメモっておきます。

前提

  • Red Hat Enterprise Linuxのライセンスを所有している。
  • RedHatのアカウントから、サブスクリプション番号が参照できる。
  • サブスクリプション更新の有効期限を過ぎている
    • 更新日前は付け替えできません

手順

※全て管理者権限で実施します。※

RedHatサーバにSSHログインします。

  • OS確認
cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.3 (Ootpa)

割り当て済みのプールIDを確認します。

  • subscription-manager確認
subscription-manager list --consumed

ここに出てくるContractとPool ID:を控えておきます。

控えた後はサーバから抜けます。

  • 現在のプールIDとの割り当て確認
  1. RedHatのサイト>サブスクリプション管理から、現在割り当てられているコントラクト番号とプールIDが一致するか確認します。
  2. RedHatのサイト>サブスクリプション管理から、新しく割り当てられたサブスクリプションを探します。
  3. 新しく有効になったサブスクリプションを開き、プールIDを控えておきます。

※このプールIDは、有効化されるまで出てきません。

新しいプールIDを有効化します。

  • 古いプールIDをデタッチ
subscription-manager remove --pool=[現在のプールID]
  • 新しいプールIDをアタッチ(有効化)
subscription-manager attach --pool=[新しいプールID]

有効化を確認します。

  • subscription-manager確認
subscription-manager list --consumed

以下を確認します。

  • 先ほどアタッチしたプールIDとなっていること。
  • 有効期限が一致していること。
  • dnf updateできること。

ChatGPTが作ったシェルスクリプトをBing(Copilot)が修正

以前にChatGPTが作成した天気予報スクリプト。

これをBing(Copilot)が改善・修正したらどうなるかという検証です。

修正前のスクリプト

#!/bin/bash

# ユーザーに都市名を尋ねる
echo "都市名を入力してください:"
read city

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
ansiweather -l "$city"

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
curl wttr.in/"$city?lang=ja"

行うことは単純。プロンプトで都市名を尋ね、その都市の天気予報をansiweatherとwttr.inで表示させるというもの。

これを改善案を示して欲しいですと聞いてみました。

修正後のスクリプト

  • getweather.sh
#!/bin/bash

# 都市名をコマンドライン引数から取得するか、ユーザーに尋ねる
city=$1
if [[ -z "$city" ]]; then
echo "都市名を入力してください:"
read city
if [[ -z "$city" ]]; then
echo "都市名が入力されませんでした。"
exit 1
fi
fi

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
if ! ansiweather -l "$city"; then
echo "ansiweatherから情報を取得できませんでした。"
fi

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
if ! curl -s "wttr.in/${city}?lang=ja"; then
echo "wttr.inから情報を取得できませんでした。"
fi

スクリプトの動き

対話式

./getweather.sh 

都市名を引数にする

./getweather.sh Paris

と、対話式でもコマンドからでも実行できるようになっています。この、都市を引数に指定することによって、他のシェルスクリプトにも転用できるのはいい改良案という形でした。

Ubuntu 22.04に資産管理システム『Snipe-IT』をインストール。

環境

前提

  • ドメインで名前解決できること
  • そのドメインに即した証明書があること

さっくりとした手順

  1. Snipe-IT用のDBを作成します。
  2. Snipe-ITをダウンロードします。
  3. Composerでインストールを行います。
  4. Apacheの設定を行います。
  5. Web画面からインストールを行います。

手順

  • Web画面以外はSSH/ターミナルで操作を行います。
  • Apacheの実行ユーザはwww-dataです。自分の環境に合わせます。

MySQLでDB作成

  • コンソールログイン
mysql -u root -p
  • DB作成
CREATE DATABASE snipeit character set utf8mb4;
CREATE USER 'snipeit'@'localhost' IDENTIFIED BY 'password';

この'password'は任意のパスワードに変更してください

GRANT ALL ON snipeit.* TO 'snipeit'@'localhost';
flush privileges;
exit
  • DB作成確認
  • 設定したパスワードでログインできることを確認
mysql -u snipeit -p
  • DB確認
SHOW DATABASES;

snipeitがあることを確認

  • ログアウト
exit

プログラム配置

  • Webサイト配置ディレクトリに移動
cd /home/www-data && pwd

自分の環境に合わせます。

  • ダウンロード
sudo -u www-data git clone https://github.com/snipe/snipe-it snipe-it
  • ディレクトリ移動
cd snipe-it
  • .envを作成
sudo cp -pi .env.example .env
  • .env修正

※教義・信仰に沿ったエディタで編集します。※

  • 修正箇所
APP_URL=http://ドメイン名

snipe-itを動かすドメイン名です。

APP_TIMEZONE='Asia/Tokyo'

タイムゾーンを指定します。

DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD= 

DB名/ユーザ名/パスワードは上述したDB作成で指定したものです。

修正後、.envを保存します。

composerでsnipe-itインストール

  • 依存関係のアップデート
sudo -u www-data composer update --no-plugins --no-scripts
  • インストール
sudo -u www-data composer install --no-dev --prefer-source --no-plugins --no-scripts
  • APPキー作成
sudo -u www-data php artisan key:generate

途中のプロンプトには「yes」を入力します。

バーチャルサイト作成

  • ログ格納ディレクトリを作成
sudo mkdir -p /var/log/snipeit

※自分の環境に合わせます。

  • ログ格納ディレクトリの権限変更
sudo chown -R www-data:www-data /var/log/snipeit
  • バーチャルファイル作成
  • Snipe-IT用の設定ファイル作成
  • 【】の箇所は、自分の環境に合わせて修正してください。
cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/snipeit.conf
<VirtualHost *:80>
    # ドメイン名を指定します
    servername 【hoge.example.com】
    # HTTPアクセスを強制的にHTTPSにリダイレクトします
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    # ドメイン名を指定します
    ServerName 【hoge.example.com】
    # 上述したログディレクトリを指定します。
    CustomLog /var/log/snipeit/snipeit_access.log combined
    ErrorLog /var/log/snipeit/snipeit_error.log

    # Snipe-ITのプログラムを配置したディレクトリを指定します。
    DocumentRoot 【/home/www-data/snipe-it/public】
    <Directory 【/home/www-data/snipe-it/public】>
        Options -MultiViews
        AllowOverride All
        Require all granted
    </Directory>

#SSL設定
  SSLEngine on
    Protocols h2 http/1.1

    # SSL証明書を指定します
    SSLCertificateFile 【/etc/certs/hoge.example.com.crt】
    # 秘密鍵を指定します
    SSLCertificateKeyFile 【/etc/private/hoge.example.com.key】

    # 中間証明書が発行元から別ファイルで提供されている場合は、このすぐ下をコメントアウトして中間証明書を指定します
    # SSLCACertificateFile 【/etc/certs/hoge.example.com.CA.crt】

#セキュリティヘッダー付与

    Header always set Strict-Transport-Security "max-age=63072000"
    Header set X-Content-Type-Options "nosniff"
    Header always append X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"

</VirtualHost>

# これらのセクションはSSL暗号化強度を高めるための記述です
# </VirtualHost>の外側に書くことにご注意ください

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
__EOF__
  • コンフィグ有効化
sudo a2ensite snipeit.conf
  • コンフィグの文法確認
sudo apache2ctl configtest

Syntax OKを確認します

  • apache再起動
sudo systemctl restart apache2.service

Web画面からの設定確認

ブラウザで

https://設定したURL

にアクセスします。

ここまで来れば目前です。ガイダンスに従って管理者情報などを入力。

このようなダッシュボードが確認できればインストール成功です。

BookStackにGoogleフォントを設定。

こちらでBookStackに任意のフォントを設定する方法を説明しましたが、

Webで公開されているGoogleフォントに置き換えます。

設定

管理者権限でログイン後、
設定>カスタマイズ>カスタムheadタグに進みます。

以下のコードを入れます。

<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100..900&display=swap" rel="stylesheet">
<style>
body, h1, h2, h3, h4, h5, h6 {
font-family: 'Noto Sans JP', sans-serif;
}
</style>

ここでは Noto Sans JPを入れています。適宜合わせてください。

設定後、

のように、Googleフォントに変わっていれば設定完了です。

ChatGPTによるスクリプト修正。(通貨変換)

海外通販で、ドル円計算が面倒なのでスクリプト化。

以前、ChatGPTで作成した通貨変換スクリプトを、以下のようにChatGPT自身に修正してもらいました。

  1. CSVへの記録ではなく、○ドル◆円のように表示する。
  2. 通貨ペアの変換前の数値をプロンプトで尋ねる。(空白エンターは1)
  3. その数値で計算する。(例えば3ドル○円など)

修正した結果がこちらです。

スクリプト内容

  • currency_check.sh
#!/bin/bash

#### 変数定義ここから #####
# 通貨ペアの変換前の数値を取得する。
read -p "変換したい通貨の数値を入力してください(空白エンターは1): " conversion_factor
if [ -z "$conversion_factor" ]; then
    conversion_factor=1
fi

# 通貨ペアを変数化する。
# USDJPY=ドル円
# EURUSD=ユーロドル
# など、以下のURLに沿ったものを指定
base_currency="USD"
target_currency="JPY"
#### 変数定義ここまで ####

# 1. コマンドを実行してデータを取得し、標準エラー出力を/dev/nullにリダイレクトする。
data=$(wget -O - -U "" http://www.gaitameonline.com/rateaj/getrate 2> /dev/null)

# 2. 現在時刻を取得する。
date=$(date '+%Y/%m/%d')
time=$(date '+%H:%M')

# 3. 指定された通貨ペアの情報を取得する。
currency_data=$(echo "$data" | grep -o '{"high":"[0-9]*\.[0-9]*","open":"[0-9]*\.[0-9]*","bid":"[0-9]*\.[0-9]*","currencyPairCode":"'$base_currency$target_currency'","ask":"[0-9]*\.[0-9]*","low":"[0-9]*\.[0-9]*"}')

# 4. 必要な情報を取り出し、並び替える。
currencyPairCode=$(echo "$currency_data" | grep -o 'currencyPairCode":"'$base_currency$target_currency'"' | cut -d ':' -f 2 | tr -d '"')
open=$(echo "$currency_data" | grep -o 'open":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
high=$(echo "$currency_data" | grep -o 'high":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
bid=$(echo "$currency_data" | grep -o 'bid":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
ask=$(echo "$currency_data" | grep -o 'ask":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
low=$(echo "$currency_data" | grep -o 'low":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')

# 5. 結果を表示する。
echo "$date $time ${conversion_factor} $base_currency は $target_currency で以下の通りです。"
echo "始値: $open $target_currency"
echo "高値: $high $target_currency"
echo "売値: $bid $target_currency"
echo "買値: $ask $target_currency"
echo "安値: $low $target_currency"
  • 実行権付与
chmod +x currency_check.sh

動き

./currency_check.sh
変換したい通貨の数値を入力してください(空白エンターは1): 74
2024/03/13 14:25 74 USD は JPY で以下の通りです。
始値: 10,926.10 JPY
高値: 10,926.10 JPY
売値: 10,924.62 JPY
買値: 10,925.36 JPY
安値: 10,895.02 JPY

と、ブラウザを開くことなく結果が出るようになりました。

Linuxコマンド:ansiweatherのチートシート。

コマンドライン上から簡単な天気予報を行えるansiweatherのちょっとした早見表です。

主なオプション

オプション説明
-l location場所を指定します。city,CCの形式で、CCは国コードです
-u system単位系を指定します。metricかimperialです
-f days予報モードを切り替えます。指定した日数分の予報を表示します
-F予報モードを切り替えます。次の5日間の予報を表示します
-a valueANSIカラーの表示を切り替えます。trueかfalseです
-s value記号の表示を切り替えます。trueかfalseです
-i valueUVインデックスの表示を切り替えます。trueかfalseです
-w value風のデータの表示を切り替えます。trueかfalseです
-h value湿度のデータの表示を切り替えます。trueかfalseです
-p value気圧のデータの表示を切り替えます。trueかfalseです
-d value日の出/日の入りのデータの表示を切り替えます。trueかfalseです
-vバージョンを表示します

実行例

  • 東京の現在の天気を絵文字付きで表示
ansiweather -l Tokyo,JP -s true

 Weather in Tokyo => 9 °C ☔ - Wind => 3.6 m/s ESE - Humidity => 69 % - Pressure => 1002 hPa 
  • ロンドンの5日分の天気予報を表示
ansiweather -l London,UK -F

 London forecast => Fri Mar 08: 9/5 °C - Sat Mar 09: 12/7 °C - Sun Mar 10: 9/6 °C - Mon Mar 11: 9/6 °C - Tue Mar 12: 11/5 °C 
  • 尾道の日の出・日の入りを表示
ansiweather -l Onomichi,JP -d true

 Weather in Onomichi => 7 °C - Wind => 7.31 m/s WNW - Humidity => 50 % - Pressure => 1013 hPa - Sunrise => Mar 08 06:27:27 AM - Sunset => Mar 08 06:08:49 PM

このあたりをmotodに仕込んでおくと、ログインのたびに天気予報が表示されるので便利です。

Page 2 of 39

Powered by WordPress & Theme by Anders Norén