ヨーロッパ旅行で気をつけること

冬季休暇を利用してヨーロッパ(イタリア、ドイツ、スイス)の3カ国を旅行しました。旅行中に事前に知っておけば役立つと感じたことがいくつかあったので、紹介します。

ヨーロッパのトイレは有料

ヨーロッパの多くのトイレは有料で、利用するためには1ユーロ(2024年1月現在、約160.75円)が必要です。多くのお店でクレジットカードが使えるので、現金を持たずに済むかと思いきや、トイレ利用の際には小銭が必要なので少額でも持っておくことをおすすめします。なお、有料の観光施設内には無料のトイレがあることも多く、そこで済ませると余計な出費を抑えられます。


旅行中にあったドイツのトイレ
1ユーロ硬貨を入れるとゲートが開き、トイレに入れる仕組みです。

駅に自動改札がない

日本のような自動改札がなく、有人改札もありません。代わりに不定期に車内で検札が行われます。また、乗車券は購入後、駅の構内に設置された打刻機で乗車前の日時を刻印し、初めて有効化されます。打刻されていないチケットは不正乗車とみなされ、高額の罰金が科せられることも。。。オンラインで購入したチケットは打刻不要ですが、駅の券売機で購入した場合は必要なので忘れず打刻を行いましょう。

交通機関がストライキで運行中止になることがある

電車や地下鉄などがストライキでストップすることがあります。私がイタリアからドイツへ夜行列車で移動する予定だった当日の夕方に、運行中止の連絡がメールで届きました。
https://news.yahoo.co.jp/articles/c0bc857f91366e4299db7bcbf4a95505d983577d
↑運悪くこのニュースでも取り上げられていたドイツでのストライキに巻き込まれた形です。
急遽夜行バスを予約して目的地に到達することができましたが、旅行前や、当日乗る予定の便に変更がないかチェックすることをおすすめします。

まとめ

ヨーロッパには魅力的な場所がたくさんありますが、現地のルールや上記のような点を知らないと困ることもありますので、事前準備が必要ですね。皆さんも良い旅を!

SwiftUI Mapkitを触る

2023年6月 WWDC2023にてMapKitが大幅に拡張されました。SwiftUIを使うことで簡単に地図アプリを作成できるとのことなので触ってみました。

Mapの表示

MapKitをinportしてMap()で表示できます。

import SwiftUI
import MapKit

struct ContentView: View {
  var body: some View {
    Map()
  }
}


mapStyle()を付与することで地図の見た目を変化させられます

Map().mapStyle(.imagery(elevation: .realistic))

他のもたくさんスタイルがあります

マップにマーカー、アノテーションを表示させる

・マーカー

Markerで表示ができます

extension CLLocationCoordinate2D{
   static let oosaka = CLLocationCoordinate2D(latitude: 34.703124622680484,longitude:135.4960062127632 )
}

struct ContentView: View {
  var body: some View {
   Map{
    Marker("大阪駅",systemImage: "train.side.rear.car",coordinate: .oosaka)
   }.mapStyle(.imagery(elevation: .realistic))
  }
}

座標はGoogleMapで調べました

・アノテーション

Viewなどを設定できます

Annotation("大阪",coordinate: .oosaka,anchor: .bottom){
  VStack{
     Image(systemName: "train.side.rear.car")
     Text("大阪駅")
  }
  .padding(10)
  .foregroundStyle(.white)
  .background(Color.blue)
  .cornerRadius(10)
}

他にもMapCircleなどがあります

 MapCircle(center: .oosaka, radius: 100)
.foregroundStyle(.indigo.opacity(0.5))

検索について

MKLocalSearch.Request()で検索ができます

struct ContentView: View {
@State private var searchResults:[MKMapItem] = []
  var body: some View {
   Map{
    Marker("大阪駅",systemImage: "train.side.rear.car",coordinate: .oosaka)
    MapCircle(center: .oosaka, radius: 100)
    .foregroundStyle(.indigo.opacity(0.5))

    ForEach(searchResults, id: \.self) {result in
      Marker(item: result)
    }
   }
   .mapStyle(.imagery(elevation: .realistic))
   .safeAreaInset(edge: .bottom)
    {
     HStack {
      Spacer()
      ButtonView(searchResults: $searchResults)
      Spacer()
     }
    .background(.thinMaterial)
    }
  }
}

struct ButtonView: View{
 @Binding var searchResults:[MKMapItem]
 var body: some View {
  Button {
   search(for:"playground")
  } label: {
   Label("Playgrounds",systemImage: "figure.stand")
  }
 }
 func search(for query: String){
  let request = MKLocalSearch.Request()
  request.naturalLanguageQuery = query
  request.resultTypes = .pointOfInterest
  request.region = MKCoordinateRegion(
  center: .oosaka, span: MKCoordinateSpan(latitudeDelta: 0 , longitudeDelta: 0 ))
   Task {
    let search = MKLocalSearch(request: request)
    let response = try? await search.start()
    searchResults = response?.mapItems ?? []
   }
 }
}

簡単に実装ができるので面白いですね
緯度経度あれば簡単に地図アプリが開発できそうでした
APIとか駆使して作ってみたいですね

Adobe Auditionを使って音源を伸ばす方法

動画を作成するときにBGMが必要なときがありますよね?フリーの素材で見つけた使いたいそのBGMが短ときはないでしょうか?そんなときはAdobe Auditionを使うと便利です。Adobe Auditionの使い方を紹介します。

動画を作成するときにBGMが必要なときがありますよね?
フリーの素材で見つけた使いたいそのBGMが短ときはないでしょうか?

そんなときはAdobe Auditionを使うと便利です。

Adobe Auditionを使うと簡単に音楽を伸ばすことができます。

音楽をループさせる方法

①音楽ファイルを開き、ファイルパネルで音源を選択して右クリックします。
「マルチトラックに挿入 > 新規マルチトラックセッション」をクリックします。

②「セッション名」や「フォルダーの場所」などを任意のものに設定しOKをクリックします。

③音源がマルチトラックになったので、その音源が選択された状態でエッセンシャルサウンドパネルから「ミュージック」を選択します。

④「デュレーション」にチェックを入れます。
保管方法を「リミックス」を選択し、「ターゲット」に必要な音源の長さを入力します。

⑤そうすると音源が自動で長くなり保管されます。白い波線部分が自動で調整された部分になります。

⑥後はお好きな方法で書き出すだけです。

いかがでしょうか?
やってみるまではややこしそうと思っていたのですが、試してみると意外と簡単にできました。
動画が必要な機会があったときにこの記事を思い出してAdobe Auditionを使ってみてください。

[AWS] Laravel で ElastiCache を使うときに負荷分散が効く設定

ElastiCache for Redis に対する通信量が問題になり、複数ノード構成にして通信を分散させようという検討をしたことがあります。

ノードを増やすのなら、ということでクラスターモードを有効にしての検証をしたところ、以外にもプライマリノードにリクエストが集中してしまうことが分かりました。AWSの資料によると、接続してすぐに readonly コマンドを実行しないと読み書き両方の可能性があるためプライマリノードにリダイレクトされてしまうとのこと。

自前で ElastiCache とのやり取りを全部実装しているのであれば readonly を最初に発行することで対応できますが、フレームワークを使っている場合そうもいきません。そのときは Laravel で Predis を使っていたのですが、設定ではなんともならず、対応させるには結構な改造が必要になるので断念しました。

そのときの環境では結局、クラスターモード無効にして書き込み有りのときの接続先設定(プライマリエンドポイントに接続)と読み込み専用の接続先設定(リーダーエンドポイント)を別々に用意してプログラム中で使い分けるのが良いということになりました。もちろん読み込み専用で接続したときにはプログラムからreadonlyコマンドを送るわけです。

database.php はこんな感じで、REDIS_HOST_READ と REDIS_HOST_WRITE は .env でそれぞれリーダーエンドポイントとプライマリエンドポイントを設定します。このリーダーエンドポイントの下にレプリカノードを複数用意しておけば負荷分散になります。

'redis' => [
(略)
    'read_cache' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST_READ', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],

    'write_cache' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST_WRITE', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],

],

jqのクエリをインタラクティブに作成する

JSON のデータを扱うときに jq は必須といって良いツールです。

  • 見やすく表示する
  • データを抽出する
  • 特定のデータだけをまとめて新しいJSONファイルを作る

対象のJSONデータの構造を把握していれば jq のクエリを書くのもそれほど苦労はありませんが、そうでない場合は試行錯誤が必要になります。クエリをちょっとずつ変更しながら毎回 jq を叩くのも良いですが、インタラクティブにクエリを書けるツールを使えばもっと楽にできます。

そういう用途のツールとして jiq があります。以下の画像のようにインタラクティブにクエリを書いてJSONデータを掘り下げることができます。最終的なクエリの文字列を標準出力に吐いて jq コマンドに渡すこともできます。

インストール方法は、Linux 系の場合はプロジェクトのダウンロードページから最新版をダウンロードして展開してパスを通すだけです。

jiq と似た jid というツールもあり、こちらは各種ディストリビューションのパッケージも用意されていてインストールがより簡単です。ただし、jiq の方が対応しているクエリの種類が多いのでこちらを使っています。