Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2018年12月20日

Hashimoto Naoto

複数のファイルの中身を検索して、条件に一致した行だけ消す方法

ピクトリンク事業部開発部インフラ課の「アドベントカレンダー3記事目で若干ネタ切れの気配を感じ始めたエンジニア」の橋本です。

むしろ12月中はもろびとがこぞってアドベントカレンダーするので、6月くらいにやったほうが目立てるんじゃないかなとか現実逃避しています。梅雨明けとか讃えましょうよ。

 

本記事は フリューAdvent Calendar 2018 の12/19の分です。

今回は、複数のファイルに横断検索をかける方法、ヒットした情報だけを消す方法をご紹介しようと思います。

どういう時に便利?

いろんな場面で活用できる余地のあるテクニックだと思いますが、実例をあげるとメーリングリストの管理などに便利に使えます。

mlsample1

このように、ひとつのメーリングリストにユーザ名を連ねる形で運用している場合を想像してみてください。
社内の関係者に一斉に情報が行き渡るよう、いい感じにメーリングリストが構築されているような環境ですね。

 

この状態で、「桐島、弊社やめるってよ」と言われた場合にリストの管理者がやらないといけないのは、

mlsample2

ファイルの中に「桐島」が含まれるものを全て探し、

mlsample3

このように「桐島」を削除した状態で上書き保存する必要があるはずです。

 

この例だとファイルは3つだけですが、これが20も30もあったら大変面倒なうえに、そのうち作業ミスも発生しかねません。

 

これをスクリプト一発で終えることができたら幸せですよね!

実際のスクリプト

以下の例は「ファイル名が.qmail-から始まるファイルから対象者を探して消す」スクリプトです。

以下のようにして使います。例のごとく実行権限付与を忘れずに。

実働部分の解説

「本当に消していいの?」と聞く部分が長いだけで、中身は至ってシンプル。

これで探して、出てきたファイルのリストを

これで対象者を削除して上書き保存しているだけです。グッバイ桐島。また会う日まで。

 

対象となるファイル名の.qmail-* があまりにも長すぎるとオーバーフローを起こしてしまう可能性があります。その場合はxargsを使うなど調整してみてください。

おわりに

今回はメーリングリストの管理を例にしましたが、

「複数にまたがったファイルから条件に合致するものだけを探す」

「ヒットしたものを置き換える、削除する」

などの操作は、ときおり発生するものです。

 

一回だけで済む場合はこの限りではありませんが、何度もやらないといけない可能性がある場合は、少しでも楽に運用できるようにしていきたいものですね。


2018年12月19日

furusin

私が勉強会の開催を推し進めるモチベーション

こんにちは。ピクトリンク事業部の古川です。

この記事はフリューAdvent Calendar 2018の12/19分となります。
エンジニアの登壇を応援する会 Advent Calendar 2018 に触発されて、
「なぜ私が勉強会の開催を推し進めるのか」をブレイクダウンしていきます。

はじめに

どんな勉強会をやってるのか

京都Devかふぇという勉強会を、だいたい隔月で開催しています。
技術関連の情報共有や関西の参加者同士の交流を目的としています。

我々は京都で働いていますので、関西の技術交流をもっと活性化し、関西の技術レベルの向上に少しでも貢献できればと考えております。

また、個人的には

Kansai.kt
大阪開催 北海道応援プロジェクト 小春の大LT大会!
v-kansai
にも参加しています。

そもそも

なぜ勉強会をやろうと思ったか

私自身、元々は非常に非常に非常にヒジョーーーーーーーーに引っ込み思案でして、人前に立つとか、
ましてや勉強会をやろうだなんて考えもしませんでした。

そんな私を、10年ほど前にコミュニティに誘って頂いたのが大きな転換期でした。
それ以来、コミュニティの中で活動することの楽しさを覚え、積極的に外部へ発信していくようになりました。

「コミュニティの中で活動することの楽しさ」とは

以前、Qiitaで私が個人でアプリ開発を続けるたった1つの理由でも触れましたが、
「楽しい」にもいくつか種類があります。

 

私が感じる「コミュニティの中で活動することの楽しさ」とは・・・
・自分の知り得なかった情報を知ることができる
・たくさんの「はじめまして」がある
・参加者みんなが楽しそうにしている

 

以上の3点に分類されました。
それぞれ噛み砕いていきます。

自分の知り得なかった情報を知ることができる

エンジニアとしての「知的好奇心が刺激される」といった表現が正しいかもしれません。
「すっげぇぇーー!!!こんなことできるのかよーーー!!!」
といった新しいことを知れる。楽しいですね!

とてもコアな情報や「こんなのどこで使うんだよ…」といったニッチな情報も多く出てきたりもしますが、
それはそれで「マニアックだなぁ!」という面白さがあります。楽しいですね。

たくさんの「はじめまして」がある

これは更に2つに分類されます。
・初対面の方と出会う
・初対面の技術と出会う

後者は上で述べたことです。
前者は参加者との出会いです。

 

参加者の皆さんには十人十色のバックグラウンドがあり、色々な知見や視点を持っていらっしゃいます。
そのような方々と技術的な議論をしたり、プライベートなお話をするのは非常に刺激的です。
楽しいですね。

 

京都Devかふぇの常連さんで、日本在住のカナダ人の方がいらっしゃいます。
個人的には、この方とずっと英語で会話しているのも非常に刺激的で、英語の勉強にもなるので非常に楽しいです!

参加者みんなが楽しそうにしている

私はディズニーリゾートが大好きなのですが、その理由が
「ゲスト(お客様のこと)の皆が、キャスト(従業員)の皆が、全員が笑顔なこの空間。幸せで溢れてる!!」
ということです。

勉強会では、人々の笑顔を見れる。その笑顔を作り出すことができる。
最高じゃないですか!すごく楽しいです!

 

また、運営として助けてくれているメンバー(足立荒木ジョン橋本まさお)の皆も
とても楽しそうに活動してくれているのも、私にとっては非常に嬉しい、楽しいことのひとつです。
感謝感激雨あられです。

 

私にとっては、ここの「楽しい」が最も大きな比重を占めています。

人々が笑顔になれる手助けを少しでもできればと思っています。

まとめ

私にとって、 楽しい とは
・知的好奇心が刺激される
・たくさんの出会いがある
・笑顔に溢れる幸せな空間に居る

この3つに分類されました。
「なんで勉強会やってるの?」の答えは一言で「楽しいから」ですが、色々な意味が込められていることが改めてわかりました。

これからも、もっと皆さんに楽しんでもらえて有意義な勉強会を企画していきたいと思っています。


2018年12月18日

Kayo

Ansibleで連番の複数ホストを指定できなかったのでその原因と対策

みなさん、こんにちは。ピクトリンク事業部インフラ課の藤本佳世です。

フリュー Advent Calendar 2018の12/18分の記事になります。

 

先日、SSL証明書の更新をAnsibleで実施しようとコードを書いていた時にはまった

「Ansibleで連番の複数ホストを指定できなかった件」について、シェアしたいと思います。

みなさんも、「これで動きそうなんだけど、なぜ動かない!!」と思ったことあるかと思います。

今回、私もそんな状況になってしまいました。

※Ansibleについては、以前ブログを書いているのでこちらをご覧ください。

やりたかったこと

今回やりたかった作業はSSL証明書の更新です。この作業をAnsibleで実施しようと考えました。

サーバ ドメイン
test-web-01~05 hoge.com
test-web-06~10 fuga.com

SSL証明書の場所は下記の通りです。

Webサーバ証明書ファイル /usr/local/ssl/server.crt
Webサーバの秘密鍵ファイル /usr/local/ssl/private.key
中間CA証明書ファイル /usr/local/ssl/server_ca.crt

ここで注意ポイントがあります。
test-web-01~test-web-05はドメインhoge.comの証明書
test-web-06~test-web-10まではドメインfuga.com証明書
のように、サーバによって証明書が異なることです。

実際のAnsibleコード

role配下のmain.ymlはこんな感じで書きました。

playbook.ymlはこんな感じです。

サーバによって証明書が異なるので、when句を使って
test-web-01~test-web-05はhoge_com
test-web-06~test-web-10はfuga_com
のように指定したつもりでしたが、うまくいきませんでした。

ex) test-web-05, test-web-10に対して実行した結果

エラー出力されませんが、すべてskippingされた状態になりました。

対処法

下記のようにplaybook.ymlを修正しました。

inventroy_hostname(ホスト名)の数字の部分だけを取り出し、「5以下」、「6以上」と識別するようにしました。
公式ドキュメントにも書いている通り、CentOSのバージョンによって処理を分けることもできます。

Tip: Sometimes you’ll get back a variable that’s a string and you’ll want to do a math operation comparison on it.

このTipsは今後も使えそうです!

だめだった方法

記述方法をいろいろ替えてやってみましたが、うまくいかず。。。

こちらの記事を参考にしてみましたが、うまいかず。。。

うまくいかなかった問題に関しては、また時間がある時に調べてみたいと思います。

最後に

2018年度の私の投稿はこの記事で最後になります。

2018年は大変お世話になり、ありがとうございました。来年もどんどんブログを書くつもりなので、

今後ともどうぞよろしくお願い致します。

 

みなさまにとって2018年は素敵な年となりましたでしょうか?
願わくは、2019年も素敵な年となりますように★


2018年12月17日

adachi

Reactive Swift に Completable 的なものを導入した話

こんにちは。
ピクトリンク事業部の足立です。

ピクトリンクはプリントシール機で撮影した画像データを使ったコミュニケーションツールで、私はそのiOS版のアプリの開発を担当をしてます。

 

最近は、12/10に遅ればせながら、スマブラSPを買いました👋
一応ほぼ全作やっているので、使命感に駆られるように、大乱闘を繰り広げる毎日でちょっと寝不足気味です😪
アドベンチャーモード、ふつうレベルでも意外に難しく苦戦しています。楽しいです✨

 

では、本題に入りたいと思います。

 

この記事は フリュー Advent Calendar 2018 の 12/17(月) の記事になります。
今回はピクトリンクアプリの開発で導入している Reactive Swift をプロジェクト内でカスタマイズしたお話です。

 

きっかけ

ある日のPRレビューを実施していた時のことです。
 
足立
  「ここ SignalProducer<Void, HogeError> なんですけど、呼び出し元が observer.sendCompleted() しかしていないので then(_:) で繋げないと動かないと思いますよ」

メンバーM
  「え、そうなんですか? I/Fの定義だけだとわかりにくいし、なんとかならないんですかね」
 

的な会話が繰り広げられていました。

たしかに、SignalProducer<Void, HogeError> だけを見ると completed イベントしか通知されるとは思いませんよね。
実装をするたびに、関数の中を調べるなんて時間の無駄ですし、そんなわかりにくい設計は無くすべきです。

 

ということで Completable 的なものを導入する

「じゃあ、どんな感じにしようか?」
 

と、設計しているときに「完了のみの通知だし Completed? Completable? 的な感じですかねー」と進んでいき RxSwift 的には似たような機能はないのか?
と調べ始めました。
 

ありました。RxSwift / Completable

Completable についての詳しい説明はここではしませんが、 Completable そのものを返却できるような設計のようです。
Reactive Swift でそこまでのカスタマイズをするとなると、とてもじゃあないですが大変です💦
 

そこで、弊社iOSアプリ開発チームでは 専用のオブジェクトを通知することで Completable のような扱いにする としました。

 

やったこと

  • 通知に使う専用のオブジェクトを作成
  • Completable の時に使わないメソッドの非推奨化

 

通知に使う専用のオブジェクトを作成

こんな感じで Completable を定義しました。

`Completable` の時に使わないメソッドの非推奨化

通知されるイベントが completed のみになるので、間違った実装にならないために、 SignalProducerSignal などで定義されている幾つかのメソッドを利用させないようにします。
ReactiveSwift / UninhabitedTypeGuards.swift を参考にしました。
 

主に startWith***flatMap など value イベントの通知で使用するメソッド周りです。
以下は SignalProducer 周りの定義を抜粋しています。

 

使い方

基本的には通常の Reactive Swift の実装通りです。
Value の指定を Completable にするだけです。

 

まとめ

導入した結果としては、とても良かったと思います。
きっかけ でも触れましたが、PRレビューの際の
 

  • completed イベントのみしかこない実装ではないか?
  • value イベントが通知される前提の実装になっていないか?
     

などの、メソッドの定義をだけでなく実装の中身まで遡って見る必要がなくなったと思います。
   = PRレビューでの不要な指摘も減る(する側もされる側もハッピー😉)
 

実装するときも CompletableTypeGuards.swift の設定のおかげで間違った実装を防げるのも地味に良かったりします。
慣れていけば 使えない ことはわかっていきますが、プロジェクトにJOINしてきた人たちにとってはWarning表示という目に見えるカタチで知らせてくれるのも良い感じです。
 

と、ここまで良かった点を書いてきましたが、念のために。
Completable の使用にあたっては用法/用量をまもって欲しいと思います。
便利だからといって 「本当に Completable の通知で良いのか?」 という「その機能の責務」を考えずに実装を進めることは、その時は良くても数週間後、数ヶ月後にタイヘンなことになるかも・・・😇

 


2018年12月14日

araki

Google Apps Scriptで勤怠管理用のSlack Botを作りました

この記事は フリューAdvent Calendar 2018 の12/14分です。

こんにちは。ピクトリンク事業部開発部の荒木です。普段はピクトリンクというアプリのAndroid版を開発しています。最近発売されたスマブラSPが気になっていますが、時間が溶けるのが怖いので買うかどうか悩んでいます。

今回の記事では、Google Apps Scriptを使って勤怠管理用のSlack Botを作った話をしたいと思います。

作ったもの

Slackの勤怠管理チャンネルに、今日誰が休むのかを投稿してくれるBotを作りました。これまで、今日誰が休むのかはSlackチャンネルを遡らないと分かりませんでしたが、このBotによってその問題が解決されました。

以下のように、勤怠の情報を勤怠管理チャンネルに投稿しておくと

スクリーンショット 2018-12-12 10.46.37

毎日、始業前に今日の勤怠情報を投稿してくれます。

スクリーンショット 2018-12-12 10.40.44

※ FTはフレックスタイムのことです。

使っているもの

勤怠管理Botで使っているものは、以下の2つです。

Slack Outgoing Webhooks

Slack Outgoing Webhooksは、Slack上の特定の文字列をトリガーとして指定したURLにPOSTリクエストを投げられる機能です。POSTリクエストには、投稿者や投稿した本文といった情報が含まれています。

Google Apps Script (GAS)

Google Apps Script(以下ではGASと呼びます)は、Javascript互換のスクリプト言語です。特徴は、Google Apps(Googleドキュメントやスプレッドシートなど)を操作するためのAPIが用意されていることです。また、GASはGoogleドライブ上で保管され、時間やHTTPリクエストをトリガーにして動作させることが可能です。

システム構成

勤怠管理Botのシステム構成は以下のようになっています。動作は、勤怠記録と勤怠集計に分かれます。

KintaiBotシステム構成

勤怠記録

スクリーンショット 2018-12-12 10.46.37

上記のような勤怠に関する投稿をスプレッドシートに記録します。

Slack Outgoing Webhooksによって、GASの勤怠記録コードにこの投稿の情報が含まれたPOSTリクエストが投げられます。
勤怠記録コードは、

  • 勤怠対象日:上記の投稿では 12/11
  • 勤怠種別:FT
  • ユーザー名:araki
  • 本文:【FT申請】2018/12/11(火) 10:30 私用のため
  • SlackのユーザーID:POSTリクエストに含まれているSlackのユーザーID

を記録します。勤怠対象日と勤怠種別については、投稿の本文から正規表現で抽出します。

実際に勤怠情報をスプレッドシートに記録する部分は以下のようになっています。最後の行で、GASのAPIを呼び出しています。

※ GASではなくTypeScriptで書かれています。claspというツールで、GASに変換して使っています。

勤怠集計

スクリーンショット 2018-12-12 10.40.44

「Reminder: 今日の勤怠は?」という文字列をトリガーにして、Slack Outgoing WebhooksでGASの勤怠集計コードにPOSTリクエストを投げています。

今日の勤怠情報のみを集計する部分は以下のようになっています。

※ このコードもGASではなくTypeScriptで書かれています。

作ってからのこと

自分や一緒に働くメンバーからどんどん要望が出てきたので、少しずつ叶えていきました。

  • 勤怠種別ごとに出力してほしい
  • 出力のインデントを整えたい
  • 登録できたことを通知して欲しい
  • 現在登録している勤怠情報を出せるようにしたい

まだ叶えていない要望もあります。

  • 間違えて登録した勤怠情報を削除したい
  • 曜日も出して欲しい

これだけ要望が出てくるということは、みんなにあるのが当たり前と思ってもらえるようになったのかなと思います。

さいごに

今回、勤怠管理Botを作ってみて、GASで気軽にいろんなことができるということがわかりました。何より、自分が作ったものが一緒に働いているみんなに使ってもらえて、直接フィードバックがもらえるというのがとても嬉しい体験でした。

みなさんも、Google Apps Scriptで何かを作ってみてはいかがでしょうか?