はてなキーワード: 拡張子とは
せっかく課金したのにユーザが増えまくっているのか滅茶苦茶重くなっていて最悪。
だから流出したモデルを使ってローカルでNAIの環境を構築する。
ネットには情報もだいぶ転がってるけど陳腐化した情報があまりに多いため増田にまとめることにした。
もしかしたらこの記事もすでに陳腐化しているかもしれないが…単純に間違ってたらトラバで教えてほしい。
もちろん自己責任。この記事を見て導入した結果何かあっても増田は何も保証しない。
英語がわかる人はこっちを見た方が早いと思う。今は導入RTAができるくらい導入は楽になっている。
https://rentry.org/nai-speedrun
VRAMが2GB以上あるNVIDIA製のグラフィックボードがあればローカル環境を構築できる。
GPUの世代はGTX700シリーズ以降。なので一昔前のミドル級ボードでも動作するらしい。
IntelのオンボードGPUでも実行する方法があるらしい(stable_diffusion.openvino)が今回は割愛する。自分で探してね。
その他の推奨環境は以下の通り。
対応OS:Windows7以上(と言うがM1Macでも動作する方法があるとかなんとか)
メインメモリ:16GB以上(VRAMもたくさん必要だが起動時にメインメモリも大量に食う。WebUI起動時にタスクマネージャを見ているとよくわかる)
スマホしか持ってないような人やこういうのがよくわからない人はNovelAIを使った方が良いと思う。
今は重いけど、きっとそのうちみんな飽きてサーバも軽くなるかもしれないし。
(追記)NovelAIがリソースを確保してサーバが軽くなったからリスクを背負ってまで導入しなくても良いかも
(追記)Pythonは当然3系。最新の奴を入れれば問題無い。
導入方法はいちいち書かないけど、「python --version」や「git -v」で
正常にバージョン情報が出る(パスがきちんと通っている)ことはちゃんと確認しよう。
Stable Diffusion web UIはStable Diffusionやそれをベースとした画像生成AIを利用するためのフロントエンド。
その中でも特に開発が活発でデファクトスタンダードとなっているのがAUTOMATIC1111版だ。
導入したい適当なディレクトリに対してPowerShellなどで
「git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git」
なお、AUTOMATIC1111版は数時間単位でコミットが行われるから
定期的に「git pull origin master」で更新しよう。
クライアントはqBitTorrentが一番楽だと思う。
ここにはさすがにmagnetリンクは書かないから各自ググって欲しい。
結構誤解されがちなことだが流出データ50GBを全部ダウンロードする必要は無い。
必要なファイルはanimefull-final-prunedディレクトリの中身とanimevae.ptだから5GBちょっとくらいなんじゃないかな。
もし余裕があるならmoduleディレクトリの中身もダウンロードすればいいけど、ぶっちゃけ必要無いんじゃないか?
まずはanimefull-final-prunedの中身のファイルをリネーム。
「model.ckpt」を「animefinal-full-pruned.ckpt」のようなわかりやすい名前にして、
「animevae.pt」を例えば「animefinal-full-pruned.vae.pt」のような拡張子以外は同じファイル名にする。
WebUI起動フォルダ配下の\models\Stable-diffusionにリネームしたファイルを移動させれば配置はOK。
ちなみにmoduleディレクトリの中身は\models\hypernetworksに移動させて使う。
それらのファイルを設定で適用させると画風が結構変わるがNovelAI再現とは関係無いみたいだ。
(追記)moduleディレクトリの中身の.ptファイルはhypernetworksという技術によって画風などを学習したものらしい。
すでに複数のイラストレーターの画風を学習したptファイルが作成されており議論を呼んでいる。
自分のグラボのVRAMが4GB未満の場合は「set COMMANDLINE_ARGS=」の後に
4GB未満の場合は「--medvram」、2GB未満の場合は「--lowvram」とパラメータを追加しておこう。
自分の持ってるグラボのVRAMがわからないときはGPU-Zなどで調べよう。
またGTX1600系固有のバグ(単色の画像が出力される)があるらしいので
その場合は「--no-half-vae」もしくは「--no-half」や「--precision full」とパラメータを追加。
ちなみにパラメータに「--xformers」を追加してxformersを導入・使用すると
消費VRAMが減って画像生成処理時間も短縮されるので是非導入しよう。
画像からdanbooruのタグをAIで調査するdeepdanbooruを利用する場合は「--deepdanbooru」を追加。
のようになる。
ターミナルやPowerShellなどでwebui-user.batを起動しwebUIの初期導入と起動を行う。
過去には手動でCUDA等を導入する必要があったが、現在はこの初期導入でだいたいの導入が行われる。
ずいぶん楽にはなったがその分初期導入の時間は結構長い。10分~20分くらいかかるかもしれない。
途中で導入処理がエラーで止まってしまった場合は管理者権限で実行するなどして対応して欲しい。
起動ができたらSettingで以下の設定を変更してNovelAIに近づける。
Stop At last layers of CLIP modelを2に、
Eta noise seed deltaを31337にする。
これで設定は完了!
設定を合わせて完全にNovelAIと同じ内容になったのかを確認するテストがある。
出力結果から海外じゃHallo Asuka Testなんて呼ばれている。
これは初期SEEDをはじめとする設定内容が完全に一致していれば同じ出力結果を得られる仕組みを利用している。
プロンプトの内容:masterpiece, best quality, masterpiece, asuka langley sitting cross legged on a chair
ネガティブプロンプトの内容:lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts,signature, watermark, username, blurry, artist name
https://i.imgur.com/Bfl5qJB.jpg
なお、このテストはAUTOMATIC1111のバージョンやxformersの適用状態によっては微妙に違う画像が出力されることがあるらしい。
xformersを適用させている増田の環境だと確かに二つ並べると間違い探しレベルの違いがあった。
「Booru tag autocompletion for A1111」を導入すればNovelAIのように自動でdanbooruのタグを保管してくれる。
画像生成AIモデルはStable DiffusionがOSSのため派生が結構多い。
自前で追加学習もできるため自前で学習した追加AIモデルを4chanのような掲示板などで共有する人もいるらしい。
しかしそのようなモデルの中にウィルスのような悪意のある動作を行うものもあるらしい。
FBIがペドフィリアを一網打尽にするためにIPアドレスなどの個人情報を抜き出す動作を行うロリ特化AIモデルを掲示板で配布していて
しかもそれには本物の児童ポルノが教師データとして使われている…などという都市伝説的な話が今界隈を賑わせている。
掲示板などを読んでみると、単純にStable Diffusionにアニメ絵を学習させただけではなさそうだった。
アニメ画像を学習させた.ckpt(GB単位)と、付属データらしい.vae.pt(数百MB)と、更にhypernetworkという新しい単語が出てきて、.ptファイルというのもあるらしい。
.ptは既存のTextual inversionでも使われている拡張子なのだが同じだろうか。
hypernetworkを読み込ませないと、崩れたアニメ絵が出てくるようだ。
NovelAI側のヘルプを見ると、プロンプトの最初に『masterpiece, best quality,』をつけるとクオリティが上がるらしく、拡張する時に追加しているキーワードなのかもしれない。
で、結局NovelAIはどうやって実現しているのか。
拡散モデルを研究している人も知りたいというツイートをみたので論文にない独自方法なのか?
vae.ptというファイル名からの推測だとVAE学習させてるのかな?
どうやらhypernetworksという技術を追加で使っているらしい。
AUTOMATIC 1111にhypernetworksに関する実装が追加されている。現在gitのブランチでhypernetworksトレーニングのコードの実装開始されている。
掲示板などを見ていくと、promptの最初に{masterpiece}を最初につけないと、いわゆるNovelAIっぽいアニメ絵にならないらしい。
{masterpiece}をつけない場合、キャラ名は認識しているっぽいが、WaifuDiffusionっぽい崩れた画像が出てくるようだ。(アニメ画像を学習した.ckptだけで動作し、.vae.ptは動いてない?hypernetworksが効いてない?)
キャラ名については、同一名で作品が違うという場合があるので、おそらく学習時に別の単語に置き換えていると想像する。(NovelAIでキャラ名を入れた際に候補が出るが、変換しているはず)
他にpromptのトークン数をNovelAIは拡張している。
StableDiffusionの75トークンは、512x512の画像との対応付けから来ているというのが、付け焼き刃の知識での理解なのだが、どう対応付けしているのか。
最初に{masterpiece}があった場合、フラグをONにして、CLIPに渡すときは{masterpiece}を除外ってのは想像できるが、それでもトークンが余る。
Waifu Diffusion V1.3がリリースされ、学習する枚数を増やしたが、掲示板などに貼り付けてあるものを見る限り、まだ手は改善されてない。
最終リリース前(epoch5,6?)のものとの比較した画像も流れているが、見ても違いはわからない。
Stable DiffusionがDiffusion modelで精度が高い先端モデルとされているが、単純に学習枚数だけ増やしても手は描けない、ということではないだろうか。
https://blog.novelai.net/novelai-improvements-on-stable-diffusion-e10d38db82ac
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>
//CSVファイルが置かれてるディレクトリのパス。投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";
'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';
//ファイルのパス。CSVは絶対パスで、拡張子も必要。iimは相対パスでよく、拡張子不要。
const FILE_PATHS = {
textCsv: CSV_DIR + 'textNoAnker.csv',
//レス用投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。
replyTextCsv: CSV_DIR + 'textReply.csv',
};
baseWaitTime: 5,
//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ
waitTimeRange: 5,
//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)
waitTimeForAvoidingPunishment: 60 * 30,
//メール
mail: 'sage',
//名前設定
name: '',
//以下、偽装ワッチョイ設定。浪人でワッチョイを非表示にしてるときだけtrueにしてね。
//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。
//妙なニックネームの後に付く8桁の文字列をランダムで決めて付加するかどうか。
},
//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。
//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrueの場合、投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。
//最初に取得するアンカー無し投稿文CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力。
noAnkerPostTextCsvStartRow: 1,
//最初に取得する返信用投稿文CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力。
//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。
//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。
minAnker: 895,
//返信する場合、名前に以下の文字列を含む投稿にアンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列で複数指定可能。指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能。
//↑とは逆に、名前に以下の文字列を含まない投稿にアンカーをつけて返信する。↑と併用も可能。
//返信する場合、本文に以下の文字列を含む投稿にアンカーをつけて返信する。
filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演で擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],
},
//自分のIPアドレスの確認。VPNとかでIPを変更してマクロを動かしてるとき、突然VPNが作動しなくなってIPが元に戻ったときにマクロを止めるためのもの。
//以下の文字列が自分の現在のIPアドレスに含まれている場合、マクロを一時停止する。基本的に自分の本当のIPアドレスを入力。
},
//浪人設定。最後に動作を確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないから確認できずわからない。
//浪人にログインしてるかどうかをチェックするかどうか。trueならする。falseならしない。trueにしていてもし浪人にログインしていないことを確認したらログインしにいく。
password: '1234',
},
};
/**************************************
設定箇所終わり。
https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>
/**************************************
・NULL演算子(??)は使えない。論理積(&&)は使える。
・オブジェクトの分割代入はできない。
・importはできない。 <h3>o- *************************************/</h3>
/**************************************
関数 <h3>o- *************************************/</h3>
/**
* ここから始まる。
*/
checkSettings();
var _TextCsvCursors = new TextCsvCursors(
SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0
? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1
: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
SETTINGS.postSettings.replyPostTextCsvStartRow > 0
? SETTINGS.postSettings.replyPostTextCsvStartRow - 1
: SETTINGS.postSettings.replyPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
);
var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);
const _MyPosterName = new MyPosterName({
name: SETTINGS.nameSettings.name,
});
const _ThreadUrl = openPromptThreadUrl();
//ループ
while (true) {
SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();
//スレを開く
openUrl(_ThreadUrl.fullUrlHttps());
//浪人にログインする設定なら、浪人にログインしているかどうかを確認し、していなければログインしにいく。
if (SETTINGS.roninSettings.checkLogin) {
}
}
if (SETTINGS.postSettings.replyPost) {
const targetAnkerNumber = createPostDOMList()
.filterPostnumberHigher(_LoopStatuses.currentMinAnker())
.filterByPostername(SETTINGS.postSettings.filterNames)
.filterByPosternameNotIncluded(
SETTINGS.postSettings.filterNamesNotIncluded,
)
.filterByText(SETTINGS.postSettings.filterText)
if (targetAnkerNumber !== null) {
const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);
messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);
return {
...r,
updatedLoopStatuses:
_LoopStatuses.updateMinAnker(targetAnkerNumber),
};
}
}
if (SETTINGS.postSettings.noAnkerPost) {
//返信対象無し、或いは返信しない設定の場合。アンカー無し投稿文を作る。
const r = _TextCsvCursors.takeNextRowTextAsNoAnker();
messageDisplay('返信対象無し。アンカー無し投稿。');
return {
...r,
updatedLoopStatuses: _LoopStatuses,
};
}
return null;
})();
if (p) {
//投稿。
nickname: SETTINGS.nameSettings.nickname,
korokoro: SETTINGS.nameSettings.korokoro,
area: SETTINGS.nameSettings.area,
}),
SETTINGS.mail,
p.text,
);
//_TextCsvCursorsと_LoopStatusesを更新。
_TextCsvCursors = p.updatedTextCsvCursors;
_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
} else {
`返信対象が現われるのを待機中...。`,
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
}
wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));
}
}
/**
* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。
* @param {string} serverName サーバー名
* @param {MyPosterName} _MyPosterName
* @param {string} postMail メール
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes, postTo5chTread, postConfirm);
if (r) {
back();
return;
}
wait(7);
const error = createPostErrorMessage().analyze();
messageDisplay(error.message);
if (error.order === 'KILL') {
kill();
} else if (error.order === 'SKIP') {
return;
} else if (error.order === 'TRUNCATE') {
back();
serverName,
postMail,
_MyText,
retryTimes + 1,
);
} else if (error.order === 'WAIT') {
wait(SETTINGS.waitTimeForAvoidingPunishment);
serverName,
postMail,
_MyText,
retryTimes,
);
} else if (error.order === 'LOGIN') {
serverName,
postMail,
_MyText,
retryTimes,
);
}
return;
}
/**
* 現在のIPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。
* @returns
*/
function checkCurrentIpNotTheIp() {
openUrl('https://www.cman.jp/network/support/go_access.cgi');
const _IpAdress = createIpAdressFromCMan();
if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {
pause('現在のIPに指定した値が含まれていることを確認。');
}
return;
}
/**
* @returns
*/
if (
SETTINGS.postSettings.noAnkerPost === false &&
SETTINGS.postSettings.replyPost === false
) {
return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&
SETTINGS.postSettings.replyPostTextCsvStartRow < 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',
);
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||
SETTINGS.postSettings.replyPostTextCsvStartRow === 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',
);
}
}
/**
* 入力フォームを表示して入力されたスレのURLを受け取る。
*/
function openPromptThreadUrl() {
const url = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
const posts = window.document.getElementsByClassName('post');
return new PostList(Array.from(posts).map((e) => new Post(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
const posts = window.document.getElementsByClassName('post');
for (let index = 0; index < posts.length; index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return new PostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document
「アイコン フリー」で検索して、出てくるサイトから「.svg」とか「.jpg」形式で気に入ったやつを保存して、適当なフォルダに保存してプロパティからリンクしとけばいいんやろと思ってたんだよ
そっからさらにペイントで加工して、拡張子書き換えるのは面倒に感じてしまった
気持ち的には親子丼セット(そんなものないけど)を買って、ごはんにかけて食べようと思って中身開けたら、調理前の卵と鶏肉とネギが入ってたくらいめんどい
TypeScriptなんて、JavaScriptで書いておいて拡張子だけ ts に変えればいいだけじゃないの。
そりゃ、TypeScriptの全機能を使うのは無理かもしれんけどさ。
<はじめに>
読みにくいと題に書きました。この文章を読んだあなたが不快になったとしてもそれは注意書きを読んだ上であなたがあなたの判断によってあなたが読んだ文章によってあなたが不快になったにすぎず、それは完全にあなたの自己責任です。祈りが足りません。毎日もっともっと祈ってください。
<はじめにおわり>
ブログを開設して投稿しても良かったのですが、増田で投稿したほうが興味のある人に少しでも多く届くかなと思い増田で投稿することにしました。
先日、TwitterがOnion版サイトに対応したと風のうわさに囁かれました。
https[:]//twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion
これがそのURLです。(Chrome、Safari、Edge、インストールした後そのままつかているFirefox、では閲覧することができません。諦めてください)
おそらくTwitter社が想定しているケースは
①何らかの理由によって、Twitterへのアクセスがエラーを吐くようになった。(生IPでのアク禁)
②ユーザーは長年使用してきたTwitterアカウントにログインして情報を得たい、情報を投稿したい。
みたいな意図なのではないかと勝手に想定しています。が、これはあくまで一民間人の主観なので流してください。
①への対策としてVPNが挙げられますが、プライバシー保護を謳う幾多のVPNがこれまで国家権力に屈してログ情報を開示してきた例を見ると(すべてがすべてノーログを謳っていたわけではない)、そこらのVPN会社を利用するよりもTorで多重化した方が少しは安心ではないかという気持ちからTwitter社がOnion版サイトを公開してくれたとしたら、嬉しいことです。
<本題>
・個人的に今利用しているアカウントにTorでログインするのは嫌なので、新規登録ができるかどうかを確認する(気になる人は既存アカウントで実験してみてください)
・Tor等を利用したTwitterアカウント作成時との比較を観察する
Torから設定→プライバシーとセキュリティ→セキュリティ(セキュリティレベル)を選び、Torでボタン一つで選択することのできるJavaScript等のトラッキング制限をどの程度選択すればアカウント作成できるかを確認します。
より安全(真ん中のレベル):アカウント作成できない(自分が確認した環境ではできないだけかもしれません、詳しくは後で記します)
最も安全(3段階で一番上のレベル):相変わらずいつも通りアカウント作成できない
アカウントを作成した感想としては、正直Onion版サイトを公開したと聞いたときには、他所のOnion版サイトのように「最も安全」でアクセス先のURLに依存したJavaScriptをいくつか許可すればアカウント作成できるのかな、と期待を胸にしていたのですが、現実としては「いつもどおりのhttps[:]//twitter.comへTorを用いてアカウントを作成するとき」と何一つとして変わる点がありませんでした。これには少しがっかりです。
Torを用いてTwitterアカウントを作成するとだいたい1ツイートまではTwitter社の宇宙よりも大きな器によって許されます。
しかし、2ツイート目をしようものなら、時間をかけてアイコンやBIO、ヘッダーを設定しようものなら「reCAPTCHAのパチモンクリア(4問正解で通してくれる神キャプチャ、お前が世界を取れ)」がやってきます。
運が良ければそのまま関門通過。運が悪ければ電話番号登録を強いられます。
今回はセキュリティの「標準」でアカウントを作成したので、ログイン後1ツイートをした後に「より安全」に上げても使えるかな?と上げてプロフィール設定をしているところで電話番号登録を要求されました。
ここ最近のhttps[:]//twitter.comは、ブラウザのセキュリティレベルを「最も安全」「より安全」にしていると「んなんか今日調子悪いわ笑」とログインページやアカウント作成ページを表示しれくれません(国際情勢が関係しているのかな?)。ですが、以前は上で書いた「他所のOnion版サイトのように『最も安全』でアクセス先のURLに依存したJavaScriptをいくつか許可すればアカウント作成できるのかな」の手順でアカウント作成をできた過去があります(セキュリティレベルを上げ忘れたままTorを利用していた可能性があります、「ですが」以降は思い出として読んでください)。
その時ですら電話番号登録まで要求してこなかったというのに、セキュリティレベルを最低まで落として、やっとアカウント作成できたと思ったら、「お前はホモサピエンスか?」とパチモンに聞かれ、全問正解したというのに電話番号まで登録を強いられる。ダルいのでこの文章は放置されている電話番号登録画面を横目に書かれています。
実験結果
ブラウザのセキュリティレベルを最低まで落とすことでアカウントの作成に成功したが、セキュリティレベルを上げて遊んでいたら(これが原因では???)電話番号登録を強いられた。
この実験結果からわかるように、新規アカウントへの優遇としてOnion版サイトを公開したとはとても思えず、既存ユーザーに向けたサービス展開と見るべきだと思う。
まず今回やったことはOnion版サイトで行わなくても、https[:]//twitter.comで再現可能だったことであり、2者の差はOnionに対応しているか否かでしかありません(緩くあってほしかった)。
生IPでアクセスできないからTor使うのにそこで電話番号登録を要求したら、電話番号を契約している本人が分かりますよね。
Onion版サイトの展開がどこの誰のためにやっているのか知ったことではないですが(良い子のみんなはソースを探してから口を開こう)、向いている方向とやっていることが少しズレている気がします。
「理不尽な事象により生IPでアク禁された人々がいる、それに対抗するためにOnion版サイトを公開する、がOnion版からであってもアカウント作成はいつもどおりです。」だと仮定すると、現状は今のTwitterが落とし込めるギリギリなのかもしれません。
TwitterくんがFacebookくんに憧れる気持ちはよく分かりますが、Tor関連を冷遇するのところまでしっかり見習わなくても良かったと思います。
腹癒せ
「Onion版サイト公開されたんですか?やったー!」「サイト公開されただけじゃないですかやだー!(少しは優遇されただろうと勝手に思っていた筆者が完全に悪い)」をしたので、初めの方に少し書いたVPNについて少し。ノーログを謳うおすすめの紹介です。VPNを使ってたとしても、画面の向こうにいる人間に配慮しながらインターネットを利用しましょう。もうページを閉じてインターネットに帰っていいですよ。帰りの会は終わりました、事務連絡は済ませたのでここからは雑談です。
Mullvad(有料)
一言:広告を一切していないので、検索して出てくるMullvadの感想はPRを含みません。すげぇ
IVPN(有料)
一言:他所のノーログを謳うVPNサービスは月当たりの通信量の制限があったりしますが、ProtonVPNにはそれがない。そこがすごい。本当にすごい。無料で始めたかったらProtonを使ってください。
OVPN(有料)
一言:2月から#StandWithUkraine https://www.ovpn.com/en/blog/standwithukraine というページを公開し、ウクライナの人への応援をしている。すごい。「ウクライナ人はサポートに連絡したら無料のVPNが用意してあるぞ」と言ってる。かっこいい、抱いてほしい。それはそれとしてOpenvpnの拡張子が.ovpnだから検索結果がOVPNとめっちゃ交じる。マジ卍
個人的には薦めないけれど、生IPよりかは良いんじゃないんですか、有名で使っている人も結構いますよね、好きだったら使えばいいと思います4選(それぞれノーログを謳っています)
NordVPN(有料)
一言:有名、紹介料いくらか知らんけどプライバシー特化おすすめVPN○選!みたいな記事ではいつもいるやつ。ちなみにそいういう記事に限って上の4選の奴らはいません。
一言:買収されて運営会社が変わった。NordVPNを紹介している記事は大体ExpressVPNも紹介している感じのアレ。
PIA(有料)
https[:]//www.privateinternetaccess.com
一言:゚(゚´ω`゚)゚。ピーア 日本人ではNordとExpressよりは使っている人は少ないんじゃないかな。
AirVPN(有料)
最後に
https://gigazine.net/news/20211015-former-malware-kape-technologies-owns-vpn-services/
「そんな方法は無い」って即答できる?
それとも俺みたいに、実は親は「ログオン画面に表示される風景写真が気に入ったのでプリントアウトして保存したかった」というのが真相だという事を一瞬で推理して、
C:¥Users¥<ユーザー名>¥AppData¥Local¥Packages¥Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy¥LocalState¥Assets を開いて、
.jpg拡張子の無い画像ファイルの中から当該風景写真を探し出し、それをL判写真出力する。ここまで尋ねられてから5分以内で、できる?
キー操作,マウス操作を代行させたいならPyAutoGUIを使うと良い。
Windows+shift+Sでクリックさせたいボタンとかテキストボックスとかのスクショを取って保存しておき、locateCenterOnScreenにその画像を渡して帰ってきた座標をクリックすれば自動化が出来る。
日本語入力させるときはpyperclipでクリップボードを操作し、Ctrl+Vで貼り付けるとよい
と書いて拡張子".bat"でpythonファイルの横に保存すれば良い
PythonでGUIを組むならPySimpleGUIを使えばいい
そんでボタン押したときのアクションに実行したい関数を割り当ててやれば良い
定型的なデータ処理をしたいのならJupyternotebookを使うと良い
このご時世、気軽に旅行にも行けない。
そんな中、友人間で流行っているのがdiscordでの思い出語り。
過去に友達と行った数々の旅行やお出かけの写真や動画を見返して懐かしみ、
「また行けるといいな」なんて言いながら、
その日がそう近くないことはみんなわかっているので、ちょっとしんみりして通話を終わる。
ふと思った。
100年後の俺がもし生きていたら、
老衰しきってもはや友達もお互いに五体満足に動けなくなっているかもしれない中で、
せめて過去に縋るときにはこの頃をこそ再び振り返るのではないか?
今まで撮った写真や動画は歴代のスマホ・ガラケーの中にたくさん詰まっている。
容量にすると多く見積もって1TBくらいになるだろう。
例えば向こう10年程度を想定するなら、適当なクラウドストレージにぶち込んでおけば
たまに見返したくなった時の思い出くらいは問題なく満足できるだろう。
ただし今俺が求めているのは、
・今まで撮ってきた思い出のすべてを
である。
たとえば、両親が財布に幼少期の写真をプリントしたものを大事に抱えていることがあるかと思う。
または結婚式のアルバムだったり、写ルンですで撮った褪せた写真の束なども実家なら存在するだろう。
白黒の文字のみを記録するのであれば紙媒体でも100年程度もつかもしれないが、
こと写真において破れたり色褪せたり滲んだり折り目のついたものではもはや満足はできない。
それに1TB分の写真・動画であり、物理媒体に保存した場合はたとえばこれからの引っ越しの際などに
ググったらちょうどいい記事が見つかった。
https://www.itmedia.co.jp/enterprise/articles/1508/26/news007_2.html
紙媒体にも触れていて、結論からすると電子媒体では100年後に残すことは難しいらしい。
続く記事にも、このあと触れようと思っていたクラウドストレージの問題点(データは保証されない、サービスの予期せぬ終了など)があり、
結局はたとえば今ならSSDかHDDあたりにぶち込んでおいて、
適宜マイグレーションを行いながら後世へとつなぐしか方法はないように思える。
ただ、これにも実は懸念があり、
例えば現在主流の圧縮形式、拡張子が100年後も現行で使われているとは限らないためその部分もマイグレーションが必要になり、
そしていつかはマイグレーションすらできないタイミングが発生しうるということだ。
その時俺はどうするのか?
もはや記憶の中の美化された各々の顔や声だけを頼りにするしかないのか?
誰か助けてくれ。
ちなみに26歳です。