twitter分析アプリ②
バッチ処理をするにはrakeタスクってのを使うみたいだ。
rakeタスクってのは、いままでおまじない的に使っていた
$ be rake db:migrate
※ alias be='bundle exec'
とかで呼び出されるタスクのことらしい。
作り方は簡単。
$ be rails g task task_sample
これで生成されたファイルlib/tasks/task_sample.rake
namespace :task_sample do end
を、次のように書き換えてみる。
namespace :task_sample do desc "実行処理の説明" task :sample do puts "Hello World" end end
これで、呼び出すときはコンソールから
$ be rake task_sample:sample Hello World
→OK。Hello Worldが表示されました。
コロンの前が、rakeファイルの名前で、
コロンの後が、taskの名前ということか!
今までの
$ be rake db:migrate
も、dbというrakeファイルの、migrateというtaskを実行していたに過ぎなかったのか〜!
これは学び。
ちなみにrakeタスク一覧はこれで見られると。
be rake -vT rake about # List versions of all Rails frameworks and the environment rake active_storage:install # Copy over the migration needed to the application rake active_storage:install:migrations # Copy migrations from active_storage to application rake app:template # Applies the template supplied by LOCATION=(/path/to/template) or URL rake app:update # Update configs and some other initially generated files (or use just update:configs ... rake assets:clean[keep] # Remove old compiled assets rake assets:clobber # Remove compiled assets rake assets:environment # Load asset compile environment rake assets:precompile # Compile all the assets named in config.assets.precompile rake cache_digests:dependencies # Lookup first-level dependencies for TEMPLATE (like messages/show or comments/_commen... rake cache_digests:nested_dependencies # Lookup nested dependencies for TEMPLATE (like messages/show or comments/_comment.html) rake db:create # Creates the database from DATABASE_URL or config/database.yml for the current RAILS_... rake db:drop # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_EN... rake db:environment:set # Set the environment value for the database rake db:fixtures:load # Loads fixtures into the current environment's database rake db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog) rake db:migrate:status # Display status of migrations rake db:rollback # Rolls the schema back to the previous version (specify steps w/ STEP=n) rake db:schema:cache:clear # Clears a db/schema_cache.yml file rake db:schema:cache:dump # Creates a db/schema_cache.yml file rake db:schema:dump # Creates a db/schema.rb file that is portable against any DB supported by Active Record rake db:schema:load # Loads a schema.rb file into the database rake db:seed # Loads the seed data from db/seeds.rb rake db:setup # Creates the database, loads the schema, and initializes with the seed data (use db:r... rake db:structure:dump # Dumps the database structure to db/structure.sql rake db:structure:load # Recreates the databases from the structure.sql file rake db:version # Retrieves the current schema version number rake dev:cache # Toggle development mode caching on/off rake initializers # Print out all defined initializers in the order they are invoked by Rails rake log:clear # Truncates all/specified *.log files in log/ to zero bytes (specify which logs with L... rake middleware # Prints out your Rack middleware stack rake notes # Enumerate all annotations (use notes:optimize, :fixme, :todo for focus) rake notes:custom # Enumerate a custom annotation, specify with ANNOTATION=CUSTOM rake restart # Restart app by touching tmp/restart.txt rake routes # Print out all defined routes in match order, with names rake secret # Generate a cryptographically secure secret key (this is typically used to generate a... rake stats # Report code statistics (KLOCs, etc) from the application or engine rake task_sample:sample # 実行処理の説明 rake test # Runs all tests in test folder except system ones rake test:db # Run tests quickly, but also reset db rake test:system # Run system tests only rake time:zones[country_or_offset] # List all time zones, list by two-letter country code (`rails time:zones[US]`), or li... rake tmp:clear # Clear cache, socket and screenshot files from tmp/ (narrow w/ tmp:cache:clear, tmp:s... rake tmp:create # Creates tmp directories for cache, sockets, and pids rake yarn:install # Install all JavaScript dependencies as specified via Yarn
確かにdb:migrate
とかありますね。
db:migrateのタスクの中身見てみようとしたけど、パット見ファイルの場所が見つからなかったので、またの機会にします。
wheneverを使用
whenever Gemfileに
gem 'whenever', require: false
を追加して、
$ bundle install $ be wheneverize . [add] writing `./config/schedule.rb' [done] wheneverized!
config/schedule.rb
を開いて
set :output, "log/development.log" every 1.minute do rake "task_sample:sample" end
と書いて、cronを登録する
# 登録します $ bundle exec whenever --update-crontab #これで確認できます $ be whenever * * * * * /bin/bash -l -c 'cd /Users/my0shym/hogeApp && RAILS_ENV=production bundle exec rake task_sample:sample --silent >> log/development.log 2>&1'
$ be rails s
しておいて、別タブで$ tail -f log/development.log
で確認する。
すると、見事Hello Worldが表示されました〜パチパチ
rakeタスクからDBとかにアクセスしたいときは
task :hoge => :environment do
が必要らしい。
と、ここでコロンとアローの使い方がうまく整理でいていないことが発覚したので、今度やる。
twitter分析アプリ作成①
railsにて実装。
グラフの描画はchart.jsを使用。
とりあえずモデル作成
※alias be='bundle exec'
$ be rails g model Person name:text twitter:text university_name:text entry_no:integer grade:integer age:integer $ be rails g model Follower num_of_follower:integer date:datetime person:references $ be rails g model Follow num_of_follow:integer date:datetime person:references $ be rails g model Tweet num_of_tweet:integer date:datetime person:references
twitterのAPI
require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = "YOUR_CONSUMER_KEY" config.consumer_secret = "YOUR_CONSUMER_SECRET" config.access_token = "YOUR_ACCESS_TOKEN" config.access_token_secret = "YOUR_ACCESS_SECRET" end user = client.user('@hogehogetarou') followers = user.followers_count followers = user.friends_count tweets = user.tweets_count
やっぱりDB設計変えたので、こちらは削除する
$ be rails destory model follow $ be rails destroy model follow $ be rails destroy model follower $ be rails destroy model tweet
$ be rails g model Status followers:integer followings:integer tweets:integer favs:integer date:datetime person:references # dbがゴチャついたと思うので、リセット # これはレコードのリセット $ be rake db:reset # これはmigrationを全部最初からやり直す。 $ be rake db:migrate:reset
$ be rails g controller management show new edit
React奮闘記①
メロスと同じくReactがわからぬ。
チュートリアルと、ドットインストールは写経してみたものの、雰囲気しかわからなかった。。。
バスケットをやっているのをルール知らないで外から見ていて、「どうやらあのかごをボールが通ると点数が入るらしい」「なんか移動するときはぼーるをばうんどさせなきゃいけないらしい」くらいにしかつかめなかった。
そもそものJavaScriptが怪しかったので、progateで一通りサクッと復習しといた。
からの、
- 作者: 吉田裕美
- 出版社/メーカー: 秀和システム
- 発売日: 2017/09/16
- メディア: 単行本
- この商品を含むブログ (1件) を見る
これだ。
環境構築する。
Mac High Sierra 10.13.5
一応もう環境はできているはずだが、改めて。
Node.jsのinstall
$ node -v v10.5.0
→OK。すでにあった。
npmのinstall
$ npm -v 6.1.0
→OK。すでにあった。
init
# 作業用ディレクトリにて $ npm init -y
npmパッケージinstall
npm install react react-dom npm install webpack webpack-cli webpack-dev-server --save-dev npm install babel-cli babel-loader babel-preset-env babel-preset-react --save-dev npm install eslint eslint-loader eslint-plugin-react --save-dev npm install css-loader style-loader babel-loader --save-dev
あとは別途設定ファイルを設定。 詳しくは
react_book/install_mac.md at master · yuumi3/react_book · GitHub
より。
webpackとは、、、JavaScript、cssとかのライブラリ、自分で書いたやつをまとめて一つのJSファイルにしてくれるやつ…!!? . . . 2,3時間かけて、
ようやくJSXの基本的なことはわかったような気がする。
コンポーネント - クラスコンポーネントと - 関数コンポーネントがある。
関数コンポーネントはあまり複雑なことはやらせない。
tigでvimじゃなく謎エディタnanoが開いてしまう現象解消
友人に進められシェルを魔改造zshにしたのが原因でtig(やってないけどgit commitコマンドも)のコミットメッセージ編集のところがmac標準搭載らしい謎エディタnanoになってしまっていた。
うまく保存できずにキャッシュファイル的なやつができてaddとかができなくなったりしてしまって面倒くさいので修正。
これを解消するには
git config --global core.editor 'vim -c "set fenc=utf-8"'
これだけ。
macのvagrantでcentos7.2にansible2をinstallしてplay-book実行するまで
Vagrant メモ (1) – 1Q77 Vagrant メモ (2) – 1Q77
これにしたがってvirtualbox,vagrantをインストールしました。
VirtualBoxとVagrantはすでに設定済とします。
VagrantでCentOS7.2を使う。
こちらからほしいOSを探してリンクをコピーします
今回はなんとなくCentOS7.2を使ってみようと思うので、それを探します。・
$ vagrant box add centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box $ vagrant init CentOS7.2 # 適当なディレクトリで実行する $ vagrant up # 起動する $ vagrant ssh # 接続する
これでCentOSサーバに入れました。
参考: VagrantでCentOS7をインストール - Qiita
一方こんなやり方でもいいみたいです。
$ vagrant init --minimal ubuntu/trusty64 # minimalオプションを付けると設定ファイルが最低限のものだけになる。 $ vagrant up $ vagrant ssh
参考: VagrantとDockerについて名前しか知らなかったので試した - Qiita
一度取得したOSは追加のプロセスを経ないで立ち上げることができるっぽいですね。
ただ、どちらの方法でも、すでにboxがローカルになければ、セットアップに数十分くらいかかります。(ました。)
直接urlを指定してboxを追加するのは、CentOSでいうrmp、
名前を指定してboxを(追加した後)iした後するのは、yumで管理する的なことだと勝手に思ってます。
その一覧はどうやって見られるのでしょうか。
$ vagrant box list centos6 (virtualbox, 0) centos7.2 (virtualbox, 0)
ではこのOSたちはどこに保存されているのでしょうか。
標準では/Users/<user>/.vagrant.d/boxes
の下に配置されるようです。
$ pwd /Users/<user>/.vagrant.d/boxes $ tree -s . ├── [ 96] centos6 │ └── [ 96] 0 │ └── [ 192] virtualbox │ ├── [ 258] Vagrantfile │ ├── [ 11372] box.ovf │ ├── [ 26] metadata.json │ └── [ 423996416] packer-centos-6.5-x86_64-disk1.vmdk └── [ 96] centos7.2 └── [ 96] 0 └── [ 192] virtualbox ├── [ 258] Vagrantfile ├── [ 12065] box.ovf ├── [ 650415104] centos-vm-disk1.vmdk └── [ 26] metadata.json
確かにCentOSと思しき容量大きいファイルが存在しました。これらしいですね。
さて、今からansibleを使って一方のサーバーからもう一方のサーバーに処理を流したいので、sshで接続する必要があります。
IPアドレスはどうなっているのでしょうか。
デフォルトではプライベートIPの設定はできていないみたいなので、Vagrantfileを弄る必要があります。
# 以下のように設定 config.vm.network :private_network, ip: "192.168.33.10"
編集後、vagrantを再起動します。
$ vagrant reload
で再起動します。
同様にして同じ構成のサーバーをansibledというディレクトリの中に作ります。
ただしプライベートIPアドレスは192.168.33.11としておきます。
CentOSにansibleをinstallする
ansible用サーバーにて
# yum install epel-release # epelレポジトリを追加 # yum install ansible --enablerepo=epel-testing # ansibleをinstall # ansible --version # versionを確認 ansible 2.4.2.0
enablerepo=epel-testingにしないと、古いversionのansibleがinstallされてしまうということがあるみたいです。(検証してないですが、)
ansibleで構成管理をする
早速ansibleで変更を流してみましょう。
まずは疎通確認から。
ansible 192.168.33.11 -m ping [WARNING]: Could not match supplied host pattern, ignoring: all [WARNING]: provided hosts list is empty, only localhost is available [WARNING]: Could not match supplied host pattern, ignoring: 192.168.33.11 [WARNING]: No hosts matched, nothing to do
おっとこれは早漏でした。
受ける側の設定を何もしていなかったです。
いくら同じネットワーク内だからといって、無許可で流されたらたまったもんじゃないですね。
結局sshで接続することになるので、sshのconfigあたりを設定変更すればいけそうですね。
と思ったら、その前にansible側でもhostの情報を書かないとだめらしいです。
$ vi /etc/ansible/hosts
ここにホスト情報を追加します。
さて今一度疎通確認をしてみる。(受け側の設定何も変えてないのでだめだと思うが。)
# ansible 192.168.33.11 -m ping The authenticity of host '192.168.33.11 (192.168.33.11)' can't be established. ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64. Are you sure you want to continue connecting (yes/no)? yes 192.168.33.11 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added '192.168.33.11' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", "unreachable": true }
案の定だめでした。認証の部分で失敗しましたね。
認証方法は色々ありますが、今回はansible側の公開鍵を受け側に登録しておくことにします。
ansibleサーバにて
# vagrantユーザーで実行する $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): # 特に何も入力しないでEnterする Enter passphrase (empty for no passphrase): # 特に何も入力しないでEnterする Enter same passphrase again: # 特に何も入力しないでEnterする Your identification has been saved in /home/vagrant/.ssh/id_rsa. Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub. The key fingerprint is: 6f:9d:ed:39:06:75:70:9b:ff:c0:71:51:ff:00:8a:dc vagrant@localhost.localdomain The key's randomart image is: +--[ RSA 2048]----+ | . o| | . o . ...o| | o E .o=| | o++| | S o +o| | . ..oo .| | o o....| | . .o..| | .o. | +-----------------+ $ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsUSJIsKgxiOiFxh2obSw0RCOmODtyyFS60qr1/phQa35sDJwjcoy1kpBdLvIFeQZiWVmKU+vuz1lNjWekKvSOPmxmW54LAJSnqBpy4JgIXzRrm7kEEi0Ol9rkSG3LShtC89CXqOm+PVgXXXXXXXXXXXXXXXXXXXXXXXXXX0Hj+wBTUYrcvQZ7RDAYA1FQeav0Hj+wBTXXXXXXXXXXXXXXXXXXXXXXXXDAYA1FQeav0HnL1CAnseZtBdxXewh/0A9MU9kygj5G3E1j0ZG0q6l9Pt vagrant@localhost.localdomain # これをコピっとく
受けサーバ側
$ vi ~/.ssh/authorized_keys # 先程コピーした公開鍵を追加する
これにて完了です。
それでは満を持して疎通確認。
$ ansible 192.168.33.11 -m ping 192.168.33.11 | SUCCESS => { "changed": false, "ping": "pong" }
OKなようです。
ということは、普通にssh接続もできるということですね。
$ ssh -i ~/.ssh/id_rsa vagrant@192.168.33.11 The authenticity of host '192.168.33.11 (192.168.33.11)' can't be established. ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.33.11' (ECDSA) to the list of known hosts. Last login: Fri Jan 5 19:42:58 2018 from 10.0.2.2
入れました。
さてここからがansibleの出番です。
ansibleのplaybookを作成してみます。
slコマンドをyumでinstallするだけのplaybookとします。
yum.yml
- hosts: all tasks: - name: slコマンドのyumインストール yum: name=sl
$ ansible-playbook yum.yml PLAY [all] ****************************************************************************************** TASK [Gathering Facts] ****************************************************************************** ok: [192.168.33.11] TASK [slコマンドのyumインストール] ***************************************************************************** fatal: [192.168.33.11]: FAILED! => {"changed": false, "msg": "You need to be root to perform this command.\n", "rc": 1, "results": ["Loaded plugins: fastestmirror\n"]} to retry, use: --limit @/home/vagrant/yum.retry PLAY RECAP ****************************************************************************************** 192.168.33.11 : ok=1 changed=0 unreachable=0 failed=1
おっと、yumはrootじゃないと使えないみたいです。
sudo: yes
を書き加えるだけでいいみたいです。
- hosts: all sudo: yes tasks: - name: slコマンドのyumインストール yum: name=sl
さて、いざ実行
$ ansible-playbook yum.yml [DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature will be removed in version 2.6. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. PLAY [all] ****************************************************************************************** TASK [Gathering Facts] ****************************************************************************** ok: [192.168.33.11] TASK [slコマンドのyumインストール] ***************************************************************************** changed: [192.168.33.11] PLAY RECAP ****************************************************************************************** 192.168.33.11 : ok=2 changed=1 unreachable=0 failed=0
OKっぽいですね。
実際に受け側のサーバーで確認してみます。
(@@) ( ) (@) ( ) @@ () @ O @ O @ ( ) (@@@@) ( ) (@@@) ==== ________ ___________ _| |_______/ \__I_I_____===__|_________| _)--- | H\________/ | | =|___ ___| _________________ | | H | | | | ||_| |_|| _| \_____A | | H |__--------------------| [___] | =| | _______|___H__/__|_____/[][]~\_______| | -| | | |-----------I_____I [][] [] D |=======|____|________________________|_ | o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__|__________________________|_ |___|= || || || |_____/~\___/ |_D__D__D_| |_D__D__D_| \O=====O=====O=====O_/ \_/ \_/ \_/ \_/ \_/
ちゃんとシュポってますね。
ということで、一旦ansible導入は一区切りつけたいと思います。
次回はplaybookのroleとかの使い分けを整理していきたいです。
macでインカメをコマンドラインから使用する方法を探したい①
Macのカメラからjpg画像を定期的に取得してローカルなりなんなりに保存したい。
検索する
「mac カメラ 定期的に」
ぱっと見
コマンドライン
Mac OSX で web カメラ撮影をコマンドラインで行う方法のメモ|毎日の向こうに
このサイトで、以下のツールが紹介されている。
isightcapture for Mac : Free Download : MacUpdate
しかしまあ、OSのバージョン10.3の時代かぁ。。。レオパードだと。
記事を見てみると、2005年だしなぁ。
しかもなんか怪しいとも言えなくもない。
毎度のことなのだが、こういうソフトの怪しい怪しくない、大丈夫なのかだめなのかの見極め方がつかめていないマン。
でも31,455もダウンロードされている。これは信じていいのか。
シェルスクリプト
Macで自動で定期的にスクリーンショットを撮るシェルスクリプト - yumulog | 社会人博士の日記
細かく見てないけど、できそうだということだけ認識しておく。
↓
これはカメラじゃなくて、スクリーンショットだった。
Automater
http://apple.memoblog.net/205/
これ普通に簡単そう。
記事もあまり読まずに、直感でAutomater触ってみることに。
↓
Automaterの闇にハマった。
よくわからない。
photoboothの位置付がわからなくなってきた。
Automaterはフォルダアクションとかには便利っぽいけど、特定のアプリの特定の動きみたいな小難しいことは面倒くさいっぽい。
もうシェルスクリプトで書いてみちゃったほうがいい気がする。
調査に時間をかけすぎている。
↓
それもなかなか情報がない。
そもそもphotoboothなんて使っているやつはこの世界にはいない。
↓
そもそもの方針が間違っているような気がしてきた。
「カメラ mac 自動」
再検索。
微妙に違う。
「インカメラ mac 自動」
これもあまりいい情報がない。
やはり一番最初のコマンドラインツールを使ったほうがいいのではないか。
ダウンロードページへ
↓
おいおい、ちょっと待てなんか登録しないとだめなのか?
↓
しゃあなし「isightcapture」でググってみる。
GitHub - RandyMcMillan/iSightCapture
↓
それっぽいのダウンロードできそうなページがあったが、これは流石にきな臭すぎる。
[ttp://download.cnet.com/isightcapture/3000-2150_4-72546.html]
↓
vgyazo: gyazoとisightcapture組み合わせてみた - はてなの鴨澤
求めていたものとは違うが有益っぽい情報出てきた。
そうか、Macのカメラのことをhttp://d.hatena.ne.jp/kamosawa/20091222/1261473923
isightcapture(http://www.intergalactic.de/pages/iSight.html)ってのは、Macに付属しまくってるiSightってカメラで写真を1枚撮ってセーブする、というだけのコマンドラインツール。
残念ながらurlは無効だった。
デフォルトで使えるコマンドってわけではなさそうだった。
それっぽいのがあるかなと検索してみる。
「isightcapture mac」
GitHub - RandyMcMillan/iSightCapture
これクローンしたらいいのかなーと思って読んでみると、これは動画からキャプチャするやつってことか...?
isight
Macのコマンドラインツールということで、「brew isightcapture」で検索
↓
isight からコマンドラインで画像をとりこむには imagesnap - tokuhirom's blog
ありがた過ぎる情報出現!
$ brew install imagesnap
これにて解決できそうです!
$ imagesnap Capturing image from device "<AVCaptureDALDevice: 0x9fc4daf24440 [FaceTime HD Camera][0x1410000005ac8908]>"...
さてはて、保存先はどこなのだろうか。
「"imagesnap" 保存先」
調べによると、/usr/local/bin/imagesnapと同じフォルダにsnapshot.jpgという名前のファイルができるとな。
できないとな。
永遠にできなかったので調べてみると
Does not work on High Sierra · Issue #16 · rharder/imagesnap · GitHub
やはりHigh Sierraでは保存されないとのissueが上がっている。
OSとXcodeを再インストールしたらできたと言ってる人がいたが、OS再インストールは辛い。
自分もissue投げてみるか。。。
結局解決できず、諦めることに。。。
macOSのアプリを作ってみるかな・・・
頓挫しました。 このissueが解決されるまで待ちます。