PowerCMS X ブログ

2025-06-13

PowerCMS X ミーティング Vol.3 を開催しました

2025年6月12日に「PowerCMS X ミーティング Vol.3」を開催しました。47名ものご参加をいただき、まことにありがとうございました。
このセミナーは、5月にリリースした PowerCMS X ver.4 と PowerCMS X クラウド WAF / CDN オプションについてのご紹介を中心に、JIS X 8341-3 の適合レベル A なのに手間のかかる動画の字幕作成を、PowerCMS X で簡単に作成するデモを行いました。

冒頭、予定にはなかったのですが、事前にいただいたご質問からデータ移行についてのご説明をはさみました。スクレイピングでのデータ移行はかなり便利ですので、ぜひお試しください。
この機能については、7月下旬にハンズオンセミナーを行う予定ですので、お楽しみに♪

PowerCMS X 4 新機能の概要

メディア連携

こちらは、PowerCMS X で管理作成しているコンテンツを、ニュースサイトへ直接配信できる機能になります。
これにより、より早くよりスムーズなニュースサイトへのコンテンツ配信が可能になり、運用者の負担の軽減も可能になります。
こちらは先着3社様に限り、設定作業なども含めて無償で行います。
下記ページの「お問い合わせボタン」よりご連絡ください。

外部ニュース配信機能を備えた PowerCMS X メディアパックキャンペーン
https://powercmsx.jp/mediapack/index.html

SNS 連携に LINE が追加

PowerCMS X 4 では、多くのご要望をいただいた LINE との連携にも対応しました。
X の連携機能と同様、コンテンツの公開時に LINE へも投稿できます。
投稿時に必ず入れたいテキストの設定などは、テンプレートタグを使って設定が可能です。
LINE 登録いただいたお客様にだけの特別なお知らせなどにご活用いただけると思います。

このほかにもお客様からのご要望に応えた機能としまして

  • 公文書作成に対応するリストボタン
  • ログローテーションの削除と、ローカルディスクへの保存を実現
  • ユーザーログイン時のメール通知
  • ウェブアクセシビリティの検証を、WCAG2.1 に対応
  • アセットのファイル名のバリデーション

などがあります。

次バージョンのリリースは未定ですが、お客様からのリクエストが多い機能は順次実装される可能性があります。ぜひお気軽にご連絡ください。

問い合わせ
https://powercmsx.jp/contact/contact_us.html

本日の資料

PowerCMS X Version 4 新機能の概要(pdf 3.8MB)

PowerCMS X クラウド および WAF と CDN オプションの紹介

PowerCMS X でもクラウドサービスを展開していますが、みなさまご存じでしたでしょうか。
PowerCMSクラウドは、Microsoft Azure 上で構成されていますが、PowerCMS Xクラウドは AWS 上に構築しています。最近は、クラウドサービスへのお問い合わせが増えてきています。
クラウドでできることのご紹介から、プランの違いなどをご説明しました。

PowerCMS Xクラウドのセキュリティ対策オプションに WAF が登場

PowerCMS X Cloud Security に次いで非常にご要望の多かった WAF をオプションに追加しました。
協力会社によるプロキシ型の WAF ソリューションです。今春にパッケージに対する脆弱性診断もおこない、いままでかなわなかったセキュリティ要件にも自信を持って○をつけられるようになります。レポート作成のオプションもございますので、ぜひご検討ください。

PowerCMS XクラウドのCDN配信オプションを拡充

もとより PowerCMS X では、S3、CloudFront との連携機能を有していて、PowerCMS Xクラウドでもフロントサーバーとして提供していましたが、より大規模な配信を見据えて転送量上限の異なる3プランを発表しました。

PowerCMS X での高度な AWS 連携

PowerCMS X での、S3、CloudFront との連携機能について、より高度な設定や、追加で Elemental MediaConvert とも連携することができるようになりました。これらにより、動画配信の実現はもちろん、発生する費用の削減が可能になります。

本日の資料

PowerCMS X クラウド および WAF と CDN オプションの紹介 (pdf 2.5MB)

AIによる要約機能 / 動画字幕機能

AI を活用している機能たち

PowerCMS X には、AI を活用した機能がすでにいくつか搭載されています。

  • 画像の代替テキスト
  • OCR(文字認識)
  • 機械翻訳
  • 合成音声の作成
  • 文章の校正支援
  • やさしい日本語の作成支援

日本橋という地名に対して、東京では「にほんばし」、大阪では「にっぽんばし」と読み方が違います。
これは野田の鉄板ネタで、「難波の次の駅は日本橋です」というテキストに対して、「にほんばし」とふりがながつくと、これは「にっぽんばし」と修正をします。
今日はそこではなく「難波」のイントネーションがおかしいからと修正。平坦に読み上げられていた「なんば」が、尻下がりの「なんば」に変わったときは、リアルに「すごい!」と声が出てしまいました。

朝日新聞社のツールとの連携

2024年1月18日付で朝日新聞グループに加わったこともあり、朝日新聞社のツールとの連携もしています。

TSUNA プラグイン

朝日新聞が大量に保有している過去30年分の記事データを、効率よく処理させるために前処理・フィルタリングをした上で、ディープラーニングの機構を用いて学習したデータを元にした API と連携しています。

自動要約生成API:朝日新聞社メディア研究開発センター 人工知能研究の取り組み
https://cl.asahi.com/api_data/headlinegeneration.html

こちらは、PowerCMS Xクラウドをご利用中のお客様は回数無制限、パッケージ版は APIコール数月100回までは無料でご利用いただけますので、ぜひお試しください。

Typoless プラグイン

Typoless は、朝日新聞社が新聞社のノウハウを最先端のAIで実現した校正支援のサービスです。
こちらはすでにリリースをしていますので、合わせてご確認いただければと思います。

Typoless(タイポレス) 朝日新聞社の文章校正AI
https://typoless.asahi.com/

動画の字幕

PowerCMS X には、ver.3.03 で CMS で管理する動画の字幕を追加・編集する機能が追加されていました。
しかし、社内から字幕をつける作業の使い勝手があまりよくなく、非常に大変だという意見がでていました。
そこで、今バージョンでは AI の力を借りることで、動画から文字起こし、そのまま字幕として付与することができるようにしました。間違っている部分の修正はもちろん、文字の数、切り替えるタイミングなど細かい調整も可能となり、かなり便利になっています。
ほかにも、字幕の書体、表示位置、背景入りにするなどの選択も可能ですし、CMS からの書き出しについても字幕テキストだけ、音声だけ、動画に焼き付けてしまうなど、いろいろな方法があります。
すでに文字起こしをしたテキストがある場合は、ペーストすることで均等に割り付けも可能。BGM の追加や、別の動画をワイプで合成する、ナレーションを追加するなどの編集も可能と、本当に盛りだくさんです。

VideoCaptionsプラグインで動画に字幕をつける | PowerCMS X
https://powercmsx.jp/blog/video-subtitles.html

本日の資料
PowerCMS X AI による要約機能 / 動画字幕機能 (pdf 1.1MB)

伝える PDF

本日冒頭で少し宣伝させていただきましたが、PowerCMS X に含まれている機能から、PDF のアクセシビリティに関するものだけを取り出してサービスとしてリリースしました。
単一ページの PDF であれば、下記のページからお試しいただけます。

伝えるPDF | 選挙公報の音声読み上げ対応を支援
https://tsutaeru.cloud/tsutaeru_pdf/index.html

単一ページのPDFをアップロード後のチェック結果画面

PowerCMS のウェビナーも開催します!

6月26日 に、PowerCMS のウェビナーも行います。PowerCMSクラウドにも、WAF / CDN のオプションが追加となり、人気の高い PowerSync の性能強化についてのご紹介をいたします。
あわせて IR サイトの運用を円滑に行うためのノウハウもお話しします。ぜひ、こちらもご参加ください。

PowerCMS クラウド 新オプション WAF / CDN 紹介オンラインセミナー申し込みフォーム
https://www.powercms.jp/news/seminar-20250626.html

カテゴリー:イベント・セミナー情報

投稿者:佐藤ち

2025-06-10

リッチテキストエディタに新たに追加されたボタン

PowerCMS X バージョン4 にてリッチテキストエディタで利用できる以下のボタンを新たに追加しました。

  • pt-indent (段落字下げインデント)
  • list-hiragana(ひらがなリスト)
  • list-katakana(カタカナリスト)
  • list-japanese-formal(書類漢字リスト)
  • list-japanese-informal(日常漢字リスト)

TinyMCEプラグインの設定で「ツールバー」に上記を追加することでリッチテキストエディタのボタンとして使用できるようになります。

追加されたボタン(左から pt-indent list-hiragana list-katakana list-japanese-formal list-japanese-informal )

pt-indent による段落字下げインデント

pt-indent ボタンを使用すると選択した段落に字下げを適用することができます。

pt-indent による字下げのイメージ

リストボタンによる日本語装飾

list-hiragana、list-katakana、list-japanese-formal、list-japanese-informal ではそれぞれリストの装飾を変更することができます。

list-hiragana による表示

list-katakana による表示

list-japanese-formal による表示

list-japanese-informal による表示

注意事項1

「pt-indent」については HTMLコードに「pt-indent」という class 名が付与されます。
そのままではスタイルが適用されないため、エディタ用CSS(powercmsx/assets/css/editor.css)に下記のコードが必要になります。※1

.pt-indent {
  text-indent: 1em;
}

また、テーマ(出力ページ)も対応する必要があるため、
スタイルシートを出力しているビュー(もしくはサイト用のスタイルシート)に上記のコードを追加します。※2

※1. 最新版のエディタ用CSS(powercmsx/assets/css/editor.css) には反映されているため修正は不要です。
※2. 最新版の Website / Media テーマには反映されているため新規にテーマを適用した場合は修正は不要です。

注意事項2

今回追加されたボタンは TinyMCE 4 を使用している環境(環境変数で「tinymce_version」に「4.x」を指定)ではご利用頂けません。

カテゴリー:プラグイン

投稿者:fujimoto

2025-06-09

動画に管理画面の権限や会員ログインによるアクセス制限をかける

PowerCMS ver.4.0で「VideoCaptions」が大幅に機能強化され、AI字幕作成や簡易動画編集などの機能が追加されました。
ストリーミング形式(HLS)への変換などもサポートされており、PowerCMS Xは動画 CMSとしても利用できるようになりました。

動画サイトの運営に関するリクエストに「編集中の動画に対する閲覧制限をしたい」「動画が外部に漏洩しないようにしたい」といったものがあります。
動画に閲覧制限をかける方法をいくつかご紹介します。

  • /media/ディレクトリに動画をアップロードして、その動画に閲覧制限をかける方法をご紹介します。
  • 動画のアップロードは FileUploaderプラグインを有効化してモデル「ファイル」のオブジェクトとしてアップロードする前提です。
  • また、ステータスによる閲覧制限をかけるため、ファイルオブジェクトには statusカラムを追加して有効期限対応を指定しておきます。

会員ログインによる閲覧制限

プラグイン「Members」による会員限定サイトを運営していることを前提とします。

/media/.htaccess

Require all denied
ErrorDocument 403 /viewer.php

まず、/media/ディレクトリへのアクセスを制限します。特定の拡張子のファイルを対象にしても良いですが、ここでは全てのファイルに対して制限をかけます。ErrorDocument 403 /viewer.php を指定して、リクエストを PHPへ渡すようにします。

/viewer.php

<?php
$base_path = '/opt/homebrew/var/www/powercmsx/'; // PowerCMS Xのディレクトリ
require_once( $base_path.'class.Prototype.php' );
$app = new Prototype();
$app->init();
$bootstrapper = new PTViewer();
if (!isset( $_SERVER['REDIRECT_URL'] ) ) {
    // /viewer.phpへ直接アクセスがあった時
    $bootstrapper->page_not_found( $app );
}
$redirect_url = $_SERVER['REDIRECT_URL'];
$dirname = dirname( $redirect_url );
$dir_name = '/' . $app->sanitize_dir( $dirname );
$file_name = basename( $redirect_url );
$file_name = $app->sanitize_file( $file_name );
$file_path = $app->document_root . $dir_name . $file_name;
if (! file_exists( $file_path ) ) {
    // ファイルが存在しない
    $bootstrapper->page_not_found( $app );
}
$obj = $app->db->model( 'upload_file' )->get_by_key( ['file_path' => $file_path ] );
if (! $obj->id ) {
    // ファイルオブジェクトが存在しない
    $bootstrapper->page_not_found( $app );
}
// 例えばファイルオブジェクトに statusカラムを追加している時
if ( $obj->status != 4 ) {
    // ステータスが公開でない時
    $bootstrapper->page_not_found( $app );
}
$member = $app->user( 'member' );
if (! $member ) {
    // 会員サイトのログインチェック
    $bootstrapper->page_not_found( $app, $obj->workspace, $app->translate( 'Permission denied.' ) );
}
// 必要に応じてメンバーの属性などをチェック
header( 'HTTP/1.1 200 OK' ); // 403ヘッダーを上書きする
$mime_type = $obj->mime_type;
header( "Content-Type: {$mime_type}" );
readfile( $file_path ); // ファイル出力
exit();

$bootstrapper->page_not_found( $app ); の結果はダイナミック・パブリッシュングのエラー表示となります。

ページが見つかりません(404ページ)

改良 : readfile関数の利用を避ける

readfileや echo file_get_contents( file_path );でも動画をブラウザへ返すことはできますが、
PHPを介して動画レスポンスを返していると大きなファイルサイズの動画へのリクエストが集中したりするとサーバーの負荷が一気に上がってしまいます。

そこで、mod_xsendfile を利用して、レスポンスはウェブサーバー(Apache)に任せてしまい、PHPでは権限のチェックのみを行うことにします。
mod_xsendfile.soをビルドしてサーバーに設置、httpd.confを編集します(編集後 httpdを再起動)。

httpd.conf

LoadModule xsendfile_module lib/httpd/modules/mod_xsendfile.so
<Directory "/var/www">
    XSendFile On
    XSendFilePath "/var/www"
</Directory>

/viewer.php

以下の部分を修正します。

header( 'HTTP/1.1 200 OK' ); // 403ヘッダーを上書きする
$mime_type = $obj->mime_type;
header( "Content-Type: {$mime_type}" );
readfile( $file_path ); // ファイル出力
exit();

ここを以下のように変更します。readfileを使わないため PHPでは権限のチェックのみを行うことで負荷を下げることができます。

header( 'HTTP/1.1 200 OK' ); // 403ヘッダーを上書きする
$mime_type = $obj->mime_type;
header( "Content-Type: {$mime_type}" );
header( "Content-Disposition: inline; filename=\"{$file_name}\"" );
header( "X-Sendfile: {$file_path}" ); // Apacheによるファイル出力
exit();

管理画面のユーザー権限による動画へのアクセス制限

会員ではなく、管理画面へのログイン状況とそのファイルオブジェクトの編集権限によって制限をかける方法です。

<?php
$base_path = '/var/www/powercmsx/'; // PowerCMS Xのディレクトリ
require_once( $base_path.'class.Prototype.php' );
$app = new Prototype();
$app->init();
$bootstrapper = new PTViewer();
if (!isset( $_SERVER['REDIRECT_URL'] ) ) {
    // /viewer.phpへ直接アクセスがあった時
    $bootstrapper->page_not_found( $app );
}
$redirect_url = $_SERVER['REDIRECT_URL'];
$dirname = dirname( $redirect_url );
$dir_name = '/' . $app->sanitize_dir( $dirname );
$file_name = basename( $redirect_url );
$file_name = $app->sanitize_file( $file_name );
$file_path = $app->document_root . $dir_name . $file_name;
if (! file_exists( $file_path ) ) {
    // ファイルが存在しない
    $bootstrapper->page_not_found( $app );
}
$obj = $app->db->model( 'upload_file' )->get_by_key( ['file_path' => $file_path ] );
if (! $obj->id ) {
    // ファイルオブジェクトが存在しない
    $bootstrapper->page_not_found( $app );
}
$user = $app->user();
if (! $user ) {
    // 管理画面にログインしていない
    $bootstrapper->page_not_found( $app, $obj->workspace, $app->translate( 'Permission denied.' ) );
}
if ( $obj->status != 4 ) {
    // ステータスが公開でない時
    $can_do = $app->can_do( 'upload_file', 'edit', $obj );
    if (! $can_do ) {
        // 編集権限がない
        $app->error( 'Permission denied.' );
    }
}
header( 'HTTP/1.1 200 OK' );
$mime_type = $obj->mime_type;
header( "Content-Type: {$mime_type}" );
header( "Content-Disposition: inline; filename=\"{$file_name}\"" );
header( "X-Sendfile: {$file_path}" );
exit();

$app->error( 'Permission denied.' ); の結果は、管理画面の権限エラーメッセージとなります。

管理画面の権限エラー画面

カテゴリー:技術情報 | サイト制作全般 | よくあるご質問 | コラム・その他

投稿者:Junnama Noda

ブログ内検索

アーカイブ


日本語
ふりがな付き
English
简体中文
繁體中文
한국어