[Life]ズブロッカを買った

スクリーンショット 2017-06-17 20.57.44

晩酌を殆どしないので凄く珍しいことなんだけど久しぶりにズブロッカが飲みたくなって買うてきた。一緒にトニックウォーターを買いたかったんだけど見当たらず、そのかわりにレモンジーナで割ることにした。

ズブロッカに出会ったのは今から20年も前のこと、当時仲が良かった女の子と恵比寿のバーに行ったときにズブロッカのトニック割りを教えてもらった。それ以来の付き合いでなんか節目節目に飲んでいるイメージ。今回は節目でもなんでもないけれど。


Ripstik(ブレイブボード)を買った

07A93918-5F14-47F4-BF91-79EEA5BFF2FE-413

近所の小学生が乗っているのを見てやってみたくなって購入 とりあえず箱から出して30分後にツイスト乗りが出来たので嬉しい

尚、未だにコケていない(但しトリックやりだすと痛い目に合うかと。。)
すんなり乗れた要因としてはハウツー動画はなるべく見ないでこちらのサイトの文章を事前に徹底的に頭に叩き込んだことかと思う

空気岩 RipStik乗り方のコツ

自身のトライアンドエラーから得た知見をうまく文章に落としてくださっている。理路整然として腑に落ちた。 暫くは反復練習で体に覚えさせて、いずれはキックフリップが出来るようにしたい


Flaskでog:imageを動的に切り替える

FaceBookなどにブログをシェアした時にサムネイルとして使用されるog:imageを動的に切り替えたい
具体的には

  • エントリーに画像リンクが一つ貼られている場合はその画像URLを使用する
  • エントリーに画像リンクが複数貼られている場合は一番最初に貼られている画像URLを使用する
  • エントリーに画像リンクが一つもない場合、あらかじめ用意した画像URLを使用する
  • トップページの場合も同じくあらかじめ用意した画像URLを使用する

このブログはFlaskを使用した自作ブログなので、このような機能を追加する場合は自力でなんとかするしかなくて(まあそれが楽しいんだけど)他に困っている人がいるとも思えないけれども一応メモしておく

ブログの本文を取り出す

SQLAlchemyを使っているのでこのような感じで個別エントリーを取り出す

entry = Entry.query.filter_by(id = post_id).one()

ブログの本文からimgタグのsrcを取り出す

これはbs4を使う。find_allでなくfindを使うことによって目的のタグが見つかったらそこでパースをやめるようにした(処理時間の短縮)

def get_src_tag(e):
    """get first img src tag"""
    soup = BeautifulSoup(e.text, 'html.parser')
    img = soup.find('img')
    if img:
        return img['src']
    else:
        return None

view関数の作成

@mod.route('/entry/<int:post_id>/')
def show_entry(post_id):
    entry = Entry.query.filter_by(id = post_id).one()
    flash(u'%s' % entry.pub_date.strftime('%Y-%m-%dT%H:%M:%S+09:00'), 'alert-success')
    return render_template('show.html',
        entries=Entry.query.filter_by(id=post_id).all(), tags=show_tags(),\
                                      archives=count_archives(), src=get_src_tag(entry))

本件とは関係ないものも混じっているけれどだいたいこんな感じ
entry = Entry.query.filter_by(id = post_id).one() と src=get_src_tag(entry) のところが今回追加したところ

テンプレート(jinja2)の変更

とりあえずヘッダー部分だけ貼り付け

<html lang="ja">
    <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
        {% if request.endpoint == 'entry.show_entries' %}
        <title>aoshiman.org</title>
        <meta property="og:title" content="aoshiman.org" />
        <meta property="og:url" content="https://blog.aoshiman.org" />
        <meta property="og:image" content="https://static.flickr.com/3604/3281177662_70807f7065.jpg" />
        {% elif request.endpoint == 'entry.show_entry' %}
        {% for entry in entries-%}
        <title>{{entry.title|safe}} | aoshiman.org</title>
        <meta property="og:title" content={{entry.title|safe}} | aoshiman.org />
        <meta property="og:url" content="https://blog.aoshiman.org{{url_for('entry.show_entry', post_id=entry.id)}}" />
        {% if src != None %}
        <meta property="og:image" content={{src}} />
        {% else %}
        <meta property="og:image" content="https://static.flickr.com/3604/3281177662_70807f7065.jpg" />
        {% endif %}
        {%-endfor %}
        {% else %}
        <meta property="og:title" content="aoshiman.org" />
        <meta property="og:url" content="https://blog.aoshiman.org" />
        <meta property="og:image" content="https://static.flickr.com/3604/3281177662_70807f7065.jpg" />
        <title>aoshiman.org</title>
        {% endif %}
        <meta property="og:type" content="article" />
        <meta property="og:site_name" content="aoshiman.org" />
        <meta property="fb:app_id" content="1842519809295747" />
        <meta name="twitter:card" content="summarylargeimage" />
        <link rel="stylesheet" href="{{url_for('static', filename='bootstrap/css/bootstrap.min.css')}}" media="screen">
        <link rel="stylesheet" href="{{url_for('static', filename='css/style.css')}}">
        <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="alternate" title="RSS" href="https://blog.aoshiman.org/rss/" type="application/rss+xml">
        <link rel="shortcut icon" href="{{ url_for('static',filename='favicon.ico') }}" />
        <script type="text/javascript">
            var _gaq = _gaq || [];
            _gaq.push(['_setAccount', 'UA-*******-*']);
            _gaq.push(['_trackPageview']);

            (function() {
             var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
             ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
             var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
             })();
         </script>
    </head>

ちょっと長いんだけど、request.endpointで個別記事かそうでないかを判別。srcがNoneかそうでないかで画像URLを振り分けている


[Shizuoka] 静岡ホビーショーに行ってきた(チャリで)

午後に時間が取れたのでチャリで静岡ホビーショーに行ってきた

すべての写真-1040
すべての写真-1049
すべての写真-1041

楽しかったし、熱気がすごかった。来年はもっとじっくり見たい。但し分煙はもっと厳格にやったほうがいい。今日は一人だったので許容範囲だったけど、息子たちが一緒だったら嫌だったかも。


WinSWを使ってNginxとphp-cgiをWindows Serviceに登録する

20170508_01.JPG

Pukiwiki を Windows Server 2012R2 on Hyper-V Failover Cluster に構築した時にはまったのでメモ。WinSWは任意のWindowsアプリケーションをWindowsのサービスとして動作させる為の実行可能なバイナリで、今回はNginx.exe と php-cgi.exe を Windowsサービスより自動起動させたかったので使ってみた。

Nginx.exeの場合

基本的にはここにかいてあるとおりで
Windows Server 2012 R2でNginxをサービス化する - Qiita

  • ダウンロードページより最新版をダウンロードしリネーム(e.g. nginxservice.exe)してnginx.exeと同じ場所に配置
  • nginxservice.exe.configの作成
    これは.NET Framework 3.5がインストールされていれば不要。Windows Server 2012R2ではデフォルトで3.5が無効化されていると思うので、有効化したくないのならこの設定は必要
  • <configuration>
      <startup>
        <supportedRuntime version="v2.0.50727" />
        <supportedRuntime version="v4.0" />
      </startup>
    </configuration>
    
  • nginxservice.xml の作成
    これにはサービス関わる設定を記述する。stopargumentを二つ記述するのがポイントっぽい
  • <service>
      <id>nginx</id>
      <name>nginx</name>
      <description>nginx</description>
      <logpath>c:\nginx\logs</logpath>
      <logmode>roll</logmode>
      <depend></depend>
      <executable>c:\nginx\nginx.exe</executable>
      <startargument></startargument>
      <stopexecutable>c:\nginx\nginx.exe</stopexecutable>
      <stopargument>-s</stopargument>
      <stopargument>stop</stopargument>
    </service>
    
  • インストール
    nginxservice.exe install
 

php-cgi.exeの場合

これもほぼ同じ

  • ダウンロードページより最新版をダウンロードしリネーム(e.g. phpcgiservice.exe)して配置
  • phpcgiservice.exe.configの作成
     nginxの時と同じ内容
  • phpcgiservice.xml の作成
    startargumentでコマンドとパラメータの間を半角スペースで開けるとうまく登録出来なかったんだけどなぜだろう
  • <service>
      <id>PHPCGI</id>
      <name>PHPCGI</name>
      <description>PHP</description>
      <executable>C:\php5\php-cgi.exe</executable>
      <logpath>C:\php5\logs\</logpath>
      <logmode>roll</logmode>
      <depend></depend>
      <startargument>-b127.0.0.1:9000</startargument>
      <startargument>-cc:\php5\php.ini</startargument>
      <stopexecutable>taskkill.exe</stopexecutable>
      <stopargument>/f</stopargument>
    	<stopargument>/im</stopargument>
    	<stopargument>php-cgi.exe</stopargument>
      <!--<stopargument>taskkill /f /IM php-cgi.exe</stopargument>  -->
    </service>
    
  • インストール
    phpcgiservice.exe install
  • うまくいくとこんな感じになる

    20170508_02.JPG

PAGE TOP