ごらくらいふ

プログラミングしたりゲームしたり

posh-gitを導入した

Windows + PowerShell環境におけるGitの使い勝手を改善したくなり、posh-gitを導入した。

手順

repositoryの取得

2021/02/17時点において、posh-gitの v1 はまだ beta らしい。 v1未満のバージョンも、v1のbetaも不安定であることに変わりはないので、repositoryを取得し、masterの最新コミットを使うことにした。

# 自分は `ghq` コマンドを愛用している。
ghq get https://github.com/dahlbyk/posh-git.git

下準備

  • posh-git v1 は PowerShell 5.x、または PowerShell Core 6.0 が必要らしい。バージョンの確認は $PSVersionTable.PSVersion を見ればよい。
  • Windowsではスクリプトの実行ポリシーが RemoteSignedUnrestricted である必要がある。確認は Get-ExecutionPolicy を実行すればよい。
  • git コマンドが環境変数 PATH から参照できなくてはいけない。

Profileへの反映

posh-git は、カレントパスの出力やサフィックスをよしなにやってくれる prompt を標準で用意しているらしいが、自分好みの prompt を定義することもできる。

posh-git に求めているのは git の情報を出力することだけなので、 Write-VcsStatus を拝借すればよさそうだった。

Import-Module \path\to\posh-git-repo\src\posh-git.psd1
function prompt {
    $prompt = ""
    $prompt += "(*-w-) [$(Split-Path (Get-Location) -Leaf)]"
    $prompt += Write-VcsStatus
    $prompt += " > "
    if ($prompt) { "$prompt" } else { " " }
}

f:id:yajamon:20210217225941p:plain

Good.

参考リンク

RSS 0.91の仕様書を読んだというメモ

ウン年前にPHPRSS Readerを作ったことを思い出した。 当時はWebサービスで、今度はiOSアプリケーションにでもしてやろうと思う。

これにあたって、RSSの仕様書をちゃんと読んでみようと考えた。 RSSは諸々分岐していることをWikipediaから知り、RSS 2.0 -> 0.92 -> 0.91 と元にしているバージョンが連なっているようだった。

RSSはXML1.0 で記述されているとのこと。 アプリケーション内で表現するにあたって、まずは構造を把握しようと試みた。 文字列の長さに関する規定などが個別にあるようだが、それらは一旦後回しとした。

RSS 0.91 の構造を手元に書き写した

  • rootに <rss> を持つ
  • <rss>は単一の要素 <channel> を持つ
  • <channel>の必須要素
    • <title>
    • <link>
    • <description>
    • <language>
    • <image>
  • <channel>のオプショナル要素
    • <copyright>
    • <managingEditor>
    • <webMaster>
    • <rating>
    • <pubDate>
    • <lastBuildDate>
    • <docs>
    • <textInput>
    • <skipDays>
    • <skipHours>
  • <image>は以下の必須要素を持つ
    • <url>
    • <title>
    • <link>
  • <image>は以下のオプショナル要素を持つ
    • <width>
    • <height>
    • <description>
  • <channel>は複数の<item>を持つ
  • <item>は以下の要素を持つ
    • <title>
    • <link>
    • <description>

参考URL

エクスポートしたKindle note HTMLをmarkdownに変換するコマンドを作った

Kindleには自分のハイライトをエクスポートする機能がある。 マイノートからシェアボタンを押すと、メモをHTML化した上でメール送信できる。

このHTMLを、必要な分だけ抽出してmarkdownにするコマンドを作った。

github.com

自分のメモを共有したい。ブログに載せたい。 しかもmarkdownの形式になっていると助かる。

実践例:

yajamon.hatenablog.com

読了記録: 「面白くならない企画はひとつもない - 髙崎卓馬」

貸本屋 Kindle Unlimited から一冊を手にとった。

自分について、なんとなしにプログラミングやらWebサービスの機能を成立させるくらいの力はあるんじゃないかと考えているが、「何を作りたいか」を思いつけないという漠然とした諦観がある。 で、「企画力」とはなんぞやと思って手にとった本は、なぜか「テレビCMの企画」の話だった。

次の本を読むには返却しないといけないので、感想やハイライトをメモ。

感想

  • テレビが影響力を失いつつある状況を「家庭内サイネージ」と表現していたのは面白かった。
  • CMのクリエイターなんて全く意識したことがなかったので、三井のリハウス のCMを企画した人だと分かると「ああ!あの!」となるのであった。
  • 判断の基準を他人に置く危険性のくだりは、直近の開発で思い当たる節がある。似たようなことは起こるものだ。
  • 思いの外、要件定義などの上流工程に通ずるところがある。

以下、商品とKindle note のハイライトから特に印象にのこった部分


面白くならない企画はひとつもない 高崎卓馬のクリエイティブ・クリニック (宣伝会議養成講座シリーズ)

著者: 高崎卓馬

はじめに

ハイライト(イエロー) - 位置21

そして僕がたどり着いた結論は「わからない」をなくすこと

ハイライト(イエロー) - 位置23

よくわからずつくりはじめたから色んなひとの意見が入り込んで来る。

1章 セツメイ病を治そう

続きを読む

Appleのリファレンスページからclass名などのシグネチャを一括で引き上げるjavascript

開発者コンソールで叩いてササッと収集。snippetsにでも置いておくといい。

前提

  • 2020/06/22
  • Chrome 83.0.4103.106 で確認

結論

$$(".task-topic-info .display-name").map(el => el.innerText)

Deprecatedは無視する

$$(".task-topic-info :not(.task-topic-deprecated) .display-name").map(el => el.innerText)

関連リンク

h.ear on 2 (WH-H900N) のイヤーパッドを交換した

SONYノイズキャンセリングワイヤレスヘッドフォンである h.ear on 2 (WH-H900N)

イヤーパッドが劣化し、スポンジがむき出しになってしまった。これでは装着できない。 f:id:yajamon:20200617113323j:plain

この商品はイヤーパッドの販売をしておらず、修理に出さなければ純正品できれいな姿にはなれない。 しかし修理に出すと1万円は下らないだろう。(部材代3000円、工賃3000円x2、往復送料1000円) バッテリーがヘタったとか、そういう問題が起きてから頼りたい。

代替品

代替品を見つけたので購入した。

f:id:yajamon:20200617112623j:plain f:id:yajamon:20200617112632j:plain

いざイヤーパッド交換

イヤーパッドには6箇所穴が空いており、ここに爪がかかるようになっている。

f:id:yajamon:20200617115659j:plain

取り外した後の画像だが、爪はイヤーパーツ外周から内側に向いており、わずかに押し込んでやればイヤーパッドを外せることが伺える。

f:id:yajamon:20200617115957j:plain

交換品に付属の剥がし棒は柔らかく、無理に力をかけてはいけない。折れてしまう。

剥がし棒を、爪の外側あたりを目安に這わせ、

f:id:yajamon:20200617120943j:plain

軽くめくる。 この動きを繰り返し、先端を隙間に差し込む。

f:id:yajamon:20200617121128j:plain

合わせてイヤーパッドを、先程の爪が引っかからなくなる程度に押し込むと、爪が外れる。

これを6箇所の爪で行い、イヤーパッドを剥がす。

f:id:yajamon:20200617121814j:plain

f:id:yajamon:20200617121847j:plain

比べてみると、純正品はメッシュにも色がついていて、生地の張りにもゆとりを持たせていることが分かる。

f:id:yajamon:20200617122042j:plain

また、純正品のほうが大きい耳に対応している。

あとは代替品を(上下を間違えずに!)取り付ければ交換完了。

余談

h.ear on 3(WH-H910N)は軽量化が進んだが、代償として非常にチープな安物のような見た目になってしまった。(買ったけど)

また、イヤーパッドの形状が変わったようなので、また新しい交換品が必要になるだろう。 しかも外しづらそうで小銭を稼ぎにきているな、と感じる。

商品リンク

あらためて代替品のリンク。

付属の剥がし棒が折れるかもしれないのでパネル剥がしのリンクもおいておく。

これはオーバースペックな内張り剥がし。バロンチェア肘パッドの交換に使ったやつ。

iOSでキャリア情報の取得が大変。

データ通信に使っているキャリアの情報が欲しい

iPhone XS, iPhone XS Max, iPhone XR以降、nano-SIMとeSIMを使ったデュアルSIMに対応している。*1

この機能はiOS 12.1 から利用できるそうだ。 これに合わせて、CTTelephonyNetworkInfoAPI が更新された。 *2 *3

また、iOS 13からはデュアルSIMの両方で通話が利用できる。 このうちデータ通信は一つの回線だけ利用可能で、それを取得するための API が追加された。 *4

この状況下で、「いったいどのキャリアがデータ通信に使用されているのかを知りたい。」場合の話。

iOS 12.0 では新しい API からキャリア情報が得られない

そういう問題があるらしい。*5 しかし API 上は subscriberCellularProviderdeprecated になってしまった。

軽く調べたところ解決法はすでに見つかっていて、private property によって取得できるらしい。 (deprecated なメソッドを使うのとどっちもどっちな気がしないでもない。)

最終的にこうなる

  • extension をつかって CTTelephonyNetworkInfo を拡張した。
  • iOS 13.0 未満においては、キャリア情報が一つかどうかでデータ通信に使用中か判定する。
extension CTTelephonyNetworkInfo {
    typealias Using = Bool

    /// iOS のバージョンに応じてキャリア情報と、それが通信に使用可能なものか取得する
    var versionCompatibleServiceSubscriberCellularProviders: [(CTCarrier, Using)] {
        if #available(iOS 13.0, *) {
            // iOS 13 からデュアルSIMを同時利用可能 https://support.apple.com/ja-jp/HT209086
            // データ通信に使用するSIMは iOS 13 から判別可能 https://developer.apple.com/documentation/coretelephony/cttelephonynetworkinfo/3183044-dataserviceidentifier
            guard let providors = self.serviceSubscriberCellularProviders else { return [] }
            guard providors.count > 0 else { return [] }

            let usingId = self.dataServiceIdentifier ?? ""
            return providors.map { (key: String, carrier: CTCarrier) in
                let using = key == usingId
                return (carrier, using)
            }
        } else if #available(iOS 12.1, *) {
            // iOS 12 から複数のSIMがありうる https://developer.apple.com/documentation/coretelephony/cttelephonynetworkinfo/3024511-servicesubscribercellularprovide
            // iOS 12.0 ではバグで値が得られないらしい https://stackoverflow.com/questions/52846542/why-do-servicesubscribercellularproviders-return-nil-in-ios-12
            guard let providers = self.serviceSubscriberCellularProviders else { return [] }
            guard providers.count > 0 else { return [] }

            // 1件であれば使っていることが自明
            let using = providers.count == 1
            return providers.map { (key: String, carrier: CTCarrier) in
                return (carrier, using)
            }
        } else if #available(iOS 12.0, *) {
            // private property によって参照できるらしい
            // microsoft の app-center-sdk におけるissue https://github.com/microsoft/appcenter-sdk-apple/issues/1905
            // microsoft の app-center-sdk にも採用されている https://github.com/microsoft/appcenter-sdk-apple/pull/1914/files/fa504f5278f7ca98a3587479d3adcfd4d568922b
            guard let providers = self.value(forKey: "serviceSubscriberCellularProvider") as? Dictionary<String, CTCarrier> else { return [] }
            guard providers.count > 0 else { return [] }

            // 1件であれば使っていることが自明
            let using = providers.count == 1
            return providers.map { (key: String, carrier: CTCarrier) in
                return (carrier, using)
            }
        } else {
            guard let carrier = self.subscriberCellularProvider else { return [] }

            return [(carrier, true)]
        }
    }
}

参考リンク