IQ49

IT業界の感想

なぜ俺のASP.Net CoreアプリはIISで動かないのか

Q なぜ俺のASP.Net CoreアプリはIISで動かないのか
A モジュールが足りないから

じゃけんモジュール入れましょうね。
どのモジュールを入れたらいいかは公式に書いてある。

docs.microsoft.com

以下のサイトからWindows Hosting Bundle Installerをダウンロードしてサーバにインストールすればすぐ終わる。簡単。インストールしたらIIS自身を再起動してモジュール機能のページにAsp.Net Coreが増えてればOK。

dotnet.microsoft.com

ではなぜ動かなくなるかというとWindows Hosting Bundle Installerを使わずに各ランタイムを個別に入れようとしてミスるから。

ホスティング システムに .NET Core ホスティング バンドルをインストールします。 このバンドルをインストールすることで、.NET Core ランタイム、.NET Core ライブラリ、ASP.NET Core モジュールがインストールされます。 このモジュールでは、ASP.NET Core アプリが IIS の背後で実行できるようになります。

検索方法によっては以下のサイトのようなランタイムを個別にインストールするサイトが出てきてモジュールのインストール忘れが発生する。

dotnet.microsoft.com

ODP.Net CoreでTNS_ADMINを指定する

環境
.Net Core 3.1
Oracle.ManagedDataAccess.Core 2.19.70

.Net Frameworkではapp.configでTNS_ADMINを設定することで接続文字列のDataSourceにtnsnames.oraで設定したデータソース名を用いることができた。.Net Core版ではこれができなくなっている。
代替手段として用意されているのは.NET構成APIを用いる方法だ。OracleConnectionを生成する前にOracleConfiguration.TnsAdminにtnsnames.oraが配置されているフォルダを指定すればよい。
TnsAdminに設定する値は自力でappSettings.jsonから引っ張ってきてどうぞ。

OracleConfiguration.TnsAdmin = "C:\app\NetWork\Admin"; // tnsnames.oraが配置されているフォルダ

orclCon = new OracleConnection("user id=hr; password=<password>; data source=orclpdb");
orclCon.Open();

詳細は公式サイトに書かれている。

docs.oracle.com

またtnsnames.oraは以下の優先順位で検索されるらしい。
1. OracleConfiguration.TnsAdminプロパティで設定されたディレクト
2. 実行中ODP.NET Coreアセンブリディレクト
3. 現行作業ディレクト

.Net Coreのlog4netでロガー名を指定してロガーを生成するには

環境
.Net Core 3.1
log4net 2.0.8

.Net Core対応でlog4netをnugetから入れたときに気がつくのはロガー名だけを指定してロガーを生成するメソッドが無いということだ。.Net Framework版だとロガー名指定でロガーを生成できてたのでどうやっていいかを調べた。
.Net Core版では以下のように書くことでロガー名でロガーを生成できる。ここではMyLoggerというロガー名を指定している。
現場からは以上です。

ILog logger = LogManager .GetLogger(Assembly.GetExecutingAssembly(), "MyLogger");

stackoverflow.com

.NET Core 汎用ホストの環境変数の接頭辞はなにか

.Net Core汎用ホストの環境変数の接頭辞は「DOTNET_」である。環境によって処理を切り替えたいときの環境変数は「DOTNET_ENVIRONMENT」となる。
以上!

github.com

ところで「generic host environment prefix」とかで調べても情報全然出てこないんだが使うの難しすぎでは。

Asp.Net CoreでIISに30MB以上のファイルをアップロードする

30MBと言ったが正確には30000000バイトだ。

環境

.Net Core 3.1

手順

まずweb.configにrequestLimitsを追加する。maxAllowedContentLengthに指定した数が最大アップロード容量だ。
Asp.Net Coreのテンプレートにはweb.configが初期は存在しないから無いなら自分で作ってどうぞ。locationタグが漏れないよう注意。
Web.configじゃなくてIISの最大アップロードサイズ変更でいいかもしれんが試してないので知らん。

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <security>
        <requestFiltering>
          <!-- Handle requests up to 1 GB -->
          <requestLimits maxAllowedContentLength="1073741824" />
        </requestFiltering>
      </security>
    </system.webServer>
  </location>
</configuration>

次にStartup.csでコンフィグ設定している箇所にIISServerOptionsとFormOptionsの処理を追加する。

・Startup.csから抜粋

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            
            services.Configure<IISServerOptions>(options =>
            {
                options.MaxRequestBodySize = 1073741824; // 1GB
            });

            services.Configure<FormOptions>(x =>
            {
                x.ValueLengthLimit = 1073741824; // 1GB
                x.MultipartBodyLengthLimit = 1073741824; // 1GB
            });
        }

これでファイルアップロードの上限が増えてるはず。

終わりに

・参考サイト github.com

Asp.Net Coreのファイルアップロード方法は以下のサイト見ればだいたい分かる。 docs.microsoft.com

・ファイルアップロードの公式サンプル github.com

1995年からの名目GDP成長率が低い日本はオワコンなのか

Twitterを見てると「1995年の名目GDPを100としたときに日本以外の国は伸びてるのに日本だけ減ってる!」という意見があった。その意見のせいで日本人は昔に比べて成長していないんだという悲観的な印象を受けた人が一定数いたようである。日本愛好家として「日本オワコン!」という意見は見過ごせないので成長率以外の数字を見ていく。

統計

f:id:baito_mo_yamunai:20191124152600p:plain

https://www.google.com/publicdata

グーグルのパブリックデータ、世界開発指標から一人あたりの名目GDPを引っ張って来たのが上の図である。1995年の日本のGDPは他の国と比較して突出して高いことがわかる。「昔の日本はすごかったんだ!」と思う前にちょっと待ってほしい。まず前提条件として名目GDPというのはドルベースで算出される。そのため円高ドル安であると名目GDPは実質の経済規模より増えたように見える。そして1995年といえば1ドル79円の超円高時代、それが反映されているためグラフでは1995年の日本が突出しているのである。

このことを踏まえると「1995年の名目GDPと100としたとき~」という意見は、日本が衰退しているという主張を劇的に見せたいだけの恣意的な意見であると言わざるを得ない。名目GDPを用いて日本を主体とするデータ比較を行うなら1995年を基準とするべきでないし、1995年からの変化が知りたいだけであれば実質GDPの値を使うべきだろう。

f:id:baito_mo_yamunai:20191124155055p:plain

同様に一人あたりの実質GDP(2000年基準)を引っ張ってきたのが上の図である。ご覧の通り1995年の値に比べて現在の値は至って普通に上昇している。「1995年から減ってる!」という認識は何だったのだろうか。参考までに述べると日本の1995年の値は40,368ドル、2017年の値は48556となっている。

また、他国と比較して成長率が低いということもグラフからは読み取れない。本当に成長率がオワコンになっていればとうの昔にフランスやイタリアに抜かれていないとおかしいはずである。

そもそも成長率○○位だからオワコンというのもおかしな話だ。アメリカは日本より成長率が高いがそれでも2017年度の実質GDP成長率は191カ国中127位だ(日本は138位)。成長率が低いから終わりなのであれば100位以内に入れないアメリカも終わりということになってしまう。

まとめ

  • 1995年は超円高なので名目GDPの値が現在の値と比べても高く見える。現在のGDPと比較したいのであれば実質GDPの値を用いるべきである。

メルカリの2020年6月期第1四半期決算短信の感想

少し覗いたら営業利益が赤字だったので。

メルカリ 2020年6月期第1四半期決算短信〔日本基準〕(連結) https://pdf.irpocket.com/C4385/D5nz/WeYS/yrMC.pdf

バランスシート

f:id:baito_mo_yamunai:20191111225740p:plain f:id:baito_mo_yamunai:20191111225751p:plain

バランスシートで注目すべきは現金及び預金の豊富さであろう。資産合計の75%以上を占める137,946百万円も現金を持っている。まさに投資の準備は万端といえるだろう。

一方で目立つのは利益剰余金の赤字が36,209百万円と時間経過とともに膨らんで来ていることである。このままのペースで赤字が出ると豊富な現金があるとはいえ余裕はなくなるだろう。更に言うと決算が毎回のように赤字なので将来的に黒字を出す力を持っているのか疑問に感じてくる。

損益計算書

f:id:baito_mo_yamunai:20191111225806p:plain

メルカリといえばIT業界で優秀な人材を高待遇で引き抜いている話が有名だろう。予想では人件費高騰が営業利益に悪影響を与えているかと思ったが、売上原価が4,118百万円は前年度から比べたら高騰してはいるものの売上高から見た場合、そこまで問題ではないだろう。(エンジニアの人件費が売上原価に含まれていると推測した場合)

問題は販売費及び一般管理費の多さである。17,440百万円は売上高すら上回っている。内訳はよく知らないが広告でも流しまくったのだろうか。100歩譲って利益よりもシェア拡大のために赤字になるのは良いとしよう、しかし利益剰余金がマイナスで本業のシェアが伸びていない、新規事業も開拓できていない、決済事業はライバルに押され気味という状態では閉塞感を覚えてしまう。

まとめ

  • 現金は多い、投資先は不明
  • 営業利益は赤字、特に販売費及び一般管理費が負担に
  • エンジニアの人件費は負担になってない気がするので底力に期待