fc2blog / blog Goto Github PK
View Code? Open in Web Editor NEWオープンソースのブログ
License: MIT License
オープンソースのブログ
License: MIT License
現在/favicon.ico
がないことで、正常なアクセスであってもブラウザから複数回の無駄なアクセスが発生しています。
存在しないfaviconへのアクセスは(404的な挙動で)/
にリダイレクトされ、そこからさらに/{なんらかのブログ}/
にリダイレクトされています。
.htaccess
に記述してApacheで404を返す上から順によいと思います、いかがでしょうか。ご検討ください。
には多数のテンプレート用のタグ定義がありますが、基本のテンプレートでは使われているタグが少なく、タグが正常動作するのかテストできておりません。
(できるかぎり)すべてのタグを埋め込んだテンプレートがテストに必要かと思います。
「正しさ」を最初にどのように定義するのか見通しがない。(エラーが出ない、はわかるが)
現状のコードは歴史由来とおもわれる課題があると感じており、初見だと見通しが悪く、実際にUnitTestや静的解析ツールとの相性がよくありません。
require
, require_once
による手動クラスロード (require_once(Config::get('CONTROLLER_DIR') . 'user/user_controller.php');
など)これらは昨今の統一されつつあるPHPのスタイルと乖離があります。
今後も機能は増えていくとおもいますので、早めに改善をおこなうことを提案します。
現状のファイル数は以下の通りで、まだ規模としては小さいと言えますので、作業自体には長い期間はかからない見通しです。
$ find app |grep php |wc -l
83
$ find app |grep html |wc -l
114
namespaceについては、\FC2\Blog
を基底として、\FC2\Blog\Web\Controller\User\BlogsController
、\FC2\Blog\Model\BlogsModel
、などといった命名規則を想定していますが、もし社内版とのクラスと衝突がありそうであれば指摘ください。
なお、この提案では一旦速やかに完了させ、なおかつできるだけ壊さないために、以下は当座含みません。
$argsc
へprefixを差し込むなどの処理は入れる予定)cron.php
やconfig系の構造変更getFc2PagingPHP
等)のクラス化現在安全なPHP開発を行うには静的解析ツールの支援は不可欠といってよいと考えており、早めに手をつけるべきだと考えております。しかしながら、既存システムがどうしてもこの形でなければならないなどあれば、こういったリファクタは不可能などあるかもしれません、ご検討ください。
等においてmt_rand()
等が利用されているが、mt_rand等は暗号用途等に利用してはならない(ref, ref2)ため、よりよいものに代替する。
一部にtime()
とmd5()
を用いたtoken生成があり、推測が可能なためにこれをより良いものに変更する。
(そもそもtimeを用いる必要がなさそう)
TBD
READMEの以下はMITライセンスと適合しないと思われます。
*Do not remove the link to FC2 in the template.
MITライセンスより抜粋
〜without limitation the rights to use, copy, modify, 〜
以下のフッター表記のことだとかんがえておりますが、別のところを指しているとしたらご指摘ください。
テンプレートを独立させる場合は、利便性を考えるとインストール時に自動的に展開されるようにするなどの実装が必要。
しかしなんらか"Generic" なテンプレートを添付しないと「MITで成り立つBlogシステム」なのか疑問がのこる。
コメント投稿時に生成・登録されるパスワードのハッシュ値がDBのサイズを超える値を登録しようとし、サイズを超えた値が切り捨てられた登録されています。
そのためコメント編集時に入力されたパスワードをハッシュ化した値とDBに登録した値の比較・チェックに失敗しています。
0dd970a5dbdc4809a2b3897ae9dd1576bc9ac2788688c33d09799c8c636e03c1 ←コメント編集時に入力・ハッシュ化された値
0dd970a5dbdc4809a2b3897ae9dd1576bc9ac2788688c33d09 ←コメント投稿時にDBに登録・ハッシュ化された値
他のパスワード機能が正常に動作しているのは、文字コードにutf8mb4の指定がないためです。
commentsテーブル->passwordにだけutf8mb4の指定がされているため、1文字に使用する最大バイト数が異なります。
フロントのフロント詳細画面でコメントの改行箇所に
が表示され、改行表示されていません。
テンプレートファイルでコメントをHTMLエンティティに変換しているため。
<div class="sub_body"><?php if(isset($comment['body'])) echo h($comment['body']); ?></div>
※h関数はhtmlentities関数を呼び出しています。
現状、ifや正規表現を用いたルーティングを行っているが、分かりづらいので一般的なルーター(nikic/fastrouteなど)への置換を行い、宣言的にしたい。
現在のコードは(特に)管理画面においてStrutsスタイルの「クラス」「アクション」をURLから取る設計になっているが、パターンによってDenyする格好となっており、存在するすべてのRouteが把握できないことや、本当に危険なパターンがDenyできているかが怪しいです。Denyリスト方式より、Allowリスト方式のほうがセキュリティ的にも望ましいといえます。
デメリットとして、今後はクラスやアクション追加時にルート定義をなんらか追加する必要があるが、大した手間ではないかと思われる。
現在、一部のルートはクエリパラメーターmode=Class&process=Action
のような形式になっているが、/mode/action
のような一般的な形式に一部書き換える必要がある。(そうしないことは技術的に可能ではあるが、そうしないと、宣言的にならないため)
つまり、URLが変わる。ただ、基本的にそのようなものを多用しているのは管理画面なので、ブログとしてのパーマリンクを壊すことはないのではないかとおもわれる。
There is no license file, nor license notation.
But this program uses GPL library below:
https://github.com/fc2blog/blog/blob/master/app/lib/SimpleImage.php#L9
So it should be GPL.
初回インストール後に公式プラグインのDBテーブルの全レコードの更新日時(pluginsテーブル->updated_at)に「0000-00-00 00:00:00」が登録されている
※システムの機能上、影響が出ている箇所はない。
DB登録に使用する更新日時の変数名が間違っていたので、カラム指定がされていなかったため。
※MySQL5.6以降の環境ではエラーとなりインサート自体できません。
下記プルリクエストにて改修済み。
#4
ref #83 より
@uzulla
レスポンシブデザインのテンプレートも増えてきていることから、
PC・スマホの区別も不要になりつつある状況ですが、
PC・スマホのくくりだけ維持をしておき、それ以外は撤廃としていただいて問題ありません。
の修正
POST先URLが admin/entries/index
になっているため。
※リクエストパラメータに下記が含まれていますが、管理画面のルーティング処理で下記は使用されていないように見受けられます。
'mode' => 'entries',
'prosess' => 'delete'
#17 より
ブログ設定にて
テンプレートに記載されているアセットなどのリンクURLにおけるschemaは特に変更されない。
あくまでも同一ブログシステム内での内部リンクでのみ作用する。
SSL環境下でアプリが正しく動作するか未確認なため。
1.タグ一覧の各行のチェックボックスを選択
2.「選択したものを全て削除する」ボタン押下
3.タグ一覧へ遷移(記事は1件も削除されていない)
POST先URLが admin/tags/index
になっているため。
※リクエストパラメータに下記が含まれていますが、管理画面のルーティング処理で下記は使用されていないように見受けられます。
'mode' => 'tags',
'prosess' => 'delete'
blog/app/config/fc2_template.php
Line 400 in 2c92beb
より参照されている、
ファイルが空ファイル?の模様。
意味がないのであれば削除とおもいますが、なにか意味があるファイルでしょうか?
(テンプレート変換のタグは残すにせよ)
/admin/install.php
のインストール後のメッセージに「またadmin/install.phpは不要ですので削除してください」と表示されますが、お願いは多くの場合してもらえませんし、削除したほうがよければ削除するロジックをいれてもよいかと思います。
また、「インストール後に再度操作してもなにもおこらない」のはコードをよむとわかりますが、画面上は「再インストール(初期化)」ができるように見えるので、そこも多少錯誤を生むかなと思われます。
(実際には二度三度と実行しても、不活性化(チェックをして、問題がなければなにもしない)されています)
しかしながら、DB接続情報が表示されてしまうのは少々問題かと思います。
将来的に自動アップデートを入れることを考えると、配布ファイルが固定されない(減ったりする)のは不便かなと考えております。
すでに「インストール済みかどうか」を確認するロジックは存在しているので、アクセス時に「インストール済みです」と表示してしまうように挙動を変更するのはいかがでしょうか。
ご検討いただければ幸いです。
こちらにて方針を頂いた
ロックファイルを実装する
事象:「選択したものを全て削除する」ボタンが押下可能な状態にならない
原因:PHP出力値によりJavaScriptが構文エラーとなるため
事象:削除時にエラーとなる
原因2:PHP出力値によりJavaScriptで未定義の変数のエラーになるため
下記プルリクエストにて改修済み。
#4
POST先URLが admin/comments/index
になっているため。
※リクエストパラメータに下記が含まれていますが、管理画面のルーティング処理で下記は使用されていないように見受けられます。
'mode' => 'comments',
'prosess' => 'delete'
現状のコードのCookie周りの仕様について、意見があります。
いまはかなり古い設計となっており、もっとモダン(セキュア)な設定にすべきかと思われます。
DOMAIN
設定からひっぱる形で、
SESSION_DEFAULT_DOMAIN
COOKIE_DEFAULT_DOMAIN
と2つにわかれているのもちょっとよくわかっておりません。
(過去の設計がこれを必要としていたのかもしれませんが、その理由が暗黙なので、普通にコードを読むと統一すべきように見えます)
実際、コード上でも統一されておらず、一部ではドメインを指定していないコードがあります。
blog/app/config/fc2_default_template.php
Lines 38 to 39 in 5cef4f4
// SESSIONのID名
$config['SESSION_NAME'] = 'dojima';
単なる好奇心(?)なのですが、dojimaとはなんでしょう?
#58 にて「(faviconは)商標が含まれるから本レポジトリに同梱不可」ということで、気になって確認したのですが、
https://github.com/fc2blog/blog/blob/master/public/img/admin/admin_icon2_02.png
https://github.com/fc2blog/blog/blob/master/public/img/admin/admin_icon3.png
https://github.com/fc2blog/blog/blob/master/public/img/admin/sp/sp_blog_detail_bg.png
https://github.com/fc2blog/blog/blob/master/public/img/admin/sp/[email protected]
これらの画像に含まれているFC2ロゴのファイルは大丈夫でしょうか?
テストを増やしてほしいというご依頼から、現在は管理画面のテストを増やすために各種調査や検討をおこなっておりますが、いくつか課題があると感じております。
まず、現在の設計においてコントローラーは以下のように推移します。
app/src/Web/Controller/Admin/UsersController.php
において
beforeFilter()
→ シングルトンから情報をとりだして認証などを実行したり、シングルトン内のデータを加工など${ルータで解決された}method();
→ コントローラ実行、返り値はテンプレートファイル名のみ、データはシングルトンから取り出し、保存afterFilter()
→ 現在は空、将来用?layout($template)
→ 内部でextract()
をつかって、一方向なレンダリング(これは別でIssueを立てます)blog/app/src/Web/Controller/Controller.php
Lines 47 to 60 in b342886
この設計はユニットテストがしやすくありません。
(ユニットテストができないとE2Eテストにならざるをえませんが、E2Eテストは時間がかかり、なおかつ確認するのはHTML解釈から行う必要があるので、工数コストが高すぎます)
現状、Filterやmethod、レンダラそれぞれでシングルトン(≒グローバル変数)のRequestやConfigを内部で読み書きしたり、コントローラの$this->data
の読み書きする設計となっております。(テンプレートから、直でConfigをコールしたりもしている)
// 例、Admin/BlogsControllerより、引数でなく、内部でシングルトンから読み込み
public function create()
{
$request = Request::getInstance();
これは
Lines 43 to 49 in f50cad6
という所でユニットテスト作成がしづらい状態です。
テストのないPHPアプリでは問題になりませんが(正直、シングルトンは実装においては楽で、メリット大だったのだろうなと思います)、ユニットテストでは同一の実行中で多数の仮想的なリクエストを処理できることが望ましく、状態を安全にリセットできないと厳しかったり、リクエストが明示であったり、複製できたほうが便利です。
よって、テストのためには、メソッドやフィルタは状態を渡して状態を返してもらうように(グローバル変数的なものを避ける)再設計すべきかと思います。
色々なところにユニットテスト中か確認するIFをつくり、「抜き取り」「リセット」をするためのスイッチをつける(現在、取り急ぎそのようにしていますが、スマートといえない))ことになるかと思います。
ただ、そのようにすると、事情に詳しくないと「テストが書けない」「状態をどこに追加すべきか分かりづらい」ので、好ましくはないかなと思います。
テストの書きやすさを上げないかぎり、開発者が気軽にテストを書かなくなります(私もきびしい)、そこの解決は早めにできればなとおもわれます、ご検討いただければ幸いです。
ref #36 より
app/view
以下のhtmlファイル群はphpではあるが拡張子がhtmlである以下、当初の内容です。想定と要件がズレがあったためにかわりましたが、memoのために残します
「お試し」であれば可能だと思う、対応したいインフラを指定お教えください。
「プロダクション環境」については課題が多い、ご検討ください。
アプリケーションコード(=blog自体)の更新は、アプリケーションの自動アップグレードの仕組みをつくれば可能(将来的なタスク)だが、運用はアプリケーションコードに完結しない。そこはどうするのか?(無視してよいのか?)
(現実として、WordPressなどでも実現ができていない)
各種クレデンシャルのsnake oil問題(一見信用できるが全く信用できない)
ミドルウェアのバージョンアップについて(VPS、IaaSなど)
ストレージの永続性について
構築手順(作業者のスキル設定)難易度設定
バックアップ・レストア
サポートは?
どこまで実現したいか?ハードルをさげるか?の検討ができればと思います。
初期テンプレートやダウンロード可能なテンプレートに使用されているテンプレート用変数の一部が置換されず、そのまま出力されている。(100件以上)
テンプレートはFC2ブログ側でも使用し変数が追加実装されていったが、OSS版では開発がされていなかったため機能実装に差異が生じてしまったため。
OSS版対応で対応できる変数は置換・出力されるように実装し、OSS版に実装されていない機能の変数は空文字で出力されるよう改修を行う。
OSS版対応 | テンプレート用変数 | 説明 |
---|---|---|
● | <%plugin_third_ialign> | プラグインの説明(description,description2)の文字配置 |
● | <%plugin_first_ialign> | プラグインの説明(description,description2)の文字配置 |
● | <%plugin_second_ialign> | プラグインの説明(description,description2)の文字配置 |
- | <%topentry_thread_title> | スレッドタイトルを表示 |
- | <%topentry_community_janrename> | スレッドテーマのジャンル名を表示 |
- | <%tb_title> | トラックバック送信元の記事タイトルを表示 |
- | <%trackback_url> | トラックバックの宛先となるURLを表示 |
- | <%tb_url> | トラックバック送信元のURLを表示 |
- | <%tb_no> | トラックバックの通番を表示 |
- | <%tb_month> | 着信月を表示 |
- | <%tb_year> | 着信年を表示 |
- | <%tb_day> | 着信日を表示 |
- | <%tb_blog_name> | トラックバック送信元のサイト名を表示 |
- | <%tb_excerpt> | トラックバック送信元の記事要約を表示 |
- | <%tb_hour> | 着信時を表示 |
- | <%tb_minute> | 着信分を表示 |
● | <%template_charset> | 文字コードを出力する 【出力値】 英語:utf-8 日本語:utf-8 【使用例】 <meta http-equiv="Content-Type" content="text/html; charset=<%template_charset>" /> |
- | <%topentry_community_janrelink> | スレッドテーマのジャンルURL(トップページ)を表示 |
- | <%topentry_thread_link> | スレッドのURL(トップページ)を表示 |
● | <%template_return_post> | 記事本文ページへリンク用の文言を出力する 【出力値】 英語:Return to post 日本語:記事本文へもどる 【使用例】 <a href="<%url>blog-entry-<%pno>.html?<%tail_url>"><%template_return_post></a> |
● | <%template_write_cm> | コメント投稿ページリンク用の文言を出力する 【出力値】 英語:Write Comment 日本語:コメントを書く 【使用例】 <a href="<%url>?m2=form&no=<%pno><%tail_url>"><%template_write_cm></a> |
● | <%template_month> | 【出力値】 英語:/ 日本語:月 【使用例】 <%topentry_year><%template_year><%topentry_month><%template_month><%topentry_day><%template_date> |
● | <%template_year> | 【出力値】 英語:/ 日本語:年 【使用例】 <%topentry_year><%template_year><%topentry_month><%template_month><%topentry_day><%template_date> |
● | <%template_date> | 【出力値】 英語:[空文字] 日本語:日 【使用例】 <%topentry_year><%template_year><%topentry_month><%template_month><%topentry_day><%template_date> |
● | <%template_language> | コンテンツ言語を出力する 【出力値】 英語:en 日本語:ja 【使用例】 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%template_language>" lang="<%template_language>"> |
- | <%spass> | 携帯ページのプライベートモードの際に必要なInput内の要素 |
● | <%template_privacy_set> | 公開設定ラベル用の文字列を出力する 【出力値】 英語:Privacy Settings 日本語:公開設定 【使用例】 <dt><%template_privacy_set></dt> <dd> <select name="comment[himitu]"> <option value ="0"><%template_privacy_public></option> <option value ="1"><%template_privacy_secret></option> </select> </dd> |
● | <%template_privacy_secret> | 公開設定の選択用の文字列を出力する 【出力値】 英語:Secret comment to blog author 日本語:管理人への秘密コメント 【使用例】 <select name="comment[himitu]"> <option value ="0"><%template_privacy_public></option> <option value ="1"><%template_privacy_secret></option> </select> |
● | <%template_privacy_public> | 公開設定の選択用の文字列を出力する 【出力値】 英語:Public Comment 日本語:公開コメント 【使用例】 <select name="comment[himitu]"> <option value ="0"><%template_privacy_public></option> <option value ="1"><%template_privacy_secret></option> </select> |
● | <%template_cm_body> | コメント本文投稿用ラベルの文字列を出力する 【出力値】 英語:Comment Body 日本語:コメント本文 【使用例】 <dt><%template_cm_body>(<%template_required>)</dt> <dd><textarea name="comment[body]"></textarea></dd> |
● | <%template_required> | コメント本文投稿用の必須ラベルの文字列を出力する 【出力値】 英語:Required 日本語:必須 【使用例】 <dt><%template_cm_body>(<%template_required>)</dt> <dd><textarea name="comment[body]"></textarea></dd> |
● | <%topentry_description> | 本文の要約(200文字)を表示 【使用例】 <div class="entryDesc"><%topentry_description></div> 【出力例】 本日のブログです。… 【補足】 ・半角400文字、全角200文字までを表示 ・制限文字数以下でも末尾に必ず「...」を付与 |
- | <%image> | プロフィール画像のURLを表示 |
● | <%template_next> | ページャー用の文字列を出力する 【出力値】 英語:Next 日本語:次へ 【使用例】 <a href="<%res_nextpage_url><%tail_url>" class="nextpage"><%template_next></a> |
● | <%template_prev> | ページャー用の文字列を出力する 【出力値】 英語:Prev 日本語:前へ 【使用例】 <a href="<%res_prevpage_url><%tail_url>" class="prevpage"><%template_prev></a> |
- | <%tb_wayoubi> | 着信曜日(書式:月/火/水...)を表示 |
- | <%tb_second> | 着信秒を表示 |
● | <%blog_id> | ブログIDを表示 |
- | <%introduction2> | 管理画面で設定されたプロフィールの内容を表示 |
● | <%server_url> | 所属しているサーバーURLを表示 【出力例】 https://admin.blog.fc2.com/ 【使用例】 <a href="<%server_url><%blog_id>/admin.php"><%template_login></a> |
● | <%template_tell_friend> | 投稿記事を友達に教える用の文字列を出力する 【出力値】 英語:Tell a friend 日本語:友達に教える 【使用例】 <a href="mailto:@?subject=FC2%E3%83%96%E3%83%AD%E3%82%B0&body=<%url>"><%template_tell_friend></a> |
● | <%template_login> | ログイン画面リンク用の文字列を出力する 【出力値】 英語:Login 日本語:ログイン 【使用例】 <a href="<%server_url><%blog_id>/admin.php"><%template_login></a> |
● | <%template_show_pc> | PCページを表示用の文字列を出力する 【出力値】 英語:PC Version 日本語:PCページを表示 【使用例】 <a href="<%url>?pc" title="<%template_show_pc>">PC</a> |
● | <%template_update> | 更新用の文字列を出力する 【出力値】 英語:Update 日本語:更新する 【使用例】 <input type="submit" value="<%template_update>"> |
● | <%template_sp_delete> | 削除用の文字列を出力する 【出力値】 英語:Delete 日本語:削除する 【使用例】 <input type="submit" name="edit[delete]" value="<%template_sp_delete>"> |
● | <%template_tb_list> | トラックバック一覧画面タイトル用の文字列を出力する 【出力値】 英語:Trackbacks 日本語:トラックバック一覧 【使用例】 <h2><%template_tb_list></h2> |
● | <%template_edit_cm> | コメント編集画面タイトル用の文字列を出力する 【出力値】 英語:Edit comment 日本語:コメントを編集する 【使用例】 <h2><%template_edit_cm></h2> |
● | <%topentry_image_url_760x420> | 記事内画像のサムネイル画像URLを表示(760x420) 【出力例】 https://blogthumbnail.fc2.com/760x420/134/c/3/7/c37fbh2i7891/wallpaper529.jpg 【使用例】 ` ??????????? ????????? 【備考】 リサイズは横幅を基準にし、縦位置の**を切り抜く |
● | <%template_page_top> | ページトップリンク用の文字列を出力する 【出力値】 英語:Top of Page 日本語:ページトップ 【使用例】 <a href="#header"><%template_page_top></a> |
● | <%template_sp_post> | コメント投稿用の文字列を出力する 【出力値】 英語:Post 日本語:投稿する 【使用例】 <a href="#" onclick="submit()"><%template_sp_post></a> |
● | <%template_cm_list> | コメント一覧画面タイトル用の文字列を出力する 【出力値】 英語:Read comments 日本語:コメント一覧 【使用例】 <h2><%template_cm_list></h2> |
- | <%tb_youbi> | 着信曜日(書式:Mon/Tue/Wed...)を表示 |
● | <%template_tb_close> | トラックバックを受け付けない設定時の文言を出力する 【出力値】 英語:Trackback closed 日本語:トラックバッククローズ中 【使用例】 <!--deny_tb--> <li> <span><%template_tb_close></span> </li> <!--/deny_tb--> |
● | <%template_show_pic> | 投稿画像用の文字列を出力する 【出力値】 英語:Photos 日本語:写真あり 【使用例】 <!--body_img--> <a href="<%topentry_link>&photo=true<%tail_url>"><img src="https://templates.blog.fc2.com/template/sphone/basic_darkblue/img.gif" alt="<%template_show_pic>" width="18" height="14" /></a> <!--/body_img--> |
● | <%template_cm_close> | コメントを受け付けない設定時の文言を出力する 【出力値】 英語:Comments closed 日本語:コメントクローズ中 【使用例】 <!--deny_comment--> <li> <span><%template_cm_close></span> </li> <!--/deny_comment--> |
- | <%link_name> | サイト名を表示 ※設定>リンクの編集から追加したリンクURL |
● | <%template_css_text> | テンプレートに設定されているCSSを出力する 【出力例】 html{-webkit-box-sizing:border-box;box-sizing:border-box;overflow-y:scroll;-webkit-text-size-adjust:100%;}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit;} 【使用例】 <style><%template_css_text></style> |
- | <%sw_register> | JavaScriptを出力する 【出力例】 !function(){if('serviceWorker' in navigator){navigator.serviceWorker.register('/service-worker.js').then(function(registration){console.log('sw registration successful');}).catch(function(err) {console.log('sw registration failed: ', err);navigator.serviceWorker.getRegistrations().then(function(registrations){for(let registration of registrations){registration.unregister();}});caches.keys().then(function(keyList){return Promise.all(keyList.map(function(key){return caches.delete(key);}))});});};if(!document.querySelector('#fc2blog-ic')){const instantclick=document.createElement('script');instantclick.id='fc2blog-ic';instantclick.onload=function(){InstantClick.init();};instantclick.src='https://static.fc2.com/js/blog/view/instantclick_fc2blog.min.js';document.querySelector('body').appendChild(instantclick);}}(); 【使用例】 <script data-no-instant><%sw_register></script> |
- | <%plugin_second_tag> | プラグインの識別タグを表示(カテゴリーでは"category"、フリーエリアでは"freearea" などが出力される) |
- | <%plugin_third_tag> | プラグインの識別タグを表示(カテゴリーでは"category"、フリーエリアでは"freearea" などが出力される) |
● | <%template_pc_view> | PC表示切替用文字列を出力する 【出力値】 英語:PC View 日本語:PCビュー 【使用例】 <a href="<%url>?pc" title="<%template_show_pc>"><span><%template_pc_view></span></a> |
● | <%rapid_templates_autopager> | 【出力値】!function(){if('undefined'!== typeof window.Autopager){return;}window.Autopager = {};window.Autopager.onPageChangeLister = null;const SCROLL_MARGIN = 1080;const DELAY_TIME = 30;const STATE = {WAIT: 0,RUNNING: 1,COMPLETE: 2};let timerId = null;let handlerId = null;let state = STATE.WAIT;let precache = null;const getUserTagQuery=()=>{const query=location.search.replace('?','');if(!query){return '';};const queries=query.split('&');let userTag='';queries.forEach(q=>{const matched=q.match(/^tag=.+$/);if(matched){userTag=q;}});return userTag;};const getSearchQuery=()=>{const query=location.search.replace('?','');if(!query){return '';};const queries=query.split('&');let searchQuery='';queries.forEach(q=>{const matched=q.match(/^q=.+$/);if(matched){searchQuery=q;}});return searchQuery;};const getSelector=()=>{return getSearchQuery()?'.search_list':'.entryList';};const scrollingElement = document.scrollingElement ? document.scrollingElement : document.documentElement;const initialize=()=>{fetchPage(1).then(()=>{autopager();}).catch(error=>{});};const onChangePage=()=>{state = STATE.WAIT;nextPage = 0;precache = null;if (window.Autopager.onPageChangeLister) {window.Autopager.onPageChangeLister();}};const autopager=()=>{if (!/^\/(?:blog-(category|date)-[0-9]+?\.html|[ec]\/.+)?$/.test(location.pathname)) {return false;};clearTimeout(timerId);timerId=setTimeout(()=>{if (!isExceededScrollBottom()) {return;};let nextPage = 0;try{nextPage = findLastIndexKey()+1;if(precache && getPrecacheLastIndexKey() === nextPage){showPrecache();nextPage = findLastIndexKey()+1;}}catch(ex) {return Promise.reject('there is no more');};fetchPage(nextPage).catch(error=>{});}, DELAY_TIME);};const findLastIndexKey=()=>{let pageKey = 0;if (!document.querySelector(getSelector())) {throw Exception(getSelector()+' is not found');};document.querySelector(getSelector()).childNodes.forEach(node=>{if(undefined!==node.dataset){if(undefined!==node.dataset.pageKey){pageKey=parseInt(node.dataset.pageKey);}}});return pageKey;};const fetchPage=async (num)=>{if (state!==STATE.WAIT) {return Promise.reject('autopager is running');};state=STATE.RUNNING;let params=[];if (getSearchQuery()) {params.push(getSearchQuery());} else if (getUserTagQuery()) {params.push(getUserTagQuery());}params.push('page='+num);params.push('more');try {const response = await fetch(location.pathname + '?' + params.join('&')).then(response=>{if (!response.ok) {return Promise.reject('status: ' + response.status + ', msg: ' + response.statusText);};return response;}).catch(error=>{state = STATE.COMPLETE;return Promise.reject(error);});const text = await response.text();if (!text) {state = STATE.COMPLETE;return Promise.reject('there is no content');}let div = document.createElement('div');let flagment = document.createDocumentFragment();div.innerHTML = text;div.childNodes.forEach((node, i) => {if (node.nodeType === Node.ELEMENT_NODE) {node = checkNewMark(node);flagment.appendChild(node);}});div = null;if (flagment.firstChild) {flagment.firstChild.dataset.pageKey = num;};precache = flagment;state = STATE.WAIT;return Promise.resolve();} catch (error) {state = STATE.COMPLETE;}};const checkNewMark=(node)=>{const elements = node.querySelectorAll("span[data-fc2-newmark]");if(elements){const date = new Date();Array.prototype.forEach.call(elements, function(element){Math.abs(date-element.getAttribute("data-time-post-entry")*1e3)/36e5<24?element.innerHTML=element.getAttribute("data-fc2-newmark"):element.parentNode.removeChild(element);});};return node;};const showPrecache=()=>{if(!precache){return false;}document.querySelector(getSelector()).appendChild(precache);precache=null;};const getPrecacheLastIndexKey=()=>{if(!precache){return 0;}return parseInt(precache.firstChild.dataset.pageKey, 10);};const isExceededScrollBottom=()=>{return (scrollingElement.querySelector(getSelector()).scrollHeight-document.documentElement.querySelector(getSelector()).clientHeight-scrollingElement.scrollTop<=SCROLL_MARGIN);};const Handler=(()=>{var i=1,listeners={};return {addListener: function(element,event,handler,capture=false){element.addEventListener(event, handler, capture);listeners[i]={element, event, handler, capture};return i++;},removeListener:id=>{if(id in listeners) {var h=listeners[id];h.element.removeEventListener(h.event, h.handler, h.capture);delete listeners[id];}}};})();window.Autopager.pageChangeLister=(callback)=>{if ("function" !== typeof callback) {return false;}window.Autopager.onPageChangeLister = callback;};if(handlerId){Handler.removeListener(handlerId);};handlerId=Handler.addListener(window, "scroll", autopager);Handler.addListener(window, "popstate", ()=>{if (state===STATE.COMPLETE) {state=STATE.WAIT;}});let timer=setInterval(()=>{if('object'!==typeof InstantClick){return;};clearInterval(timer);InstantClick.on('change', onChangePage);},200);initialize();}(); 【使用例】 <script><%rapid_templates_autopager></script> |
● | <%template_category_word> | 【出力値】 英語:Category 日本語:カテゴリ 【使用例】 <li class="posted"><%template_category_word>:<%topentry_category></li> |
- | <%link_url> | URLを表示 ※設定>リンクの編集から追加したリンクURL |
- | <%rtrackback_etitle> | 親記事のタイトルを表示 |
● | <%template_write_cm_2lines> | 【出力値】 英語:Write a Comment 日本語:コメント を書く 【使用例】 <a href="<%topentry_link>&m2=form<%tail_url>"><span><%template_write_cm_2lines></span></a> |
- | <%rtrackback_link> | 親記事の固定リンクURLを表示 |
- | <%rtrackback_no> | トラックバックの通番を表示 |
- | <%rtrackback_blog_name> | 発信元のサイト名を表示 |
- | <%rtrackback_month> | 投稿月を表示 |
- | <%rtrackback_day> | 投稿日を表示 |
● | <%template_last_page> | 【出力値】 英語:Last Page 日本語:最後のページ 【使用例】 <a href="<%lastpage_url>"><span><%template_last_page></span></a> |
● | <%template_pgof_1> | 【出力値】 英語:pg / 日本語:ページ/全 【使用例】 <%current_page_num><%template_pgof_1><%total_pages><%template_pgof_2> |
● | <%template_pgof_2> | 【出力値】 英語:pgs 日本語:ページ中 【使用例】 <%current_page_num><%template_pgof_1><%total_pages><%template_pgof_2> |
- | <%plugin_first_tag> | プラグインの識別タグを表示(カテゴリーでは"category"、フリーエリアでは"freearea" などが出力される) |
● | <%template_first_page> | 【出力値】 英語:First Page 日本語:最初のページ 【使用例】 <a href="<%firstpage_url>"><span><%template_first_page></span></a> |
● | <%template_cm_post> | 【出力値】 英語:Post a Comment 日本語:コメントを投稿する 【使用例】 <a href="#" onclick="submit()"><%template_cm_post></a> |
● | <%template_newest_entries> | 【出力値】 英語:Newest Entry 日本語:最新記事 【使用例】 <h2><%template_newest_entries></h2> |
- | <%url_album_index> | アルバム一覧へのリンク表示 |
● | <%ctag_name> | ユーザータグ名を表示 【使用例】 <!--ctag--><a href="<%ctag_url>" class="userTag"><%ctag_name></a> <!--/ctag--> |
● | <%ctag_url> | ブログ内のユーザータグ検索URLを表示 【出力例】 https://abc.fc2.net/?tag=SONY 【使用例】 <!--ctag--><a href="<%ctag_url>" class="userTag"><%ctag_name></a> <!--/ctag--> |
● | <%template_cm_list_of> | 【出力値】 英語:'s Comment List 日本語:のコメント一覧 【使用例】 <h1>「<%sub_title>」<%template_cm_list_of></h1> |
● | <%template_write_cm_to> | 【出力値】 英語:-> Write a Comment 日本語:にコメントを書く 【使用例】 <h1>「<%sub_title>」<%template_write_cm_to></h1> |
● | <%template_album> | 【出力値】 英語:Album 日本語:アルバム 【使用例】 <a href="<%url_album_index>"><span><%template_album></span></a> |
● | <%template_posted> | 【出力値】 英語:Post 日本語:投稿 【使用例】 <%template_posted>:<%topentry_year>/<%topentry_month>/<%topentry_day><span class="space01"><%topentry_hour>:<%topentry_minute></span> |
● | <%template_load_more> | 【出力値】 英語:Load more... 日本語:さらに記事を読み込む... 【使用例】 <div id="loadMoreBtn"><span></span><%template_load_more></div> |
● | <%template_view_cm> | 【出力値】 英語:View Comments 日本語:コメントを見る 【使用例】 <a href="<%topentry_link>&m2=res<%tail_url>" class="button darkblue"><%template_view_cm></a> |
● | <%template_newest_comments> | 【出力値】 英語:Newest Comment 日本語:最新コメント 【使用例】 <h2><%template_newest_comments></h2> |
● | <%template_san> | 【出力値】 英語:[空文字] 日本語:さん 【使用例】 <%comment_mail+name><span class="space02"><%template_san></span> |
● | <%template_month_archive> | 【出力値】 英語:Monthly Archive 日本語:月別アーカイブ 【使用例】 <h2><%template_month_archive></h2> |
- | <%topentry_relate_url> | 記事URLを表示 |
- | <%rtrackback_year> | 投稿年を表示 |
- | <%rtrackback_title> | 発信元の記事タイトルを表示 |
- | <%rtrackback_keyno> | 親記事(トラックバックが付いた記事)の通番を表示 |
- | <%topentry_relate_thumbnail> | 記事内の画像のサムネイルのURLを表示 |
- | <%topentry_original_category_link> | カテゴリーのパーマリンクのみを表示パーマリンクの設定に関わらず/blog-category-xxx.html (標準) になります |
● | <%topentry_image_url> | 記事内の画像のURLを表示 |
● | <%template_noplugin> | 【出力値】 英語:By adding plug-ins you can add more features and functions. 日本語:プラグインを設定する事で機能を追加出来ます 【使用例】 <!--not_plugin--> <p><%template_noplugin></p> <div class="ads"> <%ad><%ad2> </div> <!--/not_plugin--> |
● | <%template_goto_preventry> | 【出力値】 英語:Prev Entry 日本語:前の記事へ 【使用例】 <!--preventry--><a href="<%preventry_url><%tail_url>">< <%template_goto_preventry></a><!--/preventry--> |
● | <%template_goto_nextentry> | 【出力値】 英語:Next Entry 日本語:次の記事へ 【使用例】 <!--nextentry--><a href="<%nextentry_url><%tail_url>"><%template_goto_nextentry> ></a><!--/nextentry--> |
- | <%topentry_relate_title> | 記事タイトルを表示 |
- | <%preventry_home> | <%template_home>の間違い。 テンプレート本体を修正していただける予定。 |
● | <%nemxtentry_title> | 誤字 誤: <%nemxtentry_title> 正: <%nextentry_title> ※テンプレート側を修正してくださる予定 |
● | <%total_num> | 「公開」状態の記事の数 【使用例】 <div id="entry_num_box"> ????????? <span id="entry_num"></span>件/全<%total_num>件中 ??????? </div> |
● | <%template_secret> | 【出力値】 英語:Private comment 日本語:非公開コメント 【使用例】 <label for="himitu"><%template_secret>:</label><br> <input id="himitu" type="checkbox" name="edit[himitu]"><%template_private_check><br> |
● | <%spplugin_first_tcolor> | プラグインのタイトルの色を表示 |
● | <%spplugin_first_talign> | プラグインのタイトルの文字配置を表示(left,center,rightのいずれか) |
ブログ詳細画面にてパスワード保護のブログに正しいパスワードを入力しても同じ画面が再描画され閲覧できません。
トップページからパスワードを入力した場合は閲覧可能でした。
$requestのキー'process'の値が'password'になっていなければいけませんが、下記で'view'に切り替えているためパスワードの認証処理(app/controller/user/entries_controller.php->password
)に入っていません。
app/config/routing_user.php:27行目
26:if (strpos($query, 'no=')===0) {
27: $request->set($argsa, 'view');
28: $request->set('id', $request->get('no'));
29:}
※トップページで正常にパスワード認証されるのはURLパラメータに'no='が含まれていないので、上記処理に入らないため。
#78 (comment)
に記載したが、
現在のテンプレート用のタグ(のPHPコード)は、その内で子孫タグが用いるデータを生成しており、変数スコープがフラットである前提の設計になっている。
そのために、現在想定される手法ではヘルパー関数などへの切り出しが困難(extract,compactを多用すれば解決できるが、良い解決策に見えない)なので、いったんテスト制作でヘルパータグの品質担保までとする。
現在、タグを置換するために大量にタグとPHP生コードを置換するコードがfc2_template.php
にあります。
blog/app/config/fc2_template.php
Line 32 in 127cfdf
上記のような「ロジック」を置換するPHPコードをベタ書きするのは見通しが悪く、あまり安全にみえません。
可能ならば、そういったロジックをリストアップし、Wrapするヘルパー関数化して見通しをよくすることを提案いたします。
(現代のPHPは十分に高速なので、関数コールのコストを考える必要はないかと思われます)
\Fc2blog\Model\Model::load(\'BlogPlugins\')->findByDeviceTypeAndCategory($this->getDeviceType(), \Fc2blog\Config::get(\'BLOG_PLUGIN.CATEGORY.FIRST\'), $blog_id);
こういったコード片を
\Fc2blog\Template\Helper::getSpPluginFirst($this);
などとするということです。(究極、タグ一つにつき、1メソッドにしたほうがよいのですが、ifやforがあるので、全部は難しそうですね)
メリットとして、このPHPを生成する「文字列」が、できるだけPHPコードとして解釈できるようになり、コードの健全性をたもったり、このような圧縮した書き方をしなければならない場所で省略されがちな入力値チェックを余裕をもっていれる事が可能になります。リファクタも容易になるでしょう。
#51 マージ後に作業予定
httpd設定ミス時のコードや設定ファイルの漏洩対策として
TBD
CronでEntriesController::updateOpenStatus
などが実行されることを期待されているとおもいますが、このあたり想定する設定のドキュメントはございますでしょうか?
コードを読んで類推はできておりますが、Crontabにどのように設定されるのかよろしければお教えいただけますと幸いです。
ダウンロードしたテンプレート、またはテンプレートプレビュー時、タグが置換されておらずタグがそのまま表示されています。
<%topentry_description>
<%recent_image_w300>
深く調査はしておりませんが、該当タグの置換処理がされていないように見受けられます。
現状、以下のようなデバイスが設計(設定)としては考慮されておりますが、
Lines 8 to 12 in 2c92beb
実際の設定や処理をみると、以下のようなコードで対応機種をしぼりこんでいるようです。
Lines 59 to 62 in 2c92beb
(((
なお、テンプレートの更新系コードを調査している時にきづきました、以下のあたりで、デバイス未指定時の挙動でガラケーとタブレットがでてこないことから追いかけて気づきました
blog/app/src/Model/BlogTemplatesModel.php
Lines 152 to 169 in 2c92beb
実際のところ、テンプレート編集画面でもPC,SPしかありませんし、フィーチャーフォン(携帯・ガラケー)とタブレットは明示的に切り捨てたものということでよいでしょうか?また、これらの復活の予定はありますでしょうか?
現状、テンプレート保存などでも意味なくガラケーとタブレットのテンプレートを生成したりしており、不要ならば削除したいと考えております。
(現代においては、タブレットはPC用のテンプレートでよいでしょうし、ガラケーはもはやという気がいたします)
現在毎回fc2_default_template.php
修正後に管理画面からコピペして更新していますが、自動テスト時に失敗することがあります。
解決のために、\Fc2blog\Web\Controller\Admin\BlogTemplatesController::apply
相当の処理をCliで受け付けるコマンドを作れればと考えています。
当座は開発・テスト用ですが、将来的にはテンプレートバージョンアップで同様の機能が必要になるかと考えています。
おおまかにいえば、以下のような事がしたいと考えています。(もうすこしオプションは増減すると考えています)
$ update-template -blogid my_blog_id -templateid 1 -target pc -type template -input ./fc2_default_template.php
$ update-template -blogid my_blog_id -templateid 1 -target sp -type css -input ./fc2_default_css_sp.php
(作業時間 3h
作業ブランチ: https://github.com/uzulla/fc2blog/tree/convert-to-twig
View/admin
以下のテンプレートをコンバート(約100個)
テストを増やしてほしいというご依頼から、様々な検討をしている一環です。
以下は「管理画面」についてのことであって、動的なコードを生成する必要があり、自由度をさげたくないユーザー側の画面については検討するものではありません。
現在、Web\Controller\Controller::layout
、Web\Controller\Controller::display
のHTML生成は、コントローラーに設定された$this->data
をextractして現在のスコープのローカル変数化した後、テンプレートファイルをinclude
して評価する形で実現されています。
これはPHPファイルをそのままテンプレートとして活用する典型的なテクニックですので、これはこれでとおもわれますが、現在テンプレート内で直接Configなどをコールしている箇所があり、複数のデータソースからテンプレートがレンダリングされているのはテストの視点からは少々問題です。
Config::get
など、必要なものがあるなら必要なものを$this->data
に事前登録すべきと思われます。それによって、テストはHTMLをパースせずに生のデータ($this->data
)で簡単に、正しくロジックを検証することが出来ます。
最悪でも、Config
のインスタンスを$this(controller)->data
に入れておくべきで、直接Config::get(〜)
といった記述はテンプレートから外すべきかなと思います。
(このために訪問者向けのレンダラメソッドと管理画面のレンダラメソッドは別になります)
extract()
してPHPをレンダリングする場合、テンプレートファイルから見て、呼び出されてみるまでは変数が存在するか自明ではありません。これは品質を上げるためのコードの静的解析においてはかなり厳しい条件となります。(ダミーのアノテーションを大量に書くなどのテクニックもありますが)
特に動的なPHPテンプレートが生成できる必要がない管理画面においては、PHPを直接テンプレートとせず、Twigなど安全でシンプルなテンプレートエンジンへの置き換えは検討できませんでしょうか?
テスト性も向上しますし、PHPをテンプレートエンジンとして使うのはどうやっても危険です。
(h()
などを適切にいれればよいですが、ヒューマンエラーは最初からとり除くべきです)
かさねてですが、これはテンプレートを自由にいじったりしない、静的である管理画面の話であって、ユーザー側画面の話ではありません(コメント投稿画面は、そうしてもよいとも思いますが)
TBD
\Exception
なので、\PDOException
などにしたい気はする(ただ、デュアルサポートがきびしくなる)result
などに\Fc2blog\Model\DBInterface::RESULT_ONE
, \Fc2blog\Model\DBInterface::RESULT_LIST
さまざまな返り値の形がオプション指定ができるため、帰ってくる値の型が深い所の評価まで確定しないので、静的解析がききづらく、エラー処理を書いていて「なにがエラーでなにが正しいのか」がわかりづらい。@return
が mixed|int|false|array
などになってしまう
int|false
などになるので、将来的なPHP(静的解析)には厳しいのではないか。<%comment_reply_body>
を含まないテンプレートを追加/更新テンプレート作成/更新時にコメントの表示タイプが更新されており、HTMLに<%comment_reply_body>
を含まない場合は1
が登録されます。
コメントの表示タイプが1
の場合、選択されているテンプレートに関係なく本不具合の内容でHTMLが出力されます。
blog_settingsテーブル->template_pc_reply_type
app/model/comments_model.php
->updateReplyType
blog/app/view/user/layouts/default.html
Line 10 in 13393f9
現状基本的にBlogsModelなどから取得する「インスタンス」はfetchした行なので、記述されているデータが自明でないことが多く、見通しがよく有りません。
例として、以下は「ランダムに1件ブログを取得する」メソッドですが、この返り値はblogs
テーブルの1行配列ですが、コードからどのようなカラムがあるのかは類推できません。
blog/app/src/Model/BlogsModel.php
Lines 215 to 224 in 22e993c
一般的に、カラムに対応するプロパティをクラスとして書き換えることで見通しがよくなります。
ただ、既存コードが配列に強く依存しているため、全体の書き換えはかなりの工数がかかります。
ArrayInterface、およびIteratableを実装した配列としてアクセス可能なクラスを実装し、各種返り値を可能なタイミングでそれに差し替え、順次型をつけて見通しがよくするステップをふむことで、コードを長期間フリーズせずに順次移行ができるかなと考えております。
移行中はArrayとRowクラス混在してしまうのは難点ですが、とりあえずその場合でもArrayとしてあつかって書いておいてもらえれば動くには動くのと、現状のテーブル数は13なので作るだけ作るのは可能と考えております。
とりあえずビジネスロジックはかえず、要所にアノテーションを追記する形で静的解析をきかせてバグを減らし、開発の省力化ができます。
なお、典型的にはModel
という命名が多いですが、これはすでにつかわれているので、Model\Row\BlogRow
などの命名になる想定です。
現状、暗黙になっている以下のようなコードが
blog/app/src/Model/BlogsModel.php
Lines 354 to 363 in 2c92beb
public function switchTemplate(BlogRow $blog_template, string $blog_id)
{
$device_type = $blog_template->device_type; // device_typeはBlogRow内でintと型定義
などと型付けができるようになることを想定しています。
たとえば、以下のようなものは当座そのまま配列にしておく予定です。(データ量が大きくなるかもしれないですし、しぼりこんでいるものを広げると、なにか悪影響があるかもしれませんので)
blog/app/src/Model/BlogsModel.php
Lines 182 to 193 in 2c92beb
自動的にアップデートする仕組みを実装する
composer update
する未調査
#53 より
admin/installer.phpを利用後「削除してください」というのはいかにも面倒なので、インストールがおわったら自動的にうごかなくする機能があれば便利だと思われる。
(ID/PASSを忘れた時のレスキュー用途かとおもっていたが、特にそういうことはないようなので)
installer.phpを削除してしまう(必要なら、再度アップロードさせる)
「インストール済み」を示すような…
app以下になにかロックファイルを作る(削除すれば、また動く)
ご回答いただいたのでロックファイルの実装をする。
fc2blogのオープンソースのPHP7化対応を行った際の調査、対応、テストなどをまとめます。
現在PHPはバージョン5.2.17 or higher、MySQLはバージョン5.1 or higherで担保されていますが、PHP7.4.x(2020年7月時点の最新バージョン)以上で動くよう対応しました。
また、その対応による動作検証も合わせて行っております。
https://github.com/fc2blog/blog
php5.2.x->7.x.xの互換性調査として 『PHP 7 Compatibility Checker 1.2.1』を用いてコード全体のチェックを行いました。
<スクリプト実行結果>
XXX-MacBook-Pro:task {name}$ php7cc.phar blog/
File: /Users/{name}/Desktop/task/blog/public/js/elrte/src/post.php
> Line 2: [Error] Removed function "set_magic_quotes_runtime" called
set_magic_quotes_runtime(0);
Checked 75 files in 0.971 second
上記の通り、set_magic_quotes_runtime
メソッドのみ引っかかりました。
スクリプト実行では対応不可である最新バージョンの確認や、また万が一の対応漏れがないようにするため、手動でもphp5.2.x->php7.4.xまでの変更点全てを調査しました。
fc2blogコード手動調査.pdf
※弊社のコンフルにまとめてあるものをPDFとしてexportしたため、多少の表示崩れがありますことご留意ください。
下記3点の修正が必要ということが判明
既にmasterブランチにマージ済みであるため、forkした弊社のリポジトリにおけるプルリクエストに加え、diffをテキスト形式でも添付させていただきます。
samoslink001#1
gitdiff.txt
対象ページのテストは全て通過しました。
何箇所か結果が x となっている箇所がありますが、こちらがお伝え済みの既存バグが原因のものです。
fc2blog_php7_結合テスト.xlsx
configディレクトリには用途が異なるファイルが多くあり、分類や分離、統合をしたほうが良いのではないかと考えています。
## Config系ファイル
→ 引き続きConfigでよいかと思う。ただ、app.php、dir.php、 env.phpは集約してよいのではないか?別にしている意義が読み取りづらい
app.php
dir.php
env.php
## なかばロジックとなっているConfig
→ 環境の分岐のためにある。当座はconfigでよいかと思うが、コード化すべきと思う
admin.php
cron.php
test.php
user.php
## コードとなっていないのが不思議なConfig
→ 参照箇所が少ないので見通しを良くするために、コードにしたほうが良いかと思う
fc2_request.php
## ロジックが含まれているので特殊だが、Configとも言えるもの
→ コード化、あるいはコードと設定を分離すべきと思う
routing.php
routing_test.php
routing_user.php
## プラグインのスニペット(的な)集
→ これはConfigよりもテンプレート寄りのものかとと考えている、templateやpluginなどのディレクトリへ移設するのはどうか
(将来的にどのように増えていくのか?で変わるのかなと思っている)
fc2_default_plugin.php
fc2_template.php
## デフォルトで使われるテンプレート
→ templates/defaultなどのディレクトリをつくり、移動すべきかと思う
(ただ、実体はDBにもあるので、blog_template tableを主とするなら、`sample/template`でもよいかと思う)
fc2_default_css.php
fc2_default_css_sp.php
fc2_default_template.php
fc2_default_template_sp.php
## 初期化用のDDL、configではない。
→ 今後DBのマイグレーションを考えると `/resource/db/0_init.sql`などに移動など
blog.sql
なにかしら意味があれば変更はむずかしいとおもいますが、ご検討いただければ幸いです。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.