exit('IN');

本を読んで得た学びとか

Rustのミニチュートリアルをやる(非公式マスコットの🦀を出す)

www.rust-lang.org

こちらのめちゃくちゃ短いチュートリアルをやってみます😺

プロジェクトの作成

cargo new hello-worldでプロジェクトを作成。

directory

実行

cargo runで実行。

コンパイルされて、Hello, world!が出力されました。

compiled

依存関係の追加

Cargo.tomlに依存関係を追加します。

[dependencies]
ferris-says = "0.3.1"
cargo build
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s

🦀を出す

use ferris_says::say;
use std::io::{stdout, BufWriter};

fn main() {
    // 標準出力を取得する
    let stdout = stdout();
    // 表示するメッセージを作成する
    let message = String::from("Hello fellow Rustaceans!");
    // メッセージの文字数を取得する
    let width = message.chars().count();

    // 標準出力をロックして、BufWriterでラップする
    // ロック: 他のスレッドからアクセスできないようにする
    // BufWriter: バッファリングして、データを効率的に扱えるようにする
    let mut writer = BufWriter::new(stdout.lock());
    say(&message, width, &mut writer).unwrap();
}

cargo runで実行する

< Hello fellow Rustaceans! >
 --------------------------
        \
         \
            _~^~^~_
        \) /  o o  \ (/
          '_   -   _'
          / '-----' \

Rustちょっと触ってみた

Hello Worldしただけの記事です🙇

インストール

公式にある通り、↓を実行してインストール

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

途中、↓と聞かれたのでとりあえずスタンダードインストールを選択。

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation

インストールが完了したら、一旦シェルを閉じて再度開き直す。

% rustc --version
rustc 1.78.0 (9b00956e5 2024-04-29)

インストールされてますね!

実行

main.rsというファイルを作成します。

fn main() {
    println!("Hello, World!");
}

コンパイル、実行します。

rustc main.rs
./main 
Hello, World!

ちゃんと実行されてますね。

ITエンジニアとして関われそうな不整脈の研究

ITエンジニアとして関われそうな不整脈の研究について調べてみました🫀

なんで調べたのか

昨年の健康診断で、ブルガダ症候群と言われてしまいました😿

ただ、僕の場合はほとんどリスクは無さそうなので、あまり心配せずに生きています。 とはいえ、なんとかできないかなと。

エンジニアの分野で原因の解明や治療方法の向上など、貢献できないかなと思い調べてみました。

不整脈のシミュレーション

スーパーコンピュータで不整脈のシミュレーションをしている方々がおられるそうです👀

心臓不整脈シミュレーション~不整脈メカニズムの解明を目指して~

スパコンってなんの言語使ってるんだろう…と調べてみましたがC, C++, Java, Fortran, Pascal, Pythonが使われていそうです。

計算環境について

プログラミング言語  C, C++, Java, Fortran, Pascal, Python

http://nkl.cc.u-tokyo.ac.jp/16n/Introduction.pdf スライド39

PHPしか触ってない人間なので、PythonJavaくらいを触ってみるといいかもしれませんね…。

データ分析?

Brugada(ブルガダ)症候群のなかには突然死の家族歴を有する方もあり、何らかの遺伝的な異常が関係していると考えられます。

https://www.ncvc.go.jp/hospital/section/cvm/arrhythmia/brugada/

全然詳しくないのでイメージすらできませんが、データ分析とかで原因となる遺伝子の究明とかできるんですかね…?

おわり

ITの領域の人間でも何かしらできることはありそうですね🧐

とはいえ、医学分野の知識はもちろん、シミュレーションやデータ分析等の領域のスキルを持ち合わせていないので、かなり勉強が必要そうですね。

知識や技術のなさはめちゃくちゃやればなんとかなるのかもしれません。 ただ、実際猛勉強してまでこちらの領域に進みたいかと問われると、どうなんでしょうか…?

貢献したいだけなら、お金を稼いで研究している方々へ寄付するといったこともできます。 自分がどうしたいかは、引き続き色々調べて・話を聞いてみるのが良さそうです😺

Apache JMeterで画像とBodyをPOSTする

JMeterAPIに画像とBodyをPOSTしようとしたら、画像しかアップロードされませんでした😿

現象

  • Apache JMerter 5.6.3
  • Laravel 11.6.0
Route::post('/', function (Request $request) {
    Log::info("リクエスト", [$request->all()]);
    $request->image->store('image');
    return null;
});

JMeterからのリクエス

ログ出力結果 [2024-05-03 02:33:03] local.INFO: リクエスト [{"image":{"Illuminate\\Http\\UploadedFile":"/tmp/phpqIQcRI"}}]

画像は送られてきているし、アプリケーションに保存もできているけど、Body Dataに設定したidが出力されない… 🤔

解決策

apollovさんが解決策を提示してくださってました🙏 stackoverflow.com

Bodyに記述するのではなく、ParametersのところにJSONとして設定すればいいようです。

idも画像もどっちもリクエストできました😺

[2024-05-03 03:08:28] local.INFO: リクエスト [{"id":"1","image":{"Illuminate\\Http\\UploadedFile":"/tmp/phpjPgv1Y"}}]

JMeter側のリクエストの仕様の問題なんでしょうかね…?

Postmanだとこんなことしなくてもリクエストできてたので。

Apache Jmeter触ってみた

負荷試験Jmeterを触ることになったので、事前にちょっとさわっておきます😺

インストール・起動

↓からバイナリをインストールします。 jmeter.apache.org

./jmeterで起動!

Jmeter

試験対象のサーバー構築

Laravel Sailでサクッと試験対象のサーバーを構築します。

Laravel Sail - Laravel 11.x - The PHP Framework For Web Artisans

laravel

テスト作成

3回リクエストしてみます。

ちゃんと3回りクエストされて、ちゃんと返ってきてますね!(本当はGUIで実行するものではなさそうですが。)

結果を出力する

今度はコマンドから実行してみます。 jmeter -n -t test.jmx -l result.jtl -e -o result

HTMLでも結果を確認できるようです。

【CodeWars】1/31 ~ 2/6に解いた問題たち

記事の内容

1/31 ~ 2/6にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。

Alphabet war

www.codewars.com

コード

function alphabetWar(fight)
{
  const left = {
    w: 4,
    p: 3,
    b: 2,
    s: 1
  }
  
  const right = {
    m: 4,
    q: 3,
    d: 2,
    z: 1
  }
  
  const alphabetArray = fight.split('');
  let leftValue = 0;
  let rightValue = 0;
  
  alphabetArray.forEach(alphabet => {
    if (alphabet in left) {
      leftValue += left[alphabet];
    } else if (alphabet in right) {
      rightValue += right[alphabet];
    }  
  })
  
  if (leftValue === rightValue) {
    return "Let's fight again!"; 
  } else if (leftValue > rightValue) {
    return "Left side wins!";
  } else {
    return "Right side wins!";
  }
}

おそらくかなりひどい。
他の人の解答を見ると、map()やreduce()などを使うと短く書けるみたい。

Convert a Boolean to a String

問題の概要 booleanを文字列にして返却する。

www.codewars.com

コード

function booleanToString(b){
  return b.toString();
}

booleanにtoStringが使えるとは思わなかった。
Object.prototype.toString()なので、何にでも使えるのか。

My head is at the wrong end!

問題の概要 配列の先頭と末尾を入れ替えた配列を返却する。

www.codewars.com

コード

function fixTheMeerkat(arr) {
  return arr.reverse();
}

Do I get a bonus?

問題の概要 bool値によって給料の額を10倍にして返却。

www.codewars.com

コード

const bonusTime = (salary, bonus) => bonus === true ? `£${salary * 10}` : `£${salary}`;

FIXME: Get Full Name

問題の概要 クラスのメソッドを修正して適切な出力がされるようにする。

www.codewars.com

コード(1回目)

class Dinglemouse{
  
  
  constructor( firstName, lastName){
    this.first = firstName;
    this.last = lastName;
  }
  
  getFullName(){
    if (!this.first && !this.last) {
      return '';
    } else if (!this.first && this.last) {
      return this.last;
    } else if (this.first && !this.last) {
      return this.first;
    } else {
      return `${this.first} ${this.last}`;
    }
    
  }
  
}

引数から渡ってきた2つの変数名に悩んだ末に、firstとlastというよくわからない名前をつけてしまった。
条件分岐は書きたくなかったが、上手いやり方を思いつかなかったので仕方なく。

コード(2回目)

class Dinglemouse{

  constructor( firstName, lastName ){
    this._firstName = firstName;
    this._lastName = lastName;
  }
  
  getFullName(){
    return `${this._firstName} ${this._lastName}`.trim();
  }
  
}

他の人の解答を見てやり直し。
trimは思いつかなかった。

Number to digit tiers

問題の概要 n桁の数値を1~n桁目までそれぞれ区切って配列に格納する。

www.codewars.com

コード

const createArrayOfTiers = num => {
  const numString = num.toString();
  let result = [];
  
  for (let i = 1; i <= numString.length; i++) {
    result.push(numString.substr(0, i));
  }
  
  return result;
}

https://www.codewars.com/kata/586bca7fa44cfc833e00005c

【CodeWars】1/24 ~ 1/30に解いた問題たち

記事の内容

1/24 ~ 1/30にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。

get character from ASCII Value

問題の概要 受け取った数字をASCIIでの値に変換する。

www.codewars.com

コード

function getChar(c) {
  return String.fromCharCode(c)
}

Can we divide it?

問題の概要 変数numberが変数a, bでそれぞれ割り切れるかどうか。

www.codewars.com

コード

function isDivideBy(number, a, b) {
  return number % a === 0 && number  % b === 0 ? true : false;
}

今回はa, b2つと決まっていたが、何個あるかわからない場合はevery()とかを使う感じかな。

Limit string length - 1

問題の概要 文字列の指定された位置から「…」に置き換える。

www.codewars.com

コード

function solution(string,limit){
  
  if (string.length <= limit) {
    return string;
  }
  
  let result = string.substr(0, limit);
  return result + "...";
}

Love vs friendship

問題の概要

コード

1回目

function wordsToMarks(string){
  const alphabets = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8,
    i: 9,
    j: 10,
    k: 11,
    l: 12,
    m: 13,
    n: 14,
    o: 15,
    p: 16,
    q: 17,
    r: 18,
    s: 19,
    t: 20,
    u: 21,
    v: 22,
    w: 23,
    x: 24,
    y: 25,
    z: 26
  }
  
  const charArray = string.split('');
  let stringValue = 0;
  
  charArray.forEach(char => {
    stringValue += alphabets[char];
  })
  
  return stringValue;
}

特に何も考えずに実装。 ひどいことになった。 わかりやすいかもしれないけど…。

2回目

function wordsToMarks(string) {
  let stringValue = 0;
  for (let i = 0; i < string.length; i++)
    stringValue += string.charCodeAt(i) - 96;
  return stringValue;
}

他の人がString.prototype.charCodeAt()を使っていたので、真似てみた。
周りが文字コードを知っているならこれを使ってもいいかもしれない。

Incorrect division method

問題の概要 割り算の答えが返ってくるようにコードを修正する。(コメントアウトの部分)

www.codewars.com

コード

// const solve = (x, y) => x // y;

const solve = function(x, y) {
  return x / y;
}

問題が簡単だったので、下に関数式を書いてみた。

[Code Golf] Return Odd No Matter What

問題の概要 12文字以下で処理を書く。(関数の名前は除く)

www.codewars.com

コード

const alwaysOdd=n=>n%2?n:n-1

Averages of numbers

問題の概要

配列の隣り合う要素の平均を配列で返す。

www.codewars.com

コード

const averages = numbers => {
  
  let result = [];
  
  if (numbers === null) {
    return result;
  }
  
  for (let i = 0; i < numbers.length; i++) {
    if (i !== numbers.length -1) {
      result.push((numbers[i] + numbers[i + 1]) / 2);
    }
  }
  
  return result;
}

空の配列のlengthプロパティにアクセスしようとすると、エラーが返ってくるのはあまり納得が行かない。
0が返ってきたらいいのに。