2022年1月31日月曜日

Sinatra の Extension 開発超入門

Sinatra の Extension 開発超入門

概要

Sinatra の拡張機能の開発入門としてとりあえず動作する拡張を作ってみたいと思います

また今回作成する拡張はヘルパーとして作成します

環境

  • macOS 11.6.2
  • Ruby 3.0.3p157
  • Sinatra 2.1.0

拡張の作成

拡張は Sinatra モジュール配下に作成します
今回はリクエストのヘッダを出力するような拡張にしてみます

  • vim test_ext.rb
require 'sinatra/base'

module Sinatra
  module LoggingHeader
    def hputs
      headers = request.env.select { |k, v| k.start_with?('HTTP_') }
      logger.info headers
    end
  end

  helpers LoggingHeader
end

LoggingHeader は拡張の名前になります
Sinatra::Base 配下で使用できるオブジェクトなどは拡張配下でも参照することができます
上記で言えば request オブジェクトを参照しています

作成した拡張機能を使う

  • vim test.rb
require 'sinatra'
require './test_ext'

get '/' do
  hputs
  'ok'
end

Sinatra の DSL をそのまま使うのであれば require するだけで拡張用のメソッドが使えるようになっています

クラシックスタイルで拡張を使うのであれば更に helpers Sinatra::LoggingHeader を記載します

拡張を使う場合はこれだけで OK です

拡張機能開発時にはルールがある

詳細は公式のドキュメントを確認してください
http://sinatrarb.com/extensions.html

Sinatar::Base クラスには直接変更を入れないでくださいやクラシックスタイルでもちゃんと使えるように記載する必要があるなどが書かれています

また今回はヘルパーとして作成しましたが Sinatra の DSL を拡張することもできます
その場合は helper ではなく register として呼び出す必要があるので注意してください

あとは gem として公開する

作成した拡張を公開するのであれば gem として作成してあげる必要があります
ディレクトリ構成などは公式に記載してあります

sinatra-fu
|-- README
|-- LICENSE
|-- Rakefile
|-- lib
|   `-- sinatra
|       `-- fu.rb
|-- test
|   `-- spec_sinatra_fu.rb
`-- sinatra-fu.gemspec

最後に

Sinatra の拡張機能を開発する方法を紹介しました

ルールがあるのでそれだけしっかりと守りましょう
Rubygems で公開する場合はディレクトリ構成なども守りましょう

参考サイト

2022年1月28日金曜日

Sinatra の initialize と configure はどちらも一回しかコールされない

Sinatra の initialize と configure はどちらも一回しかコールされない

概要

もしリクエストごとに毎回初期化したい場合は before などを使いましょう

環境

  • macOS 11.6.2
  • Ruby 3.0.3p157
  • Sinatra 2.1.0

動作確認用のコード

  • vim test.rb
require 'sinatra/base'

class TestWeb < Sinatra::Base
  def initialize()
    super
    puts "initialize"
    @age = (0..100).to_a.sample
  end

  configure do
    puts "configure"
    set :color, ['blue', 'red', 'green'].sample
  end

  get '/' do
    ret = "#{@age.to_s}, #{settings.color}"
    puts ret
    ret
  end
end
  • vim config.ru
require './test'

run TestWeb
  • bundle exec rackup config.ru
  • curl localhost:9292
configure
2022-01-27 10:38:45 +0900 Thin web server (v1.8.1 codename Infinite Smoothie)
2022-01-27 10:38:45 +0900 Maximum connections set to 1024
2022-01-27 10:38:45 +0900 Listening on localhost:9292, CTRL+C to stop
initialize
4, blue
::1 - - [27/Jan/2022:10:38:46 +0900] "GET / HTTP/1.1" 200 7 0.0144
4, blue
::1 - - [27/Jan/2022:10:38:47 +0900] "GET / HTTP/1.1" 200 7 0.0012
4, blue
::1 - - [27/Jan/2022:10:38:48 +0900] "GET / HTTP/1.1" 200 7 0.0011
4, blue
::1 - - [27/Jan/2022:10:38:48 +0900] "GET / HTTP/1.1" 200 7 0.0009
4, blue
::1 - - [27/Jan/2022:10:38:49 +0900] "GET / HTTP/1.1" 200 7 0.0015

ずっと同じ値が返ってくることがわかる

before を使う

  • vim test.rb
require 'sinatra/base'

class TestWeb < Sinatra::Base
  def initialize()
    super
    puts "initialize"
    @age = (0..100).to_a.sample
  end

  configure do
    puts "configure"
    set :color, ['blue', 'red', 'green'].sample
  end

  before do
    @age = (0..100).to_a.sample
    @color = ['blue', 'red', 'green'].sample
  end

  get '/' do
    ret = "#{@age.to_s}, #{@color}"
    puts ret
    ret
  end
end
  • vim config.ru
require './test'

run TestWeb
  • bundle exec rackup config.ru
  • curl localhost:9292
configure
2022-01-27 10:40:33 +0900 Thin web server (v1.8.1 codename Infinite Smoothie)
2022-01-27 10:40:33 +0900 Maximum connections set to 1024
2022-01-27 10:40:33 +0900 Listening on localhost:9292, CTRL+C to stop
initialize
9, green
::1 - - [27/Jan/2022:10:40:34 +0900] "GET / HTTP/1.1" 200 8 0.0398
59, blue
::1 - - [27/Jan/2022:10:40:35 +0900] "GET / HTTP/1.1" 200 8 0.0025
86, green
::1 - - [27/Jan/2022:10:40:35 +0900] "GET / HTTP/1.1" 200 9 0.0008
95, green
::1 - - [27/Jan/2022:10:40:36 +0900] "GET / HTTP/1.1" 200 9 0.0016
81, blue
::1 - - [27/Jan/2022:10:40:36 +0900] "GET / HTTP/1.1" 200 8 0.0011
93, blue
::1 - - [27/Jan/2022:10:40:37 +0900] "GET / HTTP/1.1" 200 8 0.0012
72, red
::1 - - [27/Jan/2022:10:40:38 +0900] "GET / HTTP/1.1" 200 7 0.0011

毎回違う

Tips

ちなみに configure ないではインスタンス変数に値を設定できないので set メソッドを使って設定し参照する場合は settings を使います

逆に before では set は使えません
Sinatra のインスタンス変数の扱うは少し面倒です

2022年1月27日木曜日

ドラゴンクエストウォークのメガモン履歴

ドラゴンクエストウォークのメガモン履歴

概要

ドラゴンクエストウォークのメガモン討伐のこころのドロップ率を紹介しています

全体

  • 総ドロップ数 -> 1900
  • S -> 29 (1.53%)
  • A -> 128 (6.74%)
  • B -> 222 (11.68%)
  • C -> 423 (22.26%)
  • D -> 1098 (57.79%)

メガモンごと

グレートドラゴン

  • ドロップ数 -> 51
  • S -> 0 (0%)
  • A -> 3 (5.88%)
  • B -> 7 (13.73%)
  • C -> 12 (23.53%)
  • D -> 29 (56.86%)

履歴

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

ゲマ

  • ドロップ数 -> 23
  • S -> 2 (8.7%)
  • A -> 2 (8.7%)
  • B -> 3 (13.04%)
  • C -> 7 (30.43%)
  • D -> 9 (39.13%)

履歴

  1. S
  2. D
  3. C
  4. D
  5. D
  6. D
  7. C
  8. A
  9. C
  10. D
  11. A
  12. D
  13. D
  14. C
  15. C
  16. D
  17. B
  18. C
  19. S
  20. C
  21. B
  22. D
  23. B

ミルドラース

  • ドロップ数 -> 42
  • S -> 2 (4.76%)
  • A -> 3 (7.14%)
  • B -> 6 (14.29%)
  • C -> 7 (16.67%)
  • D -> 24 (57.14%)

履歴

  1. D
  2. D
  3. D
  4. A
  5. B
  6. C
  7. D
  8. D
  9. D
  10. D
  11. D
  12. D
  13. D
  14. C
  15. B
  16. D
  17. D
  18. D
  19. D
  20. B
  21. D
  22. A
  23. C
  24. D
  25. D
  26. C
  27. D
  28. D
  29. D
  30. B
  31. D
  32. B
  33. D
  34. D
  35. C
  36. D
  37. C
  38. A
  39. B
  40. S
  41. S
  42. C

じげんりゅう

  • ドロップ数 -> 46
  • S -> 1 (2.17%)
  • A -> 5 (10.87%)
  • B -> 7 (15.22%)
  • C -> 5 (10.87%)
  • D -> 28 (60.87%)

履歴

  1. A
  2. D
  3. D
  4. B
  5. D
  6. C
  7. A
  8. D
  9. S
  10. D
  11. D
  12. A
  13. B
  14. D
  15. C
  16. D
  17. C
  18. D
  19. B
  20. D
  21. D
  22. D
  23. D
  24. D
  25. D
  26. D
  27. D
  28. D
  29. B
  30. D
  31. B
  32. A
  33. D
  34. C
  35. C
  36. D
  37. D
  38. B
  39. D
  40. D
  41. A
  42. D
  43. D
  44. B
  45. D
  46. D

サンライズスライム

  • ドロップ数 -> 57
  • S -> 1 (1.75%)
  • A -> 3 (5.26%)
  • B -> 4 (7.02%)
  • C -> 13 (22.81%)
  • D -> 36 (63.16%)

履歴

  1. C
  2. C
  3. D
  4. C
  5. B
  6. D
  7. C
  8. C
  9. D
  10. D
  11. D
  12. D
  13. D
  14. B
  15. C
  16. D
  17. D
  18. D
  19. D
  20. D
  21. B
  22. D
  23. A
  24. D
  25. D
  26. D
  27. C
  28. D
  29. D
  30. A
  31. B
  32. D
  33. D
  34. C
  35. C
  36. D
  37. D
  38. D
  39. D
  40. D
  41. D
  42. C
  43. S
  44. D
  45. D
  46. D
  47. D
  48. D
  49. C
  50. D
  51. D
  52. D
  53. C
  54. C
  55. D
  56. D
  57. A

グリザード

  • ドロップ数 -> 84
  • S -> 0 (0%)
  • A -> 6 (7.14%)
  • B -> 9 (10.71%)
  • C -> 16 (19.05%)
  • D -> 53 (63.1%)

履歴

  1. D
  2. C
  3. D
  4. D
  5. D
  6. B
  7. D
  8. D
  9. C
  10. D
  11. B
  12. D
  13. C
  14. C
  15. C
  16. D
  17. D
  18. D
  19. D
  20. D
  21. D
  22. D
  23. D
  24. C
  25. C
  26. D
  27. D
  28. D
  29. C
  30. D
  31. D
  32. C
  33. D
  34. D
  35. C
  36. C
  37. B
  38. C
  39. D
  40. B
  41. D
  42. B
  43. D
  44. B
  45. B
  46. A
  47. D
  48. D
  49. D
  50. C
  51. D
  52. C
  53. D
  54. D
  55. C
  56. D
  57. D
  58. D
  59. D
  60. D
  61. B
  62. D
  63. D
  64. D
  65. A
  66. D
  67. A
  68. D
  69. D
  70. C
  71. D
  72. D
  73. D
  74. A
  75. D
  76. B
  77. D
  78. D
  79. A
  80. D
  81. D
  82. D
  83. A
  84. D

キングヒドラ

  • ドロップ数 -> 6
  • S -> 1 (16.67%)
  • A -> 1 (16.67%)
  • B -> 0 (0%)
  • C -> 1 (16.67%)
  • D -> 3 (50%)

履歴

  1. A
  2. D
  3. C
  4. D
  5. S
  6. D

復刻シドー

  • ドロップ数 -> 11
  • S -> 0 (0%)
  • A -> 1 (9.09%)
  • B -> 3 (27.27%)
  • C -> 2 (18.18%)
  • D -> 5 (45.45%)

履歴

  1. D
  2. D
  3. D
  4. C
  5. B
  6. D
  7. C
  8. B
  9. D
  10. B
  11. A

復刻ハーゴン

  • ドロップ数 -> 22
  • S -> 0 (0%)
  • A -> 1 (4.55%)
  • B -> 2 (9.09%)
  • C -> 4 (18.18%)
  • D -> 15 (68.18%)

履歴

  1. A
  2. D
  3. D
  4. D
  5. D
  6. D
  7. D
  8. D
  9. D
  10. D
  11. C
  12. B
  13. C
  14. B
  15. C
  16. D
  17. D
  18. D
  19. C
  20. D
  21. D
  22. D

復刻オルゴデミーラ

  • ドロップ数 -> 14
  • S -> 0 (0%)
  • A -> 4 (28.57%)
  • B -> 1 (7.14%)
  • C -> 1 (7.14%)
  • D -> 8 (57.14%)

履歴

  1. D
  2. A
  3. C
  4. D
  5. D
  6. D
  7. D
  8. A
  9. A
  10. A
  11. D
  12. D
  13. D
  14. B

ギガントドラゴン

  • ドロップ数 -> 78
  • S -> 1 (1.28%)
  • A -> 3 (3.85%)
  • B -> 3 (3.85%)
  • C -> 25 (32.05%)
  • D -> 46 (58.97%)

履歴

  1. D
  2. C
  3. D
  4. D
  5. D
  6. D
  7. D
  8. C
  9. D
  10. D
  11. D
  12. D
  13. D
  14. D
  15. C
  16. S
  17. D
  18. B
  19. D
  20. C
  21. C
  22. C
  23. D
  24. D
  25. D
  26. C
  27. C
  28. D
  29. B
  30. C
  31. D
  32. D
  33. D
  34. C
  35. D
  36. D
  37. C
  38. C
  39. C
  40. C
  41. C
  42. D
  43. C
  44. D
  45. D
  46. D
  47. A
  48. D
  49. D
  50. B
  51. A
  52. D
  53. D
  54. C
  55. D
  56. C
  57. D
  58. D
  59. C
  60. D
  61. C
  62. C
  63. D
  64. D
  65. D
  66. D
  67. C
  68. D
  69. A
  70. D
  71. D
  72. C
  73. C
  74. D
  75. D
  76. D
  77. D
  78. C

復刻バリゲーン

  • ドロップ数 -> 17
  • S -> 0 (0%)
  • A -> 1 (5.88%)
  • B -> 1 (5.88%)
  • C -> 1 (5.88%)
  • D -> 14 (82.35%)

履歴

  1. D
  2. D
  3. D
  4. D
  5. D
  6. D
  7. B
  8. A
  9. D
  10. D
  11. C
  12. D
  13. D
  14. D
  15. D
  16. D
  17. D

ナウマンボーグ

  • ドロップ数 -> 10
  • S -> 0 (0%)
  • A -> 0 (0%)
  • B -> 0 (0%)
  • C -> 3 (30%)
  • D -> 7 (70%)

履歴

  1. D
  2. D
  3. C
  4. D
  5. D
  6. D
  7. C
  8. D
  9. D
  10. C

幽霊船

  • ドロップ数 -> 6
  • S -> 1 (16.67%)
  • A -> 0 (0%)
  • B -> 1 (16.67%)
  • C -> 0 (0%)
  • D -> 4 (66.67%)

履歴

  1. B
  2. D
  3. D
  4. D
  5. S
  6. D

ドラゴン

  • ドロップ数 -> 6
  • S -> 0 (0%)
  • A -> 0 (0%)
  • B -> 0 (0%)
  • C -> 1 (16.67%)
  • D -> 5 (83.33%)

履歴

  1. C
  2. D
  3. D
  4. D
  5. D
  6. D

闇の覇者りゅうおう

  • ドロップ数 -> 32
  • S -> 1 (3.13%)
  • A -> 2 (6.25%)
  • B -> 9 (28.13%)
  • C -> 8 (25%)
  • D -> 12 (37.5%)

履歴

  1. B
  2. D
  3. B
  4. B
  5. D
  6. B
  7. C
  8. C
  9. B
  10. D
  11. C
  12. D
  13. B
  14. S
  15. D
  16. D
  17. D
  18. B
  19. D
  20. D
  21. B
  22. C
  23. B
  24. C
  25. C
  26. D
  27. D
  28. A
  29. C
  30. C
  31. A
  32. D

竜王

  • ドロップ数 -> 23
  • S -> 1 (4.35%)
  • A -> 4 (17.39%)
  • B -> 3 (13.04%)
  • C -> 2 (8.7%)
  • D -> 13 (56.52%)

履歴

  1. D
  2. C
  3. B
  4. C
  5. S
  6. D
  7. D
  8. A
  9. A
  10. B
  11. D
  12. D
  13. D
  14. D
  15. D
  16. D
  17. D
  18. D
  19. D
  20. A
  21. B
  22. D
  23. A

ドルマゲス

  • ドロップ数 -> 75
  • S -> 0 (0%)
  • A -> 6 (8%)
  • B -> 5 (6.67%)
  • C -> 19 (25.33%)
  • D -> 45 (60%)

履歴

  1. D
  2. C
  3. D
  4. D
  5. D
  6. C
  7. D
  8. C
  9. D
  10. D
  11. A
  12. D
  13. C
  14. D
  15. D
  16. B
  17. C
  18. D
  19. D
  20. D
  21. D
  22. D
  23. D
  24. D
  25. D
  26. C
  27. D
  28. C
  29. D
  30. C
  31. C
  32. D
  33. D
  34. D
  35. C
  36. D
  37. B
  38. B
  39. D
  40. C
  41. D
  42. D
  43. A
  44. B
  45. D
  46. A
  47. B
  48. D
  49. C
  50. C
  51. D
  52. D
  53. D
  54. D
  55. D
  56. D
  57. D
  58. C
  59. C
  60. D
  61. D
  62. D
  63. C
  64. D
  65. D
  66. D
  67. D
  68. D
  69. C
  70. C
  71. D
  72. A
  73. A
  74. C
  75. A

ラプソーン

  • ドロップ数 -> 91
  • S -> 1 (1.1%)
  • A -> 5 (5.49%)
  • B -> 5 (5.49%)
  • C -> 34 (37.36%)
  • D -> 46 (50.55%)

履歴

  1. C
  2. C
  3. C
  4. D
  5. D
  6. S
  7. D
  8. D
  9. D
  10. D
  11. D
  12. D
  13. D
  14. D
  15. C
  16. D
  17. C
  18. C
  19. C
  20. D
  21. D
  22. C
  23. D
  24. D
  25. A
  26. D
  27. C
  28. A
  29. D
  30. C
  31. C
  32. C
  33. D
  34. D
  35. D
  36. C
  37. D
  38. D
  39. C
  40. D
  41. D
  42. C
  43. C
  44. B
  45. D
  46. C
  47. C
  48. D
  49. D
  50. D
  51. A
  52. C
  53. D
  54. C
  55. C
  56. D
  57. D
  58. D
  59. D
  60. C
  61. B
  62. C
  63. C
  64. C
  65. B
  66. C
  67. C
  68. C
  69. A
  70. D
  71. B
  72. D
  73. C
  74. C
  75. B
  76. C
  77. D
  78. D
  79. D
  80. D
  81. C
  82. D
  83. C
  84. D
  85. D
  86. D
  87. D
  88. D
  89. A
  90. D
  91. C

グレイチェル

  • ドロップ数 -> 36
  • S -> 0 (0%)
  • A -> 0 (0%)
  • B -> 5 (13.89%)
  • C -> 7 (19.44%)
  • D -> 24 (66.67%)

履歴

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

ネルゲル

  • ドロップ数 -> 27
  • S -> 2 (7.41%)
  • A -> 1 (3.7%)
  • B -> 1 (3.7%)
  • C -> 8 (29.63%)
  • D -> 15 (55.56%)

履歴

  1. D
  2. D
  3. C
  4. C
  5. D
  6. A
  7. C
  8. D
  9. B
  10. D
  11. S
  12. C
  13. D
  14. D
  15. D
  16. D
  17. C
  18. C
  19. C
  20. C
  21. D
  22. D
  23. D
  24. D
  25. D
  26. D
  27. S

ゴリゲル

  • ドロップ数 -> 35
  • S -> 1 (2.86%)
  • A -> 2 (5.71%)
  • B -> 2 (5.71%)
  • C -> 12 (34.29%)
  • D -> 18 (51.43%)

履歴

  1. D
  2. D
  3. D
  4. D
  5. D
  6. C
  7. D
  8. D
  9. D
  10. C
  11. D
  12. D
  13. C
  14. C
  15. A
  16. C
  17. C
  18. B
  19. D
  20. C
  21. D
  22. D
  23. S
  24. C
  25. C
  26. D
  27. D
  28. C
  29. D
  30. C
  31. D
  32. B
  33. D
  34. A
  35. C

マッスルガード

  • ドロップ数 -> 43
  • S -> 1 (2.33%)
  • A -> 4 (9.3%)
  • B -> 1 (2.33%)
  • C -> 6 (13.95%)
  • D -> 31 (72.09%)

履歴

  1. D
  2. D
  3. D
  4. D
  5. A
  6. D
  7. D
  8. D
  9. C
  10. D
  11. D
  12. D
  13. D
  14. D
  15. D
  16. C
  17. D
  18. D
  19. D
  20. C
  21. A
  22. B
  23. D
  24. D
  25. C
  26. D
  27. A
  28. D
  29. D
  30. D
  31. C
  32. D
  33. S
  34. D
  35. D
  36. D
  37. D
  38. C
  39. D
  40. D
  41. D
  42. D
  43. A

欲望の魔人

  • ドロップ数 -> 57
  • S -> 2 (3.51%)
  • A -> 7 (12.28%)
  • B -> 5 (8.77%)
  • C -> 14 (24.56%)
  • D -> 29 (50.88%)

履歴

  1. D
  2. D
  3. D
  4. D
  5. D
  6. C
  7. D
  8. A
  9. D
  10. D
  11. D
  12. A
  13. D
  14. A
  15. D
  16. D
  17. B
  18. D
  19. B
  20. C
  21. D
  22. D
  23. C
  24. D
  25. D
  26. S
  27. D
  28. C
  29. C
  30. D
  31. D
  32. C
  33. C
  34. D
  35. S
  36. D
  37. B
  38. D
  39. D
  40. D
  41. A
  42. D
  43. A
  44. B
  45. C
  46. C
  47. C
  48. C
  49. B
  50. C
  51. C
  52. A
  53. D
  54. C
  55. D
  56. D
  57. A

ブレア

  • ドロップ数 -> 52
  • S -> 1 (1.92%)
  • A -> 4 (7.69%)
  • B -> 6 (11.54%)
  • C -> 14 (26.92%)
  • D -> 27 (51.92%)

履歴

  1. B
  2. A
  3. D
  4. D
  5. D
  6. B
  7. C
  8. D
  9. D
  10. S
  11. C
  12. D
  13. D
  14. D
  15. C
  16. D
  17. C
  18. B
  19. A
  20. D
  21. D
  22. D
  23. D
  24. A
  25. D
  26. C
  27. D
  28. C
  29. D
  30. D
  31. D
  32. D
  33. D
  34. D
  35. D
  36. C
  37. B
  38. C
  39. D
  40. C
  41. C
  42. D
  43. C
  44. C
  45. C
  46. D
  47. D
  48. C
  49. A
  50. B
  51. B
  52. D

究極エビルプリースト

  • ドロップ数 -> 39
  • S -> 1 (2.56%)
  • A -> 3 (7.69%)
  • B -> 5 (12.82%)
  • C -> 5 (12.82%)
  • D -> 25 (64.1%)

履歴

  1. D
  2. D
  3. D
  4. D
  5. D
  6. B
  7. A
  8. D
  9. B
  10. D
  11. A
  12. D
  13. C
  14. D
  15. D
  16. C
  17. D
  18. D
  19. A
  20. S
  21. D
  22. D
  23. D
  24. D
  25. D
  26. B
  27. D
  28. C
  29. B
  30. C
  31. D
  32. D
  33. D
  34. C
  35. B
  36. D
  37. D
  38. D
  39. D

復刻ハドラー

  • ドロップ数 -> 1
  • S -> 0 (0%)
  • A -> 0 (0%)
  • B -> 0 (0%)
  • C -> 1 (100%)
  • D -> 0 (0%)

履歴

  1. C

復刻フレイザード

  • ドロップ数 -> 2
  • S -> 0 (0%)
  • A -> 0 (0%)
  • B -> 0 (0%)
  • C -> 0 (0%)
  • D -> 2 (100%)

履歴

  1. D
  2. D

竜魔人バラン

  • ドロップ数 -> 22
  • S -> 1 (4.55%)
  • A -> 2 (9.09%)
  • B -> 5 (22.73%)
  • C -> 5 (22.73%)
  • D -> 9 (40.91%)

履歴

  1. D
  2. D
  3. C
  4. B
  5. C
  6. D
  7. B
  8. D
  9. B
  10. B
  11. A
  12. C
  13. C
  14. D
  15. A
  16. D
  17. S
  18. C
  19. D
  20. D
  21. D
  22. B

ミストバーン

  • ドロップ数 -> 25
  • S -> 1 (4%)
  • A -> 3 (12%)
  • B -> 3 (12%)
  • C -> 8 (32%)
  • D -> 10 (40%)

履歴

  1. C
  2. D
  3. D
  4. B
  5. D
  6. C
  7. C
  8. C
  9. S
  10. A
  11. C
  12. C
  13. D
  14. D
  15. D
  16. D
  17. C
  18. A
  19. D
  20. A
  21. D
  22. C
  23. B
  24. B
  25. D

アラグネ

  • ドロップ数 -> 68
  • S -> 0 (0%)
  • A -> 2 (2.94%)
  • B -> 5 (7.35%)
  • C -> 10 (14.71%)
  • D -> 51 (75%)

履歴

  1. B
  2. C
  3. C
  4. A
  5. B
  6. D
  7. C
  8. D
  9. D
  10. D
  11. D
  12. D
  13. B
  14. D
  15. D
  16. D
  17. B
  18. C
  19. D
  20. D
  21. B
  22. C
  23. D
  24. D
  25. D
  26. C
  27. D
  28. D
  29. C
  30. D
  31. D
  32. D
  33. C
  34. D
  35. D
  36. D
  37. D
  38. D
  39. D
  40. D
  41. D
  42. D
  43. D
  44. D
  45. D
  46. D
  47. D
  48. D
  49. D
  50. D
  51. D
  52. D
  53. D
  54. D
  55. C
  56. D
  57. D
  58. C
  59. D
  60. D
  61. D
  62. D
  63. D
  64. D
  65. D
  66. A
  67. D
  68. D

呪術師マーリン

  • ドロップ数 -> 5
  • S -> 1 (20%)
  • A -> 0 (0%)
  • B -> 1 (20%)
  • C -> 1 (20%)
  • D -> 2 (40%)

履歴

  1. S
  2. B
  3. C
  4. D
  5. D

デスピサロ

  • ドロップ数 -> 35
  • S -> 1 (2.86%)
  • A -> 2 (5.71%)
  • B -> 4 (11.43%)
  • C -> 2 (5.71%)
  • D -> 26 (74.29%)

履歴

  1. D
  2. B
  3. A
  4. D
  5. D
  6. D
  7. D
  8. C
  9. D
  10. D
  11. D
  12. S
  13. B
  14. D
  15. D
  16. D
  17. B
  18. D
  19. D
  20. D
  21. D
  22. B
  23. D
  24. D
  25. D
  26. D
  27. D
  28. D
  29. D
  30. D
  31. D
  32. A
  33. D
  34. C
  35. D

マスタードラゴン邪

  • ドロップ数 -> 59
  • S -> 1 (1.69%)
  • A -> 5 (8.47%)
  • B -> 8 (13.56%)
  • C -> 12 (20.34%)
  • D -> 33 (55.93%)

履歴

  1. D
  2. C
  3. C
  4. B
  5. C
  6. A
  7. D
  8. D
  9. C
  10. B
  11. C
  12. D
  13. D
  14. D
  15. D
  16. D
  17. D
  18. D
  19. C
  20. B
  21. C
  22. B
  23. D
  24. D
  25. D
  26. D
  27. D
  28. D
  29. D
  30. A
  31. C
  32. B
  33. D
  34. D
  35. C
  36. D
  37. D
  38. D
  39. D
  40. D
  41. B
  42. D
  43. C
  44. D
  45. C
  46. D
  47. A
  48. B
  49. D
  50. D
  51. A
  52. C
  53. A
  54. D
  55. D
  56. D
  57. D
  58. B
  59. S

キャプテン・クロウ

  • ドロップ数 -> 48
  • S -> 0 (0%)
  • A -> 2 (4.17%)
  • B -> 9 (18.75%)
  • C -> 9 (18.75%)
  • D -> 28 (58.33%)

履歴

  1. C
  2. C
  3. C
  4. D
  5. A
  6. D
  7. D
  8. B
  9. D
  10. D
  11. C
  12. C
  13. D
  14. B
  15. D
  16. C
  17. B
  18. D
  19. B
  20. C
  21. D
  22. D
  23. D
  24. B
  25. D
  26. B
  27. D
  28. C
  29. D
  30. D
  31. B
  32. D
  33. D
  34. B
  35. D
  36. D
  37. D
  38. D
  39. D
  40. D
  41. C
  42. D
  43. D
  44. D
  45. D
  46. B
  47. D
  48. A

スラリンガル

  • ドロップ数 -> 12
  • S -> 0 (0%)
  • A -> 2 (16.67%)
  • B -> 3 (25%)
  • C -> 3 (25%)
  • D -> 4 (33.33%)

履歴

  1. D
  2. B
  3. D
  4. D
  5. A
  6. D
  7. B
  8. B
  9. C
  10. C
  11. C
  12. A

ムドー

  • ドロップ数 -> 23
  • S -> 1 (4.35%)
  • A -> 0 (0%)
  • B -> 3 (13.04%)
  • C -> 6 (26.09%)
  • D -> 13 (56.52%)

履歴

  1. C
  2. D
  3. D
  4. C
  5. D
  6. D
  7. C
  8. D
  9. D
  10. S
  11. C
  12. D
  13. B
  14. D
  15. C
  16. B
  17. D
  18. B
  19. D
  20. C
  21. D
  22. D
  23. D

デュラン

  • ドロップ数 -> 44
  • S -> 0 (0%)
  • A -> 7 (15.91%)
  • B -> 3 (6.82%)
  • C -> 7 (15.91%)
  • D -> 27 (61.36%)

履歴

  1. A
  2. C
  3. D
  4. D
  5. C
  6. D
  7. D
  8. C
  9. D
  10. D
  11. D
  12. A
  13. C
  14. C
  15. C
  16. D
  17. D
  18. D
  19. D
  20. D
  21. B
  22. D
  23. B
  24. D
  25. D
  26. A
  27. D
  28. B
  29. C
  30. D
  31. D
  32. D
  33. A
  34. D
  35. D
  36. D
  37. D
  38. A
  39. D
  40. D
  41. D
  42. D
  43. A
  44. A

デスタムーア

  • ドロップ数 -> 40
  • S -> 0 (0%)
  • A -> 2 (5%)
  • B -> 3 (7.5%)
  • C -> 7 (17.5%)
  • D -> 28 (70%)

履歴

  1. D
  2. C
  3. D
  4. D
  5. D
  6. D
  7. A
  8. C
  9. D
  10. C
  11. D
  12. C
  13. B
  14. D
  15. B
  16. C
  17. B
  18. D
  19. D
  20. D
  21. D
  22. D
  23. D
  24. D
  25. D
  26. C
  27. C
  28. D
  29. D
  30. D
  31. D
  32. A
  33. D
  34. D
  35. D
  36. D
  37. D
  38. D
  39. D
  40. D

デスタムーアギガモン

  • ドロップ数 -> 56
  • S -> 0 (0%)
  • A -> 3 (5.36%)
  • B -> 11 (19.64%)
  • C -> 17 (30.36%)
  • D -> 25 (44.64%)

履歴

  1. B
  2. D
  3. D
  4. A
  5. C
  6. D
  7. D
  8. A
  9. C
  10. B
  11. D
  12. C
  13. C
  14. D
  15. B
  16. C
  17. D
  18. D
  19. D
  20. D
  21. B
  22. D
  23. D
  24. B
  25. D
  26. D
  27. D
  28. B
  29. D
  30. C
  31. C
  32. D
  33. C
  34. C
  35. D
  36. B
  37. C
  38. B
  39. C
  40. C
  41. B
  42. D
  43. D
  44. C
  45. C
  46. B
  47. A
  48. D
  49. D
  50. C
  51. D
  52. C
  53. B
  54. D
  55. D
  56. C

闇の覇者竜王

  • ドロップ数 -> 29
  • S -> 1 (3.45%)
  • A -> 1 (3.45%)
  • B -> 3 (10.34%)
  • C -> 10 (34.48%)
  • D -> 14 (48.28%)

履歴

  1. D
  2. B
  3. B
  4. C
  5. D
  6. C
  7. D
  8. D
  9. D
  10. D
  11. D
  12. S
  13. C
  14. C
  15. A
  16. B
  17. D
  18. C
  19. C
  20. D
  21. C
  22. D
  23. C
  24. C
  25. D
  26. D
  27. D
  28. C
  29. D

水竜ギルギッシュ

  • ドロップ数 -> 52
  • S -> 0 (0%)
  • A -> 2 (3.85%)
  • B -> 4 (7.69%)
  • C -> 11 (21.15%)
  • D -> 35 (67.31%)

履歴

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

ぬしさま

  • ドロップ数 -> 53
  • S -> 0 (0%)
  • A -> 3 (5.66%)
  • B -> 7 (13.21%)
  • C -> 11 (20.75%)
  • D -> 32 (60.38%)

履歴

  1. B
  2. D
  3. C
  4. D
  5. D
  6. D
  7. D
  8. D
  9. C
  10. D
  11. B
  12. D
  13. D
  14. D
  15. D
  16. D
  17. D
  18. D
  19. D
  20. A
  21. C
  22. C
  23. D
  24. A
  25. D
  26. C
  27. C
  28. D
  29. B
  30. B
  31. D
  32. C
  33. C
  34. D
  35. B
  36. D
  37. D
  38. D
  39. D
  40. D
  41. B
  42. D
  43. C
  44. C
  45. D
  46. D
  47. C
  48. D
  49. D
  50. D
  51. B
  52. D
  53. A

バルボロス

  • ドロップ数 -> 58
  • S -> 1 (1.72%)
  • A -> 3 (5.17%)
  • B -> 13 (22.41%)
  • C -> 15 (25.86%)
  • D -> 26 (44.83%)

履歴

  1. B
  2. D
  3. D
  4. D
  5. B
  6. D
  7. C
  8. B
  9. C
  10. D
  11. C
  12. B
  13. B
  14. A
  15. B
  16. D
  17. D
  18. D
  19. B
  20. D
  21. C
  22. C
  23. D
  24. C
  25. C
  26. C
  27. C
  28. D
  29. C
  30. D
  31. A
  32. D
  33. C
  34. B
  35. D
  36. C
  37. B
  38. C
  39. D
  40. D
  41. D
  42. C
  43. S
  44. B
  45. C
  46. D
  47. D
  48. B
  49. D
  50. D
  51. D
  52. A
  53. B
  54. D
  55. D
  56. B
  57. D
  58. D

エルギオス

  • ドロップ数 -> 54
  • S -> 0 (0%)
  • A -> 4 (7.41%)
  • B -> 10 (18.52%)
  • C -> 14 (25.93%)
  • D -> 26 (48.15%)

履歴

  1. D
  2. D
  3. B
  4. B
  5. D
  6. B
  7. B
  8. A
  9. D
  10. D
  11. C
  12. D
  13. C
  14. D
  15. C
  16. D
  17. D
  18. C
  19. D
  20. C
  21. C
  22. B
  23. B
  24. D
  25. D
  26. C
  27. A
  28. D
  29. D
  30. C
  31. B
  32. A
  33. C
  34. D
  35. D
  36. B
  37. D
  38. C
  39. D
  40. D
  41. C
  42. D
  43. C
  44. A
  45. D
  46. B
  47. D
  48. D
  49. B
  50. D
  51. D
  52. C
  53. C
  54. D

レティス

  • ドロップ数 -> 25
  • S -> 1 (4%)
  • A -> 0 (0%)
  • B -> 3 (12%)
  • C -> 6 (24%)
  • D -> 15 (60%)

履歴

  1. C
  2. B
  3. D
  4. D
  5. D
  6. B
  7. D
  8. D
  9. D
  10. C
  11. C
  12. D
  13. B
  14. D
  15. D
  16. D
  17. D
  18. S
  19. D
  20. D
  21. D
  22. C
  23. C
  24. C
  25. D

ゴールデンスライム

  • ドロップ数 -> 41
  • S -> 1 (2.44%)
  • A -> 1 (2.44%)
  • B -> 6 (14.63%)
  • C -> 8 (19.51%)
  • D -> 25 (60.98%)

履歴

  1. C
  2. D
  3. C
  4. B
  5. D
  6. B
  7. D
  8. D
  9. D
  10. D
  11. D
  12. D
  13. C
  14. C
  15. D
  16. D
  17. C
  18. D
  19. D
  20. B
  21. A
  22. D
  23. D
  24. C
  25. D
  26. C
  27. B
  28. D
  29. B
  30. D
  31. D
  32. D
  33. C
  34. B
  35. D
  36. D
  37. S
  38. D
  39. D
  40. D
  41. D

オムドレクス

  • ドロップ数 -> 30
  • S -> 0 (0%)
  • A -> 1 (3.33%)
  • B -> 5 (16.67%)
  • C -> 8 (26.67%)
  • D -> 16 (53.33%)

履歴

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

ガナサダイ

  • ドロップ数 -> 31
  • S -> 0 (0%)
  • A -> 2 (6.45%)
  • B -> 5 (16.13%)
  • C -> 4 (12.9%)
  • D -> 20 (64.52%)

履歴

  1. D
  2. B
  3. A
  4. D
  5. D
  6. C
  7. D
  8. D
  9. B
  10. C
  11. B
  12. B
  13. D
  14. D
  15. D
  16. D
  17. D
  18. D
  19. D
  20. D
  21. B
  22. D
  23. A
  24. D
  25. D
  26. D
  27. C
  28. D
  29. D
  30. D
  31. C

バルザック

  • ドロップ数 -> 40
  • S -> 0 (0%)
  • A -> 4 (10%)
  • B -> 3 (7.5%)
  • C -> 9 (22.5%)
  • D -> 24 (60%)

履歴

  1. A
  2. C
  3. D
  4. C
  5. D
  6. D
  7. D
  8. B
  9. C
  10. D
  11. A
  12. C
  13. D
  14. D
  15. D
  16. D
  17. D
  18. D
  19. D
  20. B
  21. C
  22. C
  23. D
  24. D
  25. D
  26. D
  27. D
  28. D
  29. D
  30. D
  31. D
  32. D
  33. C
  34. C
  35. D
  36. B
  37. D
  38. A
  39. C
  40. A

ギガバレス

  • ドロップ数 -> 61
  • S -> 0 (0%)
  • A -> 5 (8.2%)
  • B -> 9 (14.75%)
  • C -> 19 (31.15%)
  • D -> 28 (45.9%)

履歴

  1. D
  2. D
  3. C
  4. C
  5. D
  6. D
  7. C
  8. B
  9. D
  10. D
  11. D
  12. C
  13. D
  14. C
  15. D
  16. C
  17. D
  18. B
  19. C
  20. B
  21. D
  22. C
  23. D
  24. D
  25. D
  26. D
  27. A
  28. B
  29. D
  30. C
  31. C
  32. A
  33. D
  34. A
  35. D
  36. A
  37. B
  38. D
  39. C
  40. A
  41. B
  42. B
  43. D
  44. B
  45. C
  46. D
  47. D
  48. C
  49. B
  50. D
  51. D
  52. D
  53. C
  54. C
  55. C
  56. D
  57. C
  58. D
  59. D
  60. C
  61. C

キラーマジンガイ

  • ドロップ数 -> 38
  • S -> 0 (0%)
  • A -> 3 (7.89%)
  • B -> 4 (10.53%)
  • C -> 5 (13.16%)
  • D -> 26 (68.42%)

履歴

  1. D
  2. D
  3. D
  4. D
  5. B
  6. D
  7. D
  8. B
  9. D
  10. B
  11. A
  12. D
  13. D
  14. D
  15. D
  16. C
  17. D
  18. D
  19. D
  20. D
  21. B
  22. D
  23. C
  24. D
  25. D
  26. D
  27. C
  28. D
  29. D
  30. D
  31. A
  32. D
  33. C
  34. D
  35. D
  36. C
  37. D
  38. A

2022年1月26日水曜日

LPIO に電気会社を変更する流れ

LPIO に電気会社を変更する流れ

概要

TEPCO から LPIO へ電気会社を切り替えたのでその方法を紹介します

環境

  • 分電盤 6A
  • オール家電
  • くらしTEPCO スマートライフプラン

時系列

  • 2022/01/15 エネチェンジから依頼
  • 2022/01/17 エネチェンジからLPIOへのアカウント情報の取次ぎ完了の連絡
  • 2022/01/18 LPIO からクレカ登録の連絡
  • 2022/01/18 LPIO へクレカ登録
  • 2022/01/22 LPIO から仮アカウントの発行、切り替え日時の連絡
  • 2022/02/10 LPIO へ電気会社切り替え予定

エネチャンジは経由しないでもOK

結局、エネチェンジ -> LPIO と取次ぎされるので無駄にエネチェンジアカウントを作成することになります

一応メリットとしてはキャッシュバックの料金が少しだけ上がるようです

TEPCO のポイントは使っておこう

もし溜まっている場合は交換しておきましょう

料金がどれくらい変わったか

分かり次第追記します

ちなみに TEPCO は一ヶ月で15000-20000円くらいの範囲でした

2022年1月25日火曜日

Ruby から JavaScript のコードを生成する方法 (opal 編)

Ruby から JavaScript のコードを生成する方法 (opal 編)

概要

Ruby の opal を使うと Ruby から JavaScript のコードを生成することができます
今回は入門として DOM の操作などをやってみました

※bundler を使うとうまく動作しないのでグローバル環境にインストールして作業します

環境

  • macOS 11.6.2
  • Ruby 3.0.3
  • opal 1.3.2
  • opel-jquery 0.4.6

準備

  • gem install opal opal-jquery

今回は DOM の操作もするので opal-jquery もインストールしています

test.rb

puts "Hello from ruby."

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="test.js"></script>
  </head>
  <body>
  </body>
</html>

コンパイル

  • opal -c test.rb > test.js

動作確認

  • open index.html

こんな感じで puts は console.log として表示されるようです

DOM 操作する

require 'opal'
require 'opal-jquery'

msg = "Hello from Ruby."
`$('#msg').text(#{msg})`

JavaScript の部分はバッククォートで囲んで評価する必要があります

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  </head>
  <body>
    <div id="msg"></div>
    <script src="test.js"></script>
  </body>
</html>

jQuery を使っているので CDN を使って head タグで読み込んでいます
コンパイルで出力される js は body の最後に呼び出します

コンパイル

少し実行方法が変わります
RUBYOPT で先に opal-jquery を require するようにしてからコンパイルします

  • RUBYOPT="-ropal-jquery" opal -c test.rb > test.js

動作確認

  • open index.html

ちゃんと div タグにメッセージが表示されているのが確認できます

最後に

opal を使って js の生成や DOM の制御をしてみました
jquery で書けるので割と直感的にかけるので js を書けるかなと思いました
コンパイルする必要はありますが Ruby ですべて書けるので js コードを取り除きたい場合はいいのかもしれません

bundler を使ってbundle exec opal しようとするといろいろとハマるので注意が必要です

参考サイト

2022年1月24日月曜日

Celery でタスクが登録されないときに確認すること (コードで説明編)

Celery でタスクが登録されないときに確認すること (コードで説明編)

概要

前回文章で説明しました

実際にサンプルのコードが合ったほうがイメージしやすいのでコードでも紹介します

環境

  • macOS 11.6.2
  • Python 3.10.1
  • celery 5.2.3

登録されないパターン

まずはタスクが登録されないパターンです
これで celery を起動しても作成した add, multi はタスクとして登録されません

もしこの状態でエンキューされると処理するタスクがありませんというエラーになります

  • vim tasks/celery.py
from celery import Celery

app = Celery('tasks', backend='redis://localhost', broker='redis://localhost')
  • vim tasks/calc.py
from .celery import app

@app.task
def add(x, y):
    return x + y

@app.task
def multi(x, y):
    return x * y
  • pipenv run celery -A tasks.celery.app worker --loglevel=INFO

登録されるように import する

ではどうすれば別ディレクトリに定義したタスクが登録されるかというと celery 実行時にタスクを import してあげます

またこの import の際には循環参照に気をつけなければいけません

一応これでも動きますがすぐに循環参照しそうなコードになっています

  • vim tasks/celery.py
from celery import Celery
# from tasks.calc import add, multi <- ここだと循環参照になる

app = Celery('tasks', backend='redis://localhost', broker='redis://localhost')

from tasks.calc import add, multi
  • vim tasks/calc.py
from .celery import app

@app.task
def add(x, y):
    return x + y

@app.task
def multi(x, y):
    return x * y
  • pipenv run celery -A tasks.celery.app worker --loglevel=INFO

タスクをロードするモジュールを別で作成するパターン

celery オブジェクト管理するモジュールとタスクをロードするモジュールを分けます
celery オブジェクトを複数のモジュールで持つことになりますがこれでも可能です

celery 実行時に loader にある celery オブジェクト (tasks.loader.app ) を指定します

こちらのパターンのほうが循環参照を避けられるかなと思います

  • vim tasks/celery.py
from celery import Celery

app = Celery('tasks', backend='redis://localhost', broker='redis://localhost')
  • vim tasks/loader.py
from tasks.calc import add, multi
from celery import Celery

app = Celery('tasks', backend='redis://localhost', broker='redis://localhost')
  • vim tasks/calc.py
from .celery import app

@app.task
def add(x, y):
    return x + y

@app.task
def multi(x, y):
    return x * y
  • pipenv run celery -A tasks.loader.app worker --loglevel=INFO

動作確認

上記すべて以下のスクリプトで動作確認できます
一番上のパターンはタスクが登録されていないのでエラーになります

  • vim main.py
from celery import chain
from tasks.calc import add, multi

tasks = chain(
    add.s(1, 2),
    multi.s(10)).apply_async()

print(tasks.get())

最後に

更にこれに flask などの Webフレームワークや SQLAlchemy などの ORM が加わってくると app コンテキストが必要になってきます

モジュールを分ける場合にはそれらが循環参照しないように気をつける必要があるので大変です

2022年1月21日金曜日

Celery でタスクが登録されないときに確認すること

Celery でタスクが登録されないときに確認すること

概要

celery を実行した際にタスクが登録されない場合にチェックする点を紹介します

環境

  • macOS 11.6.2
  • Python 3.10.1
  • celery 5.2.3

タスクがちゃんとどこかで import されているか

celery -A app.tasks.celery などで実行した場合に app.tasks や app.tasks が自動で読み込むモジュール (例えば app/__init__.py など) でちゃんとタスクとして定義したモジュールが import されている確認しましょう

実行したタスクモジュールを読み込んだ際にそのタスクどこかで import されいないと celery はタスクとして登録してくれません

もしくは app.tasks 内で定義した celery オブジェクトを使って @celery.task() アノテーションでタスク登録しても OK です

クラスの場合は register_task をする

クラスとしてタスクを定義した場合は Celery.register_task() で必ずクラスを登録しましょう

もしファイルを分ける場合はタスクはクラスとして定義したほうが管理の面ではいいと思います

2022年1月20日木曜日

3Dプリンタはスライサでヘッドの速度を調整するのが一番大事

3Dプリンタはスライサでヘッドの速度を調整するのが一番大事

概要

過去にいろいろとスライサの設定を紹介してきました
最近の結論としてはヘッド速度さえ設定方法をマスタしていれば大抵のプリントはうまくいくような気がしています

環境

  • macOS 11.6.2
  • QIDI-Print 5.3.2
  • QIDI Technology X-Smart

設定可能なヘッドの速度

ヘッドの速度は一定ではなく各部位ごとに設定できます
QIDI-Tech の場合は 6 箇所のヘッド速度をそれぞれ調整できます

  • インフィル (内部の密度の部分の速度)
  • アウターウォール (外壁部分の速度)
  • インナーウォール (内壁部分の速度)
  • トップ (上部の速度)
  • ボトム (下部の速度)
  • サポート (サポートを使う場合の速度)

特に大事なのはボトムとサポート

ボトムの速度は遅めにしましょう
理由は一番下のレイヤーを印刷するのはボトムの速度で印刷することになりこの速度が速いと反り返りの原因にもなります
ボトムの速度は可能な限りゆっくりにすることで土台がしっかり密着するので結果的にきれいに印刷することができます

サポートを使う場合にはサポートの速度もゆっくりにしたほうが良いと思います
ただサポートを使う場合はヘッドがフィラメントを出さないときの「移動速度」も気にしたほうがいいです
移動速度が速すぎるとサポートが崩れる場合があるのでサポートを多く使う場合は移動速度も少し遅めにしたほうが良いです

比較的ヘッドの速度が速くても良い箇所

  • インフィル (内部の密度の部分の速度)
  • アウターウォール (外壁部分の速度)
  • インナーウォール (内壁部分の速度)
  • トップ (上部の速度)

は比較的速くても OK です
50 から 60 mm/s でもきれいに印刷できると思います
ただ複雑な形を印刷する場合はここもゆっくりにしたほうがいいでしょう

真四角な箱などはガンガン速度を上げても問題ないと思います

最後に

もしかすると更に高機能なスライサはレイヤーごとに速度を調整することができるかもしれません

レイヤーごとにヘッドの速度を調整できるとなると更にきれいに印刷することができるかなと思います

2022年1月19日水曜日

Ubuntu18.04 に xmrig をインストールする

Ubuntu18.04 に xmrig をインストールする

概要

docker 版はこちら
RaspberryPi4 版はこちら

環境

  • macOS 11.6.2
  • VirtualBox 6.1.22r144080
  • Ubuntu 18.04
  • xmrig 6.16.2

Vagrantfile

リソースの値や IP は適宜変更してください

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
  config.vm.network "private_network", ip: "192.168.100.10"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 4096
    vb.cpus = 2
  end
end
  • vagrant up
  • vagrant ssh

xmrig インストール

ここから xmrig-6.16.2-bionic-x64.tar.gz をダウンロードしてバイナリを配置してインストールは完了になります

  • wget 'https://github.com/xmrig/xmrig/releases/download/v6.16.2/xmrig-6.16.2-bionic-x64.tar.gz'
  • tar zvxf xmrig-6.16.2-bionic-x64.tar.gz
  • sudo cp xmrig-6.16.2/xmrig /usr/local/bin/
  • xmrig --version

systemd 化

  • sudo vim /lib/systemd/system/xmrig.service
[Unit]
Description=cpu-monero-miner
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/local/bin/xmrig --url=pool.supportxmr.com:5555 --donate-level=1 --user=44pxxx --pass=ubuntu -k --coin=monero --log-file="/var/log/xmrig.log" --cpu-max-threads-hint 100

[Install]
WantedBy=multi-user.target
  • sudo systemctl daemon-reload
  • sudo systemctl enable xmrig

HugePageの有効化

  • sudo bash -c "echo vm.nr_hugepages=1280 >> /etc/sysctl.conf"

動作確認

  • sudo reboot -h now

で xmrig が起動していれば OK です

  • tail -f /var/log/xmrig.log

でエラーがないかも確認しましょう

最後に

Mac だと「msr kernel module is not available」になるので VM Ubuntu 上で動作させれば MSR カーネルも使ってくれます

2022年1月18日火曜日

iPad mini 2 を修理依頼しました

iPad mini 2 を修理依頼しました

概要

iPad mini 2 の液晶が壊れたので修理に出してみました
本当は自分で修理しようと思ったのですが手間と値段を考慮して修理に出すことにしました

依頼先

iPhone修理救急便にお願いすることにしました

持ち込みしかできないので近くの店舗に持っていきました

修理費用価格

ガラスパネル+液晶の修理で 13,800 円になります
先に 5,500 円を部品代として先に支払う必要があります

Amazon でガラスパネルと液晶を購入すると 8,000 - 10,000円ほどかかります
自分で修理するほうが安いですが iPad mini の修理は全面のガラスパネルを外すのがかなり大変なので修理を依頼することにしました

修理から到着まで

  • 2022/01/09 修理依頼
  • 2022/01/16 電話で修理完了の連絡
  • 2022/01/17 取りに行く

一週間かかりました
iPad の場合は工場に送る必要があるようで即日修理はできませんでした

また受け取りに行く必要もあります

依頼時の注意点

連絡先の記入などが必要になるほか動作確認のために画面ロックのパスコードも記入することになります

実は修理よりも中古購入のほうが安い

iPad mini 2 は現在は中古でしか出回っていませんがじゃんぱらなどを見ると 6000 - 8000 円で購入できます

どうしても修理しなければいけない理由 (データを取り出したい、まだまだ新品なので使いたいなど) がない場合は壊れたものをジャンクとして売って中古を購入するという手もありかなと思います

3ヶ月間の保証あり

もしも再度故障した場合は3ヶ月間であれば無料で再修理してくれるそうです
このあたりは嬉しい点かもしれません

2022年1月17日月曜日

楽天銀行の開設までにかかった時間を紹介

楽天銀行の開設までにかかった時間を紹介

概要

楽天銀行を開設するまでにかかった時間と開設方法を紹介します

時系列

12 日かかりました
年末年始だったので少し時間がかかったのかもしれません

  • 2022/01/04 口座開設申し込み
  • 2022/01/04 本人確認書類の送付
  • 2022/01/05 STEP2 本人確認書類受領ステータスになる
  • 2022/01/06 STEP3 確認中ステータスになる
  • 2022/01/11 STEP4 口座開設完了のステータスになる
  • 2022/01/12 Thank you レターが送付される連絡がメールで来る
  • 2022/01/16 Thank you レター到着
  • 2022/01/16 パソコンで初期設定 (ID/パスワード、暗証番号設定) を実施
  • 2022/01/16 口座が使えるようになる

本人確認書類について

郵送とアプリを使った方法の二種類があります
郵送だと時間がかかるのと面倒なのでアプリを使った方法にしました

アプリの場合は本人確認書類二点が必要になります
自分は「マイナンバーカード」と「運転免許証」を使いました
両方とも表面と裏面の撮影が必要になります

子供用の口座の場合は

本人確認書類+代理申請する親の本人確認用の書類が必要になります

子供用の本人確認書類はマイナンバーカードや保険証を使いましょう

進捗の確認方法について

申込時にメールが来るのでそのメールに記載の URL と登録番号/アクセスキーを使って確認できます

が結局 Thank you レターが来るまでログインはできないので進捗確認せずにレターの到着を待っていれば OK です

子供口座の開設ボーナスをもらうには

執筆期間中は家族口座を開設すると 1000円ボーナスがもらえるようです
条件は口座開設後に振り込みを行うことです
詳細はこちらのページを御覧ください

2022年1月14日金曜日

blender でオブジェクトを Python スクリプトにエクスポートする方法

blender でオブジェクトを Python スクリプトにエクスポートする方法

概要

blender で作成したオブジェクトを Python スクリプト化する方法とスクリプトからオブジェクトにインポートする方法を紹介します

環境

  • macOS 11.6.2
  • blender 2.93.1
  • Python 3.9.9

Python スクリプトにエクスポート

import bpy

ob = bpy.context.object
if ob and ob.type == "MESH":
    mesh = ob.data
    me = ob.data

    faces = ",\n         ".join(f'{p.vertices[:]}' for p in me.polygons)     
    verts = ",\n         ".join(f"{v.co[:]}"  for v in me.vertices)

    with open('import.py', 'w') as f:
        f.write(f"""import bpy

verts = ({verts})

faces = ({faces})

scene = bpy.context.scene
me = bpy.data.meshes.new("{me.name}")
me.from_pydata(verts, [], faces)
ob = bpy.data.objects.new("{ob.name}", me)
scene.collection.objects.link(ob)""")
  • blender -b /path/to/sample.blend -P export.py

blender にインポート

  • Text Editor を開く
  • Open
  • import.py を選択
  • 実行

最後に

オブジェクトが複雑だとスクリプト化した際に完全に再現できないかもしれません

おそらくスクリプトを修正すれば対応はできるはずです

参考サイト

2022年1月13日木曜日

MetaMask のインストール方法

MetaMask のインストール方法

概要

イーサリアムやビットコインのウォレットとして使えます
特に Web に対応しているイーサリアムのサービス (OpenSea) などを使う場合には必須のウォレットになります

環境

  • macOS 11.6.2
  • Chrome 96.0.4664.110

エクステンションのインストール

ここからインストールします

基本はこれで終わりです

ウォレットの新規作成

ウォレットの作成から画面の指示に従って同意やウォレットパスワードの設定をするだけです

リカバリフレーズは忘れずに保管しておきましょう

イーサリアムのウォレットアドレスの確認方法

イーサリアムのウォレットの作成が完了する以下のような画面になります

画面上部のコピーボタンを押すとウォレットアドレスがコピーできるのでこれを使ってマイニングや送金などを行います

ウォレットの再表示

Chrome の拡張一覧に metamask のキツネのボタンがあるので押すだけです

しばらくするとポップアップでウォレットの情報が確認できます
そこから「ビューの展開」などを行うとブラウザのタブで表示することができます

最後に

これで OpenSea などのブラウザベースの NFT マーケットプレイスなどが使えるようになります

参考サイト

2022年1月12日水曜日

Intel Mac だと ethminer は動作しなかった

Intel Mac だと ethminer は動作しなかった

概要

Intel Mac ではどうやら ethminer は動作しないようです

https://github.com/ethereum-mining/ethminer/issues/1839

一応 ethminer のインストール方法や使い方、コマンドなどは他のプラットフォームでも使えそうなので残しておきます

環境

  • macOS 11.6.2
  • ethminer 0.18.0

インストール

ここから darwin 版をダウンロードし解凍します

あとは PATH の通ってる場所に配置しましょう

  • tar zvxf ethminer-0.18.0-cuda-9-darwin-x86_64.tar.gz
  • cp bin/ethminer /usr/local/bin
% ethminer --version

ethminer 0.18.0
Build: darwin/release/appleclang

ウォレットの取得

なんでも OK です
自分は Enjin wallet をインストールしていたのでそこからウォレットアドレスを取得しました

プールの選択

https://ethermine.org/ このあたりが無難です
他にもいろいろとあります

起動

  • ethminer -G -P stratum1+ssl://your_wallet_address.machine1@asia1.ethermine.org:5555

-G は OpenCL を使うオプションで -P はプールのアドレスをプロトコルやウォレットと一緒に指定するオプションです

エラー

Mac の場合は以下のエラーになります

ethminer 0.18.0
Build: darwin/release/appleclang

Unrecognized platform Apple
Error: No usable mining devices found

M1Mac ならいける?

ethminer から fork した ethminer-m1 を使えば動作するようです

https://github.com/gyf304/ethminer-m1

ハッシュレートもまぁまぁよさそうです

CPU を使ったマイニングをすれば良さそう?

その場合は geth を使えばいいようです

https://github.com/ethereum-mining/ethminer#can-i-cpu-mine

2022年1月11日火曜日

Mac でイーサリアムの開発環境構築

Mac でイーサリアムの開発環境構築

概要

Mac でイーサリアム API を使った開発ができる環境を構築してみました
今回はイーサリアムの golang 実装である geth を使います

マイニングもできますがあくまでもローカルに構築した環境なので実際に報酬などは受け取れません

環境

  • macOS 11.6.2
  • geth 1.10.15-stable

geth のインストール

  • brew install ethereum

geth ではなく ethereum という Formulae をインストールしましょう

genesis ファイルの作成

  • mkdir eth_private_net
  • vim eth_private_net/myGenesis.json
{
  "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}

初期化

  • geth --datadir ./eth_private_net init ./eth_private_net/myGenesis.json
INFO [01-07|11:25:56.104] Maximum peer count                       ETH=50 LES=0 total=50
INFO [01-07|11:25:56.123] Set global gas cap                       cap=50,000,000
INFO [01-07|11:25:56.124] Allocated cache and file handles         database=/path/to/eth_private_net/geth/chaindata cache=16.00MiB handles=16
INFO [01-07|11:25:56.166] Writing custom genesis block
INFO [01-07|11:25:56.174] Persisted trie from memory database      nodes=0 size=0.00B time="357.389µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [01-07|11:25:56.177] Successfully wrote genesis state         database=chaindata hash=7b2e8b..7e0432
INFO [01-07|11:25:56.178] Allocated cache and file handles         database=/path/to/eth_private_net/geth/lightchaindata cache=16.00MiB handles=16
INFO [01-07|11:25:56.215] Writing custom genesis block
INFO [01-07|11:25:56.215] Persisted trie from memory database      nodes=0 size=0.00B time="5.795µs"   gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [01-07|11:25:56.217] Successfully wrote genesis state         database=lightchaindata hash=7b2e8b..7e0432

geth ノード起動

  • geth --networkid “15” --nodiscover --datadir ./eth_private_net console

30303 で起動しています

動作確認

コンソールでイーサリアム API をコールできるコマンドを実行できます

> eth.getBlock(0)
{
  difficulty: 16384,
  extraData: "0x",
  gasLimit: 134217728,
  gasUsed: 0,
  hash: "0x7b2e8be699df0d329cc74a99271ff7720e2875cd2c4dd0b419ec60d1fe7e0432",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x3333333333333333333333333333333333333333",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 16384,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

それ以外にもマイニング用の API や送金の API も試せます

  • admin.nodeInfo
  • net.peerCount
  • eth.accounts

最後に

今回は開発環境を構築してみました
イーサリアムを使ったブロックチェーンアプリなどを構築する場合にはこんな感じで開発用の API を構築するようです

マイニングだけしたい場合には ethminer というツールがありますが GPU (opencl or cuda) が必要になり GPU がない環境でのマイニングは geth を使うことになります

参考サイト