WordPressへの移行ツールをさらに強化して必要なファイルを取り込めるようにした

※ 今回、ギターネタはありません。

こんばんは。。。また平日で疲れます・・・
今週もがんばるぞーーー(棒)

前回はとりあえず例の曲を正式配信する、
日限を決めて、またどこまでできるかという感じで、
線引きしました。

いつも通りの練習である・・・最終報告まであと1週間・・・

こんばんは・・・今日はちょっとケーキ買いつつもほとんど寝てました。やっぱり疲れやすい自分がいます。前回はGarageBandをデータごと消してしまうという、VTuberやる上で1番やっちゃいけないことをしてしまいまして・・・なんとか基に近い感じで復元できたのかなと、、、まぁまぁ苦労しました。物理削除の恐ろしさ…操作ミスでVTuberの音声データを消してしまったので修復とテストしてたこんばんは…今日はほとんどグータラしてま…

今日は。。。ちょっと疲れて寝ながらパソコン操作・・・
例のfc2からWordPressに移行するプログラムが面白くて、
カスタマイズしていました。

連番ルールが原因のリンク切れ問題をもっと効率的に解消したかった

こんばんは・・・やっと週末ですね。昨日はブログを移行するためのやつを徹夜でやって、まぁ少しは改善できました・・・ブログ移行の課題。。。連番ルールが原因のリンク切れ問題を効率的に解消せよこんばんは・・・今日はテレワークでゆったりできています。ゆったりはうそか・・・テレワークでも忙しいと疲れます前回はE7ソロコン対策を引き続きやって、少し希望が見えていました。E7一発ソロコン対策でスケールの復習をしていた…

あのときのプログラム実行前の条件が、
ブログのバックアップファイルやsitemap.xmlを取ってくるようになっていました。
ただそれをやるとどのサイトにアクセスすればいいかって、
あとで見返したとき面倒だなっと。。。

もはやワンぽちでfc2のデータを可能な限り吸い上げて、
WordPress移行用に直せればと、、、

そのデータを吸い上げるところを追加しました。


import xml.etree.ElementTree as ET
import re
import requests
import os
import urllib
import urllib.request # opener
import urllib.parse # urlencode
import http
import http.cookiejar
import time

opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))

post = {
‘id’:’xxx,
‘pass’:’xxx’,
‘done’:’blog’,
‘mode’:’login’,
’email’:’xxx’,
}
data = urllib.parse.urlencode(post).encode(‘utf-8’)
time.sleep(3)
conn = opener.open(‘https://secure.id.fc2.com/index.php?mode=login&done=blog&switch_language=ja’, data) # ①
time.sleep(3) # Consider scraping
conn = opener.open(‘https://admin.blog.fc2.com/control.php?mode=control&process=backup&type=all’)
time.sleep(3) # Consider scraping
ofs = open(‘blogdata.txt’, ‘w’, encoding=’utf-8′) # ②
ofs.write(conn.read().decode(‘utf-8’))
ofs.close()

SRC_DOMAIN_NAME=”xxx” # if use mydomain
SRC_FC2_DOMAIN_NAME=”xxx” # fc2 default domain
TGT_DOMAIN_NAME=”xxx” # new address

IMG_ADDRESS=”https://blog-imgs-(\d{1,}).fc2.com/x/x/x/xxx/”

def checkBlogCardTag(line):
if “fc2-blogcard” in line:
return True
else:
return False

def replaceBlogCardTag(line):
new_line = re.sub(r”fc2-blogcard”, “fc2-fc2-blogcard”, line)
return new_line

def replaceLinkInBlog(line):
new_line = re.sub(r”(“+SRC_DOMAIN_NAME+”|”+SRC_FC2_DOMAIN_NAME+”)/blog-entry-(\d{1,}).html”,
TGT_DOMAIN_NAME+r”/blog-entry-\2″, line)
if SRC_DOMAIN_NAME in line or SRC_FC2_DOMAIN_NAME in line:
new_line = re.sub(r” target=\”_blank\””, “”, new_line)
return new_line

def replaceImgLinkInBlog(line):
new_line = re.sub(r”(“+SRC_DOMAIN_NAME+”|”+SRC_FC2_DOMAIN_NAME+”)/img/”,
TGT_DOMAIN_NAME+r”/wp-content/uploads/fc2data/”, line)
new_line = re.sub(r”(“+IMG_ADDRESS+”)”,
TGT_DOMAIN_NAME+r”/wp-content/uploads/fc2data/”, new_line)
if SRC_DOMAIN_NAME in line or SRC_FC2_DOMAIN_NAME in line:
new_line = re.sub(r”.jpeg/”,”.jpeg”, new_line)
new_line = re.sub(r”.jpg/”,”.jpg”, new_line)
new_line = re.sub(r”.png/”,”.png”, new_line)
new_line = re.sub(r” target=\”_blank\””, “”, new_line)
return new_line

# make the sluglist
r = requests.get(SRC_DOMAIN_NAME+’/sitemaps.xml’) # ③
time.sleep(3)
r.encoding=”UTF-8″
with open (‘sitemaps.xml’,’wb’) as sitemap:
sitemap.write(r.content)
tree = ET.parse(‘sitemaps.xml’)
slist = []
for i in tree.iter():
if “blog-entry” in i.text :
tmp = i.text.replace(SRC_DOMAIN_NAME + ‘/’, ”)
tmp = tmp.replace(SRC_FC2_DOMAIN_NAME + ‘/’, ”)
tmp = tmp.replace(‘.html’, ”) # escape parm link
slist.append(tmp)
slist.reverse() # sort asc

# insert the basename
fileobj = open(“blogdata.txt”, “r”, encoding=”utf_8″)
fileobj2 = open(“blogdataMgrt.txt”, “w”, encoding=”utf_8″)

idx = 0
while True:
line = fileobj.readline()
if line:
if not “if” in line and “PRIMARY CATEGORY:” in line: # why use condition ‘not “if”‘ : because of consider to program in blog
fileobj2.write(line)
bname =slist[idx]
fileobj2.write(‘BASENAME: ‘+bname+’\n’)
idx = idx + 1
elif SRC_DOMAIN_NAME in line or SRC_FC2_DOMAIN_NAME in line or checkBlogCardTag(line):
line = replaceLinkInBlog(line)
line = replaceBlogCardTag(line)
line = replaceImgLinkInBlog(line)
fileobj2.write(line)
elif not “if” in line and “EXTENDED BODY:” in line: # if not include the extend body, remove in blog
tmp1 = fileobj.readline()
tmp2 = fileobj.readline()
if tmp1 == ‘\n’ and tmp2 == ‘—–\n’:
pass
else:
fileobj2.write(line)
fileobj2.write(tmp1)
fileobj2.write(tmp2)
else:
fileobj2.write(line)
else:
break

fileobj2.close()
fileobj.close()

os.remove(‘blogdata.txt’)
os.remove(‘sitemaps.xml’) # ④

 

ポイントは3点、、、
(1) セッション作成後のデータ回収
①の処理にてログインした状態のセッションを作って、
②でバックアップファイルをダウンロード&保存しています。
(2) sitemaps.xmlを回収
③にてsitemaps.xmlにアクセスしてデータをダウンロード&保存しています。
(3) 一時ファイルを削除
(1)、(2)のデータは飽くまで一時ファイル、、、
それ以降の処理でWordPress用のデータに変わったものができるので、
仕事としてはやり切った・・・ということで邪魔なデータは消しています。

こんなものでしょうか。
ここまで凝るともはやプログラムを1つのファイルに収めていいモノか怪しくなりました。
やはりモジュール分割を・・・

あとブログ移行では画像やメディアなどもダウンロードしなければなりませんが、
そのロジックが思いつきませんでした。
これについては研究中です。

ただ移管するだけでなく、
同じようにブログ移管の課題を抱えている人に役立てばと思います。

ではでは、おやすみなさい。
“WordPressへの移行ツールをさらに強化して必要なファイルを取り込めるようにした” の続きを読む

にほんブログ村 音楽ブログ エレキギターへ

7月まで記事をWordPressに移行、プレリリースしてみた

※ 今回はエレキギターの話は存在しません。

こんばんは、明日から仕事です。。。
4日休めたけど終わるの早いです

前回は椅子を加えたことで宅録環境の調整を図った旨を記事にしました。

すべては椅子から・・・エレキギター初心者によるギター用の環境を見直し結果

こんばんは・・・今日は昨日より雨がひどいですね。私は家にこもっていました。前回は価値のない記事になってまして・・・それでも見ていただいているのがありがたいです。今日はあまり進展せず・・・あと雨がすごい※今回の記事は、たぶん追記が本番です・・・こんばんは・・・昨日に引き続き、とりあえず休み堪能しています。前回は夏祭りのサビ部分をフェアリー社譜面に差し替えるというテコ入れを加えつつ、その部分だけ練習し…

今回はタイトルの通り、、、とうとうやってみました。
以前から本当に移行できるか試験環境使って、、、
まぁ実験の範囲では突破できそうだったのでやってみました。
7月までの記事を展開しています。
(範囲外になってしまったものは後述)

以下の画像からクリックすると入ることができます。

WordPressのブログ

9月末には完成させてリリースできるといいなと思っています。
ちなみにfc2に設定した独自ドメインは11月まで残るので、
残った時間で検索エンジンとかの配慮が必要になりそうです。
(あとfc2のブログ自体は記事を開いたら10秒後に、
新しいサイトにリダイレクトする前提で当面残して置く予定です)

最初、今後の成長のためWordPressを使えたらと思いつつ、
移行がつらくて、、、やめてしまおうとも思いました。
500記事近くある投稿のそれぞれに埋め込んだリンクを見直すのは移行の最大の課題で、
普通にやったら1週間ぐらいはかかりそうなものだからです。
それが以前の時点でワンクリックで一括変換できる仕組みを作ったのは、大きいですね。

連番ルールが原因のリンク切れ問題をもっと効率的に解消したかった

こんばんは・・・やっと週末ですね。昨日はブログを移行するためのやつを徹夜でやって、まぁ少しは改善できました・・・ブログ移行の課題。。。連番ルールが原因のリンク切れ問題を効率的に解消せよこんばんは・・・今日はテレワークでゆったりできています。ゆったりはうそか・・・テレワークでも忙しいと疲れます前回はE7ソロコン対策を引き続きやって、少し希望が見えていました。E7一発ソロコン対策でスケールの復習をしていた…

ただそれでも課題が残っていて、今回さらに調整はしています。
その結果が以下です。

※ 端末によってはちゃんと映らない、枠からはみ出る可能性があります。


import xml.etree.ElementTree as ET
import re

# prepare
# - login to user
# - download from https://admin.blog.fc2.com/control.php?mode=control&process=backup&type=all
# - download from https://{domain}/sitemaps.xml
#

SRC_DOMAIN_NAME="{old domain}" # if use mydomain
SRC_FC2_DOMAIN_NAME="{fc2 domain name}" # fc2 default domain
TGT_DOMAIN_NAME="{new domain}" # new address

IMG_ADDRESS="https://blog-imgs-(\d{1,}).fc2.com/x/x/x/xxxxxxx/" ①

def checkBlogCardTag(line):
if "fc2-blogcard" in line:
return True
else:
return False

def replaceBlogCardTag(line):
new_line = re.sub(r"fc2-blogcard", "fc2-fc2-blogcard", line) ②
return new_line

def replaceLinkInBlog(line):
new_line = re.sub(r"("+
SRC_DOMAIN_NAME+"|"+SRC_FC2_DOMAIN_NAME+")/blog-entry-(\d{1,}).html",
TGT_DOMAIN_NAME+r"/blog-entry-\2", line)
if SRC_DOMAIN_NAME in line or SRC_FC2_DOMAIN_NAME in line:
new_line = re.sub(r" target=\"_blank\"", "", new_line)
return new_line

def replaceImgLinkInBlog(line): ③
new_line = re.sub(r"("+SRC_DOMAIN_NAME+"|"+SRC_FC2_DOMAIN_NAME+")/img/",
TGT_DOMAIN_NAME+r"/wp-content/uploads/{img folder}/", line)
new_line = re.sub(r"("+IMG_ADDRESS+")",
TGT_DOMAIN_NAME+r"/wp-content/uploads/{img folder}/", new_line)
if SRC_DOMAIN_NAME in line or SRC_FC2_DOMAIN_NAME in line:
new_line = re.sub(r".jpeg/",".jpeg", new_line)
new_line = re.sub(r".jpg/",".jpg", new_line)
new_line = re.sub(r".png/",".png", new_line)
new_line = re.sub(r" target=\"_blank\"", "", new_line)
return new_line

# make the sluglist
tree = ET.parse('sitemaps.xml')
slist = []

for i in tree.iter():
if "blog-entry" in i.text :
tmp = i.text.replace(SRC_DOMAIN_NAME + '/', '')
tmp = tmp.replace(SRC_FC2_DOMAIN_NAME + '/', '')
tmp = tmp.replace('.html', '') # escape parm link
slist.append(tmp)
slist.reverse() # sort asc

# insert the basename
fileobj = open("blogdata.txt", "r", encoding="utf_8")
fileobj2 = open("blogdataMgrt.txt", "w", encoding="utf_8")

idx = 0
while True:
line = fileobj.readline()
if line:
if not "if" in line and "PRIMARY CATEGORY:" in line:
fileobj2.write(line)
bname =slist[idx]
fileobj2.write('BASENAME: '+bname+'\n')
idx = idx + 1
elif SRC_DOMAIN_NAME in line or
SRC_FC2_DOMAIN_NAME in line or checkBlogCardTag(line): ④
line = replaceLinkInBlog(line)
line = replaceBlogCardTag(line)
line = replaceImgLinkInBlog(line)
fileobj2.write(line)
elif not "if" in line and "EXTENDED BODY:" in line:  ⑤
tmp1 = fileobj.readline()
tmp2 = fileobj.readline()
if tmp1 == '\n' and tmp2 == '-----\n':
pass
else:
fileobj2.write(line)
fileobj2.write(tmp1)
fileobj2.write(tmp2)
else:
fileobj2.write(line)
else:
break

fileobj2.close()
fileobj.close()

前回からの差分はソースコード内にあるように5か所です。
・①、③について、画像を表示しているパスやリンクを一括変換しました。
・②について、おそらくWordPress専用のブログカードが必要になると思ってて、
 私の場合fc2専用のタグをつけたブログカードになっているため、
 後で識別できるように、そしてfc2の時のレイアウトを維持できるようにしています。
・④について、上記もろもろの変換処理に移る判定プログラムです。
・⑤について、fc2からデータをエクスポートするとExtend Bodyという、
 追記の内容を管理しているパラメータを取るのですが、
 これ。。。空の場合でもとりこんでしまうんですよね、、、
 WordPressでインポートしたときに全記事に「続きを読む」とか入ってしまうので、
 スキップするものを入れてます。

ここまでくればfc2側からの移行は、
おそらくほぼほぼ出来上がったと思っています。
WordPress側ですね・・・

・どうやってブログカードを作るか
・「いいね」をどうやって埋めるか
・「ブログランキング」をどうやって埋めるか
・モバイルでどう運営するか

ここら辺が残課題になっています。
粛々と突破できればと思っています。

ではでは、今日もお疲れ様です。
“7月まで記事をWordPressに移行、プレリリースしてみた” の続きを読む

にほんブログ村 音楽ブログ エレキギターへ

連番ルールが原因のリンク切れ問題をもっと効率的に解消したかった

こんばんは・・・やっと週末ですね。
昨日はブログを移行するためのやつを徹夜でやって、
まぁ少しは改善できました・・・

ブログ移行の課題。。。連番ルールが原因のリンク切れ問題を効率的に解消せよ

こんばんは・・・今日はテレワークでゆったりできています。ゆったりはうそか・・・テレワークでも忙しいと疲れます前回はE7ソロコン対策を引き続きやって、少し希望が見えていました。E7一発ソロコン対策でスケールの復習をしていたこんばんは・・・しごと疲れが半端ないです。といいつつ前回のWordPressとかハマって抜け出せなくなって、睡眠時間がーーーーーーーーーーーーー(昨日も調査しすぎてブログ書けなくなる始末。。。…

それでもいくつかごり押しだったりするので、
もう少しスマートにならないかとプログラムをいじってみました。
というか前提になっていたものをもう少し工夫しまして。。。

例のブログ一覧ですがドメインに「/sitemaps.xml」を付けると、
xml形式でブログのURLリストが出てくるようで、
これ・・・前回の記事番号リストを手作業で作るよりずっとスマートな気がして・・・
(そういうの無いと思ってた)

というわけで、もう少し頑張ってみました。

import xml.etree.ElementTree as ET
# prepare
# - login to user
# - download backup data
# - download from https://{domain}/sitemaps.xml
SRC_DOMAIN_NAME="https://{domain}/" # if use mydomain
SRC_FC2_DOMAIN_NAME="https://{fc2-domain}/" # fc2 default domain
TGT_DOMAIN_NAME="{new domain}"

# make the sluglist
tree = ET.parse(‘sitemaps.xml’) #①
slist = []
for i in tree.iter():
if “blog-entry” in i.text :
tmp = i.text.replace(SRC_DOMAIN_NAME + ‘/’, ”)
tmp = tmp.replace(SRC_FC2_DOMAIN_NAME + ‘/’, ”)
slist.append(tmp)
slist.reverse() # sort asc②

# insert the basename
fileobj = open(“blogdata.txt”, “r”, encoding=”utf_8″)
fileobj2 = open(“blogdatawithslug.txt”, “w”, encoding=”utf_8″)
idx = 0
print(len(slist))
while True:
line = fileobj.readline()
if line:
fileobj2.write(line)
if not “if” in line and “PRIMARY CATEGORY:” in line: #③
bname =slist[idx]
fileobj2.write(‘BASENAME: ‘+bname+’\n’)
idx = idx + 1
else:
break
fileobj2.close()
fileobj.close()

主な変更点をザックリ解説すると、、、
① sitemap.xmlは手元にダウンロードして、読み込むものを追加、後の処理は、そこからblog-entry。。。のつくURLを抽出してます
② sitemap.xmlのblog-entryは降順ですが、バックアップデータが昇順なので、その順番を合わせるために逆順するreverse()メソッドを入れてます。ちなみにsort()メソッドというのもあるのですが、記事番号が{1,2,3・・・}ではなく{1,10,2,・・・}という順番になってしまうのでやめました。
そっちのほうがいいんだけど・・・
③ 昨日のif文で「PRIMARY CATEGORY:」を含む行の下にbasenameを入れる処理を書いたのですが、それにandの判定を追加しました。これがないと昨日の記事のプログラム例そのものが、判定に使われてしまいプログラムエラーになるためです。

という技術的なことですいません。。。
でもこれがやったことのすべてなもので。。。

これでやったら結果は同じだし、
一度作ったならわざわざとは思いましたが、
他にも同じ悩みを抱えている人に役立てばとやってみました。

まさかのギターブログにこの記事ですが、
参考に利用ください。

本当にワードプレスに移行できてしまう可能性が上がりました・・・
もう少し調査次第ですが、一番重いのがリンク付けだと思うので、
やってみますか・・・

ではでは、おやすみなさい。
“連番ルールが原因のリンク切れ問題をもっと効率的に解消したかった” の続きを読む

にほんブログ村 音楽ブログ エレキギターへ

ブログ移行の課題。。。連番ルールが原因のリンク切れ問題を効率的に解消せよ

こんばんは・・・今日はテレワークでゆったりできています。
ゆったりはうそか・・・テレワークでも忙しいと疲れます

前回はE7ソロコン対策を引き続きやって、
少し希望が見えていました。

E7一発ソロコン対策でスケールの復習をしていた

こんばんは・・・しごと疲れが半端ないです。といいつつ前回のWordPressとかハマって抜け出せなくなって、睡眠時間がーーーーーーーーーーーーー(昨日も調査しすぎてブログ書けなくなる始末。。。)サーバが本来の使い方ではないが・・・有名なCMSのWordPressに触れてみたこんばんは・・・今週もはじまって大変です。最近暑くてじめじめしてます。前回はVTuberが荒ぶる動画を公開しまして。。。やっぱり高身長を考慮できなかった…

今回は何となく手を付けているワードプレスの調査をしていました。
そんなに調べてるなら移行したいなーーー

個人的に悩んでいるfc2ブログからワードプレスへ移す課題として、
やっぱりブログ内にリンクを付けた場合ですね・・・

過去の記事が経緯となって今の自分があるというのを示すために、
過去記事のリンクをつけているのですが、
ブログサービス変えるとURL体系変わってリンク切れになるんですよね・・・

fc2の場合、記事のリンクは
https://ドメイン/blog-entry-(記事番号).html
なのですが、、、

この記事番号というのが非常に厄介で、
記事を立てるごとに自動的に作られるこの番号・・・
途中の記事を消すと欠番がでてしまうのです。

またブログデータをエクスポートするときに、
記事番号が引き継がれないので、
他のサービスでインポートした時に記事番号が連番通りになるんですよね。

このように他のサービスとの連番体系が異なると、
移行でパーマリンクが切れる原因になるんですよね。。。
これに関してfc2からの移行手順を紹介している記事の大半は、、、
大変だけど頑張って直してね・・・でした・・・

やっぱりここはだめか・・・どうやって500近い記事を移行するか。。。
うんもう一つ方法がありました・・・作ってしまえと・・・

まずfc2ブログの管理画面で、
ホーム > 記事の管理 > 「#」
をクリック(表示件数を100にするとなおよい)。。。

そうすると記事番号が載った表が出るので、
表ごとコピペしてエクセルかなんかに貼って・・・
昇順ソートかけて・・・・数式で前後に「blog-entry」や「.html」が付くように加工して。。。
1列目のデータをメモ帳にコピペしてーーーの
そうすると以下のようなパーマリンクのリスト(今回は便宜上「slug.txt」という名前で)ができまして・・・
(あえて記事番号29が欠番の部分を引っ張ってます)

・・・
blog-entry-24.html
blog-entry-25.html
blog-entry-26.html
blog-entry-27.html
blog-entry-28.html
blog-entry-30.html
blog-entry-31.html
blog-entry-32.html
・・・

ここまでは前座

ここからが本番で。。。自由にプログラムですね・・・

用意するのは
①上記の説明で書いた記事番号のリスト(slug.txt)
②ブログのインポートファイル(今回は「blogdata」という名前で)
(fc2ブログ管理画面 > データバックアップからダウンロードで・・・)
です。

これを使ってワードプレスのパーマリンクに必要な
パラメータ名「BASENAME」というものを埋め込むプログラムをつくりました。
(fc2のブログをバックアップしても「BASENAME」は出てこない)

もろにざっくりですがこんな感じです。
言語はPythonで・・・

 

fileobj = open("blogdata.txt", "r", encoding="utf_8")
fileobj2 = open("slug.txt", "r", encoding="utf_8")
fileobj3 = open("blogdatawithslug.txt", "w", encoding="utf_8")
while True:
line = fileobj.readline()
if line:
fileobj3.write(line)
if "PRIMARY CATEGORY:" in line :
print(line)
line2 = fileobj2.readline()
fileobj3.write('BASENAME: '+line2)
else:
break
fileobj.close()
fileobj2.close()
fileobj3.close()

 

これをやると移行前と後のパーマリンクが、同じ記事番号でインポートされるというわけです。
ただ「.」はサニタイズ。。。つまり不正に使われないよう加工されるしようのためか、
「.html」の部分が「-html」に変わったりするので、
そこは別の手段が必要ですが。。。。

とりあえず記事番号を加工出来たら何とかなる気がしています。

ちなみに29番目である以下の記事をワードプレスに移行したらどうなったかテストもしてみました。
(つまりパーマリンク「blog-entry-30.html」)

目指せBPM+20!単音弾きのスピードアップに向けた練習量の検証(評価編)

本記事では単音弾きスピードアップに向けた検証に関する評価を書きます。行動フェーズで単音練習のため2つの曲をひたすら練習して、Cメジャースケールについてはスピードアップしたが、二重の虹はまだ練習が必要という結果になりました。これについての評価を以下の2つの観点で書きます。・定量的評価:数値からの評価・定性的評価:数値では表せないが特徴からの評価① 定量的評価まずCメジャースケールの練習結果について、BPM+20…

ワードプレスに移行した結果、、、URLちっちゃすぎてすいません。
一応、パーマリンクの記事番号が30でfc2と一致していることを確認できました。

ワードプレス

やべーーー不完全だけど、、、理想の変換作業できちゃったよ。。。
これがブログ移行の課題の1つだったので、
本当にできてしまうかもわかりません。

勉強の意味も兼ねてやってみると、
いろいろがんばれそうです・・・
ところで・・・ギターの出番は・・・ありません

夜中に何してんだ感(7/16の2時になってしまった・・・)
もう・・・というかマジで寝ます。
おやすみなさい。
“ブログ移行の課題。。。連番ルールが原因のリンク切れ問題を効率的に解消せよ” の続きを読む

にほんブログ村 音楽ブログ エレキギターへ