Android版まなびポケットで添付ファイルが開けない

リンクを押しても反応がなく対処のしようがない

諦めてWeb版にログインすることで解決

アカウント間連携機能もまともに動かせず廃止とか、NTTコミュニケーションズなんて大手がこんなマジクソサービス提供してて本当にすごい!

  
  • Good (0)
カテゴリー: 未分類 | コメントする

VSCodeで、アクティブなタブに赤線をつける

アクティブなタブが見づらいので、赤線がつくように変更

設定画面を出して、colorCustomizationsで検索
[Edit in setting.json] をクリック

"workbench.colorCustomizations": {
    // "tab.inactiveBackground": "#555555",
    "tab.activeBackground": "#000000",
    "tab.activeBorderTop": "#ff0000",

    "breadcrumb.background": "#000000",
},

VSCodeを一度閉じて開き直す。

  
  • Good (0)
カテゴリー: 未分類 | コメントする

GitLab 14.9.5-ce.0がインストールできない

概要

アップグレードパスに従って、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

環境

OS

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 -

参考

https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5245

  
  • Good (0)
カテゴリー: 未分類 | コメントする

サイト「Flutterで始めるアプリ開発」内、「Riverpodで状態管理」記事のサンプルソースを動かす

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();
                  },
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}
  
  • Good (0)
カテゴリー: 未分類 | コメントする

puttyをアップデートしたら、サーバーのログインに異様に時間がかかる

症状

puttyを0.78にアップデートしたら、既存のサーバーにログインに異様に時間がかかるようになった
50秒くらいフリーズしたような状態になる。

対処

Connection -> SSH -> Kex -> Key exchange algorithm options -> Attempt GSS API key exhange のチェックを外す
今まで通り一瞬で入れるようになった。

Amazon Linux 2023プレビュー版にログインできるようにputtyアップデートしたのだが、原因はちゃんと調べていない。

不便なので、0.77で再インストールしてみたが、戻らなかった。
現状困っていないならアップデートしないほうがいいかも。

  
  • Good (0)
カテゴリー: 未分類 | コメントする

Amazon Linux 2023プレビュー版がputtyで接続できない

Amazon Linux 2023のプレビュー版を試そうと思ったら、
なぜかSSHがputtyからつながらない。

「no supported authentication methods available」

解決策

https://stackoverflow.com/questions/72439693/aws-ec2-2022-disconnected-no-supported-authentication-method-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

  
  • Good (0)
カテゴリー: 未分類 | コメントする

サクラエディタでファイルを読み取り専用で開けるよう、送るメニューに追加

サクラエディタで、ファイルを間違えて編集しないよう読み取り専用で開く方法を調べたが、いい方法が見つからなかったので、コマンドオプションの-Rを使用し、送るメニューにショートカットを作ることで対応していい感じになった。

  1. 元々あるショートカットをコピーするか、sakura.exeを右クリックし、送る→デスクトップ (ショートカットを作成) で一旦デスクトップにショートカットを作成し、送るメニューのフォルダに移動する
  2. 送るメニューのショートカット作成先 C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\SendTo
  3. リンク先に、「-R」をつける “C:\Program Files (x86)\sakura\sakura.exe” -R
  
  • Good (0)
カテゴリー: 未分類 | コメントする

不動産営業電話からの名簿削除

携帯電話宛に、株式会社アローズ(書き方は不明)という業者から大阪の投資用マンションの勧誘電話。
次掛けてこないよう断りと、名簿の入手先を確認したところ、「フリービジネス」という会社とのこと。

Googleで調べたところそれらしき業者が見つかった。

株式会社フリービジネス
〒541-0057
大阪市中央区北久宝寺町1-4-15
06-6271-2080

ここだろう。電話してみると、関西弁のそれなりに歳行っていると思われるミヤモトという男性が出た。あとから見てみたら代表取締役らしい。
不動産業者からお宅の会社名を聞いた、削除と入手元を教えて欲しいと伝えたところ、数分待ってほしいので折り返すとのこと。

数分後折り返し電話があり、今持っている情報として、氏名、学歴の詳細、住所(引っ越しているが今の住所だった)、電話番号を淡々と伝えられた。怖すぎる。入手元については、

有限会社マーケティングエフォート
千葉県佐倉市王子台1-27-11 王子台ビル4階 043-460-5670
代表 タカナシ

とのことだが、もう代表が死んでいるので廃業しているのではとのこと(苦笑しながら言われたが本当なのか、この業者になすりつけている可能性も)。
削除します、販売先にも周知します(本当か?)とのことで終わった。
はたしてどうなるか。

  
  • Good (0)
カテゴリー: 未分類 | コメントする

OracleCloudのインスタンスから名前解決すると知らない業者のアドレスが帰ってくる

OracleCloud + CentOS7インスタンスで、pingとcurlの名前解決がおかしくなっていることに気づいた。
存在しないサブドメインにpingすると、全く知らないドメインパーキング業者から応答が帰ってくる。

[opc@instance-***** ~]$ ping aaaa.(自分のドメイン).net
PING xxxxx.bodis.com (199.59.243.xxx) 56(84) bytes of data.
64 bytes from 199.59.243.xxx (199.59.243.xxx): icmp_seq=1 ttl=118 time=2.94 ms
64 bytes from 199.59.243.xxx (199.59.243.xxx): icmp_seq=2 ttl=118 time=2.98 ms
64 bytes from 199.59.243.xxx (199.59.243.xxx): icmp_seq=3 ttl=118 time=3.05 ms
64 bytes from 199.59.243.xxx (199.59.243.xxx): icmp_seq=4 ttl=118 time=2.97 ms

nslookupでは問題なくcan’t findになる。

getentすると、なんかおかしい?

[opc@instance-******* ~]$ getent hosts aaaa.(自分のドメイン).net
***.***.***.*** *****.bodis.com aaaa.(自分のドメイン).net.net

末尾が.net.netになってるのが気になる

散々調べてなんとなく分かったことは、どうもインスタンス作成時にホスト名に.netを含んでしまっていて、その影響で発生しているっぽい。

OracleCloudの場合、普通にホスト名が修正できないため、下記サイトのように修正。

Oracle Cloud Infrastructureの名前解決の仕組み&ホスト名の変更方法
https://qiita.com/yamada-hakase/items/9c5647d22c923fc74330

再起動したところ正常になったので様子見。
ただ、なんでこのドメインパーキング業者になるのかは分かっておらず怖い。
誰か教えてください。

  
  • Good (0)
カテゴリー: 未分類 | コメントする

HP 法人向け クラウド リカバリ クライアントのダウンロード場所が見つからない

説明の通り、ドライバのページから探したが全く見当たらなかったので。

注意点:個人向けと法人向けはツールが違う

クラウドリカバリの対応機種一覧のページにリンクがあった。

  
  • Good (1)
カテゴリー: 未分類 | 2件のコメント