どさんこウェブ

自分で調べた技術ネタの備忘録的な感じで徒然とブログを書いていこうかな

docker-compose execコマンドがcronで動作しない

はじめに

個人開発してるバッチ処理でcronで定期実行するため、
docker-compose execコマンドで設定していたが、
正しく実行されなかった。

その原因と対処法について調査したのでメモ。

調査

cronの実行ログを確認したところ、以下の内容が出力されていた。

the input device is not a TTY

調査していくと docker-compose exec の場合、擬似TTYがデフォルトで割り当てされるためらしい。
ヘルプで確認してみた。

docker-compose exec -h
Execute a command in a running container

Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

Options:
    -d, --detach      Detached mode: Run command in the background.
    --privileged      Give extended privileges to the process.
    -u, --user USER   Run the command as this user.
    -T                Disable pseudo-tty allocation. By default `docker-compose exec`
                      allocates a TTY.
    --index=index     index of the container if there are multiple
                      instances of a service [default: 1]
    -e, --env KEY=VAL Set environment variables (can be used multiple times,
                      not supported in API < 1.25)
    -w, --workdir DIR Path to workdir directory for this command.

この影響でcronでコマンドが実行されなった模様。

対処法

cronで実行するには -Tオプション をつける必要がある。
ということで対処法は以下の通り。

# NG
docker-compose exec <サービス名> <実行コマンド>

# OK
docker-compose exec -T <サービス名> <実行コマンド>

ここで疑問

そもそも TTY ってよく理解できていないことが分かった。。
ということで追加で調べてみた。

TTYとは?

wikipedia の記述だと以下の通り。

ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。 元来ttyとはteletypewriter(テレタイプライター)のことを指す。

うん、よく分からん。。

もうちょっと噛み砕くと、SSHなどでサーバーに接速した際に一時的に割り当てられるデバイス名を表示する際に利用する。
個人的に利用する以下のサイトを見るとより理解しやすい。

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

おわりに

運用していないと気づかないことも多々あるなと再認識。
その都度知らないことがわかるので、それはそれで面白いと思った今日この頃。

参考サイト

今回も参考にさせていただいたサイトは以下の通り。
先人達の知恵に感謝。

WebSocketの再勉強

はじめに

WebSocketって具体的になんだっけ?とふと思ったので、改めて勉強してみる。

WebSocket

  • Webにおいて双方向通信を低コストで実現する
  • チャットアプリのように AB にメッセージを投稿して通知する時に利用されたりする
  • WebSocket登場以前はHTTPしか通信手段がなく、ロングポーリングを使って無理矢理に双方向通信を実現していた
  • ロングポーリングは無駄が多いし効率良い通信がいいよね、という背景からWebSocketが作られた感じ

実装してみた

Go言語の勉強も兼ねて、Qiitaで見つけた以下のプログラムを写経してみた。

Golang with WebSocket(Chat)

写経後、実際に動作を確認してみて大まかな処理は以下の通りだった。

  1. クライアント - サーバー間で接続を確立する
  2. クライアントからサーバーに対してメッセージを送信する
  3. サーバー内で受け取ったメッセージを処理し、接続中の全てクライアントに対して送信する
  4. クライアント側でメッセージを画面に表示する

おわりに

ざっくり概要を把握しながら、作ってみて理解することは改めて大事だなと再認識できた。
今後の仕事で役に立つといいな。

参考サイト

今回も参考にさせていただいたサイトは以下の通り。
先人達の知恵に感謝

Webアプリケーションの代表的な脆弱性を再度勉強

はじめに

最近、Webアプリケーションの代表的な脆弱性について理解が浅いと自覚して再度勉強したので、 それのメモです。

主な脆弱性

今回、勉強したのは次の3つ。

ひとつずつ見てみる

クロスサイトスクリプティングXSS

概要

Webアプリケーションにスクリプを埋め込むと動作する脆弱性があり、そこをを突いてくる攻撃のこと。
悪意あるユーザーがスクリプトを埋め込むことで、一般ユーザーのcookie情報などが盗まれる危険性がある。

主な被害

対策

スクリプトなどの特殊文字エスケープ処理を画面表示時に入れて無効化する。

クロスサイト・リクエストフォージェリ(CSRF

概要

webアプリケーションのサーバ側に脆弱性があり、意図しないリクエストを受け付けて動作してしまう。 例えば、ログインユーザーしか操作できないものに対して、悪意あるユーザーが不正なリクエストを送り付ける、など。

主な被害

  • 意図しない情報発信やサービスの悪用
  • 不正な書き込みや閲覧・設定の変更

対策

Formページ返却時のトークン付与する、リクエストする度にトークンを検証してリクエストの有効性を検証する。

SQLインジェクション

概要

画面などからユーザーが入力したSQLの文字列が、webアプリケーション上で実行されて情報が漏洩してしまうこと。

主な被害

  • DBに保存している個人情報などが漏洩
  • 重要情報の削除

対策

プログラム上でSQLを組み立てる時は、全てプレースホルダーで実装する。 ユーザーが入力した値を用いて、そのまま文字連結しないことが大切。

終わりに

脆弱性対策は改めて必要だと思いました。
ひとつの脆弱性が取り返しのつかない事態に発展するリスクに繋がると再認識できたのはよかったです。

参考サイト

今回も参考にさせていただいたサイトは以下の通りです。
先人達の知恵に感謝

テスト設計について

はじめに

仕事の出向先で結合テスト設計を担当しているのですが、設計にあたり色々と思うことがあったのでメモします。

困ったこと

炎上しかけてる案件に結合テスト設計要員として突如アサイン。それまでやってた作業を中断することに。。
SESという立場なので、客先の言うことに従うまでなのでしょうがないけど、思ったことは以下の2つです。

  • 仕様わかってないのに結合テストの設計とかめちゃくちゃだな。。
  • 完全に雑用要員だな。。

どうしたらいい

とはいえ、任された以上やらなくてはいけないので解釈を変える努力をしました。

がっつりテスト設計した経験はあまりないので、これを機会にちゃんと勉強しようと決意。
(解釈を変えて、腹落ちするまで1日かかりました。。)

やったこと

勉強しようと決意してからやってみたことをリストしてみます。

  • テスト全体の計画を立てる
    • テストの位置付け、範囲、確認方法などを記載
    • 正常系、準正常系、異常系の観点洗い出し
  • 関連するシステムを洗い出し、それぞれの状態をマッピング表で洗い出す
    • DBの場合、正常の起動している状態、停止している状態、など
  • テスト全体の構成を考えるにあたり、フローの分類を洗い出す
  • テストの観点出し(ここが一番苦労している)
    • DeNAがスライドシェアで公開しているテスト観点の取り組みの資料を参考に観点出しを行う

終わりに

絶賛テスト設計中ではあるが、ひとまず困った時の感情や解釈変えて切り換えるまで、その後のやったことをメモしようと思いました。

この記事を書いて思ったのは、文字に起こすと気持ちがスッキリするのとやったことの内容が整理されていいなと改めて実感。

参考サイト

今回も参考にさせていただいたサイトは以下の通り。
先人達の知恵に感謝。

Seleniumを使って自動足跡プログラムを作ってみた

はじめに

どうも44takaです。
最近、Seleniumの勉強も兼ねてマッチングアプリ「Omiai」にログイン、女性のプロフィールを見て自動で足跡をつけるプログラムをPythonで作ってみました。 (いいねを増やしたい、という下心がきっかけなのは内緒。)

Seleniumとは?

Webサイトを自動で動かす技術です。
よく自動テストで使われていますが、JavaScriptで画面描画するWebサイトの増加でスクレイピング目的で使うことも増えてます。

環境情報

自分のPCで作成したので、その時の環境情報をのっけます。

  • macOS Catalina 10.15.5
  • Docker version 19.03.12, build 48a66213fe
  • docker-compose version 1.26.2, build eefe0d31

処理の流れ

大まかな処理の流れは次の通りです。

  1. Omiaiのトップページにアクセス
  2. ログインページに遷移してFacebookログインを選択
  3. Facebookのログインページに遷移してメールアドレス、パスワードを入力してログイン
  4. Omiaiのプロフィール検索ページに遷移
  5. 画面をスクロールして表示女性を増やす
  6. プロフィール検索ページのHTMLをパースして表示女性の数をカウント
  7. 表示女性の数だけ1件ずつプロフィールを表示して足跡をつける
  8. 足跡をつけ終わったらSlackに完了メッセージを投げて処理終了

終わりに

自動足跡プログラムは利用規約に違反する可能性が高いので、利用するには注意が必要です。
特にプログラムを過剰に実行してサーバーに負荷をかけてしまうと、Omiai並びに他の利用者に多大な迷惑をかけてしまいます。
Omiai運営側に「迷惑をかけるやつ」と判断されると強制退会となり、2度とサービス利用できなくなります。
利用する際は迷惑をかけない範囲でやりましょう。

参考サイト

今回のプログラム作成にあたり、参考にさせていただいたサイトです。
先人達の知恵に感謝しかありません。

自己紹介

はじめに

今更ながらブログを始めてみようと思いました。
44takaです。
簡単に自己紹介をするとこんな感じ。

  • 北海道出身で上京9年目のしがないWebエンジニア
  • PHPPythonを主にやっている
  • アラフォーに差し掛かり、体の老いを感じる今日この頃
  • 老いに抗うためにランニングと筋トレを始めた

ブログタイトルの由来

最初に謝っておきます。
道産子なら知っているであろう夕方のワイドショー「どさんこワイド」のパクリです。

いい名前が思いつかず、北海道出身を前面に押し出すブログにしようと悩んだ結果なのです。
ブログを続けていく中でいい名前が思いついたら変えます。

何を書くの?

自分用の備忘録的な感じで技術ネタを中心に書いていこうかなと思ってます。
たまに運動ネタ、食べ物ネタも書くかもしれません。

最後に

完全にノリでブログを始めてみましたが、気が向くままに更新していこうかなと思います。
いずれは誰かの役に立つ情報も発進できるといいなと願ってます。