タグ

ブックマーク / qiita.com/autotaker1984 (9)

  • ソフトウェアはなぜバージョンアップしなければならないのか - Qiita

    はじめに 社内インフラの運用担当者にとってソフトウェアのバージョンアップは地味な割に大変な業務です。 特に社内のオンプレサーバで動いているようなソフトウェアの場合、バージョンアップに伴う諸々の調整をそのソフトウェアを利用している各部署と行う必要があります。 そんなときに「今は忙しいからバージョンアップを先送りしてほしい」「このバージョンはスキップしてもよいのでは?」なんて声が各部署から聞こえてきます。バージョンアップの価値を各部署に理解してもらうのは大変です。 この文章はそんな時になぜバージョンアップしなければならないのかを上司や各部署のマネージャに伝えるために書きます。 ソフトウェアの有効期限は2-5年 まず、第一に、ソフトウェアというものは無限に使えるわけではなく、一定の有効期限があり、それを過ぎると徐々に動かなくなってきます。俗にいう「何もしてないのに動かなくなった問題」です。 なぜ

    ソフトウェアはなぜバージョンアップしなければならないのか - Qiita
  • 10年間使ってみて見えたHaskellの闇と光 - Qiita

    はじめに わたしがHaskellを使い始めてもうそろそろ10年目になります。(タイトルは多少サバを読んでいますね) これまで使ってきた感想をまとめます。 Haskellのつらいところ まずは愚痴らせてください。 コンパイルが遅い 依存モジュールはすべてソースコードからビルドする必要があります。(バイナリ形式のモジュールはありません) 最初のビルドに20分くらい待つのはザラです。 複雑な型システムをつかうと型推論や型レベル計算に時間がかかります。 高速なHaskellプログラムを書くためには多くの関数をインライン化する必要があります。最適化ビルドではインライン展開によってコードサイズが大きくなるので時間がかかります。 デバッグが難しい 公式のGHCiデバッガはありますが、今のところIDEから簡単に利用できるわけではないですし、コンパイル済みのライブラリはデバッグできないです。 近年スタックト

    10年間使ってみて見えたHaskellの闇と光 - Qiita
    igrep
    igrep 2021/03/02
    待ち時間は漫画読むかTwitterするのがいいよ
  • 新卒1年目が荒れ果てた開発環境に1年間でCIを導入し単体テストを布教した話 - Qiita

    この記事は 「Develop fun!」を体現する Works Human Intelligence Advent Calendar 2020 21日目の記事です。 昨日の記事は@sparklingbabyさんのStream API がもっとわかる記事でした。 あらすじ 私は2019年にWorks Human Intelligence(正確には分社前の会社)に新卒入社し、 19年10月からプロダクト開発部門に配属され、SETエンジニアとしてとある製品のJava開発環境の改善に取り組んでいます。 ざっくりとプロダクト開発を紹介するとこんな感じです。 3万クラス程度ある大規模Java Webアプリケーション 開発環境はEclipseを使用 開発者のOSはWindowsのみ Before 私が開発チームに参加した時点では 部門として新規開発に注力しており、足下の環境改善をやる担当者がおらず、 い

    新卒1年目が荒れ果てた開発環境に1年間でCIを導入し単体テストを布教した話 - Qiita
    igrep
    igrep 2020/12/22
    感動の超大作
  • REST APIを簡単にMockできるツールSmopeckの紹介 - Qiita

    はじめに 最近のウェブアプリではバックエンドをREST-APIとして用意し、 フロントエンドはREST-APIから引っ張ってきたデータをReactVueといったフレームワークで描画することが多いと思います。 このようなウェブアプリを開発する際に問題となるのはバックエンドとフロントエンドを並行して開発しにくいということです。バックエンドができなければフロントエンドはどんなデータが来るのかわからず描画できませんし、バックエンドもフロントエンドからどのようなリクエストが来るか決まらないと実装ができません。 そのため、最初にREST-APIの仕様を定めて、その仕様に沿ったモックサーバを作成し、 フロントエンドはバックエンドが完成するまでそれを用いて開発を進めるということが行われます。 さてそのREST-APIの仕様とはどのように記述されるのでしょうか? 1. 自然言語で記述する 一番よくある場合

    REST APIを簡単にMockできるツールSmopeckの紹介 - Qiita
  • AtCoderの入力処理コードを自動生成してみた - Qiita

    はじめに 競技プログラミングに参加していて解法が思いつかない時、「とりあえず入力を受け取るコードを書いて落ち着こう」となったことはありませんか。 どんなに難しい問題でも入力を受け取る部分を書くところは何も考えずに書けますからね。 しかし入力部分を何も考えずに手を動かすだけで書けるのであれば、なぜ自動化しないのでしょうか。 ということで実際にやってみました。 autotaker/kyopro Install haskell製ツールなのでinstallにはstackもしくはcabalが必要です。

    AtCoderの入力処理コードを自動生成してみた - Qiita
  • foldl vs. foldl'に終止符を打つ - Qiita

    今から5年ほど前、base-4.7.0.2(GHC 7.8.4)の時代まで、foldlは以下のように定義されていました。 foldl :: (b -> a -> b) -> b -> [a] -> b foldl f z0 xs0 = lgo z0 xs0 where lgo z [] = z lgo z (x:xs) = lgo (f z x) xs

    foldl vs. foldl'に終止符を打つ - Qiita
    igrep
    igrep 2019/02/25
  • GHCの融合変換を理解する(前編) - Qiita

    module Sum where sum123 :: Int sum123 = sum [1,2,3] $ stack ghc -- -O Sum.hs $ stack ghc -- --show-iface Sum.hi (中略) 1eb3421a20d14a1255f6f5adccf8e3bd sum123 :: GHC.Types.Int {- HasNoCafRefs, Strictness: m, Unfolding: (GHC.Types.I# 6#) -} 今回の記事では、GHCはどのように6を計算しているのか解説します。ポイントはリストリテラルの脱糖と、fold/build変換です。 リストリテラル ghcに-ddump-dsオプションを渡すと脱糖の結果をみることができます。 -Oオプションがない場合、GHCは[1,2,3]を1 : 2: 3 : []に脱糖します。 $ s

    GHCの融合変換を理解する(前編) - Qiita
    igrep
    igrep 2019/02/15
    foldlでも最適化を有効にすればいい感じにしてくれる話
  • GHC/RTSのGCについて - Qiita

    Haskellで効率の良いコードを書くためにはいかに不要なサンクを潰すか、ということが重要だと言われています。しかし、そもそもなぜサンクが増えると効率が悪くなるのでしょうか。 Haskellのメモリ確保は高速 まず、Haskellにおいてメモリの確保はどの程度コストがかかるものなのでしょうか。次のプログラムを使って確かめてみましょう。 {-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC "-ddump-simpl" #-} module Main2 where bench :: Int -> (a -> a) -> a -> a bench n f i = go n i where go 0 !i = i go k !i = go (k-1) (f i) {-# NOINLINE bench #-} main :: IO () main = prin

    GHC/RTSのGCについて - Qiita
    igrep
    igrep 2019/01/29
    あまり見かけたことがない解説なので非常にありがたい!
  • 動的計画法にData.Vector.constructNは使うべきではない。 - Qiita

    -- | /O(n)/ Construct a vector with @n@ elements by repeatedly applying the -- generator function to the already constructed part of the vector. -- -- > constructN 3 f = let a = f <> ; b = f <a> ; c = f <a,b> in f <a,b,c> -- constructN :: Int -> (Vector a -> a) -> Vector a ソース コメントからわかるように、constructNは引数として整数nと配列の要素を生成する関数fを受け取って長さnの配列を生成する。 この時、生成関数fは「0からn-1番目まで生成された配列」から「n番目の要素」を返すようにする。 さてこの関数を使

    動的計画法にData.Vector.constructNは使うべきではない。 - Qiita
    igrep
    igrep 2019/01/23
    “Data.Vector.Vectorは非正格なので取り扱いに注意すべし。 Data.Vector.Strictみたいなものがあれば良いのだが。”
  • 1