Mac MiniにTypeScriptをインストールしてみた

Figmaプラグインを作ろうとして、TypeScriptを入れてみた。JavaScriptもよくわからないのに、やはり引っかかった。

環境として必要なのは、まずVSCodeでこれは使っていたので簡単にMSからダウンロードしてMacにもインストールできた。日本語化もしてすんなり終わった。次に、Node.jsこれは、JavaScriptを動かしてみるときに、ローカルのサーバーとして必要なのだそうだ。これもサイトから通常ダウンロードしてインストールも簡単に終わった。これでnpmというコマンドが使えるようになったのでTypeScriptをインストールすることになった。コマンドは、

「npm install -g typescript」

ところがこれがエラーが出てインストールできない。

エラーは「permission denied」でディレクトリを作るときに出ている。そのときのターミナル画面をコピーすると

+++++mac@+++++Mac-mini ~ % npm install -g typescript

npm ERR! code EACCES

npm ERR! syscall mkdir

npm ERR! path /usr/local/lib/node_modules/typescript

npm ERR! errno -13

npm ERR! Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/typescript'

npm ERR!  [Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/typescript'] {

npm ERR!   errno: -13,

npm ERR!   code: 'EACCES',

npm ERR!   syscall: 'mkdir',

npm ERR!   path: '/usr/local/lib/node_modules/typescript'

npm ERR! }

npm ERR!

npm ERR! The operation was rejected by your operating system.

npm ERR! It is likely you do not have the permissions to access this file as the current user

npm ERR!

npm ERR! If you believe this might be a permissions issue, please double-check the

npm ERR! permissions of the file and its containing directories, or try running

npm ERR! the command again as root/Administrator.

 

npm ERR! A complete log of this run can be found in: /Users/+++++mac/.npm/_logs/2023-12-24T08_27_12_043Z-debug-0.log

いろいろ調べてみると、関連ディレクトリのパーミッションを変更するとの事だったが、面倒だったので、sudoでやってみるとあっという間にインストールが終わった。なんて事なかった。MACでもsudoが使えることが分かった。この後関連ディレクトリで問題が起こるかもしれないが、まあできた。

tsc -v でバージョンを見てみるとちゃんと5.3.3がインストールできたことが分かった。

インストールはできたけど、VSCodeでどうやって使うのかはまだまだだ。

Apple Watch Timerを作成している

時間を測って、何かをしているとき、Apple Watchでタイマーが使えるといい。そこで作ってみた。

時間が来たときに、音が鳴るのもいいが、振動で知らせるのがいい。これがまた簡単だった。コードは下のものだけ。

WKInterfaceDevice.current().play(.notification)

これを書くだけで、振動する。.notificationのところを変えると振動の種類が変わる。

ここに書いてあった。

dev.classmethod.jp

 

SwiftUIでApple Watchのアプリを作って実機に転送して動かしてみる

SwiftUIでアプリを作っているのはこの前書いた。

作ったものをiPhoneとか、Apple Watchに送ってみた。Apple Storeに出すとなるとAppleに申請したり、Apple Developers Programに年会費を払って登録する必要があったりと、ちょっとハードルが高いので、まずは自分だけのアプリとして使いたいと送ってみた。

送るにあたって、以前MacbookProでiPhoneに送ったことがあったので、簡単にやれると思ったが、結構面倒だった。Xcodeを使っているのがMac miniになったのも、以前の設定で使えない一つの原因。

まずは、OSのバージョン。ケーブルで繋いだiPhoneを指定してビルドしても OSがだめで、何にも起こらない。Xcodeで何も考えずに作っていると最新バージョンで作っていることになる。iOSが17でWatch OSが10になっていて、これが違っていて転送できない。iOSは無線でやっていると17がでてこないので、今使っているiPhone13miniをMacに繋いで無理やりアップデートした。そうすると、AppleWatch6もいつの間にかにアップデートが来ていた。朝になったら勝手にアップデートしていた。

次に、まずiPhoneにアプリを転送してみたところ、信頼されない開発者?だったかがでてまただめ。iPhone13miniは以前のiPhoneからデベロッパーモードになっていてそれは引っかからなかったが、Macminiで作っているのでそれが信頼されていない。ここを設定するには、iPhoneで「設定」「一般」「VPNディバイス管理」でそこに表示される自分のAppleID?を「信頼」する。これで、iPhoneにはアプリが送られるようになる。ビルドボタンを押すと途中パスワードをもとめられたが、転送できてアプリが実行できた。

そして、Apple Watchにアプリを転送しようとした。まず、XcodeではApple Watch専用のアプリができるようになっているので、それで作った。ビルド先を選択しようとするとiPhoneはもうでてこなくて、自分のApple Watchがでてきた。まあそこまで行くのにアップデートとかあったので再起動したり結構引っかかった。ビルドボタンを押すと今度はApple Watchデベロッパーモードになっていないので転送できないとでてきた。確かに、Apple Watchには送ったことがなかったので当たり前。iPhoneと同じように設定からデベロッパーモードを有効にすると、勝手にApple Watchが再起動。ここまでやってやっとApple Watchにアプリが転送できて、実行することが出来た。簡単なストップウォッチでも、自分ようにカスタマイズしたストップウォッチなのでなかなかいい。もっとカスタマイズしてみようかという気になる。

 

SwiftUIでアプリを作る

SwiftUIを使って、コーヒードリップするためのアプリを作ろうかと思ってだいぶ経つ。で、今日引っかかっていたことはSwiftのif文です。

やろうとしたことは
IF文の条件式でBool値とIntの論理積が何でできるのか不思議だったので、Playgroundsで下のコードをやってみた。
bool1が論理値で、remainがInt、これはタイマーが動いていて、残り時間が0になったら、タイマーを止めるということをやっていた。
普通にkekkaに代入しようとするとエラーで、!=0を使ってみろとアドバイスされる。
remainが0だったらfalseになるわけでこれで両方とも論理値になって論理演算ができるということだ。

 

var bool1 = true
var remain = 0
var kekka = bool1 && (remain != 0) <ーここ

 

でも、下のIF文では、エラーが出ない
if bool1 && remain > 0 { <ーここ
    print("madamada")
} else {
    print("owari")
}


Googleで検索していると、最近Chromeブラウザに、ChatGPTの拡張機能を入れたため、なんとChatGPTが勝手に答えていた。
その内容は以下

if condition1 && condition2 {
    // 条件1と条件2がどちらも真の場合の処理
} else {
    // 上記の条件が満たされない場合の処理
}
どこまで本当か分からない。でもIF文の条件判断がそうなのかも知れない。さあどこに書いてあるか調べてみるか。
if letがある。代入できたらすぐ実行、できなかったらelse { }というのは当てはなるかも知れない。
まあ、リファレンスですね。でも、リファレンスもif文なんかなかなか出てこない。これはこれで良しとして次に行くか

 

ScanSnap S1500の排出ローラーとフィードローラーの交換

もう購入して15年以上になるScanSnap S1500を調子良く使い続けていた。ピックアップローラーは一度交換したが、紙送りも順調でうまくスキャンができていた。使っていると「チッチッチ・・・・」と変な音がするのは以前から気になっていた。特に問題もなくスキャンができていたのでそのまま使っていた。最近スキャンがしたファイルが直線が曲がっていたり、文字が歪んでしまったりだったので、中をよく見てみるとローラーがあめ色になって、ベトベト。これに紙がくっついて音が出たり、またがったりしていることがわかった。ネットを検索してみると、ローラーがベトベトになって、ひどいのになるとなると溶けてたれている物もある。交換しているサイトもあったので、参考にすれば出来るかと思いやってみた。

まずは、交換ローラーの購入から。AMAZONで見つけてみると、ScanSnap S1500のローラーが見つかる。メーカー(以前は富士通?今はRICHO)から直接購入できる(た?)のはピックアップローラーで、問題の排出ローラーとフィードローラーは中国の販売者からのようだ。もう一つ、ローラーだけも見つかったので一緒に、AMAZONで購入を決めると中国の郵便で2週間以上かかるようになっていた。でも実際は1週間で無事に届いた。届いた箱を見ると、Made in Japanって書いてあって?です。この機種は2017年かなんかにサポート外となっているようで、それまではメーカーで修理をしていたようだ。まあ、ローラーがベトベトになったら本体の寿命で、買い換えなさいということなのでしょうか。

ピックアップローラーと違って、交換は結構大変だった。結局、下の排出ローラーは完全に交換したが、上のフィードーローラーの方は、完全に交換することをやめて、シリコン?のローラーだけ2つ交換した。参考のサイトにも書いてあるが、なにしろ分解するのは大変で、分解する際、組み立ていくときにも、小さな引っ掛かりの「ツメ」を折ったり壊したりした。この下のサイトが「排出ローラー」だけの交換で一番参考になった。ネジで止まっているところは少なくて、小さなつめで止まっているところが多くそれが一番難しいところ。参考とする分解サイトがなかったらまず無理。結局分解する時と組み立てているときに5個くらいツメを折ってしまったが、問題なく(がたつきもなく)組み立てられた。そんなこともあって、上のフィードローラーは分解せずに、2つのローラーだけ交換した。交換は、ローラーに切り込みを入れてはめるだけ。結構隙間が空いた状態になった。でも問題なくスキャンする紙原稿を取り込むことができている。

下は、排出ローラだけだが、一番参考になったサイトで、これを見たから交換できた。交換する気になった。

b78573w8gm5t.blog.fc2.com

上のローラーは下のサイトに書いてあったが、ちょっと大変そうなので、やめてシリコンのローラーだけを交換した。

p--q.blogspot.com

YouTubeにはこんなのもあった。やはり簡単にはできない。

www.youtube.com

 

SwiftUIの構造体(Struct)について

よくわからなかったのだが、わかってくると色々面白いことがわかった。自分で構造体を定義すると、Xcodeで理解してくれる。コード補完までしてくれるのでなかなかいい。

Personという構造体を作ってみると、ちゃんとコード補完をしてくれる。以下がコードの例である。

import SwiftUI

struct ContentView: View {

    var body: some View {

        let person1 = Person(lastName: "鈴木", firstName: "太郎", age: 62)

        let person2 = Person(lastName: "上野", firstName: "一郎", age: 62)

//        varで書いていたら変更しないからletにしろと注意された。

        VStack {

            Image(systemName: "globe")

                .imageScale(.large)

                .foregroundColor(.accentColor)

            Text("Hello, world!")

            Text("氏名:\(person1.lastName)")

            Text("氏名:\(person2.shimei())")

        }

        .padding()

    }

}

struct Person {

    var lastName: String

    var firstName: String

    var age: Int

    func shimei() -> String {

        return lastName + " " + firstName

//    initがない

    }

//    ここで補完機能を使うとlastName等がPでプロパティ

//    shimeiがMでメソッドで出てくる。いずれも青

}

struct Personで構造体を定義すると、bodyの中でPersonと書くとコード補完でvarで定義したlastName,firstName,ageが表示される。また、person1.と点を打つとコード補完でちゃんとlastNameとか選択できるように表示される。initを書かないと出ないのかと思った。かってにinitする全項目イニシャライザというのだそうだ。すごい。

ついでに、コード中にも書いたが、最初person1をvarで書いたが、しばらくすると「どこでも使ってない」と言われ、それなら「letにしろ」と言われボタン一発でletに変更できた。大きなお世話であるが、なかなかである。楽しい。

Excelの新関数letがいい

Webを見ていたら、エクセルの新関数letというのがあった。

ネストをわかりやすくできるということだった。pasdasを使ったPythonで、いくつもネストしているコードをここのところ何度も見ているので、これはいいのかもと思ってやってみた。

letは

=let(名前1,名前の値1,名前2,名前の値2,名前3,名前の値3,・・・,計算値)となり、計算した値をそれぞれ名前に代入して、最後にその名前を使って計算をして、その結果をセルに入れる。というのがletのようだ。

たとえば

=let(goukei1,SUM(C2:G2),goukei2,SUM(H2:K2),goukei,goukei1+goukei2,goukei/9)

絶対にしそうもないネストだけれど、部分的に合計を出して、さらにそれを合計して、最後それを割り算する。3つ目のgoukeiは作る必要がなかったが、完璧なネストです。でも、式は整理されていて見やすいかもしれない。

=(SUM(C2:G2)+SUM(H2:K2))/9

これなら、こっちのほうが見やすい?同じSUMなので見やすいかもしれないけど、いろいろな関数を使って、それを引数にして、関数に代入するとなるとletは見やすくなるかもしれない。ちょうどコードを書くように1つの文の中に書くことができるようだ。