ゆきくらげのブログ

熱効率1億%の永久機関で人生勝ち組

VSCodeに背景を設定しよう!(エディター部分のみ)

個人的にエディター部分にのみ背景を設定するが好みだったのでそうしました.

アプリ全体に背景を設定するのもやろうとしましたがターミナルが透過出来ずにやめました(canvasを使ってるのでむずそう)

やりかた

VSCodeCSSを直接を直接いじるので,バックアップなどを取って置いて戻せるようにしておくことを推奨します

追記: VSCodeのアプデなので画像が消えてしまうことがあるみたいです.コピーを推奨します!

%localappdata%\Programs\Microsoft VS Code\resources\app\out\vs\workbench に画像を突っ込む.(例えば background.jpg)

同じディレクトリにあるworkbench.desktop.main.cssに次の内容を追加

.editor-container {
  overflow: hidden;
  position: relative;
  background: none !important;
}

.monaco-editor, .vs>.monaco-editor-background, .margin, .monaco-list-rows, .editor-container .monaco-list-row.selected, .editor-container .monaco-list-row:hover {
  background-color: transparent !important;
}

.editor-container::before {
  position: absolute;
  background-position: center;
  background-size: cover;
  content: ' ';

  background-image: url("background.jpg");  /* 背景画像の相対パス */
  opacity: 10%;  /* 背景の薄さ */
  --blur-depth: 2px; /* 背景のぼかしの濃さ */
  inset: calc(-1 * var(--blur-depth));
  filter:blur(var(--blur-depth));
}

できた

f:id:yukikurage:20220106015120p:plain
できた
やったね

おまけ: 複数タブを開いたときに画像を変えたい

.editor-container::before以下を下みたいな感じにする

.editor-container::before {
  position: absolute;
  background-position: center;
  background-size: cover;
  content: ' ';

  opacity: 12%;
  --blur-depth: 2.5px;
  inset: calc(-1 * var(--blur-depth));
  filter:blur(var(--blur-depth));
}

.split-view-view:nth-of-type(2n+1) .editor-container::before { /* 画像が K 枚のとき Kn + 1 と書く */
  background-image: url("background1.jpg");
}

.split-view-view:nth-of-type(2n + 2) .editor-container::before { /* 同上 */
  background-image: url("background2.jpg");
}

PureScript開発環境をゲットしたメモ

github.com

ポートフォリオサイトのレポジトリですが,今回はここの開発環境についてです

(メモなので)簡単に

フレームワークとしてHalogenを使用

CSSフレームワークとしてtailwindを使用

・開発中のビルドにwebpackを使用

設定ファイルとかはリポジトリとかを参照.

大事なのは ~.config.js とか entry.js あたりです

仕組み

・開発

PureScript --spago(ビルド)-> CommonJS --webpack(バンドル)-> index.js

PureScript --tailwindcss-> style.css

・本番

PureScript --spago(ビルド)-> CommonJS --spago(バンドル)-> index.js

PureScript --tailwindcss-> style.css

開発中はバンドルにwebpackを用いていますが,これは高速化のため.(spagoのバンドルではデッドコード排除やFFIのチェック(?)などが入っていて,遅い.逆に本番ではspagoを使ったほうが良いはず)

更にtailwindもJITを用いて高速化すると,前までかかっていた時間が嘘のように素早く変更を反映できました.(大体4,5秒ぐらい?) これがかなり大きくて,例えばバンドル中は(おま環かもしれないが)それに処理が回って補完が効かなかったりするのでかなり快適になります.良かった・

※git管理していないvscodeの設定も重要で

...
    "tailwindCSS.includeLanguages": {
        "purs": "html",
        "purescript": "html",
    },

    "tailwindCSS.emmetCompletions": true,

    "[purescript]": {
        "editor.formatOnSave":false,
        "editor.fontLigatures": true,
        "editor.defaultFormatter": "mvakula.vscode-purty",
        "editor.tabSize": 2,
        "tailwindCSS.experimental.classRegex": [
            "\"([^\"]*)\""
        ],
        "editor.quickSuggestions": {
            "strings": true
        },
    },
...

を書いておく.こうしないとtailwindの補完が効きません.これでかなり詰まってました

追記 こんな感じのをpackage.jsonのscriptに追加

"scripts": {
    "deploy:spago": "npx spago bundle-app --main Main --to './public/index.js'",
    "deploy:tailwind": "npx tailwindcss -i ./src/tailwind.css -o ./public/style.css",
    "watch:tailwind": "npx tailwindcss -i ./src/tailwind.css -o ./public/style.css -w",
    "watch:spago": "npx spago build --watch",
    "watch:webpack-server": "npx webpack-dev-server",
    "watch": "npx concurrently \"npm run watch:tailwind\" \"npm run watch:webpack-server\"",
    "deploy": "npm run deploy:tailwind && npm run deploy:spago"
  },

2021.10.09 watchコマンドにspagoのものを入れる必要がないことが判明 消しました

0.999... = 1 ← これマジ?

マジです.

この
0.999...=1
という式はもうだいぶ擦られてる気がします.が,最近思ったことがあるのでメモ程度.

結局この式の混乱の背後には3つの異なる集合を同じ物として見てしまっているところにあると思うという話です.

簡単のため0から1の範囲に限って書きます.3つの集合というのは

A. 実数の部分集合[0 .. 1]
 ・実数の構成法結局あまり理解できてません(´・ω・`)
B.十進法
 ・\frac{1}{10^{-1}}の位,\frac{1}{10^{-2}}の位...にそれぞれ0~9のいずれかが対応するので実質{10}^{\mathbb{N}}
 ・ + {1} もあります
 ・ 0.340 と 0.34 などがあるので以外と ↑ より多いか?
C.十進法を書き表したもの
 ・「基本的には」有限小数のみしか書き表せません(紙面は有限なので)

このCでは「基本的には」有限小数のみしか表せない所,0.999...では「...」という記号を使って同じ文字が連続するという事を表してます.
普段は,Cを用いてAを表してるんですが,実際にはA,B,Cは異なる集合である,というのが混乱の元という話.すなわち、C上で考えたら0.999...と1は異なるんですが、Aの対応する元に移したとき同じになるということですね

結論
0.999…, 1をCの元,b1,b2をそれぞれ対応するBの元,a1,a2をそれぞれに対応するAの元としたとき
0.999 ≠ 1
b1 ≠ b2
a1 = a2

以上

HaskellでModIntを実装してみた

HaskellでModIntを実装してみた(簡単な解説付き)

注意

・あまり詳細な解説はついていません.
・わからないところがあって,わからないと書いてあります.今後理解したら追記するかもしれません.
・ぬくぬく理解でやっているので間違いが含まれているかもしれません.指摘してもらえるとありがたいです.

動機

この問題を見てください.この後普通にネタバレします.
atcoder.jp
この問題の答えは

(P-1)(P-2)^{N-1}\ mod\ 1000000007
です.ここは解答を見てもらえばわかります.
ここで制約を見てみましょう.
N<10^9
とあります.したがって素直に書くと(p-2を10^9回かけることになるので)TLEしますし,オーバーフローもします.したがって……


ModIntを実装して,繰り返し2乗法をできるようにしよう!


が今回の動機です.

実装

先に実装を書いておきます.

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE KindSignatures      #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Main where

import qualified Data.Proxy   as Proxy
import qualified GHC.TypeNats as TypeNats
import           Prelude      hiding (negate, recip, (*), (+), (-), (/), (^),
                               (^^))
import qualified Prelude

main :: IO ()
main = return ()

------------
-- ModInt --
------------

newtype Mod a (p :: TypeNats.Nat) = ModInt a deriving (Eq, Show)

instance (TypeNats.KnownNat p, Integral a) => Num (Mod a p) where
  (ModInt x) + (ModInt y) = ModInt $ (x + y) `mod` p where
    p = fromIntegral $ TypeNats.natVal (Proxy.Proxy :: Proxy.Proxy p)
  (ModInt x) * (ModInt y) = ModInt $ (x * y) `mod` p where
    p = fromIntegral $ TypeNats.natVal (Proxy.Proxy :: Proxy.Proxy p)
  negate (ModInt x) = ModInt $ - x `mod` p where
    p = fromIntegral $ TypeNats.natVal (Proxy.Proxy :: Proxy.Proxy p)
  abs = id
  signum _ = 1
  fromInteger n = ModInt $ fromInteger n `mod` p where
    p = fromIntegral $ TypeNats.natVal (Proxy.Proxy :: Proxy.Proxy p)

instance (TypeNats.KnownNat p, Integral a) => Fractional (Mod a p) where
  recip (ModInt n)
    | gcd n p /= 1 =
      error "recip :: Mod a p -> Mod a p : The inverse element does not exist."
    | otherwise = ModInt . fst $ extendedEuc n (-p)
    where
    p = fromIntegral $
      TypeNats.natVal (Proxy.Proxy :: Proxy.Proxy p)
  fromRational r = ModInt n / ModInt d where
    n = fromInteger $ Ratio.numerator r
    d = fromInteger $ Ratio.denominator r

解説

*** 環(Ring)と体(Field)
 まず環と体を実装しました.こちらの説明が分かりやすいです.ありがとうございます.
zellij.hatenablog.com
 環には加法と乗法の演算(+と*),加法の単位元(zero),加法の逆元を求める演算(negate)を実装し,体はそれに加えて乗法の単位元(one)と逆元を求める演算(recip)を実装しました.HaskellのNumクラスは四則演算に加えて,絶対値(abs)の定義が必要であるので,ModIntでは扱いづらく,環と体から作りました.モジュラ計算は法が素数の時に体となるので,そのように実装しました.使うときは素数を入れるようにしてください
 また,通常の四則演算はNumの下で定義されていますが,先述の通りNumの使い勝手が悪いのでデフォルトの四則演算を隠して再実装しています。

2021/09/27Numで実装し直しました(競プロでの使いやすさを重視)

型レベル自然数

 1がInt型,"Hello"がString型,またInt型の変数を受け取ってInt型の変数を返す関数はInt->Int型であるのと同じように,「型の型」のような存在,カインドがあります.IntやStringは具体型と呼ばれカインドでは" * "と表されます.さらに型レベル関数というものもあり,例えばMaybeは具体型aを受け取って具体型Maybe aを返す型レベル関数として解釈できます.よってMaybeのカインドは*->*となります.
 ここで,最終的な目標はModInt n (nは自然数)を具体型にしたいことです.つまり,ModIntは型レベル関数であって,自然数をとって具体型を返すということです.型レベル関数には変数を突っ込むことはできないので,必然的に型レベル自然数が必要となります.しかし,型レベル自然数そのものが具体型にはなって欲しくない(任意の自然数nに対して具体型nができると,意味が分からない)ので,型レベル自然数のカインドは"Nat"とされています.したがって,ModIntのカインドはNat -> * です.
 型レベル自然数を変数に持ち上げるにはnatValを使います.実装を見れば大体わかると思います.所謂「コンパイラマジック」を使っているのでこれで出来るんだね~という理解です.今のところ.
 この際,拡張 DataKinds(デフォルトで"1"とか"2"とかは変数レベルのものを指すのでそれを型レベルにするために必要) と KindSignatures(クラス定義の時カインド注釈をつけれる, ::Natの部分),ScopedTypeVariables(関数の型注釈で使った型変数をスコープ内に持ち込める.natVal使ってる部分)が必要です.

繰り返し二乗法

 これは簡単なアルゴリズム
a^1=a
a^2=a*a
a^{2n}=(a^n)^2
a^{2n+1}=a*(a^n)^2
を実装すれば大丈夫です。計算量はO(logN)になります

追記

2021-04-23 繰り返し二乗法の説明を追加
2021-04-24 少し修正
2021-05-05 かなり修正
2021-09-27 かなり修正

AtCoder Beginner Contest (ABC), 緑埋め始めます

緑色になりたい!

 ということで緑になるまでAtCoder Problemsで緑色がついた問題を解きまくろうと思います.緑になったら水色も埋めていきます.解いた問題はここに載せていきます.

東京工業大学/情報理工学院に合格しました

合格しました

 やったね!

やったこと

 過去問解きました.問題集は買わずに楽しいインターネットの楽しくない部分(東進)に転がっていたのを使いました.だいたい
数学 30年
その他 15年
ぐらい.でも数学爆死したので何があるか分からないですね.開示されていないのでわからないですけど,合格したのはたぶん物化がよかったからです.
 それ以外に使ったのは,化学苦手だったので理系問題集100?みたいなヤツ(捨てちゃったので分からない)と,あとは学校の教科書です.過去問がデータベースとして最強だと思っていたので参考書はあまり買いませんでした.

受験セット

1 東工大/情報理工
2 慶應/理工/学問C
3 早稲田/基幹理工/学系Ⅲ
です.全部合格したのでよかったです.国立前に一つ合格しとくとテンション上がっていいですね.

これから

数理・計算科学系を志望しています.がんばる.

共通テスト対策進捗

地理

一昨日400ページぐらいの参考書買いました。一日100ページ読めばいけるか…?ということで今のところ200ページぐらい読み進めました。吐きそう。

古典・漢文

250ページぐらいの参考書買ったんですが古典文学史、漢文知識は全飛ばしするので問題ないです。