投稿

Groovyの環境構築をした話。

イメージ
Groovyやろう Groovyやろう インストール そうしよう。 実践プログラミングDSL ドメイン特化言語の設計と実装のノウハウ でDSLという領域に興味が湧いたので本を読んでいくと、最初はJavaでプログラムを書いていたが、途中からGroovyがより表現力豊かで適しているという記述が。 ひとまず試してみるかぁということでLet’sインストール。 インストール macOSなのでHomebrewを使います。 $ brew install groovy インストール完了後にバージョンチェック。 $ groovy -version Groovy Version: 3.0.7 JVM: 15.0.2 Vendor: Oracle Corporation OS: Mac OS X $ export GROOVY_HOME=/usr/local/opt/groovy/libexec ついでにパスを通しておきます。 そんでもって起動。 $ groovyConsole & すると無事起動。 試しにHello World print "Hello World" するとHello World。 これだけだった。 Javaの環境構築してないとJVMのインストールとか入るのかな。

「問題解決力を鍛える!アルゴリズムとデータ構造」とLeetCodeで学ぶ再帰と動的計画法(メモ化)

イメージ
再帰とメモ化 問題 再帰とメモ化 問題解決力を鍛える!アルゴリズムとデータ構造 というアルゴリズムとデータ構造を学ぶのに良い本があります。 LeetCodeの問題を解いていた時に、この本の中で解説されていた例とすごく被っている内容があったので、記事にしてみようと思いました。 問題 1137. N-th Tribonacci Number 難易度はEasy。 再帰の入門にうってつけです。 問題解決力を鍛える!アルゴリズムとデータ構造 の4章の解説にもある通り、再帰関数のテンプレートは (戻り値の型) func(引数){ if(ベースケース){ return ベースケースに対する値; } func(次の引数) return 答え } 問題解決力を鍛える!アルゴリズムとデータ構造 第4章 設計技法(2):再帰と分割統治法より引用 といったものです。 今回解く問題は、 トリボナッチ数列Tnは次のように定義される。 T0 = 0, T1 = 1, T2 = 1, そして n >= 0 で Tn+3 = Tn + Tn+1 + Tn+2 となる。 nが与えられたとき、Tnの値を返す。 という内容です。 では、こちらをPythonでかつ再帰で解いてみましょう。 class Solution: def tribonacci(self, n: int) -> int: if n == 0: return 0 elif n == 1 or n == 2: return 1 return self.tribonacci(n-1) + self.tribonacci(n-2) + self.tribonacci(n-3) # Time Limit Exceeded しかし、これだとnが 30の時に時間切れとなり、正解とは認められません。 これは再帰で同じ処理が重複し、関数の呼び出し回数がとてつもない回数になっているためです。 ではこれを解決してみましょう。 class Solution: def tribonacci(self, n: int) -> int: memo =

エンジニアがレアジョブで100時間英会話レッスンを受けた話。

イメージ
めでたい それぞれの期間に考えていたこととか。 1ヶ月目 読んでいた本。 2ヶ月目 読んでいた本。 3ヶ月目 本 4 ~ 5ヶ月目 読んでいた本とか。 6ヶ月目~現在 読んでいた本とか。 これから めでたい ということで。 昨年の8月22日に始めてから1日サボったのとサービスのお休み(クリスマスと正月)以外は毎日話し続けました。前回それ関連で書いた記事が レアジョブ英会話を100回受講した話。 で、ノートを取るようになると定着率が高くなってどんどん楽しくなってきたのでそこからは続けていたらあっという間でした。 なのでやっと到達した・・・っていうよりはあ、もう?って感じでした。 ひとまずそれぞれの期間に感じていたこととかその時やっていた勉強法とかまとめていきます。 それぞれの期間に考えていたこととか。 1ヶ月目 英語話せないと今後大変そうだなー、と思い、勢いで登録しました。 暇だから課金したったwww pic.twitter.com/KngkOnJsdu — くえはる (@KueharX) August 22, 2020 その時のツイート ちなみに開始時のTOEICのスコアは800で、受験でそれなりに勉強してTOEIC対策をそこそこやったんだろうなー、っていうスコア。まぁ全く話せませんでしたが。 海外に住んでいたことも留学したことはないので純ジャパです、いぇい。 当初はとにかく受けるのが億劫、受けてる最中は必死に言葉を話そうとするけど出てこない。結局それっぽい表現を日本語でググってその場をやり過ごす。 終わった後に英語なんて話せなくても困らないしやめようかなと悩む。 それでも自分のお金と時間を使って勉強すると決めたのだからなんとか続けようと毎日受け続けました。 読んでいた本。 【音声DL付】改訂版 英会話ペラペラビジネス100 単行本 個人的にかなり好きな本。 便利な表現覚えて使い倒せばそれっぽくなるというのは確かになと思った。 2ヶ月目 まだまだ受けることが苦痛。 とりあえずレッスンを入れてその時間にPCを開いて頑張る。 ちょいちょい使えそうな表現を先生が教えてくれるのでそれを使ってやり過ごす。ちょっとずつ話せるようにはなるものの、レッスン終わりのフィー

Braveブラウザの同期機能をiPhoneで設定した話。

イメージ
Braveブラウザを使い始めて結構経った 設定 1 .同期ページを開く 2.QRコードの表示 3.iPhoneで読み取る Braveブラウザを使い始めて結構経った Google Domainsで独自ドメインを持っているBloggerをBrave Creatorsに登録した話。 この記事を書いた頃から僕はBraveしか使わなくなっちゃいましたね〜。 広告がないとネットサーフィンが捗りますし、Braveの直接クリエイターに貢献できるような仕組みが特に気に入っています。Blogger,ひいてはGoogle的にどうなんだって話もありそうですけど、ただのユーザなのでそんなのは気にせず便利なものは使います。 それで本題です。 タイトルのように今回同期機能を設定しました。 余計なことをしていたせいで少しハマったので設定ついでに誰かが困ったときに役に立つように設定方法を残しておこうかと思います。 ちなみにこちらの記事はPCの同期にiPhoneを追加するという設定方法についての解説です。iPhone→PCの同期方法などはまた別の話のようです。 設定 1 .同期ページを開く ブラウザのタブの右上にある上矢印のマークをクリックすると以下のような項目が表示されます。 こちらの同期という欄をクリックします。 すると以下のページが表示されます。 自動的に設定ページの中の同期欄が表示されるわけですね。 2.QRコードの表示 同期欄に同期済みのデバイスを管理という欄があるのでそちらをクリックします。 すると以下のようなページが表示されるのでそちらの中の新たなデバイスを追加、スマホ/タブレットという順にクリックしていくとQRコードが表示されます。 これでこのステップは完了です。 3.iPhoneで読み取る このQRコードをiPhoneで読み取っていく訳ですが、このQRコードはプリインストールされているQRコードで読み取っても正しく処理してくれません。 書いてある通り、iPhoneのBraveブラウザで読み取って上げる必要があります。 なのでひとまずiPhoneでBraveブラウザを開き、画面右下の**•••**という所をタップしてください。 すると上から二番目に歯車アイコンの設定が表示されますのでそちらをタップします。 初期表示で画面中部に表示さ

SMTPサーバのテストをしたくなったのでDockerで環境を作った話。

イメージ
SMTPサーバのテストをしたくなったので 環境 手順 1.イメージをビルドする 2.コンテナを起動する 3.telnetで接続する SMTPサーバのテストをしたくなったので ということ、ありませんか? 僕は最近試してみたいなぁと思いました。 なのでみんな大好きDockerで構築してみます。よくある動機ですね。 それで、調べてみるとDocker Hubに良さげな イメージ があったのでさくっと環境構築してみます。 なお、今回はDockerはインストール済みとしています。以下の環境で動かしています。 環境 Mac OS Catalina 10.15.7 Docker version 20.10.2 手順 1.イメージをビルドする こちら のDocker Hubに記載されているようにすれば基本的には起動できます。 本編とは関係ないですが、よくみたら最後に更新されたのが5年前になっていますね。 $ sudo docker pull catatnight/postfix 2.コンテナを起動する sudo docker run -p 25:25 \ -e maildomain=mail.example.com -e smtp_user=user:pwd \ --name postfix -d catatnight/postfix これでSMTPサーバが立ち上がりました。 一応 docker ps コマンドでコンテナが起動しているかを確認します。 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ********** catatnight/postfix "**/**/** '/**/**…" 3 minutes ago Up 3 minutes 0.0.0.0:25->25/tcp postfix 無事起動していますね。 3.telnetで接続する telnetで起動したSMTPサーバに接続しましょう。 なお、今回はMac OSです。 Mac OSではtelnetはプリインストールされていないのでHomebrewを使ってインストールします。 $ brew inst

LeetCodeのDatabaseカテゴリで見つけたTRUNCATE TABLEについて

イメージ
LeetCodeのDatabase問題にて。 181. Employees Earning More Than Their Managers という問題を解いた時の話。 LeetCodeのDatabaseカテゴリの問題では SQL Schema という欄があり、どういったクエリを実行して該当テーブルが作成されているか、またその中に入っているデータはどういったものかを見ることができる。 その中に TRUNCATE TABLE Employee という一文を見つけた。 Employeeはテーブル名なので TRUNCATE TABLE テーブル名 という使い方をするものなのだろう。 恥ずかしながら知らなかったので調べてみたところ、指定したテーブルの全てのデータを削除するという内容らしい。 これまではそういった操作はDELETE文で実行していたが、どうやらTRUNCATE TABLE文には以下のようなメリットがあるらしい。 オートインクリメントの初期化 大量のデータが存在する場合はDELETE文よりも高速であること オートインクリメントの初期化がされるのは知りませんでした。確かにDELETE文だと初期化されなかった記憶があるので助かります。 削除が高速なのはDELETE文はあくまで特定のデータを削除することに特化しているからなのだろうか?確かに全て消去しかないのと特定の条件を付けられるものだと後者の方が処理は複雑になる傾向があるが。ここら辺も根本的な理由を調べる機会を設けたいな。 一方で、DELETE文を実行した際のログなどを記録するようなトリガーを設定していても、TRUNCATE TABLE文はDELETE文とは関係ないので当然追跡はできません。そこには注意が必要ですね。

自作のChrome Extensionをインポートした時に "Invalid value for 'content_scripts[0].matches[0]': Empty path."というエラーが出たので解決した

イメージ
タイトル通りのエラーが出た。 Chromeの拡張機能を作っていたところ試しに作った拡張機能をインポートした時にエラーが出た。 調べてみるとmanifest.jsonでエラーが起こっているようで、タイトルのように、"Invalid value for 'content_scripts[0].matches[0]': Empty path."と表示されている。 manifest.jsonの中に書いたmatchesのインデックスの0番目がどうやら空のパスになっているらしい。 ちなみにmanifest.jsonは設定ファイルのようなもので、ここで定義している 'content_scripts[0].matches[0]'はGoogleのURI。 { "name" : "Example Extension" , "version" : "1.0.0" , "manifest_version" : 2 , "description" : "Sample Extension" , "content_scripts" : [ { "matches" : [ "https://www.google.com" ] , "js" : [ "content.js" ] } ] } という内容で、このディレクトリには他に content.js のみ。 なんぞやということで色々調べてみると単純に末尾にスラッシュが足りなかっただけのよう。 { "name" : "Example Extension" , "version" : "1.0.0" , "manifest_version" : 2 , "description" : "Sample Extension" , "content_scrip