Linuxで動かすswiftからC++のコードが呼びたい

どうも,まるさ@maruuusa83です.

xcodeを使わない,CLIのswiftからC++コード呼び出すのにちょっと困ったのでメモします(初心者丸出し)

Linuxとかでswift書いてて困った人どうぞ







知っておくべきこと

  • swiftからはC/Objective-Cしか呼び出せない
  • swiftcを使うと-import-obj-headerでブリッジヘッダが指定できる

適当にググるxcode使ってる場合の情報ばかりなので困りましたが,なんとかなりました.

ブリッジするときC++成分があるとSwiftが怒るので注意します.







C++のコードのオブジェクトファイルを用意する

後でリンカに食わせるC++バイナリが必要になります.

Cとくっつけるためにextern "C"したC向けWrapperを用意する必要があります.


HelloSwift.cpp

#include <iostream>

class HelloSwift
{
public:
    void hello_swift_from_cpp()
    {
        std::cout << "Hello Swift from C++!\n" << std::endl;
    }
};

extern "C" void helloswift(void)
{
    HelloSwift hs = HelloSwift();
    hs.hello_swift_from_cpp();
}


オブジェクトファイルつくりましょう.


$ g++ -c HelloSwift.cpp



ブリッジヘッダファイルを用意する

Swfitで読み込むCかObjective-Cのヘッダファイルを用意します. ここでC++成分が残っていると文句を言ってきますので注意.

具体的には,C++のときにextern "C"しておいたWrapper群を列挙します.


bridge.h

void helloswift(void);



swiftをかく

ここまでくるとC++コードがswiftから呼べるようになります.うれしい. ヘッダはコマンドオプションで直接指定するのでimportの必要はありません.

test.swift

// bridge.h is imported

helloswift()



swiftcする

先ほど書いたブリッジヘッダファイルを-import-objc-headerで指定しておくのがミソ.あと,C++のオブジェクトファイルも渡しておきます.


$ swiftc -import-objc-header bridge.h test.swift HelloSwift.o
$ ./main
Hello Swift!


動いた!







それでは,今回はこのへんで ノ

まるさ

JavaとPythonでFPGA回路設計をするための開発環境作ったよ

どうも,まるさ@maruuusa83です.

ひさしぶりに真面目に技術っぽい記事かきます.




現在ぼくは,コンピュータ・アーキテクチャあたりの単語をキーワードとしている研究室で活動をしています.

もともとずっとソフトやってたのでヒーヒー言ってます.

高位合成(HLS, High Level Synthesis)という技術がホットだそうで,色々あってツールを統合するツールを作りました.










PyJer: JavaPythonでサクッとZedBoardアプリを設計するよ!なフレームワーク

github.com


Java言語ベースの高位合成ツールSynthesijerPythonベースのIPコア合成フレームワークPyCoRAMを組み合わせていい感じにサクッとZynqアプリがつくれます.

まだREADME雑にしか作ってないですがご勘弁を.


今回作ったフレームワーク嬉しいところは,JavaPythonでロジックを書いたらあとはBOOT.binの生成まで勝手にやってくれるところです.

ぼくはこいつをGitlab CIに食わせてDropboxに出来上がったBOOT.binを投げ込んでくれるようにしています.

OS載せたZynqを想定しているので,ビルドをフックさせて自動デプロイまでできると思います.




github.com

github.com










どんなもの?

次のようなアーキテクチャのハードウェアの構築のためのフレームワークです.


f:id:maruuusa83:20160630124507p:plain

ハードウェアの概略構成


このような構成に限定しているために,BOOT.binの生成まで勝手にやってくれます.


赤枠が自分で実装することになる部分です.

IoTデバイスのような,外部回路(センサなど)からデータを受け取ってインターネットへ出力するデバイスの プロトタイピングのためのツールとして作成しました.


User Logicの領域は主にJava言語のフツーのプログラムとして記述します.

Synthesijerを用いた高位合成によってハードウェアが合成されます.

ぼくは外部回路との通信などクロックレベルのタイミング管理が必要な部分はVerilogで書いてJava側から呼び出しています.


PSとPLの間のデータ共有は,PyCoRAMが生成するCoRAMアーキテクチャを使って行ないます.

そのため,Data Flow ControllerPythonによって記述することになります.


User Logicで処理したデータはDRAMに転送できるので,Linux上のプログラムから自由にデータを使うことができます.










つかいかた

(v0.2.1時点での使い方です.この後変更の予定があります.詳細な使い方はまた別にまとめます.)


1.前提



2.導入

とりあえずGithubからcloneしてきます.

cloneが済んだらmake initしてみてください.

このコマンドでSynthesijerとPyCoRAMがプロジェクト内にクローンされます.


いちおう,make testというコマンドを用意しています.サンプルプロジェクトを展開してビルドしてcleanするというもので, きちんと導入できているか確認するのに使えます.が,マシン次第でとても時間がかかることがあるので注意してください.



3.ハードウェアの開発

テスト用に作ったサンプルプロジェクトがtestディレクトリ内にあります.

testフォルダをルートに読み替えた感じでコードを配置することになります.

すなわち,

  • Synthesijer関連:プロジェクトルート直下
  • PyCoRAM関連:pycoram直下
  • Vivado関連:vivado-autobuilder下

となります.

シンプルなプロジェクトならば,PyCoRAM周りはtestのプロジェクトをコピペで作るのが楽かと思います.



4.ビルド

ルート直下のMakefileの最初のほうに設定項目があります.

  • TOP:Synthesijerのトップモジュールのファイル名
  • MODULES:Synthesijerで書いたモジュールのファイル名一覧
  • WRAPPERS:Verilogコードを使っている場合,SynthesijerによるそのWrapperのファイル名一覧
  • VERILOG_MODULES:Verilogで記述したモジュールのファイル名一覧


たとえば,testプロジェクトだと次のような記述になります.

TOP=SumTestTop.java
MODULES=SumTest.java Dummy.java
WRAPPERS=
VERILOG_MODULES=


PyCoRAM関連のソースコードのファイル名はtestプロジェクトと同様にしていれば特に設定の必要はありません.

もし必要があれば,Makefileのマクロを書き換えてください.



開発途中,Javaの合成だけしたい!とかそういう場合はsynthesijer_buildpycoram_buildなどの makeコマンドを使うとよいです.










さいごに

PyJerではJavaPythonで簡単なヘテロジニアスなプロセッシング環境のプロトタイピングができます.

複数のセンサやモータを取り回すようなものづくりに使えるように書いてみました.

サクッと書けてCIも回せるので良い感じだったと思います.(締めが雑)


Synthesijerの三好さん,PyCoRAMの高前田さん,お世話になりました.ありがとうございます!






というわけで,ツールを書いたお話でした.


それでは,今回はこの辺で ノ

まるさ

新宿御苑以外にもよい公園はたくさんあるんだよ!!!!

どうも,まるさ@maruuusa83です!







自然の多いところにいきたい


どうでもいいことですが,ぼくはよくぼっちで自然のある場所を探し求めます.

でも都会の有名なところはカップルがいっぱいでぼっちでいるぼくは少なからずヘコみます.

ぼっちでは手をつないだり知らない植物見てキャイキャイしたりできないわけです.

新宿御苑とか神代植物公園とかいいところだけど若干ぼっちには厳しい.


まわりのみんなが「新宿御苑新宿御苑!」としか言わないので御苑以外に東京都心から電車一本で行ける個人的に好きなところをボソリとつぶやきます.

もちろん新宿御苑も素晴らしい.秋のモミジバスズカケノキ並木は最高.










神代植物公園


調布市にある神代植物公園です.

最近大温室がリニューアルしたので行きたくてウズウズしています.

タイミングによっては人がちょっぴり多いのでぼっちだとつらいことがあります.気を付けましょう.

基本的には植物を鑑賞するための公園で,遊んだり寝転んだりする場所はありません.


個人的に好きなのはバラ庭園.

バラシーズンの直前には藤のカーテンがキレイでした.


f:id:maruuusa83:20160615062344p:plain

甘い香りで甘い気分に(?)


f:id:maruuusa83:20160613191018j:plain

神代植物公園は高い木が多くて涼しい


深大寺門から直接深大寺に出ることができます.

参拝するのもよし,深大寺そばを食べるのもよし.

このあいだ一人で行ってそば饅頭を2つ買ったのですがカップルで食べるものだと思われてなんかツラかったです.


ぼくは歩くのが好きなのでこのまま野川沿いに武蔵国分寺公園向きに北上していくのが好きです.(見どころがたくさんある)

逆に南下していくと二子玉川のほうまで行けるようです.


なんか自分で撮った写真が少ない・・・










武蔵国分寺公園


じ,じつを言うと武蔵国分寺公園のほうに入ったことはありません.

が,野川遡上をしていくとお鷹の道~真姿の池のほうに出ることができます.ここいいんですよね.


f:id:maruuusa83:20160615063654j:plain

お鷹の道


武蔵国分寺公園のほうまで入ったことはないのですが,芝が広がってて良いところっぽいです.

友達も「ダンケパーク」と呼んでいました.

この公園,旧国鉄中央鉄道学園跡地だということは前から知っていて,廃線/軌道跡めぐりをしたくて仕方がないです.


f:id:maruuusa83:20160615064152p:plain

この公園について|武蔵国分寺公園|公園へ行こう!

武蔵国分寺公園Webサイト










昭和記念公園


この記事の真打です.新宿御苑の対抗馬ですね.

だいたい新宿御苑の倍くらいの広さがあって,自然を残したエリアから巨大な芝生エリアまでなんでもアリです.

新宿御苑と似てこそいますが,もうちょっとカジュアルな感じの公園です.


f:id:maruuusa83:20160615070623j:plain

冬の暖かい日の昼寝は最高


f:id:maruuusa83:20160615070903j:plain

春には色々な桜が見れる


日本庭園も整備されていて,盆栽の展示なんかもやってます.

雪吊りもやってます.


f:id:maruuusa83:20160613191235j:plain

f:id:maruuusa83:20160613194009j:plain

昭和記念公園の日本庭園は個人的な穴場.お抹茶が頂ける.




ここは案外ぼっちでもつらくない.ぼっちである事実を除けば.










武蔵野はたくさん公園があって良い


ここまでで紹介しませんでしたが,武蔵野にこればまだまだたくさんの公園があります.

武蔵野の森を残したような公園で,広場があって,というかむちゃくちゃ広くて・・・的な.


今の時期はハケの保存区でホタルが見られます.


f:id:maruuusa83:20160615065510j:plain

武蔵野には自然公園が多い


中央線から北上すると多摩湖があります.

徒歩だと好きじゃないとキツいですけど,自転車好きならこっちもアリです.


f:id:maruuusa83:20160613194318j:plain

多摩湖近辺は森が残っていて野鳥観察が楽しい







東京の公園ってデカくていいですよね.

都心の公園だと外の喧噪とのギャップがなんだか不思議です.

浜離宮恩賜庭園まだ行ってないので行ってみたい.




それでは,

今回はこのへんで ノ


まるさ

上三依水生植物園でメコノプシスのお花見てきた

どうも,まるさ@maruuusa83です!




植物大好きマンのぼくが「日本では育たないという幻の青いケシ」を探し求めた話です.

大自然を駆け巡り,スピリチュアル体験をし,蛇に囲まれながらも幻の花を見るスペクタクルストーリー(?)


f:id:maruuusa83:20160614081733j:plain

このあと30分森で迷子になった










好きな花


ぼくはケシが好きです.アヘンはいらないです.

食べるほうじゃないです.花のほうです.

可愛いですね.かわいい.


というかキンポウゲ系の花が好きなんですよね.

いやー,キンポウゲって良くないですか?????


ちょっと前まで育ててたキンポウゲ科アネモネ


f:id:maruuusa83:20160613222007j:plain

Anemone coronaria 16/3/22


こういう雄しべ雌しべがワーッとあるような花が好きです.

最近よくSalvia guaraniticaを見かけるのでトリカブトの花の時期が楽しみになっています
(まだみたことない)

というか青い花の話ばかりですね.ええ,青い花好きです.

百合のほうではなく花のほうです.花のユリはカタカナにすることにしましょう.


筑波実験植物園に咲いてたなんだか珍しいオオミスミソウ
(これ同定大変だったし本当に正しいのか)


f:id:maruuusa83:20160613225212j:plain

二重咲のオオミスミソウ.葉の斑と紫もかわいくて一目ぼれ.
Hepatica nobilis Schreb. var. japonica
16/4/1




閑話休題

メコノプシス・ベトニキフォリアってご存知ですか?

ぼくはご存知です(?)


日本では「ヒマラヤの青いケシ」などと呼ばれているそうで,中学生の頃からずっと見たくて仕方のない花です.

なかなか日本では栽培困難らしくぼくの中では幻の花,伝説の花と位置付けられています.

でも通販でならなんとか買えるみたいだし・・・どっか見れるんちゃうのん・・・










ということでメコノプシスを見る旅に出る


日光市の北のほうにある植物園で見れるらしい情報をGETしたので,いざ日光へ.

ぼっちで.


f:id:maruuusa83:20160614084636j:plain

253系.ほんとうは東武100系に乗りたかった.


目的地は日光のはるか北ということで,きぬがわで鬼怒川温泉駅まで.


f:id:maruuusa83:20160614085834j:plain

ここまで2時間半ぐらい


この後東武鬼怒川線野岩鉄道会津鬼怒川線に乗るのですが,本数が少ないのでここで一時間ほど休憩することになります.

出発のとき切符がうまく買えなかったのですが,駅員さんが「あー忙しいからこれあげる」と言って着駅清算券なるものをくれました.ご迷惑おかけしました・・・


f:id:maruuusa83:20160614090421j:plain

着駅精算券.このすぐ隣でカップルがイチャイチャしててつらかった.ぼっちなので.


野岩鉄道線内に進入するとトンネルだらけでハァー電波も無エ,景色も無エ,電車もそれほど走って無エって感じです.

さらにもう40分くらい電車に乗ります.










上三依塩原温泉口駅に到着


f:id:maruuusa83:20160614092449p:plain

f:id:maruuusa83:20160614091213j:plain

あーっ山奥~~~みたいなところでとても良い


電車が少ないので,この辺まで来ると日帰りが厳しくなってきます.

空気がキレイで気持ちいい.


この駅にはパワースポットがありました.

自らパワースポットだと名乗るパワースポットは初めて見ました.


f:id:maruuusa83:20160614092643j:plain

自己主張するパワースポット


よくわかんないですが,知らないおじさんがこの上に立って上を見上げながら「そうか・・・」とつぶやいて何かを感じているようでした.

花を見る前に何かに連れていかれるのは困るのでぼくはやりませんでした.


このあとまたほんの少し歩きます.










上三依水生植物園に到着


家からどえらい遠かったですが,ようやく植物園に到着しました.

まだ花見てないのにすごい達成感です.


f:id:maruuusa83:20160613221217j:plain

見切れている案山子は遠くから見ると「二人組の何かを構えた農民」なのでとても怖い思いをした


f:id:maruuusa83:20160614093428j:plain

すごいところに来てしまった感.滝とかある.


新宿を発ってからここまで4時間かかりました.

日帰りをしようと思うと場合によっては20分しか見れません.秘境.




植物園の中は山草,水辺の草が中心でした.

こういう雰囲気の植物園は楽しい.


f:id:maruuusa83:20160614094215j:plain

ニッコウキスゲ.ユリみたいな花だけどユリ科じゃない(とはいえ旧ユリ科).
Hemerocallis dumortieri var. esculenta 16/6/11


f:id:maruuusa83:20160614101006j:plain

ニリンソウかなあ.看板にはミヤコワスレとあったけどちゃうよな・・・
(たぶん)Anemone flaccida 16/6/11







この植物園なんかヘビさんがたくさんいる


ヘビには詳しくないけど,アオダイショウかなあ.
Elaphe climacophora(いちおう調べた)


このときどうもカエルさん狙ってたのか,ぼくに驚いたヘビさんに驚いたカエルさんが一目散に逃げていきました.

ヘビさんたち水辺のやぶとか橋の下とかでうにょうにょしてました.


f:id:maruuusa83:20160614102953j:plain

ずいぶん奥のほうに注意書きがありました.ておくれ.












そして幻の花を・・・


中学生の頃から見たいみたいと思っていた花にようやく,8年の念願かなってお目にかかることができました.ぼっちで.


f:id:maruuusa83:20160613220728j:plain

これが探し求めた幻の花だ!!!!!
Meconopsis betonicifolia 16/6/11


いやぁ,なんか思ってたよりたくさん咲いてる.


f:id:maruuusa83:20160614103421j:plain

赤が入るのもいるらしい.
Meconopsis betonicifolia 16/6/11


同定が怪しい.看板には「ヒマラヤの青いケシ(メコノプシス属)」としかなくて種名がわからない.

写真からじゃ同定しにくいですね・・・

現地はヘビが怖くて一か所にとどまれなかった←







さいごに


ようやく長年の夢だったメコノプシス属の花を見ることができました.

いやぁ,たくさん咲いててよかった.


この後当然帰れなくて日光で一泊しました.

電車移動にものすごく時間がかかるので観光も温泉もお預けでした(笑)


これまで行った植物園の中でも結構おもしろいところでした.

1時間くらいたっぷり見て回れてボリュームも満点でした.

満足満足.


f:id:maruuusa83:20160614104823j:plain

特急に遅れそうで「仕方ないのでこれで行ってください・・・」と発行してもらった二回目の着駅精算券




それでは

今回はこのへんで ノ


まるさ

Google Spreadsheetでチケット駆動生活をするはなし(タスク追加アプリ編)

どうも,まるさ@maruuusa83です.




Google Spreadsheetでチケット駆動生活をするはなし(スプレッドシート編)に引き続き,

スクリプトとアンケートフォームを使ってタスク追加アプリを実装していくぞ編です.







タスク追加アプリ?


スプレッドシートでタスク管理するってよくあることだとおもいます.

でもタスクの追加って面倒じゃないですか・・・?

ぼくはセルひとつひとつにいちいち打っていくのが面倒ですく投げ出してしまいます.

というかスマホからタスク追加したい



というわけで,今回はスマホから楽にタスク追加できるように前回のスプレッドシートを拡張していきます.







1. タスク登録ページをGoogleフォームで作る


Googleフォームを使えば,一発でクロスプラットフォームなタスク追加アプリが作れそうな気がします.

というわけでタスク管理スプレッドシートに関連付けてアンケートフォームを作ります.




1.1 新しいフォームの作成

まずはスプレッドシートから新しくフォームを追加します.

メニューバーから 挿入 > フォーム を選択してください.


f:id:maruuusa83:20160609095353p:plain

新しくフォームを追加


すると新しいフォームの編集画面が表示されるかと思います.


f:id:maruuusa83:20160609095549p:plain

新規フォームの編集画面




1.2 フォームの編集

必要な項目をガシガシ追加していきます.

今回は次の項目を用意します.

質問 必須 入力方法
タスク名 Yes 記述式
締切日 日付
タスクの詳細 記述式
メモ 記述式
タグ 記述式
親タスク 記述式
継続タスク 記述式


f:id:maruuusa83:20160609095933p:plain

まずはタスク名の登録フォーム


f:id:maruuusa83:20160609100045p:plain

質問の追加


f:id:maruuusa83:20160609100754p:plain

設定を進めていく


編集が完了したら右上の「送信」のボタンを押してURLのタブを開いて,フォームのURLを取得しておきましょう.




1.3 状況の整理

これでフォームの作成ができました.クラスプラットフォームなアプリの完成(!)


f:id:maruuusa83:20160609102942j:plain

スマホでも見られる(これは自分で実際に使っているタスク管理アプリ)


スプレッドシートには「フォームの回答1」という新しいシートが追加され,質問に回答するとここに反映されるようになっています.


f:id:maruuusa83:20160609101323p:plain

回答一覧のシート







2. スクリプトを使ったフォームの回答のコピー


先ほどのフォームの回答はタスク管理のシートに登録したいわけなので,「フォームの回答1」からタスク管理のために作ったスプレッドシートに自動的にコピーするようにしていきます.




2.1 下準備

スクリプトを書くときに設定しやすいように,シートの名前を統一しておきましょう.

フォームの回答が保存されるシートを「フォームの回答」タスク管理のために作ったシートを「タスク一覧」とすることにしました.


f:id:maruuusa83:20160609115356p:plain

シートの名前の変更




2.2 コピーするスクリプト

2.2.1 新しいスクリプトの作成

ここからはスクリプトを書いていくので,スクリプトエディタを開きます.


f:id:maruuusa83:20160609104959p:plain

スクリプトエディタを開く


f:id:maruuusa83:20160609105128p:plain

スクリプトエディタ


新しいスクリプトを作成します.


f:id:maruuusa83:20160609105927p:plain

新規スクリプト


名前はcopyFromFormとでもしておいてください.

最初から追加されているコード.gsは削除してしまって構いません.新しいスクリプトを作成するかわりにコード.gsをリネームするのでも構いません.



2.2.2 列をコピーするスクリプト

次に示すスクリプトは,せっせと列の内容をコピーするものです.


ところでスクリプトの最初のほうの<スプレッドシートのID>というのは,スプレッドシートを開いているときのURLの中に含まれているIDです.

入力する必要があるので,記録しておいてください.


https://docs.google.com/spreadsheets/d/<スプレッドシートのID>/edit#gid=<シートのID>

スプレッドシートのIDの位置


あ,あと,スクリプトを保存しようとするとプロジェクト名を決めろと言われるので,適当にtask_managerなど名前をつけておいてください.


function copyFromForm() {
  var spreadsheet = SpreadsheetApp.openById("<スプレッドシートのID>")
  var sheets = spreadsheet.getSheets();
  for (var i in sheets){
    if (sheets[i].getSheetName() == "フォームの回答") {
      formans = sheets[i];
    }
    if (sheets[i].getSheetName() == "タスク一覧") {
     tasks = sheets[i];
    }
  }
  
  var newtaskrow = formans.getLastRow();
  var taskslastrow = tasks.getLastRow();
  
  // タスクID
  tasks.getRange(taskslastrow + 1, 1).setValue(tasks.getRange(3, 2).getValue() + 1);
  
  // 状態
  tasks.getRange(taskslastrow + 1, 2).setValue("未着手");
  
  // タスク名
  tasks.getRange(taskslastrow + 1, 4).setValue(formans.getRange(newtaskrow , 2).getValue());
  
  // 締切
  tasks.getRange(taskslastrow + 1, 3).setValue(formans.getRange(newtaskrow, 3).getValue());
  
  // タスク詳細
  tasks.getRange(taskslastrow + 1, 5).setValue(formans.getRange(newtaskrow, 4).getValue());
  
  // メモ
  tasks.getRange(taskslastrow + 1, 6).setValue(formans.getRange(newtaskrow, 5).getValue());
  
  // タグ
  tasks.getRange(taskslastrow + 1, 7).setValue(formans.getRange(newtaskrow, 6).getValue());
  
  // 親タスク
  tasks.getRange(taskslastrow + 1, 8).setValue(formans.getRange(newtaskrow, 7).getValue());
  
  // 継続タスク
  tasks.getRange(taskslastrow + 1, 9).setValue(formans.getRange(newtaskrow, 8).getValue());
  
  // 最終更新
  tasks.getRange(taskslastrow + 1, 10).setValue(formans.getRange(newtaskrow, 1).getValue());
}

フォームの回答をコピーするスクリプト


<スプレッドシートのID>で指定したスプレッドシートからフォームの回答シートとタスク一覧シートを探し出し,フォームの回答の最終行をタスク一覧の最終行へ追加する.という処理をおこなっています.

sheet.getRange(row, col)は,シートの左上:A1を(1, 1)とした位置で指定します.


タスクIDは,スプレッドシート上でカウントしているタスク数に1を加えたものを設定するようにしています.



2.2.3 スクリプトのデバグ実行

きちんと動作するか確認するために,デバグ実行してみます.

デバグボタンを押してスプレッドシートを確認してみてください.


f:id:maruuusa83:20160609123251p:plain

デバグ実行


f:id:maruuusa83:20160609123435p:plain

テストタスクが自動的にコピーされた!


もし正しく動作しなければ,エラーメッセージなど見ながらデバグしてみてください.




2.3 トリガの設定

先ほどのスクリプトをフォームが入力された時点で動作するように設定します.



2.3.1 トリガの設定 ツールバーからトリガ設定を開いて,[copyFromForm」に対して「スプレッドシートから」「フォーム送信時」を設定してください.


f:id:maruuusa83:20160609124328p:plain

トリガ設定を開く


f:id:maruuusa83:20160609111658p:plain

トリガの設定


トリガを設定すると許可を求める画面が表示されるので,許可してください.



2.3.1 トリガのテスト

これでタスクの自動登録ができるようになったハズなので,フォームに入力してタスク一覧のシートを見ながら送信してみます.


f:id:maruuusa83:20160609143329p:plain

フォームを記入して送信すると


f:id:maruuusa83:20160609143355p:plain

自動的にコピーされた!







3. 最終更新日時の自動更新(おまけ)


せっかくスクリプトを作っているのでおまけスクリプトを追加します.

最終更新日時を自分の手でアップデートするのはなんだかあほらしいので自動更新するように設定します.


function insertLastUpdated() {
   var spreadsheet = SpreadsheetApp.getActiveSheet();
   var currentrow = spreadsheet.getActiveCell().getRow();
  
   if (spreadsheet.getSheetName() == "タスク一覧" && currentrow >= 6){
       spreadsheet.getRange(currentrow, 10).setValue(new Date());
   }
}

最終更新日時を更新するスクリプト


トリガを更新時にしたとき,getActiveSheetやgetActiveCellを用いて更新されたセルを特定することができます.

更新されたタスクの最終更新のセル(J行)に現在の日にちを自動的に書き込みます.

(自動更新されたセルをクリックするとわかりますが,更新時間まで記録されています.)

シートやタスクを書き込む範囲をきちんと設定しておかないとややこしいことになるので条件分岐しています.







これでタスク追加アプリを作成することができました!!!!やったね!!!

これでタスク一覧の操作のしやすさと登録のしやすさが両立できるようになりました.




では

今回はこの辺で! ノ


まるさ

Google Spreadsheetでチケット駆動生活をするはなし(スプレッドシート編)

どうも,まるさ@maruuusa83です.




最近なんだかタスクが多くて生活が木っ端みじんになりそうです.

ひとまず大きな案件が片付いたので,Google Spreadsheetを使ってタスクを整理するためのツールを作りました.

今回はそのおはなしです.


この記事ではスプレッドシート上での設定について,

次回記事ではスクリプトを使ってタスク登録アプリの作成を行います.







チケット駆動生活(?)


ぼくはタスクをそのまま放っておくと忘れて締め切りを逃してしまうタイプの人間です.

しかたがないですから,ふせんにタスクを書いてペタペタディスプレイの周りに張り付けることでタスクを管理する,「リアルチケット駆動生活」を実施していました.

常に見えるところにタスク一覧があれば嫌でも仕事するわけです.



まぁでもタスクが増えてくると管理しきれない!

RedmineとかサイボウズLiveとかチケット管理システムとか使うにしても一人だと面倒でだんだん遠のいていく.

スプレッドシートで管理しようと思っても入力が面倒で嫌になってくる.

どうしたものか・・・







便利で便利なスプレッドシートを作りたい


最近あれこれスプレッドシートで作るのにハマっています

というわけで,スプレッドシートでチケット管理するための仕組みを作ることにしました.



まず必要な項目を整理します.

  • タスク名
  • 締め切り
  • タスクの進行状況

それと,あったらいいなあという項目.

  • 詳細
  • メモ
  • タグ
  • 親タスクナンバー(サブタスクであることを表す)
  • 継続タスクナンバー(あるタスクの続きであることを表す)



必要な機能をまとめます.

  • 状態・締切に応じた色分け
  • タグによる整理と検索
  • タスク番号の自動割り当て
  • タスク登録アプリの作成



目玉はタスク登録アプリですね.

スプレッドシートいちいちポチポチしなくてよくなります.







スプレッドシートを作っていく


とりあえずスプレッドシートを書いていきましょう.


f:id:maruuusa83:20160604151614p:plain

とりあえず項目を入力していく




1.データ検証の設定

項目ごとに「日付」だとか「ドロップダウンリスト」だとかの設定をしていきます.




1.1 日付入力の設定

まずは簡単な日付の設定をやっていきます.


f:id:maruuusa83:20160604160346p:plain

範囲を指定して右クリックで「データの検証」を開く


f:id:maruuusa83:20160604153007p:plain

条件を「日付」「有効な日付」に設定


これで入力を日付に制限して,かつ簡単に日付が入力できるようになります.

「最終更新日時」の項目も同様に日付を入力することになりますから,同様に設定しておいてください.


f:id:maruuusa83:20160604153352p:plain

セルをダブルクリックすればカレンダーが現れるようになった!




1.2 ドロップダウンリストの設定

「状態」の項目について,

  • 未着手
  • 作業中
  • チェック待ち
  • 完了
  • 破棄

という項目からドロップダウンリストで選択できるようにしていきます.

日付の設定と同様の手順で範囲を指定して「データの検証」を開きます.

今度は条件を「リストを直接指定」に設定してカンマ区切りで項目を入力します.


f:id:maruuusa83:20160604152753p:plain

条件を設定していく


状態の項目のセルの右側に▼が現れるようになります.

これをクリックすればドロップダウンリストが現れます.


f:id:maruuusa83:20160604154754p:plain

ドロップダウンリストが現れるようになった!




2.シートの整形と自動色付け

シートの整形と色付けの設定を行っていきます.




2.1 シートの整形

適当な値を入力して様子を見つつセルの大きさを決めたり項目の行に色を付けてみたりししてください.


f:id:maruuusa83:20160604160118p:plain

こんな感じに設定してみました




2.2 表示領域の固定

タスクが増えてくるとスクロールしたとき項目名が見えなくなったりすると嫌なので,常に表示されるように固定しておきます.

項目名の行を選択して,「表示」>「固定」>「現在の行まで」で行の固定を設定できます.


f:id:maruuusa83:20160604160801p:plain

固定行の設定


f:id:maruuusa83:20160604160809p:plain

項目名の固定に加えてタスク名なども固定した


これで上下左右のスクロールでも必要な項目は常に見えるようになりました.




2.3 自動色付けの設定

まずは締め切りを超えてしまったとき色が付くようにします.

「条件付き書式」を開いて「次より前の日付」「本日」を設定します.

今回はセルの背景が赤くなるように設定しました.


f:id:maruuusa83:20160604161729p:plain

「条件付き書式」を開く


f:id:maruuusa83:20160604161958p:plain

条件付き書式のルール設定


f:id:maruuusa83:20160604162442p:plain

締め切りを超えたら目立つようになった!




つぎに,完了したタスクの行は全体が灰色になるように設定します.


f:id:maruuusa83:20160604163925p:plain

こういう感じにしたいなあ


次の写真のように,実行したい範囲全体を選択して,先ほどと同様の手順で「条件付き書式のルール」で「カスタム数式」の設定を行います.


f:id:maruuusa83:20160604164255p:plain

設定を行う範囲


f:id:maruuusa83:20160604164611p:plain

行ごと色を付ける設定


f:id:maruuusa83:20160604165041p:plain

「完了」を設定すると自動でブラックアウトするようになった!


ところで,締切を迎えてしまっている場合にブラックアウトの上から色が変わってしまっています.

これは条件付き書式のルールの適用順を変更することで解決できます.


f:id:maruuusa83:20160604165249p:plain

適用すべき範囲


f:id:maruuusa83:20160604165451p:plain

赤丸の部分をつかむと順番を入れ替えできる.書式は下から順に適用される




3.フィルタの設定

最後のスプレッドシート上での作業として検索と並べ替えができるように設定していきます.

項目名も含めて範囲選択し(ぼくはその他の設定もA5:J1000くらいにしています),ツールバー内のフィルタボタンを押します.


f:id:maruuusa83:20160606070351p:plain

選択範囲とフィルタ


この設定で項目名にプルダウンメニューのアイコンが表示され,各列ごとに並べ替え,フィルタリングの設定などができるようになります.


f:id:maruuusa83:20160606070728p:plain

並べ替えや条件フィルタ,値フィルタが使えるようになる


「状態」の項目について,完了したタスクや破棄したタスクは見えなくなるようにしておくといい感じです.

値フィルタはすでに存在する値からしかフィルタの設定ができません.とりあえず一通りすべての状態をスプレッドシートに入力してから「完了」と「破棄」のチェックを外し,OKを押します.


f:id:maruuusa83:20160606071100p:plain

「状態」の項目のフィルタ設定


特定のタグを含む行のみを表示するような場合は,「タグ」の項目の値フィルタを使います.

はじめに「値でフィルタ」の直下にある「クリア」で全てのチェックボックスを外しておき,そのあと検索ボックスで必要なタグを含むセルを検索しておきます.

そののちに「すべて選択」をクリックしてOKを押せば,検索したいタグを含む行のみが表示されるようになります.


f:id:maruuusa83:20160606071754p:plain

タグの検索




4.統計情報の表示

この後タスクの自動登録に「登録したタスクの数」が必要になるので,ほしい統計情報を設定しておきます.

今回は未着手のタスクの個数とこれまでに登録したタスクの数の二つを設定しました.

それぞれ,セルに次のような数式を入力しています.


=COUNTIF(B6:B997, "未着手") //未着手タスクの個数
=COUNT(A6:A996) //全タスク数


f:id:maruuusa83:20160606073650p:plain

統計情報








スプレッドシートを使った設定はここまでになります.

次回の記事ではスクリプトとアンケートフォームを用いてタスク登録アプリを作成します.



では,

今回はこのへんで ノ

まるさ

2015年振り返りと2016年の抱負

明けましておめでとうございます、まるさ@maruuusa83です。

去年を振り返ったり、今年の目標を書いたりします。







2015年の感想

この年を漢字一文字で表すなら、「耐」です。

これからのためにぐっと堪える一年でした。

この一年、必死になって乗りきった感じがします。







卒業研究

高専時代の卒業研究はカツカツになりながらも楽しかったです。

f:id:maruuusa83:20160102195044j:plain

ヘラヘラしてたので「ちゃんと研究やりなよ」なんてどこかから怒られたこともありましたが、ちゃんとやってたつもりですw

わりと全力投球できたと思っています。

でも卒研の結果は「失敗だった」としていいかなあと思っています。

目標にたどり着くことができなかった。

やっぱり開発力の不足が一番の要因です。

思想設計から実験まで全てがヘタクソだった。



この研究で最優秀卒研の賞なんていただいてしまいましたが、すっかりもらえないものだと思っていたので発表前からヘコんでいました。

まあなんだかんだ構想1年半と実装半年くらいはかけたので、賞を貰えたのは素直に嬉しかったです。

もっとやりたかったなあ、と、自分の限界を感じつつ、これからはもっとコード書いていこうと決意した卒業研究でした。

テーマも内容もとても気に入っているのでじっくり使っていきたいです。







大学への三年次編入

大学にはいって、ずいぶんと自由を奪われました。

うちの大学の編入生は一般に実験科目がないそうなのですが、ぼくの学科だけは実験科目があります。

毎週オムニバスで、授業時間で終われない実験も数多く、レポートの分量も凄い。でも内容は高専時代の焼きなましをする感じ。もちろん面白い実験もありましたが、ひたすら辛いばかりの毎日でした。

新しい風を吹き込もうと前期はサークルにトライしてみましたが、「編入生は実験がなくてヒマ」という内部生の常識がぼくの生活にトドメをさし、生活の何もかもが滅茶苦茶になりました。

お陰で成績は目も当てられない。



後期にはいってからは前期の反省を活かし省エネ生活。

せっかく環境が変わったのでハード屋に転向しようとハードウェアアクセラレーションにかかわる演習テーマを取るも、結局ここでも様々な(とても様々な)壁に阻まれツラい思いをします。

f:id:maruuusa83:20160102200620j:plain

まあ、いいです。ちょうどいい負荷かなあと思いますw







私生活

四月に沖縄から東京に引っ越しをしました。

編入を期に奨学金も大幅に増やし、後期にはバイトも始めさせていただいて、だいぶ経済的にも自立しました。

家計が実家と完全に別になり、自分に入ってきたお金で全部やりくりするという新しい経済スタイルになったわけです。

両親にもそれほど迷惑をかけずにすむので、趣味に使ってみたり、外食してみたり、いつもと違う食材を買ったり、貯金する努力をしてみたり、そういうこともできるようになりました。



とはいえ

部屋が四畳半と多少せまくなったので趣味の多くがうまくいかなくなりました

楽器もやりにくくなりましたし(音は平気)、パンも焼きにくくなりましたし、コーヒーも淹れにくいし、料理もやりにくいので質も回数も低くなりました。

恋人が遊んでくれるのを楽しみに生活していましたが、年を越す直前に別れることになってしまいました。



省スペースでどうにかなる趣味として、アニメと海外ドラマと映画を見る時間が増えました。

テレビを買ってないので、テレビがわりですw

去年の実績として、わかるだけでアニメ1375話、映画36本、海外ドラマ49話みました

n巡したアニメや映画シリーズもあるので、見た回数で言うともっとたくさんあります。

見すぎです。見すぎw

f:id:maruuusa83:20151225012302j:plain

明るいうちに遊びに出かける機会もずいぶん減ったのでどんどん色白になってる気がしますw

ほんと趣味減ったよなあ



なんだか私生活からはずいぶんとまるさらしさが失われてしまった気がします。

もうただのアニメオタクです。アニメオタクマルサになりました。

こんにちは、アニメオタクマルサです!







生活の一部が英語になった

先ほどチラと述べた「演習」では、留学生のタコ部屋(笑)に一緒に詰められて作業していました。

7~8名いる部屋で日本語話者はぼくだけ。 英語漬けの生活になりました。

一日の発言の半分以上は英語という生活が3カ月くらい続きました。英語しか話さない日もたくさんありました。

これはいいきっかけだろうということで、家・研究室以外でのスキマ時間はボキャブラリーを増やすようになりました。

英語だけで観光したり日本料理を教えたりもしました。



さっぱり英語力が上がったような気はしませんが、なんとなく、英語に触れることが好きになりました。

異文化に触れつつ、日本の良さだとかを知ってもらえて楽しく充実した生活だったと思います。

まあこれは、何にも打ち込んでいない、学校生活だけに必死になっている生活へのせめてもの抵抗だったような気もします。



ですが、数少ない友達としてよく遊んでくれたベトナム人の二人を含め、年を越す直前に、彼らはみな留学期間を終え国へ帰っていきました。

これから寂しくなります。







長くて、そして短い一年だった

ほんと、今年は貧乏クジたくさん引いた気がします。

つらすぎて血便と高熱に苦しむような出来事もありました。



穏やかでいたい年末でさえ、たくさんの別れがありました。こうして長いような短いような一年は終わりました。

それでも、なんとなく、またぼくへと風が向いてきているような気がしています。

この流れを掴んで、いまの歩みを一歩一歩大切に踏みしめて、ゆっくりまるさらしさを取り戻したいです。







今年の目標

今年は申年らしいです。(さる・・・なんだかつらい響きだなあw)

そして、これからアカデミアの道が始まります。

自分で決めたキャリアプランを確実に達成できるように、ひとつひとつの行動を大切に一年を過ごしたいです。

大学で研究やってる人間らしくなれればいいなあ。



というわけで、次のことを達成します:

  • とにかく進級する(笑)
  • 大学院に進学する
  • 演習のテーマを「成功」といえるように達成
  • TOEIC 800up (TOEFLになるかもしれない)
  • 献血に4回くらいは行ける程度には健康的に、心も時間も余裕を持って生活

公開できなさそうな話や目標もたくさんありますが、きちんとメモして全部達成必須にして手堅い一年にしようと思います。







さいごに

荒れた一年でしたが今年はもっと楽しくやっていきます!!!!!

みなさん、どうぞ今年もよろしくお願い致します。

あ、まるさの隣あいてますよ!w(



それではこのへんで ノ

まるさ