はてなブログがカスタムドメインのHTTPS化に対応したのに合わせて、本サイトもHTTPS化しました。
なお、画像など一部がHTTPS配信のままになっていますが、簡単にURLを修正する手段がなく、手間が掛かりすぎるので、取りあえずこのままになります。
はてなブログがカスタムドメインのHTTPS化に対応したのに合わせて、本サイトもHTTPS化しました。
なお、画像など一部がHTTPS配信のままになっていますが、簡単にURLを修正する手段がなく、手間が掛かりすぎるので、取りあえずこのままになります。
C#で、UTF-8エンコードのテキストファイルを読み込んで、Shift_JISエンコードのテキストファイルを書き出すときに、変換できないUnicode文字が存在する可能性があります。そのUnicode文字の代替として、HTML文字実体参照(Character Entity Reference)の「&#x+16進数」表記文字列に置き換える方法を、この記事で共有します。
なお、文字実体参照という表記になっているのは、僕の都合なので、必要に応じて別の表現も可能です。例えば「U+16進数表記」のUnicodeスカラー値で表現することが考えられます。
サンプルコードをオープンソースで公開します。as-isでサポートもなしとさせていただきます。
ソースコードは次のリンク先を参照してください: isshiki/UnicodeToSJISfallback: https://github.com/isshiki/UnicodeToSJISfallback
内容の説明はソースコード内にたくさん書かれていますので、それを参考にしてください。
using System.IO; using InsidersCMS; namespace UnicodeToSJISfallback { class Program { static void Main(string[] args) { var text = "㉑😀𩸽"; var bytesSJIS = CmsUtility.Encoding.ShiftJISwithReplaceFallback.GetBytes(text); File.WriteAllBytes(@"C:\sample\test.txt", bytesSJIS); } } }
using System; using System.Text; namespace InsidersCMS { public static class CmsUtility { public static class Encoding { public static System.Text.Encoding ShiftJISwithReplaceFallback = System.Text.Encoding.GetEncoding("Shift_JIS", new EncoderUnicodeToSJisFallback(), DecoderFallback.ReplacementFallback); } private const int MAX_COUNT_CharacterEntityReference = 10; // Unicode文字実体参照の最大長( � ~  まで) // 入力文字をエンコードできない場合、このフォールバック(=エラー時の代替処理機構)が使用されるクラス。 private class EncoderUnicodeToSJisFallback : EncoderFallback { // エンコーダーのフォールバック バッファーを提供するオブジェクトを生成して返す。 public override EncoderFallbackBuffer CreateFallbackBuffer() { return new EncoderUnicodeToSJisFallbackBuffer(); } // エンコードできなかった「入力文字」を置き換える「代替文字列」の最大文字数を返す。 public override int MaxCharCount { get { return MAX_COUNT_CharacterEntityReference; } // 具体的には "©" のようなUnicode文字実体参照表記の長ささになる。 } } // 入力文字をエンコードできないときに、エンコーダーに代替文字列を返せるようにするためのバッファーとして使われるクラス。 private class EncoderUnicodeToSJisFallbackBuffer : EncoderFallbackBuffer { // 代替文字列のバッファー private string alternativeCharBuffer; // 代替文字列のバッファーにおける現在位置 private int currentPosition; // 代替文字列への変換もできなかった場合のエラー文字(通常はないと思われるが念のため) private string giveupString = "★"; public EncoderUnicodeToSJisFallbackBuffer() { Reset(); // 状態を初期化する } // 代替文字列のバッファーで、処理されずに残っている文字数。 public override int Remaining { get { return alternativeCharBuffer.Length - currentPosition; } } // エンコードできないUnicode文字が見つかるとこのメソッドが呼び出されるので、 // その入力文字を代替文字列に置き換えてバッファーに保存する。 public override bool Fallback(char charUnknown, int index) { // charUnknown: 入力文字 // index: 入力バッファーにおける文字のインデックス位置 if (currentPosition < alternativeCharBuffer.Length) { // ここに来るのは、現在位置が代替文字列バッファーの最後まで到達していない状態 throw new ArgumentException("原因がよく分からないけど、" + "代替文字列バッファーの全ての文字が取得されていない状態で、" + "さらに新しいUnicode文字がフォールバックされている。" + "基本的には起こりえないエラーが発生してしまった。"); } // このクラスでは、エンコードできない文字は「Unicode文字実体参照表記」の文字配列に置き換える。 // ちなみに、Unicodeは1文字あたり2バイト(0x0000~0xFFFF)で、16進数の場合は「&#x+16進数」で表記する。例えば「©」を表すには「©」となる。 alternativeCharBuffer = String.Format("&#x{0:x};", (int)charUnknown); if (alternativeCharBuffer.Length > MAX_COUNT_CharacterEntityReference) { alternativeCharBuffer = giveupString; } currentPosition = 0; // 代替文字列バッファーを作り直したので、現在位置を先頭に初期化する。 return true; // Unicode文字を処理できる場合は true。できずに無視する場合はfalse。 } // エンコードできないUnicodeサロゲート文字が見つかるとこのメソッドが呼び出されるので、 // その入力サロゲート文字を代替文字列に置き換えてバッファーに保存する。 public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index) { // charUnknownHigh: 入力ペアの上位サロゲート。最小値=U+D800、最大値=0xDBFF。 // charUnknownLow: 入力ペアの下位サロゲート。最小値=0xDC00、最大値= 0xDFFF。 // index: 入力バッファーにおけるサロゲートペアのインデックス位置。 if (currentPosition < alternativeCharBuffer.Length) { // ここに来るのは、現在位置が代替文字列バッファーの最後まで到達していない状態 throw new ArgumentException("原因がよく分からないけど、" + "代替文字列バッファーの全ての文字が取得されていない状態で、" + "さらに新しいUnicodeサロゲート文字がフォールバックされている。" + "基本的には起こりえないエラーが発生してしまった。"); } // サロゲートペアを単一文字に変換する( 0x010000 ~ 0x10ffff の範囲になるはず)。 int surrogateChar = 0x10000 + ((int)charUnknownHigh - 0xD800) * 0x400 + ((int)charUnknownLow - 0xDC00); // このクラスでは、エンコードできない文字は「Unicode文字実体参照表記」の文字配列に置き換える。 // ちなみに、Unicodeサロゲート文字は1文字あたり4バイト(0x010000~0x10ffff)で、16進数の場合は「&#x+16進数」で表記する。例えば「𪚲」を表すには「𪚲」となる。 alternativeCharBuffer = String.Format("&#x{0:x};", (int)surrogateChar); if (alternativeCharBuffer.Length > MAX_COUNT_CharacterEntityReference) { alternativeCharBuffer = giveupString; } currentPosition = 0; // 代替文字列バッファーを作り直したので、現在位置を先頭に初期化する。 return true; // サロゲートペアを処理できる場合は true。できずに無視する場合は false。 } // 代替文字列バッファーにおける次の1文字を取得する。 // ※代替文字列はこのクラスのバッファーから1文字ずつ取得されながら完成するので、ここは頻繁に呼び出される。 public override char GetNextChar() { if (currentPosition >= alternativeCharBuffer.Length) { // 現在位置がバッファーの長さに到達しているので、次の文字はない。 return (char)0; //「次の文字はない」という意味。 } return alternativeCharBuffer[currentPosition++]; // 代替文字列バッファーの次の開始位置の1文字を返す。 } // 代替文字列バッファーにおける前の文字位置に移動する。 public override bool MovePrevious() { if (currentPosition <= 0) { return false; // 現在位置が0では、前に移動することは不可能 } currentPosition--; // 前の文字列位置へ移動 return true; // 前の文字列位置へ移動した場合は true。それ以外の場合は false。 } // フォールバックバッファーに関連するすべてのデータおよびステータス情報を初期化する。 public override void Reset() { alternativeCharBuffer = String.Empty; currentPosition = 0; base.Reset(); } } } }
必要になり、Slackファイルを全(1000件ずつ)削除するツールを作ってみたので、オープンソースで公開します。C#で作成しています。
as-isでサポートもなしとさせていただきます。
使い方やソースコードなど詳しくは下記リンク先を参照してください: isshiki/SlackFilesCleaner: Slackファイルを全(1000件ずつ)削除するツール。 https://github.com/isshiki/SlackFilesCleaner
7~8年前に作ったThunderbird add-onの「ReFwdFormatter」のバージョン 1.57.0をリリースしました。Thunderbird 57.0までをサポートしています。
ここ数年のAMO ( addons.mozilla.org ) の審査基準の厳格化に伴い、バージョンの自動更新に合格できなくなっていましたが、海外からのメール問い合わせもあり、重い腰を上げて一気にコードを書き直しました。ロジックも微妙に変わっているところもあるかも。
そしてコードも今の時代に合わせてオープンソースに変更しました。
アドオン開発ばかりに構ってもいられないので、協働で開発・公開作業をしてくる GitHub Collaborator (開発作業) & Add-on Authors - Developer for AMO (公開作業) を募集します。お気軽にGitHub経由などでご連絡ください。
今、インストール済みのVMware Fusionがトラブっていて検索したら、たまたま気付いたので急いでこの記事書きました。
なんと30%オフです! たぶん21日~26日の期間でやってる。日本時間で26日土曜日の正午には終わってしまう模様。
セールされているのは、
終了
終了 - Workstation Pro
終了
(手軽に画像はれなかった...)
の4製品で、アップグレードも割り引かれる。ちなみに自分は、先ほどWindows 10対応した最新のFusion 8にアップグレードしました。でもトラブル解決できてないけど。
Windows 10+Visual Studio 2015でユニバーサルアプリを作ろうとして、XAMLデザイナーで次のようなエラーが発生する場合。
System.Exception
パッケージを登録できませんでした。
エラー 0x80070005: 要求を処理しているときに次のエラーが発生したため、windows.capability 拡張を登録できませんでした: アクセスが拒否されました。
。
場所 Microsoft.VisualStudio.DesignTools.HostUtility.Platform.AppContainerProcessDomainFactory.CreateDesignerProcess(String applicationPath, String clientPort, Uri hostUri, IDictionary environmentVariables, Int32& processId, Object& processData)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.Primitives.ProcessDomainFactory.ProcessIsolationDomain..ctor(ProcessDomainFactory factory, IIsolationBoundary boundary, AppDomainSetup appDomainInfo, IIsolationTarget isolationTarget, String baseDirectory)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.Primitives.ProcessDomainFactory.CreateIsolationDomain(IIsolationBoundary boundary)
場所 Microsoft.VisualStudio.DesignTools.HostUtility.Platform.AppContainerProcessDomainFactory.CreateIsolationDomain(IIsolationBoundary boundary)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.Primitives.IsolationBoundary.Initialize()
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.Primitives.IsolationBoundary.CreateInstanceT
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.IsolatedObjectFactory.Initialize()
場所 Microsoft.VisualStudio.DesignTools.DesignerHost.Services.VSIsolationService.CreateObjectFactory(IIsolationTarget isolationTarget, IObjectCatalog catalog)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.IsolationService.CreateLease(IIsolationTarget isolationTarget)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.IsolationService.CreateLease(IIsolationTarget isolationTarget)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.IsolatedDesignerService.CreateLease(IIsolationTarget isolationTarget, CancellationToken cancelToken, DesignerServiceEntry& entry, IServiceProvider serviceOverrides)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.IsolatedDesignerService.IsolatedDesignerView.CreateDesignerViewInfo(CancellationToken cancelToken)
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.IsolatedTaskScheduler.InvokeWithCultureT
場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.IsolatedTaskScheduler.<>c__DisplayClass10_01.<StartTask>b__0()<br> 場所 System.Threading.Tasks.Task
1.InnerInvoke()
場所 System.Threading.Tasks.Task.Execute()
Windows 10の開発者モードが有効になっていないことが理由のようです。エラー内容が分かりにくいですね...。
これを次の手順で、[設定]か有効にしてあげると解決できます。※わたしの場合は解決できていますが、それ以外のエラーの場合は分かりません。
▼
▼
Windows 10をISOファイルからインストールする際に、Windows 8.1→10でエディションなどについてもアップグレードパスに何の問題もないにも関わらず、「このアップグレードパスはサポートされていません」というエラーが出て困っている方へ。これを回避する手段を紹介します。
いったんエラーが出たセットアップをタスクマネージャー([Ctrl]+[Alt]+[Del]キーの表示から起動可能)から終了して、 Windows 10インストーラーのドライブ(ISOファイル)の中の「<ドライブ名>:\sources\setupprep.exe」を実行すると、 アップグレードパスに関するエラーを回避した状態でセットアップを実行できます。
・参考にした元ネタ: [FIX] Windows Upgrade Error "This Upgrade Path is not Supported. Close Setup and Re-Launch from Root of Media or Pick Different Installation Choice" - Compuzo http://www.compuzo.com/2015/02/fix-windows-upgrade-error-upgrade-path-not-supported-close-setup-re-launch-root-media-pick-different-installation-choice/
なお、言うまでもないですが、あくまで自己責任で。当方では何のサポートも保証も行いません。