20200914のMacに関する記事は6件です。

Instagramにアップロードされた写真を埋め込みHTML形式で取得してみた

はじめに

Instagramにアップロードされた写真を埋め込みHTML形式で取得してみました。

APIを使うために、Facebook developer にアプリを登録したり、Facebookページを作成したり、Instagramのアカウントをビジネスアカウントに切り替えたりと色々事前準備が必要でした。

トークンの取得方法は下記サイトがすごく丁寧に解説してくれていて、参考にさせていただきました。
https://navymobile.co.jp/instagram-graph-api

今回は、Graph API用のアプリ(開発モード)とoEmbed用のアプリ(ライブモード)2つ作りました。
Facebookにレビューが通ればアプリは一つで実現できると思います。

環境は下記になります。
macOS Catalina 10.15.6
Node.js v14.8.0
(Node.js Library)request 6.14.7

コード

下記、コードになります。
(1) Graph API でアカウントに紐付く投稿のURLを取得
(2) oEmbedでURLを埋め込みHTMLに変換
の流れになります。

APIの仕様は下記を参照しました。

・Graph API
https://developers.facebook.com/docs/instagram-basic-display-api/reference/user

・oEmbed
https://developers.facebook.com/docs/instagram/oembed

batch_instagram.js
const request = require('request');

const URL_INSTAGRAM_API='https://graph.facebook.com/v8.0/';
const INSTAGRAM_USERID=process.env.INSTAGRAM_USERID;
const INSTAGRAM_APP_TOKEN=process.env.INSTAGRAM_APP_TOKEN;
const INSTAGRAM_APP_OEMBED_TOKEN=process.env.INSTAGRAM_APP_OEMBED_TOKEN;
const URL_INSTAGRAM_POSTS=URL_INSTAGRAM_API + INSTAGRAM_USERID + '?fields=name,media.limit(99){caption,like_count,media_url,permalink,timestamp,username,comments_count}&access_token=' + INSTAGRAM_APP_TOKEN;
const URL_INSTAGRAM_OEMBED=URL_INSTAGRAM_API + 'instagram_oembed?fields=html,thumbnail_width,type,width&access_token=' + INSTAGRAM_APP_OEMBED_TOKEN + '&url=';

var get_instagram_options_base = {
    url: '',
    method: 'GET',
    json: true
};

var html_data = [];

var get_instagram_options_1 = get_instagram_options_base;
get_instagram_options_1.url = URL_INSTAGRAM_POSTS;
request(get_instagram_options_1, function (error, response, posts) {
    var url_list = [];
    posts.media.data.forEach(data => {
        url_list.push(data.permalink);
    });
    // console.log(url_list);
    urlToHtml_OEmbed(
        url_list,
        function() {
            console.log(html_data);
            return;
        }
    );
});

function urlToHtml_OEmbed(urls, callback) {
    if (urls.length == 0) {
        return callback();
    }
    else
    {
        let url = urls.shift();

        var get_instagram_options_2 = get_instagram_options_base;
        get_instagram_options_2.url = URL_INSTAGRAM_OEMBED + url;
        request(get_instagram_options_2, function (error, response, oembed) {
            html_data.push(oembed.html);
            // console.log(urls.length);
            urlToHtml_OEmbed(
                urls,
                callback
            );
        });
    }
}

実行結果は下記になります。
XXXXXXXXは各自の環境で置き換えて下さい。

% export INSTAGRAM_USERID=XXXXXXXX
% export INSTAGRAM_APP_TOKEN=XXXXXXXX
% export INSTAGRAM_APP_OEMBED_TOKEN=XXXXXXXX
% node batch_instagram.js
[
  '<blockquote class="instagram-media" data-instgrm-captioned data-instgrm-permalink="https://www.instagram.com/p/CEhFobmnEnM/?utm_source=ig_embed&amp;utm_campaign=loading" data-instgrm-version="12" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:16px;"> <a href="https://www.instagram.com/p/CEhFobmnEnM/?utm_source=ig_embed&amp;utm_campaign=loading" style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;" target="_blank"> <div style=" display: flex; flex-direction: row; align-items: center;"> <div style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;"></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;"></div></div></div><div style="padding: 19% 0;"></div> <div style="display:block; height:50px; margin:0 auto 12px; width:50px;"><svg width="50px" height="50px" viewBox="0 0 60 60" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-511.000000, -20.000000)" fill="#000000"><g><path d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 

〜(中略)〜

utm_source=ig_embed&amp;utm_campaign=loading" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;" target="_blank"> ma sa</a> (@mamemame_s) on <time style=" font-family:Arial,sans-serif; font-size:14px; line-height:17px;" datetime="2016-08-13T10:54:00+00:00">Aug 13, 2016 at 3:54am PDT</time></p></div></blockquote>\n' +
    '<script async src="//platform.instagram.com/en_US/embeds.js"></script>'
]

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【macOS】Virtual BoxにCent OSのインストール後、起動させるとクラッシュする問題

仮想環境の構築に死ぬ程ハマったので、備忘録として書きます。

・環境
macOS catalina Ver10.15.6

Virtual Box 6.1.14

CentOS-8.2.2004-x86_64-dvd1.isoをインストールしようとした。

・状況
OSインストール後の再起動で、Virtual Box VMがクラッシュ。
その後起動しようとしても同様にクラッシュ。

結論:Virtual Boxを6.0.14にダウングレードしたら起動できた

もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう

山浦先生のLinux講座を学ぶために環境構築しようとしたところ、何をやってもクラッシュした。

ダウングレードしてようやく成功したので、

・設定→ディスプレイ→グラフィックコントローラをVboxVGAに
・設定→ストレージ→光学ドライブアイコンクリック→仮想ドライブからディスクを消去
スクリーンショット 2020-09-14 19.21.46.png

でやっと起動。

・試した事
仮想メモリ1024B→2048B ×
ブートメディアの順番変更 ×
仮想マシンにCentOSをインストールする ×
実機のメモリクリア ×
VirtualBoxへCentOS7をインストール ×

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【解決済】heroku loginでハマった時の対処法

環境

Mac Catalina 10.15.6
zsh 5.7.1 (x86_64-apple-darwin19.0)
heroku/7.42.13 darwin-x64 node-v12.16.2

現象

ターミナルで
heroku login

"heroku" Error: tunneling socket could not be established, cause=getaddrinfo ENOTFOUND proxy.server.com

と出る。これで30分くらい溶かしました...

解決方法

ターミナルで
export HTTP_PROXY=""
export HTTPS_PROXY=""
を実行するだけ。

解決に至った経緯

heroku --version
とすると
› Warning: HTTPS_PROXY set to https://proxy.server.com:8000
› Warning: HTTP_PROXY set to http://proxy.server.com:8000
heroku/7.42.13 darwin-x64 node-v12.16.2

と出たので、HTTPS_PROXY, HTTP_PROXYのsetをなくせばいいのではないかと気づいた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

finderで隠しファイルを表示するショートカットキー

よく忘れるのでメモ

finderで隠しファイルを表示したいフォルダを開いて command + shift + . を押す。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacでFlutterの開発環境を構築する手順

Flutterとは

Flutterとは、Googleによって開発されたモバイルアプリケーションSDK (Software Development Kit)です。
クロスプラットフォームに対応していて、1つのコードで複数のプラットフォーム(iOS,Androidなど)に対応したアプリケーションを開発することができます。

開発環境構築手順

MacでFlutterの開発を始める為に開発環境を構築していきましょう。
※所要時間約1時間(ダウンロードやインストールをするので時間かかります。)

1.Flutterをダウンロードする

下記の公式サイトからFlutterをダウンロードします。
https://flutter.dev/docs/get-started/install/macos
flutter_macos_1.20.3-stable.zip をクリックしてダウンロードします。
※1.20.3の部分はアップデートされると変わります。

2.ファイルを解凍して、PATHを通す

作業ディレクトリを作成して、ダウンロードしたzipを解凍
※作業ディレクトリ名や作成場所は好きなところに作ってください。

mkdir ~/development
cd ~/development

unzip ~/Downloads/flutter_macos_1.20.3-stable.zip

次にPATHを通します。
[PATH_TO_FLUTTER]
ここには解凍したFlutterのディレクトリを書いてください。
bashの場合

echo 'export PATH="$PATH:[PATH_TO_FLUTTER]/flutter/bin"' >> ~/.bash_profile
source ~/.bash_profile

zshの場合

echo 'export PATH="$PATH:[PATH_TO_FLUTTER]/flutter/bin"' >> ~/.zshrc
source ~/.zshrc

flutterコマンドが使えるようになっていれば成功です。

3.実行環境に必要なものを確認する

Flutterは

flutter doctor

コマンドを実行することで

  • 問題ないところには✔︎マーク
  • 不足しているものには✖︎印
  • 問題があるところには!マーク

が表示されて実行環境に何が足りないのか教えてくれますので、次は足りないものをインストールしていきましょう。

4.Android Studioをインストールする

下記の公式サイトからAndroid Studioをダウンロードします。
https://developer.android.com/studio/index.html
DOWNLOAD ANDROID STUDIO をクリックし、利用規約に同意してダウンロードします。

ダウンロードが終わったらAndroid Studioを起動し、表示にしたがってインストールをします。
※いろいろと聞かれますが、基本的には全部Next,FinishをクリックすればOKです。

Welcome to Android Studioの画面が出れば成功です。

5.Android Studioにプラグインを導入する

Android StudioにFlutterDartのプラグインをインストールします。
起動画面から
1. Configure->Pluginsを選択
2. 検索ボックスにFlutterと入力
3. 出てきたFlutterという名称のプラグインをインストール
※DartプラグインはFlutterプラグインのインストールと同時にインストールされます。

6.デバイスのエミュレータを導入する

Android Studioでデバイスのエミュレータを導入していきます。

起動画面から
1. Start a new Flutter projectを選択
2. Flutter Applicationを選択してNextをクリック
3. Project nameは任意の名前で入力しNextをクリック
4. Company domainは任意の名前で入力しFinishをクリック
5. エディタが表示されたら、メニューバーのTools->AVD Managerを選択
6. Create Virtual Deviceをクリック
7. Category->Phoneを選択されていることを確認し、任意のDeviceを選択してNextをクリック(自分はPixel 3aを選択しました)
8. 任意のOSをDownloadをクリックしてダウンロード(自分はAndroid10.0を選択しました)
9. ダウンロードした項目を選択し、Nextをクリック
10. 設定画面が出てきますが、何もせずにFinishをクリック

これでデバイスのエミュレータを導入することができました。

7.Androidのライセンスを許可する

Androidのライセンスを許可しないとflutter doctorを実行した際に!マークが出るので許可していきます。

flutter doctor --android-licenses

上記コマンドを実行するとライセンスに許可するかどうかを聞かれるので yを入力し、Enterを押して許可をしていきましょう。

flutter doctorを実行し、Android toolchainの部分に✔マークがついていれば成功です。

8.Xcodeをインストールする

XcodeはAppStoreからダウンロードできますのでダウンロードしましょう。
最新のMacOSを利用していない場合はダウンロードできない可能性がありますので以下を参考にダウンロードしてください。
Xcode - インストール可能 対応バージョン macOS 一覧 / Install Support macOS Version Lists

インストールをすすめて
Welcome to Xcodeの画面が出れば成功です。

9.CocoaPodsをインストールする

CocoaPodsというプラグインも必要なのでインストールします。

sudo gem install cocoapods

パスワードを聞かれますので自分のMacのパスワードを入力しましょう。

10.最後にflutter doctorで確認する

[✓] Flutter (Channel stable, 1.20.3, on Mac OS X 10.14.6 18G6020, locale ja-JP)

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.3.1)
[✓] Android Studio (version 4.0)

上記にような表示になっていれば環境構築完了です。

以上、これでFlutterでアプリを開発を始めることができます!

番外編 VSCodeで開発する場合

VSCodeで開発したい場合は、更に設定が必要なのでやっていきましょう。
※VSCodeのインストールは省略します。

1.VSCodeにFlutterの拡張機能をインストールする

  1. Shift+Command+Xで拡張機能を表示
  2. 検索ボックスにFlutterと入力
  3. 出てきたFlutterの拡張機能をインストール

2.VSCodeでFlutter新規プロジェクトを作成

  1. Shift+Command+Pでコマンドパレットを表示
  2. 検索ボックスにFlutterと入力
  3. Flutter:New Projectをクリック
  4. 任意のプロジェクト名を入力
  5. プロジェクトを作成するディレクトリを聞かれるので任意の作業ディレクトリを指定する

3.VSCodeでデバイスのエミュレータを起動する

  1. プロジェクトを作成するとVSCodeの右下あたりにNo Deviceと表示されるのでクリック
  2. Start iOS SimulatorまたはStart Pixel3a API 29をクリック ※Androidのエミュレータは設定したデバイスによって違います。

4.最後にflutter doctorで確認する

[✓] Flutter (Channel stable, 1.20.3, on Mac OS X 10.14.6 18G6020, locale ja-JP)

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.3.1)
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.49.0)
[✓] Connected device (1 available)

• No issues found!

上記にような表示になっていればVSCodeの設定完了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Golang基礎 + MacにGoをインストール

はじめに

Golang又はGo言語 とは

・コンパイル言語の中でも特に処理が高速
・2009年にGoogle開発された
・シンプルな構文
・コードの可読性が高い
・初心者はpythonやphpやRubyからのが良い

勉強中なので間違っていたら教えてください。

開発環境

Visual Studio Code
Mac

Goのインストール

ターミナルで実行してください
1. homebrewを最新にします

$ brew update

2. Goのインストール

$ brew install go

3. Goがインストールされたか確認バージョンが返ってくればOK

$ go version

プログラムの基本構造

順次進行

上から順に処理していく

条件分岐

特定の条件の時にAかBなどに分岐する

繰り返し

決まった回数や条件に当てはまる間は繰り返す

Goの記述方法

例)test.go
package main Goのプログラムは1つはmainに属している必要がある
import ("fmt") ←fmtパッケージをインストールしてる

func main(){  ←関数を記述 mainからスタートする
   fmt.Println("hello") これはfmtパッケージを用いてhelloを表示する
} 波かっこ内はブロックという

Goのプログラムはなんらかのパッケージに属している必要があります

実行するにはターミナルに

$ go run ファイル名.go
上記の例だと
$ go run test.go と記述

これでhelloが表示されます。

変数の宣言仕方

例)test.go
package main 

func main(){  
  var num int (var 変数名 
   num = 1 ←1を代入
   fmt.Println(num) 
}

実行すると1が表示される

宣言の省略すると

例)test.go
package main 

func main(){  
  num := 1 ←宣言の省略書き方
    var num int (var 変数名 
      num = 1 この2行と一緒 
   fmt.Println(num) 
}

実行すると1が表示される

Goのデータ型

int 整数
float64 小数
string 文字列
bool turnかfalseが入る

配列の宣言

変数 := [要素数]データ型{データ1、データ2、...}

例)test.go
package main 

func main(){  
  a := [3]string{"sasa","sumika","takako"} ←配列の宣言
   fmt.Println(a[0])
   fmt.Println(a[1]) 
   fmt.Println(a[2])
}

実行すると
こうなります

sasa
sumika
takako

配列の要素数の省略、変更

例)test.go
package main 

func main(){  
  a := [...]string{"sasa","sumika","takako"} ←配列の宣言[...]で要素数を省略できる
  a[0] = "aki"
   fmt.Println(a[0])
   fmt.Println(a[1]) 
   fmt.Println(a[2])
}

実行するとsasaがakiに変更されています

aki
sumika
takako

条件分岐

例)test.go
package main 

func main(){  

 if a := 0 ; a >= 20{
     fmt.Println("20以上")
 } else if a == 0{
     fmt.Println("0です") 
 } else {
     fmt.Println("条件以外")
}

実行すると以下が表示されます。

0です

繰り返しfor

for 変数 := 初期値; 条件; 増減式{}

例)test.go
package main 

func main(){  

for i := 0; i<=4; i++ {
   fmt.Println(i)
}

実行すると以下が表示されます。

0
1
2
3
4

関数定義

func 関数名(引数の定義なくても良い){
retuen ←戻り値がいるなら
}

例)test.go
package main 

func say(){ 引数なし
  fmt.Println("hello")
}

func say1(say string){ ←引数あり (変数 データ型)
 fmt.Println(say)
}

func say2(x,y int) int { ←引数戻り値1つあり (変数 データ型) 戻り値のデータ型{
 return (x+y)
}

func say3(x,y int) (int, int) { ←引数戻り値2つあり (変数 データ型) 戻り値のデータ型{
 return (x+y), (x-y)
}

func main(){
 say() 引数なし
 say1("hi") 引数あり
 result := say2(5,3) 引数戻り値1つあり
 fmt.Println(result)
 result2, result3 := say3(5,2) 引数戻り値2つあり
 fmt.Println(result2, result3)
}

実行すると以下が表示されます。

hello
hi
8
7 3

構造体を定義

type 構造体名 struct {
フィールド
}

例)test.go
package main 

type Dog struct { 構造体
 name string
 age int
}

func main(){ 
 var s Dog 構造体の初期化 (var 変数名 構造体名 
 s.name = "poko"
  s.age = 5

省略バージョン上記と同じ意味
s := Dog{"poko",5}

一部部分に代入
s := Dog{name: "poko}
又は
s := Dog{age: 5}

 fmt.Println(s)
}

実行すると以下が表示されます。

{ poko 5 }

メソッド

例)test.go
package main 

type Dog struct { 構造体
 name string
 age int
}

func (s Dog) aa() { メソッドと構造体を関連付け (変数 構造体名) 変数() {
   fmt.Println(s.name,s.age)
} こうする事で構造体にアクセスできるようになる
s.nameは構造体Dogのnameにアクセスして情報を取得できる

func (s Dog) aa2(name string, age int) { 引数あり
   fmt.Println(name,age)
}

func (s Dog) aa3(age int)  int { 引数あり戻り値あり
   return age*2

func main(){ 
 a1 := Dog{"poko",5}
 a1.aa() 引数なし
 a1.aa2("domu",6) 引数あり
 result := a1.aa3(2) 引数あり戻り値あり
 fmt.Println(result)
}

実行すると以下が表示されます。

poko 5
domu 6
4
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む