今日もちょいつか

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

mac Visual Studio(8.10)にアップしたら「.NET Core3.1SDKがインストールされていません」となっちゃった

Visual Studioのアップデートの通知があったのでいつもどおりアップしたら。
「.NET Core3.1SDKがインストールされていません」となってしまいました。
プロジェクトのオプションを見てみるとこんな感じです。
f:id:Heinlein:20210608092107p:plain
たまにあるんですよねー。アップデートするとおかしくなってしまうことが。

インストールしなさいと表示されているので最新の.NET Core SDKをインストールしたけどダメ。
当然ビルドもできず、全く作業ができません。
ネットを探してもそんな情報は見当たりませんでした。
自力で解決するしかないか。。。

当たり前なんですが、アップデートする前日まで普通に利用できていたで
.NET Core SDKはインストールされています。

インストールされている .NET SDK のバージョンをターミナルで確認しても表示されます。

dotnet --list-sdks

どうやら、Visual Studio .NET SDK を認識できていないようですね。

そして解決

Visual Studioの上のメニュー「Visual Studio」-「ユーザー設定」に 「SDKの場所」の設定がありました。
f:id:Heinlein:20210608095431p:plain
ここのパス指定がおかしくなったのですね。
f:id:Heinlein:20210608095546p:plain
環境に合わせてパスを指定したらOKになりました。

ブログにするとたったこれだけの事ですが、
結局解決するのに、1日かかってしまいました。

Blazor RadzenTextBox 入力された値を取得する

ASP.NET CoreでBlazor(ブレイザー)を利用しています。
その際に、
Blazor向けのUIフレームワークであるRadzen Blazor Componentsを試しているのですが。

タグをスルスルっと記述するだけで、簡単に実現できる反面
とても簡単なことが実現できなくて、非常に苦しんでいます。

今回は、TextBoxを表現する RadzenTextBox で入力した値をプログラムの中で
取得できなくて相当苦しんでしまいました。
検索しても情報が少なくて。。。

Visual Studio Community 2019 for Macで動作確認をしています。

実現したいこと

よくある検索画面です。
f:id:Heinlein:20201130102359p:plain
検索後を入力したら検索ボタンをクリックして処理をしたい。

取得方法

@page "/textbox"

<div class="row">
    <div class="col-md-6">
        <RadzenTextBox @bind-value="@TextValue" />
        <RadzenButton Text="検索" Click="@SearchClick" />
    </div>
</div>

@code {

    private string TextValue;

    void SearchClick()
    {
        string InputValue = TextValue;
        //ここから適当な処理...

    }
}

英語サイトのサンプルコードを参考にして何とか実現できました。
要は
「@bind-value」に設定した名称「TextValue」がそのまま変数として利用できるようです。

こんな簡単なことをするのにもすごく苦しんでしまいました。
まだまだハードルは高そうです。。。

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

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

ASP.NETでBlazor Radzen を使ってみる

ASP.NET CoreでBlazor(ブレイザー)を試してみました。
その際に、
Blazor向けのUIフレームワークであるRadzen Blazor Componentsなる便利なものが
あるようなので一緒に試してみました。

プロジェクトを作成して、Radzenを使えるようにするまでの方法です。
Visual Studio Community 2019 for Macで動作確認をしています。

プロジェクト作成

新しいプロジェクトのテンプレートから「Blazorサーバー アプリ」を選択します。

Blazorサーバー アプリ

今回は簡単な確認用なので認証なしで作成します。

まずは動かしてみます。

Blazorで「Hello, world!」です。アプリが無事に動きました!

NuGetでパッケージ追加

次に、Radzen Blazor Componentsを使えるように設定します。
NuGetを使って「Radzen.Blazor」を追加します。

ファイル修正

プロジェクトフォルダのルートにある「_Imports.razor」にRadzen.blazorの参照を追記します。

@using Radzen.Blazor

次は、CSSです。
Pagesフォルダにある「_Host.cshtml」のheadに追記します。

    <link rel="stylesheet" href="_content/Radzen.Blazor/css/default-base.css">
    <link rel="stylesheet" href="_content/Radzen.Blazor/css/default.css">
    <script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script>
    <script src="_content/BlazorInputFile/inputfile.js"></script>

最終確認

簡単なコードを貼り付けてRadzenが動くか確認してみます。
Pagesフォルダにある「Index.razor」を修正します。

<div class="row">
    <div class="col-md-6">
        <h3>Simple login</h3>
        <RadzenCard>
            <RadzenLogin AllowRegister="false" AllowResetPassword="false" />
        </RadzenCard>
    </div>
</div>

そして実行結果です。
f:id:Heinlein:20201026094947p:plain
貼り付けたコードは RadzenLoginタグだけです。
このタグが一つだけで、UsernameとPasswordのテキストボックスと
Loginのボタンまで出力されました。
ものすごく簡単にログイン画面が実現できてしまいました。

こちらのサイトにRadzenのサンプルがたくさんありますので
blazor.radzen.com
使いたいコンポーネントを選ぶことができます。

おすすめApple小物

Apple Watch 充電 スタンドです。
Apple Watchをセットすると、ちょうどディプレイのようになるカッコよさ。
形状が昔のマッキントッシュなのが泣かせます。

【送料無料】【シリコン素材】【Apple Watch 充電 スタンド】【アップルウォッチ 充電 スタンド】【横置き】パソコンデザイン おしゃれ かわいい 充電スタンド 軽量 簡単 設置 机 デスク ベッド 人気 オススメ 便利グッズ

価格:1,881円
(2020/11/29 14:58時点)
感想(3件)

macOS Mojaveへアップグレード。やはりApache環境動かず

macOS High Sierraから1年またmacOSのバージョンがアップされました。
macOS Mojave モハベと読むらしいですね。
今回はちょっと語感があんまりカッコよくないですねー。

で、
アップグレードすると決まってlocalのApache環境が動かなくなります。
これは、OSに付属しているApacheを利用しているから
アップグレードすると設定ファイルがリネームされてしまうからです。

備忘録的にどのファイルが書き換えられたかメモっておきます。

/etc/apache2/httpd.conf
/etc/apache2/extra/httpd-userdir.conf
/etc/apache2/extra/httpd-vhosts.conf

この3ファイルが「~previous」をつけられてリネームされておりました。
3ファイルを戻してOKとなりました。

今回のグレードアップで
Apache2.4.34
PHP 7.1.19
となりました。

ASP.NET Core MVC MySQLへ画像ファイルを保存・表示してみる

ASP.NETで画像ファイルをMySQLに保存する方法を調査してみました。
正常に保存されているか確認するために、表示もしてみます。
Visual Studio Community 2017 for Mac で動作確認しています。

Model

Idと画像ファイル保存用だけのシンプルなクラスです。

public class TestImage
{
    [Key]        
    public int Id { get; set; }

    [Column(TypeName = "mediumblob")]
    public byte[] ImageFile { get; set; }
}

C#側は、byte[]、MySQL側は mediumblob型 を指定します。
MySQLの型を指定しないでマイグレーションを実行すると
blob型にマッピングされます。
blob型だと、保存できるファイルサイズが64KBまでとなりますので注意が必要です。
あとは、マイグレーションを実行してMySQLにテーブルを作成します。

Controller MySQLへ保存

using System.Drawing;
using System.IO;

public IActionResult Index()
{
    Bitmap Image = new Bitmap("/tmp/20151101-1.png");
    MemoryStream ms = new MemoryStream();
    Image.Save(ms, Image.RawFormat);
    
    var TestImage = new TestImage
    {
        ImageFile = ms.ToArray()
    };

     DbContext.TestImage.Add(TestImage );
     DbContext.SaveChanges();

     return View();
}

画像を保存するテストなので/tmpフォルダに画像ファイルがある前提です。

画像を表示する View と Controller

まずはViewです。

<div>
    <p>画像表示</p>
    <img src="Home/ImageDisp/5" width="50">
</div>

そして、Controller。

public IActionResult ImageDisp(int Id)
{
         var Img = DbContext.TestImage.SingleOrDefault(m => m.Id == Id);
         MemoryStream ms = new MemoryStream(Img.ImageFile);

         return new FileStreamResult(ms, "image/png");
}

引数にIdを渡して、そのIdから画像のデータを取得して画像データを戻します。

今回は案外ハマらずにすんなりと実現することができました。
これぐらい順調に実現できるとASP.NETも楽しく感じます。

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

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

C# LINQで動的なWhereを実現する

LINQを使うととても便利で驚かされます。
複雑なLINQを書いている時には、パズルみたいで不思議な楽しみもあるものです。

このLINQ
決まった条件での抽出(Where)はいいのですが、条件が動的な場合に
とたんに途方にくれてしまいます。

たとえば、売上データを検索するとして
日付で検索したり、金額で検索したりとゆうことはよくあると思います。
つまり、検索条件があったりなかったり。

SQL文でデータベースを操作しているときには
SQL文の文字列を組み立てるだけですのでとても簡単なのですが。

で、
LINQで動的にWhereを実現する方法を調べてみました。
Visual Studio Community 2017 for Mac で動作確認しています。

LINQ拡張機能

LINQの記述方法がラムダ式の場合の方法です。
ラムダ式だとメソッドチェーンでだらだらと記述をすることができます。
この時に、自分で拡張機能を作成すると独自のメソッドを書くことができます。

ものすごーくネットを検索して見つけました。

using System.Linq;
using System.Linq.Expressions;

public static IQueryable<TSource> WhereIf<TSource>
                            (this IQueryable<TSource> Source, bool Condition, Expression<Func<TSource, bool>> Predicate)
    {
            if (Condition)
                return Source.Where(Predicate);
            else
                return Source;
    }

実際に利用する時には

 var Result = DbContext.Uriage
                       .WhereIf(viewSearch.Amount != null, u => u.Amount >= viewSearch.Amount)
                       .ToArray();

つまり、検索画面からの検索条件である「金額:Amount」の入力があった時だけ
Whereを実行してくれます。
これで動的なLINQを実現することができました。

ただ、
ネットで調べてやっと実現できただけで、自分の力ではとても実現できないですね。

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

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

Mac Smartyで画面が真っ白になる

PHP + Smartyで開発されたシステムをリプレースする仕事を受注したので
Macに環境をつくったのですが、画面が表示されません。

簡単に解決するだろうと思ったのですが、ハマりにハマり。
解決するまで相当な時間がかかってしまいました。

開発環境

・OS macOS High Sierra
・PHP7
Smarty 2.6.14

現象

ブラウザからhttpアクセスしても何も表示されずに
真っ白になる。
具体的には、compileフォルダへ出力されるキャッシュファイルの中身が
何もない。
tplファイルはきちんとあります。

解決した方法

smarty/Smarty_Compiler.class.phpの267行目くらいにある

$source_content = preg_replace($search.'e', "'"
                . $this->_quote_replace($this->left_delimiter) . 'php'
                . "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
                . $this->_quote_replace($this->right_delimiter)
                . "'"
                , $source_content);

$source_content = preg_replace_callback($search, create_function ('$matches', "return '"
                . $this->_quote_replace($this->left_delimiter) . 'php'
                . "' . str_repeat(\"\n\", substr_count('\$matches[1]', \"\n\")) .'"
                . $this->_quote_replace($this->right_delimiter)
                . "';")
                , $source_content);

へ変更したら無事に表示されるようになりました。

PHP7では、preg_replaceのe修飾子を使うと、Warningを吐きつつNULLを返すようですね。
それでtplファイルを読み込んで出力できなかったようです。
ネットを探し回ってやっと解決することができました。
ソフト開発の仕事はハマってばっかりですね。