投稿

GO言語のgofmtの-tabオプションは、v1.2以降使えない

イメージ
こんにちは、ASD熊本の菊池です。 最近業務でGO言語を触る機会があったのですが、 インデントは必ずタブでそろえるという慣習に少し苦戦していました。 GO標準フォーマッタであるgofmtは、スペースをタブに変換してくれるのですが、 既にスペースインデントでGitに上げてしまっていた場合は比較が多少面倒...といった具合です。 gofmtにタブを使わないオプションがないか調べたところ、 「gofmtは、-tab=falseオプションを使えばスペースでインデントしてくれる」 という記事を見かけました。しかし... そんなオプションは知らんとGOに突き返されます。 まさかバグじゃないだろうなと本家のGitHubを覗いてみたところ、 バージョン1.3を境に-tabオプションが削除されていることを確認できました。 更にgofmtのコミットも確認したところ、理由とおぼしき記述が見られました。 私訳:  これらのフラグを持つことは「gofmtされたはず」のコードとして容認してもいい、と誤解させます。  組織がgofmtを内部的に異なる設定で使用したい場合、gofmtを簡単に変更することができますが、  オープンソースのコミュニティが使用する "gofmt"では、この古いスイッチをサポートすべきではありません。  -commentsフラグも削除します。  "cmd/gofmt: remove -tabwidth and -tabs flags・golang/go@014f3dc・GitHub"より引用   https://github.com/golang/go/commit/014f3dcc837cb6789076cff4fccaa3bd221f823e この修正の経緯としては、Git上で"gofmtの-tabs、-tabwidthフラグは削除されるべき" という旨のIssueが挙げられていたことから始まっていたようです。 意見のいくつかを要約すると... ・-tab,-tabwidthはGO言語の初学者を混乱させる可能性がある。 ・-tab,-tabwidthされたコードは、gofmtを通したGO標準のコードとは言い難い。 ・この機能を削除したと...

LINEBOTはなぜ自動で返信できるのか?

こんにちは、熊本事業所の清島と萓嶋です。私たちはLINEBOTについて説明したいと思います。 BOTとは人間の代わりに作業を行ってくれる自動化プログラムの総称です。 BOTにも様々な種類がありますが、LINEBOTはLINE上でユーザーの発言に対して自動返信を行う、チャットボットに分類されます。 皆さんはLINEBOTと聞いて何を思い浮かべましたか? 企業が定期的にプロモーションを行うBOTや、発言を他の言語に素早く変換してくれる翻訳BOT、AIを用いて自然な会話を行えるBOTなど、一度は利用したことがあるのではないでしょうか? 今回はLINEBOTの自動返信の仕組みについて解説していきたいと思います。 まず、ユーザーがLINEBOTへメッセージを送信します。 送信されたメッセージはLINEサーバを通り、BOTはそれをイベントとして取得します。 イベントにはユーザーの名前やID、リプライトークンが含まれており、 それを取得したBOTは返信プログラムを実行します。 リプライトークンは、特定のユーザーに返信するために使用されます。 取得したユーザーの名前を使うと、BOTが名前で呼びかけるような返信もできますね。 更に、BOTはメッセージだけでなく、 ユーザーが起こした動き(BOTと友達になる、グループに招待する、など)もイベントとして受け取ることができます。 皆さんも公式アカウントを友達登録した際、「登録ありがとうございます」という内容のメッセージを受け取ったことがあると思います。 これは、友達登録イベントを受け取ったBOTが、返信プログラムを実行しているからです。 ここまでBOTがイベントを取得する、と説明してきましたが、そのために必要なのがAPIです。 APIとはApplication Programming Interfaceの略で、プログラムを構築するために必要な機能を呼び出すものです。 また、APIはwebhookを用いてBOTへ中継しており、メッセージのリアルタイム受信を可能にしています。 APIを使うことで、テキスト形式での返信はもちろん、ユーザーに選択してもらうボタンを出現させたり、 画像とテキストを同時に表示したりできます。 また、最近のバージョンアップにより、クイックリプライ機能という、画...

SQLServerのインデックスを使用したパフォーマンスチューニングについて

こんにちは。福岡事務所の大迫です。 ソフトウェア開発においてデータベースは非常に重要な役割を果たします。 多くのソフトウェア、アプリケーションには何らかの形でデータベースが使用されており、データベースに対する実行命令であるSQLがプログラムに組み込まれています。 作成したアプリケーションの動作速度に問題が生じた際にSQLが原因となる場合も多く、データベースの設計、SQLの記述には細心の注意が必要です。 データベースの種類(Oracle,SQLServer,MySQL等)によって考え方が若干異なることがあり、幅広い知識が必要とされます。 実際にSQLの実行速度に問題があった場合、どのように対処するのが効率的かを普段業務で使用しているSQLServerの例を簡単に説明したいと思います。 SQLのチューニングには様々な手法がありますが、最も影響が大きいのはインデックスを使用する方法です。 インデックスとはその名の通りデータがどの場所にあるかを示す索引です。 辞書の索引をイメージするとわかりやすいと思います。 例えば辞書で「パフォーマンス」の意味を調べる場合は「索引を開く」→「ハ行を探す」→「目的のページを開く」という手順を踏むと思います。 索引が適切に掲載されていれば辞書の厚さ(データ量)がどれほど多くても検索に掛かる手間(処理時間)は変わりません。 インデックスを適切に設定、利用することはSQLのパフォーマンスを向上させる上で欠かせません。 SQLServerのインデックスには「クラスター化インデックス」と「非クラスター化インデックス」があります。 クラスター化インデックスはテーブルに対して1つしか設定できませんがデータが並び替えられて格納されるため高速に検索することができます。 特に指定していなければプライマリーキーはクラスター化インデックスで作成されます。 非クラスター化インデックスはテーブルに対して複数設定できますが、並び替えは行われない為、クラスター化インデックスに対して検索速度が遅くなります。 特に指定していなければユニークキーは非クラスター化インデックスで作成されます。 作成したインデックスの使用状況を知るためには、SQLServerで管理ツールの実行計画を使用します。 実行計画に表示される情報で特に注意すべ...

DNSフェイルオーバー

イメージ
Markdown to HTML 初めまして、ASD堤です。 今回はAWSの DNSフェイルオーバー機能 を利用して、サーバレスなSorryページの構築を紹介したいと思います。 Sorryページとは、Webサイトなどが障害やメンテナンスなどで停止している際に、アクセスしてきた利用者にその旨を告げるページのことです。 DNSフェイルオーバーとは? そもそも、 DNSフェイルオーバー とは何なのかを軽く説明します。 DNSは、たとえば example.com = XXX.XXX.XXX.XXX (IPアドレス) のように、「ドメイン名」と「サーバのIPアドレス等」を紐付けています。 この時に、XXX.XXX.XXX.XXX(Webサーバ)に何らかの障害が発生し、 サービスを継続できない状態に陥った場合に、 example.com = ZZZ.ZZZ.ZZZ.ZZZ (別のIPアドレス) に自動で変更する仕組みを DNSフェイルオーバー といいます。 つまり、あるドメインへのリクエストを受けたサーバに何らかの障害が発生していた場合に、ドメイン名を変更せずにそのドメインへのリクエストの受け先を変更する仕組みのことです。 ※ Route53が返却するIPアドレス 正常時: Primary ServerのIPアドレス 異常時: Secondary ServerのIPアドレス サーバレスなSorryページの構築 以下のような構成で構築していきましょう。 Route53がELBのヘルスチェックのステータスを確認し、ELBがhealthy(正常)ならばELB側のレコードを、ELBがunhealthy(異常)ならばCloudFront側のレコードをアクセス元に返すようになっています。 構築手順 ELB または EC2 ELBやEC2インスタンス等の特別な設定はありません。 S3 S3では以下の対応を行います。 Sorryページ用のBucketの作成 (Bucket名はドメイン名と同様) SorryページのHTMLをBucket直下に配置してアクセス権限をパブリックに変更 CloudFront CloudFrontでは以...

ソフトウェア長期保守のための仮想化環境について

こんにちは。福岡事務所の石橋です。 ソフトウェア開発では、OSのサポート期限が切れても長期保守が求められる場合があります。 (業務用ソフトウェアが想定よりはるかに長い期間使われるのは、よくある事です) このような場合、例えばWindows XPやWindows 7(2020年1月にサポート期限が切れます)の開発環境を残しておく必要が出てきますが、サポート期限の切れたOSはセキュリティパッチが提供されなくなるため、インターネットに接続するのは危険です。また、古いPCを開発環境として残しておいても、故障などでそれが失われてしまうリスクがあります。 そこで重宝するのが、仮想化環境です。 仮想化環境とは、簡単に説明すると「ホストOS上で(仮想的な)別のゲストOSを動作させる」ものです。 例えば、Windows 10(ホストOS)上でWindows 7やWindows XP(ゲストOS)を動かすことができます。 Windows 7(Professional版以上のみ)では、「Windows XP Mode」という仮想化環境が無償で提供されていました。これはWindows XPのライセンスを含んでいて、初めからXPインストール済みの状態で利用できます。 一方、Windows 8/8.1/10(Pro版以上のみ)については、「Hyper-V」という仮想化環境が無償で提供されていますが、ゲストOS及びそのライセンスは同梱されていません。ゲストOSのライセンスと、OSインストール作業が別途必要です。 また、PCに付属のWindows(OEMライセンス)は他のPCで使うことができません。 古いWindowsは入手が難しくなるため、あらかじめ確保しておくことが大切です。 ソフトウェア開発は、リリースや検収までで完了ではなく、その後には保守があります。 保守契約が有効な間は開発環境も残っているものですが、お客様の要望により、保守期間満了後も改修や不具合対応が必要になるパターンが意外と発生します。 あらかじめ仮想化環境を活用して備えておくことで、こういった場合に困らない体制を作ることが可能です。 皆さまもこの機会に、仮想化環境の構築を試してみてはいかがでしょうか?

Raspberry PiでIoTをはじめてみませんか?

こんにちは。 熊本事務所の庄村です。 さて、このブログをご覧の皆さん、IoTという言葉はご存知でしょうか? ネットやテレビなどのメディアを通じて、一度は見聞きしたことがあるかもしれません。 昨年2017年はIoT元年ともいわれており、 IT系界隈ではこの分野での動きが大変盛んになっています。 今回は、このIoTについて簡単にご紹介した上で、 IoTの自作がしやすいと注目されている超小型のコンピュータ 「Raspberry Pi」について、特にご紹介したいと思います。 <IoTとは?> IoTは「Internet of Things」の略で、「モノのインターネット」とも呼ばれています。 "アイオーティ"と読みます。 IoTの一例を挙げますと、 外出先から部屋の状況(温度、湿度)などを確認出来るIoT温度計などがあります。 上記の場合、センサーが検出した情報をサーバーに送信・蓄積、 サーバーデータを利用者の端末上で表示しています。 尚、上記の例は、IoTのほんのごく一部であり、実際にはもっと多種多様な活用例があります。 興味をお持ちの方は、IoT 活用 事例などのキーワードでWeb検索してみてください。 <Raspberry Piとは?> 前述のIoT説明では、センサーが検出した情報をサーバーに送信~、としておりましたが、 そこで、センサーとサーバー間の仲立ちの役割を果たすのがRaspberry Piになります。 Raspberry Piは、ラズベリーパイと読み、 英国のRaspberry Pi財団が開発したシングルボードコンピュータのことです。 日本では、ラズパイの愛称で親しまれています。 大きな特徴として超小型で低価格、標準でLANも搭載しており、 各種センサーなどを直接繋ぐことが出来る汎用I/Oポート(GPIO)を搭載している点があります。 このため、Raspberry PiはIoTの自作がしやすいとされています。 尚、Raspberry Piについては、少しWeb検索してみただけでもたくさんの使用例・活用例が出てきます。 また、Raspberry Piはその汎用性の高さから、IoTに限らずホビー目的で利用されている方もたくさんおられます。 ...

LINQを使用し、ソースコードの可読性を高める

こんにちは。福岡事務所の荒平です。 今回はソースコードの可読性を高める方法について説明していきたいと思います。 例えばC#で二つのDataTableを比べ、片方のTableにだけ存在するデータを取得したい、 というとき、皆さんはどのようにして処理を書きますか? ------------------------------------------------------- TableA TableB  果物  在庫数 果物  在庫数 リンゴ    100 リンゴ  130 ミカン  120 バナナ  120 バナナ  140 ブドウ  150 ブドウ  150 このTableAとTableBを比べ、TableAにしか存在しない果物(ミカン)のデータのみを取得したい ------------------------------------------------------- いくつか方法はありますが、このように考えた方もいるのではないのでしょうか? ・for文やforeach文などを二重にループさせ、  if文などで果物が両方に存在するかどうかを判定する しかし、この方法だと以下のようなデメリットがあります。 1. ネスト構造になるため、他の人が見た場合、可読性が低くなる 2. if文が必要になったり、あらかじめTableのレコードの並び順が決まっていないといけないなど、余計なコードが増えたり、前提条件が必要になる そこで、こういった問題を解決するために最近のC#ではLINQを使用します。 ちなみにLINQとはLanguage INtegrated Query(統合言語クエリ)の略で、 データの集合から特定のデータのみを取得したり、検索や集計などをしてくれる機能です。 ということでさっそくLINQを使用してみましょう。 -------------------------------------------------------  var Record = (from rowA in TableA.AsEnumerable()        where !((from rowB in Tab...