Gist にバイナリファイルを載せたい
ビルドが必要な言語で バイナリファイルも含めたいけど バイナリファイルはドロップしても追加されないから無理なのかなー

と思ってたけど Gist って git でクローンして編集できたことを思い出した

クローンしてローカルでバイナリファイルをコミットして Gist へプッシュすればバイナリファイル付きの Gist にできた
session のファイルサイズ
基本ブラウザ側しかいじらないから普段サーバ側ってあんまり気にしてなかったけど 触れることあったのでセッションのファイルサイズについて考えてみた

セッションは localStorage とかと違って サーバ側に保存するデータのこと
cookie で関連付けていて ユーザごとのデータが保存されてるもの

ということは 多くの人がアクセスするサーバってセッションだけですごくストレージつかってるんじゃないかな?って思った

大きいところは分散とかやってるのでしょうけど アクセスするサーバが違ってセッション情報引き継いでない なんてサービスとしてダメだと思うので共有させてるはず

それに サイトによってはほぼ永続みたいな期間でログイン情報が保存されていたりする
1年くらいしてもパスワードの再入力でないところってわりとあるし

無制限に保存するとして 1 ユーザあたり 100KB のデータを保存したとすると

100万人ユーザがいたら 0.1TB
1000万人ユーザだと 1TB

セッションだけですごいサイズ

100 万人と言っても 同じユーザかどうかは cookie だよりなのでリセットされてもサーバには残り続けて実際は数十万人くらいでもそれくらいいきそう
ログインするシステムだとアカウント作らない一見さんのセッション情報はもたないから無駄は減るけどやっぱり捨て垢で一時的な人はいっぱいいるし

人がいっぱい来るサービスってどうしてるんだろうねー
大規模なものならストレージが 1TB なんてどうということないのか それとも定期的に来てれば期限なしだけどアクセスなしが半年くらい続くとリセットしてるのかな
Chrome Extension の webRequest でキャンセルする
onBeforeRequest, onBeforeSendHeaders, onHeadersReceived, onAuthRequired のイベントはキャンセル可能
3 つ目の引数に blocking を指定してれば 返すオブジェクトでリクエストを改変できる

{cancel: true} を返せばリクエストを防げる
POST をブロックする例
chrome.webRequest.onBeforeRequest.addListener(details => {
if(details.method === "POST"){
return {cancel: true}
}
}, {urls: ["<all_urls>"]}, ["blocking"])

これだと キャンセルされたエラー画面が表示される

完全にキャンセルして何もおきないようにするなら 「javascript:void 0」 にリダイレクトさせる

chrome.webRequest.onBeforeRequest.addListener(details => {
if(details.method === "POST"){
return {redirectUrl: "javascript:void 0"}
}
}, {urls: ["<all_urls>"]}, ["blocking"])

C# の読み取り専用
Property
getter のみで setter をつけないことで読み取り専用にできる
> class C { public int foo { get; } = 1; }
> var c = new C();
> c.foo
1
> c.foo = 2
(1,1): error CS0200: プロパティまたはインデクサー 'C.foo' は読み取り専用であるため、割り当てることはできません
> typeof(C).GetProperty("foo").SetValue(c, 10)
Property Set メソッドが見つかりません。
> typeof(C).GetField("<foo>k__BackingField", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(c, 100)
> c.foo
100

リフレクションでも setter が存在しないので書き込めない

内部的には自動でフィールドを作って読み書きしてるので そのフィールドにさえアクセスできれば変更は可能
つまりリフレクションで書き換えできる




Constant
読み取り専用というより「定数」
一部の型のみ設定可能でオブジェクトなどはできない
> class C2 { public const int foo = 1; }
> typeof(C2).GetField("foo", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).SetValue(null, 100)
定数フィールドを設定できません。

扱いは Static なフィールド
リフレクションでも変更できない

byte code にハードコーディングされてるとか
stackoverflow では デコンパイルして編集して再度コンパイルすればいける みたいな回答もあった
実質無理ってことみたい



Field
readonly をつければ読み取り専用にできる
> class C3 { public readonly int foo = 1; }
> var c3 = new C3();
> c3.foo = 20
(1,1): error CS0191: 読み取り専用フィールドに割り当てることはできません (コンストラクター、変数初期化子では可 )。
> typeof(C3).GetField("foo", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public).SetValue(c3, 100)
> c3.foo
100

リフレクションすれば普通に変更できる

Python in Excel に期待
Excel で Python 使えるようになるかもってニュースをみかけた
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1097447.html

この Excel への要望のトピックで投票数がすごい高いとか
https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10549005-python-as-an-excel-scripting-language

VBA のおきかえだけじゃなくてセルの関数 (=SUM(A1:A2)) の置き換えにもなる って書いてるので色々便利そう

アンケートに参加して みたいなのがあったのでとりあえずやってみた

Vivaldi アップデート
Vivaldi アップデートしたら JavaScript で定義したショートカットキーよりブラウザ固有のショートカットキーが優先される問題直ってた

頻繁に更新されて改善していってるのはいいね
VS の EditContinue
ちょっと古めの Framework バージョンで C# 動かしていたときのこと

アプリケーションのデバッグ中というのに気付かず ソース書き換えようとしたら

エディットコンテニュー ができるのは 4.5.1 からです

というメッセージが


Chrome のデバッガみたいに実行中にソースが書き換えれるのかな?
Roslyn のスクリプト機能付いた頃のバージョンぽいし そういうことできそう


だけど普段実行中に書き換えようとしたら「実行中です」みたいな警告ダイアログが出てた気もする

if と function の巻き上げ
JavaScript だと function 構文は var と同じく関数スコープとして一番最初に定義されたことになる

けど if の中だと if が実行されて初めてそのスコープ内に宣言される

function fn(flg){
function x(){return 1}

console.log(x())

if(flg){
console.log(x())
function x(){return 2}
}

console.log(x())
}

fn(false)
// 1
// 1

fn(true)
// 1
// 2
// 2

最初は 1 で if を通らないと同じ関数なので 1 のまま
if を通ると 関数が上書きされるので 2 になる
if に入ると x の実行より x の再定義が先に実行される

IE/Fx/Chrome 全部一緒
Google 翻訳のデザイン
Google 翻訳のデザインがあたらしくなってる

スマホ向けっぽい見た目

アイコン見た感じだと履歴や保存機能があるみたい
拡張機能の設定を参照する content script
Extension の content script の埋め込みしたいときに background ページでページの遷移やタブの更新を監視して executeScript で埋め込むのって面倒だから manifest.json の "content_scripts" だけで済ませたい

{
"content_scripts": [
{
"matches": ["<all_urls>"],
"css": ["style.css"],
"js": ["script.js"]
}
],
}

だけど manifest レベルで宣言してるから ユーザが on/off 切り替えたり 設定に応じたフラグを追加したりできない

これまで諦めてたけど content_script 内でメッセージングや共通のストレージ読み取ればできそう

永続するデータなら chrome のストレージに入れておけば content script から読み取れる
chrome.storage.local.get({enabled: true, mode: "default"}, ({enabled, mode}) => {
if(!enabled) return
switch(mode){
// some cases
}
})

localStorage だと拡張機能じゃなくてスクリプトが埋め込まれたページのストレージを参照するので使えない
localStorage を使いたい(非同期がイヤ)とか バックグランドページのメモリ上のみのデータを使いたいなら messaging

// content script
chrome.runtime.sendMessage("require-cscript-data", ({enabled, mode}) => {
if(!enabled) return
switch(mode){
// some cases
}
})

// background
let enabled = true
let mode = "default"
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if(message === "require-cscript-data"){
sendResponse({enabled, mode})
}
})

CSS の場合は content_scripts で埋め込まれた JavaScript で style タグを作る
highlight.js のテーマ切り替え
highlight.js の処理はコードをパースして トークンごとにクラスをつけるだけ

テーマは別に css ファイルを読み込む
1 テーマ 1 ファイル
css 側でトークンにつけられた keyword, funciton, string などのクラスに対して斜体や太文字や色を指定してる

なので テーマ切り替えはライブラリの処理じゃなくて自分で css ファイルを切り替えることになる

例)
const $$ = (s, r) => [...(r || document).querySelectorAll(s)]

function switchTheme(theme_name){
const path = "/lib/highlight/styles/" + theme_name + ".css"

$$(".hl-theme").forEach(e => e.disabled = true)
const style_elem = $(`.hl-theme[data-theme="${theme_name}"]`)
if(style_elem){
style_elem.disabled = false
}else{
const elem = Object.assign(document.createElement("link"), {
rel: "stylesheet",
href: path,
className: "hl-theme",
})
elem.dataset.theme = theme_name
document.head.append(elem)
}
}

ip アドレスの数値化
node.js だと標準であるのかもだけど ブラウザ JavaScript にはなさそうなので

function ip2num(ip){
return ip.split(".").map((e, i) => e << (8 * (3 - i)) >>> 0).reduce((a, b) => a + b)
}

逆変換

function num2ip(num){
return [num >> 24 & 0xff, num >> 16 & 0xff, num >> 8 & 0xff, num & 0xff].join(".")
}

const ip1 = "192.168.1.1"
console.log(num2ip(ip2num(ip1)) === ip1)
// true

console.log(ip2num("0.0.0.0"))
// 0
console.log(ip2num("127.0.0.1"))
// 2130706433
console.log(ip2num("255.255.255.255"))
// 4294967295

リモートデスクトップでローカルドライブにアルファベットつける
接続するときにドライブを共有する設定をしておく

D ドライブを共有したら リモートでは

\\tsclient\D

という名前でアクセスできる

エクスプローラで "\\tsclient" を開いて D を右クリックして "ネットワークドライブの割り当て" を選択
あとは表示されるウィンドウにある通り
ローカルが D でも リモートの H に割当とか 好きなアルファベットを選んで大丈夫
Chrome で見る色が別ソフトと違う
少し前の話

Chrome と Firefox と IE と適当なペイントソフトで同じ画像を表示すると Chrome だけ微妙に違ってた
画像のカラープロファイルの解釈で表示違うのは前からあるよね と思ってたけど CSS の色指定でも違ってた

CSS で background-color を指定

Chrome でそのページ開いてスクショをペイントソフトに貼り付け

カラーピッカーで RGB を確認

これで取れた RGB がbackground-color と違ってる
でも Chrome 内のカラーピッカー (devtools のやつ) だと background-color に指定した色になってる

Chrome がディスプレイのガンマ値に合わせて調整してるのかな?
それはそれでいいんだけど スクショしてカラーピッカーで取ったのが違うのはちょっと困るかも


ぐぐってみるとこんなページを発見
https://bugs.chromium.org/p/chromium/issues/detail?id=44872


about:flags の "Color correct rendering" を設定したらいいみたい
設定してみると Firefox と同じ色になった


・・・

それからしばらくして

別のパソコンでも設定変えとこうと思ったら "Color correct rendering" 項目がなくなってる
確認したらスクショして RGB 見ても色は変わってない状態

バグ扱いされるから機能なくしたのかな?

もう一度 issues のページ開いてみたら "Force color profile" という機能に置き換わったみたい
sRGB とかから選択できる

初期値は "Default" になってて Firefox などと同じ色になってた
プログラミング言語メモ
比較するときに他に言語なにあったっけと調べる手間を減らす用
alt 系 や shell script 系はなし

Web
JavaScript

サーバサイドのスクリプト系言語
Python
PHP
Perl
Ruby
Hack
Node.js

JVM
Java
Scala
Kotlin
Ceylon
Clojure
Groovy

.Net Framework
C#
F#
VB.NET

Windows
JScript
VBScript

Mac
Objective-C
Swift

ネイティブにコンパイル
C
C++
D
Go
Rust
Delphi

その他
Lua
R
Julia
Elixir

関数型
Erlang
Lisp
Scheme
OCaml
Haskell

古いの
Fortran
COBOL
Pascal
Basic
HSP
ActionScript
Dart

ネタ系
Whitespace
Brainfxck
Unlambda