chiaでSSDやHDDを使ってマイニングをする方法

2021/05/14追記 取引開始したので下の記事にて実際の効率を紹介しています。



 今日(2021/04/20)、Twitterでバズっていてchiaの存在を知りました。これは新しい仮想通貨で、2021/2/9にでき、2021/3/19にマイニングが始まり、2021/5/3から取引が始まる仮想通貨と、記事作成時点では取引が始まっていない通貨になっています。
 また、現時点で謎が多いので間違っていることを言っていたらごめんなさい。

 この通貨の特徴としてSSDやHDDでマイニングできるという点が挙げられます。
 マイニング効率の計算の記事を書きました!(2021/4/28)
 (https://www.chisatofu.com/archives/27067481.html)



 早速マイニングを始める方法ですが、公式サイト(https://www.chia.net/)に行き、紺色の部分の一番下にある"Download 1.0.5 for Windows or MacOS."の使っている方をクリックするとインストーラがダウンロードできます。
 インストーラがダウンロードできたら実行します。この後、管理者権限が要求されたりファイアウォールの通知が来たりしますが全部許可してください。インストールが始まると↓のようなウィンドウが出てきます。
スクリーンショット 2021-04-20 194728

 インストールが終わると↓の画面が出てくるので、一番上のボタンを押します。この画面から右上の言語設定で日本語にできます。
スクリーンショット 2021-04-20 194805

  しばらく待つと↓のような画面になるので"次へ"を押します。
スクリーンショット 2021-04-20 194820

 そうしたら↓のような画面が出てくるので保存しておきます。

Inkedスクリーンショット 2021-04-20 201141_LI

 "次へ"をクリックすると↓のような画面になり、やっとマイナーの画面が出てきます。
スクリーンショット 2021-04-20 201518

 そうしたら使いたいドライブに適当なファイル(今回は"chia")を作り、これを"畑"->"耕地ディレクトリを追加"->"耕地ディレクトリを追加"で選択します。
スクリーンショット 2021-04-20 223330

 そうしたら"畑"->"耕地を追加"を押し、↓のように設定します。(これがデフォルトです。)
 この画面ですが、上から
  • 一時ファイル容量(最終ディレクトリ容量)
  • 同時に実行するマイニングの数?
  • 一時ファイルのディレクトリ
  • 最終ディレクトリ
になっていると思います。間違っていたらごめんなさい。また、一番上で設定した容量を下二つが満たしていないとダメなんだと思います。
スクリーンショット 2021-04-20 223406

 これを設定し始めると↓のように耕地が耕されていきます。
スクリーンショット 2021-04-20 224503

 また、"フルノード"->"ノードの状態"->"状態"の同期中の横の数字の割合がだんだん増えていきます。
 ?にカーソルを合わせるとブロックチェーンの先端までのノードの数らしく、これを"ダウンロードしているとき"="同期中"ということだったのでダウンロードが終わるまでマイニングが始まらないと思っていたのですが、普通に%がたまっていっているので謎です。
スクリーンショット 2021-04-20 220143


 そんなこんなでマイニングの設定はこれで終わりです。
 今回の記事はここでおしまいになりますが、マイニングはPCに負荷をかけて行うのであくまで自己責任でお願いします。またマイニングには税金もかかるので、それにも気を付けてください。


2021/4/24追記
 このマイニングは、SSDやHDDのストレージ容量と書き込み速度が重要なので、RAIDを組めば効率が上がるはずです。自分はやったことないですが、やるなら↓の機材などを使ってM.2のRAIDやHDDのRAIDを作ってみるといいかもしれません。(だいぶお金はかかりますけど...)

 この二つの組み合わせでRAIDが組めます。最も効率がいい構成のはずです。

 この二つの組み合わせでもRAIDが組め、HDDのRAIDとなるので、企業などのサーバーなどで使われている構成と同じようなものになります。

 おそらくChiaのマイニングセンターなどでも、同様に大量のHDDやSSDをRAIDやAHCIにして運用しているはずです。



2021/4/21追記
 YouTubeにも投稿しました。

Arduino+MPU6050で複数のジャイロを使う

 Arduinoで複数のMPU6050を同時に使う方法です。

 今回はMPU6050のAD0をいじることでアドレスが変わることを利用しています。(デフォルトではプルダウンされています。)
 ちなみに今回はAmazonで売っている


を使用しました。
blog_ブレッドボード
 まず、このように配線します。VCC,GND,SDA,SCLをそれぞれ共通の5V,GND,A4,A5に接続し、AD0を別々のOUTPUTに接続します。

 そしてそれぞれのMPU6050のAD0をArduinoで操作することで、能動的にMPU6050のアドレスを変えて指定したMPU6050だけを使うことができます。

 今回使用したコードは↓に置いておきます。このコードではx,y軸しかデータを取っていませんが、2*4個分のデータが表示されると思います。あと、センサー4個分のコードを並べてあるので繰り返し処理にすればだいぶ短くなると思いますし、たぶんいろいろ無駄があるのでそこのところはうまく調節してください。
https://www.dropbox.com/sh/htxasukcpnzrqnb/AACz8B6PDYKe3xmNy4uVLqRma?dl=0

OBS上にバーチャルキーボードを追加した話

今回は、OBS上にバーチャルキーボードを追加しました。
 仕組み的にはPythonでキーボードを監視し、それをPygameで描画しています。描画する際は事前にProcessingで作成した画像を対応したキー分だけ描画しています。

 今回の環境は
  • windows10
  • Python3.7
  • Pygame(ライブラリ)
  • keyboard(ライブラリ)
です。いずれも2021/2/22時点での最新版です。入ってないものがあるときはダウンロードしてください。やり方は、ググるかコメントで聞くかツイッターで自分に聞いてください。

 今回作ったプロジェクトは↓のドロップボックスにおいてあります。多分ダウンロードできるようになっているはずです。
https://www.dropbox.com/sh/cb2nhru6kv4fn9c/AADJLZotR_vEzik_dRKpaCOPa?dl=0

 このファイルの中の"Virtual_keyboard.py"というファイルを実行すると↓のような画面が出てくると思います。
スクリーンショット 2021-02-23 152736

 そうしたらこの画面をOBSのウィンドウキャプチャを行っていい感じにサイズを調節してください。
 ↓に使用例載せてあります。
スクリーンショット 2021-02-23 153958

安価なモーショントラッカーを作ってみた

 VRのあれこれが高いので自分で作りました。秋月とダイソーで合計260円[税込み]しかかかりません。(3Dプリンター,導線等はプライスレスです。)

 原理としては、ボリュームの値をArduinoで読み取ってUnityに送りコネコネするだけです。
 ↓に動かしてみた動画を載せときます。


使用モデル:ユニティちゃん© UTJ/UCL

 思っていたよりちゃんと動いてよかったです。指1本当たり1センサで、しかも薬指はスペースの都合上センサーがついてないんですが、結構まともに動いてくれました。Unityの仕組みもなんとなく勉強になってよかったです。

Unityにユニティちゃんを召還した話





Unityで3Dモデルを動かそうと思ったので、公式で用意してくれているモデルをUnityで使えるようにしてみました。

 動作環境
  • Windows10
  • Unity 2018.4.31f1 Personal
  • Visual Studio Community 2019 16.8.4
  • Arduino1.8.10
  • ユニティちゃん 3Dモデルデータ Version:1.2.1
①ユニティちゃんをダウンロードする
 (https://unity-chan.com/contents/guideline/)ここからモデルをダウンロードしてきます。

②Unityに入れる
 ダウンロードしてきたファイルを"Assets"にドラックアンドドロップします。
 ↓のような画面が出てくるので右下の"Import"を押してください。
スクリーンショット 2021-02-06 134645

③エラーを取り除く
 今回の環境ではそのまま実行するとエラーが出ます。↓の画像のように"Console"にエラーが出てきます。
スクリーンショット 2021-02-06 140035

 これは"Assets\UnityChan\Scripts\AutoBlik.cs(8,23):error CS0234: The type of namespace name 'Policy' does not exist in the namespace 'System.Security' (are you missing an assembly reference?)"と出るはずです。読めばわかる通り"Assets\UnityChan\Scripts\AutoBlik.cs"というファイルの8行目の"Policy"が存在しないという意味です。
 それなので、このエラー文をダブルクリックして出てきたコードの8行目をコメントアウトしてしまいます。ここでコメントアウトしても変わらずに使えます。
スクリーンショット 2021-02-06 141112

④Unityに地面を設置する
 このままユニティちゃんを配置することもできるのですが、床がないため永遠に落ちて行ってしまいます。そのため地面を設置していきます。"HIerarchy"->"Create"->"3D Object"->"Plane"を選択します。そして"Inspector"で設定をしていくのですが、今回は↓のように設定しました。
スクリーンショット 2021-02-06 141714

⑤ユニティちゃんを召還する
 "Assets"->"UnityChan"->"Prefabs"->"for Locomotion"->"Unitychan"を"Hierarchy"にドラッグ&ドロップします。また、このとき初期位置を適当に設定しておきます。

⑥動かしてみる
 最後にカメラの位置を適当にセッティングして実行すると↓のように動かせます。
 操作は右上に出ているように、十字キーで移動、前進中にスペースでジャンプなどです。また、左のUIをクリックすると表情が変わります。

Unityと現実の直方体の角度をリンクさせた話

 今回は↓の動画のように、現実での直方体とUnity上の直方体の動きをリンクさせました。

 動作環境
  • Windows10
  • Unity 2018.4.31f1 Personal
  • Visual Studio Community 2019 16.8.4
  • Arduino1.8.10

手順
①前回の状態を再現する
 今回は、前回(http://blog.livedoor.jp/chisato_tofu/archives/26199124.html)の発展形なので前回の状態を再現できていることを前提とします。

②センサーを作る
 今回用いたセンサーは可変抵抗を直方体のxyz軸に配置し、その値を角度(°)に変換しUnityに送っています。そのため今回は、三軸に可変抵抗を配置する構造をFusion360で設計し3Dプリンタで制作しています。↓の図のようなモデルをFusion360で作り、赤円の場所に可変抵抗を配置します。
a
 これを3Dプリンターで印刷し組み立て配線を行い下のような状態にしました。
IMG_3008

②Arduinoのコードを書く
 前回のコードを発展させる形で3つのデータを送れるようにします。Unity側で","区切りで読み取ることができるため、データの切れ目に","を挿入して送ります。
  1. int val1;
  2. int val2;
  3. int val3;

  4. void setup() {
  5.   Serial.begin(115200) ;
  6. }

  7. void loop() {
  8.   val1 = analogRead(0);
  9.   val2 = analogRead(1);
  10.   val3 = analogRead(2);

  11.   val1 = map(val1, 880, 160, -90, 90);
  12.   val2 = map(val2, 840, 145, 0, -180);
  13.   val3 = map(val3, 873, 176, -90, 90);

  14.   Serial.print(val1);
  15.   Serial.print(",");
  16.   Serial.print(val2);
  17.   Serial.print(",");
  18.   Serial.println(val3);
  19.   delay(50) ;
  20. }
③C#のコードを書く
 シリアル入力を","で区切りそれぞれをcubeの角度に対応させるようなプログラムを書きました。これを"SerialCube"というC#のファイルに格納しています。
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;

  5. public class SerialCube : MonoBehaviour{

  6. public SerialHandler serialHandler;
  7. public Text text;
  8. public GameObject Cube1;

  9. void Start(){
  10. serialHandler.OnDataReceived += OnDataReceived;
  11. }

  12. void Update(){
  13. }

  14. void OnDataReceived(string message){
  15. try{
  16. string[] angles = message.Split(',');
  17. text.text = "x:" + angles[0] + "\n" + "y:" + angles[1] + "\n" + "z:" + angles[2] + "\n"; 

  18. Vector3 angle = new Vector3(float.Parse(angles[1]), float.Parse(angles[0]), float.Parse(angles[2]));
  19. Cube1.transform.rotation = Quaternion.Euler(angle);
  20. }
  21. catch (System.Exception e){
  22. Debug.LogWarning(e.Message);
  23. }
  24. }
  25. }
④C#とCubeの対応
 ③で書いたコードをCubeに対応させていきます。
 まず、前回と同じように"Hierarchy"->"Creare"->"Create Empty"を行い、"SerialCube"という空オブジェクトを作成し、③で書いたコードをドラッグ&ドロップし対応させておきます。
 "Hierarchy"->"Create"->"3D Object"->"Cube"で直方体を作成し、↓の画像のように"inspector"で調整します。今回は上から二項目目の"Rotation"をシリアル通信で変えていきます。
スクリーンショット 2021-02-05 141526
 作成したCubeに③で作ったファイルをドラッグアンドドロップして関連付けを行います。そうしたら↓の画像のように"Inspector"->Serial Cube (Script)の項目を設定します。
スクリーンショット 2021-02-05 142023

④実行する
 Arduinoにプログラムを書き込み実行させると動作します。
スクリーンショット 2021-02-05 142218

無課金でArduinoとUnityでシリアル通信

ArduinoのデータをUnityで使おうとしたときに"Uniduino"という便利なアセットがあるそうです。しかしこのアセットは有料らしいので、今回は無料で実現する方法です。

 動作環境
  • Windows10
  • Unity 2018.4.31f1 Personal
  • Visual Studio Community 2019 16.8.4
  • Arduino1.8.10
です。Unity2019.4.18f1では動作しませんでした。

Arduino側
 普通にSerial.printで出力します。末尾は改行します。
 シリアルのビットレート(115200)とシリアルポート(今回はCOM7)は後で使うので覚えておいてください。
  1. int val1 = analogRead(0);
  2. void setup() {
  3.   Serial.begin(115200);
  4. }

  5. void loop() {
  6.   val1 = analogRead(0);
  7.   Serial.print(val1);
  8.   Serial.println("");
  9.   delay(1000);
  10. }


Unity側
 まず、前提として"File"->"Build Setting"->"Player Settings"->"OtherSettings"->"Configuration"->"Api Compatibility Level*"を".NET 4.x"にします。
b


①表示部の設定
 Hirerarchyで右クリック"UI"->"Text"を選択します。
 作成できたTextをクリックし、見やすいように各パラメータを設定します。今回自分は↓の画像のように設定しました。
スクリーンショット 2021-02-02 221748
②C#の設定
 シリアルを行うためのプログラムをC#で実装します。"Project"->"Assets"で右クリック"Create"->"C# Script"でC#のファイルを作成しそれぞれ"SerialHandler","SerialLight"と名付けます。それぞれのファイルには↓のコードを入れます。
SerialHandler
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO.Ports;
  4. using System.Threading;

  5. public class SerialHandler : MonoBehaviour{
  6. public delegate void SerialDataReceivedEventHandler(string message);
  7. public event SerialDataReceivedEventHandler OnDataReceived;

  8. public string portName = "COM7"; // Arduino IDEで設定したポート
  9. public int baudRate = 115200;  // ビットレート

  10. private SerialPort serialPort_;
  11. private Thread thread_;
  12. private bool isRunning_ = false;

  13. private string message_;
  14. private bool isNewMessageReceived_ = false;

  15. void Awake(){
  16. Open();
  17. }

  18. void Update(){
  19. if (isNewMessageReceived_){
  20. OnDataReceived(message_);
  21. }
  22. isNewMessageReceived_ = false;
  23. }

  24. void OnDestroy(){
  25. Close();
  26. }

  27. private void Open(){
  28. serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
  29. serialPort_.Open();

  30. isRunning_ = true;

  31. thread_ = new Thread(Read);
  32. thread_.Start();
  33. }

  34. private void Close(){
  35. isNewMessageReceived_ = false;
  36. isRunning_ = false;

  37. if (thread_ != null && thread_.IsAlive){
  38. thread_.Join();
  39. }

  40. if (serialPort_ != null && serialPort_.IsOpen){
  41. serialPort_.Close();
  42. serialPort_.Dispose();
  43. }
  44. }

  45. private void Read(){
  46. while (isRunning_ && serialPort_ != null && serialPort_.IsOpen){
  47. try{
  48. message_ = serialPort_.ReadLine();
  49. isNewMessageReceived_ = true;
  50. }
  51. catch (System.Exception e){
  52. Debug.LogWarning(e.Message);
  53. }
  54. }
  55. }

  56. public void Write(string message){
  57. try{
  58. serialPort_.Write(message);
  59. }
  60. catch (System.Exception e){
  61. Debug.LogWarning(e.Message);
  62. }
  63. }
  64. }
SerialLight
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;

  5. public class SerialLight : MonoBehaviour{

  6. public SerialHandler serialHandler;
  7. public Text text;

  8. void Start(){
  9. serialHandler.OnDataReceived += OnDataReceived;
  10. }

  11. void Update(){

  12. }

  13. void OnDataReceived(string message){
  14. try{
  15. text.text = message;
  16. }
  17. catch (System.Exception e){
  18. Debug.LogWarning(e.Message);
  19. }
  20. }
  21. }

③プログラムの結び付け
 前項で書いたコードを実際に動くように結び付けていきます。まず。"SerialHandler"を①で作った"Hierarchy"->"Canvas"->"Text"にドラッグアンドドロップします。
 そうしたら"Text"をクリックし"Inspector"で開きます。そうしたら下の方にあるSerial Light (Script)で↓の画像のように設定します。
a

 また、"Hierarchy"->"Creare"->"Create Empty"を行い、"SerialHandler"という空オブジェクトを作成します。そうしたら、その空オブジェクトに②で作った"SerialHandler.cs"をドラッグアンドドロップをします。


④実行する
 Arduinoに書き込み、Unityのスタートボタンを押すと実行され画面に送られてきた数字が表示されます。

セグウェイドリフトを買った話

 流行に後れること数か月、セグウェイドリフトを買いました。
 自分は特にどこから買うとかいうこだわりはないので、適当に↓のアマゾンチョイスのやつを買いました。きちんと届きさえすればどこで買っても同じ商品なはずです。

 
 ↓のグラフはここで売っているセグウェイドリフトの価格推移なのですが、去年の5月ぐらいから値段が下がってきており、今(2021/1)では1万円ちょっとで買うことができます。スクリーンショット 2021-01-21 144445

 一応乗り方が説明書に書いてますが、”傾いている方向に進む”ぐらいしか有益な情報はないので、習うより慣れろ状態です。一応コツとしては、乗っている人はバランスを取らずにセグウェイに任せ、行きたい方向に倒れるくらいです。
 私含め家族にも乗ってもらったのですが、みんな30分くらい練習すれば↓の動画くらいは乗れるようになりました。


 この動画撮っているスペースが200cm*50cmくらいしかなかったのですが、まあなれればこのくらいのスペースで乗れます。片足立ちとかスクワットとかもできるので、極めれば二人でガンダムシリーズのドムごっこができると思います。

Processingで作るハッカーっぽい画面のまとめ

 今まで書いてきた"ハッカーっぽい画面を作る"のタブのまとめです。これまでの技術を組み合わせると↓のような映像が作れます。


 難しい技術は使っていないのでどうにかできると思います。また、コードを添付しますが自分が分かればいいと思って適当に書いてたので汚いです。ゲーミングPCで動かすことを想定して作ったので、処理が重いです。変数もグローバルで乱立させてしまっているので、わかりにくかったらtwitterかコメントで聞いてください。なるべく丁寧に解説します。

 今回使用したコードはDropBoxに入れておきます。Readmeにも書いてありますが、今回使ったフォントを利用する場合はこちら(https://www.keshikan.net/fonts.html)のサイトのフォントを使用してください。

Processingでグリッチエフェクトを作る

 有名な画面効果にグリッチエフェクトというものがあります。今回はそれをProcessingで描画した図形にかける方法です。

 今回使用したのはPImageという機能で、これによって画像を表示したりそれにエフェクトを足したりすることができます。今回は前回(http://blog.livedoor.jp/chisato_tofu/archives/25967168.html)の7セグマトリクスにエフェクトをかけたいため、Processingの画面をPImageで扱える形に変更する必要があります。そのために今回はget()関数を利用しています。
 get()関数はget(x,y,dx,dy)とすることで、(x,y)から(dx,dy)分の色を取得できます。今回はこれをランダムに決められた値分移動させることで、それっぽいエフェクトにしています。今回は自分の趣味でrandom関数を使用しましたが、noise関数を利用することでより連続的なノイズを作ることができるとおもいます。

 今回作ったエフェクトは↓のようなものです。元の図形は緑色の正方形が連続しているものです。

 以下コードです。get()で取得した範囲は真っ黒のrectで埋めることで、ずらして描画した際の重なりをなくしています。
  1. import java.util.Random;

  2. PImage img;
  3. int[] glitch = new int[4];
  4. Random random = new Random();


  5. void setup() {
  6.   size(1920, 1080);
  7.   img = createImage(width, height, ARGB);
  8.   colorMode(HSB, 360, 255, 255, 255);
  9.   noStroke();
  10. }

  11. void draw() {
  12.   background(0);
  13.   fill(156, 137, 172, 255);
  14.   for (int i=0; i<9; i++) {
  15.     for (int j=0; j<16; j++) {
  16.       if ((i + j) % 2 == 0) {
  17.         rect(120 * j, 120 * i, 120, 120);
  18.       }
  19.     }
  20.   }

  21.   glitch();
  22. }


  23. void glitch() {
  24.   if (random.nextInt(10) >= 9) {
  25.     if (random.nextInt(2) > 0) {
  26.       glitch[0] = random.nextInt(1080);//y
  27.       glitch[1] = random.nextInt(60);//dx
  28.       glitch[2] = random.nextInt(100);//dy
  29.       glitch[3] = random.nextInt(2) * 2 + 1;//n
  30.     } else {
  31.       glitch[0] = 0;
  32.       glitch[1] = 0;
  33.       glitch[2] = 0;
  34.       glitch[3] = 0;
  35.     }
  36.   }

  37.   switch(glitch[3]) {
  38.   case 1:
  39.     img = get(0, glitch[0], width, glitch[2]);
  40.     fill(0, 0, 0);
  41.     rect(0, glitch[0], width, glitch[2]);
  42.     image(img, 30 - glitch[1], glitch[0]);
  43.     if (glitch[1] > 30) {
  44.       image(img, 30 - glitch[1] + width, glitch[0]);
  45.     } else {
  46.       image(img, 30 - glitch[1] - width, glitch[0]);
  47.     }
  48.     break;

  49.   case 3:
  50.     img = get(0, glitch[0], width, glitch[2]);
  51.     fill(0, 0, 0);
  52.     rect(0, glitch[0], width, glitch[2]);
  53.     image(img, 30 - glitch[1], glitch[0]);
  54.     if (glitch[1] > 30) {
  55.       image(img, 30 - glitch[1] + width, glitch[0]);
  56.     } else {
  57.       image(img, 30 - glitch[1] - width, glitch[0]);
  58.     }
  59.     img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  60.     fill(0, 0, 0);
  61.     rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  62.     image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
  63.     if (glitch[1] > 30) {
  64.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
  65.     } else {
  66.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
  67.     }
  68.     img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  69.     fill(0, 0, 0);
  70.     rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  71.     image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
  72.     if (glitch[1] > 30) {
  73.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
  74.     } else {
  75.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
  76.     }
  77.     break;

  78.   case 5:
  79.     img = get(0, glitch[0], width, glitch[2]);
  80.     fill(0, 0, 0);
  81.     rect(0, glitch[0], width, glitch[2]);
  82.     image(img, 30 - glitch[1], glitch[0]);
  83.     if (glitch[1] > 30) {
  84.       image(img, 30 - glitch[1] + width, glitch[0]);
  85.     } else {
  86.       image(img, 30 - glitch[1] - width, glitch[0]);
  87.     }
  88.     img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  89.     fill(0, 0, 0);
  90.     rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  91.     image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
  92.     if (glitch[1] > 30) {
  93.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
  94.     } else {
  95.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
  96.     }
  97.     img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  98.     fill(0, 0, 0);
  99.     rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  100.     image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
  101.     if (glitch[1] > 30) {
  102.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
  103.     } else {
  104.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
  105.     }
  106.     img = get(0, glitch[0] - glitch[2], width, glitch[2]);
  107.     fill(0, 0, 0);
  108.     rect(0, glitch[0] - glitch[2], width, glitch[2]);
  109.     image(img, -30 + glitch[1], glitch[0] - glitch[2]);
  110.     if (glitch[1] > 30) {
  111.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2]);
  112.     } else {
  113.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2]);
  114.     }
  115.     img = get(0, glitch[0] + glitch[2], width, glitch[2]);
  116.     fill(0, 0, 0);
  117.     rect(0, glitch[0] + glitch[2], width, glitch[2]);
  118.     image(img, -30 + glitch[1], glitch[0] + glitch[2]);
  119.     if (glitch[1] > 30) {
  120.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2]);
  121.     } else {
  122.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2]);
  123.     }
  124.     break;
  125.   }
  126. }
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード