タイガー計算器(4)
数字ダイヤルが汚れている。
プラスチックだし、大丈夫かなと思いながら、クレのパーツクリーナでシュワシュワしながら歯ブラシでゴシゴシ。
キレイになった。
置数レバードラム(というのかな?)もパーツクリーナでキレイに。写真は999999999にして、歯車が全て飛び出した状態。歯の位置が微妙にずれているのは、ダイヤルを回すタイミングをずらして、操作が軽くなるように(たぶん)。
内部の油も流出したためか、置数レバーの動きが引っ掛かる様になってしまった。クレ5−56を吹き付けてやると、軽く動く様になった。
下部には、引きすぎた時にチーンと鳴るはずのベルがあるんだけど、覗き込んでもこれを叩く様なものがない。引きすぎの動作をしてみると、この近くのレバーが動くんだけど、どの部品がベルを叩くのか分からない。
動きが悪いわけでもなさそうだし、でも、この部分を詳しく調べるには、キャリッジを外さないとダメだし、キャリッジ外すのは・・・元に戻す自信がない。
ということで、分解掃除はここまで。
タイガー計算器(3)
部分の名称を説明しておかないと、説明が難しい。
右に飛び出ているのがクランクハンドル。黒いツマミを引っ張って、加算の時は右に、減算の時は左に回す。
虎のマークの右は置数レバー、新しいモデルはこの置数レバーで値を設定するとその上部にチェックダイヤルというのがあって、そこに数値が現れるのだけれど、このモデルにはチェックダイヤルは無い。
置数レバーの下部数字がずらっと並んでいるのが右ダイヤル。ここに加算されていく。
右ダイヤルの右の小さいレバーは右帰零ハンドル。手前に回すと右ダイヤルが全てゼロになる。
左に数字がずらっと並んでいるのが左ダイヤル。これは、ハンドルを回した回数をカウントしてくれる。
左ダイヤルの左の小さなレバーは左帰零ハンドル。手前に回すと左ダイヤルが全てゼロになる。
右ダイヤルと左ダイヤルの塊をキャレージと呼ぶ。
前面下部のレバーは、桁送り。キャレージを左右に1桁ずつ移動する。
で、カバーを外すとこんな感じ。
内部は油とホコリでベタベタ。綺麗にしてあげよう。
タイガー計算器 (2)
買ったタイガー計算機は虎のマークが刻印されている戦時中(?)のもの。
製造番号は32644。
タイガー計算器さんのサイトによると、製造番号26787が1940年、製造番号66566が1949年の製造。なので、そのあいだということは確か。
26787はダイアル桁数が6x7x12だけれど、これは9x10x18。
つまり9桁まで計算できる。(それがどうした?)
いや、その、9桁以下x10桁以下=18桁以下の計算ができる。(ふーん)
虎のマークの左、横に+、ーが書かれたレバーはハンドルが加算方向、減算方向どちらに回されたのかを示すもの。
webでみる説明では、これはクラッチと呼ばれ、リセットした後、ハンドルをどちらに回しても左ダイヤルが加算される・・・らしいのだけれど、
こいつはハンドルを右に回すと、白い数字、左に回すと赤い数字で、特にクラッチ機構はついていないみたい。(分解してわかったことだけどね)
後この写真でわかるのは、右の方、数字がいっぱい書かれているところは置数レバー、これで最初の数値を設定するんだけれど、その数字の左、袋ナットがついているレバー、これは、置数レバーを一気にクリアするもの。元は黒いツマミがついていたはずだけど、壊れちゃったのかな、袋ナットになっていました。
データの保存と読込み
ホームボタンで閉じるだけなら実行が止まるだけなので、再び開くと止まった所から再開する。
スワイプで完全に終了してしまうと内部のデータは全て消えてしまうので、それでも続きから再開したければ、データを保存する必要がある。
保存するデータが少量の場合は、
UserDefaults.standard
に保存するのが簡単。
UserDefaults.standard.set(val, forKey: "data")
とすれば、valの値が"data"という名前で保存される。
valの型はなんでも良い。
これを読み出すときは、
UserDefaults.standard.object(forKey: "data")
なのだけれど、値が保存されていない時、nilが返される。
そのため、直接valに代入しようとすると、値がないときはエラーとなってしまう。
そこで、こんな関数を用意してみる。
func readInt(key : String,org : Int) -> Int{
if UserDefaults.standard.object(forKey: key) != nil{
return UserDefaults.standard.object(forKey: key) as! Int
}else{
return org
}
}
そして
val = readInt(key: "data", org: 0)
として読み込む。
つまり、"data"という名前がついた値があるか、あればその値をIntとして読み込んで返す。
この関数はInt型のデータ読み込み専用である。
そして、値がなければ、orgで指定した値がvalに代入される。
他の方の値を読み込むには、その型用の関数をつくる。
String型のデータを読み込むなら、上記の関数のIntをStringに変えたものを用意すれば良い。
データの読み込みは初期化の時に読み込めば良い。
データの書出しは?
プログラムを終了する時に書き込めば無駄がないのだけれど、いつ終了されるのかが分からない。
仕方がないので、プログラムのループ毎に書き出すことにする。
大量のデータ保存には向いていない。
サンプル作成中
Xーcodeで File>new>Project プロジェクトの作成だよ
ios、SingleView App >next
Product name プログラムの名前(今回はGAMEとした)
ファイルの場所を指定して(デスクトップに作ったけど)
ContentView.swift を含むプロジェクトが作成される。
Classをつくる
File>new>File で SwiftUI.View
SaveAs のところにClass名(GAME)を指定してCreate
Classの定義なので、View表示のところは消してしまう。
GAME.swift
//
// GAME.swift
// base
//
// Created by **** on 2020/09/22.
// Copyright © 2020 ****. All rights reserved.
//
import SwiftUI
class Game: ObservableObject{
@Published var count:Int = 0
var timer = Timer()
init(){
count = 1
timerStart()
}
func timerStart(){
self.timer = Timer.scheduledTimer(withTimeInterval: 0.3, repeats: true){ timer in
self.timercall()
}
}
func timercall(){
count += 1
}
}
struct GAME_Previews: PreviewProvider {
static var previews: some View {
/*@START_MENU_TOKEN@*/Text("Hello, World!")/*@END_MENU_TOKEN@*/
}
}
Swiftuiで作ったら、Previewsを消しても勝手にまた出来ちゃった。
swiftで作れば良かったのかも。
ContentView
//
// ContentView.swift
// base
//
// Created by **** on 2020/09/22.
// Copyright © 2020 ****. All rights reserved.
//
import SwiftUI
struct ContentView: View {
@EnvironmentObject var game: Game
var body: some View {
Text("count \(game.count)")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environmentObject(Game()) //これがないと表示の時にエラーとなる
}
}
それから、SceneDelegate.swiftの
let contentView = ContentView()
の後に1行足して
let contentView = ContentView()
.environmentObject(Game())
とする。
このプログラムは、タイマ割り込みでcountをインクリメントして、表示するだけのもの。
シミュレータで実行するとカウントアップしていく様子がわかる。
シミュレータでホームボタンを押してしばらくしてからもう一度開くと、
カウント値が3〜5増えた所からスタートする。
つまり、ホームボタンで閉じると数秒はまだ動いているけれど、その後停止するということみたい。