洒落にならないレベルで使いにくい。Web SQL Databaseを使う暗黒面に堕ちたい。
全ての処理がコールバック。これはjsだからまだしょうがないと言える。
取得する値の範囲を絞る方法が、全て か 完全一致か範囲指定 のみ。これが致命的。sql的に言うと範囲指定はwhereがbetween a and bか、<a か、>bの三種類しか無い。
しかもand やorが無い。条件は本当に一つだけ。
名前の通り、実質的に連想配列で範囲指定もオマケで付けておいたよ と考えても、1リクエストごとにコールバックな連想配列なんて誰も使わないだろ。
テーブル(indexed BDではストアと呼ぶ)を二つに分けて、片方のデータのインデックスの情報をもう片方のDBから引っ張ろうとするとコールバックの嵐になる事必至。数件しか無いデータや、完全一致の1行sqlで最終結果が出るデータ以外はまともに使える気がしない。
indexed BDをガリガリ使い、sql的に言う所のjoin文的な処理も使いこなしてるプロダクトがあれば教えて欲しい。勉強するから。
僕がとてもとてもとても愛用しているニコ動履歴ちゃんはweb sql使ってました。これは廃止出来ない。
いいじゃんSQLite準拠でも・・
カテゴリー: 未分類
TwitterのAPIの戻り値 htmlエスケープはどうなっているのか記録。
twitterのREST APIとStreaming APIの違い。
postしたツイートは
(ABCの後に数回改行もある)
windows7のツイタマより。半角記号全部に注目。化けてたらごめん。
gist.githubに上げたから、RAWで見れば多分大丈夫。
streamingAPI
rest api
textに関しては、Streaming APIとREST APIでエンコード形式は変わらないな。変換されたテキスト一覧。html的にアレなのでgist参照推奨
¥エスケープはjsonの段階で消えるとして、結局&<>のエスケープだけする感じか。
postしたツイートは
1 2 |
!"#$%&'()*+,-./:;<=>?@[]^_`{|}~ ABC |
windows7のツイタマより。半角記号全部に注目。化けてたらごめん。
gist.githubに上げたから、RAWで見れば多分大丈夫。
streamingAPI
1 |
{"created_at":"Sat Aug 23 03:18:38 +0000 2014","id":503018450327846913,"id_str":"503018450327846913","text":"!"#$%&'()*+,-./:;<=>?@[\]^_`u007b|u007d~nABC","source":"u003ca href="http://twitter.softama.com/" rel="nofollow"u003eu30c4u30a4u30bfu30deu003c/au003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":212836820,"id_str":"212836820","name":"FushiharaCheck","screen_name":"FushiharaCheck","location":"u3053u3053","url":null,"description":null,"protected":true,"followers_count":2,"friends_count":2,"listed_count":0,"created_at":"Sun Nov 07 05:38:39 +0000 2010","favourites_count":2,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":398899,"lang":"ja","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://pbs.twimg.com/profile_background_images/758337975/1f7985d6c0868d20c08bbdc174c86454.png","profile_background_image_url_https":"https://pbs.twimg.com/profile_background_images/758337975/1f7985d6c0868d20c08bbdc174c86454.png","profile_background_tile":false,"profile_image_url":"http://pbs.twimg.com/profile_images/2340621555/9cbjty52g7ihcv5s88yh_normal.png","profile_image_url_https":"https://pbs.twimg.com/profile_images/2340621555/9cbjty52g7ihcv5s88yh_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"filter_level":"medium","lang":"und"} |
rest api
1 |
{"created_at":"Sat Aug 23 03:18:38 +0000 2014","id":503018450327846913,"id_str":"503018450327846913","text":"!"#$%&'()*+,-./:;<=>?@[\]^_`u007b|u007d~nABC","source":"u003ca href="http://twitter.softama.com/" rel="nofollow"u003eu30c4u30a4u30bfu30deu003c/au003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":212836820,"id_str":"212836820","name":"FushiharaCheck","screen_name":"FushiharaCheck","location":"u3053u3053","description":"","url":null,"entities":{"description":{"urls":[]}},"protected":true,"followers_count":2,"friends_count":2,"listed_count":0,"created_at":"Sun Nov 07 05:38:39 +0000 2010","favourites_count":2,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":398899,"lang":"ja","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://pbs.twimg.com/profile_background_images/758337975/1f7985d6c0868d20c08bbdc174c86454.png","profile_background_image_url_https":"https://pbs.twimg.com/profile_background_images/758337975/1f7985d6c0868d20c08bbdc174c86454.png","profile_background_tile":false,"profile_image_url":"http://pbs.twimg.com/profile_images/2340621555/9cbjty52g7ihcv5s88yh_normal.png","profile_image_url_https":"https://pbs.twimg.com/profile_images/2340621555/9cbjty52g7ihcv5s88yh_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"und"} |
textに関しては、Streaming APIとREST APIでエンコード形式は変わらないな。変換されたテキスト一覧。html的にアレなのでgist参照推奨
1 2 3 4 5 6 7 8 |
& → &amp; < → &lt; > → &gt; → \ " → " / → / { → u007b } → u007d |
EDCBでBondriverが開けません

前提条件として、bondriverは複数ある。epgtimerSrvを使っている。OSの起動直後等、EpgTimerとEpgTimerSrvの接続が切れてもやもやする事がある。
正常にEpgTimerとEpgTimerSrvが繋がっている時、録画予約が開始されるとタスクトレイにEpgTimerCapBonのアイコンが表示される。
EpgTimerSrvはサービスで動いているからGUIを表示する事は出来ない。ので、ユーザーモードで動いているEpgTimerに通信してEpgTimerCapBonを起動して貰っている。 と、思われる。
EpgTimerが動いていない時に録画予約が始まると、EpgTimerSrvが直接EpgTimerCapBonを起動する。ので前述の制限の通りGUI=タスクトレイのアイコンが表示されない。

問題はここからで、システムモードで動いているEpgTimerCapBonがあると、ユーザーモードで起動したEpgTimerCapBonからBonDriverを開けなくなる事があるっぽい。
条件はあるだろうけど、少なくとも ある。
だからEpgTimerSrvとEpgTimerの接続が怪しいと思ったら、システムモードで動いているEpgTimerCapBonの有無を確認するべきだと思う。
私はこれで今日土曜日の化物語一挙をBonDriverオープン失敗しました。ファック。
ブラザーの複合機にあるクラウド保存機能は画質が悪い
たり前と言えば当たり前だけど。
jpeg保存、pdf保存と、比較用の外部ソフトを使ったスキャン時。全て600dpi。
機種はこれ http://www.brother.co.jp/product/printer/inkjet/dcpj752n/
上から外部ソフト、jpg、pdf。当たり前だけど非クラウドの外部ソフトが圧倒的。と、思ったけど純正ソフトControlCenter4が一番かな。外部ソフトと解像感はあまり変わらないけど色が好み。




jpeg保存、pdf保存と、比較用の外部ソフトを使ったスキャン時。全て600dpi。
機種はこれ http://www.brother.co.jp/product/printer/inkjet/dcpj752n/
上から外部ソフト、jpg、pdf。当たり前だけど非クラウドの外部ソフトが圧倒的。と、思ったけど純正ソフトControlCenter4が一番かな。外部ソフトと解像感はあまり変わらないけど色が好み。




YAT安心!宇宙旅行の本当の絵はどこにある?
チャンネルNECOで放送しているYAT安心宇宙旅行HD版の絵調査です。
NHKアナログハイビジョン版の映像持ってる人提供待ってます。
以下映像は全て1期。フルワイドなのが13話で、左右にカーテンがあるのが12話。NECOは1440×1080。アナログなのでフレーム単位でブレが生じているので完全に一致はしません
インライン用の縮小画像。NECOはワイドに引き伸ばしてます。左上がNECOの12話。右上がNECOの13話。左下がNEPYOUの12話。右下がNEPYOUの13話。

黒い部分多すぎですな。この中でフルワイドなのは右上のNECO13話版だけ。NEPYOU版とNECO版は縦方向に伸縮してる。アナログハイビジョンをそのままデジタル化したNEPYOUと伸ばしたNECOの違いか。
以下オリジナルpng
NECOの12話
NECOの13話
NEPYOUの12話
NEPYOUの13話
NHKアナログハイビジョン版の映像持ってる人提供待ってます。
以下映像は全て1期。フルワイドなのが13話で、左右にカーテンがあるのが12話。NECOは1440×1080。アナログなのでフレーム単位でブレが生じているので完全に一致はしません
インライン用の縮小画像。NECOはワイドに引き伸ばしてます。左上がNECOの12話。右上がNECOの13話。左下がNEPYOUの12話。右下がNEPYOUの13話。

黒い部分多すぎですな。この中でフルワイドなのは右上のNECO13話版だけ。NEPYOU版とNECO版は縦方向に伸縮してる。アナログハイビジョンをそのままデジタル化したNEPYOUと伸ばしたNECOの違いか。
以下オリジナルpng
NECOの12話
NECOの13話
NEPYOUの12話
NEPYOUの13話
androidのapkを改造する方法
Java – Androidのリバースエンジニアリング方法 – Qiita [キータ]
これで9割OK。
後は自作のアプリを逆コンパイルして、この命令はこういう内容で と頑張って読む。
Sony Ericsson xperia series Home.apk コンパイルエラーの解決 | 所感 ~android~
apkをビルドする時にレイアウトファイルうんぬんのエラーが出たらここ。
サンプルが1例だけだらか心配だけど、「1つ上の兄弟ノード」の値をそのままコピペでok。機械的に出来る。
ここからが自作部分。
コピペで使える、ログに任意の値を書き出すメソッド。
staticだからどこからでも使える。.smaliのファイルの先頭にコピペする。多分constructorの次がいいと思う。#direct methodsがあるクラスの方がいいと思う。
使い方はこの二行だけ。当然クラス名は適切な配置場所に変更。
元コードはこんな感じ
これで9割OK。
後は自作のアプリを逆コンパイルして、この命令はこういう内容で と頑張って読む。
Sony Ericsson xperia series Home.apk コンパイルエラーの解決 | 所感 ~android~
apkをビルドする時にレイアウトファイルうんぬんのエラーが出たらここ。
サンプルが1例だけだらか心配だけど、「1つ上の兄弟ノード」の値をそのままコピペでok。機械的に出来る。
ここからが自作部分。
コピペで使える、ログに任意の値を書き出すメソッド。
staticだからどこからでも使える。.smaliのファイルの先頭にコピペする。多分constructorの次がいいと思う。#direct methodsがあるクラスの方がいいと思う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# direct methods .method public static decodeEverything(Ljava/lang/String;Ljava/lang/String;)V .locals 2 .parameter "key" .parameter "log" .prologue .line 7 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "String[" invoke-direct {v0, v1}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, "]" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 invoke-static {p0, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I .line 8 return-void .end method .method public static decodeEverything(Ljava/lang/String;Ljava/util/List;)V .locals 4 .parameter "key" .parameter .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/String;", "Ljava/util/List", "<", "Ljava/lang/String;", ">;)V" } .end annotation .prologue .line 24 .local p1, target:Ljava/util/List;,"Ljava/util/List<Ljava/lang/String;>;" new-instance v0, Ljava/lang/StringBuffer; invoke-direct {v0}, Ljava/lang/StringBuffer;-><init>()V .line 25 .local v0, sb:Ljava/lang/StringBuffer; invoke-interface {p1}, Ljava/util/List;->iterator()Ljava/util/Iterator; move-result-object v2 :goto_0 invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z move-result v3 if-nez v3, :cond_0 .line 31 new-instance v2, Ljava/lang/StringBuilder; const-string v3, "List<string>[" invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String; move-result-object v3 invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v2 const-string v3, "]" invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v2 invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v2 invoke-static {p0, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I .line 32 return-void .line 25 :cond_0 invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object; move-result-object v1 check-cast v1, Ljava/lang/String; .line 26 .local v1, t:Ljava/lang/String; invoke-virtual {v0}, Ljava/lang/StringBuffer;->length()I move-result v3 if-eqz v3, :cond_1 .line 27 const-string v3, "," invoke-virtual {v0, v3}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; .line 29 :cond_1 invoke-virtual {v0, v1}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; goto :goto_0 .end method .method public static decodeEverything(Ljava/lang/String;[B)V .locals 6 .parameter "key" .parameter "target" .prologue .line 10 new-instance v2, Ljava/lang/StringBuffer; invoke-direct {v2}, Ljava/lang/StringBuffer;-><init>()V .line 11 .local v2, sb:Ljava/lang/StringBuffer; array-length v4, p1 const/4 v3, 0x0 :goto_0 if-lt v3, v4, :cond_0 .line 14 new-instance v3, Ljava/lang/StringBuilder; const-string v4, "byte[1/2][" invoke-direct {v3, v4}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V invoke-virtual {v2}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String; move-result-object v4 invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 const-string v4, "]" invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v3 invoke-static {p0, v3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I .line 16 :try_start_0 new-instance v3, Ljava/lang/StringBuilder; const-string v4, "byte[2/2][" invoke-direct {v3, v4}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V new-instance v4, Ljava/lang/String; const-string v5, "utf-8" invoke-direct {v4, p1, v5}, Ljava/lang/String;-><init>([BLjava/lang/String;)V invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 const-string v4, "]" invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v3 invoke-static {p0, v3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I :try_end_0 .catch Ljava/io/UnsupportedEncodingException; {:try_start_0 .. :try_end_0} :catch_0 .line 22 :goto_1 return-void .line 11 :cond_0 aget-byte v0, p1, v3 .line 12 .local v0, b:B and-int/lit16 v5, v0, 0xff invoke-static {v5}, Ljava/lang/Integer;->toHexString(I)Ljava/lang/String; move-result-object v5 invoke-virtual {v5}, Ljava/lang/String;->toUpperCase()Ljava/lang/String; move-result-object v5 invoke-virtual {v2, v5}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; .line 11 add-int/lit8 v3, v3, 0x1 goto :goto_0 .line 17 .end local v0 #b:B :catch_0 move-exception v1 .line 18 .local v1, e:Ljava/io/UnsupportedEncodingException; invoke-virtual {v1}, Ljava/io/UnsupportedEncodingException;->printStackTrace()V .line 19 const-string v3, "byte[2/2]decode-error" invoke-static {p0, v3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I goto :goto_1 .end method |
使い方はこの二行だけ。当然クラス名は適切な配置場所に変更。
1 2 |
const-string v3, "pixiv-a(BB)-引数1" invoke-static {v3, p1}, Lnet/pixiv/android/lib/a;->decodeEverything(Ljava/lang/String;[B)V |
元コードはこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package ***; import java.io.UnsupportedEncodingException; public class DecodeEverything { public static void decodeEverything(String key,String log){ android.util.Log.e(key,"String["+log+"]"); } public static void decodeEverything(String key,byte[] target){ StringBuffer sb = new StringBuffer(); for ( byte b : target ){ sb.append(Integer.toHexString( 0xFF & (int)b ).toUpperCase()); } android.util.Log.e(key,"byte[1/2]["+sb.toString()+"]"); try { android.util.Log.e(key,"byte[2/2]["+new String(target,"utf-8")+"]"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); android.util.Log.e(key,"byte[2/2]decode-error"); } } public static void decodeEverything(String key,java.util.List<String> target){ StringBuffer sb = new StringBuffer(); for(String t:target){ if(sb.length()!=0){ sb.append(","); } sb.append(t); } android.util.Log.e(key,"List<string>["+sb.toString()+"]"); } } |
リアル脱出ゲームTV(2014/01/03)のjs
Googleドライブで作ったアンケートフォームの共有状態を変更すると”回答も”一般公開される
Googleドライブには、アンケート等に使えるフォームを作成し 共有する機能があります。

ここから作成したフォーム、共有設定を限定公開にしない限り回答内容も共有されるみたいです。俺が知らないだけならそれでいい。
最初に適当なフォームを作ります。メッセージだけ編集して、画面下部のチェックボックス等はそのままです。今回は関係ないけど。

そしてフォームを送信ボタンを押して保存完了。

ここに表示されるurlを、googleのサービスからログアウトした状態で閲覧してみます。

はい。これがデフォルトの状態で、自分(フォームを作成したアカウントでgoogleにログインしている状態)以外に回答が公開されたりという事はありません。
安心してurlをみんなにシェアしましょう。
デフォルトの状態のファイルの詳細をGoogleドライブから開いてみるとこんな感じ。
対象のファイルにチェックを入れて、詳細の共有の鉛筆マークをクリックして共有状態も確認。

これ用語がわかりにくいんじゃないかと思うのですが、「下記のユーザーだけがアクセスできます」というのは
「下記のユーザーだけが(回答内容等のプライベートな内容に)アクセスできます」という意味で、フォームの表示 回答だけなら共有リンクというurlだけで可能です。
それはともかく、この文面を読んで「下記のユーザー(自分)だけがアクセスできます?それは困る」と変更ボタンを押して

ウェブ上で一般公開なり、リンクを知っている人全員なりに変更して保存を押したとします。

「注: アイテムは公開設定オプションに関わらず、ウェブに一般公開できます」の一文を見逃しながら。
この状態で、Googleのサービスからログアウトした状態で閲覧すると

右上に「このフォームを編集」と表示されています。クリックすると



はい、アンケート結果が流出しています
詳細の共有から公開設定オプションを限定公開から変更したのが原因。原因というか、Google的にこれは仕様なのでしょう。デフォルトが限定公開だし。
これが明らかなバグならGoogleに通報して報奨金貰って本名がgoogleに永久記録されるのにと思ってしまいました。

ここから作成したフォーム、共有設定を限定公開にしない限り回答内容も共有されるみたいです。俺が知らないだけならそれでいい。
最初に適当なフォームを作ります。メッセージだけ編集して、画面下部のチェックボックス等はそのままです。今回は関係ないけど。

そしてフォームを送信ボタンを押して保存完了。

ここに表示されるurlを、googleのサービスからログアウトした状態で閲覧してみます。

はい。これがデフォルトの状態で、自分(フォームを作成したアカウントでgoogleにログインしている状態)以外に回答が公開されたりという事はありません。
安心してurlをみんなにシェアしましょう。
デフォルトの状態のファイルの詳細をGoogleドライブから開いてみるとこんな感じ。
対象のファイルにチェックを入れて、詳細の共有の鉛筆マークをクリックして共有状態も確認。

これ用語がわかりにくいんじゃないかと思うのですが、「下記のユーザーだけがアクセスできます」というのは
「下記のユーザーだけが(回答内容等のプライベートな内容に)アクセスできます」という意味で、フォームの表示 回答だけなら共有リンクというurlだけで可能です。
それはともかく、この文面を読んで「下記のユーザー(自分)だけがアクセスできます?それは困る」と変更ボタンを押して

ウェブ上で一般公開なり、リンクを知っている人全員なりに変更して保存を押したとします。

「注: アイテムは公開設定オプションに関わらず、ウェブに一般公開できます」の一文を見逃しながら。
この状態で、Googleのサービスからログアウトした状態で閲覧すると

右上に「このフォームを編集」と表示されています。クリックすると



はい、アンケート結果が流出しています
詳細の共有から公開設定オプションを限定公開から変更したのが原因。原因というか、Google的にこれは仕様なのでしょう。デフォルトが限定公開だし。
これが明らかなバグならGoogleに通報して報奨金貰って本名がgoogleに永久記録されるのにと思ってしまいました。
テキストファイル、getデータ、はてやUAまでも、あらゆる入力から任意のコードが実行できるphpの脆弱性が発覚
phpが受け取ることの出来るあらゆる入力から任意のコードを実行出来る攻撃方法を俺が5分で発見しました。この攻撃手段はphpの機能を用いてphpコードを評価させ、自らを実行させるようになっていました。
通常バックドアはどうのこうのですが、この攻撃方法は隠す必要すらなくgetパラメーターやブラウザのユーザーエージェントにも潜むことが出来ます。
まず、俺が3分で思いついたコードがコレ。これがオチです。
preg_replace($_GET[“from”],$_GET[“to”],”);
一行目にあるpreg_replaceとは、正規表現検索と置換を行う関数。
この関数単独であれば無害なものですが、「preg_replace」には「/e」という修飾子をつけたとき、検索・置換の代わりにコンテンツを実行することができるオプションがあります。
続いて、俺はgetに以下のデータを渡す事を思いつきました
?from=%2F.*%2Fe&to=phpinfo()
1分で思いついたコードにデータを渡し、最終的に生み出されるのが以下のコード。
preg_replace(“/.*/e”,”phpinfo()”,”);
そしてこれをデコード(?)した結果が(ry
と、言うわけでgigazine様の
JPEG画像のEXIFヘッダにマルウェアを隠して実行させる新しい手口が登場 – GIGAZINEに対する当て付け記事です。
だってこれさあ、任意のコードが実行される可能性があるpreg_replace関数に外部のデータをそのまま渡すのが悪いのであって、それがexifかどうかは全然関係ないじゃん。上で例に出した通りgetでもいいしUAでもいいし。
確かに忘れがちではあるし、preg_replaceに値渡すときは注意しないとな って思うけど「JPEG画像のEXIFヘッダにマルウェアを隠して実行させる新しい手口」って言うのは正しいのかと激しく疑問であります。
そんな感じ。

?from=%2F.*%2Fe&to=exec(‘calc’)
で試したら当然の様に電卓が起動しました。当たり前。
・・あ、もしかしてすごい勘違いしてる系です?ハズカシ~
通常バックドアはどうのこうのですが、この攻撃方法は隠す必要すらなくgetパラメーターやブラウザのユーザーエージェントにも潜むことが出来ます。
まず、俺が3分で思いついたコードがコレ。これがオチです。
preg_replace($_GET[“from”],$_GET[“to”],”);
一行目にあるpreg_replaceとは、正規表現検索と置換を行う関数。
この関数単独であれば無害なものですが、「preg_replace」には「/e」という修飾子をつけたとき、検索・置換の代わりにコンテンツを実行することができるオプションがあります。
続いて、俺はgetに以下のデータを渡す事を思いつきました
?from=%2F.*%2Fe&to=phpinfo()
1分で思いついたコードにデータを渡し、最終的に生み出されるのが以下のコード。
preg_replace(“/.*/e”,”phpinfo()”,”);
そしてこれをデコード(?)した結果が(ry
と、言うわけでgigazine様の
JPEG画像のEXIFヘッダにマルウェアを隠して実行させる新しい手口が登場 – GIGAZINEに対する当て付け記事です。
だってこれさあ、任意のコードが実行される可能性があるpreg_replace関数に外部のデータをそのまま渡すのが悪いのであって、それがexifかどうかは全然関係ないじゃん。上で例に出した通りgetでもいいしUAでもいいし。
確かに忘れがちではあるし、preg_replaceに値渡すときは注意しないとな って思うけど「JPEG画像のEXIFヘッダにマルウェアを隠して実行させる新しい手口」って言うのは正しいのかと激しく疑問であります。
そんな感じ。

?from=%2F.*%2Fe&to=exec(‘calc’)
で試したら当然の様に電卓が起動しました。当たり前。
・・あ、もしかしてすごい勘違いしてる系です?ハズカシ~
windowsのタスクスケジューラで1分未満の定期実行を行う方法

はい。

はい。

こういう事。