スパゲティコードを見たので書いた。

( ´_ゝ`)ノシ
yoshitiaです。
ニコニコ動画でスパゲティコードなるネタが出てたので
それを書いた。
高画質版 とあるエンジニアのアイドルプロデュースログ 劇場版_3.Log ‐ ニコニコ動画:GINZA

#include<stdio.h>

int main(void)
{
	int month, day;
	char* m;

	printf("What month is it now? Type between 1 and 12.: ");
        scanf("%d", &month); // キーボード入力から10進数を取得

	if      (month == 1) { day = 31; m = "Jan";}
	else if (month == 2) { day = 28; m = "Feb";}
	else if (month == 3) { day = 31; m = "Mar";}
	else if (month == 4) { day = 30; m = "Apr";}
	else if (month == 5) { day = 31; m = "May";}
	else if (month == 6) { day = 30; m = "Jun";}
	else if (month == 7) { day = 31; m = "Jul";}
	else if (month == 8) { day = 31; m = "Aug";}
	else if (month == 9) { day = 30; m = "Sep";}
	else if (month == 10){ day = 31; m = "Oct";}
	else if (month == 11){ day = 30; m = "Nov";}
	else if (month == 12){ day = 31; m = "Dec";}
	else { day  = -1; m = "error";} // 取得した値が1~12以外の数か、数字でない場合

	if (m == "error")     { printf("usage: Type number between 1 and 12\n");} 
							// "使用法: 1から12までの数値を入力してください\n"
	else { printf("%s is %d days.\n", m, day);} // 出力例: Jan is 31 days.

	return 0;
}

細かい所は違う気がするが気にしない。
( ゚Д゚)ウヒョーelseifが目に痛い。
Vimで書きましたまる

2016/3/12追記
プロログPより
else { day = -1; m = "error";}をelse { day = -1:}にして
if (m == "error")をif (day == -1)にするとシンプルになるよと
赤ペン先生してもらった。
( ゚д゚ )
( ゚д゚ )
( ゚д゚ )

weblogicでlog4j.xmlを上手く読み込んでくれない時の話

( ´_ゝ`)ノシ
yoshitiaです。
今週はずっとAntとweblogic10.3.6使ってました。
javajavaしてます(コーヒーは飲んでいない)。
で、webアプリケーション起動時、
log4j.xmlが読み込まれてくれないorz
その対処のお話です。

2016/3/5 対処法に勘違いがあったので修正。
 

ググると大抵見つかる記事の対処方法

2016/3/4追記
log4jweblogic側で利用する場合と
webアプリケーションが利用する場合で
対処法が違ってたorz
1はwebアプリケーションがlog4jを使っている時の対処、
2がweblogic自身のログ出力でのlog4j設定

1. warファイルのWEB-INF/classesフォルダに
log4j.xmlがあれば解決
(srcフォルダの直下におけばいい?)
2. weblogicの起動時オプションに
-Dlog4j.configuration=file:/// を追加
 
( ´_ゝ`)
1はEclipseでの対処法っぽい。
が対象のプロジェクトはEclipse使わずに
直接Antでビルドを行う。
正直Eclipseに取り込む手順を知らぬ。
つまり、
【却下】
      ∧,,∧  .∧,,∧
  ∧∧(´‐ω‐`)(´‐ω‐`)∧∧
 (´‐ω‐).∧∧) (∧∧ (‐ω‐`) 
 | U (´‐ω‐`)(´‐ω‐`) と ノ
  u-u (l    ) (    ノ u-u
       `u-u' `u-u'
2はtypoしてる所があるのか上手くいかないorz
なのでそれ以外の対処をしてみた。

2はsetDomainEnv.cmdかshあたりに
LOG4J_CONFIG_FILEって変数を設定する部分が有るので
そこにxmlの場所書いておけば動く。
 
1のwarファイルのWEB-INF/classesフォルダに
log4j.xmlがあれば解決、を
srcフォルダに置く以外の方法でやってみた。
 

力技編

webアプリケーション実行時の
WEB-INF/classesフォルダに
直接log4j.xmlを配置する。
webアプリケーション実行時は
weblogicドメインフォルダ
(デフォルトならbase_domain)内の
servers/サーバ名/tmp内を探索すると
warフォルダがあって
その中をさらに探すとWEB-INF
更に中にclassesフォルダがあるので
そこに置く。
力技なのでwebアプリケーションサーバ
起動している間しかもたない。
 

ビルド時に対処編

根本的な対処法。
まずwarファイルの元になるプロジェクトの
WEB-INF/classesフォルダにlog4j.xmlを放り込む。
 次にbuild.xmlを修正する。
(元々classesタグが書いてあれば
WEB-INF/classesフォルダにlog4j.xmlを追加するだけでいける)

<war destfile="hoge.war" webxml="(web.xmlの場所)"><classes dir="(WEB-INF/classesの場所)" />
    <!-- classesタグを追加 -->
</war>

EclipseでもAntでビルドしてるならこの方法が使えるはず。
余分なファイルや格納したくないファイルが
WEB-INF/classes内にある場合は
includes="追加したいファイル"か
excludes="格納したくないファイル"を
上手く使えばいいと思う。

まとめ

AntはJava使ってるならいつかは出会うツールだと思うので
Javaの勉強をしてる人は息抜きに触ってると
幸せになれるかもしれません。
www.amazon.co.jp

batファイルおさらい

( ´_ゝ`)ノシ
yoshitiaです。
色々あって2015年の年末に勤めてた会社やめて
2016年の2月から別の会社に入りました。
教訓: 人の縁マジ大事
 
本題。
ちょっとコマンドプロンプトのbatファイル使う機会が出来た時に
「まったくのプログラミング初心者って
いきなりプログラミング言語入るよりコマンドプロンプト
シェルスクリプトから入った方がよくね?」
と思い立ってbatファイル書いてみることにした。
(煎じ過ぎて出がらしだろうなぁ)

 

定番のHelloWorldから。

hello.batファイルを作って書く。
pauseはbatファイル実行終了後画面が即閉じるのを防ぐ。

echo Hello World!
pause

ファイルを保存したらbatファイルをクリック。
コマンドプロンプトが出てきて次の文字が表示される。

echo Hello World!
Hello World!
続行するには何かキーを押してください . . . 

echo Hello World!の部分は不要なのでこう書く。

@echo off
echo Hello World!
pause

行頭に@をつけるとその行は画面に表示されない。
echo offにすると次の行から実行するコマンドが
表示されなくなる。

echo Hello World!
Hello World!
続行するには何かキーを押してください . . . 

それとbatファイルの中に実行コマンドの説明文を入れる時は
remを使う。
echo offの次の行からじゃないと画面に表示されるので注意。

@echo off
rem hello.bat - コマンドプロンプト画面にHello World!を表示する。
echo Hello World!
pause

変数を設定してみる

cd %~dp0
rem set.bat - 変数を設定して利用する
rem 変数を設定します。setで変数を設定すると
rem 長い文字列を何度も入力しなくて良くなります。
rem batファイルが終了するとsetされた変数は削除されます。

set longstring=寿限無寿限無五劫の摺り切れ海砂利水魚の水行末雲来末風来末食う寝る所に住む所藪柑子ブラコウジパイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナーの長久命の長助

echo %longstring%
echo;
rem echo;で改行してます。

echo 12345%longstring%
rem 変数の前後に文字をくっつけて表示できます。

echo;
echo %longstring%67890
echo;

pause

setを使うとJAVA_HOMEとかをbatファイル実行中の間設定できるので
環境変数がないと実行できないソフトを軽く試すこともできます。

実行前確認メッセージを表示させる

crowd-logic.com
リンク先のコードにあるgoto :yes、goto :noは
:noまたは:yesと書いてある行の次の行からのコマンドを実行するものです。
exitは実行するとbatファイルの実行をそこで終了します。

gotoは簡単に処理を実行したい行に移動できますが
使いすぎるとコードの順番を読むのが難しくなるので
極力使わない方がいいです。
(リンク先のgotoの使い方は良い使い方なので参考になります)

文字列置換 2016/03/12追加

@echo off
cd %~dp0
@rem replace.bat - 変数に格納した文字列の文字を置換

@rem ポイント: =の左右にスペースを入れない事。変数名が「var 」として認識されたり
@rem 格納される文字列が「 C:/home/document」になる
set var=C:/home/document

@rem %var:/=\% の :/=\が置換処理を指定している部分。
@rem :が処理指定開始の文字で=の左側で置換したい文字、
@rem 右側でどの文字に置換するか指定している
set replace_var=%var:/=\%

@rem C:\home\documentが出力される
echo %replace_var%

@rem "C:\home\document"が出力される
echo "%replace_var%"

pause

置換の結果を変数に格納する処理を何回か重ねれば
大抵の置換処理はなんとかなると思う。
割と使いそうなのはファイル名に日時を使う時の整形処理とか。

まとめ

(;;´_ゝ`) あれ?地味に覚える事多くね?
でもWindowsなら新しいソフト使わなくても試せるから便利だと思う(小並感)
ファイッ。

思い出した頃に追加で書き足そうマル

立ち方memo

太極拳の予備勢の立ち方、現時点でのポイントメモ。

踵-小指ラインに均等に体重掛けて踵から重心を外す。

無理して姿勢を低くするのでなく、膝を力まないように緩めた結果低くなる。

力む場合は無理してるのでそうならない程度に膝を伸ばす。

上手くいくとスワイショウで腕の力が抜けるのがわかる。

srround.vimとevil-surroundの括弧の中のスペース話。

( ´_ゝ`)ノシ

yoshitiaです。

2015年も残すところ10日を切った辺りからC#始めました。

ええ、Arch linuxでmono+omnisharp-server+emacs+evilで。

なんですが、

using System;

 

class Hoge  {

    static void Main() {

        Console.WriteLine("12月 {0}{1}日爆発しろ。", 2, 4);

    }

}

なコードを書く時{0}、{1}の{をsurround.vimでvS{などとやると、

{ 0 }となるわけですが、0の左右に半角スペース入ってると

コンパイルでエラー出るorz

timcharper/evil-surround · GitHub

英語力ェ・・・orz

諦めかけた所で、

「こういうこと起こるのプラグイン作者がわからんわけない」と思い直し

vS{と開き括弧でやったらスペース付くんだし、

vS}でやったらスペース無しになるんじゃね?(ピーン)

出来た・・・orz

{0}みたいに囲めたwww

Vimのsurround.vimでも出来たので元々あった機能らしいorz

すごい。

 

 

VimとEmacsのカーソル移動

 

1 vimemacsのカーソル移動

 

1.1 前書き

基本的にyoshitiaが覚えている分で書いてるので 記事が間違ってるとわかったら各自で正しい操作方法を探しましょう。 くどいようですがvimのヘルプ使いましょう。 紹介順は入門vi(vimではない)に則っています。

1.2 操作の表記

C-fはCtrl+fの表記です。 emacsvimの記事では C-fのような表記が多いので慣れましょう。 M-fならAlt+fです。(macならMeta+f) C-M-fならCtrl+Alt+fになります。

1.3 上下左右移動

 

1.3.1 vim ノーマルモード h(左)、j(下)、k(上)、l(右)

キーボードのホームポジション、右手だけで行います。 vimはカーソル移動・テキスト編集を 極力ノーマルモードで行い、 テキスト入力時にインサートモードに切り替える、 という使い方が基本なので インサートモード時にカーソル移動したくなったら サクッとノーマルモードに戻ってからやるのが普通です。

1.3.2 emacs C-f(右)、C-b(左)、C-n(下)、C-p(右)

vimでもそうですが割とデフォルトのキーバインドは 操作を意味する単語の頭文字の英字キーだったりします。 (100%ではない) この操作の場合は以下の様になります。 C-f forward(入力方向に対して前へ) C-b backward(入力方向に対して後ろへ) C-n next(次の行へ) C-p previous(前の行へ) 操作を意味する英単語を覚えておくと 「C-fは右移動」と丸暗記よりは身につくのが早いと思います。

1.4 行末・行頭移動

一応vimemacsでなくてもhomeキーやendキーで出来たりします。 (windowsのメモ帳でもこれは使えます)

1.4.1 vim ノーマルモード 0(行頭)、$(行末)

0はその行の一番最初の文字を意味しています(0、1と数えてるっぽい) $は正規表現で行末を意味する$を使っています。

おまけ。^だとその行の一番最初にある 空白(半角スペースやタブ)以外の文字に移動します。 (全角スペースは文字として認識されます) ^は正規表現で行頭を表します。 vimの操作で正規表現2つ覚えられます。 やったね!ラッキーだね!

1.4.2 emacs C-a(行頭)、C-e(行末)

C-aなのは多分a=先頭のイメージなんでしょうねー。 C-eはend。

1.4.3 emacs M-a、M-e

動きとしてはC-a、C-eと似ていますが 空白(半角スペースやタブ)以外の 一番最初の文字か最後の文字に移動します。 連続して押すと前の行の一番最初の文字・次の行の一番最後の文字に 移動します。 emacsは英字キーが同じでCtrlかAlt(Meta)かの違いで 似てるような動きで微妙に違う操作が出来たりします。

1.5 単語単位の移動

単語単位の移動はタブや空白で区切られた単語やカンマ、ピリオドです。 vimemacsは元が日本語を想定したエディタではないので日本語の文章では いまいち上手く動かないです。 ただ、上下左右の移動よりは早くカーソルを移動できます。

1.5.1 vim w、W(右方向) b、B(左方向)

大文字はピリオドとカンマを飛ばして移動します。

1.5.2 emacs M-f(右方向)、M-b(左方向)

特にコメントなし。

1.6 まとめ

色々紹介してなんですが、上下左右移動以外は結構使わないです。 私が割と使うのは検索とかファイルの先頭・末尾に移動、行指定移動。 evil-modeの場合は他の操作に割り当てられていたりするので各自確認お願いします。

Arch LinuxでEmacsclientを利用する時の環境変数設定の話。

( ´_ゝ`)ノシ

この記事はEmacs Advent Calendar 2015 12日目の記事です。

qiita.com

11日目はkoshさんの記事でした。

Emacs - 連想リストの参照を少しでも楽にしたい - Qiita

 

本記事はEmacsclientのお話です。

1. Emacsclientって?

  プラグインや設定が多くてemacsが重くなった時の対処法の一つ。

  常駐ソフトの様に裏であらかじめ起動させておく。

  既に起動させている状態なので「起動が重い!」と言わなくて済む。

 うっかりemacsclientのウィンドウを終了させても、バックグラウンドで

 起動してるままなので安心。

   本記事はpacmanでインストールしたGNU emacs 24.5.1を使っています。

 

2. Arch linuxで使う時は

 systemdってのを使う。

 https://wiki.archlinux.org/index.php/Emacs#As_a_daemon

 ~/.config/systemd/user/emacs.service

   にemacsをバックグラウンドで起動する設定を書いて

 

 $ systemctl --user enable emacs

 でsystemdで利用可能な状態にして

 $ systemctl --user start emacs

 でバックグラウンドで起動させる。

 

 $ emacsclient -nc

 で使う。

 ~/.bashrcに

   alias ekill='emacsclient -e "(kill-emacs)"'

   と書いておくとemacsclientを再起動させたい時に

 ekillと打つだけで済むので楽です。

 

3. 本題

 2. の通りに設定してそのまま使うと

 IMEを使った日本語入力ができない事態に遭遇します。

    (emacsskkプラグイン使ってる人は問題ない)

 原因はsystemdから起動する時のソフトは

 .bashrcの設定を読み込まないことらしい。

 emacsでM-x eshellして.bashrcで設定している変数を

   $echo $XMODIFIRES

   の様にechoで確認して文字が出力されなかったら多分これです。

 

4. どーすんのよ

 ~/.config/systemd/user/emacs.service

 に環境変数の設定を書きます。

 [Service]の下の行あたりに

   Environment="LANG=ja_JP.UTF-8" "HOGE=huga"

   と書いて保存したら

   $emacsclient --e "(kill-emacs)"

   でemacsclient再起動して

 M-x eshellして

    $echo $LANG

    $echo $HOGE

    で確認しましょう。

 ja_JP.UTF-8とかhugaと出てきたら設定OKです。

   後は.bashrcで設定してたもので必要な環境変数を設定しましょう。

 

5. systemdの環境変数設定の仕方ってだるくないか?

    この記事を見て、systemdで起動する時、

    .bashrc読み込んでくれたらいいのにと思うかもしれません。

  思うかもしれませんがちょっと待ってください。

 

    この記事を読んでいる方で長い期間利用しているPCや

    他人のPCを使っていて、昔にインストールしたまま放置していたソフトや

    知らない設定で今やろうとしていたことを邪魔された経験の

 無い方はいらっしゃいますか?無い人の方が珍しいのではないでしょうか?

 

 systemdのやり方であればソフト毎に環境変数を設定できるので

   他のソフトの環境変数とぶつからない素敵なやり方だと思います'`ィ (゚д゚)/

 

6. まとめと言う名の言い訳

    この記事どちらかというとArch Linux Advent Calendarじゃないかって?

     Emacsの話だから⊂(^ω^)⊃ セフセフ!!

 

Emacs Advent Calendar 2015 13日目 はkai2nenobuさんの記事になります。