もちっとメモ

もちっとメモ

もぐりのエンジニアが日々の中で試してみたことを気が向いたときに書き連ねていきます

Texworksで文字コードを変更する

先日,先方にTexソースコードを送ったら,「文字化けして見れんのだが.どうにかしてくれ」と言われてしまった.
どうやら先方はデフォルトがSJISになっているようだ.
面倒くさいと思いつつ,自分の使っている環境であるTexworksで文字コードの変換ができないかどうか調べてみた.

結論から言うと,表示変更はできるが文字コードを変換して保存は不可能っぽい.
Texworksで表示する文字コードを変更する際は[編集]-[設定]ー[エンコーディング]で文字コードを変更して開く(またはTexworksを再起動する)で任意の文字コード(用意されているものに限る)に対して表示は可能なよう.ちなみに,私の使っているバージョンではSJISはSystemになっていた.Windowsだからだろうか.
ただ,Texworks自体で文字コードを変更して保存することは無理っぽい.例えば,もともとUTF-8で書いたものをSJISで保存するなど.
そのときは,ほかのテキストエディタ(TerapadやSublimeTextなど)で文字コードを指定して保存する必要があるみたい.
どうしてもTexworksでやりたければ,書いた内容をコピーしておいて,一度エンコーディング文字コードを変更,Texworksを開き直して,ペーストすれば可能ではあった.面倒なことには変わりないが.

今どき,どのTexエディタもデフォルトはUTF-8なのにSJISでしか表示やコンパイルしかできない(というか相手方がその手の設定が自力でできない)からいちいち文字コードを変更して送らなきゃならないなんて面倒くさすぎる.多数派に合わせる努力をしてほしい.

2016年 個人的注目のアドベントカレンダー(年内随時更新)

お恥ずかしながら最近アドベントカレンダーなるものの存在を知りました。そこで、個人的に何と無く気になっている、読んでみようかなと思っているアドベントカレンダーをつらつらと書きます。基本的には自分への備忘録です。それでもよろしければどうぞ。adventar.org

adventar.org

adventar.org

adventar.org

adventar.org

adventar.org

 

Texでスライドを作る

Texでスライドを作る
目次や現在位置を簡単に表示させられるし,数式はきれいに作れるから一度試してみたい.
でも,パワーポイントみたいに直感的に作れなさそうなのでめんどくさいかも.
参考サイト
プレゼンテーション用 LaTeX クラス Beamer の使い方メモ

テンプレートLaTeX チートシート (作成途中)


追記:2016/12/22
実際に作ってみました.
テンプレシート+\usepackage{beamerthemeshadow}で思っていた通りのスライドができました.
確かに出来はかっこいい.数式も美しい.Tex感覚で入力もできる.
でも,動画埋め込めないよね?逐次文字サイズを調節するのは面倒.レイアウトの柔軟さがない?
勉強すればいいものが作れるかもしれないけど,慣れるまでは時間がかかりそう.

 

ベクトル場を書いて分岐現象を見たい

ホップ分岐やサドル・ノード分岐など分岐現象を可視化する方法として方程式のベクトル場を見ることがあります.
以下はサンプルコードです.
C++コード

    
    
      #define _USE_MATH_DEFINES
      #include <math.h>
      #include <fstream>
      #include <iostream>
      #include <thread>
      #include <vector>
      const double Delta=0;
      const double deltaOmega=1;
      const double Omega1=1;
      const double Omega2=Omega1+2*deltaOmega;
      const double strength=1;
      const double p=1;
      //x軸(極座標なら動径)方向の微分方程式
      float funcx(float x, float y){
       return (-Delta + strength / 2.0*(1 - p)*(1 - x*x))*x + strength*p*(x*(1 - x*x) / 2.0)*cos(y);
       }
      //y軸(極座標なら偏角)方向の微分方程式
      float funcy(float x, float y){
       return fabs(Omega2 - Omega1) - strength*p*(1 + x*x)*sin(y);
      }
      //ベクトル場の出力
      void vector_field(){
       double beginx=0; //x軸の最小値(極座標なら動径)
       double endx=1; //x軸の最大値
       double beginy=0; //y軸の最小値(極座標なら偏角)
       double endy = 2.0*M_PI; //y軸の最大値
       double step=0.1; //ベクトル場のステップ幅
       float x, y, deltax, deltay, norm; //変数
       char filename[100];
       sprintf(filename, "vector_field.dat");
       ofstream output(filename); //ファイル出力
       for (x = (beginx-step); x <= (endx+step); x = x + step){
        for (y = beginy; y <= endy; y = y + step){
         norm = sqrt(funcx(x, y) * funcx(x, y) + funcy(x, y)*funcy(x, y));
         deltax = funcx(x, y) / (1.0 + norm)*step;
         deltay = funcy(x, y) / (1.0 + norm)*step;
         output << y << " " << x << " " << deltay/step << " " << deltax/step << endl;
        }
       }
    output.close();
    }
    int main(){
     vector_field();
     return 0
    }
    

Gnuplotコード

    
      set isosamples 200,300
      set term pngcairo enhanced size 640,480
      set polar
      set grid polar
      set size square
      set xrange [-1.1:1.1]
      set yrange [-1.1:1.1]
      set key outside top center reverse Left
      set o sprintf("vector_field.3f.png")
      plot \
      sprintf("vector_field-p%.3f-w%.3f-d%.3f.dat",p,i*a,d) with vector,
    

参考サイト

gnuplotで二次元のベクトル場を綺麗に書く。ただしベクトル場はファイルから読み込む。poissondd.wordpress.com

C++で文字列⇔数字の変換

友人に聞かれて10桁の数字の列を逆ピラミッド式に足していったときに最後に得られる数字の1桁目を答えるという問題を解いてみました.
http://1fxfx.jugem.jp/?eid=190&guid=ON&view=mobile&tid=1 ←こんな感じの

そのときに始めに与えられる数字が0から始まる際はどうしてもint型などの数字では扱えず文字列として入力して,計算するときに数字に変換する必要がありました.
具体的には
・string型⇔int型
・char型⇔int型
です.
string→intは便利な関数があるみたいですね.
【C++】string型を数値型に変換する方法【string to int/double等々】 | MaryCore

問題はchar→intでした.
このchar型というのはASCIIコードに基づいて文字を数字と対応づけています.
ASCII文字コード : IT用語辞典
そのため,単純にint型にキャストすると,以下のような場合,

    
        char hoge = "0";
        int ans = (int)hoge + 2;
        printf("%d",ans);
    

50という出力が返ってきます.
これは,'0'はASCIIコードでは48に対応しているためです.
そこで,char→intで変換するときは,基準を'0'までずらせばいいわけです.つまり,

    
        char hoge = "0";
        int ans = (int)(hoge - '0' ) + 2;
        printf("%d",ans);
    

とすれば,ちゃんと2という出力が返ってきます.
これに気付くまで1時間はかかりました.知ってれば一瞬なんでしょうけど,独学だときづくまでに時間がかかりますね.

おまけ:
冒頭の問題を解くときにもう一つ必要だった課題解決.