かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

WPF:ボタンのテキストで改行させる

WPFにて、ボタンのテキストを改行して表示させる場合、TextBlock を入れ子にする方法があります。
xaml側、cs側の、どちらでも対応可能です。

(実行例)

f:id:kakisoft:20180402221750p:plain

(記述例)

xaml

<Window x:Class="PracticeWPF.MyWindow10"
        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"
        xmlns:local="clr-namespace:PracticeWPF"
        mc:Ignorable="d"
        Title="MyWindow10" Height="450" Width="800">
    <Grid>
        <!--
        ==========< ボタン内で改行を入れる >==========
        -->
        <StackPanel Width="500" Orientation="Horizontal"  HorizontalAlignment="Left" VerticalAlignment="Top" >
            <!-- xaml側で実現  -->
            <Button>
                <TextBlock x:Name="InnerTextBlock01" TextWrapping="Wrap" Text="ButtonにTextBlockを入れ子にできるよ。" Width="80" />
            </Button>

            <!-- cs側で実現(csソース参照)  -->
            <Button x:Name="Button02"  Content="" Width="80"/>
        </StackPanel>

    </Grid>
</Window>

cs側

using System.Windows;
using System.Windows.Controls;

namespace PracticeWPF
{
    /// <summary>
    /// MyWindow10.xaml の相互作用ロジック
    /// </summary>
    public partial class MyWindow10 : Window
    {
        public MyWindow10()
        {
            InitializeComponent();


            //==========< ボタン内で改行を入れる >==========
            //(コード側で設定)
            var b = new TextBlock();
            b.Text = "TexoBlockのTextWrappingを使うと改行が楽だよ。";
            b.TextWrapping = TextWrapping.Wrap;
            Button02.Content = b;
        }
    }
}

Oracle:大文字/小文字 半角/全角 ひらがな/カタカナ を区別しないで検索

以下の関数を組み合わせて、大文字/小文字 半角/全角 ひらがな/カタカナ を区別せずに検索できます。

  • UPPER(小文字→大文字)
  • TO_MULTI_BYTE(半角→全角)
  • UTL_I18N.TRANSLITERATE(詳細は後述)

(例)
以下で、「大文字・全角・カタカナ」に変換しています。

--('target_character' が、検索対象文字です。)
UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('target_character')),'kana_fwkatakana')

SQL出力例

CHAR

select
    UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('a')) ,'kana_fwkatakana') as S1 -- 半角:a
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('A')) ,'kana_fwkatakana') as S2 -- 半角:A
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('')),'kana_fwkatakana') as S3 -- 全角:a
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('')),'kana_fwkatakana') as S4 -- 全角:A
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('')),'kana_fwkatakana') as S5 -- 全角:あ
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('')),'kana_fwkatakana') as S6 -- 全角:ア
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE('')) ,'kana_fwkatakana') as S7 -- 半角:ア
from
    dual

<出力結果>

S1 S2 S3 S4 S5 S6 S7

NVARCHAR2
NVARCHAR2の場合、「半角→全角」への変換が上手く行かないので、to_charをかましてます。

select
    UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(to_char(substr(COL1,1,1)))),'kana_fwkatakana') as V1 -- 半角:b
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(to_char(substr(COL2,1,1)))),'kana_fwkatakana') as V2 -- 半角:B
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(to_char(substr(COL3,1,1)))),'kana_fwkatakana') as V3 -- 全角:b
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(to_char(substr(COL4,1,1)))),'kana_fwkatakana') as V4 -- 全角:B
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(to_char(substr(COL5,1,1)))),'kana_fwkatakana') as V5 -- 全角:い
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(to_char(substr(COL6,1,1)))),'kana_fwkatakana') as V6 -- 全角:イ
   ,UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(to_char(substr(COL7,1,1)))),'kana_fwkatakana') as V7 -- 半角:イ
from
    (
       select
            CAST('b: 半角'  as NVARCHAR2(100)) as COL1
           ,CAST('B: 半角'  as NVARCHAR2(100)) as COL2
           ,CAST('b: 全角' as NVARCHAR2(100)) as COL3
           ,CAST('B: 全角' as NVARCHAR2(100)) as COL4
           ,CAST('い: 全角' as NVARCHAR2(100)) as COL5
           ,CAST('イ: 全角' as NVARCHAR2(100)) as COL6
           ,CAST('イ: 全角'  as NVARCHAR2(100)) as COL7
       from
           dual
    ) TMP_VIEW01

<出力結果>

V1 V2 V3 V4 V5 V6 V7

UTL_I18N.TRANSLITERATE にて使用できる変換文字列

変換名文字列 説明
'kana_fwkatakana' 全角カタカナに変換
'kana_hwkatakana' 半角カタカナに変換
'kana_hiragana' 全角ひらがなに変換
'fwkatakana_hwkatakana' 全角カタカナのみを半角カタカナに変換
'fwkatakana_hiragana' 全角カタカナのみを全角ひらがなに変換
'hwkatakana_fwkatakana' 半角カタカナのみを全角カタカナに変換
'hwkatakana_hiragana' 半角カタカナのみを全角ひらがなに変換
'hiragana_fwkatakana' 全角ひらがなのみを全角カタカナに変換
'hiragana_hwkatakana' 全角ひらがなのみを半角カタカナに変換

Oracle12:【忙しい人向け】ユーザ作成方法

Oracle12にて、以下のようなメッセージが出てユーザが作成できなかった時の対処。

【エラーメッセージ】
ORA-65096: 共通ユーザーまたはロール名が無効です

ググったら、何やら複雑な情報がバシバシと出てくるけど、要は「12からアーキテクチャが変わった」のが原因。
 
 
SYSDBAにて接続後、以下のコマンドを、中身変えずにそのまま実行します。

プラガブルデータベース起動

alter pluggable database orclpdb open;

現在のコンテナをプラガブルデータベースに変更

alter session set container = orclpdb;

 
後は、通常通りCREATE USER で。
途中で出てくる「orclpdb」は、インストール時のデフォルト値です。
深い事を考えず「次へ」「次へ」でインストールした場合は、この値になっているかと思います。
 
 
 
この記事は、
「この問題を解決するためには、まずはアーキテクチャから理解しなければいけません。まずは、(長々とした説明)」
とか出てきて、  
『いや、Oracle様の高尚なアーキテクチャの説明はいいから、まずは目の前の問題を解決するコマンド教えてくれよ。
 ややこしい話は、家でビール飲みながらゆっくり見るから!
 
って思った人に向けて書いたエントリです。

TypeScript:外部モジュールを含めたソースのコンパイル方法と、実行時の注意点

TypeScriptでは、外部モジュールを含めてコンパイルする場合、「-m」オプションを使用します。
(オプションを指定しない場合、別々の jsファイルが生成される。)

(例:コンパイル CommonJS方式)
tsc sample01.ts -m commonjs

(例:コンパイル AMD方式)
tsc sample01.ts -m amd

Node.jsで実行する場合、node sample01.js といった実行コマンドとなる。
が、Node.jsは CommonJSを採用し、AMD方式はサポートしていないので、後者の場合はエラーが発生する。
(つまり、Node.jsで実行する場合は CommonJSに限定される。)

とはいえ、CommonJSは直接ブラウザで動かす事を前提としていないので、外部モジュールが必要なTypeScriptソースを、コンソールからNode.jsを使ってサクッと実行するのは止めといた方が良さそう。

ちゃんと開発する場合は、CommonJS方式で書き、Webpackでブラウザで動くコードにビルドする方法になるかと思うけど、サンプルコードとはいえ、ある程度の規模になったら、そうした方がいいんかな。

TypeScript:別ファイルのモジュールが認識されない

TypeScriptでは、スラッシュを3つ付けたコメントの後に、importするモジュールを指定する。

(例)
main.js

module UserModule {
    export var name = "yamada";
}
console.log(UserModule.name);

/// <reference path="./developers.ts" />
console.log(DeveloperModule.name);

developers.ts

module DeveloperModule {
    export var name = "kaki";
}

が、このソースは developers.tsが認識できずコンパイル出来ない。

どうやら、reference path は、ソースの先頭に書く必要があり、それ以外の部分に書くと記述が無視されてしまうそうな。

という訳で、reference path をコードの先頭に記述する事で解決。
 
 


(参考サイト)
https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html

MySQL Trend Seminar 2018 @福岡:ダイジェスト

MySQL Trend Seminar 2018 @福岡』での話のダイジェスト。 sosl.connpass.com

MySQL 8.0 について

MySQLは、分析とかは元々あまり得意ではなかったが、改善されて、どんどん良くなった。
 

GIS(空間図形情報)サポートの強化

Boost.Giometryライブラリを統合。
地理情報系。
st_distance() で距離を計算できる。
 

デフォルトのキャラがユニコード

今まではラテン1。日本人ユーザに優しくない。  

データ型

JSONデータ型を強化 (5.7で実装済み。パフォーマンスを改善。)
特定の要素だけを更新できるようになった。  
JSONデータを、SQLのように取得できる。  

共通テーブル式

WITH句追加。
パフォーマンスが良くなる事もある。(複数呼ぶ場合とか)
 

Window関数

LAG関数
1つ前のレコードの値を参照できる
 
LEAD関数
1つ後のレコードの値を参照できる
 

SELECT FOR UPDATEの拡張

NOWAIT
行が既にロックされていれば、すぐにエラーを返す。
 
SKIP LOCKED
行が既にロックされていれば、その行に対するロックはあきらめる。
 

不可視インデックス(Invisible Indexes)

オプティマイザから見えない索引。
一時的に索引を見えない状態にする。
(一時的にインデックスを削除した状態と同じになる。インデックスの削除を安全に行える)  

オプティマイザヒントの拡張

joinの順番を変更できる
 

降順索引

 

ヒストグラム

データが偏っている場合のクエリの精度向上。
インデックスよりもお手軽。
 

セキュリティ

ロール概念の追加
 

何で 5からいきなり 8?

6は頓挫した。7は姉妹品がナンバリングして、混同を避けるために、もう1つ上げた。