1. FastDFS の概要FastDFS オープンソース アドレス: https://github.com/happyfish100 参考: 分散ファイルシステム FastDFS の設計原則 参考: FastDFS 分散ファイルシステム 個人用パッケージ化された FastDFS Java API: https://github.com/bojiangzhou/lyyzoo-fastdfs-java 1. はじめにFastDFS は、オープン ソースの高性能分散ファイル システム (DFS) です。 主な機能には、ファイル ストレージ、ファイル同期、ファイル アクセス、高容量、負荷分散などがあります。これは主に大量のデータ保存の問題を解決し、特に小中サイズのファイル (推奨範囲: 4KB < ファイルサイズ < 500MB) をキャリアとして使用するオンライン サービスに適しています。 FastDFS システムには、トラッカー サーバー、ストレージ サーバー、クライアントの 3 つの役割があります。 トラッカー サーバー: トラッキング サーバー。主にスケジュールとバランス調整を担当し、すべてのストレージ サーバーとグループを管理します。起動後、各ストレージはトラッカーに接続し、所属するグループなどの情報をトラッカーに通知し、定期的なハートビートを維持します。 ストレージサーバー: ストレージサーバーは主に容量とバックアップ サービスを提供します。ストレージ サーバーはグループに編成されており、各グループには複数のストレージ サーバーが含まれ、データは相互にバックアップされます。 クライアント: クライアントは、データをアップロードおよびダウンロードするサーバーであり、独自のプロジェクトがデプロイされるサーバーでもあります。 2. FastDFSストレージ戦略大容量をサポートするために、ストレージ ノード (サーバー) はボリューム (またはグループ) に編成されます。ストレージ システムは 1 つ以上のボリュームで構成されます。ボリューム間のファイルは互いに独立しています。すべてのボリュームのファイル容量の合計が、ストレージ システム全体のファイル容量になります。ボリュームは 1 台以上のストレージ サーバーで構成できます。ボリューム内のストレージ サーバー内のファイルは同一です。ボリューム内の複数のストレージ サーバーは、冗長バックアップと負荷分散の役割を果たします。 ボリュームにサーバーを追加すると、システムは既存のファイルを自動的に同期します。同期が完了すると、システムは新しく追加されたサーバーを自動的にオンラインに切り替えてサービスを提供します。ストレージ容量が不足したり、不足したりした場合は、ボリュームを動的に追加できます。 1 台以上のサーバーを追加し、新しいボリュームとして構成するだけで、ストレージ システムの容量を拡張できます。 3. FastDFSアップロードプロセスFastDFS は、クライアント ライブラリの形式で、アップロード、ダウンロード、追加、削除などの基本的なファイル アクセス インターフェイスをユーザーに提供します。 ストレージ サーバーは、定期的にストレージ情報をトラッカー サーバーに送信します。トラッカー サーバー クラスター内に複数のトラッカー サーバーが存在する場合、各トラッカー間の関係は対等であるため、クライアントはアップロード時に任意のトラッカーを選択できます。 Tracker は、クライアントからファイルのアップロード要求を受信すると、そのファイルを保存できるグループをファイルに割り当てます。グループが選択されると、グループ内のどのストレージ サーバーをクライアントに割り当てるかを決定します。ストレージ サーバーが割り当てられると、クライアントはストレージにファイル書き込み要求を送信し、ストレージはファイルのデータ ストレージ ディレクトリを割り当てます。次に、ファイルにファイル ID を割り当て、最後に上記の情報に基づいてファイル名を生成してファイルを保存します。 4. FastDFSのファイル同期ファイルを書き込む場合、クライアントはグループ内のストレージ サーバーにファイルを書き込むと、ファイルの書き込みが成功したとみなします。ストレージ サーバーがファイルの書き込みを完了すると、バックグラウンド スレッドによって、同じグループ内の他のストレージ サーバーにファイルが同期されます。 各ストレージがファイルを書き込んだ後、バイナリログも書き込まれます。バイナリログにはファイルデータは含まれず、ファイル名などのメタ情報のみが含まれます。このバイナリログはバックグラウンド同期に使用されます。ストレージは、再起動後に同期を続行できるように、グループ内の他のストレージとの同期の進行状況を記録します。進行状況はタイムスタンプの形式で記録されるため、クラスター内のすべてのサーバーのクロックが同期されていることを確認することをお勧めします。 ストレージの同期の進行状況は、メタデータの一部としてトラッカーに報告されます。トラッカーは、ストレージの読み取りを選択するときに、同期の進行状況を参照として使用します。 5. FastDFSによるファイルのダウンロードクライアントがファイルを正常にアップロードすると、ストレージによって生成されたファイル名が取得されます。その後、クライアントはこのファイル名に基づいてファイルにアクセスできます。 ファイルのアップロードと同様に、クライアントはファイルをダウンロードするときに任意のトラッカー サーバーを選択できます。トラッカーがダウンロード要求をトラッカーに送信する場合、ファイル名情報を含める必要があります。トラッカーはファイル名からファイル グループ、サイズ、作成時間などの情報を解析し、読み取り要求に対応するストレージを選択します。 2. FastDFS環境をインストールする0. はじめに動作環境:CentOS7 X64、以下の動作はすべてスタンドアロン環境です。 すべてのインストール パッケージを /softpackages/ にダウンロードし、現在のディレクトリに解凍しました。 最初に行うことは、ホストを変更し、ファイル サーバーの IP アドレスをドメイン名にマップすることです (スタンドアロン TrackerServer 環境)。これは、以降の多くの構成でサーバー アドレスを構成する必要があるためです。IP アドレスが変更された場合は、ホストを変更するだけで済みます。
1. libfastcommonをダウンロードしてインストールするlibfastcommon は、基本環境である FastDFS および FastDHT から抽出された共通 C 関数ライブラリであり、インストールできます。 ① libfastcommonをダウンロードする
②減圧
③コンパイルしてインストールする
④ libfastcommon.so は /usr/lib64/libfastcommon.so にインストールされますが、FastDFS メインプログラムが設定する lib ディレクトリは /usr/local/lib なので、ソフトリンクを作成する必要があります。
2. FastDFSをダウンロードしてインストールする① FastDFSをダウンロードする
②減圧
③コンパイルしてインストールする
④ インストール後の対応するファイルとディレクトリ(デフォルト) A. サービススクリプト:
B. 設定ファイル (これら 3 つは著者が提供したサンプル設定ファイルです):
C. コマンド ツールは /usr/bin/ ディレクトリにあります。
⑤ FastDFSサービススクリプトによって設定されるbinディレクトリは/usr/local/binですが、実際のコマンドは/usr/bin/以下にインストールされます。 2つの方法: 》 まず、FastDFS サービス スクリプト内の対応するコマンド パスを変更します。つまり、2 つのスクリプト /etc/init.d/fdfs_storaged と /etc/init.d/fdfs_tracker 内の /usr/local/bin を /usr/bin に変更します。 # vim fdfs_trackerd 》 2 つ目は、/usr/bin から /usr/local/bin へのソフト リンクを作成することです。私はこの方法を使用します。
3. FastDFS Trackerを構成する設定ファイルの詳細な説明については、FastDFS設定ファイルの詳細な説明を参照してください。 ① /etc/fdfs に移動し、FastDFS トラッカーのサンプル設定ファイル tracker.conf.sample をコピーし、tracker.conf に名前を変更します。
② tracker.conf を編集します。赤でマークされている部分は変更する必要があり、その他はデフォルトのままにしておきます。 # 設定ファイルが無効かどうか。false は有効であることを意味します。disabled=false # サービスを提供するポートは port=22122 です # トラッカーデータとログディレクトリのアドレス(ルートディレクトリが存在する必要があり、サブディレクトリは自動的に作成されます) ベースパス=/ljzsg/fastdfs/tracker # HTTP サービスポート http.server_port=80 ③トラッカー基本データディレクトリ、つまりbase_pathに対応するディレクトリを作成する
④ ファイアウォールの追跡ポートを開く(デフォルト22122) # vim /etc/sysconfig/iptables 次のポート行を追加します。 -A 入力 -m 状態 --state 新規 -m tcp -p tcp --dport 22122 -j 受け入れる ファイアウォールを再起動します。 # サービスiptablesを再起動 ⑤ トラッカーを起動する 初めて正常に起動すると、/ljzsg/fdfsdfs/tracker/ (設定された base_path) の下に、data と logs の 2 つのディレクトリが作成されます。
FastDFS Tracker が正常に起動され、ポート 22122 がリッスンされているかどうかを確認します。これは、Tracker サービスが正常にインストールされていることを意味します。
トラッカーを無効にするコマンド:
⑥ 起動時にトラッカーを起動するように設定する
⑦ トラッカーサーバーのディレクトリとファイル構造 Tracker サービスが正常に開始されると、base_path の下に data と logs の 2 つのディレクトリが作成されます。ディレクトリ構造は次のとおりです。 ${ベースパス} |__データ | |__storage_groups.dat: ストレージ グループ情報| |__storage_servers.dat: ストレージ サーバー リスト|__logs | |__trackerd.log: トラッカーサーバーのログファイル 4. FastDFSストレージを構成する① /etc/fdfsディレクトリに入り、FastDFSストレージサンプル設定ファイルstorage.conf.sampleをコピーし、storage.confに名前を変更します。
② storage.confを編集する 赤でマークされたものは変更する必要があり、その他はデフォルトのままにしておきます。 # 設定ファイルが無効かどうか。false は有効であることを意味します。disabled=false #このストレージサーバーが配置されているグループ(ボリューム)を指定します グループ名=グループ1 # ストレージサーバーサービスポート port=23000 # ハートビート間隔(秒単位)(これはトラッカーサーバーにハートビートをアクティブに送信することを意味します) ハートビート間隔=30 # ストレージデータとログディレクトリのアドレス(ルートディレクトリが存在する必要があり、サブディレクトリは自動的に生成されます) ベースパス=/ljzsg/fastdfs/ストレージ # ストレージ サーバーは、ファイルを保存するときに複数のパスをサポートします。ここでは、ファイルを保存するためのベース パスの数を設定します。通常は、1 つのディレクトリのみが設定されます。 ストアパス数=1 # store_path_count パスを 0 を基準としたインデックス番号で 1 つずつ設定します。 # store_path0 が設定されていない場合は、base_path に対応するパスと同じになります。 store_path0=/ljzsg/fastdfs/ファイル # FastDFS はファイルを保存するときに 2 レベルのディレクトリを使用します。ファイルが保存されるディレクトリの数をここで設定します。 # このパラメータが N のみの場合 (例: 256)、ストレージ サーバーは、初回実行時に store_path の下にファイルを保存するための N * N サブディレクトリを自動的に作成します。 パスあたりのサブディレクトリ数=256 # tracker_server のリスト。tracker_server にアクティブに接続します # トラッカー サーバーが複数ある場合は、トラッカー サーバーごとに 1 行記述します。tracker_server=file.ljzsg.com:22122# システム同期に許可される期間 (デフォルトは終日)。これは通常、ピーク同期によって発生する問題を回避するために設定されます。同期開始時間=00:00同期終了時間=23:59 # アクセスポート http.server_port=80 ③ base_pathディレクトリに対応するストレージ基本データディレクトリを作成する
④ ファイアウォールでストレージポートを開く(デフォルト23000) # vim /etc/sysconfig/iptables 次のポート行を追加します。 -A 入力 -m 状態 --state 新規 -m tcp -p tcp --dport 23000 -j 受け入れる ファイアウォールを再起動します。 # サービスiptablesを再起動 ⑤ ストレージを開始する ストレージを有効にする前に、トラッカーが有効になっていることを確認してください。最初の起動が成功すると、/ljzsg/fastdfs/storage ディレクトリの下に、data と logs の 2 つのディレクトリが作成されます。
ストレージが正常に起動されているかどうかを確認します。ポート 23000 が監視されているということは、ストレージが正常に起動されていることを意味します。
ストレージ コマンドをオフにするには:
ストレージとトラッカーが通信しているかどうかを確認します。
⑥ 起動時にストレージを起動するように設定する
⑦ ストレージディレクトリ Tracker と同様に、Storage が正常に起動すると、base_path の下にデータ ディレクトリとログ ディレクトリが作成され、Storage Server の情報が記録されます。 store_path0 ディレクトリの下に、N*N 個のサブディレクトリが作成されます。 5. ファイルアップロードテスト① Trackerサーバーのクライアント設定ファイルを変更する
次の設定を変更し、その他はデフォルトのままにします。
②アップロードテスト Linuxで以下のコマンドを実行してnamei.jpeg画像をアップロードします。
アップロードが成功すると、ファイル ID 番号が返されます: group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg 返されるファイル ID は、グループ、ストレージ ディレクトリ、2 レベルのサブディレクトリ、ファイル ID、およびファイル サフィックス (クライアントによって指定され、主にファイルの種類を区別するために使用されます) で構成されます。 3. Nginxをインストールする上記でファイルは正常にアップロードされましたが、ダウンロードできませんでした。そのため、ファイルへの HTTP アクセスをサポートするサーバーとして Nginx がインストールされます。同時に、後で FastDFS の Nginx モジュールをインストールするための Nginx 環境も必要になります。 ファイルにアクセスするには、StorageServer が配置されているサーバーにのみ Nginx をインストールする必要があります。ここでは単一のマシンなので、TrackerServer と StorageServer は同じサーバー上にあります。 1. nginxに必要な環境をインストールする① gccのインストール
② PCRE pcre-develのインストール
③ zlibのインストール
④ OpenSSLのインストール
2. Nginxをインストールする① nginxをダウンロード
②減圧
③ デフォルト設定を使用する
④ コンパイルしてインストールする
⑤ nginxを起動する
⑥ スタートアップの設定
⑦ nginxのバージョンとモジュールを確認する
⑧ ファイアウォールでNginxポートを開く(デフォルトは80) 追加後、このマシンのポート 80 を使用してアクセスできるようになります。 # vim /etc/sysconfig/iptables 次のポート行を追加します。 -A 入力 -m 状態 --state 新規 -m tcp -p tcp --dport 80 -j 受け入れる ファイアウォールを再起動します。 # サービスiptablesを再起動 3. ファイルにアクセスするシンプルなテストアクセスファイル ① nginx.confを修正する # vim /usr/local/nginx/conf/nginx.conf /group1/M00を/ljzsg/fastdfs/file/dataにマップするには、次の行を追加します。 場所 /group1/M00 { エイリアス /ljzsg/fastdfs/file/data; }# nginx を再起動します# /usr/local/nginx/sbin/nginx -s reload ② ブラウザで先ほどアップロードした画像に正常にアクセスします。 http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg 4. FastDFS 構成 Nginx モジュール1. Nginxモジュールをインストールして設定する① fastdfs-nginx-module モジュールの説明 FastDFS は Tracker サーバーを介してストレージ サーバーにファイルを保存しますが、同じグループ内のストレージ サーバー間でファイルをコピーする必要があるため、同期が遅延します。 Tracker サーバーがファイルを 192.168.51.128 にアップロードし、アップロードが成功した後にファイル ID がクライアントに返されるとします。 このとき、FastDFS ストレージ クラスター メカニズムは、このファイルを同じグループ 192.168.51.129 内のストレージに同期します。ファイルがコピーされる前に、クライアントがこのファイル ID を使用して 192.168.51.129 上のファイルを取得すると、ファイルにアクセスできないことを示すエラー メッセージが表示されます。 fastdfs-nginx-module は、ファイル リンクをソース サーバーにリダイレクトしてファイルを取得し、クライアントのレプリケーション遅延によって発生するファイル アクセス エラーを回避できます。 ② fastdfs-nginx-moduleをダウンロードして解凍する # なぜここにはこんなに長い文字列があるのでしょうか? マスターの最新バージョンと現在の nginx の間にバージョンの問題があるためです。 # wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip # 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip を解凍します # 名前変更 # mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module-master ③ Nginxの設定 nginxにモジュールを追加する # まず nginx サービスを停止します# /usr/local/nginx/sbin/nginx -s stop 解凍したパッケージ ディレクトリに入ります# cd /softpackages/nginx-1.12.1/ # モジュールを追加# ./configure --add-module=../fastdfs-nginx-module-master/src 再コンパイルしてインストールします # make && make install ④ Nginxモジュールを表示する
以下はモジュールが正常に追加されたことを示しています ⑤ fastdfs-nginx-moduleソースコードの設定ファイルを/etc/fdfsディレクトリにコピーし、変更します。
以下の設定を変更します。その他のデフォルト #接続タイムアウト connect_timeout=10 トラッカーサーバー トラッカーサーバー=file.ljzsg.com:22122 # StorageServer のデフォルトポート storage_server_port=23000 # ファイルIDのURIに/group**が含まれている場合はtrueに設定します url_have_group_name = true # ストレージ設定の store_path0 パスは storage.conf のパスと一致している必要があります store_path0=/ljzsg/fastdfs/file ⑥ FastDFS設定ファイルを/etc/fdfsディレクトリにコピーする
⑦ nginxの設定とnginx.confの変更
設定、その他のデフォルトを変更する fastdfs-nginxモジュールをポート80に追加します 場所 ~/group([0-9])/M00 { ngx_fastdfs_モジュール; } 知らせ: listen 80 ポート値は、/etc/fdfs/storage.conf の http.server_port=80 に対応している必要があります (以前は 80 に変更されていました)。別のポートに変更する場合は、それを統合し、ファイアウォールでポートを開く必要があります。 場所の設定については、複数のグループがある場合は、場所を ~/group([0-9])/M00 に設定します。グループがない場合は、グループは必要ありません。 ⑧ /ljzsg/fastdfs/file ファイル保存ディレクトリの下にソフトリンクを作成し、実際にデータが格納されているディレクトリにリンクします。この手順は省略できます。
⑨ nginxを起動する
印刷場所が次のとおりであれば設定は成功です ⑩ アドレスバーにアクセスします。 ファイルをダウンロードできればインストールは成功です。 3 番目のポイントでの nginx ルーティング アクセスの直接使用とは異なり、ここでは fastdfs-nginx-module モジュールがファイル リンクをソース サーバーにリダイレクトしてファイルを取得するように構成されていることに注意してください。 http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg 最終的なデプロイメント構造図(盗用画像):以下の構造に従って環境を構築できます。 5. Javaクライアントファイル システム プラットフォームが構築されたので、システム内でアップロードとダウンロードを実装するためのクライアント コードを記述する必要があります。以下は簡単なテスト コードです。 1. まず、FastDFSクライアントのJava開発環境を構築する必要があります。① プロジェクト内の依存関係管理には Maven を使用します。pom.xml に以下の依存関係を導入できます。 <依存関係> <groupId>net.oschina.zcx7878</groupId> <artifactId>fastdfs-client-java</artifactId> <バージョン>1.27.0.0</バージョン> </依存関係> その他の方法については、公式ドキュメントを参照してください: https://github.com/happyfish100/fastdfs-client-java ② 設定ファイルのインポート パッケージ内の fastdfs-client.properties.sample または fdfs_client.conf.sample をプロジェクトに直接コピーし、.sample を削除できます。 ここでは、fastdfs-client.properties.sample の設定をプロジェクト設定ファイル config.properties に直接コピーし、tracker_servers を変更します。この設定ファイルを読み込むだけです 2. クライアントAPI個人パッケージ化された FastDFS Java API は github に同期されています: https://github.com/bojiangzhou/lyyzoo-fastdfs-java.git 6. 権限制御以前は、http ファイル アクセスをサポートするために nginx を使用していましたが、このファイル サーバーには誰でも直接アクセスできるため、いくつかの権限制御が行われます。 FastDFS の権限制御は、サーバー側でトークン検証を有効にすることです。クライアントは、ファイル名、現在の Unix タイムスタンプ、および秘密キーに基づいてトークンを取得します。アドレスにトークン パラメータを追加することで、http 経由でファイルにアクセスできます。 ① サーバー上でトークン検証を有効にする http.confを変更する # vim /etc/fdfs/http.conf トークン検証を有効にするには、true に設定します http.anti_steal.check_token=true トークンの有効期限を秒単位で設定します http.anti_steal.token_ttl=1800 キーは、クライアント構成ファイル http.anti_steal.secret_key=FASTDFS1234567890 の fastdfs.http_secret_key と一致している必要があります。 トークンチェックが失敗した場合、返されるページは http.anti_steal.token_check_fail=/ljzsg/fastdfs/page/403.html です。 サービスを再起動することを忘れないでください。 ② クライアントの設定 クライアントは次の 2 つのパラメータを設定するだけで、両側のキーは一貫した状態を保ちます。
③ クライアントがトークンを生成する ファイルにアクセスするには、生成されたトークンと Unix タイムスタンプが必要です。返されるトークンは、トークンとタイムスタンプの連結になります。 その後、トークンを次のアドレスに連結することでアクセスできます: file.ljzsg.com/group1/M00/00/00/wKgzgFnkaXqAIfXyAAEoRmXZPp878.jpeg?token=078d370098b03e9020b82c829c205e1f&ts=1508141521 /** * サーバーにアクセスするためのトークンを取得し、アドレスに追加します* * @param filepath ファイルパス group1/M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg * @param httpSecretKey キー * @return トークンを返します。例: token=078d370098b03e9020b82c829c205e1f&ts=1508141521 */ パブリック静的文字列 getToken(文字列ファイルパス、文字列 httpSecretKey){ // UNIX 秒 int ts = (int) Instant.now().getEpochSecond(); //トークン 文字列トークン = "null"; 試す { トークン = ProtoCommon.getToken(getFilename(filepath), ts, httpSecretKey); } キャッチ (UnsupportedEncodingException e) { e.printStackTrace(); } キャッチ (NoSuchAlgorithmException e) { e.printStackTrace(); } キャッチ (MyException e) { e.printStackTrace(); } StringBuilder sb = 新しい StringBuilder(); sb.append("token=").append(token); sb.append("&ts=").append(ts); sb.toString() を返します。 } ④ 注意事項 生成されたトークンの検証が失敗した場合は、次の 2 つのチェックを実行してください。 B. サーバー時間が基本的に一貫していることを確認します。サーバー時間はあまり異なってはならず、分単位で異なってはならないことに注意してください。 ⑤ 一方、システムファイルのプライバシーが高い場合は、Nginx を http 経由でアクセスするように構成しなくても、fastdfs-client が提供する API を介して直接アクセスできます。 Nginx を設定する主な目的は、サーバー ファイル (画像など) にすばやくアクセスすることです。権限の検証も必要な場合は、クライアントがトークンを生成する必要がありますが、これは実際には意味がありません。 重要なのは、FastDFS が一部のリソースにトークン検証を追加して部分的に開く方法がわからなかったことです。ご存知の方がいらっしゃいましたらメッセージを残してください。 さて、上記は FastDFS を使用してファイル システムを構築し、単一のマシンでアップロードとダウンロードを行うプロセスです。 |
<<: Vue+Router+Element でシンプルなナビゲーションバーを実装する
>>: MySQL 8.0.19 インストール詳細チュートリアル (Windows 64 ビット)
目次1. シナリオ2. 基盤となるAPIを簡素化する2.1 自動的に破棄を呼び出す2.2 VM値を作...
目次序文1. 基本環境1. サービス配信2. ネットワーク構成(全ノード) 3. SSHパスワードフ...
explain はクエリ実行プラン情報を取得するために使用されます。 1. 文法次のように、sele...
コードをコピーコードは次のとおりです。 .sugLayerDiv{位置:相対; overflow:h...
ソフィー・ハルダッククライドキー埠頭 37 東ソープボックス Rxバランス EEハーバー対比 SVN...
マウスの位置をマッピングしたり、ドラッグ効果を実装したりすることは、 JavaScriptで行うこと...
検索ページ: search.wxml ページ: <view class="form&...
XHTML CSS ページ制作中に遭遇する問題の解決策は、解決策と呼ぶには少々大げさです。せいぜい、...
1. Vimの公式ウェブサイトにアクセスして、オペレーティングシステムに適した実行ファイルをダウンロ...
序文システムにファイル システムを作成し、それを永続的または非永続的にマウントする方法を学習します。...
序文MySQL には次の 4 種類の演算子があります。算術演算子比較演算子論理演算子ビット演算子これ...
XHTML には多くのタグがありますが、頻繁に使用されるのはごくわずかであり、習得する必要があるのは...
レイアウトを編集するとき、通常は水平センタリングと垂直センタリングを使用してデザインします。水平セン...
この記事では、カラービューアを実装するためのJavaScriptの具体的なコードを参考までに紹介しま...
序文この記事では、DBA がいないチームが参考にできるように、MySQL の一般的な使用に関するヒン...