hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

ガダラの豚

アル中の教授が出てきたり、アフリカのオカルト情報が出てきたり、というディテールが積み重なっているのが気に入った。2巻目くらいまではおもしろかった。3巻まで行くと風呂敷たたみムードになってきて、終わり方はウーンという感じだった。

【合本版】ガダラの豚 (集英社文庫)

【合本版】ガダラの豚 (集英社文庫)

  • 作者:中島らも
  • 発売日: 2018/09/05
  • メディア: Kindle版

液体歯磨き粉が便利

液体なら粉ではないので、液体歯磨き粉じゃなくて液体歯磨きなのだけど、歯磨きというと歯磨き行為との違いがわからないので液体歯磨き粉と呼んでいる。
その液体歯磨き粉をなにかのタイミングで買って、洗面台に置きっぱなしに、使わずほったらかしにしていたのだけど、チューブ状の歯磨き粉が切れたので使いだしたら便利だった。

チューブ状の歯磨き粉を使うと、チューブを持って、まずフタ開けて(このときスクリュー状だと両手使うので面倒)、もう片手で歯ブラシを持ち、適量を歯ブラシにつけて、フタをしめる(このときスクリュー状だと両手使うので面倒)、そして歯を磨く、という流れになる。
これが液体歯磨き粉だと、口ゆすぐ用のコップに2プッシュする、口に入れる、そして歯を磨く、という流れで、3工程くらい減っている。
1日に3回やる歯磨きの工程を大幅に省略できたのがうれしい。


歯ブラシはソニックケアを使っていて、これも便利で、何が良いかというと、30秒ごとに音がして次の象限(口の中を四象限にわけて1象限ずつ磨く)に向かいましょうという案内をしてくれるので必ず2分で磨き終わるように誘導される。歯ブラシ界充実してきた。

HackerNewsのランダムなニュースを再生し続けるMac用スクリーンセーバー

テレワークでずっと家に居ると、リビングに置いてるテレビを見たり、Macのスクリーンセーバーが動いているのが目に入ったりする時間が増えてきたので、テレビで見れたり、Macを使ってない間にぼーっと眺められる形のコンテンツを模索したい。
WebViewを開いて、JSを実行し続ける形でHackerNewsのコンテンツをランダムに流すスクリーンセーバーを作ってみた。
github.com


やっていることは至極簡単で、ScreenSaverViewのinitでWebViewを作って、タイマーを定期的に動かす。

    override init?(frame: NSRect, isPreview: Bool) {
        super.init(frame: frame, isPreview: isPreview)
        
        self.animationTimeInterval = 999.0

        let webConfiguration = WKWebViewConfiguration()
        self.webView = WKWebView(frame: self.bounds, configuration: webConfiguration)
        self.addSubview(self.webView)
        
        self.timer = Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(self.step), userInfo: nil, repeats: true)
        self.timer.fire()
    }


で、タイマーでJavaScriptのコードを実行する。これは10秒おきに実行していて、

  • HackerNewstorylinkクラスのaタグがあればランダムに選んでクリックする
  • そうでなければページスクロール
  • ページスクロールの100ミリ秒後にスクロール位置が変わっていなければページ最下までたどり着いたとみなしてHackerNewsに戻る
    @objc func step() {
        let code: String = """
            (() => {
                const TOP_URI = 'https://news.ycombinator.com/';
                const pick = (list) => list[Math.floor(Math.random() * list.length)];
                const newsLinks = document.querySelectorAll('a.storylink');
                const visitTop = () => location.href = TOP_URI;
                // visit random news
                if (location.href === TOP_URI && newsLinks.length > 0) {
                    location.href = pick(newsLinks);
                }
                // scroll articles
                else {
                    const topBefore = window.scrollY;
                    window.scrollBy(0, window.innerHeight * 0.9);
                    setTimeout(() => {
                        const topAfter = window.scrollY;
                        // detect bottom
                        if (topBefore === topAfter) {
                            console.log('visitTop');
                            visitTop();
                        }
                    }, 100);
                }
            })()
            """
        self.webView.evaluateJavaScript(code, completionHandler: nil)
    }

ということをやっている。ページ遷移すると前回実行していたJSが消えてしまうので、タイマーはJavaScript側ではなくてSwift側でやっていることと、JS側は状態を持ってなくて、こういう状況ならこれをする、というのを淡々と書いているのが特徴。

経緯

もともとは仕事でメンテナンスしているウェブサービスをランダムに巡回するために作っていて、それはなかなか便利だった。休憩して戻ってくると、自分たちがホスティングしているけど見たことないコンテンツが流れてきて、へえこんなコンテンツもあるのね、ということがあったり、偶然壊れてるページを見つけられたら人力テストとしても便利。
便利さはともかく、JSを定期的に動かすだけで好きなコンテンツを流せて汎用性が高いので、Hacker Newsをランダムに閲覧する形にコードを変えてGitHubに置いといた、という形。
JSを書き換えてビルドするだけで好きなウェブサイトを流すことができるのでいろいろ模索するときの雛形としてはそこそこ便利なのではないかと思う。
Swift入門とかmacのアプリを作るための前提知識とかは持ってないのですさまじい脆弱性がある可能性がある。プロダクションでは使わないでください。

不便な点

ビルドしてから実行するまでの手順が長くて、Finderで開き、ダブルクリックするとシステム環境設定のスクリーンセーバーが開き、置き換えますかと聞かれてはいと答えると置き換えられるけど、それだけでは更新されず、一度システム環境設定のトップに戻ってからスクリーンセーバーを再度開いてプレビューボタンを押す、という工程を毎回やっていて不便だった。

イルカショー

水族館が無観客イルカショーを配信しているのを見かけた。
YouTubeを見ると過去のライブが無料で配信されていたりするので、これだけ世の中に動画が溢れているのに新たに動画を配信する意味は何なのか気になってきている。

イルカショー界隈どうなってるのかな、と観たらオーランドのイルカショー動画が上がってて、イルカそっちのけで人間たちが空中ブランコやっていて謎の世界観だった。

キングダムをせっせと観てシーズン2まで観終わった。
シーズン1は3Dアニメという雰囲気だったけどシーズン2は普通の手書きアニメっぽくなった。合戦のばたばたしてるところは3D。兵たちがアニメみたいにふっとばされていくシーンがなくなったり、ここぞというときに劇画調にならなくなったりと、とにかく見やすかった。
話の流れとしてはシーズン1のほうが物語に引き込む力が大きくて、1話はキャッチーな始まり方で、マイナスからのスタートという感じだったけど、シーズン2は、想定されるトラブルはこんなもんで、このあとはさまざまな敵が登場するだろうけど、戦を繰り返して成り上がっていく、という営みが続くにちがいない。

タワーマンションの夢

  • 夢、コンピュータウィルスをばらまいた罪に問われていて、下水道を逃げ回っている
  • 自分たちが捕まるのは良いとして、残党たちはこの先の暮らしをどうするのか、という議論をして、タワーマンションを購入して残党たちに住ませることを検討する
  • チラシを何枚か見比べて、御所をこの手に、プレシャスな眺め、みたいなポエムを読み比べることでマンションの良さを評価しようとする
  • ここで場面が変わって、夢を見ていて起きたら昼、という夢を見る。朝のミーティングに出てなかったことに気づく
  • うっかり昼まで寝てしまったけどとりあえずラーメンでも食べようと茹で始める