スマホでtemtemを始めよう!

★おことわり
クラウドゲームサービスは回線速度に大きく影響されます。
やっていただいて後悔しないように可能な限り補足を載せていきますが、内容の正しさ等に責任は持ちません。
執筆時の情報となるため、情報が古い場合もあります。正しい情報はご自身で調べることをおすすめします。

temtemをやりたいけど、ゲーミングPCがない・・・
そんな貴方に朗報!
2020年6月からサービス開始のGeForce Nowでtemtemがプレイ可能です!

■対象OS
Android、Windows、Mac
※iOS(iPhone)は未対応

■動作要件
公式リンク
[ポイント1]グラボや低スペックPCでも動作
[ポイント2]一応外からも動くけど、4G回線からの動作は期待しないこと。スマホもWi-Fi環境前提でまずは考えたほうがいいかも。5G来たら変わるかもねー。
[ポイント3]マンションとかだと夜は重かったりするので、事前に回線速度計測がおすすめ!(必須15Mbps:推奨25Mbps)

■対象ゲーム
以下から遊べるゲームを調べることができます。
遊べるゲームを探す
[ポイント1]ゲームを別途購入する必要があります。
[ポイント2]Temtemはターン制ゲームなので僅かな遅延は問題にならない

■サービス開始時期
6月予定(おそらく上旬?)

★FAQ
▼何歳から利用可能?
16歳以上が対象のサービス

▼低スペックスマホでもいい?
ある程度は必要だけど、ハイスペックな必要はないよ。回線速度のが大事。詳細は動作要件みたり、ベータテストで同じ機種使ってた人いないか調べるといいよ。

▼いくらかかるの?
ソフト代とは別に月額(1800円)がかかるよ。
2020年6月から7月まで全員無料、7月から半年くらいは半額らしいよ。無料期間だけやるのもいいかもね。
他のPCゲーも遊べるようになるからいいかもね。

▼遅延はどうなの?
クラウドサービスだから少なからずあるよ。
国内サービスだから遅延は少なめとは思うけど、半年くらいベータテストやってたから、実際にやった人の感想聞くのが早いと思うよ。
別サービスの感想だけど、格ゲーとかは難しいと思うけど、モンハンはガチでやるにはギリギリ、RPGは気にせず遊べたよ。

▼セーブデータPCに引き継げる?
Steamクラウドなのでpc変えてもデータは共通。

▼コンシューマ版にデータ引き継げる?
一緒にプレイは出来るけど、別本体へのデータ引き継ぎはまだ未定。公式はやりたいと言っているよ。

▼今からでも追い付ける?
ほとんど気にしなくておっけー。
夏にアイテムやテムテム追加くるからそれまでにpt組むといいよ!

temtem配信者の紹介

誰かがプレイしているのをなんとなく眺めたいと思うこともありますよね?
日本配信者プレイヤーは更新が現在ある方を中心に、冒険、ランクマ問わず
海外のプレイヤーは高レート帯ランクマを中心にご紹介します。
視聴時に確認できた最高レートが1200を超えていた場合、こっそり記載してます。
※非配信者日本人プレイヤー紹介もしたかったけど、非配信者だと嫌な方もいると思うので配信者に絞ってご紹介します。

日本人プレイヤー
■ Youtube配信者さん
第一話リンク
【配信】録画
【プレイ】攻略
【platform】youtube

■ ニコニコ配信者さん
第一話リンク
【配信】録画
【プレイ】攻略
【platform】ニコニコ動画

■ Showroom配信者さん
【配信】生放送(告知等)
【プレイ】攻略
【platform】Showroom

■Mildom配信者さん
配信先リンク
【配信】生放送(告知等)
【プレイ】ランクマ
【platform】Mildom

■Youtube配信者さん
配信先リンク
【配信】録画
【プレイ】攻略
【platform】Mildom

■配信者さん
投稿先リンク
配信先リンク
【配信】録画
【プレイ】ランクマ(1475)

■Youtube配信者さん
配信先リンク
【配信】録画
【プレイ】ランクマ
【platform】Youtube

————————————————————–
海外プレイヤー(基本的にアーカイブあり)

■海外配信者さん
配信先リンク
【配信】生放送
【プレイ】ランクマ(1500)

■海外配信者さん
配信先リンク
【配信】生放送
【プレイ】ランクマ(1800)

■海外配信者さん
配信先リンク
【配信】生放送
【プレイ】ランクマ(1700)

■海外配信者さん
配信先リンク
【配信】生放送
【プレイ】ランクマ(1400)

■海外配信者さん
配信先リンク
【配信】生放送
【プレイ】ランクマ(1700)

■海外配信者さん
配信先リンク
【配信】生放送
【プレイ】ランクマ(1700)

■temtemトーナメント
配信先リンク
【配信】生放送
【プレイ】トーナメント

temtemをクリアして次にやること

この記事はtemtem Ver5.x時代に書かれたものです。
記事を読まれているVerと乖離がある場合、内容に間違いがある場合があります。
あらかじめご了承ください。

temtemのプレイありがとうございました。
どうでしたか?マックスには一発で勝てました?luma(色違い)のテムテムには出会えましたか?
kishiwaのアップデート楽しみですね。

さて、クリアしてしまった方にお話ししたいのはtemtemのこれからと、
クリア後何をすればいいのか、です。
現在できるクリア後コンテンツにあまり興味がもてなかったら、中長期のロードマップを確認して、
そこまで休んでもいいし、次のゲームにいってしまうのもいいかなと思います。

現在temtemには目先の詳細の中期ロードマップと、
2年くらいを視野にいれたざっくりとした長期ロードマップがあります。

temtem loadmap

ちなみに春のrelease予定だったコンテンツは3分の1が4/8に来ました。
全体的にスケジュールは後ろ倒しになる傾向はありますが、2-3週間に1度アップデートはあるモチベーションの高い会社です。
またバグもちょいちょいあったりしますが、すぐ直しているイメージです。

定期的なテムテムの追加と、ストーリーの追加ですね。
いったんストーリーは2020年末くらいに完結し、コンソール版を出すのが目標みたいです。

気になるのは・・・
非バトル勢だとハウジングや、テムテムの追加、シナリオアップデートとかでしょうか?コスメスティックストアはたぶんリボンつけたりできるコンテンツな感じがします。
バトル勢だと先日実装されたレート戦の拡充やバトルビデオ、ゲーム内トーナメント、ギルドバトル(ジム争奪戦)とかですかね?
配信勢だとNuzlockeモードですかね。
※Nuzlockeは完全に別サーバーでtemtemが死亡すると復活しない、全滅=キャラデリになる世界。ちなみに対人でも同じため、対人するということは片方のプレイヤーが消えるということ。

temtemの最新情報は
temtem公式ツイッターがダントツでおすすめです。
ついでにもフォローしておきましょう
また攻略サイトは国内のは基本的にダメです。
海外の攻略サイトを参考にしましょう。
official Wiki
temtemstrat

ちょっとバトル勢よりではありますが、クリア後の話をしましょう。

■コースをすべて取得する
temtemに何度でも技を教えることができるアイテムです。
現在18種類くらいあるので、全部取得しましょう。
official Wiki – Item
ここの中にあるcourseを開けばどこに置いてあるか、書いてあります。
いまいちわからない場合はアイテム名などでググれば写真付き解説や、一部日本語記事もでてきますよ。

■道具をすべて取得する
テムテムに追加能力をつけることのできるアイテムです。
交換などはできず、消費もしないもの。
official Wiki – Item
ここの中にあるgearを開けばどこに置いてあるか、書いてあります。
いまいちわからない場合はアイテム名などでググれば写真付き解説や、一部日本語記事もでてきますよ。(さっきも書いたなこれ)
ただ、四葉のクローバーに関しては設置場所がアプデで変わっているので古い情報には気を付けてください。

■temtemを全種類捕まえる
temtemを全種類捕まえるような図鑑集め、そんな好きじゃない人もいますよね?
ただ、テムテムでは完全にタイプ相性を掌握できているのであれば問題ないですが、
戦闘中に”この技をうつと、この敵には弱点か?抵抗か?”といった情報を表示してくれる機能があります。
この機能は所有したことのあるテムテム限定の機能になるので、風・精神タイプに毒うつときに抵抗か等倍かわからないときに
戦闘中のプレミを防ぐことができます。

大雑把な生息地は以下から調べます。
official Wiki – TemtemSpecies
どの草むらで何%ででるかは以下を参考にします。TVsという努力値振るときも超便利です。
temtem map

■色違いを捕まえる
二週間に一回、一部のテムテムの色違い率がアップし、卵技を覚えていることがあります。
saiparkの情報は公式ツイッターを参照ください。

—————————————-

■レート戦に参加する
このゲームで遊んでいくコツは最初から完璧を目指さないことです。
理想個体付加して完璧な努力値振ってもう育成しない!みたいな未来はありません。
このゲームはポケモンよりも努力値の価値が高く、調整の幅がとても広いです。
攻撃・素早さ全振りしようものなら、柔らかすぎて一瞬で溶けます。ぜひ、失敗して自分なりの答えをみつけていってみてください。

このゲームのレート戦はレベル・SVs(個体値)が自動でMAXになります。
いきなり理想個体孵化すると嫌になっちゃうと思うので、適当に捕まえた個体や、
5V(2000パンサンくらいで買える)を捕まえましょう。
もしある程度高個体で育てるなら素早さ50のテムテムがおすすめです。きっとやりこんでいけば理由がわかるはずです。

どんなPTにするのか?はtemteamがおすすめです。
※ちゃんと事前に考えれば500振りして後悔しなくてすむかもしれません。まあ500振っちゃってもいいです。失敗して学びましょう。

ダメージシミュレーターはtestemを使うのが一般的です。

さて、具体的な戦闘のやり方、調整の仕方、バトルの仕様、オーソドックスな育成方法、トップメタなどは別記事で。
いったんはtemtem一覧や技一覧、特製一覧などをみながら(上記攻略サイト参照)、強いと思った構築を作って試して、流行をみて答え合わせしていけばいいと思います。
最初から流行を追ってしまうと、あなたが答えになる機会が減ってしまいますからね。

ぜひレート戦や冬に来るトーナメントでお会いしましょう。

LINE API(LIFF)+AWS でハンズオンしてきた

とても良かった(小並感)

AWSの資格を取得したものの、ちゃんと何か作ったことないなーとか、
他の資格とるには経験足りないなーと思ったのが参加のきっかけ。

簡単操作でやった感が出るとてもいいハンズオンだった。

ほぼ永続的にハンズオン教材や動画を残しておいてくれるそうなので、試してみたい人はぜひ。

AWSのアカウント作ったー LINEグループ作れるよーくらいで以下のようなアプリが作れちゃいます。

ボードだして、イラスト書くとそのままラインにおくれちゃう!

実際のコーディング部分はほぼなくて、値の設定くらい。
どっちかっていうと、LIFFの作り方やAWSでどう環境構築するか?みたいな部分をもりもり試せた。
ほぼ無料枠内のみで完結して、後始末手順もしっかりあり、当日はAWS社員やLINE社員の手厚い介護を受けながら試せる。

これ無料でいいのか!?

AWSで触ったサービスはS3、Lambda、APIGateway、CLOUD9、chaliceとかかな。
CLOUD9なるオンラインエディタとchaliceは初めて聞いたけど、デプロイ簡単過ぎるし、ローカルへの環境構築がいらなくてハンズオンとの相性は最高だった。

LINEのミニアプリ(LINEの中で動くアプリのようなもの)の説明や、
サーバーレスでどのようにサービスを作るかみたいな座学もあり、本当に充実していた。
また参加したいなー。

当日のハンズオン資料は下記にあるので、興味ある方はぜひ試してみてください。
LINE APIでAWS上でアプリを作ろう! 2020年版
LINE API × TECH API VOL. 2 POWERED BY AWS

ちなみに他の人に使ってもらうのは下記の丸でかこった部分を押してDeveloperからpublicに変更すればいいです。
※自己責任で。

【本日の格言】
オンプレはブサイク
※個人の見解であり、所属する団体とはry

2020年:AWSソリューションアーキテクト-アソシエイト合格体験記と書籍紹介

2019/12末、長期休暇に入るにあたり、時間取れるし何かやるかなーと思いたち、
前々から取ろうと思っていたAWSソリューションアーキテクト-アソシエイトを勉強して取得してきました。

1中旬に取得したので、だいたい2週間ちょっとくらい。
その間にどんな勉強したかを忘れないうちに書いておきます。
合格体験記とか勉強法は記事がたくさんあると思うので、
実際に利用した勉強サービスや書籍を紹介したいと思います。

■スペック
AWS未経験
インフラほぼ未経験
アプリエンジニア数年

■今回購入したもの
AWS認定アソシエイト3資格対策(書籍)
この一冊で合格!AWS認定テキスト&問題集(書籍)
一夜漬けAWS認定ソリューションアーキテクトアソシエイト(書籍)
AmazonWebServices 基礎からのネットワーク&サーバー構築(書籍)
AWS WEB問題集で学習しよう(WEBサービス)
公式模擬試験(WEB)

■無料で利用したもの
blackbelt
公式のよくある質問
公式のサンプル問題

■AWS認定アソシエイト3資格対策(書籍)
おすすめ度:★★★☆☆
勉強時間:1週読む(1.5日)
AWS認定試験でソリューションアーキテクトの本が乱立する中、DeveloperとSysOpsも抑えた1冊
3資格コンプリート目指す人が読む分にはいいかなーと思いつつも、それぞれの資格の境界線が曖昧であることや
いざソリューションアーキテクトを受かった後にDeveloper勉強しようにもいまいち使い勝手が悪く、
初動にざっくりやるにはいいけれど、試験前日に読む書籍ではなかったなあという印象でした。

■この一冊で合格!AWS認定テキスト&問題集(書籍)
おすすめ度:★★★★☆
勉強時間:2週読む、付属の問題をすべて完璧にする(2日)
問題集が欲しかったために購入したが、問題はそんなに多くない。
内容としては既に古いものもあったが、内容も図解がわかりやすく概ね満足した。
模擬試験の難易度が他の書籍に比べて高く、本番以上だった。
ただし、本番にでない形式の問題があるなど、出題形式に慣れたい場合は不向き?
この一冊で!とあるが、各種レビューサイトにもかかれているが、この一冊だけで合格は結構しんどいと思う。
というか、1冊だけで合格がしんどい資格だと思います。
おすすめは2~3冊購入して情報の網羅性を高めることと、2~3冊で重複する内容は出やすいものなので、複数冊買う方がいいんじゃないかなと思います。

■一夜漬けAWS認定ソリューションアーキテクトアソシエイト(書籍)
おすすめ度:★★★★★
勉強時間:3週読む、付属の問題をすべて完璧にする(4日)
2020年発売の書籍。情報も新しい。一番のおすすめ。
章構成が実際の出題カテゴリとリンクしていて、公式の模擬試験で点数が悪かった場所を重点的に勉強も可能
ページ上部にポイントとなる概要、その下に解説という形式をとっているため、試験前日にポイントを読む→分からなければ解説を読む
といった勉強がとてもしやすかった。
また、問題の出題形式についての具体的な解説やこのサービスの問題はこういったことが聞かれるといった内容がかかれている(実際にでた)
受かるために必要な情報が凝縮された一冊でした。
模擬問題の解説がめちゃくちゃよくて、他の問題集は正解の理由が書いてあるだけで、
誤答に対して、なぜそれがだめなのか?について丁寧に記載されている点が本当によい。
今から受ける人がいれば絶対にお勧めしたい一冊です。

■AmazonWebServices 基礎からのネットワーク&サーバー構築(書籍)
おすすめ度:★★★★☆
勉強時間:1週読みながらハンズオン(2日)
AWS試験を受かるには手を動かすことだ!といった話を聞くことも多く、まず触ってみるかーと吟味して選んだ一冊。
勉強後にちゃんと終了させれば無料枠で出来る内容しか記載されておらず、やろうと思えば1日かからずできる量であることがよかった。
結論として、短期間で受験するなら実際に触る時間を机上で勉強した方が時間効率はいいように感じた。
しかし、この書籍のハンズオンはネットワーク未経験だった自分にサブネットやTCP/IPの内容をわかりやすく書いてくれたおかげで後の勉強がやりやすくなったことや
1冊勉強を終えたという達成感、NAT関連の問題にはまず間違えずに即答出来るようになり、自信がついたことなど、
短時間のハンズオンでありながらメンタル面でとてもプラスになった。
ただし、利用するソフトウェアのversionのかみ合わせが悪く、本の通りにやるだけだと動くところまでいかず、トラブルシューティングに時間がかかって計2日かかってしまった。
ちょっとそこだけは残念だなーと思いつつ、書籍だから仕方ないと割り切った。
もし買ってつまった方は以下の記事を読んでもらいたい
awsでWordPressが500エラー時の対処法

■AWS WEB問題集で学習しよう(WEBサービス)
おすすめ度:★★☆☆☆
勉強時間:2日?
スマホからも利用できる問題集。4500円くらい。
勉強法や合格体験記を読んでいるとよく話題にあがるサイト。
問題数は多く、移動中ができるのは魅力だがそれだけのサイト。
AWSの知識を増やすにはいいけれど、出題の仕方や実際の試験で問われるベクトルと異なる問題も多数あり、
ping-tなどの資格問題サイトを経験した後だと間違えた問題を一覧でみるとか、問題にフラグをつけるといった機能がなく
ただただ使いにくかった。
時間に余裕があるときに壁打ちを繰り返すにはいいかもしれないけれど、
スマホからできることのメリットを生かせないなら、値段と比較してしまうと個人的にはあまりおすすめできない。

■公式模擬試験
おすすめ度:★★★★☆
勉強時間:半日以下
問題数は少ないけど、良質な問題
難易度は低めなので油断しないように。
ただ、答えもらえないのがただただマイナス。

■blackbelt
おすすめ度:★★★☆☆
勉強時間:2日
公式の情報動画、無料。
最新の情報がでるが、厳密な情報も多いが、情報過多でノイズになりがち。
分からないサービスを理解するにはかなり良かった。
問題解きつかれた頭で受け身で勉強もできる。
問題点は物量がすごいことと、ITの知識がちょっとないと内容が難しいことがある点。

■公式のよくある質問
おすすめ度:★★★★☆
勉強時間:1日
公式のサービス別よくある質問。
ここから出る問題も少なくない。ただ物量があるため、頻出サービスの苦手分野だけ読むほうがいいかも。
理解度の低いサービスの理解度は一気に上がる。

■公式のサンプル問題
おすすめ度:★★★★☆
勉強時間:30分
簡単すぎる問題。ただすぐ終わるし無料なのでとりあえずやっとけ感はあります。

【おまけ】ネットで出ている情報で古かったもの・誰かに教えてほしかったもの
・2018年3月くらいから新試験が開始されていて、8月頃に旧試験が終了した。
・2020年3月頃から更に新試験が出る。難易度はあがりそう、現試験もいつかは終わる
・資格の有効期間が2年から3年に延長された
・プロフェッショナル試験は前提のアソシエイト試験をもっていなくてもよくなった
・遠隔カメラで監視されて英語でチャットみたいな話も聞くけど、そんなことはなかった。会場によるかもしれないけど最近の受験記事できかない。

awsでWordPressが500エラー時の対処法

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版を読みながらAWSをいじっていた時躓いたので
同じ状況の人のためにメモ。

■状態
CHAPTER8 DBを用いたブログシステムの構築 の項目内
8-4 WordPresssを設定する において
サーバーに接続しようとした際、500エラーが返却されてページが表示されない。

■原因
最新のWordPressが求めるPHPのバージョン条件を満たしていない

書籍出てから結構立つし、しゃーないよねって話。

以下、上記書籍の手順通りに作成している場合の原因確認方法と解決方法を記載する。

■確認方法(直し方知りたいだけの人はここは飛ばす)
まずPHPのエラーは以下のコマンドで確認できる。

sudo less /var/log/httpd/error_log | tail -20

すると以下のようなエラーがでているはずだ。

[Sat Jan 04 19:53:14 2020] [error] [client *****] PHP Parse error:  syntax error, unexpected '.', expecting '&' or T_VARIABLE in /var/www/html/wp-includes/functions.php on line 1064

これは、WordPress 5.2ではPHP 5.6.20以降が必要なだが、古いPHPを利用してるときに発生する。
参考サイト

蛇足だが、インストールされてるPHPのバージョンを確認するのは以下

yum list installed | grep php

私の環境ではPHP5.2であったため、そもそもバージョンが足りていなかった。

■解決方法
理想はPHPのバージョンを7.xにすることだが、少々めんどくさい
また、今回はネットワークの勉強やAWSをさわりたい人がやっていると思うので、
書籍から大きく変わらない手順で対応するため、WordPressのバージョンを落とす。

以下のコマンドで配置したファイルの削除を行う

 
cd /var/www/html/
sudo rm -rf ./*
cd 
rm -rf wordpress

8-3 でwget で行ったコマンドを以下に読み替える

wget https://ja.wordpress.org/wordpress-4.9.13-ja.tar.gz

※併せてtar の展開コマンドも変える。

以降の手順は書籍通りに実施すれば500エラーが出ずにWordPressのページが開けるはずだ。

以上

seleniumのheadlessでプロファイルを使う際のエラー解消法

忘却メモ。
chromeでseleniumでヘッドレスモードを指定し、プロファイルを設定しようとしたら以下のエラーが出た。
解消法を探すのになかなか苦労したため、ここに記す。
■エラー発生した際のサンプルコード

options.add_argument('--headless')
options.add_argument('--user-data-dir=user')
options.add_argument('--profile-directory=profile')
driver = webdriver.Chrome(executable_path=chromeDriverPath, options=options)

■発生したエラーコード

Traceback (most recent call last):
  File "~\hogehoge.py", line 40, in __init__
    driver = webdriver.Chrome(executable_path=chromeDriverPath, options=options)
  File "~\webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "~\webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "~\webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "~\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "~\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: DevToolsActivePort file doesn't exist

この問題を解消するには下記のオプションを追加する。
DevToolsとやり取りするにはポートを指定してやる必要がある。

options.add_argument("--remote-debugging-port=9222") 

少しversionが古いが、下記の公式Documentsが参考になった
ヘッドレス Chrome ことはじめ

以上

PythonでChromeWebDriverを自動更新するselenium運用

Selenium/Appium Advent Calendar 2019の19日目の記事です。

seleniumを利用してしばらく立つと、ある問題に直面します。
chromeのメジャーバージョンアップされると、chromeWebDriverが不一致でエラーを吐く・・・
以前は一度更新すれば3versionくらいは利用できたそうですが、
最近ではメジャーバージョンがあがるとアップデートが必要です。

楽をしたくてseleniumを使うのに面倒をみるのは大変なので、自動更新をしてみます。
つまり、seleniumという便利なクローラーを使うために、seleniumを使わずにクローリングします。
(seleniumの記事なのにseleniumを使わない・・・!?)

コードはPythonで記載をしますが、他言語でもかけるように解説をしっかり入れていきます。
以下のインポートをしている前提で話を進めていきます。

import os
import re
import zipfile
import urllib.request
from lxml import html

※lxmlはpipで取得しておく必要があります。

■処理の流れ
1. ローカルのChromeのバージョンを確認します。
2. バージョンが異なる場合、適切なドライバを調べます。
3. ファイルをダウンロード・解凍し、フォルダに配置します。
4. 適切なドライバでseleniumを起動!

■サンプルコード
GitHub-getChromeWebDriver
※上記コードはMIT LICENCEです。
※この記事のコピペや参考はフリーです。

【1】ローカルのChromeのバージョンを確認します。
Chromeはコマンドから直接バージョンを取得する方法はありません。
なので、Applicationが配置されている場所に、バージョン名のついたフォルダがあることを利用し、
現在のバージョンを取得してみます。
また、Chromeはバージョンアップの際、次のバージョンのディレクトリを作成し、
次回起動時に変更+旧ディレクトリの削除を行うため、ディレクトリが複数ある場合があります。
なので、ディレクトリの中でもっとも新しいバージョンを確認します。

# インストールしている場所を変更していなければディレクトリはここに作成されている。
files = os.listdir(r"C:\Program Files (x86)\Google\Chrome\Application")
# ChromeApplicationフォルダ配\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\下にあるフォルダをフルパスで取得
filesDir = [f for f in files if os.path.isdir(os.path.join(r"C:\Program Files (x86)\Google\Chrome\Application", f))]

# 最大値を取るための変数を用意 
version = 0
for folder in filesDir :
     # 正規表現でメジャーバージョンを取得
     filePattern = re.compile(r'([0-9]+(?=\.))')
     result = filePattern.match(folder)
     # 取得できていたら、最大値を保存
     if result:
          version = max(version,int(result.group()))

これで次に起動する際のメジャーバージョンを取得できました。

【2】バージョンが異なる場合、適切なドライバを調べます。
現在のドライバのバージョンを設定ファイルなどで保持しておき、現在のドライバのバージョンと
Chromeのバージョンが不一致の場合、ドライバのダウンロードを行います。

Chromeドライバの最新版は下記からダウンロードできます。
https://chromedriver.chromium.org/downloads

ただし、毎回同じバージョン毎にパスが変わるので、直接ファイルを取得します。
気をつける必要があるのは、ここのDriverはローカルよりも新しいバージョン用のものが置かれていることがあり、
自分にあったドライバを選ぶ必要があります。
※おそらくディベロッパー向けや地域による差だと思います。

ファイルを取得後、Xpathで対象リンクを洗い出します。
※もっとモダンなやり方があればおしえてください。

# ChromeDriver配信ページを取得
url = 'https://chromedriver.chromium.org/downloads'
with urllib.request.urlopen(url) as f:
    htmltext = f.read().decode('utf-8')

# XPATHで対象となる項目を取得
title = html.fromstring(htmltext).xpath("//table[@class='sites-layout-name-one-column sites-layout-hbox']/tbody/tr/td/div/div/ul/li")
chromeDriverVersionList = title[0].xpath("li") 
mi = "0"
for versionValue in chromeDriverVersionList :
    # リンクを取得
    versionValueLinklList = versionValue.xpath("a")
    # 要素が空の場合、スキップ
    if(len(versionValueLinklList)==0):
        continue
    chromeDriverStatus = versionValueLinklList[0].text
    # メジャーバージョンを取得
    m = re.search('(?<=ChromeDriver )[0-9]*', chromeDriverStatus)
    # ローカルのバージョンと一致するか確認、一致したら結果を保存
    if(str(m.group()) == str(versionValue)) :
        versionOfMajor = re.search('(?<=ChromeDriver ).*', chromeDriverStatus)
        Driverversion = str(versionOfMajor.group())

【3】ファイルをダウンロード・解凍し、フォルダに配置します。
Windows用のDriverはZIPで圧縮されているため、ダウンロード後、解凍して配置します。

# version情報からURLを決め打ちでダウンロード
furl = "https://chromedriver.storage.googleapis.com/" + Driverversion + "/chromedriver_win32.zip"
urllib.request.urlretrieve(furl, "temp.zip")
with zipfile.ZipFile('temp.zip') as zipF:
    zipF.extractall("ChromeDriver配置先")

# 任意の設定ファイルなどにDriverのversionを記録(毎回取得しないようにするため)

これをseleniumを利用したアプリケーション起動前に実行することで、バージョン違いの問題はクリアされます。

【4】本命のSeleniumアプリを起動

以下で色々書き加えたソースコード公開しています。
GitHub-getChromeWebDriver

デッキを無くしがちなカードゲーマーに「tile」という選択肢

「Tile」の紹介です!

カード版じゃない方を買って使っていたら使い心地がとてもよくて、思わずカード版も買っちゃいました。
デッキを無くしがちなカードゲーマーにとっての必需品と感じたので、レビューするよ!

■Tileって何?
5年くらい前からぼちぼち普及しだした、スマホから落とし物を探せるツール。
カードゲーマーに限らず、全人類スマホを家の中でなくしたことありますよね?
スマホなら呼び出せるけど、鍵や定期券となると昨日の自分に文句を言いながら探すしかない・・・
そんな人にスマホから呼び出せる、落とし物トラッカー!

そして開封・・・

薄い!!!

カードと比較

デッキケースにも普通に入っちゃいます。

■どんなときに使うの?
例えば・・・一般的な「デッキを無くしがちなカードゲーマーの部屋」をお借りして実験します。

一般的なデッキを無くしがちなカードゲーマー」の部屋

デッキがどこにあるかわからない・・・

スマホからポチ!


音が聞こえる!


見つかった!
※ちなみにスマホを逆に探すこともできます。

★5年前から大きく変わったこと

  • 普及して価格が安くなった
  • Bluetooth4.0から、消費電力が大幅減少!
     → 5年前は3ヶ月しか持たなかった電池が1~3年持つようになった
  • 地図から探す等機能が増えた
  • 有効範囲が大幅に広がった(現在は45m~120m
     → 今回のカードタイプは60m以内なら探せるようです)

特にかく不便さがなくなったんです!
以前は3ヶ月おきに電池変えてましたからね・・・
今回紹介するカードタイプは3年持つんです。(使い捨てですが)

万が一落としても、最後にみえていたところをマップで表示してくれる機能もあります!
tileを使っている人が近くを通ると離れていても荷物がどこにあるかわかるようですよ。(他の人に個人情報が漏れたりはしません。)

ちなみにキーホルダーにつけることが出来る版もありますよ。
こちらは2019年11月に発売されたばかりの新型で、有効範囲やキーホルダー部分の改善などがされたようです。
有効範囲100m超えたのが面白すぎて、思わず買ってしまいました。
こっちは電池交換可能で、有効範囲120m

定期とか鍵はこっちのほうがいいかな。

ためしてみてね

Pythonでwindows通知(トースト・バルーン)を出す方法

Python Advent Calendar 2019の14日目の記事です。

速攻作れるだろ~と思っていたら、意外とめんどくさかった。
なにより日本語の標準モジュールだけで実現する解説記事が多分ない。(多分)

色々調べたので、忘れないうちに未来の自分と同じことをしたい人へ共有

作り方なんていいんだよ!ソースくれって人は下記のソースをぶっこんで使ってどうぞ。
GitHub-easyToast
ちなみにLicenceはMITLicenceです。
あ、スターください。

また、今回勉強しつつ調べてまとめているので、
もし間違っているところがあればツイッターなどで教えて下さい

今回は利用する標準モジュールのみで実装を行う。

■トーストとは?
古すぎないWindowsでなにかApplicationからのお知らせがあるときに
画面右下に出てくる通知のようなもの。
バルーンと呼ばれることもあるが、厳密にはこれはトーストである。
※バルーンは小アイコンからの吹き出し

■トーストを出すまでの流れ
1. Pythonでctypeを利用する
2. APIにあった構造体を用意する
3. WindowsAPIを利用できるように読み込む
4. LoadImageWで画像アイコンを利用できるようにする
5. Shell_NotifyIconWで通知申請を行う

なにがなんのことかわからないと思うので、順番に説明する。
サンプルコードが何度か登場するが、基本的には以下のimportを行っている前提で話をすすめる。

import os
import ctypes
from ctypes import Structure, windll, sizeof, POINTER, WINFUNCTYPE
from ctypes.wintypes import ( 
    DWORD, HICON, HWND, UINT, WCHAR, WORD, 
    BYTE, LPCWSTR, INT, HINSTANCE, BOOL, HANDLE
    ) 

■Pythonでctypeを利用する
Windowsでトーストを出すにはWindowsAPIからバルーンを出すリクエストを出す必要がある。
WindowsAPIを叩く際にbathなどを経由してもいいが、PythonからWindowsAPIを叩く良いやり方はctypeを使う

ctypeとはPythonでCの関数ライブラリを使うことが出来るものだ。
簡単なコードでとりあえずctypeを試したいのであれば、以下の記事がとても参考になった。
Python から Windows API を呼び出す – MessageBox の例
ctypeの詳細を知りたい方は以下をどうぞ。
ctypes — Pythonのための外部関数ライブラリ

■APIにあった構造体を用意する
ctypeを使って、まずはAPIを叩くための構造体を準備する。
ctypesのStructureを継承したクラスで構造体を定義します。

最初聞いたときなんのこっちゃと思いましたが、
ざっくりいうと、WindowsAPIになんらかの動作を指示する際に渡すデータの集まり(タイトルとか表示方法とか)には
事前に決められた構造体(何番目になんの型のなんて名前のデータが入るなどの定義)を用意する必要があり、
後述するWindowsAPIの仕様書(英語)を片手に準備する必要があります。

今回、トーストを出すために作成する必要がある構造体は以下

class GUID(Structure):
    _fields_ = [
        ("Data1", DWORD),
        ("Data2", WORD),
        ("Data3", WORD),
        ("Data4", BYTE * 8)
    ]

class NOTIFYICONDATAW(Structure):
    _fields_ = [
        ("cbSize", DWORD),
        ("hWnd", HWND),
        ("uID", UINT),
        ("uFlags", UINT),
        ("uCallbackMessage", UINT),
        ("hIcon", HICON),
        ("szTip", WCHAR * 128),
        ("dwState", DWORD),
        ("dwStateMask", DWORD),
        ("szInfo", WCHAR * 256),
        ("uVersion", UINT),
        ("szInfoTitle", WCHAR * 64),
        ("dwInfoFlags", DWORD),
        ("guidItem", GUID),
        ("hBalloonIcon", HICON),
    ]

具体的なやり方などは下記が参考になった。
Python: ctypesパターン集

GUID と NOTIFYICONDATAW ってのを使うんだなーくらいで今は大丈夫。

■WindowsAPIを利用できるように読み込む
WindowsAPIを読み込んで、引数の定義と戻り値の定義を行う
今回利用するAPIはLoadImageとNotifyIconだ。
▼サンプルコード

LoadImageW = windll.User32.LoadImageW
LoadImageW.argtypes = [HINSTANCE, LPCWSTR, UINT, INT, INT, UINT]
LoadImageW.restype = HANDLE
    
Shell_NotifyIconW = windll.Shell32.Shell_NotifyIconW
Shell_NotifyIconW.argtypes = [DWORD, POINTER(NOTIFYICONDATAW)]
Shell_NotifyIconW.restype = BOOL

API名の最後にWがついているが、WindowsAPIは最後にWがつくのと、Aがつくものがあり、
利用している文字コードなどの違いがある。今回はWを利用している。

必要な引数等はMicrosoftのドキュメントが参考になった。
Shell_NotifyIconW function
LoadImageW function
NOTIFYICONDATAW structure

ひとまず、これでWindowsAPIが利用可能になった。

■LoadImageWで画像アイコンを利用できるようにする
バルーンで利用しているアイコンは.icoといった拡張子の画像ファイルだ。
変換サービスやフリー素材などがあるので、適当な画像を用意しよう。
また、アイコンなしでトーストを出す方法も記載するため、この項目は飛ばしても構わない。

hicon = LoadImageW( None, icon, 1, 0, 0, 0x00000050)

これはLoadImageWを呼び出すコード。
引数の詳細は上記Microsoftのドキュメントに記載があるが、ざっくりと解説。

・第一引数
画像を使う場合はNoneを指定する(nullを指定したことになる)
・第二引数
今回は画像のファイルパスを指定する。
・第三引数
読み込む画像の形式を指定する。
アイコンは1を指定。試していないけど0だとビットマップが読み込める?
・第四引数
アイコンの幅を指定する。0なら自動
・第五引数
アイコンの高さを指定する。0なら自動
・第六引数
オプションフラグを設定する。

16進数で記載されていて最初はよくわからないかもしれないが、
WindowsAPIでは有効にする設定の数値を合計したものを指定する。
例えば、0x00000001の設定と0x00000002の設定を有効にするのなら、0x00000003を指定する。(16進数なので繰り上がりに注意)
足し算でなく、ビット演算で合算してもよい。 0x00000001 | 0x00000002
どのような設定値があるかは上記マニュアルを確認する。

今回はLR_DEFAULTSIZE(0x00000040)とLR_LOADFROMFILE(0x00000010)を指定している。
成功すればイメージのハンドルが返却される。

5. Shell_NotifyIconWで通知申請を行う
まずはWindowsAPIに渡すデータを作成する。
▼サンプルコード(画像表示あり)

flags = 0x00000016
infoflag = 0x00000034
mem_size = sizeof(NOTIFYICONDATAW)
notify_data = NOTIFYICONDATAW(
        mem_size, 0, os.getpid(), flags, 0, hicon, "tips", 
        0, 0, "message", 4, "title", infoflag, GUID(), hicon
)

▼サンプルコード(画像表示なし)

hicon = None
flags = 0x00000014
infoflag = 0x00000000
mem_size = sizeof(NOTIFYICONDATAW)
notify_data = NOTIFYICONDATAW(
        mem_size, 0, os.getpid(), flags, 0, hicon, "tips", 
        0, 0, "message", 4, "title", infoflag, GUID(), hicon
)

さて、とうとう通知を出す。
それぞれ何をしているかざっくり解説する。
※詳細は上記Microsoftのドキュメントを確認されたし

第一引数
作成した構造体のメモリサイズを指定する。
ctypeのsizeofで取得が可能
第二引数
今回は13引数を指定するため、読み飛ばされる
第三引数
実行しているPIDを取得する。上記サンプルでは自身のPIDを取得している
第四引数
どんな情報があるかやどんな表示をするかなどを指定する。
今回は NIF_ICON,NIF_TIP,NIF_INFOを有効にした。
画像を利用しない場合はNIF_TIP,NIF_INFOを有効にする。
※詳細は上記Microsoftのドキュメントを確認されたし
第五引数
LoadImageWで生成したハンドルを指定する
画像表示を行わない場合、NONEを指定
第六引数
アプリ名や詳細の記載を行う。
トーストのアプリ名が以前はここの指定内容になっているような記載をみたが、特に反映されなかった。
第七引数
画像の情報の取り扱い?
利用しないので0を指定する
第八引数
0を指定する
第九引数
通知に表示するメッセージを指定
第十引数
シェルのversionを指定する。
第十一引数
通知のタイトルを指定する。
第十二引数
利用するアイコンの設定を行う。
0x00000001や0x00000002を加算するとシステムに用意されたアイコンを利用できる
他にもいくつかあるので、上記のマニュアルを参照
今回はNIIF_USER,NIIF_NOSOUND,NIIF_LARGE_ICONが有効になっている。
通知時に音を出したいなら0x00000010を引く。
第十三引数
GUIDを与える。なぜ設定するかはドキュメント読むだけだとわからなかった。
第十四引数
LoadImageWで生成したハンドルを指定する
画像表示を行わない場合、NONEを指定
第五との違いはタスクバーのアイコンか、トーストのアイコンかの違い。
今回はどちらも同じものを設定する。

データを渡す。
▼サンプルコード

Shell_NotifyIconW(0x00000000, notify_data)
Shell_NotifyIconW(0x00000002, notify_data)

第一引数の0は表示、2は通知を汚さないように削除している。

以上でトーストをPythonから利用できる。
きっと他のWindowsAPIにも応用できるはずだ。

最後にトーストを出す便利ソースを紹介する。
GitHub-easyToast
ぜひスターを(ry