自分のブログ名

sheephumanのブログ

ひつじ好きな人間のブログ。

漫画村的な海賊版サイトはどういった影響を及ぼしているのか?

 

 マンガ海賊版サイトを利用する人々の大半は利用を「悪い事」だと考えておらず、様々な理屈を展開し、自分を正当化しようとする。恐らく”なんとなく後ろめたい”からであると思う。

 

 

では、「マンガ海賊版サイトは外貨の流出に等しい」と書いたのであるが、今回はそれが具体的にどういった影響を齎しているのかを論じていく。

 

 

 

一人の個人が漫画村を継続的に利用すると何が起こるのか?

・雇用が喪失し、GDPが下がり、町が不景気になる

 →経済というものは周囲の分野と密接に繋がっているため、その周辺の様々な業態の不景気に繋がっていく。

 →街から書店を閉鎖させ、中古書店も売り上げが大幅に落ちる

 →周辺の街から活気が段々失われる

 

これが漫画村が登場して以降、進んでいる現象である。

もちろん、漫画村が存在したことによるプラスの側面も無いわけではない。しかし、現状ではマイナスの側面が遥かに上回ると考えるのが妥当である。

 

業界はコロナ以前からこの状況に直面しているが、既に対応してきており、底辺ユーザーが言うところの不便さはほぼ解消されている。あとは利用に際して好みがあるに過ぎない。

 

 

漫画村の存在によるプラスの影響

・今まで存在すら知らなかった作品の存在を知る事が出来た

→そのため、続刊が発売されたらその本だけを購入した という事がたびたび起きている

電子書籍で見るという事の便利さが広まった

・更新が早く、あらゆる作品が無料で読めて便利である

・今まで顕在化してこなかった新たなニーズを掘り起こした

・マンガ業界のオンライン配信、サブスクリプション制が広まる事の切っ掛けとなった

 

 

漫画村の存在によるマイナスの影響

・マンガを通して構築されるべき広範な人間関係が失われた

・正規品の購入が減った

・ある作品の最新巻のみが買われるようになった

 →古いものは海賊版サイトでタダ読みすればいいよね、となりやすい

 →全巻買うものはよほど好きな作品だけ となりやすい

 

・書店、オンライン書店、中古品流通など、本来有料で買われるべきあらゆるものの売り上げが将来に渡って継続的に減少している。

 

・作家の生活持続性が失われ、プロとして生きて行くという事がほぼ不可能になる。

 →取材費も捻出出来ないので、画一的でローコストな作品以外は生産しにくくなった

 →現在生活出来るのはごく一部の有名なプロ作家たちのみである

 

よって、漫画村的なサイトの文化的な役割はとっくに終わっているものと解釈していい。日本の業界は彼らの存在をこれ以上許容できないし、すべきではない。

 

漫画村系サイトと正式なマンガ配信サービスとの違い

 漫画村

・全て無料である

・人気のある作品はだいたい全て読める

・広告ブロッカーがないと快適に読めない

 →大抵のサイトはかなり大量の広告を読み込ませたり、リダイレクトで勝手に飛ばしたりする

・一部サイトはUIも洗練されてきている

 →お気に入りへの追加や追加人数の表示なども行われているサイトがある

・正式なサービスではないため、正式なサービスにあるべき様々な文章が書かれていない

・正式なサービスではないため、作品に対してコメントが出来ないか、しづらい

・対価を払わずに読めるため、作品制作のコストが意識されなくなる

 

 

正式なマンガ配信サービス

・最初の数話から無料で、場合によってはキャンペーン等でまとまった話数は読める

・コメントが出来るので、交流が活発である

・一定の話数以降は有料である。 

・一部には広告がある

・いいね数などで人気が可視化されている

 

漫画村系サイトを利用する人々の詭弁

漫画村系サイトは業界によりよいサービスを提示してやっているんだ的な論旨

 前回の記事でも書いたが、既にマンガのサブスクリプション制もあるし(月額550~1480円ぐらい)、マンガ喫茶もあるので、ユーザーがマンガを愉しめる多様な環境は一通り揃っていると解釈していい。それは2020年以前までに言われている事であって、既に周回遅れの認識と言わざる負えない。つまらない言い訳はもうやめよう。

 

 

漫画村系サイトがあるからといって、売上減少には繋がっていない。売上の減少は出版社等の業界の怠慢である

 これに関してはやや複雑な経路があるの考えられるのだが、少なくともマンガ村が存在しない2000年代を考えてみて欲しい。

 そしてオンライン配信も適切な議論や作家とのやり取り、法的手続きに則って行われ、海賊版サイトは存在はしていてもアングラ的で小規模でほぼ知られていない世界というものを想像してみて欲しい。

 

気が向けばbookOffに立ち寄ったり、マンガ喫茶に行っていたあの頃である。もはやレトロにさえ感じられるのだが、あくまでもアレが普通なのである。

 

少なくとも、今より遥かに好景気になっていると考えるのが妥当である。

もし鬼滅の刃等のビッグムーブが無かったら?海賊版に駆逐されていたら?今よりもっと不景気だったのは想像に難くない。

 

確かに日本の業界は対応が遅い上に、ユーザーの快適さなんかはあまり考慮しない傾向にある。しかし、もう2023年以降は様々なマンガ配信サービスが多すぎるぐらい存在しており、適切な競争が行われている。ある程度のネットワーク帯域さえあれば読みたいマンガは快適に読める。海賊版サイトの文化的役割はとっくに終わっており、その目的だけが今もなお継続している

 

漫画村系サイトの目的

・多くのアクセスを捌くことで広告収益を得る

・コレクター的な蒐集欲や自尊心的感情を満たせる

・海外の人間(今では中国人、人など、日本を訪れて作品に興味を持った人々が中心)が日本人の若者のアクセスを当てにして運営している

マンガをわざわざ購入する「頭の悪い人」を見下す事が出来る

 

漫画村は無限に吸い続けられる阿片のようなものである

 マンガ海賊版サイトの利用には、現実に生きるコスト以外にほぼ制限がない。この事は、私たちの繋がりや文化、連帯感といったものを分断する方向に働いている。

 

漫画村系サイトの利用者とは?

・若年層や低所得者が中心

-その他、「マンガにお金を出すほどではない」と考えるより多様な層

 

 彼らは一般的に、そこまで掘り下げて考えるという能力がほぼないし、そんな面倒な事はしない。

読みたくなったらアクセスして読むという流れが全てなのであり、その行動には喫煙のようにしつこい習慣性がある。既に味を占めているし、読まないと落ち着かなくなったりもするだろう。既にビョーキであると思う。

 

 そして、手持ちの端末でほぼ無制限に読めてしまうため、彼らから「漫画村系サイ

トでマンガを読む」以外の選択肢を奪ってしまう事に繋がる。これは致命的であると言っていい。まさに阿片のごとき中毒性を有していると解釈出来る。

 

 彼らは読めない状況であったり、読む行為を否定される事に強いストレスを感じる為に理性的な判断というものが出来ず、漫画村系サイトを正当化しようとする。

 

繰り返すが、既に彼らのいう不便さはほぼ解消されている状況にある漫画村系サイトが読めるほどの帯域があれば、正式なマンガ配信サービスは問題なく読める筈である。

 

 

出版社やマンガ作家に対価を払えば、いずれ自分に返ってくる

 漫画村系サイトの存在を知ってしまうと、それらを利用したくなってしまうのは日本人の病的な習性である。しかし、正式なマンガ配信サービスを通す事で、いずれ自分の状況も好転されるという認識を持つ事が大切である。

 

 マンガ業界の市場規模は6,770億円であり電子版コミックの普及により伸びてきている状況にもある。そのうち毎年550億円ほどを漫画村系サイトに”抜かれている”※1。この事実は下手な政治家の裏金騒動よりも遥かに広範囲に影響を及ぼし、住んでいる街を不景気にしていくことだろう。

 海賊版サイトが今より半分の規模になれば、状況がある程度まで好転する事が見込める。

 

shuppankagaku.com

 

 

※1 前回の記事にも書いたが、収益をネットワーク帯域業者、広告出稿者、Cloudflare等と山分けしており、運営コスト次第では十分な収益が入ってこない事も多い。これは単なる趣味的な自己満足で運営している側面が多分にある事を示唆している。

 

 

マンガ海賊版サイトの功罪と現状 2024年2月

 

 あまりにも有名な星野ロミは相変わらずバカをやっている。恐らく彼のような人種はマンガが興味ない訳ではなく、単に社会に反発しているだけなのではないだろうか

彼がオンラインスクールを開講すると聞いて危機感を持っている。

mmake.net

彼のような人間の海外渡航は禁止されるべきだと思う。

 

 

言うまでもなくマンガ海賊版サイトは存在自体が悪なのであるが、どのように害をなすのかがあまり明確になっていない側面がある。

 

また、海賊版サイトに比する利便性を提供すべきであって、業界の怠慢だとかいう意見があるが、結局のところ欺瞞であると思う。かってのWinnyの製作者なんかもそうだが、社会的合意を経ずに他人様の権利を侵害する自由などというものは存在しない。自由というものは社会の合意の上で成り立っているからである。無法地帯とはただの無秩序であり、自由で文化的とは程遠い。

 

 

 

 

マンガ海賊版サイトの有害性

海賊版サイト一般は基本的に既存の経済構造・産業構造を弱体化させるように働く。

 

マンガ海賊版サイトについては、出版社・印刷会社・中古本業界(bookオフ等)・流通業・書籍販売店・漫画喫茶等、かなり広範囲の業界の権利を間接的に侵害している存在であり、利益を得ているのはサイト運営者・広告会社・ドメイン卸売会社・ネットワークプロバイダ業者、そして”買わずに済んだ”読者である。このアンバランスさは問題である。

 

一般的に、海賊版サイト運営者はなんらこれら権利関係者にたいして関連性を持っていない。今更言うまでもないが、殆どの作品はリーチサイト(配信サイト)、アップロード問わず、非購入者が自由に閲覧できるようにする状態というものを認めていない。

星野ロミの詭弁には呆れ返るしかなく、論外である。

 

 

易アクセス性の高さ

 一般的なブラウザを使用し、「作品名 raw」「ネタバレ」等、ごく単純な検索ワードで海賊版サイトにアクセス出来てしまう現状がある。このような方法でアクセス出来てしまう方法を提供しているgoogle社のような巨大な存在に対し、現状では何ら法的な圧力がかかっていない※1。せいぜい、集英社等の出版社が代理人として検索結果の削除申し立てを行っているに過ぎない。

 

 考えても見て欲しい。DeepWebですらなく、特別なアクセス方法など何ら必要とされていないのだ。実質的に閲覧者が摘発される訳でさえもない※1。無制限立ち読みのデジタル版である。そして大半は日本で販売されているマンガのRaw(生)データである。

 

※1 現状、”見せしめ”で摘発されるのはアップロード者だけである

 

 

 どんなに綺麗ごとをいっても人間なのでこっそりアクセスしている人も多いのではないだろうか。非常に簡単に調べられるために名前は上げないが、こういったサイトは名前を変えて存在し続けており、一時的に閉鎖されることはあっても撲滅されることはないのが現状である。恐らく、ドメインの有効期限が終わると閉鎖するのだと思う。

 

見つけたらブクマすればいいしgoogle社だけの責任に帰結するのは些か極端なきらいはあるが、だからといって何ら対策を打たないでいいという問題ではない。実際、google bookサービスに対して、google社は世界各国の出版社から何度も訴訟を起こされている※2。

 

※2 訴訟は起こされているものの、実際にはいずれも合法扱いになっている。

 

 

youtubeTwitter(x)等もあるが、あちらは良くも悪くも目立つので話題になりやすい。

 

海賊版サイトの存在意義

そんなものは経済的にも、文化的にも、ましてビッグデータとしても存在しない※3.。よく言われるように技術的には優れたものがあるのだが、運営者が広告会社から入る収益を得るのがその在り方の全てである。

 

現在ではスマホアプリから漫画が読めるものが多く、日本のもの、海外のもの問わずかなりの作品が無料で合法的に閲覧出来る。ある程度の制限下でなら一作品につき、まとまった話数が読めたりもする。

 

星野ロミの話題性の理由

「星野ロミ」が話題になったのは、その違法性と挑発的な文言も去ることながら、「そういうスキームが存在する」ということを世間に知らしめたという事実があるからである。こうして知れ渡った以上、いまさら海賊版サイトの存在意義などあるとは到底考えられない。もはや業界はオンライン配信がスタンダード化しつつあるからである。

 

 

確かにごくマイナーな作品や50年以上前の作品をライブラリ化するのは意義があるだろう。それがかなり退屈なものだとしても。マンガ図書館Zhttps://www.mangaz.com/

)など有名である。

法的グレーでやってるようなところもあるかもしれない。

 

※3 還元しようという意思があるならもっとオープンな手段をとる筈である。

 

 

主な利用者層

年間数十億以上のアクセスがあることから、ネットに接続可能な端末を持っている極めて広範囲な年齢層がターゲットだと思われる。

特に10代の若年層や年収300万以下の低所得層が多いと思われ、yahoo知恵袋で質問している様子が散見される※4

 

※4 程度がかなり低い。

 

雇用と生活持続性を奪う海賊版サイト

 作家(製作者)本人が不利益を被るのは当然として、先述したようにかなり広範な業界が現在に至るまで継続して損害を受けているのが実情である。

 

それが何を意味するかというと、雇用を奪われているに等しい状態というのが挙げられる。マンガという分野一つに限定しても、海賊版サイトという存在は2010年以前まで育まれてきた日本の出版・流通業界を解体する方向に働いている※5。

 

※5:年数は適当

 

 これは何一ついい事などないと断言出来る。日本の経済全体に対して継続的かつ将来に渡って悪影響だし、この国が豊かにならない一因を成していると思う。

 

ジョジョリオン 25巻より

 

搾取の構図

構造としては、サイト運営者・広告出稿会社・CDNサービス運営会社(CloudFlare)、ネットワーク業者などがそれらとは何ら関連性のない日本の出版業界から年間数千億という被害額を略奪して山分けしているような状態である。

 電子データなので当然ながら中古品として再流通するようなこともなく、伝統的な産業構造を解体している存在であるといえる。

 

 

 

マンガ海賊版サイトの運営法

・毎月数万-1億超というアクセスを捌くために様々な工夫をしている

 -漫画をサクサク読めるように工夫しており、その対価?として広告収入を得ている

・同じようなサイトを量産してアクセスを分散している(判明しているだけでも100を超えている)

 -ドメインホッピングと呼ばれる手法を使っている 

 3つの超巨大サイトが閉鎖された2022年以降、海賊版サイトはどうなってる? | 海賊版サイトの現在地 Vol.4 - コミックナタリー

 

CDNサービス(CloudFlare)を利用する手法が主流

 

・ZIP、RARなどのファイルをRapidGator等のサイバーロッカーサービスにアップロードし、そのLinkを張るサイトの人気も根強い

・一定期間ごとに閉鎖しているか、閉鎖させられている

 -摘発逃れの戦略も含まれていると思われる

 -購入したドメインの有効期限が切れた時点で閉鎖している?

・広告ブロッカー対策もしている(実は9割ほど回避する方法もあるが)

Twitter(X)アカウントを持つサイトもある

 

 

行われている対策

著作権侵害の第三者向け通報ページが集英社のみにある ※6

Twitter等の広告で海賊版を利用しないよう呼びかけ

・正式な配信サービスに対してABJマークを付与している

  ABJマーク AEBS 電子出版制作・流通協議会

・出版社によるgoogle検索結果の削除申し立て

 -集英社の検索結果削除申し立て(一例) 

    https://lumendatabase.org/notices/search?term=%E9%9B%86%E8%8B%B1%E7%A4%BE&sort_by=

発信者情報開示請求を行う

 

・CloudFlareに対して権利者とその代理人が異議申し立て(DMCA侵害の通報)を行う

www.cloudflare.com

なかなか煩雑らしく、テンプレートが必要かと思わる。

しかも英語でなくてはならないようである。

彼らの対応はあまり迅速ではなく、わざわざ対応しない事も多い。第三者の匿名通報は法的根拠がないことから、基本的に対応しないと考えてよい。

 

・国内接続からのサイトブロッキングが議論されているが、有名なごく一部のサイト以外は行われていない

 

 ※6 知らないだけかもしれない。他の出版社にはLinkが見当たらなかった。なので集英社に関する通報のみ行っている

 

参考資料

クラウドフレアのマンガ海賊版サイトに対する寄与に関する検証

https://www.soumu.go.jp/main_content/000816834.pdf

海賊版サイト対策の現状と課題

https://www.jstage.jst.go.jp/article/jilis/3/0/3_13/_pdf/-char/en

 

p2ptk.org

 

3つの超巨大サイトが閉鎖された2022年以降、海賊版サイトはどうなってる?

https://natalie.mu/comic/column/521247

 

直近の情勢

 最近また活発化しており、中国系とも言われている。

ジャンプ系漫画の連載作品は人気が高く、集英社のデジタル配信サイトからの購入やdl-zip等から入手して、CDNサービスにアップロードする事で低コスト運用を図りつつ莫大な収益を得ている。

 

 人気漫画だけでなく、イラストの描き方講座や小説など幅広い分野の作品が対価を伴わずに閲覧されている現状がある。

 

ほとんど経済テロといっていい悪質さが背景にあり、主だったサイトを閉鎖させて摘発するのはもちろん、易アクセス性を低下させ、全体の運営規模を縮小方向に持っていく必要があると考えられる。

 

また、対応の遅いgoogle社、CloudFlareに追加での法的圧力を掛ける必要がある。

既にある程度行われてはいるものの、あまりにも不十分な現状と言うしかない。

 

2022年02月01日 20時20分 公開

www.itmedia.co.jp

 

 

海賊版サイトを閲覧するという行為の広範な悪影響

 結局のところ、海賊版サイトの閲覧は自分の首を絞める行為に等しいと考えている。

正常な経済の流れを阻害し続けており、Webネットワークが発生してから現在まで続いている宿痾のようなものといって過言ではない。

 何が言いたいかというと、海賊版のマンガやアニメを見る行為への悪影響は作家の苦労や労力を無為にする行為であるというだけではないという事である。それはあくまでただの一側面に過ぎず、本質は外貨の流出に等しい※7

 

どう考えてもこの国が未だに貧しいのは海賊版サイトの存在に一端があると思う。

 

 この問題の本質とは、この国の経済に全く影響を与えないであろう人物※8を、将来に渡って数億円規模で儲けさせているという事。この事実があるのみである。

 

※7 だからいくら働いても2000年代以前のように年収500万とかいかないし、賃金もほぼ増えない

※8 星野ロミみたいな

 

 

 

あとがき

 とりあえずまとめました。 

この考えに至ったのはごく最近で、実のところ漸く危機感を持つに至って来たというのが実情です。

 正直なところ、これ以上便利である必要もないのではないかと感じています。昔みたいに書店で買うか、book offに探しに行くなどする方がよほど健全だし、歯止めも効きやすい。マンガアプリも悪くないし、好きな作品も海外のもの含めてたくさんあります。

 

 未だに利便性がないからどうのこうのと言う人も居ますけど、結局”タダだから貰っておく”以上の行動理由がないだけなんじゃないでしょうか。現状ではとっくにそのスキームは合法化している。つまりマンガのサブスクはふつーにあって、金を持ってなくてそこまで興味のない人は契約しない。ただそれだけ。

 

 そもそもサブスクリプション制というビジネスモデル自体、よほどうまくやらないと作家が儲かりませんし、漫画村の在り方は経済の観点でも論外だと思うんです。色んな意味で論外ですけどね.....なんでこのような形でしか世に問えないのかっていう。

 

 

マンガのサブスクリプション制サービスまとめ

Linkだけ貼っておくが  https://my-best.com/11848  月額550円~月額980円であり、相当安い。契約者数次第ではあるが、作家がこれで生活が持続できるのかどうかは疑問である。海賊版サイトのアクセスがもっと難しく、専門知識を必要とするものになれば状況は改善されると思う。

 

 

これまで摘発された主な有名サイト

漫画バンク 

「漫画BANK」摘発の舞台裏 中国農村に住む運営者を直撃 驚きの言い分とは… - クローズアップ現代 - NHK

 場所は中国・重慶 30代男性

 「30万円の没収と、60万円の罰金が科されたのみ」とのこと。

 

 

 

 

音声認識ランチャー制作における調査とテスト結果

元記事:

https://qiita.com/EndOfData/items/6ff96a5a7ce190fbf1d6

参考記事

https://wildpie.hatenablog.com/entry/2014/10/13/122909

コードに目だった漏れや記述ミスは見当たらない。 GetData1()の呼び出しが見当たらない程度。 ChatGPTにレビューさせたが同様の回答だった(凄いけどどれだけ当てに出来るのか)。

Visual studio 2022 .net7です。 最新のしか用意しないのはあまりに古くてまともに実行出来ないproject fileがやたらと多いからです。

Visual studio を使用したgitの扱いにまだ慣れていないので修正。

git clone -b BPMatching_Brunch https://github.com/Sheephuman/VoiceLancherTests.git 

追加実装 recode_Button2を追加し、同様の呼び出しと比較用List配列の宣言。

外観(と実行結果) image.png

追加実装

コントロールいくつか追加 コントロールの判定処理追加

Button fieldButton;
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            InitializeWaveIn();
            fieldButton = (Button)sender;
        }
 private void WaveIn_DataAvailable(object sender, WaveInEventArgs e)
       {
         
            // 32bitで最大値1.0fにする
            for (int index = 0; index < e.BytesRecorded; index += 2)
            {
                short sample = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]);

                float sample32 = sample / 32768f;
                if (fieldButton.Name == StartButton.Name)
                     ProcessSample(sample32, _recorded);

                else
                    ProcessSample(sample32, target_recorded);

             }


       }
     if (recode.Count == 65536)
            {
                var points = recode.Select((v, index) =>
                        new DataPoint((double)index, v)
                    ).ToList();


                _lineSeries.Points.Clear();
                _hammingLineSeries.Points.Clear();


                _lineSeries.Points.AddRange(points);
                _hammingLineSeries.Points.AddRange(HammingMethod(recode));

                plotView.InvalidatePlot(true);
                hammingPlotView.InvalidatePlot(true);

                //

                recode.Clear();

         ///以下追加実装
                MessageBox.Show("end");
                waveIn.StopRecording();                
                waveIn.DataAvailable -= WaveIn_DataAvailable;
            }
            

呼び出し

private void DpMattingButton_Click(object sender, RoutedEventArgs e)
            {
             var dp = new DPmatthing();

             dp.LoadData(_recorded,target_recorded);

             dp.StartDP();
             label2.Content = dp.BackTrace().ToString();
            }

外観(XAML

<Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Left">
            <Button Content="Start Recoding" Margin="0,0,0,10"
                        x:Name="StartButton"         Height="40" Width="100" Click="Button_Click"/>
            <Button Content="Recode 2" Margin="0,0,0,10"
                    x:Name="Recode2"            Height="40" Width="100" Click="Recode2_Click"/>
            <Button Content="DPMatching" Margin="0,0,0,10"
                          x:Name="dpattingButton"      Height="40" Width="100" Click="DpMattingButton_Click"/>
            <Button Content="Stop" Margin="0,0,0,10"
                          x:Name="StopButton"      Height="40" Width="100" Click="StopButton_Click"/>
        </StackPanel>
        <StackPanel>
        <Label VerticalAlignment="Top"
            Background="AliceBlue" Height="50" Width="700" x:Name="label1" />
        <Label VerticalAlignment="Top" HorizontalAlignment="Left"
            Background="Beige" Height="30" Width="200" x:Name="label2"
               Margin="50,0,0,0"
               />
        </StackPanel>
        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right">
            <oxy:PlotView 
             Model="{Binding oxyModel, ElementName=root}"
             Controller="{Binding Controller, ElementName=root}" 
            x:Name="plotView" HorizontalAlignment="Left" Margin="0,71,0,0" VerticalAlignment="Top" Height="270" Width="345"/>
            <oxy:PlotView 
             Model="{Binding hammingOxyModel, ElementName=root}"
             Controller="{Binding Controller, ElementName=root}" 
            x:Name="hammingPlotView" HorizontalAlignment="Left" Margin="{Binding Margin, ElementName=plotView}" VerticalAlignment="Top" Height="270" Width="345"/>
        </StackPanel>
        <StackPanel Margin="0,70,0,-70"/>
    </Grid>

DPmatthing.cs 内

public double BackTrace() { }とし、 return _minDistance; とした。 これをLabel渡してtoString()して表示させてる(大体いつもやってるやつ)

全Code

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
using System.Windows.Forms;

namespace VoiceLancherTests
    {
        internal class DPmatthing
        {
            private readonly List<double> _data1 = new List<double>();       

            private readonly List<double> _data2 = new List<double>();
       


            enum DPLabel
            {
                A, B, C, NON,
            };


            private DPLabel[,] _dplabel = null!;

            private double[,] _dpmap = null!;
            private double[,] _acumDistance = null!;
            private int _sourceLength;
            private int _targetLength;


            public int MatchedIndexBegin { private set; get; }
            public int MatchedIndexEnd { private set; get; }


            public IEnumerable<double> GetData1()
            {
                return _data1.Skip(1); // 1つめは0なので飛ばす
            }


            public IEnumerable<double> GetData2()
            {
                return _data2.Skip(1); // 1つめは0なので飛ばす
            }


            public void LoadData(List<float> source, List<float> target)
            {
                _data1.Clear();
                _data2.Clear();
                _data1.Add(0.0);
                _data2.Add(0.0);
                _data1.AddRange(source.Select(v => (double)v).ToList());
           

                _data2.AddRange(target.Select(v => (double)v).ToList());
           

                _sourceLength = 8000;
                _targetLength = 8000;
            }

            private double LocalDistance(int i, int j)
            {
                return (_data1[i] - _data2[j]) * (_data1[i] - _data2[j]);
            }

            public void StartDP()
            {
                // mapの大きさを設定
                _dpmap = new double[_sourceLength + 1, _targetLength + 1];
                _dplabel = new DPLabel[_sourceLength + 1, _targetLength + 1];
                _acumDistance = new double[_sourceLength + 1, _targetLength + 1];

                // 初期化
                // 端点フリーDPなので0
                //for (var i = 0; i < _dpmap.GetLength(0); i++)
                //{
                //    _dpmap[i, 0] = 0.0;
                //}


                for (var j = 1; j < _dpmap.GetLength(1); j++)
                {
                    _dpmap[0, j] = double.MaxValue;
                }

                for (var i = 0; i < _dplabel.GetLength(0); i++)
                {
                    for (var j = 0; j < _dplabel.GetLength(1); j++)
                    {
                        _dplabel[i, j] = DPLabel.NON;
                    }
                }

                //  for (var i = 1; i < _dpmap.GetLength(0); i++)

                //
            
                //Parallel.For(0, _dpmap.GetLength(0), i =>
                //{
                   for (var i = 1; i < _dpmap.GetLength(0); i++)
                   {

                        for (var j = 1; j < _dpmap.GetLength(1); j++)
                        {
                     
                            double a, b, c;
                            if (i - 2 < 0 || j - 2 < 0)
                            {
                                a = double.MaxValue;
                                b = _dpmap[i - 1, j - 1] + LocalDistance(i, j);
                                c = double.MaxValue;
                            }
                            else
                            {
                                a = _dpmap[i - 1, j - 2] + 2.0 * LocalDistance(i, j - 1);
                                b = _dpmap[i - 1, j - 1] + LocalDistance(i, j);
                                c = _dpmap[i - 2, j - 1] + 2.0 * LocalDistance(i - 1, j);
                            }
                            var min = Math.Min(a, Math.Min(b, c));

                            if (a == min)
                            {
                                _dplabel[i, j] = DPLabel.A;
                                _acumDistance[i, j] = _acumDistance[i - 1, j - 2] + 3;
                            }


                            else if (b == min)
                            {
                                _dplabel[i, j] = DPLabel.B;
                                _acumDistance[i, j] = _acumDistance[i - 1, j - 1] + 2;
                            }

                            else if (c == min)
                            {
                                _dplabel[i, j] = DPLabel.C;
                                _acumDistance[i, j] = _acumDistance[i - 2, j - 1] + 3;
                            }


                            _dpmap[i, j] = min + LocalDistance(i, j);


                        
                        }

                   }

            
            }
            private double _minDistance;
            public double BackTrace()
            {
                _minDistance = double.MaxValue;
                int index = _targetLength / 2 + 1;
                for (int i = index; i < _dpmap.GetLength(0); i++)
                {
                    var normalizedDistance = _dpmap[i, _targetLength] / _acumDistance[i, _targetLength];
                    if (normalizedDistance < _minDistance)
                    {
                        _minDistance = normalizedDistance;
                        index = i;
                    }
                }
                MatchedIndexEnd = index - 1;
                //var ii = index;
                //var jj = _targetLength;

                //while (jj > 0)
                //{
                //    switch (_dplabel[ii, jj])
                //    {
                //        case DPLabel.A:
                //            ii -= 1;
                //            jj -= 2;
                //            break;

                //        case DPLabel.B:
                //            ii -= 1;
                //            jj -= 1;
                //            break;

                //        case DPLabel.C:
                //            ii -= 2;
                //            jj -= 1;
                //            break;
                //    }

                //    MatchedIndexBegin = ii;
                //}
                return _minDistance;
            }

        
        }
    
    }

分かった事。

計算にかなりの時間が掛かる(約35秒ぐらい) 波形の差によっては更に掛かる?? OutOfMemoryExceptionを起こすことがある。

検証までにかかった時間(Typoやその他諸々のムダを含む) 2時間ぐらい

※以下MinDistanceは波形同士の最小距離を示す。 同じキーワード「羊乃モコ」では 

3.1977(MinDistance)

2回目では更に近い結果が得られた

1.3343147(MinDistance)

Timer計測の結果: 34秒 StartRecodingと違うワードにしてみた結果(メリーさんのひつじ)

7.81179(MinDistance)

2回目 7.565614(MinDistance) Timer計測の結果:56.4736204 Timer計測の結果 2回目:49.9063976

波形が近いほどMinDistanceは0に近い値を返すと思われるが、計算処理に時間が掛かり過ぎる。

→2021/3/31 Haminng窓を掛けた波形は有効な要素が先頭の8000pointほどに限られるらしく(要検証)、要素数を絞る事で精度を保ったまま実行速度を短縮することが出来た。 下記にて後述している。 また、ノイズが混入するから(PCのけったいなファンのせいだが)ローパスフィルタ等の処理を入れないと出力結果が安定しない事が分かった。

Pythonメソッドを使う必要があるかもしれない。 協力者の方は歓迎します。

最近分かったのはノイズを拾うから

対策

BackTrace() While文の箇所をコメントアウトしてみた。実のところ何をやっているのかよく分からない。出力結果に差は出なかった。  そもそもこれで実装の意味を成しているのかどうか疑問なのだが。

enum DPLabel
        {
            A, B, C, NON,
        };

多分 列挙体でラベリングのような事をしているのだと思う。

対策2 要素数を絞る

 折角HamingWindowを掛けたのにその波形を渡してなかったので修正した上で、DPMatting.LoadData()に渡す。

波形を観察したらわかったのだが、HamingWondowを掛けた波形は先頭から8000Point分しか有効な波形が無い(OxyPlotの制約かもしれないが)。 List型の要素数そのものは変わらない。 image.png

これは配列private double[,] _dpmapの要素数を8000まで絞り込める事を意味する(かなり多分)。 これにより速度を大幅に改善する事が出来た。

public void LoadData(List<float> source, List<float> target)
            {     
          ///要素数を有効(と見られる数)まで絞り込む
                _sourceLength = 8000;
                _targetLength = 8000;
            }

結果 1回目「羊乃モコ」  3.341295236918195E-08  00:00:06.1162549(秒) 2回目「メリーさんのひつじ」  4.316430133692367E-08  00:00:06.3854461(秒)

実行速度こそ現実的になったものの、RAMもかなり食われるのが問題である。

1次元配列に直す

 ChatGPT(略)

対策3 HashSetを使う

HashSetだとAddRangeメソッドが使えないので、List<doubble>にAddRangeした後にNewで割り当てる手法を取った。

 マイクから波形取得でListの代わりに使うのも駄目かもっていうかたぶん波形が原形を留めんかもしれん。まだ試してないけど望ましくなさそ。  →後日試したら想像以上に酷い結果になった。    →0..0000034とかになった

53.0838213 余計遅くなった。。。

 public void LoadData(List<float> source, List<float> target)
        {
            _data1.Clear();
            _data2.Clear();
            _data1.Add(0.0);
            _data2.Add(0.0);
            _data1.AddRange(source.Select(v => (double)v).ToList());
           //追加 
           hash_data1 = new HashSet<double>(_data1);

            _data2.AddRange(target.Select(v => (double)v).ToList());
            //追加 
            hash_data2 = new HashSet<double>(_data2);

            _sourceLength = source.Count;
            _targetLength = target.Count;
        }

.toList要らない説

 結果:1分以上掛かった

初期化処理のコメントアウト

newしてるから多分要らんだろと思ったけど大差はない。遅くはならなかった。

 // 初期化
            // 端点フリーDPなので0
            //for (var i = 0; i < _dpmap.GetLength(0); i++)
            //{
            //    _dpmap[i, 0] = 0.0;
            //}            

forからForeachへの書き直し

 C#の仕様が面倒で難航している。普段はforeachなんて簡単に書けるんだが.... 上手くいけば10秒以上短縮出来たりするかも。

 睡眠時間がまた削れた。

ターゲット波形の内、音が入っていない部分を削除する

 おそらくもっとも有効な施策だと思う。

Pararel.forによる高速化

 ChatGPTに聞いたら答えた高速化方法の一つ。 かなりRMMとCPUを占有する。

「新世界より」に見る愛のある世界とは何か

 

 自分のような人間はあんまり日常会話や他人の振る舞いなどにそれほど興味が湧かなくて、愛情なんてものはそれこそアニメのように極端に抽象化したものか、虚構として構築されたものでしか理解できないのかも知れません。

 

 最近、「新世界より」のアニメ版を見ていたのですが(小説も読みたいです)「ボノボ型の愛の社会」というくだりが出てきましてですね、少女漫画に出てくるBL描写もあるんですが(あの絵柄は誰が描いたんだろう)、愛のある社会ってああいうものなんだなととみに感じております。

 

 

 

 

 



 

 

 

 

 

アメリカ辺りだと割と普通?らしいけどそれに対する差別も根強いという描写が結構あったりする。

 自分の小学校時代とかも異性よりも同性と遊ぶ方が当然多かった訳で(それ以前に人付き合いをした経験が極端に少なかったが。高校時代などはモジャ公と勝手に呼んでいた知人が一人居ただけだった)、男性的で下品な性欲の押しつけに過ぎない表現よりも、ああした穏やかな触れあいこそが愛情表現と言えるものなのだろうなと。

 

 

 それこそ、僕がいつも言っているように女性と羊だけが穏やかに暮す国が愛のある社会とやらではないかと思います ※1

 

※1< 最近は女性に羊遺伝子を導入して無理やり羊化した"羊村"を作った挙句、村人に恨まれて追いかけ回されるという妄想をしている

 

 

 ”愛”とは国としては家族形成に至るまでのプロセス・それに伴う感情として表されるものであり、結婚とはそれを定型化、法制化しお互いの家族間の結びつきを強めるものであるとも言えます。まあ早い話、一種の契約関係ですよね。

 でもそれも今では形骸化し、個人主義があまりにも先行し過ぎた為に先細りになりつつある。

 

 「新世界より」でのそれはもっと村社会的なコミュニティであり、強力な攻撃抑制を植え付ける事に依り人間そのものを作り替えるという半ば強引な手段ではありますが(ネタバレ)それにより、子どもたちが自然な愛情表現を身に着ける手段を持ち得ていると言えます。

 

余談ですがひつじの愛情表現もスキンシップです。

庭で交尾の羊 の写真素材・画像素材. Image 25789079.

動画変換・圧縮アプリ【はるあこんば~た】の配布ページ

 

全ての女性はひつじなのである。

 

 

 

 

あけましておめでとうございます!

今年も一年よろしくお願いいたします。

 

このイラストは t/砂雲空風 https://twitter.com/shiyokatadragon 様に書いていただきました。ちょっと女っぽい変な人。

この女性ひつじキャラクターは安倍春明という子でして、砂雲氏が考えて付けたとの事で、このキャラクターをモチーフに動画変換アプリを開発してみました。

 

 

参考 しょどーる

 

 

ffmpeg 5.12を使用しています。

 

 

対応OSはWindows11で、TargetOSを指定しているのでWin7までは動きます(動作未確認)。

Vista、XP以下は対象外です。

そのうちLinux向けに書き直してビルドする予定です。

 

 

 

 

ダウンロード先(23/11/11 差し替え)

drive.google.com

Vector

www.vector.co.jp

 

更新履歴

beta_1.1

Window位置等が保存されないバグの修正。

 

ファイル選択が4つもあって不便なので、それぞれ独立してPathを保存する仕様にしました。

 

 

beta_1.1 1/08 21:27

 ”ffmpeg.exeが使用中です”というダイアログが表示されて変換出来ないバグの修正。

 保存先パスが渡せていなかったバグの修正(凡ミスだった)

 しょど~る参上!のwavファイルのパス指定がそのままだったのを修正。

 outputDeviceの開放が上手く行われていないかも知れないので終了時にDispose() させてみた。

 終了プロセスの実行順を見直し

 

以上、こっそり上げ直しました(陳謝)。

 

 

まだいろいろと軽微なバグが残っているようなので、ヒマを見つけてバグ取りしていきます。

 

 

 

 

 

免責事項 

 Beta版としてとりあえず公開します。とりあえずこのページをReadmeとしておきます。制作には万全の注意を払っておりますが、このソフトを使用した場合の損害について一切責任を負わないものとします。

 

制限事項

 管理者権限で実行するとファイルのドラッグ&ドロップが出来ませんWindows側のセキュリティ制限です。

 読み取り専用だとsetting.iniの更新等が出来ませんので外してください。

未だに調整中なのでまだ把握してないバグとかあるかもしれないです。

 

 

画像について

 画像の著作権はt/砂雲空風 (https://twitter.com/shiyokatadragon)氏にあります。無断での再配布・再利用・商用利用の一切を禁じます。何かに使いたい場合は直接本人に交渉してください。

同梱しているffmpeg 

ffmpeg-windows-build-helpers"を使用してffmpegをビルドして同梱していますが、どうも --disable-nonfree にならないのでライセンス上どうなるか分かりません。問題があったら教えてください。non GPLにもしたかったけど。

 optionはhelpみて指定したんで上手く行ってる事を祈っています。。。

 

 そして自動的に全部マシマシなのでファイルサイズも肥大化しました。数十時間に及ぶffmpegのビルド作業が全部失敗だったので病む負えずこのようにしております。

 

 

 

 

 

開発記録は以下のツイート群にアクセスすると見れます。

制作環境

 Visual Studio2022 WPFアプリケーション 言語:C#

 

 

使い方

対象となるMp4動画ファイルドラッグするかクリックしてファイルを選択すれば変換が始まります。

 

 

FFmpegのパラメータについて

このソフトウェアではffmpegのパラメータを自由に編集、保存が出来ます。

Parametersタブは実験的に追加したもので書式に癖はありますが、やってみると面白いかと思います。詳しい使い方は下記へ。

 

 

 

 

 

Twitterに動画変換する用のパラメータ

-codec:v h264 -vf yadif=0:-1:1 -pix_fmt yuv420p -acodec aac -y -threads 2

 

上記をメインウィンドウのテキストボックスに入れてください。

 

Parametersタブの仕様

 

 Label部分をダブルクリックするとLabel編集モードになります。ESCキーで終了します。



 

 

 ffmpegのパラメータはWeb上に数多く言及されています。

よくある例

 ffmpeg -i input.mp4 output.mp4

このうち 

 -i input.mp4 output.mp4 の部分をパラメータエディターで使用します。

 

「Path設定」 内のテキストボックスにてPath指定を行い、



 -i {input} {output} とすることで正規表現(Pattaen Match)を使ってファイル置換を行いffmpegにPathを渡す方式になってます。意外とめんどくさいから改善したい

場合によっては別の場所(だいたい一つ上のディレクトリ)に保存されてしまうため、¥直下に何らかの文字列を入れてください。

ダイアログから選択した場合、defaultで  Convert_  が自動的に追加されます。

 

↓こんな感じ

 

 

変換に失敗する場合

Note:先頭に "-i" オプションは必ず入れてくださいパラメータをソフト側で作成する仕様上、動作しません。 何とか直すかも知れない

 

Permmission denied と出る場合は管理者権限で起動するか、別の場所に保存するか、先に作成したファイルを削除してください。Windows10以降は面倒になりました。

また、作成したファイルに権限を追加するのもいいでしょう。たぶん読み取り専用属性になっていると思います。

 

 

ffmpeg.exeが実行中ですわ”と出る場合。

なんらかの理由でffmpeg Threadの終了イベントが呼ばれないために起こるエラーです。再起動するか、Log WindowのConvert Stop  ボタンを押してください。

特にPermission denied 等の直後に起きるようです。

 

 

強制的に動かせるようにしました。この場合はこのチェックボックスを入れてください。

 複数のffmpegを動かすとPCがシャットダウンされる恐れもあるので(発熱が酷いから)、このような仕様にしてます。同時に動かしたい場合は複数起動などしてください。

 

 

 

多分パラメータが間違っています。TextEditで拡大して編集すると分かりやすいと思います。

 

ffmpegとは何か

 

ja.wikipedia.org

 は動画音声を記録・変換・再生するためのフリーソフトウェアである 

 

 かなり有名なモノで、動画・圧縮関連のソフトウェアであれば大抵は使われています(youtubeにも使われている)。あるアプリを利用したGUIアプリケーションは”フロントエンド”ど称されておりまして、本ソフトもフロントエンドとなります(フロントエンドエンジニアとは?フロントエンジニアの仕事内容と年収)。

 

 

 

 

開発のコンセプト

 元ネタである

【マスコットアプリ文化祭2016応募用】Twitter用に動画変換するやつ | Cloth.moe

が未だに人気で、僕も使ってたんだけどTwitterにアップする動画ってそもそも5秒から2分以内とごく短めに投稿するので、それに対しオリジナルよりもファイルサイズがデカくなってしまうのが最大の不満でした。

 

それと、(主に若者向けで)人気の割に単機能で作ろうって人も現れないし、自前で作成する事にしました。

 

自身では初の本格的なWPFアプリケーションです。例によってC#です。たまには他の言語使いたい。

 

 ちなみにdefaultのパラメータは1200kbpsですが、変換元のフレームレートがこの数値より低いと逆にファイルサイズが肥大するため、動画情報も出力するようにしました。

 

 

 

簡単な変換操作のGIFイメージ




 

主な用途

1.,任意の動画ファイルをTwitterに投稿可能な状態に変換できます。

Parameterを弄っているので本家よりかなり圧縮率が高いです。

 

2.動画変換だけでなく、任意のParameterを複数保存しておく事で動画ファイルからの画像切り出しやGIF作成などに対応出来ます。

 



GIFに変換する

 このソフトは、ffmpegに渡す様々なパラメータを保存しておく事ができ、簡単な書式で実行することが出来ます。最新版(version 5.1.2)を使用しているため、処理が高速で軽快です。

 

動画をGIF変換

 

入力したパラメータ

 -i base.mp4 -r 10 output.gif

 

アプリ上の書式

 -i {input} -r 10 {output}\output.gif

[output} などになりやすいので注意してください(間違えるとエラーが出力されます)

 

動画から画像を切り出す

 パラメータを調整しないと大量の画像を生成してしまいますが、動画から画像が切り出せます(別にコマンドラインでもいいけど)。

 

 

 

 

上が入力パス、下が出力パスです。後でラベル貼っときます。。。。

ここを指定しないとダイアログかエラーが出るようになっています。

 

ここで試すパラメータ 0〜30秒の間で静止画に変換

-i {input} -ss 0 -t 30 -f image2 -vcodec mjpeg -qscale 1 -qmin 1 -qmax 1 -r 60 {output}\%04d.jpg

 

{output}\%04d.jpg

{output}の後ろに¥を付けないとルートドライブ直下(C:\とか)に直接書き込んでしまうので注意してください(多分特に問題はないと思う)。後で¥が抜けると動かないようにしときます。。。。

 

そのままでもあまり問題はないので、適宜 ",mp4" などを削除して使うのがいいと思います。

参考 defaultの場合の画像出力結果

 パラメータ 

-i {input} -filter:v fps=fps=1/120:round=down  {output}image_%04d.jpg

結果 少女終末旅行 Cap8_covert_covert.mp4image_xxxx.jpg

 

 

パラメータオプションの参考

photo-tea.com

やってみたGIF

 今回は900枚ほどの画像が一気に生成されてしまいました・・・・まあそんなもんなのかもしれない。

 

 

 

最後に

フリーソフトですが寄付を募っています。PayPayやAmazonの欲しいものリストでプレゼントお願いします。頑張って作ってます(💦)

www.amazon.co.jp

 

 

Visual Studio上で設定したアイコンが反映されない場合の対応方法

 

 以下はVisual Studio2022、Windows11で行いますが、それ以前のVersionでも同じだと思います。要するに長年放置されている要素だと思われます。

 

まず、Visual Studio上で適当なアイコンを設定します。

 

今回はBrave BraswerのIconを指定してみます。

こんなのね。

 

初回のコンパイルではこのように正常に反映されます。

 

 

 ここでもっとカワイイイラストに変更したくなったとしましょう。

 

 これはTwitterの絵師の方に描いてもらったリリース予定のアプリのアイコンです。

 

適用しコンパイルしてみませう。

 

 

exe側はアイコンが変わっていません。

 

 

 

 これは一度設定してしまうと再起動しようと何をしようと、今後このプロジェクトファイルで実行ファイル側のアイコンの見た目を変えられない事を意味します。単に見かけ上だけなのかどうかまでは検証してませんが.... たとえば別のPC上では正常に表示されるという事は考えられます。

 

 とりあえずこのPC上では、プロジェクトファイルをリビルドしたりごにょごにょしたりした程度では解決しません(単に知らないだけかもしれないけど)

 

 そこでWindows内にあるIcon Cache(アイコンキャッシュ)をクリアします。やり方は簡単ですが、ここではEvertThing(https://www.voidtools.com/)を使って例示します。

 

 

アイコンキャッシュをクリアしてExplorerにアイコン表示を反映させる

 

 参考にしたのは以下の訳分からんリンクです。101Helpとかいう謎サイトですね。一応、https://securl.nu/に掛けました。Greenでした。

 

ja.101-help.com

この古いブログ記事でもOKだと思います(かなり多分)

blog.syo-ko.com

 

EveryThingで、iconcache_32.dbを検索し、フォルダを開きます。

 

 

C:\Users\USER\AppData\Local\Microsoft\Windows\Explorer が開きました。

 

Terninal(PowerShell)で以下のコマンドを順に入力します。

del iconcache*   // 全ての”iconcache”を含むファイルを削除

del thumbcache_*.db // 全ての”thumbcache”を含むdbファイルを削除

 

explorer.exeを終了→再起動

 

Evrythingで確認した残りファイル。

 

 

フォルダを開き直すと削除したファイルは即座に再生成されますが、この時点では実行ファイルまで反映されていません。

 

 タスクマネージャーでexplorer.exeを強制的に終了させます。片方がファイラー側、もう片方がタスクバー。

 

タスクバーと壁紙その他が消えます(各種アプリは起動したまま)。

 

explorer.exeを再実行します。

 

 

該当のフォルダを確認すると、今度はちゃんと反映されています。一連の操作に再起動は必要ありませんでした。

 

 

 

とりあえず手順の再現に成功出来ました。分かったのは大分前だったんで忘れていた。

削除しちゃいけないファイルとかあると思いますので、以上のようにコマンドで削除する事をお勧めします。

マウス・キーボード・スピーカー・HDD等を2台間で共有する

 

 .....本来は近くの電気屋ヤマダ電機」で見つける予定だったのだが、なんとWindows7までしか対応してない定価9800円の古ぼけた骨董品紛いしか置いてなくて正気を疑った。なんで未だにこんなもん置いてるのか。

 

 

 やむなくAmazonで探す。今回購入したこの商品はレビュー0なのだが、これがとりあえずこれでOKというかコレを推したい。他の商品はどれもレビュー的にイマイチだったのでコレにした。

 

Yahoo Shop側にはレビューがあった。 値段はちょっと高くなっている。2,260

USB 切り替え機 PC2台用 プリンタ マウス キーボード ハブなどを切替 手動切替器 USBケーブル2本 MACHINEC :mg1202-21a:絆ネットワーク - 通販 - Yahoo!ショッピング

 

 

 

ググったらちゃんと動画も見つかったので、あんまり手間はかけなくてよさそう。それにしてもメーカーもよく分からないようなシロモノですが。

www.youtube.com

 

接続環境

 Bodhi Linuxを入れたノートPCとゲーミングPC間でスイッチングしています。

 HDDも接続をスイッチングできる事を確認していますが、外付けHDDはこのような使い方(頻繁に接続先を変える)を想定していないと思われるんで、故障のリスクがあります。やるなら自己責任で~とかよくいいますが、出来ればやらない方が無難でしょう。おそらく瞬間的にオンオフしているのと同じ状態だと思います。

 

 あまり電力を必要としないキーボード・マウス辺りが無難だと思います。

 

 

白色端子でUSB2.0です。説明でも2.0となっていました。

 白丸の部分が給電用のコードで、どちらかのUSB端子に挿します。

キーボード・マウス・スピーカーを接続。電力が足りなくなるのでたまに接続が不安定になるようです。安定性を求めるならUSB3.0の製品がオススメです。

 

 切り替えButtonの押し込み感も良好で、辛口で有名なYoutuber「吉田製作所」も満足するレベルではないでしょうか。多分。

 

 

 Windwos PC同士なら、Microsoft Garage Mouse without Borders(https://www.microsoft.com/en-us/download/details.aspx?id=35460

の方がベストな選択になりますね。以前はそうしてたんすけどねハハ。。。。

Linuxに挑戦してみようと思ってしまったので。

 これだとファイルのやりとりさえできてしまうので非常に楽ですね。

 

 

 

 

実は自作も可能なんですが、安定した動作をさせるにはUSB規格を満たして作る必要があるなど、手間が掛かるモノになっています。2000円の商品よりはいいのか悪いのか。

 

www.egao-inc.co.jp

 このリンク先はUSB規格はあまり確認していないと思うので、あんまりオススメしないですね。動けばいいやってのは精密機器ではちょっとヤバイから、自分でやるなら規格を確認すると思う。

 

xtech.nikkei.com

 Aruduinoなど使ってUSB切り替え機を安全に作れないものかと考えたこともあります。いずれやってみたいと思わなくもないですね。