読者です 読者をやめる 読者になる 読者になる

一番下までスクロールしたら処理を実行

Twitterなんかでよく見る「一番下までスクロールしたらロードする」処理向けの「一番下までスクロールした時のみ処理を実行するコード」を実装してみた

素直に実装すると、「一番下から上に向かってスクロール」した時も処理が実行されてしまうのでそこも考慮しつつ書いたのがこれ。

var current_height = 0;
$(document).on('scroll', function(){
    var trigger_pos = 0.9; 
    var pos = $(window).scrollTop();
    if((pos + $(window).height()) >= ($(document).height() * trigger_pos)
         && pos > current_height){
        //Processing Here
        //From top to bottom only
    }
    current_height = pos;
})

動作にはjQueryが必要。2.1.4で動作確認したけど1.x系列でも最新なら動くはず(1.11.3かな?)

Foundationのjavascriptライブラリ呼び出しについて

CSSフレームワークのFoundationのjavascriptライブラリは一般的な(Bootstrapなど)CSSフレームワークとは違い、

<script src="js/foundation.min.js"></script>

とHTMLに書いただけでは動かない。

明示的にロードしてやる必要がある。

<script>
   $(document).foundation(); 
</script>

ちなみにこれはjs/foundation以下に入っているモジュール別のjsファイルを使う時も同様。

ただしすべてのモジュールをロードするときも記述するのは上記のコード1つのみでOK

Vue.jsでデリミタを変更する。

Vue.jsのデフォルトのデリミタは{{hoge}}のような形。


だが、サーバーサイドのテンプレートエンジンもこのような形で表すことが多い。

どちらかを変更しなければデリミタがコンフリクトしエラーを起こすのだが、探してみた結果テンプレート側のデリミタを変更している人が多数でVue.js側のデリミタを変更している記事が見つからなかった。

なのでメモ。

Vue.config.delimiters = ['(%', '%)']

公式にきっちり載っているが、あとで探すのはめんどい。

bottle内蔵のWSGIサーバでctrl+cで止めた時に何か例外が出てる問題

bottleで何か適当にWebアプリを書いてbottle内蔵のサーバでテストして、ctrl+cで終了した時に何かexceptionが発生していた。

こんな感じで

Exception happened during processing of request from ('xxx.xxx.xx.x', xxxxxx)
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/socketserver.py", line 305, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/local/lib/python3.4/socketserver.py", line 331, in process_request    self.finish_request(request, client_address)
  File "/usr/local/lib/python3.4/socketserver.py", line 344, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python3.4/socketserver.py", line 673, in __init__
    self.handle()
  File "/usr/local/lib/python3.4/wsgiref/simple_server.py", line 118, in handle    self.raw_requestline = self.rfile.readline(65537)
  File "/usr/local/lib/python3.4/socket.py", line 374, in readinto
    return self._sock.recv_into(b)
KeyboardInterrupt

起動したら必ず出るというわけではなく、

  • 起動してまだリクエストを飛ばさないうちに終了させると発生しない。
  • 一度でもリクエストを飛ばすと発生する。

って感じ。

いろいろ調べてみたら、ブラウザとのコネクションが残ってるから発生するみたいなことが書かれているのを発見。

10秒ほど待ってから終了させてみてと書いてあったので待って終了させると無事飛んでこなかった。

requests.postについて

人間のためのHTTPと自称し、urllib2をボロクソにこき下ろしているrequests

Requests: 人間のためのHTTP — requests-docs-ja 1.0.4 documentation

そのrequests.postを使った時にちょっとハマったのでメモ。

requests.post(url, data=None, **kwargs)のdataの部分は自動的にJSONにしてくれるらしく、data = json.dumps(data)と書き、リクエストを投げていて何回も400が帰ってきていたので頭を捻っていた。

API使ったクライアント書いた時はjavascript+jQueryで書いてたからまさかそこまで面倒みてくれるとは思ってもいなかった。

json.dumpsについて

Pythonの標準モジュールであるjson.*

オブジェクトをjsonに変換するメソッドとして、json.dumpとjson.dumpsがあるのだがこの2つ、名前が似ているくせしてやる動作が全く違う。

まずオブジェクトをjsonに変換するというところまではdumpもdumpsも同じだが、

json.dumpはjsonに変換してそれをファイルに書き込む。(そのため引数が2つ必要)

json.dumpsの方はjsonに変換した文字列を返す。(そのため引数は1つ)

APIを飛ばす時なんかに使うのはdumpsだろう。

いやいやいや・・・・・せめて名前逆にしろよ・・・・

json文字列に変換するほうがjson.dumpでファイルに書き込むのはjson.dump_wirteでいいじゃん。

もしくはわかりやすく変換だけする方をjson.encodeとかに。

WSGIで現在のURLを取得。

リダイレクト用に現在のURLを取得する必要があったので調べたら想像以上に大変だった(調べるのが。)

phpならめっちゃ簡単なのに・・・・

WSGIが提供してくれるenvironという辞書を使う。

bottleにはenvironを使いやすくラップしてくれる関数があるからそれを使い、

@route('/hello')
def	hello():
	str1 = request.environ.copy()
	return str1.get('wsgi.url_scheme', '') + '://' +str1.get('HTTP_HOST' , '')

で、現在のページのルートまでのパスが取れる。

ただenvironについてイマイチよくわかっていない。

他にスマートな方法ありそうなんだけど。

そもそも辞書と書いてるのも調べた中でenvironが辞書と呼ばれていたから。