「Console」を含む日記 RSS

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

2025-12-09

はてなブックマーク増田一覧向けNGフィルタ

はてなブックマーク増田一覧の、さらに「すべて」(1 user)をチェックしている希有な人向けのユーザースクリプトを公開します。

https://b.hatena.ne.jp/site/anond.hatelabo.jp/?sort=eid

// ==UserScript==
// @name        Hatena Bookmark Anond Filter
// @namespace   https://b.hatena.ne.jp/site/anond.hatelabo.jp/
// @description はてなブックマークの『はてな匿名ダイアリー』の記事のうち、指定したNGワードが含まれ投稿非表示します。
// @match       https://b.hatena.ne.jp/site/anond.hatelabo.jp/*
// @grant       none
// @version     2.0.2026.01.28.0015
// ==/UserScript==

(function(){
  const SCRIPTID = 'HatenaBookmarkAnondFilter';
  console.time(SCRIPTID);
  const CLASSNAME = 'filtered';/*フィルタ該当要素*/
  const CHECKED = 'checked';/*二重チェック回避フラグ*/
  const ONCE = 1, AP = 2, INTERVAL = 3;/*適用タイミング*/
  const NGWORDS = {/* 合計100ポイント非表示判定(ただし1つの記事内で同じワード複数使われても1度しか加算しない) */
    '100': [/*即NG確定ワード*/
      'dorawii',
      'あおやまちゃん', 'ボスマン', 'MNK',
      '電気通信大学たいてい', 'なんぴょん', 'れめくん', 'リュックサック野郎', 'boushi_inst', 'hakaikami', 'Rekyu', 'iloveootaku_2',/*電気通信大学たいてい鉄道研究会れめくん(頻出)*/
      /*A-G*/'a9w8ru6fqyxqfv9', 'admirail_togo', 'akibakko6348', 'alf1974al', 'amatukiseiru', 'anapgoeson', 'aoi_mizuho', 'asapgoeson', 'asupgoeson', 'b6jbpsji91ieigt', 'bmi22yo', 'boushi_instrail', 'boushi_ob', 'buscholarx', 'bw0531', 'circlecavok', 'disney1007cla', 'dora22sibuya', 'donkotrain', 'ecotosk', 'electlone', 'factomodachi', 'fft_dareka', 'gmhtcyznf_abc', 'goesonanap', 'gyudon_honmono',
      /*H-N*/'h13_yokohama', 'h2twi', 'H2TWR', 'hamaishogo1111', 'haru_mofumoffu', 'hermitv8', 'hirabiscus', 'hinolovelove', 'hnmk0127_03', 'inaken17_', 'inte235dy', 'ixtabes', 'jamcombatge', 'kawachiasukanew', 'kaoru_ai1991', 'keio9730F', 'kiha2228', 'koreanlabsfc', 'koyounoyooko', 'kqlex1500', 'kurakamasan', 'kurotamaxxx', 'kt_ruma_1372', 'lightningreen77', 'mamadoll_kun', 'matya_uec', 'minamihinawot', 'minori0151', 'monkichi_22', 'mugen_08i', 'mukoroku651', 'nakano6409', 'nanpyong', 'new_oer', 'nimouec', 'NoName_thUFO', 'norannnde',
      /*O-U*/'oreizmmiporin', 'orenotanoshimi', 'osaka_sirokichi', 'papepoco', 'pasotokon', 'pm95uq', 'reme_kun', 'ruin_2002', 's03_amurtk2731', 'sacchan03110319', 'seisu_bot', 'senanana_cos', 'shinano_115', 'shineleaf1372', 'shop_bullet', 'shurimpy', 'soroisoroi', 'sui_pm95uq', 'sweidan821858', 'taiyaki_level2', 'takao_straight5', 'taking0000', 'tarotaromusic1', 'tc201_501', 'tocarbarn', 'toshikimiyazaki', 'train_magician', 'tx9y2cpwdz27255', 'u2fap5u4zw57811', 'uec15take', 'uecdaisuki', 'UECert', 'uecrail',
      /*V-Z_0-9*/'vampire_mio', 'vbdmnwefknmxsdm', 'vp20th', 'wafue', 'wakasato_', 'walkingniwatori', 'wataameexpress', 'ya4975349616894', 'ymbk_arisa', 'yms_uec16', 'yuuya_1104_uec', '__________ob', '_chocorail_', '_doitforthewin_', '_toeshin', '_unigmo', '100mph_no_yuuki', '169_D51_protect', '2969364x', '2rtkvn34il2783', '36kyo', '86lilxw1',
      /*tadaup.jp*/'1dOaKWk3.jpeg', '1sL2VBZ5.jpeg', '1uNK2iEP.jpeg', 'CBUHadpD.jpeg', 'CgJlF4Wr.jpeg', 'CGTtm0Ev.jpeg', 'CIxj8clS.jpeg', 'CqbERPdQ.jpeg', 'CTZsA2wM.jpeg', 'CWY2m7rS.jpeg', 'CZVCEgd1.jpeg',
      'テクウヨ', '自己放尿',
      ' ーーーーーーーー', 'https://anond.hatelabo.jp/20260107144223',/*AI問答貼り付け増田*/
      '†噛み締めて行こうな†',
      '困難女性(コンジョ)', '困難女性(コンジョ)', 'コンジョ自警団',
    ],
    '90': [/*ほぼNG*/
      'megalodon.jp',
      '鉄道研究会',
      '鉄研',
      '通勤特快',
      '不正乗車',
      'こども料金',
      '性慾',
      '穢い',
      'エッタ',
      'キセル',
      'uec',
    ],
    '10': [/*NG*/
      '電気通信大学',
      '電通大',
      '駿河台大学',
      '大学院',
      '学生課',
      '教務課',
    ],
  };
  const sites = {
    'prefix': [
      ['selector', '(modifier)', '(css)', '(REPEAT)'],
    ],
    'https://b.hatena.ne.jp/site/anond.hatelabo.jp/': [
      ['section.entrylist-unit li.js-keyboard-selectable-item', li => {li.querySelector('li.entrylist-contents-category > a').textContent = li.dataset.matches}, `.${CLASSNAME}{display: none;}`, AP],
    ],
  };
  const rules = sites[Object.keys(sites).find(prefix => location.href.startsWith(prefix))];
  if(rules === undefined) return console.log(SCRIPTID, 'Not found any sites.');
  const scores = Object.keys(NGWORDS).map(Number).reverse();/*数値インデックス順に取り出されたkeysを逆順にして100から並べ直す*/
  const filter = function(selector, modifier){/*各要素に対してNGワード判定して、該当したら追加でmodifierも適用する*/
    document.querySelectorAll(selector).forEach(e => {
      if(e.dataset[CHECKED]) return;
      e.dataset[CHECKED] = 'true';
      const text = e.textContent.toLowerCase();
      let total = 0, matches = [];
      for(const score of scores){
        for(const word of NGWORDS[String(score)]){
          if(text.includes(word.toLowerCase())){
            total += score;
            matches.push(word);
            if(total >= 100){
              e.classList.add(CLASSNAME);
              e.dataset.matches = matches.join(', ');
              if(modifier) modifier(e);
              return;
            }
          }
        }
      }
    });
  };
  /* ONCE(一括適用) */
  rules.forEach(rule => {
    const [selector, modifier, css] = rule;
    console.log(SCRIPTID, 'ONCE:', selector);
    filter(selector, modifier);
    if(css){
      const style = document.createElement('style');
      style.dataset.script = SCRIPTID;
      style.type = 'text/css';
      style.textContent = css;
      document.head.appendChild(style);
    }
  });
  /* AP(AutoPagerize) */
  rules.filter(rule => rule[3] === AP).forEach(rule => {
    const [selector, modifier] = rule;
    document.addEventListener('GM_AutoPagerizeNextPageLoaded', e => {
      console.log(SCRIPTID, 'AP:', selector);
      filter(selector, modifier);
    });
  });
  /* INTERVAL */
  rules.filter(rule => rule[3] === INTERVAL).forEach(rule => {
    const [selector, modifier] = rule;
    setInterval(function(){
      console.log(SCRIPTID, 'INTERVAL:', selector);
      filter(selector, modifier);
    }, 1000);
  });
  console.timeEnd(SCRIPTID);
})();
/* Hatena Bookmark Anond Filter */
.filtered{
  display: block !important;/*上書き*/
  opacity: .25 !important;
}
.filtered:hover{
  opacity: .75 !important;
}
.filtered li.entrylist-contents-category{
  background: red !important;
  font-weight: bold;
}

検索用: はてなブックマーク はてブ はてな匿名ダイアリー 増田 スパム キーワード NGワード フィルタミュー非表示 削除 隠す ブロック ユーザースクリプト ユーザースタイル hatena bookmark anond spam keywords ngwords filter mute hide hidden display none block userscript JavaScript js css style

2025-11-22

ChatGPT すごい

utf8の文字コード構成されたバイナリファイルがある。このファイルの改行の数を数えよ。改行はCRのみとする。このファイルにはCR が必ず含まれており、CRで分割すればマルチスレッドで処理できる。

質問したら、c++pythonコードが出てきた

size_t count_cr_in_file(const std::string& path) {

std::ifstream fs(path, std::ios::binary);

fs.seekg(0, std::ios::end);

size_t size = fs.tellg();

fs.seekg(0);

const size_t thread_count = std::thread::hardware_concurrency();

const size_t chunk_size = size / thread_count;

std::vector<std::future<size_t>> futures;

for (size_t t = 0; t < thread_count; t++) {

size_t start = t * chunk_size;

size_t end = (t == thread_count - 1 ? size : (t + 1) * chunk_size);

futures.push_back(std::async(std::launch::async, [start, end, &path]() {

std::ifstream fs(path, std::ios::binary);

fs.seekg(start);

size_t count = 0;

for (size_t i = start; i < end; i++) {

char c;

fs.read(&c, 1);

if (c == '\r') count++;

}

return count;

}));

}

size_t total = 0;

for (auto& f : futures) total += f.get();

return total;

}

def count_cr(path):

import mmap

with open(path, "rb") as f:

mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)

return mm.count(b'\r')

c#で書けと指示したところ、

using System;

using System.IO;

using System.IO.MemoryMappedFiles;

using System.Threading.Tasks;

class CountCR

{

public static long CountCRInFile(string path)

{

using var mmf = MemoryMappedFile.CreateFromFile(path, FileMode.Open, null);

using var accessor = mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read);

long fileSize = accessor.Capacity;

int processorCount = Environment.ProcessorCount;

long chunkSize = fileSize / processorCount;

long total = 0;

object lockObj = new object();

Parallel.For(0, processorCount, i =>

{

long start = i * chunkSize;

long end = (i == processorCount - 1) ? fileSize : (i + 1) * chunkSize;

long localCount = 0;

byte b;

for (long pos = start; pos < end; pos++)

{

accessor.Read(pos, out b);

if (b == 0x0D) // CR

localCount++;

}

lock (lockObj)

{

total += localCount;

}

});

return total;

}

static void Main(string[] args)

{

string path = "yourfile.bin";

long count = CountCRInFile(path);

Console.WriteLine($"CR count = {count}");

}

}

というコードが出てきた。

実際はcrlf,lfもあり得るんだが、そこは考慮しなくてもよく、そう考えるとaiはすごいとしか言いようがない。

なお、utf8として成立する単位区切りつつ改行を数える場合、もう一工夫いる。

SJISもできるようにするともっと面倒なことになりそう…)

2025-10-22

自分ホームページを作ったかどうかでWEBの見え方が180度以上違う話

以下ChatGPT

自分ホームページ(自前ドメイン+自前HTML)を一度でも作って運用すると、SNS中心の“受け手視点から仕様検索配信・所有・継続の“作り手”視点に脳が切り替わる。結果、情報リテラシーは跳ね上がり、ネットニュース流行の見え方が根本から変わる——しか想像以上に。

1. “タイムラインからアーキテクチャ”へ

Before(作る前): WebSNSタイムライン。良し悪しは「バズってるか」「見やすいか

After(作った後): WebプロトコルブラウザHTML/CSS/JSCDN検索エンジン。

ページは**文書(Document)**であり、配置(IA)、意味づけ(セマンティクス)、配信HTTP/HTTPS/HTTP/2/3)、キャッシュ戦略が気になりだす。

→ 同じ記事でも「タイトルの付け方」「hタグ構造」「画像最適化」「OGP」「サイトマップ」がまず目に入るようになる。

2. “アルゴリズム運”から“所有と積み上げ”へ

プラットフォーム依存の脆さを体感規約変更やシャドウバン露出が消える。

サイト資産化:ドメインに紐づくURLリンクされ、検索に積み上がり、10年後も生きる。

POSSE(Publish (on your) Own Site, Syndicate Elsewhere):まず自分サイトに出してから外部へ配信する習慣が身につく。

3. “好き/嫌い”から“なぜ速い・なぜ遅い”へ

Core Web Vitals(LCP/FID/CLS)や画像の遅延読み込み、フォント最適化重要性が腹落ちする。

広告・計測タグの重さに過敏になる。読者体験を壊さないためのパフォーマンス予算という概念生まれる。

4. “なんとなくSEOから情報設計×検索意図”へ

キーワード選定は“流入ゲーム”ではなく読者の課題コンテンツ設計帰着

内部リンクパンくず・スキーマ構造データ)・サイトマップ意味が実務として理解できる。

“書けば伸びる”ではなく“検索意図を満たす設計が伸びる”に目が覚める。

5. “見た目”から意味アクセシビリティ)”へ

alt見出し階層コントラスト比、キーボード操作、焦点管理など、見えない品質が最重要になる。

デザインは飾りではなく“読み・理解操作”のためのユーティリティだと分かる。

6. “PV至上”から継続コミュニティ”へ

たまたま当たる1記事より、更新継続アーカイブ性・RSSのほうが効くと実感。

コメント欄メールフォーム・X連携よりも、ニュースレターRSS購読者の質に価値を見出す。

7. “無料神話からコスト責任”へ

ドメインDNS証明書バックアップ法務特商法プライバシーポリシー)に“運用者の責任”が生まれる。

その重みが情報信頼性を引き上げる(=他人サイトの苦労も見えるようになる)。

8. “トレンド追従から自分OSを持つ”へ

サイト思想作品OS

トレンドは“輸入”ではなく選別になる。自分歴史に合うものだけを採用して積層していける。

9. まず一歩:最小スタックで“今夜リリース”する

Node.jsを避けたい人向けに、極小構成OK

A. 最小HTML(雛形)

<html lang="ja">

<head>

<meta charset="utf-8" />

<meta name="viewport" content="width=device-width,initial-scale=1" />

<title>あなた名前 | ホーム</title>

<meta name="description" content="自分ホームページ制作物・日記メモを置いていきます。">

<link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.xml">

<meta property="og:title" content="あなた名前 | ホーム">

<meta property="og:description" content="自分ホームページ制作物・日記メモ。">

<meta property="og:type" content="website">

</head>

<body>

<header>

<h1>あなた名前</h1>

<nav>Home / About / Posts</nav>

</header>

<main>

<article>

<h2>はじめまして</h2>

ここからすべてを自分URLに積み上げます

</article>

</main>

<footer>© 2025 あなた名前</footer>

</body>

</html>

B. ホスティング無料~低コスト

GitHub Pages(Jekyll標準。Rubyベース、Node不要

Cloudflare Pages(静的ファイルを置くだけで高速CDN

レンタルサーバー(静的HTML+SFTP/rsyncで十分)

C. ドメインの基本

覚えやすい短さ+ローマ字。将来10年使える名前に。

DNSA/AAAA/CAA/TXT最低限、HTTPS必須Let’s Encrypt無料化)。

D. “最低限の品質チェック”5点

タイトル・description見出し一貫性

画像は適切なサイズalt

モバイルでの可読性(文字サイズ行間

OGPが効いているか(XやLINEURLを貼って確認

RSS/更新履歴の有無(継続を前提に)

10. 一歩先へ:運用で差がつく“3つの習慣”

ログを読む:Search Consoleと簡易アクセスログで“本文よりメタ情報”を磨く。

アーカイブ主義記事追記更新URLは変えない。Versioningを意識

POSSE徹底:自サイトに公開→SNSには要約+リンク本体は常に自分土俵

2025-08-21

dorawii@執筆依頼募集中

自動ブクマするローカルサーバーとかの構成を作った。

ブクマには↓のサブアカ使用

https://profile.hatena.ne.jp/dorawii_bukuma/

はてなサイト側で読み込まれているはずのrksトークンを生成する関数を直接叩く方法がどうしても分からず結局request処理を自分で書く方法ではなく自動UI側の保存ボタンクリックするという無難な方向に落ち着いた。

最初から後者方法をとっていればもっと全然早く作れたのにというは所詮言い訳か。

とにかくスクリプトを公開しておく。

start-server.bat

@echo off
cd /d "C:\Users\user\Documents\jsscript"

:: Nodeサーバーを別ウィンドウで起動
start /min "" node run-batch-server.js

:: Pythonサーバーを別ウィンドウで起動(hatenaserver配下
start cmd /k "" python hatenaserver\server.py

以降はjsscript直下に配置

config.json

{
"username": "",
"password": ""
}
server.py

from flask import Flask, request, jsonify
import json
import os
from hatena_client import HatenaClient
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

config_path = os.path.join(os.path.dirname(__file__), 'config.json')
with open(config_path, encoding='utf-8') as f:
config = json.load(f)

@app.route('/bookmark', methods=['POST'])
def handle_bookmark():
data = request.json
url = data.get("url")
if not url:
return jsonify({"error": "Missing URL"}), 400

client = HatenaClient(config["username"], config["password"])
client.start_browser()

if not client.login():
client.quit()
return jsonify({"error": "Login failed"}), 403

success = client.add_bookmark(url)
client.quit()

return jsonify({"status": "ok" if success else "fail"})

if __name__ == "__main__":
app.run(port=12347)

あとはグリモンユーザスクリプトとして書くやつ

// ==UserScript==
// @name 自動セルクマ送信
// @namespace tampermonkey.net/
// @version 2025-08-07
// @description try to take over the world!
// @author You
// @match anond.hatelabo.jp/*
// @grant none
// ==/UserScript==

(function () {
'use strict';

const url = location.href;
if (!/^https:\/\/anond\.hatelabo\.jp\/\d+$/.test(url)) return;
const editLink = document.querySelector('a.edit');
if (!editLink) {
// 既に編集ページなので処理をスキップ
console.log('編集リンク存在するため、スクリプトを終了します。');
return;
}

fetch('localhost:12347/bookmark', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ url: url })
}).then(r => console.log("通知成功")).catch(e => console.error("通知失敗", e));
})();
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

https://anond.hatelabo.jp/20250821192753# 
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKb0qwAKCRBwMdsubs4+
SHfiAQDcXmTHBaZ5Zzr1KI/OxZ0xl69oevOdy1FXJYwYvsmo5AD/ZPtZiO1JgTDj
m+27iymlkdzIXOIGWfC82UTr1mJ7EwU=
=YoV+
-----END PGP SIGNATURE-----

2025-07-15

anond:20250714161258

へぇー、って感じだ。おもしろい。

ただちょっと読んでいて気になる点があったので聞いてみたい。

自分日本所謂ハクスラ」の用法しかよく知らなかった(あとついでにRogueもやったことない)素人なので全然的外れかもしれないが・・・・。

 

気になったのは引用されていた英語版wikiの以下の部分

The term "hack and slash" was originally used to describe a play style in tabletop role-playing games, carrying over from there to MUDs, massively multiplayer online role-playing games, and role-playing video games. In arcade and console style action video games, the term has an entirely different usage, specifically referring to action games with a focus on real-time combat with hand-to-hand weapons as opposed to guns or fists. The two types of hack-and-slash games are largely unrelated, though action role-playing games may combine elements of both.

ここでは「RPGにおけるhack and slash」と「アクションゲームにおけるhack and slash」という2つのhack and slashがあり、

「the term has an entirely different usage,」 「The two types of hack-and-slash games are largely unrelated,」とあるように歴史的にも定義的にもそれらは別のものしかし両方を兼ねるものもある)と読める。

 

で、気になったのはこの「RPGにおけるhack and slash」と「アクションゲームにおけるhack and slash」が増田の言う「日本語の「ハクスラ」 」と「英語の「hack and slash」 」に重なっている様に見えた事だ。

で、もしそうだとすると増田の「英語の/日本語の」という2分法は正確ではなく、本来は「アクションの/RPGの」とすべきだった可能性があるようにも思えてくる。(何故なら「RPGの」も英語版用法説明されているので)

更に増田は「 『Dungeons and Dragons』のような当然英語用法で参照すべき作品」と記事への批判根拠としていた『Dungeons and Dragons』は「アクションの/RPGの」では「RPGの」に属すると思われるため、

(もし増田が「アクションの」を本来hack and slashだと考えている場合)「 『Dungeons and Dragons』のような当然RPG用法で参照すべき作品」というように、むしろ逆になってしまうようにも思える。

 

アクションの/RPGの」の2分法が正解だった場合、「RPGの」の方のhack and slashには近接武器を用いて戦うだけでなく、その報酬アイテムゲーム通貨経験値など?)にも着目することは特に自然ではないように見える(が、前述の通り素人なのでよく分からない)

のだけど、一方で「 『Rogue自体が該当しない条項が「ベルリン解釈」に存在するわけない」については「たしかにそうかも」と思ったので、

ベルリン解釈の部分については増田の方が正しい可能性が高いんじゃないか?と思ってる。

という訳でいろいろ細かい事は書いたものの、最終的な結論としては増田側が正しい可能性がありそう、と思ってる。

ただ増田他者に厳密性を求める以上、自身も(例え総論結論が正しくても)細かい点を突っ込まれる事は許容せざるを得ないのでは?と思い(まぁ、というよりは自分の疑問の解決のために)書いてみた。

(ちなみにRogueをやった事が無いので分からないんだけど、敵を倒した際の報酬って無いの?一応ネット攻略情報を軽く調べた結果、アイテムドロップ経験値もなさそう?とは思ったけど・・・だとすると敵と戦う意味はあまり無い(可能なら回避正義?)ゲームなのかな?)

2025-06-13

我が名はサイボーグdorawii

パーマリンク署名対象にするより堅牢自動化を作れた。

一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。

改めてスクリプト配布しちゃる

最初投稿してエントリページに移動した親タブ側のjsコード
// ==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 });

      })();
親タブから開かれる編集ページの子タブのjsコード
 // ==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);
        }

      })();
node.jsで動かすローカルサーバーコード
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
AutoHotkey(以前と同じ)
#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-----

2025-03-18

スターフィールドがPS5に登場するかもという話

スターフィールド」とは、ベセスダ・ソフトワークスが開発したオープンワールドSFアクションロールプレイングゲーム

ちなみにベセスダ・ソフトワークス現在マイクロソフトの傘下にあるため、当然ながらXboxPCしか販売されていない。

 

まずは背景として、

 

…という背景から

 

ということが最近あったため、もはやスターフィールドがPS5にも登場するのは時間問題と噂されている。

確かこのソフトは「Xbox Console Exclusive(ゲーム機に関してはXbox独占)」と宣伝されていたはずたが、もしPS5版が出るとなったらこれも崩れることになる。

2025-03-13

病院内で提供されるWiFi挙動メモ

身体を壊して先日ちょっと入院していたのだが、病院内ではWiFi提供されていたので、消灯時間外の日常生活アクセスはそれのお世話になっていた。消灯時間は夜9時から朝6時までだ。

事前に「入院生活にそぐわないサイトには接続できません」という告知が為されていたので、覚悟の上で使ったのだが、Webアプリ開発者としての業務必要サイトとかも禁止されていたので、ここにメモしておく。

どうせ数年以内には持病が悪化して再び入院するし。

通信制のしくみの考察

通信禁止されていると思われるサイト接続すると、ブラウザ側ではタイムアウトエラーとして表示される。もちろん、それなりに待たされる。ブラウザの開発ツールの様子を見るに、おそらく TCP handshake に失敗していそう。

正常に接続できるサイトの様子を見た範囲では、HTTPS接続証明書改ざんは行われていないようだったこからHTTPS暗号を解読してどうのこうの、という処理をしていない可能性が非常に高い。つまり通信制限は接続ドメインまたはIPアドレスによる判断実施している可能性が高い。

また、中間的なサイト存在する。通常2秒以内で表示できるようなサイトの表示に10秒(体感)かかるところがある。稀にタイムアウトする。

なのは通信禁止されていそうなサイトでも「待たされた挙句、つながることが非常に稀にある」ということと、curl等ではすんなりと接続できることである

DNS設定と一緒にproxy設定が落ちてきているのであればこの挙動理解できるのだが、手元のOSネットワーク設定にはproxy情報が何も出てこない。ちょっとよくわからない。

もしもDNSに対するAレコード(AAAAも?)問い合わせに対してニセモノを返すという仕組みで通信制限しているのだとしたら、「非常に稀につながる」挙動にはならないはずなので、透過型proxyによって頑張っているのではないか想像するところである

なお、消灯時間中は全てのリクエストタイムアウトになる。消灯時間開始直前に HTTP Request を送出して、応答が来る頃には消灯時間に入っている場合にはどういう挙動をするのか、というテストをやる暇は無かった。スマソ

つながるサイトと、つながらないサイトメモ

業務で使う全部のサイト検証できた訳じゃなくてゴメンね。結局のところ仕事携帯回線でやっちゃったから。

ドメインサイト概要接続の様子
hatelabo.jpはてな実験サービス置き場すんなり
anond.hatelabo.jp増田禁止
??????.hatenablog.jpはてなブログドメインの一つ、そして増田中の人ブログ遅い
console.aws.amazon.comAWS管理コンソール禁止
www.amazon.co.jpショッピングめちゃくちゃ遅いけどつながる
www.amazon.comショッピングめちゃくちゃ遅いけどつながる
ja.wikipedia.org百科事典禁止
www.php.netプログラミング言語PHP禁止
www.typescriptlang.orgプログラミング言語TypeScriptすんなり
stackoverflow.comプログラミング質問サイト(英語)すんなり
qiita.comプログラミング質問サイト(日本語)禁止
packagist.orgPHPパッケージ管理遅い(通常通り?w)
www.npmjs.comJSパッケージ管理すんなり

なお、自分ドメインサブドメイン禁止ドメインを入れたようなもの、例えば anond.hatelabo.jp.example.com のようなドメインに対する接続可否は検証していない(面倒だったw)

どこの会社受託しているのか?

サーバ目線で見える client IPwhois等で調べると、某F社さんだった。AWS管理コンソールへの接続禁止するあたり「あっ…!」と思ったり…w

2025-02-01

console.out("鬼");

console.in("福");

入力:福

出力:鬼

人の家の中には福を鬼に転じるバグでもあるのか?

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-04-24

anond:20240424063427

なるほど確かにその通りですね。

ブックマーク先に寄生する形でしか意見を述べられない卑しい存在であるにもかかわらず、増田ことはてな匿名ダイアリーの方々に上から目線一方的批判をして申し訳ございませんでした。

土下座謝罪いたします。

その方法として、古来中国から伝わる三跪九叩頭の礼を致します。

冗長記述を避けるために、VB.NET表記させていただきます

Imports System

Public Class SanGuiKiuKouTou

    Sub Main()

        For i As Integer = 1 To 3

            Console.WriteLine("跪")

            For j As Integer = 1 To 3

                Console.WriteLine("{0}叩頭", j)

                Console.WriteLine("起")

            Next

            Console.WriteLine("起立")

        Next

    End Sub

End Class

以上を持ちまして、「三跪九叩頭の礼」とさせて頂きます

御清聴の程有難く存じます

2024-02-20

今こそconsoleを使いこなそう

console <スクロール開始行>,<スクロール行数>,<ファンクション行の非教示/表示>,<モノクロ/カラー>

 

例) console 0, 25, 0, 1

0行から24行までスクロールし、ファンクションキーを非表示にして、テキストカラー表示にする。

2024-01-05

anond:20240105165226

これどう対処するのが適切なんだろうね。

自分は nullチェックのときだけ厳密等価を使わないで比較している

console.assert(null == null, true)
console.assert(undefined == null, true)

console.assert(0 == null, true)
VM792:1 Assertion failed: true

typescriptではnullとundefinedを合成した型を用意することが多い

2023-10-31

数分で始めるJavaScript

Hello, World!

と出力されていれば成功

これで JavaScript を実行する最小限の環境は整った。

好きなようにプログラムを書いてコンソールに出力したり画面に書き出したりしてみて。

「指示の通りにならない!」という時はどこでつまずいてるか書いて。対応策を助言できるかもしれない。

2023-05-19

Omnivore便利だけどエラー多い。ブラウザコンソールエラーだらけだし、画面にこんなユーザー向けじゃないメッセージ出すし。

Application error: a client-side exception has occurred (see the browser console for more information).

2023-03-03

Application error: a client-side exception has occurred (see the browser console for more information).

メルカリしっかりして!

client-sideやしワイが悪いんやろけど

2022-12-03

[]2022年11月滅多にホットエントリを出さなドメインからホットエントリ

ここ1年で初めてはてなブックマーク日毎の総合人気エントリ入りしたドメインからホットエントリブクマ数順トップ30

ブクマタイトルドメイン
2287自己肯定感の話 ①sutekibungei.com
1344伝わる文章 | 基本要素 | SmartHR Design Systemsmarthr.design
10892022年カタールW杯日本ドイツレビュー - pal-9999のサッカーレポートpal-9999.hatenablog.com
1020Elon MuskTwitter で何をしようとしているのか - The Decisive Strikeblog.nagayama.dev
915今日 Twitter 日本法人を解雇された皆さんへ #OneTeam - The Decisive Strikeblog.nagayama.dev
775LAN配線マンション回線を直した話skmz.one
636現在の森保ジャパン攻撃とその問題点について - pal-9999のサッカーレポートpal-9999.hatenablog.com
620webエンジニアの「業務委託単価表」が公開 - Digital Shift Times(デジタル シフト タイムズ) その変革に勇気希望digital-shift.jp
595なぜ美人美人と褒めてはいけないのか? オヤジさんのためのジェンダー問題シン常識ライフスタイルLEON レオン オフィシャルWebサイトwww.leon.jp
546ヤマト運輸株式会社GitHubgithub.co.jp
509最近フロントエンドフレームワークに対する認識お気持ちの整理 - console.lealog();lealog.hateblo.jp
476東北男性結婚した外国人女性たちの経験。「不可視化」の理由と託された言葉の数々。#移住女性の声を聴くニッポン複雑紀行www.refugee.or.jp
473勉強法】『一生頭がよくなり続ける すごい脳の使い方』加藤俊徳 : マインドマップ読書感想文smoothfoxxx.livedoor.biz
471語り手が異常な小説が読みたい - 千年先の我が庭を見よkiloannum-garden.hatenablog.com
4512022年新版】厳選QOLが爆上がりした買ってよかったアイテム紹介(デスク編・iPad編・整理編・エンタメ編・サービス編)mitsuch.com
444色々試して行き着いた読書方法iwashi.co
443【お詫びと自主回収のお知らせ】社長内緒玉ねぎを入れすぎた 玉ねぎファンに贈るシャリシャリ玉ドレ200ml | 2022年ニュース | 綿半公式ページwatahan.jp
418MF文庫J編集部よりお詫びとお知らせ | ニュースMF文庫J オフィシャルウェブサイトmfbunkoj.jp
411Twitterサービス終了するのか?www.bluechronicle.jp
408Twitter での 2年 · eed3si9need3si9n.com
368国立天文台撮影した2022年11月8日皆既月食天王星食|国立天文台(NAOJ)www.nao.ac.jp
367Stable Diffusionを使って「いらすとや画像生成モデル」を作った話 - ぬいぐるみライフmickey24.hatenablog.com
357最近Reactを始めた人向けのReact Hooks入門sbfl.net
355たかやん考:ネットラッパーの揺曳する身体と「病み」の美学、そして「エンパワメント」 - ハイパー春菊サラダボウルnamahoge.hatenadiary.com
352赤色の缶の「サクマ式ドロップス」で知られる佐久間製菓(株)が廃業へ、原材料高騰が影響www.tsr-net.co.jp
342マネーフォワード ME』無料会員さまの連携上限数の変更、およびサービスの将来像について|マネーフォワード ホームカンパニー公式notenote.home.moneyforward.com
323重要追記あり世界初のフルダイブVRMMORPG《ソードアート・オンライン》の正式サービスが開始dengekionline.com
322GA4の計測設計には設計ドキュメント重要な件 - ブログ - 株式会社JADEblog.ja.dev
315「ザ・ルンペンブルジョワジー」 - tarafuku10 の作業場tarafuku10working.hatenablog.com
306iPhoneで「ガスト検索しようとするも「がす」の『す』でSafariが落ちる!? – kototokakototoka.com

2022-01-01

anond:20220101145248

正直動けばいいと思うので、現状でも問題ないと思うけれどちょっとだけ気になった点。

$$使ってる時点で、デベロッパーツール前提なのは分かるけど、 javascriptで動かしたいのか、デベロッパーツールで動かしたいのか、どっちつかずな書き方になっている。

$$('.hatena-star-inner-count').map(a =&gt; a.click());
let data = {};
Array.from($$('.entry-comment-contents')).forEach(x =&gt; {const userName = x.querySelector('.entry-comment-username a').href.split('/')[3];const comment = x.querySelector('.entry-comment-text').innerText;const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y =&gt; y.href.split('/')[3]);data[userName] = [comment, stars];});
console.info(Object.entries(data).map(x =&gt; { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("92;n"));

デペロッパツールだけで動くだけでいいなら、3行目のArray.fromがなくても動く。多分、forEachをmapに書き換えても動く。個人的にはforEachに統一したいけど、そこは好みレベル問題だと思う。

$$('.hatena-star-inner-count').map(a =&gt; a.click());
let data = {};
$$('.entry-comment-contents').forEach(x =&gt; {const userName = x.querySelector('.entry-comment-username a').href.split('/')[3];const comment = x.querySelector('.entry-comment-text').innerText;const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y =&gt; y.href.split('/')[3]);data[userName] = [comment, stars];});
console.info(Object.entries(data).map(x =&gt; { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("92;n"));

逆に、javascriptで動かしたいなら1行目と3行目はquerySelectorAllに書き換えれる。

document.querySelectorAll('.hatena-star-inner-count').forEach((a)=&gt;{a.click()});
let data = {};
document.querySelectorAll('.entry-comment-contents').forEach(x =&gt; {const userName = x.querySelector('.entry-comment-username a').href.split('/')[3];const comment = x.querySelector('.entry-comment-text').innerText;const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y =&gt; y.href.split('/')[3]);data[userName] = [comment, stars];});
console.info(Object.entries(data).map(x =&gt; { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("92;n"));

これも好みの問題だけど、途中のconst宣言は一回しか使ってないので、宣言せずにそのまんま入れてもいいんじゃないかと思った。

document.querySelectorAll('.hatena-star-inner-count').forEach((a)=&gt;{a.click()});
let data = {};
document.querySelectorAll('.entry-comment-contents').forEach(x =&gt; {data[x.querySelector('.entry-comment-username a').href.split('/')[3]] = [x.querySelector('.entry-comment-text').innerText, Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y =&gt; y.href.split('/')[3])];});
console.info(Object.entries(data).map(x =&gt; { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("&amp;#92;n"));
|&lt;&lt;

2020-11-28

anond:20201128203937

ええと…メモが言うには「Console.WriteLine("足した結果は{0}です!", sum); と書いたとき、sumはどうやって文字列になるんだ」だそうです

これはそのオブジェクトのToStringが呼ばれるということがわりと早期にわかって満足した記憶

anond:20201128202030

1章でConsole.WriteLineが出てきて「最後は改行になります」って書いてあって、「改行ってLFか?CRLFか?」って何時間も調べたりして全然効率悪い

Environment.NewLineというものがあって、よく見たらIDE説明現在の行終端記号書き込みますってあったんだけど

じゃあ文字列中に\nと書いた場合って…PowerShellでは表示したときに…それをファイルリダイレクあああああいいやもう知らんってなった

よくないと思う

道具として使えるようになってから手に持ってるものを見つめ直せばいいんだよ

道具を置いたままあちこちからどれだけ見つめても、使えるようにはならない

2020-10-15

poetry cache clearの仕様おかし

% poetry cache clear --help
USAGE
  poetry cache clear [--all] &lt;cache&gt;

ARGUMENTS
  &lt;cache&gt;                The name of the cache to clear.

OPTIONS
  --all                  Clear all entries in the cache.

GLOBAL OPTIONS
  -h (--help)            Display this help message
  -q (--quiet)           Do not output any message
  -v (--verbose)         Increase the verbosity of messages: "-v" for normal output, "-vv" for more verbose output and "-vvv" for debug
  -V (--version)         Display this application version
  --ansi                 Force ANSI output
  --no-ansi              Disable ANSI output
  -n (--no-interaction)  Do not ask any interactive question

これ見ると

poetry cache clear pypi

で動きそうじゃん?

% poetry cache clear pypi

  RuntimeError

  Add the --all option if you want to clear all pypi caches

  at /usr/local/lib/python3.8/site-packages/poetry/console/commands/cache/clear.py:44 in handle
      40│         )
      41│ 
      42│         if len(parts) == 1:
      43│             if not self.option("all"):
    → 44│                 raise RuntimeError(
      45│                     "Add the --all option if you want to clear all "
      46│                     "{} caches".format(parts[0])
      47│                 )
      48│ 

ブブー

動きません

正しくはこう

poetry cache clear pypi --all

オプションって何だよ哲学か?

直感的には--allをついてたら全てのキャッシュを消すべきだと思うが

% poetry cache clear --all 
Not enough arguments (missing: "cache").

ブブー

動きません

`--allって何だよ哲学か?

意味不明に思ったのは俺だけではないらしくIssueが出ている

https://github.com/python-poetry/poetry/issues/521

opened this issue on 19 Oct 2018 · 18 comments

2年前ですよ2年前!

Issue700個も溜まってます

ちゃんメンテしてるぅ?

pipenvもアレだったけどpoetryもアレだな

もう少しマシな奴が欲しい

2019-10-02

ウェブマスター オフィスアワー 2019 年 10 月 02 日

ウェブマスター オフィスアワー 2019 年 10 月 02 日 メモ(※所々抜け漏れあり)

https://www.youtube.com/watch?v=bBurTQBqhS0

11/25 Webmaster Conference Tokyo:今週か来週の早い段階で情報を公開する予定

コアアップデート順位が下がった場合

金谷さんコメント

コアアップデートスパム対策としてのアップデートではなく、

最新情報への対応や常に変動するランキング対応させるためのもの

「何かまずいところがないだろうか?」という視点サイトに着手するのは不要

サイトコンテンツを見直すきっかけ程度にしてくれれば

客観的にいいのか悪いのかを知るために定期的なユーザーテスト実施とか、

お互いにレビューし合う習慣を付けるとか

品質評価ガイドラインとかE-A-Tとかは個人的には見なくても良いと思うが、

ユーザーの思う良し悪しの定義に迷った際の参考としてくれればと思う

そもそもE-A-Tが存在する領域かどうかの判断必要

順位回復については日々の細かなマイナーアップデートによって回復する可能性もある



Q.RankBrainにおける更新性や更新の有無による効果はあるのか?

A.オフィスアワーでランキング要素の可能性について言及するのは難しい。言えることはコンテンツの内容を改善してくださいということだけ。もし、更新性が影響すると言ってしまうとみんながそっちに走ってしまうので。

Q.被リンクではページランクドメインランクのどちらを重要視していますか?

A.ショートアンサーとしてはどちらでもありません。

仮にドメインランク重要ですと言ったら何が起こるでしょうか?オールドドメインの買い占めが発生してしまうでしょう。

例えばコンテンツの質を見るに、Wikipediaに関連リンクを貼られるとかそのくらいの影響力があるのかなどを見てみると良いでしょう。

ちなみに被リンク流行っているんですか?

筆者注:

【図解】グーグルリンク評価20原則2019年版】(前編#1~#10) | Moz - SEOインバウンドマーケティング実践情報 | Web担当者Forum

https://webtan.impress.co.jp/e/2019/09/30/34042

初心者必見!SEO対策の基本を5分で完全解説2019年最新版

https://emma.tools/magazine/seo-basics/

↑これら記事とか?


Q.評価や手動対策評価点を知る方法はないか

A.Googleアルゴリズム完璧ではないので、アップデートで再評価される可能性はある。

メインのクエリユーザー自身サービスが頭に浮かぶような存在になれるかどうか。

Q.robots.txtブロックしていないURLなのに、カバレッジrobots.txtブロックされていますというエラーが出る

A.色々確認中ではありますが、私が調べた範疇では問題ありません。Search Consoleフィードバックも送ってください。その際、スクリーンショットだけではなく、テキスト問題点も添えてください。

Q.サイト画像サムネイルとして表示したい。Googleが推奨する方法がありませんか?

A.特にそのやり方については公開はしておりません。Googleが良いと思った画像だけを採用します。

強いて対策を言えば、画像ヘルプを参考に画像情報Googleに伝えるようにしてください。

Q.サイトマップを送信したものカバレッジに反映されない

A.確認しましたが、Search Consoleに表示されています

タイムラグがあるかもしれませんがDisallowされていませんか?確認してみてください。

Q.HTTPSのSearch Consoleは追加した方が良い?重複コンテンツになりますか??

A.追加した方が良いです。

重複コンテンツによって、起こるのはどちらかのコンテンツ上位表示される可能性があるということ。

共倒れになるということはありません。

そのクエリで頭に浮かぶくらいの存在になっているかどうかです。

Q.セパレートURLにおいてMFI後のcanonicalURLの設定について

A.やはり動的orレスポンシブをおすすめします。

正規化とは同等のページ内容のURL複数あるからこそ行うもの

canonicalよりも、リダイレクトでやってみてはどうでしょうか?

Q.検索パフォーマンスデータ収集開始タイミングはいから??

A.基本的には登録前のデータも取れるはずですが、違うケースもあればフィードバックで教えて下さい。

Q.Search Consoleプロパティへの表示について、所有者として確認されてから日経ってもプロパティに表示されていません

A.何らかの判断時間がかかったのだと思います。通常は数日ですが、遅れたのは新規サイトであることが要因である可能性があることです。なにか不具合ありましたらSearch Consoleフィードバックをぜひお願いします。

Q.サイト個人情報を削除してほしい

A.かなり困っているご様子ですので取り上げましたが、当フォーラムでは対象外話題ですのでウェブ検索フォーラム送信願います

Q.max-image-preview robots meta の値を確認するには?

A.まだ反映されていないのでもうちょっと待てば反映されます

Q.Search ConsoleタイムゾーンについてPTからPSTPDTに切り替わりますか?

A.切り替わります!!

Q.ドメインを変えずにサイト名だけを変えると検索順位はどう変わる?

A.サイト名ほど大きな要素を変えてしまうのは影響すると思います

どういうサイト名に変えるのかも重要ユーザーにとってわかりやすくなるとかであれば、長期的には有効になるかもしれません。

Q.max-image-preview でlargeを設定するとDiscoverに表示されやすいと聞きましたがAMP対応しているだけでDiscoverに表示されやすくなりますか?

A.AMPでもmax-image-previewでlargeでもどっちでも対応可能です。

Q.自演対策に関する手動対策リクエスト

A.スパム対策担当者に送って適切な対応を行う予定です。

Q.クロールエラー特定できない件について、1月のオフィスアワーにてホスティング会社相談してみては?との回答で、のち、6月に検証中とのことでしたがあれからいかがでしょうか?

A.あまり気にされなくても良いです。ただ、間違ったエラーが表示されないようにするためにエンジニアも調整中ではあります

こういうエラーに気づかれましたらSearch Consoleフィードバックをぜひお願いします。

次回は10月後半か11月前半の予定です

2019-09-10

C#classファイルを分ける意味

MainClass.cs

public class MainClass

{

  // Main メソッド

  public static void Main()

  {

   Person person = new Person();

   person.firstName = "山田";

   person.lastName = "太郎";

   Console.WriteLine(person.GetFullName()); // "山田 太郎" と表示される

  }

}

Person.cs

public class Person

{

  // FirstName プロパティ

  private string firstName;

  public string FirstName

  {

   get { return firstName; }

   set { firstName = value; }

  }

  // LastName プロパティ

  private string lastName;

  public string LastName

  {

   get { return lastName; }

   set { lastName = value; }

  }

  // フルネームを取得するメソッド

  public string GetFullName()

  {

   return firstName + " " + lastName;

  }

}

午前中にC#について聞いてた人がいて、ついでに聞きたい。

classファイルを分けたりする事があると思う。

   Person person = new Person();

このclass定義?なんだが、

必ず大文字文字定義するんだろうか。

new Person(); としたら、勝手に「Person.cs」の中の「Person」クラスを探してくれるんだろうか。

C#プログラム動作を1行1行確認したい。

前の増田が言っていた、Listのやつも知りたい。

paizaとかで入門動画見てれば分かるだろうか。

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