投稿

6月, 2023の投稿を表示しています

黒板太字の入力

黒板太字というのはℕみたいなやつです。ただ、それを入力したかっただけなんです。ついでに各種記号も。なのにとても大変だった。ということで、あとで絶対忘れるやつなので備忘録です。 最初はMS-IMEを使っていました。Windowsの標準のやつです。これで記号を入力するには「きごう」で変換するか、記号の名前を入れるかです。でも、どちらもだめっぽい。 ならば辞書登録です。なんという読みにしましょうか?長いのはめんどうです。Agdaだと \bN で入力できるんですよね。黒板太字はそのままBlackboard bold lettersなので。小文字もあるみたいなので、大文字を bN 、小文字を bn で登録しておけば便利そうです。 さっそく登録してみるけど、動きがよくわからない。もうちょっとまとめて登録して動きを観察したいけどめんどくさい。テキストファイルからまとめて登録できるみたいなのでチャレンジ。でもフォーマットがわからない。エクスポートしてみるも、文字化けしている。ぐぐってみると、どうやらutf-16leでタブ区切りのようです。Vimの設定が足りなくて文字コードを認識できない模様。 set fileencodings=ucs-bom,utf-16le,utf-8,iso-2022-jp,cp932,euc-jp,default,latin としてみたら開けた。わーい。でも、念のためutf-8のファイルを開いてみたら文字化け。 utf-16le を utf-8 の後ろに持っていったら両方開けました。そもそも、このエクスポートしたファイルはBOM付きみたいなので、 utf-16le の記述自体がいらないのではと思って削除してみたら両方とも開けた。これにて一件落着。 辞書ファイルが作れたのでさっそく登録してみるも、なんだか思ったように動かない。出てこないわけではないのだけれど、登録したはずのものが全部は出てこない。 bN と後ろにスペースを付けると ℕ とスペース付きで変換はできるみたい。でも、毎回そんな手間がかかるのは我慢なりません。 他の登録手段として、「えぬ」で変換とか、NICOLA配列で使っているのでbaと押したときに出てくる「へう」とかを考えたのですが、なんだか違う感じがします。他の手段も考えたのだけどなにも思いつかない。MS-IMEが半角英数間接入力が...

ToDoリスト

ToDoリストが増えすぎて管理できていません。前は目的別にToDoリスト管理アプリを使い分けていたのですが、アプリだと記録が残せないのでやめました。テキストで管理しておけばスクリプトでなんでもできますから。なので現在はLiquidLogicとVimです。 実態は優先度の低いToDoだけどアプリは別になっていることも多いStreak管理アプリも前は使っていました。Productiveというのを買って使ってみたんですが、デザインや機能が突然変わったりして使いづらかったです。やはりテキストが最高です。 テキストは自由でよいのですが、自由であるが故にファイルを作りすぎてしまいました。コンピュータに関するメモをcomp/memo.txtの様に書いてみたり、memo/comp.txtの様にしてみたり、雑多なメモをmemo/memo.txtに書いたり、メモについての考察をmemo/memo.mdに書いたりで、それはもうぐちゃぐちゃになりました。名前の付け方として「そのファイルについての場合」と「そのファイルの内容についての場合」があるんですね。そこら辺を意識せずに名前を付けたのは失敗でした。 こうなってしまったのは、とりあえず新規のファイルに書いて、どこに保存するかのポリシーがないのでてきとうに保存してきた結果です。「後で整理すればいいや」と思ったんですが、整理なんかしないんですよね。このブログを書きながら整理していますが、重い腰を上げるのが大変でした。 後で整理するからと、そのときいちばん簡単にメモできる関係の無いファイルに書いてそのままのケースも多かったです。でもLiquidLogicで書こうとタブの一覧表示、タブの選択、最後尾に移動とやっている間に書くことを忘れるのも確かに多いので、とりあえずすぐに書いて、その後にテキストの移動みたいな手順は合理的なんですけどね。 今あるリストと目的は Todoist 家賃の振り込みとかの定期的なものを書いています。でも、実際には「すぐにやって消えるはず」という理屈ですぐやるべきことも書いています。ですが、やらないんですよね。だからどんどん溜まっていって、家賃とかの重要なものが埋もれてしまって、上手に管理できていません。 日記 「やること todo」の形式でその日から数日で処理する予定のものを書いています。他の形式は「買...

Haskellと型

Haskellではデータは全て型を持っています。この型のことを代数的データ型と言います。Int, Integer, Float, Doubleなどがあります。 変数は a :: Int a = 3 のように定義します。関数は add :: Int -> Int -> Int add x y = x + y のように定義します。これはaddという関数は引数xとyをとり、x + yの結果を返すことを意味します。型は一番左のIntが最初の引数xの型、2番目のIntが2番目の引数yの型、最後のIntが戻り値の型です。変数と関数が同じ名前空間に束縛されるので変数と関数に同じ名前は使えません。 新しい代数的データ型は既存の代数的データ型を組み合わせて data Figure = Triangle { base :: Double, height ::Double } のように定義します。Figureは型の名前で、これをタイプコンストラクタと言います。Triangleはデータの名前で、これをデータコンストラクタと言います。base :: Doubleはbaseというラベルを持つDouble型のフィールドです。名前が必要なければ data Figure = Triangle Double Double と書けます。代数的データ型は複数のデータコンストラクタを持つことができて data Figure = Triangle Double Double | Rectangle Double Double | Circle Double のように書けます。これはFigure型はTriangle、Rectangle、Circleのいずれかのデータを持つことを意味します。データはフィールドが無くても構いません。その場合は data Bool = True | False のようになります。この場合、フィールドを持たないデータコンストラクタTrueとFalseができることになります。 型変数を持つ代数的データ型は data Maybe a = Nothing | Just a のように書けます。使うときにaに具体...

オブジェクト指向言語Haskell始めました

最近Haskellをいじってました。その中で思ったんですが、これはオブジェクト指向言語でしょ?Common Lispの教科書 [1] に出てくるCLOSの例が意味的にそのままで動きますもの。 ちょっといじってはありますが、Common Lispでは、 (defclass triangle () ((base :accessor triangle-base :initarg :base) (altitude :accessor triangle-altitude :initarg :altitude))) (defclass rectangle () ((width :accessor rectangle-width :initarg :width) (height :accessor rectangle-height :initarg :height))) (defclass circle () ((radius :accessor circle-radius :initarg :radius))) (defmethod area ((figure triangle)) (* 1/2 (triangle-base figure) (triangle-altitude figure))) (defmethod area ((figure rectangle)) (* (rectangle-width figure) (rectangle-height figure))) (defmethod area ((figure circle)) (* pi (expt (circle-radius figure) 2))) (setf figures (list (make-instance 'triangle :base 2 :altitude 4) (make-instance 'rectangle :width 2 :height 4) (make-instance 'circle :radius 2))) (print (mapcar #'area figures)) のように書きます。 実...

おれおれマークダウンの整理

おれおれマークダウンは深く考えずにとりあえず作る方針でぐちゃぐちゃになっていたので整理しました。マークダウンは上から読んでいって、今はコードブロックの中とかの状態に依存するから、Stateパターンがぴったりの案件ですよね。GoF本を引っ張り出してきて、めんどくさいのでほとんど読まずに実装しましたが、けっこうスッキリ書けたと思います。まあ、変更前がひどかったのもありますが。 クラス図にするとこんな感じ。 State<|--List とスペースを開けないで書くとistクラスがStateの横に書かれました。PlantUMLの書式を覚えていないからな。 State <|-- BlockState BlockState <|-- PlantUML BlockState <|-- Code State <|-- Normal State <|-- List State <|-- Quote State <|-- Paragraph State <|-- Footnote State BlockState PlantUML Code Normal List Quote Paragraph Footnote BlockStateの並びに1つクラスを入れるときれいな感じもするけど、特にやることも無いのでこうなりました。 行頭が - で始まっていたらLine Stateなので、もし前の状態が違ったらfinishして状態変更してstartするだけです。 change_state なのに必ず変更するとは限らないので名前が不適切ですね。でも、いいのが思いつかないので。 class Context def initialize ... @list = List.new @normal = Normal.new @state = @normal end def change_state(state) if @state != state then @state.finish @state = state @state.start end end ... end class State def start pr...

Markdownと参考文献

Common Lispはこの本 [1] で学びました。という話がしたいわけではなくて、Markdownで書いているときに「参考文献ってどうやって書くんだっけ?」と思って調べたことの備忘録です。 一般的に参考文献は脚注を付けるバンクーバー方式か、括弧で著者名と出版年を書くハーバード方式の2つがあるみたいです。 [2] 後者は文系の書き方かな?ネットだと前者が多いですかね?ということでバンクーバー方式を採用しましょう。 Markdownでの脚注の記法は 文章[^1] [^1]: 脚注 のように書くみたいですね。 VSCodeのMarkdown All in Oneはまだ対応していないみたいですけど。 でも、書きたいのは脚注じゃなくて参考文献です。脚注と参考文献を分けない派もあるみたいですけど、見やすくするために分けましょう。Wikipediaなんかはページによってまちまちなんですが、脚注で書名と具体的なページを書いて、書名が参考文献へのリンクになっているのが多いですかね?これが便利そうなので採用します。別に誰かに指定されているわけではないので、見やすそうなのを採用していきます。 そういえば、脚注が補足なのか、文献へのリンクなのか跳ぶ前にわかると便利そうですが、それは後で考えましょう。 参考文献の書き方は SISTスタイル、MLAスタイル、APAスタイルとあるみたいですが [2] 、SISTスタイルに『』を付けたものが見やすそうなので採用です。 おれおれマークダウンなのでHTMLに展開しなければならないのですが、シンプルに [^1]を<a href="#footnote_1"><sup>[1]</sup></a> [^1]:を<a id="footnote_1">[1]</a> みたいな感じでしょうか? 脚注の書き方をぐぐっていて気が付いたのですが、PandocというHaskellで書かれたツールがあるんですね。Pandoc拡張Markdownというなかなかに強力そうな書式で書けるみたいです。拡張性もあるみたいですけど、きれいに書きたいわけではないので、泥臭くてもなんでもできるRubyで書いておいたほうがいいのかと思っています。 ...

Markdownで数式を書くのをやめました

VSCodeのMarkdown All in Oneという拡張を使って$\LaTeX$の記法で数式を書くとリアルタイムで変換してくれて便利なのですが、マクロとかがうまく使えなかったりして不便なので限定的にしか使わないことにしました。 例えば、 $$ \def\comb#1#2{\begin{pmatrix}#1\\#2\end{pmatrix}} \newcommand{\combi}[2]{{}_#1\mathrm{C}_#2} \comb{n}{r}=\combi{n}{r} $$ $$ \comb{n}{r}=\combi{n}{r} $$ $$\def\comb#1#2{\begin{pmatrix}#1\\#2\end{pmatrix}}\newcommand{\combi}[2]{{}_#1\mathrm{C}_#2}\comb{n}{r}=\combi{n}{r}$$$$\comb{n}{r}=\combi{n}{r}$$と書くと2つ目の数式は表示に失敗するんですよね。マクロは定義したブロックでしか使えない。これは不便です。htmlで書くと問題なく通るんですよね。なのでおれおれマークダウンならばなんの問題も無い。 2つ目は <script> MathJax = { chtml: { displayAlign: "left", }, tex: { inlineMath: [['$', '$']] } }; </script> と書けないところ。まあ、VSCodeで書くときにはそんなにWindowの幅は広くないので左寄せでなくても、そんなにはつらくないのですが。 もう一つはlabelが使えないところ。 $$ \begin{equation} a=b \tag{1} \label{1} \end{equation} $$ htmlだと$\eqref{1}$で参照できる。 $$\begin{equation}a=b \tag{1} \label{1}\end{equation}$$htmlだと$\eqref{1}$で参照できる。本当は label だけで自動採番にしたいのだけど、やりかたがわからない。...