
イギリスの計算機科学者でありワールドワイドウェブ(WWW)の発明者として知られるティム・バーナーズ=リー氏が、「私がWWWを無料で提供した理由」について語り、現代のウェブにおける問題点を指摘しました。
WWWが機能する上で大切だったのは、「誰もが利用することができ、そして使いたいと思うこと」だったとのこと。ただでさえ難しいこの理想を実現するためには、検索やアップロードごとに料金を請求するわけにはいかず、WWWを成功させるには無料である必要がありました。1993年、バーナーズ=リー氏はCERNの上司らを説得し、WWWの知的財産をパブリックドメインに寄付してもらい、WWWをすべての人々に開放しました。
バーナーズ=リー氏は、今日のウェブにおいてもはや自由は存在せず、少数の大規模プラットフォームがユーザーの個人データを収集して商業ブローカーや抑圧的な政府と共有し、10代の若者のメンタルヘルスに悪影響を及ぼすアルゴリズムが偏在していると指摘。バーナーズ=リー氏は、「サービスの利用と引き換えに個人データを売買することは、私が描く自由なウェブのビジョンとは全く相容れません」と主張しています。
バーナーズ=リー氏は、「私はWWWを無料で提供しました。なぜなら、ウェブはすべての人にとって機能して、初めて機能するものだと信じていたからです。今日、私はその考えがかつてないほど真実であると信じています。規制とグローバルガバナンスは技術的には実現可能ですが、政治的な意志に大きく依存しています。もし私たちがその意志を結集できれば、ウェブを文化の境界を越えた協働、創造性、そして思いやりのためのツールとして復活させるチャンスがあります。私たちは個人に再び力を与え、ウェブを取り戻すことができるのです。まだ遅くはありません」と述べました。
⇧ 人類は歴史から学ばないので、
『「善意」で構築された仕組みが「悪意」によって破壊される』
を繰り返している気がするのよね...
ちなみに、「WWW(World Wide Web)」について、Wikipediaによると、
World Wide Web(ワールド・ワイド・ウェブ、略名:WWW)はインターネット上で提供されているハイパーテキストシステムである。Web、ウェブ、W3(ダブリュー スリー)とも呼ばれる。
1990年代のマルチメディアブームで登場したシステムの内で最も普及したシステムの1つで、技術の進歩に合わせて現在も仕様が更新され続けている。今ではハイパーテキストの枠組みを超えた仕様も追加され、アプリケーションの基盤としても活用されている。
インターネットとWorld Wide Webは非常に混同されやすく、誤解に基づく俗称として「インターネット」という表現がWWWを指す場合もある。その逆で「ウェブ」という表現がインターネットを示す場合もある。Web会議はこれに相当する。
歴史
World Wide Webは1950年前後にその起源をもち、1989年に欧州原子核研究機構 (CERN) のティム・バーナーズ=リーによって発明された。1990年後半にその発明は実装され、1990年12月20日に世界初のウェブページが公開された。その後各国でウェブページが続々と公開され、ビューアー(webブラウザ)の普及やプロトコルの仕様策定を経ながら爆発的に広がり、現在に至る。
前史
ハイパーテキストの思想自体は1945年に発表されたMemexと、1959年に開発が開始されたoN-Line System、1960年に開始されたザナドゥ計画に起源を持つが、World Wide Webの直接の起源については1980年にティム・バーナーズ=リーがロバート・カイリューと構築したENQUIRE (エンクワイア)に遡ることができる。
その名称は「エンクワイア・ウィズィン・アポン・エブリシング」というビクトリア朝時代の日常生活のハウツー本に由来していて、バーナーズ=リーが幼少のころを思い出して付けたものである。それは現在のウェブとは大分違うが、根本的なアイデアの多くを含んでおり、更にはバーナーズ=リーの WWW 後のプロジェクトである セマンティック・ウェブ の考え方をも含んでいた。しかし、ENQUIRE は一般に公表されるまでには至らなかった。
⇧ とあるのですが、1945年に着想があったというのが驚愕ですな。ちょうど「第二次世界大戦」が終戦を迎えた時期に重なる感じということになるっぽいのか...
今が、2025年なので、80年経っていることになるんですな。
Apache Dorisって?
少し前に、
⇧ 上記の記事で「Apache Iceberg」なるものに触れたのですが、
Using Doris and Iceberg
As a new open data management architecture, the Data Lakehouse integrates the high performance and real-time capabilities of a data warehouse with the low cost and flexibility of a data lake, helping users more conveniently meet various data processing and analysis needs. It has been increasingly applied in enterprise big data systems.
https://doris.apache.org/docs/3.0/lakehouse/best-practices/doris-iceberg
In recent versions, Apache Doris has deepened its integration with data lakes and now offers a mature Data Lakehouse solution.
https://doris.apache.org/docs/3.0/lakehouse/best-practices/doris-iceberg
⇧ 何やら、「Apache Doris」なるものものが存在するそうな。
「Apache Doris」とは?
What's Apache Doris
Apache Doris is an MPP-based real-time data warehouse known for its high query speed. For queries on large datasets, it returns results in sub-seconds. It supports both high-concurrency point queries and high-throughput complex analysis. It can be used for report analysis, ad-hoc queries, unified data warehouse, and data lake query acceleration. Based on Apache Doris, users can build applications for user behavior analysis, A/B testing platform, log analysis, user profile analysis, and e-commerce order analysis.
https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris
Apache Doris, formerly known as Palo, was initially created to support Baidu's ad reporting business. It was officially open-sourced in 2017 and donated by Baidu to the Apache Software Foundation in July 2018, where it was operated by members of the incubator project management committee under the guidance of Apache mentors. In June 2022, Apache Doris graduated from the Apache incubator as a Top-Level Project. By 2024, the Apache Doris community has gathered more than 600 contributors from hundreds of companies in different industries, with over 120 monthly active contributors.
https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris
Apache Doris has a wide user base. It has been used in production environments of over 5000 companies worldwide, including giants such as TikTok, Baidu, Tencent, and NetEase. It is also widely used across industries from finance, retailing, and telecommunications to energy, manufacturing, medical care, etc.
https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris
⇧ 元々は「Baidu」の「広告事業」を支援する目的で開発されたらしい。「データウェアハウス(DWH:Data Ware House)」の1種のようだ。
「Baidu」は、Wikipediaの情報によると、
百度(バイドゥ、拼音: )は、中華人民共和国で最大の検索エンジンを提供する会社である。中国三大ビッグ・テック企業、BAT(百度,アリババ,テンセント)の一つ。創業は2000年1月。本社は北京市にあり、百度百科や百度入力方法なども提供している。
全世界の検索エンジン市場において、Googleに次いで第2位(米comScore社、2009年8月調べ)、中国大陸ではGoogleなどは利用できず、百度が最大のシェアを占める。中国発の会社であり、また中国を主要市場としているため、「中国のGoogle」と呼ばれることもある。
2020年12月13日現在のアレクサランキングでの順位は、世界4位、中国国内2位である。
⇧ とあり、「中国」における「検索エンジン」の市場を席捲している企業らしい。
なのだが、「国」が「Google」の利用を禁止しているらしいので、「中国」で生活しているユーザーに選択肢は無いらしい...
実質、「中国」においては「中国」の国内企業から提供される「検索エンジン」のみの市場となっている気がするので、全世界の市場で統計しても意味が無い気はする...
とは言え、「中国」の人口は多いので膨大な需要が見込めるわけで、且つ、「競合他社」については「中国」内だけを考慮するだけでも良さそうなのは「羨まけしからん」ということなのかしらね...
話が脱線しましたが、「MPP」は「Massively Parallel Processing」という「アーキテクチャ」の略らしい。
「Google検索」における「AI」の回答では、
Example: Cloud data warehouses like Snowflake, BigQuery, and Amazon Redshift are built on MPP architecture.
⇧ とあり、メジャーどころの「クラウドサービスプロバイダー」が提供している「データウェアハウス(DWH:Data Ware House)」の「マネージドサービス」のメジャーどころの「サービス」で利用されている「アーキテクチャ」らしい。
「Apache Doris」は「分散システム」と言えそうなのだが、
Usage Scenarios
As shown in the figure below, after various data integrations and processing, data sources are typically ingested into the real-time data warehouse Doris and offline lakehouses (such as Hive, Iceberg, and Hudi). These are widely used in OLAP analysis scenarios.
https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris
⇧ 他の「ソフトウェア」との関係は上図のようになるらしい。
で、公式のドキュメントを見た感じでは、
Overall Architecture
Apache Doris uses the MySQL protocol, is highly compatible with MySQL syntax, and supports standard SQL. Users can access Apache Doris through various client tools, and it seamlessly integrates with BI tools. When deploying Apache Doris, you can choose between a storage-compute integrated architecture or a storage-compute separated architecture based on hardware environments and business needs.
https://doris.apache.org/docs/3.0/gettingStarted/what-is-apache-doris
⇧「MySQL」の利用が必要ということらしい。
Apache Icebergの使い方もよく分かっていないがApache Dorisの環境も構築してみる
で、ネットの情報を漁ってみたものの、日本で利用されていないのか、「Docker Compose」で「Apache Doris」を試している情報を発信している人間はいなかった(哀)...
公式のドキュメントによると、
⇧「クラスター構成」で構築する場合、
- Cluster Deployment
- Manual Deployment
- Deploy with Docker
- Deploy on Kubernetes
- Deploy on AWS
の4パターンが用意されているらしい。
ただ、今回は、
⇧ 上記の公式のサンプルで、
を連携してくれているようなので、利用してみる。
「Docker Compose」を利用して構築するようなので、公式のドキュメントで言うところの「3. Deploy with Docker」に該当する感じなのかね?
とりあえず、
⇧ 上記サイト様の情報が正しいとすると、サンプルは改修が必要そう...
そして、「docker-compose.yml」を確認した感じ、「Java」のバージョンが「jdk1.8.0_202」とあるように古いのが気になるが...
2025年9月27日(土)時点で、「Java」のバージョンは「25」まで出ているので、「Java」のバージョン「8」は相当に古いと言えそうなのよね...
また、「docker-compose.yml」の書き方も古いままだし、作ったら作りっぱなしというのがサンプルでは多い気がするのだが、残念ながら「Apache Doris」のサンプルにおいてもメンテナンスはされていなさそうね...
現状、サンプルは手を加えないと普通に動かない状態になってしまっているのだが、そのまま何も改修しなくても動くものを公開して欲しい...
「Docker イメージ」のバージョンを動作確認ができていた時のバージョンに固定していないのが問題だと思うのだが...
バージョンを固定するのなら、全てのバージョンを固定すれば良い気はするんだが...
中途半端にバージョンを固定するのは意味が無いんよな...
まぁ、「mc」側で「破壊的変更」を実施しているのが一番の問題だとは思うのだが...
「Phind」に上記の「iceberg_and_paimon」のサンプルの「Docker Compose」で生成される各々の「Dockerコンテナ」間の関係について図にして欲しいと質問したところ、以下のような回答が返ってきた。

「Apache Iceberg」との通信を加味すると以下のようになるようだ。

更に、「データ」が渡って来る部分まで考慮すると以下のようになるようだ。

図の補足説明:
- Apache Sparkの外部接続:
- ポート4040:Web UI用のポートで、ジョブの監視やログ確認が可能
- ポート8080:Spark Driverとの通信用ポートで、クエリの実行やジョブの送信に使用
- Sparkクライアントから直接接続可能で、データ処理や分析の実行が可能です
- Apache Flinkの外部接続:
- ポート8081:JobManagerへの接続用ポートで、ジョブの送信や管理に使用
- Flinkクライアントから接続可能で、リアルタイムデータ処理の制御が可能です
- TaskManagerは内部通信のみで、外部からの直接接続はありません
- セキュリティに関する注意点:
- これらのポートは通常、内部ネットワークでのみ公開されます
- 外部からのアクセスは、適切な認証やファイアウォール設定が必要です
- 実運用環境では、必要なポートのみを制御された方法で公開することをお勧めします
まぁ、「Apache Iceberg」とか「Apache Doris」とかに関する「アーキテクチャ」の理解ができていないので、「AI」の回答が「幻覚(ハルシネーション)」していたとしても判断しようがないのだが...
そして、今まで「Vagrantfile」で「ディスクサイズ」の変更をしたら、良しなに「ゲストOS」側に割り当てしてくれると思っていたのだが、明示的に「ゲストOS」側で「パーティション」を拡張する必要があったようだ...
⇧ 上記サイト様が詳しいです。
自分の環境(「ゲストOS」が「AlmaLinux 9系」)では、「/dev/sda4」のサイズを拡張する必要があった。
長々と前置きして恐縮だが、
■D:\work-soft\vagrant\doris
D:\work-soft\vagrant\doris
│ Vagrantfile
│
└─vms
└─server
│ docker-compose.yml
└─scripts
setup.sh
⇧ といったファイル群を用意しておく。
各々のファイルの中身は以下のような感じ。
■D:\work-soft\vagrant\doris\vms\server\docker-compose.yml
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#version: "3"
services:
spark:
image: tabulario/spark-iceberg
container_name: doris-iceberg-paimon-spark
hostname: demo-spark-iceberg
build: spark/
volumes:
- ./packages/jars/paimon-spark-3.5-0.8.0.jar:/opt/spark/jars/paimon-spark-3.5-0.8.0.jar
- ./packages/jars/paimon-s3-0.8.0.jar:/opt/spark/jars/paimon-s3-0.8.0.jar
- ./data/table:/opt/data
- ./data/spark-conf:/opt/spark/conf
- ./sql/prepare_data.sql:/opt/sql/prepare_data.sql
depends_on:
- rest
- minio
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
networks:
- demo-iceberg
rest:
image: tabulario/iceberg-rest
container_name: doris-iceberg-paimon-iceberg-rest
ports:
- ${REST_CATALOG_PORT}:8181
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
- CATALOG_WAREHOUSE=s3://warehouse/wh/
- CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
- CATALOG_S3_ENDPOINT=http://minio:9000
networks:
- demo-iceberg
volumes:
- './packages/jdk1.8.0_202:/opt/jdk1.8.0_202'
- './packages/doris-bin:/opt/doris-bin'
- './scripts:/opt/scripts'
minio:
image: minio/minio
container_name: doris-iceberg-paimon-minio
ports:
- ${MINIO_API_PORT}:9000
- ${MINIO_UI_PORT}:9001
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=password
- MINIO_DOMAIN=minio
networks:
demo-iceberg:
aliases:
- warehouse.minio
command: ["server", "/data", "--console-address", ":9001"]
mc:
depends_on:
- minio
image: minio/mc
container_name: doris-iceberg-paimon-mc
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
networks:
- demo-iceberg
entrypoint: >
/bin/sh -c "
until (/usr/bin/mc alias set minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/warehouse;
/usr/bin/mc mb minio/warehouse;
/usr/bin/mc anonymous set public minio/warehouse;
tail -f /dev/null
"
jobmanager:
image: flink:1.18.0
container_name: doris-iceberg-paimon-jobmanager
environment:
- JOB_MANAGER_RPC_ADDRESS=jobmanager
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
ports:
- "8082:8081"
command: jobmanager
depends_on:
- rest
- minio
volumes:
- ./packages/jars/flink-connector-jdbc-3.1.2-1.18.jar:/opt/flink/lib/flink-connector-jdbc-3.1.2-1.18.jar
- ./packages/jars/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar:/opt/flink/lib/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
- ./packages/jars/flink-s3-fs-hadoop-1.18.0.jar:/opt/flink/plugins/s3-fs-hadoop/flink-s3-fs-hadoop-1.18.0.jar
- ./packages/jars/iceberg-flink-runtime-1.18-1.5.2.jar:/opt/flink/lib/iceberg-flink-runtime-1.18-1.5.2.jar
- ./packages/jars/iceberg-aws-bundle-1.5.2.jar:/opt/flink/lib/iceberg-aws-bundle-1.5.2.jar
- ./packages/jars/paimon-flink-1.18-0.8.0.jar:/opt/flink/lib/paimon-flink-1.18-0.8.0.jar
- ./packages/jars/paimon-s3-0.8.0.jar:/opt/flink/lib/paimon-s3-0.8.0.jar
- ./sql/init_tables.sql:/opt/flink/sql/init_tables.sql
- ./data/flink-conf:/opt/flink/conf
networks:
- demo-iceberg
deploy:
replicas: 1
taskmanager:
image: flink:1.18.0
environment:
- JOB_MANAGER_RPC_ADDRESS=jobmanager
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
depends_on:
- jobmanager
command: taskmanager
volumes:
- ./packages/jars/flink-connector-jdbc-3.1.2-1.18.jar:/opt/flink/lib/flink-connector-jdbc-3.1.2-1.18.jar
- ./packages/jars/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar:/opt/flink/lib/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
- ./packages/jars/flink-s3-fs-hadoop-1.18.0.jar:/opt/flink/plugins/s3-fs-hadoop/flink-s3-fs-hadoop-1.18.0.jar
- ./packages/jars/iceberg-flink-runtime-1.18-1.5.2.jar:/opt/flink/lib/iceberg-flink-runtime-1.18-1.5.2.jar
- ./packages/jars/iceberg-aws-bundle-1.5.2.jar:/opt/flink/lib/iceberg-aws-bundle-1.5.2.jar
- ./packages/jars/paimon-flink-1.18-0.8.0.jar:/opt/flink/lib/paimon-flink-1.18-0.8.0.jar
- ./packages/jars/paimon-s3-0.8.0.jar:/opt/flink/lib/paimon-s3-0.8.0.jar
networks:
- demo-iceberg
deploy:
replicas: 2
doris:
image: mysql:8.0.18
container_name: doris-iceberg-paimon-doris
networks:
- demo-iceberg
hostname: doris
ports:
- ${DORIS_QUERY_PORT}:9030
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
- LD_LIBRARY_PATH=/opt/doris/be/lib
- JAVA_HOME=/opt/jdk8
- DORIS_HOME=/opt/doris
volumes:
- ./packages/jdk1.8.0_202:/opt/jdk8
- ./packages/doris-bin:/opt/doris-bin
- ./sql/init_doris.sql:/opt/doris-bin/init_doris.sql
- ./scripts:/opt/scripts
command: bin/bash /opt/scripts/start_doris.sh
networks:
demo-iceberg:
ipam:
driver: default
⇧ 環境変数が足りていないとか結構、致命的なのだが...
「start_doris.sh」で、「echo "wait log..."」が永久に続いていて、いつまで経っても「/opt/doris/fe/log/fe.log」が作成されずに、処理が進んでいなかったのだが、Dockerコンテナ側の「/opt/doris-bin/conf/fe.conf」の設定が、環境変数の不足で動作しなかったらしいのだが、「start_all.sh」を見る限り「jar」に固める前の話だと思うので、利用者側ではどうにもできんのよな...
いや、まぁ、「拡張子」を「zip」にして「展開(解凍)」という手もあるかもしれないが...
2025年9月30日(火)追記:↓ ここから
何やら、
⇧ まさかの「環境変数」の「DORIS_HOME」が「ミュータブル(mutable)」な設計になっているという絶望感たるや...
となると、「/opt/doris/fe/log/fe.log」が作成されない原因が分からなくなってくるんだが...
単純に「メモリ」不足が原因だとすると、吾輩の「PC」のスペック(「メモリ」が「8 GB」しかない)では「iceberg_and_paimon」のサンプルを動作させることは厳しいんかな...
2025年9月30日(火)追記:↑ ここまで
どちらにしろ、
■/opt/doris/fe/conf/fe.conf
# ls -la opt/doris/fe/conf
total 12
drwxr-xr-x. 3 root root 49 Sep 29 14:14 .
drwxr-xr-x. 12 root root 4096 Sep 29 14:14 ..
-rw-r--r--. 1 root root 4035 Sep 29 14:14 fe.conf
-rw-r--r--. 1 root root 2480 Sep 29 14:14 ldap.conf
drwxr-xr-x. 2 root root 6 Sep 29 14:14 ssl
# cat opt/doris/fe/conf/fe.conf
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#####################################################################
## The uppercase properties are read and exported by bin/start_fe.sh.
## To see all Frontend configurations,
## see fe/src/org/apache/doris/common/Config.java
#####################################################################
CUR_DATE=`date +%Y%m%d-%H%M%S`
# Log dir
LOG_DIR = ${DORIS_HOME}/log
# CMS JAVA OPTS
# JAVA_OPTS="-Dsun.security.krb5.debug=true -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$CUR_DATE"
# G1 JAVA OPTS
JAVA_OPTS="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:$LOG_DIR/fe.gc.log.$CUR_DATE -Dlog4j2.formatMsgNoLookups=true"
# For jdk 9+, this JAVA_OPTS_FOR_JDK_9 will be used as default CMS JVM options
# JAVA_OPTS_FOR_JDK_9="-Dsun.security.krb5.debug=true -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$CUR_DATE:time"
# For jdk 9+, this JAVA_OPTS_FOR_JDK_9 will be used as default G1 JVM options
JAVA_OPTS_FOR_JDK_9="-Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xlog:gc*:$LOG_DIR/fe.gc.log.$CUR_DATE:time -Dlog4j2.formatMsgNoLookups=true"
# For jdk 17+, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -XX:+UseZGC -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR/ -Xlog:gc*:$LOG_DIR/fe.gc.log.$CUR_DATE:time"
##
## the lowercase properties are read by main program.
##
# store metadata, must be created before start FE.
# Default value is ${DORIS_HOME}/doris-meta
# meta_dir = ${DORIS_HOME}/doris-meta
# Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
# jdbc_drivers_dir = ${DORIS_HOME}/jdbc_drivers
http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
arrow_flight_sql_port = -1
# Choose one if there are more than one ip except loopback address.
# Note that there should at most one ip match this list.
# If no ip match this rule, will choose one randomly.
# use CIDR format, e.g. 10.10.10.0/24 or IP format, e.g. 10.10.10.1
# Default value is empty.
# priority_networks = 10.10.10.0/24;192.168.0.0/16
# Advanced configurations
# log_roll_size_mb = 1024
# INFO, WARN, ERROR, FATAL
sys_log_level = INFO
# NORMAL, BRIEF, ASYNC
sys_log_mode = NORMAL
# sys_log_roll_num = 10
# sys_log_verbose_modules = org.apache.doris
# audit_log_dir = $LOG_DIR
# audit_log_modules = slow_query, query
# audit_log_roll_num = 10
# meta_delay_toleration_second = 10
# qe_max_connection = 1024
# qe_query_timeout_second = 300
# qe_slow_log_ms = 5000
#
⇧ 設定ファイルを見ても、「/opt/doris/fe/log/fe.log」が生成されている箇所が分からんのよね...
後述するが、「/opt/doris/fe/log/fe.log」が生成されないから、「echo "wait log..."」の処理が永遠に続くせいなのか、
■/opt/doris/fe/log/fe.out
# ls -la /opt/doris/fe/log total 16 drwxr-xr-x. 2 root root 53 Sep 29 14:16 . drwxr-xr-x. 12 root root 4096 Sep 29 14:14 .. -rw-r--r--. 1 root root 8172 Sep 29 14:16 fe.gc.log.20250929-141558 -rw-r--r--. 1 root root 525 Sep 29 14:16 fe.out # cat /opt/doris/fe/log/fe.out StdoutLogger 2025-09-29 14:16:01,367 using java version 8 StdoutLogger 2025-09-29 14:16:01,382 -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/opt/doris/fe/log/fe.gc.log.20250929-141558 -Dlog4j2.formatMsgNoLookups=true StdoutLogger 2025-09-29 14:16:01,628 start time: Mon Sep 29 14:16:01 UTC 2025 library initialization failed - unable to allocate file descriptor table - out of memory
⇧ 上記にあるように「out of memory」でプロセスが強制的にエラー終了しているっぽい...
無駄に費やされた貴重な時間を返して欲しいですわな...
■D:\work-soft\vagrant\doris\vms\server\scripts\setup.sh
#!/bin/bash
SETUP_LOG=/tmp/setup.log
###############################################################
###
### Install Docker daemon for AlmaLinux
### https://docs.docker.com/engine/install/rhel/
###
###############################################################
# 既存のDocker関連パッケージ・podmanなどを削除
sudo dnf remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
podman \
runc
# 必要なプラグインインストール
sudo dnf -y install dnf-plugins-core
# Dockerの公式リポジトリを追加
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
# Docker Engineと関連ツールをインストール
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Dockerサービスを有効化・起動
sudo systemctl enable --now docker
# Dockerサービスの状態を確認(オプション)
sudo systemctl status docker --no-pager
# Dockerのバージョン確認
sudo docker -v >> "${SETUP_LOG}"
# Docker Composeのバージョン確認(docker composeコマンド)
sudo docker compose version >> "${SETUP_LOG}"
###############################################################
###
### Samples that Apache Doris with Apache Iceberg And Paimon
### https://github.com/apache/doris/tree/master/samples/datalake/iceberg_and_paimon
###
###############################################################
# git cloneのためのディレクトリを用意
sudo mkdir -p /app
cd /app
APP_BASE_DIR=$(pwd)
echo "${APP_BASE_DIR}"
# 必要なパッケージのインストール
sudo dnf install -y git wget
# git clone
git clone --filter=blob:none --sparse https://github.com/apache/doris.git
# クローンされたディレクトリに移動する
cd doris
GIT_REPO_BASE_DIR=$(pwd)
echo "${GIT_REPO_BASE_DIR}"
# ローカルリポジトリの初期化
#git init
git config --global init.defaultBranch main
# 部分的に取得
git sparse-checkout set samples/datalake/iceberg_and_paimon
sysctl -w vm.max_map_count=2000000
# ディレクトリ移動
cd samples/datalake/iceberg_and_paimon
DOCKER_COMPOSE_FILE_DIR=$(pwd)
echo "${DOCKER_COMPOSE_FILE_DIR}"
FLINK_SQL_DIR="${DOCKER_COMPOSE_FILE_DIR}/sql"
# 環境変数を用意
# https://docs.docker.com/compose/how-tos/environment-variables/set-environment-variables/
# シェバン (shebang) の行を除く
# ※「#!/bin/bash」の部分を除いた行を抽出するということ
tail -n +2 docker-compose.env > .env
sudo cat .env > docker-compose.env
#### 警告が出ないように、versionをコメントアウト
###sed -i 's/^\(version: "3"\)/#\1/' docker-compose.yml
###
#### 改修
#### https://stackoverflow.com/questions/79656404/docker-compose-with-minio-entrypoint-raises-config-is-not-a-recognized-comman
###read -r -d '' DOCKER_COMPOSE_SERVICE_MC_ENTRYPOINT_SCRIPT <<'EOF'
###until (/usr/bin/mc alias set minio http://minio:9000 admin password); do
### echo '...waiting...' && sleep 1
###done
###/usr/bin/mc rb --force minio/warehouse
###/usr/bin/mc mb minio/warehouse
###/usr/bin/mc anonymous set public minio/warehouse
###tail -f /dev/null
###EOF
###
#### 改行を \n に、ダブルクォートをエスケープ(順序も安全に)
###ESCAPED_SCRIPT=$(printf "%s" "$DOCKER_COMPOSE_SERVICE_MC_ENTRYPOINT_SCRIPT" \
### | sed ':a;N;$!ba;s/\n/\\n/g' \
### | sed 's/"/\\"/g')
###
#### yq のダウンロードとパス指定
###sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 \
### -O /usr/local/bin/yq && sudo chmod +x /usr/local/bin/yq >> "$SETUP_LOG"
###
####YQ_PATH=$(which yq)
###YQ_PATH="/usr/local/bin/yq"
###
#### ログ出力
###echo "Using yq at: $YQ_PATH" >> "$SETUP_LOG"
###echo "Using yq version: $($YQ_PATH -V)" >> "$SETUP_LOG"
###echo "Updating docker-compose.yml..." >> "$SETUP_LOG"
###
#### YAML の entrypoint を文字列として上書き
###COMPOSE_FILE="${DOCKER_COMPOSE_FILE_DIR}/docker-compose.yml"
###
###REPLACE_SCRIPT="/bin/sh -c ${ESCAPED_SCRIPT}"
###REPLACE_BY_YQ=".services.mc.entrypoint = \"${REPLACE_SCRIPT}"\"
###
###sudo "$YQ_PATH" -i "${REPLACE_BY_YQ}" "$COMPOSE_FILE"
echo "■■■Before execute start_all.sh■■■" >> "${SETUP_LOG}"
sudo cat docker-compose.yml >> "${SETUP_LOG}"
sudo mv /tmp/server/docker-compose.yml "${DOCKER_COMPOSE_FILE_DIR}/docker-compose.yml"
echo "✅ docker-compose.yml has been updated."
# Minioでbucketの作成まで待機するようにする
# 改修対象ファイル
# https://github.com/apache/doris/blob/master/samples/datalake/iceberg_and_paimon/start_all.sh
cat << 'EOF' > wait_script.sh
#!/bin/bash
# 最大リトライ回数(リトライ回数の上限)
MAX_RETRIES=3
# 各リトライ間の間隔(秒) → 60秒 × 3回 = 180秒(3分)
RETRY_INTERVAL=60
# リトライの回数をカウントする用
RETRY_COUNT=0
# 対象のバケット名
TARGET_BUCKET_NAME=warehouse
IS_NOT_READY=true
# 繰り返し処理
while [[ "${IS_NOT_READY}" = true ]]; do
# TTY無効 & 標準エラー非表示で実行
IS_CREATED=$(sudo docker compose exec -T mc /usr/bin/mc ls minio 2>/dev/null)
if $(echo "$IS_CREATED" | grep -q "${TARGET_BUCKET_NAME}"); then
echo "✅ Success: MinIO bucket '${TARGET_BUCKET_NAME}' is available."
sleep 10
IS_NOT_READY=false
fi
RETRY_COUNT=$((RETRY_COUNT + 1))
echo "⏳ Waiting for MinIO bucket '${TARGET_BUCKET_NAME}'... (retry: $RETRY_COUNT/$MAX_RETRIES)"
if [ "$RETRY_COUNT" -ge "$MAX_RETRIES" ]; then
echo "❌ Error: MinIO bucket '${TARGET_BUCKET_NAME}' was not found after $((MAX_RETRIES * RETRY_INTERVAL)) seconds."
break
fi
sleep "$RETRY_INTERVAL"
done
# テーブル生成
echo "Ready create table"
sudo docker exec doris-iceberg-paimon-jobmanager sql-client.sh -f /opt/flink/sql/init_tables.sql | sudo tee -a init.log >/dev/null
EOF
# シェルスクリプトファイルの実行権限を付与
sudo chmod +x wait_script.sh
# start_all.shの対象箇所を置き換え
sudo sed -i 's@sudo docker exec -it doris-iceberg-paimon-jobmanager sql-client.sh -f /opt/flink/sql/init_tables.sql | tee -a init.log >/dev/null@sudo bash wait_script.sh@' start_all.sh
# Docker Composeでコンテナを作成・起動
START_DATETIME=$(echo '[START_DATETIME]'`date '+%Y-%m-%dT%H:%M:%S.%3N' --utc`Z)
bash start_all.sh
END_DATETIME=$(echo '[END_DATETIME]'`date '+%Y-%m-%dT%H:%M:%S.%3N' --utc`Z)
echo "${START_DATETIME}"
echo "${END_DATETIME}"
echo "■■■After execute start_all.sh■■■" >> "${SETUP_LOG}"
sudo cat docker-compose.yml >> "${SETUP_LOG}"
# Docker Composeで作成・起動したDockerコンテナの起動状態の確認
sudo docker compose ps
# Docker ComposeでpullされたDocker イメージの確認
sudo docker compose images
# メモリとかチェック
top
free -h
vmstat 1 5
# ディスク領域のサイズ容量表示
df -h
# inode の使用状況を確認
df -i
# /var/log 配下で容量の大きいものをチェック
sudo du -h --max-depth=1 /var/log | sort -hr
# パッケージキャッシュ
#sudo du -h --max-depth=1 /var/cache/yum
sudo du -h --max-depth=1 /var/cache/dnf
# Docker daemonによって使用されているディスク容量に関する情報を表示
sudo docker system df
### no space left on device: unknown の対策
### Docker build cacheの削除
###sudo docker builder prune -f
###
### 不要なDocker Image, Container, Volume, Network の一括削除
###docker system prune --volumes -f
###
#### MySQLのバイナリログ
###sudo find /var/lib/mysql -maxdepth 1 -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}'
###
#### InnoDB 共通テーブルスペース
###ls -lh /var/lib/mysql/ibdata1
# 公式のサンプルの手順
# paimon table test
#script -q -c "bash ./start_flink_client.sh" /dev/null
#bash ./start_flink_client.sh
TMP_QUERY_FLINK="${FLINK_SQL_DIR}/tmp-query-flink.sql"
TMP_EXE_QUERY_FLINK=tmp-exe-query-flink.sql
# 一時ファイルを作成
cat <<EOF > "${TMP_QUERY_FLINK}"
use CATALOG paimon;
use paimon.db_paimon;
show tables;
show create table customer;
desc customer;
select * from customer order by c_custkey limit 4;
select * from customer order by c_custkey desc limit 4;
exit;
EOF
# 一時ファイルの内容を確認
echo '### '"${TMP_QUERY_FLINK}"' ###'
cat "${TMP_QUERY_FLINK}"
cat "${FLINK_SQL_DIR}"/init_tables.sql "${TMP_QUERY_FLINK}" > "${FLINK_SQL_DIR}/${TMP_EXE_QUERY_FLINK}"
# 対象のDocker Composeのサービス名
DOCKER_COMPOSE_SERVICE_JOBMANAGER=$(sudo docker compose config --services | grep jobmanager)
echo 'DOCKER_COMPOSE_SERVICE_JOBMANAGER='"${DOCKER_COMPOSE_SERVICE_JOBMANAGER}"
# Dockerホスト側からDockerコンテナ側にファイルコピー
sudo docker compose cp "${FLINK_SQL_DIR}/${TMP_EXE_QUERY_FLINK}" "${DOCKER_COMPOSE_SERVICE_JOBMANAGER}":/opt/flink/sql/"${TMP_EXE_QUERY_FLINK}"
# Dockerコンテナにログインして、コピーしたファイルを実行
# https://stackoverflow.com/questions/67934724/cannot-source-file-in-flink-sql-client
#sudo docker compose exec -it jobmanager sql-client.sh -i /opt/flink/sql/query-flink.sql
sudo docker compose exec -it "${DOCKER_COMPOSE_SERVICE_JOBMANAGER}" sql-client.sh -f /opt/flink/sql/"${TMP_EXE_QUERY_FLINK}"
# 一時ファイルを作成
cat <<EOF > query-doris.sql
use CATALOG paimon;
use paimon.db_paimon;
show tables;
select * from customer order by c_custkey limit 4;
select * from customer order by c_custkey desc limit 4;
explain verbose select * from customer where c_nationkey < 3;
update customer set c_address='c_address_update' where c_nationkey = 1;
explain verbose select * from customer where c_nationkey < 3;
select * from customer where c_nationkey=1 limit 2;
exit;
EOF
# 一時ファイルの内容を確認
echo '### '"query-doris.sql"' ###'
cat query-doris.sql
# 対象のDocker Composeのサービス名
DOCKER_COMPOSE_SERVICE_DORIS=$(sudo docker compose config --services | grep doris)
echo 'DOCKER_COMPOSE_SERVICE_DORIS='"${DOCKER_COMPOSE_SERVICE_DORIS}"
# Dockerホスト側からDockerコンテナ側にファイルコピー
#sudo docker compose cp ./query-doris.sql "${DOCKER_COMPOSE_SERVICE_DORIS}":/tmp/query-doris.sql
# Dockerコンテナにログインして、コピーしたファイルを実行
#script -q -c "bash start_doris_client.sh < ./query-doris.sql" /dev/null
sudo docker exec -i doris-iceberg-paimon-doris sh -c "mysql -u root -h doris -P 9030" < ./query-doris.sql
# 一時ファイルを削除
sudo rm -f "${TMP_QUERY_FLINK}"
sudo rm -f query-doris.sql
■D:\work-soft\vagrant\doris\Vagrantfile
# https://portal.cloud.hashicorp.com/vagrant/discover/almalinux/9
IMAGE_NAME = "almalinux/9"
IMAGE_VESION = "9.6.20250522"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
# クライアントVM設定
config.vm.define "iceberg-client" do |client|
client.vm.box = IMAGE_NAME
client.vm.box_version = IMAGE_VESION
client.vm.hostname = "client"
# 内部ネットワーク
client.vm.network "private_network", ip: "192.168.10.1", virtualbox__intnet: "internal_net"
# クライアントVMに関する設定など
client.vm.provision "shell", inline: <<-SHELL
# DNSの接続に関するデバッグ用途
sudo dnf install -y bind-utils
SHELL
end
# Apache Icebergサーバー用VM設定(Apache Icebergインストール)
config.vm.define "iceberg-server" do |server|
server.vm.provider "virtualbox" do |v|
#v.memory = 2048
#v.memory = 3072
v.memory = 4096
#v.memory = 6144
v.cpus = 2
end
#server.vm.disk :disk, size: "200GB", name: "iceberg-disk", auto_resize: true
server.vm.disk :disk, size: "100GB", primary: true
server.vm.disk :disk, size: "100GB", name: "extra_storage"
server.vm.box = IMAGE_NAME
server.vm.box_version = IMAGE_VESION
# Apache Icebergサーバー用VMのホスト名を設定
server.vm.hostname = "iceberg.local"
# ホストオンリーアダプター
# ホスト側のブラウザからApache Icebergに接続するため用
server.vm.network "private_network", ip: "192.168.56.201"
# 内部ネットワーク
server.vm.network "private_network", ip: "192.168.10.2", virtualbox__intnet: "internal_net"
# ホスト側からゲストOS側にファイルコピー
server.vm.provision "file", source: "vms/server/scripts/setup.sh", destination: "/tmp/server/scripts/setup.sh"
# Apache Icebergサーバー用VMにDockerをインストール
server.vm.provision "shell", inline: <<-SHELL
# ディスク拡張用のパッケージをインストール
sudo dnf install -y cloud-utils-growpart
# ディスクの使用割合を確認
df -hT /
# パーティションを拡張
sudo growpart /dev/sda 4
# ファイルシステム(ext4)を拡張
xfs_growfs /dev/sda4
# ディスクの使用割合を確認
df -hT /
# シェルスクリプト(セットアップ)の実行権限を付与
chmod +x /tmp/server/scripts/setup.sh
# シェルスクリプト(セットアップ)の実行
/tmp/server/scripts/setup.sh
SHELL
end
end
⇧ で「保存」。
「yq」で「docker-compose.yml」の内容を修正したかったのだが、スクリプトの正解が分からないので、事前に改修した「docker-compose.yml」を用意しておき、丸ごと差し替える方針に変更した。
なので「yq」は利用していません。
ちなみに、
Googleで yq を検索すると、なんと全く異なる2種類がヒットします。
⇧ 上記サイト様にありますように、「yq」は2種類存在しているらしく、紛らわしいことこの上ない...
して、「コマンドプロンプト」などを立ち上げて、「Vagrantfile」の配置されているディレクトリに移動し、「vagrant up」を実行。
処理に時間がかかるので暫し待ち、「コーヒーブレイク」の時間と言うことで。

⇧ 肝心の「Apache Doris」の部分で「ERROR」が出ると...
ちょっと、流石に疲れたので、原因調査は後日かなぁ...
ちなみに、「Java」のバージョンが古いのは「Apache Hadoop」のせいなんかな...
⇧ なるほど、2025年9月27日(土)時点で、「Java」のバージョンは「25」まで出ているようなのだが、「Apache Hadoop」で利用可能な「Java」のバージョンは「11」までという縛りがあるようだ...
衝撃過ぎるんだが...
何やら、
Temurin JDK25 packages are expected to be available shortly, update JDK 24 to 25 in the docker images.
⇧ 上記の説明が正しいとするならば、「Docker」版の「Apache Hadoop」は「Java」のバージョン「25」に対応しているということなんだろうか?
う~む...、状況が全く持って分からない...
毎回思うのだが、「Apache Hadoop」に限った話ではないのだが、バージョンの関係についてのマトリックス表を公開して欲しいのよね...
そして、「Apache Flink」の設計思想なのか、「サンプル」の設計思想なのか分からないのだが、「Apache Flink」のクライアントで接続するたびに「Catalog」などの作成が必要というのは罠過ぎる...
普通の「RDBMS(Relational DataBase Management System)」だと、「永続化」されるのが普通だと思っていたので、ログインの度に作成が必要という思想は気付き難い...
Web画面などの「ログイン情報」などは、「セッション」毎に改めて作成し直すのは分かるのだが、「データベース」系で「永続化」しない発想には至り難い...
「認知」の「バイアス」と言われれば、それまでなのだが...
「インメモリデータベース」であっても、「OS(Operation System)」が再起動されない限りは「永続化」されますしな...
動作する組み合わせを探す不毛な時間のせいで「ストレス」が蓄積される慣習は無くしたいのだけどね...
「エンジニア」の仕事は理不尽過ぎることが多過ぎるので、「アンガーマネジメント」を習得していく必要があるんですかね?
「アンガーマネジメント」はというと、
アンガーマネジメント(Anger management)とは、怒りを予防し制御するための心理療法プログラムであり、怒りを上手く分散させることができると評価されている。怒りはしばしばフラストレーションの結果であり、また自分にとって大事なものを遮断されたり妨害された時の感情でもある。怒りはまた、根底にある恐れや脆弱感に対する防衛機制でもある。
アンガーマネジメント・プログラムでは、怒りは定義可能な理由によって生じる、論理的に分析可能な強い感情であり、適切な場合には前向きにとらえてよいものだと考えられている。
「怒りは誰もが経験する感情だ。怒りが重大な懸念事項となるのは、それがあまりにも頻繁に、強烈に、長い時間、発生し続ける場合だけだ。」- レイモンド・W・ノヴァコ(1984年)
概要
「怒ることは誰にでもできる。ただ怒るのは簡単なことである…しかし適切な相手に、適切な程度に、適切な場合に、適切な目的で、適切な形で怒ることは容易ではない。」- アリストテレス
治療の種類
6秒ルール
日本で有名なアンガーマネジメントの方法として、「怒りは6秒経てばピークを過ぎるので、6秒我慢すればよい」という「6秒ルール」がある。
「6秒ルール」は、教育現場向け学校心理学の書籍でも度々紹介されている。日本アンガーマネジメント協会代表理事の安藤俊介も著書で取り上げている。生理学研究所名誉教授で脳科学者の柿木隆介もエビデンスに基づき容認している。
一方で、「単に6秒待つだけでは不十分である」とする批判もある。「6秒ルール」は出所不明で、日本以外では有名でないとする指摘もある。
⇧ とあり、「6秒ルール」は、根拠が無さそうという衝撃...
まぁ、「怒り」を誘発する対象から物理的な距離を置くしかないのだが、「エンジニア」は職業柄、「怒り」に発展するのが不可避な理不尽な状況に置かれることが多いので、「アンガーマネジメント」を習得するのは至難の業と言えそうですかね...
ちなみに、
宗教における位置づけ
多くの宗教で、怒りは人間の最もネガティブな感情と捉えられている。憤り、怒ることを憤怒といい、キリスト教では、七つの大罪のひとつとされる。仏教では、怒りは人間を地獄界の精神状態に追いやり、死後最悪の条件に転生すると考える。また、狼、ユニコーン、ドラゴン等が、憤怒を象徴する動物として描かれる事もある。
仏教では、怒りは煩悩のうち、三毒とされる基本的な3つの貪・瞋・癡(とんじんち)のうち、瞋(しん)である。不動明王や三宝荒神のように、貪瞋癡を許さんという慈悲が極まり、憤怒の相で表れて不浄を厭離し、仏法僧を守護する仏も見られる。磨滅するために怒りをわざと高めて悪しき心を陳伏すること。
⇧ 上記の話は納得いきませんな...
「神様」や「仏様」は、「怒り」を正当化しているらしいのだが、「生殺与奪」が「神様」や「仏様」の気まぐれに左右される不条理...
ご都合主義にも程がありますな...
全くもって救いようのない世の中ということですかね...
毎度モヤモヤ感が半端ない…
今回はこのへんで。




