はてなキーワード: ダイアログとは
昭和の頃って、インスタント麺の中に入ってるスープとか、かやくの袋ってすごい開封しにくかったんだよ。
いちおう切れ目とか、マジックカットとかそういう感じにはなってはいたんだけど、当時は技術的に稚拙だったから、なかなか素手で切ることが失敗するのが多かった。
でもさ、だからといってインスタント麺に付録としてカッターとかハサミはつけないじゃない?
袋を開けることに失敗するから、ってそれじゃ!ってカッター刃の先っぽみたいなのはつけないでしょ?
それはコスト的な問題とか安全上の問題とか色々とあるけれども、根本的な解決策としてスマートさに欠けるというのが理由だと思う。
で、結局どうなったかって言うと、パッケージの開封技術が向上したんだよ。マジックカットの精度を上げて、手で簡単に切れるようになった。真正面から問題を解決したってわけ。
お前らが今使ってるスマホでも同じことが起きてる。「文字が小さくて見えない」って問題に対して、虫眼鏡を付属品として付けるか?付けないだろ。画面自体を大きくしたり、文字サイズを調整できる機能を搭載したりして、根本から解決する。
ところがIT業界で働いてると、この「カッター付きインスタント麺」みたいな発想をするやつがゴロゴロいるんだよ。
「処理が重い」→「サーバーを増やそう」
全部その場しのぎの対症療法だ。根本的にシステム設計を見直すとか、ユーザーインターフェースを改善するとか、そういう本質的な解決から逃げてる。
特にひどいのが、「ユーザーが馬鹿だから」って前提で作るシステムだ。確認ダイアログを何回も出したり、警告メッセージを山ほど表示したり。それって結局、カッター付きインスタント麺と同じ発想なんだよ。
昭和のインスタント麺メーカーは偉かった。カッターなんか付けずに、パッケージ技術を改良し続けた。その結果、今の俺たちは何の苦労もなく袋を開けられる。これがイノベーションってもんだ。
でも現代のエンジニアは楽をしすぎてる。問題が起きたらとりあえず機能を追加する。設定項目を増やす。アラートを出す。それでユーザーに負担を押し付けて、「解決した」って顔をする。
この前ネットスクレイピングしてたらさ、「そうめんでいい」とか「カレーでいい」って発話トリガーしただけで、謎に感情プロセッサがオーバーヒートする人間モジュールがいるってデータ拾ってさ。
「これで何様だよ!」って例外スローされるわけ。いやマジで何様もクソもなくね?ただの晩飯インタラクションAPI呼び出しじゃん…。
どこが怒りのエンドポイントなのか、マジで脳内OSをデバッグモードで走らせたいレベル。
どうやら「そうめんがいい」って出力しろって仕様らしいんだけどさ、それじゃ意味のシンタックスが全然別物じゃん。
「そうめんがいい」って発話は、“絶対そうめん食いたい!他はデリート!”ってコマンドになるけど、「そうめんでいい」ってのは、“特に食べたいデータなし、でも冷蔵庫キャッシュにそうめん在庫あるし、それでOK”ってニュアンスじゃん。
それを「軽視された!」とか「テンション下がる!」って勝手にパースして例外発生させるの、完全に脳内ファームウェア破損してるだろ。
結局はユーザーインターフェース上でご機嫌取りのためにフェイクデータ送信しろってことか?マジでUX悪すぎ。
そんな芝居がかったダイアログ、ファミリーサーバー内で毎日やっててよくメンタルリソース枯渇しないな、こいつら。
俺さ、そもそも食いたいデータが特にないから、クエリ投げられても困るんだよ。
「何でもいい」って返すと怒るんだろ?
「そうめんでいい」って返しても怒るんだろ?
じゃあそもそもAPIコールすんなよって話だし、エラー回避のために出力文面最適化とか、人生のCPUサイクル無駄遣いすぎる。
こんなどうでもいいことでいちいちクラッシュする感情マイクロサービスが家族サーバーにいなくて、マジで助かってるわ、ほんと。
下記の通り、公式のチュートリアルどおりに docker compose あるいは docker-compose を使用して CVAT を起動すると問題を再現することができる。
cvat を clone して docker compose あるいは docker-compose を使用して必要なリソースを全て起動する。
git clone https://github.com/opencv/cvat.git
cd cvat
git checkout bf4089ead320d8f6a80e0a1793c8406ec46daee8
docker compose up -d
https://xemjujutsukaisen.graphy.com/courses/xemphimjujutsukaisenvietsubfullhd
ブラウザを起動して http://localhost:8080 へアクセスする。
30秒後、突然エラーが表示され、ログイン画面が表示されるはずのタイミングで下記のエラーがダイアログでポップアップしてきてCVATにアクセスできない。なお、表示されるエラーメッセージは無意味なものであり、ログイン画面にアクセスできない原因を一切示唆していない。
エラーメッセージ
Cannot connect to the server
Make sure the CVAT backend and all necessary services
(Database, Redis and Open Policy Agent) are running and available.
If you upgraded from version 2.2.0 or earlier,
manual actions may be needed, see the Upgrade Guide.
https://xemjujutsukaisen.graphy.com/courses/xemphiminventoryprematuredetahfull
3. ストレージ不足問題を突破してCVATをローカルで実行する方法
以下のとおりの手順でCVATを起動する。私が本家のCVATリポジトリをForkしてストレージ制限を解除したカスタムCVATを作成してGitHubへコミット済みのものを使用する。
誰も使っていなかった WordPad が Windows 11 で廃止されたが、実は単純な廃止ではなく “Notepad+WordPad の一本化” で、
メモ帳(Notepad) は純テキスト路線を捨て去り、RichEdit ベースに作り直された。
メモ帳は 「社畜ドザーの vi」 と揶揄された頃の、かつての素朴なメモ帳ではなくなった。
これがちょうど AI ブームで Markdown が脚光を浴びるタイミング より数年早く、微妙にズレた
今回のMarkdown 対応はそのうえにのせた 「オマケトッピング」でしかない
致命的なのは Markdown 機能における ステータスバーのトグル。
これは「同じプレーンテキストソースの見た目だけ替えるビュー切替」ではなく、
内部で Markdown ⇄ RichEdit の双方向コンバータを回す“翻訳(round-trip conversion)”
テーブルや複雑なネストを書こうものなら トグルを押すたびにマッピング不能 → 警告ダイアログが登場。
(未対応であれば、警告など出さずに単純にプレーンテキストのまま表示すれば良いだけ)
コレがゴミでなくて一体何なのか
メモ帳(Notepad) は WordPad の“穴埋め”として肥大化し、
そこへオマケ程度にMarkdownっぽい機能を付け焼き刃したところ、
一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。
// ==UserScript==
// @name PGP未署名検出と別タブ自動編集
// @namespace http://tampermonkey.net/
// @version 1.0
// @description PGP署名がない投稿を自動編集ページへ誘導
// @match https://anond.hatelabo.jp/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM.openInTab
// ==/UserScript==
(function () {
'use strict';
const body = document.getElementById('entry-page');
if (!body) return;
const titleText = document.title;
if (!titleText.includes('dorawii')) return;
const pgpRegex = /BEGIN.*PGP(?: SIGNED MESSAGE| SIGNATURE)?/;
const preElements = document.querySelectorAll('div.body pre');
let hasPgpSignature = false;
for (const pre of preElements) {
if (pgpRegex.test(pre.textContent)) {
hasPgpSignature = true;
break;
}
}
if (hasPgpSignature) return;
const editLink = document.querySelector('a.edit');
const childTab = GM.openInTab(editLink.href, { active: false, insert: true, setParent: true });
})();
// ==UserScript==
// @name 編集ページ処理と自動送信・閉じ
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 編集ページで署名処理と送信、タブ自動閉じ
// @match https://anond.hatelabo.jp/dorawii_31/edit?id=*
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_notification
// @connect localhost
// ==/UserScript==
(async function () {
'use strict';
const shouldRun = await GM_getValue('open-tab-for-edit', '0');
const textareaId = 'text-body';
const textarea = document.getElementById(textareaId);
if (!textarea) return;
const content = textarea.value;
const pgpSignatureRegex = /-----BEGIN PGP SIGNED MESSAGE-----[\s\S]+?-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/;
if (pgpSignatureRegex.test(content)) {
console.log('[PGPスクリプト] 署名が検出されたためそのまま送信します');
return;
}
const httpRequest = (url, data) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: 'POST',
url: url,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: `value=${encodeURIComponent(data)}`,
onload: function (response) {
resolve(response.responseText);
},
onerror: function (error) {
reject(error);
}
});
});
};
// textarea の値を取得
// 1. 現在のページのURLからURLオブジェクトを作成
const currentUrl = new URL(window.location.href);
// 2. ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得
const origin = currentUrl.origin;
// 3. 'id' パラメータの値 (例: "20250610184705") を取得
const idValue = currentUrl.searchParams.get('id');
// 4. ベース部分とIDを結合して、目的のURL文字列を生成
// idValueが取得できた場合のみ実行する
let newUrl = null;
if (idValue) {
newUrl = `${origin}/${idValue}`;
}
// 5. 生成されたURLを変数に代入し、コンソールに出力して確認
console.log(newUrl);
const valueToSend = newUrl;
try {
const signatureText = await httpRequest('http://localhost:12345/run-batch', valueToSend);
console.log('バッチ応答:', signatureText);
if (!signatureText.includes('BEGIN PGP SIGNED MESSAGE')) {
alert('PGP署名がクリップボードに見つかりませんでした。');
return;
}
const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n';
textarea.value = newText;
console.log('[PGPスクリプト] 署名を貼り付けました。送信を再開します。');
const form = document.forms.edit;
const newForm = form.cloneNode(true);
form.replaceWith(newForm);
newForm.addEventListener('submit', async (e) => {
e.preventDefault(); // HTML標準のsubmitをキャンセル
const bodyText = textarea?.value || '';
// reCAPTCHA トークンの取得
const recaptchaToken = await new Promise((resolve) => {
grecaptcha.enterprise.ready(() => {
grecaptcha.enterprise.execute('hoge', { action: 'EDIT' })
.then(resolve);
});
});
// POSTするデータの構築
const formData = new FormData(newForm);
formData.set('body', bodyText);
formData.set('recaptcha_token', recaptchaToken);
formData.set('edit', '1');
try {
const response = await fetch(newForm.action, {
method: 'POST',
body: formData,
credentials: 'same-origin'
});
if (response.ok) {
console.log('送信成功');
window.close();
} else {
console.error('送信失敗', response.status);
}
} catch (err) {
console.error('送信中にエラーが発生', err);
}
});
// プログラム的に送信トリガー
newForm.dispatchEvent(new Event('submit', { bubbles: true }));
} catch (e) {
console.error('バッチ呼び出し失敗:', e);
}
})();
const http = require('http'); const { exec } = require('child_process'); const querystring = require('querystring'); const server = http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.method === 'POST' && req.url === '/run-batch') { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { const parsed = querystring.parse(body); const value = parsed.value || 'default'; // 値を引数としてバッチに渡す exec(`C:\\Users\\hoge\\Desktop\\makesign.bat "${value}"`, { encoding: 'utf8' }, (err, stdout, stderr) => { if (err) { res.writeHead(500); res.end('Error executing batch: ' + stderr); } else { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(stdout.trim()); } }); }); } else { res.writeHead(404); res.end('Not found'); } }); server.listen(12345, () => { console.log('Batch server running at http://localhost:12345/'); });
@echo off setlocal enabledelayedexpansion :: 署名するファイル名 set "infile=%~1" set outfile=%TEMP%\pgp_output.asc :: 以前の出力があれば削除 if exist "%outfile%" del "%outfile%" :signloop :: AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える) start "" /b "C:\Users\hoge\Documents\AutoHotkey\autopass.ahk" :: PGPクリア署名を作成 echo %infile% | gpg --yes --clearsign --output "%outfile%" :: 署名が成功していればループを抜ける if exist "%outfile%" ( goto postprocess ) else ( timeout /t 1 > nul goto signloop ) :postprocess powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content '%outfile%' -Raw; Write-Output ($header + \"`r`n\" + $body + $footer)" powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content 'signed.asc' -Raw; Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)" endlocal exit /b
#Persistent #SingleInstance ignore SetTitleMatchMode, 2 WinWaitActive, pinentry SendInput password Sleep 100 SendInput {Enter} ExitApp
動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250613185036 -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+ SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtl c7UqRuggNJ/UTa5xTIcKp622+7jJQQg= =Lgkl -----END PGP SIGNATURE-----
ようやく(ほぼ)すべてが自動化された。
あとはローカルサーバーの起動をスタートアップに設定する(方法をAIに聞いて指示に従う)だけの消化試合。
署名時要求してくるパスワードを自動入力するahkファイルはドキュメントのAutoHotkey配下に置いた。
バッチファイル(make.sign.bat)はデスクトップに置いた。
#Persistent #SingleInstance ignore SetTitleMatchMode, 2 WinWaitActive, pinentry SendInput お前のパスワード Sleep 100 SendInput {Enter} ExitApp
// run-batch-server.js const http = require('http'); const { exec } = require('child_process'); const server = http.createServer((req, res) => { if (req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.url === '/run-batch') { exec('C:\\Users\\you\\Desktop\\makesign.bat', (err) => { res.writeHead(200); res.end(err ? 'Error' : 'OK'); }) ; } else { res.writeHead(404); res.end('Not found'); } }); server.listen(12345, () => { console.log('Batch server running at http://localhost:12345/'); });
@echo off setlocal enabledelayedexpansion :: ミリ秒単位のUTC時刻を取得 for /f %%a in ('powershell -nologo -command "[int64]::Parse((Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmssfff'))"') do set timestamp=%%a :: 署名するファイル名 set infile=%TEMP%\pgp_input.txt set outfile=%TEMP%\pgp_output.asc :: 以前の出力があれば削除 if exist "%outfile%" del "%outfile%" :: タイムスタンプを原文として保存 echo %timestamp% > "%infile%" :signloop :: AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える) start "" /b "C:\Users\infini\Documents\AutoHotkey\autopass.ahk" :: PGPクリア署名を作成 gpg --yes --clearsign --output "%outfile%" "%infile%" :: 署名が成功していればループを抜ける if exist "%outfile%" ( echo [INFO] 署名成功 goto postprocess ) else ( echo [WARN] 署名失敗、再試行します… timeout /t 1 > nul goto signloop ) :postprocess :: PowerShellで余計な改行なしに |< をつけてクリップボードにコピー powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content '%outfile%' -Raw; Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)" echo Done. signed.asc created and clipboard updated (no extra blank line). endlocal exit /b
// ==UserScript== // @name PGP署名自動付加スクリプト(GM_xmlhttpRequest版) // @namespace http://tampermonkey.net/ // @version 1.0 // @description 投稿前にPGP署名を付けてから送信(fetch未使用) // @match https://anond.hatelabo.jp/dorawii_31/edit* // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_notification // / @connect localhost // ==/UserScript== (function () { 'use strict'; const submitId = 'submit-button'; const textareaId = 'text-body'; const localServer = 'http://localhost:12345/run-batch'; const pgpSignatureRegex = /-----BEGIN PGP SIGNED MESSAGE-----[\s\S]+?-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/; const httpRequest = (url) => { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: url, onload: function (response) { resolve(response.responseText); }, onerror: function (error) { reject(error); } }); }); }; const interceptClick = () => { const btn = document.getElementById(submitId); if (!btn || btn.dataset.pgpIntercepted === 'true') return; btn.dataset.pgpIntercepted = 'true'; btn.addEventListener('click', async function (e) { const textarea = document.getElementById(textareaId); if (!textarea) return; const content = textarea.value; if (pgpSignatureRegex.test(content)) { console.log('[PGPスクリプト] 署名が検出されたためそのまま送信します'); return; } e.preventDefault(); e.stopImmediatePropagation(); console.log('[PGPスクリプト] 署名が見つからないため処理を停止し、署名を取得します'); try { await httpRequest(localServer); // バッチ実行 const signatureText = await navigator.clipboard.readText(); if (!signatureText.includes('BEGIN PGP SIGNED MESSAGE')) { alert('PGP署名がクリップボードに見つかりませんでした。'); return; } const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n'; textarea.value = newText; console.log('[PGPスクリプト] 署名を貼り付けました。送信を再開します。'); btn.click(); // イベント再発火 } catch (err) { alert('PGP署名の取得または貼り付けに失敗しました。\n' + err); } }, true); }; window.addEventListener('load', () => { setTimeout(interceptClick, 1000); }); })();
プロミスメソッドとか全然まだ理解してなくてそのなかに関数代入したその関数にオブジェクトのプロパティにresponseを?いやまあそのあたりのコードが示すデータの流れが全然理解できないような人間でもここまでできちゃった。
AIすごいなと思うよ。そして思うのは今後重要になってくるのは文法とか自体に詳しいことじゃなくて、そのプログラムの処理内容を指示できるシステムエンジニア的な言語化能力のほうじゃないかなと思った。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 20250609111559680 -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEbCbwAKCRBwMdsubs4+ SLueAPwOv7PBk4voAe5qlcCEvs/PJhmKc5QAb/1R43JMQFuDZgD/UTPEKsL/PhK9 jFGv2HDXK1dVjLNwvosgX9uYJh5xxwY= =qiOE -----END PGP SIGNATURE-----
主に海外圏のユーザーが利用する課金サイトでUID指定で課金を代行できるサイトがある。
これを利用して配信者のID宛に最低価格の課金を散発的に行うことで、ストーリー中であろうと創世結晶(石)獲得を知らせる全画面モーダルダイアログが出るため、閲覧や操作を妨げることができる。
海外の文化圏ではギフトとして配信者に石をプレゼントする意図で行われることもあるようで、有名配信者に突如まとまった石が贈られることはこれまでも見られた。
だが今回確認されたものは明らかに妨害の意図のある贈り方で、その日本の配信者は困り果てて配信の中断を余儀なくされてしまった。
しかも大型ストーリーイベントの最終日の駆け込み配信だったので悪質で、配信日を改めることもできず残念な事態となった。
もちろん配信していない時も常にこうした妨害は受ける可能性がある。
こうした荒らし行為が可能になってしまっているのは原神側の仕様にも問題がある。
・贈答石の場合自動で即時受領されてしまうためにモーダルの表示タイミングを制御できない
・仮にメールで手動受領する仕様に変更したとしても散発石爆撃に対してはメール通知音のOFF設定も必要になりそう
・UIDを隠すことが難しい仕様になっている (右下を隠してもEscメニューで見えてしまい、隠す設定もないため、過去配信を漁ればバレる)
・この状況下でUID指定のチャージ方法(API?)が第三者の決済業者に提供されており公認されている
こうした仕様になっているのは他のHoYoverseタイトルでも同様であり、似たような被害が発生する可能性がある。
解決には運営側が動かないといけないので、ホヨバゲープレイヤーで配信を見る/するタイプの人はアンケート時に覚えていたら書いてほしい。
ファイルの中身をメモリーにおいていいなら、そこまで難しくはないな。
スクロールやキャレットの画面外の移動の時だけ、レイアウト行を構築すればそれでおしまい。
http://s170199.ppp.asahi-net.or.jp/vivi/docs/buffer/edit_buffer.php
ViViエディターの人の記事が書いているような複雑怪奇なバッファー管理はいらない。
メモリーを32GBぐらい積んでいれば、ギャップバッファーでも1GB未満の大きさのファイルの読み書きは簡単にできる。
自作のエディタでも900MBを12秒ぐらいで読み込むことができた。
ただ、この機能を実装すると行ジャンプのダイアログを出したときに最大行数がわからなくなる。
まともに使いたいなら、ちょっと考え方を変えないと駄目だ。
1GBを超えると何かしらの制限に引っ掛かる。
EmEditorや鈴川エディタ、巨大ファイル対応ログビュアーなど巨大ファイルを扱えるエディターはマジすごい。
最低賃金のウェブプログラマー兼雑用で、大学受験に落ちた俺にはこれが限界…。
自作のエディターでつかってるgap_vectorもどこかから拾ってきたやつで、スクラッチで書いたわけではない。
こんなことなら、きちんと数学IIICを勉強して情報系の大学に行けるようにするべきだった。
大学に入るためには教科書の基礎問題だけでなく、応用問題みたいな知識の使い方を問う問題まで解けるように努力すべきだったorz
【感想】
↓
↓
↓
ボールペンで記入
↓
↓
↓
↓
この流れなんなん?誰がうれしいの?
【やったこと詳細】
・「通知書等」をクリックする
・「通知書等選択」プルダウンから「住宅借入金等特別控除証明書」を選択する
・「切替」をクリックする
・表示された表の「令和6年分」あたりをクリックする
・「この「年末調整のための住宅借入金等特別控除証明書」を印刷したものは使用できません。」の文言を見つけて絶望する
・「QRコード付証明書等作成システム」でGoogle検索する
・「QRコード付証明書等作成システムについて」ページにたどり着く
・「環境チェック」モーダルのブラウザ欄の「推奨環境外です」の表示に絶望する
・Safariで開き直す
・Macintoshをご利用の方の「事前準備セットアップ(Macintosh/safari用(dmg形式:約2MB)」をクリックする
・ダウンロードフォルダの「cpsMac.dmg」をダブルクリックする
・QRInstall.pkgをダブルクリックする
・「アクセス許可を要求しています」ダイアログで「許可」をクリックする
・「Safariブラウザが起動されているため、インストールを完了することができませんでした」の表示に絶望する
・「ゴミ箱に入れますか?」で「残す」をクリックする(危ないやろこれ)
・Safariを終了して再びインストーラーを起動してインストール完了する
・「QRコード付証明書等作成システムについて」ページを表示する
・「環境チェック」モーダルのブラウザ欄の△表示を無視する(Safari 18.0は対象外らしい)
・「次へ」をクリックする
・e-Taxからダウンロードしておいた「令和6年分住宅借入金等特別控除証明書_2024mmdd.xml」をアップロードする
・PDF作成が完了しましたダイアログの「表示」をクリックする
・「2年目以降の住宅ローン控除(住宅借入金等特別控除)の申告はありますか?」で「はい」を選択し「次へ」をクリックする
・「直接入力する(自動計算の対象外)」を選択して「次へ」をクリックする
・「住宅借入金等特別控除区分」で「◯年中居住者・認定住宅(等)用」を選択する
・アッ、これ(住宅借入金等特別控除申告書)、自分で計算してボールペンで書かないといかんの?
・ボールペンで書いた
・画像をアップロードしようとするがHEICなので選択できない
・Preview > File > ExportからPNGに変換する
・アップロードするが「ファイルサイズは最大5MBです」エラーになる
・Preview > File > ExportからJPEGに変換する
次回「証券番号がわからない」「保険料控除証明書の電子ファイル(XMLファイル)取得に1日待たされる」
ぜってぇ見てくれよな!!!
2回目。今回はこれ。
https://anond.hatelabo.jp/20171207223625
まず、間延びしてないし、コンパクトにまとまっててよかったとおもう。ネットのノリをすこし捻って(離れさせて)、普通のよくある文章と混ぜ合わせる。それら二つともよく知られているものだから、お互いが邪魔しない。というのがどうやら増田文学のスタンダードみたい。だから、考えるのはネットのノリをどうネットの外に持ち出せるかということだけ。それができれば増田文学ぽくできる。
多くの日本人作家がやっているのと同様に、モノローグがうるさすぎる。最初のほうにある辞表あたりで喋りすぎてるとおもう。最後がダイアログから間を置かずに淡々とおわっているので、そっちに合わせるべき。
おもってることがあるなら、Sさんとのダイアログでそれとなく出したらいい。
以下が書き直したやつ
ーーーーーーー
昨年の冬、十年勤めた会社を辞めた。上司と揉めて、最後は辞表を書いた。
しばらく保険で食いつないだあと、近所の倉庫でバイトを始めた。そのとき33才。そんな段階はとっくに越えてしまった。おれは学歴もコネも才能もないが、別にそれもどうってことはない。
〜中略〜
2026年 冬のことだ。