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;
SQLServerの浮動小数の仮数の指定
マニュアルをみると、float [ (n) ]
と記載されているので、n
を指定できるように思えます。
実際create table
でfloat(14)
などとしてもエラーになります。
CREATE TABLE [dbo].[TBL_foo]( [x_float] [float(14)] NULL, )
メッセージ 2715、レベル 16、状態 6、行 3 列、パラメーター、または変数 #1: データ型 float(14) が見つかりません。
すぐ下の注意にあるように、n=23 か n=53 として扱われます。
Haskellにはforがない。でもループのインデックスみたいなやつを使いたいとき。
> ['a','b','c']
のようなリストを扱っているときに、インデックスも使って処理をしたい時があるかもしれません。
その場合は自分でインデックスを付与してあげます。
> zip [0..] ['a','b','c'] [(0,'a'),(1,'b'),(2,'c')] >
fold
系の関数を使うときに、タプルで受け取って処理をすればよいと思います。
> foldl (\acc (idx,x)-> acc ++ (show (idx,x))) "" $ zip [0..] ['a','b','c'] "(0,'a')(1,'b')(2,'c')" >