Makita (マキタ) 10.8V (スライド式) バッテリ で使える初心者向け工具まとめ

これ持ってる人、工具を購入するときには、マキタがいいかもしれません。


👉 10.8Vスライド式 | 株式会社マキタ hatena-bookmark

マキタのバッテリーは最強です。

兼用で使っていきましょう。

 

🛠️ 初心者向け工具一覧


👉 CL108FD | 株式会社マキタ hatena-bookmark


👉 DF033D | 株式会社マキタ hatena-bookmark


👉 TM30D | 株式会社マキタ hatena-bookmark


👉 JR104D | 株式会社マキタ hatena-bookmark


👉 MR052 | 株式会社マキタ hatena-bookmark


👉 ML105 | 株式会社マキタ hatena-bookmark

初心者向け低価格帯はこれぐらいでしょうか。

対応商品は、100以上ありますので、さらに上位のものを探すこともできます。


👉 10.8Vスライド式 | 株式会社マキタ hatena-bookmark

 

🛠️ その他

バッテリー自体は、非 Makita の同規格の製品もある模様。

👉 Amazon | Ehomtikk BL1015 マキタ10.8vバッテリー 互換 3.0Ah BL1015 BL1050 BL1060 BL1015B BL1040B BL1030対応 掃除機 バッテリー リチウムイオン電池 CL107FDZW 充電式クリーナ 充電式ファン CF101DZ マキタ 10.8v バッテリー | Ehomtikk | カメラ用バッテリーパック hatena-bookmark

しかし、バッテリーこそやっぱり「マキタ」ですね。

👉 株式会社マキタ hatena-bookmark



【SwiftData】バックグラウンドで @ModelActor を singleton で使う

UI スレッドをブロックしてるんですよね。

10万レコードのような大きいデータを fetch() すると。

バックグラウンドで大量インサートなどしながら、

UI側でリストなどをスクロールするともっと顕著に分かります。

どうやら、

「インスタンス生成をどこで行うか」

が大事なようです。

singleton の ModelActor 側。


@ModelActor
actor DataSource {
  nonisolated(unsafe) private(set) static var shared: DataSource!

//  static func createInstance(modelContainer: ModelContainer) {
//    print("createInstance()", Thread.current) // main
//    shared = DataSource(modelContainer: modelContainer)
//  }

  static func createInstance(modelContainer: ModelContainer) async {
    print("createInstance()", Thread.current) // not main
    shared = DataSource(modelContainer: modelContainer)
  }

View 側。インスタンス生成はバックグラウンドで。


//    .onAppear { // main
//      DataSource.createInstance(modelContainer: modelContext.container)
//    }
    .task { // not main
      await DataSource.createInstance(modelContainer: modelContext.container)
    }

どうなんすかね。



SwiftData も苦しんでる感じに見えます。

👉 SwiftData does not work on a background Task even inside a custom ModelActor. | Apple Developer Forums hatena-bookmark


【Swift】 @Observable に @MainActor をつけると おまえは 実質 ViewModel だろ

Swift のアーキテクチャパターンまわりの新しい記事を眺めてると、

@Observable には、明示的に @MainActor をつけましょう。

その親 View にも @MainActor をつけるのが推奨されます。

などと書いてるのを多く見かける。

「全部 UI スレッドでは?」

などと思いながら、あれこれやってみました。


import SwiftUI

@MainActor
struct TestWebRequest: View {
  @State private var responseBody = ""

  //private let url = URL(string: "https://wttr.in/?format=3")!

  //private var background = Background()
  private var viewModel = TestViewModel()

  var body: some View {
//    Text("\(responseBody)")
//    Text("\(background.responseBody)")
    Text("\(viewModel.responseBody)")

//      .onAppear { // OK
//        responseBody = try! String(contentsOf: url)
//      }

//      .onAppear {
//        // Passing argument of non-sendable type '(any URLSessionTaskDelegate)?'
//        // outside of main actor-isolated context may introduce data races
//        Task {
//          let (data, _) = try! await URLSession.shared.data(from: url)
//          responseBody = String(data: data, encoding: .utf8)!
//        }
//      }

//      .task {
//        // Passing argument of non-sendable type '(any URLSessionTaskDelegate)?'
//        // outside of main actor-isolated context may introduce data races
//        let (data, _) = try! await URLSession.shared.data(from: url)
//        responseBody = String(data: data, encoding: .utf8)!
//      }

//        .onAppear {
//          Task {
//            responseBody = await Background.request(url: url)
//          }
//        }

//      .task {
//        responseBody = await background.request(url: url)
//      }

//      .task {
//        responseBody = await background.request(url: url)
//      }

      .task {
        //await background.request(url: url)
        await viewModel.request()
      }
  }
}

@MainActor
@Observable
final class TestViewModel {
  var responseBody = ""

  private let background = Background()

  func request() async {
    responseBody = await background.request()
  }
}

//class Background: @unchecked Sendable {
final class Background: Sendable {
  private let url = URL(string: "https://wttr.in/?format=3")!

  func request() async -> String {
    let (data, _) = try! await URLSession.shared.data(from: url)
    return String(data: data, encoding: .utf8)!
  }
}

//actor Background {
//  private let url = URL(string: "https://wttr.in/?format=3")!
//
//  nonisolated func request() async -> String {
//    let (data, _) = try! await URLSession.shared.data(from: url)
//    return String(data: data, encoding: .utf8)!
//  }
//}

#Preview {
  TestWebRequest()
}


こうなりますか。

そろそろ消えてほしかった ViewModel。

いや、それとも、

おすすめ定番パターンを Apple はアナウンスしてもよくない ?

いろいろ混乱します。