Post

snippets

シンタックスハイライトたちの見た目確認用のサンプルコード。動作は保証しない。

ChatGPTより (Ruby, Python, JS)

シンタックスハイライトの付き方を確認するのにちょうどいいスニペットを書きたいなあと思ったけど、どういうのを書いたらいいかで悩んでしまった。
ChatGPTにどんなのがいいか訊いたところ、結構がっつり書いてくれた。簡易ToDoアプリだそうで、長さ的にも内容的にもかなりいいところをついているように感じる。すごい…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
require 'json'

class ToDoApp
  def initialize
    @tasks = []
  end

  def add_task(description)
    @tasks << { description: description, done: false }
  end

  def list_tasks
    @tasks.each_with_index do |task, index|
      status = task[:done] ? "x" : " "
      puts "#{index + 1}. [#{status}] #{task[:description]}"
    end
  end

  def remove_task(index)
    @tasks.delete_at(index - 1)
  end

  def save_to_file(filename)
    File.write(filename, JSON.pretty_generate(@tasks))
  end

  def load_from_file(filename)
    @tasks = JSON.parse(File.read(filename), symbolize_names: true)
  end
end

app = ToDoApp.new
app.add_task("Learn Ruby")
app.add_task("Build a project")
app.list_tasks
app.save_to_file('tasks.json')

まだattr_accsessorだのRangeだのの表記が気になる。
こちらは人力、即興、最低限の3拍子揃っているので、つたない例だなと言われればごめんなさいとしか言えない。

1
2
3
4
5
6
7
8
9
10
11
class Foo

  attr_acsessor :a, :b
	
  @@c = 0

  def initialize
    @a = 10; @b = 50
  end

end
1
2
3
4
dice = Proc.new { rand 1..6 }

# サイコロを振る
10.times { p dice.call }

あと何気に定数呼び出しとかも気になる。

1
Roo::Spreadsheet.new

続いてGPT作、Python版。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import json

class ToDoApp:
    def __init__(self):
        self.tasks = []

    def add_task(self, description):
        self.tasks.append({"description": description, "done": False})

    def list_tasks(self):
        for i, task in enumerate(self.tasks, 1):
            status = "x" if task["done"] else " "
            print(f"{i}. [{status}] {task['description']}")

    def remove_task(self, index):
        self.tasks.pop(index - 1)

    def save_to_file(self, filename):
        with open(filename, 'w') as file:
            json.dump(self.tasks, file, indent=2)

    def load_from_file(self, filename):
        with open(filename, 'r') as file:
            self.tasks = json.load(file)

app = ToDoApp()
app.add_task("Learn Python")
app.add_task("Build a project")
app.list_tasks()
app.save_to_file('tasks.json')

Pythonってあんまり書かないけど、importfromがあるときとか、docかなんかの3連クオートとかあるんじゃないっけ。

ということで一応、

1
from myModule import Hoge
1
2
3
4
def hello:
    """display Hello World"""
    print("Hello World")

とかも置いておく。 ちなみにPythonを知っていてRubyを見たことがない人には、RubyがPythonに似ているように見えるらしいが、それはあくまで見た目の話であって、中身はどちらかというとJavaScriptに近い。

GPT作ラスト、JavaScript。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
const fs = require('fs');

class ToDoApp {
  constructor() {
    this.tasks = [];
  }

  addTask(description) {
    this.tasks.push({ description, done: false });
  }

  listTasks() {
    this.tasks.forEach((task, index) => {
      console.log(`${index + 1}. [${task.done ? 'x' : ' '}] ${task.description}`);
    });
  }

  removeTask(index) {
    this.tasks.splice(index, 1);
  }

  saveToFile(filename) {
    fs.writeFileSync(filename, JSON.stringify(this.tasks, null, 2));
  }

  loadFromFile(filename) {
    const data = fs.readFileSync(filename, 'utf8');
    this.tasks = JSON.parse(data);
  }
}

const app = new ToDoApp();
app.addTask("Learn JavaScript");
app.addTask("Build a project");
app.listTasks();
app.saveToFile('tasks.json');

私の場合、JavaScriptだとrequireよりimportのお世話になることのほうが多い。ということで

1
import { MyModule } from './myModule.mjs';

も置いておく。

筆者過去作 (C, CSS)

ちょうどよさそうなものを引っ張り出して来たり。

こんなのはあった (深夜テンションコーディング)。 エラトステネスのふるいを書いてみたかったときの。使い方がよくわからなくてとりあえず素数判定につかってみた記憶がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// >>>全Cコンパイラbool実装すべき<<<
typedef enum {
  false, true
} bool;

void sieveOfEratothenes(bool* is_prime, long long max) {
  for (int i = 0; i <= sqrt((double)max); i++) { // 平方根まででいいらしいので
    if (!is_prime[i]) continue; // すでに合成数とわかっている

    /* iの倍数を振るい落とす(除外する) */
    for (int j = i*2; j <= max; j += i) {
      if (is_prime[j]) is_prime[j] = false;
    }
  }
}

bool isPrime(long long k) {
  bool* is_prime = 0;
  // k+1個の要素の入る配列を確保
  // is_prime: 添え字の数が素数かを記録
  is_prime = malloc(k * sizeof(bool) + 1);

  // 2以上の要素を1詰め
  is_prime[0] = is_prime[1] = false;
  for (long long i = 2; i <= k; i++) {
    is_prime[i] = false;
  }

  sieveOfEratothenes(is_prime, k);

  // malloc()したもんはreturn前にfree()しなきゃなのでメモ
  bool is_prime_k = is_prime[k];
  free(is_prime);
  return is_prime_k;
}
  

int main(void) {
  long long k;

  printf("整数: ");
  scanf("%lld", &k);
  
  printf("%s\n", isPrime(k)? "素数です" : "合成数です");

  return 0;
}

あとはこのブログの見た目を若干カスタマイズしたときのCSSとか。そういえば、SCSSやってみようかな。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* アイコン非表示 */
#sidebar #avatar {
    display: none;
}

/* 基本のフォント変更 */
body {
    font-family: "BIZ UDPゴシック", "Source Sans Pro", sans-serif;
}


/* headerなどのフォント変更 */
header .post-desc, .site-title, #search-results a, h5, h4, h3, h2, h1 {
    font-family: "Noto Sans Mono", "Source Sans Pro", sans-serif;
    font-weight: bold;
}

/* ブログサブタイトルのイタリック解除 */
.site-subtitle.fst-italic {
    font-style: normal !important;
}

/* シンタックスハイライト修正 */
@media (prefers-color-scheme: dark) {
    /* cssではidだった */
    html:not([data-mode]) .highlight .nf, html[data-mode=dark] .highlight .nf {
        color: #e9b2e3;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
#topbar-wrapper {
  background: linear-gradient(to bottom, var(--topbar-bg) 65%, transparent);
  position: sticky;
  top: 0;
  z-index: 3;
}

#topbar #breadcrumb span:not(:last-child)::after {
    font-family: "FontAwesome";
    content: "\f105";
    padding: 0 .3rem;
}
This post is licensed under CC BY 4.0 by the author.

© singurilla. Some rights reserved.

Using the Chirpy theme for Jekyll.