Rubyの正規表現
こんにちは。 WYRDの豊田です。 持ち回りブログ3週目です。 早速ですが、みなさんはお休みの日はどのように過ごしていますか? 私たちの業界は基本的に土日お休みなことが多いのですが、私は特に予定がなければ技術的な勉強(本を読んだり、調べ物をしたり)に時間を割くことが多いです。 技術は物凄いスピードで進化・進歩していて、常にアンテナを張っていないとすぐに取り残されてしまいますからね。 「これだけ学べば十分」と思える日は来ないと思っています。 少し話が逸れてしまいました。 最近、弊社内ではRuby技術者認定試験に合格しようぜ!という機運が高まっています。 この間の浅野さんのブログ記事もSilverを受験するというお話しでしたね。(ここだけの話、合格したらしいですよ) ということで、私も今更ながらGoldの合格を目指して久しぶりに試験勉強を始めました。 今回は試験勉強の中で出てきたRubyでの正規表現について書いていこうと思います。 基本的なところ Rubyでは他の多くの言語で採用されているPerl拡張正規表現が採用されています。(完全互換ではないので注意) Regexpクラス 正規表現を使ったパターンマッチングを行うにはRegexpクラスを利用します。 Regexpはregular expressionの略ですね。 Regexp.new('hoge') === 'hoge' #=> true または、正規表現リテラルを使うこともできます。(生成されるオブジェクトはRegexpクラス) /hoge/ === 'hoge' #=> true %r{hoge} === 'hoge' #=> true パターンマッチ パターンマッチには以下の方法があります。 Regexp#=== Regexp#=~ String#=~ Regexp#match? ( Symbol#match?, String#match? ) ※ 2.4以降 /hoge/ === 'hoge' #=> true /hoge/.match?('hoge') #=> true :hoge.match?(/hoge/) #=> true # `=~` はマッチした位置を返す /hoge/ =~ 'hoge' #=> 4 'hoge' =~ /hoge/ #=> 4 # String#===は挙動が異なる 'hoge' === /hoge/ #=> false String#===は同値であるかの判定しかしません。 Regexp#match Regexp#matchメソッドを使えば、マッチするかの判定に加えマッチした情報の詳細を取得することもできます。 match_data = /\d/.match('hoge9') match_data.class #=> MatchData MatchDataクラスについては、話すと長いのでここでは割愛します。 MatchData - リファレンスマニュアル 先頭と末尾 これはRubyを使っていると一度は通る道だと思います。 /\A ... \z/とすることで、文字列の先頭と末尾を明示的に指定できます。 他の言語でいうところの ^ , $ です。 Rubyでも ^ と $ も使えますが、挙動が違います。 "hogehoge\n1234567890" =~ /\A\d+\z/ #=> nil # 行単位でマッチするか確認するので、改行コードが入っていると挙動が変わる "hogehoge\n1234567890" =~ /^\d+$/ #=> 9 あと /\A ... \Z/というのもありますが、あまり使わないので割愛します。 (知りたい方はググるとたくさん良い記事が見つかります) キャプチャと後方参照 キャプチャは正規表現では結構普通に使われるテクニックになりますが、Rubyでも利用可能です。 ()で囲んだ範囲がマッチすると、マッチした文字列を同一正規表現内で使ったり確認したりできます。 # キャプチャした文字列は \1 で後方参照できる /(\w+) of \1/ === 'hoge of hoge' #=> true # Rubyの実行環境内であれば $1 でキャプチャ文字列を参照できる $1 #=> 'hoge' 複数キャプチャした場合、\1, \2, \3... , $1, $2, $3... 数字を増やすことで後方参照できます。 名前付きキャプチャ \1 で後方参照するのは直感的ではなく使いづらい気もします。 そんな時はキャプチャには名前をつけて後方参照することができます。 名前付きキャプチャは (?<name>pattern) (or (?'name'pattern) )のように書きます。 後方参照時は \k<name> (or \k'name' ) と書くことができます。 /(?<number>\d+) and \k<number> is same number/ === '1 and 1 is same number' #=> true 名前付きキャプチャと前述の数字の単純なキャプチャは併用できません。"use name" と怒られます。 numbered backref/call is not allowed. (use name) また、 Regexp#=~ を利用した場合、キャプチャした文字列はローカル変数に代入してくれたりします。 (正規表現側に #{} による文字列展開が含まれていない場合に限定) /(?<name>\w+)/ =~ 'toyoda' #=> 0 name #=> 'toyoda' 部分式呼び出し マッチした文字列ではなくて、マッチした正規表現自体を呼び出すことも可能です。 \g<1> でキャプチャした箇所の "正規表現" を呼び出せます。 # /\d+-\d+-\d+/ と同じ意味 /(\d+)-\g<1>-\g<1>/ === '123-456-789' #=> true # 名前付きキャプチャも利用可能 /(?<num>\d+)-\g<num>-\g<num>/ === '123-456-789' #=> true なんかもういろいろ出来すぎて、そろそろ覚えていられなくなってきました。 あと少しで終わりにしようと思います。 先読み、後読み ある正規表現にマッチした位置より前(先読み)または後(後読み)にある特定の正規表現にマッチさせることができます。 肯定先読み(positive lookahead) マッチさせたい文字列の後ろに、さらに特定の文字列が続く場合にだけマッチさせたい場合に使います。 わかりにくいと思うので例を示します。 肯定先読みは (?=pattern) と記述します。 # "ですかね" が続く直前の数字を取りたい /\d+(?=ですかね)/.match('たぶん20ですかね') #=> #<MatchData "20"> 否定先読み(negative lookahead) 肯定先読みの逆です。 マッチさせたい文字列の後ろに、特定の文字列が続かない場合にだけマッチさせられます。 否定先読みは (?!pattern) と記述します。 # "ですかね" が続かない直前の数字を取りたい /\d+(?!ですかね)/.match('たぶん20ですかね') #=> #<MatchData "2"> 直感的でない動作だと思った方もいるかもしれませんので、簡単に説明します。 /\d+(?!ですかね)/ が意味するところは "「ですかね」が続かない数字" です。 20という文字列のうち 0は後ろに "ですかね" が続くので否定条件に合致します。(マッチしません) 2は後ろに "0" という文字が続くので否定条件に合致しません。(マッチします) 肯定後読み(positive lookbehind) 肯定先読みは後に続く文字を指定しましたが、後読みは先に来る文字列を指定します。 肯定後読みは (?<=pattern) と記述します。 /(?<=答えは)\d+/.match('答えは3600円でした') #=> #<MatchData "3600"> 否定後読み(negative lookbehind) 否定先読みと同じ要領で、先行する文字列を指定します。 指定した文字列に続かない文字列を条件にマッチします。 否定後読みは (?<!pattern) と記述します。 /(?<!答えは)\d+/.match('答えは3600円でした') #=> #<MatchData "600"> これも、否定先読みと同じ原理ですね。 "3" は否定されますが、それ以降の "600" は該当しないのでマッチします。 最後に Rubyの勉強していたはずなのに、なぜか正規表現の勉強をしていたなんてことは良くある話で... 他にも色々ありますが今日はこの辺にしておこうと思います。 いやー正規表現は奥が深い。 興味のある方はRubyの公式リファレンスを見てみてもいいかもしれません。
Ruby Silverを受験するので応援してもらいたい話
こんにちは。今年の1月に入社しました、浅野と申します。 早速ブログ当番が回ってきたので、この場を借りて、「資格を取るぞ!」という決意表明をさせてもらおうと思います。 ここで宣言してしまったら、落ちた時に恥ずかしいんですが、自分を追い込むスタイルでやっていきたいと思います★ で、何の資格を取るかといいますと、「Ruby Silver」を取ろうと考えています。 Ruby Silverとは、Ruby技術者認定試験のひとつで、Ruby技術者としてのスキルを認定してくれる試験です。Ruby技術者認定試験 公式ページ 内容としては、組み込みクラスのメソッドなど、基礎の理解度を問う問題が多いようです。もうワンランク上の試験として「Ruby Gold」というものもあります。Silverに合格したら、こちらにもチャレンジしたいな〜と考えています。 ここでちょっと弊社の宣伝をさせていただくと、弊社には、エンジニアのための資格支援制度があります。受験料を負担してくれたり、合格した場合はお祝いをくれたりします!(一定の条件はあります!) もちろん、それらを目当てに受験するわけではないですが、Ruby技術者認定試験は、1回の受験料が税込¥16,500(2021年2月現在)とブルジョア設定なので、個人負担となると、白目をひん剥いてしまいます。でも、会社が負担してくれるとならば、せっかくだしチャレンジしてみようかな〜と思えてきます。ありがたいことです。 そんな制度があることも、背中を後押ししてくれていますが、Ruby Silverを取ろうと思ったそもそもの理由は、下記の2点です。 Rubyの基礎を固めたい。 資格取得という分かりやすい指標があれば、自分の成長が実感できて、なんだかハッピーそう。 む〜ん、後者についてはなんとも頭が悪そう… でも、きっかけはなんであれ、勉強すること自体はいいことなので、こんな理由でもいいかな〜と思っています。 付け足しするのならば、私は過去の会社においては、日々の業務に追われまくって、自分の成長に目を向けられる時間なんて、あまりなかったような気がしています。むしろ、できないことに目がいったり、できる人と比較して落ち込むことの方が多くありました。でもそうではなく、比較対象を過去の自分とし、「自分ってめっちゃ進化してんなー、ポケモンかなー」と思えた方が、なんだか幸せそうです。だから、意識的にそういう機会を作り出そうと考えるようになりました。資格取得はその手段のひとつとして捉えています。 要は「自分に満足するために資格を取る」といった感じです。あれ、ごちゃごちゃ言ったわりにあまり格好良くない…汗 まあ、世の中には「資格の勉強なんて、実務で何の役にも立たなくて無駄!」という意見もあるようですが、実用性だけが全てじゃないと私は思っています。(あくまで個人の感想です。) と、こんな感じで今回は、「Ruby Silverを受験するぞ!」という宣言をしてみました。これが良い抑止力となり、私の109個の煩悩をうまくコントロールしてくれることを願ってやみません。 これで、「勉強していたのに、いつの間にか何時間もNiziUの動画を見ていた!」という事態には陥らないことでしょう! 次回担当する記事では、合格の報告ができたらいいな〜と思います。(全く関係のないことを書いていた場合はお察しください。) それでは、頑張っていきたいと思いますので、応援のほどよろしくお願いします!
Thunderboltブリッジ接続を試してみた
こんにちは 昨年ようやく岐阜関ヶ原古戦場記念館がオープンしましたが、まだ訪れていない小林です。 コロナウイルスの猛威が収まったら、行きたい場所ナンバー1です。 はじめに 最近は週の半分を会社でもう半分を自宅で作業しています。 それでは本題に入る前に私の仕事道具について紹介させてください。 メインのコンピュータはMacbook Pro(2019)です。こいつを会社に持っていって作業しています。 自宅では、さらにモニタ4枚、外付けのUSBキーボード、Bluetoothマウスを使っています。 モニタは数と質だよ、あにき〜。 もちろん、自宅で作業している時は、これらをMacbook Proに接続します。 快適ですね。 ただ、ただですよ。自宅には遊び用兼検証用兼予備としてMac miniがあるのです。 こっちを使う時も当然それらを使います。 毎回、モニタやキーボードのケーブルを差し替えるのが、面倒なんですよ。 皆さんもそう思うことがありますよね? え?思わない?嘘だと言ってよ、ば〜にぃ。 今回はそんな悩みを解決するための方法を紹介したいと思います。 まず思いついたのが、 作業した内容をUSBメモリ等に保存して、それぞれのMacにコピーすれば、「ケーブルを差し替えなくて良い」という点においては問題ありません。 ですが、今度はコピーし忘れたり、USBメモリを紛失してしまったら、目も当てられません。 Cloudに保存することも考えたのですが、どのサービスを利用するか、コスト的に等々検討するのが大変だったので、今回はなしです。 はっ!! Mac miniからMacbook Proにリモートアクセスすることができれば。 Macbook Pro上のファイルを直接操作することができれば、これらの問題を解決できるのではないでしょうか? 幸いにもMacには簡単にリモートアクセスする方法が複数提供されています。 では、どの方法が良いのかを確認していきましょう。 アクセス方法 SSH接続 確かにMacbook Pro上のファイルを操作できますが、せっかくのモニタやアプリケーションをいかせないので、試すまでもなく却下です。 参考:リモートコンピュータにMacへのアクセスを許可する 画面共有 画面共有であればGUIでぽちぽち触れるので、やってみました。 ターミナルでSSH接続するより、いいですね。VSCodeも使用できるし。 いやいや、せっかくマルチディスプレイなのに全然いかせていないです。 赤い枠で囲ったアプリケーション分のサイズでしか使用できませんでした。 しかも、ラグがありますし。 これだとMacbook Proを直接開いて作業した方が良さそうですね。 というわけで却下です。 参考:別のMacの画面を共有する ファイル共有(WiFi経由) MacOSではSMBを使用してファイル共有ができるらしいので、共有したいディレクトリをmountしてやれば、Mac mini上にあるディレクトリとしてGUIからも操作ができるのでは? mount -t smbs //ユーザ@ホスト名/マウント先のディレクトリパス マウント元のディレクトリパス しかし、まだ問題があります。WiFi経由で操作しているのでとにかく遅い。 1GBもあるディレクトリをコピーをすれば、数分かかる。 う〜む、発想自体はよかったと思うんだけどな。。。 参考:Macでファイル共有を設定する ファイル共有(Thunderbolt経由) さて、ここからが今回の本題です。 Thunderboltポートを搭載しているMac同士をThunderbolt対応のケーブルで接続し、インターネットプロトコルを利用して通信を行うことができるのです。(IPoverThunderbolt) Thunderbolt3であれば、転送速度が40Gbpsもあり、早そうですね。これは期待大です。 Thunderbolt 3 2015年6月にUSB Type-Cコネクタを利用し、転送速度40 Gbpsを実現するThunderbolt 3を発表した[10][11]。ケーブルはUSB 2.0と3.1(アクティブケーブルを除く)と後方互換性がある。アップルはThunderbolt 3を搭載したMacBook Proを2016年10月28日に発売した[12]。今では、ほとんどのMacに搭載されている。 https://ja.wikipedia.org/wiki/Thunderbolt#Thunderbolt_3 ベンチマークの結果は以下のようになりました。 WiFi経由の場合と比べると、圧倒的じゃないか、Thunderboltは。 参考:ThunderboltでIPを使ってMacコンピュータを接続する さいごに Thunderboltを使用することで、当初の目的を達成可能なことがわかりました。 同じ様に悩んでいる方、ぜひ試してみてください!
ドローンを動かすためにSwiftに触れた話
はじめまして。 今年の4月に入社しました新入社員の田中颯と申します。 さっそく本題ですがTello EDUをSwiftを使って動かしたいと思います。 こちらのドローンですが思ったより飛ぶ時の力があり、狭い場所で飛ばすのはあまりお勧めできません。 広さに余裕があるところで飛ばしてください。 今回のテーマを決めたきっかけですが ドローンを用いたプログラミングを題材に講義を開いてほしい とのお仕事をいただいた事がきっかけになりました。 講義の様子は後日またブログが更新されるかもしれません。 Tello EDU自体は子供でも簡単に飛ばして遊べる様になっているので、プログラミング初心者でも理解しやすいブロックプログラミングに対応はしているのですが... 今回は講義の相手は高校生ということもあり、 教える側としてはさらに掘り下げてSwiftも学習してみようかなという思惑で始めました。 まずSwift Playgrounds内のチュートリアルから触れてみる 1つ目のチュートリアルがこちら とりあえず実行して動作を確認してみましょう。 結果は、離陸->数秒(3秒)一定の高さで維持->着陸 という感じでした。 つまりtakeOff()ここの部分で接続しているドローンが離陸。 wait(seconds: 3)ここは離陸した状態から高度を3秒間維持。 land()ここで着陸という風に動いています。 チュートリアルとして項目が30個ほど用意されているみたいなのでとりあえず順番に目を通していきたいと思います。 チュートリアル半分くらい学習した結果 こんなコードがかけました! 上から順に、前10cm->右20cm->前40cm->左40cm->後40cm->右20cm->後10cm 少し前に出て一辺40cmの正方形を描き元の位置まで戻ってくるコードをかいてみました。 一応動画も撮ってみましたのでご覧ください!! https://www.youtube.com/watch?v=QsQP_j5QjmI 他にもいろいろ実装してみたものの家で飛ばすには広さが足りず断念... 使用した感想 結論から入るとプログラミングに触れた事がない人が勉強するのにちょうど良い教材かなと思いました。 途中までの感想ですがチュートリアルも親切です。 (英語版しかありませんが) 何より自分で組んだコードで思った通りに動いた時の達成感を味わえるのではないかなと思います。 ドローンを飛ばす経験ってそうそうできるものではありません。 お子さんがいる方は夏休みの自由研究なんかで取り上げれば家族の時間も作れて良い思い出作りにもなるのではないでしょうか? 以上で田中颯の初ブログ投稿を終わります。 読んでいただきありがとうございました。
メグロ(ニックネーム)- 2021年1月26日
鼻うがい
早いもので、1月も終わろうとしていますが、本年もWYRDをどうぞよろしくお願いします。 皆さんは、年末年始はどう過ごしましたか。 昨年一年はコロナ…コロナ…でした。。2021年もコロナの話題は尽きませんが、何かHappyな話題で盛り上がりますように!!と祈るばかりです。。 昨年より、メディア等でコロナ予防!予防!と言われています。我が家の娘たちにも出来る事はしっかり予防しよう!と話しましたので手洗い・うがい・消毒は言わなくても当たり前のように行えるようになりました。 手洗い・うがい・消毒以外に皆さんが行っているおススメの予防法って何かありますか? 私は、手洗い・うがい・消毒・”鼻うがい”をしています。 ”鼻うがい”これがとてもおススメです。 専用の容器にぬるま湯+市販の専用洗浄剤を混ぜ、片方の鼻に付けたら勢いよくPUSHすればもう片方の鼻から流れ出てきます。 水道水だと、鼻に水が入った時のあのツーンとするような痛みがあるのと水道水に含まれる塩素が粘膜を傷つけてしまうそうなのでお気をつけください。私が使っているものは全く痛みはありません。最初の数回は慣れずにいたので躊躇してしまい、うまくいかずに涙目になった事が数回ありましたが、今ではすっかり慣れました。 鼻うがいを始めたきっかけは耳鼻科の先生からおススメされたからなのですが、痛いイメージしかなかったので正直出来るなら避けたいと思っていました。しかし、私の鼻喉は、春から夏と秋から冬がどうも苦手との事で、毎年2回必ず耳鼻科にはお世話になっていました。その時に行う長い綿棒を喉上?に薬を塗る処置が物凄く痛いのでそれから逃げられるのなら試してみよう!と決意しました。ちょっと大袈裟ですかね。 そんな私が、なんと!!鼻うがいを始めてから約1年半になりますが、一度も受診せずにいられています!!勿論、コロナの影響で他の予防も今までより念入りに行っているのも効果があるのだと思いますが、私の中ではかなりすごい事ですので信じて続けていこうと思っています。 鼻うがいは、花粉や雑菌を洗い流すのにもとても優れているようなので、ご興味のある方は是非一度お試しください!!スッキリしますよ~☆



