びしょの日記 (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. 他のサークルの列で邪魔されてしまっているサークルは、体をねじ込んででも見に行く

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

ツイッター(Twitter)の新UIからプロモーションを消す

chrome.google.com

だいたい消せればいいという。スクリプト仕様は自己責任で。

f:id:vipshota:20190811000258p:plain:w300

$(function () {
    var timerId = setInterval(function () {
        $('span:contains("プロモーション").css-901oao').each(function () {
            if ($(this).text().indexOf('プロモーション') == 0 && $(this).parent().parent().find('time').length == 0) {
                var p = $(this).parent().parent().parent().parent().parent().parent();
                if (p.css('display') != 'none') {
                    p.css('display', 'none');
                    console.log("ツイート上のプロモーションを非表示にした");
                }
            }
            else if ($(this).text().indexOf('によるプロモーション') > 0 && $(this).parent().parent().find('time').length == 0) {
                var p = $(this).parent().parent().parent().parent();
                if (p.css('display') != 'none') {
                    p.css('display', 'none');
                    console.log($(this).text() + 'トレンドのプロモーションを非表示にした');
                }
            }
        });
    }, 1000);
});

javascript歴3日なので、間違っていたり、こうすると可読性が上がるよというのがあれば、ぜひ教えてほしいです。

AdBlock Plusなどを使った方法は下記に書いてあるけど・・・

takachan.hatenablog.com

mrwk.hateblo.jp

まだどれも万全ではないみたい

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

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

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)

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