@Blog{zip358.com}
日常日誌からプログラムやYOUTUBER紹介、旅日記まで日々更新中です。
Qiitaのfeedを取得して表示するだけのコード非同期編? #phpcode
2022.11.06
おはようございます。昨日の続きのお話ですコードは金曜日に書きました😗。
動画を見ていただければわかるかと思いますが即興で書いたコードです、最後の最後でエラーってる!?ところなんかも編集していない所が伝わってくるかと思います。ちなみに画質HDのフル画面で見ないとコードは見えないかなって思います。
音声も今後入れていくかもしれません。
任意のユーザーを増やしたい場合はmain.jsの先頭行(2行目?)のqiitaIDに任意のIDを追加するだけで取得可能です。解説はなしですけど一応、何をやっているのかそれなりに、わかるように心がけたつもりです。あとは盗んで覚えてください😂。
ソースコードはこちらになります。
<?php
session_start();
$toke_byte = openssl_random_pseudo_bytes(16);
$csrf_token = bin2hex($toke_byte);
$_SESSION['csrf_token'] = $csrf_token;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
.qiita_feed-list>li {
/* font-weight: bold; */
color: aliceblue;
}
.qiita_feed-list>li>a {
color: aliceblue;
}
body {
background-color: #60b111;
}
.shadow-lg {
box-shadow: 0 1rem 3rem rgba(255, 255, 255, .195) !important;
}
</style>
<title>Qiita-feed</title>
<?php
require $_SERVER['DOCUMENT_ROOT'] . "/header_script.php";
?>
</head>
<body>
<input type="hidden" id="csrf_token" value="<?= $csrf_token ?>">
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="text-light">Qiita-feed</h1>
</div>
</div>
</div>
<div class="container mt-2">
<span id="view"></span>
Copyright <?= date("Y") ?> <a href="https://358tool.com">358tool.com</a>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
<script src="./js/main.js?<?= time() ?>"></script>
</body>
</html>
//qiita feed
["taoka-toshiaki","mpyw","suin"].forEach(id=>{
let data = {
csrf_token:document.getElementById("csrf_token").value,
feedid:[id]
};
let url = "./qiita-feed.php";
qiita_feed(url,data);
});
async function qiita_feed(url, data) {
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify(data)
}
await fetch(url, options).then(response =>
response.json()
).then(resultdata => {
document.getElementById("view").insertAdjacentHTML("beforeend",resultdata.reshtmlcode)
}
).catch(error => {
console.log(error);
}
);
}
<?php
session_start();
$obj = json_decode(strip_tags(@file_get_contents("php://input")));
if (isset($obj)) {
if (isset($obj->csrf_token) && $_SESSION["csrf_token"] === $obj->csrf_token) {
$str ="";
foreach ($obj->feedid as $key => $id) {
$str.= '
<div class="row shadow-lg p-3 mb-5 bg-body rounded">
<div class="col-12">
🌿<span class="text-light">://qiita.com/' . xss_d($id) . '/feed :[引用]</span>';
$str .= get_Qiitafeed("https://qiita.com/" . xss_d($id) . "/feed");
$str .= '
</div>
</div> ';
}
$res["reshtmlcode"] = $str;
print json_encode($res);
}
}
function xss_d(mixed $val): mixed
{
if (is_array($val)) {
foreach ($val as $key => $value) {
$val[$key] = htmlentities($value, ENT_QUOTES);
}
} else {
$val = htmlentities($val, ENT_QUOTES);
}
return $val;
}
function get_Qiitafeed(string $feedUrl): string
{
$xml = @simplexml_load_file($feedUrl);
if (isset($xml->entry)) {
$str = "<ul class='qiita_feed-list'>";
foreach ($xml->entry as $key => $val) {
$str .= "<li><a href='{$val->url}'>" . $val->title . "</a></li>";
}
$str .= "</ul>";
}
return $str;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, feed, HD, ID, JS, main, PHPCODE, qiita, qiitaID, あと, エラー, お話, コード, こちら, ソース, つもり, ところ, プル, ユーザー, 今後, 任意, 何, 先頭, 動画, 即興, 取得, 可能, 同期, 場合, 所, 昨日, 最後, 画質, 画面, 編集, 表示, 解説, 追加, 金曜日, 音声,
常時ディレクトリ監視を行う方法。 #CPU使用率 #炎上
2022.11.03
おはようございます。何だかアカウントを作ってまでコメントする人の考えがわからない🤔。
Qiitaに、このコードのsleep関数がないバージョンをアップしたら、何やらアカウントを作ってまでコメントする人が現れる、理由はCPU使用率がMax近くになるのが駄目だからです、そんな事は分かっているのが普通だと思っていたのだけども…例文として掲載するのも駄目だそうです、コピペで運用する人が結構いるのかもしれない。
正直なところ、そこまで叩かれるとは思っていなかったので、正直なところ驚きを隠せない。段々と世間の常識とズレていっている気がします😗。
昔はそういうコードは巷に溢れていたのにな・・・そんな事も出来なくなってきたのか・・・。
トイウコトデ、常時ディレクトリ監視を行い任意の画像ファイルだけ別のディレクトリへ移動するコードです。
nohup php File_Check.php &
├── File_Check.php
├── upload
└── data
<?php
while(true){
if($result = is_scandir("./upload")){
foreach($result as $key=>$value){
rename("./upload/$value","./data/$value");
}
}
sleep(3);
}
function is_scandir(string $dirname="",array $ext_list = ["png","jpg"]){
$is_filelest = [];
$result = scandir($dirname);
foreach($result as $key=>$value){
$ext = substr($value, strrpos($value, '.') + 1);
if(in_array($ext,$ext_list,false)!== false){
$is_filelest[] = $value;
}
}
return count($is_filelest)>0 ? $is_filelest : false;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
check, CPU, file, max, nohup, php, qiita, sleep, アカウント, アップ, コード, コピペ, コメント, そこ, ディレクトリ, トイウコトデ, ところ, バージョン, ファイル, 世間, 事, 人, 任意, 使用, 例文, 別, 巷, 常時, 常識, 掲載, 方法, 昔, 普通, 正直, 段々, 気, 炎上, 理由, 画像, 監視, 移動, 近く, 運用, 関数, 駄目,
WP予約投稿ツイートプラグイン作り方。#php言語 #code #v2
2022.10.11
おはようございます😤 お仕事に飢えてます…寒い季節ですね…。
さて、今日はWP予約投稿ツイートプラグイン作り方を記載していきます。ワードプレスでプラグインを作る場合はWordPressの下記の場所に任意のフォルダを作り、その中にディレクトリ名(任意名)と同じファイル名でphpファイルを作ります。※昔の名残なので今は命名が違っても動くかも知れませんが・・・。
cd /wp-content/plugins
mkdir mytweets
vi mytweets.php
そして、命名したファイル名を開き、ファイルの上部に下記のコメントを記載します。プラグイン名やプラグインの説明、プラグインバージョンをそれぞれ変更して頂き保存、その後サーバーサイドにアップロードします(フォルダごと)。
<?php
/*
Plugin Name: My tweets
Description: tweets
Version: 1.0
*/
これで何も動作しないプラグインが出来上がります。
後はコマンドラインからプラグインフォルダにcomposerをインストールしtwitteroauthのライブラリを入れます。
此処までが前手順です。此処までで挫折した人は結構いると思います🙄。
因みに此処までの事がすんなりと出来る人は、このブログの情報は必要ないものです。なのでココからはソースコードを記載します。WP予約投稿ツイートプラグインなんてオチャノコサイサイだと思います。
<?php
/*
Plugin Name: My tweets
Description: tweets
Version: 1.0
*/
if (!defined('ABSPATH')) exit;
require_once "tw-v2-config.php";
require_once "./vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
function mytweets($new_status, $old_status, $post)
{
if ($new_status == 'publish' && $old_status != 'publish') {
try {
$connection = new TwitterOAuth(APIKEY, APIKEYSECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
$connection->setApiVersion('2');
$response = $connection->post('tweets', ['text' => get_the_title($post->ID) . "\n" . get_permalink($post->ID)], true);
} catch (\Throwable $th) {
//throw $th;
}
}
}
add_action('transition_post_status', 'mytweets', 10, 3);
上記のコードを記載した上で上書き保存&アップロードします。その後ワードプレスの管理画面よりプラグインを有効にして出来上がり、今回はtwitteroauthのライブラリを使用しましたがcrulなどのを理解している人はライブラリは特に必要ないのかなとも思います。ライブラリを使用すればお手軽ですが、万が一何かあった時に困るのでライブラリを使用せずにコードを書くという方もいらっしゃると思います。
自分も極力、公式のライブラリしか使わないようにしています🙇。
トイウコデ、ワードプレスのプラグインの作り方でした。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, cd, Code, description, lt, mkdir, My, mytweets, name, php, plugin, plugins, Tweets, Vers, vI, WordPress, wp, wp-content, アップロード, お仕事, コメント, サーバー, それぞれ, ツイート, ディレクトリ, バージョン, ファイル, フォルダ, プラグイン, プレス, ワード, 上部, 下記, 中, 予約, 今, 今日, 任意, 作り方, 保存, 名残, 命名, 場合, 場所, 変更, 季節, 後, 投稿, 昔, 言語, 記載, 説明,
WPでWeb サーバーにアクセスする必要がありますの対処編:インフラ周り。
2022.07.03
おはようございます。WP(ワードプレス)でテーマや更新の際にFTPやSFTPのパスワードを求められたときの対処を記載します。この問題はApacheサーバーでもエンジンエックス(Nginx)でも対応は同じです。巷ではApacheグループに任意のユーザー名を付与しなさいという記載がありますが、其れだけでは駄目な場合があるのです。
gpasswd -a [ユーザー名] [グループに追加したいユーザー名]
gpasswd -a hoge apache
なので、phpのphp-fpm.dのディレクトリ配下にあるwww.confファイルの記載(user名とグループ名)を変更してあげる必要があります。変更後、php-fpmとhttpdを再起動してあげてください。
sudo vi /etc/php-fpm.d/www.conf
sudo systemctl restart php-fpm
sudo systemctl restart httpd
そうすれば、「Web サーバーにアクセスする必要があります」というような文言は非表示なり問題なく動作すると思います。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
A`, Apache, conf, etc, FTP, gpasswd, hoge, httpd, nginx, php, php-fpm, restart, SFTP, sudo, System, systemctl, user, vI, web, wp, www, アクセス, インフラ, エックス, エンジン, グループ, サーバー, テーマ, ディレクトリ, とき, パスワード, ファイル, プレス, ユーザー, ワード, 付与, 任意, 其れだけ, 再起動, 名, 周り, 問題, 場合, 変更, 対処, 対応, 巷, 必要, 更新, 記載, 追加, 配下, 際, 駄目,
デスクツアーをYOUTUBEで見るのが好きです。あんなデスクにしたいよね!!
2022.05.06
おはようございます。
こういうデスクツアーものを見ているとポチッとYOUTUBEの概要をりんくを押している時があります。因みに先日、自分のデスクをTweetしましたが、動画のようなスキッリとした感じになっていません。また拡大したらホコリがデスクに溜まっているのが分かると思います。あと、実名のTwitter垢もありまして個人情報ダダ漏れですが、今まで個人情報ダダ漏れだったので特に今のところ、Tweetを削除する気はありません。
今、YOUTUBEでも#デスクツアーと検索するとハッシュタグの付いた検索ができるようになっています。またアドレスバーにhttps://www.youtube.com/hashtag/任意の文字と入力するとハッシュタグの付いたものが一覧で表示されますので、そちらで検索するのも一つの方法かと思います。
https://www.youtube.com/hashtag/任意の文字
ここ数年でYOUTUBEにありとあらゆる動画が蓄積されているので、本当に自分の好みにあった動画を見るのも難しくなくなりつつあります。凄い時代になりましたね・・・本当に。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
com, hashtag, https, Tweet, Twitter, watch, www, xWJ-DqAQDuQ, youtube, アドレス, スキッリ, そちら, だだ, ツアー, デスク, ところ, バー, ハッシュタグ, ポ, ホコリ, もの, リンク, 一つ, 一覧, 今, 任意, 個人, 先日, 入力, 削除, 動画, 垢, 実名, 情報, 感じ, 拡大, 文字, 方, 時, 検索, 概要, 気, 自分, 表示,
今読まれてますというWPプラグインの作り方
2021.04.19
今読まれてますというWP(ワードプレス)プラグインの作り方はこれだけです。ボット対策の部分はお見せできませんがこんなソースコードで動いています、なお、自分が閲覧してもツイートすることはないようにしています。因みに昨日もボットみたいなのが何度も来たのでその対応を行いました。尚、TwitterOAuthというライブラリを導入してautoload.phpを使用しuseで呼び出し使用しています(※autoloadを置いている任意の場所に変更してください)。
ワードプレスのプラグインの作り方の動画を貼っときます。英語ですが理解できるかと思います。動画で分かりづらかった方は『自作、WordPress、プラグイン、PHP』という様な検索すると先人たちが方法をネットに公開しているのでそちらを参考にしてください。
プラグインを作るにあたってソースコードに書かれているコメント部分は必須なのだけど、プラグインを配布しない人はプラグイン名だけ記載しプラグインと同じフォルダを構えるだけでプラグインとして認識します。
<?php
/*
Plugin Name: article-live-tw
Plugin URI:
Description: 今、ユーザーが読んでいる記事をツイートする
Version: 1.0.0
Author: @zip358com
Author URI: https://zip358.com
*/
session_start();
require "/vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
add_action("wp_head","article_live_tw");
function article_live_tw(){
define("CONSUMER_KEY", "CONSUMER_KEY");
define("CONSUMER_SECRET", "CONSUMER_SECRET");
define("ACCESS_TOKEN", "ACCESS_TOKEN");
define("ACCESS_TOKEN_SECRET", "ACCESS_TOKEN_SECRET");
global $post;
$flg1 = is_bot();
$flg2 = empty($_SESSION["reading-zip358-".$post->ID.$_SERVER['REMOTE_ADDR']]);
$flg3 = ip_check("reading-zip358-".$post->ID.$_SERVER['REMOTE_ADDR']);
if(!$flg1 && $flg2 && !$flg3 && $post->ID){
$_SESSION["reading-zip358-".$post->ID] = 1;
$tw_title = get_post($post->ID)->post_title;
$tw_link = get_permalink($post->ID);
$kigolist = ["?","?","?","?","?","?"];
$kigo = $kigolist[floor(rand(0,5))];
if(!current_user_can('administrator')){
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
$connection->post("statuses/update", array("status" => "#今読まれてます $kigo ??? \n".$tw_title . " \n" . $tw_link . " \n #ブログ zip358.com \n" . date_i18n('Y/m/d H:i')));
//$ua = print_r($_SERVER,true);
//@file_put_contents("./log/".date('Y-m-d-H-i').".log",$ua);
}
}
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
15, 7, autoload, com, https, php, QfH-s-, TwitterOAuth, use, watch, WordPress, wp, www, youtube, お見せ, コード, こと, これだけ, ソ, ソース, そちら, ツイート, ネット, プラグイン, プレス, ボット, ライブラリ, ワード, 今, 任意, 何度, 作り方, 使用, 先人, 公開, 動画, 参考, 場所, 変更, 対応, 対策, 導入, 方, 方法, 昨日, 検索, 理解, 自作, 自分, 英語, 部分, 閲覧,
サブドメインをワイルドカードで割り付ける方法:熨斗(のし)
2020.11.15
サブドメインをワイルドカードで割り付ける方法を記載します。まず初期の設定としてAレコードを下記のように設定します。ドメイン名はご自分のドメイン名に変更ください。バリューも任意に設定ください。
*.example.com 123.123.123.123
次にVirtualhostsを下記のように設定します。%1の部分がサブドメインの値が入ってきます。これで出来上がりです。因みにSSL認証はどうするれば良いのかという人にヒントを記載します。「ワイルドカードSSL認証」などとググると方法が記載されているHPに行き当たると思います。そちらを試すと容易にワイルドカードのSSLも出来ちゃうですね?
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot "/var/www/html/example.com"
ErrorLog /var/log/httpd/example.com_error_log
<Directory "/var/www/html/example.com">
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
VirtualDocumentRoot "/var/www/html/subdomain/%1"
ErrorLog /var/log/httpd/sub.example.com_error_log
</VirtualHost>
案外簡単で拍子抜けひともいるかも知れないですが、これで何かのサービスを作ることは可能かと思いますよ。どうぞお試しあれ。
因みにexample.comというドメインは存在します、参考書や参考サイトなどで使われる「例えばサイト」は存在します。玄人志向の方はtestなどのドメイン名を使わずに上記のドメイン名を使用します。それには理由があるのです、察しがいい人は分かるかと思いますが、安全でないサイトへ飛んでしまったりする人がいるためです。あとダミー画像を生成したいのなら、Placehold.jpを使用すると良いですよ。運用しているのはソフテルという日本の会社です?
追記でSSL認証も書いときますね。Let’s Encryptでワイルドカード証明書の場合はこんな感じです。まず、certbotが入っているということが前提としてあります、無い場合はインストールしてください。まず最初に下記のコマンドを打ちます。ドメイン名は自分用に変えてください。
certbot certonly --manual \
-d *.example.com -m mail@example.com --agree-tos --manual-public-ip-logging-ok \
--preferred-challenges dns \
このような内容が表示されますので、TXTレコードの設定を行います。英語が分からなければコピペして翻訳アプリにかけてください。
_acme-challenge.example.com XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TXTレコードが設定されたどうかの確認はMSDOSなどで下記のコマンドを打ちます。設定が完了された場合はVALUEの値が返ってきます。
nslookup -type=TXT _acme-challenge.example.com 8.8.8.8
上手く通ったあと、エンターを打ち次に進みます。上手くいくとpemが生成されましたよというメッセージが出るのでその階層をコピーします。コピーしたものを元にApacheのVirtualhostのconfigの設定を行います。こんな感じです。
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot "/var/www/html/example.com"
ErrorLog /var/log/httpd/example.com_error_log
<Directory "/var/www/html/example.com">
AllowOverride All
</Directory>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias *.example.com
VirtualDocumentRoot "/var/www/html/subtaxi/%1"
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
ErrorLog /var/log/httpd/example.com_error_log
</VirtualHost>
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, 123.123.123.123, 80, com, DocumentRoot, Error, example, gt, HP, html, lt, quot, servername, SSL, var, VirtualHost, Virtualhosts, www, カード, これ, ご自分, サブ, そちら, ドメイン, ドメイン名, のし, バリュー, ヒント, レコード, ワイルド, 下記, 人, 任意, 値, 初期, 変更, 容易, 方法, 次, 熨斗, 記載, 設定, 認証, 部分,
ECサイトのBASEショップを独自ドメインに!
2020.09.21
ECサイトのBASEショップを独自ドメインにする方法を書いていきます。まずはお名前ドットコムでドメインを取得します。下記の動画で解説していますのでそちらを参照ください。もし動画のリンクが切れていた場合、YOUTUBEで『お名前.com ドメイン取得』などとググってみてください。ドメインの購入方法が説明されている動画があると思います。
次にドメインが所得したあと、DNSの設定よりサブドメイン、『wwwか任意の名(shopなど)』ドメインのサーバ住所(在処)をBASEショップのサーバ住所に変更しなくてはならない為、ブルダウンメニューからCNAMEレコードを選択し『cname.thebase.in』と入力する必要があります。また左端の入力部分にはサブドメイン名を入力してください。
下記の画像を参照してください、手順を参考にしてサブドメインとCNAMEの値を設定し設定ボタンを押してください。(設定する値はwwwか任意のサブドメイン名となり、CNAMEの値はcname.thebase.inになります。)
最後にBASEサイトにログインし上記で設定したサブドメイン(wwwか任意の名(shopなど))を下記の動画を見本に申請してみてください。申請後、数時間で独自ドメインがECサイトで表示されている事が確認できると思います。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
base, CNAME, com, DNS, EC, in, shop, thebase, www, youtube, あと, サーバ, サイト, サブ, サブド, ショップ, そちら, ダウン, ドットコム, ドメイン, ドメイン名, プル, ボタン, メニュー, リンク, レコード, 下記, 任意, 住所, 値, 入力, 動画, 参照, 参考, 取得, 名, 名前, 在処, 場合, 変更, 左端, 必要, 所得, 手順, 方法, 為, 画像, 解説, 設定, 説明, 購入, 選択, 部分,
bingから画像を一括ダウンロードするアプリ。
2020.06.14
任意のキーワード検索でbing画像からを一括ダウンロードするアプリを作りました。img-dl-bing-sss.exeファイルを起動すると動画のようなコンソール画面が開くので入力してダウンロードを開始してください。ダウンロードが終わると勝手に閉じます。
なお、一応R指定にも対応しています、キーワードがR指定項目かもと思う場合、Yと入力ください。
新垣結衣さんの熱烈なファンでもないですが、綺麗な方だとは思います。ということで例として使用させて頂きました、、、関係者の皆様ごめんなさい。
このアプリはウィンドウズ10環境で動作します。また、動作しないブロックされる場合は下記のURL等を参照しブロックを解除しお使いください。ブロック解除方法:https://forest.watch.impress.co.jp/docs/news/1130655.html
※なお、Bingサイトのデザインが変わった場合、動作しなくなりますのであしからず。
画像ダウンロードアプリのソースコードはこちら(古いコードですので動かない場合がありますVS2019C#)
using System;
using System.Runtime.CompilerServices;
namespace img_dl_bing_sss
{
class Program
{
static void Main(string[] args)
{
string keyword = "",R18="";
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("処理中は画面や立ち上がったブラウザを閉じないでください。\n" +
"処理が完了すると「***終了します***」と表示されます。\n" +
"何かキーを押し終了してください\n\n");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("↓検索キーワードを入力しエンターを押してください");
keyword = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("↓R指定ですか?\nY or N かの文字を入力しエンターを押してください");
R18 = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***画像のダウンロード量(画像数ではありません) 1?999 ***");
var scroll = 9999;
try
{
scroll = int.Parse(Console.ReadLine());
if(scroll >=1 && scroll <= 999)
{
scroll = scroll * 9999;
}
}
catch
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***検索キーワードが不適切です。***");
}
SuiteTests img = new SuiteTests();
if (img.Imgdlok(keyword, R18, scroll))
{
img.Dispose();
}
else {
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***検索キーワードが不適切です。***");
}
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***終了します***");
}
}
}
// Generated by Selenium IDE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Interactions;
using Xunit;
using AngleSharp;
using AngleSharp.Html.Parser;
using AngleSharp.Html.Dom;
using AngleSharp.Dom;
using System.Runtime.InteropServices;
using Newtonsoft.Json;
using System.IO;
using System.Net;
public class SuiteTests : IDisposable {
public IWebDriver driver {get; private set;}
public IDictionary<String, Object> vars {get; private set;}
public IJavaScriptExecutor js {get; private set;}
public SuiteTests()
{
driver = new ChromeDriver();
js = (IJavaScriptExecutor)driver;
vars = new Dictionary<String, Object>();
}
public void Dispose()
{
driver.Quit();
}
public bool Imgdlok(string keyword="", string R18= "",int scroll = 999999)
{
if (keyword == "") return false;
Console.Clear();
string path = System.IO.Directory.GetCurrentDirectory() + "\\IMG\\";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
driver.Navigate().GoToUrl("https://www.bing.com/?scope=images&nr=1&FORM=NOFORM");
driver.Manage().Window.Size = new System.Drawing.Size(945, 1030);
driver.FindElement(By.Id("sb_form_q")).Click();
driver.FindElement(By.Id("sb_form_q")).SendKeys(keyword);
driver.FindElement(By.CssSelector(".search.icon.tooltip")).Click();
try
{
if (R18 == "Y")
{
driver.FindElement(By.LinkText("設定の変更")).Click();
driver.FindElement(By.CssSelector("#settings_safesearch div:nth-child(3)")).Click();
driver.FindElement(By.Id("adlt_set_off")).Click();
driver.FindElement(By.Id("sv_btn")).Click();
driver.FindElement(By.Id("adlt_confirm")).Click();
}
}
catch
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***R指定ではありません***");
}
try
{
double ps = 0;
for (int i = 99; i < scroll;i+=1000)
{
js.ExecuteScript("window.scrollTo(0," + i + ")");
Console.CursorLeft = 0;
ps = (double)(((double)i / (double)scroll) * 100);
Console.Write("処理中::{0:D2}%",(int)ps);
}
}
catch
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***Max画像まで到達しました***");
}
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("\n***ダウンロード処理開始***\n");
int cnt = 0;
var elm = driver.FindElements(By.ClassName("iusc"));
driver.Manage().Window.Minimize();
foreach (var e in elm) {
dynamic jsondata = JsonConvert.DeserializeObject(e.GetAttribute("m"));
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine((string)jsondata.murl + "::wait.....");
string imgurl = (string)jsondata.murl;
if(4 <= Path.GetExtension(imgurl).Length && Path.GetExtension(imgurl).Length <= 5)
{
try
{
cnt++;
string ext = Path.GetExtension(imgurl);
WebClient myWebClient = new WebClient();
myWebClient.DownloadFile(imgurl, path + "No-" + cnt + "-" + keyword + ext);
myWebClient.Dispose();
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("***" + cnt +"::" + imgurl + "\n::ダウンロード中、画面を閉じないでください...***");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("***" + cnt + "::ダウンロード済***");
}
catch
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***ダウンロードが失敗しました***");
}
}else{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***画像の拡張子が不明のためダウンロードが失敗しました***");
}
}
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("***ダウンロード完了しました***\n" + path);
return true;
}
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
10, bing, exe, img-dl-bing-sss, url, VS, アプリ, ウィンドウズ, キーワード, コード, こちら, こと, コンソール, サイト, ソース, ダウンロード, デザイン, ファイル, ファン, ブロック, 一括, 下記, 任意, 使用, 例, 入力, 動作, 動画, 勝手, 参照, 場合, 対応, 指定, 新垣結衣, 方, 方法, 検索, 環境, 画像, 画面, 皆様, 等, 綺麗, 解除, 起動, 開始, 関係者, 項目,
WPの記事を検索し一括カテゴリ変更する方法。
2020.05.25
WPの記事を検索し一括カテゴリ変更する方法は下記になります。ワードプレスのwp-load.phpを読み込み、下記のようなソースコードのファイルをcommandで実行すると、カテゴリが任意のカテゴリに変更されます。
重要点はwp_set_post_categoriesの引数です。arrayの配列の数値ですが、この数値をカテゴリIDのナンバーに変更することによってカテゴリが更新されます。
企業でご使用する場合はカテゴリ更新部分を一度、コメントアウトしCSVか何かでうまく記事が抽出できているか確認した後に、更新するようにお願い致します、当然ながら不具合等の苦情は受け付けません。自己責任でご使用くださいな。
尚、この下記のコードの意味がわからないという方は下記のURLからそれぞれのワードプレスようのメソッドが何を意味しているか調べてくださいね。
https://elearn.jp/wpman/
<?php
require_once(__DIR__ . '/../wp-load.php');
if ($argv[0]) {
$args = array(
'post_type ' => 'post',
'posts_per_page' =>-1,
's' => '映画'
);
$posts = get_posts($args);
foreach ($posts as $val) {
$href = get_permalink($val->ID);
$title = get_the_title($val->ID);
$cnt++;
echo $cnt.":".$title."\n".$href."\n";
wp_set_post_categories($val->ID,array(1,2,3));
}
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
-Command, 39, array, categories, CSV, DIR, ID, lt, once, php, POST, require, set, url, wp, wp-load, アウト, お願い, カテゴリ, コード, こと, コメント, ご使用, ソース, それぞれ, ナンバー, ファイル, プレス, メソッド, ワード, 一度, 一括, 下記, 不具合, 任意, 企業, 何, 何か, 使用, 場合, 変更, 実行, 引数, 当然, 後, 意味, 抽出, 数値, 方, 方法, 更新, 検索, 確認, 自己, 苦情, 記事, 責任, 部分, 配列, 重要点,
ブラウザのプッシュ通知が簡単にできちゃうFirebase
2020.03.20
ブラウザのプッシュ通知が簡単にできちゃうFirebaseのでやり方を簡略的に記載します。
- Firebaseにプロジェクトを作成する(グーグルのアカウントが必要)。
- firebase cliというパッケージソフトをOSにダウンロードしそのソフトを任意のフォルダの中に移動させて起動させる。Node.jsはインストール済みとする(※手順)。
- 試しにホスティングしてみる。ホスティングはプロジェクトの左側の項目よりホスティングをクリックすると手順の説明通り行うと出来ます。
- URLより確認し表示されているか確認する。
- Cloud Messagingの設定よりFCM でウェブ認証情報を設定するからメッセージング オブジェクトを取得するまでをブラウザで操作し設定を行う。
- ローカルに下記のURLよりファイルをダウンロードする。ダウンロードするファイルはfirebase-messaging-sw.js, firebase-logo.png.webp, index.html, main.cssになります。動かない場合は再設定が必要。
https://github.com/firebase/quickstart-js/tree/f76b14ca00cca48dbfca5c787c0a4ca73eb9857d/messaging - ダウンロードしたファイルはpublicか自分が決めたフォルダに入れる。
- index.htmlソースの中に ‘<YOUR_PUBLIC_VAPID_KEY_HERE>’ と記載している部分があるので変更する。
- firebase cli より『 firebase deploy』する。
- ページを再読み込みして通知を許可する。
- Cloud Messagingから送信してみる。
- 通知が届くことを確認する。
※今回はブラウザのプッシュ通知なのでアプリを追加する際はWEB(</>)を選んでください。
ではでは?健闘を祈る?
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
cli, Cloud, FCM, Firebase, firebase-logo, firebase-messaging-sw, index, JS, Messaging, node, OS, png, url, アカウント, インストール, ウェブ, オブジェクト, グーグル, クリック, ソフト, ダウンロード, パッケージ, ファイル, フォルダ, プッシュ, ブラウザ, プロジェクト, ホスティング, メッセージング, やり方, ローカル, 下記, 中, 任意, 作成, 取得, 左側, 必要, 情報, 手順, 操作, 確認, 移動, 簡単, 簡略, 表示, 記載, 設定, 認証, 説明, 起動, 通知, 項目,
WordPressの404外部リダイレクトプラグインを作りました。
2019.11.16
WordPressの404外部リダイレクトプラグインを作りました。
ソースコードはこんな感じになってます、、、。
使用される方は下記のURLよりダウンロードを行ってください。
解凍してフォルダをワードプレスのpluginを置く場所へアップロードし
page404goプラグインを有効にしていただければ使用できます。
https://zip358.com/plugin/page404go.zip
<?php
/*
Plugin Name: page404GO!!
Plugin URI: https://zip358.com/plugin/page404go.zip
Description: 404ページを任意のURLへ変換し遷移させる
Author: taoka toshiaki
Version: 1.0
Author URI: https://zip358.com/
*/
add_action( 'wp', function() {
global $wp;
$domain = get_option('domain404page')?get_option('domain404page'):"https://zip358.com/";
if(is_404()){
wp_redirect($domain.$wp->request);
exit;
}
});
add_action('admin_menu','page404go_setting');
function page404go_setting(){
add_options_page(
'zip358.com:プラグイン',
'404リダイレクト設定',
'administrator',
'page404go',
function(){
if(isset($_POST["domain404page"])){
if(preg_match("/https?://.*/$/",$_POST["domain404page"])){
$url = $_POST["domain404page"];
}elseif(preg_match("/https?://.*/",$_POST["domain404page"])){
$url = $_POST["domain404page"]."/";
}else{
$url = "https://zip358.com/";
}
update_option('domain404page', wp_unslash($url));
}
?>
<form method="post" action="">
<h2>リダイレクトドメイン指定</h2>
<input type="text" style="width:350px" name="domain404page" value="<?=get_option('domain404page')?get_option('domain404page'):""?>" placeholder="https://zip358.com/">
<?php submit_button(); ?>
</form>
<?php
}
);
}
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1195254834632380416, 358, 404, Author, com, description, go, lt, name, page, php, plugin, status, taoka, toshiak, Twitter, URI, url, WordPress, zip, アップロード, コード, ソース, ダウンロード, フォルダ, プラグイン, プレス, リダイレクト, ワード, 下記, 任意, 使用, 場所, 変換, 外部, 感じ, 方, 有効, 解凍, 遷移,
Tera Termで自動ログインする方法:秘密鍵有り無し対応
2019.09.14
秘密鍵有り自動ログイン
connect 'ホスト名:22 /ssh /2 /auth=publickey /user=ユーザー名 /passwd=パスワード /keyfile=秘密鍵'
wait '#'
sendln 'ls'
sendln 'cd /var/www/html'
秘密鍵無し自動ログイン
connect 'ホスト名:22 /ssh /2 /auth=password /user=ユーザー名 /passwd=パスワード'
wait '#'
sendln 'ls'
sendln 'cd /var/www/html'
上記の内容をテキストファイルにコピペしてホスト名、ユーザー名、パスワード、
秘密鍵(場所)をそれぞれ変更し任意の名前で保存。
保存後、拡張子をTTLへ変更。
Tera TermでTTLを呼び出すようにする方法に
ついては割愛します(ググってください)。
ちなみにこの記事、過去に書いています。
(過去記事は別のブログに移転しています)
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, 22, auth, cd, connect, html, keyfile, ls, nbsp, passwd, password, publickey, sendln, SSH, Tera, Term, TTL, user, var, wait, くだ, コピペ, それぞれ, テキスト, パスワード, ファイル, ホスト, ユーザー, ログイン, 上記, 任意, 保存, 内容, 割愛, 名前, 場所, 変更, 対応, 拡張子, 方法, 有り無し, 秘密, 自動, 鍵,
変なコードを書いてしまった。それはいつものこと(笑)
2019.08.10
変なコードを書いてしまった。
PHPにstr_repeatという関数が存在しているのだけど
何のために使用するのか全然わからない。関数の内容は任意の文字を
指定回数、繰り返した文字列として返してくれるというものです。
試しにその関数を使用し変なコードを書きました。
茶目っ気ですので…。これがPCに負担がかかるとか
無限ループとかの処理にすると御縄なんでしょうけど・・・。
サンプルコードはこちらから
https://zip358.com/tool/demo5/index-11.php
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="../jquery.tubular.1.0.1/js/jquery.tubular.1.0.js"></script>
<link rel="stylesheet" type="text/css" href="../jquery.tubular.1.0.1/css/screen.css">
<script>
$('document').ready(function() {
var options = {
videoId: '760lRwLKFF0',
mute: true,
};
$('#bgmovie').tubular(options);
});
</script>
<style>
body{
background-color: #000;
color: #fff;
font-size: 80px;
line-height: 80px;
}
p{
color: #38a9c5;
}
</style>
</head>
<body>
<div id="bgmovie">
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="#">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<?php
$str = str_repeat("高知 よさこい 踊る,",7);
var_dump(str_getcsv($str));
?>
<p class="oshite" data-oshite="<?=$str?>"style="text-decoration: underline">▼おして知るべし</p>
※おして知るべしをクリックすると7ウィンドウ開きますよ!!
<?php
foreach(str_getcsv($str) as $val){
?>
<?php
}
?>
</div>
<script>
$(function(){
$(".oshite").on("click",function(){
let oshite = $(this).attr("data-oshite").split(",");
for(var i = 0 ; i < oshite.length ; i++){
if(oshite[i]!==""){
window.open("https://twitter.com/search?src=typed_query&q=" + encodeURIComponent(oshite[i]));
}
}
});
});
</script>
<script src='https://vjs.zencdn.net/7.6.0/video.js'></script>
</body>
</html>
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
--, 11, 358, 5, 7, 8, 9, class, com, demo, DOCTYPE, endif, gt, html, IE, if, index, lt, lt-ie, no-js, PC, php, repeat, STR, tool, zip, いつも, コード, こちら, こと, これ, サンプル, それ, ため, もの, ループ, 任意, 何, 使用, 内容, 処理, 回数, 変, 存在, 指定, 文字, 文字列, 無限, 縄, 茶目っ気, 負担, 関数,
FuelPHPをサクラレンタルサーバー共有で動かすには?
2016.07.14
FuelPHPをサクラレンタルサーバー共有で動かすには?
どうしたら良いのかを記述しときます。
\fuel\app\config\config.phpに記述されている’base_url’の所を
base_url’ ?=>’http://任意.com/’,かbase_url’ ?=>’任意の階層’にします。
オプションでいろいろと変更できる点はありますが、今回はスルーします。
(FuelPHPの日本公式サイトを参照)
次にルートの直下に.htaccessを作成し下記の内容を記述しアップロードを行なってください。
RewriteEngine on
RewriteBase /public
RewriteRule (.*) /public/$1
この段階ではルートにアクセスしても表示されません。表示させるためには
\public.htaccessの.htaccessファイルを一部変更してあげる必要があります。
まず、RewriteBase /publicを追加しOptions +FollowSymLinks -Indexesと
記載されている部分をコメントアウトする必要があります。
これらの事をするとルートURLでFuelPHPの初期の表示がされるようになります。
いろいろなサイトを拝見しましたが、結構設定を変更しないといけないよと書かれていますが、実際はコレだけの設定変更で表示することは可能です。ちなみに余談ですがオプション値のココだけは変更したら良いかなという
所を記載します。
/**
* Localization & internationalization settings
*/
'language' => 'ja', // Default language
'language_fallback' => 'ja', // Fallback language when file isn't available for default language
'locale' => 'ja_JP.UTF-8', // PHP set_locale() setting, null to not set
/**
* Internal string encoding charset
*/
'encoding' => 'UTF-8',
/**
* DateTime settings
*
* server_gmt_offset in seconds the server offset from gmt timestamp when time() is used
* default_timezone optional, if you want to change the server's default timezone
*/
'server_gmt_offset' => 0,
'default_timezone' => 'Asia/Tokyo',
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, App, base, com, config, fuel, FuelPHP, htaccess, http, ON, php, public, Rewrite, RewriteBase, RewriteEngine, RewriteRule, url, アクセス, アップロード, いろいろ, オプション, サーバー, サイト, さくら, スルー, ため, ファイル, ルート, レンタル, 一部, 下記, 今回, 任意, 作成, 公式, 共有, 内容, 参照, 変更, 必要, 所, 日本, 段階, 点, 直下, 表示, 記述, 階層,