【Web】OpenBugBountyからメールが来たときの対応

「juraku-software.net Security Vulnerability Notification | OBB-1717685 | Important」という件名のメールが突然届きました。(このページを記載している時点で問題は解消済みです)

メール本文はこんな感じです。

どうもセキュリティの問題があったらしく、それを知らせてくれたとのこと。
詳細を知るには、担当者にメールする必要があります。
送られてきたメールのレポートURLをクリックすると「Discovered and Reported by:」という項目のリンクをクリックすると担当者のメールアドレスが分かるので、英語で質問する(レポートURLと、Please bug descriptionみたいな英語だけ書けば大丈夫でした)。

対応しないまま放置すると、問題内容が公開されてしまうようなので早めに対応した方がよさそうです。

対応完了後、寄付を求められたのでせっかく調べてくれたので寄付しました(今回の問題はphpinfo.phpを残したままだったと何ともお粗末な内容でした・・・)

ちゃんと対応すればセキュリティの問題も解消され、外国の方ともメールできるいい機会なのでこのメールが来たら対応した方がよいでしょう。メールの返信も30分以内には返ってきました。

【C#】列挙体で複数の値を選択する

動作確認

Visual Studio 2017 C#

列挙体の定義

[Flags]
private enum EnumSample
{
    //項目が混じらないように、それぞれ立てるビットの位置を変える
    a = 0b0001,     //「0b」から始めると2進数で書ける
    b = 0b0010,
    c = 0b0100,
    d = 0b1000
}

使い方

//aとcを選択する
var sample = EnumSample.a | EnumSample.c;

//選択されているかはHasFlagを利用して確認する
if (sample.HasFlag(EnumSample.a))
{
    //こっちに来る
    Console.WriteLine("aは存在");
}
else
{
    //こっちには来ない
    Console.WriteLine("aは未存在");
}

//どの項目が選択されているかを確認したい場合は、列挙体の全項目を回してチェックできる
foreach (EnumSample enumValue in Enum.GetValues(typeof(EnumSample)))
{
    Console.WriteLine($"{enumValue} = " + sample.HasFlag(enumValue));
    /*
     * 実行結果
     * a = True
     * b = False
     * c = True
     * d = False
     */
}

【C#】コンソール出力の文字色を変更する

C#のコンソールアプリにて、表示する文字色を変更するにはForegroundColorを変更する。

Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("*****黄*****");

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("*****緑*****");

Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("*****赤*****");

Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine("****元の色****");

元の色はGray。 多用すると逆に見にくいので、エラー発生時などの出力の際には黄色を使うとよいかも。

【Visual Studio2017】コマンドラインからビルドすると「80131577」エラーが発生する

現象

devenv.exeをコマンドラインから実行し、ソースをビルドすると、
ERROR: An error occurred while validating. HRESULT = ‘80131577’
が発生してビルドに失敗する。

環境

Visual Studio 2017 Community

対処方法

必要なNuGetパッケージが存在していないのが原因。Visual Studioを起動し、NuGet パッケージの復元を行えばOK

【Android】開発環境をEclipseからAndroid Studioに移行したときにハマった内容メモ

2011年に作成したアプリを、2020年の今になってバージョンアップすることにしました。以前はEcliseで開発していたので、Android Studioに移行した際にハマった点をメモします(もう皆さんとっくに移行済みだと思うので、自分の備忘として記載)

Android Studio

日本語化しない方がいいです。問題が発生したとき、英語のエラーメッセージでそのまま検索し、翻訳した方がゴールへ近いです。

起動してから2~3分は何もしないで放置しておいた方がよいです。起動してすぐにデバッグしようとしたら謎のエラーが出て困ったのですが、しばらく放置していたら自然と消えました。
ちょっと面倒ですが、Eclipseより断然安定してデバッグできます。

プロジェクトの移行

Android Studioの移行機能は使わない方がよいです。謎のエラーにハマります。新規プロジェクトでActivityなしを選択し、作成されたプロジェクトに既存のJavaソースを入れた方がよいです。
Javaソースはそのまま使えました。
※ソースのフォルダパス中に日本語が含まれるとエラーになります。

ActivityやRなどの仕組みもそのままでした。懐かしい。。。

AndroidManifest.xmlも引き続き存在していますが、ただ、Sdkのバージョン等の指定はこのファイルではなく、build.gradleというファイル内で行うように変わっています。
2020/10/11現在、minSdkVersionは14(Android 4.0)以上しか指定できません。
SDKのバージョンはこちらのWikiを参考にしました。

DatePicker

日付選択に利用していたDatePickerのデザインが大きく変わっていました。年月日をそれぞれ指定するコントロールだったのですが、カレンダー形式になっています。

次の2つのプロパティを指定することで、これまでと同じデザインに戻せました。

android:calendarViewShown="false"
android:datePickerMode="spinner"

Activityの背景色

黒色がデフォルトだったのですが、白色に変わっていました。
元の色に戻れば良いので、「setBackgroundColor(Color.BLACK)」にて色を変更しました。

ネットからデータのダウンロードはメインスレッドでは不可

実行時エラーになってしまうようになりました。
このサイトを参考に非同期に変更しました。

GPSの取得

これは未だに良くわかっていませんが、以下のように指定したところ、以前作成したよりもGPSの受信頻度が格段に上がりました(2種類指定する)。これで様子を見ようかと思います。

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, this);
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500, 1, this);

パーミッションのリクエスト

以前はAndroidMarketからダウンロードする際に、必要な権限の承諾が求められたはずですが、これがアプリ起動時の承諾に変わっています。

そのため、いきなりActivityを表示するとエラーになってしまいます。
権限を承諾してくれない場合も考慮する必要があります(といっても、承諾してくれなければアプリが使えないので、「許可してください」といったメッセージを表示するくらいしかできないのですが・・・)

こちらのサイトを参考に、承諾画面の表示と、承諾された場合のイベントを実装することで対処できました。

アプリのアイコン

以前はサイズ違いのファイルを用意して、それぞれのフォルダに配置していって面倒だった記憶がありますが、今はとても楽になりました。

こちらのサイトを参照ください。

終わりに

ずっとバージョンアップできずにいたのですが、一度やり始めてしまえば何とかなりました。日本語のサイトが少なくなっている気がしますので、眠っているソースがあれば早めに以降した方がよさそうです。

【Windowsアプリ】閉じるボタン隠すくん


Ver 1.0.1(2020/10/05公開)

閉じるボタンの上に四角い枠を表示することによって、閉じるボタンを誤って押してしまうことを防ぎます。

Windows 10対応
フリーソフト100さんに紹介して頂きました

ダウンロード

ダウンロード(82KB)
※ダウンロード後、Zipファイルを解凍する前に、ファイルを右クリック→全般タブの一番下のセキュリティの「許可する」にチェックを入れて、「OK」ボタンをクリックした後に、解凍してください。

Vectorでも公開しています

開発環境:Visual Stuido 2017(C#)

【C#】【Linq】ファイル名の昇順に並べたリストを作成する

目的

ファイル名が「file1.txt」「file2.txt」「file10.txt」などの規則性がある場合に、正しくソートしたい場合を想定。 今回は、ファイル名中の数値のみを正規表現で取得し、それをソートすることで実現した。

ソースコード

var fileList = (new DirectoryInfo(filePath)).GetFiles().
    Select(x =>
    new
    {
        name = x.FullName,
        //ファイル名だけ取り出す→数字だけ残す→数値に変換する(ソート用)
        no = int.Parse(Regex.Replace(Path.GetFileName(x.FullName), @"[^0-9]", ""))
    }
    ).OrderBy(x => x.no).ToList();

【C#】slack APIを実行し、結果を取得する

目的

slackのAPIをC#から実行し、結果を受け取る

必要なもの

slack APIの実行に必要なtoken

slack上でアプリを新規作成し、OAuth Access Tokenを入手する。このとき、OAuth&PermissionsのUser Token Scopesに「files:read」をつけると、今回実行するfiles.listが実行できるようになる。

slack APIの調査(slack API Tester)

https://api.slack.com/methods/files.list/test
のようなテストページが用意されているので、こちらを使って試すことができる。
tokenは、「No token」を指定して上記のOAuth Access Tokenを指定する。
ページ下部の「Test Method」をクリックすると実行され、結果が表示される。
実行したURLも表示されるので、このURLを使う。

NuGetにてNewtonsoft.Jsonをインストールする

APIの戻り値がJSON形式で返ってくるため、各値を取得しやすいようにする。

ソースコード(WindowForms)

private const string TOKEN = "xxx-xxx-xxx-xxx-xxx";

/// <summary>
/// ボタンクリックイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param> private async void button1_Click(object sender, EventArgs e) {
//URL貼り付け var result = await GetData($"https://slack.com/api/files.list?token={TOKEN}&count=100&pretty=1");
//JObject型にキャストする var jsonValue = (Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(result);
//ok、files、pagingの3つの要素が返ってくるので、ここではfilesを取得 var files = jsonValue["files"]; foreach (var file in files) {
//各値を取得 Console.WriteLine(file["id"]); Console.WriteLine(file["name"]); } }
/// <summary>
/// 渡されたURLへアクセスし、返ってきた値を返す
/// </summary>
/// <param name="url"></param>
/// <returns></returns> private async Task GetData(string url) { using (var client = new HttpClient()) { var res = await client.GetAsync(url); return await res.Content.ReadAsStringAsync(); } }

【C#】【JSKExcelWrapper.dll】Excelファイルへデータ転記、テンプレート(ひな形)ファイルを利用した帳票形式出力

C#でのExcel出力が簡単にできるDLLの提供サービスを行っています。
詳細はこちらをご確認ください。
このページでは、その使い方を紹介しています。

//Excel起動
using (var excelWrapper = new JSKExcelWrapper.JSKExcelWrapper())
{
    //テンプレート(ひな形)ファイルパス取得
    var templatePath = Path.Combine(Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath), @"テンプレート\帳票テンプレート.xlsx");

    //◆Excelファイル開く
    excelWrapper.OpenWorkbook(templatePath);

    //◆シート取得
    Worksheet worksheet = excelWrapper.GetWorksheet("template");

    //帳票形式で表示させるためのダミーデータ
    var dummyData = new List<string[]>()
    {
        new string[]{"A001", "部品1", "TEST-A001", "汎用部品1", "メモ1"},
        new string[]{"A002", "部品2", "TEST-A002", "汎用部品2", "メモ2"},
        new string[]{"A003", "部品3", "TEST-A003", "汎用部品3", "メモ3"},
        new string[]{"A004", "部品4", "TEST-A004", "汎用部品4", "メモ4"},
        new string[]{"A005", "部品5", "TEST-A005", "汎用部品5", "メモ5"},
        new string[]{"A006", "部品6", "TEST-A006", "汎用部品6", "メモ6"},
        new string[]{"A001", "部品1", "TEST-A001", "汎用部品1", "メモ1"},
        new string[]{"A002", "部品2", "TEST-A002", "汎用部品2", "メモ2"},
        new string[]{"A003", "部品3", "TEST-A003", "汎用部品3", "メモ3"},
        new string[]{"A004", "部品4", "TEST-A004", "汎用部品4", "メモ4"},
        new string[]{"A005", "部品5", "TEST-A005", "汎用部品5", "メモ5"},
        new string[]{"A006", "部品6", "TEST-A006", "汎用部品6", "メモ6"},
        new string[]{"A001", "部品1", "TEST-A001", "汎用部品1", "メモ1"},
        new string[]{"A002", "部品2", "TEST-A002", "汎用部品2", "メモ2"},
        new string[]{"A003", "部品3", "TEST-A003", "汎用部品3", "メモ3"},
        new string[]{"A004", "部品4", "TEST-A004", "汎用部品4", "メモ4"},
        new string[]{"A005", "部品5", "TEST-A005", "汎用部品5", "メモ5"},
        new string[]{"A006", "部品6", "TEST-A006", "汎用部品6", "メモ6"},
        new string[]{"A001", "部品1", "TEST-A001", "汎用部品1", "メモ1"},
        new string[]{"A002", "部品2", "TEST-A002", "汎用部品2", "メモ2"},
        new string[]{"A003", "部品3", "TEST-A003", "汎用部品3", "メモ3"},
        new string[]{"A004", "部品4", "TEST-A004", "汎用部品4", "メモ4"},
        new string[]{"A005", "部品5", "TEST-A005", "汎用部品5", "メモ5"},
        new string[]{"A006", "部品6", "TEST-A006", "汎用部品6", "メモ6"},
        new string[]{"A001", "部品1", "TEST-A001", "汎用部品1", "メモ1"},
        new string[]{"A002", "部品2", "TEST-A002", "汎用部品2", "メモ2"},
        new string[]{"A003", "部品3", "TEST-A003", "汎用部品3", "メモ3"},
        new string[]{"A004", "部品4", "TEST-A004", "汎用部品4", "メモ4"},
        new string[]{"A005", "部品5", "TEST-A005", "汎用部品5", "メモ5"},
        new string[]{"A006", "部品6", "TEST-A006", "汎用部品6", "メモ6"},
        new string[]{"A001", "部品1", "TEST-A001", "汎用部品1", "メモ1"},
        new string[]{"A002", "部品2", "TEST-A002", "汎用部品2", "メモ2"},
        new string[]{"A003", "部品3", "TEST-A003", "汎用部品3", "メモ3"},
        new string[]{"A004", "部品4", "TEST-A004", "汎用部品4", "メモ4"},
        new string[]{"A005", "部品5", "TEST-A005", "汎用部品5", "メモ5"},
        new string[]{"A006", "部品6", "TEST-A006", "汎用部品6", "メモ6"},
    };

    //◆テンプレートファイルの各セルに設定されたセル名から、転記すするセル番地を取得する
    var indexCode1 = excelWrapper.GetExcelIndexData(worksheet, "コード");
    var indexName1 = excelWrapper.GetExcelIndexData(worksheet, "名称");
    var indexCode2 = excelWrapper.GetExcelIndexData(worksheet, "コード2");
    var indexName2 = excelWrapper.GetExcelIndexData(worksheet, "名称2");
    var indexMemo = excelWrapper.GetExcelIndexData(worksheet, "メモ");

    //◆データ数分、明細行を行コピーする(罫線や書式もコピーされる)
    excelWrapper.CopyRow(worksheet,
        indexCode1.rowIndex/*コピー行の行番号(開始)*/,
        indexCode1.rowIndex/*コピー行の行番号(終了)*/,
        indexCode1.rowIndex + 1/*貼り付ける位置の行番号(開始)  最初の1行はすでに存在しているので、次の行からコピーする*/,
        indexCode1.rowIndex + dummyData.Count - 1/*貼り付ける位置の行番号(終了)  最初の1行はすでに存在しているので、-1する*/);

    //データの行数分回す
    foreach (var data in dummyData)
    {
        //◆転記
        excelWrapper.SetCellValue(worksheet, indexCode1, data[0]);
        excelWrapper.SetCellValue(worksheet, indexName1, data[1]);
        excelWrapper.SetCellValue(worksheet, indexCode2, data[2]);
        excelWrapper.SetCellValue(worksheet, indexName2, data[3]);
        excelWrapper.SetCellValue(worksheet, indexMemo, data[4]);

        //◆記載が終わったので、次の行へインデックスをずらす
        indexCode1.NextRow();
        indexName1.NextRow();
        indexCode2.NextRow();
        indexName2.NextRow();
        indexMemo.NextRow();
    }


    //出力先パス(このEXEと同じフォルダに出力)
    var fileBase = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\サンプル出力⑤_" + DateTime.Now.ToString("yyyyMMddHHmmss");

    //◆ファイル出力
    excelWrapper.SaveExcel(fileBase + ".xlsx");     //Excelファイル出力
    excelWrapper.SavePDF(fileBase + ".pdf");        //PDFファイル出力

    //◆プレビュー表示
    excelWrapper.Preview();
}

【C#】【JSKExcelWrapper.dll】Excelファイルへシート追加、シート名変更、改ページ設定

C#でのExcel出力が簡単にできるDLLの提供サービスを行っています。
詳細はこちらをご確認ください。
このページでは、その使い方を紹介しています。

//Excel起動
using (var excelWrapper = new JSKExcelWrapper.JSKExcelWrapper())
{
    //◆シート追加
    var worksheetSample1 = excelWrapper.AddWorksheet("Sample1");
    var worksheetSample2 = excelWrapper.AddWorksheet("Sample2");

    //◆シート名変更(__Sample__から、NewSheetに変更)
    worksheetSample2 = excelWrapper.ChangeWorksheetName("Sample2", "NewSheet2");

    //◆シート削除(Sheet1というシートが自動作成されるので削除する)
    excelWrapper.DeleteWorksheet("Sheet1");

    //◆シート非表示
    excelWrapper.HideWorksheet(worksheetSample2);

    //◆シート表示
    excelWrapper.ShowWorksheet(worksheetSample2);


    //◆文字入力(A1~D100の全セルに「テスト」という文字を書き込む)
    excelWrapper.SetCellValue(worksheetSample1, "A1:H30", "テスト");

    //◆罫線
    excelWrapper.SetLine(worksheetSample1, "A1:H30");

    //◆改ページクリア(現在設定されている改ページをすべて消す)
    excelWrapper.ClearAlllBreaks(worksheetSample1);


    //◆改ページ設定(縦方向)
    excelWrapper.SetVPageBreaks(worksheetSample1, "E15");

    //◆改ページ設定(横方向)
    excelWrapper.SetHPageBreaks(worksheetSample1, "A16");

    //◆シートコピー(コピー元、コピー先)
    excelWrapper.CopyWorksheet("Sample1", "コピーしたシート");


    //出力先パス(このEXEと同じフォルダに出力)
    var fileBase = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\サンプル出力④_" + DateTime.Now.ToString("yyyyMMddHHmmss");

    //◆ファイル出力
    excelWrapper.SaveExcel(fileBase + ".xlsx");     //Excelファイル出力
    excelWrapper.SavePDF(fileBase + ".pdf");        //PDFファイル出力

    //◆プレビュー表示
    excelWrapper.Preview();
}