masalibの日記

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

slackのアプリにダークモード追加

会社の情報通の後輩から教えてもらいました

設定 → ダークモードで変更できます

プログラマの私はコマンドラインの色が落ち着きます
たぶん職業病!!

chromeも黒が落ち着きます

qiita.com

【2019年3月】Googleの検索アルゴリズムのアップデートは辛かった

3月12日ぐらいにGoogleの検索アルゴリズムのアップデートがあった
アフィリエイトをやっている人は軒並みダウンを食らった
私のブログは今まで、色々なUpdateがあったが運よく被害がなかった
今回は、アフィリエイトとかやっていないのですが見事にくらいました

どれぐらい下がったのか?
約30%ぐらいダウンをくらいました
毎日コツコツかいて、1ヶ月に2,3%ぐらいしか増えないのに30%の下落は辛い

このダウンならたぶん立ち直れない

イケハヤさんも被害があったみたい


【悲報】Googleの鉄槌でブログアクセスが激減!SEOの傾向と戦略を考える。

イケハヤさん、曰く「公式や楽天amazon,価格、マイベストみたいな大企業のコンテンツがあがっていく」 弱小アフィリエイトは今後も辛くなっていくそうです。

対策

googleは今後も公式(身元がわかっている所)を強くするみたいなので googleに依存しない流入をふやす。
 →TwitterFacebook,youtube

youtuberにならないといけないのかな~・・・

CodeSandBoxからGitpodに引越した

クラウドでできるJavaScript開発環境なのですが 今まではCodeSandBoxというサービスを使っていました

gitpod引っ越しをきめた理由

同時アクセスが多い時にビルドでメモリが足りないというエラーがでる

f:id:masalib:20190326190201j:plain

code 137 errorで検索

https://support.circleci.com/hc/ja/articles/115014359648-Exit-code-137-Out-of-memory 時間帯によって使えたり、使えなかったりするのでイライラしていた。

そんな時に

paiza.hatenablog.com

という記事で

www.gitpod.io

というサービスがあったので引越しました

使いかたは、超簡単

例えば、任意のリポジトリページを開くと以下のような感じのURLになると思います。

https://github.com/sample/mysample

このURLの先頭に「gitpod.io#」を付与してみましょう。

gitpod.io#https://github.com/sample/mysample

よかった点

メモリのエラーが発生しなくなった。 このエラーはこちらで対応できないのでよかった

悪かった点

色々あるのですが工夫次第でなんとかなります

1. 月100時間の制限がある

そこまで使わないですが100時間の制限があるので 作業が終わったら停止する必要があります

あと何時間使えるのかは https://gitpod.io/usage/というページで確認できる

30分ぐらいで勝手に停止してほしいがどこにも記載されていないので毎回停止している。

2. hostを指定しないとビューで表示されない

gatsbyはデフォルトだとhostnameがlocalhostです。 これだとブラウザで確認できない。 私が無知でしらないだけかもしれないがnpmコマンドで指定してもhostが変わらない。 ゆえに"gatsby-cli"をインストールする(起動のたびに・・・)

$ npm install gatsby-cli -g
$ gatsby develop --port 8000 --host "0.0.0.0"

その後、portの部分にいってブラウザをopenするボタンを押さないとビューで確認できない。
ちょっとめんどくさい

f:id:masalib:20190326190544j:plainf:id:masalib:20190326190547j:plain
ブラウザで確認

3. githubにpushする手順が増えた

いいのか悪いのかはおいといてcodesandboxはgithubリポジトリにpushするのが1つの画面で1発できた。 gitpodは3つの手順でpushする

  1. クラウドIDEでコミットするファイルを1つ1つ選ぶ。

    f:id:masalib:20190326192033j:plainf:id:masalib:20190326192038j:plain
    ファイル選択画面

  2. コミットする

    f:id:masalib:20190326192125j:plain
    コミット

  3. Pull Requestという画面でpushする
    f:id:masalib:20190326192144j:plain
    Push画面
    1つの画面でやってくれれば問題ないのですが別々の画面になっているのでめんどくさい。

開発コスト > サーバー費用

自社のキャンペーンでサーバーを増やして対応したが
ロードアベレージ0.05って・・・
インフラとしてはOKだった。サービスとしては・・・ノーコメント
(大雑把ですがCPUを2を積んでいるのでロードアベレージも2までは耐えれる)

メモリはcurlのバグなのか1時間に5%ぐらいあがる
でもクリアすれば問題なかった

qiita.com

上司の意向でGMOアプリクラウドv5を使っているがSSDとかネットワークとか
めっちゃ早い・・・

メインで使っていると「あるクラウド業者」SSDすらない。
問い合わせしてみたら「問い合わせが少ないので検討していない」と言われた。

切り替えたいが複雑なネットワーク(オンプレミスあり)を 組めないので移行できないが本当に辛いところ
AWSはNGっぽくて移行できない
(route53とs3を除く)

負荷試験とかで色々で直した結果だと思うが
プログラムで改善よりインフラの部分の改善の方がコスパがいいって。。。
プログラマーとしては辛い

【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