Apple Watch series2のバッテリーが膨らんだ話

はじめに

先日、愛用しているApple Watchの充電ができなくなりました(〇ω〇)

できなくなっただけじゃなくて、バッテリーが膨張して、見るも無惨な姿になっていました...

f:id:midorigame201845:20180717013656j:plain

この記事は、再起不能となったApple Watchが元気になるまでの課程を記したものです。

6/13 起動できなくなる

Apple Watchの充電が切れていたので、充電していました。しかし、いくら充電してもApple Watchが起動しません...(色々起動方法を試しました)

ついでにめっちゃ熱くなってます♨️

とりあえずAppleのサポートの電話予約を入れました。

6/14 画面が飛び出る

冒頭にある画像の通りです。気づいたら画面が飛び出て今にも取れそうでした。ああ、こいつはもうダメなんだと思ってたのも束の間。あることを思い出しました。

japanese.engadget.com

そう!!Apple Watch series2のバッテリー膨張問題に対する無償修理対応の記事です!!

僕のWatchは42mmです。これは無償修理行けるんじゃないか??と思い、Appleからの電話を待ちました。

6/14 Appleサポートとの電話

13:00ごろAppleサポートから電話があり、ことの顛末を話しました。

サポート「バッテリーが膨張しているとのことですね...ミドリガメ様が安全に心配があるなら、安全保障担当(だったような)に対応を替わることもできます。」

安全保障担当??なんじゃそりゃ。

僕「安全に心配は特にありませんので、修理の手続きをお願いします。」

サポート「修理代金ですが、3万いくら(値段忘れた)になります。」

3万!!!!あ、、、あれ?無償にはならんのかな(〇ω〇)

僕「さ、3万ですか....」

ここで大分落ち込んでると、

サポート「私からはこれ以上の対応はできないのですが、安全保障担当ならなんとかなるかもしれません。ただ、保証はできません。」

と言われました。なので、安全保障担当の方に替わってもらうように頼みました。 安全保障担当の方より、写真を送って欲しいとのことだったので、Watchのバッテリーが膨張していることがわかる写真を3点送りました。

どうやって送るのかなと思ったのですが、なんかSMSでリンクが送られてきて、専用のフォームに入力するだけですみました。以下がその写真です。

f:id:midorigame201845:20180717020549p:plain f:id:midorigame201845:20180717020604j:plain

写真を送ったところ、あっさり無償修理になりました(笑) その後は、いつどこでWatchを送るかなどの話をしました。(僕の都合で6/16にしてもらいました)

6/16 クロネコヤマトが集荷に来る

自宅にクロネコヤマトの方が集荷に来ました。こちらでは箱とかは用意する必要が無く、バンドは外した状態でヤマトの方に渡すだけでいいとのことでした。しかし、サポートさんから、「画面が外れてバラバラにならないように、テープで画面を固定しておいてください」と言われてたので、テープを画面と本体に軽く巻きました

6/18 修理センターに到着とのメールが入る

Appleの修理センターに到着しましたよ〜というメールが来ました。 早く修理が終わるといいな

6/18 交換品を発送しましたとのメールが入る

はやっ

思った何倍も早く修理が終わりました。 早く届くといいな

6/20 交換品が到着

おお〜早くも交換品が到着しました。えらいキレイな化粧箱に入って帰ってきました。 f:id:midorigame201845:20180717021850j:plainf:id:midorigame201845:20180717021905j:plain

その後無事に起動もしました!

ちなみにガワは完全に自分のものそのままでした。交換品って書いてあったから、series3でも来るのかな〜と淡い期待を込めていましたが、そんなことはなかったです。

おかえり!

おわりに

だいたいこういう風な感じでバッテリーの膨らんだApple Watchが帰ってきました。

サポートの方は末端の方はこの問題を知らない風でした。もしくは知ってても対応できないのかも知れません。上の方ではだいぶはしょって書きましたが、Appleサポートの方の対応はとてもとても親切なものでした。

これからも大切に使っていきたいですね!!

バージョン番号の付け方について少し踏み込んだ疑問点

はじめに

梅雨入りにより外出が億劫になっているこの頃、皆様いかがお過ごしでしょうか。
別に雨が降ってなくても外出なんてしないとは言わない約束

外出しないためコードを書くしかやることがなく、結果的に現在Javaで開発しているライブラリの正式版リリースまでこぎつけることができました。

さて、その際にちょっと思ったバージョン番号の付け方ですが、どのように付ければよいか、という疑問が上がったので、ここにメモ書きとして書いてみました。


よくある解答例

一般的には、3桁ないし4桁で表すことが多いと思います。

3桁の例の説明:

4桁の例の説明:

他にも、次のような例もあります。

  • 日付をそのままバージョン番号にする
  • 奇数番号と偶数番号で違う意味を持たせる
  • 細かな違いはバージョン番号の後ろに文字を付与する
  • バージョンに名前を付ける
  • 円周率に近づける

参考:

さて、大体のサイトから得た知見を基にすると、バージョン番号の付け方は3桁ないし4桁のほうが(ヒット件数などから)多くの人にわかりやすいだろう、という話でまとまりそうです。


直面した問題

以上の情報を元に、今回は3桁のバージョン番号を使うことにしました。
そこで、次の問題に直面しました。

Javaにおけるパッケージ構造だけを全て変更したが、処理内容などは一切変わっていない場合、どのバージョン番号を変えればよいのか

バージョン番号の見方 | Pickles Framework(PxFW) official website によると、3桁のバージョン番号の更新は次の意味を持つそうです。

  • 大規模な仕様の変更や追加を伴う場合にはメジャーバージョンを上げる
  • 小規模な仕様の変更や追加の場合は、マイナーバージョンを上げる
  • バグ修正、ドキュメント、コメント修正等の小さな変更は、リリース番号を上げる

今回の例では、ルートパッケージに複数存在していたpackageApackageBpackageCパッケージ群を、there/is/rootパッケージ下に移動しました。

変更前

カレントディレクトリ
├─packageA
├─packageB
└─packageC

変更後

カレントディレクトリ
└─there
  └─is
    └─root
      ├─packageA
      ├─packageB
      └─packageC

もし旧バージョンのライブラリを利用しているプログラムが、新バージョンのライブラリを利用するためには、import文を全て書換えなければなりません。


変更前

import packageA;
import packageB;
import packageC;

変更後

import there.is.root.packageA;
import there.is.root.packageB;
import there.is.root.packageC;

この意味では、次の要件にあてはまるため、メジャーバージョン番号を上げる必要がありそうです。

大規模な仕様の変更や追加を伴う場合

ですが、ソースコード自体の処理内容やメソッド名などは一切変更されておらず、しいて言えば利用例を書いていたJavadocを書換えた程度です。
この意味では、次の要件にあてはまるため、リリース番号を上げる必要がありそうです。

バグ修正、ドキュメント、コメント修正等の小さな変更

おわりに

オチは特にありません。
結局、今回はリリース番号を上げる程度に留めました。
どこまでが小さな変更で、どこからが大きな変更なのか、という具体例については、探した感じではどこにもなかったので、書いてみた次第です。

もし自分はこう思う、という方は、別にコメントに書かなくてもいいので、少し考えてみてください。

archive.ubuntu.comにつながらない...

Undetermined Error

ubuntuapt-get installしていると以下のようなエラーが出た。どうやらページにアクセスできないらしい。

Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/g/gcc-7/libasan4_7.3.0-16ubuntu3_amd64.deb  Undetermined Error

ブラウザで見てみる

アクセスしてみると、確かにつながらない。 f:id:midorigame201845:20180612233440p:plain

ていうかそもそもArchives Ubuntuにつながらない。

2018/07/02 リンクが間違っていたので訂正しました。

f:id:midorigame201845:20180612233734p:plain

DNSサーバを変更してみる

家のネットのプロバイダはbb.exciteであり、DNSサーバも恐らくそこのモノにしているのだが、試しにDNSサーバをgoogleの8.8.8.8にしてみた。 f:id:midorigame201845:20180613002334p:plain

上記のapt-getのエラーは出なくなったが、やっぱりブラウザではつながらない

どういうことか、apt-get installはうまくできたのに、相変わらずブラウザではつながらない。 f:id:midorigame201845:20180612233734p:plain

なぜだ。

結論:セキュリティソフトが悪さをしていました。

私はESET ENDPOINT ANTIVIRUSというセキュリティソフトを使っているのだが、このソフトのWebアクセス保護という機能が、Archives Ubuntuへのアクセスをブロックしていた。

とりあえず一時的に機能を無効にしてみる。 f:id:midorigame201845:20180613002924p:plain

つながった。 f:id:midorigame201845:20180613003105p:plain

【Python3.6~】f-stringsを使おう

はじめに

Python3.6より、str に変数を埋め込む方法として、f-stringsが追加されました。
日本語で言うと、 フォーマット済み文字列リテラルとなります。
Python3.6未満のバージョンでは、str.format()や、%記号を用いることで同じような振舞いを実現できていました。今回は、それらとf-stringsの違いと、使い方を書いていこうと思います。

書き方

f-stringsは以下のように記述します。

>>> a = 1
>>> b = 2
>>> print(f'{a} + {b} = {a + b}')
1 + 2 = 3

使い方は簡単で、strリテラルの前にfをくっつけること(f'')で、ただのstrがformatted stringsになります。
変数の埋め込みは{変数}で行います。

上の例を見ると、{a}{b}がそれぞれ12に置き換わって出力されていることがわかります。

また、{a + b}3になっていることにお気づきでしょうか?
{}の中には式文(expression_stmt)を入れることができるので、a + bという式を評価した値を出力することになります。
もちろん、関数を呼び出すことも可能なので、以下のようなこともできます。

>>> print(f'{a} + {b} = {print(a + b)}')
3
1 + 2 = None

上の場合、print()は2回呼び出されています。
最初のprint()を実行する際に、f'{a} + {b} = {print(a + b)}'を評価します。3つの式文の中でも、{print(a + b)}を評価する際にprint(a + b)を実行するため、先に、3を出力します。そして、print()Noneを返す為、1+2の答えはNoneになるわけです。

書式指定

f-stringsでも、str.format()と同様に、書式指定ができます。(当たり前
例を以下に示します。

>>> a = 0.1
>>> b = 0.02
>>> c = 0.003
>>> print(f"{a} + {b} + {c} = {a + b + c}")
0.1 + 0.02 + 0.003 = 0.12300000000000001
>>> print(f"{a} + {b} + {c} = {a + b + c :.2}")
0.1 + 0.02 + 0.003 = 0.12

{}の中の式文の後に:を付けることで、書式の指定が可能です。
上の例だと、{a + b + c :.2}とすることで、小数点以下2桁を丸めています。

改行

f-stringsを定義する上で、1行がとても長くなってしまった場合、以下の方法で、見た目上の改行ができます。(て言ってもこれはstrに言えることなのですが)

>>> a = 1
>>> b = 2
>>> c = 3
>>> print(f"これは{a}行目"
...       f"これは{b}行目"
...       f"これは{c}行目")
これは1行目これは2行目これは3行目

既存の方法との比較

歴史的には、%記法、str.format()、f-stringsの順に登場しています(確か)。

%記法

この方法は、C言語printf()に似ています。strの埋め込みたい場所に、%d%sのフォーマット指定子を埋め込み('%d + %d = %d'の部分)、そのstrと、埋め込むオブジェクトを%でつなぐことで実現できます。

>>> print('%d + %d = %d' % (1, 2, 3))
1 + 2 = 3

str.format()

この方法は、strのメソッドformat()を呼び出しています。
strの埋め込みたい場所に、{}を埋め込み、.format()の引数に式文を指定することで実現できます。

%記法に比べて、型をしていしなくて良いというメリットがあります。

>>> print('{} + {} = {}'.format(1, 2, 3))
1 + 2 = 3

f-strings

f-stringsは上に記述した通りですが、str.format()に比べて、直感的に記述できるというメリットがあります。

おわりに

f-stringsは直感的にstrに変数を埋め込むことができます。今までstr.format()を利用していた方も、ぜひ、利用を検討してください。

Windows歴代起動音評議会

はじめに

Windowsを使う理由の1つに、起動音のカッコよさが挙げられます。
毎回起動するごとに鳴るあの独特なメロディは、時代を超えて愛されています。

皆さんも当然、お気に入りの起動音があると思いますが、ここで僕が各OSの起動音について語ることで、議論を活性化させようと思います。

OS名は有名どころだけ載せています。

参考動画
www.nicovideo.jp


各OSにおける起動音の総論

Windows 3.1

デデーン
特に面白みはない
起動のお知らせレベル

Windows NT 3.1

ピロリロン
Windows 3.1の終了音をそのまま流用したものと予想
音は綺麗だがそれだけ

Windows 95

この頃から起動音の重要性に気が付いたらしい
後ろのノイズ(ベース?)がいい味を出している

Windows NT Workstation 4.0, Windows NT Workstation 5.0

NT系はこの辺りから起動音に関して路線変更を決めたらしい
朝の目覚めを感じさせる

Windows 98

ベースの音が好き
この起動音からよく聞くようになった

余談だが、このOS誕生のころからPCにサウンドカードがデフォルト搭載されるようになった
そのため、上記4つの起動音を普通に聞いたことがある人はかなり珍しいかもしれない

Windows NT Workstation 5.0 Beta2

かなり攻めた音色
長さ、力強さ共に歴代トップ
大味のため、何度も聞くには適さないが、初めて聞いた際は痺れる

Windows 2000, Windows Me

ピアノ主体のメロディ
落ち着いており、気品を感じる
するめ

Windows Me Beta

Windows 2000の起動音演奏途中でピアノをガッシャーン
音楽としての完成度は高く感じられない

Windows Whistler

SEにとげとげしさが無くなった
すぱっとした切れ味がよい

Windows XP, Windows Server 2003

一部では今でも現役と噂の起動音
大多数の人が1度は聞いたことがある

Windows Server 2003(英国版限定)

これは今まで全く知らなかったが、凄く豪華絢爛
ただ起動するたびにこれは重い

Windows Longhorn

ついにボイスを入れてしまった起動音
正直迷走している気がする

Windows Vista, Windows Server 2008, Windows 7, Windows 8などなど

XPの起動音の終わりが下り調であったのに対し、上り調子で終わる起動音
やる気にさせてくれる
耳コピに優しい


さいごに

Windows 10になって起動音がデフォルトで鳴らなくなったのは残念ですが、そもそもスリープしか使わないから起動音に出会う機会がほぼないです。

Androidアプリで画面遷移(Kotlin)

Androidアプリでの画面遷移のサンプルコードを載せてみたいと思います.
明示的Intentと呼ばれるものです.
画面遷移は,たくさん実装方法があるので,一例として御覧ください.

以下目次です.

動作画面

f:id:midorigame201845:20180603022617g:plain

画面上には写ってませんが,バックキーをタップして遷移先から遷移元へ戻っています.
Galaxy Note8の録画機能を使って撮影しました.



開発環境

macOS High Sierra 10.13.4
Android Studio 3.1.2
Kotlin 1.2.40
Galaxy Note8 8 0.0

遷移元のコード

まずは,MainActivity(遷移元)のレイアウトです.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>


MainActivity(遷移元)のKotlinのコードです.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Buttonの宣言
        val button: Button = findViewById(R.id.button)
        // Intent作成
        val intent: Intent = Intent(this@MainActivity, NextActivity::class.java)
        // Button(IDがbutton)をタップされた際の処理
        button.setOnClickListener {
            startActivity(intent)
        }
    }
}



レイアウトのButtonに

android:id="@+id/button"

のように,IDを振り分けました.

ですのでKotlin側でButtonを操作するために

val button: Button = findViewById(R.id.button)    

と記述します.

もし,

android:id="@+id/button2"

のようになっていたら

val button: Button = findViewById(R.id.button2)    

としなければなりません.
また今回は,Buttonを操作するので,Button型を使います.
複数のウィジェット(Buttonや,TextViewなど)を使いたい場合,IDが重複してはいけません.

遷移先のコード

次にNextActivity(遷移先)のレイアウトです.といっても初期状態からTextViewの文字を変更しただけですが.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".NextActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="画面遷移したよ"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.3" />
</android.support.constraint.ConstraintLayout>

最後にNextActivity(遷移先)のKotlinのコードです.こちらは,初期状態のままで何も変えていません!

class NextActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_next)


    }
}


これでAndroidでの画面遷移の解説を終わりたいと思います.
間違いなどがございましたらコメント欄でお知らせ下さい.

倉敷のおもひで

2018/7/2

このページは、2018年6月3日に作成され、2018年6月17日に削除された記事をアーカイブ目的で復元したものです。この記事の内容はフィクションです。人名・地名・その他とは一切関係ありません。  

 

僕は若い頃、岡山県倉敷市に住んでいました。

 

皆さんご存じかと思いますが、

 

倉敷は美観地区で、そこにいる人の多くに感動と興奮を与えます。

 

僕は小中の頃、よく市立図書館に通って、

 

学術的な本を読み老けていたことを今でも覚えています。

 

今は別の大都会に住んでいるのですが、

 

図書館に置いてある情報系の本が古すぎて使い物になりません。

 

たまに帰省したときに倉敷の図書館に絶対寄るんですけど、

 

最新の本がそろっててすごいんですよ。