HACK SCORE

# 現役エンジニアの出力コンソール

【超軽量】Red HatからJavaフレームワーク「QUARKUS」がリリースされた

QUARKUS
QUARKUS
Red Hatから、新しくJavaフレームワーク「QUARKUS」が公開されました。

既存のJavaライブラリにも対応しているフルスタックのフレームワークです。

「QUARKUS」とは

特徴としては、

  • 従来からの伝統的な「インペラティブモデル
  • 最近注目されている「リアクティブモデル

この両モデルを可能とするフレームワーク

簡単に言うと、

  • 今までの伝統的でスタンダードな開発モデル「命令型」も扱える
  • 先進的で今流行りの開発モデル「反応型」も使える

中でも、最大の特徴が

Javaアプリなのに超軽量なコンテナイメージにできる

という点です。

GraalVMのコンパイラを用いて、アプリをコンテナ化できる

  • Oracleオープンソースでリリースしている多言語対応のVMGraalVM」のコンパイラを用いてネイティブバイナリを生成
  • 生成したバイナリをコンテナ形式にすることも可能

つまり、

Javaアプリが瞬時に起動するコンテナイメージを作れちゃう

といった特徴もあり、DockerやKubernetesのようなコンテナ環境を扱うDevOps界隈では、

まさに待ちわびていたようなフレームワークということで非常に注目されています。

超軽量なJavaアプリをKubernetesの世界へ

これまでJavaアプリケーションは、JavaVM自体の立ち上げに時間がかかるということもあり、

リソース消費量の少ない軽量なアプリケーションを必要とするDocker×Kubernetesのような開発モデルにおいて、

「コンテナ環境の良さを十分に活用できない」という大きな課題がありました。

QUARKUSのようなフレームワークは、Javaアプリで分散コンピューティングを実現する上で障壁となっている「起動時間」という課題を解決する糸口となるでしょう。

所感

今回リリースされたQUARKUSは、今後のKubernetesやサーバレス環境において、

Javaを先進的なプラットフォームにしていく流れの中心になっていくでしょうね。

※QUARKUSの導入手順やGraalVMのインストール手順などは、別の記事にまとめたいと思います。

参考

QUARKUSの公式サイトのデザイン個人的に好きです。

詳しい導入手順などは公式ドキュメントなどを参考にしてみてください。

おしゃれで使いやすいテキストエディタAtomがやばい

最近ちょっとメモを取るときでも Markdown記法で書くことが増えたので、いいエディタないかなと探してました。

VSCodeとかもいいんですが、

  • コード開いてる
  • ごちゃごちゃさせたくない

っていう理由で別のソフトウェアとして開きたいなと。

(タスクバーにピン留めして、Windows + 数字キーで起動する人なので)

ブラウザ版だとHackMDあたりがいいんですが

どうしても自分はファイルとして残しておきたいので

今回は見た目もおしゃれで初期設定が楽そうなAtomを使うことにした。

Atomってなに

Atom画面スクショ 追加パッケージなどいろいろ追加すれば、 自分好みにカスタマイズできるテキストディタ

Atomの導入方法

公式サイトからクライアントをダウンロードしてインストールするだけ

おすすめポイント

個人的には 初期設定のダークテーマが真っ黒過ぎず、 黒板に白い文字で書く感じで好き(VSCodeも好き)

エクスプローラもついてて、いろいろと便利 たぶんこれ使うとさくらエディタとか戻れなくなる

よく使うショートカット

  • markdownプレビューを表示:Ctrl + Shift + M
  • コマンドパレット?を表示:Ctrl + Shift + P
  • 文字サイズを大きく:Ctrl + Shift + ;
  • 文字サイズを小さく:Ctrl + -

とりあえず有効化・無効化しておくべき設定

  • 自動折返し

Ctrl + Shift + P

Editor: Toggle Soft Wrapを選択して、Enter

  • スペルチェックを無効化

Ctrl + Shift + P

spell-checkをDisableを選択

※英語のスペルチェックも無効化するので注意

最初にインストールするパッケージ

  • 日本語化

Ctrl + Shift + P

Instalと入力

Settings View: Install Packages and Themesを選択。

総評

総合的に記事を書いたり、 メモをがっつりプレビュー見ながらmd記法で書きたいならいい感じ

使い始めたばかりなので、必要なプラグイン吟味したら 一括でインストールできるようにシェルスクリプトにしておきたい

【Python】scheduleライブラリで定期実行を実装してみよう

通常スクリプトは、最後の処理を実行したら終了してしまいますが

今回は1時間おき、または指定した時刻に定期的に実行することができる便利なライブラリ「schedule」を紹介します

手順

1.必要なモジュールのインストール

2.定期実行処理を実装

1.必要なモジュールのインストール

今回はscheduleというモジュールを利用

$ pip install schedule

2.定期実行処理を実装

定期実行したい処理にスケジュールを割り当てます

下記、公式ドキュメントのサンプルコードを参照

import schedule
import time

def job():
    print("I'm working...")

# 10分ごとに実行
schedule.every(10).minutes.do(job)

# 1時間ごとに実行
schedule.every().hour.do(job)

# 毎日1030分に実行
schedule.every().day.at("10:30").do(job)

# 毎日月曜日に実行 
schedule.every().monday.do(job)

# 毎週水曜1315分に実行
schedule.every().wednesday.at("13:15").do(job)

# 毎時17分に実行
schedule.every().minute.at(":17").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

参考

所感

今回はscheduleというモジュールを使って簡易的に定期実行化しました。

他にもCircleCIやheroku,crontabなど定期実行する手段はいくつかあるので要件に適した方法を探してみてください

【プログラミング入門】クラスや変数の命名規則をまとめてみた

導入

今回はJavaのお話

おそらく大抵の人は、

「そんなの知ってる」

「なに当たり前のことを言ってるのか」

という内容ですが、

先日、若手エンジニア同士の勉強会で

話題に挙がったので、備忘録も兼ねて

内容をまとめておきたいと思います

そもそも命名規則って?

命名規則とは、

開発をしていく上で実装するクラスやメソッド、変数などにつける

「名前の付け方」のこと

つまり、ルールのことです

どんな命名規則があるの?

  • コンスタントケース(または、アッパーケース)
  • パスカルケース(または、アッパーキャメルケース)
  • キャメルケース(または、ローワーキャメルケース)
  • スネークケース
  • チェインケース(または、ケバブケース)

言語や組織によって、呼び方は色々あるみたいです。

一般的な呼び名ものは?

  • キャメルケース
  • パスカルケース
  • スネークケース
  • チェインケース

それぞれの特徴

名称 表記例 説明 主な用途
パスカルケース ItemSearchController 先頭と要素語の先頭が大文字 クラス
キャメルケース getItemInfo 先頭だけ小文字で要素語の先頭は大文字 メソッド、変数
スネークケース user_id アンダースコア(_)で単語を区切る 定数や変数
チェインケース modal-header ハイフン(-)で単語を区切る HTMLのidやclass
コンスタントケース INSTANCE_URL すべて大文字 定数
  • PHPなどでエラーの原因になるため、チェインケースはあまり使いません。
  • キャメルケースは、大文字が「らくだのこぶ」のようにみえることから、命名されたそうです。

所感

プログラミング歴が浅い人ほど

何気なく真似しながら開発してますが、

早い段階から命名規則を意識して開発すれば

変数名を見ただけでどんな用途なのか理解できるので

リーディングスキルが上がりそう

また、人によって読みやすさは違うと思うのですが

言語や開発チームによって、統一の仕方は違うので

基本的には、先人の慣習や流儀に従うのがいいですね

【30分タイムアタック】Python×Twitter フォロバ自動化

せっかくSNS始めたので、

なるべく輪を広げたい

だけど、あまり時間かけたくない

自動化して楽したいなってことで

Pythonで検索するとすぐに出てくる

Twitterの自動化シリーズですね

今日のコードは

いちいちフォロワーみて、

「あ、この人フォロー返すの気づかなかった」とかいうのを

コマンド実行だけで、勝手にやってくれるやつです

ゴール

$ Python AutoFollowBack.py

これ実行したら、フォロワー全員自動でフォロバしてくれる感じ

手順

  • 1.follower_idを取得
  • 2.follow_idを取得
  • 3.not_followed_user_idを算出
  • 4.for文で回して、1人ずつ自動フォローする

1. follower_id(自分をフォローしてくれている人)を取得

follower_id = api.followers_ids()

2. follow_id(自分がフォローしている人)を取得

follow_id = api.friends_ids()

3. not_followed_user_id(フォローされているけど、自分がフォローしていない人)を算出

  1. 手順1と2の和集合を求める

  2. そこから、フォローしてる人を除外する

  3. フォローできていない人が算出できる

not_followed_user_id = set(follower_id + follow_id) ^ set(follow_id)

4. for文で回して、1人ずつ自動フォローする

あとは、フォローできていない人をフォローする処理だけですね

コード

import tweepy
import sys
import TwitterAuth

api = TwitterAuth.getTwitterApi()

follower_id = api.followers_ids()
follow_id = api.friends_ids()
not_followed_user_id = set(follower_id + follow_id) ^ set(follow_id)

number_of_followed = 0
for user_id in not_followed_user_id:
    try: 
        api.create_friendship(user_id)
        number_of_followed += 1
    except Exception as e:
        print(e)

print('number_of_followed : {}'.format(number_of_followed))

※最後に確認のため、フォローした人数出力してます

ちなみに、

import TwitterAuth

api = TwitterAuth.getTwitterApi()

ここは、API取得するところをモジュール化してます

おまけ

同様にして、 not_follow_me_user_id(フォローしてるのにフォローしてくれていない人)は 和集合から、手順1のフォローしてくれている人を除外すればいいですね

not_follow_me_user_id = set(follower_id + follow_id) ^ set(follower_id)

最初からfor文回して、1人ずつフォローしているかどうか判定して

フォローしていなければフォローするっていうコード公開している人いるけど

そもそも2つの集合のどちらの数が多いかわからないのに、

forのなかにforいれていくのは、危険じゃないかな・・・

追記

tweepyのコードスニペット見返してたら、

こんなのあった

for follower in tweepy.Cursor(api.followers).items():
    follower.follow()

これでも全員フォローできるみたい

【Pyhton】リスト内包表記×open()を使って認証情報などを別ファイルで保管する方法

TwitterAPIを利用する上で重要なアクセストーク

このアクセストークンの情報はソースコードに格納したくないので

一旦、txtファイルとして、別で保持することにした。

ファイル読み込み×リスト内包表記

import sys

try:
    path = 'AccessTokenInfo.txt'
    with open(path, encoding='utf-8') as f:
        row = [s.strip() for s in f.readlines()]
        CONSUMER_KEY = row[0]
        CONSUMER_SECRET = row[1]
        ACCESS_TOKEN = row[2]
        ACCESS_SECRET = row[3]
except FileExistsError:
    print('ファイルが存在しないため、強制終了')
    sys.exit

認証情報を格納するtxtファイルを作成

AccessTokenInfo.txtというファイルを作成

それぞれ上から順に保存しておくだけ

AccessTokenInfo.txtファイルの中身サンプル

QJdS5MrjZMBqF5sD84jVLD583tAdCH
iQ6qFNn2WMUh9KNvL3nrZ4Wmktp25A
b2YpRPytv4D4tDWg3iFRTuyuYn9eHz
B6cJwRV4HVU3wttyVvavnVh73DsynF

※ただのランダム文字列です

まあ、暗号化とかその辺はローカルで動かすだけなので今回は考えなくていいでしょう

【30分タイムアタック】Python × tweepyでいいねとフォローを自動化

今日のTAテーマは 昨日の続きでTwitterAPIを使って

「指定したワードをつぶやいた人に対して、いいねとフォローをする」

これを自動化します

といっても、crontabとかで

定期実行するわけでもないので

厳密には自動化ではないですが

コマンド入力するだけで済むので

何十件〜何百件とページを

見て回る必要はなくなりますね

ゴール

所要時間:30分

$ python AutoLikeAndFollow.py "検索したいワード"

これで検索ワードにひっかかるツイートのいいねとツイート主をフォローする

要件

  • 指定したワードをツイートしているユーザー情報を取得
  • そのツイートをいいね
  • そのユーザーをフォロー
  • 引数で検索ワードを随時指定できるようにする

手順

  • 指定ワードで検索してユーザー情報を取得する

  • 指定したツイートをいいねする

  • 指定したユーザーをフォローする

※アクセストークンは''の中に入れる

import tweepy
import sys

CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_SECRET = ''

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

# 指定した条件(検索ワード、検索件数)に一致するユーザ情報を取得
search_word = sys.argv[1]
search_results = api.search(q=search_word, count=30)

# 取得したユーザーを1件ずついいね、フォローしていく
for result in search_results:
    status_id = result.id
    status_text = result.text
    user_name = result.user.name
    user_id = result.user.id
    try: # いいね
        api.create_favorite(status_id)
        print('Liked Status : ' + status_text)
    except Exception as e:
        print(e)
    try: # フォロー
        api.create_friendship(user_id)
        print('Followed : ' + user_name + '(@' + user_id + ')')
    except Exception as e:
        print(e)

フォローのところは今コメントアウトしてます。 なぜならテストする感じで

$ python AutoLikeAndFollow.py "test"

ってやったりすると、

全く関係ないような人をフォローしてしまったりするので。

フォローは、自動フォロバする感じにしようかな

追記

Invalid or expired token.

こんなエラーが出るようになったら、

トークンの再発行やアプリの再作成をして

4つの認証情報を新たに取得して実行すればいけます。

※おそらくBotや大量リクエストに対して、制限をしたりしているのでしょう

ご利用規約

当ブログの記事に関して、各サイトやAPI等のご利用規約に触れる恐れがありますので、ご利用は、全て自己責任でお願いします。

また、記事の内容を利用・参考にした上での活動について、いかなる理由があろうとも当ブログは一切責任を負いませんので、予めご了承ください。