自分のブログ名

sheephumanのブログ

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

マンガ海賊版サイトの功罪と現状 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切り替え機を安全に作れないものかと考えたこともあります。いずれやってみたいと思わなくもないですね。

 

ノートPC(CF-SX3)にBodhi Linuxをインストールしてみた(電気代対策)

2022/12/20 追記

 なんだかんだで使い続けてるのでいくつか重要な項目を追記しとく

 

 

 電気代対策でゲーミングPCよりもノートPCを使いたくなったので、この際になるべく派手な見た目のLinuxを入れようと検索したらこれがヒット。個人的にはどっちかというと地味なんじゃないかと思えてならないが....

 個人的には「Mr.Robot」で登場したKali Linuxの方が気になっている。

 

xtech.nikkei.com

 インストール方法は何かとトラブりやすい分割パーディションよりも、ストレージ毎にインストールする方式を選ぶ事にしている。前にそれで全部データが飛んだから。

 

 

インストール自体は簡単ですぐ終わるので、ここでは備忘録としてTerminalで頻繁に使うコマンド群と初期セットアップ方法を挙げていく事にする。

 ちなみに最軽量Linuxディストリビューションの一つであり、アプリ等は必要最低限しか入っていない。こだわりがないなら素直にUbuntuを使うほうがまだマシだと断言できる。特にデフォルトで入ってるCloniumブラウザ上でのGoogleアカウントのログインがうまくできず、ストレスが溜まった。

 

 はっきり言って相当使いづらい。Windowsの方がいい。

 

 

 

 

初期セットアップ

 以下はコピペで構わないが、スペースが入っていないかなど注意して実行していく。よくあるのがスペルミス。

 

こちらも参照

pcfunnylike.blogspot.com

 1.見た目を整える

  タスクバー(Shelf)に時計を表示させる

 初期状態では表示されていないので、Windows同様の見た目にするためにひと手間かける。だいたいどのディストリビューションでも同じだと思う。

 

 



 Shelf(windowsにおけるタスクバー)で右クリック→「中身」を選択。「Shelfの中身の設定」が表示されるので時計をクリックする。見た目の設定は以下のようになる(時計部分をクリックすると出る)。

 

 

 

2.よく使うブラウザを入れる

 とりあえずFirefox、Braveを入れる(必要ならchromeも入れると良い)

Firefox

 sudo apt install firefox

Brave

 

上記リンクから抜粋。

 

 

sudo apt install apt-transport-https curl

sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg arch=amd64] https://brave-browser-apt-release.s3.brave.com/ stable main"|sudo tee /etc/apt/sources.list.d/brave-browser-release.list

sudo apt update

sudo apt install brave-browser

 

 上から順番に実行し、特にトラブルもなく入れることができた(コピペで一行ずつ入力)。当然、OSはX64でインストールしているのだがamd64のままでいいらしい。何をしているのかは知らない。

 使用感はWindows側となんら問題なく、Windows側ブラウザで同期設定をしておけば、ブックマークと閲覧履歴を同期させることができるようになる(ちなみにリアルタイムに同期するわけではないので、使用するブラウザ側の設定から同期を実行させている)。

 

 

 

音声を聞こえるようにする(CF-SX3にて確認)

どういうわけかスピーカーが認識されていないようだったので、このコマンドを探し出して実行。初期化するらしい。ちなみにデバイスマネージャー的なものは見当たらない。同様の記事が幾つかあるみたい。

alsactl init

 

日本語入力可能にする

 sudo apt install fcitx-mozc 

 sudo apt updete

 このあと、再起動するほうがいいように思える。インストール後すぐには使えなかった。やたら試行錯誤して探しまくった。

ctrl + spase キーで入力切り替え。

 

 

参考までにキーボード設定も載せておく。

基本的にMoczでいいと思われる。ほかは変更していない。

 

 

 

音楽プレイヤーをインストールする

sudo apt install audacious

すぐにインストールして使えそうなのがコレしかなかった。

 

 

画面の輝度をコントロールするアプリ(brightness controller)

https://ja.linuxcapable.com/how-to-install-brightness-controller-on-ubuntu-22-04-lts/

 からの紹介。夜間で便利なので入れた。

 

sudo add-apt-repository ppa:apandada1/brightness-controller -y
sudo apt update

 

 

 

タスクマネージャー

 入ってないので入れる。Ubuntuは確か最初から入ってる。

RAMが4GBだと少々つらいので増設予定。

 

sudo apt install gnome-system-monitor

 

 



デスクトップにショートカットを作成する方法

参考

yanenosuzume.seesaa.net

 

 LeafPad(デフォルトのテキストエディタ)で下記を入力して保存(この場合はFirefox)拡張子は .desktop とする

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=firefox
Name=表示するアプリ名(例:Firefox
Comment=Studio
Icon=///usr/share/icons/hicolor/256x256/apps/firefox.png
StartupNotify=true

 

 ”exex”にインストールされているアプリ名を入れると自動的にリンクされて立ち上がる。作成したファイルの右クリックメニューで「プログラムとして実行可能」にチェックを入れる必要がある。一度作ってしまえばコピペでファイルごと量産出来る。

 

 

Brave Broswerは exec=brave-broswer とすればよい

アイコンを替えたい場合は対応するファイルを引っ張ってくるしかないがBodhi内はちょっと見つからなかった件。面倒なのでそのまま。

 

 

スクリーンショット

GnomeスクリーンショットGUIが便利で入れてる。デフォルトは使いづらい。

 

sudo apt install gnome-screenshot

見えづらいけど緑色が撮影ボタン。

 

地味な外見(デフォルトテーマ)を変える

 Bodhiのデフォルトテーマが地味(深緑基調)なので変えます。

Blue Electric Theme にする

 


デスクトップ上のクリックメニューにBodhi AppCenterがあって、Cloniumで飛ぶようになっている。ここからGimpVLCなどをインストール可能めんどくさい

www.bodhilinux.com

 

画像編集ソフト GIMP

  sudo apt install gimp
 bodhiのApp Centerでもインストール可能なのだが、実行するにはTerminal上でgimpと入力しなければならない(ショートカットに登録されない)。再起動するときちんと登録されてた。

使用感はWindows版と多分変わらない。versionは執筆時点でGIMP 2.10.18となっていた(Current Stable Versionは2.10.32 古いVerではない)。

 

 

予備知識

 sudo は管理者権限を表すコマンドであり、頻繁に使用する。この際、必ずパスワードを打ち込まないと行けないらしい。非常に煩雑である。Skipする方法もあると思うが。

 

 

不満点

 Bodhiはショートカットをデスクトップに作成してくれない。一応、手動で作成する方法を追記しておいた。Ubuntuはアプリ一覧が見やすいのでまだマシだと思う。

 

 Terminalでコマンド入れてアプリをインストールするという形式がそもそも面倒くさい。入力履歴がシャットダウンしても残るようになっているし、一応なれれば使えるのだが。

 

ウィンドウアイコンやアプリアイコンが出ないモノがある。非常に使いづらいし見にくい。

 

 LinuxアプリはOSの種類によってインストールするためのコマンドが違うらしく、Bodhiではそのまますんなりインストール出来ないことが多かった。以下に例を上げておく(知っている人いたらコメントください)

 

Bodhi Linuxでインストールできなかったアプリ一覧

 YACReader https://www.yacreader.com

 MCOMICは簡単にインストールできるが、WindwosのNeeViewの方が遥かに高機能で多くのファイル形式に対応している。動画の再生すらできる。

 

 

 

 下記画像の時点で判然とせず、とりあえずコマンドを試したがうまくインストール出来なかった。謎。Ubuntuだと思うのだが。

 

 

 ...とこのようにセットアップの時点で相当に時間をかけなければ行けなかったが、慣れれば1時間ぐらいで終わると思う。このためにどれほど調べなければ行けなかったか察してほしい。 

 

 また、これに伴いマウス・キーボード・スピーカー・HDD等を2台間で共有したんだけど別項に書く事にします。