Enter

日々感じたことを記録するブログ

Macでファイルを拡張子検索して削除する

mdfindコマンドでmp4ファイルを絞った例

ざっくり全文検索して、grepで絞り込む。 この方法が便利そうだ。

grepのクオートは'でね。fish shellで"だと fish: Expected a variable name after this $.のエラーが出て変数展開になってしまうので注意。

$ mdfind -name '*.mp4' | grep '.mp4$'

参考

findコマンドでmp4ファイルを絞った例 + ファイル削除

$ find -E . -type f -iregex ".*\.(mp4)" | xargs rm -rf

参考記事

【Mac】コマンドでmp3ファイルを結合する

はじめに

Macsoxコマンドを使って複数のmp3ファイルを1つのmp3ファイルに結合する方法を説明します。

http://sox.sourceforge.net/

SoX - Sound eXchange とは

CLIでオーディオファイルを変換したり、サウンドエフェクトをかけることができるツールです。

SOXのインストール

brew install lame sox

mp3ファイルの結合

sox foo.mp3 bar.mp3 baz.mp3 output.mp3

これだけで簡単にできました。

参考

パワポでコードにSyntax Highlightをつける方法

個人的にこのSlideCodeHighlighterが一番便利でした。

ちなみにソースコードGithubで公開されています。

手順はこんな感じ。

  1. SlideCodeHighligterに色を付けたいコードを貼り付ける
  2. ハイライトされたコードをMacのテキストエディットアプリに貼り付けて、それを更にコピー
  3. パワポに「元の書式を保持する」で貼り付ける
  4. 好みのフォント・サイズに調整

VSCodeのコードを貼り付けるだけでもできるらしいですが、 Wordを経由しても自分のパワポ(ver.2011 笑)ではならず。。

今回紹介した方法ならばなんとかできました。

MacのFinderから現在のパスをターミナルで開く

Finderで開いているパスをターミナルで簡単に開く方法を紹介します。
OSはmacOS Mojaveです。

Macのシステム環境設定を開いて、

  1. 【キーボード】を選択
  2. 上タブの【ショートカット】→
  3. 左メニューの【サービス】→
  4. 右の選択項目の【ファイルとフォルダ】まで進んで

図にあるように標準のターミナルかiTermの項目にチェックをいれます。
準備はこれだけです。 f:id:enter178:20190201230322p:plain

使う場合は、ターミナルで開きたいところで右クリックして、サービスメニューから先程チェックした項目を選択するだけです。 f:id:enter178:20190201230706p:plain

よりよいエンジニアライフを👍

はじめてのFlutter -Codelab part1 実装編-

はじめに

はじめてのFlutter -開発環境構築-からの続きで、Codelab:Write Your First Flutter App, part 1の最後までやっていきます。

実装①: Hello Worldを表示

lib/main.dartを次の様に変更し、実行してください。 実機でビルドする場合、最初はロードに少し時間がかかりますが、二回目以降はファイルを保存するだけでhot reload機能が適応され、短時間でビルドが完了します。

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: const Text('Welcome to Flutter'),
        ),
        body: const Center(
          child: const Text('Hello World'),
        ),
      ),
    );
  }
}

■ ビルド後の画面

学習ポイント

void main() => runApp(new MyApp());

実装②:外部のパッケージを読み込む。

Flutter Packages ←ここにまとまっていて、検索できます。

プロジェクト直下にあるpubspec.yamlでFlutterアプリのライブラリ管理をします。 追加したいライブラリ(english_words)をdependenciesに記入します。

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^0.1.0
  english_words: ^3.1.0   # ← こんな感じで追加

追加したら、AndroidStudioのエディタ画面上部の「Packages get」を選択しましょう。 f:id:enter178:20190130161340p:plain

すると、コンソールにアップデート状況が表示されます。

flutter packages get
Running "flutter packages get" in startup_namer...
Process finished with exit code 0

あとは、lib/main.dartimportしてコードを変更してください。

※Codelabからの転用

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart'; // <- 追加したライブラリをimport

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final wordPair = new WordPair.random(); // Add this line.
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(    // Change "const" to "new".
          //child: const Text('Hello World'),   // Replace this text...
          child: new Text(wordPair.asPascalCase),  // With this text.
        ),
      ),
    );
  }
}

■ ビルド後の画面 こんな感じです。ビルドするたびに画面中央の英語の文字が変化します。 また、AndroidStuiodのツールバーにある⚡️ボタンを押して、hot reloadを手動実行できます。

実装③: statefull Widgetの追加

Stateless Widgetはimmutableである。つまり、プロパティの値が不変です。 Statefull Widgetは可変のプロパティ値を扱います。 Statefull Widgetを使うには、次の2つのクラス実装が必要です。

  1. StatefulWidget class
  2. State class
    • アプリのロジックや状態はこちらに持たせます。

StatefullWidgetとStateの作り方を説明していきます。 まず、最初にStatefulWidgetを継承したRandomWordsクラスを作成します。 あとあとでStateを作ったら、このクラスと紐づけます。とりあえず現時点では、クラスだけ作っておきます

class RandomWords extends StatefulWidget {
}

次に、Stateを作成します。 Stateful Widgetのサブクラスをジェネリクスに持たせます。

class RandomWordsState extends State<RandomWords>{
 // TODO add build method
}

ここから、具体的な実装をしていきます。 Statefull WidgetとStateを関連付けましょう。 createStateメソッドをオーバライドし、Stateを返却します。

class RandomWords extends StatefulWidget {
  RandomWordsState createState() => new RandomWordsState();
  //  before lambda function
  //  @override
  //  State<RandomWords> createState() {
  //    return new RandomWordsState();
  //  }
} 

最後に、Stateの処理を実装しましょう。 buildメソッド内で英単語をランダムで作成します。

class RandomWordsState extends State<RandomWords> {
  @override                                 
  Widget build(BuildContext context) {
    final WordPair wordPair = new WordPair.random();
    return new Text(wordPair.asPascalCase);
  }                                          
}

State,Statefull widgetの準備ができたので、bodyのcenterに設定しましょう。 ビルドするたびに、画面中央の英単語が変化するアプリができているはずです。

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: const Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new RandomWords(), // ← 作ったStateful widgetを作成
        )
      )
    );
  }
}

// Stateful Widget
class RandomWords extends StatefulWidget {
  RandomWordsState createState() => new RandomWordsState();
}

// State class:
class RandomWordsState extends State<RandomWords>{
  @override
  Widget build(BuildContext context) {
    final wordPair = new WordPair.random();
    return new Text(wordPair.asPascalCase);
  }
}

実装④: 無限リストビューを作る

Codelab.1の最後は、ランダムの英単語がひたすら表示されるリストビューを作成します。

RandomWordsStateクラスに次の2行を追加します。 _suggestionsは画面に表示する英単語のリストを保持する変数で、_biggerFontは画面表示する文字サイズ情報です。

📝Dart言語では変数・関数の前に_をつけるとprivateになります。

class RandomWordsState extends State<RandomWords> {
  // この2行を追加
  final List<WordPair> _suggestions = <WordPair>[];
  final TextStyle _biggerFont = const TextStyle(fontSize: 18.0); 
  ...
}

ListViewに表示するデータの準備

では、次は_suggestionsに持たせる英単語リストを生成するメソッドを作成しましょう。 次のコードをRandomWordsStateに実装します。 ListView.builderのコンストラクタを使って、ListViewの作成条件をつくります。

  • padding プロパティで、テキスト周辺のパディング(余白)を設定します。EdgeInsets.allを設定することで、上下左右すべてに同じ値を設定できます。
  • itemBuilderプロパティには、ListViewの各行をWidgetとして作る匿名関数を設定します。 引数のiは0から始まり、呼ばれる度にインクリメントされます。
  • i.isOddで偶数行ならば、区切り線を作成し、 奇数行の場合に、_buildRowメソッドでListViewの行Widgetを作成します。
  • 無限スクロールできるように、_suggestionsの要素数以上になったときに、新しく10個の英単語を配列に追加しています。
 Widget _buildSuggestions() {
    return new ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemBuilder: (BuildContext _context, int i) {
        if (i.isOdd) {
          return new Divider();
        }

        final int index = i ~/ 2;
        if (index >= _suggestions.length) {
          _suggestions.addAll(generateWordPairs().take(10));
        }
        return _buildRow(_suggestions[index]);
      }
    );
  }

_buildRowメソッドの実装は以下の通りです。 ListTileを使って、文字列をListViewにあったWidgetに変換します。

Widget _buildRow(WordPair pair) {
  return new ListTile(
    title: new Text(
      pair.asPascalCase,
      style: _biggerFont,
    ),
  );
}

ListViewに表示する

RandomWordsStateのbuildメソッドを更新し、_buildSuggestionsメソッドでbody要素を作ります。

@override
  Widget build(BuildContext context) {
    //final wordPair = new WordPair.random(); // Delete these... 
    //return new Text(wordPair.asPascalCase); // ... two lines.

    return new Scaffold (                   // 追加: ここから
      appBar: new AppBar(
        title: new Text('Startup Name Generator'),
      ),
      body: _buildSuggestions(),
    );                                      // 追加: ここまで
  }

最後に、Widget rootになるMyAppで、RamdomWords Stateful Widgetを設定してあげると完成です。 全体のlib/main.dartを見たい場合は、こちらを参照してください。

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator',
      home: new RandomWords(), // <- ここに設定
    );
  }
}

■ビルド後の画面

GoogleアシスタントのE2Eテストライブラリの使い方

↓のGithubに使い方(詳細な記事へのリンク)とサンプルコードをあげました。
説明が雑ですが😓、、情報を集約しているので誰かの役に立てると幸いです 🙇‍♂️

github.com