びしょの日記 (vipshota’s diary)

これはショタコン的視点からの雑多な日記帳です。まじめな記事が5割、ふまじめな記事が5割でできています。将来黒歴史になる予定です。

子供を製造する話

大人になると、自分でコントロール出来ないことが増える。

就職は一番最初にぶち当たる案件で、全員が同じテストである点数さえ取れれば入学できた大学とは異なり、就職は全員が同じテストでもなければ、点数化されるわけでもない。企業の意向もあるし、企業側の立場からすれば学生の意向があり、そう簡単にマッチングが取れるものではない。

子供を製造する話もやはりコントロール出来ないことが多い。結婚せずに子供を製造しようとすると色々と文句を言われるし、結婚するには相手を一人に選ぶ必要がある。色々製造して良いものを選ぶなんてできないし、精子ガチャと卵子ガチャ次第なところが大きい。一方、子供にとっては親ガチャ次第なところが大きいわけで、耳が痛い話である。

f:id:vipshota:20190513000253p:plain:w200

同人誌即売会、僕(一般参加)的目線からのコメント

これまで、10年近くにわたり同人誌即売会に参加してきた。 多くの即売会を見て、何百冊も購入する中で、買う側の視点で色々思うことが溜まってきた。 そこで、僕が一般参加の目線で何を見て何を感じているのか、少しまとめておきたい。 10年後には様々な進歩もあり、また別の感想が生まれるだろう。

サークルスペースで明記されていると有り難いもの

  1. 新刊 か 既刊 か (または発行年月日 または発行イベント名)
  2. 簡単な内容、二次創作ならタイトルとカップリング
  3. 内容をアピールする表紙 表紙詐欺大歓迎
  4. サークルのスペース番号と記号
  5. サークル名と作者名(ペンネーム)の両方
  6. 大きな字・高コントラストで

新刊 or 既刊

新刊 か 既刊か(もしくは発行年月日)を本の外に書いてくれていないサークルさんがちらほらいる。 新刊と書いているのに、過去のポップを流用しているのか、その日が売る初日ではない場合もある。 発行日はその本を手に取って、奥付を見れば分かるので、これらの情報を見えるところに書かなければいけないというわけではない。 だが、書いておいてくれているととてもありがたい。

発行日がすぐに分かるようになっていれば、気になるサークルで、僕が過去に参加したイベント以降に発行した本を全部買う、などという買い方もできるようになるのだ。

簡単な内容、二次創作ならタイトルとカップリング

本のタイトル、媒体名(オリジナルか二次創作ならそのタイトルやカップリング)、小説か漫画かイラスト集かなど、簡単な説明などを書いてくれるととてもありがたい。 書いていなくてもその本を手に取って中身を見れば分かるから問題はないが、やはりあるとうれしい。

表紙

表紙は重要だ。とにかく重要だ。僕の購買のきっかけの9割は表紙と言っても過言ではない。気になる表紙の本はまず手に取るようにしている。表紙詐欺大歓迎である。 表紙を頑張ってくれている作家さん、本当にありがとう。そして、これからもよろしくお願いします。

サークルのスペース番号と記号

スペース番号や、島の記号を、目に付くところに書いてくれているサークルさんは意外と少ない。 なくても、この机の端から何番目だからこのサークルのスペース番号は・・・と考えればよいし、サークル名やペンネームで識別すれば良いのだけれど、あれば助かるということもある。大手さんは書く傾向にあるよね。

サークル名と作者名(ペンネーム)

ポップ・ディスプレイでも、同人誌の裏表紙でもいいので、サークル名と作者名(ペンネーム)をアピールしていただきたい。 最近、同人誌の裏表紙にサークル名やペンネームを登録名のママではなくローマ字表記にして書くのが流行っている。 僕はローマ字表記を読むのに慣れていない。登録名をそのまま書く形式が流行ってくれると個人的にはうれしい。

大きな字・高コントラストで

ポップを作る時、デザインを実物大にしたら、いちど3メートルほど離れて見て欲しい。その字の太さ、字の大きさ、コントラストで本当に大丈夫かと確認してほしい。それなりに大きい字、高コントラストというのは、僕みたいに視力の低い人でも遠くから読めるので、とてもありがたいのだ。目に入るだけで新しい可能性も広がるので、ぜひ気にかけてほしい。

僕向け

個人的にいくつかの心がけをしている。

  1. 相手の目を見て買う、買ったあとに「ありがとう」と言う
  2. サンプルを見るときは汚さない、折り目を付けない、そおっと見る
  3. 迷ったらサンプルを見る、迷ったら買う
  4. 列のないサークルを優先する
  5. 小規模なイベントなら全サークルをくまなく見る。大規模なイベントなら関連の島をくまなく見る
  6. 人が多いときには挨拶に行かない、自分の挨拶で他の人が買ったり見たりするのを邪魔しない。挨拶の際はツイッターのプロフィール画面を見せる。
  7. サンプルを見るときも2列になるようにし、隣のスペースにはみ出さない
  8. 他のサークルの列で邪魔されてしまっているサークルは、体をねじ込んででも見に行く

今後とも、サークルの皆さんの参加と頒布を心から楽しみにしています。

某つぶやき投稿サイトからプロモーションを消す試み

chrome.google.com

だいたい消せればいいということで。

$(function(){
var timerId = setInterval(function () {
 $('span:contains("プロモーション")').each(function(){
  if($(this).text() == "プロモーション"){
   $(this).parent().parent().parent().parent().parent().parent().parent().parent().parent().css('display', 'none');
  }
 });
}, 1000);
});

某画像投稿サイトから、フォロワーの画像を一括ダウンロードする試み

先人たちのソースコードを参考にしています。

get_api.py

from pixivpy3 import *
import json

def get_api():
    with open("client.json") as f:
        client_info = json.load(f)

    # pixivpyのログイン処理
    api = PixivAPI()
    api.login(client_info["pixiv_id"], client_info["password"])
    aapi = AppPixivAPI()
    aapi.login(client_info["pixiv_id"], client_info["password"])

    return api, aapi

get_following_userID.py

from pixivpy3 import *
import json
from time import sleep
import sys
import io
import re
import os
from robobrowser import RoboBrowser


def get_following_userID(api, aapi):

    # フォローユーザーの総数を取得
    self_info = aapi.user_detail(client_info["user_id"])
    n_following_users = self_info.profile.total_follow_users

    # フォローユーザー一覧ページのページ数を取得
    if(n_following_users % 48 != 0):
        pages = (n_following_users // 48) + 1
    else:
        pages = n_following_users // 48

    #タグ除去用
    p = re.compile(r"<[^>]*?>")
    # [jump:1]形式除去用
    jump = re.compile(r"\[jump:.+\]")
    #ファイルエンコード設定用
    character_encoding = 'utf_8'

    # Webスクレイパーのログイン処理
    pixiv_url = 'https://www.pixiv.net'
    browser = RoboBrowser(parser='lxml', history=True)
    browser.open('https://accounts.pixiv.net/login')
    form = browser.get_forms('form', class_='')[0]
    form['pixiv_id'] = client_info["pixiv_id"]
    form['password'] = client_info["password"]
    browser.submit_form(form)

    # フォローユーザー一覧ページのURLを設定
    target_url = 'https://www.pixiv.net/bookmark.php?type=user&rest=show&p='

    # 全てのフォローユーザーのユーザIDを取得
    following_users_id = []
    for i in range(1, pages + 1):
        print(target_url + str(i))
        browser.open(target_url + str(i))
        following_users = browser.find(class_='members')
        for user in following_users.find_all("input"):
            following_users_id.append(user.get("value"))
        sleep(3) # ページを移動したら一時待機する(マナー)

    print(following_users_id)
    print("# of following users",n_following_users)
    print("# of obtained following users",len(following_users_id))
    with open("following.json", "w") as f:
        json.dump(following_users_id, f, indent=1)
    return following_users_id

get_illustrations.py

from pixivpy3 import *
import json
from time import sleep
import os

def get_illustrations(api, aapi, illustrator_pixiv_id, DL_flag=False):

    # 最大作品数
    max_works = 3000

    # 入力された絵師IDから絵師情報を取得
    json_result = api.users_works(illustrator_pixiv_id, per_page=max_works)
    
    # アカウントは停止ユーザー
    if "pagination" not in json_result:
        return

    total_works = json_result.pagination.total

    # 投稿数が0
    if total_works == 0:
        return

    illust = json_result.response[0]

    # 絞り込み条件
    # target_tag = "target_tag"

    if not os.path.exists("./pixiv_images"): # 保存用フォルダがない場合は生成
        os.mkdir("./pixiv_images")
    saving_direcory_path = "./pixiv_images/" + str(illustrator_pixiv_id) + "/"
    if not os.path.exists(saving_direcory_path):
        os.mkdir(saving_direcory_path)

    # ダウンロード
    #print(f"Artist: {illust.user.name}")
    #print(f"Works: {total_works}")

    results = []

    for n_work in range(0, total_works):
        if n_work >= max_works:
            break
        
        # DL画像を絞り込む場合
        # if target_tag not in illust.tags: #タグによる絞り込み
        #   continue

        illust = json_result.response[n_work]
        print(f"Works: {n_work + 1}/{total_works}, Download: {DL_flag}",end="\r")
        #print(f"Title: {illust.title}")
        #print(f"URL: {illust.image_urls['large']}")
        #print("Caption: %s" % illust.caption)
        #print(f"Tags: {illust.tags}")
        illust.caption = "" # 出力する際、冗長なので削除、コメントアウト可
        results.append(illust)

        image_urls = []
        if illust.is_manga:
            # 漫画の場合
            work_info = api.works(illust.id)
            for page_no in range(0, work_info.response[0].page_count):
                page_info = work_info.response[0].metadata.pages[page_no]
                image_urls.append(page_info.image_urls)
        else:
            # イラストの場合
            aapi.download(illust.image_urls.large, saving_direcory_path)
            image_urls.append(illust.image_urls)

        if DL_flag:
            for image_url in image_urls:
                exp_path = os.path.join(saving_direcory_path, image_url.large.split("/")[-1])
                #ダウンロード済みを確認
                if not os.path.exists(exp_path):
                    aapi.download(image_url.large,saving_direcory_path)
                    sleep(3) # ページを移動したら一時待機する(マナー)
                else:
                    print(exp_path,"exists.")

    print()

    with open(f"./logs/{illustrator_pixiv_id}.json", "w",encoding="utf-8") as f:
        json.dump(results, f, indent=1, ensure_ascii=False)

main.py

import get_following_userID
import get_illustrations
import get_api
from time import sleep

api, aapi= get_api.get_api()

ids = get_following_userID.get_following_userID()

for i, id in enumerate( ids):
    print(f"Users: {i+1}/{len(ids)}, ID: {id}")
    get_illustrations.get_illustrations(api, aapi, int(id), False)
    sleep(1)

大量の画像をダウンロードすると、サーバーと回線に負荷を与える可能性があります。兵庫県警や神奈川県警等に恣意的な検挙を受けないためにも、負荷を与えないようにして使ってください。

体操協会が宮川選手に反省文を要求した決定でネットで体操協会への批判が噴出している件についてのまとめ

兵庫県警が不正プログラムと主張するJavaScript無限ループが記載されたページのURLを書き込みした女子中学生を補導した件についてのまとめ

ショタとは何か

 田中太郎さんが面白い企画をやってくれていたので、絵も小説もかけない僕だけれども、乗ってみようと思ったのである。

企画: #ショタベントカレンダー2018 Advent Calendar 2018 - Adventar

 僕が常日頃から考える「ショタ」の定義が幾つかある。日頃ツイッターでつぶやいていることのまとめになってしまうが、この機会に最近話題にしている2つの観点を紹介しようと思う。長文になるので頑張って読んで欲しい。

 「ショタ」を語るにあたりしばしば議論になるのは「年齢」との相関である。高校生はショタなのか、中学3年生はショタなのかという激論を数多く見てきた。結末が出たことはいまだかつて見たことがない。しかし、ショタの年齢の上限というものは存在すると思う。それは、18歳の壁である。児童福祉法風営法、淫行条例、婚姻適齢、公職選挙法子供の権利条約など、多くの条例や法律や条約によって18歳前後、または20歳前後では大人・子供の区分けされている。詳細は下記の投稿を参照して欲しい。

子供と大人の区分 12歳から20歳編 - びしょの日記 (vipshota’s diary)

 しかし、これは現代の法に縛られる存在に限るわけで、例えば過去の話とか、異世界の話とか、妖怪の類いとか、そのような場合にさて年齢という概念が本当に重要なのかというと、実は難しい問題なのかもしれない。現行法に縛られるのだとしたら、ショタ(法律上は少年)は18歳未満であるという説を強く推したい。法に縛られないのなら外見と社会的立場次第であろう。

 「ショタ」を語るにあたり外せないのは「成長」である。創作物に出てくるショタを成長させるべきか否かという激論は数多く見てきた。この激論の中で死んでいったショタコンも数多く見てきた(笑)。成長させるべきかどうかについては結論がでなくても、ショタは「成長」できる存在であると思うし、そうあるべきだと思っている。ここでいう「成長」というのは不可逆な「変化」を言う。「成長」したら元に戻れないのが「成長」である。だからこそ成長前は貴重であるし、成長過程も貴重なのだ。

 ショタの「成長」を語るにあたり、ポケモンのアニメシリーズにおけるサトシの存在は欠かせない。サトシは20年以上に渡りポケモンテレビアニメシリーズ(アニポケ)の主人公を務めてきた。初登場時に10歳だったサトシが、20年後の今もやはりほぼ同じ10歳の肉体年齢で、ポケモンの世界を子供達に伝えるために奮闘しているのがアニポケなのである。20年以上に渡り主人公を背負わされてきた弊害はたくさんある。それは、簡単に「成長」させられない存在になってしまったということだ。

 初めてサトシがテレビに登場した1997年頃、サトシは未熟で不完全な存在だった。最初は失敗の連続であったが、その度に何かを学びどんどん成長していった。彼を取り巻く人間関係は数年ごとにリセットされるが、彼が成長したことをリセットさせるのは過去の放送回との整合性から難しい。人間関係は「変化」できるが、失敗から学ぶのは「成長」であり人間関係と違って蓄積されていくものだからだ。

 今、サトシはアローラ地方でこの20年間と変わらず親元を離れて生活しているが、最近ではサトシ自身が「成長」したと思えることはほとんどなくなってしまった。見ていない人にはピンと来ないと思うが、ここ数年で真に成長した回は「死について考えた回」(21. ニャビー、旅立ちの時!)くらいであり、ほかは新たな仲間を作る、新たな仲間と分かり合う、新しいポケモンと出会うといった「変化」が各回のテーマとなるか、もしくはサトシの新たな仲間が「成長」するのを見守るかにとどまっている。

 ショタの成長は、ショタコンにとってのジレンマでもあるし、番組制作者にとってもジレンマなのだ。成長は喜ばしいものだし、ショタの成長を見せることでメインターゲットである子供達への刺激にもなる。しかし、一度成長してしまうと元には戻れなくなる。それが成長なのだ。ショタは、このジレンマの中で生かされる存在なのだろう。

 すこし話題を変えて、子供達を取り巻く環境についてシリアスな話をしよう。

 この21世紀においても、子供達をとりまく不幸なニュースは後を絶たない。世の中には悪い大人たちが沢山いて、いまこの瞬間も子供達が様々な犯罪に巻き込まれている。一方で、子供達が成長するための小さな社会(学校など)を管理すべき大人たちがその責任を果たさず、子供達同士では解決できないトラブルにより、心を深く傷つけている子供達もいる。もちろん今すぐに何かが出来るわけではないのだが、ショタコンこそはそういう子供達がいることをたまには思い出し、解決する手段を模索することを諦めてはいけないのだと思う。

 さて、ここまでの長文をじっくり読んでくれた人にも、読み飛ばした人にも、とりあえず感謝を伝えたい。そして、ショタについて共に語ってくれる人達、ショタに関する創作物を世に出してくれる人達にも、この場を借りて感謝したい。今後もショタエロ(R-18)をよろしく頼む。

ショタベントカレンダー2018 adventar.org

癖の強いアカウントですがよかったらフォローどうぞ twitter.com

以上。