それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

curl でクッキー送信

 オプションを使う

curl -b name=value  http://example.com

複数のCookie を送信するには

curl -b 'name=1&arg=value' http://example.com/

複数書くときに、- b を複数記述しても動作しない。

curl -b name=1 -b arg=value http://example.com/ # 上手くいかない

CookieはGET文字列と同じ

Cookie のヘッダも、POST(form-urlencoded)のボディも、GETのクエリパラメータも、本質的には URL エンコされた文字列なので、扱い方は同じですね。

別解:Cookie をヘッダにして送る

curl -H   'Cookie: name=var'  http://example.com

ChromeWebkitの「Devtools」でネットワークを開いてリクエストヘッダからCookieをコピペして使えるので、以外に便利な -H オプション

ヘッダの再現にはこちらがオススメ。

takuya-1st.hatenablog.jp

別解 cookie.jar を使う

Netscape 互換(古いな)のcookie.jar ファイル(要はini みたいな)をつかうと、Cookieを自動で管理してくれる でも余りつかわない

curl -c path_to_cookie_jar_file  http://example.com

Cookieの保存と送信

別記事に書いたんですけど、ここでも紹介。

curl -c path_to_cookie_jar_file   -b path_to_cookie_jar_file  $URL

保存と利用でファイルを分ける事ができるので、同じファイル名を指定すればだいたい解決。

2023-05-23

誤字修正・-b を追記

curlでカスタム HTTP ヘッダー

curl でカスタムHTTPヘッダを送信するには

curl -H "X-MY-HEADER : takuya" http://example.com

ヘッダオプション、-H に直接HEADERの中身を書くといい。

ときどきあれ?ってなるので、忘備録。

curl にかんしてのまとめ

curl でこのブロクを検索

curl カテゴリーの記事一覧 - それマグで!

Curlコマンドの使い方例。curlコマンドの情報は意外と少ない・・・ - それマグで!

php も三項演算子を簡潔に! ?:

三項演算子大好きです。

簡潔に書ける三項演算子

<?php
$params = @$params ?: array();

ときどき、コーディング規約で「三項演算子は禁止」とか言う人いるけど、合理的理由が「読みにくい」じゃ納得出来ない。。。かなしい。

結局はエディタで三項演算子のマクロ展開を書くことになってですね・・・不毛

三項演算子はそれなりに良さがある。

<?php
if( !$a ) {
  $a = 1;
} 

これを、一行にまとめると読みづらい。

<?php
if( !$a ) $a = 1;

if には必ず、ブレイスつけてブロック化しろとかコーディング規約もあったりして。

三項演算子読みやすい

<?php
$a = ($a) ? $a : 1;

簡潔にかける三項演算子

なんと、デフォルト値省略できたんですね

<?php
$a = 2;
$a = ($a) ?: 1;
echo $a ; //=> 2

便利ですね

未定義な変数をどうする?

でも未定義な変数を初期化したい時にどうするんだ?

PHP Notice:  Undefined variable: a in /Users/takuya/Desktop/test.php on line 5

@ つけちゃえ

これが冒頭のサンプルです。超可読性アップですよね。

<?php
$a = @$a ?: 1;
echo $a ; //=> 2

OKWAVeやqiita 読んでたら@ つけると「エラー抑制でデバッグが手間、処理遅くなる」とか言う人いた、

でも、この関数呼び出しですらない@に文句は言えないだろう!

でもコレが出来ない

三項演算子を使うとちょっと楽になった、PHPですが、Rubyできてるコレが出来ない。

a = ( ARGV[0] || "default" )
puts a
#!/bin/env ruby
a ||= 1
puts a #=> 1

OR比較がTRUE/FALSEなのはなんとかならないですかねぇ。。。

まぁ、出来なくても余り困らないんだけど。

php 7 (5.7)から

<?php

$a = @$a ?? 1;
echo $a ; //=> 2

が出来たので、undefined or が書けるようになった。

コーディング規約の 気持ち悪さといえば

三項演算子より、DIRECTORY_SEPARATORやPHP_EOLのほうが気持ち悪さ半端ない。

最近はWindowsでもスラッシュをパス名に解釈してくれるだろうに・・・

PHPを書く人に中途半端なのが多くて、無駄にチェック作業や規約が増えてクソって言われているのでは、、、そんな気がするのは私だけ?

関連資料

規約が増えていく好例、適当に書くから規約が多くなって。。。

orangestar.hatenadiary.jp

参考資料

エルビス演算子ってGroovy呼び名なので、PHPでその呼び名を使うのが相応しいかわからなかった。

http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

https://hydrocul.github.io/wiki/programming_languages_diff/etc/elvis.html

エルビス演算子でスマートに変数を初期化 - Qiita

afpd のエラーログをチャント解決した。

afpd がエラー吐きまくる

OSXのタイムマシン・バックアップ用にLinuxnetatalk を入れてるんだけど、エラーが半端ない。

Nov 21 18:28:53.401733 netatalk[19176] {netatalk.c:244} (N:AFPDaemon): Restarting 'dbus' (restarts: 489)
Nov 21 18:28:53.402422 netatalk[24301] {netatalk.c:305} (E:CNID): Fatal error in exec: No such file or directory
Nov 21 18:28:53.403256 netatalk[19176] {netatalk.c:195} (I:Default): child[24301]: exited 1
Nov 21 18:28:54.401389 netatalk[19176] {netatalk.c:244} (N:AFPDaemon): Restarting 'dbus' (restarts: 490)
Nov 21 18:28:54.401996 netatalk[24302] {netatalk.c:305} (E:CNID): Fatal error in exec: No such file or directory
Nov 21 18:28:54.414348 netatalk[19176] {netatalk.c:195} (I:Default): child[24302]: exited 1
Nov 21 18:28:55.401228 netatalk[19176] {netatalk.c:244} (N:AFPDaemon): Restarting 'dbus' (restarts: 491)
Nov 21 18:28:55.401808 netatalk[24304] {netatalk.c:305} (E:CNID): Fatal error in exec: No such file or directory
Nov 21 18:28:55.402657 netatalk[19176] {netatalk.c:195} (I:Default): child[24304]: exited 1

/var/log/message がログまみれ。毎秒ログ出てくるから、apacheのログやsshログを追いかけるのが大変すぎて困ってた。

dbus daemonを書けばイイ

調べたら dbus をチャント設定すればいいらしい。

dbus daemon = /path/to/bin/dbus-daemon

無事解決。

関連資料

takuya-1st.hatenablog.jp

SQLITEの日付の取扱い

SQLite の日付の取扱について

sqlite は単なるファイル。単なるファイルなので、アクセスする側に組み込まれた「ライブラリ」が日付やローカライズを処理する。

また、ほぼすべてのエントリがテキストで書かれているので、時間処理は基本的に関数計算を経由することになる。

日付の計算

日付の計算は、datetime 関数を通して行う。

datetime( カラム名など, フォーマット, [フォーマット...] )

日付の計算は文字列でやるのが結構楽でいい。

たとえば10日後

>> select current_timestamp;
current_timestamp
-------------------
2015-11-24 10:17:37
>> select datetime(current_timestamp, "+10 days");
datetime(current_timestamp, "+10 days")
---------------------------------------
2015-12-04 10:17:57

ちなみに時刻はすべてUTCで返すので注意が必要。

よくある間違い。

sqlite で日付が計算されない時は、スペースの付け方がおかしい。

うまくいかない例
>> select datetime(current_timestamp, "+10days");
datetime(current_timestamp, "+10days")
--------------------------------------

>> select datetime(current_timestamp, "+ 10days");
datetime(current_timestamp, "+ 10days")
---------------------------------------

>> select datetime(current_timestamp, "+ 10 days");
datetime(current_timestamp, "+ 10 days")
----------------------------------------

かさねがねしちゃう

datetime を 次のように記述するのは無駄。

select datetime(datetime(login_At, "+1 hours"), "+1 days"):

なので、重ねがけ指定をする。

>> select id, login_at, datetime( login_at , "+1 hours", "+1 days") as expire from users ;
id          login_at                   expire
----------  -------------------------  -------------------
1           2015-11-20T05:39:34+09:00  2015-11-20 21:39:34
2           2015-11-20T06:17:31+09:00  2015-11-20 22:17:31
3           2015-11-20T20:28:52+09:00  2015-11-21 12:28:52
4           2015-11-20T20:30:18+09:00  2015-11-21 12:30:18

UTCタイムゾーンの変換も手動でやるよ。

タイムゾーンローカライズを行うと次のようになる。

>> select id, login_at, datetime( login_at , "utc") , datetime(login_at, "localtime") as expire from users ;
id          login_at                   datetime( login_at , "utc")  expire
----------  -------------------------  ---------------------------  -------------------
1           2015-11-20T05:39:34+09:00  2015-11-19 11:39:34          2015-11-20 05:39:34
2           2015-11-20T06:17:31+09:00  2015-11-19 12:17:31          2015-11-20 06:17:31
3           2015-11-20T20:28:52+09:00  2015-11-20 02:28:52          2015-11-20 20:28:52
4           2015-11-20T20:30:18+09:00  2015-11-20 02:30:18          2015-11-20 20:30:18

タイムゾーンは、SQLITEを動かすライブラリが起動してるソフトウェアから取ってくるっぽい。

PHPでSQLiteに書き込もうとしてGeneral error: が出たときの対処

phpsqliteを使ってファイルを保存しようとしたら?エラー?

sqliteを使うときは、上位ディレクトリに書き込み権限が必要

つまり、このような状態でないと書き込みできない

takuya@~/Desktop/temp$ ls -la
total 0
drwxrwxr-x   3 takuya staff  102 11 24 19:24 .
-rw-rwxr--   1 takuya staff    0 11 24 19:24 sample.db

全ての権限をチェックすればエラーは出ない。

エラーメッセージはだいたい次のようになってたり。

General error:  14 unable to open database file

内包する上位ディレクトリの書き込み権限チェックとかちょっと頭悪そう。

sqliteのdb ファイルが777 でもファイル更新できない?え?なんで?

ちょっと何言ってんだこいつ状態なので、落ち着いて考えてみます。

実際にはどういうこと?

/path/to/sample.db

というSQLiteがあったとき

ジャーナリングトランザクションが必要になるので

/path/to/sample.db.journal

というファイルをつくることになる。

さらに、このjournal ファイルを削除するので、ディレクトリに「書込」の権限が必要です。

setfacl とかしてるときは更に削除にも注意が必要ですね。

なので、sqliteを使うときは、そのディレクトリに書き込み権限(ファイルを作成)が必要になる。 理屈がわかれば、安心ですね。不親切ではあるが、観察すればすぐわかる。

わかれば納得。ハマれば地獄。

参考資料

http://blog.zuzara.com/2008/02/15/248/