tag:crieit.net,2005:https://crieit.net/tags/.NETCore/feed 「.NETCore」の記事 - Crieit Crieitでタグ「.NETCore」に投稿された最近の記事 2020-12-09T12:41:39+09:00 https://crieit.net/tags/.NETCore/feed tag:crieit.net,2005:PublicArticle/16315 2020-12-09T02:33:59+09:00 2020-12-09T12:41:39+09:00 https://crieit.net/posts/NET-Interactive-C-PowerShell .NET Interactive で C# と PowerShell を股に掛ける <p>この記事は、「<a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2020/csharplang">C# Advent Calendar 2020</a>」 9日目の記事、かつ 「<a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2020/powershell">PowerShell Advent Calendar 2020</a>」 9日目の記事だ。</p> <p>スミマセン。横着した。</p> <p>この時期になれば .NET Interactive の Preview 4 が出てるだろうしその記事でも書こうかな~ などと目論んでいたものの、 残念ながら登場しなかった。</p> <p>このため、 .NET Interactive .NET 5 対応版の導入と、 Variable sharing の内容でお茶を濁そうと思う。</p> <p>.NET Interactive のなんたるかについては、以前の以下の記事で取り扱っているので、そちらを参照願いたい。<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1379">.NET Interactive の C# REPL を Jupyter で | Aqua Ware つぶやきブログ</a></p> <h2 id=".NET Interactive を .NET 5 で動かしてみる"><a href="#.NET+Interactive+%E3%82%92+.NET+5+%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">.NET Interactive を .NET 5 で動かしてみる</a></h2> <p>いきなり本題とは関係ない話になるが、 せっかく .NET 5 がリリースされたところなので、 .NET Interactive を .NET 5 で動かしてみよう。</p> <p>12/8 現在、NuGet で公式にリリースされている .NET Interactive は、 9月にリリースされた <a target="_blank" rel="nofollow noopener" href="https://devblogs.microsoft.com/dotnet/net-interactive-preview-3-vs-code-insiders-and-polyglot-notebooks/">Preview 3</a> に少し更新が加えられた、 <a target="_blank" rel="nofollow noopener" href="https://www.nuget.org/packages/Microsoft.dotnet-interactive/1.0.155302">1.0.155302</a> だ。<br /> これは、 .NET Core 3.1 上に構築されている。</p> <p>一方で 11/27 頃のビルド (<a target="_blank" rel="nofollow noopener" href="https://github.com/dotnet/interactive/commit/61d231529ce8657172c65b389e3524ae72cd30b7">dotnet/interactive@61d2315</a>) あたりでは、既に .NET 5 対応が済まされている。</p> <p>更に、 何故か <a target="_blank" rel="nofollow noopener" href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode&ssr=false#version-history">Visual Studio Code の .NET Interactive Notebooks 拡張では、 .NET 5 に対応した 1.0.160204</a> がリリースされている。</p> <p>このため、 現時点で .NET Interactive で .NET 5 を扱う主な方法は、以下の通り。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mybinder.org/v2/gh/dotnet/interactive/main?urlpath=lab"><img src="https://static.mybinder.org/badge_logo.svg" alt="launch binder" /></a> main ブランチの binder コンテナにアクセス</li> <li>Azure DevOps の CI ビルドの NuGet feed (<a target="_blank" rel="nofollow noopener" href="https://dev.azure.com/dnceng/public/_packaging?_a=feed&feed=dotnet-tools">dotnet-tools</a>) から、 <a target="_blank" rel="nofollow noopener" href="https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-tools&package=Microsoft.dotnet-interactive&protocolType=NuGet&version=1.0.160204&view=overview">Glogal Tool</a> を DL <ul> <li>実行例:<br /> <code>powershell dotnet tool install -g Microsoft.dotnet-interactive --version 1.0.160204 --add-source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json</code></li> </ul></li> <li>VS Code Insider を起動し、 <a target="_blank" rel="nofollow noopener" href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode&ssr=false#version-history">.NET Interactive Notebooks 拡張の Preview</a> をインストール</li> </ul> <p>残念ながら、 .NET Interactive インストール済み Jupyter の docker イメージのようなものは 公式では用意されておらず、 コンテナを使いたかったら自分でビルドするしかない。<br /> (そのせいで、 上記 binder の起動は遅い)</p> <p>vscode 拡張だと、 コード補完が ignore case で効くのでとても書きやすい。<br /> 以下、 vscode の .NET Interactive Notebooks 拡張の バージョン 1.0.160204 での実行を前提とするが、 他の環境でも同様に動作するはずだ。</p> <p>なお、 起動した Notebook やコンソールの .NET CLR のバージョンを知りたければ、 System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription を実行すれば良い。<br /> .NET 5.x.x と表示されれば、 .NET 5 で起動していることが確認できる。</p> <p><a href="https://crieit.now.sh/upload_images/601ee4e8bdda70c90dbb844c3f41b00a5fcfb8394c961.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/601ee4e8bdda70c90dbb844c3f41b00a5fcfb8394c961.png?mw=700" alt="dotnet-interactive-variable-sharing-00.png" /></a></p> <h2 id="Variable sharing とは"><a href="#Variable+sharing+%E3%81%A8%E3%81%AF">Variable sharing とは</a></h2> <p>さて、ようやく本題。</p> <p>.NET Interactive が面白いのは、 ひとつの Notebook 内で、 C#, PowerShell, F# の言語間の変数を共有できる点だ。<br /> 悪いなあ、 <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/dotnet/visual-basic/">VB.NET</a>。 このツールは3人用なんだ。</p> <p>この変数を共有できる機能を、 variable sharing という。</p> <p><a href="https://crieit.now.sh/upload_images/6c0880bb18fa55b7ca72b70edf5ea8c45fcfb85010ba9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6c0880bb18fa55b7ca72b70edf5ea8c45fcfb85010ba9.png?mw=700" alt="dotnet-interactive-variable-sharing-01.png" /></a></p> <p>使い方はとても簡単で、 <code>#!share --from</code> マジックコマンドで、 参照する .NET カーネルと変数名を指定するだけだ。</p> <p>但し、 読み込まれている型の空間は共有されない点には注意だ。<br /> 例えば、 C# で定義したクラスのインスタンスを PowerShell で読み込もうとしたり、<br /> PowerShell でロードされているモジュールで定義された型のインスタンスを C# で読もうとすると、エラーになってしまう。<br /> 詳しくは、 <a target="_blank" rel="nofollow noopener" href="https://github.com/dotnet/interactive/blob/main/docs/variable-sharing.md">interactive/variable-sharing.md · dotnet/interactive</a> のドキュメントを参照。</p> <p><a href="https://crieit.now.sh/upload_images/d2e56ff085416a06d06b9561ffd485035fcfb859aa4d5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d2e56ff085416a06d06b9561ffd485035fcfb859aa4d5.png?mw=700" alt="dotnet-interactive-variable-sharing-02.png" /></a></p> <p>但し、 PowerShell でよく使われる <code>PSCustomObject</code> 型については特別対応が入っているらしく、いい感じに <code>Dictionary<string, object></code> に変換されて C# でも扱える。<br /> なにそれ。 PowerShell 内部でも欲しい機能なんだけど。</p> <h2 id="Variable sharing の使いどころ"><a href="#Variable+sharing+%E3%81%AE%E4%BD%BF%E3%81%84%E3%81%A9%E3%81%93%E3%82%8D">Variable sharing の使いどころ</a></h2> <p>例えば…<br /> 例えば……<br /> ………</p> <p>うーん、よい例が思いつかない…</p> <p>そもそも、 C# でできることはだいたい PowerShell でできるし、 その逆もまた然りなんだよな。<br /> 加えて PowerShell では、 <code>Add-Type</code> で手軽に C# のコードを埋め込めるし…</p> <p>強いて挙げるなら、 PowerShell は、付属のコマンドレットや追加モジュールによって、 I/O 操作やリソースの読み込みにが強い一方で、 パイプを交えたデータの処理はだいぶ遅いところだろうか。<br /> 例えば、 PowerShell で ファイルの読み込みなどを行いつつ、 大量のデータの処理は C# で行うといったような使い方はアリかもしれない。</p> <pre><code class="powershell">#!pwsh $data1 = Get-ChildItem *.json -Recurse | Get-Content -Raw | ConvertFrom-Json; $data2 = Get-Clipboard; </code></pre> <pre><code class="csharp">#!csharp #!share --from pwsh data1, data2 data1.Where(kv => kv.Key == "tools") </code></pre> <pre><code class="csharp">#!csharp data2.First() </code></pre> <p>この程度のデータ処理なら PowerShell で全く問題ないレベルだが、 処理するデータの数が増えてくれば C# で実行するメリットが出てくるだろう。</p> advanceboy tag:crieit.net,2005:PublicArticle/16115 2020-10-06T00:33:41+09:00 2020-10-06T00:33:41+09:00 https://crieit.net/posts/NET-Core-HttpClient-AngleSharp-UTF-8 .NET Core + HttpClient + AngleSharp で UTF-8 ではないサイトをスクレイピングする <p>この記事は Qrunch からの移植記事です。<br /> 元記事は 2019/08/29 に書かれており、記事の内容が現状と即していない可能性が大いにあります。<br /> <a target="_blank" rel="nofollow noopener" href="https://nokoq16.qrunch.io/entries/YtBflMEtJiDnOak3">元記事</a></p> <p>以下から本文です。</p> <hr /> <p>タイトル通りなのですが、文字コード絡みで少しハマったので備忘がてら記事化しました。</p> <h2 id="事の経緯"><a href="#%E4%BA%8B%E3%81%AE%E7%B5%8C%E7%B7%AF">事の経緯</a></h2> <ol> <li>AngleSharp によるスクレイピングを試したくなる</li> <li>何気なしに 4Gamer.net さんのサイトで試す</li> <li>記事タイトルの取得を試みたところ盛大に文字化けしている</li> <li>なんでや!?</li> <li>charset で EUC-JP が指定されとるやんけ!</li> </ol> <p>という感じです。<br /> このご時世に初手で UTF-8 ではないサイトを引き当てるとは思いませんでした。</p> <h2 id="要点"><a href="#%E8%A6%81%E7%82%B9">要点</a></h2> <ul> <li>HttpClient.GetStreamAsync で Stream を取得して StreamReader で読み込む際に文字コードを指定する <ul> <li>HttpClient.GetStringAsync で string を取得したあと文字コード指定で Convert しようとしてもダメ</li> </ul></li> <li>.NET Core は素のままだと Shift_JIS や EUC-JP に対応していないのでエンコードプロバイダーを追加する <ul> <li><del>.NET Core あんまり触ってないから知らなかった</del></li> </ul></li> </ul> <h2 id="サンプルコード"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89">サンプルコード</a></h2> <pre><code class="csharp">// .NET Core は素のままだと Shift_JIS や EUC-JP に対応していないのでエンコードプロバイダーを追加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // HttpClient でスクレイピングしたいサイトの HTML を取得する HttpClient httpClient = new ServiceCollection() .AddHttpClient() .BuildServiceProvider() .GetService<IHttpClientFactory>() .CreateClient(); Stream htmlStream = httpClient.GetStreamAsync("https://www.4gamer.net/").Result; string htmlString; using (var reader = new StreamReader(htmlStream, Encoding.GetEncoding("EUC-JP"), true) as TextReader) { htmlString = reader.ReadToEnd(); } // h2 > a > InnerText ≒ 記事タイトルを取得する var parser = new HtmlParser(); IHtmlDocument doc = parser.ParseDocument(htmlString); IHtmlCollection<IElement> h2Collection = doc.QuerySelectorAll("h2"); IEnumerable<string> articleTitles = h2Collection.Select(x => x.QuerySelector("a").InnerHtml); // 煮るなり焼くなり好きにする foreach (var articleTitle in articleTitles) { Trace.WriteLine(articleTitle); } </code></pre> <h2 id="参考記事"><a href="#%E5%8F%82%E8%80%83%E8%A8%98%E4%BA%8B">参考記事</a></h2> <p>AngleSharp を使うにあたり以下の記事を参考にしました。<br /> ありがとうございます。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/Yuzu_Unity/items/48d00f2a4779f360d2de">Unity上でAngleSharpを利用したスクレイピングを行う</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/NekozeDaisensei/items/c74f71e5d79d6de05841">【C#】AngleSharpの使い方メモ</a></p> <h2 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h2> <p><del>4Gamer.net さん EUC-JP 止めて UTF-8 にして</del></p> kono 16 tag:crieit.net,2005:PublicArticle/14660 2018-12-18T00:00:00+09:00 2018-12-20T01:25:45+09:00 https://crieit.net/posts/Microsoft Microsoftの技術でもちゃんとしたサービスを作れるんだぞ!! <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><a href="https://crieit.net/advent-calendars/2018/technology">個人開発サービスに用いられている技術 Advent Calendar 2018</a> の18日目です。昨日は<a href="https://crieit.net/users/__shinji__">Shinji</a>さんの「<a href="https://crieit.net/posts/Firebase-Cloud-Function">Firebase Cloud Function をローカルで実行するときにはまった点</a>」でした。</p> <p>こんにちは、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/isaito24085408?lang=ja">@isaito</a>です。今回は今年の4月にリリースした「<a target="_blank" rel="nofollow noopener" href="https://mygkrnk.com/">みんなの洋楽ランキング</a>」と言うサービスでMicrosoftの技術をベースに開発しています。巷で「まいくろそふとのぎじゅつ?」と言われることが多いので、それなりに出来るんだそってことを書きたいと思います。</p> <h1 id="みんなの洋楽ランキングとは?"><a href="#%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AE%E6%B4%8B%E6%A5%BD%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF%EF%BC%9F">みんなの洋楽ランキングとは?</a></h1> <p><a href="https://crieit.now.sh/upload_images/e591236ff505a09eeaa09a48b67ca2575c0cd41c9ff77.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e591236ff505a09eeaa09a48b67ca2575c0cd41c9ff77.jpg?mw=700" alt="みんなの洋楽ランキングサムネイル" /></a><br /> 一言で言うと最新のビルボードチャート(Billboard Hot 100 Chart)からランキング形式で洋楽情報をお届けするサービスです。</p> <p>「洋楽」、「洋楽ランキング」のワードがGoogleの検索ボリュームが多い※1にも関わらず、昔の情報※2が多く、リアルタイムで「どの曲やアーテイストが流行っているのか?」という視点で洋楽を探せるサービスがないことに気付き、もともと洋楽好きなことを加え、技術的なアプローチによってリアルタイムで情報を発信出来るサービスが作れるのではと思い勢いで作りました。</p> <p><em>※1 「洋楽」、「洋楽ランキング」ともに月間20万近くの検索数があり、これは比較的多い方だと感じています。<br /> ※2 日本で流れている洋楽は1年以上前の曲が多く、日本の音楽配信サービスは日本で売れる曲を発信するので最新の曲を発信しない傾向にあります。また、ブログなど筆者が更新しない限り新しい情報に更新されないので、その点で「昔の情報が多い」という表現を使っています。</em></p> <h1 id="記事を書こうと思ったきっかけ"><a href="#%E8%A8%98%E4%BA%8B%E3%82%92%E6%9B%B8%E3%81%93%E3%81%86%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">記事を書こうと思ったきっかけ</a></h1> <p>あまりサービスの技術について<a target="_blank" rel="nofollow noopener" href="http://tekitoumemo.hatenablog.com/">自分のブログ</a>以外で発信することはなかったのですが、Quitaでバズった<a target="_blank" rel="nofollow noopener" href="https://twitter.com/hrz31">@hrz31</a>さんの記事を読んだことで考え方が変わりました。@hrz31さんの記事はサービスの想いやなぜこの技術を使ったか明確に言語化されており、僕も少なからずみんなの洋楽ランキングに想いがあるので情報を発信出来る場でちゃんと言語化しないといつか忘れてしまうだろうなぁと思い、ここに書かせてもらいした。この機会を与えていただき<a href="https://crieit.net/users/dala00">だら</a>さんには感謝致します。</p> <p>はじめたDM使った相手が@hrz31さんでした<br /> <a href="https://crieit.now.sh/upload_images/d12401bf9d10dd69fe63c654628313895c1782d74e9cc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d12401bf9d10dd69fe63c654628313895c1782d74e9cc.png?mw=700" alt="スクリーンショット 2018-12-11 23.38.44.png" /></a></p> <h1 id="個人開発を行う上で心掛けていること"><a href="#%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%92%E8%A1%8C%E3%81%86%E4%B8%8A%E3%81%A7%E5%BF%83%E6%8E%9B%E3%81%91%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8">個人開発を行う上で心掛けていること</a></h1> <p>サービスを作る上でユーザーのニーズに答えるのは一番重要ですが、個人開発で運用する上では、運用出来ない、または日常生活に支障が出る恐れがあるので自分が出来ること、出来ないことを含めて考えました。</p> <h2 id="自分が出来ること"><a href="#%E8%87%AA%E5%88%86%E3%81%8C%E5%87%BA%E6%9D%A5%E3%82%8B%E3%81%93%E3%81%A8">自分が出来ること</a></h2> <h5 id="普通の人が知らない知識を発信"><a href="#%E6%99%AE%E9%80%9A%E3%81%AE%E4%BA%BA%E3%81%8C%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E7%9F%A5%E8%AD%98%E3%82%92%E7%99%BA%E4%BF%A1">普通の人が知らない知識を発信</a></h5> <p>10年以上ビルボードを追っかけていたこともあり「洋楽」という点については、普通以上の知識はあります。普通の人が知らない情報を発信することで洋楽に関連のなかった人たちに興味を持ってもらえると思いました。</p> <h5 id="個人開発ならではの様々な角度からアプローチ"><a href="#%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%81%AA%E3%82%89%E3%81%A7%E3%81%AF%E3%81%AE%E6%A7%98%E3%80%85%E3%81%AA%E8%A7%92%E5%BA%A6%E3%81%8B%E3%82%89%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81">個人開発ならではの様々な角度からアプローチ</a></h5> <p>キュレーションサイトを運用するならブログ、WordPressなどのやり方がありますが、決まった機能しか使えないことがあるので多様性に欠けてしまいます。個人開発であればユーザーが欲しい機能や届けたい機能を柔軟に作ることが出来ます。さらに企業がやらないニッチな視点で提供出来ることもあるはずです。</p> <h5 id="情報を発信するスピード"><a href="#%E6%83%85%E5%A0%B1%E3%82%92%E7%99%BA%E4%BF%A1%E3%81%99%E3%82%8B%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89">情報を発信するスピード</a></h5> <p>個人であれば夜中でも早朝でもいつでも発信出来ます。みんなの洋楽ランキングは<a target="_blank" rel="nofollow noopener" href="https://www.billboard.com/charts/hot-100">本家ビルボードのサイト</a>よりも早く発信出来ています。多分どのサイトよりも早いんじゃないかな?</p> <h2 id="自分が出来ないこと"><a href="#%E8%87%AA%E5%88%86%E3%81%8C%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8">自分が出来ないこと</a></h2> <h5 id="人を集める"><a href="#%E4%BA%BA%E3%82%92%E9%9B%86%E3%82%81%E3%82%8B">人を集める</a></h5> <p>これは出来ないこともないですが、個人と企業の資本(ヒト、モノ、カネ)差を考えると比較的困難なものとなります。さらに私自身、知名度が全くありません(笑)これを前提に会員登録やユーザーがサービスの機能を使ってもらうことは非常に敷居が高いと感じています。そのため、みんなの洋楽ランキングは「閲覧」を主体にしたサービスを提供しています。</p> <h5 id="大きな機能を継続してリリース"><a href="#%E5%A4%A7%E3%81%8D%E3%81%AA%E6%A9%9F%E8%83%BD%E3%82%92%E7%B6%99%E7%B6%9A%E3%81%97%E3%81%A6%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9">大きな機能を継続してリリース</a></h5> <p>一人でサーバーサイド、フロント、デザインを運用しているので、大きな機能を継続してリリースするのはなかなか難しいのです。さらに週5日で仕事し家族もいるのでサービスに関われる時間は多くても平日1時間+週末3時間程度となります。作れば作るほど、技術負債がたまるので「作りすぎない」ことを常に心がけています。</p> <h1 id="開発期間"><a href="#%E9%96%8B%E7%99%BA%E6%9C%9F%E9%96%93">開発期間</a></h1> <p>思い立ってから3ヶ月ぐらいでリリースしました。ただ、実際の開発期間は1週間程度でリリースするまでの間はダラダラと思い悩んでました。個人開発ならではの「これ誰かの役に立つのかな?」「お金の無駄にならないか」などの葛藤と戦っていました。つい最近まで1ヶ月ぐらいは気合いいれて作ったなぁと思ってGithubみたら全然開発してないことに驚愕しました笑<br /> <a href="https://crieit.now.sh/upload_images/6782b6d2d67d33b22e448039ebe809625c0cea4922f26.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6782b6d2d67d33b22e448039ebe809625c0cea4922f26.png?mw=700" alt="github" /></a></p> <h1 id="使用技術・開発ツール"><a href="#%E4%BD%BF%E7%94%A8%E6%8A%80%E8%A1%93%E3%83%BB%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB">使用技術・開発ツール</a></h1> <p>ざっくりとした構成図は画像の通りです。<br /> <a href="https://crieit.now.sh/upload_images/38c6794ebe0416b6198f41a01397a1b05c0d04b392708.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/38c6794ebe0416b6198f41a01397a1b05c0d04b392708.png?mw=700" alt="構成図" /></a></p> <h2 id="フレームワーク"><a href="#%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF">フレームワーク</a></h2> <h3 id=".NET Core"><a href="#.NET+Core">.NET Core</a></h3> <p>Microsoft社が提供している<a target="_blank" rel="nofollow noopener" href="https://msdn.microsoft.com/ja-jp/magazine/mt842506.aspx">.NET Core</a>を使用しています。.NET Coreからマルチプラットフォームで開発が出来るようになり、Windows以外での開発が可能になりました。.NET Coreは更新が活発でありMicrosoftのメインとなる技術で勉強するにはもってこいと思い選定しました。<a href="https://crieit.net/advent-calendars/2018/technology">個人開発サービスに用いられている技術 Advent Calendar 2018</a>で2つのサービスに使われているんだ!マイナーなんて言わせないぞ!</p> <h2 id="言語"><a href="#%E8%A8%80%E8%AA%9E">言語</a></h2> <h3 id="C"><a href="#C">C</a></h3> <p>こちらもMicrosoft社が提供している言語です。仕事で使っているのですが、C#の仕事ってC#の機能を全く活用していないことが多いのです(矛盾していますがC#の仕事をしている人であればわかってくれるはず)。特にC#が好き!というわけではないのですが、C#の全てを知っているわけでもないのに他の技術に触れるのは抵抗がありましたのでこちらを採用しました。今後はReactを中心に開発する事が多くなりそうなので、がっつりC#を使うことは少なくなりそうです。</p> <h3 id="React &amp; TypeScript"><a href="#React+%26amp%3B+TypeScript">React & TypeScript</a></h3> <p>フロントはReact & TypeScriptで作成しています。添付した画像の部分で活用しています。<br /> <a href="https://crieit.now.sh/upload_images/e591236ff505a09eeaa09a48b67ca2575c0d07c1d83af.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e591236ff505a09eeaa09a48b67ca2575c0d07c1d83af.jpg?mw=700" alt="React使ったところ" /></a><br /> SPAで使っているわけじゃないので、アーキテクチャ的にもシンプルなReactを採用しました。Angularは経験があるのでVueの方が抵抗が少ないとおもったのですが、フロントはシンプルなことが鍵となると思い、マークアップが肥大化することで絶望する※jsxの採用、今後の伸び代(ReactNative)も含め触ってみたかったことが選んだ理由です。局所的にReactを使っているのでTypeScriptは必要なかったかなー(めんどくさい)なんて思ったりしてます。あと名前がダントツでかっこいい(笑)</p> <p>※僕は肥大化すると発狂するので自ずとシンプルに作るだろうという想定</p> <h3 id="JQuery"><a href="#JQuery">JQuery</a></h3> <p>わざわざReactでやる必要ないちょこっとしたものも。三行以上書く場合はReactに持っていきます。</p> <h2 id="PaaS/IaaS"><a href="#PaaS%2FIaaS">PaaS/IaaS</a></h2> <p>基本はAzureをベースに用途によって様々使い分けています。サーバーのことは詳しくないので、基本的にはAzureにお任せする方向で運用しています。</p> <h3 id="App Service on Linux"><a href="#App+Service+on+Linux">App Service on Linux</a></h3> <p>AzureのPaasです。値段の安さとせっかく.NET Coreを使っているのでLinuxサーバー運用しています。AzureのPaasはCIやリソース管理も含まれているのでものすごく楽です。.NET Coreは、Linuxサーバーだと約10%メモリ使用量が増加しました。これはバージョンが上がるにつれて改善するようです。</p> <p>プルリクエストの数=リリース数です。175回もしているのか。。<br /> <a href="https://crieit.now.sh/upload_images/52e3e0ab60e53f13e8c1f1b1b3262a595c0fcc75725d6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/52e3e0ab60e53f13e8c1f1b1b3262a595c0fcc75725d6.png?mw=700" alt="スクリーンショット 2018-12-11 23.40.28.png" /></a></p> <h3 id="SQL Database"><a href="#SQL+Database">SQL Database</a></h3> <p>AzureのSQL Serverです。値段の安さと安定感があります。今の所2Gで事足りているので月600円程度で済みます。DBのCRUDに関わる開発を行う場合は、Azure上でテスト用のDB立てて開発終わったら削除しています。</p> <h3 id="Functions"><a href="#Functions">Functions</a></h3> <p>Azureのサーバーレスで、みんなの洋楽ランキングではバッチ処理に活用しています。毎時のYoutube再生数の更新やWikipedia取り込みのバッチを動かしています。App Serviceに負荷をかけない為にこちらを活用しています。無料枠で事足りています。</p> <h3 id="Logic Apps"><a href="#Logic+Apps">Logic Apps</a></h3> <p>ワークフローを自動化するサービス。こちらも定期処理に活用しています。1ヶ月6円ぐらいでめっちゃ安いです。</p> <h2 id="メール配信"><a href="#%E3%83%A1%E3%83%BC%E3%83%AB%E9%85%8D%E4%BF%A1">メール配信</a></h2> <h3 id="Send Grid"><a href="#Send+Grid">Send Grid</a></h3> <p>SendGridはクラウドベースのメール配信サービスです。Azureでは、メールサーバの活用は推奨されていないのでこちらを利用しました。なんと25000通も無料枠があります。メール配信は、問い合わせやエラーが発生したときのログを自分に送る為に活用しているので無料枠で十分にまかなえています。値段も含め、運用面でもSendGridにお任せ出来るので非常に便利です。外国のスパムメールばっかりくる、どうにかして。</p> <h2 id="SSL"><a href="#SSL">SSL</a></h2> <h3 id="Let's Encrypt"><a href="#Let%27s+Encrypt">Let's Encrypt</a></h3> <p>無料でSSLが使えます。非常に助かっています。</p> <h2 id="バージョン管理"><a href="#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86">バージョン管理</a></h2> <h3 id="Git &amp; Github"><a href="#Git+%26amp%3B+Github">Git & Github</a></h3> <p>僕はクライアントソフトを全く使わないので基本はコマンドベースで差分確認等はVSCodeで運用しています。自作ライブラリを<br /> submoduleするとfunctionでも使えるのでなかなか使えます。さらにMicrosoftがGithubを買収する前からAzureでの連携はGithubが一番しっくりする気がします。masterブランチにマージされたらApp Serviceが勝手にデプロイしてくれます。SSLで直接サーバーに入ることはほとんどないです。また、GithubのIssueは、個人開発でも活用した方が良いと思います。すごく適当ですが以下のようにIssue作ってコミットと連携しています。<br /> <a href="https://crieit.now.sh/upload_images/d1f5e9359e540d203085bfb404e4ca315c0d14fd14706.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d1f5e9359e540d203085bfb404e4ca315c0d14fd14706.png?mw=700" alt="スクリーンショット 2018-12-09 22.11.25.png" /></a></p> <h2 id="PC"><a href="#PC">PC</a></h2> <h3 id="MacBook Air Mid 2017"><a href="#MacBook+Air+Mid+2017">MacBook Air Mid 2017</a></h3> <p>もともとMacMiniで開発してたのですが、嫁の機嫌を損ねない為にリビングでパソコンをいじる必要がありました。また個人開発は仕事ではなく趣味と思われがちです。家族との会話がないと理解してくれないことが多々あります。寝っ転がりながらテレビを見ながら開発する手法をこいつで身につけました。</p> <h2 id="C#ライブラリ"><a href="#C%23%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA">C#ライブラリ</a></h2> <p>ちょっとマニアックな内容になりますが、利用しているライブラリのご紹介をします。</p> <h3 id="BuildBundlerMinifier"><a href="#BuildBundlerMinifier">BuildBundlerMinifier</a></h3> <p>cssやJsをミニファイやバンドルするライブラリ。以下のように指定すると出来ます。<br /> <a href="https://crieit.now.sh/upload_images/6d8f41935592854f1a7dee7dd200e76b5c0d0ca06d6ac.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6d8f41935592854f1a7dee7dd200e76b5c0d0ca06d6ac.png?mw=700" alt="スクリーンショット 2018-12-09 21.37.29.png" /></a></p> <h3 id="AngleSharp"><a href="#AngleSharp">AngleSharp</a></h3> <p>簡単にスクレイピング出来るライブラリ。C#でスクレイピングだとHtml Agility Packが出てくるのですが、もう全然イケてないのでこれに助けられています。</p> <h3 id="Sendgrid"><a href="#Sendgrid">Sendgrid</a></h3> <p>SendGridを使う為のライブラリ。Httpベースより簡単に扱えます。こういうのは可能な限りライブラリを使った方がよいです。常に「自分よりライブラリ作者の方が仕事(更新)は早い」と言い聞かせてます。</p> <h3 id="DapperSlackOff"><a href="#DapperSlackOff">DapperSlackOff</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/isaito-kurumizawa/DapperSlackOff">DapperSlackOff</a>は私が作ったライブラリです。C#で不満なのは、ORマッパーが非常に弱いこと。EntitiyFrameworkがあるのですが、あまりにも遅すぎるのでStackOverFlowがDapperを作ったぐらいです。Dapperはとにかく早いのですが、ビルダーは提供しないけど、マッピングだけするよというライブラリになっています。簡単なクエリなどはいちいちSQL描いてられないので拡張ライブラリを使うのがテッパンなのですが、不満を解決してくれるライブラリがなかったので自分で作成しました。「手抜きしながらDapperをつかう」という意味が込められています。こちらのライブラリは130行程度で出来ています。<br /> <a href="https://crieit.now.sh/upload_images/76de036aaddbd4e02f31c292bc6016b15c0d11c9e1e39.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/76de036aaddbd4e02f31c292bc6016b15c0d11c9e1e39.png?mw=700" alt="スクリーンショット 2018-12-09 21.59.26.png" /></a></p> <p>テストも書かなきゃ。。</p> <h2 id="React"><a href="#React">React</a></h2> <h3 id="react-autosuggest"><a href="#react-autosuggest">react-autosuggest</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/moroshko/react-autosuggest">react-autosuggest</a>は、サジェストを表示するライブラリです。様々なサンプルがあるので、動かしながら使い勝手を確認出来ます。検索機能に利用しています。</p> <h3 id="react-youtube"><a href="#react-youtube">react-youtube</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/u-wave/react-youtube">react-youtube</a>は、ReactでYouTube playerが扱えるライブラリです。試聴機能で利用しています。</p> <h2 id="その他"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96">その他</a></h2> <h3 id="Twitter"><a href="#Twitter">Twitter</a></h3> <p>これは外せないですね。公開直後の数日は全く人が来ないのでTwitterでキーワードを絡めたツイートしてコツコツとみてくれる人を増やしました。フォロワーが多いわけではないのですが350人以上いるのである程度はみてくれているようです。誰でもフォローするとサービスの注目度がわからないので、フォローする人は見極めるようになりました。WEBサービスは、広告を打たない限り地道に増やしていくしかないので運用する辛さと面白さを知れましたね。<br /> <a href="https://crieit.now.sh/upload_images/97c37805302f77a4cf65ff3054d8877a5c0fcb0a20ca1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/97c37805302f77a4cf65ff3054d8877a5c0fcb0a20ca1.png?mw=700" alt="スクリーンショット 2018-12-11 23.32.14.png" /></a></p> <h3 id="ImageOptim"><a href="#ImageOptim">ImageOptim</a></h3> <p>画像を圧縮するソフト。APIもあるらしいのですが、使ってません。もうちょっと成熟したら検討しようかと思います。</p> <h1 id="これから追加する機能"><a href="#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%A9%9F%E8%83%BD">これから追加する機能</a></h1> <h2 id="Serilog &amp; BigQuery"><a href="#Serilog+%26amp%3B+BigQuery">Serilog & BigQuery</a></h2> <p>攻めのロギング。ログはトラブルの為にあるものではなく、今後の予測をするための重要なツールです。C#のロギングライブラリで一番パフォーマンスが高い<a target="_blank" rel="nofollow noopener" href="https://serilog.net/">Serilog</a>と言わずもがなのデータウェアハウスのBigQueryをAzure Functionで連携して大量のデータを解析出来るようにします。ちなみにアナリティクスは導入当初から入れてますが、ちょっと弱いかなぁ。。</p> <h2 id="SignalR"><a href="#SignalR">SignalR</a></h2> <p>C#の双方向通信ライブラリ。ユーザーがアクセスしているときになにかアクション出来ると楽しいはず!夢が広がるなぁ。</p> <h2 id="Firebase"><a href="#Firebase">Firebase</a></h2> <p>Azureで出来ることはまとめたかったんですが、GCPすごいっすね。会員サービスを導入することになったら100%使います。アプリ化も検討しているので、成熟したら必然的に使うようになりそう。</p> <h1 id="コストはどれぐらいかかっているのか"><a href="#%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AF%E3%81%A9%E3%82%8C%E3%81%90%E3%82%89%E3%81%84%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B">コストはどれぐらいかかっているのか</a></h1> <p>約2ヶ月前にLinuxサーバーに切り替えたのですが、すべてのサービス合わせて月5000円しないぐらいです。Paasを使っている以上、安くはないですが運用面を任せられるのでよしとします。アクセス数も多いときで月3万弱のPVがあったのですが、この値段で余裕で運用出来ていました。</p> <h1 id="Microsoftの技術を使ってみて"><a href="#Microsoft%E3%81%AE%E6%8A%80%E8%A1%93%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%A6">Microsoftの技術を使ってみて</a></h1> <p>正直、すごく開発しやすく何も不便はありません。.NET Frameworkだと話は変わりますが、.NET Coreであればnode絡みなど自由度が高く継続してサポートもされるので安心感があります。個人的に不満だったVisual Studioの重さから解放され、辛いところを見つけるのが難しいぐらいです。強いて言えば以下の三つ不満があります。</p> <h4 id="ライブラリが他の言語と比べ貧弱"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%8C%E4%BB%96%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%A8%E6%AF%94%E3%81%B9%E8%B2%A7%E5%BC%B1">ライブラリが他の言語と比べ貧弱</a></h4> <p>そこまで不満はないですが、ORマッパーが微妙、RailsのgemみたいなViewを絡めたライブラリが少ないなどやっぱりめんどくさいことが多いかなと思います。他のフレームワークをがっつり触った事ないので比較しようがないですが。</p> <p>散々文句言っててあれですが、やっぱりDapperは早いので検索APIが30msの速度が出ています。このしょぼいサーバーではかなりパフォーマンスはいいんじゃないでしょうか?<br /> <a href="https://crieit.now.sh/upload_images/fd2779416ed0d1504f004d01838415535c178f5273fe8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fd2779416ed0d1504f004d01838415535c178f5273fe8.png?mw=700" alt="スクリーンショット 2018-12-17 20.53.20.png" /></a></p> <h4 id="コンパイルがやっぱりめんどくさい"><a href="#%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%8C%E3%82%84%E3%81%A3%E3%81%B1%E3%82%8A%E3%82%81%E3%82%93%E3%81%A9%E3%81%8F%E3%81%95%E3%81%84">コンパイルがやっぱりめんどくさい</a></h4> <p>そもそもC#使うな!って言われそうですが、やっぱりいちいちコンパイルするのめんどくさいです。まぁ強いて言うならってところ。</p> <h4 id="下位互換が優秀過ぎる"><a href="#%E4%B8%8B%E4%BD%8D%E4%BA%92%E6%8F%9B%E3%81%8C%E5%84%AA%E7%A7%80%E9%81%8E%E3%81%8E%E3%82%8B">下位互換が優秀過ぎる</a></h4> <p>これはむしろ最高なところですが、フレームワークが変わって下位互換が優秀だと一生リファクタしないコードが残りやすいかなと思います。C#と言っても物によって全く作りが異なるので言語やフレームワークによって作りが変わっちゃうのはなぁ。。と言う個人的な気持ちがあります。</p> <p>ただ、ライブラリに関してもオープンソースになった今はかなり活発なので今後の期待値はすごいです。十分にサービスが作れる環境なことは間違いないかなと思います。</p> <h1 id="今後について"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">今後について</a></h1> <p>今の課題は「アクセス数が少ない」ことです。ここでのアクセス数が少ないと言うのは、収益<運用費となっており私のモチベーションだけで運用している状況はサービスとしては不健全な状態なのでこの表現を使っています。洋楽キュレーションとしては必要な機能が揃ってきたと思っているので、野暮ったく素人っぽいデザインから脱出し、記事数もいろんな方法を使って増やしていきたいと思っています。また、サービスを運用する上で一番大事だと思っていることは「継続」であと数年は続けたいので、技術負債を溜めないように.NET Coreアーキテクチャとともに常に更新していく予定です。サービスの発展が第一優先ですが、Microsoftの技術でもここまで出来るんだぞ!と微力ながら発信していきたいと思っています。</p> <h1 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h1> <p>自分のブログ以外でこんなにちゃんと発信したのは初めてで20代最後の記念になりました。Microsoftの技術でも十分運用出来るので、気になる方は試してみてはいかがでしょうか。僕も他のフレームワークを使ってサービスを作ってみたいと思います。</p> <p>明日は誰もいない!!</p> みんなの洋楽ランキング