Fibonacci数列

メモ化再帰とかの話読んでたらちょっと思い出したので書く。

let fib = n => n === 0 ? 0 : (n === 1 ? 1 : (n > 1 ? fib(n - 1) + fib(n - 2) : void(0)));

みたいなのを書くと、 {\displaystyle \mathcal{O} ({\alpha}^n)} ( {\displaystyle \alpha = \frac{\sqrt{5} + 1}{2}}) の計算量になるはず(ほんまか?)

これを { \displaystyle \mathcal{O} (n)}まで下げたい

まあ、こうする

let fib_seq = (n) => {
  if(n === 0) return [0];
  if(n === 1) return [1, 0];
  if(n > 1) {
    let seq = fib_seq(n - 1);
    return [seq[0] + seq[1], ...seq];
  }
};

let fib = n => fib_seq(n)[0];

fib_seqn番目までの数列を取得するやつなんですけど、やってることってn - 1番目までの配列をとってきてその添字01を足して配列に積むだけなので、たぶん {\displaystyle \mathcal{O} (n)}で済むはず。その一番上を拾うといい感じになる。

このやり方は去年大学の講義でPrologで実装するやつを見たんだけど、忘れそうだったから一応書いておいた。

まあ普通に漸化式解いて一般項求めて誤差を丸めれば  {\displaystyle \mathcal{O} (1) }だが…*1

*1:調べたら行列とか使って頑張ると  {\displaystyle \mathcal{O} (n \log n)}まで下がるらしい

単位が出ていた

単位が出ていたので卒研と余剰2単位クリアで大学全クリっぽい、幸せのあり方、心、社会への不安、無理

無理なので人間が唐突に大量に破壊されて欲しくなってきた

幸せってなんや、俺だってなあ、頭使ってなさそうな楽しそうな人間になりたかった、今からはなりたくない

東方永夜抄のスペルプラクティスでインペリシャブル・シューティングを繰り返しやっていた頃が一番幸せだった、あの時間を永遠にくれ、藤原妹紅さんの弾幕を、たのむ

後期余剰単位として何を取るか考えていない、計算機科学っぽい単位が少なすぎる、何故俺は数学系へ、数値計算の講義で降ってくるあらゆる処理をメイン関数に詰め込んだお弁当箱、よくわからないまま過ぎていった解析学、何もかもがわからない、おれは、なぜ…

波括弧レスJavaScript理論

某所で初心者のJavaScriptコードを見ると本当に酷くてつらい気持ちになります。 波括弧がちゃんと閉じていないみたいなしょうもない上にやたら愚直に書かれていて一切の可読性がないコードを読むのは辛い。

波括弧レスJavaScript

絶対に解決はしないけど、波括弧なしでJavaScriptを書けば全てが解決しますねという気持ちになりました。

for(let i = 1; i <= 100; ++i) {
  if(i % 3 !== 0 && i % 5 !== 0) {
    console.log(i);
  } else if(i % 3 === 0 && i % 5 === 0) {
    console.log("FIZZBUZZ");
  } else if(i % 3 === 0) {
    console.log("FIZZ");
  } else {
    console.log("BUZZ");
  }
}

みたいなクソ雑なFIZZBUZZがまあありますよと、これを

Array(100).fill().map((_, i) => i + 1).forEach(i => i % 15 === 0 ? console.log("FIZZBUZZ") : (i % 3 === 0 ? console.log("FIZZ") : (i % 5 === 0 ? console.log("BUZZ") : console.log(i))))

こうするみたいな話ですね。

JavaScriptで波括弧使う例

if

三項演算子を使え

switch

三項演算子でがんばれ

while

再帰関数で頑張れ

for

Array(count).fill().map((_, i) => i).forEach(i => anyfunc)みたいな感じで一定回数のループはできるのでそれでコレクションを回すのは言わずもがな

Object

もしくはnew Objectしてそこにプロパティつっこみまくれ。ArrayにつっこみまくってJSON.stringifyが必要みたいなときとか純粋にObjectが必要になったらObject.entriesとか使ってがんばれ

関数

ひたすら辛い。

基本的には単一の値を返すArrow Functionを使う。 let hoge = (arg) => arg + 1; みたいな感じ

複数の処理をさせたいときはカンマ演算子で頑張る。こいつは() => hoge, fugaみたいなことをしたらfugaが帰ってくる。つまりカンマを挟んで次の値が返却値になる。だから let a = 1,2,3とかやると a3になる。 この手法はUglifyJSとかで変換後のJSとかを見るとよく使われている。割と便利。 しかし変数の宣言は返却値のみのArrow Functionないで出来なかったりするのでスコープについては諦めるしかない(かもしれない)。

代入文は普通に代入した値を返却するのでカンマ演算子の後側で使えるし、そのへんをうまくやったりする。

また、割と&&||演算子は便利。

前者は左辺式の評価値がtrueにキャストできる場合は右辺値を評価して返し、そうでない場合は左辺式の評価値を返す。

後者は左辺式がtrueキャストできればそのまま左辺式の評価値を、そうでなければ右辺式の評価値を返す。これもよくUglifyされたやつでみる。

割となんとかなると思う。この辺で頑張って処理したり、ローカル変数をひたすら先に用意しておいて代入文とカンマ演算子と論理演算子でがんばったりするだけでもいいし。

さらに言えばチューリングマシンで計算可能な関数は原始帰納的なので、初期関数三種の合成や原始帰納を有限回繰り返すだけで作れます。 初期関数は

{ \displaystyle
Z (x) = 0
}

 { \displaystyle
S (x) = x + 1
}

 { \displaystyle
U ^i _n (x_1, \cdots , x_n) = x_i
}

の3つで、JavaScriptで書くならそれぞれ

let Z = x => 0;
let S = x => x + 1;
let U = (i, ...args) => args[i];

として書ける。3つ目のやつに関しては割と自由だし、 {\displaystyle S }に関しても逆関数が簡単に書けるし楽。

合成と原始帰納については説明を割愛するけど、これらも普通に平易にJavaScriptで書くことが出来るわけで、まあつまりチューリングマシンで計算可能なレベルの関数であれば、Arrow Functionだけで頑張れるし、波括弧はいらない。

雑に思いついたまま書いただけなので今回はあまり詳しくは書かないけどどこかで詳しく書く機会があればやるかも

京都へ行った

就活で京都に行ったのでその辺の話を書く。

経緯

京都に本社のあるこの記事がホスティングされているサービスを運営している会社があって、選考を受けに行った。

内容としては、課題をやってその話をしたり人事の人や役員の人と話した。 学びがあり面白かった。

やったこと

自分は中学の修学旅行で京都に行った際、タクシー移動で事故ったため二条城行けなかったのがなんとなく心残りだったので、二条城に行った。

まあなんかそんな感じです。

ここでとしぁさんと待ち合わせをしたんですが、としぁさんが二条城内で迷ったため、さすがだなあと思いました。さすがですね

子を見守る親の気持ちで一度見つけたとしぁさんをスルーして天守閣まで戻ったのは失敗でしたね。

戦った

なんか地獄Slackで100均ゴミバトルをやる感じの流れになったので前日に用意をして、強いゴミを渡し合いました。

だいたい toshi-a.hatenablog.com

これをお互いに100均でやった感じです。

結果

お土産購入

お土産購入を手伝ってもらった。

基本的に真面目にお土産を買ったが、センスが良いお土産についても学べたので今後の参考にしていきたい。

おわりに

3時間くらいしか寝てなくて死にそう

インターネットハンドスピナーをつくった

ハンドスピナー これ

経緯

概要

ハンドスピナー的なものを適当に作った、途中途中正規表現をミスったり雑にsetIntarvalしたりしてたせいでデバッグしにくかったりしんどかったが、割となんとかなった。

仕組み

雑にタッチやらクリックやらの動きをハンドリングして、中心からの角度の余弦関数の値を余弦定理で求めて逆余弦関数使って弧度法で角度出す、それっぽい感じにCSStransform:rotate(\d+rad)で設定する。いい感じになる。

ハンドスピナーなので、真面目に物理計算をしようと思ったが、高校物理を思い出しているうちに面倒になってきたので雑な実装に切り替えた。

座標計算とかはクラスにしていい感じにカプセル化隠蔽。なんでPointっていうクラス名なのかはよくわからんが、普通に考えたらVectorな気がしたが気にしないことにした。

また、ベクトル外積使って回転方向求めるやつでy軸の方向が違うから混乱した。

github.com

とりあえずクソリポジトリが増えました。こちらからは以上です。

tus.mysticdoll.comを直した

なんとなく気が向いたので直しました。

結局のところCSRFトークンっぽいのが突っ込まれてるだけなので、当該要素取得してアレしただけですね。jsdomでシュッてしました。

応急処置なので当該要素だけ特別な実装にしましたが、この辺はちゃんとフォームのinput要素のパーサ書いてやってもいいかもしれませんね。いっそヘッドレスブラウザ叩いて操作する方が実装的には綺麗にまとまるかもしれませんが、ヘッドレスブラウザ叩くの面倒なのでしばらくはこのままだと思う

github.com

一応雑なNode.js向けのリポジトリも一緒に更新した。というか通信部分はほぼ共通のコンポーネントなのでテストに使ってるわけよ。

とりあえずなんかまたふざけたもの作るアイデアが出て来たので、セキュキャンの提出して気合があったら作ると思います。なんだか作らない気もしますがそれはそれとしてやってきましょう。

尊厳と無

完全に余裕がなく、精神を磨耗して来ていて、寛容の心を失いつつあって悲しくなって来たため、最低限の連絡を残し、インターネットへの発信を一定期間制限することにした。 これはその間に適当になんか書くか、と思い尊厳と無というタイトルをつけたが、特に意味はない。自分には尊厳などなく無だし。内容はよくわからん独白みたいなもんで精神がおかしくなるだろうから読むのはオススメしない。

基本的に自分は人間と殆ど関わらない。というかまともに会話する人間なんて家族かそれなりに近しい人間に限られる。 そのためあまり他の人間の感覚や倫理、道徳などの基準など分からず、今までも意識せず相手を侮辱してしまう*1ことも多く、そろそろ反省したいというか、直したいなと何度も思っている。

実のところ人間と会話するのはそれなりに好きで、社交的な会話ならそれなりに出来るつもりはある。が、コミュニケーションとしての会話、とりわけ雑談などあまり得意でない。そういう自覚がある

就活などでは、初対面の面接官などに対しては割と気さくに対応できていると思う。しかし、これが友人関係などになると途端に無理になる。 最近は高校時代の友人とも若干疎遠になってしまったし、Slackに現れてわけわからんこと言い合うみたいなチャンスも減って来て、どんどん孤独になっていく錯覚がある。現実かもしれないが。

大学に入ってからとことんダメになっていて、友人を作る感覚というか、人と仲良くする作法や様式などが全くわからない。 自分より年上の人間などだと理解があるというか、頭がいいのでこちらに合わせてくれたり、正しいことを教えてくれたり、やりやすく仲良くなりやすい気がする。 自分の場合ある程度仲良くなってからの作法が余計にわからなくて、高校のようなとりあえず行けば友人がいるみたいな状態ならずっと仲良くしていられるのだが、そうでない場合に自分から連絡を取って雑談したり、遊びの約束をしたりというのがとことん苦手で、他人と関わる方法を未だに覚えられていない気がする。

このあたりの感覚というものは人に相談できるものでもなく、逆に話せる相手というのはむしろ同様の感覚を抱えてる人間に限られると思うし、その場合その人間と仲良くなれるかと言われるとそんな感じはしないし辛いものがある。

最近はツイッターなどで不穏だの邪悪だの言われているが、自分は先述のことを考えると邪悪とかより単にかわいそうなんじゃないかなと結構思う。 ある意味そういったコンプレックスを覆うための邪悪や不穏の擬態をしているような気もするし、異常性も大したことないし、そうだとするとものすごい惨めな自己評価だなとなっている。

また、社交性を擬態してのコミュニケーションが得意だが、そうでない状態でそれができず、その状態は続けるほどに疲弊していく感覚がある。 しかし人間と話すの自体は好きで、それこそ就活なんかはそういう目的で行っていて、それで相手が合わないと感じたらそれでいいみたいな気持ち以上のことがなくて、真面目な気持ちなんて殆どない。無駄に嘘ついたり大げさなこと言うのも嫌だからなるべくESとかもやった仕事や趣味で書いたコードを書くだけだし、後は「楽しく仕事がしたい、技術が好き」ということしか書かないようにしているつもり。 脱線したが、そうして人と話しているのは楽しいが、疲れるということだ。 そうして疲れているからか、単に元からなのかはわからないが、今月は些細なことでもう二度もダメな状態になってしまった。 最初自分は悪くないとか思っていたが、悪くないわけなんてないし、なんなら自分が全部悪いと思う。人とまともに関わる術がない癖に他人に責任を転嫁するのは甚だおかしいと思うし、そんなことも理解出来ず勝手に憤ってイライラしてる自分に嫌悪感が出て来てしまいダメな状態が悪化している。 これはまさにダメな状態で書いていて、思考がまとまればいいなと思ったが普通にダメだった。文章もまとまってないし

この記事はとりあえず時間指定で公開しておくので、おそらく公開される頃には気分もマシになってるとは思う。が、とりあえずこういう鬱屈したなにがしかを記録に残しておくのもたまにはいいかなと思うのでそのまま残そうかなと思う。

*1:侮辱の意図は無いが