JavaでjQueryライクにXMLを操作する
Unfoldの使いどころ
haskell
のコーディングでfoldr
は頻繁に使う印象がありますが。その双対(で、あってるのかな?)のunfold
は、あまり使わない印象があります。というか、使いどころのイメージがつかめませんでした。
この前、n進数間の変換に使えることに気づきました。
が、n進数間の変換にunfold
を使うのは、教科書の定番のようです。教科書をしっかり読むべきでした。
Programming in Haskellの7.9の練習問題6など。
実際にやりたかったことは、数値をバイナリにすることだったのですが、
generate :: (Num a, Integral b, B.Bits b) => b -> Maybe (a, b) generate val = if val == 0 then Nothing else Just (fromIntegral $ val B..&. 0xFF, val `B.shift` (-8))
を定義しておくと、
> :t Data.List.unfoldr generate 0x0efed Data.List.unfoldr generate 0x0efed :: Num a => [a] > Data.List.unfoldr generate 0x0efed [237,239] >
> :t Data.ByteString.unfoldr generate 0x0efed Data.ByteString.unfoldr generate 0x0efed :: B8.ByteString > Data.ByteString.unfoldr generate 0x0efed "\237\239"
ができます。
unfolrを使い分けることによって、結果を変えることができます。
Data.BinaryのputとputByteString
ByteString
がBinary
クラスのインスタンスになっているので、put
とputByteString
は同じものかと思ったのですが、差がありました。
> runPut $ put $ BSL.pack [0xFF,0xFE,0xFD] "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ETX\255\254\253" > runPut $ putLazyByteString $ BSL.pack [0xFF,0xFE,0xFD] "\255\254\253" ``` 実装を見ると```ByteString```の```Binary```のインスタンスは、バイト列だけでなく、その長さの情報もデコードしています。
Haskellのerrorで嵌る
次のような作りかけのコードを書いていました。error
の部分はあとで修正していくつもりでした。コーディングが進んで、error
の部分をコーディングする段階に来たのですが、show t
の内容が出力されませんでした。
paramMetaData2TypeString_ (VAR tipe len) = case tipe of (VARLEN_BYTELEN_TYPE t) -> case t of INTNTYPE -> case (lengthTYPE_VARLEN len) of 0x01 -> "tinyint" 0x02 -> "smallint" 0x04 -> "int" 0x08 -> "bigint" _ -> error "not yet implemented. type=" ++ (show t) -- TODO
結局error
の後に$
が抜けているだけなのです。
ただ、$
がなくてもタイプチェックになってしまうのが落とし穴でした。
> > :t error error :: [Char] -> a > error "foo" *** Exception: foo CallStack (from HasCallStack): error, called at <interactive>:25:1 in interactive:Ghci2 > :t error "foo" error "foo" :: a > -- $をつけない > error "foo" ++ show "bar" "*** Exception: foo CallStack (from HasCallStack): error, called at <interactive>:27:1 in interactive:Ghci2 > :t error "foo" ++ show "bar" error "foo" ++ show "bar" :: [Char] > -- $をつける > error $ "foo" ++ show "bar" *** Exception: foo"bar" CallStack (from HasCallStack): error, called at <interactive>:32:1 in interactive:Ghci2 > :t error $ "foo" ++ show "bar" error $ "foo" ++ show "bar" :: a >
Haskellの時間で嵌る
UTCTime
はDay
と`DiffTime
から構成されます。DiffTime
はドキュメントに0 <= t < 86401s
の範囲と記載されていますが、範囲以上でも動いてしまうようです。
> y = secondsToDiffTime 60 * 60 * 24 > z2 = UTCTime (fromGregorian 2018 11 17) y > z2 2018-11-17 23:59:60 UTC > y = secondsToDiffTime 60 * 60 * 24 + 1 > z2 = UTCTime (fromGregorian 2018 11 17) y > z2 2018-11-17 23:59:61 UTC > y = secondsToDiffTime 60 * 60 * 24 + 100 > z2 = UTCTime (fromGregorian 2018 11 17) y > z2 2018-11-17 23:59:160 UTC
Javaのlambdaやstreamのベストプラクティスは?
Best Practices using Java 8 Lambdas | Baeldung
StreamAPIコーディング規約
StreamAPIパフォーマンス注意点
The perilously long lambda
Java 8 idioms: Why the perfect lambda expression is just one line
- その他
import java.util.Arrays; public class Main { public static void main(String[] args) { String[] list01 = {"a", "b", "c"}; String[] ret01 = Arrays.stream(list01) .map(Main::addSquareBracket) .toArray(String[]::new); Arrays.stream(ret01).forEach(System.out::println); // debug } private static String addSquareBracket(String s) { return "[" + s + "]"; // 複雑な処理のつもり } }
SQLServer Management Studioの上位200件の編集で、decimal(38,0)は扱えない模様
直接セルを入力しようとすると20桁までしか受け付けてくれません。38桁の値をSQLで設定した後にみると、<ファイルを読み取れません>
となります。
update TBL_DECIMAL set x_decimal_38_0 = 99999999999999999999999999999999999999 where x_id = 13;