Skip to content

Instantly share code, notes, and snippets.

View ncaq's full-sized avatar
🏠
Working from home

ncaq

🏠
Working from home
View GitHub Profile
@ncaq
ncaq / list_invariant.py
Created August 31, 2023 14:46
PythonでBがAを継承してもlist[B]変数をlist[A]を受け取る関数に渡せない理由の一つの具体例
#!/usr/bin/env python3
# Pythonのメジャーな型チェッカーは`B`が`A`を継承していても、
# `list[A]`を受け取る関数に`list[B]`を渡すとエラーを出力します。
# 型システム的な面倒な話は置いておいて、実際にこれがエラーじゃないと問題になってしまう例を示します。
# 別にdataclassでなくても構わないのですが、printのやりやすさで使っています。
from dataclasses import dataclass
@ncaq
ncaq / get-twitter-embed.js
Last active August 7, 2023 00:52
Twitterの埋め込みスクリプトをボタンを押さずに取得します。
/**
* Twitterの埋め込みスクリプトをボタンを押さずに取得します。
*/
async function getTwitterEmbed(url) {
// TwitterのURLやツイートのURLじゃない場合は`undefined`を返します。
if (
!(
(url.hostname === "twitter.com" || url.hostname === "mobile.twitter.com") &&
/^\/\w+\/status\/\d+/.exec(url.pathname)
)
@ncaq
ncaq / surfingkeys-config-setting.js
Created August 7, 2023 00:39
指定されたURLのタブに移動するか新規に開くスクリプト、WebExtension版とSurfingkeys版の両法を記載。
/**
* 指定されたURLのタブが既に開かれていればそのタブをアクティブにします。
* 開かれていなければ新規に開きます。
*/
function tabActivateOrCreate(url) {
RUNTIME("getTabs", { queryInfo: { url, currentWindow: true } }, ({ tabs }) => {
if (!Array.isArray(tabs)) {
throw new Error(`tabs is not Array: ${JSON.stringify(tabs)}`);
}
const tabId = tabs?.[0]?.id;
@ncaq
ncaq / remove_wrapping_newline.py
Last active August 1, 2023 12:21
文字列から文字列幅のために行われた改行を削除します。ただし、本当に意味的に改行したい場合が推定されれば改行をなるべく残します。
import sys
from collections.abc import Iterator
def format_line_endings(line: str) -> str:
"""
一行の文字列を受け取り、文字列の種類によって行末の書式を決定します。
文字列が空行であるか、行自体に意味がありそうなことを示唆している場合は、行末に改行を追加します。
それ以外の場合は、文字列をそのまま返します。
"""
@ncaq
ncaq / baseballgame.css
Created June 11, 2018 14:26
HTMLとCSSのみ(JavaScriptなし)で作られたしょぼい野球ゲーム.2015年05月に作成
input {
display: none;
}
label {
display: none;
}
#pitchStart {
color: #ff4500;
background-color: #7cfc00;
width: 10vw;
@ncaq
ncaq / TeleworkAssistanceCost.hs
Last active April 25, 2023 07:35
テレワーク補助を計算しつつ途中式を見るためのプログラム
-- | テレワーク補助を計算しつつ途中式を見るためのプログラム。
-- 一回出力が証拠付きで出せれば良いだけなので、
-- 真面目に書いてません。
module Main (main) where
import qualified Data.List as L
import Data.Maybe (fromJust)
import Data.Ratio
data MonthWork
@ncaq
ncaq / cat-dir-file-with-file-name
Created February 1, 2023 19:35
ファイル名とファイルを連結して一つのファイルにするシェルスクリプト
#!/bin/bash
# tail使った方が良い。
# [unix - Concatenate multiple files but include filename as section headers - Stack Overflow](https://stackoverflow.com/questions/5917413/concatenate-multiple-files-but-include-filename-as-section-headers)
for i in $1/*
do
echo $i
cat "$i"
done
@ncaq
ncaq / family.hs
Last active June 15, 2022 13:10
[Rubyist のための他言語探訪 【第 13 回】 Prolog](https://magazine.rubyist.net/articles/0021/0021-Legwork.html) のHaskell実装
import Control.Applicative
import Control.Monad
import qualified Data.List as L
main = print (兄弟 sally erica :: [Bool])
兄弟 x y = do
xa <- 子の親 x
ya <- 子の親 y
guard $ xa == ya
@ncaq
ncaq / drop-short-yomi.ml
Created May 14, 2020 03:43
辞書ファイルから読みがなが短いものを除去
#use "topfind"
#require "camomile"
open CamomileLibrary
let print_filter_word () =
let rec print_filter_word_sub () =
let line = read_line () in
let yomi = List.hd (String.split_on_char '\t' line) in
if 1 < UTF8.length yomi then print_endline line else ();
print_filter_word_sub () in
@ncaq
ncaq / destructive-assignment.js
Last active April 29, 2020 14:13
JavaScriptの参照と浅いコピー
const stateA = { foo: "bar" };
const stateB = stateA;
stateB["hoge"] = "huga"; // stateAに対する破壊的変更
console.log("stateA: ", stateA); // stateAが更新されている
// コピーしたいならこうする
const correctStateA = { foo: "bar" };
const correctStateB = { ...correctStateA }; // 浅いコピー
correctStateB["hoge"] = "huga"; // correctStateAには影響が出ない
console.log("correctStateA: ", correctStateA);