Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録

「const」を含む日記RSS

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

次の25件>

2025-03-10

LLMで50個くらいのjavascriptのvarをconst,letに置き換えさせたら

1Mトークン以上かかったわ

Permalink |記事への反応(0) | 10:01

このエントリーをはてなブックマークに追加ツイートシェア

2025-03-06

今のフロントエンドコードを書いてるとCOBOLの頃を思い出す

constを上から順にひたすら羅列していく感じがなんかね

と思うオブジェクト指向おじさんなのだった

以下chatgptによるremixjsの例

import { useEffect, useState } from "react";

import {json } from "@remix-run/node";

import { useLoaderData } from "@remix-run/react";

exportconst loader = async () => {

constresponse = await fetch("https://api.example.com/data");

const data = awaitresponse.json();

returnjson({ initialData: data });

};

export default functionIndex() {

const { initialData } = useLoaderData();

const [data, setData] = useState(initialData);

useEffect(() => {

const fetchData = async () => {

constresponse = await fetch("http://api.com/get");

const newData = awaitresponse.json();

setData(newData);

};

fetchData();

}, []);

if (initialData.value === null || data.value === null) {

return (

データの取得に失敗しました。

);

}

return (

<h1>Remix:SSR +クライアント処理</h1>

サーバーサイドの初期データ: {initialData.value}

クライアント更新したデータ: {data.value}

);

}

Permalink |記事への反応(2) | 23:47

このエントリーをはてなブックマークに追加ツイートシェア

ブクマエントリーページを開くブックマークレット

ちょっと長いけど、拡張機能より便利かなと。

javascript:(()=>{const%20loc=document.querySelector('link[rel="canonical"]')||location;const%20urlStr=(loc.href.startsWith('about:reader'))?decodeURIComponent(loc.href.slice(17)):loc.href;const%20url=new%20URL(urlStr);let%20s=url.search;s=(s.startsWith('?page=')||s.startsWith('?P='))?"":s;const%20w=window.open('https://b.hatena.ne.jp/entry?url='+encodeURIComponent(url.origin+url.pathname+s));w.document.close();})();

Permalink |記事への反応(0) | 08:48

このエントリーをはてなブックマークに追加ツイートシェア

2025-02-04

for文を使いたくないのはletを使いたくないか

https://gakuzzzz.github.io/slides/for_loop_to_higher_order_functions/#1

久々にアホな記事を見たので反論しておく

そもそも関数型にする大きな動機は「バグを減らすため」

これはオブジェクト指向でも同じでみんな「バグを減らすため」にいろんなパラダイムに挑戦してる

それ以外のHowだとかWhatだとかオブジェクト世界を表すだとかどうでもいい

結果的バグが減るならそれでいい

for文よりmapとかfilterの方がなぜバグが少ないか、というと「余計な操作が入りにくいから」

特にletで宣言してるような書き換え可能変数っていうのはバグの温床

例でも挙がってるようなProductのpriceの書き換えでもfor文にするとどこかにletな変数を置かないといけない

そんでletな変数っていうのはうっかり消してしまったりうっかり書き換えてしまっても気付くことができない

からconstで固めて何かしらのリスト処理をするときmapなりfilterなりを使ってconstに固め直す(か、そのまま使う)

逆に言うとそういう処理がないならfor文使っても全然構わない

本当に繰り返し処理をするんだから何も問題無い

この書き換え不可能変数を作るっていうのはCだとかC++だとかJavaだとかの頃からずーっと一緒でとにかく固めておきたい変数final宣言して書き換えさせない

そうしないと、めちゃくちゃ分かりづらいバグが混入して無意味に1週間とか過ごすことになる

Product.priceを直接書き換えるのはいいの?っていう疑問があるかもしれないが

これもしっかり規制するってのがオブジェクト指向的考え方で

「そこまでせんでも致命的にはならん」

っていう感じで型のチェックだけするのがTypeScript

まぁTSでもClass作れるから好きにすればいいんだけど

とにかくプログラミングに関する規則でHowだとかWhatだとかそういうフワフワしたこと言い出したら要注意

たぶん大学とかでフワフワしたプログラミングだけしてて碌なプロダクト作ったことない

ちゃんとしたプログラマーは

「これでバグが減ります(そして生産性が上がります)」

と言ってくれるから、そういうやつだけ重宝しろ

Permalink |記事への反応(14) | 22:55

このエントリーをはてなブックマークに追加ツイートシェア

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

上の'棒の式'とは符号が逆だね。こんなときsincos ではなくsinhcosh を使う。

 

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

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

 

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

sinhcosh は↓の定義

 

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 =ctcosh - xsinh =ct (cosh - v/csinh)

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

=ctcosh ( 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 が大きくなるほど時間の遅れは大きくなるよ




 

Permalink |記事への反応(0) | 14:09

このエントリーをはてなブックマークに追加ツイートシェア

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() {

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

consttextarea = 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);

})();

Permalink |記事への反応(1) | 23:00

このエントリーをはてなブックマークに追加ツイートシェア

2024-09-15

RSS 取得メモ

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

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

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

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

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

//RSSフィードURL

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

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

async function fetchAndSaveRSS() {

try {

//RSSを取得

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

constrssData =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;

}

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

constjsonData =JSON.stringify(result, null, 2);

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

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

});

}catch (error) {

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

}

}

// 実行

fetchAndSaveRSS();

Permalink |記事への反応(0) | 04:45

このエントリーをはてなブックマークに追加ツイートシェア

2024-09-13

function sleep(ms){

const startTime = newDate();

while(newDate() -startTime<ms);</p>

}

functionclickMore() {

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();

Permalink |記事への反応(0) | 12:52

このエントリーをはてなブックマークに追加ツイートシェア

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 => {

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

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

conststars = [];

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"));

})();

Permalink |記事への反応(0) | 11:54

このエントリーをはてなブックマークに追加ツイートシェア

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>

Permalink |記事への反応(2) | 15:39

このエントリーをはてなブックマークに追加ツイートシェア

2024-08-15

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

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

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

ブックマークレット

javascript: (async () => {
const wait =ms => newPromise(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-1611:47)

javascript:(async()=>{const wait=ms=>newPromise(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 => newPromise(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数でソートできればもっと厳正なランキングになるなーと今思いつきましたがそれも実装しません。

Permalink |記事への反応(1) | 21:55

このエントリーをはてなブックマークに追加ツイートシェア

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号 -義母 -義父」

ほ、ほんまや……!!!

Permalink |記事への反応(10) | 11:51

このエントリーをはてなブックマークに追加ツイートシェア

2024-07-13

anond:20240713093235

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

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

Permalink |記事への反応(2) | 10:18

このエントリーをはてなブックマークに追加ツイートシェア

2024-06-28

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

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

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

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

例えばTypeScript

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

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

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

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

クソコードっていうのは

consttoB = (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しか来ないですよね。なので十分です」

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

consttoB = (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 newError('banana')  }  return a}

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

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

Permalink |記事への反応(1) | 09:56

このエントリーをはてなブックマークに追加ツイートシェア

2024-06-26

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

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

https://anond.hatelabo.jp/20240125203115

// ==UserScript==// @name増田ミュート(白塗り版)// @namespace    http://tampermonkey.net/// @version      2024-06-26// @descriptionミューワードを含む最小限の範囲白塗りにする// @authorYou// @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",    ];    functionwhiteoutElement(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('');constregex = newRegExp(parts.map(char =&gt; `${char}&#92;&#92;s*`).join(''), 'i');            returnregex.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変更の監視constobserver = 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 });})();

Permalink |記事への反応(1) | 16:34

このエントリーをはてなブックマークに追加ツイートシェア

2024-06-23

anond:20240623053036

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

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

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

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

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

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

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

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

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

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

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

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

Permalink |記事への反応(0) | 23:03

このエントリーをはてなブックマークに追加ツイートシェア

2024-04-26

anond:20240426121548

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

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

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

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

const EXT_TEXT = ".txt";

const LOG_FILE_EXT = EXT_TXT;

とか。

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

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

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

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

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

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

Permalink |記事への反応(0) | 12:39

このエントリーをはてなブックマークに追加ツイートシェア

anond:20240426121548

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

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

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

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

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


const 〇〇ParamIntMax = 25;

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

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

Permalink |記事への反応(0) | 12:29

このエントリーをはてなブックマークに追加ツイートシェア

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

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

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

こんな感じ

constTxtFileExt = ".txt";constCsvFileExt = ".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」で直に書いたら、規約に従ってないからとコードレビューで指摘されて差し戻されたんだけど、そもそもこういう規約って何の意味があるの?

Permalink |記事への反応(4) | 12:15

このエントリーをはてなブックマークに追加ツイートシェア

2024-04-14

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

タイトル釣りです

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

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

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

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

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

ということだった。

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

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

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

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

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

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

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

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

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

Permalink |記事への反応(2) | 10:06

このエントリーをはてなブックマークに追加ツイートシェア

2024-01-10

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

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

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

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

targets.forEach((element)=>{

element.click();

});

(=>は半角にする)

Permalink |記事への反応(0) | 01:04

このエントリーをはてなブックマークに追加ツイートシェア

2023-12-29

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

松本人志以外も消える

// ==UserScript==// @name     hatebu-matsumoto// @version  1// @grant    none// @include     https://b.hatena.ne.jp/// ==/UserScript==var startTime =newDate().getTime();var t = setInterval(  () =&gt;{const list =document.querySelectorAll(".entrylist-contents-thumb,.entrylist-issue-thumb");    list.forEach(x =&gt; x.style.opacity ="0");if (newDate().getTime() - startTime&gt;10000){      clearInterval(t);}},10);

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

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

Permalink |記事への反応(1) | 20:43

このエントリーをはてなブックマークに追加ツイートシェア

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一見魅力的な理論に見えるが、実際には多くの経済的な問題を引き起こすだろう。

Permalink |記事への反応(0) | 17:48

このエントリーをはてなブックマークに追加ツイートシェア

2023-08-04

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

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

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

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

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

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

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

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

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

これに対して

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

「includeで十分」

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

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

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

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

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

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

ちなみに

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

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

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

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

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

とか言ってくるし

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

Permalink |記事への反応(3) | 09:03

このエントリーをはてなブックマークに追加ツイートシェア

2023-07-23

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

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

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

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

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

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

.forEach(div =&gt; {

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

if(diffSec&gt;

とかの

&lt;&gt;

<>

に変えてね

他にも見落としあるかも

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

// ==UserScript==// @name         hatebu masuda selkmark// @namespacehttp://tampermonkey.net/// @version      0.1// @description特定時間以内にブクマされた増田を強調する// @authorYou// @matchhttps://b.hatena.ne.jp/site/anond.hatelabo.jp*// @grant        none// ==/UserScript==(function() {  'use strict';const threshold = 60 *10 // 何秒以内かconst domain = 'https://anond.hatelabo.jp/'constdateTemplate = '202301020304' // 時分までurl時刻表記constdateTest = newRegExp('\\d{' +dateTemplate.length + '}')  document.querySelectorAll('div.entrylist-contents').forEach(div =&gt; {const masuda = div.querySelector('.entrylist-contents-title&gt; a')constdateStr = masuda.href.substring(domain.length +dateTemplate.length, domain.length)    if (!dateTest.test(dateStr)) {      //キーワードとかconsole.log('not diary',dateStr)      return    }    // newDateできるように変換    //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))constmin = parseInt(dateStr.substring(10,12))constdate = newDate(year, month - 1, day, hour,min)const bukumaDate = newDate(div.querySelector('.entrylist-contents-date').textContent) // 2023/01/23 00:00const diffSec = (bukumaDate -date) /1000 //ms tosec    if (diffSec&gt; threshold) {      return    }    //ブクマuserconstuser = div.querySelector('span.entrylist-contents-users a').lastChilduser.textContent += 'セルクマ ' + (diffSec / 60)    // 古い記事マイナスになる でも2015年ぐらいの記事までかな?新着はセーフ臭い    /*    if(diffSec &lt; 0) {user.textContent += ' 異常差分:' + diffSec    }    */  })})();

Permalink |記事への反応(3) | 12:02

このエントリーをはてなブックマークに追加ツイートシェア

次の25件>
ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp