modest violet

modest violet

開発者としてのあれこれや、日々の雑記など

your future hasn't written yet. no one's has.
by Emmett Lathrop "Doc" Brown

iOS 10.2 のバッテリーの減り方は尋常ではない

f:id:shin21sk:20170122000625p:plain

前々から気にはなっていたのですが、そのうち直るだろうと放置していたのです。

ただ、やはり我慢が出来なくなってきました。

iPhoneのバッテリーが1日持たない!!

ただでさえ、バッテリー持ちが悪いのに、iOS 10.2にアップデートしてからは顕著。

先程も、

「残り 20% です」

という表示が出て、画面ロックを解除し、ホーム画面へ

その時点で残量が「19%」に減り、

Safariを開いた瞬間に

「14%」に減り、

Safariを閉じると

「残り 10% です」と表示されました!

対処方法は?

色々と調べた結果、細々と対応方法を記載しているページもありました。

ただ、それは総当たり的な方法で、どれか一つでも当たればラッキー的な恒久的な解決方法ではなさそうでしたのでスルー。

やはり、ダウングレードを試みるか、改修バージョンが出来るのを待つほうが賢明なようです。

やはり今後に期待する事は

ガラケー時代は2、3日は充電しなくても使えていたので、スマホもそういう風になればいいんですけど。。。

カメラの性能や防水、おサイフケータイもいいですけど、「携帯」なんだからバッテリーの良さを最優先でなんとかして欲しいですね。

iPhone7では電源が切れるとおサイフケータイが使えないという問題もあるようなので、おサイフケータイや電話といった待機系の電源を別に内蔵するとかとか。

【ASP.NET MVC】【Azure】デプロイ後に「The system cannot find the file specified」エラーが表示される

f:id:shin21sk:20170119202327p:plain

Azureへデプロイ後、やたらと「The system cannot find the file specified」エラーが頻出して少々困ったのでメモ書きです。
原因が判ればたいした話では無かったんですが・・・。

環境

ASP.NET MVC5 + Azure Web Apps + Azure SQL Server + Entity Framework

エラーメッセージ

The system cannot find the file specified

原因

Entity Framework を利用すると、自動的にLocalDbが作成され、LocalDbに対してのDbContext設定が作成されます。

今回、このContextとは全く別のContextを使用していたので、デフォルトの自動生成されたContextは全く気にもしていませんでした。

ただ、この設定がAzureデプロイ後に「そんな接続先ないやんけ、コラァッ!」と怒っていたようです。

「誤った」対処法

Models > IdentityModels > ApplicationDbContext

こちらにおそらくDefaultConnection の指定があります。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection") // ここの設定を替える
    {
    }
    // 略
}

上記の箇所を普段使いのDbContextに置き換えると、確かに「The system cannot find the file specified」は出力されなくなりました。

ただ替わりに、下記のエラーが発生します。


'/' アプリケーションでサーバー エラーが発生しました。
エンティティ型 ApplicationUser は、現在のコンテキストのモデルに含まれていません。


英語エラー

The entity type ApplicationUser is not part of the model for the current context

スタックトレース

   at System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(Type entityType)
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.FindAsync(CancellationToken cancellationToken, Object[] keyValues)
   at System.Data.Entity.DbSet`1.FindAsync(CancellationToken cancellationToken, Object[] keyValues)
   at System.Data.Entity.DbSet`1.FindAsync(Object[] keyValues)
   at Microsoft.AspNet.Identity.EntityFramework.UserStore`6.<GetUserAggregateAsync>d__6c.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNet.Identity.TaskExtensions.CultureAwaiter`1.GetResult()
   at Microsoft.AspNet.Identity.Owin.SecurityStampValidator.<>c__DisplayClass2`3.<<OnValidateIdentity>b__1>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler.<AuthenticateCoreAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<BaseInitializeAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.<RunApp>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.<DoFinalWork>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)
   at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)


「正しい」対処法

web.config 内の「DefaultConnection」パスを、LocalDbから本番サーバーの設定に変更する。

但し、EntityFrameworkの記述ではなく、従来通りのConnectionStringの記載方法で書く。

今の音楽にはニオイがない

https://www.amazon.co.jp/b/ref=sv_dmusic_0?ie=UTF8&node=3589137051www.amazon.co.jp

Amazon Prime ミュージックがヤバい。プライム会員になれば、膨大な数の音楽が聴き放題なんです。

今の時代の子供達が羨ましいと思う反面、少し物悲しさも覚えました。

学生時代の音楽は一生モノ

f:id:shin21sk:20170121012308p:plain

流行りの曲というものがあります。学生時代に聴いていた曲というのは、何歳になっても「昔を思い出すタイムマシン」の役割を果たしてくれます。思春期に聴いた曲ってなかなか忘れないものです。

もちろん、プライムやLINEミュージックで一生モノの曲に出会う事もあります。何万曲もある曲の中から出会えた奇跡という楽しみ方もあるかもしれませんね。

音楽のニオイ

学生時代は一部の人を除き、お金を自由に使える訳ではありません。そんなお小遣いをやりくりする中で、三千円近くするアルバムCDはなかなかの出費なわけです。

今みたいにアルバムの中の好きな曲を1曲だけ買うという選択は出来ません。

そして、買ったCDの封を開け、CDディスクをトレイに載せ、再生されるまでの数秒間の気持ちの高揚感。

新しいCDには紙ジャケットのニオイがあります。

ダウンロード音楽に慣れきったこの頃、ふと思い出し懐かしくなります。

ジャケットや歌詞カードを目で触れ、新しい紙ジャケットやCDのニオイ、ケースに触れ、耳で音楽を聴く。

音楽を聞くということは、五感のうち、4つを使っていたハズなのに。

今は「聴く」という感覚しか使っていない事に気づきました。

とはいえ、便利な世の中

ダウンロード一つで好きな曲をいつでも、どこでも楽しめるというのは素晴らしいことだと思います。

ただ、数が多すぎる・・・。先程もプライムで何か聴きたい曲がないか探していましたが、数が多すぎて1曲毎にじっくり吟味する事が出来ませんでした。

手軽さは良いことです。私も最近はほとんどiTunesで購入します。

便利になることで、音楽が無味無乾燥な代物になりつつあるのかな、と。

そう思った時、今の時代の子達は便利な反面、楽しみを1つ失っているなー、と思うのです。

さらにもう1つ前のレコード世代は、CDでも寂しさを感じる傾向にあるようです。
やはり、あのでかくて管理が大変で面倒なレコードですが、独特のにおいがあります。

1枚のアルバムを愛おしく何回も何回も、そして傷がいかないように丁寧に大切に聴く。

そういったCDへの敬意というのを、忘れずにいきたいものだと、溢れかえるプライムミュージックの曲たちを眺めながら思い直したのでした。

生き物を飼うということ

peticonbu.hatenablog.com

とても読まずにはいられないタイトルだったので。

そして読んだ後、色々と考えさせられました。

この飼い主のお方は自分の決断に後悔され、もう猫は飼わないと仰られています。

生き物を飼うということは、当然ですが楽しい事ばかりではありません。

人間よりも圧倒的に寿命が短い彼らと過ごせる時間というのは、あっという間です。

一時期のアイフルのCMで、何も考えずにペットを飼ってしまう人も多く、社会問題にもなっていました。

ペットといえ、出会いは巡り合いです。

この猫も、飼い主さんが必死で考えて下した決断を恨んだりはしないと思います。

「自分よりも圧倒的に寿命が短い生き物を飼うという事自体、既に人間のエゴと思え」と私は昔から考えています。

エゴだっていいじゃないか。この子は私が幸せにするんだ、という意気込みがなければ生き物は飼えません。

今はつらいと思います。でも、いつの日か悲しい別れを埋めてくれる新しい出会いがある事を切に願うばかりです。

f:id:shin21sk:20170121014910p:plain

【Azure】.ToUniversalTime の罠に見事にはまった話

Azure上における時間は基本的に協定世界時間 (UTC) です。

こんな記事を書いておきながら、未だに慣れない場面も。きっと開発環境がJISだから悪いんだろうけど・・・。
shin21.hatenablog.com

ToUniversalTime で UTCに変換

.NET FrameworkにはUTCに変換する .ToUniversalTime() メソッドがあるので、それを用いる。

開発環境で動かした結果。うんうん問題なし。

f:id:shin21sk:20170117202938p:plain


Azureで動かした結果。全く時間が変わっていませんね。

f:id:shin21sk:20170117202945p:plain

確かに。

UTCUTCに変換しようとしても、そりゃあ同じ値だよな・・・。

Azure上のローカルはUTC何だから、以下略


きっと、疲れていたんだな、うん。

DateAddで +9でもいいんだけど

なんとなく気持ち悪い。しっくりこない。

.NET Framework 3.5以降は TimeZoneInfo.ConvertTimeToUtc

困ったときは DOBON.NET様 ですね。

ローカル時刻を世界協定時刻(UTC)に変換する: .NET Tips: C#, VB.NET

.NET Framework 3.5以降では、ローカル時刻をUTCに変換するのにTimeZoneInfo.ConvertTimeToUtcメソッドを、UTCをローカル時刻に変換するのにTimeZoneInfo.ConvertTimeFromUtcメソッドを使用します。

http://dobon.net/

なるほど、このメソッドを使えば、変換前のタイムゾーンを無理矢理指定できるわけですね。

早速、試してみたソースがコチラ。

System.TimeZoneInfo.ConvertTimeToUtc(new DateTime(2017, 1, 20), System.TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"))


f:id:shin21sk:20170117204836p:plain

グローバルに対応したい場合

変換元のタイムゾーンを利用者毎に保持して、当てはめれば良さそうですね。

TimeZoneInfo.ConvertTimeToUtcメソッド、素晴らしい!