近況+DroidKaigiの名札生成スクリプトを書いた話や裏話
自分と近況
ミクシィ卒業後、最近までは女性ターゲットのアプリを担当し、ディレクシ
複数のプロダクトを持ち、合計100万人以上のユーザへ届く機能
まだ仕事面では技術ネタが無いので、DroidKai
DroidKaigi
DroidKaigiはAndroidエンジニア向けの技術カン
私は2015年11月頃、ミクシィ時代の同僚に誘われスタッフにjoinしました。
仕事でも個人でも出来ないことをやって楽しんでいます!
前回、2017の話
今年3月に行われたDroidKaigi 2017では事務局長という役割に任命いただき、
役割に限らず、名札*2やconnpassページやスタッフ用マニ
名札は手作業での作成は大変なので、テンプレを用意し中身は自動化しました。
実行スクリプトを選択後、名簿csvを選ぶと画像が流し込まれます。
記事の最後にコードも載せておきます*3。誰かの参考になれば幸いです。
裏話
2018の話
DroidKaigiは現在2018のチケットを販売中です!今後
これは1回しか言いませんが優れたAndroid技術者を探してる人事のみなさんはDroidKaigi公式レポジトリをwatchしてください。必ずContributersという画面ができるので上から順に焼肉に招待するのです。
— 父 (@fushiroyama) 2017年11月20日
間違ってもメールだけを送ってはなりません、焼肉とセットです🍖
最後にillustrator script
(function() { IMAGE_WIDTH = 77; // 画像が埋め込まれる正方形の1辺の長さ(pixel) CURRENT_DIR = String(app.documents[0].fullName).replace(app.documents[0].n ame, ""); IMAGE_INDEX = 2; //CSVの何列目に画像ファイルの項目があるか var CSVConverter = function() { this.lines = []; // this.groups = []; // イラレ上のグループが入っていく this.column_name_list = null; // CSVの1行目の項目リスト this.variables = app.activeDocument.variables; // The active (frontmost) document in Illustrator // イラレアートボード上のグループをloopし、グループリストに 格納する for (var i = 0; i < this.variables.length; i++) { this.groups.push(this.variable s[i].pageItems[0]); } }; CSVConverter.prototype = { read_csv: function() { var csv_path = File.openDialog("CSVファイルを選択してく ださい。"); if (! csv_path) { return; } var csv_file = new File(csv_path); if (! csv_file.open("r", "", "")) { return; } var lines = csv_file.read().split("\n"); // CSVを読み込み、カラム名リストと値リストへ格納する for (var i = 0, n = lines.length; i < n; i++) { var line = lines[i]; if (! line) { continue; } if (i == 0) { this.column_name_list = line.split(","); } else { this.lines.push(line.split("," )); } } csv_file.close(); }, write: function() { var group_num = 0; // いくつ目のグループか。描画成功すると次のグループへ。 for (var i = 0; i < this.lines.length; i++) { var img_file = this._get_filename(this.lines[ i][IMAGE_INDEX]); if( img_file == null) { continue; } // 画像がない場合は次の人へ // 画像がある場合のみテキストの描画 var textFrame = this.groups[group_num].textFra mes[0]; // テキスト表示領域(今回は1つ) var text = String(textFrame.contents); // csvのカラム名と、アートボード上のテキストを一致させればl oop有効 for (var key in this.column_name_list) { if (text.indexOf(this.column_name _list[key]) != -1) { textFrame.contents = this.lines[i][key]; } } // 画像描画 var rect = this.groups[group_num].pathIte ms[0]; // 画像描画領域(今回は1つ) var pItem = activeDocument.placedItems.add (); pItem.file = img_file; // resizeの引数は%を整数で指定する var resize_percentage = IMAGE_WIDTH / pItem.width * 100; pItem.resize(resize_percentage , resize_percentage); // 描画領域に位置を合わせる this._createPosition(pItem, rect); // マスクして描画してマスクを解除する var mask = activeDocument.pathItems.recta ngle(rect.top, rect.left, rect.width, rect.height); mask.stroke = true; mask.filled = true; var holder = app.activeDocument.groupItems. add(); pItem.move(holder, ElementPlacement.PLACEATEND); mask.move(holder, ElementPlacement.PLACEATBEGINN ING); holder.clipped = true; rect.remove();
group_num++; } }, _get_filename: function(github_id) { var name_jpg = decodeURI(github_id) + ".jpg" // githubのID + 拡張子 var name_png = decodeURI(github_id) + ".png" // githubのID + 拡張子 var file = new File(CURRENT_DIR + "/img/" + name_jpg); // プロフ画像 if ( file.length < 0 ){ file = new File(CURRENT_DIR + "/img/" + name_png); // プロフ画像 } if (file.length < 0 ){ file = null; } return file; }, _createPosition: function(profile_image, draw_area) { profile_image.left = draw_area.left; profile_image.top = draw_area.top; } }; var converter = new CSVConverter(); converter.read_csv(); converter.write(); })();
*1:もちろん上長に共有・相談はしますがかなり自由です。
*2:スピーカー・スタッフ向けのみ。一般参加の方向けには「参加者の名は」を使わせていただきました。 https://yoshiko-pg.github.io/your-name/
*3: 参考元サイトの微妙な実装が残っていますが、もうイラレが無い&今回から名札は別の方法で作るのでメンテはしません… https://bulan.co/swings/illustrator_script/