basyura's blog

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

Bear - Markdown compatibility mode

Markdown compatibility mode - Bear - Faq and support

いまいち違いが分からなかったのだけど設定を切り替えて入力方法のヘルプを確認してみた。

compatibility mode not compatibility mode
f:id:basyura:20181004230637p:plain:w300 f:id:basyura:20181004230648p:plain:w300


主に太字、斜体、下線、打ち消し線の記法の違いのようだ。Markdown 互換モードのままにしておく。

英字(半角)と日本語(全角)が混ざると行間が変わるという QA を出したら直ぐに直るよっていう回答がすぐ来たのだけど未だに直ってないのはもう一度問い合わせをした方がいいのだろうか。

Bear の Windows 版出ないかなぁ。InkDrop もいいのだけど windows 版はフォントが微妙感。Bear も移植されたら一緒なのかもしれないけどインラインで markdown が書けるのは非常に魅力的。

Evernote はいっこうにエディタが改善されないし Markdown を取り入れる風でもないしテンプレートに力を入れ始めたりで終わりも近いのかもしれない (フリープランで惰性で使ってるけど)。

休み

ひさびさ。

大きめのシステムアップデートして 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);
        }
    }
}

keyhac - windows10 on vmware fusion の Command + Tab でウインドウ切り替え

地味にウインドウ切り替えづらいので keyhac を使ってキーを入れ替え。

def configure(keymap):
    keymap.replaceKey( "LWin", "LAlt" )
    keymap.replaceKey( "LAlt", "LWin" )

ホストのショートカットキーを無効化にするのも必要だった気がするけどメモ。