「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」とは ?

位置がタイムラインに正確に表示できてない。

設定を見てみると、

👉 Google - マイ アクティビティ hatena-bookmark

iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください

なんやこれ ?

 

🗺️ Google マップ コミュニティ

Google マップ コミュニティで調べます。

タイムラインがいつのまにか記録されなくなり、調べたら「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」となっていて、使っているデバイスが選択出来なくなっていました。googleマップは今までと同じアカウントで同じアプリを使用してるのですが…どうすれば直るでしょうか?

👉 iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください - Google マップ コミュニティ hatena-bookmark

iPhone で。


設定

 ↓

プライバシーとセキュリティ

 ↓

位置情報サービス

 ↓

Google Maps

これでも、直らん。

 

🗺️ まとめ

精度 (細かさ) が落ちたんでしょうね。

また、AndroidとiOSでは、この元データのスポットの採取タイミングに違いがあり、Androidに比べてiOSのほうが取得頻度が低いため、類推するための情報が少なくなってしまい、余計に直線になってしまうことがあるような気がしています。

取得頻度は、過去は結構な頻度で取得されていたのですが、いま時点は非常に少ないと思います。

👉 タイムライン表示で、元データはスポットとして残っているのに大部分が経路として参照されず、数点を直線で結んでしまうのはなぜでしょう。 - Google マップ コミュニティ hatena-bookmark

ここでも、また、悲しい感じとなってますね。

「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」 は消すことができませんし。


【 SwiftUI 】 Pong Wars を SwiftUI に移植してみた

見てて飽きないので Xcode Playground で SwiftUI の練習。

ソースは以下2つあればいけるだろう、と雰囲気で。

👉 vnglst/pong-wars hatena-bookmark
👉 vocdex/pong-wars-python: Python version of Pong Wars with Pygame hatena-bookmark

一つのファイルで終わらせたい。

 

🏓 結果




 

🏓 まとめ

Playground では遅すぎですがソースコード。

import Foundation
@Observable final class Pong {
var squares: [Square] = []
var balls: [Ball] = []
var dayCount = 0
var nightCount = 0
var generation = 0
private var cols = 0
private var rows = 0
private var task: Task<Void, Never>?
func create(cols: Int, rows: Int) {
self.cols = cols
self.rows = rows
createSquares()
createBalls()
}
func start() {
task = Task { @MainActor in // *
do {
while true {
balls.forEach { ball in
updateSquares(ball)
ball.checkBoundary(cols, rows)
ball.avoidSpin() // *
ball.next()
}
dayCount = count(day: true)
nightCount = count(day: false)
generation += 1
try await Task.sleep(for: .seconds(.duration))
}
} catch {
if Task.isCancelled {
print("cancelled.")
}
}
}
}
func stop() {
task?.cancel()
}
private func createSquares() {
(0 ..< rows).forEach { _ in
(0 ..< cols).forEach { i in
squares.append(
Square(day: i < cols / 2)
)
}
}
}
private func createBalls() {
balls.append(
Ball(
x: 0,
y: 0,
dx: .size / 2,
dy: .size / 2,
day: false)
)
balls.append(
Ball(
x: Double(cols - 1) * .size,
y: Double(rows - 1) * .size,
dx: -.size / 2,
dy: -.size / 2,
day: true
)
)
}
private func updateSquares(_ ball: Ball) {
for angle in stride(from: 0, to: Double.pi * 2, by: Double.pi / 4) {
let cos = cos(angle)
let sin = sin(angle)
let checkX = ball.x + cos * .size / 2
let checkY = ball.y + sin * .size / 2
let i = Int(floor(checkX / .size))
let j = Int(floor(checkY / .size))
if (0 ..< cols).contains(i) && (0 ..< rows).contains(j) {
let index = cols * j + i
if squares[index].day == ball.day {
squares[index].day.toggle()
if abs(cos) > abs(sin) {
ball.dx *= -1
}
if abs(cos) < abs(sin) {
ball.dy *= -1
}
}
}
}
}
func count(day: Bool) -> Int {
return squares.compactMap { $0.day }.filter { $0 == day }.count
}
}
@Observable final class Square {
var day: Bool
init(day: Bool) {
self.day = day
}
}
@Observable final class Ball: Identifiable {
var x: Double
var y: Double
var dx: Double
var dy: Double
var day: Bool
var queue: [Double] = []
init(x: Double, y: Double, dx: Double, dy: Double, day: Bool) {
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.day = day
}
}
extension Ball {
func next() {
x += dx
y += dy
}
func checkBoundary(_ cols: Int, _ rows: Int) {
if !(0...Double(cols - 1) * .size).contains(x + dx) {
dx *= -1
}
if !(0...Double(rows - 1) * .size).contains(y + dy) {
dy *= -1
}
}
func avoidSpin() {
queue.append(x)
if queue.count > 25 { // recent 25 values
queue.removeFirst()
if (queue.max()! - queue.min()! <= .size) {
print(day, x, y, dx, dy, queue)
if day {
dx *= -1
} else {
dy *= -1
}
queue.removeAll()
}
}
}
}
import Foundation
import SwiftUI
struct PongWars: View {
private var pong = Pong()
var body: some View {
VStack(spacing: 0) {
PongLayout(pong: pong)
VStack {
Text("day \(pong.dayCount) | night \(pong.nightCount)").font(.headline)
Text("generation \(pong.generation)").font(.headline)
}
.padding()
}
}
}
struct PongLayout: View {
var pong: Pong
@State private var on = false
var body: some View {
GeometryReader { gp in
ZStack {
ForEach(pong.squares.indices, id: \.self) { index in
SquareView(index: index, cols: gp.cols, day: pong.squares[index].day)
}
ForEach(pong.balls) { ball in
BallView(ball: ball)
}
}
.frame(width: Double(gp.cols) * .size, height: Double(gp.rows) * .size)
.frame(width: gp.width, height: gp.height, alignment: .center)
.onAppear {
pong.create(cols: gp.cols, rows: gp.rows)
}
.onTapGesture {
on.toggle()
if on {
pong.start()
} else {
pong.stop()
}
}
}
}
}
struct SquareView: View {
private var i: Int
private var j: Int
private var color: Color
init(index: Int, cols: Int, day: Bool) {
self.i = index % cols
self.j = index / cols
self.color = day ? .day : .night
}
var body: some View {
color
.frame(width: CGFloat(.size), height: CGFloat(.size))
.position(x: Double(i) * .size + .size / 2, y: Double(j) * .size + .size / 2)
}
}
struct BallView: View {
var ball: Ball
var body: some View {
Circle()
.fill(ball.day ? Color.day : Color.night)
.frame(width: CGFloat(.size))
.position(x: ball.x + .size / 2, y: ball.y + .size / 2)
}
}
extension GeometryProxy {
var width: CGFloat { size.width }
var height: CGFloat { size.height }
var cols: Int { Int(width / .size) }
var rows: Int { Int(height / .size) }
}
extension Double {
static let size = 25.0
static let duration = 0.001
}
extension Color {
static let day = Color(red: 217 / 256, green: 231 / 256, blue: 226 / 256)
static let night = Color(red: 15 / 256, green: 75 / 256, blue: 89 / 256)
}
#Preview {
PongWars()
}

テストプロジェクトなどで Preview や Simulator でみると、

まあ、スピードもそれなりで上の動画の雰囲気でした。

Gist のコードはあれこれ更新されていきます。いってます。

どうぞよろしくお願います。

 

🏓 追記

4100ループ付近で。

残念 !

計算と描画ははっきり区別しないと痛い目に遭いそうな感じ。

→ 修正しました。

→ 2024-02-07 衝突時のロジックを確認、更新しました。


【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning 🧹 + Window Manager = OneMenu

キーボードをロック(無効化)して拭き掃除したい。

これですかね。

【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning + Window Manager = OneMenu

👉 folivora.ai - Great Tools for your Mac! hatena-bookmark

ネット上にもたくさんの記事を見かけます。

ちょっとあれなんで他を探します。

 

🧹 OneMenu

ありました。メニューバーから使います。

こんな感じです。

【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning + Window Manager = OneMenu

CPU、メモリ、ストレージの使用率と2つのスイッチが表示されています。

【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning 🧹 + Window Manager = OneMenu
👉 OneMenu for Mac — Marko hatena-bookmark

 

🧹 Keyboard Cleaning

キーボードの無効化です。

マウス、トラックパッドは生きていますので、ON / OFF はキーボードを無効化した後でも、メニューバーから操作可能です。

マウス、トラックパッドは生きていますので、ON / OFF はキーボードを無効化した後でも、メニューバーから操作可能です。

 

🧹 Window Manager

ウィンドウをマウスで掴んで、画面上で動かすと、全画面、1/2 (左、右)、1/4 (左上、左下、右上、右下) サイズに自動でリサイズしてくれます。

また、それらは、キーボードショートカットからも利用できます。

【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning + Window Manager = OneMenu

すべて、Control + Option + の組み合わせなので覚えやすいし使いやすいです。

 

🧹 Preferences

【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning + Window Manager = OneMenu

【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning + Window Manager = OneMenu

「Window spacing」は、ウィンドウのサイズを調整後にそのまわりにあけるスペースの間隔。

「Shift key mode」は、ウインドウをマウスで掴んだときの自動サイズ変更を随時 Shift キーで有効化、無効化。

 

🧹 まとめ

Mac を使っていて不便に思えることの解消をまとめてくれるツールです。

作者が「欲しかったので自分で作っちゃいました。」という感じでしょうか。

YouTube や Instagramで作者のライフスタイルを見ることもできます。



👉 Marko(@withmarko) • Instagram写真と動画 hatena-bookmark