masalibの日記

システム開発、運用と猫の写真ブログです

【python3】pythonのPillowで画像の圧縮

pythonにはPillow(Python Imaging Library)という超便利な画像ライブラリがあります。 そちらをつかって画像の圧縮をします

仕様

動き

  1. urlから画像をダウンロードしてimgという変数に突っ込む
  2. ダウンロードした画像の縦横のピクセルを取得する
  3. 変換した画像サイズのピクセル数を計算する
  4. 画像圧縮する
  5. 変換画像を保存する

ソース

https://colab.research.google.com/drive/13a3OJe63lZdpzmAIcdPB8jcMLdPKHwCH

import IPython
from io import StringIO
import io
import urllib.request
from PIL import Image

# urlから画像をダウンロードしてimgという変数に突っ込む
imagesrc ="http://cdn-ak.f.st-hatena.com/images/fotolife/m/masalib/20160218/20160218144707.jpg"
f = io.BytesIO(urllib.request.urlopen(imagesrc).read())
img = Image.open(f)

# ダウンロードした画像の縦横のピクセルを取得する
img.save('sorce.jpg')
before_x, before_y = img.size[0], img.size[1]

# 変換した画像サイズのピクセル数を計算する
# 縦基軸の場合
height = 360
x = int(round(float(height / float(before_y) * float(before_x))))
y = height

# 横基軸の場合
#width = 480
#x = width
#y = int(round(float(width / float(before_x) * float(before_y))))

# 画像圧縮する
img = img.resize((x,y), Image.LANCZOS)

# 変換画像を保存する
img.save('resized.jpg')

# 比較
print ("もと画像の縦横",before_x, before_y)
IPython.display.Image('sorce.jpg')

print ("変換後画像の縦横",x, y)
IPython.display.Image('resized.jpg')

結果

f:id:masalib:20190326234432j:plain
変換画面

感想

  • 変数にわたさないと変換されない??という罠にはまった
img = img.resize((x,y), Image.LANCZOS)
img.save('resized.jpg')
  • 縦横のサイズを計算するのがめんどくさい。パラメータであればいいけど、見当たらなかった
  • resizeのフィルタがあるが実行速度や圧縮の関係がまだ理解していないので検証したい

ダメ人間だわ・・・・

polcaというサービスがあります

polca.jp

簡単にいうとオンライン募金(フレンドリーファンディング?)らしいですが

素直に「遊びたいから金くれ~」っていうのは笑ってみれるのですが
「病気になってお金がないので支援してください」というは詐欺に見えてしまう

ダメ人間だね~

  • 病気っていう所の証拠だせ!!
  • 金がいるという事は高額医療からも外れた超特殊な病名をだせ
  • 自分がどれだけお金の工面をしたのか証拠だせ!!

証拠をだせないなら、詐欺だろう!!と思ってしまう

ダメ人間だね~
汚れてしまったんだ。。。

【python3】urlからはてなblogのxmlを取得する

masalib.hatenablog.com

前回でentry_idが取得できたのでそれをもとにxmlを取得したいと思う

仕様

パラメータ

  • user_id(自分の場合はmasalib)
  • blog_id(blogのdomainになる、独自ドメインの場合は調べていないのでわからない)
  • target_url(取得したいURL)
  • password(apiキー)
    APIキーは,はてなブログの「詳細設定 > AtomPub」から確認できる。APIキーは共有させるために 入力させる形にしています(パスワードなので見せない形)

動き

  1. パスワードを入力する
  2. URLからentry_idを取得する
  3. blogidとentry_idをもとにXMLを取得するエンドポイントを作成する
  4. エンドポイントにbasic認証のヘッダーをいれて通信する

ソース

https://colab.research.google.com/drive/1bf_siLfn-wA2qnSHC2Pbu8z6bBRhi5TA

import requests
import bs4
import sys
import getpass

blog_id = "masalib.hatenablog.com"

hatena_id = "masalib"
print('passwordを入力してください(英数字)')
password = getpass.getpass()

targeturl = "https://masalib.hatenablog.jp/entry/2016/02/19/014308"

  
def get_collection_xml(hatena_id, blog_id, password,target_id):
    service_doc_uri = "https://blog.hatena.ne.jp/{hatena_id:}/{blog_id:}/atom/entry/{target_id:}".format(hatena_id=hatena_id, blog_id=blog_id,target_id=target_id)
    print(service_doc_uri) 
    res_service_doc = requests.get(url=service_doc_uri, auth=(hatena_id, password))
    if res_service_doc.ok:
        soup_servicedoc_xml = bs4.BeautifulSoup(res_service_doc.content, features="xml")
 
       #collection_uri = soup_servicedoc_xml.collection.get("entry")
        return res_service_doc.content
    return False
  

def get_target_uri_id(targeturl):
    res = requests.get(targeturl)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    elems = soup.select('article')
    strid =  soup.article.get("id")
    strid =  strid.replace( "entry-"  , "")    
    return (strid)
  
target_id = get_target_uri_id(targeturl)
#print(target_id)  
collection_xml = get_collection_xml(hatena_id, blog_id, password,target_id)
print (collection_xml)

実行結果

感想

  • formatで文字列を作る方法を知らなかったで勉強になった
service_doc_uri = "https://blog.hatena.ne.jp/{hatena_id:}/{blog_id:}/atom/entry/{target_id:}".format(hatena_id=hatena_id, blog_id=blog_id,target_id=target_id)
  • basic認証などが簡単にできた。他のapiなどでも使えるので嬉しいポイントだ
  • 普通の入力だと共有できないので「getpass」を使うと共有できるのが嬉しかった
print('passwordを入力してください(英数字)')
password = getpass.getpass()

参考URL

参考URLは記事リストを取得する形だったが本当にこの記事に助けられた。

cartman0.hatenablog.com

【python3】urlからはてなblogのentry_idを取得する

pythonの備忘録です
はてなblogはapiが公開されていて、そこから取得したり編集したりする事ができます
編集するためにはentryidが必要です

https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry/{entry_id}

http://developer.hatena.ne.jp/ja/documents/blog/apis/atom
より

apiにURLからentry_idが取る事ができないみたいなので作る事になった

仕様

はてなのブログはarticleタグのidの中を取得する形なります

f:id:masalib:20190324180425j:plain
entry_idの場所

他にあるならすいません

ソース

import requests
import bs4

targeturl = "https://masalib.hatenablog.com/entry/2017/06/07/201821"

targeturl = "https://masalib.hatenablog.jp/entry/2016/02/19/014308"

  
def get_target_uri_id(targeturl):
    res = requests.get(targeturl)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    elems = soup.select('article')
    strid =  soup.article.get("id")
    strid =  strid.replace( "entry-"  , "")    
    return (strid)
  
target_id = get_target_uri_id(targeturl)
print(target_id)  

https://colab.research.google.com/drive/1xi9yc5Goo7vKnn4J9bQlMHwOxP3zOout

実行結果

感想

pythonの場合は、スクレイピングするならBeautifulSoupが便利だった。apiがあればこんな苦労はしないんだけど・・・

【python3】実行中に入力を促す

今回はpython3の備忘録です。

コマンドラインでパラメータを渡す方法は知っていたのですが

import sys
args = sys.argv
i = 0
print(args)
for arg in args:
    print("第" + str(i) + '引数:' + arg)
    i += 1

実行中に入力を促すを知らなかった

import sys
print('ユーザーidを入力してください(英数字)')
user_id = input()
print("user_id",user_id)

pythonは業務では使ったことがないので、知らない事ばかりですが機械学習をする上では避けて通れなない

実際の実行例 https://colab.research.google.com/drive/1w2MqBFUH59CBjYUgdPJ7sLDW3bJCTW1Z

実行結果

参考URL

qiita.com

顔出しが当たり前の時代なのかな

経緯

過去

私は1995年からインターネットをやっていて、yahooをみるのが楽しかった。
時代が進み2chがでて、顔出しすると叩かれるのが盛んでした。
犯罪とか何かやらかすと家まで来るという怖い(今もそうかも)

ニコニコ動画の全盛期でも顔出しはあまりなかった。
顔出しするとアンチコメントが来るのを何回か見た事がある

facebookという黒船がきた
少しづつ顔出しする人が増えていった。私も顔出ししました。

現在

現在は、youtubeTikTokMixChannelなど
顔出しが当たり前の時代になった

むしろTikTokMixChannelは一部顔出しが前提みたいな所があるね

まとめサイトに行った事がある人なら1度は見たことがある

www.youtube.com

こんなかわいい娘たちも顔出しする時代www

顔出しのメリット

誰が書いているのかが明確になると信頼が得られる。

SEO的な言い方をする E-A-T (expertise:専門性、authoritativeness:権威性、trustworthiness:信頼性) の信頼性があがる

ブログだけだとあまりメリットが少ないと思うが今後、youtubeとかやっていくならメリットはある

顔出しのデメリット

アンチ!!

イケハヤさん、曰く「人気になればアンチは湧いてでてくる。

一番怖いのは殺人だけど、これは極論的な所かな

nikkan-spa.jp

自分の意見

デメリットを理解して出したほうがいい
Facebookも出しているので・・・
あと会社にバレているので(笑)

時代の変化は怖いね~

Googleアドセンスの自動広告が表示されない・・・諦めて見出し前に広告を設置するjavascriptを追加

masalib.hatenablog.com

色々やったが、どうしても表示されなかった。諦めてjavascriptで無理やり表示するように仕込んだ

設定内容

見出しタグ(H3)に対して毎回、広告を表示するのは、広告をアピールしすぎるので 3の倍数の時に表示するように変更した 参考サイトのjavascriptだと、なぜかレスポンシブが崩れるという問題があったので作り変えた。

設定したタグ

「デザイン」→「カスタマイズ」→「記事」→「記事上」にコードを追加します 当たり前ですが、必ずバックアップをとってから作業をしましょう!!

f:id:masalib:20181219193500p:plain
はてなブログ編集のデザインのヘッダー

実際に設置したソース

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
var iNumber = 0;

addEventListener("DOMContentLoaded", function() {
    $(".entry-content > h3").each(function() {
        if (( iNumber % 3 ) == 0){
            $(this).before(`
            <!-- 広告タグ開始-->
            <ins class="adsbygoogle"
             style="display:block"
             data-ad-client="ca-pub-1411576193652714"
             data-ad-slot="5404507033"
             data-ad-format="auto"
             data-full-width-responsive="true"></ins>
            <!-- 広告タグ終了-->

            `);
            (adsbygoogle = window.adsbygoogle || []).push({});
        }
        iNumber++;
    });

}, false);
</script>

広告タグ開始から終了までが変更箇所になります
レスポンシブを崩れてなかったのでこちらにしました

参考URL

http://pea-nut.hatenablog.com/entry/hatenaburogu-midasi-koukoku

http://tamasaburo.com/entry/hatenablog-adsense-in-the-article