投稿

C#で配列操作の可読性を高めるには

こんにちは。福岡事務所の荒平です。 私は前回LINQを使用し、ソースコードの可読性を高める記事を書きました。 今回も可読性に注意しながら「配列などの複数要素から特定の条件に一致する先頭要素」を取得する方法について説明していきたいと思います。 さて、いきなり質問ですが、皆さんは配列から特定の条件に一致する先頭要素を取得したいときどのようにして取得しますか? ・配列の中をfor文などのループで回して条件に合う要素が見つかればそれを取得してbreakする… 条件に合った要素を取得することはできますが、可読性の視点から見るともう少しスマートに書きたい… そこで登場するのがLINQメソッドの「First」です。 ■Firstとは  配列などの複数要素のうち、先頭の要素(条件を指定した場合は条件に一致する最初の要素)を返すメソッド  ◆基本的な書き方①   value = 配列.First(条件);   このように書くだけで配列の中から条件に合った最初の要素をvalueに入れることができます。   しかし、条件に一致する要素が1つもない場合System.InvalidOperationExceptionの例外が発生してしまいますので、   実際にはより汎用的な「FirstOrDefault」というメソッドを使います。  ◆基本的な書き方②   value = 配列.FirstOrDefault(条件);   こちらは条件に一致する要素が1つもない場合は型のデフォルト値(0やnullなどデータ型ごとにdefault構文で取得できる値)を返します。     ここまで配列から要素を取得することについて書きましたが、もちろん配列だけではなく「List」などのコレクションにも使えます。 ■「Last」、「Single」メソッド  ちなみに類似機能として「Last」、「Single」があります。  (それぞれにXxxOrDefaultがあります)  Firstが最初の要素を返すのに対し、Lastは最後の要素を返します。  Singleは条件を満たす唯一の要素を返します。  しかし、Singleについては唯一の情報を取得する目的に使われるメソッドなので、条件に一致する要素が複数あった場合、  System.Inv...

Windows 10に.NET Framework 3.5が入らない?

イメージ
こんにちは。 熊本事務所の庄村です。 今回は、実際の業務中に遭遇したトラブルとその解決法についてご紹介したいと思います。 弊社で開発し、お客様に納品しているアプリケーションについて、 最近、Windows 10上で動作するか検証する機会がありました。 対象のアプリケーションは.NET Framework 3.5を使用しており、 現在はWindows 7上で運用していますが、近日中にOSをWindows 10に移行する予定のため、 OS移行前に動作検証しておく必要がありました。 事前の調べでは、Windows 10では追加のインストールが必要なものの、 .NET Framework 3.5はサポート対象となっているため、特に問題は発生しないはずでした...。 しかし、業務アプリケーションのインストール時に、 自動で.NET Framework 3.5のダウンロードインストールが実行された際、途中でエラーが発生。 改めて、Microsoftのサポートサイトを確認すると、Windows 8以降で発生する現象の様でした。 しかし、今回発生したエラーコード:0x800F0954とそれに対応する直接の対策手順は確認できませんでした。 エラーが発生するタイミングから、ダウンロードの時点で失敗しているようなので、 その後の調査で判明した、コンポーネントのダウンロード元を変更するグループポリシーを設定することで、 何とか.NET Framework 3.5のインストールに成功しました。 以下にその際の対応手順を記します。 1. グループポリシーエディタを起動する。 Winキー+Rキー押下で表示される、「ファイル名を指定して実行」に"gpedit.msc"を入力し、 [OK]ボタンを押して「グループ ポリシー エディター」を起動します。 2. オプションコンポーネントのインストール設定画面を開く。 上記選択行をダブルクリックします。 3. オプションコンポーネントのインストール設定を有効にする。 上記青枠を選択し、[OK]ボタンを押下します。 4. .NET Framework 3.5を有効化する。 上記1~3までの手順実施後に、コントロールパネルの...

SambaがWindowsサーバーの代わりになる理由

こんにちは。熊本事務所の上田です。 今回はSambaについてお話ししようと思います。 まずSambaとは何か? 一言で言うと、LinuxをWindowsファイルサーバーとして利用出来るソフトウェアです。 近年では、本家のWindowsサーバーに代わって多くの企業や官公庁などで基幹サーバーとして活躍の場が広がっています。 何故Windowsサーバーの代わりになるのか?そのポイントは3点あります。 まず、導入時の初期コストが抑えられます。 クライアントマシンになると一般的にWindowsになると思いますが、 WindowsOSをファイルサーバーとした場合、接続にCAL( = Client Access License)というライセンス料が必要なのです。 LinuxでSambaを利用する場合はCALの支払いが必要ありません。 次にランニングコストが抑えられます。 Windowsサーバー系のOSだと高性能なスペックを要求に対して、Linuxを動作させる場合は低スペックな性能でも十分です。 例えばWindowsXPやWindowsVista世代のPCでも問題なく動いてくれます。 また、OSのサポートが切れてしまった際新しいOSへ入れ替える必要が出てきます。 Windowsはライセンスの購入が必要なので有料ですが、Linuxなら無料。 古いPCを再利用することでハード面でもソフト面でも費用を大きく抑えることが出来ます。 最後はセキュリティです。 セキュリティ対策はWindowsもLinuxも大きな違いはありません。 ただ、セキュリティホールなどの問題が見つかった場合、問題が解決されるまでセキュリティが無防備となってしまいます。 WindowsはMicrosoftから修正プログラムが提供されるまで時間が掛かりますが、 オープンソースであるLinuxだと、世界中のプログラマーによって修正が行われる為比較的早く提供出来ます。 但し、Linuxの有料セキュリティソフトは法人向けが殆どなので、個人で使用する場合は注意が必要です。 私もファイルのバックアップ用途として運用を始めましたが、 自宅で使う分なら特に難しい設定を必要としませんので、Linux初心者でも手軽に利用できる点は素晴らしいと思いました。 使わなくなったPCやサーバ...

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では以...