もじょえんじにあ……共感できる?

日常のメモ。日々これ共感。へたれでしょほてきなIT?

ミラクルミラクル

Miracle Linux 8.4 を Hyper-Vへインストールしたのですが、解像度が変更できない……

結論だけ。

/etc/default/grub

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/ml-swap rd.lvm.lv=ml/root rd.lvm.lv=ml/swap rhgb quiet"

の後ろに解像度の表記を追加しマス。例えば、1920x1080なら……

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/ml-swap rd.lvm.lv=ml/root rd.lvm.lv=ml/swap rhgb quiet video=hyperv_fb:1920x1080"

としてから

grub2-mkconfig -o /boot/grub2/grub.cfg

です。で、reboot。もし、第二世代でインストールできたら(なんかひっかかったので第一世代にしてインストールしたのdeath)、

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

デスね。reboot必要なのは一緒です。まぁ、これはこれで変更できないんデスが。

 

【ダーク】ConsogameでOfficeを買うと……

Consogame というサイトがありますf:id:kanako1000:20210904230328p:plain

Gameだけでなくて、WindowsやOfficeのライセンスも売ってます

f:id:kanako1000:20210904230521p:plain

明らかに値段がおかしいので、普通のひとは手をださないほうがいいと思いマス。

でも、びっくりするほど、ここのサポートは手厚いです。ヘタクソでもいいので英語でChatする必要があるんですけどネ

Windows10は有名サイトがあるくらいで、Proを$10程度で買えたりします。16coreなのにHomeのヒトとか、Hyper-Vを使うのに$10ならアリかと。

Officeのほうですが、なんとかなりましたけどおすすめしません。$16くらいだったかな。

最初、購入して来たKeyは「電話認証じゃないとだめよ」と書いてあったので面倒だけど電話したら凄いケタ数を入力させられて「そのキーはだめっす」みたいな感じ?で、「だめだったんだけど」と言ったらスクリーンショットを送れといわれて送ったら、再発行してくれて「オレらの仕入れ先のミスっぽい」というメッセージ。でもやっぱりだめ。

「やっぱりダメだお」とChatで送ったら、すまないがもう一度スクリーンショットを送ってくれといわれて送って、ちょっとまってくれ、再発行はするから、と言われて待ってたら、今度はWeb認証専用のキーが来たっぽい。でもダメ。

しかし、MSのJP的にはJPで有効でないOfficeのライセンスはハネるという動作をするっぽいので、ChromeでTranslateしてくれ、ここにそう書いてあるので参考まで、と送った。で、最悪Skype out でもいいのでUSに電話認証するデスヨ、とChatしたら、上位のライセンスを送ってきたデス。

まあ、通ったけど……無茶してない?大丈夫?

超なつゲーであそぶ

昔、ダイソーで売ってたCDのゲームがありまして、特にライセンスキーとかもないので今もあそべます

f:id:kanako1000:20210818224431p:plain

萌え絵ですが、ゲーム自体はヘクスじゃなくてスクエアのタクティクス級のゲームです。全10面ありますが、中盤からは普通に時間がかかりますよ。640x480を前提としているくらい古いゲームなので、遊ぼうかなーと思ってもWindowやアイコンがどっかいっちゃうのが面倒だったんですが、考えてみればHyper-Vにしてmstscで繋げばよいということに気付いちゃいました。1vcore 4GBもあげれば充分に動きます(XP時代のゲームですし)。相手があまりアタマよくないのも遊ぶにはいいdeath。でも7面、9面、10面でおさけのみながら間違うと結構苦労します。ま、飲んで戦争しちゃだめですね。
もしだめなら権利者の人、コメントしてね。音も100円とは思えないほどちゃんとしてます(多少ばらけることもあります)

わりと面白いと思います。100円とは思えないDeath!

せっかくなので計ってみる

デコレータ関数もつくったので計ってみましょう。

関数の手前に1行足すだけデス。あとmainも作るdeathネ。

@elapsed
def e0(n):

@elapsed
def eratosthenes(n):

def main():
  n = 10000
  primes = e0(n)
  primes = eratosthenes(n)
  print(len(primes))
if __name__ == "__main__": main()

mainの中でsys.argvとかでnをコマンドラインから入れるような処理を書くと毎回ファイル開かないでよいです。イマドキのipynbとかだと、まぁ、それすら気にしないデスけど。では、どーん。

$ ./xprimes.py
848.7949371337891 ms in e0
2.7043819427490234 ms in eratosthenes
1229

数はあってるみたいですね。速度はざっくり300倍って感じデス

Pythonで速い書き方のエラトステネスちゃん

昨日書いたコードはぶっちゃけ、速くないdeath。

まぁ、教科書的?というか遅いとわかっているメソッドつかってますからね。

速くするならこんな感じ?

def eratosthenes(n):
  n = int(n)
  if n < 2: return []
  sqrtn = 1 + int(n**0.5)
  primes = [2, 3]
  cands = [x for x in range(5, n+1, 2) if x%3]
  while (cands[0] <= sqrtn):
    prime = cands.pop(0)
    primes.append(prime)
    cands = [x for x in cands if x%prime]
  primes = primes + cands
  return primes

まず、removeというmethodはフィーリングでごめん、ですが遅いです。

いまどきのPCならメモリを大富豪に使っていいのでリスト内包表現にしたいデス。

このコードだと、primesに結果を入れる、candsは素数候補ということで、candsは毎回解放して作り直しのコードになります

まず、2, 3 は確定として、5からの奇数だけのcandsを作りますが、内包表現の後置ifを使って、3の倍数を捨ててます(3の倍数はx%3==0なのでリストに入らない)

関数の引数のnが最大値なので、念の為切り上げて√n の整数値をsqrtnとして作っておきます。検索はここまででいいデス。

一般論ですが、一番前を引っこ抜くpopや一番後ろに追加するappendは途中を操作するremoveより速いはずです。なので、candsの先頭は素数なのでpopしてprimesにappendしまっす。

リスト内包表現はmap()より速いことをpython2のこと検証したですし、柔軟な書き方ができるのでこれで、candsを作りなおすわけです。

で、sqrtnまで来たらループ終了で、そのときcandsに残っているのは素数のみのはずです。なので連結しておしまいdeath。

エラトステネスのふるい

古くて新しい?

素数を求める方式にエラトステネスのふるいというのがあります。

すっごいシンプルで2からNまでの整数をどばーっと集めて先頭のものは素数なので、それで割れるものを篩い落す(ふるいおとす)方式です。

で、残ったのが素数リストになるという方式deathね。

そのままの古典的な実装だとこんなかんじでどうかな。

 

def e0(n):
  n = int(n)
  if n < 2: return []
  sqrtn = 1 + int(n**0.5)
  primes = list(range(2, n))
  for i in range(2, n):
    if not i in primes: continue
    for j in range(i*2, n, i):
      if j in primes: primes.remove(j)
    if i > sqrtn: break
  return primes

関数の時間を計るデコレータ

次のネタのための仕込みdeath。

関数の実行にどれくらいの時間がかかったか比べたいことありませんか?
pythonならtime.timeで計れますが、decoraterにしておくと便利です。

 

#!/usr/bin/env python3

from functools import wraps
import time

def elapsed(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    sttime = time.time()
    result = func(*args, **kwargs)
    elapsed_time = time.time() - sttime
    print("{} ms in {}".format(elapsed_time * 1000, func.__name__))
    return result
  return wrapper