●「名前」のアカウント という表示を変えたい場合
設定→デバイス情報→緊急時情報
●「名前」のアカウント という表示を変えたい場合
設定→デバイス情報→緊急時情報
元プログラマなのに、子供の勉強用にマイクラでPythonを実行できるようにするのに数時間かかってしまったためメモしておきます。
最終的に、Windows環境ではThonny(Python3.8版)使用、Mac OSX環境ではThonnyの旧バージョンが探せなかったためOSにインストールしたPython3.9を使用して接続を確認しました。
ポイントと大まかな流れ
基本的にこちらのサイトの手順通りにやらせてもらいました
子供にマインクラフト使ったPythonプログラミングを教えようとしたらChatGPT使ったプログラミング不要な世界を体験させちゃった | DevelopersIO
ただし、下記が異なる
Installer with 32-bit Python 3.8, suitable for all Windows versions since 7 thonny-py38-4.1.4.exe (20 MB)
【マイクラ】コマンドからプログラム(Python)を実行する方法 – ログログ
OSXでmcpyインストールした時はこんな感じ
規定でPython2系列がインストールされているため、3系列をインストールした時のコマンドは、python3 pip3 になる。
$ which python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
$ pip3 -V
pip 21.2.4 from /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pip (python 3.9)
$ pip3 install mcpy
Collecting mcpy
Downloading mcpy-2.0.0.tar.gz (6.6 kB)
Using legacy '[setup.py](http://setup.py/) install' for mcpy, since package 'wheel' is not installed.
Installing collected packages: mcpy
Running [setup.py](http://setup.py/) install for mcpy ... done
Successfully installed mcpy-2.0.0
WARNING: You are using pip version 21.2.4; however, version 24.2 is available.
You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 -m pip install --upgrade pip' command.
リンクを押しても反応がなく対処のしようがない
諦めてWeb版にログインすることで解決
アカウント間連携機能もまともに動かせず廃止とか、NTTコミュニケーションズなんて大手がこんなマジクソサービス提供してて本当にすごい!
アクティブなタブが見づらいので、赤線がつくように変更
設定画面を出して、colorCustomizationsで検索
[Edit in setting.json] をクリック
"workbench.colorCustomizations": {
// "tab.inactiveBackground": "#555555",
"tab.activeBackground": "#000000",
"tab.activeBorderTop": "#ff0000",
"breadcrumb.background": "#000000",
},
VSCodeを一度閉じて開き直す。
アップグレードパスに従って、GitLabのバージョンを上げていたが、14.9.5でエラーになってしまい詰まった。
sudo apt install --upgrade gitlab-ce=14.9.5-ce.0
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Version '14.9.5-ce.0' for 'gitlab-ce' was not found
18.04.6 LTS (Bionic Beaver)
$ cat /etc/apt/sources.list.d/gitlab_gitlab-ce.list
# this file was generated by packages.gitlab.com for
# the repository at https://packages.gitlab.com/gitlab/gitlab-ce
deb https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ bionic main
deb-src https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ bionic main
apt updateしてみたところ、
$ sudo apt update
...(中略)...
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu bionic InRelease: The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <packages@gitlab.com>
W: Failed to fetch https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/dists/bionic/InRelease The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <packages@gitlab.com>
W: Some index files failed to download. They have been ignored, or old ones used instead.
鍵のエラーが出ている?
curl -s https://packages.gitlab.com/gpg.key | sudo apt-key add -
Flutterで始めるアプリ開発
https://www.flutter-study.dev/
大変参考になるサイトで、勉強に使わせてもらっているが、
Riverpodで状態管理
https://www.flutter-study.dev/firebase-app/riverpod
上記ページのサンプルが、
flutter_riverpodの更新等で、色々エラーが出て動かなかった。
初心者が2023.03時点でとりあえず動くように修正してみたので、誰かの参考になるかもと思い共有してみる。
flutter –version
Flutter 3.7.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision b4bce91dd0 (3 weeks ago) • 2023-02-21 09:50:50 +0800
Engine • revision 248290d6d5
Tools • Dart 2.19.2 • DevTools 2.20.1
pubspec.yamlは下記の状態
firebase_core: ^2.8.0
firebase_auth: ^4.3.0
cloud_firestore: ^4.4.5
flutter_riverpod: ^2.3.2
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// ユーザー情報の受け渡しを行うためのProvider
final userProvider = StateProvider((ref) {
return FirebaseAuth.instance.currentUser;
});
// エラー情報の受け渡しを行うためのProvider
// ※ autoDisposeを付けることで自動的に値をリセットできます
final infoTextProvider = StateProvider.autoDispose((ref) {
return '';
});
// メールアドレスの受け渡しを行うためのProvider
// ※ autoDisposeを付けることで自動的に値をリセットできます
final emailProvider = StateProvider.autoDispose((ref) {
return '';
});
// パスワードの受け渡しを行うためのProvider
// ※ autoDisposeを付けることで自動的に値をリセットできます
final passwordProvider = StateProvider.autoDispose((ref) {
return '';
});
// メッセージの受け渡しを行うためのProvider
// ※ autoDisposeを付けることで自動的に値をリセットできます
final messageTextProvider = StateProvider.autoDispose((ref) {
return '';
});
// StreamProviderを使うことでStreamも扱うことができる
// ※ autoDisposeを付けることで自動的に値をリセットできます
final postsQueryProvider = StreamProvider.autoDispose((ref) {
return FirebaseFirestore.instance
.collection('posts')
.orderBy('date')
.snapshots();
});
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
// Replace with actual values
options: const FirebaseOptions(
apiKey: "****",
appId: "****",
messagingSenderId: "****",
projectId: "****",
),
);
runApp(
const ProviderScope(
child: ChatApp(),
),
);
}
class ChatApp extends StatelessWidget {
const ChatApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
// アプリ名
title: 'ChatApp',
theme: ThemeData(
// テーマカラー
primarySwatch: Colors.blue,
),
// ログイン画面を表示
home: const LoginPage(),
);
}
}
// ログイン画面用Widget
class LoginPage extends ConsumerWidget {
const LoginPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final infoText = ref.watch(infoTextProvider);
final email = ref.watch(emailProvider);
final password = ref.watch(passwordProvider);
return Scaffold(
body: Center(
child: Container(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// メールアドレス入力
TextFormField(
decoration: const InputDecoration(labelText: 'メールアドレス'),
onChanged: (String value) {
ref.read(emailProvider.notifier).state = value;
},
),
// パスワード入力
TextFormField(
decoration: const InputDecoration(labelText: 'パスワード'),
obscureText: true,
onChanged: (String value) {
ref.read(passwordProvider.notifier).state = value;
},
),
Container(
padding: const EdgeInsets.all(8),
// メッセージ表示
child: Text(infoText),
),
SizedBox(
width: double.infinity,
// ユーザー登録ボタン
child: ElevatedButton(
child: const Text('ユーザー登録'),
onPressed: () async {
try {
// メール/パスワードでユーザー登録
final FirebaseAuth auth = FirebaseAuth.instance;
final result = await auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
// ユーザー情報を更新
ref.read(userProvider.notifier).state = result.user;
// ユーザー登録に成功した場合
// チャット画面に遷移+ログイン画面を破棄
await Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) {
return ChatPage();
}),
);
} catch (e) {
// ユーザー登録に失敗した場合
ref.read(infoTextProvider.notifier).state = "登録に失敗しました:${e.toString()}";
}
},
),
),
const SizedBox(height: 8),
SizedBox(
width: double.infinity,
// ログイン登録ボタン
child: OutlinedButton(
child: const Text('ログイン'),
onPressed: () async {
try {
// メール/パスワードでログイン
final FirebaseAuth auth = FirebaseAuth.instance;
await auth.signInWithEmailAndPassword(
email: email,
password: password,
);
// ログインに成功した場合
// チャット画面に遷移+ログイン画面を破棄
await Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) {
return ChatPage();
}),
);
} catch (e) {
// ログインに失敗した場合
ref.read(infoTextProvider.notifier).state = "ログインに失敗しました:${e.toString()}";
}
},
),
),
],
),
),
),
);
}
}
// チャット画面用Widget
class ChatPage extends ConsumerWidget {
const ChatPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
// ユーザー情報を受け取る
final user = ref.watch(userProvider);
final AsyncValue<QuerySnapshot> asyncPostsQuery = ref.watch(postsQueryProvider);
return Scaffold(
appBar: AppBar(
title: const Text('チャット'),
actions: <Widget>[
IconButton(
icon: const Icon(Icons.close),
onPressed: () async {
// ログアウト処理
// 内部で保持しているログイン情報等が初期化される
// (現時点ではログアウト時はこの処理を呼び出せばOKと、思うぐらいで大丈夫です)
await FirebaseAuth.instance.signOut();
// ログイン画面に遷移+チャット画面を破棄
await Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) {
return LoginPage();
}),
);
},
),
],
),
body: Column(
children: [
Container(
padding: const EdgeInsets.all(8),
child: Text('ログイン情報:${user!.email}'),
),
Expanded(
// StreamBuilder
// 非同期処理の結果を元にWidgetを作れる
child: StreamBuilder<QuerySnapshot>(
// 投稿メッセージ一覧を取得(非同期処理)
// 投稿日時でソート
stream: FirebaseFirestore.instance
.collection('posts')
.orderBy('date')
.snapshots(),
builder: (context, snapshot) {
// データが取得できた場合
if (snapshot.hasData) {
final List<DocumentSnapshot> documents = snapshot.data!.docs;
// 取得した投稿メッセージ一覧を元にリスト表示
return ListView(
children: documents.map((document) {
return Card(
child: ListTile(
title: Text(document['text']),
subtitle: Text(document['email']),
// 自分の投稿メッセージの場合は削除ボタンを表示
trailing: document['email'] == user.email
? IconButton(
icon: const Icon(Icons.delete),
onPressed: () async {
// 投稿メッセージのドキュメントを削除
await FirebaseFirestore.instance
.collection('posts')
.doc(document.id)
.delete();
},
)
: null,
),
);
}).toList(),
);
}
// データが読込中の場合
return const Center(
child: Text('読込中...'),
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () async {
// 投稿画面に遷移
await Navigator.of(context).push(
MaterialPageRoute(builder: (context) {
return AddPostPage();
}),
);
},
),
);
}
}
// 投稿画面用Widget
class AddPostPage extends ConsumerWidget {
const AddPostPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
// ユーザー情報を受け取る
final user = ref.watch(userProvider);
final messageText = ref.watch(messageTextProvider);
return Scaffold(
appBar: AppBar(
title: const Text('チャット投稿'),
),
body: Center(
child: Container(
padding: const EdgeInsets.all(32),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 投稿メッセージ入力
TextFormField(
decoration: const InputDecoration(labelText: '投稿メッセージ'),
// 複数行のテキスト入力
keyboardType: TextInputType.multiline,
// 最大3行
maxLines: 3,
onChanged: (String value) {
ref.read(messageTextProvider.notifier).state = value;
},
),
const SizedBox(height: 8),
SizedBox(
width: double.infinity,
child: ElevatedButton(
child: const Text('投稿'),
onPressed: () async {
final date =
DateTime.now().toLocal().toIso8601String(); // 現在の日時
final email = user!.email; // AddPostPage のデータを参照
// 投稿メッセージ用ドキュメント作成
await FirebaseFirestore.instance
.collection('posts') // コレクションID指定
.doc() // ドキュメントID自動生成
.set({
'text': messageText,
'email': email,
'date': date
});
// 1つ前の画面に戻る
Navigator.of(context).pop();
},
),
)
],
),
),
),
);
}
}
puttyを0.78にアップデートしたら、既存のサーバーにログインに異様に時間がかかるようになった
50秒くらいフリーズしたような状態になる。
Connection -> SSH -> Kex -> Key exchange algorithm options -> Attempt GSS API key exhange のチェックを外す
今まで通り一瞬で入れるようになった。
Amazon Linux 2023プレビュー版にログインできるようにputtyアップデートしたのだが、原因はちゃんと調べていない。
不便なので、0.77で再インストールしてみたが、戻らなかった。
現状困っていないならアップデートしないほうがいいかも。
Amazon Linux 2023のプレビュー版を試そうと思ったら、
なぜかSSHがputtyからつながらない。
「no supported authentication methods available」
puttyが古かった(忘れたけど0.68か0.69あたり)ので、ダウンロード時点の最新の0.78にアップデートしたら解決した。
Using username "ec2-user".
Authenticating with public key "pepper-aws-oregon"
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\ Preview
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
ID_LIKE="fedora"
VERSION_ID="2023"
PLATFORM_ID="platform:al2023"
PRETTY_NAME="Amazon Linux 2023"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023"
HOME_URL="https://aws.amazon.com/linux/"
BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023"
SUPPORT_END="2028-03-01"
puttyから既存の他のサーバーへのアクセスが遅くなってしまった!!
後で書きます。
w3mがインストールできるようになってるんだけど、古のインターネッツって感じで楽しいですね。
参考
https://blog.serverworks.co.jp/2021/12/29/132812
サクラエディタで、ファイルを間違えて編集しないよう読み取り専用で開く方法を調べたが、いい方法が見つからなかったので、コマンドオプションの-Rを使用し、送るメニューにショートカットを作ることで対応していい感じになった。
携帯電話宛に、株式会社アローズ(書き方は不明)という業者から大阪の投資用マンションの勧誘電話。
次掛けてこないよう断りと、名簿の入手先を確認したところ、「フリービジネス」という会社とのこと。
Googleで調べたところそれらしき業者が見つかった。
株式会社フリービジネス
〒541-0057
大阪市中央区北久宝寺町1-4-15
06-6271-2080
ここだろう。電話してみると、関西弁のそれなりに歳行っていると思われるミヤモトという男性が出た。あとから見てみたら代表取締役らしい。
不動産業者からお宅の会社名を聞いた、削除と入手元を教えて欲しいと伝えたところ、数分待ってほしいので折り返すとのこと。
数分後折り返し電話があり、今持っている情報として、氏名、学歴の詳細、住所(引っ越しているが今の住所だった)、電話番号を淡々と伝えられた。怖すぎる。入手元については、
有限会社マーケティングエフォート
千葉県佐倉市王子台1-27-11 王子台ビル4階 043-460-5670
代表 タカナシ
とのことだが、もう代表が死んでいるので廃業しているのではとのこと(苦笑しながら言われたが本当なのか、この業者になすりつけている可能性も)。
削除します、販売先にも周知します(本当か?)とのことで終わった。
はたしてどうなるか。