HHKBは果たして良いものだったのか

 

HHKBとは静電容量無接点方式の3万円ぐらいするキーボードである。

www.amazon.co.jp

キーボードにしてはやたら高く、今風にギラギラキーボードが光ってるわけでもない。

必要最低限、といった感じのキーボードだ。

macのキーボードと同様にctrlキーが左下ではなく左についていて、ctrl絡みのキーバインドを使用する際になるべくホームポジションから手が離れないようになっている。

打鍵感は軽くもなく重くもない、至って普通の重さだ。

若干深さがある感じだが、これがキーの誤爆も防いでくれてとても助かる。

買ってから3か月が経ったが今のところは不満は全くない。

買ってよかった、と思うのはまだ早い。

不満が無いとは言ってもこれが値段以上の体験を生み出しているかは計りかねる。

これに関してはほんとにこれから使い続けないとわからない。

ただ、シンプルで確かなキーボードだとは思う。買って不快な思いはしなかった。

とても堅実な商品。この堅実さが良さなんだろうな・・・・・・・・・

シンプル、省スペースで機能的に問題の無いキーボードを探しててこれを買ったのでこの要求は完全に満たしている。type-Cで接続できるのも地味に良い。

書いてて思ったんだが非の打ち所がない、というやつでは・・・・?

高かったけど結局あんまり使えずに腐ったもの・・・

mac mini 

値段:13万円ぐらい

普段使いではmacはまず使わない。

コーディングが趣味とかの人は多分使うと思う。

 

Huawei matepad pro + これ用のキーボード

値段:7万5000円ぐらい

めっっっちゃサクサク動く、ハイスペック。

が、GooglePlayが使えないのでほとんどのアプリがインストールできない。

一応AppGalleryとかいうアプリがダウンロードできるプラットフォームがあるが、

今のところ怪しいアプリしかない。

出番なし。

 

logicoolのゲーミングキーボード(クリッキー)

値段:3万ぐらい

 商品自体はめっちゃ良いんだろうけど自分には合わなかった。

地味に右側の矢印キーがある部分が邪魔だった。

キーボードが若干重くてaが入らないときが多々あってかなりストレス

だったので使うのをやめた。

 

~番外編~

 kindle

値段:9000円ぐらい

本当に操作性が悪い。

アカウントが二段階認証だとkindleが使えない。

目には優しい。

多分そこらへんの中華スマホ買って

kindleインストールした方がいいんじゃないかって思った。

 

 

ストリートファイターVをプレーしてから、一か月経って思ったこと

ストリートファイターVをプレーしてからなんと一か月経ってしまいました。

 

最初はどうすれば勝てるかわからないままなんとなく勝ったり負けたりしましたが、

今はなんとなくこうすれば勝てるかな?っていうのを試しながら

繰り返し勝ったり負けたりしています。

 

現在使用しているキャラはラシードになります。Vトリガー、Vスキル両方1です。

崩しの起点になる技、対応する技、牽制になる技、前ジャンプ攻撃、投げをじゃんけんのような形で振って相手と戦っている感じです。

 

まず私が最初に狙っているのは投げです。

投げをしにいくと食らった相手が近づいたら

ガード以外のなにかしらのアクションを起こしてくれるからです。

そこから初めて勝負になる感じです。

 

あとは波動拳系の遠距離技を撃ってくる相手の対処ですね。

自分の牽制の技が届かないところで撃たれてしまうとどうしようもないので、

とりあえず前ジャンプか前歩きで適宜ガードしながら近づくんですが、

相手の牽制技や対応の技で阻止されてしまいます。

 

私はそこで前ジャンプ攻撃や弾抜け技、相手の牽制技、対応する技に勝つ技を振り

有利を取りにいく感じで戦っていました。

あと、飛ばれたら対空攻撃を出すっていうのを

ずっと意識して対戦してたんですが、全然できなくて笑いました。

飛ばれたら無意識にガード方向に入力してしまう癖があるのでどうにかしたいですね。

 

どの技には何が勝つか....みたいなことって調べるか実戦で試すかしないとわからないのでとりあえずネット対戦をやるっていうのはいいのかなって思いました。

 

めっちゃ敷居高そうなゲームだったんですが、意外と面白いですね。

ストV、最高(適当)

ソートと向き合う

そろそろソートについてしっかり向き合わないといけないと思った。

なんか調べてみるといろいろ種類があるらしい。

 

自分が最初に数字のスライスをソートする処理をgolangで書いたものがこちら

 

いわゆるバブルソートというやつ。

一つ後のやつを比較して順番をどんどん入れ替える。

一回も順番が入れ替わらなかったら終わり。

実装がめっちゃ簡単でわかりやすい。

func Sort(slice intint {
    for {
        flag := true
        for i := 0; i < len(slice)-1; i++ {
            if slice[i] > slice[i+1] {
                temp := slice[i]
                slice[i] = slice[i + 1]
                slice[i + 1] = temp
                flag = false
            }
        }
        if flag {
            break
        }
    }
    return slice
}

 

 

今はクイックソートというものが一番早いらしい。つよそう

早速説明を見て実装をする。

func quickSort(slice intint {
    var lowerSlice int
    var equalslice int
    var upperSlice []int
    // スライスの要素数が1か0の時はソートしようが無いのでそのまま返す
    if len(slice) <= 1 {
        return slice
    }

    // 軸要素をランダムに一つ選ぶ
    rand.Seed(time.Now().UnixNano())
    pivot := rand.Intn(len(slice))
    pivotVal := slice[pivot]

    // pivotより大きい、小さい、同じやつを詰める
    for _v := range slice {
        if v > pivotVal {
            upperSlice = append(upperSlice, v)
        }
        if v < pivotVal {
            lowerSlice = append(lowerSlice, v)
        }
        if v == pivotVal {
            equalslice = append(equalslice, v)
        }
    }
    // 大きいやつと小さいやつはまたソートを行う
    lowerSlice = quickSort(lowerSlice)
    upperSlice = quickSort(upperSlice)

    // 小さいやつに同じやつを追加
    for _v := range equalslice {
        lowerSlice = append(lowerSlice, v)
    }
    // 大きいやつを追加
    for _v := range upperSlice {
        lowerSlice = append(lowerSlice, v)
    }
    return lowerSlice
}

 再起関数とかいうやつ初めて使った。

これであってるのか....?

一応動作確認はした。

 

試しに時間を計測してみた。

ランダムな要素が10万個入ったスライスをソートする。

これを3回実行。

 

バブルソート

18.160090秒

17.948176秒

18.061429秒

 

クイックソート

0.450110秒

0.442886秒

0.445114秒

 

速すぎる...

 

 

最近間食で食べているお気に入りのお菓子

しょっぱい系

ペヤングソースカツスナック

 一つ一つがサックサクで噛み応えもある

味は完全に駄菓子のソー〇カツ

 

じゃがりこ

 安定、噛み応えがあっていい

ポテチとかより断然こっち派

 

おやつカルパス

手軽に肉が食える。最高。 

 

 

 

甘い系

カンデミーナ

麻薬

 

ミニようかん

 くどいぐらいの甘さが欲しいときにたべる。

 

チョコバー

 こういうやつってもっさりしてて飽きるんだけど、

これはチョコチップが入ってて食べてるときのゴリゴリ感がたまらない

今スト5がフリープレイなのでガチ初心者がやってみた結果............

キャラ選び

最初に使えるキャラが16人だった。

とりあえず強いキャラを調べてラシードというキャラを使おうと決めた。

 

コンボ

これもいろいろ調べた。

基本的なコンボがクソムズい。

3、4コンボ決めるのになんでこんな難しいんだ。

 

あとなんか選んだキャラが悪いのか、動きがトリッキーなんだよね。

竜巻みたいの出すんだけど、勝手に上に行っちゃうし。

 

ネット対戦

テンパってまずまともにコンボが入らない。

ほんとになんとなく攻撃してなんとなく攻撃が当たる。

だいたい何かのボタンを連打してる。相手も何かのボタンを連打してる。

そんな状況。

 

体力が少なくなると危機感を覚えてガードし始める。

なんか変な攻撃にあたって負ける、を繰り返してた。

 

ボタン連打してる人

→隙をみつけながら攻撃する

 

なんとなく攻撃しても普通にガードしてくる人

→勝てない

 

感想

俺は弱い。

 

なんか定石みたいなのがありそうなんだけど、それにすらたどり着いて無い感じ。

このゲームが面白いかどうかはまだわかんない。

少なくともボタン連打で勝てるゲームでは無い。

javascriptすらまともに書いたことのない俺のreact.jsのコードを見てくれ

環境

WSL2 ubuntu20.04LTS

 

コードの概要

ローカルに立てたサーバーの各API(GET, POST, DELETE)を叩いて

データの登録、削除後に一覧表示をする。

 

実際の画面の動き

f:id:gyudonsenpai:20200825195456g:plain


コード

index.html

<!DOCTYPE html>
<html lang="ja"  class="bg-dark"  style="height: 100%;">
  <head>
    <meta charset="utf-8" />
    <title>Reactアプリ</title>
  </head>
  <body>
    <div id="root" class="bg-dark"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html> 
 
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { RecipeTable } from './recipeTable';
import RecipeForm from './recipeForm'
import { Container } from 'react-bootstrap';
import { Row } from 'react-bootstrap';
import { Col } from 'react-bootstrap';

ReactDOM.render(
    <Container>
      <Row>
        <Col>
        <h1 className="text-secondary text-center">My Recipe</h1>
          <RecipeForm/>
          <RecipeTable/>
        </Col>
      </Row>
    </Container>,
  document.getElementById('root')
);

 

以下でテーブルに一覧表示

recipeTable.js

import React from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';
import axios from 'axios';

function checked() {
    if(this.classList.contains('checked')){
        this.classList.remove('checked')
        this.classList.remove('bg-secondary')
    }else {
        this.classList.add('checked')
        this.classList.add('bg-secondary')
    }
}
export function ListRecipe() {

    axios.get("http://localhost:8080/recipes")
        .then(res => {
            var recipesTable = document.getElementById("recipesTable");
            whilerecipesTable.rows1 ] ) recipesTable.deleteRow1 );
            var data = res.data;
            for (var i in data){
                for (var j in data[i].foods){
                    data[i].foods[j] = " " + data[i].foods[j];
                }
                var row = recipesTable.insertRow(-1);
                row.classList.add('recipe')
                row.onclick = checked;
                var id = row.insertCell(0);
                var name = row.insertCell(1);
                var foods = row.insertCell(2);
                id.innerHTML = Number(i) + 1
                name.innerHTML = data[i].name + 
             `<input type="hidden" value=${data[i].id}>`;
                foods.innerHTML = data[i].foods;
            }
        })
}

export function RecipeTable() {
    ListRecipe();
    return (
    <table className="table table-dark table-sm" id="recipesTable">
        <thead>
            <tr>
                <th>ID</th>
                <th>Recipe Name</th>
                <th>Foods</th>
            </tr>
        </thead>
        <tbody id="recipes">
        </tbody>
    </table>
    );
}

 

以下で登録、削除の処理

recipeForm.js

import React from 'react';
import { ListRecipe } from './recipeTable';
import 'bootstrap/dist/css/bootstrap.min.css';
import axios from 'axios';

function recipeForm(){
    const submitForm = () => {
        var name = document.getElementById("name").value;
        var Allfoods = document.getElementsByClassName("food");
        var foods = [];
        for (var i = 0i < Allfoods.lengthi++){
            foods.push(Allfoods[i].value)
        }
        var headers = {headers: {'Content-Type': 'application/json'}}
        axios.post("http://localhost:8080/recipes", {
            'name': name,
            'foods': foods
            }, headers)
            .then(res => {
                console.log(res)
                ListRecipe()
            }).catch(err => console.log(err));
    }

    const addForm = () => {
        var foods = document.getElementById("foods");
        foods.insertAdjacentHTML('beforeend'
        '<input type="text" class="form-control mb-2 food"/>')
        
    }

    const deleteForm = () => {
        var foods = document.getElementById("foods");
        var food = document.getElementsByClassName("food");
        if (food.length > 1){
            foods.lastElementChild.remove();
        }
    }

    const deleteRecipe = () => {
        var checkedList = document.getElementsByClassName("checked");
        var alert = document.getElementById("alert")
        alert.classList.remove("alert")
        alert.classList.remove("alert-warning")
        alert.innerHTML = ""
        if (checkedList.length === 0){
            alert.classList.add("alert")
            alert.classList.add("alert-warning")
            alert.innerHTML = "Please select recipe you want to delete"
        }
        for (var i = 0i < checkedList.lengthi++){
            var id = checkedList[i].querySelector('input').value;
            axios.delete("http://localhost:8080/recipes/" + id)
                .then(res => {
                    console.log(res)
                    ListRecipe()
                }).catch(err => console.log(err));
        }
    }
    return (
        <>
            <form>
                <div className="form-group">
                    <label className="text-white">new recipe name</label>
                    <input type="text" className="form-control" id="name"/>
                </div>
                <div className="form-group" id="foods">
                    <label className="text-white">food</label>
                    <button type="button" className="btn btn-secondary
             btn-sm mb-1 ml-3" onClick ={addForm}>Add food</button>
                    <button type="button" className="btn btn-danger
            btn-sm mb-1 ml-3" onClick ={deleteForm}>Remove food</button>
                    <input type="text" className="form-control mb-2 food"/>
                </div>
            </form>
            <div>
            <button type="button" className="btn btn-primary 
        btn-sm mb-3" onClick ={submitForm}>Submit recipe</button>
            <button type="button" className="btn btn-danger 
      btn-sm float-right mb-3" onClick ={deleteRecipe}>Delete recipe</button>
            </div>
            <div id="alert"></div>
        </>
    );
}

export default recipeForm;

 

 

癖になってんだ BootStrap使うの