# Matsubo Tech Blog > Ruby on Rails, Web Services, Software Development, Startups --- ## 固定ページ - [History](https://blog.teraren.com/history-of-this-blog/): このブログのヒストリー 2003/5/2... - [Author](https://blog.teraren.com/yuki-matsukura/): 概要 こんにちは!matsuboです。2... - [Privacy policy](https://blog.teraren.com/privacy-policy/): 私たちについて 私たちのサイトアドレスは... - [Copyright](https://blog.teraren.com/copyright/): https://blog. terare... - [About Me](https://blog.teraren.com/about/): see: https://www. wa... ## 投稿 - [Xiaomi 14T Proをメインスマホにできるか検証](https://blog.teraren.com/2025/02/23/xiaomi-14t-pro/): 背景 最近、iPhoneが高すぎるし、ス... - [デスクトップの音響環境を測定してみる](https://blog.teraren.com/2025/02/22/check-by-room-acoustics-software/): 概要 ちょっと音響環境を調べる必要が出て... - [タブレット端末を壁掛けして情報端末として使うといろいろ捗る](https://blog.teraren.com/2024/08/27/tablet-on-the-wall/): 概要 半年ぐらい前から、壁にタブレット端... - [Web魚拓: 「研究」と「勉強」の違い](https://blog.teraren.com/2024/08/27/diff-study-research/): 概要 過去に何度も参照している以下のペー... - [寝室のライトを「とったらリモコン」に変更して快適子育て生活](https://blog.teraren.com/2024/08/15/downlight-remote-control/): 概要 リビングの調光スイッチを「とったら... - [生成系AIサービスから自分のサイトをブロックする方法](https://blog.teraren.com/2024/08/02/block-llm-crawler/): サイトのトップに以下のrobots. t... - [短縮URLサービスの利用を再考する:Bitlyの変更を機に探る最適な選択肢](https://blog.teraren.com/2024/08/02/%e7%9f%ad%e7%b8%aeurl%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%92%e4%bd%bf%e3%81%86%e3%81%ae%e3%82%92%e6%ad%a2%e3%82%81%e3%82%8b%ef%bc%81/): 概要 bitlyのサービス内容が変更され... - [Go Proアタッチメントを使用したベビーベッド監視カメラの設置方法](https://blog.teraren.com/2024/06/27/tapo-stand-camera/): 概要 以前の記事でベビーベッドにに監視カ... - [ベビーベッドにGoogle Nest Miniを設置していつでも手軽に音楽再生](https://blog.teraren.com/2024/06/27/audio/): 概要 Google Nest Miniを... - [赤ちゃんのおむつ交換のための暗い照明環境の設置](https://blog.teraren.com/2024/06/27/lighting/): 概要 おそらく、夜中におむつ交換するとき... - [tapoカメラでの赤ちゃん監視と録画方法](https://blog.teraren.com/2024/06/27/tapo-baby-check/): 概要 赤ちゃんを常時監視して異常があった... - [電池駆動のメリーを電源供給に改造して電池代を節約](https://blog.teraren.com/2024/06/25/merry-ac-powered/): 概要 以下のメリーを使っています。 最初... - [neofetchが終了してfastfetchが引き継ぎ](https://blog.teraren.com/2024/06/23/neofetch-fastfetch/): Fastfetchの概要 Fastfet... - [QNAP TS-431Pを調達してNAS運用を始めました](https://blog.teraren.com/2024/06/15/qnap-ts-431p/): 概要 QNAP TS-431Pを買ってN... - [WordPressをDockerizedしました](https://blog.teraren.com/2024/06/15/wordpress-dockerized/): 概要 設定方法は以下のページに書きました... - [NECレンタルルータが辛すぎ](https://blog.teraren.com/2024/06/15/aterm-shit/): 概要 VDSLのレンタルルータである、「... - [TerraMasterを使ってMacOSでソフトウェアRaid1環境を構築してみる](https://blog.teraren.com/2024/04/25/post-15888/): 概要 MacOSではソフトウェアRAID... - [Keychron K8 Proの初期化方法(factory reset)](https://blog.teraren.com/2024/04/08/post-15875/): オフィシャルサイトやマニュアルでは、以下... - [自宅サーバー用にGMKtec Nucbox M2(Intel Core i7)を買ったのでレビュー](https://blog.teraren.com/2024/04/02/gmktec-nucbox-m2/): 概要 自宅サーバーでPowerEdge ... - [CHUWI HeroBox 2023 (Intel N100搭載) を買ってみたのでベンチマーク](https://blog.teraren.com/2024/03/13/chuwi-herobox-2023/): 概要 買ったものはこちら。 【レビュー特... - [Painting Keychron keyboard frame with WR blue mica](https://blog.teraren.com/2024/02/27/painting-keychron-keyboard-frame-with-wr-blue-mica/): Background I bought ... - [HyperX QuadCast VS Anker Powerconf C200のマイク性能を比較](https://blog.teraren.com/2024/02/23/post-15780/): 背景 HyperX QuadCastをか... - [macOSでSDカードやUSBメモリをフォーマットする方法](https://blog.teraren.com/2024/02/23/macos-usb-memory-format/): 問題 Linux用にパーティションテーブ... - [gatsbyセットアップメモ](https://blog.teraren.com/2024/01/24/post-15683/): セットアップ このあたりを参考に。 ht... - [MySQL Workbenchの後継であるMySQL Shell for VS Codeを使ってみる](https://blog.teraren.com/2023/08/29/post-15714/): 概要 MySQL Workbenchのサ... - [UbuntuでMySQLを8.0.34から8.1.0へアップグレード。Innovation Releaseを使う設定。](https://blog.teraren.com/2023/08/29/ubuntu-mysql-8-1/): 背景 MySQL Innovation ... - [Ubuntu live patchを導入してみた](https://blog.teraren.com/2023/06/21/ubuntu-live-patch/): Livepatchとは Livepatc... - [知的労働者のための究極のホームオフィス環境ガイド](https://blog.teraren.com/2023/05/29/desktop/): 概要 知的労働者にとって作業環境は重要で... - [tableau serverをrpmでアップグレードする方法メモ](https://blog.teraren.com/2023/05/24/tableau-server-rpm-upgrade/): 概要 tableau serverは1年... - [個人開発のWebサービスをCloudflareに載せてみた【無料でここまでできる】](https://blog.teraren.com/2023/04/23/web-service-on-cloudflare/): 概要 私は個人でWebサイトやWebサー... - [AtlassianをSP、Google WorkspaceをIdPとしてSAMLを設定する方法](https://blog.teraren.com/2023/04/20/atlassian-saml-google-workspace/): 概要 SAMLの証明書が切れたので設定箇... - [末尾の半角スペースで困惑:ActiveModelとMySQLの連携問題](https://blog.teraren.com/2023/04/14/mysql-pad-space-and-active-record/): 概要 ActiveModelのuniqu... - [Raspberry PiのWiFiと有線LANに静的IPを振る](https://blog.teraren.com/2023/04/08/raspberry-pi-static-ip/): デフォルトだとDHCPからIPを取得する... - [Wordpressのoptions.phpページで保存できないときの対処法](https://blog.teraren.com/2023/03/31/wordpress-options/): WordPressで、「options.... - [CloudWatchのlog insightでの調査例](https://blog.teraren.com/2023/03/30/cloudwatch-log-insight/): アプリケーションのログがJSONで保存さ... - [slackで最終営業日にリマインダーを設定する方法](https://blog.teraren.com/2023/03/30/slack-reminder-last-weekday/): 正確には日本の休日マスタを使わないと出せ... - [Automatically delete head branchesの宗教論争](https://blog.teraren.com/2023/03/28/post-15243/): 概要 githubのレポジトリ運用におい... - [HSTS (Http Strict Transport Security)を設定](https://blog.teraren.com/2023/03/12/hsts-http-strict-transport-security/): HSTSについての説明はこちらに詳しく書... - [HHKB Proをオキシクリーンで掃除してルビング](https://blog.teraren.com/2023/03/11/happy-hacking-keyboard-pro-clean-up/): 概要 2020年1月にHHKB Pro ... - [NURO Wireless 5G注意報:レンタルモデムの不安定さを知っておこう!](https://blog.teraren.com/2023/02/27/nuro-wireless-5g/): 概要 NURO Wireless 5Gの... - [Dockerを使ってHTTP3対応のnginxでホスティングしてみる手順](https://blog.teraren.com/2023/02/12/nginx-http3/): 概要 HTTP3に対応したサイトが全世界... - [Minecraft Server(統合版)をUbuntu上で起動する](https://blog.teraren.com/2023/02/06/post-14986/): 概要 Ubuntu 22でMinecra... - [Minecraft Server (統合版) をsystemdによる自動起動設定](https://blog.teraren.com/2023/02/05/minecraft-bedrock-server-setup/): 概要 Minecraft Bedrock... - [和暦や休日情報をREST APIで提供するサービスを公開](https://blog.teraren.com/2023/01/09/seireki-wareki-api/): 概要 以下の情報の取得や変換を行えるサー... - [AWS Organizationを導入した後にAWS IDを作る手順](https://blog.teraren.com/2022/12/16/aws-organization-account-creation/): 備忘録。マニュアルは長ったらしいし、ベス... - [CloudFrontにてCORSを利用する際の設定方法](https://blog.teraren.com/2022/12/14/cloudfront-cors-s3/): 久しぶりにハマったので備忘録を残しておき... - [Rail7の推奨になったimportmap+ dartsassを使ってサービスを構築してみました](https://blog.teraren.com/2022/12/14/rail7-importmap-service/): 概要 Ruby on Rails Adv... - [node 18 upgrade error](https://blog.teraren.com/2022/12/06/node-18-upgrade-error/): Node. js v16からNode. ... - [githubのissueやpull requestをCSVで出力するスクリプトを書きました](https://blog.teraren.com/2022/12/01/github-issues-prs-csv-export/): 概要 特定の検索条件で、githubのi... - [Google Spreadsheetで特定の日の為替レートを表示](https://blog.teraren.com/2022/11/28/google-spreadsheet-fx/): コピペできるようにメモ。 為替レートを表... - [Google WorkspaceからOffice 365へのユーザ同期が年1回ぐらい止まる問題の対処方法](https://blog.teraren.com/2022/11/08/google-workspace-office-365/): 背景 コーポレートSEのお話。(おそらく... - [カジノのルーレットシミュレータを書いてみました](https://blog.teraren.com/2022/11/06/roulett-strategy-simulator/): 概要 ダズンベット法を使うと勝ちやすいと... - [Rails7 + importmap + dartsass-rails](https://blog.teraren.com/2022/10/16/rails7-importmap-dartsass-rails/): 概要 Rails7のデフォルトでのアセッ... - [webpackerを削除してcssbundling-rails+jsbundling-rails+propshaftに移行](https://blog.teraren.com/2022/10/09/removing-webpacker/): 概要 importmap-railsに移... - [ExcelやGoogle Spreadsheetで郵便番号から住所を補完](https://blog.teraren.com/2022/10/09/postcode-auto-fill/): 概要 Google Spreadshee... - [RailsのアクターがN:Mのシステムを作るときの権限モデル](https://blog.teraren.com/2022/10/08/rails-permission-metrics/): 背景 手元で作っているRailsのサービ... - [Appleで買ったSIMフリー端末が「SIMロックあり」になったので解除した話](https://blog.teraren.com/2022/07/20/apple-sim-free-locked/): 概要 日本のApple公式サイトからiP... - [MegaRAIDの節電機能](https://blog.teraren.com/2022/06/30/megaraid-eco/): 概要 サーバの平均消費電力が80Wぐらい... - [おすすめの技術記事15本ピックアップ](https://blog.teraren.com/2022/06/07/popular-tech-article/): 概要 エンジニアとして知っておくべき知識... - [過去に立ち上げたサービスのまとめ](https://blog.teraren.com/2022/06/07/built-services/): 概要 過去に立ち上げたサービスを紹介しま... - [読み物系記事のおすすめ15本ピックアップ](https://blog.teraren.com/2022/06/07/popular-story-article/): 概要 このブログは開設から約19年経過し... - [広告配信精度とプライバシー保護に関する法律と技術のまとめ](https://blog.teraren.com/2022/06/03/ad-accuracy-and-3rd-party-cookie/): 2022年5月に社内でLTした内容をまと... - [FakerやGimeiのseedをrspecのseedと一致させる](https://blog.teraren.com/2022/06/02/rspec-seed-unstable-result/): 概要 rspecにおいて、単体テストの順... - [Railsでsessionを無効化する方法](https://blog.teraren.com/2022/05/28/disable-session-on-rails/): config/initializers/... - [Error response from daemon: network xxxxxxxx not foundエラーが出たけど解決](https://blog.teraren.com/2022/05/28/error-response-from-daemon-network-not-found/): 問題 コンテナを起動しようとしたら以下の... - [路線情報・駅情報のREST APIサービスを作りました](https://blog.teraren.com/2022/05/21/ekidata-api/): 概要 https://train. te... - [Rails 6.1.5でdb:migrationのときにreference周りでエラー](https://blog.teraren.com/2022/05/19/rails-6-1-5-reference-error/): 問題 rails db:migrateを... - [chromedriverのインストールをarmとintelのDockerfileで共通化](https://blog.teraren.com/2022/05/11/chromedriver-on-arm/): 概要 E2Eテストをするためのchrom... - [armとintelのdocker-compose共通化へ向けて(mysql編)](https://blog.teraren.com/2022/05/02/arm-intel-docker-compose-in-the-same-file/): 追記 Officialの方でもarm64... - [Toonesの利用料を取得するスクリプト](https://blog.teraren.com/2022/05/02/toones-usage-automation/): 概要 Toonesのサービス利用料を集計... - [Amazon Linux 2にtigをインストール](https://blog.teraren.com/2022/04/27/amazon-linux-2-tig/): Extra Packages for E... - [armとintelのdocker-compose共通化へ向けて(Ruby on Rails編)](https://blog.teraren.com/2022/04/26/docker-m1-arm-glibc-error-on-nokogiri/): 問題 M1macでDockerのruby... - [AASMでステータス変更と同じクリティカルセクションで実行](https://blog.teraren.com/2022/04/20/aasm-execute-within-transaction/): 概要 主にActiveRecordと併用... - [Envoy(受付アプリ)のSlack通知が遅いので自作](https://blog.teraren.com/2022/03/24/envoy-slack-notification/): 概要 Envoyというオフィスのエントラ... - [Google Domainsのドメインでメール送信ができなくなったけど解決](https://blog.teraren.com/2022/03/07/google-domains-send-failure/): 概要 独自ドメインの転送メールアドレスを... - [Google Domainsへ移管して無料でカスタムドメインをGmailで使う](https://blog.teraren.com/2022/02/10/google-domains-custom-domain-gmail/): 概要 Google Domainsでドメ... - [有効期限付きポイントシステムの要求定義と設計](https://blog.teraren.com/2022/02/03/point-system-design-rdb/): 概要 15年前ぐらいに設計、実装したシス... - [自宅サーバ環境](https://blog.teraren.com/2022/02/03/home-server/): ハードウェア PowerEdge T32... - [GoogleのCloud Identityでエンドポイント管理](https://blog.teraren.com/2022/02/03/google-cloud-identity/): 概要 Googleが2020年1月16日... - [slackのステータスアイコンを自動で更新(家かオフィスかをアイコンで表示)](https://blog.teraren.com/2022/02/03/show-current-location-icon/): 概要 以下のように、自分がどこにいるのか... - [Toonesの残高をチェックして少なかったらSlackへアラート](https://blog.teraren.com/2022/01/12/toones-balance/): インターネットFAXのToonesにある... - [RSA Encryption not supported - caching_sha2_password plugin was built with GnuTLS support がでたときの対処法](https://blog.teraren.com/2021/12/18/rsa-encryption-not-supported/): 原因 MySQL5. 7までの認証プラグ... - [Ubuntu 20.04.2 LTSにWiFiドングルを設定](https://blog.teraren.com/2021/11/12/ubuntu-20-04-2-lts-tplink-wifi/): こちらを買いました。Linuxで使えるよ... - [Ubuntu 21.10で複数NICを1つのネットワークに繋げる設定](https://blog.teraren.com/2021/11/05/ubuntu-21-10-multiple-nic/): Ubuntu 20系よりroute周りの... - [Ubuntu 21.10にアップグレードしましたが2つ問題が発生](https://blog.teraren.com/2021/10/27/ubuntu-21-10-upgrade/): 処理自体は簡単です。今までと同じようにU... - [Rails + MySQL 8でngramを用いたfulltext index](https://blog.teraren.com/2021/10/19/rails-mysql-ngram-fulltext/): Railsのmigrationで普通にf... - [ミラーサーバの取りやめの連絡](https://blog.teraren.com/2021/10/05/stop-mirrorring/): 以下の2サイトを停止致します。 ミラー元... - [このBlogのホスティングを自宅サーバからLightsailに移行しました](https://blog.teraren.com/2021/08/31/wordpess-lightsail-php8/): 背景 自宅サーバで運用していましたが、R... - [rsync over sshをAWS Session manager経由で使う設定方法](https://blog.teraren.com/2021/07/16/rsync-over-ssh-on-aws-session-manager/): 要件 AWS Systems Manag... - [zipコマンドでmacosのDSStoreやIconファイルを除外して圧縮](https://blog.teraren.com/2021/06/30/zip-macos-dsstore-icon/): zip -r output. zip d... - [テレカンするとCPU利用率が高くなる→熱暴走の保護機能が発動している](https://blog.teraren.com/2021/06/11/cpu-high-load-caused-by-heat-issue/): 症状 最近、Google Hangout... - [Amazon Lightsailは初期立ち上げは楽だけど運用が辛い](https://blog.teraren.com/2021/05/31/amazon-lightsail-os-upgrade-failure/): 概要 2年前ぐらいに Lightsail... - [郵便番号APIサイトのデータソースをzipcloudに変更](https://blog.teraren.com/2021/04/25/postcode-api-master-change/): 概要 私が運営している郵便番号検索API... - [分割されていない電話番号から市外局番と市内局番の求め方](https://blog.teraren.com/2021/04/15/split-area-code/): 概要 分割されていない電話番号から、市内... - [tableau serverのホスト名が変わってしまったときの対処法](https://blog.teraren.com/2021/04/14/tableau-server-certificate-error/): 背景 Tableau serverをAW... - [自宅LinuxサーバにUPS(無停電電源装置)導入](https://blog.teraren.com/2021/04/14/ups/): 概要 UPSが1万5000円ぐらいなので... - [CSVデータをActiveRecordにimportする際における各手法のベンチマーク](https://blog.teraren.com/2021/03/21/csv-activerecord-import/): 概要 RubyにおいてCSVデータをDB... - [TOPPING D10 USB DACのチップをOPA627AUに交換](https://blog.teraren.com/2021/03/15/topping-d10-usb-dac-opa627au/): 今持っている、TOPPING D10とい... - [CloudWatchにrubyアプリケーションからログを投げる](https://blog.teraren.com/2021/03/12/cloudwatch-ruby/): しかし、投げまくっていると以下のような例... - [ワンライナーでJSONをCSVに変換](https://blog.teraren.com/2021/03/10/json-to-csv/): リモートに有る郵便番号の一覧をJSONで... --- # Detailed Content ## 固定ページ ### History - Published: 2021-10-27 - Modified: 2022-02-16 - URL: https://blog.teraren.com/history-of-this-blog/ このブログのヒストリー 2003/5/28このブログが誕生大学の自分用Web置き場にてMovable Typeを利用して開設。主に内容は日記。当時のURL: http://www. sfc. keio. ac. jp/~t01549ym/mt/ 2005年頃研究室のサーバーに移行NucleusというPHPで構築されたCMSに移行しました。MovableTypeだと記事を書くたびに静的なHTMLを書き出していたので1回のpublishに時間がかかったので編集効率が悪かったのと、動的生成であれば自分で簡単に改造できるためです。 当時のURL: http://cubic. dsci. sfc. keio. ac. jp/~matsu/ 2006年頃知り合いの自宅サーバに移行CPUスペックが優れていて、無料で使わせてくれとのことなので知り合いの自宅サーバへ移行。 当時のURL: http://www. tymy. net/~matsu/blog/ 2007年頃アメリカへ渡米滞在中は英語で日記を書くと決めてつたない英語で日記を書く。 Nucleusの開発が殆ど行われておらず、PHPのバージョンアップにすら追随しなくなったので、Wordpressに移行。当時のバージョンはWordpress 2。 2012年頃MX自分のドメインに移行現在のURLへ。 http://blog. teraren. com/ サーバは自宅で場所を取らずに運用するために、mac mini server。GUIじゃなくてCUIでmacをサーバとして運用するのはなかなか大変でした。 2014年頃AWS EC2で運用開始mac miniにUSB3でRAID 5のディスクアレイをつなげて運用していましたが接続が不安定で切断されることが多かったので、インフラのメンテナンスから開放されるためにEC2へ移行。 2018年頃日記と技術系記事を分けるためにblogを分割日記は https://diary. teraren. com/ へ移動。技術系記事は引き続き https://blog. teraren. com/ で。 2019年自宅Linuxサーバで運用開始EC2で運用していると月に1万円近くかかるので送付ょう含めて3万円ぐらいのDELL PowerEdge T320を買って運用開始。 8コア Xeon E5-2450 2. 1GHz/12GB/3. 5inch SAS 300GB*4 RAID SASの稼働音がうるさいのでSATAに全部入れ替えた上で、OS領域用にSSDを2台追加してRAID1を組む。 SATAのディスクはファイルサーバとして利用し、定期的にAWS S3 Glacierへ転送。 2021年自宅サーバのRAIDカードが壊れるRAID5で組んでいたので復旧が非常に面倒でした。1ヶ月位かかりました。やはりインフラの面倒を見るのが面倒なのと、AWS Lightsailが安価なのでLightsailへ移行。 --- ### Author - Published: 2019-06-10 - Modified: 2022-04-26 - URL: https://blog.teraren.com/yuki-matsukura/ 概要 こんにちは!matsuboです。2018年9月から株式会社マインディアにて共同創業者CTOとして自社システムの開発を行っています。只今マインディアではエンジニア募集中です。 エンジニアリングに関しては基本的に広く浅く、必要に応じて特定の分野を深く掘り下げます。IT戦略からコードレベルのバグフィクスまで何でもやります。青々とした芝を生やせるようにどんなに忙しくても自己研鑽を怠らないようにしていきたいと思います。 このブログにはGoogleを検索しても見つからなかったことや、オリジナルのアイディアや考えを書いていきます。人見知り、コミュ障なので温かい目で見てほしいです。 強み 個別化、目標思考、自我、戦略性、親密性 ソーシャル経歴 2018/8 -マインディア CTO2014/1 - 2018/8株式会社メタップス2011/2 - 2013/12グリー株式会社2009/4 - 2011/1コーチ・ユナイテッド株式会社 芝生 --- ### Privacy policy - Published: 2018-05-22 - Modified: 2020-10-28 - URL: https://blog.teraren.com/privacy-policy/ 私たちについて 私たちのサイトアドレスは https://blog. teraren. com/ です。 このサイトが収集する個人データと収集の理由 コメント 訪問者がこのサイトにコメントを残す際、コメントフォームに表示されているデータ、そしてスパム検出に役立てるための IP アドレスとブラウザーユーザーエージェント文字列を収集します。 メールアドレスから作成される匿名化された (「ハッシュ」とも呼ばれる) 文字列は、あなたが Gravatar サービスを使用中かどうか確認するため同サービスに提供されることがあります。同サービスのプライバシーポリシーは https://blog. teraren. com/privacy-policy/ にあります。コメントが承認されると、プロフィール画像がコメントとともに一般公開されます。 メディア サイトに画像をアップロードする際、位置情報 (EXIF GPS) を含む画像をアップロードするべきではありません。サイトの訪問者は、サイトから画像をダウンロードして位置データを抽出することができます。 お問い合わせフォーム Cookie サイトにコメントを残す際、お名前、メールアドレス、サイトを Cookie に保存することにオプトインできます。これはあなたの便宜のためであり、他のコメントを残す際に詳細情報を再入力する手間を省きます。この Cookie は1年間保持されます。 もしあなたがアカウントを持っており、このサイトにログインすると、私たちはあなたのブラウザーが Cookie を受け入れられるかを判断するために一時 Cookie を設定します。この Cookie は個人データを含んでおらず、ブラウザーを閉じた時に廃棄されます。 ログインの際さらに、ログイン情報と画面表示情報を保持するため、私たちはいくつかの Cookie を設定します。ログイン Cookie は2日間、画面表示オプション Cookie は1年間保持されます。「ログイン状態を保存する」を選択した場合、ログイン情報は2週間維持されます。ログアウトするとログイン Cookie は消去されます。 もし投稿を編集または公開すると、さらなる Cookie がブラウザーに保存されます。この Cookie は個人データを含まず、単に変更した投稿の ID を示すものです。1日で有効期限が切れます。 他サイトからの埋め込みコンテンツ このサイトの投稿には埋め込みコンテンツ (動画、画像、投稿など) が含まれます。他サイトからの埋め込みコンテンツは、訪問者がそのサイトを訪れた場合とまったく同じように振る舞います。 これらのサイトは、あなたのデータを収集したり、Cookie を使ったり、サードパーティによる追加トラッキングを埋め込んだり、あなたと埋め込みコンテンツとのやりとりを監視したりすることがあります。アカウントを使ってそのサイトにログイン中の場合、埋め込みコンテンツとのやりとりのトラッキングも含まれます。 アナリティクス あなたのデータの共有先 データを保存する期間 あなたがコメントを残すと、コメントとそのメタデータが無期限に保持されます。これは、モデレーションキューにコメントを保持しておく代わりに、フォローアップのコメントを自動的に認識し承認できるようにするためです。 このサイトに登録したユーザーがいる場合、その方がユーザープロフィールページで提供した個人情報を保存します。すべてのユーザーは自分の個人情報を表示、編集、削除することができます (ただしユーザー名は変更することができません)。サイト管理者もそれらの情報を表示、編集できます。 データに対するあなたの権利 このサイトのアカウントを持っているか、サイトにコメントを残したことがある場合、私たちが保持するあなたについての個人データ (提供したすべてのデータを含む) をエクスポートファイルとして受け取るリクエストを行うことができます。また、個人データの消去リクエストを行うこともできます。これには、管理、法律、セキュリティ目的のために保持する義務があるデータは含まれません。 あなたのデータの送信先 訪問者によるコメントは、自動スパム検出サービスを通じて確認を行う場合があります。   --- ### Copyright - Published: 2009-02-10 - Modified: 2024-05-08 - URL: https://blog.teraren.com/copyright/ https://blog. teraren. com/の作品は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。 --- ### About Me - Published: 2008-11-18 - Modified: 2021-09-02 - URL: https://blog.teraren.com/about/ see: https://www. wantedly. com/users/4453 Minedia, Inc. CTO 株式会社マインディア マインディア --- ## 投稿 ### Xiaomi 14T Proをメインスマホにできるか検証 - Published: 2025-02-23 - Modified: 2025-03-13 - URL: https://blog.teraren.com/2025/02/23/xiaomi-14t-pro/ - カテゴリー: Android - タグ: iPhone 16 Pro, Xiaomi, Xiaomi 14T Pro 背景 最近、iPhoneが高すぎるし、スマホで写真を撮りまくっているのでカメラ性能が良いXiaomi 14T Proを試してみて良ければ移行しようと思います。 iPhoneにインストールされているアプリをカウントしたら330個ぐらいあって、これも減らしたいと思ってます。(頑張って掃除はしているけどなかなか減らない) 開封 Aliexpressで注文して1週間ほどで届きました。注文時は1ヶ月後に到着予定と書かれていますがでたらめです。 ミニマムなパッケージ。 スマホに最適化された緩衝材! 日本向けに用意したのか、電源プラグ変換アダプタがスマホの箱とは別に同梱されていた。 iPhone 16 Proより一回り大きい。 120WのACアダプタが入ってる。強力すぎる! スマホケースが同梱。画面のフィルムも元から貼り付けてあるので楽! 自分でケースに入れる。 独自OS。。。。 巨大! ベンチマーク antutuから抜粋です。 Xiaomi 14T Pro iPhone 16 Pro カメラ性能 手元にあるiPhone 16 Proとの比較をしていきます。 牛丼。食べ物の色の表現は意外と難しいです。 https://twitter. com/matsubokkuri/status/1893168256317563150 https://twitter. com/matsubokkuri/status/1893205539682750861 https://twitter. com/matsubokkuri/status/1892966419840512500 まとめ 光学性能はXiaomi 14T Pro勝ち。 センサはiPhone 16 Proが勝ち。特に高感度は歴然。 問題 レンズ内に曇りが発生 しばらく使っていたら、望遠レンズに水滴が付きました。 Webを検索すると同じ症状の事例が多数出てきます。製造時に混入している模様です。 https://www. reddit. com/r/Xiaomi/comments/1b314x0/xiaomi_14s_camera_lens_is_fogging/ ziplockなどにスマホと乾燥剤を入れてしばらく放置して抜くしか無いです。 レンズの曇りを取る方法はこのページに以下のように紹介されていました。 推奨修正法1 スマートフォンの外側が乾いてきれいな状態であることを確認し、必要に応じてマイクロファイバークロスで拭きます。 SIMトレイを開けます。 SIMトレイを引き出します。 30分から1時間ほど自然乾燥させます。 8K解像度で10〜30分間ビデオ撮影を行い、スマートフォンを少し温めます。 SIMトレイを元に戻し、状況を確認します。 これで湿気の問題が解決するはずです。 推奨修正法2 スマートフォンの外側が乾いてきれいな状態であることを確認し、必要に応じてマイクロファイバークロスで拭きます。 SIMトレイを開けます。 SIMトレイを引き出します。 3Dmarkをダウンロードします。 約20分間ストレステストを実行します。 これによりスマートフォンが熱くなりますが、バッテリーが約45℃になると熱制御が働くため、完全に安全です。 ストレステストが終了したら、SIMトレイを出したままにします。 屋外で5〜10分間、8Kビデオ撮影をテストします。 曇りがなければ、SIMトレイを元に戻します。 しかし、上記の方法ではスマホのバッテリーは痛むし、無駄にCPUやSSDを消費するのでスマホの寿命を削ってしまいます。冷蔵庫に入れて冷やすのもリチウムイオン電池的にも良くないです。 日本ではこの方法が一般的だと思います。ジップロックにスマホと乾燥剤を入れて放置。その際にSIMトレーは外す感じが良いと思います。 Xiaomi独自OS プリインされているアプリが削除できません。 AndroidとXiaomiの独自機能が癒着してしまっています。 良い点 ベンチマーク結果は同じだが、価格が半額 iPhone 16 Proとベンチマークやスペックは近似しているなかで、価格は半額というのは魅力的。 指紋でアンロック 画面上で指紋認識ができるのでいちいち顔を向けなくてもアンロックできます。 結論 iPhoneからAndroidへの移行は断念。 ハードウェアは良いけど、AndroidのUXに慣れなさそうなので諦める。 iOSで設定を最適化しすぎた気もする。。。今まで1ステップで実行できていたことが2ステップになることが増えてしまって面倒に感じた。 夜景が汚いのが残念。 ゼロイチでセットアップするならAndroidでも良い気がする。 --- ### デスクトップの音響環境を測定してみる - Published: 2025-02-22 - Modified: 2025-02-23 - URL: https://blog.teraren.com/2025/02/22/check-by-room-acoustics-software/ - カテゴリー: Diary - タグ: GENELEC, REW, Room Acoustics Software 概要 ちょっと音響環境を調べる必要が出てきたのでREW (Room Acoustics Software) で計測してみました。 Javaで動くのでMacでも動きます。最近のJavaは軽快なのか、PCのスペックが良くなったからかわかりませんが起動は速く、ストレスなく動きます。 とりあえず手元にある機材で計測していきます。 音響環境 PCで作業するデスクトップです。 スピーカー GENELEC 8020 USB-DAC 測定 準備 マイク、USB-DACのキャリブレーションをすべきですが、手元にあるマイクが現在はUSBで接続されているのでループバック接続するのが面倒なのでスキップしました。 使っているマイクはこちら。ミニジャックはありますが まずは、音量のキャリブレーション。音圧を定量的に測定するのにこれは必要です。実測値はこれも簡易的にiPhoneのアプリを使って計測。 SPL 周波数特性。 サブウーファーが無いので下の方は出ていません。 ほかはフラット。3kHz〜4kHzに盛り上がりがあるのはエコライザで持ち上げすぎているからかと思います。 ちなみに、スピーカーにはカットオフができる機能がありますが単体で使っているので全てOFFです。 Distortion 高調波歪みとノイズ 相対的に同じくらいのレベルなので大丈夫そう。目立ってDistortionが大きいところはない。 Impulse 250msで急に落ちてる。距離換算すると85mだが、それっぽい原因がわからない。部屋の特性かなと。 RT60 どのくらい残響が収まるのに時間がかかったか。 T30で169msなので残響が少ない。物が多いからかな。 Clarity 100%に近いので良い! Waterfall 低音の残響が多め。SPFで出てた、3〜4kHzが大きめ。 Spectrogram 参考資料 めちゃくちゃわかりやすい。 https://www. youtube. com/watch? v=9TVkrzxjNRo 他の動画も見ましたけど、このかた、すごい知識量。理論的です。いままで音響の世界は定性的なよくわからない表現が多くて困ってましたが、定量的に解説してくれているので その理由が明らかになります。 っていうか、SONYの主任研究員ですね。専門は機械学習のようです。オーディオは趣味っぽい。 まとめ さすがGENELECです。スピーカー性能に問題ないです。左右差もありません。 リスニングしていても不満は無いので。(たまに重低音がほしいときはありますが) --- ### タブレット端末を壁掛けして情報端末として使うといろいろ捗る - Published: 2024-08-27 - Modified: 2025-01-06 - URL: https://blog.teraren.com/2024/08/27/tablet-on-the-wall/ - カテゴリー: Parenting hacks - タグ: Android, Android13, CHUWI, 電気工事士 概要 半年ぐらい前から、壁にタブレット端末があると便利だなと思ってました。 カーナビもAndroidベースの端末をかれこれ2年以上使っていて不自由はしていません。 完成図 こんな感じ。 天気を表示したりしてます。 設定で常時画面をONにしています。安い端末なので、自動光量調整ができないです。MacroDroidを使って夜に暗く、朝に明るくする設定をしています。 最近は、ベビーベッドの監視のためにカメラの内容をストリームしています。キッチンからベビーベッドを確認できるので楽です。 赤外線ライト付きなので暗くても良く見えます。 Androidにログインするアカウントは、普段のアカウントとは別途作成しました。常時ログインしっぱなしなので。 端末をゲストアカウントで運用するとなると、毎回データが消えてしまうので使いづらいと思います。 買ったもの Androidの適当な安いやつを買いました。 安すぎると動作が遅くてストレスが溜まるし、高いと使用頻度が少ないのでもったいないのでちょうどよい具合のものを見つけるのに時間がかかりました。 こちらの商品は、多少UIがもっさりしていますが使用頻度が少ないので我慢できます。 CHUWI製品は安いのにそこそこ良いクオリティなのでお気に入りです。一昔前のHuaweiという感じです。日本ではHuaweiが売られなくなったのでCHUWIは助かります。 施工 電源ケーブルが「たら〜ん」としているとカッコ悪いので壁から電源を引っ張ってきます。 壁に穴を開けて、近くのコンセントから電源を引っ張ってきます。(要資格) 壁の中にコンセントを取り付けて、USBアダプタを取り付け、ケーブルを出します。空いた穴には、切り取った石膏ボードを戻しておきます。 タブレットの裏に少し隙間があるのでそこからケーブルを脇に持ってきます。 上下のホルダーは、100円均一で昔に買ってポストカードスタンドだと思います。 まとめ 施工は面倒でしたが、やってよかったです。 レシピを表示したり、天気、カレンダーの予定を確認するするのに重宝しています。 --- ### Web魚拓: 「研究」と「勉強」の違い - Published: 2024-08-27 - Modified: 2025-01-06 - URL: https://blog.teraren.com/2024/08/27/diff-study-research/ - カテゴリー: Diary - タグ: SFC, 井庭, 勉強, 研究 概要 過去に何度も参照している以下のページが消えてしまいそうな感じがするので魚拓として保管しておきます。 https://web. sfc. keio. ac. jp/~iba/sb/log/eid75. html 本文 タイトル: 「研究」と「勉強」の違い 2008. 07. 25 Friday 23:50 | posted by 井庭 崇 研究会の新規履修者の面接を行った。SFCでは、学部1年生から研究会に所属し、研究に従事することができるので、1年生や2年生も新規希望者としてやって来る。 井庭研の面接は、担当教員の僕が一人で行うのではなく、研究会の現役メンバーを数人交えて行う。というのは、研究会というのは一種の「生き物」であって、もはや僕だけのものではないという思いがあるからだ。僕との相性のみならず、研究会メンバーとの関係もかなり重要なのだ。面接では、新規希望者一人につき、30分の時間をかけて、取り組みたい研究テーマや、興味・関心分野について話をきいていく。 その研究会面接で、僕が必ず言う話がある。それは、「研究」と「勉強」の違いについての話だ。面接で、研究テーマをきいてみると、「~を勉強したい」と答える人が多くいる。こう答えるというのは、「研究」と「勉強」の違いがよくわかっていない証拠だ。研究テーマについて話しているのではなく、これから知りたいことを挙げているに過ぎない。そこで、僕は面接時に、「研究」と「勉強」はどう違うのか、ということを説明する。 まず、「知のフロンティア」があるとしよう。こちら側には、人類が現在知ってる「既知」の領域が、そして向こう側には、人類がまだ知らない「未知」の領域が広がっている。これから研究を始めるとき、当然、僕らはフロンティアに立っているわけもなく、そこから遠いところにいるだろう。そして、少しずつ知識をつけて前に進んでいく。そしてあるとき、フロンティア・ラインの一地点に到達するだろう。このようにして、既知の領域を進んでいくことを「勉強」という。不勉強でビハインドだった自分が、授業や本、人の話などから知識を得て、いまどこがフロンティアなのかがわかるようになる。これが「勉強」をするということだ。 これに対し、「研究」というのは、まったく異なるアクティビティだ。研究とは、フロンティアからさらに一歩前へ進み、既知の領域を広げるということ。もちろん、道なき道を開拓しながら進んでいくことになるので、それはとてもしんどい作業であり、一朝一夕にできるものではない。さて、ここで重要なのは、かならずフロンティアを開拓しなければならないということだ。すでに開拓されているところで、新たに開拓したとしても、それは「車輪の再発明」であり、研究にはならない。SFCカリキュラムの言葉に照らして言うと、「研究=先端×創造」なのであり、「研究とは、先端領域で創造を行うこと」なのだ。「研究」には「勉強」が不可欠だが、いくら「勉強」をしても「研究」にはならない。この「研究」と「勉強」の違いを意識することが、研究テーマを考える上でとても重要なのだ。 この「研究」と「勉強」の違いという話は、実は、僕がまだ学部生だったころ、竹中平蔵先生が研究会でよく語っていた話だ。この話は、「研究」と「勉強」の違いを非常にクリアに言い表していると思う。そんなわけで、僕は毎年、この話を面接のときに繰り返し話す。 研究会は「研究」のための場であるから、研究テーマをもった人たちの集まりだといえる。なので、研究会面接で熱く語ってほしいのは、勉強テーマではなく、研究テーマについてなのだ。荒削りでもいい。「研究」へと向かう志向性がほしい。そして、できるかできないか、という現実性よりも、何をやりたいのかというヴィジョンがほしい。 以前紹介した『音楽を「考える」』(茂木健一郎, 江村哲二, ちくまプリマー新書, 2007)のなかで、茂木さんと江村さんが、次のように語っている。まさにそのとおりだと思う。 (茂木)「若いときには自分の使える技法やツールと、胸に抱いている大志、夢見ている世界との間には明らかに大きすぎるギャップがある。それくらいアンバランスなやつじゃないと、表現者としては大成しないんだということが経験でわかりました。これはほとんど例外がない。」(p. 47) (江村)「結局は、自分に何ができるかじゃなくて、何がしたいかなんです。何ができるかなんて言いはじめたら、何もできなくなっちゃう。まずはそんなことはどうでもよくて、ただただ自分は何がしたいと思っているのか、という問題に尽きます。」(p. 48) 面接で僕らが見ることに、自分の研究・活動をドライブするような内発性をもっているか、ということがある。なかなかそれを感じさせてくれる人がいないのが現状であるが。。。同僚の土屋さんは、研究テーマには「愛」か「憎しみ」がなければならない、という。研究へと自らを突き動かす「情熱」が必要なのだ。そうでなければ、しんどい研究作業など続けられるわけがない。 繰り返し言うけれども、荒削りでもいいので、自分なりの研究テーマの糸口をもっていてほしい。そして、自分をドライブする内発性をもっていてほしい。それが、研究を志すみんなへの本質的なメッセージだ。 「研究」と「学び」について | - | - --- ### 寝室のライトを「とったらリモコン」に変更して快適子育て生活 - Published: 2024-08-15 - Modified: 2025-01-06 - URL: https://blog.teraren.com/2024/08/15/downlight-remote-control/ - カテゴリー: Parenting hacks - タグ: DIY, WTC56713W, ダウンライト, リモコン, 調光, 電気工事士 概要 リビングの調光スイッチを「とったらリモコン」に変更しました。型番: WTC56713W 乳児の子育て部屋には最適だと思います。もっと早くやっておけばよかったです。 施工後の写真 施工時間はスイッチパネルの入れ替えだけなので5分で終わりました。(要国家資格) 良い点、悪い点 良い点 床に布団を敷いて生活しているのでライトをコントロールするのに立ち上がるのが大変だったので、リモコンでオンオフ、調光ができると非常に楽になります。 壁のスイッチ側では、クリックでオンオフ、長押しで調光ができるので楽です。 オンオフのときに、フワっと付いたり消えたりするので目に優しい。 悪い点 お値段がちょっと高めの7,800円。ですが、基本的に壊れるものではないし、他の部屋に移設できるので1つは持っておいても良い気がします。 明るさの調整が上げるか下げるかなので、今の明るさがどのへんなのかがわからない。何かしらのフィードバックが欲しいけど、無いので最大限明るくなっているのか暗くなっているのかがわからない。 --- ### 生成系AIサービスから自分のサイトをブロックする方法 - Published: 2024-08-02 - Modified: 2024-08-22 - URL: https://blog.teraren.com/2024/08/02/block-llm-crawler/ - カテゴリー: Program & Service - タグ: robots, robots.txt, spider サイトのトップに以下のrobots. txtを設置または、コピペします。 https://gist. github. com/matsubo/1b4e362ac5a30302b324b008de703487 生成AI系サービスのuser agent名は以下から検索できます。 https://darkvisitors. com/agents Dark Visitorを導入してみた このBlogにDark Visitorのプラグインを導入してみてクロールしに来たBotを計測してみました。 無料だと10,000イベントちょっと計測できないようです。導入して4日で使い切ったようです。 その際のサマリーを軽く載せておきます。 --- ### 短縮URLサービスの利用を再考する:Bitlyの変更を機に探る最適な選択肢 - Published: 2024-08-02 - Modified: 2024-08-13 - URL: https://blog.teraren.com/2024/08/02/%e7%9f%ad%e7%b8%aeurl%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%92%e4%bd%bf%e3%81%86%e3%81%ae%e3%82%92%e6%ad%a2%e3%82%81%e3%82%8b%ef%bc%81/ - カテゴリー: Program & Service - タグ: bitly, SMS, 短縮URL 概要 bitlyのサービス内容が変更され、無料だと月に10個しか作れなくなりました。それに伴い、課金して使うか検討したときの資料をまとめておきます。 そもそも短縮URLを取り巻く環境はどうなっているのか調査して、対処方法を意思決定しました。 背景 運用している複数のプロダクトでBitlyを使って短縮URLを生成していました。 短縮URLを生成する目的は、SMSで自社のURLを送信する際に文字数制限があったりSMSのメッセージが分割されるのを可能な限り防ぎ、送信のコストを削減する目的で導入していました。 問題 URLを短縮するだけにあまりコストを払いたくないです。 Googleが短縮URLサービスを停止したりしているので短縮URLは必要性が低くなってきているような雰囲気を感じます。 サーベイ biltly以外の短縮URLサービスに乗り換えようと考えて、類似サービスを探していたのですが意外と欲しいサービスが見当たりませんでした。短縮URLサービスに求めることが意外と多いのです。 短縮URLサービスに求めることまとめ 運営元がしっかりしていること。(広告を挟んだりされてしまうリスクがあるため) 長期的に運用されそうなこと、長期的に運用してきていること。(途中で止まるとリンク切れになるため) ドメイン名が短いこと。 短縮URLサービス名が広く認知されていること。(ユーザにとって見れば、自分が使っているサービスとは違うドメインのURLが掲載されているので) APIでURLを発行できること。 上記を満たすようなサービスはすごい少ないです。しかも、ドメイン名が短いと結構怪しい感じが出ちゃうのでサービス名が広く知られていることは重要だったりします。 上記の要件を満たす候補は、tinyurl, Ow. lyぐらいしか無いです。 短縮URLサービスのリスク もし短縮URLサービスに秘密のリンクを掲載して認証無しに設定したら短縮URLサービス側に悪意があったらその情報にアクセスできてしまいます。 また、細かいことを言えばユーザにとって見れば、利用規約を踏んでいないのに他社のサービスを利用することになってしまいます。 自社のプロダクト内で短縮URLサービスの生成に失敗してしまった場合に、エラーハンドリングを適切に行なっていなければ処理が落ちてしまって後続のSMS送信などが失敗するリスクがあります。コードレビューをしっかりする必要があります。 短縮URLサービスを使うメリット そもそも短縮URLを使うメリットを考えてみます。主に以下の2点かなと思います。 トラッキングコードを入れてもURLが長くならない。 SMSの送信コストを抑えられる。 アプローチ 上記を踏まえて、自社のプロダクトでどうするかのオプションを考えてみます。 bitlyを使い続ける $8/monthを課金するだけで済むので1番楽です。コードを変更する必要もないです。 bit. lyというドメインの認知度はインターネットに慣れている人であれば高いですが、一般の人にとっては怪しく見えてしまうかもしれません。 自プロダクト内で実装する ドメイン名がそこそこ短い場合は自社で実装してしまうのが良いかと思います。自社サービスと連動していればユーザに取ってみても認知されているドメイン名です。 構築するのもそんなに手間ではないと思います。短縮URLは1度作成したら基本的には消せないのでデータ容量は気にする必要があります。 短縮URLを使わない 最近、SMSは全角670文字ぐらいは送れるそうなので短縮URLサービスを使わないというのもオプションになります。 短縮URLを使うより文字数が多くなってしまうのでSMS送信コストは増える可能性が高いです。 理想を考える 転送URLを使わないことが一番です。 その次は、自プロダクトで短縮URL機能を作ること。 最後に、社外の短縮URLSaaSを使うこと と考えます。 短縮URLサービスを使うことをやめてみて 手元のサービスで、短縮URLをつかなくなったことで1通あたり8円程度のSMSで送信コストがアップしてしまいました。 140通/月以上送る場合は短縮URLを使ったほうが安いことになります。 まとめ 短縮URLを使うメリット・デメリットをまとめました。 プロダクトの状況をや達成したい目標にあったアプローチを選定する必要があります。 追記 2024/8/13 https://dub. co/ というサービスを教えてもらいました。ゼロイチで開発するならばこのサービスが一番良いです。 https://dub. co 短縮URLのニーズは現在でも一定数はありそうです。手元のサービスにおいて短縮URLを使わないでSMSを配信したらコストが1. 5倍になりました。SMSにURLを掲載する場合は短縮URLに課金したほうがトータルコストが安くなるケースが多そうです。 --- ### Go Proアタッチメントを使用したベビーベッド監視カメラの設置方法 - Published: 2024-06-27 - Modified: 2025-02-19 - URL: https://blog.teraren.com/2024/06/27/tapo-stand-camera/ - カテゴリー: Parenting hacks - タグ: tapo, スタンド, 三脚, 監視カメラ, 育児ハック 概要 以前の記事でベビーベッドにに監視カメラを設置して大変便利になったので追加でユラリズムや別の場所に赤ちゃんを置いているときにも監視できるように三脚にカメラを設置できるようにしました。 普通にtapoのカメラを台やテーブルに置くだけでは赤ちゃんを撮影できません。なぜならカメラは設置した土台より下を撮影できなた炒めです。そのため、カメラを下に向ける必要があるので設置方法はちょっと考える必要がありました。 台の作成 tapoのカメラには設置用の土台が付いてきます。しかし、アタッチメントがなくて壁などの平面に取り付ける前提なのでそのまま使えません。 手元にあったGo Proアタッチメントに対応している3000円ぐらいの三脚があるのでそれを流用してみます。 まず、tapoの土台をGo Proマウントに変換するためアタッチメントを買いました。 このアタッチメントのネジ部分は1/4inchのねじでカメラ取り付け用になっています。 tapoの土台に5. 5mmの穴をドリルで開けます。穴を開けたら、Go Pro用のアタッチメントをねじ込みます。 あとは、Unaziの三脚に設置すれば終わりです。アタッチメントはアルミなのでちょっと重いtapoのカメラでもしっかり固定されます。 三脚側は前後にしか動けないけどカメラ側で350ぐらいは回転できるので大丈夫です。 ねじもアルミだとより安心感が出ると思います。 tapoアプリから見たプレビューです。こんな感じの角度で撮影できるようになります。 まとめ もっと安くできる方法を考えるために、1週間ぐらい設置方法を考えていましたが結局面倒なでアタッチメントを買ってしまいました。 SeriaにGo Pro用のアタッチメントが昔は売っていたみたいなのでそれを流用したかったのですが今は売ってい無さそうです。 --- ### ベビーベッドにGoogle Nest Miniを設置していつでも手軽に音楽再生 - Published: 2024-06-27 - Modified: 2025-02-19 - URL: https://blog.teraren.com/2024/06/27/audio/ - カテゴリー: Parenting hacks - タグ: google home, google nest, google nest mini, 育児ハック 概要 Google Nest Miniをベビーベッドに設置するとかなりQoLが高まります。設置には家に余っていた木ネジを使ってベビーベッドに打ち付けて、そこにNest Miniを引っ掛けます。 手軽に童謡を流したりできます。しかもGoogle Nestになってから音質がかなり良いです。 買ったもの よく使うコマンドは以下です。 「童謡の音楽を再生して」 「ジャンボリーミッキー流して」 「子守唄を再生して」 ちなみに、タブレットを設置して動画を流しっぱなしにするというアプローチもあるかと思いますが、教育上あまり良くないらしいのでタブレットは設置しない方針です。 考察 3ヶ月ほど運用してみました。おおかたとても役立っています。 改善したい点としては、「OK Google」と言ったときに反応しているかどうかが本体LEDの点灯によって判別できないのでベッドの裏側ではなく本体を見やすい位置に設置すべきです。 --- ### 赤ちゃんのおむつ交換のための暗い照明環境の設置 - Published: 2024-06-27 - Modified: 2025-02-19 - URL: https://blog.teraren.com/2024/06/27/lighting/ - カテゴリー: Parenting hacks - タグ: ダクトレール, 照明, 育児ハック 概要 おそらく、夜中におむつ交換するときに微妙に薄暗いライトがほしいです。直接照明だと覚醒してしまう可能性があるので、間接照明で。 ということで、天井にダクトレールを設置して、調光できるようにしました。 設置したものは、Panasonicのダクトレールを天井にビスで固定してあります。 買ったもの 使っているダクトレールはこちらです。取り付けにあたっては資格が必要な電気工事が必要になるのでハードルは高いです。 簡易的に設置できるものもあるので見栄えを犠牲にしてこういうのを使うのもありだと思います。1年ぐらいしか利用しないと思いますし。 スポットライトに関しては、特にこだわりが無いので調光対応の安いものを使いました。  しかしながら、LED調光ライトだと極限に暗くしたいときにある程度暗くなったところから消えてしまうのでちょっと微妙でした。 かといって、現在だとLEDが主流なのでハロゲンとか電球を使うのもちょっと時代の流れ的に微妙です。できるだけ暗くて調光対応のもので、あとあと電球を入れ替えられそうな以下のものを試すのが良いと思います。 --- ### tapoカメラでの赤ちゃん監視と録画方法 - Published: 2024-06-27 - Modified: 2025-02-19 - URL: https://blog.teraren.com/2024/06/27/tapo-baby-check/ - カテゴリー: Parenting hacks - タグ: tapo, TP-Link, 常時監視, 監視, 監視カメラ, 育児ハック 概要 赤ちゃんを常時監視して異常があったら検知する方法です。 異常検知しつつ、録画をしておけば成長記録にもなります。 買ったもの 監視カメラは多種多様なのですが、録画できて安くて屋内限定利用で充分です。 しかも、TapoカメラはONVIFプロトコル (Profile S) に対応しているため、サードパーティ製のNVRやNASに映像を保存できます。 Tapoという変な名前ですが、TP-Link(大手)がメーカーなので安心です。過去にTP-LinkのWiFiアクセスポイントはコスパが良かったので5台くらい買いました。 動画をローカルに記録するためにはmicroSDカードが別途必要になります。 設置 ベビーベッドに穴あけします。付属のネジは長過ぎるので、別途余っていた木ネジを使ってベビーベッドに固定します。 足の方でも頭の方でもレンズの位置を移動できるので問題無いです。ベビーベッドに穴あけするのには少し躊躇しましたが、利便性が格段に上がるので穴あけして固定した方が良いです。 設置後はこんな感じ。 アプリから見るとこんな感じです。 動体検知をしたときだけ録画する設定にしています。赤い部分は泣き声検知、オレンジの部分は伸びをしたときとかの動きを検知したときです。 どんな感じのライフサイクルかがこれを見ると大体わかります。 壁掛けのAndroidタブレットを設置して、常時このカメラのストリームを表示しています。 こうすることによってリビングからいつでもベビーベッドを確認できます。これは超便利です。 microSDに保存された動画はこんな感じです。定期的にファイルをバックアップしておけば成長記録になります。 まとめ tapoのカメラを設置しました。 性能、価格、アプリの使い勝手はかなり良いのでおすすめです。 私は設置場所に合わせて2台買いました。 --- ### 電池駆動のメリーを電源供給に改造して電池代を節約 - Published: 2024-06-25 - Modified: 2024-06-25 - URL: https://blog.teraren.com/2024/06/25/merry-ac-powered/ - カテゴリー: Parenting hacks - タグ: parenting hacks, USB, メリー, 育児ハック, 電源 概要 以下のメリーを使っています。 最初は「こんなおもちゃが赤ちゃんをあやせるわけ無いだろう」と思っていましたが、今となっては必需品です。これがないと生活できません。 しかしながらこのメリーは単2電池3本で駆動しており電池消費を気にしながらいつまで使うのかわからないが単2電池のストックを管理する必要が出てきて面倒です。 充電池を使ったとしても、充電池の初期コストと充電中に利用できなかったり単2電池用の充電器を買ったりしないといけないので初期出費がかなり高いです。この出資分の損益分岐が迎えられるとは思いませんでした。 なので、電源から駆動するようにして電池を気にしないで無限に駆動できるように改造します。 分解 とりあえず回路がわからないといけないので、分解してみてみます。 電池は直列でつながっています。 逆流防止用にダイオードが付いています。 4. 5V駆動の回路です。ACアダプターをこのためにだけに買うと1000円から2000円かかってしまうので、電圧が近い5VのUSB端子を使おうと思います。 家にあった、適当な充電用USBケーブルのメス側をカットしてコードを延長して接点につけます。 今後、電池で駆動させることは無いのでON/ONスイッチをつけるべきですが、省略します。 ついでに、ボタンの反応が悪くて強く押さないと反応しないので接点復活剤を塗布してウェスで拭き取っておきました。 完成図。1A程度しか出力しないAC-USBアダプタを取り付けて終わり。電池切れを気にせず永遠に稼働させられます。 LEDライトも電池を気にせずONにできます。精神衛生上とても良いです。 --- ### neofetchが終了してfastfetchが引き継ぎ - Published: 2024-06-23 - Modified: 2025-01-06 - URL: https://blog.teraren.com/2024/06/23/neofetch-fastfetch/ - カテゴリー: Linux - タグ: fastfetch, neofetch, Ubuntu Fastfetchの概要 Fastfetch は、システム情報を表示するための高速で効率的なツールです。このツールは、コンソールで動作し、オペレーティングシステム、カーネルバージョン、ディスプレイの解像度、メモリの使用量、CPU情報、GPU情報など、システムに関するさまざまな情報を美しく表示します。Fastfetchは、パフォーマンスとカスタマイズ性に重点を置いて設計されており、低リソース消費で高速に動作するのが特徴です。 特徴 高速動作: 軽量であり、非常に高速にシステム情報を取得して表示します。 カスタマイズ性: 表示内容やフォーマットを自由にカスタマイズ可能です。 低リソース消費: メモリやCPUの使用量が少なく、リソースに優しい仕様です。 Neofetchとの比較 Neofetch も同様にシステム情報を表示するツールですが、Fastfetchと比較するといくつかの違いがあります。 パフォーマンス Fastfetch: 高速で低リソース消費。多くの場合、Neofetchよりも情報表示が速い。 Neofetch: デフォルト設定でも比較的高速ですが、Fastfetchほどではない。 カスタマイズ性 Fastfetch: 設定オプションが豊富で、細かなカスタマイズが可能。 Neofetch: カスタマイズも可能だが、Fastfetchほど柔軟ではない。 プラットフォームサポート Fastfetch: 多くのLinuxディストリビューションをサポート。WindowsやmacOSでも動作する。 Neofetch: 幅広いプラットフォームで動作し、Linux、Windows、macOSを含む多くの環境で利用可能。 インストール Ubuntuの場合はreositoryを追加する必要がある。 sudo add-apt-repository ppa:zhangsongcui3371/fastfetch sudo apt update sudo apt install fastfetch 実行 --- ### QNAP TS-431Pを調達してNAS運用を始めました - Published: 2024-06-15 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2024/06/15/qnap-ts-431p/ - カテゴリー: Gadget - タグ: NAS, QNAP, raid, TS-431p 概要 QNAP TS-431Pを買ってNASのある生活を始めました。3. 5万円ぐらいでした。 いままで DELL PowerEdge T320に以下のディスクを乗せて運用していました。 OS領域 256GB SSDx2 RAID1 データ領域 2TB HDDx4 RAID1 しかしながら、RAIDコントローラのせいかHDDがスタンバイにならないので電力を食います。常時65W消費しています。昨今、電気代が結構高くなってきたので馬鹿にできない感じです。 それに、個人利用なのでHDDもほとんど利用していないの回転していると無駄に寿命を消費するのでスタンバイにしておきたです。 電気代とHDDのスタンバイ以外は最高です。ECC付きRAM、冗長化電源、XEON、Raidコントローラ、温度管理による安全な冷却。 TS-431Pの設定 Raidの設定 最近のQNAPのOSはすごいです。色々できそうです。そもそも最新のQNAPのハードウェアは個人向けでも結構無駄にいろいろな機能が付いていて金額が10万円ぐらいしてしまうので旧世代のハードウェアを買いました。 ディスクのプールを作るときには、Thin, Thick, Raidという謎な選択肢が出てきました。Thickにするとディスクの本数に応じて勝手にRaidレベルを変更するっぽいです。例えば、2本ならRaid1、3本ならRaid5といった感じです。 今回は、Thinckにしてしまいましたが普通にRaidにしたほうが良かったです。勝手にRaidのレベルを変えられてしまって困ります。 ネットワークの設定 GbEのポートが2つあり、ポートトランキングできるので設定しました。NASはネットワークがボトルネックになることが多いので。 その他の設定 アンチウィルスやメディアサーバとか色々アドオンできるっぽいです。 とりあえず、ディスクのスタンバイ機能を有効にして、無駄な機能は切りまくりました。 あと、ゴミ箱機能は有効にしてみました。あと、スナップショットも一応有効にして使ってみます。負荷が高かったら切ります。 設定項目が分かりづらいので、Perplexityに聞きながら色々進めました。 TS-431Pの運用 統計指標 Disk3を入れ替えてリビルド中のスクリーンショット。いろいろな指標が確認できて良いです。 ディスクの故障予期 SMART情報からディスクの寿命予測や、クリティカルな指標が出たらアラートを送ってくれます。 私が以前から使っていたハードディスク4本中2本にwarningが出ていたので別のディスクに交換しました。 Raidのリビルドにかかる時間 2TBのディスクを追加してリビルドをかけると24時間ぐらいかかります。HDDが古いので遅いです。。。 まとめ Raid5で2TB x 4が動いています。Raidコントローラが壊れたら終わるのでなるべくRaid1で運用したいところではあります。 しばらく様子を見てみます。 --- ### WordPressをDockerizedしました - Published: 2024-06-15 - Modified: 2024-06-15 - URL: https://blog.teraren.com/2024/06/15/wordpress-dockerized/ - カテゴリー: Program & Service - タグ: AWS, docker, gmktec, Lightsail, mackerel, Wordpress, 個人開発, 自宅サーバ 概要 設定方法は以下のページに書きました。 https://zenn. dev/matsubokkuri/articles/wordpress-mysql-docker サーバ運用 まず、Lightsail (月にで個人開発のサービスを一部運用していたのですが、データ量が多くなってきたのでストレージが足りなくなってきたことと、物理RAMが足りなくなってきたので自宅サーバへ移動しました。 Lightsailは以下のインスタンスを使っていました。 自宅サーバ自体もオーバースペック過ぎて、電気消費が大きいので新規に調達しました。 調達したPCはこちら。 https://blog. teraren. com/2024/04/02/gmktec-nucbox-m2 安くて良いです サービス運用 物理RAMが32GBあり、しばらく運用している現状で20GBぐらい使っています。 すべてのサービスをDockerizedしました。 DockerのRAMの利用常用はこんな感じです。 コンテナ数は30個ぐらいです。 RAMをたくさん使っているのは、MySQLとRailsのアプリケーションサーバです。RSS領域で使っています。あとは、disk cacheとしてちょこちょこ使われています。 WordPressサイトは10個ぐらいあります。1サイトごとにMySQLを立てているとメモリのMySQLサーバを立ち上げた直後の初期メモリ分が無駄になってしまうのでMySQLサーバは共有にしてアプリケーションサーバだけコンテナを個別にしました。 1. 5ヶ月ほど運用していますが問題は起きていないし速度もLightsailに比べるとだいぶ速いです。 WordPressの大まかなインフラ設定 DBは1コンテナ WordPressのコンテナはオフィシャルのイメージを使っています。latestタグ。 theme, uploads, pluginsの3つのディレクトリはローカルのファイルシステムに保存してコンテナ側からマウントしています。 1つのdocker-compose. ymlに上記の設定を入れています。 1点、運用上ちょっと微妙なところはdocker compose経由でサービスを立ち上げると一気にコンテナを立ち上げてしまうので起動直後はCPU、Diskの負荷が増大します。 依存関係をつけて順番に起動していくように書いても良いですが、実際には依存関係がないし順番の管理が面倒なので割愛します。 今後 クラウドじゃなくなったのでバックアップをしっかり取っていきたいと思います。 あと、ハードウェア故障に対してのBCPを考えていきます。 --- ### NECレンタルルータが辛すぎ - Published: 2024-06-15 - Modified: 2024-06-18 - URL: https://blog.teraren.com/2024/06/15/aterm-shit/ - カテゴリー: Network & Infrastructure - タグ: ATERM-0A1129, NEC, VDSL, ルーター, 不安定 概要 VDSLのレンタルルータである、「A T E R M - 0 A 1 1 2 9」が辛い。 辛い点 本体が大きい ファンレスではあるが発熱が大きい。 説明書に、上下左右は指定の空間を開けて設置する必要があると書いてある 実際に発熱が大きくて温かい。筐体は40度ぐらい。 DHCPサーバによる割当数がたった64しか無い。 見間違えかと思ったけど、本当に64しか配布できない。 不安定 月に数回、勝手に再起動する。 それによってテレカンが切れる。。。 パケットが詰まる テレカンしていると、回線品質が悪いというアラートが頻繁に出る。 リアルタイム通信における音声や動画の送受信に支障をきたす。 ハードウェア、ファームウェアの問題なので新品に交換しても改善しなかった。 回線品質が悪いから解約を申し出ても契約期間中の違約金なしでの解約ができなかった。 管理画面から設定できないところにVDSLのアカウント情報が書き込まれているので、別のハードウェアを使えない。 レンタルすることが必須。 他社のハードウェアを利用できない DHCPサーバのオプションを書き換えられないので任意のDNSサーバやパラメータを配布できない。 マニュアルに「電話回線として光ファイバーを利用し、電話機での通話を実現する電話サービスです。」という説明があるが意味がわからない。 良い点 無し 考察 以前使っていたNECのコンシューマ向けルータも酷い状態だった。 知り合いから設定を頼まれた家のルータがNECだったが、動作が不安定だった(設定通りに無線LANが動かない)。 NECのコンシューマ向けルータは使わない方が良いと思う。 --- ### TerraMasterを使ってMacOSでソフトウェアRaid1環境を構築してみる - Published: 2024-04-25 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2024/04/25/post-15888/ - カテゴリー: Gadget - タグ: D4-300, raid1, TerraMaster D4-300 概要 MacOSではソフトウェアRAIDを組めるので実際に使ってみて使用感を確かめてみたいと思います。様々なユースケースでどの用に動作するかを検証してみたいと思います。 買ったもの エンクロージャ TerraMaster D4-300 USB 3. 1 Gen 1 タイプC ストレージ、外付けハードディスクエンクロージャー、HDD/SSD ホットスワップ 用意したディスク HDD1 WD HDD 内蔵ハードディスク 3. 5インチ 2TB Green HDD2 Seagate BarraCuda 3. 5インチ 4TB 内蔵 ハードディスク HDD PC 2年保証 6Gb/s 256MB 5400rpm 正規代理店品 ST4000DM004 あえて2TBと4TBのディスクを用意してみました。 所感 HDD1をTerraMasterのエンクロージャへ、HDD2をTerraMasterを経由しないで直接Macにつなげたところ。 両方ともTerraMasterのエンクロージャへ入れたところ。OSから見える名称が異なるようです。 ディスク容量はちゃんと認識されています。HDD1HDD2Raid1を構築 DiskUtilityの「ファイル」から「RAID アシスタント」 Raid1を選択 ディスクアレイを選択 右側にあるRoleはアクティブにするか、スタンバイにするかを選択できます。今回は2代のみなのでRAID Sliceを選択してアクティブにします。 次に、ディスクの名称とフォーマット方法を選択します。名前をわかりやすく変更しました。 また、「Automatically rebuild」というオプションがあります。自動リビルドが走る設定のようです。 ディスクの内容を消えることを通知するアラートが出ます。そして、「Create」を押します。 2分ぐらいで完了しました。 フォーマットが完了した後の画面はこの用になります。 物理ディスクと、ソフトウェアRaidによる論理ディスクが見えるようになります。 Unsplashからダウンロードした画像を適当に保存してみます。 6. 7GBのWindowsのディスクイメージを書き込んでみます。 書き込みで42MB/s程度しか出ていません。USB 3. 1接続のはずなのに遅すぎです。これではUSB2. 0です。 接続にはUGREENのUSB-Cケーブルを使って直接Macに接続しています。 ユースケースチェック HDD1を抜き差ししてみる 実験前の状態。2台のHDDがRaid1で組まれていてオンラインです。 HDD1を抜いたところ そのままHDD1を指し直します。そうするとリビルドが自動で走ります。 もともとオンラインだったHDD2をマスタとして、HDD1を再構築し始めました。 ディスクのアクティビティを見ると、ReadとWriteが同程度活発に動いています。エンクロージャのランプは、HDD1が点灯して、HDD2が点灯しているのでディスクのデータをOS経由でコピーしているようです。 リビルドのスピードはすごい遅いです。5分で0. 2しか進みません。完了まで16時間ぐらいかかる見込みです。 時間がかかりすぎるので、Raidのメンバーから外してみます。 10秒程度でリビルドが中止されてメンバーから外れました。 Raidの状態は以下のようになり、「Missing/Dmaged」になりました。 今度は、明示的にRaidのメンバーとしてHDD1を追加してみます。 以下の画面で5分程度待ちました。しばらくしたら、HDD1の電源が切れました。。。。処理が止まってしまっているようです。 しかたがないので、TerraMasterの電源を強制的にオフ。 再度、Raidのメンバーに追加しようとしましたが。同じ状況に陥りました。 DiskUtilityを強制終了してやり直します。 今度は、「Repair」を選択します。そうしたら、30秒ぐらいで処理が完了して以下のようにスペアディスクとして追加されたようです。 スペアディスクからメンバーには変換できないようなので、またHDD1をスペアから削除します。 30秒程度で完了しました。 再度、HDD1をRaid1のメンバーとして追加しますが、処理中から一向に動く気配がないです。HDD1のアクセスランプも一切動きません。 OSを再起動しても同じ症状です。よって、MacosのソフトウェアRaidは運用では使えない感じです。。。 HDD2のデータを取り出せるのか HDD2を取り出して、単体でデータを取り出せるのかを実験してみます。 TerraMasterからHDD2を取り出して別のUSB接続の外付けドライブで接続してみます。 ディスクは認識するのですが、パーティションが認識されていません。 FirstAidを実行してみますがエラーで終わりました。 パーティションテーブルを見てみても何も表示されません。 そして、今度はHDD2をTerraMasterに戻します。そうしたら、ちゃんと認識されました。 ソフトウェアraidを組んだでも、ファイルシステム的には同じに見えるものかと思っていましたが違うようです。 上記の記載が正しいのであれば、HDD2を抜いて、別の接続方式で接続してもraid1のディスクアレイの1台として認識されそうですがされないので良くわかりません。 HDD2を抜いて別のベイに刺してみる TerraMaster上でのベイの入れ替えを行ったら正しく動くか検証してみます。 もともとオンラインだったHDD2をbay-2からbay-1に移動してみました。そうしたら、ちゃんと認識されました。ディスクラベルも同一です。 TerraMaster外のディスクをraid1に追加できるか? そもそもソフトウェアRaidなのでTerraMasterで接続していないディスクでRaidも組めるはずなので別の方法で接続したディスクを使ってみます。 以下のように追加するウィザードは出てきました。 次の処理へ進むと、先ほどと同じ用に処理がスタックします。 この状態だと、Raid1を組んでもそのRaidのアレイにディスクを追加できないというソフトウェアRaidとして機能しない状態になります。 どうやら、MacOSのソフトウェアRaidがまともに使えない感じです。 Web上には同様のトラブルのドキュメントが見当たらないです。ユースケースとしてもmacOSでRaid1を組んでディスクアレイをぶっ壊す系の話なのであんまり無さそうです。 まとめ macOSのソフトウェアRaidは使え無さそう TerraMasterの接続が非常に遅くて使えない。 --- ### Keychron K8 Proの初期化方法(factory reset) - Published: 2024-04-08 - Modified: 2024-04-17 - URL: https://blog.teraren.com/2024/04/08/post-15875/ - カテゴリー: Diary, Gadget - タグ: Keychron, keychron k8 pro オフィシャルサイトやマニュアルでは、以下のような記述があります  Factory Reset: Press fn + J + Z for 4 seconds until all the backlight flashes. 日本語訳: "fn + J + Z" をすべてのバックライトが点滅するまで4秒間押し続けます。 https://www. keychron. com/blogs/archived/k8-pro-factory-reset-and-firmware-flash しかしながら、上記では無反応でした。 色々試した結果、こちらに書いてある方法が正しそうです。 https://github. com/Keychron/qmk_firmware/tree/bluetooth_playground/keyboards/keychron/k8_pro Reset Key: Connect the USB cable, toggle mode switch to "Off", hold down the Esc key or reset button underneath space bar, then toggle then switch to "Cable". 日本語訳: USBケーブルを接続し、モードスイッチを「Off」に切り替えます。スペースバーの下にあるEscキーまたはリセットボタンを押し続けた状態で、スイッチを「Cable」に切り替えてください。 これでリセットできました。 --- ### 自宅サーバー用にGMKtec Nucbox M2(Intel Core i7)を買ったのでレビュー - Published: 2024-04-02 - Modified: 2024-04-02 - URL: https://blog.teraren.com/2024/04/02/gmktec-nucbox-m2/ - カテゴリー: Linux - タグ: GMKTek, mini pc 概要 自宅サーバーでPowerEdge T320を使っているのですが、大きいし消費電力が大きいのでちょっと買い変えを検討していました。 自宅サーバでは、サービスのホスティングとストレージサーバという2つの役割があるのですが両方を満たそうとするとどうしても巨大で高価なサーバになってしまいます。 買ったもの 主なスペック CPU: Intel core i7 11390H RAM: 32GB(16GB*2) DDR4 Disk: 1TB PCIe3. 0 SSD GPU: Intel Iris Xe Graphics 1400MHz これが、今回はアマゾンのセールで53,000円ぐらいで買えました。 ベンチマーク CINEBENCHの結果。 Multi coreの場合: 5,067pts Single core: 1,439pts N100に比べるとCPUの消費電力は倍くらいです。クロック数も高いです。 温度はファンの制御が細かくちゃんと動いているので100度以内です。 ディスクの速度も十分に速いです。HeroBoxに比べると全体的に7倍くらい速いです。 Linuxをインストールしてみる Ubuntu 22 (LTS)をインストールしてみたところ、WiFiのチップセットが認識されませんでした。REALTEKの製品です。 別途ドライバをインストールしたら、ネットワーク周りを起因としてkernel周りも不安定になったのでOSを初期化せざる負えなくなりました。 まとめ HeroBoxに比べると値段は3倍以上します。 パフォーマンスはまずまず。 --- ### CHUWI HeroBox 2023 (Intel N100搭載) を買ってみたのでベンチマーク - Published: 2024-03-13 - Modified: 2024-03-13 - URL: https://blog.teraren.com/2024/03/13/chuwi-herobox-2023/ - カテゴリー: Diary - タグ: benchmark, CHUWI, HeroBox 2023 概要 買ったものはこちら。 【レビュー特典でワイヤレスマウス】win11 最新 intel N100 【DDR5 8GB+256GB SSD】 省スペース 小型 高性能 デスクトップPC CHUWI HeroBox 持ち運び ミニパソコン WiFi 6 有線LAN Win11 4K出力 ファン付き 静音 BT5. 2 ミニPC Type-C VGA端子 軽い 設定簡単価格:21,900円(税込、送料無料)(2024/3/13時点)楽天で購入 楽天のスーパーセールで購入したので安めに購入できました。 Chuwiの読み方は「ツーウェイ」が正しいようです。オフィシャルサイトに書いてありました。 「チューウィー」かと思ってました。 ハードウェア 一昔前のブロードバンドルーターや、WiFiアクセスポイントと行った感じに似てます。HDDが無いので軽いです。 WUHDが出力できます。リフレッシュレートがかなり低い感じはしますが出力できているだけすごいです。 ファンは常時稼働しています。音は聞こえてきます。CPU負荷が高くなるとファンの回転数も上がって音が大きくなります。 https://www. youtube. com/shorts/tVA4qElUNWU ベンチマーク CrystalDiskMarkではこんな感じです。速度が遅いので、128MiBで計測しています。 CINEBENCHのスコアはマルチコアで2520pts, シングルコアで885ptでした。 温度 CPU使用率が100%に張り付くことがよくあります。 ブラウザのアップデートだったり、Windows Updateだったり、アプリケーションのインストールのときにはすぐに100%になります。 CPUコア温度を測定してみると、負荷が高い状況ですと大体76度程度。最高88度まで上がってます。 ファンのスピードが負荷に即時に応じて上がるのでさほど高温にならないようにはなっています。 通常温度は45度程度です。 部屋の温度は21度です。 まとめ Raspberry Pi 4に比べると圧倒的に高性能。 WUHDに出力できるしWebブラウジングはストレスありません。 Windows Updateとかソフトウェアインストール時にCPU負荷が高くなるのでちょっとストレスを感じます。 NASサーバや、K8sのクラスタを組むのに最適かと思います。SDカードじゃなくてSATA SSDですし。 --- ### Painting Keychron keyboard frame with WR blue mica - Published: 2024-02-27 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2024/02/27/painting-keychron-keyboard-frame-with-wr-blue-mica/ - カテゴリー: Diary - タグ: Keychron, keychron k6, keychron mod, painting, spray Background I bought Keychron K6 keyboard. The appearance is just normal. 2 colors of combination keys and a red escape keycap. It's almost dark. I checked several youtube videos to check typing sound, I saw following video. https://www. youtube. com/watch? v=ueL8_nh42wU After that, I want my keyboard original and nice by painting the frame. Things to be prepared Silicon remover Primer and surfacer spray Material of the frame is metal so we need surface to put paint. WR blue mica spray This color is used Subaru's WRX! Clear coating WR blue mica contains metalic chips and the instruction says needs clear coating. It costs 4,500 JPY for initial. I think I can use these stuff for 5 times of painting keyboard frame so that cost is 1,000 JPY for each. Steps to paint Summary Remove sillicon. Primary + Surfacer spray WR blue mica x 2 Clear coat x 2 Step1 Remove silicon and paint with Primary + surfacer. Step 2 Paint color twice Step 3 Clear coat twice My Keychron K6 mod I also painted head of the bolts with black metal. Contrast of red escape key and blue is nice! Happy hacking! --- ### HyperX QuadCast VS Anker Powerconf C200のマイク性能を比較 - Published: 2024-02-23 - Modified: 2024-02-23 - URL: https://blog.teraren.com/2024/02/23/post-15780/ - カテゴリー: Diary - タグ: Anker, HyperX QuadCast, Keychron, PowerConf C200, ベンチマーク, 性能比較 背景 HyperX QuadCastをかれこれ3年ぐらい使っています。 性能に関しては全く文句はないです!ただ、デスク上の置き場を取ることが困ります。 Anker PowerConf C200はWebカメラでありつつ、マイクを内蔵しています。しかもそのマイクはノイズキャンセリング機能付きと書いてあります。 アプローチ PowerConf C200のマイク性能が高ければ、HyperXのマイクを撤去できると考えました。ということで性能比較をしてみます。 実験 書斎の狭い部屋で同じ距離に置いて実験します。 実験1 環境 ノイズを作るために電気ヒーターをON テスト Hyper-X QuadCast PowerConf C200 考察 ぜんぜん違いますね。波形を見ると一目瞭然です。 PowerConf C200の方は反響した音を拾っちゃっています。しかも、電気ファンヒーターのノイズを拾っています。 それに比べて、Hyper-Xのほうは口元にマイクがあるかのような聞こえ方です。音声が鮮明です。さすが指向性のあるマイク。そして、マイクだけで2万円するだけあります。(C200の3倍の値段) 実験2 環境 ノイズを作るために電気ファンヒーターをON Keychron K8 Proキーボードをタイピング テスト  Hyper-X QuadCast PowerConf C200 考察 両方ともタイピング音は入ります。やはりタイピング音は巨大です。HyperXの指向性を持ってしても排除できません。マイクと口との中間に位置するものなので排除が難しいのかと思います。 それに対して、Powerconfは全然ノイズ除去できていません。これはノイズ除去を売り文句にしてはいけないと思います。 結論 PowerConf C200のノイズキャンセリング能力はほとんど無く、マイクの性能もHyperXQuadCastに比べると指向性がなくていまいち。 HyperXを引き続き使います。 --- ### macOSでSDカードやUSBメモリをフォーマットする方法 - Published: 2024-02-23 - Modified: 2024-02-23 - URL: https://blog.teraren.com/2024/02/23/macos-usb-memory-format/ - カテゴリー: Diary, macos - タグ: fat, format 問題 Linux用にパーティションテーブルを変更してしまったSDカードやUSBメモリだとmacOSのディスクユーティリティを使ってもフォーマットやパーティションテーブルの書き換えが行えません。 かといって、フォーマットするためのアプリケーションを探してダウンロードするのが面倒です。 コマンド diskutilコマンドでは、デバイス丸ごと(パーティションテーブルも含めて)フォーマットできるようなのでそれを使うのが良さそうです。 FAT32でフォーマットするコマンド例は以下。 diskutil eraseDisk FAT32 namae /dev/disk7 デバイスのIDを調べるためには以下のコマンドです。 diskutil list 実行例 diskutil list Fri Feb 23 19:41:26 2024 /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *1. 0 TB disk0 1: Apple_APFS_ISC Container disk1 524. 3 MB disk0s1 2: Apple_APFS Container disk3 994. 7 GB disk0s2 3: Apple_APFS_Recovery Container disk2 5. 4 GB disk0s3 /dev/disk3 (synthesized): #: TYPE NAME SIZE IDENTIFIER 0: APFS Container Scheme - +994. 7 GB disk3 Physical Store disk0s2 1: APFS Volume Macintosh HD 10. 5 GB disk3s1 2: APFS Snapshot com. apple. os. update-... 10. 5 GB disk3s1s1 3: APFS Volume Preboot 11. 9 GB disk3s2 4: APFS Volume Recovery 1. 8 GB disk3s3 5: APFS Volume Data 557. 2 GB disk3s5 6: APFS Volume VM 8. 6 GB disk3s6 /dev/disk7 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *64. 8 GB disk7 1: EFI EFI 209. 7 MB disk7s1 2: Microsoft Basic Data NAMAE 64. 6 GB disk7s2 --- ### gatsbyセットアップメモ - Published: 2024-01-24 - Modified: 2024-01-24 - URL: https://blog.teraren.com/2024/01/24/post-15683/ - カテゴリー: Diary - タグ: Next.JS セットアップ このあたりを参考に。 https://dev. classmethod. jp/articles/gatsby-project-init/ % npm init gatsby Need to install the following packages: create-gatsby@3. 11. 0 Ok to proceed? (y) y create-gatsby version 3. 11. 0 Welcome to Gatsby! This command will generate a new Gatsby site for you in /Users/yuki. matsukura/ghq/github. com/matsubo/www. teraren. com with the setup you select. Let's answer some questions: What would you like to call your site? ✔ · Teraren Corporate Site What would you like to name the folder where your site will be created? ✔ www. teraren. com/ teraren-corporate-site ✔ Will you be using JavaScript or TypeScript? · JavaScript ✔ Will you be using a CMS? · No (or I'll add it later) ✔ Would you like to install a styling system? · Tailwind CSS ✔ Would you like to install additional features with other plugins? · Add the Google gtag script for e. g. Google Analytics · Add responsive images · Add an automatic sitemap · Generate a manifest file · Add Markdown and MDX support Thanks! Here's what we'll now do: 🛠 Create a new Gatsby site in the folder teraren-corporate-site 🎨 Get you set up to use Tailwind CSS for styling your site 🔌 Install gatsby-plugin-google-gtag, gatsby-plugin-image, gatsby-plugin-sitemap, gatsby-plugin-manifest, gatsby-plugin-mdx ✔ Shall we do this? (Y/n) · Yes ✔ Created site from template ✔ Installed Gatsby ✔ Installed plugins ✔ Created site in teraren-corporate-site 🔌 Setting-up plugins... info Adding gatsby-plugin-postcss info Adding gatsby-plugin-google-gtag info Adding gatsby-plugin-image info Adding gatsby-plugin-sitemap info Adding gatsby-plugin-manifest info Adding gatsby-plugin-mdx info Adding gatsby-plugin-sharp info Adding gatsby-transformer-sharp info Adding gatsby-source-filesystem info Adding gatsby-source-filesystem info Installed gatsby-plugin-postcss in gatsby-config success Adding gatsby-plugin-postcss to gatsby-config - 0. 215s info Installed gatsby-plugin-google-gtag in gatsby-config success Adding gatsby-plugin-google-gtag to gatsby-config - 0. 210s info Installed gatsby-plugin-image in gatsby-config success Adding gatsby-plugin-image to gatsby-config - 0. 215s info Installed gatsby-plugin-sitemap in gatsby-config success Adding gatsby-plugin-sitemap to gatsby-config - 0. 220s info Installed gatsby-plugin-manifest in gatsby-config success Adding gatsby-plugin-manifest to gatsby-config - 0. 256s info Installed gatsby-plugin-mdx in gatsby-config success Adding gatsby-plugin-mdx to gatsby-config - 0. 260s info Installed gatsby-plugin-sharp in gatsby-config success Adding gatsby-plugin-sharp to gatsby-config - 0. 262s info Installed gatsby-transformer-sharp in gatsby-config success Adding gatsby-transformer-sharp to gatsby-config - 0. 266s info Installed gatsby-source-filesystem in gatsby-config success Adding gatsby-source-filesystem (images) to gatsby-config - 0. 278s info Installed gatsby-source-filesystem in gatsby-config success Adding gatsby-source-filesystem (pages) to gatsby-config - 0. 281s 🎨 Adding necessary styling files... 🎉 Your new Gatsby site Teraren Corporate Site has been successfully created at /Users/yuki. matsukura/ghq/github. com/matsubo/www. teraren. com/teraren-corporate-site. Start by going to the directory with cd teraren-corporate-site Start the local development server with npm run develop See all commands at https://www. gatsbyjs. com/docs/reference/gatsby-cli/ npm run develop 2666ms  Tue Jul 25 09:59:48 2023 > teraren-corporate-site@1. 0. 0 develop > gatsby develop success compile gatsby files - 0. 270s success load gatsby config - 0. 022s success load plugins - 0. 511s success onPreInit - 0. 008s success initialize cache - 0. 076s success copy gatsby files - 0. 413s success Compiling Gatsby Functions - 0. 856s success onPreBootstrap - 0. 901s success createSchemaCustomization - 0. 012s success Checking for changed pages - 0. 001s success source and transform nodes - 0. 091s success building schema - 0. 107s success createPages - 0. 006s success createPagesStatefully - 0. 073s info Total nodes: 47, SitePage nodes: 4 (use --verbose for breakdown) success Checking for changed pages - 0. 000s success write out redirect data - 0. 006s success Build manifest and related icons - 0. 097s success onPostBootstrap - 0. 100s info bootstrap finished - 4. 405s success onPreExtractQueries - 0. 001s success extract queries from components - 0. 806s success write out requires - 0. 006s ⠀ You can now view teraren-corporate-site in the browser. ⠀ http://localhost:8000/ ⠀ View GraphiQL, an in-browser IDE, to explore your site's data and schema ⠀ http://localhost:8000/___graphql ⠀ Note that the development build is not optimized. To create a production build, use gatsby build ⠀ success Building development bundle - 8. 742s success Writing page-data. json and slice-data. json files to public directory - 0. 047s - 3/4 85. 29/s いろいろやった結果 gatsbyのコミュニティが急速に衰退しているので微妙っす。デザインテンプレも良い感じのが出ない。 Next. JSを使ったほうが良さげ。 --- ### MySQL Workbenchの後継であるMySQL Shell for VS Codeを使ってみる - Published: 2023-08-29 - Modified: 2023-08-29 - URL: https://blog.teraren.com/2023/08/29/post-15714/ - カテゴリー: Diary, MySQL - タグ: MySQL, MySQL Shell for VS Code, mysql workbnehch 概要 MySQL Workbenchのサーバーをモニタリングする機能がVS Codeのプラグインとしてリリースされているようなので軽く動作を見てみます。 設定 ssh tunnelの設定は相変わらずうまく接続できなかった(MySQL Workbenchのときも苦労しました)ので生のmysqlプロトコルで接続します。 グラフィカルに見栄えのするところは、左のメニューから「Performance Dashboard」を選んで、上部のメニューから「Performance Dashboard」を選択すると以下のようなグラフが表示されます。 Jupiter Notebookのようなな機能もあります。クエリーを実行して、その結果を動的にゴニョゴニョして行きます。トラブルシューティングのときに便利です。 普通にテーブルの中身を見たりもできます。 まとめ Notebookは便利です。後々レポートを書くときなどに使いやすそう。 全体的に動作が不安定でした。。。 --- ### UbuntuでMySQLを8.0.34から8.1.0へアップグレード。Innovation Releaseを使う設定。 - Published: 2023-08-29 - Modified: 2023-08-29 - URL: https://blog.teraren.com/2023/08/29/ubuntu-mysql-8-1/ - カテゴリー: MySQL - タグ: Innovation Release, LTS, MySQL, MySQL 8.1 背景 MySQL Innovation Day Tokyo 2023に行ってきました。(オフィスから徒歩8分なので楽!) 2023年7月18日 (今から約1ヶ月前)にMySQL初のInnovation Releaseが行われました。バージョンは8. 1. 0です。 最近のアップデート あんまりMySQLの最新情報をキャッチアップしていなかったので軽くまとめます。 リリースサイクルの変更 2023年7月19日の記事にあるようにMySQLのリリースサイクルが変更になりました。 https://blogs. oracle. com/mysql-jp/post/introducing-mysql-innovation-and-longterm-support-lts-versions-jp 今後のリリースはLTSとInnovation Releaseの2つになります。Ubuntuと同じようなリリース体系を取ることとなります。バージョン表記は今までと変わらずセマンティックバージョニングでの表記になります。 Innovation Releaseは1月ごとにマイナーバージョンが1つ上がります。LTSは2年に1回マイナーバージョンが上がります。よって、2年に1回はInnovation ReleseとLTSのバージョンが合致します。 そして、LTSの方のバージョンはマイナーバージョン12個ずつ上がっていきます。Innovation Releaseのマイナーバージョンに関しては12で繰り上がり、メジャーバージョンが1つ上がるみたいです。(最初の方はイレギュラーにインクリメントされそうです) よって、LTSのバージョンは8. 4. 0, 9. 7. 0, 10. 7. 0... . という具合に上がっていきます。(非常に分かりづらい。 LTSに対してパッチが当たるとリビジョンがインクリメントされます。 https://blogs. oracle. com/mysql-jp/post/introducing-mysql-innovation-and-longterm-support-lts-versions-jp MySQL8のバージョン樹形図 @yoku0825さんのスライドにあるこの樹形図は参考になります。 https://speakerdeck. com/yoku0825/bokutatihamysql-8-dot-1todousheng-kiruka? slide=25 mysqlshのバージョン mysqlshにはmysql serverのバージョンとは関係なく新機能をどんどん取り入れていくようです。言い換えると、Innovation Releaseと同じスパンで更新されていくような事を言ってました。 LTS or Innovation Release ということで、業務や個人開発においてLTSか、Innovation Releaseのどちらを使うかが迷います。 個人的には、数ヶ月に1回ぐらい追加機能が入るような感じが良かったので3ヶ月1回にリリースされるInnovation Releaseのストリームをトラッキングすることとします。LTSは2年スパンです。 特に、MySQLは8. 0になってからクリティカルなバグがリリースされる事件が数回起こっています。(過去、このバグを踏んで痛い目を見ました) 業務はLTS、個人開発はInnovation Releaseで良いのかなと思ってます。OSのディストリビューションをLTSにするかしないかという意思決定と揃えるとポリシーが揃ってわかりやすいと思います。 UbuntuのLTSのリリースも2年スパンなのでMySQLと同様です。Ubuntuは1年毎にメジャーバージョンが上がるので、偶数はLTSを意味することになります。 Innovation Releaseも日々使っておいてキャッチアップすることも重要なので個人サービスや自宅サーバはInnovation Releaseを使っていきます。OSもUbuntu Serverの最新を使うようにしているのでポリシー的にも合致します。 MySQL 8. 1へのアップグレード事前チェック まずは、現在のMySQL Serverのバージョンを調べてみます。 root@localhost:test> select @@version; +-------------------------+ | @@version | +-------------------------+ | 8. 0. 34-0ubuntu0. 22. 04. 1 | +-------------------------+ 1 row in set (0. 00 sec) MySQL Serverのapt lineはdebパッケージよって提供されています。このパッケージを入れることで自分が使いたいMySQLのメインストリームとなるLTSまたはInnovation Releaseのapt lineが追加されます。 % wget https://dev. mysql. com/get/mysql-apt-config_0. 8. 26-1_all. deb % sudo dpkg -i mysql-apt-config_0. 8. 26-1_all. deb インストール中に以下のようなダイアログが立ち上がり、どのプロダクトを使いたいかを選択します。デフォルトではLTSになっています。 なので、mysql-innovationを選びます。 画面を戻ったら、更新されています。OKを押して完了します。 まずは、最近(と言っても数年前から)のトレンドであるmysqlshをインストールします。mysqlクライアントの高機能版です。JavaScriptのsyntaxでコマンドを発行できるし、管理機能が充実しています。 matsu@dell ~> sudo apt-get update matsu@dell ~> sudo apt-get install mysql-shell Reading package lists... Done Building dependency tree... Done Reading state information... Done The following NEW packages will be installed: mysql-shell 0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. Need to get 26. 5 MB of archives. After this operation, 226 MB of additional disk space will be used. Get:1 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-shell amd64 8. 1. 1-1ubuntu22. 04 Fetched 26. 5 MB in 5s (5739 kB/s) selecting previously unselected package mysql-shell:amd64. Reading database ... 158313 files and directories currently installed. ) Preparing to unpack ... /mysql-shell_8. 1. 1-1ubuntu22. 04_amd64. deb ... Unpacking mysql-shell:amd64 (8. 1. 1-1ubuntu22. 04) ... Setting up mysql-shell:amd64 (8. 1. 1-1ubuntu22. 04) ... Processing triggers for man-db (2. 10. 2-1) ... Processing triggers for libc-bin (2. 35-0ubuntu3. 1) ... matsu@dell ~> とりあえず、バックアップをします。mysqlshを立ち上げて、以下のコマンドでdumpを行います。今までのmysqldumpに比べると超速いです。 util. dumpInstance("/home/matsu/20230828") 実行結果 matsu@dell ~> mysqlsh --user=root -p Cannot set LC_ALL to locale en_US. UTF-8: No such file or directory MySQL Shell 8. 1. 1 Copyright (c) 2016, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type '\help' or '\? ' for help; '\quit' to exit. Creating a session to 'root@localhost' Fetching schema names for auto-completion... Press ^C to stop. Your MySQL connection id is 29696 (X protocol) Server version: 8. 0. 34-0ubuntu0. 22. 04. 1 (Ubuntu) No default schema selected; type \use to set one. MySQL localhost:33060+ ssl JS > util. dumpInstance("/home/matsu/20230828") Acquiring global read lock Global read lock acquired Initializing - done 2 out of 6 schemas will be dumped and within them 54 tables, 0 views. 3 out of 6 users will be dumped. Gathering information - done All transactions have been started Locking instance for backup Global read lock has been released Writing global DDL files Writing users DDL Running data dump using 4 threads. NOTE: Progress information uses estimated values and may not be accurate. NOTE: Table statistics not available for `matsu_blog_covid19`. `wp_cocoon_affiliate_tags`, chunking operation may be not optimal. Please consider running 'ANALYZE TABLE `matsu_blog_covid19`. `wp_cocoon_affiliate_tags`;' f irst. NOTE: Table statistics not available for `matsu_blog_covid19`. `wp_cocoon_function_texts`, chunking operation may be not optimal. Please consider running 'ANALYZE TABLE `matsu_blog_covid19`. `wp_cocoon_function_texts`;' f irst. NOTE: Table statistics not available for `matsu_blog_covid19`. `wp_users`, chunking operation may be not optimal. Please consider running 'ANALYZE TABLE `matsu_blog_covid19`. `wp_users`;' first. Writing schema metadata - done Writing DDL - done Writing table metadata - done Starting data dump Dump duration: 00:00:12s Total duration: 00:00:12s Schemas dumped: 2 Tables dumped: 54 Uncompressed data size: 1. 59 GB Compressed data size: 559. 63 MB Compression ratio: 2. 8 Rows written: 4009346 Bytes written: 559. 63 MB Average uncompressed throughput: 129. 15 MB/s Average compressed throughput: 45. 34 MB/s MySQL localhost:33060+ ssl JS > 圧縮後500MBのデータが12秒でdumpできました。 matsu@dell ~> du -hs 20230828/ 535M 20230828/ 次に、MySQL 8. 1をインストールします。本当はここでアップグレードの互換性チェックを行うべきです。この記事の下の方に記載してあります。まずは、apt-cache policy mysql-serverコマンドで、どのパッケージが使われるかをチェックしてみます。 Ubuntuの8. 0がインストール済みですが、8. 1が入る事がわかります。 matsu@dell ~> apt-cache policy mysql-server mysql-server: Installed: 8. 0. 34-0ubuntu0. 22. 04. 1 Candidate: 8. 1. 0-1ubuntu22. 04 Version table: 8. 1. 0-1ubuntu22. 04 500 500 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 Packages *** 8. 0. 34-0ubuntu0. 22. 04. 1 500 500 http://ftp. tsukuba. wide. ad. jp/Linux/ubuntu jammy-updates/main amd64 Packages 500 http://ftp. tsukuba. wide. ad. jp/Linux/ubuntu jammy-security/main amd64 Packages 100 /var/lib/dpkg/status 8. 0. 28-0ubuntu4 500 500 http://ftp. tsukuba. wide. ad. jp/Linux/ubuntu jammy/main amd64 Packages matsu@dell ~> ということで、インストール(アップグレード)します。 sudo apt install mysql-client mysql-server matsu@dell ~> sudo apt install mysql-client mysql-server Reading package lists... Done Building dependency tree... Done Reading state information... Done The following packages were automatically installed and are no longer required: libcgi-fast-perl libcgi-pm-perl libclone-perl libencode-locale-perl libevent-pthreads-2. 1-7 libfcgi-bin libfcgi-perl libfcgi0ldbl libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl liblwp-mediatypes-perl libprotobuf-lite23 libtimedate-perl liburi-perl Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: mysql-common mysql-community-client mysql-community-client-core mysql-community-client-plugins mysql-community-server mysql-community-server-core The following packages will be REMOVED: mysql-client-8. 0 mysql-client-core-8. 0 mysql-server-8. 0 mysql-server-core-8. 0 The following NEW packages will be installed: mysql-client mysql-community-client mysql-community-client-core mysql-community-client-plugins mysql-community-server mysql-community-server-core The following packages will be upgraded: mysql-common mysql-server 2 upgraded, 6 newly installed, 4 to remove and 0 not upgraded. Need to get 31. 0 MB of archives. After this operation, 33. 0 MB of additional disk space will be used. Do you want to continue? Get:1 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-server amd64 8. 1. 0-1ubuntu22. 04 Get:2 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-common amd64 8. 1. 0-1ubuntu22. 04 Get:3 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-community-client-plugins amd64 8. 1. 0-1ubuntu22. 04 Get:4 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-community-client-core amd64 8. 1. 0-1ubuntu22. 04 Get:5 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-community-client amd64 8. 1. 0-1ubuntu22. 04 Get:6 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-client amd64 8. 1. 0-1ubuntu22. 04 Get:7 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-community-server-core amd64 8. 1. 0-1ubuntu22. 04 Get:8 http://repo. mysql. com/apt/ubuntu jammy/mysql-innovation amd64 mysql-community-server amd64 8. 1. 0-1ubuntu22. 04 Fetched 31. 0 MB in 7s (4296 kB/s) Preconfiguring packages ... (Reading database ... 169877 files and directories currently installed. ) Preparing to unpack ... /mysql-server_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-server (8. 1. 0-1ubuntu22. 04) over (8. 0. 34-0ubuntu0. 22. 04. 1) ... (Reading database ... 169880 files and directories currently installed. ) Removing mysql-server-8. 0 (8. 0. 34-0ubuntu0. 22. 04. 1) ... update-alternatives: using /etc/mysql/my. cnf. fallback to provide /etc/mysql/my. cnf (my. cnf) in auto mode Removing mysql-client-8. 0 (8. 0. 34-0ubuntu0. 22. 04. 1) ... Removing mysql-client-core-8. 0 (8. 0. 34-0ubuntu0. 22. 04. 1) ... Removing mysql-server-core-8. 0 (8. 0. 34-0ubuntu0. 22. 04. 1) ... (Reading database ... 169679 files and directories currently installed. ) Preparing to unpack ... /0-mysql-common_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-common (8. 1. 0-1ubuntu22. 04) over (5. 8+1. 0. 8) ... Selecting previously unselected package mysql-community-client-plugins. Preparing to unpack ... /1-mysql-community-client-plugins_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-community-client-plugins (8. 1. 0-1ubuntu22. 04) ... Selecting previously unselected package mysql-community-client-core. Preparing to unpack ... /2-mysql-community-client-core_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-community-client-core (8. 1. 0-1ubuntu22. 04) ... Selecting previously unselected package mysql-community-client. Preparing to unpack ... /3-mysql-community-client_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-community-client (8. 1. 0-1ubuntu22. 04) ... Selecting previously unselected package mysql-client. Preparing to unpack ... /4-mysql-client_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-client (8. 1. 0-1ubuntu22. 04) ... Selecting previously unselected package mysql-community-server-core. Preparing to unpack ... /5-mysql-community-server-core_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-community-server-core (8. 1. 0-1ubuntu22. 04) ... Selecting previously unselected package mysql-community-server. Preparing to unpack ... /6-mysql-community-server_8. 1. 0-1ubuntu22. 04_amd64. deb ... Unpacking mysql-community-server (8. 1. 0-1ubuntu22. 04) ... Setting up mysql-common (8. 1. 0-1ubuntu22. 04) ... Installing new version of config file /etc/mysql/conf. d/mysql. cnf ... Installing new version of config file /etc/mysql/my. cnf. fallback ... Setting up mysql-community-server-core (8. 1. 0-1ubuntu22. 04) ... Setting up mysql-community-client-plugins (8. 1. 0-1ubuntu22. 04) ... Setting up mysql-community-client-core (8. 1. 0-1ubuntu22. 04) ... Setting up mysql-community-client (8. 1. 0-1ubuntu22. 04) ... Setting up mysql-client (8. 1. 0-1ubuntu22. 04) ... Setting up mysql-community-server (8. 1. 0-1ubuntu22. 04) ... Installing new version of config file /etc/apparmor. d/usr. sbin. mysqld ... Installing new version of config file /etc/mysql/mysql. cnf ... Installing new version of config file /etc/mysql/mysql. conf. d/mysqld. cnf ... update-alternatives: using /etc/mysql/mysql. cnf to provide /etc/mysql/my. cnf (my. cnf) in auto mode Setting up mysql-server (8. 1. 0-1ubuntu22. 04) ... Processing triggers for man-db (2. 10. 2-1) ... Processing triggers for libc-bin (2. 35-0ubuntu3. 1) ... Scanning processes... Scanning candidates... Scanning processor microcode... Scanning linux images... The processor microcode seems to be up-to-date. Restarting services... Service restarts being deferred: systemctl restart NetworkManager. service systemctl restart networkd-dispatcher. service systemctl restart unattended-upgrades. service systemctl restart wpa_supplicant. service No containers need to be restarted. No user sessions are running outdated binaries. No VM guests are running outdated hypervisor (qemu) binaries on this host. matsu@dell ~> インストール中に、以下のダイアログが表示されました。稼働中のサービスから接続できなくなるリスクを排除するために、互換性を優先して下を選びました。 チェック ちゃんとインストールが完了したかをチェックします。 まずは、パッケージが入っているかをチェックしてみます。 dpkg -l|grep mysql matsu@dell ~> dpkg -l|grep mysql ii mysql-apt-config 0. 8. 26-1 all Auto configuration for MySQL APT Repo. ii mysql-client 8. 1. 0-1ubuntu22. 04 amd64 MySQL Client meta package depending on latest version ii mysql-common 8. 1. 0-1ubuntu22. 04 amd64 Common files shared between packages ii mysql-community-client 8. 1. 0-1ubuntu22. 04 amd64 MySQL Client ii mysql-community-client-core 8. 1. 0-1ubuntu22. 04 amd64 MySQL Client Core Binaries ii mysql-community-client-plugins 8. 1. 0-1ubuntu22. 04 amd64 MySQL Client plugin ii mysql-community-server 8. 1. 0-1ubuntu22. 04 amd64 MySQL Server ii mysql-community-server-core 8. 1. 0-1ubuntu22. 04 amd64 MySQL Server Core Binaires ii mysql-server 8. 1. 0-1ubuntu22. 04 amd64 MySQL Server meta package depending on latest version rc mysql-server-8. 0 8. 0. 34-0ubuntu0. 22. 04. 1 amd64 MySQL database server binaries and system database setup ii mysql-shell:amd64 8. 1. 1-1ubuntu22. 04 amd64 MySQL Shell (part of MySQL Server) 8. 0 rc php8. 0-mysql 8. 0. 8-1ubuntu0. 3 amd64 MySQL module for PHP rc php8. 1-mysql 8. 1. 2-1ubuntu2. 11 amd64 MySQL module for PHP ii php8. 2-mysql 8. 2. 9-1+ubuntu22. 04. 1+deb. sury. org+1 amd64 MySQL module for PHP ちゃんとmysql-server 8. 1がインストールされていそうです。 動いているサーバがMySQL 8. 1かをチェック 早速mysqlshを使って検証してみます。 \sql SELECT @@version; 番外編: データのアップグレードができるかチェック 本当はアップグレード前にやるべきでしたが、mysql-serverのバージョンアップに当たって問題がないかをチェックするコマンドの紹介です。 util. checkForServerUpgrade; 番外編: mysqlsh mysqlshの使い方は\helpと入力するととても長い説明が表示されますが、一通り読んでおくのが良いと思います。いろいろできるので。 backup & recoveryに関しては以下の記事が詳しいです。 https://qiita. com/orakurara/items/9a1b992909794d993761 まとめ 数年ぶりにMySQLをキャッチアップ。。。。 MySQL Heatwaveはすごそう。場合によってはSnowflakeより速いらしい。アーキテクチャはAuroraって感じ。Snowflakeも似たようなものだだし最近のRDBの水平分割の流行りの形ぽい。 MySQL Clusterの構築、運用が格段に楽になっているっぽい。Oracleに買収されて、Oracleの得意としている堅牢性を注入した感じがします。 --- ### Ubuntu live patchを導入してみた - Published: 2023-06-21 - Modified: 2023-06-21 - URL: https://blog.teraren.com/2023/06/21/ubuntu-live-patch/ - カテゴリー: Linux - タグ: live patch, Ubuntu Livepatchとは Livepatchはその名の通り、Ubuntu(Linux系のos)でapt-get upgradeされた時に、kernelパッチを更新するためにーサーバーを再起動せずに適用できます。 Ubuntu Pro向けなのですが、3ホストまでは無料で利用できるので個人利用をする程度ならちょうど良いです。 live patchの仕組みはこちらのページの図がわかりやすいです。 起動中のkernelにパッチを適用するとなると、実行中のメモリの内容を変更することになってしまうけど、どうやっているのか不思議に思っていました。 上記のように、新たなコードを別のメモリに確保した上で、実行コードをすげ替えてしまうというやり方であれば納得です。 デメリットとしては抽象化のオーバーヘッドが増えるのと、パッチを適用していくとメモリのフラグメンテーションや無駄なメモリアロケーションが増える可能性がありそうです。 また、Livepatch自体も万能ではなくてこの用に抽象化された部分の変更でなければkernelの再実行=OSの再機動が必要になります。詳細 アカウント登録 利用する際に使うtokenはWebサイト上で発行されるのでアカウント登録をしてトークンを取得します。 ユーザ登録後、このページを開くとトークンが表示されます。 設定 Ubuntu 22. 04で実行しています。 基本的に、上記のサイトで表示されているコマンドを1発実行すれば完了します。 matsu@dell ~/> sudo pro attach password for matsu: Enabling default service esm-apps Updating package lists Ubuntu Pro: ESM Apps enabled Enabling default service esm-infra Updating package lists Ubuntu Pro: ESM Infra enabled Enabling default service livepatch Installing snapd Updating package lists Installing canonical-livepatch snap Canonical livepatch enabled. Unable to determine current instance-id This machine is now attached to 'Ubuntu Pro - free personal subscription' SERVICE ENTITLED STATUS DESCRIPTION esm-apps yes enabled Expanded Security Maintenance for Applications esm-infra yes enabled Expanded Security Maintenance for Infrastructure livepatch yes enabled Canonical Livepatch service realtime-kernel yes disabled Ubuntu kernel with PREEMPT_RT patches integrated NOTICES Operation in progress: pro attach Enable services with: pro enable Account: matsubokkuri@example. com Subscription: Ubuntu Pro - free personal subscription live patchのステータス表示 matsu@dell ~/> sudo ua status password for matsu: SERVICE ENTITLED STATUS DESCRIPTION esm-apps yes enabled Expanded Security Maintenance for Applications esm-infra yes enabled Expanded Security Maintenance for Infrastructure livepatch yes enabled Canonical Livepatch service realtime-kernel yes disabled Ubuntu kernel with PREEMPT_RT patches integrated usg yes disabled Security compliance and audit tools Enable services with: pro enable Account: matsubokkuri@example. com Subscription: Ubuntu Pro - free personal subscription livepatchがenabledになっているので設定は完了しているようです。 セキュリティのステータス表示 matsu@dell ~> sudo ua security-status 997 packages installed: 853 packages from Ubuntu Main/Restricted repository 101 packages from Ubuntu Universe/Multiverse repository 25 packages from third parties 18 packages no longer available for download To get more information about the packages, run pro security-status --help for a list of available options. This machine is attached to an Ubuntu Pro subscription. Main/Restricted packages are receiving security updates from Ubuntu Pro with 'esm-infra' enabled until 2032. Universe/Multiverse packages are receiving security updates from Ubuntu Pro with 'esm-apps' enabled until 2032. You have received 13 security updates. 考察 この設定が影響しているかどうかわからないのですが、Dockerが調子悪くなりました。。。docker killでコンテナを停止できなくなってしまったりしました。 スタートはできるからまぁ、ギリギリサービスは動くのですが。。。困りものです。 まとめ kernel関連のzero day attackに対して安全に運用できるようになりました。 仮想環境でサービスを運用しているホストに導入すると再機動の回数を減らせて良いです。 --- ### 知的労働者のための究極のホームオフィス環境ガイド - Published: 2023-05-29 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2023/05/29/desktop/ - カテゴリー: Diary - タグ: Embody Chair, ウォールナット, スタンディングデスク, デスクツアー, デスクトップ, ライフハック, 書斎, 無垢材 概要 知的労働者にとって作業環境は重要です。 良い機材にはお金をかけても効率が上がればすぐに回収できます。早く買えば、利用した日数で金額を割ると日割り金額が低く済みます。 ということで、私がトライアンドエラーしてたどり着いたデスク環境を紹介するので参考にしていただければと思います。 身体に触れる部分である、デスク、チェアー、モニタ(視覚的に)には良いものを使いたいという思いが強いです。 ユースケース定義 デスクで何をするかを考えます。 仕事: プログラミング、設計図書く、文書を書く、音楽を聞く、テレカンをする、写真のレタッチ。 趣味: 電子工作 要求定義 上記のユースケースを実現するための要求は以下になります。 電動の昇降機能付きデスク 音質が良いスピーカー ノイズが少なくて指向性のあるマイク 良い感じのWebカメラ 長時間座っても疲れにくい椅子 長時間使っても疲れないモニター。解像度が高いも煮た。モニタに光が反射しない環境。 環境の説明 上記の要求を満たすための私なりの解である環境を紹介します。物理的に大きい順で紹介します。 モニタ 使っているのはこちらです。 Dell Uシリーズ U4021QW 39. 7インチワイドモニタ- 過去15年ぐらいはEIZOのモニタを使い続けていたのですが乗り換えました。乗り換える決断をした理由は2点あります。 1.高額: カタログスペックでは表せない性能があるので高額なのは良いのですが、高額過ぎます。カタログスペックで等々の品と比べると2倍位する印象です。 2. カタログスペック性能が低い: 他社のモニタの大きさや解像度の高さに追随するようなメインのスペックから見ると液晶パネルの性能が低くて見劣りしてました。 使用した結果、満足度は高いです。コントラストは高く、チラツキが無く、ドット欠けは無し、EIZOから乗り換えても特に違和感はありませんでした。湾曲に関しても最初はちょっと違和感がありましたが、すぐに慣れました。逆にこのぐらい大きいと湾曲していないと端が見えないと思います。 購入したのが2021年4月なので2年前です。2023年5月の現在は49インチのU4919DWのほうも検討に上がります。解像度は私が買った40インチと同じなのでDPIが低いです。視力が低めであればこちらのほうが良いかもです。 以前、EIZOのモニタを2週間レンタルできる機会があったから、借りてみました。そして、会社から貸与されていたIIYAMAのモニタ(安いやつ)とEIZOのモニタを比較したら目の疲労具合が全然違いました。 このクラスのDELLのモニタも長時間使っても目の疲れはあんまりありません。 デスク FlexispotのE7Bに朝日ウッドテックのブラックウォルナット天板の組み合わせです。 フレーム まず、スタンディングデスクを選ぶ理由は以下の記事を読んでいただければと思います。 https://gigazine. net/news/20141225-sitting-problem/ https://sukimaput. com/bauhutte-standingdesk/ まず、デスクについてですが、絶対電動が良いです。手動のハンドルだと上下するのにめちゃくちゃ時間がかかるのでほとんど動かさなくなります。それも、座った状態に固定されます。買った当初は頑張って立つようにしてますが、しばらくすると1日じゅう立ちっぱなしはそれはそれで疲れるので座った状態にして、ずっとそのままになります。 昇降範囲は58-123cmですが、特に下限や上限に不満はありませんでした。もっと高額なフレームは少広範囲が広かったのでちょっと迷ったのですがこの商品で問題ありませんでした。身長は178cmです。 天板 朝日ウッドテックのブラックウォルナットです。集成材の天板だけで10万円(送料・税込)しました。別のリフォームの流れで発注してしまったのですが、今となってはオンラインで注文したほうが良かったなと若干後悔しております。 朝日ウッドテックは一流メーカーですので失敗は無いです。保証もしっかりしています。当時、カウンター板のトラブル事例を見ていると不安になったという点も多少あります。(しかし、使っていれば傷や凹みは付くのであんまり気にしなくてよかったです) とにかく、肌に触れるところには質感は重視したほうが良いです。プラスチックとか樹脂のデスクですと反発が強すぎて腕を置いていると赤くなったりマウスタコができたりします。木材であればそのようなことは無くなりました。 オンラインですと6万円ほどで買えます。 無垢材の1枚板を検討しましたが重量が重くなるのと、使用環境によっては反りや割れが発生するらしくてメンテナンスが難しそうなのでやめました。かっこいいんですけど、作業用デスクには見た目的にもちょっとやりすぎ感もあるかなと思いました。中古の1枚ものはヤフオクで結構安く売られています。 チェア 社会人3年目にハーマンミラーのEmbody chair購入してそれからずっと職場で使っています。職場が変われば、Embody Chairを自費で赤帽を使って輸送して使っています。 当時は肩こりが酷くてそれを緩和させたくて買いました。フィッティングの柔軟性が非常に高く、疲れた体の部位に負荷をかけないように微調整できるのが良いです。疲れたときにはそのままリクライニングにして寝っ転がる感じにもなれます。 チェアを買うときに、アーロンチェアかEmbody Chairにするか迷いましたが、Embody Chairのほうが上位っぽかったので決めました。 今となっては新品が25万円ぐらいしますが17年前は20万円弱でした。現地では10万円ちょっとで売られていたのでアメリカから新品を個人輸入してトータル15万円ぐらいで手に入れました。 メイン照明 作業環境の観点と、テレカンの写りの観点で照明はとても重要です。このために部屋をリフォームかけました。 照明の重要さについて書かれている記事を載せておきます。 https://www. akiyan. com/blog/archives/2007/01/post_75. html https://diary. teraren. com/2013/12/15/lighting/ https://logmi. jp/business/articles/191355 まず、液晶モニタに反射を作る原因は強い光源なので外光をあまり取り入れないようにして昼でも夜でも安定した照明環境を作ることを基本としました。 その上で、昼は白色、夜は暖色にできるようにしたかったのでちょうどPanasonicから調色のLED電気が発売されたので導入しました。 テレカン時に顔への照明をまんべんなく当てるために間接照明にするのが良いです。以前、テレカンのときだけ顔用に照明を使ったりしていましたが、面倒だし眩しいのですぐに使わなくなりました。 間接照明にするために、シーリングライトのコネクタを撤去してリフォーム業者に依頼してコープ照明にリフォームしました。 利用したのはARCHITECTURAL LIGHT L=1200 (YYY21260LB1)です。4つ設置しました。 調色を重視しているのであんまり発色は綺麗では無いのが残念です。設置直後はまんべんなく綺麗に発色していた気はしますが、最近はなんかほんの少し緑っぽさが出てきた気がしてます。 背景(バックスクリーン) Webカメラ(普通の安いカメラも)の特性で、明るさ(露出)は写っている全体の光量を元に明るさを決めています。一般的には壁紙は白いので、白い壁紙の前で顔を写すと顔が相対的に暗くなります。それを防ぐためには背景を顔より暗い明度にするのが良いです。 極端に言えば、黒い壁紙にすれば自分の顔がすごい白く写ります。 そこで、ダークグレーのロールスクリーンを設置して背景を作りました。幅をぴったりに作りたかったのでオーダーで注文しました。 TOSOのプレートというシリーズです。4万円ぐらいしました。 同じ照明の下で、背景の違いによる顔の印象を検証するためにiPhone 13 Proでサンプルを撮影してみました。無補正です。右の方が顔に影ができてしまっているし全体的に暗い印象になってしまっていますが、左側は白く明るい印象に写っています。(iPhone 13だと頭が良すぎてフォーカスが当たっているところの露出を基準にしちゃっているのであまり顕著には差が出ませんが)明度の低い背景明度の高い背景スポット照明 資材が余ったのでデスクの上にダクトレールを設置して、暖色のLEDスポットライトを付けてみました。間接照明だけだと暗すぎるかと思ったので保険としてです。ですが、まったく使っておりません。 スピーカー 3回スピーカーを買い替えた結果、GENELECの8020シリーズを使っています。めちゃくちゃ満足度は高いです。もう、これは騙されたと思って買ってみてほしいです。 スピーカーは部屋の大きさや、スピーカーまでの距離、スタンドの材質などによって変わるので環境の制約に合ったものを選ぶ必要があったのでここに行き着くまでが大変でした。 大きくて高いものを買えば安心というモノではないです。 スピーカーが良ければテレカンにおいて、聞こえづらい部分とかも少しは明瞭になりますし、相手の声も聞き取りやすくなります。 詳細はこちらの記事にまとめてあります。 マイク HyperX QuadCastです。YouTuberがおすすめしていたので買いました。 以前は、中華メーカーのUSBのコンデンサマイクを使っていたのですがノイズが酷かったです。マイクなんてどこも大して変わらないだろうと思っていましたが、ちゃんとしたメーカーのマイクを使う必要があると感じました。 スピーカーの音を拾わないようにするためにマイクは指向性があるものが良いです。あと、結果的に良かったのは普通のハンドマイクを使うより、直立していたほうがスペースを取らなくて良いです。どうしてもマイクは顔の近くに置く必要があるため邪魔にならない形状である必要があります。 物理的にmute/unmuteができるものだと楽です。ソフトウェア上でmute/unmuteをするとなると直感的ではないしすぐに操作したいときに困ります。 キーボード 定番のHHKB Proです。HHKB Professional HYBRID Type-S 無刻印/墨(英語配列) 自作キーボードの道もありますが、カフェでノートPCを使って作業するときもあるので標準からずれないほうが良いという考えがあります。 PFU Happy Hacking Keyboard Professional BT 無刻印/墨 PD-KB600BNを最初は買ったのですが、2週間ぐらいで買い替えました。たしか、PCを2台使っていて、Bluetoothによる接続切り替えができなかったためです。 マウス トラックボールを試しに使ってます。まぁ、普通のマウスでもどっちでも大丈夫です。唯一の欠点は曲線が書きづらいのと、トラックボールを定期的に掃除しないと動きが悪くなるということです。 ケーブル収納 サンワサプライのケーブル収納するやつ。めちゃくちゃキレイに収納できるのでおすすめです。 この収納トレーは、ERDシリーズ専用になっていてナットで天板に裏からビス止めできます。そのため、クランプ型だとどうしてもデスクに引っ掛ける部分が必要になりますが、こちらはデスク上には一切干渉しないです。その代わり、天板に穴あけ加工が必要になります。 ネジの規格はM5 x 12mmになるので、穴側は、鬼目ナット側 M5x10mm、下穴は7. 5mmのビットで穴あけをしました。天板を外して作業したので2時間ぐらいかかりました。初期設置時にやっておくべきでした。 以前は以下のような網のラックを使っていたのですが、クランプが卓上に見えてしまうのとケーブルが多くて収まりきらないし、ケーブル自体が見えてしまうので見た目が良くないです。 電源タップはこちらです。スピーカーそれぞれ、Google Home, モニタ、デスク裏のLED照明に電源が必要なので結構コンセントを使うので10口ぐらいは必要です。 デスクLED照明 WiFiに接続してコントロールできるフルカラーLEDテープを貼り付けています。   作業中は緑色にすることで緑視率を上げることによる集中力向上を狙っています。 このLEDテープの密度が低いので普通に貼ったら斑(まだら)になってしまいました。そこで、ピッチが異なるように上と下になるように2重に貼り付けたらドットが見えなくなってきれいに発色するようになりました。高さ違い、ピッチ違いなので影ができづらくなり、綺麗に発光しているように見えます。 スマートホームと連携して始業時間に点灯するように設定して、深夜に消灯するようにしています。 音に反応した照明でクラブっぽい演出もできます。電気信号でのコントロールではなく、音量を計測して発行しているので遅延が大きくて違和感あります。。。 https://youtu. be/_d5A_hF68Wk USBカメラ 特にこだわりは無し。オートフォーカスがついているし小さいので別に不満は無いです。ティルト調整ができるので角度が変えられるのが良いです。 USB DAC 3回書い直してここに至ります。ちょっと無名なメーカーのアンプは数ヶ月〜数年使っていると調子が悪くなってきます。PCに認識されなくなったり、左右の音色の差が出てきたりしました。 この商品は口コミ数が多くて安心できそうなので買いました。低音と高音のエコライザがついているので多少音色の調整をアンプ側で変更できます。 1年ぐらい問題なく運用できています。 USBハブ モニタについているUSB-Aポートだけでは足りないので増設しています。USBセキュリティキーを抜き差しするときに手元にあったほうが楽です。 PCスタンド 隙間の幅をネジで調整できるのでピッタリハマるように設定できます。 https://amzn. to/3C0Atz7 Google Nest mini Nestになってから小さいけど音質がかなり向上したので適当なBGMを流すのに使ってます。 シーンに応じた照明 夜間の照明例 ブルーライトをカットする必要があるので、暖色で統一。 暖色のスポットライトを点灯し、デスク裏のLEDテープライトを黄色に点灯した状態。 Cyberpunkぽい例 デスクのLEDテープライトのみを点灯しただけ。ブラックライトに近い光り方をします。目が疲れます。 ミニモニタ iPadを外部モニタとして使ったりもしていましたがイマイチでした。深夜にツール・ド・フランスのライブを見ながら作業するために設置しましたがどっちにも集中できないです。 テレカンの画面をiPadに持ってきたり、タッチペンで操作して図形描画に使ったりもしていましたが、モニタのミラーモードと、iOSの切り替えが面倒でした。 まとめ 自宅の作業環境を紹介しました。 全部足すと、機材に60万円ほど。リフォームに50万円ほどかかっていると思います。 Chat GPTにタイトルを付けさせたらなんか大げさなタイトルになってしまった。 --- ### tableau serverをrpmでアップグレードする方法メモ - Published: 2023-05-24 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2023/05/24/tableau-server-rpm-upgrade/ - カテゴリー: Business Intelligence (BI) - タグ: RPM, Tableau, tableau server 概要 tableau serverは1年に3〜5回ぐらいセキュリティ脆弱性対応や不具合対応のために新規バージョンがリリースされます。 毎回微妙に不具合が起きたりするのでメモを残しておきます。 公式の手順書はこちらになります。 やり方の例 以下のページから対象のrpmパッケージをダウンロードします。 https://www. tableau. com/ja-jp/support/releases/server/2023. 1. 2 % wget https://downloads. tableau. com/esdalt/2023. 1. 2/tableau-server-2023-1-2. x86_64. rpm % wget https://downloads. tableau. com/esdalt/2023. 1. 2/tableau-tabcmd-2023-1-2. noarch. rpm 両方一気に更新してみますが、エラーが出ます。 % sudo yum install *rpm Failed to set locale, defaulting to C Loaded plugins: etckeeper, extras_suggestions, langpacks, priorities, update-motd Examining tableau-server-2023-1-2. x86_64. rpm: tableau-server-20231. 23. 0511. 1508-20231-23. 0511. 1508. x86_64 Marking tableau-server-2023-1-2. x86_64. rpm to be installed Examining tableau-tabcmd-2023-1-2. noarch. rpm: tableau-tabcmd-20231. 23. 0511. 1508-20231-23. 0511. 1508. noarch Marking tableau-tabcmd-2023-1-2. noarch. rpm to be installed Resolving Dependencies --> Running transaction check ---> Package tableau-server-20231. 23. 0511. 1508. x86_64 0:20231-23. 0511. 1508 will be installed ---> Package tableau-tabcmd-20231. 23. 0511. 1508. noarch 0:20231-23. 0511. 1508 will be installed --> Finished Dependency Resolution amzn2-core/2/x86_64 | 3. 7 kB 00:00:00 Dependencies Resolved ============================================================================================================================================================================================================================================================================================================ Package Arch Version Repository Size ============================================================================================================================================================================================================================================================================================================ Installing: tableau-server-20231. 23. 0511. 1508 x86_64 20231-23. 0511. 1508 /tableau-server-2023-1-2. x86_64 4. 6 G tableau-tabcmd-20231. 23. 0511. 1508 noarch 20231-23. 0511. 1508 /tableau-tabcmd-2023-1-2. noarch 19 M Transaction Summary ============================================================================================================================================================================================================================================================================================================ Install 2 Packages Total size: 4. 6 G Installed size: 4. 6 G Is this ok : y Downloading packages: Running transaction check Running transaction test Transaction check error: file /opt/tableau/tabcmd/NOTICES. txt from install of tableau-tabcmd-20231. 23. 0511. 1508-20231-23. 0511. 1508. noarch conflicts with file from package tableau-tabcmd-20221. 22. 0823. 1450-20221-22. 0823. 1450. noarch file /opt/tableau/tabcmd/bin/tabcmd from install of tableau-tabcmd-20231. 23. 0511. 1508-20231-23. 0511. 1508. noarch conflicts with file from package tableau-tabcmd-20221. 22. 0823. 1450-20221-22. 0823. 1450. noarch Error Summary ------------- tabcmdの方のパッケージにおいて、ファイルがコンフリクトしているみたいです。 tableau-server まずはserverの方を単独で更新します。 % sudo yum install tableau-server-2023-1-2. x86_64. rpm Failed to set locale, defaulting to C Loaded plugins: etckeeper, extras_suggestions, langpacks, priorities, update-motd Examining tableau-server-2023-1-2. x86_64. rpm: tableau-server-20231. 23. 0511. 1508-20231-23. 0511. 1508. x86_64 Marking tableau-server-2023-1-2. x86_64. rpm to be installed Resolving Dependencies --> Running transaction check ---> Package tableau-server-20231. 23. 0511. 1508. x86_64 0:20231-23. 0511. 1508 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================================================================================================================================ Package Arch Version Repository Size ============================================================================================================================================================================================================================================================================================================ Installing: tableau-server-20231. 23. 0511. 1508 x86_64 20231-23. 0511. 1508 /tableau-server-2023-1-2. x86_64 4. 6 G Transaction Summary ============================================================================================================================================================================================================================================================================================================ Install 1 Package Total size: 4. 6 G Installed size: 4. 6 G Is this ok : y Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction etckeeper: pre transaction commit Your hardware meets the minimum requirements for a trial of Tableau Server. If you plan to run Tableau Server in a production environment, we recommend the following hardware specifications: http://www. tableau. com/products/server/specs Tableau Server runs best with at least 128 GB memory, but found only 31 GB of memory. Tableau Server runs best with at least 8 cores, but found only 4 core(s). Installing : tableau-server-20231. 23. 0511. 1508-20231-23. 0511. 1508. x86_64 1/1 Found existing installation version '20223. 22. 1108. 0821' in /var/opt/tableau/tableau_server Found existing installation version '20223. 22. 1108. 0821' in /var/opt/tableau/tableau_server After new version has been installed on every Tableau Server node, run: sudo /opt/tableau/tableau_server/packages/scripts. 20231. 23. 0511. 1508/upgrade-tsm --accepteula on initial (controller) node to continue upgrading Tableau Server. etckeeper: post transaction commit perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_COLLATE = "C", LC_CTYPE = "UTF-8", LANG = "en_US. UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_COLLATE = "C", LC_CTYPE = "UTF-8", LANG = "en_US. UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). Verifying : tableau-server-20231. 23. 0511. 1508-20231-23. 0511. 1508. x86_64 1/1 Installed: tableau-server-20231. 23. 0511. 1508. x86_64 0:20231-23. 0511. 1508 Complete! 更新できました。次に、規約に同意が必要なので同意します。 % sudo /opt/tableau/tableau_server/packages/scripts. 20231. 23. 0511. 1508/upgrade-tsm --accepteula Upgrading Tableau Server to version 20231. 23. 0511. 1508. See log file at /var/opt/tableau/tableau_server/logs/app-upgrade. log for progress. Verifying that the upgrade script is running from the correct environment. Validating Tableau Server version. Verifying that the new packages have been installed on all cluster nodes. Verifying Active Directory connection. Verifying configuration is valid. Performing preflight checks to ensure the server is in a good state to be upgraded. Stopping service... This operation will stop the server. To start server, run 'tsm start' after the upgrade is completed. Do you want to continue? (y/n): y Reconnecting to asynchronous job... Running - Disabling all services. Job id is '461', timeout is 30 minutes. 50% - Disabling all services. 100% - Waiting for the services to stop. Verifying Tableau Server is stopped. Verifying that there is only one deployed Tableau Server Coordination Service ensemble. Verifying that Tableau Server has been initialized. Verifying licensing state. Backing up repository. Making prerequisite configuration changes prior to upgrading TSM services. Reconnecting to asynchronous job... Job id is '462', timeout is 43 minutes. 11% - Retrieving the topology to deploy. 22% - Retrieving the configuration to deploy. 33% - Validating the new topology. 44% - Determining if server needs to be started. 55% - Updating nodes to new topology. 66% - Waiting for topology to be applied. 77% - Updating nodes to new configuration. 88% - Reconfiguring services. 100% - Waiting for services to reconfigure. Upgrading TSM services. Deploying new service packages. Updating Tableau Server Coordination Service. Updating Tableau Server Client File Service. Adding Activation Service. Updating configuration. Reconnecting to asynchronous job... Job id is '463', timeout is 60 minutes. Generating new credentials. Reconnecting to asynchronous job... Job id is '464', timeout is 63 minutes. 7% - Generating passwords. 14% - Generating secret keys. 21% - Generating apigateway mutual SSL certificates. 28% - Generating Apache Gateway Internal mutual SSL certificates. 35% - Generating Unique Cluster Identifier. 42% - Generating Search Server SSL certificate. 50% - Generating Index And Search Server SSL certificate. 57% - Generating ActiveMQ Server SSL certificate. 64% - Generating internal Metadata API mutual SSL certificates. 71% - Generating key store. 78% - Generating Hyper SSL certificate. 85% - Generating TSIG logs service SSL certificate. 92% - Promoting configuration. 100% - Waiting for services to reconfigure. Performing post-upgrade services and configuration operation. Reconnecting to asynchronous job... Job id is '465', timeout is 30 minutes. 50% - Disabling all services. 100% - Waiting for the services to stop. Updating asset keys. Reconnecting to asynchronous job... Job id is '466', timeout is 2880 minutes. 100% - Migrating asset keys to configuration if needed. Restoring repository. Updating repository version in Tableau Server Coordination Service. Updating repository. Reconnecting to asynchronous job... Job id is '467', timeout is 120 minutes. 8% - Enabling the database services. 16% - Waiting for the database services to enable. 25% - Putting the repository into local trust mode. 33% - Creating roles and databases. 41% - Running migrations against the primary database. 50% - Setting the next active repository. 58% - Taking the repository out of local trust mode. 66% - Disabling database services. 75% - Waiting for database services to disable. 100% - Upgrading database Updating data directory version. Reconnecting to asynchronous job... Job id is '468', timeout is 44 minutes. 9% - Retrieving the topology to deploy. 18% - Retrieving the configuration to deploy. 27% - Validating the new topology. 36% - Determining if server needs to be started. 45% - Disabling all services. 54% - Waiting for the services to stop. 63% - Updating nodes to new topology. 72% - Waiting for topology to be applied. 81% - Updating nodes to new configuration. 90% - Reconfiguring services. 100% - Waiting for services to reconfigure. upgrader. initializing_index_and_search_server Rebuilding search index. Reconnecting to asynchronous job... Job id is '469', timeout is 10 minutes. 14% - Disabling all services. 28% - Waiting for the services to stop. 42% - Starting backup restore services for search server reset. 57% - Resetting search server. 71% - Starting search server. 85% - Configuring search server. 100% - Stopping backup restore services. Reconnecting to asynchronous job... Job id is '470', timeout is 1440 minutes. 25% - Enabling the services required for indexing. 50% - Connecting to Vizportal Maintenance. 75% - Rebuilding the search index. 100% - Disabling the services used for indexing. Upgrading Analytics Extensions settings. Resetting Metadata API Store. Reconnecting to asynchronous job... Job id is '471', timeout is 10 minutes. 9% - Starting required services for resetting Metadata API Store. 18% - Stopping Metadata API Store related services. 27% - Enabling the maintenance app. 36% - Waiting for the maintenance app to start. 45% - Disabling database services. 54% - Waiting for database services to disable. 63% - Recreating Metadata API Store. 72% - Restoring Metadata API Store related services to previous state. 100% - Restoring required services to previous state. Verifying licensing state. Tableau Server has been upgraded to version 20231. 23. 0511. 1508. >> The upgraded Tableau binary directory will be added to PATH for new shells. To get the >> updated path, either start a new session, or for bash users run: >> source /etc/profile. d/tableau_server. sh serverのパッケージを更新すると、tableau server自体が停止するのでtsmコマンドで手動で起動します。 $ tsm start Starting service... The last successful run of StartServerJob took 4 minute(s). Job id is '472', timeout is 60 minutes. Service was started successfully. tableau-cmd 一度uninstallすれば良いみたいなので、一度消してインストールします。 % sudo yum remove tableau-tabcmd-20221. 22. 0823. 1450-20221-22. 0823. 1450. noarch % sudo yum install tableau-tabcmd-2023-1-2. noarch. rpm おわり --- ### 個人開発のWebサービスをCloudflareに載せてみた【無料でここまでできる】 - Published: 2023-04-23 - Modified: 2023-04-28 - URL: https://blog.teraren.com/2023/04/23/web-service-on-cloudflare/ - カテゴリー: Program & Service - タグ: AWS, CDN, Cloudflare, WAF 概要 私は個人でWebサイトやWebサービスを色々公開しております。 この度、個人開発でWebサービスを運用するときにCloudflareを利用すると様々なリスクを無料でヘッジできるので事例を紹介します。 しかも無料です。 個人開発サービスの問題 費用をかけられない お金をかければWAFや計算処理の高いサーバやコンテナなどの環境を使えますが、テストで開発したサービスや収益化するかどうかわからないサービスをたくさん運用することになるので固定費は可能な限り抑える必要があります。 いかに安く安定的にサービスを提供できるかは腕の見せどころでもあります。 複数サービスがダウンする可能性 固定費を抑えるために1ホストにいろいろなサービスを動かすことが多いと思います。 よって、1つのサービスに対してDoS攻撃や突発的にWeb上でバズって大量のトラフィックが来ると捌ききれなくなってあるホストで運用しているサービスがすべてダウンしてしまうリスクがあります。 自宅サーバの場合はポートを解放しないといけない 費用を抑えるために自宅サーバを運用して居る場合もあると思いますが、自宅サーバを公開するためにはポートを開放する必要があります。また、ホストレベルでクラックされた場合には自宅LANに第三者が入れる状態になってしまうリスクがあります。 Cloudflareとは 主なサービスは、コンテンツ配信ネットワーク(CDN)、DDoS攻撃防御、Webアプリケーションファイアウォール(WAF)などのセキュリティ機能、およびインターネット最適化を提供します。Cloudflareの主な機能は以下になります。 コンテンツ配信ネットワーク (CDN) DDoS保護 Webアプリケーションファイアウォール (WAF) SSL/TLS暗号化 DNSサービス Zero Trustセキュリティ エッジコンピューティング これ以外にもたくさんのWebサービスを運用する上で便利な機能があります。 概念的には以下のようなイメージです。主にレイヤー7のアプリケーション層においてのリスクをCloudflareで全部受け止めてくれるような使い方ができます。 Cloudflareのダッシュボードをチラ見せしますとこんな感じになります。左のメニューを見てもらうとわかると思うのですが、Webサービスを運用する上で便利な機能が用意されています。 変更前インフラ おそらく、個人開発しているサービスや小規模サービスは以下のようなインフラ構成になっていると思います。 AWSでいえば、アプリケーションサーバはEC2やAWS Lightsail、自宅サーバで動かして、CDNに乗せられるようなコンテンツはCloud Frontを使うと言ったような感じです。 上記の構成であれば、無料枠で収まるかなと思います。 上記の構成を少し先に進めるために、WAFを入れたり、TLS証明書の自動更新を入れたりすると毎月数万円の金額がかかってきます。 Cloudflareでの設定 フェーズ1 Cloudflareを利用するためにはドメインが切られている必要があり、zoneサーバをCloudflareでホスティングする必要があります。 CloudflareのDNSだけを使うだけでも無料で運用できるのでそれだけでも価値はあったりしますが、まずはCloudflareの恩恵を受けるためには以下のような構成を作るのが1歩目です。 「Cloudflare as CDN」と書かれている部分が普通の概念とは異なるのですが、CDNとざっくり書いてしまいましがこの部分がCloudflareの超重要な部分です。そして説明しづらいところなのであんまりCloudflareが認知されていない理由にもなっているのかなと思います。 分かりやすく説明するために、1つのメインの機能としては、TLS terminationとReverse Proxyが動作しています。それにより、外部からの攻撃、リクエスト内容の検証、originへのトラフィックの制御を行えるようになっています。 次に、設定の手順の概略を書いておきます。 DNS zoneの登録 なにはともあれ、Cloudflareを使うための第1ステップはドメインのzoneを登録するところからです。 例えば、CloudflareのCDN(無料)だけを使いたかったとしてもDNS zoneをCloudflare上でホスティングする必要があります。Cloudflareの恩恵は受けられませんが、CloudflareのDNS zoneホスティングだけを使うと言ったことも無料で可能です。 (スクショは英語ですが、すべて日本語の表示もできます) zoneを登録したら、各レコードを追加していきます。 レコードを追加する際に普通とは違うのが、"Proxy status" というスイッチがあることです。このスイッチをonにするとDNS zoneサーバのレスポンスは登録したIPアドレスなどではなく、CloudflareのReverse proxyサーバのアドレスに置き換わります。 では、”Proxy status"をonにしたら左の項目に登録したIPアドレスはどう扱われるのかといいますと、Reverse Proxyのoriginのホストとして扱われます。 独特な概念ではあって最初からつまずきやすいですが、一度理解してしまえば大丈夫ですし、段階的に切り替えられます。まずはReverse proxyをoffにした状態でDNS zoneを移行するのが良いです。 このblog. teraren. comのサイト自体もCloudflareを使っているのでDNSを引くとReverse proxyのアドレスが返ってきます。 Reverse proxyで受けられるようにoriginを設定 既存のはorigin側のwebサーバの設定では、グローバルからリクエストを受ける設定になっているのでreverse proxyからアクセスを受けられるように設定します。 今までは、ユーザに見せるホスト名でのTLS terminationなどを行ったいた設定をreverse proxyからのアクセスを前提とした設定を行います。 設定例: Configure Nginx Reverse Proxy behind Cloudflare キャッシュルールの設定 Reverse Proxy自体がCDN機能を持っているので、どのコンテンツをキャッシュするかどうかを設定します。 WebからわかりやすいUIで設定できるので自分のホスティングするサービスに応じてルールを書いていきます。 無料だと10個までしかルールセットを作れません。私はキャッシュの期間ごとにルールセットを作っています。 1ヶ月キャッシュ、7日キャッシュ、1日キャッシュ、キャッシュ無しという分類です。 (2つ目と3つ目は同義です。もともとは別の期間を設定していた名残です。) 私の環境における「キャッシュ無し」のスクショを書いておきます。 Wordpressの管理画面、ヘルスチェック用エンドポイント、動的なスクリプト、RSSフィードなどを記載してあります。 逆に1ヶ月の長期間を設定している設定はこちらになります。主に画像などの静的アセットになります。昨今はCDNを考慮したアセットの構築が行われているので内容が変わればURLも変わるという前提のためです。 CDN周りだけでも以下のような設定が簡単に行えます。 Query Stringごとにキャッシュするかどうか ブラウザキャッシュのヘッダを付加するか Originが落ちたときにキャッシュをサーブするか CDNの一時的に一括無効化 CloudflareのCDNのすごいところはinvalidationが数秒で終わることです。Amazonだと数分とかかかったりしちゃいますが。 統計情報 Reverse ProxyとCDNを使いだすと以下のような統計情報が表示されてきます。眺めているだけでも楽しいです。 右にあるメニューに注目してほしいのですが、もしサービスが攻撃を受けていたら一時的に「Javascriptによる人間かどうかのチャレンジを挟む」というスイッチがあるのでONにすればoriginのサービスを過負荷から守れます。 トラフィックの統計も細かく表示されます。 Webサイトへの攻撃に関する統計情報 プロトコルやどれだけ待機を節約できたかの情報も表示されます。 30日で見てみると、300GBのトラフィックを節約できたみたいです。(無駄なトラフィックを節約することでCO2削減にも貢献!) Wordpressの設定 Wordpress用にCloudflareのpluginが用意されています。 インストールしなくても使えることは使えるのですが、記事を更新すると自動でCDNの関連ページをpurgeしてくれます。あと、CDNでWordpressを運用するにあたってWordpressの挙動を勝手に裏で変更しているようです。 まとめ IPv6対応、HTTP3/QUICK対応、DDoS対策、TLS証明書更新自動化、HSTS設定、CDN利用、DNSSECが行えてます。今までは自分で頑張って設定していたことがもうすでに用意されている感じです。 Cloudfalreは昨今の面倒なWebサイト運用における設定をWebサービスの1レイヤー上で面倒を見てくれるようなサービスです。 しかも無料。。。申し訳なくなってきます。 フェーズ2 フェーズ1からより安全にする方法です。 これにより、E2EEが実現でき、origin側のポート開放が不要になってよりセキュアにサービス運用を行えます。 tunnelのセットアップ origin側にCloudflareのdaemonを動かして、tunnelを設定できます。cloudflareとoriginの間のトラフィックをこのtunnelを通すことによってoriginサーバ側でポート開放をする必要が無くなります。 tunnelを使うためにはCloudflare上のZero Trustの管理画面で設定します。 1ホストに対して1本のトンネルを作ってある設定例です。 daemonのインストールも非常に楽で管理画面上に表示されている例にあるコマンドを叩くだけです。 以下のようにpublicのホスト名と、originのサービス名を登録していきます。ここで登録するとCloudflareのDNSの設定にレコードが追加されていきます。既存のレコードと重複する場合はエラーが出ます。 tunnel経由でoriginへアクセス 1つ前のトンネルの設定をする際に、Cloudflareとoriginの通信を安全にしておくことをおすすめします。ブラウザとCloudflare間の設定はグローバルなのでLet's encryptといった枠組みでTLS証明書の発行と運用簡単に設定できますが、originへのアクセスはprivateネットワークなのでそう簡単にはできません。 そこで、Cloudflareが発行する証明書をoriginサーバにインストールすることでCloudflareから発行された証明書がインストールされたoriginサーバということを担保する証明書を利用します。 その設定が完了すれば、上記のようにCloudflareを挟んでも安全にoriginの信頼性を保証できることになります。 Cloudflare上ではこのことをE2EEと呼んでますが、TLS terminationをCloudflare上で行っているのでE2Eでの秘匿性と、完全制は保証できないですね。紛らわしいです。 また、ここでは触れませんがsshなどのサービスもzero trustのサービスによってtunnel経由でアクセスできるように設定できるのでsshのポートすら空けないですみます。 BICはOFFにしたほうが良さそう Security > Settingメニューに有るBrowser Integrity Checkはオフにしたほうが良さそうです。プログラムからアクセスされるAPIサービスを運用していると、このルールによってblockされているリクエストが存在します。 24時間以内に10件くらいがブロックされてしまっていました。 Cloudflareの有料機能 これまでの設定はすべて無料で行える範囲です。トラフィックがどんなに増えても無料です。 課金すれば、もっと良いサービスを利用できるので将来使いそうなサービスをいくつか紹介しておきます。 Waiting page急にサイトに大量のトラフィックが来たときに、Cloudflareでの待機ルームを表示してoriginが空くまでユーザを待たせる機能。チケット予約サイトとかはこれを使えば一発解決します。 Image compressionpngやjpgなどの画像を次世代圧縮形式であるwebpに変換してブラウザにサーブしてくれる機能です。サーバサイドで色々設定しなくても済みます。 Advanced WAF怪しいアクセスをHTTPリクエストの内容を見て判断してくれます。 考察 Cloudflareを導入してみて大きく変わったことを書いておきます。 レスポンスタイムが超速い CDNにキャッシュされると表示が一瞬で終わります。 $ ab -c 5 -n 20 https://blog. teraren. com | grep 'Time per request' Time per request: 30. 551 (mean) 今見ているこのページをリロードしてみると、ブラウザキャッシュが読み込んだかのような速さで表示されると思います。 Wordpressで運用しているサイトはそのままで運用しているとキャパが少ないので普通派WP Super Cacheを入れて運用すると思いますが、cache関連のプラグインもこの際にすべて削除しました。 Webサーバ側の設定が激減 Wordpressのサイトでは1サイトあたり約100行削減できました。 HTTPのリダイレクト、HSTS、text compressionの設定などなどを削減できてメンテナンス性が上がります。 # git diff --stat a9d832ed7f1493ea0ce8e75664e7a1b70f95760e matsu. teraren. com. conf nginx/conf. d/matsu. teraren. com. conf | 178 ++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------ 1 file changed, 40 insertions(+), 138 deletions(-) TLS証明書更新から開放 以前はcertbotで自動で更新を書けていても、知らない間に動かなくなっていたりとか設定ファイルが変わっていたりして結局は手での運用が発生してしまっていました。 Let's encryptからの更新のお知らせのメールも一切期にしなくて良くなるので運用の手間からかなり開放されました。 TLS証明書に関連しては、HTTPからHTTPSのリダイレクト設定がスイッチ1つで行えたり、HSTSのヘッダ送信がUI上から行えるので非常に楽です。 HSTSの設定項目。 自宅サーバ用の固定IPまたはDynamic DNSが不要 tunnelをCloudflareに張るだけなのでローカルで動いているサービスをインターネット上に公開できるので自宅の回線に固定IPアドレスやDynamic DNSが不要になりました。 自宅ネットワークにDMZを作ったりVLANを切っている場合は、設定を無くせる場合もあります。(セキュリティ要件に応じてですが) ポート開放が無くなった 外部から自宅のネットワークのポート開放を一切無くせました。Web系、SSHなどのリモートアクセス、場合によってはVPN関係のサービスを無くせます。 $ nmap Starting Nmap 7. 93 ( https://nmap. org ) at 2023-04-22 11:40 JST Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 3. 04 seconds 自宅のIPアドレスを晒さなくても良くなったので安心感があります。 Webページのパフォーマンススコアが向上 Webサイトのベストプラクティスを自動的に、または簡単に導入できるためGT metrixのスコアが上がります。 まとめ 最初はCloudflareのCDNが無料なので調査していたら、CloudflareはCDN以外の機能もかなり充実していてしかも無料で使えるサービスが沢山あるので今回は無料で使えるサービスをフルに活用して安全で安定的なサービス提供をできるように設定をしました。 最初の設定が大変ですし、知識が必要になりますがその後は安心して高速で安全なWebサービスの提供を行えるようになります。 --- ### AtlassianをSP、Google WorkspaceをIdPとしてSAMLを設定する方法 - Published: 2023-04-20 - Modified: 2023-04-20 - URL: https://blog.teraren.com/2023/04/20/atlassian-saml-google-workspace/ - カテゴリー: Security - タグ: atlassian, Confluence, google workspace, SAML, SSO 概要 SAMLの証明書が切れたので設定箇所をメモしておきます。 SAMLに関する設定は2箇所あるので、両方を適切に設定する必要があります。 Atlassianのドキュメントには設定1に関する事項しか載っていないので不十分でした。 設定1 SAMLの証明書マスタの設定。有効期限が未来の証明書を作っておく https://admin. google. com/ac/security/ssocert 設定2 Atlassianアプリの設定側で、設定1で作成した証明書を選択しておく。 https://admin. google. com/ac/apps/saml/93648076211/sp (数字のところが各自違うかも) 設定3 Atlassianの管理画面での設定です。 以下のような感じでURLや証明書をコピペします。 注意 証明書は5年とかで切れるので、手動で更新する必要があります。 --- ### 末尾の半角スペースで困惑:ActiveModelとMySQLの連携問題 - Published: 2023-04-14 - Modified: 2023-04-14 - URL: https://blog.teraren.com/2023/04/14/mysql-pad-space-and-active-record/ - カテゴリー: Ruby on Rails - タグ: collation, MySQL, rspec, Ruby on Rails 概要 ActiveModelのuniqueがあるアトリビュートの末尾に半角スペースがあると挙動がおかしくなるケースがありました。 問題 以下のようにcodeがユニークなアトリビュートを定義してあるとします。 class Product < ApplicationRecord validates :code, presence: true validates :code, uniqueness: true end 上記の定義によれば、codeが 'aa' と 'aa' (末尾に半角スペースが2つ)のオブジェクトが存在することができますが、実際には登録できません。 以下のコードは正しく動くはずなのに、2つ目のオブジェクトがvalidになりません。 pry(main)> p1 = FactoryBot. create(:product) pry(main)> p1. code = 'aa ' => "aa " pry(main)> p1. save => true pry(main)> p2 = FactoryBot. create(:product) pry(main)> p2. code = 'aa ' => "aa " pry(main)> p2. save => false pry(main)> p2. valid? => false pry(main)> p2. errors => # pry(main)> ActiveRecord上では 'aa ' と 'aa ' が同一に扱われているようです。 検証するために、ActiveRecordでcodeをキーに検索してみます。同時に、発行されているSQLを確認してみます。 そうすると、末尾の半角スペースの数に関わらず、半角スペースが1つしか存在しないレコードがヒットしてしまいます。 pry(main)> Product. where(code: 'test0410'). first. code Product Load (1. 0ms) SELECT `products`. * FROM `products` WHERE `products`. `code` = 'test0410' ORDER BY `products`. `id` ASC LIMIT 1 => "test0410 " pry(main)> Product. where(code: 'test0410 '). count Product Load (1. 0ms) SELECT COUNT(*) FROM `products` WHERE `products`. `code` = 'test0410 ' => 1 pry(main)> Product. where(code: 'test0410 '). count Product load (0. 6ms) SELECT COUNT(*) FROM `products` WHERE `products`. `code` = 'test0410 ' => 1 pry(main)> Product. where(code: 'test0410'). count Product Load (0. 5ms) SELECT COUNT(*) FROM `products` WHERE `products`. `code` = 'test0410' => 1 発行されているクエリーは正しそうな感じはします。(文字列に対してLIKEではなくてイコールで条件を書いているのが若干微妙ですが) SQLレベルで予期した動作をしていないので、SQLで検証してみます。 MySQL > update products set code = 'aa ' where id = 2; ERROR 1062 (23000): Duplicate entry '1-aa ' for key 'products. index_products_on_code' MySQL > update products set code = 'aa ' where id = 1; Query OK, 0 rows affected (0. 001 sec) Rows matched: 1 Changed: 0 Warnings: 0 MySQL > update products set code = 'aa ' where id = 2; ERROR 1062 (23000): Duplicate entry '1-aa ' for key 'products. index_products_on_code' 上記の内容により、MySQLの物理スキーマレベルで半角スペースの多さが同一に扱われてしまっています。 ということで問題はMySQLレベルにありそうです。 アプローチ 最近の私のアシスタント(GPT-4) に聞いてみました。 なるほど。PAD SPACEという概念は知りませんでした。 PAD SPACEというプロパティはcollationに従属している値です。 ということで、現在のカラムのcollationがどうなっているのかを調べてみます。 MySQL > SELECT COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA. COLUMNS WHERE TABLE_NAME = 'products'; +-----------------------------+--------------------+ | COLUMN_NAME | COLLATION_NAME | +-----------------------------+--------------------+ | id | NULL | | code | utf8mb4_bin | +-----------------------------+--------------------+ 34 rows in set (0. 002 sec) utf8mb4_binになっています。 この、utf8mb4_binがPAD SPACEなのかを調べてみます。 MySQL> SELECT COLLATION_NAME, PAD_ATTRIBUTE -> FROM INFORMATION_SCHEMA. COLLATIONS -> WHERE COLLATION_NAME LIKE 'utf8mb4_bin'; +----------------+---------------+ | COLLATION_NAME | PAD_ATTRIBUTE | +----------------+---------------+ | utf8mb4_bin | PAD SPACE | +----------------+---------------+ 1 row in set (0. 002 sec) PAD SPACEでした。ということで、現在利用中のcollationがPAD SPCAE属性があるcollationのため、末尾の半角スペースがいくつあっても同一に扱われてしまっていました。 MySQLのオフィシャルドキュメントではここに記載してあります。 https://dev. mysql. com/doc/refman/8. 0/ja/charset-binary-collations. html そもそも、utf8mb4_binは、suffixにbinaryのbinが付いているのに、全然binaryで区別してくれなくて悲しいです。 テストコード 修正前と後でモデルが正常に動くかを検証するために、FactoryBotを使ったrspecのコードを書いておきます。 spec/models/product_spec. rb require 'rails_helper' RSpec. describe Product do it 'should be valid' do expect(create(:product, code: 'aa ')). to be_valid expect(create(:product, code: 'aa ')). to be_valid end end 失敗してしまいます。 root@455cbca12654:/app# bundle exec rspec spec/models/product_spec. rb Randomized with seed 53478 F Failures: 1) Product should be valid Failure/Error: p2 = create(:product, code: 'aa ') ActiveRecord::RecordInvalid: バリデーションに失敗しました: codeはすでに存在します # /usr/local/bundle/gems/factory_bot-6. 2. 1/lib/factory_bot/evaluation. rb:18:in `create' # /usr/local/bundle/gems/factory_bot-6. 2. 1/lib/factory_bot/strategy/create. rb:12:in `block in result' # /usr/local/bundle/gems/factory_bot-6. 2. 1/lib/factory_bot/strategy/create. rb:9:in `result' # /usr/local/bundle/gems/factory_bot-6. 2. 1/lib/factory_bot/factory. rb:43:in `run' # /usr/local/bundle/gems/factory_bot-6. 2. 1/lib/factory_bot/factory_runner. rb:29:in `block in run' # /usr/local/bundle/gems/factory_bot-6. 2. 1/lib/factory_bot/factory_runner. rb:28:in `run' # /usr/local/bundle/gems/factory_bot-6. 2. 1/lib/factory_bot/strategy_syntax_method_registrar. rb:28:in `block in define_singular_strategy_method' # . /spec/models/product_spec. rb:6:in `block (2 levels) in ' Finished in 4. 73 seconds (files took 2. 42 seconds to load) 1 example, 1 failure Failed examples: rspec . /spec/models/product_spec. rb:4 # Product should be valid Randomized with seed 53478 修正 no padのutf8mb4のbinaryに近いcollationを探してみます。 MySQL > show collation where collation like 'utf8mb4%' and collation like '%bin'; +------------------+---------+-----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +------------------+---------+-----+---------+----------+---------+---------------+ | utf8mb4_0900_bin | utf8mb4 | 309 | | Yes | 1 | NO PAD | | utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | PAD SPACE | +------------------+---------+-----+---------+----------+---------+---------------+ 2 rows in set (0. 004 sec) こちらの比較表からしても、用途としては基本的にすべて区別したいのでutf8mb4_0900_binが良さそうです。 change_column :products, :code, :string, null: false, collation: :utf8mb4_0900_bin migrationを実行した後にrspecを実行したら正常に終わりました。 root@6d3039d9f78e:/app# bundle exec rspec spec/models/product_spec. rb Randomized with seed 38846 . Finished in 2. 95 seconds (files took 29. 75 seconds to load) 1 example, 0 failures Randomized with seed 38846 影響度調査 今回のような、サロゲートキーに対してUNIQUE KEYを貼って、厳密な検索や値の保管を行うときに問題になります。 今回は、商品コード関連で気づくことができました。他にも同じようなサロゲートキーの使い方をしている箇所が10箇所以上あったのでcollationをすべて見直しました。 サロゲートキーのカラム名をつける際に、命名規則に従っていれば以下のクエリーで一括で検索できます。 MySQL > SELECT table_name,COLUMN_NAME, data_type, collation_name FROM INFORMATION_SCHEMA. COLUMNS where table_schema = '' and column_name = 'code'; +----------------------+-------------+-----------+--------------------+ | TABLE_NAME | COLUMN_NAME | DATA_TYPE | COLLATION_NAME | +----------------------+-------------+-----------+--------------------+ | table_1 | code | varchar | utf8mb4_0900_ai_ci | | table_2 | code | varchar | utf8mb4_bin | | table_3 | code | varchar | utf8mb4_bin | | table_4 | code | varchar | utf8mb4_bin | | table_5 | code | varchar | utf8mb4_bin | | table_6 | code | varchar | utf8mb4_0900_ai_ci | | table_7 | code | varchar | utf8mb4_bin | | table_8 | code | varchar | utf8mb4_bin | | table_9 | code | varchar | utf8mb4_bin | | table_10 | code | varchar | utf8mb4_bin | | table_11 | code | varchar | utf8mb4_bin | | table_12 | code | varchar | utf8mb4_bin | | table_13 | code | varchar | utf8mb4_bin | | table_14 | code | varchar | utf8mb4_bin | +----------------------+-------------+-----------+--------------------+ 14 rows in set (0. 006 sec) まとめ MySQLのcollationによって、カラムの値にある最後の半角スペースがいくつあっても同一に扱われる場合がある。 上記により、'aa ' と 'aa ' が同一に扱われる。 GPT-4すごい。 ちなみに、GPT-3. 5だと的確な原因を指摘するところまではやってくれませんでした。 --- ### Raspberry PiのWiFiと有線LANに静的IPを振る - Published: 2023-04-08 - Modified: 2023-04-08 - URL: https://blog.teraren.com/2023/04/08/raspberry-pi-static-ip/ - カテゴリー: Raspberry Pi - タグ: Raspberry Pi, static ip デフォルトだとDHCPからIPを取得するので面倒なため、静的IPを振っておきます。OSはRaspberry Pi Lite 64bit(Debian GNU/Linux 11 (bullseye))です 有線LANに192. 168. 1. 5/24、無線LANに192. 168. 1. 6/24を振る例です。 基本的には設定がコメントアウトしてあるのでコメントアウトを外していくだけです。IPv6の固定アドレスはちゃんと運用しないので一旦は設定しません。ちゃんと運用しないし。 diff --git a/dhcpcd. conf b/dhcpcd. conf index b34f11a. . 674fda9 100644 --- a/dhcpcd. conf +++ b/dhcpcd. conf @@ -41,11 +41,17 @@ require dhcp_server_identifier slaac private # Example static IP configuration: -#interface eth0 -#static ip_address=192. 168. 0. 10/24 +interface eth0 +static ip_address=192. 168. 1. 5/24 +#static ip6_address=fd51:42f8:caae:d92e::ff/64 +static routers=192. 168. 1. 1 +static domain_name_servers=192. 168. 1. 1 1. 1. 1. 1 fd51:42f8:caae:d92e::1 + +interface wlan0 +static ip_address=192. 168. 1. 6/24 #static ip6_address=fd51:42f8:caae:d92e::ff/64 -#static routers=192. 168. 0. 1 -#static domain_name_servers=192. 168. 0. 1 8. 8. 8. 8 fd51:42f8:caae:d92e::1 +static routers=192. 168. 1. 1 +static domain_name_servers=192. 168. 1. 1 1. 1. 1. 1 fd51:42f8:caae:d92e::1 # It is possible to fall back to a static IP if DHCP fails: # define static profile 反映するためには以下のコマンドです。コマンドを打った瞬間ネットワークのインターフェイスががダウンするのでご注意ください。うまくいけば新しく設定したIPアドレスで接続できるようになります。 sudo ifconfig wlan0 down && sudo ifconfig wlan0 up NICにIPが振られているか確認 IPv6, IPv4で接続性があるかを動作確認 HTTP, HTTPSの接続性も確認 --- ### Wordpressのoptions.phpページで保存できないときの対処法 - Published: 2023-03-31 - Modified: 2023-03-31 - URL: https://blog.teraren.com/2023/03/31/wordpress-options/ - カテゴリー: Wordpress - タグ: max_input_vars, php.ini WordPressで、「options. php」ページにて、image_default_link_typeをfileに変更して、「変更を保存」をクリックすると、「設定を保存できませんでした。」と表示されて変更できませんでした。 調べてみると、max_input_varsの値がデフォルトでは1000なのですが、options. phpの項目が1000個以上あるから弾かれているようです。 # git diff diff --git a/php. ini b/php. ini index aa8acc8. . 6459620 100644 --- a/php. ini +++ b/php. ini @@ -397,7 +397,7 @@ max_input_time = 60 ;max_input_nesting_level = 64 ; How many GET/POST/COOKIE input variables may be accepted -; max_input_vars = 1000 +max_input_vars = 2000 ; Maximum amount of memory a script may consume (128MB) ; http://php. net/memory-limit この値を適当に2000にして、PHPを再起動したら保存できました。 systemctl restart php-fpm. service --- ### CloudWatchのlog insightでの調査例 - Published: 2023-03-30 - Modified: 2025-01-06 - URL: https://blog.teraren.com/2023/03/30/cloudwatch-log-insight/ - カテゴリー: AWS - タグ: CloudWatch, log insight アプリケーションのログがJSONで保存されているときの調査サンプル filter @logStream like 'app/app/' | filter @message like /include/ | filter @message not like /exclude/ | filter duration > 100 | fields @timestamp, @message, duration --- ### slackで最終営業日にリマインダーを設定する方法 - Published: 2023-03-30 - Modified: 2023-03-30 - URL: https://blog.teraren.com/2023/03/30/slack-reminder-last-weekday/ - カテゴリー: Diary - タグ: remind, slack 正確には日本の休日マスタを使わないと出せません。 とりあえず簡易的には以下で設定できます。 /remind #channel or @your_username at on the last weekday of the month 例 /remind #general 今月の報告書を提出してください at 3pm on the last weekday of the month --- ### Automatically delete head branchesの宗教論争 - Published: 2023-03-28 - Modified: 2023-05-31 - URL: https://blog.teraren.com/2023/03/28/post-15243/ - カテゴリー: Diary, git - タグ: branch, git, github 概要 githubのレポジトリ運用において「Automatically delete head branches」をonにするかoffにするか悩ましいところです。 デフォルトはoffです。 GPTに聞いてみた Q: githubのrepositoryの設定にある、 "Automatically delete head branches" をonにするかoffにするか悩んでます。どちらのほうが一般的でしょうか? A: 「Automatically delete head branches」の設定は、プルリクエストがマージされた後に、そのブランチを自動的に削除する機能です。この設定をオンにするかオフにするかは、チームやプロジェクトのワークフローと好みによって異なります。しかし、一般的な考え方をいくつか紹介します。 オンにする利点: リポジトリがきれいに保たれる: 不要なブランチが自動的に削除されるため、リポジトリが整理されやすくなります。 ブランチの管理が楽になる: 作業が完了したブランチを手動で削除する必要がなくなり、メンテナンスが容易になります。 オフにする利点: 履歴の追跡: ブランチが削除されないため、過去の変更履歴を容易に確認できます。 再利用可能: 削除されないため、同じブランチを再利用して追加の変更を行うことができます。 一般的には、プルリクエストがマージされた後にブランチを自動的に削除してリポジトリを整理しやすくするため、この機能をオンにすることが多いです。しかし、過去の変更履歴を追跡したい場合や、ブランチを再利用する必要がある場合はオフにすることもあります。 最終的には、チームやプロジェクトの要件に基づいて判断してください。機能を試してみて、適切な設定を見つけるのも良い方法です。 考察 まさに論点はGPTに聞いた内容といのですでに考えてました。 インサイトとしては、onにしている方が多いという情報です。 そして、onとoffのいいとこ取りはできないかと思って探していたら見つけたのがこちら。古いブランチを削除するというGithub Actionsです。 https://github. com/beatlabs/delete-old-branches-action これであれば参照頻度が低くて、再利用の可能性が低いブランチを積極的に消せます。 私の主張 ちなみに私は残しておく派。 tigで見たときにブランチの目的が追いやすいから。 そして、やっっぱりremoteにpushした情報って消しちゃいけないと思うんですよ。他の誰かがtrackingしているかもしれないのでブランチが消えると追いづらくなってしまいます。 容量は食わないし、見づらくなるぐらいのデメリットぐらいしか無いので、どんどんstockしていくのが根本かなと思います。 もし、ブランチ名を消す運用をしていて、再度同じブランチ名で別のfeature branchを作り出したときにURIの指す中身が違ってしまうというのもあるからブランチ名はレポジトリーに対してユニークになっていることも重要です。 --- ### HSTS (Http Strict Transport Security)を設定 - Published: 2023-03-12 - Modified: 2023-03-13 - URL: https://blog.teraren.com/2023/03/12/hsts-http-strict-transport-security/ - カテゴリー: Security - タグ: HSTS, HTTP Strict Transport Security, Nginx HSTSについての説明はこちらに詳しく書かれています。 https://zenn. dev/harusame0616/articles/b285a061e0c1f9 HSTSのpreloadに登録 HSTSのpreloadに登録するための設定は簡単です。 ドメイン自体のAレコードのURLに対して、HTTPヘッダを1つ追加するだけです。 HSTSのpreloadに登録するためには要件が厳しいです。以下の3つを満たす必要があります。 includeSubdomainも付加 有効期限は1年以上 preloadの指定 HSTSのpreloadのリストはグローバルで1つなのでリストの肥大化を防ぐためにもドメインレベルでしかも長期的に保持するような方針です。 nginxの場合は以下の1行を適切なブロック(serverあたり)に足すだけです。 server { add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; } Apacheの場合は以下の1行を適切なディレクティブに足すだけです。 Header add Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" 対応ドメインの登録をする場合は以下のサイトでドメイン名を入力してSubmitします。 https://hstspreload. org/ Submit後はすぐに登録されるわけではなく、保留されてから登録されるようなのでしばらく待ちます。 ホストごとにHSTSを設定する場合 上記の場合はHSTSのドメインレベルでの登録、ドメインレベルでのHSTS preloadの登録を行いました。 各ホストごとにもHSTSは設定できるので必要に応じて設定すれば良いと思います。 例えば、以下のような感じで有効期限を指定するだけのようになります。(有効期限は1週間の例) server { add_header Strict-Transport-Security 'max-age=604800'; } --- ### HHKB Proをオキシクリーンで掃除してルビング - Published: 2023-03-11 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2023/03/11/happy-hacking-keyboard-pro-clean-up/ - カテゴリー: Diary, Gadget - タグ: hhkb, hhkb pro, キートップ, 掃除, 無刻印 概要 2020年1月にHHKB Pro Hybrid Type-Sを買ってからほぼ毎日2年間ちょっと使ってきました。 最近、グリスアップが良いという記事を見たのでHHKBの掃除とグリスアップをしました。 https://amzn. to/3l636WR 掃除前 隙間に白いホコリが混入しています。ベースのほうにもゴミが溜まっているのが見えます。ブロアで頑張ってもなかなか落ちません。 キープラーで抜いていきます。 https://amzn. to/3mHSmOQ キートップを外したところ。汚いです。髪の毛も5本ぐらい溜まってます。 キーボードの汚れは油汚れだと思うのでぬるま湯でオキシ漬けします。 https://amzn. to/3mM6uXb キーボードのベース部分は分解するのが面倒なので、綿棒で掃除します。こちらも油汚れなので強アルカリ電解水の15倍濃縮液を使って汚れを拭き取ります。 https://amzn. to/3Ffse4c 綿棒は小さいのと普通サイズを用意しておくと細かいところを掃除できます。 汚い。特に、スペースバーの左右にある部分に汚れが溜まりやすかったです。キーのセンサー内部にゴミが入りかけていました。 その間に、オキシクリーンしていたキートップのつけ置きの時間が終わりました。やばいものが出てくるかと思いましたが、普通です。油やホコリが浮いてきてます。 網ですくいます。 内部に水が溜まりやすいので全部綿棒である程度吸い取ります。キッチンペーパーの上でやると良いです。 無刻印なので、どこに戻すのかがわからなくなりました。 HHKBは列ごとにキートップの形が違います。しかも、1つ1つキーの裏には型番が振られています。以下のような表がWeb上にいくつか合ったので参考ににしようとしましたが存在しない型番が7割ぐらい。残り3割が存在する型番という状況でした。 https://sisidovski. hatenablog. com/entry/2017/11/25/124457 ノギスで計測した結果、型番による違いは無さそうなのでアルファベットのキーは適当にはめました。 このキートップたちは、大まかに4種類の形があります。 キートップをはめるときにグリスアップをしました。以前、5つのキーだけ試しにグリスアップをしてみたら静音化と潤滑性が確認できたのですべてのキートップに塗ります。 グリスアップをして感じるのは、キーボードを購入した直後の滑らかな打鍵音がもとに戻った感じです。経年変化することで樹脂同士が触れ合ったときのかすかに「カサッ」となるノイズがなくなりました。 https://www. youtube. com/watch? v=EOSi1RKwuFs その反面、グリスはホコリを吸着してしまうというデメリットもありそうです。 下の写真は塗り途中。軸の外周に塗ってベース部分と触れるところに塗りました。 使ったグリスはこちら。グリスの量の割には高いですが刷毛も付いていますし、これだけ買えばすぐに使えるので良しとします。205g0という種類が良いらしいです。 https://amzn. to/3YD2HsM 205g0グリスの特性 完成図。型番による違いは無さそうで良かったです。 「キートップの型番によって表面の湾曲率が違う」みたいな書き込みがあって不安でしたが、大丈夫っぽいです。 PCを使うデスクではなるべく食べ物を食べないように気をつけてはいましたが、ホコリの混入や髪の毛の混入は避けられません。それにプラスして樹脂部分が触れ合う構造なのでその部分をメンテナンスするべきだと思うので分解掃除は1年に一回ぐらいはしたほうが良いのかなと思います。 キートップの着け外し自体にもキートップ自体に負担はかかるので頻繁にやりすぎるのも良くないかなと思います。 --- ### NURO Wireless 5G注意報:レンタルモデムの不安定さを知っておこう! - Published: 2023-02-27 - Modified: 2023-04-07 - URL: https://blog.teraren.com/2023/02/27/nuro-wireless-5g/ - カテゴリー: Network & Infrastructure - タグ: nuro, nuro 5G, NURO Wireless 5G, 不安定, 繋がらない 概要 NURO Wireless 5Gの基地局アンテナが直線距離20メートルに設置されたのでテストしてみます。 理論値で4. 1Gbps出るとのことなので期待したいです。 7日間はキャンセル可能です。 レンタルルーター 5Gアンテナとルーター、WiFi APが1つに詰まったものになります。 IEEE 802. 11axに対応しているのでWiFi-6対応です。 所感 キャリアの電波周波数が5GHzということもあり、見通しで直接アンテナが見える状態に設置したときとしていないときの差が大きいです。 特にアップロードの差が大きくて、屋外の直接見通せるところに設置すると、300Mbps, 部屋の中に設置すると40Mbps程度になります。 IPv6アドレスが振られます。先頭の64bitも動的に振られます。 ルーター本体は重いです。発熱もそこそこあります。ほんのり温かいです。冬に20度の室内で低負荷で稼働していて、表面温度が40度ぐらいです。 ベンチマーク 早速、測定してみます。 測定 屋外にルーターを置いて遮蔽物がない状態で計測してみます。無駄なCPU消費を抑えるために2GHz帯は無効化してあります。 WAN 屋外 見通し 20m LAN WiFi IEEE802. 11ax WiFi Fast. com 補足: Cloudflareのスピードテストの方は、fast. comより遅い結果となったのでnuro局内からcloudflareへの帯域が細そうです。 WiFi6は実測値でも1. 5Gbpsくらい出るのでWiFiがボトルネックにはなっていないはず。 問題点 しばらく使っているとクリティカルな問題が発生しました。 事例1 24時間ほど運用していたところ、インターネットまたはWiFiの接続が不安定になりました。ルーターの電源を入れ直して復帰しました。 WiFiにはたまに1台だけが接続されるという程度しか利用していません。というか、このWiFi APに接続していると、自然と接続が切れて既存の別のSSIDに勝手にフェイルオーバーされます。 下のスクショは、WiFiにつながっているPCからCloudflare public DNSにpingを打ってみたところです。ほとんど繋がりません。 事例2 事例1のあと4時間後にまた同じ問題が発生しました。 今回も同様にインターネットまたはWiFiの接続が不安定になりました。 しばらくpingの様子を見ていたら、調子が良くなりました。そして、また調子が悪くなったりします。 インターネット回線が調子悪いのか、WiFiが調子悪いのかを簡易的に判定するためにpingを打ち続けました。 pingの送信先はcloudflareのDNSキャッシュサーバと、モデムのLAN側に付与されているIPアドレスです。 LANのパケットがロスしていることから察するに、WiFiのアクセスポイントが調子悪そうです。 ルーターのWiFi機能が不安定なのであれば、レンタルしているモデムには有線のポートが付いているので別途自分で用意したWiFiアクセスポイントを設置すれば解決できます。 参考のために、別の固定回線の計測結果です。TTLにばらつきはありますがパケットロスは無いです。本来ならばこのぐらいの速度で安定して送信できるべきです。 事例3 10時間後、またレンタルしているモデムのWiFiアクセスポイントが不安定になった。 事例4 そのまた15時間後。レンタルモデムのWiFi APが不安定になった。ほとんど繋がらない。 左がCloudflare public DNSに対してのping結果。右がルーターのNICへのping結果。 不安定になるたびに、レンタルモデムの本体を再起動してますがしばらく時間が経過すると不安定になります。 RTTが遅い 既存の固定回線+WiFi APの平均RTTは27. 295ms --- 1. 1. 1. 1 ping statistics ---3233 packets transmitted, 3196 packets received, 1. 1% packet lossround-trip min/avg/max/stddev = 10. 485/27. 295/3520. 858/105. 505 ms NURO Wireless 5G (内蔵WiFi AP)の平均RTTは76. 733ms。 --- 1. 1. 1. 1 ping statistics ---225 packets transmitted, 225 packets received, 0. 0% packet lossround-trip min/avg/max/stddev = 14. 292/76. 733/1602. 545/205. 341 ms 遅すぎます。テレカンするには若干テンポが遅れるし、ゲームをする人にとっては耐えられないと思います。 一応、有線LANでpingを測定して見た結果。 有線LANでpingを送信した結果。 左側がルータのNICへ。右側はCloudflareのpublic DNSへ。右側はaverage 19. 818msでした。 参考のために、既存の回線でも計測してみました。 有線LANによる接続で、左側がCloudflare public DNSへのping, 右側がLANのルーターへのpingです。Cloudflare public DNSへはaverage 7. 189msでした。 nuro 5G Wirelessのほうが3倍近くTTLが遅いです。 Latencyのまとめ。 参考までに、google meetでは300ms以下であれば問題ない数値と定義している様子。このグラフは固定回線+無線LANのとき。片道だから10ms台。 静的NATができない 自宅サーバや、マインクラフトのサーバを立ち上げるときに普通に静的IPマスカレード、静的NATを行うだけでは公開できないです。 外部にサービスを公開したい場合はCloudflareといったtunnellingサービスを使う必要があります。とはいっても、安全性の面ではCloudflareを通したほうが良いのでこの点はどっちが良いとも言い切れない。Cloudflare zero trustなどを使って回避はできます。自宅サーバからCloudflareにtunnelを貼って、private networkを作成して、接続する人はCloudflareのprivate networkに接続してもらう流れです。接続の際には、予め登録してあるメールアドレスなどの認証情報を元に接続します。 初心者にはかなりハードルは高いと思います。ルーターの交換を申し出てみる 現状のWiFiが不安定に鳴る問題を共有し、(無駄なトラブルシューティングの)問答を20分ほど受けて、ルーターの交換をやっと受け付けてもらいました。 しかし、7日間のお試し期間の延長は不可能と言われました。 自分の持っている安定したWiFi APを接続して運用しても良いかなと思いましたが、1ヶ月分の課金を行って、再度検証を行うのは手間がかかるし、回線のlatencyが76msは致命的に遅いので その場で解約を申し出て、解約しました。 ちなみに、レンタルした機材を返却しない場合は、機器損害金(税込61,500円)が請求されるとのことでした。 まとめ nuro wireless 5Gのlatencyが76msもかかり遅いです。 貸与されたルーターのWiFi AP機能が不安定すぎて使えない。 --- ### Dockerを使ってHTTP3対応のnginxでホスティングしてみる手順 - Published: 2023-02-12 - Modified: 2023-02-12 - URL: https://blog.teraren.com/2023/02/12/nginx-http3/ - カテゴリー: nginx - タグ: docker, docker-compose, HTTP3, Let's Encrypt, Nginx, QUIC 概要 HTTP3に対応したサイトが全世界のウェブサイトの中で25%あるらしいです。 nginxのroadmap上では、3年前からHTTP3が入っているのに2023年2月11日現在ではまだstableでのリリースは行われていません。 HTTP3を簡単に試してみるツール類は揃ってきているので今回は、HTTP3対応のnginxを使ってどんな感じの運用になるかをテストしてみます。 設定 前提 nginxをリバースプロクシとして動かし、バックエンドとしてlocalhostの3005番ポートでRuby on Railsサービスが動いているという前提です。 nginxにはlet's encryptで取得したTLS証明書を使ってhttpsによる接続を行っています。 今回の対象サイト: https://train. teraren. com/ サーバサイドの設定 HTTP3のデフォルトでは、UDP443ポートを使います。デフォルトなだけで、任意のポートも利用できます。 とりあえず、以下のようなコマンドを打ち込んでみてUDPの443ポートが使われていないことを確認します。 % netstat -ln | grep 443 | grep udp 次に、以下のような設定ファイルを作成します。 設定ファイルの内容は適宜変更してください。TLS証明書のファイルの場所、ドキュメントrootの場所 を適宜変更します。 proxy_passに指定するバックエンドのサービスのホスト名は、docker container内から参照できるIPアドレスまたはホスト名にする必要があります。ここで、localhostと指定してもコンテナ自体のホストを指すことになってしまいますので注意してください。 そして、docker composeで立ち上げればOKです。let's encryptのファイルの読み込みにはroot権限が必要になりますが、docker自体がroot権限で実行されるようなので一般ユーザで起動してもちゃんと読み込めてます。 % docker compose up これで立ち上がります。 これで、1つのバックエンドサービスに対して2つのWebサーバが立ち上がっている状態になります。1つは元から動いているnginx、2つ目は今回立ち上げたHTTP3対応nginxです。 最後に、外部から接続できるようにfirewallやパケットフィルタの設定などでUDP 443への接続を許可します。 接続テスト ブラウザ上ではhttp2もhttp3も同じURLになります。後述するalt-svcヘッダを出力する設定を元のnginx側で出力するようにする設定が必要になります(後述) よって、まずはCLIを使ってテストしてみます。 % docker run -it --rm ghcr. io/unasuke/curl-http3:quiche-latest curl -IL https://train. teraren. com/ --http3 正常な結果 もし、HTTP3のnginxの設定が間違っていた場合は500系のエラーが返ってきます。 500系のエラー HTTP3のnginxを立ち上げたdocker composeの標準出力にアクセスログやエラーが表示されるのでその内容をチェックすれば良いと思います。 HTTP3に対応していることをブラウザへ 告知 現時点でブラウザは、httpsスキーマが指定されたらTCP 443番に対してTLSを使って接続し、HTTP 2. 0などのアプリケーションプロトコルを使って接続を試みます。 この状態では、ウェブサイトがHTTP3に対応しているかどうかわかりません。なので、このTCPで接続した際にHTTP3に対応していることをHTTPヘッダのレスポンスで返します。 以下の設定をTCPで運用している元のnginxに追加します。これにより、ブラウザはHTTP3でのサービス提供が行われているサイトということを認識できます。 add_header alt-svc 'h3=":443"; ma=3600'; 外部のチェッカー 何故かエラーになる。。。 https://http3check. net/? host=https%3A%2F%2Ftrain. teraren. com%2F 余談 自分の使っているブラウザがHTTP3に対応しているかどうかは以下のサイトなどでチェックできます。 https://cloudflare-quic. com/ 手元のBraveブラウザではなぜかHTTP3での接続が行われない状態でした。 まとめ HTTP3用nginxを立ち上げると、同じような設定を2箇所で管理しないといけないので面倒です。早くstableでHTTP3を対応してほしいです。 すでにlet's encryptで証明書を取得している場合は簡単にHTTP3を試せます。 --- ### Minecraft Server(統合版)をUbuntu上で起動する - Published: 2023-02-06 - Modified: 2023-02-07 - URL: https://blog.teraren.com/2023/02/06/post-14986/ - カテゴリー: Minecraft - タグ: bedrock, minecraft, server, Ubuntu, 統合版 概要 Ubuntu 22でMinecraftのBedrock(統合版)サーバを動かすための方法を記載します。(Bedrock版と、Java版が存在します。Java版を使っていない場合はBedrockを使えばOKです) Minecraftのサーバは無料です。Linuxの操作に慣れていれば3分ぐらいでセットアップが完了します。 手順 Bedrockのサーバは以下のURLで公開されています。 https://www. minecraft. net/ja-jp/download/server/bedrock 以下に、現時点での最新のサーバをダウンロードして解凍する手順を記載します。 % mkdir bedrock % cd bedrock % wget https://minecraft. azureedge. net/bin-linux/bedrock-server-1. 19. 52. 01. zip % unzip bedrock-server-1. 19. 52. 01. zip 起動方法 以下のコマンドを打てば立ち上がります。 % LD_LIBRARY_PATH=. . /bedrock_server サーバを停止するためにはCtrl−Cを押せばサーバを終了できます。 ポート開放 サーバ自体にfirewallが設定されている場合は、以下の内容でポートを開放して外部から接続できるようにします。 IPv4で接続する場合は、UDPの19132を開放します。 IPv6で接続する場合は、UDPの19133を開放します。 サーバが自宅などのNAT内に置かれている場合は、ルータ上でパケットフィルタの解除と静的NATの設定(=静的ポートフォワーディング)を変更してください。 このあとに、Minecraftから立ち上げたサーバのアドレスを指定してログインできれば成功です。 接続権限の設定 普通にサーバを立ち上げただけでは、全世界から誰でもアクセスが可能で、しかもメンバー権限で接続できてしまうので勝手に遊ばれてしまいます。 それを防ぐために、特定のユーザだけが接続して遊べるように設定をします。 server. propertiesをテキストエディタで開いて以下のように設定をしました。 1つ目のallow-cheatsはチートを禁止するようにする設定をしています。 2つ目はdefault-player-permission-levelでデフォルトの権限を設定します。他人が接続してきたときの権限を設定しておきます。最低の権限がvisitorしか無いのでvisitorを設定します。 > diff server. properties. default server. properties 23c23 < allow-cheats=true --- > allow-cheats=false 79c79 < default-player-permission-level=visitor --- > default-player-permission-level=member 次に、permission. jsonを編集して以下のようなフォーマットで遊べるユーザのIDを記載します。 > cat ~/bedrock/permissions. json 上記の設定例では、2人のユーザを接続可能にしています。 xuidのIDは、Minecraftのアプリからサーバに接続するとログに出力されるので、その値をコピペします。 自動起動設定 自動起動の設定をしておかないと、サーバが途中で停止したときに自動で再起動されないので遊べなくなってしまいます。だいたい数日ぐらい遊ぶと勝手にサーバが落ちてしまいます。 自動起動の設定は別の記事に書きました。 https://blog. teraren. com/2023/02/05/minecraft-bedrock-server-setup/ --- ### Minecraft Server (統合版) をsystemdによる自動起動設定 - Published: 2023-02-05 - Modified: 2023-02-07 - URL: https://blog.teraren.com/2023/02/05/minecraft-bedrock-server-setup/ - カテゴリー: Minecraft - タグ: bedrock, Linux, minecraft, system, Ubuntu 概要 Minecraft BedrockサーバをLinux上で起動させてSystemd配下でサービスを管理する設定。 Minecraft bedrockサーバはしばらく立ち上げておくとメモリを食いすぎて勝手に落ちてしまいます。勝手に落ちたら手動で起動をするのが面倒なので systemd配下で管理して勝手に再起動をするように設定します。 設定内容 以下のREADMEに書いてあるコマンドの流れで設定します。 bedrock. serviceファイルのUserやbedrockサーバの実行バイナリが置いてある場所は各自の内容に置き換えてください。 備考 以下のサイトに紹介されている方法は余計なことを色々書いてあるのであまり使いたくなかったので自分で書きました。 https://minecraft. server-memo. net/bedrock_server_install_centos8/ https://gist. github. com/gatopeich/36ed7fab3850367bbcd8e6f40becd4e5 --- ### 和暦や休日情報をREST APIで提供するサービスを公開 - Published: 2023-01-09 - Modified: 2023-01-09 - URL: https://blog.teraren.com/2023/01/09/seireki-wareki-api/ - カテゴリー: Program & Service - タグ: API, REST API, 元号 概要 以下の情報の取得や変換を行えるサービスを公開しました。 和暦→西暦変換 西暦→和暦 休日一覧 年齢 https://seireki. teraren. com/ APIの利用例 和暦を取得 今年に関する情報を取得。 % curl -s https://seireki. teraren. com/seireki/2023. json | jq { "seireki": "2023年", "wareki": "令和5年", "eto": "卯", "age": 0, "url": "https://seireki. teraren. com/seireki/2023. json" } 1950年生まれの人の年齢を取得 % curl -s https://seireki. teraren. com/seireki/1950. json | jq '. age' 73 2023年の休日一覧を取得 curl -s https://seireki. teraren. com/holiday/2023. json | jq Google SpreadsheetやExcelから利用する方法 Google Spreadsheetでは和暦を表示できません。Google App Scriptで西暦から和暦への変換プログラムを書いてよいのですが、なかなか複雑なので今回使ったサービスを使って和暦を表示してみたいと思います。 また、自分でロジックを書くと新たな和暦が登場したときにメンテナンスが必要になるという問題も発生します。 Google SpreadsheetではGoogle App Scriptを使うとREST APIの呼び出しと、JSONのパースができるようになります。 出力例とサンプルファイルのURL↓ https://docs. google. com/spreadsheets/d/1DiEUrZNH3Y7jJNrryQmRn04eMQO4zpoSHzKJg05Km38/edit? usp=sharing Google App ScriptでREST APIを呼び出します。 function getWarekiFromSeireki(year) { const url = 'https://seireki. teraren. com/seireki/' + year + '. json'; try { ContactsApp response = UrlFetchApp. fetch(url, {'muteHttpExceptions': true}); response_object = JSON. parse(response); return response_object; }catch(e){ Logger. log(e); } } その他 機能要望や不具合要望はDiscordの方へご連絡願います。 https://discord. com/channels/725542623594545233/1032168402925662229 --- ### AWS Organizationを導入した後にAWS IDを作る手順 - Published: 2022-12-16 - Modified: 2022-12-16 - URL: https://blog.teraren.com/2022/12/16/aws-organization-account-creation/ - カテゴリー: AWS - タグ: AWS, AWS Organizations 備忘録。マニュアルは長ったらしいし、ベストプラクティスがよくわからないので、以下のような感じで運用していきます。 手順 上位OUのアカウントにログイン AWS OrganizationsのページからAccountを作成(ここで言うAccountとはAWS IDのことを意味しています) https://console. aws. amazon. com/organizations/home? region=ap-northeast-1 利用するメールアドレスはエイリアス使ったほうが良いです。1メールアドレスに対して1つのAWS IDのrootアカウントしか紐付けられません。例: foo. bar+product-development@example. com https://console. aws. amazon. com/ へ行って、rootアカウントでログインをするリンクをクリックして、パスワードリマインダを送る。 https://console. aws. amazon. com/iam/home? #/home に行って、IAMのログイン用URLを作成する。 (任意) AdministratorAccessのIAMアカウントを作る。 AWS Organizationの上位OUにログインして、SwitchRoleでログインできるかを確認。 --- ### CloudFrontにてCORSを利用する際の設定方法 - Published: 2022-12-14 - Modified: 2022-12-20 - URL: https://blog.teraren.com/2022/12/14/cloudfront-cors-s3/ - カテゴリー: AWS - タグ: AWS, CloudFront, CORS, Cross-Origin Resource Sharing, S3 久しぶりにハマったので備忘録を残しておきます 問題 CloudFrondを使っている環境において、CORS (Cross-Origin Resource Sharing) に該当するリクエストが成功したり失敗したりしました。 前提の共有 サーバサイドにおけるCORSの挙動は2種類あります。 どんなリクエストに対してもCORSの設定を含んだHTTPレスポンスを返却する HTTPリクエストにOriginヘッダがあった場合に、CORSの設定を含んだHTTPレスポンスを返す。 nginxとかrailsのアプリケーションで適当に設定してしまう場合は面倒なので1番めになります。AWS S3で設定を行う場合は2番の設定になります。 そのため、2番の設定を検証するためにはリクエストにOriginヘッダを含めて検証する必要があります。 % curl -i 'https://postcode. teraren. com/postcodes. json' -H 'Origin: http://example. com' 2>&1|grep -i access access-control-allow-origin: * access-control-allow-methods: GET, HEAD また、1の場合はCDNにおいて一律クライアントに返却する場合と、CDNのorigin側でレスポンスを返すという2パターンのデプロイ方法が存在します。 このあたりのポリシーを決めた上で、設定していく必要があります。この設計によってトラブルシューティングする場所が大幅に変わってきます。 問題が起きるケース 2時間ぐらいトラブルシュートして、やっと問題がわかりました。CloudFrontをほぼデフォルトで設定した場合に起きる、以下のようなケースのときです。 HTTPクライアントがOriginヘッダを付けないでCloudFrontにリクエスト CloudFrontにhttpレスポンスヘッダも含めてキャッシュされる。(CORSのレスポンスが入らないキャッシュができる) HTTPクライアントがOriginヘッダを付けてCloudFrontにリクエスト CDNがキャッシュ済みのオブジェクトを返却。(これにはCORSが入っていない) 対処方法 CloudFrontのBehaviorsの設定において、CDN上のキャッシュのキーにHTTPリクエストの"Origin"ヘッダを含めるようにする。 Elemental-MediaPackage Managedポリシーの中で唯一Originヘッダをキーとして使うルールです。他にも細かい設定が入っているのですが、面倒なのでこれを使います。 CORS-S3Origin HTTPクライアントから送られてきたリクエストをOriginに送るヘッダです。 origin access-control-request-headers access-control-request-method PoC // This would succeed if CORS setting is correct. fetch("https://postcode. teraren. com/favicon. ico") . then((res) => res. blob) . then((blob) => { let image = new Image; image. src = URL. createObjectURL(blob); image. width = 200; image. height = 200; document. getElementById("cf"). appendChild(image); }) . catch((error) => { console. error("通信に失敗しました", error); }); https://codepen. io/matsubokkuri/pen/wvXLbzo 参考資料 https://zenn. dev/bun913/articles/cloudfront-cors-policies 余談1 BraveやChromeのDeveloper Consoleでトラブルシュートをしているときに、Networkタブにて確認しているとがOriginヘッダ無しのリクエストを出したり、Originヘッダ付きのリクエストを出したりしていました。 よくよく確認してみると、Javascriptからの呼び出しは1回なのに、リクエストが2回飛んでいました。1つは、意図した通りのリクエスト、もう1つは単にブラウザがGETしているだけのリクエスト。後者を呼び出すようなコードを書いていないので意味不明だった。 トラブルシューティングをする際に、上記の2種類のリクエストのどちらをチェックするかによって変わってくるのでそこをしっかり確認しておく必要があります。 →原因判明。上記のPoCのコードを image. src = "http://postcode. teraren. com/favicon. ico"; と書くと、CORSを考慮しない普通のGETリクエストが走ることになり、fetchとは別のリクエストが飛びます。しかしながら、ブラウザのキャッシュのメカニズムが、URLをキーとしたキャッシュになるのでCORS無しのリクエスト、レスポンスがキャッシュから呼ばれてしまうときがあります。 よって、1ページ内で外部リソースを読むときに、CORS付きでリクエストをするコードと、CORS無しでリクエストをするコードが存在する場合、予期しない挙動になります。 自分でスクラッチから書いていれば問題ないと思いますが、ライブラリレベルで外部リソースの呼び出し方が異なる場合はかなり面倒なことになります。どちらかのライブラリを使わないようにする解決方法しか無いのかなと思います。 余談2 かつて、メルカリがCDNの設定をミスって情報漏洩をしたこともあります。 https://engineering. mercari. com/blog/entry/2017-06-22-204500/ CDNの設定は、アプリケーションごとにいろいろなユースケースを考えてテストをしないといけないので、なかなか難しいです。 --- ### Rail7の推奨になったimportmap+ dartsassを使ってサービスを構築してみました - Published: 2022-12-14 - Modified: 2022-12-14 - URL: https://blog.teraren.com/2022/12/14/rail7-importmap-service/ - カテゴリー: Ruby on Rails - タグ: importmap, rails7, Ruby on Rails, サービス, 西暦 概要 Ruby on Rails Advent Calendar 2022の17日目の記事です。 Ruby on Rails 7. 0からアセット管理にimport mapsが使われるようになりました。Rails6のときに使われていたwebpackerとは大きく仕組みが異なります。 import mapsの学習のためにrails newから始めて、1つサービスを構築して公開してみました。 個人的には日本や世界のDXをに役立ったり、生活を便利にするサービスを作ることを片手間におここなっています。今回もその一環です。 今回作ったサイト 「元号くん」という名称で、西暦から和暦を表示したり、和暦から西暦を表示できます。また、各年ごとの祝日の情報を表示しています。 ただ表示するだけではRailsを使う意味があまりないのでREST APIでも同様の変換を提供できるようにしました。 サイトのURLは以下になります。https://seireki. teraren. com/トップページのスクリーンショットは以下です。 importmapとは すでに解説記事が多数あるのでそちらを参照するのが良いです。こちらの記事がとても理解しやすかったです。 JSのmoduleをimportするときに、今まではブラウザ上では相対パスでしか指定できなかったけど、importするmoduleとしてnode_moduleやURLなど色々指定できるようにする機能というかんじです。なるほど。 https://blog. mizukami. sh/entry/2022/05/23/importmap importmapの対応ブラウザ 2022年12月14日時点でグローバルで72. 9%です。古めのsafariだと対応してい無さそうです。 https://caniuse. com/import-maps サービス構築 要件定義 importmapを使う。 REST APIからも利用できるようにする。 すでに動いている自宅サーバで公開できるようにすることでサーバ費用はほぼ0円で運用する。 外部設計 大したサービスではないのでページ階層を書いておきます。 トップページ 西暦→和暦 一覧 各西暦のページ 和暦→西暦 一覧 和暦のページ 年ごとの休日一覧 年ごとのページ 内部設計 西暦と和暦を変換するgemであるwarekiを使えばかんたんに実装できそうです。 休日のマスタはholiday_jpを使えばかんたんに実装できそうです。 RDBなどのストレージは使わないで運用できそうなのでストレージの設計は無いです。 実装 まずはじめに開発サーバを作ります。dockerによるコンテナ上で開発をするので開発環境を準備します。 以下のファイルを準備します。 上記ファイルを準備した上で以下のコマンドを実行して、railsの実行にgemをインストールします。 % docker compose run --rm app bundle install 次に、railsの新規プロジェクトを作成します。なんら特殊なオプションを指定しないでrailsの推奨するテンプレで作っていきます。 % docker compose run --rm app bundle exec rails new . -C sqlite3 生成されたGemfileを覗いてみます。アセットに関連するgemは以下のものが指定されていました。 gem "sprockets-rails" gem "importmap-rails" gem "turbo-rails" gem "stimulus-rails" ここで、config/importmap. rb の初期設定を見てみます。ここに、ロードする可能性のあるJSの場所を一元管理しておくこととなります。 pin "application", preload: true pin "@hotwired/turbo-rails", to: "turbo. min. js", preload: true pin "@hotwired/stimulus", to: "stimulus. min. js", preload: true pin "@hotwired/stimulus-loading", to: "stimulus-loading. js", preload: true pin_all_from "app/javascript/controllers", under: "controllers" 1行目で書かれているapplication. jsにはstimulusの初期化が書かれています。 > cat . /app/javascript/controllers/application. js import { Application } from "@hotwired/stimulus" const application = Application. start // Configure Stimulus development experience application. debug = false window. Stimulus = application export { application } 2〜4行目にあるhotwiredの部分では、turbo, stimulusのモジュール定義が入っています。 最後の行は、pin_all_fromと書かれており、controllers以下のファイルを自動的に展開してキーとして指定できるような定義が書かれています。 controllers以下のJSの中身は以下のようになっています。stimulusで書かれたJSのテンプレが入っています。stimulusを使わなければごそっと消しても良いかと思います。 > head -n 1000 . /app/javascript/controllers/* ==> . /app/javascript/controllers/application. js . /app/javascript/controllers/hello_controller. js . /app/javascript/controllers/index. js --- ### node 18 upgrade error - Published: 2022-12-06 - Modified: 2023-02-18 - URL: https://blog.teraren.com/2022/12/06/node-18-upgrade-error/ - カテゴリー: Node.js - タグ: Node.JS Node. js v16からNode. js v18にアップグレードしたらエラーが出ました。 node:internal/crypto/hash:71 this = new _Hash(algorithm, xofLen); ^ Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19) at Object. createHash (node:crypto:133:10) at module. exports (/app/node_modules/webpack/lib/util/createHash. js:135:53) at NormalModule. _initBuildHash (/app/node_modules/webpack/lib/NormalModule. js:417:16) at /app/node_modules/webpack/lib/NormalModule. js:452:10 at /app/node_modules/webpack/lib/NormalModule. js:323:13 at /app/node_modules/loader-runner/lib/LoaderRunner. js:367:11 at /app/node_modules/loader-runner/lib/LoaderRunner. js:233:18 at context. callback (/app/node_modules/loader-runner/lib/LoaderRunner. js:111:13) at /app/node_modules/babel-loader/lib/index. js:59:103 { opensslErrorStack: , library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED' } Node. js v18. 12. 1 Node. js v17に入った問題ようです。以下の環境変数をセットすれば回避できます。 NODE_OPTIONS=--openssl-legacy-provider docker-composeでnodeやwebpackを使っている場合は以下の設定をdocker-compose. ymlへ追加すれば回避できます。 environment: NODE_OPTIONS: --openssl-legacy-provider 原因 webpackがbabelを使っていて、babelが参照しているライブラリ内でOpenSSL 3. 0の今はサポートされていないアルゴリズムかキーサイズのオプションを利用しようとした場合に出るようです。 考察 はやく、webpackerとbabelから脱却しないとですな。。。 Webpacker has been retired https://github. com/rails/webpacker --- ### githubのissueやpull requestをCSVで出力するスクリプトを書きました - Published: 2022-12-01 - Modified: 2022-12-01 - URL: https://blog.teraren.com/2022/12/01/github-issues-prs-csv-export/ - カテゴリー: Diary - タグ: csv, github, issues, oktakit, pull request 概要 特定の検索条件で、githubのissueやpull requestをCSVに出力する必要があったのでスクリプトを書きました。 APIでの呼び出しはpagingがあるのでちょとスクリプトを書かないと一覧を取得できないので面倒です。 https://github. com/matsubo/github-issue-export-script oktakitを使えばページ送りを自動でやってくれるので楽です。しかしながら、oktakitのAPIドキュメントが充実していないのでgithubのREST APIと、oktakitのソースコードを照らし合わせながら調べる必要があって時間がかかりました。 Webで検索しても単純にissueの一覧を出す程度にとどまっていますが、今回やりたかったのはフィルタ条件をいくつかのフィールドに対して設定してCSVで出力したかったのでそのようなコードが見つかりませんでした。 使い方はREADMEに記載しました。 --- ### Google Spreadsheetで特定の日の為替レートを表示 - Published: 2022-11-28 - Modified: 2022-11-28 - URL: https://blog.teraren.com/2022/11/28/google-spreadsheet-fx/ - カテゴリー: Diary - タグ: Google Spreadsheet, USDJPY, 為替レート コピペできるようにメモ。 為替レートを表示 普通にやるとテーブルが自動で作られる =GOOGLEFINANCE("CURRENCY:USDJPY","price","2022/1/1") 特定の日の為替レート 1つのセルで表現 =index(GOOGLEFINANCE("CURRENCY:USDJPY","price","2022/1/1"),2,2) 特定の日の株価を取得 為替レートと同じように株価もTICKERで取得できます。 =index(GOOGLEFINANCE("ZM","price","2022/1/1"),2,2) --- ### Google WorkspaceからOffice 365へのユーザ同期が年1回ぐらい止まる問題の対処方法 - Published: 2022-11-08 - Modified: 2023-02-22 - URL: https://blog.teraren.com/2022/11/08/google-workspace-office-365/ - カテゴリー: Diary - タグ: azure ad, error, google workspace, office 365 背景 コーポレートSEのお話。(おそらく日本に数人しか必要としないようなユースケースのネタかと思いますが) 弊社(マインディア)ではGoogle Workspaceのユーザ情報をマスタとしています。所属する部署に応じてMicrosoft Office (Office 365)のライセンスを自動付与するような運用を行っています。 3年前ぐらいに以下の記事にあるような超絶面倒な設定を行って、Google Workspace側のユーザマスタをMicrosoft Azure AD側に同期する設定を行いました。 https://zenn. dev/cestquigucci/articles/59175c03342c66 3年前はこれよりもっと面倒なことをしなければならなかったです。設定手順が煩雑すぎてブログの記事にしようと思ってましたが忙しくて頓挫しました。 トラブルシュート 事例1 定期的に同期が止まるみたいです。 2021年5月ごろに取得したスクショです。Azure ADにユーザが同期されなくなったのでGoogle Workspace側に登録してある"Microsoft Office 365"のアプリ設定画面を開いたらエラー出ていました。 ログをダウンロードしたら以下のようなメッセージが書いてありました。 "Syncing active" と書いてあるのに、失敗するのは謎です。とりあえずエラーの内容がtoken周りなので認証がおかしくなっているのかなと思って”REAUTHORIZE"を押したら直りました。 事例2 1. 5年後、またユーザの同期が止まりました。 今度はAutoprovisioningがinactiveになってました。これをactiveにして、10分ほど待ったら同期されました。 このあたり、変化が激しいので管理画面も変わっちゃっていたりします。 事例3 2022年2月。また止まりました。事例1と同じエラーです。謎です。  Error code  Error Details 17013  Generating access token for the SP failed アプリの方の一覧には、別のwarningも出ていたので要注意です。 Certificate expires on Mar 16, 2023 Autoprovisioning ON 対処としては、事例1と同じように再接続しました。3分後ぐらいにMicrosoft 365に同期されました。(一応、ユーザ情報の更新をしてトリガーも踏んでおきました) --- ### カジノのルーレットシミュレータを書いてみました - Published: 2022-11-06 - Modified: 2022-11-08 - URL: https://blog.teraren.com/2022/11/06/roulett-strategy-simulator/ - カテゴリー: Program & Service - タグ: ruby, simulator, カジノ, マーチンゲール, ルーレット 概要 ダズンベット法を使うと勝ちやすいとか書いてあるので実際にプログラムを書いて検証してみました。 「勝率が高いベッティング方法とマーチンゲール法による資金管理を組み合わせれば最強じゃね?」と思ってプログラムを書いて検証してみました。 世の中にあるカジノのシミュレータは、ベッティング方法単体、資金管理方法単体でのシミュレーターはあるのですが両方を一気に実行できるプログラムがなかったので書きました。 https://github. com/matsubo/roulett-strategy-simulator 単純な計算で出せないので、ちゃんとオブジェクト指向でアクターとエンティティを整理して書かないときれいに書けないなと感じたので、ちゃんと設計して書くのが面倒でした。 クラス図を書く必要があるギリギリの難易度くらいでした。 アプローチ 勝率の高いベッティング方法は過去の履歴を参考にして出やすい目を予測することです。 確率で考えると赤か黒が10回連続で出る確率は、 (18^10)/(37^10)=0. 00074252=0. 074252% となるので10回目に同じ色が出る確率は非常に少ないことになります。これを元に10回目は別の色に賭けるということによって勝率をあげようと言うことです。逆張りアプローチです。 単純な計算で出せないので、ちゃんとオブジェクト指向でアクターとエンティティを整理して書かないときれいに書けないなと感じたので、ちゃんと設計して書くのが面倒でした。 考察 しかしながら、全然思ったとおりに勝てないことがわかりました。 シミュレーションの結果 シミュレーションの結局、期待した結果にはなりませんでした。 9回連続同じ色が出た後に、10回目に同じもの色が出る確率は約1/2です。 以下のサイトにある通りでした。 このサイトでは再三言っていますが、カジノにおけるルーレットは過去の事象の歴史と次回の事象には関連性がない独立した事象であるという事です。 https://www. a-taichi. com/casinogamenavi/roulette/roulette9884. html 例 基本ルール 開始は200クレジット 戦略を実行するためのベットができなくなった時点で中止 毎回1クレジットをランダムに黒か赤に賭ける 360プレイ x 100日分実行した結果 この360プレイというのは、1回のルーレットの実施に2分かかると仮定して、12時間プレイすると仮定した値です。ようするに丸1日中ルーレットをした場合のプレイ数です。 ずっと黒に賭ける そもそも赤も黒も期待値は同じなので、ずっと黒にかけてみても同じになるはずなので検証。 % bundle exec ruby main. rb |grep Won | awk '{ print $2}' | awk 'BEGIN {total=0} {total += $1} END {print total/NR}' 48. 5666 48. 5666%となるので、ほぼ理論値通り。 確率は、18/37=0. 48648649 36万回実行してます。 5回連続同じ色が出たら逆張り戦略 本気で勝ちにいきたいので、ベットする金額はマーチンゲール法を用いてみます。 マーチンゲール法では、負けた分を取り返すような掛け方になるので1, 2, 4, 8, 16というふうに指数的に増えます。 ほとんどのサンプルは資産が微増するようになってます。しかしながら気になるのは、下にスパイクしたときのサンプルです。 その際に、最後の統計値を見るのが重要です。 Test suite result ---------------------- Bankrupt: 6 Bankrupt rate: 6. 0% 6%が資産不十分になってしまってマーチンゲール法を続けられなくなってます。 実世界に置き換えると、まる1日カジノに居て、16日に1回は破産します。15回は10%程度の微増です。 逆張りをしたときの勝率 36万回実行してみた結果、47. 926%でした。 Won(%): 47. 926 % 1回あたりにおける当たる確率は、18/37-19/37 = 0. 48648649なので、逆張りをしても意味が無いです。 ちなみに、ゲームへの参加率は6. 452778%でした。実際のゲームで実行するとなると空き時間が多いですね。 5回連続同じ目が出たときに、当たるまで1単位を逆張りし続けたときの資金残高はこちら。残高が0になっても止まらないように変更して実行しました。 まとめ 簡単なコードの変更でルーレットの戦略、実行回数、を変更して実行結果をシミュレーションするプログラムを作りました。 グラフでの出力により視覚的にわかりやすくして、シミュレーションに必要な各種指標を出力するようにしました。 昔、FXの自動取引プログラムを開発していたときの知識が役に立ちました。 https://diary. teraren. com/2008/01/20/metatrader-agent/ --- ### Rails7 + importmap + dartsass-rails - Published: 2022-10-16 - Modified: 2022-10-27 - URL: https://blog.teraren.com/2022/10/16/rails7-importmap-dartsass-rails/ - カテゴリー: Ruby on Rails - タグ: docker, importmap, rails 概要 Rails7のデフォルトでのアセットの管理がどの様になっているか知りたかったので rails newをしてみました。 既存プロジェクトを移行したときの差分はこちらです。 https://blog. teraren. com/2022/10/09/removing-webpacker/ 既存のソースコードの流用などがあるので変更を最小限にしたかったという思いもあってcssbundle-rails + jsbundling-rails + propshaftの構成にしましたが、やはり最新のrails newをしたときの推奨構成を知っておきたくなったため今回はrails newをしました。 サンプルのソースコード 特徴 docker-composeで動くようになっています。行った操作ごとにコミットを分けています。boostrapベースの良い感じのデザインテンプレであるbootswatchを導入してあります。rails new . -C -d sqlite3 で初期化してあります。 https://github. com/matsubo/rails7_importmap_bootswatch 作ったサービス 西暦と和暦を一覧で表示するサービスを作ってみました。 アセットの内容などを確認できます。 https://seireki. teraren. com/ --- ### webpackerを削除してcssbundling-rails+jsbundling-rails+propshaftに移行 - Published: 2022-10-09 - Modified: 2022-10-27 - URL: https://blog.teraren.com/2022/10/09/removing-webpacker/ - カテゴリー: Ruby on Rails - タグ: importmap, Ruby on Rails 概要 importmap-railsに移行したかったのですが、手元のブラウザではちゃんと動かなかったので諦めてJavascriptはtranspileすることにしました。 webpackerから移行した際の手順をまとめておきます。 https://postcode. teraren. com/ こちらのサービスで実施した内容になります。 移行手順 できるだけわかりやすいように、差分を多く掲載します。 Gemfileを書き換えます。 diff --git a/Gemfile b/Gemfile index 312e40b. . 4c2a986 100644 --- a/Gemfile +++ b/Gemfile @@ -1,13 +1,31 @@ source 'https://rubygems. org' gem "rails", '~>7. 0' -gem 'webpacker' gem 'jbuilder' gem 'puma' +# gem "sprockets-rails" + +#gem "importmap-rails" +gem 'cssbundling-rails' +gem 'propshaft' + +gem "jsbundling-rails" + +#gem "turbo-rails" + +#gem "stimulus-rails" + + package. jsonを一新します。 ついでにjQueryに依存したコードも削除下のでjqueryも消しています。bootstrapのバージョンも最新にしています。webpack関連のnpmは削除しています。 diff --git a/package. json b/package. json index 5ec1857. . 18b62d6 100644 --- a/package. json +++ b/package. json @@ -1,18 +1,19 @@ { - "packageManager": "yarn@1. 22. 15", - "private": true, + "name": "app", + "private": "true", "dependencies": { - "@fortawesome/fontawesome-free": "^5", - "@popperjs/core": "^2", - "@rails/activestorage": "^7. 0", - "@rails/ujs": "^7. 0", - "@rails/webpacker": "5. 4", - "bootstrap": "^5. 1", - "bootswatch": "^5. 1", - "jquery": "^3. 6", - "webpack-cli": "^4" + "@fortawesome/fontawesome-free": "^6. 2. 0", + "@popperjs/core": "^2. 11. 6", + "@rails/ujs": "^7. 0. 4", + "bootstrap": "^5. 2. 2", + "bootswatch": "^5. 2. 1" + }, + "scripts": { + "build": "esbuild app/javascript/*. * --bundle --sourcemap --outdir=app/assets/builds --public-path=assets", + "build:css": "sass . /app/assets/stylesheets/application. sass. scss:. /app/assets/builds/application. css --no-source-map --load-path=node_modules" }, "devDependencies": { - "webpack-dev-server": "^4" + "esbuild": "^0. 15. 10", + "sass": "^1. 55. 0" } } 設定ファイルを自動作成します。 . /bin/rails css:install:sass . /bin/rails javascript:install:esbuild JS周りの設定ファイルを書き換えます。 diff --git a/app/assets/builds/. keep b/app/assets/builds/. keep new file mode 100644 index 0000000. . e69de29 diff --git a/app/assets/config/manifest. js b/app/assets/config/manifest. js index 20b4c66. . cf7a2a5 100644 --- a/app/assets/config/manifest. js +++ b/app/assets/config/manifest. js @@ -1,3 +1,11 @@ -//= link graphiql/rails/application. css -//= link graphiql/rails/application. js +// app/assets/config/manifest. js +//= link_tree . . /images + +//= link application. js +//= link controllers/application. js +//= link controllers/home. js +//= link controllers/index. js + +//= link application. css +//= link_tree . . /builds CSS周りの設定ファイルを書き換えます。gitにファイルの置き場所が変わっているので新規作成として認識されてます。 diff --git a/app/assets/stylesheets/application. sass. scss b/app/assets/stylesheets/application. sass. scss new file mode 100644 index 0000000. . 7f0faab --- /dev/null +++ b/app/assets/stylesheets/application. sass. scss @@ -0,0 +1,8 @@ +// bootswatch +@import "bootswatch/dist/simplex/variables"; +@import "bootstrap/scss/bootstrap"; +@import "bootswatch/dist/simplex/bootswatch"; + +// fontawesome +@import '@fortawesome/fontawesome-free/scss/fontawesome'; + JS、CSS、画像の置き場所を全体的に変更します。 JS: app/javascript/pack => app/javascript CSS: app/javascript/stylesheets => app/assets/stylesheets 画像: app/javasript/images => app/assets/images アセットの呼び出し方法を変更します。 diff --git a/app/views/layouts/application. html. erb b/app/views/layouts/application. html. erb index 9290dda. . 75a118d 100644 --- a/app/views/layouts/application. html. erb +++ b/app/views/layouts/application. html. erb @@ -20,7 +20,7 @@ description. strip! - + @@ -43,32 +43,31 @@ description. strip! - - - - - 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144', skip_pipeline: true %> + 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144', skip_pipeline: true %> - 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114' %> + 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114' %> - 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72' %> + 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72' %> - 'apple-touch-icon-precomposed', :type => 'image/png' %> + 'apple-touch-icon-precomposed', :type => 'image/png' %> - 'shortcut icon' %> + 'shortcut icon' %> + + --- ### ExcelやGoogle Spreadsheetで郵便番号から住所を補完 - Published: 2022-10-09 - Modified: 2023-01-06 - URL: https://blog.teraren.com/2022/10/09/postcode-auto-fill/ - カテゴリー: Program & Service - タグ: Excel, Google Spreadsheet, 補完, 郵便番号 概要 Google SpreadsheetやExcelにて、郵便番号から住所を自動入力するAPIを作成しました。地域の郵便番号だけではなく、事業所に割り振られている郵便番号も対応しています。 以下のスクリーンショットのように、一番のA列に郵便番号を入力すると任意のフォーマットで住所を入力できます。 使い方 Google Spreadsheetで以下のような関数を入力するだけです。1600022は取得したい郵便番号を指定します。WindowsのExcel 2003以降のバージョンでは、WEBSERVICE関数でGoogle Spreadsheetと同じように使えます。= IMPORTDATA("https://postcode. teraren. com/postcodes/1600022. txt") 郵便番号を別のセルから参照するためには以下のように郵便番号の部分に変数を使います。 = IMPORTDATA("https://postcode. teraren. com/postcodes/"&A2&". txt") 住所の全体ではなく、一部だけを取得したい場合はpartパラメータを付与します。 = IMPORTDATA("https://postcode. teraren. com/postcodes/1600022. txt? part=1") partパラメータの説明は以下です。 1: 都道府県2: 市町村区3: 町域4: 番地5: 名称 サンプルのファイル API仕様 郵便番号をパラメータとしたURLを呼び出すと、住所の文字情報が返却されるAPIです。 > curl https://postcode. teraren. com/postcodes/1600022. txt 東京都新宿区新宿⏎ 以下のページにAPIの詳細を掲載してあります。 https://postcode. teraren. com/doc/redoc#tag/Postcode/operation/getPostcodeText --- ### RailsのアクターがN:Mのシステムを作るときの権限モデル - Published: 2022-10-08 - Modified: 2022-10-08 - URL: https://blog.teraren.com/2022/10/08/rails-permission-metrics/ - カテゴリー: Ruby on Rails - タグ: pundit, Ruby on Rails 背景 手元で作っているRailsのサービスの要求が肥大化してきたので、権限モデルをちょっと整理してみました。 権限が複雑になる原因は、メトリックが多くなること。要件レベルでどれだけメトリックを減らせるかが重要。 ビジネスで利用するサービスの場合、細かい権限設定が要求されるのでメトリックが増えやすい。 今回扱わなければいけないメトリックは以下 アクターロールマスタデータのステータス遷移Webから操作 or APIから操作 メトリックが3つ以上になった時点で直交表が作成できなくなってしまう。 メトリックが3つであれば、直交表を複数作ればギリギリ対応できるが、4つになると表現が厳しい。 アプローチ クリーンアーキテクチャのレイヤと比較して、このような感じで考える。これ以上メトリックが増える場合は、独自にビジネスロジックのレイヤーを追加するなりして対応する必要がある。 メトリックが4つになった時点で、権限をわかりやすくまとめろと言われても不可能に近い。 --- ### Appleで買ったSIMフリー端末が「SIMロックあり」になったので解除した話 - Published: 2022-07-20 - Modified: 2022-08-12 - URL: https://blog.teraren.com/2022/07/20/apple-sim-free-locked/ - カテゴリー: iPhone - タグ: Ahamo, IMEI, macos, nano SIM, SIM, SIM Free, SIMロック, SIMロックあり, アップルケア, アップルストア, 楽天モバイル 概要 日本のApple公式サイトからiPhone XS 256GBを買いました。Apple公式サイトから購入すればSIMフリーのはずなのですが、「SIMロックあり」という表示が出るようになってしまいました。楽天モバイルのSIMを挿していて使える状態でした。Webの書き込みを見てみると、表示はSIMロックと書くかれていますが、実際にはされていないという書き込みを見たので、AhamoのSIMを挿してみたところ、「SIMロックあり」の表示はそのままですが、AhamoのSIMが使えたので実質はSIMフリーのようです。どっちにしろ、この端末を売却したいので「SIMロックあり」という表示は消したいので、その方法を書いておきます。 時系列の整理 2018年9月: iPhone XS 256GBをAppleストアで購入2019年8月: Face IDが使えなくなったので、保証期限内のため、Appleのサポートへ送付したら交換ということになって新品のiPhone XS 256GBが送られてきた。2019年9月: DoCoMoの物理SIMを入れて利用開始2021年x月: 楽天モバイルにMNPして楽天モバイルの物理SIMを入れて利用開始2022年6月: 「SIMロックあり」という表示が出ていることに気づいた。しかし、実際にSIMロックされているかを検証したところSIMロックはされていない状態であり、表示だけがSIMロックありとなっている。 参考資料 こちらの記事によると、Appleにしか解除できないという記述があります。上記記事の端末は、表示もSIMロックとあり、本当にSIMロックが掛かっていますが、私の端末はSIMロックという表示だけですが実際にはSIMロックはかかっていません。こちらの記事では、SIMロックありという表示は嘘で、実際はSIMフリー。iOSの不具合で新しいiOSのリリースを待つ必要があるという結論です。 私はこのiPhone XS 256GBを売りたいので、SIMロックという表示があると値段が低くなってしまうので、なんとしても「SIMロックあり」の表示を外したいのです。 やったこと Appleへの問い合わせ Appleのサポートと電話で話した結果はこちら↓ 「SIMロック」はキャリアがかけるものだからAppleではどうしようもできない。関連する記事はこちらだから、こちらを見て1つ前のキャリアである楽天モバイルにSIMロックを解除を依頼して!https://support. apple. com/ja-jp/HT201328 という感じでした。 1つ目の記事にある内容とは異なる回答が返ってきました。 反論しようにも、反論する材料が上記のWebサイトしか無いので、とりあえずAppleのサポートの言う通りにしてみます。 楽天モバイルへの問い合わせ 1時間20分にも及ぶ、長いチャットの結果、DoCoMoへリダイレクトされました。。。。 ここに至るまでに、たくさんの見当違いの質問をされて、反論したい気持ちを抑えながら回答を淡々と繰り返していたのに、この結果です。 SIMロック解除に必要であろう、IMEIも聞かれることはなかったです。たぶん、楽天モバイルの担当者は全く仕組みを理解していないことが想定されます。そもそも楽天モバイルはSIMロックが総務省に寄って禁止される頃に登場した事業者なのでSIMロックを行うユースケース自体が存在していない可能性があります。 もし、この後にドコモへ問い合わせて解決できなかったらたらい回し状態になってしまい、何が真実なのかわからないし、問い合わせ先もよくわからなくなってしまいます。 楽天モバイルのサポートとチャットをしながら、同時に裏でググっていたらドコモはWebからSIMロックの解除申請を行えるという記載を見つけました。 https://www. docomo. ne. jp/support/unlock_simcard/ DoCoMoでSIMロック解除申請 dアカウントが必要になるので、自分のdアカウントでログインして申請してみました。 IMEIを入力するだけで申請できました。しかも、確認画面で端末の情報が表示されてます。DoCoMoに提供した覚えはない情報なのでどううやってドコモが知り得たのか謎です。IMEIからハードウェアを特定する手法があるのかなと思います。(関連付けされた機種のストレージ容量は間違ってますが。。。) すんなりと申請は完了。 この状態では、まだ申請だけしか行っていないです。 iPhoneの場合は「メッセージR」というものが送られてくるのでそれが来たら完了するらしいです。(メッセージRはtypoで、SMSのことだと思います) SIMロック解除を実施するためには、他社のSIMカードなどの挿入や設定をした上で、お手続き完了画面に表示されるSIMロック解除コードを入力してください。また、一部端末においては、SIMロック解除コードの入力は不要です。【iPhone/iPadのみ】メッセージRの配信設定の有無に限らず、解除準備完了後に準備完了をお知らせする旨のメッセージRを送信いたします。メッセージR受信後にお客さまご自身で解除処理(端末へ他社SIMを挿入)をお願いいたします。メッセージRが届かない場合、お客さまから再度お申し出の必要があります。 ちなみに、Ahamoでも同じようにSIMロック解除の説明ページがありますがリンク先はDoCoMoのSIMロック解除ページに飛びます。 IMEIに関して imei. infoというサイトでIMEIを入力したらハードウェアの情報が表示されたので、IMEIとハードウェア情報の関連付けは公開情報のようです。 DoCoMoでSIMロックを解除申請その後 結局、DoCoMoのサイト上でSIMロック解除申請をしても、結果を受け取れる手段が無いから結果がわかりません。 1週間後に、試しに端末を初期化してみましたが相変わらず「SIMロックあり」の表示で解決していません。 なので、DoCoMoへ問い合わせてみたら、「機器を販売したAppleに問い合わせてね」という回答。振り出しに戻った。 どの会社も明確なSIMロックの構造を理解していない。こちらの時間をかなり消費する。ほんとムカつく。しかし、まだ問題が誰にあるのかがわからないので根本的に誰が間違ったことを言っているのかがわからない。 Appleサポートへ2回目の問い合わせをしてみました。 1回目は、軽く鼻で笑われたような対応をされましたた(しかも結果として不適切な回答だったのでダブルでムカつく)が、今回対応してくれた人はちゃんと対応してくれている印象です。 ここで、普通のサポート窓口ではなく別の上位部署にエスカレされました。 その結果、以下のページに有るようにMacosにiPhoneをつないでリカバリーモードで初期化を試してほしいとのことでした。 https://ahamo. com/support/procedure/other/unlock-sim/index. html その場で言われた手順を実行してトラブルシュートをしたかったのですが、サポートとの電話を開始してからすでに40分程度経っていて、別件のミーティングが始まるので私の持ち帰りの宿題として、電話を切りました。 そして、上記のリカバリーモードを試してみましたが状況は変わらず、「SIMロックあり」でした。 Appleサポートへの問い合わせ3回目 2回めに対応してくれた人とは別の人です。引き継ぎもされているはずなのですが、あんまり引き継がれていない模様です。 今まで試したことを確認されたり、販売経路を確認されたりと今までも何度も言ってきたことをすべて再確認されました。。。。 「なぜ楽天モバイルに問い合わせたのか?楽天モバイルで買った端末じゃないから、問い合わせても意味が無いのに。」と言われ、「Appleに言われたから。。。(怒)」という感じの問答を何回か繰り返しました。 そして、Apple社内でもこの問題に対して、ステップバイステップで対応マニュアルがあるらしくて、最終ステップがこのリカバリーモードでのリカバリーを行うことだったとのことでした。 これを行っても状況が変わらないとなると、Apple側で再度社内調整を行った上で再度、状況ややったことの手順をヒアリングする電話を後日行うとのことで電話を切られました。 やっと前に進んだ感じはあります。 30分ほど使いました。 Appleサポートとの会話 4回目 1日後に電話が来ました。 なんか、サポートの人の説明が分かりづらかったです。Apple社内で「SIMロックを解除するための申請」をしたとのことで、その結果が出るのに1〜2日かかるとのことでした。 終わったら連絡が来るとのことでした。 10分使いました。 Appleサポートとの会話 5回目 2日後に電話が来ました。 担当者が休みを取っていたようで、2日後の連絡となってしまったようです。 そして、「Appleの別部署にて、"申請"の確認が取れたので、申請をしたその日のうちにSIMロック解除の設定を行った」との連絡が来ました。 確かに、「SIMロックあり」という表示がなくなりました。これにて一件落着です。 後学のためにいくつかAppleのサポートの人に質問をしてみました。 Q: WiFiに接続しているだけ(=キャリアのSIMを使わない状態)で、「SIMロックあり」の表示が「SIMロックなし」になった。SIMロックの情報を端末に反映するにはキャリアのネットワークは不要という理解で正しいか?A: 正しい。WiFiでもSIMロックに関する情報は伝搬される。 Q: そもそも、なんでAppleがSIMロックの解除とかそういうのを管理しているの?A: 普通はAppleで管理しない。SIMロックはAppleとは別の所で管理されている。今回のような何が原因かよくわからない状態でSIMロックになってしまった場合は、Apple社内でいろいろな承認を得るとSIMロック解除を行えるようになっている。 まとめ Web上には様々な状況や解決策がありましたが、結局はこちらの方と同じ解決策でした。最終的には無事に「SIMロックあり」の表示が消えたので良かったです。調査などを含めると8時間近く消費しました。 --- ### MegaRAIDの節電機能 - Published: 2022-06-30 - Modified: 2022-07-01 - URL: https://blog.teraren.com/2022/06/30/megaraid-eco/ - カテゴリー: Server software - タグ: DELL, HDD, MegaRAID, SSD, 節電, 自宅サーバー 概要 サーバの平均消費電力が80Wぐらいです。金額にすると約2000円/月。 主に電力を食うのはCPUかディスク。CPUはさほど使われていないのでおそらくハードディスクが電力を食っているような気がします。 HDDを4台搭載したファイルサーバなのでほとんどディスクは稼働していないので、ディスクをスピンダウンして節電しようと考えました。strocli経由で節電モードを操作で来そうなのでやってみます。 現状の設定を確認 なんと、ハードウェアが未対応。。。 > sudo /opt/MegaRAID/storcli/storcli64 /c0 show ds Controller = 0 Status = Failure Description = None Detailed Status : =============== -------------------------------------------------- Ctrl_Prop Value -------------------------------------------------- DS Adapter does not support Power savings. -------------------------------------------------- ちなみに、dsとはDimmer Switchの略で、節電モードのことです。 有効化してみる まぁ、エラーになるのですが一応試してみます。 > sudo /opt/MegaRAID/storcli/storcli64 /c0 set ds=off type=4 Controller = 0 Status = Failure Description = does not support PowerState ホットスタンバイのHDDが2台無駄に動いているのが悲しいですな。 --- ### おすすめの技術記事15本ピックアップ - Published: 2022-06-07 - Modified: 2025-01-06 - URL: https://blog.teraren.com/2022/06/07/popular-tech-article/ - カテゴリー: Diary - タグ: hack, technology, 技術記事 概要 エンジニアとして知っておくべき知識や便利な設定を紹介します。 小規模オフィスのネットワーク構築 https://blog. teraren. com/2019/10/04/building-small-office-network/ 航空会社のマイルを管理するシステム https://blog. teraren. com/2022/02/03/point-system-design-rdb/ MySQLにおけるデータの境界値 意図した値が出てこない可能性があるので知って置かなければまずいこと。 https://blog. teraren. com/2019/07/02/sql-between-boundary/ Githubの通知を便利にする https://blog. teraren. com/2021/01/19/github-mention-slack/ 周りに迷惑をかけないようにするファイル転送方法 https://blog. teraren. com/2010/10/28/rsync-bwlimit/ RailsのTimezoneの扱い Railsに限らず、i18nをするときには知らないといけないこと。 https://blog. teraren. com/2016/09/29/rails-timezone/ Railsのエラーページをかっこよくする https://blog. teraren. com/2017/02/15/make-rails-404-page-fancy/ 並列処理で速度が出ない場合 https://blog. teraren. com/2017/02/03/xargs-concurrent-execution/ 上記の応用 https://blog. teraren. com/2010/12/09/%e5%86%8d%e5%b8%b0%e7%bd%ae%e6%8f%9b%e3%81%99%e3%82%8b%e3%82%b7%e3%82%a7%e3%83%ab%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e5%90%8d-%e3%81%a8-%e4%b8%ad/ https://blog. teraren. com/2015/12/15/mogrify-imagemagick-recursive/ エンジニアならすぐに知る必要があること https://blog. teraren. com/2013/04/05/external-ip-address/ 業務用ルータを家庭で使う とても安定しますし、速度も出ます。しかも中古なら安い。 https://blog. teraren. com/2015/12/21/rtx1200-deployment/ CLIで集合演算 年に数回使います https://blog. teraren. com/2012/11/09/element-calculation/ Intelとarm(M1,M2)向け設定共通化 https://blog. teraren. com/2022/05/02/arm-intel-docker-compose-in-the-same-file/ https://blog. teraren. com/2022/05/11/chromedriver-on-arm/ コーポレートSEネタ GoogleのCloud Identityで会社のPCやスマホを管理する方法とか設定例。 https://blog. teraren. com/2022/02/03/google-cloud-identity/ 自分の居場所を自動でアイコン表示 https://blog. teraren. com/2022/02/03/show-current-location-icon/ PCが調子悪いと言われたときのトラブルシューティング https://blog. teraren. com/2021/06/11/cpu-high-load-caused-by-heat-issue/ ActiveRecordのTransaction例外処理 https://blog. teraren. com/2021/02/01/activerecord-transaction-nest/ zoomの脆弱性を見つけた時の話 https://blog. teraren. com/2020/06/29/zoom-vulnerability/ 回線が遅いなと思ったら調査すること https://blog. teraren. com/2020/06/17/speedtest-benchmark-mackerel/ AWSでサイトメンテナンス表示 https://blog. teraren. com/2019/03/05/nginx-site-maintenance-setting/ --- ### 過去に立ち上げたサービスのまとめ - Published: 2022-06-07 - Modified: 2022-06-28 - URL: https://blog.teraren.com/2022/06/07/built-services/ - カテゴリー: Diary - タグ: service, 個人サービス 概要 過去に立ち上げたサービスを紹介します。 稼働中 駅・路線 REST API https://blog. teraren. com/2022/05/21/ekidata-api/ 銀行コード、支店コードAPI https://blog. teraren. com/2015/02/01/japanese_bank_code_branch_code_api/ 郵便番号API https://blog. teraren. com/2015/02/11/postcode-api/ 利用者はいないと思いますが、GraphQLにも対応しています。 https://blog. teraren. com/2021/02/07/api-graphql-postcode/ covid-19新規陽性者の都道府県ごとグラフ https://blog. teraren. com/2020/11/17/covid19-japan-graph-feed/ AKB勝手にランキング https://matsu. teraren. com/ranking/ 確認くん IPv4、IPv6対応の自分のグローバルIPを表示するサービス。curlでアクセスするとIPアドレスだけ返ってきます。 https://kakunin. teraren. com/ サービス停止・更新停止 Facebook pageのlike数をトラッキング https://blog. teraren. com/2013/11/17/facebook-page-like-tracking/ CSSで絵文字を表現 https://github. com/matsubo/emoji-sprite mixi2rss https://diary. teraren. com/2009/07/23/mixi-diary-feed/ --- ### 読み物系記事のおすすめ15本ピックアップ - Published: 2022-06-07 - Modified: 2025-01-06 - URL: https://blog.teraren.com/2022/06/07/popular-story-article/ - カテゴリー: Diary - タグ: おすすめ, ポエム, 人気, 読み物 概要 このブログは開設から約19年経過しました。良い記事が埋もれてしまっていてもったいないので、個人的に過去に人気があったおすすめ記事を5ページ紹介します。 1位 日本のインターネットの父。慶応大学最終講義。 事あることに、読み返しています。インターネットに関わる仕事をしている方はインターネットの成り立ちと理想を鑑みれる質疑応答です。はてなブックマークで1175件ブックマークされてます。ホットエントリーにも掲載されました。 https://blog. teraren. com/2020/01/25/mj-last-clsas-text/ 2位 tmux-powerlineでおされにする tmux powerlineは今でもこの設定に近いです。 https://blog. teraren. com/2013/02/10/moteru-tmux-powerline/ 3位 価値観的なもの スタートアップをやろうとしている方へ向けての1つの考え方をまとめました。 https://blog. teraren. com/2020/12/14/before-the-startup/ こちらも合わせてどうぞ。上記をリバイズしたバージョンです。 https://note. com/yuki_matsukura/n/n08e53fdfd84d 4位 3rd party cookie周辺の内容 調査してみた内容のまとめです。世界のプライバシー保護への温度感がつかめます。 https://blog. teraren. com/2022/06/03/ad-accuracy-and-3rd-party-cookie/ 5位 写真や動画を安全に長期間保存する 「機密性」「完全性」「可用性」を程よく満たして写真や動画などの大容量データを安全に保管する方法。 https://blog. teraren. com/2020/03/17/photo-backup/ 6位 Singletonは嫌いです 最近はOOP (オブジェクト指向プログラミング) の知識レベルの底上げがあり、見ることは少なくなりましたが、10年前はSingletonが多く見られました。 https://blog. teraren. com/2012/11/20/evil-singleton/ 7位 中小企業共通EDI 商取引に関わるシステムのときのモデルや、ビジネスの一般慣習を学べます。 https://blog. teraren. com/2019/08/10/edi/ 8位 クレカの頭6桁の仕様 クレジットカードのBINコード https://blog. teraren. com/2014/08/06/credit-card-bin-code/ 9位 転職プラットフォームの価値を考察 https://blog. teraren. com/2020/07/27/job-change-platform/ 10位 ミル挽きコーヒーメーカー https://blog. teraren. com/2019/05/28/office-coffee/ 11位 私が考える要求定義の流れとアウトプット https://blog. teraren. com/2019/04/08/request-definition/ 12位 英語勉強の浅いノウハウ https://blog. teraren. com/2019/03/21/english-learning/ 13位 コストコで買うものルーチーン https://blog. teraren. com/2019/05/23/costco/ 14位 一応、私はエストニアの電子国民です。 https://blog. teraren. com/2018/02/09/e-residency/ 15位 LINE詐欺をやってる人のIPアドレスを暴いてみた ネタ的なかんじ https://blog. teraren. com/2014/07/06/line-fraud/ --- ### 広告配信精度とプライバシー保護に関する法律と技術のまとめ - Published: 2022-06-03 - Modified: 2022-06-07 - URL: https://blog.teraren.com/2022/06/03/ad-accuracy-and-3rd-party-cookie/ - カテゴリー: Business - タグ: 3rd party cookie, Ad Network, Adsense, Adwards, FLoC, google, Topics, リタゲ, 広告 2022年5月に社内でLTした内容をまとめておきます。きっかけはGoogleのFLoCを調べていたら、FLoCを取り巻く歴史などの情報がまとまっていなかったのでまとめていました。 背景 プライバシーを守るための法律が制定されつつあります。 EUGDPR (General Data Protection Regulation)2018年5月25日から適用開始Webサイトを見ていると「Cookie取得の同意」のポップアップ表示を見かけると思います。それはGDPRに準拠するためという目的がほとんどです。USCOPRA (Consumer Online Privacy Rights Act)大統領の署名待ち。署名後180日で施行日本改正個人情報保護法3年毎に更新。2022年4月に更新 問題 インターネット上の広告業界にとって、ユーザの個人情報の取得が困難になるので、ディスプレイ広告のターゲティング精度が落ちます。 ユーザにとってはプライバシーが重視される一方、ターゲティングの精度が落ちることになるので関連度の低い広告が表示されるようになります。 根底としては以下の相反する要求があります。 広告ターゲティング精度 VS プライバシー 背景技術の説明 この広告業者がユーザの情報を集めるために使っている技術が3rd party cookieという仕組みです。 1st partyは自分、2nd partyは閲覧しているウェブサイト、3rd partyとは広告配信業者に当たります。 昨今のChromeやEdgeでデフォルトである3rd party cookieが有効になっていると、ユーザはウェブサイトを閲覧しているだけで、ユーザが意図しないところで広告配信業者に情報を共有されてしまっている状態になります。 3rd party cookieによって広告配信業者に情報が渡る流れ 図にすると以下のような流れになります。 ユーザが広告のJavascriptコードが付いている健康器具のウェブサイトを閲覧する。ブラウザがそのコードを実行して広告配信業者にアクセスし、広告配信業者はcookieを送信する。広告配信業者から指示されたcookieをブラウザが保存する。別のサイトをユーザが表示する。同じ広告配信業者の広告のJavascriptコードが付いているウェブサイトを閲覧する。別のサイトにアクセスしている情報と共に広告配信業者へ送信される。広告配信業者はユーザがアクセスしたページのアクセス履歴を保存し、そこからユーザに適した広告を配信する。 3rd party cookieが禁止されるとできなくなること 広告配信業者がユーザのアクセス履歴を取れなくなります。 広告配信側アクセスしている人のアクセス履歴などの情報を取得できなくなるターゲティングできなくなるリタゲできなくなるエンドユーザ第三者に自分のアクセスログに近いものが保存されなくなる関連度の低い広告が表示される。 3rd party cookieに対しての各ブラウザの方針 3rd party cookieを無効safariEdgeBraveFirefox3rd party cookieが有効Google Chrome (2023年末に終了すると発表) Googleが全方面で強い では、なぜGoogle Chromeだけが3rd party cookieを無効にしていないかというと、Googleは広告配信を行っているので3rd party cookieが無効化されると広告収益が落ちるるからです。 Google Chrome以外は広告収益への関連が無いのですぐに3rd party cookieを無効に動きました。 Googleは1st party cookieを埋め込めるようなソリューションや、自分自身のメディアを持っています。 また、Google Analyticsはウェブサイトに1st party cookieを埋め込んで居るのでGoogle Analyticsが裏側で値を突合していたら同じことが物理的には実現できてしまいますができないでしょう。Gmailも同様です。Google社の内部統制を信じるしか無いようなユーザにとっては危うい状態です。 まさに、この危うい状態になるのを防ぐための法律が最初に挙げた法律なのかなとも思います。 YouTubeに関しては、バーティカルなメディアなので自サイトで個人情報を集め、広告配信に利用できます。他社からの広告は期待できませんが、自社のアドネットワークだけで十分収益を得られるのでビジネスへの影響は無いでしょう。 Googleだけが3rd party cookieはいきなり廃止できない 広告配信業者がほぼGoogle一強になっているため、3rd party cookieが問題になります。 もし、広告配信業者が数万社とか存在していたら、個人情報が一箇所に集まるような構図にならないので3rd party cookieを禁止するというところまで行かなかったかもしれません。 よって、Googleは3rd party cookieの廃止には超絶反対の立場ですが、流石に世論はプライバシー保護の流れになっているので対応する必要が出てきます。 3rd party cookieが無くなったらどんな技術を使ってユーザに最適な広告を提供するか?がまさに現在進行系で問題になっていて、3rd party cookieとは別にプライバシーに考慮したターゲティング技術を作ることを行っています。 Googleが取ったアプローチ Googleが新たに考えた技術がFLoCとTopicsの2つになります。タイムライン的には以下のような流れになります。 2021/3/30Google ChromeでFLoC(Federated Learning of Cohorts) を試験運用開始と発表 2022/1/25FLoCの開発を中止し、Topicsの技術テストを年内に行うと発表 次に、FLoCとTopicsの概要を説明します。 FLoC(Federated Learning of Cohorts) FLoCの最初の部分である、"Federated Learning" の説明をします。 Federated Learningの説明 呼び方: フェデレイテッド・ラーニング、連合学習抽象度高めの概念流れ青丸: 初期モデル構築多数のエンドクライアントに配布エンドクライアントがモデルを修正エンドクライアントで作ったモデルを集めて集計して初期モデルを再構築ユースケース例: 日本語IMEの予測変換モデル https://ai. googleblog. com/2017/04/federated-learning-collaborative. html Cohortの説明 > コーホートとは、共通した因子を持ち、観察対象となる集団のこと。Wikipedia 文脈としてはコホート法のほうが近い。 FLoC(Federated Learning of Cohorts) の説明 コホートのフェデレイテッド・ラーニング訳: 集団ごとにフェデレイテッド・ラーニングを適用するhttps://wicg. github. io/floc/W3Cの仕様はworking draftの状態. コホート(集団)は興味ごとに生成される。=> 自分でコホートのIDとバージョンを取得できる。 W3Cに掲載されている、サンプルコードはこちら。ユーザのコホートのIDを取得するコード。この取得したIDを広告配信業者に送信して、広告配信業者はそれに対して最適な広告を配信する。 FLoCの動作の流れ FLoCの問題 FLoCのデータが個人を特定できる情報と紐付けられる可能性=フィンガープリンティングリスクトライアル中に3万グループが作られたことにより、特徴的な行動をする場合は個人が特定されてしまうぐらいになる。 ユーザのプライバシー保護ができそうな手法だったにも関わらず、実証実験をしてみたら意外とプライバシーが守られなかった手法となってしまいました。 個人的には、Cohortの粒度を調整することでプライバシーの調整できるので技術的には問題は無いと思います。 それより、根底にはCohortを管理しているGoogleのコンプライアンスを信じるしか無い状態になっていることが問題になるのかと思います。 Topicsの説明 FLoCと比較して、Topicsは非常にシンプルです。 Topicsの概要 ユーザーの過去3週間の閲覧履歴に基づき、ユーザーが関心を持つ3つのトピックを広告主へ送信ユーザは送信した内容は確認可能ユーザは送信する内容を変更可能 Googleが発表しているプロトタイプのスクリーンショット。 Topicの考察 かなりユーザのプライバシー保護に寄った手法です。 広告配信側ターゲティング精度がかなり低くなるデモグラなどのターゲティングも不可能「ユーザの情報ではなく、表示する場所に関連した広告が増える」と思う「DMPが消えることになるのと同義」かなと思うユーザ側開示する情報を完全にコントロールできるので安心興味のない広告が表示されることが多くなる 他の事例 では、プライバシーに考慮したブラウザという謳い文句のBraveはどうやってユーザのプライバシーを保護しながら効率的に広告を配信しているのか疑問に思ったので調べてみました。 An Introduction to Brave’s In-Browser Ads 流れは以下のような図です。 https://brave. com/intro-to-brave-ads/ 広告をBraveの広告配信サーバに登録するBraveブラウザは全部の広告をダウンロードするBraveはユーザの興味モデルをブラウザ内で生成するユーザが閲覧しているサイトをトリガーとして、ブラウザ内で最適なタイミングと最適な広告を計算して表示する 広告の量が増えたらどうなるんだろうという疑問はありますが自分の情報が外に出ないので安全です。広告の配信に関しては非効率ですし即時性も無いのでちょっと微妙な感じはあります。 やはり両立は難しいです。 余談ですが、私はGoogle ChromeからBraveに半年ほど前に移行しました。 異業種ペルソナマーケティングAI推進協議会 アカデミック分野でもGoogleと同じように研究が進められています。 https://ai-persona. jp/ この場合、1st partyのサイトがユーザモデルを作ってそれを共有することでプライバシーに配慮しつつターゲティングの精度をあげようという試みかと思います。 完全に余談ではありますが、私が卒論(18年ほど前)で書いた「ユーザの行動を行動モデルに抽象化して利用する」というアプローチと同じです。 総括 アカデミック普通は研究の世界では世の中の数年〜10年先を行くのが普通だが、プライバシーの分野では現在進行系の社会課題を研究対象としている。 1st party dataを3rd partyがかなり使いづらくなる例:自社で広告案件を獲得して配信例:外部には具体的な情報を渡しづらくなるので、マクロなデータを渡す。バーティカルなサービスが重宝されそう。1st party dataを持っている会社が広告配信を行う。YouTubeやTikTokみたいなメディアが強くなりそう。 Web3の流れGAFAMが情報を持ちすぎることで力を持ちすぎる問題に対処するためにも、情報の管理をより個人に持ってくる動きが強まると予想。個人情報を集めて収益化してきたGoogle, Facebookは広告ビジネスが辛い事になりそう。だから、VRに力を入れたり、別のソリューションに力を入れたりしている。個人情報はローカルまたは暗号化された状態でクラウドに持ち、物理的に自分がコントロールできる状態になるだろう。メールで言えば、Gmail => Proton mail --- ### FakerやGimeiのseedをrspecのseedと一致させる - Published: 2022-06-02 - Modified: 2022-06-02 - URL: https://blog.teraren.com/2022/06/02/rspec-seed-unstable-result/ - カテゴリー: Ruby on Rails - タグ: rspec, ruby, Ruby on Rails, unit test 概要 rspecにおいて、単体テストの順番や使うデータをランダム化してテストパターンを増やすために config. order = :randomを有効化するのは普通かと思います。テストが失敗したときに、rspecコマンドの--seedオプションでランダム生成器のseedを固定してデバッグするときがあると思います。今回は、seedを固定してもテストが失敗したり成功したりして不安定でした。そしたら、乱数生成のseedはFakerやGimeiは各ライブラリ内で乱数発生器のインスタンスを作っているのでランダムに生成された値に依存したテストがユニークになりませんでした。 問題が起きたテスト FactoryBotで以下のようにエンティティを生成したうえで、このエンティティのページングをテストするコードでした。 ページングする際には、codeカラムでsortされているので生成される値がランダムになるとテストのときに検証する値が予期しないものとなってしまいます。 FactoryBot. define do factory :product do code { Faker::Alphanumeric. unique. alpha(number: 20) } name { Gimei. prefecture. kanji } end end rspecコマンドに--seedを渡してもFakerやGimeiで生成した値が固定されないことが問題でした。 実際にはこの問題を見つけるのに2時間ぐらいかかりました。結果だけ書くのは簡単ですが、見つけるのは結構大変です。 実装が正しいのか、テストが正しいのかわからない状況で検証を進めるのは結構大変なものです。しかも、seedオプションを渡しても検証したいコードの結果が変わったりするので辛かったです。 (そもそも、そんなカラムでソートしている実装なんて知らなかったし。natural orderで帰ってきていると思っていたという思い込みもあり。) 解決策 差分 GimeiやFakerにrspecで使っている乱数生成器を渡してあげれば良いです。GimeiやFakerを使っている場合は必ず入れるべき設定です。 --- a/spec/spec_helper. rb +++ b/spec/spec_helper. rb @@ -91,5 +91,11 @@ RSpec. configure do |config| # # Setting this allows you to use `--seed` to deterministically reproduce # # test failures related to randomization by passing the same `--seed` value # # as the one that triggered the failure. + Kernel. srand config. seed + + require 'faker' + Faker::Config. random = Random. new(Random. seed) + + require 'gimei' + Gimei. config. rng = Random. new(Random. seed) end 結果 spec/spec_helper. rbはこんな感じになります。 # # Run specs in random order to surface order dependencies. If you find an # # order dependency and want to debug it, you can fix the order by providing # # the seed, which is printed after each run. # # --seed 1234 config. order = :random # # # Seed global randomization in this process using the `--seed` CLI option. # # Setting this allows you to use `--seed` to deterministically reproduce # # test failures related to randomization by passing the same `--seed` value # # as the one that triggered the failure. Kernel. srand config. seed require 'faker' Faker::Config. random = Random. new(Random. seed) require 'gimei' Gimei. config. rng = Random. new(Random. seed) end テストコードの書き換え 値に依存しないようなテストコードに書き換えます。 今回は、返り値となるデータの中身の検証が必要だったので、FactoryBotのcreate時に定数を渡すことで対処しました。 --- ### Railsでsessionを無効化する方法 - Published: 2022-05-28 - Modified: 2022-05-30 - URL: https://blog.teraren.com/2022/05/28/disable-session-on-rails/ - カテゴリー: Ruby on Rails - タグ: cookie, Ruby on Rails, session config/initializers/session_store. rbにRails. application. config. session_store :disabledを書き込んでアプリケーションサーバを再起動。 echo "Rails. application. config. session_store :disabled" > config/initializers/session_store. rb 検証 Ruby on Rails 7. 0で検証。Rails 3からこの方法でできるっぽい。 before % curl -v http://localhost:3001/ 2>&1 |grep -i cookie < Set-Cookie: _train_session=9zmzzmUN5C%2FawwJc1xfMyQCNdWwVgoyQ4HeSgjCvK3tFdYR47cYGiKusOjIIL1goxvO3vhUazqJYtwUcQcWUGXjueOQLOyy89TOJ%2BpPgZOwcr1iFNsEXXxg4Mvt%2Be8IaCWilq7EmBn3q3r2DiK4TcfaS%2FKw9Qs3qNe6GftE%2BlYprxg3r9esCOkyVPva3OLw08IZOtgtvzcyyC6zbtTlBZ7lX9OV0E3ngUU8a5XdcFJ2bBzmKk4W6DAvIGrqOvza%2Bb7eUgWv60YdOJb5LWUkc9B3gmFz1AA%3D%3D--Zqf%2B2sbFYn7PYeMM--LPCwaBZ27oJWCKVb4lpuQA%3D%3D; path=/; HttpOnly; SameSite=Lax % after % curl -v http://localhost:3001/ 2>&1 |grep -i cookie % --- ### Error response from daemon: network xxxxxxxx not foundエラーが出たけど解決 - Published: 2022-05-28 - Modified: 2022-05-28 - URL: https://blog.teraren.com/2022/05/28/error-response-from-daemon-network-not-found/ - カテゴリー: docker - タグ: docker, network 問題 コンテナを起動しようとしたら以下のような感じのエラーが出ました。 % docker-compose run --rm app bash Running 2/2 ⠿ Container train-chrome-1 Created 0. 0s ⠿ Container train-db-1 Recreated 1. 2s Running 1/2 ⠹ Container train-chrome-1 Starting 0. 2s ⠿ Container train-db-1 Started 0. 2s Error response from daemon: network 44b6d50a789537858cbdfe53a498bd50d288214b673c8c393ffc450ee942ac06 not found 試したこと 以下のようにお掃除すれば直るとかいてありますが、直りませんでした。 docker-compose up --force-recreatehttps://stackoverflow. com/questions/53347951/docker-network-not-found 一通り、以下のことを試しましたが、解決しませんでした。 docker-compose down docker-compose build docker-compose up --force-recreate docker network prune docker network inspect で調査したけど、not foundと言われる。。。 docker engineの再起動 解決方法 結局は、docker-compose upしたときにdocker-compose. ymlから削除したサービスがあったのですが、それを起動しようとしているようなメッセージを見つけました。 docker-compose. ymlを変更前に戻して、docker-compose downを実行した上で、docker-compose upをしたら正常に起動できました。 エラーメッセージからはかなりわかりづらくて困りました。。。 --- ### 路線情報・駅情報のREST APIサービスを作りました - Published: 2022-05-21 - Modified: 2022-11-26 - URL: https://blog.teraren.com/2022/05/21/ekidata-api/ - カテゴリー: Program & Service - タグ: API, ekidata, REST API, 路線情報 概要 https://train. teraren. com/ Ruby on Rails 7 + Tailwind + daisyui で作りました。 まだ、エンティティの一覧と取得しかできませんが、これから機能拡充をしていきます。ほしいAPIがあったら教えて下さい。 例 ある駅の周辺駅を近い順に表示 GraphQL対応 駅の距離 API呼び出し例 駅の名前と位置情報の一覧をCSVで取得する例 % curl -s https://train. teraren. com/stations. json| json_pp | jq '. | | @csv' "\"函館\",\"140. 726413\",\"41. 773709\"" "\"五稜郭\",\"140. 733539\",\"41. 803557\"" "\"桔梗\",\"140. 722952\",\"41. 846457\"" "\"大中山\",\"140. 71358\",\"41. 864641\"" "\"七飯\",\"140. 688556\",\"41. 886971\"" "\"新函館北斗\",\"140. 646525\",\"41. 9054\"" "\"仁山\",\"140. 635183\",\"41. 930011\"" "\"大沼\",\"140. 669347\",\"41. 971954\"" "\"大沼公園\",\"140. 669758\",\"41. 980958\"" "\"赤井川\",\"140. 642678\",\"42. 003267\"" "\"駒ケ岳\",\"140. 610476\",\"42. 038809\"" "\"東山\",\"140. 605222\",\"42. 06172\"" "\"姫川\",\"140. 591632\",\"42. 081312\"" "\"池田園\",\"140. 700333\",\"41. 990692\"" "\"流山温泉\",\"140. 716358\",\"42. 003483\"" "\"銚子口\",\"140. 720656\",\"42. 015471\"" "\"鹿部\",\"140. 771393\",\"42. 06439\"" "\"渡島沼尻\",\"140. 747596\",\"42. 10706\"" "\"渡島砂原\",\"140. 689451\",\"42. 12164\"" "\"掛澗\",\"140. 64598\",\"42. 119205\"" "\"尾白内\",\"140. 613449\",\"42. 111232\"" "\"東森\",\"140. 59353\",\"42. 106823\"" "\"森\",\"140. 573846\",\"42. 108917\"" "\"桂川\",\"140. 5427876\",\"42. 1156004\"" "\"石谷\",\"140. 506525\",\"42. 135519\"" "\"本石倉\",\"140. 471957\",\"42. 159668\"" "\"石倉\",\"140. 458436\",\"42. 17285\"" "\"落部\",\"140. 420755\",\"42. 187617\"" "\"野田生\",\"140. 37586\",\"42. 217104\"" "\"山越\",\"140. 326593\",\"42. 231172\"" "\"八雲\",\"140. 273342\",\"42. 253391\"" "\"鷲ノ巣\",\"140. 269919\",\"42. 278389\"" "\"山崎\",\"140. 2746\",\"42. 314635\"" "\"黒岩\",\"140. 288173\",\"42. 368296\"" "\"北豊津\",\"140. 297868\",\"42. 400969\"" "\"国縫\",\"140. 320885\",\"42. 439319\"" "\"中ノ沢\",\"140. 346077\",\"42. 477928\"" "\"長万部\",\"140. 37507\",\"42. 512477\"" "\"長万部\",\"140. 37507\",\"42. 512477\"" "\"二股\",\"140. 320821\",\"42. 575869\"" "\"蕨岱\",\"140. 313353\",\"42. 626353\"" "\"黒松内\",\"140. 305704\",\"42. 669608\"" "\"熱郛\",\"140. 375084\",\"42. 675653\"" "\"目名\",\"140. 465742\",\"42. 761432\"" "\"蘭越\",\"140. 52894\",\"42. 804542\"" "\"昆布\",\"140. 596107\",\"42. 797984\"" "\"ニセコ\",\"140. 684588\",\"42. 808746\"" "\"比羅夫\",\"140. 722615\",\"42. 84856\"" "\"倶知安\",\"140. 745471\",\"42. 90164\"" "\"小沢\",\"140. 677657\",\"42. 97185\"" Tailwind良い 最近、lighthouseでのベンチマークをしているとCSSやJSが重すぎるというアラートが出ています。 assetをprecompileすると一部のスタイルしか使わないのに全部を読み込まないといけなかったのが必要最低限の読み込みだけで済むようになりました。 おかげで、lighthouseのスコアがめちゃめちゃ高い! しかしながら、TailwindはOSSでは無いので、今後長期的にコミュニティが乗っかってくるのかは不明です。 しかもライセンスの制約が厳しくて、コンポーネントの配布が制限されています。Twitter Bootstrapの場合はテーマがたくさん作られたことによって導入のハードルをかなり下げましたが、Tailwindはそのようなコンポーネントが制限されているようです。 じゃあ、このnpmは良いのか?って感じがします。。。 https://daisyui. com/ --- ### Rails 6.1.5でdb:migrationのときにreference周りでエラー - Published: 2022-05-19 - Modified: 2022-05-20 - URL: https://blog.teraren.com/2022/05/19/rails-6-1-5-reference-error/ - カテゴリー: Ruby on Rails - タグ: ActiveRecord, foreign key, rails 問題 rails db:migrateをしたときに、以下のようなエラーが出るようになってしまった。 親のキーがbigntで作られていないから、外部キーが貼れないというエラー。 Column `parent_id` on table `children` does not match column `id` on `parents`, which has type `bigint`. To resolve this issue, change the type of the `parent_id` column on `parents` to be :bigint. (For example `t. bigint :parent_id`). Original message: Mysql2::Error: Referencing column 'parent_id' and referenced column 'id' in foreign key constraint 'fk_rails_0525da88a4' are incompatible. 調査 しかしながら、show create table parents; してみたら、親のカラムはbigintで作られている。。。 rails 6. 1. 6に上げたら発生しなくなりました。rails 6. 1. 5に戻したら再現性あります。 rails 6. 1. 6のchangelogを見てもそれらしき記述はなかったです。謎です。 migrationのファイルはすべて6. 0以降です。 以下の結果は何も無いことを確認。 % git grep ActiveRecord::Migration db |grep -v 6. 0|grep -v 6. 1 考察 面倒なので原因は深追いしてない。。。 --- ### chromedriverのインストールをarmとintelのDockerfileで共通化 - Published: 2022-05-11 - Modified: 2022-05-19 - URL: https://blog.teraren.com/2022/05/11/chromedriver-on-arm/ - カテゴリー: docker - タグ: chromedriver, docker, intel, m1 概要 E2Eテストをするためのchromedriverは、Linuxのディストリビューションごとにパッケージで提供されていないので、おそらく直接ダウンロードしているケースがほとんどかと思います。 Dockerfile上で、アーキテクチャごとにダウンロードするファイルを振り分けるのが理想dせうが、Dockerfileではそのようなできず、shellscriptを書いて判定する必要があります。 Dockerfileにif文を書くとエスケープ文字や改行で見づらくなるので別途スクリプトを用意してアーキテクチャごとにダウンロードするファイルを変更するのが良いです。 スクリプト https://gist. github. com/matsubo/ed900c43f9d00c1bc9e24c3873f9efeb 追記 む。後日確認したら、chromedriver_mac64_m1. zipが動かなそうだ。。。 --- ### armとintelのdocker-compose共通化へ向けて(mysql編) - Published: 2022-05-02 - Modified: 2023-08-30 - URL: https://blog.teraren.com/2022/05/02/arm-intel-docker-compose-in-the-same-file/ - カテゴリー: docker - タグ: arm, docker, m1, macbook 追記 Officialの方でもarm64に対応していたのでオフィシャルをそのまま使えそうです。 この記事を書いた時点ではまだリリースされていませんでした。 https://twitter. com/matsubokkuri/status/1696078129100660767 背景 m1(arm)のmacで既存プロジェクトのdocker-compose upをすると以下のようなエラーが出ます。 Host '172. 21. 0. 4' is not allowed to connect to this MySQL server 理由はこちらの記事がよくまとまっています。 アプローチ あちこちで使われている、Docker公式イメージである、'mysql' はamd用しか提供されていません。arm用は、別のイメージ名で提供されているようです。 しかしながら、Docker HubにあるMySQLが提供している、mysql/mysql-server イメージはintel用とarm用を提供しています。設定ファイルを共通化したいのでimage名が同じマルチアーキテクチャビルドしてあるmysql/mysql-serverを使います。 MySQL Server 8. 0, the latest GA, for both x86 and AArch64(ARM64) architectures (tag: 8. 0, latest) (mysql-server/8. 0/Dockerfile) https://hub. docker. com/r/mysql/mysql-server なので、mysql/mysql-server を指定することで設定を共通化できます。 https://gist. github. com/matsubo/94666cf045af3ad8f91fada59116a1dd しかしながら、Docker Hubのイメージと、MySQLが出しているイメージは初期化スクリプトがちょっと違うようなので設定を追加で行う必要がありました。(上記の差分を参照) 初期 mysqlの/entrypoint. shの中で、MYSQL_ROOT_HOSTが参照されるのはmysqlのdataディレクトリが未作成の時だけです。 データディレクトリが存在しないか、消した状態で上記の設定を動かせば特に気にする必要はありません。 MYSQL_ROOT_HOSTオプション無しで作成済みの場合 ファイルのownerを設定 volumeを永続化している場合は、以下のようなコマンドを打ってownerを再設定する必要があります。imageによってuser idが変わっているためです。 docker-compose run --rm db chown -R mysql. mysql /var/lib/mysql /run/mysqld/ 接続元許可 作成済みの場合は、権限を変えてあげる必要があります。 docker-compose run db bashとかして、mysql -u rootとかして、DBに特権でログインします。 以下のようなクエリーを打って、権限情報を変更します。変数部分は手元の環境に合わせて置き換えてください。 MYSQL_ROOT_HOSTは、%にします。 ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'; CREATE USER 'root'@'${MYSQL_ROOT_HOST}' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'; \ GRANT ALL ON *. * TO 'root'@'${MYSQL_ROOT_HOST}' WITH GRANT OPTION ; \ GRANT PROXY ON ''@'' TO 'root'@'${MYSQL_ROOT_HOST}' WITH GRANT OPTION ;" まとめ ちょっと前までは、Dockerfile自体を分ける必要がありましたが、今はDockerfileとdocker-compose. ymlを別にする必要はなさそうです。 armでの開発環境構築がかなりスムーズになりそう。 --- ### Toonesの利用料を取得するスクリプト - Published: 2022-05-02 - Modified: 2022-05-02 - URL: https://blog.teraren.com/2022/05/02/toones-usage-automation/ - カテゴリー: Diary - タグ: API, Mechanize, ruby, Toones 概要 Toonesのサービス利用料を集計するためにはWebの画面にログインしてCSVファイルをダウンロードする方法しか無く、APIで取得ができません。手元で毎月集計したいので簡単なスクリプトを作ってみました。とりあえず作っただけなのでハードコードが多いです。HTTPクライアントはMechanizeを使っています。後々、Google Driveに追記していくようなスクリプトにします。 ソースコード 考察 ドハマリしたポイントは、ダウンロードしたCSVファイルに改行コードが、CRとCRLFの2つが混じっていたことです。rubyのCSVライブラリが文字コードやCSVparse周りでエラーを出すけど原因がわからずに問題を見つけるのが大変でした。 --- ### Amazon Linux 2にtigをインストール - Published: 2022-04-27 - Modified: 2022-04-27 - URL: https://blog.teraren.com/2022/04/27/amazon-linux-2-tig/ - カテゴリー: Linux - タグ: AL2, amazon linux 2, git, tig Extra Packages for Enterprise Linux (EPEL)に入っているので、EPELを有効化して、tigをインストールするだけ。 % sudo amazon-linux-extras install -y epel % sudo yum -y install tig --- ### armとintelのdocker-compose共通化へ向けて(Ruby on Rails編) - Published: 2022-04-26 - Modified: 2022-05-11 - URL: https://blog.teraren.com/2022/04/26/docker-m1-arm-glibc-error-on-nokogiri/ - カテゴリー: docker - タグ: docker, glibc, m1, nokogiri 問題 M1macでDockerのrubyイメージからを使おうとすると、nokogiriの部分でエラーが出ます。 % docker run --rm -it ruby:3. 0. 3-buster bash root@489921d6a766:/# gem i nokogiri Fetching nokogiri-1. 13. 4-aarch64-linux. gem Successfully installed nokogiri-1. 13. 4-aarch64-linux 1 gem installed root@489921d6a766:/# irb irb(main):001:0> require 'nokogiri' ERROR: It looks like you're trying to use Nokogiri as a precompiled native gem on a system with glibc < 2. 17: /lib/aarch64-linux-gnu/libm. so. 6: version `GLIBC_2. 29' not found (required by /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri/3. 0/nokogiri. so) - /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri/3. 0/nokogiri. so If that's the case, then please install Nokogiri via the `ruby` platform gem: gem install nokogiri --platform=ruby or: bundle config set force_ruby_platform true Please visit https://nokogiri. org/tutorials/installing_nokogiri. html for more help. /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri/extension. rb:7:in `require_relative': /lib/aarch64-linux-gnu/libm. so. 6: version `GLIBC_2. 29' not found (required by /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri/3. 0/nokogiri. so) - /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri/3. 0/nokogiri. so (LoadError) from /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri/extension. rb:7:in `' from /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri. rb:10:in `require_relative' from /usr/local/bundle/gems/nokogiri-1. 13. 4-aarch64-linux/lib/nokogiri. rb:10:in `' from :160:in `require' from :160:in `rescue in require' from :149:in `require' from (irb):1:in `' from /usr/local/lib/ruby/gems/3. 0. 0/gems/irb-1. 3. 5/exe/irb:11:in `' from /usr/local/bin/irb:23:in `load' from /usr/local/bin/irb:23:in `' :85:in `require': cannot load such file -- nokogiri (LoadError) from :85:in `require' from (irb):1:in `' from /usr/local/lib/ruby/gems/3. 0. 0/gems/irb-1. 3. 5/exe/irb:11:in `' from /usr/local/bin/irb:23:in `load' from /usr/local/bin/irb:23:in `' irb(main):002:0> 原因は、Nokogiriが1. 11あたりからプリコンパイルされて配布されるようになりました。そのバイナリは、glibc 2. 17でコンパイルされています。 しかしながら、arm用にコンパイルされたnokogiriが参照している /lib/aarch64-linux-gnu/libm. so. 6が2. 29を必要としているっぽくてエラーになります。 解決方法 静的リンクするか、独自でコンパイルするのが良さそうです。静的リンクはバイナリサイズがでかくなりそうなので独自でコンパイルします。 Bundlerを使っている場合 Bundler使っている場合は以下を打って自分でコンパイルするように設定します。 # bundler 2. 1以降 % bundle config set force_ruby_platform true # bundler 2. 0以前 % bundle config force_ruby_platform true そうすると、. bundle/configに以下が入ります。 --- BUNDLE_FORCE_RUBY_PLATFORM: "true" もし、. bundleディレクトリを. gitignoreで無視するような設定を書いていたり、ユーザ側で設定した. bundleディレクトリを使うようにしている場合はホームディレクトリの設定ファイルに書き込んであげるのがよいです。 bundle config set --global force_ruby_platform true 実行例 % docker run --rm -it ruby:3. 0. 3-buster bash root@11a428c7e8da:/# bundle config set force_ruby_platform true root@11a428c7e8da:/# bundle init Writing new Gemfile to //Gemfile root@11a428c7e8da:/# bundle add nokogiri Fetching gem metadata from https://rubygems. org/... ... . Resolving dependencies... Fetching gem metadata from https://rubygems. org/... ... . Resolving dependencies... Using bundler 2. 2. 32 Fetching racc 1. 6. 0 Fetching mini_portile2 2. 8. 0 Installing racc 1. 6. 0 with native extensions Installing mini_portile2 2. 8. 0 Fetching nokogiri 1. 13. 4 Installing nokogiri 1. 13. 4 with native extensions root@11a428c7e8da:/# bundle exec irb irb(main):002:0> require 'nokogiri' => true Bundlerを使っていない場合 --platform=ruby オプションをつけてインストールします。 root@b4ca7905b3a5:~# gem install nokogiri --platform=ruby Fetching nokogiri-1. 13. 4. gem Building native extensions. This could take a while... Successfully installed nokogiri-1. 13. 4 1 gem installed root@b4ca7905b3a5:~# irb irb(main):001:0> require 'nokogiri' => true root@b4ca7905b3a5:/# gem list|grep nokogiri nokogiri (1. 13. 4) 手元での変更 結果的に手元のプロジェクトでは以下のような変更をDockerfileに行いました。 + RUN bundle config set --global force_ruby_platform true 参考資料 詳細はこちらのissueにかかれています。 https://github. com/sparklemotion/nokogiri/issues/2075 不確実情報 環境によっては、arm用のbinaryがインストールされたりもするので、これが実現すればコンパイルの時間が取られなくて良いのでどういったときにこのような設定ができるのかを検証中です。 https://gist. github. com/matsubo/94666cf045af3ad8f91fada59116a1dd/b45e953d224220676898b1b84e7622edde3c1efe --- ### AASMでステータス変更と同じクリティカルセクションで実行 - Published: 2022-04-20 - Modified: 2022-04-20 - URL: https://blog.teraren.com/2022/04/20/aasm-execute-within-transaction/ - カテゴリー: Ruby - タグ: rails, ruby, state machine 概要 主にActiveRecordと併用して使うステータス管理用のgemがあります。AASM(ステートマシーン)です。「ステータス変更と同時に別の処理を実行したい」という要求を満たすために排他制御(主にデータベースのトランザクション)を使う場面がありますが、どのコールバックを使うのかがAASMのドキュメント内で明示されていなかったので書いておきます。 問題 よくAASMのサンプルコードで見つけるのが、after_commitコールバックに処理をしたいメソッドを書く方法です。 https://qiita. com/satour/items/fe838dc21dc95df95c62 上記にあるコードでは、ステータスの変更が終わったら通知をするというような別に処理を行っても問題ない処理なのでコードは正しいです。要するに、after_commitはその名の通りAASMによって管理されているステータスが更新されたことをDBにコミットした後に実行されます。 しかしながら、AASMで管理するステータスと別のテーブルにあるステータスを同時に更新する場合にafter_commitコールバックを使うだけでは不十分です。 アプローチ after コールバックを使います。 afterコールバックを使うと、AASMで管理するステートと同じトランザクション内で実行されます。 https://github. com/aasm/aasm/blob/master/lib/aasm/aasm. rb#L177 afterコールバックは、eventとtransitionに対して設定できます。 余談 requires_lock: trueは付ける必要があります。 --- ### Envoy(受付アプリ)のSlack通知が遅いので自作 - Published: 2022-03-24 - Modified: 2022-03-31 - URL: https://blog.teraren.com/2022/03/24/envoy-slack-notification/ - カテゴリー: PHP - タグ: Envoy, PHP, エントランス, 受付, 訪問者, 通知 概要 Envoyというオフィスのエントランスで受付をするシステムがあります。理想のワークフローは、Envoyで訪問者が受付をした際に、担当者宛にSlackで通知を飛ばすこと。Envoyが提供しているSlackのIntegrationを使うと、通知が届くまで4〜5分かかるのでかなり問題。(どうやら、2回めの通知は早い。SlackのIntegrationの初回呼び出しが遅い感じ。)Envoyからのwebhookは即時で届くので、SlackのIntegrationを使うのではなく自作したプログラムを使います。 設計 通信のフローは以下のようになります。 Envoy => (webhook) => なんかしらのScript => (webhook) => Slack Scriptの部分を作って設置します。 スクリプトは以下のような感じです。EnvoyからはPOSTでいろいろなデータが送られてくるので、必要なデータを抽出してSlackへ通知します。 SlackのWebhookのURLはパラメータで受け取れるようにしておきます。 https://gist. github. com/matsubo/a5f8eb01057dbf86cd3fc9cb2d116ebc 設定 予め、Slack側で通知を送りたいチャネルでwebhookのURLを発行しておきます。 Envoyに管理者でログインして、上記のスクリプトのURLを登録します。 https://dashboard. envoy. com/integrations 設定するWebhookのURLには忘れずにurlパラメータでslackの通知先webhookを入力します。一応、urlencodeした値を入れておきます。 URL例 https://example. com/slack. php? url=https%3A%2F%2Fhooks. slack. com%2Fservices%2FT0000XXXX%2Fxxxxxxxxxxx%2Fxxxxxxxxxxxxxxxxxxxxxxxxx 通知のサンプル まとめ ほぼ即時に通知が来るようになりました。webhookを動かしているPHPのアプリケーションサーバが落ちると通知が来なくて辛い状態になります。mentionさせるためには、SlackとEnvoy間でユーザの紐付けをしないといけないので今回はやってません。 参考資料 EnvoyからWebhookで送られてくるサンプルデータはこちらです。 Array ( => entry_sign_in => Array ( => Array ( => xxxx => locations => Array ( => xx => => Asia/Tokyo => Asia/Tokyo => ja => 〒xxx-xxxx xxxxxxxxxxx => undefined => 1F => xxxx => xxxx => xx => xxx-xxxx => xxxx. xxxxxx => xx. xxxxxxxxx => 20xx-04-11T08:18:24. 829Z ) => Array ( => Array ( => Array ( => xxxx => companies ) ) ) ) => Array ( => xxx => companies => Array ( => xxxxxxxxx => basic => => 1 => 20xx-04-11T08:18:24. 795Z ) ) ) => Array ( => xxxxxxxxxxxxxxx => entries => Array ( => not_applicable => xxxxxx => => => @here => foo@example. com => => 20xx-03-24 02:21:53 UTC => => xxxxx => => xxxxxx => => 20xx-03-24 02:21:53 UTC => Array ( => => => ) => Visitor => => => => 1 => => Purpose of visit => Array ( => Array ( => Host => @here ) ) => not_sent => => not_sent => not_sent ) => Array ( => Array ( => Array ( => locations => xxxxx ) ) => Array ( => Array ( => devices => xxxxx ) ) => Array ( => Array ( => employees => xxxxxx ) ) => Array ( => Array ( => flows => xxxxxx ) ) => Array ( => Array ( => https://app. envoy. com/api/v3/entries/xxxxxxxxx/previous-entries ) ) => Array ( => Array ( => https://app. envoy. com/api/v3/entries/xxxxxxxx/platform-jobs ) ) ) ) ) --- ### Google Domainsのドメインでメール送信ができなくなったけど解決 - Published: 2022-03-07 - Modified: 2022-03-16 - URL: https://blog.teraren.com/2022/03/07/google-domains-send-failure/ - カテゴリー: Program & Service - タグ: Google Domains, ドメイン, メール転送, 無料 概要 独自ドメインの転送メールアドレスを無料で行えるように設定しました。 https://blog. teraren. com/2022/02/10/google-domains-custom-domain-gmail/ しかしながら、1週間ぐらい経過してからメールを送信したら、以下のようなエラーメールが返ってきてしまいました。 You no longer have access to foo@example. com. To send this email, choose a different "from" address and try again. Learn more at https://support. google. com/mail/answer/22370? hl= 解決方法 gmailのSMTPサーバから別ドメインのメールを送っているのでSPF関連の設定を入稿していないから起きているのかな?と思っていましたが、以下の書き込みでは外部メールアドレスの設定を一度削除して作り直せば使えるようになると書いてありました。 https://www. google. com/search? q=gmail+spf&oq=gmail+spf+&aqs=chrome. . 69i57. 1471j0j1&sourceid=chrome&ie=UTF-8 そんなので直るのかと思っていましたが、実際に作り直したら送信できるようになりました。 設定と確認に10分近くかかるので再発したら面倒だなと思います。。。 招待コード 25%オフで利用できる招待コードが届いたのでどうぞ。 Have a friend who hasn’t tried Google Domains yet? New users can enter code FRIENDSOFDOMAINS at checkout for 25% off** a new domain or transfer-in. --- ### Google Domainsへ移管して無料でカスタムドメインをGmailで使う - Published: 2022-02-10 - Modified: 2022-03-02 - URL: https://blog.teraren.com/2022/02/10/google-domains-custom-domain-gmail/ - カテゴリー: Program & Service - タグ: .com, gmail, google, Google Domains, カスタムドメイン, ドメイン名, ムームードメイン, 無料 概要 Google Domainsでドメインを管理すれば、無料でGmailをカスタムドメインで利用できるようになるらしいので設定してみました。 https://twitter. com/twk/status/1484885881760923654 おそらく、これに当たるのかなと思います。custom domainでaliasが作れる感じかなと思います。 料金 今までは、muumuuドメインで管理していました。. comドメインなので料金は以下。過去の履歴を見てみたら、5年前は950円/年でした。2倍近く値上がりしています。1,728円/年Google Domains1,400円/年 移管 移管はこちらの手順通りに行いました。特につまずくところはないと思います。https://support. google. com/domains/answer/3251236? hl=ja&ref_topic=9003137&visit_id=637799892079898736-1406187690&rd=1 muumuuの場合は以下のような画面でAUTH_CODEを取得できました。移管時に、DNSレコードをGoogleで管理するか聞かれますが、これにはNoと回答する必要があります。設定をインポートすると書いてありますが、今はAWSで管理していてすべてをインポートできるわけではないからです。ドメインの移管が終わってから、後ほどDNSの設定は行いましょう。今の所、日本では法人しか対応していないようなメッセージが表示されました。(どうやってそれって確認するのか不明ですが。。。) 課金が完了するとメールが来ます。その後、しばらく待ちます。移管元の方のレジストラから連絡が来るはずです。数十分待つと、以下のようなメールが移管元のレジストラから来ますので、承認手続きを進めます。 5分ぐらいすると、移管が完了したメールが移管先のGoogle Domainsから届きます。 移行前のレジストラにあった有効期限はそのまま引き継がれます。 メールのForwardの設定 このあたりを読んで設定します。 https://support. google. com/domains/answer/3251241? hl=en#emailForwarding まずは、Google Domains側でAliasを設定します。 そして、カスタムドメインのメアドにメールを出して、gmail側で受信できることを確認します。 次に、送信側の設定です。送信側の設定は、普通にGmailからSMTPサーバを追加するだけで良いです。 https://mail. google. com/mail/u/0/#settings/accounts 受信したメールに対してを返信信してみたところ、うまく返信できました。 後日試してみたら、送信できなくなってました。謎。 Reporting機能を有効化 Google DomainsでReporting機能を有効化すると、約1日後からドメインに対する統計情報が閲覧できるようになります。 この統計情報は、Google Search Consoleに新たに1つ特別なプロファイルが作られて、そこから閲覧で切るようになります。今まではホスト名単位でプロファイルが切られていましたが、このプロファイルは特殊でドメイン単位の統計が見られます。 まとめ Google Domainsの「無料メール転送機能」が使えることによって、無料のGmailでカスタムドメインのメールアドレスを送受信できるようになりました。カスタムドメインでGmailを使いたかったガタ前に、Google Workspaceを契約していましたが解約できます。ついでにDNS zoneの移行なども行ったのでトータル3時間位かかりました。Google Domainsを使っているとGoogle Sitesでサイトを作ることをおすすめされますが、相変わらずテンプレが貧素なので時間を無駄にしました。 --- ### 有効期限付きポイントシステムの要求定義と設計 - Published: 2022-02-03 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2022/02/03/point-system-design-rdb/ - カテゴリー: Program & Service - タグ: ANAマイレージ, クラス図, ポイントシステム, 有効期限, 設計 概要 15年前ぐらいに設計、実装したシステムの設計と実装を公開します。 目的は、誰かに特許を取られてしまっても困るので。自分で特許を取るほどでもないので共有資産として残しておきます。特許というか、どちらかと言うと論文で発表するほうが向いていそうです。 航空会社のマイルで使われているポイント管理機能の実現方法です。このようなポイントシステムの要求はビジネスサイドではよくありそうですが、設計内容が公開されている事例を見つけられませんでした。 類似ポイントシステム JALやANAのマイルシステム まさにこれと同じ機能の実現方法です。 設計と実装が比較的難しいので、当時はこの機能を実現しているサービスは見つけられませんでした。 2022年の今となってはこのポイントの仕組みはメジャーになりつつあります。様々な大手ポイントサイトで使われています。設計と実装の難易度が高かかったり、ユースケースが限られていたりするので中小規模のところでは採用されていないです。 ビックカメラやヨドバシカメラのポイントシステム 最終利用日から1年で有効期限が切れる。 この仕組の実装は簡単なのであちこちで採用されています。 「有効期限つき」ポイントシステムをつくる この記事で紹介されている設計では、「ポイントの消費を取り消す」ユースケースを処理できません。 要求 アクター ユーザ 経理 システム管理者 機能要求 基本機能 ユーザに対してポイントを加算、減算できるシステム。 加算に対して、任意の有効期限をつける。 有効期限が近いポイントから消費していく。 運用 減算を取り消すときには、減算前のポイントの有効期限を復元する。 ある時点の残高を算出できる。 ポイントの整合性をチェックできる。 ユーザ向け機能 有効期限ごとに残高を表示できる。 現在の残高を取得できる。 経理 できるだけオンラインで処理できるようにする 特定時点のBS(バランスシート)の算出 特定時点のPL(プロフィット/ロス)の算出 BSとPLの一致 システム 長期間運用しても遅くならないクエリーで取り出せる。 減算、加算の整合性を検算できる。(=BSとPLを作っておいて、整合性を検証) ユースケースの例 2022年6月まで有効の100ポイントを加算 2022年7月まで有効の100ポイントを加算 150ポイントを消費。(1から100ポイント、2から50ポイントを引く) アプローチ いくつか設計のアプローチがあるので整理します。どのような特徴に注目して設計を行うかによっていくつかのアプローチがあります。それぞれの設計とメリット、デメリットをまとめておきます。 トランザクションモデル 入金と出金の処理のトリガーはPLなので、必要最低限のPLを保存する。 会計的アプローチ PLとBS (有効期限ごと)を分離して保存する。 オブジェクト指向 入金、出金をオブジェクトとして考える。 入金、出金、1つ1つがオブジェクトとなる。 1. トランザクションモデル 方向性は、入金と出金の履歴は最低限取らなければいけないのでそれぞれの履歴をエンティティとして表現します。 Userエンティティは、ユーザ情報のマスタです。 DepositHistoryは入金の履歴を表現するエンティティです。amountにはポイントの額を入れます。used_amountはその入金に対して利用済みの金額を保存するためのカラムです。デフォルトは0になります。 expiration_dateはその入金の有効期限の日付を入力します。 WithdrawHistoryは出金の履歴を表現するエンティティです。 入金と出金を1つのエンティティで表現しても良かったのですが、used_amountとexpiration_dateの2つのアトリビュートが出金には非従属なので正規化してエンティティで分けました。 このアプローチの良い点は、テーブルが2つで済むのでシンプルです。悪い点は、出金と入金の紐付けが行えないので出金の取り消しができません。 2. 会計的アプローチ PLとBS (有効期限ごと)を分離して保存する。ユーザや管理者が見たいのは主にPLかBLのどちらかです。なので、ユーザ側の要求に近い状態でデータ自体も保存してしまえば集計も楽というアプローチです。 良い点は集計が容易です。悪い点は、1つ目と同じように入金と出金の紐付けがないので出金の取り消しが行なえません。 3. オブジェクト指向 入金、出金を個別に扱います。入金に対しての出金を厳密に関連付けることで取り消しを行えるようにします。 データとしてはPLを持ちます。BSはこのPLのデータを使って集計して出すか、参照頻度が高いのであれば別途BS用のテーブルを用意しても良いと思います。 BS用のテーブルを用意すると、集計は行いやすいですがその反面、PLの更新があるたびにBSのテーブルの更新も行う必要が出てきます。システムのユースケース頻度やトラフィックの多さによって使い分けるのが良いと思います。 この手法の良い点は、出金の取り消しも容易に行なえます。悪い点はテーブルが3つになるのでデータの管理が煩雑です。出金時のクエリーを複数回発行する必要があり、計算量が収束しないので処理が遅くなる可能性があります。 メリット・デメリット Matrixで整理しておきます。 アプローチ1アプローチ2アプローチ3有効残高算出ooo減算・加算の時系列一覧△ O(2n)o△ O(2n)残高の計算量O(n)O(1)O(n)とある時点のスナップショット計算量O(n)O(n)O(log(n))BSとPLの検算xoo減算の取り消しxxo時間を指定したBSの出力ooo期間を指定したPLの出力ooonはとあるユーザに対する関連するテーブルのレコード数 採用する手法 3番を採用します。 実装 実装の方向性 各エンティティにまたがった排他制御が必要なのでRDBMSで実装するのが一般的かと思います。 行ロックはデッドロックを回避するために左側のエンティティから順番にかけていくように実装します。 加算 Depositにレコードを入れるだけ。 残高の表示 Depositから有効期限が未来のレコードを抽出し、DepoistWithdraw. amountのsumを除算 減算 トランザクション 残高をチェック。 Depositから有効期限に近い順にソート 影響のあるDepositを排他ロック Withdrawへレコードの追加 DepositWithdrawへレコードの追加 減算取り消し トランザクション 関連するDepositWithdrawを排他ロック Withdrawの削除 関連するDepositWithdrawの削除 一覧 加算と減算を別のテーブルで管理しているので加算と減算の一覧を時系列に出す処理が重くなってしまいます。計算量、メモリ使用量がO(n)です。 このシステムの設計における一番大きなデメリットがこの点。 DepositとWithdrawをUNION ALLして時間でソートする。 上記の処理は重いのでユースケースレベルで加算と減算それぞれのページを用意する事によってパフォーマンスは担保できる。 ユーザの削除 PLを簡単に出すために、退会したユーザに対しては減算処理をして残高を0にしておく必要がある。そうでないと、BSを出すときに退会ユーザを除外するのが難しくなる。現時点でのBSを出すのは簡単だが、過去のとある時点のBSを出す際にはクエリーが不可能ではないが困難になる。 ポイントの失効 BSを計算する際に、expiration_dateを元に算出することになる。有効期限が切れたポイントに関連するPLを算出するのはクエリーが複雑になる。 考察 PLを集計しやすいように、ポイントが失効したら減算するレコードを入れるバッチを作っても良いが、実行タイミングは失効と同時に行う必要があるので実行が困難。 検算 BSのスナップショットは持っていないので、PLの整合性を検証するのみになります。PLを複数テーブルで管理しているのでその整合性を確認します。 ”OK" if sum(DepositWithdraw. amount) == sum(Withdraw. amount) "OK" if Deposit. amount => sum(DepositWithdraw. amount) 実装が正しく動いているか確認するための保険としてdailyで上記のバッチを実行しておくのが良いです。 考察 この設計で今までに2つのサービスを構築しましたが不整合無く稼働しています。 運用を開始してから、ビジネスサイドやファイナンスサイドからの要求に対しても基本的には答えられています。 監査、経理、マーケティング用途の集計要求にも答えられています。(設計が少し複雑なのでエンジニアかデータに詳しい人じゃないと複雑な抽出を行うクエリーを書けないという問題はあります) https://amzn. to/3gBEY8R --- ### 自宅サーバ環境 - Published: 2022-02-03 - Modified: 2024-06-23 - URL: https://blog.teraren.com/2022/02/03/home-server/ - カテゴリー: Server software - タグ: Linux, Ubuntu, 自宅サーバ ハードウェア PowerEdge T320を2019年12月に中古で26,000円で買いました。製造日は2013年とか2014年かと思います。 CPU: 8コア Xeon E5-2450 2. 1GHz RAM: 16GB HDD: 2TB x 4 (RAID1) SSD: 500GB x 2 (RAID1) OS Ubuntu 22. 04(基本的に最新を入れていくようにしています) コアは16個あるので一人で利用する分には並列性は十分です。 アプリケーション Dockerを入れて様々なWebサービスを運用しています。 ユーザが多いサービスは安定性を重視するためにAWS Lightsailの方へ移行しています。 UPS 停電のときにRAIDコントローラーを保護したいという目的でUPSを導入しました。 最悪、長期の停電になったときにUPSの電池から充電をできたりするという用途にもなります。 あと、使っている電力がわかるので電気代算出の目安になります。 https://amzn. to/34eezey --- ### GoogleのCloud Identityでエンドポイント管理 - Published: 2022-02-03 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2022/02/03/google-cloud-identity/ - カテゴリー: コーポレート IT - タグ: cloud identiy, google workspace, MDM 概要 Googleが2020年1月16日にリリースしたCloud Identityによって社内端末を管理する設定をしました。事例がほとんど見つからないのでオフィシャルドキュメントを片っ端から読んで設定してみました。コーポレート関連の情報が全然出回らないので書いておきます。手順などをちゃんと書くと、文量が大量になるので要点だけまとめます。 Cloud Identity特徴 無料と有料プランがありますGoogle Cloud Identity Free EditionGoogle Cloud Identity Premium Edition Chrome Bookの端末管理をしたかったので今回はPremium Editionを使う必要があります。Google WorkspaceのEnterpriseプランだとCloud Identityのサービスが含有されているのですが、それ以外では個別に契約が必要っぽいです。料金645円/ユーザ/月 セキュリティ要件例 このあたりのことをやれます。 端末の紛失、盗難データの削除をリモートから行ったり、容易にログインできなくする。ディスクが暗号化された状態を担保する。認証ソーシャルエンジニアリング対策BYO対策個人端末で会社アカウントを使っている場合の管理。業務委託の端末管理。Google Workspaceのアカウントを使ってログインしている端末は、Google Device Policyというアプリを別途入れることを共用されます。このアプリ経由で端末を制御できます。 https://support. google. com/a/answer/9539506 こんな感じで有効化できます。 Windows端末の場合葉、Google Credential Providerというアプリが用意されていて、Google WorkspaceのIDとPWでWindows端末にログインするように設定できます。 https://tools. google. com/dlpage/gcpw 私の場合は、以下のようなPowerShellスクリプトを書いて、キッティング時に実行して設定してます。 https://gist. github. com/matsubo/97e7d42c7bad1b5f76905c0351f71f87 運用 以下のスクショのような感じでログインしたユーザやデバイスが表示されます。対象のデバイスから強制ログアウトや、リモートから情報の削除を行えます。 デバイスでフィルタをしたりできます。 考察 この設定によって、会社のデバイスやBYODの端末を管理できるようになりました。セキュリティをコントロールしづらいBYODに対してもリモートワイプできるようになりました。Google Workspacesを導入したスタートアップには良いと思います。Android, ios, Windows, macosにおける最低限の認証管理、設定管理は行なえます。もっと細かい制御をしたい場合は、JAMFやIntuneなどを使って強化していけばよいかと思います。 ABM連携もできるようなので、今後トライしたいです。https://support. google. com/cloudidentity/answer/9904735? hl=en https://amzn. to/3giEIuX --- ### slackのステータスアイコンを自動で更新(家かオフィスかをアイコンで表示) - Published: 2022-02-03 - Modified: 2022-02-04 - URL: https://blog.teraren.com/2022/02/03/show-current-location-icon/ - カテゴリー: Program & Service - タグ: slack, slack-wifi-status, stauts, WiFi 概要 以下のように、自分がどこにいるのかを自動的にSlackのアイコンに表示する方法を紹介します。2年前(2020年)ぐらいに設定した内容なのでちょっと古いところがあるかもです。 slack-wifi-status じゃあ、どうやってステータスを変えるのかと言うと、以下のようなロジックです。 wifiのSSIDが変更されたときのイベントをhookするSSIDとアイコンの定義を予め用意しておいて、それを元にSlackのAPIを使ってアイコンを変更する。 以下のバイナリをダウンロードします。このバイナリファイルをデーモンとして稼働させてWiFi APの変更を検知してアイコンを変更することになります。 https://github. com/polidog/slack-wifi-status 設定ファイルを以下のような感じで書きます。slackのtokenの項目にはユーザトークンを入れます。 % cat ~/. slack-wifi-status. toml token = "xoxp-xxxxx-xxxxx-xxxxxxx-xxxxxxxxxxxx" ] name = "office-wifi-ap" message = "at office" emoji = ":office:" ] name = "office-guest-wifi-ap" message = "at office" emoji = ":office:" ] name = "my-home-ssid" message = "at home" emoji = ":house:" ] name = "starbucks" message = "at starbucks" emoji = ":comet:" /Users/matsu/Documents/slack-wifi-status_darwin_amd64/ にバイナリを保存した前提のplistファイル % cat Library/LaunchAgents/slack-wifi-status. plist Label com. slack. slack-wifi-status ProgramArguments /Users/matsu/Documents/slack-wifi-status_darwin_amd64/slack-wifi-status StandardOutPath /var/tmp/slack-wifi-status. log RunAtLoad 以下のコマンドで、デーモンとして登録します。 % cd Library/LaunchAgents % launchctl load slack-wifi-status. plist % launchctl start slack-wifi-status. plist まとめ 自分のためと言うより、一緒に働いている人に対して自分がどこにいるのかを自動的に表現できる仕組みです。 --- ### Toonesの残高をチェックして少なかったらSlackへアラート - Published: 2022-01-12 - Modified: 2022-01-14 - URL: https://blog.teraren.com/2022/01/12/toones-balance/ - カテゴリー: Ruby - タグ: Toones, インターネットFAX インターネットFAXのToonesにある残高が減った時に検知する手段が無かったのでスクレイピングしてSlackに通知するようにしました。mechanize gemを使えば、結構簡単に書けます。 ヘッドレスブラウザを使うと大げさすぎるし、http clientだと低機能すぎるのでmechanizeはちょうどよい具合でした。 アラートの通知は以下のような感じです。 ソースコード スクレイピングでエラーが起きたときに、検知できないと辛いのでエラーが起きたらSlackに通知しています。Mechanizeは便利です。 --- ### RSA Encryption not supported - caching_sha2_password plugin was built with GnuTLS support がでたときの対処法 - Published: 2021-12-18 - Modified: 2022-05-11 - URL: https://blog.teraren.com/2021/12/18/rsa-encryption-not-supported/ - カテゴリー: Ruby on Rails - タグ: docker, mysql8, rails 原因 MySQL5. 7までの認証プラグインにはmysql_native_passwordがデフォルトで使用されていましたがMySQL8より新たに追加されたcacing_sha2_passwordがデフォルトに変更されましたがクライアント側が対応していないため。 解決法1 docker-compose. ymlに以下の行を追加すればOKです。すでに構築済みでも大丈夫です。 command: --default-authentication-plugin=mysql_native_password 解決法2 DBのレコードを書き換える方法です。DB内に入っている値を書き換えるので、一時的な解決方法です。 以下の実行例はdocker-composeで立ち上げている場合 docker exec -it -db-1 bash passwordの部分は任意の文字列に置き換えてください。 # mysql -u root -p > ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password' > flush privileges; 発生するタイミング 初期セットアップ時。MySQLのDocker Imageのバージョンを上げたり(あがってしまったり)するとDBのユーザデータが初期化される場合がある様子。 --- ### Ubuntu 20.04.2 LTSにWiFiドングルを設定 - Published: 2021-11-12 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2021/11/12/ubuntu-20-04-2-lts-tplink-wifi/ - カテゴリー: Linux - タグ: realtek, Ubuntu, USB, WiFi こちらを買いました。Linuxで使えるようにするための設定があまり書かれていなかったのでメモ書きを残しておきます。Ubuntu 21でも同様です。 https://amzn. to/3n9hFal チップセットを調べる matsu@lenovo:~/$ lspci |grep net 08:00. 0 Ethernet controller: Realtek Semiconductor Co. , Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0e) matsu@lenovo:~/$ sudo lshw -c network *-network description: Ethernet interface product: RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller vendor: Realtek Semiconductor Co. , Ltd. physical id: 0 bus info: pci@0000:08:00. 0 logical name: eno1 version: 0e serial: 1c:69:7a:4d:00:26 size: 1Gbit/s capacity: 1Gbit/s width: 64 bits clock: 33MHz capabilities: pm msi pciexpress msix vpd bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation configuration: autonegotiation=on broadcast=yes driver=r8169 duplex=full ip=192. 168. 1. 27 latency=0 link=yes multicast=yes port=MII speed=1Gbit/s resources: irq:30 ioport:f000(size=256) memory:fcd04000-fcd04fff memory:fcd00000-fcd03fff ドライバをインストール % git clone https://github. com/aircrack-ng/rtl8812au. git % cd rtl8812au/ % sudo apt install dkms matsu@lenovo:~/rtl8812au$ sudo make dkms_install mkdir -p /usr/src/8812au-5. 6. 4. 2_35491. 20191025 cp -r * /usr/src/8812au-5. 6. 4. 2_35491. 20191025 dkms add -m 8812au -v 5. 6. 4. 2_35491. 20191025 Creating symlink /var/lib/dkms/8812au/5. 6. 4. 2_35491. 20191025/source -> /usr/src/8812au-5. 6. 4. 2_35491. 20191025 DKMS: add completed. dkms build -m 8812au -v 5. 6. 4. 2_35491. 20191025 Kernel preparation unnecessary for this kernel. Skipping... Building module: cleaning build area... 'make' -j8 KVER=5. 4. 0-90-generic KSRC=/lib/modules/5. 4. 0-90-generic/build... ... ... ... . Signing module: Generating a new Secure Boot signing key: Can't load /var/lib/shim-signed/mok/. rnd into RNG 139750728316224:error:2406F079:random number generator:RAND_load_file:Cannot open file:. . /crypto/rand/randfile. c:98:Filename=/var/lib/shim-signed/mok/. rnd Generating a RSA private key ... ... ... ... ... . . +++++ ... ... ... ... ... ... ... . +++++ writing new private key to '/var/lib/shim-signed/mok/MOK. priv' ----- - /var/lib/dkms/8812au/5. 6. 4. 2_35491. 20191025/5. 4. 0-90-generic/x86_64/module/88XXau. ko Secure Boot not enabled on this system. cleaning build area... DKMS: build completed. dkms install -m 8812au -v 5. 6. 4. 2_35491. 20191025 88XXau. ko: Running module version sanity check. - Original module - No original module exists within this kernel - Installation - Installing to /lib/modules/5. 4. 0-90-generic/updates/dkms/ depmod... ... . DKMS: install completed. dkms status 8812au, 5. 6. 4. 2_35491. 20191025, 5. 4. 0-90-generic, x86_64: installed matsu@lenovo:~/rtl8812au$ uname dkmsで入れたドライバを確認 root@lenovo:/home/matsu/rtl8812au# dkms status 8812au, 5. 6. 4. 2_35491. 20191025, 5. 4. 0-90-generic, x86_64: installed USBデバイスを抜いて、挿すとこんな感じのメッセージが出てwlan0に割当されました。 % dmesg usb 1-3: USB disconnect, device number 5 usb 1-3: new high-speed USB device number 6 using xhci_hcd usb 1-3: New USB device found, idVendor=2357, idProduct=011e, bcdDevice= 2. 00 usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-3: Product: 802. 11ac WLAN Adapter usb 1-3: Manufacturer: Realtek usb 1-3: SerialNumber: 00e04c000001 88XXau: loading out-of-tree module taints kernel. 88XXau: module verification failed: signature and/or required key missing - tainting kernel usb 1-3: 88XXau 10:27:f5:09:2e:f7 hw_info usbcore: registered new interface driver rtl88XXau rtl88XXau 1-3:1. 0 wlx1027f5092ef7: renamed from wlan0 IPv6: ADDRCONF(NETDEV_CHANGE): wlx1027f5092ef7: link becomes ready nmcliから見られるようになりました。 root@lenovo:/home/matsu/rtl8812au# nmcli wlx1027f5092ef7: disconnected "TP-Link Wi-Fi" wifi (rtl88XXau), 10:27:F5:09:2E:F7, hw, mtu 2312 nmtuiなどで設定して、activateします ip aコマンドで見るとつながっていることがわかります 7: wlx1027f5092ef7: mtu 2312 qdisc mq state UP group default qlen 1000 link/ether 10:27:f5:09:2e:f7 brd ff:ff:ff:ff:ff:ff inet 192. 168. 1. 114/24 brd 192. 168. 1. 255 scope global dynamic noprefixroute wlx1027f5092ef7 valid_lft 3552sec preferred_lft 3552sec inet6 240f:78:8153:1::2/128 scope global dynamic noprefixroute valid_lft 3555sec preferred_lft 1755sec inet6 240f:78:8153:1:8f:8b35:3766:78df/64 scope global temporary dynamic valid_lft 288sec preferred_lft 288sec inet6 240f:78:8153:1:7c53:4137:36ac:2635/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 288sec preferred_lft 288sec inet6 fe80::b191:e8c0:2c47:7f85/64 scope link noprefixroute valid_lft forever preferred_lft forever --- ### Ubuntu 21.10で複数NICを1つのネットワークに繋げる設定 - Published: 2021-11-05 - Modified: 2021-11-05 - URL: https://blog.teraren.com/2021/11/05/ubuntu-21-10-multiple-nic/ - カテゴリー: Linux - タグ: network, nic, route Ubuntu 20系よりroute周りの設定を細かく書かないとエラーになってしまうので以下のように修正。 ** (generate:289522): WARNING **: 01:36:28. 530: gateway4 has been deprecated, use default routes instead. See the 'Default routes' section of the documentation for more details. 内容はgateway4というセクションがDeprecatedになったのでroutesに定義してね。と。 今まではgateway4にデフォルトゲートウェイのアドレスを記載するだけでしたが、metricなどを記載する必要があります。まぁ、routeテーブルをより明確に書き換えるための詳細化です。 ということで、以下のような感じで記載しました。metricは低いほうが高プライオリティ。 それでもまだ、ちょっとネットワークを切断、接続したときのrouteテーブルの書き換えが変になる動作があるので運用には要注意という感じです。 L2までが安定していて変化がなければ気にしないで良いと思います。 --- ### Ubuntu 21.10にアップグレードしましたが2つ問題が発生 - Published: 2021-10-27 - Modified: 2021-10-31 - URL: https://blog.teraren.com/2021/10/27/ubuntu-21-10-upgrade/ - カテゴリー: Linux - タグ: grub, Linux, LVM, Ubuntu 処理自体は簡単です。今までと同じようにUbuntuの場合は以下のコマンドだけでアップグレードできます。 sudo apt updatesudo apt upgradesudo do-release-upgrade アップグレードは正常に終了。 この後は、rebootしてちゃんと起動することを確認すれば作業が終了します。 しかしながら、問題はこのあと起きます。 問題1 なぜかrebootしたあとにはX-window systemが一通り入っていて、runlevelが上がってしまいました。サーバー用途のためCUIしか使っていないので不要です。。。謎すぎます。 なので、runlevelを落とします。Ubuntuは以下のコマンドでCUIになります。 sudo systemctl set-default multi-user. target それに伴って、X Window system関連のパッケージを削除します。以下のコマンドで削除できると書いてありますが、Gnome関連などのGUIアプリは依存関係がないらしくて消えません。 sudo apt-get remove xserver-xorg-coresudo apt-get autoremove -y aptitudeをわざわざインストールしてそれっぽいパッケージを抜いていきます。そして、再起動しました。 追記 別のほとんど追加パッケージを入れていないUbuntu 20 ServerにてUbuntu21へのアップグレードを試したら、この問題は起きませんでした。おそらくなにかのパッケージの依存関係が変わってしまったのだろうと予想します。 問題1が発生しなければ問題2も発生しないです。 問題2 今度は別の問題が発生しました。起動中に、ディスクが見つからないと言うエラーがでました。対処法はWeb上では様々な方法がでてきます。 Gave up waiting for root device. Common problems:https://kudzu. hatenablog. com/entry/20151102/1446416115 結局は、lvm2のパッケージが消えたことが原因でした。 Grubの選択肢のときにeを押してブート方法を選ぶページに行って、1つ前に入れたkernelを選択して起動。(recovery modeではない) それでも同様に起動はしませんが、kernelは動くのでshellが動くのと/sbinなどには管理ツールが充実しています。 いろいろ調べていると、lvmのパッケージが依存関係で消えてしまうことがあるらしいので、lvmのパッケージを入れ直せば運が良ければ起動するとのことだったのでインストールして対処します。 確かに、lvm関連のコマンドが一切存在していませんでしたが、このインストール後には利用できるようになりました。どこの領域にインストールされているのか謎なのは依然として残りますが。。。lvmをマウントできていないから/sbinや/usr/sbinとかにアクセスできないはずなのに。。。 apt updateapt install lvm2 このあと、再起動をしたらちゃんと起動しました。 考察 /var/log/dpkg. log を漁ってみましたが、lvm2が消えたログが見当たりませんでした。 色々謎は残りますが復帰できてよかったです。 --- ### Rails + MySQL 8でngramを用いたfulltext index - Published: 2021-10-19 - Modified: 2021-10-22 - URL: https://blog.teraren.com/2021/10/19/rails-mysql-ngram-fulltext/ - カテゴリー: Ruby on Rails - タグ: docker, fulltext, MySQL, ngram, rails, 全文検索, 日本語 Railsのmigrationで普通にfulltext indexを付ける場合には以下のようにすると思いますが、普通のfulltext indexではngramが使われないので日本語の全文検索をする場合には全然マッチしません。 class AddNormalFullText < ActiveRecord::Migration def change add_index :corporations, :name, :type => :fulltext end ngramのindexをつけるためには以下のように手でmigrationの内容を書く感じです。"ft_index"は自分でつけるindexの名称なので適当に付けてOK。 class AddNgramFullText < ActiveRecord::Migration def up execute 'CREATE FULLTEXT INDEX ft_index ON corporations (name) WITH PARSER ngram' end def down execute 'ALTER TABLE corporations DROP INDEX ft_index' end end show create tableをすれば、以下のようなindexが作られることが確認できます。 FULLTEXT KEY `ft_index` (`name`) /*! 50100 WITH PARSER `ngram` */ MySQL 5. 7系でも同じだと思います。 パフォーマンスはなんか、いまいちです。平均約10文字のカラムに対して500万レコードを対象にindexを張りました。2件を抽出するために3秒位かかりました。 別の語句で試したら0. 5秒以内には返ってきたりします。 ngram周りのパラメータはデフォルトです。 --- ### ミラーサーバの取りやめの連絡 - Published: 2021-10-05 - Modified: 2021-10-05 - URL: https://blog.teraren.com/2021/10/05/stop-mirrorring/ - カテゴリー: Service - タグ: dotdeb, mirrorring, qmail 以下の2サイトを停止致します。 ミラー元のサービスが停止したことにより、テラレン!でのミラーリングを終了致します。 mirrors. teraren. com https://blog. teraren. com/dotdeb%e3%81%ae%e3%83%9f%e3%83%a9%e3%83%bc%e3%83%aa%e3%83%b3%e3%82%b0%e3%82%92%e9%96%8b%e5%a7%8b/ --- ### このBlogのホスティングを自宅サーバからLightsailに移行しました - Published: 2021-08-31 - Modified: 2021-12-15 - URL: https://blog.teraren.com/2021/08/31/wordpess-lightsail-php8/ - カテゴリー: AWS - タグ: AWS, blog, Lightsail, MySQL, PHP, PHP8, Wordpress 背景 自宅サーバで運用していましたが、Raidカードが壊れてOSが起動できなくなってしまいました。調達にも時間がかかるので、取り急ぎデータをサルベージしてどこかで動かす必要がありました。Lightsailが安いのでこの際に移行してしまいます。 選んだインスタンス Disk容量が足りなくて一番低い3. 5USD/monthのインスタンスでは乗り切りませんでした。それでも月5ドルは安いです。 https://aws. amazon. com/jp/lightsail/pricing/理想は、ACMやらロードバランサを付けておきたいのですがそれらをつけるとコストが普通に高くなってしまうのでこのインスタンスだけでなんとか運用します。定期スナップショットも取れるし自宅よりインフラ面(電源、回線、ハードウェアなど)が安定しているので安全です。 WordpressでできたBlogを10個ぐらい乗せるのでOSはAmazon Linux 2を使ってゼロからセットアップします。(Wordpressのインスタンスから作ると余計なものが色々入ってきてしまうので) コストがかからないことを最優先にするのでMySQLも同居させます。 ついでに、PHP8にも移行しました。Wordpressのテーマやプラグインで最近の更新が止まっているものはエラーが出てしまっているので、綺麗サッパリ消して諦めました。主要なプラグインやテーマはPHP8に基本的に対応しています。 もちろんIPv6対応です。 SSL/TLS対応はLet's Encryptを手動でセットアップしました。 1ヶ月ほど運用した結果 Wordpressで運用している記事数が数万件のサービスは乗せられそうにありませんでした。MySQLのDisk I/Oがボトルネックになりました。 プロセスレベルのリソースはこんな感じ。WordpressのComet Cacheを使っているので基本的にはスカスカです。 lightsailを運用する上で気をつけないといけないことは、burstを使い切ってしまうと超遅くなってしまうことです。現時点ではあんまり問題無さそうです。日中がちょっと負荷が上がっている時間がありますが、まだ気にしないで良いかなと思います。ベンチマーク なんか遅いけど。同じregionのlightsailインスタンスから行って居て、Average: 0. 1203 secs。Comet cacheでは、0. 00320secでserveしてるっぽいんだけどね。 静的ファイルに対してのベンチマークでは、約100倍ほど速いAverage: 0. 0018 secsでした。OSのリソースの使用状況を見ているとPHPとnginxのCPUオーバーヘッドが大きいような感じがしています。 Comet Cacheが効いていないのかと思って、外してみたらAverage: 3. 8090 secsなのでとても遅くなったので効いているようです。 まとめ EC2だと個人Blogを運用するにはコストがちょっと気になりますが、Lightsailだと月$5で運用できます。もっとトラフィックや容量が少なければ$3. 5/月でも十分です。 余談ですが、郵便番号検索サービスのほうもLightsailに移行しました。$3. 5/monthで運用しています。記事は後日。自宅サーバーはファイルサーバとしてメインで使い、ディスクIOや容量を使うサービスは自宅サーバで運用します。 --- ### rsync over sshをAWS Session manager経由で使う設定方法 - Published: 2021-07-16 - Modified: 2021-09-06 - URL: https://blog.teraren.com/2021/07/16/rsync-over-ssh-on-aws-session-manager/ - カテゴリー: AWS - タグ: AWS, session manager 要件 AWS Systems Manager Session Manager (以降AWS Session Manager)経由でEC2インスタンスにログインする。AWS Session Manager経由でログインするとssm-userでログインされてしまうが、IAMごとに別のユーザでログインする。rsync over sshできる。 前提となる環境 AWS Session Managerがセットアップ済み利用するregionにおいて、 Enable Run As support for Linux instances にチェックが入っているhttps://ap-northeast-1. console. aws. amazon. com/systems-manager/session-manager/preferences AWS上でのIAM設定 policyを作成する。policyレベルでユーザを指定したい場合は、TagsにSSMSessionRunAsを追加してValueにユーザ名を指定する。 特定のインスタンスにSession Manager経由でログインできるようにする例 { "Version": "2012-10-17", "Statement": }, { "Effect": "Allow", "Action": , "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "ssm:TerminateSession", "Resource": "arn:aws:ssm:*:*:session/${aws:username}-*" } ] } 個人のIAMアカウントを作成する上で作ったpolicyをattachする。IAMユーザレベルでshellアカウントを指定する場合はSSMSessionRunAsタグを設定して、値にログインさせたいsshアカウントを指定する ログイン先端末での設定 公開鍵をログインしたいホスト上のログインさせたいユーザのauthorized_keysに登録しておく。 ログイン元端末での設定 必須プログラムaws-cliaws session manager pluginaws configure などを使ってcredentialを設定ファイルに記述しておくAWS Session managerを使ってi-xxxxxxxxxxxxxxxxにssh接続テストしてみるaws ssm start-session --target i-xxxxxxxxxxxxxxxx~/. ssh/config へ以下の設定を追加するもし、複数のprofileを使っている場合は AWS_PROFILE 環境変数に設定してsshコマンド経由でも同じawsのcredentialを使うように注意する必要がある。 host i-* mi-* ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'" sshコマンドで接続してみるssh username@i-xxxxxxxxxxxxxxxxSSMSessionRunAsで設定したユーザ名を指定する必要がある。rsyncコマンド経由でファイルを転送してみるrsync -aruzv -e ssh @i-xxxxxxxxxxxxxxxxx: 考察 rsyncをする場合はAWS Session Managerの設定と、sshの設定の両方が必要になる。 --- ### zipコマンドでmacosのDSStoreやIconファイルを除外して圧縮 - Published: 2021-06-30 - Modified: 2021-08-18 - URL: https://blog.teraren.com/2021/06/30/zip-macos-dsstore-icon/ - カテゴリー: macos - タグ: DSStore, Icon, zip zip -r output. zip directory -x '*/. DS_Store' -x '*Icon*' Windowsの人が解凍すると「なにこれ?」と毎回聞かれるので。 --- ### テレカンするとCPU利用率が高くなる→熱暴走の保護機能が発動している - Published: 2021-06-11 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2021/06/11/cpu-high-load-caused-by-heat-issue/ - カテゴリー: macos - タグ: cpu, macos, テレカン, 熱暴走 症状 最近、Google Hangoutなどでテレカンを始めると、CPU利用率が徐々に高まっていき、最終的にはUI操作のレスポンスがすごく遅くなります。しかも、USB-DACを経由して音声を出力していると、音割れがひどくなります。ヘッドフォンを使っていると問題無いです。ちなみに、2. 4 GHz 8-Core Intel Core i9のMacbook Proです。 考えられる問題 ChromeのWebRTCを使ったときに、処理がおかしくて、どんどん変なCPU処理が増えていく?ブラウザを変更しても再現するし、ならないときはある。再起動すると直るような気はする。Chromeのメジャーバージョンが上がっても全然解決しない。熱暴走?CPUコアの温度表示は60度程度なのでそんなに熱くないと思う。コンパイルなどの重い処理をしているときには特に問題にならない。(結局はこれはテレカンに比べれば短時間だからそこまで発熱しない)ホコリが溜まっている?まだ買って1年しか経っていないし、エアーダスターで掃除したけど改善せず。さすがに、ファンが回りまくっているのでエアーダスターを使ったらホコリが結構出てきました。分解すれば色々わかるのでしょうが、保証が効かなくなるので今回は分解はしない。ハードウェア的におかしい?SMCリセット、NVRAMリセットをしたけど解決しない。個人用macbook proでもこの現象は再現するので違う気がする。電源を左に挿しているから?macbook pro 2019年モデルは、左にUSB-Cで給電すると発熱するという報告がある。。。私の場合は、右に挿しても変化が感じられなかった。。。kernel_taskプロセスが食っている感じはしない。外部モニタを使っていて、GPU起因?単独で使用すれば多少改善した感じがするけど、外部モニタを使えないのは辛すぎるので、あまりちゃんとトラブルシュートするのは辛い。クラムシェルで使っているから?クラムシェルじゃなくすれば、少しは緩和するような感じはしたけど、すぐにCPU使用率が高まる問題は発生する。 気になる数字を発見 iStat Menuを使ってシステムモニタリングをしています。そこで気づいたのですが、なぜかCPU周波数が1GHz。。。。 CPU温度は低いのに周波数が低いことを見つけました。OSがハードウェアを熱暴走から保護する機能が働いているような挙動です。 そこで、一応、扇風機でクーリングをした結果、CPUのクロック数が低くならなくなりました。扇風機で冷やしている様子。見た目はダサいが、これで問題は解決された。背に腹は代えられない。ということで、こういうのを買えば解決する。 プライムデー前に買うか考え中。→買ったけど、ほんの少し改善したかんじです。根本的に発熱が大きすぎます。 https://amzn. to/3mRkn4C 考察 なかなかトラブルシューティングが大変でしたが、熱暴走ということがわかりました。iStats menuを使っていない場合は問題に気づけなかった気がします。これから夏にかけて温度が上がっていくのでクロック数は注意したほうが良いです。今後、問題に気づきやすいように重要数値を確認しやすくしました。ファンの回転の制御を自動だったのを手動にして最大にしてみました。(左右で最大回転数が違うんですね)テレカン中には、Chromeの負荷が高くなるのはもちろんのこと、krisp(ノイズキャンセリングをソフトウェアでやるやつ)もそこそこCPUを食うことがわかります。追記:2021年7月6日 もう、熱問題の原因箇所がわからなすぎで困ってましたが、PCを20cmぐらいの高さから落としてしまったときにホコリの粉がファンの出口からドバっって出てきたからブロワーでは取り切れないホコリがありそうなことがわかりました。 自分で分解するのは怖いのでGenius Barに行ってホコリを除去してもらいました。ホコリは堆積していたみたいですが冷却に影響するほどでは無かったそうです。SMC, PRAMとNVRAMのリセットが勝手に行われている感じはしました。 Apple Storeの人にはクリーンインストールをおすすめされました。 そして、ホコリを除去してもらった後のテレカン時のファン稼働はこちら。ホコリを除去して貰う前と比較して変化はほとんどありませんでした。 世界中で問題になっている こちらのスレが一番情報がまとまっていますが、解決方法は無さそうです。。。。 https://www. reddit. com/r/macbookpro/comments/ekh86o/macbook_pro_16_heat_issues_with_external_monitor/ 追記: この問題の解決を諦めてM1を買いました 買ったのはこちらのMacBook Pro 14inch M1 Pro M1では全然熱くなりません! ファンすら回りません。。。 --- ### Amazon Lightsailは初期立ち上げは楽だけど運用が辛い - Published: 2021-05-31 - Modified: 2021-06-03 - URL: https://blog.teraren.com/2021/05/31/amazon-lightsail-os-upgrade-failure/ - カテゴリー: AWS - タグ: AWS, Lightsail, Wordpress 概要 2年前ぐらいに Lightsailで立ち上げたWordpressサイトがありました。アプリケーション、ミドルウェア、OSを一通り最新にしようとしましたが、無理だったのでインスタンスを作り直しました。 背景 ふと確認すると、Wordpress本体が最新は5. 7. 2なのに対して、5. 4系でした。phpも7. 2だったので3ヶ月前にサポートが切れてしまっていました。Ubuntu 16. 02 LTS。最新は20なのでメジャーバージョンが2つ低い。 行った手順 Wordpress本体、プラグイン、テーマはwpコマンド経由で更新できました。このあたりの記事を参考に普通にあdo-release-upgradeをして、再起動をかけたらsshで繋がらなくなりました。もちろんWebのコンソールも以下のエラーメッセージが出て繋がりません。。。。万事休す。 UPSTREAM_NOT_FOUND 調べてみると、回避手段は、スタートアップスクリプトで、sshを停止して起動するというすごいワークアラウンドを実施する必要が有るらしいです。 bitnamiのページに書いてあるので、bitnamiのアプリケーション周りが怪しい挙動をしているのだと思います。bitnami自体は、OSのバージョンと密接に関連づいているはずなのでこのような不可解な事象が起きるのかと思います。 再度、スナップショットから復元してアップデートをかけるのはとても大変なので諦めて、最新のlightsail wordpressを立てて、wordpressのDB、themeファイル、htdocs以下のコピーを使って復元しました。 まとめ Lightsailの立ち上げは楽だし、運用は最低なら$3/monthなのでとても良いけど、長期運用をするには辛い。OSやミドルウェアの最新追随は不可能と考えて、1年か2年おきぐらいにインスタンスの載せ替えをするような運用をする必要がある。 余談 LightsailのDNSはトラフィックが少なければ無料です。大体、1. 1request/secなら無料なので殆どの場合はこれでまかなえるような気がします。 Q: Lightsail DNS 管理にかかるコストはどれくらいですか? Lightsail 内での DNS 管理は無料です。最大 3 つの DNS ゾーンを作成でき、各ゾーンのレコード数は無制限です。また、全ゾーンで 1 か月あたり 300 万 DNS クエリを利用できます。1 か月のクエリ数が最初の 300 万を超えると、0. 40 USD/100 万 DNS クエリの料金が適用されます。https://aws. amazon. com/jp/lightsail/faq/ LightsailのDNSは、動的にLightsailのインスタンスへ向けられるので、Lightsail + LightsailのDNSを使う組み合わせに留めるレベルのシステムなら最適なソリューションです。ロードバランサ(18USD/month)を使っていくと値段が普通に高くなっていくのであまりLightsailの魅力が無くなってきます。 --- ### 郵便番号APIサイトのデータソースをzipcloudに変更 - Published: 2021-04-25 - Modified: 2021-09-06 - URL: https://blog.teraren.com/2021/04/25/postcode-api-master-change/ - カテゴリー: Program & Service 概要 私が運営している郵便番号検索APIサイトにて、今までは、郵便局が提供していたデータを加工して利用していましたが、それでは追いつかないぐらい正規化されていない項目が多いため自分でメンテナンスするより他社がしっかりメンテナンスしているデータを使ったほうがユーザメリットが大きいと判断しました。このたび、zipcloudが提供するデータに差し替えました。左が郵便局が提供しているデータ、右がzipcloudが提供しているデータのvimdiffです。 変更点を見てみる vimdiffで見ていって、目立った変更点をピックアップしてみます。 まず、丁目の表記が消えます。 1行に複数の住所が入っているレコードは、2行に分割されます。しかしながら、当方のサイトでは1つの郵便番号に対して一意の住所を返却したいので1行目の方だけを採用します。 京都府のマスタと呼べないような記述の部分はこのように正規化されます。 もともと1郵便番号に対して複数行でしたが、2倍位の行数に増えています。 不具合ありましたらご連絡願います。 まとめ 差分は大きいですが、郵便番号から住所を求めるというユースケースにおいてはzipcloudのデータのほうが綺麗なので問題無さそうです。 --- ### 分割されていない電話番号から市外局番と市内局番の求め方 - Published: 2021-04-15 - Modified: 2021-04-15 - URL: https://blog.teraren.com/2021/04/15/split-area-code/ - カテゴリー: Ruby - タグ: ruby, 市内局番, 市外局番, 電話番号 概要 分割されていない電話番号から、市内局番や市外局番を求めたい。0292323011 => 029-232-3011phonelibが良さそう。phonelibはGoogle libphonenumberのデータをもとにしている。日本の市外局番マスタはPDFで提供されていて辛い。。。。https://www. soumu. go. jp/main_content/000141817. pdfGoogle libphonenumberはこの内容もちゃんとアップデートされている模様。これの悲しいのは、桁数で明確に市内局番が別れていないことです。市内局番が例えば、137と1377が存在します。なので、最長一致でマッチングする必要があります。 実装 irb> require 'phonelib' irb> Phonelib. default_country = "JP" irb> Phonelib. parse('0292323011'). national. split('-') => irb> Phonelib. parse('0292323011'). area_code => "29" --- ### tableau serverのホスト名が変わってしまったときの対処法 - Published: 2021-04-14 - Modified: 2021-09-21 - URL: https://blog.teraren.com/2021/04/14/tableau-server-certificate-error/ - カテゴリー: AWS - タグ: tableau server 背景 Tableau serverをAWS EC2で運用しています。 問題 インスタンスを落として、別のsubnetで起動したらtableau serverがちゃんと動かなくなってしまった。具体的には、Webからアクセスできない。tsmコマンドを打つとエラーになる。% tsm statusUnable to verify the server's HTTPS certificate. 以下のcertificate checkを無視するオプションを付けても変化なし。% tsm status --accepteula大量にエラーが出力され続ける。sudo tail -f /var/opt/tableau/tableau_server/data/tabsvc/**/* 対処法 hostnamectl set-hostnameを使って古いインスタンスのホスト名を無理やり設定する。その後、インスタンスのリブートをします。 以下がコマンド例。 sudo hostnamectl set-hostname ip-xxx-xxx-xxx-xxx. ap-northeast-1. compute. internal sudo reboot 本来のやり方 落とす前にtsmコマンド経由でbackupファイルを作成する新規ホストでtableau serverをクリーンインストールbackupファイルを復元 考察 tsm関連 tableauのtsmコマンドは、裏でhttpsで通信しているhttps serverはself signedなSSL証明書を使っているtsmコマンドはself signedなSSL証明書だったら認証が通る。しかしながら、ホスト名が変わるとSSL証明書のホスト名と不一致になるので通らなくなる。 tableau server関連 内部でセットアップ時のホスト名を保持している様子。よってホスト名が変更されると正常に動かなくなる。今回は無理やり前回のホスト名に合わせることで対処 --- ### 自宅LinuxサーバにUPS(無停電電源装置)導入 - Published: 2021-04-14 - Modified: 2024-07-01 - URL: https://blog.teraren.com/2021/04/14/ups/ - カテゴリー: Linux - タグ: APC, apcupsd, Linux, Ubuntu, UPS 概要 UPSが1万5000円ぐらいなのでこのblogが動いているLinuxサーバに導入してみました。 UPSとは、「Uninterruptible Power Supply」の略で、日本語では「無停電電源装置」と訳します。 APC RS 550 BR550S-JP Eを買いました。あまり商品リサーチはしてません。APCは老舗なのでまぁ、安心かなと。 https://amzn. to/3tborOo 物理的なセットアップ まず最初に、UPSの蓋を開けてバッテリーのケーブルを接続します。初期状態ではケーブルが外れた状態になっています。バイクのバッテリーみたいな電池が入ってました。 そして、こんな感じに適当にケーブルを接続してセットアップ。 残り時間は27分と出ています。 サーバであんまり電力消費しないはずなのに想定より短い感じです。今回は常時70Wぐらい使われています。mac miniでは5wしか消費されていなかたのに全然違う。。。 付属のUSBケーブルでUPSと接続しておきます。 ソフトウェア設定 apcupsdというデーモンで管理します。これによって、UPSの電池が切れそうになったらLinuxが自動的にシャットダウンされます。 aptで入るのでインストールします。 matsu@dell ~> sudo apt install apcupsd Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: apcupsd-doc Suggested packages: apcupsd-cgi The following NEW packages will be installed: apcupsd apcupsd-doc 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 532 kB of archives. After this operation, 1,743 kB of additional disk space will be used. Do you want to continue? y Get:1 http://ftp. riken. jp/Linux/ubuntu focal/universe amd64 apcupsd-doc all 3. 14. 14-3build1 Get:2 http://ftp. riken. jp/Linux/ubuntu focal/universe amd64 apcupsd amd64 3. 14. 14-3build1 Fetched 532 kB in 3s (212 kB/s) Selecting previously unselected package apcupsd-doc. (Reading database ... 256476 files and directories currently installed. ) Preparing to unpack ... /apcupsd-doc_3. 14. 14-3build1_all. deb ... Unpacking apcupsd-doc (3. 14. 14-3build1) ... Selecting previously unselected package apcupsd. Preparing to unpack ... /apcupsd_3. 14. 14-3build1_amd64. deb ... Unpacking apcupsd (3. 14. 14-3build1) ... Setting up apcupsd (3. 14. 14-3build1) ... Created symlink /etc/systemd/system/multi-user. target. wants/apcupsd. service → /lib/systemd/system/apcupsd. service. Setting up apcupsd-doc (3. 14. 14-3build1) ... Processing triggers for man-db (2. 9. 1-1) ... Processing triggers for systemd (245. 4-4ubuntu3. 6) ... perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = "en_US:en", LC_ALL = (unset), LC_CTYPE = "UTF-8", LC_COLLATE = "C", LC_TERMINAL = "iTerm2", LANG = "C" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = "en_US:en", LC_ALL = (unset), LC_CTYPE = "UTF-8", LC_COLLATE = "C", LC_TERMINAL = "iTerm2", LANG = "C" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). 23 files changed, 816 insertions(+) create mode 100755 apcupsd/apccontrol create mode 100644 apcupsd/apcupsd. conf create mode 100755 apcupsd/changeme create mode 100755 apcupsd/commfailure create mode 100755 apcupsd/commok create mode 100644 apcupsd/hosts. conf create mode 100755 apcupsd/killpower create mode 100644 apcupsd/multimon. conf create mode 100755 apcupsd/offbattery create mode 100755 apcupsd/onbattery create mode 100755 apcupsd/ups-monitor create mode 100644 default/apcupsd create mode 100755 init. d/apcupsd create mode 120000 init. d/ups-monitor create mode 120000 rc0. d/K01apcupsd create mode 120000 rc1. d/K01apcupsd create mode 120000 rc2. d/S01apcupsd create mode 120000 rc3. d/S01apcupsd create mode 120000 rc4. d/S01apcupsd create mode 120000 rc5. d/S01apcupsd create mode 120000 rc6. d/K01apcupsd create mode 120000 systemd/system/multi-user. target. wants/apcupsd. service インストール直後は勝手にデーモンが立ち上がって稼働しだします。初期設定を1つもしていないのに。。。 私の環境の場合、1つだけ追加で設定するだけで最低限の動作はします。DEVICEの行をコメントアウトするだけでした。 # DEVICE /dev/ttyS0 その後は、デーモンの再起動をします。sudo systemctl restart apcupsd 単独でAPCのUPSを使う場合はこれだけでよしなに動いてくれます。 設定されているパラメータを確認 apctestコマンドでステータスを表示できるかと思いきや、デーモンが立ち上がっている場合はこのコマンドは使えないよです。 matsu@dell ~> sudo apctest password for matsu: 2021-04-13 18:08:20 apctest 3. 14. 14 (31 May 2016) debian Checking configuration ... sharenet. type = Network & ShareUPS Disabled cable. type = USB Cable mode. type = USB UPS Driver apctest FATAL ERROR in apctest. c at line 311 Unable to create UPS lock file. If apcupsd or apctest is already running, please stop it and run this program again. apctest error termination completed 代わりに、apcaccessというコマンドを利用します。これを使えばデーモン経由で情報を取得してくるみたいです。 > sudo apcaccess APC : 001,036,0850 DATE : 2024-06-30 15:47:11 +0000 HOSTNAME : gmk VERSION : 3. 14. 14 (31 May 2016) debian UPSNAME : gmk CABLE : USB Cable DRIVER : USB UPS Driver UPSMODE : Stand Alone STARTTIME: 2024-06-30 15:42:16 +0000 MODEL : APC RS 550S STATUS : ONLINE LINEV : 105. 0 Volts LOADPCT : 13. 0 Percent BCHARGE : 96. 0 Percent TIMELEFT : 39. 3 Minutes MBATTCHG : 5 Percent MINTIMEL : 3 Minutes MAXTIME : 0 Seconds SENSE : Medium LOTRANS : 82. 0 Volts HITRANS : 123. 0 Volts ALARMDEL : No alarm BATTV : 13. 5 Volts LASTXFER : No transfers since turnon NUMXFERS : 0 TONBATT : 0 Seconds CUMONBATT: 0 Seconds XOFFBATT : N/A SELFTEST : NO STATFLAG : 0x05000008 SERIALNO : 4B2033P28395 BATTDATE : 2020-08-16 NOMINV : 100 Volts NOMBATTV : 12. 0 Volts NOMPOWER : 330 Watts FIRMWARE : 941. c6 . A USB FW:c6 END APC : 2024-06-30 15:47:24 +0000 設定ファイルの確認 設定ファイルのパラメータを覗いてみます。ファイルは /etc/apcupsd/apcupsd. conf にあります。 UPSCABLE usb UPSとの通信を何で行っているかです。USBなのでそのままでOK。 BATTERYLEVEL 5 電池の残りが5%になったらshutdown -hを実行するということ。 MINUTES 3 電池の残りが3分以下になったらshutdown -hを実行するということ。上記とor条件かなと思います。 ANNOY 300 シャットダウンの300秒前から、broadcastメッセージを出してユーザにログアウトを促す。 停電のテスト 商用電源を抜き差ししてみます。 流石にシャットダウンされては困るので短時間抜き差ししてみます。 抜いてみたときのログ。/var/log/syslog Apr 13 17:06:20 dell apcupsd: Power failure. Apr 13 17:06:26 dell apcupsd: Running on UPS batteries. 同時にメールがrootに飛びます。 商用電源を復帰させたときのログ Apr 13 17:06:55 dell apcupsd: Mains returned. No longer on UPS batteries. Apr 13 17:06:55 dell apcupsd: Power is back. UPS running on mains. Mackerelから各種指標を監視する gistにコードを書いておきました。 https://gist. github. com/matsubo/764666d00d25f2a53b505292c9a7c501 --- ### CSVデータをActiveRecordにimportする際における各手法のベンチマーク - Published: 2021-03-21 - Modified: 2021-09-06 - URL: https://blog.teraren.com/2021/03/21/csv-activerecord-import/ - カテゴリー: Ruby on Rails - タグ: ActiveRecord, csv, import 概要 RubyにおいてCSVデータをDBに挿入する際の手法による速度の違いをベンチマークCSVデータのインポート処理は業務系のWebアプリケーションを構築する際にはほぼ必ず必要となる機能なので感覚地として掴んでおくことが目的です。 ベンチマーク対象のアプリケーション 郵便番号のAPIを提供しているサービス https://postcode. teraren. com/ のデータ洗い替えの処理郵便局のサイトから、郵便番号データと、事業所のデータをダウンロードimportの処理流れ郵便番号のデータで洗替郵便番号のデータを処理して、建物ごとに郵便番号をまとめて洗い替え事業所のデータを洗替 この処理を運用中のサービスでは月初に自動で行っています。 Rails6でアプリケーションは書かれていますが、Rails5の場合も考慮してbulk insertにはactiverecord-importを使います。どちらを使ってもほぼ速度は変わらないようです。 データ量は、郵便番号のデータが124,568レコード、事業所のデータが22,371レコードです。 Ruby 3. 0. 0 + Rails 6. 1. 3 アプローチ データをインポートする際に、どの程度抽象的なプログラミングを行うかがキーになってきます。低レイヤーで書けば書くほど速度は早いけど、ビジネスロジック上で面倒を見ないといけないことが多くなります。 主に悩む選択肢は以下です。 ActiveRecordオブジェクトをつかつか、Hashを使うか? (ActiveRecord VS Hash)bulk insertを使うかどうか? (insert VS bulk insert) それぞれのパターンで計測してみます。 ベンチマーク 以下のパターンでとりました。 Hash VS ActiveRecordinsert VS bulk insert 一応、比較のためにRails6のinsert_allのベンチマークも取ってみましたが、importよりかなり速いです。 activerecord-importはデフォルトでvalidateがかかりますが、ActiveRecord 6のinsert_allはvalidateは走りらないことが速度の差かと思います。DBへのアクセスが発生するようなvalidationは行っていませんが塵も積もれば山となる感じかと思います。 考察 ActiveRecord VS Hashの結果Hashのほうが20秒ぐらい速い。=約22%速い。insert VS bulk insertbulk insertのほうが約220秒速い。=約74%速い。 注意:前処理の時間(約10秒)を含んだベンチマークなので、実装コード部分だけで考えれば、上記の表記よりずっと速い。 まとめ CSVをインポートする際は以下の組み合わせが一番速いHashの配列を作るRails6のinsert_allを使うもともとは110秒かかっていた処理を76秒にしました。=約30%高速化。おもな変更点は2つ。ActiveRecordのインスタンスを作るのをやめて、import gemをinsert_allに変更。 --- ### TOPPING D10 USB DACのチップをOPA627AUに交換 - Published: 2021-03-15 - Modified: 2024-06-17 - URL: https://blog.teraren.com/2021/03/15/topping-d10-usb-dac-opa627au/ - カテゴリー: Gadget - タグ: OPA627AU, TOPPING D10, USB DAC 今持っている、TOPPING D10というUSB DACはもとから評価が高くて良い品なのに加えて、オペアンプのチップを交換できるというすぐれものなので交換してみたいと思います。 https://amzn. to/3t6dU70 買ったチップはこちら。そっくりそのまま入れ替えられます。 Burr-Brown社製 OPA627AU 2回路DIP化オペアンプ完成基板 実装品 2,980円 もともと搭載されているのはOPA2134PAです。 こちらが交換をするTOPPING D10です。32bit 384kHzに対応するDACです。こんな良質な音源は手元にないので完全に活かしきれませんが。。。 蓋を開けたところ。筐体と基盤を接着するボンドの処理が汚い。。。。ついでにきれいに掃除しておきます。 載せ替えたところ。以下の写真が正解の向き。 向きがよくわからなかったので、最初は逆向きにつけて電源を入れたら、チップがものすごく熱くなってしまった。。。再度差し直したら音が鳴ったので大丈夫だったのかなと思います。 チップを入れ替えた結果は、、、、よくわからないですね。音源が悪いからだと思います。 スピーカーはYAMAHA MSP5 Studioです。 --- ### CloudWatchにrubyアプリケーションからログを投げる - Published: 2021-03-12 - Modified: 2021-04-12 - URL: https://blog.teraren.com/2021/03/12/cloudwatch-ruby/ - カテゴリー: Ruby - タグ: CloudWatch, ruby しかし、投げまくっていると以下のような例外が出るので、Throttlingされてしまったらsleepする必要があります。そうなると全体としての処理パフォーマンスのボトルネックになってしまうので要注意です。 Aws::CloudWatchLogs::Errors::ThrottlingException Rate exceeded CloudWatchに投げておけば後々の統計処理が楽になるので。 それにしても、ログを送るだけなのにコードをいっぱい書かないといけないなぁ。。。 --- ### ワンライナーでJSONをCSVに変換 - Published: 2021-03-10 - Modified: 2021-03-10 - URL: https://blog.teraren.com/2021/03/10/json-to-csv/ - カテゴリー: Linux - タグ: csv, jq, JSON リモートに有る郵便番号の一覧をJSONで取得して、必要なカラムだけを抽出してCSVファイルを作る方法です。 jqコマンドを使えば、いかに上げる例以外の 色々な集約や、構造の変更ができます。 ---