投稿

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

特定の値まで素数を生み出すアルゴリズム in Python3

イメージ
特定の値まで素数を生み出すアルゴリズムとか 以下のようにリストで真偽値を管理するやり方で書くといいらしい。 Elements of Programming Interviews in Python  より。 # Given n, return all primes up to and including n. def generate_primes(n): primes = [] is_prime = [False,False] + [True] * (n-1) for p in range(2,n+1): if is_prime[p]: primes.append(p) for i in range(p*2,n+1,p): is_prime[i] = False return primes n = 100 print(generate_primes(n)) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

オンライン英会話(レアジョブ)を始めてほぼ毎日英会話をする生活が6ヶ月目に突入したわけですが。

イメージ
地道に継続中・・・ オンライン英会話だけの限界 実はこうなることはわかっていたのさ! 地道に継続中・・・ はい。 オンライン英会話を始めたのが8月でもう2月です。6ヶ月目に突入しました。 初期に一回サボったのとサービス自体のお休み(クリスマスと正月)以外は毎日何かしらのトピックについて英語で会話しています。 まぁこの記事読む人は「お前6ヶ月近く毎日やってるならちょっとは喋れるんだろ?お?」っていう感じの人が多いかと思います。 なんか収益化しているブログとかだと「英会話を続けた効果が凄すぎた・・・!!」みたいに色んな効果とかを派手に装飾したりSEOに特化したりとかでアクセス数を上手に稼いでいますが、このブログは今の所Google Adesenseの認可すら降りていないのでアクセスを集めたところで何の意味もないです。 なので一般人が英会話を地道にやってたらどうなるのかをリアルに書いていくのがいいのかなーって感じです。 それにしても僕もお金が欲しいのでAdesense申請したんですよね。でも申請してからかれこれ3ヶ月くらいGoogleさんから返事ないけど、僕の申請は次元の狭間にでも落っこちて帰ってこれなくなったんですかね。 Googleさんお返事くださいお願いします。 オンライン英会話だけの限界 ある程度詰まらずに話せるようにはなってきました。 僕が受けているのが実践ビジネスっていうビジネス英会話(月1万くらいだったはず)のコースなので、それっぽい表現を覚えたりとか、あとは困ったときに単語をググったらコミュニケーションで困らないくらいにはなっています。 これは嬉しい。 継続は力なりですね。 一方で、同じ語彙ばかり使っている、というのが(個人的に)かなり目立つようになってきました。 便利な表現を覚えるとそれ頼みになりがちなんですよね。 個人的に好きな英会話本で ペラペラビジネス という本があるんですが、そこで便利な定型文の一部だけ変えて使い倒せ!みたいなことが書いてあるんですね。 こと言語に関してはまさにその通りだと思うんですけど、僕の場合はそこの便利さにかまけて語彙とか表現を増やそうという努力をしてなかったというのが大きいです。 とにかく受け身で受けているだけ、そんな感じでした。まぁ少しづつ増えてはいるんですけどね ペー

Pythonでリストの中から被っている値を見つけよう!!LeetCodeの解法例あり

イメージ
リストの中から被っている値を見つけよう!! 基本 問題 解法 改良前 改良後 リストの中から被っている値を見つけよう!! という話。 見つけてその値を削除するなり、被っている値の数を数えるなり、被っている値は何なのかを返すなりは別にいいとして、個人的な方法をメモ代わりに取っておく。 基本 今回は考えやすいようにLeetCodeの問題を例に考えてみます。 問題 例えばこちら。 287. Find the Duplicate Number 難易度はMediumです。 問題としては与えられた数字のみのリストの中に1つだけ2つ存在する値があるのでそちらを探して欲しいという問題です。 例としては以下のような感じ。 Example 1: Input: nums = [1,3,4,2,2] Output: 2 Example 2: Input: nums = [3,1,3,4,2] Output: 3 Example 3: Input: nums = [1,1] Output: 1 Example 4: Input: nums = [1,1,2] Output: 1 解法 改良前 これの解放としてパッと思い浮かぶものとしては、二つのfor文で二つの値を比較しながら被っている値があれば行いたい処理を行う、というもの。 ただ、与えられたリストがソートされていないのでまずソートしないとその比較はできなくなります。 試しにPython3で書いてみました。 class Solution : def findDuplicate ( self , nums : List [ int ] ) - > int : ans = 0 nums = sorted ( nums ) for i in range ( len ( nums ) ) : for j in range ( i + 1 , len ( nums ) ) : if nums [ i ] == nums [ j ] : ans =

Arrayでのインクリメント方法で詰まったのでメモる。

イメージ
Arrayでのインクリメント スパッと思いつかなかったのでメモメモ。 ちなみに具体例としては、 array1 = [1,1,1] array2 = [1,7,9] だったら array1 = [1,1,2] array2 = [1,8,0] みたいな感じになるやつ。 実はLeetCodeでも解いたことがあったけど、 Plus One どうせならPythonっぽい答えを作ってみたかったので色々調べた感じ下のやつが良さげ。 def increment ( A : List [ int ] ) - > List [ int ] : A [ - 1 ] += 1 for i in reversed ( range ( 1 , len ( A ) ) ) : if A [ i ] != 10 : break A [ i ] = 0 A [ i -1 ] += 1 else : if A [ 0 ] == 10 : A [ 0 ] = 1 A . append ( 0 ) return A といった感じで行ける。あと読みやすい。 実行してみたら速度も気のせいか少し速くなった。 元々の解答 class Solution : def plusOne ( self , digits : List [ int ] ) - > List [ int ] : if digits [ - 1 ] < 9 : digits [ - 1 ] += 1 return digits elif digits [ 0 ] == 9 and len ( digits ) == 1 : return [ 1 , 0 ] else : digits [ - 1 ] = 0 digits [ 0 : - 1 ] = self . plusOne ( digits [ 0 : - 1 ] )