















<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    
    <title>ホームページ集客支援 · 月70万PVウェブ制作会社 レスキューワーク株式会社</title>
    
    <link>https://rescuework.nagoya/</link>
    <description>Recent content in ホームページ集客支援 · 月70万PVウェブ制作会社 レスキューワーク株式会社</description>
    
    <language>ja</language>
    
    
    
    <copyright>(C) 2013-2025 レスキューワーク株式会社</copyright>
    
    
    <lastBuildDate>Wed, 11 Nov 2020 08:56:52 +0900</lastBuildDate>
    
    
    <atom:link href="https://rescuework.nagoya/index.xml" rel="self" type="application/rss+xml"/>
    
    
    <item>
      
      <title>Nano Banana Pro で画像生成</title>
      
      
      <link>https://rescuework.nagoya/blog/nano-banana/</link>
      <guid>https://rescuework.nagoya/blog/nano-banana/</guid>
      
      
      <pubDate>Thu, 11 Dec 2025 07:38:55 +0900</pubDate>
      
      
      
      <description><![CDATA[<p>この記事にはアフィリエイト広告が含まれます。</p>

<p>Google Workspace アカウントで、生成AI Gemini が利用できます。(Google Workspace に登録していなくても Gemini 自体は利用できるようです。)</p>
<p>弊社では、「Gメールに届いたメールの要点を抽出する」をよく利用しています。画面右上のサイドバーにすぐ表示できるので、素早く利用できるのが重宝しています。</p>
<p><img src="/images/gmail-gemini.png" alt="GメールでGeminiを起動する" class="img-fluid img-thumbnail"></p>

<h3>画像を生成する</h3>

<p>Gemini で画像を作ってもらうことができます。2025年11月にリリースされた Nano Banana Pro を使用します。実際に作ってもらった画像が↓です。</p>
<p><img src="/images/book-recommend-summary.png" alt="ブックレコメンドの概要"  class="img-fluid img-thumbnail"></p>
<p>弊社で運営している書評メディア『<a href="https://book-recommend.com/promotion/">ブックレコメンド</a>』の紹介ページ(本の著者向け)をまとめてもらいました。上のような画像にまとめてくれました。</p>

<h3>実際にやったこと</h3>

<p>プロンプトとしては、以下のように2ステップで行いました。</p>
<code>
    https://book-recommend.com/promotion/
    ↑のサイトの魅力をまとめてほしい
</code>
<p><img src="/images/pronpt1.png" alt="サイトの魅力1"  class="img-fluid img-thumbnail"></p>

<code>
    ↑をSNSで拡散しやすいように、一枚の画像にしてほしい
</code>

<p><img src="/images/pronpt2.png" alt="サイトの魅力2"  class="img-fluid img-thumbnail"></p>

<p>いきなり画像を生成してもらうこともできますが、画像生成には時間がかかります。なので、</p>

<ol>
    <li>テキストで出力してもらう (テキスト内容が不満なら作り直す)</li>
    <li>出力を画像にしてもらう</li>
</ol>

<p>という手順にすると、速く作成できるように思います。</p>

<h3>利用は</h3>

<p><a href="https://referworkspace.app.goo.gl/h4Uu">Google Workspace</a>に登録すると利用できます。このリンクから登録すると、10%割引(初年のみ)でご利用いただけます。</p>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
]]></description>
      
    </item>
    
    <item>
      
      <title>条件分岐フォームの作り方</title>
      
      
      <link>https://rescuework.nagoya/blog/conditional-form/</link>
      <guid>https://rescuework.nagoya/blog/conditional-form/</guid>
      
      
      <pubDate>Fri, 28 Mar 2025 07:59:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>条件分岐フォームの作り方を、弊社ウェブサービス「マイ見積」を例に解説します。</p>

<h3>想定</h3>
<p><a href="https://my-mitsu.com/sample/video-edit">動画編集見積例</a>を題材にしてみます。</p>
<p>要件としては、「BGMあり・なし」を選択する&rarr;「BGM入れる」の場合は「著作権フリーの音源・著作権のある音源」の選択フォームを表示する、です。</p>

<p>以下のように選択フォームで設定します。</p>
<p><img src="/images/choice1.png" alt="BGM" class="img-fluid img-thumbnail"></p>


<p><img src="/images/choice2.png" alt="BGMオプション" class="img-fluid img-thumbnail"></p>

<p>特徴としては、条件分岐の対象側、この例では「著作権フリーの音源・著作権のある音源」の選択フォーム、で条件分岐設定を行うことです。</p>
<p>フォーム設定の下部にある、条件1を<b>はい</b>、<b>Choice1</b>、<b>等しい</b>、<b>1</b>と設定します。<b>Choice1</b>はBGMあり・なしの選択フォームで、<b>1</b>はあり、を示しています。</p>

<p>こうすることで、BGMの設定フォームで「あり」を選んだ場合にのみ、「BGM著作権」の選択フォームを表示します。</p>

<h3>操作画面のキャプチャ</h3>
<p>実際の操作例は↓をごらんください。</p>

<p><img src="/images/conditional.gif" alt="条件分岐フォーム" class="img-fluid img-thumbnail"></p>

<p data-redactor-inserted-image="true">ウェブサービス「<a href="https://my-mitsu.com/" target="_blank">マイ見積</a>」は、条件分岐フォームに対応した見積計算フォームが無料で作成できます。ホームページの問い合わせフォームの改善にご利用ください。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>Concrete CMSのアドオン「Text Attribute with RegEx Validation」を公開しました。</title>
      
      
      <link>https://rescuework.nagoya/blog/concretecms-regex/</link>
      <guid>https://rescuework.nagoya/blog/concretecms-regex/</guid>
      
      
      <pubDate>Mon, 26 Aug 2024 12:36:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>Text Attribute with RegEx Validationは、属性「テキスト」に、正規表現を用いた入力データ検証を追加できるアドオンです。</p>

<img src="/images/regex-validation.png" alt="Text Attribute with RegEx Validation" class="img-fluid img-thumbnail">

<h3>正規表現を活用する</h3>
<p>テキストデータを入力するときに、書式を指定したい場合があります。メールアドレスなどは既定のフォームがあるのですが、そうではなくて独自の形式にしたい場合もあるでしょう。例えば、製品型番などで、「アルファベット3文字+数字4文字」などといったケースが考えられます。</p>

<p>そういった場合に役立つのが、このText Attribute with RegEx Validationです。</p>

<img src="/images/regex-adminpage.png" alt="正規表現テキストの編集画面" class="img-fluid img-thumbnail">

<p>管理画面では、正規表現自体の他、コンテンツ編集者への補足、エラー時のメッセージ、が設定できます。</p>

<h3>正規表現の例</h3>

<p>正規表現の例をいくつか紹介してみます。</p>
<p>郵便番号:↓ は、3桁の数字、ハイフン、4桁の数字。</p>
<pre><code>/^\d{3}-\d{4}$/</code></pre>
<p>※上の正規表現は、あくまで桁数だけの判定です。桁数があっていても、郵便番号としては存在しない数字のことがあります。</p>

<p>先頭が大文字の英単語:↓ は、先頭が大文字アルファベット、2文字目以降は小文字のアルファベット。(大文字1文字だけも可)</p>
<pre><code>/^[A-Z][a-z]*$/</code></pre>
<p>※この場合も、あくまでアルファベットの並ぶ文字列であることをチェックします。英単語としては存在しない文字列のことがあります。</p>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
<h4>購入は</h4>
<p>購入はConcrete CMS の管理画面から可能です。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>Concrete CMSのアドオン「Lock if Out-Of-Office Hours」を公開しました。</title>
      
      
      <link>https://rescuework.nagoya/blog/concretecms-lock/</link>
      <guid>https://rescuework.nagoya/blog/concretecms-lock/</guid>
      
      
      <pubDate>Wed, 12 Jun 2024 13:36:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>Lock if Out-Of-Office Hoursは、営業時間を設定しておき、設定時間外はサイトへのアクセスを遮断するアドオンです。</p>

<p>管理画面へのアクセス可能時間帯を制限することで、不正アクセス対策の一部になります。</p>

<h3>曜日ごとの営業時間</h3>
<img src="/images/lock-if-out-of-office-hours.png" alt="Lock if Out-Of-Office Hours" class="img-fluid img-thumbnail">

<p>曜日ごとに、営業時間を設定できます。開始時刻と終了時刻とを入力されていれば、その日は営業日と判定します。片方または両方が未入力の日は休業日と判定します。</p>

<p>また特定の日を休日に設定できます。祝日、年末年始、お盆、ゴールデンウィーク、会社創業記念日などを設定しておくと、その日は休日となります。</p>

<h3>ロックの設定</h3>
<img src="/images/lock-setting.png" alt="ロック設定" class="img-fluid img-thumbnail">

<p>ロックする範囲を設定できます。「なし」「ダッシュボード」「全ページ」から選べます。ロックが有効になるのは、productionモードの場合のみです。</p>

<p>ロックされているときのメッセージも設定できます。</p>

<p>また、ロックされているときにアクセスがあった場合に、ログ記録するかどうかを設定できます。</p>

<p>という設定が可能です。</p>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
<h4>購入は</h4>
<p>購入はConcrete CMS の管理画面から可能です。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>グーグルフォームの作成者を確認願います</title>
      
      
      <link>https://rescuework.nagoya/blog/google-form/</link>
      <guid>https://rescuework.nagoya/blog/google-form/</guid>
      
      
      <pubDate>Fri, 17 May 2024 11:08:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>弊社では、問い合わせフォームの一部に、グーグルフォームを採用しています。</p>
<p>グーグルフォームで送信するときに、問い合わせフォームが弊社作成のものかどうかを確認願います。</p>

<p><img src="/images/google-form.png" alt="グーグルフォームの送信者"></p>

<h3>弊社で作成したグーグルフォームの場合</h3>
<p>グーグルフォームは多くの会社・個人が利用しているため、フォームをぱっと見ただけでは、作成者が分かりにくいですね。でも、心配ありません。グーグルフォームの下部をご覧いただくと、見分け可能です。</p>
<p>弊社で作成したグーグルフォームの場合、上の図のように、</p>
<p>このフォームは<b>レスキューワーク株式会社 内部</b>で作成されました。</p>
<p>という表記があります。この表記を確認していただければ、弊社で作成したフォームであることがわかります。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>WordPressユーザーのためのPHP入門 第4版が発売されます</title>
      
      
      <link>https://rescuework.nagoya/blog/php4wordpress/</link>
      <guid>https://rescuework.nagoya/blog/php4wordpress/</guid>
      
      
      <pubDate>Thu, 15 Feb 2024 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>この記事にはアフィリエイト広告が含まれます。</p>

<p><a href="https://www.amazon.co.jp/WordPress%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEPHP%E5%85%A5%E9%96%80-%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%82%89%E3%80%81%E3%81%A6%E3%81%84%E3%81%AD%E3%81%84%E3%81%AB%E3%80%82%EF%BC%BB%E7%AC%AC4%E7%89%88%EF%BC%BD-%E6%B0%B4%E9%87%8E%E5%8F%B2%E5%9C%9F/dp/4295206067?_encoding=UTF8&pd_rd_w=r0eGY&content-id=amzn1.sym.40b77006-462b-43ea-a608-25dcf53d35e8&pf_rd_p=40b77006-462b-43ea-a608-25dcf53d35e8&pf_rd_r=357-2941274-4395727&pd_rd_wg=WgPtv&pd_rd_r=6f04f2bd-92d6-488e-84b0-492fce221442&linkCode=ll1&tag=linuxonnotebo-22&linkId=4663d3721ca4b4d1c1368f13f67a68b0&language=ja_JP&ref_=as_li_ss_tl">WordPressユーザーのためのPHP入門 第4版</a>が発売されます。</p>

<p>第3版の出版から4年以上経過しました。この間にPHP8がリリースされ、WordPressもPHP8に対応するようになりました。</p>

<p>第4版は、PHPプログラミングの基礎の解説は第3版までを踏襲していますが、PHP8への対応、theme.jsonのカスタマイズ方法などを追記しています。</p>

<h2>PHP8を対象に</h2>

<p>
    PHP8では str_contains 等、新しい関数が追加されています。
    PHP学習コード・サンプルテーマ・エラー処理の解説をPHP8想定で構成しています。
</p>
<p>
    PHP8は、PHP7以前よりもエラー基準が厳しくなっています。PHP7以前ならNoticeだったエラー(例: Undefined variable)がPHP8ではWarningになるケースが多いです。(詳細は<a href="https://rescuework.nagoya/blog/php81/">古いプログラムのPHP8.1へのアップデート</a>参照)
</p>
<p>
    PHP8でNotice になるのは、&darr;タイムゾーンの設定ミスなど、かなり限定的です。
</p>
<pre>
    date_default_timezone_set( "Asia/Toyo"); // Asia/Tokyo のミス
</pre>
<pre>
    Notice: date_default_timezone_set(): Timezone ID 'Asia/Toyo' is invalid in /XXXXX.php on line XXX
</pre>

<h2>WordPressの更新へも対応</h2>

<p>ブロックパターン等、新しく利用できるようになった機能の解説も取り入れています。</p>

<h2>ブロックテーマ・ハイブリッドテーマ</h2>

<p>書籍の第5章で、ブロックテーマを少し紹介しています。旧来のテーマ(クラシックテーマ)にブロックテーマの機能を取り入れるハイブリッドテーマについても解説しています。<a href="https://php4wordpress.calculator.jp/chapter/">第4版の章・セクションの見出しはこちら</a>をご覧ください。</p>]]></description>
      
    </item>
    
    <item>
      
      <title>Gmail メール対策でGoogle WorkSpaceへ移行した</title>
      
      
      <link>https://rescuework.nagoya/blog/google-workspace/</link>
      <guid>https://rescuework.nagoya/blog/google-workspace/</guid>
      
      
      <pubDate>Fri, 02 Feb 2024 15:18:22 +0900</pubDate>
      
      
      
      <description><![CDATA[<p>この記事にはアフィリエイト広告が含まれます。</p>

<p>2024年2月以降、Gmailがスパムメール対策を強化していく、というアナウンスがありました。</p>
<p>このため、弊社のメールを、Google WorkSpaceへ移行することにしました。</p>

<h3>SPF, DKIM, DMARCへの対応</h3>

<p>メールの正当性検証の仕組みには、SPF, DKIM, DMARC等がありますね。Google WorkSpaceへ移行するとともに、DMARCにも対応させました。管理者ヘルプページに「<a href="https://support.google.com/a/answer/2466580?hl=ja">DMARC を使用してなりすましと迷惑メールを防止する</a>」があるので、このページに従って設定していけばOKです。</p>

<h3>Gmailへ送ってみる</h3>

<p>SPF, DKIM, DMARCの設定ができているかどうか？は、Gmailに送ってみるのが分かりやすいと思います。Gmailのメール詳細を見てみましょう。</p>
<p>
    <img src="/images/dmarc.png" class="img-fluid img-thumbnail">
</p>

<p>&uarr;のように表示されます。SPF, DKIM, DMARCが全部 PASS になっていれば、設定OKです。</p>

<h3>自分で設定するのが大変な方</h3>

<p>インターネットの仕組みをある程度知っていないと、SPF, DKIM, DMARC設定は難しいかもしれません。自分で設定するのが大変、という方は、ホームページ制作会社などに相談してみると良いと思われます。</p>

<h3>料金は</h3>

<p><a href="https://referworkspace.app.goo.gl/h4Uu">Business Starterプラン</a>ですと、1ユーザあたり月816円(年払いなら8,160円)で利用できます。このぐらいの金額であれば、中小企業でも利用しやすいかと思います。</p>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
]]></description>
      
    </item>
    
    <item>
      
      <title>N100ミニPCを購入</title>
      
      
      <link>https://rescuework.nagoya/blog/n100/</link>
      <guid>https://rescuework.nagoya/blog/n100/</guid>
      
      
      <pubDate>Fri, 13 Oct 2023 15:56:59 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>この記事にはアフィリエイト広告が含まれます。</p>

<p>弊社のパソコン端末は2年～3年程度の周期で変更しています。今回、CPUにN100搭載のミニPCがリーズナブルな価格だったので、試してみました。</p>

<h3>購入した商品</h3>

<p>購入した商品は、以下になります。</p>

<ol>
    <li><a href="https://hb.afl.rakuten.co.jp/ichiba/363a1c17.9bc70b03.363a1c18.a198ee17/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fchuwi%2Flarkbox-pro%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;">N100搭載 ミニPC【LPDDR5 12GB/SSD 512GB】</a></li>
    <li><a href="https://hb.afl.rakuten.co.jp/ichiba/363a1dec.4c1f414e.363a1dee.0bb0ceac/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fec-current%2F4995047049203%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;">EIZO(エイゾー) S1934-TGY(セレーングレイ) FlexScan 19型スクエア 液晶ディスプレイ</a></li>
    <li><a href="https://hb.afl.rakuten.co.jp/ichiba/363a2518.e0b8573b.363a2519.dcb40b15/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fdailyexpress%2Faj-b00dlk4gn8%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;">Lenovo レノボ ThinkPad キーボード 0B47190 トラックポイント 英語配列 有線</a></li>
</ol>

<p>モニタにはEIZOのFlexScanを購入しました。キーボード/マウスが付属していないミニPCを購入したので、キーボードも同時購入しました。</p>
<p>ミニPCは2万円台前半で購入できたので、予算をモニタに多く割り当てることができました。パソコン/モニタ/キーボードで、合計8万円程度(楽天ポイントが6,000ポイントぐらい付きました)でした。</p>

<h3>実際の速度はどうなのか？</h3>

<p>N100は、コストパフォーマンスが良い、という評判のCPUです。</p>

<p>Webプログラミングするときによく使うエディタ PhpStormを実際に N100搭載のミニPCで起動してみました。&darr; の gif 画像を見て、スピード感をイメージしてもらえればと思います。</p>

<img src="/images/phpstorm_n100.gif" alt="PhpStorm実行" class="img-fluid img-thumbnail">

<p>起動時には数秒時間がかかるものの、それ以外には遅いと感じることはありませんでした。個人的には良い選択だったなと考えています。理由は以下です。</p>
<ul>
    <li>プログラムを書く際に、CPU速度はさほど重要でない</li>
    <li>CPUに予算配分するよりも、液晶モニタなどに予算配分するほうが、人にとっての満足度に貢献する</li>
</ul>
<p>ウェブ制作/ウェブサービスの場合でも、動画の比重が大きい、というような場合は、CPUに予算配分したほうが良いかもしれません。</p>

<h3>置き場所はモニタの裏側</h3>

<p>ミニPCは、モニタの裏側に置くことができます。</p>
<div class="row">
    <div class="col-6"><img src="/images/monitor.jpg" class="img-fluid img-thumbnail"></div>
    <div class="col-6"><img src="/images/monitor2.jpg" class="img-fluid img-thumbnail"></div>
</div>
<p>デスクがすっきりするのも嬉しいですね。</p>

<h3>N100がお勧めな人は</h3>

<p class="alert alert-info">事務作業やプログラミングなど、CPU速度はそれほど重要でない人。&rarr;CPUの予算はN100利用で抑え、液晶モニタなどに予算配分するとコスパも良く、満足度の高い環境になる。</p>

<h3>N100を避けたほうが人は</h3>

<p class="alert alert-warning">動画編集など、CPU速度が重要な人。&rarr;N100ではキツそう。Core i7などを購入しよう。</p>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
]]></description>
      
    </item>
    
    <item>
      
      <title>否定レビューで終わらないウェブメディア</title>
      
      
      <link>https://rescuework.nagoya/media/</link>
      <guid>https://rescuework.nagoya/media/</guid>
      
      
      <pubDate>Tue, 25 Apr 2023 09:00:01 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>弊社運営のウェブメディアでは、否定レビューで終わらない仕組みを導入しています。</p>

<h3>書籍を次に読む本とセットで紹介する - ブックレコメンド</h3>
<p>
弊社運営のウェブメディアに、<<a href="//af.moshimo.com/af/c/click?a_id=3960752&p_id=2654&pc_id=5943&pl_id=33866" rel="nofollow" referrerpolicy="no-referrer-when-downgrade" attributionsrc>ブックレコメンド</a><img src="//i.moshimo.com/af/i/impression?a_id=3960752&p_id=2654&pc_id=5943&pl_id=33866" width="1" height="1" style="border:none;" loading="lazy">(200名のwebライターによる書評メディア)があります。このメディアは、
</p>
<p class="alert alert-info">ある本を読んだ人に、次に読む本を紹介する</p>
<p>という特徴があります。二冊の本を同時に紹介する仕組みです。</p>
<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" />                    </div>
        <div class="balloontext">
            面白そうなメディアだね。だけど、否定レビューとどう関係するのだろう？</div>
    </div>
</div>
<p>
    二冊の本を同時に紹介することにより、一冊の本では不十分だった点をカバーできます。<br>
    たとえば、
</p>
<p class="alert alert-success text-center">良い本だが、初学者には難しい本だった場合<br>
&darr;<br>
入門書とセットで紹介する</p>
<p class="alert alert-success text-center">良い本だが、古い本で最新のデータに対応していない場合<br>
    &darr;<br>
    新刊とセットで紹介する</p>
<p>などです。<br>
一冊の紹介をするレビューだと「初心者には難しかった」、「データが古いので減点」等、否定的なレビューで終わってしまうところを、その欠点を補う(=否定で終わらない)、ということが可能になります。</p>

<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" />                    </div>
        <div class="balloontext">
            なるほど。二冊を紹介することのメリットは大きいね。1+1が、2以上になるね。</div>
    </div>
</div>

<h3>寄稿者募集中</h3>
<p>寄稿いただける<a href="https://book-recommend.com/writer/">webライターを募集</a>しています。読書・書評に興味のある方はご参加ください。</p>

<h3>運営記録をキンドルで出版しています</h3>
<p>2020年から2025年までの運営記録をキンドル本で出版しています。 &rarr; <a href="https://www.amazon.co.jp/dp/B0G27X4DXH?&linkCode=ll1&tag=linuxonnotebo-22&linkId=d7b3f56992e0f12abed6065d4b9bb0af&language=ja_JP&ref_=as_li_ss_tl">２冊セットの書評メディア 「ブックレコメンド」6年間の運営の記録: 著者も読者もハッピーな仕組み</a></p>]]></description>
      
    </item>
    
    <item>
      
      <title>適格請求書発行事業者登録番号</title>
      
      
      <link>https://rescuework.nagoya/blog/invoice/</link>
      <guid>https://rescuework.nagoya/blog/invoice/</guid>
      
      
      <pubDate>Tue, 18 Apr 2023 08:54:53 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>レスキューワーク株式会社では、2023年10月1日から施行される適格請求書等保存方式に基づき、適格請求書の発行に向けて準備しております。</p>

<p>弊社の登録番号は、T6180001109825でございます。<br>国税庁の適格請求書発行事業者公表サイトからもご確認いただけます。</p>

<h3>自動見積もりウェブサービス(マイ見積)の請求書について</h3>
<p>
    弊社提供の自動見積もりウェブサービス(マイ見積)の請求書については、原則としてPayPal様より発行いただく形となっております。<br>
インボイス制度や電子帳簿保存法の都合で弊社からの発行が必要な方は、「請求書発行」プランを選択いただければと思います。事務手数料440円(消費税10%込)をご負担願います。なお2023年3月31日以前から有料プラン契約を継続されている方には、追加負担なしで発行いたします。
</p>]]></description>
      
    </item>
    
    <item>
      
      <title>オープンソースソフトウェアのコラボレーション</title>
      
      
      <link>https://rescuework.nagoya/blog/oss/</link>
      <guid>https://rescuework.nagoya/blog/oss/</guid>
      
      
      <pubDate>Fri, 07 Apr 2023 15:36:59 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p><a href="https://marketplace.concretecms.com/marketplace/addons/free-map">Free Map(オープンストリートマップをウェブサイトに表示させるプログラム)</a>を作成し、オープンソース(MIT)で公開しています。</p>
<p>今回、利用者のmlocatiさんからバグ修正、古いコードの改善、ユーザーインターフェースの改善をいただきました。</p>

<p><img src="/images/free-map-edit.png" alt="ページ属性を表示する" class="img-fluid img-thumbnail"></p>

<h3>バグ修正</h3>
<p>
    同一ページに地図を複数個置いた場合に、JavaScriptコードが重複して読み込みされる、というバグがありました。バグとしては軽度ですが、こちら側で考慮漏れしていた箇所を修正いただきました。
</p>

<h3>古いコードの改善</h3>
<p>
    元のコードは6～7年ぐらい前のコードでした。PHP8系でも動作するように修正はしていましたが、最低限の調整だけだったものを、きちんとモダンなコードに改善していただきました。
</p>
<h3>ユーザーインターフェースの改善</h3>
<p>
    concreteCMSのバージョン9系で管理画面のインターフェースが新しくなっていますが、新UIへの対応をしていただきました。
</p>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>


<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            オープンソースで公開して、利用者からのフィードバックを受けて改善されるのは嬉しいですね。
        </div>
    </div>
</div>
<p>実際のコードおよび改善の過程については、<a href="https://github.com/ounziw/Free-Map">https://github.com/ounziw/Free-Map</a>をごらんください。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>ChatGPTに「ファクトフルネスの次に読む本」を聞いてみた</title>
      
      
      <link>https://rescuework.nagoya/blog/chatgpt/</link>
      <guid>https://rescuework.nagoya/blog/chatgpt/</guid>
      
      
      <pubDate>Tue, 28 Mar 2023 11:05:32 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>ChatGPTが注目されていますね。弊社では<a href="https://book-recommend.com/">ブックレコメンド</a>というウェブメディアを運営しています。コンセプトは『AIに負けない』を掲げています。</p>
<p>ChatGPTが、弊社のウェブメディアと比べてどうなのか？を調べてみるべく、ChatGPTに質問してみました。2023年3月14日時点のバージョンのChatGPTで試しています。</p>
<p>質問した内容は、『「ファクトフルネス」の次に読む本は？そしてその理由は？』です。ちなみにブックレコメンドでは、<a href="https://book-recommend.com/2020/04/10/factfulness/">ファクトフルネス(ハンス・ロスリング他)の次に読む本は「存在しない女たち」</a>という記事を掲載しています。</p>
<h3>ChatGPTの回答は</h3>
<p><img src="/images/factfullness_next.png" alt="ファクトフルネスの次に読む本" class="img-fluid img-thumbnail"></p>
<blockquote class="blockquote w-75 mx-auto"><p class="border">「ファクトフルネス」は、現代社会での誤解や誤った情報に対して、客観的な事実に基づいた考え方を身につけるための素晴らしい本です。次に読むべき本としては、以下の2つをお勧めします。<br>
    <br>
    「思考の整理学」（デビッド・アレン著）<br>
    「思考の整理学」は、時間管理や仕事の効率化についての書籍ですが、それ以上に、人生における目的や価値観の見つけ方、そして優先順位をつける能力を身につけることができます。これは、「ファクトフルネス」で学んだ客観的な事実に基づく思考と合わせて、より健全で意識的な人生を送るための基盤となると考えられます。<br>
    <br>
    「ビジネスモデル・ジェネレーション」（アレクサンダー・オスターワルダー著）<br>
    「ビジネスモデル・ジェネレーション」は、新しいビジネスモデルを構築するための手法を紹介した書籍です。この本では、創造的な思考やアイデアの発想、そして実現するための具体的なステップが説明されています。これは、「ファクトフルネス」で学んだ客観的な事実に基づく思考を活かし、より創造的で実現可能なアイデアを生み出すために役立つでしょう。<br>
    <br>
    以上の2つの本を読むことで、客観的な事実に基づく思考能力を身につけ、人生やビジネスにおける目的や価値観の発見、そして創造的なアイデアの実現につながると考えられます。</p></blockquote>
<hr>
<p>「ビジネスモデル・ジェネレーション」については実際に書籍があります。一方で、「思考の整理学」は、著者が外山滋比古氏ですが、デビッド・アレン著と返ってきました。書名と著者名の紐付けミスが発生したのは理解しずらいですね。(あるいは、デビッド・アレン氏のGetting Things Doneの日本語訳で誤訳が紛れ込んだ可能性も考えられます。)</p>
<h3>英語で質問したらどうなったか？</h3>
<p>日本語で質問したので精度が低かった可能性もあると思いました。なので、英語で質問してみました。</p>
<p><img src="/images/factfullness2.png" alt="Which book should I read after Factfullness ?" class="img-fluid img-thumbnail"></p>
<blockquote class="blockquote w-75 mx-auto"><p class="border">If you enjoyed "Factfulness" by Hans Rosling, here are some other books you may find interesting:<br>
    <br>
    "Enlightenment Now: The Case for Reason, Science, Humanism, and Progress" by Steven Pinker - This book explores the idea of progress, highlighting the ways in which humanity has made significant improvements over the past few centuries.<br>
    <br>
    "Sapiens: A Brief History of Humankind" by Yuval Noah Harari - This book takes a big-picture look at human history, examining the major developments and changes that have shaped our species.<br>
    <br>
    "Thinking, Fast and Slow" by Daniel Kahneman - This book explores the different ways in which our brains make decisions, and how we can become more aware of our biases and blind spots.<br>
    <br>
    "The Better Angels of Our Nature: Why Violence Has Declined" by Steven Pinker - This book explores the idea that violence has actually decreased over time, and looks at some of the reasons why.<br>
    <br>
    "The Black Swan: The Impact of the Highly Improbable" by Nassim Nicholas Taleb - This book explores the idea that rare and unpredictable events can have a significant impact on our lives and our societies.<br>
    <br>
    All of these books share a similar focus on critical thinking and an evidence-based approach to understanding the world.</p></blockquote>
<hr>
<p>英語で質問すると、書名・著者名ともにきちんと回答してくれるようです。</p>
<h3>有名な書籍をピックアップしてくれるが、しかし、</h3>
<p>ChatGPTに質問すると、有名な書籍をピックアップしてくれました。どの本も読む価値があると思われます。ただ、なぜその本を選んだのか？についてまでは詳しく教えてくれないですね。</p>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<p>追記:2023年3月29日</p>
<p>質問を「Which book should I read after "Factfulness" and tell me why you choose that book?」で試してみました。</p>
<p><img src="/images/factfullness3.png" alt="Which book should I read after Factfullness ?" class="img-fluid img-thumbnail"></p>
<blockquote class="blockquote w-75 mx-auto"><p class="border">After reading "Factfulness" by Hans Rosling, I would recommend reading "Sapiens: A Brief History of Humankind" by Yuval Noah Harari.<br>
    <br>
    "Sapiens" is a fascinating book that provides a comprehensive overview of human history, from the emergence of Homo sapiens in Africa to the present day. Harari's writing style is engaging and accessible, and he covers a broad range of topics, including the agricultural revolution, the rise of religion, the scientific revolution, and the modern era of globalization.<br>
    <br>
    One of the main themes of the book is the idea that human history has been shaped by our ability to create and believe in shared myths and stories. Harari argues that the ability to cooperate and work together on a large scale has been key to our success as a species, but it has also led to some of the most destructive aspects of human history, such as war and environmental degradation.<br>
    <br>
    I think "Sapiens" is a great follow-up to "Factfulness" because it provides a broader perspective on the history and development of human societies. Both books share a focus on evidence-based thinking and the importance of questioning our assumptions and biases. Reading "Sapiens" will help you understand how the world we live in today came to be, and it will encourage you to think critically about the challenges we face as a global society.</p></blockquote>
<hr>
<p>理由まで回答するように質問すると、理由も詳しく答えてくれました。ここまでできるとなると、「ブックレコメンド」も近いうちにAIに負けてしまいそうです。</p>
<p>↓は参考日本語訳です。</p>
<p>『ファクトフルネス』（ハンス・ロスリング）を読んだ後は、『サピエンス 人類の歴史』（ユヴァル・ノア・ハラリ）を勧める。<br>
    <br>
    『サピエンス』は、アフリカでのホモサピエンスの誕生から現在までの、人類の歴史の包括的な概観を示す。ハラリの書き方は魅力的でかつとっつきやすい。幅広いトピック、農業革命、宗教の誕生、科学革命、現代のグローバリゼーションなど、を取り上げている。<br>
    <br>
    本書の主要なテーマの1つは、宗教や物語を創造して信じるという私たちの能力により、人類の歴史が形作られたことである。大きな規模で協力する能力が私たちの種としての成功のカギであったが、しかしその能力は一方で戦争や環境破壊などの破壊的な面ももたらす、とハラリは主張する。<br>
    <br>
    『サピエンス』は歴史の様々な視点と人間社会の発展を提供するので、『ファクトフルネス』のフォローアップとして優れている、と私は思う。どちらの本もエビデンスに基づく思考、私たちの仮定やバイアスを探求することの重要さ、に焦点を当てている。『サピエンス』を読むと私たちが今生きている世界がどのように作られてきたかを理解する助けになる。またグローバル化した社会で直面する課題を批判的に思考することを推奨する。
</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>古いプログラムのPHP8.1へのアップデート</title>
      
      
      <link>https://rescuework.nagoya/blog/php81/</link>
      <guid>https://rescuework.nagoya/blog/php81/</guid>
      
      
      <pubDate>Wed, 07 Dec 2022 09:08:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>PHP7.4系が2022年11月28日で公式サポート終了となりました。弊社でも古いプログラムをPHP8.1へアップデートしています。そのときの改修作業の記録です。</p>
<p>対象は、2015年頃に作成したプログラムです。当時はPHPが5.5～5.6ぐらいでした。</p>

<h3>ファイル名:行 Undefined variable $変数名</h3>

<p>定義されていない変数を呼び出すとエラーになります。</p>

<pre>
    echo h($description);
</pre>

<p>PHP5の頃だと、&uarr;のようにカジュアルに書いて画面出力するようなケースもありましたが、現在はエラー(WARNING, *1)になります。</p>

<pre>
    if (<b>isset($description)</b>) {
        echo h($description);
    }
</pre>

<p>&uarr;のように、例えば<b>isset($description)</b>のように、変数がセットされているかチェックする必要があります。</p>

<p>(*1)エラーレベルはWARNINGなので、PHP設定をWARNINGを無視するように変更して対処することは可能です。しかし、NOTICEはともかくWARNINGを無視するのはリスクが高いと思われます。</p>
<h3>ファイル名:行 Undefined array key $配列名</h3>

<p>配列の定義されていないキーを呼び出すとエラーになります。先ほどは定義されていない変数でしたが、今回はその配列バージョンですね。</p>

<pre>
    echo h($blog['description']);
</pre>

<p>PHP5の頃だと、&uarr;のようにカジュアルに書いて画面出力するようなケースもありましたが、現在はエラー(WARNING)になります。</p>

<pre>
    if (<b>array_key_exists('description', $blog)</b>) {
        echo h($blog['description']);
    }
</pre>

<p>&uarr;のように、例えば<b>array_key_exists('description', $blog)</b>のように、配列のキーがセットされているかチェックする必要があります。</p>

<h3>Non-static method クラス::メソッド cannot be called statically</h3>

<p>スタティックでないメソッドを、スタティックに呼び出そうとしているとエラーになります。</p>

<pre>
    public <b>static</b> function メソッド()
</pre>

<p>&uarr;のように、<b>static</b>キーワードを追加しました。</p>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<p>※本記事では、弊社のプログラムの改修時に遭遇したものを列挙していますが、それ以外にも改修が必要なものがあるかもしれません。</p>
<p><a href="https://php4wordpress.calculator.jp/php/version/">PHPのサポート期限はこちら</a>をごらんください。</p>]]></description>
      
    </item>
    
    <item>
      
      <title>集客＆成約アップするホームページ</title>
      
      
      <link>https://rescuework.nagoya/profile1/</link>
      <guid>https://rescuework.nagoya/profile1/</guid>
      
      
      <pubDate>Sat, 12 Nov 2022 14:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>ホームページ制作会社はいろいろあります。綺麗なデザインを作る会社。SEO対策で集客する会社。安価で作る会社。それぞれ、特徴を持っています。レスキューワーク株式会社は、優れたデザインは提供しません。SEO対策もしません。また安価でもありません。その代わり、ホームページの集客から見込み客の抽出・成約までをトータルにサポートします。</p>

<h1>集客＆成約アップするホームページ　＞　綺麗なホームページ</h1>

<p>弊社ではホームページ集客・成約を重視しています。綺麗なホームページを作るよりも、訪問してもらう＆成約してもらうホームページのほうが価値が高い、という考えです。</p>

<h3>集客のアプローチは、訪問者が楽しめる &rarr; 他の人に紹介する</h3>

<p>弊社は、SEO対策による集客は行いません。その代わり、</p>

<ul>
    <li>クイズ機能</li>
    <li>計算式</li>
</ul>

<p>など、<u>訪問者が口コミで広げてくれる仕組み</u>を提供しています。これにより、自社運営メディア<a href="https://calculator.jp/" target="_blank"><span style="color:#2980b9;">計算フォーム</span></a>は、月70万PV(2019年5月時点)あります。</p>




<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            口コミで広まるホームページを作成すると、月70万PVも夢ではないよ。                    </div>
    </div>
</div>


<table class="table table-bordered table-striped">
    <tbody>
    <tr>
        <th>会社名</th>
        <td>レスキューワーク株式会社</td>
    </tr>
    <tr>
        <th>登記住所</th>
        <td>愛知県丹羽郡大口町二ツ屋2-34</td>
    </tr>
    <tr>
        <th>電話番号</th>
        <td>050-6877-6387</td>
    </tr>
    <tr>
        <th>営業時間</th>
        <td>平日9時30分～17時30分(土日休み)</td>
    </tr>
    <tr>
        <th>会社成立</th>
        <td>2013年5月17日</td>
    </tr>
    <tr>
        <th>資本金</th>
        <td>100万円</td>
    </tr>
    <tr>
        <th>代表者</th>
        <td>水野史土</td>
    </tr>
    <tr>
        <th>事業内容</th>
        <td>ウェブ集客支援<br />
            ウェブサービスの企画および運営</td>
    </tr>
    <tr>
        <th>運営ウェブサービス</th>
        <td><a href="https://calculator.jp/" target="_blank">計算フォーム</a><br />
            <a href="https://my-mitsu.jp/" target="_blank">自動見積「マイミツ」</a><br />
            <a href="https://book-recommend.com/" target="_blank">AIに負けない「ブックレコメンド」</a></td>
    </tr>
    <tr>
        <th>代表者の書籍</th>
        <td>徹底攻略PHP5技術者認定［上級］試験問題集［PJ0-200］対応<br />
            <a href="https://php4wordpress.calculator.jp/">WordPressユーザーのためのPHP入門 はじめから、ていねいに</a></td>
    </tr>
    <tr>
        <th>電気通信事業者</th>
        <td>届出番号: C-29-01916</td>
    </tr>
    <tr>
        <th>法人番号</th>
        <td>6180001109825</td>
    </tr>
    <tr>
        <th>適格請求書発行事業者登録番号</th>
        <td>T6180001109825</td>
    </tr>
    <tr>
        <th>取引銀行</th>
        <td>三菱UFJ銀行 犬山支店<br />
            岐阜信用金庫 楽田支店</td>
    </tr>
    </tbody>
</table>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h3>お問い合わせ</h3>


<p><a href="https://rescuework.nagoya/contact-message/">お問い合わせはこちら</a>から。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>ウェブ集客で成果を上げたい方へ</title>
      
      
      <link>https://rescuework.nagoya/web/</link>
      <guid>https://rescuework.nagoya/web/</guid>
      
      
      <pubDate>Sat, 12 Nov 2022 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>ホームページ訪問者の興味・関心・満足度を高めるコンテンツを提供する仕組みで集客します。ウェブ集客でお困りの方は、弊社に御相談ください。弊社代表の水野がWEB企画立案から集客までサポートします。</p>

    <div class="balloons">
        <div class="balloon image-balloon size80">
            <div class="icon">  <img src="/images/icon-man.png" />                    </div>
            <div class="balloontext">
                訪問者が広めてくれる口コミマーケティングで集客できるよ。                    </div>
        </div>
    </div>

<h3>計算フォーム</h3>
<div class="row">
    <div class="col-sm-4">
    <img src="/images/bmi-edi.gif" class="img-fluid img-thumbnail" />
</div>
    <div class="col-sm-8">

    <p>ホームページに計算機能を追加します。例えば、フリーランスの源泉徴収計算は、以下のようになります。</p>

    <div class="row ogplink">
        <div class="col-xs-12 ogplinktitle">
            <p class="ogplinktitle"><a href="https://calculator.jp/money/gensen/" rel="noopener noreferrer" target="_blank">フリーランスの源泉徴収計算</a></p>
        </div>
        <div class="col-xs-4 col-sm-3">
        <a href="https://calculator.jp/money/gensen/" rel="noopener noreferrer" target="_blank"><img src="https://calculator.jp/images/gensen.png" class="img-fluid img-thumbnail" /></a>
        </div>
        <div class="col-xs-8 col-sm-9">
        <p class="ogplinkcontent">個人事業を営んでいる方は、報酬を受け取るときに源泉徴収されることがあります。</p>
            </div>
    </div>

    <p>こういった機能をホームページに組み込むことで、訪問者の満足度を高めます。</p>

</div></div>


<h3>お気に入り保存・再訪問</h3>

<div class="row"><div class="col-sm-4">
    <img src="/images/favorite.jpg" alt="お気に入り機能" class="img-fluid img-thumbnail">
</div><div class="col-sm-8">

    <p>訪問者がお気に入りページを保存できるように設定し、利便性を向上し、<strong><u>一度来てくださった方の再訪問率</u></strong>を高めます。</p>

    <p>弊社ウェブメディアでは、約25パーセントの訪問者が再訪問者になっています。</p>

</div></div>

<h3>実績を一部紹介</h3>
<div class="row"><div class="col-sm-4">

    <img src="/images/calculator-2019-4.jpg" alt="月70万PVウェブメディア" class="img-fluid img-thumbnail"></picture>
</div><div class="col-sm-8">
    <p>弊社運営ウェブメディア<a href="https://calculator.jp/"><span style="color:#2980b9;">自動計算</span></a>で、上に記載したような、ホームページ訪問者に満足してもらうコンテンツを提供し、2019年4月時点で月70万PVを記録しています。</p>

</div></div>

<h3>料金・自動見積もり</h3>

<p>Web集客コンサルティング料金は下記の通りです。(消費税10%預かります。)</p>

<ul>
    <li>コンサルティング1回5万円(税込5.5万円)。最低2回～</li>
    <li>広告掲載(月3万円税込3.3万円)・タイアップ記事(6万円税込6.6万円)をオプションで選択できます</li>
    <li>弊社でホームページを制作したお客様は50%割引(ホームページ制作と同時、またはホームページ制作から1年以内にお申し込みいただいた場合)</li>
</ul>

<p>コンサルティングは月2回を標準としております。最低2回からお申込みいただけますが、成果が出るまで6カ月～12カ月程度かかります。</p>

<p>※コンサルティングは、御社の社員・スタッフのコンテンツ制作を指導します。(実際のコンテンツ制作を御社の社員・スタッフが行えるように指導します。)</p>

<iframe style="width: 800px;max-width: 100%;height:800px;" src="https://my-mitsu.jp/estimation/web-marketing" loading="lazy"></iframe>
]]></description>
      
    </item>
    
    <item>
      
      <title>濃い見込み客を見つけるホームページ自動見積もりシステム</title>
      
      
      <link>https://rescuework.nagoya/my-mitsu/</link>
      <guid>https://rescuework.nagoya/my-mitsu/</guid>
      
      
      <pubDate>Sat, 12 Nov 2022 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[<div class="row"><div class="col-sm-4">

    <img src="/images/my-mitsu-info.gif" class="img-fluid img-thumbnail" />
</div><div class="col-sm-8">

    <h3>自社のサービスに興味があるのは誰？&rarr;成果に繋がりやすい客を探し出す</h3>

    <p>「興味があります」というお客さんが何人かいる場合を考えてみましょう。興味がある、といっても、ちょっと話を聞いてみよう、という軽い気持ちの人もいれば、すぐにでも導入したい、という人もいるでしょう。</p>

    <p>興味があるという人全てとじっくり話す時間があれば、全員と話すのが最良かもしれません。しかし、そこまで手が回らない、という場合はどうでしょうか。一番興味がありそうな人からアプローチするのが良さそうですね。</p>

</div></div>


<h4>では、どうやったら、興味がありそうな人を探せるのでしょうか？</h4>

<p>もし、見込み客から、すごく興味を持ってくれている人を見つけられたら、嬉しいですね。優秀な営業マンなら、もしかしたら相手の行動を観察したり、的確な質問をしたりして、すぐに見つけ出せるかもしれませんね。しかし営業が上手くない人には難しいかもしれません。</p>



<div class="row"><div class="col-sm-8">

    <h3>ホームページ上では、興味を持ってくれている人を見つけ出すことが比較的容易です。</h3>

    <p>ホームページ上では、訪問者がどのページを見たか、どういった行動をしたか、が分かります。トップページだけ見た人と、商品詳細ページも見た人では、興味の度合いが違う可能性が高いですね。</p>

    <h4><br />
        見積書を作成した人は、有望な見込み客です。</h4>

    <p>ホームページ訪問者の中で、見積書を作成した人は、どうでしょうか？<strong>料金シミュレーションで価格も確認したうえで、見積書を作成した</strong>人ですがから、かなり有望な見込み客だと思われます。訪問者が見積書を作成したら、興味がさめないうちに、訪問者にコンタクトしてみてはいかがでしょうか。</p>

</div><div class="col-sm-4">

    <a href="https://my-mitsu.com/" ><img src="/images/my-mitsu-300x250-v2.png" alt="" class="img-fluid img-thumbnail"></a>
</div></div>


<h3>WordPress埋め込みプラグインも公開</h3>

<p>WordPressに埋め込み出来るプラグインも公開しています。その他のホームページ作成ツールでも、iframeで埋め込み可能です。</p>

<h3>もっと知りたい方に</h3>

<p>サービスの紹介サイトを用意しております。<a href="https://my-mitsu.com/" target="_blank">マイ見積</a>をごらんください。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>Concrete CMSのアドオン「Free Map」「Favorite Pages」「Composer on Mobile Device」をバージョン9対応にしました。</title>
      
      
      <link>https://rescuework.nagoya/blog/concrete-cms-ver9/</link>
      <guid>https://rescuework.nagoya/blog/concrete-cms-ver9/</guid>
      
      
      <pubDate>Tue, 04 Oct 2022 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>Concrete CMSのアドオン「Free Map」「Favorite Pages」をバージョン9対応にしました。<br />
    Concrete CMSのバージョン更新に伴う、スタイルシートの更新がメインになります。</p>


<h3>Free Mapアドオン</h3>

<div class="ccm-custom-style-container ccm-custom-style-main-85537 image-centering">
    <img src="/images/ounziw_osm.jpg" alt="オープンストリートマップ" class="img-fluid img-thumbnail">
</div>


<p>こちらは地図を埋め込むアドオンです。Open Street Mapを採用しています。</p>




<h3>Favorite Pages アドオン</h3>


<div class="ccm-custom-style-container ccm-custom-style-main-85540 image-centering">
    <img src="/images/favorite.jpg" alt="お気に入りページ登録" class="img-fluid img-thumbnail">
</div>


<p>訪問者が、自分の気に入ったページをクリップしておくアドオンです。</p>




<h3>Composer on Mobile Device</h3>

<div class="ccm-custom-style-container ccm-custom-style-main-85543 image-centering">
    <img src="/images/ounziw_composer_mobile.jpg" alt="スマホでconcreteCMS編集する" class="img-fluid img-thumbnail">
</div>


<p>スマホ等の画面の狭い端末で、コンポーザー編集画面を使いやすくするアドオンです。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>代表者の書籍</title>
      
      
      <link>https://rescuework.nagoya/books/</link>
      <guid>https://rescuework.nagoya/books/</guid>
      
      
      <pubDate>Mon, 12 Sep 2022 14:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>弊社代表が執筆した書籍です。専門学校の教科書や参考書としても採用実績があります。</p>



<div class="row"><div class="col-sm-6">


<h2>WordPressユーザーのためのPHP入門 はじめから、ていねいに</h2>


    <div class="row"><div class="col-sm-3">
        <a href="https://www.amazon.co.jp/WordPress-E3-83-A6-E3-83-BC-E3-82-B6-E3-83-BC-E3-81-AE-E3-81-9F-E3-82-81-E3-81-AEPHP-E5-85-A5-E9-96/dp/4844368893?&linkCode=li2&tag=linuxonnotebo-22&linkId=4d44bdaeb1c84201460f76b7be74a8e9&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4844368893&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=linuxonnotebo-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=linuxonnotebo-22&language=ja_JP&l=li2&o=9&a=4844368893" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
    </div><div class="col-sm-9">

        <p>WordPressを業務で使うウェブデザイナー・マークアップエンジニアや、自分のWordPressをカスタマイズしたいブロガー・アフィリエイター向けに、プログラミング言語PHPの基礎を分かりやすく解説した本。</p>

        <p>PHPの基礎に加え、テンプレートタグや、子テーマなどWordPress特有の知識も解説している。</p>

        <p>2014年に出版した第一版に、加筆・修正を加えた第二版を2017年に出版。執筆時の最新バージョンのWordPressおよび標準テーマをベースに解説している。2019年にはグーテンベルク対応第三版を発売。詳しくは<a href="https://php4wordpress.calculator.jp/">サポートサイト</a>を参照。</p>

    </div></div>
</div><div class="col-sm-6">

    <h2>徹底攻略PHP5技術者認定［上級］試験問題集［PJ0-200］対応</h2>


    <div class="row"><div class="col-sm-3">

        <a href="https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5PHP5%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%EF%BC%BB%E4%B8%8A%E7%B4%9A%EF%BC%BD%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BBPJ0-200%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%88%B4%E6%9C%A8-%E6%86%B2%E6%B2%BB-ebook/dp/B00FRD1B4E/ref=as_li_ss_il?_encoding=UTF8&psc=1&refRID=J7VE1TQTDAXYEE10X9SY&linkCode=li2&tag=rescuework-22&linkId=a8bbf8478fbb3d20bd1a178127386761" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00FRD1B4E&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=rescuework-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=rescuework-22&l=li2&o=9&a=B00FRD1B4E" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
    </div><div class="col-sm-9">

        <p>ウェブエンジニア向けの腕試し問題集。企業研修の経験豊富な講師と、現役エンジニアがコラボして作成。</p>

        <p>問題集の体裁であるが解説が詳細なため、熟練者の知識の確認、新米へのノウハウ提供という役割も担うことができる。</p>

        <p>言語自体の知識だけでなく、ウェブサイトのパフォーマンスやセキュリティなど、運用上重要な知識・ノウハウについても学習できる。</p>

    </div></div>
</div></div>



<h3>商業出版する方法</h3>


<p>書籍出版したい、という方もおられるかもしれませんね。もちろん、お金を払えば自費出版できますが、商業出版したい人も多いでしょう。</p>

<p>弊社代表は、ホームページ・ブログ等でプログラミングについて情報発信することで、出版社からホームページの問い合わせフォーム経由で連絡をいただけるようになりました。</p>]]></description>
      
    </item>
    
    <item>
      
      <title>月70万PVウェブ制作会社が、検索エンジン対策で実施する、たった1つの施策</title>
      
      
      <link>https://rescuework.nagoya/blog/70pv1/</link>
      <guid>https://rescuework.nagoya/blog/70pv1/</guid>
      
      
      <pubDate>Tue, 12 Jul 2022 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>月70万PVウェブ制作会社「レスキューワーク株式会社」では、検索エンジン対策はほとんど実施していません。けれども、1つだけ、弊社で実施している、施策があります。</p>

<p>それは、問い合わせフォームを noindex とすることです。</p>

<pre>
&lt;meta name=&quot;robots&quot; content=&quot;noindex&quot;&gt;</pre>



<h3>問い合わせフォームをnoindexにするメリット</h3>

<p>メリットは2つあります。(他にもあるかもしれませんが、当社で重視しているのは以下の2つです)</p>

<ol>
    <li>コンテンツの薄いページを検索エンジンに読ませないこと</li>
    <li>スパムメールを減らすこと</li>
</ol>

<p>です。</p>




<h4>コンテンツの薄いページを検索エンジンに読ませないこと</h4>

<p>こちらはSEO対策で一般的に言われていることだと思いますが、コンテンツの薄いページ（独自の内容があまりないページ）をindexさせないほうが良いと言われているためです。</p>

<p>実際にどれくらいの効果があるのか、定量的な把握は行っておりません。</p>



<h4>スパムメールを減らすこと</h4>


<p>弊社では、こちらのメリットが大きいために実施しています。</p>

<p>問い合わせフォームからのスパムメール(一方的な営業メール)は、ウェブサイト運営の悩みの種です。captcha等の対策のためか、最近では人力で一方的な営業メールを送ってくることがあるようです。人力で送られてくると、captchaは役に立ちません。</p>

<p>人力でのスパムメールは、おそらくですが、問い合わせフォームは機械的に抽出していると思われます。そして、おそらく検索エンジンのデータを使っているのでは？と推測しています。</p>

<p>このため、弊社では問い合わせフォームを検索エンジンにインデックスさせないようにしました。その結果、スパムメールは&frac14;程度に減少しました。</p>



<h3>設定方法</h3>


<img src="/images/70pv1.jpg" class="img-fluid img-thumbnail">


<p>弊社でよく利用している Concrete CMS の場合の設定方法です。</p>

<p>[ページ設定] に、sitemap.xmlから除く、ナビから除く、ページリストから除く、検索インデックスから除く、があります。<strong>これらを全部チェックしておきます。</strong></p>

<ul>
    <li>sitemap.xmlから除く - サイトマップ生成時に、このページを含めない</li>
    <li>ナビから除く - オートナビブロック(画面上部のメニュー等で使う)に、このページを含めない</li>
    <li>ページリストから除く - ページ一覧ブロックに、このページを含めない</li>
    <li>検索インデックスから除く - noindexメタタグを出す</li>
</ul>

<p>というものです。ナビから除く、ページリストから除く、は、Concrete CMS 内部のリンク生成規則なので、サイトの作りによってはチェックしないほうが良い場合もあります。</p>



<p>こうすることで、sitemapには問い合わせページを含めない、問い合わせページのメタタグでnoindex、が実現できました。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>Concrete CMSのアドオン「Number Pro Attribute」を公開しました。</title>
      
      
      <link>https://rescuework.nagoya/blog/concretecmsnumber-pro-attribute/</link>
      <guid>https://rescuework.nagoya/blog/concretecmsnumber-pro-attribute/</guid>
      
      
      <pubDate>Wed, 11 May 2022 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>Number Pro Attributeは、属性「数値」に、min, max, stepを追加できるアドオンです。フォームのinput=&quot;number&quot;にオプション min=&quot;xx&quot;, max=&quot;xx&quot;, step=&quot;xx&quot;を追加します。</p>


<h3>ページ属性の数値入力を快適に！</h3>


<img src="/images/number-pro2.jpg" alt="Number Pro Attribute" class="img-fluid img-thumbnail">


<p>コンポーザーで入力するときに、最小値、最大値、ステップが設定されたフォームに入力できます。</p>

<p>「大きい+/-ボタンを表示する」を選択した場合、上の画像のようにフォームの左右にボタンが表示されます。(アドオンはver.8.5.7以降で利用できますが、ボタン表示はver.9のみ対応しています。)</p>

<img src="/images/number-pro-editoptions.jpg" alt="ページ属性の編集画面" class="img-fluid img-thumbnail">


<p>属性の編集画面では、上のようにオプション設定が可能です。</p>



<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
<h3>CIFで一括設定も可能</h3>


<p>CIF（concretecmsで使われている、コンテンツデータのフォーマット形式）で設定することにより、Number Pro属性とオプション値を一括で設定可能です。</p>



<pre>
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;concrete5-cif version=&quot;1.0&quot;&gt;
 &lt;attributekeys&gt;
 &lt;attributekey handle=&quot;numberpro1&quot; name=&quot;attribute1&quot; package=&quot;&quot; searchable=&quot;1&quot; indexed=&quot;0&quot; type=&quot;numberpro&quot; category=&quot;collection&quot;&gt;
 &lt;type min=&quot;5&quot; max=&quot;20&quot; step=&quot;5&quot; stylemode=&quot;1&quot;&gt;
 &lt;/type&gt;
 &lt;/attributekey&gt;
 &lt;attributekey handle=&quot;numberpro2&quot; name=&quot;attribute2&quot; package=&quot;&quot; searchable=&quot;1&quot; indexed=&quot;0&quot; type=&quot;numberpro&quot; category=&quot;collection&quot;&gt;
 &lt;type min=&quot;2&quot; max=&quot;10&quot; step=&quot;.2&quot; stylemode=&quot;0&quot;&gt;
 &lt;/type&gt;
 &lt;/attributekey&gt;
 &lt;/attributekeys&gt;
&lt;/concrete5-cif&gt;</pre>



<p>上のサンプルCIFのように、&lt;attributekey&gt;に&lt;type&gt;というタグを追加します。&lt;type&gt;では、</p>

<ul>
    <li>min : 最小値</li>
    <li>max : 最大値</li>
    <li>step : 数値の間隔</li>
    <li>stylemode : 大きい +/- ボタンを表示するか。1 = 表示する、0 = 表示しない</li>
</ul>

<p>という設定が可能です。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>ログインURLをwp-login.phpから変更しても、URL/loginからリダイレクトされる</title>
      
      
      <link>https://rescuework.nagoya/blog/wp-login/</link>
      <guid>https://rescuework.nagoya/blog/wp-login/</guid>
      
      
      <pubDate>Mon, 18 Apr 2022 08:54:53 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>WordPressで、パーマリンクをデフォルトから変更している場合、URL/loginからURL/wp-login.phpへリダイレクトする仕組みになっている。またURL/adminとURL/dashboardはURL/wp-admin/へリダイレクトされる。</p>

<p>wp-includes/canonical.phpにある、wp_redirect_admin_locations関数で定義されている。</p>

<pre><code>
function wp_redirect_admin_locations() {
	global $wp_rewrite;

	if ( ! ( is_404() && $wp_rewrite->using_permalinks() ) ) {
		return;
	}

	$admins = array(
		home_url( 'wp-admin', 'relative' ),
		home_url( 'dashboard', 'relative' ),
		home_url( 'admin', 'relative' ),
		site_url( 'dashboard', 'relative' ),
		site_url( 'admin', 'relative' ),
	);

	if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $admins, true ) ) {
		wp_redirect( admin_url() );
		exit;
	}

	$logins = array(
		home_url( 'wp-login.php', 'relative' ),
		home_url( 'login.php', 'relative' ),
		home_url( 'login', 'relative' ),
		site_url( 'login', 'relative' ),
	);

	if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $logins, true ) ) {
		wp_redirect( wp_login_url() );
		exit;
	}
}
</code></pre>
<p>この関数は、wp-includes/default-filters.php内で、template_redirectアクションフックで実行するように登録されている。</p>
<pre><code>add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
</code></pre>
<p>この関数の機能により、管理画面のURLを失念した場合でもアクセスできる。一方で、管理画面やログインURLを隠蔽したい場合、この機能は無効にしたいかもしれない。</p>

<h3>URL/loginからのリダイレクトを無効にする方法</h3>
<p>この機能を無効にする方法がある。いくつか紹介する。A, B, C のいずれか一つを実行すれば良い。</p>

<p>A. login, admin, dashboard というスラッグで固定ページを作る</p>

<p>B. デフォルトパーマリンクを使用する</p>

<p>wp_redirect_admin_locations関数は、is_404()「ページが存在しない」かつusing_permalinks「パーマリンクをカスタマイズしている」の場合にのみ実行される。なので、あらかじめ固定ページを作る、あるいはパーマリンクをデフォルトにすることにより、この関数を実行しないようにできる。</p>

<p>C. アクションフックを無効にする</p>

<p>template_redirectアクションフックにwp_redirect_admin_locations関数が登録されている。なので、remove_actionを使用してフックを取り除けば良い。</p>
<pre><code>remove_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
</code></pre>
<p>と、テーマのfunctions.php等に記述する事で、意図しないリダイレクトを行わなくすることができる。</p>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>]]></description>
      
    </item>
    
    <item>
      
      <title>選択フォームで「全て選択」を実装するjQuery - ConcreteCMSの属性の場合</title>
      
      
      <link>https://rescuework.nagoya/blog/select-all-jquery-concretecms/</link>
      <guid>https://rescuework.nagoya/blog/select-all-jquery-concretecms/</guid>
      
      
      <pubDate>Mon, 11 Apr 2022 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>ConcreteCMSでは、選択フォームが用意されています。これを使うと、ページにデータを登録していくのに便利です。</p>

<p>しかし、選択フォームでオプションを一個一個選んでいくのは、意外と手間がかかります。そこで「全て選択」ボタンを作って、jQueryで一括操作できるようにしてみました。フォームで選択肢が多い場合などに役立ちます。</p>


<img src="/images/select_all.jpg" alt="都道府県を全選択" class="img-fluid img-thumbnail">


<p>&uarr;の、営業エリア部分に、「全て選択」ボタンを実装してみます。（<a href="https://www.rescuework.jp/ordering">都道府県の並び順</a>はこちらを参考にしてください。）</p>




<h3>コード</h3>


<p><em>/concrete/attributes/select/form.php</em> を書き換えていきます。※直接編集するのではなく、/application/attributes/select/form.phpにコピーしてから編集すると、アップデートしても自分の編集が失われません。</p>

<p>編集は、</p>

<pre>
/*
 * Checkbox list.
 */</pre>

<p>と書かれているところをカスタマイズしていきます。</p>

<p>ボタンを追加するコードは&darr;です。</p>

<pre>
&lt;button class=&quot;selectall&quot; id=&quot;akid_&lt;?php echo h($akID);?&gt;&quot;&gt;全て選択&lt;/button&gt;</pre>

<p>&nbsp;</p>

<p>また、jQueryで処理しやすくするために、checkboxのHTML出力にもclassを追加しておきます。<br />
    &darr;の太字部分を追加します。</p>

<pre>
$form-&gt;checkbox($view-&gt;field(&#39;atSelectOptionValue&#39;) . &#39;[]&#39;, $opt-&gt;getSelectAttributeOptionID(), in_array($opt-&gt;getSelectAttributeOptionID(), $selectedOptionIDs)<strong>,[&#39;class&#39;=&gt; &#39;akid_&#39;.h($akID)]</strong>)</pre>

<p>&nbsp;</p>

<p>jQueryコードも追加します。（foreachループの下が良いでしょう。）</p>

<pre>
    ?&gt;
   &lt;script type=&quot;text/javascript&quot;&gt;
       $(&#39;button.selectall&#39;).click(function () {
           $(&#39;input.&#39; + $(this).attr(&#39;id&#39;)).prop(&#39;checked&#39;, true);
           return false;
       });
   &lt;/script&gt;
&lt;?php</pre>

<p>こうすることで、「全て選択」が実装できました。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>アマゾンPOD(&#43;電子書籍)で、初期費用無料で書籍出版しました。</title>
      
      
      <link>https://rescuework.nagoya/blog/pod/</link>
      <guid>https://rescuework.nagoya/blog/pod/</guid>
      
      
      <pubDate>Thu, 24 Feb 2022 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[<p>この記事にはアフィリエイト広告が含まれます。</p>

<p>アマゾンがPOD(プリントオンデマンド)サービスを始めたので、書籍を出版しました。</p>



<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            PODは、注文があったら書籍を印刷して発送する仕組みです。                    </div>
    </div>
</div>


<h2>メリット1: 初期費用無料で書籍出版できる</h2>

<p>アマゾンPODのメリットとして、一番大きいのは、「初期費用無料で書籍出版できる」だと思われます。</p>

<p>一般には、</p>

<ul>
    <li>出版社に原稿を持ち込んだ場合 &rArr; 出版に至る可能性はほぼゼロです。</li>
    <li>自費出版の場合 &rArr; 本の部数にもよりますが、数十万程度の費用がかかります。</li>
</ul>

<p>となります。</p>

<p>アマゾンPODは、自費出版に近いですが、初期費用はかかりません。注文があってから印刷するため、著者が印刷費を事前に負担しなくても出版できます。</p>




<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            本が注文されたら、本の代金（売上金）から印刷代を引いた金額を元に、所定の印税が支払われます。                    </div>
    </div>
</div>


<h2>メリット2: 原稿の修正がしやすい</h2>

<p>アマゾンPODは、表紙や原稿をPDFでアップロードすればOKです。もし、原稿に誤植などがあった場合でも、PDFをアップロードし直せばOKです。私の場合、修正は半日ぐらいで反映されました。</p>

<p>普通の書籍だったら、誤植があっても、2刷での修正、というケースが多いと思われますが、このスピード感は凄いですね。</p>


<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<h2>デメリット1: アマゾン以外への流通はできない</h2>

<p>2022年2月時点では、日本語で執筆された書籍は、アマゾン以外への流通はできません。アマゾン以外の書店にも配本したい場合は、アマゾンPODではなくて他のところから出版しなければなりません。</p>



<h2>デメリット2: 紙や装丁を選べない</h2>

<p>自費出版だと、（追加コストはかかるかもしれませんが）紙の種類や装丁を選ぶことができます。一方のアマゾンPODは、2022年時点では、紙や装丁を選ぶオプションはありません。原稿のカラー・白黒は選択できます。</p>




<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            装丁などにこだわりがあるなら、自費出版のほうが良さそうですね。                    </div>
    </div>
</div>
<div class="d-flex justify-content-center">
<a href="//af.moshimo.com/af/c/click?a_id=3960752&p_id=2654&pc_id=5943&pl_id=42715" rel="nofollow" referrerpolicy="no-referrer-when-downgrade"><img src="//image.moshimo.com/af-img/0616/000000042715.png" width="320" height="50" style="border:none;"></a><img src="//i.moshimo.com/af/i/impression?a_id=3960752&p_id=2654&pc_id=5943&pl_id=42715" width="1" height="1" style="border:none;">
</div>
]]></description>
      
    </item>
    
    <item>
      
      <title>アマゾンのほしい物リストを使って、住所を知らせることなく書籍をプレゼント</title>
      
      
      <link>https://rescuework.nagoya/blog/wishlist/</link>
      <guid>https://rescuework.nagoya/blog/wishlist/</guid>
      
      
      <pubDate>Wed, 04 Aug 2021 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>弊社運営ウェブメディア「<a href="https://book-recommend.com/">ブックレコメンド</a>」では、書籍プレゼントキャンペーンを不定期開催しています。</p>

<p>当選者に書籍を送ることになるのですが、そのときに住所（個人情報）をどうするか？という問題が生じます。</p>

<p>そのときに役立つのが、アマゾンのほしい物リストです。</p>

<h3>アマゾンのほしい物リスト</h3>

<p>アマゾンでは、自分がほしい物を、<strong>ほしい物リスト</strong>として作成し、公開できます。そして、他の人は、公開されたほしい物リストの中にある物を購入することができます。購入すると、ほしい物リストを作った人に送付されます。</p>

<p>この仕組みを使うことで、書籍プレゼントの当選者は、住所を通知することなく、書籍を受け取ることができます。以下のような手順になります。</p>

<ol>
    <li>プレゼント当選者: ほしい物リストに書籍を登録する。プレゼント送付者に、ほしい物リストを通知する</li>
    <li>プレゼント送付者:&nbsp;ほしい物リストの書籍を購入する。</li>
    <li>アマゾン: プレゼント当選者に書籍を送付する。</li>
</ol>

<p>という仕組みです。</p>

<p>こうすることで、プレゼント当選者は、アマゾンのアカウントが必要になりますが、自分の住所を通知することなく書籍を受け取れます。</p>



<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            住所のやりとりをしなくて良いのは嬉しいね。                    </div>
    </div>
</div>
]]></description>
      
    </item>
    
    <item>
      
      <title>お問い合わせ</title>
      
      
      <link>https://rescuework.nagoya/contact-message/</link>
      <guid>https://rescuework.nagoya/contact-message/</guid>
      
      
      <pubDate>Thu, 12 Nov 2020 14:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>下記のフォームよりお問い合わせください。<a href="https://rescuework.nagoya/privacy">プライバシーポリシーはこちら</a>をごらんください。</p>

<p>※<strong>面談・打ち合わせ等に要する交通費を頂戴いたしております（名古屋駅から100kmを超える場合は乗車賃の他、新幹線・特急列車等の料金も頂いております）。</strong>あらかじめご了承ください。</p>

<h4>料金の目安は以下の通りです(消費税10%込)</h4>
<ul>
    <li>Web集客: 月5.5万円～110万円</li>
    <li>広告掲載: 月3.3万円～110万円</li>
    <li>システム開発(最大で5人月程度まで): 88万円～880万円(保守・サーバー費用は別途)</li>
    <li>自動見積もりシステム導入: 33万円～330万円(保守・サーバー費用は別途)</li>
    <li>セミナー・講演: 1回2時間13.2万円(事前打ち合わせ1時間x2回の想定)</li>
</ul>
<h4>新規対応の目安は&darr;です。</h4>

<div class="btn-group d-flex" role="group">
    <button type="button" class="btn btn-outline-info">標準<br><span id="dateslowafter"></span>～</button>
    <button type="button" class="btn btn-outline-primary">特急対応<br><span id="dateafter"></span>～</button>
</div>
<p>※新規のお客様で特急対応の場合は、初回相談の際に+2.2万円を頂いております。(以前にお取引があった方でも、最後の発注から2年以上経過している場合は、新規扱いとさせていただきます。)あらかじめご了承ください。</p>
<p>弊社から受注したい方は適格請求書発行事業者登録番号(インボイス制度)をご記入願います。</p>
<div class="container"><div class="row"><div class="col-sm-12">
    <p><span id="calculatorjpBusinessHour"></span></p>
</div></div></div>
<script type="text/javascript">
    var beforeMessage = "営業開始は9時30分です。問い合わせへの回答は9時30分～となります。内容によっては、回答は翌営業日以降になることがあります。";
    var openMessage = "17時30分まで営業しております。内容によっては、回答は翌営業日以降になることがあります。";
    var closedMessage = "本日の営業は終了しました。問い合わせへの回答は、翌営業日以降になります。";
    var holidayMessage = "本日は休業日です。問い合わせへの回答は、翌営業日以降になります。";
    var openTime = "09:30";
    var closeTime = "17:30";

    var businessDay = "月火水木金";

    var holidayList = {
        "2025/1/1": "元日",
        "2025/1/2": "休日",
        "2025/1/3": "休日",
        "2025/1/4": "休日",
        "2025/4/28": "休日",
        "2025/4/29": "休日",
        "2025/4/30": "休日",
        "2025/5/1": "休日",
        "2025/5/2": "休日",
        "2025/5/3": "休日",
        "2025/5/4": "休日",
        "2025/5/5": "休日",
        "2025/8/11": "休日",
        "2025/8/12": "休日",
        "2025/8/13": "休日",
        "2025/8/14": "休日",
        "2025/8/15": "休日",
        "2025/8/16": "休日",
        "2025/8/17": "休日",
        "2025/12/29": "休日",
        "2025/12/30": "休日",
        "2025/12/31": "休日",
        "2026/1/1": "元日",
        "2026/1/2": "休日",
        "2026/1/3": "休日",
        "2026/1/4": "休日",
        "2026/4/29": "休日",
        "2026/4/30": "休日",
        "2026/5/1": "休日",
        "2026/5/2": "休日",
        "2026/5/3": "休日",
        "2026/5/4": "休日",
        "2026/5/5": "休日",
        "2026/8/10": "休日",
        "2026/8/11": "休日",
        "2026/8/12": "休日",
        "2026/8/13": "休日",
        "2026/8/14": "休日",
        "2026/8/15": "休日",
        "2026/8/16": "休日",
        "2026/12/29": "休日",
        "2026/12/30": "休日",
        "2026/12/31": "休日",
    };
    // デバッグ時にdebugTimeが指定可能
    if(typeof debugTime != "undefined"){
        var now = new Date(debugTime);
    }else{
        var now = new Date();
    }
    function isHoliday(now, businessDay, holidayList){
        var holidayFlag = false;

        // 営業日に入っていない曜日は休みと判定する
        if(typeof businessDay == "undefined"){
            console.log("businessDay: invalid");
        } else {
            var weekValue = now.getDay();
            switch (weekValue) {
                case 0:
                    if (businessDay.indexOf('日') == -1) {
                        holidayFlag = true;
                    }
                    break;
                case 1:
                    if (businessDay.indexOf('月') == -1) {
                        holidayFlag = true;
                    }
                    break;
                case 2:
                    if (businessDay.indexOf('火') == -1) {
                        holidayFlag = true;
                    }
                    break;
                case 3:
                    if (businessDay.indexOf('水') == -1) {
                        holidayFlag = true;
                    }
                    break;
                case 4:
                    if (businessDay.indexOf('木') == -1) {
                        holidayFlag = true;
                    }
                    break;
                case 5:
                    if (businessDay.indexOf('金') == -1) {
                        holidayFlag = true;
                    }
                    break;
                case 6:
                    if (businessDay.indexOf('土') == -1) {
                        holidayFlag = true;
                    }
            }
        }

        // 祝日に記載されていれば休みと判定する
        // 2019-1-1 または 2019/1/1
        var day_slash = now.toLocaleDateString('ja-JP',options);
        var day_hyphen = day_slash.replace('/','-').replace('/','-'); // /を-に置き換える。2つ出てくるので、2回処理する
        var options = { year: 'numeric', month: '2-digit', day: '2-digit' };
        // 2019-01-01 または 2019/01/01
        var day_slash_2 = now.toLocaleDateString('ja-JP',options);
        var day_hyphen_2 = day_slash_2.replace('/','-').replace('/','-'); // /を-に置き換える。2つ出てくるので、2回処理する
        if(typeof holidayList == "undefined"){
            console.log("holidayList: invalid");
        } else if (holidayList[day_slash] || holidayList[day_hyphen] || holidayList[day_slash_2] || holidayList[day_hyphen_2]) {
            holidayFlag = true;
        }
        return holidayFlag;
    }

    function str2Min(str) {
        var minutes = 0;
        var strs = str.split(':');
        minutes += parseInt(strs[0]) * 60;
        if (strs[1]) {
            minutes += parseInt(strs[1]);
        } else {
            console.log("str2Min: maybe invalid");
        }
        return minutes;
    }

    //メインの処理
    var output = '';
    if (isHoliday(now, businessDay, holidayList)) {
        output = holidayMessage;
    } else {
        var nowMinutes = str2Min(now.getHours() + ':' + now.getMinutes());
        var openMinutes = str2Min(openTime);
        var closeMinutes = str2Min(closeTime);
        if(nowMinutes < openMinutes) {
            output = beforeMessage;
        } else if (nowMinutes <= closeMinutes) {
            output = openMessage;
        } else {
            output = closedMessage;
        }
    }
    document.getElementById("calculatorjpBusinessHour").innerText = output;

    var date_today = new Date();
    var date_today_str = date_today.toISOString().substr(0,10);
    var weekday = [ "日", "月", "火", "水", "木", "金", "土" ] ;

    var businessDay = '月火水木金';

    var baseday_raw = date_today;
    var after = 2;
    var slowafter = 10;
    if(output == beforeMessage) {
        after = after - 1;
        slowafter = slowafter - 1;
    }
    holidays = holidayList;

    var currentdate = baseday_raw;
    var days = 0;
    var daysall = 0;
    var dayslists = '';
    var daysdetail = '';
    while (days < after) {
        if (isHoliday(currentdate, businessDay, holidays)) {

        } else {
            days++;
            var datestring = currentdate.getFullYear() + "年" + (1+ currentdate.getMonth()) + "月" +  currentdate.getDate() + "日(" + weekday[ currentdate.getDay()] + ")";
            dayslists = datestring;
            daysdetail += days + " : " + datestring + "<br>";
        }
        daysall++;
        currentdate.setDate(currentdate.getDate() + 1);
    }

    document.getElementById("dateafter").innerText = datestring;

    var daysslow = 0;
    var daysslowall = 0;
    var daysslowlists = '';
    var daysslowdetail = '';
    while (daysslow < slowafter) {
        if (isHoliday(currentdate, businessDay, holidays)) {

        } else {
            daysslow++;
            var dateslowstring = currentdate.getFullYear() + "年" + (1+ currentdate.getMonth()) + "月" +  currentdate.getDate() + "日(" + weekday[ currentdate.getDay()] + ")";
            daysslowlists = dateslowstring;
            daysslowdetail += daysslow + " : " + dateslowstring + "<br>";
        }
        daysslowall++;
        currentdate.setDate(currentdate.getDate() + 1);
    }

    document.getElementById("dateslowafter").innerText = dateslowstring;


</script>

<iframe src="https://docs.google.com/forms/d/e/1FAIpQLScgj07Qr_CjhIHpSDbm0hpYdWMbQxOP0JoQduSWOZXVmD-FYA/viewform?usp=sf_link" width="100%" height="800" frameborder="0" marginheight="0" marginwidth="0">読み込んでいます…</iframe>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
]]></description>
      
    </item>
    
    <item>
      
      <title>プライバシーポリシー</title>
      
      
      <link>https://rescuework.nagoya/privacy/</link>
      <guid>https://rescuework.nagoya/privacy/</guid>
      
      
      <pubDate>Thu, 12 Nov 2020 14:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[<p>
    レスキューワーク株式会社は、 個人情報保護の重要性に鑑み、「個人情報の保護に関する法律」及び本プライバシーポリシーを遵守し、お客さまのプライバシー保護に努めます。</p>

<h3>個人情報保護方針</h3>

<p>レスキューワーク株式会社（以下「弊社」）は、 以下のとおり個人情報保護方針を定め、個人情報保護の仕組みを構築し、全従業員に個人情報保護の重要性の認識と取組みを徹底させることにより、個人情報の保護を推進致します。</p>

<h3>個人情報の管理</h3>

<p>弊社は、お客さまの個人情報を正確かつ最新の状態に保ち、個人情報への不正アクセス・紛失・破損・改ざん・漏洩などを防止するため、セキュリティシステムの維持・管理体制の整備・社員教育の徹底等の必要な措置を講じ、安全対策を実施し個人情報の厳重な管理を行ないます。</p>

<h3>個人情報の利用目的</h3>

<p>お客さまからお預かりした個人情報は、弊社からのご連絡や業務のご案内やご質問に対する回答として、電子メールや資料のご送付に利用いたします。</p>

<h3>個人情報の第三者への開示・提供</h3>

<p>弊社は、お客さまよりお預かりした個人情報を適切に管理し、次のいずれかに該当する場合を除き、個人情報を第三者に開示いたしません。</p>

<ul>
    <li>お客さまの同意がある場合</li>
    <li>お客さまが希望されるサービスを行なうために弊社が業務を委託する業者に対して開示する場合</li>
    <li>広告効果測定のため、情報を照合する場合</li>
    <li>法令に基づき開示することが必要である場合</li>
</ul>

<p>弊社では、<em>Google, Inc.のアクセス解析を利用してサイトの計測を行っております。Cookieを利用して分析を行うことがあり、また<em>利用者</em>の情報の一部が、Google, Inc.に収集される可能性があります。利用状況の分析、レポートの作成、その他サービスの提供目的に限りこれを使用します。Cookieは利用者がブラウザ設定で拒否できるものであり、<em>利用者が</em><em>Cookie</em>を許可する設定で本サイトを利用することで、Google, Inc.にデータを提供し、処理が行われることに同意したものとみなします。</em></p>

<h3>個人情報の安全対策</h3>

<p>弊社は、個人情報の正確性及び安全性確保のために、セキュリティに万全の対策を講じています。</p>

<h3>ご本人の照会</h3>

<p>お客さまがご本人の個人情報の照会・修正・削除などをご希望される場合には、ご本人であることを確認の上、対応させていただきます。</p>

<h3>法令、規範の遵守と見直し</h3>

<p>弊社は、保有する個人情報に関して適用される日本の法令、その他規範を遵守するとともに、本ポリシーの内容を適宜見直し、その改善に努めます。</p>

<h3>お問い合せ</h3>

<p>弊社の個人情報の取扱に関するお問い合せは下記までご連絡ください。</p>
<style>
    span.circle{
        padding: 0 0.2em;
        margin: 0 0.1em;
        position: relative;
    }
    span.circle::after {
        content: '';
        position: absolute;
        display: block;
        top: 57%;
        left: 1px;
        transform: translateY(-50%);
        width: 0.85em;
        height: 1em;
        border: 1px solid #454545;
        border-radius: 50%;
    }
</style>
<address>レスキューワーク株式会社<br />
    担当: 水野<br />
    TEL: 050-6877-6387<br />
    MAIL: privacy<span class="circle">a</span>rescuework.nagoya<br />
    メールはタイトルを『プライバシーポリシーに関する問い合わせ』としてお送りください。
</address>]]></description>
      
    </item>
    
    <item>
      
      <title>ビジネスシステム構築に、Symbol アグリゲートトランザクションが重宝する</title>
      
      
      <link>https://rescuework.nagoya/blog/business-aggregate-transaction/</link>
      <guid>https://rescuework.nagoya/blog/business-aggregate-transaction/</guid>
      
      
      <pubDate>Wed, 05 Aug 2020 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>この記事は、nemhubのタスク「300 words about Symbol」として提出したものです。日本語は、英語の文書の後にあります。</p>



<h1>The Aggregate Transaction will be a great help when developers create a business system.</h1>

<p>Symbol, a blockchain platform, has many features that enable developers to create applications fast and efficiently.</p>
    <p>Among them, the Aggregate Transaction is a powerful feature. The Aggregate Transaction merges two or more transactions into one undividable process.</p>
<p>
    Suppose you are a programmer and you have a co-working designer. You two collaborated and created a new application. You and your co-worker are going to share the revenue that comes from this application. Here, there is a problem. How do you share your revenue?</p>
<p>
    One solution is that customers pay fees to you, collect and count the income, and pay some of them to your co-worker. Although this solution is often used today, both you and your co-worker have demerits. You need to calculate what amount you should pay to your co-worker. Usually, you pay your co-worker weekly or monthly basis. That means your co-worker is forced to accept the payment delay.</p>
<p>
    The Aggregate Transaction will be a perfect solution for this situation. You can merge two transactions; one is customers pay to you, and the other is customers pay your co-worker. When customers pay, both you and your co-worker can receive it immediately. Thanks to the Aggregate Transaction feature, you need no more tedious work to calculate the share. Instead, your co-worker will get their income directly.</p>
<p>
    In this example above, the Transaction within three accounts will be processed by a customer, you, and your co-worker. "Three" is an important key. Before the Aggregate Transaction, each Transaction is limited to the interaction between two accounts. The Aggregate Transaction will enable three or more accounts to interact.</p>
<p>
    In a business process, interactions are not limited to two persons. Exchanges between three persons or more often occur, and the Aggregate Transaction allows developers to handle these situations efficiently. The Aggregate Transaction will significantly help developers create a business system. This feature will make many developers happy.</p>


<h2>--- Japanese Translation ---</h2>

<p>
    ビジネスシステム構築に、アグリゲートトランザクションが重宝する</p>

<p>ブロックチェーンプラットフォームSymbolは、開発者がアプリケーションを素早く、効率的に作成できる機能をたくさん提供している。</p>

<p>その中でも、アグリゲートトランザクションは強力な機能だ。アグリゲートトランザクションは、2つ以上のトランザクションを、分割できない一つの処理に纏める。</p>

<p>あなたがプログラマーで、パートナーのデザイナーと協業していると想定しよう。二人で協力して新しアプリケーションを作成した。利益は二人で分配する。そこで問題となるのは、どうやって利益を分配するか、だ。</p>

<p>一つの方法は、顧客はあなたに料金を支払い、あなたが収益を計算して、デザイナーに支払う、というものだ。今日良く用いられている方法だが、あなたも、パートナーもデメリットがある。あなたはパートナーに支払う金額を計算しなければならない。そして毎週あるいは毎月支払う。パートナーは、あなたが報酬を支払うのを待つ必要がある。</p>

<p>アグリゲートトランザクションにより完全に解決するだろう。2つのトランザクションを纏めれば良い。1つは顧客からあなたへの支払い、もう1つは顧客からあなたのパートナーへの支払い。顧客が支払いしたら、あなたもパートナーも即座に受け取り可能だ。アグリゲートトランザクションのおかげで、あなたは分配額を計算する必要はなくなるし、パートナーは報酬を即座に受け取れる。</p>

<p>この例では、トランザクションは、3者の間で実行される。顧客と、あなたと、あなたのパートナーだ。『3』が重要だ。アグリゲートトランザクションがなければ、2者間の取引しかできない。アグリゲートトランザクションが3者以上の取引を可能にする。</p>

<p>ビジネスでは、2者の間の取引とは限らない。3者以上で取引することもある。アグリゲートトランザクションなら、このような状況を効率よく扱える。開発者がビジネスシステムを構築するのに、アグリゲートトランザクションは重宝するだろう。多くの開発者が喜ぶはずだ。</p>

<hr>
<p>Symbolブロックチェーンについて知りたい方は、<a href="https://symbol-community.com/ja">ブロックチェーン シンボル コミュニティ</a>をごらんください。</p>

<p>XYM価格の換算は、<a href="https://calculator.jp/money/xymjpy/">XYMJPY換算</a>、<a href="https://en.calculator.jp/money/xymusd/">XYMUSD換算</a>、をごらんください。</p>]]></description>
      
    </item>
    
    <item>
      
      <title>【今すぐ更新】WordPress 5.4.1 パーマリンク設定の厳密化により、情報漏洩脆弱性が改善された</title>
      
      
      <link>https://rescuework.nagoya/blog/wordpress-541/</link>
      <guid>https://rescuework.nagoya/blog/wordpress-541/</guid>
      
      
      <pubDate>Sat, 02 May 2020 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>WordPress でアップデートがあり、<a href="https://wordpress.org/news/2020/04/wordpress-5-4-1/">最新版 5.4.1 が公開</a>されました。このリリースにはいくつかの脆弱性改善がありますので、<strong>今すぐ更新が必要</strong>です。今回はその中の一つ、</p>

<blockquote>
    <p>Props to ka1n4t for finding an issue where certain private posts can be viewed unauthenticated</p>
</blockquote>


<p>を取り上げます。</p>




<div class="balloons">
    <div class="balloon balloon-image size80">
        <div class="icon">  <img src="/images/icon-woman.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            パーマリンク設定を「年月日時分秒」にしていた人は必ず読みましょう。</div>
    </div>
</div>


<h3>何が問題だった？</h3>


<p>WordPress5.4以前では、特定の条件で、<strong>非公開記事がログインしなくても閲覧できる、という脆弱性</strong>がありました。この記事を執筆している時点(2020年5月2日午前8時)では、条件の詳細は公開されていませんが、こちらで検証すると、少なくとも以下の状態だと発生しました。</p>

<pre>
パーマリンク設定を日時だけにしている(= ID・スラッグなど一意にする項目が無い)
AND
同じ日時で、公開記事と非公開記事を投稿する</pre>
<p>パーマリンク設定は、通常は投稿IDやスラッグなどを入れて、記事が一つだけ選ばれるようにするのですが、</p>

<pre>
/* よくない方法です。この設定にはしないでください。 */
/%year%/%monthnum%/%day/%hour%%minute%%second%/</pre>

<p>のように、日時だけでもWordPress5.4以前は動いていました。本来は記事毎に異なるパーマリンクが割り当てられるはずですが、このパーマリンク設定(日時だけの設定)だと、複数の記事に同じパーマリンクが割り当てられる可能性がありました。そして同じパーマリンクが割り当てられた記事の公開設定が異なる場合に、情報漏洩が起こり得ます。</p>


<h4>非公開記事はログインしないと閲覧不可 [望ましい状態]</h4>


<div class="row"><div class="col-sm-5">

    <img src="/images/post-c.jpg" alt="非公開記事。左側はログイン状態。右側は非ログイン状態。" class="img-fluid img-thumbnail" title="非公開記事。左側はログイン状態。右側は非ログイン状態。非公開記事。左側はログイン状態。右側は非ログイン状態。">
</div><div class="col-sm-7">

    <p>WordPressでは、投稿を非公開に設定できます。ログインしたユーザーだけ閲覧可能な記事を作成できます。この場合、ログインしていない人がその記事を閲覧しようとしても not found となります。</p>

    <p>ブラウザ2つをキャプチャした画像の、左側はログイン状態。右側は非ログイン状態です。</p>

    <p>これが、望ましい状態です。</p>

</div></div>

<h3>パーマリンク設定が日時だけの場合、望ましい状態にならないことがある</h3>
<p>では、「<strong>パーマリンク設定を日時だけにする</strong>」「<strong>同じ日時で、公開記事(投稿A)と非公開記事(投稿B)を投稿する</strong>」場合を調べてみます。</p>

<p>この場合は、「投稿Aは非ログインでも見える、投稿Bは非ログインだと見えない」が本来は期待されています。</p>


<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            実際に試してみました。                    </div>
    </div>
</div>
<div class="row"><div class="col-sm-5">

    <img src="/images/post-ab.jpg" alt="公開記事と非公開記事。左側はログイン状態。右側は非ログイン状態。" class="img-fluid img-thumbnail" title="公開記事と非公開記事。左側はログイン状態。右側は非ログイン状態。">
</div><div class="col-sm-7">

    <ol>
        <li>投稿AのURLを見に行くと投稿Aの内容を閲覧できる</li>
        <li>パーマリンク設定が日時だけなので、投稿Aも投稿Bも同じURL</li>
        <li>投稿B(非公開記事)の内容も閲覧できる</li>
    </ol>

    <p>という結果になりました。</p>
    <p>キャプチャ画像は、WordPress5.4をローカルにインストールし、無線LANを無効化した状態で撮影しています。</p>
</div></div>


<h3>WordPress5.4.1で改善された</h3>

<p>この脆弱性に対して、WordPress5.4.1では、<strong>日時だけのパーマリンク設定を認めない=パーマリンク仕様を厳密化する</strong>により対処されました。(もちろんドキュメントでは「日時だけのパーマリンク設定をしないように」という説明になっていますが、WordPress5.4では、日時だけのパーマリンク設定でも動作していました。)WordPress5.3.3等、以前のバージョンにもアップデートが行われています。</p>

<p>なので、バージョンアップすれば、この脆弱性には対処できることになります。WordPressフォーラムではバグ報告カテゴリーに「<a href="https://ja.wordpress.org/support/topic/wordpress-5-4-1-%e3%81%8b%e3%82%89%e3%81%ae%e9%9a%9c%e5%ae%b3%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/">wordpress 5.4.1 からの障害について</a>」が投稿されていますが、バグ・不具合ではなく、仕様厳密化(による脆弱性修正)と思われます。</p>



<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            ユーザーが不適切な設定をしたことが主原因であっても、もし情報漏洩が起きたら大事件だから、アップデートで修正されるのは嬉しいですね。                    </div>
    </div>
</div>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<h3>日時だけのパーマリンク設定をしていた場合は設定変更が必要</h3>


<p>WordPress5.4.1のバージョンアップでは、日時だけのパーマリンク設定を認めないようになりました。しかし、日時だけのパーマリンク設定をしていた場合に、標準パーマリンク設定への変更はしないようです。このため、<strong>日時だけのパーマリンク設定をしていた場合は、WordPressの管理画面から、パーマリンク設定を変更する必要があります</strong>。</p>

<pre>
/* 設定変更例。末尾に %postname% を追加する */
/%year%/%monthnum%/%day/%hour%%minute%%second%/%postname%/</pre>
<p>日時だけのパーマリンク設定から変更しないままだと、許可されていないパーマリンク設定のため、ウェブサイトが正しく表示されなくなります。</p>

<h3>まとめ</h3>
<div class="alert alert-info">


<ul>
    <li>WordPress5.4.1は脆弱性対策アップデート</li>
    <li>「日時だけのパーマリンク設定」だと情報漏洩リスクがあり、バージョン5.4.1で改善された</li>
    <li>「日時だけのパーマリンク設定」にしていた場合は、アップデート後に<strong>パーマリンク設定変更する必要がある</strong></li>
</ul>
</div>



<div class="balloons">
    <div class="balloon image-balloon size80">
        <div class="icon">  <img src="/images/icon-man.png" class="img-fluid img-thumbnail" />                    </div>
        <div class="balloontext">
            アップデートは自動で行われるけど、パーマリンク設定は自動では変更されないよ。                    </div>
    </div>
</div>
]]></description>
      
    </item>
    
    <item>
      
      <title>もしもアフィリエイトのコンバージョンタグをWordPress問い合わせフォームに導入する</title>
      
      
      <link>https://rescuework.nagoya/blog/moshimo-wordpress/</link>
      <guid>https://rescuework.nagoya/blog/moshimo-wordpress/</guid>
      
      
      <pubDate>Mon, 13 Apr 2020 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>この記事にはアフィリエイト広告が含まれます。</p>

<p>弊社ウェブメディア「ブックレコメンド」に、もしもアフィリエイトを導入しました。WordPress問い合わせフォームにカスタマイズを追加すると、コンバージョンタグを設定できます。</p>


<h3>アフィリエイトの仕組み</h3>

<img src="/images/af2.png" alt="アフィリエイトの仕組み" class="img-fluid img-thumbnail">


<p>アフィリエイトは、図のようになっています。</p>

<ol>
    <li>提携ウェブサイトから訪問者が来る</li>
    <li>訪問者が、問い合わせ・資料請求など何かアクションする</li>
    <li>アクション完了時にコンバージョンタグを出力する=アフィリエイト成果が発生する</li>
</ol>


<h3>タグの設定箇所</h3>


<p>※もしもアフィリエイトの場合です。他のアフィリエイトサービスを利用している場合は、サービス会社のマニュアル等で確認願います。</p>

<p>「コンバージョンタグ」を完了ページに設定します。こちらは必須です。</p>

<pre>
&lt;script src=&quot;https://r.moshimo.com/af/r/result.js?p_id=xxxx&amp;pc_id=xxxx&amp;m_v=【申込ID等が代入される変数を入力してください】&quot; id=&quot;msmaf&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;img src=&quot;https://r.moshimo.com/af/r/result?p_id=xxxx&amp;pc_id=xxxx&amp;m_v=【申込ID等が代入される変数を入力してください】&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt;&lt;/noscript&gt;</pre>

<p>※&uarr;実際のタグは、もしもアフィリエイトの管理画面から取得してください。</p>

<p>訪問者がウェブサイトの他のページを回遊してから問い合わせなどすることもありますね。このような場合にも対応できるように「トラッキングタグ」を全てのページの&lt;head&gt;内に設定することが推奨されています。</p>

<pre>
&lt;script src=&quot;https://r.moshimo.com/af/r/maftag.js&quot;&gt;&lt;/script&gt;
</pre>


<h3>WordPressのJetpackフォームで使ってみる</h3>



<p>問い合わせフォームをPHPなどで作っている場合は、送信完了時にコンバージョンタグを出すようにすればOKです。</p>

<p>WordPressの場合は、送信完了時の処理がフォーム作成プラグインごとに異なります。弊社ではJetpackのフォームプラグインを使っています。この場合の設定方法を解説します。</p>



<h4>コンバージョンタグ</h4>

<p>送信完了時に表示されるメッセージに、コンバージョンタグを追加すればOKです。そのためのフィルターフック<em>grunion_contact_form_success_message</em>が用意されているので、これを使います。</p>



<pre>
// もしもコンバージョンタグの追加
function jetpackcom_custom_feedback_message( $r_success_message ) {
   $mid               = intval( $_GET[&#39;contact-form-sent&#39;] );
   $r_success_message .= &#39;&lt;script src=&quot;https://r.moshimo.com/af/r/result.js?p_id=xxxx&amp;pc_id=xxxx&amp;m_v=&#39; . esc_attr( $mid ) . &#39;&quot; id=&quot;msmaf&quot;&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;img src=&quot;https://r.moshimo.com/af/r/result?p_id=xxxx&amp;pc_id=xxxx&amp;m_v=&#39; . esc_attr( $mid ) . &#39;&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt;&lt;/noscript&gt;&#39;;

   return $r_success_message;
}
add_filter( &#39;grunion_contact_form_success_message&#39;, &#39;jetpackcom_custom_feedback_message&#39; );</pre>



<p>送信完了時に、<em>contact-form-sent</em>という識別IDが作成されます。このIDをもしもアフィリエイトに送っておくと、WordPress管理画面のIDと照合するときに役立ちます。(IDを送らない場合、ほぼ同じ時刻に複数のコンバージョンがあったときに照合が大変になります)</p>



<h4>トラッキングタグ</h4>

<p>こちらは&lt;head&gt;部分に出すので、<em>wp_head</em>フックを使います。</p>



<pre>
// もしもタグの追加
add_action( &#39;wp_head&#39;, function () {
   echo &#39;&lt;script src=&quot;https://r.moshimo.com/af/r/maftag.js&quot;&gt;&lt;/script&gt;&#39;;
});</pre>

<h3>もしもアフィリエイトは便利</h3>
<p><a href="//af.moshimo.com/af/c/click?a_id=893365&p_id=1&pc_id=1&pl_id=19210" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">もしもアフィリエイト</a><img src="//i.moshimo.com/af/i/impression?a_id=893365&p_id=1&pc_id=1&pl_id=19210" width="1" height="1" style="border:none;">は、特別単価(特単)設定も簡単に実施できます。</p>

<img src="/images/afmoshimo.png" alt="特単設定" class="img-fluid img-thumbnail">

<p>↑のように、報酬金額で段階を決められます。いったん設定してしまえば、さほど手間をかけずに運用できます。</p>

<h3>弊社顧客の方には設定代行が無料</h3>
<p>弊社にて、ホームページ作成・運用管理を行っているお客様には、弊社にて、もしもアフィリエイトの設定代行を承ります。</p>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>
]]></description>
      
    </item>
    
    <item>
      
      <title>WordPressリカバリーモードのメール通知先を wp-config.phpで設定する</title>
      
      
      <link>https://rescuework.nagoya/blog/recovery-mode-email/</link>
      <guid>https://rescuework.nagoya/blog/recovery-mode-email/</guid>
      
      
      <pubDate>Tue, 23 Jul 2019 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>この記事にはアフィリエイト広告が含まれます。</p>

<p>WordPress5.2以降でリカバリーモード機能が利用できます。致命的なエラーが発生した場合に、メール通知する機能です。</p>

<p><img src="/images/error-message.jpg" alt="サイトで技術的な問題が発生しています" class="img-fluid img-thumbnail"></p>

<p>もちろん、エラーが発生しないようにするのがベストです。しかし、エラーをゼロにするのは非常に大変です。エラーが発生してしまったときに、エラーに早く気づき、被害を少なくする、というのも大事ですね。</p>

<h2>メールの通知先を指定する</h2>

<p>致命的なエラーが発生した場合に通知するメールアドレスは、wp-config.phpに以下のように記述することで設定できます。</p>

<pre>
define( &#39;RECOVERY_MODE_EMAIL&#39;, &#39;wp-error@example.com&#39; );</pre>

<p>定数 RECOVERY_MODE_EMAIL に設定したメールアドレスに通知されます。リカバリーメールが来ない、見落とす、等すると大変なので、確実に受け取れるアドレスを指定してきましょう。</p>

<p>なおwp-config.phpで指定していない場合は、リカバリーメールは管理画面の「一般設定」の管理者メールアドレスに届きます。</p>

<h3>運用・保守の改善</h3>

<p>運用・保守のときに、上手く使うと便利だと思われます。</p>

<ul>
    <li>
        <p>ホームページ制作会社が、顧客のWordPressのリカバリー通知先を、サーバー管理担当者のメールアドレスにする</p>
    </li>
    <li>通知専用のメールアドレスを設定しておく&rarr;このメールアドレスにメールが来たらslackやchatworkなどに通知する</li>
</ul>

<p>などです。</p>


<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<h3>お知らせ：「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」第3版</h3>

<p>大好評の書籍「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」の第3版が出版されます。上記のリカバリーモードの他、the_privacy_policy_link()、wp_body_open()、グーテンベルクなど、第2版発売後に追加された機能について追記しています。</p>



<a href="//af.moshimo.com/af/c/click?a_id=901042&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2FWordPress%25E3%2583%25A6%25E3%2583%25BC%25E3%2582%25B6%25E3%2583%25BC%25E3%2581%25AE%25E3%2581%259F%25E3%2582%2581%25E3%2581%25AEPHP%25E5%2585%25A5%25E9%2596%2580-%25E3%2581%25AF%25E3%2581%2598%25E3%2582%2581%25E3%2581%258B%25E3%2582%2589%25E3%2580%2581%25E3%2581%25A6%25E3%2581%2584%25E3%2581%25AD%25E3%2581%2584%25E3%2581%25AB%25E3%2580%2582-%25E7%25AC%25AC3%25E7%2589%2588-%25E3%2580%2588WordPress-Gutenberg%25E5%25AF%25BE%25E5%25BF%259C%25E3%2580%2589%2Fdp%2F4844368893" rel="nofollow"><img src="https://images-fe.ssl-images-amazon.com/images/I/51rM2DlCdlL._SL160_.jpg" alt="" style="border: medium none;" /><br />WordPressユーザーのためのPHP入門 はじめから、ていねいに。[第3版] 〈WordPress 5.x/Gutenberg対応〉</a><img src="//i.moshimo.com/af/i/impression?a_id=901042&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062" alt="" style="border: 0px none;" width="1" height="1" />


<p>リカバリーモードのメール通知先については、書籍246ページに記載されています。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>xserverでのcronを使ったバックアップ</title>
      
      
      <link>https://rescuework.nagoya/blog/xserver-cron/</link>
      <guid>https://rescuework.nagoya/blog/xserver-cron/</guid>
      
      
      <pubDate>Thu, 01 Feb 2018 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>弊社では、ホームページのコンテンツと、データベースをバックアップするプログラムを作成して、作業効率化を図っています。</p>

<p>データベースは、ホームページ作成ソフト(CMS)を使う場合は必須のことがあります。concrete5 や WordPressではデータベース必須ですので、データベースの内容もバックアップします。</p>

<p>今回は<a href="https://px.a8.net/svt/ejp?a8mat=1C6DC2+EO3ICY+CO4+609HU" rel="nofollow" target="_blank">エックスサーバー</a> <img alt="" border="0" height="1" src="https://www19.a8.net/0.gif?a8mat=1C6DC2+EO3ICY+CO4+609HU" width="1" />を例にとりあげます。</p>


<img src="/images/xserver-info1.jpg" alt="xserver管理画面" class="img-fluid img-thumbnail">

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<h3>作業ミス・漏れを減らす</h3>

<p>バックアップ作業自体は、それほど難しいものではありません。しかしながら、手作業で行う場合は、バックアップするディレクトリ・ファイルを間違える可能性もあります。また他の仕事が忙しくてバックアップ作業ができないケースや、作業自体を忘れてしまうケースも生じるかもしれません。</p>

<p>そういった間違いが生じないように、バックアッププログラムを作成して、作業を自動化しておくことは大事だと思われます。</p>

<h3>ディレクトリをバックアップするスクリプト</h3>

<p>ディレクトリをバックアップスクリプトは下記のようになります。</p>



<pre>
#!/bin/bash

day=`date &#39;+%Y-%m-%d&#39;`

tar -zcf /home/<b>my-mitsu</b>/<strong>example.com</strong>/backup/$day.tar.gz -C / home/<b>my-mitsu</b>/<strong>example.com</strong>/public_html</pre>



<p>太字になっているmy-mitsu, example.com は、ご自身の環境に合わせて変更をお願いします。</p>

<p>my-mitsu -- xserver のアカウント名<br />
    example.com -- ウェブサイトのドメイン名</p>

<p>となります。またサーバーによっては、1行目</p>

<p>#!/bin/bash</p>

<p>を変更する必要がありますので、サーバー会社のマニュアルやFAQでご確認ください。</p>

<p>バックアップファイルは、2018-01-31.tar.gzのようなファイル名になります。(1日に複数回バックアップする場合は上書きされます。必要なら2行目を書きかえてください。)</p>

<p>バックアップファイルの置き場所は、/home/my-mitsu/example.com/backup になります。backupというディレクトリはあらかじめ作成しておくようにお願いします。置き場所を変更したい場合は、適宜書き換えてください。</p>

<h3>データベースをバックアップするスクリプト</h3>

<p>こちらは少し複雑なスクリプトになります。</p>



<pre>
#!/bin/bash

day=`date &#39;+%Y-%m-%d&#39;`

/usr/bin/mysqldump --add-drop-table --host=<strong>1HOST</strong>.xserver.jp --user=<strong>2USER</strong> --password=<strong>3PASS</strong> <strong>4DB</strong> &gt; /home/<strong>my-mitsu</strong>/<strong>example.com</strong>/backup/$day.sql</pre>



<p>プログラム内にデータベースのアクセス情報を記入します。このファイルは必ず非公開領域に置いてください。</p>

<p>1HOST -- ホスト名<br />
    2USER -- データベースのユーザー名<br />
    3PASS -- 接続パスワード<br />
    4DB -- データベース名</p>

<p>これらは実際の値に書き換えます。CMS導入している場合は、CMSの設定ファイルを確認すると、これらの情報が書いてあります。</p>

<p>WordPressの場合 -- ルートディレクトリのwp-config.php<br />
    concrete5の場合 -- application/config/database.php</p>

<p>を見ると、情報が確認できます。</p>

<h3>自動実行 - cronを使う</h3>

<p>上述のプログラムは、サーバーにログインして、自分で実行することもできますが、自動化しておくとミスを減らせます。このときに使うのがcronです。xserverでは管理画面からcron登録できます。</p>

<p>cronの設定画面です。</p>

<img src="/images/xserver-info2.jpg" alt="cron実行設定" class="img-fluid img-thumbnail">


<p><strong>分、時間、日、月、曜日</strong>が指定できます。曜日は0が日曜、1が月曜...6が土曜です。*を指定すると、指定無しになります。</p>

<p>画像の例では、月0、時間3、日*、月*、曜日0となっています。日曜日の3時0分に実行する、という意味になります。<br />
    毎月一回実行したい場合は、月10、時間7、日1、月*、曜日*のようにすれば、毎月1日7時10分に実行します。<br />
    毎日一回実行したい場合は、月30、時間20、日*、月*、曜日*のようにすれば、毎日20時30分に実行します。</p>

<p><strong>コマンド</strong>の欄は、実行したいファイルを指定します。画像の例では、/home/my-mitsu/example.com/にある、mysqlbackup.shファイルを実行します。実行するファイルには実行権限(+x)を付けておいてください。</p>

<p>こうすることで、バックアップ作業を自動化できました。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>concrete5のページ属性セットを活用して、管理画面で並び替える</title>
      
      
      <link>https://rescuework.nagoya/blog/concrete5-page-attribute/</link>
      <guid>https://rescuework.nagoya/blog/concrete5-page-attribute/</guid>
      
      
      <pubDate>Fri, 26 Jan 2018 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>concrete5では、似たフォーマットのページをたくさん作る場合、コンポーザーを使うことがよくあります。たとえば、</p>

<ul>
    <li>地域のお店ポータルサイトで、お店情報を登録する</li>
    <li>美容院のサイトで、美容師の情報を登録する</li>
</ul>

<p>などです。concrete5では、ページとテーマ＞ページタイプで、コンポーザーの設定を行います。GUIを使ってコンポーザー設定ができます。コンポーザーで入力することができる項目は、ページ属性(WordPressのカスタムフィールドのようなもの)と呼びます。ページ属性は管理画面から作成・並べ替えができます。</p>

<p>では、ページへの出力(画面表示)はどうでしょうか？</p>

<p>1つの方法として、ページ属性表示ブロックを使う、というものがあります。この方法はブロックを置くだけなので、作業自体は簡単です。しかし、ページ属性が多くなった場合、ページ属性の数だけブロックを置く必要があります。なので作業時間は必ずしも短くありません。</p>

<h3>出力を自動化する</h3>

<p>作業効率向上のため、出力を自動化するようにしました。仕組みとしては</p>

<ol>
    <li>属性のセットを作る(concrete5では属性のセットを使って、属性をグループ分けできます)</li>
    <li>属性をセットに登録する</li>
    <li>セットに登録されている属性のデータを出力するコードを書く</li>
</ol>

<p>という形です。1. と 2. は、管理画面から行うことができます。</p>

<p><img src="/images/page-attributes.png" alt="ページ属性のセットを作成" class="img-fluid img-thumbnail"></p>

<p>3. の部分のみ、コードを書きます。コードは以下のようになります。</p>



<pre>
            &lt;?php
            // 属性セットを取得する
            $atSet = AttributeSet::getByHandle(&#39;shopinfo&#39;);

&nbsp;           // セットにある属性一覧を取得する
&nbsp;           $atKeys = $atSet-&gt;getAttributeKeys();

            // 属性一覧にある属性を順に処理する
            foreach($atKeys as $ak) {
&nbsp;               // 属性が、そのページに存在するかチェックする
                if ($c-&gt;getAttribute($ak-&gt;getAttributeKeyHandle())) {

                    // 属性名を表示する
&nbsp;                   echo h($ak-&gt;getAttributeKeyDisplayName());

&nbsp;                   // 属性の値(そのページで設定されている値)を表示する
&nbsp;                   echo nl2br(h($c-&gt;getAttribute($ak-&gt;getAttributeKeyHandle())));
                }
            }
            ?&gt;</pre>



<p>こうすることで、ページ属性がたくさんある場合でも、効率よく設置できます。</p>

<p><img src="/images/page-attribute-display.png" alt="ページ属性を表示する" height="463" width="742" class="img-fluid img-thumbnail"></p>

<h3>その他のメリット</h3>

<p>このように実装すると、作業効率が良くなります。さらに、他のメリットがあります。</p>

<ol>
    <li>ページ属性を追加しやすい</li>
    <li>ページ属性を並べ替えやすい</li>
</ol>

<p>ページ属性を後から追加するケースも考えられます。たとえば「新しいSNSが流行したので、そのSNS情報をページ属性で追加する」みたいなケースです。その場合でも、ページ属性をセットに登録すれば、テーマ出力部分は変更が不要です。</p>

<p>また、ページ属性の順序は、管理画面上の順序が反映されます。上の例では住所を一番上の項目にしていますが、これは管理画面のページ属性のセットでの並び順が、住所・業種・電話・・・のようになっているからです。管理画面上で並び順を変更すると、テーマでの表示も変更されます。(キャッシュ機能を有効にしている場合は、キャッシュをクリアしてください)</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>WORDCAMP KYOTO に参加しました。</title>
      
      
      <link>https://rescuework.nagoya/blog/wordcamp-kyoto-1/</link>
      <guid>https://rescuework.nagoya/blog/wordcamp-kyoto-1/</guid>
      
      
      <pubDate>Mon, 26 Jun 2017 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[<p>
WordCamp Kyoto に参加しました。京都市左京区にある京都大学で開催されました。当日朝に愛知県から移動して参加しました。一番印象的だったセッションについて書きます。セッションのレポートではなくて、セッションを聴いて、私が考えたことを書きます。
</p>
<h3>CMSとデータ管理</h3>
<p>
CMSはページ(html)を生成することができます。しかし、htmlでの表示は、データ(コンテンツ)の表示形式の1つでしかありません。しかし、データ自体は、htmlに限らず、様々な形式で出力できることが好ましいでしょう。ホームページ(ブラウザで閲覧)であれば、htmlで構いませんが、他の形式にも対応していると、応用範囲が広くなります。すぐ思いつくだけでも、
</p>
<ul>
    <li>ホームページと店頭のデジタルサイネージを同時に更新する</li>
    <li>商品一覧をPDFに出力し、パンフレットを作る</li>
    <li>iPhone/androidアプリにデータを送る</li>
</ul>

<p>
など、いろいろあります。
</p>
<h3>データを構造的に管理する</h3>
<p>
様々な形式で管理するためには、データを構造的に管理しておかないと大変です。もし、保存されているデータが
</p>
<pre><table><tr><td>書名</td><td>WordPressユーザーのためのPHP入門</td></tr>
<tr><td>著者</td><td>水野史土</td></tr>
<tr><td>出版社</td><td>エムディーエヌコーポレーション</td></tr>
<tr><td>価格</td><td>2400円(税込2592円)</td></tr></table> <table><tr><td>書名</td><td>...</td></tr> <tr><td>著者</td><td>...</td></tr> <tr><td>出版社</td><td>...</td></tr> <tr><td>価格</td><td>...</td></tr></table></pre>
<p>
だったら、html表示には良いかもしれませんが、他の形式に変換するときに大変です。CMSにデータを入力するときに、本文にベタッと書いた場合に、こんな感じになります。
</p>
<p>
そうではなくて、
</p>
<ul>
    <li>データを保存する時には、書名、著者、出版社、価格をきちんと分けて保存する</li>
    <li>htmlタグは、データそのものではないので、分ける(一緒に保存しない)</li>
</ul>

<p>
としておけば、データを様々な方法に活用できます。
</p>
<p>
htmlタグは表示するときに出力する、という形です。htmlの出力はCMSがやる必要はなく、フロント側の仕組みはCMS(データ管理)とは別で管理しても良いわけです。今後のCMSの開発の流れとしては、この方向性は重要だろうな、と思います。
</p>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<h3>後方互換性</h3>
<p>
Drupalでは、後方互換性は維持しない方針だそうです。WordPressが後方互換性を重視しているのとは反対ですね。なので、Drupal7->Drupal8、は簡単にはアップデートできないらしいです。
</p>
<p>
これは良し悪しで、WordPressの場合は、アップデートで困ることはないですが、古いコード(メンテナンスしにくいコスト)が残りやすい、という問題もあります。コーディング規約が新しくなっているのに、それに対応していないコードなどです。コアの方針を知った上で、どこを妥協するか、ということになると思います。
</p>
<p>
システム上のアップデートが大変でも良いのですが、データ(コンテンツ)はスムーズに移行できるといいですね。csvダウンロード機能ぐらいなら自作したことありますが、データ形式が統一されればいいですね。個人的にはxmlが好みですね。この辺は、どのCMSでも、相互にデータの出し入れができるようになると嬉しいです。そのためにはCMS同士の交流が活発になると良さそうです。
</p>]]></description>
      
    </item>
    
    <item>
      
      <title>ホームページ上に見積書(PDF)発行フォームを作成できるようにしました</title>
      
      
      <link>https://rescuework.nagoya/blog/estimate-form/</link>
      <guid>https://rescuework.nagoya/blog/estimate-form/</guid>
      
      
      <pubDate>Sat, 20 Aug 2016 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>ホームページ上に見積りフォームを作成できるようにしました。ホームページから問い合わせが無い場合、価格がわからない、という理由も考えられますね。そういった場合に、見積もりフォームがあると、訪問者が価格の目安を知ることができます。</p>

<p>サンプルとして、ケータリングサービスの場合の見積もりを作成してみました。</p>

<p><img src="/images/catering.png" alt="ケータリング見積例" class="img-fluid img-thumbnail"></p>

<p><a href="https://my-mitsu.com/sample/catering" target="_blank">ケータリング見積もりを試してみる</a></p>

<p>上のリンクをクリックしてみてください。</p>

<p>B2Cサービスであれば、EC-CUBEのようなネットショップシステムを導入する方法もありますが、B2Bサービスであれば、見積書(PDF)が必要なケースも多いであろう、という判断でこの機能を作成しました。</p>



<p>サンプルでは、オプション「あり」を選ぶと、詳細項目が表示される仕組みになっています。このような条件分岐も、管理画面から編集できます。以前に、<a href="http://ounziw.com/2015/01/11/radio-other/" target="_blank">問い合わせフォームの条件分岐</a>を作ったことがありますが、今回もだいたい同じような仕組みで作りました。</p>

<h3 data-redactor-inserted-image="true">ウェブサービスとして公開</h3>

<p data-redactor-inserted-image="true">ウェブサービス「<a href="https://my-mitsu.com/" target="_blank">マイ見積</a>」として公開することができました。ホームページの問い合わせフォームの改善にご利用ください。マーケティングオートメーションツールを導入している場合、訪問者のアクションの1つとして、見積計算実行を加えることができるので、ウェブマーケティングにも役立ちます。WordPress や PulseCMS はプラグインで埋め込み可能です。wix、jimdo、ペライチの場合は、リンクを貼るかiframeで埋め込みしてください。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>伏見駅から名古屋広小路伏見中駒ビル(名古屋市中区栄2-2-1)への行き方(徒歩)</title>
      
      
      <link>https://rescuework.nagoya/blog/fushimi4/</link>
      <guid>https://rescuework.nagoya/blog/fushimi4/</guid>
      
      
      <pubDate>Fri, 13 May 2016 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[<link rel="stylesheet" href="https://rescuework.nagoya/css/leaflet.min.css">

<script src="https://code.jquery.com/jquery-3.6.1.slim.min.js" integrity="sha256-w8CvhFs7iHNVUtnSP0YKEg00p9Ih13rlL9zGqvLdePA=" crossorigin="anonymous"></script>
<script src="https://rescuework.nagoya/js/leaflet.min.js"></script>
<p>名古屋広小路伏見中駒ビル(名古屋市中区栄2-2-1)は、伏見駅(名古屋市営地下鉄東山線、鶴舞線)4番出口から東に徒歩1分です。</p>



<div class="maparea" id="mapae4010c848afba5d2e" style="width:100%;height:300px;max-width: 100%" data-lat="35.1683547" data-lng="136.89875940000002" data-markerlat="35.16809018135681" data-markerlng="136.89887523651126" data-zoom="17" data-message="名古屋広小路伏見中駒ビル5F"></div>
<script type="text/javascript">
    if($('#mapae4010c848afba5d2e')) {
        var map = L.map('mapae4010c848afba5d2e').setView([$('#mapae4010c848afba5d2e').data("lat"), $('#mapae4010c848afba5d2e').data("lng")],$('#mapae4010c848afba5d2e').data("zoom"));

        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            attribution: '&copy; <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors'
        }).addTo(map);
        var marker = L.marker(
            [$('#mapae4010c848afba5d2e').data("markerlat"), $('#mapae4010c848afba5d2e').data("markerlng")]
        ).addTo(map) ;
        if ($('#mapae4010c848afba5d2e').data("message") != '') {
            marker.bindPopup($('#mapae4010c848afba5d2e').data("message")).openPopup() ;
        }
    }
</script>






<form id="currentlocation">
    <input type="submit" value="現在地からの距離を表示する">
</form>
<p><span id="distance"></span></p>

<script>
    var lat = $("div.maparea").data("lat");
    var lng = $("div.maparea").data("lng");

    function successCallback(position) {
        var point = L.latLng(lat, lng);
        var point1 =  L.latLng(position.coords.latitude, position.coords.longitude);
        var distance = L.CRS.Earth.distance(point, point1);
        $("#distance").text(parseInt(distance)+' m');
        map.fitBounds(
            [point, point1]
        );

        var currentPosition = L.icon({
            iconUrl: '/images/current-position.png',
            iconSize: [32, 32],
            iconAnchor: [22, 22],
        });
        var markers = L.marker(
            point1, {icon: currentPosition}
        ).addTo(map);
    }

    /***** 位置情報が取得できない場合 *****/
    function errorCallback(error) {
        var err_msg = "";
        switch(error.code)
        {
            case 1:
                err_msg = "位置情報の利用が許可されていません";
                break;
            case 2:
                err_msg = "デバイスの位置が判定できません";
                break;
            case 3:
                err_msg = "タイムアウトしました";
                break;
        }
        document.getElementById("show_result").innerHTML = err_msg;
        //デバッグ用→　document.getElementById("show_result").innerHTML = error.message;
    }
    $('#currentlocation').click(function(e){
        e.preventDefault();
        navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
    });
</script>

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>

<p>■名古屋駅から伏見駅へ<br />
    名古屋駅から伏見駅へは、地下鉄東山線で一駅、約2分です。栄方面藤が丘行きにご乗車ください。</p>

<p>■伏見駅に着いたら<br />
    伏見駅は、地下通路が東山線で分断されています。このため、改札と繋がっている出口が決まっています。<br />
    北改札を出ると、1番出口と10番出口のみ繋がっています。<br />
    4番出口に行くには、中央改札または南改札から出る必要があります。</p>

<p>■ 名古屋駅から来た場合<br />
    伏見駅のホームからすぐの改札は北改札です。4番出口へ行くため、この改札では出ません。<br />
    ホーム後方(名古屋駅寄り)にある階段(連絡通路)を通り、反対側のホームへ移動します。
<br>（栄、本山方面から来た場合は↓※印までスキップする）</p>
<p><img src="/images/fushimi-1.jpg" alt="伏見駅連絡階段" class="img-fluid img-thumbnail"></p>
<p><img src="/images/fushimi-2.jpg" alt="伏見駅連絡階段" class="img-fluid img-thumbnail"></p>
<p><img src="/images/fushimi-3.jpg" alt="伏見駅連絡階段" class="img-fluid img-thumbnail"></p>
<p><img src="/images/fushimi-4.jpg" alt="伏見駅連絡階段" class="img-fluid img-thumbnail"></p>

<p>ホームを移動したら、右手に見える改札から出ます。</p>

<p><img src="/images/fushimi-5.jpg" alt="" class="img-fluid img-thumbnail"></p>


<p>中改札口から出ます。(※栄、本山方面から来た場合※ココから※)</p>
<p><img src="/images/fushimi-6.jpg" alt="" class="img-fluid img-thumbnail"></p>

<p>50メートルぐらい直進します。(途中で10段ぐらいの階段を下ります。)</p>

<p><img src="/images/fushimi-8.jpg" alt="" class="img-fluid img-thumbnail"></p>
<p><img src="/images/fushimi-9.jpg" alt="" class="img-fluid img-thumbnail"></p>


<p>左手に、4番出口5番出口の掲示があるので、曲がります。</p>
<p><img src="/images/fushimi-10.jpg" alt="" class="img-fluid img-thumbnail"></p>
<p><img src="/images/fushimi-11.jpg" alt="" class="img-fluid img-thumbnail"></p>


<p>エスカレーターを上がったところで左へ曲がります。（直進すると5番出口です。）</p>

<p><img src="/images/fushimi-12.jpg" alt="" class="img-fluid img-thumbnail"></p>
<p><img src="/images/fushimi-13.jpg" alt="" class="img-fluid img-thumbnail"></p>


<p>■4番出口から広小路伏見中駒ビル<br />
    道沿いに直進します。信号を渡ると、ドラッグストアに着きます。</p>

<p><img src="/images/fushimi-14.jpg" alt="" class="img-fluid img-thumbnail"></p>

<p>
    ドラッグストアのビルが広小路伏見中駒ビルです。入口は右手にあります。（一軒め酒場の手前です。）</p>
<p><img src="/images/fushimi-15.jpg" alt="" class="img-fluid img-thumbnail"></p>
]]></description>
      
    </item>
    
    <item>
      
      <title>吹上駅から中小企業振興会館への行き方(徒歩)</title>
      
      
      <link>https://rescuework.nagoya/blog/fukiage/</link>
      <guid>https://rescuework.nagoya/blog/fukiage/</guid>
      
      
      <pubDate>Fri, 13 May 2016 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>名古屋市営地下鉄桜通線吹上駅から中小企業振興会館までの道のりです。中小企業振興会館は吹上ホールと呼ぶこともあります。</p>



<h3>吹上駅5番出口</h3>

<p>吹上駅の5番出口が中小企業振興会館に近いです。駅のホームでは、中央にあるエスカレーターで改札に向かいます。</p>

<p><img src="/images/escalator.jpg" alt="吹上駅エスカレータ" class="img-fluid img-thumbnail"></p>

<p data-redactor-inserted-image="true">駅長室のある改札口に到着します。(駅長室のない改札は、中小企業振興会館<span class="redactor-invisible-space">に</span>遠い改札です。)</p>

<p><img src="/images/station-master.jpg" alt="改札口" class="img-fluid img-thumbnail"></p>


<p data-redactor-inserted-image="true">改札を出たら右に進みます。</p>

<p><img src="/images/gate.jpg" alt="改札を右へ行く" class="img-fluid img-thumbnail"></p>


<p data-redactor-inserted-image="true">20mぐらい進むと道が分かれるので、5番出口に向かいます。<br>
    <img src="/images/exit.jpg" alt="吹上駅5番出口" class="img-fluid img-thumbnail"></p>

<p data-redactor-inserted-image="true">階段を登ったら、コンビニエンスストアが見えるので、そちらに進みます。この道を直進すれば着きます。</p>

<p><img src="/images/walk.jpg" alt="大通りを直進" class="img-fluid img-thumbnail"></p>


<p>「吹上公園」交差点を直進します。</p>

<p><img src="/images/signal.jpg" alt="「吹上公園」交差点" class="img-fluid img-thumbnail"></p>


<p>中小企業振興会館に到着です。</p>

<p><img src="/images/building.jpg" alt="中小企業振興会館" class="img-fluid img-thumbnail"></p>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>]]></description>
      
    </item>
    
    <item>
      
      <title>「商品の良し悪しに関わらずリピートする10のカン100事例セミナーIN(愛知県名古屋市)」に参加しました</title>
      
      
      <link>https://rescuework.nagoya/blog/repeat/</link>
      <guid>https://rescuework.nagoya/blog/repeat/</guid>
      
      
      <pubDate>Thu, 17 Mar 2016 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[<p>
商品の良し悪しに関わらずリピートする10のカン100事例セミナーin(愛知県名古屋市)に参加しました。マーケティングコンサルタント横田 秀珠さんのセミナーです。
</p>
<p>
「良い商品を作る」というのは大事ですが、このセミナーでは、それ以外の観点に着目しよう、とくにリピートされているものから、ヒントを見つけ出し、自分のビジネスに役立てよう、という話でした。
</p>
<p>
10個のテーマがあったのですが、特に印象的だったものを抽出して書きます。
</p>
<h3>時間</h3>
<p>
定期購入のような仕組みを作る。弊社でも、ちょうどオンラインショップで頒布会形式を計画しているところで、タイムリーな内容でした。毎月定期的に送られてくると、買う側としても楽ですし、毎回異なるものが届くのであれば、それはそれで楽しみになるのではないかな、と考えています。</p>
<p>
面白かったのは、コンサルティングの契約が、月払いと年払いで、月払いのほうがリピート率が良い、という話です。料金としては年払いは10ヶ月分で得なのだけど、年払いは振込で、しかも10ヶ月分を一度に払う必要があります。長期的に契約するのであれば、支払い額は年払いが少なくて済むのですが、年払いのほうが「継続しようか？やめようか？」と考えるきっかけを作りやすい、そのため解約されてしまう、ということのようです。
</p>
<p>弊社の<a href="https://my-mitsu.com/">自動見積もりシステム</a>も年払いのほうがお得に金額設定していますが、月払い利用のほうが人気があるようです。</p>
<h3>難関</h3>
<p>名前の付け方の話がありました。</p>

<p>Windowsが、Windows7、Windows8、Windows10と数字になった理由。言われてみれば納得の理由でした。（本セミナーでは触れられていませんでしたが、Windows9が飛ばされた理由は、過去にWindows95やWindows98があるためらしいです。「Windows9」を単純に文字列検索すると、Windows95やWindows98も引っかかる点を懸念したらしいです。）</p>
<p>
会社名や商品名は唯一のものにする。ここは、私も自分の会社を立ち上げるときに調べました。実際には自分で調べたのではなく、司法書士の方にお願いした（社名などもきちんと調べてくれる司法書士を探して依頼した）のですけど。おかげで、レスキューワーク、という名前の会社は今のところうちだけです。IT系はもちろん、災害や防災関係の会社にも同名の会社はありません。商品は商標登録しておくのが好ましいですね。ちょうど、スペインで「UDON」が商標登録されて、現地のうどん屋が困っている、といったニュースが最近報じられました。偶然にもこの日の夜にも、その話題がでてきて、「おおっ」てなりました。</p>

<h3>BtoBにどう応用するか</h3>
<p>
紹介されていた事例の多くはBtoCのマーケティングでした。ところが、弊社の顧客はBtoBビジネスのところが多いです。（BtoBビジネスの会社をメインターゲットとしているためです。）</p>
<p>
横田さんの事例も、「BtoBに役立ちそうか？」という視点で、見直してみようと思います。おそらくいくつかはBtoBでも威力を発揮しそうです。</p>

]]></description>
      
    </item>
    
    <item>
      
      <title>PHP技術者認定ウィザード2015に合格しました</title>
      
      
      <link>https://rescuework.nagoya/blog/php2015/</link>
      <guid>https://rescuework.nagoya/blog/php2015/</guid>
      
      
      <pubDate>Thu, 27 Aug 2015 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>PHP 技術の普及や技術者育成を行っている<a href="http://www.phpexam.jp/" target="_blank">一般社団法人PHP技術者認定機構</a>では、PHP技術者認定試験を行っています。ITスキル標準(ITSS)にも登録されており、「初級」(レベル1)、「準上級」(レベル2)、「上級」(レベル3)<span class="redactor-invisible-space">が登録されています。さらに、「</span>ウィザード」があります。
</p><h3>ウィザード審査の特徴</h3><p>初級～上級試験は客観式(多肢選択)ですが、ウィザードは、論文を提出して公開審査＆投票、という手順で認定されます。
</p><p>パフォーマンス、セキュリティ、フレームワーク、インターナルのいずれかの分野を選んで、論文を提出します。
</p><p>ウィザード審査は無料で行われます。
</p><p>提出された論文が一ヶ月間、公開されます。「PHPの発展に貢献できる知識と発想力を持つこととします。」という基準で審査し、投票を行います。
</p><p>投票には、PHP技術者認定試験の初級～上級認定者が投票します。ベテランエンジニアだけでなく、これからキャリアを築いていく新米エンジニアも投票する、という特徴があります。
</p><h3>ウィザード認定されるためにやったこと</h3><p>論文で主張したポイントは、「警告メッセージ改善」です。特定のソフトウェア<span class="redactor-invisible-space">に限定されないですし、PHP言語にも限定されません。もちろん、論文としては、一般性の高い内容のほうが好ましいでしょう。しかし、審査方式を考えてみると、どうでしょうか。ウィザードは、初級～上級認定者が投票<span class="redactor-invisible-space">して認定する仕組みです。つまり、実際にプログラミングを書いているエンジニアが投票するわけです。であれば、現場のエンジニアに興味を持ってもらう、という観点も必要だろうと考えました。そこで<span class="redactor-invisible-space">、PHP製ソフトウェアの中でも利用率の高いWordPressを題材に取り上げよう、と考えました。</span></span></span></p><p><span class="redactor-invisible-space"><span class="redactor-invisible-space">WordPressを題材に<span class="redactor-invisible-space">した警告メッセージ改善、を実際に2013年の終わりにWordPress<span class="redactor-invisible-space">コアに提案し</span>ました。2014年4月にリリースされたWordPress3.9で、<span class="redactor-invisible-space">コアに取り入れられました。それから、stackoverflowでの質問回答を確認して、警告メッセージ改善<span class="redactor-invisible-space">した効果が出てきているようだ、と実感しました。論文にまとめ、PHP5 技術者認定ウィザード2015<span class="redactor-invisible-space">に申し込みました。</span></span></span><br></span></span></span></p><h3>審査結果</h3><p>可30票、不可3票、棄権8票で、合格となりました。<br></p><p>審査コメントには、</p><blockquote>「実装は単純なものだが、警告メッセージでのセキュリティ改善という手法を明らかにしたこと、WordPressという世界的プロダクトへの貢献という点を評価します。 」<span class="redactor-invisible-space"><br></span></blockquote><p>という意見もありました。WordPressを題材に取り上げてよかったな、と思いました。</p>]]></description>
      
    </item>
    
    <item>
      
      <title>Settings API で WordPress 管理画面を作る</title>
      
      
      <link>https://rescuework.nagoya/blog/settings-api/</link>
      <guid>https://rescuework.nagoya/blog/settings-api/</guid>
      
      
      <pubDate>Thu, 27 Aug 2015 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[

<p>WordFes Nagoya 2015のセッションで取り上げるサンプルプラグインの解説です。</p>

<h3>管理画面の登録</h3>

<p>管理画面をまず作る処理です。add_options_pageを使います。このページへの実際の出力はコールバック関数で設定します。</p>

<p>Settings APIの場合、「ページ」「セクション」「フィールド」の順に作っていきます。</p>

<pre>
// 設定画面を追加する
function my_slider_settings_menu() {
    add_options_page(
        &#39;スライダー詳細設定&#39;, // ページのタイトル
        &#39;スライダー詳細設定&#39;, // メニューのタイトル
        &#39;manage_options&#39;, // このページを操作する権限
        &#39;my_slider_settings&#39;, // ページ名
        &#39;my_slider_settings_plugin_options&#39; // コールバック関数。この関数の実行結果が出力される
    );
}
add_action(&#39;admin_menu&#39;, &#39;my_slider_settings_menu&#39;);

// フォームの枠組を出力する
function my_slider_settings_plugin_options() {
?&gt;
    &lt;div class=&quot;wrap&quot;&gt;
        &lt;form action=&quot;options.php&quot; method=&quot;post&quot;&gt;
&lt;?php do_settings_sections(&#39;my_slider_settings&#39;); // ページ名 ?&gt;
&lt;?php settings_fields(&#39;my_slider_settings-group&#39;); // グループ名 ?&gt;
&lt;?php submit_button(); ?&gt;
        &lt;/form&gt;
    &lt;/div&gt;
&lt;?php
}
</pre>

<p>do_settings_sectionsで設定セクションを作ります。 settings_fieldsは画面が正当であることを証明するコード等を出力します。つまり、settings_fieldsを入れるだけで、面倒な処理をWPが面倒見てくれます。</p>



<h3>画面上にセクションを作成</h3>

<p>次に、セクションを作ります。add_settings_sectionを使います。4番目の引数は、先ほどdo_settings_sectionsで設定したページ名に合わせます。</p>

<pre>
// 管理画面の作成
function my_slider_settings_init() {
    add_settings_section(
        &#39;my_slider_settings_section&#39;, // セクション名
        &#39;スライダーの設定&#39;, // タイトル
        &#39;my_slider_settings_section_callback_function&#39;, // コールバック関数。この関数の実行結果が出力される
        &#39;my_slider_settings&#39; // このセクションを表示するページ名。do_settings_sectionsで設定
    );
}
add_action(&#39;admin_init&#39;, &#39;my_slider_settings_init&#39;);

function my_slider_settings_section_callback_function() {
    echo &#39;&lt;p&gt;スライダーの詳細設定を行います&lt;/p&gt;&#39;;
}
</pre>

<h3>画面上にフィールドを作成</h3>

<p>さて、ようやくフィールドを作ります。このフィールドのところが、入力項目を作る部分になります。 add_settings_fieldを使います。4番目の引数は、先ほどdo_settings_sectionsで設定したページ名に合わせます。5番目の引数は、先ほどadd_settings_sectionで設定したセクション名に合わせます。</p>

<p>入力項目の処理は、register_settingで設定します。1番目の引数は、先ほどsettings_fieldsで設定したグループ名に合わせます。 実際の処理内容は、3番目の引数でコールバック関数を指定します。</p>

<pre>
// フィールドの追加1
function my_slider_field1() {

    add_settings_field(
        &#39;num_of_slides&#39;, // フィールド名
        &#39;枚数&#39;, // タイトル
        &#39;num_of_slides_callback_function&#39;, // コールバック関数。この関数の実行結果が出力される
        &#39;my_slider_settings&#39;, // このフィールドを表示するページ名。do_settings_sectionsで設定
        &#39;my_slider_settings_section&#39; // このフィールドを表示するセクション名。add_settings_sectionで設定
    );

    register_setting(
        &#39;my_slider_settings-group&#39;, // グループ名。settings_fieldsで設定
        &#39;my_slider_settings_num_of_slides&#39;, // オプション名
        &#39;my_slider_settings_num_of_slides_check&#39; // 入力値をサニタイズする関数
    );
}
add_action(&#39;admin_init&#39;, &#39;my_slider_field1&#39;, 15);

// フォーム項目を表示する
function num_of_slides_callback_function() {
    echo &#39;&lt;input name=&quot;my_slider_settings_num_of_slides&quot; id=&quot;my_slider_settings_num_of_slides&quot; type=&quot;text&quot; value=&quot;&#39;;
    form_option( &#39;my_slider_settings_num_of_slides&#39; );
    echo &#39;&quot; /&gt;&#39;;
}

// 入力値「スライド枚数」を検証する
// 必要に応じてエラーメッセージを出す
function my_slider_settings_num_of_slides_check( $input ) {
    $filter_option = array(
        &#39;options&#39; =&gt; array(
            &#39;min_range&#39; =&gt; 1,
        ),
    );
    if ( filter_var( $input, FILTER_VALIDATE_INT, $filter_option) ) {
        return $input;
    } else {
        add_settings_error(
            &#39;my_slider_settings&#39;,
            &#39;invalid_num&#39;,
            &#39;枚数: &#39; . intval( $filter_option[&#39;options&#39;][&#39;min_range&#39;] ) . &#39; 以上の数字を指定してください。&#39;,
            &#39;error&#39;
        );
        return intval( get_option( &#39;my_slider_settings_num_of_slides&#39; ) );
    }
}
</pre>

<p>コールバック関数my_slider_settings_num_of_slides_checkの内部で、入力が適切かどうかをチェックします。この例では、PHPの標準機能であるフィルタ機能を使って、「入力が数値である&amp;1以上である」をチェックしています。</p>

<h3>入力が条件を満たさなかった場合</h3>

<p>コールバック関数内で検証した結果、入力が条件を満たさなかった場合は、add_settings_errorでエラーメッセージを設定することができます。 こうしておくと、WPがエラーメッセージを表示してくれます。このようにWPの標準機能を使うと、画面遷移等の面倒な処理を自分で記述する必要はありません。</p>

<h3>フィールドの数だけ繰り返す</h3>

<p>複数のフィールドが有る場合は、add_settings_fieldとregister_settingを繰り返し記述してください。</p>

<p>(データベースで一つの項目として保存したい場合は、記述を変更する必要がありますが、今回はSettings APIの使い方の説明を中心にしたので、単純な方式で記述しています。)</p>

<pre>
// フィールドの追加2
function my_slider_field2() {

    add_settings_field(
        &#39;random&#39;, // フィールド名
        &#39;ランダム表示&#39;, // タイトル
        &#39;random_callback_function&#39;, // コールバック関数。この関数の実行結果が出力される
        &#39;my_slider_settings&#39;, // このフィールドを表示するページ名。do_settings_sectionsで設定
        &#39;my_slider_settings_section&#39; // このフィールドを表示するセクション名。add_settings_sectionで設定
    );

    register_setting(
        &#39;my_slider_settings-group&#39;, // グループ名。settings_fieldsで設定
        &#39;my_slider_settings_random&#39;, // オプション名
        &#39;intval&#39; // 入力値をサニタイズする関数
    );
}
add_action(&#39;admin_init&#39;, &#39;my_slider_field2&#39;, 25);

// フォーム項目を表示する
function random_callback_function() {
    echo &#39;&lt;input name=&quot;my_slider_settings_random&quot; id=&quot;my_slider_settings_random&quot; type=&quot;checkbox&quot; value=&quot;1&quot; &#39;;
    checked( 1, get_option( &#39;my_slider_settings_random&#39; ) ) ;
    echo &#39; /&gt;&#39;;
    echo &#39;ランダム表示する&#39;;
}
</pre>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8166268285967527"
     data-ad-slot="5719505122"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
</script>


<p><iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="https://www.slideshare.net/slideshow/embed_code/key/v360QGHkwY8PqL" style="border: 1px solid rgb(204, 204, 204); margin-bottom: 5px; max-width: 100%;" width="425"></iframe><strong><a href="https://www.slideshare.net/ounziw/wordpress-52120962" target="_blank" title="WordPress 管理画面を効率よく、安全に作成する方法">WordPress 管理画面を効率よく、安全に作成する方法</a> </strong>from <strong><a href="https://www.slideshare.net/ounziw" target="_blank">Fumito Mizuno</a></strong></p>
]]></description>
      
    </item>
    
    <item>
      
      <title>OSC Nagoya で AGPL ライセンスの話をしました</title>
      
      
      <link>https://rescuework.nagoya/blog/osc-nagoya-agpl/</link>
      <guid>https://rescuework.nagoya/blog/osc-nagoya-agpl/</guid>
      
      
      <pubDate>Sun, 24 May 2015 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[
<p>オープンソースカンファレンス名古屋2015が名古屋国際センターで開催されました。</p>

<p>今回は、技術的な話から少し外れて、ライセンスの話をしてきました。</p>

<h3>AGPL ライセンス</h3>

<p>オープンソースライセンスでは、MITやGPLが有名です。これらと比較すると、AGPLはマイナーなライセンスです。AGPLの特徴としては</p>

<ul>
    <li>コピーレフト(派生物は同一ライセンスが要求される)</li>
    <li>ネットワーク経由での利用について明記している</li>
</ul>

<p>といった点があります。</p>

<h3>ネットワーク経由での利用</h3>

<p>MITライセンスは、ユーザーにコード提供義務はありませんが、GPLはユーザーにコード提供義務があります。プログラム自体をダウンロードする場合は、ユーザーの範囲が明確ですね。しかし最近では、インターネットが普及し、通信速度も向上したため、ネットワーク上にあるプログラムをネットワーク経由で利用する、というケースも増えてきました。</p>

<p><strong>もし、GPLライセンスのソフトウェアをベースにネットワーク経由で利用するウェブサービスを展開する場合はどうでしょうか？</strong></p>

<p>GPLバージョン2では、ネットワーク経由での利用について、条文で言及していません。GPLバージョン2が策定されたのは1991年頃です。当時としては、ネットワーク経由での利用は通信速度などの点で非現実的だったのでしょう。このため、ネットワーク経由での利用に言及していないのだと思われます。その結果として、ネットワーク経由の場合にはGPL本来の想定(ソフトウェア利用者はソースコードを受け取れる=動作の仕組みを自分で確認できる)とは異なる使い方をされるケースもあるようです。</p>

<p>しかし、時代の流れもあり、ネットワーク経由での利用が増えているため、ライセンスでも考慮したほうが良いかもしれません。今回取り上げるAGPLライセンスでは、ネットワーク経由で利用する場合についてライセンス条項として規定があります。</p>

<p>AGPLライセンスを採用しているソフトウェアは、MongoDB, Novius OS, Mastodon等があります。</p>

<p><iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="https://www.slideshare.net/slideshow/embed_code/key/ELHYK4GWFSqJ47" style="border: 1px solid rgb(204, 204, 204); margin-bottom: 5px; max-width: 100%;" width="425"></iframe><strong><a href="https://www.slideshare.net/ounziw/osc-20150523-48364044" target="_blank" title="使ってみて気づいた AGPL ライセンスの メリット・デメリット">使ってみて気づいた AGPL ライセンスの メリット・デメリット</a> </strong>from <strong><a href="https://www.slideshare.net/ounziw" target="_blank">Fumito Mizuno</a></strong></p>

<h3>フィードバック</h3>

<p>私がかかわっているものでは、<a href="http://novius-os.org/" target="_blank">Novius OS</a>がAGPL3です。派生物と元のソフトウェアとのライセンス衝突が生じないため、コアへのフィードバックを行い易いライセンスです。実際、Novius OS開発元もフィードバックを歓迎しています。日本語対応させたとき、<a href="http://community.novius-os.org/blog-news/novius-os-chiba.html" target="_blank">Novius OS Chiba</a>と、わざわざ日本の都市名を入れて告知してくれました。今まで私がかかわったことのあるソフトウェアで、コアへのフィードバックを最も歓迎してくれているソフトウェアだと思います。</p>

<p><img alt="オープンソースとフィードバック" src="/images/agpl-17-638.jpg" class="img-fluid img-thumbnail" /></p>

<h3>ビジネスモデル構築</h3>

<p>AGPL ライセンスを使う場合は、ビジネスモデルも検討しておかなければなりません。開発元はウェブサービス利用料で稼ぐ、というビジネスがまず固いでしょう。一方、サードパーティとして参加する場合は難しいかもしれません。</p>

<p>私の場合は、「自分でサーバー管理するよりウェブサービスに乗っかるほうが楽」「AGPLなら、ウェブサービスを使うだけでなく、改善にコミットできる」という点が良いと判断しました。</p>

<h3>発表と質疑応答から</h3>

<p>参加者では、MongoDBに興味を持っていた方がいました。</p>

<p>MongoDBのライセンスは、 本体がAGPL3、ドライバがApache2、という形式です。これにより、「MongoDB自体の改変は公開する必要がある。MongoDBと通信するプログラムについては公開する必要はない。」を実現しているらしいです。ただし実際にそのような解釈になるのかどうかは、判例が出ない事には確定しないだろう、と思われます。<a href="http://www.fsf.org/" target="_blank">Free Software Foundation</a>は、もしかしたらMongoDBとは見解が異なる可能性もあります。</p>

<h3>コードシェアを選択するかどうか</h3>

<p>AGPLライセンスは、コードシェア(共有)に重点が置かれています。このため、「コードを共有する」選択をする場合は楽です。ソフトウェア本体のコードはもちろん、他の方のコードを自由に利用することができ、ライセンス同士の衝突を気にする必要もありません。</p>

<p>一方、「コードを共有しない」が関わりたい、自分のコードはオープンソースではなく制限されたライセンスにしたい、という人にはメリットが感じにくいライセンスです。このような場合は、MITなどの寛容なライセンスのほうが好ましい、と判断されるかもしれません。逆にMITライセンスのソフトウェアを使う場合は、派生物はライセンスが異なる可能性がある、という点に注意が必要ですね。</p>
]]></description>
      
    </item>
    
    <item>
      
      <title>config/concrete.php の日本語訳</title>
      
      
      <link>https://rescuework.nagoya/blog/config-concrete/</link>
      <guid>https://rescuework.nagoya/blog/config-concrete/</guid>
      
      
      <pubDate>Tue, 17 Mar 2015 08:56:52 +0900</pubDate>
      
      
      
      <description><![CDATA[<p>
    concrete5では、様々な設定を管理画面から行うことができます。このため、プログラムに詳しくない方でも、管理画面から設定を変更することができます。
</p>
<p>
    一方で、ウェブ制作者などで大量にconcrete5のサイトを作成・運営管理する場合、その都度管理画面から設定を変更するのは手間がかかります。
</p>
<p>
    そのような場合、設定ファイルconfig/concrete.phpを編集する、という方法があります。
</p>
<h3>config/concrete.phpを編集する</h3>
<p>
    config/concrete.phpは、さまざまな設定が記述されているファイルです。このファイルを書き換えて、application/config/concrete.phpに置くと、自分で設定した設定が有効になります。以下のような設定項目があります。パソコンに詳しい方の場合、管理画面から設定するよりも速く設定できるかもしれません。
</p>
<pre>
    '5.7.3.1',
    'version_installed' => '5.7.3.1',
    'version_db' => '20150109000000', // the key of the latest database migration - corresponds to 5.7.3

    /**
    * インストール状態
    *
    * @var bool
    */
    'installed'         => true,

    /**
    * サイト名
    *
    * @var string concrete.core.site
    */
    'site'              => 'concrete5',

    /**
    * ロケール
    */
    'locale'            => 'en_US',

    /**
    * 文字セット
    */
    'charset'           => 'UTF-8',

    /**
    * メンテナンスモードかどうか
    */
    'maintenance_mode'  => false,

    /**
    * ------------------------------------------------------------------------
    * デバッグ設定
    * ------------------------------------------------------------------------
    */
    'debug'             => array(
    /**
    * エラーを表示するかどうか
    *
    * @var bool
    */
    'display_errors' => true,

    /**
    * デバッグレベル
    *
    * @var string (message|debug)
    */
    'detail'         => 'message'
    ),

    /**
    * ------------------------------------------------------------------------
    * プロキシ設定
    * ------------------------------------------------------------------------
    */
    'proxy'             => array(
    'host'     => null,
    'port'     => null,
    'user'     => null,
    'password' => null
    ),

    /**
    * ------------------------------------------------------------------------
    * ファイルアップロード設定
    * ------------------------------------------------------------------------
    */
    'upload'            => array(

    /**
    * 許可されているファイル拡張子
    *
    * @var string semi-colon separated.
    */
    'extensions' => '*.flv;*.jpg;*.gif;*.jpeg;*.ico;*.docx;*.xla;*.png;*.psd;*.swf;*.doc;*.txt;*.xls;*.xlsx;' .
    '*.csv;*.pdf;*.tiff;*.rtf;*.m4a;*.mov;*.wmv;*.mpeg;*.mpg;*.wav;*.3gp;*.avi;*.m4v;*.mp4;*.mp3;*.qt;*.ppt;' .
    '*.pptx;*.kml;*.xml;*.svg;*.webm;*.ogg;*.ogv'
    ),

    /**
    * ------------------------------------------------------------------------
    * メール設定
    * ------------------------------------------------------------------------
    */
    'mail'              => array(
    'method'  => 'PHP_MAIL',
    'methods' => array(
    'smtp' => array(
    'server'     => '',
    'port'       => '',
    'username'   => '',
    'password'   => '',
    'encryption' => ''
    )
    )
    ),

    /**
    * ------------------------------------------------------------------------
    * キャッシュ設定
    * ------------------------------------------------------------------------
    */
    'cache'             => array(

    /**
    * 有効かどうか
    *
    * @var bool
    */
    'enabled'                  => true,

    /**
    * 有効期限
    *
    * @var int Seconds
    */
    'lifetime'                 => 21600,

    /**
    * オーバーライドキャッシュ
    *
    * @var bool
    */
    'overrides'                => true,

    /**
    * ブロックキャッシュ
    *
    * @var bool
    */
    'blocks'                   => true,

    /**
    * アセットのキャッシュ
    *
    * @var bool
    */
    'assets'                   => false,

    /**
    * テーマの CSS/JS のキャッシュ
    *
    * @var bool
    */
    'theme_css'                => true,

    /**
    * フルページキャッシュ
    *
    * @var bool|string (block|all)
    */
    'pages'                    => false,

    /**
    * フルページキャッシュの期限
    *
    * @var string
    */
    'full_page_lifetime'       => 'default',

    /**
    * 有効期限のカスタム設定、concrete.cache.full_page_lifetime が 'custom' の場合のみ使用される
    *
    * @var int
    */
    'full_page_lifetime_value' => null,
    'identifier'               => md5(str_replace(array('https://', 'http://'), '', BASE_URL) . DIR_REL),
    'directory'   => DIR_FILES_UPLOADED_STANDARD . '/cache',
    'page'        => array(
    'directory' => DIR_FILES_UPLOADED_STANDARD . '/cache/pages',
    'adapter'      => 'file',
    ),
    'environment' => array(
    'file' => 'environment.cache'
    ),

    'levels' => array(
    'expensive' => array(
    'drivers' => array(
    array(
    'class' => '\Stash\Driver\Ephemeral',
    'options' => array()
    ),

    array(
    'class' => '\Stash\Driver\FileSystem',
    'options' => array(
    'path' => DIR_FILES_UPLOADED_STANDARD . '/cache',
    'dirPermissions' => DIRECTORY_PERMISSIONS_MODE_COMPUTED,
    'filePermissions' => FILE_PERMISSIONS_MODE_COMPUTED
    )
    ),
    )
    ),
    'object' => array(
    'drivers' => array(
    array(
    'class' => '\Stash\Driver\Ephemeral',
    'options' => array()
    )
    )
    )
    )

    ),

    'multilingual' =>   array(
    'enabled' => false, // 必要になったとき、自動的に true に設定される
    'redirect_home_to_default_locale' => false,
    'use_browser_detected_locale' => false,
    'default_locale' => false,
    'default_source_locale' => 'en_US'
    ),

    'design'            => array(
    'enable_custom' => true,
    'enable_layouts' => true
    ),

    /**
    * ------------------------------------------------------------------------
    * ログ設定
    * ------------------------------------------------------------------------
    */
    'log'               => array(

    /**
    * メール送信ログ
    *
    * @var bool
    */
    'emails' => true,

    /**
    * エラーログ
    *
    * @var bool
    */
    'errors' => true,

    /**
    * スパムログ
    *
    * @var bool
    */
    'spam'   => false,
    'queries' => array(

    /**
    * データベースクエリを保存するかどうか
    *
    * @var bool
    */
    'log' => false,
    'clear_on_reload' => false
    )
    ),
    'jobs'              => array(

    'enable_scheduling' => true

    ),

    'filesystem'        => array(

    'permissions'   => array(
    'file' => FILE_PERMISSIONS_MODE_COMPUTED,
    'directory' => DIRECTORY_PERMISSIONS_MODE_COMPUTED
    )
    ),

    /**
    * ------------------------------------------------------------------------
    * メール設定
    * ------------------------------------------------------------------------
    */
    'email'             => array(

    /**
    * メールを有効にするかどうか
    *
    * @var bool
    */
    'enabled' => true,
    'default' => array(
    'address' => 'concrete5-noreply@' . $_SERVER['SERVER_NAME'],
    'name'    => ''
    ),
    'form_block' => array(
    'address' => false
    )
    ),

    /**
    * ------------------------------------------------------------------------
    * マーケットプレイス設定
    * ------------------------------------------------------------------------
    */
    'marketplace'       => array(
    /**
    * マーケットプレイス接続を有効にするかどうか
    *
    * @var bool
    */
    'enabled'            => true,

    /**
    * マーケットプレイストークン
    *
    * @var null|string
    */
    'token'              => null,

    /**
    * マーケットプレイスサイトURLトークン
    *
    * @var null|string
    */
    'site_token'         => null,

    /**
    * インテリジェント検索を有効にするかどうか
    */
    'intelligent_search' => true,

    /**
    * リクエストのログを有効にするかどうか
    */
    'log_requests' => false
    ),

    /**
    * ------------------------------------------------------------------------
    * concrete5.org からのお知らせやヘルプを受け取るかどうか
    * ------------------------------------------------------------------------
    */
    'external'              => array(

    /**
    * インテリジェント検索でヘルプを含めるかどうか
    *
    * @var bool concrete.external.intelligent_search_help
    */
    'intelligent_search_help' => true,

    /**
    * concrete5 からの最新情報を表示する
    *
    * @var bool concrete.external.news_overlay
    */
    'news_overlay'            => true,

    /**
    * あなたのサイトで concrete5 お知らせを有効にする
    *
    * @var bool concrete.external.news
    */
    'news'                    => true,
    ),

    /**
    * --------------------------------------------------------------------
    * その他の設定
    * --------------------------------------------------------------------
    */
    'misc'              => array(
    'user_timezones'                => false,
    'package_backup_directory'      => DIR_FILES_UPLOADED_STANDARD . '/trash',
    'enable_progressive_page_reindex'      => true,
    'mobile_theme_id'               => 0,
    'seen_introduction'             => false,
    'sitemap_approve_immediately'   => true,
    'enable_translate_locale_en_us' => false,
    'page_search_index_lifetime'    => 259200,
    'enable_trash_can'              => true,
    'app_version_display_in_header' => true
    ),

    'theme' => array(

    'compress_preprocessor_output' => true
    ),

    'updates' => array(

    'enable_auto_update_core'       => false,
    'enable_auto_update_packages'   => false,
    'enable_permissions_protection' => true
    ),
    'paths'             => array(
    'trash'  => '/!trash',
    'drafts' => '/!drafts'
    ),
    'conversations'     => array(
    'attachments_pending_file_set' => 'Conversation Messages (Pending)',
    'attachments_file_set'         => 'Conversation Messages',
    'attachments_enabled'          => true
    ),
    'icons'             => array(
    'page_template'        => array(
    'width'  => 120,
    'height' => 90
    ),
    'theme_thumbnail'      => array(
    'width'  => 120,
    'height' => 90
    ),
    'file_manager_listing' => array(
    'handle' => 'file_manager_listing',
    'width'  => 60,
    'height' => 60
    ),
    'file_manager_detail'  => array(
    'handle' => 'file_manager_detail',
    'width'  => 400
    ),
    'user_avatar'          => array(
    'width'   => 80,
    'height'  => 80,
    'default' => ASSETS_URL_IMAGES . '/avatar_none.png'
    )
    ),
    'sitemap_xml'       => array(
    'file'      => 'sitemap.xml',
    'frequency' => 'weekly',
    'priority'  => 0.5,
    'base_url'  => BASE_URL
    ),

    /**
    * ------------------------------------------------------------------------
    * アクセシビリティ
    * ------------------------------------------------------------------------
    */
    'accessibility'     => array(
    /**
    * Show titles in the concrete5 toolbars
    *
    * @var bool
    */
    'toolbar_titles'     => false,

    /**
    * Increase the font size in the concrete5 toolbars
    *
    * @var bool
    */
    'toolbar_large_font' => false
    ),

    /**
    * ------------------------------------------------------------------------
    * 国際化
    * ------------------------------------------------------------------------
    */
    'i18n'              => array(

    /**
    * 国際化を有効にするかどうか
    */
    'enabled'               => true,

    /**
    * ログイン時にユーザーが言語を選べるかどうか
    *
    * @var bool
    */
    'choose_language_login' => false

    ),
    'urls'              => array(
    'concrete5'              => 'http://www.concrete5.org',
    'concrete5_secure'       => 'https://www.concrete5.org',
    'newsflow'               => 'http://newsflow.concrete5.org',
    'background_feed'        => '//backgroundimages.concrete5.org/wallpaper',
    'background_feed_secure' => 'https://backgroundimages.concrete5.org/wallpaper',
    'background_info'        => 'http://backgroundimages.concrete5.org/get_image_data.php',
    'paths'                  => array(
    'menu_help_service' => '/tools/get_remote_help_list/',
    'theme_preview'     => '/tools/preview_theme/',
    'site_page'         => '/private/sites',
    'newsflow_slot_content'      => '/tools/slot_content/',
    'marketplace'       => array(
    'connect'           => '/marketplace/connect',
    'connect_success'   => '/marketplace/connect/-/connected',
    'connect_validate'  => '/marketplace/connect/-/validate',
    'connect_new_token' => '/marketplace/connect/-/generate_token',
    'checkout'          => '/cart/-/add/',
    'purchases'         => '/marketplace/connect/-/get_available_licenses',
    'item_information'  => '/marketplace/connect/-/get_item_information',
    'item_free_license' => '/marketplace/connect/-/enable_free_license',
    'remote_item_list'  => '/marketplace/'
    )
    )
    ),

    /**
    * ------------------------------------------------------------------------
    * ホワイトラベリング
    * ------------------------------------------------------------------------
    */
    'white_label'       => array(

    /**
    * カスタムロゴ。公開ディレクトリからの相対パス
    *
    * @var bool|string The logo path
    */
    'logo'                 => false,

    /**
    * カスタム名
    *
    * @var bool|string The name
    */
    'name'                 => false,

    /**
    * ダッシュボードの背景画像 url
    *
    * @var null|string
    */
    'dashboard_background' => null
    ),
    'session'           => array(

    'name'         => 'CONCRETE5',
    'handler'      => 'file',
    'max_lifetime' => 7200,
    'cookie'       => array(
    'path'     => '',
    'lifetime' => 7200,
    'domain'   => '',
    'secure'   => false,
    'httponly' => false
    )
    ),

    /**
    * ------------------------------------------------------------------------
    * ユーザー情報と登録の設定
    * ------------------------------------------------------------------------
    */
    'user'              => array(
    /**
    * --------------------------------------------------------------------
    * 登録の設定
    * --------------------------------------------------------------------
    */
    'registration'      => array(

    /**
    * 登録が可能かどうか
    *
    * @var bool
    */
    'enabled'            => false,

    /**
    * 登録の区分
    *
    * @var string The type (disabled|enabled|validate_email|manual_approve)
    */
    'type'               => 'disabled',

    /**
    * 登録時に Captcha を有効にするかどうか
    *
    * @var bool
    */
    'captcha'            => true,

    /**
    * ログイン時にメールアドレスを使用する(true)か、ユーザー名を使用する(false)か
    *
    * @var bool
    */
    'email_registration' => false,

    /**
    * 登録時にメールアドレスをチェックするかどうか
    *
    * @var bool
    */
    'validate_email'     => false,

    /**
    * 管理者が登録を承認するかどうか
    *
    * @var bool
    */
    'approval'           => false,

    /**
    * 登録後に通知メールを送るかどうか
    *
    * @var bool|string Email to notify
    */
    'notification'       => false
    ),

    /**
    * --------------------------------------------------------------------
    * グラバター設定
    * --------------------------------------------------------------------
    */
    'gravatar'          => array(
    'enabled'   => false,
    'max_level' => 0,
    'image_set' => 0
    ),
    'group'             => array(

    'badge' => array(

    'default_point_value' => 50
    )

    ),

    /**
    * 公開プロフィールを有効にするかどうか
    *
    * @var bool
    */
    'profiles_enabled'  => false,

    /**
    * ユーザーごとのタイムゾーンを有効にするかどうか
    *
    * @var bool
    */
    'timezones_enabled' => false,
    'username'          => array(
    'maximum'      => 64,
    'minimum'      => 3,
    'allow_spaces' => false

    ),
    'password'          => array(
    'maximum'        => 128,
    'minimum'        => 5,
    'hash_portable'  => false,
    'hash_cost_log2' => 12
    ),
    'private_messages'  => array(
    'throttle_max'          => 20,
    'throttle_max_timespan' => 15 // minutes
    )

    ),

    /**
    * ------------------------------------------------------------------------
    * スパム
    * ------------------------------------------------------------------------
    */
    'spam'              => array(
    /**
    * ホワイトリスト、グループ ID で指定する
    *
    * @var int
    */
    'whitelist_group' => 0,

    /**
    * 通知メール
    *
    * @var string
    */
    'notify_email'    => ''
    ),

    /**
    * ------------------------------------------------------------------------
    * セキュリティ
    * ------------------------------------------------------------------------
    */
    'security'          => array(
    'ban'   => array(
    'ip' => array(

    'enabled'  => true,

    /**
    * 最大試行回数
    */
    'attempts' => 5,

    /**
    * 最大試行回数失敗時の制限時間
    */
    'time'     => 300,

    /**
    * ログインを制限する時間
    */
    'length'   => 10
    )
    )
    ),

    /**
    * ------------------------------------------------------------------------
    * 権限と振る舞い
    * ------------------------------------------------------------------------
    */
    'permissions'       => array(
    /**
    * アクセス拒否の場合にログイン画面に移動するかどうか
    *
    * @var bool
    */
    'forward_to_login'              => true,

    /**
    * 権限モード
    *
    * @var string The permission model (simple|advanced)
    */
    'model'                         => 'simple',

    /**
    * コレクション ID をページ権限識別に使用するかどうか
    *
    * @var bool
    */
    'page_permission_collection_id' => true
    ),

    /**
    * ------------------------------------------------------------------------
    * SEO 設定
    * ------------------------------------------------------------------------
    */
    'seo'               => array(

    'tracking'             => array(
    /**
    * トラッキングコード
    *
    * @var string
    */
    'code'          => '',

    /**
    * トラッキングコードの位置
    *
    * @var string (top|bottom)
    */
    'code_position' => 'bottom'

    ),
    'exclude_words'        => 'a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, ' .
    'since, than, the, this, that, to, up, via, with',

    /**
    * URL リライト
    *
    * 低レベルで設定された URL_REWRITING_ALL に影響しない
    * 「全ての」アイテムをリライトするかどうかを制御する
    *
    * @var bool
    */
    'url_rewriting'        => false,
    'url_rewriting_all'        => false,
    'redirect_to_base_url' => false,
    'trailing_slash'       => false,
    'title_format'         => '%1$s :: %2$s',
    'page_path_separator'  => '-',
    'group_name_separator' => ' / ',
    'segment_max_length'   => 128,
    'paging_string'        => 'ccm_paging_p'
    ),

    /**
    * ------------------------------------------------------------------------
    * 統計設定
    * ------------------------------------------------------------------------
    */
    'statistics'        => array(
    'track_page_views' => true
    ),
    'limits'            => array(
    'sitemap_pages'           => 100,
    'delete_pages'            => 10,
    'copy_pages'              => 10,
    'page_search_index_batch' => 200,
    'job_queue_batch'         => 10
    )
    );</pre>

]]></description>
      
    </item>
    
    <item>
      
      <title>ホームページのアプリ化</title>
      
      
      <link>https://rescuework.nagoya/pwa/</link>
      <guid>https://rescuework.nagoya/pwa/</guid>
      
      
      
      
      <description><![CDATA[

<p>
    会社や個人事業主がホームページを持つのは普通になってきました。では、アプリはどうでしょうか？インターネット活用に積極的な企業はアプリに取り組んでいます。しかし、ホームページに加えてアプリを作成して管理する手間が大変で手が出せなかった、という方もいらっしゃるのではないでしょうか。そのような心配はもはや無用です。</p>


<div class="row">
    <div class="col-sm-4">
        <img src="/images/app.png" alt="ホームページのアプリ化" class="img-fluid img-thumbnail">
    </div>
    <div class="col-sm-8">

        <h3>ホームページがアプリとして配布できます。</h3>

        <p>ホームページをそのままアプリ化する技術(PWA)により、ホームページとアプリを一元的に管理できます。管理の手間を増やさず、自社の販促チャネルを増やすことができます。Google
            Play Store へ提出可能です。(2019年5月時点では、App Storeは未対応です。)</p>


        <div class="balloons">
            <div class="balloon balloon-image size80">
                <div class="icon"><img
                        src="/images/icon-man.png"
                        class="img-fluid img-thumbnail"/></div>
                <div class="balloontext">
                    ホームページとアプリを一元管理できるので便利です。
                </div>
            </div>
        </div>
    </div>
</div>

<h3>弊社でのアプリ実績</h3>

<div class="row">
    <div class="col-sm-4">

        <p>
            <img src="/images/ochobo-pwa.jpg" alt="おちょぼ稲荷アプリ" class="img-fluid img-thumbnail">
        </p>

        <p><a href="https://ochoboinari.com/"><span style="color:#2980b9;">おちょぼ稲荷故里の宮</span></a>です。</p>

    </div>
    <div class="col-sm-4">

        <p>
             <img
                    src="/images/pwa-calc.jpg" alt="自動計算サイト PWA" class="img-fluid img-thumbnail">
        </p>

        <p><a href="https://calculator.jp/"><span style="color:#2980b9;">自動計算サイト</span></a>です。フッターメニューもスマホアプリに近いデザインにしました。
        </p>

    </div>
    <div class="col-sm-4">

        <p>
            <img
                    src="/images/pwa-rw.jpg" alt="レスキューワーク株式会社ホームページ" class="img-fluid img-thumbnail">
        </p>

        <p>弊社ウェブサイトをPWAアプリ化しました。</p>

    </div>
</div>


<h3>アプリ化は1万円(＋消費税1,000円)</h3>


<p>ホームページのスマホアプリ対応を1万円(+消費税1,000円)で賜ります。</p>

<ul>
    <li>ホームページ作成にconcrete5.8.4以降をご利用しており、現在公開されている方</li>
    <li>弊社アカウントでのGoogle Play Storeにアプリ登録されたい方</li>
    <li>弊社指定の場所で面談・作業することに同意いただける方(御社に出向いて行う場合は、交通費実費をご負担願います。)</li>
</ul>


<div class="q-a-container">
    <dl class="q-a-contents">
        <dt class="q-a-block-links clearfix">
            <div class="bubble-wrapper">
                <div class="bubble question">Q: iPhone, Androidの両方に対応していますか？</div>
            </div>

        </dt>
        <dd class="q-a-block-entries clearfix">
            <div class="bubble-wrapper">
                <div class="bubble answer">A</div>
            </div>
            <p><span
                    style="color: rgb(51, 51, 51); font-family: sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">アプリストアへの登録はGoogle Play Store(Android)のみとなります。iPhoneの方は</span><strong
                    style="box-sizing: border-box; font-weight: 700; color: rgb(51, 51, 51); font-family: sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">ホームに登録</strong><span
                    style="color: rgb(51, 51, 51); font-family: sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">を実行することでアプリとしてご利用いただけます。</span>
            </p>
        </dd>
    </dl>
    <dl class="q-a-contents">
        <dt class="q-a-block-links clearfix">
            <div class="bubble-wrapper">
                <div class="bubble question">Q: アプリ化まで、どのくらいの期間がかかりますか？</div>
            </div>

        </dt>
        <dd class="q-a-block-entries clearfix">
            <div class="bubble-wrapper">
                <div class="bubble answer">A</div>
            </div>
            <p>通常は、<span
                    style="color: rgb(51, 51, 51); font-family: sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">ご依頼いただいてから5～10営業日程度です。</span>
            </p>
        </dd>
    </dl>
    <dl class="q-a-contents">
        <dt class="q-a-block-links clearfix">
            <div class="bubble-wrapper">
                <div class="bubble question">Q: ペライチやWordPressで作ったホームページは対象になりますか？</div>
            </div>

        </dt>
        <dd class="q-a-block-entries clearfix">
            <div class="bubble-wrapper">
                <div class="bubble answer">A</div>
            </div>
            <p>ペライチやWordPressで作ったホームページは、 <span
                    style="color: rgb(51, 51, 51); font-family: sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">ホームページ作成システムを concrete5 に変更した上でお申し込みください。</span>
            <br>弊社でペライチ／WordPressからconcrete5への変更も賜ります。(別途見積もりします。)</p>
        </dd>
    </dl>
</div>
]]></description>
      
    </item>
    
  </channel>
</rss>
