basyura's blog

あしたになったらほんきだす。

休み

ひさびさ。

大きめのシステムアップデートして 1 週間常駐。問題がいくつか発生して延長。そうなるだろうなとは思っていたもののテストはかなりしていたので残念。ひとまずの対策で回避して退却。そして休み。さすがに働きすぎたが一番辛かったのはパイプ椅子生活と食生活。

  • 朝 : コンビニのサンドイッチ
  • 昼 : コンビニのおにぎり
  • 夜 : コンビニのおにぎり

が続いたことか。対応で忙しかったのもあるけど周りにこれといった飯屋がなく青いコンビニに行っても飽きてきて食べたいと思えるものがこれといってなく「これでいいか」とおにぎりを食べてごまかす。最後の最後でカレーを食べに行けたのが良かった。美味しかった。

今回分かったこと。

  • 現地にいても何が問題なのかを把握するのに時間がかかる (ヒアリングしても本当の問題点がぼやける)
  • 現地にいてもシステムが動いてる実感がやっぱりない (なんでだろう)
  • いくらテストしても不具合は出る

関わる人たちの負荷を考えないとすると小さい修正をちょっとずつあててやり過ごしたいのだけど敷居が高い (ぐらい身動きがとりずらいシステムになってしまった)。

正規表現判定

ログをゴニョゴニョして変換したいことがあって C# で書いてたのだけど激しく遅いので golang で書き直した。 golang は正規表現が遅いと書いてあるのだけど諸事情により exe で渡して済ませたいのでひとまずこれで。 でも書き方によって早くならないかなと思って試してみる。

go version go1.10.1 darwin/amd64

package main

import (
    "fmt"
    "regexp"
    "time"
)

func main() {
    line := "[100][200][300][400][500][600][700][800][900]"
    // 194.370089ms
    //regex := regexp.MustCompile(`\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]`)
    // 172.41378ms
    //regex := regexp.MustCompile(`\[(\d*?)\]\[.*?\]\[(\d*?)\]\[.*?\]\[(\d*?)\]\[.*?\]\[(\d*?)\]\[.*?\]\[(\d*?)\]`)
    // 167.32932ms
    //regex := regexp.MustCompile(`\[(.*?)\]\[.*?\]\[(.*?)\]\[.*?\]\[(.*?)\]\[.*?\]\[(.*?)\]\[.*?\]\[(.*?)\]`)

    start := time.Now()
    i := 0
    for {

        regex.FindStringSubmatch(line)
        i++
        if i >= 100000 {
            break
        }
    }

    fmt.Println(time.Since(start))
}

ruby 2.0.0 で試してみる。

line = "[100][200][300][400][500][600][700][800][900]"
# 94.829ms
regex = /\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\]/
# 85.917ms
#regex = /\[(\d*?)\]\[.*?\]\[(\d*?)\]\[.*?\]\[(\d*?)\]\[.*?\]\[(\d*?)\]\[.*?\]\[(\d*?)\]/
# 96.525
#regex = /\[(.*?)\]\[.*?\]\[(.*?)\]\[.*?\]\[(.*?)\]\[.*?\]\[(.*?)\]\[.*?\]\[(.*?)\]/

start = Time.now

for i in 0..100000

  if line =~ regex
  end

end

puts (Time.now - start) * 1000

iPad でキーカスタマイズができるようにならんかなぁ

Apple iPad スマートカバー/チャコールグレイ/MQ4L2FE/A

Apple iPad スマートカバー/チャコールグレイ/MQ4L2FE/A

主にテキスト編集している時。 <C-P> で上にカーソル移動したいし、<C+N> で下にカーソル移動したい。現状だと、<C+A> <C+B> を連打して上に移動するか、<C+E> <C+F> で下に移動するかっていう残念な状態になっている。iPad なんだからディスプレイ触って移動することも可能ではあるけど、いちいちそんなことしてたら肩とか肘とかやられそうだし、思考が飛ぶしでよろしくない。さらに <C+W> で直近の単語を削除したいし <C+D> 直後の文字を一つ消したい。もっと言えば <C+Enter> で予測変換を確定したい。それができるだけでキー入力の印象がだいぶ変わるのだけどなぁ。iOS が mac に寄って行くんだったらそこをまずどうにかして欲しいところ。mac のいいところは emacs キーバインディングがなんとなくデフォルトで使えるところもあるし。 Atok に期待したんだけど制限が多すぎて思ったように実装できないようでつらみ。結局標準のキー入力アプリに戻ったので残念感ある。

iPad Pro 10 inch + apple wireless keyboard (旧型) で入力しているのだけど、やっぱり SmartCover より入力しやすくてよい。SmartCover でも打てるといえば打てるのだけど打鍵感が微妙なのでどんどんテキストを打っていこうという気が削がれていくところがある。会社支給ノートPCのキーボードがショボすぎる問題 (何回も書いてるけど) もあって、キーボードって本当大事だなと今更ながら思うのであった。

ATOK 2017 for Mac [ベーシック] 通常版

ATOK 2017 for Mac [ベーシック] 通常版

Apple Wireless Keyboard (JIS) MC184J/B

Apple Wireless Keyboard (JIS) MC184J/B

xaml - ScrollViewer と ScrollBar を同期

諸事情による調査。非表示にした ScrollViewer の ScrollBar と、外側に配置して表示している ScrollBar のスクロール位置を同期する。

f:id:basyura:20180624165529p:plain:w300

<UserControl x:Class="VirtualScrollSample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="20" />
        </Grid.ColumnDefinitions>
        <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Hidden" Name="Container">
            <StackPanel>
                <Grid Background="Orange" Height="100" />
                <Grid Background="Blue" Height="100" />
                <Grid Background="Yellow" Height="100" />
                <Grid Background="Green" Height="100" />
                <Grid Background="AliceBlue" Height="100" />
                <Grid Background="Coral" Height="100" />
                <Grid Background="Beige" Height="100" />
                <Grid Background="Black" Height="100" />
                <Grid Background="BlanchedAlmond" Height="100" />
                <Grid Background="Red" Height="100" />
                <Grid Background="Blue" Height="100" />
                <Grid Background="Yellow" Height="100" />
                <Grid Background="Green" Height="100" />
                <Grid Background="AliceBlue" Height="100" />
                <Grid Background="Coral" Height="100" />
                <Grid Background="Beige" Height="100" />
                <Grid Background="Black" Height="100" />
                <Grid Background="BlanchedAlmond" Height="100" />
            </StackPanel>
        </ScrollViewer>
        <ScrollBar  Grid.Column="1" Grid.Row="1" Name="ContainerScrollBar" Scroll="ContainerScrollBar_Scroll"/>
    </Grid>
</UserControl>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;

namespace VirtualScrollSample
{
    public partial class MainPage : UserControl
    {
        /// <summary>
        /// 
        /// </summary>
        public MainPage()
        {
            InitializeComponent();

            SetBinding(OffsetProperty, new Binding("VerticalOffset")
            {
                Source = Container,
                Mode = BindingMode.OneWay,
            });
        }
        /// <summary>
        /// ScrollViewer のスクロール位置を ScrollBar に反映する
        /// </summary>
        public static readonly DependencyProperty OffsetProperty = DependencyProperty.Register(
            "Offset", typeof(double), typeof(MainPage), new PropertyMetadata(0d, (d, e) =>
            {
                MainPage page = d as MainPage;
                double offset = (double)e.NewValue / page.Container.ScrollableHeight;
                page.ContainerScrollBar.Value = offset;

            }));
        /// <summary>
        /// ScrollViewer のスクロール位置
        /// </summary>
        private double Offset 
        {
            get { return (double)this.GetValue(OffsetProperty); }
            set { this.SetValue(OffsetProperty, value); }
        }
        /// <summary>
        /// ScrollBar のスクロール位置を ScrollViewer に反映する
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ContainerScrollBar_Scroll(object sender, ScrollEventArgs e)
        {
            double offset = Container.ScrollableHeight * e.NewValue;
            Container.ScrollToVerticalOffset(offset);
        }
    }
}

某Hub が某大手へ

俺らが育てたのに結局金か。コントリビュートが多いってアピールなんなの。オープンソースみたいなたいそうな事じゃなくても地道にやってきた自分たちの活動・・・いやでも金がないことにはどうしようもないのだけど。なんかどっかいっちゃった・・・ぐぬぬ。

な感じかな。

今の某大手なら悪くはならないだろうという印象もまた複雑で、いっそのことめちゃくちゃにしてくれた方が感情をぶつけやすくていいわという感じかな。

拠り所みたいな感じだったので複雑な心境ではあるけどお金には勝てない。