はてなキーワード: parseとは
import requests import json from urllib.parse import quote def fetch_bookmarks(url): try: # URLをエスケープ escaped_url = quote(url, safe="") api_url = f"https://b.hatena.ne.jp/entry/json/?url={escaped_url}" response = requests.get(api_url) response.raise_for_status() try: return response.json() except json.decoder.JSONDecodeError as e: print(f"Error decoding JSON from {api_url}: {e}") print("Response content:", response.text) return [] except requests.exceptions.RequestException as e: print(f"Error fetching bookmarks from {api_url}: {e}") return [] def find_common_bookmarks(bookmarks1, bookmarks2, url1, url2): common_users = set(bm["user"] for bm in bookmarks1 if bm["comment"]) & set(bm["user"] for bm in bookmarks2 if bm["comment"]) common_bookmarks = [] for user in common_users: comments = [] for bm in bookmarks1: if bm["user"] == user and bm["comment"]: comments.append({"url": url1, "comment": bm["comment"], "timestamp": bm["timestamp"]}) break for bm in bookmarks2: if bm["user"] == user and bm["comment"]: comments.append({"url": url2, "comment": bm["comment"], "timestamp": bm["timestamp"]}) break if len(comments) == 2: common_bookmarks.append({"user": user, "comments": comments}) return common_bookmarks if __name__ == "__main__": url1 = "https://news.yahoo.co.jp/articles/f9966c4ccc374fc88babbb50175a9ea844c99638" url2 = "https://www.asahi.com/articles/ASN6K7F64N6KUJHB00L.html" data1 = fetch_bookmarks(url1) data2 = fetch_bookmarks(url2) common_bookmarks = find_common_bookmarks(data1["bookmarks"], data2["bookmarks"], url1, url2) print(json.dumps(common_bookmarks, indent=2, ensure_ascii=False))
url1, url2のところを対象としたいものに変えれば使えるよ
バグあったら直して使ってね
※架空言語、という事にしておいてほしいんだが
List<Record> rows = DBから持ってくる(); // 合計金額を求める String total = "0"; for (Record r : rows) { BigDecimal temp = BigDecimal.parse( カンマを削除する関数(total) ); BigDecimal temp2 = temp + r.金額; total = カンマ区切りの文字列にする関数(temp2); } // やったー合計金額を計算してカンマ区切りの文字列にできたよー return total;
とか
// async await は非同期処理を同期してくれる魔法の言葉だって!よく知らんけど await axios.get('/foo') .then(function(result) { // やったー結果が得られたよー });
とか
正直なところ、こういうコードのお守りするの、そろそろキツい。。。
たとえは、0 / float.Parse("0") とかすると、Infinity になるんじゃね?まずいと思うが。
この時期になるとずっと気象庁の気温ランキングを眺めて「今日も暑いなー」って見てるんだが
https://www.data.jma.go.jp/obd/stats/data/mdrr/rank_daily/data00.html
このページの「観測値」が昔からずっとバグっててめっちゃ気になってる
「35.9 ]」っていう感じで、「]」が入ってる
もうバグの原因はほぼほぼ目に見えてて、ここはJSONで「 [ 34.0, 34.5, 35.0, 35.9 ]」っていう値が入ってて
それをJSON.parseするんじゃなくてsplit()とか使ってしかもlength-1とかで最新値を取ってる
なので後ろの括弧がそのまま入ってしまってる
こんなのめちゃくちゃわかりやすいバグだし、多分気象庁側も把握してるんだろうけど
多分発注しないとダメとかテストが必要だとかでずっと放置されてる
不正解でscore += 0; と書いているのは静的解析がelse節を省略すると指摘してくるから。
何もしていない、はそのとおり。
不等号がいい具合に化けてるのでそのままにしておく。
import java.util.*; public class Main { public static void main(String[] args) { // 入力のparse (中略:int numに問題の数、String list[i][] に問題のリストを格納している) // 採点 int point = 0; for (int i = 0; i < num; i++) { String question = list[i][0]; String answer = list[i][1]; if (question.equals(answer)) { // 完全一致 point += 2; } else { if (question.length() == answer.length()) { // 文字数は等しい(部分点の可能性がある) point += scoring(question, answer); } else { // 不正解 point += 0; } } } System.out.println(point); } // 長さが同じ文字列を採点する // 長さが違う文字列を受け渡したときは正しく動作しない private static int scoring(String question, String answer) { int length = question.length(); int score = 2; for (int i = 0; i < length; i++) { (中略:文字が違うたびにscoreを-1して、socreが0以下になったらそのままreturn) } return score; } }
C#の入門書を読んでいて、第4章くらいに4ページくらい割いて書いてあるキャスト
( )で変換するのと int.Parse() で変換するのとどう違うのか(どちらか片方でいいのではないか)をネットで調べ、
なんか as とか int.TryParse() とか出てきてあーんー参照型と値型がーになってダウンキャストとポリフォーニズムでお昼ごはんが夜ご飯になったところで切り上げた
型の違う数値同士のときが ( ) で、文字列から数値に変換したいときが int.Parse() とかだな
入門書に書いてあるそのまんまだな
もういいや次ページ行こう全然進まん
では横ですが、ワテクシの特技のRを少々……
eval(parse(text=paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(paste0(
いま、この「はてな匿名ダイアリーの自分の全記事を一括削除するスクリプト」は、動かない?
・POSTに与える最後の csrf を取ってくる parse が間違って、 rkm= が空になっている。正規表現で parse していたのを直して、 o+XXXXXXXXXXXXXXX/g を拾ってくるようにした。
・POSTに与える delete=が元々の %8d%ed%8f%9c%82%b7%82%e9 でも削除できないし、「 %e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b 」でも削除できなかったし、これってマジックナンバーなん?
1. こんな感じで使います。
$ python parser.py sample.py
import parser code = ''' a = 1 + 1 print(a) ''' graph = parser.create_graph(code) graph.render("sample")
import ast import sys import graphviz def create_graph(lines): graph = graphviz.Graph(format='png') root = ast.parse(lines) node_list = [root] _setup(graph, node_list) return graph def _setup(graph, node_list): # node node = node_list[-1] node_identity = str(len(node_list)) node_name = type(node).__name__ graph.node(node_identity, node_name) # children for child in ast.iter_child_nodes(node): node_list.append(child) child_identity = str(len(node_list)) graph.edge(node_identity, child_identity) _setup(graph, node_list) if __name__ == '__main__': file_name = sys.argv[1] with open(file_name) as file: lines = file.read() graph = create_graph(lines) graph.render(file_name)
Facebook は VR の雄 Oculus も買っています。今は VR といえば Oculus ですが、VR にはどんどん大きな会社が参入してきています。近いうちに Oculus の影響力は下がっていくことでしょう。それを見た Facebook の経営層は、Parse と同じ判断をするはずです。その時、Oculus 用のソフトを開発していた人たちは、今の Parse で開発していた人たちと同じ辛さを経験するでしょう。これを予見できる開発者たちは、早期に Oculus から撤退するはずです。そうすると VR に対する Oculus の影響力は加速度的に小さくなります。
つまり、何が言いたいかというと、今回の判断は開発者の Facebook 離れを引き起こす判断であり、Facebook に買われたサービスは衰退することを宿命づけてしまった大きな事件の一つだったということです。
Excelを持っているならはてブのJSONデータをそのまま取り込めるそうだからそのデータを使ってブクマが付いた時間のグラフが描けそう。
例えばこんな感じでJSONデータが取れる。 http://b.hatena.ne.jp/entry/jsonlite/https://anond.hatelabo.jp/20180315232737
Excel持ってないならスクリプトでCSVにしてしまえばいい。
rubyスクリプトだとこんな感じ。(Mechanize無し版に差し替え。なぜMechanizeを使っていたかと言うとはてブがUser-Agentが空だと値を返してくれないから。ちょっと長くなるが自前でUAを渡すようにした。)
#!/usr/bin/ruby
site = ARGV[0]
json_uri = URI.parse("http://b.hatena.ne.jp/entry/jsonlite/%s" % [site])
response = Net::HTTP.start(json_uri.host, json_uri.port) do |http|
http.get(json_uri.path, "User-Agent" => "Mozilla/5.0")
end
json_data = JSON.parse(response.body)
json_data['bookmarks'].each do |bookmark|
puts [bookmark['user'], bookmark['timestamp'], bookmark['comment'], bookmark['tags'].to_s].to_csv
end
引数に取得したいページのURLを入れる。hatebuapi-csv.rbという名前で保存したとしたらこんな感じで実行。
% hatebuapi-csv.rb https://anond.hatelabo.jp/20180315######## > 結果.csv
結構簡単にできた。
ここから、ページ切り替えてURLを収集する処理も追加すれば、
クローロング部分は完成。
require 'nokogiri'
url = 'http://ja.aliexpress.com/category/200003482/dresses.html?spm=2114.52010108.6.7.gT0qlW&addpid=32546825642&isOnSale=yes%22'
charset = nil
end
doc = Nokogiri::HTML.parse(html, nil, charset)
num=0
doc.css('a[class = "product "]').each do |product|
p product.attribute("href").text
p num = num+1
end
skrsvideo
今回プログラミング言語はRubyを選択したため、基本的にはVPS・クラウド的なサーバーでLinuxが動作する環境を探しました。
エロサイトを運営するにあたって問題になるのがサーバー選びです。
基本的に日本のレンタルサーバーではアダルトサイトの運用を禁止しています。
普段使っているさくらのVPSが利用できず、AWSもなんだかグレーな感じ(東京リージョン以外なら・・・?)
そんなわけで探し、GMOグループのWebkeepersを使いました。
使っても良いよ〜というお墨付き、
そして価格も手頃だったためここに決定。
DB | MariaDB |
---|---|
Webサーバ | Nginx |
フレームワーク | Ruby on Rails |
MariaDBを選んだ理由はなんとなく、MySQLとの違いはほぼありません。利用するGEMもmysql2でいけます。
ちなみにJavaScriptは使わずすべてCSSで作る方針にしました。
スマホ・PC両対応のためにMedia Queryでレスポンシブにしています。
↓
↓
↓
という流れです
gem 'nokogiri'
フロントはhamlとsassで、難しいことはしていないのでcompassはいれませんでした。
あとはデバッグ用にrails_config、pry系が入っています。
skrsvideoでは動画のURLを取得するためにクローラーもどきでスケジューリングして収集しています。
コマンドはこんな感じ
Rakeタスクはnokogiriでxvideosへのリンクを集めています。
doc = Nokogiri::XML( open(URI.parse(url)).read )
urls = []
urls.push link[:href] if link[:href] =~ /xvideos.com\/video(\d+)/
end
Nokogiriのスクレイピングでaタグのリンクを取得し、URLがxvideosのものかチェックして保存って感じです。
動画を探し終えるとaタグからランダムでピックアップし次のページに進んでいきます・
動画が見つかったページはドメインをDBに記録して、しばらくしたら再びクローリングをするようにし、収集の効率化。
30分以上の表示はちょっと頑張ったところ
これはタイトルの文字列から部分一致で引っかかったものを表示しています。
AV女優の名前を表示するためにWikipediaからとってきたら、ちょっと膨大な数になってしまったため断念。
DMMのランキングに載っていた方だけをとりあえず入れています。
C# で書くと
var ep = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("255.255.255.255"), 2048);
var soc = new System.Net.Sockets.UdpClient(ep);
とすれば
型 'System.Net.Sockets.SocketException' のハンドルされていない例外が System.dll で発生しました
と例外が発生する。
ここは
var u = new System.Net.Sockets.UdpClient();
と空のUDPソケットを作成しておいて、Send メソッドでアドレスを指定する方法をとる。
ちなみに u.EnableBroadcast には false を代入しても、私の環境ではなぜだかうまく送信された。