端末の回転時にスクロール表示位置を維持する [javascript]
転載です。
document.body.offsetHeight のタイポと記号の表示違いがあり、コピペで動かせなかったので載せておきます。
行の折り返しとかでズレそうだけど、とりあえずは大丈夫でした。
<body onload="initListener();" onscroll="recordScroll();">
// body より前に var topOffsetMult = 0; // global adjustment variable, updated whenever you scroll function recordScroll() { try { // get total document height. Trying to accommodate different browsers var totPageHeight = (document.height !== undefined) ? document.height : document.body.offsetHeight; // calculate a fractional multiplier representing current position from page top, // 0 would be top, 1 would be the bottom topOffsetMult = 1 - ((totPageHeight - window.pageYOffset) / totPageHeight); // test alert. Disable, because scroll event will fire many times! // alert(“OH=” + totPageHeight + ” Yoff=” + window.pageYOffset + ” Fact=” + topOffsetMult); } catch(err) {;} } // any time the screen orientation changes, adjust the current // scrolled position based on the previously stored fractional multiplier function screenOrientationChg() { // get current total page height, var totPageHeight = (document.height !== undefined) ? document.height : document.body.offsetHeight; // enable this alert if you want to see the ‘before’ and ‘after’ position // alert(“will adjust to: ” + topOffsetMult + ” from V span =” + totPageHeight); // correct the page position, Again, trying to accomodate different browsers. // do I need two separate try/catches here? document.body.scrollTop = document.documentElement.scrollTop = (totPageHeight * topOffsetMult); } ///////////////////////////////////////// // this is where the event listener is installed by the body/onload event. // my variable is a crude way of ensure its not loaded twice somehow var orientationListenrSet = 0; function initListener() // call from body onload() and onresize() { // use try/catch, to ensure some browsers won’t hicup on undefined property if (!orientationListenrSet) { try { // window.addEventListener('orientationchange', screenOrientationChg); window.addEventListener('resize', screenOrientationChg); orientationListenrSet = 1; } catch(err) {;} } }
PSDの裏に画像を置く[AviUtl]
そのままやると裏面が被る





元スクリプトの仕組みをあまり理解してないので、良くないことがあるかもしれません。
もしかしたらPSDの裏にPSDも置けるのかな???
AviUtlのコミュニティが分からないので、とりあえずここに……。
使用素材: im10851860, im10891270
PSDToolKit + VOICEROID+ で立ち絵・字幕・音声を配置する一例[AviUtl]
いろいろと不足してますが、ざっくり全体の流れをメモしました。
(1) できること・やること
- 字幕の準備
- 立ち絵の準備
- PSDTool でシンプルビューを作って pfv ファイルに書き出しておく
- PSDToolKit ウィンドウで立ち絵を簡単に変えられる
- アニメーション効果のスライダーで立ち絵を変えられる
- 多目的スライダーを使って、中間点を打たずに立ち絵を変えられる
- かんしくんの導入
- VOICEROID+ で音声を簡単に保存できる
- VOICEROID+ で保存したのを検知してタイムラインにオブジェクトを置いてくれる
- 音声ファイル
- 多目的スライダー
- 字幕準備
(2) aviutl
- PSDToolKit を導入しておく
- プロジェクトを開いて上書き保存できる状態にしておく
(3) 字幕の確認
(3-1) 字幕準備
- layer 13 に字幕準備を置く
- 単体では何も表示しない
- 適当にテキストを入力しておく
(3-2) 字幕表示
- layer 14 に字幕表示を置く
- 長めの範囲に置いておく
- 字幕準備のテキストが表示されるはず
- 位置調整はこっち
(4) 立ち絵の準備
(4-1) PSD ファイルを準備する
- PNG から作るのもあり
(4-2) pfv ファイルを PSDTool で生成する
- フィルタ機能を使ってシンプルビューを実現する
- 表情を限定的に選択することを柔軟に設定できる
- 参考
(4-3) PSD と pfv をタイムラインに読み込む
- layer: 15
- 編集 > PSDToolKit > ウィンドウを表示
- シンプルV で表情を変えられるか確かめる
(5) アニメーション効果のスライダーで立ち絵を変えられるようにする
(5-1) anm ファイルを作成
aviutl/script/im6442284_弦巻マキさん立ち絵素材ver2.0_MtU/im6442284_弦巻マキさん立ち絵素材ver2.0_MtU.anmを作成、編集していくcp932かつCRLFにする必要がある
編集 > PSDToolKit > ウィンドウを表示
- シンプルVタブ > 髪 > リンクを開くマーク > スライダー"髪" 全体をクリップボードにコピー
--track0:髪,0,4,0,1
local values= {
"S.お気に入り/*maki/髪~通常",
"S.お気に入り/*maki/髪~通常もみあげ無し",
"S.お気に入り/*maki/髪~ポニテ",
"S.お気に入り/*maki/髪~ポニテもみあげ無し",
}
PSD:addstate(values, obj.track0)
--track0:髪,0,4,0,1
--track1:特殊パーツ,0,5,0,1
local values= {
"S.お気に入り/*maki/髪~通常",
"S.お気に入り/*maki/髪~通常もみあげ無し",
"S.お気に入り/*maki/髪~ポニテ",
"S.お気に入り/*maki/髪~ポニテもみあげ無し",
}
PSD:addstate(values, obj.track0)
local values= {
"S.お気に入り/*maki/特殊パーツ~デフォルト",
"S.お気に入り/*maki/特殊パーツ~汗2",
"S.お気に入り/*maki/特殊パーツ~汗1",
"S.お気に入り/*maki/特殊パーツ~ほっぺ2",
"S.お気に入り/*maki/特殊パーツ~ほっぺ1",
}
PSD:addstate(values, obj.track1)
(5-2) アニメーション効果を適用する
- anm ファイルを読み込むために aviutl を再起動
- PSD ファイルのオブジェクトのプロパティでアニメーション効果を追加
- 適用する効果を
im6442284_弦巻マキさん立ち絵素材ver2.0_MtUにする - 効果を入れ替えて順番を
im6442284_弦巻マキさん立ち絵素材ver2.0_MtUの後描画@PSDにする
- 適用する効果を
- スライダーで立ち絵を変えられるか確かめる
(5-3) 多目的スライダーを使う準備
オブジェクトを分割することなく部分的に立ち絵を変えられる
- layer: 12 に多目的スライダーを置く
- PSDより前のレイヤー
- PSDオブジェクトについて
mpslider = 12
- 多目的スライダーをいじって立ち絵が変わることを確認する
(6) かんしくんを活用する準備
(6-1) かんしくんでできること
- VOICEROID+ の音声保存の半自動化
- 音声保存を押すとファイル名を決めて保存してくれる
- 監視するディレクトリに保存されたのを検知して aviutl のタイムラインにオブジェクトを置く
(6-2) 編集 > PSDToolKit > 環境設定
- [x] 「多目的スライダー」を生成
- スライダー: 今回は 4 個
- 立ち絵の変化の種類に合わせる
- 髪、表情、エフェクト、特殊パーツとしていたら4種類
- 終了マージン: 0
- 個人的な設定
- スライダー: 今回は 4 個
- [x] 「字幕準備」を生成
- 終了マージン: 30
- 個人的な設定
- 終了マージン: 30
- 発動条件
- [x] 1フレーム目に音声とテキストがある
*.exoをドロップした時
- [x] 1フレーム目に音声とテキストがある
(6-3) かんしくん/setting.txt
基本はテンプレートを編集して作る
グローバルセクション
padding = 0 # 0 ms 間を空ける filemove = 'move' destdir = '%PROJECTDIR%' # [[rule]] で上書きする deletetext = true delta = 15.0 freshness = 5.0
[[asas]]セクション
[[asas]] exe = 'C:\Program Files (x86)\AHS\VOICEROID+\TamiyasuEX\VOICEROID.exe' format = 'maki_*.wav' # same as rule/file folder = 'F:\tmp\voiceroid' # 一時的な書き出し
[[rule]]セクション
[[rule]]
destdir = '%PROJECTDIR%\voice\maki' # 動画で使うファイルの書き出し
dir = 'F:\tmp\voiceroid' # 監視
encoding = 'sjis'
file = 'maki_*.wav' # 監視
layer = 11
modifier = '''
text = re.gsub(text, "<<(.*?)|.*?>>", "${1}") -- ルビを除去
filename = os.date("%y%m%d_%H%M%S") .. "_maki_" .. tofilename(text, 10) .. ".wav"
'''
- さきほどの環境設定だと次のように配置される
- layer 11: 音声
- layer 12: 多目的スライダー
- layer 13: 字幕準備
(7) かんしくんを使う
かんしくん/forcepser.exeを実行- VOICEROID+ を起動しますかと聞かれる
- 事前に立ち上げるといいわけではないので注意する
- VOICEROID+(
asas/exe)が立ち上がる
- VOICEROID+ を起動しますかと聞かれる
- VOICEROID+ で音声保存を押す
asas/folderにasas/formatの名前規則で保存される
rule/dirにfileが保存されたのを検知するrule/destdirにファイルを移動する- 字幕準備などを生成して音声ファイルと一緒にドラッグ&ドロップする
rule/layerに追加される
(8) いろいろ確認
レイヤーの確認
- かんしくんが置いたもの
- layer 11: 音声
- layer 12: 多目的スライダー
- layer 13: 字幕準備
- 自分で置いたもの
- layer 14: 字幕表示
- layer 15: PSD
- かんしくんが置いたもの
音声の長さと字幕の長さの比較
- 終了マージン
かんしくんで追加したオブジェクト同士の間隔
padding = 0
多目的スライダーで変えられるか
(9) 参考
nvim-qt でクリップボードにコピーしたら Windows Terminal のウィンドウが出るだけだった
状態
Windows 11 ビルド 22621
neovim 0.9.0
win32yank.exe
- 選択して
"*yしたら Windows Terminal の win32yank.exe の画面が出てきて何も起こらない - 画面に適当に入力して
ctrl-Zを入力したらクリップボードに入力した内容がコピーされる
対処
%USERPROFILE%\scoop\apps\neovim\current\share\nvim\runtime\autoload\provider\clipboard.vim を編集して
elseif executable('win32yank.exe')
if has('wsl') && getftype(exepath('win32yank.exe')) == 'link'
let win32yank = resolve(exepath('win32yank.exe'))
else
let win32yank = 'win32yank.exe'
endif
let s:copy['+'] = [win32yank, '-i', '--crlf']
let s:paste['+'] = [win32yank, '-o', '--lf']
let s:copy['*'] = s:copy['+']
let s:paste['*'] = s:paste['+']
let s:cache_enabled = 0
return 'win32yank'
let s:cache_enabled = 0 を追加した。
バージョン変わるごとに編集するのは面倒だから、素直に g:clipboard を使うことになりそう。
curl で Discord Bot の Global Application Commands を削除
パラメータ
TOKEN = ...APPLICATION_ID = ...
一覧の取得
$ curl -X GET -H "Authorization: Bot $TOKEN" https://discord.com/api/v10/applications/$APPLICATION_ID/commands
全部消す
$ curl -X PUT -H "Authorization: Bot $TOKEN" -H 'Content-Type application/json' -d '[]' https://discord.com/api/v10/applications/$APPLICATION_ID/commands
線画抽出するスクリプト[GIMP]
アニメのGB素材を作ってみる(GIMP) - さメモ の線画抽出部分のスクリプトです。
色々分かっていないところがありますが、とりあえず。
%APPDATA%\gimp\2.10\scripts\script.scm
(define (line-drawing-extraction img layer radius) (gimp-undo-push-group-start img) ; レイヤーを複製 (define layer2 (car (gimp-layer-copy layer 1))) (gimp-image-insert-layer img layer2 0 0) ; 色 > 脱色 > 脱色 (gimp-drawable-desaturate layer2 DESATURATE-LUMINANCE) ; レイヤーを複製 (define layer3 (car (gimp-layer-copy layer2 1))) (gimp-image-insert-layer img layer3 0 0) ; 色 > 階調を反転 (gimp-drawable-invert layer3 FALSE) ; フィルター > ぼかし > ガウスぼかし (plug-in-gauss-rle2 RUN-NONINTERACTIVE img layer3 radius radius) ; レイヤーモード 覆い焼き (gimp-layer-set-mode layer3 DODGE-MODE) ; 下のレイヤーに統合 (gimp-image-merge-down img layer3 CLIP-TO-IMAGE) (gimp-undo-push-group-end img) (gimp-drawable-update layer 0 0 (car (gimp-drawable-width layer)) (car (gimp-drawable-height layer))) (gimp-displays-flush) ) (script-fu-register "line-drawing-extraction" "<Image>/Script-Fu/line-drawing-extraction" "Line-drawing extraction" "sandas" "copyright 2023 sandas" "2023" "*" SF-IMAGE "Input Image" 0 SF-DRAWABLE "Input Layer" 0 SF-VALUE "radius of gaussian blur" "3" )