個人的にvimでよく使う操作
ノーマルモード
- :i カーソル位置からインサートモードに移行する
- :a カーソル位置の次の位置からインサートモードに移行する
- :w ファイルの保存
- :q ファイルを閉じる(更新してたら実行不可)
- :q! 強制的にファイルを閉じる(更新してても実行可能)
- :e ファイルを検索して編集
- 検索してヒットしたファイルに移動して編集ができる
- タブの補完が効きますが、Ctrl-dを押して候補一覧を見てからタブキーで保管しよう
- :f :eの強化版でパスから検索が可能
- gg ファイルの先頭行の最初にカーソルを移動する
- G ファイルの最終行の末尾にカーソルを移動する
- dd カーソルの行を削除する
- . 直前の操作をもう一度行う
インサートモード
【GGST】ラムレザルの個人的な立ち回りとかのメモ
はじめに
どうもおかりんです。
メインで使っているラムレザルのメモです。
雰囲気で使っていることもあって攻略を考えるときに上手く言語化できなくて困ります。。。
なので今まで覚えてきたこととか書き残してみようと思いました。
それに書くことでみなさんのためにもなるかもですし!
階級は一応天上界にいます!
そこそこ役に立つかもなのでよろしくお願いします。
というわけで書いていきます。
注意点
指南書のようなものではないため、ラムレザル自体の戦い方というより私の戦い方の思考に寄っている部分があります。
その点はご了承いただければと思います。
もっとこうしたらいいかもーみたいなフィードバックはいっぱいお待ちしております!
立ち回り
開幕
最初はバックジャンプで様子見、しゃがみガードで様子見がいいかなーと思っています。
ラムレザルの遠Sは長いので開幕位置から当てることができるので相手の技と嚙み合ったときに勝つことが多い気がしますが最初にする行動としてはちょっとリスクが高い気がしているので使うのは壁を割った後や連戦後など相手の行動がある程度わかっている状態が良さげかなと思っています。
全体の立ち回り
中距離で戦うことを意識していいかもしれません。
全キャラクター中屈指のリーチの長さなので遠SやHSをぶんぶん振っていると地上ではほぼ無敵です。
無理やり近づいてくる方にはそのまま押し切ってあげましょう。
対の選択としてジャンプや飛び込みで近づいてくるはずなので対空で落としてあげましょう。
空中ダッシュが見えても前Pが間に合うかなーと思っていたり。
地上も飛びも対処していくと相手は遠Sに勝つために置き前Pをしてきたりなど置き技が増えてきます。
その時は遠Sを振るふりをしてダッシュ2Kなどを見せて動揺させてあげましょう。
ラムレザルのダッシュはとても速いので対応するのが難しいです。
空中
固め
近Sをまず当ててください!
以下はそこからの流れです。
- 近S>HSバヨネート
- 上いれっぱを狩れるので知らなくてジャンプで逃げようとしている方を倒しましょう。
- HSバヨネートの爆発があるのでそれまではガードしておきましょう。
- 連続ガードではないので昇竜などには注意です。上手く散らして気軽に打てないようにしましょう。
- 近S>エラルルーモ1段目
- 2段目に派生すると暴れをつぶせますが知っている人はガードしてくるはずなので反撃食らわないこれで様子見してよいと思います。
- 近S>2S>エラルルーモ1段目>ダッシュキャンセル>ダッシュキャンセルキャンセルHSバヨネート
- 2Sを混ぜたのは距離調整です。あまり近すぎると下Pなどの早い攻撃にHSバヨネートが負けることがあるのでそうしてます。(エラル2段目があるので暴れてくる人はいない印象ですが読まれたときに悲しみを背負うので。。。)
- 近S>2S
- 近S>2S>エラルルーモ1段目
- 近S>2S>エラルルーモ1段目>ダッシュキャンセル>ダッシュキャンセルキャンセルHSバヨネート
- 近S>ジャンプ>HS>空中ダスト>アレグーサオルドーノ>遠S~
- 見た目がかっこよくておすすめしてます。実用性は微妙ですが以外と連携が切れなくて強いです。
ジャンプ逃げを許した時
ジャンプP連打で地上に引き釣り下すのをよく使います。
隙も小さくて判定もそこそこなので使いやすいです。
空中投げできそうならそっちでも可です!
崩し
何もしてなくても勝手に相手が崩れてることが多い気がしてるのであんまりないのですが、頑張って書きます。
- 近S>HSバヨネート>前ロマンキャンセル>ダストor2S
- 連続ガードの2択ですね!中段のダストを最初に使うことが多いです!
- 近S>HSバヨネート>爆発前に投げ
- 爆発前に投げることができます!ラムレザルには固まってくれる方が多いので投げは主力の崩しです!w
私が崩しって感じで使っているのは以上ですね。。。
コンボ
ダッシュキャンセルキャンセル必殺技をコンボに組み込むことはあんまりないかもです。。。
私は安定しないのでやっていないです。
それにもともとの火力が高いので多少無理やりに火力を高める必要はなくて安定した行動をとった方がいい気がしてます。
中央
- 立K>足払い>ダウロ>近S>エラルルーモ三段目まで派生
- 足払い後のダウロで落ちてくるのを近Sで拾えます!立Kが当たる場面はあまりないですが練習しておくとうれしいことがあるかもですね!
- 2K>足払い>エラルルーモ三段目まで派生
- 2Kを当てる機会は多いので頻繁に使うコンボです!
- 立K>足払い>ダウロ>近S>前HS>HSバヨネート>壁割まで
- 画面中央からラムレザル一人分くらい壁寄りだとHSバヨネートが壁まで運んでくれます!
- 遠S>HS
- 遠S>HS>ダウロ
- 近くで当たったときはダウロまで入るので入れてあげましょう。そのあとは近距離でエラルの固めだ!
- 近S>足払い>ダウロ>近S>前HS>HSバヨネート>壁割まで
- 立Kのときと同じですね!
画面端
- 近S>HS>HSバヨネート>Sバヨネート>2HS>ダウロ>壁張り付き>サブロバート
- 近S>HS>HSバヨネート>近S>前HS>エラルルーモ三段目まで>壁割り
以外と使っているコンボは多くないですね。。。
おわりに
大体こんな感じで戦っています!
ラムレザルはやれることも多くて強いですし、見た目もかわいいのでぜひみなさん使ってみてください!
大体土日の夜はランクタワーで戦っているので見かけたらぜひ対戦よろしくお願いします!
Commitizenとcz-emojiを使っておしゃれにコミットする
コミットするときにプレフィックスだとかで色々迷っていたんですが、便利なツールがあることを知ったので使い始めました。
npmのパッケージなのでNode.jsが必要です。
環境
- Windows + WSL2(ディストリ: Ubuntu20.04)
- Node.js v16.15.1
必要なパッケージのインストール
npm i commitizen cz-emoji
設定ファイルを作る
ホームディレクトリに「.czrc」を作ります。
↓私の設定です。
自由にカスタマイズもできるのでこれじゃ嫌だ!って方はいろいろ変えてみて下さい。
{ "path": "cz-emoji", "config": { "cz-emoji": { "subjectMaxLength": 72, "skipQuestions": ["scope"], "types": [ { "name": "feat", "code": "feat: :+1:", "emoji": "👍", "description": "Feature (実装)" }, { "name": "fix", "code": "fix: :bug:", "emoji": "🐛", "description": "Fix (修復)" }, { "name": "wip", "code": "wip: :construction:", "emoji": "🚧", "description": "WIP (工事)" }, { "name": "chore", "code": "chore: :paperclip:", "emoji": "📎", "description": "Chore (雑務)" }, { "name": "style", "code": "style: :sparkles:", "emoji": "✨", "description": "Style (美観)" }, { "name": "docs", "code": "docs: :notebook:", "emoji": "📓", "description": "Documents (文書)" }, { "name": "perf", "code": "perf: :zap:", "emoji": "⚡", "description": "Performance (改善)" }, { "name": "refactor", "code": "refactor: :bulb:", "emoji": "💡", "description": "Refactoring (改築)" }, { "name": "test", "code": "test: :100:", "emoji": "💯", "description": "Test (試験)" }, { "name": "release", "code": "release :tada:", "emoji": "🎉", "description": "Release (公開)" } ] } } }
使ってみる
以下のコマンドを実行する。
git addでステージングしていないと失敗するので何かしらステージしてあげてください。
git cz
設定が正しければ以下のようにコンソールに出力されるはずです。
矢印でどのプレフィックスを付けるか選べます。
決まったら
cz-cli@4.2.4, cz-emoji@1.3.1 ? Select the type of change you're committing: (Use arrow keys or type to search) ❯ feat 👍 Feature (実装) fix 🐛 Fix (修復) wip 🚧 WIP (工事) chore 📎 Chore (雑務) style ✨ Style (美観) docs 📓 Documents (文書) perf ⚡ Performance (改善)
実行した結果です。
プレフィックスを選んだら、タイトル決めて、詳細書いて終わりです。
issueとかも選択すれば閉じることが出来るのでそこは自由に使ってみましょう。
cz-cli@4.2.4, cz-emoji@1.3.1 ? Select the type of change you're committing: refactor 💡 Refactoring (改築) ? Write a short description: refactor: :bulb: git cz test ? Provide a longer description: test desctiption ? A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself: ? List any issue closed (#1, #2, ...): [main ac3fa4b] refactor: :bulb: git cz test 1 file changed, 1 insertion(+)
後はpushして終了です!
これでおしゃれにコミットができるぞい!
GithubのSSH接続の設定
パスワード認証がダメになってたらしい。(一年前。。。)
慣れていないせいか面倒だったので残しておきます。
SSHの鍵を作成する(公開鍵・秘密鍵)
ssh-keygen -t rsa
-t オプション
作成する鍵の暗号化形式を「rsa」(デフォルト)、「dsa」「ecdsa」「ed25519」から指定する https://atmarkit.itmedia.co.jp/ait/articles/1908/02/news015.html
↓出力
Generating public/private rsa key pair. Enter file in which to save the key (/home/okayama/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: ...
パスフレーズ等の設定があるようですが、
ただSSH接続したいだけなら特に設定しなくてよさそうだったのでEnterキーで先に進みます。
~/.sshの配下に以下のファイルが追加されているはずです。
pubがついている方が公開鍵です。
Githubに公開鍵を登録する
https://github.com/settings/keys
上記リンクに飛ぶとSSHキーを設定できる。 ここに生成した「SSHの公開鍵」を設定する。
New SSH Keyを押すと以下の画面に遷移する
titleは自由でよい。
自分がわかる名称を付けてあげましょう。
Keyには「id_rsa.pub」の中身を貼り付けよう。
接続テスト
接続前に設定ファイルが必要。
~/.ssh/config
Host github github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa
以下のコマンドでテスト。
ssh -T github
Hi Okarin-K! You've successfully authenticated, but GitHub does not provide shell access.
こんな感じで出たら成功。
git pushで失敗したとき
リモートのアドレス設定がhttpsから始まっているとssh接続でpushできないので失敗する。
git remote set-utl origin git@github.com:[username]/[repositoryName]
関数型プログラミングについてのまとめ
宣言型プログラミングというプログラミングパラダイムの一部
「何をするのか(What)」が重要で「どのようにするか(How)」は重要ではない。
結果を得るための手順を記述していく命令型プログラミングよりも何をしているかがわかりやすくプログラムの読解がしやすい。
宣言型プログラミングの特徴
コードを見れば何をしているかがわかる。
実装に関する詳細は個々の関数によって抽象化され、隠蔽されている。
適切に分割、命令されて組み合わせることでコメントを書かなくてもやっていることがわかる。
関数型プログラミングの基本概念
イミュータブルなデータ
イミュータブルとは変更することができない状態を指す。
関数型では全てのデータがイミュータブル。
オブジェクトを操作するときは、直接参照を操作するのではなく、オブジェクトのコピーを作ってそれを操作しましょう。
TypeScript/JavaScriptだとスプレッド構文とかを使う。
純粋関数
引数の値のみを参照して、それを元に計算し、値を返す関数を「純粋関数」と言う。
純粋関数は以下の特徴がある。
- 少なくとも一つの引数を取る
- 値、もしくは関数を戻り値として返す
- 副作用がない
純粋関数ではない例
const person = { name: 'okarin', canRead: false, canWrite: false }; function selfEducate() { // 引数を受け取ってない person.canRead = true, // 関数外のオブジェクトに変更を与えるので副作用がある person.canWrite = true } // 戻り値を返却しない selfEducate(); console.log(okarin);
純粋関数である例
type Person = { name: string; canRead: boolean; canWrite: boolean }; const person: Person = { name: 'okarin', canRead: false, canWrite: false, }; const selfEducate = (person: Person): Person => ({ // 引数を受け取る ...person, // スプレッド構文で元オブジェクトのコピーに対して操作しているので副作用がない canRead: true, canWrite: true, }); // 戻り値を返却する console.log(selfEducate(person)); // { name: 'okarin', canRead: true, canWrite: true } console.log(person); // { name: 'okarin', canRead: false, canWrite: false }
高階関数
他の関数を引数に取るか、戻り値として関数を返すか、もしくはその両方を満たす関数のこと。
JavaScriptの関数は第一級オブジェクトなので関数を変数と同様にあつかうことができる。
そのためのこのような関数として扱える。
const invokeIf = (condition: boolean, fnTrue: () => void, fnFalse: () => void) => (condition ? fnTrue() : fnFalse()); const showWelcome = () => console.log('Welcome!!!!'); const showUnauthorized = () => console.log('Unauthorized!!!!'); invokeIf(true, showWelcome, showUnauthorized); invokeIf(false, showWelcome, showUnauthorized);
再帰
関数の中から自分自身を再帰的に呼び出すテクニックのこと。
関数型において多用されている。
ループで書かれたコードは多くの場合は再帰で書きなおすことができ、コードが簡潔になります。
const countdown = (value: number, fn: (value: number) => void): number => { fn(value); return value > 0 ? countdown(value - 1, fn) : value; }; console.log(countdown(10, (value) => console.log(value)));
関数型プログラミングで書いたデジタル時計
type ClockTime = { ampm: 'AM' | 'PM'; hours: number; minutes: number; seconds: number; }; const oneSecond = () => 1000; const getCurrentTime = () => new Date(); const clear = () => console.clear(); const log = (message: any) => console.log(message); const serializeClockTIme = (date: Date): ClockTime => ({ ampm: 'AM', hours: date.getHours(), minutes: date.getMinutes(), seconds: date.getSeconds(), }); const civilianHours = (clockTime: ClockTime): ClockTime => ({ ...clockTime, hours: clockTime.hours > 12 ? clockTime.hours - 12 : clockTime.hours, }); const appendAMPM = (clockTime: ClockTime): ClockTime => ({ ...clockTime, ampm: clockTime.hours >= 12 ? 'PM' : 'AM', }); const display = (target: any) => (time: ClockTime) => target(time); const formatClock = (format: string) => (time: ClockTime) => format .replace('hh', time.hours.toString()) .replace('mm', time.minutes.toString()) .replace('ss', time.seconds.toString()) .replace('tt', time.ampm); const prependZero = (key: keyof ClockTime) => (clockTime: ClockTime) => ({ ...clockTime, [key]: clockTime[key] < 10 ? '0' + clockTime[key] : '' + clockTime[key], }); const compose = (...fn: any) => (arg: any) => fn.reduce((composed: any, f: any) => f(composed), arg); const convertToCivilianTime = (clockTime: ClockTime) => compose(appendAMPM, civilianHours)(clockTime); const doubleDigits = (civilianTime: ClockTime) => compose(prependZero('hours'), prependZero('minutes'), prependZero('seconds'))(civilianTime); const startTicking = () => { setInterval( compose(clear, getCurrentTime, serializeClockTIme, convertToCivilianTime, doubleDigits, formatClock('hh:mm:ss tt'), display(log)), oneSecond() ); }; startTicking();
参考
Reactハンズオンラーニング www.oreilly.co.jp
huskyを使ってeslintとprettierを強制する
今まで手動でeslintとprettierをやっていたんですが漏れたり、
そもそも手動というのが辛すぎるのでコミット時に自動で実行してほしいなーと思ったのでやってみました。
eslintやprettierをコミット時に実行するモジュールとして「lint-staged」を使いました。
つまり、huskyを使ってlint-stagedをコミット時に実行するようにして、eslintとprettierを強制するわけですね!
huskyとは?
huskyはGit hooksが簡単にできるパッケージです。
Git hooks とはコミットやプッシュなどの特定のアクションが発生したときにスクリプトを実行する仕組みになります。
lint-stagedとは?
lint-stagedはステージングしたファイルに対し、特定のコマンドが実行できるパッケージです。 例えば、Node.jsのnpmスクリプトに定義しているスクリプトを実行できるのでとても便利です!
設定してみる
環境
- WIndows11
huskyの設定
husky のインストール
npm i -D husky
husky の初期化
npx husky install
lint-stagedの設定
lint-stagedのインストール
npm i -D lint-staged
package.jsonにスクリプト設定を追加する
"scripts": { ..., "lint-staged": "lint-staged" }, "lint-staged": { "*.{js,ts,jsx,tsx}": [ "npx eslint . --fix", "npx prettier --write ." ] }, }
hooks の登録
コミット時に動くスクリプトの設定
npx husky add .husky/pre-commit "lint-staged"
実行してみた
git commit > husky-sample@1.0.0 lint-staged > lint-staged [STARTED] Preparing lint-staged... [SUCCESS] Preparing lint-staged... [STARTED] Running tasks for staged files... [STARTED] package.json — 23 files [STARTED] *.{js,ts,jsx,tsx} — 5 files [STARTED] npx eslint . --fix [SUCCESS] npx eslint . --fix [STARTED] npx prettier --write . [SUCCESS] npx prettier --write . [SUCCESS] *.{js,ts,jsx,tsx} — 5 files [SUCCESS] package.json — 23 files [SUCCESS] Running tasks for staged files... [STARTED] Applying modifications from tasks... [FAILED] The following paths are ignored by one of your .gitignore files: [FAILED] node_modules [FAILED] Use -f if you really want to add them. [STARTED] Cleaning up temporary files... [SUCCESS] Cleaning up temporary files... Aborting commit due to empty commit message. PS D:\git\husky-sample> PS D:\git\husky-sample> PS D:\git\husky-sample> git commit -m "test: husky" > husky-sample@1.0.0 lint-staged > lint-staged [STARTED] Preparing lint-staged... [SUCCESS] Preparing lint-staged... [STARTED] Running tasks for staged files... [STARTED] package.json — 23 files [STARTED] *.{js,ts,jsx,tsx} — 5 files [STARTED] npx eslint . --fix [SUCCESS] npx eslint . --fix [STARTED] npx prettier --write . [SUCCESS] npx prettier --write . [SUCCESS] *.{js,ts,jsx,tsx} — 5 files [SUCCESS] package.json — 23 files [SUCCESS] Running tasks for staged files... [STARTED] Applying modifications from tasks... [FAILED] The following paths are ignored by one of your .gitignore files: [FAILED] node_modules [FAILED] Use -f if you really want to add them. [STARTED] Cleaning up temporary files... [SUCCESS] Cleaning up temporary files... [main 1b63285] test: husky 23 files changed, 8548 insertions(+), 1 deletion(-)
最近流行りのprismaを使ってみた。CRUD操作編
どうも、okarinです。
前は環境構築だけだったので基本の CRUD 操作をやっていきます。
使っていて思ったんですが prisma cli や client が型定義を自動で認識してくれているのでものすごく使いやすかったです。
TypeORM で作っていたテーブルクラスも必要なかったので感動しました。
テーブル定義
model Post { id Int @id @default(autoincrement()) content String postedBy String trackingCookie String createdAt DateTime @default(now()) }
前のテーブル定義で作ったものと同じです。
CRUD 処理
あくまで基本的な処理だけです。
複雑なクエリなどを組み立てたい場合はドキュメントを参照ください。
追加(CREATE)
create
追加のメソッドです。
data のプロパティに対してテーブルのオブジェクトを渡せばそのまま追加できます。
TypeORM の getRepository にある Insert メソッドと同じ動きですかね。
import { PrismaClient } from "@prisma/client"; import { PostInfo } from "../../businessLogic/bulletinBoard/post"; const prisma = new PrismaClient(); export async function create(post: Readonly<PostInfo>): Promise<void> { await prisma.post.create({ data: { content: post.content, postedBy: post.postedBy, trackingCookie: post.trackingCookie } }); }
取得(READ)
findMany()
全件取得をするメソッドです。
where などの条件は以下のようにします。
findMany( where: { content: 'コンテンツだよ' }, )
import { Post, PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export async function findMany(): Promise<Post[]> { return await prisma.post.findMany(); }
findUnique
単体の取得はこのメソッド。
名前が非常に分かりやすい。
select オブジェクトで取得したいプロパティに真偽値を付けることで取得できる。
import { Post, PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export async function findMany(): Promise<Post[]> { return await prisma.post.findUnique({ where: { id: 1, }, select: { content: true, postedBy: true, }, }); }
上記で実行するとこんな感じのオブジェクトが来るよ。
{ content: '一つ目のコンテンツだよ', postedBy: 'okarin' }
更新(UPDATE)
update
単体更新のメソッドです。
追加の create が update に変わっただけに見えるので非常に覚えやすいですね。
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export async function findMany(): Promise<void> { await prisma.post.update({ where: { id: 1, }, data: { content: '更新するよ', }, }); }
updateMany
複数更新のメソッドです。 プロパティに対してオブジェクトで指定ができるようになっています。
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export async function findMany(): Promise<void> { await prisma.post.updateMany({ where: { content: { contains: '含まれているもの全部が対象だよ' }, }, data: { content: 'すべて一括更新するよ', }, }); }
削除(DELETE)
delete
削除用のメソッドです。
ここまで見ていただければ分かるかもですが CRUD のメソッドはほぼ同じ見た目です。
とても簡単に実装できますね!
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export async function findMany(): Promise<void> { await prisma.post.delete({ where: { id: 1 } }); }
where で使う条件指定のオプション
contains など色々あるので詳細はこちらの公式ドキュメントが詳しいです。
おわりに
興味本位で触りましたが楽しみながらやってました。
しばらくはずっとこれを使っていそうです!
とてもよいおもちゃを見つけた!
さらっと書いただけなので間違いとかあったらご指摘お願いします!