FALCO

flutter で、Google fonts を使用するには?

font を選択

https://fonts.google.com/?subset=japanese

#pubspec.yml
dependencies:
  flutter:
    sdk: flutter

  google_fonts: ^3.0.1
// dart 

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Text with Background Image',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        // Google Font の名前を指定する
        textTheme: GoogleFonts.zenKakuGothicAntiqueTextTheme (
        Theme.of(context).textTheme,
        ),
      ),
      home: AutoPlayScreen(1),
    );
  }
}

 

flutter で、os 毎に処理を分岐するには?

import 'dart:io';

// ...

if (Platform.isAndroid) {
  // Android用の処理
} else if (Platform.isIOS) {
  // iOS用の処理
} else {
  // その他のプラットフォーム用の処理
}

wakelock ライブリをつかったらiOS だとエラーが発生して動作しなかった。

とりあえず必須でないので外す

2023-06-24 18:51:29.561174+0900 Runner[486:41614] Metal API Validation Enabled
2023-06-24 18:51:29.703009+0900 Runner[486:41614] [VERBOSE-2:FlutterDarwinContextMetalImpeller.mm(35)] Using the Impeller rendering backend.
2023-06-24 18:51:30.255519+0900 Runner[486:41912] flutter: The Dart VM service is listening on http://127.0.0.1:58922/2zlyqqf60mY=/
2023-06-24 18:51:30.882812+0900 Runner[486:41614] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSConcreteData getBytes:range:]: range {14, 1} exceeds data length 14'
*** First throw call stack:
(0x1922a725c 0x1a603c480 0x1934e2e70 0x100c76d84 0x100c75744 0x100c76cc0 0x100c75744 0x100c76564 0x100c728d0 0x1006ccb80 0x102dc7ae8 0x102dc932c 0x102dd776c 0x192226298 0x1922206f8 0x19221f7d0 0x1a8961570 0x194b4c2d0 0x194b5184c 0x100209a80 0x191efe140)
libc++abi: terminating with uncaught exception of type NSException
(lldb)

 

https://developer.yahoo.co.jp/webapi/jlp/furigana/v2/furigana.html

https://developer.yahoo.co.jp/webapi/jlp/sample/sample10.html

 

yahoo さんの API で 漢字にルビを振ってくれるAPIがありこれを使ってみます。

Andorid Text to Speech が日本語だとかなりへんてこりんな読み方をするので、漢字にルビを振って利用します。

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<List<String>> getFurigana(String text, String appId) async {
  final apiUrl = Uri.parse('https://jlp.yahooapis.jp/FuriganaService/V2/furigana');

  final requestBody = jsonEncode({
    'id': '1',
    'jsonrpc': '2.0',
    'method': 'jlp.furiganaservice.furigana',
    'params': {
      'q': text,
      'grade' : 1
    },
  });

  final response = await http.post(apiUrl, headers: {'Content-Type': 'application/json', 'User-Agent': 'Yahoo AppID: $appId'},body: requestBody);
  // print(response.body);
  final jsonData = jsonDecode(response.body);
  final wordList = jsonData['result']['word'] as List<dynamic>;
  // print(wordList);

  List<String> textList = [];
  String _text = '';
  for (var word in wordList) {
    var singleWord = word.containsKey('furigana') ? word['furigana'] : word['surface'];
    _text +=  singleWord;
    print (_text);
    // 改行文字を比較
    if (singleWord == '\n') {
      textList.add(_text);
      _text = '';
    }
  }
  return textList;
}

void main() async {
  const appId = ''; // 自分のアプリケーションIDに置き換えてください
  const text = '''
私はケンです。
私は学生です。
私は旅行者です。
''';

  final furiganaText = await getFurigana(text, appId);
  print(furiganaText);
}
// 結果
[わたしはケンです。
, わたしはがくせいです。
, わたしはりょこうしゃです。
]

response の json がいまいち直感的でない感じでした。

ChatGPT さんに相談しながら作りました。

2週間程つかってみましたが、かなりよい

Unity より画面はつくりやすく、なれると Native よりも簡単に作れる。

Android Native のエンジニアとして、iOS も Android も同時で開発出来るのは脅威!

 

以下は、wakelock ライブラリ使用時のエラー

 

flutter build エラー

FAILURE: Build failed with an exception.

* What went wrong:
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher.
The following dependencies do not satisfy the required version:
project ‘:wakelock’ -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50

 

Flutter plugins/wakelock-0.4.0/build.gradle

buildscript {
    // ext.kotlin_version = '1.3.50'
    ext.kotlin_version = '1.7.10'

ext.kotlin_version = ‘1.7.10’ へ変更

ImageMagick なる外部ライブラリーがありこれを使おうかと色々調べたがあまりAndroid C#で利用している情報が見つからず結果断念。

https://github.com/MolotovCherry/Android-ImageMagick7

 

代わりに ImageSharp を利用することに

Visual Stuido の NuGet より、SixLabors.ImageSharp を選択して、Version 1.0.4 を指定してダウンロード

(最新だと、netstandard2.0  をサポートしていない?)

Package より netstandard2.0 フォルダーより以下のファイルをAssets/Plugins に保存

SixLabors.ImageSharp.dll
System.Numerics.Vectors.dll
System.Buffers.dll
System.Runtime.CompilerServices.Unsafe.dll
System.Memory.dll
System.Text.Encoding.CodePages.dll

あとは、Android でビルド

以下が画像を変換するコード(楽ちん)

  // 色々な画像をPNGに変換 
    public static byte[] ConvertToPNG(byte[] imageData)
    {
        using (var image = SixLabors.ImageSharp.Image.Load(imageData)) {
            using (var outputStream = new MemoryStream()) {
                image.Save(outputStream, new PngEncoder());
                return outputStream.ToArray();
            }
        }
    }

iOS でももちろん動作します。

mac 外付けHDDのファイルが 「macOSが使用しているため開けません。」となった時

ls -l  で調べると

-rwxr-xr-x@

謎の@マーク付き

"@" は拡張ファイル属性らしい、これを削除すれば問題ないよう
xattr コマンドで拡張属性を確認
xattr -d コマンドで属性を削除

xattr -c file で全部削除
xattr file
com.apple.FinderInfo
com.apple.lastuseddate#PS
com.apple.quarantine

xattr -d com.apple.FinderInfo com.apple.lastuseddate#PS com.apple.quarantine *

xattr -c *

 

Selenium IDE で配列を使うには?

基本的に、for each を使用すると配列にアクセス出来ますが、個別に index を指定してアクセスする時は、java script を使用します。

execute script|return ${colors}[${index}]|item

 

Java script から、store された変数にアクセスするには、${colors} を指定します。

さらに配列のインデックスを指定するには、 ${colors}[${index}] となります。

Running 'for each'
20:45:14
1.executeScript on return["red", "blue", "yellow"] with value colors OK
20:45:15
2.store on 0 with value index OK
20:45:15
3.forEach on colors with value color OK
20:45:15
4.executeScript on return ${colors}[${index}] with value item OK
20:45:15
echo: red
20:45:15
echo: red
20:45:15
7.executeScript on return +${index}+1 with value index OK
20:45:15
echo: blue
20:45:15
echo: blue
20:45:15
echo: yellow
20:45:16
echo: yellow
20:45:16
8.end OK
20:45:16
'for each' completed successfully

 

 

 

 

Selenium IDE でチェックボックス(CheckBox)の状態を確認するには?

verify checked id=xyz を使用します。or verify not checked

Selenium IDE 特定のページに文字列が存在しない事をチェックするには?

 

存在しないはずの文字列を指定します。今回は ”xpath”

//*[contains(*,’xpath’)]

Selenium IDE にて

store xpath count     //*[contains(*,’xpath’)]     count

xpath の結果件数を取得します。

verify count     count    0

件数が0件であれば存在しないと判断できます。

Selenium IDE 複数のXPATHで OR の結果を取得するには?

 

https://www.google.com/search?q=xpath&oq=xp&aqs=chrome.0.69i59l2j69i57j69i60l3.2631j0j4&sourceid=chrome&ie=UTF-8

上記の結果から

 

/html/body[@id=’gsr’]/div[@id=’main’]/div[@id=’cnt’]/div[@id=’rcnt’]/div[@id=’center_col’]/div[@id=’res’]/div[@id=’search’]/div/div[@id=’rso’]/div[@class=’MjjYud’][1]/div[@class=’g Ww4FFb vt6azd tF2Cxc’]/div[@class=’kvH3mc BToiNc UK95Uc’]/div[@class=’Z26q7c UK95Uc jGGQ5e’]/div[@class=’yuRUbf’]/a/h3[@class=’LC20lb MBeuO DKV0Md’]

/html/body[@id=’gsr’]/div[@id=’main’]/div[@id=’cnt’]/div[@id=’rcnt’]/div[@id=’center_col’]/div[@id=’res’]/div[@id=’search’]/div/div[@id=’rso’]/div[@class=’MjjYud’][2]/div[@class=’g Ww4FFb vt6azd tF2Cxc’]/div[@class=’kvH3mc BToiNc UK95Uc’]/div[@class=’Z26q7c UK95Uc jGGQ5e’]/div[@class=’yuRUbf’]/a/h3[@class=’LC20lb MBeuO DKV0Md’]

上記の2つの要素を取得します。

上記の文を | で結合する事で、OR を取得する事ができます。

Selenium IDE で指定する時は、

click xpath=//AAA | //BBB の形で指定する事で、例えばPC版のボタンとスマフォ版のボタンが違っていても指定する事ができます。

chrome で xpath を求めるには、 拡張機能の xpath helper を使うと SHIFT を押しながらマウスを指定すると特定する事が出来ます。

© 2024 Falco Tech Blog Suffusion theme by Sayontan Sinha