水が教へてくれる

ネット で 「水 国語辞典」 などと調べると
「水」の意味などが載ってゐる
例へば goo辞書の 「意味」のところに 見出しとして

みず [みづ]

と書かれてゐる

小學校では いまだに 水の讀みを 「みず」と教へてゐる
では 「みづ」 と讀んだとき それは間違ひなのだらうか

いはゆる 「歴史的仮名使い」で書かれた文章は
日本語として 間違ひ とは言へない

けれども 「日常的」には使はれないので
さういふ文章で書かれたブログは 多くの人に 良い印象を與へない

なぜだらう?

そもそも 「歴史的仮名使ひ」で「わざわざ」ブログを書く人といふのは
どんな価値観 世界観を持ってゐるのだらうか

なぜ 昔は 「みづ」 と讀んで 今は 「みず」と讀むのだらう

なんで 昔は 「讀」 と書いてゐたのに 今は 「読」と書くのだらう

ただ 時代が變はって 「自然」に 価値観が 變はったから?

それとも 別の原因があるのかな?

ここには 「洗脳」と 「學び」との大きな違ひが 潜んでゐる

あなたが もし

「學校で習ふ知識が 正しい知識」

と信じ續け
學校で教はってゐない 學校で習ったものと違ふことを言ったりする人を
あまり關はりたくない おかしな人と 決めつけた場合

あなたは どこかのカルト宗教(これも決めつけた不適当な言ひ方ではあるが)に洗脳されてゐる人と
何も違はない

「何が正しいんだらう」

「どうして正しいんだらう」

と 常に問ひ續けること

これが 「洗脳」を抜け 「學び」を 「つくりだす」 意識のはたらき と私は考へる

さういふ意味で

「みづ」といふ言葉ひとつが

多くのことを 語ってくれてゐる

ちょっと覺へ書き

ちょっと考へたこと

理解することと それが良いのか惡いのかは 關係がない

理解することは 見ることに似てゐる

英語で see を 「分かる」の意味に使ふのが納得できる

見る とは それが「何」であるか確認すること(物事を分割すること わかつこと)

理解もそれと同じ

良い 惡いを判断するのは 自分の「観念」

そして 私達は 何かを 「良い」 とするも 「惡い」とするも どちらも許された「自由」を持ってゐる

極言すれば すべてを「良い」とする自由もある

私は 「良い」「惡い」は観念であり 自由に變へられることを 「理解」した

だが それを「理解」しないのも 「良い」といふ「観念」を持ってゐる

gitの使ひ方

ちょっと前置き
gitの使ひ方についてのページは 山ほどある
なのに どうして それについて書くのか
それは
初心者にとって (私にとって) 必要だった情報は何だったか
といふことに絞って書きたいからだ
あと git関連ページは ほとんどの場合 何らかのビジネスサイトに繋がってゐる
その広告とかが煩はしくて 肝心の内容に集中できないのでは と思ふからだ
では早速やっていかう

gitは何で便利なのか

たとへば ひとりで開發をしてゐるとき コードを更新したけど 古いものも とっておきたくなる
後で何か問題が起こって その古いコードに戻りたくなるかも知れない
だから バックアップしたりするのだが そのファイルがかさばってしまふ
gitを使ふと そこに登録したファイルは 古いものも含めて ずっと保存される
だから 古いものを使ひたいとき 自在に戻って そのコードを入手できる
あと これは ひとりでも 多人数でも 起こり得ることだが
あるフォルダの中にあるファイルを いろんなパソコンで編集したい場合がある
このときgitを使ふと 簡單に目的のフォルダを ネットから取り込み(repositoryからcloneする)
それを編集して すぐに 共有フォルダ(リポジトリ)に アップロードできるし
それを また 途中まで編集してゐた 他のパソコンヘ 取り入れて(pull する)
新しいファイルを編集することが 簡單にできる
と 今では それらしきことが言へるのだが それが分かるまでは 全然簡單ぢゃなかった・・・
でも 脇道に潜り込んで迷ひさへしなければ gitは簡單なツールで それゆへに 多くの人に利用されてゐるのだと思ふ

使ひ方

それでは gitの讀み方も知らなかった私が(ジットと讀んでゐたーみんなギットと言ふらしい)
一番分かりやすいと思へる説明をしてみる

まづ フォルダを作る
これが 作業フォルダだ
そのフォルダの中で いろんなコードを書くといふことを前提としやう
フォルダの作り方が分からない といふ人は まづ ターミナルで作業する環境を作るのが良いと思ふ
windowsであれば wslUbuntuを入れたりする

mkdir test

と ターミナルに打ちこめば test といふ名前のフォルダ(ディレクトリ)ができる(自分の好きな名前にする)

cd test

で そのフォルダの中に入る
git がインストールされてゐなければ

sudo apt update

のあとに

sudo apt install git

として git をインストールする
次に ブラウザを開いて github のページへ行く
そこへユーザー登録する (このとき登録したユーザー名は大切なので 覺へておきたい)
ユーザー登録の詳細は省くが ここ など ネットをググれば色々でてくる
ユーザーページに行けたら 右上のアイコンをクリックして setting を選ぶ

setting
さうしたら 左下に Developer setting といふ項目があるので そこをクリック
developer_setting
そこにある Personal access tokens の Tokens(classic) を選ぶ
token
んで 適當な名前をつけて 適當にチェックして(適當ぢゃだめかもーとりあへず repo のところをチェックしてゐれば使へると思ふ) トークンを發効してもらふ(これが データをリポジトリに入れるときのパスワードになる)
このトークン(英数字の文字列)をコピーしておく

次にリポジトリを作成する(ユーザー登録したときに作っても良い)

repository
リポジトリの名前は さっき自分でつくったフォルダの名前にする
必須項目意外 何も變更しないで 一番下の Create repository といふ緑のボタンをクリック
さうしたら 上の画像に見へてゐる部分のコマンドを 先程作ったフォルダ内で實行する(ここでは testといふフォルダを作ったことにしてゐる)
實際には ユーザー名や フォルダ名が違ふので 上をそのまま入力してはいけない
さいごの

git push -u origin main

をやると ユーザー名とパスワードが聞かれる
ユーザー名は 設定したユーザー名なのだが
パスワードは githubに登録したときのパスワードではない!!
ここに 先程コピーしていた トークンの文字列を貼りつける(ちなみに貼りつけても 文字は隠されてゐるので トークンを間違ってコピーしてゐたら ファイルをアップできない)
これでエラーが出なければ とりあへず README.md ファイルが githubにアップされた
確認してみると良いと思ふ

さて 自分の編集した他のファイルもアップするのだが これは
アッド・コミット・プッシュ と覺へやう(!?)
これは add, commit, push のことなのだが ファイルをアップしたいときは この順番にコマンドを實行させる
これらの作業は エイリアスを使って自動化できるが とりあへず 順番に打っていくパターンを説明する

git add *

これで 現在自分の居るフォルダ内のすべてのファイルが準備され

git commit -m update

これで 準備されたファイルが登録され(update といふメッセージとともに)

git push -u origin main

で ネット上の github にアップロードされる
やはり最後のコマンドで ユーザー名とパスワードが聞かれるので
ユーザー名とトークンを入れてやらなければいけない
これがいちいち 煩はしい場合

git push https://syouzan420:ghp_M6NUf3shexdJUvkpdzhncSmOLKKyL4RUreM1@github.com/syouzan420/test.git main

のやうにする

git push https://ユーザー名:トークン@github.com/ユーザー名/フォルダ名(リポジトリ名).git main

となってゐるのが分かるだらうか(tokenは適當に改變してゐるので これは使へない)
そして これらを ひとつのコマンドで簡單に實行させるために エイリアスを作成する
まづ ホームディレクトリ(ホームフォルダ)へ移動する

cd ~

.bashrc といふファイルをエディタで開く

vim .bashrc

(bashrcの前にドット(ピリオド)が付いてゐる これは隠しファイルであることを示す)
ファイルの最後までスクロールさせ 次を追加する

alias gitup="git add *; git commit -m update; git push https://syouzan420:ghp_M6NUf3shexdJUvkpdzhncSmOLKKyL4RUreM1@github.com/syouzan420/test.git main"

これで 一回ターミナルを再起動させるか

source ~/.bashrc

として 設定を讀み込み
自分がさきほど作ったフォルダの中へ移動して

gitup

とすれば フォルダの中のファイルが またたく間に githubへアップロードされるであらう・・・(笑)
ちなみに ここでは 勝手に gitup といふ名前を付けただけであって 他のコマンドにかぶらないのであれば
自由に名前を付けられる

さて これで 自分のパソコンから githubへファイルをアップロードできた
それでは 別のパソコンで アップロードしたファイルを編集するにはどうするか
別のパソコンで 適當なフォルダへ移動する(アップロードしたリポジトリの名前のフォルダを作る必要はない)
ここで

git clone https://github.com/syouzan420/test.git

などとする (syouzan420は 自分のユーザー名 test は 自分のフォルダ名を使ふ)
すると! またたく間に リポジトリから このパソコンへファイルが転送される(フォルダもつくられる)
この場合 test といふフォルダができるので

cd test

として そのフォルダ内に入り いろいろとファイルを變更した後
先程の
アッド・コミット・プッシュ
を行へば リポジトリに 變更がアップロードされる
これも エイリアスを設定すれば 自動化されて アップロードが樂になる筈だ

さうしたら 元のパソコンのファイルは 古いままで リポジトリ(ネット上にアップロードされてゐるもの)が新しくなってゐることになる
この状態で 元のパソコンを使って その新しいファイルを編集したいならば
作ってゐたフォルダ内で プル(pull)してやればよい

git pull

とするだけだ
ユーザー名も パスワードもいらない
これで 自分のパソコンのデータが リポジトリの新しいデータに更新され それを編集することができる!!!

Haskell Language Server を Vim で利用する

ブログで書いたつもりになってゐて 書いてゐなかったので まとめてみる
1. coc.nvimをインストールする
2. CocConfigコマンドを實行して Language Server の設定を書く
3. GHCHaskell Language Server (HLS) をインストール (GHCup)

1について

まづ vim がそもそもない といふ人で windowしか知らない といふ人は
windowsPowerShell 7 をインストールして
管理者として實行し wsl をインストールする
多分 Ubuntuがインストールされると思ふが うまくいかなければ ここらへん を參考にするとよいと思ふ

sudo apt install vim

vimをインストール
vim-plug を入れる
(Installation の Unix といふところに貼ってあるコードをコピーして コマンドライン(シェル)に貼りつけ 實行させる)

cd ~

として ホームディレクトリに移動したら

vim .vimrc

として .vimrcファイルを編集する
(あと vimの使ひ方が分からなければ vimtutorを實行して學ぶ)

syntax on

set number
set smartindent
set autoindent
set expandtab
set tabstop=2
set softtabstop=2
set shiftwidth=2
set encoding=utf-8

call plug#begin()

Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'neovimhaskell/haskell-vim'
Plug 'Twinside/vim-haskellFold'

call plug#end()

colorscheme torte

filetype plugin indent on

augroup remember_folds
  autocmd!
  autocmd BufWinLeave * silent mkview
  autocmd BufWinEnter * silent loadview
augroup END

ここでカラースキームを設定してゐるが それは この設定が結果として見易くなったからだ
あと haskell-vim は インデントとかをhaskell向けにしたり 色々してくれるっぽい

それから 最初にup したとき書き忘れてたんだけど
coc.nvimの設定を.vimrcに加へた方がいいと思ふ(私の場合は何も考へず そのまま ここ の Example Vim configuration といふところをコピーして .vimrcに貼りつけた)

:PlugInstall

として プラグインをインストール
これで coc.nvimが入ると思ふ

2について

vimを開いた状態で

:CocConfig

とコマンドを入力
すると編集画面に移るので

{
"languageserver": {
  "haskell": {
    "command": "haskell-language-server-wrapper",
    "args": ["--lsp"],
    "rootPatterns": ["*.cabal", "stack.yaml", "cabal.project", "package.yaml", "hie.yaml"],
    "filetypes": ["haskell", "lhaskell"],
    // Settings are optional, here are some example values
    "settings": {
      "haskell": {
        "checkParents": "CheckOnSave",
        "checkProject": true,
        "maxCompletions": 40,
        "formattingProvider": "ormolu",
        "plugin": {
          "stan": { "globalOn": true }
        }
      }
    }
  }
}
}

基本的に ここ に書いてあるものを貼りつけただけだが 最初と最後に中括弧を追加しないとエラーになると思ふ

3について

Language Server 使へる設定にしたのに そもそもHaskell入れてへんかった~ といふことで インストール
ブラウザを開き(もとのOSのやつでいい)
GHCupの Installation ページで
System Requirements といふところを見る
Ubuntu のwslであれば Ubuntu のところを見て
そこに書いてある

build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5

といったものをコピーし
Ubuntuのターミナルで

sudo apt install コピーしたやつ  

とやって 必要なプログラムや ライブラリをインストールする
ここで 何かエラーが出たら そのエラーを出したっぽいプログラムorライブラリを 上のインストールリストから除いて もういっかい試す
例へば 何か libncurses-dev のインストールでエラーが出てゐた場合は

sudo apt install build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses5 libtinfo5

とやって libncurses-dev を除いてゐる ってな感じ
無事インストールできたら
GHCup の Installation ページの 上の方にある For Linux ,.... うんちゃら といふところに書いてある内容をコピーして

curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

ターミナルに貼りつけて實行する
途中で Haskell Language Server を入れるか聞かれるので Yes の方を選ぶ
インストールが終わったら

ghcup tui

として HLSがインストールされて さらに Set されてゐることを確認 ちゃんと Set されてゐると チェックマークが二つ入ってゐる

GHCup tui

てなことで
Happy Haskell Holidays!!!

docker を使って debian に kali をインストールしてみた ー 覺へ書き

docker のインストールについて

https://docs.docker.com/engine/install/debian/

に 色々説明がのってゐる
それを 参考にした

sudo apt update

必要なものを インストール

sudo apt install ca-certificates curl gnupg lsb-release

キーを取得

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

リポジトリを追加

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

docker をインストール

sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

インストールできたか 確認

sudo docker run hello-world

kali をインストールする

sudo docker pull kalilinux/kali-rolling

kali が入ったか確認

sudo docker image ls        

なんかする

sudo docker run -itd --rm kalilinux/kali-rolling

これで出た ID らしきものを コピー する

sudo docker exec -it コピーしたID /bin/bash

これで kali らしきものが 起動する

apt update

sudo をつけると エラーになった

apt install kali-linux-default

いろいろインストールされる
詳しい インストールの種類は

https://www.kali.org/tools/kali-meta/

ちなみに この kal-linux-default のインストールを始めてから この記事を書き出したんだけど
まだ 全然インストール終ってない(36%と表示されてる)

これを書くにあたって

DebianにDockerをインストールする - Qiita

を参考にしたけど リポジトリの追加部分とか うまく行かなかった (結局變なリポジトリを追加してしまった)
リポジトリの追加に失敗して 變なものを加へてしまったばあい
/etc/apt/sources.list を編集する
私の場合 vimを使ってゐるので

sudo vi /etc/apt/sources.list

として 問題のリポジトリを削除した
あと 次の記事も参考にした

DockerでKali Linuxコンテナをインストール - Qiita

いま 49%になった なげーよ (11時18分)
ちなみに 55% のときに kismet だっけ なんか インストールするか聞かれた (11時21分)
怪しげだったので no にした(まあ あとでもインストールできるっしょ)
Change MAC automatically? と聞かれた
ここは yes にした (60%のとき)(11時23分)
そもそも kali をインストールしたかったのは

www.hackthebox.com

をやるときに debianから直接 openvpnを使ってやると
色々なツールがインストールされてなくて 面倒臭い と思ったからだ
kaliなら hackingに關するツールが もともと入ってゐるので便利だと思ふ
windows11 に wsl を入れて kaliが動くやうにしてあるので
windowsからやればいい話だが debianもよく使ふので (なるべく 色々なことを こっちでやりたい)
こんなことをしやうと思ったわけだ
しかし どうしても 面白いゲームの中には windowsにしか對應してないものも多く
windowsは なかなか難しいだらう
googleよりは 全然簡單な氣はするけど(笑)
やべーな 暇をもてあまして どうでもいいこと書いてるぞ・・・

みなさんは ご存知だらうか
我々が google王国に居るといふことを・・・ (ちゅーにもーど)

いまや googleのプラットホームで 國の重要な情報までが やりとりされる時代
スマホしかり Youtubeしかり
學校教育には chrome book が導入されてゐる
本人確認も google認証が どんどん必須化してゐる
google基準で あらゆる価値が決まり 規制が決まる
国家元首でさへ googleの取り決めによって 情報の伝達が制限されるのだ

そして とても興味深いのは これらの現象を
人々の多くが 意識せずに 受け入れてゐること
誰も ひとつの會社が これだけ世界に影響力を持ってゐることに關して
危機感など 抱かないのだ

まあ これは Lineの使はれかたを見てゐれば よく分かることなのだが
要は 便利で みんなが使ってゐるものに 乗っかっていくのが 「正常」なのであって
それを疑問視したり 一企業が強大な情報力と 影響力を持つことに對して 危機感を抱くことは
「異常」であり あまり理解されないのである

やっと 71 % と思ったら そこで止まってゐて キーボードレイアウトを聞かれてゐた
こんな どうでもいいことを書いてたから 氣づかなかった〜
そのあと すぐに
Should non-superusers be able to capture packets?
ときかれた
セキュリティーリスクがあるから デフォルトでは no になってゐるようなので
no にしておいた (11時47分) 77%のところで
Please choose the character set --
などと聞かれた
なんか 良くわからなかったし 日本語的なのも選択肢にないので 1 にしておいた(11時56分)
83%のところで sslh について聞かれた
2 の standalone にしておいた (12時2分)
そろそろ ごはん食べやうかな〜 (ごはん炊いてあるし)
卵と チーズがある
親子鍋(ひらたいやつ)で目玉焼きをしつつ いい感じのところで塩少々
水加えて蓋
いい感じの焼き具合から モッツアレラチーズで蓋
丼にごはんをよそい 目玉焼きをのせる
最高だぜ!!
たまには味噌汁も飲むか〜
といふことで レトルトの味噌と具を 食べ終わった丼にあけ お湯をそそぐ
うまいっ!
あまりにも美味いので ごはん追加の おじやにする
なんてことをして 12時20分 インストールは終わってゐた

exit

で kali を抜ける

sudo docker container ls

として IDを確認
左側のID部分をコピー

sudo docker commit コピーしたID mykali

mykali の部分は適當な名前をつける
なんか 時間がかかる (12時34分)
おっ 終わったみたい(12時36分)
sha256のハッシュを吐いて終わってる

sudo docker run -it --rm mykali

で立ち上がることを確認

exit

でぬけて
.bashrc にエイリアスを追加する

cd ~
vi .bashrc

次を追加

alias kali='sudo docker run -it --rm mykali'

ターミナルを再起動
これで

kali

としてから パスワードを入力すれば起動する

追記
debian と kali 間のファイル転送について
まず コンテナIDを確認する

sudo docker container ls

mykaliのコンテナIDをコピー
debianから kaliに ファイルをコピー

sudo docker cp starting_point_yokoP.ovpn コピーしたID:/home/

上の例では starting_point_yokoP.oven といふファイルを kali の /home/ フォルダヘコピー
cp の引數の順番を逆にすれば kaliからdebianに ファイルをコピーできる
次のページを参考にした

dockerコンテナにファイルを転送する - Qiita

hack the box をやる場合 openvpndebianにインストールしておき

sudo apt install openvpn

debian

sudo openvpn starting_point_yokoP.ovpn

などとした後 kaliを起動して(もともと起動してゐてもよい)
kali上でネットワークへ接触できる
ちなみに kaliで openvpnを實行したが うまく行かなかった
だが このやり方なら debianから kaliにファイルを移動する必要もなく ある意味樂でよいと思ふ

(2.21 追記) 實行したkaliの環境(インストールプログラムなど)を變更後 何もやらないと その變更が反映されない
kaliを實行してゐる状態で
元のOSターミナルから(別にターミナルを開いて)

sudo docker container ls

として CONTAINER ID を確認する (これはkaliのシェルでも表示されてゐる)
ここで そのまま

sudo docker commit CONTAINER_ID(コピーしたやつ) mykali

とする(ここで mykali は もともと名前をつけてあったもの)
そして

sudo docker container stop CONTAINER_ID

とする
ここで 實行してゐた kali から exit して抜け出す
この作業で kaliの状態が新しくなってゐる筈
とりあへず 自分はこの方法で更新できた
もっとちゃんとした(てっとり早い)やり方があるんだらうけどね・・・

Haskell で 音ファイルを再生する

コードを載せます

module Main (main) where

import qualified SDL
import SDL.Mixer 

main :: IO ()
main = do
  SDL.initialize [SDL.InitAudio]
  withAudio defaultAudio 4096 $ do
    load "test.mp3" >>= play
    SDL.delay 1000 
    SDL.quit

私は stack を使って sdlを入れてゐます
ちなみに 前に SDLのインストールについて書いたんだけど あんなことしなくても使えることが後で分かった

stack new projectName で projectName といふ名前のフォルダを作り
その中に入ってゐる package.yaml の dependencies: の部分に

dependencies:
- base >= 4.7 && < 5
- sdl2
- sdl2-mixer

といふ感じで sdl2 と sdl2-mixer を書き加へ
app フォルダの中にある Main.hs を 最初に載せたコードみたいにして

再生したいファイル(ここでは test.mp3)を projectNameフォルダの中に置いてから

stack run

とすれば いろいろインストールされて
エラーが出なければ たぶん音が出る筈

SDL のライブラリが OSにインストールされてゐる必要があって さうでないとエラーが出ると思ふ
debialnOSであれば libsdl2-dev とか libsdl2-mixer-dev とか

とりあへず こんなところで

Haskell -- brick を使ってみる 5

brick と 私が開發してゐた kdbtl を組み合はせた

kdbtlB

コードは github に載せてゐる

github.com

appEvent のところだけ

appEvent :: BrickEvent Name CustomEvent -> EventM Name St ()
appEvent e =
    case e of
        VtyEvent (V.EvKey V.KEsc []) -> halt
        VtyEvent (V.EvKey V.KEnter []) -> do
          st <- use state
          ed <- use edit
          let con = E.getEditContents ed
              com = unlines con
              s' = exeCom com st
          case s' of
            Nothing -> stlog %= (++"Error!")
            Just js -> state .= js
          cmlog %= (++com)
          edit .= E.editor Edit (Just 1) ""
          vScrollToEnd cmScroll
        AppEvent Logstate -> do
          st <- use state 
          let nst = doWithTime st
          state .= nst 
          if (st/=nst) then stlog %= (++(show nst)++"\n") else return ()
          vScrollToEnd vpScroll
        ev -> zoom edit $ E.handleEditorEvent ev 

なんか よく見ると そのままなので 説明することもないか〜
途中 カーソル位置を動かしたかったのだけど よく分からなかった
エンターキーは かうやって 処理を書くと
もともとの エンターキーの擧動がなくなって 次の行とかに行かなくなる
カーソル位置の取得は E.getCursorPosition で できるんだけど
たぶん それを使ふには
カーソル位置の情報を 状態(St) に追加したり 名前をつけたりして
そんで drawUI のなかで使ふ必要があるのかなーって思った
カーソル処理が分からなかったんで
エンターを押したら エディタを初期化して 書いたコマンドは コマンドログとして
上部に表示させるやうにした
スクロールは前回實現したけど ホント最初は どうやるんだか分からなかったな〜
ひとことで言へば ViewportScrollといふ型の要素をつくって(名前も使って)それに
vScrollToEnd 函數とかを適用すれば 行の最後までスクロールされるやうになる みたいな

ただ この短期間でここまでの世界を見せてくれた brick は すごいと思ふ
なんか twitter で いいねをつけてくれた 開發者さんがゐたみたいだから 書いておかう
Brick Is Great!!! Thank You! I'm still a biginner but with Haskell, someday I'll make an EPIC game!