vue-cli(3.0)を使う前に

vue-cli(3.0)を使ってみようと思ったのですが、その前に、nodeのパッケージ管理をnodebrewからndenvに変更しました。

ndenvはanyenv(なんでもenv)から使うバージョン管理で、pyenv, rbenvも同じように使えるようです。が、今回はndenvのみanyenvから使えるようにしました。

以下のページの処理をそのまま実行すればOKです。

Nodeのバージョン管理をndenvにし、それに合わせてanyenvを導入したのでメモ – YATのblog

anyenvのインストール

$ git clone https://github.com/riywo/anyenv ~/.anyenv

使っているシェルの設定ファイル(.zshrc、.bash_profile)に以下を追加します。それまで使っていたnodebrewの処理をコメントアウトしました。

export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"

# nodebrew
#export PATH=$HOME/.nodebrew/current/bin:$PATH

設定ファイルを再読み込みします。

source 設定ファイル(.zshrc、.bash_profile)

ndenvインストール

$ anyenv install ndenv

インストール可能なnodeのバージョン一覧

$ ndenv install -l

nodeインストール

$ node install インストールしたいバージョン

インストールされているバージョン一覧

$ ndenv versions

デフォルトのバージョン

ndenv global デフォルトのnodenのバージョン

ここまでくれば、vue-cli 3.0が使えるようになります。 次は、それを使ったプロジェクトの作成ですね。

リンク

SiriKit Tutorial for iOS

はじめに

2018 WWDCにおいて、iOS12の新しい機能「Siri Shortcuts」が紹介されました。

Siri Shortcutsについて調べてみた【ショートカット登録編】 - Qiita

ユーザーの日常のルーチンを適切なタイミングでサジェストしてくれ、ショートカット実行させてくれる便利な機能です。 ロックスクリーン、Spotlight検索、SiriのApple Watchインターフェースから直接アプリのアクションを実行することができます。

現在もiPhone上にSiriからの提案(APP)が表示されますが、これがショートカットから実行できるようになるのでしょうか?

かつて、音声認識が盛んだった頃、電子秘書と呼ばれるアプリが登場しましたが、いずれ、Siriが電子秘書になると思います。

まずはSiri Kit

Siri Shortcutsのサンプル実装を試すまえに、まず、Siri Kitについて調べてみました。 Siri Kitを使うとどのようなことができるのかは、以下のページが詳しいです。

SiriKitを試してみた集 - Qiita

現状は、限られたドメインのみ使われるため電子秘書とは言えませんが、それでも配車予約、レストラン予約は便利だと思います。

これだと何となくわかっただけの状態なので、チュートリアルを実行してみました。 WenderLoonという配車サービスアプリです。

SiriKit Tutorial for iOS

Siri Kitを使っていない状態からステップごとに使えるようにしているためとてもわかりやすいです。書いているとおりに実装すれば動くと思います。途中コンパイルエラーが発生しますが、Xcodeのお勧めの方法でFixすればOKでした。

ただ、言語が英語のため「99(passengers in) Red Balloonsの前までしか実行していません。

  • Add an Intents extension
  • Create appropriate handler objects
  • Return the handler objects in your INExtension subclass
  • Declare the supported intents in the Info.plist of the extension
  • Request the user’s permission to use Siri
  • Add a Siri usage description to the app’s Info.plist
  • Add the Siri entitlement to the app

このアプリを動かした後に、AppleのSikirKitプログラミングガイドを読むと理解が進みました。

SiriKitプログラミングガイド:SiriKitの紹介

Microsoft Xamarin.iOSでもSiriKitは使えるようです。こちらのドキュメントも分かりやすいです。

Xamarin.iOS で SiriKit - Xamarin | Microsoft Docs

今後

SiriKitにカスタム語彙を登録できるようです。これが出来るようになると面白そうです。

SiriKitプログラミングガイド:Intentのドメイン

AtomicLong

今更ですが、Atomicな変数(AtomicLong)を使って見ました。

Java1.5からですか〜。 同期処理をJavaで実装することはあまりしていなかったのかなぁ。

concurrentパッケージにある以下のインタフェースおよびその実装クラスも使えそう。

  • BlockingDeque
  • BlockingQueue
  • ConcurrentMap<K,V>
  • ThreadFactory

リンク

Swiftで半角空白文字削除(trim)

半角空白削除の場合には、whitespaces、改行などの制御記号も取り除く場合にはNewlinesも追加する。

let myString = "  \t\t  Let's trim all the whitespace  \n \t  \n  "
let trimmedString = myString.trimmingCharacters(in: .whitespacesAndNewlines)
print(myString)

コンソールには以下の文字列が出力されます。

Let's trim all the whitespace

Does swift have a trim method on String? - Stack Overflow

@objcのwarning@Swift 4の対処

UIRefleshControlを使っているSwift3プロジェクトをSwift4にマイグレーションさせた場合、呼び出しメソッドに@objcが追加されますが、Swift3プロジェクトの設定のま まだとワーニングが表示されます。

ビルドセッティングでSwift3 @objc interfaceをOnからDefaultに変更するとワーニング消えます。

Swift 4で@objcに関するwarningが出たときの対処 - Qiita

なにやらよく分かりませんが、ここを読むとなんとなく雰囲気がわかります。 @objcキーワードはいつまで残るんでしょうか…?

​ #selector がswift4では使えない? → 使えます - MILLEN BOX

ワーニング

The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "NewsReader" target.

マイグレーションされたコード

Xcode3
    override func viewDidLoad() {
        // (中略)
        self.refreshControl = UIRefreshControl()
        self.refreshControl?.addTarget(self, action: #selector(refresh(sender: )), for: .valueChanged)
        // (中略)
    }
    func refresh(sender: UIRefreshControl) {
        print("refresh")
        startDownload()
        self.refreshControl?.endRefreshing()
    }
Xcode4
    @objc func refresh(sender: UIRefreshControl) {
        print("refresh")
        startDownload()
        self.refreshControl?.endRefreshing()
    }

GolangとVue.js...

GolangとVue.js」というタイトルに惹かれて調べてみました。

Big Sky :: Golang と Vue.js で簡単なアプリケーションを作ってみた。

まずは、動かしてみます。

MacOS High Sierra 10.13.4

MongoDBインストール&起動

インストール済みであれば不要です。

$ brew install mongodb
$ sudo mkdir /var/lib/mongodb
$ sudo touch /var/log/mongodb.log
$ sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
$ export MONGODB_URI=mongodb://localhost

HomebrewでMacにMongoDBをインストールした時のメモ - Qiita

go-vue-example実行

githubからソースをダウンロードして実行しました。 depについてはこの記事を参照してください。

build & run

$ git clone https://github.com/mattn/go-vue-example
$ dep unsure
$ go build
$ ./go-vue-example

Webアプリをブラウザで開く

http://localhost:4000/

DBの状態を調べる

$ mongo
> show dbs;
admin                       0.000GB
config                      0.000GB
go-vue-example-development  0.000GB
local                       0.000GB
> use go-vue-example-development;
switched to db go-vue-example-development
> show collections;
tasks
> db.tasks.find();
{ "_id" : ObjectId("5abef638056d1b319501bdc6"), "body" : "Have a breaskfast", "done" : true, "created_at" : NumberLong(1522464312), "updated_at" : NumberLong(1522547660) }
{ "_id" : ObjectId("5ac03e6e056d1b319501bdc7"), "body" : "do second task", "done" : false, "created_at" : NumberLong(1522548334), "updated_at" : NumberLong(0) }
>

所感

CRUD的な操作を持つWebアプリをさっと作って動かすという観点だと、echo-scaffold(golang)とvueの組み合わせは便利そう。

必要な処理は、UIイベント処理(タスク入力および)、ajax呼び出し、取得したデータのDOMマッピングです。それぞれ、どのように記述するかは、以下のマニュアルを見てください。

はじめに — Vue.js

サーバーサイド(golang)

githubのコードと以下のコマンドで生成したコードには差分はありませんでした。

$ echo-scaffold init go-vue-example
$ cd go-vue-example
$ echo-scaffold scaffold task body:string done:bool

フロントエンド

element UIとaxiosのvuejsライブラリを使っており、実際に作成しているWebアプリ(vuejsのファイル)は以下の2ファイルです。

  • index.html
  • app.js

依存関係管理ツールdep(golang)

久しぶりにgo言語関連アプリ、Big Sky :: Golang と Vue.js で簡単なアプリケーションを作ってみた。を使ってみようと思ったらパッケージがないって怒られました。

個別にインストールするのは面倒です…

$ go get -u xxx

nodeやrubyのパッケージ管理ツールがないのかと思っていたら、depというパッケージ管理ツールがありました。

これで簡単に試してみることができます。

$ get clone https://github.com/mattn/go-vue-example
$ cd go-vue-example
$ dep init
  Using ^3.3.4 as constraint for direct dep github.com/labstack/echo
  Locking in 3.3.4 (a5d81b8) for direct dep github.com/labstack/echo
  Locking in master (e746df9) for transitive dep github.com/valyala/bytebufferpool
  Locking in v3.2.0 (06ea103) for transitive dep github.com/dgrijalva/jwt-go
  Locking in 0.2.4 (6fe1405) for transitive dep github.com/labstack/gommon
  Locking in v0.0.9 (167de6b) for transitive dep github.com/mattn/go-colorable
  Using v1 as constraint for direct dep gopkg.in/check.v1
  Locking in v1 (20d25e2) for direct dep gopkg.in/check.v1
  Locking in master (12892e8) for transitive dep golang.org/x/crypto
  Using master as constraint for direct dep github.com/globalsign/mgo
  Locking in master (baa28fc) for direct dep github.com/globalsign/mgo
  Locking in v0.0.3 (0360b2a) for transitive dep github.com/mattn/go-isatty
  Using ^1.0.5 as constraint for direct dep github.com/sirupsen/logrus
  Locking in v1.0.5 (c155da1) for direct dep github.com/sirupsen/logrus
  Locking in master (378d26f) for transitive dep golang.org/x/sys
  Locking in master (dcecefd) for transitive dep github.com/valyala/fasttemplate

$ cat Gopkg.toml
#   name = "github.com/x/y"
#   version = "2.4.0"
#
# [prune]
#   non-go = false
#   go-tests = true
#   unused-packages = true


[[constraint]]
  branch = "master"
  name = "github.com/globalsign/mgo"

[[constraint]]
  name = "github.com/labstack/echo"
  version = "3.3.4"

$ cat Gopkg.lock
  # This file is autogenerated, do not edit; changes may be undone by the next     'dep ensure'.

   [[projects]]
    name = "github.com/dgrijalva/jwt-go"
    packages = ["."]
    revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
    version = "v3.2.0"

$ dep ensure
$ go build