App Engineerの開発ダイアリー

Flutterや開発活動に役立つツール作りなど

Android Studio で git を使う ~ある時点のバージョンに戻す~

f:id:Simoroid:20210527011101p:plain
Androidアプリ開発で障害調査や開発が上手くいかず、ソースコードを一旦Gitのあるバージョンに戻したい。
そう思った時のAndroid Studioでの操作方法の紹介です。

◇手順

1.対象ファイル右クリック→Git->show history
f:id:Simoroid:20210527011424p:plain
2. Historyタブで戻したいコミットの行を右クリック→Show in Git Log
⇒Logタブが表示される
f:id:Simoroid:20210527011521p:plain
3. Logタブで戻したいコミットの行を右クリック→Checkout Revision
f:id:Simoroid:20210527011707p:plain

上記手順で指定したリビジョンにソースコードの状態を戻すことができます。

ここまで 読んで頂きありがとうございました。
よければフォローお願いします!

【Python】はてなブログの注目記事の一覧を抽出する

f:id:Simoroid:20210510013203p:plain
はてなブログの注目記事の一覧をスクレイピングするプログラムをPythonで実装してみます。
f:id:Simoroid:20210510013544p:plain
Pythonスクレイピングするための環境準備は下記に記載しています。
ikoda.shop

◇処理の流れは
1.はてなブログのトップページへのリンクを変数定義
2.ヘッドレスブラウザ(GUI表示無しのブラウザ)にページを読み込む
3.「注目」の領域をクラス名で検索し、html形式の情報を取得
4.複数存在するh3タグを全て取得することですべての注目記事のタイトルとリンクを取得
5.ブラウザオブジェクトの後始末

#!/usr/bin/env python3

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import selenium
from bs4 import BeautifulSoup

# はてなブログのトップページへのリンクを変数定義
TARGET_URL = "https://hatenablog.com/"

# ヘッドレスブラウザ(GUI表示無しのブラウザ)にページを読み込む
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)
browser.get(TARGET_URL)

# 「注目」の領域をクラス名で検索し、html形式の情報を取得
html = browser.execute_script("return document.getElementsByClassName('serviceTop-recommend')[0].outerHTML")
soup = BeautifulSoup(html,"html.parser")

# 複数存在するh3タグを全て取得することですべての注目記事のタイトルとリンクを取得
article_list = soup.find_all("h3")
for article in article_list :
     print(article.a.get_text() + ":" + article.a["href"])

# ブラウザオブジェクトの後始末
browser.quit()

下記のように記事のタイトルとリンクが一覧で抽出できました!
f:id:Simoroid:20210508093404p:plain

よんで頂きありがとうございます。
良ければフォローお願いします!

【Python】Webページの情報抽出するためにスクレイピングする

f:id:Simoroid:20210508094731p:plain
スクレイピングとはWebページに対して、DOM形式の情報を取得し、
ある特定の文字列をのみを抜き出したり、画像だけをダウンロードしたり、
情報の解析を行うことです。
今回はPythonでの実装方法に関してご紹介します!

なお、スクレイピングの過剰利用はアクセス先のサイトに対しての迷惑となったり違法となるケースがあるので気を付けてください。
https://topcourt-law.com/internet_security/scraping-illegal#i-10
https://qiita.com/n_oshiumi/items/b4efd1f40ec0a1b77376

◇ドライバーのダウンロード
chromeを開いてurlに「chrome://version/」を入力し、ブラウザバージョンの確認。
f:id:Simoroid:20210510011948p:plain
ドライバーをダウンロード、確認したブラウザバージョンと照合してサポートされているものを選択します。
https://sites.google.com/a/chromium.org/chromedriver/downloads
f:id:Simoroid:20210510012019p:plain

ダウンロードしたドライバー(chromedriver.exe)はpyファイルと同じフォルダに格納、
もしくは環境変数のPATHにドライバーのパスを定義しておくのでも良い。

スクレイピングに向けてのライブラリをインストールしておく。

pip install selenium
pip install beautifulsoup4

anacondaを使用している場合は

conda install selenium
conda install beautifulsoup4

◇とりあえずスクレイピングしてみる。
googleの検索ページからgoogleロゴを取ってきてみる。
下記のような処理順で実装します。
①ローカルに保存ディレクトリを準備
②imgタグを検索し、該当したhtml形式の情報を取得
③imgタグのsrc属性にアクセスすることで画像へのパスを取得
④スライスでファイル名を取得
⑤ローカルへ転送

#!/usr/bin/env python3

import os

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import selenium
import urllib.request as req
from bs4 import BeautifulSoup

TARGET_URL = "https://www.google.com/"

# ローカルに保存ディレクトリを準備
result_dir = './save' 
if not os.path.exists(result_dir):
    os.mkdir(result_dir)

options = Options()
options.add_argument('--headless')
article_browser = webdriver.Chrome(chrome_options=options)
article_browser.get(TARGET_URL)

# imgタグを検索し、該当したhtml形式の情報を取得
html = article_browser.execute_script("return document.getElementsByTagName('img')[0].outerHTML")
soup = BeautifulSoup(html,"html.parser")

# imgタグのsrc属性にアクセスすることで画像へのパスを取得
img = soup.find("img")["src"]

# スライスでファイル名を取得
filename = img[img.rfind("/"):]

# ローカルへ転送
req.urlretrieve((TARGET_URL + soup.find("img")["src"]),result_dir + '/' +filename)

article_browser.quit()

下記のように撮れました!
f:id:Simoroid:20210508090123p:plain

よんで頂きありがとうございます。
良ければフォローお願いします!

Windowsのタスクスケジューラが起動しない

下記に良くまとめられていたがそれでも起動しない。。
https://aprico-media.com/posts/4649

私の場合、原因はトリガーでした。
こちらの仕様は書いたままですが、ある時間から○○の間隔で実行するというものなので、
そもそも起動していない状態だと繰り返し実行以前の問題となっていた。

f:id:Simoroid:20210427172641j:plain

ということで開始時刻を兎に角早く実行したかったので現在より未来の時刻に切り替えて保存することで、起動に成功しました。

◇切り替え手順
1.タスクをダブルクリック
⇒タスクのプロパティウィンドウが開く
2.トリガータブを開き対象のトリガーをダブルクリック
⇒トリガーの編集ウィンドウが開く
3.「開始」のテキストボックスに任意の現在より未来の時刻を設定
⇒OKボタンで設定完了🐣

f:id:Simoroid:20210427172637j:plain

 

【Flutter】チップを使って3パターンのアクションを実装する

f:id:Simoroid:20210419234809p:plain

Flutterアプリのチップはリストのフィルタリングやプロフィールの画面などで
ボタンとは違ったデザインでスペースを取らないUIとして便利かと思います。
更にチップに何かしらの処理を実行したい場合もあるかと思います。
今回は3パターンのアクションを実装しました。

 

◇動作イメージ

f:id:Simoroid:20210419013302g:plain


1.チップが押されたら画面遷移する

InputChipを使用して、チップがタップされたら画面遷移を行うようにします。

2.チップが押されたら画面内の処理を行う

InputChipを使用して、チップがタップされたときの処理を実装します。

3.チップのアイコン部分が押されたら画面内の処理を行う

ContainerにTextとIconを組み込み、チップの見た目を模倣します。
アイコン部分のイベントリスナーを実装します。

 

gist0399ce8a237145f1aff75ae931d66acf

この記事がお役に立てていたらうれしいです。

【Flutter】ボトムナビゲーションバーの選択を親のWidgetで検知する

f:id:Simoroid:20210414004927p:plain


画面下部に表示するナビゲーションバーとメインのコンテンツに当たるWidget
ソースを分けたい場合の実装方法となります。

ナビゲーションバーに対してアイコンをタップするなどの操作した結果を親となるWidgetが受け取る仕組みになっています。

◇親となるメインウィジェット

◇参照するナビゲーションバーウィジェット
アイコンのタップを検知して親ウィジェットのイベントを走らせます。
イベントの引数にインデックスを渡すことで、どのアイコンがタップされたかを識別できるようにします。
bottom_navi_bar.dart

◇完成形イメージ
こんな感じになります。

f:id:Simoroid:20210401123914g:plain


この記事がお役に立てていたらうれしいです。

Android端末のキャプチャ撮ってgif変換を自動化する

モバイルアプリの開発ブログを書いているとキャプチャでイメージを伝えたいということが
良くあるのですが※例えば下記のように
f:id:Simoroid:20210401123914g:plain:w120
それらをわざわざ「端末でキャプチャを取って、それをダウンロードしてきて~」
という作業が面倒になったのでbatファイルで自動化しました。

◇前提条件(使用モジュール)
前提条件として下記2つが必要になってきます。

画像加工系の機能を色々と提供してくれるimagemagickというソフトをインストールします。
※インストール時の注意なのですが下記の赤線枠のチェックを入れなければ今回欲しい機能がインストールされません。。
http://www.imagemagick.org/script/download.php#windows
f:id:Simoroid:20210326163738p:plain:w360

  • adbコマンド

android端末にアクセスするためのコマンドになります。
インストールされていない方は下記のようなから取得できます。
https://tech.la-fra.com/2018/07/29/post-204/

◇batファイル
2つのバッチファイルを作ります。

screencap.bat
こちらは単純に今現在PCに接続されたAndroid端末に画面のキャプチャを
今回用の命名規則に従って撮影していきます。

@echo off

rem スペースを0に置換
set time_tmp=%time: =0%

rem スラッシュを置換で削除
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%

adb shell screencap -p /sdcard/screen_%now%.png

pause

pullAndMakeGif.bat
命名規則に従って撮影されたキャプチャをPCに転送しgifに変換します。
最後にPCに転送した画像はAndroid端末側からは削除しておきます。

@echo off
set oput=

adb shell ls /sdcard/screen* >%CD%\usrlst.txt
FOR /F %%i in (usrlst.txt) DO adb pull %%i %CD%

:end
del %CD%\usrlst.txt
set oput=

REM 最後に全部消す
adb shell rm -rf /sdcard/screen* 

REM gif作成
convert -delay 30 -loop 0 screen_*.png movie.gif

pause

任意のフォルダにbatファイルに格納したらscreencap.bat⇒pullAndMakeGif.batの順番で実行するのみです。
f:id:Simoroid:20210401123025p:plain
この記事がお役に立てていたらうれしいです。