Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    callmekohei
    @callmekohei
    ガブさん!できました〜!ありがとうございます!タプルなんですね!なるほどです!
    (path , Http.RequestString ( url ) )
    |> System.IO.File.WriteAllText
    omanuke
    @omanuke
    改めてで、結局どうしたらいいのよ感ある(´・ω・`) https://fsharp.github.io/2015/04/18/fsharp-core-notes.html#do-deploy-fsharp-core-as-part-of-your-application
    Kouji Matsui
    @kekyo
    PCLとか泣けてくる
    ritalin
    @ritalin
    [オフトピ] 開発者から愛される言語、第3位(Stack Overflow調べ)おめでとうございます http://www.infoq.com/jp/news/2016/03/stack-overflow-survey-2016
    Yukitoshi Suzuki
    @yukitos
    :tada:
    callmekohei
    @callmekohei
    :tada:
    callmekohei
    @callmekohei

    <FSharp.Data.dllというライブラリでの文字化けに関して>

    度々すみません。下記コードを実行すると日本語の部分が文字化けします。vimだけでなくvisual studio community 2015でも同様な症状が出ます。回避方法あればお知恵頂けると嬉しいです。

    #r "FSharp.Data.dll"
    open FSharp.Data
    
    module Test =
    
        let url = "http://www.aozora.gr.jp/index_pages/person81.html" 
        let results = HtmlDocument.Load ( url )
        results |> printfn "%A"

    結果

          <tr>
            <td class="header">作家名読み:</td><td>みやざわ けんじ</td>
          </tr>
    callmekohei
    @callmekohei
    あ、この青空文庫のときだけ文字化けして、例えばwikiのネコのページとかは文字化けしないのでサイトの問題ですね、、(^_^;;;
    adacola
    @adacola
    そのサイトの文字コードは本来はUTF-8ですが、レスポンスヘッダのContent-Typecharset指定がないのでおそらくLatin-1とかでエンコードされて文字化けしてますね
    HtmlDocument.Loadでは文字化けを回避する方法はないように思えます
    Http.RequestStringとかを使って文字列としてダウンロードしてからHtmlDocument.Parseを呼ぶのがいいと思われますが、どうやらそのサイトは適切にリクエストヘッダを指定しないとまともにレスポンス返してくれないっぽいのでがんばってくださいw
    callmekohei
    @callmekohei
    アダコーラさん!ありがとうございます!なるほどです!勉強になります!回避方法はなさそうなんですね、、、。ちゃんと表示されるwikiPediaで学習します。ありがとうございます(≧∇≦)
    adacola
    @adacola
    他のサイトでも目的が達成されるのであれば他のサイト使うのがいいですねw
    adacola
    @adacola
    ちなみに回避する方法がないのはあくまでHtmlDocument.Loadを使う場合で、文字化けしないようにして文字列としてダウンロードした後HtmlDocument.Parseに食わせれば回避できますよー。(適切にリクエストヘッダと文字コード指定してその方法で回避できたのを確認)
    callmekohei
    @callmekohei
    アダコーラさん!おはようございます!おおお。回避できるんですね。ちょっとやってみます!ありがとうございます!(^_^)/
    Kouji Matsui
    @kekyo
    FSharp.DataにHtml Parserがあるという事実を知って震えている (*´Д`)
    bleis-tift
    @bleis-tift
    誰かPR送るんじゃ~
    encodingStrとは・・・
    bleis-tift
    @bleis-tift
    encodingStrはリクエスト飛ばすときじゃなくて、レスポンスとして返ってきたもののエンコーディングにしか効かないっぽい
    bleis-tift
    @bleis-tift
    アルファベット順で逐一書いていくよりも、グループ別にまとめたほうがきれいだと思うんだけどな

    例えばこんな感じでアクティブパターン作れば、

    let (|HeaderEnum|_|) key =
      match key with
      | "accept-charset" -> Some HeaderEnum.AcceptCharset
      | ...
      | _ -> None

    意味も明白になる。

    match header.ToLowerInvariant() with
    | HeaderEnum key -> req.Headers.[key] <- value
    | ...
    adacola
    @adacola
    レスポンスのエンコーディングを強制的に変える機能は、accept-charsetヘッダでの指定をガン無視するサイト(i.e. 今回のサイト)もあるのでそれに対応するための機能として必要かなと思うんですが、encodingStrの型がSystem.Text.Encodingじゃなくて文字列なのがちょっと…
    Kouji Matsui
    @kekyo
    F#のAsync computationの式内で発生した例外は、Context outsideに向けて再スローするときにExceptionDispatcherInfo使うのだろうか...
    Better async stack tracesってのがありますね
    Kouji Matsui
    @kekyo
    自己解決: .NET 40 TaskでWait()とかResultしたときに内部で発生した例外はAggregateExceptionに内包されるしかなく、.NET 40ではawaitの文脈はないので(=ExceptionDispatcherInfoの実装もない)、AggregateExceptionに内包されるのは不可避。.NET 45でawaitした場合は、async method内でtry-catchする場合においては、catch型はスローされた型で問題ない(AggregateExceptionに内包されない・ExceptionDispatcherInfoを使う)けど、ひとたびasync context外に出ると、そこにはWait()かResultが待っているので、そこでAggregateExceptionに内包される。この流れがAsync computation式でも式外に出た時に同じと考えれば、式内ではスローされた型を直接扱えるけど、式外に出たらAggregateExceptionに内包される、という流れに対応する。 長い (*´Д`)
    Kouji Matsui
    @kekyo

    確かめてみた:

    > let asyncTest = async {
      failwith "hoge"
    };;
    
    val asyncTest : Async<unit>
    
    > try asyncTest |> Async.StartImmediate with
      | _ as ex -> printfn "%A" ex;;
    System.Exception: hoge
       場所 <StartupCode$FSharp-Core>.$Control.StartImmediate@1471-1.Invoke(Exception exn)
       場所 Microsoft.FSharp.Control.CancellationTokenOps.StartWithContinuations@1230-1.Invoke(Exception x)
       場所 <StartupCode$FSharp-Core>.$Control.loop@425-40(Trampoline this, FSharpFunc`2 action)
       場所 Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)
       場所 Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)
       場所 Microsoft.FSharp.Control.AsyncBuilderImpl.startAsync[a](CancellationToken cancellationToken, FSharpFunc`2 cont, FSharpFunc`2 econt, FSharpFunc`2 ccont, FSharpAsync`1 p)
       場所 Microsoft.FSharp.Control.CancellationTokenOps.StartWithContinuations[T](CancellationToken token, FSharpAsync`1 a, FSharpFunc`2 cont, FSharpFunc`2 econt, FSharpFunc`2 ccont)
       場所 Microsoft.FSharp.Control.FSharpAsync.StartWithContinuations[T](FSharpAsync`1 computation, FSharpFunc`2 continuation, FSharpFunc`2 exceptionContinuation, FSharpFunc`2 cancellationContinuation, FSharpOption`1 cancellationToken)
       場所 Microsoft.FSharp.Control.FSharpAsync.StartImmediate(FSharpAsync`1 computation, FSharpOption`1 cancellationToken)
       場所 <StartupCode$FSI_0009>.$FSI_0009.main@()
    val it : unit = ()
    
    > try asyncTest |> Async.Start with
      | _ as ex -> printfn "%A" ex;;
    val it : unit = ()
    > System.Exception: hoge
       場所 Microsoft.FSharp.Control.CancellationTokenOps.Start@1224-1.Invoke(Exception e)
       場所 <StartupCode$FSharp-Core>.$Control.loop@425-40(Trampoline this, FSharpFunc`2 action)
       場所 Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)
       場所 Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)
       場所 <StartupCode$FSharp-Core>.$Control.-ctor@510-1.Invoke(Object state)
       場所 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
       場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       場所 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
       場所 System.Threading.ThreadPoolWorkQueue.Dispatch()
       場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
    エラーのため停止しました

    StartImmediateすると、現在のスレッドを使用して式を実行するので、発生した例外は順当にcatchされる。Startした場合は別のスレッドで実行され、そこで発生した例外を、式外で受ける事は出来ない(?) スレッド死んだことになっているような...

    Async.Start -> unitなので、TaskみたいにWait出来ないから仕方がない?
    callmekohei
    @callmekohei

    <XML/RSSの取得について>

    ほんとうに度々すみません。プログラミングF#の187ページ(例7−11)のようにXMLをパターンマッチにかけて表示させるコードを書きたいです。まずはXMLを表示させようと思いましたが、空のseqが返ってきます。とくには間違ってないとは思うのですが、、、。ヒントを頂けるとうれしいです。長文すみません。
    .

    やりたいこと

    こんな感じでXML/RSSを取得したい!

    <item>
        <title>【 29日(火) 福岡(福岡) 】 晴後曇 - 20℃/8℃ - Yahoo!天気・災害</title>
        <link>
        http://rdsig.yahoo.co.jp/weather/rss/RV=1/RU=aHR0cDovL3dlYXRoZXIueWFob28uY28uanAvd2VhdGhlci9qcC80MC84MjEwLmh0bWw_ZD0yMDE2MDMyOQ--
        </link>
        <description>晴後曇 - 20℃/8℃</description>
        <pubDate>Tue, 29 Mar 2016 05:00:00 +0900</pubDate>
    </item>

    .
    最終的にやりたいことは、、、

    <title> .... </title> と挟まれている文字列だけを抜き出したい!

    29日(火) 福岡(福岡) 】 晴後曇 - 20℃/8℃ - Yahoo!天気・災害
     【 30日(水) 福岡(福岡) 】 晴時々曇 - 21℃/12℃ - Yahoo!天気・災害

    .

    コード

    #r @"../lib/FSharp.Data.dll"
    #r @"../../System.Xml.dll"
    open FSharp.Data
    open System.Xml
    
    module Test_XML =
    
        // XML source
        let xmlDoc = 
            let url =  "http://rss.weather.yahoo.co.jp/rss/days/8210.xml"
            let doc = new System.Xml.XmlDocument()
            doc.LoadXml (Http.RequestString ( url ) )
            doc
    
        xmlDoc |> printfn "%A"

    結果

    seq
      [seq [];
       seq [seq [seq [seq []]; seq [seq []]; seq [seq []]; seq [seq []]; ...]]]
    Yukitoshi Suzuki
    @yukitos
    seqがそれなりな構造に対応して並んでいるように見えるので単に%Aでは表示されていないだけでは?
    callmekohei
    @callmekohei
    いろいろやってみたのですが、たとえば下記でやってみても最終的に<null>になっているので、実データーが入ってないような気がするのですが、、、。
        xmlDoc.ChildNodes.ItemOf (0) |> printfn "%A"
        xmlDoc.ChildNodes.ItemOf (1) |> printfn "%A"
        xmlDoc.ChildNodes.ItemOf (2) |> printfn "%A"
    seq []
    seq [seq [seq [seq []]; seq [seq []]; seq [seq []]; seq [seq []]; ...]]
    <null>
    Yukitoshi Suzuki
    @yukitos
    Http.RequestString ( url )の戻り値にはちゃんとデータが入っているんです?
    callmekohei
    @callmekohei
    文字列としてばっちり取得できてます(^_^)
        let url =  "http://rss.weather.yahoo.co.jp/rss/days/8210.xml"
        Http.RequestString ( url )  |> printfn "%A"
    //一部のみここでは表示。。。
    "<?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0"><channel><title>Yahoo!天気・災害 - 福岡(福岡)の天気</title><link>htt
    bleis-tift
    @bleis-tift
    それはXmlDocumentがそのように出しているだけですね
    OuterXmlすればちゃんと読み込めていることがわかるはずです
    まぁ、XmlDocumentじゃなくてXDocument使ったほうがいい、とかそういう話はあります
    Yukitoshi Suzuki
    @yukitos
    "%A"はそれほどには万能じゃないということですね;)
    bleis-tift
    @bleis-tift
    ですね。ちなみに、XDocumentであれば%Aでいい感じに表示されます。
    omanuke
    @omanuke
    F#の型じゃない奴はToStringの内容とか出してるんでしたっけ?
    bleis-tift
    @bleis-tift
    ToStringとも違うものが出てるっぽいんですよねー
    DebuggerDisplayとか見てるんだろうか
    callmekohei
    @callmekohei
    This message was deleted
    Kouji Matsui
    @kekyo
    別解してみた:
    open System.Net.Http
    open System.Xml.Linq
    
    let asyncFetch (url: string) = async {
        use httpClient = new HttpClient()
        use! stream = httpClient.GetStreamAsync url |> Async.AwaitTask
        return XDocument.Load(stream)
      }
    
    [<EntryPoint>]
    let main argv = 
        let doc = asyncFetch "http://rss.weather.yahoo.co.jp/rss/days/8210.xml" |> Async.RunSynchronously
        printfn "%A" doc
        0
    %Aはここらへんかな
    うっわ、この読む気なくす実装・・・
    omanuke
    @omanuke
    いろいろやってくれるのはわかったのでもうおなかいっぱいです(´・ω・`)