「const」を含む日記 RSS

はてなキーワード: constとは

2024-10-08

anond:20241007235856

 

光の速さは一定

マイケルンモーレーという実験がある

地球宇宙空間を動いているのだから地球の進行方向と垂直方向では光の速さが変わるだろう。そう考えて実験してみたところ、どちらの速さも変わらなかった。つまり、どんな系でも光の速さは一定であるらしい。

 

これを式にするとこうなる。

光の速さをc, 時刻 t の間に光の進む距離を x として

x/t = c

式変形すると

(ct)^2 - x^2 = const = 0

おや、なんだか見たことある形になったね

 

空間回転を考えよう

ここで一旦休憩。座標系を回転させても'棒の長さは一定'という式を考えてみよう

x^2 + y^2 = const

かんたんのため z 方向は考えない

この時座系を回転させる式を行列で書くと

 

x' = | cos  -sin | x

y'    | sin  cos | y

こうなる。(心の目で読んで欲しい)

cos^2 + sin^2 = 1

という式を思い出すと

x'^2 + y'^2 = x^2 + y^2 = const

であることが確かめられると思う

 

戻って光の速さが一定の式

(ct)^2 - x^2 = const = 0

上の'棒の式'とは符号が逆だね。こんなときsin cos ではなく sinh cosh を使う。

 

cosθ = ((exp iθ) + (exp -iθ))/2

sinθ = ((exp iθ) - (exp -iθ))/2

 

sin cos は↑の定義だったのに対して

sinh cosh は↓の定義

 

coshθ = ((exp θ) + (exp -θ))/2

sinhθ = ((exp θ) - (exp -θ))/2

 

計算すると

cosh^2 - sinh^2 = 1 になるのがわかると思う。

cos^2 + sin^2 = 1 とは符号が逆になってるね

 

光の速さが系を変換しても変わらないという式を行列で書くと

ct' = | cosh  -sinh | ct

x'   | -sinh  cosh | x

こうなる。 これがローレンツ変換

 

(ct')^x - x'^2 = (ct)^2 - x^2

であることが確かめられると思う。

 

棒の長さが一定、つまり空間回転は空間方向 (x,y,z)しか混ぜないけれど、

光のはやさが一定、つまりローレンツ変換時間空間 (t, x ) を混ぜているでしょ?

 

時間が遅れる

速さ v で進むロケットを考えてみよう。

地上では昇くんがロケット観測している。

t 時間後に到達した距離を x として

v=x/t  

だ。

一方、ロケットには美加子さんが乗っていてその携帯電話の表示では地球を発ってから T時間である

Tを計算してみよう。

 

先程のローレンツ変換の式に代入すると

 

cT = ct cosh - x sinh = ct ( cosh - v/c sinh)

ここで x = ct を使ったよ。最後cosh で全体を纏める

= ct cosh ( 1 - tanh^2)

= ct (1/cosh)

になる。

ここまで誤魔化していたけど、cosh はロケットの速さ v で決まるパラメータ

1/cosh = \sqrt{1-(v/c)^2}

なんだ。天下り申し訳ないけど、増田では式も図も書けないので導出は勘弁して欲しい

とにかくまとめると

T = t \sqrt{1-(v/c)^2}

だね。ロケットの速度 v は光速度以下なので T < t になる。

地上で待つ昇くんが大学生になっても美加子さんが中学生のままなのはこんなワケだね

v が大きくなるほど時間の遅れは大きくなるよ




 

2024-09-22

AIインフルエンサーたちはChatGPTが世に出る前は何を投稿していたのか?(2/2)

AIインフルエンサーたちはChatGPTが世に出る前は何を投稿していたのか?(1/1)の続き

吉見拓哉|Takuya Yoshimi

このTwitterアカウントは、主にYouTubeSEO競馬アニメなどの話題について呟いており、自身活動や興味関心について発信しています

YouTubeプレミアムが500円増額。しかし、、、不可逆!!!

shimayuz@AIクリエイター

このアカウントは、日々の米国株暗号通貨市場動向、特にテクノロジー関連株やビットコイン価格変動についてツイートしています

ゼロコロナ政策再び。 $AAPL生産に影響が懸念され大きく下落。更に経済混乱が想定され、株価はSP500全業種で

一方で年末商戦売上堅調な滑り出しで $AMZN

暗号資産レンディングBlockFiが経営破綻暗号通貨も軒並み下落。

チャート上、なんとか踏み止まるか? 」

元木大介ᯅシステム生成AI Babel/Zoltraak & 生成AI塾

このアカウントは、AI特にプロマネAIや量子AIに関する話題や、仕事効率化、プログラミング、そして最新の技術トレンドについて呟いています

"プロマネAI実証実験を開始しました!量子AI×NotionによるプロマネAI実証実験を開始 https://prtimes.jp/main/html/rd/p/000000003.000082094.htmlvia @PRTIMES_JP"

sangmin.eth | Dify Ambassador

このアカウントは、主にOpenAIの最新言語モデルtext-davinci-003」の進化と、そのモデルを用いた英語学習ツールサービスについて呟いています特に英語学習におけるAI活用とその重要性を強調しています

"朝起きたら世界がまた変わっていた(笑)。@OpenAI が最新モデルtext-davinci-003」を発表。主な特徴は、①より明確で、説得力のある文章が書ける②より複雑な指示にも対応③より長い形式コンテンツが生成可 1月に"InstructGPT"が出た時も感動したけどそれを遥かに上回る進化、です。"

深津 貴之 / THE GUILD

このアカウントは、主にAI特に画像生成AIに関する話題を呟いています特にStable Diffusionのバージョンアップや使い方について多くのツイートをしています

結果

ここにリストアップした人たち以外もみましたが、分類すると3種類のアカウントがいて

1. ChatGPTブーム後にアカウントを始めた人

2. NFTなどの儲かりそうな技術を追いかけていた人

3. 日常ツイートをしていたが目覚めてしまった人

共通する特徴としては会社代表の人が多いです。

またIDを変更してログがヒットしない人は含まれていません(IDから特定できるけどそこまでやらなかった)

ツイートを取得するJS

javascript:(function() {

const text = Array.from(document.querySelectorAll('[data-testid="tweetText"]')).map(s => s.textContent.trim()).join('\n');

const textarea = document.createElement('textarea');

textarea.value = text;

document.body.appendChild(textarea);

textarea.select();

try {

document.execCommand('copy');

console.log('結果がクリップボードコピーされました!');

} catch (err) {

console.error('クリップボードへのコピーに失敗しました:', err);

}

document.body.removeChild(textarea);

})();

2024-09-15

RSS 取得メモ

const axios = require('axios'); // HTTPリクエストを行うためのモジュール

const fs = require('fs'); // ファイル操作モジュール

const xml2js = require('xml2js'); // XMLJSONに変換するためのモジュール

const chardet = require('chardet'); // 文字エンコーディングを検出するためのモジュール

const iconv = require('iconv-lite'); // 文字エンコーディングを変換するためのモジュール

// RSSフィードURL

const rssUrl = 'https://www.mlit.go.jp/important.rdf'; // 例としてRSSフィードURL指定

// RSSフィードを取得してファイルに保存する関数

async function fetchAndSaveRSS() {

try {

// RSSを取得

const response = await axios.get(rssUrl, { responseType: 'arraybuffer' });

const rssData = response.data;

// 文字エンコーディングを検出

const detectedEncoding = chardet.detect(rssData);

console.log('検出された文字エンコーディング:', detectedEncoding);

// UTF-8に変換

const utf8Data = iconv.decode(rssData, detectedEncoding);

// XMLJSONパース

xml2js.parseString(utf8Data, (err, result) => {

if (err) {

console.error('XML解析エラー:', err);

return;

}

// パース結果をファイル書き込み

const jsonData = JSON.stringify(result, null, 2);

fs.writeFileSync('rss_feed.json', jsonData, 'utf8');

console.log('RSSフィードファイルに保存されました。');

});

} catch (error) {

console.error('エラーが発生しました:', error);

}

}

// 実行

fetchAndSaveRSS();

2024-09-13

function sleep(ms){

const startTime = new Date();

while(new Date() -startTime<ms);</p>

}

function clickMore() {

sleep(200);

document.querySelector('[data-cl-params="_cl_vmodule:ans_re;_cl_link:more"]')?.click();

}

new MutationObserver(clickMore).observe(document.getElementById("leftColumn"), {childList: true, subtree: true});

clickMore();

2024-09-11

anond:20240910183149

そんな手作業でやらなくてよいぞ

これで思う存分やりなさい


(function() {

const data = [];

$$('span.hatena-star-inner-count').map(x => x.click());

$$('.js-bookmarks-recent .entry-comment-contents').map(content => {

const userName = content.getAttribute('data-user-name');

const comment = content.querySelector('.entry-comment-text')?.textContent;

const stars = [];

content.querySelectorAll('a.hatena-star-star').forEach(a => { stars.push(a.href.split('/')[3]); })

data.push([userName, comment, stars]);

});

data.sort((a,b) => b[2].length - a[2].length);

copy(data.map(d => `| ${d[0]} | ${d[1]} | ${d[2].join(',')} |`).join("\n"));

})();

2024-08-16

anond:20240816092530

増田コードを表示する方法説明しますね。

記法

ふつう投稿と違うのは以下の3点だけです。

特殊文字は、実体参照(& や <)ではうまくいきません。数値参照を使ってください。

出したい文字数値文字参照
&&
<&#60;
>&#62;

このようなコードを表示したい場合

const dinner = (chicken, curry) => {
if (chicken && curry) {
console.log('チキンかつカレー')
}
}

このように入力してください。

<pre>const dinner = (chicken, curry) =&#62; {<br>    if (chicken &#38;&#38; curry) {<br>        console.log('チキンかつカレー')<br>    }<br>}</pre>

2024-08-15

スターの多い順にブコメを並び替える

FANZAの検索結果から熟女を除外するブックマークレット がうまく動いたので、気を良くしてはてなブックマークコメント欄スター数順にソートするブックマークレット作りました

作った動機は、「注目コメントに入りきれなかったちょっといいコメント」をサクサク探したいから。結果として建設コメント順位付けモデル無効化していますが、あのアルゴリズムには特に不満は特にありません。

ブックマークレット

javascript: (async () => {
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
document.querySelector('.js-bookmarks-sort-tab[data-sort="recent"]').click();
window.scrollTo(0, document.body.scrollHeight);
await wait(1000);
window.scrollTo(0, 0);
await wait(1000);
const p = document.querySelector('.js-bookmarks-recent');
let l = Array.from(p.querySelectorAll('.entry-comment-contents'));
const g = e => {
let n = e.querySelectorAll('.hatena-star-star').length;
const c = e.querySelector('.hatena-star-inner-count');
return c ? n + Number(c.textContent) : n
};
l = l.filter(e => g(e) > 0);
l.sort((a, b) => g(b) - g(a));
p.replaceChildren(...l);
})();

ミニファイしたものコードに一部誤りがありましたので訂正しました(2024-08-16 11:47)

javascript:(async()=>{const wait=ms=>new Promise(resolve=>setTimeout(resolve,ms));document.querySelector('.js-bookmarks-sort-tab[data-sort="recent"]').click();window.scrollTo(0,document.body.scrollHeight);await wait(1000);window.scrollTo(0,0);await wait(1000);const p=document.querySelector('.js-bookmarks-recent');let l=Array.from(p.querySelectorAll('.entry-comment-contents'));const g=e=>{let n=e.querySelectorAll('.hatena-star-star').length;const c=e.querySelector('.hatena-star-inner-count');return c?n+Number(c.textContent):n};l=l.filter(e=>g(e)>0);l.sort((a,b)=>g(b)-g(a));p.replaceChildren(...l)})()

使い方

FANZAの検索結果から熟女を除外するブックマークレット 参照

コード解説

コード説明にダサイところがあったら厳しく指摘して下さい。

javascript:

ブックマークレット必要な、URLの種類を示すスキーム名です。

(async () => {
// 処理
})();

ページに元々ある変数たちとバッティングしないように、まず無名関数ラップします。処理の中で await を使いたいので async 宣言しています

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

処理の途中で待ち時間を設けるための関数です。便利。

document.querySelector('.js-bookmarks-sort-tab[data-sort="recent"]').click();
window.scrollTo(0, document.body.scrollHeight);
await wait(1000);

「新着コメント」タブをクリックし、ページの一番下までスクロールダウンしてから少し待つ動作です。新着コメントの後半部分(スクロールきっかけの遅延読み込みになっているところ)の読み込みをうながしています

window.scrollTo(0, 0);
await wait(1000);

ページの先頭に戻ってまた少し待ちます。合計2秒の待ち時間雰囲気で決めていますので、これでなければならない・これで過不足ないという値ではありません。単にコメントの読み込み完了を判定する処理を書くのがめんどうだっただけです。

const p = document.querySelector('.js-bookmarks-recent');

新着ブコメの親要素です。繰り返し呼び出すので名前をつけています

let l = Array.from(p.querySelectorAll('.entry-comment-contents'));

コメントをすべて配列に格納します。

const g = e => {
let n = e.querySelectorAll('.hatena-star-star').length;
const c = e.querySelector('.hatena-star-inner-count');
return c ? n + Number(c.textContent) : n
};

コメントはてなスター数をカウントして返す関数です。たくさんスターがついてる ★256★ みたいなやつの数字も足します。

l = l.filter(e => g(e) > 0);

ソートする前に、無スターコメントを消去しています。してもしなくてもいいことですが。

l.sort((a, b) => g(b) - g(a));

残ったコメントスター数で降順ソートします。.querySelectorAll() で収集した要素を配列に入れ直したのは、この .sort() メソッドを使いたいからです(.querySelectorAll() が返す配列風の NodeList オブジェクトは、配列共通メソッドもいくつかあるものの、大半は使えないのです)。

p.replaceChildren(...l);

親要素の内容を、並び替えの終わったコメントそっくり入れ替えて、処理完了です。画面を見ると新着コメントの中身が「スターのついたコメントのみ・スターの多い順」に並んでいます。元に戻す方法はないので、原状回復にはリロードします。ソート状態を示すフラグを立てておいてスターソート⇔日付ソートをかわりばんこに行うようにすればできそうだなと思ったけど実装しません。連打スターを省く処理を追加してUU数でソートできればもっと厳正なランキングになるなーと今思いつきましたがそれも実装しません。

2024-08-14

FANZA検索結果から熟女を除外するブックマークレット

興味のない作品検索結果に混じるのは邪魔ですよね。

私は熟女モノとか人妻モノは眼中にないのですが、なぜだか最近そっち系作品が多くて閉口しています

しかFANZA側の検索システムはNOT検索できるようになっていません。そこで、検索結果から除外できそうなものを除外するブックマークレットを作ることにしました。

さいわい近年は内容の概要文をそのままタイトルにしたような作品ばかりなので、タイトルに含まれキーワードで除外が簡単にできそうです。

熟女」とか「五十路」のような単語を含む作品非表示にしてしまえばよいのです。

ブックマークレット

javascript: (() => {
const r = /熟女|完熟|熟れ|四十路|五十路|六十路|人妻|奥様|妻|夫|母|ママ|おばさん|BBA|姑|嫁/;
const q = '#list>li';
document.querySelectorAll(q).forEach(l => {
if (r.test(l.textContent)) {
l.remove();
}
});
})();

ミニファイしたもの

javascript:(()=>{const r=/熟女|完熟|熟れ|四十路|五十路|六十路|人妻|奥様|妻|夫|母|ママ|おばさん|BBA|姑|嫁/;const q='#list>li';document.querySelectorAll(q).forEach(l=>{if(r.test(l.textContent)){l.remove()}})})()

このブックマークレットで、検索結果に含まれ熟女作品の数を1/3くらいにまで減らすことができます

使い方

ブックマークレットとは、ブックマークURLではなくJavaScript登録して、閲覧中のページ上で自分(やほかの誰か)が作ったプログラムを実行できるしくみのことです。普通ブックマークと同じようにブックマークバーなどに並べておいて、クリックひとつで呼び出すことができて便利です。

登録のしかたは簡単PCChromeを例に説明します。

①まず、どこのページでもいいので(今読んでいるこのページでもよい)ブックマークひとつ作り、ブックマークバーなどの呼び出しやすいところに置きます

②できたブックマーク右クリックして「編集...」を選びます

③「名前」欄は、自分にわかやす名前に変更します。でも「FANZAフィルター」などあけすけな名前をつけると、誰かに画面を覗かれた時に困りますよ。

④「URL」欄に、上記したプログラムコード入力します。ただし上記コードは私向けのキーワード選定になっていますので、ご自身の好みに合わせたキーワード選定をしていただければよいかと思います/単語1|単語2|単語3/ のように記述してください。

ふつうソースコードと、改行・インデントなどを省いてミニファイ(最小化)したもの、どちらをコピペしても大丈夫です。

編集の済んだブックマークレットを保存します。

FANZA動画検索します。

⑦このブックマークレットを起動します。すると、瞬時に検索結果が減ります

キーワードけが異なる複数ブックマークレット登録しておいて、場面に応じて使い分けるなどの工夫もできるでしょう。

コード解説

上記スクリプトが何か悪さをするようなものではないことを説明するために、また、JavaScript学習し始めたばかりの人のために、このシンプルスクリプト解説します。

javascript:

URLの種類を示すスキーム名です。一般的URLhttps:mailto: などで始まりますが、javascript: と書くと、これに続くコードプログラムとして実行されます

(() => {
// 処理
})();

ここからJavaScript です。まず処理全体をくるむ大きなカッコと最後に付け足された () は、自己実行無名関数という形式です。今回のブックマークレット変数を含みますので、実行するページに元々ある変数たちとバッティングしないようこのようなかたちにします。

const r = /熟女|完熟|熟れ|四十路|五十路|六十路|人妻|奥様|妻|夫|母|ママ|おばさん|BBA|姑|嫁/;

除外したい単語を羅列した正規表現です。個人個人で設定が変わる部分なので、編集やすいように切り出しておきました。

const q = '#list>li';

フィルター対象とするHTML要素群のクエリセレクター文字列です。検索結果に一覧表示される、個々の作品要素を選択します。FANZAシステム改修を行うと変わってしま可能性がある部分なので、メンテやすいようにここだけ切り出しておきました。

document.querySelectorAll(q).forEach(l => {
// 処理
});

クエリセレクター q に一致する要素 l ひとつひとつについて反復して処理を行います

if (r.test(l.textContent)) {
l.remove();
}

もし要素 l 内のテキスト正規表現 r と一致していたら、要素 l を取り除く、という処理です。正規表現 rキーワードの羅列ですので、テキストの一部にキーワードのどれかが含まれていたら一致したことになります

魂の叫び

追記

NOT検索できるよ。俺はこの検索結果をブックマークしている「サンプル -近親相姦 -MM号 -義母 -義父」

ほ、ほんまや……!!!

2024-07-13

anond:20240713093235

変数なんて教えなくていい派の俺が通りますよっと。

const が基本でいいし、ループmap とかで大体事足りる。

2024-06-28

可読性とクソコード全然違う

なんか競プロ出身者は可読性が低いとか言う話が多いけど

そうじゃなくてクソコードが多いんだよ

可読性が低いだけならまだマシだし、可読性は人によるよ

例えばTypeScript

っていうIssueがあったとして

const toBanana = (apple: 'apple'[]) =>
  apple.map((a, i) => (i % 3 === 0 ? 'banana' : a))
const toBanana = (apple: 'apple'[]) => {
  const appleAndBanana: ('apple' | 'banana') = 
  for (let i = 0; i < apple.length; i++) {
    if (i % 3 === 0) {
      appleAndBanana.push('banana')
    } else {
      appleAndBanana.push(apple[i])
    }
  }
  return appleAndBanana
}

のどっちが可読性が高いかっていうのは人によるよ

(長いソースを読むのがしんどい人と、関数化されたソースを読むのがしんどい人)

クソコードっていうのは

const toB = (a: any[]) =>  {
  for (let i = 0; i < a.length; i++) {
    if (i == 3) a[i] = 'banana'
    if (i == 6) a[i] = 'banana'
    if (i == 9) a[i] = 'banana'
  }
  return a
}

こういうの書いてくる人だよ

「お前これ10個以上来たらどうすんのよ」

テストでは10しか来ないですよね。なので十分です」

みたいに返事してくるし、修正させても

const toB = (a: any[]) => {
  for (let i = 0; i < a.length; i++) {
    if (i == 3) a[i] = 'banana'
    if (i == 6) a[i] = 'banana'
    if (i == 9) a[i] = 'banana'
    if (i == 11) throw new Error('banana')
  }
  return a
}

こんなんPRしてくる奴のことだよ

可読性が低いとかで文句言ってる奴はもっとレベルを下げた話をしてくれ

2024-06-26

非エンジニアだけどClaude3に増田ミュート作ってもらったよ

これを改善してってお願いした。何書いてあるかわからないけど動いたよ。

https://anond.hatelabo.jp/20240125203115

// ==UserScript==
// @name         増田ミュート(白塗り版)
// @namespace    http://tampermonkey.net/
// @version      2024-06-26
// @description  ミューワードを含む最小限の範囲白塗りにする
// @author       You
// @match        https://anond.hatelabo.jp/*
// @icon         https://www.google.com/s2/favicons?sz=64&amp;amp;domain=hatelabo.jp
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const muteWords = [
        "弱者男性",
        "弱男",
        "弱者",
        "婚活",
        "男",
        "女",
        "年収",
        "下方婚",
        "発達障害",
        "発達",
        "ハッタツ",
        "ハッタショ",
        "ハッタショ",
        "競プロ",
        "競技プログラミング",
        "AtCoder",
    ];

    function whiteoutElement(element) {
        element.style.backgroundColor = 'white';
        element.style.color = 'white';
        element.style.textShadow = 'none';
        element.style.cursor = 'default';
        element.style.userSelect = 'none';  // テキスト選択を防止
        element.style.borderBottom = '1px dashed #ccc'; // 枠線を追加してテキストがあることを示す

        // リンク場合クリック無効化
        if (element.tagName === 'A') {
            element.style.pointerEvents = 'none';
            element.removeAttribute('href');
        }

        // 子要素にも適用
        Array.from(element.children).forEach(child =&gt; {
            child.style.backgroundColor = 'white';
            child.style.color = 'white';
            child.style.textShadow = 'none';
        });

        // ツールチップを追加
        element.title = 'この内容にはミューワードが含まれています';
    }

    function shouldMute(text) {
        return muteWords.some(word =&gt; {
            const parts = word.split('');
            const regex = new RegExp(parts.map(char =&gt; `${char}&#92;&#92;s*`).join(''), 'i');
            return regex.test(text);
        });
    }

    function findSmallestMuteableElement(element) {
        if (element.nodeType === Node.TEXT_NODE) {
            return shouldMute(element.textContent) ? element.parentElement : null;
        }

        if (element.tagName === 'PRE' || element.tagName === 'CODE') {
            return shouldMute(element.textContent) ? element : null;
        }

        for (let child of element.childNodes) {
            const result = findSmallestMuteableElement(child);
            if (result) return result;
        }

        return shouldMute(element.textContent) ? element : null;
    }

    function processElement(element) {
        const muteableElement = findSmallestMuteableElement(element);
        if (muteableElement) {
            whiteoutElement(muteableElement);
        }
    }

    function processAllElements(root = document.body) {
        const walker = document.createTreeWalker(
            root,
            NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,
            null,
            false
        );

        let node;
        while (node = walker.nextNode()) {
            if (node.nodeType === Node.ELEMENT_NODE) {
                processElement(node);
            } else if (node.nodeType === Node.TEXT_NODE &amp;amp;&amp;amp; node.parentElement) {
                processElement(node.parentElement);
            }
        }
    }

    function handleClickEvent(event) {
        setTimeout(() =&gt; {
            processAllElements(event.target);
        }, 100);
    }

    // 初回実行
    processAllElements();

    // クリックイベント監視
    document.body.addEventListener('click', handleClickEvent);

    // DOM変更の監視
    const observer = new MutationObserver(mutations =&gt; {
        mutations.forEach(mutation =&gt; {
            if (mutation.type === 'childList') {
                mutation.addedNodes.forEach(node =&gt; {
                    if (node.nodeType === Node.ELEMENT_NODE) {
                        processAllElements(node);
                    }
                });
            } else if (mutation.type === 'characterData') {
                processElement(mutation.target.parentNode);
            }
        });
    });

    observer.observe(document.body, { childList: true, subtree: true, characterData: true });
})();

2024-06-23

anond:20240623053036

おつかれさまです (どのような事に従事されているか存じ上げませんが、一旦それに割り込む形で私が対話者として主体的に関わってよろしいでしょうか?/”こちから見て”あなた大事な用はおおきいことであるのでひとしきり労をねぎらわせていただいて)

 ┗あんたがどれほど疲れてるかなんて知らんがな 格下の私からみたらすごい大変なんやろなって そんなんしたら疲れてまうわと思うけどこっちも用事があるんですんませんけど割り込んでええかって意味

  ┗「つかれてへんわ」って自分自分基準でなんもしてないアピールされても「すごいですね」としか言えんやろがい 自分を語ってくれるんはありがたいけどそんな事はきいてないというか聞いてほしいことがあるって言ってんの

ごくろうさまです (どんな方の何事も誰かのために大切な用でありその価値自分世界観からみて重くあるから労をねぎらって)

 ┗苦労してるかどうかとか人生についての価値観とかは聞いてない 尊重していますよというスタンスから関係ない話をするけれども敵対的目線でお聞きするのではないですよというアピール

  ┗「くろうなんかしてないわ」ってだれもあなた人生を聞いたりしてへん いきなりちょっと関係ないっぽい話をするけどあくま社会的距離感もつでって事

挨拶で使う場合は「おはようございます」でも同じで、自分がそこにおる/いなくなるを告知する儀を割り込ませるための発言でゆってみたら変数宣言みたいなもん

いきなり出てきたら「はい!」で帰る時も「はい!」みたいなvarじゃなくてletとかconst使えって話

なんかするとゆうたらおらんなとおもったら「おるよ」とかそういえばおったっけとおもたらもういないみたいなtempな変数みたいな挨拶もせんやつに名前なんかいらんっちゅう話で個人名を「バイトくん」とかにしたらええって話

この度は って一期一会なのに何度もあるんかとか

お預かりします(自分店員なので料金精算の代行でありチップを頂かない事)を預かるだけやったら返せやとか

なんか全部真実描写自分の思い描いたままに発言しないと気が済まんというのは、文字書きの職業病かそのほかの病やと思うで

2024-04-26

anond:20240426121548

拡張子については、例えば Excel拡張子が変わったとき一括対応できる、とか?

あとは普通に".txt" で取り扱ってるファイルはどれだ、って時にその定数の参照箇所を見ればもれなく分かるとか、

取り扱うファイル種別を段階的に変えようってときも、どのファイルは変え終わっててどのファイルはまだ、とかも同じように分かる

あとはあれだ、どのスコープにおける分類なんだって話を明確にする事も出来るだろうな。

const EXT_TEXT = ".txt";

const LOG_FILE_EXT = EXT_TXT;

とか。

パラメータについては、複数選択肢から選ぶ奴は enumしろよ、とは思うが、

enum の前段として内部的な数値表現統一する意味はある

文字コードも大体同じような話か。

まぁ基本的には、拡張子にせよ文字コードにせよ、

ここに定義したもの以外は登場しないよ、という保証をする事は出来るわな。

"UTF-8"を使っている事は Grep かければわかるが、"UTF-8"以外使ってません、の方はそうはいかないし

anond:20240426121548

何年か前に事故った、どっかの地方自治体システムは、

.txt と .TXT挙動を変えていた話しがあったやん?

プログラム全体で、TxtFileExt が一カ所でしか使われてないなら、変数にする必要はほぼないけど、

2か所、3カ所になったら、.txt を .TXT に変えるだけでもミスする人でてくる。

.txt を .debug.txt とか .masuda.txt に気分次第で変える時も楽やん


const 〇〇ParamIntMax = 25;

プログラム全体で、一カ所しか使われてなければ変更ミスは生じないけど、

何カ所にも別れたら、変更時に見落とすやん。

これ何の意味があるのか教えてほしい

いろんなアプリケーションメンテ(バグ取りとか細かい機能追加とか)を何度か経験してきた。

主にテキストファイルとかCSVファイルとかExcelファイルとかを入出力するものばかりだったんだが、その大半がファイル拡張子グローバル変数化していた。

こんな感じ

const TxtFileExt = ".txt";
const CsvFileExt = ".csv";
const ExelFileExt = ".xlsx";

なので、読み書きするファイル名の指定時は、

outFileName = 〇〇 + ×× + "ABCDEFG" + TxtFileExt;

みたいな指定をしなきゃならない。

これ何の意味があるのかよく分からんのだけど、誰かわかる?

あと、プログラム言語標準的メソッドのあらゆる引数も全部変数定義されてて、そのまま渡すのは禁止、みたいな規約になってる。

たとえば引数が三種類(truefalse(未指定時のデフォルト値)、任意の数値(ただし当該プログラムでは0、10、25以外指定不可))しかないやつはこんな感じ。

const 〇〇ParamTrue = true;
const 〇〇ParamFalse = false;
const 〇〇ParamIntMin = 0;
const 〇〇ParamIntMid = 10;
const 〇〇ParamIntMax = 25;

文字コードなんかもこんな感じで定義されてる。

const charCodeSJIS = "Shift_JIS";
const charCodeUtf8 = "UTF-8";

以前関わった改修内容に「××の処理は開始時と終了時にそれぞれUTF-8(BOMなし)形式ログを出力する」みたいなのがあって、普通に文字コード指定する部分に「UTF-8」で直に書いたら、規約に従ってないからとコードレビューで指摘されて差し戻されたんだけど、そもそもこういう規約って何の意味があるの?

2024-04-14

モダンフロントエンドなんか意味ない

タイトル釣りです

去年から稼働している現場で、以前からあったReact Nativeの面倒を見ているんだがまあこれがひどい出来なんだ。

jQuery時代に見かけたようなコードをやたら見かけたので思わず懐かしくなってしまった。

リファクタリングしようとしたけど直す範囲が広すぎてアプリを壊しかねなかったので、早々に諦めてだましだまし保守をしていた。

そんな中今年に入ってアプリリニューアルの話が出てきた。React Native捨ててSwift/KotlinやらFlutterに書き換えるとかそういうのではなく、デザイン刷新といくつかの機能改修。

このままだとアプリが更に魔窟化するので、マネージャーに色々相談したところいくつかの事実がわかった。

ということだった。

結局現状のまま進めるわけにはいかず、要件定義の傍らリファクタリング作業をしている。

そういう経緯もあったので、リファクタリングテスト工数も積んだ上で見積もりだしてもらってる。

レガシーアーキテクチャモダンアーキテクチャ刷新」なんてよく聞く話しだけど、

実態は「長年の増改築とだましだましのリフォーム限界になってきたので新築で建て替えます」何だと思う。

最近は「Vue.jsからRemixマイグレーション」なんて見かけるけど、悪いのはVue.jsじゃなくて禄に設計しないでコード書いてるエンジニアと、

リファクタリングには予算でないけどマイグレーションなら予算取れるという悪しき風習

年がら年中フロントエンド刷新しているような会社地雷なので行かないほうがいい。

いくらRemixやらNext.jsやら最新鋭のフレームワーク使ってても、クソコードで書いたらクソが出来上がるだけだ。

新しいフレームワークを試す暇があったらリーダブルコード最初から読み直せ。

2024-01-10

まとめてユーザ非表示にする

しょうもない記事コメントしているしょうもないユーザーをまとめて非表示にする。

対象ページを開いてコンソールで下記を実行。

const targets = document.querySelectorAll('.entry-comment-ignoreuser');

targets.forEach((element)=>{

element.click();

});

(=>は半角にする)

2023-12-29

はてぶで松本人志顔写真を出さないようにするグリースモンキー

松本人志以外も消える

// ==UserScript==
// @name     hatebu-matsumoto
// @version  1
// @grant    none
// @include     https://b.hatena.ne.jp/
// ==/UserScript==

var startTime = new Date().getTime();

var t = setInterval(
  () =&gt; {
    const list = document.querySelectorAll(".entrylist-contents-thumb,.entrylist-issue-thumb");
    list.forEach(x =&gt; x.style.opacity = "0");
    if (new Date().getTime() - startTime &gt; 10000) {
      clearInterval(t);
    }
  },
  10
);

document.cssRulesを加工するかMutationObserverを使えよ。 これだと一瞬松本の顔が映るだろ

サンキューJS詳しくないから助かる

2023-12-08

[]標準的経済学MMT根本的違い

貨幣の総価値=y

単位あたりの貨幣価値=a

貨幣供給量=x

 

として、標準的経済学では(他の条件を一定とした時に)以下のように考えるのではないだろうか。

 

y = ax = const

 

重要なのはこの"const"という部分で、一定の値を取ることを意味する。つまり、aが増加すればxは減少する。

 

一方で、MMT仮定していることは何かというと、

 

y(x) = ax, a=const

 

である。この場合、aは減少も増加もしないので、xを増やせば増やすだけyが増加することになる。

これでMMT信者が言いたいことが大体分かってくる。以下は、標準的な考えからMMT批判するとどうなるのかというのを書く。

 

MMT現代貨幣理論)は、政府貨幣供給を増やすことで経済全体の価値を増やすことが可能であると主張する。しかし、この理論はいくつかの問題点がある。

まず、インフレーションリスクであるMMTは、貨幣供給を増やすことで経済活動を刺激すると主張している。しかし、貨幣供給が増えると、通常は物価が上昇する傾向がある。つまりインフレーションリスク高まる。これは、貨幣価値が下がり、生活費が上昇するという結果をもたらす。

次に財政規律の欠如であるMMTは、政府が無制限貨幣を発行できるという考え方を推奨している。しかし、これは財政規律を欠く可能性があり、長期的には経済の安定性を損なう

外国為替レートへの影響も懸念される。国が大量の貨幣を発行すると、その国の通貨価値他国通貨に対して下落する。これは、輸入費用の増加や投資流出を引き起こす。

MMT一見魅力的な理論に見えるが、実際には多くの経済的な問題を引き起こすだろう。

2023-08-04

綺麗なコードって綺麗に書くことじゃないよ

本当にあった話だけど、JavaScriptstrっていう変数テキストが入っていて

その変数に'apple'とか'banana'とかが入ってるかどうかを判別するっていうロジックを作るとき

const re = new RegExp("apple")
if(re.test(str)) console.log("match")

みたいなサンプルコードを見つけてきて

const re_apple = new RegExp("apple")
const re_banana = new RegExp("banana")
if ( re_apple.test(str) || re_banana.test(str) ) console.log("match")

っていうコードを書く人がおるんよ

別にプログラミング初めて3ヶ月の初心者じゃ無くて20年以上やってるようなベテランだったり

なんならチーフプログラマーとして若手指導してるような人でもこういうレベルの人って割といるわけ

これに対して

正規表現でORを書くべき」

「includeで十分」

かいう指摘ももちろん正しいんだけど

綺麗にコードを書くっていうのは

「これってappleとかbanana以外に増えたりしないの?」

「fruitsかどうかを判別するならその変数を作った方が良くない?」

っていうのを考えて実装するのが綺麗にコードを書くっていうことで

変数名だとか整形とかは大事だけどそういう話じゃ無いんだよね

ちなみに

正規表現でORを書きましょう」

とかをPRレビューコメントしても

「動いてるからいいじゃない」

「綺麗に書いても性能上意味ない」

「言ってることが良く分からない。何が違うのか」

とか言ってくるし

言ってこなくて言われた通りに直しても次もまた同じことしてくるのでマジでレビューって大変だよ

2023-07-23

素早くブクマされた増田を強調 簡易セルクマ検知ユーザースクリプト

https://b.hatena.ne.jp/site/anond.hatelabo.jp

で動くスクリプトでたとえば投稿10分以内にブクマされページに乗ったら「1 user」が「1 user セルクマ 1とか5(何分後にブクマされたか)」になる。もしマイナスなら誤判定なので無視して。

時間を置いたセルクマには効かないし普通ファーストブクマカがどれぐらいの頻度で確認してるかしらないけど5分以内や1分以内もポロポロあるのでまあ目安に。

増田URLと一覧の時刻表示差分を取ってます

増田じゃpre記法でも記号が変換されるみたいだから作業

.forEach(div =&gt; {

('.entrylist-contents-title &gt; a')

if(diffSec &gt;

とかの

&lt;&gt;

<>

に変えてね

他にも見落としあるかも

誤判定が減るから非公開ファーストブクマを判定できたらいいんだけどね。

// ==UserScript==
// @name         hatebu masuda selkmark
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  特定時間以内にブクマされた増田を強調する
// @author       You
// @match        https://b.hatena.ne.jp/site/anond.hatelabo.jp*
// @grant        none
// ==/UserScript==

(function() {
  'use strict';

  const threshold = 60 * 10 // 何秒以内か
  const domain = 'https://anond.hatelabo.jp/'
  const dateTemplate = '202301020304' // 時分まで url時刻表記
  const dateTest = new RegExp('\\d{' + dateTemplate.length + '}')
  document.querySelectorAll('div.entrylist-contents').forEach(div =&gt; {
    const masuda = div.querySelector('.entrylist-contents-title &gt; a')
    const dateStr = masuda.href.substring(domain.length + dateTemplate.length, domain.length)
    if (!dateTest.test(dateStr)) {
      // キーワードとか
      console.log('not diary', dateStr)
      return
    }

    // new Dateできるように変換
    // https://amateur-engineer.com/javascript-date-yyyymmddhhmm/
    const year = parseInt(dateStr.substring(0, 4))
    const month = parseInt(dateStr.substring(4, 6))
    const day = parseInt(dateStr.substring(6, 8))
    const hour = parseInt(dateStr.substring(8, 10))
    const min = parseInt(dateStr.substring(10, 12))
    const date = new Date(year, month - 1, day, hour, min)

    const bukumaDate = new Date(div.querySelector('.entrylist-contents-date').textContent) // 2023/01/23 00:00
    const diffSec = (bukumaDate - date) / 1000 // ms to sec

    if (diffSec &gt; threshold) {
      return
    }
    // ブクマ user
    const user = div.querySelector('span.entrylist-contents-users a').lastChild
    user.textContent += ' セルクマ ' + (diffSec / 60)

    // 古い記事マイナスになる でも2015年ぐらいの記事までかな?新着はセーフ臭い
    /*
    if(diffSec &lt; 0) {
      user.textContent += ' 異常差分:' + diffSec
    }
    */
  })
})();

2023-03-04

朝日新聞digitalプレゼント機能

無料会員のタダ読み3本機能の代わりに導入された有料会員によるプレゼント機能が導入されてもう1年(?)。増田が初めて知ったのはwattoさんのブコメプレゼントURLを貼ってくれた時だが、最近になってTwitterスーパーインフルエンサーの暇空アノンいちゃもんのおかげで一気に機能が周知された。その結果なのかTwitterでもプレゼントURLの貼り付けが増えた感。

面白いのは、いわゆるリベラル系のアカウントの利用のみならず、反リベラル系の有名アカウントもちらほらとプレゼント機能を利用してるってことな。閲覧数は反リベラル系が圧倒的。まあそれなりにコンサル系や研究者系なら思想の左右問わず朝日読売日経辺りを読まないわけにはいかないし、中立アピールのためにあえて朝日ソースを使うってことかな

 

そして我ながらとんでもなくみみっちいブックマークレットをChatGPTに頼んで作ってもらった

朝日有料記事プレゼント検索

朝日デジタルの有料記事ページを開いている時にクリックするとTwitterで有料記事プレゼント機能を使ってる(と思われる)ツイート検索するブックマークレット

javascript: (() => {  const currentUrl = window.location.href;  const digitalUrl = `digital${currentUrl.match(/\.asahi\.com\/articles\/.+\.html/i)[0]}`;  const searchUrl = `https://twitter.com/search?q=${encodeURIComponent(digitalUrl)}&f=live`;  window.open(searchUrl, %27_blank%27);})();

2023-02-15

リスト登録したユーザーはてブコメントを薄く表示するgreasemonkey

非表示機能で完全に無視したいって程でもないんだよな〜っていう。

タイプ別色分け機能とかこういうののはてなスター版とかも欲しい。面倒だから誰か書いて。

// ==UserScript==
// @name     hatebu_comment_usuku_hyouji
// @version  1
// @grant    none
// @include     https://b.hatena.ne.jp/entry/*
// ==/UserScript==

const userIdList = [
  'hoge',
  'piyo',
  ...
];

setInterval(() =&gt; {
  document.querySelectorAll('.entry-comment-contents').forEach((element, i) =&gt; {
    if (userIdList.includes(element.dataset.userName)) {
      element.style.opacity = '0.3';
    }
  });
}, 3000);

2023-02-09

anond:20230209202339

// 配列シャッフルする関数

const shuffle = (array) =&gt; {

for (let i = array.length - 1; i &gt;= 0; i--) {

const rand = Math.floor(Math.random() * (i + 1)); // 0〜iのランダムな数値を取得

[array[i], array[rand]] = [array[rand], array[i]]; // 要素の入れ替え

}

return array;

}

shuffle(['ラーメン', 'ピザ', 'カレー', 'ハンバーグ', 'チキン', 'オムライス', 'カツ丼', 'パスタ', 'フォーク', 'チャーハン', 'パン', 'パンケーキ', 'ライス', 'サラダ', 'チーズ', 'サンドイッチ'])[0]

'フォーク'

2023-02-03

最近UserScriptを書くのが楽しい

最近UserScriptを書くことに目覚めて、不便なWebサイトちょっと改造して好みにするのにハマってる

例えば「辞書系のサイトなのにページを開いた瞬間から入力欄にカーソルがあってないのがいや」とか、そういう細かい点をこちらで勝手に改修するするような感じね

で、増田において「この人記事に対して毎回○○って反応つけてるけど面白いと思ってやってんのかな? 面白いと思ってやってんなら致命的に自分センスが合わないから消したいし、面白いと思ってないならただの害悪から消したいな」と思うことがあるわけですが、そういった異なる価値観に対して自動的に適切な距離を置くためのスクリプトを作ったのでメモがてら貼り付けておきます

// ==UserScript==
// @name        ますどくさいスイッチ
// @namespace   Violentmonkey Scripts
// @match       https://anond.hatelabo.jp/2*
// @grant       none
// @version     1.0
// @author      anond
// @description description
// ==/UserScript==

(async () =&gt; {
    // ここにNGワードをどんどん追加する
    // 基本は文字列文字列で引っ掛けにくいなら正規表現でもいい
    const keywords = [
        "あえいうえおあお",
    ];

    const checkedMarker = `data-a${Math.random().toString(36).slice(-8)}`;
    const query = `div[id^="excerpt-"]:not([${checkedMarker}]`;

    const delTree = () =&gt;{
        const elems = [...document.querySelectorAll(query)];
        for(const elem of elems) {
            const textContent = elem.textContent;
            if(keywords.some((x) =&gt; (typeof x === "string") ? textContent.includes(x) : x.test(textContent))) {
                const parentContainer = elem.closest("li");
                parentContainer?.remove();
            } else {
                elem.setAttribute(checkedMarker, "true");
            }
        }
    };

    delTree();

    const mo = new MutationObserver(delTree);
    mo.observe(document.body, { childList: true, subtree: true });
})();
  1. ブラウザーにTampermonkeyやViolentmonkeyをインストールしUserScriptを動かせるようにする
  2. インストールした拡張機能ダッシュボードを開き新規スクリプトを追加する
  3. 上記全てをペタッと貼り付ける
  4. 配列keywordsに消したい文字列またはそれにマッチする正規表現を入れる
    1. いくらでも追加可能
    2. 多少増えたところで大して重くはならないと思う
  5. Ctrl+Sを推して保存する
  6. 記事の反応のうち消したい文字列に当てはまる発言(とさらにそれに反応した発言)がツリーから消える

keywordsを増やして君だけのどくさいスイッチを育ててね!

(追記)

ぐええ 文字勝手に置換されてる…不便だなあ

&gt;」となっている箇所を「>」を半角で入力したものに置き換えてください

ログイン ユーザー登録
ようこそ ゲスト さん