まいこーmemog

生きづらいとき人の言葉で生き返るので,自分も言葉にしてみる.[memo+blog]

GAS マスターファイルをコピーしてフォルダへポイ

f:id:maikocho:20180222180353j:plain

こんにちは。

 

GoogleAppScriptで以前こんな記事を書きました。

maikocho.hatenablog.com

 

内容としては

サークルの会計表作成面倒だからみんなに登録してもらうシステム作ったよ

みたいな感じです。

 

サークルは複数の部署のようなもの(班)で仕事分担しているため、今は班毎の表も作成してあります。

 

すると、年度更新の際、新しく作る必要のある表の数はおよそ15個。

しかも、登録フォームとの紐付けで表のIDも必要です。面倒すぎ。

 

ということで、コピー元となるマスターファイルさえ準備しておけばボタン一つでコピー作成が完了するツールを作ったのでメモ。

勉強しながら作ってるので汚いコードは勘弁願います。

 

 

マスターフォルダを作る

コピー元のファイルを束ねるフォルダを新規作成しておきます。

フォルダのIDはフォルダを開いたときのURLの末尾です。

 

~folders/ (フォルダのID)

 

ここに入れたファイルが自動コピーされるプログラムとします。

 

コピーされたファイルを入れるフォルダ作成部分

まず、GASの新規ファイルを作成して「コード.gs」に書いていきます。

フォルダを作成し、そのコードを返す関数の形で記述しています。

 

function CreateNewFolder(){

          var IdNewFolder = DriveApp.createFolder("フォルダ名").getId();
          return IdNewFolder;

}

 

DriveAppはドライブ内でファイルやフォルダを操作します!みたいな宣言と考えれば良いと思います。

 

createFolder()はその通り、フォルダをクリエイトします!って感じで。

 

getId()はその作ったフォルダに対してIDの値くれよ!とお願いしています。

 

そしてIDを「IdNewFolder」という名前の変数に入れたので、その値を戻して(出力して)欲しい僕はreturnの後に変数名を書きました。

 

これでCreateNewFolder()という関数を実行したら新しくフォルダを作ってIDを持ってきてくれます。

 

マスターフォルダ内のファイルをコピーする部分

ファイルコピー

 function AutoCopy() {
     // マスターのフォイルを一括で取得
          var files = DriveApp.getFolderById("マスターフォルダID").getFiles();
     // 新しいフォルダを作成
          var newfolder = DriveApp.getFolderById(CreateNewFolder());
     //新しいファイルのIDをリスト化する用意
          var Newfiles = {};
          var NewfilesName = {};
          var i = 0;


     // 一括取得したファイルをバラす
          while(files.hasNext()){
          //マスターファイル取得
               var file = files.next();
          //マスターファイルのファイル名取得
               var name = file.getName();
          //マスターファイルを新しいフォルダにコピー,IDをリストに追加
               var meta = file.makeCopy(name,newfolder);
               Newfiles[ i ] = meta.getId();
               NewfilesName[ i ] = meta.getName();
               i++;
          }

 

ファイルをコピーする部分は以上です。

初めにfilesという変数にイテレータ形式でマスターフォルダ内のファイルを一括で代入します。

 

イテレータはファイルを並べてひとまとめにしたものというイメージで良いかと思います。

 

while文の中身でそのイテレータを1つずつバラして新しく作ったフォルダにコピーしてます。

makeCopy()はファイルオブジェクトをコピーする操作です。

第一引数にコピーされたファイル名、第二引数にコピーを保存する場所を指定します。

 

ここでは後に書く、コピーしたファイルのID一覧ファイルを作成する機能実現のためにコピーファイルをmetaという変数に入れてます。

 

IDと名前のリストをそれぞれNewfilesNewfilesNameとしています。

 

コピーされたファイルの名前とID一覧作成

先ほどのAutoCopy()関数内の続きでこれを書いています。


         var Mdatafile = DriveApp.getFileById("一覧のひな型ファイルのID");
         var datafileid = Mdatafile.makeCopy("ファイル名",newfolder).getId();
         var datafile = SpreadsheetApp.openById(datafileid);
         var ss = datafile.getSheetByName("シート1");
         var i = 0;
         while(Newfiles[ i ]){
              var range = ss.getRange( i+2, 1);
              range.setValue(NewfilesName[ i ]);
              var range = ss.getRange( i+2, 2);
              range.setValue(Newfiles[ i ]);
              i++;
         }
}

 

今回コピーしたファイルの名称とIDを一覧にするファイルのひな型として簡単にファイルを作っておきました。

f:id:maikocho:20180222111046p:plain

 

最初のIDはこれのIDです。

2行目は先ほどと同様にコピーして、IDを取得しています。

 

次の2行はコピーしたファイルを開いて、シートを取得しています。

 

while内はシート内で値を設置したいセルを取得し、setValue()で名称とIDをそれぞれ設置しています。

 

まとめ

勉強しながらですがなんとか実現したかったことは達成できました。

AutoCopy()を実行すればマスターフォルダ内のファイルが何個であっても同様の処理ができる。

 

この機能は当たり前のようで自分で実装しようと思うとプログラミングの勉強をしないと触れない感覚が必要な感じがしました。

 

もうすぐミンパイが一通り終わるのでラズパイも初心者目線から進めていきたい所存。

ダランベールの解の表記

ダランベールの解

波動方程式が関わる学問では避けて通れないワードだと思います

 

僕自身何度も直面していますが、何となく式の形がすんなり受け入れられてしまうので今まであまり深く考えず利用して来ました

 

しかし今回その表記について

  • 空間表記
  • 時間表記

の2種類があり、使い分けられるもなぜそうするかよくわかっていない

 

このことに気づいたので、表記とダランベールの解の導出過程についてのメモをします

波動方程式ダランベールの解

ダランベールの解は波動方程式の一般解を「進行波」と「後退波」を表す関数の和として記述できることを表しています

今回は電信方程式を途中参考に入れているので微分される量はvで表記しています

iPad Proで書いたノートです

f:id:maikocho:20180206120251p:plain

ノートの通り、関数の変数部分が持つ次元によって2通りの記述が可能です

変数にマイナスが入っている項が進行波を表す関数で、もう片方が後退波です

 

ダランベールの解法

ただの解法はネット上に溢れているのでそちらを参考にします

5 電信方程式の一般解(ダランベールの解)

ここがシンプルでわかりやすいと思います

 

2通りの表記について

空間表記と時間表記は波動方程式を変形することでごく当然にその表記が導かれることがわかります

f:id:maikocho:20180206121135p:plain

まとめ

波動方程式を変形するだけで2通りの表記が紹介される意味がすんなりわかりました

波動方程式を利用する場面は多々あるので抽象的な話だけで終わってしまいましたが、何となくふわっとしてた部分に納得がいったのでメモしました

iPad Proのノート、楽で良い...!! 

iPad Proでノートを取り始めて約2週間で変わったこと

年始の1週間1記事の目標がいとも簡単に敗れ去るのをなんとか阻止したい

ということでiPadProを使うようになって自分の行動が変わったことを書きます

 

iPadProを買った目的等々はこちらの記事で書きました

 

maikocho.hatenablog.com

 

そしてここ2週間はとにかくiPad Proと共に生活しました

おはようiPadPro、ごはん美味しいねIPadPro、おやすみiPadPro...

 

そんな生活の中で僕の行動に一つ驚きの変化がありました

 

これまで紙のノートで色々書いてきました

間違えるとペンを置いて、消しゴムや修正テープを"頭で考えずに"

ペンケースから取って修正を行っていました

 

それがなんとiPadのアプリ「GoodNotes」でノートを取るようになってから

に書いている時に

書き間違えたえらペンを持ったまま腕が右上に移動する

ようになったのです

 

つまり、僕はペーパーレス生活約2週間で

「間違えたら消しゴムを取りに行く」

        ↓

「間違えたらUndoを押しに行く」

に変わっていたんです

 

これは恐ろしいことだなと思います

これまで十数年、紙と鉛筆と消しゴムを使ってきたのに

IPadPro +ApplePencilはその身体経験をたったの2週間で変えてきたのです

 

恥ずかしながらつい最近UXという言葉の意味をしっかり調べたのですが

UXを高めるプロダクトとはこういうことか

と素直に感じた体験でした

 

 

誰かにそう感じてもらえる何かを作れたらなぁと少し夢を見つつ

また変わったことがあれば更新していこうと思います

iPad Pro+Apple pencil でノートと手帳の代わりにする

[2018/07/04 (水) ペンの収納について加筆] 

こんにちは

末端冷え性で毎日手先が保冷剤状態です

 

1月2日のApple初売りでiPad Pro Wi-Fiモデル10.5 inchをゲットしました

www.apple.com

 

12,000円分のギフト券がついてきたのでそれを使ってApple pencilもゲット

www.apple.com

 

今回iPadProは外に持ち運ぶノート、手帳を一つにまとめたいという目的で購入しました

そこで本記事はそのためにとりあえず買ったアクセサリ類と導入したアプリをメモしておきます

 

 

アクセサリ

購入したのは以下4つ

  1. ケース
  2. 画面保護シート
  3. Apple pencilケース
  4. Bluetoothキーボード

計5,406円で揃えることができました

 

1.ケース 

 

 Spigenは初めて購入しましたが非常にいいです

ケースをスタンドにして立てたときの角度がキーボードと組み合わせて使うときに欲しい角度ぴったりでした!

 

Spigenってどう読むんだろうと調べると

「Spigen(シュピゲン)」は、鏡を意味するドイツ語<Spiegel>(シュピーゲル)と、遺伝子を意味するドイツ語<Gen>(ゲン)を組み合わせた造語で、お客様の心を鏡に映してみるように、お客様の思考で、お客様が求めているものを、考え続ける遺伝子を持った企業であることを意味しています。

引用元:http://www.spigen.co.jp/blog/2017/08/21/curious/logo_history

 良い名前で製品も満足だったのできっとリピーターになります

 

2.画面保護シート

https://www.amazon.co.jp/dp/B074GYWCLH/ref=cm_sw_r_tw_dp_U_x_YmRwAbV9GGTF6

なぜか画像等でませんがANISYOの高透過ガラス保護フィルムです

990円という価格に不安を覚えながらもレビューを信じて購入しました

最悪でした...となりそうなもんですが、実際は素晴らしかったです

 

店頭で数千円出してガラスフィルム買うのは本当にバカらしいなと思った体験でした

 

3.Apple pencilケース 

 

 Apple pencilはほっそいのですぐ失くしそうだし折りそう...そう思ってこのケースを購入

しっかりした作りでiPadに引っ掛けておけるので持ち運びに重宝します

Apple pencilとのサイズの兼ね合いがちょうどよくて収納した...!!という謎の満足感に包まれる一品です

 

[2018/07/04 加筆始]

上記レザーケースは最初の頃は心地よい収納感があるものの,やはり皮ということで少し伸びてきてしまいます.

今現在利用中のPencil携帯ツールは"マグネット" です!

 これは非常に優秀で,ペンにはめるグリップにマグネットが仕込まれています.

このマグネットでiPadの右側のマグネット部にくっつけて持ち歩くというスタイル.

かっこいい...

形状が気になる人もいるかと思いますが,個人的にペンを使いにくくなった感覚は一切ありません.

オススメです!

[加筆終]

4.Bluetoothキーボード

 

最初はiPadProのケースとキーボード一体型で考えていましたが、その場合ノートとして使うには重量が出すぎるということで購入

単四電池2本が別途必要ですが、サイズ感や使用感は2,000円以下で充分納得のいくものでした

 

導入したアプリ

iPad Proでしたいこと

主にやりたかったことは

  • ノートの代わりにしたい
  • 手帳の代わりにしたい
  • お絵かきもしてみたい

こんな程度です

 

以上のことを最小限のアプリで賄いたい!!

画面のごちゃごちゃはiPadを道具として使うとき邪魔になる気がします

ノート

ノートといえば「Notability」と「GoodNotes」が有名です

Notability

Notability

  • Ginger Labs
  • 仕事効率化
  • ¥1,200
GoodNotes 4

GoodNotes 4

  • Time Base Technology Limited
  • 仕事効率化
  • ¥960

 

細かいことはこちらのブログなどで確認させていただきました

it-education.hatenablog.com

 

Notabilityは録音機能が魅力的でしたが、とりあえず直近でそれは必要ない気がしたのと、使い分けするにはSplitviewでテキストとノートのようにするのかなと思いつつもあまり電子媒体のテキストがありません

 

ということで今回は後から複数枚のPDF出力も簡単そうな「GoodNotes」を導入しました

手帳はどうするか

カレンダーアプリも探しましたが手帳のように手書きでうまく処理できるものはあまりありません

そこでGoodNotesを手帳として使う方法を提案します

 

具体的には以下のSONYのサイトで配布されているカレンダーのPDFを利用します

www.sony.jp

マンスリー、ウィークリー、デイリー全てがダウンロード可能です

SONYさんありがとう大好き

 

これをGoodNotesに読み込ませ、「カレンダー」というマスターカテゴリを作ってその中に「2018」カテゴリを作り、マンスリーとデイリーカレンダーを導入しました

もともと使っていたEDiTという紙の手帳(1日1ページある)とほぼ同じ環境をiPad内で実現できました!

ドキュメント管理

様々なファイル管理はこれで良さそうです

Documents by Readdle

Documents by Readdle

  • Readdle Inc.
  • 仕事効率化
  • 無料

 ドラッグドロップでファイルをフォルダに入れたりできるのはささやかですが使いやすいです

僕はこのアプリにさっきのSONYのページのテンプレートをいくつか入れておいてオフラインで使えるようにしています

お絵描き

これはApplepencilとともに使うことで価値がすごく上がります

アイビスペイントX

アイビスペイントX

  • ibis inc.
  • エンターテインメント
  • 無料

 

このアプリのいいところは

初心者向けにすごく初歩的なところから丁寧に丁寧に解説してくれるサイトがアプリ内でリンクされているところ

です

 

僕のような初心者もこのアプリとともにちょっとやってみようかなという気持ちになります

その他

その他はまだ見てますがEvernoteなどのクラウド系を充実させるくらいで、事足りる予感がしました

いいアプリを紹介しているブログがあったので貼っておきます

addonecubit.com

 

まとめ

iPadProをノートや手帳として使うにはひとまず「GoodNotes」があればなんとかなりそうです

SONYのサイトは見つけた時に運命感じました

デイリーカレンダーを配布してくれるサイトって案外ないんですよね

 

まだ使い始めでどう変わるかわかりませんが、iPadProのある生活。

また、いい変化があればブログで発信していきます

現代文という科目

f:id:maikocho:20180109222152j:plain

明けましておめでとうございます🐕

今年は短くても平均週1ぐらいのペースでブログ書こうを目標にします

 

今週末はセンター試験ということで、個人的に高校生までで一番勉強法が掴みにくいと勝手に思っている「現代文」について書いてみます

 

今回書く内容は、僕自身がこう考えられるようになってからセンターでは8~9割以上をコンスタントに、かつ自分で解けたと確信して取れるようになった現代文の捉え方です。

 

理系なもので苦手ではなかったものの少し手こずった現代文

昨日も現役の理系高校生から「勉強の仕方がわからない」と相談を受けました

 やっぱり難しいですよね...

 

まず、目次です

 

現代文のイメージ

現代文という科目はそこそこ多くの人がこんな印象を持ってる気がします

「点数よかった?ラッキー!!」

「うわ、私の点数低すぎ...??*1相性悪かったかぁ」

どうせ運やし勉強しても無駄」

 

つまり、自分に合う文章、読みやすい文章がきたら良い点が取れるがそうでなければ、点数は取れなくても仕方がないと思ってしまいます

僕自身もずっとそうでした

 

しかし、よくよく考えてみてください

入試に使われる「現代文」は答えのある試験問題です

もう一度言います答えがあるんです

 

答えがあるということは必ずその答えが導かれるプロセスがあります

しかも受験者全員が同じ答えにたどり着けるはずなのです

そうでなければ試験問題としておかしいですね

 

したがって

「現代文」は本来決して運で点数が左右される科目ではない

ということができます

 

ではどのように現代文を捉え、勉強すればいいのでしょう

次はそれを考えてみます

 

現代文はこんなやつだ!(主観)

現代文を勉強するとは?

先に現代文という科目の僕の認識を伝えます。それは

「情報読み取りのピント合わせ」

です。詳しくみていきましょう

 

みんなが一度は聞く言葉の意味

まず、現代文を習っていると必ず聞くであろう言葉があります

「文章中に書いてあることで解答作るように。自分の考えを書いてはいけません。」

これはすごく正しくて、言ってしまえばこれが全てです。

でも、正直勉強し始めの人がこれを聞いても真意は理解しにくいと思います

 

読み解きましょう。

この言葉はさっきの「受験者全員が同じ答えにたどり着けるはず」ということの根拠になります

つまり、文章中の内容から解答を導くから同じ答えになる。ということです

 

これはすごく当たり前のことのように思います

そんなこと言われなくても分かってるという人もたくさんいるでしょう

しかし、間違える。

それは何故なのか、考えます

 

それはピントが合っていないからだ

ここでピント合わせの話になります

ピントは写真を撮るときに使いますが、つまり焦点のことですね

被写体とレンズの焦点距離の関係がうまいところで写真は綺麗に撮れます

 

現代文に言い換えると

本文にある情報(被写体)に自分の読みの深さ(ピント)をうまく合わせられたら正解(綺麗な写真)が得られる

ということです

 

したがって現代文を間違えるのは

自分の読みが深入りしすぎて本文中にない自分の体験等の情報を交えてしまっている、もしくは表面の字面だけを読みすぎて論理展開や感情の因果に気づいていない

つまり、ピントが合っていないから!ということになります

 

現代文をどうやって勉強すればいいのか

まず目標を確認しよう

では、どのように勉強すればいいのでしょう

僕はそのイメージこそ「ピント合わせ」だと思います

 

そこで、現代文を攻略するための目標は

「自分の考え・答えまでのプロセスを解説書にピタリと合わせる」

と考えれば良いでしょう

 

どうやってピントを合わせるか

さて、目標を確認したはいいもののどうやるかは難しいところです

方法は自分に合ったスタイルを最終的に見つければ良いのですが、実はこの部分に関わる内容は演習書等でポイントとして書いてある内容になると思います

 

まず、必ずして欲しいことがあります。それは

本文に線を引いたり矢印を引いたりする(マーキング)

です

 

マーキングすべき内容としては特に以下のものが挙げられます

  • 同内容表現
  • 対義的な表現
  • 因果関係

同内容については文構造的に相似なもののチェックも忘れないようにしましょう

 

マーキングの利点は以下です

  • 意味のあるマークをするために本文を読む頭がより働く
  • マーキングを辿れば思考プロセスをチェックできる

つまり、解説を読むときにマークを見直せばどこで自分が読み間違った(ピントがずれた)のかわかるということです

 

マーキングは面倒だからしないという人もたくさんいますが、これは読む(Input)とマークをかく(Output)を高速に繰り返し、文章をより咀嚼するということにもなるので、しないというのは勿体無いと思います*2

 

問題を解く際もマークはします

例えばよくある

「○○○○○(傍線部)とはどういうことか?最も適切なものを選びなさい」

という問題なら、選択肢の文章を区切りながら本文と異なる主張をしている部分に×、少し怪しいなと思ったら△をつけるなどして一番もっともらしいものに絞っていきます

 

あと、テレビでよく見る某現代文の先生曰く

「イコール(同内容表現のマーク)は引けば引くほど読めてる」

(言い方は忘れたけど多分こんな内容)なので本文読めないくらいマークしまくりましょう!

まとめ

今回はセンターが近いので現代文の話をしてみました

現代文を先ほどと別の言い換えで表現すると

「本文中からバイアスなしに情報を読み取り、論理的に解答に組み上げる」

科目だと言えます

 

勉強の流れとしては

  1. マーキングしつつ本文を読み、問題を解く
  2. 答え合わせで解説を入念に読み、自分の考え方とのズレを認識する
  3. ズレの原因やどう読めばいいかをもう一度本文に戻って確認する

これを繰り返すことになります

 

現代文は情報読み取りのピント合わせ

このことを念頭に置いて勉強するかどうかで、現代文の勉強の意味は大きく変わります

いくら演習しても丸付けして終わりでは運任せなままになりやすいです

 

今週末受験が今持つ全てを出し切れるよう、祈っています。

*1:年収は低くなりたくないものです...

*2:しなくてできる人は尊敬します...凡人には無理

結晶 3斜晶系(h k l)面の面間隔導出とキッテルの感想

久しぶりのエントリーです

しばらくバタバタしていてラズパイ関連あまり進められてません。残念。

とりあえずエセでもプログラムできますと言うために現在Pythonの本1冊勉強中です

 

さて、今回の内容はドタバタの原因の1つでもある固体物性論のレポートについて

 

「3斜晶系の(h k l)面の面間隔dを基本並進ベクトルa,b,cの大きさa,b,c、ベクトルa,bのなす角をγ、b,cのなす角をα、c,aのなす角をβを用いて表しなさい。」

 

という内容

 言い換えてしまえば、

7つの結晶系の面間隔の一般式を導出してね

ということです

 

導出の流れと参考にしたもの等々メモしておきます

 

固体物性論の参考書について

とにかく復習だ、とノートをペラペラ見ますが分かるようでスッキリしない

そこで参考書を買おうと固体物理参考書界で知らない人はいないこの本を購入しました

 

キッテル 固体物理学入門 第8版〈上〉

キッテル 固体物理学入門 第8版〈上〉

  • 作者: チャールズキッテル,Charles Kittel,宇野良清,新関駒二郎,山下次郎,津屋昇,森田章
  • 出版社/メーカー: 丸善
  • 発売日: 2005/12/01
  • メディア: 単行本
  • 購入: 1人 クリック: 5回
  • この商品を含むブログ (10件) を見る
 

 

本という存在の全てが好きなので名著といわれるものはいわば大好物です

早速読んでみますが...日本語が回りくどい

 

図がたくさんあって理解の助けになるのかと思いきや、図の説明文がわかりにくい

 

わかりました、これは名著ではありますが初学者向けとは言い難そうです

固体物性の何たるかがわかっていないのに手を出した僕が悪かった

 

ということで今回はノートをさらっと見返す復習にとどめ、初学者向けの参考書はまた探しましょう

とにかく目先のレポート内容に入っていきます

(h k l)面の面間隔を求める

結晶とは?

結晶は原子や分子が空間的に周期性を持って規則正しく配列したものです

その周期性の1単位となりうるものを結晶構造と言って良いでしょう

結晶構造は

  1. 空間格子と単位構造の組み合わせ
  2. 単位格子の積み重ね

という2通りの考え方で説明できますが、一般的に2の単位格子をよく使います

単位格子を表現する

単位格子は3つの線型独立なベクトルで表すことができます

この3つのベクトルを基本並進ベクトルと呼びます

a,b,cで表すことにしましょう

逆格子空間を導入する

フーリエ変換は時間tの空間と周波数ωの空間を繋ぎます

似たような関係として、実格子空間(実際に格子が存在している空間)と双対関係をなす逆格子空間というものを考えるようにします

 

逆格子空間を考えるメリットは

結晶構造と波動の相互関係が取り扱いやすくなること

です

現代の半導体技術を支える様々な材料の解析に役立つんだと考えておきましょう

 

この逆格子空間でa,b,cに対応するベクトルをa*,b*,c*と表して、逆格子ベクトルと呼びます

数式をブログ中でうまく書く術は今はまだ勉強する暇がないので見にくいですが

(LaTeX習得のためブログ中に数式を入れられるようになりましたが現在全て直す時間がないので少しずつ直してます 2018/07/23)

逆格子ベクトルは以下のように表されます

{ \displaystyle {\bf a}^* = 2 \pi \dfrac{ {\bf b} \times {\bf c } }{ {\bf a } \cdot ({\bf b} \times {\bf c })} }

{ \displaystyle {\bf b}^* = 2 \pi \dfrac{ {\bf c} \times {\bf a } }{ {\bf b } \cdot ({\bf c} \times {\bf a })} }

{ \displaystyle {\bf c}^* = 2 \pi \dfrac{ {\bf a} \times {\bf b } }{ {\bf c } \cdot ({\bf a} \times {\bf b })} }

スカラ3重積が分母に来て、分子には2πと外積が乗ってます

この辺りは調べると詳しい解説あると思います

格子面の表現

格子面は格子点を無限個含む平面と表現できます

また、格子面自体無限個あるのでうまく区別して表現しましょう

 

基本並進ベクトルa,b,cをそれぞれ整数h,k,lで割った3つのベクトルの終点を含む面を(h k l)面といいます

これで結晶構造中の固有の面を表現できます

 

ここで次のベクトルを定義しておきます

{ \displaystyle {\bf K}_{hkl} = h{\bf a}^* + k{\bf b}^* + l{\bf c}^* }

このベクトルは(h k l)面に垂直であるという重要な性質を持っています

面間隔の表現

(h k l)面は結晶中の固有の面の表現ですが、面を表現しているに過ぎません

結晶中にはある1つの(h k l)面に平行な面が無限個あると言えます

そこで最近接面間の距離はどの2面を考えても同じであるのでこれを面間隔{\displaystyle d_{hkl}}とします

 

先ほどの{\displaystyle {\bf K}_{hkl} } に関する性質から{\displaystyle d_{hkl}}は例えば次のように表せます

{\displaystyle d_{hkl} = \dfrac{{\bf a}}{h} \cdot \dfrac{{\bf K}_{hkl}}{|{\bf K}_{hkl}|}}

これを計算することで結局dhklは次のように表現できます

{\displaystyle d_{hkl} = \dfrac{2\pi}{|{\bf K}_{hkl}|}}

これを用いて計算を進めていきましょう

具体的な計算

先ほどの式は{\displaystyle |{\bf K}_{hkl}|}の計算が非常に面倒です

しかし、これまで定義してきた値を用いて計算は可能です

非常に綺麗にまとまったページがあったので具体的な計算は以下のリンクを参考にしましょう

 

三斜晶系格子面間隔の計算(pdf) - 鈴木実のホームページ

 

3斜晶系の体積

これも少しややこしいです

3つのベクトルが張る平行6面体の体積がすなわちスカラ3重積ですが、今回の場合は{\displaystyle {\bf a}}{\displaystyle {\bf b}\times{\bf c}}のなす角が簡単にはわからないため工夫が必要になります

 

反変ベクトルと共変ベクトルの関係を用いると比較的簡単に求めることができるそうですが、僕はこのあたりの勉強がまだなので分かる人は以下のリンクを参考にしましょう

三斜晶基本単位格子の体積 - 鈴木実のホームページ

 

誰でもわかる求め方を以下に示します

まずこんな感じに直交座標系と基本並進ベクトルをイメージしましょう

f:id:maikocho:20171204220737j:plain

 

先に大枠の考え方を示します

  1. {\displaystyle {\bf c}}のz成分(以下でfと定義する)を求める
  2. {\displaystyle {\bf a}}{\displaystyle {\bf b}}がつくる平行四辺形の面積を求める
  3. 1と2で高さと底面積を求めたことになるのでそれらの積が体積となる

以上です。考え方は中学生でもわかりますね

 

では、記事の初めの設定をもう一度思い出しましょう
「基本並進ベクトルa,b,cの大きさa,b,c、ベクトルa,bのなす角をγ、b,cのなす角をα、c,aのなす角をβ」

です

 

これらと図から各ベクトルを成分表示します

                    a = (a,0,0)

                    b = (bcosγ,bsinγ,0)

                    c = (d,e,f) (d>0 , e>0, f>0)

次に、cの大きさ、a,c内積b,c内積を考えることで以下の式が成り立ちます

                     d2 + e2 + f2 = c2

                     accosβ = ad

                     bccosα = dbcosγ + ebsinγ

この3式の第2式、第3式よりd,eがそれぞれ求められるので、これらを第1式に代入することでfの値が得られます

以上で「高さ」は求められました

 

次に「底面積」ですが、これは簡単でab外積の大きさがそのまま底面積の値になります

底面積Sとすれば

                           S  =  absinγ

です

 

あとはfとSの積を計算すれば体積Vが求められたことになりますね

このVを先述の面間隔のリンク先の結果式中のVに代入すれば面間隔の一般式を完全に得たことになります

 

非常に複雑な式ですが以下に示しておきます

画像でしか貼れないのはすみません...いつか勉強します

f:id:maikocho:20171204234422p:plain

 

まとめ

今回は結晶の面間隔の導出をまとめました

面間隔の表現のために逆格子空間の概念を導入してあとはゴリゴリ計算!

という感じです

 

最終の式は煩雑ですが7つの結晶系全てに通用する一般式になっているので単純立方等の面間隔が容易にわかる結晶でパラメータを入れて計算してみるといいと思います

 

さて、ラズパイ工作の方はPythonの勉強が終わってから徐々に再開していきます

テキストはこれにしました

みんなのPython 第4版

みんなのPython 第4版

 

 またこれの感想もあったらあげたいな

 

早くiPhoneでエアコンつけてから帰宅する夢叶えたい

Google Apps Scriptで遊んでみる

RasPi工作進めたいながらも突然のPIC工作課題やサークル仕事で滞る今日この頃です

サークルの方はそろそろ引退時期になってくるのでRasPiの本格再始動は数週間後に...

 

サークルといえば僕は会計をしているのですが、会計に関わる人間は数人いる上、活動場所の物理距離が離れているので一時期お金の管理が非常に大変でした

そこで試行錯誤ののち使い始めたのがGoogleAppsScript(略称GAS)

今回は導入までの経緯と使えるようになるところまでmemoしておきます

 

以下目次です

 

会計にGASを利用するようになるまでの経緯

僕の属するサークルは性質上支出が額的にも回数的にも多く、それに伴いメンバーの立替も多くなっていました。

さらに活動拠点が主に2箇所ですが物理的に距離がそこそこあり、会計が一人だと立替をしてくれたメンバーへの返金が滞ります。

 

以上の理由から会計は複数人いて、ゆうちょ銀行を利用することで2つの活動拠点それぞれで返金対応を可能としています。*1

 

しかし、お金の出入り口が1つでないということは、お金の正確な管理の難易度が上がったことを意味しています。

Aに対する支払いを相手がしたものと思っていたら実はBに対する同額の支払いだったなんてことも起こり得ます。

 

LINEで報告をし合うようにはしていましたが、会計の仕事に関すること以外の連絡も当然同じトーク画面で行うので漏れがあったり、本当に処理したのか後から確認することは困難でした。

 

そこで、物理的距離を解消し、かつ瞬時に正確に同じ情報を共有する目的でクラウドを利用することを思いつき、色々と調べた結果GASが一番手軽になんとか機能を実現できそうだということになったのです。

 

GoogleAppsScriptとは

Google Apps Script(通称GAS)は、Googleが提供する11のサービスをクラウド上でスクリプトを実行することで操作できるサービスです。スクリプトの言語は、JavaScriptをベースとしています。

<引用元>

uxmilk.jp

 

 簡単にいえば、Googleのサービスを自分好みに利用するためのツールというイメージかと思います。

JavaScriptベースということで少し勉強すればなんとか利用可能な状態にはなるかと思います

 

ただし!それは導入ができれば、の話です。

サイトってどうなってるんだ、ページ間の結びつきは?と分からないことだらけだった僕は結構苦戦してしまいました...

今回作ったものとそれに利用したもの、利用の方法など見ていきましょう

会計の補助ツールとして作ったもの

  • 登録に用いるフォーム
  • フォーム入力内容が飛ばされる表

以上2つです

フォームはGoogleフォームというのもありますがパッと見た感じ作りたい内容のフォームが作れなかったので独自で作りました

 

表はGoogleSpreadSheetを利用します

普通に表計算ツールですが、GASと組み合わせることで様々な機能を実装できます

では、GASの導入方法を見ていきます

 GASの導入

Googleアカウントがあれば誰でも利用可能ですが、導入に少し操作が必要なので見ておきます

Googleドライブにアクセスして

新規>>その他>>アプリを追加 を選択

f:id:maikocho:20171022122801p:plain

GoogleAppsScriptを探します

よく利用されるのでトップに表示されていましたが見当たらない場合は検索しましょう

f:id:maikocho:20171022123035p:plain

ポインタをGASの位置に移動すると以下のようになるので「接続」をします

f:id:maikocho:20171022123135p:plain

以上でGASが利用できるようになりました!

もう一度ドライブで新規をクリックするとGoogleAppsScriptが増えていることがわかると思います。

f:id:maikocho:20171022123307p:plain

GASでフォーム等のアプリケーションを作る手順

f:id:maikocho:20171022124555p:plain

先ほどの続きでGASを開くとこんなページが出てくるかと思います

関数を定義して動かしていくので最初から

 

function myFunction(){

 

}

という記述があります。

これで色々な処理を記述していくわけですが、処理の書き方はJavaScriptやGASのリファレンス等を参考に勉強します

developers.google.com

最終どんなものをどんな形で公開するか、を考えないといけないです

「公開」の項目は次のようになっています

f:id:maikocho:20171022125121p:plain

各項目の詳細についてはここでは割愛します

今回僕自身が利用したのは一番上の「ウェブアプリケーションとして導入...」です

これによって独自のフォームを作っています

 

しかし、拡張子.gsのコードだけではページの中身はできません

HTMLファイルが必要になるので「ファイル」よりHTMLファイルを追加してページな中身を書きましょう

f:id:maikocho:20171022130114p:plain

 

書けたらウェブアプリケーションとして導入していきます

公開>>ウェブアプリケーションとして導入...

を選択すると次のような画面が出てきます

f:id:maikocho:20171022130740p:plain

  • プロジェクトバージョン
    プログラムを更新するたびに新しくしましょう
  • 次のユーザーとしてアプリケーションを実行
    これは「自分」と「ウェブアプリケーションにアクセスしているユーザー」の2つから選びます
    一般にみんなに使ってもらうようにする場合「自分」でいいかと思います
  • アプリケーションにアクセスできるユーザー
    これは「自分だけ」「全員」「全員(匿名ユーザーを含む)」から選択します
    今回はとにかくサークルメンバー全員に使ってもらいたいので「全員(匿名ユーザーを含む)」を選択しましょう

これで導入をクリックすれば共有のためのリンクが生成されて利用可能になります

GASとSpreadSheetの結びつけ

ここは全く無知だった僕にとって結構な難所となった部分です

2つの機能をどうやって結びつけて利用するのか

具体的に見ていきます

GASからSpreadSheetを指定する

様々な処理は先ほど述べたようにGASの拡張子.gsとついているファイルの中で関数の形で書いていきます。

この処理の対象としてシートを指定したい、そこでいろいろ調べてみると「シートのid」を指定しましょうと書かれています

 

シートのidって何?

 

概念的にはわかるけどどれのことか詳しく言ってくれないと分からないよ!

と怒りながらも探し続けてようやくわかりました

 

Googleドライブより

新規>>Googleスプレッドシート を選択して新しいファイルを作って見てください

開いたシートのURLの部分を見てみると以下のような形になっています

 

https://docs.google.com/spreadsheets/d/(アルファベットと数字の文字列)/edit#gid=0

 

勘の良い方はお気づきでしょう

この(アルファベットと数字の文字列)と書いた部分、ここがシートのidとなります

この文字列で扱うシートを指定するんですね

 

GASでこのシートを指定するときは例えば以下のように記述します

 

var id = "(アルファベットと数字の文字列)";

var ss = SpreadsheetApp.openById(id);

 

ここまでで"ss"という変数によって先ほど作成したスプレッドシートのファイルまでは指定できるようになりました

しかし、ここまでではスプレッドシート全体を指定しているので複数枚作れるシートについてどのシートに関して処理を行うのかも指定しないといけませんね

そこで以下のような記述を追加しましょう

 

var sheet = ss.getSheetByName("シートの名前"); 

 

ここで赤字にしたssというのは先ほど定義したssのことです

したがって別の変数名にした場合は適宜変えるようにします

「シートの名前」は以下の画像に示す部分の名前をそのまま入れます

f:id:maikocho:20171022144818p:plain

この画像の場合は

 

var sheet = ss.getSheetByName("シート1"); 

 

とすればこのシートを指定できるということです

 

シートへの処理は基本的に

  1. セルを指定する
  2. セルのデータを取得するorセルに値をセットする

の流れで行うことになるでしょう

 

ここまでで別々に作ったファイルどうしの相互利用みたいな部分はわかるようになったかと思います

次はシートからシートに付属したような形のスクリプトエディタの扱いを見ていきましょう

 

スクリプトエディタからシートのデータを扱ってみる

 スプレッドシート内のデータをいろいろ触るための処理を記述して必要な機能を追加してみましょう

ツール>>スクリプトエディタ をクリック

f:id:maikocho:20171022174142p:plain

するとドライブから新規でGASを選択した時と全く同じページが現れます

ここに表を触るための処理を書いていきます

スプレッドシートの指定

先ほどはidからシートを指定していきましたが、実はもう一つ方法があります

それは以下のような指定方法です

 

var ss = SpreadsheetApp.getActiveSpreadsheet();

 

おそらくこれはシートに最初から紐づいたGASだから使える指定方法だと思います

これで先ほどのidで指定したようなスプレッドシートのファイル全体を指定する変数をssとできました

 

詳しいことが書かれたページを見つけたので貼っておきます

qiita.com

 

次に何かの機能を実際につけてみましょう

条件に合う項目の金額を足し合わせる

会計の補助ツールとして開発しているのであると便利な機能です

f:id:maikocho:20171022175509p:plain

こんな形の表において

  1. A2セルに氏名を入力する
  2. E列からA2の名前と合致する名前を見つけ、以下の条件に合う列の金額を合計して「返還金額」に表示する
    <条件>
    ・C列の「分類」が「支出」であること
    ・K列の「領収書」にチェックが入っていること
    ・I列の「返還」にチェックが入っていないこと

このような機能を実装しましょう

条件は結局、立て替えてくれたお金の中で領収書も会計がちゃんと確認したもののうち、まだ返金が済んでいないお金を探し出すようになっています

 

実際のプログラムは以下のようになっています

 

1 function onEdit(){
2   var ss = SpreadsheetApp.getActiveSpreadsheet();
3   var sheet = ss.getSheetByName("会計報告");
4   var lastRow = sheet.getLastRow();
5   var range = sheet.getRange(2,1);
6   var sum = 0;
7   for(var i = lastRow; i > 3; i--){
8     var range1 = sheet.getRange(i,9);
9     var range2 = sheet.getRange(i,5);
10    var range3 = sheet.getRange(i,11);
11    if(range1.getValue() == false && range.getValue() === range2.getValue() && 12    range3.getValue() != false){
13      var range4 = sheet.getRange(i,7);
14      var value = range4.getValue();
15      sum += value;
16    }
17  }
18  var range5 = sheet.getRange(2,2);
19  range5.setValue(sum);
20 }

 

上から要点を解説しましょう

1 関数の名前です。onEdit()は少し特別な関数名でシートに編集が加わった際に自動で行われる処理を記述できます。
逆に言えば、シートに変更を加えるだけで自動で起動してほしい処理を書くために使う関数名です。

 

4 シートにデータのある最終列の行番号を取得しています。上の画像の場合、具体的な金額等の登録データが4行目以降に入りますが、まだ空なのでlastRowには3という値が入ります。

 

5 2行1列目、つまりA2のセルを取得しています。A2という値で指定することもできます。その場合は(2,1)の部分を("A2")と書けば良いです。

 

6 最終的に合計金額の値を入れるsumという変数を初期値0で定義しています。

合計金額を入れる箱を準備したイメージです。

 

7-17 最終行から4行目までをチェックしていく処理をfor文で書いています。

range1〜range3はそれぞれ条件として吟味する列のセルの位置を指定しています。

11 から始まるif文では先ほど定義した各rangeに対してgetValueでセル内の値を引っ張ってきて条件判断しています。具体的には以下のように対応しています

 

①I列の「返還」にチェックが入っていないこと↔︎range1.getValue() == false

②A2に入力された名前と吟味する行の氏名列の値が一致していること↔︎Erange.getValue() === range2.getValue()

③K列の「領収書」にチェックが入っていること↔︎range3.getValue() != false

④C列の「分類」が「支出」であること↔︎???

 

実は分類が支出かどうかは、収入分類であれば最初から「返還」にチェックを入れるプログラムを別で動かしているので①で判断できてしまいます。

このプログラム内でこの条件を入れる場合はrange6 = sheet.getRange(i,3)のような形で「分類」の列を取得してきてif文の条件式内に入れましょう。

 

さて、そして13-15の部分で条件に当てはまる金額の値を取ってきてsumに足し合わせています。

ここまででsumに表示したい金額が入ったのであとは表示させるだけですね

 

18-19 B2セルを取得し、sumの値をセットする処理を書いています。

 

長かったですが以上がプログラムの内容の解説です。

初心者なので至らないところも多々ありますがその辺はご勘弁を...

 

実際動かしてみると楽しいものです

今回はonEdit()という特殊な関数でしたが、自分で様々な処理を行う関数を用意すると思います。

すると、シートから処理を指定して使いたいこともありますね

次はそんな時に便利な関数です

スプレッドシートに独自の処理メニューを追加する

f:id:maikocho:20171022185139p:plain

赤丸で囲んだ部分はシートに関するいろんな機能が入ってますね

ここに自分の書いた処理を実行できるメニューを追加しましょう

 

プログラムは以下の通りです

 

function showMenu(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [
  {name: "機能名1", functionName: "function1"},
  {name: "機能名2", functionName: "function2"},
  {name: "機能名3", functionName: "function3"},
  ];
  ss.addMenu("処理メニュー", menu);
}

 

意外と短い処理です

機能名と書いた部分は関数名で指定した処理にふさわしい名前を書けば良いです

また、メニューはシートを開いたら自動であの欄に追加されて欲しいので「トリガー」という機能を使います

 

f:id:maikocho:20171022190853p:plain

 時計のようなマークがトリガーです

GASで書いたプログラムは書いただけではただの処理の羅列で起動するタイミングを与えてやらないといけません

そこで利用するのがトリガーというわけですね

f:id:maikocho:20171022191057p:plain

 押すとこんな画面が出るので今すぐ追加しましょう

f:id:maikocho:20171022191137p:plain

関数を選んでいつ処理するかを指定していきます

今回はシート起動に合わせてshowMenu()というプログラムが実行されて欲しいので以下のようにします

f:id:maikocho:20171022191257p:plain

これで保存完了したら一旦シートを閉じて再度開き直してみましょう

もし保存後に承認が云々というページが出てきたら承認して動かせるように進めて行ってください

f:id:maikocho:20171022191455p:plain

シートを再度開くとしっかり「処理メニュー」が追加されます

処理メニューとかいた部分は他の名前でも大丈夫ですのでお好みでつけてくださいね

 

まとめ

GASめちゃくちゃ便利です

今回は独自フォームについて詳しく触れませんでしたがまた機会があればそちらのソースも公開していきます

 

様々なデータ管理に一役買ってくれそうなGAS、今後も活用術考えていきたいです!

そして次こそはRasPi触っていきたい所存。それでは

*1:ゆうちょ銀行はキャッシュカードのみ、通帳のみでATMからの引き出しが可能