Translate

BTemplates.com

Powered by Blogger.

ラベル puppeteer の投稿を表示しています。 すべての投稿を表示
ラベル puppeteer の投稿を表示しています。 すべての投稿を表示

2019年5月3日金曜日

2019-02-27、03-01、05-03 到達点メモ


前に作ったプロジェクトを起動してSyncしたところ以下のエラーが出た。

Error:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

幾つか参考にしたサイトだと、NDKをダウンロードして
足りないファイルを入れよう。という話が出ていたのだが
その肝心のmips64el-linux-androidが無かった。

参考サイト:Android Studio 3.2 でビルドエラー「No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android」が出た時の対処方法
参考サイト:Error:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android


下記のサイトによると、どうもバージョンが上がるとmips64自体が対応されなくなったようである。恐らくなくなってしまった可能性が高い。

参考サイト:"No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android" のコメントより

で、対策に関しては、gradleのバージョンを
 classpath 'com.android.tools.build:gradle:3.3.1'
に上げた後にGradle自体?のバージョンを4.10.1?に上げたところ
エラーが出なくなった。

で、なおしてたらなんか見覚えのあるエラーを見つけた。
Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.11

案の定、以前の日記に同じ現象があった

という訳で前回と同じように以下のように修正した
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"


久しぶりにAdMobを動かしたら、落ちたんだが???
一部のみを抜粋するが、こんなエラー文だった。

02-27 22:12:43.031 28083-28083/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nononagainfo.www.admobtest, PID: 28083
    java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: 
    
    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************
    
    
        at android.app.ActivityThread.installProvider(ActivityThread.java:5921)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5510)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5449)
        at android.app.ActivityThread.-wrap3(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1587)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6184)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
     Caused by: java.lang.IllegalStateException: 
    
    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************
    
    
        at com.google.android.gms.internal.ads.zzze.attachInfo(Unknown Source)
        at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(Unknown Source)
        at android.app.ActivityThread.installProvider(ActivityThread.java:5918)
        ... 10 more

で、対策を簡単に述べると
AndroidManifest.xmlに以下のようにAdMobのIDを追加する必要があるようである。
<manifest>
    <application>
        <!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="[ADMOB_APP_ID]"/>
    </application>
</manifest>

更に言うと、 Google Mobile Ads SDK バージョン 17.0.0 でこの対策をしないと
クラッシュするようである

参考サイト:スタートガイド - AndroidManifest.xml を更新する


ruby

evalは文字列をコードとして実行することができる
例:
puts eval "1+2"


javascript

puppeteerで特定のサイトを開いたらチェックボックスにチェックを入れるといった事をしたかった。
なので、以下のように書いた

const puppeteer = require ('puppeteer');
(async () => {
  const browser = await puppeteer.launch ({
    headless: false,
    defaultViewport: {
      width: 1366,
      height: 728,
    },
  });
  const page = await browser.newPage ();
  var linkAdders = 'https://www.nononagainfo.com/';
  await page.goto (linkAdders, {waitUntil: 'domcontentloaded'});
  await page.click ('#test_test_testID');
  await page.waitFor (100);

  const page2 = await browser.newPage ();
  var linkAdders2 = 'https://play.google.com/store/apps/details?id=com.aaa.nononaga.voicetimerr';
  await page2.goto (linkAdders2, {waitUntil: 'domcontentloaded'});
  await page2.waitFor (100);

  const page3 = await browser.newPage ();
  var linkAdders3 ='https://www.nononagainfo.com/p/blog-page_1.html';
  await page3.goto (linkAdders3, {waitUntil: 'domcontentloaded'});
  await page3.waitFor (100);
}) ();

・ヘッドレスモードとは、CUIのみで処理を行う事。
つまり、普通にGUIとして使いたい(ブラウザを表示したい)場合は、launchメソッドで
headless: falseを入れてあげればよい。
・デフォルトだと表示画面が小さいのでlaunchメソッドでdefaultViewport: {}の値を指定する必要がある
・executablePathで、起動するデフォルトchromeをしているすることができるが
その際の注意として、/(バックスラッシュ)は、一つではなく二つ指定する必要がある。
例:'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
・チェックボックスに関しては、clickメソッドに対象のIDを指定すればチェックボックスにチェックが入る。
・複数のタブを作りたい場合は、browser.newPage ();を新しく作ればよい

参考サイト:Puppeteer で Headless Chromeを操ってE2Eテストする(予定) - 入力・操作編
参考サイト:Puppeteerでスクレイピング

ただ、一つ問題があってキャッシュを保持したかったのだが
(元々の目的から考えるに当たり前なのだが)保持することは出来なかった。

なんか、操作できる良いやつってなんかあったっけ・・・?


気が付いたら、二ヶ月もたってたわ・・・。

RubyのStringのdeleteの仕様について

以下のコードを書くとどういう結果になると思いますか?

puts "chochoc".delete("ch")

理想
ooc

現実
oo

deleteはどうも一文字ずつを削除する仕様の様で
二文字だけを消したい場合はこの書き方ではできない
どう実装するかというとgsubを使う

puts "chochoc".gsub(/ch/,"")

以上。


2019年1月17日木曜日

2019-01-04、07、08 、17 到達点メモ


あけおめ。ことよろ(激遅)

Kotlinの話
やってないと、基本的な操作を度忘れする
.toInt()で型変換ができる

参考サイト:kotlinの型と変換

ミリ秒の計算をしたいときはCalendarクラスを使わずに
dateクラスで計算したほうがいいらしい。
Calendarクラスの生成はコストがかかるとの事
なお、引き算をしたい場合はtime型に直す必要がある

参考サイト:DateのgetTime(公式ドキュメント)
参考サイト:時分秒の加算/減算にCalendarクラスを使うのはもったいない?


・・・というかちょっと待て。
別にdate型に直す必要すらないような・・・。
System.currentTimeMillis()でミリ秒を取得しているから
これを毎回使いまわせばよいのでは???

うん。必要なかった。
メモとして残しておくが
System.currentTimeMillis()はlong型

xxdpi=420dpi

文字の調整をしているのだがマジ面倒くさい!!!
正直、今度作る時があれば、中央から配置を決めていって
相対的に調整したほうがいいかも
後何でもかんでも共通化するのは考え物。
あとで個別に調整入れたときに、新たに作る必要があって面倒くさい!!!

あと、今微妙に困っているのだが、エミュレーターで動かしたら
割と結構文字が小さく見えたので大きくしたところ
Preferenceの文字だけ大きくならなかった。
何でだろうと思ったら、そこだけライブラリで管理していた。
……文字を大きくする方法を調べないと
何でもかんでもライブラリを採用するのは考え物。

めも
AlarmManagerを使う場合の注意点
Androidでアラームアプリを作る
[Android] AlarmManagerをBroadcastRecieverと使う
ALARMMANAGERで指定した時間に処理させる
AlarmManager(公式ドキュメント)

Youtubeの表示はJavaScriptによる表示のようである。
なので一度全部表示してからじゃないと正しく値が取れない。

今、node.jsを使ってクロージングができないかを調べてみる
で、今のところnpmのcrawlerSpookyJSの候補が二つ上がっている
crawlerで試しにyahooの検索ページから情報を取得してみようと思ったが
検索結果が取得できなかった。
おそらく検索結果はJavaScriptの結果を表示している為
データが取れていないと今はそう仮説を立てている。
*知識不足過ぎて何が正しくて間違っているのかよくわからない状態

参考サイト:SpookyJS(GitHub)

ひとまず、SpookyJSの更新日時が4年前くらいにとまっているのが凄く気になるが
どうやらJavaScriptの結果自体を取れるらしい(未検証)

コマンドメモ
npm i phantomjs casperjs spooky

参考サイト:SpookyJSでJavaScript有効状態のページをスクレイピング

というかnpm auditでやるとmoderateが10、highが1それぞれ出てくる(白目)

おかしい・・・。なんで俺は修正作業をしてるんだ・・・?

package.jsonをnpm-check-updatesで一括でやろうと思ったが
なんか指定のバージョンまで上がらないし
これもしかすると手作業で直して
対象のフォルダでnpm updateかけた方がが早い気がする・・・

参考サイト:脆弱性の警告を受けたnpmパッケージの依存関係を力技で直す
参考サイト:npm installしたパッケージの更新確認とアップデート(npm-check-updates)

エラーを出さなくする方法
1.npm auditに従ってそこのフォルダに移動してpackage.jsonのバージョンを修正をする
2.node_modelusに入ったデータを上の方でコピペする
3.package-lock.jsonを消し、npm i --package-lock-onlyで新しく生成する
npm auditを使ってエラーが減ったかを確認する

なお、まともに動くかどうかは知らん!!!

というか大本のPhantomJSの開発が終了しているらしい
参考サイト:PhantomJSの開発が終了しリポジトリがアーカイブ化された

代替としてHeadless ChromeがあるらしいがなんかもうUWSCを引っ張りなおした方がいい気がしてきた・・・。

javascript

取得系は、puppeteerがなんだかんだでようやくできた。

参考サイト:Puppeteerを使ったスクレイピング
参考サイト:Chrome操作ライブラリ chromy と puppeteer を比較
参考サイト:puppeteerでスクレイピング

凄く苦しんだところとして、タグのリンクを取る方法が分からなかった

例えば、h3タグのリンクアドレスを取りたい場合は以下のようにした。
 var h3Document =node.querySelector ('h3 a[href]');
h3Document.getAttribute ('href');
これでアドレスを取ることができる。

また、ちゃんとページ遷移を待ちたい場合は以下のように書けばよい
await page.goto (linkAdders, {waitUntil: 'domcontentloaded'});

単純にWaitをかけたい場合は以下のようにすればよい
await page.waitFor (1500);

参考サイト:puppeteerでよく使うであろう処理の書き方

awitとか使っている場合は
forEachより、for..inとかfor..ofの方がよい
forEachは関数内に処理を書くので
非同期系の処理だとエラーになる

参考サイト:for..in  by Mozilla Contributors is licensed under CC-BY-SA 2.5.
参考サイト:for...of   by Mozilla Contributors is licensed under CC-BY-SA 2.5.

関数内で関数を呼び出す方法が分からん。

あ、そういえば、Sourcetreeを立ち上げていると何度もログインを求めてくる現象について調べないとあかん。


GithubでPrivateレポジトリが使えるようになったと聞いたので
実際に使ってみた。
今のところは特に変わらない感じ。
ウミガメのスープの問題をどうやって管理しようかと悩んでいたところだったので
とてもちょうどよい。
GitGUIとか使ってみたのだが
正直、コマンド打った方が早いし確実
文字化けの対策については、.gitフォルダがある場所でマウスを右クリックをして
Git Bushを出させる。
それをクリックして起動した後に、以下のコマンドを入力する
git config --global gui.encoding utf-8

GitGUIを立ち上げなおすと文字化けが治るはず

参考サイト:Git for Windows の Git GUIで文字化けする場合
参考サイト:Git for Windows で日本語を使いたい

なお、Wordファイルだとどれくらい変化したかが分からないので
基本的にMarkDownでやることにあった。

今のところは、エディタに関してはVisual Studio Codeという凄く便利なエディターがあるので基本をそれを使っている。
というか割と真面目にEmEditorと要らんかもしれん・・・。

メモとして参考になりそうなのを張っておく
脱GitHub初心者を目指す人のREADMEマークダウン使いこなし術
Markdown記法一覧