今日もちょいつか

お酒の飲み過ぎか、それとも歳のせいなのか毎日ちょっぴり疲れ気味なフリーのソフト屋です。ソフト開発の話題をblogにしてみます。

ASP.NET Core MVC EPPlusを使ったExcelファイル操作

ASP.NET Core MVCExcelファイルを操作する方法を調べてみました。
ASP.NET Core MVCMicrosoftテクノロジーなので
Excelとは親和性が良いと思いますのでサクッと行けると思ったのですが・・・。

ネットを調べてみると「EPPlus」パッケージが良いみたいですので
試してみました。
Visual Studio Community 2017 for Macで確認しています。

NuGetでパッケージの追加

いつものごとく、「EPPlus」パッケージを追加します。

Excel操作のサンプルコード

適当なControllersにサンプルコードを記述して動作を確認してみます。

using OfficeOpenXml;

var xlsxFile = System.IO.File.Create("hatena.xlsx");
using (var package = new ExcelPackage(xlsxFile))
{
 // ワークシートを1枚追加
   ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("新しいシート");
   // セルに値をセット
   worksheet.Cells[1, 1].Value = "test";
   // 保存
   package.Save();
}

新しくhatena.xlsxを作成してワークシートを追加。
そしてセルに値を入れて保存をする。すっごく簡単サンプルコードなのです。

が、
エラーで動きません。

package.Save();

のところで

ArgumentException: 'IBM437' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
Parameter name: name

となってしまいます。
相変わらずこんなところではまってしまうASP.NETなのでした。

いつものごとく対策をネットで調査して
なんとか英語サイトで対策を見つけることができました。
こんなに大変だとは?!

対策は
NuGetで「System.Text.Encoding.CodePages」パッケージを追加して。

上記サンプルコードに呪文を唱えたら無事に保存できました。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

最終的に動いたコードです。

using OfficeOpenXml;

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var xlsxFile = System.IO.File.Create("hatena.xlsx");
using (var package = new ExcelPackage(xlsxFile))
{
 // ワークシートを1枚追加
   ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("新しいシート");
   // セルに値をセット
   worksheet.Cells[1, 1].Value = "test";
   // 保存
   package.Save();
}

毎度のことですが、よーくハマります。
こんな調子でシステムの開発ができるのかとっても不安です。
でも少しづつクリアして行かないと!

かっこいいApple小物のご紹介

Apple Watch 充電 スタンドです。
Apple Watchをセットすると、ちょうどディプレイのようになるカッコよさ。
形状が90年代のMacintoshなのがとても嬉しいです!

ASP.NET Core MVCでSession管理

PHPでWebシステムを開発をしていると
Sessionを利用した値の保存や取得は頻繁に行うので
ASP.NET Core MVCでのコーディング方法を調べてみました。
が、
なかなかネットで情報を見つけることができず
英語のサイトでやっとわかりました。
Visual Studio Community 2017 for Macで動作を確認しています。

NuGetでパッケージの追加

ここからやるのねって感じですが
Microsoft.AspNetCore.Session」パッケージを追加します。

Startup.cs「ConfigureServices」に記述追加

services.AddDistributedMemoryCache();
services.AddSession();

Startup.csの「Configure」に記述追加

app.UseSession();

テストコード

これでやっとSessionが利用できます。

using Microsoft.AspNetCore.Http;

HttpContext.Session.SetString("Test", "セッションテスト"); //値セット
HttpContext.Session.GetString("Test"); //値取得

こんなことでこんなにハマるとは。
ASP.NET Core MVCで開発してゆけるのかとっても不安になってしまいます。

仕事の気分転換に、自立式ハンモック

以前からハンモックに憧れていたのですが。
屋内で使える自立式ハンモックがあるのですね。
どんなのが良いのかわからないので、1万円を切るくらいのを買ってみました。
想像していたより気持ちがいいです。
特に左右に揺らすととても気分が癒やされます。
プログラムでハマった時に気持ちを落ち着けることができそうです。

ASP.NET Core MVC でMySQLを使ってみる

ASP.NET Core MVCでのシステム開発を進めるために
とりあえず、MySQLのサンプルコードを記述してみました。

NuGetでMySQL.Dataを取得

そのままの環境ではMySQLを使えませんので、NuGet(Visual Studio拡張機能として付属しているライブラリのパッケージ管理システム)を使ってMySQL.Dataを設定します。
・メニューの「プロジェクト」-「NuGet パッケージの追加」を選択
・右上の検索窓に「MySQL」と入力
・左の一覧にMySQL.Dataが表示されるので選択して、パッケージを追加クリック
f:id:Heinlein:20171117141356p:plain

appsettings.jsonMySQL接続情報を記述

  "ConnectionStrings": {
    "MySQL": "Database=データベース名;Data Source=localhost;User Id=root;Password=パスワード"
  }

テストコードの記述

今回は簡単なテストコードですので、Controllersの中に記述してみました。

using MySql.Data.MySqlClient;
using Microsoft.Extensions.Configuration;
using System.IO;

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
var config = builder.Build();
string connectionInfo = config.GetConnectionString("MySQL");
MySqlConnection cn = new MySqlConnection(connectionInfo);
cn.Open();

string dbData = "";
MySqlCommand command = new MySqlCommand("SELECT * FROM hatena", cn);
using (MySqlDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
          dbData += reader["Name"];
     }
}
cn.Close();

hatenaテーブルのNameフィールドの値を変数へ格納してみました。

macOS High Sierraで .NET Coreの開発環境をつくってみた(C# / F#)

クライアントから.NET CoreベースのWebシステム開発の協力要請があったので
開発マシンに環境を構築してみました。
流れとしては、
.NET Coreのインストール。そしてVisual Studio for Macのインストールって感じです。

インストールで利用したサイトはこちら
www.microsoft.com

.NET Coreのインストール

上記サイトの上部にマシンのOS環境に応じたダウンロードボタンがあるので
クリックします。
f:id:Heinlein:20171107150515p:plain:w300
ダウンロードしたファイルをダブルクリックしてインストールします。

コマンドラインでプロジェクト作成

早速コマンドラインで動作検証をしてみます。
ターミナルからコマンド入力します。

$ dotnet new console -o myApp

myAppフォルダが作成されて、プロジェクトが作成されます。
Hello World」表示用のcsファイルも作成されます。

using System;

namespace myApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

実行してみます

$ cd myApp
$ dotnet run

プロジェクトが実行されて「Hello World!」がターミナルに表示されます。

Visual Studio for Macインストール

最後にIDE開発ツールであるVisual Studio for Macをインストールします。
f:id:Heinlein:20171107151624p:plain:w500
サイトの下の方にダウンロードボタンがあります。

ダウンロードして、ダブルクリックでインストール開始です。
f:id:Heinlein:20171107151801p:plain:w500
すんなり終わると思いきや、ダウンロードサイズが4.5G以上あるんですね。
ネット環境が遅いので結局2時間くらいかかってしまいました。

これで最低限の開発環境が構築されました。
開発方法や言語体系などを調査して少しづつ開発作業を進めたいと思います。

さくらサーバーのCodeIgniterでURLからindex.phpを除去したい

CodeIgniterを利用した場合、URLアクセス時にindex.phpを含まないといけません。
こんな感じですね。
http://localhost/hatena/index.php/hello/
localのテスト環境ならばこれでもいんですけど
実際にクライアントのサーバーではちょっとカッコ悪いです。

なので、クライアントが契約しているさくらサーバーで
index.phpの除去をしてみようと思いました。
除去は、「.htaccess」ファイルを配置することで解決できると調査済みでしたので
簡単に実現できると思ったのですが・・・。

クライアントのさくらサーバーでは他のシステムも稼働しているので
ドキュメントルートからフォルダを設定しています。
http://hatena.com/customer/index.php/hello/

除去する方法はネットにたくさん情報が転がっていますので
ちゃちゃっとコピーしてやってみます。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

これだと「No input file specified.」とエラーになってしまいます。

ドキュメントルートではなくて、サブディレクトリなので

RewriteEngine On
RewriteRule ^(.*)$ /customer/index.php/$1 [L]

だめかー「Internal Server Error」になりました。

これで困ってしまいました。ネタ切れです。
ネットで調べてもこのような記述が多くて解決策が見つかりません。
さくらサーバーの罠なのか?
いずれ初めてすることはうまくゆきません。

かなりの数のサイトを徘徊して調べたら、ちょと違う記述に遭遇しました。
こんな感じ。

RewriteEngine on
RewriteCond $1 !^index\.php
RewriteRule ^(.*)$ /customer/index.php?/$1 [L]

これで試してみたら見事にうまくいきました。疲れたー。

すぐに実現できると思ったのに見事にハマってしまったものです。
.htaccess」ファイルは動くか動かないかのどちらかなので
ハマりやすいですね。

Eclipse Neonでメニューがグレーアウトになってクリックできない

PHPの開発で利用している、Eclipse Neonでメニューが無効化になっていて
クリックができなくなっていました。
メニューは表示されるのですが、グレーアウトになっていて選択できません。

f:id:Heinlein:20171101150818p:plain:w250:left

普通に使えていたのですがなんででしょう?

早速ネットで調べてみると
macOS High Sierraにアップグレードすると、このような現象になるようです。
そういえば2017年9月末にアップグレードをしています。

さて、対策です。どうやら英語モードで起動すると直るようです。

eclipse.iniに設定を追加します。

/Applications/Eclipse.app/Contents/Eclipse/eclipse.ini
-Duser.country=US
-Duser.language=en

そして、追加した後は、-cleanオプションを付けてeclipseを起動します。

/Applications/Eclipse.app/Contents/MacOS/eclipse -clean

はいこの通り、うまくゆきました。
f:id:Heinlein:20171101152436p:plain:w250

OSをアップグレードしてから1ヶ月くらいたつのにまるで気づきませんでした。
こんなこともあるのですね。
日々トラブルとの戦いです!

システム開発環境 | 2017年10月

システムの開発環境は時代によってバージョンが変わったり
利用するソフトが変わりますのである程度の節目で記録してゆきたいと思います。

MacBookPro macOS High Sierra
Apache 2.4.27
PHP 7.1
MySQL 5.6.22
phpMyAdmin 4.3.4
Eclipse Neon
PHPソースコードの編集はEclipseを使っています。
MacEclipseを入れるには、JavaXcodeをインストールしたりと
面倒ですがこれが一番見やすくて、コーディングしやすいです。