はじめに
最近弊社ゆめみでは, Twitter にて「ゆめみからの挑戦状」という企画を定期開催しています.
ゆめみの社員がプログラミングに関する問題を出して,皆さんに引用リツートで答えていただく,というものです.
歴代の出題者として Qiita でも有名な @Yametaro や @mpyw などがおりますが,今回は私が出題させていただきました!
また,Qiita に記事を投稿するのが数年ぶりで何故か少し緊張していますw
さらに,先に謝罪しないといけないのですが,以下のツイートで結果発表は【10/10(月)】て書いておきながら,10/10(月)が祝日だったことを失念しておりまして,本日の解答発表になります…!申し訳ございません
お題
弊社ゆめみが twitter 上で開催中の #ゆめみからの挑戦状 !
今回は私桑原から ワンライナー
に関する問題を出題させていただきました!本当はフロントエンド周りや JavaScript 周りの問題を出したかったですが,自分の発想力の乏しさを呪う…
画像が横に長くオーバーしてしまっているので,コードを改めて記載します💁
$ curl -sL https://notion.yumemi.co.jp/815649ec12304cd7a58ecd5eaee15789 | (ここを考える)
補足
これも私の日本語力が低いことで大変に申し訳ないですが,140文字だとしっかり書ききれなく,今回の出題内容だと以下の 2つの解釈が生まれる ことを分かった上で出させていただきました.
-
HTML
に表示される全ての文言の数をカウント -
HTML
に表示される文言から<script>
タグの中に登場するものは除外してカウント
また,この記事全般についても詳細なことは割愛して,ざっくり解説になることをご了承ください.
というわけで解答と解説
正解の数字1
上記の解釈の違いを踏まえ,正解は以下の2つになります!
-
HTML
に表示される全ての文言の数をカウント
→46
-
HTML
に表示される文言から<script>
タグの中に登場するものは除外してカウント
→25
2
問題のコードについて
まずは問題のコードのお話から💁ここはご存じの方も多いと思いますので本題に入りたい方は読みと増してください.読み飛ばしてください
curl
コマンド
釈迦に説法とは存じますが,ざっくりいうとフリーのオープンソースソフトウェアです.用途としては,主に HTTP リクエストを投げる際に使うコマンド(と思っています)で,色んなオプションを付けることでとても柔軟に設定できる優れ物でもあります.
今回調べて初めて知ったのですが GitHub リポジトリや
公式サイト
もあったんですねー.
-s, --silent
オプション
名前のとおりで,余計な出力はしないためのオプションになります.これを外すと,
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 213k 100 213k 0 0 1485k 0 --:--:-- --:--:-- --:--:-- 1485k
こんな感じでネットワーク周りの情報も出力されてしまいますので,除外しました💁
-L, --location
オプション
取得先のコンテンツにリダイレクトがあったらリダイレクト先の情報を取得するオプションです.短縮 URL のコンテンツを取得する際に使うイメージですね.念の為に付けておきましたが,今回は不要だったかもです
|(パイプ)
正式名称は パイプライン
といい,標準出力された内容を次のコマンドへ橋渡しするために使われるコマンドです.コマンドを続けて実行させたい場合に使用するイメージですね.
本問題の解答ワンライナー例
既に回答されている方と同じ結果になって申し訳ないですが,ドシンプルな解答としては以下のワンライナーとなります.
$ (省略) | grep -oi "キャリア" | wc -l
# => 46
▼ grep
コマンド
こちらもみんな大好きなコマンドではないでしょうか(笑)
マニュアルから引用しますと, 与えられた入力ファイルから1つまたは複数のパターンに一致する行を選択 してくれます.また grep は単純なパターンと基本正規表現 (BRE) に対して使用されます.
上の例では単なるパターン("キャリア")に一致させていますね.
▼ -o, --only-matching
オプション
名前のとおりで,行の一致する部分のみを出力します.
▼ -i, --ignore-case
オプション
grep コマンドはデフォルトで大文字・小文字を区別しますが,これを区別しないでマッチングを行うようにするためのオプションになります.
こちらも今回はカタカナということもあり不要のオプションとなりますが,知っておいて損はないなーと思って入れさせていただきました
▼ wc
コマンド
マニュアルの文言を拝借すると,各入力ファイル,または標準入力(ファイルが指定されていない場合)に含まれる行数・ワード数・バイト数を標準出力に含まれる行数・単語数・バイト数を表示するコマンドになります. 行は <newline>
文字で区切られた文字列として定義されているようですね.
今回はこちらを用いてカウントをさせています💁
▼ -l
オプション
各入力の行数を標準出力させるオプションになります.
▼ ちなみに -w
オプション
grep
コマンドの際に -o
オプションを用いているため, 今回は -w
オプションでも正解となります.
以上で一応解答例の解説は終わりですが,もう一つ
また,前述通り script
タグを除外したものについても例を書いておきます.
$ (省略) | sed 's/<script.*キャリア.*script>//g' | grep -oi "キャリア" | wc -l
# => 25
▼ sed
コマンド
ワンライナーといえば sed
コマンドと言って良い(個人の感覚です)ほどよく使われるのがこのコマンド.マニュアルによると stream editor
の略なんですねー.
で,
's/<script.*キャリア.*script>//g'
の部分で何をやっているかと言うと,正規表現で超雑に <script>("キャリア"を含む何らかの文字列)</script>
を空文字列に変換してしまいました.後は既に解説したとおりです. 正直なところ力技 なので綺麗な解答ある方ご教示いただけると大変ありがたいです
▼ 2022/10/18 追記
@ko1nksm さんにコメントで教えていただきました!
なるほど html2text
というコマンドがあるんですね.勉強になりました ありがとうございます!
$ curl -sL https://notion.yumemi.co.jp/815649ec12304cd7a58ecd5eaee15789 \
| html2text -utf8 | grep -o "キャリア" | wc -l
別の解答
いくつか別の解答をしてくださった方もいらっしゃいましたので,ここでご紹介させていただきます💁
他の言語を使用
いくつかのサーバーサイド言語で回答されている方がいらっしゃいました!
▼ ruby
▼ python
▼ perl
perl は私が1行も書いたことがないので,とても新鮮でした…!
違うコマンドを利用
▼ tr
コマンド
こちらはちょっとユニークな回答で,なるほどと
ざっくり解説致します.
まず tr
コマンドは translate characters
の略で,文字通り頭か末尾の文字を切るコマンドになります.でこちらのコマンドを利用して何しているかと言うと,
-
-d
オプションで\n(改行)
を切る - "ア" という文字を
\n(改行)
に置換 -
grep
コマンドの-c
オプションで "キャリ"を含む文字をカウント
wc
コマンドじゃなく,grep
コマンドの -c
オプションで終わらせるのが一味違って面白かったですが,ごめんなさい."ア" で区切る意図がちょっとわからず…
終わりに
まずはご参加いただいた皆さん本当にありがとうございましたー❗個人的にも改めての復習の機会になり大変に感謝申し上げます.また,今までワンライナーやったことない方に新たなエンジニア的な遊びの機会を提供できていたとしたら,出題者冥利に尽きます.
今回の問題は非常に単純なものな分,クイズ的なノリとしてはあまり面白くなかったかもしれません.3ここは自分の課題でもあり,良い経験をさせていただいたなと感じています.まぁ,私以外のメンバーがコンテンツ力ありすぎて,シャドー感じてますけどね!w
ではでは(=゚ω゚)ノ
前回: 【 #ゆめみからの挑戦状 ★第5弾】解答の紹介と総括
次回: 【 #ゆめみからの挑戦状 ★第7弾】解答の紹介と総括